diff -ruN vdr-1.7.22/CONTRIBUTORS vdr-1.7.23/CONTRIBUTORS
--- vdr-1.7.22/CONTRIBUTORS	2011-12-04 15:53:41.000000000 +0100
+++ vdr-1.7.23/CONTRIBUTORS	2012-01-15 15:23:20.000000000 +0100
@@ -271,6 +271,7 @@
  for his help in keeping 'channels.conf.cable' and 'channels.conf.terr' up to date
  for helping to test new DVB-T handling
  for reporting a bug in switching the video format in the Setup/DVB menu
+ for reporting a problem with frozen live view in conjunction with device bonding
 
 Matjaz Thaler <matjaz.thaler@guest.arnes.si>
  for improving AC3 decoding when replaying DVDs
@@ -1120,6 +1121,10 @@
  for fixing handling DVB subtitles and implementing decoding textual DVB subtitles
  for adding file name and line number to LOG_ERROR_STR()
  for replacing all calls to sleep() with cCondWait::SleepMs()
+ for fixing cDvbSubtitleConverter::SetOsdData()
+ for adding support for DVB-T2 to libsi
+ for adding support for handling DVB-T2 transponders
+ for suggesting to add member functions Adapter() and Frontend() to cDvbDevice
 
 Ralf Klueber <ralf.klueber@vodafone.com>
  for reporting a bug in cutting a recording if there is only a single editing mark
@@ -1927,8 +1932,13 @@
  for fixing a crash when deleting a recording while cutting it
  for fixing several spelling errors
  for adding generating a pkg-config file to the Makefile
- for removing the '.pl' suffix from all scripts (thanks to Ville Skyttä).
+ for removing the '.pl' suffix from all scripts
  for changing the default location for the LIRC socket to /var/run/lirc/lircd
+ for pointing out that the argument sequence in the memset() call in the ctor of
+ cSatCableNumbers was wrong
+ for removing a redundant NULL check in cDvbSpuDecoder::setTime()
+ for pointing out that the variable HasSnr was unused in cDvbTuner::GetSignalQuality()
+ for fixing cConfig::Load() for g++ version 4.7.0
 
 Steffen Beyer <cpunk@reactor.de>
  for fixing setting the colored button help after deleting a recording in case the next
@@ -2256,6 +2266,7 @@
  for suggesting to implement a function to determine the length of a recording's
  index file
  for fixing setting the start time of an edited recording
+ for adding support for HbbTV to libsi
 
 Pekka Mauno <pekka.mauno@iki.fi>
  for fixing cSchedule::GetFollowingEvent() in case there is currently no present
@@ -2483,6 +2494,8 @@
  for implementing sending all frames to devices that can handle them in fast forward
  trick speeds
  for implementing the setup option "Recording/Pause key handling"
+ for fixing the SVDRP command CLRE for a single channel in case there are events
+ that have a timer
 
 Elias Luttinen <el@iki.fi>
  for improving the description of where logging goes in the INSTALL file
@@ -2544,6 +2557,10 @@
  for reporting a missing reset of maxNumber in cChannels::Renumber()
  for reporting some missing 'const' in tChannelID
  for suggesting to add optional case insensitive sorting to cStringList::Sort()
+ for reporting a bug in handling symbolic links in cRecordings::ScanVideoDir()
+ for reporting a memory leak in cRecordings::ScanVideoDir() in case there are too
+ many link levels
+ for reporting a bug in cListBase::Move() in case From and To are equal
 
 Ales Jurik <ajurik@quick.cz>
  for reporting broken SI data on Czech/Slovak channels after changing the default
@@ -2732,8 +2749,9 @@
 Milan Cvijanovic <elcom_cvijo@hotmail.com>
  for translating OSD texts to the Serbian language
 
-Frank Neumann <frank.neumann@hp.com>
+Frank Neumann <fnu@yavdr.org>
  for suggesting to reduce the thread and I/O priority cCuttingThread::Action()
+ for reporting a problem with tuning timeouts when using SCR with multiple tuners
 
 Gerald Dachs <vdr@dachsweb.de>
  for reporting a problem with checking for minimum line length of 21 characters in
@@ -2792,3 +2810,9 @@
 Dominic Evans <oldmanuk@gmail.com>
  for making the SVDRP command LSTC accepts channel IDs
  for adding cap_net_raw to the capabilities that are not dropped
+
+Torsten Lang <info@torstenlang.de>
+ for reporting a problem with newline characters in stream component descriptions
+ of EPG data from BSkyB's "MTV MUSIC"
+ for suggesting to make BIDI support check at runtime whether the system runs with
+ UTF-8
diff -ruN vdr-1.7.22/HISTORY vdr-1.7.23/HISTORY
--- vdr-1.7.22/HISTORY	2011-12-04 16:09:45.000000000 +0100
+++ vdr-1.7.23/HISTORY	2012-01-15 15:26:54.000000000 +0100
@@ -6780,3 +6780,58 @@
 - Added file name and line number to LOG_ERROR_STR() (thanks to Rolf Ahrenberg).
 - Replaced all calls to sleep() with cCondWait::SleepMs() (thanks to Rolf Ahrenberg).
 - Fixed a crash with malformed SI data (patch from vdr-portal).
+
+2012-01-15: Version 1.7.23
+
+- Removed the '.pl' suffix from svdrpsend.pl (sorry, I missed that one).
+- Fixed bonding more than two devices.
+- Fixed handling symbolic links in cRecordings::ScanVideoDir() (reported by
+  Sundararaj Reel).
+- Fixed a memory leak in cRecordings::ScanVideoDir() in case there are too many
+  link levels (reported by Sundararaj Reel).
+- Removed redundant memset() in the ctor of cSatCableNumbers (triggered by
+  Ville Skyttä pointing out that the argument sequence in the call was wrong).
+- Removed a redundant NULL check in cDvbSpuDecoder::setTime() (thanks to Ville Skyttä).
+- Added HasSnr to the DEBUG_SIGNALQUALITY output in cDvbTuner::GetSignalQuality()
+  (triggered by Ville Skyttä pointing out that the variable HasSnr was unused).
+- Updated the Finnish OSD texts (thanks to Rolf Ahrenberg).
+- Added support for HbbTV to libsi (thanks to Christoph Haubrich).
+- Added support for devices with more than one delivery system per frontend.
+  This requires a DVB driver with version 5.5 or higher that can handle the
+  DTV_ENUM_DELSYS call. With older drivers it will fall back to one delivery
+  system per frontend.
+- Updated the Hungarian language texts (thanks to István Füley).
+- cDvbTuner::ExecuteDiseqc() now makes sure only one tuner sends SCR commands
+  at any given time (reported by Frank Neumann).
+- cEvent::FixEpgBugs() now replaces any newline characters in stream component
+  descriptions with blanks (thanks to Torsten Lang for reporting a problem with
+  EPG data from BSkyB's "MTV MUSIC", S28.2E-2-2010-7012).
+- Fixed cDvbSubtitleConverter::SetOsdData() (thanks to Rolf Ahrenberg).
+- Fixed cListBase::Move() in case From and To are equal (reported by Sundararaj
+  Reel).
+- Added support for DVB-T2 to libsi (thanks to Rolf Ahrenberg).
+- Added support for handling DVB-T2 transponders.  This requires a DVB driver
+  with version 5.3 or higher that can handle the DTV_DVBT2_PLP_ID call (thanks
+  to Rolf Ahrenberg).
+- Fixed cConfig::Load() for g++ version 4.7.0 (thanks to Ville Skyttä).
+- Fixed a possible memory corruption in cTsToPes::GetPes() in case of broken
+  TS packets, e.g. when switching channels.
+- Fixed the SVDRP command CLRE for a single channel in case there are events
+  that have a timer (thanks to Timo Eskola).
+- BIDI support now checks at runtime whether the system runs with UTF-8 (suggested
+  by Torsten Lang).
+- Added member functions Adapter() and Frontend() to cDvbDevice (suggested by
+  Rolf Ahrenberg).
+- The parameters that are only used by "second generation" delivery systems (DVB-S2
+  and DVB-T2) are no longer written into channels.conf for "first generation"
+  delivery systems (DVB-S and DVB-T).
+- Changed IndexToHMSF() so that it can handle negative Index values.
+- Added option -N to the msgmerge call in the Makefile, because fuzzy translation
+  mostly resulted in useless strings.
+- The new setup option "Replay/Show remaining time" can be used to switch between
+  showing the total length or the remaining time of the recording that is currently
+  replayed.
+- Fixed wrongfully displaying the length of a recording in the title of the replay
+  progress display.
+- Fixed frozen live view with device bonding in case the bonded master is used for
+  live viewing (reported by Uwe Scheffler).
diff -ruN vdr-1.7.22/MANUAL vdr-1.7.23/MANUAL
--- vdr-1.7.22/MANUAL	2011-12-03 16:31:50.000000000 +0100
+++ vdr-1.7.23/MANUAL	2012-01-14 14:03:21.000000000 +0100
@@ -856,6 +856,10 @@
 
   Show replay mode = no  Turns displaying the current replay mode on or off.
 
+  Show remaining time = no
+                         Defines whether the replay progress display shows the
+                         remaining time or the total length of the recording.
+
   Resume ID = 0          Defines an additional ID that can be used in a multi user
                          environment, so that every user has his/her own resume
                          files for each recording. The valid range is 0...99, with
diff -ruN vdr-1.7.22/Makefile vdr-1.7.23/Makefile
--- vdr-1.7.22/Makefile	2011-12-04 15:41:00.000000000 +0100
+++ vdr-1.7.23/Makefile	2012-01-14 14:09:10.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.22 2011/12/04 14:41:00 kls Exp $
+# $Id: Makefile 2.23 2012/01/14 13:09:10 kls Exp $
 
 .DELETE_ON_ERROR:
 
@@ -139,7 +139,7 @@
 	xgettext -C -cTRANSLATORS --no-wrap --no-location -k -ktr -ktrNOOP --package-name=VDR --package-version=$(VDRVERSION) --msgid-bugs-address='<vdr-bugs@tvdr.de>' -o $@ `ls $^`
 
 %.po: $(I18Npot)
-	msgmerge -U --no-wrap --no-location --backup=none -q $@ $<
+	msgmerge -U --no-wrap --no-location --backup=none -q -N $@ $<
 	@touch $@
 
 $(I18Nmsgs): $(LOCALEDIR)/%/LC_MESSAGES/vdr.mo: $(PODIR)/%.mo
diff -ruN vdr-1.7.22/PLUGINS/src/pictures/HISTORY vdr-1.7.23/PLUGINS/src/pictures/HISTORY
--- vdr-1.7.22/PLUGINS/src/pictures/HISTORY	2011-11-02 21:58:22.000000000 +0100
+++ vdr-1.7.23/PLUGINS/src/pictures/HISTORY	2012-01-08 14:29:01.000000000 +0100
@@ -59,3 +59,7 @@
 2011-11-02:
 
 - Fixed handling images that are rotated by 180 degrees in pic2mpg.
+
+2012-01-08:
+
+- Added option -o to pic2mpg.
diff -ruN vdr-1.7.22/PLUGINS/src/pictures/pic2mpg vdr-1.7.23/PLUGINS/src/pictures/pic2mpg
--- vdr-1.7.22/PLUGINS/src/pictures/pic2mpg	2011-11-02 18:20:37.000000000 +0100
+++ vdr-1.7.23/PLUGINS/src/pictures/pic2mpg	2012-01-08 14:27:17.000000000 +0100
@@ -7,7 +7,7 @@
 #
 # See the README file for copyright information and how to reach the author.
 #
-# $Id: pic2mpg 2.3 2011/11/02 17:20:37 kls Exp $
+# $Id: pic2mpg 2.4 2012/01/08 13:27:17 kls Exp $
 
 use File::Path;
 use File::Spec;
@@ -20,15 +20,17 @@
 
 Options: -f             Force conversion
          -h             print Help
+         -o percent     overscan in percent
          -s size        Screen size (WIDTHxHEIGHT, default is 1920x1080)
          -v num         Verbose (0=none, 1=list files, 2=detailed)
 };
 
-getopts("fhs:v:") || die $Usage;
+getopts("fho:s:v:") || die $Usage;
 
 die $Usage if $opt_h;
 
 $Force     = $opt_f;
+$Overscan  = $opt_o || 0;
 $Size      = $opt_s || "1920x1080";
 $Verbose   = $opt_v;
 
@@ -54,6 +56,15 @@
 die "$0: file or directory not found: $ARGV[0]\n" unless -e $ARGV[0];
 die "$0: source and destination must be different\n" if $ARGV[0] eq $ARGV[1];
 
+$Extent = $Size;
+if ($Overscan > 0) {
+   my ($x, $y) = $Size =~ /(.*)x(.*)/;
+   my $r = (100 + $Overscan) / 100;
+   $x = int($x * $r + 0.5);
+   $y = int($y * $r + 0.5);
+   $Extent = "${x}x$y";
+   }
+
 # Convert a single file:
 
 if (-f $ARGV[0]) {
@@ -130,7 +141,7 @@
   $Pict = EscapeMeta($Pict);
   $Mpeg = EscapeMeta($Mpeg);
   print "$Pict -> $Mpeg $Rotate\n" if $ListFiles;
-  my $Cmd = "convert $Pict -background '#000000' $Rotate -resize $Size -gravity center -extent $Size ppm:- | "
+  my $Cmd = "convert $Pict -background '#000000' $Rotate -resize $Size -gravity center -extent $Extent ppm:- | "
           . "ffmpeg -f image2pipe -vcodec ppm -i pipe:0 -an -vcodec libx264 -vpre baseline -s $Size -qscale 2 -f mpegts -y $Mpeg "
           . ($Detailed ? "" : "2>/dev/null");
   !system($Cmd) || die "$Cmd: $!\n";
diff -ruN vdr-1.7.22/config.c vdr-1.7.23/config.c
--- vdr-1.7.22/config.c	2011-12-03 16:21:30.000000000 +0100
+++ vdr-1.7.23/config.c	2012-01-14 14:04:59.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.16 2011/12/03 15:21:30 kls Exp $
+ * $Id: config.c 2.18 2012/01/14 13:04:59 kls Exp $
  */
 
 #include "config.h"
@@ -69,7 +69,6 @@
 {
   size = Size;
   array = MALLOC(int, size);
-  memset(array, size * sizeof(int), 0);
   FromString(s);
 }
 
@@ -454,6 +453,7 @@
   NextWakeupTime = 0;
   MultiSpeedMode = 0;
   ShowReplayMode = 0;
+  ShowRemainingTime = 0;
   ResumeID = 0;
   CurrentChannel = -1;
   CurrentVolume = MAXVOLUME;
@@ -648,6 +648,7 @@
   else if (!strcasecmp(Name, "NextWakeupTime"))      NextWakeupTime     = atoi(Value);
   else if (!strcasecmp(Name, "MultiSpeedMode"))      MultiSpeedMode     = atoi(Value);
   else if (!strcasecmp(Name, "ShowReplayMode"))      ShowReplayMode     = atoi(Value);
+  else if (!strcasecmp(Name, "ShowRemainingTime"))   ShowRemainingTime  = atoi(Value);
   else if (!strcasecmp(Name, "ResumeID"))            ResumeID           = atoi(Value);
   else if (!strcasecmp(Name, "CurrentChannel"))      CurrentChannel     = atoi(Value);
   else if (!strcasecmp(Name, "CurrentVolume"))       CurrentVolume      = atoi(Value);
@@ -745,6 +746,7 @@
   Store("NextWakeupTime",     NextWakeupTime);
   Store("MultiSpeedMode",     MultiSpeedMode);
   Store("ShowReplayMode",     ShowReplayMode);
+  Store("ShowRemainingTime",  ShowRemainingTime);
   Store("ResumeID",           ResumeID);
   Store("CurrentChannel",     CurrentChannel);
   Store("CurrentVolume",      CurrentVolume);
diff -ruN vdr-1.7.22/config.h vdr-1.7.23/config.h
--- vdr-1.7.22/config.h	2011-12-03 15:19:52.000000000 +0100
+++ vdr-1.7.23/config.h	2012-01-14 14:03:53.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.36 2011/12/03 14:19:52 kls Exp $
+ * $Id: config.h 2.39 2012/01/14 13:03:53 kls Exp $
  */
 
 #ifndef __CONFIG_H
@@ -22,13 +22,13 @@
 
 // VDR's own version number:
 
-#define VDRVERSION  "1.7.22"
-#define VDRVERSNUM   10722  // Version * 10000 + Major * 100 + Minor
+#define VDRVERSION  "1.7.23"
+#define VDRVERSNUM   10723  // Version * 10000 + Major * 100 + Minor
 
 // The plugin API's version number:
 
-#define APIVERSION  "1.7.22"
-#define APIVERSNUM   10722  // Version * 10000 + Major * 100 + Minor
+#define APIVERSION  "1.7.23"
+#define APIVERSNUM   10723  // 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
@@ -122,7 +122,7 @@
                 if (!isempty(s)) {
                    T *l = new T;
                    if (l->Parse(s))
-                      Add(l);
+                      this->Add(l);
                    else {
                       esyslog("ERROR: error in %s, line %d", fileName, line);
                       delete l;
@@ -302,6 +302,7 @@
   time_t NextWakeupTime;
   int MultiSpeedMode;
   int ShowReplayMode;
+  int ShowRemainingTime;
   int ResumeID;
   int CurrentChannel;
   int CurrentVolume;
diff -ruN vdr-1.7.22/dvbdevice.c vdr-1.7.23/dvbdevice.c
--- vdr-1.7.22/dvbdevice.c	2011-12-03 16:24:27.000000000 +0100
+++ vdr-1.7.23/dvbdevice.c	2012-01-15 15:31:47.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.48 2011/12/03 15:24:27 kls Exp $
+ * $Id: dvbdevice.c 2.56 2012/01/15 14:31:47 kls Exp $
  */
 
 #include "dvbdevice.h"
@@ -44,9 +44,12 @@
   };
 
 const tDvbParameterMap BandwidthValues[] = {
-  {   6, 6000000, "6 MHz" },
-  {   7, 7000000, "7 MHz" },
-  {   8, 8000000, "8 MHz" },
+  {    5,  5000000, "5 MHz" },
+  {    6,  6000000, "6 MHz" },
+  {    7,  7000000, "7 MHz" },
+  {    8,  8000000, "8 MHz" },
+  {   10, 10000000, "10 MHz" },
+  { 1712,  1712000, "1.712 MHz" },
   {  -1, 0, NULL }
   };
 
@@ -75,31 +78,49 @@
   {   2, QPSK,     "QPSK" },
   {   5, PSK_8,    "8PSK" },
   {   6, APSK_16,  "16APSK" },
+  {   7, APSK_32,  "32APSK" },
   {  10, VSB_8,    "VSB8" },
   {  11, VSB_16,   "VSB16" },
-  { 998, QAM_AUTO, "QAMAUTO" },
+  {  12, DQPSK,    "DQPSK" },
+  { 999, QAM_AUTO, trNOOP("auto") },
   {  -1, 0, NULL }
   };
 
-const tDvbParameterMap SystemValues[] = {
-  {   0, SYS_DVBS,  "DVB-S" },
-  {   1, SYS_DVBS2, "DVB-S2" },
+#define DVB_SYSTEM_1 0 // see also nit.c
+#define DVB_SYSTEM_2 1
+
+const tDvbParameterMap SystemValuesSat[] = {
+  {   0, DVB_SYSTEM_1, "DVB-S" },
+  {   1, DVB_SYSTEM_2, "DVB-S2" },
+  {  -1, 0, NULL }
+  };
+
+const tDvbParameterMap SystemValuesTerr[] = {
+  {   0, DVB_SYSTEM_1, "DVB-T" },
+  {   1, DVB_SYSTEM_2, "DVB-T2" },
   {  -1, 0, NULL }
   };
 
 const tDvbParameterMap TransmissionValues[] = {
+  {   1, TRANSMISSION_MODE_1K,   "1K" },
   {   2, TRANSMISSION_MODE_2K,   "2K" },
+  {   4, TRANSMISSION_MODE_4K,   "4K" },
   {   8, TRANSMISSION_MODE_8K,   "8K" },
+  {  16, TRANSMISSION_MODE_16K,  "16K" },
+  {  32, TRANSMISSION_MODE_32K,  "32K" },
   { 999, TRANSMISSION_MODE_AUTO, trNOOP("auto") },
   {  -1, 0, NULL }
   };
 
 const tDvbParameterMap GuardValues[] = {
-  {   4, GUARD_INTERVAL_1_4,  "1/4" },
-  {   8, GUARD_INTERVAL_1_8,  "1/8" },
-  {  16, GUARD_INTERVAL_1_16, "1/16" },
-  {  32, GUARD_INTERVAL_1_32, "1/32" },
-  { 999, GUARD_INTERVAL_AUTO, trNOOP("auto") },
+  {     4, GUARD_INTERVAL_1_4,    "1/4" },
+  {     8, GUARD_INTERVAL_1_8,    "1/8" },
+  {    16, GUARD_INTERVAL_1_16,   "1/16" },
+  {    32, GUARD_INTERVAL_1_32,   "1/32" },
+  {   128, GUARD_INTERVAL_1_128,  "1/128" },
+  { 19128, GUARD_INTERVAL_19_128, "19/128" },
+  { 19256, GUARD_INTERVAL_19_256, "19/256" },
+  {   999, GUARD_INTERVAL_AUTO,   trNOOP("auto") },
   {  -1, 0, NULL }
   };
 
@@ -179,11 +200,12 @@
   coderateH    = FEC_AUTO;
   coderateL    = FEC_AUTO;
   modulation   = QPSK;
-  system       = SYS_DVBS;
+  system       = DVB_SYSTEM_1;
   transmission = TRANSMISSION_MODE_AUTO;
   guard        = GUARD_INTERVAL_AUTO;
   hierarchy    = HIERARCHY_AUTO;
   rollOff      = ROLLOFF_AUTO;
+  plpId        = 0;
   Parse(Parameters);
 }
 
@@ -194,21 +216,22 @@
 
 cString cDvbTransponderParameters::ToString(char Type) const
 {
-#define ST(s) if (strchr(s, Type))
+#define ST(s) if (strchr(s, Type) && (strchr(s, '0' + system + 1) || strchr(s, '*')))
   char buffer[64];
   char *q = buffer;
   *q = 0;
-  ST("  S ")  q += sprintf(q, "%c", polarization);
-  ST("   T")  q += PrintParameter(q, 'B', MapToUser(bandwidth, BandwidthValues));
-  ST(" CST")  q += PrintParameter(q, 'C', MapToUser(coderateH, CoderateValues));
-  ST("   T")  q += PrintParameter(q, 'D', MapToUser(coderateL, CoderateValues));
-  ST("   T")  q += PrintParameter(q, 'G', MapToUser(guard, GuardValues));
-  ST("ACST")  q += PrintParameter(q, 'I', MapToUser(inversion, InversionValues));
-  ST("ACST")  q += PrintParameter(q, 'M', MapToUser(modulation, ModulationValues));
-  ST("  S ")  q += PrintParameter(q, 'O', MapToUser(rollOff, RollOffValues));
-  ST("  S ")  q += PrintParameter(q, 'S', MapToUser(system, SystemValues));
-  ST("   T")  q += PrintParameter(q, 'T', MapToUser(transmission, TransmissionValues));
-  ST("   T")  q += PrintParameter(q, 'Y', MapToUser(hierarchy, HierarchyValues));
+  ST("  S *")  q += sprintf(q, "%c", polarization);
+  ST("   T*")  q += PrintParameter(q, 'B', MapToUser(bandwidth, BandwidthValues));
+  ST(" CST*")  q += PrintParameter(q, 'C', MapToUser(coderateH, CoderateValues));
+  ST("   T*")  q += PrintParameter(q, 'D', MapToUser(coderateL, CoderateValues));
+  ST("   T*")  q += PrintParameter(q, 'G', MapToUser(guard, GuardValues));
+  ST("ACST*")  q += PrintParameter(q, 'I', MapToUser(inversion, InversionValues));
+  ST("ACST*")  q += PrintParameter(q, 'M', MapToUser(modulation, ModulationValues));
+  ST("  S 2")  q += PrintParameter(q, 'O', MapToUser(rollOff, RollOffValues));
+  ST("   T2")  q += PrintParameter(q, 'P', plpId);
+  ST("  ST*")  q += PrintParameter(q, 'S', MapToUser(system, SystemValuesSat)); // we only need the numerical value, so Sat or Terr doesn't matter
+  ST("   T*")  q += PrintParameter(q, 'T', MapToUser(transmission, TransmissionValues));
+  ST("   T*")  q += PrintParameter(q, 'Y', MapToUser(hierarchy, HierarchyValues));
   return buffer;
 }
 
@@ -219,7 +242,7 @@
      errno = 0;
      int n = strtol(s, &p, 10);
      if (!errno && p != s) {
-        Value = MapToDriver(n, Map);
+        Value = Map ? MapToDriver(n, Map) : n;
         if (Value >= 0)
            return p;
         }
@@ -241,8 +264,9 @@
           case 'L': polarization = *s++; break;
           case 'M': s = ParseParameter(s, modulation, ModulationValues); break;
           case 'O': s = ParseParameter(s, rollOff, RollOffValues); break;
+          case 'P': s = ParseParameter(s, plpId); break;
           case 'R': polarization = *s++; break;
-          case 'S': s = ParseParameter(s, system, SystemValues); break;
+          case 'S': s = ParseParameter(s, system, SystemValuesSat); break; // we only need the numerical value, so Sat or Terr doesn't matter
           case 'T': s = ParseParameter(s, transmission, TransmissionValues); break;
           case 'V': polarization = *s++; break;
           case 'Y': s = ParseParameter(s, hierarchy, HierarchyValues); break;
@@ -268,10 +292,10 @@
   int tuneTimeout;
   int lockTimeout;
   time_t lastTimeoutReport;
-  fe_delivery_system frontendType;
   cChannel channel;
   const cDiseqc *lastDiseqc;
   const cScr *scr;
+  bool lnbPowerTurnedOn;
   eTunerStatus tunerStatus;
   cMutex mutex;
   cCondVar locked;
@@ -279,6 +303,7 @@
   cDvbTuner *bondedTuner;
   bool bondedMaster;
   bool bondedMasterFailed;
+  bool SetFrontendType(const cChannel *Channel);
   cString GetBondingParams(const cChannel *Channel = NULL) const;
   void ClearEventQueue(void) const;
   bool GetFrontendStatus(fe_status_t &Status) const;
@@ -287,7 +312,7 @@
   bool SetFrontend(void);
   virtual void Action(void);
 public:
-  cDvbTuner(const cDvbDevice *Device, int Fd_Frontend, int Adapter, int Frontend, fe_delivery_system FrontendType);
+  cDvbTuner(const cDvbDevice *Device, int Fd_Frontend, int Adapter, int Frontend);
   virtual ~cDvbTuner();
   bool Bond(cDvbTuner *Tuner);
   void UnBond(void);
@@ -304,25 +329,23 @@
 
 cMutex cDvbTuner::bondMutex;
 
-cDvbTuner::cDvbTuner(const cDvbDevice *Device, int Fd_Frontend, int Adapter, int Frontend, fe_delivery_system FrontendType)
+cDvbTuner::cDvbTuner(const cDvbDevice *Device, int Fd_Frontend, int Adapter, int Frontend)
 {
   device = Device;
   fd_frontend = Fd_Frontend;
   adapter = Adapter;
   frontend = Frontend;
-  frontendType = FrontendType;
   subsystemId = cDvbDeviceProbe::GetSubsystemId(adapter, frontend);
   tuneTimeout = 0;
   lockTimeout = 0;
   lastTimeoutReport = 0;
   lastDiseqc = NULL;
   scr = NULL;
+  lnbPowerTurnedOn = false;
   tunerStatus = tsIdle;
   bondedTuner = NULL;
   bondedMaster = false;
   bondedMasterFailed = false;
-  if (frontendType == SYS_DVBS || frontendType == SYS_DVBS2)
-     ResetToneAndVoltage(); // must explicitly turn on LNB power
   SetDescription("tuner on frontend %d/%d", adapter, frontend);
   Start();
 }
@@ -346,16 +369,12 @@
 {
   cMutexLock MutexLock(&bondMutex);
   if (!bondedTuner) {
-     if ((frontendType == SYS_DVBS || frontendType == SYS_DVBS2) && (Tuner->frontendType == SYS_DVBS || Tuner->frontendType == SYS_DVBS2)) {
-        ResetToneAndVoltage();
-        bondedMaster = false; // makes sure we don't disturb an existing master
-        bondedTuner = Tuner->bondedTuner ? Tuner->bondedTuner : Tuner;
-        Tuner->bondedTuner = this;
-        dsyslog("tuner %d/%d bonded with tuner %d/%d", adapter, frontend, bondedTuner->adapter, bondedTuner->frontend);
-        return true;
-        }
-     else
-        esyslog("ERROR: can't bond tuner %d/%d with tuner %d/%d (only DVB-S(2) tuners can be bonded)", adapter, frontend, Tuner->adapter, Tuner->frontend);
+     ResetToneAndVoltage();
+     bondedMaster = false; // makes sure we don't disturb an existing master
+     bondedTuner = Tuner->bondedTuner ? Tuner->bondedTuner : Tuner;
+     Tuner->bondedTuner = this;
+     dsyslog("tuner %d/%d bonded with tuner %d/%d", adapter, frontend, bondedTuner->adapter, bondedTuner->frontend);
+     return true;
      }
   else
      esyslog("ERROR: tuner %d/%d already bonded with tuner %d/%d, can't bond with tuner %d/%d", adapter, frontend, bondedTuner->adapter, bondedTuner->frontend, Tuner->adapter, Tuner->frontend);
@@ -468,7 +487,7 @@
                   t->SetChannel(NULL);
               }
            }
-        else if (!BondedMaster->device->Receiving())
+        else if (strcmp(GetBondingParams(Channel), BondedMaster->GetBondingParams()) != 0)
            BondedMaster->SetChannel(Channel);
         }
      cMutexLock MutexLock(&mutex);
@@ -618,7 +637,7 @@
      if (q > 100)
         q = 100;
 #ifdef DEBUG_SIGNALQUALITY
-     fprintf(stderr, "FE %d/%d: %08X Q = %04X %04X %5d %5d %3d%%\n", adapter, frontend, subsystemId, MaxSnr, Snr, HasBer ? int(Ber) : -1, HasUnc ? int(Unc) : -1, q);
+     fprintf(stderr, "FE %d/%d: %08X Q = %04X %04X %d %5d %5d %3d%%\n", adapter, frontend, subsystemId, MaxSnr, Snr, HasSnr, HasBer ? int(Ber) : -1, HasUnc ? int(Unc) : -1, q);
 #endif
      return q;
      }
@@ -634,6 +653,13 @@
 
 void cDvbTuner::ExecuteDiseqc(const cDiseqc *Diseqc, unsigned int *Frequency)
 {
+  if (!lnbPowerTurnedOn) {
+     CHECK(ioctl(fd_frontend, FE_SET_VOLTAGE, SEC_VOLTAGE_13)); // must explicitly turn on LNB power
+     lnbPowerTurnedOn = true;
+     }
+  static cMutex Mutex;
+  if (Diseqc->IsScr())
+     Mutex.Lock(); 
   struct dvb_diseqc_master_cmd cmd;
   const char *CurrentAction = NULL;
   for (;;) {
@@ -654,6 +680,8 @@
       }
   if (scr)
      ResetToneAndVoltage(); // makes sure we don't block the bus!
+  if (Diseqc->IsScr())
+     Mutex.Unlock(); 
 }
 
 void cDvbTuner::ResetToneAndVoltage(void)
@@ -662,6 +690,22 @@
   CHECK(ioctl(fd_frontend, FE_SET_TONE, SEC_TONE_OFF));
 }
 
+static int GetRequiredDeliverySystem(const cChannel *Channel, const cDvbTransponderParameters *Dtp)
+{
+  int ds = SYS_UNDEFINED;
+  if (Channel->IsAtsc())
+     ds = SYS_ATSC;
+  else if (Channel->IsCable())
+     ds = SYS_DVBC_ANNEX_AC;
+  else if (Channel->IsSat())
+     ds = Dtp->System() == DVB_SYSTEM_1 ? SYS_DVBS : SYS_DVBS2;
+  else if (Channel->IsTerr())
+     ds = Dtp->System() == DVB_SYSTEM_1 ? SYS_DVBT : SYS_DVBT2;
+  else
+     esyslog("ERROR: can't determine frontend type for channel %d", Channel->Number());
+  return ds;
+}
+
 bool cDvbTuner::SetFrontend(void)
 {
 #define MAXFRONTENDCMDS 16
@@ -686,6 +730,12 @@
 
   cDvbTransponderParameters dtp(channel.Parameters());
 
+  // Determine the required frontend type:
+  int frontendType = GetRequiredDeliverySystem(&channel, &dtp);
+  if (frontendType == SYS_UNDEFINED)
+     return false;
+
+  SETCMD(DTV_DELIVERY_SYSTEM, frontendType);
   if (frontendType == SYS_DVBS || frontendType == SYS_DVBS2) {
      unsigned int frequency = channel.Frequency();
      if (Setup.DiSEqC) {
@@ -728,22 +778,15 @@
      frequency = abs(frequency); // Allow for C-band, where the frequency is less than the LOF
 
      // DVB-S/DVB-S2 (common parts)
-     SETCMD(DTV_DELIVERY_SYSTEM, dtp.System());
      SETCMD(DTV_FREQUENCY, frequency * 1000UL);
      SETCMD(DTV_MODULATION, dtp.Modulation());
      SETCMD(DTV_SYMBOL_RATE, channel.Srate() * 1000UL);
      SETCMD(DTV_INNER_FEC, dtp.CoderateH());
      SETCMD(DTV_INVERSION, dtp.Inversion());
-     if (dtp.System() == SYS_DVBS2) {
-        if (frontendType == SYS_DVBS2) {
-           // DVB-S2
-           SETCMD(DTV_PILOT, PILOT_AUTO);
-           SETCMD(DTV_ROLLOFF, dtp.RollOff());
-           }
-        else {
-           esyslog("ERROR: frontend %d/%d doesn't provide DVB-S2", adapter, frontend);
-           return false;
-           }
+     if (frontendType == SYS_DVBS2) {
+        // DVB-S2
+        SETCMD(DTV_PILOT, PILOT_AUTO);
+        SETCMD(DTV_ROLLOFF, dtp.RollOff());
         }
      else {
         // DVB-S
@@ -755,7 +798,6 @@
      }
   else if (frontendType == SYS_DVBC_ANNEX_AC || frontendType == SYS_DVBC_ANNEX_B) {
      // DVB-C
-     SETCMD(DTV_DELIVERY_SYSTEM, frontendType);
      SETCMD(DTV_FREQUENCY, FrequencyToHz(channel.Frequency()));
      SETCMD(DTV_INVERSION, dtp.Inversion());
      SETCMD(DTV_SYMBOL_RATE, channel.Srate() * 1000UL);
@@ -765,9 +807,8 @@
      tuneTimeout = DVBC_TUNE_TIMEOUT;
      lockTimeout = DVBC_LOCK_TIMEOUT;
      }
-  else if (frontendType == SYS_DVBT) {
-     // DVB-T
-     SETCMD(DTV_DELIVERY_SYSTEM, frontendType);
+  else if (frontendType == SYS_DVBT || frontendType == SYS_DVBT2) {
+     // DVB-T/DVB-T2 (common parts)
      SETCMD(DTV_FREQUENCY, FrequencyToHz(channel.Frequency()));
      SETCMD(DTV_INVERSION, dtp.Inversion());
      SETCMD(DTV_BANDWIDTH_HZ, dtp.Bandwidth());
@@ -777,13 +818,16 @@
      SETCMD(DTV_TRANSMISSION_MODE, dtp.Transmission());
      SETCMD(DTV_GUARD_INTERVAL, dtp.Guard());
      SETCMD(DTV_HIERARCHY, dtp.Hierarchy());
+     if (frontendType == SYS_DVBT2) {
+        // DVB-T2
+        SETCMD(DTV_DVBT2_PLP_ID, dtp.PlpId());
+        }
 
      tuneTimeout = DVBT_TUNE_TIMEOUT;
      lockTimeout = DVBT_LOCK_TIMEOUT;
      }
   else if (frontendType == SYS_ATSC) {
      // ATSC
-     SETCMD(DTV_DELIVERY_SYSTEM, frontendType);
      SETCMD(DTV_FREQUENCY, FrequencyToHz(channel.Frequency()));
      SETCMD(DTV_INVERSION, dtp.Inversion());
      SETCMD(DTV_MODULATION, dtp.Modulation());
@@ -903,11 +947,12 @@
 cOsdItem *cDvbSourceParam::GetOsdItem(void)
 {
   char type = Source();
+  const tDvbParameterMap *SystemValues = type == 'S' ? SystemValuesSat : SystemValuesTerr;
 #undef ST
 #define ST(s) if (strchr(s, type))
   switch (param++) {
     case  0: ST("  S ")  return new cMenuEditChrItem( tr("Polarization"), &dtp.polarization, "HVLR");             else return GetOsdItem();
-    case  1: ST("  S ")  return new cMenuEditMapItem( tr("System"),       &dtp.system,       SystemValues);       else return GetOsdItem();
+    case  1: ST("  ST")  return new cMenuEditMapItem( tr("System"),       &dtp.system,       SystemValues);       else return GetOsdItem();
     case  2: ST(" CS ")  return new cMenuEditIntItem( tr("Srate"),        &srate);                                else return GetOsdItem();
     case  3: ST("ACST")  return new cMenuEditMapItem( tr("Inversion"),    &dtp.inversion,    InversionValues);    else return GetOsdItem();
     case  4: ST(" CST")  return new cMenuEditMapItem( tr("CoderateH"),    &dtp.coderateH,    CoderateValues);     else return GetOsdItem();
@@ -918,6 +963,7 @@
     case  9: ST("   T")  return new cMenuEditMapItem( tr("Guard"),        &dtp.guard,        GuardValues);        else return GetOsdItem();
     case 10: ST("   T")  return new cMenuEditMapItem( tr("Hierarchy"),    &dtp.hierarchy,    HierarchyValues);    else return GetOsdItem();
     case 11: ST("  S ")  return new cMenuEditMapItem( tr("Rolloff"),      &dtp.rollOff,      RollOffValues);      else return GetOsdItem();
+    case 12: ST("   T")  return new cMenuEditIntItem( tr("PlpId"),        &dtp.plpId,        0, 255);             else return GetOsdItem();
     default: return NULL;
     }
   return NULL;
@@ -928,7 +974,7 @@
 int cDvbDevice::setTransferModeForDolbyDigital = 1;
 cMutex cDvbDevice::bondMutex;
 
-const char *DeliverySystems[] = {
+const char *DeliverySystemNames[] = {
   "UNDEFINED",
   "DVB-C",
   "DVB-C",
@@ -945,6 +991,8 @@
   "DMBTH",
   "CMMB",
   "DAB",
+  "DVB-T2",
+  "TURBO",
   NULL
   };
 
@@ -954,8 +1002,8 @@
   frontend = Frontend;
   ciAdapter = NULL;
   dvbTuner = NULL;
-  frontendType = SYS_UNDEFINED;
-  numProvidedSystems = 0;
+  numDeliverySystems = 0;
+  numModulations = 0;
   bondedDevice = NULL;
   needsDetachBondedReceivers = false;
 
@@ -976,39 +1024,8 @@
   // We only check the devices that must be present - the others will be checked before accessing them://XXX
 
   if (fd_frontend >= 0) {
-     if (ioctl(fd_frontend, FE_GET_INFO, &frontendInfo) >= 0) {
-        switch (frontendInfo.type) {
-          case FE_QPSK: frontendType = (frontendInfo.caps & FE_CAN_2G_MODULATION) ? SYS_DVBS2 : SYS_DVBS; break;
-          case FE_OFDM: frontendType = SYS_DVBT; break;
-          case FE_QAM:  frontendType = SYS_DVBC_ANNEX_AC; break;
-          case FE_ATSC: frontendType = SYS_ATSC; break;
-          default: esyslog("ERROR: unknown frontend type %d on frontend %d/%d", frontendInfo.type, adapter, frontend);
-          }
-        }
-     else
-        LOG_ERROR;
-     if (frontendType != SYS_UNDEFINED) {
-        numProvidedSystems++;
-        if (frontendType == SYS_DVBS2)
-           numProvidedSystems++;
-        char Modulations[64];
-        char *p = Modulations;
-        if (frontendInfo.caps & FE_CAN_QPSK)    { numProvidedSystems++; p += sprintf(p, ",%s", MapToUserString(QPSK, ModulationValues)); }
-        if (frontendInfo.caps & FE_CAN_QAM_16)  { numProvidedSystems++; p += sprintf(p, ",%s", MapToUserString(QAM_16, ModulationValues)); }
-        if (frontendInfo.caps & FE_CAN_QAM_32)  { numProvidedSystems++; p += sprintf(p, ",%s", MapToUserString(QAM_32, ModulationValues)); }
-        if (frontendInfo.caps & FE_CAN_QAM_64)  { numProvidedSystems++; p += sprintf(p, ",%s", MapToUserString(QAM_64, ModulationValues)); }
-        if (frontendInfo.caps & FE_CAN_QAM_128) { numProvidedSystems++; p += sprintf(p, ",%s", MapToUserString(QAM_128, ModulationValues)); }
-        if (frontendInfo.caps & FE_CAN_QAM_256) { numProvidedSystems++; p += sprintf(p, ",%s", MapToUserString(QAM_256, ModulationValues)); }
-        if (frontendInfo.caps & FE_CAN_8VSB)    { numProvidedSystems++; p += sprintf(p, ",%s", MapToUserString(VSB_8, ModulationValues)); }
-        if (frontendInfo.caps & FE_CAN_16VSB)   { numProvidedSystems++; p += sprintf(p, ",%s", MapToUserString(VSB_16, ModulationValues)); }
-        if (frontendInfo.caps & FE_CAN_TURBO_FEC){numProvidedSystems++; p += sprintf(p, ",%s", "TURBO_FEC"); }
-        if (p != Modulations)
-           p = Modulations + 1; // skips first ','
-        else
-           p = (char *)"unknown modulations";
-        isyslog("frontend %d/%d provides %s with %s (\"%s\")", adapter, frontend, DeliverySystems[frontendType], p, frontendInfo.name);
-        dvbTuner = new cDvbTuner(this, fd_frontend, adapter, frontend, frontendType);
-        }
+     if (QueryDeliverySystems(fd_frontend))
+        dvbTuner = new cDvbTuner(this, fd_frontend, adapter, frontend);
      }
   else
      esyslog("ERROR: can't open DVB device %d/%d", adapter, frontend);
@@ -1106,6 +1123,74 @@
   return Found > 0;
 }
 
+bool cDvbDevice::QueryDeliverySystems(int fd_frontend)
+{
+  numDeliverySystems = 0;
+  if (ioctl(fd_frontend, FE_GET_INFO, &frontendInfo) < 0) {
+     LOG_ERROR;
+     return false;
+     }
+#if DVB_API_VERSION > 5 || DVB_API_VERSION_MINOR >= 5
+  dtv_property Frontend[1];
+  memset(&Frontend, 0, sizeof(Frontend));
+  dtv_properties CmdSeq;
+  memset(&CmdSeq, 0, sizeof(CmdSeq));
+  CmdSeq.props = Frontend;
+  SETCMD(DTV_ENUM_DELSYS, 0);
+  int Result = ioctl(fd_frontend, FE_GET_PROPERTY, &CmdSeq);
+  if (Result == 0) {
+     for (uint i = 0; i < Frontend[0].u.buffer.len; i++) {
+         if (numDeliverySystems >= MAXDELIVERYSYSTEMS) {
+            esyslog("ERROR: too many delivery systems on frontend %d/%d", adapter, frontend);
+            break;
+            }
+         deliverySystems[numDeliverySystems++] = Frontend[0].u.buffer.data[i];
+         }
+     }
+  else {
+     esyslog("ERROR: can't query delivery systems on frontend %d/%d - falling back to legacy mode", adapter, frontend);
+#else
+     {
+#endif
+     // Legacy mode (DVB-API < 5.5):
+     switch (frontendInfo.type) {
+       case FE_QPSK: deliverySystems[numDeliverySystems++] = SYS_DVBS;
+                     if (frontendInfo.caps & FE_CAN_2G_MODULATION)
+                        deliverySystems[numDeliverySystems++] = SYS_DVBS2;
+                     break;
+       case FE_OFDM: deliverySystems[numDeliverySystems++] = SYS_DVBT;
+                     if (frontendInfo.caps & FE_CAN_2G_MODULATION)
+                        deliverySystems[numDeliverySystems++] = SYS_DVBT2;
+                     break;
+       case FE_QAM:  deliverySystems[numDeliverySystems++] = SYS_DVBC_ANNEX_AC; break;
+       case FE_ATSC: deliverySystems[numDeliverySystems++] = SYS_ATSC; break;
+       default: esyslog("ERROR: unknown frontend type %d on frontend %d/%d", frontendInfo.type, adapter, frontend);
+       }
+     }
+  if (numDeliverySystems > 0) {
+     cString ds("");
+     for (int i = 0; i < numDeliverySystems; i++)
+         ds = cString::sprintf("%s%s%s", *ds, i ? "," : "", DeliverySystemNames[deliverySystems[i]]);
+     cString ms("");
+     if (frontendInfo.caps & FE_CAN_QPSK)      { numModulations++; ms = cString::sprintf("%s%s%s", *ms, **ms ? "," : "", MapToUserString(QPSK, ModulationValues)); }
+     if (frontendInfo.caps & FE_CAN_QAM_16)    { numModulations++; ms = cString::sprintf("%s%s%s", *ms, **ms ? "," : "", MapToUserString(QAM_16, ModulationValues)); }
+     if (frontendInfo.caps & FE_CAN_QAM_32)    { numModulations++; ms = cString::sprintf("%s%s%s", *ms, **ms ? "," : "", MapToUserString(QAM_32, ModulationValues)); }
+     if (frontendInfo.caps & FE_CAN_QAM_64)    { numModulations++; ms = cString::sprintf("%s%s%s", *ms, **ms ? "," : "", MapToUserString(QAM_64, ModulationValues)); }
+     if (frontendInfo.caps & FE_CAN_QAM_128)   { numModulations++; ms = cString::sprintf("%s%s%s", *ms, **ms ? "," : "", MapToUserString(QAM_128, ModulationValues)); }
+     if (frontendInfo.caps & FE_CAN_QAM_256)   { numModulations++; ms = cString::sprintf("%s%s%s", *ms, **ms ? "," : "", MapToUserString(QAM_256, ModulationValues)); }
+     if (frontendInfo.caps & FE_CAN_8VSB)      { numModulations++; ms = cString::sprintf("%s%s%s", *ms, **ms ? "," : "", MapToUserString(VSB_8, ModulationValues)); }
+     if (frontendInfo.caps & FE_CAN_16VSB)     { numModulations++; ms = cString::sprintf("%s%s%s", *ms, **ms ? "," : "", MapToUserString(VSB_16, ModulationValues)); }
+     if (frontendInfo.caps & FE_CAN_TURBO_FEC) { numModulations++; ms = cString::sprintf("%s%s%s", *ms, **ms ? "," : "", "TURBO_FEC"); }
+     if (!**ms)
+        ms = "unknown modulations";
+     isyslog("frontend %d/%d provides %s with %s (\"%s\")", adapter, frontend, *ds, *ms, frontendInfo.name);
+     return true;
+     }
+  else
+     esyslog("ERROR: frontend %d/%d doesn't provide any delivery systems", adapter, frontend);
+  return false;
+}
+
 bool cDvbDevice::Ready(void)
 {
   if (ciAdapter)
@@ -1126,7 +1211,7 @@
                if (cDevice *Device2 = cDevice::GetDevice(d)) {
                   if (cDvbDevice *DvbDevice1 = dynamic_cast<cDvbDevice *>(Device1)) {
                      if (cDvbDevice *DvbDevice2 = dynamic_cast<cDvbDevice *>(Device2)) {
-                        if (!DvbDevice2->Bond(DvbDevice1))
+                        if (!DvbDevice1->Bond(DvbDevice2))
                            return false; // Bond() has already logged the error
                         }
                      else
@@ -1167,7 +1252,7 @@
   cMutexLock MutexLock(&bondMutex);
   if (!bondedDevice) {
      if (Device != this) {
-        if ((frontendType == SYS_DVBS || frontendType == SYS_DVBS2) && (Device->frontendType == SYS_DVBS || Device->frontendType == SYS_DVBS2)) {
+        if ((ProvidesDeliverySystem(SYS_DVBS) || ProvidesDeliverySystem(SYS_DVBS2)) && (Device->ProvidesDeliverySystem(SYS_DVBS) || Device->ProvidesDeliverySystem(SYS_DVBS2))) {
            if (dvbTuner && Device->dvbTuner && dvbTuner->Bond(Device->dvbTuner)) {
               bondedDevice = Device->bondedDevice ? Device->bondedDevice : Device;
               Device->bondedDevice = this;
@@ -1285,14 +1370,23 @@
   close(Handle);
 }
 
+bool cDvbDevice::ProvidesDeliverySystem(int DeliverySystem) const
+{
+  for (int i = 0; i < numDeliverySystems; i++) {
+      if (deliverySystems[i] == DeliverySystem)
+         return true;
+      }
+  return false;
+}
+
 bool cDvbDevice::ProvidesSource(int Source) const
 {
   int type = Source & cSource::st_Mask;
   return type == cSource::stNone
-      || type == cSource::stAtsc  && (frontendType == SYS_ATSC)
-      || type == cSource::stCable && (frontendType == SYS_DVBC_ANNEX_AC || frontendType == SYS_DVBC_ANNEX_B)
-      || type == cSource::stSat   && (frontendType == SYS_DVBS || frontendType == SYS_DVBS2)
-      || type == cSource::stTerr  && (frontendType == SYS_DVBT);
+      || type == cSource::stAtsc  && ProvidesDeliverySystem(SYS_ATSC)
+      || type == cSource::stCable && (ProvidesDeliverySystem(SYS_DVBC_ANNEX_AC) || ProvidesDeliverySystem(SYS_DVBC_ANNEX_B))
+      || type == cSource::stSat   && (ProvidesDeliverySystem(SYS_DVBS) || ProvidesDeliverySystem(SYS_DVBS2))
+      || type == cSource::stTerr  && (ProvidesDeliverySystem(SYS_DVBT) || ProvidesDeliverySystem(SYS_DVBT2));
 }
 
 bool cDvbDevice::ProvidesTransponder(const cChannel *Channel) const
@@ -1300,7 +1394,7 @@
   if (!ProvidesSource(Channel->Source()))
      return false; // doesn't provide source
   cDvbTransponderParameters dtp(Channel->Parameters());
-  if (dtp.System() == SYS_DVBS2 && frontendType == SYS_DVBS ||
+  if (!ProvidesDeliverySystem(GetRequiredDeliverySystem(Channel, &dtp)) ||
      dtp.Modulation() == QPSK     && !(frontendInfo.caps & FE_CAN_QPSK) ||
      dtp.Modulation() == QAM_16   && !(frontendInfo.caps & FE_CAN_QAM_16) ||
      dtp.Modulation() == QAM_32   && !(frontendInfo.caps & FE_CAN_QAM_32) ||
@@ -1375,7 +1469,7 @@
 
 int cDvbDevice::NumProvidedSystems(void) const
 {
-  return numProvidedSystems;
+  return numDeliverySystems + numModulations;
 }
 
 int cDvbDevice::SignalStrength(void) const
diff -ruN vdr-1.7.22/dvbdevice.h vdr-1.7.23/dvbdevice.h
--- vdr-1.7.22/dvbdevice.h	2011-12-04 14:38:17.000000000 +0100
+++ vdr-1.7.23/dvbdevice.h	2012-01-13 12:32:45.000000000 +0100
@@ -4,22 +4,22 @@
  * See the main source file 'vdr.c' for copyright information and
  * how to reach the author.
  *
- * $Id: dvbdevice.h 2.18 2011/12/04 13:38:17 kls Exp $
+ * $Id: dvbdevice.h 2.21 2012/01/13 11:32:45 kls Exp $
  */
 
 #ifndef __DVBDEVICE_H
 #define __DVBDEVICE_H
 
-#include <sys/mman.h> // FIXME: workaround for broken linux-dvb header files
 #include <linux/dvb/frontend.h>
 #include <linux/dvb/version.h>
 #include "device.h"
 
-#if DVB_API_VERSION < 5
-#error VDR requires Linux DVB driver API version 5.0 or higher!
+#if DVB_API_VERSION < 5 || (DVB_API_VERSION == 5 && DVB_API_VERSION_MINOR < 3)
+#error VDR requires Linux DVB driver API version 5.3 or higher!
 #endif
 
 #define MAXDVBDEVICES  8
+#define MAXDELIVERYSYSTEMS 8
 
 #define DEV_VIDEO         "/dev/video"
 #define DEV_DVB_ADAPTER   "/dev/dvb/adapter"
@@ -47,7 +47,8 @@
 extern const tDvbParameterMap BandwidthValues[];
 extern const tDvbParameterMap CoderateValues[];
 extern const tDvbParameterMap ModulationValues[];
-extern const tDvbParameterMap SystemValues[];
+extern const tDvbParameterMap SystemValuesSat[];
+extern const tDvbParameterMap SystemValuesTerr[];
 extern const tDvbParameterMap TransmissionValues[];
 extern const tDvbParameterMap GuardValues[];
 extern const tDvbParameterMap HierarchyValues[];
@@ -67,8 +68,9 @@
   int guard;
   int hierarchy;
   int rollOff;
+  int plpId;
   int PrintParameter(char *p, char Name, int Value) const;
-  const char *ParseParameter(const char *s, int &Value, const tDvbParameterMap *Map);
+  const char *ParseParameter(const char *s, int &Value, const tDvbParameterMap *Map = NULL);
 public:
   cDvbTransponderParameters(const char *Parameters = NULL);
   char Polarization(void) const { return polarization; }
@@ -82,6 +84,7 @@
   int Guard(void) const { return guard; }
   int Hierarchy(void) const { return hierarchy; }
   int RollOff(void) const { return rollOff; }
+  int PlpId(void) const { return plpId; }
   void SetPolarization(char Polarization) { polarization = Polarization; }
   void SetInversion(int Inversion) { inversion = Inversion; }
   void SetBandwidth(int Bandwidth) { bandwidth = Bandwidth; }
@@ -93,6 +96,7 @@
   void SetGuard(int Guard) { guard = Guard; }
   void SetHierarchy(int Hierarchy) { hierarchy = Hierarchy; }
   void SetRollOff(int RollOff) { rollOff = RollOff; }
+  void SetPlpId(int PlpId) { plpId = PlpId; }
   cString ToString(char Type) const;
   bool Parse(const char *s);
   };
@@ -119,15 +123,19 @@
   int adapter, frontend;
 private:
   dvb_frontend_info frontendInfo;
-  int numProvidedSystems;
-  fe_delivery_system frontendType;
+  int deliverySystems[MAXDELIVERYSYSTEMS];
+  int numDeliverySystems;
+  int numModulations;
   int fd_dvr, fd_ca;
   static cMutex bondMutex;
   cDvbDevice *bondedDevice;
   mutable bool needsDetachBondedReceivers;
+  bool QueryDeliverySystems(int fd_frontend);
 public:
   cDvbDevice(int Adapter, int Frontend);
   virtual ~cDvbDevice();
+  int Adapter(void) const { return adapter; }
+  int Frontend(void) const { return frontend; }
   virtual bool Ready(void);
   static bool BondDevices(const char *Bondings);
        ///< Bonds the devices as defined in the given Bondings string.
@@ -167,6 +175,7 @@
 private:
   cDvbTuner *dvbTuner;
 public:
+  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;
diff -ruN vdr-1.7.22/dvbspu.c vdr-1.7.23/dvbspu.c
--- vdr-1.7.22/dvbspu.c	2010-01-17 14:43:27.000000000 +0100
+++ vdr-1.7.23/dvbspu.c	2011-12-10 15:39:19.000000000 +0100
@@ -8,7 +8,7 @@
  *
  * parts of this file are derived from the OMS program.
  *
- * $Id: dvbspu.c 2.8 2010/01/17 13:43:27 kls Exp $
+ * $Id: dvbspu.c 2.9 2011/12/10 14:39:19 kls Exp $
  */
 
 #include "dvbspu.h"
@@ -496,7 +496,7 @@
     if (!spu)
         return 0;
 
-    if (spu && !clean)
+    if (!clean)
         Draw();
 
     while (DCSQ_offset != prev_DCSQ_offset) {   /* Display Control Sequences */
diff -ruN vdr-1.7.22/dvbsubtitle.c vdr-1.7.23/dvbsubtitle.c
--- vdr-1.7.22/dvbsubtitle.c	2011-09-18 13:23:15.000000000 +0200
+++ vdr-1.7.23/dvbsubtitle.c	2012-01-11 11:34:07.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.20 2011/09/18 11:23:15 kls Exp $
+ * $Id: dvbsubtitle.c 2.21 2012/01/11 10:34:07 kls Exp $
  */
 
 
@@ -995,7 +995,7 @@
   double VideoAspect;
   cDevice::PrimaryDevice()->GetOsdSize(OsdWidth, OsdHeight, OsdAspect);
   cDevice::PrimaryDevice()->GetVideoSize(VideoWidth, VideoHeight, VideoAspect);
-  if (OsdWidth == displayWidth && OsdHeight == displayHeight || VideoWidth == 0) {
+  if (OsdWidth == displayWidth && OsdHeight == displayHeight || DoubleEqual(VideoAspect, 1.0)) {
      osdFactorX = osdFactorY = 1.0;
      osdDeltaX = osdDeltaY = 0;
      }
diff -ruN vdr-1.7.22/epg.c vdr-1.7.23/epg.c
--- vdr-1.7.22/epg.c	2011-02-25 16:16:05.000000000 +0100
+++ vdr-1.7.23/epg.c	2012-01-12 15:31:46.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.c 2.7 2011/02/25 15:16:05 kls Exp $
+ * $Id: epg.c 2.9 2012/01/12 14:31:46 kls Exp $
  */
 
 #include "epg.h"
@@ -828,10 +828,17 @@
 
 Final:
 
-  // VDR can't usefully handle newline characters in the title and shortText of EPG
+  // VDR can't usefully handle newline characters in the title, shortText or component description of EPG
   // data, so let's always convert them to blanks (independent of the setting of EPGBugfixLevel):
   strreplace(title, '\n', ' ');
   strreplace(shortText, '\n', ' ');
+  if (components) {
+     for (int i = 0; i < components->NumComponents(); i++) {
+         tComponent *p = components->Component(i);
+         if (p->description)
+            strreplace(p->description, '\n', ' ');
+         }
+     }
   /* TODO adapt to UTF-8
   // Same for control characters:
   strreplace(title, '\x86', ' ');
@@ -1022,10 +1029,15 @@
 
 void cSchedule::Cleanup(time_t Time)
 {
-  cEvent *Event;
-  while ((Event = events.First()) != NULL) {
-        if (!Event->HasTimer() && Event->EndTime() + Setup.EPGLinger * 60 + 3600 < Time) // adding one hour for safety
-           DelEvent(Event);
+  cEvent *Event = events.First();
+  while (Event) {
+        if (Event->HasTimer())
+           Event = (cEvent *)Event->Next();
+        else if (Event->EndTime() + Setup.EPGLinger * 60 + 3600 < Time) { // adding one hour for safety
+           cEvent *e = Event;
+           Event = (cEvent *)Event->Next();
+           DelEvent(e);
+           }
         else
            break;
         }
diff -ruN vdr-1.7.22/font.c vdr-1.7.23/font.c
--- vdr-1.7.22/font.c	2011-03-28 18:29:51.000000000 +0200
+++ vdr-1.7.23/font.c	2012-01-13 10:43:22.000000000 +0100
@@ -6,7 +6,7 @@
  *
  * BiDi support by Osama Alrawab <alrawab@hotmail.com> @2008 Tripoli-Libya.
  *
- * $Id: font.c 2.8 2011/03/28 16:29:51 kls Exp $
+ * $Id: font.c 2.9 2012/01/13 09:43:22 kls Exp $
  */
 
 #include "font.h"
@@ -508,25 +508,27 @@
 #ifdef BIDI
 cString cFont::Bidi(const char *Ltr)
 {
-  fribidi_set_mirroring(true);
-  fribidi_set_reorder_nsm(false);
-  FriBidiCharSet fribidiCharset = FRIBIDI_CHAR_SET_UTF8;
-  int LtrLen = strlen(Ltr);
-  FriBidiCharType Base = FRIBIDI_TYPE_L;
-  FriBidiChar *Logical = MALLOC(FriBidiChar, LtrLen + 1) ;
-  int RtlLen = fribidi_charset_to_unicode(fribidiCharset, const_cast<char *>(Ltr), LtrLen, Logical);
-  FriBidiChar *Visual = MALLOC(FriBidiChar, LtrLen + 1) ;
-  char *Rtl = NULL;
-  bool ok = fribidi_log2vis(Logical, RtlLen, &Base, Visual, NULL, NULL, NULL);
-  if (ok) {
-     fribidi_remove_bidi_marks(Visual, RtlLen, NULL, NULL, NULL);
-     Rtl = MALLOC(char, RtlLen * 4 + 1);
-     fribidi_unicode_to_charset(fribidiCharset, Visual, RtlLen, Rtl);
+  if (cCharSetConv::SystemCharacterTable()) { // bidi requires UTF-8
+     fribidi_set_mirroring(true);
+     fribidi_set_reorder_nsm(false);
+     FriBidiCharSet fribidiCharset = FRIBIDI_CHAR_SET_UTF8;
+     int LtrLen = strlen(Ltr);
+     FriBidiCharType Base = FRIBIDI_TYPE_L;
+     FriBidiChar *Logical = MALLOC(FriBidiChar, LtrLen + 1) ;
+     int RtlLen = fribidi_charset_to_unicode(fribidiCharset, const_cast<char *>(Ltr), LtrLen, Logical);
+     FriBidiChar *Visual = MALLOC(FriBidiChar, LtrLen + 1) ;
+     char *Rtl = NULL;
+     bool ok = fribidi_log2vis(Logical, RtlLen, &Base, Visual, NULL, NULL, NULL);
+     if (ok) {
+        fribidi_remove_bidi_marks(Visual, RtlLen, NULL, NULL, NULL);
+        Rtl = MALLOC(char, RtlLen * 4 + 1);
+        fribidi_unicode_to_charset(fribidiCharset, Visual, RtlLen, Rtl);
+        }
+     free(Logical);
+     free(Visual);
+     if (ok)
+        return cString(Rtl, true);
      }
-  free(Logical);
-  free(Visual);
-  if (ok)
-     return cString(Rtl, true);
   return cString(Ltr);
 }
 #endif
diff -ruN vdr-1.7.22/libsi/descriptor.c vdr-1.7.23/libsi/descriptor.c
--- vdr-1.7.22/libsi/descriptor.c	2011-06-15 23:26:00.000000000 +0200
+++ vdr-1.7.23/libsi/descriptor.c	2012-01-11 12:35:17.000000000 +0100
@@ -6,7 +6,7 @@
  *   the Free Software Foundation; either version 2 of the License, or     *
  *   (at your option) any later version.                                   *
  *                                                                         *
- *   $Id: descriptor.c 2.2 2011/06/15 21:26:00 kls Exp $
+ *   $Id: descriptor.c 2.4 2012/01/11 11:35:17 kls Exp $
  *                                                                         *
  ***************************************************************************/
 
@@ -876,6 +876,52 @@
    return s->descriptor_tag_extension;
 }
 
+void T2DeliverySystemDescriptor::Parse() {
+   int offset=0;
+   data.setPointerAndOffset<const descr_t2_delivery_system>(s, offset);
+   extended_data_flag = s->descriptor_length > 0x04;
+}
+
+int T2DeliverySystemDescriptor::getExtendedDataFlag() const {
+  return extended_data_flag;
+}
+
+int T2DeliverySystemDescriptor::getExtensionDescriptorTag() const {
+   return s->descriptor_tag_extension;
+}
+
+int T2DeliverySystemDescriptor::getPlpId() const {
+   return s->plp_id;
+}
+
+int T2DeliverySystemDescriptor::getT2SystemId() const {
+   return HILO(s->t2_system_id);
+}
+
+int T2DeliverySystemDescriptor::getSisoMiso() const {
+   return extended_data_flag ? s->siso_miso : -1;
+}
+
+int T2DeliverySystemDescriptor::getBandwidth() const {
+   return extended_data_flag ? s->bandwidth : -1;
+}
+
+int T2DeliverySystemDescriptor::getGuardInterval() const {
+   return extended_data_flag ? s->guard_interval : -1;
+}
+
+int T2DeliverySystemDescriptor::getTransmissionMode() const {
+   return extended_data_flag ? s->transmission_mode : -1;
+}
+
+int T2DeliverySystemDescriptor::getOtherFrequencyFlag() const {
+   return extended_data_flag ? s->other_frequency_flag : -1;
+}
+
+int T2DeliverySystemDescriptor::getTfsFlag() const {
+   return extended_data_flag ? s->tfs_flag : -1;
+}
+
 int PremiereContentTransmissionDescriptor::getOriginalNetworkId() const {
    return HILO(s->original_network_id);
 }
@@ -1005,8 +1051,14 @@
    return componentTag;
 }
 
+char *MHP_TransportProtocolDescriptor::getUrlBase(char *buffer, int size) {
+   return UrlBase.getText(buffer, size);
+}
+
 void MHP_TransportProtocolDescriptor::Parse() {
    int offset=0;
+   remote=false;
+   componentTag=-1;
    data.setPointerAndOffset<const descr_transport_protocol>(s, offset);
    if (getProtocolId() == ObjectCarousel) {
       const transport_via_oc *oc;
@@ -1021,12 +1073,24 @@
          data.setPointerAndOffset<const transport_via_oc_end>(rem, offset);
          componentTag=rem->component_tag;
       }
-   } else { //unimplemented
-      remote=false;
-      componentTag=-1;
+   } else if (getProtocolId() == HTTPoverInteractionChannel) {
+      const transport_via_http *http;
+      data.setPointerAndOffset<const transport_via_http>(http, offset);
+      UrlBase.setDataAndOffset(data+offset, http->url_base_length, offset);
+
+      // fill URL Extension,
+      UrlExtensionLoop.setData(data+offset, getLength()-offset);
+   } else {
+      //unimplemented
    }
 }
 
+void MHP_TransportProtocolDescriptor::UrlExtensionEntry::Parse() {
+   const descr_url_extension_entry *s;
+   s=data.getData<const descr_url_extension_entry>();
+   UrlExtension.setData(data, s->url_extension_length);
+}
+
 void MHP_DVBJApplicationDescriptor::Parse() {
    applicationLoop.setData(data+sizeof(descr_dvbj_application), getLength()-sizeof(descr_dvbj_application));
 }
@@ -1059,6 +1123,17 @@
    data.setPointerAndOffset<const descr_application_icons_descriptor_end>(s, offset);
 }
 
+char *MHP_SimpleApplicationLocationDescriptor::getLocation(char *buffer, int size) {
+   return location.getText(buffer, size);
+}
+
+void MHP_SimpleApplicationLocationDescriptor::Parse() {
+   int offset=0;
+   const descr_simple_application_location_descriptor *loc;
+   data.setPointerAndOffset<const descr_simple_application_location_descriptor>(loc, offset);
+   location.setDataAndOffset(data+offset, loc->descriptor_length, offset);
+}
+
 int RegistrationDescriptor::getFormatIdentifier() const {
    return HILOHILO(s->format_identifier);
 }
diff -ruN vdr-1.7.22/libsi/descriptor.h vdr-1.7.23/libsi/descriptor.h
--- vdr-1.7.22/libsi/descriptor.h	2011-06-15 23:26:00.000000000 +0200
+++ vdr-1.7.23/libsi/descriptor.h	2012-01-11 12:35:17.000000000 +0100
@@ -6,7 +6,7 @@
  *   the Free Software Foundation; either version 2 of the License, or     *
  *   (at your option) any later version.                                   *
  *                                                                         *
- *   $Id: descriptor.h 2.2 2011/06/15 21:26:00 kls Exp $
+ *   $Id: descriptor.h 2.4 2012/01/11 11:35:17 kls Exp $
  *                                                                         *
  ***************************************************************************/
 
@@ -538,6 +538,25 @@
    const descr_extension *s;
 };
 
+class T2DeliverySystemDescriptor : public Descriptor {
+public:
+   int getExtendedDataFlag() const;
+   int getExtensionDescriptorTag() const;
+   int getPlpId() const;
+   int getT2SystemId() const;
+   int getSisoMiso() const;
+   int getBandwidth() const;
+   int getGuardInterval() const;
+   int getTransmissionMode() const;
+   int getOtherFrequencyFlag() const;
+   int getTfsFlag() const;
+protected:
+   virtual void Parse();
+private:
+   const descr_t2_delivery_system *s;
+   int extended_data_flag;
+};
+
 // Private DVB Descriptor  Premiere.de
 // 0xF2  Content Transmission Descriptor
 // http://dvbsnoop.sourceforge.net/examples/example-private-section.html
@@ -639,17 +658,29 @@
 
 class MHP_TransportProtocolDescriptor : public Descriptor {
 public:
+   class UrlExtensionEntry : public LoopElement {
+   public:
+      virtual int getLength() { return sizeof(descr_url_extension_entry)+UrlExtension.getLength(); }
+      String UrlExtension;
+   protected:
+      virtual void Parse();
+   };
+
    enum Protocol { ObjectCarousel = 0x01, IPviaDVB = 0x02, HTTPoverInteractionChannel = 0x03 };
    int getProtocolId() const;
    int getProtocolLabel() const;
    bool isRemote() const;
    int getComponentTag() const;
+   char *getUrlBase(char *buffer, int size);
+   StructureLoop<UrlExtensionEntry> UrlExtensionLoop;
+
 protected:
    virtual void Parse();
 private:
    const descr_transport_protocol *s;
    bool remote;
    int componentTag;
+   String UrlBase;
 };
 
 class MHP_DVBJApplicationDescriptor : public Descriptor {
@@ -685,6 +716,15 @@
    const descr_application_icons_descriptor_end *s;
 };
 
+class MHP_SimpleApplicationLocationDescriptor : public Descriptor {
+public:
+   char *getLocation(char *buffer, int size);
+protected:
+   virtual void Parse();
+private:
+   String location;
+};
+
 class RegistrationDescriptor : public Descriptor {
 public:
    int getFormatIdentifier() const;
diff -ruN vdr-1.7.22/libsi/headers.h vdr-1.7.23/libsi/headers.h
--- vdr-1.7.22/libsi/headers.h	2011-06-15 23:26:00.000000000 +0200
+++ vdr-1.7.23/libsi/headers.h	2012-01-11 12:35:17.000000000 +0100
@@ -10,7 +10,7 @@
  *   the Free Software Foundation; either version 2 of the License, or     *
  *   (at your option) any later version.                                   *
  *                                                                         *
- *   $Id: headers.h 2.2 2011/06/15 21:26:00 kls Exp $
+ *   $Id: headers.h 2.4 2012/01/11 11:35:17 kls Exp $
  *                                                                         *
  ***************************************************************************/
 
@@ -1839,6 +1839,37 @@
    u_char descriptor_tag_extension               :8;
 };
 
+/* extension 0x04 t2_delivery_system_descriptor */
+
+struct descr_t2_delivery_system {
+   u_char descriptor_tag                         :8;
+   u_char descriptor_length                      :8;
+   u_char descriptor_tag_extension               :8;
+   u_char plp_id                                 :8;
+   u_char t2_system_id_hi                        :8;
+   u_char t2_system_id_lo                        :8;
+#if BYTE_ORDER == BIG_ENDIAN
+   u_char siso_miso                              :2;
+   u_char bandwidth                              :4;
+   u_char reserved                               :2;
+   u_char guard_interval                         :3;
+   u_char transmission_mode                      :3;
+   u_char other_frequency_flag                   :1;
+   u_char tfs_flag                               :1;
+#else
+   u_char reserved                               :2;
+   u_char bandwidth                              :4;
+   u_char siso_miso                              :2;
+   u_char tfs_flag                               :1;
+   u_char other_frequency_flag                   :1;
+   u_char transmission_mode                      :3;
+   u_char guard_interval                         :3;
+#endif
+/* now follow cell_id, frequency_loop_length, centre_frequency,
+   subcell_info_loop_length, cell_id_extension, transposer_frequency
+   fields looping to the end */
+};
+
 /* MHP 0x00 application_descriptor */
 
 #define DESCR_APPLICATION_LEN 3
@@ -1907,6 +1938,11 @@
    /* protocol_id-specific selector bytes follow */
 };
 
+struct descr_url_extension_entry {
+   u_char url_extension_length                   :8;
+   /* URL extension string */
+};
+
 #define TRANSPORT_VIA_OC_LEN 1
 
 struct transport_via_oc {
@@ -1940,6 +1976,12 @@
    u_char component_tag                          :8;
 };
 
+#define TRANSPORT_VIA_HTTP_LEN 1
+
+struct transport_via_http {
+   u_char url_base_length                        :8;
+};
+
 /* 0x03 dvb_j_application_descriptor() */
 
 #define DESCR_DVBJ_APPLICATION_LEN 2
@@ -1991,6 +2033,16 @@
    u_char icon_flags_lo                          :8;
 };
 
+/* 0x15 simple application location descrptor */
+
+#define DESCR_SIMPLE_APPLICATION_LOCATION_LEN 3
+
+struct descr_simple_application_location_descriptor {
+   u_char descriptor_tag                         :8;
+   u_char descriptor_length                      :8;
+   /* inital_path_bytes */
+};
+
 // Private DVB Descriptor  Premiere.de
 // 0xF2  Content Transmission Descriptor
 // http://dvbsnoop.sourceforge.net/examples/example-private-section.html
diff -ruN vdr-1.7.22/libsi/si.c vdr-1.7.23/libsi/si.c
--- vdr-1.7.22/libsi/si.c	2011-12-04 16:06:18.000000000 +0100
+++ vdr-1.7.23/libsi/si.c	2011-12-10 16:47:15.000000000 +0100
@@ -6,7 +6,7 @@
  *   the Free Software Foundation; either version 2 of the License, or     *
  *   (at your option) any later version.                                   *
  *                                                                         *
- *   $Id: si.c 2.5 2011/12/04 15:06:18 kls Exp $
+ *   $Id: si.c 2.6 2011/12/10 15:47:15 kls Exp $
  *                                                                         *
  ***************************************************************************/
 
@@ -690,6 +690,9 @@
          case MHP_DVBJApplicationLocationDescriptorTag:
             d=new MHP_DVBJApplicationLocationDescriptor();
             break;
+         case MHP_SimpleApplicationLocationDescriptorTag:
+            d=new MHP_SimpleApplicationLocationDescriptor();
+            break;
       // 0x05 - 0x0A is unimplemented this library
          case MHP_ExternalApplicationAuthorisationDescriptorTag:
          case MHP_IPv4RoutingDescriptorTag:
diff -ruN vdr-1.7.22/libsi/si.h vdr-1.7.23/libsi/si.h
--- vdr-1.7.22/libsi/si.h	2010-02-13 11:31:34.000000000 +0100
+++ vdr-1.7.23/libsi/si.h	2012-01-11 12:35:17.000000000 +0100
@@ -6,7 +6,7 @@
  *   the Free Software Foundation; either version 2 of the License, or     *
  *   (at your option) any later version.                                   *
  *                                                                         *
- *   $Id: si.h 2.3 2010/02/13 10:31:34 kls Exp $
+ *   $Id: si.h 2.5 2012/01/11 11:35:17 kls Exp $
  *                                                                         *
  ***************************************************************************/
 
@@ -134,6 +134,19 @@
                DTSDescriptorTag = 0x7B,
                AACDescriptorTag = 0x7C,
                ExtensionDescriptorTag = 0x7F,
+ // Extension descriptors
+               ImageIconDescriptorTag = 0x00,
+               CpcmDeliverySignallingDescriptor = 0x01,
+               CPDescriptorTag = 0x02,
+               CPIdentifierDescriptorTag = 0x03,
+               T2DeliverySystemDescriptorTag = 0x04,
+               SHDeliverySystemDescriptorTag = 0x05,
+               SupplementaryAudioDescriptorTag = 0x06,
+               NetworkChangeNotifyDescriptorTag = 0x07,
+               MessageDescriptorTag = 0x08,
+               TargetRegionDescriptorTag = 0x09,
+               TargetRegionNameDescriptorTag = 0x0A,
+               ServiceRelocatedDescriptorTag = 0x0B,
 
  // Defined by ETSI TS 102 812 (MHP)
                // They once again start with 0x00 (see page 234, MHP specification)
@@ -153,6 +166,8 @@
                MHP_PrefetchDescriptorTag = 0x0C,
                MHP_DelegatedApplicationDescriptorTag = 0x0E,
                MHP_ApplicationStorageDescriptorTag = 0x10,
+               MHP_SimpleApplicationLocationDescriptorTag = 0x15,
+               MHP_SimpleApplicationBoundaryDescriptorTag = 0x17,
   // Premiere private Descriptor Tags
                PremiereContentTransmissionDescriptorTag = 0xF2,
 
diff -ruN vdr-1.7.22/menu.c vdr-1.7.23/menu.c
--- vdr-1.7.22/menu.c	2011-12-04 15:52:38.000000000 +0100
+++ vdr-1.7.23/menu.c	2012-01-14 14:06:03.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.34 2011/12/04 14:52:38 kls Exp $
+ * $Id: menu.c 2.35 2012/01/14 13:06:03 kls Exp $
  */
 
 #include "menu.h"
@@ -3114,6 +3114,7 @@
   SetSection(tr("Replay"));
   Add(new cMenuEditBoolItem(tr("Setup.Replay$Multi speed mode"), &data.MultiSpeedMode));
   Add(new cMenuEditBoolItem(tr("Setup.Replay$Show replay mode"), &data.ShowReplayMode));
+  Add(new cMenuEditBoolItem(tr("Setup.Replay$Show remaining time"), &data.ShowRemainingTime));
   Add(new cMenuEditIntItem(tr("Setup.Replay$Resume ID"), &data.ResumeID, 0, 99));
 }
 
@@ -4568,12 +4569,15 @@
            displayReplay->SetTitle(title);
         lastCurrent = lastTotal = -1;
         }
-     if (Total != lastTotal) {
-        displayReplay->SetTotal(IndexToHMSF(Total, false, FramesPerSecond()));
-        if (!Initial)
-           displayReplay->Flush();
-        }
      if (Current != lastCurrent || Total != lastTotal) {
+        if (Setup.ShowRemainingTime || Total != lastTotal) {
+           int Index = Total;
+           if (Setup.ShowRemainingTime)
+              Index = Current - Index;
+           displayReplay->SetTotal(IndexToHMSF(Index, false, FramesPerSecond()));
+           if (!Initial)
+              displayReplay->Flush();
+           }
         displayReplay->SetProgress(Current, Total);
         if (!Initial)
            displayReplay->Flush();
diff -ruN vdr-1.7.22/nit.c vdr-1.7.23/nit.c
--- vdr-1.7.22/nit.c	2011-08-12 16:27:31.000000000 +0200
+++ vdr-1.7.23/nit.c	2012-01-12 09:43:52.000000000 +0100
@@ -4,7 +4,7 @@
  * See the main source file 'vdr.c' for copyright information and
  * how to reach the author.
  *
- * $Id: nit.c 2.6 2011/08/12 14:27:31 kls Exp $
+ * $Id: nit.c 2.9 2012/01/12 08:43:52 kls Exp $
  */
 
 #include "nit.h"
@@ -16,6 +16,9 @@
 #include "libsi/descriptor.h"
 #include "tools.h"
 
+#define DVB_SYSTEM_1 0 // see also dvbdevice.c
+#define DVB_SYSTEM_2 1
+
 cNitFilter::cNitFilter(void)
 {
   numNits = 0;
@@ -134,7 +137,7 @@
                  dtp.SetCoderateH(CodeRates[sd->getFecInner()]);
                  static int Modulations[] = { QAM_AUTO, QPSK, PSK_8, QAM_16 };
                  dtp.SetModulation(Modulations[sd->getModulationType()]);
-                 dtp.SetSystem(sd->getModulationSystem() ? SYS_DVBS2 : SYS_DVBS);
+                 dtp.SetSystem(sd->getModulationSystem() ? DVB_SYSTEM_2 : DVB_SYSTEM_1);
                  static int RollOffs[] = { ROLLOFF_35, ROLLOFF_25, ROLLOFF_20, ROLLOFF_AUTO };
                  dtp.SetRollOff(sd->getModulationSystem() ? RollOffs[sd->getRollOff()] : ROLLOFF_AUTO);
                  int SymbolRate = BCD2INT(sd->getSymbolRate()) / 10;
@@ -242,10 +245,11 @@
                  cDvbTransponderParameters dtp;
                  int Source = cSource::FromData(cSource::stTerr);
                  int Frequency = Frequencies[0] = sd->getFrequency() * 10;
-                 static int Bandwidths[] = { 8000000, 7000000, 6000000, 0, 0, 0, 0, 0 };
+                 static int Bandwidths[] = { 8000000, 7000000, 6000000, 5000000, 0, 0, 0, 0 };
                  dtp.SetBandwidth(Bandwidths[sd->getBandwidth()]);
                  static int Constellations[] = { QPSK, QAM_16, QAM_64, QAM_AUTO };
                  dtp.SetModulation(Constellations[sd->getConstellation()]);
+                 dtp.SetSystem(DVB_SYSTEM_1);
                  static int Hierarchies[] = { HIERARCHY_NONE, HIERARCHY_1, HIERARCHY_2, HIERARCHY_4, HIERARCHY_AUTO, HIERARCHY_AUTO, HIERARCHY_AUTO, HIERARCHY_AUTO };
                  dtp.SetHierarchy(Hierarchies[sd->getHierarchy()]);
                  static int CodeRates[] = { FEC_1_2, FEC_2_3, FEC_3_4, FEC_5_6, FEC_7_8, FEC_AUTO, FEC_AUTO, FEC_AUTO };
@@ -253,7 +257,7 @@
                  dtp.SetCoderateL(CodeRates[sd->getCodeRateLP()]);
                  static int GuardIntervals[] = { GUARD_INTERVAL_1_32, GUARD_INTERVAL_1_16, GUARD_INTERVAL_1_8, GUARD_INTERVAL_1_4 };
                  dtp.SetGuard(GuardIntervals[sd->getGuardInterval()]);
-                 static int TransmissionModes[] = { TRANSMISSION_MODE_2K, TRANSMISSION_MODE_8K, TRANSMISSION_MODE_AUTO, TRANSMISSION_MODE_AUTO };
+                 static int TransmissionModes[] = { TRANSMISSION_MODE_2K, TRANSMISSION_MODE_8K, TRANSMISSION_MODE_4K, TRANSMISSION_MODE_AUTO };
                  dtp.SetTransmission(TransmissionModes[sd->getTransmissionMode()]);
                  if (ThisNIT >= 0) {
                     for (int n = 0; n < NumFrequencies; n++) {
@@ -299,6 +303,40 @@
                     }
                  }
                  break;
+            case SI::ExtensionDescriptorTag: {
+                 SI::ExtensionDescriptor *sd = (SI::ExtensionDescriptor *)d;
+                 switch (sd->getExtensionDescriptorTag()) {
+                   case SI::T2DeliverySystemDescriptorTag: {
+                        if (Setup.UpdateChannels >= 5) {
+                           for (cChannel *Channel = Channels.First(); Channel; Channel = Channels.Next(Channel)) {
+                               int Source = cSource::FromData(cSource::stTerr);
+                               if (!Channel->GroupSep() && Channel->Source() == Source && Channel->Nid() == ts.getOriginalNetworkId() && Channel->Tid() == ts.getTransportStreamId()) {
+                                  SI::T2DeliverySystemDescriptor *td = (SI::T2DeliverySystemDescriptor *)d;
+                                  int Frequency = Channel->Frequency();
+                                  int SymbolRate = Channel->Srate();
+                                  //int SystemId = td->getSystemId();
+                                  cDvbTransponderParameters dtp(Channel->Parameters());
+                                  dtp.SetSystem(DVB_SYSTEM_2);
+                                  dtp.SetPlpId(td->getPlpId());
+                                  if (td->getExtendedDataFlag()) {
+                                     static int T2Bandwidths[] = { 8000000, 7000000, 6000000, 5000000, 10000000, 1712000, 0, 0 };
+                                     dtp.SetBandwidth(T2Bandwidths[td->getBandwidth()]);
+                                     static int T2GuardIntervals[] = { GUARD_INTERVAL_1_32, GUARD_INTERVAL_1_16, GUARD_INTERVAL_1_8, GUARD_INTERVAL_1_4, GUARD_INTERVAL_1_128, GUARD_INTERVAL_19_128, GUARD_INTERVAL_19_256, 0 };
+                                     dtp.SetGuard(T2GuardIntervals[td->getGuardInterval()]);
+                                     static int T2TransmissionModes[] = { TRANSMISSION_MODE_2K, TRANSMISSION_MODE_8K, TRANSMISSION_MODE_4K, TRANSMISSION_MODE_1K, TRANSMISSION_MODE_16K, TRANSMISSION_MODE_32K, TRANSMISSION_MODE_AUTO, TRANSMISSION_MODE_AUTO };
+                                     dtp.SetTransmission(T2TransmissionModes[td->getTransmissionMode()]);
+                                     //TODO add parsing of frequencies
+                                     }
+                                  Channel->SetTransponderData(Source, Frequency, SymbolRate, dtp.ToString('T'));
+                                  }
+                               }
+                           }
+                        }
+                        break;
+                   default: ;
+                   }
+                 }
+                 break;
             default: ;
             }
           delete d;
diff -ruN vdr-1.7.22/po/ar.po vdr-1.7.23/po/ar.po
--- vdr-1.7.22/po/ar.po	2011-12-03 16:35:34.000000000 +0100
+++ vdr-1.7.23/po/ar.po	2012-01-14 14:09:18.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: 2011-12-03 16:25+0100\n"
+"POT-Creation-Date: 2012-01-14 14:06+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"
@@ -79,6 +79,9 @@
 msgid "Rolloff"
 msgstr "Ø§ÙŠÙ‚Ø§Ù�"
 
+msgid "PlpId"
+msgstr ""
+
 msgid "Starting EPG scan"
 msgstr "EPG Ø§ Ù„Ø¨Ø¯Ø¡ Ø¨Ø§Ù„Ø¨Ø­Ø« Ø¹Ù„Ù‰ Ø¯Ù„ÙŠÙ„ Ø§Ù„Ù‚Ù†ÙˆØ§Øª Ø§Ù„Ø§Ù„ÙƒØªØ±ÙˆÙ†Ù‰ "
 
@@ -1103,6 +1106,9 @@
 msgid "Setup.Replay$Show replay mode"
 msgstr "Ø§Ø¶Ù‡Ø± Ø·ÙˆØ± Ø§Ù„Ø§Ø¹Ø§Ø¯Ø©"
 
+msgid "Setup.Replay$Show remaining time"
+msgstr ""
+
 msgid "Setup.Replay$Resume ID"
 msgstr "Ø±Ù‚Ù… Ø§Ù„Ù…ÙˆØ§ØµÙ„Ø©"
 
diff -ruN vdr-1.7.22/po/ca_ES.po vdr-1.7.23/po/ca_ES.po
--- vdr-1.7.22/po/ca_ES.po	2011-12-03 16:35:33.000000000 +0100
+++ vdr-1.7.23/po/ca_ES.po	2012-01-14 14:09:17.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: 2011-12-03 16:25+0100\n"
+"POT-Creation-Date: 2012-01-14 14:06+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"
@@ -76,6 +76,9 @@
 msgid "Rolloff"
 msgstr ""
 
+msgid "PlpId"
+msgstr ""
+
 msgid "Starting EPG scan"
 msgstr "Iniciant exploració EPG"
 
@@ -1080,6 +1083,9 @@
 msgid "Setup.Replay$Show replay mode"
 msgstr "Mostrar mode de reproducció"
 
+msgid "Setup.Replay$Show remaining time"
+msgstr ""
+
 msgid "Setup.Replay$Resume ID"
 msgstr "ID de Continuar"
 
diff -ruN vdr-1.7.22/po/cs_CZ.po vdr-1.7.23/po/cs_CZ.po
--- vdr-1.7.22/po/cs_CZ.po	2011-12-03 16:35:33.000000000 +0100
+++ vdr-1.7.23/po/cs_CZ.po	2012-01-14 14:09:17.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: 2011-12-03 16:25+0100\n"
+"POT-Creation-Date: 2012-01-14 14:06+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"
@@ -75,6 +75,9 @@
 msgid "Rolloff"
 msgstr ""
 
+msgid "PlpId"
+msgstr ""
+
 msgid "Starting EPG scan"
 msgstr "ZaÄ�Ã­nÃ¡ prohledÃ¡vÃ¡nÃ­ EPG"
 
@@ -1079,6 +1082,9 @@
 msgid "Setup.Replay$Show replay mode"
 msgstr "Zobrazit reÅ¾im pÅ™ehrÃ¡vÃ¡nÃ­"
 
+msgid "Setup.Replay$Show remaining time"
+msgstr ""
+
 msgid "Setup.Replay$Resume ID"
 msgstr "ID obnovenÃ­"
 
diff -ruN vdr-1.7.22/po/da_DK.po vdr-1.7.23/po/da_DK.po
--- vdr-1.7.22/po/da_DK.po	2011-12-03 16:35:33.000000000 +0100
+++ vdr-1.7.23/po/da_DK.po	2012-01-14 14:09:17.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: 2011-12-03 16:25+0100\n"
+"POT-Creation-Date: 2012-01-14 14:06+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"
@@ -73,6 +73,9 @@
 msgid "Rolloff"
 msgstr ""
 
+msgid "PlpId"
+msgstr ""
+
 msgid "Starting EPG scan"
 msgstr "Starter EPG skanning"
 
@@ -1077,6 +1080,9 @@
 msgid "Setup.Replay$Show replay mode"
 msgstr "Vis afspilningsmodus"
 
+msgid "Setup.Replay$Show remaining time"
+msgstr ""
+
 msgid "Setup.Replay$Resume ID"
 msgstr "Genoptagelses ID"
 
diff -ruN vdr-1.7.22/po/de_DE.po vdr-1.7.23/po/de_DE.po
--- vdr-1.7.22/po/de_DE.po	2011-12-03 16:35:34.000000000 +0100
+++ vdr-1.7.23/po/de_DE.po	2012-01-14 14:11:20.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: 2011-12-03 16:25+0100\n"
+"POT-Creation-Date: 2012-01-14 14:06+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"
@@ -73,6 +73,9 @@
 msgid "Rolloff"
 msgstr "Rolloff"
 
+msgid "PlpId"
+msgstr "PlpId"
+
 msgid "Starting EPG scan"
 msgstr "Aktualisiere EPG-Daten"
 
@@ -1077,6 +1080,9 @@
 msgid "Setup.Replay$Show replay mode"
 msgstr "Wiedergabestatus anzeigen"
 
+msgid "Setup.Replay$Show remaining time"
+msgstr "Verbleibende Zeit anzeigen"
+
 msgid "Setup.Replay$Resume ID"
 msgstr "Wiedergabe-ID"
 
diff -ruN vdr-1.7.22/po/el_GR.po vdr-1.7.23/po/el_GR.po
--- vdr-1.7.22/po/el_GR.po	2011-12-03 16:35:34.000000000 +0100
+++ vdr-1.7.23/po/el_GR.po	2012-01-14 14:09:18.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: 2011-12-03 16:25+0100\n"
+"POT-Creation-Date: 2012-01-14 14:06+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"
@@ -73,6 +73,9 @@
 msgid "Rolloff"
 msgstr ""
 
+msgid "PlpId"
+msgstr ""
+
 msgid "Starting EPG scan"
 msgstr "Áñ÷Þ óÜñùóç EPG"
 
@@ -1077,6 +1080,9 @@
 msgid "Setup.Replay$Show replay mode"
 msgstr "¸íäåéîç êáôÜóôáóçò áíáìåôÜäïóçò"
 
+msgid "Setup.Replay$Show remaining time"
+msgstr ""
+
 msgid "Setup.Replay$Resume ID"
 msgstr "ID áíáìåôÜäïóçò"
 
diff -ruN vdr-1.7.22/po/es_ES.po vdr-1.7.23/po/es_ES.po
--- vdr-1.7.22/po/es_ES.po	2011-12-03 16:35:33.000000000 +0100
+++ vdr-1.7.23/po/es_ES.po	2012-01-14 14:09:17.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: 2011-12-03 16:25+0100\n"
+"POT-Creation-Date: 2012-01-14 14:06+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"
@@ -74,6 +74,9 @@
 msgid "Rolloff"
 msgstr ""
 
+msgid "PlpId"
+msgstr ""
+
 msgid "Starting EPG scan"
 msgstr "Iniciando la exploración de EPG"
 
@@ -1078,6 +1081,9 @@
 msgid "Setup.Replay$Show replay mode"
 msgstr "Mostrar modo de reproducción"
 
+msgid "Setup.Replay$Show remaining time"
+msgstr ""
+
 msgid "Setup.Replay$Resume ID"
 msgstr "ID de continuación"
 
diff -ruN vdr-1.7.22/po/et_EE.po vdr-1.7.23/po/et_EE.po
--- vdr-1.7.22/po/et_EE.po	2011-12-03 16:35:33.000000000 +0100
+++ vdr-1.7.23/po/et_EE.po	2012-01-14 14:09:17.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: 2011-12-03 16:25+0100\n"
+"POT-Creation-Date: 2012-01-14 14:06+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"
@@ -73,6 +73,9 @@
 msgid "Rolloff"
 msgstr "Rolloff"
 
+msgid "PlpId"
+msgstr ""
+
 msgid "Starting EPG scan"
 msgstr "EPG skaneerimine käivitatud"
 
@@ -1077,6 +1080,9 @@
 msgid "Setup.Replay$Show replay mode"
 msgstr "Korduse moodus"
 
+msgid "Setup.Replay$Show remaining time"
+msgstr ""
+
 msgid "Setup.Replay$Resume ID"
 msgstr "Jätkamise ID"
 
diff -ruN vdr-1.7.22/po/fi_FI.po vdr-1.7.23/po/fi_FI.po
--- vdr-1.7.22/po/fi_FI.po	2011-12-03 16:35:33.000000000 +0100
+++ vdr-1.7.23/po/fi_FI.po	2012-01-14 14:09:17.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: 2011-12-03 16:25+0100\n"
+"POT-Creation-Date: 2012-01-14 14:06+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"
@@ -76,6 +76,9 @@
 msgid "Rolloff"
 msgstr "Rolloff"
 
+msgid "PlpId"
+msgstr "PLP-tunniste"
+
 msgid "Starting EPG scan"
 msgstr "Ohjelmaoppaan pÃ¤ivitys aloitettu"
 
@@ -967,10 +970,10 @@
 
 #, c-format
 msgid "Setup.LNB$Device %d connected to sat cable"
-msgstr ""
+msgstr "DVB-sovitin %d kytketty SAT-kaapeliin"
 
 msgid "Setup.LNB$own"
-msgstr ""
+msgstr "oma"
 
 msgid "CAM reset"
 msgstr "CAM nollaus"
@@ -1080,6 +1083,9 @@
 msgid "Setup.Replay$Show replay mode"
 msgstr "NÃ¤ytÃ¤ toiston tila"
 
+msgid "Setup.Replay$Show remaining time"
+msgstr ""
+
 msgid "Setup.Replay$Resume ID"
 msgstr "Tallenteen paluutunniste"
 
diff -ruN vdr-1.7.22/po/fr_FR.po vdr-1.7.23/po/fr_FR.po
--- vdr-1.7.22/po/fr_FR.po	2011-12-03 16:35:34.000000000 +0100
+++ vdr-1.7.23/po/fr_FR.po	2012-01-14 14:09:18.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: 2011-12-03 16:25+0100\n"
+"POT-Creation-Date: 2012-01-14 14:06+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"
@@ -79,6 +79,9 @@
 msgid "Rolloff"
 msgstr ""
 
+msgid "PlpId"
+msgstr ""
+
 msgid "Starting EPG scan"
 msgstr "Mise à jour du guide des programmes"
 
@@ -1083,6 +1086,9 @@
 msgid "Setup.Replay$Show replay mode"
 msgstr "Affichage mode de lecture"
 
+msgid "Setup.Replay$Show remaining time"
+msgstr ""
+
 msgid "Setup.Replay$Resume ID"
 msgstr "ID de reprise"
 
diff -ruN vdr-1.7.22/po/hr_HR.po vdr-1.7.23/po/hr_HR.po
--- vdr-1.7.22/po/hr_HR.po	2011-12-03 16:35:34.000000000 +0100
+++ vdr-1.7.23/po/hr_HR.po	2012-01-14 14:09:18.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: 2011-12-03 16:25+0100\n"
+"POT-Creation-Date: 2012-01-14 14:06+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"
@@ -75,6 +75,9 @@
 msgid "Rolloff"
 msgstr ""
 
+msgid "PlpId"
+msgstr ""
+
 msgid "Starting EPG scan"
 msgstr "Poèinjem EPG pretragu"
 
@@ -1079,6 +1082,9 @@
 msgid "Setup.Replay$Show replay mode"
 msgstr "Prika¾i naèin prikazivanja"
 
+msgid "Setup.Replay$Show remaining time"
+msgstr ""
+
 msgid "Setup.Replay$Resume ID"
 msgstr "ID nastavka"
 
diff -ruN vdr-1.7.22/po/hu_HU.po vdr-1.7.23/po/hu_HU.po
--- vdr-1.7.22/po/hu_HU.po	2011-12-03 16:35:33.000000000 +0100
+++ vdr-1.7.23/po/hu_HU.po	2012-01-14 14:09:17.000000000 +0100
@@ -4,14 +4,14 @@
 # Istvan Koenigsberger <istvnko@hotmail.com>, 2002, 2003, 2006
 # Guido Josten <guido.josten@t-online.de>, 2002, 2003, 2006
 # Thomas Günther <tom@toms-cafe.de>, 2007
-# István Füley <ifuley@tigercomp.ro>, 2007
+# István Füley <ifuley@tigercomp.ro>, 2007, 2012
 #
 msgid ""
 msgstr ""
 "Project-Id-Version: VDR 1.6.0\n"
 "Report-Msgid-Bugs-To: <vdr-bugs@tvdr.de>\n"
-"POT-Creation-Date: 2011-12-03 16:25+0100\n"
-"PO-Revision-Date: 2007-12-01 21:42+0200\n"
+"POT-Creation-Date: 2012-01-14 14:06+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"
 "Language: hu\n"
@@ -32,19 +32,19 @@
 msgstr "ki"
 
 msgid "on"
-msgstr ""
+msgstr "be"
 
 msgid "auto"
 msgstr "auto"
 
 msgid "none"
-msgstr "semmi"
+msgstr "egyik sem"
 
 msgid "Polarization"
 msgstr "Polarizáció"
 
 msgid "System"
-msgstr ""
+msgstr "Rendszer"
 
 msgid "Srate"
 msgstr "Srate"
@@ -74,6 +74,9 @@
 msgstr "Hierarhia"
 
 msgid "Rolloff"
+msgstr "Rolloff"
+
+msgid "PlpId"
 msgstr ""
 
 msgid "Starting EPG scan"
@@ -318,10 +321,10 @@
 
 #, c-format
 msgid "ParentalRating$from %d"
-msgstr ""
+msgstr "%d éven felülieknek"
 
 msgid "No title"
-msgstr "név nélkül"
+msgstr "cím nélkül"
 
 #. TRANSLATORS: The name of the language, as written natively
 msgid "LanguageName$English"
@@ -420,7 +423,7 @@
 msgstr "Stop"
 
 msgid "Key$Record"
-msgstr "Felvenni"
+msgstr "Felvétel"
 
 msgid "Key$FastFwd"
 msgstr "Elõre pörgetni"
@@ -471,7 +474,7 @@
 msgstr "Idõzítõ"
 
 msgid "Key$Recordings"
-msgstr "Felvett adások"
+msgstr "Felvételek"
 
 msgid "Key$Setup"
 msgstr "Beállítások"
@@ -591,29 +594,29 @@
 msgstr "Csatorna törlése?"
 
 msgid "Edit folder"
-msgstr ""
+msgstr "Könyvtár szerkesztése"
 
 msgid "New folder"
-msgstr ""
+msgstr "Új könyvtár"
 
 msgid "Sub folder"
-msgstr ""
+msgstr "Alkönyvtár"
 
 msgid "Folder name already exists!"
-msgstr ""
+msgstr "Ez a könyvtárnév már létezik!"
 
 #, c-format
 msgid "Folder name must not contain '%c'!"
-msgstr ""
+msgstr "A könyvtár neve nem tartalmazhatja: '%c'!"
 
 msgid "Button$Select"
-msgstr ""
+msgstr "Kiválasztás"
 
 msgid "Delete folder and all sub folders?"
-msgstr ""
+msgstr "Valóban töröljem a könyvtárat és az alkönyvtárait?"
 
 msgid "Delete folder?"
-msgstr ""
+msgstr "Töröljem a könyvtárat?"
 
 msgid "Edit timer"
 msgstr "Idõzítõ megváltoztatása"
@@ -631,7 +634,7 @@
 msgstr "Kezdet"
 
 msgid "Stop"
-msgstr "Vége"
+msgstr "Vég"
 
 msgid "VPS"
 msgstr "VPS"
@@ -646,13 +649,13 @@
 msgstr "File"
 
 msgid "Button$Folder"
-msgstr ""
+msgstr "Könyvtár"
 
 msgid "First day"
 msgstr "Elsõ nap"
 
 msgid "Select folder"
-msgstr ""
+msgstr "Könyvtár kiválasztása"
 
 msgid "Timers"
 msgstr "Idõzítõ"
@@ -667,22 +670,22 @@
 msgstr "Idõzítõ törlése?"
 
 msgid "Timer still recording - really delete?"
-msgstr "Felvétel folyamatban van - mégis törölni?"
+msgstr "Felvétel folyamatban van - biztos töröljem?"
 
 msgid "Event"
-msgstr "Adás"
+msgstr "Esemény"
 
 msgid "Button$Timer"
 msgstr "Idõzítõ"
 
 msgid "Button$Record"
-msgstr "Felvenni"
+msgstr "Felvétel"
 
 msgid "Button$Switch"
 msgstr "Átkapcsolni"
 
 msgid "What's on now?"
-msgstr "Mi megy most?"
+msgstr "Most adásban"
 
 msgid "What's on next?"
 msgstr "Mi következik?"
@@ -694,24 +697,24 @@
 msgstr "Most"
 
 msgid "Button$Schedule"
-msgstr "Program"
+msgstr "Mûsorújság"
 
 msgid "Can't switch channel!"
 msgstr "Az adót nem lehet elkapcsolni"
 
 #, c-format
 msgid "Schedule - %s"
-msgstr "Program - %s"
+msgstr "Mûsorújság - %s"
 
 #, c-format
 msgid "This event - %s"
 msgstr "Ez az adás - %s"
 
 msgid "This event - all channels"
-msgstr "Ez az adás - összes adó"
+msgstr "Ez az adás - összes adón"
 
 msgid "All events - all channels"
-msgstr "Az összes adás - az összes adó"
+msgstr "Az összes adás - az összes adón"
 
 #, c-format
 msgid "Please enter %d digits!"
@@ -721,7 +724,7 @@
 msgstr "A CAM nem válaszol!"
 
 msgid "Recording info"
-msgstr "Felvétel"
+msgstr "Felvétel infó"
 
 msgid "Button$Play"
 msgstr "Lejátszani"
@@ -730,7 +733,7 @@
 msgstr "Vissza az elejére"
 
 msgid "Recordings"
-msgstr "Felvett adások"
+msgstr "Felvételek"
 
 msgid "Button$Open"
 msgstr "Kinyitni"
@@ -829,7 +832,7 @@
 msgstr "A lekérdezett adásinformáció bezárása"
 
 msgid "Setup.OSD$Scroll pages"
-msgstr "Oldalanként léptetmi"
+msgstr "Oldalanként léptetni"
 
 msgid "Setup.OSD$Scroll wraps"
 msgstr "Korlátlan léptetés"
@@ -841,28 +844,28 @@
 msgstr "Felvételek listája"
 
 msgid "Setup.OSD$Folders in timer menu"
-msgstr ""
+msgstr "Könyvtárválasztás az idõzítõ menüben"
 
 msgid "Setup.OSD$Number keys for characters"
-msgstr ""
+msgstr "Számgombok a betûkön"
 
 msgid "EPG"
 msgstr "EPG"
 
 msgid "Button$Scan"
-msgstr "Adáskeresés"
+msgstr "EPG keresés"
 
 msgid "Setup.EPG$EPG scan timeout (h)"
-msgstr "Fennmaradt idõ az EPG-újításig (h)"
+msgstr "Fennmaradt idõ az EPG-frissítésig (ó)"
 
 msgid "Setup.EPG$EPG bugfix level"
-msgstr "EPG hibaelhárítás"
+msgstr "Hibaelhárítás szintje"
 
 msgid "Setup.EPG$EPG linger time (min)"
-msgstr "Régi EPG adatok megmutatása (perc)"
+msgstr "Eltelt EPG adatok kijelzése (perc)"
 
 msgid "Setup.EPG$Set system time"
-msgstr "Az idõ beállítása"
+msgstr "Óra állítása TP idõhöz"
 
 msgid "Setup.EPG$Use time from transponder"
 msgstr "Idõhöz tartozó Transponder"
@@ -882,7 +885,7 @@
 msgstr "letterbox"
 
 msgid "center cut out"
-msgstr "center cut out"
+msgstr "képközép kivágás"
 
 msgid "no"
 msgstr "nem"
@@ -900,7 +903,7 @@
 msgstr "új adók hozzáadása"
 
 msgid "add new transponders"
-msgstr "új transponder hozzáadása"
+msgstr "új transponderek hozzáadása"
 
 msgid "DVB"
 msgstr "DVB"
@@ -927,10 +930,10 @@
 msgstr "Adók aktualizálása"
 
 msgid "Setup.DVB$Audio languages"
-msgstr "Audio nyelvek"
+msgstr "Hangsáv nyelvek"
 
 msgid "Setup.DVB$Audio language"
-msgstr "Audio nyelv"
+msgstr "Hangsáv nyelv"
 
 msgid "Setup.DVB$Display subtitles"
 msgstr "Felirat látható"
@@ -960,17 +963,18 @@
 msgstr "SLOF (MHz)"
 
 msgid "Setup.LNB$Low LNB frequency (MHz)"
-msgstr "Alsó LNB-frekvencia (MHZ)"
+msgstr "Alsó LNB-frekvencia (MHz)"
 
 msgid "Setup.LNB$High LNB frequency (MHz)"
-msgstr "Felsõ LNB-frekvencia (MHZ)"
+msgstr "Felsõ LNB-frekvencia (MHz)"
 
 #, c-format
 msgid "Setup.LNB$Device %d connected to sat cable"
 msgstr ""
 
+#, fuzzy
 msgid "Setup.LNB$own"
-msgstr ""
+msgstr "DiSEqC használata"
 
 msgid "CAM reset"
 msgstr "CAM újraindítás"
@@ -991,7 +995,7 @@
 msgstr "Reset"
 
 msgid "Opening CAM menu..."
-msgstr "A CAM menü nyitás alatt..."
+msgstr "A CAM menü nyitása..."
 
 msgid "Can't open CAM menu!"
 msgstr "A CAM menü nem nyitható"
@@ -1003,16 +1007,16 @@
 msgstr "A CAM újraindítás nem sikerült"
 
 msgid "do not pause live video"
-msgstr ""
+msgstr "élõkép leállítása tiltva"
 
 msgid "confirm pause live video"
-msgstr ""
+msgstr "élõkép leállítása megerõsítéssel"
 
 msgid "pause live video"
-msgstr ""
+msgstr "élõkép leállítása"
 
 msgid "confirm"
-msgstr ""
+msgstr "megerõsítés"
 
 msgid "yes"
 msgstr "igen"
@@ -1021,13 +1025,13 @@
 msgstr "Felvétel"
 
 msgid "Setup.Recording$Margin at start (min)"
-msgstr "Idõeltolódás a kezdésnél (perc)"
+msgstr "Idõeltolás a kezdésnél (perc)"
 
 msgid "Setup.Recording$Margin at stop (min)"
-msgstr "Idõeltolódás a befejezésnél (perc)"
+msgstr "Idõeltolás a befejezésnél (perc)"
 
 msgid "Setup.Recording$Primary limit"
-msgstr "Primér-határ"
+msgstr "Alsó prioritás határ"
 
 msgid "Setup.Recording$Default priority"
 msgstr "Alapértelmezett prioritás"
@@ -1036,22 +1040,22 @@
 msgstr "Alapértelmezett élettartam"
 
 msgid "Setup.Recording$Pause key handling"
-msgstr ""
+msgstr "A szünet gomb mûködése"
 
 msgid "Setup.Recording$Pause priority"
-msgstr "Szünet prioritás"
+msgstr "Idõeltolás prioritása"
 
 msgid "Setup.Recording$Pause lifetime (d)"
-msgstr "Szünet élettartama"
+msgstr "Idõeltolás élettartama"
 
 msgid "Setup.Recording$Use episode name"
-msgstr "Epizódnév felhasználása"
+msgstr "Epizódnév"
 
 msgid "Setup.Recording$Use VPS"
-msgstr "VPS-t használni"
+msgstr "VPS"
 
 msgid "Setup.Recording$VPS margin (s)"
-msgstr "Idõeltolódás VPS-nél (s)"
+msgstr "Idõeltolás VPS-nél (mp)"
 
 msgid "Setup.Recording$Mark instant recording"
 msgstr "Direktfelvétel megjelölése"
@@ -1060,26 +1064,29 @@
 msgstr "Direktfelvétel megnevezése"
 
 msgid "Setup.Recording$Instant rec. time (min)"
-msgstr "Felvétel idõtartama (perc)"
+msgstr "Direktfelvétel idõtartama (perc)"
 
 msgid "Setup.Recording$Max. video file size (MB)"
-msgstr "Max. video File-terjedelem (MB)"
+msgstr "Max. video file méret (MB)"
 
 msgid "Setup.Recording$Split edited files"
-msgstr "Feldolgozott File-k felosztása"
+msgstr "Feldolgozott file-ok felosztása"
 
 msgid "Setup.Recording$Delete timeshift recording"
-msgstr ""
+msgstr "Idõeltolásos felvétel törlése"
 
 msgid "Replay"
 msgstr "Lejátszás"
 
 msgid "Setup.Replay$Multi speed mode"
-msgstr "MultiSpeed funkció"
+msgstr "Töbsebességes funkció"
 
 msgid "Setup.Replay$Show replay mode"
 msgstr "Lejátszás feltüntetése"
 
+msgid "Setup.Replay$Show remaining time"
+msgstr ""
+
 msgid "Setup.Replay$Resume ID"
 msgstr "Lejátszás ID"
 
@@ -1087,7 +1094,7 @@
 msgstr "Egyéb"
 
 msgid "Setup.Miscellaneous$Min. event timeout (min)"
-msgstr "Idõzitések közötti idõtartam (perc)"
+msgstr "VDR leáll ha nem következik felvétel (p)"
 
 msgid "Setup.Miscellaneous$Min. user inactivity (min)"
 msgstr "VDR leáll használat nélkül (perc)"
@@ -1102,25 +1109,25 @@
 msgstr "Csatornaváltás timeout (ms)"
 
 msgid "Setup.Miscellaneous$Initial channel"
-msgstr "Adás a bekapcsolásnál"
+msgstr "Csatorna induláskor"
 
 msgid "Setup.Miscellaneous$as before"
 msgstr "ahogy az elõbb"
 
 msgid "Setup.Miscellaneous$Initial volume"
-msgstr "Hangerõ a bekapcsolásnál"
+msgstr "Hangerõ indulásnál"
 
 msgid "Setup.Miscellaneous$Channels wrap"
-msgstr ""
+msgstr "Csatornalista görgetése"
 
 msgid "Setup.Miscellaneous$Emergency exit"
-msgstr ""
+msgstr "Vészleállítás"
 
 msgid "Plugins"
 msgstr "Plugins"
 
 msgid "This plugin has no setup parameters!"
-msgstr "Ennek a plugin-nak nincs setup-parametere!"
+msgstr "Ennek a plugin-nak nincs setup-paramétere!"
 
 msgid "Setup"
 msgstr "Beállítások"
@@ -1136,7 +1143,7 @@
 msgstr " Felvételt befejezni "
 
 msgid "Schedule"
-msgstr "Program"
+msgstr "Mûsorújság"
 
 msgid "VDR"
 msgstr "VDR"
@@ -1183,14 +1190,14 @@
 msgstr "Az élõ adás megállítva..."
 
 msgid "Delete timeshift recording?"
-msgstr ""
+msgstr "Töröljem az idõeltolásos felvételt?"
 
 #. TRANSLATORS: note the trailing blank!
 msgid "Jump: "
-msgstr "Ugrás: "
+msgstr "Ugrás ide: "
 
 msgid "No editing marks defined!"
-msgstr "A vágópont nincs kijelölve"
+msgstr "Nincs vágópont kijelölve"
 
 msgid "Can't start editing process!"
 msgstr "A vágás nem indítható!"
@@ -1226,13 +1233,13 @@
 msgstr "Az adó blokkolva (felvétel)!"
 
 msgid "Low disk space!"
-msgstr "A merev lemez majdnem tele!"
+msgstr "A merevlemez majdnem tele!"
 
 msgid "Regenerating index file"
-msgstr ""
+msgstr "Az index file újragenerálása"
 
 msgid "Index file regeneration complete"
-msgstr ""
+msgstr "Index file újragenerálása kész."
 
 msgid "Can't shutdown - option '-s' not given!"
 msgstr "A leállítás nem lehetséges - Opció '-s' hiányzik!"
@@ -1303,10 +1310,10 @@
 msgstr "Vasárnap"
 
 msgid "Upcoming recording!"
-msgstr "Felvétel rögtön kezdõdik!"
+msgstr "Felvétel rögtön indul!"
 
 msgid "Pause live video?"
-msgstr ""
+msgstr "Megállítsam az élõ képet?"
 
 msgid "Recording started"
 msgstr "A felvétel elindítva"
@@ -1318,7 +1325,7 @@
 msgstr "Nyomj egy gombot a leállás megszakításához"
 
 msgid "Switching primary DVB..."
-msgstr "Primér Interface átkapcsolva..."
+msgstr "Elsõdleges DVB kártya váltása folyamatban..."
 
 msgid "Editing process failed!"
 msgstr "Vágás sikertelen!"
diff -ruN vdr-1.7.22/po/it_IT.po vdr-1.7.23/po/it_IT.po
--- vdr-1.7.22/po/it_IT.po	2011-12-03 16:35:34.000000000 +0100
+++ vdr-1.7.23/po/it_IT.po	2012-01-14 14:09:18.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: 2011-12-03 16:25+0100\n"
+"POT-Creation-Date: 2012-01-14 14:06+0100\n"
 "PO-Revision-Date: 2010-06-13 00:30+0100\n"
 "Last-Translator: Diego Pierotto <vdr-italian@tiscali.it>\n"
 "Language-Team: Italian <vdr@linuxtv.org>\n"
@@ -80,6 +80,9 @@
 msgid "Rolloff"
 msgstr "Rolloff"
 
+msgid "PlpId"
+msgstr ""
+
 msgid "Starting EPG scan"
 msgstr "Inizio scansione EPG"
 
@@ -1084,6 +1087,9 @@
 msgid "Setup.Replay$Show replay mode"
 msgstr "Mostra modalitÃ  riproduzione"
 
+msgid "Setup.Replay$Show remaining time"
+msgstr ""
+
 msgid "Setup.Replay$Resume ID"
 msgstr "ID di ripristino"
 
diff -ruN vdr-1.7.22/po/lt_LT.po vdr-1.7.23/po/lt_LT.po
--- vdr-1.7.22/po/lt_LT.po	2011-12-03 16:35:34.000000000 +0100
+++ vdr-1.7.23/po/lt_LT.po	2012-01-14 14:09:18.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: 2011-12-03 16:25+0100\n"
+"POT-Creation-Date: 2012-01-14 14:06+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"
@@ -73,6 +73,9 @@
 msgid "Rolloff"
 msgstr "Rolloff"
 
+msgid "PlpId"
+msgstr ""
+
 msgid "Starting EPG scan"
 msgstr "Pradedamas EPG skanavimas"
 
@@ -1077,6 +1080,9 @@
 msgid "Setup.Replay$Show replay mode"
 msgstr "Rodyti pakartojimo rÄ™Å¾imÄ…"
 
+msgid "Setup.Replay$Show remaining time"
+msgstr ""
+
 msgid "Setup.Replay$Resume ID"
 msgstr "KÅ«rinio ID"
 
diff -ruN vdr-1.7.22/po/mk_MK.po vdr-1.7.23/po/mk_MK.po
--- vdr-1.7.22/po/mk_MK.po	2011-12-03 16:35:34.000000000 +0100
+++ vdr-1.7.23/po/mk_MK.po	2012-01-14 14:09:18.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: 2011-12-03 16:25+0100\n"
+"POT-Creation-Date: 2012-01-14 14:06+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"
@@ -74,6 +74,9 @@
 msgid "Rolloff"
 msgstr "Ð Ð¾Ð»-Ð¾Ñ„"
 
+msgid "PlpId"
+msgstr ""
+
 msgid "Starting EPG scan"
 msgstr "Ð—Ð°Ð¿Ð¾Ñ‡Ð½ÑƒÐ²Ð°Ð¼ Ñ�ÐºÐµÐ½Ð¸Ñ€Ð°ÑšÐµ Ð½Ð° EPG"
 
@@ -1078,6 +1081,9 @@
 msgid "Setup.Replay$Show replay mode"
 msgstr "ÐŸÑ€Ð¸ÐºÐ°Ð¶Ð¸ Ð½Ð°Ñ‡Ð¸Ð½ Ð½Ð° Ð¿ÑƒÑˆÑ‚Ð°ÑšÐµ"
 
+msgid "Setup.Replay$Show remaining time"
+msgstr ""
+
 msgid "Setup.Replay$Resume ID"
 msgstr "ID Ð½Ð° Ð¿Ñ€Ð¾Ð´Ð¾Ð»Ð¶ÐµÑ‚Ð¾Ðº"
 
diff -ruN vdr-1.7.22/po/nl_NL.po vdr-1.7.23/po/nl_NL.po
--- vdr-1.7.22/po/nl_NL.po	2011-12-03 16:35:33.000000000 +0100
+++ vdr-1.7.23/po/nl_NL.po	2012-01-14 14:09:18.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: 2011-12-03 16:25+0100\n"
+"POT-Creation-Date: 2012-01-14 14:06+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"
@@ -77,6 +77,9 @@
 msgid "Rolloff"
 msgstr ""
 
+msgid "PlpId"
+msgstr ""
+
 msgid "Starting EPG scan"
 msgstr "Bezig met starten EPG scan"
 
@@ -1081,6 +1084,9 @@
 msgid "Setup.Replay$Show replay mode"
 msgstr "Weergave mode aangeven"
 
+msgid "Setup.Replay$Show remaining time"
+msgstr ""
+
 msgid "Setup.Replay$Resume ID"
 msgstr "Hervattings ID"
 
diff -ruN vdr-1.7.22/po/nn_NO.po vdr-1.7.23/po/nn_NO.po
--- vdr-1.7.22/po/nn_NO.po	2011-12-03 16:35:34.000000000 +0100
+++ vdr-1.7.23/po/nn_NO.po	2012-01-14 14:09:18.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: 2011-12-03 16:25+0100\n"
+"POT-Creation-Date: 2012-01-14 14:06+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"
@@ -74,6 +74,9 @@
 msgid "Rolloff"
 msgstr ""
 
+msgid "PlpId"
+msgstr ""
+
 msgid "Starting EPG scan"
 msgstr ""
 
@@ -1078,6 +1081,9 @@
 msgid "Setup.Replay$Show replay mode"
 msgstr "Vis avspillingsmodus"
 
+msgid "Setup.Replay$Show remaining time"
+msgstr ""
+
 msgid "Setup.Replay$Resume ID"
 msgstr "Resume ID"
 
diff -ruN vdr-1.7.22/po/pl_PL.po vdr-1.7.23/po/pl_PL.po
--- vdr-1.7.22/po/pl_PL.po	2011-12-03 16:35:33.000000000 +0100
+++ vdr-1.7.23/po/pl_PL.po	2012-01-14 14:09:17.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: 2011-12-03 16:25+0100\n"
+"POT-Creation-Date: 2012-01-14 14:06+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"
@@ -74,6 +74,9 @@
 msgid "Rolloff"
 msgstr ""
 
+msgid "PlpId"
+msgstr ""
+
 msgid "Starting EPG scan"
 msgstr "Rozpoczynam skanowanie EPG"
 
@@ -1078,6 +1081,9 @@
 msgid "Setup.Replay$Show replay mode"
 msgstr "Pokazuj tryb odtwarzania"
 
+msgid "Setup.Replay$Show remaining time"
+msgstr ""
+
 msgid "Setup.Replay$Resume ID"
 msgstr "ID wznowienia"
 
diff -ruN vdr-1.7.22/po/pt_PT.po vdr-1.7.23/po/pt_PT.po
--- vdr-1.7.22/po/pt_PT.po	2011-12-03 16:35:33.000000000 +0100
+++ vdr-1.7.23/po/pt_PT.po	2012-01-14 14:09:16.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: 2011-12-03 16:25+0100\n"
+"POT-Creation-Date: 2012-01-14 14:06+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"
@@ -74,6 +74,9 @@
 msgid "Rolloff"
 msgstr "Rolloff"
 
+msgid "PlpId"
+msgstr ""
+
 msgid "Starting EPG scan"
 msgstr "A iniciar a busca do EPG"
 
@@ -1078,6 +1081,9 @@
 msgid "Setup.Replay$Show replay mode"
 msgstr "Mostrar modo de reprodução"
 
+msgid "Setup.Replay$Show remaining time"
+msgstr ""
+
 msgid "Setup.Replay$Resume ID"
 msgstr "ID de resumo"
 
diff -ruN vdr-1.7.22/po/ro_RO.po vdr-1.7.23/po/ro_RO.po
--- vdr-1.7.22/po/ro_RO.po	2011-12-03 16:35:33.000000000 +0100
+++ vdr-1.7.23/po/ro_RO.po	2012-01-14 14:09:17.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: 2011-12-03 16:25+0100\n"
+"POT-Creation-Date: 2012-01-14 14:06+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"
@@ -76,6 +76,9 @@
 msgid "Rolloff"
 msgstr "Rolloff"
 
+msgid "PlpId"
+msgstr ""
+
 msgid "Starting EPG scan"
 msgstr "Pornesc achiziþia EPG"
 
@@ -1080,6 +1083,9 @@
 msgid "Setup.Replay$Show replay mode"
 msgstr "Afiºeazã redarea"
 
+msgid "Setup.Replay$Show remaining time"
+msgstr ""
+
 msgid "Setup.Replay$Resume ID"
 msgstr "Identificator continuare"
 
diff -ruN vdr-1.7.22/po/ru_RU.po vdr-1.7.23/po/ru_RU.po
--- vdr-1.7.22/po/ru_RU.po	2011-12-03 16:35:34.000000000 +0100
+++ vdr-1.7.23/po/ru_RU.po	2012-01-14 14:09:19.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: 2011-12-03 16:25+0100\n"
+"POT-Creation-Date: 2012-01-14 14:06+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"
@@ -74,6 +74,9 @@
 msgid "Rolloff"
 msgstr "Rolloff"
 
+msgid "PlpId"
+msgstr ""
+
 msgid "Starting EPG scan"
 msgstr "½ÐçØÝÐî EPG-áÚÐÝØàÞÒÐÝØÕ"
 
@@ -1078,6 +1081,9 @@
 msgid "Setup.Replay$Show replay mode"
 msgstr "¾âÞÑàÐÖÐâì àÕÖØÜ ÒÞáßàÞØ×ÒÕÔÕÝØï"
 
+msgid "Setup.Replay$Show remaining time"
+msgstr ""
+
 msgid "Setup.Replay$Resume ID"
 msgstr "ID ÒÞáßàÞØ×ÒÕÔÕÝØï"
 
diff -ruN vdr-1.7.22/po/sk_SK.po vdr-1.7.23/po/sk_SK.po
--- vdr-1.7.22/po/sk_SK.po	2011-12-03 16:35:34.000000000 +0100
+++ vdr-1.7.23/po/sk_SK.po	2012-01-14 14:09:18.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: 2011-12-03 16:25+0100\n"
+"POT-Creation-Date: 2012-01-14 14:06+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"
@@ -73,6 +73,9 @@
 msgid "Rolloff"
 msgstr "Rolloff"
 
+msgid "PlpId"
+msgstr ""
+
 msgid "Starting EPG scan"
 msgstr "Zaèína prehµadáva» EPG"
 
@@ -1077,6 +1080,9 @@
 msgid "Setup.Replay$Show replay mode"
 msgstr "Zobrazi» spôsob prehrávania"
 
+msgid "Setup.Replay$Show remaining time"
+msgstr ""
+
 msgid "Setup.Replay$Resume ID"
 msgstr "ID obnovenie"
 
diff -ruN vdr-1.7.22/po/sl_SI.po vdr-1.7.23/po/sl_SI.po
--- vdr-1.7.22/po/sl_SI.po	2011-12-03 16:35:34.000000000 +0100
+++ vdr-1.7.23/po/sl_SI.po	2012-01-14 14:09:19.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: 2011-12-03 16:25+0100\n"
+"POT-Creation-Date: 2012-01-14 14:06+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"
@@ -74,6 +74,9 @@
 msgid "Rolloff"
 msgstr ""
 
+msgid "PlpId"
+msgstr ""
+
 msgid "Starting EPG scan"
 msgstr "Prièenjam EPG-scan"
 
@@ -1078,6 +1081,9 @@
 msgid "Setup.Replay$Show replay mode"
 msgstr "Prika¾i re¾im predvajanja"
 
+msgid "Setup.Replay$Show remaining time"
+msgstr ""
+
 msgid "Setup.Replay$Resume ID"
 msgstr "ID za predvajanje"
 
diff -ruN vdr-1.7.22/po/sr_SR.po vdr-1.7.23/po/sr_SR.po
--- vdr-1.7.22/po/sr_SR.po	2011-12-03 16:35:34.000000000 +0100
+++ vdr-1.7.23/po/sr_SR.po	2012-01-14 14:09:18.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: 2011-12-03 16:25+0100\n"
+"POT-Creation-Date: 2012-01-14 14:06+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"
@@ -74,6 +74,9 @@
 msgid "Rolloff"
 msgstr ""
 
+msgid "PlpId"
+msgstr ""
+
 msgid "Starting EPG scan"
 msgstr "Poèinjem EPG pretragu"
 
@@ -1100,6 +1103,9 @@
 msgid "Setup.Replay$Show replay mode"
 msgstr "Prika¾i re¾im reprodukcije"
 
+msgid "Setup.Replay$Show remaining time"
+msgstr ""
+
 msgid "Setup.Replay$Resume ID"
 msgstr "ID nastavka"
 
diff -ruN vdr-1.7.22/po/sv_SE.po vdr-1.7.23/po/sv_SE.po
--- vdr-1.7.22/po/sv_SE.po	2011-12-03 16:35:34.000000000 +0100
+++ vdr-1.7.23/po/sv_SE.po	2012-01-14 14:09:18.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: 2011-12-03 16:25+0100\n"
+"POT-Creation-Date: 2012-01-14 14:06+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"
@@ -76,6 +76,9 @@
 msgid "Rolloff"
 msgstr ""
 
+msgid "PlpId"
+msgstr ""
+
 msgid "Starting EPG scan"
 msgstr "Påbörjar EPG skanning"
 
@@ -1080,6 +1083,9 @@
 msgid "Setup.Replay$Show replay mode"
 msgstr "Visa uppspelningsläge"
 
+msgid "Setup.Replay$Show remaining time"
+msgstr ""
+
 msgid "Setup.Replay$Resume ID"
 msgstr "Återuppta ID"
 
diff -ruN vdr-1.7.22/po/tr_TR.po vdr-1.7.23/po/tr_TR.po
--- vdr-1.7.22/po/tr_TR.po	2011-12-03 16:35:33.000000000 +0100
+++ vdr-1.7.23/po/tr_TR.po	2012-01-14 14:09:17.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: 2011-12-03 16:25+0100\n"
+"POT-Creation-Date: 2012-01-14 14:06+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"
@@ -73,6 +73,9 @@
 msgid "Rolloff"
 msgstr ""
 
+msgid "PlpId"
+msgstr ""
+
 msgid "Starting EPG scan"
 msgstr "EPG tarama baþlýyor"
 
@@ -1077,6 +1080,9 @@
 msgid "Setup.Replay$Show replay mode"
 msgstr "Gösteriþ bilgisi"
 
+msgid "Setup.Replay$Show remaining time"
+msgstr ""
+
 msgid "Setup.Replay$Resume ID"
 msgstr "Gösteriþ ID'si"
 
diff -ruN vdr-1.7.22/po/uk_UA.po vdr-1.7.23/po/uk_UA.po
--- vdr-1.7.22/po/uk_UA.po	2011-12-03 16:35:34.000000000 +0100
+++ vdr-1.7.23/po/uk_UA.po	2012-01-14 14:09:18.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: 2011-12-03 16:25+0100\n"
+"POT-Creation-Date: 2012-01-14 14:06+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"
@@ -73,6 +73,9 @@
 msgid "Rolloff"
 msgstr "ÐšÑ€ÐµÐ½"
 
+msgid "PlpId"
+msgstr ""
+
 msgid "Starting EPG scan"
 msgstr "ÐŸÐ¾Ñ‡Ð¸Ð½Ð°ÑŽ EPG-Ñ�ÐºÐ°Ð½ÑƒÐ²Ð°Ð½Ð½Ñ�"
 
@@ -1077,6 +1080,9 @@
 msgid "Setup.Replay$Show replay mode"
 msgstr "Ð’Ñ–Ð¾Ð±Ñ€Ð°Ð¶Ð°Ñ‚Ð¸ Ñ€ÐµÐ¶Ð¸Ð¼ Ð¿ÐµÑ€ÐµÐ³Ð»Ñ�Ð´Ñƒ"
 
+msgid "Setup.Replay$Show remaining time"
+msgstr ""
+
 msgid "Setup.Replay$Resume ID"
 msgstr "ID Ð¿Ñ€Ð¾Ð´Ð¾Ð²Ð¶ÐµÐ½Ð½Ñ�"
 
diff -ruN vdr-1.7.22/po/zh_CN.po vdr-1.7.23/po/zh_CN.po
--- vdr-1.7.22/po/zh_CN.po	2011-12-03 16:35:33.000000000 +0100
+++ vdr-1.7.23/po/zh_CN.po	2012-01-14 14:09:17.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: 2011-12-03 16:25+0100\n"
+"POT-Creation-Date: 2012-01-14 14:06+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"
@@ -76,6 +76,9 @@
 msgid "Rolloff"
 msgstr "è¶Šé›¶çŽ‡"
 
+msgid "PlpId"
+msgstr ""
+
 msgid "Starting EPG scan"
 msgstr "å¼€å§‹èŠ‚ç›®å�•æ‰«æ��"
 
@@ -1080,6 +1083,9 @@
 msgid "Setup.Replay$Show replay mode"
 msgstr "æ˜¾ç¤ºå›žæ”¾æ¨¡å¼�"
 
+msgid "Setup.Replay$Show remaining time"
+msgstr ""
+
 msgid "Setup.Replay$Resume ID"
 msgstr "æ�¢å¤� ID"
 
diff -ruN vdr-1.7.22/recording.c vdr-1.7.23/recording.c
--- vdr-1.7.22/recording.c	2011-12-04 14:51:44.000000000 +0100
+++ vdr-1.7.23/recording.c	2012-01-15 12:04:24.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.39 2011/12/04 13:51:44 kls Exp $
+ * $Id: recording.c 2.43 2012/01/15 11:04:24 kls Exp $
  */
 
 #include "recording.h"
@@ -873,16 +873,23 @@
         s++;
      else
         s = name;
-     titleBuffer = strdup(cString::sprintf("%02d.%02d.%02d%c%02d:%02d%c%d:%02d%c%c%s",
+     cString Length("");
+     if (NewIndicator) {
+        int Seconds = max(0, LengthInSeconds());
+        Length = cString::sprintf("%c%d:%02d",
+                   Delimiter,
+                   Seconds / 3600,
+                   Seconds / 60 % 60
+                   );
+        }
+     titleBuffer = strdup(cString::sprintf("%02d.%02d.%02d%c%02d:%02d%s%c%c%s",
                             t->tm_mday,
                             t->tm_mon + 1,
                             t->tm_year % 100,
                             Delimiter,
                             t->tm_hour,
                             t->tm_min,
-                            Delimiter,
-                            (LengthInSeconds() >= 0) ? LengthInSeconds() / 3600 : 0,
-                            (LengthInSeconds() >= 0) ? LengthInSeconds() / 60 % 60 : 0,
+                            *Length,
                             New,
                             Delimiter,
                             s));
@@ -1103,25 +1110,21 @@
   struct dirent *e;
   while ((Foreground || Running()) && (e = d.Next()) != NULL) {
         if (strcmp(e->d_name, ".") && strcmp(e->d_name, "..")) {
-           char *buffer = strdup(AddDirectory(DirName, e->d_name));
+           cString buffer = AddDirectory(DirName, e->d_name);
            struct stat st;
-           if (stat(buffer, &st) == 0) {
+           if (lstat(buffer, &st) == 0) {
               int Link = 0;
               if (S_ISLNK(st.st_mode)) {
                  if (LinkLevel > MAX_LINK_LEVEL) {
-                    isyslog("max link level exceeded - not scanning %s", buffer);
+                    isyslog("max link level exceeded - not scanning %s", *buffer);
                     continue;
                     }
                  Link = 1;
-                 char *old = buffer;
-                 buffer = ReadLink(old);
-                 free(old);
-                 if (!buffer)
+                 buffer = ReadLink(buffer);
+                 if (!*buffer)
                     continue;
-                 if (stat(buffer, &st) != 0) {
-                    free(buffer);
+                 if (stat(buffer, &st) != 0)
                     continue;
-                    }
                  }
               if (S_ISDIR(st.st_mode)) {
                  if (endswith(buffer, deleted ? DELEXT : RECEXT)) {
@@ -1144,7 +1147,6 @@
                     ScanVideoDir(buffer, Foreground, LinkLevel + Link);
                  }
               }
-           free(buffer);
            }
         }
 }
@@ -2040,15 +2042,18 @@
 
 cString IndexToHMSF(int Index, bool WithFrame, double FramesPerSecond)
 {
-  char buffer[16];
+  const char *Sign = "";
+  if (Index < 0) {
+     Index = -Index;
+     Sign = "-";
+     }
   double Seconds;
   int f = int(modf((Index + 0.5) / FramesPerSecond, &Seconds) * FramesPerSecond + 1);
   int s = int(Seconds);
   int m = s / 60 % 60;
   int h = s / 3600;
   s %= 60;
-  snprintf(buffer, sizeof(buffer), WithFrame ? "%d:%02d:%02d.%02d" : "%d:%02d:%02d", h, m, s, f);
-  return buffer;
+  return cString::sprintf(WithFrame ? "%s%d:%02d:%02d.%02d" : "%s%d:%02d:%02d", Sign, h, m, s, f);
 }
 
 int HMSFToIndex(const char *HMSF, double FramesPerSecond)
diff -ruN vdr-1.7.22/remux.c vdr-1.7.23/remux.c
--- vdr-1.7.22/remux.c	2011-09-04 15:09:06.000000000 +0200
+++ vdr-1.7.23/remux.c	2012-01-12 13:07:58.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.62 2011/09/04 13:09:06 kls Exp $
+ * $Id: remux.c 2.63 2012/01/12 12:07:58 kls Exp $
  */
 
 #include "remux.h"
@@ -701,6 +701,10 @@
         uchar *p = data + offset - 6;
         if (p != data) {
            p -= 3;
+           if (p < data) {
+              Reset();
+              return NULL;
+              }
            memmove(p, data, 4);
            }
         int l = min(length - offset, MAXPESLENGTH);
diff -ruN vdr-1.7.22/svdrp.c vdr-1.7.23/svdrp.c
--- vdr-1.7.22/svdrp.c	2011-12-04 14:58:33.000000000 +0100
+++ vdr-1.7.23/svdrp.c	2012-01-12 16:02:46.000000000 +0100
@@ -10,7 +10,7 @@
  * and interact with the Video Disk Recorder - or write a full featured
  * graphical interface that sits on top of an SVDRP connection.
  *
- * $Id: svdrp.c 2.12 2011/12/04 13:58:33 kls Exp $
+ * $Id: svdrp.c 2.13 2012/01/12 15:02:46 kls Exp $
  */
 
 #include "svdrp.h"
@@ -583,6 +583,10 @@
                   }
                }
            if (Schedule) {
+              for (cTimer *Timer = Timers.First(); Timer; Timer = Timers.Next(Timer)) {
+                  if (ChannelID == Timer->Channel()->GetChannelID().ClrRid())
+                     Timer->SetEvent(NULL);
+                  }
               Schedule->Cleanup(INT_MAX);
               cEitFilter::SetDisableUntil(time(NULL) + EITDISABLETIME);
               Reply(250, "EPG data of channel \"%s\" cleared", Option);
diff -ruN vdr-1.7.22/svdrpsend vdr-1.7.23/svdrpsend
--- vdr-1.7.22/svdrpsend	1970-01-01 01:00:00.000000000 +0100
+++ vdr-1.7.23/svdrpsend	2011-08-06 11:48:37.000000000 +0200
@@ -0,0 +1,57 @@
+#!/usr/bin/perl
+
+use Socket;
+use Getopt::Std;
+
+$Usage = qq{
+Usage: $0 options command...
+
+Options: -d hostname        destination hostname (default: localhost)
+         -p port            SVDRP port number (default: 6419)
+};
+
+die $Usage if (!$ARGV[0] || !getopts("d:p:"));
+
+$Dest = $opt_d  || "localhost";
+$Port = $opt_p  || 6419;
+$Cmd  = "@ARGV" || Error("missing command");
+
+$Timeout = 10; # max. seconds to wait for response
+
+$SIG{ALRM} = sub { Error("timeout"); };
+alarm($Timeout);
+
+$iaddr = inet_aton($Dest)                   || Error("no host: $Dest");
+$paddr = sockaddr_in($Port, $iaddr);
+
+$proto = getprotobyname('tcp');
+socket(SOCK, PF_INET, SOCK_STREAM, $proto)  || Error("socket: $!");
+connect(SOCK, $paddr)                       || Error("connect: $!");
+select(SOCK); $| = 1;
+Receive();
+Send($Cmd);
+Send("quit");
+close(SOCK)                                 || Error("close: $!");
+
+sub Send
+{
+  my $cmd = shift || Error("no command to send");
+  print SOCK "$cmd\r\n";
+  Receive();
+}
+
+sub Receive
+{
+  while (<SOCK>) {
+        print STDOUT $_;
+        last if substr($_, 3, 1) ne "-";
+        }
+}
+
+sub Error
+{
+  print STDERR "@_\n";
+  close(SOCK);
+  exit 1;
+}
+
diff -ruN vdr-1.7.22/svdrpsend.pl vdr-1.7.23/svdrpsend.pl
--- vdr-1.7.22/svdrpsend.pl	2011-08-06 11:48:37.000000000 +0200
+++ vdr-1.7.23/svdrpsend.pl	1970-01-01 01:00:00.000000000 +0100
@@ -1,57 +0,0 @@
-#!/usr/bin/perl
-
-use Socket;
-use Getopt::Std;
-
-$Usage = qq{
-Usage: $0 options command...
-
-Options: -d hostname        destination hostname (default: localhost)
-         -p port            SVDRP port number (default: 6419)
-};
-
-die $Usage if (!$ARGV[0] || !getopts("d:p:"));
-
-$Dest = $opt_d  || "localhost";
-$Port = $opt_p  || 6419;
-$Cmd  = "@ARGV" || Error("missing command");
-
-$Timeout = 10; # max. seconds to wait for response
-
-$SIG{ALRM} = sub { Error("timeout"); };
-alarm($Timeout);
-
-$iaddr = inet_aton($Dest)                   || Error("no host: $Dest");
-$paddr = sockaddr_in($Port, $iaddr);
-
-$proto = getprotobyname('tcp');
-socket(SOCK, PF_INET, SOCK_STREAM, $proto)  || Error("socket: $!");
-connect(SOCK, $paddr)                       || Error("connect: $!");
-select(SOCK); $| = 1;
-Receive();
-Send($Cmd);
-Send("quit");
-close(SOCK)                                 || Error("close: $!");
-
-sub Send
-{
-  my $cmd = shift || Error("no command to send");
-  print SOCK "$cmd\r\n";
-  Receive();
-}
-
-sub Receive
-{
-  while (<SOCK>) {
-        print STDOUT $_;
-        last if substr($_, 3, 1) ne "-";
-        }
-}
-
-sub Error
-{
-  print STDERR "@_\n";
-  close(SOCK);
-  exit 1;
-}
-
diff -ruN vdr-1.7.22/tools.c vdr-1.7.23/tools.c
--- vdr-1.7.22/tools.c	2011-12-04 15:52:38.000000000 +0100
+++ vdr-1.7.23/tools.c	2012-01-11 12:21:43.000000000 +0100
@@ -4,7 +4,7 @@
  * See the main source file 'vdr.c' for copyright information and
  * how to reach the author.
  *
- * $Id: tools.c 2.19 2011/12/04 14:52:38 kls Exp $
+ * $Id: tools.c 2.20 2012/01/11 11:21:43 kls Exp $
  */
 
 #include "tools.h"
@@ -1913,7 +1913,7 @@
 
 void cListBase::Move(cListObject *From, cListObject *To)
 {
-  if (From && To) {
+  if (From && To && From != To) {
      if (From->Index() < To->Index())
         To = To->Next();
      if (From == objects)
diff -ruN vdr-1.7.22/vdr.5 vdr-1.7.23/vdr.5
--- vdr-1.7.22/vdr.5	2011-09-25 15:51:34.000000000 +0200
+++ vdr-1.7.23/vdr.5	2012-01-11 14:16:57.000000000 +0100
@@ -8,7 +8,7 @@
 .\" License as specified in the file COPYING that comes with the
 .\" vdr distribution.
 .\"
-.\" $Id: vdr.5 2.26 2011/09/25 13:51:34 kls Exp $
+.\" $Id: vdr.5 2.27 2012/01/11 13:16:57 kls Exp $
 .\"
 .TH vdr 5 "10 Feb 2008" "1.6" "Video Disk Recorder Files"
 .SH NAME
@@ -87,32 +87,33 @@
 .TS
 tab (@);
 l l.
-\fBB\fR@Bandwidth (6, 7, 8)
+\fBB\fR@Bandwidth (1712, 5, 6, 7, 8, 10)
 \fBC\fR@Code rate high priority (0, 12, 23, 34, 35, 45, 56, 67, 78, 89, 910)
 \fBD\fR@coDe rate low priority (0, 12, 23, 34, 35, 45, 56, 67, 78, 89, 910)
-\fBG\fR@Guard interval (4, 8, 16, 32)
+\fBG\fR@Guard interval (4, 8, 16, 32, 128, 19128, 19256)
 \fBH\fR@Horizontal polarization
 \fBI\fR@Inversion (0, 1)
 \fBL\fR@Left circular polarization
 \fBM\fR@Modulation (2, 5, 6, 10, 11, 16, 32, 64, 128, 256, 998)
 \fBO\fR@rollOff (0, 20, 25, 35)
+\fBP\fR@Plp id (0-255)
 \fBR\fR@Right circular polarization
 \fBS\fR@delivery System (0, 1)
-\fBT\fR@Transmission mode (2, 8)
+\fBT\fR@Transmission mode (1, 2, 4, 8, 16, 32)
 \fBV\fR@Vertical polarization
 \fBY\fR@hierarchY (0, 1, 2, 4)
 .TE
 
-\fBBandwidth:\fR The bandwidth of the channel in MHz (DVB-T only).
+\fBBandwidth:\fR The bandwidth of the channel in MHz (1712 in kHz): (DVB-T/DVB-T2 only).
 
-\fBCode rate high priority:\fR Forward Error Correction (FEC) of the high priority stream (DVB-T).
+\fBCode rate high priority:\fR Forward Error Correction (FEC) of the high priority stream (DVB-T/DVB-T2).
 For DVB-S/DVB-S2 this parameter specifies the inner FEC scheme.
 12 = 1/2, 23 = 2/3, 34 = 3/4, ...
 
-\fBCode rate low priority:\fR Forward Error Correction (FEC) of the low priority stream (DVB-T only).
+\fBCode rate low priority:\fR Forward Error Correction (FEC) of the low priority stream (DVB-T/DVB-T2 only).
 If no hierarchy is used, set to 0.
 
-\fBGuard interval:\fR The guard interval value (DVB-T only): 4 = 1/4, 8 = 1/8, 16 = 1/16, 32 = 1/32.
+\fBGuard interval:\fR The guard interval value (DVB-T only): 4 = 1/4, 8 = 1/8, 16 = 1/16, 32 = 1/32, 128 = 1/128, 19128 = 19/128, 19256 = 19/256.
 
 \fBInversion:\fR Specifies whether the DVB frontend needs spectral inversion (DVB-T and DVB-C only). This is frontend specific, if in doubt, omit.
 
@@ -120,26 +121,30 @@
 .TS
 tab (@);
 l l.
-\fB2\fR@QPSK (DVB-S, DVB-S2, DVB-T)
+\fB2\fR@QPSK (DVB-S, DVB-S2, DVB-T, DVB-T2, ISDB-T)
 \fB5\fR@8PSK (DVB-S2)
 \fB6\fR@16APSK (DVB-S2)
+\fB7\fR@32APSK (DVB-S2)
 \fB10\fR@VSB8 (ATSC aerial)
 \fB11\fR@VSB16 (ATSC aerial)
-\fB16\fR@QAM16 (DVB-T)
-\fB64\fR@QAM64 (DVB-C, DVB-T)
+\fB12\fR@DQPSK (ISDB-T)
+\fB16\fR@QAM16 (DVB-T, DVB-T2, ISDB-T)
+\fB64\fR@QAM64 (DVB-C, DVB-T, DVB-T2, ISDB-T)
 \fB128\fR@QAM128 (DVB-C)
-\fB256\fR@QAM256 (DVB-C)
+\fB256\fR@QAM256 (DVB-C, DVB-T2)
 .TE
 
 \fBRolloff:\fR The Nyquist filter rolloff factor for DVB-S (\fB35\fR) and DVB-S2 (\fB35\fR, 25, 20),
 35 = 0.35, 25 = 0.25, 20 = 0.20, DVB-S/DVB-S2 default value is 0.35
 
-\fBTransmission mode:\fR Number of DVB-T OFDM carriers, 8 = 8k, 2 = 2k. If in doubt, try 8k.
+\fBPLP id:\fR Physical Layer Pipe (PLP) id (\fB0\fR-255) for DVB-T2 multiplex (DVB-T2 only).
+
+\fBTransmission mode:\fR Number of DVB-T OFDM carriers, 32 = 32k, 16 = 16k, 8 = 8k, 4 = 4k, 2 = 2k, 1 = 1k. If in doubt, try 8k.
 
 \fBHierarchy:\fR If set to 1, this transponder uses two streams, high priority and low priority.
-If in doubt, try 0 (off). (DVB-T only).
+If in doubt, try 0 (off). (DVB-T/DVB-T2 only).
 
-\fBDelivery System:\fR The satellite delivery system (0 = DVB-S, 1 = DVB-S2).
+\fBDelivery System:\fR The delivery system (0 = "first generation" (DVB-S/DVB-T), 1 = "second generation" (DVB-S2/DVB-T2).
 
 \fBPolarization:\fR Satellite antenna polarization.
 H = horizontal, V = vertical, R = circular right, L = circular left.
@@ -152,16 +157,19 @@
 will automatically determine the proper value (if possible).
 
 An example of a parameter field for a DVB-T channel might look like this:
-\fBB8C23D12G8M16T8Y0\fR
+\fBB8C23D12G8M16T8Y0S0\fR
+
+An example of a parameter field for a DVB-T2 channel might look like this:
+\fBB8C23D12G8M16T8Y0P0S1\fR
 
 An example of a parameter field for a DVB-C channel might look like this:
 \fBC0M64\fR
 
 An example of a parameter field for a DVB-S channel might look like this:
-\fBhC56M2O35S0\fR
+\fBHC56M2O35S0\fR
 
 An example of a parameter field for a DVB-S2 channel might look like this:
-\fBhC910M2O35S1\fR
+\fBHC910M2O35S1\fR
 
 Plugins that implement devices that need their own set of parameters may
 store those in the parameters string in arbitrary format (not necessarily
