diff -Naur mythtv_unpatched/libs/libmythtv/channelsettings.cpp mythtv/libs/libmythtv/channelsettings.cpp
--- mythtv_unpatched/libs/libmythtv/channelsettings.cpp	2006-03-06 20:14:31.000000000 -0800
+++ mythtv/libs/libmythtv/channelsettings.cpp	2006-03-06 20:15:51.000000000 -0800
@@ -82,6 +82,19 @@
     };
 };
 
+class TimeOffset: public SpinBoxSetting, public CSetting {
+public:
+    TimeOffset(const ChannelID& id):
+        SpinBoxSetting(-1440, 1440, 1), CSetting(id, "tmoffset") {
+        setLabel(QObject::tr("DataDirect") + " " + QObject::tr("Time Offset"));
+        setHelpText(QObject::tr("Offset (in minutes) to apply to the program "
+                    "guide data during import.  This can be used when the "
+                    "listings for a particular channel are in a different "
+                    "time zone.") + " " +
+                    QObject::tr("(Works for DataDirect listings only.)"));
+    };
+};
+
 class Rank: public SpinBoxSetting, public CSetting {
 public:
     Rank(const ChannelID& id):
@@ -284,6 +297,7 @@
     connect(source,SIGNAL(valueChanged(const QString&)),this,SLOT(sourceChanged(const QString&)));
 #else
     addChild(new XmltvID(id));
+    addChild(new TimeOffset(id));
 #endif
 };
 
@@ -347,3 +361,5 @@
     addChild(new Colour(id));
     addChild(new Hue(id));
 };
+
+/* vim: set expandtab tabstop=4 shiftwidth=4: */
diff -Naur mythtv_unpatched/libs/libmythtv/dbcheck.cpp mythtv/libs/libmythtv/dbcheck.cpp
--- mythtv_unpatched/libs/libmythtv/dbcheck.cpp	2006-03-06 20:14:21.000000000 -0800
+++ mythtv/libs/libmythtv/dbcheck.cpp	2006-03-06 20:15:51.000000000 -0800
@@ -10,7 +10,7 @@
 #include "mythdbcon.h"
 
 /// This is the DB schema version expected by the running MythTV instance.
-const QString currentDatabaseVersion = "1129";
+const QString currentDatabaseVersion = "1130";
 
 static bool UpdateDBVersionNumber(const QString &newnumber);
 static bool performActualUpdate(const QString updates[], QString version,
@@ -240,6 +240,11 @@
 The 'xmltvid' field is used to identify this channel to the listings
 provider.
 
+The 'tmoffset' field is used to apply an offset (in minutes) from the listings
+provided by the provider to a new time in the MythTV program guide database.
+This is very handy when the listings provider has listings which are offset
+by a few hours on individual channels with the rest of them being correct.
+
 The 'recpriority' field is used tell the scheduler from which of two 
 otherwise equivalent programs on two different channels should be 
 prefered, a higher number means this channel is more preferred.
@@ -2112,6 +2117,17 @@
             return false;
     }
 
+    if (dbver == "1129")
+    {
+        const QString updates[] = {
+"ALTER TABLE channel ADD COLUMN tmoffset INT NOT NULL default '0';",
+""
+};
+
+        if (!performActualUpdate(updates, "1130", dbver))
+            return false;
+    }
+
 //"ALTER TABLE capturecard DROP COLUMN dvb_recordts;" in 0.21
 //"ALTER TABLE capturecard DROP COLUMN dvb_hw_decoder;" in 0.21
 
diff -Naur mythtv_unpatched/programs/mythfilldatabase/filldata.cpp mythtv/programs/mythfilldatabase/filldata.cpp
--- mythtv_unpatched/programs/mythfilldatabase/filldata.cpp	2006-03-06 20:15:02.000000000 -0800
+++ mythtv/programs/mythfilldatabase/filldata.cpp	2006-03-06 23:08:55.000000000 -0800
@@ -225,37 +225,55 @@
 
 void clearDataByChannel(int chanid, QDateTime from, QDateTime to) 
 {
+    int secs;
+    QDateTime newFrom, newTo;
+
     MSqlQuery query(MSqlQuery::InitCon());
 
+    query.prepare("SELECT tmoffset FROM channel where chanid = :CHANID ;");
+    query.bindValue(":CHANID", chanid);
+    query.exec();
+    if (!query.isActive() || query.size() != 1)
+    {
+        MythContext::DBError("clearDataByChannel", query);
+        return;
+    }
+    query.next();
+    secs = query.value(0).toInt();
+
+    secs *= 60;
+    newFrom = from.addSecs(secs);
+    newTo = to.addSecs(secs);
+
     query.prepare("DELETE FROM program "
                   "WHERE starttime >= :FROM AND starttime < :TO "
                   "AND chanid = :CHANID ;");
-    query.bindValue(":FROM", from);
-    query.bindValue(":TO", to);
+    query.bindValue(":FROM", newFrom);
+    query.bindValue(":TO", newTo);
     query.bindValue(":CHANID", chanid);
     query.exec();
 
     query.prepare("DELETE FROM programrating "
                   "WHERE starttime >= :FROM AND starttime < :TO "
                   "AND chanid = :CHANID ;");
-    query.bindValue(":FROM", from);
-    query.bindValue(":TO", to);
+    query.bindValue(":FROM", newFrom);
+    query.bindValue(":TO", newTo);
     query.bindValue(":CHANID", chanid);
     query.exec();
 
     query.prepare("DELETE FROM credits "
                   "WHERE starttime >= :FROM AND starttime < :TO "
                   "AND chanid = :CHANID ;");
-    query.bindValue(":FROM", from);
-    query.bindValue(":TO", to);
+    query.bindValue(":FROM", newFrom);
+    query.bindValue(":TO", newTo);
     query.bindValue(":CHANID", chanid);
     query.exec();
 
     query.prepare("DELETE FROM programgenres "
                   "WHERE starttime >= :FROM AND starttime < :TO "
                   "AND chanid = :CHANID ;");
-    query.bindValue(":FROM", from);
-    query.bindValue(":TO", to);
+    query.bindValue(":FROM", newFrom);
+    query.bindValue(":TO", newTo);
     query.bindValue(":CHANID", chanid);
     query.exec();
 }
@@ -988,29 +1006,39 @@
                     "hdtv, closecaptioned, partnumber, parttotal, seriesid, "
                     "originalairdate, colorcode, syndicatedepisodenumber, "
                     "programid) "
-                    "SELECT chanid, starttime, endtime, "
+                    "SELECT dd_v_program.chanid, "
+                    "DATE_ADD(starttime, INTERVAL channel.tmoffset MINUTE), "
+                    "DATE_ADD(endtime, INTERVAL channel.tmoffset MINUTE), "
                     "title, subtitle, description, "
                     "showtype, dd_genre.class, category_type, "
                     "airdate, stars, previouslyshown, stereo, subtitled, "
                     "hdtv, closecaptioned, partnumber, parttotal, seriesid, "
                     "originalairdate, colorcode, syndicatedepisodenumber, "
-                    "dd_v_program.programid FROM dd_v_program "
+                    "dd_v_program.programid FROM dd_v_program, channel "
                     "LEFT JOIN dd_genre ON ("
                     "dd_v_program.programid = dd_genre.programid AND "
-                    "dd_genre.relevance = '0');"))
+                    "dd_genre.relevance = '0') "
+                    "WHERE dd_v_program.chanid = channel.chanid;"))
         MythContext::DBError("Inserting into program table", query);
 
     //cerr << "Finished adding rows to main program table...\n";
     //cerr << "Adding program ratings...\n";
 
     if (!query.exec("INSERT IGNORE INTO programrating (chanid, starttime, "
-                    "system, rating) SELECT chanid, starttime, 'MPAA', "
-                    "mpaarating FROM dd_v_program WHERE mpaarating != '';"))
+                    "system, rating) SELECT dd_v_program.chanid, "
+                    "DATE_ADD(starttime, INTERVAL channel.tmoffset MINUTE), "
+                    " 'MPAA', "
+                    "mpaarating FROM dd_v_program, channel WHERE "
+                    "mpaarating != '' AND dd_v_program.chanid = "
+                    "channel.chanid"))
         MythContext::DBError("Inserting into programrating table", query);
 
     if (!query.exec("INSERT IGNORE INTO programrating (chanid, starttime, "
-                    "system, rating) SELECT chanid, starttime, 'VCHIP', "
-                    "tvrating FROM dd_v_program WHERE tvrating != '';"))
+                    "system, rating) SELECT dd_v_program.chanid, "
+                    "DATE_ADD(starttime, INTERVAL channel.tmoffset MINUTE), "
+                    "'VCHIP', "
+                    "tvrating FROM dd_v_program, channel WHERE tvrating != ''"
+                    " AND dd_v_program.chanid = channel.chanid"))
         MythContext::DBError("Inserting into programrating table", query);
 
     //cerr << "Finished adding program ratings...\n";
@@ -1024,20 +1052,25 @@
     //cerr << "Adding credits entries from production crew list...\n";
 
     if (!query.exec("INSERT IGNORE INTO credits (chanid, starttime, person, "
-                    "role) SELECT chanid, starttime, person, role "
-                    "FROM dd_productioncrew, dd_v_program, people "
+                    "role) SELECT dd_v_program.chanid, "
+                    "DATE_ADD(starttime, INTERVAL channel.tmoffset MINUTE), "
+                    "person, role "
+                    "FROM dd_productioncrew, dd_v_program, channel, people "
                     "WHERE "
                     "((dd_productioncrew.programid = dd_v_program.programid) "
-                    "AND (dd_productioncrew.fullname = people.name));"))
+                    "AND (dd_productioncrew.fullname = people.name)) "
+                    "AND dd_v_program.chanid = channel.chanid;"))
         MythContext::DBError("Inserting into credits table", query);
 
     //cerr << "Finished inserting credits...\n";
     //cerr << "Adding genres...\n";
 
     if (!query.exec("INSERT IGNORE INTO programgenres (chanid, starttime, "
-                    "relevance, genre) SELECT chanid, starttime, "
-                    "relevance, class FROM dd_v_program, dd_genre "
-                    "WHERE (dd_v_program.programid = dd_genre.programid);"))
+                    "relevance, genre) SELECT dd_v_program.chanid, "
+                    "DATE_ADD(starttime, INTERVAL channel.tmoffset MINUTE), "
+                    "relevance, class FROM dd_v_program, dd_genre, channel "
+                    "WHERE (dd_v_program.programid = dd_genre.programid) "
+                    "AND dd_v_program.chanid = channel.chanid"))
         MythContext::DBError("Inserting into programgenres table",query);
 
     //cerr << "Done...\n";
