diff --git a/contrib/libdcc/README b/contrib/libdcc/README
index 9e623070c37a97413cd203ee41276fd605cd3085..d67ccce3f1cfe699b02b3db4179232867f2d00f4 100644
--- a/contrib/libdcc/README
+++ b/contrib/libdcc/README
@@ -3,11 +3,16 @@ This code is an example of using the openocd debug message system.
 Before the message output is seen in the debug window, the functionality
 will need enabling:
 
-** GDB **
-From the gdb prompt: monitor target_request debugmsgs enable
+From the gdb prompt:
+monitor target_request debugmsgs enable
+monitor trace point 1
 
-** Telnet **
-From the Telnet prompt: target_request debugmsgs enable
+From the Telnet prompt:
+target_request debugmsgs enable
+trace point 1
+
+To see how many times the trace point was hit:
+(monitor) trace point 1
 
 Spen
 spen@spen-soft.co.uk
diff --git a/contrib/libdcc/dcc_stdio.c b/contrib/libdcc/dcc_stdio.c
index edc55c5992755779ca859d9c9081df49cd00748a..3d8dfc7141f66c819685897b5ec663656fc269aa 100644
--- a/contrib/libdcc/dcc_stdio.c
+++ b/contrib/libdcc/dcc_stdio.c
@@ -3,6 +3,8 @@
  *   Dominic.Rath@gmx.de                                                   *
  *   Copyright (C) 2008 by Spencer Oliver                                  *
  *   spen@spen-soft.co.uk                                                  *
+ *   Copyright (C) 2008 by Frederik Kriewtz                                *
+ *   frederik@kriewitz.eu                                                  *
  *                                                                         *
  *   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  *
@@ -30,33 +32,35 @@
  * DCRDR[23:16] is used for by host for status
  * DCRDR[31:24] is used for by host for write buffer */
 
-#define DCRDR_WRSTS	*((volatile u8*)0xE000EDF8)
-#define DCRDR_WRDAT	*((volatile u8*)0xE000EDF9)
+#define NVIC_DBG_DATA_R         (*((volatile unsigned short *)0xE000EDF8))
+
+#define TARGET_REQ_TRACEMSG                 0x00
+#define TARGET_REQ_DEBUGMSG_ASCII           0x01
+#define TARGET_REQ_DEBUGMSG_HEXMSG(size)    (0x01 | ((size & 0xff)  << 8))
+#define TARGET_REQ_DEBUGCHAR                0x02
 
 #define	BUSY	1
 
-void dbg_write(u32 dcc_data)
+void dbg_write(unsigned long dcc_data)
 {
 	int len = 4;
 	
 	while (len--)
 	{
 		/* wait for data ready */
-		while (DCRDR_WRSTS & BUSY);
+		while (NVIC_DBG_DATA_R & BUSY);
 		
-		/* write our data */
-		DCRDR_WRDAT = (u8)(dcc_data & 0xff);
-		/* set write flag - tell host there is data */
-		DCRDR_WRSTS = BUSY;
+		/* write our data and set write flag - tell host there is data*/
+		NVIC_DBG_DATA_R = (unsigned short)(((dcc_data & 0xff) << 8) | BUSY);
 		dcc_data >>= 8;
 	}
 }
 
 #elif defined(__ARM_ARCH_4T__) || defined(__ARM_ARCH_5TE__)
 					
-void dbg_write(u32 dcc_data)
+void dbg_write(unsigned long dcc_data)
 {
-	u32 dcc_status;
+	unsigned long dcc_status;
 	
 	do {
 		asm volatile("mrc p14, 0, %0, c0, c0" : "=r" (dcc_status));
@@ -69,10 +73,14 @@ void dbg_write(u32 dcc_data)
  #error unsupported target
 #endif
 
+void dbg_trace_point(unsigned long number)
+{	
+	dbg_write(TARGET_REQ_TRACEMSG | (number << 8));
+}
 
-void dbg_write_u32(u32 *val, u32 len)
+void dbg_write_u32(const unsigned long *val, long len)
 {	
-	dbg_write(0x01 | 0x0400 | ((len & 0xffff) << 16));
+	dbg_write(TARGET_REQ_DEBUGMSG_HEXMSG(4) | ((len & 0xffff) << 16));
 
 	while (len > 0)
 	{
@@ -83,16 +91,16 @@ void dbg_write_u32(u32 *val, u32 len)
 	}
 }
 
-void dbg_write_u16(u16 *val, u32 len)
+void dbg_write_u16(const unsigned short *val, long len)
 {
-	u32 dcc_data;
+	unsigned long dcc_data;
 		
-	dbg_write(0x01 | 0x0200 | ((len & 0xffff) << 16));
+	dbg_write(TARGET_REQ_DEBUGMSG_HEXMSG(2) | ((len & 0xffff) << 16));
 
 	while (len > 0)
 	{
-		dcc_data = val[0] | (val[1] << 8)
-			| ((len > 1) ? (val[2] | (val[3] << 8)) << 16 : 0x00);
+		dcc_data = val[0] 
+			| ((len > 1) ? val[1] << 16: 0x0000);
 		
 		dbg_write(dcc_data);
 		
@@ -101,11 +109,11 @@ void dbg_write_u16(u16 *val, u32 len)
 	}
 }
 
-void dbg_write_u8(u8 *val, u32 len)
+void dbg_write_u8(const unsigned char *val, long len)
 {	
-	u32 dcc_data;
+	unsigned long dcc_data;
 
-	dbg_write(0x01 | 0x0100 | ((len & 0xffff) << 16));
+	dbg_write(TARGET_REQ_DEBUGMSG_HEXMSG(1) | ((len & 0xffff) << 16));
 
 	while (len > 0)
 	{
@@ -116,22 +124,22 @@ void dbg_write_u8(u8 *val, u32 len)
 		
 		dbg_write(dcc_data);
 		
-		val += 2;
-		len -= 2;
+		val += 4;
+		len -= 4;
 	}
 }
 
-void dbg_write_str(u8 *msg)
+void dbg_write_str(const char *msg)
 {
-	int len;
-	u32 dcc_data;
+	long len;
+	unsigned long dcc_data;
 	
 	for (len = 0; msg[len] && (len < 65536); len++);
 	
-	dbg_write(0x01 | ((len & 0xffff) << 16));
+	dbg_write(TARGET_REQ_DEBUGMSG_ASCII | ((len & 0xffff) << 16));
 	
 	while (len > 0)
-	{		
+	{
 		dcc_data = msg[0]
 			| ((len > 1) ? msg[1] << 8 : 0x00)
 			| ((len > 2) ? msg[2] << 16 : 0x00)
@@ -143,7 +151,7 @@ void dbg_write_str(u8 *msg)
 	}
 }
 
-void dbg_write_char(u8 msg)
+void dbg_write_char(char msg)
 {	
-	dbg_write(0x02 | ((msg & 0xff) << 16));
+	dbg_write(TARGET_REQ_DEBUGCHAR | ((msg & 0xff) << 16));
 }
diff --git a/contrib/libdcc/dcc_stdio.h b/contrib/libdcc/dcc_stdio.h
index d7546d7b6e2d247d6d249aee26694af3d22d1f7b..d16f2a7895230c773cfbde4517fcc2961f237204 100644
--- a/contrib/libdcc/dcc_stdio.h
+++ b/contrib/libdcc/dcc_stdio.h
@@ -23,15 +23,13 @@
 #ifndef DCC_STDIO_H
 #define DCC_STDIO_H
 
-typedef unsigned char u8;
-typedef unsigned short u16;
-typedef unsigned long u32;
+void dbg_trace_point(unsigned long number);
 
-void dbg_write_u32(u32 *val, u32 len);
-void dbg_write_u16(u16 *val, u32 len);
-void dbg_write_u8(u8 *val, u32 len);
+void dbg_write_u32(const unsigned long *val, long len);
+void dbg_write_u16(const unsigned short *val, long len);
+void dbg_write_u8(const unsigned char *val, long len);
 
-void dbg_write_str(u8 *msg);
-void dbg_write_char(u8 msg);
+void dbg_write_str(const char *msg);
+void dbg_write_char(char msg);
 
 #endif	/* DCC_STDIO_H */
diff --git a/contrib/libdcc/example.c b/contrib/libdcc/example.c
index 42a9bd58daf155c7e8f99abb39d22a89430c5c6a..d456f3955125197db28300c7f5911c7d94883e94 100644
--- a/contrib/libdcc/example.c
+++ b/contrib/libdcc/example.c
@@ -1,6 +1,8 @@
 /***************************************************************************
  *   Copyright (C) 2008 by Spencer Oliver                                  *
  *   spen@spen-soft.co.uk                                                  *
+ *   Copyright (C) 2008 by Frederik Kriewtz                                *
+ *   frederik@kriewitz.eu                                                  *
  *                                                                         *
  *   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  *
@@ -20,13 +22,37 @@
 
 #include "dcc_stdio.h"
 
+/* enable openocd debugmsg at the gdb prompt:
+ * monitor target_request debugmsgs enable 
+ * 
+ * create a trace point:
+ * monitor trace point 1
+ * 
+ * to show how often the trace point was hit:
+ * monitor trace point
+*/
+
 int main(void)
 {
-	/* enable openocd debugmsg at the gdb prompt
-	 * monitor target_request debugmsgs enable */
-
 	dbg_write_str("hello world");
-	dbg_write_char('a');
-	
-	while(1) {}
+
+	dbg_write_char('t');
+	dbg_write_char('e');
+	dbg_write_char('s');
+	dbg_write_char('t');
+	dbg_write_char('\n');
+
+	unsigned long test_u32 = 0x01234567;
+	dbg_write_u32(&test_u32, 1);
+
+	static const unsigned short test_u16[] = {0x0123, 0x4567, 0x89AB, 0xCDEF, 0x0123, 0x4567, 0x89AB, 0xCDEF};
+	dbg_write_u16(test_u16, 8);
+
+	static const unsigned char test_u8[] = {0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xAA, 0xBB, 0xCC, 0XDD, 0xEE, 0xFF};
+	dbg_write_u8(test_u8, 16);
+
+	while(1)
+	{
+		dbg_trace_point(0);
+	}
 }