Index: uspace/lib/c/generic/vol.c
===================================================================
--- uspace/lib/c/generic/vol.c	(revision d858a660afff3b05ffdfe37e6957b83b447f6b26)
+++ uspace/lib/c/generic/vol.c	(revision 9c2c7d2247cc1ad0410cd61ab534af9a246d328b)
@@ -39,4 +39,5 @@
 #include <loc.h>
 #include <stdlib.h>
+#include <str.h>
 #include <vol.h>
 
@@ -251,13 +252,48 @@
 }
 
+/** Get volume label support. */
+int vol_part_get_lsupp(vol_t *vol, vol_fstype_t fstype,
+    vol_label_supp_t *vlsupp)
+{
+	async_exch_t *exch;
+	sysarg_t retval;
+	ipc_call_t answer;
+
+	exch = async_exchange_begin(vol->sess);
+	aid_t req = async_send_1(exch, VOL_PART_LSUPP, fstype, &answer);
+	int rc = async_data_read_start(exch, vlsupp, sizeof(vol_label_supp_t));
+	async_exchange_end(exch);
+
+	if (rc != EOK) {
+		async_forget(req);
+		return EIO;
+	}
+
+	async_wait_for(req, &retval);
+	if (retval != EOK)
+		return EIO;
+
+	return EOK;
+}
+
 /** Create file system. */
-int vol_part_mkfs(vol_t *vol, service_id_t sid, vol_fstype_t fstype)
-{
-	async_exch_t *exch;
-	int retval;
-
-	exch = async_exchange_begin(vol->sess);
-	retval = async_req_2_0(exch, VOL_PART_MKFS, sid, fstype);
-	async_exchange_end(exch);
+int vol_part_mkfs(vol_t *vol, service_id_t sid, vol_fstype_t fstype,
+    const char *label)
+{
+	async_exch_t *exch;
+	ipc_call_t answer;
+	sysarg_t retval;
+
+	exch = async_exchange_begin(vol->sess);
+	aid_t req = async_send_2(exch, VOL_PART_MKFS, sid, fstype, &answer);
+	retval = async_data_write_start(exch, label, str_size(label));
+	async_exchange_end(exch);
+
+	if (retval != EOK) {
+		async_forget(req);
+		return retval;
+	}
+
+	async_wait_for(req, &retval);
 
 	if (retval != EOK)
Index: uspace/lib/c/include/ipc/vol.h
===================================================================
--- uspace/lib/c/include/ipc/vol.h	(revision d858a660afff3b05ffdfe37e6957b83b447f6b26)
+++ uspace/lib/c/include/ipc/vol.h	(revision 9c2c7d2247cc1ad0410cd61ab534af9a246d328b)
@@ -43,5 +43,6 @@
 	VOL_PART_INFO,
 	VOL_PART_EMPTY,
-	VOL_PART_MKFS
+	VOL_PART_LSUPP,
+	VOL_PART_MKFS,
 } vol_request_t;
 
Index: uspace/lib/c/include/types/vol.h
===================================================================
--- uspace/lib/c/include/types/vol.h	(revision d858a660afff3b05ffdfe37e6957b83b447f6b26)
+++ uspace/lib/c/include/types/vol.h	(revision 9c2c7d2247cc1ad0410cd61ab534af9a246d328b)
@@ -38,4 +38,5 @@
 #include <async.h>
 #include <ipc/vol.h>
+#include <stdbool.h>
 
 typedef enum {
@@ -76,4 +77,10 @@
 } vol_part_info_t;
 
+/** Volume label support */
+typedef struct {
+	/** Volume labels are supported */
+	bool supported;
+} vol_label_supp_t;
+
 #endif
 
Index: uspace/lib/c/include/vol.h
===================================================================
--- uspace/lib/c/include/vol.h	(revision d858a660afff3b05ffdfe37e6957b83b447f6b26)
+++ uspace/lib/c/include/vol.h	(revision 9c2c7d2247cc1ad0410cd61ab534af9a246d328b)
@@ -48,5 +48,6 @@
 extern int vol_part_info(vol_t *, service_id_t, vol_part_info_t *);
 extern int vol_part_empty(vol_t *, service_id_t);
-extern int vol_part_mkfs(vol_t *, service_id_t, vol_fstype_t);
+extern int vol_part_get_lsupp(vol_t *, vol_fstype_t, vol_label_supp_t *);
+extern int vol_part_mkfs(vol_t *, service_id_t, vol_fstype_t, const char *);
 
 #endif
Index: uspace/lib/fdisk/include/fdisk.h
===================================================================
--- uspace/lib/fdisk/include/fdisk.h	(revision d858a660afff3b05ffdfe37e6957b83b447f6b26)
+++ uspace/lib/fdisk/include/fdisk.h	(revision 9c2c7d2247cc1ad0410cd61ab534af9a246d328b)
@@ -39,4 +39,5 @@
 #include <loc.h>
 #include <types/fdisk.h>
+#include <types/vol.h>
 
 extern int fdisk_create(fdisk_t **);
@@ -81,4 +82,7 @@
 extern int fdisk_pkind_format(label_pkind_t, char **);
 
+extern int fdisk_get_vollabel_support(fdisk_dev_t *, vol_fstype_t,
+    vol_label_supp_t *);
+
 #endif
 
Index: uspace/lib/fdisk/include/types/fdisk.h
===================================================================
--- uspace/lib/fdisk/include/types/fdisk.h	(revision d858a660afff3b05ffdfe37e6957b83b447f6b26)
+++ uspace/lib/fdisk/include/types/fdisk.h	(revision 9c2c7d2247cc1ad0410cd61ab534af9a246d328b)
@@ -43,5 +43,4 @@
 #include <types/vol.h>
 #include <vbd.h>
-#include <vol.h>
 
 /** Capacity unit */
@@ -199,4 +198,6 @@
 	/** File system type */
 	vol_fstype_t fstype;
+	/** Volume label */
+	char *label;
 } fdisk_part_spec_t;
 
Index: uspace/lib/fdisk/src/fdisk.c
===================================================================
--- uspace/lib/fdisk/src/fdisk.c	(revision d858a660afff3b05ffdfe37e6957b83b447f6b26)
+++ uspace/lib/fdisk/src/fdisk.c	(revision 9c2c7d2247cc1ad0410cd61ab534af9a246d328b)
@@ -731,34 +731,56 @@
     fdisk_part_t **rpart)
 {
-	fdisk_part_t *part;
+	fdisk_part_t *part = NULL;
 	vbd_part_spec_t vpspec;
-	vbd_part_id_t partid;
-	int rc;
+	vbd_part_id_t partid = 0;
+	vol_part_info_t vpinfo;
+	char *label;
+	int rc;
+
+	label = str_dup(pspec->label);
+	if (label == NULL)
+		return ENOMEM;
 
 	rc = fdisk_part_spec_prepare(dev, pspec, &vpspec);
-	if (rc != EOK)
-		return EIO;
+	if (rc != EOK) {
+		rc = EIO;
+		goto error;
+	}
 
 	rc = vbd_part_create(dev->fdisk->vbd, dev->sid, &vpspec, &partid);
-	if (rc != EOK)
-		return EIO;
+	if (rc != EOK) {
+		rc = EIO;
+		goto error;
+	}
 
 	rc = fdisk_part_add(dev, partid, &part);
 	if (rc != EOK) {
-		/* Try rolling back */
-		(void) vbd_part_delete(dev->fdisk->vbd, partid);
-		return EIO;
+		rc = EIO;
+		goto error;
 	}
 
 	if (part->svc_id != 0) {
-		rc = vol_part_mkfs(dev->fdisk->vol, part->svc_id, pspec->fstype);
+		rc = vol_part_mkfs(dev->fdisk->vol, part->svc_id, pspec->fstype,
+		    pspec->label);
 		if (rc != EOK && rc != ENOTSUP) {
-			fdisk_part_remove(part);
-			(void) vbd_part_delete(dev->fdisk->vbd, partid);
-			return EIO;
-		}
-
-		part->pcnt = vpc_fs;
-		part->fstype = pspec->fstype;
+			rc = EIO;
+			goto error;
+		}
+
+		/* Get the real label value */
+		rc = vol_part_info(dev->fdisk->vol, part->svc_id, &vpinfo);
+		if (rc != EOK) {
+			rc = EIO;
+			goto error;
+		}
+
+		part->pcnt = vpinfo.pcnt;
+		part->fstype = vpinfo.fstype;
+		part->label = str_dup(vpinfo.label);
+
+		if (part->label == NULL) {
+			rc = EIO;
+			goto error;
+		}
 	}
 
@@ -766,4 +788,11 @@
 		*rpart = part;
 	return EOK;
+error:
+	/* Try rolling back */
+	if (part != NULL)
+		fdisk_part_remove(part);
+	if (partid != 0)
+		(void) vbd_part_delete(dev->fdisk->vbd, partid);
+	return rc;
 }
 
@@ -1194,4 +1223,11 @@
 }
 
+/** Get volume label support. */
+int fdisk_get_vollabel_support(fdisk_dev_t *dev, vol_fstype_t fstype,
+    vol_label_supp_t *vlsupp)
+{
+	return vol_part_get_lsupp(dev->fdisk->vol, fstype, vlsupp);
+}
+
 /** @}
  */
