Index: libs/libmythtv/eithelper.cpp
===================================================================
--- libs/libmythtv/eithelper.cpp	(Revision 14480)
+++ libs/libmythtv/eithelper.cpp	(Arbeitskopie)
@@ -387,6 +387,10 @@
             }
         }
 
+        desc_list_t linkages =
+             MPEGDescriptor::FindAll(list, DescriptorID::linkage);
+        StoreLinkageList(chanid,linkages,fix);
+ 
         QDateTime starttime = MythUTCToLocal(eit->StartTimeUTC(i));
         EITFixUp::TimeFix(starttime);
         QDateTime endtime   = starttime.addSecs(eit->DurationInSeconds(i));
@@ -513,6 +517,77 @@
     eitcache->WriteToDB();
 }
 
+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;
+
+    // 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);
+    }
+
+    if (linkages.size() > 0)
+    {
+        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);
+
+        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);
+
+            // insert links into db
+            QString qstr = 
+            "INSERT INTO linkage "
+            "VALUES (:PORTAL, "
+            "        :SERVICEID, "
+            "        :CHANID, "
+            "        :SUBEVENT) ";
+
+            query.prepare(qstr);
+            query.bindValue(":PORTAL",     portal_chanid);
+            query.bindValue(":SERVICEID",  serviceid);
+            query.bindValue(":CHANID",     chanid);
+            query.bindValue(":SUBEVENT",   subevent.utf8());
+
+            if (!query.exec() || !query.isActive())
+                MythContext::DBError("INSERT LINKAGELIST", query);
+        }
+    } 
+}
+
 //////////////////////////////////////////////////////////////////////
 // private methods and functions below this line                    //
 //////////////////////////////////////////////////////////////////////
Index: libs/libmythtv/eithelper.h
===================================================================
--- libs/libmythtv/eithelper.h	(Revision 14480)
+++ 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
@@ -82,6 +84,7 @@
     // EIT cache handling
     void PruneEITCache(uint timestamp);
     void WriteEITCache(void);
+    void StoreLinkageList(uint portal_chanid, desc_list_t linkages, uint fix);
 
   private:
     uint GetChanID(uint atsc_major, uint atsc_minor);

