diff --git a/test/api_test/Makefile.am b/test/api_test/Makefile.am
index 5104454..6fbf982 100644
--- a/test/api_test/Makefile.am
+++ b/test/api_test/Makefile.am
@@ -1,12 +1,14 @@
 include $(top_srcdir)/test/Makefile.inc
 
-bin_PROGRAMS = odp_atomic odp_shm odp_ring odp_timer_ping
+bin_PROGRAMS = odp_atomic odp_shm odp_ring odp_timer_ping odp_buffer
 odp_atomic_LDFLAGS = $(AM_LDFLAGS) -static
 odp_shm_LDFLAGS = $(AM_LDFLAGS) -static
 odp_ring_LDFLAGS = $(AM_LDFLAGS) -static
 odp_timer_ping_LDFLAGS = $(AM_LDFLAGS) -static
+odp_buffer_LDFLAGS = $(AM_LDFLAGS) -static
 
 dist_odp_atomic_SOURCES = odp_atomic_test.c odp_common.c
 dist_odp_shm_SOURCES = odp_shm_test.c odp_common.c
 dist_odp_ring_SOURCES = odp_ring_test.c odp_common.c
 dist_odp_timer_ping_SOURCES = odp_timer_ping.c odp_common.c
+dist_odp_buffer_SOURCES = odp_buffer.c
diff --git a/test/api_test/minunit.h b/test/api_test/minunit.h
new file mode 100644
index 0000000..d256ec1
--- /dev/null
+++ b/test/api_test/minunit.h
@@ -0,0 +1,4 @@
+/* file: minunit.h */
+#define mu_run_test(test) do { const char *message = test(); tests_run++; \
+if (message) return message; } while (0)
+extern int tests_run;
diff --git a/test/api_test/odp_buffer.c b/test/api_test/odp_buffer.c
new file mode 100644
index 0000000..57dcd3c
--- /dev/null
+++ b/test/api_test/odp_buffer.c
@@ -0,0 +1,365 @@
+#include <stdio.h>
+#include "minunit.h"
+#include "odp.h"
+
+
+int tests_run = 0;
+
+typedef struct {
+        int msg_id;
+        int seq;
+} test_message_t;
+
+#define DEFAULT_MSG_POOL_SIZE         (4*1024*1024)
+
+static const char* test_odp_buffer_addr(void) {
+    void* startaddress;
+    odp_buffer_pool_t msg_pool;
+    odp_buffer_t mybuffer;
+    void* pool_base;
+    printf("->%s:\n",__FUNCTION__);
+    odp_init_global();
+
+    pool_base = odp_shm_reserve("msg_pool",
+                                DEFAULT_MSG_POOL_SIZE, ODP_CACHE_LINE_SIZE);
+
+    msg_pool = odp_buffer_pool_create("msg_pool", pool_base, DEFAULT_MSG_POOL_SIZE,
+                                  sizeof(test_message_t),
+                                  ODP_CACHE_LINE_SIZE, ODP_BUFFER_TYPE_RAW);
+    mybuffer = odp_buffer_alloc(msg_pool);
+
+    startaddress  = odp_buffer_addr(mybuffer);
+
+    printf("<-\n");
+    printf("%s: Result:",__FUNCTION__);
+    if  (startaddress == NULL)
+    {
+        printf("fail\n");
+        printf("error, start address == NULL\n");
+    }
+    else
+        printf("pass\n");
+
+    return NULL;
+}
+
+static const char* test_odp_buffer_size(void) {
+    size_t size;
+    odp_buffer_pool_t msg_pool;
+    odp_buffer_t mybuffer;
+    void* pool_base;
+
+    printf("->%s:\n",__FUNCTION__);
+    odp_init_global();
+
+    pool_base = odp_shm_reserve("msg_pool",
+                                DEFAULT_MSG_POOL_SIZE, ODP_CACHE_LINE_SIZE);
+
+    msg_pool = odp_buffer_pool_create("msg_pool", pool_base, DEFAULT_MSG_POOL_SIZE,
+                                  sizeof(test_message_t),
+                                  ODP_CACHE_LINE_SIZE, ODP_BUFFER_TYPE_RAW);
+    mybuffer = odp_buffer_alloc(msg_pool);
+
+    size  = odp_buffer_size(mybuffer);
+
+    printf("<-\n");
+    printf("%s: Measurement: %lu Result:",__FUNCTION__, size);
+
+    if  (size != sizeof(test_message_t))
+    {
+        printf("fail\n");
+    }
+    else
+        printf("pass\n");
+
+    return NULL;
+}
+
+static const char* test_odp_buffer_type1 (void) {
+    int type;
+    int type_in = ODP_BUFFER_TYPE_ANY;
+    odp_buffer_pool_t msg_pool;
+    odp_buffer_t mybuffer;
+    void* pool_base;
+
+    printf("->%s:\n",__FUNCTION__);
+
+    odp_init_global();
+
+    pool_base = odp_shm_reserve("msg_pool",
+                                DEFAULT_MSG_POOL_SIZE, ODP_CACHE_LINE_SIZE);
+
+    msg_pool = odp_buffer_pool_create("msg_pool", pool_base, DEFAULT_MSG_POOL_SIZE,
+                                  sizeof(test_message_t),
+                                  ODP_CACHE_LINE_SIZE, type_in);
+    mybuffer = odp_buffer_alloc(msg_pool);
+
+    type  = odp_buffer_type(mybuffer);
+
+    printf ("buffer type: %d\n",type);
+
+    printf("<-\n");
+    printf("%s: Result:",__FUNCTION__);
+
+    if (type == type_in)
+            printf("pass\n");
+    else
+            printf("fail\n");
+
+    return NULL;
+}
+
+static const char* test_odp_buffer_type2 (void) {
+    int type;
+    int type_in = ODP_BUFFER_TYPE_RAW;
+    odp_buffer_pool_t msg_pool;
+    odp_buffer_t mybuffer;
+    void* pool_base;
+
+    printf("->%s:\n",__FUNCTION__);
+
+    odp_init_global();
+
+    pool_base = odp_shm_reserve("msg_pool",
+                                DEFAULT_MSG_POOL_SIZE, ODP_CACHE_LINE_SIZE);
+
+    msg_pool = odp_buffer_pool_create("msg_pool", pool_base, DEFAULT_MSG_POOL_SIZE,
+                                  sizeof(test_message_t),
+                                  ODP_CACHE_LINE_SIZE, type_in);
+    mybuffer = odp_buffer_alloc(msg_pool);
+
+    type  = odp_buffer_type(mybuffer);
+
+    printf ("buffer type: %d\n",type);
+
+    printf("<-\n");
+    printf("%s: Result:",__FUNCTION__);
+
+    if (type == type_in)
+            printf("pass\n");
+    else
+            printf("fail\n");
+
+    return NULL;
+}
+
+static const char* test_odp_buffer_type3 (void) {
+    int type;
+    int type_in = ODP_BUFFER_TYPE_PACKET;
+    odp_buffer_pool_t msg_pool;
+    odp_buffer_t mybuffer;
+    void* pool_base;
+
+    printf("->%s:\n",__FUNCTION__);
+
+    odp_init_global();
+
+    pool_base = odp_shm_reserve("msg_pool",
+                                DEFAULT_MSG_POOL_SIZE, ODP_CACHE_LINE_SIZE);
+
+    msg_pool = odp_buffer_pool_create("msg_pool", pool_base, DEFAULT_MSG_POOL_SIZE,
+                                  sizeof(test_message_t),
+                                  ODP_CACHE_LINE_SIZE, type_in);
+    mybuffer = odp_buffer_alloc(msg_pool);
+
+    type  = odp_buffer_type(mybuffer);
+
+    printf ("buffer type: %d\n",type);
+
+    printf("<-\n");
+    printf("%s: Result:",__FUNCTION__);
+
+    if (type == type_in)
+            printf("pass\n");
+    else
+            printf("fail\n");
+
+    return NULL;
+}
+
+static const char* test_odp_buffer_type4 (void) {
+    int type;
+    int type_in = ODP_BUFFER_TYPE_TIMEOUT;
+    odp_buffer_pool_t msg_pool;
+    odp_buffer_t mybuffer;
+    void* pool_base;
+
+    printf("->%s:\n",__FUNCTION__);
+
+    odp_init_global();
+
+    pool_base = odp_shm_reserve("msg_pool",
+                                DEFAULT_MSG_POOL_SIZE, ODP_CACHE_LINE_SIZE);
+
+    msg_pool = odp_buffer_pool_create("msg_pool", pool_base, DEFAULT_MSG_POOL_SIZE,
+                                  sizeof(test_message_t),
+                                  ODP_CACHE_LINE_SIZE, type_in);
+    mybuffer = odp_buffer_alloc(msg_pool);
+
+    type  = odp_buffer_type(mybuffer);
+
+    printf ("buffer type: %d\n",type);
+
+    printf("<-\n");
+    printf("%s: Result:",__FUNCTION__);
+
+    if (type == type_in)
+            printf("pass\n");
+    else
+            printf("fail\n");
+
+    return NULL;
+}
+
+
+static const char* test_odp_buffer_type5 (void) {
+    int type;
+    int type_in = ODP_BUFFER_TYPE_INVALID;
+    odp_buffer_pool_t msg_pool;
+    odp_buffer_t mybuffer;
+    void* pool_base;
+
+    printf("->%s:\n",__FUNCTION__);
+
+    odp_init_global();
+
+    pool_base = odp_shm_reserve("msg_pool",
+                                DEFAULT_MSG_POOL_SIZE, ODP_CACHE_LINE_SIZE);
+
+    msg_pool = odp_buffer_pool_create("msg_pool", pool_base, DEFAULT_MSG_POOL_SIZE,
+                                  sizeof(test_message_t),
+                                  ODP_CACHE_LINE_SIZE, type_in);
+    mybuffer = odp_buffer_alloc(msg_pool);
+
+    type  = odp_buffer_type(mybuffer);
+
+    printf ("buffer type: %d\n",type);
+
+    printf("<-\n");
+    printf("%s: Result:",__FUNCTION__);
+
+    if (type == type_in)
+            printf("pass\n");
+    else
+            printf("fail\n");
+
+    return NULL;
+}
+
+
+static const char* test_odp_is_scatter (void) {
+    int is_scatter;
+    odp_buffer_pool_t msg_pool;
+    odp_buffer_t mybuffer;
+    void* pool_base;
+    printf("->%s:\n",__FUNCTION__);
+    odp_init_global();
+
+    pool_base = odp_shm_reserve("msg_pool",
+                                DEFAULT_MSG_POOL_SIZE, ODP_CACHE_LINE_SIZE);
+
+    msg_pool = odp_buffer_pool_create("msg_pool", pool_base, DEFAULT_MSG_POOL_SIZE,
+                                  sizeof(test_message_t),
+                                  ODP_CACHE_LINE_SIZE, ODP_BUFFER_TYPE_RAW);
+    mybuffer = odp_buffer_alloc(msg_pool);
+
+    is_scatter  = odp_buffer_size(mybuffer);
+
+    printf("<-\n");
+    printf("%s: Result:",__FUNCTION__);
+
+    if ((is_scatter <0) || (is_scatter >1))
+    {
+            printf("fail \n");
+            printf("is_scatter: %d \n",is_scatter);
+    }
+    else
+            printf("pass\n");
+
+    return NULL;
+}
+
+static const char* test_odp_is_valid (void) {
+    int is_valid;
+    odp_buffer_pool_t msg_pool;
+    odp_buffer_t mybuffer;
+    void* pool_base;
+    printf("->%s:\n",__FUNCTION__);
+    odp_init_global();
+
+    pool_base = odp_shm_reserve("msg_pool",
+                                DEFAULT_MSG_POOL_SIZE, ODP_CACHE_LINE_SIZE);
+
+    msg_pool = odp_buffer_pool_create("msg_pool", pool_base, DEFAULT_MSG_POOL_SIZE,
+                                  sizeof(test_message_t),
+                                  ODP_CACHE_LINE_SIZE, ODP_BUFFER_TYPE_RAW);
+    mybuffer = odp_buffer_alloc(msg_pool);
+
+    is_valid = odp_buffer_is_valid(mybuffer);
+    if ((is_valid <0) || (is_valid >1))
+    {
+            printf("fail \n");
+            printf("is_valid: %d \n",is_valid);
+    }
+    else
+            printf("pass\n");
+
+    printf("<-\n");
+    printf("%s: Result:",__FUNCTION__);
+
+    printf("pass\n");
+
+    return NULL;
+}
+
+static const char* test_odp_buffer_print (void) {
+    odp_buffer_pool_t msg_pool;
+    odp_buffer_t mybuffer;
+    void* pool_base;
+    printf("->%s:\n",__FUNCTION__);
+    odp_init_global();
+
+    pool_base = odp_shm_reserve("msg_pool",
+                                DEFAULT_MSG_POOL_SIZE, ODP_CACHE_LINE_SIZE);
+
+    msg_pool = odp_buffer_pool_create("msg_pool", pool_base, DEFAULT_MSG_POOL_SIZE,
+                                  sizeof(test_message_t),
+                                  ODP_CACHE_LINE_SIZE, ODP_BUFFER_TYPE_RAW);
+    mybuffer = odp_buffer_alloc(msg_pool);
+
+    odp_buffer_print(mybuffer);
+
+    printf("<-\n");
+    printf("%s: Result:",__FUNCTION__);
+
+    printf("pass\n");
+
+    return NULL;
+}
+
+static const char * all_tests(void) {
+     mu_run_test(test_odp_buffer_addr);
+     mu_run_test(test_odp_buffer_size);
+     mu_run_test(test_odp_buffer_type1);
+     mu_run_test(test_odp_buffer_type2);
+     mu_run_test(test_odp_buffer_type3);
+     mu_run_test(test_odp_buffer_type4);
+     mu_run_test(test_odp_buffer_type5);
+     mu_run_test(test_odp_is_scatter);
+     mu_run_test(test_odp_is_valid);
+     mu_run_test(test_odp_buffer_print);
+     return NULL;
+ }
+
+int main(void) {
+     const char *result = all_tests();
+     if (result != 0) {
+         printf("%s\n", result);
+     }
+     else {
+         printf("ALL TESTS passED\n");
+     }
+     printf("Tests run: %d\n", tests_run);
+
+     return result != 0;
+ }
diff --git a/test/api_test/odp_buffer.sh b/test/api_test/odp_buffer.sh
new file mode 100755
index 0000000..5dc4537
--- /dev/null
+++ b/test/api_test/odp_buffer.sh
@@ -0,0 +1,12 @@
+#!/bin/bash
+EXECUTABLE=$(basename $0 .sh)
+RESULT_FILE=$1
+
+if [[ ! -x "$TEST_PATH$EXECUTABLE" ]]
+then
+    echo "$EXECUTABLE" Result:fail >> $RESULT_FILE
+fi
+
+FULL_CASE="$TEST_PATH$EXECUTABLE"
+echo "Calling $FULL_CASE from $0"
+$FULL_CASE >> $RESULT_FILE
