diff --git a/example/generator/odp_generator.c b/example/generator/odp_generator.c
index b10372e..893233f 100644
--- a/example/generator/odp_generator.c
+++ b/example/generator/odp_generator.c
@@ -522,6 +522,7 @@ int main(int argc, char *argv[])
 {
 	odp_linux_pthread_t thread_tbl[MAX_WORKERS];
 	odp_buffer_pool_t pool;
+    odp_global_init_t init_data;
 	int thr_id;
 	int num_workers;
 	void *pool_base;
@@ -530,7 +531,7 @@ int main(int argc, char *argv[])
 	int core_count;
 
 	/* Init ODP before calling anything else */
-	if (odp_init_global()) {
+	if (odp_init_global(init_data)) {
 		ODP_ERR("Error: ODP global init failed.\n");
 		exit(EXIT_FAILURE);
 	}
diff --git a/example/l2fwd/odp_l2fwd.c b/example/l2fwd/odp_l2fwd.c
index f89ea7a..12a6f53 100644
--- a/example/l2fwd/odp_l2fwd.c
+++ b/example/l2fwd/odp_l2fwd.c
@@ -280,6 +280,7 @@ int main(int argc, char *argv[])
 {
 	odp_linux_pthread_t thread_tbl[MAX_WORKERS];
 	odp_buffer_pool_t pool;
+    odp_global_init_t init_data;
 	int thr_id;
 	void *pool_base;
 	int i;
@@ -288,7 +289,7 @@ int main(int argc, char *argv[])
 	odp_pktio_t pktio;
 
 	/* Init ODP before calling anything else */
-	if (odp_init_global()) {
+	if (odp_init_global(init_data)) {
 		ODP_ERR("Error: ODP global init failed.\n");
 		exit(EXIT_FAILURE);
 	}
diff --git a/example/odp_example/odp_example.c b/example/odp_example/odp_example.c
index be96093..c82ef51 100644
--- a/example/odp_example/odp_example.c
+++ b/example/odp_example/odp_example.c
@@ -917,6 +917,7 @@ static void parse_args(int argc, char *argv[], test_args_t *args)
 int main(int argc, char *argv[])
 {
 	odp_linux_pthread_t thread_tbl[MAX_WORKERS];
+    odp_global_init_t init_data;
 	test_args_t args;
 	int thr_id;
 	int num_workers;
@@ -934,7 +935,7 @@ int main(int argc, char *argv[])
 
 	memset(thread_tbl, 0, sizeof(thread_tbl));
 
-	if (odp_init_global()) {
+	if (odp_init_global(init_data)) {
 		printf("ODP global init failed.\n");
 		return -1;
 	}
diff --git a/example/packet/odp_pktio.c b/example/packet/odp_pktio.c
index 247a28a..aa3e848 100644
--- a/example/packet/odp_pktio.c
+++ b/example/packet/odp_pktio.c
@@ -277,6 +277,7 @@ int main(int argc, char *argv[])
 {
 	odp_linux_pthread_t thread_tbl[MAX_WORKERS];
 	odp_buffer_pool_t pool;
+    odp_global_init_t init_data;
 	int thr_id;
 	int num_workers;
 	void *pool_base;
@@ -285,7 +286,7 @@ int main(int argc, char *argv[])
 	int core_count;
 
 	/* Init ODP before calling anything else */
-	if (odp_init_global()) {
+	if (odp_init_global(init_data)) {
 		ODP_ERR("Error: ODP global init failed.\n");
 		exit(EXIT_FAILURE);
 	}
diff --git a/example/timer/odp_timer_test.c b/example/timer/odp_timer_test.c
index dbe0e5b..1fce60f 100644
--- a/example/timer/odp_timer_test.c
+++ b/example/timer/odp_timer_test.c
@@ -193,6 +193,7 @@ static void parse_args(int argc, char *argv[], test_args_t *args)
 int main(int argc, char *argv[])
 {
 	odp_linux_pthread_t thread_tbl[MAX_WORKERS];
+    odp_global_init_t init_data;
 	test_args_t args;
 	int thr_id;
 	int num_workers;
@@ -210,7 +211,7 @@ int main(int argc, char *argv[])
 
 	memset(thread_tbl, 0, sizeof(thread_tbl));
 
-	if (odp_init_global()) {
+	if (odp_init_global(init_data)) {
 		printf("ODP global init failed.\n");
 		return -1;
 	}
diff --git a/include/odp_init.h b/include/odp_init.h
index 490324a..520e6eb 100644
--- a/include/odp_init.h
+++ b/include/odp_init.h
@@ -4,7 +4,6 @@
  * SPDX-License-Identifier:     BSD-3-Clause
  */
 
-
 /**
  * @file
  *
@@ -23,23 +22,36 @@ extern "C" {
 #include <odp_std_types.h>
 
 
-
+/**
+ * ODP  initialisation struct
+ */
+typedef struct odp_global_init{
+    /** Callback for logging replaces the default implementation if
+     * not NULL
+     */
+    int (*logging)(char *format,...);
+    /** Platform specific data. ODP does nothing with
+     * this pointer
+     */
+    void *platform_implimentaion_data;
+} odp_global_init_t;
 
 /**
- * Perform global ODP initalisation.
+ * Perform global ODP initialisation.
  *
  * This function must be called once before calling
  * any other ODP API functions.
  *
  * @return 0 if successful
  */
-int odp_init_global(void);
+int odp_init_global(odp_global_init_t params);
 
 
 /**
- * Perform thread local ODP initalisation.
+ * Perform thread local ODP initialisation.
  *
  * All threads must call this function before calling
+ *
  * any other ODP API functions.
  * @param thr_id Thread id
  * @return 0 if successful
diff --git a/platform/linux-dpdk/odp_init.c b/platform/linux-dpdk/odp_init.c
index ecc2066..97a4024 100644
--- a/platform/linux-dpdk/odp_init.c
+++ b/platform/linux-dpdk/odp_init.c
@@ -50,7 +50,7 @@ int odp_init_dpdk(void)
 	return 0;
 }
 
-int odp_init_global(void)
+int odp_init_global(odp_global_init_t params  ODP_UNUSED)
 {
 	odp_thread_init_global();
 
diff --git a/platform/linux-generic/odp_init.c b/platform/linux-generic/odp_init.c
index d4c2eb8..db04903 100644
--- a/platform/linux-generic/odp_init.c
+++ b/platform/linux-generic/odp_init.c
@@ -9,7 +9,7 @@
 #include <odp_debug.h>
 
 
-int odp_init_global(void)
+int odp_init_global(odp_global_init_t params  ODP_UNUSED)
 {
 	odp_thread_init_global();
 
diff --git a/platform/linux-keystone2/odp_init.c b/platform/linux-keystone2/odp_init.c
index f832551..066dace 100644
--- a/platform/linux-keystone2/odp_init.c
+++ b/platform/linux-keystone2/odp_init.c
@@ -90,7 +90,7 @@ static int ti_init_hw_config(void)
 }
 
 
-int odp_init_global(void)
+int odp_init_global(odp_global_init_t init_data ODP_UNUSED)
 {
 	odp_thread_init_global();
 
diff --git a/test/api_test/odp_common.c b/test/api_test/odp_common.c
index 89ebd2d..cfbef19 100644
--- a/test/api_test/odp_common.c
+++ b/test/api_test/odp_common.c
@@ -54,9 +54,10 @@ void odp_print_system_info(void)
 /** test init globals and call odp_init_global() */
 int odp_test_global_init(void)
 {
+    odp_global_init_t init_data;
 	memset(thread_tbl, 0, sizeof(thread_tbl));
 
-	if (odp_init_global()) {
+	if (odp_init_global(init_data)) {
 		ODP_ERR("ODP global init failed.\n");
 		return -1;
 	}
