Bring git up to 0.6.6 release version.
diff --git a/gpt.cc b/gpt.cc
index a407d37..9b1faf6 100644
--- a/gpt.cc
+++ b/gpt.cc
@@ -608,7 +608,6 @@
       // store disk information....
       diskSize = myDisk.DiskSize(&err);
       blockSize = (uint32_t) myDisk.GetBlockSize();
-      sectorAlignment = myDisk.FindAlignment();
       device = deviceFilename;
       PartitionScan(); // Check for partition types, load GPT, & print summary
 
@@ -928,28 +927,24 @@
 
    // Do it!
    if (allOK) {
-      // First, write the protective MBR...
-      allOK = protectiveMBR.WriteMBRData(&myDisk);
-
-      if (allOK && myDisk.OpenForWrite(device)) {
-         // Now write the main GPT header...
-         allOK = SaveHeader(&mainHeader, myDisk, 1);
-
-         // Now write the main partition tables...
-         if (allOK) {
-            allOK = SavePartitionTable(myDisk, mainHeader.partitionEntriesLBA);
-         } // if (allOK)
-
-         // Now seek to near the end to write the secondary GPT....
+      if (myDisk.OpenForWrite(device)) {
+         // As per UEFI specs, write the secondary table and GPT first....
          allOK = SavePartitionTable(myDisk, secondHeader.partitionEntriesLBA);
          if (!allOK)
             cerr << "Unable to save backup partition table! Perhaps the 'e' option on the experts'\n"
                  << "menu will resolve this problem.\n";
 
          // Now write the secondary GPT header...
-         if (allOK) {
-            allOK = SaveHeader(&secondHeader, myDisk, mainHeader.backupLBA);
-         } // if (allOK)
+         allOK = allOK && SaveHeader(&secondHeader, myDisk, mainHeader.backupLBA);
+
+         // Now write the main partition tables...
+         allOK = allOK && SavePartitionTable(myDisk, mainHeader.partitionEntriesLBA);
+
+         // Now write the main GPT header...
+         allOK = allOK && SaveHeader(&mainHeader, myDisk, 1);
+
+         // To top it off, write the protective MBR...
+         allOK = allOK && protectiveMBR.WriteMBRData(&myDisk);
 
          // re-read the partition table
          if (allOK) {
@@ -960,9 +955,9 @@
             cout << "The operation has completed successfully.\n";
          } else {
             cerr << "Warning! An error was reported when writing the partition table! This error\n"
-                 << "MIGHT be harmless, but you may have trashed the disk! Use parted and, if\n"
-                 << "necessary, restore your original partition table.\n";
+                 << "MIGHT be harmless, but you may have trashed the disk!\n";
          } // if/else
+
          myDisk.Close();
       } else {
          cerr << "Unable to open device " << device << " for writing! Errno is "
@@ -1259,6 +1254,7 @@
    cout << "First usable sector is " << mainHeader.firstUsableLBA
         << ", last usable sector is " << mainHeader.lastUsableLBA << "\n";
    totalFree = FindFreeBlocks(&i, &temp);
+   cout << "Partitions will be aligned on " << sectorAlignment << "-sector boundaries\n";
    cout << "Total free space is " << totalFree << " sectors ("
         << BytesToSI(totalFree * (uint64_t) blockSize) << ")\n";
    cout << "\nNumber  Start (sector)    End (sector)  Size       Code  Name\n";
@@ -1752,6 +1748,7 @@
    for (i = 0; i < GPT_RESERVED; i++) {
       mainHeader.reserved2[i] = '\0';
    } // for
+   sectorAlignment = DEFAULT_ALIGNMENT;
 
    // Now some semi-static items (computed based on end of disk)
    mainHeader.backupLBA = diskSize - UINT64_C(1);
@@ -1878,14 +1875,16 @@
       // Otherwise, notify the user that it couldn't be done....
       if (sectorOK == 1) {
          cout << "Information: Moved requested sector from " << original << " to "
-              << *sector << " for\nalignment purposes.\n";
+              << *sector << " in\norder to align on " << sectorAlignment
+              << "-sector boundaries.\n";
          if (!beQuiet)
             cout << "Use 'l' on the experts' menu to adjust alignment\n";
       } else {
          cout << "Information: Sector not aligned on " << sectorAlignment
               << "-sector boundary and could not be moved.\n"
               << "If you're using a Western Digital Advanced Format or similar disk with\n"
-              << "underlying 4096-byte sectors, performance may suffer.\n";
+              << "underlying 4096-byte sectors or certain types of RAID array, performance\n"
+              << "may suffer.\n";
          retval = 0;
       } // if/else
    } // if
@@ -2139,26 +2138,25 @@
 
    sectorAlignment = n;
    l2 = (uint32_t) log2(n);
-   if (PowerOf2(l2) != n)
-      cout << "Information: Your alignment value is not a power of 2.\n";
 } // GPTData::SetAlignment()
 
 // Compute sector alignment based on the current partitions (if any). Each
 // partition's starting LBA is examined, and if it's divisible by a power-of-2
-// value less than the maximum found so far (or 2^31 for the first partition
-// found), then the alignment value is adjusted down. If the computed
-// alignment is less than 8 and the disk is bigger than SMALLEST_ADVANCED_FORMAT,
-// resets it to 8. This is a safety measure for WD Advanced Format and
-// similar drives. If no partitions are defined, the alignment value is set
-// to DEFAULT_ALIGNMENT (2048). The result is that new drives are aligned to
-// 2048-sector multiples but the program won't complain about other alignments
-// on existing disks unless a smaller-than-8 alignment is used on small disks
-// (as safety for WD Advanced Format drives).
+// value less than or equal to the DEFAULT_ALIGNMENT value, but not by the
+// previously-located alignment value, then the alignment value is adjusted
+// down. If the computed alignment is less than 8 and the disk is bigger than
+// SMALLEST_ADVANCED_FORMAT, resets it to 8. This is a safety measure for WD
+// Advanced Format and similar drives. If no partitions are defined, the
+// alignment value is set to DEFAULT_ALIGNMENT (2048). The result is that new
+// drives are aligned to 2048-sector multiples but the program won't complain
+// about other alignments on existing disks unless a smaller-than-8 alignment
+// is used on small disks (as safety for WD Advanced Format drives).
 // Returns the computed alignment value.
 uint32_t GPTData::ComputeAlignment(void) {
    uint32_t i = 0, found, exponent = 31;
    uint64_t align = DEFAULT_ALIGNMENT;
 
+   exponent = (uint32_t) log2(DEFAULT_ALIGNMENT);
    for (i = 0; i < mainHeader.numParts; i++) {
       if (partitions[i].IsUsed()) {
          found = 0;
@@ -2174,7 +2172,6 @@
    } // for
    if ((align < 8) && (diskSize >= SMALLEST_ADVANCED_FORMAT))
       align = 8;
-//   cout << "Setting alignment to " << align << "\n";
    SetAlignment(align);
    return align;
 } // GPTData::ComputeAlignment()