diff --git a/example/generator/odp_generator.c b/example/generator/odp_generator.c
index e4a72fa..af1ff89 100644
--- a/example/generator/odp_generator.c
+++ b/example/generator/odp_generator.c
@@ -530,7 +530,7 @@ int main(int argc, char *argv[])
 	int core_count;
 
 	/* Init ODP before calling anything else */
-	if (odp_init_global()) {
+	if (odp_init_global(ODP_INIT_F_ALL)) {
 		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 e331ff2..6b6c75a 100644
--- a/example/l2fwd/odp_l2fwd.c
+++ b/example/l2fwd/odp_l2fwd.c
@@ -288,7 +288,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(ODP_INIT_F_ALL)) {
 		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..f6197f8 100644
--- a/example/odp_example/odp_example.c
+++ b/example/odp_example/odp_example.c
@@ -934,7 +934,7 @@ int main(int argc, char *argv[])
 
 	memset(thread_tbl, 0, sizeof(thread_tbl));
 
-	if (odp_init_global()) {
+	if (odp_init_global(ODP_INIT_F_ALL)) {
 		printf("ODP global init failed.\n");
 		return -1;
 	}
diff --git a/example/packet/odp_pktio.c b/example/packet/odp_pktio.c
index edf8cfd..8079fd0 100644
--- a/example/packet/odp_pktio.c
+++ b/example/packet/odp_pktio.c
@@ -285,7 +285,7 @@ int main(int argc, char *argv[])
 	int core_count;
 
 	/* Init ODP before calling anything else */
-	if (odp_init_global()) {
+	if (odp_init_global(ODP_INIT_F_ALL & ~ODP_INIT_F_TIMER)) {
 		ODP_ERR("Error: ODP global init failed.\n");
 		exit(EXIT_FAILURE);
 	}
diff --git a/example/packet_netmap/odp_pktio_netmap.c b/example/packet_netmap/odp_pktio_netmap.c
index 7d33b19..9c5ee6b 100644
--- a/example/packet_netmap/odp_pktio_netmap.c
+++ b/example/packet_netmap/odp_pktio_netmap.c
@@ -201,7 +201,7 @@ int main(int argc, char *argv[])
 	int i;
 
 	/* Init ODP before calling anything else */
-	if (odp_init_global()) {
+	if (odp_init_global(ODP_INIT_F_ALL & ~ODP_INIT_F_TIMER)) {
 		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..4e566bc 100644
--- a/example/timer/odp_timer_test.c
+++ b/example/timer/odp_timer_test.c
@@ -210,7 +210,7 @@ int main(int argc, char *argv[])
 
 	memset(thread_tbl, 0, sizeof(thread_tbl));
 
-	if (odp_init_global()) {
+	if (odp_init_global(ODP_INIT_F_ALL)) {
 		printf("ODP global init failed.\n");
 		return -1;
 	}
diff --git a/include/odp_init.h b/include/odp_init.h
index 490324a..bada995 100644
--- a/include/odp_init.h
+++ b/include/odp_init.h
@@ -22,6 +22,13 @@ extern "C" {
 
 #include <odp_std_types.h>
 
+#define ODP_INIT_F_ALL		0xffffffff
+#define ODP_INIT_F_SHMINIT	(1 << 0)
+#define ODP_INIT_F_POOL	(1 << 1)
+#define ODP_INIT_F_QUEUE	(1 << 2)
+#define ODP_INIT_F_SCHEDULE	(1 << 3)
+#define ODP_INIT_F_PKTIO	(1 << 4)
+#define ODP_INIT_F_TIMER	(1 << 5)
 
 
 
@@ -31,9 +38,10 @@ extern "C" {
  * This function must be called once before calling
  * any other ODP API functions.
  *
+ * @param mask Mask odp layers to be initialized
  * @return 0 if successful
  */
-int odp_init_global(void);
+int odp_init_global(uint32_t mask);
 
 
 /**
diff --git a/platform/linux-dpdk/odp_init.c b/platform/linux-dpdk/odp_init.c
index ecc2066..b6865e9 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(uint32_t mask)
 {
 	odp_thread_init_global();
 
@@ -61,34 +61,46 @@ int odp_init_global(void)
 		return -1;
 	}
 
-	if (odp_shm_init_global()) {
-		ODP_ERR("ODP shm init failed.\n");
-		return -1;
+	if (mask & ODP_INIT_F_SHMINIT) {
+		if (odp_shm_init_global()) {
+			ODP_ERR("ODP shm init failed.\n");
+			return -1;
+		}
 	}
 
-	if (odp_buffer_pool_init_global()) {
-		ODP_ERR("ODP buffer pool init failed.\n");
-		return -1;
+	if (mask & ODP_INIT_F_POOL) {
+		if (odp_buffer_pool_init_global()) {
+			ODP_ERR("ODP buffer pool init failed.\n");
+			return -1;
+		}
 	}
 
-	if (odp_queue_init_global()) {
-		ODP_ERR("ODP queue init failed.\n");
-		return -1;
+	if (mask & ODP_INIT_F_QUEUE) {
+		if (odp_queue_init_global()) {
+			ODP_ERR("ODP queue init failed.\n");
+			return -1;
+		}
 	}
 
-	if (odp_schedule_init_global()) {
-		ODP_ERR("ODP schedule init failed.\n");
-		return -1;
+	if (mask & ODP_INIT_F_SCHEDULE) {
+		if (odp_schedule_init_global()) {
+			ODP_ERR("ODP schedule init failed.\n");
+			return -1;
+		}
 	}
 
-	if (odp_pktio_init_global()) {
-		ODP_ERR("ODP packet io init failed.\n");
-		return -1;
+	if (mask & ODP_INIT_F_PKTIO) {
+		if (odp_pktio_init_global()) {
+			ODP_ERR("ODP packet io init failed.\n");
+			return -1;
+		}
 	}
 
-	if (odp_timer_init_global()) {
-		ODP_ERR("ODP timer init failed.\n");
-		return -1;
+	if (mask & ODP_INIT_F_TIMER) {
+		if (odp_timer_init_global()) {
+			ODP_ERR("ODP timer init failed.\n");
+			return -1;
+		}
 	}
 
 	return 0;
diff --git a/platform/linux-generic/odp_init.c b/platform/linux-generic/odp_init.c
index d4c2eb8..26cc019 100644
--- a/platform/linux-generic/odp_init.c
+++ b/platform/linux-generic/odp_init.c
@@ -9,40 +9,52 @@
 #include <odp_debug.h>
 
 
-int odp_init_global(void)
+int odp_init_global(uint32_t mask)
 {
 	odp_thread_init_global();
 
 	odp_system_info_init();
 
-	if (odp_shm_init_global()) {
-		ODP_ERR("ODP shm init failed.\n");
-		return -1;
+	if (mask & ODP_INIT_F_SHMINIT) {
+		if (odp_shm_init_global()) {
+			ODP_ERR("ODP shm init failed.\n");
+			return -1;
+		}
 	}
 
-	if (odp_buffer_pool_init_global()) {
-		ODP_ERR("ODP buffer pool init failed.\n");
-		return -1;
+	if (mask & ODP_INIT_F_POOL) {
+		if (odp_buffer_pool_init_global()) {
+			ODP_ERR("ODP buffer pool init failed.\n");
+			return -1;
+		}
 	}
 
-	if (odp_queue_init_global()) {
-		ODP_ERR("ODP queue init failed.\n");
-		return -1;
+	if (mask & ODP_INIT_F_QUEUE) {
+		if (odp_queue_init_global()) {
+			ODP_ERR("ODP queue init failed.\n");
+			return -1;
+		}
 	}
 
-	if (odp_schedule_init_global()) {
-		ODP_ERR("ODP schedule init failed.\n");
-		return -1;
+	if (mask & ODP_INIT_F_SCHEDULE) {
+		if (odp_schedule_init_global()) {
+			ODP_ERR("ODP schedule init failed.\n");
+			return -1;
+		}
 	}
 
-	if (odp_pktio_init_global()) {
-		ODP_ERR("ODP packet io init failed.\n");
-		return -1;
+	if (mask & ODP_INIT_F_PKTIO) {
+		if (odp_pktio_init_global()) {
+			ODP_ERR("ODP packet io init failed.\n");
+			return -1;
+		}
 	}
 
-	if (odp_timer_init_global()) {
-		ODP_ERR("ODP timer init failed.\n");
-		return -1;
+	if (mask & ODP_INIT_F_TIMER) {
+		if (odp_timer_init_global()) {
+			ODP_ERR("ODP timer init failed.\n");
+			return -1;
+		}
 	}
 
 	return 0;
diff --git a/platform/linux-keystone2/odp_init.c b/platform/linux-keystone2/odp_init.c
index f832551..ffeb996 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(uint32_t mask)
 {
 	odp_thread_init_global();
 
@@ -99,34 +99,46 @@ int odp_init_global(void)
 	ti_em_osal_core_init_global();
 	ti_init_hw_config();
 
-	if (odp_shm_init_global()) {
-		ODP_ERR("ODP shm init failed.\n");
-		return -1;
+	if (mask & ODP_INIT_F_SHMINIT) {
+		if (odp_shm_init_global()) {
+			ODP_ERR("ODP shm init failed.\n");
+			return -1;
+		}
 	}
 
-	if (odp_buffer_pool_init_global()) {
-		ODP_ERR("ODP buffer pool init failed.\n");
-		return -1;
+	if (mask & ODP_INIT_F_POOL) {
+		if (odp_buffer_pool_init_global()) {
+			ODP_ERR("ODP buffer pool init failed.\n");
+			return -1;
+		}
 	}
 
-	if (odp_queue_init_global()) {
-		ODP_ERR("ODP queue init failed.\n");
-		return -1;
+	if (mask & ODP_INIT_F_QUEUE) {
+		if (odp_queue_init_global()) {
+			ODP_ERR("ODP queue init failed.\n");
+			return -1;
+		}
 	}
 
-	if (odp_schedule_init_global()) {
-		ODP_ERR("ODP schedule init failed.\n");
-		return -1;
+	if (mask & ODP_INIT_F_SCHEDULE) {
+		if (odp_schedule_init_global()) {
+			ODP_ERR("ODP schedule init failed.\n");
+			return -1;
+		}
 	}
 
-	if (odp_pktio_init_global()) {
-		ODP_ERR("ODP packet io init failed.\n");
-		return -1;
+	if (mask & ODP_INIT_F_PKTIO) {
+		if (odp_pktio_init_global()) {
+			ODP_ERR("ODP packet io init failed.\n");
+			return -1;
+		}
 	}
 
-	if (odp_timer_init_global()) {
-		ODP_ERR("ODP timer init failed.\n");
-		return -1;
+	if (mask & ODP_INIT_F_TIMER) {
+		if (odp_timer_init_global()) {
+			ODP_ERR("ODP timer init failed.\n");
+			return -1;
+		}
 	}
 
 	return 0;
diff --git a/test/api_test/odp_common.c b/test/api_test/odp_common.c
index 89ebd2d..dcb13ed 100644
--- a/test/api_test/odp_common.c
+++ b/test/api_test/odp_common.c
@@ -56,7 +56,7 @@ int odp_test_global_init(void)
 {
 	memset(thread_tbl, 0, sizeof(thread_tbl));
 
-	if (odp_init_global()) {
+	if (odp_init_global(ODP_INIT_F_ALL)) {
 		ODP_ERR("ODP global init failed.\n");
 		return -1;
 	}
