Index: src/plugin/src/xplra/Makefile.am
===================================================================
--- src/plugin/src/xplra/Makefile.am	(revision 39)
+++ src/plugin/src/xplra/Makefile.am	(revision 43)
@@ -19,5 +19,6 @@
 	ReloadPluginsRequest.cc		\
 	MessageWindow.cc		\
-	MessageRequest.cc
+	MessageRequest.cc		\
+	Menu.cc
 
 noinst_HEADERS= \
@@ -37,5 +38,6 @@
 	ReloadPluginsRequest.h		\
 	MessageWindow.h			\
-	MessageRequest.h
+	MessageRequest.h		\
+	Menu.h
 
 if TARGET_API_POSIX
Index: src/plugin/src/xplra/Menu.cc
===================================================================
--- src/plugin/src/xplra/Menu.cc	(revision 43)
+++ src/plugin/src/xplra/Menu.cc	(revision 43)
@@ -0,0 +1,85 @@
+// 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 "Menu.h"
+
+#include "MessageWindow.h"
+
+//------------------------------------------------------------------------------
+
+using xplra::Menu;
+
+//------------------------------------------------------------------------------
+
+void Menu::menuHandlerCallback(void* menuRef, void* itemRef)
+{
+    Menu* menu = reinterpret_cast<Menu*>(menuRef);
+    menu->handleMenu(itemRef);
+}
+
+//------------------------------------------------------------------------------
+
+Menu::Menu(MessageWindow& messageWindow) :
+    messageWindow(messageWindow),
+    menuID(0),
+    showMessageAreaIndex(-1)
+{
+    XPLMMenuID pluginsMenuID = XPLMFindPluginsMenu();
+
+    int menuIndex = XPLMAppendMenuItem(pluginsMenuID, "Remote Access", 0, 1);
+    menuID = XPLMCreateMenu("Remote Access", pluginsMenuID, menuIndex,
+                            &menuHandlerCallback, this);
+    showMessageAreaIndex = XPLMAppendMenuItem(menuID, "Show message area",
+                                              0, 1);
+    XPLMCheckMenuItem(menuID, showMessageAreaIndex, xplm_Menu_Unchecked);
+}
+
+//------------------------------------------------------------------------------
+
+void Menu::handleMenu(void* /*itemRef*/)
+{
+    XPLMMenuCheck checked = xplm_Menu_NoCheck;
+    XPLMCheckMenuItemState(menuID, showMessageAreaIndex, &checked);
+    if (checked==xplm_Menu_Unchecked) {
+        XPLMCheckMenuItem(menuID, showMessageAreaIndex, xplm_Menu_Checked);
+        messageWindow.show();
+    } else if (checked==xplm_Menu_Checked) {
+        XPLMCheckMenuItem(menuID, showMessageAreaIndex, xplm_Menu_Unchecked);
+        messageWindow.hide();
+    }
+}
+
+//------------------------------------------------------------------------------
+
+// Local Variables:
+// mode: C++
+// c-basic-offset: 4
+// indent-tabs-mode: nil
+// End:
Index: src/plugin/src/xplra/Menu.h
===================================================================
--- src/plugin/src/xplra/Menu.h	(revision 43)
+++ src/plugin/src/xplra/Menu.h	(revision 43)
@@ -0,0 +1,96 @@
+// 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_MENU_H
+#define XPLRA_MENU_H
+//------------------------------------------------------------------------------
+
+#include <XPLMMenus.h>
+
+//------------------------------------------------------------------------------
+
+namespace xplra {
+
+//------------------------------------------------------------------------------
+
+class MessageWindow;
+
+//------------------------------------------------------------------------------
+
+/**
+ * The menu handler.
+ */
+class Menu
+{
+private:
+    /**
+     * The menu handler callback.
+     */
+    static void menuHandlerCallback(void* menuRef, void* itemRef);
+
+    /**
+     * Reference to the message window.
+     */
+    MessageWindow& messageWindow;
+
+    /**
+     * The menu ID.
+     */
+    XPLMMenuID menuID;
+
+    /**
+     * The index of the "Show Message Area" menu item.
+     */
+    int showMessageAreaIndex;
+
+public:
+    /**
+     * Construct the menu. It creates the menu for the plugin under
+     * the Plugins menu
+     */
+    Menu(MessageWindow& messageWindow);
+
+protected:
+    /**
+     * Handle the menu clicks.
+     */
+    void handleMenu(void* itemRef);
+};
+
+//------------------------------------------------------------------------------
+
+} /* namespace xplra */
+
+//------------------------------------------------------------------------------
+#endif // XPLRA_MENU_H
+
+// Local Variables:
+// mode: C++
+// c-basic-offset: 4
+// indent-tabs-mode: nil
+// End:
Index: src/plugin/src/xplra/plugin.cc
===================================================================
--- src/plugin/src/xplra/plugin.cc	(revision 42)
+++ src/plugin/src/xplra/plugin.cc	(revision 43)
@@ -32,4 +32,5 @@
 
 #include "MessageWindow.h"
+#include "Menu.h"
 
 #include <hu/varadiistvan/xplcommon/Util.h>
@@ -53,4 +54,5 @@
 using xplra::ListenThread;
 using xplra::MessageWindow;
+using xplra::Menu;
 
 using hu::varadiistvan::xplcommon::Util;
@@ -64,33 +66,12 @@
 
 /**
+ * The menu.
+ */
+static Menu* menu = 0;
+
+/**
  * The thread to use to listen for incoming connections.
  */
 static ListenThread* listenThread = 0;
-
-/**
- * The ID of the menu of the plugin.
- */
-static XPLMMenuID menuID = 0;
-
-/**
- * The index of the show message area menu item.
- */
-static int showMessageAreaIndex = 0;
-
-//------------------------------------------------------------------------------
-
-static void menuHandler(void* /*menuRef*/, void* /*itemRef*/)
-{
-    // Util::debug("hu.varadiistvan.xplra menuHandler called\n");
-    XPLMMenuCheck checked = xplm_Menu_NoCheck;
-    XPLMCheckMenuItemState(menuID, showMessageAreaIndex, &checked);
-    if (checked==xplm_Menu_Unchecked) {
-        XPLMCheckMenuItem(menuID, showMessageAreaIndex, xplm_Menu_Checked);
-        messageWindow->show();
-    } else if (checked==xplm_Menu_Checked) {
-        XPLMCheckMenuItem(menuID, showMessageAreaIndex, xplm_Menu_Unchecked);
-        messageWindow->hide();
-    }
-}
 
 //------------------------------------------------------------------------------
@@ -124,13 +105,6 @@
     XPLMGetVersions(&xplaneVersion, &xplmVersion, &hostID);
 
-    int menuIndex = XPLMAppendMenuItem(XPLMFindPluginsMenu(),
-                                       "Remote Access", NULL, 1);
-    menuID = XPLMCreateMenu("Remote Access", XPLMFindPluginsMenu(), menuIndex,
-                            &menuHandler, 0);
-    showMessageAreaIndex = XPLMAppendMenuItem(menuID, "Show message area",
-                                              0, 1);
-    XPLMCheckMenuItem(menuID, showMessageAreaIndex, xplm_Menu_Unchecked);
-
     messageWindow = new MessageWindow();
+    menu = new Menu(*messageWindow);
 
     listenThread = new ListenThread(xplaneVersion, xplmVersion,
@@ -160,4 +134,5 @@
     }
 
+    delete menu; menu = 0;
     delete messageWindow; messageWindow = 0;
 }
