diff --git a/avrdude/Makefile b/avrdude/Makefile
index 95e2618d..06e08b90 100644
--- a/avrdude/Makefile
+++ b/avrdude/Makefile
@@ -30,8 +30,8 @@ all : ${TARGET}
 ${TARGET} : ${OBJS}
 	${CC} ${LDFLAGS} -o ${TARGET} ${OBJS} ${LIBS}
 
-main.o   : avr.h fileio.h ppi.h term.h
-avr.o    : avr.h ppi.h
+main.o   : avr.h fileio.h ppi.h term.h pindefs.h
+avr.o    : avr.h ppi.h pindefs.h
 fileio.o : fileio.h avr.h
 ppi.o    : ppi.h
 term.o   : term.h avr.h
diff --git a/avrdude/avr.c b/avrdude/avr.c
index 88d93754..5413a91d 100644
--- a/avrdude/avr.c
+++ b/avrdude/avr.c
@@ -35,6 +35,7 @@
 
 
 #include "avr.h"
+#include "pindefs.h"
 #include "ppi.h"
 
 
@@ -172,6 +173,8 @@ unsigned char avr_read_byte ( int fd, struct avrpart * p,
   /* order here is very important, AVR_EEPROM, AVR_FLASH, AVR_FLASH+1 */
   static unsigned char cmdbyte[3] = { 0xa0, 0x20, 0x28 };
 
+  LED_ON(fd, PIN_LED_PGM);
+
   offset = 0;
 
   if (memtype == AVR_FLASH) {
@@ -186,6 +189,8 @@ unsigned char avr_read_byte ( int fd, struct avrpart * p,
 
   avr_cmd(fd, cmd, res);
 
+  LED_OFF(fd, PIN_LED_PGM);
+
   return res[3];
 }
 
@@ -244,6 +249,8 @@ int avr_write_byte ( int fd, struct avrpart * p, AVRMEM memtype,
     return 0;
   }
 
+  LED_ON(fd, PIN_LED_PGM);
+
   offset = 0;
 
   caddr = addr;
@@ -285,10 +292,12 @@ int avr_write_byte ( int fd, struct avrpart * p, AVRMEM memtype,
        * we couldn't write the data, indicate our displeasure by
        * returning an error code 
        */
+      LED_OFF(fd, PIN_LED_PGM);
       return -1;
     }
   }
 
+  LED_OFF(fd, PIN_LED_PGM);
   return 0;
 }
 
@@ -310,6 +319,8 @@ int avr_write ( int fd, struct avrpart * p, AVRMEM memtype, int size )
   unsigned short   i;
   unsigned char    data;
 
+  LED_OFF(fd, PIN_LED_ERR);
+
   buf   = p->mem[memtype];
   wsize = p->memsize[memtype];
   if (size < wsize) {
@@ -331,6 +342,7 @@ int avr_write ( int fd, struct avrpart * p, AVRMEM memtype, int size )
     if (rc) {
       fprintf(stderr, " ***failed;  ");
       fprintf(stderr, "\n");
+      LED_ON(fd, PIN_LED_ERR);
     }
   }
 
@@ -365,10 +377,14 @@ int avr_chip_erase ( int fd, struct avrpart * p )
   unsigned char data[4] = {0xac, 0x80, 0x00, 0x00};
   unsigned char res[4];
 
+  LED_ON(fd, PIN_LED_PGM);
+
   avr_cmd(fd, data, res);
   usleep(p->chip_erase_delay);
   avr_initialize(fd, p);
 
+  LED_OFF(fd, PIN_LED_PGM);
+
   return 0;
 }
 
diff --git a/avrdude/avr.h b/avrdude/avr.h
index a77adca5..d3c8edda 100644
--- a/avrdude/avr.h
+++ b/avrdude/avr.h
@@ -34,20 +34,6 @@
 
 #include <stdio.h>
 
-
-#define PPI_AVR_VCC    0x0f  /* ppi pins 2-5, data reg bits 0-3 */
-#define PIN_AVR_BUFF   6
-#define PIN_AVR_RESET  7
-#define PIN_AVR_SCK    8
-#define PIN_AVR_MOSI   9
-#define PIN_AVR_MISO  10
-#define PIN_LED_ERR    1
-#define PIN_LED_RDY   14
-#define PIN_LED_PGM   16
-#define PIN_LED_VFY   17
-
-
-
 /*
  * AVR memory designations; the order of these is important, these are
  * used as indexes into statically initialized data, don't change them
diff --git a/avrdude/main.c b/avrdude/main.c
index 2a365eaf..37686c56 100644
--- a/avrdude/main.c
+++ b/avrdude/main.c
@@ -81,6 +81,7 @@
 
 #include "avr.h"
 #include "fileio.h"
+#include "pindefs.h"
 #include "ppi.h"
 #include "term.h"
 
@@ -105,12 +106,6 @@ void usage ( void )
           "      %s[-i filename] [-m memtype] [-o filename] [-P parallel] [-t]\n\n",
           progname, progbuf);
 
-#if 0
-  fprintf(stderr, "  Valid Parts for the -p option are:\n");
-  avr_list_parts(stderr, "    ");
-  fprintf(stderr, "\n");
-#endif
-
 }
 
 
@@ -407,6 +402,19 @@ int main ( int argc, char * argv [] )
   ppidata &= ~ppiclrbits;
   ppidata |= ppisetbits;
 
+  /* 
+   * turn off all the status leds
+   */
+  LED_OFF(fd, PIN_LED_RDY);
+  LED_OFF(fd, PIN_LED_ERR);
+  LED_OFF(fd, PIN_LED_PGM);
+  LED_OFF(fd, PIN_LED_VFY);
+
+  /*
+   * enable the 74367 buffer, if connected; this signal is active low
+   */
+  ppi_setpin(fd, PIN_AVR_BUFF, 0);
+
   /*
    * initialize the chip in preperation for accepting commands
    */
@@ -417,6 +425,9 @@ int main ( int argc, char * argv [] )
     goto main_exit;
   }
 
+  /* indicate ready */
+  LED_ON(fd, PIN_LED_RDY);
+
   fprintf ( stderr, 
             "%s: AVR device initialized and ready to accept instructions\n",
             progname );
@@ -556,6 +567,8 @@ int main ( int argc, char * argv [] )
      * verify that the in memory file (p->flash or p->eeprom) is the
      * same as what is on the chip 
      */
+    LED_ON(fd, PIN_LED_VFY);
+
     fprintf(stderr, "%s: verifying %s memory against %s:\n", 
             progname, avr_memtstr(memtype), inputf);
     fprintf(stderr, "%s: reading on-chip %s data:\n", 
@@ -564,6 +577,7 @@ int main ( int argc, char * argv [] )
     if (rc < 0) {
       fprintf(stderr, "%s: failed to read all of %s memory, rc=%d\n", 
               progname, avr_memtstr(memtype), rc);
+      LED_ON(fd, PIN_LED_ERR);
       exitrc = 1;
       goto main_exit;
     }
@@ -573,12 +587,15 @@ int main ( int argc, char * argv [] )
     if (rc < 0) {
       fprintf(stderr, "%s: verification error; content mismatch\n", 
               progname);
+      LED_ON(fd, PIN_LED_ERR);
       exitrc = 1;
       goto main_exit;
     }
     
     fprintf(stderr, "%s: %d bytes of %s verified\n", 
             progname, rc, avr_memtstr(memtype));
+
+    LED_OFF(fd, PIN_LED_VFY);
   }
 
 
@@ -592,6 +609,11 @@ int main ( int argc, char * argv [] )
   avr_powerdown(fd);
   ppi_setall(fd, PPIDATA, ppidata);
 
+  /*
+   * disable the 74367 buffer, if connected; this signal is active low 
+   */
+  ppi_setpin(fd, PIN_AVR_BUFF, 1);
+
   close(fd);
 
   fprintf(stderr, "\n%s done.  Thank you.\n\n", progname);
diff --git a/avrdude/pindefs.h b/avrdude/pindefs.h
new file mode 100644
index 00000000..10c60309
--- /dev/null
+++ b/avrdude/pindefs.h
@@ -0,0 +1,49 @@
+/*
+ * Copyright 2000  Brian S. Dean <bsd@bsdhome.com>
+ * All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BRIAN S. DEAN ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL BRIAN S. DEAN BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
+ * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+ * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
+ * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ * 
+ */
+
+/* $Id$ */
+
+#ifndef __pindefs_h__
+#define __pindefs_h__
+
+#define PPI_AVR_VCC    0x0f  /* ppi pins 2-5, data reg bits 0-3 */
+#define PIN_AVR_BUFF   6
+#define PIN_AVR_RESET  7
+#define PIN_AVR_SCK    8
+#define PIN_AVR_MOSI   9
+#define PIN_AVR_MISO  10
+#define PIN_LED_ERR    1
+#define PIN_LED_RDY   14
+#define PIN_LED_PGM   16
+#define PIN_LED_VFY   17
+
+#define LED_ON(fd,pin)  ppi_setpin(fd,pin,0)
+#define LED_OFF(fd,pin) ppi_setpin(fd,pin,1)
+
+#endif
diff --git a/avrdude/ppi.c b/avrdude/ppi.c
index 286f613b..e15573d4 100644
--- a/avrdude/ppi.c
+++ b/avrdude/ppi.c
@@ -310,8 +310,7 @@ int ppi_getpinreg ( int pin )
  */
 int ppi_sense ( int fd )
 {
-  unsigned int r, pr;
-  unsigned int v;
+  unsigned int pr;
   int count;
   char buf[128];
   int i;