Index: misc/client.py
===================================================================
--- misc/client.py	(revision 10)
+++ misc/client.py	(revision 38)
@@ -415,4 +415,22 @@
             print >> sys.stderr, "Invalid dataref at #%d" % (index,)
         elif result!=0:
+            print >> sys.stderr, "Error code:", result
+
+    def do_show_message(self, args):
+        words = self._splitArgs(args)
+        if len(words)<2:
+            print >> sys.stderr, "Missing parameters"
+            return False
+
+        message = words[0]
+        duration = float(words[1])
+
+        self._writeU8(0x41)
+        self._writeString(message)
+        self._writeFloat(duration)
+        self._flush()
+
+        result = self._readU8()
+        if result!=0:
             print >> sys.stderr, "Error code:", result
 
Index: src/plugin/src/xplra/ListenThread.h
===================================================================
--- src/plugin/src/xplra/ListenThread.h	(revision 36)
+++ src/plugin/src/xplra/ListenThread.h	(revision 38)
@@ -44,4 +44,8 @@
 //------------------------------------------------------------------------------
 
+class MessageWindow;
+
+//------------------------------------------------------------------------------
+
 /**
  * The thread that listens to incoming connections and starts the
@@ -62,4 +66,9 @@
      */
     int xplmVersion;
+
+    /**
+     * The message window for showing messages.
+     */
+    MessageWindow& messageWindow;
 
     /**
@@ -83,5 +92,6 @@
      * Construct the thread.
      */
-    ListenThread(int xplaneVersion, int xplmVersion);
+    ListenThread(int xplaneVersion, int xplmVersion,
+                 MessageWindow& messageWindow);
 
     /**
@@ -89,4 +99,9 @@
      */
     void getVersions(int& xplane, int& xplm) const;
+
+    /**
+     * Get the message window.
+     */
+    MessageWindow& getMessageWindow();
 
     /**
@@ -105,8 +120,10 @@
 //------------------------------------------------------------------------------
 
-inline ListenThread::ListenThread(int xplaneVersion, int xplmVersion) :
+inline ListenThread::ListenThread(int xplaneVersion, int xplmVersion,
+                                  MessageWindow& messageWindow) :
     Thread(true),
     xplaneVersion(xplaneVersion),
     xplmVersion(xplmVersion),
+    messageWindow(messageWindow),
     quitEvent(&waiter)
 {
@@ -119,4 +136,11 @@
     xplane = xplaneVersion;
     xplm = xplmVersion;
+}
+
+//------------------------------------------------------------------------------
+
+inline MessageWindow& ListenThread::getMessageWindow()
+{
+    return messageWindow;
 }
 
Index: src/plugin/src/xplra/Makefile.am
===================================================================
--- src/plugin/src/xplra/Makefile.am	(revision 13)
+++ src/plugin/src/xplra/Makefile.am	(revision 38)
@@ -3,5 +3,5 @@
 AM_CXXFLAGS=$(VSCPL_CFLAGS) $(LIBXPLCOMMON_CFLAGS)
 
-AM_CPPFLAGS=-DXPLM210
+AM_CPPFLAGS=-DXPLM100
 
 SRCS= \
@@ -16,5 +16,7 @@
 	MultiTaskRequest.cc		\
 	GetMultiDataRefRequest.cc	\
-	SetMultiDataRefRequest.cc
+	SetMultiDataRefRequest.cc	\
+	MessageWindow.cc		\
+	MessageRequest.cc
 
 noinst_HEADERS= \
@@ -31,5 +33,7 @@
 	MultiTaskRequest.h		\
 	GetMultiDataRefRequest.h	\
-	SetMultiDataRefRequest.h
+	SetMultiDataRefRequest.h	\
+	MessageWindow.h			\
+	MessageRequest.h
 
 if TARGET_API_POSIX
Index: src/plugin/src/xplra/MessageRequest.cc
===================================================================
--- src/plugin/src/xplra/MessageRequest.cc	(revision 38)
+++ src/plugin/src/xplra/MessageRequest.cc	(revision 38)
@@ -0,0 +1,52 @@
+// Copyright (c) 2013 by István Váradi
+
+// This file is part of XPLRA, a remote-access plugin for X-Plane
+
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+
+// 1. Redistributions of source code must retain the above copyright notice, this
+//    list of conditions and the following disclaimer.
+// 2. Redistributions in binary form must reproduce the above copyright notice,
+//    this list of conditions and the following disclaimer in the documentation
+//    and/or other materials provided with the distribution.
+
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// The views and conclusions contained in the software and documentation are those
+// of the authors and should not be interpreted as representing official policies,
+// either expressed or implied, of the FreeBSD Project.
+
+//------------------------------------------------------------------------------
+
+#include "MessageRequest.h"
+
+#include "MessageWindow.h"
+
+//------------------------------------------------------------------------------
+
+using xplra::MessageRequest;
+
+//------------------------------------------------------------------------------
+
+void MessageRequest::execute()
+{
+    messageWindow.setNewMessage(message, duration);
+}
+
+//------------------------------------------------------------------------------
+
+// Local Variables:
+// mode: C++
+// c-basic-offset: 4
+// indent-tabs-mode: nil
+// End:
Index: src/plugin/src/xplra/MessageRequest.h
===================================================================
--- src/plugin/src/xplra/MessageRequest.h	(revision 38)
+++ src/plugin/src/xplra/MessageRequest.h	(revision 38)
@@ -0,0 +1,106 @@
+// Copyright (c) 2013 by István Váradi
+
+// This file is part of XPLRA, a remote-access plugin for X-Plane
+
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+
+// 1. Redistributions of source code must retain the above copyright notice, this
+//    list of conditions and the following disclaimer.
+// 2. Redistributions in binary form must reproduce the above copyright notice,
+//    this list of conditions and the following disclaimer in the documentation
+//    and/or other materials provided with the distribution.
+
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// The views and conclusions contained in the software and documentation are those
+// of the authors and should not be interpreted as representing official policies,
+// either expressed or implied, of the FreeBSD Project.
+
+#ifndef XPLRA_MESSAGEREQUEST_H
+#define XPLRA_MESSAGEREQUEST_H
+//------------------------------------------------------------------------------
+
+#include "Request.h"
+
+#include <string>
+
+//------------------------------------------------------------------------------
+
+namespace xplra {
+
+//------------------------------------------------------------------------------
+
+class MessageWindow;
+
+//------------------------------------------------------------------------------
+
+/**
+ * A request that sets up a new message to be displayed in the message window.
+ */
+class MessageRequest : public Request
+{
+private:
+    /**
+     * The message window to use.
+     */
+    MessageWindow& messageWindow;
+
+    /**
+     * The message.
+     */
+    std::string message;
+
+    /**
+     * The duration.
+     */
+    float duration;
+
+public:
+    /**
+     * Construct the request.
+     */
+    MessageRequest(MessageWindow& messageWindow,
+                   const std::string& message, float duration);
+
+protected:
+    /**
+     * Execute the request by
+     */
+    virtual void execute();
+};
+
+//------------------------------------------------------------------------------
+// Inline definitions
+//------------------------------------------------------------------------------
+
+inline MessageRequest::MessageRequest(MessageWindow& messageWindow,
+                                      const std::string& message,
+                                      float duration) :
+    messageWindow(messageWindow),
+    message(message),
+    duration(duration)
+{
+}
+
+//------------------------------------------------------------------------------
+
+} /* namespace xplra */
+
+//------------------------------------------------------------------------------
+#endif // XPLRA_MESSAGEREQUEST_H
+
+// Local Variables:
+// mode: C++
+// c-basic-offset: 4
+// indent-tabs-mode: nil
+// End:
Index: src/plugin/src/xplra/MessageWindow.cc
===================================================================
--- src/plugin/src/xplra/MessageWindow.cc	(revision 38)
+++ src/plugin/src/xplra/MessageWindow.cc	(revision 38)
@@ -0,0 +1,182 @@
+// Copyright (c) 2013 by István Váradi
+
+// This file is part of XPLRA, a remote-access plugin for X-Plane
+
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+
+// 1. Redistributions of source code must retain the above copyright notice, this
+//    list of conditions and the following disclaimer.
+// 2. Redistributions in binary form must reproduce the above copyright notice,
+//    this list of conditions and the following disclaimer in the documentation
+//    and/or other materials provided with the distribution.
+
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// The views and conclusions contained in the software and documentation are those
+// of the authors and should not be interpreted as representing official policies,
+// either expressed or implied, of the FreeBSD Project.
+
+//------------------------------------------------------------------------------
+
+#include "MessageWindow.h"
+
+#include <hu/varadiistvan/xplcommon/Util.h>
+
+#include <XPLMProcessing.h>
+#include <XPLMGraphics.h>
+
+//------------------------------------------------------------------------------
+
+using xplra::MessageWindow;
+
+using hu::varadiistvan::xplcommon::Util;
+
+//------------------------------------------------------------------------------
+
+void MessageWindow::drawWindowCallback(XPLMWindowID /*windowID*/, void* refCon)
+{
+    MessageWindow* messageWindow = reinterpret_cast<MessageWindow*>(refCon);
+    messageWindow->drawWindow();
+}
+
+//------------------------------------------------------------------------------
+
+void MessageWindow::handleKeyCallback(XPLMWindowID /*windowID*/, char key,
+                                      XPLMKeyFlags flags, char virtualKey,
+                                      void* refCon, int losingFocus)
+{
+    MessageWindow* messageWindow = reinterpret_cast<MessageWindow*>(refCon);
+    messageWindow->handleKey(key, flags, virtualKey, losingFocus!=0);
+}
+
+//------------------------------------------------------------------------------
+
+int MessageWindow::handleMouseClickCallback(XPLMWindowID /*windowID*/,
+                                            int x, int y,
+                                            XPLMMouseStatus mouse, void* refCon)
+{
+    MessageWindow* messageWindow = reinterpret_cast<MessageWindow*>(refCon);
+    return messageWindow->handleMouseClick(x, y, mouse) ? 1 : 0;
+}
+
+//------------------------------------------------------------------------------
+
+MessageWindow::MessageWindow() :
+    hideTime(0.0),
+    duration(0.0)
+{
+    widthDataRef = XPLMFindDataRef("sim/graphics/view/window_width");
+    heightDataRef = XPLMFindDataRef("sim/graphics/view/window_height");
+
+    int screenWidth = XPLMGetDatai(widthDataRef);
+    int screenHeight = XPLMGetDatai(heightDataRef);
+
+    Util::debug("hu.varadiistvan.xplra.MessageWindow: screenWidth=%d, screenHeight=%d\n",
+                screenWidth, screenHeight);
+
+    left = 50; right = screenWidth - left;
+    top = screenHeight * 9 / 10; bottom = top - 25;
+
+    windowID = XPLMCreateWindow(left, top, right, bottom, 0,
+                                &drawWindowCallback,
+                                &handleKeyCallback,
+                                &handleMouseClickCallback, this);
+}
+
+//------------------------------------------------------------------------------
+
+MessageWindow::~MessageWindow()
+{
+    XPLMSetWindowIsVisible(windowID, 0);
+    XPLMDestroyWindow(windowID);
+}
+
+//------------------------------------------------------------------------------
+
+void MessageWindow::drawWindow()
+{
+    static float colour[3] = { 0.2, 1.0, 0.65 };
+
+    float now = XPLMGetElapsedTime();
+
+    float d = getNewMessage(displayedMessage);
+    if (d>0.0) {
+        hideTime = now + d;
+    }
+
+    if (now>=hideTime) {
+        XPLMSetWindowIsVisible(windowID, 0);
+    } else {
+        XPLMDrawTranslucentDarkBox(left, top, right, bottom);
+        XPLMDrawString(colour, left + 25, top - 15,
+                       const_cast<char*>(displayedMessage.c_str()), 0,
+                       xplmFont_Basic);
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void MessageWindow::handleKey(char key, XPLMKeyFlags flags, char virtualKey,
+                              bool losingFocus)
+{
+    Util::debug("hu.varadiistvan.xplra.MessageWindow.handleKey: key=0x%02d (%c), flags=0x%04x, virtualKey=0x%02d (%c), losingFocus=%d\n",
+                key, key, flags, virtualKey, virtualKey, losingFocus);
+}
+
+//------------------------------------------------------------------------------
+
+bool MessageWindow::handleMouseClick(int x, int y, XPLMMouseStatus mouse)
+{
+    Util::debug("hu.varadiistvan.xplra.MessageWindow.handleMouseClick: x=%d, y=%d, mouse=0x%04x\n",
+                x, y, mouse);
+    return true;
+}
+
+//------------------------------------------------------------------------------
+
+float MessageWindow::getNewMessage(std::string& dest)
+{
+    mutex.lock();
+
+    float d = duration;
+    if (d>0.0) {
+        dest = message;
+
+        message.clear();
+        duration = 0.0;
+    }
+
+    mutex.unlock();
+
+    return d;
+}
+
+//------------------------------------------------------------------------------
+
+void MessageWindow::setNewMessage(const std::string& msg, float d)
+{
+    mutex.lock();
+    message = msg;
+    duration = d;
+    mutex.unlock();
+
+    XPLMSetWindowIsVisible(windowID, 1);
+}
+
+//------------------------------------------------------------------------------
+
+// Local Variables:
+// mode: C++
+// c-basic-offset: 4
+// indent-tabs-mode: nil
+// End:
Index: src/plugin/src/xplra/MessageWindow.h
===================================================================
--- src/plugin/src/xplra/MessageWindow.h	(revision 38)
+++ src/plugin/src/xplra/MessageWindow.h	(revision 38)
@@ -0,0 +1,193 @@
+// Copyright (c) 2013 by István Váradi
+
+// This file is part of XPLRA, a remote-access plugin for X-Plane
+
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+
+// 1. Redistributions of source code must retain the above copyright notice, this
+//    list of conditions and the following disclaimer.
+// 2. Redistributions in binary form must reproduce the above copyright notice,
+//    this list of conditions and the following disclaimer in the documentation
+//    and/or other materials provided with the distribution.
+
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// The views and conclusions contained in the software and documentation are those
+// of the authors and should not be interpreted as representing official policies,
+// either expressed or implied, of the FreeBSD Project.
+
+#ifndef XPLRA_MESSAGEWINDOW_H
+#define XPLRA_MESSAGEWINDOW_H
+//------------------------------------------------------------------------------
+
+#include <hu/varadiistvan/scpl/Mutex.h>
+
+#include <string>
+
+#include <XPLMDataAccess.h>
+#include <XPLMDisplay.h>
+
+//------------------------------------------------------------------------------
+
+namespace xplra {
+
+//------------------------------------------------------------------------------
+
+/**
+ * Class to handle the activities related to the message window.
+ */
+class MessageWindow
+{
+private:
+    /**
+     * Window drawing callback.
+     */
+    static void drawWindowCallback(XPLMWindowID windowID, void* refCon);
+
+    /**
+     * Handle the keypresses.
+     */
+    static void handleKeyCallback(XPLMWindowID windowID, char key,
+                                  XPLMKeyFlags flags, char virtualKey,
+                                  void* refCon, int losingFocus);
+
+    /**
+     * Handle the mouse clicks.
+     */
+    static int handleMouseClickCallback(XPLMWindowID windowID, int x, int y,
+                                        XPLMMouseStatus mouse, void* refCon);
+
+private:
+    /**
+     * The dataref containing the width of the program's window.
+     */
+    XPLMDataRef widthDataRef;
+
+    /**
+     * The dataref containing the height of the program's window.
+     */
+    XPLMDataRef heightDataRef;
+
+    /**
+     * The window ID.
+     */
+    XPLMWindowID windowID;
+
+    /**
+     * The X-coordinate of the left side of the window.
+     */
+    int left;
+
+    /**
+     * The Y-coordinate of the top of the window.
+     */
+    int top;
+
+    /**
+     * The X-coordinate of the right side of the window.
+     */
+    int right;
+
+    /**
+     * The Y-coordinate of the bottom of the window.
+     */
+    int bottom;
+
+    /**
+     * The currently displayed message.
+     */
+    std::string displayedMessage;
+
+    /**
+     * The time to hide the current message. If not positive, no
+     * message is currently shown.
+     */
+    float hideTime;
+
+    /**
+     * The mutex protecting some of the data structures that are used
+     * from both the simulator loop and the server thread.
+     */
+    hu::varadiistvan::scpl::Mutex mutex;
+
+    /**
+     * The message to show.
+     */
+    std::string message;
+
+    /**
+     * The number of seconds for which the message should be shown. If
+     * positive, there is a new message.
+     */
+    float duration;
+
+public:
+    /**
+     * Construct the message window. It creates the X-Plane window and
+     * registers the callback functions. The window is hidden
+     * initially.
+     */
+    MessageWindow();
+
+    /**
+     * Destroy the message window. It destroys the X-Plane window.
+     */
+    ~MessageWindow();
+
+private:
+    /**
+     * Called from the window drawing callback.
+     */
+    void drawWindow();
+
+    /**
+     * Called from the key handling callback.
+     */
+    void handleKey(char key, XPLMKeyFlags flags, char virtualKey,
+                   bool losingFocus);
+
+    /**
+     * Called from the mouse click handling callback.
+     *
+     * @return true if the click is consumed, false otherwise.
+     */
+    bool handleMouseClick(int x, int y, XPLMMouseStatus mouse);
+
+    /**
+     * Get the new message, if any.
+     *
+     * @return the duration of the message, or 0.0 if there is no new
+     * message. The message will be cleared.
+     */
+    float getNewMessage(std::string& dest);
+
+    /**
+     * Set the new message, if any.
+     */
+    void setNewMessage(const std::string& msg, float d);
+
+    friend class MessageRequest;
+};
+
+//------------------------------------------------------------------------------
+
+} /* namespace xplra */
+
+//------------------------------------------------------------------------------
+#endif // XPLRA_MESSAGEWINDOW_H
+
+// Local Variables:
+// mode: C++
+// c-basic-offset: 4
+// indent-tabs-mode: nil
+// End:
Index: src/plugin/src/xplra/Protocol.h
===================================================================
--- src/plugin/src/xplra/Protocol.h	(revision 36)
+++ src/plugin/src/xplra/Protocol.h	(revision 38)
@@ -97,4 +97,9 @@
 
     /**
+     * Command: show a message in the message window.
+     */
+    static const uint8_t COMMAND_SHOW_MESSAGE = 0x41;
+
+    /**
      * Data type: int
      */
@@ -165,4 +170,9 @@
      */
     static const uint8_t RESULT_INVALID_ID = 0x07;
+
+    /**
+     * Result code: invalid duration
+     */
+    static const uint8_t RESULT_INVALID_DURATION = 0x08;
 
     /**
@@ -181,4 +191,9 @@
      */
     static const size_t MAX_MULTI_COUNT = 1024;
+
+    /**
+     * The maximal message duration
+     */
+    static const float MAX_MESSAGE_DURATION = 5*60;
 
     /**
Index: src/plugin/src/xplra/ServerThread.cc
===================================================================
--- src/plugin/src/xplra/ServerThread.cc	(revision 36)
+++ src/plugin/src/xplra/ServerThread.cc	(revision 38)
@@ -39,4 +39,5 @@
 #include "GetMultiDataRefRequest.h"
 #include "SetMultiDataRefRequest.h"
+#include "MessageRequest.h"
 
 #include <hu/varadiistvan/xplcommon/Util.h>
@@ -152,4 +153,6 @@
         } else if (command==Protocol::COMMAND_GET_VERSIONS) {
             if (!handleGetVersions()) break;
+        } else if (command==Protocol::COMMAND_SHOW_MESSAGE) {
+            if (!handleShowMessage()) break;
         } else {
             stream.writeU8(Protocol::RESULT_INVALID_COMMAND);
@@ -400,4 +403,24 @@
     stream.writeS32(xplmVersion);
     stream.writeS32(Protocol::version);
+
+    return true;
+}
+
+//------------------------------------------------------------------------------
+
+bool ServerThread::handleShowMessage()
+{
+    string message = stream.readString();
+    float duration = stream.readFloat();
+    if (!stream) return false;
+
+    if (duration>Protocol::MAX_MESSAGE_DURATION) {
+        stream.writeU8(Protocol::RESULT_INVALID_DURATION);
+    } else {
+        MessageRequest request(listenThread.getMessageWindow(), message, duration);
+        if (!requestQueue.execute(&request)) return false;
+
+        stream.writeU8(Protocol::RESULT_OK);
+    }
 
     return true;
Index: src/plugin/src/xplra/ServerThread.h
===================================================================
--- src/plugin/src/xplra/ServerThread.h	(revision 36)
+++ src/plugin/src/xplra/ServerThread.h	(revision 38)
@@ -241,4 +241,11 @@
      */
     bool handleGetVersions();
+
+    /**
+     * Handle the COMMAND_SHOW_MESSAGE command
+     *
+     * @return true, if we can continue, false if the thread should quit
+     */
+    bool handleShowMessage();
 };
 
Index: src/plugin/src/xplra/plugin.cc
===================================================================
--- src/plugin/src/xplra/plugin.cc	(revision 36)
+++ src/plugin/src/xplra/plugin.cc	(revision 38)
@@ -31,4 +31,6 @@
 #include "ListenThread.h"
 
+#include "MessageWindow.h"
+
 #include <hu/varadiistvan/xplcommon/Util.h>
 #include <hu/varadiistvan/scpl/config.h>
@@ -49,8 +51,14 @@
 
 using xplra::ListenThread;
+using xplra::MessageWindow;
 
 using hu::varadiistvan::xplcommon::Util;
 
 //------------------------------------------------------------------------------
+
+/**
+ * The window to display messages from the clients.
+ */
+static MessageWindow* messageWindow = 0;
 
 /**
@@ -89,5 +97,8 @@
     XPLMGetVersions(&xplaneVersion, &xplmVersion, &hostID);
 
-    listenThread = new ListenThread(xplaneVersion, xplmVersion);
+    messageWindow = new MessageWindow();
+
+    listenThread = new ListenThread(xplaneVersion, xplmVersion,
+                                    *messageWindow);
     listenThread->start();
 }
@@ -108,8 +119,11 @@
     Util::debug("hu.varadiistvan.xplra.XPluginDisable called\n");
     // XPLMUnregisterFlightLoopCallback(&callback, 0);
+
     if (listenThread!=0) {
         listenThread->quit();
         listenThread = 0;
     }
+
+    delete messageWindow; messageWindow = 0;
 }
 
