diff --git a/Makefile.am b/Makefile.am
index 311e978..51ee252 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -167,6 +167,8 @@ libavrdude_a_SOURCES = \
 	tpi.h \
 	usbasp.c \
 	usbasp.h \
+	usbiss.c \
+	usbiss.h \
 	usbdevs.h \
 	usb_libusb.c \
 	usbtiny.h \
diff --git a/Makefile.in b/Makefile.in
index ab89ce2..7cf7105 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -154,7 +154,7 @@ am_libavrdude_a_OBJECTS = libavrdude_a-config_gram.$(OBJEXT) \
 	libavrdude_a-ser_win32.$(OBJEXT) libavrdude_a-stk500.$(OBJEXT) \
 	libavrdude_a-stk500v2.$(OBJEXT) \
 	libavrdude_a-stk500generic.$(OBJEXT) \
-	libavrdude_a-usbasp.$(OBJEXT) \
+	libavrdude_a-usbasp.$(OBJEXT) libavrdude_a-usbiss.$(OBJEXT) \
 	libavrdude_a-usb_libusb.$(OBJEXT) \
 	libavrdude_a-usbtiny.$(OBJEXT) libavrdude_a-update.$(OBJEXT) \
 	libavrdude_a-wiring.$(OBJEXT)
@@ -570,6 +570,8 @@ libavrdude_a_SOURCES = \
 	tpi.h \
 	usbasp.c \
 	usbasp.h \
+	usbiss.c \
+	usbiss.h \
 	usbdevs.h \
 	usb_libusb.c \
 	usbtiny.h \
@@ -750,6 +752,7 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libavrdude_a-update.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libavrdude_a-usb_libusb.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libavrdude_a-usbasp.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libavrdude_a-usbiss.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libavrdude_a-usbtiny.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libavrdude_a-wiring.Po@am__quote@
 
@@ -1299,6 +1302,20 @@ libavrdude_a-usbasp.obj: usbasp.c
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libavrdude_a_CPPFLAGS) $(CPPFLAGS) $(libavrdude_a_CFLAGS) $(CFLAGS) -c -o libavrdude_a-usbasp.obj `if test -f 'usbasp.c'; then $(CYGPATH_W) 'usbasp.c'; else $(CYGPATH_W) '$(srcdir)/usbasp.c'; fi`
 
+libavrdude_a-usbiss.o: usbiss.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libavrdude_a_CPPFLAGS) $(CPPFLAGS) $(libavrdude_a_CFLAGS) $(CFLAGS) -MT libavrdude_a-usbiss.o -MD -MP -MF $(DEPDIR)/libavrdude_a-usbiss.Tpo -c -o libavrdude_a-usbiss.o `test -f 'usbiss.c' || echo '$(srcdir)/'`usbiss.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libavrdude_a-usbiss.Tpo $(DEPDIR)/libavrdude_a-usbiss.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='usbiss.c' object='libavrdude_a-usbiss.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libavrdude_a_CPPFLAGS) $(CPPFLAGS) $(libavrdude_a_CFLAGS) $(CFLAGS) -c -o libavrdude_a-usbiss.o `test -f 'usbiss.c' || echo '$(srcdir)/'`usbiss.c
+
+libavrdude_a-usbiss.obj: usbiss.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libavrdude_a_CPPFLAGS) $(CPPFLAGS) $(libavrdude_a_CFLAGS) $(CFLAGS) -MT libavrdude_a-usbiss.obj -MD -MP -MF $(DEPDIR)/libavrdude_a-usbiss.Tpo -c -o libavrdude_a-usbiss.obj `if test -f 'usbiss.c'; then $(CYGPATH_W) 'usbiss.c'; else $(CYGPATH_W) '$(srcdir)/usbiss.c'; fi`
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libavrdude_a-usbiss.Tpo $(DEPDIR)/libavrdude_a-usbiss.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='usbiss.c' object='libavrdude_a-usbiss.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libavrdude_a_CPPFLAGS) $(CPPFLAGS) $(libavrdude_a_CFLAGS) $(CFLAGS) -c -o libavrdude_a-usbiss.obj `if test -f 'usbiss.c'; then $(CYGPATH_W) 'usbiss.c'; else $(CYGPATH_W) '$(srcdir)/usbiss.c'; fi`
+
 libavrdude_a-usb_libusb.o: usb_libusb.c
 @am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libavrdude_a_CPPFLAGS) $(CPPFLAGS) $(libavrdude_a_CFLAGS) $(CFLAGS) -MT libavrdude_a-usb_libusb.o -MD -MP -MF $(DEPDIR)/libavrdude_a-usb_libusb.Tpo -c -o libavrdude_a-usb_libusb.o `test -f 'usb_libusb.c' || echo '$(srcdir)/'`usb_libusb.c
 @am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libavrdude_a-usb_libusb.Tpo $(DEPDIR)/libavrdude_a-usb_libusb.Po
diff --git a/avrdude.conf.in b/avrdude.conf.in
index a268fd3..b4b8cd6 100644
--- a/avrdude.conf.in
+++ b/avrdude.conf.in
@@ -32,7 +32,7 @@
 #       vfyled   = <num> ;                          # pin number
 #       usbvid   = <hexnum>;                        # USB VID (Vendor ID)
 #       usbpid   = <hexnum>;                        # USB PID (Product ID)
-#       usbdev   = <interface>;                     # USB interface or other device info 
+#       usbdev   = <interface>;                     # USB interface or other device info
 #       usbvendor = <vendorname>;                   # USB Vendor Name
 #       usbproduct = <productname>;                 # USB Product Name
 #       usbsn    = <serialno>;                      # USB Serial Number
@@ -140,9 +140,9 @@
 # complain.
 #
 # Parts can also inherit parameters from previously defined parts
-# using the following syntax. In this case specified integer and 
-# string values override parameter values from the parent part. New 
-# memory definitions are added to the definitions inherited from the 
+# using the following syntax. In this case specified integer and
+# string values override parameter values from the parent part. New
+# memory definitions are added to the definitions inherited from the
 # parent.
 #
 #   part parent <id>                              # quoted string
@@ -151,7 +151,7 @@
 #     ;
 #
 # NOTES:
-#   * 'devicecode' is the device code used by the STK500 (see codes 
+#   * 'devicecode' is the device code used by the STK500 (see codes
 #       listed below)
 #   * Not all memory types will implement all instructions.
 #   * AVR Fuse bits and Lock bits are implemented as a type of memory.
@@ -350,6 +350,17 @@ programmer
 ;
 
 programmer
+  id    = "usbiss";
+  desc  = "USB-ISS bit-banging";
+  type  = "usbiss";
+  connection_type = serial;
+  reset  = 1;
+  sck    = 3;
+  mosi   = 2;
+  miso   = 4;
+;
+
+programmer
   id    = "arduino";
   desc  = "Arduino";
   type  = "arduino";
@@ -365,7 +376,7 @@ programmer
 # http://dangerousprototypes.com/docs/FT2232_breakout_board
 # http://www.ftdichip.com/Products/Modules/DLPModules.htm,DLP-2232*,DLP-USB1232H
 # http://flashrom.org/FT2232SPI_Programmer
-# 
+#
 # The drivers will look for a specific device and use the first one found.
 # If you have mulitple devices, then look for unique information (like SN)
 # And fill that in here.
@@ -407,7 +418,7 @@ programmer
   type       = "avrftdi";
   connection_type = usb;
   usbvid     = 0x0403;
-# Note: This PID is reserved for generic H devices and 
+# Note: This PID is reserved for generic H devices and
 # should be programmed into the EEPROM
 #  usbpid     = 0x8A48;
   usbpid     = 0x6010;
@@ -415,13 +426,13 @@ programmer
   usbvendor  = "";
   usbproduct = "";
   usbsn      = "";
-#ISP-signals 
+#ISP-signals
   reset  = 3;
   sck    = 0;
   mosi   = 1;
   miso   = 2;
   buff   = ~4;
-#LED SIGNALs 
+#LED SIGNALs
   errled = ~ 11;
   rdyled = ~ 14;
   pgmled = ~ 13;
@@ -461,8 +472,8 @@ programmer
 ;
 
 # On the adapter you can read "O-Link". On the PCB is printed "OpenJTAG v3.1"
-# You can find it as "OpenJTAG ARM JTAG USB" in the internet. 
-# (But there are also several projects called Open JTAG, eg. 
+# You can find it as "OpenJTAG ARM JTAG USB" in the internet.
+# (But there are also several projects called Open JTAG, eg.
 # http://www.openjtag.org, which are completely different.)
 #   http://www.100ask.net/shop/english.html (website seems to be outdated)
 #   http://item.taobao.com/item.htm?id=1559277013
@@ -770,7 +781,7 @@ programmer
   type  = "butterfly";
   connection_type = serial;
 ;
- 
+
 # suggested in http://forum.mikrokopter.de/topic-post48317.html
 programmer
   id    = "mkbutterfly";
@@ -1008,7 +1019,7 @@ programmer
 programmer parent "stk200"
   id    = "pony-stk200";
   desc  = "Pony Prog STK200";
-  pgmled = 8; 
+  pgmled = 8;
 ;
 
 programmer
@@ -1093,7 +1104,7 @@ programmer
 # From the contributor of the "xil" jtag cable:
 # The "vcc" definition isn't really vcc (the cable gets its power from
 # the programming circuit) but is necessary to switch one of the
-# buffer lines (trying to add it to the "buff" lines doesn't work in 
+# buffer lines (trying to add it to the "buff" lines doesn't work in
 # avrdude versions before 5.5j).
 # With this, TMS connects to RESET, TDI to MOSI, TDO to MISO and TCK
 # to SCK (plus vcc/gnd of course)
@@ -1203,7 +1214,7 @@ programmer
 #  miso  = ?;
 #;
 
-# some ultra cheap programmers use bitbanging on the 
+# some ultra cheap programmers use bitbanging on the
 # serialport.
 #
 # PC - DB9 - Pins for RS232:
@@ -1853,7 +1864,7 @@ part
         max_write_delay = 9000;
         readback_p1     = 0x00;
         readback_p2     = 0xff;
-        read            = "1 0  1  0   0  0  0  0   x x x x  x x x x", 
+        read            = "1 0  1  0   0  0  0  0   x x x x  x x x x",
                           "x x a5 a4  a3 a2 a1 a0   o o o o  o o o o";
 
         write           = "1 1  0  0   0  0  0  0   x x x x  x x x x",
@@ -1966,7 +1977,7 @@ part
         max_write_delay = 20000;
         readback_p1     = 0x80;
         readback_p2     = 0x7f;
-        read            = " 1  0  1  0   0  0  0  0  x x x x  x x x a8", 
+        read            = " 1  0  1  0   0  0  0  0  x x x x  x x x a8",
                           "a7 a6 a5 a4 a3 a2 a1 a0   o o o o  o o o o";
 
         write           = " 1  1  0  0   0  0  0  0   x x x x  x x x a8",
@@ -2079,7 +2090,7 @@ part
         max_write_delay = 9000;
         readback_p1     = 0x80;
         readback_p2     = 0x7f;
-        read            = "1  0  1  0   0  0  0  0   x x x x  x x x x", 
+        read            = "1  0  1  0   0  0  0  0   x x x x  x x x x",
                           "x a6 a5 a4  a3 a2 a1 a0   o o o o  o o o o";
 
         write           = "1  1  0  0   0  0  0  0   x x x x  x x x x",
@@ -2193,7 +2204,7 @@ part
         max_write_delay = 20000;
         readback_p1     = 0x00;
         readback_p2     = 0xff;
-        read            = "1  0  1  0   0  0  0  0   x x x x  x x x x", 
+        read            = "1  0  1  0   0  0  0  0   x x x x  x x x x",
                           "x a6 a5 a4  a3 a2 a1 a0   o o o o  o o o o";
 
         write           = "1  1  0  0   0  0  0  0   x x x x  x x x x",
@@ -2320,7 +2331,7 @@ part
         max_write_delay = 20000;
         readback_p1     = 0x00;
         readback_p2     = 0xff;
-        read            = "1  0  1  0   0  0  0  0   0 0 0 0  0 0 0 0", 
+        read            = "1  0  1  0   0  0  0  0   0 0 0 0  0 0 0 0",
                           "x a6 a5 a4  a3 a2 a1 a0   o o o o  o o o o";
 
         write           = "1  1  0  0   0  0  0  0   0 0 0 0  0 0 0 0",
@@ -2444,7 +2455,7 @@ part
         max_write_delay = 20000;
         readback_p1     = 0x00;
         readback_p2     = 0xff;
-        read            = " 1  0  1  0   0  0  0  0   x x x x  x x x x", 
+        read            = " 1  0  1  0   0  0  0  0   x x x x  x x x x",
                           "a7 a6 a5 a4  a3 a2 a1 a0   o o o o  o o o o";
 
         write           = " 1  1  0  0   0  0  0  0   x x x x  x x x x",
@@ -2538,7 +2549,7 @@ part
         max_write_delay = 20000;
         readback_p1     = 0x00;
         readback_p2     = 0xff;
-        read            = " 1  0  1  0   0  0  0  0   x x x x  x x x x", 
+        read            = " 1  0  1  0   0  0  0  0   x x x x  x x x x",
                           "a7 a6 a5 a4  a3 a2 a1 a0   o o o o  o o o o";
 
         write           = " 1  1  0  0   0  0  0  0   x x x x  x x x x",
@@ -2652,7 +2663,7 @@ part
         max_write_delay = 9000;
         readback_p1     = 0x80;
         readback_p2     = 0x7f;
-        read            = " 1  0  1  0   0  0  0  0  x x x x  x x x a8", 
+        read            = " 1  0  1  0   0  0  0  0  x x x x  x x x a8",
                           "a7 a6 a5 a4 a3 a2 a1 a0   o o o o  o o o o";
 
         write           = " 1  1  0  0   0  0  0  0   x x x x  x x x a8",
@@ -2765,7 +2776,7 @@ part
         max_write_delay = 20000;
         readback_p1     = 0x00;
         readback_p2     = 0xff;
-        read            = " 1  0  1  0   0  0  0  0   x x x x  x x x a8", 
+        read            = " 1  0  1  0   0  0  0  0   x x x x  x x x a8",
                           "a7 a6 a5 a4  a3 a2 a1 a0   o o o o  o o o o";
 
         write           = " 1  1  0  0   0  0  0  0   x x x x  x x x a8",
@@ -2893,7 +2904,7 @@ part
 
 	write           = "  1   1   0   0      0   0   0   0",
                           "  x   x   x   x    a11 a10  a9  a8",
-                          " a7  a6  a5  a4     a3  a2  a1  a0", 
+                          " a7  a6  a5  a4     a3  a2  a1  a0",
                           "  i   i   i   i      i   i   i   i";
 
 	mode		= 0x04;
@@ -3045,7 +3056,7 @@ part
 
         write           = "  1   1   0   0      0   0   0   0",
                           "  x   x   x   x    a11 a10  a9  a8",
-                          " a7  a6  a5  a4     a3  a2  a1  a0", 
+                          " a7  a6  a5  a4     a3  a2  a1  a0",
                           "  i   i   i   i      i   i   i   i";
 
 	mode		= 0x04;
@@ -3229,7 +3240,7 @@ part
 
         write           = "  1   1   0   0      0   0   0   0",
                           "  x   x   x   x    a11 a10  a9  a8",
-                          " a7  a6  a5  a4     a3  a2  a1  a0", 
+                          " a7  a6  a5  a4     a3  a2  a1  a0",
                           "  i   i   i   i      i   i   i   i";
 
 	mode		= 0x04;
@@ -3410,7 +3421,7 @@ part
 
 	write           = "  1   1   0   0      0   0   0   0",
                           "  0   0   0   x    a11 a10  a9  a8",
-                          " a7  a6  a5  a4     a3  a2  a1  a0", 
+                          " a7  a6  a5  a4     a3  a2  a1  a0",
                           "  i   i   i   i      i   i   i   i";
 
 	loadpage_lo	= "  1   1   0   0      0   0   0   1",
@@ -3985,7 +3996,7 @@ part
 
 	write           = "  1   1   0   0      0   0   0   0",
                           "  0   0   x   x      x   x  a9  a8",
-                          " a7  a6  a5  a4     a3  a2  a1  a0", 
+                          " a7  a6  a5  a4     a3  a2  a1  a0",
                           "  i   i   i   i      i   i   i   i";
 
 	loadpage_lo	= "  1   1   0   0      0   0   0   1",
@@ -4187,7 +4198,7 @@ part
 
 	write           = "  1   1   0   0      0   0   0   0",
                           "  0   0   x   x      x a10  a9  a8",
-                          " a7  a6  a5  a4     a3  a2  a1  a0", 
+                          " a7  a6  a5  a4     a3  a2  a1  a0",
                           "  i   i   i   i      i   i   i   i";
 
 	loadpage_lo	= "  1   1   0   0      0   0   0   1",
@@ -4395,7 +4406,7 @@ part
 
 	write           = "  1   1   0   0      0   0   0   0",
                           "  0   0   x   x    a11 a10  a9  a8",
-                          " a7  a6  a5  a4     a3  a2  a1  a0", 
+                          " a7  a6  a5  a4     a3  a2  a1  a0",
                           "  i   i   i   i      i   i   i   i";
 
 	loadpage_lo	= "  1   1   0   0      0   0   0   1",
@@ -4603,7 +4614,7 @@ part
 
 	write           = "  1   1   0   0      0   0   0   0",
                           "  0   0   x   x    a11 a10  a9  a8",
-                          " a7  a6  a5  a4     a3  a2  a1  a0", 
+                          " a7  a6  a5  a4     a3  a2  a1  a0",
                           "  i   i   i   i      i   i   i   i";
 
 	loadpage_lo	= "  1   1   0   0      0   0   0   1",
@@ -4787,7 +4798,7 @@ part
        mode        = 0x41;
     delay       = 10;
     blocksize   = 128;
-    readsize    = 256;  
+    readsize    = 256;
 
         ;
 
@@ -5147,7 +5158,7 @@ part
 
 	write           = "  1   1   0   0      0   0   0   0",
                           "  x   x   x   x      x   x   x  a8",
-                          " a7  a6  a5  a4     a3  a2  a1  a0", 
+                          " a7  a6  a5  a4     a3  a2  a1  a0",
                           "  i   i   i   i      i   i   i   i";
 
 	loadpage_lo	= "  1   1   0   0      0   0   0   1",
@@ -6068,7 +6079,7 @@ part
 
 	write           = "  1   1   0   0      0   0   0   0",
                           "  0   0   x   x      x   x   x  a8",
-                          " a7  a6  a5  a4     a3  a2  a1  a0", 
+                          " a7  a6  a5  a4     a3  a2  a1  a0",
                           "  i   i   i   i      i   i   i   i";
 
 	mode		= 0x04;
@@ -7282,7 +7293,7 @@ part
 
 	write           = "  1   1   0   0      0   0   0   0",
                           "  0   0   0   x      x   x   x   x",
-                          " a7  a6  a5  a4     a3  a2  a1  a0", 
+                          " a7  a6  a5  a4     a3  a2  a1  a0",
                           "  i   i   i   i      i   i   i   i";
 
 	loadpage_lo	= "  1   1   0   0      0   0   0   1",
@@ -7482,7 +7493,7 @@ part
 
 	write           = "  1   1   0   0      0   0   0   0",
                           "  0   0   0   x      x   x   x  a8",
-                          " a7  a6  a5  a4     a3  a2  a1  a0", 
+                          " a7  a6  a5  a4     a3  a2  a1  a0",
                           "  i   i   i   i      i   i   i   i";
 
 	loadpage_lo	= "  1   1   0   0      0   0   0   1",
@@ -7679,7 +7690,7 @@ part
                           " 0 0 0 x x x x a8",
                           " a7 a6 a5 a4 a3 a2 a1 a0",
                           " o o o o o o o o";
-    
+
         write           = " 1 1 0 0 0 0 0 0",
                           " 0 0 0 x x x x a8",
                           " a7 a6 a5 a4 a3 a2 a1 a0",
@@ -7714,22 +7725,22 @@ part
                           " 0 0 0 a12 a11 a10 a9 a8",
                           " a7 a6 a5 a4 a3 a2 a1 a0",
                           " o o o o o o o o";
-        
+
         read_hi          = " 0 0 1 0 1 0 0 0",
                            " 0 0 0 a12 a11 a10 a9 a8",
                            " a7 a6 a5 a4 a3 a2 a1 a0",
                            " o o o o o o o o";
-        
+
         loadpage_lo     = " 0 1 0 0 0 0 0 0",
                           " 0 0 0 x x x x x",
                           " x x a5 a4 a3 a2 a1 a0",
                           " i i i i i i i i";
-        
+
         loadpage_hi     = " 0 1 0 0 1 0 0 0",
                           " 0 0 0 x x x x x",
                           " x x a5 a4 a3 a2 a1 a0",
                           " i i i i i i i i";
-        
+
         writepage       = " 0 1 0 0 1 1 0 0",
                           " 0 0 0 a12 a11 a10 a9 a8",
                           " a7 a6 x x x x x x",
@@ -7741,57 +7752,57 @@ part
         readsize    = 256;
 
         ;
-        
+
     memory "lfuse"
         size            = 1;
         min_write_delay = 4500;
         max_write_delay = 4500;
         read            = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0",
                           "x x x x x x x x o o o o o o o o";
-        
+
         write           = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0",
                           "x x x x x x x x i i i i i i i i";
         ;
-    
+
     memory "hfuse"
         size            = 1;
         min_write_delay = 4500;
         max_write_delay = 4500;
         read            = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0",
                           "x x x x x x x x o o o o o o o o";
-        
+
         write           = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0",
                           "x x x x x x x x i i i i i i i i";
         ;
-    
+
     memory "efuse"
         size            = 1;
         min_write_delay = 4500;
         max_write_delay = 4500;
         read            = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0",
                           "x x x x x x x x x x x x x o o o";
-        
+
         write           = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0",
                           "x x x x x x x x x x x x x i i i";
         ;
-    
+
     memory "lock"
         size            = 1;
         min_write_delay = 4500;
         max_write_delay = 4500;
         read            = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0",
                           "x x x x x x x x x x o o o o o o";
-        
+
         write           = "1 0 1 0 1 1 0 0 1 1 1 x x x x x",
                           "x x x x x x x x 1 1 i i i i i i";
         ;
-    
+
     memory "calibration"
         size            = 1;
         read            = "0 0 1 1 1 0 0 0 0 0 0 x x x x x",
                           "0 0 0 0 0 0 0 0 o o o o o o o o";
         ;
-    
+
     memory "signature"
         size            = 3;
         read            = "0 0 1 1 0 0 0 0 0 0 0 x x x x x",
@@ -9463,7 +9474,7 @@ part
 
         write           = "  1   1   0   0      0   0   0   0",
                           "  x   x   x   x    a11 a10  a9  a8",
-                          " a7  a6  a5  a4     a3  a2  a1  a0", 
+                          " a7  a6  a5  a4     a3  a2  a1  a0",
                           "  i   i   i   i      i   i   i   i";
 
 	loadpage_lo	= "  1   1   0   0      0   0   0   1",
@@ -9653,7 +9664,7 @@ part
 
         write           = "  1   1   0   0      0   0   0   0",
                           "  x   x   x   x    a11 a10  a9  a8",
-                          " a7  a6  a5  a4     a3  a2  a1  a0", 
+                          " a7  a6  a5  a4     a3  a2  a1  a0",
                           "  i   i   i   i      i   i   i   i";
 
 	loadpage_lo	= "  1   1   0   0      0   0   0   1",
@@ -9856,7 +9867,7 @@ part
 
         write           = "  1   1   0   0      0   0   0   0",
                           "  x   x   x   x    a11 a10  a9  a8",
-                          " a7  a6  a5  a4     a3  a2  a1  a0", 
+                          " a7  a6  a5  a4     a3  a2  a1  a0",
                           "  i   i   i   i      i   i   i   i";
 
 	loadpage_lo	= "  1   1   0   0      0   0   0   1",
@@ -10961,7 +10972,7 @@ part
 
         write           = "  1   1   0   0      0   0   0   0",
                           "  x   x   x   x      x a10  a9  a8",
-                          " a7  a6  a5  a4     a3  a2  a1  a0", 
+                          " a7  a6  a5  a4     a3  a2  a1  a0",
                           "  i   i   i   i      i   i   i   i";
 
 	loadpage_lo	= "  1   1   0   0      0   0   0   1",
@@ -11151,7 +11162,7 @@ part
 
         write           = "  1   1   0   0      0   0   0   0",
                           "  x   x   x   x      x a10  a9  a8",
-                          " a7  a6  a5  a4     a3  a2  a1  a0", 
+                          " a7  a6  a5  a4     a3  a2  a1  a0",
                           "  i   i   i   i      i   i   i   i";
 
 	loadpage_lo	= "  1   1   0   0      0   0   0   1",
@@ -11354,7 +11365,7 @@ part
 
         write           = "  1   1   0   0      0   0   0   0",
                           "  x   x   x   x    a11 a10  a9  a8",
-                          " a7  a6  a5  a4     a3  a2  a1  a0", 
+                          " a7  a6  a5  a4     a3  a2  a1  a0",
                           "  i   i   i   i      i   i   i   i";
 
 	loadpage_lo	= "  1   1   0   0      0   0   0   1",
diff --git a/pgm_type.c b/pgm_type.c
index 7f36dfd..efd56c9 100644
--- a/pgm_type.c
+++ b/pgm_type.c
@@ -47,6 +47,7 @@
 #include "stk500generic.h"
 #include "stk500v2.h"
 #include "usbasp.h"
+#include "usbiss.h"
 #include "usbtiny.h"
 #include "wiring.h"
 
@@ -89,6 +90,7 @@ const PROGRAMMER_TYPE const programmers_types[] = {
         {"stk600hvsp", stk600hvsp_initpgm, stk600hvsp_desc},
         {"stk600pp", stk600pp_initpgm, stk600pp_desc},
         {"usbasp", usbasp_initpgm, usbasp_desc},
+        {"usbiss", usbiss_initpgm, usbiss_desc},
         {"usbtiny", usbtiny_initpgm, usbtiny_desc},
         {"wiring", wiring_initpgm, wiring_desc},
 };
diff --git a/usbiss.c b/usbiss.c
new file mode 100644
index 0000000..86b9391
--- /dev/null
+++ b/usbiss.c
@@ -0,0 +1,330 @@
+/*
+ * avrdude - A Downloader/Uploader for AVR device programmers
+ * Copyright (C) 2000-2006  Brian S. Dean <bsd@bsdhome.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "ac_cfg.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <errno.h>
+
+#include "avrdude.h"
+#include "avr.h"
+#include "pindefs.h"
+#include "pgm.h"
+#include "bitbang.h"
+#include "usbiss.h"
+#include "usbiss_private.h"
+
+
+#ifdef DEBUG
+#define _DEBUG(fmt, args...) printf("%s:%s:%d: "fmt, __FILE__, __FUNCTION__, __LINE__, args)
+#else
+#define _DEBUG(fmt, args...)
+#endif
+
+
+static unsigned char Shadow_Port = 0;
+
+
+static void dump_mem(unsigned char *buf, unsigned int len)
+{
+        unsigned int i;
+
+        for (i = 0; i<len; i++) {
+                if (i % 8 == 0)
+                        fprintf(stderr, "\t");
+                fprintf(stderr, "0x%02x ", (unsigned)buf[i] & 0xFF);
+                if (i % 8 == 3)
+                        fprintf(stderr, "  ");
+                else if (i % 8 == 7)
+                        fprintf(stderr, "\n");
+        }
+        if (i % 8 != 7)
+                fprintf(stderr, "\n");
+}
+
+
+static int usbiss_send(PROGRAMMER * pgm, unsigned char *tx, unsigned int len)
+{
+	int rc;
+
+	if (verbose > 2) {
+		fprintf(stderr, "%s:\n", __FUNCTION__);
+		dump_mem(tx, len);
+	}
+
+	rc = serial_send(&pgm->fd, tx, len);
+	if (rc != 0) {
+		fprintf(stderr, "%s failed: %02x\n", __FUNCTION__, rc);
+		return rc;
+	}
+
+	return 0;
+}
+
+
+static int usbiss_recv(PROGRAMMER * pgm, unsigned char *rx, unsigned int len)
+{
+	int rc;
+
+	if (verbose > 2) {
+		fprintf(stderr, "%s, expecting %u bytes\n", __FUNCTION__, len);
+	}
+
+	rc = serial_recv(&pgm->fd, rx, len);
+	if (rc != 0) {
+		fprintf(stderr, "%s failed: %02x\n", __FUNCTION__, rc);
+		return rc;
+	}
+
+	if (verbose > 2) {
+		fprintf(stderr, "%s received:\n", __FUNCTION__);
+		dump_mem(rx, len);
+	}
+
+	return 0;
+}
+
+
+static int usbiss_cmd(PROGRAMMER * pgm,
+		      unsigned char *tx, unsigned int txlen,
+		      unsigned char *rx, unsigned int rxlen, bool ack_expected)
+{
+	int rc;
+
+	rc = usbiss_send(pgm, tx, txlen);
+	if (rc != 0)
+		return rc;
+
+	rc = usbiss_recv(pgm, rx, rxlen);
+	if (rc != 0)
+		return rc;
+
+	if (ack_expected && (rx[0] != Resp_ISS_ACK)) {
+		fprintf(stderr, "%s failed: %02x\n", __FUNCTION__, rx[0]);
+	}
+
+	return rc;
+}
+
+
+static int usbiss_setmany(PROGRAMMER * pgm, unsigned int pinset, int value)
+{
+	int rc;
+	unsigned char tx[2], rx[1];
+
+	if (value) {
+		Shadow_Port |= pinset;
+	} else {
+		Shadow_Port &= ~pinset;
+	}
+
+	tx[0] = ISS_IO_SETPINS;
+	tx[1] = Shadow_Port;
+	rc = usbiss_cmd(pgm, tx, sizeof(tx), rx, sizeof(rx), 1);
+
+	return rc;
+}
+
+
+static int usbiss_setpin(PROGRAMMER * pgm, int pin, int value)
+{
+	int rc;
+
+	if (pin < 1 || pin > 4)
+		return -1;
+
+	rc = usbiss_setmany(pgm, (1 << (pin-1)), value);
+	if (rc != 0)
+		return rc;
+
+	if (pgm->ispdelay > 1)
+		bitbang_delay(pgm->ispdelay);
+
+	return 0;
+}
+
+
+static int usbiss_getpin(PROGRAMMER * pgm, int pin)
+{
+	int rc;
+	unsigned char tx[1], rx[1];
+
+	if (pin < 1 || pin > 4)
+		return -1;
+
+	tx[0] = ISS_IO_GETPINS;
+	rc = usbiss_cmd(pgm, tx, sizeof(tx), rx, sizeof(rx), 0);
+	if (rc != 0)
+		return rc;
+
+	return ((1<<(pin-1)) & rx[0]) ? 1 : 0;
+}
+
+
+static int usbiss_highpulsepin(PROGRAMMER * pgm, int pin)
+{
+	int rc;
+
+	rc = usbiss_setpin(pgm, pin, 1);
+	if (rc != 0)
+		return rc;
+	if (pgm->ispdelay > 1)
+		bitbang_delay(pgm->ispdelay);
+
+	rc = usbiss_setpin(pgm, pin, 0);
+	if (rc != 0)
+		return rc;
+	if (pgm->ispdelay > 1)
+		bitbang_delay(pgm->ispdelay);
+
+	return 0;
+}
+
+
+static void usbiss_disable(PROGRAMMER * pgm)
+{
+	unsigned char tx[4], rx[2];
+	unsigned char reset_type;
+
+	switch (pgm->exit_reset) {
+	case EXIT_RESET_ENABLED:
+		reset_type = ISS_IO_TYPE_L;
+		break;
+
+	case EXIT_RESET_DISABLED:
+		reset_type = ISS_IO_TYPE_H;
+		break;
+
+	default:
+		reset_type = ISS_IO_TYPE_DIN;
+		break;
+	}
+
+	tx[0] = Cmnd_ISS;
+	tx[1] = ISS_MODE;
+	tx[2] = ISS_IO_MODE;
+	tx[3] = ISS_PIN(pgm->pinno[PIN_AVR_RESET], reset_type) |
+		ISS_PIN(pgm->pinno[PIN_AVR_SCK],   ISS_IO_TYPE_DIN) |
+		ISS_PIN(pgm->pinno[PIN_AVR_MOSI],  ISS_IO_TYPE_DIN) |
+		ISS_PIN(pgm->pinno[PIN_AVR_MISO],  ISS_IO_TYPE_DIN);
+	usbiss_cmd(pgm, tx, sizeof(tx), rx, sizeof(rx), 1);
+
+	return;
+}
+
+
+static void usbiss_enable(PROGRAMMER * pgm)
+{
+	unsigned char tx[4], rx[2];
+
+	tx[0] = Cmnd_ISS;
+	tx[1] = ISS_MODE;
+	tx[2] = ISS_IO_MODE;
+	tx[3] = ISS_PIN(pgm->pinno[PIN_AVR_RESET], ISS_IO_TYPE_L) |
+		ISS_PIN(pgm->pinno[PIN_AVR_SCK],   ISS_IO_TYPE_L) |
+		ISS_PIN(pgm->pinno[PIN_AVR_MOSI],  ISS_IO_TYPE_L) |
+		ISS_PIN(pgm->pinno[PIN_AVR_MISO],  ISS_IO_TYPE_DIN);
+	usbiss_cmd(pgm, tx, sizeof(tx), rx, sizeof(rx), 1);
+
+	usleep(1);
+
+	return;
+}
+
+
+static int usbiss_open(PROGRAMMER * pgm, char * port)
+{
+	bitbang_check_prerequisites(pgm);
+
+	serial_open(port, pgm->baudrate ? pgm->baudrate: 115200, &pgm->fd);
+	if (pgm->fd.ifd < 0) {
+		fprintf(stderr, "%s failed to open USB-ISS port \"%s\"\n\n",
+			__FUNCTION__, port);
+		exit(1);
+	}
+
+	return 0;
+}
+
+
+static void usbiss_close(PROGRAMMER * pgm)
+{
+	serial_close(&pgm->fd);
+	pgm->fd.ifd = -1;
+
+	return;
+}
+
+
+/*
+ * parse the -E string
+ */
+static int usbiss_parseexitspecs(PROGRAMMER * pgm, char *s)
+{
+	char *cp;
+
+	while ((cp = strtok(s, ","))) {
+		if (strcmp(cp, "reset") == 0) {
+			pgm->exit_reset = EXIT_RESET_ENABLED;
+		}
+		else if (strcmp(cp, "noreset") == 0) {
+			pgm->exit_reset = EXIT_RESET_DISABLED;
+		}
+		else {
+			return -1;
+		}
+		s = 0; /* strtok() should be called with the actual string only once */
+	}
+
+	return 0;
+}
+
+
+void usbiss_initpgm(PROGRAMMER * pgm)
+{
+	strcpy(pgm->type, "usbiss");
+
+	pgm_fill_old_pins(pgm); // TODO to be removed if old pin data no longer needed
+
+	pgm->exit_reset = EXIT_RESET_UNSPEC;
+
+	pgm->initialize     = bitbang_initialize;
+	pgm->display        = pgm_display_generic;
+	pgm->enable         = usbiss_enable;
+	pgm->disable        = usbiss_disable;
+	pgm->program_enable = bitbang_program_enable;
+	pgm->chip_erase     = bitbang_chip_erase;
+	pgm->cmd            = bitbang_cmd;
+	pgm->cmd_tpi        = bitbang_cmd_tpi;
+	pgm->spi            = bitbang_spi;
+	pgm->open           = usbiss_open;
+	pgm->close          = usbiss_close;
+	pgm->setpin         = usbiss_setpin;
+	pgm->getpin         = usbiss_getpin;
+	pgm->highpulsepin   = usbiss_highpulsepin;
+	pgm->parseexitspecs = usbiss_parseexitspecs;
+	pgm->read_byte      = avr_read_byte_default;
+	pgm->write_byte     = avr_write_byte_default;
+}
+
+
+const char usbiss_desc[] = "USB-ISS bitbanging";
diff --git a/usbiss.h b/usbiss.h
new file mode 100644
index 0000000..69654cd
--- /dev/null
+++ b/usbiss.h
@@ -0,0 +1,33 @@
+/*
+ * avrdude - A Downloader/Uploader for AVR device programmers
+ * Copyright (C) 2000-2004  Brian S. Dean <bsd@bsdhome.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef usbiss_h
+#define usbiss_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+extern const char usbiss_desc[];
+void usbiss_initpgm        (PROGRAMMER * pgm);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/usbiss_private.h b/usbiss_private.h
new file mode 100644
index 0000000..3b57af1
--- /dev/null
+++ b/usbiss_private.h
@@ -0,0 +1,88 @@
+/*
+ * avrdude - A Downloader/Uploader for AVR device programmers
+ * Copyright (C) 2000-2004  Brian S. Dean <bsd@bsdhome.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+
+// *****************[ ISS Response constants ]***************************
+
+#define Resp_ISS_ACK               0xFF
+#define Resp_ISS_NACK              0x00
+
+#define Resp_ISS_UKNOWN_COMMAND    0x05
+#define Resp_ISS_INTERNAL_ERROR_1  0x06
+#define Resp_ISS_INTERNAL_ERROR_2  0x07
+
+#define Resp_ISS_MODULE_ID         0x07
+
+
+// *****************[ ISS Special constants ]***************************
+
+#define ISS_RESYNC_DELAY           500000   // 500ms
+
+// *****************[ ISS Command constants ]***************************
+
+#define Cmnd_ISS                   0x5A
+#define ISS_VERSION                0x01
+#define ISS_MODE                   0x02
+#define ISS_GET_SER_NUM            0x03
+
+#define ISS_IO_MODE                0x00
+#define ISS_CHANGE                 0x10
+#define ISS_I2C_S_20KHZ            0x20
+#define ISS_I2C_S_50KHZ            0x30
+#define ISS_I2C_S_100KHZ           0x40
+#define ISS_I2C_S_400KHZ           0x50
+#define ISS_I2C_H_100KHZ           0x60
+#define ISS_I2C_H_400KHZ           0x70
+#define ISS_I2C_H_1000KHZ          0x80
+#define ISS_SPI                    0x90
+#define ISS_SERIAL                 0x01
+
+
+
+// *****************[ ISS Parameter constants ]***************************
+
+#define ISS_IO_TYPE_L              0x00
+#define ISS_IO_TYPE_H              0x01
+#define ISS_IO_TYPE_DIN            0x02
+#define ISS_IO_TYPE_AIN            0x03
+
+#define ISS_PIN(PIN, TYPE) (TYPE<<((PIN-1)*2))
+
+
+#define ISS_SERIAL_DIVISOR(BAUDRATE) ((48000000/(16+BAUDRATE))-1)
+
+
+#define ISS_SPI_MODE(MODE)         (0x90+MODE)
+#define ISS_SPI_DIVISOR(BAUDRATE)  ((6000000/BAUDRATE)-1)
+#define ISS_SPI_DIVISOR_FASTEST    0x01
+#define ISS_SPI_DIVISOR_SLOWEST    0xFF
+
+
+// *****************[ ISS SPI-mode Command constants ]***************************
+
+#define ISS_SPI_COMMAND            0x61
+
+
+// *****************[ ISS IO-mode Command constants ]***************************
+
+#define ISS_IO_SETPINS             0x63
+#define ISS_IO_GETPINS             0x64
+#define ISS_IO_GETAD               0x65
+
+
+// *****************************[ End Of usbiss_private.h ]*******************
