diff --git a/gpt.cc b/gpt.cc
index 269e09b..0281b3f 100644
--- a/gpt.cc
+++ b/gpt.cc
@@ -277,7 +277,7 @@
    // Check that partitions are aligned on proper boundaries (for WD Advanced
    // Format and similar disks)....
    for (i = 0; i < numParts; i++) {
-      if ((partitions[i].GetFirstLBA() % sectorAlignment) != 0) {
+      if ((partitions[i].IsUsed()) && (partitions[i].GetFirstLBA() % sectorAlignment) != 0) {
          cout << "\nCaution: Partition " << i + 1 << " doesn't begin on a "
               << sectorAlignment << "-sector boundary. This may\nresult "
               << "in degraded performance on some modern (2009 and later) hard disks.\n";
@@ -316,11 +316,14 @@
    firstUsedBlock = UINT64_MAX;
    lastUsedBlock = 0;
    for (i = 0; i < numParts; i++) {
-      if ((partitions[i].GetFirstLBA() < firstUsedBlock) &&
-           (partitions[i].GetFirstLBA() != 0))
-         firstUsedBlock = partitions[i].GetFirstLBA();
-      if (partitions[i].GetLastLBA() > lastUsedBlock)
-         lastUsedBlock = partitions[i].GetLastLBA();
+      if (partitions[i].IsUsed()) {
+         if ((partitions[i].GetFirstLBA() < firstUsedBlock) &&
+            (partitions[i].GetFirstLBA() != 0))
+            firstUsedBlock = partitions[i].GetFirstLBA();
+         if (partitions[i].GetLastLBA() > lastUsedBlock) {
+            lastUsedBlock = partitions[i].GetLastLBA();
+         } // if
+      } // if
    } // for
 
    // If the disk size is 0 (the default), then it means that various
@@ -555,7 +558,7 @@
          mbrLast = mbrFirst + (uint64_t) protectiveMBR.GetLength(i) - UINT64_C(1);
          do {
             if ((partitions[j].GetFirstLBA() == mbrFirst) &&
-                (partitions[j].GetLastLBA() == mbrLast))
+                (partitions[j].GetLastLBA() == mbrLast) && (partitions[j].IsUsed()))
                found = 1;
             j++;
          } while ((!found) && (j < numParts));
@@ -585,7 +588,8 @@
 
    for (i = 1; i < numParts; i++) {
       for (j = 0; j < i; j++) {
-         if (partitions[i].DoTheyOverlap(partitions[j])) {
+         if ((partitions[i].IsUsed()) && (partitions[j].IsUsed()) &&
+             (partitions[i].DoTheyOverlap(partitions[j]))) {
             problems++;
             cout << "\nProblem: partitions " << i + 1 << " and " << j + 1 << " overlap:\n";
             cout << "  Partition " << i + 1 << ": " << partitions[i].GetFirstLBA()
@@ -608,13 +612,15 @@
    int problems = 0;
 
    for (i = 0; i < numParts; i++) {
-      if (partitions[i].GetFirstLBA() > partitions[i].GetLastLBA()) {
-         problems++;
-         cout << "\nProblem: partition " << i + 1 << " ends before it begins.\n";
-      } // if
-      if (partitions[i].GetLastLBA() >= diskSize) {
-         problems++;
-      cout << "\nProblem: partition " << i + 1 << " is too big for the disk.\n";
+      if (partitions[i].IsUsed()) {
+         if (partitions[i].GetFirstLBA() > partitions[i].GetLastLBA()) {
+            problems++;
+            cout << "\nProblem: partition " << i + 1 << " ends before it begins.\n";
+         } // if
+         if (partitions[i].GetLastLBA() >= diskSize) {
+            problems++;
+         cout << "\nProblem: partition " << i + 1 << " is too big for the disk.\n";
+         } // if
       } // if
    } // for
    return problems;
@@ -1834,7 +1840,7 @@
    int retval = 0;
 
    if (pn < numParts) {
-      if (partitions[pn].GetFirstLBA() != UINT64_C(0)) {
+      if (partitions[pn].IsUsed()) {
          partitions[pn].SetUniqueGUID(theGUID);
          retval = 1;
       } // if
@@ -1944,7 +1950,7 @@
    *low = numParts + 1; // code for "not found"
    *high = 0;
    for (i = 0; i < numParts; i++) {
-      if (partitions[i].GetFirstLBA() != UINT64_C(0)) { // it exists
+      if (partitions[i].IsUsed()) { // it exists
          *high = i; // since we're counting up, set the high value
          // Set the low value only if it's not yet found...
          if (*low == (numParts + 1)) *low = i;
@@ -2012,7 +2018,7 @@
    do {
       firstMoved = 0;
       for (i = 0; i < numParts; i++) {
-         if ((first >= partitions[i].GetFirstLBA()) &&
+         if ((partitions[i].IsUsed()) && (first >= partitions[i].GetFirstLBA()) &&
              (first <= partitions[i].GetLastLBA())) { // in existing part.
             first = partitions[i].GetLastLBA() + 1;
             firstMoved = 1;
@@ -2298,7 +2304,8 @@
 
 // Show all attributes for a specified partition....
 void GPTData::ShowAttributes(const uint32_t partNum) {
-   partitions[partNum].ShowAttributes(partNum);
+   if (partitions[partNum].IsUsed())
+      partitions[partNum].ShowAttributes(partNum);
 } // GPTData::ShowAttributes
 
 // Show whether a single attribute bit is set (terse output)...
