diff --git a/platform/linux-generic/include/odp/api/plat/init_types.h b/platform/linux-generic/include/odp/api/plat/init_types.h
index 6a1052d..888b04a 100644
--- a/platform/linux-generic/include/odp/api/plat/init_types.h
+++ b/platform/linux-generic/include/odp/api/plat/init_types.h
@@ -25,6 +25,7 @@ typedef uint64_t odp_instance_t;
  * @internal platform specific data
  */
 typedef struct odp_platform_init_t {
+	int ipc_ns; /**< Name space for ipc shared objects. */
 } odp_platform_init_t;
 
 #ifdef __cplusplus
diff --git a/platform/linux-generic/include/odp_internal.h b/platform/linux-generic/include/odp_internal.h
index d8aa7af..28a4fc4 100644
--- a/platform/linux-generic/include/odp_internal.h
+++ b/platform/linux-generic/include/odp_internal.h
@@ -46,6 +46,7 @@ struct odp_global_data_s {
 	odp_cpumask_t control_cpus;
 	odp_cpumask_t worker_cpus;
 	int num_cpus_installed;
+	int ipc_ns;
 };
 
 enum init_stage {
diff --git a/platform/linux-generic/include/odp_shm_internal.h b/platform/linux-generic/include/odp_shm_internal.h
index 1fd7a3c..30e60f7 100644
--- a/platform/linux-generic/include/odp_shm_internal.h
+++ b/platform/linux-generic/include/odp_shm_internal.h
@@ -11,6 +11,11 @@
 extern "C" {
 #endif
 
+#include <odp/api/shared_memory.h>
+
+#define SHM_DEVNAME_MAXLEN (ODP_SHM_NAME_LEN + 16)
+#define SHM_DEVNAME_FORMAT "/odp-%d-%s" /* /dev/shm/odp-<pid>-<name> */
+
 #define _ODP_SHM_PROC_NOCREAT 0x4  /**< Do not create shm if not exist */
 #define _ODP_SHM_O_EXCL	      0x8  /**< Do not create shm if exist */
 
diff --git a/platform/linux-generic/odp_init.c b/platform/linux-generic/odp_init.c
index 51aaa9a..e8d12c9 100644
--- a/platform/linux-generic/odp_init.c
+++ b/platform/linux-generic/odp_init.c
@@ -12,9 +12,12 @@ struct odp_global_data_s odp_global_data;
 
 int odp_init_global(odp_instance_t *instance,
 		    const odp_init_t *params,
-		    const odp_platform_init_t *platform_params ODP_UNUSED)
+		    const odp_platform_init_t *platform_params)
 {
+	memset(&odp_global_data, 0, sizeof(struct odp_global_data_s));
 	odp_global_data.main_pid = getpid();
+	if (platform_params)
+		odp_global_data.ipc_ns = platform_params->ipc_ns;
 
 	enum init_stage stage = NO_INIT;
 	odp_global_data.log_fn = odp_override_log;
diff --git a/platform/linux-generic/odp_shared_memory.c b/platform/linux-generic/odp_shared_memory.c
index 276a785..568711a 100644
--- a/platform/linux-generic/odp_shared_memory.c
+++ b/platform/linux-generic/odp_shared_memory.c
@@ -27,9 +27,6 @@
 #include <string.h>
 #include <errno.h>
 
-#define SHM_DEVNAME_MAXLEN (ODP_SHM_NAME_LEN + 16)
-#define SHM_DEVNAME_FORMAT "/odp-%d-%s" /* /dev/shm/odp-<pid>-<name> */
-
 ODP_STATIC_ASSERT(ODP_CONFIG_SHM_BLOCKS >= ODP_CONFIG_POOLS,
 		  "ODP_CONFIG_SHM_BLOCKS < ODP_CONFIG_POOLS");
 
@@ -231,11 +228,18 @@ odp_shm_t odp_shm_reserve(const char *name, uint64_t size, uint64_t align,
 		oflag |= O_EXCL;
 
 	if (flags & (ODP_SHM_PROC | _ODP_SHM_PROC_NOCREAT)) {
+		int shm_ns_id;
+
+		if (odp_global_data.ipc_ns)
+			shm_ns_id = odp_global_data.ipc_ns;
+		else
+			shm_ns_id = odp_global_data.main_pid;
+
 		need_huge_page = 0;
 
 		/* Creates a file to /dev/shm/odp */
 		snprintf(shm_devname, SHM_DEVNAME_MAXLEN,
-			 SHM_DEVNAME_FORMAT, odp_global_data.main_pid, name);
+			 SHM_DEVNAME_FORMAT, shm_ns_id, name);
 		fd = shm_open(shm_devname, oflag,
 			      S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
 		if (fd == -1) {
diff --git a/platform/linux-generic/pktio/ipc.c b/platform/linux-generic/pktio/ipc.c
index 4a17e36..b16c611 100644
--- a/platform/linux-generic/pktio/ipc.c
+++ b/platform/linux-generic/pktio/ipc.c
@@ -45,13 +45,23 @@ static const char *_ipc_odp_buffer_pool_shm_name(odp_pool_t pool_hdl)
 static int _ipc_shm_lookup(const char *name)
 {
 	int shm;
+	char shm_devname[SHM_DEVNAME_MAXLEN];
 
-	shm = shm_open(name, O_RDWR, S_IRUSR | S_IWUSR);
+	if (!odp_global_data.ipc_ns)
+		ODP_ABORT("ipc_ns not set\n");
+
+	snprintf(shm_devname, SHM_DEVNAME_MAXLEN,
+		 SHM_DEVNAME_FORMAT,
+		 odp_global_data.ipc_ns, name);
+
+	shm = shm_open(shm_devname, O_RDWR, S_IRUSR | S_IWUSR);
 	if (shm == -1) {
-		if (errno == ENOENT)
+		if (errno == ENOENT) {
+			ODP_DBG("no file %s\n", shm_devname);
 			return -1;
+		}
 		ODP_ABORT("shm_open for %s err %s\n",
-			  name, strerror(errno));
+			  shm_devname, strerror(errno));
 	}
 	close(shm);
 	return 0;
@@ -583,6 +593,8 @@ static int ipc_pktio_send(pktio_entry_t *pktio_entry,
 	int ret;
 	unsigned i;
 	uint32_t ready = odp_atomic_load_u32(&pktio_entry->s.ipc.ready);
+	odp_packet_t pkt_table_mapped[len]; /**< Ready to send packet has to be
+					      * in memory mapped pool. */
 
 	if (odp_unlikely(!ready))
 		return 0;
@@ -610,8 +622,9 @@ static int ipc_pktio_send(pktio_entry_t *pktio_entry,
 				ODP_ABORT("Unable to copy packet\n");
 
 			odp_packet_free(pkt);
-			/* Cannot do this. Packet table is const. */
-			/*pkt_table[i] = newpkt;*/
+			pkt_table_mapped[i] = newpkt;
+		} else {
+			pkt_table_mapped[i] = pkt;
 		}
 
 		rbuf_p = (void *)&pkt;
@@ -626,10 +639,7 @@ static int ipc_pktio_send(pktio_entry_t *pktio_entry,
 	}
 
 	/* Put packets to ring to be processed by other process. */
-	/* BUG: Cannot store pointer to user provided memory,
-	   which is likely allocated from the stack and will be overwritten
-	   after this function returns. */
-/*	rbuf_p = (void *)&pkt_table[0]; */
+	rbuf_p = (void *)&pkt_table_mapped[0];
 	r = pktio_entry->s.ipc.tx.send;
 	ret = _ring_mp_enqueue_burst(r, rbuf_p, len);
 	if (odp_unlikely(ret < 0)) {
diff --git a/platform/linux-generic/test/pktio_ipc/ipc_common.c b/platform/linux-generic/test/pktio_ipc/ipc_common.c
index 101f597..34d2632 100644
--- a/platform/linux-generic/test/pktio_ipc/ipc_common.c
+++ b/platform/linux-generic/test/pktio_ipc/ipc_common.c
@@ -8,6 +8,7 @@
 
 /** Run time in seconds */
 int run_time_sec;
+int ipc_name_space;
 
 int ipc_odp_packet_sendall(odp_pktio_t pktio,
 			   odp_packet_t pkt_tbl[], int num)
@@ -80,14 +81,16 @@ void parse_args(int argc, char *argv[])
 	int long_index;
 	static struct option longopts[] = {
 		{"time", required_argument, NULL, 't'},
-		{"help", no_argument, NULL, 'h'},		/* return 'h' */
+		{"ns", required_argument, NULL, 'n'}, /* ipc name space */
+		{"help", no_argument, NULL, 'h'},     /* return 'h' */
 		{NULL, 0, NULL, 0}
 	};
 
 	run_time_sec = 0; /* loop forever if time to run is 0 */
+	ipc_name_space = 0;
 
 	while (1) {
-		opt = getopt_long(argc, argv, "+t:h",
+		opt = getopt_long(argc, argv, "+t:n:h",
 				  longopts, &long_index);
 
 		if (opt == -1)
@@ -97,17 +100,24 @@ void parse_args(int argc, char *argv[])
 		case 't':
 			run_time_sec = atoi(optarg);
 			break;
+		case 'n':
+			ipc_name_space = atoi(optarg);
+			break;
 		case 'h':
 			usage(argv[0]);
 			exit(EXIT_SUCCESS);
 			break;
-
 		default:
 			break;
 		}
 	}
 
 	optind = 1;		/* reset 'extern optind' from the getopt lib */
+
+	if (!ipc_name_space) {
+		usage(argv[0]);
+		exit(1);
+	}
 }
 
 /**
@@ -138,10 +148,12 @@ void usage(char *progname)
 {
 	printf("\n"
 	       "Usage: %s OPTIONS\n"
-	       "  E.g. %s -t seconds\n"
+	       "  E.g. -n ipc_name_space %s -t seconds\n"
 	       "\n"
 	       "OpenDataPlane linux-generic ipc test application.\n"
 	       "\n"
+		"Mandatory OPTIONS:\n"
+	       "  -n, --ns           IPC name space ID /dev/shm/odp-<ns>-objname.\n"
 	       "Optional OPTIONS\n"
 	       "  -h, --help           Display help and exit.\n"
 	       "  -t, --time           Time to run in seconds.\n"
diff --git a/platform/linux-generic/test/pktio_ipc/ipc_common.h b/platform/linux-generic/test/pktio_ipc/ipc_common.h
index c5e3eb7..7bc483f 100644
--- a/platform/linux-generic/test/pktio_ipc/ipc_common.h
+++ b/platform/linux-generic/test/pktio_ipc/ipc_common.h
@@ -62,6 +62,9 @@ char *pktio_name;
 /** Run time in seconds */
 int run_time_sec;
 
+/** IPC name space id /dev/shm/odp-nsid-objname */
+int ipc_name_space;
+
 /* helper funcs */
 void parse_args(int argc, char *argv[]);
 void print_info(char *progname);
diff --git a/platform/linux-generic/test/pktio_ipc/pktio_ipc1.c b/platform/linux-generic/test/pktio_ipc/pktio_ipc1.c
index cec2b07..a4eed88 100644
--- a/platform/linux-generic/test/pktio_ipc/pktio_ipc1.c
+++ b/platform/linux-generic/test/pktio_ipc/pktio_ipc1.c
@@ -113,9 +113,9 @@ static int pktio_run_loop(odp_pool_t pool)
 					EXAMPLE_ABORT("invalid l4 offset\n");
 
 				off += ODPH_UDPHDR_LEN;
-				ret = odp_packet_copydata_out(pkt, off,
-							      sizeof(head),
-							      &head);
+				ret = odp_packet_copy_to_mem(pkt, off,
+							     sizeof(head),
+							     &head);
 				if (ret) {
 					stat_errors++;
 					odp_packet_free(pkt);
@@ -137,9 +137,9 @@ static int pktio_run_loop(odp_pool_t pool)
 				}
 
 				off = odp_packet_len(pkt) - sizeof(pkt_tail_t);
-				ret = odp_packet_copydata_out(pkt, off,
-							      sizeof(tail),
-							      &tail);
+				ret = odp_packet_copy_to_mem(pkt, off,
+							     sizeof(tail),
+							     &tail);
 				if (ret) {
 					stat_errors++;
 					odp_packet_free(pkt);
@@ -210,15 +210,15 @@ static int pktio_run_loop(odp_pool_t pool)
 			head.seq   = cnt++;
 
 			off += ODPH_UDPHDR_LEN;
-			ret = odp_packet_copydata_in(pkt, off, sizeof(head),
-						     &head);
+			ret = odp_packet_copy_from_mem(pkt, off, sizeof(head),
+						       &head);
 			if (ret)
 				EXAMPLE_ABORT("unable to copy in head data");
 
 			tail.magic = TEST_SEQ_MAGIC;
 			off = odp_packet_len(pkt) - sizeof(pkt_tail_t);
-			ret = odp_packet_copydata_in(pkt, off, sizeof(tail),
-						     &tail);
+			ret = odp_packet_copy_from_mem(pkt, off, sizeof(tail),
+						       &tail);
 			if (ret)
 				EXAMPLE_ABORT("unable to copy in tail data");
 		}
@@ -280,19 +280,24 @@ int main(int argc, char *argv[])
 {
 	odp_pool_t pool;
 	odp_pool_param_t params;
+	odp_instance_t instance;
+	odp_platform_init_t plat_idata;
 	int ret;
 
 	/* Parse and store the application arguments */
 	parse_args(argc, argv);
 
+	memset(&plat_idata, 0, sizeof(odp_platform_init_t));
+	plat_idata.ipc_ns = ipc_name_space;
+
 	/* Init ODP before calling anything else */
-	if (odp_init_global(NULL, NULL)) {
+	if (odp_init_global(&instance, NULL, &plat_idata)) {
 		EXAMPLE_ERR("Error: ODP global init failed.\n");
 		exit(EXIT_FAILURE);
 	}
 
 	/* Init this thread */
-	if (odp_init_local(ODP_THREAD_CONTROL)) {
+	if (odp_init_local(instance, ODP_THREAD_CONTROL)) {
 		EXAMPLE_ERR("Error: ODP local init failed.\n");
 		exit(EXIT_FAILURE);
 	}
diff --git a/platform/linux-generic/test/pktio_ipc/pktio_ipc2.c b/platform/linux-generic/test/pktio_ipc/pktio_ipc2.c
index a133d8b..c0c6ff5 100644
--- a/platform/linux-generic/test/pktio_ipc/pktio_ipc2.c
+++ b/platform/linux-generic/test/pktio_ipc/pktio_ipc2.c
@@ -101,8 +101,8 @@ static int ipc_second_process(void)
 				EXAMPLE_ABORT("invalid l4 offset\n");
 
 			off += ODPH_UDPHDR_LEN;
-			ret = odp_packet_copydata_out(pkt, off, sizeof(head),
-						      &head);
+			ret = odp_packet_copy_to_mem(pkt, off, sizeof(head),
+						     &head);
 			if (ret)
 				EXAMPLE_ABORT("unable copy out head data");
 
@@ -111,8 +111,8 @@ static int ipc_second_process(void)
 
 			/* Modify magic number in packet */
 			head.magic = TEST_SEQ_MAGIC_2;
-			ret = odp_packet_copydata_in(pkt, off, sizeof(head),
-						     &head);
+			ret = odp_packet_copy_from_mem(pkt, off, sizeof(head),
+						       &head);
 			if (ret)
 				EXAMPLE_ABORT("unable to copy in head data");
 		}
@@ -136,9 +136,9 @@ static int ipc_second_process(void)
 
 			off = odp_packet_l4_offset(alloc_pkt);
 			off += ODPH_UDPHDR_LEN;
-			ret = odp_packet_copydata_in(alloc_pkt, off,
-						     sizeof(head),
-						     &head);
+			ret = odp_packet_copy_from_mem(alloc_pkt, off,
+						       sizeof(head),
+						       &head);
 			if (ret)
 				EXAMPLE_ABORT("unable to copy in head data");
 
@@ -173,16 +173,22 @@ exit:
 
 int main(int argc, char *argv[])
 {
+	odp_instance_t instance;
+	odp_platform_init_t plat_idata;
+
 	/* Parse and store the application arguments */
 	parse_args(argc, argv);
 
-	if (odp_init_global(NULL, NULL)) {
+	memset(&plat_idata, 0, sizeof(odp_platform_init_t));
+	plat_idata.ipc_ns = ipc_name_space;
+
+	if (odp_init_global(&instance, NULL, &plat_idata)) {
 		EXAMPLE_ERR("Error: ODP global init failed.\n");
 		exit(EXIT_FAILURE);
 	}
 
 	/* Init this thread */
-	if (odp_init_local(ODP_THREAD_CONTROL)) {
+	if (odp_init_local(instance, ODP_THREAD_CONTROL)) {
 		EXAMPLE_ERR("Error: ODP local init failed.\n");
 		exit(EXIT_FAILURE);
 	}
diff --git a/platform/linux-generic/test/pktio_ipc/pktio_ipc_run b/platform/linux-generic/test/pktio_ipc/pktio_ipc_run
index 08a7457..1128002 100755
--- a/platform/linux-generic/test/pktio_ipc/pktio_ipc_run
+++ b/platform/linux-generic/test/pktio_ipc/pktio_ipc_run
@@ -20,18 +20,17 @@ PATH=.:$PATH
 run()
 {
 	local ret=0
+	IPC_NS=$$
 
 	#if test was interrupted with CTRL+c than files
 	#might remain in shm. Needed cleanely delete them.
-	rm -rf /dev/shm/ipc_pktio_* 2>&1 > /dev/null
-	rm -rf /dev/shm/packet_pool1 2>&1 > /dev/null
-	rm -rf /dev/shm/packet_pool2 2>&1 > /dev/null
+	rm -rf /dev/shm/odp-${IPC_NS}* 2>&1 > /dev/null
 
 	echo "==== run pktio_ipc1 then pktio_ipc2 ===="
-	pktio_ipc1${EXEEXT} -t 30 &
+	pktio_ipc1${EXEEXT} -n ${IPC_NS} -t 30 &
 	IPC_PID=$!
 
-	pktio_ipc2${EXEEXT} -t 10
+	pktio_ipc2${EXEEXT} -n ${IPC_NS} -t 10
 	ret=$?
 	# pktio_ipc1 should do clean up and exit just
 	# after pktio_ipc2 exited. If it does not happen
@@ -39,9 +38,7 @@ run()
 	sleep 1
 	kill ${IPC_PID} 2>&1 > /dev/null
 	if [ $? -eq 0 ]; then
-		rm -rf /dev/shm/ipc_pktio_* 2>&1 > /dev/null
-		rm -rf /dev/shm/packet_pool1 2>&1 > /dev/null
-		rm -rf /dev/shm/packet_pool2 2>&1 > /dev/null
+		rm -rf /dev/shm/odp-${IPC_NS}* 2>&1 > /dev/null
 	fi
 
 	if [ $ret -ne 0 ]; then
@@ -52,10 +49,10 @@ run()
 	fi
 
 	echo "==== run pktio_ipc2 then pktio_ipc1 ===="
-	pktio_ipc2${EXEEXT} -t 10 &
+	pktio_ipc2${EXEEXT} -n ${IPC_NS} -t 10 &
 	IPC_PID=$!
 
-	pktio_ipc1${EXEEXT} -t 20
+	pktio_ipc1${EXEEXT} -n ${IPC_NS} -t 20
 	ret=$?
 	(kill ${IPC_PID} 2>&1 > /dev/null) > /dev/null || true
 
