diff -u vdr-1.4.4-vanilla/vdr.c vdr-1.4.4-new/vdr.c
--- vdr-1.4.4-vanilla/vdr.c	2006-10-14 12:01:32.000000000 +0200
+++ vdr-1.4.4-new/vdr.c	2006-12-08 19:51:36.000000000 +0100
@@ -1012,18 +1012,46 @@
                   break;
                   }
                LastActivity = 1; // not 0, see below!
-               UserShutdown = true;
                if (cRecordControls::Active()) {
+                  if (!UserShutdown) {
+                     Skins.Message(mtInfo, tr("Activated standby after current recording"));
+                     UserShutdown = true;
+                     break;
+                  } else
                   if (!Interface->Confirm(tr("Recording - shut down anyway?")))
                      break;
-                  }
+               }
+               UserShutdown = true;
                if (cPluginManager::Active(tr("shut down anyway?")))
                   break;
-               if (!cRecordControls::Active()) {
+               if (cRecordControls::Active()) {
+                  // Stop all running timers
+                  time_t Now = time(NULL);
+                  cTimer *timer = Timers.GetNextActiveTimer();
+                  time_t Next = timer ? timer->StartTime() : 0;
+                  while (timer && Next - Now < 0) {
+                        if (timer->IsSingleEvent())
+                           timer->ClrFlags(tfActive);
+                        else
+                           timer->Skip();
+                        timer->Matches();
+
+                        cTimer *nextTimer = Timers.GetNextActiveTimer();
+                        time_t nextNext = nextTimer ? nextTimer->StartTime() : 0;
+                        if (nextNext < Next || (nextNext == Next && nextTimer == timer)) {
+                           esyslog("Loop detected while disabling running timers");
+                           break;
+                           }
+                        Next=nextNext;
+                        timer=nextTimer;
+                        }
+                  Timers.SetModified();
+              }
+              else {
                   cTimer *timer = Timers.GetNextActiveTimer();
                   time_t Next  = timer ? timer->StartTime() : 0;
                   time_t Delta = timer ? Next - time(NULL) : 0;
-                  if (Next && Delta <= Setup.MinEventTimeout * 60) {
+                  if (Next && Delta <= Setup.MinEventTimeout * 60 && !AutoShutdown) {
                      char *buf;
                      asprintf(&buf, tr("Recording in %ld minutes, shut down anyway?"), Delta / 60);
                      bool confirm = Interface->Confirm(buf);
@@ -1172,19 +1200,21 @@
                     else
                        LastActivity = 1;
                     }
+                 /* This one manipulates starttime, we don't want that
                  if (timer && Delta < Setup.MinEventTimeout * 60 && ForceShutdown) {
                     Delta = Setup.MinEventTimeout * 60;
                     Next = Now + Delta;
                     timer = NULL;
                     dsyslog("reboot at %s", *TimeToString(Next));
                     }
+                 */
                  if (!Next || Delta > Setup.MinEventTimeout * 60 || ForceShutdown) {
                     ForceShutdown = false;
                     if (timer)
                        dsyslog("next timer event at %s", *TimeToString(Next));
                     if (WatchdogTimeout > 0)
                        signal(SIGALRM, SIG_IGN);
-                    if (Interface->Confirm(tr("Press any key to cancel shutdown"), UserShutdown ? 5 : SHUTDOWNWAIT, true)) {
+                    if (Interface->Confirm(tr("Activating standby"), UserShutdown ? 2 : SHUTDOWNWAIT, true)) {
                        cControl::Shutdown();
                        int Channel = timer ? timer->Channel()->Number() : 0;
                        const char *File = timer ? timer->File() : "";
@@ -1195,6 +1225,7 @@
                        isyslog("executing '%s'", cmd);
                        SystemExec(cmd);
                        free(cmd);
+                       Interrupted=1; // use this to make vdr shut down without "kill -1"
                        LastActivity = time(NULL) - Setup.MinUserInactivity * 60 + SHUTDOWNRETRY; // try again later
                        }
                     else {
Nur in vdr-1.4.4-new: vdr.c.orig.
