diff --git a/avr.c b/avr.c
index 4ef15439..77bbc96a 100644
--- a/avr.c
+++ b/avr.c
@@ -60,6 +60,8 @@ AVRPART * avr_new_part(void)
   p->reset_disposition = RESET_DEDICATED;
   p->retry_pulse = PIN_AVR_SCK;
   p->flags = AVRPART_SERIALOK | AVRPART_PARALLELOK;
+  p->config_file[0] = 0;
+  p->lineno = 0;
 
   p->mem = lcreat(NULL, 0);
 
diff --git a/avrdude.conf.sample b/avrdude.conf.sample
index f232bbe2..ceafe60f 100644
--- a/avrdude.conf.sample
+++ b/avrdude.conf.sample
@@ -174,7 +174,6 @@
 #
 default_parallel   = "/dev/ppi0";
 default_serial     = "/dev/cuaa0";
-default_programmer = "stk500";
 
 
 #
diff --git a/avrpart.h b/avrpart.h
index 3bc452e8..b8c01c0b 100644
--- a/avrpart.h
+++ b/avrpart.h
@@ -22,6 +22,8 @@
 #ifndef __avrpart_h__
 #define __avrpart_h__
 
+#include <limits.h>
+
 #include "lists.h"
 
 /*
@@ -91,6 +93,8 @@ typedef struct avrpart {
   OPCODE      * op[AVR_OP_MAX];     /* opcodes */
 
   LISTID        mem;                /* avr memory definitions */
+  char          config_file[PATH_MAX]; /* config file where defined */
+  int           lineno;                /* config file line number */
 } AVRPART;
 
 #define AVR_MEMDESCLEN 64
diff --git a/config_gram.y b/config_gram.y
index ef9471d6..6417892b 100644
--- a/config_gram.y
+++ b/config_gram.y
@@ -154,7 +154,10 @@ def :
 
 prog_def :
   K_PROGRAMMER 
-    { current_prog = pgm_new(); }
+    { current_prog = pgm_new();
+      strcpy(current_prog->config_file, infile);
+      current_prog->lineno = lineno;
+    }
     prog_parms
     { 
       if (lsize(current_prog->id) == 0) {
@@ -168,7 +171,7 @@ prog_def :
                 progname, infile, lineno);
         exit(1);
       }
-      ladd(programmers, current_prog); 
+      PUSH(programmers, current_prog); 
       current_prog = NULL; 
     }
 ;
@@ -176,7 +179,11 @@ prog_def :
 
 part_def :
   K_PART
-    { current_part = avr_new_part(); }
+    {
+      current_part = avr_new_part();
+      strcpy(current_part->config_file, infile);
+      current_part->lineno = lineno;
+    }
     part_parms 
     { 
       LNODEID ln;
@@ -226,7 +233,7 @@ part_def :
         }
       }
 
-      ladd(part_list, current_part); 
+      PUSH(part_list, current_part); 
       current_part = NULL; 
     }
 ;
diff --git a/main.c b/main.c
index 173c5ae7..29dea339 100644
--- a/main.c
+++ b/main.c
@@ -39,6 +39,8 @@
 #include <time.h>
 #include <unistd.h>
 #include <ctype.h>
+#include <sys/types.h>
+#include <sys/stat.h>
 
 #include "avr.h"
 #include "config.h"
@@ -59,8 +61,6 @@ char   progbuf[PATH_MAX]; /* temporary buffer of spaces the same
 
 PROGRAMMER * pgm = NULL;
 
-PROGRAMMER * compiled_in_pgm;
-
 /*
  * global options
  */
@@ -72,7 +72,7 @@ int do_cycles;   /* track erase-rewrite cycles */
  */
 void usage(void)
 {
-	printf(
+  printf(
 		"Usage: %s [options]\n"
 		"Options:\n"
 		"  -p <partno>                Required. Specify AVR device.\n"
@@ -140,6 +140,7 @@ int read_config(char * file)
     return -1;
   }
 
+  lineno = 1;
   infile = file;
   yyin   = f;
 
@@ -155,7 +156,8 @@ int read_config(char * file)
 
 void programmer_display(char * p)
 {
-  fprintf(stderr, "%sProgrammer Type: %s\n", p, pgm->type);
+  fprintf(stderr, "%sProgrammer Type : %s\n", p, pgm->type);
+  fprintf(stderr, "%sDescription     : %s\n", p, pgm->desc);
 
   pgm->display(pgm, p);
 }
@@ -227,7 +229,23 @@ void list_parts(FILE * f, char * prefix, LISTID parts)
 
   for (ln1=lfirst(parts); ln1; ln1=lnext(ln1)) {
     p = ldata(ln1);
-    fprintf(f, "%s%-4s = %s\n", prefix, p->id, p->desc);
+    fprintf(f, "%s%-4s = %-15s [%s:%d]\n", 
+            prefix, p->id, p->desc, p->config_file, p->lineno);
+  }
+
+  return;
+}
+
+void list_programmers(FILE * f, char * prefix, LISTID programmers)
+{
+  LNODEID ln1;
+  PROGRAMMER * p;
+
+  for (ln1=lfirst(programmers); ln1; ln1=lnext(ln1)) {
+    p = ldata(ln1);
+    fprintf(f, "%s%-8s = %-30s [%s:%d]\n", 
+            prefix, (char *)ldata(lfirst(p->id)), p->desc, 
+            p->config_file, p->lineno);
   }
 
   return;
@@ -252,6 +270,7 @@ int main(int argc, char * argv [])
   int              ppidata;	/* cached value of the ppi data register */
   int              vsize=-1;    /* number of bytes to verify */
   AVRMEM         * sig;         /* signature data */
+  struct stat      sb;
 
   /* options / operating mode variables */
   char *  memtype;     /* "flash", "eeprom", etc */
@@ -270,10 +289,12 @@ int main(int argc, char * argv [])
   char  * exitspecs;   /* exit specs string from command line */
   char  * programmer;  /* programmer id */
   char  * partdesc;    /* part id */
-  char    configfile[PATH_MAX]; /* pin configuration file */
+  char    sys_config[PATH_MAX]; /* system wide config file */
+  char    usr_config[PATH_MAX]; /* per-user config file */
   int     cycles;      /* erase-rewrite cycles */
   int     set_cycles;  /* value to set the erase-rewrite cycles to */
   char  * e;           /* for strtol() error checking */
+  char  * homedir;
 
   progname = rindex(argv[0],'/');
   if (progname)
@@ -309,11 +330,21 @@ int main(int argc, char * argv [])
   do_cycles     = 0;
   set_cycles    = -1;
 
-  strcpy(configfile, CONFIG_DIR);
-  i = strlen(configfile);
-  if (i && (configfile[i-1] != '/'))
-    strcat(configfile, "/");
-  strcat(configfile, "avrdude.conf");
+  strcpy(sys_config, CONFIG_DIR);
+  i = strlen(sys_config);
+  if (i && (sys_config[i-1] != '/'))
+    strcat(sys_config, "/");
+  strcat(sys_config, "avrdude.conf");
+
+  usr_config[0] = 0;
+  homedir = getenv("HOME");
+  if (homedir != NULL) {
+    strcpy(usr_config, homedir);
+    i = strlen(usr_config);
+    if (i && (usr_config[i-1] != '/'))
+      strcat(usr_config, "/");
+    strcat(usr_config, ".avrduderc");
+  }
 
   len = strlen(progname) + 2;
   for (i=0; i<len; i++)
@@ -339,9 +370,9 @@ int main(int argc, char * argv [])
         programmer = optarg;
         break;
 
-      case 'C': /* pin configuration file */
-        strncpy(configfile, optarg, PATH_MAX);
-        configfile[PATH_MAX-1] = 0;
+      case 'C': /* system wide configuration file */
+        strncpy(sys_config, optarg, PATH_MAX);
+        sys_config[PATH_MAX-1] = 0;
         break;
 
       case 'm': /* select memory type to operate on */
@@ -481,13 +512,48 @@ int main(int argc, char * argv [])
             progname, version, progbuf);
   }
 
-  rc = read_config(configfile);
+  if (verbose) {
+    fprintf(stderr, "%sSystem wide configuration file is \"%s\"\n",
+            progbuf, sys_config);
+  }
+
+  rc = read_config(sys_config);
   if (rc) {
-    fprintf(stderr, "%s: error reading configuration file \"%s\"\n",
-            progname, configfile);
+    fprintf(stderr, 
+            "%s: error reading system wide configuration file \"%s\"\n",
+            progname, sys_config);
     exit(1);
   }
 
+  if (usr_config[0] != 0) {
+    if (verbose) {
+      fprintf(stderr, "%sUser configuration file is \"%s\"\n",
+              progbuf, usr_config);
+    }
+
+    rc = stat(usr_config, &sb);
+    if ((rc < 0) || ((sb.st_mode & S_IFREG) == 0)) {
+      if (verbose) {
+        fprintf(stderr,
+                "%sUser configuration file does not exist or is not a "
+                "regular file, skipping\n",
+                progbuf);
+      }
+    }
+    else {
+      rc = read_config(usr_config);
+      if (rc) {
+        fprintf(stderr, "%s: error reading user configuration file \"%s\"\n",
+                progname, usr_config);
+        exit(1);
+      }
+    }
+  }
+
+  if (verbose) {
+    fprintf(stderr, "\n");
+  }
+
   if (programmer[0] == 0) {
     fprintf(stderr, 
             "\n%s: no programmer has been specified on the command line "
@@ -501,9 +567,12 @@ int main(int argc, char * argv [])
 
   pgm = locate_programmer(programmers, programmer);
   if (pgm == NULL) {
+    fprintf(stderr,"\n");
     fprintf(stderr, 
             "%s: Can't find programmer id \"%s\"\n",
             progname, programmer);
+    fprintf(stderr,"\nValid programmers are:\n");
+    list_programmers(stderr, "  ", programmers);
     fprintf(stderr,"\n");
     exit(1);
   }
@@ -516,12 +585,10 @@ int main(int argc, char * argv [])
 
   if (partdesc == NULL) {
     fprintf(stderr, 
-            "%s: No AVR part has been specified, use \"-p Part\"\n\n"
-            "  Valid Parts are:\n\n",
+            "%s: No AVR part has been specified, use \"-p Part\"\n\n",
             progname);
-    list_parts(stderr, "    ", part_list);
-    fprintf(stderr, "\n");
-    fprintf(stderr, "(These come from the config file \"%s\")\n", configfile);
+    fprintf(stderr,"Valid parts are:\n");
+    list_parts(stderr, "  ", part_list);
     fprintf(stderr, "\n");
     exit(1);
   }
@@ -530,11 +597,10 @@ int main(int argc, char * argv [])
   p = locate_part(part_list, partdesc);
   if (p == NULL) {
     fprintf(stderr, 
-            "%s: AVR Part \"%s\" not found.  Valid parts are:\n\n",
+            "%s: AVR Part \"%s\" not found.\n\n",
             progname, partdesc);
-    list_parts(stderr, "    ", part_list);
-    fprintf(stderr, "\n");
-    fprintf(stderr, "(These come from the config file \"%s\")\n", configfile);
+    fprintf(stderr,"Valid parts are:\n");
+    list_parts(stderr, "  ", part_list);
     fprintf(stderr, "\n");
     exit(1);
   }
diff --git a/par.c b/par.c
index f28fbb27..85807236 100644
--- a/par.c
+++ b/par.c
@@ -553,10 +553,6 @@ static void par_display(PROGRAMMER * pgm, char * p)
     strcpy(buffpins, " (not used)");
   }
 
-
-  fprintf(stderr, "%sProgrammer Pin Configuration: %s (%s)\n", p, 
-          (char *)ldata(lfirst(pgm->id)), pgm->desc);
-
   fprintf(stderr, 
           "%s  VCC     = 0x%02x%s\n"
           "%s  BUFF    = 0x%02x%s\n"
diff --git a/pgm.c b/pgm.c
index 21ab9bb1..b65da69e 100644
--- a/pgm.c
+++ b/pgm.c
@@ -55,6 +55,8 @@ PROGRAMMER * pgm_new(void)
   pgm->id = lcreat(NULL, 0);
   pgm->desc[0] = 0;
   pgm->type[0] = 0;
+  pgm->config_file[0] = 0;
+  pgm->lineno = 0;
 
   for (i=0; i<N_PINS; i++)
     pgm->pinno[i] = 0;
diff --git a/pgm.h b/pgm.h
index ea47f5e3..5dcde7be 100644
--- a/pgm.h
+++ b/pgm.h
@@ -66,6 +66,8 @@ typedef struct programmer_t {
                           int page_size, int n_bytes);
   int  (*paged_load)     (struct programmer_t * pgm, AVRPART * p, AVRMEM * m,
                           int page_size, int n_bytes);
+  char config_file[PATH_MAX]; /* config file where defined */
+  int  lineno;                /* config file line number */
 } PROGRAMMER;