diff --git a/gptpart.cc b/gptpart.cc
index 473e2ef..b5bf771 100644
--- a/gptpart.cc
+++ b/gptpart.cc
@@ -17,6 +17,7 @@
 
 #include <string.h>
 #include <stdio.h>
+#include <unicode/ustdio.h>
 #include <iostream>
 #include "gptpart.h"
 #include "attributes.h"
@@ -46,6 +47,16 @@
    return partitionType.TypeName();
 } // GPTPart::GetNameType()
 
+// Return a Unicode description of the partition type (e.g., "Linux/Windows
+// data" or "Linux swap").
+UnicodeString GPTPart::GetUTypeName(void) {
+   return partitionType.UTypeName();
+/*   UnicodeString temp;
+
+   temp = temp.fromUTF8(partitionType.TypeName());
+   return temp; */
+} // GPTPart::GetNameType()
+
 // Compute and return the partition's length (or 0 if the end is incorrectly
 // set before the beginning).
 uint64_t GPTPart::GetLengthLBA(void) const {
@@ -56,7 +67,7 @@
    return length;
 } // GPTPart::GetLengthLBA()
 
-// Return partition's name field, converted to a C++ ASCII string
+/* // Return partition's name field, converted to a C++ ASCII string
 string GPTPart::GetDescription(void) {
    string theName;
    int i;
@@ -67,6 +78,20 @@
          theName += name[i];
    } // for
    return theName;
+} // GPTPart::GetDescription() */
+
+UnicodeString GPTPart::GetDescription(void) {
+   UnicodeString theName;
+   UChar *temp;
+   int i;
+
+   theName = "";
+   temp = (UChar*) name;
+   for (i = 0; i < NAME_SIZE / 2; i++) {
+      if (temp[i] != '\0')
+         theName += temp[i];
+   } // for
+   return theName;
 } // GPTPart::GetDescription()
 
 // Return 1 if the partition is in use
@@ -78,41 +103,38 @@
 // name *IF* the current name is the generic one for the current partition
 // type.
 void GPTPart::SetType(PartType t) {
-   if (GetDescription() == partitionType.TypeName()) {
+   if (GetDescription() == partitionType.UTypeName()) {
       SetName(t.TypeName());
    } // if
    partitionType = t;
 } // GPTPart::SetType()
 
 // Set the name for a partition to theName, or prompt for a name if
-// theName is empty. Note that theName is a standard C++-style ASCII
-// string, although the GUID partition definition requires a UTF-16LE
-// string. This function creates a simple-minded copy for this.
-void GPTPart::SetName(const string & theName) {
-   char newName[NAME_SIZE];
-   size_t i;
+// theName is empty, using a C++-style string as input.
+void GPTPart::SetName(string theName) {
+   UnicodeString uString;
 
-   // Blank out new name string, so that it will terminate in a null
-   // when data are copied to it....
-   memset(newName, 0, NAME_SIZE);
+   uString = theName.c_str();
+   SetName(uString);
+} // GPTPart::SetName()
+
+// Set the name for a partition to theName, or prompt for a name
+// if theName is empty, using a Unicode string as input.
+void GPTPart::SetName(UnicodeString theName) {
+   int i;
+   UChar temp[NAME_SIZE / 2];
 
    if (theName == "") { // No name specified, so get one from the user
       cout << "Enter name: ";
-      ReadCString(newName, NAME_SIZE / 2 + 1);
-
-      // Input is likely to include a newline, so remove it....
-      i = strlen(newName);
-      if (i && newName[i - 1] == '\n')
-         newName[i - 1] = '\0';
-   } else {
-      strcpy(newName, theName.substr(0, NAME_SIZE / 2).c_str());
+      theName = ReadUString();
    } // if
 
-   // Copy the C-style ASCII string from newName into a form that the GPT
+   // Copy the C++-style string from newName into a form that the GPT
    // table will accept....
-   memset(name, 0, NAME_SIZE);
-   for (i = 0; i < NAME_SIZE / 2; i++)
-      name[i * 2] = newName[i];
+   memset(temp, 0, NAME_SIZE);
+   for (i = 0; i < theName.length(); i++)
+      temp[i] = theName[i];
+   memcpy(name, temp, NAME_SIZE);
 } // GPTPart::SetName()
 
 // Set the name for the partition based on the current GUID partition type
@@ -146,6 +168,7 @@
 // Display summary information; does nothing if the partition is empty.
 void GPTPart::ShowSummary(int partNum, uint32_t blockSize) {
    string sizeInIeee;
+   UnicodeString description;
    size_t i;
 
    if (firstLBA != 0) {
@@ -166,7 +189,13 @@
       cout.setf(ios::uppercase);
       cout << hex << partitionType.GetHexType() << "  " << dec;
       cout.fill(' ');
-      cout << GetDescription().substr(0, 23) << "\n";
+//      description = GetDescription();
+      GetDescription().extractBetween(0, 24, description);
+      cout << description << "\n";
+//      for (i = 0; i < 23; i++)
+//         cout << (char) description.;
+//      cout << GetDescription().tempSubString(0, 23) << "\n";
+//      cout << GetDescription().substr(0, 23) << "\n";
       cout.fill(' ');
    } // if
 } // GPTPart::ShowSummary()
@@ -217,11 +246,16 @@
           (firstLBA <= other.lastLBA) != (lastLBA < other.firstLBA);
 } // GPTPart::DoTheyOverlap()
 
-// Reverse the bytes of integral data types; used on big-endian systems.
+// Reverse the bytes of integral data types and of the UTF-16LE name;
+// used on big-endian systems.
 void GPTPart::ReversePartBytes(void) {
+   int i;
+
    ReverseBytes(&firstLBA, 8);
    ReverseBytes(&lastLBA, 8);
    ReverseBytes(&attributes, 8);
+   for (i = 0; i < NAME_SIZE; i += 2)
+      ReverseBytes(name + i, 2);
 } // GPTPart::ReverseBytes()
 
 /****************************************
@@ -231,20 +265,20 @@
 // Change the type code on the partition. Also changes the name if the original
 // name is the generic one for the partition type.
 void GPTPart::ChangeType(void) {
-   char line[255];
+   string line;
    int changeName;
    PartType tempType = (GUIDData) "00000000-0000-0000-0000-000000000000";
 
-   changeName = (GetDescription() == GetTypeName());
+   changeName = (GetDescription() == GetUTypeName());
 
    cout << "Current type is '" << GetTypeName() << "'\n";
    do {
       cout << "Hex code or GUID (L to show codes, Enter = 0700): ";
-      ReadCString(line, sizeof(line));
+      line = ReadString();
       if ((line[0] == 'L') || (line[0] == 'l')) {
          partitionType.ShowAllTypes();
       } else {
-         if (strlen(line) == 1)
+         if (line.length() == 0)
             tempType = 0x0700;
          else
             tempType = line;
