diff --git a/src/flash/Makefile.am b/src/flash/Makefile.am
index 27846d768016efd377000eaffcf17a47dcaa10a4..d448197a978d80b925d19a64edf4d322042917d6 100644
--- a/src/flash/Makefile.am
+++ b/src/flash/Makefile.am
@@ -38,6 +38,7 @@ libflash_la_SOURCES = \
 	mflash.c \
 	pic32mx.c \
 	avrf.c \
+	faux.c \
 	mx3_nand.c
 
 noinst_HEADERS = \
diff --git a/src/flash/ecos.c b/src/flash/ecos.c
index 76859df5db90046fbd8894bf965f3d8b96cde1cb..8583544e038b8d5c962c6347c56c5abf28f7f850 100644
--- a/src/flash/ecos.c
+++ b/src/flash/ecos.c
@@ -148,7 +148,7 @@ static int ecosflash_flash_bank_command(struct command_context_s *cmd_ctx, char
 	info->driverPath = strdup(args[6]);
 
 	/* eCos flash sector sizes are not exposed to OpenOCD, use 0x10000 as
-	 * a way to improve impeadance matach between OpenOCD and eCos flash
+	 * a way to improve impedance match between OpenOCD and eCos flash
 	 * driver.
 	 */
 	int i = 0;
diff --git a/src/flash/faux.c b/src/flash/faux.c
new file mode 100644
index 0000000000000000000000000000000000000000..c5928ad6d9f32a3ea85c8dac26a6884a1cbb06c4
--- /dev/null
+++ b/src/flash/faux.c
@@ -0,0 +1,153 @@
+/***************************************************************************
+ *   Copyright (C) 2009 Ƙyvind Harboe                                      *
+ *   oyvind.harboe@zylin.com                                               *
+ *                                                                         *
+ *   This program is free software; you can redistribute it and/or modify  *
+ *   it under the terms of the GNU General Public License as published by  *
+ *   the Free Software Foundation; either version 2 of the License, or     *
+ *   (at your option) any later version.                                   *
+ *                                                                         *
+ *   This program is distributed in the hope that it will be useful,       *
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
+ *   GNU General Public License for more details.                          *
+ *                                                                         *
+ *   You should have received a copy of the GNU General Public License     *
+ *   along with this program; if not, write to the                         *
+ *   Free Software Foundation, Inc.,                                       *
+ *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
+ ***************************************************************************/
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "flash.h"
+#include "image.h"
+
+
+static int faux_register_commands(struct command_context_s *cmd_ctx);
+static int faux_flash_bank_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc, struct flash_bank_s *bank);
+static int faux_erase(struct flash_bank_s *bank, int first, int last);
+static int faux_protect(struct flash_bank_s *bank, int set, int first, int last);
+static int faux_write(struct flash_bank_s *bank, uint8_t *buffer, uint32_t offset, uint32_t count);
+static int faux_probe(struct flash_bank_s *bank);
+static int faux_protect_check(struct flash_bank_s *bank);
+static int faux_info(struct flash_bank_s *bank, char *buf, int buf_size);
+
+flash_driver_t faux_flash =
+{
+	.name = "faux",
+	.register_commands = faux_register_commands,
+	.flash_bank_command = faux_flash_bank_command,
+	.erase = faux_erase,
+	.protect = faux_protect,
+	.write = faux_write,
+	.probe = faux_probe,
+	.auto_probe = faux_probe,
+	.erase_check = default_flash_blank_check,
+	.protect_check = faux_protect_check,
+	.info = faux_info
+};
+
+typedef struct faux_flash_bank_s
+{
+	struct target_s *target;
+	uint8_t *memory;
+	uint32_t start_address;
+} faux_flash_bank_t;
+
+static const int sectorSize = 0x10000;
+
+
+/* flash bank faux <base> <size> <chip_width> <bus_width> <target#> <driverPath>
+ */
+static int faux_flash_bank_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc, struct flash_bank_s *bank)
+{
+	faux_flash_bank_t *info;
+
+	if (argc < 6)
+	{
+		LOG_WARNING("incomplete flash_bank faux configuration");
+		return ERROR_FLASH_BANK_INVALID;
+	}
+
+	info = malloc(sizeof(faux_flash_bank_t));
+	if (info == NULL)
+	{
+		LOG_ERROR("no memory for flash bank info");
+		return ERROR_FAIL;
+	}
+	info->memory = malloc(bank->size);
+	if (info == NULL)
+	{
+		free(info);
+		LOG_ERROR("no memory for flash bank info");
+		return ERROR_FAIL;
+	}
+	bank->driver_priv = info;
+
+	/* Use 0x10000 as a fixed sector size. */
+	int i = 0;
+	uint32_t offset = 0;
+	bank->num_sectors = bank->size/sectorSize;
+	bank->sectors = malloc(sizeof(flash_sector_t) * bank->num_sectors);
+	for (i = 0; i < bank->num_sectors; i++)
+	{
+		bank->sectors[i].offset = offset;
+		bank->sectors[i].size = sectorSize;
+		offset += bank->sectors[i].size;
+		bank->sectors[i].is_erased = -1;
+		bank->sectors[i].is_protected = 0;
+	}
+
+	info->target = get_target(args[5]);
+	if (info->target == NULL)
+	{
+		LOG_ERROR("target '%s' not defined", args[5]);
+		free(info->memory);
+		free(info);
+		return ERROR_FAIL;
+	}
+	return ERROR_OK;
+}
+
+static int faux_register_commands(struct command_context_s *cmd_ctx)
+{
+	return ERROR_OK;
+}
+
+static int faux_erase(struct flash_bank_s *bank, int first, int last)
+{
+	faux_flash_bank_t *info = bank->driver_priv;
+	memset(info->memory + first*sectorSize, 0xff, sectorSize*(last-first + 1));
+	return ERROR_OK;
+}
+
+static int faux_protect(struct flash_bank_s *bank, int set, int first, int last)
+{
+	LOG_USER("set protection sector %d to %d to %s", first, last, set?"on":"off");
+	return ERROR_OK;
+}
+
+static int faux_write(struct flash_bank_s *bank, uint8_t *buffer, uint32_t offset, uint32_t count)
+{
+	faux_flash_bank_t *info = bank->driver_priv;
+	memcpy(info->memory + offset, buffer, count);
+	return ERROR_OK;
+}
+
+static int faux_protect_check(struct flash_bank_s *bank)
+{
+	return ERROR_OK;
+}
+
+static int faux_info(struct flash_bank_s *bank, char *buf, int buf_size)
+{
+	snprintf(buf, buf_size, "faux flash driver");
+	return ERROR_OK;
+}
+
+static int faux_probe(struct flash_bank_s *bank)
+{
+	return ERROR_OK;
+}
diff --git a/src/flash/flash.c b/src/flash/flash.c
index 87eec6e4d07089bfd502bda4f2b31071d623216e..db04e6e52f9d982176f60d9fd309ce5787173339 100644
--- a/src/flash/flash.c
+++ b/src/flash/flash.c
@@ -64,6 +64,7 @@ extern flash_driver_t ecosflash_flash;
 extern flash_driver_t ocl_flash;
 extern flash_driver_t pic32mx_flash;
 extern flash_driver_t avr_flash;
+extern flash_driver_t faux_flash;
 
 flash_driver_t *flash_drivers[] = {
 	&lpc2000_flash,
@@ -83,6 +84,7 @@ flash_driver_t *flash_drivers[] = {
 	&ocl_flash,
 	&pic32mx_flash,
 	&avr_flash,
+	&faux_flash,
 	NULL,
 };
 
diff --git a/tcl/target/faux.cfg b/tcl/target/faux.cfg
new file mode 100644
index 0000000000000000000000000000000000000000..cc09ee314063dcec977ad540ea360f9de2de1b04
--- /dev/null
+++ b/tcl/target/faux.cfg
@@ -0,0 +1,29 @@
+#Script for faux target - used for testing
+
+if { [info exists CHIPNAME] } {
+   set  _CHIPNAME $CHIPNAME
+} else {
+   set  _CHIPNAME at91eb40a
+}
+
+if { [info exists ENDIAN] } {
+   set  _ENDIAN $ENDIAN
+} else {
+   set  _ENDIAN little
+}
+
+if { [info exists CPUTAPID ] } {
+   set _CPUTAPID $CPUTAPID
+} else {
+   set _CPUTAPID 0x00000000
+}
+
+
+jtag newtap $_CHIPNAME cpu -irlen 4 -ircapture 0x1 -irmask 0xf -expected-id $_CPUTAPID
+
+#target configuration
+set _TARGETNAME $_CHIPNAME.cpu
+target create $_TARGETNAME arm7tdmi -endian $_ENDIAN -chain-position $_TARGETNAME -variant arm7tdmi-s_r4
+
+#dummy flash driver
+flash bank faux 0x01000000 0x200000 2 2 0