Index: uspace/app/nav/dlg/newfiledlg.c
===================================================================
--- uspace/app/nav/dlg/newfiledlg.c	(revision cfd04c4747e6065a3d8116877b13a2bc1307950f)
+++ uspace/app/nav/dlg/newfiledlg.c	(revision 0cf3d5fd80c26cfc1eb8307bffabaf2efbd10f3a)
@@ -37,4 +37,5 @@
 #include <fmgt.h>
 #include <mem.h>
+#include <stdbool.h>
 #include <stdlib.h>
 #include <ui/entry.h>
@@ -81,4 +82,5 @@
 	ui_label_t *label = NULL;
 	ui_entry_t *entry = NULL;
+	ui_checkbox_t *checkbox = NULL;
 	ui_pbutton_t *bok = NULL;
 	ui_pbutton_t *bcancel = NULL;
@@ -101,10 +103,10 @@
 		wparams.rect.p0.y = 0;
 		wparams.rect.p1.x = 40;
-		wparams.rect.p1.y = 11;
+		wparams.rect.p1.y = 13;
 	} else {
 		wparams.rect.p0.x = 0;
 		wparams.rect.p0.y = 0;
 		wparams.rect.p1.x = 300;
-		wparams.rect.p1.y = 135;
+		wparams.rect.p1.y = 155;
 	}
 
@@ -234,4 +236,30 @@
 	entry = NULL;
 
+	rc = ui_checkbox_create(ui_res, "Sparse", &checkbox);
+	if (rc != EOK)
+		goto error;
+
+	/* FIXME: Auto layout */
+	if (ui_is_textmode(ui)) {
+		rect.p0.x = 3;
+		rect.p0.y = 8;
+		rect.p1.x = 17;
+		rect.p1.y = 9;
+	} else {
+		rect.p0.x = 10;
+		rect.p0.y = 100;
+		rect.p1.x = 190;
+		rect.p1.y = 120;
+	}
+
+	ui_checkbox_set_rect(checkbox, &rect);
+
+	rc = ui_fixed_add(fixed, ui_checkbox_ctl(checkbox));
+	if (rc != EOK)
+		goto error;
+
+	dialog->sparse = checkbox;
+	checkbox = NULL;
+
 	rc = ui_pbutton_create(ui_res, "OK", &bok);
 	if (rc != EOK)
@@ -243,12 +271,12 @@
 	if (ui_is_textmode(ui)) {
 		rect.p0.x = 10;
-		rect.p0.y = 8;
+		rect.p0.y = 10;
 		rect.p1.x = 20;
-		rect.p1.y = 9;
+		rect.p1.y = 11;
 	} else {
 		rect.p0.x = 55;
-		rect.p0.y = 90;
+		rect.p0.y = 120;
 		rect.p1.x = 145;
-		rect.p1.y = 118;
+		rect.p1.y = 148;
 	}
 
@@ -273,12 +301,12 @@
 	if (ui_is_textmode(ui)) {
 		rect.p0.x = 22;
-		rect.p0.y = 8;
+		rect.p0.y = 10;
 		rect.p1.x = 32;
-		rect.p1.y = 9;
+		rect.p1.y = 11;
 	} else {
 		rect.p0.x = 155;
-		rect.p0.y = 90;
+		rect.p0.y = 120;
 		rect.p1.x = 245;
-		rect.p1.y = 118;
+		rect.p1.y = 148;
 	}
 
@@ -307,4 +335,6 @@
 	if (entry != NULL)
 		ui_entry_destroy(entry);
+	if (checkbox != NULL)
+		ui_checkbox_destroy(checkbox);
 	if (bok != NULL)
 		ui_pbutton_destroy(bok);
@@ -375,4 +405,5 @@
 	const char *fname;
 	const char *fsize;
+	bool sparse;
 
 	if (event->type == KEY_PRESS &&
@@ -383,6 +414,8 @@
 				fname = ui_entry_get_text(dialog->ename);
 				fsize = ui_entry_get_text(dialog->esize);
+				sparse =
+				    ui_checkbox_get_checked(dialog->sparse);
 				dialog->cb->bok(dialog, dialog->arg, fname,
-				    fsize);
+				    fsize, sparse);
 				return;
 			}
@@ -409,9 +442,11 @@
 	const char *fname;
 	const char *fsize;
+	bool sparse;
 
 	if (dialog->cb != NULL && dialog->cb->bok != NULL) {
 		fname = ui_entry_get_text(dialog->ename);
 		fsize = ui_entry_get_text(dialog->esize);
-		dialog->cb->bok(dialog, dialog->arg, fname, fsize);
+		sparse = ui_checkbox_get_checked(dialog->sparse);
+		dialog->cb->bok(dialog, dialog->arg, fname, fsize, sparse);
 	}
 }
Index: uspace/app/nav/newfile.c
===================================================================
--- uspace/app/nav/newfile.c	(revision cfd04c4747e6065a3d8116877b13a2bc1307950f)
+++ uspace/app/nav/newfile.c	(revision 0cf3d5fd80c26cfc1eb8307bffabaf2efbd10f3a)
@@ -44,4 +44,5 @@
 #include <ui/ui.h>
 #include <ui/window.h>
+#include <stdbool.h>
 #include <str.h>
 #include "dlg/newfiledlg.h"
@@ -52,5 +53,6 @@
 #include "types/newfile.h"
 
-static void new_file_bok(new_file_dlg_t *, void *, const char *, const char *);
+static void new_file_bok(new_file_dlg_t *, void *, const char *, const char *,
+    bool);
 static void new_file_bcancel(new_file_dlg_t *, void *);
 static void new_file_close(new_file_dlg_t *, void *);
@@ -104,5 +106,6 @@
 	fmgt_set_init_update(fmgt, true);
 
-	rc = fmgt_new_file(fmgt, job->fname, job->nbytes);
+	rc = fmgt_new_file(fmgt, job->fname, job->nbytes,
+	    job->sparse ? nf_sparse : nf_none);
 	if (rc != EOK) {
 		rv = asprintf(&msg, "Error creating file (%s).",
@@ -137,7 +140,8 @@
  * @param fname New file name
  * @param fsize New file size
+ * @param sparse @c true to create a sparse file
  */
 static void new_file_bok(new_file_dlg_t *dlg, void *arg, const char *fname,
-    const char *fsize)
+    const char *fsize, bool sparse)
 {
 	navigator_t *nav = (navigator_t *)arg;
@@ -175,4 +179,5 @@
 	job->fname = fname;
 	job->nbytes = nbytes;
+	job->sparse = sparse;
 
 	progress_dlg_params_init(&pd_params);
Index: uspace/app/nav/types/dlg/newfiledlg.h
===================================================================
--- uspace/app/nav/types/dlg/newfiledlg.h	(revision cfd04c4747e6065a3d8116877b13a2bc1307950f)
+++ uspace/app/nav/types/dlg/newfiledlg.h	(revision 0cf3d5fd80c26cfc1eb8307bffabaf2efbd10f3a)
@@ -38,7 +38,9 @@
 
 #include <errno.h>
+#include <ui/checkbox.h>
 #include <ui/entry.h>
 #include <ui/pbutton.h>
 #include <ui/window.h>
+#include <stdbool.h>
 
 /** New File dialog */
@@ -50,4 +52,6 @@
 	/** File size text entry */
 	ui_entry_t *esize;
+	/** Sparse checkbox */
+	ui_checkbox_t *sparse;
 	/** OK button */
 	ui_pbutton_t *bok;
@@ -63,5 +67,5 @@
 typedef struct new_file_dlg_cb {
 	/** OK button was pressed */
-	void (*bok)(new_file_dlg_t *, void *, const char *, const char *);
+	void (*bok)(new_file_dlg_t *, void *, const char *, const char *, bool);
 	/** Cancel button was pressed */
 	void (*bcancel)(new_file_dlg_t *, void *);
Index: uspace/app/nav/types/newfile.h
===================================================================
--- uspace/app/nav/types/newfile.h	(revision cfd04c4747e6065a3d8116877b13a2bc1307950f)
+++ uspace/app/nav/types/newfile.h	(revision 0cf3d5fd80c26cfc1eb8307bffabaf2efbd10f3a)
@@ -37,4 +37,5 @@
 #define TYPES_NEWFILE_H
 
+#include <stdbool.h>
 #include <stdint.h>
 
@@ -47,4 +48,6 @@
 	/** New file size */
 	uint64_t nbytes;
+	/** @c true to create a sparse file */
+	bool sparse;
 } navigator_new_file_job_t;
 
Index: uspace/app/newfile/newfile.c
===================================================================
--- uspace/app/newfile/newfile.c	(revision cfd04c4747e6065a3d8116877b13a2bc1307950f)
+++ uspace/app/newfile/newfile.c	(revision 0cf3d5fd80c26cfc1eb8307bffabaf2efbd10f3a)
@@ -166,5 +166,5 @@
 	fmgt_set_cb(fmgt, &newfile_fmgt_cb, NULL);
 
-	rc = fmgt_new_file(fmgt, fname, nbytes);
+	rc = fmgt_new_file(fmgt, fname, nbytes, sparse ? nf_sparse : nf_none);
 	if (rc != EOK) {
 		printf("Error creating file: %s.\n", str_error(rc));
Index: uspace/lib/fmgt/include/fmgt.h
===================================================================
--- uspace/lib/fmgt/include/fmgt.h	(revision cfd04c4747e6065a3d8116877b13a2bc1307950f)
+++ uspace/lib/fmgt/include/fmgt.h	(revision 0cf3d5fd80c26cfc1eb8307bffabaf2efbd10f3a)
@@ -49,5 +49,5 @@
 extern void fmgt_set_init_update(fmgt_t *, bool);
 extern errno_t fmgt_new_file_suggest(char **);
-extern errno_t fmgt_new_file(fmgt_t *, const char *, uint64_t);
+extern errno_t fmgt_new_file(fmgt_t *, const char *, uint64_t, fmgt_nf_flags_t);
 
 #endif
Index: uspace/lib/fmgt/include/types/fmgt.h
===================================================================
--- uspace/lib/fmgt/include/types/fmgt.h	(revision cfd04c4747e6065a3d8116877b13a2bc1307950f)
+++ uspace/lib/fmgt/include/types/fmgt.h	(revision 0cf3d5fd80c26cfc1eb8307bffabaf2efbd10f3a)
@@ -75,4 +75,10 @@
 } fmgt_t;
 
+/** New file flags. */
+typedef enum {
+	nf_none = 0x0,
+	nf_sparse = 0x1
+} fmgt_nf_flags_t;
+
 #endif
 
Index: uspace/lib/fmgt/src/fmgt.c
===================================================================
--- uspace/lib/fmgt/src/fmgt.c	(revision cfd04c4747e6065a3d8116877b13a2bc1307950f)
+++ uspace/lib/fmgt/src/fmgt.c	(revision 0cf3d5fd80c26cfc1eb8307bffabaf2efbd10f3a)
@@ -226,7 +226,9 @@
  * @param fname File name
  * @param fsize Size of new file (number of zero bytes to fill in)
+ * @param flags New file flags
  * @return EOK on success or an error code
  */
-errno_t fmgt_new_file(fmgt_t *fmgt, const char *fname, uint64_t fsize)
+errno_t fmgt_new_file(fmgt_t *fmgt, const char *fname, uint64_t fsize,
+    fmgt_nf_flags_t flags)
 {
 	int fd;
@@ -254,4 +256,9 @@
 
 	fmgt_initial_progress_update(fmgt);
+
+	if ((flags & nf_sparse) != 0) {
+		fmgt->curf_procb = fsize - 1;
+		pos = fsize - 1;
+	}
 
 	while (fmgt->curf_procb < fsize) {
Index: uspace/lib/fmgt/test/fmgt.c
===================================================================
--- uspace/lib/fmgt/test/fmgt.c	(revision cfd04c4747e6065a3d8116877b13a2bc1307950f)
+++ uspace/lib/fmgt/test/fmgt.c	(revision 0cf3d5fd80c26cfc1eb8307bffabaf2efbd10f3a)
@@ -116,5 +116,5 @@
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
-	rc = fmgt_new_file(fmgt, fname, 0);
+	rc = fmgt_new_file(fmgt, fname, 0, nf_none);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
@@ -150,5 +150,5 @@
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
-	rc = fmgt_new_file(fmgt, fname, 20000);
+	rc = fmgt_new_file(fmgt, fname, 20000, nf_none);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
@@ -177,6 +177,6 @@
 }
 
-/** Initial update provided when requested while creating new file. */
-PCUT_TEST(new_file_init_upd)
+/** New sparse file can be created. */
+PCUT_TEST(new_file_sparse)
 {
 	FILE *f = NULL;
@@ -188,23 +188,17 @@
 	size_t total_rd;
 	size_t i;
-	test_resp_t resp;
-	int rv;
-
-	rc = vfs_cwd_set(TEMP_DIR);
-	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
-
-	rc = fmgt_create(&fmgt);
-	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
-
-	fmgt_set_cb(fmgt, &test_fmgt_cb, (void *)&resp);
-	resp.nupdates = 0;
-
-	fmgt_set_init_update(fmgt, true);
-
-	/* Suggest unique file name. */
-	rc = fmgt_new_file_suggest(&fname);
-	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
-
-	rc = fmgt_new_file(fmgt, fname, 20000);
+	int rv;
+
+	rc = vfs_cwd_set(TEMP_DIR);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	rc = fmgt_create(&fmgt);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	/* Suggest unique file name. */
+	rc = fmgt_new_file_suggest(&fname);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	rc = fmgt_new_file(fmgt, fname, 20000, nf_sparse);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
@@ -225,4 +219,60 @@
 	(void)fclose(f);
 
+	/* Remove the file. */
+	rv = remove(fname);
+	PCUT_ASSERT_INT_EQUALS(0, rv);
+
+	free(fname);
+	fmgt_destroy(fmgt);
+}
+
+/** Initial update provided when requested while creating new file. */
+PCUT_TEST(new_file_init_upd)
+{
+	FILE *f = NULL;
+	fmgt_t *fmgt = NULL;
+	char *fname = NULL;
+	char buf[128];
+	errno_t rc;
+	size_t nr;
+	size_t total_rd;
+	size_t i;
+	test_resp_t resp;
+	int rv;
+
+	rc = vfs_cwd_set(TEMP_DIR);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	rc = fmgt_create(&fmgt);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	fmgt_set_cb(fmgt, &test_fmgt_cb, (void *)&resp);
+	resp.nupdates = 0;
+
+	fmgt_set_init_update(fmgt, true);
+
+	/* Suggest unique file name. */
+	rc = fmgt_new_file_suggest(&fname);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	rc = fmgt_new_file(fmgt, fname, 20000, nf_none);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	/* Verify the file. */
+	f = fopen(fname, "rb");
+	PCUT_ASSERT_NOT_NULL(f);
+	total_rd = 0;
+	do {
+		nr = fread(buf, 1, sizeof(buf), f);
+		for (i = 0; i < nr; i++)
+			PCUT_ASSERT_INT_EQUALS(0, buf[i]);
+
+		total_rd += nr;
+	} while (nr > 0);
+
+	PCUT_ASSERT_INT_EQUALS(20000, total_rd);
+
+	(void)fclose(f);
+
 	PCUT_ASSERT_TRUE(resp.nupdates > 0);
 
