diff --git a/src/target/target.c b/src/target/target.c
index de78695849a156face981a8a350f056feeeff007..8f785dd302b0ce7f995131ce417ddab9b4ef4381 100644
--- a/src/target/target.c
+++ b/src/target/target.c
@@ -575,7 +575,7 @@ int target_call_event_callbacks(target_t *target, enum target_event event)
 	return ERROR_OK;
 }
 
-int target_call_timer_callbacks()
+static int target_call_timer_callbacks_check_time(int checktime)
 {
 	target_timer_callback_t *callback = target_timer_callbacks;
 	target_timer_callback_t *next_callback;
@@ -587,8 +587,9 @@ int target_call_timer_callbacks()
 	{
 		next_callback = callback->next;
 		
-		if (((now.tv_sec >= callback->when.tv_sec) && (now.tv_usec >= callback->when.tv_usec))
-			|| (now.tv_sec > callback->when.tv_sec))
+		if ((!checktime&&callback->periodic)||
+				(((now.tv_sec >= callback->when.tv_sec) && (now.tv_usec >= callback->when.tv_usec))
+						|| (now.tv_sec > callback->when.tv_sec)))
 		{
 			callback->callback(callback->priv);
 			if (callback->periodic)
@@ -613,13 +614,15 @@ int target_call_timer_callbacks()
 	return ERROR_OK;
 }
 
+int target_call_timer_callbacks()
+{
+	return target_call_timer_callbacks_check_time(1);
+}
+
+/* invoke periodic callbacks immediately */
 int target_call_timer_callbacks_now()
 {
-	/* TODO: this should invoke the timer callbacks now. This is used to ensure that
-	 * any outstanding polls, etc. are in fact invoked before a synchronous command 
-	 * completes. 
-	 */
-	return target_call_timer_callbacks();
+	return target_call_timer_callbacks(0);
 }