Index: src/client/c/hu/varadiistvan/xplra/MultiBuffer.h
===================================================================
--- src/client/c/hu/varadiistvan/xplra/MultiBuffer.h	(revision 26)
+++ src/client/c/hu/varadiistvan/xplra/MultiBuffer.h	(revision 29)
@@ -163,7 +163,12 @@
 public:
     /**
+     * Get the X-Plane object this buffer belongs to.
+     */
+    XPlane& getXPlane() const throw();
+
+    /**
      * Add an integer dataref.
      *
-     * @return the ID if the dataref, that can be used later to set or
+     * @return the ID of the dataref, that can be used later to set or
      * get the value.
      */
@@ -173,5 +178,5 @@
      * Add a float dataref.
      *
-     * @return the ID if the dataref, that can be used later to set or
+     * @return the ID of the dataref, that can be used later to set or
      * get the value.
      */
@@ -181,5 +186,5 @@
      * Add a double dataref.
      *
-     * @return the ID if the dataref, that can be used later to set or
+     * @return the ID of the dataref, that can be used later to set or
      * get the value.
      */
@@ -189,5 +194,5 @@
      * Add a float array dataref.
      *
-     * @return the ID if the dataref, that can be used later to set or
+     * @return the ID of the dataref, that can be used later to set or
      * get the value.
      */
@@ -198,5 +203,5 @@
      * Add an integer array dataref.
      *
-     * @return the ID if the dataref, that can be used later to set or
+     * @return the ID of the dataref, that can be used later to set or
      * get the value.
      */
@@ -207,5 +212,5 @@
      * Add a byte array dataref.
      *
-     * @return the ID if the dataref, that can be used later to set or
+     * @return the ID of the dataref, that can be used later to set or
      * get the value.
      */
@@ -535,4 +540,13 @@
     friend class XPlane;
 };
+
+//------------------------------------------------------------------------------
+// Inline definitions
+//------------------------------------------------------------------------------
+
+inline XPlane& MultiBuffer::getXPlane() const throw()
+{
+    return xplane;
+}
 
 //------------------------------------------------------------------------------
Index: src/client/c/hu/varadiistvan/xplra/xplra.cc
===================================================================
--- src/client/c/hu/varadiistvan/xplra/xplra.cc	(revision 28)
+++ src/client/c/hu/varadiistvan/xplra/xplra.cc	(revision 29)
@@ -244,4 +244,11 @@
     typedef std::set<int> multiBufferIDs_t;
 
+public:
+    /**
+     * Get the connection for the given multi-dataref buffer.
+     */
+    static Connection& get(const MultiBuffer& buffer) throw();
+
+private:
     /**
      * The last error code.
@@ -319,4 +326,11 @@
     bool destroyMultiBuffer(int bufferID) throw(Exception);
 };
+
+//------------------------------------------------------------------------------
+
+inline Connection& Connection::get(const MultiBuffer& buffer) throw()
+{
+    return static_cast<Connection&>(buffer.getXPlane());
+}
 
 //------------------------------------------------------------------------------
@@ -737,5 +751,5 @@
 //------------------------------------------------------------------------------
 
-extern "C" int xplra_create_multi_getter(int connectionID)
+extern "C" int xplra_multi_create_getter(int connectionID)
 {
     Connection* connection = ConnectionSlot::getValue(connectionID);
@@ -745,5 +759,5 @@
 //------------------------------------------------------------------------------
 
-extern "C" int xplra_create_multi_setter(int connectionID)
+extern "C" int xplra_multi_create_setter(int connectionID)
 {
     Connection* connection = ConnectionSlot::getValue(connectionID);
@@ -753,5 +767,481 @@
 //------------------------------------------------------------------------------
 
-extern "C" int xplra_destroy_multi_buffer(int connectionID, int bufferID)
+extern "C" size_t xplra_multi_add_int(int bufferID, const char* name)
+{
+    MultiBuffer* buffer = MultiBufferSlot::getValue(bufferID);
+    return (buffer==0) ? INVALID_DATAREF_ID : buffer->addInt(name);
+}
+
+//------------------------------------------------------------------------------
+
+extern "C" size_t xplra_multi_add_float(int bufferID, const char* name)
+{
+    MultiBuffer* buffer = MultiBufferSlot::getValue(bufferID);
+    return (buffer==0) ? INVALID_DATAREF_ID : buffer->addFloat(name);
+}
+
+//------------------------------------------------------------------------------
+
+extern "C" size_t xplra_multi_add_double(int bufferID, const char* name)
+{
+    MultiBuffer* buffer = MultiBufferSlot::getValue(bufferID);
+    return (buffer==0) ? INVALID_DATAREF_ID : buffer->addDouble(name);
+}
+
+/*----------------------------------------------------------------------------*/
+
+extern "C" size_t xplra_multi_add_float_array(int bufferID, const char* name,
+                                              size_t length, size_t offset)
+{
+    MultiBuffer* buffer = MultiBufferSlot::getValue(bufferID);
+    return (buffer==0) ?
+        INVALID_DATAREF_ID : buffer->addFloatArray(name, length, offset);
+}
+
+/*----------------------------------------------------------------------------*/
+
+extern "C" size_t xplra_multi_add_int_array(int bufferID, const char* name,
+                                            size_t length, size_t offset)
+{
+    MultiBuffer* buffer = MultiBufferSlot::getValue(bufferID);
+    return (buffer==0) ?
+        INVALID_DATAREF_ID : buffer->addIntArray(name, length, offset);
+}
+
+/*----------------------------------------------------------------------------*/
+
+extern "C" size_t xplra_multi_add_byte_array(int bufferID, const char* name,
+                                             size_t length, size_t offset)
+{
+    MultiBuffer* buffer = MultiBufferSlot::getValue(bufferID);
+    return (buffer==0) ?
+        INVALID_DATAREF_ID : buffer->addByteArray(name, length, offset);
+}
+
+/*----------------------------------------------------------------------------*/
+
+extern "C" int xplra_multi_finalize(int bufferID)
+{
+    MultiBuffer* buffer = MultiBufferSlot::getValue(bufferID);
+    return (buffer==0) ? -1 : (buffer->finalize() ? 1 : 0);
+}
+
+/*----------------------------------------------------------------------------*/
+
+extern "C" int xplra_multi_register(int bufferID)
+{
+    MultiBuffer* buffer = MultiBufferSlot::getValue(bufferID);
+    if (buffer==0) return -1;
+    try {
+        buffer->registerInXPlane();
+        return 0;
+    } catch (...) {
+        Connection::get(*buffer).handleException();
+        return -1;
+    }
+}
+
+/*----------------------------------------------------------------------------*/
+
+extern "C" int xplra_multi_unregister(int bufferID)
+{
+    MultiBuffer* buffer = MultiBufferSlot::getValue(bufferID);
+    if (buffer==0) return -1;
+    try {
+        buffer->unregisterFromXPlane();
+        return 0;
+    } catch (...) {
+        Connection::get(*buffer).handleException();
+        return -1;
+    }
+}
+
+/*----------------------------------------------------------------------------*/
+
+extern "C" int xplra_multi_execute(int bufferID)
+{
+    MultiBuffer* buffer = MultiBufferSlot::getValue(bufferID);
+    if (buffer==0) return -1;
+    try {
+        buffer->execute();
+        return 0;
+    } catch (...) {
+        Connection::get(*buffer).handleException();
+        return -1;
+    }
+}
+
+//------------------------------------------------------------------------------
+
+extern "C" int xplra_multi_set_int(int bufferID, size_t datarefID, int value)
+{
+    MultiBuffer* buffer = MultiBufferSlot::getValue(bufferID);
+    if (buffer==0) return -1;
+    try {
+        buffer->setInt(datarefID, value);
+        return 0;
+    } catch (...) {
+        Connection::get(*buffer).handleException();
+        return -1;
+    }
+}
+
+/*----------------------------------------------------------------------------*/
+
+extern "C" int xplra_multi_get_int(int* dest, int bufferID, size_t datarefID)
+{
+    MultiBuffer* buffer = MultiBufferSlot::getValue(bufferID);
+    if (buffer==0) return -1;
+    try {
+        *dest = buffer->getInt(datarefID);
+        return 0;
+    } catch (...) {
+        Connection::get(*buffer).handleException();
+        return -1;
+    }
+}
+
+/*----------------------------------------------------------------------------*/
+
+extern "C"
+const int32_t* xplra_multi_get_int_const_ptr(int bufferID, size_t datarefID)
+{
+    MultiBuffer* buffer = MultiBufferSlot::getValue(bufferID);
+    if (buffer==0) return 0;
+    try {
+        return &(buffer->getIntRef(datarefID));
+    } catch (...) {
+        Connection::get(*buffer).handleException();
+        return 0;
+    }
+}
+
+/*----------------------------------------------------------------------------*/
+
+extern "C"
+int32_t* xplra_multi_get_int_ptr(int bufferID, size_t datarefID)
+{
+    MultiBuffer* buffer = MultiBufferSlot::getValue(bufferID);
+    if (buffer==0) return 0;
+    try {
+        return &(buffer->getIntRef(datarefID));
+    } catch (...) {
+        Connection::get(*buffer).handleException();
+        return 0;
+    }
+}
+
+//------------------------------------------------------------------------------
+
+extern "C"
+int xplra_multi_set_float(int bufferID, size_t datarefID, float value)
+{
+    MultiBuffer* buffer = MultiBufferSlot::getValue(bufferID);
+    if (buffer==0) return -1;
+    try {
+        buffer->setFloat(datarefID, value);
+        return 0;
+    } catch (...) {
+        Connection::get(*buffer).handleException();
+        return -1;
+    }
+}
+
+/*----------------------------------------------------------------------------*/
+
+extern "C"
+int xplra_multi_get_float(float* dest, int bufferID, size_t datarefID)
+{
+    MultiBuffer* buffer = MultiBufferSlot::getValue(bufferID);
+    if (buffer==0) return -1;
+    try {
+        *dest = buffer->getFloat(datarefID);
+        return 0;
+    } catch (...) {
+        Connection::get(*buffer).handleException();
+        return -1;
+    }
+}
+
+/*----------------------------------------------------------------------------*/
+
+extern "C"
+const float* xplra_multi_get_float_const_ptr(int bufferID, size_t datarefID)
+{
+    MultiBuffer* buffer = MultiBufferSlot::getValue(bufferID);
+    if (buffer==0) return 0;
+    try {
+        return &(buffer->getFloatRef(datarefID));
+    } catch (...) {
+        Connection::get(*buffer).handleException();
+        return 0;
+    }
+}
+
+/*----------------------------------------------------------------------------*/
+
+extern "C"
+float* xplra_multi_get_float_ptr(int bufferID, size_t datarefID)
+{
+    MultiBuffer* buffer = MultiBufferSlot::getValue(bufferID);
+    if (buffer==0) return 0;
+    try {
+        return &(buffer->getFloatRef(datarefID));
+    } catch (...) {
+        Connection::get(*buffer).handleException();
+        return 0;
+    }
+}
+
+//------------------------------------------------------------------------------
+
+extern "C"
+int xplra_multi_set_double(int bufferID, size_t datarefID, double value)
+{
+    MultiBuffer* buffer = MultiBufferSlot::getValue(bufferID);
+    if (buffer==0) return -1;
+    try {
+        buffer->setDouble(datarefID, value);
+        return 0;
+    } catch (...) {
+        Connection::get(*buffer).handleException();
+        return -1;
+    }
+}
+
+/*----------------------------------------------------------------------------*/
+
+extern "C"
+int xplra_multi_get_double(double* dest, int bufferID, size_t datarefID)
+{
+    MultiBuffer* buffer = MultiBufferSlot::getValue(bufferID);
+    if (buffer==0) return -1;
+    try {
+        *dest = buffer->getDouble(datarefID);
+        return 0;
+    } catch (...) {
+        Connection::get(*buffer).handleException();
+        return -1;
+    }
+}
+
+/*----------------------------------------------------------------------------*/
+
+extern "C"
+const double* xplra_multi_get_double_const_ptr(int bufferID, size_t datarefID)
+{
+    MultiBuffer* buffer = MultiBufferSlot::getValue(bufferID);
+    if (buffer==0) return 0;
+    try {
+        return &(buffer->getDoubleRef(datarefID));
+    } catch (...) {
+        Connection::get(*buffer).handleException();
+        return 0;
+    }
+}
+
+/*----------------------------------------------------------------------------*/
+
+extern "C"
+double* xplra_multi_get_double_ptr(int bufferID, size_t datarefID)
+{
+    MultiBuffer* buffer = MultiBufferSlot::getValue(bufferID);
+    if (buffer==0) return 0;
+    try {
+        return &(buffer->getDoubleRef(datarefID));
+    } catch (...) {
+        Connection::get(*buffer).handleException();
+        return 0;
+    }
+}
+
+//------------------------------------------------------------------------------
+
+extern "C"
+ssize_t xplra_multi_set_float_array(int bufferID, size_t datarefID,
+                                    const float* value, size_t length,
+                                    size_t offset)
+{
+    MultiBuffer* buffer = MultiBufferSlot::getValue(bufferID);
+    if (buffer==0) return -1;
+    try {
+        return buffer->setFloatArray(datarefID, value, length, offset);
+    } catch (...) {
+        Connection::get(*buffer).handleException();
+        return -1;
+    }
+}
+
+/*----------------------------------------------------------------------------*/
+
+extern "C"
+ssize_t xplra_multi_get_float_array(float* value,
+                                    size_t length, size_t offset,
+                                    int bufferID, size_t datarefID)
+{
+    MultiBuffer* buffer = MultiBufferSlot::getValue(bufferID);
+    if (buffer==0) return -1;
+    try {
+        return buffer->getFloatArray(datarefID, value, length, offset);
+    } catch (...) {
+        Connection::get(*buffer).handleException();
+        return -1;
+    }
+}
+
+/*----------------------------------------------------------------------------*/
+
+extern "C"
+const float* xplra_multi_get_float_array_ptr(int bufferID, size_t datarefID,
+                                             size_t offset)
+{
+    MultiBuffer* buffer = MultiBufferSlot::getValue(bufferID);
+    if (buffer==0) return 0;
+    try {
+        return buffer->getFloatArray(datarefID, offset);
+    } catch (...) {
+        Connection::get(*buffer).handleException();
+        return 0;
+    }
+}
+
+//------------------------------------------------------------------------------
+
+extern "C"
+ssize_t xplra_multi_set_int_array(int bufferID, size_t datarefID,
+                                  const int32_t* value, size_t length,
+                                  size_t offset)
+{
+    MultiBuffer* buffer = MultiBufferSlot::getValue(bufferID);
+    if (buffer==0) return -1;
+    try {
+        return buffer->setIntArray(datarefID, value, length, offset);
+    } catch (...) {
+        Connection::get(*buffer).handleException();
+        return -1;
+    }
+}
+
+/*----------------------------------------------------------------------------*/
+
+extern "C"
+ssize_t xplra_multi_get_int_array(int32_t* value,
+                                  size_t length, size_t offset,
+                                  int bufferID, size_t datarefID)
+{
+    MultiBuffer* buffer = MultiBufferSlot::getValue(bufferID);
+    if (buffer==0) return -1;
+    try {
+        return buffer->getIntArray(datarefID, value, length, offset);
+    } catch (...) {
+        Connection::get(*buffer).handleException();
+        return -1;
+    }
+}
+
+/*----------------------------------------------------------------------------*/
+
+extern "C"
+const int32_t* xplra_multi_get_int_array_ptr(int bufferID, size_t datarefID,
+                                             size_t offset)
+{
+    MultiBuffer* buffer = MultiBufferSlot::getValue(bufferID);
+    if (buffer==0) return 0;
+    try {
+        return buffer->getIntArray(datarefID, offset);
+    } catch (...) {
+        Connection::get(*buffer).handleException();
+        return 0;
+    }
+}
+
+//------------------------------------------------------------------------------
+
+extern "C"
+ssize_t xplra_multi_set_byte_array(int bufferID, size_t datarefID,
+                                   const void* value, size_t length,
+                                   size_t offset)
+{
+    MultiBuffer* buffer = MultiBufferSlot::getValue(bufferID);
+    if (buffer==0) return -1;
+    try {
+        return buffer->setByteArray(datarefID,
+                                    reinterpret_cast<const uint8_t*>(value),
+                                    length, offset);
+    } catch (...) {
+        Connection::get(*buffer).handleException();
+        return -1;
+    }
+}
+
+/*----------------------------------------------------------------------------*/
+
+extern "C"
+ssize_t xplra_multi_get_byte_array(void* value,
+                                   size_t length, size_t offset,
+                                   int bufferID, size_t datarefID)
+{
+    MultiBuffer* buffer = MultiBufferSlot::getValue(bufferID);
+    if (buffer==0) return -1;
+    try {
+        return buffer->getByteArray(datarefID,
+                                    reinterpret_cast<uint8_t*>(value),
+                                    length, offset);
+    } catch (...) {
+        Connection::get(*buffer).handleException();
+        return -1;
+    }
+}
+
+/*----------------------------------------------------------------------------*/
+
+extern "C"
+const uint8_t* xplra_multi_get_byte_array_ptr(int bufferID, size_t datarefID,
+                                              size_t offset)
+{
+    MultiBuffer* buffer = MultiBufferSlot::getValue(bufferID);
+    if (buffer==0) return 0;
+    try {
+        return buffer->getByteArray(datarefID, offset);
+    } catch (...) {
+        Connection::get(*buffer).handleException();
+        return 0;
+    }
+}
+
+//------------------------------------------------------------------------------
+
+extern "C" ssize_t xplra_multi_set_string(int bufferID, size_t datarefID,
+                                          const char* value, size_t offset)
+{
+    MultiBuffer* buffer = MultiBufferSlot::getValue(bufferID);
+    if (buffer==0) return -1;
+    try {
+        return buffer->setString(datarefID, value, offset);
+    } catch (...) {
+        Connection::get(*buffer).handleException();
+        return -1;
+    }
+}
+
+/*----------------------------------------------------------------------------*/
+
+extern "C"
+const char* xplra_multi_get_string_ptr(int bufferID, size_t datarefID,
+                                       size_t offset)
+{
+    MultiBuffer* buffer = MultiBufferSlot::getValue(bufferID);
+    if (buffer==0) return 0;
+    try {
+        return buffer->getStringPtr(datarefID, offset);
+    } catch (...) {
+        Connection::get(*buffer).handleException();
+        return 0;
+    }
+}
+
+//------------------------------------------------------------------------------
+
+extern "C" int xplra_multi_destroy_buffer(int connectionID, int bufferID)
 {
     Connection* connection = ConnectionSlot::getValue(connectionID);
Index: src/client/c/hu/varadiistvan/xplra/xplra.h
===================================================================
--- src/client/c/hu/varadiistvan/xplra/xplra.h	(revision 28)
+++ src/client/c/hu/varadiistvan/xplra/xplra.h	(revision 29)
@@ -96,4 +96,8 @@
 /*----------------------------------------------------------------------------*/
 
+#define INVALID_DATAREF_ID ((size_t)-1)
+
+/*----------------------------------------------------------------------------*/
+
 /**
  * Get the last error code with the subcode.
@@ -325,5 +329,5 @@
  * @return the ID of the new getter, or -1 on error
  */
-int xplra_create_multi_getter(int connectionID);
+int xplra_multi_create_getter(int connectionID);
 
 /*----------------------------------------------------------------------------*/
@@ -334,5 +338,373 @@
  * @return the ID of the new setter, or -1 on error
  */
-int xplra_create_multi_setter(int connectionID);
+int xplra_multi_create_setter(int connectionID);
+
+/*----------------------------------------------------------------------------*/
+
+/**
+ * Add an integer dataref to a multi-dataref buffer.
+ *
+ * @return the ID of the dataref that can be used later. If the buffer
+ * ID is invalid, INVALID_DATAREF_ID is returned.
+ */
+size_t xplra_multi_add_int(int bufferID, const char* name);
+
+/*----------------------------------------------------------------------------*/
+
+/**
+ * Add a float dataref to a multi-dataref buffer.
+ *
+ * @return the ID of the dataref that can be used later. If the buffer
+ * ID is invalid, INVALID_DATAREF_ID is returned.
+ */
+size_t xplra_multi_add_float(int bufferID, const char* name);
+
+/*----------------------------------------------------------------------------*/
+
+/**
+ * Add a double dataref to a multi-dataref buffer.
+ *
+ * @return the ID of the dataref that can be used later. If the buffer
+ * ID is invalid, INVALID_DATAREF_ID is returned.
+ */
+size_t xplra_multi_add_double(int bufferID, const char* name);
+
+/*----------------------------------------------------------------------------*/
+
+/**
+ * Add a float array dataref to a multi-dataref buffer.
+ *
+ * @return the ID of the dataref that can be used later. If the buffer
+ * ID is invalid, INVALID_DATAREF_ID is returned.
+ */
+size_t xplra_multi_add_float_array(int bufferID, const char* name,
+                                   size_t length, size_t offset);
+
+/*----------------------------------------------------------------------------*/
+
+/**
+ * Add an integer array dataref to a multi-dataref buffer.
+ *
+ * @return the ID of the dataref that can be used later. If the buffer
+ * ID is invalid, INVALID_DATAREF_ID is returned.
+ */
+size_t xplra_multi_add_int_array(int bufferID, const char* name,
+                                 size_t length, size_t offset);
+
+/*----------------------------------------------------------------------------*/
+
+/**
+ * Add a byte array dataref to a multi-dataref buffer.
+ *
+ * @return the ID of the dataref that can be used later. If the buffer
+ * ID is invalid, INVALID_DATAREF_ID is returned.
+ */
+size_t xplra_multi_add_byte_array(int bufferID, const char* name,
+                                  size_t length, size_t offset);
+
+/*----------------------------------------------------------------------------*/
+
+/**
+ * Finalize the given buffer, if not finalized yet.
+ *
+ * @return -1 on error (if the buffer ID is invalid), 0 if there is no
+ * data in the buffer, 1 if there is data in it.
+ */
+int xplra_multi_finalize(int bufferID);
+
+/*----------------------------------------------------------------------------*/
+
+/**
+ * Register the buffer with the given ID in X-Plane. If needed, it
+ * will be finalized too.
+ *
+ * @return 0 on success, -1 on error
+ */
+int xplra_multi_register(int bufferID);
+
+/*----------------------------------------------------------------------------*/
+
+/**
+ * Unregister the buffer with the given ID from X-Plane. If needed, it
+ * will be finalized too.
+ *
+ * @return 0 on success, -1 on error
+ */
+int xplra_multi_unregister(int bufferID);
+
+/*----------------------------------------------------------------------------*/
+
+/**
+ * Execute the buffer with the given ID. If the buffer is not
+ * finalized, it will be finalized. If it is not finalized, but
+ * registered, the registration will be cleared, and it will be
+ * re-registered after finalizing.
+ *
+ * @return 0 on success, -1 on error
+ */
+int xplra_multi_execute(int bufferID);
+
+/*----------------------------------------------------------------------------*/
+
+/**
+ * Set the value of an integer dataref with the given ID.
+ *
+ * @return 0 on success, -1 on error.
+ */
+int xplra_multi_set_int(int bufferID, size_t datarefID, int value);
+
+/*----------------------------------------------------------------------------*/
+
+/**
+ * Get the value of an integer dataref with the given ID.
+ *
+ * @param dest pointer to the variable that will receive the value
+ *
+ * @return 0 on success, -1 on error.
+ */
+int xplra_multi_get_int(int* dest, int bufferID, size_t datarefID);
+
+/*----------------------------------------------------------------------------*/
+
+/**
+ * Get a const pointer to the integer dataref with the given ID
+ *
+ * @return the pointer or success, 0 on error.
+ */
+const int32_t* xplra_multi_get_int_const_ptr(int bufferID, size_t datarefID);
+
+/*----------------------------------------------------------------------------*/
+
+/**
+ * Get a pointer to the integer dataref with the given ID
+ *
+ * @return the pointer or success, 0 on error.
+ */
+int32_t* xplra_multi_get_int_ptr(int bufferID, size_t datarefID);
+
+/*----------------------------------------------------------------------------*/
+
+/**
+ * Set the value of a float dataref with the given ID.
+ *
+ * @return 0 on success, -1 on error.
+ */
+int xplra_multi_set_float(int bufferID, size_t datarefID, float value);
+
+/*----------------------------------------------------------------------------*/
+
+/**
+ * Get the value of a float dataref with the given ID.
+ *
+ * @param dest pointer to the variable that will receive the value
+ *
+ * @return 0 on success, -1 on error.
+ */
+int xplra_multi_get_float(float* dest, int bufferID, size_t datarefID);
+
+/*----------------------------------------------------------------------------*/
+
+/**
+ * Get a const pointer to the float dataref with the given ID
+ *
+ * @return the pointer or success, 0 on error.
+ */
+const float* xplra_multi_get_float_const_ptr(int bufferID, size_t datarefID);
+
+/*----------------------------------------------------------------------------*/
+
+/**
+ * Get a pointer to the float dataref with the given ID
+ *
+ * @return the pointer or success, 0 on error.
+ */
+float* xplra_multi_get_float_ptr(int bufferID, size_t datarefID);
+
+/*----------------------------------------------------------------------------*/
+
+/**
+ * Set the value of a double dataref with the given ID.
+ *
+ * @return 0 on success, -1 on error.
+ */
+int xplra_multi_set_double(int bufferID, size_t datarefID, double value);
+
+/*----------------------------------------------------------------------------*/
+
+/**
+ * Get the value of a double dataref with the given ID.
+ *
+ * @param dest pointer to the variable that will receive the value
+ *
+ * @return 0 on success, -1 on error.
+ */
+int xplra_multi_get_double(double* dest, int bufferID, size_t datarefID);
+
+/*----------------------------------------------------------------------------*/
+
+/**
+ * Get a const pointer to the double dataref with the given ID
+ *
+ * @return the pointer or success, 0 on error.
+ */
+const double* xplra_multi_get_double_const_ptr(int bufferID, size_t datarefID);
+
+/*----------------------------------------------------------------------------*/
+
+/**
+ * Get a pointer to the double dataref with the given ID
+ *
+ * @return the pointer or success, 0 on error.
+ */
+double* xplra_multi_get_double_ptr(int bufferID, size_t datarefID);
+
+/*----------------------------------------------------------------------------*/
+
+/**
+ * Set the contents of the float array dataref with the given ID.
+ *
+ * @param length the amount of data. If 0, it is assumed to be the
+ * length of the data in the buffer minus the offset.
+ * @param offset the offset within the buffer to set the data from
+ *
+ * @return the number of data items set, or -1 on error.
+ */
+ssize_t xplra_multi_set_float_array(int bufferID, size_t datarefID,
+                                    const float* value, size_t length,
+                                    size_t offset);
+
+/*----------------------------------------------------------------------------*/
+
+/**
+ * Get the contents of the float array with the given ID.
+ *
+ * @param length the amount of data. If 0, it is assumed to be the
+ * length of the data in the buffer minus the offset.
+ * @param offset the offset within the buffer to get the data from
+ *
+ * @return the number of data items retrieved, or -1 on error.
+ */
+ssize_t xplra_multi_get_float_array(float* value,
+                                    size_t length, size_t offset,
+                                    int bufferID, size_t datarefID);
+
+/*----------------------------------------------------------------------------*/
+
+/**
+ * Get a pointer to the float array with the given ID.
+ *
+ * @param offset the offset within the buffer.
+ *
+ * @return the pointer on success, 0 on error.
+ */
+const float* xplra_multi_get_float_array_ptr(int bufferID, size_t datarefID,
+                                             size_t offset);
+
+/*----------------------------------------------------------------------------*/
+
+/**
+ * Set the contents of the integer array dataref with the given ID.
+ *
+ * @param length the amount of data. If 0, it is assumed to be the
+ * length of the data in the buffer minus the offset.
+ * @param offset the offset within the buffer to set the data from
+ *
+ * @return the number of data items set, or -1 on error.
+ */
+ssize_t xplra_multi_set_int_array(int bufferID, size_t datarefID,
+                                  const int32_t* value, size_t length,
+                                  size_t offset);
+
+/*----------------------------------------------------------------------------*/
+
+/**
+ * Get the contents of the integer array with the given ID.
+ *
+ * @param length the amount of data. If 0, it is assumed to be the
+ * length of the data in the buffer minus the offset.
+ * @param offset the offset within the buffer to get the data from
+ *
+ * @return the number of data items retrieved, or -1 on error.
+ */
+ssize_t xplra_multi_get_int_array(int32_t* value,
+                                  size_t length, size_t offset,
+                                  int bufferID, size_t datarefID);
+
+/*----------------------------------------------------------------------------*/
+
+/**
+ * Get a pointer to the integer array with the given ID.
+ *
+ * @param offset the offset within the buffer.
+ *
+ * @return the pointer on success, 0 on error.
+ */
+const int32_t* xplra_multi_get_int_array_ptr(int bufferID, size_t datarefID,
+                                             size_t offset);
+
+/*----------------------------------------------------------------------------*/
+
+/**
+ * Set the contents of the byte array dataref with the given ID.
+ *
+ * @param length the amount of data. If 0, it is assumed to be the
+ * length of the data in the buffer minus the offset.
+ * @param offset the offset within the buffer to set the data from
+ *
+ * @return the number of data items set, or -1 on error.
+ */
+ssize_t xplra_multi_set_byte_array(int bufferID, size_t datarefID,
+                                   const void* value, size_t length,
+                                   size_t offset);
+
+/*----------------------------------------------------------------------------*/
+
+/**
+ * Get the contents of the byte array with the given ID.
+ *
+ * @param length the amount of data. If 0, it is assumed to be the
+ * length of the data in the buffer minus the offset.
+ * @param offset the offset within the buffer to get the data from
+ *
+ * @return the number of data items retrieved, or -1 on error.
+ */
+ssize_t xplra_multi_get_byte_array(void* value,
+                                   size_t length, size_t offset,
+                                   int bufferID, size_t datarefID);
+
+/*----------------------------------------------------------------------------*/
+
+/**
+ * Get a pointer to the byte array with the given ID.
+ *
+ * @param offset the offset within the buffer.
+ *
+ * @return the pointer on success, 0 on error.
+ */
+const uint8_t* xplra_multi_get_byte_array_ptr(int bufferID, size_t datarefID,
+                                              size_t offset);
+
+/*----------------------------------------------------------------------------*/
+
+/**
+ * Set the value of the byte array with the given ID from the given
+ * string. If the string is shorter than the array, the rest will be
+ * filled with 0s.
+ *
+ * @return the number of bytes set, or -1 on error
+ */
+ssize_t xplra_multi_set_string(int bufferID, size_t datarefID,
+                               const char* value, size_t offset);
+
+/*----------------------------------------------------------------------------*/
+
+/**
+ * Get a pointer as a string pointer to the byte array with the given
+ * ID.
+ *
+ * @return the pointer on success, 0 on error.
+ */
+const char* xplra_multi_get_string_ptr(int bufferID, size_t datarefID,
+                                       size_t offset);
 
 /*----------------------------------------------------------------------------*/
@@ -346,5 +718,5 @@
  * @return 0 on success, -1 on error.
  */
-int xplra_destroy_multi_buffer(int connectionID, int bufferID);
+int xplra_multi_destroy_buffer(int connectionID, int bufferID);
 
 /*----------------------------------------------------------------------------*/
