diff -ruN vdr-1.3.41/CONTRIBUTORS vdr-1.3.42/CONTRIBUTORS
--- vdr-1.3.41/CONTRIBUTORS	2006-01-29 15:57:13.000000000 +0100
+++ vdr-1.3.42/CONTRIBUTORS	2006-02-05 16:09:51.000000000 +0100
@@ -215,6 +215,7 @@
  path names
  for suggesting that the SVDRP command GRAB should allow file names without extension
  again
+ for reporting a problem with channel up/down switching on single card systems
 
 Ulrich Röder <roeder@efr-net.de>
  for pointing out that there are channels that have a symbol rate higher than 27500
@@ -270,6 +271,7 @@
  for improving the font file generation in the Makefile
  for pointing out a problem with the ERR macro defined by ncurses.h
  for a patch that contained a fix for checking toFile in cCuttingThread::Action()
+ for improving cUnbufferedFile
 
 Werner Fink <werner@suse.de>
  for making I/O more robust by handling EINTR
@@ -548,6 +550,8 @@
  for suggesting to give a message when an instant recording is started
  fpr suggesting to retry a shutdown after a while
  for separating the 'install' target into several individual targets
+ for reporting a problem with scrolling with Up/Down in case there are non-selectable
+ items at the beginning of the menu
 
 Jeremy Hall <jhall@UU.NET>
  for fixing an incomplete initialization of the filter parameters in eit.c
@@ -843,6 +847,8 @@
 Thomas Koch <tom@harhar.net>
  for his support in keeping the Premiere World channels up to date in 'channels.conf'
  for implementing the SVDRP command STAT
+ for reporting a problem with "pending" timers that blocked others that actually
+ could record
 
 Stefan Hußfeldt <vdr@marvin.on-luebeck.de>
  for his help in keeping 'channels.conf.cable' up to date
@@ -880,6 +886,8 @@
  for reporting a problem in case a station defines all 32 audio PIDs
  for suggestions and experiments regarding the buffer reserve in cTransfer
  for reporting a problem with 'summary.vdr' files with more than two empty lines
+ for reporting a problem with multiple entries of the same subdirectory in the
+ "Recordings" menu
 
 Andreas Mair <Andreas.Mair@linogate.com>
  for reporting a short display of the main menu if a plugin displays its own OSD and
@@ -944,6 +952,7 @@
  for a patch that was used to implement automatic cursor advance when entering text
  via the numeric keys
  for reporting a problem with expired timers when shutting down via the Power key
+ for fixing handling the "Blue" key in the "Schedule" menu for the current channel
 
 Ralf Klueber <ralf.klueber@vodafone.com>
  for reporting a bug in cutting a recording if there is only a single editing mark
@@ -1040,6 +1049,7 @@
  DiSEqC data) if the lock is lost
  for fixing handling TS packets in cTS2PES
  for adding a mutex to synchronize cDevice::PlayPesPacket() and SetCurrentAudioTrack()
+ for a suggestion that lead to implementing cDevice::Transferring()
 
 Richard Robson <richard_robson@beeb.net>
  for reporting freezing replay if a timer starts while in Transfer Mode from the
@@ -1061,6 +1071,7 @@
 
 Sebastian Frei <sebastian@schnapsleichen.de>
  for his support in keeping 'channels.conf' up-to-date.
+ for suggesting to rename the Makefile target 'plugins-clean' to 'clean-plugins'
 
 Rene Bartsch <ml@bartschnet.de>
  for reporting a bug in setting the primary device in case none of the devices
@@ -1292,6 +1303,9 @@
  for figuring out some obscure length bytes the the CA PMT Reply data of AlphaCrypt CAMs
  for fixing handling OSD areas that have invalid sizes
  for removing unused variables in skinclassic.c and skinsttng.c
+ for removing leftover 'needsBufferReserve' variable from cTransfer
+ for adding an 'Id' parameter to cDevice::PlayAudio() to allow plugins to easier
+ process the audio data
 
 Jürgen Schmitz <j.schmitz@web.de>
  for reporting a bug in displaying the current channel when switching via the SVDRP
@@ -1330,6 +1344,7 @@
 Arthur Konovalov <kasjas@hot.ee>
  for translating OSD texts to the Estonian language
  for fixing a missing ',' in the Greek OSD texts
+ for fixing a missing ',' in the Swedish OSD texts
 
 Milos Kapoun <m.kapoun@cra.cz>
  for suggesting to skip code table info in SI data
@@ -1351,6 +1366,10 @@
  for making the Makefile report a summary of failed plugins
  for reporting a problem with the new handling of k_Repeat keypresses in channel
  switching
+ for reporting a problem with auto advance in string entry fields when pressing
+ Up/Down in insert mode
+ for fixing handling the "Setup/OSD/Menu button closes" option when set to 'yes' in
+ case a replay is active
 
 Sven Kreiensen <svenk@kammer.uni-hannover.de>
  for his help in keeping 'channels.conf.terr' up to date
@@ -1414,6 +1433,7 @@
  for suggesting to write grabbed images to the SVDRP connection encoded in base64
  for suggesting to open the file handle in the SVDRP GRAB command in a way that
  it won't follow symbolic links, and to canonicalize the file name
+ for making all font and image data 'const'
 
 Sean Carlos <seanc@libero.it>
  for translating OSD texts to the Italian language
@@ -1494,6 +1514,7 @@
  for removing the obsolete "ca.conf" section from vdr.1
  for making the cLircRemote try to reestablish the connection to the LIRC daemon
  in case it breaks
+ for enabling generating a core dump if VDR is run with a different user id
 
 Steffen Beyer <cpunk@reactor.de>
  for fixing setting the colored button help after deleting a recording in case the next
@@ -1590,6 +1611,7 @@
  for fixing handling color buttons in cMenuEditStrItem
  for making the '.update' file in the video directory be touched when a recording is
  added or deleted, so that other VDR instances can update their lists
+ for adding cSkin::GetTextAreaWidth() and cSkin::GetTextAreaFont()
 
 Philip Prindeville <philipp_subx@redfish-solutions.com>
  for updates to 'sources.conf'
@@ -1710,3 +1732,9 @@
 Suur Karu <suurkaru@fastmail.fm>
  for reporting a problem with the tuning timeout for channels that have low symbol
  rates
+
+Ronny Kornexl <ronny.kornexl@online.de>
+ for reporting a problem with setting "No title" for broken event data
+
+Bárta Vladimír <vladimir.barta@k2atmitec.cz>
+ for translating OSD texts to the Czech language
diff -ruN vdr-1.3.41/HISTORY vdr-1.3.42/HISTORY
--- vdr-1.3.41/HISTORY	2006-01-29 15:56:50.000000000 +0100
+++ vdr-1.3.42/HISTORY	2006-02-05 16:09:21.000000000 +0100
@@ -4270,3 +4270,49 @@
   system, it is now tried again after 5 minutes (suggested by Helmut Auer).
 - Separated the 'install' target into several individual targets; renamed the
   'plugins-install' target to 'install-plugins' (thanks to Helmut Auer).
+
+2006-02-05: Version 1.3.42
+
+- Removed leftover 'needsBufferReserve' variable from cTransfer (thanks to Marco
+  Schlüßler).
+- Fixed setting "No title" for broken event data (reported by Ronny Kornexl).
+- Fixed channel up/down switching on single card systems (reported by Stefan
+  Huelswitt).
+- Fixed handling "pending" timers that blocked others that actually could record
+  (reported by Thomas Koch).
+- Speeded up cVideoRepacker (thanks to Reinhard Nissl).
+- Added an 'Id' parameter to cDevice::PlayAudio() to allow plugins to easier
+  process the audio data (thanks to Marco Schlüßler).
+- Added Czech language texts (thanks to Bárta Vladimír).
+  Plugin authors may want to add the new entries to their I18N texts and contact
+  the translators to have their texts translated. Note that there are now 21
+  different OSD languages, so please make sure you have 21 versions for each of
+  your texts.
+- Updated the Polish OSD texts (thanks to Jaroslaw Swierczynski).
+- Fixed auto advance in string entry fields when pressing Up/Down in insert mode
+  (reported by Udo Richter).
+- Fixed handling the "Setup/OSD/Menu button closes" option when set to 'yes' in
+  case a replay is active (thanks to Udo Richter).
+- Improved cUnbufferedFile; USE_FADVISE is now defined in tools.c by default, so
+  if you don't want to use "fadvise" you need to comment out that line (thanks to
+  Artur Skawina).
+- Fixed a missing ',' in the Swedish OSD texts (thanks to Arthur Konovalov).
+- cDevice::Transferring() can now be used to determine whether the (primary)
+  device is currently playing in Transfer Mode (based on a suggestion by
+  Reinhard Nissl).
+- The 'runvdr' script no longer uses the $VDRUSR environment variable to set
+  the user id under which 'vdr' shall run. Just add the '-u username' option
+  when you call 'runvdr'.
+- Fixed multiple entries of the same subdirectory in the "Recordings" menu
+  (reported by Christian Jacobsen).
+- Enabled generating a core dump if VDR is run with a different user id (thanks
+  to Ville Skyttä).
+- Fixed handling the "Blue" key in the "Schedule" menu for the current channel
+  (thanks to Rolf Ahrenberg).
+- Renamed the Makefile target 'plugins-clean' to 'clean-plugins' (suggested by
+  Sebastian Frei).
+- Made all font and image data 'const' (thanks to Darren Salt).
+- Fixed scrolling with Up/Down in case there are non-selectable items at the
+  beginning or end of the menu (reported by Helmut Auer).
+- Added cSkin::GetTextAreaWidth() and cSkin::GetTextAreaFont(), so that a plugin
+  that wants to do special text formatting can do so (thanks to Alexander Rieger).
diff -ruN vdr-1.3.41/INSTALL vdr-1.3.42/INSTALL
--- vdr-1.3.41/INSTALL	2006-01-14 12:27:45.000000000 +0100
+++ vdr-1.3.42/INSTALL	2006-02-04 16:22:39.000000000 +0100
@@ -136,7 +136,8 @@
 causes a program hangup. If you change the command line options for the
 call to the VDR program, be sure to NOT use the '-d' option! Otherwise
 VDR will go into 'deamon' mode and the initial program call will return
-immediately!
+immediately! 'runvdr' needs to be started as user 'root'. Use the '-u'
+option to run the actual 'vdr' program under a different user id.
 
 Setting the system time:
 ------------------------
diff -ruN vdr-1.3.41/Makefile vdr-1.3.42/Makefile
--- vdr-1.3.41/Makefile	2006-01-29 15:50:34.000000000 +0100
+++ vdr-1.3.42/Makefile	2006-02-05 14:37:11.000000000 +0100
@@ -4,7 +4,7 @@
 # See the main source file 'vdr.c' for copyright information and
 # how to reach the author.
 #
-# $Id: Makefile 1.84 2006/01/29 14:50:34 kls Exp $
+# $Id: Makefile 1.85 2006/02/05 13:37:11 kls Exp $
 
 .DELETE_ON_ERROR:
 
@@ -193,7 +193,7 @@
 	    done;\
 	if [ -n "$$failed" ] ; then echo; echo "*** failed plugins:$$failed"; echo; fi
 
-plugins-clean:
+clean-plugins:
 	@for i in `ls $(PLUGINDIR)/src | grep -v '[^a-z0-9]'`; do $(MAKE) -C "$(PLUGINDIR)/src/$$i" clean; done
 	@-rm -f $(PLUGINDIR)/lib/libvdr-*.so.$(VDRVERSION)
 
diff -ruN vdr-1.3.41/PLUGINS/src/hello/i18n.c vdr-1.3.42/PLUGINS/src/hello/i18n.c
--- vdr-1.3.41/PLUGINS/src/hello/i18n.c	2004-01-16 14:28:23.000000000 +0100
+++ vdr-1.3.42/PLUGINS/src/hello/i18n.c	2006-02-04 11:51:41.000000000 +0100
@@ -3,7 +3,7 @@
  *
  * See the README file for copyright information and how to reach the author.
  *
- * $Id: i18n.c 1.4 2004/01/16 13:28:23 kls Exp $
+ * $Id: i18n.c 1.5 2006/02/04 10:51:41 kls Exp $
  */
 
 #include "i18n.h"
@@ -26,6 +26,10 @@
     "",// TODO
     "",// TODO
     "¿àØÒÕâ!",
+    "",// TODO
+    "",// TODO
+    "",// TODO
+    "Ahoj",
   },
   { "Hello world!",
     "Hallo Welt!",
@@ -44,6 +48,10 @@
     "",// TODO
     "",// TODO
     "·ÔàÐÒáâÒãÙ ÜØà!",
+    "",// TODO
+    "",// TODO
+    "",// TODO
+    "Ahoj svìte!",
   },
   { "Howdy folks!",
     "Tach zusammen!",
@@ -62,6 +70,10 @@
     "",// TODO
     "",// TODO
     "ºÐÚ ßÞÖØÒÐÕâÕ?",
+    "",// TODO
+    "",// TODO
+    "",// TODO
+    "Nazdar vespolek!",
   },
   { "A friendly greeting",
     "Ein freundlicher Gruß",
@@ -80,6 +92,10 @@
     "",// TODO
     "",// TODO
     "´àãÖÕáÚÞÕ ßàØÒÕâáâÒØÕ",
+    "",// TODO
+    "",// TODO
+    "",// TODO
+    "Pøátelský pozdrav",
   },
   { "Greeting time (s)",
     "Dauer des Grußes (s)",
@@ -98,6 +114,10 @@
     "",// TODO
     "",// TODO
     "¿àÞÔÞÛÖØâÕÛìÝÞáâì ßàØÒÕâáâÒØï",
+    "",// TODO
+    "",// TODO
+    "",// TODO
+    "Èas pozdravu (s)",
   },
   { "Use alternate greeting",
     "Alternativen Gruß verwenden",
@@ -116,6 +136,10 @@
     "",// TODO
     "",// TODO
     "°ÛìâÕàÝÐâØÒÝÞÕ ßàØÒÕâáâÒØÕ",
+    "",// TODO
+    "",// TODO
+    "",// TODO
+    "Pou¾ít alternativní pozdrav",
   },
   { NULL }
   };
diff -ruN vdr-1.3.41/PLUGINS.html vdr-1.3.42/PLUGINS.html
--- vdr-1.3.41/PLUGINS.html	2006-01-08 12:48:08.000000000 +0100
+++ vdr-1.3.42/PLUGINS.html	2006-02-05 14:38:17.000000000 +0100
@@ -175,7 +175,7 @@
 <p>
 The VDR <tt>Makefile</tt> contains the target <tt>plugins</tt>, which calls
 <tt>make all</tt> in every directory found under <tt>VDR/PLUGINS/src</tt>,
-plus the target <tt>plugins-clean</tt>, which calls <tt>make clean</tt> in
+plus the target <tt>clean-plugins</tt>, which calls <tt>make clean</tt> in
 each of these directories.
 <p>
 If you download a plugin <a href="#Building the distribution package">package</a>
@@ -187,7 +187,7 @@
 <p>
 <tt>hello-0.0.1</tt>
 <p>
-To use the <tt>plugins</tt> and <tt>plugins-clean</tt> targets from the VDR <tt>Makefile</tt>
+To use the <tt>plugins</tt> and <tt>clean-plugins</tt> targets from the VDR <tt>Makefile</tt>
 you need to unpack such an archive into the <tt>VDR/PLUGINS/src</tt> directory and
 create a symbolic link with the basic plugin name, as in
 
diff -ruN vdr-1.3.41/channels.conf vdr-1.3.42/channels.conf
--- vdr-1.3.41/channels.conf	2006-01-29 16:26:35.000000000 +0100
+++ vdr-1.3.42/channels.conf	2006-02-05 16:12:54.000000000 +0100
@@ -1,3 +1,5 @@
+: first line
+: second line
 RTL Television,RTL;RTL World:12187:hC34:S19.2E:27500:163:104=deu:105:0:12003:1:1089:0
 SAT.1;ProSiebenSat.1:12480:vC34:S19.2E:27500:1791:1792=deu;1795=deu:34:0:46:133:33:0
 ProSieben;ProSiebenSat.1:12480:vC34:S19.2E:27500:255:256=deu;257=deu:32:0:898:133:33:0
@@ -13,10 +15,10 @@
 Phoenix;ARD:11836:hC34:S19.2E:27500:901:902=deu:904:0:28114:1:1101:0
 ZDF;ZDFvision:11953:hC34:S19.2E:27500:110:120=deu,121=2ch;125=dd:130:0:28006:1:1079:0
 3sat;ZDFvision:11953:hC34:S19.2E:27500:210:220=deu,221=2ch;225=dd:230:0:28007:1:1079:0
-KiKa;ZDFvision:11953:hC34:S19.2E:27500:310:320=deu:330:0:28008:1:1079:0
+KiKa;ZDFvision:11953:hC34:S19.2E:27500:310:320:0:0:28008:1:1079:0
 arte;ARD:11836:hC34:S19.2E:27500:401:402=deu,403=fra:404:0:28109:1:1101:0
-ORF1;ORF:12692:hC56:S19.2E:22000:160:161=deu;163=deu:165:1762,D05,1702,1801:13001:1:1117:0
-ORF2;ORF:12692:hC56:S19.2E:22000:500:501=deu;503=deu:505:1762,D05,1702,1801:13002:1:1117:0
+ORF1;ORF:12692:hC56:S19.2E:22000:160:161=deu;163=deu:165:0:13001:1:1117:0
+ORF2;ORF:12692:hC56:S19.2E:22000:500:501=deu,502=deu;503=deu:505:1762,D05,1702,1801:13002:1:1117:0
 ZDFinfokanal;ZDFvision:11953:hC34:S19.2E:27500:610:620=deu:130:0:28011:1:1079:0
 CNN Int.;CNN:11778:vC34:S19.2E:27500:165:100=eng:47:0:28522:1:1068:0
 Super RTL,S RTL;RTL World:12187:hC34:S19.2E:27500:165:120=deu:65:0:12040:1:1089:0
@@ -28,7 +30,7 @@
 HSE24,HSE24;BetaDigital:12480:vC34:S19.2E:27500:1279:1280=deu:37:0:40:133:33:0
 Bloomberg TV Germany;Bloomberg:12551:vC56:S19.2E:22000:162:99=deu:0:0:12160:1:1108:0
 EURONEWS;CSAT:11817:vC34:S19.2E:27500:163:92=fra,93=eng,94=ita,95=esl,91=rus,98=por,99=deu:0:0:8004:1:1070:0
-rbb Brandenburg;ARD:12109:hC34:S19.2E:27500:601:602=deu:604:0:28205:1:1073:0
+rbb Brandenburg;ARD:12109:hC34:S19.2E:27500:501:502=deu:504:0:28205:1:1073:0
 Sky News:11597:vC56:S19.2E:22000:305+131:306=eng:0:0:28707:1:1026:0
 Veronica/JETIX;CANALDIGITAAL:12574:hC56:S19.2E:22000:518+8190:92=dut:38:622,100:5020:53:1109:0
 BVN;CANALDIGITAAL:12574:hC56:S19.2E:22000:515+8190:96=dut:36:0:5025:53:1109:0
@@ -45,14 +47,14 @@
 rbb Berlin;ARD:12109:hC34:S19.2E:27500:601:602=deu:604:0:28206:1:1073:0
 :Premiere World
 PREMIERE START,START;PREMIERE:11797:hC34:S19.2E:27500:255:256=deu:32:1801,1722,1702:8:133:2:0
-PREMIERE 1,PREM 1;PREMIERE:11797:hC34:S19.2E:27500:511:512=deu,513=deu;515=deu:32:1:10:133:2:0
-PREMIERE 2,PREM 2;PREMIERE:11797:hC34:S19.2E:27500:1791:1792=deu,1793=deu;1795=deu:32:1:11:133:2:0
+PREMIERE 1,PREM 1;PREMIERE:11797:hC34:S19.2E:27500:511:512=deu,513=deu;515=deu:32:1801,1722,1702:10:133:2:0
+PREMIERE 2,PREM 2;PREMIERE:11797:hC34:S19.2E:27500:1791:1792=deu,1793=deu;1795=deu:32:1801,1722,1702:11:133:2:0
 PREMIERE 3,PREM 3;PREMIERE:11797:hC34:S19.2E:27500:2303:2304=deu,2305=deu:32:1722,1702,1801:43:133:2:0
-PREMIERE 4,PREM 4;PREMIERE:11797:hC34:S19.2E:27500:767:768=deu,769=deu:32:1:9:133:2:0
+PREMIERE 4,PREM 4;PREMIERE:11797:hC34:S19.2E:27500:767:768=deu,769=deu:32:1801,1722,1702:9:133:2:0
 PREMIERE 5,PREM 5;PREMIERE:11797:hC34:S19.2E:27500:1279:1280=deu:32:1722,1702,1801:29:133:2:0
 PREMIERE 6,PREM 6;PREMIERE:11797:hC34:S19.2E:27500:1535:1536=deu:32:1702,1722,1801:41:133:2:0
 PREMIERE 7,PREM 7;PREMIERE:11797:hC34:S19.2E:27500:1023:1024=deu:32:1801,1702,1722:20:133:2:0
-DISNEY CHANNEL,DISNEY;PREMIERE:11758:hC34:S19.2E:27500:2559:2560=deu:32:1:34:133:17:0
+DISNEY CHANNEL,DISNEY;PREMIERE:11758:hC34:S19.2E:27500:2559:2560=deu:32:1801,1722,1702:34:133:17:0
 :Premiere Direkt
 PREMIERE DIREKT,DIREKT;PREMIERE:12031:hC34:S19.2E:27500:2815:2816=deu,2817=deu;2819=deu:0:0:18:133:4:0
 :PW Erotic
@@ -113,14 +115,14 @@
 Paramount;BSkyB:11526:vC23:S28.2E:27500:2317+2306:2318=eng:2319:960,961:50305:2:2404:0
 ParaComedy 2;BSkyB:11914:hC23:S28.2E:27500:514+8190:642=eng,662=NAR:578:960,961:4504:2:2011:0
 Discovery;BSkyB:11875:hC23:S28.2E:27500:2308:2310=eng,2311=NAR:2309:960,961:6201:2:2009:0
-Sky Movies 1;BSkyB:11836:hC23:S28.2E:27500:518+8190:646=eng,653=NAR;686=eng:582:960,961:4303:2:2007:0
-Sky Movies 2;BSkyB:11836:hC23:S28.2E:27500:519+8190:647=eng,667=NAR;687=eng:583:960,961:4302:2:2007:0
-Sky Movies 3;BSkyB:11836:hC23:S28.2E:27500:520+8190:648=eng,654=NAR;688=eng:584:960,961:4403:2:2007:0
+Sky Movies 1;BSkyB:11836:hC23:S28.2E:27500:518+8190:646=eng,653=NAR;666=eng:582:960,961:4303:2:2007:0
+Sky Movies 2;BSkyB:11836:hC23:S28.2E:27500:519+8190:647=eng,655=NAR;667=eng:583:960,961:4302:2:2007:0
+Sky Movies 3;BSkyB:11836:hC23:S28.2E:27500:520+8190:648=eng,654=NAR;668=eng:584:960,961:4403:2:2007:0
 Sky Movies 4;BSkyB:11914:hC23:S28.2E:27500:512+8190:640=eng,660=NAR:576:960,961:4402:2:2011:0
 Sky Movies 5;BSkyB:11914:hC23:S28.2E:27500:515+8190:643=eng,663=NAR:579:960,961:4503:2:2011:0
 Sky Movies 6;BSkyB:11914:hC23:S28.2E:27500:513+8190:641=eng,661=NAR:577:960,961:4502:2:2011:0
 Sky Movies 7;BSkyB:12285:vC23:S28.2E:27500:515+8190:643=eng,663=NAR:579:960,961:4603:2:2030:0
-Sky Movies 8;BSkyB:11836:hC23:S28.2E:27500:515+8190:643=eng,663=NAR:579:960,961:5502:2:2007:0
+Sky Movies 8;BSkyB:11836:hC23:S28.2E:27500:515+8190:643=eng,656=NAR:579:960,961:5502:2:2007:0
 Sky Movies 9;BSkyB:12285:vC23:S28.2E:27500:518+8190:646=eng,666=NAR:582:960,961:4602:2:2030:0
 Sky Cinema 1;BSkyB:12285:vC23:S28.2E:27500:519+8190:647=eng,667=NAR:583:960,961:4809:2:2030:0
 Sky Cinema 2;BSkyB:12285:vC23:S28.2E:27500:517+8190:645=eng,665=NAR:581:960,961:4802:2:2030:0
diff -ruN vdr-1.3.41/config.h vdr-1.3.42/config.h
--- vdr-1.3.41/config.h	2006-01-27 14:27:41.000000000 +0100
+++ vdr-1.3.42/config.h	2006-01-29 18:24: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 1.242 2006/01/27 13:27:41 kls Exp $
+ * $Id: config.h 1.243 2006/01/29 17:24:53 kls Exp $
  */
 
 #ifndef __CONFIG_H
@@ -19,8 +19,8 @@
 #include "i18n.h"
 #include "tools.h"
 
-#define VDRVERSION  "1.3.41"
-#define VDRVERSNUM   10341  // Version * 10000 + Major * 100 + Minor
+#define VDRVERSION  "1.3.42"
+#define VDRVERSNUM   10342  // Version * 10000 + Major * 100 + Minor
 
 #define MAXPRIORITY 99
 #define MAXLIFETIME 99
diff -ruN vdr-1.3.41/cutter.c vdr-1.3.42/cutter.c
--- vdr-1.3.41/cutter.c	2006-01-27 14:45:00.000000000 +0100
+++ vdr-1.3.42/cutter.c	2006-02-05 12:06:47.000000000 +0100
@@ -4,7 +4,7 @@
  * See the main source file 'vdr.c' for copyright information and
  * how to reach the author.
  *
- * $Id: cutter.c 1.12 2006/01/27 13:45:00 kls Exp $
+ * $Id: cutter.c 1.14 2006/02/05 11:06:47 kls Exp $
  */
 
 #include "cutter.h"
@@ -66,6 +66,8 @@
      toFile = toFileName->Open();
      if (!fromFile || !toFile)
         return;
+     fromFile->SetReadAhead(MEGABYTE(20));
+     toFile->SetReadAhead(MEGABYTE(20));
      int Index = Mark->position;
      Mark = fromMarks.Next(Mark);
      int FileSize = 0;
@@ -90,6 +92,7 @@
            if (fromIndex->Get(Index++, &FileNumber, &FileOffset, &PictureType, &Length)) {
               if (FileNumber != CurrentFileNumber) {
                  fromFile = fromFileName->SetOffset(FileNumber, FileOffset);
+                 fromFile->SetReadAhead(MEGABYTE(20));
                  CurrentFileNumber = FileNumber;
                  }
               if (fromFile) {
diff -ruN vdr-1.3.41/device.c vdr-1.3.42/device.c
--- vdr-1.3.41/device.c	2006-01-08 12:39:37.000000000 +0100
+++ vdr-1.3.42/device.c	2006-02-04 15:58:24.000000000 +0100
@@ -4,7 +4,7 @@
  * See the main source file 'vdr.c' for copyright information and
  * how to reach the author.
  *
- * $Id: device.c 1.121 2006/01/08 11:39:37 kls Exp $
+ * $Id: device.c 1.123 2006/02/04 14:58:24 kls Exp $
  */
 
 #include "device.h"
@@ -924,12 +924,17 @@
   return player != NULL;
 }
 
+bool cDevice::Transferring(void) const
+{
+  return dynamic_cast<cTransfer *>(player) != NULL;
+}
+
 bool cDevice::AttachPlayer(cPlayer *Player)
 {
   if (CanReplay()) {
      if (player)
         Detach(player);
-     if (!dynamic_cast<cTransfer *>(Player))
+     if (!Transferring())
         ClrAvailableTracks();
      pesAssembler->Reset();
      player = Player;
@@ -977,7 +982,7 @@
   return -1;
 }
 
-int cDevice::PlayAudio(const uchar *Data, int Length)
+int cDevice::PlayAudio(const uchar *Data, int Length, uchar Id)
 {
   return -1;
 }
@@ -1000,7 +1005,7 @@
           case 0xC0 ... 0xDF: // audio
                SetAvailableTrack(ttAudio, c - 0xC0, c);
                if (!VideoOnly && c == availableTracks[currentAudioTrack].id) {
-                  w = PlayAudio(Start, d);
+                  w = PlayAudio(Start, d, c);
                   if (FirstLoop)
                      Audios.PlayAudio(Data, Length, c);
                   }
@@ -1026,7 +1031,7 @@
                       if (Setup.UseDolbyDigital) {
                          SetAvailableTrack(ttDolby, SubStreamIndex, SubStreamId);
                          if (!VideoOnly && SubStreamId == availableTracks[currentAudioTrack].id) {
-                            w = PlayAudio(Start, d);
+                            w = PlayAudio(Start, d, SubStreamId);
                             if (FirstLoop)
                                Audios.PlayAudio(Data, Length, SubStreamId);
                             }
@@ -1035,7 +1040,7 @@
                  case 0xA0: // LPCM
                       SetAvailableTrack(ttAudio, SubStreamIndex, SubStreamId);
                       if (!VideoOnly && SubStreamId == availableTracks[currentAudioTrack].id) {
-                         w = PlayAudio(Start, d);
+                         w = PlayAudio(Start, d, SubStreamId);
                          if (FirstLoop)
                             Audios.PlayAudio(Data, Length, SubStreamId);
                          }
diff -ruN vdr-1.3.41/device.h vdr-1.3.42/device.h
--- vdr-1.3.41/device.h	2006-01-08 11:10:26.000000000 +0100
+++ vdr-1.3.42/device.h	2006-02-04 15:22:08.000000000 +0100
@@ -4,7 +4,7 @@
  * See the main source file 'vdr.c' for copyright information and
  * how to reach the author.
  *
- * $Id: device.h 1.70 2006/01/08 10:10:26 kls Exp $
+ * $Id: device.h 1.72 2006/02/04 14:22:08 kls Exp $
  */
 
 #ifndef __DEVICE_H
@@ -424,9 +424,10 @@
        ///< Length) or not at all (returning 0 or -1 and setting 'errno' to EAGAIN).
        ///< \return Returns the number of bytes actually taken from Data, or -1
        ///< in case of an error.
-  virtual int PlayAudio(const uchar *Data, int Length);
+  virtual int PlayAudio(const uchar *Data, int Length, uchar Id);
        ///< Plays the given data block as audio.
        ///< Data points to exactly one complete PES packet of the given Length.
+       ///< Id indicates the type of audio data this packet holds.
        ///< PlayAudio() shall process the packet either as a whole (returning
        ///< Length) or not at all (returning 0 or -1 and setting 'errno' to EAGAIN).
        ///< \return Returns the number of bytes actually taken from Data, or -1
@@ -483,6 +484,8 @@
        ///< guaranteed to always receive complete PES packets.
   bool Replaying(void) const;
        ///< Returns true if we are currently replaying.
+  bool Transferring(void) const;
+       ///< Returns true if we are currently in Transfer Mode.
   void StopReplay(void);
        ///< Stops the current replay session (if any).
   bool AttachPlayer(cPlayer *Player);
diff -ruN vdr-1.3.41/dvbdevice.c vdr-1.3.42/dvbdevice.c
--- vdr-1.3.41/dvbdevice.c	2006-01-28 16:37:01.000000000 +0100
+++ vdr-1.3.42/dvbdevice.c	2006-02-04 11:21:51.000000000 +0100
@@ -4,7 +4,7 @@
  * See the main source file 'vdr.c' for copyright information and
  * how to reach the author.
  *
- * $Id: dvbdevice.c 1.151 2006/01/28 15:37:01 kls Exp $
+ * $Id: dvbdevice.c 1.152 2006/02/04 10:21:51 kls Exp $
  */
 
 #include "dvbdevice.h"
@@ -1169,7 +1169,7 @@
   return WriteAllOrNothing(fd_video, Data, Length, 1000, 10);
 }
 
-int cDvbDevice::PlayAudio(const uchar *Data, int Length)
+int cDvbDevice::PlayAudio(const uchar *Data, int Length, uchar Id)
 {
   return WriteAllOrNothing(fd_audio, Data, Length, 1000, 10);
 }
diff -ruN vdr-1.3.41/dvbdevice.h vdr-1.3.42/dvbdevice.h
--- vdr-1.3.41/dvbdevice.h	2005-12-29 14:33:12.000000000 +0100
+++ vdr-1.3.42/dvbdevice.h	2006-02-04 11:21:51.000000000 +0100
@@ -4,7 +4,7 @@
  * See the main source file 'vdr.c' for copyright information and
  * how to reach the author.
  *
- * $Id: dvbdevice.h 1.37 2005/12/29 13:33:12 kls Exp $
+ * $Id: dvbdevice.h 1.38 2006/02/04 10:21:51 kls Exp $
  */
 
 #ifndef __DVBDEVICE_H
@@ -119,7 +119,7 @@
   virtual bool CanReplay(void) const;
   virtual bool SetPlayMode(ePlayMode PlayMode);
   virtual int PlayVideo(const uchar *Data, int Length);
-  virtual int PlayAudio(const uchar *Data, int Length);
+  virtual int PlayAudio(const uchar *Data, int Length, uchar Id);
 public:
   virtual int64_t GetSTC(void);
   virtual void TrickSpeed(int Speed);
diff -ruN vdr-1.3.41/epg.c vdr-1.3.42/epg.c
--- vdr-1.3.41/epg.c	2006-01-29 15:17:33.000000000 +0100
+++ vdr-1.3.42/epg.c	2006-02-03 14:16:54.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 1.57 2006/01/29 14:17:33 kls Exp $
+ * $Id: epg.c 1.58 2006/02/03 13:16:54 kls Exp $
  */
 
 #include "epg.h"
@@ -321,7 +321,7 @@
                              }
                           }
                        break;
-             case 'e': if (!Event->Title())
+             case 'e': if (Event && !Event->Title())
                           Event->SetTitle(tr("No title"));
                        Event = NULL;
                        break;
diff -ruN vdr-1.3.41/font.c vdr-1.3.42/font.c
--- vdr-1.3.41/font.c	2005-01-14 14:25:35.000000000 +0100
+++ vdr-1.3.42/font.c	2006-02-05 14:49:10.000000000 +0100
@@ -4,7 +4,7 @@
  * See the main source file 'vdr.c' for copyright information and
  * how to reach the author.
  *
- * $Id: font.c 1.11 2005/01/14 13:25:35 kls Exp $
+ * $Id: font.c 1.12 2006/02/05 13:49:10 kls Exp $
  */
 
 #include "config.h"
@@ -35,9 +35,10 @@
 #include "fontfix-iso8859-15.c"
 #include "fontosd-iso8859-15.c"
 #include "fontsml-iso8859-15.c"
+
 // --- cFont -----------------------------------------------------------------
 
-static void *FontData[eDvbCodeSize][eDvbFontSize] = {
+static const void *const FontData[eDvbCodeSize][eDvbFontSize] = {
   { FontOsd_iso8859_1,  FontFix_iso8859_1,  FontSml_iso8859_1 },
   { FontOsd_iso8859_2,  FontFix_iso8859_2,  FontSml_iso8859_2 },
   { FontOsd_iso8859_5,  FontFix_iso8859_5,  FontSml_iso8859_5 },
@@ -58,12 +59,12 @@
 eDvbCode cFont::code = code_iso8859_1;
 cFont *cFont::fonts[eDvbFontSize] = { NULL };
 
-cFont::cFont(void *Data)
+cFont::cFont(const void *Data)
 {
   SetData(Data);
 }
 
-void cFont::SetData(void *Data)
+void cFont::SetData(const void *Data)
 {
   if (Data) {
      height = ((tCharData *)Data)->height;
@@ -112,7 +113,7 @@
      }
 }
 
-void cFont::SetFont(eDvbFont Font, void *Data)
+void cFont::SetFont(eDvbFont Font, const void *Data)
 {
   delete fonts[Font];
   fonts[Font] = new cFont(Data ? Data : FontData[code][Font]);
diff -ruN vdr-1.3.41/font.h vdr-1.3.42/font.h
--- vdr-1.3.41/font.h	2005-03-19 16:51:19.000000000 +0100
+++ vdr-1.3.42/font.h	2006-02-05 14:46:36.000000000 +0100
@@ -4,7 +4,7 @@
  * See the main source file 'vdr.c' for copyright information and
  * how to reach the author.
  *
- * $Id: font.h 1.11 2005/03/19 15:51:19 kls Exp $
+ * $Id: font.h 1.12 2006/02/05 13:46:36 kls Exp $
  */
 
 #ifndef __FONT_H
@@ -43,9 +43,9 @@
   const tCharData *data[NUMCHARS];
   int height;
 public:
-  cFont(void *Data);
+  cFont(const void *Data);
   virtual ~cFont() {}
-  void SetData(void *Data);
+  void SetData(const void *Data);
   virtual int Width(unsigned char c) const { return data[c]->width; }
       ///< Returns the width of the given character.
   virtual int Width(const char *s) const;
@@ -59,7 +59,7 @@
   const tCharData *CharData(unsigned char c) const { return data[c]; }
   static bool SetCode(const char *Code);
   static void SetCode(eDvbCode Code);
-  static void SetFont(eDvbFont Font, void *Data = NULL);
+  static void SetFont(eDvbFont Font, const void *Data = NULL);
   static const cFont *GetFont(eDvbFont Font);
   };
 
diff -ruN vdr-1.3.41/fontfix-iso8859-1.c vdr-1.3.42/fontfix-iso8859-1.c
--- vdr-1.3.41/fontfix-iso8859-1.c	2004-12-18 17:14:47.000000000 +0100
+++ vdr-1.3.42/fontfix-iso8859-1.c	2006-02-05 14:49:39.000000000 +0100
@@ -1,4 +1,4 @@
-cFont::tPixelData FontFix_iso8859_1[][28] = {
+static const cFont::tPixelData FontFix_iso8859_1[][28] = {
   {             // 32
      15, 26,
      0x00000000,  // ...............
diff -ruN vdr-1.3.41/fontfix-iso8859-13.c vdr-1.3.42/fontfix-iso8859-13.c
--- vdr-1.3.41/fontfix-iso8859-13.c	2005-01-14 14:25:35.000000000 +0100
+++ vdr-1.3.42/fontfix-iso8859-13.c	2006-02-05 14:49:42.000000000 +0100
@@ -1,4 +1,4 @@
-cFont::tPixelData FontFix_iso8859_13[][28] = {
+static const cFont::tPixelData FontFix_iso8859_13[][28] = {
   {             // 32
      15, 26,
      0x00000000,  // ...............
diff -ruN vdr-1.3.41/fontfix-iso8859-15.c vdr-1.3.42/fontfix-iso8859-15.c
--- vdr-1.3.41/fontfix-iso8859-15.c	2004-12-18 17:14:48.000000000 +0100
+++ vdr-1.3.42/fontfix-iso8859-15.c	2006-02-05 14:49:43.000000000 +0100
@@ -1,4 +1,4 @@
-cFont::tPixelData FontFix_iso8859_15[][28] = {
+static const cFont::tPixelData FontFix_iso8859_15[][28] = {
   {             // 32
      15, 26,
      0x00000000,  // ...............
diff -ruN vdr-1.3.41/fontfix-iso8859-2.c vdr-1.3.42/fontfix-iso8859-2.c
--- vdr-1.3.41/fontfix-iso8859-2.c	2004-12-18 17:14:48.000000000 +0100
+++ vdr-1.3.42/fontfix-iso8859-2.c	2006-02-05 14:49:43.000000000 +0100
@@ -1,4 +1,4 @@
-cFont::tPixelData FontFix_iso8859_2[][28] = {
+static const cFont::tPixelData FontFix_iso8859_2[][28] = {
   {             // 32
      15, 26,
      0x00000000,  // ...............
diff -ruN vdr-1.3.41/fontfix-iso8859-5.c vdr-1.3.42/fontfix-iso8859-5.c
--- vdr-1.3.41/fontfix-iso8859-5.c	2004-12-18 17:14:48.000000000 +0100
+++ vdr-1.3.42/fontfix-iso8859-5.c	2006-02-05 14:49:44.000000000 +0100
@@ -1,4 +1,4 @@
-cFont::tPixelData FontFix_iso8859_5[][26] = {
+static const cFont::tPixelData FontFix_iso8859_5[][26] = {
   {             // 32
      15, 24,
      0x00000000,  // ...............
diff -ruN vdr-1.3.41/fontfix-iso8859-7.c vdr-1.3.42/fontfix-iso8859-7.c
--- vdr-1.3.41/fontfix-iso8859-7.c	2004-12-18 17:14:49.000000000 +0100
+++ vdr-1.3.42/fontfix-iso8859-7.c	2006-02-05 14:49:45.000000000 +0100
@@ -1,4 +1,4 @@
-cFont::tPixelData FontFix_iso8859_7[][26] = {
+static const cFont::tPixelData FontFix_iso8859_7[][26] = {
   {             // 32
      11, 24,
      0x00000000,  // ...........
diff -ruN vdr-1.3.41/fontosd-iso8859-1.c vdr-1.3.42/fontosd-iso8859-1.c
--- vdr-1.3.41/fontosd-iso8859-1.c	2004-12-18 17:14:49.000000000 +0100
+++ vdr-1.3.42/fontosd-iso8859-1.c	2006-02-05 14:49:46.000000000 +0100
@@ -1,4 +1,4 @@
-cFont::tPixelData FontOsd_iso8859_1[][29] = {
+static const cFont::tPixelData FontOsd_iso8859_1[][29] = {
   {             // 32
      6, 27,
      0x00000000,  // ......
diff -ruN vdr-1.3.41/fontosd-iso8859-13.c vdr-1.3.42/fontosd-iso8859-13.c
--- vdr-1.3.41/fontosd-iso8859-13.c	2005-01-14 14:25:35.000000000 +0100
+++ vdr-1.3.42/fontosd-iso8859-13.c	2006-02-05 14:49:47.000000000 +0100
@@ -1,4 +1,4 @@
-cFont::tPixelData FontOsd_iso8859_13[][29] = {
+static const cFont::tPixelData FontOsd_iso8859_13[][29] = {
   {             // 32
      6, 27,
      0x00000000,  // ......
diff -ruN vdr-1.3.41/fontosd-iso8859-15.c vdr-1.3.42/fontosd-iso8859-15.c
--- vdr-1.3.41/fontosd-iso8859-15.c	2004-12-18 17:14:49.000000000 +0100
+++ vdr-1.3.42/fontosd-iso8859-15.c	2006-02-05 14:49:48.000000000 +0100
@@ -1,4 +1,4 @@
-cFont::tPixelData FontOsd_iso8859_15[][29] = {
+static const cFont::tPixelData FontOsd_iso8859_15[][29] = {
   {             // 32
      6, 27,
      0x00000000,  // ......
diff -ruN vdr-1.3.41/fontosd-iso8859-2.c vdr-1.3.42/fontosd-iso8859-2.c
--- vdr-1.3.41/fontosd-iso8859-2.c	2006-01-21 13:31:29.000000000 +0100
+++ vdr-1.3.42/fontosd-iso8859-2.c	2006-02-05 14:50:05.000000000 +0100
@@ -1,4 +1,3 @@
-
 /*
  * iso8859-2 modified iso8859-1 (Drazen Dupor 23.05.2004).
  *
@@ -10,7 +9,7 @@
  *
  */
 
-cFont::tPixelData FontOsd_iso8859_2[][29] = {
+static const cFont::tPixelData FontOsd_iso8859_2[][29] = {
   {             // 32
      6, 27,
      0x00000000,  // ......
diff -ruN vdr-1.3.41/fontosd-iso8859-5.c vdr-1.3.42/fontosd-iso8859-5.c
--- vdr-1.3.41/fontosd-iso8859-5.c	2004-12-18 17:14:50.000000000 +0100
+++ vdr-1.3.42/fontosd-iso8859-5.c	2006-02-05 14:50:09.000000000 +0100
@@ -1,4 +1,4 @@
-cFont::tPixelData FontOsd_iso8859_5[][24] = {
+static const cFont::tPixelData FontOsd_iso8859_5[][24] = {
   {             // 32
      6, 22,
      0x00000000,  // ......
diff -ruN vdr-1.3.41/fontosd-iso8859-7.c vdr-1.3.42/fontosd-iso8859-7.c
--- vdr-1.3.41/fontosd-iso8859-7.c	2004-12-18 17:14:50.000000000 +0100
+++ vdr-1.3.42/fontosd-iso8859-7.c	2006-02-05 14:50:10.000000000 +0100
@@ -1,4 +1,4 @@
-cFont::tPixelData FontOsd_iso8859_7[][27] = {
+static const cFont::tPixelData FontOsd_iso8859_7[][27] = {
   {             // 32
      12, 25,
      0x00000000,  // ............
diff -ruN vdr-1.3.41/fontsml-iso8859-1.c vdr-1.3.42/fontsml-iso8859-1.c
--- vdr-1.3.41/fontsml-iso8859-1.c	2004-12-18 17:14:50.000000000 +0100
+++ vdr-1.3.42/fontsml-iso8859-1.c	2006-02-05 14:50:11.000000000 +0100
@@ -1,4 +1,4 @@
-cFont::tPixelData FontSml_iso8859_1[][24] = {
+static const cFont::tPixelData FontSml_iso8859_1[][24] = {
   {             // 32
      5, 22,
      0x00000000,  // .....
diff -ruN vdr-1.3.41/fontsml-iso8859-13.c vdr-1.3.42/fontsml-iso8859-13.c
--- vdr-1.3.41/fontsml-iso8859-13.c	2005-01-14 14:25:35.000000000 +0100
+++ vdr-1.3.42/fontsml-iso8859-13.c	2006-02-05 14:50:12.000000000 +0100
@@ -1,4 +1,4 @@
-cFont::tPixelData FontSml_iso8859_13[][24] = {
+static const cFont::tPixelData FontSml_iso8859_13[][24] = {
   {             // 32
      5, 22,
      0x00000000,  // .....
diff -ruN vdr-1.3.41/fontsml-iso8859-15.c vdr-1.3.42/fontsml-iso8859-15.c
--- vdr-1.3.41/fontsml-iso8859-15.c	2004-12-18 17:14:51.000000000 +0100
+++ vdr-1.3.42/fontsml-iso8859-15.c	2006-02-05 14:50:13.000000000 +0100
@@ -1,4 +1,4 @@
-cFont::tPixelData FontSml_iso8859_15[][24] = {
+static const cFont::tPixelData FontSml_iso8859_15[][24] = {
   {             // 32
      5, 22,
      0x00000000,  // .....
diff -ruN vdr-1.3.41/fontsml-iso8859-2.c vdr-1.3.42/fontsml-iso8859-2.c
--- vdr-1.3.41/fontsml-iso8859-2.c	2004-12-18 17:14:51.000000000 +0100
+++ vdr-1.3.42/fontsml-iso8859-2.c	2006-02-05 14:50:14.000000000 +0100
@@ -1,4 +1,4 @@
-cFont::tPixelData FontSml_iso8859_2[][25] = {
+static const cFont::tPixelData FontSml_iso8859_2[][25] = {
   {             // 32
      5, 23,
      0x00000000,  // .....
diff -ruN vdr-1.3.41/fontsml-iso8859-5.c vdr-1.3.42/fontsml-iso8859-5.c
--- vdr-1.3.41/fontsml-iso8859-5.c	2004-12-18 17:14:51.000000000 +0100
+++ vdr-1.3.42/fontsml-iso8859-5.c	2006-02-05 14:50:15.000000000 +0100
@@ -1,4 +1,4 @@
-cFont::tPixelData FontSml_iso8859_5[][27] = {
+static const cFont::tPixelData FontSml_iso8859_5[][27] = {
   {             // 32
      5, 25,
      0x00000000,  // .....
diff -ruN vdr-1.3.41/fontsml-iso8859-7.c vdr-1.3.42/fontsml-iso8859-7.c
--- vdr-1.3.41/fontsml-iso8859-7.c	2004-12-18 17:14:52.000000000 +0100
+++ vdr-1.3.42/fontsml-iso8859-7.c	2006-02-05 14:50:16.000000000 +0100
@@ -1,4 +1,4 @@
-cFont::tPixelData FontSml_iso8859_7[][22] = {
+static const cFont::tPixelData FontSml_iso8859_7[][22] = {
   {             // 32
      9, 20,
      0x00000000,  // .........
diff -ruN vdr-1.3.41/genfontfile.c vdr-1.3.42/genfontfile.c
--- vdr-1.3.41/genfontfile.c	2006-01-08 12:39:51.000000000 +0100
+++ vdr-1.3.42/genfontfile.c	2006-02-05 14:54:02.000000000 +0100
@@ -371,7 +371,7 @@
     exit(1);
   }
 
-  printf("%s[][%d] = {\n", varname, fontinfo->max_ascent + fontinfo->max_descent + 2);
+  printf("static const %s[][%d] = {\n", varname, fontinfo->max_ascent + fontinfo->max_descent + 2);
   for (c = 32; c < 256; c++) {
       getMetric(fontinfo, c, &tgi);
       printGlyph(fontinfo, c);
diff -ruN vdr-1.3.41/i18n.c vdr-1.3.42/i18n.c
--- vdr-1.3.41/i18n.c	2006-01-28 11:38:33.000000000 +0100
+++ vdr-1.3.42/i18n.c	2006-02-04 15:17:54.000000000 +0100
@@ -4,7 +4,7 @@
  * See the main source file 'vdr.c' for copyright information and
  * how to reach the author.
  *
- * $Id: i18n.c 1.244 2006/01/28 10:38:33 kls Exp $
+ * $Id: i18n.c 1.247 2006/02/04 14:17:54 kls Exp $
  *
  * Translations provided by:
  *
@@ -26,6 +26,7 @@
  * Croatian    Drazen Dupor <drazen.dupor@dupor.com>, Dino Ravnic <dino.ravnic@fer.hr>
  * Estonian    Arthur Konovalov <kasjas@hot.ee>
  * Danish      Mogens Elneff <mogens@elneff.dk>
+ * Czech       Vladimír Bárta <vladimir.barta@k2atmitec.cz>
  *
  */
 
@@ -101,6 +102,7 @@
     "Hrvatski",
     "Eesti",
     "Dansk",
+    "Èesky", //Czech
   },
   // The character set needed for this language (this MUST be the second phrase!):
   { "iso8859-15",
@@ -123,6 +125,7 @@
     "iso8859-2",
     "iso8859-13",
     "iso8859-1",
+    "iso8859-2",
   },
   // The 3-letter names of the language (this MUST be the third phrase!):
   { "eng,dos",
@@ -145,6 +148,7 @@
     "hrv",
     "est",
     "dan",
+    "cze,ces",
   },
   // Menu titles:
   { "VDR",
@@ -167,6 +171,7 @@
     "VDR",
     "VDR",
     "VDR",
+    "VDR",
   },
   { "Schedule",
     "Programm",
@@ -188,6 +193,7 @@
     "Raspored",
     "Kava",
     "Programoversigt",
+    "Program (EPG)",
   },
   { "Channels",
     "Kanäle",
@@ -209,6 +215,7 @@
     "Programi",
     "Kanalid",
     "Kanaler",
+    "Kanály",
   },
   { "Timers",
     "Timer",
@@ -230,6 +237,7 @@
     "Termini",
     "Taimer",
     "Timere",
+    "Èasovaèe",
   },
   { "Recordings",
     "Aufzeichnungen",
@@ -251,6 +259,7 @@
     "Snimke",
     "Salvestused",
     "Optagelser",
+    "Nahrávky",
   },
   { "Recording info",
     "Aufzeichnung",
@@ -272,6 +281,7 @@
     "",// TODO
     "Salvestuse info",
     "Optagelses info",
+    "Detail nahrávky",
   },
   { "Setup",
     "Einstellungen",
@@ -293,6 +303,7 @@
     "Konfiguracija",
     "Sätted",
     "Indstillinger",
+    "Nastavení",
   },
   { "Commands",
     "Befehle",
@@ -314,6 +325,7 @@
     "Naredbe",
     "Käsud",
     "Kommandoer",
+    "Pøíkazy",
   },
   { "Recording commands",
     "Befehle für Aufzeichnungen",
@@ -335,6 +347,7 @@
     "Naredbe za snimanje",
     "Salvestuse käsud",
     "Optage kommandoer",
+    "Pøíkazy nahrávání",
   },
   { "Edit channel",
     "Kanal editieren",
@@ -356,6 +369,7 @@
     "Ureðivanje programa",
     "Kanali muutmine",
     "Rediger kanal",
+    "Editace kanálu",
   },
   { "Edit timer",
     "Timer editieren",
@@ -377,6 +391,7 @@
     "Ureðivanje termina",
     "Taimeri muutmine",
     "Rediger timer",
+    "Editace èasovaèe",
   },
   { "Event",
     "Sendung",
@@ -398,6 +413,7 @@
     "Emisija",
     "Sündmus",
     "Udsendelse",
+    "Událost",
   },
   { "Info",
     "Info",
@@ -419,6 +435,7 @@
     "Info",
     "Info",
     "Info",
+    "Info",
   },
   { "Schedule - %s",
     "Programm - %s",
@@ -440,6 +457,7 @@
     "Raspored - %s",
     "Ajakava - %s",
     "Program - %s",
+    "Program - %s",
   },
   { "This event - %s",
     "Diese Sendung - %s",
@@ -461,6 +479,7 @@
     "",//TODO
     "See sündmus - %s",
     "Denne udsendelse - %s",
+    "Tato událost - %s",
   },
   { "This event - all channels",
     "Diese Sendung - alle Kanäle",
@@ -482,6 +501,7 @@
     "",//TODO
     "See sündmus - kõik kanalid",
     "Denne udsendelse - alle kanaler",
+    "Tato událost - v¹echny kanály",
   },
   { "All events - all channels",
     "Alle Sendungen - alle Kanäle",
@@ -503,6 +523,7 @@
     "",//TODO
     "Kõik sündmused - kõik kanalid",
     "Alle udsendelser - alle kanaler",
+    "V¹echny událost - v¹echny kanály",
   },
   { "What's on now?",
     "Was läuft jetzt?",
@@ -524,6 +545,7 @@
     "©to je trenutno na programu?",
     "Hetkel eetris",
     "Hvad vises nu?",
+    "Aktuální program",
   },
   { "What's on next?",
     "Was läuft als nächstes?",
@@ -545,6 +567,7 @@
     "©to slijedi?",
     "Järgmisena eetris",
     "Hvad vises som det næste?",
+    "Následující program",
   },
   { "Summary",
     "Inhalt",
@@ -566,6 +589,7 @@
     "Sadr¾aj",
     "Ülevaade",
     "Omtale",
+    "Obsah",
   },
   // Button texts (should not be more than 10 characters!):
   { "Button$Edit",
@@ -588,6 +612,7 @@
     "Promijeni",
     "Muuda",
     "Rediger",
+    "Editace",
   },
   { "Button$New",
     "Neu",
@@ -609,6 +634,7 @@
     "Novi",
     "Uus",
     "Ny",
+    "Nový",
   },
   { "Button$Delete",
     "Löschen",
@@ -630,6 +656,7 @@
     "Obri¹i",
     "Kustuta",
     "Slet",
+    "Smazat",
   },
   { "Button$Mark",
     "Markieren",
@@ -651,6 +678,7 @@
     "Oznaèi",
     "Siirda",
     "Markér",
+    "Oznaèit",
   },
   { "Button$On/Off",
     "Ein/Aus",
@@ -672,6 +700,7 @@
     "De-/Aktiviraj",
     "On/Off",
     "Til/Fra",
+    "Zap./Vyp.",
   },
   { "Timer",
     "Timer",
@@ -682,7 +711,7 @@
     "",// TODO
     "",// TODO
     "Ajastin",
-    "Timer",// TODO
+    "Timer",
     "Programa",
     "",// TODO
     "",// TODO
@@ -693,6 +722,7 @@
     "",// TODO
     "Taimer",
     "Timer",
+    "Èasovaè",
   },
   { "Button$Record",
     "Aufnehmen",
@@ -714,6 +744,7 @@
     "Snimi",
     "Salvesta",
     "Optag",
+    "Nahrát",
   },
   { "Button$Play",
     "Wiedergabe",
@@ -735,6 +766,7 @@
     "Start",
     "Start",
     "Afspil",
+    "Pøehrát",
   },
   { "Button$Pause",
     "Pause",
@@ -756,6 +788,7 @@
     "Pauza",
     "Paus",
     "Pause",
+    "Zastavit",
   },
   { "Button$Rewind",
     "Anfang",
@@ -777,6 +810,7 @@
     "Na poèetak",
     "Algusesse",
     "Forfra",
+    "Na zaèátek",
   },
   { "Button$Stop",
     "Beenden",
@@ -798,6 +832,7 @@
     "Stop",
     "Stopp",
     "Stop",
+    "Ukonèit",
   },
   { "Button$Resume",
     "Weiter",
@@ -819,6 +854,7 @@
     "Nastavi",
     "Jätka",
     "Fortsæt",
+    "Pokraèovat",
   },
   { "Button$Open",
     "Öffnen",
@@ -840,6 +876,7 @@
     "Otvori",
     "Ava",
     "Åbn",
+    "Otevøít",
   },
   { "Button$Switch",
     "Umschalten",
@@ -861,6 +898,7 @@
     "Prebaci",
     "Vali",
     "Skift",
+    "Pøepnout",
   },
   { "Button$Now",
     "Jetzt",
@@ -882,6 +920,7 @@
     "Trenutno",
     "Nüüd",
     "Nu",
+    "Nyní",
   },
   { "Button$Next",
     "Nächste",
@@ -903,6 +942,7 @@
     "Slijedi",
     "Tulekul",
     "Næste",
+    "Dal¹í",
   },
   { "Button$Schedule",
     "Programm",
@@ -924,6 +964,7 @@
     "Raspored",
     "Ajakava",
     "Program",
+    "Program",
   },
   { "Button$ABC/abc",
     "ABC/abc",
@@ -945,6 +986,7 @@
     "ABC/abc",
     "ABC/abc",
     "ABC/abc",
+    "ABC/abc",
   },
   { "Button$Insert",
     "Einfügen",
@@ -966,6 +1008,7 @@
     "Umetni",
     "Lisa (INS)",
     "Indsæt",
+    "Vlo¾it",
   },
   { "Button$Overwrite",
     "Überschreiben",
@@ -987,6 +1030,7 @@
     "Prepi¹i",
     "Asenda (OVR)",
     "Overskriv",
+    "Pøepsat",
   },
   { "Button$Menu",
     "Menü",
@@ -1008,6 +1052,7 @@
     "Izbor",
     "Menüü",
     "Menu",
+    "Menu",
   },
   { "Button$Reset",
     "Reset",
@@ -1029,6 +1074,7 @@
     "Reset",
     "Nullimine",
     "Nulstille",
+    "Reset",
   },
   { "Button$Scan",
     "Scan",
@@ -1050,6 +1096,7 @@
     "Pretra¾i",
     "Uuenda",
     "Skan",
+    "Snímat",
   },
   { "Button$Audio",
     "Audio",
@@ -1071,6 +1118,7 @@
     "",// TODO
     "Audio",
     "Audio",
+    "Zvuk",
   },
   // Confirmations:
   { "Delete channel?",
@@ -1093,6 +1141,7 @@
     "Obrisati program?",
     "Kustutan kanali?",
     "Slet kanal?",
+    "Smazat kanál?",
   },
   { "Delete timer?",
     "Timer löschen?",
@@ -1114,6 +1163,7 @@
     "Obrisati termin?",
     "Kustutan taimeri?",
     "Slet timer?",
+    "Smazat èasovaè?",
   },
   { "Delete recording?",
     "Aufzeichnung löschen?",
@@ -1135,6 +1185,7 @@
     "Obrisati snimku?",
     "Kustutan salvestuse?",
     "Slet optagelse?",
+    "Smazat nahrávku?",
   },
   { "Timer still recording - really delete?",
     "Timer zeichnet auf - trotzdem löschen?",
@@ -1156,6 +1207,7 @@
     "Jo¹ snimam - zaista obrisati?",
     "Salvestus aktiivne - kustutan?",
     "Timerstyret optagelse i gang - slet alligevel?",
+    "Probíhá nahrávání - opravdu smazat?",
   },
   { "Stop recording?",
     "Aufzeichnung beenden?",
@@ -1177,6 +1229,7 @@
     "Zaustaviti snimanje?",
     "Lõpetan salvestamise?",
     "Stop optagelse?",
+    "Ukonèit nahrávání?",
   },
   { "Cancel editing?",
     "Schneiden abbrechen?",
@@ -1198,6 +1251,7 @@
     "Otkazati ureðivanje?",
     "Tühistan muudatuse?",
     "Afbryd redigering?",
+    "Zru¹it editaci?",
   },
   { "Really restart?",
     "Wirklich neu starten?",
@@ -1219,6 +1273,7 @@
     "Zaista ponovo pokrenuti?",
     "Restart?",
     "Vil du virkelig genstarte?",
+    "Opravdu restartovat?",
   },
   { "Recording - restart anyway?",
     "Aufnahme läuft - trotzdem neu starten?",
@@ -1240,6 +1295,7 @@
     "Snimanje traje - svejedno restart sistema?",
     "Salvestamine aktiivne - restart?",
     "Optagelse igang - genstart alligevel?",
+    "Systém je zaneprázdnìn - pøesto restartovat?",
   },
   { "Recording - shut down anyway?",
     "Aufnahme läuft - trotzdem ausschalten?",
@@ -1261,6 +1317,7 @@
     "Snimanje traje - svejedno iskljuèiti?",
     "Salvestamine aktiivne - lülitan välja?",
     "Optagelse igang - sluk alligevel?",
+    "Systém je zaneprázdnìn - pøesto vypnout?",
   },
   { "Recording in %d minutes, shut down anyway?",
     "Aufnahme in %d Minuten - trotzdem ausschalten?",
@@ -1282,6 +1339,7 @@
     "Snimanje za %d minuta - svejedno iskljuèiti?",
     "Salvestamine algab %d minuti pärast - lülitan välja?",
     "Optagelse om %d minutter - sluk alligevel?",
+    "Nahrávání zaène za %d minut - pøesto vypnout?",
   },
   { "Press any key to cancel shutdown",
     "Taste drücken, um Shutdown abzubrechen",
@@ -1303,6 +1361,7 @@
     "Pritisnite tipku ako ne ¾elite ugasiti sistem",
     "Vajuta suvalist klahvi väljalülitamise tühistamiseks",
     "Tryk vilkårlig tast for at annullere sluk",
+    "Jakákoliv klávesa zru¹í vypnutí",
   },
   // Channel parameters:
   { "Name",
@@ -1325,6 +1384,7 @@
     "Naziv",
     "Nimi",
     "Navn",
+    "Název",
   },
   { "Frequency",
     "Frequenz",
@@ -1346,6 +1406,7 @@
     "Frekvencija",
     "Sagedus",
     "Frekvens",
+    "Frekvence",
   },
   { "Polarization",
     "Polarisation",
@@ -1367,6 +1428,7 @@
     "Polarizacija",
     "Polarisatsioon",
     "Polarisation",
+    "Polarizace",
   },
   { "Source",
     "Quelle",
@@ -1388,6 +1450,7 @@
     "Izvor",
     "Allikas",
     "Kilde",
+    "Zdroj",
   },
   { "Srate",
     "Srate",
@@ -1409,6 +1472,7 @@
     "Srate", // hrv
     "Srate",
     "Srate",
+    "Srate",
   },
   { "Vpid",
     "Vpid",
@@ -1430,6 +1494,7 @@
     "Vpid",
     "Vpid",
     "Vpid",
+    "Vpid",
   },
   { "Ppid",
     "Ppid",
@@ -1451,6 +1516,7 @@
     "Ppid",
     "Ppid",
     "Ppid",
+    "Ppid",
   },
   { "Apid1",
     "Apid1",
@@ -1472,6 +1538,7 @@
     "Apid1", // hrv
     "Apid1",
     "Apid1",
+    "Apid1",
   },
   { "Apid2",
     "Apid2",
@@ -1493,6 +1560,7 @@
     "Apid2", // hrv
     "Apid2",
     "Apid2",
+    "Apid2",
   },
   { "Dpid1",
     "Dpid1",
@@ -1514,6 +1582,7 @@
     "Dpid1", // hrv
     "Dpid1",
     "Dpid1",
+    "Dpid1",
   },
   { "Dpid2",
     "Dpid2",
@@ -1535,6 +1604,7 @@
     "Dpid2", // hrv
     "Dpid2",
     "Dpid2",
+    "Dpid2",
   },
   { "Tpid",
     "Tpid",
@@ -1556,6 +1626,7 @@
     "Tpid", // hrv
     "Tpid",
     "Tpid",
+    "Tpid",
   },
   { "CA",
     "CA",
@@ -1577,6 +1648,7 @@
     "Kodiranje (CA)",
     "CA",
     "CA",
+    "CA",
   },
   { "Free To Air",
     "frei empfangbar",
@@ -1590,7 +1662,7 @@
     "",//TODO
     "en abierto",
     "",//TODO
-    "Otwarta transmisja",
+    "otwarty przekaz",
     "",//TODO
     "",//TODO
     "",//TODO
@@ -1598,6 +1670,7 @@
     "",//TODO
     "FTA",
     "Free To Air",
+    "volný",
   },
   { "encrypted",
     "verschlüsselt",
@@ -1619,6 +1692,7 @@
     "",//TODO
     "krüptitud",
     "kodet",
+    "kódovaný",
   },
   { "Sid",
     "Sid",
@@ -1640,6 +1714,7 @@
     "Sid", // hrv
     "Sid",
     "Sid",
+    "Sid",
   },
   { "Inversion",
     "Inversion",
@@ -1661,6 +1736,7 @@
     "Inverzija",
     "Inversioon",
     "Inversion",
+    "Inversion",
   },
   { "Bandwidth",
     "Bandwidth",
@@ -1682,6 +1758,7 @@
     "Bandwidth", // hrv "Pojasna ¹irina",
     "Ribalaius",
     "Båndbredde",
+    "©íøka pásma",
   },
   { "CoderateH",
     "CoderateH",
@@ -1703,6 +1780,7 @@
     "CoderateH", // hrv
     "CoderateH",
     "CoderateH",
+    "CoderateH",
   },
   { "CoderateL",
     "CoderateL",
@@ -1724,6 +1802,7 @@
     "CoderateL", // hrv
     "CoderateL",
     "CoderateL",
+    "CoderateL",
   },
   { "Modulation",
     "Modulation",
@@ -1745,6 +1824,7 @@
     "Modulacija",
     "Modulatsioon",
     "Modulation",
+    "Modulace",
   },
   { "Transmission",
     "Transmission",
@@ -1766,6 +1846,7 @@
     "Prijenos",
     "Transmissioon",
     "Transmission",
+    "Pøenos",
   },
   { "Guard",
     "Guard",
@@ -1787,6 +1868,7 @@
     "Za¹tita",
     "Guard",
     "Guard",
+    "Guard",
   },
   { "Hierarchy",
     "Hierarchy",
@@ -1808,6 +1890,7 @@
     "Hijerarhija",
     "Hierarhia",
     "Hierarki",
+    "Hierarchy",
   },
   // Timer parameters:
   { "Active",
@@ -1830,6 +1913,7 @@
     "Aktivan",
     "Aktiivne",
     "Aktiv",
+    "Aktivní",
   },
   { "Channel",
     "Kanal",
@@ -1851,6 +1935,7 @@
     "Program",
     "Kanal",
     "Kanal",
+    "Kanál",
   },
   { "Day",
     "Tag",
@@ -1872,6 +1957,7 @@
     "Dan",
     "Päev",
     "Dag",
+    "Den",
   },
   { "Start",
     "Anfang",
@@ -1893,6 +1979,7 @@
     "Poèetak",
     "Start",
     "Start",
+    "Zaèátek",
   },
   { "Stop",
     "Ende",
@@ -1914,6 +2001,7 @@
     "Kraj",
     "Stopp",
     "Stop",
+    "Konec",
   },
   { "VPS",
     "VPS",
@@ -1935,6 +2023,7 @@
     "VPS", // hrv
     "VPS",
     "VPS",
+    "VPS",
   },
   { "Priority",
     "Priorität",
@@ -1956,6 +2045,7 @@
     "Prioritet",
     "Prioriteet",
     "Prioritet",
+    "Priorita",
   },
   { "Lifetime",
     "Lebensdauer",
@@ -1977,6 +2067,7 @@
     "Trajanje",
     "Eluiga",
     "Levetid",
+    "®ivotnost",
   },
   { "File",
     "Datei",
@@ -1998,6 +2089,7 @@
     "Datoteka",
     "Fail",
     "Fil",
+    "Soubor",
   },
   { "First day",
     "Erster Tag",
@@ -2019,6 +2111,7 @@
     "Prvi dan",
     "Esimene päev",
     "Første dag",
+    "První den",
   },
   // Error messages:
   { "Channel is being used by a timer!",
@@ -2041,6 +2134,7 @@
     "Program je trenutno zauzet terminom za snimanje",
     "Kanal on taimeri kasutuses!",
     "Kanal anvendes af en timer!",
+    "Kanál je dr¾ený èasovaèem nahrávek!",
   },
   { "Can't switch channel!",
     "Kanal kann nicht umgeschaltet werden!",
@@ -2062,6 +2156,7 @@
     "Ne mogu prebaciti program!",
     "Kanali vahetus ei ole võimalik!",
     "Kan ikke skifte kanal!",
+    "Kanál nelze pøepnout!",
   },
   { "Timer is recording!",
     "Timer zeichnet gerade auf!",
@@ -2083,6 +2178,7 @@
     "Snimanje po definiranom terminu!",
     "Taimeriga salvestamine aktiivne!",
     "Timer optager nu!",
+    "Èasovaè právì nahrává!",
   },
   { "Error while accessing recording!",
     "Fehler beim Ansprechen der Aufzeichnung!",
@@ -2104,6 +2200,7 @@
     "Gre¹ka pri pristupanju snimke!",
     "Salvestuse taasesitus ebaõnnestus!",
     "Fejl ved læsning af optagelse!",
+    "Chyba pøi pøístupu k nahrávkám!",
   },
   { "Error while deleting recording!",
     "Fehler beim Löschen der Aufzeichnung!",
@@ -2125,6 +2222,7 @@
     "Gre¹ka pri brisanju snimke!",
     "Salvestuse kustutamine ebaõnnestus!",
     "Fejl ved sletning af optagelse!",
+    "Chyba pøi mazání nahrávky!",
   },
   { "*** Invalid Channel ***",
     "*** Ungültiger Kanal ***",
@@ -2146,6 +2244,7 @@
     "*** Neispravan program ***",
     "*** Vigane kanal ***",
     "*** Ugyldig kanal! ***",
+    "*** Neplatný kanál ***",
   },
   { "No free DVB device to record!",
     "Keine freie DVB-Karte zum Aufnehmen!",
@@ -2167,6 +2266,7 @@
     "Nema slobodnog DVB ureðaja za snimanje!",
     "Puudub vaba DVB seade salvestamiseks!",
     "Ingen fri DVB enhed til optagelse!",
+    "®ádná DVB karta není volná pro nahrávání",
   },
   { "Channel not available!",
     "Kanal nicht verfügbar!",
@@ -2188,6 +2288,7 @@
     "Program nije dostupan!",
     "Kanal ei ole kättesaadav!",
     "Kanal er ikke tilgængelig!",
+    "Kanál není dostupný!",
   },
   { "Channel settings are not unique!",
     "Kanaleinstellungen sind nicht eindeutig!",
@@ -2209,6 +2310,7 @@
     "Parametri programa nisu jednoznaèni!",
     "Kanaliseaded ei ole unikaalsed!",
     "Kanalindstillinger er ikke entydige!",
+    "Nastavení kanálù nejsou unikátní!",
   },
   { "Channel locked (recording)!",
     "Kanal blockiert (zeichnet auf)!",
@@ -2230,6 +2332,7 @@
     "Program blokiran (snimanje)!",
     "Kanal lukus (salvestamine aktiivne)!",
     "Kanal blokeret (optagelse i gang)",
+    "Kanál je blokovaný (nahrává se)!",
   },
   { "Can't start Transfer Mode!",
     "Transfer-Mode kann nicht gestartet werden!",
@@ -2251,6 +2354,7 @@
     "Ne mogu zapoèeti 'prijenosni' naèin!",
     "Siirdemooduse start ebaõnnestus!",
     "Kan ikke starte Transfer Mode!",
+    "Nelze zaèít s pøenosem",
   },
   { "No editing marks defined!",
     "Keine Schnittmarken gesetzt!",
@@ -2272,6 +2376,7 @@
     "Nijedna prekidna toèka nije postavljena!",
     "Redigeerimise markerid puuduvad!",
     "Der er ikke sat nogen redigeringsmærker!",
+    "Nejsou definovány editaèní znaèky!",
   },
   { "Can't start editing process!",
     "Schnitt kann nicht gestartet werden!",
@@ -2293,6 +2398,7 @@
     "Ne mogu zapoèeti ureðivanje!",
     "Redigeerimise start ebaõnnestus!",
     "Kan ikke starte redigeringsprocessen!",
+    "Nelze zaèít editaèní proces!",
   },
   { "Editing process already active!",
     "Schnitt bereits aktiv!",
@@ -2314,6 +2420,7 @@
     "Ureðivanje je veæ aktivirano!",
     "Redigeerimine juba aktiivne!",
     "Redigeringsproces er allerede aktiv!",
+    "Editaèní proces je ji¾ aktivní!",
   },
   { "Can't shutdown - option '-s' not given!",
     "Shutdown unmöglich - Option '-s' fehlt!",
@@ -2335,6 +2442,7 @@
     "Ga¹enje nemoguæe - nedostaje opcija '-s'!",
     "Väljalülitamine ebaõnnestus - '-s' parameeter puudub!",
     "Kan ikke slukke - parameter '-s' ikke angivet!",
+    "Vypnutí není mo¾né - chbí volba '-s'!",
   },
   { "Not enough disk space to start recording!",
     "Nicht genügend Plattenplatz für Aufnahme!",
@@ -2345,7 +2453,7 @@
     "",//TODO
     "",//TODO
     "Tallennustilan puute estää tallennuksen!",
-    "",//TODO
+    "Brak miejsca na dysku do nagrywania!",
     "",//TODO
     "",//TODO
     "",//TODO
@@ -2356,6 +2464,7 @@
     "",//TODO
     "Ebapiisavalt kettaruumi salvestamise alustamiseks!",
     "For lidt harddisk plads til optagelse!",
+    "Nedostatek volného místa k zapoèetí nahrávání!",
   },
   { "Low disk space!",
     "Platte beinahe voll!",
@@ -2377,6 +2486,7 @@
     "Nedovoljno prostora na disku",
     "Kõvaketas täis!",
     "Kun lidt diskplads tilbage!",
+    "Disk bude brzy zaplnìn!",
   },
   { "Opening CAM menu...",
     "CAM-Menü wird geöffnet...",
@@ -2398,6 +2508,7 @@
     "",//TODO
     "CAM-menüü avamine...",
     "Åbner CAM menu...",
+    "Otevírá se menu CAM...",
   },
   { "Can't open CAM menu!",
     "CAM-Menü kann nicht geöffnet werden!",
@@ -2419,6 +2530,7 @@
     "Ne mogu otvoriti CAM izbor!",
     "Ei saa avada CAM menüüd!",
     "Kan ikke åbne CAM menuen!",
+    "Menu CAM není dostupné",
   },
   { "Resetting CAM...",
     "CAM wird zurückgesetzt...",
@@ -2440,6 +2552,7 @@
     "",//TODO
     "CAM mooduli taaskäivitus...",
     "Nulstiller CAM...",
+    "Restartuje se CAM...",
   },
   { "Can't reset CAM!",
     "CAM-Reset fehlgeschlagen!",
@@ -2461,6 +2574,7 @@
     "Ne mogu resetirati CAM",
     "CAM mooduli taaskäivitus ebaõnnestus!",
     "Kan ikke nulstille CAM!",
+    "CAM modul nelze restartovat!",
   },
   { "CAM has been reset",
     "CAM wurde zurückgesetzt",
@@ -2482,6 +2596,7 @@
     "CAM je resetiran",
     "CAM mooduli taaskäivitus tehtud",
     "CAM er blevet nulstillet",
+    "CAM byl restartován",
   },
   { "Please enter %d digits!",
     "Bitte geben Sie %d Ziffern ein!",
@@ -2503,6 +2618,7 @@
     "",//TODO
     "Palun sisesta %d numbrit!",
     "Indtast venligst %d cifre!",
+    "Prosím vlo¾te %d znakù!",
   },
   { "No audio available!",
     "Kein Audio verfügbar!",
@@ -2516,7 +2632,7 @@
     "D¼wiêk nie jest dostêpny!",
     "¡No hay audio disponible!",
     "Ìç äéáèÝóéìïò Þ÷ïò",
-    "Ljud saknas!"
+    "Ljud saknas!",
     "Lipseºte sunetul!",
     "",//TODO
     "",//TODO
@@ -2524,6 +2640,7 @@
     "Audio nedostupan",
     "Audio kättesaamatu!",
     "Ingen lyd tilgængelig!",
+    "Zvuk není dostupný!",
   },
   // Setup pages:
   { "OSD",
@@ -2546,6 +2663,7 @@
     "OSD",
     "Ekraanimenüü",
     "OSD",
+    "OSD",
   },
   { "EPG",
     "EPG",
@@ -2567,6 +2685,7 @@
     "Pregled emisija (EPG)",
     "EPG",
     "EPG",
+    "EPG",
   },
   { "DVB",
     "DVB",
@@ -2588,6 +2707,7 @@
     "DVB",
     "DVB",
     "DVB",
+    "DVB",
   },
   { "LNB",
     "LNB",
@@ -2609,6 +2729,7 @@
     "LNB",
     "LNB",
     "LNB",
+    "LNB",
   },
   { "CICAM",
     "CICAM",
@@ -2630,6 +2751,7 @@
     "CICAM",
     "CICAM",
     "CICAM",
+    "CICAM",
   },
   { "Recording",
     "Aufnahme",
@@ -2651,6 +2773,7 @@
     "Snimanje",
     "Salvestamine",
     "Optagelse",
+    "Nahrávání",
   },
   { "Replay",
     "Wiedergabe",
@@ -2672,6 +2795,7 @@
     "Reprodukcija",
     "Taasesitus",
     "Afspilning",
+    "Pøehrávání",
   },
   { "Miscellaneous",
     "Sonstiges",
@@ -2693,6 +2817,7 @@
     "Ostalo",
     "Muud sätted",
     "Diverse",
+    "Rùzné",
   },
   { "Plugins",
     "Plugins",
@@ -2714,6 +2839,7 @@
     "Dodaci (Plugins)",
     "Laiendusmoodulid",
     "Plugins",
+    "Moduly",
   },
   { "Plugin",
     "Plugin",
@@ -2735,6 +2861,7 @@
     "Plugin",
     "Laiendusmoodul",
     "Plugin",
+    "Modul",
   },
   { "Restart",
     "Neustart",
@@ -2756,6 +2883,7 @@
     "Restart sistema",
     "Restart",
     "Genstart",
+    "Restart",
   },
   // Setup parameters:
   { "Setup.OSD$Language",
@@ -2778,6 +2906,7 @@
     "Jezik",
     "Keel",
     "Sprog",
+    "Jazyk",
   },
   { "Setup.OSD$Skin",
     "Oberfläche",
@@ -2799,6 +2928,7 @@
     "Povr¹ina",
     "Kest",
     "Skin",
+    "Vzhled",
   },
   { "Setup.OSD$Theme",
     "Thema",
@@ -2820,6 +2950,7 @@
     "Tema",
     "Teema",
     "Tema",
+    "Téma",
   },
   { "Setup.OSD$Left",
     "Links",
@@ -2841,6 +2972,7 @@
     "Lijevo",
     "Vasakule",
     "Venstre",
+    "Vlevo",
   },
   { "Setup.OSD$Top",
     "Oben",
@@ -2862,6 +2994,7 @@
     "Gore",
     "Ülesse",
     "Top",
+    "Nahoøe",
   },
   { "Setup.OSD$Width",
     "Breite",
@@ -2883,6 +3016,7 @@
     "©irina",
     "Laius",
     "Bredde",
+    "©íøka",
   },
   { "Setup.OSD$Height",
     "Höhe",
@@ -2904,6 +3038,7 @@
     "Visina",
     "Kõrgus",
     "Højde",
+    "Vý¹ka",
   },
   { "Setup.OSD$Message time (s)",
     "Anzeigedauer für Nachrichten (s)",
@@ -2925,6 +3060,7 @@
     "Vrijeme prikaza poruka (s)",
     "Teate esitusaeg (s)",
     "Tid beskeder skal vises (s)",
+    "Èas zobrazení zpávy (s)",
   },
   { "Setup.OSD$Use small font",
     "Kleine Schrift benutzen",
@@ -2946,6 +3082,7 @@
     "Koristi mala slova",
     "Väikese fondi kasutamine",
     "Anvend lille skrift",
+    "Pou¾ívat malé písmo",
   },
   { "never",
     "nie",
@@ -2967,6 +3104,7 @@
     "nikada",
     "mitte kunagi",
     "aldrig",
+    "nikdy",
   },
   { "skin dependent",
     "je nach Oberfläche",
@@ -2988,6 +3126,7 @@
     "ovisno o povr¹ini",
     "kestast sõltuv",
     "skin afhængig",
+    "podle vzhledu",
   },
   { "always",
     "immer",
@@ -3009,6 +3148,7 @@
     "uvijek",
     "alati",
     "altid",
+    "v¾dy",
   },
   { "Setup.OSD$Channel info position",
     "Kanal-Info Position",
@@ -3030,6 +3170,7 @@
     "Pozicija informacije o programu",
     "Kanaliinfo asukoht",
     "Placering af kanalinfo",
+    "Pozice informace o kanálu",
   },
   { "Setup.OSD$Channel info time (s)",
     "Anzeigedauer für Kanal-Info (s)",
@@ -3051,6 +3192,7 @@
     "Vrijeme prikaza informacije o programu (s)",
     "Kanaliinfo esitusaeg (s)",
     "Tid kanalinfo skal vises (s)",
+    "Èas zobr. informace o kanálu (s)",
   },
   { "Setup.OSD$Info on channel switch",
     "Info beim Kanalwechsel",
@@ -3072,6 +3214,7 @@
     "Informacije kod promjene kanala",
     "Kanaliinfo näitamine",
     "Info ved kanalskift",
+    "Informace pøi zmìnì kanálu",
   },
   { "Setup.OSD$Timeout requested channel info",
     "Angeforderte Kanalinfo schließen",
@@ -3093,6 +3236,7 @@
     "", // TODO
     "Kanaliinfo kuvamise ajapiirang",
     "Timeout ved anmodet kanal info",
+    "Èasový limit informace o kanálu",
   },
   { "Setup.OSD$Scroll pages",
     "Seitenweise scrollen",
@@ -3114,6 +3258,7 @@
     "Listaj po stranicama",
     "Lehekülje kerimine",
     "Scroll sidevis",
+    "Rolovat strany",
   },
   { "Setup.OSD$Scroll wraps",
     "Rundum scrollen",
@@ -3135,6 +3280,7 @@
     "S kraja skoèi na poèetak",
     "Ridade kerimine",
     "Scroll rundt",
+    "Z konce na zaèátek",
   },
   { "Setup.OSD$Menu button closes",
     "Menu-Taste schließt",
@@ -3156,6 +3302,7 @@
     "",// TODO
     "Sulgemine Menüü klahviga",
     "Menu taste lukker",
+    "Klávesa Menu zavírá",
   },
   { "Setup.OSD$Sort timers",
     "Timer sortieren",
@@ -3177,6 +3324,7 @@
     "Sortiraj termine",
     "Taimeri sorteerimine",
     "Sorter timere",
+    "Tøídìní èasovaèù",
   },
   { "Setup.OSD$Recording directories",
     "Aufnahmeverzeichnisse",
@@ -3198,6 +3346,7 @@
     "Imenik za snimke",
     "Kausta nime salvestamine",
     "Optagelser i foldere",
+    "Seznam nahrávek",
   },
   { "Setup.EPG$EPG scan timeout (h)",
     "Zeit bis EPG Scan (h)",
@@ -3219,6 +3368,7 @@
     "Vrijeme do EPG pregleda (h)",
     "EPG skaneerimise viide (h)",
     "Tid før EPG skanning (t)",
+    "Èasový limit pro snímání EPG (h)",
   },
   { "Setup.EPG$EPG bugfix level",
     "EPG Fehlerbereinigung",
@@ -3240,6 +3390,7 @@
     "Nivo popravka EPG gre¹aka",
     "EPG veaparanduse tase",
     "Niveau for EPG fejlrettelse",
+    "EPG úroveò chyb",
   },
   { "Setup.EPG$EPG linger time (min)",
     "Alte EPG-Daten anzeigen (min)",// TODO
@@ -3261,6 +3412,7 @@
     "Prika¾i stare EPG podatke (min)",
     "Vana EPG viide (min)",
     "Vise gammel EPG info (min)",
+    "Ukazovat star¹í EPG data (min)",
   },
   { "Setup.EPG$Set system time",
     "Systemzeit stellen",
@@ -3282,6 +3434,7 @@
     "Podesi vrijeme sistema",
     "Kella sünkroniseerimine",
     "Indstil system tid",
+    "Nastavit systémový èas",
   },
   { "Setup.EPG$Use time from transponder",
     "Transponder für Systemzeit",
@@ -3303,6 +3456,7 @@
     "Transponder za pode¹avanje sata",
     "Kella sünkroniseerimise transponder",
     "Anvend tid fra transponder",
+    "Pou¾ít èas z kanálu",
   },
   { "Setup.EPG$Preferred languages", // note the plural
     "Bevorzugte Sprachen",
@@ -3324,6 +3478,7 @@
     "Preferirani jezici",
     "Eelistatuid keeli",
     "Foretrukne sprog",
+    "Preferované jazyky",
   },
   { "Setup.EPG$Preferred language", // note the singular
     "Bevorzugte Sprache",
@@ -3345,6 +3500,7 @@
     "Preferirani jezik",
     "Eelistatud keel",
     "Foretrukket sprog",
+    "Preferovaný jazyk",
   },
   { "Setup.DVB$Primary DVB interface",
     "Primäres DVB Interface",
@@ -3366,6 +3522,7 @@
     "Primarni DVB ureðaj",
     "Esmane DVB seade",
     "Primær DVB enhed",
+    "Primární DVB interface",
   },
   { "Setup.DVB$Video display format",
     "Video Anzeige-Format",
@@ -3387,6 +3544,7 @@
     "Format video prikaza",
     "Video kuvamise formaat",
     "Video display format",
+    "Formát zobrazení videa",
   },
   { "pan&scan",
     "pan&scan",
@@ -3408,6 +3566,7 @@
     "pan&scan",
     "pan&scan",
     "pan&scan",
+    "pan&scan",
   },
   { "letterbox",
     "letterbox",
@@ -3429,6 +3588,7 @@
     "letterbox",
     "letterbox",
     "letterbox",
+    "letterbox",
   },
   { "center cut out",
     "center cut out",
@@ -3450,6 +3610,7 @@
     "center cut out",
     "center cut out",
     "center cut out",
+    "dostøedu oøíznout",
   },
   { "Setup.DVB$Video format",
     "Video Format",
@@ -3471,6 +3632,7 @@
     "Video format",
     "TV külgsuhe",
     "Video format",
+    "Formát videa",
   },
   { "Setup.DVB$Use Dolby Digital",
     "Dolby Digital Ton benutzen",
@@ -3492,6 +3654,7 @@
     "Koristi Dolby Digital",
     "Dolby Digital kasutamine",
     "Anvend Dolby Digital",
+    "Pou¾ívat zvuk v Dolby Digital",
   },
   { "Setup.DVB$Update channels",
     "Kanäle aktualisieren",
@@ -3513,6 +3676,7 @@
     "Aktualiziraj programe",
     "Kanalite uuendamine",
     "Opdatér kanaler",
+    "Aktualizace kanálù",
   },
   { "names only",
     "nur Namen",
@@ -3534,6 +3698,7 @@
     "samo imena",
     "ainult nimed",
     "kun navne",
+    "jen názvy",
   },
   { "names and PIDs",
     "Namen und PIDs",
@@ -3555,6 +3720,7 @@
     "imena i identifikatore (PIDs)",
     "nimi ja PID-id",
     "navne og PIDs",
+    "názvy a PIDs",
   },
   { "add new channels",
     "neue Kanäle hinzufügen",
@@ -3576,6 +3742,7 @@
     "dodaj nove programe",
     "lisa uued kanalid",
     "tilf. ny kanaler",
+    "pøidat nové kanály",
   },
   { "add new transponders",
     "neue Transponder hinzufügen",
@@ -3597,6 +3764,7 @@
     "dodaj nove transpondere", // hrv TODO transponderi == odasiljaèi?
     "lisa uued transponderid",
     "tilf. ny transp.",
+    "pøidat nové transpondéry",
   },
   { "Setup.DVB$Audio languages",  // note the plural
     "Audio Sprachen",
@@ -3618,6 +3786,7 @@
     "Audio jezici",
     "Audio keeli",
     "Audio sprog (ant.)",
+    "Jazyky zvuku",
   },
   { "Setup.DVB$Audio language",  // note the singular
     "Audio Sprache",
@@ -3639,6 +3808,7 @@
     "Audio jezik",
     "Audio keel",
     "Audio sprog",
+    "Jazyk zvuku",
   },
   { "Setup.LNB$SLOF (MHz)",
     "SLOF (MHz)",
@@ -3660,6 +3830,7 @@
     "Frekv. preklopa SLOF (MHz)",
     "SLOF (MHz)",
     "SLOF (MHz)",
+    "SLOF (MHz)",
   },
   { "Setup.LNB$Low LNB frequency (MHz)",
     "Untere LNB-Frequenz (MHz)",
@@ -3681,6 +3852,7 @@
     "Donja LNB frekv. (MHz)",
     "Alumine (LO) LNB sagedus (MHz)",
     "Nedre LNB frekvens (MHz)",
+    "Dolní frekvence LNB (MHz)",
   },
   { "Setup.LNB$High LNB frequency (MHz)",
     "Obere LNB-Frequenz (MHz)",
@@ -3702,6 +3874,7 @@
     "Gornja LNB frekv. (MHz)",
     "Ülemine (HI) LNB sagedus (MHz)",
     "Øvre LNB frekvens (MHz)",
+    "Horní frekvence LNB (MHz)",
   },
   { "Setup.LNB$Use DiSEqC",
     "DiSEqC benutzen",
@@ -3723,6 +3896,7 @@
     "Koristi DiSEqC",
     "DiSEqC kasutamine",
     "Anvend DiSEqC",
+    "Pou¾ívat DiSEqC",
   },
   { "Setup.CICAM$CICAM DVB",
     "CICAM DVB",
@@ -3744,6 +3918,7 @@
     "CICAM DVB",
     "CICAM DVB",
     "CICAM DVB",
+    "CICAM DVB",
   },
   { "Setup.Recording$Margin at start (min)",
     "Zeitpuffer bei Anfang (min)",
@@ -3765,6 +3940,7 @@
     "Rezerva na poèetku snimanja (min)",
     "Salvestamise algusvaru (min)",
     "Margin ved start (min)",
+    "Nahrávat pøed zaèátkem (min)",
   },
   { "Setup.Recording$Margin at stop (min)",
     "Zeitpuffer bei Ende (min)",
@@ -3786,6 +3962,7 @@
     "Rezerva na kraju (min)",
     "Salvestamise lõpuvaru (min)",
     "Margin ved stop (min)",
+    "Nahrávat po konci (min)",
   },
   { "Setup.Recording$Primary limit",
     "Primär-Limit",
@@ -3807,6 +3984,7 @@
     "Standardno ogranièenje",
     "Esmane prioriteet",
     "Primær grænse",
+    "Primární limit",
   },
   { "Setup.Recording$Default priority",
     "Default Priorität",
@@ -3828,6 +4006,7 @@
     "Standardni prioritet",
     "Vaikimisi prioriteet",
     "Standard prioritet",
+    "Výchozí priorita",
   },
   { "Setup.Recording$Default lifetime (d)",
     "Default Lebensdauer (d)",
@@ -3849,6 +4028,7 @@
     "Standardno trajanje (d)",
     "Salvestuse eluiga (päevi)",
     "Standard levetid (d)",
+    "Výchozí ¾ivotnost",
   },
   { "Setup.Recording$Pause priority",
     "Pause Priorität",
@@ -3870,6 +4050,7 @@
     "Prioritet pauze",
     "Pausi prioriteet",
     "Pause prioritet",
+    "Priorita pøeru¹ení",
   },
   { "Setup.Recording$Pause lifetime (d)",
     "Pause Lebensdauer (d)",
@@ -3891,6 +4072,7 @@
     "Trajanje pauze (d)",
     "Pausi eluiga (päevi)",
     "Pause levetid (d)",
+    "®ivotnost pøeru¹ení (d)",
   },
   { "Setup.Recording$Use episode name",
     "Episodenname verwenden",
@@ -3912,6 +4094,7 @@
     "Koristi ime epizode",
     "Episoodi nime kasutamine",
     "Anvend udsendelsesnavn",
+    "Pou¾ívat název epizody",
   },
   { "Setup.Recording$Use VPS",
     "VPS benutzen",
@@ -3933,6 +4116,7 @@
     "Koristi VPS",
     "VPS-i kasutamine",
     "Anvend VPS",
+    "Pou¾ívat VPS",
   },
   { "Setup.Recording$VPS margin (s)",
     "Zeitpuffer bei VPS (s)",
@@ -3954,6 +4138,7 @@
     "Vremenska rezerva kod VPS (s)",
     "VPS-i algusvaru (s)",
     "VPS margin (s)",
+    "Èasová rezerva pro VPS (s)",
   },
   { "Setup.Recording$Mark instant recording",
     "Direktaufzeichnung markieren",
@@ -3975,6 +4160,7 @@
     "Oznaèi direktno snimanje",
     "Otsesalvestuse märgistamine",
     "Markér direkte optagelse",
+    "Oznaèit okam¾ité nahrávky",
   },
   { "Setup.Recording$Name instant recording",
     "Direktaufzeichnung benennen",
@@ -3996,6 +4182,7 @@
     "Imenuj direktno snimanje",
     "Otsesalvestuse nimi",
     "Navngiv direkte optagelse",
+    "Pojmenovat okam¾ité nahrávky",
   },
   { "Setup.Recording$Instant rec. time (min)",
     "Dauer der Direktaufzeichnung (min)",
@@ -4017,6 +4204,7 @@
     "Trajanje direktnog snimanja (min)",
     "Otsesalvestuse kestus (min)",
     "Længde af direkte optagelse (min)",
+    "Délka okam¾itého nahrávání (min)",
   },
   { "Setup.Recording$Max. video file size (MB)",
     "Max. Video Dateigröße (MB)",
@@ -4038,6 +4226,7 @@
     "Maksimalna velièina datoteke (MB)",
     "Maksimaalne failisuurus (MB)",
     "Max. video filstørrelse (MB)",
+    "Maximální velikost nahrávky (MB)",
   },
   { "Setup.Recording$Split edited files",
     "Editierte Dateien aufteilen",
@@ -4059,6 +4248,7 @@
     "Podijeli ureðene datoteke",
     "Redigeeritud failide tükeldamine",
     "Opdel redigerede filer",
+    "Dìlit editované soubory",
   },
   { "Setup.Replay$Multi speed mode",
     "MultiSpeed Modus",
@@ -4080,6 +4270,7 @@
     "MultiSpeed naèin",
     "Multi-kiiruse moodus",
     "Multi hastighedsmodus",
+    "Vícerychlostní mód",
   },
   { "Setup.Replay$Show replay mode",
     "Wiedergabestatus anzeigen",
@@ -4101,6 +4292,7 @@
     "Prika¾i naèin prikazivanja",
     "Korduse moodus",
     "Vis afspilningsmodus",
+    "Zobrazit re¾im pøehrávání",
   },
   { "Setup.Replay$Resume ID",
     "Wiedergabe ID",
@@ -4122,6 +4314,7 @@
     "ID nastavka",
     "Jätkamise ID",
     "Genoptagelses ID",
+    "ID obnovení",
   },
   { "Setup.Miscellaneous$Min. event timeout (min)",
     "Mindest Event Pause (min)",
@@ -4143,6 +4336,7 @@
     "Minimalno vrijeme pauze",
     "Min. sündmuse kestus (min)",
     "Mindste hændelsespause (min)",
+    "Min. pauza mezi událostmi (min)",
   },
   { "Setup.Miscellaneous$Min. user inactivity (min)",
     "Mindest Benutzer-Inaktivität (min)",
@@ -4164,6 +4358,7 @@
     "Minimalno vrijeme neaktivnosti (min)",
     "Min. kasutaja tegevusetus (min)",
     "Min. bruger inaktivitet (min)",
+    "Èasový limit neaktivnosti (min)",
   },
   { "Setup.Miscellaneous$SVDRP timeout (s)",
     "SVDRP Timeout (s)",
@@ -4185,6 +4380,7 @@
     "SVDRP vrijeme neaktivnosti",
     "SVDRP ooteaeg (s)",
     "SVDRP timeout (s)",
+    "Èasový limit SVDRP (s)",
   },
   { "Setup.Miscellaneous$Zap timeout (s)",
     "Zap Timeout (s)",
@@ -4206,6 +4402,7 @@
     "",// hrv TODO
     "Kanalivahetuse ooteaeg (s)",
     "Zap timeout (s)",
+    "Èasový limit Zap (s)",
   },
   // The days of the week:
   { "MTWTFSS",
@@ -4228,6 +4425,7 @@
     "PUSÈPSN", // hrv
     "ETKNRLP",
     "MTOTFLS",
+    "PUSÈPSN",
   },
   { "MonTueWedThuFriSatSun", // must all be 3 letters!
     "MonDieMitDonFreSamSon",
@@ -4249,6 +4447,7 @@
     "PonUtoSriÈetPetSubNed", // hrv
     " E  T  K  N  R  L  P ",
     "ManTirOnsTorFreLørSøn",
+    "Po Út St Èt Pá So Ne ",
   },
   // The allowed characters in strings:
   { " abcdefghijklmnopqrstuvwxyz0123456789-.#~,/_@",
@@ -4271,6 +4470,7 @@
     " abcèædðefghijklmnopqrs¹tuvwxyz¾0123456789-.#~,/_@", // hrv
     " abcdefghijklmnopqrsðzþtuvwõäöüxyå0123456789-.#~,/_@",
     " abcdefghijklmnopqrstuvwxyzæøå0123456789-.#~,/_@",
+    " aábcèdïeéìfghiíjklmnòoópqrøs¹t»uúùvwxyýz¾0123456789-.#~,/_@",
   },
   // The character maps for entering letters via the numeric keys:
   { " 0\t-.#~,/_@1\tabc2\tdef3\tghi4\tjkl5\tmno6\tpqrs7\ttuv8\twxyz9",
@@ -4293,6 +4493,7 @@
     "",//TODO
     " 0\t-.#~,/_@1\tabcäå2\tdef3\tghi4\tjkl5\tmnoõö6\tpqrsð7\ttuvü8\twxyzþ9",
     " 0\t-.#~,/_@1\tabcæå2\tdef3\tghi4\tjkl5\tmnoø6\tpqrs7\ttuv8\twxyz9",
+    " 0\t-.#~,/_@1\tabcáè2\tdefïéì3\tghií4\tjkl5\tmnoòó6\tpqrsø¹7\ttuv»úù8\twxyzý¾9",
   },
   // Learning keys:
   { "Learning Remote Control Keys",
@@ -4315,6 +4516,7 @@
     "Uèenje kôda daljinskog upravljaèa",
     "Kaugjuhtimispuldi õpetamine",
     "Lærer fjernbetjeningstaster",
+    "Uèení kódù dálkového ovládání",
   },
   { "Phase 1: Detecting RC code type",
     "Phase 1: FB Code feststellen",
@@ -4336,6 +4538,7 @@
     "Faza 1: detektiranje kôda daljinskog upravljaèa.",
     "Aste 1: Kodeerimissüsteemi tuvastamine",
     "Fase 1: Detekterer fjernbetjenings-kodetype",
+    "Fáze 1: Detekce typu kódu",
   },
   { "Press any key on the RC unit",
     "Eine Taste auf der FB drücken",
@@ -4357,6 +4560,7 @@
     "Pritisnite tipku na daljinskom upravljaèu",
     "Vajuta puldil suvalist klahvi",
     "Tryk vilkårlig tast på fjernbetjeningen",
+    "Stisknìte libovolnou klávesu ovládání",
   },
   { "RC code detected!",
     "FB Code erkannt!",
@@ -4378,6 +4582,7 @@
     "Kôd daljinskog upravljaèa je prepoznat!",
     "Kodeerimissüsteem tuvastatud!",
     "Fjernbetjenings-kodetype fundet!",
+    "Kód byl detekován!",
   },
   { "Do not press any key...",
     "Keine Taste drücken...",
@@ -4399,6 +4604,7 @@
     "Ne pritiskajte tipku...",
     "Ära vajuta puldil ühtki klahvi...",
     "Tryk ikke på nogen tast...",
+    "Nemaèkejte ¾ádné klávesy...",
   },
   { "Phase 2: Learning specific key codes",
     "Phase 2: Einzelne Tastencodes lernen",
@@ -4420,6 +4626,7 @@
     "Faza 2: Uèenje posebnih kôdova",
     "Aste 2: Klahvide õpetamine",
     "Fase 2: Lær individuelle tast koder",
+    "Fáze 2: Uèení konkrétního kódu kláves",
   },
   { "Press key for '%s'",
     "Taste für '%s' drücken",
@@ -4441,6 +4648,7 @@
     "Pritisnite tipku za '%s'",
     "Vajuta klahvile '%s'",
     "Tryk tasten for '%s'",
+    "Stisknìte klávesu pro '%s'",
   },
   { "Press 'Up' to confirm",
     "'Auf' drücken zum Bestätigen",
@@ -4462,6 +4670,7 @@
     "Pritisnite 'Gore' za potvrdu",
     "Kinnitamiseks vajuta 'Üles'",
     "Tryk 'Op' for at bekræfte",
+    "Stisknìte 'Nahoru' pro potvrzení",
   },
   { "Press 'Down' to continue",
     "'Ab' drücken zum Weitermachen",
@@ -4483,6 +4692,7 @@
     "Pritisnite 'Dolje' za nastavak",
     "Jätkamiseks vajuta 'Alla'",
     "Tryk 'Ned' for at fortsætte",
+    "Stisknìte 'Dolù' pro pokraèování",
   },
   { "(press 'Up' to go back)",
     "('Auf' drücken um zurückzugehen)",
@@ -4504,6 +4714,7 @@
     "(pritisnite 'Gore' za nazad)",
     "(tagasiminekuks vajuta 'Üles')",
     "(tryk 'Op' for at gå tilbage)",
+    "(stisknìte 'Nahoru' pro zpìt)",
   },
   { "(press 'Down' to end key definition)",
     "('Ab' drücken zum Beenden)",
@@ -4525,6 +4736,7 @@
     "(pritisnite 'Dolje' za kraj)",
     "(lõpetamiseks vajuta 'Alla')",
     "(tryk 'Ned' for at afslutte indlæringen)",
+    "(stisknìte 'Dolù' pro ukonèení)",
   },
   { "(press 'Menu' to skip this key)",
     "('Menü' drücken zum Überspringen)",
@@ -4546,6 +4758,7 @@
     "pritisnite 'Izbor' da preskoèite ovu tipku",
     "(selle klahvi vahelejätmiseks vajuta 'Menüü')",
     "(tryk 'Menu' for at springe denne tast over)",
+    "(stisknìte 'Menu' pro pøeskoèení definice klávesy)",
   },
   { "Phase 3: Saving key codes",
     "Phase 3: Codes abspeichern",
@@ -4567,6 +4780,7 @@
     "Faza 3: Spremanje kôdova tipki",
     "Aste 3: Klavhikoodide salvestamine",
     "Fase 3: Gemmer tast koder",
+    "Fáze 3: Ulo¾ení kódù",
   },
   { "Press 'Up' to save, 'Down' to cancel",
     "'Auf' speichert, 'Ab' bricht ab",
@@ -4588,6 +4802,7 @@
     "'Gore' za potvrdu, 'Dolje' za prekid",
     "Salvestamiseks vajuta 'Üles' ja katkestamiseks 'Alla'",
     "Tryk 'Op' for at gemme, 'Ned' for at annullere",
+    "Stisknìte 'Nahoru' pro ulo¾ení, 'Dolù' pro zru¹ení",
   },
   // Key names:
   { "Key$Up",
@@ -4610,6 +4825,7 @@
     "Gore",
     "Üles",
     "Op",
+    "Nahoru",
   },
   { "Key$Down",
     "Ab",
@@ -4631,6 +4847,7 @@
     "Dolje",
     "Alla",
     "Ned",
+    "Dolù",
   },
   { "Key$Menu",
     "Menü",
@@ -4652,6 +4869,7 @@
     "Izbor",
     "Menüü",
     "Menu",
+    "Menu",
   },
   { "Key$Ok",
     "Ok",
@@ -4673,6 +4891,7 @@
     "Ok",
     "Ok",
     "Ok",
+    "Ok",
   },
   { "Key$Back",
     "Zurück",
@@ -4694,6 +4913,7 @@
     "Nazad",
     "Tagasi",
     "Tilbage",
+    "Zpìt",
   },
   { "Key$Left",
     "Links",
@@ -4715,6 +4935,7 @@
     "Lijevo",
     "Vasakule",
     "Venstre",
+    "Vlevo",
   },
   { "Key$Right",
     "Rechts",
@@ -4736,6 +4957,7 @@
     "Desno",
     "Paremale",
     "Højre",
+    "Vpravo",
   },
   { "Key$Red",
     "Rot",
@@ -4757,6 +4979,7 @@
     "Crveno",
     "Punane",
     "Rød",
+    "Èervený",
   },
   { "Key$Green",
     "Grün",
@@ -4778,6 +5001,7 @@
     "Zeleno",
     "Roheline",
     "Grøn",
+    "Zelený",
   },
   { "Key$Yellow",
     "Gelb",
@@ -4799,6 +5023,7 @@
     "®uto",
     "Kollane",
     "Gul",
+    "®lutý",
   },
   { "Key$Blue",
     "Blau",
@@ -4820,6 +5045,7 @@
     "Plavo",
     "Sinine",
     "Blå",
+    "Modrý",
   },
   { "Key$Info",
     "Info",
@@ -4841,6 +5067,7 @@
     "Info",
     "Info",
     "Info",
+    "Info",
   },
   { "Key$Play",
     "Wiedergabe",
@@ -4862,6 +5089,7 @@
     "Start",
     "Start",
     "Afspil",
+    "Pøehrát",
   },
   { "Key$Pause",
     "Pause",
@@ -4883,6 +5111,7 @@
     "Pauza",
     "Paus",
     "Pause",
+    "Pøeru¹it",
   },
   { "Key$Stop",
     "Stop",
@@ -4904,6 +5133,7 @@
     "Stop",
     "Stopp",
     "Stop",
+    "Zastavit",
   },
   { "Key$Record",
     "Aufnehmen",
@@ -4925,6 +5155,7 @@
     "Snimaj",
     "Salvestamine",
     "Optag",
+    "Nahrát",
   },
   { "Key$FastFwd",
     "Vorlauf",
@@ -4946,6 +5177,7 @@
     "Naprijed",
     "Edasikerimine",
     "Spol fremad",
+    "Dopøedu",
   },
   { "Key$FastRew",
     "Rücklauf",
@@ -4967,6 +5199,7 @@
     "Nazad",
     "Tagasikerimine",
     "Spol tilbage",
+    "Dozadu",
   },
   { "Key$Power",
     "Ausschalten",
@@ -4988,6 +5221,7 @@
     "Iskljuèi",
     "Toide",
     "Sluk",
+    "Vypínaè",
   },
   { "Key$Channel+",
     "Kanal+",
@@ -5009,6 +5243,7 @@
     "Program +",
     "Kanal+",
     "Kanal+",
+    "Kanál+",
   },
   { "Key$Channel-",
     "Kanal-",
@@ -5030,6 +5265,7 @@
     "Program -",
     "Kanal-",
     "Kanal-",
+    "Kanál-",
   },
   { "Key$Volume+",
     "Lautstärke+",
@@ -5051,6 +5287,7 @@
     "Glasnije", // hrv "Glasnocca +"
     "Helitugevus+",
     "Lydstyrke+",
+    "Hlasitost+",
   },
   { "Key$Volume-",
     "Lautstärke-",
@@ -5072,6 +5309,7 @@
     "Ti¹e", // hrv Glasnocca -"
     "Helitugevus-",
     "Lydstyrke-",
+    "Hlasitost-",
   },
   { "Key$Mute",
     "Stumm",
@@ -5093,6 +5331,7 @@
     "Bez zvuka",
     "Hääletu",
     "Sluk lyd",
+    "Ticho",
   },
   { "Key$Audio",
     "Audio",
@@ -5114,6 +5353,7 @@
     "",// TODO
     "Audio",
     "Audio",
+    "Zvuk",
   },
   // Miscellaneous:
   { "yes",
@@ -5136,6 +5376,7 @@
     "da",
     "jah",
     "ja",
+    "ano",
   },
   { "no",
     "nein",
@@ -5157,6 +5398,7 @@
     "ne",
     "ei",
     "nej",
+    "ne",
   },
   { "off",
     "aus",
@@ -5178,6 +5420,7 @@
     "ugasi",
     "välja",
     "fra",
+    "vyp.",
   },
   { "none",
     "keine",
@@ -5199,6 +5442,7 @@
     "nijedan",
     "tühi",
     "ingen",
+    "¾ádný",
   },
   { "auto",
     "auto",
@@ -5220,6 +5464,7 @@
     "automatski",
     "automaatne",
     "automatisk",
+    "auto",
   },
   { "top",
     "oben",
@@ -5241,6 +5486,7 @@
     "gore",
     "üleval",
     "top",
+    "hahoøe",
   },
   { "bottom",
     "unten",
@@ -5262,6 +5508,7 @@
     "dolje",
     "all",
     "bund",
+    "dole",
   },
   { "Disk",
     "Disk",
@@ -5283,6 +5530,7 @@
     "Disk",
     "Ketas",
     "Disk",
+    "Disk",
   },
   { "free",
     "frei",
@@ -5304,6 +5552,7 @@
     "slobodno",
     "vaba",
     "fri",
+    "volno",
   },
   { "Jump: ", // note the trailing blank
     "Springen: ",
@@ -5325,6 +5574,7 @@
     "Skoèi: ",
     "Hüpe: ",
     "Hop: ",
+    "Skok: ",
   },
   { "Volume ", // note the trailing blank
     "Lautstärke ",
@@ -5346,6 +5596,7 @@
     "Glasnoæa ",
     "Helitugevus ",
     "Lydstyrke ",
+    "Hlasitost ",
   },
   { " Stop replaying", // note the leading blank!
     " Wiedergabe beenden",
@@ -5367,6 +5618,7 @@
     " Prekini reprodukciju",
     " Lõpeta taasesitamine",
     " Stop afspilning",
+    " Zastavit pøehrávání",
   },
   { " Stop recording ", // note the leading and trailing blanks!
     " Aufzeichnung beenden ",
@@ -5388,6 +5640,7 @@
     " Prekini snimanje ",
     " Lõpeta salvestamine ",
     " Stop optagelse ",
+    " Zastavit nahrávání ",
   },
   { " Cancel editing", // note the leading blank!
     " Schneiden abbrechen",
@@ -5409,6 +5662,7 @@
     " Prekini ureðivanje",
     " Katkesta monteerimine",
     " Afbryd redigering",
+    " Zru¹it editaci",
   },
   { "Switching primary DVB...",
     "Primäres Interface wird umgeschaltet...",
@@ -5430,6 +5684,7 @@
     "Preklapanje primarnog DVB ureðaja...",
     "Esmase DVB seadme ümberlülitus...",
     "Skifter primær DVB enhed...",
+    "Pøepnout primární DVB...",
   },
   { "Up/Dn for new location - OK to move",
     "Auf/Ab für neue Position - dann OK",
@@ -5451,6 +5706,7 @@
     "Gore/Dolje na novu poziciju - zatim OK",
     "'Üles/Alla' uus asukoht - 'OK' kinnitus",
     "Op/Ned for ny placering - OK for at flytte",
+    "Nahoru/Dolu pro novou pozici - Ok pøesune",
   },
   { "Editing process started",
     "Schnitt gestartet",
@@ -5472,6 +5728,7 @@
     "Rezanje je zapoèeto",
     "Redigeerimine algas",
     "Redigeringsproces startet",
+    "Editaèní proces zaèal",
   },
   { "Editing process finished",
     "Schnitt beendet",
@@ -5493,6 +5750,7 @@
     "Rezanje zavr¹eno",
     "Redigeerimine lõpetatud",
     "Redigeringsproces afsluttet",
+    "Editaèní proces skonèil",
   },
   { "Editing process failed!",
     "Schnitt gescheitert!",
@@ -5514,6 +5772,7 @@
     "Rezanje neuspje¹no!",
     "Redigeerimine ebaõnnestus",
     "Redigeringsproces fejlede!",
+    "Editaèní proces selhal!",
   },
   { "Recording started",
     "Aufzeichnung gestartet",
@@ -5535,6 +5794,7 @@
     "",//TODO
     "Salvestamine algas",
     "Optagelse startet",
+    "Zaèalo nahrávání",
   },
   { "Pausing live video...",
     "Live-Signal wird angehalten...",
@@ -5556,6 +5816,7 @@
     "Zaustavljanje ¾ivog signala...",
     "Saate edastamise peatamine...",
     "Pausere live udsendelse...",
+    "Pøeru¹uje se bì¾ící program ...",
   },
   { "Starting EPG scan",
     "Beginne mit EPG-Scan",
@@ -5577,6 +5838,7 @@
     "Poèinjem EPG-scan",
     "EPG skaneerimine käivitatud",
     "Starter EPG skanning",
+    "Zaèíná prohledávání EPG",
   },
   { "This plugin has no setup parameters!",
     "Dieses Plugin hat keine Setup-Parameter!",
@@ -5598,6 +5860,7 @@
     "Ovaj dodatak (Plugin) nema parametara!",
     "Sellel laienudusmoodulil ei ole seadeid!",
     "Denne plugin har ingen parametre",
+    "Modul nemá konfiguraèní parametry!",
   },
   { "Classic VDR",
     "Klassischer VDR",
@@ -5619,6 +5882,7 @@
     "Klasièni VDR",
     "Klassikaline VDR",
     "Klassisk VDR",
+    "Klasické VDR",
   },
   { "ST:TNG Panels",
     "ST:TNG Konsolen",
@@ -5640,6 +5904,7 @@
     "ST:TNG Konzole",
     "ST:TNG konsool",
     "ST:TNG konsol",
+    "ST:TNG konzola",
   },
   { "No title",
     "Kein Titel",
@@ -5661,6 +5926,7 @@
     "Bez titla",
     "Pealkiri puudub",
     "Ingen titel",
+    "Bez názvu",
   },
   { NULL }
   };
diff -ruN vdr-1.3.41/i18n.h vdr-1.3.42/i18n.h
--- vdr-1.3.41/i18n.h	2005-09-09 16:50:35.000000000 +0200
+++ vdr-1.3.42/i18n.h	2006-02-04 11:41:16.000000000 +0100
@@ -4,7 +4,7 @@
  * See the main source file 'vdr.c' for copyright information and
  * how to reach the author.
  *
- * $Id: i18n.h 1.16 2005/09/09 14:50:35 kls Exp $
+ * $Id: i18n.h 1.17 2006/02/04 10:41:16 kls Exp $
  */
 
 #ifndef __I18N_H
@@ -12,7 +12,7 @@
 
 #include <stdio.h>
 
-const int I18nNumLanguages = 20;
+const int I18nNumLanguages = 21;
 
 typedef const char *tI18nPhrase[I18nNumLanguages];
 
diff -ruN vdr-1.3.41/menu.c vdr-1.3.42/menu.c
--- vdr-1.3.41/menu.c	2006-01-29 15:04:37.000000000 +0100
+++ vdr-1.3.42/menu.c	2006-02-05 14:31:08.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 1.407 2006/01/29 14:04:37 kls Exp $
+ * $Id: menu.c 1.410 2006/02/05 13:31:08 kls Exp $
  */
 
 #include "menu.h"
@@ -1437,7 +1437,7 @@
        case kYellow: if (schedules)
                         return AddSubMenu(new cMenuWhatsOn(schedules, false, cMenuWhatsOn::CurrentChannel()));
                      break;
-       case kBlue:   if (Count())
+       case kBlue:   if (Count() && otherChannel)
                         return Switch();
                      break;
        case kOk:     if (Count())
@@ -3083,7 +3083,7 @@
   if (Direction) {
      while (Channel) {
            Channel = Direction > 0 ? Channels.Next(Channel) : Channels.Prev(Channel);
-           if (Channel && !Channel->GroupSep() && cDevice::GetDevice(Channel, 0))
+           if (Channel && !Channel->GroupSep() && (cDevice::PrimaryDevice()->ProvidesChannel(Channel, Setup.PrimaryLimit) || cDevice::GetDevice(Channel, 0)))
               return Channel;
            }
      }
@@ -3326,7 +3326,7 @@
 :cOsdObject(true)
 {
   cDevice::PrimaryDevice()->EnsureAudioTrack();
-  SetTrackDescriptions(!cDevice::PrimaryDevice()->Replaying() || cTransferControl::ReceiverDevice() ? cDevice::CurrentChannel() : 0);
+  SetTrackDescriptions(!cDevice::PrimaryDevice()->Replaying() || cDevice::PrimaryDevice()->Transferring() ? cDevice::CurrentChannel() : 0);
   currentDisplayTracks = this;
   numTracks = track = 0;
   audioChannel = cDevice::PrimaryDevice()->GetAudioChannel();
diff -ruN vdr-1.3.41/menuitems.c vdr-1.3.42/menuitems.c
--- vdr-1.3.41/menuitems.c	2006-01-21 13:27:14.000000000 +0100
+++ vdr-1.3.42/menuitems.c	2006-02-04 13:47:08.000000000 +0100
@@ -4,7 +4,7 @@
  * See the main source file 'vdr.c' for copyright information and
  * how to reach the author.
  *
- * $Id: menuitems.c 1.30 2006/01/21 12:27:14 kls Exp $
+ * $Id: menuitems.c 1.31 2006/02/04 12:47:08 kls Exp $
  */
 
 #include "menuitems.h"
@@ -345,7 +345,7 @@
   bool SameKey = Key == lastKey;
   if (Key != kNone)
      lastKey = Key;
-  else if (!newchar && autoAdvanceTimeout.TimedOut()) {
+  else if (!newchar && k0 <= NORMALKEY(lastKey) && NORMALKEY(lastKey) <= k9 && autoAdvanceTimeout.TimedOut()) {
      AdvancePos();
      newchar = true;
      currentChar = NULL;
@@ -427,7 +427,7 @@
                        value[pos] = toupper(Inc(tolower(value[pos]), NORMALKEY(Key) == kUp));
                     else
                        value[pos] =         Inc(        value[pos],  NORMALKEY(Key) == kUp);
-                    newchar = true;
+                    newchar = false;
                     }
                  else
                     return cMenuEditItem::ProcessKey(Key);
diff -ruN vdr-1.3.41/osd.c vdr-1.3.42/osd.c
--- vdr-1.3.41/osd.c	2005-12-30 16:42:04.000000000 +0100
+++ vdr-1.3.42/osd.c	2006-02-05 14:46:37.000000000 +0100
@@ -4,7 +4,7 @@
  * See the main source file 'vdr.c' for copyright information and
  * how to reach the author.
  *
- * $Id: osd.c 1.65 2005/12/30 15:42:04 kls Exp $
+ * $Id: osd.c 1.66 2006/02/05 13:46:37 kls Exp $
  */
 
 #include "osd.h"
@@ -112,7 +112,7 @@
   LoadXpm(FileName);
 }
 
-cBitmap::cBitmap(char *Xpm[])
+cBitmap::cBitmap(const char *const Xpm[])
 {
   bitmap = NULL;
   x0 = 0;
@@ -251,9 +251,9 @@
   return Result;
 }
 
-bool cBitmap::SetXpm(char *Xpm[], bool IgnoreNone)
+bool cBitmap::SetXpm(const char *const Xpm[], bool IgnoreNone)
 {
-  char **p = Xpm;
+  const char *const *p = Xpm;
   int w, h, n, c;
   if (4 != sscanf(*p, "%d %d %d %d", &w, &h, &n, &c)) {
      esyslog("ERROR: faulty 'values' line in XPM: '%s'", *p);
diff -ruN vdr-1.3.41/osd.h vdr-1.3.42/osd.h
--- vdr-1.3.41/osd.h	2005-12-18 13:56:21.000000000 +0100
+++ vdr-1.3.42/osd.h	2006-02-05 14:46:37.000000000 +0100
@@ -4,7 +4,7 @@
  * See the main source file 'vdr.c' for copyright information and
  * how to reach the author.
  *
- * $Id: osd.h 1.50 2005/12/18 12:56:21 kls Exp $
+ * $Id: osd.h 1.51 2006/02/05 13:46:37 kls Exp $
  */
 
 #ifndef __OSD_H
@@ -112,7 +112,7 @@
        ///< this offset (unless specified otherwise).
   cBitmap(const char *FileName);
        ///< Creates a bitmap and loads an XPM image from the given file.
-  cBitmap(char *Xpm[]);
+  cBitmap(const char *const Xpm[]);
        ///< Creates a bitmap from the given XPM data.
   virtual ~cBitmap();
   int X0(void) const { return x0; }
@@ -140,7 +140,7 @@
   bool LoadXpm(const char *FileName);
        ///< Calls SetXpm() with the data from the file FileName.
        ///< Returns true if the operation was successful.
-  bool SetXpm(char *Xpm[], bool IgnoreNone = false);
+  bool SetXpm(const char *const Xpm[], bool IgnoreNone = false);
        ///< Sets this bitmap to the given XPM data. Any previous bitmap or
        ///< palette data will be overwritten with the new data.
        ///< If IgnoreNone is true, a "none" color entry will be ignored.
diff -ruN vdr-1.3.41/osdbase.c vdr-1.3.42/osdbase.c
--- vdr-1.3.41/osdbase.c	2006-01-08 12:40:02.000000000 +0100
+++ vdr-1.3.42/osdbase.c	2006-02-05 15:37:03.000000000 +0100
@@ -4,7 +4,7 @@
  * See the main source file 'vdr.c' for copyright information and
  * how to reach the author.
  *
- * $Id: osdbase.c 1.28 2006/01/08 11:40:02 kls Exp $
+ * $Id: osdbase.c 1.29 2006/02/05 14:37:03 kls Exp $
  */
 
 #include "osdbase.h"
@@ -280,6 +280,12 @@
      return;
   while (--tmpCurrent != current) {
         if (tmpCurrent < 0) {
+           if (first > 0) {
+              // make non-selectable items at the beginning visible:
+              first = 0;
+              Display();
+              return;
+              }
            if (Setup.MenuScrollWrap)
               tmpCurrent = last + 1;
            else
@@ -312,6 +318,12 @@
      return;
   while (++tmpCurrent != current) {
         if (tmpCurrent > last) {
+           if (first < last - displayMenuItems) {
+              // make non-selectable items at the end visible:
+              first = last - displayMenuItems + 1;
+              Display();
+              return;
+              }
            if (Setup.MenuScrollWrap)
               tmpCurrent = -1;
            else
diff -ruN vdr-1.3.41/recording.c vdr-1.3.42/recording.c
--- vdr-1.3.41/recording.c	2006-01-20 18:18:59.000000000 +0100
+++ vdr-1.3.42/recording.c	2006-02-05 13:34:08.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 1.133 2006/01/20 17:18:59 kls Exp $
+ * $Id: recording.c 1.134 2006/02/05 12:34:08 kls Exp $
  */
 
 #include "recording.h"
@@ -604,6 +604,7 @@
 {
   if (!sortBuffer) {
      char *s = StripEpisodeName(strdup(FileName() + strlen(VideoDirectory) + 1));
+     strreplace(s, '/', 'a'); // some locales ignore '/' when sorting
      int l = strxfrm(NULL, s, 0) + 1;
      sortBuffer = MALLOC(char, l);
      strxfrm(sortBuffer, s, l);
diff -ruN vdr-1.3.41/remux.c vdr-1.3.42/remux.c
--- vdr-1.3.41/remux.c	2006-01-08 12:40:16.000000000 +0100
+++ vdr-1.3.42/remux.c	2006-02-03 17:19:02.000000000 +0100
@@ -11,7 +11,7 @@
  * The cRepacker family's code was originally written by Reinhard Nissl <rnissl@gmx.de>,
  * and adapted to the VDR coding style by Klaus.Schmidinger@cadsoft.de.
  *
- * $Id: remux.c 1.53 2006/01/08 11:40:16 kls Exp $
+ * $Id: remux.c 1.54 2006/02/03 16:19:02 kls Exp $
  */
 
 #include "remux.h"
@@ -248,6 +248,14 @@
     scanPicture
     };
   int state;
+  void HandleStartCode(const uchar *const Data, cRingBufferLinear *const ResultBuffer, const uchar *&Payload, const uchar StreamID, const ePesHeader MpegLevel);
+  inline bool ScanDataForStartCodeSlow(const uchar *const Data);
+  inline bool ScanDataForStartCodeFast(const uchar *&Data, const uchar *Limit);
+  inline bool ScanDataForStartCode(const uchar *&Data, int &Done, int &Todo);
+  inline void AdjustCounters(const int Delta, int &Done, int &Todo);
+  inline bool ScanForEndOfPictureSlow(const uchar *&Data);
+  inline bool ScanForEndOfPictureFast(const uchar *&Data, const uchar *Limit);
+  inline bool ScanForEndOfPicture(const uchar *&Data, const uchar *Limit);
 public:
   cVideoRepacker(void);
   virtual void Reset(void);
@@ -267,6 +275,162 @@
   state = syncing;
 }
 
+void cVideoRepacker::HandleStartCode(const uchar *const Data, cRingBufferLinear *const ResultBuffer, const uchar *&Payload, const uchar StreamID, const ePesHeader MpegLevel)
+{
+  // synchronisation is detected some bytes after frame start.
+  const int SkippedBytesLimit = 4;
+
+  // which kind of start code have we got?
+  switch (*Data) {
+    case 0xB9 ... 0xFF: // system start codes
+         LOG("cVideoRepacker: found system start code: stream seems to be scrambled or not demultiplexed");
+         break;
+    case 0xB0 ... 0xB1: // reserved start codes
+    case 0xB6:
+         LOG("cVideoRepacker: found reserved start code: stream seems to be scrambled");
+         break;
+    case 0xB4: // sequence error code
+         LOG("cVideoRepacker: found sequence error code: stream seems to be damaged");
+    case 0xB2: // user data start code
+    case 0xB5: // extension start code
+         break;
+    case 0xB7: // sequence end code
+    case 0xB3: // sequence header code
+    case 0xB8: // group start code
+    case 0x00: // picture start code
+         if (state == scanPicture) {
+            // the above start codes indicate that the current picture is done. So
+            // push out the packet to start a new packet for the next picuture. If
+            // the byte count get's negative then the current buffer ends in a
+            // partitial start code that must be stripped off, as it shall be put
+            // in the next packet.
+            PushOutPacket(ResultBuffer, Payload, Data - 3 - Payload);
+            // go on with syncing to the next picture
+            state = syncing;
+            }
+         if (state == syncing) {
+            if (initiallySyncing) // omit report for the typical initial case
+               initiallySyncing = false;
+            else if (skippedBytes > SkippedBytesLimit) // report that syncing dropped some bytes
+               LOG("cVideoRepacker: skipped %d bytes to sync on next picture", skippedBytes - SkippedBytesLimit);
+            skippedBytes = 0;
+            // if there is a PES header available, then use it ...
+            if (pesHeaderBackupLen > 0) {
+               // ISO 13818-1 says:
+               // In the case of video, if a PTS is present in a PES packet header
+               // it shall refer to the access unit containing the first picture start
+               // code that commences in this PES packet. A picture start code commences
+               // in PES packet if the first byte of the picture start code is present
+               // in the PES packet.
+               memcpy(pesHeader, pesHeaderBackup, pesHeaderBackupLen);
+               pesHeaderLen = pesHeaderBackupLen;
+               pesHeaderBackupLen = 0;
+               }
+            else {
+               // ... otherwise create a continuation PES header
+               pesHeaderLen = 0;
+               pesHeader[pesHeaderLen++] = 0x00;
+               pesHeader[pesHeaderLen++] = 0x00;
+               pesHeader[pesHeaderLen++] = 0x01;
+               pesHeader[pesHeaderLen++] = StreamID; // video stream ID
+               pesHeader[pesHeaderLen++] = 0x00; // length still unknown
+               pesHeader[pesHeaderLen++] = 0x00; // length still unknown
+
+               if (MpegLevel == phMPEG2) {
+                  pesHeader[pesHeaderLen++] = 0x80;
+                  pesHeader[pesHeaderLen++] = 0x00;
+                  pesHeader[pesHeaderLen++] = 0x00;
+                  }
+               else
+                  pesHeader[pesHeaderLen++] = 0x0F;
+               }
+            // append the first three bytes of the start code
+            pesHeader[pesHeaderLen++] = 0x00;
+            pesHeader[pesHeaderLen++] = 0x00;
+            pesHeader[pesHeaderLen++] = 0x01;
+            // the next packet's payload will begin with the fourth byte of
+            // the start code (= the actual code)
+            Payload = Data;
+            // as there is no length information available, assume the
+            // maximum we can hold in one PES packet
+            packetTodo = maxPacketSize - pesHeaderLen;
+            // go on with finding the picture data
+            state++;
+            }
+         break;
+    case 0x01 ... 0xAF: // slice start codes
+         if (state == findPicture) {
+            // go on with scanning the picture data
+            state++;
+            }
+         break;
+    }
+}
+
+bool cVideoRepacker::ScanDataForStartCodeSlow(const uchar *const Data)
+{
+  scanner <<= 8;
+  bool FoundStartCode = (scanner == 0x00000100);
+  scanner |= *Data;
+  return FoundStartCode;
+}
+
+bool cVideoRepacker::ScanDataForStartCodeFast(const uchar *&Data, const uchar *Limit)
+{
+  Limit--;
+
+  while (Data < Limit && (Data = (const uchar *)memchr(Data, 0x01, Limit - Data))) {
+        if (Data[-2] || Data[-1])
+           Data += 3;
+        else {
+           scanner = 0x00000100 | *++Data;
+           return true;
+           }
+        }
+
+  Data = Limit;
+  unsigned long *Scanner = (unsigned long *)(Data - 3);
+  scanner = ntohl(*Scanner);
+  return false;
+}
+
+bool cVideoRepacker::ScanDataForStartCode(const uchar *&Data, int &Done, int &Todo)
+{
+  const uchar *const DataOrig = Data;
+  const int MinDataSize = 4;
+
+  if (Todo < MinDataSize || (state != syncing && packetTodo < MinDataSize))
+     return ScanDataForStartCodeSlow(Data);
+
+  int Limit = Todo;
+  if (state != syncing && Limit > packetTodo)
+     Limit = packetTodo;
+
+  if (ScanDataForStartCodeSlow(Data))
+     return true;
+
+  if (ScanDataForStartCodeSlow(++Data)) {
+     AdjustCounters(1, Done, Todo);
+     return true;
+     }
+  ++Data;
+
+  bool FoundStartCode = ScanDataForStartCodeFast(Data, DataOrig + Limit);
+  AdjustCounters(Data - DataOrig, Done, Todo);
+  return FoundStartCode;
+}
+
+void cVideoRepacker::AdjustCounters(const int Delta, int &Done, int &Todo)
+{
+  Done += Delta;
+  Todo -= Delta;
+
+  if (state <= syncing)
+     skippedBytes += Delta;
+  else
+     packetTodo -= Delta;
+}
+
 void cVideoRepacker::Repack(cRingBufferLinear *ResultBuffer, const uchar *Data, int Count)
 {
   // synchronisation is detected some bytes after frame start.
@@ -300,98 +464,9 @@
         if (state <= syncing)
            skippedBytes++;
         // did we reach a start code?
-        scanner <<= 8;
-        if (scanner != 0x00000100)
-           scanner |= *data;
-        else {
-           scanner |= *data;
-
-           // which kind of start code have we got?
-           switch (*data) {
-             case 0xB9 ... 0xFF: // system start codes
-                  LOG("cVideoRepacker: found system start code: stream seems to be scrambled or not demultiplexed");
-                  break;
-             case 0xB0 ... 0xB1: // reserved start codes
-             case 0xB6:
-                  LOG("cVideoRepacker: found reserved start code: stream seems to be scrambled");
-                  break;
-             case 0xB4: // sequence error code
-                  LOG("cVideoRepacker: found sequence error code: stream seems to be damaged");
-             case 0xB2: // user data start code
-             case 0xB5: // extension start code
-                  break;
-             case 0xB7: // sequence end code
-             case 0xB3: // sequence header code
-             case 0xB8: // group start code
-             case 0x00: // picture start code
-                  if (state == scanPicture) {
-                     // the above start codes indicate that the current picture is done. So
-                     // push out the packet to start a new packet for the next picuture. If
-                     // the byte count get's negative then the current buffer ends in a
-                     // partitial start code that must be stripped off, as it shall be put
-                     // in the next packet.
-                     PushOutPacket(ResultBuffer, payload, data - 3 - payload);
-                     // go on with syncing to the next picture
-                     state = syncing;
-                     }
-                  if (state == syncing) {
-                     if (initiallySyncing) // omit report for the typical initial case
-                        initiallySyncing = false;
-                     else if (skippedBytes > SkippedBytesLimit) // report that syncing dropped some bytes
-                        LOG("cVideoRepacker: skipped %d bytes to sync on next picture", skippedBytes - SkippedBytesLimit);
-                     skippedBytes = 0;
-                     // if there is a PES header available, then use it ...
-                     if (pesHeaderBackupLen > 0) {
-                        // ISO 13818-1 says:
-                        // In the case of video, if a PTS is present in a PES packet header
-                        // it shall refer to the access unit containing the first picture start
-                        // code that commences in this PES packet. A picture start code commences
-                        // in PES packet if the first byte of the picture start code is present
-                        // in the PES packet.
-                        memcpy(pesHeader, pesHeaderBackup, pesHeaderBackupLen);
-                        pesHeaderLen = pesHeaderBackupLen;
-                        pesHeaderBackupLen = 0;
-                        }
-                     else {
-                        // ... otherwise create a continuation PES header
-                        pesHeaderLen = 0;
-                        pesHeader[pesHeaderLen++] = 0x00;
-                        pesHeader[pesHeaderLen++] = 0x00;
-                        pesHeader[pesHeaderLen++] = 0x01;
-                        pesHeader[pesHeaderLen++] = Data[3]; // video stream ID
-                        pesHeader[pesHeaderLen++] = 0x00; // length still unknown
-                        pesHeader[pesHeaderLen++] = 0x00; // length still unknown
-
-                        if (mpegLevel == phMPEG2) {
-                           pesHeader[pesHeaderLen++] = 0x80;
-                           pesHeader[pesHeaderLen++] = 0x00;
-                           pesHeader[pesHeaderLen++] = 0x00;
-                           }
-                        else
-                           pesHeader[pesHeaderLen++] = 0x0F;
-                        }
-                     // append the first three bytes of the start code
-                     pesHeader[pesHeaderLen++] = 0x00;
-                     pesHeader[pesHeaderLen++] = 0x00;
-                     pesHeader[pesHeaderLen++] = 0x01;
-                     // the next packet's payload will begin with the fourth byte of
-                     // the start code (= the actual code)
-                     payload = data;
-                     // as there is no length information available, assume the
-                     // maximum we can hold in one PES packet
-                     packetTodo = maxPacketSize - pesHeaderLen;
-                     // go on with finding the picture data
-                     state++;
-                     }
-                  break;
-             case 0x01 ... 0xAF: // slice start codes
-                  if (state == findPicture) {
-                     // go on with scanning the picture data
-                     state++;
-                     }
-                  break;
-             }
-           }
+        if (ScanDataForStartCode(data, done, todo))
+           HandleStartCode(data, ResultBuffer, payload, Data[3], mpegLevel);
+        // move on
         data++;
         done++;
         todo--;
@@ -501,6 +576,79 @@
      }
 }
 
+bool cVideoRepacker::ScanForEndOfPictureSlow(const uchar *&Data)
+{
+  localScanner <<= 8;
+  localScanner |= *Data++;
+  // check start codes which follow picture data
+  switch (localScanner) {
+    case 0x00000100: // picture start code
+    case 0x000001B8: // group start code
+    case 0x000001B3: // sequence header code
+    case 0x000001B7: // sequence end code
+         return true;
+    }
+  return false;
+}
+
+bool cVideoRepacker::ScanForEndOfPictureFast(const uchar *&Data, const uchar *Limit)
+{
+  Limit--;
+
+  while (Data < Limit && (Data = (const uchar *)memchr(Data, 0x01, Limit - Data))) {
+        if (Data[-2] || Data[-1])
+           Data += 3;
+        else {
+           localScanner = 0x00000100 | *++Data;
+           // check start codes which follow picture data
+           switch (localScanner) {
+             case 0x00000100: // picture start code
+             case 0x000001B8: // group start code
+             case 0x000001B3: // sequence header code
+             case 0x000001B7: // sequence end code
+                  Data++;
+                  return true;
+             default:
+                  Data += 3;
+             }
+           }
+        }
+
+  Data = Limit + 1;
+  unsigned long *LocalScanner = (unsigned long *)(Data - 4);
+  localScanner = ntohl(*LocalScanner);
+  return false;
+}
+
+bool cVideoRepacker::ScanForEndOfPicture(const uchar *&Data, const uchar *Limit)
+{
+  const uchar *const DataOrig = Data;
+  const int MinDataSize = 4;
+  bool FoundEndOfPicture;
+
+  if (Limit - Data <= MinDataSize) {
+     FoundEndOfPicture = false;
+     while (Data < Limit) {
+           if (ScanForEndOfPictureSlow(Data)) {
+              FoundEndOfPicture = true;
+              break;
+              }
+           }
+     }
+  else {
+     FoundEndOfPicture = true;
+     if (!ScanForEndOfPictureSlow(Data)) {
+        if (!ScanForEndOfPictureSlow(Data)) {
+           if (!ScanForEndOfPictureFast(Data, Limit))
+              FoundEndOfPicture = false;
+           }
+        }
+     }
+
+  localStart += (Data - DataOrig);
+  return FoundEndOfPicture;
+}
+
 int cVideoRepacker::BreakAt(const uchar *Data, int Count)
 {
   if (initiallySyncing)
@@ -522,19 +670,8 @@
      const uchar *data = Data + PesPayloadOffset + localStart;
      const uchar *limit = Data + Count;
      // scan data
-     while (data < limit) {
-           localStart++;
-           localScanner <<= 8;
-           localScanner |= *data++;
-           // check start codes which follow picture data
-           switch (localScanner) {
-             case 0x00000100: // picture start code
-             case 0x000001B8: // group start code
-             case 0x000001B3: // sequence header code
-             case 0x000001B7: // sequence end code
-                  return data - Data;
-             }
-           }
+     if (ScanForEndOfPicture(data, limit))
+        return data - Data;
      }
   // just fill up packet and append next start code
   return PesPayloadOffset + packetTodo + 4;
diff -ruN vdr-1.3.41/runvdr vdr-1.3.42/runvdr
--- vdr-1.3.41/runvdr	2005-12-31 17:04:53.000000000 +0100
+++ vdr-1.3.42/runvdr	2006-02-04 16:20:48.000000000 +0100
@@ -5,12 +5,9 @@
 # If VDR exits abnormally, the driver will be reloaded
 # and VDR restarted.
 #
-# Set the environment variable VDRUSR to the user id you
-# want VDR to run with. If VDRUSR is not set, VDR will run
-# as user 'vdr'.
-#
 # Since this script loads the DVB driver, it must be started
-# as user 'root'.
+# as user 'root'. Add the option "-u username" to run VDR
+# under the given user name.
 #
 # Any command line parameters will be passed on to the
 # actual 'vdr' program.
@@ -18,11 +15,11 @@
 # See the main source file 'vdr.c' for copyright information and
 # how to reach the author.
 #
-# $Id: runvdr 1.15 2005/12/31 16:04:53 kls Exp $
+# $Id: runvdr 1.16 2006/02/04 15:20:48 kls Exp $
 
 DVBDIR="../DVB/driver"
 VDRPRG="./vdr"
-VDRCMD="$VDRPRG -u $VDRUSR -w 60 $*"
+VDRCMD="$VDRPRG -w 60 $*"
 
 LSMOD="`/sbin/lsmod | grep -w '^dvb' | wc -l`"
 KILL="/usr/bin/killall -q -TERM"
diff -ruN vdr-1.3.41/skinclassic.c vdr-1.3.42/skinclassic.c
--- vdr-1.3.41/skinclassic.c	2006-01-01 15:37:58.000000000 +0100
+++ vdr-1.3.42/skinclassic.c	2006-02-05 15:51:39.000000000 +0100
@@ -4,7 +4,7 @@
  * See the main source file 'vdr.c' for copyright information and
  * how to reach the author.
  *
- * $Id: skinclassic.c 1.13 2006/01/01 14:37:58 kls Exp $
+ * $Id: skinclassic.c 1.14 2006/02/05 14:51:39 kls Exp $
  */
 
 #include "skinclassic.h"
@@ -169,6 +169,8 @@
   virtual void SetEvent(const cEvent *Event);
   virtual void SetRecording(const cRecording *Recording);
   virtual void SetText(const char *Text, bool FixedFont);
+  virtual int GetTextAreaWidth(void) const;
+  virtual const cFont *GetTextAreaFont(bool FixedFont) const;
   virtual void Flush(void);
   };
 
@@ -357,11 +359,20 @@
 
 void cSkinClassicDisplayMenu::SetText(const char *Text, bool FixedFont)
 {
-  const cFont *font = cFont::GetFont(FixedFont ? fontFix : fontOsd);
-  textScroller.Set(osd, x0, y2, x1 - x0 - 2 * ScrollWidth, y3 - y2, Text, font, Theme.Color(clrMenuText), Theme.Color(clrBackground));
+  textScroller.Set(osd, x0, y2, GetTextAreaWidth(), y3 - y2, Text, GetTextAreaFont(FixedFont), Theme.Color(clrMenuText), Theme.Color(clrBackground));
   SetScrollbar();
 }
 
+int cSkinClassicDisplayMenu::GetTextAreaWidth(void) const
+{
+  return x1 - x0 - 2 * ScrollWidth;
+}
+
+const cFont *cSkinClassicDisplayMenu::GetTextAreaFont(bool FixedFont) const
+{
+  return cFont::GetFont(FixedFont ? fontFix : fontOsd);
+}
+
 void cSkinClassicDisplayMenu::Flush(void)
 {
   cString date = DayDateTime();
diff -ruN vdr-1.3.41/skins.c vdr-1.3.42/skins.c
--- vdr-1.3.41/skins.c	2006-01-08 12:40:18.000000000 +0100
+++ vdr-1.3.42/skins.c	2006-02-05 15:53:04.000000000 +0100
@@ -4,7 +4,7 @@
  * See the main source file 'vdr.c' for copyright information and
  * how to reach the author.
  *
- * $Id: skins.c 1.7 2006/01/08 11:40:18 kls Exp $
+ * $Id: skins.c 1.8 2006/02/05 14:53:04 kls Exp $
  */
 
 #include "skins.h"
@@ -108,6 +108,16 @@
   return buffer;
 }
 
+int cSkinDisplayMenu::GetTextAreaWidth(void) const
+{
+  return 0;
+}
+
+const cFont *cSkinDisplayMenu::GetTextAreaFont(bool) const
+{
+  return NULL;
+}
+
 // --- cSkinDisplayReplay::cProgressBar --------------------------------------
 
 cSkinDisplayReplay::cProgressBar::cProgressBar(int Width, int Height, int Current, int Total, const cMarks *Marks, tColor ColorSeen, tColor ColorRest, tColor ColorSelected, tColor ColorMark, tColor ColorCurrent)
diff -ruN vdr-1.3.41/skins.h vdr-1.3.42/skins.h
--- vdr-1.3.41/skins.h	2006-01-08 12:40:21.000000000 +0100
+++ vdr-1.3.42/skins.h	2006-02-05 15:59:57.000000000 +0100
@@ -4,7 +4,7 @@
  * See the main source file 'vdr.c' for copyright information and
  * how to reach the author.
  *
- * $Id: skins.h 1.10 2006/01/08 11:40:21 kls Exp $
+ * $Id: skins.h 1.11 2006/02/05 14:59:57 kls Exp $
  */
 
 #ifndef __SKINS_H
@@ -160,6 +160,19 @@
        ///< the Scroll() function will be called to drive scrolling that text if
        ///< necessary.
   //XXX ??? virtual void SetHelp(const char *Help) = 0;
+  virtual int GetTextAreaWidth(void) const;
+       ///< Returns the width in pixel of the area which is used to display text
+       ///< with SetText(). The width of the area is the width of the central area
+       ///< minus the width of any possibly displayed scroll-bar or other decoration.
+       ///< The default implementation returns 0. Therefore a caller of this method
+       ///< must be prepared to receive 0 if the plugin doesn't implement this method.
+  virtual const cFont *GetTextAreaFont(bool FixedFont) const;
+       ///< Returns a pointer to the font which is used to display text with SetText().
+       ///< The parameter FixedFont has the same meaning as in SetText(). The default
+       ///< implementation returns NULL. Therefore a caller of this method must be
+       ///< prepared to receive NULL if the plugin doesn't implement this method.
+       ///< The returned pointer is valid a long as the instance of cSkinDisplayMenu
+       ///< exists.
   };
 
 class cSkinDisplayReplay : public cSkinDisplay {
diff -ruN vdr-1.3.41/skinsttng.c vdr-1.3.42/skinsttng.c
--- vdr-1.3.41/skinsttng.c	2006-01-01 15:38:14.000000000 +0100
+++ vdr-1.3.42/skinsttng.c	2006-02-05 15:51:39.000000000 +0100
@@ -4,7 +4,7 @@
  * See the main source file 'vdr.c' for copyright information and
  * how to reach the author.
  *
- * $Id: skinsttng.c 1.16 2006/01/01 14:38:14 kls Exp $
+ * $Id: skinsttng.c 1.18 2006/02/05 14:51:39 kls Exp $
  */
 
 // Star Trek: The Next Generation® is a registered trademark of Paramount Pictures
@@ -347,6 +347,8 @@
   virtual void SetEvent(const cEvent *Event);
   virtual void SetRecording(const cRecording *Recording);
   virtual void SetText(const char *Text, bool FixedFont);
+  virtual int GetTextAreaWidth(void) const;
+  virtual const cFont *GetTextAreaFont(bool FixedFont) const;
   virtual void Flush(void);
   };
 
@@ -618,10 +620,20 @@
 
 void cSkinSTTNGDisplayMenu::SetText(const char *Text, bool FixedFont)
 {
+  textScroller.Set(osd, x3, y3, GetTextAreaWidth(), y4 - y3, Text, GetTextAreaFont(FixedFont), Theme.Color(clrMenuText), Theme.Color(clrBackground));
+  SetScrollbar();
+}
+
+int cSkinSTTNGDisplayMenu::GetTextAreaWidth(void) const
+{
+  return x4 - x3;
+}
+
+const cFont *cSkinSTTNGDisplayMenu::GetTextAreaFont(bool FixedFont) const
+{
   const cFont *font = cFont::GetFont(FixedFont ? fontFix : fontOsd);
   font = cFont::GetFont(fontSml);//XXX -> make a way to let the text define which font to use
-  textScroller.Set(osd, x3, y3, x4 - x3, y4 - y3, Text, font, Theme.Color(clrMenuText), Theme.Color(clrBackground));
-  SetScrollbar();
+  return font;
 }
 
 void cSkinSTTNGDisplayMenu::Flush(void)
@@ -721,7 +733,7 @@
   osd->DrawText(x3 + 5, y0, Title, Theme.Color(clrReplayTitle), frameColor, cFont::GetFont(fontSml), x4 - x3 - 5);
 }
 
-static char **ReplaySymbols[2][2][5] = {
+static const char *const *ReplaySymbols[2][2][5] = {
   { { pause_xpm, srew_xpm, srew1_xpm, srew2_xpm, srew3_xpm },
     { pause_xpm, sfwd_xpm, sfwd1_xpm, sfwd2_xpm, sfwd3_xpm }, },
   { { play_xpm,  frew_xpm, frew1_xpm, frew2_xpm, frew3_xpm },
diff -ruN vdr-1.3.41/symbols/arrowdown.xpm vdr-1.3.42/symbols/arrowdown.xpm
--- vdr-1.3.41/symbols/arrowdown.xpm	2004-04-25 11:34:21.000000000 +0200
+++ vdr-1.3.42/symbols/arrowdown.xpm	2006-02-05 14:46:37.000000000 +0100
@@ -1,5 +1,5 @@
 /* XPM */
-static char * arrowdown_xpm[] = {
+static const char *const arrowdown_xpm[] = {
 "12 12 2 1",
 ".	c #FFFFFF",
 "+	c #000000",
diff -ruN vdr-1.3.41/symbols/arrowup.xpm vdr-1.3.42/symbols/arrowup.xpm
--- vdr-1.3.41/symbols/arrowup.xpm	2004-04-25 11:34:02.000000000 +0200
+++ vdr-1.3.42/symbols/arrowup.xpm	2006-02-05 14:46:37.000000000 +0100
@@ -1,5 +1,5 @@
 /* XPM */
-static char * arrowup_xpm[] = {
+static const char *const arrowup_xpm[] = {
 "12 12 2 1",
 ".	c #FFFFFF",
 "+	c #000000",
diff -ruN vdr-1.3.41/symbols/audio.xpm vdr-1.3.42/symbols/audio.xpm
--- vdr-1.3.41/symbols/audio.xpm	2004-04-25 17:02:15.000000000 +0200
+++ vdr-1.3.42/symbols/audio.xpm	2006-02-05 14:46:37.000000000 +0100
@@ -1,5 +1,5 @@
 /* XPM */
-static char * audio_xpm[] = {
+static const char *const audio_xpm[] = {
 "27 18 2 1",
 ".	c #FFFFFF",
 "+	c #000000",
diff -ruN vdr-1.3.41/symbols/audioleft.xpm vdr-1.3.42/symbols/audioleft.xpm
--- vdr-1.3.41/symbols/audioleft.xpm	2005-01-08 16:00:03.000000000 +0100
+++ vdr-1.3.42/symbols/audioleft.xpm	2006-02-05 14:46:37.000000000 +0100
@@ -1,5 +1,5 @@
 /* XPM */
-static char * audioleft_xpm[] = {
+static const char *const audioleft_xpm[] = {
 "27 18 2 1",
 ".	c #FFFFFF",
 "+	c #000000",
diff -ruN vdr-1.3.41/symbols/audioright.xpm vdr-1.3.42/symbols/audioright.xpm
--- vdr-1.3.41/symbols/audioright.xpm	2005-01-08 15:59:35.000000000 +0100
+++ vdr-1.3.42/symbols/audioright.xpm	2006-02-05 14:46:37.000000000 +0100
@@ -1,5 +1,5 @@
 /* XPM */
-static char * audioright_xpm[] = {
+static const char *const audioright_xpm[] = {
 "27 18 2 1",
 ".	c #FFFFFF",
 "+	c #000000",
diff -ruN vdr-1.3.41/symbols/audiostereo.xpm vdr-1.3.42/symbols/audiostereo.xpm
--- vdr-1.3.41/symbols/audiostereo.xpm	2005-01-08 16:00:34.000000000 +0100
+++ vdr-1.3.42/symbols/audiostereo.xpm	2006-02-05 14:46:37.000000000 +0100
@@ -1,5 +1,5 @@
 /* XPM */
-static char * audiostereo_xpm[] = {
+static const char *const audiostereo_xpm[] = {
 "27 18 2 1",
 ".	c #FFFFFF",
 "+	c #000000",
diff -ruN vdr-1.3.41/symbols/dolbydigital.xpm vdr-1.3.42/symbols/dolbydigital.xpm
--- vdr-1.3.41/symbols/dolbydigital.xpm	2004-04-25 17:02:18.000000000 +0200
+++ vdr-1.3.42/symbols/dolbydigital.xpm	2006-02-05 14:46:37.000000000 +0100
@@ -1,5 +1,5 @@
 /* XPM */
-static char * dolbydigital_xpm[] = {
+static const char *const dolbydigital_xpm[] = {
 "27 18 2 1",
 ".	c #FFFFFF",
 "+	c #000000",
diff -ruN vdr-1.3.41/symbols/encrypted.xpm vdr-1.3.42/symbols/encrypted.xpm
--- vdr-1.3.41/symbols/encrypted.xpm	2004-04-25 17:02:20.000000000 +0200
+++ vdr-1.3.42/symbols/encrypted.xpm	2006-02-05 14:46:37.000000000 +0100
@@ -1,5 +1,5 @@
 /* XPM */
-static char * encrypted_xpm[] = {
+static const char *const encrypted_xpm[] = {
 "27 18 2 1",
 ".	c #FFFFFF",
 "+	c #000000",
diff -ruN vdr-1.3.41/symbols/ffwd.xpm vdr-1.3.42/symbols/ffwd.xpm
--- vdr-1.3.41/symbols/ffwd.xpm	2004-04-24 15:01:24.000000000 +0200
+++ vdr-1.3.42/symbols/ffwd.xpm	2006-02-05 14:46:37.000000000 +0100
@@ -1,5 +1,5 @@
 /* XPM */
-static char * ffwd_xpm[] = {
+static const char *const ffwd_xpm[] = {
 "28 26 2 1",
 ".	c #FFFFFF",
 "+	c #000000",
diff -ruN vdr-1.3.41/symbols/ffwd1.xpm vdr-1.3.42/symbols/ffwd1.xpm
--- vdr-1.3.41/symbols/ffwd1.xpm	2004-04-24 15:01:24.000000000 +0200
+++ vdr-1.3.42/symbols/ffwd1.xpm	2006-02-05 14:46:37.000000000 +0100
@@ -1,5 +1,5 @@
 /* XPM */
-static char * ffwd1_xpm[] = {
+static const char *const ffwd1_xpm[] = {
 "28 26 2 1",
 ".	c #FFFFFF",
 "+	c #000000",
diff -ruN vdr-1.3.41/symbols/ffwd2.xpm vdr-1.3.42/symbols/ffwd2.xpm
--- vdr-1.3.41/symbols/ffwd2.xpm	2004-04-24 15:01:24.000000000 +0200
+++ vdr-1.3.42/symbols/ffwd2.xpm	2006-02-05 14:46:37.000000000 +0100
@@ -1,5 +1,5 @@
 /* XPM */
-static char * ffwd2_xpm[] = {
+static const char *const ffwd2_xpm[] = {
 "28 26 2 1",
 ".	c #FFFFFF",
 "+	c #000000",
diff -ruN vdr-1.3.41/symbols/ffwd3.xpm vdr-1.3.42/symbols/ffwd3.xpm
--- vdr-1.3.41/symbols/ffwd3.xpm	2004-04-24 15:01:24.000000000 +0200
+++ vdr-1.3.42/symbols/ffwd3.xpm	2006-02-05 14:46:37.000000000 +0100
@@ -1,5 +1,5 @@
 /* XPM */
-static char * ffwd3_xpm[] = {
+static const char *const ffwd3_xpm[] = {
 "28 26 2 1",
 ".	c #FFFFFF",
 "+	c #000000",
diff -ruN vdr-1.3.41/symbols/frew.xpm vdr-1.3.42/symbols/frew.xpm
--- vdr-1.3.41/symbols/frew.xpm	2004-04-24 15:01:24.000000000 +0200
+++ vdr-1.3.42/symbols/frew.xpm	2006-02-05 14:46:37.000000000 +0100
@@ -1,5 +1,5 @@
 /* XPM */
-static char * frew_xpm[] = {
+static const char *const frew_xpm[] = {
 "28 26 2 1",
 ".	c #FFFFFF",
 "+	c #000000",
diff -ruN vdr-1.3.41/symbols/frew1.xpm vdr-1.3.42/symbols/frew1.xpm
--- vdr-1.3.41/symbols/frew1.xpm	2004-04-24 15:01:24.000000000 +0200
+++ vdr-1.3.42/symbols/frew1.xpm	2006-02-05 14:46:37.000000000 +0100
@@ -1,5 +1,5 @@
 /* XPM */
-static char * frew1_xpm[] = {
+static const char *const frew1_xpm[] = {
 "28 26 2 1",
 ".	c #FFFFFF",
 "+	c #000000",
diff -ruN vdr-1.3.41/symbols/frew2.xpm vdr-1.3.42/symbols/frew2.xpm
--- vdr-1.3.41/symbols/frew2.xpm	2004-04-24 15:01:24.000000000 +0200
+++ vdr-1.3.42/symbols/frew2.xpm	2006-02-05 14:46:37.000000000 +0100
@@ -1,5 +1,5 @@
 /* XPM */
-static char * frew2_xpm[] = {
+static const char *const frew2_xpm[] = {
 "28 26 2 1",
 ".	c #FFFFFF",
 "+	c #000000",
diff -ruN vdr-1.3.41/symbols/frew3.xpm vdr-1.3.42/symbols/frew3.xpm
--- vdr-1.3.41/symbols/frew3.xpm	2004-04-24 15:01:24.000000000 +0200
+++ vdr-1.3.42/symbols/frew3.xpm	2006-02-05 14:46:37.000000000 +0100
@@ -1,5 +1,5 @@
 /* XPM */
-static char * frew3_xpm[] = {
+static const char *const frew3_xpm[] = {
 "28 26 2 1",
 ".	c #FFFFFF",
 "+	c #000000",
diff -ruN vdr-1.3.41/symbols/mute.xpm vdr-1.3.42/symbols/mute.xpm
--- vdr-1.3.41/symbols/mute.xpm	2004-04-25 12:44:42.000000000 +0200
+++ vdr-1.3.42/symbols/mute.xpm	2006-02-05 14:46:37.000000000 +0100
@@ -1,5 +1,5 @@
 /* XPM */
-static char * mute_xpm[] = {
+static const char *const mute_xpm[] = {
 "26 20 2 1",
 ".	c #FFFFFF",
 "+	c #000000",
diff -ruN vdr-1.3.41/symbols/pause.xpm vdr-1.3.42/symbols/pause.xpm
--- vdr-1.3.41/symbols/pause.xpm	2004-04-24 15:01:24.000000000 +0200
+++ vdr-1.3.42/symbols/pause.xpm	2006-02-05 14:46:37.000000000 +0100
@@ -1,5 +1,5 @@
 /* XPM */
-static char * pause_xpm[] = {
+static const char *const pause_xpm[] = {
 "28 26 2 1",
 ".	c #FFFFFF",
 "+	c #000000",
diff -ruN vdr-1.3.41/symbols/play.xpm vdr-1.3.42/symbols/play.xpm
--- vdr-1.3.41/symbols/play.xpm	2004-04-24 15:01:24.000000000 +0200
+++ vdr-1.3.42/symbols/play.xpm	2006-02-05 14:46:37.000000000 +0100
@@ -1,5 +1,5 @@
 /* XPM */
-static char * play_xpm[] = {
+static const char *const play_xpm[] = {
 "28 26 2 1",
 ".	c #FFFFFF",
 "+	c #000000",
diff -ruN vdr-1.3.41/symbols/radio.xpm vdr-1.3.42/symbols/radio.xpm
--- vdr-1.3.41/symbols/radio.xpm	2004-04-25 17:01:38.000000000 +0200
+++ vdr-1.3.42/symbols/radio.xpm	2006-02-05 14:46:37.000000000 +0100
@@ -1,5 +1,5 @@
 /* XPM */
-static char * radio_xpm[] = {
+static const char *const radio_xpm[] = {
 "27 18 2 1",
 ".	c #FFFFFF",
 "+	c #000000",
diff -ruN vdr-1.3.41/symbols/recording.xpm vdr-1.3.42/symbols/recording.xpm
--- vdr-1.3.41/symbols/recording.xpm	2004-04-25 17:02:29.000000000 +0200
+++ vdr-1.3.42/symbols/recording.xpm	2006-02-05 14:46:37.000000000 +0100
@@ -1,5 +1,5 @@
 /* XPM */
-static char * recording_xpm[] = {
+static const char *const recording_xpm[] = {
 "27 18 2 1",
 ".	c #FFFFFF",
 "+	c #000000",
diff -ruN vdr-1.3.41/symbols/sfwd.xpm vdr-1.3.42/symbols/sfwd.xpm
--- vdr-1.3.41/symbols/sfwd.xpm	2004-04-24 15:01:24.000000000 +0200
+++ vdr-1.3.42/symbols/sfwd.xpm	2006-02-05 14:46:37.000000000 +0100
@@ -1,5 +1,5 @@
 /* XPM */
-static char * sfwd_xpm[] = {
+static const char *const sfwd_xpm[] = {
 "28 26 2 1",
 ".	c #FFFFFF",
 "+	c #000000",
diff -ruN vdr-1.3.41/symbols/sfwd1.xpm vdr-1.3.42/symbols/sfwd1.xpm
--- vdr-1.3.41/symbols/sfwd1.xpm	2004-04-24 15:01:24.000000000 +0200
+++ vdr-1.3.42/symbols/sfwd1.xpm	2006-02-05 14:46:37.000000000 +0100
@@ -1,5 +1,5 @@
 /* XPM */
-static char * sfwd1_xpm[] = {
+static const char *const sfwd1_xpm[] = {
 "28 26 2 1",
 ".	c #FFFFFF",
 "+	c #000000",
diff -ruN vdr-1.3.41/symbols/sfwd2.xpm vdr-1.3.42/symbols/sfwd2.xpm
--- vdr-1.3.41/symbols/sfwd2.xpm	2004-04-24 15:01:24.000000000 +0200
+++ vdr-1.3.42/symbols/sfwd2.xpm	2006-02-05 14:46:37.000000000 +0100
@@ -1,5 +1,5 @@
 /* XPM */
-static char * sfwd2_xpm[] = {
+static const char *const sfwd2_xpm[] = {
 "28 26 2 1",
 ".	c #FFFFFF",
 "+	c #000000",
diff -ruN vdr-1.3.41/symbols/sfwd3.xpm vdr-1.3.42/symbols/sfwd3.xpm
--- vdr-1.3.41/symbols/sfwd3.xpm	2004-04-24 15:01:24.000000000 +0200
+++ vdr-1.3.42/symbols/sfwd3.xpm	2006-02-05 14:46:37.000000000 +0100
@@ -1,5 +1,5 @@
 /* XPM */
-static char * sfwd3_xpm[] = {
+static const char *const sfwd3_xpm[] = {
 "28 26 2 1",
 ".	c #FFFFFF",
 "+	c #000000",
diff -ruN vdr-1.3.41/symbols/srew.xpm vdr-1.3.42/symbols/srew.xpm
--- vdr-1.3.41/symbols/srew.xpm	2004-04-24 15:01:24.000000000 +0200
+++ vdr-1.3.42/symbols/srew.xpm	2006-02-05 14:46:37.000000000 +0100
@@ -1,5 +1,5 @@
 /* XPM */
-static char * srew_xpm[] = {
+static const char *const srew_xpm[] = {
 "28 26 2 1",
 ".	c #FFFFFF",
 "+	c #000000",
diff -ruN vdr-1.3.41/symbols/srew1.xpm vdr-1.3.42/symbols/srew1.xpm
--- vdr-1.3.41/symbols/srew1.xpm	2004-04-24 15:01:24.000000000 +0200
+++ vdr-1.3.42/symbols/srew1.xpm	2006-02-05 14:46:37.000000000 +0100
@@ -1,5 +1,5 @@
 /* XPM */
-static char * srew1_xpm[] = {
+static const char *const srew1_xpm[] = {
 "28 26 2 1",
 ".	c #FFFFFF",
 "+	c #000000",
diff -ruN vdr-1.3.41/symbols/srew2.xpm vdr-1.3.42/symbols/srew2.xpm
--- vdr-1.3.41/symbols/srew2.xpm	2004-04-24 15:01:24.000000000 +0200
+++ vdr-1.3.42/symbols/srew2.xpm	2006-02-05 14:46:37.000000000 +0100
@@ -1,5 +1,5 @@
 /* XPM */
-static char * srew2_xpm[] = {
+static const char *const srew2_xpm[] = {
 "28 26 2 1",
 ".	c #FFFFFF",
 "+	c #000000",
diff -ruN vdr-1.3.41/symbols/srew3.xpm vdr-1.3.42/symbols/srew3.xpm
--- vdr-1.3.41/symbols/srew3.xpm	2004-04-24 15:01:24.000000000 +0200
+++ vdr-1.3.42/symbols/srew3.xpm	2006-02-05 14:46:37.000000000 +0100
@@ -1,5 +1,5 @@
 /* XPM */
-static char * srew3_xpm[] = {
+static const char *const srew3_xpm[] = {
 "28 26 2 1",
 ".	c #FFFFFF",
 "+	c #000000",
diff -ruN vdr-1.3.41/symbols/teletext.xpm vdr-1.3.42/symbols/teletext.xpm
--- vdr-1.3.41/symbols/teletext.xpm	2004-04-25 17:02:35.000000000 +0200
+++ vdr-1.3.42/symbols/teletext.xpm	2006-02-05 14:46:37.000000000 +0100
@@ -1,5 +1,5 @@
 /* XPM */
-static char * teletext_xpm[] = {
+static const char *const teletext_xpm[] = {
 "27 18 2 1",
 ".	c #FFFFFF",
 "+	c #000000",
diff -ruN vdr-1.3.41/symbols/volume.xpm vdr-1.3.42/symbols/volume.xpm
--- vdr-1.3.41/symbols/volume.xpm	2004-04-25 11:58:42.000000000 +0200
+++ vdr-1.3.42/symbols/volume.xpm	2006-02-05 14:46:37.000000000 +0100
@@ -1,5 +1,5 @@
 /* XPM */
-static char * volume_xpm[] = {
+static const char *const volume_xpm[] = {
 "28 14 2 1",
 ".	c #FFFFFF",
 "+	c #000000",
diff -ruN vdr-1.3.41/timers.c vdr-1.3.42/timers.c
--- vdr-1.3.41/timers.c	2006-01-28 16:09:05.000000000 +0100
+++ vdr-1.3.42/timers.c	2006-02-03 16:20:14.000000000 +0100
@@ -4,7 +4,7 @@
  * See the main source file 'vdr.c' for copyright information and
  * how to reach the author.
  *
- * $Id: timers.c 1.45 2006/01/28 15:09:05 kls Exp $
+ * $Id: timers.c 1.46 2006/02/03 15:20:14 kls Exp $
  */
 
 #include "timers.h"
@@ -535,13 +535,22 @@
 
 cTimer *cTimers::GetMatch(time_t t)
 {
+  static int LastPending = -1;
   cTimer *t0 = NULL;
   for (cTimer *ti = First(); ti; ti = Next(ti)) {
       if (!ti->Recording() && ti->Matches(t)) {
+         if (ti->Pending()) {
+            if (ti->Index() > LastPending)
+               LastPending = ti->Index();
+            else
+               continue;
+            }
          if (!t0 || ti->Priority() > t0->Priority())
             t0 = ti;
          }
       }
+  if (!t0)
+     LastPending = -1;
   return t0;
 }
 
diff -ruN vdr-1.3.41/tools.c vdr-1.3.42/tools.c
--- vdr-1.3.41/tools.c	2006-01-20 15:01:28.000000000 +0100
+++ vdr-1.3.42/tools.c	2006-02-05 12:05:56.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 1.112 2006/01/20 14:01:28 kls Exp $
+ * $Id: tools.c 1.114 2006/02/05 11:05:56 kls Exp $
  */
 
 #include "tools.h"
@@ -1054,10 +1054,9 @@
 
 // --- cUnbufferedFile -------------------------------------------------------
 
-//#define USE_FADVISE
+#define USE_FADVISE
 
-#define READ_AHEAD MEGABYTE(2)
-#define WRITE_BUFFER MEGABYTE(10)
+#define WRITE_BUFFER KILOBYTE(800)
 
 cUnbufferedFile::cUnbufferedFile(void)
 {
@@ -1073,8 +1072,17 @@
 {
   Close();
   fd = open(FileName, Flags, Mode);
-  begin = end = ahead = -1;
+  curpos = 0;
+#ifdef USE_FADVISE
+  begin = lastpos = ahead = 0;
+  cachedstart = 0;
+  cachedend = 0;
+  readahead = KILOBYTE(128);
   written = 0;
+  totwritten = 0;
+  if (fd >= 0)
+     posix_fadvise(fd, 0, 0, POSIX_FADV_RANDOM); // we could use POSIX_FADV_SEQUENTIAL, but we do our own readahead, disabling the kernel one.
+#endif
   return fd;
 }
 
@@ -1082,16 +1090,9 @@
 {
 #ifdef USE_FADVISE
   if (fd >= 0) {
-     if (ahead > end)
-        end = ahead;
-     if (begin >= 0 && end > begin) {
-        //dsyslog("close buffer: %d (flush: %d bytes, %ld-%ld)", fd, written, begin, end);
-        if (written)
-           fdatasync(fd);
-        posix_fadvise(fd, begin, end - begin, POSIX_FADV_DONTNEED);
-        }
-     begin = end = ahead = -1;
-     written = 0;
+     if (totwritten)    // if we wrote anything make sure the data has hit the disk before
+        fdatasync(fd);  // calling fadvise, as this is our last chance to un-cache it.
+     posix_fadvise(fd, 0, 0, POSIX_FADV_DONTNEED);
      }
 #endif
   int OldFd = fd;
@@ -1099,45 +1100,84 @@
   return close(OldFd);
 }
 
+// When replaying and going e.g. FF->PLAY the position jumps back 2..8M
+// hence we do not want to drop recently accessed data at once.
+// We try to handle the common cases such as PLAY->FF->PLAY, small
+// jumps, moving editing marks etc.
+
+#define FADVGRAN   KILOBYTE(4) // AKA fadvise-chunk-size; PAGE_SIZE or getpagesize(2) would also work.
+#define READCHUNK  MEGABYTE(8)
+
+void cUnbufferedFile::SetReadAhead(size_t ra)
+{
+  readahead = ra;
+}
+
+int cUnbufferedFile::FadviseDrop(off_t Offset, off_t Len)
+{
+  // rounding up the window to make sure that not PAGE_SIZE-aligned data gets freed.
+  return posix_fadvise(fd, Offset - (FADVGRAN - 1), Len + (FADVGRAN - 1) * 2, POSIX_FADV_DONTNEED);
+}
+
 off_t cUnbufferedFile::Seek(off_t Offset, int Whence)
 {
-  if (fd >= 0)
-     return lseek(fd, Offset, Whence);
-  return -1;
+  if (Whence == SEEK_SET && Offset == curpos)
+     return curpos;
+  curpos = lseek(fd, Offset, Whence);
+  return curpos;
 }
 
 ssize_t cUnbufferedFile::Read(void *Data, size_t Size)
 {
   if (fd >= 0) {
 #ifdef USE_FADVISE
-     off_t pos = lseek(fd, 0, SEEK_CUR);
-     // jump forward - adjust end position
-     if (pos > end)
-        end = pos;
-     // after adjusting end - don't clear more than previously requested
-     if (end > ahead)
-        end = ahead;
-     // jump backward - drop read ahead of previous run
-     if (pos < begin)
-        end = ahead;
-     if (begin >= 0 && end > begin)
-        posix_fadvise(fd, begin - KILOBYTE(200), end - begin + KILOBYTE(200), POSIX_FADV_DONTNEED);//XXX macros/parameters???
-     begin = pos;
+     off_t jumped = curpos-lastpos; // nonzero means we're not at the last offset
+     if ((cachedstart < cachedend) && (curpos < cachedstart || curpos > cachedend)) {
+        // current position is outside the cached window -- invalidate it.
+        FadviseDrop(cachedstart, cachedend-cachedstart);
+        cachedstart = curpos;
+        cachedend = curpos;
+        }
+     cachedstart = min(cachedstart, curpos);
 #endif
      ssize_t bytesRead = safe_read(fd, Data, Size);
 #ifdef USE_FADVISE
      if (bytesRead > 0) {
-        pos += bytesRead;
-        end = pos;
-        // this seems to trigger a non blocking read - this
-        // may or may not have been finished when we will be called next time.
-        // If it is not finished we can't release the not yet filled buffers.
-        // So this is commented out till we find a better solution.
-        //posix_fadvise(fd, pos, READ_AHEAD, POSIX_FADV_WILLNEED);
-        ahead = pos + READ_AHEAD;
+        curpos += bytesRead;
+        cachedend = max(cachedend, curpos);
+
+        // Read ahead:
+        // no jump? (allow small forward jump still inside readahead window).
+        if (jumped >= 0 && jumped <= (off_t)readahead) {
+           // Trigger the readahead IO, but only if we've used at least
+           // 1/2 of the previously requested area. This avoids calling
+           // fadvise() after every read() call.
+           if (ahead - curpos < (off_t)(readahead / 2)) {
+              posix_fadvise(fd, curpos, readahead, POSIX_FADV_WILLNEED);
+              ahead = curpos + readahead;
+              cachedend = max(cachedend, ahead);
+              }
+           if (readahead < Size * 32) { // automagically tune readahead size.
+              readahead = Size * 32;
+              }
+           }
+        else
+           ahead = curpos; // jumped -> we really don't want any readahead, otherwise e.g. fast-rewind gets in trouble.
         }
-     else
-        end = pos;
+
+     if (cachedstart < cachedend) {
+        if (curpos - cachedstart > READCHUNK * 2) {
+           // current position has moved forward enough, shrink tail window.
+           FadviseDrop(cachedstart, curpos - READCHUNK - cachedstart);
+           cachedstart = curpos - READCHUNK;
+           }
+        else if (cachedend > ahead && cachedend - curpos > READCHUNK * 2) {
+           // current position has moved back enough, shrink head window.
+           FadviseDrop(curpos + READCHUNK, cachedend - curpos + READCHUNK);
+           cachedend = curpos + READCHUNK;
+           }
+        }
+     lastpos = curpos;
 #endif
      return bytesRead;
      }
@@ -1147,28 +1187,46 @@
 ssize_t cUnbufferedFile::Write(const void *Data, size_t Size)
 {
   if (fd >=0) {
-#ifdef USE_FADVISE
-     off_t pos = lseek(fd, 0, SEEK_CUR);
-#endif
      ssize_t bytesWritten = safe_write(fd, Data, Size);
 #ifdef USE_FADVISE
-     if (bytesWritten >= 0) {
+     if (bytesWritten > 0) {
+        begin = min(begin, curpos);
+        curpos += bytesWritten;
         written += bytesWritten;
-        if (begin >= 0) {
-           if (pos < begin)
-              begin = pos;
-           }
-        else
-           begin = pos;
-        if (pos + bytesWritten > end)
-           end = pos + bytesWritten;
+        lastpos = max(lastpos, curpos);
         if (written > WRITE_BUFFER) {
-           //dsyslog("flush buffer: %d (%d bytes, %ld-%ld)", fd, written, begin, end);
-           fdatasync(fd);
-           if (begin >= 0 && end > begin)
-              posix_fadvise(fd, begin, end - begin, POSIX_FADV_DONTNEED);
-           begin = end = -1;
+           if (lastpos > begin) {
+              // Now do three things:
+              // 1) Start writeback of begin..lastpos range
+              // 2) Drop the already written range (by the previous fadvise call)
+              // 3) Handle nonpagealigned data.
+              //    This is why we double the WRITE_BUFFER; the first time around the
+              //    last (partial) page might be skipped, writeback will start only after
+              //    second call; the third call will still include this page and finally
+              //    drop it from cache.
+              off_t headdrop = min(begin, WRITE_BUFFER * 2L);
+              posix_fadvise(fd, begin - headdrop, lastpos - begin + headdrop, POSIX_FADV_DONTNEED);
+              }
+           begin = lastpos = curpos;
+           totwritten += written;
            written = 0;
+           // The above fadvise() works when writing slowly (recording), but could
+           // leave cached data around when writing at a high rate, e.g. when cutting,
+           // because by the time we try to flush the cached pages (above) the data
+           // can still be dirty - we are faster than the disk I/O.
+           // So we do another round of flushing, just like above, but at larger
+           // intervals -- this should catch any pages that couldn't be released
+           // earlier.
+           if (totwritten > MEGABYTE(32)) {
+              // It seems in some setups, fadvise() does not trigger any I/O and
+              // a fdatasync() call would be required do all the work (reiserfs with some
+              // kind of write gathering enabled), but the syncs cause (io) load..
+              // Uncomment the next line if you think you need them.
+              //fdatasync(fd);
+              off_t headdrop = min(curpos - totwritten, totwritten * 2L);
+              posix_fadvise(fd, curpos - totwritten - headdrop, totwritten + headdrop, POSIX_FADV_DONTNEED);
+              totwritten = 0;
+              }
            }
         }
 #endif
diff -ruN vdr-1.3.41/tools.h vdr-1.3.42/tools.h
--- vdr-1.3.41/tools.h	2006-01-15 17:19:56.000000000 +0100
+++ vdr-1.3.42/tools.h	2006-02-04 15:27:05.000000000 +0100
@@ -4,7 +4,7 @@
  * See the main source file 'vdr.c' for copyright information and
  * how to reach the author.
  *
- * $Id: tools.h 1.90 2006/01/15 16:19:56 kls Exp $
+ * $Id: tools.h 1.92 2006/02/04 14:27:05 kls Exp $
  */
 
 #ifndef __TOOLS_H
@@ -242,15 +242,22 @@
 class cUnbufferedFile {
 private:
   int fd;
+  off_t curpos;
+  off_t cachedstart;
+  off_t cachedend;
   off_t begin;
-  off_t end;
+  off_t lastpos;
   off_t ahead;
-  ssize_t written;
+  size_t readahead;
+  size_t written;
+  size_t totwritten;
+  int FadviseDrop(off_t Offset, off_t Len);
 public:
   cUnbufferedFile(void);
   ~cUnbufferedFile();
   int Open(const char *FileName, int Flags, mode_t Mode = DEFFILEMODE);
   int Close(void);
+  void SetReadAhead(size_t ra);
   off_t Seek(off_t Offset, int Whence);
   ssize_t Read(void *Data, size_t Size);
   ssize_t Write(const void *Data, size_t Size);
diff -ruN vdr-1.3.41/transfer.c vdr-1.3.42/transfer.c
--- vdr-1.3.41/transfer.c	2006-01-28 15:23:38.000000000 +0100
+++ vdr-1.3.42/transfer.c	2006-01-29 18:24:39.000000000 +0100
@@ -4,7 +4,7 @@
  * See the main source file 'vdr.c' for copyright information and
  * how to reach the author.
  *
- * $Id: transfer.c 1.32 2006/01/28 14:23:38 kls Exp $
+ * $Id: transfer.c 1.33 2006/01/29 17:24:39 kls Exp $
  */
 
 #include "transfer.h"
@@ -20,7 +20,6 @@
 {
   ringBuffer = new cRingBufferLinear(TRANSFERBUFSIZE, TS_SIZE * 2, true, "Transfer");
   remux = new cRemux(VPid, APids, Setup.UseDolbyDigital ? DPids : NULL, SPids);
-  needsBufferReserve = Setup.UseDolbyDigital && VPid != 0 && DPids && DPids[0] != 0;
 }
 
 cTransfer::~cTransfer()
diff -ruN vdr-1.3.41/transfer.h vdr-1.3.42/transfer.h
--- vdr-1.3.41/transfer.h	2005-08-13 12:16:02.000000000 +0200
+++ vdr-1.3.42/transfer.h	2006-01-29 18:24:43.000000000 +0100
@@ -4,7 +4,7 @@
  * See the main source file 'vdr.c' for copyright information and
  * how to reach the author.
  *
- * $Id: transfer.h 1.10 2005/08/13 10:16:02 kls Exp $
+ * $Id: transfer.h 1.11 2006/01/29 17:24:43 kls Exp $
  */
 
 #ifndef __TRANSFER_H
@@ -20,7 +20,6 @@
 private:
   cRingBufferLinear *ringBuffer;
   cRemux *remux;
-  bool needsBufferReserve;
 protected:
   virtual void Activate(bool On);
   virtual void Receive(uchar *Data, int Length);
diff -ruN vdr-1.3.41/vdr.c vdr-1.3.42/vdr.c
--- vdr-1.3.41/vdr.c	2006-01-29 15:35:31.000000000 +0100
+++ vdr-1.3.42/vdr.c	2006-02-05 13:57:10.000000000 +0100
@@ -22,7 +22,7 @@
  *
  * The project's page is at http://www.cadsoft.de/vdr
  *
- * $Id: vdr.c 1.246 2006/01/29 14:35:31 kls Exp $
+ * $Id: vdr.c 1.249 2006/02/05 12:57:10 kls Exp $
  */
 
 #include <getopt.h>
@@ -97,6 +97,10 @@
         fprintf(stderr, "vdr: cannot set user id %u: %s\n", (unsigned int)user->pw_uid, strerror(errno));
         return false;
         }
+     if (prctl(PR_SET_DUMPABLE, 2, 0, 0, 0) < 0) {
+        fprintf(stderr, "vdr: warning - cannot set dumpable: %s\n", strerror(errno));
+        // always non-fatal, and will not work with kernel < 2.6.13
+        }
      }
   return true;
 }
@@ -709,7 +713,7 @@
                   if (Channel->Modification(CHANNELMOD_RETUNE)) {
                      cRecordControls::ChannelDataModified(Channel);
                      if (Channel->Number() == cDevice::CurrentChannel()) {
-                        if (!cDevice::PrimaryDevice()->Replaying() || cTransferControl::ReceiverDevice()) {
+                        if (!cDevice::PrimaryDevice()->Replaying() || cDevice::PrimaryDevice()->Transferring()) {
                            if (cDevice::ActualDevice()->ProvidesTransponder(Channel)) { // avoids retune on devices that don't really access the transponder
                               isyslog("retuning due to modification of channel %d", Channel->Number());
                               Channels.SwitchTo(Channel->Number());
@@ -796,8 +800,12 @@
                bool WasMenu = Interact && Interact->IsMenu();
                if (Menu)
                   DELETE_MENU;
-               else if (cControl::Control() && cOsd::IsOpen())
-                  cControl::Control()->Hide();
+               else if (cControl::Control()) {
+                  if (cOsd::IsOpen())
+                     cControl::Control()->Hide();
+                  else
+                     WasOpen = false;
+                  }
                if (!WasOpen || !WasMenu && !Setup.MenuButtonCloses)
                   Menu = new cMenuMain;
                }
