diff --git a/test/api_test/Makefile.am b/test/api_test/Makefile.am
index 5104454..bad7132 100644
--- a/test/api_test/Makefile.am
+++ b/test/api_test/Makefile.am
@@ -1,6 +1,12 @@
 include $(top_srcdir)/test/Makefile.inc
 
 bin_PROGRAMS = odp_atomic odp_shm odp_ring odp_timer_ping
+
+odp_atomic_CFLAGS = $(AM_CFLAGS) -I $(top_srcdir)/test
+odp_shm_CFLAGS = $(AM_CFLAGS) -I $(top_srcdir)/test
+odp_ring_CFLAGS = $(AM_CFLAGS) -I $(top_srcdir)/test
+odp_timer_ping_CFLAGS = $(AM_CFLAGS) -I $(top_srcdir)/test
+
 odp_atomic_LDFLAGS = $(AM_LDFLAGS) -static
 odp_shm_LDFLAGS = $(AM_LDFLAGS) -static
 odp_ring_LDFLAGS = $(AM_LDFLAGS) -static
diff --git a/test/api_test/odp_atomic_test.c b/test/api_test/odp_atomic_test.c
index 3ca7674..f07c962 100644
--- a/test/api_test/odp_atomic_test.c
+++ b/test/api_test/odp_atomic_test.c
@@ -6,9 +6,9 @@
 
 #include <string.h>
 #include <sys/time.h>
-#include <odp_debug.h>
 #include <odp_common.h>
 #include <odp_atomic_test.h>
+#include <test_debug.h>
 
 static odp_atomic_u32_t a32u;
 static odp_atomic_u64_t a64u;
@@ -166,12 +166,12 @@ void test_atomic_store(void)
 int test_atomic_validate(void)
 {
 	if (odp_atomic_load_u32(&a32u) != U32_INIT_VAL) {
-		ODP_ERR("Atomic u32 usual functions failed\n");
+		LOG_ERR("Atomic u32 usual functions failed\n");
 		return -1;
 	}
 
 	if (odp_atomic_load_u64(&a64u) != U64_INIT_VAL) {
-		ODP_ERR("Atomic u64 usual functions failed\n");
+		LOG_ERR("Atomic u64 usual functions failed\n");
 		return -1;
 	}
 
@@ -247,7 +247,7 @@ int main(int argc, char *argv[])
 			sscanf(argv[++i], "%d", &pthrdnum);
 			break;
 		default:
-			ODP_ERR("Invalid option %c\n", c);
+			LOG_ERR("Invalid option %c\n", c);
 			usage();
 			goto err_exit;
 		}
@@ -273,7 +273,7 @@ int main(int argc, char *argv[])
 	if ((test_type > 0) && (test_type < TEST_MAX)) {
 		printf("%s\n", test_name[test_type]);
 	} else {
-		ODP_ERR("Invalid test case [%d]\n", test_type);
+		LOG_ERR("Invalid test case [%d]\n", test_type);
 		usage();
 		goto err_exit;
 	}
diff --git a/test/api_test/odp_common.c b/test/api_test/odp_common.c
index ed1fc97..329d4d4 100644
--- a/test/api_test/odp_common.c
+++ b/test/api_test/odp_common.c
@@ -16,6 +16,7 @@
 #include <odp_common.h>
 #include <odp_atomic_test.h>
 #include <odp_shm_test.h>
+#include <test_debug.h>
 
 
 /* Globals */
@@ -57,7 +58,7 @@ int odp_test_global_init(void)
 	memset(thread_tbl, 0, sizeof(thread_tbl));
 
 	if (odp_init_global(NULL, NULL)) {
-		ODP_ERR("ODP global init failed.\n");
+		LOG_ERR("ODP global init failed.\n");
 		return -1;
 	}
 
diff --git a/test/api_test/odp_ring_test.c b/test/api_test/odp_ring_test.c
index eb1f301..a55a0cd 100644
--- a/test/api_test/odp_ring_test.c
+++ b/test/api_test/odp_ring_test.c
@@ -48,9 +48,9 @@
 #include <stdio.h>
 #include <string.h>
 #include <odp.h>
-#include <odp_debug.h>
 #include <odp_common.h>
 #include <odph_ring.h>
+#include <test_debug.h>
 
 #define RING_SIZE 4096
 #define MAX_BULK 32
@@ -66,7 +66,7 @@ static int test_ring_basic(odph_ring_t *r)
 	/* alloc dummy object pointers */
 	src = malloc(RING_SIZE*2*sizeof(void *));
 	if (src == NULL) {
-		ODP_ERR("failed to allocate test ring src memory\n");
+		LOG_ERR("failed to allocate test ring src memory\n");
 		goto fail;
 	}
 	for (i = 0; i < RING_SIZE*2; i++)
@@ -77,7 +77,7 @@ static int test_ring_basic(odph_ring_t *r)
 	/* alloc some room for copied objects */
 	dst = malloc(RING_SIZE*2*sizeof(void *));
 	if (dst == NULL) {
-		ODP_ERR("failed to allocate test ring dst memory\n");
+		LOG_ERR("failed to allocate test ring dst memory\n");
 		goto fail;
 	}
 
@@ -89,7 +89,7 @@ static int test_ring_basic(odph_ring_t *r)
 	ret = odph_ring_sp_enqueue_burst(r, cur_src, 1);
 	cur_src += 1;
 	if ((ret & ODPH_RING_SZ_MASK) != 1) {
-		ODP_ERR("sp_enq for 1 obj failed\n");
+		LOG_ERR("sp_enq for 1 obj failed\n");
 		goto fail;
 	}
 
@@ -97,14 +97,14 @@ static int test_ring_basic(odph_ring_t *r)
 	ret = odph_ring_sp_enqueue_burst(r, cur_src, 2);
 	cur_src += 2;
 	if ((ret & ODPH_RING_SZ_MASK) != 2) {
-		ODP_ERR("sp_enq for 2 obj failed\n");
+		LOG_ERR("sp_enq for 2 obj failed\n");
 		goto fail;
 	}
 
 	printf("enqueue MAX_BULK objs\n");
 	ret = odph_ring_sp_enqueue_burst(r, cur_src, MAX_BULK);
 	if ((ret & ODPH_RING_SZ_MASK) != MAX_BULK) {
-		ODP_ERR("sp_enq for %d obj failed\n", MAX_BULK);
+		LOG_ERR("sp_enq for %d obj failed\n", MAX_BULK);
 		goto fail;
 	}
 
@@ -112,7 +112,7 @@ static int test_ring_basic(odph_ring_t *r)
 	ret = odph_ring_sc_dequeue_burst(r, cur_dst, 1);
 	cur_dst += 1;
 	if ((ret & ODPH_RING_SZ_MASK) != 1) {
-		ODP_ERR("sc_deq for 1 obj failed\n");
+		LOG_ERR("sc_deq for 1 obj failed\n");
 		goto fail;
 	}
 
@@ -120,7 +120,7 @@ static int test_ring_basic(odph_ring_t *r)
 	ret = odph_ring_sc_dequeue_burst(r, cur_dst, 2);
 	cur_dst += 2;
 	if ((ret & ODPH_RING_SZ_MASK) != 2) {
-		ODP_ERR("sc_deq for 2 obj failed\n");
+		LOG_ERR("sc_deq for 2 obj failed\n");
 		goto fail;
 	}
 
@@ -128,13 +128,13 @@ static int test_ring_basic(odph_ring_t *r)
 	ret = odph_ring_sc_dequeue_burst(r, cur_dst, MAX_BULK);
 	cur_dst += MAX_BULK;
 	if ((ret & ODPH_RING_SZ_MASK) != MAX_BULK) {
-		ODP_ERR("sc_deq for %d obj failed\n", MAX_BULK);
+		LOG_ERR("sc_deq for %d obj failed\n", MAX_BULK);
 		goto fail;
 	}
 
 	/* check data */
 	if (memcmp(src, dst, cur_dst - dst)) {
-		ODP_ERR("data after dequeue is not the same\n");
+		LOG_ERR("data after dequeue is not the same\n");
 		goto fail;
 	}
 
@@ -147,46 +147,46 @@ static int test_ring_basic(odph_ring_t *r)
 	ret = odph_ring_mp_enqueue_bulk(r, cur_src, 1);
 	cur_src += 1;
 	if (ret != 0) {
-		ODP_ERR("mp_enq for 1 obj failed\n");
+		LOG_ERR("mp_enq for 1 obj failed\n");
 		goto fail;
 	}
 	printf("enqueue 2 objs\n");
 	ret = odph_ring_mp_enqueue_bulk(r, cur_src, 2);
 	cur_src += 2;
 	if (ret != 0) {
-		ODP_ERR("mp_enq for 2 obj failed\n");
+		LOG_ERR("mp_enq for 2 obj failed\n");
 		goto fail;
 	}
 	printf("enqueue MAX_BULK objs\n");
 	ret = odph_ring_mp_enqueue_bulk(r, cur_src, MAX_BULK);
 	if (ret != 0) {
-		ODP_ERR("mp_enq for %d obj failed\n", MAX_BULK);
+		LOG_ERR("mp_enq for %d obj failed\n", MAX_BULK);
 		goto fail;
 	}
 	printf("dequeue 1 obj\n");
 	ret = odph_ring_mc_dequeue_bulk(r, cur_dst, 1);
 	cur_dst += 1;
 	if (ret != 0) {
-		ODP_ERR("mc_deq for 1 obj failed\n");
+		LOG_ERR("mc_deq for 1 obj failed\n");
 		goto fail;
 	}
 	printf("dequeue 2 objs\n");
 	ret = odph_ring_mc_dequeue_bulk(r, cur_dst, 2);
 	cur_dst += 2;
 	if (ret != 0) {
-		ODP_ERR("mc_deq for 2 obj failed\n");
+		LOG_ERR("mc_deq for 2 obj failed\n");
 		goto fail;
 	}
 	printf("dequeue MAX_BULK objs\n");
 	ret = odph_ring_mc_dequeue_bulk(r, cur_dst, MAX_BULK);
 	cur_dst += MAX_BULK;
 	if (ret != 0) {
-		ODP_ERR("mc_deq for %d obj failed\n", MAX_BULK);
+		LOG_ERR("mc_deq for %d obj failed\n", MAX_BULK);
 		goto fail;
 	}
 	/* check data */
 	if (memcmp(src, dst, cur_dst - dst)) {
-		ODP_ERR("data after dequeue is not the same\n");
+		LOG_ERR("data after dequeue is not the same\n");
 		goto fail;
 	}
 
@@ -200,30 +200,30 @@ static int test_ring_basic(odph_ring_t *r)
 	ret = odph_ring_mp_enqueue_bulk(r, cur_src, num_elems);
 	cur_src += num_elems;
 	if (ret != 0) {
-		ODP_ERR("Cannot enqueue\n");
+		LOG_ERR("Cannot enqueue\n");
 		goto fail;
 	}
 	ret = odph_ring_mp_enqueue_bulk(r, cur_src, num_elems);
 	if (ret != -EDQUOT) {
-		ODP_ERR("Watermark not exceeded\n");
+		LOG_ERR("Watermark not exceeded\n");
 		goto fail;
 	}
 	ret = odph_ring_mc_dequeue_bulk(r, cur_dst, num_elems);
 	cur_dst += num_elems;
 	if (ret != 0) {
-		ODP_ERR("Cannot dequeue\n");
+		LOG_ERR("Cannot dequeue\n");
 		goto fail;
 	}
 	ret = odph_ring_mc_dequeue_bulk(r, cur_dst, num_elems);
 	cur_dst += num_elems;
 	if (ret != 0) {
-		ODP_ERR("Cannot dequeue2\n");
+		LOG_ERR("Cannot dequeue2\n");
 		goto fail;
 	}
 
 	/* check data */
 	if (memcmp(src, dst, cur_dst - dst)) {
-		ODP_ERR("data after dequeue is not the same\n");
+		LOG_ERR("data after dequeue is not the same\n");
 		goto fail;
 	}
 
@@ -253,7 +253,7 @@ static int producer_fn(void)
 	/* alloc dummy object pointers */
 	src = malloc(MAX_BULK*2*sizeof(void *));
 	if (src == NULL) {
-		ODP_ERR("failed to allocate producer memory.\n");
+		LOG_ERR("failed to allocate producer memory.\n");
 		return -1;
 	}
 	for (i = 0; i < MAX_BULK; i++)
@@ -277,7 +277,7 @@ static int consumer_fn(void)
 	/* alloc dummy object pointers */
 	src = malloc(MAX_BULK*2*sizeof(void *));
 	if (src == NULL) {
-		ODP_ERR("failed to allocate consumer memory.\n");
+		LOG_ERR("failed to allocate consumer memory.\n");
 		return -1;
 	}
 
@@ -340,7 +340,7 @@ static void test_ring_stress(stress_type_t type)
 	case one_deq_rest_enq:
 	case one_enq_rest_deq:/*TBD*/
 	default:
-		ODP_ERR("Invalid stress type or test case yet not supported\n");
+		LOG_ERR("Invalid stress type or test case yet not supported\n");
 	}
 }
 
@@ -371,20 +371,20 @@ static void *test_ring(void *arg)
 				    0 /* not used, alignement
 					 taken care inside func : todo */);
 		if (r == NULL) {
-			ODP_ERR("ring create failed\n");
+			LOG_ERR("ring create failed\n");
 			result = -1;
 			break;
 		}
 		/* lookup ring from its name */
 		if (odph_ring_lookup(ring_name) != r) {
-			ODP_ERR("ring lookup failed\n");
+			LOG_ERR("ring lookup failed\n");
 			result = -1;
 			break;
 		}
 
 		/* basic operations */
 		if (test_ring_basic(r) < 0) {
-			ODP_ERR("ring basic enqueue/dequeu ops failed\n");
+			LOG_ERR("ring basic enqueue/dequeu ops failed\n");
 			result = -1;
 		}
 
@@ -401,7 +401,7 @@ static void *test_ring(void *arg)
 		break;
 
 	default:
-		ODP_ERR("Invalid test case [%d]\n", parg->thrdarg.testcase);
+		LOG_ERR("Invalid test case [%d]\n", parg->thrdarg.testcase);
 		result = -1;
 		break;
 	}
@@ -447,12 +447,12 @@ int main(int argc ODP_UNUSED, char *argv[] ODP_UNUSED)
 				0 /* not used, alignement
 				 taken care inside func : todo */);
 	if (r_stress == NULL) {
-		ODP_ERR("ring create failed\n");
+		LOG_ERR("ring create failed\n");
 		goto fail;
 	}
 	/* lookup ring from its name */
 	if (odph_ring_lookup(ring_name) != r_stress) {
-		ODP_ERR("ring lookup failed\n");
+		LOG_ERR("ring lookup failed\n");
 		goto fail;
 	}
 #endif
diff --git a/test/api_test/odp_shm_test.c b/test/api_test/odp_shm_test.c
index 6208e78..5cfde7d 100644
--- a/test/api_test/odp_shm_test.c
+++ b/test/api_test/odp_shm_test.c
@@ -14,6 +14,7 @@
 #include <odp.h>
 #include <odp_common.h>
 #include <odp_shm_test.h>
+#include <test_debug.h>
 
 static void *run_thread(void *arg)
 {
@@ -32,7 +33,7 @@ static void *run_thread(void *arg)
 		printf("  [%i] shared data at %p\n", thr, test_shared_data);
 		break;
 	default:
-		ODP_ERR("Invalid test case [%d]\n", parg->testcase);
+		LOG_ERR("Invalid test case [%d]\n", parg->testcase);
 	}
 	fflush(stdout);
 
diff --git a/test/api_test/odp_timer_ping.c b/test/api_test/odp_timer_ping.c
index 65e3834..7704181 100644
--- a/test/api_test/odp_timer_ping.c
+++ b/test/api_test/odp_timer_ping.c
@@ -37,6 +37,7 @@
 #include <odp_timer.h>
 #include <odph_linux.h>
 #include <odph_chksum.h>
+#include <test_debug.h>
 
 #define MSG_POOL_SIZE         (4*1024*1024)
 #define BUF_SIZE		8
@@ -98,7 +99,7 @@ static int listen_to_pingack(void)
 
 	sd = socket(PF_INET, SOCK_RAW, proto->p_proto);
 	if (sd < 0) {
-		ODP_ERR("Listener socket open failed\n");
+		LOG_ERR("Listener socket open failed\n");
 		err = -1;
 		goto err;
 	}
@@ -116,7 +117,7 @@ static int listen_to_pingack(void)
 			ODP_DBG(" Rx timeout msg cnt [%d]\n", i);
 			err = -1;
 		} else if (res == -1) {
-			ODP_ERR("recvfrom error");
+			LOG_ERR("recvfrom error");
 			err = -1;
 			goto err;
 		} else {
@@ -130,7 +131,7 @@ static int listen_to_pingack(void)
 				/* pkt rxvd therefore cancel the timeout */
 				if (odp_timer_cancel_tmo(test_timer_ping,
 							 test_ping_tmo) != 0) {
-					ODP_ERR("cancel_tmo failed ..exiting listner thread\n");
+					LOG_ERR("cancel_tmo failed ..exiting listner thread\n");
 					/* avoid exiting from here even if tmo
 					 * failed for current ping,
 					 * allow subsequent ping_rx request */
@@ -166,17 +167,17 @@ static int send_ping_request(struct sockaddr_in *addr)
 
 	sd = socket(PF_INET, SOCK_RAW, proto->p_proto);
 	if (sd < 0) {
-		ODP_ERR("Sender socket open failed\n");
+		LOG_ERR("Sender socket open failed\n");
 		return -1;
 	}
 
 	if (setsockopt(sd, SOL_IP, IP_TTL, &val, sizeof(val)) != 0) {
-		ODP_ERR("Error setting TTL option\n");
+		LOG_ERR("Error setting TTL option\n");
 		err = -1;
 		goto err;
 	}
 	if (fcntl(sd, F_SETFL, O_NONBLOCK) != 0) {
-		ODP_ERR("Request for nonblocking I/O failed\n");
+		LOG_ERR("Request for nonblocking I/O failed\n");
 		err = -1;
 		goto err;
 	}
@@ -201,7 +202,7 @@ static int send_ping_request(struct sockaddr_in *addr)
 		/* txmit the pkt */
 		if (sendto(sd, &pckt, sizeof(pckt), 0,
 			   (struct sockaddr *)addr, sizeof(*addr)) <= 0) {
-			ODP_ERR("sendto operation failed msg_cnt [%d]..exiting sender thread\n", i);
+			LOG_ERR("sendto operation failed msg_cnt [%d]..exiting sender thread\n", i);
 			err = -1;
 			goto err;
 		}
@@ -258,7 +259,7 @@ static void *send_ping(void *arg)
 			parg->result = -1;
 		break;
 	default:
-		ODP_ERR("Invalid test case [%d]\n", parg->thrdarg.testcase);
+		LOG_ERR("Invalid test case [%d]\n", parg->thrdarg.testcase);
 	}
 
 	fflush(stdout);
@@ -281,7 +282,7 @@ static void *rx_ping(void *arg)
 			parg->result = -1;
 		break;
 	default:
-		ODP_ERR("Invalid test case [%d]\n", parg->thrdarg.testcase);
+		LOG_ERR("Invalid test case [%d]\n", parg->thrdarg.testcase);
 	}
 
 	fflush(stdout);
@@ -294,7 +295,7 @@ static int ping_init(int count, char *name[])
 {
 	struct hostent *hname;
 	if (count != 2) {
-		ODP_ERR("usage: %s <hostaddr>\n", name[0]);
+		LOG_ERR("usage: %s <hostaddr>\n", name[0]);
 		return -1;
 	}
 
@@ -342,7 +343,7 @@ int main(int argc ODP_UNUSED, char *argv[] ODP_UNUSED)
 				      ODP_CACHE_LINE_SIZE,
 				      ODP_BUFFER_TYPE_RAW);
 	if (pool == ODP_BUFFER_POOL_INVALID) {
-		ODP_ERR("Pool create failed.\n");
+		LOG_ERR("Pool create failed.\n");
 		return -1;
 	}
 
@@ -353,7 +354,7 @@ int main(int argc ODP_UNUSED, char *argv[] ODP_UNUSED)
 				 NULL);
 
 	if (queue == ODP_QUEUE_INVALID) {
-		ODP_ERR("Timer queue create failed.\n");
+		LOG_ERR("Timer queue create failed.\n");
 		return -1;
 	}
 
@@ -363,7 +364,7 @@ int main(int argc ODP_UNUSED, char *argv[] ODP_UNUSED)
 					   MAXUS*ODP_TIME_USEC);
 
 	if (test_timer_ping == ODP_TIMER_INVALID) {
-		ODP_ERR("Timer create failed.\n");
+		LOG_ERR("Timer create failed.\n");
 		return -1;
 	}
 
diff --git a/test/test_debug.h b/test/test_debug.h
new file mode 100644
index 0000000..35e21d9
--- /dev/null
+++ b/test/test_debug.h
@@ -0,0 +1,88 @@
+/* Copyright (c) 2014, Linaro Limited
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier:     BSD-3-Clause
+ */
+/**
+ * @file
+ *
+ * example debug
+ */
+
+#ifndef TEST_DEBUG_H_
+#define TEST_DEBUG_H_
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef TEST_DEBUG_PRINT
+#define TEST_DEBUG_PRINT 1
+#endif
+
+/**
+ * log level.
+ */
+typedef enum example_log_level {
+	TEST_LOG_DBG,
+	TEST_LOG_ERR,
+	TEST_LOG_ABORT
+} example_log_level_e;
+
+/**
+ * default LOG macro.
+ */
+#define TEST_LOG(level, fmt, ...) \
+do { \
+	switch (level) { \
+	case TEST_LOG_ERR: \
+		fprintf(stderr, "%s:%d:%s():" fmt, __FILE__, \
+		__LINE__, __func__, ##__VA_ARGS__); \
+		break; \
+	case TEST_LOG_DBG: \
+		if (TEST_DEBUG_PRINT == 1) \
+			fprintf(stderr, "%s:%d:%s():" fmt, __FILE__, \
+			__LINE__, __func__, ##__VA_ARGS__); \
+		break; \
+	case TEST_LOG_ABORT: \
+		fprintf(stderr, "%s:%d:%s(): " fmt, __FILE__, \
+		__LINE__, __func__, ##__VA_ARGS__); \
+		abort(); \
+		break; \
+	default: \
+		fprintf(stderr, "Unknown LOG level"); \
+		break;\
+	} \
+} while (0)
+
+/**
+ * Debug printing macro, which prints output when DEBUG flag is set.
+ */
+#define LOG_DBG(fmt, ...) \
+		TEST_LOG(TEST_LOG_DBG, fmt, ##__VA_ARGS__)
+
+/**
+ * Print output to stderr (file, line and function).
+ */
+#define LOG_ERR(fmt, ...) \
+		TEST_LOG(TEST_LOG_ERR, fmt, ##__VA_ARGS__)
+
+/**
+ * Print output to stderr (file, line and function),
+ * then abort.
+ */
+#define LOG_ABORT(fmt, ...) \
+		TEST_LOG(TEST_LOG_ABORT, fmt, ##__VA_ARGS__)
+
+/**
+ * @}
+ */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
