diff --git a/am29f040b.c b/am29f040b.c
index cde4b96ef9d0a612da6c3599b0c2424090af488e..46a5ef4b206d20235dd5fddefe03f32812f5ad74 100644
--- a/am29f040b.c
+++ b/am29f040b.c
@@ -20,6 +20,8 @@
 
 #include "flash.h"
 
+/* FIMXE: check that the 2 second delay is really needed.
+          Use erase_sector_jedec if not? */
 static int erase_sector_29f040b(struct flashchip *flash, unsigned long address)
 {
 	int page_size = flash->page_size;
@@ -44,6 +46,7 @@ static int erase_sector_29f040b(struct flashchip *flash, unsigned long address)
 	return 0;
 }
 
+/* FIXME: use write_sector_jedec? */
 static int write_sector_29f040b(chipaddr bios, uint8_t *src, chipaddr dst,
 				unsigned int page_size)
 {
@@ -91,6 +94,7 @@ int probe_29f040b(struct flashchip *flash)
 	return 0;
 }
 
+/* FIXME: use erase_chip_jedec? */
 int erase_29f040b(struct flashchip *flash)
 {
 	int total_size = flash->total_size * 1024;
diff --git a/en29f002a.c b/en29f002a.c
index 14fccabbcbdb2f726c5b4c7036229d4d68e1022a..020df32919abb4afbca0a1b4691cb76a2c837efc 100644
--- a/en29f002a.c
+++ b/en29f002a.c
@@ -87,39 +87,3 @@ int probe_en29f002a(struct flashchip *flash)
 
 	return 0;
 }
-
-/* The EN29F002 chip needs repeated single byte writing, no block writing. */
-int write_en29f002a(struct flashchip *flash, uint8_t *buf)
-{
-	int i;
-	int total_size = flash->total_size * 1024;
-	chipaddr bios = flash->virtual_memory;
-	chipaddr dst = bios;
-
-	//chip_writeb(0xF0, bios);
-	programmer_delay(10);
-	if (erase_chip_jedec(flash)) {
-		fprintf(stderr, "ERASE FAILED!\n");
-		return -1;
-	}
-
-	printf("Programming page: ");
-	for (i = 0; i < total_size; i++) {
-		/* write to the sector */
-		if ((i & 0xfff) == 0)
-			printf("address: 0x%08lx", (unsigned long)i);
-		chip_writeb(0xAA, bios + 0x5555);
-		chip_writeb(0x55, bios + 0x2AAA);
-		chip_writeb(0xA0, bios + 0x5555);
-		chip_writeb(*buf++, dst++);
-
-		/* wait for Toggle bit ready */
-		toggle_ready_jedec(dst);
-
-		if ((i & 0xfff) == 0)
-			printf("\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b");
-	}
-
-	printf("\n");
-	return 0;
-}
diff --git a/flash.h b/flash.h
index 1a1d8f851dcc32c68e33a942343676e98a0320f2..4178d47d7eaa66cefd1853a3697bf8fbca015893 100644
--- a/flash.h
+++ b/flash.h
@@ -653,6 +653,7 @@ int write_byte_program_jedec(chipaddr bios, uint8_t *src,
 int probe_jedec(struct flashchip *flash);
 int erase_chip_jedec(struct flashchip *flash);
 int write_jedec(struct flashchip *flash, uint8_t *buf);
+int write_jedec_1(struct flashchip *flash, uint8_t *buf);
 int erase_sector_jedec(struct flashchip *flash, unsigned int page, unsigned int pagesize);
 int erase_block_jedec(struct flashchip *flash, unsigned int page, unsigned int blocksize);
 int write_sector_jedec(chipaddr bios, uint8_t *src,
diff --git a/flashchips.c b/flashchips.c
index 8618c46c8391bd3a961620b7dfebc7eab2e608ac..5e74ccf1705193aab19f2e5a56d3b39013253a45 100644
--- a/flashchips.c
+++ b/flashchips.c
@@ -81,7 +81,7 @@ struct flashchip flashchips[] = {
 		.probe		= probe_jedec,
 		.probe_timing	= TIMING_ZERO,
 		.erase		= erase_chip_jedec,
-		.write		= write_en29f002a,
+		.write		= write_jedec_1,
 		.read		= read_memmapped,
 	},
 
@@ -93,11 +93,11 @@ struct flashchip flashchips[] = {
 		.model_id	= AM_29F002BT,
 		.total_size	= 256,
 		.page_size	= 256,
-		.tested		= TEST_OK_PREW,
+		.tested		= TEST_OK_PRE,
 		.probe		= probe_jedec,
 		.probe_timing	= TIMING_ZERO,
 		.erase		= erase_chip_jedec,
-		.write		= write_en29f002a,
+		.write		= write_jedec_1,
 		.read		= read_memmapped,
 	},
 
@@ -739,7 +739,7 @@ struct flashchip flashchips[] = {
 		.probe		= probe_29f002,
 		.probe_timing	= TIMING_IGNORED, /* routine don't use probe_timing (mx29f002.c) */
 		.erase		= erase_29f002,
-		.write		= write_29f002,
+		.write		= write_jedec_1,
 		.read		= read_memmapped,
 	},
 
@@ -751,11 +751,11 @@ struct flashchip flashchips[] = {
 		.model_id	= AMIC_A29002T,
 		.total_size	= 256,
 		.page_size	= 64 * 1024,
-		.tested		= TEST_OK_PREW,
+		.tested		= TEST_OK_PRE,
 		.probe		= probe_29f002,
 		.probe_timing	= TIMING_IGNORED, /* routine don't use probe_timing (mx29f002.c) */
 		.erase		= erase_29f002,
-		.write		= write_29f002,
+		.write		= write_jedec_1,
 		.read		= read_memmapped,
 	},
 
@@ -1075,7 +1075,7 @@ struct flashchip flashchips[] = {
 		.probe		= probe_jedec,
 		.probe_timing	= TIMING_ZERO,	/* Datasheet has no timing info specified */
 		.erase		= erase_chip_jedec,
-		.write		= write_en29f002a,
+		.write		= write_jedec_1,
 		.read		= read_memmapped,
 	},
 
@@ -1087,11 +1087,11 @@ struct flashchip flashchips[] = {
 		.model_id	= EN_29F002T,
 		.total_size	= 256,
 		.page_size	= 256,
-		.tested		= TEST_OK_PREW,
+		.tested		= TEST_OK_PRE,
 		.probe		= probe_jedec,
 		.probe_timing	= TIMING_ZERO,	/* Datasheet has no timing info specified */
 		.erase		= erase_chip_jedec,
-		.write		= write_en29f002a,
+		.write		= write_jedec_1,
 		.read		= read_memmapped,
 	},
 
@@ -1518,11 +1518,11 @@ struct flashchip flashchips[] = {
 		.model_id	= MX_29F001B,
 		.total_size	= 128,
 		.page_size	= 32 * 1024,
-		.tested		= TEST_OK_PREW,
+		.tested		= TEST_OK_PRE,
 		.probe		= probe_29f002,
 		.probe_timing	= TIMING_IGNORED, /* routine don't use probe_timing (mx29f002.c) */
 		.erase		= erase_29f002,
-		.write		= write_29f002,
+		.write		= write_jedec_1,
 		.read		= read_memmapped,
 	},
 
@@ -1534,11 +1534,11 @@ struct flashchip flashchips[] = {
 		.model_id	= MX_29F001T,
 		.total_size	= 128,
 		.page_size	= 32 * 1024,
-		.tested		= TEST_OK_PREW,
+		.tested		= TEST_OK_PRE,
 		.probe		= probe_29f002,
 		.probe_timing	= TIMING_IGNORED, /* routine don't use probe_timing (mx29f002.c) */
 		.erase		= erase_29f002,
-		.write		= write_29f002,
+		.write		= write_jedec_1,
 		.read		= read_memmapped,
 	},
 
@@ -1554,7 +1554,7 @@ struct flashchip flashchips[] = {
 		.probe		= probe_29f002,
 		.probe_timing	= TIMING_IGNORED, /* routine don't use probe_timing (mx29f002.c) */
 		.erase		= erase_29f002,
-		.write		= write_29f002,
+		.write		= write_jedec_1,
 		.read		= read_memmapped,
 	},
 
@@ -1566,11 +1566,11 @@ struct flashchip flashchips[] = {
 		.model_id	= MX_29F002T,
 		.total_size	= 256,
 		.page_size	= 64 * 1024,
-		.tested		= TEST_OK_PREW,
+		.tested		= TEST_OK_PRE,
 		.probe		= probe_29f002,
 		.probe_timing	= TIMING_IGNORED, /* routine don't use probe_timing (mx29f002.c) */
 		.erase		= erase_29f002,
-		.write		= write_29f002,
+		.write		= write_jedec_1,
 		.read		= read_memmapped,
 	},
 
@@ -1586,7 +1586,7 @@ struct flashchip flashchips[] = {
 		.probe		= probe_29f002,
 		.probe_timing	= TIMING_IGNORED, /* routine don't use probe_timing (mx29f002.c) */
 		.erase		= erase_29f002,
-		.write		= write_29f002,
+		.write		= write_jedec_1,
 		.read		= read_memmapped,
 	},
 
diff --git a/jedec.c b/jedec.c
index 0a5eda0cab4e6343863ff6605b8754f5d02fadc2..83a0b83807cb0d8682db2623fcf3c6465f976431 100644
--- a/jedec.c
+++ b/jedec.c
@@ -353,3 +353,30 @@ int write_jedec(struct flashchip *flash, uint8_t *buf)
 
 	return failed;
 }
+
+int write_jedec_1(struct flashchip *flash, uint8_t * buf)
+{
+	int i;
+	chipaddr bios = flash->virtual_memory;
+	chipaddr dst = bios;
+
+	programmer_delay(10);
+	if (erase_flash(flash)) {
+		fprintf(stderr, "ERASE FAILED!\n");
+		return -1;
+	}
+
+	printf("Programming page: ");
+	for (i = 0; i < flash->total_size; i++) {
+		if ((i & 0x3) == 0)
+			printf("address: 0x%08lx", (unsigned long)i * 1024);
+
+                write_sector_jedec(bios, buf + i * 1024, dst + i * 1024, 1024);
+
+		if ((i & 0x3) == 0)
+			printf("\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b");
+	}
+
+	printf("\n");
+	return 0;
+}
diff --git a/m29f002.c b/m29f002.c
index 00cbbc1409f469e15dab9ce3d5765e46ffadfc96..01a7a509b504e8ce592da17dee1671dfd401098f 100644
--- a/m29f002.c
+++ b/m29f002.c
@@ -45,6 +45,7 @@ static int rewrite_block(struct flashchip *flash, uint8_t *src,
 	chipaddr dst = bios + start;
 
 	/* erase */
+	/* FIXME: use erase_sector_jedec? */
 	chip_writeb(0xaa, bios + 0x555);
 	chip_writeb(0x55, bios + 0xaaa);
 	chip_writeb(0x80, bios + 0x555);
@@ -59,6 +60,7 @@ static int rewrite_block(struct flashchip *flash, uint8_t *src,
 	}
 
 	/* program */
+	/* FIXME: use write_sector_jedec? */
 	while (size--) {
 		chip_writeb(0xaa, bios + 0x555);
 		chip_writeb(0x55, bios + 0xaaa);
diff --git a/m29f400bt.c b/m29f400bt.c
index 5c36db9679c208b62ce21082733d943e14263314..c327f44c1c93a3d3e835272522acf381c92d8a3b 100644
--- a/m29f400bt.c
+++ b/m29f400bt.c
@@ -20,6 +20,12 @@
 
 #include "flash.h"
 
+/* WARNING! 
+   This chip uses the standard JEDEC Addresses in 16-bit mode as word
+   addresses. In byte mode, 0xAAA has to be used instead of 0x555 and
+   0x555 instead of 0x2AA. Do *not* blindly replace with standard JEDEC
+   functions. */
+
 void write_page_m29f400bt(chipaddr bios, uint8_t *src,
 			  chipaddr dst, int page_size)
 {
diff --git a/mx29f002.c b/mx29f002.c
index f170360c1d8eadebafd96534963df2886624234c..7838c3d3c3eb67187ed2a80d5b76a276e0cb7f69 100644
--- a/mx29f002.c
+++ b/mx29f002.c
@@ -43,6 +43,9 @@ int probe_29f002(struct flashchip *flash)
 	return 0;
 }
 
+/* FIXME: Use erase_chip_jedec?
+ * erase_29f002 uses shorter addresses, sends F0 (exit ID mode) and
+ * and has a bigger delay before polling the toggle bit */
 int erase_29f002(struct flashchip *flash)
 {
 	chipaddr bios = flash->virtual_memory;
@@ -64,37 +67,3 @@ int erase_29f002(struct flashchip *flash)
 	}
 	return 0;
 }
-
-int write_29f002(struct flashchip *flash, uint8_t *buf)
-{
-	int i;
-	int total_size = flash->total_size * 1024;
-	chipaddr bios = flash->virtual_memory;
-	chipaddr dst = bios;
-
-	chip_writeb(0xF0, bios);
-	programmer_delay(10);
-	if (erase_29f002(flash)) {
-		fprintf(stderr, "ERASE FAILED!\n");
-		return -1;
-	}
-	printf("Programming page: ");
-	for (i = 0; i < total_size; i++) {
-		/* write to the sector */
-		if ((i & 0xfff) == 0)
-			printf("address: 0x%08lx", (unsigned long)i);
-		chip_writeb(0xAA, bios + 0x5555);
-		chip_writeb(0x55, bios + 0x2AAA);
-		chip_writeb(0xA0, bios + 0x5555);
-		chip_writeb(*buf++, dst++);
-
-		/* wait for Toggle bit ready */
-		toggle_ready_jedec(dst);
-
-		if ((i & 0xfff) == 0)
-			printf("\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b");
-	}
-	printf("\n");
-
-	return 0;
-}
diff --git a/pm29f002.c b/pm29f002.c
index a01df88de52268c8f2fc69bfd087d865c726bbc3..bf78d13ba8859b04fd1bda650291dd7494f50bc4 100644
--- a/pm29f002.c
+++ b/pm29f002.c
@@ -20,18 +20,20 @@
 
 #include "flash.h"
 
+/* if write_sector_jedec is used,
+   this is write_jedec_1 */
 int write_pm29f002(struct flashchip *flash, uint8_t *buf)
 {
 	int i, total_size = flash->total_size * 1024;
 	chipaddr bios = flash->virtual_memory;
 	chipaddr dst = bios;
 
-	/* Pm29F002T/B use the same erase method... */
-	if (erase_29f040b(flash)) {
+	if (erase_flash(flash)) {
 		fprintf(stderr, "ERASE FAILED!\n");
 		return -1;
 	}
 
+	/* FIXME: use write_sector_jedec? */
 	printf("Programming page: ");
 	for (i = 0; i < total_size; i++) {
 		if ((i & 0xfff) == 0)