--- ../vdr-1.3.44-orig/remote.h	2006-01-29 13:27:08.000000000 +0100
+++ remote.h	2006-03-26 14:48:15.000000000 +0200
@@ -29,6 +29,8 @@ private:
   static cMutex mutex;
   static cCondVar keyPressed;
   static const char *plugin;
+  static const char *plugins[MaxKeys];
+  static int pluginCount;
   char *name;
 protected:
   cRemote(const char *Name);
@@ -45,7 +47,7 @@ public:
   static void Clear(void);
   static bool Put(eKeys Key, bool AtFront = false);
   static bool PutMacro(eKeys Key);
-  static void CallPlugin(const char *Plugin);
+  static bool CallPlugin(const char *Plugin);
       ///< Initiates calling the given plugin's main menu function.
       ///< The Plugin parameter is the name of the plugin, and must be
       ///< a static string.
--- ../vdr-1.3.44-orig/remote.c	2006-01-29 15:43:07.000000000 +0100
+++ remote.c	2006-03-26 14:46:20.000000000 +0200
@@ -30,6 +30,8 @@ char *cRemote::unknownCode = NULL;
 cMutex cRemote::mutex;
 cCondVar cRemote::keyPressed;
 const char *cRemote::plugin = NULL;
+const char *cRemote::plugins[MaxKeys];
+int cRemote::pluginCount = 0;
 
 cRemote::cRemote(const char *Name)
 {
@@ -67,6 +69,8 @@ void cRemote::Clear(void)
 {
   cMutexLock MutexLock(&mutex);
   in = out = 0;
+  plugin = NULL;
+  pluginCount = 0;
   if (learning) {
      free(unknownCode);
      unknownCode = NULL;
@@ -145,10 +149,14 @@ bool cRemote::Put(const char *Code, bool
   return false;
 }
 
-void cRemote::CallPlugin(const char *Plugin)
+bool cRemote::CallPlugin(const char *Plugin)
 {
-  plugin = Plugin;
-  Put(k_Plugin);
+  cMutexLock MutexLock(&mutex);
+  if (Put(k_Plugin)) {
+     plugins[pluginCount++] = Plugin;
+     return true;
+     }
+  return false;
 }
 
 bool cRemote::HasKeys(void)
@@ -167,6 +175,10 @@ eKeys cRemote::Get(int WaitMs, char **Un
             out = 0;
          if ((k & k_Repeat) != 0)
             repeatTimeout.Set(REPEATTIMEOUT);
+         if (k == k_Plugin && pluginCount > 0) {
+            plugin = plugins[0];
+            memmove(plugins, plugins + 1, sizeof(*plugins) * --pluginCount);
+            }
          return k;
          }
       else if (!WaitMs || !keyPressed.TimedWait(mutex, WaitMs) && repeatTimeout.TimedOut()) {
