-                       /* EEPROM just increments the address each byte, flash needs to increment on each word and
-                        * also check to ensure that a LOAD EXTENDED ADDRESS command is issued each time the extended
-                        * address boundary has been crossed */
-                       if (V2Command == CMD_PROGRAM_EEPROM_ISP)
-                       {
-                               CurrentAddress++;
-                       }
-                       else if (IsOddByte)
-                       {
-                               if (!(++CurrentAddress & 0xFFFF))
-                                 ISPTarget_LoadExtendedAddress();                      
-                       }
+                       /* Must reset the polling address afterwards, so it is not erroneously used for the next byte */
+                       PollAddress = 0;
+               }
+
+               /* EEPROM just increments the address each byte, flash needs to increment on each word and
+                * also check to ensure that a LOAD EXTENDED ADDRESS command is issued each time the extended
+                * address boundary has been crossed during FLASH memory programming */
+               if ((CurrentByte & 0x01) || (V2Command == CMD_PROGRAM_EEPROM_ISP))
+               {
+                       CurrentAddress++;
+
+                       if ((V2Command == CMD_PROGRAM_FLASH_ISP) && !(CurrentAddress & 0xFFFF))
+                         MustLoadExtendedAddress = true;
+               }
+       }
+
+       /* If the current page must be committed, send the PROGRAM PAGE command to the target */
+       if (Write_Memory_Params.ProgrammingMode & PROG_MODE_COMMIT_PAGE_MASK)
+       {
+               ISPTarget_SendByte(Write_Memory_Params.ProgrammingCommands[1]);
+               ISPTarget_SendByte(PageStartAddress >> 8);
+               ISPTarget_SendByte(PageStartAddress & 0xFF);
+               ISPTarget_SendByte(0x00);
+
+               /* Check if polling is enabled and possible, if not switch to timed delay mode */
+               if ((Write_Memory_Params.ProgrammingMode & PROG_MODE_PAGED_VALUE_MASK) && !(PollAddress))
+               {
+                       Write_Memory_Params.ProgrammingMode = (Write_Memory_Params.ProgrammingMode & ~PROG_MODE_PAGED_VALUE_MASK) |
+                                                                                                  PROG_MODE_PAGED_TIMEDELAY_MASK;