Index: uspace/app/hdisk/common.h
===================================================================
--- uspace/app/hdisk/common.h	(revision 622a50b2ad6b03b1b08ffc5a507e070f239fbe58)
+++ uspace/app/hdisk/common.h	(revision 44c488656656806dc143099d9a82d6bb2b1bf293)
@@ -39,7 +39,7 @@
 #include <libgpt.h>
 
-union table_data {
-	mbr_table_t	mbr;
-	gpt_table_t	gpt;
+union label_data {
+	mbr_label_t	*mbr;
+	gpt_label_t	*gpt;
 };
 
Index: uspace/app/hdisk/func_gpt.c
===================================================================
--- uspace/app/hdisk/func_gpt.c	(revision 622a50b2ad6b03b1b08ffc5a507e070f239fbe58)
+++ uspace/app/hdisk/func_gpt.c	(revision 44c488656656806dc143099d9a82d6bb2b1bf293)
@@ -43,7 +43,7 @@
 static int set_gpt_partition(tinput_t *, gpt_part_t *);
 
-int add_gpt_part(tinput_t * in, union table_data * data)
+int add_gpt_part(tinput_t * in, union label_data * data)
 {
-	gpt_part_t * p = gpt_alloc_partition(data->gpt.parts);
+	gpt_part_t * p = gpt_alloc_partition(data->gpt->parts);
 	if (p == NULL) {
 		return ENOMEM;
@@ -53,5 +53,5 @@
 }
 
-int delete_gpt_part(tinput_t * in, union table_data * data)
+int delete_gpt_part(tinput_t * in, union label_data * data)
 {
 	size_t idx;
@@ -60,5 +60,5 @@
 	idx = get_input_size_t(in);
 
-	if (gpt_remove_partition(data->gpt.parts, idx) == -1) {
+	if (gpt_remove_partition(data->gpt->parts, idx) == -1) {
 		printf("Warning: running low on memory, not resizing...\n");
 	}
@@ -67,12 +67,17 @@
 }
 
-int new_gpt_table(tinput_t * in, union table_data * data)
+int destroy_gpt_label(union label_data *data)
 {
-	data->gpt.gpt = gpt_alloc_gpt_header();
-	data->gpt.parts = gpt_alloc_partitions();
 	return EOK;
 }
 
-int print_gpt_parts(union table_data * data)
+int new_gpt_label(union label_data *data)
+{
+	data->gpt->gpt = gpt_alloc_gpt_header();
+	data->gpt->parts = gpt_alloc_partitions();
+	return EOK;
+}
+
+int print_gpt_parts(union label_data *data)
 {
 	//int rc;
@@ -82,5 +87,5 @@
 	size_t i = 0;
 	
-	gpt_part_foreach(data->gpt.parts, iter) {
+	gpt_part_foreach(data->gpt->parts, iter) {
 		//printf("\t%10u %10u %10u %3d\n", iter->start_addr, iter->start_addr + iter->length,
 		//		iter->length, gpt_get_part_type(iter), gpt_get_part_name(iter));
@@ -95,9 +100,14 @@
 }
 
-int write_gpt_parts(service_id_t dev_handle, union table_data * data)
+int read_gpt_parts(service_id_t dev_handle, union label_data *data)
+{
+	return EOK;
+}
+
+int write_gpt_parts(service_id_t dev_handle, union label_data * data)
 {
 	int rc;
 
-	rc = gpt_write_partitions(data->gpt.parts, data->gpt.gpt, dev_handle);
+	rc = gpt_write_partitions(data->gpt->parts, data->gpt->gpt, dev_handle);
 	if (rc != EOK) {
 		printf("Error: Writing partitions failed: %d (%s)\n", rc, str_error(rc));
@@ -105,5 +115,5 @@
 	}
 
-	rc = gpt_write_gpt_header(data->gpt.gpt, dev_handle);
+	rc = gpt_write_gpt_header(data->gpt->gpt, dev_handle);
 	if (rc != EOK) {
 		printf("Error: Writing partitions failed: %d (%s)\n", rc, str_error(rc));
@@ -114,5 +124,5 @@
 }
 
-int extra_gpt_funcs(tinput_t * in, service_id_t dev_handle, union table_data * data)
+int extra_gpt_funcs(tinput_t * in, service_id_t dev_handle, union label_data * data)
 {
 	printf("Not implemented.\n");
Index: uspace/app/hdisk/func_gpt.h
===================================================================
--- uspace/app/hdisk/func_gpt.h	(revision 622a50b2ad6b03b1b08ffc5a507e070f239fbe58)
+++ uspace/app/hdisk/func_gpt.h	(revision 44c488656656806dc143099d9a82d6bb2b1bf293)
@@ -42,10 +42,12 @@
 #include "common.h"
 
-extern int add_gpt_part(tinput_t * in, union table_data * data);
-extern int delete_gpt_part(tinput_t * in, union table_data * data);
-extern int new_gpt_table(tinput_t *, union table_data *);
-extern int print_gpt_parts(union table_data * data);
-extern int write_gpt_parts(service_id_t dev_handle, union table_data * data);
-extern int extra_gpt_funcs(tinput_t * in, service_id_t dev_handle, union table_data * data);
+extern int add_gpt_part(tinput_t *, union label_data *);
+extern int delete_gpt_part(tinput_t *, union label_data *);
+extern int destroy_gpt_label(union label_data *);
+extern int new_gpt_label(union label_data *);
+extern int print_gpt_parts(union label_data *);
+extern int read_gpt_parts(service_id_t, union label_data *);
+extern int write_gpt_parts(service_id_t, union label_data *);
+extern int extra_gpt_funcs(tinput_t *, service_id_t, union label_data *);
 
 #endif
Index: uspace/app/hdisk/func_mbr.c
===================================================================
--- uspace/app/hdisk/func_mbr.c	(revision 622a50b2ad6b03b1b08ffc5a507e070f239fbe58)
+++ uspace/app/hdisk/func_mbr.c	(revision 44c488656656806dc143099d9a82d6bb2b1bf293)
@@ -41,25 +41,23 @@
 #include "input.h"
 
-static int set_mbr_partition(tinput_t * in, mbr_part_t * p);
-
-
-int add_mbr_part(tinput_t * in, union table_data * data)
+static int set_mbr_partition(tinput_t *in, mbr_part_t *p);
+
+int add_mbr_part(tinput_t *in, union label_data *data)
 {
 	int rc;
 	
-	mbr_part_t * part = mbr_alloc_partition();
+	mbr_part_t *part = mbr_alloc_partition();
 
 	set_mbr_partition(in, part);
 
-	rc = mbr_add_partition(data->mbr.parts, part);
+	rc = mbr_add_partition(data->mbr, part);
 	if (rc != EOK) {
 		printf("Error adding partition.\n");
 	}
 	
-	
-	return rc;
-}
-
-int delete_mbr_part(tinput_t * in, union table_data * data)
+	return EOK;
+}
+
+int delete_mbr_part(tinput_t *in, union label_data *data)
 {
 	int rc;
@@ -72,5 +70,5 @@
 		return errno;
 	
-	rc = mbr_remove_partition(data->mbr.parts, idx);
+	rc = mbr_remove_partition(data->mbr, idx);
 	if(rc != EOK) {
 		printf("Error: something.\n");
@@ -80,13 +78,21 @@
 }
 
-int new_mbr_table(tinput_t * in, union table_data * data)
-{
-	data->mbr.mbr = mbr_alloc_mbr();
-	data->mbr.parts = mbr_alloc_partitions();
-	return EOK;
+int destroy_mbr_label(union label_data *data)
+{
+	mbr_free_label(data->mbr);
+	return EOK;
+}
+
+int new_mbr_label(union label_data *data)
+{
+	data->mbr = mbr_alloc_label();
+	if (data->mbr == NULL)
+		return ENOMEM;
+	else
+		return EOK;
 }
 
 /** Print current partition scheme */
-int print_mbr_parts(union table_data * data)
+int print_mbr_parts(union label_data *data)
 {
 	int num = 0;
@@ -96,6 +102,6 @@
 	printf("\t\t%10s  %10s %10s %10s %7s\n", "Bootable:", "Start:", "End:", "Length:", "Type:");
 	
-	mbr_part_t * it;
-	mbr_part_foreach(data->mbr.parts, it) {
+	mbr_part_t *it;
+	mbr_part_foreach(data->mbr->parts, it) {
 		if (it->type == PT_UNUSED)
 			continue;
@@ -117,7 +123,25 @@
 }
 
-int write_mbr_parts(service_id_t dev_handle, union table_data * data)
-{
-	int rc = mbr_write_partitions(data->mbr.parts, data->mbr.mbr, dev_handle);
+int read_mbr_parts(service_id_t dev_handle, union label_data *data)
+{
+	int rc;
+	printf("mbr\n");
+	rc = mbr_read_mbr(data->mbr, dev_handle);
+	if (rc != EOK)
+		return rc;
+	printf("ismbr\n");
+	if (!mbr_is_mbr(data->mbr))
+		return EINVAL;
+	printf("parts\n");
+	rc = mbr_read_partitions(data->mbr);
+	if (rc != EOK)
+		return rc;
+	printf("end\n");
+	return EOK;
+}
+
+int write_mbr_parts(service_id_t dev_handle, union label_data *data)
+{
+	int rc = mbr_write_partitions(data->mbr, dev_handle);
 	if (rc != EOK) {
 		printf("Error occured during writing: ERR: %d: %s\n", rc, str_error(rc));
@@ -127,5 +151,5 @@
 }
 
-int extra_mbr_funcs(tinput_t * in, service_id_t dev_handle, union table_data * data)
+int extra_mbr_funcs(tinput_t *in, service_id_t dev_handle, union label_data *data)
 {
 	printf("Not implemented.\n");
@@ -133,5 +157,5 @@
 }
 
-static int set_mbr_partition(tinput_t * in, mbr_part_t * p)
+static int set_mbr_partition(tinput_t *in, mbr_part_t *p)
 {
 	int c;
@@ -159,5 +183,5 @@
 		return errno;
 
-	///TODO: there can only be one bootable partition; let's do it just like fdisk
+	///TODO: there can only be one boolabel partition; let's do it just like fdisk
 	printf("Bootable? (y/n): ");
 	c = getchar();
Index: uspace/app/hdisk/func_mbr.h
===================================================================
--- uspace/app/hdisk/func_mbr.h	(revision 622a50b2ad6b03b1b08ffc5a507e070f239fbe58)
+++ uspace/app/hdisk/func_mbr.h	(revision 44c488656656806dc143099d9a82d6bb2b1bf293)
@@ -42,10 +42,12 @@
 #include "common.h"
 
-extern int add_mbr_part(tinput_t * in, union table_data * data);
-extern int delete_mbr_part(tinput_t * in, union table_data * data);
-extern int new_mbr_table(tinput_t *, union table_data *);
-extern int print_mbr_parts(union table_data * data);
-extern int write_mbr_parts(service_id_t dev_handle, union table_data * data);
-extern int extra_mbr_funcs(tinput_t * in, service_id_t dev_handle, union table_data * data);
+extern int add_mbr_part(tinput_t *, union label_data *);
+extern int delete_mbr_part(tinput_t *, union label_data *);
+extern int destroy_mbr_label(union label_data *);
+extern int new_mbr_label(union label_data *);
+extern int print_mbr_parts(union label_data *);
+extern int read_mbr_parts(service_id_t, union label_data *);
+extern int write_mbr_parts(service_id_t, union label_data *);
+extern int extra_mbr_funcs(tinput_t *, service_id_t, union label_data *);
 
 #endif
Index: uspace/app/hdisk/func_none.c
===================================================================
--- uspace/app/hdisk/func_none.c	(revision 622a50b2ad6b03b1b08ffc5a507e070f239fbe58)
+++ uspace/app/hdisk/func_none.c	(revision 44c488656656806dc143099d9a82d6bb2b1bf293)
@@ -40,5 +40,6 @@
 static void not_implemented(void);
 
-int add_none_part(tinput_t * in, union table_data * data)
+
+int add_none_part(tinput_t *in, union label_data *data)
 {
 	not_implemented();
@@ -46,5 +47,5 @@
 }
 
-int delete_none_part(tinput_t * in, union table_data * data)
+int delete_none_part(tinput_t *in, union label_data *data)
 {
 	not_implemented();
@@ -52,5 +53,5 @@
 }
 
-int new_none_table(tinput_t * in, union table_data * data)
+int destroy_none_label(union label_data *data)
 {
 	not_implemented();
@@ -58,5 +59,5 @@
 }
 
-int print_none_parts(union table_data * data)
+int new_none_label(union label_data *data)
 {
 	not_implemented();
@@ -64,5 +65,5 @@
 }
 
-int write_none_parts(service_id_t dev_handle, union table_data * data)
+int print_none_parts(union label_data *data)
 {
 	not_implemented();
@@ -70,5 +71,17 @@
 }
 
-int extra_none_funcs(tinput_t * in, service_id_t dev_handle, union table_data * data)
+int read_none_parts(service_id_t dev_handle, union label_data *data)
+{
+	not_implemented();
+	return EOK;
+}
+
+int write_none_parts(service_id_t dev_handle, union label_data *data)
+{
+	not_implemented();
+	return EOK;
+}
+
+int extra_none_funcs(tinput_t *in, service_id_t dev_handle, union label_data *data)
 {
 	not_implemented();
Index: uspace/app/hdisk/func_none.h
===================================================================
--- uspace/app/hdisk/func_none.h	(revision 622a50b2ad6b03b1b08ffc5a507e070f239fbe58)
+++ uspace/app/hdisk/func_none.h	(revision 44c488656656806dc143099d9a82d6bb2b1bf293)
@@ -41,10 +41,12 @@
 #include "common.h"
 
-extern int add_none_part(tinput_t * in, union table_data * data);
-extern int delete_none_part(tinput_t * in, union table_data * data);
-extern int new_none_table(tinput_t *, union table_data *);
-extern int print_none_parts(union table_data * data);
-extern int write_none_parts(service_id_t dev_handle, union table_data * data);
-extern int extra_none_funcs(tinput_t * in, service_id_t dev_handle, union table_data * data);
+extern int add_none_part(tinput_t *, union label_data *);
+extern int delete_none_part(tinput_t *, union label_data *);
+extern int destroy_none_label(union label_data *);
+extern int new_none_label(union label_data *);
+extern int print_none_parts(union label_data *);
+extern int read_none_parts(service_id_t, union label_data *);
+extern int write_none_parts(service_id_t, union label_data *);
+extern int extra_none_funcs(tinput_t *, service_id_t, union label_data *);
 
 #endif
Index: uspace/app/hdisk/hdisk.c
===================================================================
--- uspace/app/hdisk/hdisk.c	(revision 622a50b2ad6b03b1b08ffc5a507e070f239fbe58)
+++ uspace/app/hdisk/hdisk.c	(revision 44c488656656806dc143099d9a82d6bb2b1bf293)
@@ -53,22 +53,32 @@
 #include "func_none.h"
 
-int interact(service_id_t dev_handle);
+int interact(service_id_t);
 void print_help(void);
-void select_table_format(tinput_t * in);
-void fill_table_funcs(void);
-void free_table(void);
-
-static table_t table;
+void select_label_format(tinput_t *);
+void fill_label_funcs(void);
+void free_label(void);
+int try_read(service_id_t);
+
+int construct_none_label(void);
+
+int construct_mbr_label(void);
+int try_read_mbr(service_id_t);
+
+int construct_gpt_label(void);
+int try_read_gpt(service_id_t);
+
+
+static label_t label;
 
 int main(int argc, char ** argv)
 {
 	if (argc == 1) {
-		printf("I'd like to have an argument, please.\n");
-		return 1;
-	}
-
+		printf("Missing argument. Please specify a device to operate on.\n");
+		return -1;
+	}
+	
 	int rc;
 	service_id_t dev_handle;
-
+	
 	rc = loc_service_get_id(argv[1], &dev_handle, IPC_FLAG_BLOCKING);
 	if (rc != EOK) {
@@ -76,7 +86,9 @@
 		return -1;
 	}
-
-	init_table();
-
+	
+	printf("Init.\n");
+	init_label();
+	
+	/*
 	mbr_t * mbr = mbr_read_mbr(dev_handle);
 	if(mbr == NULL) {
@@ -87,6 +99,6 @@
 
 	if(mbr_is_mbr(mbr)) {
-		table.layout = LYT_MBR;
-		set_table_mbr(mbr);
+		label.layout = LYT_MBR;
+		set_label_mbr(mbr);
 		mbr_partitions_t * parts = mbr_read_partitions(mbr);
 		if(parts == NULL) {
@@ -95,16 +107,23 @@
 			parts = mbr_alloc_partitions();
 		}
-		set_table_mbr_parts(parts);
-		fill_table_funcs();
+		set_label_mbr_parts(parts);
+		fill_label_funcs();
 		goto interact;
 	}
 	
 	
-	mbr_free_mbr(mbr);
+	mbr_free_mbr(mbr);*/
+	
+	printf("Try MBR.\n");
+	rc = try_read_mbr(dev_handle);
+	if (rc == EOK)
+		goto interact;
+	
+	/*
 	gpt_t * gpt = gpt_read_gpt_header(dev_handle);
 	
 	if(gpt != NULL) {
-		table.layout = LYT_GPT;
-		set_table_gpt(gpt);
+		label.layout = LYT_GPT;
+		set_label_gpt(gpt);
 		
 		gpt_partitions_t * parts = gpt_read_partitions(gpt);
@@ -115,15 +134,23 @@
 			parts = gpt_alloc_partitions();
 		}
-		set_table_gpt_parts(parts);
-		fill_table_funcs();
+		set_label_gpt_parts(parts);
+		fill_label_funcs();
 		goto interact;
 	}
-	printf("No partition table recognized. Create a new one.\n");
-	table.layout = LYT_NONE;
+	*/
+	
+	printf("Try GPT.\n");
+	rc = try_read_gpt(dev_handle);
+	if (rc == EOK)
+		goto interact;
+	
+	printf("No label recognized. Create a new one.\n");
+	label.layout = LYT_NONE;
 	
 interact:
+	printf("interact.\n");
 	rc = interact(dev_handle);
 	
-	free_table();
+	free_label();
 	
 	return rc;
@@ -152,15 +179,18 @@
 		switch(input) {
 			case 'a':
-				table.add_part(in, &table.data);
+				label.add_part(in, &label.data);
+				break;
+			case 'b':
+				label.add_part(in, &label.data);
 				break;
 			case 'd':
-				table.delete_part(in, &table.data);
+				label.delete_part(in, &label.data);
 				break;
 			case 'e':
-				table.extra_funcs(in, dev_handle, &table.data);
+				label.extra_funcs(in, dev_handle, &label.data);
 				break;
 			case 'f':
-				free_table();
-				select_table_format(in);
+				free_label();
+				select_label_format(in);
 				break;
 			case 'h':
@@ -168,9 +198,9 @@
 				break;
 			case 'n':
-				free_table();
-				table.new_table(in, &table.data);
+				free_label();
+				label.new_label(&label.data);
 				break;
 			case 'p':
-				table.print_parts(&table.data);
+				label.print_parts(&label.data);
 				break;
 			case 'q':
@@ -178,5 +208,5 @@
 				goto end;
 			case 'w':
-				table.write_parts(dev_handle, &table.data);
+				label.write_parts(dev_handle, &label.data);
 				break;
 			default:
@@ -197,10 +227,11 @@
 		"\t 'a' \t\t Add partition.\n"
 		"\t 'd' \t\t Delete partition.\n"
-		"\t 'e' \t\t Extra functions (per table format).\n"
-		"\t 'f' \t\t Switch the format of the partition table."
+		"\t 'e' \t\t Extra functions (per label format).\n"
+		"\t 'f' \t\t Switch the format of the partition label."
 		"\t 'h' \t\t Prints help. See help for more.\n"
-		"\t 'n' \t\t Create new table (discarding the old one).\n"
-		"\t 'p' \t\t Prints the table contents.\n"
-		"\t 'w' \t\t Write table to disk.\n"
+		"\t 'l' \t\t Set alignment.\n"
+		"\t 'n' \t\t Create new label (discarding the old one).\n"
+		"\t 'p' \t\t Prints label contents.\n"
+		"\t 'w' \t\t Write label to disk.\n"
 		"\t 'q' \t\t Quit.\n"
 		);
@@ -208,5 +239,5 @@
 }
 
-void select_table_format(tinput_t * in)
+void select_label_format(tinput_t * in)
 {
 	printf("Available formats are: \n"
@@ -218,76 +249,137 @@
 	switch(val) {
 		case 0:
-			table.layout = LYT_NONE;
-			fill_table_funcs();
+			free_label();
+			label.layout = LYT_NONE;
+			fill_label_funcs();
 			break;
 		case 1:
-			table.layout = LYT_MBR;
-			fill_table_funcs();
+			free_label();
+			label.layout = LYT_MBR;
+			fill_label_funcs();
 			break;
 		case 2:
-			table.layout = LYT_GPT;
-			fill_table_funcs();
-			break;
-	}
-}
-
-void fill_table_funcs(void)
-{
-	switch(table.layout) {
+			free_label();
+			label.layout = LYT_GPT;
+			fill_label_funcs();
+			break;
+	}
+}
+
+void fill_label_funcs(void)
+{
+	switch(label.layout) {
 		case LYT_MBR:
-			table.add_part = add_mbr_part;
-			table.delete_part = delete_mbr_part;
-			table.new_table = new_mbr_table;
-			table.print_parts = print_mbr_parts;
-			table.write_parts = write_mbr_parts;
-			table.extra_funcs = extra_mbr_funcs;
+			construct_mbr_label();
 			break;
 		case LYT_GPT:
-			table.add_part = add_gpt_part;
-			table.delete_part = delete_gpt_part;
-			table.new_table	= new_gpt_table;
-			table.print_parts = print_gpt_parts;
-			table.write_parts = write_gpt_parts;
-			table.extra_funcs = extra_gpt_funcs;
+			construct_gpt_label();
 			break;
 		default:
-			table.add_part = add_none_part;
-			table.delete_part = delete_none_part;
-			table.new_table = new_none_table;
-			table.print_parts = print_none_parts;
-			table.write_parts = write_none_parts;
-			table.extra_funcs = extra_none_funcs;
-			break;
-	}
-}
-
-void free_table(void)
-{
-	switch(table.layout) {
+			construct_none_label();
+			break;
+	}
+}
+
+void free_label(void)
+{
+	/*
+	switch(label.layout) {
 		case LYT_MBR:
-			if (table.data.mbr.parts != NULL) {
-				mbr_free_partitions(table.data.mbr.parts);
-				table.data.mbr.parts = NULL;
-			}
-			if (table.data.mbr.mbr != NULL) {
-				mbr_free_mbr(table.data.mbr.mbr);
-				table.data.mbr.mbr = NULL;
-			}
+			destroy_mbr_label(&label);
 			break;
 		case LYT_GPT:
-			if (table.data.gpt.parts != NULL) {
-				gpt_free_partitions(table.data.gpt.parts);
-				table.data.gpt.parts = NULL;
-			}
-			if (table.data.gpt.gpt != NULL) {
-				gpt_free_gpt(table.data.gpt.gpt);
-				table.data.gpt.gpt = NULL;
-			}
+			destroy_gpt_label(&label);
 			break;
 		default:
 			break;
 	}
-}
-
-
-
+	*/
+	
+	label.destroy_label(&label.data);
+}
+
+int try_read(service_id_t dev_handle)
+{
+	fill_label_funcs();
+	printf("read_parts\n");
+	return label.read_parts(dev_handle, &label.data);
+}
+
+int construct_none_label()
+{
+	label.add_part      = add_none_part;
+	label.delete_part   = delete_none_part;
+	label.destroy_label = destroy_none_label;
+	label.new_label     = new_none_label;
+	label.print_parts   = print_none_parts;
+	label.read_parts    = read_none_parts;
+	label.write_parts   = write_none_parts;
+	label.extra_funcs   = extra_none_funcs;
+	
+	return EOK;
+}
+
+int construct_mbr_label()
+{
+	label.add_part      = add_mbr_part;
+	label.delete_part   = delete_mbr_part;
+	label.destroy_label = destroy_mbr_label;
+	label.new_label     = new_mbr_label;
+	label.print_parts   = print_mbr_parts;
+	label.read_parts    = read_mbr_parts;
+	label.write_parts   = write_mbr_parts;
+	label.extra_funcs   = extra_mbr_funcs;
+	
+	return label.new_label(&label.data);
+}
+
+int try_read_mbr(service_id_t dev_handle)
+{
+	label.layout = LYT_MBR;
+	return try_read(dev_handle);
+}
+
+int construct_gpt_label()
+{
+	label.add_part    = add_gpt_part;
+	label.delete_part = delete_gpt_part;
+	label.new_label   = new_gpt_label;
+	label.print_parts = print_gpt_parts;
+	label.read_parts  = read_gpt_parts;
+	label.write_parts = write_gpt_parts;
+	label.extra_funcs = extra_gpt_funcs;
+	
+	return label.new_label(&label.data);
+}
+
+int try_read_gpt(service_id_t dev_handle)
+{
+	label.layout = LYT_GPT;
+	return try_read(dev_handle);
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Index: uspace/app/hdisk/hdisk.h
===================================================================
--- uspace/app/hdisk/hdisk.h	(revision 622a50b2ad6b03b1b08ffc5a507e070f239fbe58)
+++ uspace/app/hdisk/hdisk.h	(revision 44c488656656806dc143099d9a82d6bb2b1bf293)
@@ -39,29 +39,20 @@
 	LYT_MBR,
 	LYT_GPT,
-} LAYOUTS;
+} layouts_t;
 
-typedef struct table {
-	LAYOUTS layout;
-	union table_data data;
-	int (* add_part)(tinput_t *, union table_data *);
-	int (* delete_part)(tinput_t *, union table_data *);
-	int (* new_table)(tinput_t *, union table_data *);
-	int (* print_parts)();
-	int (* write_parts)(service_id_t, union table_data *);
-	int (* extra_funcs)(tinput_t *, service_id_t, union table_data *);
-} table_t;
+typedef struct label {
+	layouts_t layout;
+	union label_data data;
+	int (* add_part)     (tinput_t *,   union label_data *);
+	int (* delete_part)  (tinput_t *,   union label_data *);
+	int (* destroy_label)(              union label_data *);
+	int (* new_label)    (              union label_data *);
+	int (* print_parts)  (              union label_data *);
+	int (* read_parts)   (service_id_t, union label_data *);
+	int (* write_parts)  (service_id_t, union label_data *);
+	int (* extra_funcs)  (tinput_t *, service_id_t, union label_data *);
+} label_t;
 
-#define init_table() \
-	table.layout = LYT_NONE
+#define init_label() \
+	label.layout = LYT_NONE
 
-#define set_table_mbr(m) \
-	table.data.mbr.mbr = (m)
-
-#define set_table_mbr_parts(p) \
-	table.data.mbr.parts = (p)
-
-#define set_table_gpt(g) \
-	table.data.gpt.gpt = (g)
-
-#define set_table_gpt_parts(p) \
-	table.data.gpt.parts = (p)
