Index: uspace/app/nav/dlg/newfiledlg.c
===================================================================
--- uspace/app/nav/dlg/newfiledlg.c	(revision 32ae27bb2ab2a70745223947ea103c3e302cdb50)
+++ uspace/app/nav/dlg/newfiledlg.c	(revision cfd04c4747e6065a3d8116877b13a2bc1307950f)
@@ -358,5 +358,5 @@
 
 	(void)window;
-	if (dialog->cb != NULL && dialog->cb->bcancel != NULL) {
+	if (dialog->cb != NULL && dialog->cb->close != NULL) {
 		dialog->cb->close(dialog, dialog->arg);
 	}
@@ -373,5 +373,6 @@
 {
 	new_file_dlg_t *dialog = (new_file_dlg_t *) arg;
-	const char *text;
+	const char *fname;
+	const char *fsize;
 
 	if (event->type == KEY_PRESS &&
@@ -380,6 +381,8 @@
 			/* Confirm */
 			if (dialog->cb != NULL && dialog->cb->bok != NULL) {
-				text = ui_entry_get_text(dialog->ename);
-				dialog->cb->bok(dialog, dialog->arg, text);
+				fname = ui_entry_get_text(dialog->ename);
+				fsize = ui_entry_get_text(dialog->esize);
+				dialog->cb->bok(dialog, dialog->arg, fname,
+				    fsize);
 				return;
 			}
@@ -404,9 +407,11 @@
 {
 	new_file_dlg_t *dialog = (new_file_dlg_t *) arg;
-	const char *text;
+	const char *fname;
+	const char *fsize;
 
 	if (dialog->cb != NULL && dialog->cb->bok != NULL) {
-		text = ui_entry_get_text(dialog->ename);
-		dialog->cb->bok(dialog, dialog->arg, text);
+		fname = ui_entry_get_text(dialog->ename);
+		fsize = ui_entry_get_text(dialog->esize);
+		dialog->cb->bok(dialog, dialog->arg, fname, fsize);
 	}
 }
Index: uspace/app/nav/dlg/progress.c
===================================================================
--- uspace/app/nav/dlg/progress.c	(revision cfd04c4747e6065a3d8116877b13a2bc1307950f)
+++ uspace/app/nav/dlg/progress.c	(revision cfd04c4747e6065a3d8116877b13a2bc1307950f)
@@ -0,0 +1,312 @@
+/*
+ * Copyright (c) 2025 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 Progress dialog
+ */
+
+#include <errno.h>
+#include <fmgt.h>
+#include <mem.h>
+#include <stdlib.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 "progress.h"
+
+static void progress_dlg_wnd_close(ui_window_t *, void *);
+static void progress_dlg_wnd_kbd(ui_window_t *, void *, kbd_event_t *);
+
+ui_window_cb_t progress_dlg_wnd_cb = {
+	.close = progress_dlg_wnd_close,
+	.kbd = progress_dlg_wnd_kbd
+};
+
+static void progress_dlg_babort_clicked(ui_pbutton_t *, void *);
+
+ui_pbutton_cb_t progress_dlg_babort_cb = {
+	.clicked = progress_dlg_babort_clicked
+};
+
+/** Initialize progress dialog parameters structure.
+ *
+ * Progress dialog parameters structure must always be initialized using
+ * this function first.
+ *
+ * @param params Progress dialog parameters structure
+ */
+void progress_dlg_params_init(progress_dlg_params_t *params)
+{
+	memset(params, 0, sizeof(progress_dlg_params_t));
+	params->caption = "";
+}
+
+/** Create progress dialog.
+ *
+ * @param ui User interface
+ * @param params Parameters
+ * @param rdialog Place to store pointer to new dialog
+ * @return EOK on success or an error code
+ */
+errno_t progress_dlg_create(ui_t *ui, progress_dlg_params_t *params,
+    progress_dlg_t **rdialog)
+{
+	errno_t rc;
+	progress_dlg_t *dialog;
+	ui_window_t *window = NULL;
+	ui_wnd_params_t wparams;
+	ui_fixed_t *fixed = NULL;
+	ui_label_t *label = NULL;
+	ui_pbutton_t *babort = NULL;
+	gfx_rect_t rect;
+	ui_resource_t *ui_res;
+	char *name = NULL;
+
+	dialog = calloc(1, sizeof(progress_dlg_t));
+	if (dialog == NULL) {
+		rc = ENOMEM;
+		goto error;
+	}
+
+	ui_wnd_params_init(&wparams);
+	wparams.caption = params->caption;
+
+	/* FIXME: Auto layout */
+	if (ui_is_textmode(ui)) {
+		wparams.rect.p0.x = 0;
+		wparams.rect.p0.y = 0;
+		wparams.rect.p1.x = 50;
+		wparams.rect.p1.y = 11;
+	} else {
+		wparams.rect.p0.x = 0;
+		wparams.rect.p0.y = 0;
+		wparams.rect.p1.x = 400;
+		wparams.rect.p1.y = 135;
+	}
+
+	rc = ui_window_create(ui, &wparams, &window);
+	if (rc != EOK)
+		goto error;
+
+	ui_window_set_cb(window, &progress_dlg_wnd_cb, dialog);
+
+	ui_res = ui_window_get_res(window);
+
+	rc = ui_fixed_create(&fixed);
+	if (rc != EOK)
+		goto error;
+
+	rc = ui_label_create(ui_res, "XXX of XXX (XXX%)", &label);
+	if (rc != EOK)
+		goto error;
+
+	/* FIXME: Auto layout */
+	if (ui_is_textmode(ui)) {
+		rect.p0.x = 3;
+		rect.p0.y = 2;
+		rect.p1.x = 47;
+		rect.p1.y = 3;
+	} else {
+		rect.p0.x = 10;
+		rect.p0.y = 35;
+		rect.p1.x = 390;
+		rect.p1.y = 50;
+	}
+
+	ui_label_set_rect(label, &rect);
+	ui_label_set_halign(label, gfx_halign_center);
+
+	rc = ui_fixed_add(fixed, ui_label_ctl(label));
+	if (rc != EOK)
+		goto error;
+
+	dialog->lcurf_prog = label;
+	label = NULL;
+
+	rc = ui_pbutton_create(ui_res, "Abort", &babort);
+	if (rc != EOK)
+		goto error;
+
+	ui_pbutton_set_cb(babort, &progress_dlg_babort_cb, dialog);
+
+	/* FIXME: Auto layout */
+	if (ui_is_textmode(ui)) {
+		rect.p0.x = 20;
+		rect.p0.y = 8;
+		rect.p1.x = 30;
+		rect.p1.y = 9;
+	} else {
+		rect.p0.x = 205;
+		rect.p0.y = 90;
+		rect.p1.x = 295;
+		rect.p1.y = 118;
+	}
+
+	ui_pbutton_set_rect(babort, &rect);
+
+	ui_pbutton_set_default(babort, true);
+
+	rc = ui_fixed_add(fixed, ui_pbutton_ctl(babort));
+	if (rc != EOK)
+		goto error;
+
+	dialog->babort = babort;
+	babort = 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 (name != NULL)
+		free(name);
+	if (babort != NULL)
+		ui_pbutton_destroy(babort);
+	if (label != NULL)
+		ui_label_destroy(label);
+	if (fixed != NULL)
+		ui_fixed_destroy(fixed);
+	if (window != NULL)
+		ui_window_destroy(window);
+	if (dialog != NULL)
+		free(dialog);
+	return rc;
+}
+
+/** Destroy progress dialog.
+ *
+ * @param dialog Progress dialog or @c NULL
+ */
+void progress_dlg_destroy(progress_dlg_t *dialog)
+{
+	if (dialog == NULL)
+		return;
+
+	ui_window_destroy(dialog->window);
+	free(dialog);
+}
+
+/** Set mesage dialog callback.
+ *
+ * @param dialog Progress dialog
+ * @param cb Progress dialog callbacks
+ * @param arg Callback argument
+ */
+void progress_dlg_set_cb(progress_dlg_t *dialog, progress_dlg_cb_t *cb,
+    void *arg)
+{
+	dialog->cb = cb;
+	dialog->arg = arg;
+}
+
+/** Set current file progress text.
+ *
+ * @param dialog Progress dialog
+ * @param text New text for current file progress
+ *
+ * @return EOK on success or an error code
+ */
+errno_t progress_dlg_set_curf_prog(progress_dlg_t *dialog, const char *text)
+{
+	errno_t rc;
+
+	rc = ui_label_set_text(dialog->lcurf_prog, text);
+	if (rc != EOK)
+		return rc;
+
+	return ui_label_paint(dialog->lcurf_prog);
+}
+
+/** Progress dialog window close handler.
+ *
+ * @param window Window
+ * @param arg Argument (progress_dlg_t *)
+ */
+static void progress_dlg_wnd_close(ui_window_t *window, void *arg)
+{
+	progress_dlg_t *dialog = (progress_dlg_t *) arg;
+
+	(void)window;
+	if (dialog->cb != NULL && dialog->cb->close != NULL) {
+		dialog->cb->close(dialog, dialog->arg);
+	}
+}
+
+/** Progress dialog window keyboard event handler.
+ *
+ * @param window Window
+ * @param arg Argument (progress_dlg_t *)
+ * @param event Keyboard event
+ */
+static void progress_dlg_wnd_kbd(ui_window_t *window, void *arg,
+    kbd_event_t *event)
+{
+	progress_dlg_t *dialog = (progress_dlg_t *) arg;
+
+	if (event->type == KEY_PRESS &&
+	    (event->mods & (KM_CTRL | KM_SHIFT | KM_ALT)) == 0) {
+		if (event->key == KC_ENTER || event->key == KC_ESCAPE) {
+			/* Abort */
+			if (dialog->cb != NULL && dialog->cb->babort != NULL) {
+				dialog->cb->babort(dialog, dialog->arg);
+				return;
+			}
+		}
+	}
+
+	ui_window_def_kbd(window, event);
+}
+
+/** Progress dialog Abort button click handler.
+ *
+ * @param pbutton Push button
+ * @param arg Argument (progress_dlg_t *)
+ */
+static void progress_dlg_babort_clicked(ui_pbutton_t *pbutton, void *arg)
+{
+	progress_dlg_t *dialog = (progress_dlg_t *) arg;
+
+	if (dialog->cb != NULL && dialog->cb->babort != NULL) {
+		dialog->cb->babort(dialog, dialog->arg);
+	}
+}
+
+/** @}
+ */
Index: uspace/app/nav/dlg/progress.h
===================================================================
--- uspace/app/nav/dlg/progress.h	(revision cfd04c4747e6065a3d8116877b13a2bc1307950f)
+++ uspace/app/nav/dlg/progress.h	(revision cfd04c4747e6065a3d8116877b13a2bc1307950f)
@@ -0,0 +1,54 @@
+/*
+ * Copyright (c) 2025 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 Progress dialog
+ */
+
+#ifndef DLG_PROGRESS_H
+#define DLG_PROGRESS_H
+
+#include <errno.h>
+#include <types/ui/ui.h>
+#include "../types/dlg/progress.h"
+
+extern void progress_dlg_params_init(progress_dlg_params_t *);
+extern errno_t progress_dlg_create(ui_t *, progress_dlg_params_t *,
+    progress_dlg_t **);
+extern void progress_dlg_set_cb(progress_dlg_t *, progress_dlg_cb_t *,
+    void *);
+extern errno_t progress_dlg_set_curf_prog(progress_dlg_t *, const char *);
+extern void progress_dlg_destroy(progress_dlg_t *);
+
+#endif
+
+/** @}
+ */
Index: uspace/app/nav/meson.build
===================================================================
--- uspace/app/nav/meson.build	(revision 32ae27bb2ab2a70745223947ea103c3e302cdb50)
+++ uspace/app/nav/meson.build	(revision cfd04c4747e6065a3d8116877b13a2bc1307950f)
@@ -30,4 +30,5 @@
 src = files(
 	'dlg/newfiledlg.c',
+	'dlg/progress.c',
 	'main.c',
 	'menu.c',
@@ -39,4 +40,5 @@
 test_src = files(
 	'dlg/newfiledlg.c',
+	'dlg/progress.c',
 	'menu.c',
 	'nav.c',
Index: uspace/app/nav/nav.c
===================================================================
--- uspace/app/nav/nav.c	(revision 32ae27bb2ab2a70745223947ea103c3e302cdb50)
+++ uspace/app/nav/nav.c	(revision cfd04c4747e6065a3d8116877b13a2bc1307950f)
@@ -35,4 +35,5 @@
  */
 
+#include <fibril.h>
 #include <gfx/coord.h>
 #include <stdio.h>
@@ -535,4 +536,64 @@
 }
 
+/** Wrapper fibril function for worker function.
+ *
+ * This is the main fibril function for the worker fibril. It executes
+ * the worker function, then clears worker FID to indicate the worker
+ * is finished.
+ *
+ * @param arg Argument (navigator_worker_job_t *)
+ * @return EOK
+ */
+static errno_t navigator_worker_func(void *arg)
+{
+	navigator_worker_job_t *job = (navigator_worker_job_t *)arg;
+
+	job->wfunc(job->arg);
+	job->navigator->worker_fid = 0;
+	free(job);
+	return EOK;
+}
+
+/** Start long-time work in a worker fibril.
+ *
+ * Actions which can take time (file operations) cannot block the main UI
+ * fibril. This function will start an action in the worker fibril, i.e.,
+ * in the background. At the same time the caller should create a modal
+ * progress dialog that will be shown until the work is completed.
+ *
+ * (Only a single worker can execute at any given time).
+ *
+ * @param nav Navigator
+ * @param wfunc Worker main function
+ * @param arg Argument to worker function
+ *
+ * @return EOK on success or an error code
+ */
+errno_t navigator_worker_start(navigator_t *nav, void (*wfunc)(void *),
+    void *arg)
+{
+	navigator_worker_job_t *job;
+
+	if (nav->worker_fid != 0)
+		return EBUSY;
+
+	job = calloc(1, sizeof(navigator_worker_job_t));
+	if (job == NULL)
+		return ENOMEM;
+
+	job->navigator = nav;
+	job->wfunc = wfunc;
+	job->arg = arg;
+
+	nav->worker_fid = fibril_create(navigator_worker_func, (void *)job);
+	if (nav->worker_fid == 0) {
+		free(job);
+		return ENOMEM;
+	}
+
+	fibril_add_ready(nav->worker_fid);
+	return EOK;
+}
+
 /** @}
  */
Index: uspace/app/nav/nav.h
===================================================================
--- uspace/app/nav/nav.h	(revision 32ae27bb2ab2a70745223947ea103c3e302cdb50)
+++ uspace/app/nav/nav.h	(revision cfd04c4747e6065a3d8116877b13a2bc1307950f)
@@ -47,4 +47,6 @@
 extern void navigator_switch_panel(navigator_t *);
 extern void navigator_refresh_panels(navigator_t *);
+extern errno_t navigator_worker_start(navigator_t *, void (*)(void *),
+    void *);
 
 #endif
Index: uspace/app/nav/newfile.c
===================================================================
--- uspace/app/nav/newfile.c	(revision 32ae27bb2ab2a70745223947ea103c3e302cdb50)
+++ uspace/app/nav/newfile.c	(revision cfd04c4747e6065a3d8116877b13a2bc1307950f)
@@ -34,4 +34,6 @@
  */
 
+#include <capa.h>
+#include <fmgt.h>
 #include <stdlib.h>
 #include <str_error.h>
@@ -42,10 +44,13 @@
 #include <ui/ui.h>
 #include <ui/window.h>
+#include <str.h>
 #include "dlg/newfiledlg.h"
+#include "dlg/progress.h"
 #include "menu.h"
 #include "newfile.h"
 #include "nav.h"
-
-static void new_file_bok(new_file_dlg_t *, void *, const char *);
+#include "types/newfile.h"
+
+static void new_file_bok(new_file_dlg_t *, void *, const char *, const char *);
 static void new_file_bcancel(new_file_dlg_t *, void *);
 static void new_file_close(new_file_dlg_t *, void *);
@@ -57,4 +62,10 @@
 };
 
+static void new_file_progress(void *, fmgt_progress_t *);
+
+static fmgt_cb_t new_file_fmgt_cb = {
+	.progress = new_file_progress
+};
+
 /** Open New File dialog.
  *
@@ -69,4 +80,55 @@
 }
 
+/** New file worker function.
+ *
+ * @param arg Argument (navigator_new_file_job_t)
+ */
+static void new_file_wfunc(void *arg)
+{
+	fmgt_t *fmgt = NULL;
+	navigator_new_file_job_t *job = (navigator_new_file_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, &new_file_fmgt_cb, (void *)nav);
+	fmgt_set_init_update(fmgt, true);
+
+	rc = fmgt_new_file(fmgt, job->fname, job->nbytes);
+	if (rc != EOK) {
+		rv = asprintf(&msg, "Error creating file (%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:
+	ui_lock(nav->ui);
+	progress_dlg_destroy(nav->progress_dlg);
+	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);
+}
+
 /** New file dialog confirmed.
  *
@@ -74,32 +136,70 @@
  * @param arg Argument (navigator_t *)
  * @param fname New file name
- */
-static void new_file_bok(new_file_dlg_t *dlg, void *arg, const char *fname)
+ * @param fsize New file size
+ */
+static void new_file_bok(new_file_dlg_t *dlg, void *arg, const char *fname,
+    const char *fsize)
 {
 	navigator_t *nav = (navigator_t *)arg;
 	ui_msg_dialog_t *dialog = NULL;
+	navigator_new_file_job_t *job;
 	ui_msg_dialog_params_t params;
+	progress_dlg_params_t pd_params;
+	capa_spec_t fcap;
 	char *msg = NULL;
+	errno_t rc;
+	uint64_t nbytes;
 	int rv;
-	FILE *f;
+
+	rc = capa_parse(fsize, &fcap);
+	if (rc != EOK) {
+		/* invalid file size */
+		return;
+	}
 
 	new_file_dlg_destroy(dlg);
-	f = fopen(fname, "wx");
-	if (f == NULL) {
-		rv = asprintf(&msg, "Error creating file (%s).",
-		    str_error(errno));
+
+	rc = capa_to_blocks(&fcap, cv_nom, 1, &nbytes);
+	if (rc != EOK) {
+		rv = asprintf(&msg, "File size too large (%s).", fsize);
 		if (rv < 0)
 			return;
-
-		ui_msg_dialog_params_init(&params);
-		params.caption = "Error";
-		params.text = msg;
-		(void) ui_msg_dialog_create(nav->ui, &params, &dialog);
-		free(msg);
+		goto error;
+	}
+
+	job = calloc(1, sizeof(navigator_new_file_job_t));
+	if (job == NULL)
 		return;
-	}
-
-	fclose(f);
-	navigator_refresh_panels(nav);
+
+	job->navigator = nav;
+	job->fname = fname;
+	job->nbytes = nbytes;
+
+	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;
+	}
+
+	rc = navigator_worker_start(nav, new_file_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);
 }
 
@@ -126,4 +226,20 @@
 }
 
+/** New file progress update.
+ *
+ * @param arg Argument (navigator_t *)
+ * @param progress Progress update
+ */
+static void new_file_progress(void *arg, fmgt_progress_t *progress)
+{
+	navigator_t *nav = (navigator_t *)arg;
+	char buf[128];
+
+	snprintf(buf, sizeof(buf), "Written %s of %s (%s done).",
+	    progress->curf_procb, progress->curf_totalb,
+	    progress->curf_percent);
+	progress_dlg_set_curf_prog(nav->progress_dlg, buf);
+}
+
 /** @}
  */
Index: uspace/app/nav/types/dlg/newfiledlg.h
===================================================================
--- uspace/app/nav/types/dlg/newfiledlg.h	(revision 32ae27bb2ab2a70745223947ea103c3e302cdb50)
+++ uspace/app/nav/types/dlg/newfiledlg.h	(revision cfd04c4747e6065a3d8116877b13a2bc1307950f)
@@ -60,8 +60,8 @@
 } new_file_dlg_t;
 
-/** Prompt dialog callback */
+/** New File dialog callbacks */
 typedef struct new_file_dlg_cb {
 	/** OK button was pressed */
-	void (*bok)(new_file_dlg_t *, void *, const char *);
+	void (*bok)(new_file_dlg_t *, void *, const char *, const char *);
 	/** Cancel button was pressed */
 	void (*bcancel)(new_file_dlg_t *, void *);
Index: uspace/app/nav/types/dlg/progress.h
===================================================================
--- uspace/app/nav/types/dlg/progress.h	(revision cfd04c4747e6065a3d8116877b13a2bc1307950f)
+++ uspace/app/nav/types/dlg/progress.h	(revision cfd04c4747e6065a3d8116877b13a2bc1307950f)
@@ -0,0 +1,75 @@
+/*
+ * Copyright (c) 2025 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 Progress dialog
+ */
+
+#ifndef TYPES_DLG_PROGRESS_H
+#define TYPES_DLG_PROGRESS_H
+
+#include <errno.h>
+#include <ui/label.h>
+#include <ui/pbutton.h>
+#include <ui/window.h>
+
+/** Progress dialog */
+typedef struct progress_dlg {
+	/** Dialog window */
+	ui_window_t *window;
+	/** Label with current file progress */
+	ui_label_t *lcurf_prog;
+	/** Abort button */
+	ui_pbutton_t *babort;
+	/** New file dialog callbacks */
+	struct progress_dlg_cb *cb;
+	/** Callback argument */
+	void *arg;
+} progress_dlg_t;
+
+/** Progress dialog callbacks */
+typedef struct progress_dlg_cb {
+	/** Abort button was pressed */
+	void (*babort)(progress_dlg_t *, void *);
+	/** Window closure requested (e.g. via close button) */
+	void (*close)(progress_dlg_t *, void *);
+} progress_dlg_cb_t;
+
+/** Progress dialog parameters */
+typedef struct {
+	/** Window caption */
+	const char *caption;
+} progress_dlg_params_t;
+
+#endif
+
+/** @}
+ */
Index: uspace/app/nav/types/nav.h
===================================================================
--- uspace/app/nav/types/nav.h	(revision 32ae27bb2ab2a70745223947ea103c3e302cdb50)
+++ uspace/app/nav/types/nav.h	(revision cfd04c4747e6065a3d8116877b13a2bc1307950f)
@@ -1,4 +1,4 @@
 /*
- * Copyright (c) 2021 Jiri Svoboda
+ * Copyright (c) 2025 Jiri Svoboda
  * All rights reserved.
  *
@@ -37,4 +37,5 @@
 #define TYPES_NAV_H
 
+#include <fibril.h>
 #include <ui/fixed.h>
 #include <ui/ui.h>
@@ -57,5 +58,19 @@
 	/** Panels */
 	struct panel *panel[navigator_panels];
+	/** Progress dialog */
+	struct progress_dlg *progress_dlg;
+	/** Worker fibril ID */
+	fid_t worker_fid;
 } navigator_t;
+
+/** Navigator worker job */
+typedef struct {
+	/** Navigator */
+	navigator_t *navigator;
+	/** Worker function */
+	void (*wfunc)(void *);
+	/** Worker argument */
+	void *arg;
+} navigator_worker_job_t;
 
 #endif
Index: uspace/app/nav/types/newfile.h
===================================================================
--- uspace/app/nav/types/newfile.h	(revision cfd04c4747e6065a3d8116877b13a2bc1307950f)
+++ uspace/app/nav/types/newfile.h	(revision cfd04c4747e6065a3d8116877b13a2bc1307950f)
@@ -0,0 +1,54 @@
+/*
+ * Copyright (c) 2025 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 New File types
+ */
+
+#ifndef TYPES_NEWFILE_H
+#define TYPES_NEWFILE_H
+
+#include <stdint.h>
+
+/** Navigator New File job */
+typedef struct {
+	/** Navigator */
+	struct navigator *navigator;
+	/** New file name */
+	const char *fname;
+	/** New file size */
+	uint64_t nbytes;
+} navigator_new_file_job_t;
+
+#endif
+
+/** @}
+ */
