Index: uspace/lib/label/src/gpt.c
===================================================================
--- uspace/lib/label/src/gpt.c	(revision eed70f147d6cb10436c97e198628b915af0bbb95)
+++ uspace/lib/label/src/gpt.c	(revision ed9bf14ea271bb6fd2ede343dbda94e25b021c6e)
@@ -39,7 +39,9 @@
 #include <errno.h>
 #include <mem.h>
+#include <stdint.h>
 #include <stdlib.h>
 #include <uuid.h>
 
+#include "std/mbr.h"
 #include "std/gpt.h"
 #include "gpt.h"
@@ -68,4 +70,7 @@
 static void gpt_hdr_compute_crc(gpt_header_t *, size_t);
 static int gpt_hdr_get_crc(gpt_header_t *, size_t, uint32_t *);
+
+static int gpt_pmbr_create(service_id_t, size_t, uint64_t);
+static int gpt_pmbr_destroy(service_id_t, size_t);
 
 const uint8_t efi_signature[8] = {
@@ -375,4 +380,10 @@
 	}
 
+	rc = gpt_pmbr_create(sid, bsize, nblocks);
+	if (rc != EOK) {
+		rc = EIO;
+		goto error;
+	}
+
 	uuid_generate(&disk_uuid);
 
@@ -538,4 +549,8 @@
 	}
 
+	rc = gpt_pmbr_destroy(label->svc_id, label->block_size);
+	if (rc != EOK)
+		goto error;
+
 	free(label);
 	return EOK;
@@ -957,4 +972,67 @@
 }
 
+/** Create GPT Protective MBR */
+static int gpt_pmbr_create(service_id_t sid, size_t bsize, uint64_t nblocks)
+{
+	mbr_br_block_t *pmbr = NULL;
+	uint64_t pmbr_nb;
+	int rc;
+
+	pmbr = calloc(1, bsize);
+	if (pmbr == NULL) {
+		rc = ENOMEM;
+		goto error;
+	}
+
+	pmbr_nb = nblocks - gpt_hdr_ba;
+
+	pmbr->pte[0].ptype = mbr_pt_gpt_protect;
+	pmbr->pte[0].first_lba = gpt_hdr_ba;
+
+	if (pmbr_nb <= UINT32_MAX)
+		pmbr->pte[0].length = host2uint32_t_le((uint32_t)pmbr_nb);
+	else
+		pmbr->pte[0].length = host2uint32_t_le(UINT32_MAX);
+
+	pmbr->signature = host2uint16_t_le(mbr_br_signature);
+
+	rc = block_write_direct(sid, mbr_ba, 1, pmbr);
+	if (rc != EOK) {
+		rc = EIO;
+		goto error;
+	}
+
+	free(pmbr);
+	return EOK;
+error:
+	free(pmbr);
+	return rc;
+}
+
+/** Destroy GPT Protective MBR */
+static int gpt_pmbr_destroy(service_id_t sid, size_t bsize)
+{
+	mbr_br_block_t *pmbr = NULL;
+	int rc;
+
+	pmbr = calloc(1, bsize);
+	if (pmbr == NULL) {
+		rc = ENOMEM;
+		goto error;
+	}
+
+	rc = block_write_direct(sid, mbr_ba, 1, pmbr);
+	if (rc != EOK) {
+		rc = EIO;
+		goto error;
+	}
+
+	free(pmbr);
+	return EOK;
+error:
+	free(pmbr);
+	return rc;
+}
+
 /** @}
  */
