diff --git a/test/validation/odp_init.c b/test/validation/odp_init.c
index 88e6235..b4db1e1 100644
--- a/test/validation/odp_init.c
+++ b/test/validation/odp_init.c
@@ -6,49 +6,157 @@
 
 #include "odp.h"
 #include "CUnit/Basic.h"
+#include <odph_linux.h>
 
-#define DEFAULT_MSG_POOL_SIZE	(4*1024*1024)
-#define DEFAULT_MSG_SIZE	(8)
+void *odp_init_test(void *arg);
+static void odp_init_local_singlethread_sunnyday(void);
+static void odp_init_local_thread_per_core_sunnyday(void);
+static int init(void);
+static void test_odp_init_global(void);
 
-static void test_odp_init_global(void)
+#define MAX_WORKERS           32
+#define FIRST_CORE            0
+#define SINGLE_THREAD         1
+
+/* Test to check if the thread is able to initialize using
+ * odp_init_local() and can terminate using odp_term_local().
+ * odp_init_local() will return 0 if successful intialization.
+ * odp_term_local() will return 0 if successful termination.
+ */
+
+void *odp_init_test(void *arg)
+{
+	int status;
+
+	status = odp_init_local();
+	CU_ASSERT(!status);
+
+	status = odp_term_local();
+	CU_ASSERT(!status);
+
+	return arg;
+}
+
+int init(void)
+{
+	printf("\t ODP version: %s\n", odp_version_api_str());
+	return 0;
+}
+
+/* Test for initialization and termination of single odp thread */
+
+
+void odp_init_local_singlethread_sunnyday(void)
 {
 	int status;
+	odph_linux_pthread_t thread;
+
 	status = odp_init_global(NULL, NULL);
-	CU_ASSERT(status == 0);
+	CU_ASSERT(!status);
+
+	status = odp_init_local();
+	CU_ASSERT(!status);
+
+	odph_linux_pthread_create(&thread, SINGLE_THREAD, FIRST_CORE,
+				  odp_init_test, NULL);
+	odph_linux_pthread_join(&thread, 1);
+
+	status = odp_term_local();
+	CU_ASSERT(!status);
 
 	status = odp_term_global();
-	CU_ASSERT(status == 0);
+	CU_ASSERT(!status);
 }
 
-static int init(void)
+/* Test for initialization and termination of multiple odp threads
+ * One odp thread per core.
+ */
+
+void odp_init_local_thread_per_core_sunnyday(void)
 {
-	printf("\tODP version: %s\n", odp_version_api_str());
-	return 0;
+	odph_linux_pthread_t thread_tbl[MAX_WORKERS];
+	int num_workers;
+	int status, first_core;
+	first_core = 1;
+
+	status = odp_init_global(NULL, NULL);
+	CU_ASSERT(!status);
+	status = odp_init_local();
+	CU_ASSERT(!status);
+
+	num_workers = odp_sys_core_count();
+	if (1 == num_workers)
+		first_core = 0;
+
+	if (MAX_WORKERS < num_workers)
+		num_workers = MAX_WORKERS;
+
+	odph_linux_pthread_create(thread_tbl, num_workers, first_core,
+				  odp_init_test, NULL);
+
+	/* if the number of cores  in the system is 1, we have to use  core 0.
+	 * However if the number of cores is more than 1, we can leave core 0
+	 * for linux system and this how we expect odp systems to be used.
+	 */
+
+	odph_linux_pthread_join(thread_tbl, num_workers);
+
+	status = odp_term_local();
+	CU_ASSERT(!status);
+
+	status = odp_term_global();
+	CU_ASSERT(!status);
 }
 
-static int finalise(void)
+/* Test to check if ODP is able to initialize globally using odp_init_global()
+ * and terminate globally using odp_term_global() successfully.
+ * odp_init_global() returns 0 if successful
+ * odp_term_global() returns 0 if successful
+ */
+
+static void test_odp_init_global(void)
 {
-	return 0;
+	int status;
+
+	status = odp_init_global(NULL, NULL);
+	CU_ASSERT(!status);
+
+	status = odp_term_global();
+	CU_ASSERT(!status);
 }
 
 int main(void)
 {
-	CU_pSuite ptr_suite = NULL;
-	/* initialize the CUnit test registry */
+	CU_pSuite p_suite;
+	CU_pTest ret;
+
 	if (CUE_SUCCESS != CU_initialize_registry())
 		return CU_get_error();
-	/* add a suite to the registry */
-	ptr_suite = CU_add_suite(__FILE__, init, finalise);
-	if (NULL == ptr_suite) {
+
+	p_suite = CU_add_suite(__FILE__, init, NULL);
+	if (!p_suite) {
 		CU_cleanup_registry();
 		return CU_get_error();
 	}
-	/* add the tests to the suite */
-	if (NULL == CU_ADD_TEST(ptr_suite, test_odp_init_global)) {
+
+	ret = CU_ADD_TEST(p_suite, test_odp_init_global);
+	if (!ret) {
 		CU_cleanup_registry();
 		return CU_get_error();
 	}
-	/* Run all tests using the CUnit Basic interface */
+
+	ret = CU_ADD_TEST(p_suite, odp_init_local_singlethread_sunnyday);
+	if (!ret) {
+		CU_cleanup_registry();
+		return CU_get_error();
+	}
+
+	ret = CU_ADD_TEST(p_suite, odp_init_local_thread_per_core_sunnyday);
+	if (!ret) {
+		CU_cleanup_registry();
+		return CU_get_error();
+	}
+
 	CU_basic_set_mode(CU_BRM_VERBOSE);
 	CU_basic_run_tests();
 	CU_cleanup_registry();
