diff --git a/ChangeLog b/ChangeLog
index 413652b4..3aad89b6 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,9 +1,10 @@
 2012-03-20  Joerg Wunsch <j.gnu@uriah.heep.sax.de>
 
 	* jtagmkII.c (jtagmkII_close): The GO command before signing off
-	turned out to do more harm than good; on the Xmega, it caused exactly
-	the opposite reaction, the CPU stopped.  Even without it, after the
-	RESET command, the target is running already.  So, drop the GO.
+	turned out to be not required for normal megaAVR devices, and to
+	cause the exact opposite (i.e. the target stopping) on Xmega
+	devices being programmed to JTAG.  However, programming Xmega
+	devcies through PDI *does* need the GO command.
 
 2012-03-20  Joerg Wunsch <j.gnu@uriah.heep.sax.de>
 
diff --git a/jtagmkII.c b/jtagmkII.c
index b4b66467..0f00275b 100644
--- a/jtagmkII.c
+++ b/jtagmkII.c
@@ -1685,6 +1685,39 @@ void jtagmkII_close(PROGRAMMER * pgm)
   if (verbose >= 2)
     fprintf(stderr, "%s: jtagmkII_close()\n", progname);
 
+  if (pgm->flag & PGM_FL_IS_PDI) {
+    /* When in PDI mode, restart target. */
+    buf[0] = CMND_GO;
+    if (verbose >= 2)
+      fprintf(stderr, "%s: jtagmkII_close(): Sending GO command: ",
+	      progname);
+    jtagmkII_send(pgm, buf, 1);
+
+    status = jtagmkII_recv(pgm, &resp);
+    if (status <= 0) {
+      if (verbose >= 2)
+	putc('\n', stderr);
+      fprintf(stderr,
+	      "%s: jtagmkII_close(): "
+	      "timeout/error communicating with programmer (status %d)\n",
+	      progname, status);
+    } else {
+      if (verbose >= 3) {
+	putc('\n', stderr);
+	jtagmkII_prmsg(pgm, resp, status);
+      } else if (verbose == 2)
+	fprintf(stderr, "0x%02x (%d bytes msg)\n", resp[0], status);
+      c = resp[0];
+      free(resp);
+      if (c != RSP_OK) {
+	fprintf(stderr,
+		"%s: jtagmkII_close(): "
+		"bad response to GO command: %s\n",
+		progname, jtagmkII_get_rc(c));
+      }
+    }
+  }
+
   buf[0] = CMND_SIGN_OFF;
   if (verbose >= 2)
     fprintf(stderr, "%s: jtagmkII_close(): Sending sign-off command: ",