Index: uspace/app/init/init.c
===================================================================
--- uspace/app/init/init.c	(revision 7ae01d57bf50357b7c31840df0b162f62f199375)
+++ 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 7ae01d57bf50357b7c31840df0b162f62f199375)
+++ 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')
