diff --git a/src/avr.c b/src/avr.c
index 68ecc9a4..2b8a4004 100644
--- a/src/avr.c
+++ b/src/avr.c
@@ -877,15 +877,11 @@ int avr_write(PROGRAMMER * pgm, AVRPART * p, char * memtype, int size,
     /* setup for WORD_WRITE */
     avr_tpi_setup_rw(pgm, m, 0, TPI_NVMCMD_WORD_WRITE);
 
-    /* make sure it's aligned to a word boundary */
-    if (wsize & 0x1) {
-      wsize++;
-    }
-
     /* write words, low byte first */
     for (lastaddr = i = 0; i < wsize; i += 2) {
+      bool have_two_bytes = i + 1 < wsize;
       if ((m->tags[i] & TAG_ALLOCATED) != 0 ||
-          (m->tags[i + 1] & TAG_ALLOCATED) != 0) {
+          (have_two_bytes && m->tags[i + 1] & TAG_ALLOCATED) != 0) {
 
         if (lastaddr != i) {
           /* need to setup new address */
@@ -897,8 +893,11 @@ int avr_write(PROGRAMMER * pgm, AVRPART * p, char * memtype, int size,
         cmd[1] = m->buf[i];
         rc = pgm->cmd_tpi(pgm, cmd, 2, NULL, 0);
 
-        cmd[1] = m->buf[i + 1];
-        rc = pgm->cmd_tpi(pgm, cmd, 2, NULL, 0);
+        if (have_two_bytes)
+        {
+          cmd[1] = m->buf[i + 1];
+          rc = pgm->cmd_tpi(pgm, cmd, 2, NULL, 0);
+        }
 
         lastaddr += 2;
 
@@ -906,7 +905,7 @@ int avr_write(PROGRAMMER * pgm, AVRPART * p, char * memtype, int size,
       }
       report_progress(i, wsize, NULL);
     }
-    return i;
+    return wsize;
   }
 
   if (pgm->paged_write != NULL && m->page_size > 1) {