Index: uspace/srv/volsrv/Makefile
===================================================================
--- uspace/srv/volsrv/Makefile	(revision ea0ff6b69b253afa7b6b4e9cd38ef8e91ec0daab)
+++ uspace/srv/volsrv/Makefile	(revision b598460af2662df4c20ccda2b3de00d8057bcacd)
@@ -36,4 +36,5 @@
 SOURCES = \
 	empty.c \
+	mkfs.c \
 	part.c \
 	volsrv.c
Index: uspace/srv/volsrv/empty.c
===================================================================
--- uspace/srv/volsrv/empty.c	(revision ea0ff6b69b253afa7b6b4e9cd38ef8e91ec0daab)
+++ uspace/srv/volsrv/empty.c	(revision b598460af2662df4c20ccda2b3de00d8057bcacd)
@@ -85,5 +85,5 @@
 }
 
-int vol_part_is_empty(service_id_t sid, bool *rempty)
+int volsrv_part_is_empty(service_id_t sid, bool *rempty)
 {
 	int rc;
@@ -176,5 +176,5 @@
 }
 
-int vol_part_empty(service_id_t sid)
+int volsrv_part_empty(service_id_t sid)
 {
 	int rc;
Index: uspace/srv/volsrv/empty.h
===================================================================
--- uspace/srv/volsrv/empty.h	(revision ea0ff6b69b253afa7b6b4e9cd38ef8e91ec0daab)
+++ uspace/srv/volsrv/empty.h	(revision b598460af2662df4c20ccda2b3de00d8057bcacd)
@@ -40,6 +40,6 @@
 #include <loc.h>
 
-extern int vol_part_is_empty(service_id_t, bool *);
-extern int vol_part_empty(service_id_t);
+extern int volsrv_part_is_empty(service_id_t, bool *);
+extern int volsrv_part_empty(service_id_t);
 
 #endif
Index: uspace/srv/volsrv/mkfs.c
===================================================================
--- uspace/srv/volsrv/mkfs.c	(revision b598460af2662df4c20ccda2b3de00d8057bcacd)
+++ uspace/srv/volsrv/mkfs.c	(revision b598460af2662df4c20ccda2b3de00d8057bcacd)
@@ -0,0 +1,152 @@
+/*
+ * Copyright (c) 2015 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 volsrv
+ * @{
+ */
+/**
+ * @file Filesystem creation
+ * @brief
+ */
+
+#include <errno.h>
+#include <io/log.h>
+#include <loc.h>
+#include <stdarg.h>
+#include <stdlib.h>
+#include <str_error.h>
+#include <task.h>
+#include <types/vol.h>
+
+#include "mkfs.h"
+
+static int cmd_runl(const char *path, ...)
+{
+	va_list ap;
+	const char *arg;
+	int cnt = 0;
+
+	va_start(ap, path);
+	do {
+		arg = va_arg(ap, const char *);
+		cnt++;
+	} while (arg != NULL);
+	va_end(ap);
+
+	log_msg(LOG_DEFAULT, LVL_NOTE, "Calling task_spawn()");
+
+	va_start(ap, path);
+	task_id_t id;
+	task_wait_t wait;
+	int rc = task_spawn(&id, &wait, path, cnt, ap);
+	va_end(ap);
+
+	log_msg(LOG_DEFAULT, LVL_NOTE, "task_spawn() -> rc = %d", rc);
+
+	if (rc != EOK) {
+		log_msg(LOG_DEFAULT, LVL_ERROR, "Error spawning %s (%s)",
+		    path, str_error(rc));
+		return rc;
+	}
+
+	log_msg(LOG_DEFAULT, LVL_NOTE, "task_spawn() -> id = %d", (int)id);
+
+	if (!id) {
+		log_msg(LOG_DEFAULT, LVL_ERROR, "Error spawning %s "
+		    "(invalid task ID)", path);
+		return EINVAL;
+	}
+
+	log_msg(LOG_DEFAULT, LVL_NOTE, "call task_wait()");
+
+	task_exit_t texit;
+	int retval;
+	rc = task_wait(&wait, &texit, &retval);
+	log_msg(LOG_DEFAULT, LVL_NOTE, "task_wait() -> rc = %d", rc);
+	if (rc != EOK) {
+		log_msg(LOG_DEFAULT, LVL_ERROR, "Error waiting for %s (%s)",
+		    path, str_error(rc));
+		return rc;
+	}
+
+	log_msg(LOG_DEFAULT, LVL_NOTE, "task_wait() -> texit = %d", (int)texit);
+	if (texit != TASK_EXIT_NORMAL) {
+		log_msg(LOG_DEFAULT, LVL_ERROR, "Command %s unexpectedly "
+		    "terminated", path);
+		return EINVAL;
+	}
+
+	log_msg(LOG_DEFAULT, LVL_NOTE, "task_wait() -> retval = %d", (int)retval);
+	if (retval != 0) {
+		log_msg(LOG_DEFAULT, LVL_ERROR, "Command %s returned non-zero "
+		    "exit code %d)", path, retval);
+	}
+
+	return retval;
+}
+
+
+int volsrv_part_mkfs(service_id_t sid, vol_fstype_t fstype)
+{
+	const char *cmd;
+	char *svc_name;
+	int rc;
+
+	cmd = NULL;
+	switch (fstype) {
+	case fs_exfat:
+		cmd = "/app/mkexfat";
+		break;
+	case fs_fat:
+		cmd = "/app/mkfat";
+		break;
+	case fs_minix:
+		cmd = "/app/mkmfs";
+		break;
+	case fs_ext4:
+		cmd = NULL;
+		break;
+	}
+
+	if (cmd == NULL)
+		return ENOTSUP;
+
+	rc = loc_service_get_name(sid, &svc_name);
+	if (rc != EOK)
+		return rc;
+
+	log_msg(LOG_DEFAULT, LVL_NOTE, "volsrv_part_mkfs: Run '%s %s'.",
+	    cmd, svc_name);
+
+	rc = cmd_runl(cmd, cmd, svc_name, NULL);
+	free(svc_name);
+	return rc;
+}
+
+/** @}
+ */
Index: uspace/srv/volsrv/mkfs.h
===================================================================
--- uspace/srv/volsrv/mkfs.h	(revision b598460af2662df4c20ccda2b3de00d8057bcacd)
+++ uspace/srv/volsrv/mkfs.h	(revision b598460af2662df4c20ccda2b3de00d8057bcacd)
@@ -0,0 +1,48 @@
+/*
+ * Copyright (c) 2015 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 volsrv
+ * @{
+ */
+/**
+ * @file
+ * @brief
+ */
+
+#ifndef MKFS_H_
+#define MKFS_H_
+
+#include <loc.h>
+#include <types/vol.h>
+
+extern int volsrv_part_mkfs(service_id_t, vol_fstype_t);
+
+#endif
+
+/** @}
+ */
Index: uspace/srv/volsrv/part.c
===================================================================
--- uspace/srv/volsrv/part.c	(revision ea0ff6b69b253afa7b6b4e9cd38ef8e91ec0daab)
+++ uspace/srv/volsrv/part.c	(revision b598460af2662df4c20ccda2b3de00d8057bcacd)
@@ -44,4 +44,5 @@
 
 #include "empty.h"
+#include "mkfs.h"
 #include "part.h"
 #include "types/part.h"
@@ -154,5 +155,5 @@
 
 	log_msg(LOG_DEFAULT, LVL_NOTE, "Probe partition %s", part->svc_name);
-	rc = vol_part_is_empty(sid, &empty);
+	rc = volsrv_part_is_empty(sid, &empty);
 	if (rc != EOK) {
 		log_msg(LOG_DEFAULT, LVL_ERROR, "Failed determining if "
@@ -256,5 +257,5 @@
 	log_msg(LOG_DEFAULT, LVL_NOTE, "vol_part_empty_part()");
 
-	rc = vol_part_empty(part->svc_id);
+	rc = volsrv_part_empty(part->svc_id);
 	if (rc != EOK) {
 		log_msg(LOG_DEFAULT, LVL_NOTE, "vol_part_empty_part() - failed %d",
@@ -268,4 +269,23 @@
 }
 
+int vol_part_mkfs_part(vol_part_t *part, vol_fstype_t fstype)
+{
+	int rc;
+
+	log_msg(LOG_DEFAULT, LVL_NOTE, "vol_part_mkfs_part()");
+
+	rc = volsrv_part_mkfs(part->svc_id, fstype);
+	if (rc != EOK) {
+		log_msg(LOG_DEFAULT, LVL_NOTE, "vol_part_mkfs_part() - failed %d",
+		    rc);
+		return rc;
+	}
+
+	log_msg(LOG_DEFAULT, LVL_NOTE, "vol_part_mkfs_part() - success");
+	part->pcnt = vpc_fs;
+	part->fstype = fstype;
+	return EOK;
+}
+
 int vol_part_get_info(vol_part_t *part, vol_part_info_t *pinfo)
 {
Index: uspace/srv/volsrv/part.h
===================================================================
--- uspace/srv/volsrv/part.h	(revision ea0ff6b69b253afa7b6b4e9cd38ef8e91ec0daab)
+++ uspace/srv/volsrv/part.h	(revision b598460af2662df4c20ccda2b3de00d8057bcacd)
@@ -49,4 +49,5 @@
 extern int vol_part_find_by_id(service_id_t, vol_part_t **);
 extern int vol_part_empty_part(vol_part_t *);
+extern int vol_part_mkfs_part(vol_part_t *, vol_fstype_t);
 extern int vol_part_get_info(vol_part_t *, vol_part_info_t *);
 
Index: uspace/srv/volsrv/volsrv.c
===================================================================
--- uspace/srv/volsrv/volsrv.c	(revision ea0ff6b69b253afa7b6b4e9cd38ef8e91ec0daab)
+++ uspace/srv/volsrv/volsrv.c	(revision b598460af2662df4c20ccda2b3de00d8057bcacd)
@@ -220,4 +220,36 @@
 }
 
+static void vol_part_mkfs_srv(ipc_callid_t iid, ipc_call_t *icall)
+{
+	service_id_t sid;
+	vol_part_t *part;
+	vol_fstype_t fstype;
+	int rc;
+
+	sid = IPC_GET_ARG1(*icall);
+	fstype = IPC_GET_ARG2(*icall);
+
+	log_msg(LOG_DEFAULT, LVL_NOTE, "vol_part_mkfs_srv(%zu, %d)", sid,
+	    fstype);
+
+	rc = vol_part_find_by_id(sid, &part);
+	if (rc != EOK) {
+		log_msg(LOG_DEFAULT, LVL_NOTE, "vol_part_mkfs_srv(%zu) - "
+		    "partition not found", sid);
+		async_answer_0(iid, ENOENT);
+		return;
+	}
+
+	log_msg(LOG_DEFAULT, LVL_NOTE, "vol_part_mkfs_srv(%zu) - "
+	    "call vol_part_mkfs_part()", sid);
+	rc = vol_part_mkfs_part(part, fstype);
+	if (rc != EOK) {
+		async_answer_0(iid, rc);
+		return;
+	}
+
+	async_answer_0(iid, EOK);
+}
+
 static void vol_client_conn(ipc_callid_t iid, ipc_call_t *icall, void *arg)
 {
@@ -251,4 +283,7 @@
 			vol_part_empty_srv(callid, &call);
 			break;
+		case VOL_PART_MKFS:
+			vol_part_mkfs_srv(callid, &call);
+			break;
 		default:
 			async_answer_0(callid, EINVAL);
