diff --git a/ChangeLog b/ChangeLog
index d5491e6e..aafa6f26 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,13 @@
+2013-05-17  Joerg Wunsch <j.gnu@uriah.heep.sax.de>
+
+	Submitted by "Malte" and John McCorquodale:
+	patch #7876 JTAGICE mkII fails to connect to attiny if debugwire
+	is enabled AND target has a very slow clock
+	* jtagmkII.c (jtagmkII_getsync): When leaving debugWIRE mode
+	temporarily, immediately retry with ISP, rather than leaving.
+	* stk500v2 (stk500v2_program_enable): Implemented similar logic
+	for the JTAGICE3.
+
 2013-05-16  Rene Liebscher <R.Liebscher@gmx.de>
 
 	* configure.ac: reactivate check for TYPE_232H, which does not
diff --git a/NEWS b/NEWS
index da99d625..fc21a494 100644
--- a/NEWS
+++ b/NEWS
@@ -78,6 +78,8 @@ Current:
         read device signature
       - bug #37265: wrong page sizes for XMega64xx in avrdude.conf
       - bug #37942: Latest SVN can't program in dragon_jtag mode
+      - patch #7876 JTAGICE mkII fails to connect to attiny if debugwire
+        is enabled AND target has a very slow clock
 
   * Keep track of input file contents
 
@@ -134,6 +136,9 @@ Current:
     traces, in particular in environments which do not offer
     shell-style redirection functionality for standard streams.
 
+  * When leaving debugWIRE mode, immediately retry with ISP rather
+    than bailing out completely.
+
   * Programmer types in configuration file are no longer keywords but
     specified as string.
 
diff --git a/jtagmkII.c b/jtagmkII.c
index 3fb5b1f6..bd8a12ea 100644
--- a/jtagmkII.c
+++ b/jtagmkII.c
@@ -831,6 +831,8 @@ int jtagmkII_getsync(PROGRAMMER * pgm, int mode) {
 
   if(mode < 0) return 0;  // for AVR32
 
+  tries = 0;
+retry:
   /* Turn the ICE into JTAG or ISP mode as requested. */
   buf[0] = mode;
   if (jtagmkII_setparm(pgm, PAR_EMULATOR_MODE, buf) < 0) {
@@ -855,11 +857,17 @@ int jtagmkII_getsync(PROGRAMMER * pgm, int mode) {
 	 * program.
 	 */
 	(void)jtagmkII_reset(pgm, 0x04);
+	if (tries++ > 3) {
+	    fprintf(stderr,
+		    "%s: Failed to return from debugWIRE to ISP.\n",
+		    progname);
+	    return -1;
+	}
 	fprintf(stderr,
 		"%s: Target prepared for ISP, signed off.\n"
-		"%s: Please restart %s without power-cycling the target.\n",
-		progname, progname, progname);
-        return JTAGII_GETSYNC_FAIL_GRACEFUL;
+		"%s: Now retrying without power-cycling the target.\n",
+		progname, progname);
+        goto retry;
       }
     } else {
       return -1;
diff --git a/stk500v2.c b/stk500v2.c
index 443ccb25..a9ac44c6 100644
--- a/stk500v2.c
+++ b/stk500v2.c
@@ -1105,7 +1105,7 @@ static int stk500v2_program_enable(PROGRAMMER * pgm, AVRPART * p)
 {
   unsigned char buf[16];
   char msg[100];             /* see remarks above about size needed */
-  int rv;
+  int rv, tries;
 
   PDATA(pgm)->lastpart = p;
 
@@ -1120,6 +1120,8 @@ static int stk500v2_program_enable(PROGRAMMER * pgm, AVRPART * p)
       /* Activate AVR-style (low active) RESET */
       stk500v2_setparm_real(pgm, PARAM_RESET_POLARITY, 0x01);
 
+  tries = 0;
+retry:
   buf[0] = CMD_ENTER_PROGMODE_ISP;
   buf[1] = p->timeout;
   buf[2] = p->stabdelay;
@@ -1185,14 +1187,20 @@ static int stk500v2_program_enable(PROGRAMMER * pgm, AVRPART * p)
                     cmd[1] = CMD3_MONCON_DISABLE;
                     if (jtag3_command(pgm, cmd, 3, &resp, "MonCon disable") >= 0)
                         free(resp);
-
-                    fprintf(stderr,
-                            "%s: Target prepared for ISP, signed off.\n"
-                            "%s: Please restart %s without power-cycling the target.\n",
-                            progname, progname, progname);
                 }
             }
             pgm->cookie = mycookie;
+            if (tries++ > 3) {
+                fprintf(stderr,
+                        "%s: Failed to return from debugWIRE to ISP.\n",
+                        progname);
+                break;
+            }
+            fprintf(stderr,
+                    "%s: Target prepared for ISP, signed off.\n"
+                    "%s: Now retrying without power-cycling the target.\n",
+                    progname, progname);
+            goto retry;
         }
         break;