diff -Nup vdr-1.5.12/channels.c vdr-1.5.12mod/channels.c
--- vdr-1.5.12/channels.c	2007-10-13 01:40:53.000000000 +1100
+++ vdr-1.5.12mod/channels.c	2008-01-08 23:41:56.000000000 +1000
@@ -876,6 +876,7 @@ cChannels::cChannels(void)
   modified = CHANNELSMOD_NONE;
 }
 
+
 void cChannels::DeleteDuplicateChannels(void)
 {
   cList<cChannelSorter> ChannelSorter;
@@ -887,12 +888,21 @@ void cChannels::DeleteDuplicateChannels(
   cChannelSorter *cs = ChannelSorter.First();
   while (cs) {
         cChannelSorter *next = ChannelSorter.Next(cs);
-        if (next && cs->channelID == next->channelID) {
+        if (next && cs->channelID == next->channelID && cs->channel->Transponder() == next->channel->Transponder() && !strcmp(cs->channel->PluginParam(), next->channel->PluginParam()) ) {
            dsyslog("deleting duplicate channel %s", *next->channel->ToText());
            Del(next->channel);
            }
-        cs = next;
-        }
+        else  if (next && cs->channelID == next->channelID) {
+           dsyslog("deleting duplicate id %s", *next->channel->ToText());
+           int sid = cs->channel->Sid();
+           int nid = cs->channel->Nid();
+           int tid = cs->channel->Tid();
+           int rid = cs->channel->Rid();
+           next->channel->SetId(nid, tid, sid, rid+1);
+           }
+       cs = next;
+       }
+       Channels.Save();
 }
 
 bool cChannels::Load(const char *FileName, bool AllowComments, bool MustExist)
diff -Nup vdr-1.5.12/nit.c vdr-1.5.12mod/nit.c
--- vdr-1.5.12/nit.c	2007-08-18 01:02:45.000000000 +1100
+++ vdr-1.5.12mod/nit.c	2007-12-29 13:39:39.000000000 +1000
@@ -143,7 +143,7 @@ void cNitFilter::Process(u_short Pid, u_
                  if (Setup.UpdateChannels >= 5) {
                     bool found = false;
                     for (cChannel *Channel = Channels.First(); Channel; Channel = Channels.Next(Channel)) {
-                        if (!Channel->GroupSep() && Channel->Source() == Source && Channel->Nid() == ts.getOriginalNetworkId() && Channel->Tid() == ts.getTransportStreamId()) {
+                        if (!Channel->GroupSep() && Channel->Source() == Source && Channel->Transponder() == Transponder() && Channel->Nid() == ts.getOriginalNetworkId() && Channel->Tid() == ts.getTransportStreamId()) { 
                            int transponder = Channel->Transponder();
                            if (!ISTRANSPONDER(cChannel::Transponder(Frequency, Polarization), transponder)) {
                               for (int n = 0; n < NumFrequencies; n++) {
diff -Nup vdr-1.5.12/sdt.c vdr-1.5.12mod/sdt.c
--- vdr-1.5.12/sdt.c	2007-06-10 19:50:49.000000000 +1100
+++ vdr-1.5.12mod/sdt.c	2008-01-08 23:48:59.000000000 +1000
@@ -78,7 +78,7 @@ void cSdtFilter::Process(u_short Pid, u_
                         char *pp = compactspace(ProviderNameBuf);
                         if (channel) {
                            channel->SetId(sdt.getOriginalNetworkId(), sdt.getTransportStreamId(), SiSdtService.getServiceId());
-                           if (Setup.UpdateChannels == 1 || Setup.UpdateChannels >= 3)
+                           if ((Setup.UpdateChannels == 1 || Setup.UpdateChannels >= 3) && channel->Transponder() == Transponder())
                               channel->SetName(pn, ps, pp);
                            // Using SiSdtService.getFreeCaMode() is no good, because some
                            // tv stations set this flag even for non-encrypted channels :-(
