diff --git a/examples/flashtest/Makefile b/examples/flashtest/Makefile
new file mode 100644
index 0000000000000000000000000000000000000000..89a4c4c409495584772ed6a271dc715d6c6b2143
--- /dev/null
+++ b/examples/flashtest/Makefile
@@ -0,0 +1,9 @@
+all : flash
+
+TARGET:=flashtest
+
+include ../../ch32v003fun/ch32v003fun.mk
+
+flash : cv_flash
+clean : cv_clean
+
diff --git a/examples/flashtest/flashtest.c b/examples/flashtest/flashtest.c
new file mode 100644
index 0000000000000000000000000000000000000000..f91dec0600ed7a4766db61e3027c0affee07c4d6
--- /dev/null
+++ b/examples/flashtest/flashtest.c
@@ -0,0 +1,75 @@
+// DOES NOT WORK HALP!!!!!!!!!!!!!!
+
+#define SYSTEM_CORE_CLOCK 48000000
+
+#include "ch32v003fun.h"
+#include <stdio.h>
+
+uint32_t count;
+
+int main()
+{
+	SystemInit48HSI();
+	SetupDebugPrintf();
+
+	Delay_Ms(100);
+
+	printf( "Starting\n" );
+
+	// Unkock flash - be aware you need extra stuff for the bootloader.
+	FLASH->KEYR = 0x45670123;
+	FLASH->KEYR = 0xCDEF89AB;
+
+	// For option bytes.
+//	FLASH->OBKEYR = 0x45670123;
+//	FLASH->OBKEYR = 0xCDEF89AB;
+
+	FLASH->MODEKEYR = 0x45670123;
+	FLASH->MODEKEYR = 0xCDEF89AB;
+
+	printf( "FLASH->CTLR = %08lx\n", FLASH->CTLR );
+	if( FLASH->CTLR & 0x8080 ) 
+	{
+		printf( "Flash still locked\n" );
+		while(1);
+	}
+
+	uint32_t * ptr = (uint32_t*)0x08002700;
+	printf( "Memory at: 0x08002710: %08lx %08lx\n", ptr[0], ptr[1] );
+
+	//Erase Page
+	FLASH->CTLR = CR_PAGE_ER;
+	FLASH->ADDR = (intptr_t)ptr;
+	FLASH->CTLR = CR_STRT_Set | CR_PAGE_ER;
+	printf( "FLASH->STATR = %08lx %08x\n", FLASH->STATR, FLASH_STATR_BSY );
+	while( FLASH->STATR & FLASH_STATR_BSY );
+	printf( "Erase complete\n" );
+
+
+	// Clear buffer and prep for flashing.
+	FLASH->CTLR = CR_PAGE_PG;
+	FLASH->CTLR = CR_BUF_RST | CR_PAGE_PG;
+	// Note: It takes about 8 clock cycles for this to finish.
+	while( FLASH->STATR & FLASH_STATR_BSY );
+
+	printf( "Memory at: 0x08002710: %08lx %08lx\n", ptr[0], ptr[1] );
+
+	int i;
+	for( i = 0; i < 16; i++ )
+	{
+		ptr[i] = 0xabcd1234; //Write to the memory
+		FLASH->CTLR = CR_PAGE_PG | FLASH_CTLR_BUF_LOAD; // Load the buffer.
+		printf( "(loop) FLASH->STATR = %08lx\n", FLASH->STATR );
+		while( FLASH->STATR & FLASH_STATR_BSY );
+	}
+
+	FLASH->ADDR = (intptr_t)ptr;
+	FLASH->CTLR = CR_PAGE_PG|CR_STRT_Set;
+	printf( "FLASH->STATR = %08lx\n", FLASH->STATR );
+	while( FLASH->STATR & FLASH_STATR_BSY );
+
+	printf( "Memory at: 0x08002710: %08lx %08lx\n", ptr[0], ptr[1] );
+
+	while(1);
+}
+
diff --git a/minichlink/pgm-b003fun.c b/minichlink/pgm-b003fun.c
index 958554af7a22a76ca604dc4047fa0335c57e7ec6..7b96054bf237689de899fd740a88d7fc95fd1662 100644
--- a/minichlink/pgm-b003fun.c
+++ b/minichlink/pgm-b003fun.c
@@ -61,6 +61,14 @@ static const unsigned char word_wise_write_blob[] = { // size and address must b
 	0x14, 0xc1, 0x82, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 */
 };
 
+static const unsigned char write64_flash[] = { // size and address must be aligned by 4.
+  0x13, 0x07, 0x45, 0x03, 0x0c, 0x43, 0x13, 0x86, 0x05, 0x04, 0x5c, 0x43,
+  0xb7, 0x02, 0x05, 0x00, 0x14, 0x47, 0x94, 0xc1, 0x23, 0xa0, 0x57, 0x00,
+  0x91, 0x05, 0x11, 0x07, 0xe3, 0xca, 0xc5, 0xfe, 0xc1, 0x65, 0x93, 0x85,
+  0x05, 0x04, 0xcc, 0xc3, 0x8c, 0xc3, 0xfd, 0x56, 0x14, 0xc1, 0x82, 0x80
+
+};
+
 static const unsigned char half_wise_write_blob[] = { // size and address must be aligned by 2
 	0x23, 0xa0, 0x05, 0x00, 0x13, 0x07, 0x45, 0x03, 0x0c, 0x43, 0x50, 0x43,
 	0x2e, 0x96, 0x21, 0x07, 0x16, 0x23, 0x96, 0xa1, 0x96, 0x21, 0x16, 0xa3,
@@ -433,19 +441,35 @@ static int B003FunBlockWrite64( void * dev, uint32_t address_to_write, uint8_t *
 				return -9;
 			}
 		}
-		MCF.WriteWord( dev, 0x40022010, CR_PAGE_PG ); // THIS IS REQUIRED, (intptr_t)&FLASH->CTLR = 0x40022010
-		MCF.WriteWord( dev, 0x40022010, CR_BUF_RST | CR_PAGE_PG );  // (intptr_t)&FLASH->CTLR = 0x40022010
+		printf( "Preppinggg %08x\n", address_to_write );
+
+		// Not actually needed.
+		MCF.WriteWord( dev, 0x40022010, CR_PAGE_PG ); // (intptr_t)&FLASH->CTLR = 0x40022010
+		MCF.WriteWord( dev, 0x40022010, CR_PAGE_PG | CR_BUF_RST); // (intptr_t)&FLASH->CTLR = 0x40022010
+
+		uint32_t word1, word2;
+		int r = B003FunReadWord( dev, 0x40022010, &word1 );
+		r |= B003FunReadWord( dev, 0x4002200c, &word2 );
+		printf( "IN: WORD: %d %08x %08x\n", r, word1, word2 );
+
+		ResetOp( eps );
+		WriteOpArb( eps, write64_flash, sizeof(write64_flash) );
+		WriteOp4( eps, address_to_write ); // Base address to write. @52
+		WriteOp4( eps, 0x40022010 ); // FLASH base address. @ 56
+		memcpy( &eps->commandbuffer[60], data, 64 ); // @60
+		if( MCF.PrepForLongOp ) MCF.PrepForLongOp( dev );  // Give the programmer a headsup this next operation could take a while.
+		if( CommitOp( eps ) ) return -5;
+
+		r = B003FunReadWord( dev, 0x40022010, &word1 );
+		r |= B003FunReadWord( dev, 0x4002200c, &word2 );
+		printf( "WORD: %d %08x %08x\n", r, word1, word2 );
 	}
-	int ret = InternalB003FunWriteBinaryBlob( dev, address_to_write, 64, data );
-	if( IsAddressFlash( address_to_write ) )
+	else
 	{
-		MCF.WriteWord( dev, 0x40022014, address_to_write );  //0x40022014 -> FLASH->ADDR
-		if( MCF.PrepForLongOp ) MCF.PrepForLongOp( dev );  // Give the programmer a headsup this next operation could take a while.
-		MCF.WriteWord( dev, 0x40022010, CR_PAGE_PG|CR_STRT_Set ); // 0x40022010 -> FLASH->CTLR
-		InternalMarkMemoryNotErased( iss, address_to_write );
+		return InternalB003FunWriteBinaryBlob( dev, address_to_write, 64, data );
 	}
 
-	return ret;
+	return 0;
 }
 
 static int B003FunWriteHalfWord( void * dev, uint32_t address_to_write, uint16_t data )
@@ -698,8 +722,6 @@ void * TryInit_B003Fun()
 
 
 /* Run app blob
-
-
 				FLASH->BOOT_MODEKEYR = FLASH_KEY1;
 				FLASH->BOOT_MODEKEYR = FLASH_KEY2;
 				FLASH->STATR = 0; // 1<<14 is zero, so, boot user code.