Index: uspace/app/sysinst/meson.build
===================================================================
--- uspace/app/sysinst/meson.build	(revision 417cc856d6c421adc10b1fb082e24a4d5e93ec6e)
+++ uspace/app/sysinst/meson.build	(revision 5df257077a2eb3d939122d95f8fcecad4b07ff62)
@@ -1,4 +1,4 @@
 #
-# Copyright (c) 2025 Jiri Svoboda
+# Copyright (c) 2026 Jiri Svoboda
 # All rights reserved.
 #
@@ -27,5 +27,5 @@
 #
 
-deps = [ 'block', 'fdisk', 'futil', 'sif', 'system', 'ui' ]
+deps = [ 'block', 'fdisk', 'fmgt', 'sif', 'system', 'ui' ]
 src = files(
 	'rdimg.c',
Index: uspace/app/sysinst/sysinst.c
===================================================================
--- uspace/app/sysinst/sysinst.c	(revision 417cc856d6c421adc10b1fb082e24a4d5e93ec6e)
+++ uspace/app/sysinst/sysinst.c	(revision 5df257077a2eb3d939122d95f8fcecad4b07ff62)
@@ -41,5 +41,5 @@
 #include <errno.h>
 #include <fdisk.h>
-#include <futil.h>
+#include <fmgt.h>
 #include <gfx/render.h>
 #include <io/log.h>
@@ -91,9 +91,9 @@
 #define CD_MOUNT_POINT "/vol/" CD_VOL_LABEL
 
-#define BOOT_FILES_SRC CD_MOUNT_POINT
+#define BOOT_FILES_SRC CD_MOUNT_POINT "/boot"
 #define BOOT_BLOCK_IDX 0 /* MBR */
 
 #define CFG_FILES_SRC "/cfg"
-#define CFG_FILES_DEST MOUNT_POINT "/cfg"
+#define CFG_FILES_DEST MOUNT_POINT
 
 static const char *default_devs[] = {
@@ -163,17 +163,21 @@
 static errno_t sysinst_restart(sysinst_t *);
 static void sysinst_progress_destroy(sysinst_progress_t *);
+static void sysinst_progress(sysinst_t *, const char *);
 static void sysinst_action(sysinst_t *, const char *);
 static void sysinst_error(sysinst_t *, const char *);
 static void sysinst_debug(sysinst_t *, const char *);
 
-static void sysinst_futil_copy_file(void *, const char *, const char *);
-static void sysinst_futil_create_dir(void *, const char *);
+static fmgt_exists_action_t sysinst_fmgt_exists_query(void *, fmgt_exists_t *);
+static void sysinst_fmgt_action(void *, fmgt_action_t, const char *,
+    const char *);
+static void sysinst_fmgt_progress(void *, fmgt_progress_t *);
 static errno_t sysinst_eject_dev(sysinst_t *, service_id_t);
 static errno_t sysinst_eject_phys_by_mp(sysinst_t *, const char *);
 static errno_t sysinst_upgrade_confirm_create(sysinst_t *);
 
-static futil_cb_t sysinst_futil_cb = {
-	.copy_file = sysinst_futil_copy_file,
-	.create_dir = sysinst_futil_create_dir
+static fmgt_cb_t sysinst_fmgt_cb = {
+	.exists_query = sysinst_fmgt_exists_query,
+	.action = sysinst_fmgt_action,
+	.progress = sysinst_fmgt_progress
 };
 
@@ -410,5 +414,49 @@
 }
 
-/** Called when futil is starting to copy a file.
+/** Called when fmgt hits an existing file while copying.
+ *
+ * @param arg Argument (sysinst_t *)
+ * @param exists Information about existing file
+ * @return Existing file recovery action
+ */
+fmgt_exists_action_t sysinst_fmgt_exists_query(void *arg, fmgt_exists_t *exists)
+{
+	sysinst_t *sysinst = (sysinst_t *)arg;
+	(void)sysinst;
+	(void)exists->fname;
+	// XXX Do not overwrite configuration files.
+	return fmgt_exr_overwrite;
+}
+
+/** Called when fmgt is starting to perform action on a file.
+ *
+ * @param arg Argument (sysinst_t *)
+ * @param action Action being performed
+ * @param src Source or only path
+ * @param dest Destination path or @c NULL
+ */
+static void sysinst_fmgt_action(void *arg, fmgt_action_t action,
+    const char *src, const char *dest)
+{
+	sysinst_t *sysinst = (sysinst_t *)arg;
+	char buf[128];
+
+	(void)src;
+
+	switch (action) {
+	case fmgt_ac_create:
+		snprintf(buf, sizeof(buf), "Creating %s.", src);
+		sysinst_action(sysinst, buf);
+		break;
+	case fmgt_ac_copy:
+		snprintf(buf, sizeof(buf), "Copying %s.", dest);
+		sysinst_action(sysinst, buf);
+		break;
+	default:
+		break;
+	}
+}
+
+/** Called by fmgt to update on progress.
  *
  * @param arg Argument (sysinst_t *)
@@ -416,27 +464,13 @@
  * @param dest Destination path
  */
-static void sysinst_futil_copy_file(void *arg, const char *src,
-    const char *dest)
+static void sysinst_fmgt_progress(void *arg, fmgt_progress_t *progress)
 {
 	sysinst_t *sysinst = (sysinst_t *)arg;
 	char buf[128];
 
-	(void)src;
-	snprintf(buf, sizeof(buf), "Copying %s.", dest);
-	sysinst_action(sysinst, buf);
-}
-
-/** Called when futil is about to create a directory.
- *
- * @param arg Argument (sysinst_t *)
- * @param dest Destination path
- */
-static void sysinst_futil_create_dir(void *arg, const char *dest)
-{
-	sysinst_t *sysinst = (sysinst_t *)arg;
-	char buf[128];
-
-	snprintf(buf, sizeof(buf), "Creating %s.", dest);
-	sysinst_action(sysinst, buf);
+	snprintf(buf, sizeof(buf), "Copied %s files, %s; "
+	    "current file: %s done.", progress->total_procf,
+	    progress->total_procb, progress->curf_percent);
+	sysinst_progress(sysinst, buf);
 }
 
@@ -769,4 +803,5 @@
 	char *path = NULL;
 	const char **cp;
+	fmgt_flist_t *flist = NULL;
 	int rv;
 
@@ -794,14 +829,30 @@
 
 	/* Copy initial configuration files */
-	rc = futil_rcopy_contents(sysinst->futil, CFG_FILES_SRC,
-	    CFG_FILES_DEST);
+
+	log_msg(LOG_DEFAULT, LVL_NOTE,
+	    "sysinst_copy_boot_files(): copy initial configuration files");
+
+	rc = fmgt_flist_create(&flist);
+	if (rc != EOK)
+		goto error;
+
+	rc = fmgt_flist_append(flist, CFG_FILES_SRC);
+	if (rc != EOK)
+		goto error;
+
+	rc = fmgt_copy(sysinst->fmgt, flist, CFG_FILES_DEST);
 	if (rc != EOK) {
 		sysinst_error(sysinst, "Error copying initial configuration "
 		    "files.");
-		return rc;
-	}
-
+		goto error;
+	}
+
+	fmgt_flist_destroy(flist);
+	log_msg(LOG_DEFAULT, LVL_NOTE,
+	    "sysinst_copy_boot_files(): copy initial configuration files OK");
 	return EOK;
 error:
+	if (flist != NULL)
+		fmgt_flist_destroy(flist);
 	if (path != NULL)
 		free(path);
@@ -815,17 +866,31 @@
 static errno_t sysinst_copy_boot_files(sysinst_t *sysinst)
 {
+	fmgt_flist_t *flist = NULL;
 	errno_t rc;
 
 	log_msg(LOG_DEFAULT, LVL_NOTE,
 	    "sysinst_copy_boot_files(): copy bootloader files");
-	rc = futil_rcopy_contents(sysinst->futil, BOOT_FILES_SRC, MOUNT_POINT);
+	rc = fmgt_flist_create(&flist);
+	if (rc != EOK)
+		goto error;
+
+	rc = fmgt_flist_append(flist, BOOT_FILES_SRC);
+	if (rc != EOK)
+		goto error;
+
+	rc = fmgt_copy(sysinst->fmgt, flist, MOUNT_POINT);
 	if (rc != EOK) {
 		sysinst_error(sysinst, "Error copying bootloader "
 		    "files.");
-		return rc;
-	}
-
+		goto error;
+	}
+
+	fmgt_flist_destroy(flist);
 	sysinst_debug(sysinst, "sysinst_copy_boot_files(): OK");
 	return EOK;
+error:
+	if (flist != NULL)
+		fmgt_flist_destroy(flist);
+	return rc;
 }
 
@@ -941,4 +1006,53 @@
 }
 
+/** Return file contents as a heap-allocated block of bytes.
+ *
+ * @param srcp File path
+ * @param rdata Place to store pointer to data
+ * @param rsize Place to store size of data
+ *
+ * @return EOK on success, ENOENT if failed to open file, EIO on other
+ *         I/O error, ENOMEM if out of memory
+ */
+static errno_t sysinst_get_file(const char *srcp, void **rdata, size_t *rsize)
+{
+	int sf;
+	size_t nr;
+	errno_t rc;
+	size_t fsize;
+	char *data;
+	vfs_stat_t st;
+
+	rc = vfs_lookup_open(srcp, WALK_REGULAR, MODE_READ, &sf);
+	if (rc != EOK)
+		return ENOENT;
+
+	if (vfs_stat(sf, &st) != EOK) {
+		vfs_put(sf);
+		return EIO;
+	}
+
+	fsize = st.size;
+
+	data = calloc(fsize, 1);
+	if (data == NULL) {
+		vfs_put(sf);
+		return ENOMEM;
+	}
+
+	rc = vfs_read(sf, (aoff64_t []) { 0 }, data, fsize, &nr);
+	if (rc != EOK || nr != fsize) {
+		vfs_put(sf);
+		free(data);
+		return EIO;
+	}
+
+	(void) vfs_put(sf);
+	*rdata = data;
+	*rsize = fsize;
+
+	return EOK;
+}
+
 /** Copy boot blocks.
  *
@@ -966,18 +1080,20 @@
 	    "sysinst_copy_boot_blocks: Read boot block image.");
 
-	rc = futil_get_file(sysinst->futil,
-	    BOOT_FILES_SRC "/boot/grub/i386-pc/boot.img",
+	rc = sysinst_get_file(BOOT_FILES_SRC "/grub/i386-pc/boot.img",
 	    &boot_img, &boot_img_size);
-	if (rc != EOK || boot_img_size != 512)
+	if (rc != EOK || boot_img_size != 512) {
+		sysinst_error(sysinst, "Error reading boot block image.");
 		return EIO;
+	}
 
 	log_msg(LOG_DEFAULT, LVL_NOTE,
 	    "sysinst_copy_boot_blocks: Read GRUB core image.");
 
-	rc = futil_get_file(sysinst->futil,
-	    BOOT_FILES_SRC "/boot/grub/i386-pc/core.img",
+	rc = sysinst_get_file(BOOT_FILES_SRC "/grub/i386-pc/core.img",
 	    &core_img, &core_img_size);
-	if (rc != EOK)
+	if (rc != EOK) {
+		sysinst_error(sysinst, "Error reading GRUB core image.");
 		return EIO;
+	}
 
 	log_msg(LOG_DEFAULT, LVL_NOTE,
@@ -992,6 +1108,8 @@
 
 	rc = block_init(sid);
-	if (rc != EOK)
+	if (rc != EOK) {
+		sysinst_error(sysinst, "Error opening block device.");
 		return rc;
+	}
 
 	log_msg(LOG_DEFAULT, LVL_NOTE,
@@ -999,6 +1117,8 @@
 
 	rc = block_get_bsize(sid, &bsize);
-	if (rc != EOK)
+	if (rc != EOK) {
+		sysinst_error(sysinst, "Error getting block size.");
 		return rc;
+	}
 
 	if (bsize != 512) {
@@ -1011,6 +1131,8 @@
 
 	rc = block_read_direct(sid, BOOT_BLOCK_IDX, 1, bbuf);
-	if (rc != EOK)
+	if (rc != EOK) {
+		sysinst_error(sysinst, "Error reading boot block.");
 		return EIO;
+	}
 
 	core_start = 16;
@@ -1043,6 +1165,8 @@
 
 	rc = block_write_direct(sid, BOOT_BLOCK_IDX, 1, bbuf);
-	if (rc != EOK)
+	if (rc != EOK) {
+		sysinst_error(sysinst, "Error writing boot block.");
 		return EIO;
+	}
 
 	log_msg(LOG_DEFAULT, LVL_NOTE,
@@ -1051,6 +1175,8 @@
 	/* XXX Must pad last block with zeros */
 	rc = block_write_direct(sid, core_start, core_blocks, core_img);
-	if (rc != EOK)
+	if (rc != EOK) {
+		sysinst_error(sysinst, "Error writing GRUB core blocks.");
 		return EIO;
+	}
 
 	log_msg(LOG_DEFAULT, LVL_NOTE,
@@ -1324,10 +1450,10 @@
 		params.rect.p0.y = 0;
 		params.rect.p1.x = 64;
-		params.rect.p1.y = 5;
+		params.rect.p1.y = 7;
 	} else {
 		params.rect.p0.x = 0;
 		params.rect.p0.y = 0;
 		params.rect.p1.x = 500;
-		params.rect.p1.y = 60;
+		params.rect.p1.y = 90;
 	}
 
@@ -1355,4 +1481,5 @@
 	}
 
+	/* Installing/upgrading system line */
 	rc = ui_label_create(ui_res, "Installing system. Please wait...",
 	    &progress->label);
@@ -1387,4 +1514,5 @@
 	}
 
+	/* Action line */
 	rc = ui_label_create(ui_res, "",
 	    &progress->action);
@@ -1398,16 +1526,47 @@
 		rect.p0.y = 3;
 		rect.p1.x = arect.p1.x;
+		rect.p1.y = 4;
+	} else {
+		rect.p0.x = arect.p0.x;
+		rect.p0.y = 40;
+		rect.p1.x = arect.p1.x;
+		rect.p1.y = 60;
+	}
+	ui_label_set_rect(progress->action, &rect);
+	ui_label_set_halign(progress->action, gfx_halign_center);
+	ui_label_set_valign(progress->action, gfx_valign_top);
+
+	rc = ui_fixed_add(fixed, ui_label_ctl(progress->action));
+	if (rc != EOK) {
+		sysinst_error(sysinst, "Error adding control to layout.");
+		ui_label_destroy(progress->label);
+		progress->label = NULL;
+		goto error;
+	}
+
+	/* Progress line */
+	rc = ui_label_create(ui_res, "",
+	    &progress->progress);
+	if (rc != EOK) {
+		sysinst_error(sysinst, "Error creating label.");
+		goto error;
+	}
+
+	if (ui_is_textmode(sysinst->ui)) {
+		rect.p0.x = arect.p0.x;
+		rect.p0.y = 5;
+		rect.p1.x = arect.p1.x;
 		rect.p1.y = arect.p1.y;
 	} else {
 		rect.p0.x = arect.p0.x;
-		rect.p0.y = 30;
+		rect.p0.y = 70;
 		rect.p1.x = arect.p1.x;
 		rect.p1.y = arect.p1.y;
 	}
-	ui_label_set_rect(progress->action, &rect);
-	ui_label_set_halign(progress->action, gfx_halign_center);
-	ui_label_set_valign(progress->action, gfx_valign_center);
-
-	rc = ui_fixed_add(fixed, ui_label_ctl(progress->action));
+	ui_label_set_rect(progress->progress, &rect);
+	ui_label_set_halign(progress->progress, gfx_halign_center);
+	ui_label_set_valign(progress->progress, gfx_valign_top);
+
+	rc = ui_fixed_add(fixed, ui_label_ctl(progress->progress));
 	if (rc != EOK) {
 		sysinst_error(sysinst, "Error adding control to layout.");
@@ -1455,4 +1614,20 @@
 }
 
+/** Set current progress message.
+ *
+ * @param sysinst System installer
+ * @param progress Progress text
+ */
+static void sysinst_progress(sysinst_t *sysinst, const char *progress)
+{
+	log_msg(LOG_DEFAULT, LVL_NOTE, "%s", progress);
+
+	if (sysinst->progress == NULL)
+		return;
+
+	ui_label_set_text(sysinst->progress->progress, progress);
+	ui_label_paint(sysinst->progress->progress);
+}
+
 /** Set current action message.
  *
@@ -1616,9 +1791,12 @@
 	fibril_mutex_initialize(&sysinst->responded_lock);
 
-	rc = futil_create(&sysinst_futil_cb, (void *)sysinst, &sysinst->futil);
+	rc = fmgt_create(&sysinst->fmgt);
 	if (rc != EOK) {
 		printf("Out of memory.\n");
 		goto error;
 	}
+
+	fmgt_set_cb(sysinst->fmgt, &sysinst_fmgt_cb, (void *)sysinst);
+	fmgt_set_init_update(sysinst->fmgt, true);
 
 	rc = ui_create(display_spec, &ui);
@@ -1681,6 +1859,6 @@
 	return EOK;
 error:
-	if (sysinst->futil != NULL)
-		futil_destroy(sysinst->futil);
+	if (sysinst->fmgt != NULL)
+		fmgt_destroy(sysinst->fmgt);
 	if (sysinst->system != NULL)
 		system_close(sysinst->system);
Index: uspace/app/sysinst/sysinst.h
===================================================================
--- uspace/app/sysinst/sysinst.h	(revision 417cc856d6c421adc10b1fb082e24a4d5e93ec6e)
+++ uspace/app/sysinst/sysinst.h	(revision 5df257077a2eb3d939122d95f8fcecad4b07ff62)
@@ -38,5 +38,5 @@
 
 #include <fibril_synch.h>
-#include <futil.h>
+#include <fmgt.h>
 #include <gfx/color.h>
 #include <loc.h>
@@ -54,4 +54,5 @@
 	ui_label_t *label;
 	ui_label_t *action;
+	ui_label_t *progress;
 } sysinst_progress_t;
 
@@ -75,5 +76,5 @@
 	/** operation being performed */
 	sysinst_oper_t oper;
-	futil_t *futil;
+	fmgt_t *fmgt;
 	/** @c true after user responds to interactive query. */
 	bool responded;
Index: uspace/lib/fmgt/include/types/fmgt.h
===================================================================
--- uspace/lib/fmgt/include/types/fmgt.h	(revision 417cc856d6c421adc10b1fb082e24a4d5e93ec6e)
+++ uspace/lib/fmgt/include/types/fmgt.h	(revision 5df257077a2eb3d939122d95f8fcecad4b07ff62)
@@ -114,4 +114,20 @@
 } fmgt_exists_action_t;
 
+/** Action being performed. */
+typedef enum {
+	/** copying file */
+	fmgt_ac_copy,
+	/** creating file or directory */
+	fmgt_ac_create,
+	/** deleting file or directory */
+	fmgt_ac_delete,
+	/** moving file */
+	fmgt_ac_move,
+	/** renaming file */
+	fmgt_ac_rename,
+	/** verifying file */
+	fmgt_ac_verify,
+} fmgt_action_t;
+
 /** File management callbacks */
 typedef struct {
@@ -119,4 +135,5 @@
 	fmgt_error_action_t (*io_error_query)(void *, fmgt_io_error_t *);
 	fmgt_exists_action_t (*exists_query)(void *, fmgt_exists_t *);
+	void (*action)(void *, fmgt_action_t, const char *, const char *);
 	void (*progress)(void *, fmgt_progress_t *);
 } fmgt_cb_t;
Index: uspace/lib/fmgt/private/fmgt.h
===================================================================
--- uspace/lib/fmgt/private/fmgt.h	(revision 417cc856d6c421adc10b1fb082e24a4d5e93ec6e)
+++ uspace/lib/fmgt/private/fmgt.h	(revision 5df257077a2eb3d939122d95f8fcecad4b07ff62)
@@ -54,4 +54,6 @@
 extern void fmgt_initial_progress_update(fmgt_t *);
 extern void fmgt_final_progress_update(fmgt_t *);
+extern void fmgt_report_action(fmgt_t *, fmgt_action_t, const char *,
+    const char *);
 
 #endif
Index: uspace/lib/fmgt/src/copy.c
===================================================================
--- uspace/lib/fmgt/src/copy.c	(revision 417cc856d6c421adc10b1fb082e24a4d5e93ec6e)
+++ uspace/lib/fmgt/src/copy.c	(revision 5df257077a2eb3d939122d95f8fcecad4b07ff62)
@@ -64,4 +64,5 @@
 
 	(void)dest;
+	fmgt_report_action(fmgt, fmgt_ac_create, dest, NULL);
 	return fmgt_create_dir(fmgt, dest, false);
 }
@@ -86,4 +87,6 @@
 	char *buffer;
 	errno_t rc;
+
+	fmgt_report_action(fmgt, fmgt_ac_copy, src, dest);
 
 	buffer = calloc(BUFFER_SIZE, 1);
Index: uspace/lib/fmgt/src/delete.c
===================================================================
--- uspace/lib/fmgt/src/delete.c	(revision 417cc856d6c421adc10b1fb082e24a4d5e93ec6e)
+++ uspace/lib/fmgt/src/delete.c	(revision 5df257077a2eb3d939122d95f8fcecad4b07ff62)
@@ -64,4 +64,6 @@
 	errno_t rc;
 
+	fmgt_report_action(fmgt, fmgt_ac_delete, src, NULL);
+
 	/* Remove original file. */
 	rc = fmgt_remove(fmgt, src);
@@ -85,4 +87,5 @@
 	fmgt_t *fmgt = (fmgt_t *)walk->params->arg;
 	(void)dest;
+	fmgt_report_action(fmgt, fmgt_ac_delete, src, NULL);
 	return fmgt_remove(fmgt, src);
 }
Index: uspace/lib/fmgt/src/fmgt.c
===================================================================
--- uspace/lib/fmgt/src/fmgt.c	(revision 417cc856d6c421adc10b1fb082e24a4d5e93ec6e)
+++ uspace/lib/fmgt/src/fmgt.c	(revision 5df257077a2eb3d939122d95f8fcecad4b07ff62)
@@ -218,4 +218,19 @@
 }
 
+/** Report action being performed to the caller.
+ *
+ * @param fmgt File management object
+ * @param action Action we started performing
+ * @param src Source (or only) path
+ * @param dest Destination path or @c NULL
+ */
+void fmgt_report_action(fmgt_t *fmgt, fmgt_action_t action, const char *src,
+    const char *dest)
+{
+	if (fmgt->cb != NULL && fmgt->cb->action != NULL) {
+		fmgt->cb->action(fmgt->cb_arg, action, src, dest);
+	}
+}
+
 /** Provide initial progress update (if required).
  *
Index: uspace/lib/fmgt/src/move.c
===================================================================
--- uspace/lib/fmgt/src/move.c	(revision 417cc856d6c421adc10b1fb082e24a4d5e93ec6e)
+++ uspace/lib/fmgt/src/move.c	(revision 5df257077a2eb3d939122d95f8fcecad4b07ff62)
@@ -89,4 +89,6 @@
 	errno_t rc;
 
+	fmgt_report_action(fmgt, fmgt_ac_move, src, dest);
+
 	buffer = calloc(BUFFER_SIZE, 1);
 	if (buffer == NULL)
@@ -166,4 +168,5 @@
 
 	(void)dest;
+	fmgt_report_action(fmgt, fmgt_ac_delete, src, NULL);
 	return fmgt_remove(fmgt, src);
 }
Index: uspace/lib/fmgt/src/newdir.c
===================================================================
--- uspace/lib/fmgt/src/newdir.c	(revision 417cc856d6c421adc10b1fb082e24a4d5e93ec6e)
+++ uspace/lib/fmgt/src/newdir.c	(revision 5df257077a2eb3d939122d95f8fcecad4b07ff62)
@@ -84,4 +84,6 @@
 	errno_t rc;
 
+	fmgt_report_action(fmgt, fmgt_ac_create, dname, NULL);
+
 	/* Clear statistics. */
 	fmgt_progress_init(fmgt);
Index: uspace/lib/fmgt/src/newfile.c
===================================================================
--- uspace/lib/fmgt/src/newfile.c	(revision 417cc856d6c421adc10b1fb082e24a4d5e93ec6e)
+++ uspace/lib/fmgt/src/newfile.c	(revision 5df257077a2eb3d939122d95f8fcecad4b07ff62)
@@ -98,4 +98,6 @@
 	errno_t rc;
 
+	fmgt_report_action(fmgt, fmgt_ac_create, fname, NULL);
+
 	buffer = calloc(BUFFER_SIZE, 1);
 	if (buffer == NULL)
Index: uspace/lib/fmgt/src/rename.c
===================================================================
--- uspace/lib/fmgt/src/rename.c	(revision 417cc856d6c421adc10b1fb082e24a4d5e93ec6e)
+++ uspace/lib/fmgt/src/rename.c	(revision 5df257077a2eb3d939122d95f8fcecad4b07ff62)
@@ -50,4 +50,6 @@
 	errno_t rc;
 
+	fmgt_report_action(fmgt, fmgt_ac_rename, old_path, new_name);
+
 	/* Clear statistics. */
 	fmgt_progress_init(fmgt);
Index: uspace/lib/fmgt/src/verify.c
===================================================================
--- uspace/lib/fmgt/src/verify.c	(revision 417cc856d6c421adc10b1fb082e24a4d5e93ec6e)
+++ uspace/lib/fmgt/src/verify.c	(revision 5df257077a2eb3d939122d95f8fcecad4b07ff62)
@@ -68,4 +68,5 @@
 
 	(void)unused;
+	fmgt_report_action(fmgt, fmgt_ac_verify, fname, NULL);
 
 	buffer = calloc(BUFFER_SIZE, 1);
Index: uspace/lib/futil/include/futil.h
===================================================================
--- uspace/lib/futil/include/futil.h	(revision 417cc856d6c421adc10b1fb082e24a4d5e93ec6e)
+++ uspace/lib/futil/include/futil.h	(revision 5df257077a2eb3d939122d95f8fcecad4b07ff62)
@@ -1,4 +1,4 @@
 /*
- * Copyright (c) 2025 Jiri Svoboda
+ * Copyright (c) 2026 Jiri Svoboda
  * All rights reserved.
  *
@@ -46,5 +46,4 @@
 extern errno_t futil_copy_file(futil_t *, const char *, const char *);
 extern errno_t futil_rcopy_contents(futil_t *, const char *, const char *);
-extern errno_t futil_get_file(futil_t *, const char *, void **, size_t *);
 
 #endif
Index: uspace/lib/futil/src/futil.c
===================================================================
--- uspace/lib/futil/src/futil.c	(revision 417cc856d6c421adc10b1fb082e24a4d5e93ec6e)
+++ uspace/lib/futil/src/futil.c	(revision 5df257077a2eb3d939122d95f8fcecad4b07ff62)
@@ -199,55 +199,4 @@
 }
 
-/** Return file contents as a heap-allocated block of bytes.
- *
- * @param futil File utility instance
- * @param srcp File path
- * @param rdata Place to store pointer to data
- * @param rsize Place to store size of data
- *
- * @return EOK on success, ENOENT if failed to open file, EIO on other
- *         I/O error, ENOMEM if out of memory
- */
-errno_t futil_get_file(futil_t *futil, const char *srcp, void **rdata,
-    size_t *rsize)
-{
-	int sf;
-	size_t nr;
-	errno_t rc;
-	size_t fsize;
-	char *data;
-	vfs_stat_t st;
-
-	rc = vfs_lookup_open(srcp, WALK_REGULAR, MODE_READ, &sf);
-	if (rc != EOK)
-		return ENOENT;
-
-	if (vfs_stat(sf, &st) != EOK) {
-		vfs_put(sf);
-		return EIO;
-	}
-
-	fsize = st.size;
-
-	data = calloc(fsize, 1);
-	if (data == NULL) {
-		vfs_put(sf);
-		return ENOMEM;
-	}
-
-	rc = vfs_read(sf, (aoff64_t []) { 0 }, data, fsize, &nr);
-	if (rc != EOK || nr != fsize) {
-		vfs_put(sf);
-		free(data);
-		return EIO;
-	}
-
-	(void) vfs_put(sf);
-	*rdata = data;
-	*rsize = fsize;
-
-	return EOK;
-}
-
 /** @}
  */
