diff --git a/src/helper/startup.tcl b/src/helper/startup.tcl
index 7225929fb46922354cf407e0b524f51daf8130d5..229aa066f23026a81414ff678b2edc6bca73e204 100644
--- a/src/helper/startup.tcl
+++ b/src/helper/startup.tcl
@@ -359,3 +359,13 @@ proc capture_catch {a} {
 	} result
 	return $result
 }
+
+
+# Executed during "init". Can be implemented by target script 
+# tar
+proc jtag_init {} {
+	if {[catch {jtag arp_init} err]!=0} {
+		# try resetting additionally
+		jtag arp_init-reset
+	}
+}
\ No newline at end of file
diff --git a/src/jtag/core.c b/src/jtag/core.c
index 07eec64f46528ed31b0d58662ac9bcc4f5702db8..854236f3d15346d31b5d3bba24e89c4803ff34ea 100644
--- a/src/jtag/core.c
+++ b/src/jtag/core.c
@@ -1,16 +1,16 @@
 /***************************************************************************
- *   Copyright (C) 2005 by Dominic Rath                                    *
- *   Dominic.Rath@gmx.de                                                   *
+ *   Copyright (C) 2009 Zachary T Welch                                    *
+ *   zw@superlucidity.net                                                  *
  *                                                                         *
- *   Copyright (C) 2007,2008 Øyvind Harboe                                 *
+ *   Copyright (C) 2007,2008,2009 Øyvind Harboe                            *
  *   oyvind.harboe@zylin.com                                               *
  *                                                                         *
  *   Copyright (C) 2009 SoftPLC Corporation                                *
  *       http://softplc.com                                                *
  *   dick@softplc.com                                                      *
  *                                                                         *
- *   Copyright (C) 2009 Zachary T Welch                                    *
- *   zw@superlucidity.net                                                  *
+ *   Copyright (C) 2005 by Dominic Rath                                    *
+ *   Dominic.Rath@gmx.de                                                   *
  *                                                                         *
  *   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  *
@@ -1230,7 +1230,7 @@ int jtag_interface_init(struct command_context_s *cmd_ctx)
 	return ERROR_OK;
 }
 
-static int jtag_init_inner(struct command_context_s *cmd_ctx)
+int jtag_init_inner(struct command_context_s *cmd_ctx)
 {
 	jtag_tap_t *tap;
 	int retval;
@@ -1334,11 +1334,11 @@ int jtag_init(struct command_context_s *cmd_ctx)
 	int retval;
 	if ((retval = jtag_interface_init(cmd_ctx)) != ERROR_OK)
 		return retval;
-	if (jtag_init_inner(cmd_ctx) == ERROR_OK)
-	{
-		return ERROR_OK;
-	}
-	return jtag_init_reset(cmd_ctx);
+
+	if (Jim_Eval_Named(interp, "jtag_init", __FILE__, __LINE__) != JIM_OK)
+		return ERROR_FAIL;
+
+	return ERROR_OK;
 }
 
 unsigned jtag_get_speed_khz(void)
diff --git a/src/jtag/jtag.h b/src/jtag/jtag.h
index f255a70e19fd0772131c13f129c5919eba341472..786b2b839fc0873fbddef4d6c536c08b1715f436 100644
--- a/src/jtag/jtag.h
+++ b/src/jtag/jtag.h
@@ -335,8 +335,9 @@ extern int  jtag_interface_quit(void);
 extern int  jtag_init(struct command_context_s* cmd_ctx);
 
 /// reset, then initialize JTAG chain
-extern int  jtag_init_reset(struct command_context_s* cmd_ctx);
-extern int  jtag_register_commands(struct command_context_s* cmd_ctx);
+extern int jtag_init_reset(struct command_context_s* cmd_ctx);
+extern int jtag_register_commands(struct command_context_s* cmd_ctx);
+extern int jtag_init_inner(struct command_context_s *cmd_ctx);
 
 /**
  * @file
diff --git a/src/jtag/tcl.c b/src/jtag/tcl.c
index 212be35577bc6a8383c3c3a98fe89f3d2fa6cd75..9101d31eec95f520750eddc9f9f102f73cb6fc31 100644
--- a/src/jtag/tcl.c
+++ b/src/jtag/tcl.c
@@ -410,6 +410,7 @@ static int jim_jtag_command(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
 
 	enum {
 		JTAG_CMD_INTERFACE,
+		JTAG_CMD_INIT,
 		JTAG_CMD_INIT_RESET,
 		JTAG_CMD_NEWTAP,
 		JTAG_CMD_TAPENABLE,
@@ -422,6 +423,7 @@ static int jim_jtag_command(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
 
 	const Jim_Nvp jtag_cmds[] = {
 		{ .name = "interface"     , .value = JTAG_CMD_INTERFACE },
+		{ .name = "arp_init"      , .value = JTAG_CMD_INIT },
 		{ .name = "arp_init-reset", .value = JTAG_CMD_INIT_RESET },
 		{ .name = "newtap"        , .value = JTAG_CMD_NEWTAP },
 		{ .name = "tapisenabled"     , .value = JTAG_CMD_TAPISENABLED },
@@ -455,6 +457,17 @@ static int jim_jtag_command(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
 		}
 		Jim_SetResultString(goi.interp, jtag_interface->name, -1);
 		return JIM_OK;
+	case JTAG_CMD_INIT:
+		if (goi.argc != 0) {
+			Jim_WrongNumArgs(goi.interp, 1, goi.argv-1, "(no params)");
+			return JIM_ERR;
+		}
+		e = jtag_init_inner(context);
+		if (e != ERROR_OK) {
+			Jim_SetResult_sprintf(goi.interp, "error: %d", e);
+			return JIM_ERR;
+		}
+		return JIM_OK;
 	case JTAG_CMD_INIT_RESET:
 		if (goi.argc != 0) {
 			Jim_WrongNumArgs(goi.interp, 1, goi.argv-1, "(no params)");