Index: uspace/lib/label/include/label.h
===================================================================
--- uspace/lib/label/include/label.h	(revision 28ed0d952e53138af66cace5b8439cbfaeda61ca)
+++ uspace/lib/label/include/label.h	(revision 78d50bd06d1f1eb12182cb42a78d0182b9256f3d)
@@ -49,4 +49,5 @@
 extern label_part_t *label_part_first(label_t *);
 extern label_part_t *label_part_next(label_part_t *);
+extern void label_part_get_info(label_part_t *, label_part_info_t *);
 
 extern int label_part_create(label_t *, label_part_spec_t *,
Index: uspace/lib/label/include/types/liblabel.h
===================================================================
--- uspace/lib/label/include/types/liblabel.h	(revision 28ed0d952e53138af66cace5b8439cbfaeda61ca)
+++ uspace/lib/label/include/types/liblabel.h	(revision 78d50bd06d1f1eb12182cb42a78d0182b9256f3d)
@@ -39,4 +39,5 @@
 #include <adt/list.h>
 #include <types/label.h>
+#include <sys/types.h>
 #include <vol.h>
 
@@ -48,26 +49,27 @@
 } label_info_t;
 
+typedef struct {
+	/** Address of first block */
+	aoff64_t block0;
+	/** Number of blocks */
+	aoff64_t nblocks;
+} label_part_info_t;
+
 /** Partition */
 typedef struct {
 	/** Containing label */
 	struct label *label;
-	/** Link to fdisk_dev_t.parts */
-	link_t ldev;
-	/** Capacity */
-//	fdisk_cap_t capacity;
-	/** File system type */
-//	fdisk_fstype_t fstype;
+	/** Link to label_t.parts */
+	link_t llabel;
 } label_part_t;
 
 /** Specification of new partition */
 typedef struct {
-	/** Desired capacity */
-//	fdisk_cap_t capacity;
-	/** File system type */
-//	fdisk_fstype_t fstype;
 } label_part_spec_t;
 
 /** Label instance */
 typedef struct label {
+	/** Partitions */
+	list_t parts; /* of label_part_t */
 } label_t;
 
Index: uspace/lib/label/src/label.c
===================================================================
--- uspace/lib/label/src/label.c	(revision 28ed0d952e53138af66cace5b8439cbfaeda61ca)
+++ uspace/lib/label/src/label.c	(revision 78d50bd06d1f1eb12182cb42a78d0182b9256f3d)
@@ -34,4 +34,5 @@
  */
 
+#include <adt/list.h>
 #include <errno.h>
 #include <label.h>
@@ -47,4 +48,5 @@
 		return ENOMEM;
 
+	list_initialize(&label->parts);
 	*rlabel = label;
 	return EOK;
@@ -59,4 +61,5 @@
 		return ENOMEM;
 
+	list_initialize(&label->parts);
 	*rlabel = label;
 	return EOK;
@@ -65,4 +68,7 @@
 void label_close(label_t *label)
 {
+	if (label == NULL)
+		return;
+
 	free(label);
 }
@@ -83,21 +89,49 @@
 label_part_t *label_part_first(label_t *label)
 {
-	return NULL;
+	link_t *link;
+
+	link = list_first(&label->parts);
+	if (link == NULL)
+		return NULL;
+
+	return list_get_instance(link, label_part_t, llabel);
 }
 
-label_part_t *label_part_next(label_part_t *oart)
+label_part_t *label_part_next(label_part_t *part)
 {
-	return NULL;
+	link_t *link;
+
+	link = list_next(&part->llabel, &part->label->parts);
+	if (link == NULL)
+		return NULL;
+
+	return list_get_instance(link, label_part_t, llabel);
 }
 
+void label_part_get_info(label_part_t *part, label_part_info_t *pinfo)
+{
+	pinfo->block0 = 0;
+	pinfo->nblocks = 0;
+}
 
 int label_part_create(label_t *label, label_part_spec_t *pspec,
     label_part_t **rpart)
 {
-	return ENOTSUP;
+	label_part_t *part;
+
+	part = calloc(1, sizeof(label_part_t));
+	if (part == NULL)
+		return ENOMEM;
+
+	part->label = label;
+	list_append(&part->llabel, &label->parts);
+	*rpart = part;
+	return EOK;
 }
 
 int label_part_destroy(label_part_t *part)
 {
+	list_remove(&part->llabel);
+	free(part);
 	return EOK;
 }
