Index: libs/libmythtv/eithelper.cpp
===================================================================
--- libs/libmythtv/eithelper.cpp	(Revision 14499)
+++ libs/libmythtv/eithelper.cpp	(Arbeitskopie)
@@ -387,6 +387,14 @@
             }
         }
 
+        // Find all linked events
+        desc_list_t linkages =
+            MPEGDescriptor::FindAll(list, DescriptorID::linkage);
+        if (linkages.size() > 0)
+            StoreLinkageList(chanid,linkages,fix);
+        else if (chanid_has_linkage[chanid])
+            DeleteLinkageList(chanid);
+
         QDateTime starttime = MythUTCToLocal(eit->StartTimeUTC(i));
         EITFixUp::TimeFix(starttime);
         QDateTime endtime   = starttime.addSecs(eit->DurationInSeconds(i));
@@ -513,6 +521,84 @@
     eitcache->WriteToDB();
 }
 
+void EITHelper::DeleteLinkageList(uint portal_chanid)
+{
+    MSqlQuery query(MSqlQuery::InitCon());
+    QString qstr = "DELETE FROM linkage where portal_chanid = :CHANID";
+    query.prepare(qstr);
+    query.bindValue(":CHANID", portal_chanid);
+    if (!query.exec() || !query.isActive())
+        MythContext::DBError("DELETE LINKAGELIST", query);
+    
+    chanid_has_linkage[portal_chanid] = false;
+}
+
+void EITHelper::StoreLinkageList(uint portal_chanid, desc_list_t linkages, uint fix)
+{
+    unsigned char enc_1[3]  = { 0x10, 0x00, 0x01 };
+    unsigned char enc_15[3] = { 0x10, 0x00, 0x0f };
+    unsigned char enc_premiere[1] = { 0x5 };
+    int enc_len = 0;
+    const unsigned char *enc = NULL;
+    
+    MSqlQuery query(MSqlQuery::InitCon());
+
+    //Delete old entries first
+    DeleteLinkageList(portal_chanid);
+
+    // Is this BellExpressVU EIT (Canada) ?
+    // Use an encoding override of ISO 8859-1 (Latin1)
+    if (fix & EITFixUp::kEFixForceISO8859_1)
+    {
+        enc = enc_1;
+        enc_len = sizeof(enc_1);
+    }
+
+    // Is this broken DVB provider in Western Europe?
+    // Use an encoding override of ISO 8859-15 (Latin6)
+    if (fix & EITFixUp::kEFixForceISO8859_15)
+    {
+        enc = enc_15;
+        enc_len = sizeof(enc_15);
+    }
+
+    // The german provider Premiere needs extra handling
+    if (fix & EITFixUp::kFixPremiere)
+    {
+        enc = enc_premiere;
+        enc_len = sizeof(enc_premiere);
+    }
+
+    QString qstr = "";
+
+    for (uint j=0;j<linkages.size();j++)
+    {
+        LinkageDescriptor linkage(linkages[j]);
+        uint networkid         = linkage.OriginalNetworkID();
+        uint tsid              = linkage.TSID();
+        uint serviceid         = linkage.ServiceID();
+        uint linkagetype       = linkage.LinkageType();
+        QString subevent       = dvb_decode_text(linkage.PrivateData_N8(),linkage.PrivateDataLength_N8(),enc,enc_len);
+
+        uint chanid = GetChanID(serviceid,networkid,tsid);
+
+        qstr += QString("%1 (%2,%3,%4,'%5')")
+                    .arg(j>0?",":"INSERT INTO linkage VALUES") 
+                    .arg(j)
+                    .arg(portal_chanid)
+                    .arg(chanid)
+                    .arg(subevent.utf8());
+
+    }
+
+    query.prepare(qstr);
+
+    if (!query.exec() || !query.isActive())
+        MythContext::DBError("INSERT LINKAGELIST", query);
+
+    chanid_has_linkage[portal_chanid] = true;
+}
+
 //////////////////////////////////////////////////////////////////////
 // private methods and functions below this line                    //
 //////////////////////////////////////////////////////////////////////
Index: libs/libmythtv/eithelper.h
===================================================================
--- libs/libmythtv/eithelper.h	(Revision 14499)
+++ libs/libmythtv/eithelper.h	(Arbeitskopie)
@@ -13,6 +13,8 @@
 // MythTV includes
 #include "mythdeque.h"
 
+typedef vector<const unsigned char*> desc_list_t;
+
 class MSqlQuery;
 
 class ATSCEvent
@@ -39,6 +41,7 @@
 typedef QMap<uint,EventIDToATSCEvent>      ATSCSRCToEvents;
 typedef QMap<uint,EventIDToETT>            ATSCSRCToETTs;
 typedef QMap<unsigned long long,int>       ServiceToChanID;
+typedef QMap<int,bool>                     ChanIDHasLinkage;
 
 class DBEvent;
 class EITFixUp;
@@ -82,6 +85,8 @@
     // EIT cache handling
     void PruneEITCache(uint timestamp);
     void WriteEITCache(void);
+    void DeleteLinkageList(uint portal_chanid);
+    void StoreLinkageList(uint portal_chanid, desc_list_t linkages, uint fix);
 
   private:
     uint GetChanID(uint atsc_major, uint atsc_minor);
@@ -94,6 +99,7 @@
         //QListList_Events  eitList;      ///< Event Information Tables List
     mutable QMutex    eitList_lock; ///< EIT List lock
     mutable ServiceToChanID srv_to_chanid;
+    mutable ChanIDHasLinkage chanid_has_linkage;
 
     EITFixUp               *eitfixup;
     EITCache               *eitcache;

