diff --git a/configure.ac b/configure.ac
index 05054df..c03f93b 100644
--- a/configure.ac
+++ b/configure.ac
@@ -309,7 +309,6 @@ AC_CONFIG_FILES([Makefile
 		 pkgconfig/libodphelper.pc
 		 scripts/Makefile
 		 test/Makefile
-		 test/api_test/Makefile
 		 test/performance/Makefile
 		 test/validation/Makefile
 		 test/validation/buffer/Makefile
diff --git a/helper/ring.c b/helper/ring.c
index e113606..2bd8e67 100644
--- a/helper/ring.c
+++ b/helper/ring.c
@@ -644,3 +644,4 @@ int odph_ring_dequeue_burst(odph_ring_t *r, void **obj_table, unsigned n)
 	else
 		return odph_ring_mc_dequeue_burst(r, obj_table, n);
 }
+
diff --git a/helper/test/Makefile.am b/helper/test/Makefile.am
index f6a3f83..3e0df0b 100644
--- a/helper/test/Makefile.am
+++ b/helper/test/Makefile.am
@@ -1,13 +1,15 @@
 include $(top_srcdir)/test/Makefile.inc
 
 AM_CFLAGS += -I$(srcdir)/common
+AM_CFLAGS += -I$(top_srcdir)/test/validation/common
 AM_LDFLAGS += -static
 
 TESTS_ENVIRONMENT += TEST_DIR=${builddir}
 
 EXECUTABLES = chksum$(EXEEXT) \
               thread$(EXEEXT) \
-              process$(EXEEXT)
+              process$(EXEEXT) \
+              ring$(EXEEXT)
 
 COMPILE_ONLY =
 
@@ -27,3 +29,5 @@ dist_thread_SOURCES = thread.c
 thread_LDADD = $(LIB)/libodphelper.la $(LIB)/libodp.la
 dist_process_SOURCES = process.c
 process_LDADD = $(LIB)/libodphelper.la $(LIB)/libodp.la
+dist_ring_SOURCES = ring.c
+ring_LDADD = $(LIB)/libodphelper.la $(LIB)/libodp.la
diff --git a/test/api_test/odp_ring_test.c b/helper/test/ring.c
similarity index 86%
rename from test/api_test/odp_ring_test.c
rename to helper/test/ring.c
index e8a962a..1b050be 100644
--- a/test/api_test/odp_ring_test.c
+++ b/helper/test/ring.c
@@ -37,7 +37,6 @@
  *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
-
 /**
  * @file
  *
@@ -48,14 +47,24 @@
 #include <stdio.h>
 #include <string.h>
 #include <odp.h>
-#include <odp_common.h>
+#include <odp/helper/linux.h>
 #include <odp/helper/ring.h>
 #include <test_debug.h>
+#include <odp_cunit_common.h>
 
 #define RING_SIZE 4096
 #define MAX_BULK 32
 
-#define RING_TEST_BASIC
+enum {
+	ODP_RING_TEST_BASIC,
+	ODP_RING_TEST_STRESS,
+};
+
+/* local struct for ring_thread argument */
+typedef struct {
+	pthrd_arg thrdarg;
+	int stress_type;
+} ring_arg_t;
 
 static int test_ring_basic(odph_ring_t *r)
 {
@@ -64,24 +73,24 @@ static int test_ring_basic(odph_ring_t *r)
 	unsigned i, num_elems;
 
 	/* alloc dummy object pointers */
-	src = malloc(RING_SIZE*2*sizeof(void *));
+	src = malloc(RING_SIZE * 2 * sizeof(void *));
 	if (src == NULL) {
 		LOG_ERR("failed to allocate test ring src memory\n");
 		goto fail;
 	}
-	for (i = 0; i < RING_SIZE*2; i++)
+	for (i = 0; i < RING_SIZE * 2; i++)
 		src[i] = (void *)(unsigned long)i;
 
 	cur_src = src;
 
 	/* alloc some room for copied objects */
-	dst = malloc(RING_SIZE*2*sizeof(void *));
+	dst = malloc(RING_SIZE * 2 * sizeof(void *));
 	if (dst == NULL) {
 		LOG_ERR("failed to allocate test ring dst memory\n");
 		goto fail;
 	}
 
-	memset(dst, 0, RING_SIZE*2*sizeof(void *));
+	memset(dst, 0, RING_SIZE * 2 * sizeof(void *));
 	cur_dst = dst;
 
 	printf("Test SP & SC basic functions\n");
@@ -251,7 +260,7 @@ static int producer_fn(void)
 	void **src = NULL;
 
 	/* alloc dummy object pointers */
-	src = malloc(MAX_BULK*2*sizeof(void *));
+	src = malloc(MAX_BULK * 2 * sizeof(void *));
 	if (src == NULL) {
 		LOG_ERR("failed to allocate producer memory.\n");
 		return -1;
@@ -275,7 +284,7 @@ static int consumer_fn(void)
 	void **src = NULL;
 
 	/* alloc dummy object pointers */
-	src = malloc(MAX_BULK*2*sizeof(void *));
+	src = malloc(MAX_BULK * 2 * sizeof(void *));
 	if (src == NULL) {
 		LOG_ERR("failed to allocate consumer memory.\n");
 		return -1;
@@ -298,7 +307,6 @@ static int consumer_fn(void)
 	} while (1);
 }
 
-
 /*
  * Note : make sure that both enqueue and dequeue
  * operation starts at same time so to avoid data corruption
@@ -319,24 +327,22 @@ typedef enum {
 static void test_ring_stress(stress_type_t type)
 {
 	int thr;
+
 	thr = odp_thread_id();
 
 	switch (type) {
 	case one_enq_one_deq:
-
 		if (thr == 1)
 			producer_fn();
 		if (thr == 2)
 			consumer_fn();
 		break;
-
 	case multi_enq_multi_deq:
-		if (thr%2 == 0)
+		if (thr % 2 == 0)
 			producer_fn();
 		else
 			consumer_fn();
 		break;
-
 	case one_deq_rest_enq:
 	case one_enq_rest_deq:/*TBD*/
 	default:
@@ -344,13 +350,6 @@ static void test_ring_stress(stress_type_t type)
 	}
 }
 
-/* local struct for ring_thread argument */
-typedef struct {
-	pthrd_arg thrdarg;
-	int stress_type;
-} ring_arg_t;
-
-
 static void *test_ring(void *arg)
 {
 	ring_arg_t *parg = (ring_arg_t *)arg;
@@ -368,8 +367,8 @@ static void *test_ring(void *arg)
 		snprintf(ring_name, sizeof(ring_name), "test_ring_%i", thr);
 
 		r = odph_ring_create(ring_name, RING_SIZE,
-				    0 /* not used, alignement
-					 taken care inside func : todo */);
+				     0 /* not used, alignement
+				     taken care inside func : todo */);
 		if (r == NULL) {
 			LOG_ERR("ring create failed\n");
 			result = -1;
@@ -417,36 +416,43 @@ static void *test_ring(void *arg)
 	return parg;
 }
 
-
-int main(int argc __attribute__((__unused__)),
-	 char *argv[] __attribute__((__unused__)))
+int main(int argc TEST_UNUSED, char *argv[] TEST_UNUSED)
 {
 	ring_arg_t rarg;
+	odph_linux_pthread_t thread_tbl[MAX_WORKERS];
+	odp_cpumask_t cpu_mask;
+	int num_workers;
+	char ring_name[ODPH_RING_NAMESIZE];
 
-	if (odp_test_global_init() != 0)
-		return -1;
+	if (odp_init_global(NULL, NULL)) {
+		LOG_ERR("Error: ODP global init failed.\n");
+		exit(EXIT_FAILURE);
+	}
 
-	odp_print_system_info();
+	if (odp_init_local(ODP_THREAD_CONTROL)) {
+		LOG_ERR("Error: ODP local init failed.\n");
+		exit(EXIT_FAILURE);
+	}
 
 	odph_ring_tailq_init();
 
-	rarg.thrdarg.numthrds = odp_cpu_count();
+	num_workers = odp_cpumask_default_worker(&cpu_mask, MAX_WORKERS);
+	rarg.thrdarg.numthrds = rarg.thrdarg.numthrds;
 
-#ifdef RING_TEST_BASIC
 	rarg.thrdarg.testcase = ODP_RING_TEST_BASIC;
-#else
+	printf("starting stess test type : %d..\n", rarg.stress_type);
+	odph_linux_pthread_create(&thread_tbl[0], &cpu_mask,
+				  test_ring, (void *)&rarg);
+	odph_linux_pthread_join(thread_tbl, num_workers);
+
 	rarg.thrdarg.testcase = ODP_RING_TEST_STRESS;
 	rarg.stress_type = one_enq_one_deq;
-/*	rarg.stress_type = multi_enq_multi_deq;*/
-	char ring_name[ODPH_RING_NAMESIZE];
 
 	printf("starting stess test type : %d..\n", rarg.stress_type);
-	/* create a ring */
 	snprintf(ring_name, sizeof(ring_name), "test_ring_stress");
-
 	r_stress = odph_ring_create(ring_name, RING_SIZE,
-				0 /* not used, alignement
-				 taken care inside func : todo */);
+				    0 /* not used, alignement
+				    taken care inside func : todo */);
 	if (r_stress == NULL) {
 		LOG_ERR("ring create failed\n");
 		goto fail;
@@ -456,15 +462,21 @@ int main(int argc __attribute__((__unused__)),
 		LOG_ERR("ring lookup failed\n");
 		goto fail;
 	}
-#endif
-	odp_test_thread_create(test_ring, (pthrd_arg *)&rarg);
 
-#ifndef RING_TEST_BASIC
+	odph_linux_pthread_create(&thread_tbl[0], &cpu_mask,
+				  test_ring, (void *)&rarg);
+	odph_linux_pthread_join(thread_tbl, num_workers);
+
 fail:
-#endif
+	if (odp_term_local()) {
+		LOG_ERR("Error: ODP local term failed.\n");
+		exit(EXIT_FAILURE);
+	}
 
-	odp_test_thread_exit(&rarg.thrdarg);
+	if (odp_term_global()) {
+		LOG_ERR("Error: ODP global term failed.\n");
+		exit(EXIT_FAILURE);
+	}
 
 	return 0;
 }
-
diff --git a/test/Makefile.am b/test/Makefile.am
index 2ba8008..4a75364 100644
--- a/test/Makefile.am
+++ b/test/Makefile.am
@@ -1,4 +1,4 @@
-SUBDIRS = api_test performance miscellaneous
+SUBDIRS = performance miscellaneous
 
 if cunit_support
     SUBDIRS += validation
diff --git a/test/api_test/.gitignore b/test/api_test/.gitignore
deleted file mode 100644
index 950f443..0000000
--- a/test/api_test/.gitignore
+++ /dev/null
@@ -1,2 +0,0 @@
-odp_ring
-odp_shm
diff --git a/test/api_test/Makefile.am b/test/api_test/Makefile.am
deleted file mode 100644
index fcdba48..0000000
--- a/test/api_test/Makefile.am
+++ /dev/null
@@ -1,13 +0,0 @@
-include $(top_srcdir)/test/Makefile.inc
-
-bin_PROGRAMS = odp_ring$(EXEEXT)
-
-odp_ring_CFLAGS = $(AM_CFLAGS)
-
-odp_ring_LDFLAGS = $(AM_LDFLAGS) -static
-
-noinst_HEADERS = \
-		  $(top_srcdir)/test/api_test/odp_common.h \
-		  $(top_srcdir)/test/test_debug.h
-
-dist_odp_ring_SOURCES = odp_ring_test.c odp_common.c
diff --git a/test/api_test/odp_common.c b/test/api_test/odp_common.c
deleted file mode 100644
index 681d915..0000000
--- a/test/api_test/odp_common.c
+++ /dev/null
@@ -1,91 +0,0 @@
-/* Copyright (c) 2013, Linaro Limited
- * All rights reserved.
- *
- * SPDX-License-Identifier:     BSD-3-Clause
- */
-
-/**
- * @file
- *
- * ODP test application common
- */
-
-#include <string.h>
-#include <odp.h>
-#include <odp/helper/linux.h>
-#include <odp_common.h>
-#include <test_debug.h>
-
-#define MAX_WORKERS           32            /**< Max worker threads */
-
-/* Globals */
-static odph_linux_pthread_t thread_tbl[MAX_WORKERS]; /**< worker threads table*/
-static int num_workers;				    /**< number of workers 	*/
-
-/**
- * Print system information
- */
-void odp_print_system_info(void)
-{
-	odp_cpumask_t cpumask;
-	char str[ODP_CPUMASK_STR_SIZE];
-
-	memset(str, 1, sizeof(str));
-
-	odp_cpumask_zero(&cpumask);
-
-	odp_cpumask_from_str(&cpumask, "0x1");
-	(void)odp_cpumask_to_str(&cpumask, str, sizeof(str));
-
-	printf("\n");
-	printf("ODP system info\n");
-	printf("---------------\n");
-	printf("ODP API version: %s\n",        odp_version_api_str());
-	printf("CPU model:       %s\n",        odp_sys_cpu_model_str());
-	printf("CPU freq (hz):   %"PRIu64"\n", odp_sys_cpu_hz());
-	printf("Cache line size: %i\n",        odp_sys_cache_line_size());
-	printf("CPU count:       %i\n",        odp_cpu_count());
-	printf("CPU mask:        %s\n",        str);
-
-	printf("\n");
-}
-
-/** test init globals and call odp_init_global() */
-int odp_test_global_init(void)
-{
-	memset(thread_tbl, 0, sizeof(thread_tbl));
-
-	if (odp_init_global(NULL, NULL)) {
-		LOG_ERR("ODP global init failed.\n");
-		return -1;
-	}
-
-	num_workers = odp_cpu_count();
-	/* force to max CPU count */
-	if (num_workers > MAX_WORKERS)
-		num_workers = MAX_WORKERS;
-
-	return 0;
-}
-
-/** create test thread */
-int odp_test_thread_create(void *func_ptr(void *), pthrd_arg *arg)
-{
-	odp_cpumask_t cpumask;
-
-	/* Create and init additional threads */
-	odp_cpumask_default_worker(&cpumask, arg->numthrds);
-	odph_linux_pthread_create(thread_tbl, &cpumask, func_ptr,
-				  (void *)arg);
-
-	return 0;
-}
-
-/** exit from test thread */
-int odp_test_thread_exit(pthrd_arg *arg)
-{
-	/* Wait for other threads to exit */
-	odph_linux_pthread_join(thread_tbl, arg->numthrds);
-
-	return 0;
-}
diff --git a/test/api_test/odp_common.h b/test/api_test/odp_common.h
deleted file mode 100644
index f321b6b..0000000
--- a/test/api_test/odp_common.h
+++ /dev/null
@@ -1,42 +0,0 @@
-/* Copyright (c) 2013, Linaro Limited
- * All rights reserved.
- *
- * SPDX-License-Identifier:     BSD-3-Clause
- */
-
-/**
- * @file
- *
- * ODP test application common headers
- */
-
-#ifndef ODP_COMMON_H
-#define ODP_COMMON_H
-
-#define MAX_WORKERS 32 /**< Maximum number of work threads */
-
-/** types of tests */
-typedef enum {
-	ODP_ATOMIC_TEST = 0,
-	ODP_SHM_TEST,
-	ODP_RING_TEST_BASIC,
-	ODP_RING_TEST_STRESS,
-	ODP_TIMER_PING_TEST,
-	ODP_MAX_TEST
-} odp_test_case_e;
-
-/**
- * Thread argument
- */
-typedef struct {
-	int testcase; /**< specifies which set of API's to exercise */
-	int numthrds; /**< no of pthreads to create */
-} pthrd_arg;
-
-extern void odp_print_system_info(void);
-extern int odp_test_global_init(void);
-/** create thread fro start_routine function */
-extern int odp_test_thread_create(void *(*start_routine) (void *), pthrd_arg *);
-extern int odp_test_thread_exit(pthrd_arg *);
-
-#endif /* ODP_COMMON_H */
