diff --git a/Makefile b/Makefile
index 33a2ffc860a284dd129f82628b7f0fad67aed50c..2834ecb07c5ce3af3bd96490fd9fb5dd72c7b331 100644
--- a/Makefile
+++ b/Makefile
@@ -1,7 +1,7 @@
 CC=gcc
 CXX=g++
 CFLAGS=-O2 -D_FILE_OFFSET_BITS=64 -g
-CXXFLAGS=-O2 -Wuninitialized -Wreturn-type -D_FILE_OFFSET_BITS=64 -I/opt/local/include -g
+CXXFLAGS=-O2 -Wuninitialized -Wreturn-type -D_FILE_OFFSET_BITS=64 -I /usr/local/include -I/opt/local/include -g
 LIB_NAMES=crc32 support gptpart mbr gpt bsd parttypes attributes
 LIB_SRCS=$(NAMES:=.cc)
 LIB_OBJS=$(LIB_NAMES:=.o)
@@ -17,7 +17,7 @@ gdisk:	$(LIB_OBJS) gdisk.o
 	$(CXX) $(LIB_OBJS) gdisk.o -o gdisk
 
 sgdisk: $(LIB_OBJS) sgdisk.o
-	$(CXX) $(LIB_OBJS) sgdisk.o -L/opt/local/lib -lpopt -o sgdisk
+	$(CXX) $(LIB_OBJS) sgdisk.o -L/opt/local/lib -L/usr/local/lib -lpopt -o sgdisk
 
 wipegpt:	$(LIB_OBJS) wipegpt.o
 	$(CXX) $(LIB_OBJS) wipegpt.o -o wipegpt
diff --git a/README b/README
index ce7ffb57df37d79377ed14a18b1d6255b3c09d1e..cfca4fad61ffa481e21dd687c2b3b440378eabc6 100644
--- a/README
+++ b/README
@@ -7,8 +7,8 @@ Introduction
 This software is intended as a (somewhat) fdisk-workalike program for
 GPT-partitioned disks. Although libparted and programs that use it (GNU
 Parted, gparted, etc.) provide the ability to handle GPT disks, they have
-certain limitations that gdisk overcomes. Specific advantages of gdisk
-include:
+certain limitations that gdisk overcomes. Specific advantages of gdisk and
+sgdisk include:
 
 * The ability to convert MBR-partitioned disks in-place to GPT format,
   without losing data
@@ -25,7 +25,7 @@ include:
   disk
 
 * A user interface that's familiar to long-time users of Linux
-  fdisk
+  fdisk (gdisk only)
 
 * The MBR boot loader code is left alone (GNU Parted tends to
   wipe it out with every change)
@@ -33,25 +33,31 @@ include:
 * The ability to create a hybrid MBR, which permits GPT-unaware
   OSes to access up to three GPT partitions on the disk
 
-Of course, gdisk isn't without its limitations. Most notably, it lacks the
-filesystem awareness and filesystem-related features of GNU Parted. You
+Of course, GPT fdisk isn't without its limitations. Most notably, it lacks
+the filesystem awareness and filesystem-related features of GNU Parted. You
 can't resize a partition's filesystem or create a partition with a
 filesystem already in place with gdisk, for instance. There's no GUI
 version of gdisk.
 
+The GPT fdisk package provides two program files: the interactive text-mode
+gdisk and the command-line-driven sgdisk. The former is intended for use in
+manually partitioning disks or changing partitioning details; the latter is
+intended for use in scripts to help automate tasks such as disk cloning or
+preparing multiple disks for Linux installation.
+
 Installing
 ----------
 
-To compile gdisk, you must have appropriate development tools installed,
-most notably the GNU Compiler Collection (GCC) and its g++ compiler for
-C++. The sgdisk program also requires the popt library and its development
-files (headers). Most Linux distributions install popt by default, but you
-may need to install a package called popt-dev, popt-devel, or something
-similar to obtain the development libraries. Mac OS users can find a version
-of popt for Mac OS from http://popt.darwinports.com; however, you'll first
-need to install DarwinPorts (instructions exist on the preceding page).
-Alternatively, you can compile gdisk alone, without sgdisk; gdisk doesn't
-require popt.
+To compile GPT fdisk, you must have appropriate development tools
+installed, most notably the GNU Compiler Collection (GCC) and its g++
+compiler for C++. The sgdisk program also requires the popt library and its
+development files (headers). Most Linux distributions install popt by
+default, but you may need to install a package called popt-dev, popt-devel,
+or something similar to obtain the header files. Mac OS users can find a
+version of popt for Mac OS from http://popt.darwinports.com; however,
+you'll first need to install DarwinPorts (instructions exist on the
+preceding page). Alternatively, you can compile gdisk alone, without
+sgdisk; gdisk doesn't require popt.
 
 When all the necessary development tools and libraries are installed, you
 can uncompress the package and type "make" at the command prompt in the
diff --git a/gdisk.cc b/gdisk.cc
index 120e68e6ac75c0e39fc1dea00fefcf2eea3e9aa6..ef3beb149f8364627430b47806dcb75d15afb55c 100644
--- a/gdisk.cc
+++ b/gdisk.cc
@@ -28,7 +28,7 @@ int main(int argc, char* argv[]) {
    int doMore = 1;
    char* device = NULL;
 
-   printf("GPT fdisk (gdisk) version 0.5.4-pre1\n\n");
+   printf("GPT fdisk (gdisk) version %s\n\n", GPTFDISK_VERSION);
 
     if (argc == 2) { // basic usage
       if (SizesOK()) {
diff --git a/gpt.cc b/gpt.cc
index 7788aa8ff3588d94bcea0c3cf19a34fae05c4411..fafadeeffe75e859cd276a6089ce60a71641b341 100644
--- a/gpt.cc
+++ b/gpt.cc
@@ -74,7 +74,8 @@ GPTData::GPTData(char* filename) {
    whichWasUsed = use_new;
    srand((unsigned int) time(NULL));
    mainHeader.numParts = 0;
-   LoadPartitions(filename);
+   if (!LoadPartitions(filename))
+      exit(2);
 } // GPTData(char* filename) constructor
 
 // Destructor
@@ -573,6 +574,10 @@ int GPTData::LoadPartitions(char* deviceFilename) {
             ClearGPTData();
             protectiveMBR.MakeProtectiveMBR();
             break;
+         case use_abort:
+            allOK = 0;
+            printf("Aborting because of invalid partition data!\n");
+            break;
       } // switch
 
       // Now find the first and last sectors used by partitions...
@@ -586,8 +591,8 @@ int GPTData::LoadPartitions(char* deviceFilename) {
             if (partitions[i].GetLastLBA() > lastBlock)
                lastBlock = partitions[i].GetLastLBA();
          } // for
+         CheckGPTSize();
       } // if
-      CheckGPTSize();
    } else {
       allOK = 0;
       fprintf(stderr, "Problem opening %s for reading! Error is %d\n",
@@ -1427,12 +1432,14 @@ WhichToUse GPTData::UseWhichPartitions(void) {
    } // if
 
    if ((state == gpt_valid) && (mbrState == gpt)) {
-      printf("Found valid GPT with protective MBR; using GPT.\n");
       which = use_gpt;
+      if (!beQuiet)
+         printf("Found valid GPT with protective MBR; using GPT.\n");
    } // if
    if ((state == gpt_valid) && (mbrState == hybrid)) {
-      printf("Found valid GPT with hybrid MBR; using GPT.\n");
       which = use_gpt;
+      if (!beQuiet)
+         printf("Found valid GPT with hybrid MBR; using GPT.\n");
    } // if
    if ((state == gpt_valid) && (mbrState == invalid)) {
       printf("\aFound valid GPT with corrupt MBR; using GPT and will create new\nprotective MBR on save.\n");
@@ -1440,44 +1447,50 @@ WhichToUse GPTData::UseWhichPartitions(void) {
       protectiveMBR.MakeProtectiveMBR();
    } // if
    if ((state == gpt_valid) && (mbrState == mbr)) {
-      printf("Found valid MBR and GPT. Which do you want to use?\n");
-      answer = GetNumber(1, 3, 2, (char*) " 1 - MBR\n 2 - GPT\n 3 - Create blank GPT\n\nYour answer: ");
-      if (answer == 1) {
-         which = use_mbr;
-      } else if (answer == 2) {
-         which = use_gpt;
-         protectiveMBR.MakeProtectiveMBR();
-         printf("Using GPT and creating fresh protective MBR.\n");
-      } else which = use_new;
-   } // if
-
-   // Nasty decisions here -- GPT is present, but corrupt (bad CRCs or other
-   // problems)
-   if (state == gpt_corrupt) {
-      if ((mbrState == mbr) || (mbrState == hybrid)) {
-         printf("Found valid MBR and corrupt GPT. Which do you want to use? (Using the\n"
-               "GPT MAY permit recovery of GPT data.)\n");
+      if (!beQuiet) {
+         printf("Found valid MBR and GPT. Which do you want to use?\n");
          answer = GetNumber(1, 3, 2, (char*) " 1 - MBR\n 2 - GPT\n 3 - Create blank GPT\n\nYour answer: ");
          if (answer == 1) {
             which = use_mbr;
-//            protectiveMBR.MakeProtectiveMBR();
          } else if (answer == 2) {
             which = use_gpt;
+            protectiveMBR.MakeProtectiveMBR();
+            printf("Using GPT and creating fresh protective MBR.\n");
          } else which = use_new;
-      } else if (mbrState == invalid) {
-         printf("Found invalid MBR and corrupt GPT. What do you want to do? (Using the\n"
-               "GPT MAY permit recovery of GPT data.)\n");
-         answer = GetNumber(1, 2, 1, (char*) " 1 - GPT\n 2 - Create blank GPT\n\nYour answer: ");
-         if (answer == 1) {
+      } else which = use_abort;
+   } // if
+
+   // Nasty decisions here -- GPT is present, but corrupt (bad CRCs or other
+   // problems)
+   if (state == gpt_corrupt) {
+      if (beQuiet) {
+         which = use_abort;
+      } else {
+         if ((mbrState == mbr) || (mbrState == hybrid)) {
+            printf("Found valid MBR and corrupt GPT. Which do you want to use? (Using the\n"
+                  "GPT MAY permit recovery of GPT data.)\n");
+            answer = GetNumber(1, 3, 2, (char*) " 1 - MBR\n 2 - GPT\n 3 - Create blank GPT\n\nYour answer: ");
+            if (answer == 1) {
+               which = use_mbr;
+   //            protectiveMBR.MakeProtectiveMBR();
+            } else if (answer == 2) {
+               which = use_gpt;
+            } else which = use_new;
+         } else if (mbrState == invalid) {
+            printf("Found invalid MBR and corrupt GPT. What do you want to do? (Using the\n"
+                  "GPT MAY permit recovery of GPT data.)\n");
+            answer = GetNumber(1, 2, 1, (char*) " 1 - GPT\n 2 - Create blank GPT\n\nYour answer: ");
+            if (answer == 1) {
+               which = use_gpt;
+            } else which = use_new;
+         } else { // corrupt GPT, MBR indicates it's a GPT disk....
+            printf("\a\a****************************************************************************\n"
+                  "Caution: Found protective or hybrid MBR and corrupt GPT. Using GPT, but disk\n"
+                  "verification and recovery are STRONGLY recommended.\n"
+                  "****************************************************************************\n");
             which = use_gpt;
-         } else which = use_new;
-      } else { // corrupt GPT, MBR indicates it's a GPT disk....
-         printf("\a\a****************************************************************************\n"
-               "Caution: Found protective or hybrid MBR and corrupt GPT. Using GPT, but disk\n"
-               "verification and recovery are STRONGLY recommended.\n"
-               "****************************************************************************\n");
-         which = use_gpt;
-      } // if/else/else
+         } // if/else/else
+      } // else (beQuiet)
    } // if (corrupt GPT)
 
    if (which == use_new)
diff --git a/gpt.h b/gpt.h
index 3fa1f5dda7b966f61f3fdd6a720866c22fa73af9..2dab928014b4fdb224a747fc6db9e013ad16e6b4 100644
--- a/gpt.h
+++ b/gpt.h
@@ -16,6 +16,7 @@
 #ifndef __GPTSTRUCTS
 #define __GPTSTRUCTS
 
+#define GPTFDISK_VERSION "0.6.0"
 
 using namespace std;
 
@@ -29,7 +30,7 @@ using namespace std;
 enum GPTValidity {gpt_valid, gpt_corrupt, gpt_invalid};
 
 // Which set of partition data to use
-enum WhichToUse {use_gpt, use_mbr, use_bsd, use_new};
+enum WhichToUse {use_gpt, use_mbr, use_bsd, use_new, use_abort};
 
 // Header (first 512 bytes) of GPT table
 #pragma pack(1)
diff --git a/sgdisk.8 b/sgdisk.8
index 48a740d2a6e2999570acf9999044d10288aeab55..29debf28b7d9bd5e68b686259cb31652e7f745df 100644
--- a/sgdisk.8
+++ b/sgdisk.8
@@ -206,9 +206,9 @@ sectors are available, this function returns the value 0.
 
 .TP 
 .B \-g, \-\-mbrtogpt
-Convert an MBR disk to a GPT disk. As a safety measure, use of this option
-is required on MBR or BSD disklabel disks if you intend to save your changes,
-in order to prevent accidentally damaging such disks.
+Convert an MBR or BSD disklabel disk to a GPT disk. As a safety measure, use of
+this option is required on MBR or BSD disklabel disks if you intend to save your
+changes, in order to prevent accidentally damaging such disks.
 
 .TP 
 .B \-i, \-\-info=partnum
@@ -342,7 +342,7 @@ Normal program execution
 Too few arguments
 
 .TP 
-.B 4
+.B 2
 An error occurred while reading the partition table
 
 .TP 
diff --git a/sgdisk.cc b/sgdisk.cc
index 027e37f11d996304e054e00a4641996081473564..5c346b796237e7adb5f214193bcf627f3d5acd7d 100644
--- a/sgdisk.cc
+++ b/sgdisk.cc
@@ -87,7 +87,7 @@ int main(int argc, char *argv[]) {
             pretend = 1;
             break;
          case 'V':
-            printf("GPT fdisk (sgdisk) version 0.5.4-pre1\n\n");
+            printf("GPT fdisk (sgdisk) version %s\n\n", GPTFDISK_VERSION);
             break;
          default:
             break;