--- menu.c.orig	2006-01-28 20:55:45.983271058 +0100
+++ menu.c	2006-01-28 20:56:33.178294368 +0100
@@ -3222,6 +3222,7 @@
     case kChanUp:
     case kChanDn|k_Repeat:
     case kChanDn: {
+         if (Key & k_Repeat) number=-1;
          eKeys k = NORMALKEY(Key);
          cChannel *ch = NextAvailableChannel(channel, (k == kUp || k == kChanUp) ? 1 : -1);
          if (ch)
@@ -3236,11 +3237,18 @@
             NewChannel = channel;
          withInfo = true;
          group = -1;
-         number = 0;
+         if (Key & k_Release) number = 0;
          Refresh();
          break;
     case kNone:
-         if (number && lastTime.Elapsed() > DIRECTCHANNELTIMEOUT) {
+         if (number < 0 && lastTime.Elapsed() > DIRECTCHANNELTIMEOUT) {
+           if (channel) NewChannel = channel;
+           number=0;
+           withInfo = true;
+           Refresh();
+           lastTime.Set();
+           }
+         if (number > 0 && lastTime.Elapsed() > DIRECTCHANNELTIMEOUT) {
             channel = Channels.GetByNumber(number);
             if (channel)
                NewChannel = channel;
@@ -3280,7 +3288,7 @@
             }
     };
   if (!timeout || lastTime.Elapsed() < (uint64)(Setup.ChannelInfoTime * 1000)) {
-     if (Key == kNone && !number && group < 0 && !NewChannel && channel && channel->Number() != cDevice::CurrentChannel()) {
+     if (Key == kNone && number == 0 && group < 0 && !NewChannel && channel && channel->Number() != cDevice::CurrentChannel()) {
         // makes sure a channel switch through the SVDRP CHAN command is displayed
         channel = Channels.GetByNumber(cDevice::CurrentChannel());
         Refresh();
