diff -ruN vdr-1.7.24/CONTRIBUTORS vdr-1.7.25/CONTRIBUTORS
--- vdr-1.7.24/CONTRIBUTORS	2012-02-19 12:50:20.000000000 +0100
+++ vdr-1.7.25/CONTRIBUTORS	2012-03-02 16:49:57.000000000 +0100
@@ -531,6 +531,7 @@
 
 Rudi Hofer (Rudi.Hofer@gmx.de)
  for his help in keeping 'channels.conf' up to date
+ for reporting a problem with overlapping tab positions in skins when using wide fonts
 
 Gregoire Favre <greg@ulima.unil.ch>
  for fixing some function headers to make them compile with gcc 3.x
@@ -1130,6 +1131,12 @@
  for adding support for handling DVB-T2 transponders
  for suggesting to add member functions Adapter() and Frontend() to cDvbDevice
  for improving handling subtitles of BBC channels
+ for fixing handling subtitle color palettes on channels where subtitles appear
+ "word by word"
+ for reporting a problem with color palettes in subtitles
+ for adding some typecasts to silence gcc compiler warnings
+ for reporting a bug in handling OSD color button texts in case a menu item has
+ texts of its own
 
 Ralf Klueber <ralf.klueber@vodafone.com>
  for reporting a bug in cutting a recording if there is only a single editing mark
@@ -2077,6 +2084,7 @@
  for making the list of tracks given in cStatus::SetAudioTrack() NULL terminated
  for fixing handling kLeft in the calls to cStatus::MsgOsdTextItem()
  for fixing a possible integer overflow in GetAbsTime()
+ for suggesting to add several cTimer::Set...() functions
 
 Philip Prindeville <philipp_subx@redfish-solutions.com>
  for updates to 'sources.conf'
@@ -2372,6 +2380,8 @@
  for fixing stopping subtitle display when switching the primary device
  for fixing plugin arguments corruption with glibc 2.11 on x86_64
  for setting the audio type of language descriptors to 0x00 in the PAT/PMT generator
+ for adding support for automatically selecting subtitles when playing old PES
+ recordings made with the subtitles plugin
 
 Antti Hartikainen <ami+vdr@ah.fi>
  for updating 'S13E' in 'sources.conf'
@@ -2397,6 +2407,8 @@
  recordings of the same broadcast made by different instances of VDR
  for fixing EntriesOnSameFileSystem() to avoid using f_fsid, which may be 0
  for fixing the German translation of "Folder name must not contain '%c'!"
+ for suggestions used in revising priority handling to allow receivers with a priority
+ that is lower than that of live viewing
 
 Jörn Reder <joern@zyn.de>
  for reporting that a recording may unnecessarily block a device with a CAM, while
diff -ruN vdr-1.7.24/HISTORY vdr-1.7.25/HISTORY
--- vdr-1.7.24/HISTORY	2012-02-19 12:49:32.000000000 +0100
+++ vdr-1.7.25/HISTORY	2012-03-03 12:51:32.000000000 +0100
@@ -6888,3 +6888,74 @@
 - Fixed a possible deadlock in time shift mode.
 - Fixed switching into time shift mode when pausing live video (thanks to Reinhard
   Nissl for helping to debug this one).
+
+2012-03-03: Version 1.7.25
+
+- The fps value for channels where it differs from the default is now set correctly
+  when pausing live video.
+- Increased the average character estimate for calculating tab positions in skins,
+  to better suit wide fonts (reported by Rudi Hofer).
+- Fixed getting the subsystem ids of DVB devices in case they have been rearranged
+  via udev rules.
+- Added several cTimer::Set...() functions (suggested by Alexander Rieger).
+- Changed the return value of cTimer::SetFile() to 'void'.
+- Revoked "Fixed a possible deadlock in time shift mode" because it caused trouble with
+  output on vdr-xine and dxr3, and also short glitches when replaying on any output
+  device.
+- Updated the Estonian OSD texts (thanks to Arthur Konovalov).
+- Updated the Finnish OSD texts (thanks to Rolf Ahrenberg).
+- Fixed handling subtitle color palettes on channels where subtitles appear
+  "word by word" (thanks to Rolf Ahrenberg).
+- Fixed upscaling cBitmaps with anti-aliasing (thanks to Rolf Ahrenberg for reporting
+  a problem with color palettes in subtitles).
+- Fixed getting the video aspect ratio for scaling subtitles.
+- Removed the "PrimaryLimit". Old "full featured" DVB cards can be run with the
+  --outputonly option to avoid problems with recording high bandwidth channels.
+  Besides, with HDTV becoming ever more popular those cards are pretty much obsolete
+  by now (the TT S2-6400 has no problems recording and replaying high bandwidth
+  channels simultaneously). And, last but not least, people using software players
+  won't notice this change, anyway.
+- Since cReceivers can have priorities between -99 and 99, the priority
+  for an unused device has been changed from -1 to -100.
+- If the first event in a schedule has a table id of 0x00, any incoming EIT data for
+  that schedule from the DVB stream will be completely ignored. This way an external
+  EPG source can fill the schedules with EPG data that will not be messed up with
+  that from the DVB data stream. Note, though, that this means VDR can not do VPS
+  controlled recordings with such events!
+- Added some typecasts to silence gcc compiler warnings (thanks to Rolf Ahrenberg).
+- Fixed handling overlapping timers in case a VPS timer with higher priority needs
+  to interrupt a timer with lower priority.
+- The code for the RCU remote control unit has been moved into a separate plugin
+  named "rcu".
+  The REMOTE=RCU option in the 'make' call for VDR is now obsolete.
+  The command line option --rcu is now obsolete. Use -Prcu instead. If you have
+  used --rcu with a device path, use -P"rcu -d<device>".
+- Added support for automatically selecting subtitles when playing old PES
+  recordings made with the subtitles plugin (thanks to Anssi Hannula).
+- Revised priority handling to allow receivers with a priority that is lower than
+  that of live viewing (with suggestions from Frank Schmirler):
+  + An idle device (one that is not used for live viewing and has no receiver
+    attached to it) now has priority IDLEPRIORITY (-100).
+  + An unused CAM slot now has priority IDLEPRIORITY.
+  + The default priority of a cReceiver is now MINPRIORITY (-99).
+  + A device that is used only for live viewing (no matter whether it's in Transfer
+    Mode or real live mode) now has priority TRANSFERPRIORITY (-1).
+  + The function cDevice::Receiving() now returns true if there is any receiver
+    attached to the device. Its boolean parameter has no meaning any more.
+  + The default value for the Priority parameter of the function cDevice::ProvidesChannel()
+    has been changed to IDLEPRIORITY.
+- Added a Query parameter to cDevice::GetDevice(), so that devices can be queried
+  without side effects when zapping.
+- Replaced min(max()) calls with the new function constrain().
+- Fixed handling OSD color button texts in case a menu item has texts of its own
+  (reported by Rolf Ahrenberg). If a plugin creates derived cMenuEditItems that set
+  color button texts, these should not set the texts directly by calling
+  cSkinDisplay::Current()->SetButtons(), but rather call the new member function
+  cMenuEditItem::SetHelp().
+- Moved the call to cStatus::MsgChannelSwitch(this, 0) to the beginning of
+  cDevice::SetChannel(), so that any receivers that have been attached to the
+  device by plugins may be detached before the final call to GetDevice().
+  This actually reverts "Only calling cStatus::MsgChannelSwitch() if a channel
+  is actually going to be switched or has actually been switched successfully"
+  which was made in version 1.1.10, so please report if this has any unwanted
+  side effects.
diff -ruN vdr-1.7.24/INSTALL vdr-1.7.25/INSTALL
--- vdr-1.7.24/INSTALL	2012-02-16 11:23:32.000000000 +0100
+++ vdr-1.7.25/INSTALL	2012-02-27 12:03:14.000000000 +0100
@@ -47,15 +47,12 @@
 to one of the following values in the 'make' call to make the respective control
 the default:
 
-  REMOTE=RCU    control via the "Remote Control Unit" receiver
-                (see http://www.tvdr.de/remote.htm)
   REMOTE=LIRC   control via the "Linux Infrared Remote Control"
                 (see http://www.lirc.org)
 
-Alternatively you can use the '--rcu' or '--lirc' options at runtime.
-These options accept an optional path to the remote control device,
-the defaults of which can be set via the RCU_DEVICE and LIRC_DEVICE macros,
-respectively.
+Alternatively you can use the '--lirc' option at runtime.
+This option accepts an optional path to the remote control device,
+the default of which can be set via the LIRC_DEVICE macro.
 
 If your video directory will be on a VFAT partition, you can call VDR with
 the command line option '--vfat'.
diff -ruN vdr-1.7.24/MANUAL vdr-1.7.25/MANUAL
--- vdr-1.7.24/MANUAL	2012-01-14 14:03:21.000000000 +0100
+++ vdr-1.7.25/MANUAL	2012-02-25 14:38:52.000000000 +0100
@@ -763,15 +763,6 @@
                          These margins are added automatically to timers that
                          are created from the EPG data.
 
-  Primary limit = 0      The minimum priority a timer must have to be allowed to
-                         use the primary DVB interface, or to force another timer
-                         with higher priority to use the primary DVB interface.
-                         This is mainly useful for recordings that should take
-                         place only when there is nothing else to do, but should
-                         never keep the user from viewing stuff on the primary
-                         interface. On systems with only one DVB card, timers
-                         with a priority below PrimaryLimit will never execute.
-
   Default priority = 50  The default Priority and Lifetime values used when
   Default lifetime = 99  creating a new timer event. A Lifetime value of 99
                          means that this recording will never be deleted
diff -ruN vdr-1.7.24/Make.config.template vdr-1.7.25/Make.config.template
--- vdr-1.7.24/Make.config.template	2012-01-18 13:20:51.000000000 +0100
+++ vdr-1.7.25/Make.config.template	2012-02-27 11:56:28.000000000 +0100
@@ -6,7 +6,7 @@
 # See the main source file 'vdr.c' for copyright information and
 # how to reach the author.
 #
-# $Id: Make.config.template 2.5 2012/01/18 12:20:51 kls Exp $
+# $Id: Make.config.template 2.6 2012/02/27 10:56:28 kls Exp $
 
 ### The C compiler and options:
 
@@ -37,7 +37,6 @@
 ### The remote control:
 
 LIRC_DEVICE ?= /var/run/lirc/lircd
-RCU_DEVICE  ?= /dev/ttyS1
 
 ## Define if you want vdr to not run as root
 #VDR_USER ?= vdr
diff -ruN vdr-1.7.24/Makefile vdr-1.7.25/Makefile
--- vdr-1.7.24/Makefile	2012-01-18 13:19:37.000000000 +0100
+++ vdr-1.7.25/Makefile	2012-02-27 11:54:38.000000000 +0100
@@ -4,7 +4,7 @@
 # See the main source file 'vdr.c' for copyright information and
 # how to reach the author.
 #
-# $Id: Makefile 2.24 2012/01/18 12:19:37 kls Exp $
+# $Id: Makefile 2.25 2012/02/27 10:54:38 kls Exp $
 
 .DELETE_ON_ERROR:
 
@@ -42,7 +42,7 @@
 
 OBJS = audio.o channels.o ci.o config.o cutter.o device.o diseqc.o dvbdevice.o dvbci.o\
        dvbplayer.o dvbspu.o dvbsubtitle.o eit.o eitscan.o epg.o filter.o font.o i18n.o interface.o keys.o\
-       lirc.o menu.o menuitems.o nit.o osdbase.o osd.o pat.o player.o plugin.o rcu.o\
+       lirc.o menu.o menuitems.o nit.o osdbase.o osd.o pat.o player.o plugin.o\
        receiver.o recorder.o recording.o remote.o remux.o ringbuffer.o sdt.o sections.o shutdown.o\
        skinclassic.o skins.o skinsttng.o sourceparams.o sources.o spu.o status.o svdrp.o themes.o thread.o\
        timers.o tools.o transfer.o vdr.o videodir.o
@@ -63,9 +63,8 @@
 endif
 
 LIRC_DEVICE ?= /var/run/lirc/lircd
-RCU_DEVICE  ?= /dev/ttyS1
 
-DEFINES += -DLIRC_DEVICE=\"$(LIRC_DEVICE)\" -DRCU_DEVICE=\"$(RCU_DEVICE)\"
+DEFINES += -DLIRC_DEVICE=\"$(LIRC_DEVICE)\"
 
 DEFINES += -D_GNU_SOURCE
 
diff -ruN vdr-1.7.24/PLUGINS/src/dvbhddevice/dvbhdffdevice.c vdr-1.7.25/PLUGINS/src/dvbhddevice/dvbhdffdevice.c
--- vdr-1.7.24/PLUGINS/src/dvbhddevice/dvbhdffdevice.c	2012-02-15 14:14:49.000000000 +0100
+++ vdr-1.7.25/PLUGINS/src/dvbhddevice/dvbhdffdevice.c	2012-02-28 10:18:56.000000000 +0100
@@ -3,7 +3,7 @@
  *
  * See the README file for copyright information and how to reach the author.
  *
- * $Id: dvbhdffdevice.c 1.39 2012/02/15 13:14:49 kls Exp $
+ * $Id: dvbhdffdevice.c 1.40 2012/02/28 09:18:56 kls Exp $
  */
 
 #include <stdint.h>
@@ -48,6 +48,25 @@
      devHdffOffset = adapter;
      isHdffPrimary = true;
      mHdffCmdIf = new HDFF::cHdffCmdIf(fd_osd);
+
+     /* reset some stuff in case the VDR was killed before and had no chance
+	to clean up. */
+     mHdffCmdIf->CmdOsdReset();
+
+     mHdffCmdIf->CmdAvSetVideoSpeed(0, 100);
+     mHdffCmdIf->CmdAvSetAudioSpeed(0, 100);
+
+     mHdffCmdIf->CmdAvEnableVideoAfterStop(0, false);
+     mHdffCmdIf->CmdAvSetPcrPid(0, 0);
+     mHdffCmdIf->CmdAvSetVideoPid(0, 0, HDFF_VIDEO_STREAM_MPEG1);
+     mHdffCmdIf->CmdAvSetAudioPid(0, 0, HDFF_AUDIO_STREAM_MPEG1);
+
+     ioctl(fd_video, VIDEO_SELECT_SOURCE, VIDEO_SOURCE_DEMUX);
+     mHdffCmdIf->CmdAvSetDecoderInput(0, 0);
+     mHdffCmdIf->CmdAvEnableSync(0, true);
+     mHdffCmdIf->CmdAvSetPlayMode(0, true);
+     /* reset done */
+
      mHdffCmdIf->CmdAvSetAudioDelay(gHdffSetup.AudioDelay);
      mHdffCmdIf->CmdAvSetAudioDownmix((HdffAudioDownmixMode_t) gHdffSetup.AudioDownmix);
      mHdffCmdIf->CmdMuxSetVideoOut((HdffVideoOut_t) gHdffSetup.AnalogueVideo);
diff -ruN vdr-1.7.24/PLUGINS/src/dvbhddevice/hdffcmd.c vdr-1.7.25/PLUGINS/src/dvbhddevice/hdffcmd.c
--- vdr-1.7.24/PLUGINS/src/dvbhddevice/hdffcmd.c	2012-02-06 12:08:48.000000000 +0100
+++ vdr-1.7.25/PLUGINS/src/dvbhddevice/hdffcmd.c	2012-02-28 10:19:09.000000000 +0100
@@ -3,7 +3,7 @@
  *
  * See the README file for copyright information and how to reach the author.
  *
- * $Id: hdffcmd.c 1.23 2012/02/06 11:08:48 kls Exp $
+ * $Id: hdffcmd.c 1.24 2012/02/28 09:19:09 kls Exp $
  */
 
 #include <stdint.h>
@@ -188,6 +188,7 @@
 
     if (HdffCmdOsdCreateDisplay(mOsdDev, Width, Height, ColorType, &newDisplay) == 0)
         return newDisplay;
+    LOG_ERROR_STR("Error creating display");
     return HDFF_INVALID_HANDLE;
 }
 
@@ -217,7 +218,7 @@
 
 void cHdffCmdIf::CmdOsdRenderDisplay(uint32_t hDisplay)
 {
-    //printf("Render\n");
+    //printf("Render %08X\n", hDisplay);
     HdffCmdOsdRenderDisplay(mOsdDev, hDisplay);
 }
 
@@ -231,6 +232,7 @@
                                   pColors, &newPalette);
     if (err == 0)
         return newPalette;
+    LOG_ERROR_STR("Error creating palette");
     return HDFF_INVALID_HANDLE;
 }
 
@@ -260,6 +262,7 @@
     err = HdffCmdOsdCreateFontFace(mOsdDev, pFontData, DataSize, &newFontFace);
     if (err == 0)
         return newFontFace;
+    LOG_ERROR_STR("Error creating font face");
     return HDFF_INVALID_HANDLE;
 }
 
@@ -278,6 +281,7 @@
     err = HdffCmdOsdCreateFont(mOsdDev, hFontFace, Size, &newFont);
     if (err == 0)
         return newFont;
+    LOG_ERROR_STR("Error creating font");
     return HDFF_INVALID_HANDLE;
 }
 
@@ -316,7 +320,7 @@
                                   int BmpWidth, int BmpHeight, int BmpSize,
                                   HdffColorType_t ColorType, uint32_t hPalette)
 {
-    //printf("Bitmap (%d,%d) %d x %d\n", X, Y, BmpWidth, BmpHeight);
+    //printf("Bitmap %08X (%d,%d) %d x %d, %08X\n", hDisplay, X, Y, BmpWidth, BmpHeight, hPalette);
     HdffCmdOsdDrawBitmap(mOsdDev, hDisplay, X, Y, pBitmap, BmpWidth, BmpHeight,
                          BmpSize, ColorType, hPalette);
 }
diff -ruN vdr-1.7.24/PLUGINS/src/dvbhddevice/libhdffcmd/hdffcmd_osd.c vdr-1.7.25/PLUGINS/src/dvbhddevice/libhdffcmd/hdffcmd_osd.c
--- vdr-1.7.24/PLUGINS/src/dvbhddevice/libhdffcmd/hdffcmd_osd.c	2011-10-16 17:12:49.000000000 +0200
+++ vdr-1.7.25/PLUGINS/src/dvbhddevice/libhdffcmd/hdffcmd_osd.c	2012-02-26 22:47:20.000000000 +0100
@@ -103,10 +103,15 @@
     {
         if (osd_cmd.result_len > 0)
         {
-            *NewDisplay = (resultData[6] << 24)
-                        | (resultData[7] << 16)
-                        | (resultData[8] << 8)
-                        | resultData[9];
+            if (resultData[2] == HDFF_MSG_TYPE_ANSWER)
+            {
+                *NewDisplay = (resultData[6] << 24)
+                            | (resultData[7] << 16)
+                            | (resultData[8] << 8)
+                            | resultData[9];
+            }
+            else
+                err = -1;
         }
     }
     return err;
@@ -295,10 +300,15 @@
     {
         if (osd_cmd.result_len > 0)
         {
-            *NewPalette = (resultData[6] << 24)
-                        | (resultData[7] << 16)
-                        | (resultData[8] << 8)
-                        | resultData[9];
+            if (resultData[2] == HDFF_MSG_TYPE_ANSWER)
+            {
+                *NewPalette = (resultData[6] << 24)
+                            | (resultData[7] << 16)
+                            | (resultData[8] << 8)
+                            | resultData[9];
+            }
+            else
+                err = -1;
         }
     }
     return err;
@@ -400,10 +410,15 @@
     {
         if (osd_cmd.result_len > 0)
         {
-            *NewFontFace = (resultData[6] << 24)
-                         | (resultData[7] << 16)
-                         | (resultData[8] << 8)
-                         | resultData[9];
+            if (resultData[2] == HDFF_MSG_TYPE_ANSWER)
+            {
+                *NewFontFace = (resultData[6] << 24)
+                             | (resultData[7] << 16)
+                             | (resultData[8] << 8)
+                             | resultData[9];
+            }
+            else
+                err = -1;
         }
     }
     return err;
@@ -451,10 +466,15 @@
     {
         if (osd_cmd.result_len > 0)
         {
-            *NewFont = (resultData[6] << 24)
-                     | (resultData[7] << 16)
-                     | (resultData[8] << 8)
-                     | resultData[9];
+            if (resultData[2] == HDFF_MSG_TYPE_ANSWER)
+            {
+                *NewFont = (resultData[6] << 24)
+                         | (resultData[7] << 16)
+                         | (resultData[8] << 8)
+                         | resultData[9];
+            }
+            else
+                err = -1;
         }
     }
     return err;
diff -ruN vdr-1.7.24/PLUGINS/src/pictures/HISTORY vdr-1.7.25/PLUGINS/src/pictures/HISTORY
--- vdr-1.7.24/PLUGINS/src/pictures/HISTORY	2012-02-17 15:01:48.000000000 +0100
+++ vdr-1.7.25/PLUGINS/src/pictures/HISTORY	2012-02-27 12:41:02.000000000 +0100
@@ -67,3 +67,7 @@
 2012-02-17:
 
 - cReadDir::Next() now skips directory entries "." and "..".
+
+2012-02-27: Version 0.1.2
+
+- Removed an obsolete command line option.
diff -ruN vdr-1.7.24/PLUGINS/src/pictures/pictures.c vdr-1.7.25/PLUGINS/src/pictures/pictures.c
--- vdr-1.7.24/PLUGINS/src/pictures/pictures.c	2012-02-17 15:00:48.000000000 +0100
+++ vdr-1.7.25/PLUGINS/src/pictures/pictures.c	2012-02-27 12:40:15.000000000 +0100
@@ -3,7 +3,7 @@
  *
  * See the README file for copyright information and how to reach the author.
  *
- * $Id: pictures.c 2.4 2012/02/17 14:00:48 kls Exp $
+ * $Id: pictures.c 2.5 2012/02/27 11:40:15 kls Exp $
  */
 
 #include <getopt.h>
@@ -11,7 +11,7 @@
 #include "menu.h"
 #include "player.h"
 
-static const char *VERSION       = "0.1.1";
+static const char *VERSION       = "0.1.2";
 static const char *DESCRIPTION   = trNOOP("A simple picture viewer");
 static const char *MAINMENUENTRY = trNOOP("Pictures");
 
@@ -86,7 +86,7 @@
      };
 
   int c;
-  while ((c = getopt_long(argc, argv, "d:s:", long_options, NULL)) != -1) {
+  while ((c = getopt_long(argc, argv, "d:", long_options, NULL)) != -1) {
         switch (c) {
           case 'd': strn0cpy(PictureDirectory, optarg, sizeof(PictureDirectory));
                     break;
diff -ruN vdr-1.7.24/PLUGINS/src/rcu/COPYING vdr-1.7.25/PLUGINS/src/rcu/COPYING
--- vdr-1.7.24/PLUGINS/src/rcu/COPYING	1970-01-01 01:00:00.000000000 +0100
+++ vdr-1.7.25/PLUGINS/src/rcu/COPYING	2012-02-27 11:46:08.000000000 +0100
@@ -0,0 +1,340 @@
+		    GNU GENERAL PUBLIC LICENSE
+		       Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+ 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+			    Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users.  This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it.  (Some other Free Software Foundation software is covered by
+the GNU Lesser General Public License instead.)  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+  To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have.  You must make sure that they, too, receive or can get the
+source code.  And you must show them these terms so they know their
+rights.
+
+  We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+  Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software.  If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+  Finally, any free program is threatened constantly by software
+patents.  We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary.  To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+		    GNU GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License.  The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language.  (Hereinafter, translation is included without limitation in
+the term "modification".)  Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+  1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+  2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) You must cause the modified files to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    b) You must cause any work that you distribute or publish, that in
+    whole or in part contains or is derived from the Program or any
+    part thereof, to be licensed as a whole at no charge to all third
+    parties under the terms of this License.
+
+    c) If the modified program normally reads commands interactively
+    when run, you must cause it, when started running for such
+    interactive use in the most ordinary way, to print or display an
+    announcement including an appropriate copyright notice and a
+    notice that there is no warranty (or else, saying that you provide
+    a warranty) and that users may redistribute the program under
+    these conditions, and telling the user how to view a copy of this
+    License.  (Exception: if the Program itself is interactive but
+    does not normally print such an announcement, your work based on
+    the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+    a) Accompany it with the complete corresponding machine-readable
+    source code, which must be distributed under the terms of Sections
+    1 and 2 above on a medium customarily used for software interchange; or,
+
+    b) Accompany it with a written offer, valid for at least three
+    years, to give any third party, for a charge no more than your
+    cost of physically performing source distribution, a complete
+    machine-readable copy of the corresponding source code, to be
+    distributed under the terms of Sections 1 and 2 above on a medium
+    customarily used for software interchange; or,
+
+    c) Accompany it with the information you received as to the offer
+    to distribute corresponding source code.  (This alternative is
+    allowed only for noncommercial distribution and only if you
+    received the program in object code or executable form with such
+    an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it.  For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable.  However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License.  Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+  5. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Program or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+  6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+  7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded.  In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+  9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation.  If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+  10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission.  For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this.  Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+			    NO WARRANTY
+
+  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+		     END OF TERMS AND CONDITIONS
+
+	    How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+    Gnomovision version 69, Copyright (C) year name of author
+    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+  `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+  <signature of Ty Coon>, 1 April 1989
+  Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs.  If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.
diff -ruN vdr-1.7.24/PLUGINS/src/rcu/HISTORY vdr-1.7.25/PLUGINS/src/rcu/HISTORY
--- vdr-1.7.24/PLUGINS/src/rcu/HISTORY	1970-01-01 01:00:00.000000000 +0100
+++ vdr-1.7.25/PLUGINS/src/rcu/HISTORY	2012-02-27 11:46:08.000000000 +0100
@@ -0,0 +1,6 @@
+VDR Plugin 'rcu' Revision History
+---------------------------------
+
+2012-02-27: Version 0.0.1
+
+- Initial revision.
diff -ruN vdr-1.7.24/PLUGINS/src/rcu/Makefile vdr-1.7.25/PLUGINS/src/rcu/Makefile
--- vdr-1.7.24/PLUGINS/src/rcu/Makefile	1970-01-01 01:00:00.000000000 +0100
+++ vdr-1.7.25/PLUGINS/src/rcu/Makefile	2012-02-27 11:46:08.000000000 +0100
@@ -0,0 +1,114 @@
+#
+# Makefile for a Video Disk Recorder plugin
+#
+# $Id: Makefile 1.1 2012/02/27 10:46:08 kls Exp $
+
+# The official name of this plugin.
+# This name will be used in the '-P...' option of VDR to load the plugin.
+# By default the main source file also carries this name.
+# IMPORTANT: the presence of this macro is important for the Make.config
+# file. So it must be defined, even if it is not used here!
+#
+PLUGIN = rcu
+
+### The version number of this plugin (taken from the main source file):
+
+VERSION = $(shell grep 'static const char \*VERSION *=' $(PLUGIN).c | awk '{ print $$6 }' | sed -e 's/[";]//g')
+
+### The C++ compiler and options:
+
+CXX      ?= g++
+CXXFLAGS ?= -g -O3 -Wall -Woverloaded-virtual -Wno-parentheses
+
+### The directory environment:
+
+VDRDIR ?= ../../..
+LIBDIR ?= ../../lib
+TMPDIR ?= /tmp
+
+### Make sure that necessary options are included:
+
+include $(VDRDIR)/Make.global
+
+### Allow user defined options to overwrite defaults:
+
+-include $(VDRDIR)/Make.config
+
+### The version number of VDR's plugin API (taken from VDR's "config.h"):
+
+APIVERSION = $(shell sed -ne '/define APIVERSION/s/^.*"\(.*\)".*$$/\1/p' $(VDRDIR)/config.h)
+
+### The name of the distribution archive:
+
+ARCHIVE = $(PLUGIN)-$(VERSION)
+PACKAGE = vdr-$(ARCHIVE)
+
+### Includes and Defines (add further entries here):
+
+INCLUDES += -I$(VDRDIR)/include
+
+DEFINES += -D_GNU_SOURCE -DPLUGIN_NAME_I18N='"$(PLUGIN)"'
+
+### The object files (add further files here):
+
+OBJS = $(PLUGIN).o
+
+### The main target:
+
+all: libvdr-$(PLUGIN).so i18n
+
+### Implicit rules:
+
+%.o: %.c
+	$(CXX) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) $<
+
+### Dependencies:
+
+MAKEDEP = $(CXX) -MM -MG
+DEPFILE = .dependencies
+$(DEPFILE): Makefile
+	@$(MAKEDEP) $(DEFINES) $(INCLUDES) $(OBJS:%.o=%.c) > $@
+
+-include $(DEPFILE)
+
+### Internationalization (I18N):
+
+PODIR     = po
+LOCALEDIR = $(VDRDIR)/locale
+I18Npo    = $(wildcard $(PODIR)/*.po)
+I18Nmsgs  = $(addprefix $(LOCALEDIR)/, $(addsuffix /LC_MESSAGES/vdr-$(PLUGIN).mo, $(notdir $(foreach file, $(I18Npo), $(basename $(file))))))
+I18Npot   = $(PODIR)/$(PLUGIN).pot
+
+%.mo: %.po
+	msgfmt -c -o $@ $<
+
+$(I18Npot): $(wildcard *.c)
+	xgettext -C -cTRANSLATORS --no-wrap --no-location -k -ktr -ktrNOOP --package-name=vdr-$(PLUGIN) --package-version=$(VERSION) --msgid-bugs-address='<see README>' -o $@ $^
+
+%.po: $(I18Npot)
+	msgmerge -U --no-wrap --no-location --backup=none -q $@ $<
+	@touch $@
+
+$(I18Nmsgs): $(LOCALEDIR)/%/LC_MESSAGES/vdr-$(PLUGIN).mo: $(PODIR)/%.mo
+	@mkdir -p $(dir $@)
+	cp $< $@
+
+.PHONY: i18n
+i18n: $(I18Nmsgs) $(I18Npot)
+
+### Targets:
+
+libvdr-$(PLUGIN).so: $(OBJS)
+	$(CXX) $(CXXFLAGS) $(LDFLAGS) -shared $(OBJS) -o $@
+	@cp --remove-destination $@ $(LIBDIR)/$@.$(APIVERSION)
+
+dist: $(I18Npo) clean
+	@-rm -rf $(TMPDIR)/$(ARCHIVE)
+	@mkdir $(TMPDIR)/$(ARCHIVE)
+	@cp -a * $(TMPDIR)/$(ARCHIVE)
+	@tar czf $(PACKAGE).tgz -C $(TMPDIR) $(ARCHIVE)
+	@-rm -rf $(TMPDIR)/$(ARCHIVE)
+	@echo Distribution package created as $(PACKAGE).tgz
+
+clean:
+	@-rm -f $(OBJS) $(DEPFILE) *.so *.tgz core* *~ $(PODIR)/*.mo $(PODIR)/*.pot
diff -ruN vdr-1.7.24/PLUGINS/src/rcu/README vdr-1.7.25/PLUGINS/src/rcu/README
--- vdr-1.7.24/PLUGINS/src/rcu/README	1970-01-01 01:00:00.000000000 +0100
+++ vdr-1.7.25/PLUGINS/src/rcu/README	2012-02-27 13:24:10.000000000 +0100
@@ -0,0 +1,19 @@
+This is a "plugin" for the Video Disk Recorder (VDR).
+
+Written by:                  Klaus Schmidinger <Klaus.Schmidinger@tvdr.de>
+
+Project's homepage:          http://www.tvdr.de/remote.htm
+
+Latest version available at: http://www.tvdr.de
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+See the file COPYING for more information.
+
+Description:
+============
+
+The "Remote Control Unit" used to be part of the core VDR source
+code, and has been moved into a separate plugin in version 1.7.25.
diff -ruN vdr-1.7.24/PLUGINS/src/rcu/rcu.c vdr-1.7.25/PLUGINS/src/rcu/rcu.c
--- vdr-1.7.24/PLUGINS/src/rcu/rcu.c	1970-01-01 01:00:00.000000000 +0100
+++ vdr-1.7.25/PLUGINS/src/rcu/rcu.c	2012-02-27 12:49:51.000000000 +0100
@@ -0,0 +1,420 @@
+/*
+ * rcu.c: A plugin for the Video Disk Recorder
+ *
+ * See the README file for copyright information and how to reach the author.
+ *
+ * $Id: rcu.c 1.1 2012/02/27 11:49:51 kls Exp $
+ */
+
+#include <getopt.h>
+#include <netinet/in.h>
+#include <termios.h>
+#include <unistd.h>
+#include <vdr/plugin.h>
+#include <vdr/remote.h>
+#include <vdr/status.h>
+#include <vdr/thread.h>
+#include <vdr/tools.h>
+
+static const char *VERSION        = "0.0.1";
+static const char *DESCRIPTION    = "Remote Control Unit";
+
+#define REPEATLIMIT      150 // ms
+#define REPEATDELAY      350 // ms
+#define HANDSHAKETIMEOUT  20 // ms
+#define DEFAULTDEVICE    "/dev/ttyS1"
+
+class cRcuRemote : public cRemote, private cThread, private cStatus {
+private:
+  enum { modeH = 'h', modeB = 'b', modeS = 's' };
+  int f;
+  unsigned char dp, code, mode;
+  int number;
+  unsigned int data;
+  bool receivedCommand;
+  bool SendCommand(unsigned char Cmd);
+  int ReceiveByte(int TimeoutMs = 0);
+  bool SendByteHandshake(unsigned char c);
+  bool SendByte(unsigned char c);
+  bool SendData(unsigned int n);
+  void SetCode(unsigned char Code);
+  void SetMode(unsigned char Mode);
+  void SetNumber(int n, bool Hex = false);
+  void SetPoints(unsigned char Dp, bool On);
+  void SetString(const char *s);
+  bool DetectCode(unsigned char *Code);
+  virtual void Action(void);
+  virtual void ChannelSwitch(const cDevice *Device, int ChannelNumber);
+  virtual void Recording(const cDevice *Device, const char *Name, const char *FileName, bool On);
+public:
+  cRcuRemote(const char *DeviceName);
+  virtual ~cRcuRemote();
+  virtual bool Ready(void);
+  virtual bool Initialize(void);
+  };
+
+cRcuRemote::cRcuRemote(const char *DeviceName)
+:cRemote("RCU")
+,cThread("RCU remote control")
+{
+  dp = 0;
+  mode = modeB;
+  code = 0;
+  number = 0;
+  data = 0;
+  receivedCommand = false;
+  if ((f = open(DeviceName, O_RDWR | O_NONBLOCK)) >= 0) {
+     struct termios t;
+     if (tcgetattr(f, &t) == 0) {
+        cfsetspeed(&t, B9600);
+        cfmakeraw(&t);
+        if (tcsetattr(f, TCSAFLUSH, &t) == 0) {
+           SetNumber(8888);
+           const char *Setup = GetSetup();
+           if (Setup) {
+              code = *Setup;
+              SetCode(code);
+              isyslog("connecting to %s remote control using code %c", Name(), code);
+              }
+           Start();
+           return;
+           }
+        }
+     LOG_ERROR_STR(DeviceName);
+     close(f);
+     }
+  else
+     LOG_ERROR_STR(DeviceName);
+  f = -1;
+}
+
+cRcuRemote::~cRcuRemote()
+{
+  Cancel();
+}
+
+bool cRcuRemote::Ready(void)
+{
+  return f >= 0;
+}
+
+bool cRcuRemote::Initialize(void)
+{
+  if (f >= 0) {
+     unsigned char Code = '0';
+     isyslog("trying codes for %s remote control...", Name());
+     for (;;) {
+         if (DetectCode(&Code)) {
+            code = Code;
+            break;
+            }
+         }
+     isyslog("established connection to %s remote control using code %c", Name(), code);
+     char buffer[16];
+     snprintf(buffer, sizeof(buffer), "%c", code);
+     PutSetup(buffer);
+     return true;
+     }
+  return false;
+}
+
+void cRcuRemote::Action(void)
+{
+#pragma pack(1)
+  union {
+    struct {
+      unsigned short address;
+      unsigned int command;
+      } data;
+    unsigned char raw[6];
+    } buffer;
+#pragma pack()
+
+  time_t LastCodeRefresh = 0;
+  cTimeMs FirstTime;
+  unsigned char LastCode = 0, LastMode = 0;
+  uint64_t LastCommand = ~0; // 0x00 might be a valid command
+  unsigned int LastData = 0;
+  bool repeat = false;
+
+  while (Running() && f >= 0) {
+        if (ReceiveByte(REPEATLIMIT) == 'X') {
+           for (int i = 0; i < 6; i++) {
+               int b = ReceiveByte();
+               if (b >= 0) {
+                  buffer.raw[i] = b;
+                  if (i == 5) {
+                     unsigned short Address = ntohs(buffer.data.address); // the PIC sends bytes in "network order"
+                     uint64_t       Command = ntohl(buffer.data.command);
+                     if (code == 'B' && Address == 0x0000 && Command == 0x00004000)
+                        // Well, well, if it isn't the "d-box"...
+                        // This remote control sends the above command before and after
+                        // each keypress - let's just drop this:
+                        break;
+                     Command |= uint64_t(Address) << 32;
+                     if (Command != LastCommand) {
+                        LastCommand = Command;
+                        repeat = false;
+                        FirstTime.Set();
+                        }
+                     else {
+                        if (FirstTime.Elapsed() < REPEATDELAY)
+                           break; // repeat function kicks in after a short delay
+                        repeat = true;
+                        }
+                     Put(Command, repeat);
+                     receivedCommand = true;
+                     }
+                  }
+               else
+                  break;
+               }
+           }
+        else if (repeat) { // the last one was a repeat, so let's generate a release
+           Put(LastCommand, false, true);
+           repeat = false;
+           LastCommand = ~0;
+           }
+        else {
+           unsigned int d = data;
+           if (d != LastData) {
+              SendData(d);
+              LastData = d;
+              }
+           unsigned char c = code;
+           if (c != LastCode) {
+              SendCommand(c);
+              LastCode = c;
+              }
+           unsigned char m = mode;
+           if (m != LastMode) {
+              SendCommand(m);
+              LastMode = m;
+              }
+           LastCommand = ~0;
+           }
+        if (!repeat && code && time(NULL) - LastCodeRefresh > 60) {
+           SendCommand(code); // in case the PIC listens to the wrong code
+           LastCodeRefresh = time(NULL);
+           }
+        }
+}
+
+int cRcuRemote::ReceiveByte(int TimeoutMs)
+{
+  // Returns the byte if one was received within a timeout, -1 otherwise
+  if (cFile::FileReady(f, TimeoutMs)) {
+     unsigned char b;
+     if (safe_read(f, &b, 1) == 1)
+        return b;
+     else
+        LOG_ERROR;
+     }
+  return -1;
+}
+
+bool cRcuRemote::SendByteHandshake(unsigned char c)
+{
+  if (f >= 0) {
+     int w = write(f, &c, 1);
+     if (w == 1) {
+        for (int reply = ReceiveByte(HANDSHAKETIMEOUT); reply >= 0;) {
+            if (reply == c)
+               return true;
+            else if (reply == 'X') {
+               // skip any incoming RC code - it will come again
+               for (int i = 6; i--;) {
+                   if (ReceiveByte() < 0)
+                      return false;
+                   }
+               }
+            else
+               return false;
+            }
+        }
+     LOG_ERROR;
+     }
+  return false;
+}
+
+bool cRcuRemote::SendByte(unsigned char c)
+{
+  for (int retry = 5; retry--;) {
+      if (SendByteHandshake(c))
+         return true;
+      }
+  return false;
+}
+
+bool cRcuRemote::SendData(unsigned int n)
+{
+  for (int i = 0; i < 4; i++) {
+      if (!SendByte(n & 0x7F))
+         return false;
+      n >>= 8;
+      }
+  return SendCommand(mode);
+}
+
+void cRcuRemote::SetCode(unsigned char Code)
+{
+  code = Code;
+}
+
+void cRcuRemote::SetMode(unsigned char Mode)
+{
+  mode = Mode;
+}
+
+bool cRcuRemote::SendCommand(unsigned char Cmd)
+{
+  return SendByte(Cmd | 0x80);
+}
+
+void cRcuRemote::SetNumber(int n, bool Hex)
+{
+  number = n;
+  if (!Hex) {
+     char buf[8];
+     sprintf(buf, "%4d", n & 0xFFFF);
+     n = 0;
+     for (char *d = buf; *d; d++) {
+         if (*d == ' ')
+            *d = 0xF;
+         n = (n << 4) | ((*d - '0') & 0x0F);
+         }
+     }
+  unsigned int m = 0;
+  for (int i = 0; i < 4; i++) {
+      m <<= 8;
+      m |= ((i & 0x03) << 5) | (n & 0x0F) | (((dp >> i) & 0x01) << 4);
+      n >>= 4;
+      }
+  data = m;
+}
+
+void cRcuRemote::SetString(const char *s)
+{
+  const char *chars = mode == modeH ? "0123456789ABCDEF" : "0123456789-EHLP ";
+  int n = 0;
+
+  for (int i = 0; *s && i < 4; s++, i++) {
+      n <<= 4;
+      for (const char *c = chars; *c; c++) {
+          if (*c == *s) {
+             n |= c - chars;
+             break;
+             }
+          }
+      }
+  SetNumber(n, true);
+}
+
+void cRcuRemote::SetPoints(unsigned char Dp, bool On)
+{
+  if (On)
+     dp |= Dp;
+  else
+     dp &= ~Dp;
+  SetNumber(number);
+}
+
+bool cRcuRemote::DetectCode(unsigned char *Code)
+{
+  // Caller should initialize 'Code' to 0 and call DetectCode()
+  // until it returns true. Whenever DetectCode() returns false
+  // and 'Code' is not 0, the caller can use 'Code' to display
+  // a message like "Trying code '%c'". If false is returned and
+  // 'Code' is 0, all possible codes have been tried and the caller
+  // can either stop calling DetectCode() (and give some error
+  // message), or start all over again.
+  if (*Code < 'A' || *Code > 'D') {
+     *Code = 'A';
+     return false;
+     }
+  if (*Code <= 'D') {
+     SetMode(modeH);
+     char buf[5];
+     sprintf(buf, "C0D%c", *Code);
+     SetString(buf);
+     SetCode(*Code);
+     cCondWait::SleepMs(2 * REPEATDELAY);
+     if (receivedCommand) {
+        SetMode(modeB);
+        SetString("----");
+        return true;
+        }
+     if (*Code < 'D') {
+        (*Code)++;
+        return false;
+        }
+     }
+  *Code = 0;
+  return false;
+}
+
+void cRcuRemote::ChannelSwitch(const cDevice *Device, int ChannelNumber)
+{
+  if (ChannelNumber && Device->IsPrimaryDevice())
+     SetNumber(cDevice::CurrentChannel());
+}
+
+void cRcuRemote::Recording(const cDevice *Device, const char *Name, const char *FileName, bool On)
+{
+  SetPoints(1 << Device->DeviceNumber(), Device->Receiving());
+}
+
+class cPluginRcu : public cPlugin {
+private:
+  // Add any member variables or functions you may need here.
+  const char *device;
+public:
+  cPluginRcu(void);
+  virtual const char *Version(void) { return VERSION; }
+  virtual const char *Description(void) { return DESCRIPTION; }
+  virtual const char *CommandLineHelp(void);
+  virtual bool ProcessArgs(int argc, char *argv[]);
+  virtual bool Start(void);
+  };
+
+cPluginRcu::cPluginRcu(void)
+{
+  // Initialize any member variables here.
+  // DON'T DO ANYTHING ELSE THAT MAY HAVE SIDE EFFECTS, REQUIRE GLOBAL
+  // VDR OBJECTS TO EXIST OR PRODUCE ANY OUTPUT!
+  device = DEFAULTDEVICE;
+}
+
+const char *cPluginRcu::CommandLineHelp(void)
+{
+  // Return a string that describes all known command line options.
+  return "  -d DEV,   --device=DEV   set the device to use (default is " DEFAULTDEVICE ")\n";
+}
+
+bool cPluginRcu::ProcessArgs(int argc, char *argv[])
+{
+  // Implement command line argument processing here if applicable.
+  static struct option long_options[] = {
+       { "dev",      required_argument, NULL, 'd' },
+       { NULL,       no_argument,       NULL,  0  }
+     };
+
+  int c;
+  while ((c = getopt_long(argc, argv, "d:", long_options, NULL)) != -1) {
+        switch (c) {
+          case 'd': device = optarg;
+                    break;
+          default:  return false;
+          }
+        }
+  return true;
+}
+
+bool cPluginRcu::Start(void)
+{
+  // Start any background activities the plugin shall perform.
+  new cRcuRemote(device);
+  return true;
+}
+
+VDRPLUGINCREATOR(cPluginRcu); // Don't touch this!
diff -ruN vdr-1.7.24/PLUGINS.html vdr-1.7.25/PLUGINS.html
--- vdr-1.7.24/PLUGINS.html	2012-01-18 10:08:20.000000000 +0100
+++ vdr-1.7.25/PLUGINS.html	2012-03-01 10:52:01.000000000 +0100
@@ -555,6 +555,8 @@
 
 <hr><h2><a name="Logging">Logging</a></h2>
 
+<div class="blurb">Traces in the sand...</div><p>
+
 <p>
 If the plugin should print log messages, you can use <tt>dsyslog()</tt>, <tt>isyslog()</tt> or <tt>esyslog()</tt>.<br>
 <ul>
@@ -1507,7 +1509,10 @@
 The above example sets up a receiver that wants to receive data from only one
 PID (for example the Teletext PID). In order to not interfere with other recording
 operations, it sets its priority to <tt>-1</tt> (any negative value will allow
-a <tt>cReceiver</tt> to be detached from its <tt>cDevice</tt> at any time.
+a <tt>cReceiver</tt> to be detached from its <tt>cDevice</tt> at any time
+<div class="modified">
+in favor of a timer recording or live viewing).
+</div modified>
 <p>
 Once a <tt>cReceiver</tt> has been created, it needs to be <i>attached</i> to
 a <tt>cDevice</tt>:
diff -ruN vdr-1.7.24/ci.c vdr-1.7.25/ci.c
--- vdr-1.7.24/ci.c	2011-05-21 17:21:33.000000000 +0200
+++ vdr-1.7.25/ci.c	2012-02-29 11:24:41.000000000 +0100
@@ -4,7 +4,7 @@
  * See the main source file 'vdr.c' for copyright information and
  * how to reach the author.
  *
- * $Id: ci.c 2.7 2011/05/21 15:21:33 kls Exp $
+ * $Id: ci.c 2.8 2012/02/29 10:24:41 kls Exp $
  */
 
 #include "ci.h"
@@ -1841,7 +1841,7 @@
 int cCamSlot::Priority(void)
 {
   cDevice *d = Device();
-  return d ? d->Priority() : -1;
+  return d ? d->Priority() : IDLEPRIORITY;
 }
 
 bool cCamSlot::ProvidesCa(const int *CaSystemIds)
diff -ruN vdr-1.7.24/ci.h vdr-1.7.25/ci.h
--- vdr-1.7.24/ci.h	2011-12-04 14:38:17.000000000 +0100
+++ vdr-1.7.25/ci.h	2012-02-29 11:24:27.000000000 +0100
@@ -4,7 +4,7 @@
  * See the main source file 'vdr.c' for copyright information and
  * how to reach the author.
  *
- * $Id: ci.h 2.1 2011/12/04 13:38:17 kls Exp $
+ * $Id: ci.h 2.2 2012/02/29 10:24:27 kls Exp $
  */
 
 #ifndef __CI_H
@@ -192,7 +192,7 @@
        ///< Gets a pending enquiry, or NULL if there is no enquiry.
   int Priority(void);
        ///< Returns the priority if the device this slot is currently assigned
-       ///< to, or -1 if it is not assigned to any device.
+       ///< to, or IDLEPRIORITY if it is not assigned to any device.
   bool ProvidesCa(const int *CaSystemIds);
        ///< Returns true if the CAM in this slot provides one of the given
        ///< CaSystemIds. This doesn't necessarily mean that it will be
diff -ruN vdr-1.7.24/config.c vdr-1.7.25/config.c
--- vdr-1.7.24/config.c	2012-01-14 14:04:59.000000000 +0100
+++ vdr-1.7.25/config.c	2012-02-29 11:15:54.000000000 +0100
@@ -4,7 +4,7 @@
  * See the main source file 'vdr.c' for copyright information and
  * how to reach the author.
  *
- * $Id: config.c 2.18 2012/01/14 13:04:59 kls Exp $
+ * $Id: config.c 2.20 2012/02/29 10:15:54 kls Exp $
  */
 
 #include "config.h"
@@ -406,9 +406,8 @@
   SVDRPTimeout = 300;
   ZapTimeout = 3;
   ChannelEntryTimeout = 1000;
-  PrimaryLimit = 0;
   DefaultPriority = 50;
-  DefaultLifetime = 99;
+  DefaultLifetime = MAXLIFETIME;
   PauseKeyHandling = 2;
   PausePriority = 10;
   PauseLifetime = 1;
@@ -601,7 +600,6 @@
   else if (!strcasecmp(Name, "SVDRPTimeout"))        SVDRPTimeout       = atoi(Value);
   else if (!strcasecmp(Name, "ZapTimeout"))          ZapTimeout         = atoi(Value);
   else if (!strcasecmp(Name, "ChannelEntryTimeout")) ChannelEntryTimeout= atoi(Value);
-  else if (!strcasecmp(Name, "PrimaryLimit"))        PrimaryLimit       = atoi(Value);
   else if (!strcasecmp(Name, "DefaultPriority"))     DefaultPriority    = atoi(Value);
   else if (!strcasecmp(Name, "DefaultLifetime"))     DefaultLifetime    = atoi(Value);
   else if (!strcasecmp(Name, "PauseKeyHandling"))    PauseKeyHandling   = atoi(Value);
@@ -699,7 +697,6 @@
   Store("SVDRPTimeout",       SVDRPTimeout);
   Store("ZapTimeout",         ZapTimeout);
   Store("ChannelEntryTimeout",ChannelEntryTimeout);
-  Store("PrimaryLimit",       PrimaryLimit);
   Store("DefaultPriority",    DefaultPriority);
   Store("DefaultLifetime",    DefaultLifetime);
   Store("PauseKeyHandling",   PauseKeyHandling);
diff -ruN vdr-1.7.24/config.h vdr-1.7.25/config.h
--- vdr-1.7.24/config.h	2012-01-16 10:50:03.000000000 +0100
+++ vdr-1.7.25/config.h	2012-02-29 13:28:01.000000000 +0100
@@ -4,7 +4,7 @@
  * See the main source file 'vdr.c' for copyright information and
  * how to reach the author.
  *
- * $Id: config.h 2.40 2012/01/16 09:50:03 kls Exp $
+ * $Id: config.h 2.43 2012/02/29 12:28:01 kls Exp $
  */
 
 #ifndef __CONFIG_H
@@ -22,13 +22,13 @@
 
 // VDR's own version number:
 
-#define VDRVERSION  "1.7.24"
-#define VDRVERSNUM   10724  // Version * 10000 + Major * 100 + Minor
+#define VDRVERSION  "1.7.25"
+#define VDRVERSNUM   10725  // Version * 10000 + Major * 100 + Minor
 
 // The plugin API's version number:
 
-#define APIVERSION  "1.7.24"
-#define APIVERSNUM   10724  // Version * 10000 + Major * 100 + Minor
+#define APIVERSION  "1.7.25"
+#define APIVERSNUM   10725  // Version * 10000 + Major * 100 + Minor
 
 // When loading plugins, VDR searches them by their APIVERSION, which
 // may be smaller than VDRVERSION in case there have been no changes to
@@ -36,8 +36,12 @@
 // plugins to work with newer versions of the core VDR as long as no
 // VDR header files have changed.
 
-#define MAXPRIORITY 99
-#define MAXLIFETIME 99
+#define MAXPRIORITY       99
+#define MINPRIORITY       (-MAXPRIORITY)
+#define LIVEPRIORITY      0                  // priority used when selecting a device for live viewing
+#define TRANSFERPRIORITY  (LIVEPRIORITY - 1) // priority used for actual local Transfer Mode
+#define IDLEPRIORITY      (MINPRIORITY - 1)  // priority of an idle device
+#define MAXLIFETIME       99
 
 #define MINOSDWIDTH   480
 #define MAXOSDWIDTH  1920
@@ -264,7 +268,6 @@
   int SVDRPTimeout;
   int ZapTimeout;
   int ChannelEntryTimeout;
-  int PrimaryLimit;
   int DefaultPriority, DefaultLifetime;
   int PausePriority, PauseLifetime;
   int PauseKeyHandling;
diff -ruN vdr-1.7.24/device.c vdr-1.7.25/device.c
--- vdr-1.7.24/device.c	2012-02-15 14:15:19.000000000 +0100
+++ vdr-1.7.25/device.c	2012-03-03 12:43:05.000000000 +0100
@@ -4,7 +4,7 @@
  * See the main source file 'vdr.c' for copyright information and
  * how to reach the author.
  *
- * $Id: device.c 2.49 2012/02/15 13:15:19 kls Exp $
+ * $Id: device.c 2.55 2012/03/03 11:43:05 kls Exp $
  */
 
 #include "device.h"
@@ -59,9 +59,6 @@
 
 // --- cDevice ---------------------------------------------------------------
 
-// The default priority for non-primary devices:
-#define DEFAULTPRIORITY  -1
-
 // The minimum number of unknown PS1 packets to consider this a "pre 1.3.19 private stream":
 #define MIN_PRE_1_3_19_PRIVATESTREAM 10
 
@@ -229,7 +226,7 @@
   return NumProvidedSystems;
 }
 
-cDevice *cDevice::GetDevice(const cChannel *Channel, int Priority, bool LiveView)
+cDevice *cDevice::GetDevice(const cChannel *Channel, int Priority, bool LiveView, bool Query)
 {
   cDevice *AvoidDevice = avoidDevice;
   avoidDevice = NULL;
@@ -269,7 +266,7 @@
           if (NumUsableSlots && !CamSlots.Get(j)->Assign(device[i], true))
              continue; // CAM slot can't be used with this device
           bool ndr;
-          if (device[i]->ProvidesChannel(Channel, (LiveView && device[i]->IsPrimaryDevice()) ? Setup.PrimaryLimit : Priority, &ndr)) { // this device is basicly able to do the job
+          if (device[i]->ProvidesChannel(Channel, Priority, &ndr)) { // this device is basicly able to do the job
              if (NumUsableSlots && device[i]->CamSlot() && device[i]->CamSlot() != CamSlots.Get(j))
                 ndr = true; // using a different CAM slot requires detaching receivers
              // Put together an integer number that reflects the "impact" using
@@ -284,8 +281,8 @@
              imp <<= 1; imp |= device[i]->Receiving();                                                               // avoid devices that are receiving
              imp <<= 4; imp |= GetClippedNumProvidedSystems(4, device[i]) - 1;                                       // avoid cards which support multiple delivery systems
              imp <<= 1; imp |= device[i] == cTransferControl::ReceiverDevice();                                      // avoid the Transfer Mode receiver device
-             imp <<= 8; imp |= min(max(device[i]->Priority() + MAXPRIORITY, 0), 0xFF);                               // use the device with the lowest priority (+MAXPRIORITY to assure that values -99..99 can be used)
-             imp <<= 8; imp |= min(max((NumUsableSlots ? SlotPriority[j] : 0) + MAXPRIORITY, 0), 0xFF);              // use the CAM slot with the lowest priority (+MAXPRIORITY to assure that values -99..99 can be used)
+             imp <<= 8; imp |= device[i]->Priority() - IDLEPRIORITY;                                                 // use the device with the lowest priority (- IDLEPRIORITY to assure that values -100..99 can be used)
+             imp <<= 8; imp |= (NumUsableSlots ? SlotPriority[j] : IDLEPRIORITY) - IDLEPRIORITY;                     // use the CAM slot with the lowest priority (- IDLEPRIORITY to assure that values -100..99 can be used)
              imp <<= 1; imp |= ndr;                                                                                  // avoid devices if we need to detach existing receivers
              imp <<= 1; imp |= NumUsableSlots ? 0 : device[i]->HasCi();                                              // avoid cards with Common Interface for FTA channels
              imp <<= 1; imp |= device[i]->AvoidRecording();                                                          // avoid SD full featured cards
@@ -304,7 +301,7 @@
       if (!NumUsableSlots)
          break; // no CAM necessary, so just one loop over the devices
       }
-  if (d) {
+  if (d && !Query) {
      if (NeedsDetachReceivers)
         d->DetachAllReceivers();
      if (s) {
@@ -655,7 +652,7 @@
 
 bool cDevice::MaySwitchTransponder(const cChannel *Channel) const
 {
-  return time(NULL) > occupiedTimeout && !Receiving(true) && !(pidHandles[ptAudio].pid || pidHandles[ptVideo].pid || pidHandles[ptDolby].pid);
+  return time(NULL) > occupiedTimeout && !Receiving() && !(pidHandles[ptAudio].pid || pidHandles[ptVideo].pid || pidHandles[ptDolby].pid);
 }
 
 bool cDevice::SwitchChannel(const cChannel *Channel, bool LiveView)
@@ -690,7 +687,7 @@
      cChannel *channel;
      while ((channel = Channels.GetByNumber(n, Direction)) != NULL) {
            // try only channels which are currently available
-           if (GetDevice(channel, 0, true))
+           if (GetDevice(channel, LIVEPRIORITY, true, true))
               break;
            n = channel->Number() + Direction;
            }
@@ -711,13 +708,15 @@
 
 eSetChannelResult cDevice::SetChannel(const cChannel *Channel, bool LiveView)
 {
+  cStatus::MsgChannelSwitch(this, 0);
+
   if (LiveView) {
      StopReplay();
      DELETENULL(liveSubtitle);
      DELETENULL(dvbSubtitleConverter);
      }
 
-  cDevice *Device = (LiveView && IsPrimaryDevice()) ? GetDevice(Channel, 0, LiveView) : this;
+  cDevice *Device = (LiveView && IsPrimaryDevice()) ? GetDevice(Channel, LIVEPRIORITY, true) : this;
 
   bool NeedsTransferMode = Device != this;
 
@@ -728,7 +727,6 @@
 
   if (NeedsTransferMode) {
      if (Device && CanReplay()) {
-        cStatus::MsgChannelSwitch(this, 0); // only report status if we are actually going to switch the channel
         if (Device->SetChannel(Channel, false) == scrOk) // calling SetChannel() directly, not SwitchChannel()!
            cControl::Launch(new cTransferControl(Device, Channel));
         else
@@ -739,7 +737,6 @@
      }
   else {
      Channels.Lock(false);
-     cStatus::MsgChannelSwitch(this, 0); // only report status if we are actually going to switch the channel
      // Stop section handling:
      if (sectionHandler) {
         sectionHandler->SetStatus(false);
@@ -880,7 +877,7 @@
 void cDevice::SetVolume(int Volume, bool Absolute)
 {
   int OldVolume = volume;
-  volume = min(max(Absolute ? Volume : volume + Volume, 0), MAXVOLUME);
+  volume = constrain(Absolute ? Volume : volume + Volume, 0, MAXVOLUME);
   SetVolumeDevice(volume);
   Absolute |= mute;
   cStatus::MsgSetVolume(Absolute ? volume : volume - OldVolume, Absolute);
@@ -1049,7 +1046,8 @@
      int LanguagePreference = INT_MAX; // higher than the maximum possible value
      for (int i = ttSubtitleFirst; i <= ttSubtitleLast; i++) {
          const tTrackId *TrackId = GetTrack(eTrackType(i));
-         if (TrackId && TrackId->id && I18nIsPreferredLanguage(Setup.SubtitleLanguages, TrackId->language, LanguagePreference))
+         if (TrackId && TrackId->id && (I18nIsPreferredLanguage(Setup.SubtitleLanguages, TrackId->language, LanguagePreference) ||
+            (i == ttSubtitleFirst + 8 && !*TrackId->language && LanguagePreference == INT_MAX))) // compatibility mode for old subtitles plugin
             PreferredTrack = eTrackType(i);
          }
      // Make sure we're set to an available subtitle track:
@@ -1495,7 +1493,9 @@
 
 int cDevice::Priority(void) const
 {
-  int priority = IsPrimaryDevice() ? Setup.PrimaryLimit - 1 : DEFAULTPRIORITY;
+  int priority = IDLEPRIORITY;
+  if (IsPrimaryDevice() && !Replaying() && ActualDevice() == PrimaryDevice())
+     priority = TRANSFERPRIORITY; // we use the same value here, no matter whether it's actual Transfer Mode or real live viewing
   cMutexLock MutexLock(&mutexReceiver);
   for (int i = 0; i < MAXRECEIVERS; i++) {
       if (receiver[i])
@@ -1509,11 +1509,11 @@
   return true;
 }
 
-bool cDevice::Receiving(bool CheckAny) const
+bool cDevice::Receiving(bool Dummy) const
 {
   cMutexLock MutexLock(&mutexReceiver);
   for (int i = 0; i < MAXRECEIVERS; i++) {
-      if (receiver[i] && (CheckAny || receiver[i]->priority >= 0)) // cReceiver with priority < 0 doesn't count
+      if (receiver[i])
          return true;
       }
   return false;
diff -ruN vdr-1.7.24/device.h vdr-1.7.25/device.h
--- vdr-1.7.24/device.h	2012-02-14 15:42:42.000000000 +0100
+++ vdr-1.7.25/device.h	2012-03-02 11:23:13.000000000 +0100
@@ -4,7 +4,7 @@
  * See the main source file 'vdr.c' for copyright information and
  * how to reach the author.
  *
- * $Id: device.h 2.33 2012/02/14 14:42:42 kls Exp $
+ * $Id: device.h 2.36 2012/03/02 10:23:13 kls Exp $
  */
 
 #ifndef __DEVICE_H
@@ -139,7 +139,7 @@
          ///< Gets the device with the given Index.
          ///< \param Index must be in the range 0..numDevices-1.
          ///< \return A pointer to the device, or NULL if the Index was invalid.
-  static cDevice *GetDevice(const cChannel *Channel, int Priority, bool LiveView);
+  static cDevice *GetDevice(const cChannel *Channel, int Priority, bool LiveView, bool Query = false);
          ///< Returns a device that is able to receive the given Channel at the
          ///< given Priority, with the least impact on active recordings and
          ///< live viewing. The LiveView parameter tells whether the device will
@@ -153,6 +153,10 @@
          ///< after detaching any receivers because the channel can't be decrypted,
          ///< this device/CAM combination will be skipped in the next call to
          ///< GetDevice().
+         ///< If Query is true, no actual CAM assignments or receiver detachments will
+         ///< be done, so that this function can be called without any side effects
+         ///< in order to just determine whether a device is available for the given
+         ///< Channel.
          ///< See also ProvidesChannel().
   static void SetAvoidDevice(cDevice *Device) { avoidDevice = Device; }
          ///< Sets the given Device to be temporarily avoided in the next call to
@@ -235,12 +239,11 @@
   virtual bool ProvidesTransponderExclusively(const cChannel *Channel) const;
          ///< Returns true if this is the only device that is able to provide
          ///< the given channel's transponder.
-  virtual bool ProvidesChannel(const cChannel *Channel, int Priority = -1, bool *NeedsDetachReceivers = NULL) const;
+  virtual bool ProvidesChannel(const cChannel *Channel, int Priority = IDLEPRIORITY, bool *NeedsDetachReceivers = NULL) const;
          ///< Returns true if this device can provide the given channel.
-         ///< In case the device has cReceivers attached to it or it is the primary
-         ///< device, Priority is used to decide whether the caller's request can
-         ///< be honored.
-         ///< The special Priority value -1 will tell the caller whether this device
+         ///< In case the device has cReceivers attached to it, Priority is used to
+         ///< decide whether the caller's request can be honored.
+         ///< The special Priority value IDLEPRIORITY will tell the caller whether this device
          ///< is principally able to provide the given Channel, regardless of any
          ///< attached cReceivers.
          ///< If NeedsDetachReceivers is given, the resulting value in it will tell the
@@ -719,9 +722,8 @@
   cReceiver *receiver[MAXRECEIVERS];
 public:
   int Priority(void) const;
-      ///< Returns the priority of the current receiving session (0..MAXPRIORITY),
-      ///< or -1 if no receiver is currently active. The primary device will
-      ///< always return at least Setup.PrimaryLimit-1.
+      ///< Returns the priority of the current receiving session (-MAXPRIORITY..MAXPRIORITY),
+      ///< or IDLEPRIORITY if no receiver is currently active.
 protected:
   virtual bool OpenDvr(void);
       ///< Opens the DVR of this device and prepares it to deliver a Transport
@@ -736,8 +738,8 @@
       ///< false in case of a non recoverable error, otherwise it returns true,
       ///< even if Data is NULL.
 public:
-  bool Receiving(bool CheckAny = false) const;
-       ///< Returns true if we are currently receiving.
+  bool Receiving(bool Dummy = false) const;
+       ///< Returns true if we are currently receiving. The parameter has no meaning (for backwards compatibility only).
   bool AttachReceiver(cReceiver *Receiver);
        ///< Attaches the given receiver to this device.
   void Detach(cReceiver *Receiver);
diff -ruN vdr-1.7.24/dvbdevice.c vdr-1.7.25/dvbdevice.c
--- vdr-1.7.24/dvbdevice.c	2012-02-17 13:20:34.000000000 +0100
+++ vdr-1.7.25/dvbdevice.c	2012-02-29 13:23:43.000000000 +0100
@@ -4,7 +4,7 @@
  * See the main source file 'vdr.c' for copyright information and
  * how to reach the author.
  *
- * $Id: dvbdevice.c 2.62 2012/02/17 12:20:34 kls Exp $
+ * $Id: dvbdevice.c 2.65 2012/02/29 12:23:43 kls Exp $
  */
 
 #include "dvbdevice.h"
@@ -420,7 +420,7 @@
   if (cDvbTuner *t = bondedTuner) {
      cString BondingParams = GetBondingParams(Channel);
      do {
-        if (t->device->Receiving() || t->tunerStatus != tsIdle && (t->device == cDevice::ActualDevice() || ConsiderOccupied && t->device->Occupied())) {
+        if (t->device->Receiving() || ConsiderOccupied && t->device->Occupied()) {
            if (strcmp(BondingParams, t->GetBondingParams()) != 0)
               return false;
            }
@@ -1437,14 +1437,14 @@
 bool cDvbDevice::ProvidesChannel(const cChannel *Channel, int Priority, bool *NeedsDetachReceivers) const
 {
   bool result = false;
-  bool hasPriority = Priority < 0 || Priority > this->Priority();
+  bool hasPriority = Priority == IDLEPRIORITY || Priority > this->Priority();
   bool needsDetachReceivers = false;
   needsDetachBondedReceivers = false;
 
   if (dvbTuner && ProvidesTransponder(Channel)) {
      result = hasPriority;
      if (Priority >= 0) {
-        if (Receiving(true)) {
+        if (Receiving()) {
            if (dvbTuner->IsTunedTo(Channel)) {
               if (Channel->Vpid() && !HasPid(Channel->Vpid()) || Channel->Apid(0) && !HasPid(Channel->Apid(0))) {
                  if (CamSlot() && Channel->Ca() >= CA_ENCRYPTED_MIN) {
@@ -1453,16 +1453,14 @@
                     else
                        needsDetachReceivers = true;
                     }
-                 else if (!IsPrimaryDevice())
-                    result = true;
                  else
-                    result = Priority >= Setup.PrimaryLimit;
+                    result = true;
                  }
               else
-                 result = !IsPrimaryDevice() || Priority >= Setup.PrimaryLimit;
+                 result = true;
               }
            else
-              needsDetachReceivers = Receiving(true);
+              needsDetachReceivers = Receiving();
            }
         if (result) {
            if (!BondingOk(Channel)) {
@@ -1474,7 +1472,7 @@
                      }
                   }
               needsDetachBondedReceivers = true;
-              needsDetachReceivers = Receiving(true);
+              needsDetachReceivers = Receiving();
               }
            }
         }
@@ -1591,21 +1589,43 @@
 
 uint32_t cDvbDeviceProbe::GetSubsystemId(int Adapter, int Frontend)
 {
-  cString FileName;
-  cReadLine ReadLine;
-  FILE *f = NULL;
   uint32_t SubsystemId = 0;
-  FileName = cString::sprintf("/sys/class/dvb/dvb%d.frontend%d/device/subsystem_vendor", Adapter, Frontend);
-  if ((f = fopen(FileName, "r")) != NULL) {
-     if (char *s = ReadLine.Read(f))
-        SubsystemId = strtoul(s, NULL, 0) << 16;
-     fclose(f);
-     }
-  FileName = cString::sprintf("/sys/class/dvb/dvb%d.frontend%d/device/subsystem_device", Adapter, Frontend);
-  if ((f = fopen(FileName, "r")) != NULL) {
-     if (char *s = ReadLine.Read(f))
-        SubsystemId |= strtoul(s, NULL, 0);
-     fclose(f);
+  cString FileName = cString::sprintf("/dev/dvb/adapter%d/frontend%d", Adapter, Frontend);
+  struct stat st;
+  if (stat(FileName, &st) == 0) {
+     cReadDir d("/sys/class/dvb");
+     if (d.Ok()) {
+        struct dirent *e;
+        while ((e = d.Next()) != NULL) {
+              if (strstr(e->d_name, "frontend")) {
+                 FileName = cString::sprintf("/sys/class/dvb/%s/dev", e->d_name);
+                 if (FILE *f = fopen(FileName, "r")) {
+                    cReadLine ReadLine;
+                    char *s = ReadLine.Read(f);
+                    fclose(f);
+                    unsigned Major;
+                    unsigned Minor;
+                    if (s && 2 == sscanf(s, "%u:%u", &Major, &Minor)) {
+                       if (((Major << 8) | Minor) == st.st_rdev) {
+                          FileName = cString::sprintf("/sys/class/dvb/%s/device/subsystem_vendor", e->d_name);
+                          if ((f = fopen(FileName, "r")) != NULL) {
+                             if (char *s = ReadLine.Read(f))
+                                SubsystemId = strtoul(s, NULL, 0) << 16;
+                             fclose(f);
+                             }
+                          FileName = cString::sprintf("/sys/class/dvb/%s/device/subsystem_device", e->d_name);
+                          if ((f = fopen(FileName, "r")) != NULL) {
+                             if (char *s = ReadLine.Read(f))
+                                SubsystemId |= strtoul(s, NULL, 0);
+                             fclose(f);
+                             }
+                          break;
+                          }
+                       }
+                    }
+                 }
+              }
+        }
      }
   return SubsystemId;
 }
diff -ruN vdr-1.7.24/dvbdevice.h vdr-1.7.25/dvbdevice.h
--- vdr-1.7.24/dvbdevice.h	2012-02-17 12:18:55.000000000 +0100
+++ vdr-1.7.25/dvbdevice.h	2012-02-29 13:20:51.000000000 +0100
@@ -4,7 +4,7 @@
  * See the main source file 'vdr.c' for copyright information and
  * how to reach the author.
  *
- * $Id: dvbdevice.h 2.23 2012/02/17 11:18:55 kls Exp $
+ * $Id: dvbdevice.h 2.24 2012/02/29 12:20:51 kls Exp $
  */
 
 #ifndef __DVBDEVICE_H
@@ -179,7 +179,7 @@
   virtual bool ProvidesDeliverySystem(int DeliverySystem) const;
   virtual bool ProvidesSource(int Source) const;
   virtual bool ProvidesTransponder(const cChannel *Channel) const;
-  virtual bool ProvidesChannel(const cChannel *Channel, int Priority = -1, bool *NeedsDetachReceivers = NULL) const;
+  virtual bool ProvidesChannel(const cChannel *Channel, int Priority = IDLEPRIORITY, bool *NeedsDetachReceivers = NULL) const;
   virtual bool ProvidesEIT(void) const;
   virtual int NumProvidedSystems(void) const;
   virtual int SignalStrength(void) const;
diff -ruN vdr-1.7.24/dvbplayer.c vdr-1.7.25/dvbplayer.c
--- vdr-1.7.24/dvbplayer.c	2012-02-19 11:48:02.000000000 +0100
+++ vdr-1.7.25/dvbplayer.c	2012-02-21 12:34:04.000000000 +0100
@@ -4,7 +4,7 @@
  * See the main source file 'vdr.c' for copyright information and
  * how to reach the author.
  *
- * $Id: dvbplayer.c 2.23 2012/02/19 10:48:02 kls Exp $
+ * $Id: dvbplayer.c 2.25 2012/02/21 11:34:04 kls Exp $
  */
 
 #include "dvbplayer.h"
@@ -87,7 +87,6 @@
 private:
   cUnbufferedFile *f;
   uchar *buffer;
-  uchar *result;
   int wanted;
   int length;
   cCondWait newSet;
@@ -101,7 +100,7 @@
   void Clear(void);
   void Request(cUnbufferedFile *File, int Length);
   int Result(uchar **Buffer);
-  bool Reading(void) { return result; }
+  bool Reading(void) { return buffer; }
   bool WaitForDataMs(int msToWait);
   };
 
@@ -110,7 +109,6 @@
 {
   f = NULL;
   buffer = NULL;
-  result = NULL;
   wanted = length = 0;
   Start();
 }
@@ -120,7 +118,6 @@
   newSet.Signal();
   Cancel(3);
   free(buffer);
-  free(result);
 }
 
 void cNonBlockingFileReader::Clear(void)
@@ -129,8 +126,6 @@
   f = NULL;
   free(buffer);
   buffer = NULL;
-  free(result);
-  result = NULL;
   wanted = length = 0;
   Unlock();
 }
@@ -142,18 +137,18 @@
   wanted = Length;
   buffer = MALLOC(uchar, wanted);
   f = File;
-  newSet.Signal();
   Unlock();
+  newSet.Signal();
 }
 
 int cNonBlockingFileReader::Result(uchar **Buffer)
 {
   LOCK_THREAD;
-  if (result && length == wanted) {
-     *Buffer = result;
-     result = NULL;
+  if (buffer && length == wanted) {
+     *Buffer = buffer;
+     buffer = NULL;
      return wanted;
-  }
+     }
   errno = EAGAIN;
   return -1;
 }
@@ -177,8 +172,6 @@
               length = wanted = r; // this will forward the error status to the caller
               }
            if (length == wanted) {
-              result = buffer;
-              buffer = NULL;
               cMutexLock NewDataLock(&newDataMutex);
               newDataCond.Broadcast();
               }
@@ -190,9 +183,9 @@
 
 bool cNonBlockingFileReader::WaitForDataMs(int msToWait)
 {
-  if (result && length == wanted)
-     return true;
   cMutexLock NewDataLock(&newDataMutex);
+  if (buffer && length == wanted)
+     return true;
   return newDataCond.TimedWait(newDataMutex, msToWait);
 }
 
@@ -291,6 +284,8 @@
      delete index;
      index = NULL;
      }
+  else if (PauseLive)
+     framesPerSecond = cRecording(FileName).FramesPerSecond(); // the fps rate might have changed from the default
 }
 
 cDvbPlayer::~cDvbPlayer()
@@ -413,13 +408,13 @@
      Goto(0, true);
   while (Running()) {
         if (WaitingForData)
-           nonBlockingFileReader->WaitForDataMs(10); // this keeps the CPU load low, but reacts immediately on new data
+           nonBlockingFileReader->WaitForDataMs(3); // this keeps the CPU load low, but reacts immediately on new data
         else if (Sleep) {
            cPoller Poller;
            DevicePoll(Poller, 10);
            Sleep = false;
            if (playMode == pmStill || playMode == pmPause)
-              cCondWait::SleepMs(10);
+              cCondWait::SleepMs(3);
            }
         {
           LOCK_THREAD;
@@ -481,15 +476,7 @@
                    }
                 if (!eof) {
                    uchar *b = NULL;
-                   int Retries = 5;
-                   int r;
-                   while (true) {
-                         r = nonBlockingFileReader->Result(&b);
-                         if (r == -1 && errno == EAGAIN && --Retries)
-                            nonBlockingFileReader->WaitForDataMs(10); 
-                         else 
-                            break;
-                         }
+                   int r = nonBlockingFileReader->Result(&b);
                    if (r > 0) {
                       WaitingForData = false;
                       uint32_t Pts = 0;
diff -ruN vdr-1.7.24/dvbsubtitle.c vdr-1.7.25/dvbsubtitle.c
--- vdr-1.7.24/dvbsubtitle.c	2012-02-13 10:48:18.000000000 +0100
+++ vdr-1.7.25/dvbsubtitle.c	2012-03-02 11:47:25.000000000 +0100
@@ -7,7 +7,7 @@
  * Original author: Marco Schlüßler <marco@lordzodiac.de>
  * With some input from the "subtitle plugin" by Pekka Virtanen <pekka.virtanen@sci.fi>
  *
- * $Id: dvbsubtitle.c 2.22 2012/02/13 09:48:18 kls Exp $
+ * $Id: dvbsubtitle.c 2.27 2012/03/02 10:47:25 kls Exp $
  */
 
 
@@ -541,7 +541,6 @@
   void SetPts(int64_t Pts) { pts = Pts; }
   void SetState(int State);
   void SetTimeout(int Timeout) { timeout = Timeout; }
-  void UpdateRegionPalette(cSubtitleClut *Clut);
   };
 
 cDvbSubtitlePage::cDvbSubtitlePage(int PageId)
@@ -635,14 +634,6 @@
     }
 }
 
-void cDvbSubtitlePage::UpdateRegionPalette(cSubtitleClut *Clut)
-{
-  for (cSubtitleRegion *sr = regions.First(); sr; sr = regions.Next(sr)) {
-      if (sr->ClutId() == Clut->ClutId())
-         sr->Replace(*Clut->GetPalette(sr->Bpp()));
-      }
-}
-
 // --- cDvbSubtitleAssembler -------------------------------------------------
 
 class cDvbSubtitleAssembler {
@@ -806,7 +797,6 @@
   displayHeight = windowHeight = 576;
   windowHorizontalOffset = 0;
   windowVerticalOffset = 0;
-  SetOsdData();
   pages = new cList<cDvbSubtitlePage>;
   bitmaps = new cList<cDvbSubtitleBitmaps>;
   Start();
@@ -840,7 +830,6 @@
   displayHeight = windowHeight = 576;
   windowHorizontalOffset = 0;
   windowVerticalOffset = 0;
-  SetOsdData();
   Unlock();
 }
 
@@ -980,9 +969,9 @@
   Epb = (Cb - 128);
   Epr = (Cr - 128);
   /* ITU-R 709 */
-  Er = max(min(((298 * Ey             + 460 * Epr) / 256), 255), 0);
-  Eg = max(min(((298 * Ey -  55 * Epb - 137 * Epr) / 256), 255), 0);
-  Eb = max(min(((298 * Ey + 543 * Epb            ) / 256), 255), 0);
+  Er = constrain((298 * Ey             + 460 * Epr) / 256, 0, 255);
+  Eg = constrain((298 * Ey -  55 * Epb - 137 * Epr) / 256, 0, 255);
+  Eb = constrain((298 * Ey + 543 * Epb            ) / 256, 0, 255);
 
   return (Er << 16) | (Eg << 8) | Eb;
 }
@@ -995,7 +984,7 @@
   double VideoAspect;
   cDevice::PrimaryDevice()->GetOsdSize(OsdWidth, OsdHeight, OsdAspect);
   cDevice::PrimaryDevice()->GetVideoSize(VideoWidth, VideoHeight, VideoAspect);
-  if (OsdWidth == displayWidth && OsdHeight == displayHeight || DoubleEqual(VideoAspect, 1.0)) {
+  if (OsdWidth == displayWidth && OsdHeight == displayHeight) {
      osdFactorX = osdFactorY = 1.0;
      osdDeltaX = osdDeltaY = 0;
      }
@@ -1010,7 +999,11 @@
 bool cDvbSubtitleConverter::AssertOsd(void)
 {
   LOCK_THREAD;
-  return osd || (osd = cOsdProvider::NewOsd(int(round(osdFactorX * windowHorizontalOffset + osdDeltaX)), int(round(osdFactorY * windowVerticalOffset + osdDeltaY)) + Setup.SubtitleOffset, OSD_LEVEL_SUBTITLES));
+  if (!osd) {
+     SetOsdData();
+     osd = cOsdProvider::NewOsd(int(round(osdFactorX * windowHorizontalOffset + osdDeltaX)), int(round(osdFactorY * windowVerticalOffset + osdDeltaY)) + Setup.SubtitleOffset, OSD_LEVEL_SUBTITLES);
+     }
+  return osd != NULL;
 }
 
 int cDvbSubtitleConverter::ExtractSegment(const uchar *Data, int Length, int64_t Pts)
@@ -1035,7 +1028,7 @@
      if (!page) {
         page = new cDvbSubtitlePage(pageId);
         pages->Add(page);
-        dbgpages("Create SubtitlePage %d  (total pages = %d)\n", pageId, pages->Count());
+        dbgpages("Create SubtitlePage %d (total pages = %d)\n", pageId, pages->Count());
         }
      if (Pts)
         page->SetPts(Pts);
@@ -1112,7 +1105,7 @@
             }
        case CLUT_DEFINITION_SEGMENT: {
             dbgsegments("CLUT_DEFINITION_SEGMENT\n");
-            cSubtitleClut *clut =  page->GetClutById(bs.GetBits(8), true);
+            cSubtitleClut *clut = page->GetClutById(bs.GetBits(8), true);
             int clutVersion = bs.GetBits(4);
             if (clutVersion == clut->Version())
                break; // no update
@@ -1155,7 +1148,6 @@
                      clut->SetColor(8, clutEntryId, value);
                   }
             dbgcluts("\n");
-            page->UpdateRegionPalette(clut);
             break;
             }
        case OBJECT_DATA_SEGMENT: {
@@ -1310,7 +1302,11 @@
   cDvbSubtitleBitmaps *Bitmaps = new cDvbSubtitleBitmaps(Page->Pts(), Page->Timeout(), Areas, NumAreas, osdFactorX, osdFactorY);
   bitmaps->Add(Bitmaps);
   for (cSubtitleRegion *sr = Page->regions.First(); sr; sr = Page->regions.Next(sr)) {
-      sr->UpdateTextData(Page->GetClutById(sr->ClutId()));
+      cSubtitleClut *clut = Page->GetClutById(sr->ClutId());
+      if (!clut)
+         continue;
+      sr->Replace(*clut->GetPalette(sr->Bpp()));
+      sr->UpdateTextData(clut);
       int posX = sr->HorizontalAddress();
       int posY = sr->VerticalAddress();
       if (sr->Width() > 0 && sr->Height() > 0) {
diff -ruN vdr-1.7.24/eit.c vdr-1.7.25/eit.c
--- vdr-1.7.24/eit.c	2010-05-14 16:08:35.000000000 +0200
+++ vdr-1.7.25/eit.c	2012-02-25 16:25:51.000000000 +0100
@@ -8,7 +8,7 @@
  * Robert Schneider <Robert.Schneider@web.de> and Rolf Hakenes <hakenes@hippomi.de>.
  * Adapted to 'libsi' for VDR 1.3.0 by Marcel Wiesweg <marcel.wiesweg@gmx.de>.
  *
- * $Id: eit.c 2.12 2010/05/14 14:08:35 kls Exp $
+ * $Id: eit.c 2.13 2012/02/25 15:25:51 kls Exp $
  */
 
 #include "eit.h"
@@ -38,6 +38,14 @@
      return; // only collect data for known channels
 
   cSchedule *pSchedule = (cSchedule *)Schedules->GetSchedule(channel, true);
+  if (pSchedule) {
+     if (cEvent *Event = pSchedule->Events()->First()) {
+        if (Event->TableID() == 0x00)
+           return; // never touch schedules with events from external sources
+        }
+     }
+  else
+     return;
 
   bool Empty = true;
   bool Modified = false;
diff -ruN vdr-1.7.24/epg.h vdr-1.7.25/epg.h
--- vdr-1.7.24/epg.h	2012-02-11 13:29:55.000000000 +0100
+++ vdr-1.7.25/epg.h	2012-02-26 14:58:26.000000000 +0100
@@ -7,7 +7,7 @@
  * Original version (as used in VDR before 1.3.0) written by
  * Robert Schneider <Robert.Schneider@web.de> and Rolf Hakenes <hakenes@hippomi.de>.
  *
- * $Id: epg.h 2.6 2012/02/11 12:29:55 kls Exp $
+ * $Id: epg.h 2.7 2012/02/26 13:58:26 kls Exp $
  */
 
 #ifndef __EPG_H
@@ -100,7 +100,7 @@
   const char *ShortText(void) const { return shortText; }
   const char *Description(void) const { return description; }
   const cComponents *Components(void) const { return components; }
-  uchar Contents(int i = 0) const { return (0 <= i && i < MaxEventContents) ? contents[i] : 0; }
+  uchar Contents(int i = 0) const { return (0 <= i && i < MaxEventContents) ? contents[i] : uchar(0); }
   int ParentalRating(void) const { return parentalRating; }
   time_t StartTime(void) const { return startTime; }
   time_t EndTime(void) const { return startTime + duration; }
diff -ruN vdr-1.7.24/font.c vdr-1.7.25/font.c
--- vdr-1.7.24/font.c	2012-01-13 10:43:22.000000000 +0100
+++ vdr-1.7.25/font.c	2012-03-02 11:47:45.000000000 +0100
@@ -6,7 +6,7 @@
  *
  * BiDi support by Osama Alrawab <alrawab@hotmail.com> @2008 Tripoli-Libya.
  *
- * $Id: font.c 2.9 2012/01/13 09:43:22 kls Exp $
+ * $Id: font.c 2.10 2012/03/02 10:47:45 kls Exp $
  */
 
 #include "font.h"
@@ -396,7 +396,7 @@
 
 void cFont::SetFont(eDvbFont Font, const char *Name, int CharHeight)
 {
-  cFont *f = CreateFont(Name, min(max(CharHeight, MINFONTSIZE), MAXFONTSIZE));
+  cFont *f = CreateFont(Name, constrain(CharHeight, MINFONTSIZE, MAXFONTSIZE));
   if (!f || !f->Height())
      f = new cDummyFont;
   delete fonts[Font];
diff -ruN vdr-1.7.24/libsi/section.h vdr-1.7.25/libsi/section.h
--- vdr-1.7.24/libsi/section.h	2006-04-14 12:53:44.000000000 +0200
+++ vdr-1.7.25/libsi/section.h	2012-02-26 14:58:26.000000000 +0100
@@ -6,7 +6,7 @@
  *   the Free Software Foundation; either version 2 of the License, or     *
  *   (at your option) any later version.                                   *
  *                                                                         *
- *   $Id: section.h 2.0 2006/04/14 10:53:44 kls Exp $
+ *   $Id: section.h 2.1 2012/02/26 13:58:26 kls Exp $
  *                                                                         *
  ***************************************************************************/
 
@@ -29,7 +29,7 @@
       int getServiceId() const;
       int getPid() const;
       bool isNITPid() const { return getServiceId()==0; }
-      virtual int getLength() { return sizeof(pat_prog); }
+      virtual int getLength() { return int(sizeof(pat_prog)); }
    protected:
       virtual void Parse();
    private:
@@ -61,7 +61,7 @@
       int getPid() const;
       int getStreamType() const;
       DescriptorLoop streamDescriptors;
-      virtual int getLength() { return sizeof(pmt_info)+streamDescriptors.getLength(); }
+      virtual int getLength() { return int(sizeof(pmt_info)+streamDescriptors.getLength()); }
    protected:
       virtual void Parse();
    private:
@@ -96,7 +96,7 @@
    public:
       int getTransportStreamId() const;
       int getOriginalNetworkId() const;
-      virtual int getLength() { return sizeof(ni_ts)+transportStreamDescriptors.getLength(); }
+      virtual int getLength() { return int(sizeof(ni_ts)+transportStreamDescriptors.getLength()); }
       DescriptorLoop transportStreamDescriptors;
    protected:
       virtual void Parse();
@@ -131,7 +131,7 @@
       int getEITpresentFollowingFlag() const;
       RunningStatus getRunningStatus() const;
       int getFreeCaMode() const;
-      virtual int getLength() { return sizeof(sdt_descr)+serviceDescriptors.getLength(); }
+      virtual int getLength() { return int(sizeof(sdt_descr)+serviceDescriptors.getLength()); }
       DescriptorLoop serviceDescriptors;
    protected:
       virtual void Parse();
@@ -168,7 +168,7 @@
       int getFreeCaMode() const;
 
       DescriptorLoop eventDescriptors;
-      virtual int getLength() { return sizeof(eit_event)+eventDescriptors.getLength(); }
+      virtual int getLength() { return int(sizeof(eit_event)+eventDescriptors.getLength()); }
    protected:
       virtual void Parse();
    private:
@@ -225,7 +225,7 @@
       int getServiceId() const;
       int getEventId() const;
       RunningStatus getRunningStatus() const;
-      virtual int getLength() { return sizeof(rst_info); }
+      virtual int getLength() { return int(sizeof(rst_info)); }
    protected:
       virtual void Parse();
    private:
@@ -242,7 +242,7 @@
    AIT() {}
    class Application : public LoopElement {
    public:
-      virtual int getLength() { return sizeof(ait_app)+applicationDescriptors.getLength(); }
+      virtual int getLength() { return int(sizeof(ait_app)+applicationDescriptors.getLength()); }
       long getOrganisationId() const;
       int getApplicationId() const;
       int getControlCode() const;
diff -ruN vdr-1.7.24/libsi/util.h vdr-1.7.25/libsi/util.h
--- vdr-1.7.24/libsi/util.h	2010-11-01 16:24:32.000000000 +0100
+++ vdr-1.7.25/libsi/util.h	2012-02-26 14:58:26.000000000 +0100
@@ -6,7 +6,7 @@
  *   the Free Software Foundation; either version 2 of the License, or     *
  *   (at your option) any later version.                                   *
  *                                                                         *
- *   $Id: util.h 2.2 2010/11/01 15:24:32 kls Exp $
+ *   $Id: util.h 2.3 2012/02/26 13:58:26 kls Exp $
  *                                                                         *
  ***************************************************************************/
 
@@ -54,10 +54,10 @@
    template <typename T> const T* getData(int offset) const { return (T*)(data_->data+offset+off); }
       //sets p to point to data+offset, increments offset
    template <typename T> void setPointerAndOffset(const T* &p, int &offset) const { p=(T*)getData(offset); offset+=sizeof(T); }
-   unsigned char operator[](const int index) const { return data_->data ? data_->data[off+index] : 0; }
+   unsigned char operator[](const int index) const { return data_->data ? data_->data[off+index] : (unsigned char)0; }
    int getLength() const { return data_->size; }
-   u_int16_t TwoBytes(const int index) const { return data_->data ? data_->TwoBytes(off+index) : 0; }
-   u_int32_t FourBytes(const int index) const { return data_->data ? data_->FourBytes(off+index) : 0; }
+   u_int16_t TwoBytes(const int index) const { return data_->data ? data_->TwoBytes(off+index) : u_int16_t(0); }
+   u_int32_t FourBytes(const int index) const { return data_->data ? data_->FourBytes(off+index) : u_int32_t(0); }
 
    bool isValid() const { return data_->valid; }
    bool checkSize(int offset) { return (data_->valid && (data_->valid=(offset>=0 && off+offset < data_->size))); }
@@ -73,9 +73,9 @@
       virtual void Delete() = 0;
 
       u_int16_t TwoBytes(const int index) const
-         { return (data[index] << 8) | data[index+1]; }
+         { return u_int16_t((data[index] << 8) | data[index+1]); }
       u_int32_t FourBytes(const int index) const
-         { return (data[index] << 24) | (data[index+1] << 16) | (data[index+2] << 8) | data[index+3]; }
+         { return u_int32_t((data[index] << 24) | (data[index+1] << 16) | (data[index+2] << 8) | data[index+3]); }
       /*#ifdef CHARARRAY_THREADSAFE
       void Lock();
       void Unlock();
@@ -140,7 +140,7 @@
 namespace DVBTime {
 time_t getTime(unsigned char date_hi, unsigned char date_lo, unsigned char timehr, unsigned char timemi, unsigned char timese);
 time_t getDuration(unsigned char timehr, unsigned char timemi, unsigned char timese);
-inline unsigned char bcdToDec(unsigned char b) { return ((b >> 4) & 0x0F) * 10 + (b & 0x0F); }
+inline unsigned char bcdToDec(unsigned char b) { return (unsigned char)(((b >> 4) & 0x0F) * 10 + (b & 0x0F)); }
 }
 
 //taken and adapted from libdtv, (c) Rolf Hakenes
diff -ruN vdr-1.7.24/menu.c vdr-1.7.25/menu.c
--- vdr-1.7.24/menu.c	2012-02-19 12:37:55.000000000 +0100
+++ vdr-1.7.25/menu.c	2012-03-02 11:33:17.000000000 +0100
@@ -4,7 +4,7 @@
  * See the main source file 'vdr.c' for copyright information and
  * how to reach the author.
  *
- * $Id: menu.c 2.37 2012/02/19 11:37:55 kls Exp $
+ * $Id: menu.c 2.39 2012/03/02 10:33:17 kls Exp $
  */
 
 #include "menu.h"
@@ -3093,7 +3093,6 @@
   SetSection(tr("Recording"));
   Add(new cMenuEditIntItem( tr("Setup.Recording$Margin at start (min)"),     &data.MarginStart));
   Add(new cMenuEditIntItem( tr("Setup.Recording$Margin at stop (min)"),      &data.MarginStop));
-  Add(new cMenuEditIntItem( tr("Setup.Recording$Primary limit"),             &data.PrimaryLimit, 0, MAXPRIORITY));
   Add(new cMenuEditIntItem( tr("Setup.Recording$Default priority"),          &data.DefaultPriority, 0, MAXPRIORITY));
   Add(new cMenuEditIntItem( tr("Setup.Recording$Default lifetime (d)"),      &data.DefaultLifetime, 0, MAXLIFETIME));
   Add(new cMenuEditStraItem(tr("Setup.Recording$Pause key handling"),        &data.PauseKeyHandling, 3, pauseKeyHandlingTexts));
@@ -3654,7 +3653,7 @@
            Channel = Direction > 0 ? Channels.Next(Channel) : Channels.Prev(Channel);
            if (!Channel && Setup.ChannelsWrap)
               Channel = Direction > 0 ? Channels.First() : Channels.Last();
-           if (Channel && !Channel->GroupSep() && cDevice::GetDevice(Channel, 0, true))
+           if (Channel && !Channel->GroupSep() && cDevice::GetDevice(Channel, LIVEPRIORITY, true, true))
               return Channel;
            }
      }
@@ -4294,7 +4293,7 @@
                }
            }
         }
-     else if (!Timer || (Timer->Priority() >= Setup.PrimaryLimit && !Timer->Pending())) {
+     else if (!Timer || !Timer->Pending()) {
         isyslog("no free DVB device to record channel %d!", ch);
         Skins.Message(mtError, tr("No free DVB device to record!"));
         }
diff -ruN vdr-1.7.24/menuitems.c vdr-1.7.25/menuitems.c
--- vdr-1.7.24/menuitems.c	2011-08-12 15:19:40.000000000 +0200
+++ vdr-1.7.25/menuitems.c	2012-03-02 16:49:57.000000000 +0100
@@ -4,7 +4,7 @@
  * See the main source file 'vdr.c' for copyright information and
  * how to reach the author.
  *
- * $Id: menuitems.c 2.10 2011/08/12 13:19:40 kls Exp $
+ * $Id: menuitems.c 2.11 2012/03/02 15:49:57 kls Exp $
  */
 
 #include "menuitems.h"
@@ -26,6 +26,7 @@
 cMenuEditItem::cMenuEditItem(const char *Name)
 {
   name = strdup(Name ? Name : "???");
+  SetHelp(NULL);
 }
 
 cMenuEditItem::~cMenuEditItem()
@@ -40,6 +41,27 @@
   cStatus::MsgOsdCurrentItem(buffer);
 }
 
+void cMenuEditItem::SetHelp(const char *Red, const char *Green, const char *Yellow, const char *Blue)
+{
+  // strings are NOT copied - must be constants!!!
+  helpRed    = Red;
+  helpGreen  = Green;
+  helpYellow = Yellow;
+  helpBlue   = Blue;
+  helpDisplayed = false;
+}
+
+bool cMenuEditItem::DisplayHelp(void)
+{
+  bool HasHelp = helpRed || helpGreen || helpYellow || helpBlue;
+  if (HasHelp && !helpDisplayed) {
+     cSkinDisplay::Current()->SetButtons(helpRed, helpGreen, helpYellow, helpBlue);
+     cStatus::MsgOsdHelpKeys(helpRed, helpGreen, helpYellow, helpBlue);
+     helpDisplayed = true;
+     }
+  return HasHelp;
+}
+
 // --- cMenuEditIntItem ------------------------------------------------------
 
 cMenuEditIntItem::cMenuEditIntItem(const char *Name, int *Value, int Min, int Max, const char *MinString, const char *MaxString)
@@ -382,9 +404,9 @@
 void cMenuEditStrItem::SetHelpKeys(void)
 {
   if (InEditMode())
-     cSkinDisplay::Current()->SetButtons(tr("Button$ABC/abc"), insert ? tr("Button$Overwrite") : tr("Button$Insert"), tr("Button$Delete"));
+     SetHelp(tr("Button$ABC/abc"), insert ? tr("Button$Overwrite") : tr("Button$Insert"), tr("Button$Delete"));
   else
-     cSkinDisplay::Current()->SetButtons(NULL);
+     SetHelp(NULL);
 }
 
 uint *cMenuEditStrItem::IsAllowed(uint c)
diff -ruN vdr-1.7.24/menuitems.h vdr-1.7.25/menuitems.h
--- vdr-1.7.24/menuitems.h	2011-06-13 15:46:03.000000000 +0200
+++ vdr-1.7.25/menuitems.h	2012-03-02 16:49:57.000000000 +0100
@@ -4,7 +4,7 @@
  * See the main source file 'vdr.c' for copyright information and
  * how to reach the author.
  *
- * $Id: menuitems.h 2.5 2011/06/13 13:46:03 kls Exp $
+ * $Id: menuitems.h 2.6 2012/03/02 15:49:57 kls Exp $
  */
 
 #ifndef __MENUITEMS_H
@@ -19,10 +19,15 @@
 class cMenuEditItem : public cOsdItem {
 private:
   char *name;
+  const char *helpRed, *helpGreen, *helpYellow, *helpBlue;
+  bool helpDisplayed;
+protected:
+  void SetHelp(const char *Red, const char *Green = NULL, const char *Yellow = NULL, const char *Blue = NULL);
 public:
   cMenuEditItem(const char *Name);
   ~cMenuEditItem();
   void SetValue(const char *Value);
+  bool DisplayHelp(void);
   };
 
 class cMenuEditIntItem : public cMenuEditItem {
diff -ruN vdr-1.7.24/osd.c vdr-1.7.25/osd.c
--- vdr-1.7.24/osd.c	2011-08-15 11:27:39.000000000 +0200
+++ vdr-1.7.25/osd.c	2012-03-02 11:48:19.000000000 +0100
@@ -4,7 +4,7 @@
  * See the main source file 'vdr.c' for copyright information and
  * how to reach the author.
  *
- * $Id: osd.c 2.23 2011/08/15 09:27:39 kls Exp $
+ * $Id: osd.c 2.25 2012/03/02 10:48:19 kls Exp $
  */
 
 #include "osd.h"
@@ -812,11 +812,11 @@
   // Fixed point scaling code based on www.inversereality.org/files/bitmapscaling.pdf
   // by deltener@mindtremors.com
   cBitmap *b = new cBitmap(int(round(Width() * FactorX)), int(round(Height() * FactorY)), Bpp(), X0(), Y0());
-  b->Replace(*this); // copy palette
   int RatioX = (Width() << 16) / b->Width();
   int RatioY = (Height() << 16) / b->Height();
   if (!AntiAlias || FactorX <= 1.0 && FactorY <= 1.0) {
      // Downscaling - no anti-aliasing:
+     b->Replace(*this); // copy palette
      tIndex *DestRow = b->bitmap;
      int SourceY = 0;
      for (int y = 0; y < b->Height(); y++) {
@@ -834,6 +834,7 @@
   else {
      // Upscaling - anti-aliasing:
      b->SetBpp(8);
+     b->Replace(*this); // copy palette (must be done *after* SetBpp()!)
      int SourceY = 0;
      for (int y = 0; y < b->Height() - 1; y++) {
          int SourceX = 0;
@@ -1007,7 +1008,7 @@
 void cPixmap::SetAlpha(int Alpha)
 {
   Lock();
-  Alpha = min(max(Alpha, ALPHA_TRANSPARENT), ALPHA_OPAQUE);
+  Alpha = constrain(Alpha, ALPHA_TRANSPARENT, ALPHA_OPAQUE);
   if (Alpha != alpha) {
      MarkViewPortDirty(viewPort);
      alpha = Alpha;
@@ -1647,8 +1648,8 @@
 {
   osdLeft = Left;
   osdTop = Top;
-  osdWidth = min(max(Width, MINOSDWIDTH), MAXOSDWIDTH);
-  osdHeight = min(max(Height, MINOSDHEIGHT), MAXOSDHEIGHT);
+  osdWidth = constrain(Width, MINOSDWIDTH, MAXOSDWIDTH);
+  osdHeight = constrain(Height, MINOSDHEIGHT, MAXOSDHEIGHT);
 }
 
 void cOsd::SetAntiAliasGranularity(uint FixedColors, uint BlendColors)
diff -ruN vdr-1.7.24/osdbase.c vdr-1.7.25/osdbase.c
--- vdr-1.7.24/osdbase.c	2010-12-12 14:41:28.000000000 +0100
+++ vdr-1.7.25/osdbase.c	2012-03-02 16:49:57.000000000 +0100
@@ -4,13 +4,14 @@
  * See the main source file 'vdr.c' for copyright information and
  * how to reach the author.
  *
- * $Id: osdbase.c 2.3 2010/12/12 13:41:28 kls Exp $
+ * $Id: osdbase.c 2.4 2012/03/02 15:49:57 kls Exp $
  */
 
 #include "osdbase.h"
 #include <string.h>
 #include "device.h"
 #include "i18n.h"
+#include "menuitems.h"
 #include "remote.h"
 #include "status.h"
 
@@ -85,6 +86,7 @@
   current = marked = -1;
   subMenu = NULL;
   helpRed = helpGreen = helpYellow = helpBlue = NULL;
+  helpDisplayed = false;
   status = NULL;
   if (!displayMenuCount++)
      SetDisplayMenu();
@@ -154,6 +156,15 @@
   title = strdup(Title);
 }
 
+void cOsdMenu::DisplayHelp(bool Force)
+{
+  if (!helpDisplayed || Force) {
+     displayMenu->SetButtons(helpRed, helpGreen, helpYellow, helpBlue);
+     cStatus::MsgOsdHelpKeys(helpRed, helpGreen, helpYellow, helpBlue);
+     helpDisplayed = true;
+     }
+}
+
 void cOsdMenu::SetHelp(const char *Red, const char *Green, const char *Yellow, const char *Blue)
 {
   // strings are NOT copied - must be constants!!!
@@ -161,8 +172,7 @@
   helpGreen  = Green;
   helpYellow = Yellow;
   helpBlue   = Blue;
-  displayMenu->SetButtons(helpRed, helpGreen, helpYellow, helpBlue);
-  cStatus::MsgOsdHelpKeys(helpRed, helpGreen, helpYellow, helpBlue);
+  DisplayHelp(true);
 }
 
 void cOsdMenu::Del(int Index)
@@ -205,8 +215,7 @@
   displayMenu->SetTabs(cols[0], cols[1], cols[2], cols[3], cols[4]);//XXX
   displayMenu->SetTitle(title);
   cStatus::MsgOsdTitle(title);
-  displayMenu->SetButtons(helpRed, helpGreen, helpYellow, helpBlue);
-  cStatus::MsgOsdHelpKeys(helpRed, helpGreen, helpYellow, helpBlue);
+  DisplayHelp(true);
   int count = Count();
   if (count > 0) {
      int ni = 0;
@@ -263,6 +272,12 @@
         cStatus::MsgOsdCurrentItem(item->Text());
      if (!Current)
         item->SetFresh(true); // leaving the current item resets 'fresh'
+     if (cMenuEditItem *MenuEditItem = dynamic_cast<cMenuEditItem *>(item)) {
+        if (!MenuEditItem->DisplayHelp())
+           DisplayHelp();
+        else
+           helpDisplayed = false;
+        }
      }
 }
 
diff -ruN vdr-1.7.24/osdbase.h vdr-1.7.25/osdbase.h
--- vdr-1.7.24/osdbase.h	2010-01-16 15:25:31.000000000 +0100
+++ vdr-1.7.25/osdbase.h	2012-03-02 16:49:57.000000000 +0100
@@ -4,7 +4,7 @@
  * See the main source file 'vdr.c' for copyright information and
  * how to reach the author.
  *
- * $Id: osdbase.h 2.1 2010/01/16 14:25:31 kls Exp $
+ * $Id: osdbase.h 2.2 2012/03/02 15:49:57 kls Exp $
  */
 
 #ifndef __OSDBASE_H
@@ -92,9 +92,11 @@
   int first, current, marked;
   cOsdMenu *subMenu;
   const char *helpRed, *helpGreen, *helpYellow, *helpBlue;
+  bool helpDisplayed;
   char *status;
   int digit;
   bool hasHotkeys;
+  void DisplayHelp(bool Force = false);
 protected:
   void SetDisplayMenu(void);
   cSkinDisplayMenu *DisplayMenu(void) { return displayMenu; }
diff -ruN vdr-1.7.24/pat.c vdr-1.7.25/pat.c
--- vdr-1.7.24/pat.c	2011-04-17 15:45:25.000000000 +0200
+++ vdr-1.7.25/pat.c	2012-03-02 11:56:45.000000000 +0100
@@ -4,7 +4,7 @@
  * See the main source file 'vdr.c' for copyright information and
  * how to reach the author.
  *
- * $Id: pat.c 2.16 2011/04/17 13:45:25 kls Exp $
+ * $Id: pat.c 2.17 2012/03/02 10:56:45 kls Exp $
  */
 
 #include "pat.h"
@@ -360,7 +360,7 @@
                       break;
               case 3: // STREAMTYPE_11172_AUDIO
               case 4: // STREAMTYPE_13818_AUDIO
-              case 0x0F: // ISO/IEC 13818-7 Audio with ADTS transport sytax
+              case 0x0F: // ISO/IEC 13818-7 Audio with ADTS transport syntax
               case 0x11: // ISO/IEC 14496-3 Audio with LATM transport syntax
                       {
                       if (NumApids < MAXAPIDS) {
diff -ruN vdr-1.7.24/po/ar.po vdr-1.7.25/po/ar.po
--- vdr-1.7.24/po/ar.po	2012-02-16 13:18:32.000000000 +0100
+++ vdr-1.7.25/po/ar.po	2012-02-25 14:37:49.000000000 +0100
@@ -7,7 +7,7 @@
 msgstr ""
 "Project-Id-Version: VDR 1.7.0\n"
 "Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
-"POT-Creation-Date: 2012-02-16 13:18+0100\n"
+"POT-Creation-Date: 2012-02-25 14:32+0100\n"
 "PO-Revision-Date: 2008-10-16 11:16-0400\n"
 "Last-Translator: Osama Alrawab <alrawab@hotmail.com>\n"
 "Language-Team: Arabic <ar@li.org>\n"
@@ -1053,9 +1053,6 @@
 msgid "Setup.Recording$Margin at stop (min)"
 msgstr ""
 
-msgid "Setup.Recording$Primary limit"
-msgstr "Ø§Ù„Ø­Ø¯ÙˆØ¯ Ø§Ù„Ø§Ø¨ØªØ¯Ø§Ø¦ÙŠØ©"
-
 msgid "Setup.Recording$Default priority"
 msgstr "Ø§Ù„Ø§ÙˆÙ„ÙˆÙŠØ§Øª Ø§Ù„Ø§Ù�ØªØ±Ø§Ø¶ÙŠØ©"
 
@@ -1367,60 +1364,3 @@
 #, c-format
 msgid "VDR will shut down in %s minutes"
 msgstr "Ø§Ù„Ø¨Ø±Ù†Ø§Ù…Ø¬ Ø³ÙŠÙ‚ÙˆÙ… Ø¨Ø§Ù„Ø§ØºÙ„Ø§Ù‚ Ø¨Ø¹Ø¯%s Ø¯Ù‚ÙŠÙ‚Ø© "
-
-#~ msgid "Path"
-#~ msgstr "Ø§Ù„Ù…Ø³Ø§Ø±"
-
-#~ msgid "Timer commands"
-#~ msgstr "Ø§ÙˆØ§Ù…Ø± Ø§Ù„Ù…ÙˆØ¡Ù‚Øª"
-
-#~ msgid "Rename recording"
-#~ msgstr "Ø§Ø¹Ø§Ø¯Ø© ØªØ³Ù…ÙŠØ© Ø§Ù„ØªØ³Ø¬ÙŠÙ„"
-
-#~ msgid "Date"
-#~ msgstr "Ø§Ù„ØªØ§Ø±ÙŠØ®"
-
-#~ msgid "Length"
-#~ msgstr "Ø§Ù„Ø·ÙˆÙ„"
-
-#~ msgid "Size"
-#~ msgstr "Ø§Ù„Ø­Ø¬Ù…"
-
-#~ msgid "Delete marks information?"
-#~ msgstr "Ø­Ø°Ù� Ù…Ø¹Ù„ÙˆÙ…Ø§Øª Ø§Ù„Ø¹Ù„Ø§Ù…Ø©"
-
-#~ msgid "Delete resume information?"
-#~ msgstr "Ø­Ø°Ù� Ù…Ø¹Ù„ÙˆÙ…Ø§Øª Ø§Ù„Ù…ÙˆØ§ØµÙ„Ø©"
-
-#~ msgid "Setup.OSD$Main menu command position"
-#~ msgstr "Ù…ÙˆØ¶Ø¹ Ø§ÙˆØ§Ù…Ø± Ø§Ù„Ù‚Ø§Ø¦Ù…Ø© Ø§Ù„Ø±Ø¦Ø³ÙŠØ©"
-
-#~ msgid "Setup.EPG$Show progress bar"
-#~ msgstr "Ø§Ø¶Ù‡Ø§Ø± Ø´Ø±ÙŠØ· Ø§Ù„ØªÙ‚Ø¯Ù…"
-
-#~ msgid "Setup.Recording$Max. recording size (GB)"
-#~ msgstr "Ø§Ù‚ØµÙ‰ Ø­Ø¬Ù… Ù„Ù„ØªØ³Ø¬ÙŠÙ„ Ù… Ø¨"
-
-#~ msgid "Setup.Recording$Hard Link Cutter"
-#~ msgstr "Ù‚Ø§Ø·Ø¹ ÙˆØµÙ„Ø§Øª Ø§Ù„Ø§Ø®ØªØµØ±Ø§Øª"
-
-#~ msgid "Setup.Recording$Show date"
-#~ msgstr "Ø§Ø¸Ù‡Ø± Ø§Ù„ØªØ§Ø±ÙŠØ®"
-
-#~ msgid "Setup.Recording$Show time"
-#~ msgstr "Ø§Ø¸Ù‡Ø± ØªØ§Ø±ÙŠØ® Ø§Ù„ØªØ¹Ø¯ÙŠÙ„"
-
-#~ msgid "Setup.Recording$Show length"
-#~ msgstr "Ø§Ø¸Ù‡Ø± VPS"
-
-#~ msgid "Rename$Up"
-#~ msgstr "Ø§Ø¹Ù„Ù‰"
-
-#~ msgid "Rename$Down"
-#~ msgstr "Ø§Ø³Ù�Ù„"
-
-#~ msgid "Rename$Previous"
-#~ msgstr "Ø§Ù„Ø³Ø§Ø¨Ù‚"
-
-#~ msgid "Rename$Next"
-#~ msgstr "Ø§Ù„ØªØ§Ù„Ù‰"
diff -ruN vdr-1.7.24/po/ca_ES.po vdr-1.7.25/po/ca_ES.po
--- vdr-1.7.24/po/ca_ES.po	2012-02-16 13:18:31.000000000 +0100
+++ vdr-1.7.25/po/ca_ES.po	2012-02-25 14:37:48.000000000 +0100
@@ -10,7 +10,7 @@
 msgstr ""
 "Project-Id-Version: VDR 1.6.0\n"
 "Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
-"POT-Creation-Date: 2012-02-16 13:18+0100\n"
+"POT-Creation-Date: 2012-02-25 14:32+0100\n"
 "PO-Revision-Date: 2008-03-02 19:02+0100\n"
 "Last-Translator: Luca Olivetti <luca@ventoso.org>\n"
 "Language-Team: Catalan <vdr@linuxtv.org>\n"
@@ -1032,9 +1032,6 @@
 msgid "Setup.Recording$Margin at stop (min)"
 msgstr "Marge de fi de gravació (min)"
 
-msgid "Setup.Recording$Primary limit"
-msgstr "Límit primari"
-
 msgid "Setup.Recording$Default priority"
 msgstr "Prioritat per defecte"
 
diff -ruN vdr-1.7.24/po/cs_CZ.po vdr-1.7.25/po/cs_CZ.po
--- vdr-1.7.24/po/cs_CZ.po	2012-02-16 13:18:31.000000000 +0100
+++ vdr-1.7.25/po/cs_CZ.po	2012-02-25 14:37:48.000000000 +0100
@@ -9,7 +9,7 @@
 msgstr ""
 "Project-Id-Version: VDR 1.7.14\n"
 "Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
-"POT-Creation-Date: 2012-02-16 13:18+0100\n"
+"POT-Creation-Date: 2012-02-25 14:32+0100\n"
 "PO-Revision-Date: 2010-05-06 11:00+0200\n"
 "Last-Translator: Radek Å Å¥astnÃ½ <dedkus@gmail.com>\n"
 "Language-Team: Czech <vdr@linuxtv.org>\n"
@@ -1031,9 +1031,6 @@
 msgid "Setup.Recording$Margin at stop (min)"
 msgstr "NahrÃ¡vat po konci (min)"
 
-msgid "Setup.Recording$Primary limit"
-msgstr "PrimÃ¡rnÃ­ limit"
-
 msgid "Setup.Recording$Default priority"
 msgstr "VÃ½chozÃ­ priorita"
 
diff -ruN vdr-1.7.24/po/da_DK.po vdr-1.7.25/po/da_DK.po
--- vdr-1.7.24/po/da_DK.po	2012-02-16 13:18:31.000000000 +0100
+++ vdr-1.7.25/po/da_DK.po	2012-02-25 14:37:48.000000000 +0100
@@ -7,7 +7,7 @@
 msgstr ""
 "Project-Id-Version: VDR 1.6.0\n"
 "Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
-"POT-Creation-Date: 2012-02-16 13:18+0100\n"
+"POT-Creation-Date: 2012-02-25 14:32+0100\n"
 "PO-Revision-Date: 2007-08-12 14:17+0200\n"
 "Last-Translator: Mogens Elneff <mogens@elneff.dk>\n"
 "Language-Team: Danish <vdr@linuxtv.org>\n"
@@ -1029,9 +1029,6 @@
 msgid "Setup.Recording$Margin at stop (min)"
 msgstr "Margin ved stop (min)"
 
-msgid "Setup.Recording$Primary limit"
-msgstr "Primær grænse"
-
 msgid "Setup.Recording$Default priority"
 msgstr "Standard prioritet"
 
diff -ruN vdr-1.7.24/po/de_DE.po vdr-1.7.25/po/de_DE.po
--- vdr-1.7.24/po/de_DE.po	2012-02-16 13:20:46.000000000 +0100
+++ vdr-1.7.25/po/de_DE.po	2012-02-25 14:37:49.000000000 +0100
@@ -7,7 +7,7 @@
 msgstr ""
 "Project-Id-Version: VDR 1.6.0\n"
 "Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
-"POT-Creation-Date: 2012-02-16 13:18+0100\n"
+"POT-Creation-Date: 2012-02-25 14:32+0100\n"
 "PO-Revision-Date: 2010-01-16 16:46+0100\n"
 "Last-Translator: Klaus Schmidinger <kls@tvdr.de>\n"
 "Language-Team: German <vdr@linuxtv.org>\n"
@@ -1029,9 +1029,6 @@
 msgid "Setup.Recording$Margin at stop (min)"
 msgstr "Nachlauf am Timer-Ende (min)"
 
-msgid "Setup.Recording$Primary limit"
-msgstr "Primär-Limit"
-
 msgid "Setup.Recording$Default priority"
 msgstr "Default-Priorität"
 
diff -ruN vdr-1.7.24/po/el_GR.po vdr-1.7.25/po/el_GR.po
--- vdr-1.7.24/po/el_GR.po	2012-02-16 13:18:32.000000000 +0100
+++ vdr-1.7.25/po/el_GR.po	2012-02-25 14:37:48.000000000 +0100
@@ -7,7 +7,7 @@
 msgstr ""
 "Project-Id-Version: VDR 1.6.0\n"
 "Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
-"POT-Creation-Date: 2012-02-16 13:18+0100\n"
+"POT-Creation-Date: 2012-02-25 14:32+0100\n"
 "PO-Revision-Date: 2007-08-12 14:17+0200\n"
 "Last-Translator: Dimitrios Dimitrakos <mail@dimitrios.de>\n"
 "Language-Team: Greek <vdr@linuxtv.org>\n"
@@ -1029,9 +1029,6 @@
 msgid "Setup.Recording$Margin at stop (min)"
 msgstr "Ðñüóèåôïò ÷ñüíïò óôü ôÝëïò (ëåðôÜ)"
 
-msgid "Setup.Recording$Primary limit"
-msgstr "Ðñïôåýïí üñéï"
-
 msgid "Setup.Recording$Default priority"
 msgstr "ÐñïêáèïñéóìÝíç ðñïôåñáéüôçôá"
 
diff -ruN vdr-1.7.24/po/es_ES.po vdr-1.7.25/po/es_ES.po
--- vdr-1.7.24/po/es_ES.po	2012-02-16 13:18:31.000000000 +0100
+++ vdr-1.7.25/po/es_ES.po	2012-02-25 14:37:48.000000000 +0100
@@ -8,7 +8,7 @@
 msgstr ""
 "Project-Id-Version: VDR 1.6.0\n"
 "Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
-"POT-Creation-Date: 2012-02-16 13:18+0100\n"
+"POT-Creation-Date: 2012-02-25 14:32+0100\n"
 "PO-Revision-Date: 2008-03-02 19:02+0100\n"
 "Last-Translator: Luca Olivetti <luca@ventoso.org>\n"
 "Language-Team: Spanish <vdr@linuxtv.org>\n"
@@ -1030,9 +1030,6 @@
 msgid "Setup.Recording$Margin at stop (min)"
 msgstr "Acabar grabación después (min)"
 
-msgid "Setup.Recording$Primary limit"
-msgstr "Límite primario"
-
 msgid "Setup.Recording$Default priority"
 msgstr "Prioridad por defecto"
 
diff -ruN vdr-1.7.24/po/et_EE.po vdr-1.7.25/po/et_EE.po
--- vdr-1.7.24/po/et_EE.po	2012-02-16 13:18:31.000000000 +0100
+++ vdr-1.7.25/po/et_EE.po	2012-02-25 14:37:48.000000000 +0100
@@ -7,26 +7,26 @@
 msgstr ""
 "Project-Id-Version: VDR 1.6.0\n"
 "Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
-"POT-Creation-Date: 2012-02-16 13:18+0100\n"
+"POT-Creation-Date: 2012-02-25 14:32+0100\n"
 "PO-Revision-Date: 2007-08-12 14:17+0200\n"
 "Last-Translator: Arthur Konovalov <artlov@gmail.com>\n"
 "Language-Team: Estonian <vdr@linuxtv.org>\n"
 "Language: et\n"
 "MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=ISO-8859-13\n"
+"Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 
 msgid "*** Invalid Channel ***"
 msgstr "*** Vigane kanal ***"
 
 msgid "Channel not available!"
-msgstr "Kanal ei ole kättesaadav!"
+msgstr "Kanal ei ole kÃ¤ttesaadav!"
 
 msgid "Can't start Transfer Mode!"
-msgstr "Ülekandemooduse start nurjus!"
+msgstr "SiirdereÅ¾iimi start nurjus!"
 
 msgid "off"
-msgstr "väljas"
+msgstr "vÃ¤ljas"
 
 msgid "on"
 msgstr "sees"
@@ -41,10 +41,10 @@
 msgstr "Polarisatsioon"
 
 msgid "System"
-msgstr "Süsteem"
+msgstr "SÃ¼steem"
 
 msgid "Srate"
-msgstr "Sümbolikiirus"
+msgstr "SÃ¼mbolikiirus"
 
 msgid "Inversion"
 msgstr "Inversioon"
@@ -74,10 +74,10 @@
 msgstr "Rolloff"
 
 msgid "PlpId"
-msgstr ""
+msgstr "PLP-tunnus"
 
 msgid "Starting EPG scan"
-msgstr "EPG skaneerimine käivitatud"
+msgstr "EPG skaneerimine kÃ¤ivitatud"
 
 msgid "Content$Movie/Drama"
 msgstr "Film/draama"
@@ -86,28 +86,28 @@
 msgstr "Krimi/triller"
 
 msgid "Content$Adventure/Western/War"
-msgstr "Seiklus/western/sõda"
+msgstr "Seiklus/western/sÃµda"
 
 msgid "Content$Science Fiction/Fantasy/Horror"
-msgstr "Scifi/fantaasia/õudus"
+msgstr "Scifi/fantaasia/Ãµudus"
 
 msgid "Content$Comedy"
-msgstr "Komöödia"
+msgstr "KomÃ¶Ã¶dia"
 
 msgid "Content$Soap/Melodrama/Folkloric"
-msgstr "Sari/Melodraama/pärimuslik"
+msgstr "Sari/Melodraama/pÃ¤rimuslik"
 
 msgid "Content$Romance"
 msgstr "Romanss"
 
 msgid "Content$Serious/Classical/Religious/Historical Movie/Drama"
-msgstr "Tõsine/klassikaline/religioosne/ajaloofilm/draama"
+msgstr "TÃµsine/klassikaline/religioosne/ajaloofilm/draama"
 
 msgid "Content$Adult Movie/Drama"
-msgstr "Täiskasvanutele/draama"
+msgstr "TÃ¤iskasvanutele/draama"
 
 msgid "Content$News/Current Affairs"
-msgstr "Uudised/päevakajaline"
+msgstr "Uudised/pÃ¤evakajaline"
 
 msgid "Content$News/Weather Report"
 msgstr "Uudised/ilmateade"
@@ -125,7 +125,7 @@
 msgstr "Meelelahutus"
 
 msgid "Content$Game Show/Quiz/Contest"
-msgstr "Sõumäng/mälumäng/võistlus"
+msgstr "SÃµumÃ¤ng/mÃ¤lumÃ¤ng/vÃµistlus"
 
 msgid "Content$Variety Show"
 msgstr "Varietee"
@@ -137,7 +137,7 @@
 msgstr "Sport"
 
 msgid "Content$Special Event"
-msgstr "Erisündmus"
+msgstr "ErisÃ¼ndmus"
 
 msgid "Content$Sport Magazine"
 msgstr "Spordiajakiri"
@@ -152,7 +152,7 @@
 msgstr "Meeskonnasport"
 
 msgid "Content$Athletics"
-msgstr "Kergejõustik"
+msgstr "KergejÃµustik"
 
 msgid "Content$Motor Sport"
 msgstr "Autosport"
@@ -167,7 +167,7 @@
 msgstr "Ratsutamine"
 
 msgid "Content$Martial Sports"
-msgstr "Võitluskunst"
+msgstr "VÃµitluskunst"
 
 msgid "Content$Children's/Youth Programme"
 msgstr "Laste- ja noortesaade"
@@ -182,7 +182,7 @@
 msgstr "Meelelahutus 10-16 aastastele"
 
 msgid "Content$Informational/Educational/School Programme"
-msgstr "Õppe- ja haridussaade"
+msgstr "Ã•ppe- ja haridussaade"
 
 msgid "Content$Cartoons/Puppets"
 msgstr "Joonisfilm/Nukufilm"
@@ -245,16 +245,16 @@
 msgstr "Mood"
 
 msgid "Content$Social/Political/Economics"
-msgstr "Ühiskond/poliitika/majandus"
+msgstr "Ãœhiskond/poliitika/majandus"
 
 msgid "Content$Magazine/Report/Documentary"
-msgstr "Ajakiri/reportaaþ/dokumentaal"
+msgstr "Ajakiri/reportaaÅ¾/dokumentaal"
 
 msgid "Content$Economics/Social Advisory"
-msgstr "Majandus/majandusnõuanne"
+msgstr "Majandus/majandusnÃµuanne"
 
 msgid "Content$Remarkable People"
-msgstr "Tähelepanuväärsed isikud"
+msgstr "TÃ¤helepanuvÃ¤Ã¤rsed isikud"
 
 msgid "Content$Education/Science/Factual"
 msgstr "Haridus/teadus/faktid"
@@ -266,16 +266,16 @@
 msgstr "Tehnoloogia/loodusteadus"
 
 msgid "Content$Medicine/Physiology/Psychology"
-msgstr "Meditsiin/füsioloogia/psühholoogia"
+msgstr "Meditsiin/fÃ¼sioloogia/psÃ¼hholoogia"
 
 msgid "Content$Foreign Countries/Expeditions"
-msgstr "Välisriigid/ekspeditsioon"
+msgstr "VÃ¤lisriigid/ekspeditsioon"
 
 msgid "Content$Social/Spiritual Sciences"
-msgstr "Ühiskondlik/Hingeteadus"
+msgstr "Ãœhiskondlik/Hingeteadus"
 
 msgid "Content$Further Education"
-msgstr "Täiendõpe"
+msgstr "TÃ¤iendÃµpe"
 
 msgid "Content$Languages"
 msgstr "Keeled"
@@ -287,7 +287,7 @@
 msgstr "Turism/reisimine"
 
 msgid "Content$Handicraft"
-msgstr "Käsitöö"
+msgstr "KÃ¤sitÃ¶Ã¶"
 
 msgid "Content$Motoring"
 msgstr "Autondus"
@@ -314,7 +314,7 @@
 msgstr "Avaldamata"
 
 msgid "Content$Live Broadcast"
-msgstr "Otseülekanne"
+msgstr "OtseÃ¼lekanne"
 
 #, c-format
 msgid "ParentalRating$from %d"
@@ -332,56 +332,56 @@
 msgstr "est"
 
 msgid "Phase 1: Detecting RC code type"
-msgstr "Samm 1: Kodeerimissüsteemi tuvastamine"
+msgstr "Samm 1: KodeerimissÃ¼steemi tuvastamine"
 
 msgid "Press any key on the RC unit"
 msgstr "Vajuta puldil suvalist klahvi"
 
 msgid "RC code detected!"
-msgstr "Kodeerimissüsteem tuvastatud!"
+msgstr "KodeerimissÃ¼steem tuvastatud!"
 
 msgid "Do not press any key..."
-msgstr "Ära vajuta puldil ühtki klahvi..."
+msgstr "Ã„ra vajuta puldil Ã¼htki klahvi..."
 
 msgid "Phase 2: Learning specific key codes"
-msgstr "Samm 2: Klahvide õpetamine"
+msgstr "Samm 2: Klahvide Ãµpetamine"
 
 #, c-format
 msgid "Press key for '%s'"
 msgstr "Vajuta klahvile '%s'"
 
 msgid "Press 'Up' to confirm"
-msgstr "Kinnitamiseks vajuta 'Üles'"
+msgstr "Kinnitamiseks vajuta 'Ãœles'"
 
 msgid "Press 'Down' to continue"
-msgstr "Jätkamiseks vajuta 'Alla'"
+msgstr "JÃ¤tkamiseks vajuta 'Alla'"
 
 msgid "(press 'Up' to go back)"
-msgstr "(tagasiminekuks vajuta 'Üles')"
+msgstr "(tagasiminekuks vajuta 'Ãœles')"
 
 msgid "(press 'Down' to end key definition)"
-msgstr "(lõpetamiseks vajuta 'Alla')"
+msgstr "(lÃµpetamiseks vajuta 'Alla')"
 
 msgid "(press 'Menu' to skip this key)"
-msgstr "(selle klahvi vahelejätmiseks vajuta 'Menüü')"
+msgstr "(selle klahvi vahelejÃ¤tmiseks vajuta 'MenÃ¼Ã¼')"
 
 msgid "Learning Remote Control Keys"
-msgstr "Kaugjuhtimispuldi õpetamine"
+msgstr "Kaugjuhtimispuldi Ãµpetamine"
 
 msgid "Phase 3: Saving key codes"
 msgstr "Samm 3: Klavhikoodide salvestamine"
 
 msgid "Press 'Up' to save, 'Down' to cancel"
-msgstr "Salvestamiseks vajuta 'Üles' ja katkestamiseks 'Alla'"
+msgstr "Salvestamiseks vajuta 'Ãœles' ja katkestamiseks 'Alla'"
 
 msgid "Key$Up"
-msgstr "Üles"
+msgstr "Ãœles"
 
 msgid "Key$Down"
 msgstr "Alla"
 
 msgid "Key$Menu"
-msgstr "Menüü"
+msgstr "MenÃ¼Ã¼"
 
 msgid "Key$Ok"
 msgstr "Ok"
@@ -429,7 +429,7 @@
 msgstr "Tagasikerimine"
 
 msgid "Key$Next"
-msgstr "Järgmine"
+msgstr "JÃ¤rgmine"
 
 msgid "Key$Prev"
 msgstr "Eelmine"
@@ -453,7 +453,7 @@
 msgstr "Helitugevus-"
 
 msgid "Key$Mute"
-msgstr "Hääletu"
+msgstr "HÃ¤Ã¤letu"
 
 msgid "Key$Audio"
 msgstr "Audio"
@@ -474,10 +474,10 @@
 msgstr "Salvestused"
 
 msgid "Key$Setup"
-msgstr "Sätted"
+msgstr "SÃ¤tted"
 
 msgid "Key$Commands"
-msgstr "Käsud"
+msgstr "KÃ¤sud"
 
 msgid "Key$User0"
 msgstr "Lisaklahv0"
@@ -519,7 +519,7 @@
 msgstr "FTA"
 
 msgid "encrypted"
-msgstr "krüptitud"
+msgstr "krÃ¼ptitud"
 
 msgid "Edit channel"
 msgstr "Kanali muutmine"
@@ -582,7 +582,7 @@
 msgstr "Kustutada"
 
 msgid "Button$Mark"
-msgstr "Märkimine"
+msgstr "MÃ¤rkimine"
 
 msgid "Channel is being used by a timer!"
 msgstr "Kanal on taimeri kasutuses!"
@@ -604,13 +604,13 @@
 
 #, c-format
 msgid "Folder name must not contain '%c'!"
-msgstr "Kausta nimi ei saa sisaldada '%c' sümbolit!"
+msgstr "Kausta nimi ei saa sisaldada '%c' sÃ¼mbolit!"
 
 msgid "Button$Select"
 msgstr "Vali"
 
 msgid "Delete folder and all sub folders?"
-msgstr "Kustutada kaust ja kõik alamkaustad?"
+msgstr "Kustutada kaust ja kÃµik alamkaustad?"
 
 msgid "Delete folder?"
 msgstr "Kustutada kaust?"
@@ -625,7 +625,7 @@
 msgstr "Kanal"
 
 msgid "Day"
-msgstr "Päev"
+msgstr "PÃ¤ev"
 
 msgid "Start"
 msgstr "Start"
@@ -649,7 +649,7 @@
 msgstr "Kaust"
 
 msgid "First day"
-msgstr "Esimene päev"
+msgstr "Esimene pÃ¤ev"
 
 msgid "Select folder"
 msgstr "Kausta valik"
@@ -667,7 +667,7 @@
 msgstr "Kustutada taimer?"
 
 msgid "Timer still recording - really delete?"
-msgstr "Salvestus aktiivne - kustutada?"
+msgstr "Salvestus aktiivne - kas kustutada?"
 
 msgid "Event"
 msgstr "Saade"
@@ -685,7 +685,7 @@
 msgstr "Hetkel eetris"
 
 msgid "What's on next?"
-msgstr "Järgmisena eetris"
+msgstr "JÃ¤rgmisena eetris"
 
 msgid "Button$Next"
 msgstr "Tulekul"
@@ -697,7 +697,7 @@
 msgstr "Ajakava"
 
 msgid "Can't switch channel!"
-msgstr "Kanali vahetus ei ole võimalik!"
+msgstr "Kanali vahetus ei ole vÃµimalik!"
 
 #, c-format
 msgid "Schedule - %s"
@@ -708,10 +708,10 @@
 msgstr "Sama saade - %s"
 
 msgid "This event - all channels"
-msgstr "Sama saade - kõik kanalid"
+msgstr "Sama saade - kÃµik kanalid"
 
 msgid "All events - all channels"
-msgstr "Kõik saated - kõik kanalid"
+msgstr "KÃµik saated - kÃµik kanalid"
 
 #, c-format
 msgid "Please enter %d digits!"
@@ -736,7 +736,7 @@
 msgstr "Avada"
 
 msgid "Commands"
-msgstr "Käsud"
+msgstr "KÃ¤sud"
 
 msgid "Error while accessing recording!"
 msgstr "Salvestuse taasesitus nurjus!"
@@ -745,25 +745,25 @@
 msgstr "Kustutada salvestus?"
 
 msgid "Recording is being edited - really delete?"
-msgstr ""
+msgstr "Salvestust on muudetud - kas kustutada?"
 
 msgid "Error while deleting recording!"
 msgstr "Salvestuse kustutamine nurjus!"
 
 msgid "Recording commands"
-msgstr "Salvestuse käsud"
+msgstr "Salvestuse kÃ¤sud"
 
 msgid "never"
 msgstr "ei"
 
 msgid "skin dependent"
-msgstr "kestast sõltuv"
+msgstr "kestast sÃµltuv"
 
 msgid "always"
 msgstr "alati"
 
 msgid "OSD"
-msgstr "Ekraanimenüü"
+msgstr "EkraanimenÃ¼Ã¼"
 
 msgid "Setup.OSD$Language"
 msgstr "Keel"
@@ -784,13 +784,13 @@
 msgstr "Laius (%)"
 
 msgid "Setup.OSD$Height (%)"
-msgstr "Kõrgus (%)"
+msgstr "KÃµrgus (%)"
 
 msgid "Setup.OSD$Message time (s)"
 msgstr "Teate kuvamisaeg (s)"
 
 msgid "Setup.OSD$Use small font"
-msgstr "Väikese fondi kasutus"
+msgstr "VÃ¤ikese fondi kasutus"
 
 msgid "Setup.OSD$Anti-alias"
 msgstr "Fondi silumine"
@@ -799,7 +799,7 @@
 msgstr "Vaikefont"
 
 msgid "Setup.OSD$Small font"
-msgstr "Väike font"
+msgstr "VÃ¤ike font"
 
 msgid "Setup.OSD$Fixed font"
 msgstr "Fikseeritud font"
@@ -808,7 +808,7 @@
 msgstr "Vaikefondi suurus (%)"
 
 msgid "Setup.OSD$Small font size (%)"
-msgstr "Väikese fondi suurus (%)"
+msgstr "VÃ¤ikese fondi suurus (%)"
 
 msgid "Setup.OSD$Fixed font size (%)"
 msgstr "Fiks. fondi suurus (%)"
@@ -820,7 +820,7 @@
 msgstr "all"
 
 msgid "top"
-msgstr "üleval"
+msgstr "Ã¼leval"
 
 msgid "Setup.OSD$Channel info time (s)"
 msgstr "Kanaliinfo kuvamisaeg (s)"
@@ -832,19 +832,19 @@
 msgstr "Kanaliinfo ajapiirang"
 
 msgid "Setup.OSD$Scroll pages"
-msgstr "Lehekülje kerimine"
+msgstr "LehekÃ¼lje kerimine"
 
 msgid "Setup.OSD$Scroll wraps"
 msgstr "Ridade ringkerimine"
 
 msgid "Setup.OSD$Menu key closes"
-msgstr "Sulgemine Menüü klahviga"
+msgstr "Sulgemine MenÃ¼Ã¼ klahviga"
 
 msgid "Setup.OSD$Recording directories"
 msgstr "Kausta nime salvestamine"
 
 msgid "Setup.OSD$Folders in timer menu"
-msgstr "Kaustad taimeri menüüs"
+msgstr "Kaustad taimeri menÃ¼Ã¼s"
 
 msgid "Setup.OSD$Number keys for characters"
 msgstr "Teksti sisestamine numbriklahvidega"
@@ -865,10 +865,10 @@
 msgstr "Vana EPG viide (min)"
 
 msgid "Setup.EPG$Set system time"
-msgstr "Kella sünkroniseerimine"
+msgstr "Kella sÃ¼nkroniseerimine"
 
 msgid "Setup.EPG$Use time from transponder"
-msgstr "Sünkroniseerimise transponder"
+msgstr "SÃ¼nkroniseerimise transponder"
 
 #. TRANSLATORS: note the plural!
 msgid "Setup.EPG$Preferred languages"
@@ -918,7 +918,7 @@
 msgstr "Esmane DVB seade"
 
 msgid "Setup.DVB$Video format"
-msgstr "TV külgsuhe"
+msgstr "TV kÃ¼lgsuhe"
 
 msgid "Setup.DVB$Video display format"
 msgstr "Video kuvamise formaat"
@@ -930,7 +930,7 @@
 msgstr "Kanalite uuendamine"
 
 msgid "Setup.DVB$Audio languages"
-msgstr "Audio keeled"
+msgstr "Audio keeli"
 
 msgid "Setup.DVB$Audio language"
 msgstr "Audio keel"
@@ -939,7 +939,7 @@
 msgstr "Subtiitrite kuvamine"
 
 msgid "Setup.DVB$Subtitle languages"
-msgstr "Subtiitrite keeled"
+msgstr "Subtiitrite keeli"
 
 msgid "Setup.DVB$Subtitle language"
 msgstr "Subtiitri keel"
@@ -948,10 +948,10 @@
 msgstr "Subtiitrite nihe"
 
 msgid "Setup.DVB$Subtitle foreground transparency"
-msgstr "Subtiitri läbipaistvus"
+msgstr "Subtiitri lÃ¤bipaistvus"
 
 msgid "Setup.DVB$Subtitle background transparency"
-msgstr "Subtiitri tausta läbipaistvus"
+msgstr "Subtiitri tausta lÃ¤bipaistvus"
 
 msgid "LNB"
 msgstr "LNB"
@@ -970,40 +970,40 @@
 
 #, c-format
 msgid "Setup.LNB$Device %d connected to sat cable"
-msgstr ""
+msgstr "DVB seade %d Ã¼hendatud SAT-kaabliga"
 
 msgid "Setup.LNB$own"
-msgstr ""
+msgstr "oma"
 
 msgid "CAM reset"
-msgstr "CAM taaskäivitamine"
+msgstr "CAM taaskÃ¤ivitamine"
 
 msgid "CAM present"
 msgstr "CAM esitletud"
 
 msgid "CAM ready"
-msgstr "CAM töövalmis"
+msgstr "CAM tÃ¶Ã¶valmis"
 
 msgid "CAM"
 msgstr "CAM"
 
 msgid "Button$Menu"
-msgstr "Menüü"
+msgstr "MenÃ¼Ã¼"
 
 msgid "Button$Reset"
 msgstr "Reset"
 
 msgid "Opening CAM menu..."
-msgstr "CAM-menüü avamine..."
+msgstr "CAM-menÃ¼Ã¼ avamine..."
 
 msgid "Can't open CAM menu!"
-msgstr "Ei saa avada CAM menüüd!"
+msgstr "Ei saa avada CAM menÃ¼Ã¼d!"
 
 msgid "CAM is in use - really reset?"
-msgstr "CAM on kasutuses - taaskäivitada?"
+msgstr "CAM on kasutuses - taaskÃ¤ivitada?"
 
 msgid "Can't reset CAM!"
-msgstr "CAM mooduli taaskäivitus nurjus!"
+msgstr "CAM mooduli taaskÃ¤ivitus nurjus!"
 
 msgid "do not pause live video"
 msgstr "mitte peatada"
@@ -1027,25 +1027,22 @@
 msgstr "Salvestamise algusvaru (min)"
 
 msgid "Setup.Recording$Margin at stop (min)"
-msgstr "Salvestamise lõpuvaru (min)"
-
-msgid "Setup.Recording$Primary limit"
-msgstr "Esmane prioriteet"
+msgstr "Salvestamise lÃµpuvaru (min)"
 
 msgid "Setup.Recording$Default priority"
 msgstr "Vaikimisi prioriteet"
 
 msgid "Setup.Recording$Default lifetime (d)"
-msgstr "Salvestuse eluiga (päevi)"
+msgstr "Salvestuse eluiga (pÃ¤evi)"
 
 msgid "Setup.Recording$Pause key handling"
-msgstr "Pausi klahvi käsitsemine"
+msgstr "Pausi klahvi kÃ¤sitsemine"
 
 msgid "Setup.Recording$Pause priority"
 msgstr "Pausi prioriteet"
 
 msgid "Setup.Recording$Pause lifetime (d)"
-msgstr "Pausi eluiga (päevi)"
+msgstr "Pausi eluiga (pÃ¤evi)"
 
 msgid "Setup.Recording$Use episode name"
 msgstr "Episoodinime kasutamine"
@@ -1057,7 +1054,7 @@
 msgstr "VPS-i algusvaru (s)"
 
 msgid "Setup.Recording$Mark instant recording"
-msgstr "Kiirsalvestuse märgistamine"
+msgstr "Kiirsalvestuse mÃ¤rgistamine"
 
 msgid "Setup.Recording$Name instant recording"
 msgstr "Kiirsalvestuse nimi"
@@ -1078,22 +1075,22 @@
 msgstr "Taasesitus"
 
 msgid "Setup.Replay$Multi speed mode"
-msgstr "Mitmekiiruse moodus"
+msgstr "Mitme kiiruse reÅ¾iim"
 
 msgid "Setup.Replay$Show replay mode"
-msgstr "Korduse moodus"
+msgstr "Korduse reÅ¾iimi kuvamine"
 
 msgid "Setup.Replay$Show remaining time"
-msgstr ""
+msgstr "JÃ¤relejÃ¤Ã¤nud aja kuvamine"
 
 msgid "Setup.Replay$Resume ID"
-msgstr "Jätkamise ID"
+msgstr "JÃ¤tkamise ID"
 
 msgid "Miscellaneous"
-msgstr "Muud sätted"
+msgstr "Muud sÃ¤tted"
 
 msgid "Setup.Miscellaneous$Min. event timeout (min)"
-msgstr "Min. saate taimaut (min)"
+msgstr "Min. aeg saateni (min)"
 
 msgid "Setup.Miscellaneous$Min. user inactivity (min)"
 msgstr "Min. kasutaja tegevusetus (min)"
@@ -1108,19 +1105,19 @@
 msgstr "Kanali sisestamise ajalimiit (ms)"
 
 msgid "Setup.Miscellaneous$Initial channel"
-msgstr "Kanal käivitamisel"
+msgstr "Kanal kÃ¤ivitamisel"
 
 msgid "Setup.Miscellaneous$as before"
 msgstr "endine"
 
 msgid "Setup.Miscellaneous$Initial volume"
-msgstr "Helitugevus käivitamisel"
+msgstr "Helitugevus kÃ¤ivitamisel"
 
 msgid "Setup.Miscellaneous$Channels wrap"
 msgstr "Kanalite ringkerimine"
 
 msgid "Setup.Miscellaneous$Emergency exit"
-msgstr "Hädaväljumine"
+msgstr "HÃ¤davÃ¤ljumine"
 
 msgid "Plugins"
 msgstr "Laiendusmoodulid"
@@ -1129,7 +1126,7 @@
 msgstr "Sellel laienudusmoodulil ei ole seadeid!"
 
 msgid "Setup"
-msgstr "Sätted"
+msgstr "SÃ¤tted"
 
 msgid "Restart"
 msgstr "Restart"
@@ -1139,7 +1136,7 @@
 
 #. TRANSLATORS: note the leading and trailing blanks!
 msgid " Stop recording "
-msgstr " Lõpetada salvestamine "
+msgstr " LÃµpetada salvestamine "
 
 msgid "Schedule"
 msgstr "Kava"
@@ -1149,7 +1146,7 @@
 
 #. TRANSLATORS: note the leading blank!
 msgid " Stop replaying"
-msgstr " Lõpetada taasesitamine"
+msgstr " LÃµpetada taasesitamine"
 
 msgid "Button$Pause"
 msgstr "Paus"
@@ -1158,23 +1155,23 @@
 msgstr "Stopp"
 
 msgid "Button$Resume"
-msgstr "Jätkata"
+msgstr "JÃ¤tkata"
 
 #. TRANSLATORS: note the leading blank!
 msgid " Cancel editing"
 msgstr " Katkestada redigeerimine"
 
 msgid "Stop recording?"
-msgstr "Lõpetada salvestamine?"
+msgstr "LÃµpetada salvestamine?"
 
 msgid "Cancel editing?"
-msgstr "Tühistada redigeermine?"
+msgstr "TÃ¼histada redigeermine?"
 
 msgid "No audio available!"
-msgstr "Audio kättesaamatu!"
+msgstr "Audio kÃ¤ttesaamatu!"
 
 msgid "No subtitles"
-msgstr "Subtiitrid väljas"
+msgstr "Subtiitrid vÃ¤ljas"
 
 msgid "No subtitles available!"
 msgstr "Subtiitrid puuduvad"
@@ -1186,14 +1183,14 @@
 msgstr "Puudub vaba DVB seade salvestamiseks!"
 
 msgid "Pausing live video..."
-msgstr "Otseülekande peatamine..."
+msgstr "OtseÃ¼lekande peatamine..."
 
 msgid "Delete timeshift recording?"
 msgstr "Kustutada ajanihke salvestus?"
 
 #. TRANSLATORS: note the trailing blank!
 msgid "Jump: "
-msgstr "Hüpe: "
+msgstr "HÃ¼pe: "
 
 msgid "No editing marks defined!"
 msgstr "Redigeerimise markerid puuduvad!"
@@ -1202,16 +1199,16 @@
 msgstr "Redigeerimise start nurjus!"
 
 msgid "Editing process started"
-msgstr "Redigeerimine käivitatud"
+msgstr "Redigeerimine kÃ¤ivitatud"
 
 msgid "Editing process already active!"
 msgstr "Redigeerimine juba aktiivne!"
 
 msgid "FileNameChars$ abcdefghijklmnopqrstuvwxyz0123456789-.,#~\\^$[]|()*+?{}/:%@&"
-msgstr " abcdefghijklmnopqrsðzþtuvwõäöüxy0123456789-.,#~\\^$[]|()*+?{}/:%@&"
+msgstr " abcdefghijklmnopqrsÅ¡zÅ¾tuvwÃµÃ¤Ã¶Ã¼xy0123456789-.,#~\\^$[]|()*+?{}/:%@&"
 
 msgid "CharMap$ 0\t-.,1#~\\^$[]|()*+?{}/:%@&\tabc2\tdef3\tghi4\tjkl5\tmno6\tpqrs7\ttuv8\twxyz9"
-msgstr " 0\t-.,1#~\\^$[]|()*+?{}/:%@&\tabcä2\tdef3\tghi4\tjkl5\tmnoõö6\tpqrsð7\ttuvü8\twxyzþ9"
+msgstr " 0\t-.,1#~\\^$[]|()*+?{}/:%@&\tabcÃ¤2\tdef3\tghi4\tjkl5\tmnoÃµÃ¶6\tpqrsÅ¡7\ttuvÃ¼8\twxyzÅ¾9"
 
 msgid "Button$ABC/abc"
 msgstr "ABC/abc"
@@ -1226,39 +1223,39 @@
 msgstr "Laiendusmoodul"
 
 msgid "Up/Dn for new location - OK to move"
-msgstr "'Üles/Alla' uus asukoht - 'OK' kinnitus"
+msgstr "'Ãœles/Alla' uus asukoht - 'OK' kinnitus"
 
 msgid "Channel locked (recording)!"
 msgstr "Kanal lukus (salvestamine aktiivne)!"
 
 msgid "Low disk space!"
-msgstr "Kõvaketas täis!"
+msgstr "KÃµvaketas tÃ¤is!"
 
 msgid "Regenerating index file"
 msgstr "Indeksfaili regenereerimine"
 
 msgid "Index file regeneration complete"
-msgstr "Indeksfaili regenereerimine lõpetatud"
+msgstr "Indeksfaili regenereerimine lÃµpetatud"
 
 msgid "Can't shutdown - option '-s' not given!"
-msgstr "Väljalülitamine nurjus - '-s' parameeter puudub!"
+msgstr "VÃ¤ljalÃ¼litamine nurjus - '-s' parameeter puudub!"
 
 msgid "Editing - shut down anyway?"
-msgstr "Redigeerimine aktiive - lülitada välja?"
+msgstr "Redigeerimine aktiive - lÃ¼litada vÃ¤lja?"
 
 msgid "Recording - shut down anyway?"
-msgstr "Salvestamine aktiivne - lülitada välja?"
+msgstr "Salvestamine aktiivne - lÃ¼litada vÃ¤lja?"
 
 #, c-format
 msgid "Recording in %ld minutes, shut down anyway?"
-msgstr "Salvestamine algab %ld minuti pärast - lülitada välja?"
+msgstr "Salvestamine algab %ld minuti pÃ¤rast - lÃ¼litada vÃ¤lja?"
 
 msgid "shut down anyway?"
-msgstr "lülitada välja?"
+msgstr "lÃ¼litada vÃ¤lja?"
 
 #, c-format
 msgid "Plugin %s wakes up in %ld min, continue?"
-msgstr "Laiendusmoodul %s ärkab %ld minuti pärast, jätkata?"
+msgstr "Laiendusmoodul %s Ã¤rkab %ld minuti pÃ¤rast, jÃ¤tkata?"
 
 msgid "Editing - restart anyway?"
 msgstr "Redigeerimine aktiivne - restart?"
@@ -1288,53 +1285,53 @@
 msgstr " E  T  K  N  R  L  P "
 
 msgid "Monday"
-msgstr "Esmaspäev"
+msgstr "EsmaspÃ¤ev"
 
 msgid "Tuesday"
-msgstr "Teisipäev"
+msgstr "TeisipÃ¤ev"
 
 msgid "Wednesday"
-msgstr "Kolmapäev"
+msgstr "KolmapÃ¤ev"
 
 msgid "Thursday"
-msgstr "Neljapäev"
+msgstr "NeljapÃ¤ev"
 
 msgid "Friday"
 msgstr "Reede"
 
 msgid "Saturday"
-msgstr "Laupäev"
+msgstr "LaupÃ¤ev"
 
 msgid "Sunday"
-msgstr "Pühapäev"
+msgstr "PÃ¼hapÃ¤ev"
 
 msgid "Upcoming recording!"
 msgstr "Salvestamine tulekul!"
 
 msgid "Pause live video?"
-msgstr "Peatada otseülekanne?"
+msgstr "Peatada otseÃ¼lekanne?"
 
 msgid "Recording started"
-msgstr "Salvestamine käivitatud"
+msgstr "Salvestamine kÃ¤ivitatud"
 
 msgid "VDR will shut down later - press Power to force"
-msgstr "VDR lülitub välja hiljem - vajuta Power kiirendamiseks"
+msgstr "VDR lÃ¼litub vÃ¤lja hiljem - vajuta Power kiirendamiseks"
 
 msgid "Press any key to cancel shutdown"
-msgstr "Vajuta suvalist klahvi väljalülitamise tühistamiseks"
+msgstr "Vajuta suvalist klahvi vÃ¤ljalÃ¼litamise tÃ¼histamiseks"
 
 msgid "Switching primary DVB..."
-msgstr "Esmase DVB seadme ümberlülitus..."
+msgstr "Esmase DVB seadme Ã¼mberlÃ¼litus..."
 
 msgid "Editing process failed!"
 msgstr "Redigeerimine nurjus"
 
 msgid "Editing process finished"
-msgstr "Redigeerimine lõpetatud"
+msgstr "Redigeerimine lÃµpetatud"
 
 msgid "Press any key to cancel restart"
 msgstr "Restardi katkestamiseks vajuta suvalist klahvi"
 
 #, c-format
 msgid "VDR will shut down in %s minutes"
-msgstr "VDR lülitub välja %s minuti pärast"
+msgstr "VDR lÃ¼litub vÃ¤lja %s minuti pÃ¤rast"
diff -ruN vdr-1.7.24/po/fi_FI.po vdr-1.7.25/po/fi_FI.po
--- vdr-1.7.24/po/fi_FI.po	2012-02-16 13:18:31.000000000 +0100
+++ vdr-1.7.25/po/fi_FI.po	2012-02-25 14:37:48.000000000 +0100
@@ -10,7 +10,7 @@
 msgstr ""
 "Project-Id-Version: VDR 1.6.0\n"
 "Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
-"POT-Creation-Date: 2012-02-16 13:18+0100\n"
+"POT-Creation-Date: 2012-02-25 14:32+0100\n"
 "PO-Revision-Date: 2007-08-15 15:52+0200\n"
 "Last-Translator: Rolf Ahrenberg <rahrenbe@cc.hut.fi>\n"
 "Language-Team: Finnish <vdr@linuxtv.org>\n"
@@ -321,7 +321,7 @@
 
 #, c-format
 msgid "ParentalRating$from %d"
-msgstr "K-%d"
+msgstr "%d"
 
 msgid "No title"
 msgstr "Ei esitystÃ¤"
@@ -748,7 +748,7 @@
 msgstr "Poistetaanko tallenne?"
 
 msgid "Recording is being edited - really delete?"
-msgstr ""
+msgstr "Tallennetta muokataan - poistetaanko silti?"
 
 msgid "Error while deleting recording!"
 msgstr "Tallenteen poistaminen epÃ¤onnistui!"
@@ -1032,9 +1032,6 @@
 msgid "Setup.Recording$Margin at stop (min)"
 msgstr "Lopetusmarginaali (min)"
 
-msgid "Setup.Recording$Primary limit"
-msgstr "Ensisijaisen sovittimen prioriteettiraja"
-
 msgid "Setup.Recording$Default priority"
 msgstr "Tallenteen oletusprioriteetti"
 
diff -ruN vdr-1.7.24/po/fr_FR.po vdr-1.7.25/po/fr_FR.po
--- vdr-1.7.24/po/fr_FR.po	2012-02-16 13:18:32.000000000 +0100
+++ vdr-1.7.25/po/fr_FR.po	2012-02-25 14:37:48.000000000 +0100
@@ -13,7 +13,7 @@
 msgstr ""
 "Project-Id-Version: VDR 1.6.0\n"
 "Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
-"POT-Creation-Date: 2012-02-16 13:18+0100\n"
+"POT-Creation-Date: 2012-02-25 14:32+0100\n"
 "PO-Revision-Date: 2008-02-27 18:14+0100\n"
 "Last-Translator: Jean-Claude Repetto <jc@repetto.org>\n"
 "Language-Team: French <vdr@linuxtv.org>\n"
@@ -1035,9 +1035,6 @@
 msgid "Setup.Recording$Margin at stop (min)"
 msgstr "Marge postérieure (min)"
 
-msgid "Setup.Recording$Primary limit"
-msgstr "Limite primaire"
-
 msgid "Setup.Recording$Default priority"
 msgstr "Priorité par défaut"
 
diff -ruN vdr-1.7.24/po/hr_HR.po vdr-1.7.25/po/hr_HR.po
--- vdr-1.7.24/po/hr_HR.po	2012-02-16 13:18:33.000000000 +0100
+++ vdr-1.7.25/po/hr_HR.po	2012-02-25 14:37:49.000000000 +0100
@@ -9,7 +9,7 @@
 msgstr ""
 "Project-Id-Version: VDR 1.6.0\n"
 "Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
-"POT-Creation-Date: 2012-02-16 13:18+0100\n"
+"POT-Creation-Date: 2012-02-25 14:32+0100\n"
 "PO-Revision-Date: 2008-03-17 19:00+0100\n"
 "Last-Translator: Adrian Caval <anrxc@sysphere.org>\n"
 "Language-Team: Croatian <vdr@linuxtv.org>\n"
@@ -1031,9 +1031,6 @@
 msgid "Setup.Recording$Margin at stop (min)"
 msgstr "Rezerva na kraju (min)"
 
-msgid "Setup.Recording$Primary limit"
-msgstr "Standardno ogranièenje"
-
 msgid "Setup.Recording$Default priority"
 msgstr "Zadani prioritet"
 
diff -ruN vdr-1.7.24/po/hu_HU.po vdr-1.7.25/po/hu_HU.po
--- vdr-1.7.24/po/hu_HU.po	2012-02-16 13:18:31.000000000 +0100
+++ vdr-1.7.25/po/hu_HU.po	2012-02-25 14:37:48.000000000 +0100
@@ -10,7 +10,7 @@
 msgstr ""
 "Project-Id-Version: VDR 1.6.0\n"
 "Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
-"POT-Creation-Date: 2012-02-16 13:18+0100\n"
+"POT-Creation-Date: 2012-02-25 14:32+0100\n"
 "PO-Revision-Date: 2012-01-02 11:54+0200\n"
 "Last-Translator: István Füley <ifuley@tigercomp.ro>\n"
 "Language-Team: Hungarian <vdr@linuxtv.org>\n"
@@ -1033,9 +1033,6 @@
 msgid "Setup.Recording$Margin at stop (min)"
 msgstr "Idõeltolás a befejezésnél (perc)"
 
-msgid "Setup.Recording$Primary limit"
-msgstr "Alsó prioritás határ"
-
 msgid "Setup.Recording$Default priority"
 msgstr "Alapértelmezett prioritás"
 
diff -ruN vdr-1.7.24/po/it_IT.po vdr-1.7.25/po/it_IT.po
--- vdr-1.7.24/po/it_IT.po	2012-02-16 13:18:32.000000000 +0100
+++ vdr-1.7.25/po/it_IT.po	2012-02-25 14:37:48.000000000 +0100
@@ -11,7 +11,7 @@
 msgstr ""
 "Project-Id-Version: VDR 1.6.0\n"
 "Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
-"POT-Creation-Date: 2012-02-16 13:18+0100\n"
+"POT-Creation-Date: 2012-02-25 14:32+0100\n"
 "PO-Revision-Date: 2012-01-15 19:11+0100\n"
 "Last-Translator: Diego Pierotto <vdr-italian@tiscali.it>\n"
 "Language-Team: Italian <vdr@linuxtv.org>\n"
@@ -1036,9 +1036,6 @@
 msgid "Setup.Recording$Margin at stop (min)"
 msgstr "Margine finale (min)"
 
-msgid "Setup.Recording$Primary limit"
-msgstr "Limite primario"
-
 msgid "Setup.Recording$Default priority"
 msgstr "PrioritÃ  predefinita"
 
diff -ruN vdr-1.7.24/po/lt_LT.po vdr-1.7.25/po/lt_LT.po
--- vdr-1.7.24/po/lt_LT.po	2012-02-16 13:18:32.000000000 +0100
+++ vdr-1.7.25/po/lt_LT.po	2012-02-25 14:37:48.000000000 +0100
@@ -7,7 +7,7 @@
 msgstr ""
 "Project-Id-Version: VDR 1.7.16\n"
 "Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
-"POT-Creation-Date: 2012-02-16 13:18+0100\n"
+"POT-Creation-Date: 2012-02-25 14:32+0100\n"
 "PO-Revision-Date: 2010-10-30 11:55+0200\n"
 "Last-Translator: Valdemaras Pipiras <varas@ambernet.lt>\n"
 "Language-Team: Lithuanian <vdr@linuxtv.org>\n"
@@ -1029,9 +1029,6 @@
 msgid "Setup.Recording$Margin at stop (min)"
 msgstr "Ä®raÅ¡o pabaigos uÅ¾laikymo laikas (min)"
 
-msgid "Setup.Recording$Primary limit"
-msgstr "Pagrindinio Ä¯vesties Ä¯renginio suderinimo prioritetas"
-
 msgid "Setup.Recording$Default priority"
 msgstr "Numatytas laikmaÄ�io prioritetas"
 
diff -ruN vdr-1.7.24/po/mk_MK.po vdr-1.7.25/po/mk_MK.po
--- vdr-1.7.24/po/mk_MK.po	2012-02-16 13:18:32.000000000 +0100
+++ vdr-1.7.25/po/mk_MK.po	2012-02-25 14:37:49.000000000 +0100
@@ -7,7 +7,7 @@
 msgstr ""
 "Project-Id-Version: VDR-1.7.14\n"
 "Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
-"POT-Creation-Date: 2012-02-16 13:18+0100\n"
+"POT-Creation-Date: 2012-02-25 14:32+0100\n"
 "PO-Revision-Date: 2010-03-11 00:54+0100\n"
 "Last-Translator: Dimitar Petrovski <dimeptr@gmail.com>\n"
 "Language-Team: Macedonian <en@li.org>\n"
@@ -1030,9 +1030,6 @@
 msgid "Setup.Recording$Margin at stop (min)"
 msgstr "Ð ÐµÐ·ÐµÑ€Ð²Ð° Ð½Ð° ÐºÑ€Ð°Ñ˜Ð¾Ñ‚ Ð½Ð° Ñ�Ð½Ð¸Ð¼Ð°ÑšÐµ (Ð¼Ð¸Ð½)"
 
-msgid "Setup.Recording$Primary limit"
-msgstr "Ð¡Ñ‚Ð°Ð½Ð´Ð°Ñ€Ð´Ð½Ð¾ Ð¾Ð³Ñ€Ð°Ð½ÑƒÑ‡ÑƒÐ²Ð°ÑšÐµ"
-
 msgid "Setup.Recording$Default priority"
 msgstr "Ð—Ð°Ð´Ð°Ð´ÐµÐ½ Ð¿Ñ€Ð¸Ð¾Ñ€Ð¸Ñ‚ÐµÑ‚"
 
diff -ruN vdr-1.7.24/po/nl_NL.po vdr-1.7.25/po/nl_NL.po
--- vdr-1.7.24/po/nl_NL.po	2012-02-16 13:18:32.000000000 +0100
+++ vdr-1.7.25/po/nl_NL.po	2012-02-25 14:37:48.000000000 +0100
@@ -11,7 +11,7 @@
 msgstr ""
 "Project-Id-Version: VDR 1.6.0\n"
 "Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
-"POT-Creation-Date: 2012-02-16 13:18+0100\n"
+"POT-Creation-Date: 2012-02-25 14:32+0100\n"
 "PO-Revision-Date: 2008-02-26 17:20+0100\n"
 "Last-Translator: Johan Schuring <johan.schuring@vetteblei.nl>\n"
 "Language-Team: Dutch <vdr@linuxtv.org>\n"
@@ -1033,9 +1033,6 @@
 msgid "Setup.Recording$Margin at stop (min)"
 msgstr "Tijd marge eind (min)"
 
-msgid "Setup.Recording$Primary limit"
-msgstr "Eerste grens"
-
 msgid "Setup.Recording$Default priority"
 msgstr "Standaard prioriteit"
 
diff -ruN vdr-1.7.24/po/nn_NO.po vdr-1.7.25/po/nn_NO.po
--- vdr-1.7.24/po/nn_NO.po	2012-02-16 13:18:32.000000000 +0100
+++ vdr-1.7.25/po/nn_NO.po	2012-02-25 14:37:49.000000000 +0100
@@ -8,7 +8,7 @@
 msgstr ""
 "Project-Id-Version: VDR 1.6.0\n"
 "Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
-"POT-Creation-Date: 2012-02-16 13:18+0100\n"
+"POT-Creation-Date: 2012-02-25 14:32+0100\n"
 "PO-Revision-Date: 2007-08-12 14:17+0200\n"
 "Last-Translator: Truls Slevigen <truls@slevigen.no>\n"
 "Language-Team: Norwegian Nynorsk <vdr@linuxtv.org>\n"
@@ -1030,9 +1030,6 @@
 msgid "Setup.Recording$Margin at stop (min)"
 msgstr "Opptaksmargin slutt (min)"
 
-msgid "Setup.Recording$Primary limit"
-msgstr "Prioritetsgrense HovedDVB"
-
 msgid "Setup.Recording$Default priority"
 msgstr "Normal prioritet (Timer)"
 
diff -ruN vdr-1.7.24/po/pl_PL.po vdr-1.7.25/po/pl_PL.po
--- vdr-1.7.24/po/pl_PL.po	2012-02-16 13:18:31.000000000 +0100
+++ vdr-1.7.25/po/pl_PL.po	2012-02-25 14:37:48.000000000 +0100
@@ -8,7 +8,7 @@
 msgstr ""
 "Project-Id-Version: VDR 1.6.0\n"
 "Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
-"POT-Creation-Date: 2012-02-16 13:18+0100\n"
+"POT-Creation-Date: 2012-02-25 14:32+0100\n"
 "PO-Revision-Date: 2008-03-09 12:59+0100\n"
 "Last-Translator: Michael Rakowski <mrak@gmx.de>\n"
 "Language-Team: Polish <vdr@linuxtv.org>\n"
@@ -1030,9 +1030,6 @@
 msgid "Setup.Recording$Margin at stop (min)"
 msgstr "Margines na koñcu (min)"
 
-msgid "Setup.Recording$Primary limit"
-msgstr "Podstawowy limit"
-
 msgid "Setup.Recording$Default priority"
 msgstr "Domy¶lny priorytet"
 
diff -ruN vdr-1.7.24/po/pt_PT.po vdr-1.7.25/po/pt_PT.po
--- vdr-1.7.24/po/pt_PT.po	2012-02-16 13:18:30.000000000 +0100
+++ vdr-1.7.25/po/pt_PT.po	2012-02-25 14:37:47.000000000 +0100
@@ -8,7 +8,7 @@
 msgstr ""
 "Project-Id-Version: VDR 1.7.15\n"
 "Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
-"POT-Creation-Date: 2012-02-16 13:18+0100\n"
+"POT-Creation-Date: 2012-02-25 14:32+0100\n"
 "PO-Revision-Date: 2010-03-28 22:49+0100\n"
 "Last-Translator: Cris Silva <hudokkow@gmail.com>\n"
 "Language-Team: Portuguese <vdr@linuxtv.org>\n"
@@ -1030,9 +1030,6 @@
 msgid "Setup.Recording$Margin at stop (min)"
 msgstr "Margem do fim (min)"
 
-msgid "Setup.Recording$Primary limit"
-msgstr "Limite primário"
-
 msgid "Setup.Recording$Default priority"
 msgstr "PPrioridade padrão"
 
diff -ruN vdr-1.7.24/po/ro_RO.po vdr-1.7.25/po/ro_RO.po
--- vdr-1.7.24/po/ro_RO.po	2012-02-16 13:18:31.000000000 +0100
+++ vdr-1.7.25/po/ro_RO.po	2012-02-25 14:37:48.000000000 +0100
@@ -8,7 +8,7 @@
 msgstr ""
 "Project-Id-Version: VDR 1.7.12\n"
 "Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
-"POT-Creation-Date: 2012-02-16 13:18+0100\n"
+"POT-Creation-Date: 2012-02-25 14:32+0100\n"
 "PO-Revision-Date: 2011-03-10 23:52+0100\n"
 "Last-Translator: Lucian Muresan <lucianm@users.sourceforge.net>\n"
 "Language-Team: Romanian <vdr@linuxtv.org>\n"
@@ -1032,9 +1032,6 @@
 msgid "Setup.Recording$Margin at stop (min)"
 msgstr "Marjã la oprire (min)"
 
-msgid "Setup.Recording$Primary limit"
-msgstr "Limitã primarã"
-
 msgid "Setup.Recording$Default priority"
 msgstr "Prioritate implicitã"
 
diff -ruN vdr-1.7.24/po/ru_RU.po vdr-1.7.25/po/ru_RU.po
--- vdr-1.7.24/po/ru_RU.po	2012-02-16 13:18:33.000000000 +0100
+++ vdr-1.7.25/po/ru_RU.po	2012-02-25 14:37:49.000000000 +0100
@@ -8,7 +8,7 @@
 msgstr ""
 "Project-Id-Version: VDR 1.6.0\n"
 "Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
-"POT-Creation-Date: 2012-02-16 13:18+0100\n"
+"POT-Creation-Date: 2012-02-25 14:32+0100\n"
 "PO-Revision-Date: 2008-12-15 14:37+0100\n"
 "Last-Translator: Oleg Roitburd <oleg@roitburd.de>\n"
 "Language-Team: Russian <vdr@linuxtv.org>\n"
@@ -1030,9 +1030,6 @@
 msgid "Setup.Recording$Margin at stop (min)"
 msgstr "·ÐßÐ×ÔëÒÐÝØÕ ÞáâÐÝÞÒÚØ ×ÐßØáØ (ÜØÝ)"
 
-msgid "Setup.Recording$Primary limit"
-msgstr "¼ØÝ. ßàØÞàØâÕâ ×ÐåÒÐâÐ ÞáÝ. ãáâàÞÙáâÒÐ"
-
 msgid "Setup.Recording$Default priority"
 msgstr "¿àØÞàØâÕâ âÐÙÜÕàÐ ßÞ ãÜÞÛçÐÝØî"
 
diff -ruN vdr-1.7.24/po/sk_SK.po vdr-1.7.25/po/sk_SK.po
--- vdr-1.7.24/po/sk_SK.po	2012-02-16 13:18:32.000000000 +0100
+++ vdr-1.7.25/po/sk_SK.po	2012-02-25 14:37:49.000000000 +0100
@@ -7,7 +7,7 @@
 msgstr ""
 "Project-Id-Version: VDR 1.7.16\n"
 "Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
-"POT-Creation-Date: 2012-02-16 13:18+0100\n"
+"POT-Creation-Date: 2012-02-25 14:32+0100\n"
 "PO-Revision-Date: 2011-02-15 16:29+0100\n"
 "Last-Translator: Milan Hrala <hrala.milan@gmail.com>\n"
 "Language-Team: Slovak <vdr@linuxtv.org>\n"
@@ -1029,9 +1029,6 @@
 msgid "Setup.Recording$Margin at stop (min)"
 msgstr "Nahráva» po konci (min)"
 
-msgid "Setup.Recording$Primary limit"
-msgstr "Hlavný limit"
-
 msgid "Setup.Recording$Default priority"
 msgstr "Predvolená priorita"
 
diff -ruN vdr-1.7.24/po/sl_SI.po vdr-1.7.25/po/sl_SI.po
--- vdr-1.7.24/po/sl_SI.po	2012-02-16 13:18:33.000000000 +0100
+++ vdr-1.7.25/po/sl_SI.po	2012-02-25 14:37:49.000000000 +0100
@@ -8,7 +8,7 @@
 msgstr ""
 "Project-Id-Version: VDR 1.6.0\n"
 "Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
-"POT-Creation-Date: 2012-02-16 13:18+0100\n"
+"POT-Creation-Date: 2012-02-25 14:32+0100\n"
 "PO-Revision-Date: 2008-02-28 19:44+0100\n"
 "Last-Translator: Matjaz Thaler <matjaz.thaler@guest.arnes.si>\n"
 "Language-Team: Slovenian <vdr@linuxtv.org>\n"
@@ -1030,9 +1030,6 @@
 msgid "Setup.Recording$Margin at stop (min)"
 msgstr "Zamik konca snemanja (min)"
 
-msgid "Setup.Recording$Primary limit"
-msgstr "Primarna meja"
-
 msgid "Setup.Recording$Default priority"
 msgstr "Privzeta prioriteta"
 
diff -ruN vdr-1.7.24/po/sr_SR.po vdr-1.7.25/po/sr_SR.po
--- vdr-1.7.24/po/sr_SR.po	2012-02-16 13:18:32.000000000 +0100
+++ vdr-1.7.25/po/sr_SR.po	2012-02-25 14:37:48.000000000 +0100
@@ -7,7 +7,7 @@
 msgstr ""
 "Project-Id-Version: VDR 1.7.1\n"
 "Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
-"POT-Creation-Date: 2012-02-16 13:18+0100\n"
+"POT-Creation-Date: 2012-02-25 14:32+0100\n"
 "PO-Revision-Date: 2011-01-09 15:57+0100\n"
 "Last-Translator: Milan Cvijanoviæ <elcom_cvijo@hotmail.com>\n"
 "Language-Team: Serbian <vdr@linuxtv.org>\n"
@@ -1051,9 +1051,6 @@
 msgid "Setup.Recording$Margin at stop (min)"
 msgstr "Rezerva na kraju (min)"
 
-msgid "Setup.Recording$Primary limit"
-msgstr "Standardno ogranièenje"
-
 msgid "Setup.Recording$Default priority"
 msgstr "Zadani prioritet"
 
diff -ruN vdr-1.7.24/po/sv_SE.po vdr-1.7.25/po/sv_SE.po
--- vdr-1.7.24/po/sv_SE.po	2012-02-16 13:18:32.000000000 +0100
+++ vdr-1.7.25/po/sv_SE.po	2012-02-25 14:37:48.000000000 +0100
@@ -10,7 +10,7 @@
 msgstr ""
 "Project-Id-Version: VDR 1.6.0\n"
 "Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
-"POT-Creation-Date: 2012-02-16 13:18+0100\n"
+"POT-Creation-Date: 2012-02-25 14:32+0100\n"
 "PO-Revision-Date: 2008-03-12 18:25+0100\n"
 "Last-Translator: Magnus Andersson <svankan@bahnhof.se>\n"
 "Language-Team: Swedish <vdr@linuxtv.org>\n"
@@ -1032,9 +1032,6 @@
 msgid "Setup.Recording$Margin at stop (min)"
 msgstr "Marginal för stopp (min)"
 
-msgid "Setup.Recording$Primary limit"
-msgstr "Primär gräns"
-
 msgid "Setup.Recording$Default priority"
 msgstr "Normal prioritet"
 
diff -ruN vdr-1.7.24/po/tr_TR.po vdr-1.7.25/po/tr_TR.po
--- vdr-1.7.24/po/tr_TR.po	2012-02-16 13:18:31.000000000 +0100
+++ vdr-1.7.25/po/tr_TR.po	2012-02-25 14:37:48.000000000 +0100
@@ -7,7 +7,7 @@
 msgstr ""
 "Project-Id-Version: VDR 1.6.0\n"
 "Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
-"POT-Creation-Date: 2012-02-16 13:18+0100\n"
+"POT-Creation-Date: 2012-02-25 14:32+0100\n"
 "PO-Revision-Date: 2008-02-28 00:33+0100\n"
 "Last-Translator: Oktay Yolgeçen <oktay_73@yahoo.de>\n"
 "Language-Team: Turkish <vdr@linuxtv.org>\n"
@@ -1029,9 +1029,6 @@
 msgid "Setup.Recording$Margin at stop (min)"
 msgstr "Sonunda tolerans (dak)"
 
-msgid "Setup.Recording$Primary limit"
-msgstr "Primer limit"
-
 msgid "Setup.Recording$Default priority"
 msgstr "Olaðan priorite"
 
diff -ruN vdr-1.7.24/po/uk_UA.po vdr-1.7.25/po/uk_UA.po
--- vdr-1.7.24/po/uk_UA.po	2012-02-16 13:18:32.000000000 +0100
+++ vdr-1.7.25/po/uk_UA.po	2012-02-25 14:37:48.000000000 +0100
@@ -7,7 +7,7 @@
 msgstr ""
 "Project-Id-Version: VDR 1.7.7\n"
 "Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
-"POT-Creation-Date: 2012-02-16 13:18+0100\n"
+"POT-Creation-Date: 2012-02-25 14:32+0100\n"
 "PO-Revision-Date: 2010-04-25 16:35+0200\n"
 "Last-Translator: Yarema aka Knedlyk <yupadmin@gmail.com>\n"
 "Language-Team: Ukrainian <vdr@linuxtv.org>\n"
@@ -1029,9 +1029,6 @@
 msgid "Setup.Recording$Margin at stop (min)"
 msgstr "Ð—Ð°Ð¿Ñ–Ð·Ð½ÐµÐ½Ð½Ñ� Ð·ÑƒÐ¿Ð¸Ð½ÐºÐ¸ Ð·Ð°Ð¿Ð¸Ñ�Ñƒ (Ñ…Ð²)"
 
-msgid "Setup.Recording$Primary limit"
-msgstr "ÐœÑ–Ð½. Ð¿Ñ€Ñ–Ð¾Ñ€Ð¸Ñ‚ÐµÑ‚ Ð·Ð°Ñ…Ð¾Ð¿Ð»ÐµÐ½Ð½Ñ� Ð¾Ñ�Ð½. Ð¿Ñ€Ð¸Ñ�Ñ‚Ñ€Ð¾ÑŽ"
-
 msgid "Setup.Recording$Default priority"
 msgstr "ÐŸÑ€Ñ–Ð¾Ñ€Ð¸Ñ‚ÐµÑ‚ Ñ‚Ð°Ð¹Ð¼ÐµÑ€Ð° Ð¿Ð¾ Ð·Ð°Ð¼Ð¾Ð²Ñ‡ÑƒÐ²Ð°Ð½Ð½ÑŽ"
 
diff -ruN vdr-1.7.24/po/zh_CN.po vdr-1.7.25/po/zh_CN.po
--- vdr-1.7.24/po/zh_CN.po	2012-02-16 13:18:31.000000000 +0100
+++ vdr-1.7.25/po/zh_CN.po	2012-02-25 14:37:48.000000000 +0100
@@ -7,7 +7,7 @@
 msgstr ""
 "Project-Id-Version: VDR 1.6.0\n"
 "Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
-"POT-Creation-Date: 2012-02-16 13:18+0100\n"
+"POT-Creation-Date: 2012-02-25 14:32+0100\n"
 "PO-Revision-Date: 2009-09-23 23:50+0800\n"
 "Last-Translator: Nan Feng <nfgx@21cn.com>\n"
 "Language-Team: Chinese (simplified) <vdr@linuxtv.org>\n"
@@ -1032,9 +1032,6 @@
 msgid "Setup.Recording$Margin at stop (min)"
 msgstr "æ—¶é—´æ­£åœ¨å�œæ­¢ (min)"
 
-msgid "Setup.Recording$Primary limit"
-msgstr "ä¸»è¦�é™�åˆ¶"
-
 msgid "Setup.Recording$Default priority"
 msgstr "é»˜è®¤ä¼˜å…ˆ"
 
diff -ruN vdr-1.7.24/rcu.c vdr-1.7.25/rcu.c
--- vdr-1.7.24/rcu.c	2007-08-24 15:15:48.000000000 +0200
+++ vdr-1.7.25/rcu.c	1970-01-01 01:00:00.000000000 +0100
@@ -1,329 +0,0 @@
-/*
- * rcu.c: RCU remote control
- *
- * See the main source file 'vdr.c' for copyright information and
- * how to reach the author.
- *
- * $Id: rcu.c 2.0 2007/08/24 13:15:48 kls Exp $
- */
-
-#include "rcu.h"
-#include <netinet/in.h>
-#include <termios.h>
-#include <unistd.h>
-#include "tools.h"
-
-#define REPEATLIMIT      150 // ms
-#define REPEATDELAY      350 // ms
-#define HANDSHAKETIMEOUT  20 // ms
-
-cRcuRemote::cRcuRemote(const char *DeviceName)
-:cRemote("RCU")
-,cThread("RCU remote control")
-{
-  dp = 0;
-  mode = modeB;
-  code = 0;
-  number = 0;
-  data = 0;
-  receivedCommand = false;
-  if ((f = open(DeviceName, O_RDWR | O_NONBLOCK)) >= 0) {
-     struct termios t;
-     if (tcgetattr(f, &t) == 0) {
-        cfsetspeed(&t, B9600);
-        cfmakeraw(&t);
-        if (tcsetattr(f, TCSAFLUSH, &t) == 0) {
-           SetNumber(8888);
-           const char *Setup = GetSetup();
-           if (Setup) {
-              code = *Setup;
-              SetCode(code);
-              isyslog("connecting to %s remote control using code %c", Name(), code);
-              }
-           Start();
-           return;
-           }
-        }
-     LOG_ERROR_STR(DeviceName);
-     close(f);
-     }
-  else
-     LOG_ERROR_STR(DeviceName);
-  f = -1;
-}
-
-cRcuRemote::~cRcuRemote()
-{
-  Cancel();
-}
-
-bool cRcuRemote::Ready(void)
-{
-  return f >= 0;
-}
-
-bool cRcuRemote::Initialize(void)
-{
-  if (f >= 0) {
-     unsigned char Code = '0';
-     isyslog("trying codes for %s remote control...", Name());
-     for (;;) {
-         if (DetectCode(&Code)) {
-            code = Code;
-            break;
-            }
-         }
-     isyslog("established connection to %s remote control using code %c", Name(), code);
-     char buffer[16];
-     snprintf(buffer, sizeof(buffer), "%c", code);
-     PutSetup(buffer);
-     return true;
-     }
-  return false;
-}
-
-void cRcuRemote::Action(void)
-{
-#pragma pack(1)
-  union {
-    struct {
-      unsigned short address;
-      unsigned int command;
-      } data;
-    unsigned char raw[6];
-    } buffer;
-#pragma pack()
-
-  time_t LastCodeRefresh = 0;
-  cTimeMs FirstTime;
-  unsigned char LastCode = 0, LastMode = 0;
-  uint64_t LastCommand = ~0; // 0x00 might be a valid command
-  unsigned int LastData = 0;
-  bool repeat = false;
-
-  while (Running() && f >= 0) {
-        if (ReceiveByte(REPEATLIMIT) == 'X') {
-           for (int i = 0; i < 6; i++) {
-               int b = ReceiveByte();
-               if (b >= 0) {
-                  buffer.raw[i] = b;
-                  if (i == 5) {
-                     unsigned short Address = ntohs(buffer.data.address); // the PIC sends bytes in "network order"
-                     uint64_t       Command = ntohl(buffer.data.command);
-                     if (code == 'B' && Address == 0x0000 && Command == 0x00004000)
-                        // Well, well, if it isn't the "d-box"...
-                        // This remote control sends the above command before and after
-                        // each keypress - let's just drop this:
-                        break;
-                     Command |= uint64_t(Address) << 32;
-                     if (Command != LastCommand) {
-                        LastCommand = Command;
-                        repeat = false;
-                        FirstTime.Set();
-                        }
-                     else {
-                        if (FirstTime.Elapsed() < REPEATDELAY)
-                           break; // repeat function kicks in after a short delay
-                        repeat = true;
-                        }
-                     Put(Command, repeat);
-                     receivedCommand = true;
-                     }
-                  }
-               else
-                  break;
-               }
-           }
-        else if (repeat) { // the last one was a repeat, so let's generate a release
-           Put(LastCommand, false, true);
-           repeat = false;
-           LastCommand = ~0;
-           }
-        else {
-           unsigned int d = data;
-           if (d != LastData) {
-              SendData(d);
-              LastData = d;
-              }
-           unsigned char c = code;
-           if (c != LastCode) {
-              SendCommand(c);
-              LastCode = c;
-              }
-           unsigned char m = mode;
-           if (m != LastMode) {
-              SendCommand(m);
-              LastMode = m;
-              }
-           LastCommand = ~0;
-           }
-        if (!repeat && code && time(NULL) - LastCodeRefresh > 60) {
-           SendCommand(code); // in case the PIC listens to the wrong code
-           LastCodeRefresh = time(NULL);
-           }
-        }
-}
-
-int cRcuRemote::ReceiveByte(int TimeoutMs)
-{
-  // Returns the byte if one was received within a timeout, -1 otherwise
-  if (cFile::FileReady(f, TimeoutMs)) {
-     unsigned char b;
-     if (safe_read(f, &b, 1) == 1)
-        return b;
-     else
-        LOG_ERROR;
-     }
-  return -1;
-}
-
-bool cRcuRemote::SendByteHandshake(unsigned char c)
-{
-  if (f >= 0) {
-     int w = write(f, &c, 1);
-     if (w == 1) {
-        for (int reply = ReceiveByte(HANDSHAKETIMEOUT); reply >= 0;) {
-            if (reply == c)
-               return true;
-            else if (reply == 'X') {
-               // skip any incoming RC code - it will come again
-               for (int i = 6; i--;) {
-                   if (ReceiveByte() < 0)
-                      return false;
-                   }
-               }
-            else
-               return false;
-            }
-        }
-     LOG_ERROR;
-     }
-  return false;
-}
-
-bool cRcuRemote::SendByte(unsigned char c)
-{
-  for (int retry = 5; retry--;) {
-      if (SendByteHandshake(c))
-         return true;
-      }
-  return false;
-}
-
-bool cRcuRemote::SendData(unsigned int n)
-{
-  for (int i = 0; i < 4; i++) {
-      if (!SendByte(n & 0x7F))
-         return false;
-      n >>= 8;
-      }
-  return SendCommand(mode);
-}
-
-void cRcuRemote::SetCode(unsigned char Code)
-{
-  code = Code;
-}
-
-void cRcuRemote::SetMode(unsigned char Mode)
-{
-  mode = Mode;
-}
-
-bool cRcuRemote::SendCommand(unsigned char Cmd)
-{
-  return SendByte(Cmd | 0x80);
-}
-
-void cRcuRemote::SetNumber(int n, bool Hex)
-{
-  number = n;
-  if (!Hex) {
-     char buf[8];
-     sprintf(buf, "%4d", n & 0xFFFF);
-     n = 0;
-     for (char *d = buf; *d; d++) {
-         if (*d == ' ')
-            *d = 0xF;
-         n = (n << 4) | ((*d - '0') & 0x0F);
-         }
-     }
-  unsigned int m = 0;
-  for (int i = 0; i < 4; i++) {
-      m <<= 8;
-      m |= ((i & 0x03) << 5) | (n & 0x0F) | (((dp >> i) & 0x01) << 4);
-      n >>= 4;
-      }
-  data = m;
-}
-
-void cRcuRemote::SetString(const char *s)
-{
-  const char *chars = mode == modeH ? "0123456789ABCDEF" : "0123456789-EHLP ";
-  int n = 0;
-
-  for (int i = 0; *s && i < 4; s++, i++) {
-      n <<= 4;
-      for (const char *c = chars; *c; c++) {
-          if (*c == *s) {
-             n |= c - chars;
-             break;
-             }
-          }
-      }
-  SetNumber(n, true);
-}
-
-void cRcuRemote::SetPoints(unsigned char Dp, bool On)
-{
-  if (On)
-     dp |= Dp;
-  else
-     dp &= ~Dp;
-  SetNumber(number);
-}
-
-bool cRcuRemote::DetectCode(unsigned char *Code)
-{
-  // Caller should initialize 'Code' to 0 and call DetectCode()
-  // until it returns true. Whenever DetectCode() returns false
-  // and 'Code' is not 0, the caller can use 'Code' to display
-  // a message like "Trying code '%c'". If false is returned and
-  // 'Code' is 0, all possible codes have been tried and the caller
-  // can either stop calling DetectCode() (and give some error
-  // message), or start all over again.
-  if (*Code < 'A' || *Code > 'D') {
-     *Code = 'A';
-     return false;
-     }
-  if (*Code <= 'D') {
-     SetMode(modeH);
-     char buf[5];
-     sprintf(buf, "C0D%c", *Code);
-     SetString(buf);
-     SetCode(*Code);
-     cCondWait::SleepMs(2 * REPEATDELAY);
-     if (receivedCommand) {
-        SetMode(modeB);
-        SetString("----");
-        return true;
-        }
-     if (*Code < 'D') {
-        (*Code)++;
-        return false;
-        }
-     }
-  *Code = 0;
-  return false;
-}
-
-void cRcuRemote::ChannelSwitch(const cDevice *Device, int ChannelNumber)
-{
-  if (ChannelNumber && Device->IsPrimaryDevice())
-     SetNumber(cDevice::CurrentChannel());
-}
-
-void cRcuRemote::Recording(const cDevice *Device, const char *Name, const char *FileName, bool On)
-{
-  SetPoints(1 << Device->DeviceNumber(), Device->Receiving());
-}
diff -ruN vdr-1.7.24/rcu.h vdr-1.7.25/rcu.h
--- vdr-1.7.24/rcu.h	2007-08-24 15:15:48.000000000 +0200
+++ vdr-1.7.25/rcu.h	1970-01-01 01:00:00.000000000 +0100
@@ -1,46 +0,0 @@
-/*
- * rcu.h: RCU remote control
- *
- * See the main source file 'vdr.c' for copyright information and
- * how to reach the author.
- *
- * $Id: rcu.h 2.0 2007/08/24 13:15:48 kls Exp $
- */
-
-#ifndef __RCU_H
-#define __RCU_H
-
-#include "remote.h"
-#include "status.h"
-#include "thread.h"
-
-class cRcuRemote : public cRemote, private cThread, private cStatus {
-private:
-  enum { modeH = 'h', modeB = 'b', modeS = 's' };
-  int f;
-  unsigned char dp, code, mode;
-  int number;
-  unsigned int data;
-  bool receivedCommand;
-  bool SendCommand(unsigned char Cmd);
-  int ReceiveByte(int TimeoutMs = 0);
-  bool SendByteHandshake(unsigned char c);
-  bool SendByte(unsigned char c);
-  bool SendData(unsigned int n);
-  void SetCode(unsigned char Code);
-  void SetMode(unsigned char Mode);
-  void SetNumber(int n, bool Hex = false);
-  void SetPoints(unsigned char Dp, bool On);
-  void SetString(const char *s);
-  bool DetectCode(unsigned char *Code);
-  virtual void Action(void);
-  virtual void ChannelSwitch(const cDevice *Device, int ChannelNumber);
-  virtual void Recording(const cDevice *Device, const char *Name, const char *FileName, bool On);
-public:
-  cRcuRemote(const char *DeviceName);
-  virtual ~cRcuRemote();
-  virtual bool Ready(void);
-  virtual bool Initialize(void);
-  };
-
-#endif //__RCU_H
diff -ruN vdr-1.7.24/receiver.c vdr-1.7.25/receiver.c
--- vdr-1.7.24/receiver.c	2010-12-13 00:16:25.000000000 +0100
+++ vdr-1.7.25/receiver.c	2012-02-29 12:49:36.000000000 +0100
@@ -4,7 +4,7 @@
  * See the main source file 'vdr.c' for copyright information and
  * how to reach the author.
  *
- * $Id: receiver.c 2.4 2010/12/12 23:16:25 kls Exp $
+ * $Id: receiver.c 2.5 2012/02/29 11:49:36 kls Exp $
  */
 
 #include "receiver.h"
@@ -16,7 +16,7 @@
 {
   device = NULL;
   channelID = ChannelID;
-  priority = Priority;
+  priority = constrain(Priority, MINPRIORITY, MAXPRIORITY);
   numPids = 0;
   AddPid(Pid);
   AddPids(Pids1);
@@ -28,7 +28,7 @@
 cReceiver::cReceiver(const cChannel *Channel, int Priority)
 {
   device = NULL;
-  priority = Priority;
+  priority = constrain(Priority, MINPRIORITY, MAXPRIORITY);
   numPids = 0;
   SetPids(Channel);
 }
diff -ruN vdr-1.7.24/receiver.h vdr-1.7.25/receiver.h
--- vdr-1.7.24/receiver.h	2011-12-04 14:38:17.000000000 +0100
+++ vdr-1.7.25/receiver.h	2012-03-01 10:50:24.000000000 +0100
@@ -4,7 +4,7 @@
  * See the main source file 'vdr.c' for copyright information and
  * how to reach the author.
  *
- * $Id: receiver.h 2.2 2011/12/04 13:38:17 kls Exp $
+ * $Id: receiver.h 2.5 2012/03/01 09:50:24 kls Exp $
  */
 
 #ifndef __RECEIVER_H
@@ -43,15 +43,15 @@
 #ifdef LEGACY_CRECEIVER
   cReceiver(tChannelID ChannelID, int Priority, int Pid, const int *Pids1 = NULL, const int *Pids2 = NULL, const int *Pids3 = NULL);
 #endif
-  cReceiver(const cChannel *Channel = NULL, int Priority = -1);
+  cReceiver(const cChannel *Channel = NULL, int Priority = MINPRIORITY);
                ///< Creates a new receiver for the given Channel with the given Priority.
-               ///< If Channel is not NULL, its pids set by a call to SetPids().
+               ///< If Channel is not NULL, its pids are set by a call to SetPids().
                ///< Otherwise pids can be added to the receiver by separate calls to the AddPid[s]
                ///< functions.
                ///< The total number of PIDs added to a receiver must not exceed MAXRECEIVEPIDS.
-               ///< Priority may be any value in the range -99..99. Negative values indicate
-               ///< that this cReceiver may be detached at any time (without blocking the
-               ///< cDevice it is attached to).
+               ///< Priority may be any value in the range MINPRIORITY...MAXPRIORITY. Negative values indicate
+               ///< that this cReceiver may be detached at any time in favor of a timer recording
+               ///< or live viewing (without blocking the cDevice it is attached to).
   virtual ~cReceiver();
   bool AddPid(int Pid);
                ///< Adds the given Pid to the list of PIDs of this receiver.
diff -ruN vdr-1.7.24/recording.c vdr-1.7.25/recording.c
--- vdr-1.7.24/recording.c	2012-02-19 11:44:45.000000000 +0100
+++ vdr-1.7.25/recording.c	2012-02-26 14:58:26.000000000 +0100
@@ -4,7 +4,7 @@
  * See the main source file 'vdr.c' for copyright information and
  * how to reach the author.
  *
- * $Id: recording.c 2.50 2012/02/19 10:44:45 kls Exp $
+ * $Id: recording.c 2.51 2012/02/26 13:58:26 kls Exp $
  */
 
 #include "recording.h"
@@ -1571,7 +1571,7 @@
      if (!Record && PauseLive) {
         // Wait until the index file contains at least two frames:
         time_t tmax = time(NULL) + MAXWAITFORINDEXFILE;
-        while (time(NULL) < tmax && FileSize(fileName) < 2 * sizeof(tIndexTs))
+        while (time(NULL) < tmax && FileSize(fileName) < off_t(2 * sizeof(tIndexTs)))
               cCondWait::SleepMs(INDEXFILETESTINTERVAL);
         }
      int delta = 0;
diff -ruN vdr-1.7.24/remux.c vdr-1.7.25/remux.c
--- vdr-1.7.24/remux.c	2012-01-12 13:07:58.000000000 +0100
+++ vdr-1.7.25/remux.c	2012-03-02 11:56:49.000000000 +0100
@@ -4,7 +4,7 @@
  * See the main source file 'vdr.c' for copyright information and
  * how to reach the author.
  *
- * $Id: remux.c 2.63 2012/01/12 12:07:58 kls Exp $
+ * $Id: remux.c 2.64 2012/03/02 10:56:49 kls Exp $
  */
 
 #include "remux.h"
@@ -514,7 +514,7 @@
                       break;
            case 0x03: // STREAMTYPE_11172_AUDIO
            case 0x04: // STREAMTYPE_13818_AUDIO
-           case 0x0F: // ISO/IEC 13818-7 Audio with ADTS transport sytax
+           case 0x0F: // ISO/IEC 13818-7 Audio with ADTS transport syntax
            case 0x11: // ISO/IEC 14496-3 Audio with LATM transport syntax
                       {
                       if (NumApids < MAXAPIDS) {
diff -ruN vdr-1.7.24/skins.c vdr-1.7.25/skins.c
--- vdr-1.7.24/skins.c	2011-08-21 13:21:19.000000000 +0200
+++ vdr-1.7.25/skins.c	2012-02-20 12:47:15.000000000 +0100
@@ -4,7 +4,7 @@
  * See the main source file 'vdr.c' for copyright information and
  * how to reach the author.
  *
- * $Id: skins.c 2.3 2011/08/21 11:21:19 kls Exp $
+ * $Id: skins.c 2.4 2012/02/20 11:47:15 kls Exp $
  */
 
 #include "skins.h"
@@ -78,7 +78,7 @@
   tabs[3] = Tab3 ? tabs[2] + Tab3 : 0;
   tabs[4] = Tab4 ? tabs[3] + Tab4 : 0;
   tabs[5] = Tab5 ? tabs[4] + Tab5 : 0;
-  int AvgCharWidth = Setup.FontOsdSize * 3 / 5; // just an estimate
+  int AvgCharWidth = Setup.FontOsdSize * 4 / 6; // just an estimate
   for (int i = 1; i < MaxTabs; i++)
       tabs[i] *= AvgCharWidth;
 }
diff -ruN vdr-1.7.24/timers.c vdr-1.7.25/timers.c
--- vdr-1.7.24/timers.c	2011-08-06 15:13:54.000000000 +0200
+++ vdr-1.7.25/timers.c	2012-02-27 10:38:41.000000000 +0100
@@ -4,7 +4,7 @@
  * See the main source file 'vdr.c' for copyright information and
  * how to reach the author.
  *
- * $Id: timers.c 2.5 2011/08/06 13:13:54 kls Exp $
+ * $Id: timers.c 2.8 2012/02/27 09:38:41 kls Exp $
  */
 
 #include "timers.h"
@@ -384,13 +384,14 @@
   return mktime(&tm);
 }
 
-char *cTimer::SetFile(const char *File)
+void cTimer::SetFile(const char *File)
 {
   if (!isempty(File))
      Utf8Strn0Cpy(file, File, sizeof(file));
-  return file;
 }
 
+#define EITPRESENTFOLLOWINGRATE 10 // max. seconds between two occurrences of the "EIT present/following table for the actual multiplex" (2s by the standard, using some more for safety)
+
 bool cTimer::Matches(time_t t, bool Directly, int Margin) const
 {
   startTime = stopTime = 0;
@@ -434,8 +435,12 @@
         if (Margin || !Directly) {
            startTime = event->StartTime();
            stopTime = event->EndTime();
-           if (!Margin)
-              return event->IsRunning(true);
+           if (!Margin) { // this is an actual check
+              if (event->Schedule()->PresentSeenWithin(EITPRESENTFOLLOWINGRATE)) // VPS control can only work with up-to-date events...
+                 return event->IsRunning(true);
+              else
+                 return startTime <= t && t < stopTime; // ...otherwise we fall back to normal timer handling
+              }
            }
         }
      return startTime <= t + Margin && t < stopTime; // must stop *before* stopTime to allow adjacent timers
@@ -591,11 +596,42 @@
   inVpsMargin = InVpsMargin;
 }
 
+void cTimer::SetDay(time_t Day)
+{
+  day = Day;
+}
+
+void cTimer::SetWeekDays(int WeekDays)
+{
+  weekdays = WeekDays;
+}
+
+void cTimer::SetStart(int Start)
+{
+  start = Start;
+}
+
+void cTimer::SetStop(int Stop)
+{
+  stop = Stop;
+}
+
 void cTimer::SetPriority(int Priority)
 {
   priority = Priority;
 }
 
+void cTimer::SetLifetime(int Lifetime)
+{
+  lifetime = Lifetime;
+}
+
+void cTimer::SetAux(const char *Aux)
+{
+  free(aux);
+  aux = strdup(Aux);
+}
+
 void cTimer::SetDeferred(int Seconds)
 {
   deferred = time(NULL) + Seconds;
diff -ruN vdr-1.7.24/timers.h vdr-1.7.25/timers.h
--- vdr-1.7.24/timers.h	2011-08-06 14:59:32.000000000 +0200
+++ vdr-1.7.25/timers.h	2012-02-20 16:52:57.000000000 +0100
@@ -4,7 +4,7 @@
  * See the main source file 'vdr.c' for copyright information and
  * how to reach the author.
  *
- * $Id: timers.h 2.1 2011/08/06 12:59:32 kls Exp $
+ * $Id: timers.h 2.3 2012/02/20 15:52:57 kls Exp $
  */
 
 #ifndef __TIMERS_H
@@ -75,7 +75,7 @@
   bool DayMatches(time_t t) const;
   static time_t IncDay(time_t t, int Days);
   static time_t SetTime(time_t t, int SecondsFromMidnight);
-  char *SetFile(const char *File);
+  void SetFile(const char *File);
   bool Matches(time_t t = 0, bool Directly = false, int Margin = 0) const;
   int Matches(const cEvent *Event, int *Overlap = NULL) const;
   bool Expired(void) const;
@@ -86,7 +86,13 @@
   void SetRecording(bool Recording);
   void SetPending(bool Pending);
   void SetInVpsMargin(bool InVpsMargin);
+  void SetDay(time_t Day);
+  void SetWeekDays(int WeekDays);
+  void SetStart(int Start);
+  void SetStop(int Stop);
   void SetPriority(int Priority);
+  void SetLifetime(int Lifetime);
+  void SetAux(const char *Aux);
   void SetDeferred(int Seconds);
   void SetFlags(uint Flags);
   void ClrFlags(uint Flags);
diff -ruN vdr-1.7.24/tools.h vdr-1.7.25/tools.h
--- vdr-1.7.24/tools.h	2012-02-18 16:29:50.000000000 +0100
+++ vdr-1.7.25/tools.h	2012-02-29 11:41:00.000000000 +0100
@@ -4,7 +4,7 @@
  * See the main source file 'vdr.c' for copyright information and
  * how to reach the author.
  *
- * $Id: tools.h 2.15 2012/02/18 15:29:50 kls Exp $
+ * $Id: tools.h 2.16 2012/02/29 10:41:00 kls Exp $
  */
 
 #ifndef __TOOLS_H
@@ -57,6 +57,8 @@
 template<class T> inline void swap(T &a, T &b) { T t = a; a = b; b = t; }
 #endif
 
+template<class T> inline T constrain(T v, T l, T h) { return v < l ? l : v > h ? h : v; }
+
 void syslog_with_tid(int priority, const char *format, ...) __attribute__ ((format (printf, 2, 3)));
 
 #define BCDCHARTOINT(x) (10 * ((x & 0xF0) >> 4) + (x & 0xF))
diff -ruN vdr-1.7.24/transfer.c vdr-1.7.25/transfer.c
--- vdr-1.7.24/transfer.c	2010-01-30 12:10:25.000000000 +0100
+++ vdr-1.7.25/transfer.c	2012-02-29 15:16:23.000000000 +0100
@@ -4,7 +4,7 @@
  * See the main source file 'vdr.c' for copyright information and
  * how to reach the author.
  *
- * $Id: transfer.c 2.5 2010/01/30 11:10:25 kls Exp $
+ * $Id: transfer.c 2.6 2012/02/29 14:16:23 kls Exp $
  */
 
 #include "transfer.h"
@@ -12,7 +12,7 @@
 // --- cTransfer -------------------------------------------------------------
 
 cTransfer::cTransfer(const cChannel *Channel)
-:cReceiver(Channel)
+:cReceiver(Channel, TRANSFERPRIORITY)
 {
   patPmtGenerator.SetChannel(Channel);
 }
diff -ruN vdr-1.7.24/vdr.1 vdr-1.7.25/vdr.1
--- vdr-1.7.24/vdr.1	2011-12-04 15:41:00.000000000 +0100
+++ vdr-1.7.25/vdr.1	2012-02-27 12:01:17.000000000 +0100
@@ -8,7 +8,7 @@
 .\" License as specified in the file COPYING that comes with the
 .\" vdr distribution.
 .\"
-.\" $Id: vdr.1 2.7 2011/12/04 14:41:00 kls Exp $
+.\" $Id: vdr.1 2.8 2012/02/27 11:01:17 kls Exp $
 .\"
 .TH vdr 1 "10 Feb 2008" "1.6" "Video Disk Recorder"
 .SH NAME
@@ -33,8 +33,7 @@
 and provide audio and video signal outputs.
 
 \fBvdr\fR uses the On Screen Display of the DVB card to display its menus.
-It can be controlled by the PC keyboard, a home built "Remote Control Unit"
-(RCU) or the "Linux Infrared Remote Control" (LIRC).
+It can be controlled by the PC keyboard or the "Linux Infrared Remote Control" (LIRC).
 
 Remote access is possible via the "Simple Video Disk Recorder Protocol" (SVDRP),
 which can be accessed on port 6419, for instance by \fBtelnet\fR.
@@ -154,10 +153,6 @@
 
 (note the quotes around the asterisk to prevent wildcard expansion).
 .TP
-.BI \-\-rcu[= path ]
-Use a serial port remote control device.
-If \fIpath\fR is omitted, vdr uses \fI/dev/ttyS1\fR.
-.TP
 .BI \-r\  cmd ,\ \-\-record= cmd
 Call \fIcmd\fR before and after a recording. See the file \fIINSTALL\fR for
 more information.
diff -ruN vdr-1.7.24/vdr.5 vdr-1.7.25/vdr.5
--- vdr-1.7.24/vdr.5	2012-01-11 14:16:57.000000000 +0100
+++ vdr-1.7.25/vdr.5	2012-02-27 12:05:15.000000000 +0100
@@ -8,7 +8,7 @@
 .\" License as specified in the file COPYING that comes with the
 .\" vdr distribution.
 .\"
-.\" $Id: vdr.5 2.27 2012/01/11 13:16:57 kls Exp $
+.\" $Id: vdr.5 2.28 2012/02/27 11:05:15 kls Exp $
 .\"
 .TH vdr 5 "10 Feb 2008" "1.6" "Video Disk Recorder Files"
 .SH NAME
@@ -541,7 +541,7 @@
 \fBname.key  code\fR
 
 where \fBname\fR is the name of the remote control (for instance KBD for the
-PC keyboard, RCU for the home-built "Remote Control Unit", or LIRC for the
+PC keyboard, or LIRC for the
 "Linux Infrared Remote Control"), \fBkey\fR is the name of the key that is
 defined (like Up, Down, Menu etc.), and \fBcode\fR is a character string that
 this remote control delivers when the given key is pressed.
diff -ruN vdr-1.7.24/vdr.c vdr-1.7.25/vdr.c
--- vdr-1.7.24/vdr.c	2012-02-19 12:37:35.000000000 +0100
+++ vdr-1.7.25/vdr.c	2012-02-27 11:59:55.000000000 +0100
@@ -22,7 +22,7 @@
  *
  * The project's page is at http://www.tvdr.de
  *
- * $Id: vdr.c 2.29 2012/02/19 11:37:35 kls Exp $
+ * $Id: vdr.c 2.30 2012/02/27 10:59:55 kls Exp $
  */
 
 #include <getopt.h>
@@ -53,7 +53,6 @@
 #include "menu.h"
 #include "osdbase.h"
 #include "plugin.h"
-#include "rcu.h"
 #include "recording.h"
 #include "shutdown.h"
 #include "skinclassic.h"
@@ -201,14 +200,11 @@
 
   bool UseKbd = true;
   const char *LircDevice = NULL;
-  const char *RcuDevice = NULL;
 #if !defined(REMOTE_KBD)
   UseKbd = false;
 #endif
 #if defined(REMOTE_LIRC)
   LircDevice = LIRC_DEVICE;
-#elif defined(REMOTE_RCU)
-  RcuDevice = RCU_DEVICE;
 #endif
 #if defined(VDR_USER)
   VdrUser = VDR_USER;
@@ -236,7 +232,6 @@
       { "no-kbd",   no_argument,       NULL, 'n' | 0x100 },
       { "plugin",   required_argument, NULL, 'P' },
       { "port",     required_argument, NULL, 'p' },
-      { "rcu",      optional_argument, NULL, 'r' | 0x100 },
       { "record",   required_argument, NULL, 'r' },
       { "shutdown", required_argument, NULL, 's' },
       { "split",    no_argument,       NULL, 's' | 0x100 },
@@ -350,9 +345,6 @@
                     break;
           case 'P': PluginManager.AddPlugin(optarg);
                     break;
-          case 'r' | 0x100:
-                    RcuDevice = optarg ? : RCU_DEVICE;
-                    break;
           case 'r': cRecordingUserCommand::SetCommand(optarg);
                     break;
           case 's': ShutdownHandler.SetShutdownCommand(optarg);
@@ -455,8 +447,6 @@
                "  -p PORT,  --port=PORT    use PORT for SVDRP (default: %d)\n"
                "                           0 turns off SVDRP\n"
                "  -P OPT,   --plugin=OPT   load a plugin defined by the given options\n"
-               "            --rcu[=PATH]   use a remote control device, attached to PATH\n"
-               "                           (default: %s)\n"
                "  -r CMD,   --record=CMD   call CMD before and after a recording\n"
                "  -s CMD,   --shutdown=CMD call CMD to shutdown the computer\n"
                "            --split        split edited files at the editing marks (only\n"
@@ -479,7 +469,6 @@
                LIRC_DEVICE,
                LOCDIR,
                DEFAULTSVDRPPORT,
-               RCU_DEVICE,
                VideoDirectory,
                DEFAULTWATCHDOG
                );
@@ -707,8 +696,6 @@
      }
 
   // Remote Controls:
-  if (RcuDevice)
-     new cRcuRemote(RcuDevice);
   if (LircDevice)
      new cLircRemote(LircDevice);
   if (!DaemonMode && HasStdin && UseKbd)
