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.1 b/avrdude.1
index 955dbad..d2d693b 100644
--- a/avrdude.1
+++ b/avrdude.1
@@ -59,6 +59,7 @@ supports Atmel's STK500 programmer,
 Atmel's AVRISP and AVRISP mkII devices,
 Atmel's STK600,
 Atmel's JTAG ICE (mkI, mkII and 3, the latter two also in ISP mode),
+Devantech's USB-ISS (bit-banging),
 programmers complying to AppNote AVR910 and AVR109 (including the Butterfly),
 as well as a simple hard-wired
 programmer connected directly to a
@@ -135,6 +136,12 @@ programming modes, and connects through the USB.
 For ATxmega devices, the STK600 is supported in PDI mode.
 For ATtiny4/5/9/10 devices, the STK600 and AVRISP mkII are supported in TPI mode.
 .Pp
+The Devantech USB-ISS is a small device for USB to SPI, I2C, Digital
+IO or Analog input.  The firmware is closed source, and the SPI mode
+does not allow for manual control of the AVR-RESET line, so only
+bit-banging is supported. The device registers itself as a virtual
+serial port.
+.Pp
 The simple serial programmer described in Atmel's application note
 AVR910, and the bootloader described in Atmel's application note
 AVR109 (which is also used by the AVR Butterfly evaluation board), are
diff --git a/avrdude.conf.in b/avrdude.conf.in
index a268fd3..b4b8cd6 100644
--- a/avrdude.conf.in
+++ b/avrdude.conf.in
@@ -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";
diff --git a/doc/avrdude.info b/doc/avrdude.info
index e2cbb13..5d87c13 100644
--- a/doc/avrdude.info
+++ b/doc/avrdude.info
@@ -79,17 +79,18 @@ exploring memory contents, modifying individual bytes of eeprom,
 programming fuse/lock bits, etc.
 
    AVRDUDE supports the following basic programmer types: Atmel's
-STK500, Atmel's AVRISP and AVRISP mkII devices, Atmel's STK600, Atmel's
-JTAG ICE (both mkI and mkII, the latter also in ISP mode), appnote
-avr910, appnote avr109 (including the AVR Butterfly), serial bit-bang
-adapters, and the PPI (parallel port interface). PPI represents a class
-of simple programmers where the programming lines are directly
-connected to the PC parallel port. Several pin configurations exist for
-several variations of the PPI programmers, and AVRDUDE can be be
-configured to work with them by either specifying the appropriate
-programmer on the command line or by creating a new entry in its
-configuration file. All that's usually required for a new entry is to
-tell AVRDUDE which pins to use for each programming function.
+STK500, Atmel's AVRISP and AVRISP mkII devices, Atmel's STK600,
+Atmel's JTAG ICE (both mkI and mkII, the latter also in ISP mode),
+Devantech's USB-ISS (bit-banging), appnote avr910, appnote avr109
+(including the AVR Butterfly), serial bit-bang adapters, and the PPI
+(parallel port interface). PPI represents a class of simple
+programmers where the programming lines are directly connected to the
+PC parallel port. Several pin configurations exist for several
+variations of the PPI programmers, and AVRDUDE can be be configured to
+work with them by either specifying the appropriate programmer on the
+command line or by creating a new entry in its configuration file. All
+that's usually required for a new entry is to tell AVRDUDE which pins
+to use for each programming function.
 
    A number of equally simple bit-bang programming adapters that connect
 to a serial port are supported as well, among them the popular Ponyprog
@@ -155,6 +156,9 @@ stable ISP communication.  For ATxmega devices, the AVR Dragon is
 supported in PDI mode, provided it has a firmware version of at least
 6.11 (decimal).
 
+   The Devantech USB-ISS is supported in bit-banging mode only.  The
+device registers itself as a virtual serial port.
+
    Wiring boards are supported, utilizing STK500 V2.x protocol, but a
 simple DTR/RTS toggle to set the boards into programming mode.  The
 programmer type is "wiring".
@@ -533,6 +537,8 @@ following options are recognized:
                    mode
      `usbasp'      USBasp, http://www.fischl.de/usbasp/
      `usbasp-clone'Any usbasp clone with correct VID/PID
+     `usbiss'      Devantech USB-ISS,
+     		   http://www.robot-electronics.co.uk/htm/usb_iss_tech.htm
      `usbtiny'     USBtiny simple USB programmer,
                    http://www.ladyada.net/make/usbtinyisp/
      `wiring'      Wiring
@@ -1536,6 +1542,8 @@ Following programmer types are currently implemented:
 `stk600pp'         Atmel STK600 in parallel programming mode
 `usbasp'           USBasp programmer, see
                    http://www.fischl.de/usbasp/
+`usbiss'           Devantech USB-ISS,
+		   http://www.robot-electronics.co.uk/htm/usb_iss_tech.htm
 `usbtiny'          Driver for "usbtiny"-type programmers
 `wiring'           http://wiring.org.co/, Basically STK500v2
                    protocol, with some glue to trigger the
diff --git a/doc/avrdude.texi b/doc/avrdude.texi
index e55b568..84b7d0d 100644
--- a/doc/avrdude.texi
+++ b/doc/avrdude.texi
@@ -148,8 +148,9 @@ programming fuse/lock bits, etc.
 AVRDUDE supports the following basic programmer types: Atmel's STK500,
 Atmel's AVRISP and AVRISP mkII devices,
 Atmel's STK600,
-Atmel's JTAG ICE (both mkI and mkII, the latter also in ISP mode), appnote
-avr910, appnote avr109 (including the AVR Butterfly),
+Atmel's JTAG ICE (both mkI and mkII, the latter also in ISP mode),
+Devantech's USB-ISS (bit-banging),
+appnote avr910, appnote avr109 (including the AVR Butterfly),
 serial bit-bang adapters,
 and the PPI (parallel port interface). PPI represents a class
 of simple programmers where the programming lines are directly
@@ -213,6 +214,12 @@ See below for the limitations of debugWire.
 For ATxmega devices, the JTAG ICE mkII is supported in PDI mode, provided it
 has a revision 1 hardware and firmware version of at least 5.37 (decimal).
 
+The Devantech USB-ISS is a small device for USB to SPI, I2C, Digital
+IO or Analog input.  The firmware is closed source, and the SPI mode
+does not allow for manual control of the AVR-RESET line, so only
+bit-banging is supported. The device registers itself as a virtual
+serial port.
+
 The AVR Dragon is supported in all modes (ISP, JTAG, PDI, HVSP, PP, debugWire).
 When used in JTAG and debugWire mode, the AVR Dragon behaves similar to a
 JTAG ICE mkII, so all device-specific comments for that device
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 ]*******************
