Index: uspace/app/init/init.c
===================================================================
--- uspace/app/init/init.c	(revision 994f87b7d74776a11ddfaafeca925c3a1454877b)
+++ uspace/app/init/init.c	(revision ddfe233f65f4a86f6e6b48ef5065323f0f82c1d2)
@@ -1,3 +1,4 @@
 /*
+ * Copyright (c) 2024 Jiri Svoboda
  * Copyright (c) 2005 Martin Decky
  * All rights reserved.
@@ -35,4 +36,5 @@
 
 #include <fibril.h>
+#include <futil.h>
 #include <stdio.h>
 #include <stdarg.h>
@@ -351,5 +353,9 @@
 	vol_info_t vinfo;
 	volume_id_t *volume_ids = NULL;
+	service_id_t *part_ids = NULL;
+	vol_part_info_t pinfo;
 	size_t nvols;
+	size_t nparts;
+	bool sv_mounted;
 	size_t i;
 	errno_t rc;
@@ -385,6 +391,6 @@
 	}
 
-	vol_destroy(vol);
 	free(volume_ids);
+	volume_ids = NULL;
 
 	if (!found_cfg) {
@@ -397,13 +403,54 @@
 				printf("%s: Error creating directory '%s'.\n",
 				    NAME, *cp);
-				return rc;
+				goto error;
 			}
 
 			++cp;
 		}
+
+		/* Copy initial configuration files */
+		rc = futil_rcopy_contents("/cfg", "/w/cfg");
+		if (rc != EOK)
+			goto error;
 	} else {
 		printf("%s: System volume is configured.\n", NAME);
-	}
-
+
+		/* Wait until system volume is mounted */
+		sv_mounted = false;
+
+		while (true) {
+			rc = vol_get_parts(vol, &part_ids, &nparts);
+			if (rc != EOK) {
+				printf("Error getting list of volumes.\n");
+				goto error;
+			}
+
+			for (i = 0; i < nparts; i++) {
+				rc = vol_part_info(vol, part_ids[i], &pinfo);
+				if (rc != EOK) {
+					printf("Error getting partition "
+					    "information.\n");
+					rc = EIO;
+					goto error;
+				}
+
+				if (str_cmp(pinfo.cur_mp, "/w") == 0) {
+					sv_mounted = true;
+					break;
+				}
+			}
+
+			if (sv_mounted)
+				break;
+
+			free(part_ids);
+			part_ids = NULL;
+
+			fibril_sleep(1);
+			printf("Sleeping(1) for system volume.\n");
+		}
+	}
+
+	vol_destroy(vol);
 	return EOK;
 error:
@@ -411,4 +458,6 @@
 	if (volume_ids != NULL)
 		free(volume_ids);
+	if (part_ids != NULL)
+		free(part_ids);
 
 	return rc;
Index: uspace/app/init/meson.build
===================================================================
--- uspace/app/init/meson.build	(revision 994f87b7d74776a11ddfaafeca925c3a1454877b)
+++ uspace/app/init/meson.build	(revision ddfe233f65f4a86f6e6b48ef5065323f0f82c1d2)
@@ -28,5 +28,5 @@
 #
 
-deps = [ 'untar', 'block' ]
+deps = [ 'block', 'futil', 'untar' ]
 link_args += '-static'
 src = files('init.c', 'untar.c')
Index: uspace/app/sysinst/futil.c
===================================================================
--- uspace/app/sysinst/futil.c	(revision 994f87b7d74776a11ddfaafeca925c3a1454877b)
+++ 	(revision )
@@ -1,201 +1,0 @@
-/*
- * Copyright (c) 2014 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 sysinst
- * @{
- */
-/** @file File manipulation utility functions for installer
- */
-
-#include <dirent.h>
-#include <errno.h>
-#include <stdbool.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <stddef.h>
-#include <vfs/vfs.h>
-#include <dirent.h>
-
-#include "futil.h"
-
-#define BUF_SIZE 16384
-static char buf[BUF_SIZE];
-
-/** Copy file.
- *
- * @param srcp Source path
- * @param dstp Destination path
- *
- * @return EOK on success, EIO on I/O error
- */
-errno_t futil_copy_file(const char *srcp, const char *destp)
-{
-	int sf, df;
-	size_t nr, nw;
-	errno_t rc;
-	aoff64_t posr = 0, posw = 0;
-
-	printf("Copy '%s' to '%s'.\n", srcp, destp);
-
-	rc = vfs_lookup_open(srcp, WALK_REGULAR, MODE_READ, &sf);
-	if (rc != EOK)
-		return EIO;
-
-	rc = vfs_lookup_open(destp, WALK_REGULAR | WALK_MAY_CREATE, MODE_WRITE, &df);
-	if (rc != EOK)
-		return EIO;
-
-	do {
-		rc = vfs_read(sf, &posr, buf, BUF_SIZE, &nr);
-		if (rc != EOK)
-			goto error;
-		if (nr == 0)
-			break;
-
-		rc = vfs_write(df, &posw, buf, nr, &nw);
-		if (rc != EOK)
-			goto error;
-
-	} while (nr == BUF_SIZE);
-
-	(void) vfs_put(sf);
-
-	rc = vfs_put(df);
-	if (rc != EOK)
-		return EIO;
-
-	return EOK;
-error:
-	vfs_put(sf);
-	vfs_put(df);
-	return rc;
-}
-
-/** Copy contents of srcdir (recursively) into destdir.
- *
- * @param srcdir Source directory
- * @param destdir Destination directory
- *
- * @return EOK on success, ENOMEM if out of memory, EIO on I/O error
- */
-errno_t futil_rcopy_contents(const char *srcdir, const char *destdir)
-{
-	DIR *dir;
-	struct dirent *de;
-	vfs_stat_t s;
-	char *srcp, *destp;
-	errno_t rc;
-
-	dir = opendir(srcdir);
-	if (dir == NULL)
-		return EIO;
-
-	de = readdir(dir);
-	while (de != NULL) {
-		if (asprintf(&srcp, "%s/%s", srcdir, de->d_name) < 0)
-			return ENOMEM;
-		if (asprintf(&destp, "%s/%s", destdir, de->d_name) < 0)
-			return ENOMEM;
-
-		rc = vfs_stat_path(srcp, &s);
-		if (rc != EOK)
-			return EIO;
-
-		if (s.is_file) {
-			rc = futil_copy_file(srcp, destp);
-			if (rc != EOK)
-				return EIO;
-		} else if (s.is_directory) {
-			printf("Create directory '%s'\n", destp);
-			rc = vfs_link_path(destp, KIND_DIRECTORY, NULL);
-			if (rc != EOK)
-				return EIO;
-			rc = futil_rcopy_contents(srcp, destp);
-			if (rc != EOK)
-				return EIO;
-		} else {
-			return EIO;
-		}
-
-		de = readdir(dir);
-	}
-
-	return EOK;
-}
-
-/** 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
- */
-errno_t futil_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;
-}
-
-/** @}
- */
Index: uspace/app/sysinst/futil.h
===================================================================
--- uspace/app/sysinst/futil.h	(revision 994f87b7d74776a11ddfaafeca925c3a1454877b)
+++ 	(revision )
@@ -1,50 +1,0 @@
-/*
- * Copyright (c) 2014 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 sysinst
- * @{
- */
-/**
- * @file
- * @brief
- */
-
-#ifndef FUTIL_H
-#define FUTIL_H
-
-#include <ipc/loc.h>
-#include <stddef.h>
-
-extern errno_t futil_copy_file(const char *, const char *);
-extern errno_t futil_rcopy_contents(const char *, const char *);
-extern errno_t futil_get_file(const char *, void **, size_t *);
-
-#endif
-
-/** @}
- */
Index: uspace/app/sysinst/meson.build
===================================================================
--- uspace/app/sysinst/meson.build	(revision 994f87b7d74776a11ddfaafeca925c3a1454877b)
+++ uspace/app/sysinst/meson.build	(revision ddfe233f65f4a86f6e6b48ef5065323f0f82c1d2)
@@ -27,7 +27,6 @@
 #
 
-deps = [ 'block', 'fdisk', 'sif' ]
+deps = [ 'block', 'fdisk', 'futil', 'sif' ]
 src = files(
-	'futil.c',
 	'rdimg.c',
 	'sysinst.c',
Index: uspace/app/sysinst/sysinst.c
===================================================================
--- uspace/app/sysinst/sysinst.c	(revision 994f87b7d74776a11ddfaafeca925c3a1454877b)
+++ uspace/app/sysinst/sysinst.c	(revision ddfe233f65f4a86f6e6b48ef5065323f0f82c1d2)
@@ -41,4 +41,5 @@
 #include <errno.h>
 #include <fdisk.h>
+#include <futil.h>
 #include <loc.h>
 #include <stdio.h>
@@ -49,5 +50,4 @@
 #include <vol.h>
 
-#include "futil.h"
 #include "grub.h"
 #include "rdimg.h"
@@ -80,4 +80,7 @@
 #define BOOT_BLOCK_IDX 0 /* MBR */
 
+#define CFG_FILES_SRC "/cfg"
+#define CFG_FILES_DEST MOUNT_POINT "/cfg"
+
 static const char *default_devs[] = {
 	DEFAULT_DEV_0,
@@ -226,4 +229,9 @@
 	free(path);
 	path = NULL;
+
+	/* Copy initial configuration files */
+	rc = futil_rcopy_contents(CFG_FILES_SRC, CFG_FILES_DEST);
+	if (rc != EOK)
+		return rc;
 
 	return EOK;
Index: uspace/app/taskbar-cfg/main.c
===================================================================
--- uspace/app/taskbar-cfg/main.c	(revision 994f87b7d74776a11ddfaafeca925c3a1454877b)
+++ uspace/app/taskbar-cfg/main.c	(revision ddfe233f65f4a86f6e6b48ef5065323f0f82c1d2)
@@ -1,4 +1,4 @@
 /*
- * Copyright (c) 2023 Jiri Svoboda
+ * Copyright (c) 2024 Jiri Svoboda
  * All rights reserved.
  *
@@ -77,5 +77,5 @@
 		return 1;
 
-	rc = taskbar_cfg_open(tbcfg, "/cfg/taskbar.sif");
+	rc = taskbar_cfg_open(tbcfg, "/w/cfg/taskbar.sif");
 	if (rc != EOK)
 		return 1;
Index: uspace/app/taskbar/taskbar.c
===================================================================
--- uspace/app/taskbar/taskbar.c	(revision 994f87b7d74776a11ddfaafeca925c3a1454877b)
+++ uspace/app/taskbar/taskbar.c	(revision ddfe233f65f4a86f6e6b48ef5065323f0f82c1d2)
@@ -48,5 +48,5 @@
 #include "wndlist.h"
 
-#define TASKBAR_CONFIG_FILE "/cfg/taskbar.sif"
+#define TASKBAR_CONFIG_FILE "/w/cfg/taskbar.sif"
 
 static void taskbar_wnd_close(ui_window_t *, void *);
