diff --git a/mythtv/libs/libmythmetadata/metadatacommon.cpp b/mythtv/libs/libmythmetadata/metadatacommon.cpp
index d28d54e..9f25e76 100644
--- a/mythtv/libs/libmythmetadata/metadatacommon.cpp
+++ b/mythtv/libs/libmythmetadata/metadatacommon.cpp
@@ -130,7 +130,7 @@ MetadataLookup::MetadataLookup(
     uint subtitletype,
     const QString &certification,
     const QStringList &countries,
-    const uint popularity,
+    const float popularity,
     const uint budget,
     const uint revenue,
     const QString &album,
@@ -219,6 +219,9 @@ MetadataLookup::MetadataLookup(
     m_artwork(artwork),
     m_downloads(downloads)
 {
+    QString manRecSuffix = QString(" (%1)").arg(QObject::tr("Manual Record"));
+    m_base_title = title;
+    m_base_title.replace(manRecSuffix,"");
 }
 
 // ProgramInfo-style constructor
@@ -312,6 +315,9 @@ MetadataLookup::MetadataLookup(
     m_popularity = 0;
     m_budget = 0;
     m_revenue = 0;
+    QString manRecSuffix = QString(" (%1)").arg(QObject::tr("Manual Record"));
+    m_base_title = title;
+    m_base_title.replace(manRecSuffix,"");
 }
 
 // XBMC NFO-style constructor
@@ -388,6 +394,9 @@ MetadataLookup::MetadataLookup(
     m_artwork(artwork),
     m_downloads(downloads)
 {
+    QString manRecSuffix = QString(" (%1)").arg(QObject::tr("Manual Record"));
+    m_base_title = title;
+    m_base_title.replace(manRecSuffix,"");
 }
 
 MetadataLookup::~MetadataLookup()
@@ -1002,7 +1011,7 @@ MetadataLookup* ParseMetadataItem(const QDomElement& item,
 
     uint season = 0, episode = 0, chanid = 0, programflags = 0,
          audioproperties = 0, videoproperties = 0, subtitletype = 0,
-         tracknum = 0, popularity = 0, budget = 0, revenue = 0,
+         tracknum = 0, budget = 0, revenue = 0,
          year = 0, runtime = 0, runtimesecs = 0, ratingcount = 0;
     QString title, network, status, subtitle, tagline, description, certification,
         channum, chansign, channame, chanplaybackfilters, recgroup,
@@ -1010,6 +1019,7 @@ MetadataLookup* ParseMetadataItem(const QDomElement& item,
         inetref, collectionref, tmsref, imdb, homepage, trailerURL, language;
     QStringList categories, countries, studios;
     float userrating = 0;
+    float popularity = 0;
     QDate releasedate;
     QDateTime lastupdated, startts, endts, recstartts, recendts;
     PeopleMap people;
@@ -1064,7 +1074,7 @@ MetadataLookup* ParseMetadataItem(const QDomElement& item,
     userrating = item.firstChildElement("userrating").text().toFloat();
     ratingcount = item.firstChildElement("ratingcount").text().toUInt();
     tracknum = item.firstChildElement("tracknum").text().toUInt();
-    popularity = item.firstChildElement("popularity").text().toUInt();
+    popularity = item.firstChildElement("popularity").text().toFloat();
     budget = item.firstChildElement("budget").text().toUInt();
     revenue = item.firstChildElement("revenue").text().toUInt();
     year = item.firstChildElement("year").text().toUInt();
diff --git a/mythtv/libs/libmythmetadata/metadatacommon.h b/mythtv/libs/libmythmetadata/metadatacommon.h
index d0613e6..5ea18e9 100644
--- a/mythtv/libs/libmythmetadata/metadatacommon.h
+++ b/mythtv/libs/libmythmetadata/metadatacommon.h
@@ -130,7 +130,7 @@ class META_PUBLIC MetadataLookup : public QObject, public ReferenceCounter
         const uint subtitletype,
         const QString &certification,
         const QStringList &countries,
-        const uint popularity,
+        const float popularity,
         const uint budget,
         const uint revenue,
         const QString &album,
@@ -330,7 +330,7 @@ class META_PUBLIC MetadataLookup : public QObject, public ReferenceCounter
 
     QString GetCertification() const { return m_certification; };
     QStringList GetCountries() const { return m_countries; };
-    uint GetPopularity() const { return m_popularity; };
+    float GetPopularity() const { return m_popularity; };
     uint GetBudget() const { return m_budget; };
     uint GetRevenue() const { return m_revenue; };
 
@@ -417,7 +417,7 @@ class META_PUBLIC MetadataLookup : public QObject, public ReferenceCounter
 
     const QString m_certification;
     const QStringList m_countries;
-    uint m_popularity;
+    float m_popularity;
     uint m_budget;
     uint m_revenue;
 
diff --git a/mythtv/libs/libmythmetadata/metadatadownload.cpp b/mythtv/libs/libmythmetadata/metadatadownload.cpp
index bf5d4fb..24bc862 100644
--- a/mythtv/libs/libmythmetadata/metadatadownload.cpp
+++ b/mythtv/libs/libmythmetadata/metadatadownload.cpp
@@ -97,9 +97,25 @@ void MetadataDownload::run()
             lookup->GetType() == kMetadataRecording)
         {
             if (lookup->GetSubtype() == kProbableTelevision)
+            {
                 list = handleTelevision(lookup);
+                if (findExactMatchCount(list, lookup->GetBaseTitle(), true) == 0)
+                {
+                    // There are no exact match prospects with artwork from TV search,
+                    // so add in movies, where we might find a better match.
+                    list.append(handleMovie(lookup));
+                }
+            }
             else if (lookup->GetSubtype() == kProbableMovie)
+            {
                 list = handleMovie(lookup);
+                if (findExactMatchCount(list, lookup->GetBaseTitle(), true) == 0)
+                {
+                    // There are no exact match prospects with artwork from Movie search
+                    // so add in television, where we might find a better match.
+                    list.append(handleTelevision(lookup));
+                }
+            }
             else
             {
                 // will try both movie and TV
@@ -199,45 +215,118 @@ void MetadataDownload::run()
     RunEpilog();
 }
 
+unsigned int MetadataDownload::findExactMatchCount(MetadataLookupList list,
+                                                   const QString &originaltitle,
+                                                   bool withArt) const
+{
+    unsigned int exactMatches = 0;
+    unsigned int exactMatchesWithArt = 0;
+
+    for (MetadataLookupList::const_iterator i = list.begin();
+            i != list.end(); ++i)
+    {
+        // Consider exact title matches (ignoring case)
+        if ((QString::compare((*i)->GetTitle(), originaltitle, Qt::CaseInsensitive) == 0))
+        {
+            // In lookup by name, the television database tends to only include Banner artwork.
+            // In lookup by name, the movie database tends to include only Fan and Cover artwork.
+            if ((((*i)->GetArtwork(kArtworkFanart)).size() != 0) ||
+                (((*i)->GetArtwork(kArtworkCoverart)).size() != 0) ||
+                (((*i)->GetArtwork(kArtworkBanner)).size() != 0))
+            {
+                exactMatchesWithArt++;
+            }
+            exactMatches++;
+        }
+    }
+
+    if (withArt)
+        return exactMatchesWithArt;
+    else
+        return exactMatches;
+}
+
 MetadataLookup* MetadataDownload::findBestMatch(MetadataLookupList list,
                                             const QString &originaltitle) const
 {
     QStringList titles;
     MetadataLookup *ret = NULL;
+    QDate exactTitleDate;
+    float exactTitlePopularity;
+    int exactMatches = 0;
+    int exactMatchesWithArt = 0;
+    bool foundMatchWithArt = false;
 
     // Build a list of all the titles
-    int exactMatches = 0;
     for (MetadataLookupList::const_iterator i = list.begin();
             i != list.end(); ++i)
     {
-        QString title = (*i)->GetBaseTitle();
-        if (title == originaltitle)
+        QString title = (*i)->GetTitle();
+        LOG(VB_GENERAL, LOG_INFO, QString("Comparing metadata title '%1' [%2] to recording title '%3'")
+                .arg(title)
+                .arg((*i)->GetReleaseDate().toString())
+                .arg(originaltitle));
+        // Consider exact title matches (ignoring case), which have some artwork available.
+        if (QString::compare(title, originaltitle, Qt::CaseInsensitive) == 0)
         {
-            ret = (*i);
+            bool hasArtwork = ((((*i)->GetArtwork(kArtworkFanart)).size() != 0) ||
+                               (((*i)->GetArtwork(kArtworkCoverart)).size() != 0) ||
+                               (((*i)->GetArtwork(kArtworkBanner)).size() != 0));
+
+            LOG(VB_GENERAL, LOG_INFO, QString("'%1', popularity = %2, ReleaseDate = %3")
+                    .arg(title)
+                    .arg((*i)->GetPopularity())
+                    .arg((*i)->GetReleaseDate().toString()));
+
+            // After the first exact match, prefer any more popular one.
+            // Most of the Movie database entries have Popularity fields.
+            // The TV series database generally has no Popularity values specified,
+            // so if none are found so far in the search, pick the most recently
+            // released entry with artwork. Also, if the first exact match had
+            // no artwork, prefer any later exact match with artwork.
+            if ((ret == NULL) ||
+                (hasArtwork &&
+                 ((!foundMatchWithArt) ||
+                  (((*i)->GetPopularity() > exactTitlePopularity)) ||
+                  ((exactTitlePopularity == 0.0) && ((*i)->GetReleaseDate() > exactTitleDate)))))
+            {
+                exactTitleDate = (*i)->GetReleaseDate();
+                exactTitlePopularity = (*i)->GetPopularity();
+                ret = (*i);
+            }
             exactMatches++;
+            if (hasArtwork)
+            {
+                foundMatchWithArt = true;
+                exactMatchesWithArt++;
+            }
         }
 
         titles.append(title);
     }
 
+    LOG(VB_GENERAL, LOG_DEBUG, QString("exactMatches = %1, exactMatchesWithArt = %2")
+            .arg(exactMatches)
+            .arg(exactMatchesWithArt));
+
     // If there was one or more exact matches then we can skip a more intensive
     // and time consuming search
     if (exactMatches > 0)
     {
         if (exactMatches == 1)
         {
-            LOG(VB_GENERAL, LOG_INFO, QString("Single Exact Title Match For %1")
+            LOG(VB_GENERAL, LOG_INFO, QString("Single exact title match for '%1'")
                     .arg(originaltitle));
-            return ret;
         }
         else
         {
-            LOG(VB_GENERAL, LOG_ERR,
-                QString("Multiple exact title matches found for %1. "
-                        "Need to match on other criteria.")
-                    .arg(originaltitle));
-            return NULL;
+            LOG(VB_GENERAL, LOG_INFO,
+                QString("Multiple exact title matches found for '%1'. "
+                        "Selecting most popular or most recent [%2]")
+                    .arg(originaltitle)
+                    .arg(exactTitleDate.toString()));
         }
+        return ret;
     }
 
     // Apply Levenshtein distance algorithm to determine closest match
@@ -260,7 +349,7 @@ MetadataLookup* MetadataDownload::findBestMatch(MetadataLookupList list,
     MetadataLookupList::const_iterator i = list.begin();
     for (; i != list.end(); ++i)
     {
-        if ((*i)->GetBaseTitle() == bestTitle)
+        if ((*i)->GetTitle() == bestTitle)
         {
             ret = (*i);
             break;
diff --git a/mythtv/libs/libmythmetadata/metadatadownload.h b/mythtv/libs/libmythmetadata/metadatadownload.h
index bc1030b..fc471a9 100644
--- a/mythtv/libs/libmythmetadata/metadatadownload.h
+++ b/mythtv/libs/libmythmetadata/metadatadownload.h
@@ -67,6 +67,9 @@ class META_PUBLIC MetadataDownload : public MThread
 
     MetadataLookupList  handleGame(MetadataLookup* lookup);
 
+    unsigned int        findExactMatchCount(MetadataLookupList list,
+                                      const QString &originaltitle,
+                                      bool withArt) const;
     MetadataLookup*     findBestMatch(MetadataLookupList list,
                                       const QString &originaltitle) const;
     MetadataLookupList  runGrabber(QString cmd, QStringList args,
diff --git a/mythtv/libs/libmythservicecontracts/datacontracts/videoLookupInfo.h b/mythtv/libs/libmythservicecontracts/datacontracts/videoLookupInfo.h
index 051e668..95bd1ba 100644
--- a/mythtv/libs/libmythservicecontracts/datacontracts/videoLookupInfo.h
+++ b/mythtv/libs/libmythservicecontracts/datacontracts/videoLookupInfo.h
@@ -92,7 +92,7 @@ class SERVICE_PUBLIC VideoLookup : public QObject
     Q_PROPERTY( int             Length          READ Length           WRITE setLength         )
     Q_PROPERTY( QString         Language        READ Language         WRITE setLanguage       )
     Q_PROPERTY( QStringList     Countries       READ Countries        WRITE setCountries      )
-    Q_PROPERTY( int             Popularity      READ Popularity       WRITE setPopularity     )
+    Q_PROPERTY( float           Popularity      READ Popularity       WRITE setPopularity     )
     Q_PROPERTY( int             Budget          READ Budget           WRITE setBudget         )
     Q_PROPERTY( int             Revenue         READ Revenue          WRITE setRevenue        )
     Q_PROPERTY( QString         IMDB            READ IMDB             WRITE setIMDB           )
@@ -116,7 +116,7 @@ class SERVICE_PUBLIC VideoLookup : public QObject
     PROPERTYIMP    ( int        , Length         )
     PROPERTYIMP    ( QString    , Language       )
     PROPERTYIMP    ( QStringList, Countries      )
-    PROPERTYIMP    ( int        , Popularity     )
+    PROPERTYIMP    ( float      , Popularity     )
     PROPERTYIMP    ( int        , Budget         )
     PROPERTYIMP    ( int        , Revenue        )
     PROPERTYIMP    ( QString    , IMDB           )
@@ -138,7 +138,7 @@ class SERVICE_PUBLIC VideoLookup : public QObject
             m_Year             = 0                      ;
             m_UserRating       = 0.0                    ;
             m_Length           = 0.0                    ;
-            m_Popularity       = 0                      ;
+            m_Popularity       = 0.0                    ;
             m_Budget           = 0                      ;
             m_Revenue          = 0                      ;
         }
diff --git a/mythtv/programs/mythmetadatalookup/lookup.cpp b/mythtv/programs/mythmetadatalookup/lookup.cpp
index 6de23a1..201cda6 100644
--- a/mythtv/programs/mythmetadatalookup/lookup.cpp
+++ b/mythtv/programs/mythmetadatalookup/lookup.cpp
@@ -246,11 +246,40 @@ void LookerUpper::customEvent(QEvent *levent)
         if (list.count() > 1)
         {
             int yearindex = -1;
+            MetadataLookup *exactTitleMeta = NULL;
+            QDate exactTitleDate;
+            float exactTitlePopularity = 0.0;
+            bool foundMatchWithArt = false;
 
             for (int p = 0; p != list.size(); ++p)
             {
                 ProgramInfo *pginfo = list[p]->GetData().value<ProgramInfo *>();
 
+                if (pginfo && (QString::compare(pginfo->GetTitle(), list[p]->GetBaseTitle(), Qt::CaseInsensitive)) == 0)
+                {
+                    bool hasArtwork = (((list[p]->GetArtwork(kArtworkFanart)).size() != 0) ||
+                                       ((list[p]->GetArtwork(kArtworkCoverart)).size() != 0) ||
+                                       ((list[p]->GetArtwork(kArtworkBanner)).size() != 0));
+
+                    // After the first exact match, prefer any more popular one.
+                    // Most of the Movie database entries have Popularity fields.
+                    // The TV series database generally has no Popularity values specified,
+                    // so if none are found so far in the search, pick the most recently
+                    // released entry with artwork. Also, if the first exact match had
+                    // no artwork, prefer any later exact match with artwork.
+                    if ((exactTitleMeta == NULL) ||
+                        (hasArtwork &&
+                         ((!foundMatchWithArt) ||
+                          ((list[p]->GetPopularity() > exactTitlePopularity)) ||
+                          ((exactTitlePopularity == 0.0) && (list[p]->GetReleaseDate() > exactTitleDate)))))
+                    {
+                        // remember the most popular or most recently released exact match
+                        exactTitleDate = list[p]->GetReleaseDate();
+                        exactTitlePopularity = list[p]->GetPopularity();
+                        exactTitleMeta = list[p];
+                    }
+                }
+
                 if (pginfo && !pginfo->GetSeriesID().isEmpty() &&
                     pginfo->GetSeriesID() == (list[p])->GetTMSref())
                 {
@@ -291,6 +320,18 @@ void LookerUpper::customEvent(QEvent *levent)
                 return;
             }
 
+            if (exactTitleMeta != NULL)
+            {
+                LOG(VB_GENERAL, LOG_INFO, QString("Best match released %1").arg(exactTitleDate.toString()));
+                MetadataLookup *lookup = exactTitleMeta;
+                ProgramInfo *pginfo = exactTitleMeta->GetData().value<ProgramInfo *>();
+                if (lookup->GetSubtype() != kProbableGenericTelevision)
+                    pginfo->SaveSeasonEpisode(lookup->GetSeason(), lookup->GetEpisode());
+                pginfo->SaveInetRef(lookup->GetInetref());
+                m_busyRecList.removeAll(pginfo);
+                return;
+            }
+
             LOG(VB_GENERAL, LOG_INFO, "Unable to match this title, too many possible matches. "
                                       "You may wish to manually set the season, episode, and "
                                       "inetref in the 'Watch Recordings' screen.");
