Index: uspace/lib/fdisk/include/fdisk.h
===================================================================
--- uspace/lib/fdisk/include/fdisk.h	(revision edebb4a154d7503a1a506cd53ce84ae086f387d6)
+++ uspace/lib/fdisk/include/fdisk.h	(revision ea0ff6b69b253afa7b6b4e9cd38ef8e91ec0daab)
@@ -52,4 +52,6 @@
 extern int fdisk_dev_open(fdisk_t *, service_id_t, fdisk_dev_t **);
 extern void fdisk_dev_close(fdisk_dev_t *);
+extern int fdisk_dev_erase(fdisk_dev_t *);
+extern void fdisk_dev_get_flags(fdisk_dev_t *, fdisk_dev_flags_t *);
 extern int fdisk_dev_get_svcname(fdisk_dev_t *, char **);
 extern int fdisk_dev_capacity(fdisk_dev_t *, fdisk_cap_t *);
Index: uspace/lib/fdisk/include/types/fdisk.h
===================================================================
--- uspace/lib/fdisk/include/types/fdisk.h	(revision edebb4a154d7503a1a506cd53ce84ae086f387d6)
+++ uspace/lib/fdisk/include/types/fdisk.h	(revision ea0ff6b69b253afa7b6b4e9cd38ef8e91ec0daab)
@@ -57,4 +57,14 @@
 } fdisk_cunit_t;
 
+/** Fdisk device flags */
+typedef enum {
+	/** Currently we can create a label */
+	fdf_can_create_label = 0x1,
+	/** Currently we can delete the label */
+	fdf_can_delete_label = 0x2,
+	/** Currently we can erase unknown data from disk */
+	fdf_can_erase_dev = 0x4
+} fdisk_dev_flags_t;
+
 #define CU_LIMIT (cu_ybyte + 1)
 
@@ -76,7 +86,9 @@
 	/** Link in fdisk_dev_list_t.devinfos */
 	link_t ldevlist;
+	/** Service ID */
 	service_id_t svcid;
 	/** Service name or NULL if not determined yet */
 	char *svcname;
+	/** Device is initialized in libblock */
 	bool blk_inited;
 } fdisk_dev_info_t;
Index: uspace/lib/fdisk/src/fdisk.c
===================================================================
--- uspace/lib/fdisk/src/fdisk.c	(revision edebb4a154d7503a1a506cd53ce84ae086f387d6)
+++ uspace/lib/fdisk/src/fdisk.c	(revision ea0ff6b69b253afa7b6b4e9cd38ef8e91ec0daab)
@@ -528,4 +528,54 @@
 }
 
+/** Erase contents of unlabeled disk. */
+int fdisk_dev_erase(fdisk_dev_t *dev)
+{
+	fdisk_part_t *part;
+	int rc;
+
+	printf("fdisk_dev_erase.. check ltype\n");
+	if (dev->dinfo.ltype != lt_none)
+		return EINVAL;
+
+	printf("fdisk_dev_erase.. get first part\n");
+	part = fdisk_part_first(dev);
+	assert(part != NULL);
+	printf("fdisk_dev_erase.. check part\n");
+	if (part->pcnt == vpc_empty)
+		return EINVAL;
+
+	printf("fdisk_dev_erase.. check part\n");
+	rc = vol_part_empty(dev->fdisk->vol, part->svc_id);
+	if (rc != EOK) {
+		printf("vol_part_empty -> %d\n", rc);
+		return rc;
+	}
+
+	part->pcnt = vpc_empty;
+	return EOK;
+}
+
+void fdisk_dev_get_flags(fdisk_dev_t *dev, fdisk_dev_flags_t *rflags)
+{
+	fdisk_dev_flags_t flags;
+	fdisk_part_t *part;
+
+	flags = 0;
+
+	/* fdf_can_create_label */
+	if (dev->dinfo.ltype == lt_none) {
+		part = fdisk_part_first(dev);
+		assert(part != NULL);
+		if (part->pcnt == vpc_empty)
+			flags |= fdf_can_create_label;
+		else
+			flags |= fdf_can_erase_dev;
+	} else {
+		flags |= fdf_can_delete_label;
+	}
+
+	*rflags = flags;
+}
+
 int fdisk_dev_get_svcname(fdisk_dev_t *dev, char **rname)
 {
@@ -587,5 +637,16 @@
 int fdisk_label_create(fdisk_dev_t *dev, label_type_t ltype)
 {
-	int rc;
+	fdisk_part_t *part;
+	int rc;
+
+	/* Disk must not contain a label. */
+	if (dev->dinfo.ltype != lt_none)
+		return EEXIST;
+
+	/* Dummy partition spanning entire disk must be considered empty */
+	part = fdisk_part_first(dev);
+	assert(part != NULL);
+	if (part->pcnt != vpc_empty)
+		return EEXIST;
 
 	/* Remove dummy partition */
@@ -606,5 +667,8 @@
 {
 	fdisk_part_t *part;
-	int rc;
+	fdisk_dev_flags_t dflags;
+	int rc;
+
+	printf("fdisk_label_destroy: begin\n");
 
 	part = fdisk_part_first(dev);
@@ -616,12 +680,25 @@
 	}
 
+	printf("fdisk_label_destroy: vbd_label_delete\n");
+
 	rc = vbd_label_delete(dev->fdisk->vbd, dev->sid);
 	if (rc != EOK)
 		return EIO;
 
+	printf("fdisk_label_destroy: add parts\n");
 	rc = fdisk_dev_add_parts(dev);
 	if (rc != EOK)
 		return rc;
 
+	printf("fdisk_label_destroy: erase dev\n");
+	/* Make sure device is considered empty */
+	fdisk_dev_get_flags(dev, &dflags);
+	if ((dflags & fdf_can_erase_dev) != 0) {
+		rc = fdisk_dev_erase(dev);
+		if (rc != EOK)
+			return rc;
+	}
+
+	printf("fdisk_label_destroy: done\n");
 	return EOK;
 }
