diff --git a/sm5/Makefile b/sm5/Makefile
index a3496d744df84a0e0c08769b79107fd206dc5a59..e966995a6e4eed3cee6ccdb74d263e74a697f43f 100644
--- a/sm5/Makefile
+++ b/sm5/Makefile
@@ -1,6 +1,6 @@
 # Makefile for smartmontools
 #
-# $Id: Makefile,v 1.12 2002/10/11 12:48:27 ballen4705 Exp $
+# $Id: Makefile,v 1.13 2002/10/13 13:10:56 ballen4705 Exp $
 #
 # Copyright (C) 2002 Bruce Allen <smartmontools-support@lists.sourceforge.net>
 # 
@@ -14,8 +14,8 @@
 # Mass Ave, Cambridge, MA 02139, USA.
 
 CC	= gcc
-# CFLAGS = -fsigned-char -Wall -g 
-CFLAGS	= -fsigned-char -Wall -O2
+CFLAGS = -fsigned-char -Wall -g 
+# CFLAGS	= -fsigned-char -Wall -O2
 
 releasefiles=atacmds.c atacmds.h ataprint.c ataprint.h CHANGELOG COPYING extern.h Makefile\
   README scsicmds.c scsicmds.h scsiprint.c scsiprint.h smartctl.8 smartctl.c smartctl.h\
diff --git a/sm5/VERSION b/sm5/VERSION
index 00750edc07d6415dcc07ae0351e9397b0222b7ba..7ed6ff82de6bcc2a78243fc9c54d3ef5ac14da69 100644
--- a/sm5/VERSION
+++ b/sm5/VERSION
@@ -1 +1 @@
-3
+5
diff --git a/sm5/atacmds.c b/sm5/atacmds.c
index a7d424ca2ba1d0c4aa3bcccb27b23d3d1048a9cd..c9078886d103e44aa8b484f13161eea41805c87d 100644
--- a/sm5/atacmds.c
+++ b/sm5/atacmds.c
@@ -1,4 +1,4 @@
-//  $Id: atacmds.c,v 1.3 2002/10/12 11:10:01 ballen4705 Exp $
+//  $Id: atacmds.c,v 1.4 2002/10/13 13:10:56 ballen4705 Exp $
 /*
  * atacmds.c
  *
@@ -22,7 +22,8 @@
 #include "atacmds.h"
 
 
-// Drive identity stuff shamelessly ripped from hdparm 5.2
+// These Drive Identity tables are taken from hdparm 5.2. That's the
+// "Gold Standard"
 #define NOVAL_0			0x0000
 #define NOVAL_1			0xffff
 /* word 81: minor version number */
@@ -159,38 +160,30 @@ int ataSmartSupport ( struct hd_driveid drive){
   return 0;
 }
 
-int ataReadSmartValues (int device, struct ata_smart_values *data)
-{	
-   int i;
-   unsigned char chksum;
-   unsigned char buf[ HDIO_DRIVE_CMD_HDR_SIZE + 
-                      ATA_SMART_SEC_SIZE] = 
-                      { WIN_SMART, 0, SMART_READ_VALUES, 1};
-	
-   if (ioctl ( device , HDIO_DRIVE_CMD,  (unsigned char *) &buf ) != 0)
-   {
-       perror ("Smart Values Read failed");
-       return -1;
-   }
-   chksum = 0;
-
-   for ( i =  HDIO_DRIVE_CMD_HDR_SIZE;  
-         i < ATA_SMART_SEC_SIZE + HDIO_DRIVE_CMD_HDR_SIZE; 
-         i++ )
-	chksum +=  buf[i];
-
-   if (  (unsigned char) chksum != 0)
-   {
-       perror ("Smart Read Failed, Chksum error");
-       return -1;
-   }	
-
-   memcpy( data, 
-           &buf[HDIO_DRIVE_CMD_HDR_SIZE] ,
-           ATA_SMART_SEC_SIZE );
-
-   return 0;
-
+int ataReadSmartValues (int device, struct ata_smart_values *data){	
+  int i;
+  unsigned char chksum=0;
+  unsigned char buf[HDIO_DRIVE_CMD_HDR_SIZE+ATA_SMART_SEC_SIZE]= 
+    {WIN_SMART, 0, SMART_READ_VALUES, 1};
+  
+  if (ioctl(device,HDIO_DRIVE_CMD,buf)){
+    perror ("Smart Values Read failed");
+    return -1;
+  }
+  
+  // compute checksum
+  for (i=0;i<ATA_SMART_SEC_SIZE;i++)
+    chksum+=buf[i+HDIO_DRIVE_CMD_HDR_SIZE];
+  
+  // verify that checksum vanishes
+  if (chksum){
+    perror ("Smart Read Failed, Checksum error!");
+    return -1;
+  }	
+  
+  // copy data and return
+  memcpy(data,buf+HDIO_DRIVE_CMD_HDR_SIZE,ATA_SMART_SEC_SIZE);
+  return 0;
 }
 
 
@@ -369,8 +362,9 @@ int ataDisableAutoOffline (int device )
 }
 
 
-int ataSmartStatus (int device )
-{	
+// Not being used correctly.  Must examine the CL and CH registers to
+// see what the smart status was.  How to fix this?  I don't know...
+int ataSmartStatus (int device ){	
    unsigned char parms[4] = { WIN_SMART, 0, SMART_STATUS, 0};
 
    if (ioctl ( device , HDIO_DRIVE_CMD,  &parms) != 0)
@@ -386,7 +380,7 @@ int ataSmartTest (int device, int testtype)
 {	
    unsigned char parms[4] = { WIN_SMART, testtype, 
                     SMART_IMMEDIATE_OFFLINE, 0};
-	
+   
    if (ioctl ( device , HDIO_DRIVE_CMD, &parms) != 0)
    {
        perror ("Smart Offline failed");
diff --git a/sm5/atacmds.cpp b/sm5/atacmds.cpp
index 03ac761a9a59543d79776bfceeec7b59b23b2237..8b209009792b28f766305e41e6ce2e4cf127c09e 100644
--- a/sm5/atacmds.cpp
+++ b/sm5/atacmds.cpp
@@ -1,4 +1,4 @@
-//  $Id: atacmds.cpp,v 1.3 2002/10/12 11:10:01 ballen4705 Exp $
+//  $Id: atacmds.cpp,v 1.4 2002/10/13 13:10:56 ballen4705 Exp $
 /*
  * atacmds.c
  *
@@ -22,7 +22,8 @@
 #include "atacmds.h"
 
 
-// Drive identity stuff shamelessly ripped from hdparm 5.2
+// These Drive Identity tables are taken from hdparm 5.2. That's the
+// "Gold Standard"
 #define NOVAL_0			0x0000
 #define NOVAL_1			0xffff
 /* word 81: minor version number */
@@ -159,38 +160,30 @@ int ataSmartSupport ( struct hd_driveid drive){
   return 0;
 }
 
-int ataReadSmartValues (int device, struct ata_smart_values *data)
-{	
-   int i;
-   unsigned char chksum;
-   unsigned char buf[ HDIO_DRIVE_CMD_HDR_SIZE + 
-                      ATA_SMART_SEC_SIZE] = 
-                      { WIN_SMART, 0, SMART_READ_VALUES, 1};
-	
-   if (ioctl ( device , HDIO_DRIVE_CMD,  (unsigned char *) &buf ) != 0)
-   {
-       perror ("Smart Values Read failed");
-       return -1;
-   }
-   chksum = 0;
-
-   for ( i =  HDIO_DRIVE_CMD_HDR_SIZE;  
-         i < ATA_SMART_SEC_SIZE + HDIO_DRIVE_CMD_HDR_SIZE; 
-         i++ )
-	chksum +=  buf[i];
-
-   if (  (unsigned char) chksum != 0)
-   {
-       perror ("Smart Read Failed, Chksum error");
-       return -1;
-   }	
-
-   memcpy( data, 
-           &buf[HDIO_DRIVE_CMD_HDR_SIZE] ,
-           ATA_SMART_SEC_SIZE );
-
-   return 0;
-
+int ataReadSmartValues (int device, struct ata_smart_values *data){	
+  int i;
+  unsigned char chksum=0;
+  unsigned char buf[HDIO_DRIVE_CMD_HDR_SIZE+ATA_SMART_SEC_SIZE]= 
+    {WIN_SMART, 0, SMART_READ_VALUES, 1};
+  
+  if (ioctl(device,HDIO_DRIVE_CMD,buf)){
+    perror ("Smart Values Read failed");
+    return -1;
+  }
+  
+  // compute checksum
+  for (i=0;i<ATA_SMART_SEC_SIZE;i++)
+    chksum+=buf[i+HDIO_DRIVE_CMD_HDR_SIZE];
+  
+  // verify that checksum vanishes
+  if (chksum){
+    perror ("Smart Read Failed, Checksum error!");
+    return -1;
+  }	
+  
+  // copy data and return
+  memcpy(data,buf+HDIO_DRIVE_CMD_HDR_SIZE,ATA_SMART_SEC_SIZE);
+  return 0;
 }
 
 
@@ -369,8 +362,9 @@ int ataDisableAutoOffline (int device )
 }
 
 
-int ataSmartStatus (int device )
-{	
+// Not being used correctly.  Must examine the CL and CH registers to
+// see what the smart status was.  How to fix this?  I don't know...
+int ataSmartStatus (int device ){	
    unsigned char parms[4] = { WIN_SMART, 0, SMART_STATUS, 0};
 
    if (ioctl ( device , HDIO_DRIVE_CMD,  &parms) != 0)
@@ -386,7 +380,7 @@ int ataSmartTest (int device, int testtype)
 {	
    unsigned char parms[4] = { WIN_SMART, testtype, 
                     SMART_IMMEDIATE_OFFLINE, 0};
-	
+   
    if (ioctl ( device , HDIO_DRIVE_CMD, &parms) != 0)
    {
        perror ("Smart Offline failed");
diff --git a/sm5/atacmds.h b/sm5/atacmds.h
index 1d72bcff78f7ce597e0ba59fa331f5c8eb8f31d4..ace3ccf89bc45497b9e9686754c30603e8a7bf36 100644
--- a/sm5/atacmds.h
+++ b/sm5/atacmds.h
@@ -1,4 +1,4 @@
-//  $Id: atacmds.h,v 1.9 2002/10/12 11:10:01 ballen4705 Exp $
+//  $Id: atacmds.h,v 1.10 2002/10/13 13:10:56 ballen4705 Exp $
 /*
  * atacmds.h
  *
@@ -114,8 +114,13 @@ struct ata_smart_attribute {
   union {
     unsigned short all; 
     struct {
-      unsigned prefailure:1;   
-      unsigned online:1;   
+      unsigned prefailure:1;   // 0=> low attribute from age/usage
+			       // exceeding design limit,
+			       // 1==prefailure
+
+      unsigned online:1;       // 0==> attribute only updated during
+			       // off-line testing. 1==>only updated
+			       // during on-line testing
       unsigned performance:1;
       unsigned errorrate:1;	
       unsigned eventcount:1 ;
@@ -130,6 +135,24 @@ struct ata_smart_attribute {
 } __attribute__ ((packed));
 
 
+// What follows is the ATA/ATAPI-4 Rev 13 data structure equivalent:
+// Table 23 DEVICE SMART DATA STRUCTURE
+#if 0
+struct ata_smart_values {
+  unsigned short int revnumber;
+  struct ata_smart_attribute vendor_attributes [NUMBER_ATA_SMART_ATTRIBUTES];
+  unsigned char offline_data_collection_status;
+  unsigned char vendor_specific_363;  //IBM # segments for offline collection
+  unsigned short int total_time_to_complete_off_line; // IBM different
+  unsigned char vendor_specific_366; // IBM curent segment pointer
+  unsigned char offline_data_collection_capability;
+  unsigned short int smart_capability;
+  unsigned char reserved_370_385;;
+  unsigned char vendor_specific_386-510;  // IBM: self-test failure checkpoint
+  unsigned char chksum;
+} __attribute__ ((packed));
+#endif
+
 
 /* ata_smart_values is format of the read drive Attribute command */
 /* see Table 34 of T13/1321D Rev 1 spec (Device SMART data structure) for *some* info */
@@ -137,9 +160,9 @@ struct ata_smart_values {
   unsigned short int revnumber;
   struct ata_smart_attribute vendor_attributes [NUMBER_ATA_SMART_ATTRIBUTES];
   unsigned char offline_data_collection_status;
-  unsigned char self_test_exec_status;
-  unsigned short int total_time_to_complete_off_line;
-  unsigned char vendor_specific_366;
+  unsigned char self_test_exec_status;  //IBM # segments for offline collection
+  unsigned short int total_time_to_complete_off_line; // IBM different
+  unsigned char vendor_specific_366; // IBM curent segment pointer
   unsigned char offline_data_collection_capability;
   unsigned short int smart_capability;
   unsigned char errorlog_capability;
@@ -165,7 +188,7 @@ struct ata_smart_threshold_entry {
 /* Compare to ata_smart_values above */
 struct ata_smart_thresholds {
   unsigned short int revnumber;
-  struct ata_smart_threshold_entry thres_entries[30];
+  struct ata_smart_threshold_entry thres_entries[NUMBER_ATA_SMART_ATTRIBUTES];
   unsigned char reserved[149];
   unsigned char chksum;
 } __attribute__ ((packed));
diff --git a/sm5/ataprint.c b/sm5/ataprint.c
index 93a5b2b1ddf84b61e2fc1c281b1b27525865b132..5c64fc0b04d83ba8a7fe13e5abaa4c469cf4cbd9 100644
--- a/sm5/ataprint.c
+++ b/sm5/ataprint.c
@@ -1,4 +1,4 @@
-//  $Id: ataprint.c,v 1.7 2002/10/12 11:10:01 ballen4705 Exp $
+//  $Id: ataprint.c,v 1.8 2002/10/13 13:10:56 ballen4705 Exp $
 /*
  * ataprint.c
  *
@@ -308,7 +308,7 @@ void PrintSmartAttribWithThres ( struct ata_smart_values data,
    printf ("Revision Number: %i\n", data.revnumber);
    printf ("Attribute                    Flag     Value Worst Threshold Raw Value\n");
 	
-   for ( i = 0 ; i < 30 ; i++ ){
+   for ( i = 0 ; i < NUMBER_ATA_SMART_ATTRIBUTES ; i++ ){
      // step through all vendor attributes
      if (data.vendor_attributes[i].id && thresholds.thres_entries[i].id){
        ataPrintSmartAttribName(data.vendor_attributes[i].id);
@@ -400,7 +400,7 @@ void ataPrintSmartThresholds (struct ata_smart_thresholds data)
    printf ("SMART Thresholds\n");
    printf ("SMART Threshold Revision Number: %i\n", data.revnumber);
 	
-   for ( i = 0 ; i < 30 ; i++) {
+   for ( i = 0 ; i < NUMBER_ATA_SMART_ATTRIBUTES ; i++) {
       if (data.thres_entries[i].id)	
           printf ("Attribute %3i threshold: %02x (%2i)\n", 
                    data.thres_entries[i].id, 
@@ -527,7 +527,7 @@ void ataPrintSmartSelfTestlog (struct ata_smart_selftestlog data){
     printf("Warning - structure revision number does not match spec!\n");
   
   if (data.mostrecenttest==0){
-    printf("No self-test have been logged\n");
+    printf("No self-tests have been logged\n");
     return;
   }
 
@@ -591,7 +591,7 @@ void ataPsuedoCheckSmart ( struct ata_smart_values data,
                            struct ata_smart_thresholds thresholds) {
    int i;
    int failed = 0;
-   for (i = 0 ; i < 30 ; i++ ) {
+   for (i = 0 ; i < NUMBER_ATA_SMART_ATTRIBUTES ; i++ ) {
      if (data.vendor_attributes[i].id &&   
 	  thresholds.thres_entries[i].id &&
 	  data.vendor_attributes[i].status.flag.prefailure &&
@@ -603,85 +603,110 @@ void ataPsuedoCheckSmart ( struct ata_smart_values data,
      } 
    }   
    printf("%s\n", ( failed )?
-	  "SMART drive overall health self-assessment test result: FAILED!\n"
+	  "SMART overall-health self-assessment test result: FAILED!\n"
 	  "Drive failure expected in less than 24 hours. SAVE ALL DATA\n":
-	  "SMART drive overall health self-assessment test result: PASSED\n");
+	  "SMART overall-health self-assessment test result: PASSED\n");
 }
 
-void ataPrintSmartAttribName ( unsigned char id )
-{
-   switch (id)
-   {
-	
-      case 1:
-         printf("(  1)Raw Read Error Rate    ");
-	 break;
-      case 2:
-         printf("(  2)Throughput Performance ");
-         break;
-      case 3:
-         printf("(  3)Spin Up Time           ");
-         break;
-      case 4:
-         printf("(  4)Start Stop Count       ");
-         break;
-      case 5:
-         printf("(  5)Reallocated Sector Ct  ");
-	 break;
-      case 6:
-         printf("(  6)Read Channel Margin    ");
-	 break;
-      case 7:
-         printf("(  7)Seek Error Rate        ");
-         break;
-      case 8:
-         printf("(  8)Seek Time Performance  ");
-         break;
-      case 9:
-         printf("(  9)Power On Hours         ");
-         break;
-      case 10:
-         printf("( 10)Spin Retry Count       ");
-         break;
-      case 11:
-         printf("( 11)Calibration Retry Count");
-         break;
-      case 12:
-         printf("( 12)Power Cycle Count      ");
-         break;
-      case 13:
-         printf("( 13)Read Soft Error Rate   ");
-         break;
-      case 191:
-         printf("(191)Gsense Error Rate      ");
-         break;
-      case 192:
-         printf("(192)Power-Off Retract Count");
-         break;
-      case 193:
-         printf("(193)Load Cycle Count       ");
-         break;
-      case 194:
-         printf("(194)Temperature            ");
-         break;
-      case 195:
-         printf("(195)Hardware ECC Recovered ");
-         break;
-      case 196:
-         printf("(196)Reallocated Event Count");
-         break;
-      case 197:
-         printf("(197)Current Pending Sector ");
-         break;
-      case 198:
-         printf("(198)Offline Uncorrectable  ");
-         break;
-      case 199:
-         printf("(199)UDMA CRC Error Count   ");
-         break;
-      default:
-         printf("(%3d)Unknown Attribute      ", id);
-         break;
+void ataPrintSmartAttribName ( unsigned char id ){
+  switch (id){
+    
+  case 1:
+    printf("(  1)Raw Read Error Rate    ");
+    break;
+  case 2:
+    printf("(  2)Throughput Performance ");
+    break;
+  case 3:
+    printf("(  3)Spin Up Time           ");
+    break;
+  case 4:
+    printf("(  4)Start Stop Count       ");
+    break;
+  case 5:
+    printf("(  5)Reallocated Sector Ct  ");
+    break;
+  case 6:
+    printf("(  6)Read Channel Margin    ");
+    break;
+  case 7:
+    printf("(  7)Seek Error Rate        ");
+    break;
+  case 8:
+    printf("(  8)Seek Time Performance  ");
+    break;
+  case 9:
+    printf("(  9)Power On Hours         ");
+    break;
+  case 10:
+    printf("( 10)Spin Retry Count       ");
+    break;
+  case 11:
+    printf("( 11)Calibration Retry Count");
+    break;
+  case 12:
+    printf("( 12)Power Cycle Count      ");
+    break;
+  case 13:
+    printf("( 13)Read Soft Error Rate   ");
+    break;
+  case 191:
+    printf("(191)G-Sense Error Rate     ");
+    break;
+  case 192:
+    printf("(192)Power-Off Retract Count");
+    break;
+  case 193:
+    printf("(193)Load Cycle Count       ");
+    break;
+  case 194:
+    printf("(194)Temperature            ");
+    break;
+  case 195:
+    printf("(195)Hardware ECC Recovered ");
+    break;
+  case 196:
+    printf("(196)Reallocated Event Count");
+    break;
+  case 197:
+    printf("(197)Current Pending Sector ");
+    break;
+  case 198:
+    printf("(198)Offline Uncorrectable  ");
+    break;
+  case 199:
+    printf("(199)UDMA CRC Error Count   ");
+    break;
+  case 220:
+    printf("(220)Disk Shift             ");
+    break;
+  case 221:
+    printf("(221)G-Sense Error Rate     ");
+    break;
+  case 222:
+    printf("(222)Loaded Hours           ");
+    break;
+  case 223:
+    printf("(223)Load Retry Count       ");
+    break;
+  case 224:
+    printf("(224)Load Friction          ");
+    break;
+  case 225:
+    printf("(225)Load Cycle Count       ");
+    break;
+  case 226:
+    printf("(226)Load-in Time           ");
+    break;
+  case 227:
+    printf("(227)Torq-amp Count         ");
+    break;
+  case 228:
+    printf("(228)Power-off Retract Count");
+    break;
+  default:
+    printf("(%3d)Unknown Attribute      ", id);
+    break;
   }
 }	
 
diff --git a/sm5/ataprint.cpp b/sm5/ataprint.cpp
index e7d6ed2b38b86a3ca9f69f701e9d63f99997bd7f..be9528222cc21e95eb290858ffc1278af8ea6d47 100644
--- a/sm5/ataprint.cpp
+++ b/sm5/ataprint.cpp
@@ -1,4 +1,4 @@
-//  $Id: ataprint.cpp,v 1.7 2002/10/12 11:10:01 ballen4705 Exp $
+//  $Id: ataprint.cpp,v 1.8 2002/10/13 13:10:56 ballen4705 Exp $
 /*
  * ataprint.c
  *
@@ -308,7 +308,7 @@ void PrintSmartAttribWithThres ( struct ata_smart_values data,
    printf ("Revision Number: %i\n", data.revnumber);
    printf ("Attribute                    Flag     Value Worst Threshold Raw Value\n");
 	
-   for ( i = 0 ; i < 30 ; i++ ){
+   for ( i = 0 ; i < NUMBER_ATA_SMART_ATTRIBUTES ; i++ ){
      // step through all vendor attributes
      if (data.vendor_attributes[i].id && thresholds.thres_entries[i].id){
        ataPrintSmartAttribName(data.vendor_attributes[i].id);
@@ -400,7 +400,7 @@ void ataPrintSmartThresholds (struct ata_smart_thresholds data)
    printf ("SMART Thresholds\n");
    printf ("SMART Threshold Revision Number: %i\n", data.revnumber);
 	
-   for ( i = 0 ; i < 30 ; i++) {
+   for ( i = 0 ; i < NUMBER_ATA_SMART_ATTRIBUTES ; i++) {
       if (data.thres_entries[i].id)	
           printf ("Attribute %3i threshold: %02x (%2i)\n", 
                    data.thres_entries[i].id, 
@@ -527,7 +527,7 @@ void ataPrintSmartSelfTestlog (struct ata_smart_selftestlog data){
     printf("Warning - structure revision number does not match spec!\n");
   
   if (data.mostrecenttest==0){
-    printf("No self-test have been logged\n");
+    printf("No self-tests have been logged\n");
     return;
   }
 
@@ -591,7 +591,7 @@ void ataPsuedoCheckSmart ( struct ata_smart_values data,
                            struct ata_smart_thresholds thresholds) {
    int i;
    int failed = 0;
-   for (i = 0 ; i < 30 ; i++ ) {
+   for (i = 0 ; i < NUMBER_ATA_SMART_ATTRIBUTES ; i++ ) {
      if (data.vendor_attributes[i].id &&   
 	  thresholds.thres_entries[i].id &&
 	  data.vendor_attributes[i].status.flag.prefailure &&
@@ -603,85 +603,110 @@ void ataPsuedoCheckSmart ( struct ata_smart_values data,
      } 
    }   
    printf("%s\n", ( failed )?
-	  "SMART drive overall health self-assessment test result: FAILED!\n"
+	  "SMART overall-health self-assessment test result: FAILED!\n"
 	  "Drive failure expected in less than 24 hours. SAVE ALL DATA\n":
-	  "SMART drive overall health self-assessment test result: PASSED\n");
+	  "SMART overall-health self-assessment test result: PASSED\n");
 }
 
-void ataPrintSmartAttribName ( unsigned char id )
-{
-   switch (id)
-   {
-	
-      case 1:
-         printf("(  1)Raw Read Error Rate    ");
-	 break;
-      case 2:
-         printf("(  2)Throughput Performance ");
-         break;
-      case 3:
-         printf("(  3)Spin Up Time           ");
-         break;
-      case 4:
-         printf("(  4)Start Stop Count       ");
-         break;
-      case 5:
-         printf("(  5)Reallocated Sector Ct  ");
-	 break;
-      case 6:
-         printf("(  6)Read Channel Margin    ");
-	 break;
-      case 7:
-         printf("(  7)Seek Error Rate        ");
-         break;
-      case 8:
-         printf("(  8)Seek Time Performance  ");
-         break;
-      case 9:
-         printf("(  9)Power On Hours         ");
-         break;
-      case 10:
-         printf("( 10)Spin Retry Count       ");
-         break;
-      case 11:
-         printf("( 11)Calibration Retry Count");
-         break;
-      case 12:
-         printf("( 12)Power Cycle Count      ");
-         break;
-      case 13:
-         printf("( 13)Read Soft Error Rate   ");
-         break;
-      case 191:
-         printf("(191)Gsense Error Rate      ");
-         break;
-      case 192:
-         printf("(192)Power-Off Retract Count");
-         break;
-      case 193:
-         printf("(193)Load Cycle Count       ");
-         break;
-      case 194:
-         printf("(194)Temperature            ");
-         break;
-      case 195:
-         printf("(195)Hardware ECC Recovered ");
-         break;
-      case 196:
-         printf("(196)Reallocated Event Count");
-         break;
-      case 197:
-         printf("(197)Current Pending Sector ");
-         break;
-      case 198:
-         printf("(198)Offline Uncorrectable  ");
-         break;
-      case 199:
-         printf("(199)UDMA CRC Error Count   ");
-         break;
-      default:
-         printf("(%3d)Unknown Attribute      ", id);
-         break;
+void ataPrintSmartAttribName ( unsigned char id ){
+  switch (id){
+    
+  case 1:
+    printf("(  1)Raw Read Error Rate    ");
+    break;
+  case 2:
+    printf("(  2)Throughput Performance ");
+    break;
+  case 3:
+    printf("(  3)Spin Up Time           ");
+    break;
+  case 4:
+    printf("(  4)Start Stop Count       ");
+    break;
+  case 5:
+    printf("(  5)Reallocated Sector Ct  ");
+    break;
+  case 6:
+    printf("(  6)Read Channel Margin    ");
+    break;
+  case 7:
+    printf("(  7)Seek Error Rate        ");
+    break;
+  case 8:
+    printf("(  8)Seek Time Performance  ");
+    break;
+  case 9:
+    printf("(  9)Power On Hours         ");
+    break;
+  case 10:
+    printf("( 10)Spin Retry Count       ");
+    break;
+  case 11:
+    printf("( 11)Calibration Retry Count");
+    break;
+  case 12:
+    printf("( 12)Power Cycle Count      ");
+    break;
+  case 13:
+    printf("( 13)Read Soft Error Rate   ");
+    break;
+  case 191:
+    printf("(191)G-Sense Error Rate     ");
+    break;
+  case 192:
+    printf("(192)Power-Off Retract Count");
+    break;
+  case 193:
+    printf("(193)Load Cycle Count       ");
+    break;
+  case 194:
+    printf("(194)Temperature            ");
+    break;
+  case 195:
+    printf("(195)Hardware ECC Recovered ");
+    break;
+  case 196:
+    printf("(196)Reallocated Event Count");
+    break;
+  case 197:
+    printf("(197)Current Pending Sector ");
+    break;
+  case 198:
+    printf("(198)Offline Uncorrectable  ");
+    break;
+  case 199:
+    printf("(199)UDMA CRC Error Count   ");
+    break;
+  case 220:
+    printf("(220)Disk Shift             ");
+    break;
+  case 221:
+    printf("(221)G-Sense Error Rate     ");
+    break;
+  case 222:
+    printf("(222)Loaded Hours           ");
+    break;
+  case 223:
+    printf("(223)Load Retry Count       ");
+    break;
+  case 224:
+    printf("(224)Load Friction          ");
+    break;
+  case 225:
+    printf("(225)Load Cycle Count       ");
+    break;
+  case 226:
+    printf("(226)Load-in Time           ");
+    break;
+  case 227:
+    printf("(227)Torq-amp Count         ");
+    break;
+  case 228:
+    printf("(228)Power-off Retract Count");
+    break;
+  default:
+    printf("(%3d)Unknown Attribute      ", id);
+    break;
   }
 }	
 
diff --git a/sm5/smartmontools.spec b/sm5/smartmontools.spec
index 52aa6312fb4222ace21764f4a50e677749074ef1..201c257ea404a70ce43caec7eb7756a20d4edd27 100644
--- a/sm5/smartmontools.spec
+++ b/sm5/smartmontools.spec
@@ -1,4 +1,4 @@
-Release:  2
+Release:  4
 Summary:	SMARTmontools - for monitoring S.M.A.R.T. disks and devices
 Name:		smartmontools
 Version:	5.0