Index: uspace/lib/c/generic/uuid.c
===================================================================
--- uspace/lib/c/generic/uuid.c	(revision c02d098887d0049fec4eb72260cc0efa28e1a0d4)
+++ uspace/lib/c/generic/uuid.c	(revision f57ccb5dbdad2edb2def6970e5d20849ccd9daa9)
@@ -36,4 +36,5 @@
 #include <uuid.h>
 #include <stdlib.h>
+#include <str.h>
 
 /** Generate UUID.
@@ -87,4 +88,87 @@
 }
 
+/** Parse string UUID.
+ *
+ * If @a endptr is not NULL, it is set to point to the first character
+ * following the UUID. If @a endptr is NULL, the string must not contain
+ * any characters following the UUID, otherwise an error is returned.
+ *
+ * @param str    String beginning with UUID string representation
+ * @param uuid   Place to store UUID
+ * @param endptr Place to store pointer to end of UUID or @c NULL
+ *
+ * @return EOK on success or negative error code
+ */
+int uuid_parse(const char *str, uuid_t *uuid, const char **endptr)
+{
+	int rc;
+	const char *eptr;
+	uint32_t time_low;
+	uint16_t time_mid;
+	uint16_t time_ver;
+	uint16_t clock;
+	uint64_t node;
+	int i;
+
+	rc = str_uint32_t(str, &eptr, 16, false, &time_low);
+	if (rc != EOK || eptr != str + 8 || *eptr != '-')
+		return EINVAL;
+
+	rc = str_uint16_t(str + 9, &eptr, 16, false, &time_mid);
+	if (rc != EOK || eptr != str + 13 || *eptr != '-')
+		return EINVAL;
+
+	rc = str_uint16_t(str + 14, &eptr, 16, false, &time_ver);
+	if (rc != EOK || eptr != str + 18 || *eptr != '-')
+		return EINVAL;
+
+	rc = str_uint16_t(str + 19, &eptr, 16, false, &clock);
+	if (rc != EOK || eptr != str + 23 || *eptr != '-')
+		return EINVAL;
+
+	rc = str_uint64_t(str + 24, &eptr, 16, false, &node);
+	if (rc != EOK || eptr != str + 36 || *eptr != '\0')
+		return EINVAL;
+
+	uuid->b[0] = time_low >> 24;
+	uuid->b[1] = (time_low >> 16) & 0xff;
+	uuid->b[2] = (time_low >> 8) & 0xff;
+	uuid->b[3] = time_low & 0xff;
+
+	uuid->b[4] = time_mid >> 8;
+	uuid->b[5] = time_mid & 0xff;
+
+	uuid->b[6] = time_ver >> 8;
+	uuid->b[7] = time_ver & 0xff;
+
+	uuid->b[8] = clock >> 8;
+	uuid->b[9] = clock & 0xff;
+
+	for (i = 0; i < 6; i++)
+		uuid->b[10 + i] = (node >> 8 * (5 - i)) & 0xff;
+
+	if (endptr != NULL) {
+		*endptr = str + 36;
+	} else {
+		if (*(str + 36) != '\0')
+			return EINVAL;
+	}
+
+	return EOK;
+}
+
+/** Format UUID into string representation.
+ *
+ * @param uuid UUID
+ * @param rstr Place to store pointer to newly allocated string
+ *
+ * @return EOK on success, ENOMEM if out of memory
+ */
+int uuid_format(uuid_t *uuid, char **rstr)
+{
+	return ENOTSUP;
+}
+
+
 /** @}
  */
Index: uspace/lib/c/generic/vbd.c
===================================================================
--- uspace/lib/c/generic/vbd.c	(revision c02d098887d0049fec4eb72260cc0efa28e1a0d4)
+++ uspace/lib/c/generic/vbd.c	(revision f57ccb5dbdad2edb2def6970e5d20849ccd9daa9)
@@ -330,4 +330,38 @@
 }
 
+/** Suggest partition type based on partition content.
+ *
+ * @param vbd   Virtual Block Device
+ * @param disk  Disk on which the partition will be created
+ * @param pcnt  Partition content
+ * @param ptype Place to store suggested partition type
+ *
+ * @return EOK on success or negative error code
+ */
+int vbd_suggest_ptype(vbd_t *vbd, service_id_t disk, label_pcnt_t pcnt,
+    label_ptype_t *ptype)
+{
+	async_exch_t *exch;
+	sysarg_t retval;
+	ipc_call_t answer;
+
+	exch = async_exchange_begin(vbd->sess);
+	aid_t req = async_send_2(exch, VBD_SUGGEST_PTYPE, disk, pcnt, &answer);
+	int rc = async_data_read_start(exch, ptype, sizeof(label_ptype_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;
+}
+
+
 /** @}
  */
Index: uspace/lib/c/include/ipc/vbd.h
===================================================================
--- uspace/lib/c/include/ipc/vbd.h	(revision c02d098887d0049fec4eb72260cc0efa28e1a0d4)
+++ uspace/lib/c/include/ipc/vbd.h	(revision f57ccb5dbdad2edb2def6970e5d20849ccd9daa9)
@@ -46,4 +46,5 @@
 	VBD_PART_CREATE,
 	VBD_PART_DELETE,
+	VBD_SUGGEST_PTYPE
 } vbd_request_t;
 
Index: uspace/lib/c/include/types/label.h
===================================================================
--- uspace/lib/c/include/types/label.h	(revision c02d098887d0049fec4eb72260cc0efa28e1a0d4)
+++ uspace/lib/c/include/types/label.h	(revision f57ccb5dbdad2edb2def6970e5d20849ccd9daa9)
@@ -36,4 +36,6 @@
 #define LIBC_TYPES_LABEL_H_
 
+#include <types/uuid.h>
+
 /** Disk contents */
 typedef enum {
@@ -72,11 +74,48 @@
 	/** Label supports extended (and logical) partitions */
 	lf_ext_supp = 0x1,
+	/** Partition type is in UUID format (otherwise in small number format) */
+	lf_ptype_uuid = 0x2,
 	/** Currently it is possible to create a primary partition */
-	lf_can_create_pri = 0x2,
+	lf_can_create_pri = 0x4,
 	/** Currently it is possible to create an extended partition */
-	lf_can_create_ext = 0x4,
+	lf_can_create_ext = 0x8,
 	/** Currrently it is possible to create a logical partition */
-	lf_can_create_log = 0x8
+	lf_can_create_log = 0x10
 } label_flags_t;
+
+/** Partition type format */
+typedef enum {
+	/** Small number */
+	lptf_num,
+	/** UUID */
+	lptf_uuid
+} label_pt_fmt;
+
+/** Partition type */
+typedef struct {
+	/** Type format */
+	label_pt_fmt fmt;
+	/** Depending on @c fmt */
+	union {
+		/* Small number */
+		uint8_t num;
+		/** UUID */
+		uuid_t uuid;
+	} t;
+} label_ptype_t;
+
+/** Partition content (used to get partition type suggestion) */
+typedef enum {
+	/** ExFAT */
+	lpc_exfat,
+	/** Ext4 */
+	lpc_ext4,
+	/** FAT12 or FAT16 */
+	lpc_fat12_16,
+	/** FAT32 */
+	lpc_fat32,
+	/** Minix file system */
+	lpc_minix
+} label_pcnt_t;
 
 #endif
Index: uspace/lib/c/include/types/uuid.h
===================================================================
--- uspace/lib/c/include/types/uuid.h	(revision f57ccb5dbdad2edb2def6970e5d20849ccd9daa9)
+++ uspace/lib/c/include/types/uuid.h	(revision f57ccb5dbdad2edb2def6970e5d20849ccd9daa9)
@@ -0,0 +1,52 @@
+/*
+ * 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 libc
+ * @{
+ */
+/** @file
+ */
+
+#ifndef LIBC_TYPES_UUID_H_
+#define LIBC_TYPES_UUID_H_
+
+#include <stdint.h>
+
+enum {
+	uuid_bytes = 16
+};
+
+/** Universally Unique Identifier */
+typedef struct {
+	uint8_t b[uuid_bytes];
+} uuid_t;
+
+#endif
+
+/** @}
+ */
Index: uspace/lib/c/include/uuid.h
===================================================================
--- uspace/lib/c/include/uuid.h	(revision c02d098887d0049fec4eb72260cc0efa28e1a0d4)
+++ uspace/lib/c/include/uuid.h	(revision f57ccb5dbdad2edb2def6970e5d20849ccd9daa9)
@@ -37,17 +37,11 @@
 
 #include <stdint.h>
-
-enum {
-	uuid_bytes = 16
-};
-
-/** Universally Unique Identifier */
-typedef struct {
-	uint8_t b[uuid_bytes];
-} uuid_t;
+#include <types/uuid.h>
 
 extern int uuid_generate(uuid_t *);
 extern void uuid_encode(uuid_t *, uint8_t *);
 extern void uuid_decode(uint8_t *, uuid_t *);
+extern int uuid_parse(const char *, uuid_t *, const char **);
+extern int uuid_format(uuid_t *, char **);
 
 #endif
Index: uspace/lib/c/include/vbd.h
===================================================================
--- uspace/lib/c/include/vbd.h	(revision c02d098887d0049fec4eb72260cc0efa28e1a0d4)
+++ uspace/lib/c/include/vbd.h	(revision f57ccb5dbdad2edb2def6970e5d20849ccd9daa9)
@@ -74,5 +74,5 @@
 	label_pkind_t pkind;
 	/** Partition type */
-	uint64_t ptype;
+	label_ptype_t ptype;
 } vbd_part_spec_t;
 
@@ -105,4 +105,6 @@
 extern int vbd_part_delete(vbd_t *, vbd_part_id_t);
 extern void vbd_pspec_init(vbd_part_spec_t *);
+extern int vbd_suggest_ptype(vbd_t *, service_id_t, label_pcnt_t,
+    label_ptype_t *);
 
 #endif
