Index: uspace/app/init/Makefile
===================================================================
--- uspace/app/init/Makefile	(revision 18ad56a8d754496a89691cf6df847dafd4b8f875)
+++ uspace/app/init/Makefile	(revision f47a905f54a600cbf89372fdb1682e03070399c3)
@@ -32,6 +32,9 @@
 STATIC_NEEDED = y
 
+LIBS = untar block
+
 SOURCES = \
-	init.c
+	init.c \
+	untar.c
 
 include $(USPACE_PREFIX)/Makefile.common
Index: uspace/app/init/init.c
===================================================================
--- uspace/app/init/init.c	(revision 18ad56a8d754496a89691cf6df847dafd4b8f875)
+++ uspace/app/init/init.c	(revision f47a905f54a600cbf89372fdb1682e03070399c3)
@@ -48,4 +48,5 @@
 #include <config.h>
 #include <io/logctl.h>
+#include "untar.h"
 #include "init.h"
 
@@ -83,5 +84,5 @@
 	switch (rc) {
 	case EOK:
-		if (dev != NULL)
+		if ((dev != NULL) && (str_cmp(dev, "") != 0))
 			printf("%s: %s mounted on %s (%s at %s)\n", NAME, desc, mntpt,
 			    fstype, dev);
@@ -107,10 +108,10 @@
 }
 
-/** Mount root filesystem
- *
- * The operation blocks until the root filesystem
+/** Mount root file system
+ *
+ * The operation blocks until the root file system
  * server is ready for mounting.
  *
- * @param[in] fstype Root filesystem type.
+ * @param[in] fstype Root file system type.
  *
  * @return True on success.
@@ -120,20 +121,35 @@
 static bool mount_root(const char *fstype)
 {
-	const char *opts = "";
-
-	if (str_cmp(fstype, "tmpfs") == 0)
-		opts = "restore";
-
-	errno_t rc = vfs_mount_path(ROOT_MOUNT_POINT, fstype, ROOT_DEVICE, opts,
+	const char *root_device = "";
+
+	if (str_cmp(fstype, "tmpfs") != 0)
+		root_device = ROOT_DEVICE;
+
+	errno_t rc = vfs_mount_path(ROOT_MOUNT_POINT, fstype, root_device, "",
 	    IPC_FLAG_BLOCKING, 0);
 	if (rc == EOK)
 		logctl_set_root();
-	return mount_report("Root filesystem", ROOT_MOUNT_POINT, fstype,
-	    ROOT_DEVICE, rc);
-}
-
-/** Mount locfs filesystem
- *
- * The operation blocks until the locfs filesystem
+
+	bool ret = mount_report("Root file system", ROOT_MOUNT_POINT, fstype,
+	    root_device, rc);
+
+	rc = vfs_cwd_set(ROOT_MOUNT_POINT);
+	if (rc != EOK) {
+		printf("%s: Unable to set current directory to %s (%s)\n",
+		    NAME, ROOT_MOUNT_POINT, str_error(ret));
+		return false;
+	}
+
+	if ((ret) && (str_cmp(fstype, "tmpfs") == 0)) {
+		printf("%s: Extracting root file system archive\n", NAME);
+		ret = bd_untar(ROOT_DEVICE);
+	}
+
+	return ret;
+}
+
+/** Mount locfs file system
+ *
+ * The operation blocks until the locfs file system
  * server is ready for mounting.
  *
@@ -146,5 +162,5 @@
 	errno_t rc = vfs_mount_path(LOCFS_MOUNT_POINT, LOCFS_FS_TYPE, "", "",
 	    IPC_FLAG_BLOCKING, 0);
-	return mount_report("Location service filesystem", LOCFS_MOUNT_POINT,
+	return mount_report("Location service file system", LOCFS_MOUNT_POINT,
 	    LOCFS_FS_TYPE, NULL, rc);
 }
@@ -301,5 +317,5 @@
 {
 	errno_t rc = vfs_mount_path(TMPFS_MOUNT_POINT, TMPFS_FS_TYPE, "", "", 0, 0);
-	return mount_report("Temporary filesystem", TMPFS_MOUNT_POINT,
+	return mount_report("Temporary file system", TMPFS_MOUNT_POINT,
 	    TMPFS_FS_TYPE, NULL, rc);
 }
Index: uspace/app/init/untar.c
===================================================================
--- uspace/app/init/untar.c	(revision f47a905f54a600cbf89372fdb1682e03070399c3)
+++ uspace/app/init/untar.c	(revision f47a905f54a600cbf89372fdb1682e03070399c3)
@@ -0,0 +1,110 @@
+/*
+ * Copyright (c) 2018 Martin Decky
+ * 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 init
+ * @{
+ */
+/**
+ * @file
+ */
+
+#include <stdio.h>
+#include <stdbool.h>
+#include <errno.h>
+#include <loc.h>
+#include <untar.h>
+#include <block.h>
+#include "init.h"
+#include "untar.h"
+
+typedef struct {
+	const char *dev;
+	
+	service_id_t sid;
+	aoff64_t offset;
+} tar_state_t;
+
+static int bd_tar_open(tar_file_t *tar)
+{
+	tar_state_t *state = (tar_state_t *) tar->data;
+
+	errno_t ret = loc_service_get_id(state->dev, &state->sid,
+	    IPC_FLAG_BLOCKING);
+	if (ret != EOK)
+		return ret;
+
+	ret = block_init(state->sid, 4096);
+	if (ret != EOK)
+		return ret;
+
+	state->offset = 0;
+	return EOK;
+}
+
+static void bd_tar_close(tar_file_t *tar)
+{
+	tar_state_t *state = (tar_state_t *) tar->data;
+	block_fini(state->sid);
+}
+
+static size_t bd_tar_read(tar_file_t *tar, void *data, size_t size)
+{
+	tar_state_t *state = (tar_state_t *) tar->data;
+
+	if (block_read_bytes_direct(state->sid, state->offset, size,
+	    data) != EOK)
+		return 0;
+
+	state->offset += size;
+	return size;
+}
+
+static void bd_tar_vreport(tar_file_t *tar, const char *fmt, va_list args)
+{
+	vprintf(fmt, args);
+}
+
+tar_file_t tar = {
+	.open = bd_tar_open,
+	.close = bd_tar_close,
+
+	.read = bd_tar_read,
+	.vreport = bd_tar_vreport
+};
+
+bool bd_untar(const char *dev)
+{
+	tar_state_t state;
+	state.dev = dev;
+
+	tar.data = (void *) &state;
+	return (untar(&tar) == EOK);
+}
+
+/** @}
+ */
Index: uspace/app/init/untar.h
===================================================================
--- uspace/app/init/untar.h	(revision f47a905f54a600cbf89372fdb1682e03070399c3)
+++ uspace/app/init/untar.h	(revision f47a905f54a600cbf89372fdb1682e03070399c3)
@@ -0,0 +1,46 @@
+/*
+ * Copyright (c) 2018 Martin Decky
+ * 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 init
+ * @{
+ */
+/**
+ * @file
+ */
+
+#ifndef __UNTAR_H__
+#define __UNTAR_H__
+
+#include <stdbool.h>
+
+extern bool bd_untar(const char *);
+
+#endif
+
+/** @}
+ */
