Index: libs/libmythtv/mpeg/dvbtables.cpp
===================================================================
--- libs/libmythtv/mpeg/dvbtables.cpp	(revision 14223)
+++ libs/libmythtv/mpeg/dvbtables.cpp	(working copy)
@@ -77,6 +77,17 @@
     return _cached_network_name;
 }
 
+bool NetworkInformationTable::Mutate(void)
+{
+    if (VerifyCRC())
+    {
+        SetTableID((TableID() == TableID::NITo) ? TableID::NIT : TableID::NITo);
+        SetCRC(CalcCRC());
+        return true;
+    }
+    else
+        return false;
+}
 
 void ServiceDescriptionTable::Parse(void) const
 {
Index: libs/libmythtv/mpeg/dvbstreamdata.cpp
===================================================================
--- libs/libmythtv/mpeg/dvbstreamdata.cpp	(revision 14223)
+++ libs/libmythtv/mpeg/dvbstreamdata.cpp	(working copy)
@@ -10,6 +10,11 @@
 
 #define PREMIERE_ONID 133
 
+/* change to the "correct" network ID for broken dvb providers
+ * which transmit the real NIT as NIT other
+ */
+static const int real_network_id = -1;
+
 // service_id is synonymous with the MPEG program number in the PMT.
 DVBStreamData::DVBStreamData(uint desired_netid,  uint desired_tsid,
                              int desired_program, bool cacheTables)
@@ -220,6 +225,19 @@
     {
         case TableID::NIT:
         {
+            if (real_network_id >= 0 && psip.TableIDExtension() != (uint)real_network_id)
+            {
+                NetworkInformationTable *nit = new NetworkInformationTable(psip);
+                if (!nit->Mutate())
+                {
+                    delete nit;
+                    return true;
+                }
+                bool retval = HandleTables(pid, *nit);
+                delete nit;
+                return retval;
+            }
+
             SetVersionNIT(psip.Version(), psip.LastSection());
             SetNITSectionSeen(psip.Section());
 
@@ -277,6 +295,19 @@
         }
         case TableID::NITo:
         {
+            if (real_network_id >= 0 && psip.TableIDExtension() == (uint)real_network_id)
+            {
+                NetworkInformationTable *nit = new NetworkInformationTable(psip);
+                if (!nit->Mutate())
+                {
+                    delete nit;
+                    return true;
+                }
+                bool retval = HandleTables(pid, *nit);
+                delete nit;
+                return retval;
+            }
+
             SetVersionNITo(psip.Version(), psip.LastSection());
             SetNIToSectionSeen(psip.Section());
             NetworkInformationTable nit(psip);
Index: libs/libmythtv/mpeg/dvbtables.h
===================================================================
--- libs/libmythtv/mpeg/dvbtables.h	(revision 14223)
+++ libs/libmythtv/mpeg/dvbtables.h	(working copy)
@@ -79,6 +79,9 @@
         { return _ptrs[i]+6; }
     // }
 
+    /// mutates a NITo into a NITa (vice versa) and recalculates the CRC
+    bool Mutate(void);
+
     void Parse(void) const;
     QString toString(void) const;
     QString NetworkName(void) const;
@@ -154,7 +157,7 @@
     // }
     ServiceDescriptor *GetServiceDescriptor(uint i) const;
 
-    /// mutates a SDTo into a SDTa and recalculates the CRC
+    /// mutates a SDTo into a SDTa (vice versa) and recalculates the CRC
     bool Mutate(void);
 
     void Parse(void) const;

