diff --git a/gpt.cc b/gpt.cc
index 3bd56c5..9bb6763 100644
--- a/gpt.cc
+++ b/gpt.cc
@@ -96,9 +96,10 @@
 // do *NOT* recover from these problems. Returns the total number of
 // problems identified.
 int GPTData::Verify(void) {
-   int problems = 0, numSegments, i;
-   uint64_t totalFree, largestSegment, firstSector;
-   char tempStr[255], siTotal[255], siLargest[255];
+   int problems = 0;
+   uint32_t i, numSegments;
+   uint64_t totalFree, largestSegment;
+   char siTotal[255], siLargest[255];
 
    // First, check for CRC errors in the GPT data....
    if (!mainCrcOk) {
@@ -458,7 +459,8 @@
 // Search for hybrid MBR entries that have no corresponding GPT partition.
 // Returns number of such mismatches found
 int GPTData::FindHybridMismatches(void) {
-   int i, j, found, numFound = 0;
+   int i, found, numFound = 0;
+   uint32_t j;
    uint64_t mbrFirst, mbrLast;
 
    for (i = 0; i < 4; i++) {
@@ -493,7 +495,8 @@
 // Find overlapping partitions and warn user about them. Returns number of
 // overlapping partitions.
 int GPTData::FindOverlaps(void) {
-   int i, j, problems = 0;
+   int problems = 0;
+   uint32_t i, j;
 
    for (i = 1; i < mainHeader.numParts; i++) {
       for (j = 0; j < i; j++) {
@@ -551,8 +554,8 @@
 
 // Read GPT data from a disk.
 int GPTData::LoadPartitions(const string & deviceFilename) {
-   int err;
-   int allOK = 1, i;
+   int err, allOK = 1;
+   uint32_t i;
    uint64_t firstBlock, lastBlock;
    BSDData bsdDisklabel;
    MBRValidity mbrState;
@@ -568,11 +571,9 @@
            << "program.\n";
 #endif
       cout << "\n";
-//      justLooking = 1;
    } // if
    myDisk.Close();
 
-//   if ((fd = open(deviceFilename, O_RDONLY)) != -1) {
    if (myDisk.OpenForRead(deviceFilename)) {
       // store disk information....
       diskSize = myDisk.DiskSize(&err);
@@ -737,7 +738,7 @@
       if ((myDisk.Seek(seekTo)) && (secondCrcOk)) {
          sizeOfParts = secondHeader.numParts * secondHeader.sizeOfPartitionEntries;
          storage = (uint8_t*) malloc(sizeOfParts);
-         if (myDisk.Read(storage, sizeOfParts) != sizeOfParts) {
+         if (myDisk.Read(storage, sizeOfParts) != (int) sizeOfParts) {
             cerr << "Warning! Error " << errno << " reading backup partition table!\n";
          } // if
          newCRC = chksum_crc32((unsigned char*) storage,  sizeOfParts);
@@ -770,7 +771,7 @@
 // sensible!
 // Returns 1 on success, 0 on failure. CRC errors do NOT count as failure.
 int GPTData::LoadMainTable(void) {
-   int fd, retval = 1;
+   int retval = 1;
    uint32_t newCRC, sizeOfParts;
 
    if (myDisk.OpenForRead(device)) {
@@ -782,7 +783,7 @@
       if (!myDisk.Seek(mainHeader.partitionEntriesLBA))
          retval = 0;
       sizeOfParts = mainHeader.numParts * mainHeader.sizeOfPartitionEntries;
-      if (myDisk.Read(partitions, sizeOfParts) != sizeOfParts) {
+      if (myDisk.Read(partitions, sizeOfParts) != (int) sizeOfParts) {
          cerr << "Warning! Error " << errno << " when loading the main partition table!\n";
          retval = 0;
       } // if
@@ -809,7 +810,7 @@
       if (retval == 1) {
          SetGPTSize(secondHeader.numParts);
          sizeOfParts = secondHeader.numParts * secondHeader.sizeOfPartitionEntries;
-         if (myDisk.Read(partitions, sizeOfParts) != sizeOfParts) {
+         if (myDisk.Read(partitions, sizeOfParts) != (int) sizeOfParts) {
             cerr << "Warning! Read error " << errno << "! Misbehavior now likely!\n";
             retval = 0;
          } // if
@@ -836,7 +837,7 @@
 // write, 0 if there was a problem.
 int GPTData::SaveGPTData(int quiet) {
    int allOK = 1;
-   char answer, line[256];
+   char answer;
    uint64_t secondTable;
    uint32_t numParts;
    uint64_t offset;
@@ -1128,7 +1129,7 @@
          // Load main partition table, and record whether its CRC
          // matches the stored value
          sizeOfParts = numParts * sizeOfEntries;
-         if (backupFile.Read(partitions, sizeOfParts) != sizeOfParts) {
+         if (backupFile.Read(partitions, sizeOfParts) != (int) sizeOfParts) {
             cerr << "Warning! Read error " << errno << "; strange behavior now likely!\n";
          } // if
 
@@ -1184,8 +1185,7 @@
 
 // Display the basic GPT data
 void GPTData::DisplayGPTData(void) {
-   int i;
-//   char tempStr[255];
+   uint32_t i;
    uint64_t temp, totalFree;
 
    cout << "Disk " << device << ": " << diskSize << " sectors, "
@@ -1274,8 +1274,9 @@
 // Interactively create a partition
 void GPTData::CreatePartition(void) {
    uint64_t firstBlock, firstInLargest, lastBlock, sector;
+   uint32_t firstFreePart = 0;
    char prompt[255];
-   int partNum, firstFreePart = 0;
+   int partNum;
 
    // Find first free partition...
    while (partitions[firstFreePart].GetFirstLBA() != 0) {
@@ -1372,7 +1373,7 @@
 // If prompt == -1, don't ask user about proceeding and DO wipe out
 // MBR.
 int GPTData::DestroyGPT(int prompt) {
-   int fd, i, sum, tableSize;
+   int i, sum, tableSize;
    uint8_t blankSector[512], goOn = 'Y', blank = 'N';
    uint8_t* emptyTable;
 
@@ -1590,7 +1591,7 @@
    BSDData disklabel;
 
    if (GetPartRange(&low, &high) != 0) {
-      if ((i < low) || (i > high))
+      if ((i < (int) low) || (i > (int) high))
          partNum = GetPartNum();
       else
          partNum = (uint32_t) i;
@@ -1608,7 +1609,7 @@
 
       // If all is OK, read the disklabel and convert it.
       if (goOn) {
-         goOn = disklabel.ReadBSDData(device, partitions[partNum].GetFirstLBA(),
+         goOn = disklabel.ReadBSDData(&myDisk, partitions[partNum].GetFirstLBA(),
                                       partitions[partNum].GetLastLBA());
          if ((goOn) && (disklabel.IsDisklabel())) {
             numDone = XFormDisklabel(&disklabel, startPart);
@@ -1630,7 +1631,7 @@
 } // GPTData::XFormDisklable(int i)
 
 // Transform the partitions on an already-loaded BSD disklabel...
-int GPTData::XFormDisklabel(BSDData* disklabel, int startPart) {
+int GPTData::XFormDisklabel(BSDData* disklabel, uint32_t startPart) {
    int i, numDone = 0;
 
    if ((disklabel->IsDisklabel()) && (startPart >= 0) &&
@@ -1710,8 +1711,8 @@
 int GPTData::XFormToMBR(void) {
    char line[255];
    char* junk;
-   int i, j, numParts, numConverted = 0;
-   uint32_t partNums[4];
+   int j, numParts, numConverted = 0;
+   uint32_t i, partNums[4];
 
    // Get the numbers of up to four partitions to add to the
    // hybrid MBR....
@@ -1737,7 +1738,7 @@
       } // while
    } // if/else
 
-   for (i = 0; i < numParts; i++) {
+   for (i = 0; i < (uint32_t) numParts; i++) {
       j = partNums[i] - 1;
       cout << "\nCreating entry for partition #" << j + 1 << "\n";
       numConverted += OnePartToMBR(j, i);
@@ -1937,7 +1938,7 @@
 // with another of the same name but different parameters; that one prompts
 // the user for data. This one returns 1 if the operation was successful, 0
 // if a problem was discovered.
-int GPTData::CreatePartition(uint32_t partNum, uint64_t startSector, uint64_t endSector) {
+uint32_t GPTData::CreatePartition(uint32_t partNum, uint64_t startSector, uint64_t endSector) {
    int retval = 1; // assume there'll be no problems
 
    if (IsFreePartNum(partNum)) {
@@ -2195,7 +2196,7 @@
 
 // Returns the number of defined partitions.
 uint32_t GPTData::CountParts(void) {
-   int i, counted = 0;
+   uint32_t i, counted = 0;
 
    for (i = 0; i < mainHeader.numParts; i++) {
       if (partitions[i].GetFirstLBA() > 0)
@@ -2312,13 +2313,13 @@
 
 // Finds the total number of free blocks, the number of segments in which
 // they reside, and the size of the largest of those segments
-uint64_t GPTData::FindFreeBlocks(int *numSegments, uint64_t *largestSegment) {
+uint64_t GPTData::FindFreeBlocks(uint32_t *numSegments, uint64_t *largestSegment) {
    uint64_t start = UINT64_C(0); // starting point for each search
    uint64_t totalFound = UINT64_C(0); // running total
    uint64_t firstBlock; // first block in a segment
    uint64_t lastBlock; // last block in a segment
    uint64_t segmentSize; // size of segment in blocks
-   int num = 0;
+   uint32_t num = 0;
 
    *largestSegment = UINT64_C(0);
    do {
