Index: uspace/lib/label/include/label.h
===================================================================
--- uspace/lib/label/include/label.h	(revision 83dd7438820d500c677f0c1cbfcbc26b5ba760e2)
+++ uspace/lib/label/include/label.h	(revision f57ccb5dbdad2edb2def6970e5d20849ccd9daa9)
@@ -55,4 +55,5 @@
 extern int label_part_destroy(label_part_t *);
 extern void label_pspec_init(label_part_spec_t *);
+extern int label_suggest_ptype(label_t *, label_pcnt_t, label_ptype_t *);
 
 #endif
Index: uspace/lib/label/include/std/gpt.h
===================================================================
--- uspace/lib/label/include/std/gpt.h	(revision 83dd7438820d500c677f0c1cbfcbc26b5ba760e2)
+++ uspace/lib/label/include/std/gpt.h	(revision f57ccb5dbdad2edb2def6970e5d20849ccd9daa9)
@@ -77,4 +77,12 @@
 } __attribute__((packed)) gpt_entry_t;
 
+/** Microsoft Basic Data Partition */
+#define GPT_MS_BASIC_DATA "EBD0A0A2-B9E5-4433-87C0-68B6B72699C7"
+/** Linux Filesystem Data */
+#define GPT_LINUX_FS_DATA "0FC63DAF-8483-4772-8E79-3D69D8477DE4"
+/** I could not find any definition of Minix GUID partition type.
+ * This is a randomly generated UUID */
+#define GPT_MINIX_FAKE "8308e350-4e2d-46c7-8e3b-24b07e8ac674"
+
 #endif
 
Index: uspace/lib/label/include/std/mbr.h
===================================================================
--- uspace/lib/label/include/std/mbr.h	(revision 83dd7438820d500c677f0c1cbfcbc26b5ba760e2)
+++ uspace/lib/label/include/std/mbr.h	(revision f57ccb5dbdad2edb2def6970e5d20849ccd9daa9)
@@ -57,9 +57,21 @@
 };
 
-enum ptype {
+enum mbr_ptype {
 	/** Unused partition entry */
-	mbr_pt_unused	= 0x00,
+	mbr_pt_unused	    = 0x00,
 	/** Extended partition */
-	mbr_pt_extended	= 0x05
+	mbr_pt_extended	    = 0x05,
+	/** Extended partition with LBA */
+	mbr_pt_extended_lba = 0x0f,
+	/** FAT16 with LBA */
+	mbr_pt_fat16_lba    = 0x0e,
+	/** FAT32 with LBA */
+	mbr_pt_fat32_lba    = 0x0c,
+	/** IFS, HPFS, NTFS, exFAT */
+	mbr_pt_ms_advanced  = 0x07,
+	/** Minix */
+	mbr_pt_minix        = 0x81,
+	/** Linux */
+	mbr_pt_linux        = 0x83
 };
 
Index: uspace/lib/label/include/types/liblabel.h
===================================================================
--- uspace/lib/label/include/types/liblabel.h	(revision 83dd7438820d500c677f0c1cbfcbc26b5ba760e2)
+++ uspace/lib/label/include/types/liblabel.h	(revision f57ccb5dbdad2edb2def6970e5d20849ccd9daa9)
@@ -61,4 +61,5 @@
 	int (*part_create)(label_t *, label_part_spec_t *, label_part_t **);
 	int (*part_destroy)(label_part_t *);
+	int (*suggest_ptype)(label_t *, label_pcnt_t, label_ptype_t *);
 } label_ops_t;
 
@@ -106,5 +107,5 @@
 	aoff64_t nblocks;
 	/** Partition type */
-	uint64_t ptype;
+	label_ptype_t ptype;
 	/** Partition UUID */
 	uuid_t part_uuid;
@@ -124,5 +125,5 @@
 	label_pkind_t pkind;
 	/** Partition type */
-	uint64_t ptype;
+	label_ptype_t ptype;
 };
 
Index: uspace/lib/label/src/gpt.c
===================================================================
--- uspace/lib/label/src/gpt.c	(revision 83dd7438820d500c677f0c1cbfcbc26b5ba760e2)
+++ uspace/lib/label/src/gpt.c	(revision f57ccb5dbdad2edb2def6970e5d20849ccd9daa9)
@@ -55,4 +55,5 @@
 static int gpt_part_create(label_t *, label_part_spec_t *, label_part_t **);
 static int gpt_part_destroy(label_part_t *);
+static int gpt_suggest_ptype(label_t *, label_pcnt_t, label_ptype_t *);
 
 static void gpt_unused_pte(gpt_entry_t *);
@@ -80,5 +81,6 @@
 	.part_get_info = gpt_part_get_info,
 	.part_create = gpt_part_create,
-	.part_destroy = gpt_part_destroy
+	.part_destroy = gpt_part_destroy,
+	.suggest_ptype = gpt_suggest_ptype
 };
 
@@ -547,5 +549,5 @@
 	linfo->dcnt = dc_label;
 	linfo->ltype = lt_gpt;
-	linfo->flags = 0;
+	linfo->flags = lf_ptype_uuid; /* Partition type is in UUID format */
 	if (gpt_can_create_pri(label))
 		linfo->flags = linfo->flags | lf_can_create_pri;
@@ -607,4 +609,10 @@
 	/* GPT only has primary partitions */
 	if (pspec->pkind != lpk_primary) {
+		rc = EINVAL;
+		goto error;
+	}
+
+	/* Partition type must be in UUID format */
+	if (pspec->ptype.fmt != lptf_uuid) {
 		rc = EINVAL;
 		goto error;
@@ -663,4 +671,36 @@
 }
 
+static int gpt_suggest_ptype(label_t *label, label_pcnt_t pcnt,
+    label_ptype_t *ptype)
+{
+	const char *ptid;
+	int rc;
+
+	ptid = NULL;
+
+	switch (pcnt) {
+	case lpc_fat12_16:
+	case lpc_exfat:
+	case lpc_fat32:
+		ptid = GPT_MS_BASIC_DATA;
+		break;
+	case lpc_ext4:
+		ptid = GPT_LINUX_FS_DATA;
+		break;
+	case lpc_minix:
+		ptid = GPT_MINIX_FAKE;
+		break;
+	}
+
+	if (ptid == NULL)
+		return EINVAL;
+
+	ptype->fmt = lptf_uuid;
+	rc = uuid_parse(ptid, &ptype->t.uuid, NULL);
+	assert(rc == EOK);
+
+	return EOK;
+}
+
 static void gpt_unused_pte(gpt_entry_t *pte)
 {
@@ -677,5 +717,5 @@
 
 	memset(pte, 0, sizeof(gpt_entry_t));
-	pte->part_type[0] = 0x12;
+	uuid_encode(&part->ptype.t.uuid, pte->part_type);
 	uuid_encode(&part->part_uuid, pte->part_id);
 	pte->start_lba = host2uint64_t_le(part->block0);
@@ -713,4 +753,6 @@
 	part->block0 = b0;
 	part->nblocks = b1 - b0 + 1;
+	part->ptype.fmt = lptf_uuid;
+	uuid_decode(pte->part_type, &part->ptype.t.uuid);
 	uuid_decode(pte->part_id, &part->part_uuid);
 
Index: uspace/lib/label/src/label.c
===================================================================
--- uspace/lib/label/src/label.c	(revision 83dd7438820d500c677f0c1cbfcbc26b5ba760e2)
+++ uspace/lib/label/src/label.c	(revision f57ccb5dbdad2edb2def6970e5d20849ccd9daa9)
@@ -133,4 +133,10 @@
 }
 
+int label_suggest_ptype(label_t *label, label_pcnt_t pcnt,
+    label_ptype_t *ptype)
+{
+	return label->ops->suggest_ptype(label, pcnt, ptype);
+}
+
 /** @}
  */
Index: uspace/lib/label/src/mbr.c
===================================================================
--- uspace/lib/label/src/mbr.c	(revision 83dd7438820d500c677f0c1cbfcbc26b5ba760e2)
+++ uspace/lib/label/src/mbr.c	(revision f57ccb5dbdad2edb2def6970e5d20849ccd9daa9)
@@ -54,4 +54,5 @@
 static int mbr_part_create(label_t *, label_part_spec_t *, label_part_t **);
 static int mbr_part_destroy(label_part_t *);
+static int mbr_suggest_ptype(label_t *, label_pcnt_t, label_ptype_t *);
 
 static void mbr_unused_pte(mbr_pte_t *);
@@ -77,5 +78,6 @@
 	.part_get_info = mbr_part_get_info,
 	.part_create = mbr_part_create,
-	.part_destroy = mbr_part_destroy
+	.part_destroy = mbr_part_destroy,
+	.suggest_ptype = mbr_suggest_ptype
 };
 
@@ -485,8 +487,8 @@
 
 	log_msg(LOG_DEFAULT, LVL_NOTE, "mbr_part_get_info: index=%d ptype=%d",
-	    (int)part->index, (int)part->ptype);
+	    (int)part->index, (int)part->ptype.t.num);
 	if (link_used(&part->llog))
 		pinfo->pkind = lpk_logical;
-	else if (part->ptype == mbr_pt_extended)
+	else if (part->ptype.t.num == mbr_pt_extended)
 		pinfo->pkind = lpk_extended;
 	else
@@ -503,4 +505,7 @@
 	int rc;
 
+	if (pspec->ptype.fmt != lptf_num)
+		return EINVAL;
+
 	part = calloc(1, sizeof(label_part_t));
 	if (part == NULL)
@@ -521,6 +526,7 @@
 		break;
 	case lpk_extended:
-		part->ptype = mbr_pt_extended;
-		if (pspec->ptype != 0) {
+		part->ptype.fmt = lptf_num;
+		part->ptype.t.num = mbr_pt_extended;
+		if (pspec->ptype.t.num != 0) {
 			rc = EINVAL;
 			goto error;
@@ -705,4 +711,35 @@
 }
 
+static int mbr_suggest_ptype(label_t *label, label_pcnt_t pcnt,
+    label_ptype_t *ptype)
+{
+	ptype->fmt = lptf_num;
+	ptype->t.num = 0;
+
+	switch (pcnt) {
+	case lpc_exfat:
+		ptype->t.num = mbr_pt_ms_advanced;
+		break;
+	case lpc_ext4:
+		ptype->t.num = mbr_pt_linux;
+		break;
+	case lpc_fat12_16:
+		ptype->t.num = mbr_pt_fat16_lba;
+		break;
+	case lpc_fat32:
+		ptype->t.num = mbr_pt_fat32_lba;
+		break;
+	case lpc_minix:
+		ptype->t.num = mbr_pt_minix;
+		break;
+	}
+
+	if (ptype->t.num == 0)
+		return EINVAL;
+
+	return EOK;
+}
+
+
 static void mbr_unused_pte(mbr_pte_t *pte)
 {
@@ -716,12 +753,12 @@
 	if ((part->nblocks >> 32) != 0)
 		return EINVAL;
-	if ((part->ptype >> 8) != 0)
+	if ((part->ptype.t.num >> 8) != 0)
 		return EINVAL;
 
 	log_msg(LOG_DEFAULT, LVL_NOTE, "mbr_part_to_pte: a0=%" PRIu64
 	    " len=%" PRIu64 " ptype=%d", part->block0, part->nblocks,
-	    (int)part->ptype);
+	    (int)part->ptype.t.num);
 	memset(pte, 0, sizeof(mbr_pte_t));
-	pte->ptype = part->ptype;
+	pte->ptype = part->ptype.t.num;
 	pte->first_lba = host2uint32_t_le(part->block0);
 	pte->length = host2uint32_t_le(part->nblocks);
@@ -746,5 +783,6 @@
 		return ENOMEM;
 
-	part->ptype = pte->ptype;
+	part->ptype.fmt = lptf_num;
+	part->ptype.t.num = pte->ptype;
 	part->index = index;
 	part->block0 = block0;
@@ -786,5 +824,6 @@
 	nlparts = list_count(&label->log_parts);
 
-	part->ptype = pte->ptype;
+	part->ptype.fmt = lptf_num;
+	part->ptype.t.num = pte->ptype;
 	part->index = mbr_nprimary + 1 + nlparts;
 	part->block0 = block0;
@@ -816,5 +855,5 @@
 	if (pthis != NULL) {
 		memset(pthis, 0, sizeof(mbr_pte_t));
-		pthis->ptype = part->ptype;
+		pthis->ptype = part->ptype.t.num;
 		pthis->first_lba = host2uint32_t_le(part->hdr_blocks);
 		pthis->length = host2uint32_t_le(part->nblocks);
