diff -ruN vdr-1.3.40/CONTRIBUTORS vdr-1.3.41/CONTRIBUTORS
--- vdr-1.3.40/CONTRIBUTORS	2006-01-22 17:10:35.000000000 +0100
+++ vdr-1.3.41/CONTRIBUTORS	2006-01-29 15:57:13.000000000 +0100
@@ -269,6 +269,7 @@
 Artur Skawina <skawina@geocities.com>
  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()
 
 Werner Fink <werner@suse.de>
  for making I/O more robust by handling EINTR
@@ -545,6 +546,8 @@
  for suggesting to increase the default value for 'Min. user inactivity' to 300 minutes
  for suggesting to add cChannel::LinkChannels() and cChannel::RefChannel()
  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
 
 Jeremy Hall <jhall@UU.NET>
  for fixing an incomplete initialization of the filter parameters in eit.c
@@ -882,6 +885,7 @@
  for reporting a short display of the main menu if a plugin displays its own OSD and
  is started through a user defined key macro
  for reporting a problem with extremely long summary fields in timers
+ for reporting a bug in handling the tfRecording flag when reading timers
 
 Olivier Jacques <jacquesolivier@hotmail.com>)
  for translating OSD texts to the French language
@@ -939,6 +943,7 @@
  for reporting a crash in the Schedule menu with events that have no title
  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
 
 Ralf Klueber <ralf.klueber@vodafone.com>
  for reporting a bug in cutting a recording if there is only a single editing mark
@@ -1165,6 +1170,8 @@
  for fixing detecting if there can be any useful further input when entering channel
  numbers
  for fixing handling the '0' key for switching between the last two channels
+ for making cPatFilter::Process() check whether the channel exists before setting
+ the PMT filter
 
 Stéphane Esté-Gracias <sestegra@free.fr>
  for fixing a typo in libsi/si.h
@@ -1322,6 +1329,7 @@
 
 Arthur Konovalov <kasjas@hot.ee>
  for translating OSD texts to the Estonian language
+ for fixing a missing ',' in the Greek OSD texts
 
 Milos Kapoun <m.kapoun@cra.cz>
  for suggesting to skip code table info in SI data
@@ -1341,6 +1349,8 @@
  no longer exists
  for reporting a missing check against MAXOSDAREAS in cOsd::CanHandleAreas()
  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
 
 Sven Kreiensen <svenk@kammer.uni-hannover.de>
  for his help in keeping 'channels.conf.terr' up to date
@@ -1457,6 +1467,8 @@
  for making cDevice::AttachPlayer() keep the track language codes and descriptions
  in Transfer Mode
  for suggesting to make the "Menu" key behave consistently
+ for suggesting to implement a timeout for remote controls that don't deliver
+ "repeat" keypresses very fast
 
 Mikko Salo <mikko.salo@ppe.inet.fi>
  for suggesting to make the setup option "DVB/Video display format" available only
@@ -1480,6 +1492,8 @@
  for adding a missing #include <linux/unistd.h> to thread.c
  for adding missing i18n entry for the "Timer" button
  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
 
 Steffen Beyer <cpunk@reactor.de>
  for fixing setting the colored button help after deleting a recording in case the next
@@ -1531,6 +1545,8 @@
 
 Frank Krömmelbein <kroemmelbein@gmx.de>
  for adding missing storing of the MenuScrollPage parameter
+ for reporting a problem with channel switching with the Down (Up) key in case the
+ current channel is already the first (last) in the list
 
 Bernhard Stegmaier <bernhard.stegmaier@in.tum.de>
  for reporting a problem in cEITScanner::Process() with forced EPG scans if EPG
@@ -1683,3 +1699,14 @@
 
 Jaroslaw Swierczynski <swiergot@gmail.com>
  for updating the Polish OSD texts and the fontosd-iso8859-2.c file
+
+Alexander Hans <cleditor@arcor.de>
+ fpr reporting a crash when pressing '0' in the "Schedule" menu on a channel that
+ doesn't have any EPG data 
+
+Daniel Karsubka <dkar@gmx.de>
+ for suggesting to write the epg.data file when VDR exits
+
+Suur Karu <suurkaru@fastmail.fm>
+ for reporting a problem with the tuning timeout for channels that have low symbol
+ rates
diff -ruN vdr-1.3.40/HISTORY vdr-1.3.41/HISTORY
--- vdr-1.3.40/HISTORY	2006-01-22 17:10:13.000000000 +0100
+++ vdr-1.3.41/HISTORY	2006-01-29 15:56:50.000000000 +0100
@@ -4227,3 +4227,46 @@
 - Updated the Spanish OSD texts (thanks to Jesus Bravo Alvarez).
 - Fixed handling the '0' key for switching between the last two channels (thanks
   to Thomas Bergwinkl).
+
+2006-01-29: Version 1.3.41
+
+- EPG events from epg.data or SVDRP's PUTE command now have their Title set to
+  "No Title" if none was set.
+- Fixed checking toFile in cCuttingThread::Action() (found in a larger patch from
+  Artur Skawina).
+- Fixed a crash when pressing '0' in the "Schedule" menu on a channel that doesn't
+  have any EPG data (reported ny Alexander Hans).
+- Updated the Danish OSD texts (thanks to Mogens Elneff).
+- Fixed a missing ',' in the Greek OSD texts (thanks to Arthur Konovalov).
+- Updated the Estonian OSD texts (thanks to Arthur Konovalov).
+- Fixed handling the tfRecording flag when reading timers (bug reported by Andreas
+  Mair).
+- Now checking whether the channel exists before setting the PMT filter in
+  cPatFilter::Process() (thanks to Thomas Bergwinkl).
+- Now trying to reestablish the connection to the LIRC daemon in case it breaks
+  (thanks to Ville Skyttä).
+- Updated the Finnish OSD texts (thanks to Rolf Ahrenberg).
+- Fixed channel switching with the Down (Up) key in case the current channel is
+  already the first (last) in the list (reported by Frank Krömmelbein).
+- Removed the "buffer reserve" in Transfer Mode - it's no longer necessary with
+  recent driver/firmware versions.
+- The epg.data file is now written when VDR exits (suggested by Daniel Karsubka).
+- Fixed cTimers::GetNextActiveTimer() so that it won't return an expired timer
+  (reported by Rolf Ahrenberg).
+- Changed DVBS_TUNE_TIMEOUT and DVBC_TUNE_TIMEOUT to 9000ms to avoid problems with
+  channels that have low symbol rates (reported by Suur Karu).
+- Fixed displaying the current audio track in the channel display.
+- When reading epg.data (or data from PUTE), the version number of events with
+  table IDs smaller than 0x50 is now ignored because otherwise the current
+  running status would not be set after a restart of VDR.
+- Implemented a timeout for remote controls that don't deliver "repeat" keypresses
+  very fast (based on a suggestion by Luca Olivetti; problem with the new handling
+  of k_Repeat keypresses in channel switching reported by Udo Richter).
+- When looking for the present or following EPG event, the running status is now
+  always taken into account.
+- Now initializing the channels' schedule pointers when reading the epg.data file,
+  so that the first WhatsOn menu will come up faster.
+- If a shutdown is requested, but the shutdown script doesn't actually halt the
+  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).
diff -ruN vdr-1.3.40/Makefile vdr-1.3.41/Makefile
--- vdr-1.3.40/Makefile	2006-01-13 17:04:56.000000000 +0100
+++ vdr-1.3.41/Makefile	2006-01-29 15:50:34.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.83 2006/01/13 16:04:56 kls Exp $
+# $Id: Makefile 1.84 2006/01/29 14:50:34 kls Exp $
 
 .DELETE_ON_ERROR:
 
@@ -199,19 +199,33 @@
 
 # Install the files:
 
-install:
+install: install-bin install-conf install-doc install-plugins
+
+# VDR binary:
+
+install-bin: vdr
 	@mkdir -p $(BINDIR)
 	@cp vdr runvdr $(BINDIR)
+
+# Configuration files:
+
+install-conf:
+	@if [ ! -d $(VIDEODIR) ]; then\
+	    mkdir -p $(VIDEODIR);\
+	    cp *.conf $(VIDEODIR);\
+	    fi
+
+# Documentation:
+
+install-doc:
 	@mkdir -p $(MANDIR)/man1
 	@mkdir -p $(MANDIR)/man5
 	@gzip -c vdr.1 > $(MANDIR)/man1/vdr.1.gz
 	@gzip -c vdr.5 > $(MANDIR)/man5/vdr.5.gz
-	@if [ ! -d $(VIDEODIR) ]; then\
-            mkdir -p $(VIDEODIR);\
-            cp *.conf $(VIDEODIR);\
-            fi
 
-plugins-install:
+# Plugins:
+
+install-plugins: plugins
 	@mkdir -p $(PLUGINLIBDIR)
 	@cp $(PLUGINDIR)/lib/libvdr-*.so.$(VDRVERSION) $(PLUGINLIBDIR)
 
diff -ruN vdr-1.3.40/channels.conf vdr-1.3.41/channels.conf
--- vdr-1.3.40/channels.conf	2006-01-22 17:19:21.000000000 +0100
+++ vdr-1.3.41/channels.conf	2006-01-29 16:26:35.000000000 +0100
@@ -45,14 +45,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;515=deu:32:1801,1722,1702:10:133:2:0
-PREMIERE 2,PREM 2;PREMIERE:11797:hC34:S19.2E:27500:1791:1792=deu;1795=deu:32:1801,1722,1702:11: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 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:1801,1722,1702:9: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 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:1801,1702,1722:34:133:17:0
+DISNEY CHANNEL,DISNEY;PREMIERE:11758:hC34:S19.2E:27500:2559:2560=deu:32:1: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
diff -ruN vdr-1.3.40/config.h vdr-1.3.41/config.h
--- vdr-1.3.40/config.h	2006-01-15 17:01:48.000000000 +0100
+++ vdr-1.3.41/config.h	2006-01-27 14:27:41.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.241 2006/01/15 16:01:48 kls Exp $
+ * $Id: config.h 1.242 2006/01/27 13:27:41 kls Exp $
  */
 
 #ifndef __CONFIG_H
@@ -19,8 +19,8 @@
 #include "i18n.h"
 #include "tools.h"
 
-#define VDRVERSION  "1.3.40"
-#define VDRVERSNUM   10340  // Version * 10000 + Major * 100 + Minor
+#define VDRVERSION  "1.3.41"
+#define VDRVERSNUM   10341  // Version * 10000 + Major * 100 + Minor
 
 #define MAXPRIORITY 99
 #define MAXLIFETIME 99
diff -ruN vdr-1.3.40/cutter.c vdr-1.3.41/cutter.c
--- vdr-1.3.40/cutter.c	2005-10-31 13:26:44.000000000 +0100
+++ vdr-1.3.41/cutter.c	2006-01-27 14:45:00.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.11 2005/10/31 12:26:44 kls Exp $
+ * $Id: cutter.c 1.12 2006/01/27 13:45:00 kls Exp $
  */
 
 #include "cutter.h"
@@ -118,7 +118,7 @@
                  break;
               if (FileSize > MEGABYTE(Setup.MaxVideoFileSize)) {
                  toFile = toFileName->NextFile();
-                 if (toFile < 0) {
+                 if (!toFile) {
                     error = "toFile 1";
                     break;
                     }
@@ -158,7 +158,7 @@
                  cutIn = true;
                  if (Setup.SplitEditedFiles) {
                     toFile = toFileName->NextFile();
-                    if (toFile < 0) {
+                    if (!toFile) {
                        error = "toFile 2";
                        break;
                        }
diff -ruN vdr-1.3.40/dvbdevice.c vdr-1.3.41/dvbdevice.c
--- vdr-1.3.40/dvbdevice.c	2006-01-14 16:57:36.000000000 +0100
+++ vdr-1.3.41/dvbdevice.c	2006-01-28 16:37:01.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.150 2006/01/14 15:57:36 kls Exp $
+ * $Id: dvbdevice.c 1.151 2006/01/28 15:37:01 kls Exp $
  */
 
 #include "dvbdevice.h"
@@ -40,9 +40,9 @@
 #define DEV_DVB_AUDIO     "audio"
 #define DEV_DVB_CA        "ca"
 
-#define DVBS_TUNE_TIMEOUT  2000 //ms
+#define DVBS_TUNE_TIMEOUT  9000 //ms
 #define DVBS_LOCK_TIMEOUT  2000 //ms
-#define DVBC_TUNE_TIMEOUT  5000 //ms
+#define DVBC_TUNE_TIMEOUT  9000 //ms
 #define DVBC_LOCK_TIMEOUT  2000 //ms
 #define DVBT_TUNE_TIMEOUT  9000 //ms
 #define DVBT_LOCK_TIMEOUT  2000 //ms
diff -ruN vdr-1.3.40/dvbosd.c vdr-1.3.41/dvbosd.c
--- vdr-1.3.40/dvbosd.c	2005-12-30 16:41:54.000000000 +0100
+++ vdr-1.3.41/dvbosd.c	2006-01-28 15:24:04.000000000 +0100
@@ -4,7 +4,7 @@
  * See the main source file 'vdr.c' for copyright information and
  * how to reach the author.
  *
- * $Id: dvbosd.c 1.29 2005/12/30 15:41:54 kls Exp $
+ * $Id: dvbosd.c 1.30 2006/01/28 14:24:04 kls Exp $
  */
 
 #include "dvbosd.h"
@@ -48,13 +48,6 @@
      cap.cmd = OSD_CAP_MEMSIZE;
      if (ioctl(osdDev, OSD_GET_CAPABILITY, &cap) == 0)
         osdMem = cap.val;
-     #define FW_NEEDS_BUFFER_RESERVE_FOR_AC3
-     #ifdef FW_NEEDS_BUFFER_RESERVE_FOR_AC3
-     //XXX This is a very ugly hack to allow cDvbOsd to reduce the buffer
-     //XXX requirements in cTransfer if it detects a 4MB full featured DVB card.
-     extern bool DvbCardWith4MBofSDRAM;
-     DvbCardWith4MBofSDRAM = osdMem >= 1000000;
-     #endif
 #endif
      // must clear all windows here to avoid flashing effects - doesn't work if done
      // in Flush() only for the windows that are actually used...
diff -ruN vdr-1.3.40/epg.c vdr-1.3.41/epg.c
--- vdr-1.3.40/epg.c	2006-01-20 15:09:48.000000000 +0100
+++ vdr-1.3.41/epg.c	2006-01-29 15:17:33.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.51 2006/01/20 14:09:48 kls Exp $
+ * $Id: epg.c 1.57 2006/01/29 14:17:33 kls Exp $
  */
 
 #include "epg.h"
@@ -16,6 +16,8 @@
 #include <ctype.h>
 #include <time.h>
 
+#define RUNNINGSTATUSTIMEOUT 30 // seconds before the running status is considered unknown
+
 // --- tComponent ------------------------------------------------------------
 
 cString tComponent::ToString(void)
@@ -204,7 +206,7 @@
 
 bool cEvent::IsRunning(bool OrAboutToStart) const
 {
-  return runningStatus >= (OrAboutToStart ? SI::RunningStatusStartsInAFewSeconds : SI::RunningStatusPausing);
+  return SeenWithin(RUNNINGSTATUSTIMEOUT) && runningStatus >= (OrAboutToStart ? SI::RunningStatusStartsInAFewSeconds : SI::RunningStatusPausing);
 }
 
 cString cEvent::GetDateString(void) const
@@ -309,7 +311,8 @@
                                 Event = newEvent = new cEvent(EventID);
                              if (Event) {
                                 Event->SetTableID(TableID);
-                                Event->SetVersion(Version);
+                                if (TableID >= 0x50) // makes sure the running status flag is set from the actual data stream
+                                   Event->SetVersion(Version);
                                 Event->SetStartTime(StartTime);
                                 Event->SetDuration(Duration);
                                 if (newEvent)
@@ -318,7 +321,9 @@
                              }
                           }
                        break;
-             case 'e': Event = NULL;
+             case 'e': if (!Event->Title())
+                          Event->SetTitle(tr("No title"));
+                       Event = NULL;
                        break;
              case 'c': // to keep things simple we react on 'c' here
                        return true;
@@ -655,25 +660,22 @@
      eventsHashStartTime.Del(Event, Event->StartTime());
 }
 
-const cEvent *cSchedule::GetPresentEvent(bool CheckRunningStatus) const
+const cEvent *cSchedule::GetPresentEvent(void) const
 {
   const cEvent *pe = NULL;
   time_t now = time(NULL);
   for (cEvent *p = events.First(); p; p = events.Next(p)) {
-      if (p->StartTime() <= now && now < p->EndTime()) {
+      if (p->StartTime() <= now && now < p->EndTime())
          pe = p;
-         if (!CheckRunningStatus)
-            break;
-         }
-      if (CheckRunningStatus && p->SeenWithin(30) && p->RunningStatus() >= SI::RunningStatusPausing)
+      if (p->SeenWithin(RUNNINGSTATUSTIMEOUT) && p->RunningStatus() >= SI::RunningStatusPausing)
          return p;
       }
   return pe;
 }
 
-const cEvent *cSchedule::GetFollowingEvent(bool CheckRunningStatus) const
+const cEvent *cSchedule::GetFollowingEvent(void) const
 {
-  const cEvent *p = GetPresentEvent(CheckRunningStatus);
+  const cEvent *p = GetPresentEvent();
   if (p)
      p = events.Next(p);
   return p;
@@ -975,6 +977,11 @@
      bool result = cSchedule::Read(f, s);
      if (OwnFile)
         fclose(f);
+     if (result) {
+        // Initialize the channels' schedule pointers, so that the first WhatsOn menu will come up faster:
+        for (cChannel *Channel = Channels.First(); Channel; Channel = Channels.Next(Channel))
+            s->GetSchedule(Channel);
+        }
      return result;
      }
   return false;
diff -ruN vdr-1.3.40/epg.h vdr-1.3.41/epg.h
--- vdr-1.3.40/epg.h	2006-01-14 16:45:24.000000000 +0100
+++ vdr-1.3.41/epg.h	2006-01-29 15:03:13.000000000 +0100
@@ -7,7 +7,7 @@
  * Original version (as used in VDR before 1.3.0) written by
  * Robert Schneider <Robert.Schneider@web.de> and Rolf Hakenes <hakenes@hippomi.de>.
  *
- * $Id: epg.h 1.29 2006/01/14 15:45:24 kls Exp $
+ * $Id: epg.h 1.30 2006/01/29 14:03:13 kls Exp $
  */
 
 #ifndef __EPG_H
@@ -137,8 +137,8 @@
   void HashEvent(cEvent *Event);
   void UnhashEvent(cEvent *Event);
   const cList<cEvent> *Events(void) const { return &events; }
-  const cEvent *GetPresentEvent(bool CheckRunningStatus = false) const;
-  const cEvent *GetFollowingEvent(bool CheckRunningStatus = false) const;
+  const cEvent *GetPresentEvent(void) const;
+  const cEvent *GetFollowingEvent(void) const;
   const cEvent *GetEvent(u_int16_t EventID, time_t StartTime = 0) const;
   const cEvent *GetEventAround(time_t Time) const;
   void Dump(FILE *f, const char *Prefix = "", eDumpMode DumpMode = dmAll, time_t AtTime = 0) const;
diff -ruN vdr-1.3.40/i18n.c vdr-1.3.41/i18n.c
--- vdr-1.3.40/i18n.c	2006-01-22 16:55:28.000000000 +0100
+++ vdr-1.3.41/i18n.c	2006-01-28 11:38:33.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.240 2006/01/22 15:55:28 kls Exp $
+ * $Id: i18n.c 1.244 2006/01/28 10:38:33 kls Exp $
  *
  * Translations provided by:
  *
@@ -460,7 +460,7 @@
     "",//TODO
     "",//TODO
     "See sündmus - %s",
-    "",//TODO
+    "Denne udsendelse - %s",
   },
   { "This event - all channels",
     "Diese Sendung - alle Kanäle",
@@ -481,7 +481,7 @@
     "",//TODO
     "",//TODO
     "See sündmus - kõik kanalid",
-    "",//TODO
+    "Denne udsendelse - alle kanaler",
   },
   { "All events - all channels",
     "Alle Sendungen - alle Kanäle",
@@ -502,7 +502,7 @@
     "",//TODO
     "",//TODO
     "Kõik sündmused - kõik kanalid",
-    "",//TODO
+    "Alle udsendelser - alle kanaler",
   },
   { "What's on now?",
     "Was läuft jetzt?",
@@ -692,7 +692,7 @@
     "",// TODO
     "",// TODO
     "Taimer",
-    "",// TODO
+    "Timer",
   },
   { "Button$Record",
     "Aufnehmen",
@@ -1597,7 +1597,7 @@
     "",//TODO
     "",//TODO
     "FTA",
-    "",//TODO
+    "Free To Air",
   },
   { "encrypted",
     "verschlüsselt",
@@ -1618,7 +1618,7 @@
     "",//TODO
     "",//TODO
     "krüptitud",
-    "",//TODO
+    "kodet",
   },
   { "Sid",
     "Sid",
@@ -2344,6 +2344,7 @@
     "",//TODO
     "",//TODO
     "",//TODO
+    "Tallennustilan puute estää tallennuksen!",
     "",//TODO
     "",//TODO
     "",//TODO
@@ -2353,9 +2354,8 @@
     "",//TODO
     "",//TODO
     "",//TODO
-    "",//TODO
-    "",//TODO
-    "",//TODO
+    "Ebapiisavalt kettaruumi salvestamise alustamiseks!",
+    "For lidt harddisk plads til optagelse!",
   },
   { "Low disk space!",
     "Platte beinahe voll!",
@@ -2958,7 +2958,7 @@
     "ei koskaan",
     "nigdy",
     "nunca",
-    "ÐïôÝ"
+    "ÐïôÝ",
     "aldrig",
     "niciodatã",
     "",// TODO
@@ -3092,7 +3092,7 @@
     "", // TODO
     "", // TODO
     "Kanaliinfo kuvamise ajapiirang",
-    "", // TODO
+    "Timeout ved anmodet kanal info",
   },
   { "Setup.OSD$Scroll pages",
     "Seitenweise scrollen",
@@ -3155,7 +3155,7 @@
     "",// TODO
     "",// TODO
     "Sulgemine Menüü klahviga",
-    "",// TODO
+    "Menu taste lukker",
   },
   { "Setup.OSD$Sort timers",
     "Timer sortieren",
@@ -3616,7 +3616,7 @@
     "",//TODO
     "¿àÕÔßÞçØâÐÕÜëÕ ï×ëÚØ (×ÒãÚ)",
     "Audio jezici",
-    "Audio keeled",
+    "Audio keeli",
     "Audio sprog (ant.)",
   },
   { "Setup.DVB$Audio language",  // note the singular
@@ -4292,7 +4292,7 @@
     "",//TODO
     "",//TODO
     " 0\t-.#~,/_@1\tabcäå2\tdef3\tghi4\tjkl5\tmnoõö6\tpqrsð7\ttuvü8\twxyzþ9",
-    "",//TODO
+    " 0\t-.#~,/_@1\tabcæå2\tdef3\tghi4\tjkl5\tmnoø6\tpqrs7\ttuv8\twxyz9",
   },
   // Learning keys:
   { "Learning Remote Control Keys",
@@ -5534,7 +5534,7 @@
     "",//TODO
     "",//TODO
     "Salvestamine algas",
-    "",//TODO
+    "Optagelse startet",
   },
   { "Pausing live video...",
     "Live-Signal wird angehalten...",
diff -ruN vdr-1.3.40/interface.c vdr-1.3.41/interface.c
--- vdr-1.3.40/interface.c	2006-01-04 16:44:19.000000000 +0100
+++ vdr-1.3.41/interface.c	2006-01-29 13:35:50.000000000 +0100
@@ -4,7 +4,7 @@
  * See the main source file 'vdr.c' for copyright information and
  * how to reach the author.
  *
- * $Id: interface.c 1.71 2006/01/04 15:44:19 kls Exp $
+ * $Id: interface.c 1.73 2006/01/29 12:35:50 kls Exp $
  */
 
 #include "interface.h"
diff -ruN vdr-1.3.40/lirc.c vdr-1.3.41/lirc.c
--- vdr-1.3.40/lirc.c	2005-09-02 14:51:35.000000000 +0200
+++ vdr-1.3.41/lirc.c	2006-01-27 16:59:47.000000000 +0100
@@ -6,35 +6,28 @@
  *
  * LIRC support added by Carsten Koch <Carsten.Koch@icem.de>  2000-06-16.
  *
- * $Id: lirc.c 1.13 2005/09/02 12:51:35 kls Exp $
+ * $Id: lirc.c 1.14 2006/01/27 15:59:47 kls Exp $
  */
 
 #include "lirc.h"
 #include <netinet/in.h>
 #include <sys/socket.h>
-#include <sys/un.h>
 
 #define REPEATLIMIT  20 // ms
 #define REPEATDELAY 350 // ms
 #define KEYPRESSDELAY 150 // ms
+#define RECONNECTDELAY 3000 // ms
 
 cLircRemote::cLircRemote(const char *DeviceName)
 :cRemote("LIRC")
 ,cThread("LIRC remote control")
 {
-  struct sockaddr_un addr;
   addr.sun_family = AF_UNIX;
   strcpy(addr.sun_path, DeviceName);
-  if ((f = socket(AF_UNIX, SOCK_STREAM, 0)) >= 0) {
-     if (connect(f, (struct sockaddr *)&addr, sizeof(addr)) >= 0) {
-        Start();
-        return;
-        }
-     LOG_ERROR_STR(DeviceName);
-     close(f);
+  if (Connect()) {
+     Start();
+     return;
      }
-  else
-     LOG_ERROR_STR(DeviceName);
   f = -1;
 }
 
@@ -47,6 +40,20 @@
      close(fh);
 }
 
+bool cLircRemote::Connect(void)
+{
+  if ((f = socket(AF_UNIX, SOCK_STREAM, 0)) >= 0) {
+     if (connect(f, (struct sockaddr *)&addr, sizeof(addr)) >= 0)
+        return true;
+     LOG_ERROR_STR(addr.sun_path);
+     close(f);
+     f = -1;
+     }
+  else
+     LOG_ERROR_STR(addr.sun_path);
+  return false;
+}
+
 bool cLircRemote::Ready(void)
 {
   return f >= 0;
@@ -67,10 +74,16 @@
         int ret = ready ? safe_read(f, buf, sizeof(buf)) : -1;
 
         if (ready && ret <= 0 ) {
-           esyslog("ERROR: lircd connection lost");
+           esyslog("ERROR: lircd connection broken, trying to reconnect every %.1f seconds", float(RECONNECTDELAY) / 1000);
            close(f);
            f = -1;
-           break;
+           while (Running() && f < 0) {
+                 cCondWait::SleepMs(RECONNECTDELAY);
+                 if (Connect()) {
+                    isyslog("reconnected to lircd");
+                    break;
+                    }
+                 }
            }
 
         if (ready && ret > 21) {
diff -ruN vdr-1.3.40/lirc.h vdr-1.3.41/lirc.h
--- vdr-1.3.40/lirc.h	2005-07-31 12:18:15.000000000 +0200
+++ vdr-1.3.41/lirc.h	2006-01-27 17:00:19.000000000 +0100
@@ -4,12 +4,13 @@
  * See the main source file 'vdr.c' for copyright information and
  * how to reach the author.
  *
- * $Id: lirc.h 1.3 2005/07/31 10:18:15 kls Exp $
+ * $Id: lirc.h 1.4 2006/01/27 16:00:19 kls Exp $
  */
 
 #ifndef __LIRC_H
 #define __LIRC_H
 
+#include <sys/un.h>
 #include "remote.h"
 #include "thread.h"
 
@@ -17,7 +18,9 @@
 private:
   enum { LIRC_KEY_BUF = 30, LIRC_BUFFER_SIZE = 128 };
   int f;
+  struct sockaddr_un addr;
   virtual void Action(void);
+  bool Connect(void);
 public:
   cLircRemote(const char *DeviceName);
   virtual ~cLircRemote();
diff -ruN vdr-1.3.40/menu.c vdr-1.3.41/menu.c
--- vdr-1.3.40/menu.c	2006-01-22 17:06:39.000000000 +0100
+++ vdr-1.3.41/menu.c	2006-01-29 15:04:37.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.403 2006/01/22 16:06:39 kls Exp $
+ * $Id: menu.c 1.407 2006/01/29 14:04:37 kls Exp $
  */
 
 #include "menu.h"
@@ -1245,7 +1245,7 @@
   if (schedules && Channel) {
      const cSchedule *Schedule = schedules->GetSchedule(Channel);
      if (Schedule) {
-        const cEvent *PresentEvent = Event ? Event : Schedule->GetPresentEvent(Channel->Number() == cDevice::CurrentChannel());
+        const cEvent *PresentEvent = Event ? Event : Schedule->GetPresentEvent();
         time_t now = time(NULL) - Setup.EPGLinger * 60;
         for (const cEvent *ev = Schedule->Events()->First(); ev; ev = Schedule->Events()->Next(ev)) {
             if (ev->EndTime() > now || ev == PresentEvent)
@@ -1352,6 +1352,8 @@
      Event = CurrentItem->event;
      Channel = Channels.GetByChannelID(Event->ChannelID(), true);
      }
+  else
+     Channel = Channels.GetByNumber(cDevice::CurrentChannel());
   switch (cMenuScheduleItem::SortMode()) {
     case cMenuScheduleItem::ssmAllThis:  PrepareScheduleAllThis(Event, Channel); break;
     case cMenuScheduleItem::ssmThisThis: PrepareScheduleThisThis(Event, Channel); break;
@@ -2954,19 +2956,19 @@
 
 // --- SetTrackDescriptions --------------------------------------------------
 
-static void SetTrackDescriptions(bool Live)
+static void SetTrackDescriptions(int LiveChannel)
 {
   cDevice::PrimaryDevice()->ClrAvailableTracks(true);
   const cComponents *Components = NULL;
   cSchedulesLock SchedulesLock;
-  if (Live) {
-     cChannel *Channel = Channels.GetByNumber(cDevice::CurrentChannel());
+  if (LiveChannel) {
+     cChannel *Channel = Channels.GetByNumber(LiveChannel);
      if (Channel) {
         const cSchedules *Schedules = cSchedules::Schedules(SchedulesLock);
         if (Schedules) {
            const cSchedule *Schedule = Schedules->GetSchedule(Channel);
            if (Schedule) {
-              const cEvent *Present = Schedule->GetPresentEvent(true);
+              const cEvent *Present = Schedule->GetPresentEvent();
               if (Present)
                  Components = Present->Components();
               }
@@ -3056,10 +3058,10 @@
      if (Schedules) {
         const cSchedule *Schedule = Schedules->GetSchedule(channel);
         if (Schedule) {
-           const cEvent *Present = Schedule->GetPresentEvent(true);
-           const cEvent *Following = Schedule->GetFollowingEvent(true);
+           const cEvent *Present = Schedule->GetPresentEvent();
+           const cEvent *Following = Schedule->GetFollowingEvent();
            if (Present != lastPresent || Following != lastFollowing) {
-              SetTrackDescriptions(true);
+              SetTrackDescriptions(channel->Number());
               displayChannel->SetEvents(Present, Following);
               cStatus::MsgOsdProgramme(Present ? Present->StartTime() : 0, Present ? Present->Title() : NULL, Present ? Present->ShortText() : NULL, Following ? Following->StartTime() : 0, Following ? Following->Title() : NULL, Following ? Following->ShortText() : NULL);
               lastPresent = Present;
@@ -3172,13 +3174,15 @@
          cChannel *ch = NextAvailableChannel(channel, (k == kUp || k == kChanUp) ? 1 : -1);
          if (ch)
             channel = ch;
+         else if (channel && channel->Number() != cDevice::CurrentChannel())
+            Key = k; // immediately switches channel when hitting the beginning/end of the channel list with k_Repeat
          }
          // no break here
     case kUp|k_Release:
     case kDown|k_Release:
     case kChanUp|k_Release:
     case kChanDn|k_Release:
-         if (!(Key & k_Repeat) && channel)
+         if (!(Key & k_Repeat) && channel && channel->Number() != cDevice::CurrentChannel())
             NewChannel = channel;
          withInfo = true;
          group = -1;
@@ -3235,7 +3239,9 @@
      DisplayInfo();
      displayChannel->Flush();
      if (NewChannel) {
+        SetTrackDescriptions(NewChannel->Number()); // to make them immediately visible in the channel display
         Channels.SwitchTo(NewChannel->Number());
+        SetTrackDescriptions(NewChannel->Number()); // switching the channel has cleared them
         channel = NewChannel;
         }
      return osContinue;
@@ -3320,7 +3326,7 @@
 :cOsdObject(true)
 {
   cDevice::PrimaryDevice()->EnsureAudioTrack();
-  SetTrackDescriptions(!cDevice::PrimaryDevice()->Replaying() || cTransferControl::ReceiverDevice());
+  SetTrackDescriptions(!cDevice::PrimaryDevice()->Replaying() || cTransferControl::ReceiverDevice() ? cDevice::CurrentChannel() : 0);
   currentDisplayTracks = this;
   numTracks = track = 0;
   audioChannel = cDevice::PrimaryDevice()->GetAudioChannel();
diff -ruN vdr-1.3.40/pat.c vdr-1.3.41/pat.c
--- vdr-1.3.40/pat.c	2005-09-04 16:32:39.000000000 +0200
+++ vdr-1.3.41/pat.c	2006-01-27 16:48:29.000000000 +0100
@@ -4,7 +4,7 @@
  * See the main source file 'vdr.c' for copyright information and
  * how to reach the author.
  *
- * $Id: pat.c 1.14 2005/09/04 14:32:39 kls Exp $
+ * $Id: pat.c 1.15 2006/01/27 15:48:29 kls Exp $
  */
 
 #include "pat.h"
@@ -287,7 +287,7 @@
            int Index = 0;
            for (SI::Loop::Iterator it; pat.associationLoop.getNext(assoc, it); ) {
                if (!assoc.isNITPid()) {
-                  if (Index++ == pmtIndex) {
+                  if (Index++ >= pmtIndex && Channels.GetByServiceID(Source(), Transponder(), assoc.getServiceId())) {
                      pmtPid = assoc.getPid();
                      Add(pmtPid, 0x02);
                      break;
diff -ruN vdr-1.3.40/remote.c vdr-1.3.41/remote.c
--- vdr-1.3.40/remote.c	2006-01-15 16:17:40.000000000 +0100
+++ vdr-1.3.41/remote.c	2006-01-29 15:43:07.000000000 +0100
@@ -4,7 +4,7 @@
  * See the main source file 'vdr.c' for copyright information and
  * how to reach the author.
  *
- * $Id: remote.c 1.48 2006/01/15 15:17:40 kls Exp $
+ * $Id: remote.c 1.49 2006/01/29 14:43:07 kls Exp $
  */
 
 #include "remote.h"
@@ -18,11 +18,13 @@
 
 // --- cRemote ---------------------------------------------------------------
 
-#define INITTIMEOUT 10000 // ms
+#define INITTIMEOUT   10000 // ms
+#define REPEATTIMEOUT  1000 // ms
 
 eKeys cRemote::keys[MaxKeys];
 int cRemote::in = 0;
 int cRemote::out = 0;
+cTimeMs cRemote::repeatTimeout;
 cRemote *cRemote::learning = NULL;
 char *cRemote::unknownCode = NULL;
 cMutex cRemote::mutex;
@@ -163,9 +165,11 @@
          eKeys k = keys[out];
          if (++out >= MaxKeys)
             out = 0;
+         if ((k & k_Repeat) != 0)
+            repeatTimeout.Set(REPEATTIMEOUT);
          return k;
          }
-      else if (!WaitMs || !keyPressed.TimedWait(mutex, WaitMs)) {
+      else if (!WaitMs || !keyPressed.TimedWait(mutex, WaitMs) && repeatTimeout.TimedOut()) {
          if (learning && UnknownCode) {
             *UnknownCode = unknownCode;
             unknownCode = NULL;
diff -ruN vdr-1.3.40/remote.h vdr-1.3.41/remote.h
--- vdr-1.3.40/remote.h	2006-01-01 15:00:50.000000000 +0100
+++ vdr-1.3.41/remote.h	2006-01-29 13:27:08.000000000 +0100
@@ -4,7 +4,7 @@
  * See the main source file 'vdr.c' for copyright information and
  * how to reach the author.
  *
- * $Id: remote.h 1.32 2006/01/01 14:00:50 kls Exp $
+ * $Id: remote.h 1.33 2006/01/29 12:27:08 kls Exp $
  */
 
 #ifndef __REMOTE_H
@@ -23,6 +23,7 @@
   static eKeys keys[MaxKeys];
   static int in;
   static int out;
+  static cTimeMs repeatTimeout;
   static cRemote *learning;
   static char *unknownCode;
   static cMutex mutex;
diff -ruN vdr-1.3.40/thread.c vdr-1.3.41/thread.c
--- vdr-1.3.40/thread.c	2006-01-08 17:03:56.000000000 +0100
+++ vdr-1.3.41/thread.c	2006-01-28 12:34:35.000000000 +0100
@@ -4,7 +4,7 @@
  * See the main source file 'vdr.c' for copyright information and
  * how to reach the author.
  *
- * $Id: thread.c 1.51 2006/01/08 16:03:56 kls Exp $
+ * $Id: thread.c 1.52 2006/01/28 11:34:35 kls Exp $
  */
 
 #include "thread.h"
@@ -105,7 +105,7 @@
   if (Mutex.locked) {
      int locked = Mutex.locked;
      Mutex.locked = 0; // have to clear the locked count here, as pthread_cond_wait
-                       // does an implizit unlock of the mutex
+                       // does an implicit unlock of the mutex
      pthread_cond_wait(&cond, &Mutex.mutex);
      Mutex.locked = locked;
      }
@@ -113,14 +113,14 @@
 
 bool cCondVar::TimedWait(cMutex &Mutex, int TimeoutMs)
 {
-  bool r = true; // true = condition signaled false = timeout
+  bool r = true; // true = condition signaled, false = timeout
 
   if (Mutex.locked) {
      struct timespec abstime;
      if (GetAbsTime(&abstime, TimeoutMs)) {
         int locked = Mutex.locked;
         Mutex.locked = 0; // have to clear the locked count here, as pthread_cond_timedwait
-                          // does an implizit unlock of the mutex.
+                          // does an implicit unlock of the mutex.
         if (pthread_cond_timedwait(&cond, &Mutex.mutex, &abstime) == ETIMEDOUT)
            r = false;
         Mutex.locked = locked;
diff -ruN vdr-1.3.40/timers.c vdr-1.3.41/timers.c
--- vdr-1.3.40/timers.c	2006-01-15 14:31:11.000000000 +0100
+++ vdr-1.3.41/timers.c	2006-01-28 16:09:05.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.43 2006/01/15 13:31:11 kls Exp $
+ * $Id: timers.c 1.45 2006/01/28 15:09:05 kls Exp $
  */
 
 #include "timers.h"
@@ -245,6 +245,7 @@
      }
   bool result = false;
   if (8 <= sscanf(s, "%u :%a[^:]:%a[^:]:%d :%d :%d :%d :%a[^:\n]:%a[^\n]", &flags, &channelbuffer, &daybuffer, &start, &stop, &priority, &lifetime, &filebuffer, &summary)) {
+     ClrFlags(tfRecording);
      if (summary && !*skipspace(summary)) {
         free(summary);
         summary = NULL;
@@ -566,7 +567,7 @@
 {
   cTimer *t0 = NULL;
   for (cTimer *ti = First(); ti; ti = Next(ti)) {
-      if ((ti->HasFlags(tfActive)) && (!t0 || ti->Compare(*t0) < 0))
+      if ((ti->HasFlags(tfActive)) && (!t0 || ti->StopTime() > time(NULL) && ti->Compare(*t0) < 0))
          t0 = ti;
       }
   return t0;
diff -ruN vdr-1.3.40/transfer.c vdr-1.3.41/transfer.c
--- vdr-1.3.40/transfer.c	2006-01-21 15:13:16.000000000 +0100
+++ vdr-1.3.41/transfer.c	2006-01-28 15:23:38.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.31 2006/01/21 14:13:16 kls Exp $
+ * $Id: transfer.c 1.32 2006/01/28 14:23:38 kls Exp $
  */
 
 #include "transfer.h"
@@ -49,41 +49,12 @@
      }
 }
 
-#define FW_NEEDS_BUFFER_RESERVE_FOR_AC3
-#ifdef FW_NEEDS_BUFFER_RESERVE_FOR_AC3
-//XXX This is a very ugly hack to allow cDvbOsd to reduce the buffer
-//XXX requirements in cTransfer if it detects a 4MB full featured DVB card.
-bool DvbCardWith4MBofSDRAM = false;
-#endif
-
 void cTransfer::Action(void)
 {
   int PollTimeouts = 0;
   uchar *p = NULL;
   int Result = 0;
-#ifdef FW_NEEDS_BUFFER_RESERVE_FOR_AC3
-  bool GotBufferReserve = false;
-  GotBufferReserve = true; //XXX remove this line if you absolutely need the buffer reserve
-  int RequiredBufferReserve = KILOBYTE(DvbCardWith4MBofSDRAM ? 288 : 576);
-#endif
   while (Running()) {
-#ifdef FW_NEEDS_BUFFER_RESERVE_FOR_AC3
-        if (needsBufferReserve && !GotBufferReserve) {
-           //XXX For dolby we've to fill the buffer because the firmware does
-           //XXX not decode dolby but use a PCM stream for transport, therefore
-           //XXX the firmware has not enough buffer for noiseless skipping early
-           //XXX PCM samples (each dolby frame requires 6144 bytes in PCM and
-           //XXX audio is mostly to early in comparison to video).
-           //XXX To resolve this, the remuxer or PlayPes() should synchronize
-           //XXX audio with the video frames. 2004/09/09 Werner
-           if (ringBuffer->Available() < RequiredBufferReserve) { // used to be MAXFRAMESIZE, but the HDTV value of KILOBYTE(512) is way too much here
-              cCondWait::SleepMs(20); // allow the buffer to collect some reserve
-              continue;
-              }
-           else
-              GotBufferReserve = true;
-           }
-#endif
         int Count;
         uchar *b = ringBuffer->Get(Count);
         if (b) {
@@ -98,9 +69,6 @@
               remux->Clear();
               PlayPes(NULL, 0);
               p = NULL;
-#ifdef FW_NEEDS_BUFFER_RESERVE_FOR_AC3
-              GotBufferReserve = false;
-#endif
               continue;
               }
            Count = remux->Put(b, Count);
@@ -133,9 +101,6 @@
                  remux->Clear();
                  PlayPes(NULL, 0);
                  p = NULL;
-#ifdef FW_NEEDS_BUFFER_RESERVE_FOR_AC3
-                 GotBufferReserve = false;
-#endif
                  }
               }
            }
diff -ruN vdr-1.3.40/vdr.5 vdr-1.3.41/vdr.5
--- vdr-1.3.40/vdr.5	2006-01-14 11:57:37.000000000 +0100
+++ vdr-1.3.41/vdr.5	2006-01-29 12:31:58.000000000 +0100
@@ -8,7 +8,7 @@
 .\" License as specified in the file COPYING that comes with the
 .\" vdr distribution.
 .\"
-.\" $Id: vdr.5 1.47 2006/01/14 10:57:37 kls Exp $
+.\" $Id: vdr.5 1.48 2006/01/29 11:31:58 kls Exp $
 .\"
 .TH vdr 5 "08 Jan 2006" "1.3.38" "Video Disk Recorder Files"
 .SH NAME
@@ -635,7 +635,7 @@
 <start time>   @is the time (as a time_t integer) in UTC when this event starts
 <duration>     @is the time (in seconds) that this event will take
 <table id>     @is a hex number that indicates the table this event is contained in (if this is left empty or 0 this event will not be overwritten or modified by data that comes from the DVB stream)
-<version>      @is a hex number that indicates the event's version number inside its table (optional)
+<version>      @is a hex number that indicates the event's version number inside its table (optional, only processed for table IDs smaller than 0x50)
 <title>        @is the title of the event
 <short text>   @is the short text of the event (typically the name of the episode etc.)
 <description>  @is the description of the event (any '|' characters will be interpreted as newlines)
diff -ruN vdr-1.3.40/vdr.c vdr-1.3.41/vdr.c
--- vdr-1.3.40/vdr.c	2006-01-22 16:59:13.000000000 +0100
+++ vdr-1.3.41/vdr.c	2006-01-29 15:35:31.000000000 +0100
@@ -22,7 +22,7 @@
  *
  * The project's page is at http://www.cadsoft.de/vdr
  *
- * $Id: vdr.c 1.244 2006/01/22 15:59:13 kls Exp $
+ * $Id: vdr.c 1.246 2006/01/29 14:35:31 kls Exp $
  */
 
 #include <getopt.h>
@@ -71,6 +71,7 @@
                               // in order to react on a possible new CAM menu as soon as possible
 #define DEVICEREADYTIMEOUT 30 // seconds to wait until all devices are ready
 #define MENUTIMEOUT       120 // seconds of user inactivity after which an OSD display is closed
+#define SHUTDOWNRETRY     300 // seconds before trying again to shut down
 
 #define EXIT(v) { ExitCode = (v); goto Exit; }
 
@@ -1087,7 +1088,7 @@
                        if (signal(SIGALRM, Watchdog) == SIG_IGN)
                           signal(SIGALRM, SIG_IGN);
                        }
-                    LastActivity = time(NULL); // don't try again too soon
+                    LastActivity = time(NULL) - Setup.MinUserInactivity * 60 + SHUTDOWNRETRY; // try again later
                     UserShutdown = false;
                     continue; // skip the rest of the housekeeping for now
                     }
@@ -1122,6 +1123,7 @@
      }
   cDevice::Shutdown();
   PluginManager.Shutdown();
+  cSchedules::Cleanup(true);
   ReportEpgBugFixStats();
   if (WatchdogTimeout > 0)
      dsyslog("max. latency time %d seconds", MaxLatencyTime);
