Index: uspace/lib/c/generic/uuid.c
===================================================================
--- uspace/lib/c/generic/uuid.c	(revision b7a4d06b6d03da11c24ad8eee4f374f7b8a7dc13)
+++ 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 b7a4d06b6d03da11c24ad8eee4f374f7b8a7dc13)
+++ 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;
+}
+
+
 /** @}
  */
