diff --git a/avrdude.1 b/avrdude.1
index a7743dd6..ff1bf79b 100644
--- a/avrdude.1
+++ b/avrdude.1
@@ -250,6 +250,10 @@ Intel Hex
 Motorola S-record
 .It Ar r
 raw binary; little-endian byte order, in the case of the flash ROM data
+.It Ar m
+immediate; actual byte values specified on the command line, seperated
+by commas or spaces.  This is good for programming fuse bytes without
+having to create a single-byte file or enter terminal mode.
 .It Ar a
 auto detect; valid for input only, and only if the input is not
 provided at
diff --git a/fileio.c b/fileio.c
index 83727725..d70e427a 100644
--- a/fileio.c
+++ b/fileio.c
@@ -728,6 +728,49 @@ int fileio_rbin(struct fioparms * fio,
 }
 
 
+int fileio_imm(struct fioparms * fio,
+               char * filename, FILE * f, unsigned char * buf, int size)
+{
+  int rc;
+  char * e, * p;
+  unsigned long b;
+  int loc;
+
+  switch (fio->op) {
+    case FIO_READ:
+      loc = 0;
+      p = strtok(filename, " ,");
+      while (p != NULL && loc < size) {
+        b = strtoul(p, &e, 0);
+        if (*e != 0) {
+          fprintf(stderr,
+                  "%s: invalid byte value (%s) specified for immediate mode\n",
+                  progname, p);
+          return -1;
+        }
+        buf[loc++] = b;
+        p = strtok(NULL, " ,");
+        rc = loc;
+      }
+      break;
+    default:
+      fprintf(stderr, "%s: fileio: invalid operation=%d\n",
+              progname, fio->op);
+      return -1;
+  }
+
+  if (rc < 0 || (fio->op == FIO_WRITE && rc < size)) {
+    fprintf(stderr, 
+            "%s: %s error %s %s: %s; %s %d of the expected %d bytes\n", 
+            progname, fio->iodesc, fio->dir, filename, strerror(errno),
+            fio->rw, rc, size);
+    return -1;
+  }
+
+  return rc;
+}
+
+
 int fileio_ihex(struct fioparms * fio, 
                   char * filename, FILE * f, unsigned char * buf, int size)
 {
@@ -907,6 +950,18 @@ int fileio(int op, char * filename, FILEFMT format,
   if (rc < 0)
     return -1;
 
+  /* point at the requested memory buffer */
+  buf = mem->buf;
+  if (fio.op == FIO_READ)
+    size = mem->size;
+
+  if (fio.op == FIO_READ) {
+    /* 0xff fill unspecified memory */
+    for (i=0; i<size; i++) {
+      buf[i] = 0xff;
+    }
+  }
+
   if (strcmp(filename, "-")==0) {
     if (fio.op == FIO_READ) {
       fname = "<stdin>";
@@ -919,24 +974,7 @@ int fileio(int op, char * filename, FILEFMT format,
   }
   else {
     fname = filename;
-    f = fopen(fname, fio.mode);
-    if (f == NULL) {
-      fprintf(stderr, "%s: can't open %s file %s: %s\n",
-              progname, fio.iodesc, fname, strerror(errno));
-      return -1;
-    }
-  }
-
-  /* point at the requested memory buffer */
-  buf = mem->buf;
-  if (fio.op == FIO_READ)
-    size = mem->size;
-
-  if (fio.op == FIO_READ) {
-    /* 0xff fill unspecified memory */
-    for (i=0; i<size; i++) {
-      buf[i] = 0xff;
-    }
+    f = NULL;
   }
 
   if (format == FMT_AUTO) {
@@ -952,6 +990,16 @@ int fileio(int op, char * filename, FILEFMT format,
             progname, fio.iodesc, fname, fmtstr(format));
   }
 
+  if (format != FMT_IMM) {
+    fname = filename;
+    f = fopen(fname, fio.mode);
+    if (f == NULL) {
+      fprintf(stderr, "%s: can't open %s file %s: %s\n",
+              progname, fio.iodesc, fname, strerror(errno));
+      return -1;
+    }
+  }
+
   switch (format) {
     case FMT_IHEX:
       rc = fileio_ihex(&fio, fname, f, buf, size);
@@ -965,6 +1013,10 @@ int fileio(int op, char * filename, FILEFMT format,
       rc = fileio_rbin(&fio, fname, f, buf, size);
       break;
 
+    case FMT_IMM:
+      rc = fileio_imm(&fio, fname, f, buf, size);
+      break;
+
     default:
       fprintf(stderr, "%s: invalid %s file format: %d\n",
               progname, fio.iodesc, format);
diff --git a/fileio.h b/fileio.h
index 9f020b87..bfc99910 100644
--- a/fileio.h
+++ b/fileio.h
@@ -26,7 +26,8 @@ typedef enum {
   FMT_AUTO,
   FMT_SREC,
   FMT_IHEX,
-  FMT_RBIN
+  FMT_RBIN,
+  FMT_IMM
 } FILEFMT;
 
 struct fioparms {
diff --git a/main.c b/main.c
index 30926df8..848eb576 100644
--- a/main.c
+++ b/main.c
@@ -453,6 +453,7 @@ int main(int argc, char * argv [])
           case 'i' : filefmt = FMT_IHEX; break;
           case 'r' : filefmt = FMT_RBIN; break;
           case 's' : filefmt = FMT_SREC; break;
+          case 'm' : filefmt = FMT_IMM; break;
             break;
           default :
             fprintf(stderr, "%s: invalid file format \"%s\"\n\n",