diff -Nru --exclude PLUGINS vdr-1.5.6/keys.c vdr-1.5.6-patched/keys.c
--- vdr-1.5.6/keys.c	2006-10-14 12:18:05.000000000 +0200
+++ vdr-1.5.6-patched/keys.c	2007-08-12 11:23:05.000000000 +0200
@@ -64,6 +64,7 @@
                     { kUser7,         "User7"      },
                     { kUser8,         "User8"      },
                     { kUser9,         "User9"      },
+                    { kHelp,          "Help"       },
                     { kNone,          ""           },
                     { k_Setup,        "_Setup"     },
                     { kNone,          NULL         },
diff -Nru --exclude PLUGINS vdr-1.5.6/keys.h vdr-1.5.6-patched/keys.h
--- vdr-1.5.6/keys.h	2007-02-25 11:49:35.000000000 +0100
+++ vdr-1.5.6-patched/keys.h	2007-08-12 11:05:50.000000000 +0200
@@ -50,6 +50,7 @@
              kSetup,
              kCommands,
              kUser1, kUser2, kUser3, kUser4, kUser5, kUser6, kUser7, kUser8, kUser9,
+	     kHelp,
              kNone,
              kKbd,
              // The following codes are used internally:
diff -Nru --exclude PLUGINS vdr-1.5.6/osdbase.c vdr-1.5.6-patched/osdbase.c
--- vdr-1.5.6/osdbase.c	2007-06-09 12:07:46.000000000 +0200
+++ vdr-1.5.6-patched/osdbase.c	2007-08-12 13:38:00.000000000 +0200
@@ -13,6 +13,7 @@
 #include "i18n.h"
 #include "remote.h"
 #include "status.h"
+#include "menu.h"
 
 // --- cOsdItem --------------------------------------------------------------
 
@@ -22,6 +23,7 @@
   state = State;
   selectable = true;
   fresh = true;
+  help = NULL;
 }
 
 cOsdItem::cOsdItem(const char *Text, eOSState State, bool Selectable)
@@ -30,12 +32,14 @@
   state = State;
   selectable = Selectable;
   fresh = true;
+  help = NULL;
   SetText(Text);
 }
 
 cOsdItem::~cOsdItem()
 {
   free(text);
+  free(help);
 }
 
 void cOsdItem::SetText(const char *Text, bool Copy)
@@ -54,6 +58,12 @@
   fresh = Fresh;
 }
 
+void cOsdItem::SetOnlineHelp(const char *Help, bool Copy)
+{
+  free(help);
+  help = Copy ? strdup(Help) : (char *)Help; // help assumes ownership!
+}
+
 eOSState cOsdItem::ProcessKey(eKeys Key)
 {
   return Key == kOk ? state : osUnknown;
@@ -67,6 +77,12 @@
      ((cOsdMenu *)this)->Display();
 }
 
+void cOsdObject::SetOnlineHelp(const char *Help, bool Copy)
+{
+  free(help);
+  help = Copy ? strdup(Help) : (char *)Help; // help assumes ownership!
+}
+
 // --- cOsdMenu --------------------------------------------------------------
 
 cSkinDisplayMenu *cOsdMenu::displayMenu = NULL;
@@ -447,6 +463,18 @@
      }
 }
 
+eOSState cOsdMenu::Help(void)
+{
+  const char* Help = OnlineHelp();
+  cOsdItem *item = Get(current);
+  if (item && item->OnlineHelp())
+    Help = item->OnlineHelp();
+  if (Help)
+    return AddSubMenu(new cMenuText(tr("Help"), Help));
+  else
+    return osUnknown;
+}
+
 eOSState cOsdMenu::HotKey(eKeys Key)
 {
   for (cOsdItem *item = First(); item; item = Next(item)) {
@@ -517,6 +545,7 @@
                    marked = -1;
                    break;
                    }
+    case kHelp: return Help();
                 // else run into default
     default: if (marked < 0)
                 return osUnknown;
diff -Nru --exclude PLUGINS vdr-1.5.6/osdbase.h vdr-1.5.6-patched/osdbase.h
--- vdr-1.5.6/osdbase.h	2007-06-09 13:49:00.000000000 +0200
+++ vdr-1.5.6-patched/osdbase.h	2007-08-12 14:00:43.000000000 +0200
@@ -51,6 +51,7 @@
   char *text;
   eOSState state;
   bool selectable;
+  char *help;
 protected:
   bool fresh;
 public:
@@ -61,7 +62,9 @@
   void SetText(const char *Text, bool Copy = true);
   void SetSelectable(bool Selectable);
   void SetFresh(bool Fresh);
+  void SetOnlineHelp(const char *Help, bool Copy = true);
   const char *Text(void) { return text; }
+  const char *OnlineHelp(void) { return help; }
   virtual void Set(void) {}
   virtual eOSState ProcessKey(eKeys Key);
   };
@@ -71,15 +74,18 @@
 private:
   bool isMenu;
   bool needsFastResponse;
+  char *help;
 protected:
   void SetNeedsFastResponse(bool NeedsFastResponse) { needsFastResponse = NeedsFastResponse; }
 public:
-  cOsdObject(bool FastResponse = false) { isMenu = false; needsFastResponse = FastResponse; }
-  virtual ~cOsdObject() {}
+  cOsdObject(bool FastResponse = false) { isMenu = false; needsFastResponse = FastResponse; help = NULL; }
+  virtual ~cOsdObject() { free(help); }
   virtual bool NeedsFastResponse(void) { return needsFastResponse; }
   bool IsMenu(void) { return isMenu; }
   virtual void Show(void);
   virtual eOSState ProcessKey(eKeys Key) { return osUnknown; }
+  virtual void SetOnlineHelp(const char *Help, bool Copy = true);
+  const char *OnlineHelp(void) { return help; }
   };
 
 class cOsdMenu : public cOsdObject, public cList<cOsdItem> {
@@ -120,6 +126,7 @@
   void SetTitle(const char *Title);
   void SetHelp(const char *Red, const char *Green = NULL, const char *Yellow = NULL, const char *Blue = NULL);
   virtual void Del(int Index);
+  virtual eOSState Help(void);
 public:
   cOsdMenu(const char *Title, int c0 = 0, int c1 = 0, int c2 = 0, int c3 = 0, int c4 = 0);
   virtual ~cOsdMenu();
diff -Nru --exclude PLUGINS vdr-1.5.6/player.c vdr-1.5.6-patched/player.c
--- vdr-1.5.6/player.c	2007-07-20 17:25:24.000000000 +0200
+++ vdr-1.5.6-patched/player.c	2007-08-12 13:49:24.000000000 +0200
@@ -9,6 +9,7 @@
 
 #include "player.h"
 #include "i18n.h"
+#include "menu.h"
 
 // --- cPlayer ---------------------------------------------------------------
 
@@ -94,3 +95,12 @@
   control = NULL;
   delete c;
 }
+
+cOsdObject *cControl::Help(void)
+{
+  const char* Help = OnlineHelp();
+  if (Help)
+    return new cMenuText(tr("Help"), Help);
+  else
+    return NULL;
+}
diff -Nru --exclude PLUGINS vdr-1.5.6/player.h vdr-1.5.6-patched/player.h
--- vdr-1.5.6/player.h	2006-01-06 12:29:27.000000000 +0100
+++ vdr-1.5.6-patched/player.h	2007-08-12 13:48:50.000000000 +0200
@@ -78,6 +78,7 @@
   static void Attach(void);
   static void Shutdown(void);
   static cControl *Control(void);
+  virtual cOsdObject *Help(void);
   };
 
 #endif //__PLAYER_H
diff -Nru --exclude PLUGINS vdr-1.5.6/vdr.c vdr-1.5.6-patched/vdr.c
--- vdr-1.5.6/vdr.c	2007-07-22 13:40:01.000000000 +0200
+++ vdr-1.5.6-patched/vdr.c	2007-08-12 13:54:35.000000000 +0200
@@ -923,8 +923,18 @@
                      cRemote::Put(kSchedule, true);
                      }
                   }
-               }
+	  }
+               break;
+          // Help:
+          case kHelp: 
+                  if (cControl::Control()) {
+                     cControl::Control()->Hide();
+                     Menu = cControl::Control()->Help();
+                     if (Menu)
+                        Menu->Show();
+                     }	  
                break;
+	       
           // Direct main menu functions:
           #define DirectMainFunction(function)\
             DELETE_MENU;\
