diff --git a/include/odp/api/message.h b/include/odp/api/message.h
new file mode 100644
index 0000000..76697fb
--- /dev/null
+++ b/include/odp/api/message.h
@@ -0,0 +1,199 @@
+/* Copyright (c) 2015, Linaro Limited
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier:     BSD-3-Clause
+ */
+
+
+/**
+ * @file
+ *
+ * ODP Message event type
+ */
+
+#ifndef ODP_API_MESSAGE_H_
+#define ODP_API_MESSAGE_H_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/** @defgroup odp_message ODP MESSAGE
+ *  @{
+ */
+
+/**
+ * @typedef odp_message_t
+ * ODP message handle
+ */
+
+
+/**
+ * Get address of sender (source) of message
+ *
+ * @param      msg  Message handle
+ * @param[out] addr Buffer to hold sender address
+ */
+void odp_message_sender(odp_message_t msg,
+			uint8_t addr[ODP_MSGIO_ADDR_SIZE]);
+
+/**
+ * Message data pointer
+ *
+ * Return a pointer to the message data
+ *
+ * @param msg Message handle
+ *
+ * @return Pointer to the message data
+ */
+void *odp_message_data(odp_message_t msg);
+
+/**
+ * Message data length
+ *
+ * Return length of the message data.
+ *
+ * @param msg Message handle
+ *
+ * @return Message length
+ */
+uint32_t odp_message_length(const odp_message_t msg);
+
+/**
+ * Set message length
+ *
+ * Set length of the message data.
+ * Increase message data length by moving message tail into message tailroom.
+ * The actual message data is not modified.
+ *
+ * @param msg Message handle
+ * @param len New length
+ *
+ * @retval 0 on success
+ * @retval <0 on error (e.g. no enough tailroom)
+ */
+int odp_message_length_set(const odp_message_t msg, uint32_t len);
+
+/**
+ * Message headroom length
+ *
+ * Return length of the message headroom
+ *
+ * @param msg Message handle
+ *
+ * @return Headroom length
+ */
+uint32_t odp_message_headroom(const odp_message_t msg);
+
+/**
+ * Push out message head
+ *
+ * Increase message data length by moving message head into message headroom.
+ * Message headroom is decreased with the same amount. The message head may be
+ * pushed out up to 'headroom' bytes. Message is not modified if there's not
+ * enough headroom space.
+ *
+ * odp_message_xxx:
+ * length   += len
+ * headroom -= len
+ * data     -= len
+ *
+ * @param msg  Message handle
+ * @param len  Number of bytes to push the head (0 ... headroom)
+ *
+ * @return The new data pointer
+ * @retval NULL  Requested offset exceeds available headroom
+ *
+ * @see odp_message_headroom(), odp_message_pull_head()
+ */
+void *odp_message_push_head(odp_message_t msg, uint32_t len);
+
+/**
+ * Pull in message head
+ *
+ * Decrease message data length by moving message head into message data.
+ * Message headroom is increased with the same amount. The message head may be
+ * pulled in up to 'length' bytes. Message is not modified if there's not
+ * enough data.
+ *
+ * odp_message_xxx:
+ * length   -= len
+ * headroom += len
+ * data     += len
+ *
+ * @param msg  Message handle
+ * @param len  Number of bytes to pull the head (0 ... length)
+ *
+ * @return The new data pointer
+ * @retval NULL  Requested offset exceeds available data
+ *
+ * @see odp_message_headroom(), odp_message_push_head()
+ */
+void *odp_message_pull_head(odp_message_t msg, uint32_t len);
+
+/**
+ * Allocate message
+ *
+ * Allocate a message of a specific length.
+ *
+ * @param pool Message pool to allocate message from
+ * @param len Length of the allocated message
+ *
+ * @return Message handle on success
+ * @retval ODP_MESSAGE_INVALID on failure and errno set
+ */
+odp_message_t odp_message_alloc(odp_pool_t pool, uint32_t len);
+
+/**
+ * Free message
+ *
+ * Free message back to the message pool it was allocated from.
+ *
+ * @param msg Handle of message to free
+ */
+void odp_message_free(odp_message_t msg);
+
+/**
+ * Get message handle from event
+ *
+ * Converts an ODP_EVENT_MESSAGE type event to a message.
+ *
+ * @param ev   Event handle representing a message.
+ *
+ * @return Message handle
+ *
+ * @see odp_event_type()
+ */
+odp_message_t odp_message_from_event(odp_event_t ev);
+
+/**
+ * Convert message handle to event
+ *
+ * @param msg  Message handle
+ *
+ * @return Event handle
+ */
+odp_event_t odp_message_to_event(odp_message_t msg);
+
+/**
+ * Get printable value for an odp_message_t
+ *
+ * @param msg  Message handle to be printed
+ * @return     uint64_t value that can be used to print/display this
+ *	       handle
+ *
+ * @note This routine is intended to be used for diagnostic purposes
+ * to enable applications to generate a printable value that represents
+ * an odp_message_t handle.
+ */
+uint64_t odp_message_to_u64(odp_message_t msg);
+
+/**
+ * @}
+ */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/include/odp/api/msgio.h b/include/odp/api/msgio.h
new file mode 100644
index 0000000..8d73021
--- /dev/null
+++ b/include/odp/api/msgio.h
@@ -0,0 +1,222 @@
+/* Copyright (c) 2015, Linaro Limited
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier:     BSD-3-Clause
+ */
+
+
+/**
+ * @file
+ *
+ * ODP Message I/O API
+ */
+
+#ifndef ODP_API_MSGIO_H_
+#define ODP_API_MSGIO_H_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/** @defgroup odp_msgio ODP MSGIO
+ *  @{
+ */
+
+/**
+ * @typedef odp_msgio_t
+ * ODP message I/O handle
+ */
+
+/**
+ * @def ODP_MSGIO_ADDR_SIZE
+ * Size of the address of a message I/O endpoint
+ */
+
+/**
+ * @typedef odp_msgio_prio_t
+ * ODP MSGIO message priority
+ */
+
+/**
+ * @def ODP_MSGIO_PRIO_HIGHEST
+ * Highest MSGIO message priority
+ */
+
+/**
+ * @def ODP_MSGIO_PRIO_NORMAL
+ * Normal MSGIO message priority
+ */
+
+/**
+ * @def ODP_MSGIO_PRIO_LOWEST
+ * Lowest MSGIO message priority
+ */
+
+/**
+ * @def ODP_MSGIO_PRIO_DEFAULT
+ * Default MSGIO message priority
+ */
+
+
+/**
+ * Create message I/O endpoint
+ *
+ * Create an message I/O endpoint. The scope of the message bus is
+ * not defined but it is expected that it by default encompasses the OS
+ * instance but no more.
+ *
+ * A unique address for the endpoint is created. The addresses for other
+ * endpoints can be obtained using the odp_msgio_lookup() call and specified
+ * in the odp_msgio_send() call.
+ *
+ * @param name Name of our endpoint
+ * @param pool Pool (of type ODP_EVENT_MESSAGE) for incoming messages
+ *
+ * @return Message I/O handle on success
+ * @retval ODP_MSGIO_INVALID on failure and errno set
+ */
+odp_msgio_t odp_msgio_create(const char *name,
+			     odp_pool_t pool);
+
+/**
+ * Set the input queue for a specific message priority
+ *
+ * @param msgio  Message I/O handle
+ * @param prio  Message priority
+ * @param queue Queue handle
+ *
+ * @retval  0 on success
+ * @retval <0 on failure
+ */
+int odp_msgio_inq_set(odp_msgio_t msgio,
+		      odp_msgio_prio_t prio,
+		      odp_queue_t queue);
+
+/**
+ * Activate message I/O endpoint
+ *
+ * Make this endpoint visible (odp_msgio_lookup() messages will be returned).
+ * Enable transmission and reception of messages through the endpoint.
+ *
+ * @param msgio Message I/O handle
+ *
+ * @retval 0 on success
+ * @retval <0 on failure
+ */
+int odp_msgio_activate(odp_msgio_t msgio);
+
+/**
+ * Destroy message I/O endpoint
+ *
+ * @param msgio Message I/O handle
+ *
+ * @retval 0 on success
+ * @retval <0 on failure
+ */
+int odp_msgio_destroy(odp_msgio_t msgio);
+
+/**
+ * Remove the input queue for a specific message priority
+ *
+ * Remove (disassociate) the matching input queue from a message I/O endpoint.
+ * The queue itself is not touched.
+ *
+ * @param msgio  Message I/O handle
+ * @param prio  Message priority
+ *
+ * @retval 0 on success
+ * @retval <0 on failure
+ */
+int odp_msgio_inq_rem(odp_msgio_t msgio,
+		      odp_msgio_prio_t prio);
+
+/**
+ * Lookup endpoint by name
+ *
+ * Look up a current or future endpoint by name.
+ * When the endpoint exists, return the specified message (not necessarily the
+ * same message handle) with the endpoint as the sender.
+ *
+ * @param msgio Message I/O handle
+ * @param name Name to look up
+ * @param msg Message to return
+ */
+void odp_msgio_lookup(odp_msgio_t msgio,
+		      const char *name,
+		      odp_message_t msg);
+
+/**
+ * Monitor endpoint
+ *
+ * Monitor an endpoint (which may already have disappeared).
+ * When the endpoint disappears, return the specified message (not necessarily
+ * the same message handle) with the endpoint as the sender.
+ *
+ * Unrecognized or invalid endpoint addresses are treated as non-existing
+ * endpoints.
+ *
+ * @param     msgio Message I/O handle
+ * @param[in] addr  Address of monitored endpoint
+ * @param     msg   Message to return
+ */
+void odp_msgio_monitor(odp_msgio_t msgio,
+		       const uint8_t addr[ODP_MSGIO_ADDR_SIZE],
+		       odp_message_t msg);
+
+/**
+ * Send message
+ *
+ * Send a message to an endpoint (which may no longer exist).
+ *
+ * Message delivery into the recipient address space is ordered (per priority)
+ * and reliable. Delivery of message N implies delivery of all messages <N
+ * (of the same priority).
+ * All messages (accepted by MSGIO) will be delivered up to the point of
+ * recipient endpoint termination or lost connection where no more messages
+ * will be delivered.
+ *
+ * Actual reception (dequeueing) and processing by the recipient is not
+ * guaranteed (use user level acknowledgements for that).
+ *
+ * Monitor the remote endpoint to detect the disappearance or disconnection
+ * of the endpoint.
+ *
+ * A message may temporarily not be accepted for transmission (e.g. due
+ * to out of local buffer space), -1 will be returned and ODP errno set
+ * to EAGAIN.
+ *
+ * @param     msgio Message I/O handle
+ * @param     msg   Message to send
+ * @param     prio  Priority of message
+ * @param[in] addr  Address of recipient endpoint
+ *
+ * @retval 0 on success
+ * @retval <0 on error
+ */
+int odp_msgio_send(odp_msgio_t msgio,
+		   odp_message_t msg,
+		   odp_msgio_prio_t prio,
+		   const uint8_t addr[ODP_MSGIO_ADDR_SIZE]);
+
+/**
+ * Get printable value for an odp_msgio_t
+ *
+ * @param msgio  Message I/O handle to be printed
+ * @return       uint64_t value that can be used to print/display this
+ *		 handle
+ *
+ * @note This routine is intended to be used for diagnostic purposes
+ * to enable applications to generate a printable value that represents
+ * an odp_msgio_t handle.
+ */
+uint64_t odp_msgio_to_u64(odp_msgio_t msgio);
+
+/**
+ * @}
+ */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/platform/linux-generic/include/odp/message.h b/platform/linux-generic/include/odp/message.h
new file mode 100644
index 0000000..2a29f59
--- /dev/null
+++ b/platform/linux-generic/include/odp/message.h
@@ -0,0 +1,39 @@
+/* Copyright (c) 2013, Linaro Limited
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier:     BSD-3-Clause
+ */
+
+/**
+ * @file
+ *
+ * ODP Message Bus
+ */
+
+#ifndef ODP_PLAT_MESSAGE_H_
+#define ODP_PLAT_MESSAGE_H_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <odp/std_types.h>
+#include <odp/plat/pool_types.h>
+#include <odp/plat/message_types.h>
+#include <odp/plat/queue_types.h>
+
+/** @ingroup odp_message
+ *  @{
+ */
+
+/**
+ * @}
+ */
+
+#include <odp/api/message.h>
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/platform/linux-generic/include/odp/msgio.h b/platform/linux-generic/include/odp/msgio.h
new file mode 100644
index 0000000..f45b3a2
--- /dev/null
+++ b/platform/linux-generic/include/odp/msgio.h
@@ -0,0 +1,40 @@
+/* Copyright (c) 2013, Linaro Limited
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier:     BSD-3-Clause
+ */
+
+/**
+ * @file
+ *
+ * ODP Message Bus
+ */
+
+#ifndef ODP_PLAT_MSGIO_H_
+#define ODP_PLAT_MSGIO_H_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <odp/std_types.h>
+#include <odp/plat/pool_types.h>
+#include <odp/plat/msgio_types.h>
+#include <odp/plat/message_types.h>
+#include <odp/plat/queue_types.h>
+
+/** @ingroup odp_msgio
+ *  @{
+ */
+
+/**
+ * @}
+ */
+
+#include <odp/api/msgio.h>
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/platform/linux-generic/include/odp/plat/message_types.h b/platform/linux-generic/include/odp/plat/message_types.h
new file mode 100644
index 0000000..3a42064
--- /dev/null
+++ b/platform/linux-generic/include/odp/plat/message_types.h
@@ -0,0 +1,47 @@
+/* Copyright (c) 2015, Linaro Limited
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+
+/**
+ * @file
+ *
+ * ODP Message message type
+ */
+
+#ifndef ODP_MESSAGE_TYPES_H_
+#define ODP_MESSAGE_TYPES_H_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <odp/std_types.h>
+#include <odp/plat/strong_types.h>
+
+/** @addtogroup odp_message ODP message
+ *  Operations on a message.
+ *  @{
+ */
+
+typedef ODP_HANDLE_T(odp_message_t);
+
+#define ODP_MESSAGE_INVALID _odp_cast_scalar(odp_message_t, 0xffffffff)
+
+/** Get printable format of odp_message_t */
+static inline uint64_t odp_message_to_u64(odp_message_t hdl)
+{
+	return _odp_pri(hdl);
+}
+
+/**
+ * @}
+ */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/platform/linux-generic/include/odp/plat/msgio_types.h b/platform/linux-generic/include/odp/plat/msgio_types.h
new file mode 100644
index 0000000..9d9f9da
--- /dev/null
+++ b/platform/linux-generic/include/odp/plat/msgio_types.h
@@ -0,0 +1,59 @@
+/* Copyright (c) 2015, Linaro Limited
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+
+/**
+ * @file
+ *
+ * ODP Message bus types
+ */
+
+#ifndef ODP_MSGIO_TYPES_H_
+#define ODP_MSGIO_TYPES_H_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <odp/std_types.h>
+#include <odp/plat/strong_types.h>
+
+/** @addtogroup odp_msgio ODP message bus
+ *  Operations on a message bus.
+ *  @{
+ */
+
+typedef int odp_msgio_prio_t;
+
+#define ODP_MSGIO_PRIO_HIGHEST  0
+
+#define ODP_MSGIO_PRIO_NORMAL   2
+
+#define ODP_MSGIO_PRIO_LOWEST   3
+
+#define ODP_MSGIO_PRIO_DEFAULT  ODP_MSGIO_PRIO_NORMAL
+
+typedef ODP_HANDLE_T(odp_msgio_t);
+
+#define ODP_MSGIO_INVALID _odp_cast_scalar(odp_msgio_t, 0xffffffff)
+
+#define ODP_MSGIO_ADDR_SIZE 6
+
+/** Get printable format of odp_msgio_t */
+static inline uint64_t odp_msgio_to_u64(odp_msgio_t hdl)
+{
+	return _odp_pri(hdl);
+}
+
+/**
+ * @}
+ */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
