diff --git a/src/target/Makefile.am b/src/target/Makefile.am
index 132ac50b3663c459b1fb0f776e51b1f1c81934f8..f28561de1d9568d26acafd989b7d82eb7f315bd1 100644
--- a/src/target/Makefile.am
+++ b/src/target/Makefile.am
@@ -55,6 +55,7 @@ libtarget_la_SOURCES = \
 
 noinst_HEADERS = \
 	target.h \
+	target_type.h \
 	trace.h \
 	register.h \
 	armv4_5.h \
diff --git a/src/target/arm11.c b/src/target/arm11.c
index e9ba1f678d6645862b87fa08cc0a4d69f3d3c714..e4f53f1a7fc533e502efd7d5902e380c5b86e317 100644
--- a/src/target/arm11.c
+++ b/src/target/arm11.c
@@ -26,8 +26,8 @@
 #include "config.h"
 #endif
 
-#define DEFINE_TARGET_TYPE_S
 #include "arm11.h"
+#include "target_type.h"
 
 
 #if 0
diff --git a/src/target/arm720t.c b/src/target/arm720t.c
index 668f2f5e4585115b79d7a0a09023ce98f45941fd..f99ba61bebdf2eb9872b0bd32383d395800fde95 100644
--- a/src/target/arm720t.c
+++ b/src/target/arm720t.c
@@ -21,9 +21,9 @@
 #include "config.h"
 #endif
 
-#define DEFINE_TARGET_TYPE_S
 #include "arm720t.h"
 #include "time_support.h"
+#include "target_type.h"
 
 
 #if 0
diff --git a/src/target/arm7tdmi.c b/src/target/arm7tdmi.c
index 4c86f4a7861a675d6a14802a56abfd55cf398a97..69910f4c8849296644f83ed70073b15aac2e51e9 100644
--- a/src/target/arm7tdmi.c
+++ b/src/target/arm7tdmi.c
@@ -27,8 +27,8 @@
 #include "config.h"
 #endif
 
-#define DEFINE_TARGET_TYPE_S
 #include "arm7tdmi.h"
+#include "target_type.h"
 
 
 #if 0
diff --git a/src/target/arm920t.c b/src/target/arm920t.c
index 21fc46af75eb425b0a263931a2f1c847ebd26e1c..15f6378f3a33eba722cbc631a0071d0a993ae4f5 100644
--- a/src/target/arm920t.c
+++ b/src/target/arm920t.c
@@ -21,9 +21,9 @@
 #include "config.h"
 #endif
 
-#define DEFINE_TARGET_TYPE_S
 #include "arm920t.h"
 #include "time_support.h"
+#include "target_type.h"
 
 
 #if 0
diff --git a/src/target/arm926ejs.c b/src/target/arm926ejs.c
index b643a213df642121eb4a2714546c2471ec4d86d5..5996d089c734a814191fc327c82a01c88a5bf787 100644
--- a/src/target/arm926ejs.c
+++ b/src/target/arm926ejs.c
@@ -21,9 +21,9 @@
 #include "config.h"
 #endif
 
-#define DEFINE_TARGET_TYPE_S
 #include "arm926ejs.h"
 #include "time_support.h"
+#include "target_type.h"
 
 
 #if 0
diff --git a/src/target/arm966e.c b/src/target/arm966e.c
index 7f39d3a769c69e2cea4f3e705827355604640634..425cf6673e4646e6277c993d717fafe499b62d09 100644
--- a/src/target/arm966e.c
+++ b/src/target/arm966e.c
@@ -24,8 +24,8 @@
 #include "config.h"
 #endif
 
-#define DEFINE_TARGET_TYPE_S
 #include "arm966e.h"
+#include "target_type.h"
 
 
 #if 0
diff --git a/src/target/arm9tdmi.c b/src/target/arm9tdmi.c
index 2edeea546c0c8c4e5635d934a2f3673511909838..eb743b12727218cef34bb65bdcec26d684426af8 100644
--- a/src/target/arm9tdmi.c
+++ b/src/target/arm9tdmi.c
@@ -27,8 +27,8 @@
 #include "config.h"
 #endif
 
-#define DEFINE_TARGET_TYPE_S
 #include "arm9tdmi.h"
+#include "target_type.h"
 
 
 #if 0
diff --git a/src/target/avrt.c b/src/target/avrt.c
index db6c101d68545febad28755c306b3f235b66f233..a0b271139db988fa276d88106592b1de8e6c2e99 100644
--- a/src/target/avrt.c
+++ b/src/target/avrt.c
@@ -21,9 +21,9 @@
 #include "config.h"
 #endif
 
-#define DEFINE_TARGET_TYPE_S
 #include "avrt.h"
 #include "target.h"
+#include "target_type.h"
 
 
 #define AVR_JTAG_INS_LEN	4
diff --git a/src/target/cortex_a8.c b/src/target/cortex_a8.c
index 9d62b01522a4d00233bd9d30487feb0a33d6ae0e..025eb45f8f42ce11c1323418a543d14b270c9fa4 100644
--- a/src/target/cortex_a8.c
+++ b/src/target/cortex_a8.c
@@ -33,9 +33,9 @@
 #include "config.h"
 #endif
 
-#define DEFINE_TARGET_TYPE_S
 #include "cortex_a8.h"
 #include "target_request.h"
+#include "target_type.h"
 
 
 /* cli handling */
diff --git a/src/target/cortex_m3.c b/src/target/cortex_m3.c
index fe14cd9e5fe2135658d98a0ca5c58d3e882fbde5..33bfd6ab01eed24e75db763f55e38dbf0fb65345 100644
--- a/src/target/cortex_m3.c
+++ b/src/target/cortex_m3.c
@@ -31,9 +31,9 @@
 #include "config.h"
 #endif
 
-#define DEFINE_TARGET_TYPE_S
 #include "cortex_m3.h"
 #include "target_request.h"
+#include "target_type.h"
 
 
 /* cli handling */
diff --git a/src/target/feroceon.c b/src/target/feroceon.c
index 38cd0b06433339d94d2f969a68e2a15a1216012e..a6b0202203387012b47c5673254f032a73131a81 100644
--- a/src/target/feroceon.c
+++ b/src/target/feroceon.c
@@ -49,8 +49,8 @@
 #include "config.h"
 #endif
 
-#define DEFINE_TARGET_TYPE_S
 #include "arm926ejs.h"
+#include "target_type.h"
 
 
 int feroceon_examine(struct target_s *target);
diff --git a/src/target/mips_m4k.c b/src/target/mips_m4k.c
index fb4729665e8dfa3ea14a686c31a842a5984e906c..7af40c12b132be3697bb81cf30932deb94f79fa8 100644
--- a/src/target/mips_m4k.c
+++ b/src/target/mips_m4k.c
@@ -23,10 +23,10 @@
 #include "config.h"
 #endif
 
-#define DEFINE_TARGET_TYPE_S
 #include "mips32.h"
 #include "mips_m4k.h"
 #include "mips32_dmaacc.h"
+#include "target_type.h"
 
 
 /* cli handling */
diff --git a/src/target/target.c b/src/target/target.c
index d06c317e830d349fe7dc56398fe2e245b6cb4e96..ece03a3a79322fe2aa20be35caa666c3ab96b268 100644
--- a/src/target/target.c
+++ b/src/target/target.c
@@ -33,9 +33,8 @@
 #include "config.h"
 #endif
 
-#define DEFINE_TARGET_TYPE_S
-
 #include "target.h"
+#include "target_type.h"
 #include "target_request.h"
 #include "time_support.h"
 #include "register.h"
diff --git a/src/target/target.h b/src/target/target.h
index dc871bf20f6dfae6532d28d35b7b7f762014dcaf..41b6f4dd4e6d4537fb470d4202632f95caa41509 100644
--- a/src/target/target.h
+++ b/src/target/target.h
@@ -105,164 +105,8 @@ typedef struct working_area_s
 	struct working_area_s *next;
 } working_area_t;
 
-#ifdef DEFINE_TARGET_TYPE_S
-struct target_type_s
-{
-	/**
-	 * Name of the target.  Do @b not access this field directly, use
-	 * target_get_name() instead.
-	 */
-	char *name;
-
-	/**
-	 * Indicates whether this target has been examined.
-	 *
-	 * Do @b not access this field directly, use target_was_examined()
-	 * target_set_examined(), and target_reset_examined().
-	 */
-	int examined;
-
-	/* poll current target status */
-	int (*poll)(struct target_s *target);
-	/* Invoked only from target_arch_state().
-	 * Issue USER() w/architecture specific status.  */
-	int (*arch_state)(struct target_s *target);
-
-	/* target request support */
-	int (*target_request_data)(struct target_s *target, u32 size, u8 *buffer);
-
-	/* halt will log a warning, but return ERROR_OK if the target is already halted. */
-	int (*halt)(struct target_s *target);
-	int (*resume)(struct target_s *target, int current, u32 address, int handle_breakpoints, int debug_execution);
-	int (*step)(struct target_s *target, int current, u32 address, int handle_breakpoints);
-
-	/* target reset control. assert reset can be invoked when OpenOCD and
-	 * the target is out of sync.
-	 *
-	 * A typical example is that the target was power cycled while OpenOCD
-	 * thought the target was halted or running.
-	 *
-	 * assert_reset() can therefore make no assumptions whatsoever about the
-	 * state of the target
-	 *
-	 * Before assert_reset() for the target is invoked, a TRST/tms and
-	 * chain validation is executed. TRST should not be asserted
-	 * during target assert unless there is no way around it due to
-	 * the way reset's are configured.
-	 *
-	 */
-	int (*assert_reset)(struct target_s *target);
-	int (*deassert_reset)(struct target_s *target);
-	int (*soft_reset_halt_imp)(struct target_s *target);
-	int (*soft_reset_halt)(struct target_s *target);
-
-	/**
-	 * Target register access for GDB.  Do @b not call this function
-	 * directly, use target_get_gdb_reg_list() instead.
-	 *
-	 * Danger! this function will succeed even if the target is running
-	 * and return a register list with dummy values.
-	 *
-	 * The reason is that GDB connection will fail without a valid register
-	 * list, however it is after GDB is connected that monitor commands can
-	 * be run to properly initialize the target
-	 */
-	int (*get_gdb_reg_list)(struct target_s *target, struct reg_s **reg_list[], int *reg_list_size);
-
-	/* target memory access
-	* size: 1 = byte (8bit), 2 = half-word (16bit), 4 = word (32bit)
-	* count: number of items of <size>
-	*/
-	int (*read_memory_imp)(struct target_s *target, u32 address, u32 size, u32 count, u8 *buffer);
-	/**
-	 * Target memory read callback.  Do @b not call this function
-	 * directly, use target_read_memory() instead.
-	 */
-	int (*read_memory)(struct target_s *target, u32 address, u32 size, u32 count, u8 *buffer);
-	int (*write_memory_imp)(struct target_s *target, u32 address, u32 size, u32 count, u8 *buffer);
-	/**
-	 * Target memory write callback.  Do @b not call this function
-	 * directly, use target_write_memory() instead.
-	 */
-	int (*write_memory)(struct target_s *target, u32 address, u32 size, u32 count, u8 *buffer);
-
-	/**
-	 * Write target memory in multiples of 4 bytes, optimized for
-	 * writing large quantities of data.  Do @b not call this
-	 * function directly, use target_bulk_write_memory() instead.
-	 */
-	int (*bulk_write_memory)(struct target_s *target, u32 address, u32 count, u8 *buffer);
-
-	int (*checksum_memory)(struct target_s *target, u32 address, u32 count, u32* checksum);
-	int (*blank_check_memory)(struct target_s *target, u32 address, u32 count, u32* blank);
-
-	/*
-	 * target break-/watchpoint control
-	 * rw: 0 = write, 1 = read, 2 = access
-	 *
-	 * Target must be halted while this is invoked as this
-	 * will actually set up breakpoints on target.
-	 *
-	 * The breakpoint hardware will be set up upon adding the first breakpoint.
-	 *
-	 * Upon GDB connection all breakpoints/watchpoints are cleared.
-	 */
-	int (*add_breakpoint)(struct target_s *target, breakpoint_t *breakpoint);
-
-	/* remove breakpoint. hw will only be updated if the target is currently halted.
-	 * However, this method can be invoked on unresponsive targets.
-	 */
-	int (*remove_breakpoint)(struct target_s *target, breakpoint_t *breakpoint);
-	int (*add_watchpoint)(struct target_s *target, watchpoint_t *watchpoint);
-	/* remove watchpoint. hw will only be updated if the target is currently halted.
-	 * However, this method can be invoked on unresponsive targets.
-	 */
-	int (*remove_watchpoint)(struct target_s *target, watchpoint_t *watchpoint);
-
-	/* target algorithm support */
-	int (*run_algorithm_imp)(struct target_s *target, int num_mem_params, mem_param_t *mem_params, int num_reg_params, reg_param_t *reg_param, u32 entry_point, u32 exit_point, int timeout_ms, void *arch_info);
-	/**
-	 * Target algorithm support.  Do @b not call this method directly,
-	 * use target_run_algorithm() instead.
-	 */
-	int (*run_algorithm)(struct target_s *target, int num_mem_params, mem_param_t *mem_params, int num_reg_params, reg_param_t *reg_param, u32 entry_point, u32 exit_point, int timeout_ms, void *arch_info);
-
-	int (*register_commands)(struct command_context_s *cmd_ctx);
-
-	/* called when target is created */
-	int (*target_create)( struct target_s *target, Jim_Interp *interp );
-
-	/* called for various config parameters */
-	/* returns JIM_CONTINUE - if option not understood */
-	/* otherwise: JIM_OK, or JIM_ERR, */
-	int (*target_jim_configure)( struct target_s *target, Jim_GetOptInfo *goi );
-
-	/* target commands specifically handled by the target */
-	/* returns JIM_OK, or JIM_ERR, or JIM_CONTINUE - if option not understood */
-	int (*target_jim_commands)( struct target_s *target, Jim_GetOptInfo *goi );
-
-	/* invoked after JTAG chain has been examined & validated. During
-	 * this stage the target is examined and any additional setup is
-	 * performed.
-	 *
-	 * invoked every time after the jtag chain has been validated/examined
-	 */
-	int (*examine)(struct target_s *target);
-	/* Set up structures for target.
-	 *
-	 * It is illegal to talk to the target at this stage as this fn is invoked
-	 * before the JTAG chain has been examined/verified
-	 * */
-	int (*init_target)(struct command_context_s *cmd_ctx, struct target_s *target);
-	int (*quit)(void);
-
-	int (*virt2phys)(struct target_s *target, u32 address, u32 *physical);
-	int (*mmu)(struct target_s *target, int *enabled);
-
-};
-#else
+// target_type.h contains the full definitionof struct target_type_s
 struct target_type_s;
-#endif // DEFINE_TARGET_TYPE_S
 typedef struct target_type_s target_type_t;
 
 /* forward decloration */
diff --git a/src/target/target_request.c b/src/target/target_request.c
index 30c0c7610b5bb33a466e7b8597830fdd44b3fb2c..202701face4218fd4fa6f43bb2431993dfbe1568 100644
--- a/src/target/target_request.c
+++ b/src/target/target_request.c
@@ -27,8 +27,8 @@
 #include "config.h"
 #endif
 
-#define DEFINE_TARGET_TYPE_S
 #include "target_request.h"
+#include "target_type.h"
 #include "binarybuffer.h"
 #include "trace.h"
 #include "log.h"
diff --git a/src/target/target_type.h b/src/target/target_type.h
new file mode 100644
index 0000000000000000000000000000000000000000..6936bb72d03562febe59e34293e81d59fb586749
--- /dev/null
+++ b/src/target/target_type.h
@@ -0,0 +1,163 @@
+#ifndef TARGET_TYPE_H
+#define TARGET_TYPE_H
+
+#include "types.h"
+
+struct target_s;
+
+struct target_type_s
+{
+	/**
+	 * Name of the target.  Do @b not access this field directly, use
+	 * target_get_name() instead.
+	 */
+	char *name;
+
+	/**
+	 * Indicates whether this target has been examined.
+	 *
+	 * Do @b not access this field directly, use target_was_examined()
+	 * target_set_examined(), and target_reset_examined().
+	 */
+	int examined;
+
+	/* poll current target status */
+	int (*poll)(struct target_s *target);
+	/* Invoked only from target_arch_state().
+	 * Issue USER() w/architecture specific status.  */
+	int (*arch_state)(struct target_s *target);
+
+	/* target request support */
+	int (*target_request_data)(struct target_s *target, u32 size, u8 *buffer);
+
+	/* halt will log a warning, but return ERROR_OK if the target is already halted. */
+	int (*halt)(struct target_s *target);
+	int (*resume)(struct target_s *target, int current, u32 address, int handle_breakpoints, int debug_execution);
+	int (*step)(struct target_s *target, int current, u32 address, int handle_breakpoints);
+
+	/* target reset control. assert reset can be invoked when OpenOCD and
+	 * the target is out of sync.
+	 *
+	 * A typical example is that the target was power cycled while OpenOCD
+	 * thought the target was halted or running.
+	 *
+	 * assert_reset() can therefore make no assumptions whatsoever about the
+	 * state of the target
+	 *
+	 * Before assert_reset() for the target is invoked, a TRST/tms and
+	 * chain validation is executed. TRST should not be asserted
+	 * during target assert unless there is no way around it due to
+	 * the way reset's are configured.
+	 *
+	 */
+	int (*assert_reset)(struct target_s *target);
+	int (*deassert_reset)(struct target_s *target);
+	int (*soft_reset_halt_imp)(struct target_s *target);
+	int (*soft_reset_halt)(struct target_s *target);
+
+	/**
+	 * Target register access for GDB.  Do @b not call this function
+	 * directly, use target_get_gdb_reg_list() instead.
+	 *
+	 * Danger! this function will succeed even if the target is running
+	 * and return a register list with dummy values.
+	 *
+	 * The reason is that GDB connection will fail without a valid register
+	 * list, however it is after GDB is connected that monitor commands can
+	 * be run to properly initialize the target
+	 */
+	int (*get_gdb_reg_list)(struct target_s *target, struct reg_s **reg_list[], int *reg_list_size);
+
+	/* target memory access
+	* size: 1 = byte (8bit), 2 = half-word (16bit), 4 = word (32bit)
+	* count: number of items of <size>
+	*/
+	int (*read_memory_imp)(struct target_s *target, u32 address, u32 size, u32 count, u8 *buffer);
+	/**
+	 * Target memory read callback.  Do @b not call this function
+	 * directly, use target_read_memory() instead.
+	 */
+	int (*read_memory)(struct target_s *target, u32 address, u32 size, u32 count, u8 *buffer);
+	int (*write_memory_imp)(struct target_s *target, u32 address, u32 size, u32 count, u8 *buffer);
+	/**
+	 * Target memory write callback.  Do @b not call this function
+	 * directly, use target_write_memory() instead.
+	 */
+	int (*write_memory)(struct target_s *target, u32 address, u32 size, u32 count, u8 *buffer);
+
+	/**
+	 * Write target memory in multiples of 4 bytes, optimized for
+	 * writing large quantities of data.  Do @b not call this
+	 * function directly, use target_bulk_write_memory() instead.
+	 */
+	int (*bulk_write_memory)(struct target_s *target, u32 address, u32 count, u8 *buffer);
+
+	int (*checksum_memory)(struct target_s *target, u32 address, u32 count, u32* checksum);
+	int (*blank_check_memory)(struct target_s *target, u32 address, u32 count, u32* blank);
+
+	/*
+	 * target break-/watchpoint control
+	 * rw: 0 = write, 1 = read, 2 = access
+	 *
+	 * Target must be halted while this is invoked as this
+	 * will actually set up breakpoints on target.
+	 *
+	 * The breakpoint hardware will be set up upon adding the first breakpoint.
+	 *
+	 * Upon GDB connection all breakpoints/watchpoints are cleared.
+	 */
+	int (*add_breakpoint)(struct target_s *target, breakpoint_t *breakpoint);
+
+	/* remove breakpoint. hw will only be updated if the target is currently halted.
+	 * However, this method can be invoked on unresponsive targets.
+	 */
+	int (*remove_breakpoint)(struct target_s *target, breakpoint_t *breakpoint);
+	int (*add_watchpoint)(struct target_s *target, watchpoint_t *watchpoint);
+	/* remove watchpoint. hw will only be updated if the target is currently halted.
+	 * However, this method can be invoked on unresponsive targets.
+	 */
+	int (*remove_watchpoint)(struct target_s *target, watchpoint_t *watchpoint);
+
+	/* target algorithm support */
+	int (*run_algorithm_imp)(struct target_s *target, int num_mem_params, mem_param_t *mem_params, int num_reg_params, reg_param_t *reg_param, u32 entry_point, u32 exit_point, int timeout_ms, void *arch_info);
+	/**
+	 * Target algorithm support.  Do @b not call this method directly,
+	 * use target_run_algorithm() instead.
+	 */
+	int (*run_algorithm)(struct target_s *target, int num_mem_params, mem_param_t *mem_params, int num_reg_params, reg_param_t *reg_param, u32 entry_point, u32 exit_point, int timeout_ms, void *arch_info);
+
+	int (*register_commands)(struct command_context_s *cmd_ctx);
+
+	/* called when target is created */
+	int (*target_create)( struct target_s *target, Jim_Interp *interp );
+
+	/* called for various config parameters */
+	/* returns JIM_CONTINUE - if option not understood */
+	/* otherwise: JIM_OK, or JIM_ERR, */
+	int (*target_jim_configure)( struct target_s *target, Jim_GetOptInfo *goi );
+
+	/* target commands specifically handled by the target */
+	/* returns JIM_OK, or JIM_ERR, or JIM_CONTINUE - if option not understood */
+	int (*target_jim_commands)( struct target_s *target, Jim_GetOptInfo *goi );
+
+	/* invoked after JTAG chain has been examined & validated. During
+	 * this stage the target is examined and any additional setup is
+	 * performed.
+	 *
+	 * invoked every time after the jtag chain has been validated/examined
+	 */
+	int (*examine)(struct target_s *target);
+	/* Set up structures for target.
+	 *
+	 * It is illegal to talk to the target at this stage as this fn is invoked
+	 * before the JTAG chain has been examined/verified
+	 * */
+	int (*init_target)(struct command_context_s *cmd_ctx, struct target_s *target);
+	int (*quit)(void);
+
+	int (*virt2phys)(struct target_s *target, u32 address, u32 *physical);
+	int (*mmu)(struct target_s *target, int *enabled);
+
+};
+
+#endif // TARGET_TYPE_H
diff --git a/src/target/xscale.c b/src/target/xscale.c
index a375608d186d755e76f7df3afaa4213ad0817e8d..7838e50e6b729ce79d6bb64b562b8cf3008cc199 100644
--- a/src/target/xscale.c
+++ b/src/target/xscale.c
@@ -24,8 +24,8 @@
 #include "config.h"
 #endif
 
-#define DEFINE_TARGET_TYPE_S
 #include "xscale.h"
+#include "target_type.h"
 #include "arm7_9_common.h"
 #include "arm_simulator.h"
 #include "arm_disassembler.h"