Index: uspace/app/nav/nav.c
===================================================================
--- uspace/app/nav/nav.c	(revision 0cf3d5fd80c26cfc1eb8307bffabaf2efbd10f3a)
+++ uspace/app/nav/nav.c	(revision c3db721a084b301093cb54eaccbc8d58ec6ff845)
@@ -79,4 +79,12 @@
 	.activate_req = navigator_panel_activate_req,
 	.file_open = navigator_panel_file_open
+};
+
+static void navigator_progress_babort(progress_dlg_t *, void *);
+static void navigator_progress_close(progress_dlg_t *, void *);
+
+progress_dlg_cb_t navigator_progress_cb = {
+	.babort = navigator_progress_babort,
+	.close = navigator_progress_close
 };
 
@@ -596,4 +604,30 @@
 }
 
+/** Abort button pressed in progress dialog.
+ *
+ * @param dlg Progress dialog
+ * @param arg Argument (navigator_t *)
+ */
+static void navigator_progress_babort(progress_dlg_t *dlg, void *arg)
+{
+	navigator_t *nav = (navigator_t *)arg;
+
+	(void)dlg;
+	nav->abort_op = true;
+}
+
+/** Progress dialog closed,
+ *
+ * @param dlg Progress dialog
+ * @param arg Argument (navigator_t *)
+ */
+static void navigator_progress_close(progress_dlg_t *dlg, void *arg)
+{
+	navigator_t *nav = (navigator_t *)arg;
+
+	(void)dlg;
+	nav->abort_op = true;
+}
+
 /** @}
  */
Index: uspace/app/nav/nav.h
===================================================================
--- uspace/app/nav/nav.h	(revision 0cf3d5fd80c26cfc1eb8307bffabaf2efbd10f3a)
+++ uspace/app/nav/nav.h	(revision c3db721a084b301093cb54eaccbc8d58ec6ff845)
@@ -38,6 +38,9 @@
 
 #include <errno.h>
+#include "types/dlg/progress.h"
 #include "types/nav.h"
 #include "types/panel.h"
+
+extern progress_dlg_cb_t navigator_progress_cb;
 
 extern errno_t navigator_create(const char *, navigator_t **);
Index: uspace/app/nav/newfile.c
===================================================================
--- uspace/app/nav/newfile.c	(revision 0cf3d5fd80c26cfc1eb8307bffabaf2efbd10f3a)
+++ uspace/app/nav/newfile.c	(revision c3db721a084b301093cb54eaccbc8d58ec6ff845)
@@ -64,8 +64,10 @@
 };
 
+static bool new_file_abort_query(void *);
 static void new_file_progress(void *, fmgt_progress_t *);
 
 static fmgt_cb_t new_file_fmgt_cb = {
-	.progress = new_file_progress
+	.abort_query = new_file_abort_query,
+	.progress = new_file_progress,
 };
 
@@ -124,6 +126,8 @@
 	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";
@@ -192,4 +196,7 @@
 	}
 
+	progress_dlg_set_cb(nav->progress_dlg, &navigator_progress_cb,
+	    (void *)nav);
+
 	rc = navigator_worker_start(nav, new_file_wfunc, (void *)job);
 	if (rc != EOK) {
@@ -231,4 +238,16 @@
 }
 
+/** New file abort query.
+ *
+ * @param arg Argument (navigator_t *)
+ * @return @c true iff abort is requested
+ */
+static bool new_file_abort_query(void *arg)
+{
+	navigator_t *nav = (navigator_t *)arg;
+
+	return nav->abort_op;
+}
+
 /** New file progress update.
  *
Index: uspace/app/nav/types/nav.h
===================================================================
--- uspace/app/nav/types/nav.h	(revision 0cf3d5fd80c26cfc1eb8307bffabaf2efbd10f3a)
+++ uspace/app/nav/types/nav.h	(revision c3db721a084b301093cb54eaccbc8d58ec6ff845)
@@ -38,4 +38,5 @@
 
 #include <fibril.h>
+#include <stdbool.h>
 #include <ui/fixed.h>
 #include <ui/ui.h>
@@ -62,4 +63,6 @@
 	/** Worker fibril ID */
 	fid_t worker_fid;
+	/** Abort current file management operation */
+	bool abort_op;
 } navigator_t;
 
Index: uspace/app/newfile/meson.build
===================================================================
--- uspace/app/newfile/meson.build	(revision 0cf3d5fd80c26cfc1eb8307bffabaf2efbd10f3a)
+++ uspace/app/newfile/meson.build	(revision c3db721a084b301093cb54eaccbc8d58ec6ff845)
@@ -27,4 +27,4 @@
 #
 
-deps = [ 'fmgt' ]
+deps = [ 'console', 'fmgt', 'input' ]
 src = files('newfile.c')
Index: uspace/app/newfile/newfile.c
===================================================================
--- uspace/app/newfile/newfile.c	(revision 0cf3d5fd80c26cfc1eb8307bffabaf2efbd10f3a)
+++ uspace/app/newfile/newfile.c	(revision c3db721a084b301093cb54eaccbc8d58ec6ff845)
@@ -36,4 +36,7 @@
 #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>
@@ -44,4 +47,5 @@
 #define NAME  "newfile"
 
+static bool newfile_abort_query(void *);
 static void newfile_progress(void *, fmgt_progress_t *);
 
@@ -49,5 +53,8 @@
 static bool quiet = false;
 
+static console_ctrl_t *con;
+
 static fmgt_cb_t newfile_fmgt_cb = {
+	.abort_query = newfile_abort_query,
 	.progress = newfile_progress
 };
@@ -62,4 +69,37 @@
 	printf("\t-q           quiet\n");
 	printf("\t-size=<cap>  file size (<number>[<kB>|<MB>|...])\n");
+}
+
+/** Called by fmgt to query for user abort.
+ *
+ * @param arg Argument (not used)
+ * @return @c true iff user requested abort
+ */
+static bool newfile_abort_query(void *arg)
+{
+	cons_event_t event;
+	kbd_event_t *ev;
+	errno_t rc;
+	usec_t timeout;
+
+	if (con == NULL)
+		return false;
+
+	timeout = 0;
+	rc = console_get_event_timeout(con, &event, &timeout);
+	if (rc != EOK)
+		return false;
+
+	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 true;
+		}
+	}
+
+	return false;
 }
 
@@ -93,4 +133,6 @@
 	uint64_t nbytes = 0;
 
+	con = console_init(stdin, stdout);
+
 	i = 1;
 	while (i < argc && argv[i][0] == '-') {
@@ -167,11 +209,10 @@
 
 	rc = fmgt_new_file(fmgt, fname, nbytes, sparse ? nf_sparse : nf_none);
+	if (prog_upd)
+		printf("\n");
 	if (rc != EOK) {
 		printf("Error creating file: %s.\n", str_error(rc));
 		goto error;
 	}
-
-	if (prog_upd)
-		printf("\n");
 
 	free(fname);
Index: uspace/lib/fmgt/include/types/fmgt.h
===================================================================
--- uspace/lib/fmgt/include/types/fmgt.h	(revision 0cf3d5fd80c26cfc1eb8307bffabaf2efbd10f3a)
+++ uspace/lib/fmgt/include/types/fmgt.h	(revision c3db721a084b301093cb54eaccbc8d58ec6ff845)
@@ -40,4 +40,5 @@
 #include <capa.h>
 #include <fibril_synch.h>
+#include <stdbool.h>
 
 /** File management progress update */
@@ -53,4 +54,5 @@
 /** File management callbacks */
 typedef struct {
+	bool (*abort_query)(void *);
 	void (*progress)(void *, fmgt_progress_t *);
 } fmgt_cb_t;
Index: uspace/lib/fmgt/src/fmgt.c
===================================================================
--- uspace/lib/fmgt/src/fmgt.c	(revision 0cf3d5fd80c26cfc1eb8307bffabaf2efbd10f3a)
+++ uspace/lib/fmgt/src/fmgt.c	(revision c3db721a084b301093cb54eaccbc8d58ec6ff845)
@@ -221,4 +221,17 @@
 }
 
+/** Query caller whether operation should be aborted.
+ *
+ * @param fmgt File management object
+ * @return @c true iff operation should be aborted
+ */
+static bool fmgt_abort_query(fmgt_t *fmgt)
+{
+	if (fmgt->cb != NULL && fmgt->cb->abort_query!= NULL)
+		return fmgt->cb->abort_query(fmgt->cb_arg);
+	else
+		return false;
+}
+
 /** Create new file.
  *
@@ -276,4 +289,12 @@
 
 		fmgt->curf_procb += nw;
+
+		/* User requested abort? */
+		if (fmgt_abort_query(fmgt)) {
+			free(buffer);
+			vfs_put(fd);
+			fmgt_final_progress_update(fmgt);
+			return EINTR;
+		}
 	}
 
