diff --git a/include/helper/odp_packet_helper.h b/include/helper/odp_packet_helper.h
index eed866e..db12028 100644
--- a/include/helper/odp_packet_helper.h
+++ b/include/helper/odp_packet_helper.h
@@ -89,20 +89,6 @@ static inline size_t odp_packet_buf_size(odp_packet_t pkt)
 	return odp_buffer_size(buf);
 }
 
-/**
- * Helper: Tests if packet is part of a scatter/gather list
- *
- * @param pkt  Packet handle
- *
- * @return 1 if belongs to a scatter list, otherwise 0
- */
-static inline int odp_packet_is_scatter(odp_packet_t pkt)
-{
-	odp_buffer_t buf = odp_buffer_from_packet(pkt);
-
-	return odp_buffer_is_scatter(buf);
-}
-
 
 #ifdef __cplusplus
 }
diff --git a/include/odp_buffer.h b/include/odp_buffer.h
index b3d6f4a..d8577fd 100644
--- a/include/odp_buffer.h
+++ b/include/odp_buffer.h
@@ -19,13 +19,10 @@ extern "C" {
 #endif
 
 
-
 #include <odp_std_types.h>
 
 
 
-
-
 /**
  * ODP buffer
  */
@@ -68,14 +65,6 @@ int odp_buffer_type(odp_buffer_t buf);
 #define ODP_BUFFER_TYPE_PACKET    2  /**< Packet buffer */
 #define ODP_BUFFER_TYPE_TIMEOUT   3  /**< Timeout buffer */
 
-/**
- * Tests if buffer is part of a scatter/gather list
- *
- * @param buf      Buffer handle
- *
- * @return 1 if belongs to a scatter list, otherwise 0
- */
-int odp_buffer_is_scatter(odp_buffer_t buf);
 
 /**
  * Tests if buffer is valid
diff --git a/include/odp_buffer_pool.h b/include/odp_buffer_pool.h
index 9112489..69155cc 100644
--- a/include/odp_buffer_pool.h
+++ b/include/odp_buffer_pool.h
@@ -70,7 +70,6 @@ odp_buffer_pool_t odp_buffer_pool_lookup(const char *name);
 void odp_buffer_pool_print(odp_buffer_pool_t pool);
 
 
-
 /**
  * Buffer alloc
  *
@@ -90,6 +89,14 @@ odp_buffer_t odp_buffer_alloc(odp_buffer_pool_t pool);
 void odp_buffer_free(odp_buffer_t buf);
 
 
+/**
+ * Buffer pool of the buffer
+ *
+ * @param buf       Buffer handle
+ *
+ * @return Buffer pool the buffer was allocated from
+ */
+odp_buffer_pool_t odp_buffer_pool(odp_buffer_t buf);
 
 
 #ifdef __cplusplus
diff --git a/include/odp_packet.h b/include/odp_packet.h
index 59759bb..8ae6410 100644
--- a/include/odp_packet.h
+++ b/include/odp_packet.h
@@ -220,6 +220,154 @@ void odp_packet_print(odp_packet_t pkt);
  */
 int odp_packet_copy(odp_packet_t pkt_dst, odp_packet_t pkt_src);
 
+/**
+ * Tests if packet is segmented (a scatter/gather list)
+ *
+ * @param pkt  Packet handle
+ *
+ * @return Non-zero if packet is segmented, otherwise 0
+ */
+int odp_packet_is_segmented(odp_packet_t pkt);
+
+/**
+ * Segment count
+ *
+ * Returns number of segments in the packet. A packet has always at least one
+ * segment (the packet buffer itself).
+ *
+ * @param pkt  Packet handle
+ *
+ * @return Segment count
+ */
+int odp_packet_seg_count(odp_packet_t pkt);
+
+/**
+ * Segment start address
+ *
+ * @param pkt  Packet handle
+ * @param seg  Segment index (0 ... seg_count-1)
+ *
+ * @return Segment start address
+ */
+void *odp_packet_seg_addr(odp_packet_t pkt, int seg);
+
+/**
+ * Segment maximum data size
+ *
+ * @param pkt  Packet handle
+ * @param seg  Segment index (0 ... seg_count-1)
+ *
+ * @return Segment maximum data size
+ */
+size_t odp_packet_seg_size(odp_packet_t pkt, int seg);
+
+/**
+ * Segment data address
+ *
+ * @param pkt  Packet handle
+ * @param seg  Segment index (0 ... seg_count-1)
+ *
+ * @return Segment data address
+ */
+void *odp_packet_seg_data(odp_packet_t pkt, int seg);
+
+/**
+ * Segment data length
+ *
+ * @param pkt  Packet handle
+ * @param seg  Segment index (0 ... seg_count-1)
+ *
+ * @return Segment data length
+ */
+size_t odp_packet_seg_data_len(odp_packet_t pkt, int seg);
+
+/**
+ * Segment headroom
+ *
+ * seg_headroom = seg_data - seg_addr
+ *
+ * @param pkt  Packet handle
+ * @param seg  Segment index (0 ... seg_count-1)
+ *
+ * @return Number of octets from seg_addr to seg_data
+ */
+size_t odp_packet_seg_headroom(odp_packet_t pkt, int seg);
+
+/**
+ * Segment tailroom
+ *
+ * seg_tailroom = seg_size - seg_headroom - seg_data_len
+ *
+ * @param pkt  Packet handle
+ * @param seg  Segment index (0 ... seg_count-1)
+ *
+ * @return Number of octets from end-of-data to end-of-segment
+ */
+size_t odp_packet_seg_tailroom(odp_packet_t pkt, int seg);
+
+/**
+ * Push out segment head
+ *
+ * Push out segment data address (away from data) and increase data length.
+ *
+ * seg_data     -= len
+ * seg_data_len += len
+ *
+ * @param pkt  Packet handle
+ * @param seg  Segment index (0 ... seg_count-1)
+ * @param len  Number of octets to push head (0 ... seg_headroom)
+ *
+ * @return New segment data address, or NULL on an error
+ */
+void *odp_packet_seg_push_head(odp_packet_t pkt, int seg, size_t len);
+
+/**
+ * Pull in segment head
+ *
+ * Pull in segment data address (towards data) and decrease data length.
+ *
+ * seg_data     += len
+ * seg_data_len -= len
+ *
+ * @param pkt  Packet handle
+ * @param seg  Segment index (0 ... seg_count-1)
+ * @param len  Number of octets to pull head (0 ... seg_data_len)
+ *
+ * @return New segment data address, or NULL on an error
+ */
+void *odp_packet_seg_pull_head(odp_packet_t pkt, int seg, size_t len);
+
+/**
+ * Push out segment tail
+ *
+ * Increase segment data length.
+ *
+ * seg_data_len  += len
+ *
+ * @param pkt  Packet handle
+ * @param seg  Segment index (0 ... seg_count-1)
+ * @param len  Number of octets to push tail (0 ... seg_tailroom)
+ *
+ * @return New segment data length, or -1 on an error
+ */
+int odp_packet_seg_push_tail(odp_packet_t pkt, int seg, size_t len);
+
+/**
+ * Pull in segment tail
+ *
+ * Decrease segment data length.
+ *
+ * seg_data_len  -= len
+ *
+ * @param pkt  Packet handle
+ * @param seg  Segment index (0 ... seg_count-1)
+ * @param len  Number of octets to pull tail (0 ... seg_data_len)
+ *
+ * @return New segment data length, or -1 on an error
+ */
+int odp_packet_seg_pull_tail(odp_packet_t pkt, int seg, size_t len);
+
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/platform/linux-generic/source/odp_buffer.c b/platform/linux-generic/source/odp_buffer.c
index afbe96a..0169eec 100644
--- a/platform/linux-generic/source/odp_buffer.c
+++ b/platform/linux-generic/source/odp_buffer.c
@@ -36,17 +36,6 @@ int odp_buffer_type(odp_buffer_t buf)
 }
 
 
-int odp_buffer_is_scatter(odp_buffer_t buf)
-{
-	odp_buffer_hdr_t *hdr = odp_buf_to_hdr(buf);
-
-	if (hdr->scatter.num_bufs == 0)
-		return 0;
-	else
-		return 1;
-}
-
-
 int odp_buffer_is_valid(odp_buffer_t buf)
 {
 	odp_buffer_bits_t handle;
diff --git a/platform/linux-generic/source/odp_buffer_pool.c b/platform/linux-generic/source/odp_buffer_pool.c
index 25c9565..b73cbb2 100644
--- a/platform/linux-generic/source/odp_buffer_pool.c
+++ b/platform/linux-generic/source/odp_buffer_pool.c
@@ -491,6 +491,15 @@ void odp_buffer_free(odp_buffer_t buf)
 }
 
 
+odp_buffer_pool_t odp_buffer_pool(odp_buffer_t buf)
+{
+	odp_buffer_hdr_t *hdr;
+
+	hdr = odp_buf_to_hdr(buf);
+	return hdr->pool;
+}
+
+
 void odp_buffer_pool_print(odp_buffer_pool_t pool_id)
 {
 	pool_entry_t *pool;
diff --git a/platform/linux-generic/source/odp_packet.c b/platform/linux-generic/source/odp_packet.c
index 99fcc6d..13e2471 100644
--- a/platform/linux-generic/source/odp_packet.c
+++ b/platform/linux-generic/source/odp_packet.c
@@ -127,6 +127,26 @@ void odp_packet_set_l4_offset(odp_packet_t pkt, size_t offset)
 	odp_packet_hdr(pkt)->l4_offset = offset;
 }
 
+
+int odp_packet_is_segmented(odp_packet_t pkt)
+{
+	odp_buffer_hdr_t *buf_hdr = odp_buf_to_hdr((odp_buffer_t)pkt);
+
+	if (buf_hdr->scatter.num_bufs == 0)
+		return 0;
+	else
+		return 1;
+}
+
+
+int odp_packet_seg_count(odp_packet_t pkt)
+{
+	odp_buffer_hdr_t *buf_hdr = odp_buf_to_hdr((odp_buffer_t)pkt);
+
+	return (int)buf_hdr->scatter.num_bufs + 1;
+}
+
+
 /**
  * Simple packet parser: eth, VLAN, IP, TCP/UDP/ICMP
  *
