diff --git a/.gitignore b/.gitignore
index e0643331e..f0926971e 100644
--- a/.gitignore
+++ b/.gitignore
@@ -16,6 +16,8 @@ doc/openocd.fn
 doc/openocd.fns
 doc/openocd.html
 doc/openocd.info
+doc/openocd.info-1
+doc/openocd.info-2
 doc/openocd.ky
 doc/openocd.log
 doc/openocd.pdf
@@ -47,3 +49,7 @@ stamp-h1
 stamp-vti
 INSTALL
 NOTES
+
+# Eclipse stuff
+.project
+
diff --git a/src/helper/jim.c b/src/helper/jim.c
index c1ba0d9da..48e21e9ee 100644
--- a/src/helper/jim.c
+++ b/src/helper/jim.c
@@ -3,11 +3,14 @@
  * Copyright 2005 Salvatore Sanfilippo <antirez@invece.org>
  * Copyright 2005 Clemens Hintze <c.hintze@gmx.net>
  * Copyright 2005 patthoyts - Pat Thoyts <patthoyts@users.sf.net>
- * Copyright 2008 oharboe - Øyvind Harboe - oyvind.harboe@zylin.com
+ * Copyright 2008,2009 oharboe - Øyvind Harboe - oyvind.harboe@zylin.com
  * Copyright 2008 Andrew Lunn <andrew@lunn.ch>
  * Copyright 2008 Duane Ellis <openocd@duaneellis.com>
  * Copyright 2008 Uwe Klein <uklein@klein-messgeraete.de>
  * Copyright 2008 Steve Bennett <steveb@workware.net.au>
+ * Copyright 2009 Nico Coesel <ncoesel@dealogic.nl>
+ * Copyright 2009 Zachary T Welch zw@superlucidity.net
+ * Copyright 2009 David Brownell
  *
  * The FreeBSD license
  *
diff --git a/src/server/gdb_server.c b/src/server/gdb_server.c
index 44d9de838..a0077e93e 100644
--- a/src/server/gdb_server.c
+++ b/src/server/gdb_server.c
@@ -714,7 +714,7 @@ int gdb_target_callback_event_handler(struct target_s *target, enum target_event
 	target_handle_event(target, event);
 	switch (event)
 	{
-		case TARGET_EVENT_EARLY_HALTED:
+		case TARGET_EVENT_GDB_HALT:
 			gdb_frontend_halted(target, connection);
 			break;
 		case TARGET_EVENT_HALTED:
diff --git a/src/target/target.c b/src/target/target.c
index 0040ba0a0..253a7e464 100644
--- a/src/target/target.c
+++ b/src/target/target.c
@@ -157,7 +157,7 @@ static const Jim_Nvp nvp_target_event[] = {
 	{ .value = TARGET_EVENT_OLD_gdb_program_config , .name = "old-gdb_program_config" },
 	{ .value = TARGET_EVENT_OLD_pre_resume         , .name = "old-pre_resume" },
 
-	{ .value = TARGET_EVENT_EARLY_HALTED, .name = "early-halted" },
+	{ .value = TARGET_EVENT_GDB_HALT, .name = "gdb-halt" },
 	{ .value = TARGET_EVENT_HALTED, .name = "halted" },
 	{ .value = TARGET_EVENT_RESUMED, .name = "resumed" },
 	{ .value = TARGET_EVENT_RESUME_START, .name = "resume-start" },
@@ -821,7 +821,7 @@ int target_call_event_callbacks(target_t *target, enum target_event event)
 	if (event == TARGET_EVENT_HALTED)
 	{
 		/* execute early halted first */
-		target_call_event_callbacks(target, TARGET_EVENT_EARLY_HALTED);
+		target_call_event_callbacks(target, TARGET_EVENT_GDB_HALT);
 	}
 
 	LOG_DEBUG("target event %i (%s)",
@@ -1658,6 +1658,15 @@ static int sense_handler(void)
 	return ERROR_OK;
 }
 
+static void target_call_event_callbacks_all(enum target_event e) {
+	target_t *target;
+	target = all_targets;
+	while (target) {
+		target_call_event_callbacks(target, e);
+		target = target->next;
+	}
+}
+
 /* process target state changes */
 int handle_target(void *priv)
 {
@@ -1676,6 +1685,7 @@ int handle_target(void *priv)
 		int did_something = 0;
 		if (runSrstAsserted)
 		{
+			target_call_event_callbacks_all(TARGET_EVENT_GDB_HALT);
 			Jim_Eval(interp, "srst_asserted");
 			did_something = 1;
 		}
@@ -1686,6 +1696,7 @@ int handle_target(void *priv)
 		}
 		if (runPowerDropout)
 		{
+			target_call_event_callbacks_all(TARGET_EVENT_GDB_HALT);
 			Jim_Eval(interp, "power_dropout");
 			did_something = 1;
 		}
@@ -1726,7 +1737,10 @@ int handle_target(void *priv)
 		{
 			/* polling may fail silently until the target has been examined */
 			if ((retval = target_poll(target)) != ERROR_OK)
+			{
+				target_call_event_callbacks(target, TARGET_EVENT_GDB_HALT);
 				return retval;
+			}
 		}
 	}
 
diff --git a/src/target/target.h b/src/target/target.h
index 0ff2258a1..6547d4d78 100644
--- a/src/target/target.h
+++ b/src/target/target.h
@@ -163,8 +163,14 @@ enum target_event
 
 	/* allow GDB to do stuff before others handle the halted event,
 	 * this is in lieu of defining ordering of invocation of events,
-	 * which would be more complicated */
-	TARGET_EVENT_EARLY_HALTED,
+	 * which would be more complicated
+	 *
+	 * Telling GDB to halt does not mean that the target stopped running,
+	 * simply that we're dropping out of GDB's waiting for step or continue.
+	 *
+	 * This can be useful when e.g. detecting power dropout.
+	 */
+	TARGET_EVENT_GDB_HALT,
 	TARGET_EVENT_HALTED,		/* target entered debug state from normal execution or reset */
 	TARGET_EVENT_RESUMED,		/* target resumed to normal execution */
 	TARGET_EVENT_RESUME_START,