Index: misc/client.py
===================================================================
--- misc/client.py	(revision 9)
+++ misc/client.py	(revision 10)
@@ -175,6 +175,6 @@
             print >> sys.stderr, "Error code:", result
 
-    def do_reg_multiget(self, args):
-        """Handle the 'reg_multiget' command"""
+    def do_multiget(self, args):
+        """Handle the 'multiget' command"""
         words = self._splitArgs(args)
         specs = []
@@ -190,8 +190,82 @@
             return False
 
+        self._writeU8(0x03)
+        self._writeU32(len(specs))
+        for (name, type, length, offset) in specs:
+            self._writeString(name)
+            self._writeU8(self._types[type])
+            if length is not None:
+                self._writeS32(length)
+                self._writeS32(offset)
+        self._flush()
+
+        result = self._readU8()
+        if result==0:
+            for (_, type, _, _) in specs:
+                value = self._readValue(type)
+                print value
+        elif result==0x02:
+            index = self._readU32()
+            print >> sys.stderr, "Invalid dataref at #%d" % (index,)
+        else:
+            print >> sys.stderr, "Error code:", result
+
+    def do_multiset(self, args):
+        """Handle the 'multiset' command"""
+        words = self._splitArgs(args)
+        specs = []
+        values = []
+        while words:
+            result = self._parseGetSpec(words)
+            if result is None:
+                return False
+            else:
+                words = result[1]
+                if not words:
+                    print >> sys.stderr, "Missing argument"
+                    return False
+                specs.append(result[0])
+                values.append(words[0])
+                words = words[1:]
+
+        if not specs:
+            return False
+
+        self._writeU8(0x04)
+        self._writeU32(len(specs))
+        for ((name, type, length, offset), value) in zip(specs, values):
+            self._writeString(name)
+            self._writeU8(self._types[type])
+            if length is not None:
+                self._writeS32(length)
+                self._writeS32(offset)
+            self._writeValue(type, value, length)
+        self._flush()
+
+        result = self._readU8()
+        if result==0x02:
+            index = self._readU32()
+            print >> sys.stderr, "Invalid dataref at #%d" % (index,)
+        elif result!=0:
+            print >> sys.stderr, "Error code:", result
+
+    def do_reg_multiget(self, args):
+        """Handle the 'reg_multiget' command"""
+        words = self._splitArgs(args)
+        specs = []
+        while words:
+            result = self._parseGetSpec(words)
+            if result is None:
+                return False
+            else:
+                specs.append(result[0])
+                words = result[1]
+
+        if not specs:
+            return False
+
         self._writeU8(0x11)
         self._writeU32(len(specs))
         for (name, type, length, offset) in specs:
-            print name, type
             self._writeString(name)
             self._writeU8(self._types[type])
@@ -275,5 +349,4 @@
         self._writeU32(len(specs))
         for (name, type, length, offset) in specs:
-            print name, type
             self._writeString(name)
             self._writeU8(self._types[type])
Index: misc/test5.sh
===================================================================
--- misc/test5.sh	(revision 10)
+++ misc/test5.sh	(revision 10)
@@ -0,0 +1,11 @@
+#!/bin/sh
+
+scriptdir=`dirname $0`
+
+"${scriptdir}/client.py" <<EOF
+multiget sim/aircraft/engine/acf_num_engines i sim/aircraft/view/acf_tailnum s -1 0
+multiset sim/aircraft/engine/acf_num_engines i 4 sim/aircraft/view/acf_tailnum s 40 0 HA-VAI
+multiget sim/aircraft/engine/acf_num_engines i sim/aircraft/view/acf_tailnum s -1 0
+multiset sim/aircraft/engine/acf_num_engines i 2 sim/aircraft/view/acf_tailnum s 40 0 HA-VAR
+multiget sim/aircraft/engine/acf_num_engines i sim/aircraft/view/acf_tailnum s -1 0
+EOF
Index: src/xplra/GetMultiDataRefRequest.cc
===================================================================
--- src/xplra/GetMultiDataRefRequest.cc	(revision 8)
+++ src/xplra/GetMultiDataRefRequest.cc	(revision 10)
@@ -39,12 +39,21 @@
 using xplra::GetMultiDataRefRequest;
 
+using xplcommon::DataStream;
 using xplcommon::Util;
 
 //------------------------------------------------------------------------------
 
-GetMultiDataRefRequest::GetMultiDataRefRequest(uint8_t& result, size_t numTasks,
-                                               xplcommon::DataStream& stream)
+GetMultiDataRefRequest::GetMultiDataRefRequest(uint8_t& result,
+                                               DataStream& stream)
 {
     result = Protocol::RESULT_OK;
+
+    uint32_t numTasks = stream.readU32();
+    if (!stream) return;
+    if (numTasks==0 || numTasks>Protocol::MAX_MULTI_COUNT) {
+        result = Protocol::RESULT_INVALID_COUNT;
+        return;
+    }
+
     for(size_t i = 0;
         i<numTasks && result==Protocol::RESULT_OK && stream; ++i)
Index: src/xplra/GetMultiDataRefRequest.h
===================================================================
--- src/xplra/GetMultiDataRefRequest.h	(revision 8)
+++ src/xplra/GetMultiDataRefRequest.h	(revision 10)
@@ -50,6 +50,5 @@
      * specifications from the given stream.
      */
-    GetMultiDataRefRequest(uint8_t& result, size_t numTasks,
-                           xplcommon::DataStream& stream);
+    GetMultiDataRefRequest(uint8_t& result, xplcommon::DataStream& stream);
 
     /**
Index: src/xplra/Protocol.h
===================================================================
--- src/xplra/Protocol.h	(revision 9)
+++ src/xplra/Protocol.h	(revision 10)
@@ -50,4 +50,14 @@
      */
     static const uint8_t COMMAND_SET_SINGLE = 0x02;
+
+    /**
+     * Command: get the value of a multiple datarefs.
+     */
+    static const uint8_t COMMAND_GET_MULTI = 0x03;
+
+    /**
+     * Command: set the value of a multiple datarefs.
+     */
+    static const uint8_t COMMAND_SET_MULTI = 0x04;
 
     /**
Index: src/xplra/ServerThread.cc
===================================================================
--- src/xplra/ServerThread.cc	(revision 9)
+++ src/xplra/ServerThread.cc	(revision 10)
@@ -131,4 +131,8 @@
         } else if (command==Protocol::COMMAND_SET_SINGLE) {
             if (!handleSetSingle()) break;
+        } else if (command==Protocol::COMMAND_GET_MULTI) {
+            if (!handleGetMulti()) break;
+        } else if (command==Protocol::COMMAND_SET_MULTI) {
+            if (!handleSetMulti()) break;
         } else if (command==Protocol::COMMAND_REGISTER_GET_MULTI) {
             if (!handleRegisterGetMulti()) break;
@@ -209,17 +213,57 @@
 //------------------------------------------------------------------------------
 
+bool ServerThread::handleGetMulti()
+{
+    uint8_t result = Protocol::RESULT_OK;
+    GetMultiDataRefRequest* request =
+        new GetMultiDataRefRequest(result, stream);
+    if (result!=Protocol::RESULT_OK || !stream) {
+        delete request;
+        stream.writeU8(result);
+        return stream;
+    }
+
+    bool isOK = requestQueue.execute(request);
+
+    if (isOK) {
+        request->writeResult(stream);
+    }
+
+    delete request;
+
+    return isOK;
+}
+
+//------------------------------------------------------------------------------
+
+bool ServerThread::handleSetMulti()
+{
+    uint8_t result = Protocol::RESULT_OK;
+    SetMultiDataRefRequest* request =
+        new SetMultiDataRefRequest(result, stream, true);
+    if (result!=Protocol::RESULT_OK || !stream) {
+        delete request;
+        stream.writeU8(result);
+        return stream;
+    }
+
+    bool isOK = requestQueue.execute(request);
+
+    if (isOK) {
+        request->writeResult(stream);
+    }
+
+    delete request;
+
+    return isOK;
+}
+
+//------------------------------------------------------------------------------
+
 bool ServerThread::handleRegisterGetMulti()
 {
-    uint32_t numTasks = stream.readU32();
-    if (!stream) {
-        return false;
-    } else if (numTasks==0 || numTasks>Protocol::MAX_MULTI_COUNT) {
-        stream.writeU8(Protocol::RESULT_INVALID_COUNT);
-        return true;
-    }
-
     uint8_t result = Protocol::RESULT_OK;
     GetMultiDataRefRequest* request =
-        new GetMultiDataRefRequest(result, numTasks, stream);
+        new GetMultiDataRefRequest(result, stream);
     if (result!=Protocol::RESULT_OK || !stream) {
         delete request;
@@ -282,5 +326,5 @@
     uint8_t result = Protocol::RESULT_OK;
     SetMultiDataRefRequest* request =
-        new SetMultiDataRefRequest(result, stream);
+        new SetMultiDataRefRequest(result, stream, false);
     if (result!=Protocol::RESULT_OK || !stream) {
         delete request;
Index: src/xplra/ServerThread.h
===================================================================
--- src/xplra/ServerThread.h	(revision 9)
+++ src/xplra/ServerThread.h	(revision 10)
@@ -173,4 +173,18 @@
 
     /**
+     * Handle the COMMAND_GET_MULTI command
+     *
+     * @return true, if we can continue, false if the thread should quit
+     */
+    bool handleGetMulti();
+
+    /**
+     * Handle the COMMAND_SET_MULTI command
+     *
+     * @return true, if we can continue, false if the thread should quit
+     */
+    bool handleSetMulti();
+
+    /**
      * Handle the COMMAND_REGISTER_GET_MULTI command
      *
Index: src/xplra/SetMultiDataRefRequest.cc
===================================================================
--- src/xplra/SetMultiDataRefRequest.cc	(revision 9)
+++ src/xplra/SetMultiDataRefRequest.cc	(revision 10)
@@ -42,5 +42,6 @@
 
 SetMultiDataRefRequest::SetMultiDataRefRequest(uint8_t& result,
-                                               DataStream& stream)
+                                               DataStream& stream,
+                                               bool readValues)
 {
     result = Protocol::RESULT_OK;
@@ -56,5 +57,10 @@
         i<numTasks && result==Protocol::RESULT_OK && stream; ++i) {
         SetDataRefTask* task = SetDataRefTask::create(result, stream);
-        if (task!=0) addTask(task);
+        if (task!=0) {
+            if (readValues) {
+                task->readValue(stream);
+            }
+            addTask(task);
+        }
     }
 }
Index: src/xplra/SetMultiDataRefRequest.h
===================================================================
--- src/xplra/SetMultiDataRefRequest.h	(revision 9)
+++ src/xplra/SetMultiDataRefRequest.h	(revision 10)
@@ -50,5 +50,6 @@
      * the given stream.
      */
-    SetMultiDataRefRequest(uint8_t& result, xplcommon::DataStream& stream);
+    SetMultiDataRefRequest(uint8_t& result, xplcommon::DataStream& stream,
+                           bool readValues);
 
     /**
