diff -Nur parted-1.6.23.orig/include/parted/disk.h parted-1.6.23-modified/include/parted/disk.h
--- parted-1.6.23.orig/include/parted/disk.h	2005-01-04 14:09:50.000000000 -0200
+++ parted-1.6.23-modified/include/parted/disk.h	2005-08-02 09:50:56.000000000 -0300
@@ -49,10 +49,11 @@
 	PED_PARTITION_LBA=7,
 	PED_PARTITION_HPSERVICE=8,
 	PED_PARTITION_PALO=9,
-	PED_PARTITION_PREP=10
+	PED_PARTITION_PREP=10,
+	PED_PARTITION_MSFT_RESERVED=11
 } PedPartitionFlag;
 #define PED_PARTITION_FIRST_FLAG	PED_PARTITION_BOOT
-#define PED_PARTITION_LAST_FLAG		PED_PARTITION_PREP
+#define PED_PARTITION_LAST_FLAG		PED_PARTITION_MSFT_RESERVED
 
 typedef enum {
 	PED_DISK_TYPE_EXTENDED=1,	/* supports extended partitions */
diff -Nur parted-1.6.23.orig/libparted/disk.c parted-1.6.23-modified/libparted/disk.c
--- parted-1.6.23.orig/libparted/disk.c	2005-06-29 22:05:52.000000000 -0300
+++ parted-1.6.23-modified/libparted/disk.c	2005-08-02 09:51:52.000000000 -0300
@@ -1821,6 +1821,8 @@
 		return N_("palo");
 	case PED_PARTITION_PREP:
 		return N_("prep");
+	case PED_PARTITION_MSFT_RESERVED:
+		return N_("msfters");
 
 	default:
 		ped_exception_throw (
diff -Nur parted-1.6.23.orig/libparted/disk_gpt.c parted-1.6.23-modified/libparted/disk_gpt.c
--- parted-1.6.23.orig/libparted/disk_gpt.c	2005-03-27 07:09:04.000000000 -0300
+++ parted-1.6.23-modified/libparted/disk_gpt.c	2005-08-02 10:10:23.000000000 -0300
@@ -212,6 +212,8 @@
 	int		raid;
 	int		boot;
 	int		hp_service;
+	int 	hidden;
+	int 	msftres;
 } GPTPartitionData;
 
 static PedDiskType gpt_disk_type;
@@ -514,8 +516,13 @@
 					   (uint16_t) pte->PartitionName[i]);
 	gpt_part_data->name[i] = 0;
 
-	gpt_part_data->lvm = gpt_part_data->raid = gpt_part_data->boot
-		= gpt_part_data->hp_service = 0;
+	gpt_part_data->lvm = gpt_part_data->raid = 
+		gpt_part_data->boot = gpt_part_data->hp_service = 
+		gpt_part_data->hidden = gpt_part_data->msftres = 0;
+
+	if(pte->Attributes.RequiredToFunction & 0x1)
+		gpt_part_data->hidden = 1;
+	
 	if (!guid_cmp (gpt_part_data->type, PARTITION_SYSTEM_GUID))
 		gpt_part_data->boot = 1;
 	else if (!guid_cmp (gpt_part_data->type, PARTITION_RAID_GUID))
@@ -524,6 +531,8 @@
 		gpt_part_data->lvm = 1;
 	else if (!guid_cmp (gpt_part_data->type, PARTITION_HPSERVICE_GUID))
 		gpt_part_data->hp_service = 1;
+	else if (!guid_cmp (gpt_part_data->type, PARTITION_MSFT_RESERVED_GUID))
+		gpt_part_data->msftres = 1;
 
 	return part;
 }
@@ -754,6 +763,9 @@
 	pte->EndingLBA = PED_CPU_TO_LE64(part->geom.end);
 	memset (&pte->Attributes, 0, sizeof (GuidPartitionEntryAttributes_t));
 
+	if (gpt_part_data->hidden)
+		pte->Attributes.RequiredToFunction = 1;
+
 	for (i = 0; i < 72 / sizeof(efi_char16_t); i++)
 		pte->PartitionName[i]
 			= (efi_char16_t) PED_CPU_TO_LE16(
@@ -872,6 +884,8 @@
 	gpt_part_data->raid = 0;
 	gpt_part_data->boot = 0;
 	gpt_part_data->hp_service = 0;
+	gpt_part_data->hidden = 0;
+	gpt_part_data->msftres = 0;
 	uuid_generate ((unsigned char*) &gpt_part_data->uuid);
 	swap_uuid_and_efi_guid((unsigned char*)(&gpt_part_data->uuid));
 	strcpy (gpt_part_data->name, "");
@@ -951,13 +965,12 @@
 		gpt_part_data->type = PARTITION_HPSERVICE_GUID;
 		return 1;
 	}
+	if (gpt_part_data->msftres) {
+		gpt_part_data->type = PARTITION_MSFT_RESERVED_GUID;
+		return 1;
+	}
 
 	if (fs_type) {
-		if (strncmp (fs_type->name, "fat", 3) == 0
-		    || strcmp (fs_type->name, "ntfs") == 0) {
-			gpt_part_data->type = PARTITION_MSFT_RESERVED_GUID;
-			return 1;
-		}
 		if (strstr (fs_type->name, "swap")) {
 			gpt_part_data->type = PARTITION_SWAP_GUID;
 			return 1;
@@ -1032,30 +1045,48 @@
 	case PED_PARTITION_BOOT:
 		gpt_part_data->boot = state;
 		if (state)
-			gpt_part_data->raid = gpt_part_data->lvm
-				= gpt_part_data->hp_service = 0;
+			gpt_part_data->raid 
+				= gpt_part_data->lvm
+				= gpt_part_data->hp_service
+				= gpt_part_data->msftres = 0;
 		return gpt_partition_set_system (part, part->fs_type);
 	case PED_PARTITION_RAID:
 		gpt_part_data->raid = state;
 		if (state)
-			gpt_part_data->boot = gpt_part_data->lvm
-				= gpt_part_data->hp_service = 0;
+			gpt_part_data->boot
+				= gpt_part_data->lvm
+				= gpt_part_data->hp_service
+				= gpt_part_data->msftres = 0;
 		return gpt_partition_set_system (part, part->fs_type);
 	case PED_PARTITION_LVM:
 		gpt_part_data->lvm = state;
 		if (state)
-			gpt_part_data->boot = gpt_part_data->raid
-				= gpt_part_data->hp_service = 0;
+			gpt_part_data->boot
+				= gpt_part_data->raid
+				= gpt_part_data->hp_service
+				= gpt_part_data->msftres = 0;
 		return gpt_partition_set_system (part, part->fs_type);
 	case PED_PARTITION_HPSERVICE:
 		gpt_part_data->hp_service = state;
 		if (state)
-			gpt_part_data->boot = gpt_part_data->raid
-				= gpt_part_data->lvm = 0;
+			gpt_part_data->boot
+				= gpt_part_data->raid
+				= gpt_part_data->lvm
+				= gpt_part_data->msftres = 0;
 		return gpt_partition_set_system (part, part->fs_type);
+	case PED_PARTITION_MSFT_RESERVED:
+		gpt_part_data->msftres = state;
+		if (state)
+			gpt_part_data->boot
+				= gpt_part_data->raid
+				= gpt_part_data->lvm
+				= gpt_part_data->hp_service = 0;
+		return gpt_partition_set_system (part, part->fs_type);
+	case PED_PARTITION_HIDDEN:
+		gpt_part_data->hidden = state;
+		return 1;
 	case PED_PARTITION_SWAP:
 	case PED_PARTITION_ROOT:
-	case PED_PARTITION_HIDDEN:
 	case PED_PARTITION_LBA:
 	default:
 		return 0;
@@ -1079,10 +1110,13 @@
 		return gpt_part_data->boot;
 	case PED_PARTITION_HPSERVICE:
 		return gpt_part_data->hp_service;
+	case PED_PARTITION_MSFT_RESERVED:
+		return gpt_part_data->msftres;
+	case PED_PARTITION_HIDDEN:
+		return gpt_part_data->hidden;
 	case PED_PARTITION_SWAP:
 	case PED_PARTITION_LBA:
 	case PED_PARTITION_ROOT:
-	case PED_PARTITION_HIDDEN:
 	default:
 		return 0;
 	}
@@ -1098,10 +1132,11 @@
 	case PED_PARTITION_LVM:
 	case PED_PARTITION_BOOT:
 	case PED_PARTITION_HPSERVICE:
+	case PED_PARTITION_MSFT_RESERVED:
+	case PED_PARTITION_HIDDEN:
 		return 1;
 	case PED_PARTITION_SWAP:
 	case PED_PARTITION_ROOT:
-	case PED_PARTITION_HIDDEN:
 	case PED_PARTITION_LBA:
 	default:
 		return 0;
