diff --git a/doc/openocd.texi b/doc/openocd.texi
index 455e6fbe84b1ebdd6eaa9adf78ad29fe592fa1f7..3977454bba8b7dae71b780cb222b3cf2df06e708 100644
--- a/doc/openocd.texi
+++ b/doc/openocd.texi
@@ -2109,6 +2109,17 @@ For an example of this scheme see LPC2000 target config files.
 The @code{init_boards} procedure is a similar concept concerning board config files
 (@xref{theinitboardprocedure,,The init_board procedure}.)
 
+@anchor{theinittargeteventsprocedure}
+@subsection The init_target_events procedure
+@cindex init_target_events procedure
+
+A special procedure called @code{init_target_events} is run just after
+@code{init_targets} (@xref{theinittargetsprocedure,,The init_targets
+procedure}.) and before @code{init_board}
+(@xref{theinitboardprocedure,,The init_board procedure}.) It is used
+to set up default target events for the targets that do not have those
+events already assigned.
+
 @subsection ARM Core Specific Hacks
 
 If the chip has a DCC, enable it. If the chip is an ARM9 with some
@@ -4577,13 +4588,14 @@ depending on whether the breakpoint is in RAM or read only memory.
 @item @b{gdb-end}
 @* When the target has halted and GDB is not doing anything (see early halt)
 @item @b{gdb-flash-erase-start}
-@* Before the GDB flash process tries to erase the flash
+@* Before the GDB flash process tries to erase the flash (default is
+@code{reset init})
 @item @b{gdb-flash-erase-end}
 @* After the GDB flash process has finished erasing the flash
 @item @b{gdb-flash-write-start}
 @* Before GDB writes to the flash
 @item @b{gdb-flash-write-end}
-@* After GDB writes to the flash
+@* After GDB writes to the flash (default is @code{reset halt})
 @item @b{gdb-start}
 @* Before the target steps, gdb is trying to start/resume the target
 @item @b{halted}
diff --git a/src/target/startup.tcl b/src/target/startup.tcl
index 56fcbaa7516083ddbf4313636ccd7e8d911dd982..033e9c9cfe10a95e1fdb21c811e11ca5463ddf31 100644
--- a/src/target/startup.tcl
+++ b/src/target/startup.tcl
@@ -164,6 +164,21 @@ proc armv4_5 params {
 proc init_targets {} {
 }
 
+proc set_default_target_event {t e s} {
+	if {[$t cget -event $e] == ""} {
+		$t configure -event $e $s
+	}
+}
+
+proc init_target_events {} {
+	set targets [target names]
+
+	foreach t $targets {
+		set_default_target_event $t gdb-flash-erase-start "reset init"
+		set_default_target_event $t gdb-flash-write-end "reset halt"
+	}
+}
+
 # Additionally board config scripts can define a procedure init_board that will be executed after init and init_targets
 proc init_board {} {
 }
diff --git a/src/target/target.c b/src/target/target.c
index f5a8666b6e2566b5bd49e950561bb49d784e0a35..9820155467b4176dfd0e6f5fe5d27f26adf23787 100644
--- a/src/target/target.c
+++ b/src/target/target.c
@@ -1274,6 +1274,10 @@ COMMAND_HANDLER(handle_target_init_command)
 	if (ERROR_OK != retval)
 		return retval;
 
+	retval = command_run_line(CMD_CTX, "init_target_events");
+	if (ERROR_OK != retval)
+		return retval;
+
 	retval = command_run_line(CMD_CTX, "init_board");
 	if (ERROR_OK != retval)
 		return retval;