diff --git a/platform/linux-generic/include/odp_packet_io_internal.h b/platform/linux-generic/include/odp_packet_io_internal.h
index a807d13..9fc13a9 100644
--- a/platform/linux-generic/include/odp_packet_io_internal.h
+++ b/platform/linux-generic/include/odp_packet_io_internal.h
@@ -211,7 +211,8 @@ typedef struct pktio_if_ops {
 } pktio_if_ops_t;
 
 int _odp_packet_cls_enq(pktio_entry_t *pktio_entry, const uint8_t *base,
-			uint16_t buf_len, odp_packet_t *pkt_ret);
+			uint16_t buf_len, odp_time_t *ts,
+			odp_packet_t *pkt_ret);
 
 extern void *pktio_entry_ptr[];
 
diff --git a/platform/linux-generic/pktio/dpdk.c b/platform/linux-generic/pktio/dpdk.c
index 83fb1ba..3845448 100644
--- a/platform/linux-generic/pktio/dpdk.c
+++ b/platform/linux-generic/pktio/dpdk.c
@@ -677,7 +677,7 @@ static inline int mbuf_to_pkt(pktio_entry_t *pktio_entry,
 		if (pktio_cls_enabled(pktio_entry)) {
 			if (_odp_packet_cls_enq(pktio_entry,
 						(const uint8_t *)buf, pkt_len,
-						&pkt_table[nb_pkts]))
+						NULL, &pkt_table[nb_pkts]))
 				nb_pkts++;
 		} else {
 			pkt = packet_alloc(pktio_entry->s.pkt_dpdk.pool,
diff --git a/platform/linux-generic/pktio/netmap.c b/platform/linux-generic/pktio/netmap.c
index 0b794a0..9112ba3 100644
--- a/platform/linux-generic/pktio/netmap.c
+++ b/platform/linux-generic/pktio/netmap.c
@@ -586,7 +586,7 @@ static inline int netmap_pkt_to_odp(pktio_entry_t *pktio_entry,
 
 	if (pktio_cls_enabled(pktio_entry)) {
 		ret = _odp_packet_cls_enq(pktio_entry, (const uint8_t *)buf,
-					  len, pkt_out);
+					  len, NULL, pkt_out);
 		if (ret)
 			return 0;
 		return -1;
diff --git a/platform/linux-generic/pktio/pktio_common.c b/platform/linux-generic/pktio/pktio_common.c
index c568da3..e7bb3d8 100644
--- a/platform/linux-generic/pktio/pktio_common.c
+++ b/platform/linux-generic/pktio/pktio_common.c
@@ -10,18 +10,19 @@
 
 int _odp_packet_cls_enq(pktio_entry_t *pktio_entry,
 			const uint8_t *base, uint16_t buf_len,
-			odp_packet_t *pkt_ret)
+			odp_time_t *ts, odp_packet_t *pkt_ret)
 {
 	cos_t *cos;
 	odp_packet_t pkt;
-	odp_packet_hdr_t pkt_hdr;
+	odp_packet_hdr_t *pkt_hdr;
+	odp_packet_hdr_t src_pkt_hdr;
 	int ret;
 	odp_pool_t pool;
 
-	packet_parse_reset(&pkt_hdr);
+	packet_parse_reset(&src_pkt_hdr);
 
-	_odp_cls_parse(&pkt_hdr, base);
-	cos = pktio_select_cos(pktio_entry, base, &pkt_hdr);
+	_odp_cls_parse(&src_pkt_hdr, base);
+	cos = pktio_select_cos(pktio_entry, base, &src_pkt_hdr);
 
 	/* if No CoS found then drop the packet */
 	if (cos == NULL || cos->s.queue == NULL || cos->s.pool == NULL)
@@ -32,15 +33,18 @@ int _odp_packet_cls_enq(pktio_entry_t *pktio_entry,
 	pkt = odp_packet_alloc(pool, buf_len);
 	if (odp_unlikely(pkt == ODP_PACKET_INVALID))
 		return 0;
+	pkt_hdr = odp_packet_hdr(pkt);
 
-	copy_packet_parser_metadata(&pkt_hdr, odp_packet_hdr(pkt));
-	odp_packet_hdr(pkt)->input = pktio_entry->s.handle;
+	copy_packet_parser_metadata(&src_pkt_hdr, pkt_hdr);
+	pkt_hdr->input = pktio_entry->s.handle;
 
 	if (odp_packet_copydata_in(pkt, 0, buf_len, base) != 0) {
 		odp_packet_free(pkt);
 		return 0;
 	}
 
+	packet_set_ts(pkt_hdr, ts);
+
 	/* Parse and set packet header data */
 	odp_packet_pull_tail(pkt, odp_packet_len(pkt) - buf_len);
 	ret = queue_enq(cos->s.queue, odp_buf_to_hdr((odp_buffer_t)pkt), 0);
diff --git a/platform/linux-generic/pktio/socket.c b/platform/linux-generic/pktio/socket.c
index 44f18c2..e28fd07 100644
--- a/platform/linux-generic/pktio/socket.c
+++ b/platform/linux-generic/pktio/socket.c
@@ -650,7 +650,8 @@ static int sock_mmsg_recv(pktio_entry_t *pktio_entry,
 				continue;
 
 			ret = _odp_packet_cls_enq(pktio_entry, base,
-						  pkt_len, &pkt_table[nb_rx]);
+						  pkt_len, NULL,
+						  &pkt_table[nb_rx]);
 			if (ret)
 				nb_rx++;
 		}
diff --git a/platform/linux-generic/pktio/socket_mmap.c b/platform/linux-generic/pktio/socket_mmap.c
index da0f7b7..5cd1ad6 100644
--- a/platform/linux-generic/pktio/socket_mmap.c
+++ b/platform/linux-generic/pktio/socket_mmap.c
@@ -149,7 +149,8 @@ static inline unsigned pkt_mmap_v2_rx(pktio_entry_t *pktio_entry,
 
 		if (pktio_cls_enabled(pktio_entry)) {
 			ret = _odp_packet_cls_enq(pktio_entry, pkt_buf,
-						  pkt_len, &pkt_table[nb_rx]);
+						  pkt_len, NULL,
+						  &pkt_table[nb_rx]);
 			if (ret)
 				nb_rx++;
 		} else {
