diff --git a/mythtv/programs/mythfilldatabase/channeldata.cpp b/mythtv/programs/mythfilldatabase/channeldata.cpp
index 7ffb729..c11080f 100644
--- a/mythtv/programs/mythfilldatabase/channeldata.cpp
+++ b/mythtv/programs/mythfilldatabase/channeldata.cpp
@@ -25,6 +25,7 @@
 #include "channeldata.h"
 #include "fillutil.h"
 
+
 static void get_atsc_stuff(QString channum, int sourceid, int freqid,
                            int &major, int &minor, long long &freq)
 {
@@ -127,8 +128,107 @@ unsigned int ChannelData::promptForChannelUpdates(
     return(chanid);
 }
 
+
+
+
+QString ChannelData::normalizeChannelKey(QString chanName)
+{
+    QString result;
+    for (int i=0;i<chanName.length();i++)
+    {
+        if (chanName[i]!=32)
+            result+= chanName[i].toLower();
+    }
+    return result;
+}
+
+QHash<QString, QString> ChannelData::channelList(int sourceId)
+{
+    QHash<QString, QString> chanList;
+    MSqlQuery query(MSqlQuery::InitCon());
+
+
+    query.prepare(
+              "SELECT name, callsign "
+              "FROM channel "
+              "WHERE sourceid = :SOURCEID");
+
+     query.bindValue(":SOURCEID", sourceId);
+
+     if (!query.exec())
+     {
+          MythDB::DBError("handleChannels", query);
+          return chanList;
+     }
+     else
+     {
+         while (query.next())
+         {
+             QString chanName = query.value(0).toString();
+             QString callSign = query.value(1).toString();
+             QString key  = normalizeChannelKey(chanName);
+             chanList[key] = chanName;
+         }
+     }
+
+     return chanList;
+}
+
+bool ChannelData::findExistingChannel(int sourceId, ChanInfo chanInfo, MSqlQuery &query, QHash<QString, QString> existingChan)
+{
+   query.prepare(
+          "SELECT chanid,   name, callsign, channum, "
+          "       finetune, icon, freqid,   tvformat "
+          "FROM channel "
+          "WHERE xmltvid  = :XMLTVID AND "
+          "      sourceid = :SOURCEID");
+  query.bindValue(":XMLTVID",  chanInfo.xmltvid);
+  query.bindValue(":SOURCEID", sourceId);
+
+  if (!query.exec())
+  {
+      MythDB::DBError("handleChannels", query);
+      return false;
+  }
+  else if (query.next())
+  {
+      return true;
+  }
+
+  QString searchKey = normalizeChannelKey(chanInfo.name);
+  QString chanName = existingChan[searchKey];
+
+  query.prepare(
+            "SELECT chanid,   name, callsign, channum, "
+            "       finetune, icon, freqid,   tvformat "
+            "FROM channel "
+            "WHERE (name  = :NAME OR"
+            "      callsign = :CALLSIGN) AND "
+            "      sourceid = :SOURCEID");
+  query.bindValue(":NAME",  chanName);
+  query.bindValue(":CALLSIGN",  chanName);
+  query.bindValue(":SOURCEID", sourceId);
+
+  if (!query.exec())
+  {
+       MythDB::DBError("handleChannels", query);
+       return false;
+  }
+  else if (query.next())
+  {
+       return true;
+  }
+
+  return false;
+}
+
+
 void ChannelData::handleChannels(int id, QList<ChanInfo> *chanlist)
 {
+//  VERBOSE(VB_IMPORTANT, QString("Failed to fetch icon from '%1'").arg((*i).iconpath));
+
+
+    QHash<QString, QString> existingChan = channelList(id);
     QString fileprefix = SetupIconCacheDirectory();
 
     QDir::setCurrent(fileprefix);
@@ -189,20 +289,9 @@ void ChannelData::handleChannels(int id, QList<ChanInfo> *chanlist)
             }
         }
 
-        query.prepare(
-            "SELECT chanid,   name, callsign, channum, "
-            "       finetune, icon, freqid,   tvformat "
-            "FROM channel "
-            "WHERE xmltvid  = :XMLTVID AND "
-            "      sourceid = :SOURCEID");
-        query.bindValue(":XMLTVID",  (*i).xmltvid);
-        query.bindValue(":SOURCEID", id);
 
-        if (!query.exec())
-        {
-            MythDB::DBError("handleChannels", query);
-        }
-        else if (query.next())
+        bool find = findExistingChannel(id, *i, query,existingChan);
+        if (find)
         {
             QString chanid = query.value(0).toString();
             if (interactive)
@@ -311,6 +400,22 @@ void ChannelData::handleChannels(int id, QList<ChanInfo> *chanlist)
                     if (!subquery.exec())
                         MythDB::DBError("Channel icon change", subquery);
                 }
+                else
+                {
+                    if (localfile.isEmpty())
+                        localfile = query.value(5).toString();
+                    MSqlQuery subquery(MSqlQuery::InitCon());
+
+                    subquery.prepare("UPDATE channel SET icon = :ICON "
+                            ", xmltvid:= :XMLTVID WHERE "
+                                     "chanid = :CHANID;");
+                    subquery.bindValue(":ICON", localfile);
+                    subquery.bindValue(":XMLTVID", (*i).xmltvid);
+                    subquery.bindValue(":CHANID", chanid);
+
+                    if (!subquery.exec())
+                        MythDB::DBError("Channel icon change", subquery);
+                }
             }
         }
         else
@@ -319,6 +424,7 @@ void ChannelData::handleChannels(int id, QList<ChanInfo> *chanlist)
             long long freq;
             get_atsc_stuff((*i).chanstr, id, (*i).freqid.toInt(), major, minor, freq);
 
+
             if (interactive && ((minor == 0) || (freq > 0)))
             {
                 cout << "### " << endl;
diff --git a/mythtv/programs/mythfilldatabase/channeldata.h b/mythtv/programs/mythfilldatabase/channeldata.h
index 1de8ce0..ce25cff 100644
--- a/mythtv/programs/mythfilldatabase/channeldata.h
+++ b/mythtv/programs/mythfilldatabase/channeldata.h
@@ -44,6 +44,11 @@ class ChannelData
     unsigned int promptForChannelUpdates(
         QList<ChanInfo>::iterator chaninfo, unsigned int chanid);
 
+    bool findExistingChannel(int sourceId, ChanInfo chanInfo, MSqlQuery &query,QHash<QString, QString> existingChan);
+    QHash<QString, QString> channelList(int sourceId);
+    QString normalizeChannelKey(QString chanName);
+
+
   public:
     bool    interactive;
     bool    non_us_updating;
