diff -ur /raidz/dev/htpc/mythtv-git/mythplugins/mythgame/mythgame/dbcheck.cpp mythtv-build-010912/mythplugins/mythgame/mythgame/dbcheck.cpp
--- /raidz/dev/htpc/mythtv-git/mythplugins/mythgame/mythgame/dbcheck.cpp	2011-11-14 18:31:36.549962305 -0600
+++ mythtv-build-010912/mythplugins/mythgame/mythgame/dbcheck.cpp	2012-01-09 22:18:45.597755371 -0600
@@ -10,7 +10,7 @@
 #include "dbcheck.h"
 #include "gamesettings.h"
 
-const QString currentDatabaseVersion = "1018";
+const QString currentDatabaseVersion = "1019";
 
 static bool UpdateDBVersionNumber(const QString &newnumber)
 {
@@ -437,5 +437,20 @@
             return false;
     }
 
+    if (dbver == "1018")
+    {
+        const QString updates[] = {
+"ALTER TABLE gamemetadata "
+"ADD developer varchar(128) NOT NULL AFTER publisher,"
+"ADD esrb tinyint(1) NOT NULL default -1 AFTER developer,"
+"ADD metarating tinyint(1) NOT NULL default 0 AFTER esrb,"
+"ADD rating tinyint(1) NOT NULL default 0 AFTER metarating;",
+"ADD players tinyint(1) NOT NULL default 1 AFTER rating;",
+""
+};
+        if (!performActualUpdate(updates, "1019", dbver))
+          return false;
+    }
+
     return true;
 }
diff -ur /raidz/dev/htpc/mythtv-git/mythplugins/mythgame/mythgame/gamedetails.cpp mythtv-build-010912/mythplugins/mythgame/mythgame/gamedetails.cpp
--- /raidz/dev/htpc/mythtv-git/mythplugins/mythgame/mythgame/gamedetails.cpp	2011-11-14 18:31:36.549962305 -0600
+++ mythtv-build-010912/mythplugins/mythgame/mythgame/gamedetails.cpp	2012-01-09 22:18:45.597755371 -0600
@@ -81,6 +81,11 @@
     handleText("year", m_romInfo->Year());
     handleText("country", m_romInfo->Country());
     handleText("publisher", m_romInfo->Publisher());
+    handleText("developer", m_romInfo->Developer());
+    handleText("esrb", m_romInfo->ESRB_str());
+    handleText("metarating", m_romInfo->Metarating_str());
+    handleText("rating", m_romInfo->Rating_str());
+    handleText("players", QString::number(m_romInfo->Players()));
     handleText("description", m_romInfo->Plot());
     handleText("allsystems", m_romInfo->AllSystems());
     handleImage("fanart", m_romInfo->Fanart());
diff -ur /raidz/dev/htpc/mythtv-git/mythplugins/mythgame/mythgame/gamedetails.h mythtv-build-010912/mythplugins/mythgame/mythgame/gamedetails.h
--- /raidz/dev/htpc/mythtv-git/mythplugins/mythgame/mythgame/gamedetails.h	2011-11-14 18:31:36.549962305 -0600
+++ mythtv-build-010912/mythplugins/mythgame/mythgame/gamedetails.h	2012-01-09 22:18:45.597755371 -0600
@@ -38,6 +38,11 @@
     MythUIText  *m_country;
     MythUIText  *m_plot;
     MythUIText  *m_publisher;
+    MythUIText  *m_developer;
+    MythUIText  *m_esrb;
+    MythUIText  *m_metarating;
+    MythUIText  *m_rating;
+    MythUIText  *m_players;
     MythUIText  *m_allSystems;
     MythUIImage *m_fanartImage;
     MythUIImage *m_boxImage;
diff -ur /raidz/dev/htpc/mythtv-git/mythplugins/mythgame/mythgame/gamehandler.cpp mythtv-build-010912/mythplugins/mythgame/mythgame/gamehandler.cpp
--- /raidz/dev/htpc/mythtv-git/mythplugins/mythgame/mythgame/gamehandler.cpp	2011-11-14 18:31:36.549962305 -0600
+++ mythtv-build-010912/mythplugins/mythgame/mythgame/gamehandler.cpp	2012-01-09 22:18:45.597755371 -0600
@@ -155,7 +155,7 @@
     *Year = QObject::tr("19xx");
     *Country = QObject::tr("Unknown");
     *GameName = QObject::tr("Unknown");
-    *Genre = QObject::tr("Unknown");
+    *Genre = QString("Unknown%1").arg( handler->GameType() );
     *Plot = QObject::tr("Unknown");
     *Publisher = QObject::tr("Unknown");
     *Version = QObject::tr("0");
@@ -168,24 +168,25 @@
         {
             LOG(VB_GENERAL, LOG_INFO, LOC + QString("ROMDB FOUND for %1 - %2")
                      .arg(romDB[key].GameName()).arg(key));
-            *Year = romDB[key].Year();
-            *Country = romDB[key].Country();
-            *Genre = romDB[key].Genre();
-            *Publisher = romDB[key].Publisher();
-            *GameName = romDB[key].GameName();
-            *Version = romDB[key].Version();
+            if (!romDB[key].Year().trimmed().isEmpty())
+                *Year = romDB[key].Year();
+            if (!romDB[key].Country().trimmed().isEmpty())
+                *Country = romDB[key].Country();
+            if (!romDB[key].Genre().trimmed().isEmpty())
+                *Genre = romDB[key].Genre();
+            if (!romDB[key].Publisher().trimmed().isEmpty())
+                *Publisher = romDB[key].Publisher();
+            if (!romDB[key].GameName().trimmed().isEmpty())
+                *GameName = romDB[key].GameName();
+            if (!romDB[key].Version().trimmed().isEmpty())
+                *Version = romDB[key].Version();
         }
         else
         {
             LOG(VB_GENERAL, LOG_ERR, LOC + QString("NO ROMDB FOUND for %1 (%2)")
                     .arg(rom).arg(*CRC32));
         }
-
-    };
-
-    if ((*Genre == "Unknown") || (*Genre).isEmpty())
-        *Genre = QString("Unknown%1").arg( handler->GameType() );
-
+    }
 }
 
 static void purgeGameDB(QString filename, QString RomPath)
@@ -390,13 +391,15 @@
 
     GameScanMap::Iterator iter;
 
-    QString GameName, Genre, Country, CRC32, Year, Plot;
-    QString Publisher, Version, Fanart, Boxart, ScreenShot;
+    QString GameName, Genre, Country, CRC32, Year, Plot, Publisher;
+    QString Developer, Version, Fanart, Boxart, ScreenShot;
     QString thequery, queryvalues;
+    int ESRB = -1, Metarating = 0, Rating = 0, Players = 1;
 
     int removalprompt = gCoreContext->GetSetting("GameRemovalPrompt").toInt();
     int indepth = gCoreContext->GetSetting("GameDeepScan").toInt();
     QString screenShotPath = gCoreContext->GetSetting("mythgame.screenshotdir");
+    Developer = QObject::tr("Unknown");
 
     for (iter = m_GameMap.begin(); iter != m_GameMap.end(); ++iter)
     {
@@ -451,10 +454,12 @@
             query.prepare("INSERT INTO gamemetadata "
                           "(system, romname, gamename, genre, year, gametype, "
                           "rompath, country, crc_value, diskcount, display, plot, "
-                          "publisher, version, fanart, boxart, screenshot) "
+                          "publisher, developer, esrb, metarating, rating, "
+                          "players, version, fanart, boxart, screenshot) "
                           "VALUES (:SYSTEM, :ROMNAME, :GAMENAME, :GENRE, :YEAR, "
-                          ":GAMETYPE, :ROMPATH, :COUNTRY, :CRC32, '1', '1', :PLOT, :PUBLISHER, :VERSION, "
-                          ":FANART, :BOXART, :SCREENSHOT)");
+                          ":GAMETYPE, :ROMPATH, :COUNTRY, :CRC32, '1', '1', :PLOT, "
+                          ":PUBLISHER, :DEVELOPER, :ESRB, :METARATING, :RATING, "
+                          ":PLAYERS, :VERSION, :FANART, :BOXART, :SCREENSHOT)");
 
             query.bindValue(":SYSTEM",handler->SystemName());
             query.bindValue(":ROMNAME",iter.value().Rom());
@@ -467,6 +472,11 @@
             query.bindValue(":CRC32", CRC32);
             query.bindValue(":PLOT", Plot);
             query.bindValue(":PUBLISHER", Publisher);
+            query.bindValue(":DEVELOPER", Developer);
+            query.bindValue(":ESRB", QString::number(ESRB));
+            query.bindValue(":METARATING", QString::number(Metarating));
+            query.bindValue(":RATING", QString::number(Rating));
+            query.bindValue(":PLAYERS", QString::number(Players));
             query.bindValue(":VERSION", Version);
             query.bindValue(":FANART", Fanart);
             query.bindValue(":BOXART", Boxart);
diff -ur /raidz/dev/htpc/mythtv-git/mythplugins/mythgame/mythgame/gamescan.cpp mythtv-build-010912/mythplugins/mythgame/mythgame/gamescan.cpp
--- /raidz/dev/htpc/mythtv-git/mythplugins/mythgame/mythgame/gamescan.cpp	2011-11-14 18:31:36.549962305 -0600
+++ mythtv-build-010912/mythplugins/mythgame/mythgame/gamescan.cpp	2012-01-09 22:18:45.597755371 -0600
@@ -117,7 +117,7 @@
             RomInfo *add = new RomInfo(0, (*p).romfile, (*p).system,
                                (*p).romname, "", "", "", (*p).rompath,
                                "", "", 0, (*p).gametype, 0, "", "", "",
-                               "", "", "", "", "");
+                               "", -1, 0, 0, 1, "", "", "", "", "");
             add->SaveToDatabase();
             m_DBDataChanged = true;
         }
@@ -125,11 +125,16 @@
             SendProgressEvent(++counter);
     }
 
-    for (QList<uint>::iterator p = m_remove.begin();
-                                 p != m_remove.end(); ++p)
+    // Do not remove if user has requested a prompt
+    // Very annoying to accidentally hit the menu scan option when a large database
+    // has been defined for games on a removable device
+    if (!gCoreContext->GetSetting("GameRemovalPrompt").toInt())
     {
-        removeOrphan(*p);
-        m_DBDataChanged = true;
+        for (QList<uint>::iterator p = m_remove.begin(); p != m_remove.end(); ++p)
+        {
+            removeOrphan(*p);
+            m_DBDataChanged = true;
+        }
     }
 }
 
diff -ur /raidz/dev/htpc/mythtv-git/mythplugins/mythgame/mythgame/gamesettings.cpp mythtv-build-010912/mythplugins/mythgame/mythgame/gamesettings.cpp
--- /raidz/dev/htpc/mythtv-git/mythplugins/mythgame/mythgame/gamesettings.cpp	2011-11-14 18:31:36.549962305 -0600
+++ mythtv-build-010912/mythplugins/mythgame/mythgame/gamesettings.cpp	2012-01-09 22:18:45.597755371 -0600
@@ -24,9 +24,9 @@
     HostLineEdit *gc = new HostLineEdit("GameAllTreeLevels");
     gc->setLabel(QObject::tr("Game display order"));
     gc->setValue("system gamename");
-    gc->setHelpText(QObject::tr("Order in which to sort the games "
-                    "- this is for all systems. Available choices: "
-                    "system, year, genre and gamename"));
+    gc->setHelpText(QObject::tr("Metadata values used to build dynamic game "
+                    "tree. Available choices: system, year, genre, players, "
+                    "esrb, rating, developer, publisher, and country"));
     return gc;
 }
 
@@ -35,10 +35,9 @@
     HostLineEdit *gc = new HostLineEdit("GameFavTreeLevels");
     gc->setLabel(QObject::tr("Favourite display order"));
     gc->setValue("gamename");
-    gc->setHelpText(QObject::tr("Order in which to sort the games "
-                    "marked as favourites "
-                    "- this is for all systems. Available choices: "
-                    "system, year, genre and gamename"));
+    gc->setHelpText(QObject::tr("Order in which to sort the games marked "
+                    "as favourites. Available choices: system, year, genre, "
+                    "esrb, rating, developer, publisher, and country"));
     return gc;
 }
 
diff -ur /raidz/dev/htpc/mythtv-git/mythplugins/mythgame/mythgame/gameui.cpp mythtv-build-010912/mythplugins/mythgame/mythgame/gameui.cpp
--- /raidz/dev/htpc/mythtv-git/mythplugins/mythgame/mythgame/gameui.cpp	2011-11-14 18:31:36.549962305 -0600
+++ mythtv-build-010912/mythplugins/mythgame/mythgame/gameui.cpp	2012-01-09 22:18:45.597755371 -0600
@@ -5,6 +5,7 @@
 #include <mythcontext.h>
 #include <mythuibuttontree.h>
 #include <metadata/mythuimetadataresults.h>
+#include <metadata/mythuiimageresults.h>
 #include <mythuiimage.h>
 #include <mythuitext.h>
 #include <mythuistatetype.h>
@@ -24,18 +25,40 @@
 class GameTreeInfo
 {
   public:
-    GameTreeInfo(const QString& levels, const QString& filter)
-      : m_levels(levels.split(" "))
+    GameTreeInfo(const QString& sortby, const QString& si, const QString& filter)
+      : m_sortby(sortby.split(" "))
+      , m_sorted(si.toLower())
       , m_filter(filter)
     {
     }
 
-    int getDepth() const                        { return m_levels.size(); }
-    const QString& getLevel(unsigned i) const   { return m_levels[i]; }
+    int getDepth() const                        { return m_sortby.size(); }
+    const QString& getLevel(unsigned i) const   { return m_sortby[i]; }
     const QString& getFilter() const            { return m_filter; }
+    const QString& getSorted(unsigned i) const { return m_sorted[i]; }
+    void setSorted(const QString &lsorted, int i)
+    {
+        if (i > 0)
+            m_sorted.insert(i, lsorted.toLower());
+        while ((m_sorted.size() - 1) > i)
+            m_sorted.removeLast();
+    }
+    const QStringList getToSort(int i)
+    {
+        QStringList to_sort = QStringList(m_sortby);
+
+        for (int k = 0; k < i; k++)
+        {
+            if (to_sort.contains(m_sorted[k]))
+                to_sort.removeOne(m_sorted[k]);
+        }
+
+        return to_sort;
+    }
 
   private:
-    QStringList m_levels;
+    QStringList m_sortby;
+    QStringList m_sorted;
     QString m_filter;
 };
 
@@ -44,11 +67,14 @@
 GameUI::GameUI(MythScreenStack *parent)
        : MythScreenType(parent, "GameUI"),
             m_showHashed(false), m_gameShowFileName(0),
-            m_gameTree(NULL), m_favouriteNode(NULL),
-            m_busyPopup(0),
+            m_showHidden(false), m_gameTree(NULL),
+            m_favouriteNode(NULL), m_busyPopup(0),
             m_gameUITree(NULL), m_gameTitleText(NULL),
             m_gameSystemText(NULL), m_gameYearText(NULL),
             m_gameGenreText(NULL), m_gamePlotText(NULL),
+            m_gamePublisherText(NULL), m_gameDeveloperText(NULL),
+            m_gameESRBText(NULL), m_gameMetaratingText(NULL),
+            m_gameRatingText(NULL), m_gamePlayersText(NULL),
             m_gameFavouriteState(NULL), m_gameImage(NULL),
             m_fanartImage(NULL), m_boxImage(NULL),
             m_scanner(NULL)
@@ -74,6 +100,12 @@
     UIUtilW::Assign(this, m_gameSystemText, "system");
     UIUtilW::Assign(this, m_gameYearText, "year");
     UIUtilW::Assign(this, m_gameGenreText, "genre");
+    UIUtilW::Assign(this, m_gamePublisherText, "publisher");
+    UIUtilW::Assign(this, m_gameDeveloperText, "developer");
+    UIUtilW::Assign(this, m_gameESRBText, "esrb");
+    UIUtilW::Assign(this, m_gameMetaratingText, "metarating");
+    UIUtilW::Assign(this, m_gameRatingText, "rating");
+    UIUtilW::Assign(this, m_gamePlayersText, "players");
     UIUtilW::Assign(this, m_gameFavouriteState, "favorite");
     UIUtilW::Assign(this, m_gamePlotText, "description");
     UIUtilW::Assign(this, m_gameImage, "screenshot");
@@ -134,47 +166,50 @@
     //  approach with multiple roots if/when someone has the time to create
     //  the relevant dialog screens
 
-    QString levels = gCoreContext->GetSetting("GameFavTreeLevels");
+    QString sortby = gCoreContext->GetSetting("GameFavTreeLevels");
 
     MythGenericTree *new_node = new MythGenericTree(tr("Favorites"), 1, true);
     new_node->SetData(qVariantFromValue(
-                new GameTreeInfo(levels, systemFilter + " and favorite=1")));
+                new GameTreeInfo(sortby, sortby.section(' ', 0, 0), systemFilter + " and favorite=1")));
     m_favouriteNode = m_gameTree->addNode(new_node);
+    if (m_gameTitleText)
+        m_gameTitleText->SetText(QString("Sort by Favorites"));
 
-    levels = gCoreContext->GetSetting("GameAllTreeLevels");
+    sortby = gCoreContext->GetSetting("GameAllTreeLevels");
 
     if (m_showHashed)
     {
-        int pos = levels.indexOf("gamename");
+        int pos = sortby.indexOf("gamename");
         if (pos >= 0)
-            levels.insert(pos, " hash ");
+            sortby.insert(pos, " hash ");
     }
 
-    new_node = new MythGenericTree(tr("All Games"), 1, true);
-    new_node->SetData(qVariantFromValue(
-                new GameTreeInfo(levels, systemFilter)));
-    m_gameTree->addNode(new_node);
+    if (sortby.trimmed().isEmpty())
+    {
+        new_node = new MythGenericTree(tr("Games"), 1, true);
+        new_node->SetData(qVariantFromValue(
+                          new GameTreeInfo(m_showHashed ? "hash" : "gamename",
+                                           m_showHashed ? "hash" : "gamename",
+                                           systemFilter)));
+        m_gameTree->addNode(new_node);
+    }
 
-    new_node = new MythGenericTree(tr("-   By Genre"), 1, true);
-    new_node->SetData(qVariantFromValue(
-                new GameTreeInfo("genre gamename", systemFilter)));
-    m_gameTree->addNode(new_node);
+    QString sort_item;
+    for (unsigned i = 0; !(sort_item = sortby.section(' ', i, i).trimmed()).isEmpty(); i++)
+    {
+        QString new_sort = sortby;
 
-    new_node = new MythGenericTree(tr("-   By Year"), 1, true);
-    new_node->SetData(qVariantFromValue(
-                new GameTreeInfo("year gamename", systemFilter)));
-    m_gameTree->addNode(new_node);
+        new_sort.remove(sort_item + " ");
+        new_sort.insert(0, sort_item + " ");
 
-    new_node = new MythGenericTree(tr("-   By Name"), 1, true);
-    new_node->SetData(qVariantFromValue(
-                new GameTreeInfo("gamename", systemFilter)));
-    m_gameTree->addNode(new_node);
-
-    new_node = new MythGenericTree(tr("-   By Publisher"), 1, true);
-    new_node->SetData(qVariantFromValue(
-                new GameTreeInfo("publisher gamename", systemFilter)));
-    m_gameTree->addNode(new_node);
+        sort_item[0] = sort_item[0].toUpper();
+        new_node = new MythGenericTree(sort_item, 1, true);
+        new_node->SetData(qVariantFromValue(
+                          new GameTreeInfo(new_sort.trimmed(), sort_item, systemFilter)));
+        m_gameTree->addNode(new_node);
+    }
 
+    fillNode(m_gameTree->getSelectedChild());
     m_gameUITree->AssignTree(m_gameTree);
 }
 
@@ -221,14 +256,44 @@
     if (!node)
         return;
 
+    int sortLevel = (node->getInt() / 2);
+    bool sortTree = (node->getInt() % 2);
+
     if (!isLeaf(node))
     {
+        if (sortLevel && !sortTree)
+        {
+            QString si = node->getParent()->getString().toLower();
+            setSortedString(node, si, sortLevel - 1);
+        }
+
         if (node->childCount() == 0 || node == m_favouriteNode)
         {
             node->deleteAllChildren();
             fillNode(node);
         }
         clearRomInfo();
+
+        if (m_gameTitleText && sortTree)
+            m_gameTitleText->SetText(QString("Sort by " + node->getString()));
+
+        if (sortLevel)
+        {
+            if (!sortTree)
+            {
+                QString tmptitle = getSortedString(node, sortLevel - 1);
+
+                if (m_gameTitleText)
+                {
+                    if (tmptitle == "esrb")
+                        tmptitle = tmptitle.toUpper();
+                    else
+                        tmptitle[0] = tmptitle[0].toUpper();
+
+                    m_gameTitleText->SetText("Select " + tmptitle);
+                }
+            }
+        }
     }
     else
     {
@@ -329,6 +394,18 @@
         m_gameGenreText->SetText(rom->Genre());
     if (m_gamePlotText)
         m_gamePlotText->SetText(rom->Plot());
+    if (m_gamePublisherText)
+        m_gamePublisherText->SetText(rom->Publisher());
+    if (m_gameDeveloperText)
+        m_gameDeveloperText->SetText(rom->Developer());
+    if (m_gameESRBText)
+        m_gameESRBText->SetText(rom->ESRB_str());
+    if (m_gameMetaratingText)
+        m_gameMetaratingText->SetText(rom->Metarating_str());
+    if (m_gameRatingText)
+        m_gameRatingText->SetText(rom->Rating_str());
+    if (m_gamePlayersText)
+        m_gamePlayersText->SetText(QString::number(rom->Players()));
 
     if (m_gameFavouriteState)
     {
@@ -367,6 +444,18 @@
         m_gameGenreText->Reset();
     if (m_gamePlotText)
         m_gamePlotText->Reset();
+    if (m_gamePublisherText)
+        m_gamePublisherText->Reset();
+    if (m_gameDeveloperText)
+        m_gameDeveloperText->Reset();
+    if (m_gameESRBText)
+        m_gameESRBText->Reset();
+    if (m_gameMetaratingText)
+        m_gameMetaratingText->Reset();
+    if (m_gameRatingText)
+        m_gameRatingText->Reset();
+    if (m_gamePlayersText)
+        m_gamePlayersText->Reset();
     if (m_gameFavouriteState)
         m_gameFavouriteState->Reset();
 
@@ -438,6 +527,12 @@
         showMenuPopup->SetReturnEvent(this, "showMenuPopup");
 
         showMenuPopup->AddButton(tr("Scan For Changes"));
+
+        if (showHidden())
+            showMenuPopup->AddButton(tr("Hide Hidden"));
+        else
+            showMenuPopup->AddButton(tr("Show Hidden"));
+
         if (isLeaf(node))
         {
             RomInfo *romInfo = qVariantValue<RomInfo *>(node->GetData());
@@ -521,6 +616,11 @@
             {
                 doScan();
             }
+            else if (resulttext == tr("Show Hidden") ||
+                     resulttext == tr("Hide Hidden"))
+            {
+                toggleHidden();
+            }
             else if (resulttext == tr("Show Information"))
             {
                 showInfo();
@@ -637,16 +737,26 @@
 
 QString GameUI::getFillSql(MythGenericTree *node) const
 {
-    QString layer = node->getString();
-    int childDepth = node->getInt() + 1;
-    QString childLevel = getChildLevelString(node);
+    int sortLevel = (node->getInt() / 2);
+    bool sortTree = (node->getInt() % 2);
+    QString layer = sortTree ? node->getString() : node->getParent()->getString();
+    QString childLevel = layer.toLower();
     QString filter = getFilter(node);
-    bool childIsLeaf = childDepth == getLevelsOnThisBranch(node) + 1;
+    bool childIsLeaf = ((layer == "Games") || (sortLevel == getLevelsOnThisBranch(node)));
     RomInfo *romInfo = qVariantValue<RomInfo *>(node->GetData());
 
     QString columns;
     QString conj = "where ";
 
+    if (childIsLeaf)
+    {
+        childLevel = m_showHashed ? "hash" : "gamename";
+    }
+    else if (layer == "Favorites")
+    {
+        childLevel = getChildLevelString(node);
+    }
+
     if (!filter.isEmpty())
     {
         filter = conj + filter;
@@ -713,14 +823,37 @@
             filter += conj + "publisher=:PUBLISHER";
             conj = " and ";
         }
+        if (!romInfo->Developer().isEmpty())
+        {
+            filter += conj + "developer=:DEVELOPER";
+            conj = " and ";
+        }
+        if (!romInfo->Country().isEmpty())
+        {
+            filter += conj + "trim(country)=:COUNTRY";
+        }
         if (!romInfo->Gamename().isEmpty())
         {
             filter += conj + "trim(gamename)=:GAMENAME";
         }
 
+        for (int i = 0; i < sortLevel; i++)
+        {
+            QString si = getSortedString(node, i);
+
+            if (si == "esrb")
+                filter += conj + "esrb=:ESRB";
+            else if (si == "metarating")
+                filter += conj + "metarating=:METARATING";
+            else if (si == "rating")
+                filter += conj + "rating=:RATING";
+            else if (si == "players")
+                filter += conj + "players=:PLAYERS";
+        }
     }
 
-    filter += conj + " display = 1 ";
+    if (!showHidden())
+        filter += conj + " display = 1 ";
 
     QString sql;
 
@@ -758,12 +891,22 @@
 
 QString GameUI::getChildLevelString(MythGenericTree *node) const
 {
-    unsigned this_level = node->getInt();
+    unsigned this_level = node->getInt() / 2;
     while (node->getInt() != 1)
         node = node->getParent();
 
     GameTreeInfo *gi = qVariantValue<GameTreeInfo *>(node->GetData());
-    return gi->getLevel(this_level - 1);
+    return gi->getLevel(this_level);
+}
+
+QString GameUI::getSortedString(MythGenericTree *node, unsigned index) const
+{
+    unsigned this_index = (index == 0xffff) ? (node->getInt() / 2): index;
+    while (node->getInt() != 1)
+        node = node->getParent();
+
+    GameTreeInfo *gi = qVariantValue<GameTreeInfo *>(node->GetData());
+    return gi->getSorted(this_index);
 }
 
 QString GameUI::getFilter(MythGenericTree *node) const
@@ -774,6 +917,22 @@
     return gi->getFilter();
 }
 
+void GameUI::setSortedString(MythGenericTree *node, QString si, unsigned index)
+{
+    while (node->getInt() != 1)
+        node = node->getParent();
+    GameTreeInfo *gi = qVariantValue<GameTreeInfo *>(node->GetData());
+    gi->setSorted(si, index);
+}
+
+QStringList GameUI::getToSortList(MythGenericTree *node, int index)
+{
+    while (node->getInt() != 1)
+        node = node->getParent();
+    GameTreeInfo *gi = qVariantValue<GameTreeInfo *>(node->GetData());
+    return gi->getToSort(index);
+}
+
 int GameUI::getLevelsOnThisBranch(MythGenericTree *node) const
 {
     while (node->getInt() != 1)
@@ -785,13 +944,48 @@
 
 bool GameUI::isLeaf(MythGenericTree *node) const
 {
-  return (node->getInt() - 1) == getLevelsOnThisBranch(node);
+    return (((node->getInt() - 1) / 2) == getLevelsOnThisBranch(node)) || node->getParent()->getString() == "Games";
 }
 
 void GameUI::fillNode(MythGenericTree *node)
 {
     QString layername = node->getString();
     RomInfo *romInfo = qVariantValue<RomInfo *>(node->GetData());
+    int sortLevel = (node->getInt() / 2);
+    bool sortTree = (node->getInt() % 2);
+
+    bool childIsLeaf = (layername == "Games") ||
+                  (!sortTree && (sortLevel == getLevelsOnThisBranch(node)));
+
+    if (!childIsLeaf && sortLevel && !sortTree)
+    {
+        QStringList ts = getToSortList(node, sortLevel);
+        int ns = getLevelsOnThisBranch(node);
+
+        MythGenericTree *new_node = new MythGenericTree(tr("Games"),
+                                                        node->getInt() + 1,
+                                                        false);
+        new_node->SetData(qVariantFromValue(romInfo));
+        node->addNode(new_node);
+
+        for (int i = 0; i < (ns - sortLevel); i++)
+        {
+            QString ni = ts[i];
+
+            if (ni == "esrb")
+                ni = ni.toUpper();
+            else
+                ni[0] = ni[0].toUpper();
+
+            MythGenericTree *new_node = new MythGenericTree(ni,
+                                                            node->getInt() + 1,
+                                                            false);
+            new_node->SetData(qVariantFromValue(romInfo));
+            node->addNode(new_node);
+        }
+
+        return;
+    }
 
     MSqlQuery query(MSqlQuery::InitCon());
 
@@ -809,11 +1003,29 @@
             query.bindValue(":PLOT", romInfo->Plot());
         if (!romInfo->Publisher().isEmpty())
             query.bindValue(":PUBLISHER", romInfo->Publisher());
+        if (!romInfo->Developer().isEmpty())
+            query.bindValue(":DEVELOPER", romInfo->Developer());
+
+        for (int i = 0; i < sortLevel; i++)
+        {
+            QString si = getSortedString(node, i);
+
+            if (si == "esrb")
+                query.bindValue(":ESRB", QString::number(romInfo->ESRB()));
+            else if (si == "metarating")
+                query.bindValue(":METARATING", QString::number(romInfo->Metarating()));
+            else if (si == "rating")
+                query.bindValue(":RATING", QString::number(romInfo->Rating()));
+            else if (si == "players")
+                query.bindValue(":PLAYERS", QString::number(romInfo->Players()));
+        }
+
+        if (!romInfo->Country().isEmpty())
+            query.bindValue(":COUNTRY", romInfo->Country());
         if (!romInfo->Gamename().isEmpty())
             query.bindValue(":GAMENAME", romInfo->Gamename());
     }
 
-    bool IsLeaf = node->getInt() == getLevelsOnThisBranch(node);
     if (query.exec() && query.size() > 0)
     {
         while (query.next())
@@ -821,7 +1033,7 @@
             QString current = query.value(0).toString().trimmed();
             MythGenericTree *new_node =
                 new MythGenericTree(current, node->getInt() + 1, false);
-            if (IsLeaf)
+            if (childIsLeaf)
             {
                 RomInfo *temp = new RomInfo();
                 temp->setSystem(query.value(1).toString().trimmed());
@@ -834,7 +1046,7 @@
             else
             {
                 RomInfo *newRomInfo;
-                if (node->getInt() > 1)
+                if (sortLevel > 0)
                 {
                     RomInfo *currentRomInfo;
                     currentRomInfo = qVariantValue<RomInfo *>(node->GetData());
@@ -846,8 +1058,19 @@
                 }
                 new_node->SetData(qVariantFromValue(newRomInfo));
                 node->addNode(new_node);
-                if (getChildLevelString(node) != "hash")
-                    newRomInfo->setField(getChildLevelString(node), current);
+                QString ci = node->getString().toLower();
+
+                if (ci != "hash")
+                {
+                    if (ci == "favorites")
+                        ci = getChildLevelString(node);
+
+                    newRomInfo->setField(ci, current);
+                    if (ci == "rating")
+                        new_node->SetText(newRomInfo->Rating_str());
+                    else if (ci == "esrb")
+                        new_node->SetText(newRomInfo->ESRB_str());
+                }
             }
         }
     }
@@ -970,85 +1193,88 @@
         return;
 
     metadata->setGamename(lookup->GetTitle());
-    metadata->setYear(QString::number(lookup->GetYear()));
     metadata->setPlot(lookup->GetDescription());
-    metadata->setSystem(lookup->GetSystem());
+    if (metadata->Genre().trimmed().isEmpty() || metadata->Genre().contains("Unknown"))
+        metadata->setGenre(lookup->GetCategories().join("/"));
+    if (metadata->Country().trimmed().isEmpty())
+        metadata->setCountry(lookup->GetCountries().join("/"));
+    if (metadata->Publisher().trimmed().isEmpty() || metadata->Publisher().contains("Unknown"))
+        metadata->setPublisher(lookup->GetPublishers().join("/"));
+    if (metadata->Developer().trimmed().isEmpty() || metadata->Developer().contains("Unknown"))
+        metadata->setDeveloper(lookup->GetStudios().join("/"));
+    if ((metadata->Year().trimmed().isEmpty() || !metadata->Year().compare("0") ||
+        !metadata->Year().compare("19xx")) && (lookup->GetYear() > 1950))
+        metadata->setYear(QString::number(lookup->GetYear()));
+    if (lookup->GetPopularity() > 0)
+        metadata->setMetarating(lookup->GetPopularity());
 
-    QStringList coverart, fanart, screenshot;
+    m_metadataNode = node;
 
     // Imagery
     ArtworkList coverartlist = lookup->GetArtwork(kArtworkCoverart);
-    for (ArtworkList::const_iterator p = coverartlist.begin();
-        p != coverartlist.end(); ++p)
+    if (coverartlist.count() > 0)
     {
-        coverart.prepend((*p).url);
+        ImageSearchResultsDialog *resultsdialog =
+              new ImageSearchResultsDialog(m_popupStack, coverartlist, kArtworkCoverart);
+
+        connect(resultsdialog, SIGNAL(haveResult(ArtworkInfo, VideoArtworkType)),
+                SLOT(OnImageSearchListSelection(ArtworkInfo, VideoArtworkType)));
+
+        if (resultsdialog->Create())
+            m_popupStack->AddScreen(resultsdialog);
     }
+
     ArtworkList fanartlist = lookup->GetArtwork(kArtworkFanart);
-    for (ArtworkList::const_iterator p = fanartlist.begin();
-        p != fanartlist.end(); ++p)
+    if (fanartlist.count() > 0)
     {
-        fanart.prepend((*p).url);
+        ImageSearchResultsDialog *resultsdialog =
+              new ImageSearchResultsDialog(m_popupStack, fanartlist, kArtworkFanart);
+
+        connect(resultsdialog, SIGNAL(haveResult(ArtworkInfo, VideoArtworkType)),
+                SLOT(OnImageSearchListSelection(ArtworkInfo, VideoArtworkType)));
+
+        if (resultsdialog->Create())
+            m_popupStack->AddScreen(resultsdialog);
     }
+
     ArtworkList screenshotlist = lookup->GetArtwork(kArtworkScreenshot);
-    for (ArtworkList::const_iterator p = screenshotlist.begin();
-        p != screenshotlist.end(); ++p)
+    if (screenshotlist.count() > 0)
     {
-        screenshot.prepend((*p).url);
-    }
+        ImageSearchResultsDialog *resultsdialog =
+              new ImageSearchResultsDialog(m_popupStack, screenshotlist, kArtworkScreenshot);
 
-    StartGameImageSet(node, coverart, fanart, screenshot);
+        connect(resultsdialog, SIGNAL(haveResult(ArtworkInfo, VideoArtworkType)),
+                SLOT(OnImageSearchListSelection(ArtworkInfo, VideoArtworkType)));
+
+        if (resultsdialog->Create())
+            m_popupStack->AddScreen(resultsdialog);
+    }
 
     metadata->SaveToDatabase();
     updateChangedNode(node, metadata);
 }
 
-void GameUI::StartGameImageSet(MythGenericTree *node, QStringList coverart,
-                                     QStringList fanart, QStringList screenshot)
+void GameUI::OnImageSearchListSelection(ArtworkInfo info, VideoArtworkType type)
 {
-    if (!node)
-        return;
-
-    RomInfo *metadata = qVariantValue<RomInfo *>(node->GetData());
+    RomInfo *metadata = qVariantValue<RomInfo *>(m_metadataNode->GetData());
 
     if (!metadata)
         return;
 
-    ArtworkMap map;
-
-    QString inetref = metadata->Inetref();
-    QString system = metadata->System();
-    QString title = metadata->Gamename();
-
-    if (metadata->Boxart().isEmpty() && coverart.size())
-    {
-        ArtworkInfo info;
-        info.url = coverart.takeAt(0).trimmed();
-        map.insert(kArtworkCoverart, info);
-    }
-
-    if (metadata->Fanart().isEmpty() && fanart.size())
-    {
-        ArtworkInfo info;
-        info.url = fanart.takeAt(0).trimmed();
-        map.insert(kArtworkFanart, info);
-    }
-
-    if (metadata->Screenshot().isEmpty() && screenshot.size())
-    {
-        ArtworkInfo info;
-        info.url = screenshot.takeAt(0).trimmed();
-        map.insert(kArtworkScreenshot, info);
-    }
-
-    MetadataLookup *lookup = new MetadataLookup();
-    lookup->SetTitle(metadata->Gamename());
-    lookup->SetSystem(metadata->System());
-    lookup->SetInetref(metadata->Inetref());
-    lookup->SetType(kMetadataGame);
-    lookup->SetDownloads(map);
-    lookup->SetData(qVariantFromValue(node));
-
-    m_imageDownload->addDownloads(lookup);
+    MetadataLookup *m_lookup = new MetadataLookup();
+    m_lookup->SetType(kMetadataGame);
+    m_lookup->SetHost(gCoreContext->GetMasterHostName());
+    m_lookup->SetAutomatic(true);
+
+    ArtworkMap downloads;
+    downloads.insert(type, info);
+    m_lookup->SetDownloads(downloads);
+    m_lookup->SetAllowOverwrites(true);
+    m_lookup->SetTitle(metadata->Gamename());
+    m_lookup->SetSystem(metadata->System());
+    m_lookup->SetInetref(metadata->Inetref());
+    m_lookup->SetData(qVariantFromValue(m_metadataNode));
+    m_imageDownload->addDownloads(m_lookup);
 }
 
 void GameUI::handleDownloadedImages(MetadataLookup *lookup)
diff -ur /raidz/dev/htpc/mythtv-git/mythplugins/mythgame/mythgame/gameui.h mythtv-build-010912/mythplugins/mythgame/mythgame/gameui.h
--- /raidz/dev/htpc/mythtv-git/mythplugins/mythgame/mythgame/gameui.h	2011-11-14 18:31:36.553295639 -0600
+++ mythtv-build-010912/mythplugins/mythgame/mythgame/gameui.h	2012-01-09 22:18:45.597755371 -0600
@@ -44,6 +44,7 @@
     void OnGameSearchDone(MetadataLookup *lookup);
     void StartGameImageSet(MythGenericTree *node, QStringList coverart,
                            QStringList fanart, QStringList screenshot);
+    void OnImageSearchListSelection(ArtworkInfo info, VideoArtworkType type);
     void doScan(void);
     void reloadAllData(bool dbchanged);
 
@@ -55,12 +56,17 @@
     void showMenu(void);
     void searchStart(void);
     void toggleFavorite(void);
+    void toggleHidden(void) { m_showHidden = 1 - m_showHidden; }
+    int  showHidden() const { return m_showHidden; }
     void customEvent(QEvent *event);
     void createBusyDialog(QString title);
 
     QString getFillSql(MythGenericTree* node) const;
     QString getChildLevelString(MythGenericTree *node) const;
+    QString getSortedString(MythGenericTree *node, unsigned level=0xffff) const;
     QString getFilter(MythGenericTree *node) const;
+    void    setSortedString(MythGenericTree *node, QString si, unsigned index);
+    QStringList getToSortList(MythGenericTree *node, int index);
     int     getLevelsOnThisBranch(MythGenericTree *node) const;
     bool    isLeaf(MythGenericTree *node) const;
     void    fillNode(MythGenericTree *node);
@@ -71,9 +77,11 @@
   private:
     bool m_showHashed;
     int m_gameShowFileName;
+    bool m_showHidden;
 
     MythGenericTree  *m_gameTree;
     MythGenericTree  *m_favouriteNode;
+    MythGenericTree  *m_metadataNode;
 
     MythUIBusyDialog *m_busyPopup;
     MythScreenStack  *m_popupStack;
@@ -84,6 +92,12 @@
     MythUIText       *m_gameYearText;
     MythUIText       *m_gameGenreText;
     MythUIText       *m_gamePlotText;
+    MythUIText       *m_gamePublisherText;
+    MythUIText       *m_gameDeveloperText;
+    MythUIText       *m_gameESRBText;
+    MythUIText       *m_gameMetaratingText;
+    MythUIText       *m_gameRatingText;
+    MythUIText       *m_gamePlayersText;
     MythUIStateType  *m_gameFavouriteState;
     MythUIImage      *m_gameImage;
     MythUIImage      *m_fanartImage;
diff -ur /raidz/dev/htpc/mythtv-git/mythplugins/mythgame/mythgame/romedit.cpp mythtv-build-010912/mythplugins/mythgame/mythgame/romedit.cpp
--- /raidz/dev/htpc/mythtv-git/mythplugins/mythgame/mythgame/romedit.cpp	2011-11-14 18:31:36.553295639 -0600
+++ mythtv-build-010912/mythplugins/mythgame/mythgame/romedit.cpp	2012-01-09 22:18:45.597755371 -0600
@@ -20,9 +20,11 @@
         QString name, RomInfo *romInfo) : MythScreenType(parent, name),
     m_id(""), m_retObject(NULL), m_gamenameEdit(NULL), m_genreEdit(NULL),
     m_yearEdit(NULL), m_countryEdit(NULL), m_plotEdit(NULL),
-    m_publisherEdit(NULL), m_favoriteCheck(NULL), m_screenshotButton(NULL),
-    m_screenshotText(NULL), m_fanartButton(NULL), m_fanartText(NULL),
-    m_boxartButton(NULL), m_boxartText(NULL), m_doneButton(NULL)
+    m_publisherEdit(NULL), m_developerEdit(NULL), m_esrbList(NULL),
+    m_ratingList(NULL), m_playersEdit(NULL), m_favoriteCheck(NULL),
+    m_displayCheck(NULL), m_screenshotButton(NULL), m_screenshotText(NULL),
+    m_fanartButton(NULL), m_fanartText(NULL), m_boxartButton(NULL),
+    m_boxartText(NULL), m_doneButton(NULL)
 {
     m_workingRomInfo = new RomInfo(*romInfo);
 }
@@ -44,8 +46,13 @@
     UIUtilE::Assign(this, m_countryEdit, "country_edit", &err);
     UIUtilE::Assign(this, m_plotEdit, "description_edit", &err);
     UIUtilE::Assign(this, m_publisherEdit, "publisher_edit", &err);
+    UIUtilE::Assign(this, m_developerEdit, "developer_edit", &err);
+    UIUtilE::Assign(this, m_esrbList, "esrb_list", &err);
+    UIUtilE::Assign(this, m_ratingList, "rating_list", &err);
+    UIUtilE::Assign(this, m_playersEdit, "players_edit", &err);
 
     UIUtilE::Assign(this, m_favoriteCheck, "favorite_check", &err);
+    UIUtilE::Assign(this, m_displayCheck, "display_check", &err);
 
     UIUtilE::Assign(this, m_screenshotButton, "screenshot_button", &err);
     UIUtilE::Assign(this, m_screenshotText, "screenshot_text", &err);
@@ -72,9 +79,13 @@
     connect(m_countryEdit, SIGNAL(valueChanged()), SLOT(SetCountry()));
     connect(m_plotEdit, SIGNAL(valueChanged()), SLOT(SetPlot()));
     connect(m_publisherEdit, SIGNAL(valueChanged()), SLOT(SetPublisher()));
+    connect(m_developerEdit, SIGNAL(valueChanged()), SLOT(SetDeveloper()));
+    connect(m_esrbList, SIGNAL(itemSelected(MythUIButtonListItem *)), SLOT(SetESRB()));
+    connect(m_ratingList, SIGNAL(itemSelected(MythUIButtonListItem *)), SLOT(SetRating()));
+    connect(m_playersEdit, SIGNAL(valueChanged()), SLOT(SetPlayers()));
 
     connect(m_favoriteCheck, SIGNAL(valueChanged()), SLOT(ToggleFavorite()));
-
+    connect(m_displayCheck, SIGNAL(valueChanged()), SLOT(ToggleDisplay()));
     connect(m_screenshotButton, SIGNAL(Clicked()), SLOT(FindScreenshot()));
     connect(m_fanartButton, SIGNAL(Clicked()), SLOT(FindFanart()));
     connect(m_boxartButton, SIGNAL(Clicked()), SLOT(FindBoxart()));
@@ -147,9 +158,32 @@
     m_countryEdit->SetText(m_workingRomInfo->Country());
     m_plotEdit->SetText(m_workingRomInfo->Plot());
     m_publisherEdit->SetText(m_workingRomInfo->Publisher());
-
+    m_developerEdit->SetText(m_workingRomInfo->Developer());
+    new MythUIButtonListItem(m_esrbList, "RP");
+    new MythUIButtonListItem(m_esrbList, "C");
+    new MythUIButtonListItem(m_esrbList, "E");
+    new MythUIButtonListItem(m_esrbList, "E10");
+    new MythUIButtonListItem(m_esrbList, "T");
+    new MythUIButtonListItem(m_esrbList, "M");
+    new MythUIButtonListItem(m_esrbList, "AO");
+    m_esrbList->SetItemCurrent(m_workingRomInfo->ESRB() + 1);
+    new MythUIButtonListItem(m_ratingList, "Unrated");
+    new MythUIButtonListItem(m_ratingList, "1");
+    new MythUIButtonListItem(m_ratingList, "2");
+    new MythUIButtonListItem(m_ratingList, "3");
+    new MythUIButtonListItem(m_ratingList, "4");
+    new MythUIButtonListItem(m_ratingList, "5");
+    new MythUIButtonListItem(m_ratingList, "6");
+    new MythUIButtonListItem(m_ratingList, "7");
+    new MythUIButtonListItem(m_ratingList, "8");
+    new MythUIButtonListItem(m_ratingList, "9");
+    new MythUIButtonListItem(m_ratingList, "10");
+    m_ratingList->SetItemCurrent(m_workingRomInfo->Rating());
+    m_playersEdit->SetText(QString::number(m_workingRomInfo->Players()));    
     if (m_workingRomInfo->Favorite())
         m_favoriteCheck->SetCheckState(MythUIStateType::Full);
+    if (m_workingRomInfo->Display())
+        m_displayCheck->SetCheckState(MythUIStateType::Full);
 
     m_screenshotText->SetText(m_workingRomInfo->Screenshot());
     m_fanartText->SetText(m_workingRomInfo->Fanart());
@@ -207,11 +241,36 @@
     m_workingRomInfo->setPublisher(m_publisherEdit->GetText());
 }
 
+void EditRomInfoDialog::SetDeveloper()
+{
+    m_workingRomInfo->setDeveloper(m_developerEdit->GetText());
+}
+
+void EditRomInfoDialog::SetESRB()
+{
+    m_workingRomInfo->setESRB(m_esrbList->GetCurrentPos() - 1);
+}
+
+void EditRomInfoDialog::SetRating()
+{
+    m_workingRomInfo->setRating(m_ratingList->GetCurrentPos());
+}
+
+void EditRomInfoDialog::SetPlayers()
+{
+    m_workingRomInfo->setPlayers(m_playersEdit->GetText().toInt());
+}
+
 void EditRomInfoDialog::ToggleFavorite()
 {
     m_workingRomInfo->setFavorite();
 }
 
+void EditRomInfoDialog::ToggleDisplay()
+{
+    m_workingRomInfo->setDisplay();
+}
+
 void EditRomInfoDialog::FindScreenshot()
 {
     FindImagePopup(gCoreContext->GetSetting("mythgame.screenshotDir"),
@@ -238,8 +297,16 @@
     if (file.isEmpty())
         return;
 
-    m_workingRomInfo->setScreenshot(file);
-    m_screenshotText->SetText(file);
+    if (file.size() == 1)
+    {
+        m_workingRomInfo->setScreenshot(NULL);
+        m_screenshotText->SetText(NULL);
+    }
+    else
+    {
+        m_workingRomInfo->setScreenshot(file);
+        m_screenshotText->SetText(file);
+    }
 }
 
 void EditRomInfoDialog::SetFanart(QString file)
@@ -247,8 +314,16 @@
     if (file.isEmpty())
         return;
 
-    m_workingRomInfo->setFanart(file);
-    m_fanartText->SetText(file);
+    if (file.size() == 1)
+    {
+        m_workingRomInfo->setFanart(NULL);
+        m_fanartText->SetText(NULL);
+    }
+    else
+    {
+        m_workingRomInfo->setFanart(file);
+        m_fanartText->SetText(file);
+    }
 }
 
 void EditRomInfoDialog::SetBoxart(QString file)
@@ -256,6 +331,14 @@
     if (file.isEmpty())
         return;
 
-    m_workingRomInfo->setBoxart(file);
-    m_boxartText->SetText(file);
+    if (file.size() == 1)
+    {
+        m_workingRomInfo->setBoxart(NULL);
+        m_boxartText->SetText(NULL);
+    }
+    else
+    {
+        m_workingRomInfo->setBoxart(file);
+        m_boxartText->SetText(file);
+    }
 }
diff -ur /raidz/dev/htpc/mythtv-git/mythplugins/mythgame/mythgame/romedit.h mythtv-build-010912/mythplugins/mythgame/mythgame/romedit.h
--- /raidz/dev/htpc/mythtv-git/mythplugins/mythgame/mythgame/romedit.h	2011-11-14 18:31:36.553295639 -0600
+++ mythtv-build-010912/mythplugins/mythgame/mythgame/romedit.h	2012-01-09 22:18:45.597755371 -0600
@@ -27,7 +27,13 @@
     void SetCountry();
     void SetPlot();
     void SetPublisher();
+    void SetDeveloper();
+    void SetESRB();
+    void SetMetarating();
+    void SetRating();
+    void SetPlayers();
     void ToggleFavorite();
+    void ToggleDisplay();
     void FindScreenshot();
     void FindFanart();
     void FindBoxart();
@@ -50,7 +56,12 @@
     MythUITextEdit      *m_countryEdit;
     MythUITextEdit      *m_plotEdit;
     MythUITextEdit      *m_publisherEdit;
+    MythUITextEdit      *m_developerEdit;
+    MythUIButtonList    *m_esrbList;
+    MythUIButtonList    *m_ratingList;
+    MythUITextEdit      *m_playersEdit;
     MythUICheckBox      *m_favoriteCheck;
+    MythUICheckBox      *m_displayCheck;
     MythUIButton        *m_screenshotButton;
     MythUIText          *m_screenshotText;
     MythUIButton        *m_fanartButton;
diff -ur /raidz/dev/htpc/mythtv-git/mythplugins/mythgame/mythgame/rominfo.cpp mythtv-build-010912/mythplugins/mythgame/mythgame/rominfo.cpp
--- /raidz/dev/htpc/mythtv-git/mythplugins/mythgame/mythgame/rominfo.cpp	2011-11-14 18:31:36.553295639 -0600
+++ mythtv-build-010912/mythplugins/mythgame/mythgame/rominfo.cpp	2012-01-09 22:18:45.597755371 -0600
@@ -33,10 +33,13 @@
         query.prepare("INSERT INTO gamemetadata "
                       "(system, romname, gamename, genre, year, gametype, "
                       "rompath, country, crc_value, diskcount, display, plot, "
-                      "publisher, version, fanart, boxart, screenshot) "
+                      "publisher, developer, esrb, metarating, rating, players, "
+                      "version, fanart, boxart, screenshot) "
                       "VALUES (:SYSTEM, :ROMNAME, :GAMENAME, :GENRE, :YEAR, "
-                      ":GAMETYPE, :ROMPATH, :COUNTRY, :CRC32, '1', '1', :PLOT, "
-                      ":PUBLISHER, :VERSION, :FANART, :BOXART, :SCREENSHOT)");
+                      ":GAMETYPE, :ROMPATH, :COUNTRY, :CRC32, '1', :DISPLAY, "
+                      ":PLOT, :PUBLISHER, :DEVELOPER, :ESRB, :METARATING, "
+                      ":RATING, :PLAYERS, :VERSION, :FANART, :BOXART, "
+                      ":SCREENSHOT)");
 
         query.bindValue(":SYSTEM",System());
         query.bindValue(":ROMNAME",Romname());
@@ -47,8 +50,14 @@
         query.bindValue(":ROMPATH",Rompath());
         query.bindValue(":COUNTRY",Country());
         query.bindValue(":CRC32", QString());
+        query.bindValue(":DISPLAY", Display());
         query.bindValue(":PLOT", Plot());
         query.bindValue(":PUBLISHER", Publisher());
+        query.bindValue(":DEVELOPER", Developer());
+        query.bindValue(":ESRB", QString::number(ESRB()));
+        query.bindValue(":METARATING", QString::number(Metarating()));
+        query.bindValue(":RATING", QString::number(Rating()));
+        query.bindValue(":PLAYERS", QString::number(Players()));
         query.bindValue(":VERSION", Version());
         query.bindValue(":FANART", Fanart());
         query.bindValue(":BOXART", Boxart());
@@ -62,26 +71,39 @@
                       "    genre = :GENRE,"
                       "    year = :YEAR,"
                       "    country = :COUNTRY,"
+                      "    display = :DISPLAY,"
                       "    plot = :PLOT,"
                       "    publisher = :PUBLISHER,"
+                      "    developer = :DEVELOPER,"
+                      "    esrb = :ESRB,"
+                      "    metarating = :METARATING,"
+                      "    rating = :RATING,"
+                      "    players = :PLAYERS,"
                       "    favorite = :FAVORITE,"
                       "    screenshot = :SCREENSHOT,"
                       "    fanart = :FANART,"
                       "    boxart = :BOXART, "
-                      "    inetref = :INETREF "
+                      "    inetref = :INETREF, "
+                      "    display = :DISPLAY "
                       "WHERE gametype = :GAMETYPE AND "
                       "      romname  = :ROMNAME");
         query.bindValue(":GAMENAME", Gamename());
         query.bindValue(":GENRE", Genre());
         query.bindValue(":YEAR", Year());
         query.bindValue(":COUNTRY", Country());
         query.bindValue(":PLOT", Plot());
         query.bindValue(":PUBLISHER", Publisher());
+        query.bindValue(":DEVELOPER", Developer());
+        query.bindValue(":ESRB", QString::number(ESRB()));
+        query.bindValue(":METARATING", QString::number(Metarating()));
+        query.bindValue(":RATING", QString::number(Rating()));
+        query.bindValue(":PLAYERS", QString::number(Players()));
         query.bindValue(":FAVORITE", Favorite());
         query.bindValue(":SCREENSHOT", Screenshot());
         query.bindValue(":FANART", Fanart());
         query.bindValue(":BOXART", Boxart());
         query.bindValue(":INETREF", Inetref());
+        query.bindValue(":DISPLAY", Display());
         query.bindValue(":GAMETYPE", GameType());
         query.bindValue(":ROMNAME", Romname());
     }
@@ -197,10 +219,22 @@
         plot = data;
     else if (field == "publisher")
         publisher = data;
+    else if (field == "developer")
+        developer = data;
+    else if (field == "esrb")
+        esrb = data.toInt();
+    else if (field == "metarating")
+        metarating = data.toInt();
+    else if (field == "rating")
+        rating = data.toInt();
+    else if (field == "players")
+        players = data.toInt();
     else if (field == "crc_value")
         crc_value = data;
     else if (field == "inetref")
         inetref = data;
+    else if (field == "display")
+        display = data.toInt();
     else if (field == "diskcount")
         diskcount = data.toInt();
     else if (field == "gametype")
@@ -262,9 +296,10 @@
 
     QString thequery = "SELECT system,gamename,genre,year,romname,favorite,"
                        "rompath,country,crc_value,diskcount,gametype,plot,publisher,"
-                       "version,screenshot,fanart,boxart,inetref,intid FROM gamemetadata "
-                       "WHERE gamename = :GAMENAME "
-                       + systemtype + " ORDER BY diskcount DESC";
+                       "developer,esrb,metarating,rating,players,version,screenshot,"
+                       "fanart,boxart,inetref,display,intid "
+                       "FROM gamemetadata WHERE gamename = :GAMENAME " + systemtype +
+                       " ORDER BY diskcount DESC";
 
     query.prepare(thequery);
     query.bindValue(":SYSTEM", system);
@@ -285,12 +320,18 @@
         setGameType(query.value(10).toString());
         setPlot(query.value(11).toString());
         setPublisher(query.value(12).toString());
-        setVersion(query.value(13).toString());
-        setScreenshot(query.value(14).toString());
-        setFanart(query.value(15).toString());
-        setBoxart(query.value(16).toString());
-        setInetref(query.value(17).toString());
-        setId(query.value(18).toInt());
+        setDeveloper(query.value(13).toString());
+        setESRB(query.value(14).toInt());
+        setMetarating(query.value(15).toInt());
+        setRating(query.value(16).toInt());
+        setPlayers(query.value(17).toInt());
+        setVersion(query.value(18).toString());
+        setScreenshot(query.value(19).toString());
+        setFanart(query.value(20).toString());
+        setBoxart(query.value(21).toString());
+        setInetref(query.value(22).toString());
+        setField("display",query.value(23).toString());
+        setId(query.value(24).toInt());
     }

     setRomCount(romInDB(romname,gametype));
@@ -325,7 +366,8 @@
 
     MSqlQuery query(MSqlQuery::InitCon());
 
-    QString querystr = "SELECT intid,system,romname,gamename,genre,year,publisher,"
+    QString querystr = "SELECT intid,system,romname,gamename,genre,year,"
+                       "publisher,developer,esrb,metarating,rating,players,"
                        "favorite,rompath,screenshot,fanart,plot,boxart,"
                        "gametype,diskcount,country,crc_value,inetref,display,"
                        "version FROM gamemetadata ORDER BY diskcount DESC";
@@ -347,20 +389,25 @@
                            query.value(3).toString(),
                            query.value(4).toString(),
                            query.value(5).toString(),
-                           query.value(7).toBool(),
-                           query.value(8).toString(),
-                           query.value(15).toString(),
-                           query.value(16).toString(),
-                           query.value(14).toInt(),
+                           query.value(12).toBool(),
                            query.value(13).toString(),
+                           query.value(20).toString(),
+                           query.value(21).toString(),
+                           query.value(19).toInt(),
+                           query.value(18).toString(),
                            0, QString(),
-                           query.value(11).toString(),
+                           query.value(16).toString(),
                            query.value(6).toString(),
-                           query.value(19).toString(),
-                           query.value(9).toString(),
-                           query.value(10).toString(),
-                           query.value(12).toString(),
-                           query.value(17).toString());
+                           query.value(7).toString(),
+                           query.value(8).toInt(),
+                           query.value(9).toInt(),
+                           query.value(10).toInt(),
+                           query.value(11).toInt(),
+                           query.value(24).toString(),
+                           query.value(14).toString(),
+                           query.value(15).toString(),
+                           query.value(17).toString(),
+                           query.value(22).toString());
         ret.append(add);
     }
 
@@ -373,7 +420,8 @@
 
     MSqlQuery query(MSqlQuery::InitCon());
 
-    QString querystr = "SELECT intid,system,romname,gamename,genre,year,publisher,"
+    QString querystr = "SELECT intid,system,romname,gamename,genre,year,"
+                       "publisher,developer,esrb,metarating,rating,players,"
                        "favorite,rompath,screenshot,fanart,plot,boxart,"
                        "gametype,diskcount,country,crc_value,inetref,display,"
                        "version FROM gamemetadata WHERE intid = :INTID";
@@ -396,20 +444,26 @@
                            query.value(3).toString(),
                            query.value(4).toString(),
                            query.value(5).toString(),
-                           query.value(7).toBool(),
-                           query.value(8).toString(),
-                           query.value(15).toString(),
-                           query.value(16).toString(),
-                           query.value(14).toInt(),
+                           query.value(12).toBool(),
                            query.value(13).toString(),
+                           query.value(20).toString(),
+                           query.value(21).toString(),
+                           query.value(19).toInt(),
+                           query.value(18).toString(),
                            0, QString(),
-                           query.value(11).toString(),
+                           query.value(16).toString(),
                            query.value(6).toString(),
-                           query.value(19).toString(),
-                           query.value(9).toString(),
-                           query.value(10).toString(),
-                           query.value(12).toString(),
-                           query.value(17).toString());
+                           query.value(7).toString(),
+                           query.value(8).toInt(),
+                           query.value(9).toInt(),
+                           query.value(10).toInt(),
+                           query.value(11).toInt(),
+                           query.value(24).toString(),
+                           query.value(14).toString(),
+                           query.value(15).toString(),
+                           query.value(17).toString(),
+                           query.value(22).toString(),
+                           query.value(23).toBool());
     }
 
     return ret;
diff -ur /raidz/dev/htpc/mythtv-git/mythplugins/mythgame/mythgame/rominfo.h mythtv-build-010912/mythplugins/mythgame/mythgame/rominfo.h
--- /raidz/dev/htpc/mythtv-git/mythplugins/mythgame/mythgame/rominfo.h	2011-11-14 18:31:36.553295639 -0600
+++ mythtv-build-010912/mythplugins/mythgame/mythgame/rominfo.h	2012-01-09 22:18:45.597755371 -0600
@@ -18,8 +18,10 @@
             QString lrompath = "", QString lcountry ="", QString lcrc_value = "",
             int ldiskcount = 0, QString lgametype = "", int lromcount = 0,
             QString lallsystems = "", QString lplot = "", QString lpublisher = "",
-            QString lversion = "", QString lscreenshot = "", QString lfanart = "",
-            QString lboxart = "", QString linetref = "")
+            QString ldeveloper = "", int lesrb = -1, int lmetarating = 0,
+            int lrating = 0, int lplayers = 1, QString lversion = "",
+            QString lscreenshot = "", QString lfanart = "", QString lboxart = "",
+            QString linetref = "", bool ldisplay = true)
             {
                 id = lid;
                 romname = lromname;
@@ -40,8 +42,14 @@
                 allsystems = lallsystems;
                 plot = lplot;
                 publisher = lpublisher;
+                developer = ldeveloper;
+                esrb = lesrb;
+                metarating = lmetarating;
+                rating = lrating;
+                players = lplayers;
                 version = lversion;
                 inetref = linetref;
+                display = ldisplay;
             }
 
     RomInfo(const RomInfo &lhs)
@@ -65,8 +73,14 @@
                 allsystems = lhs.allsystems;
                 plot = lhs.plot;
                 publisher = lhs.publisher;
+                developer = lhs.developer;
+                esrb = lhs.esrb;
+                metarating = lhs.metarating;
+                rating = lhs.rating;
+                players = lhs.players;
                 version = lhs.version;
                 inetref = lhs.inetref;
+                display = lhs.display;
             }
 
     ~RomInfo() {}
@@ -124,6 +138,55 @@
     QString Publisher() const { return publisher; }
     void setPublisher(const QString &lpublisher) { publisher = lpublisher; }
 
+    QString Developer() const { return developer; }
+    void setDeveloper(const QString &ldeveloper) { developer = ldeveloper; }
+
+    int ESRB() const { return esrb; }
+    QString ESRB_str() const
+    {
+        switch (esrb)
+        {
+            case 0:
+                return "C";
+            case 1:
+                return "E";
+            case 2:
+                return "E10";
+            case 3:
+                return "T";
+            case 4:
+                return "M";
+            case 5:
+                return "AO";
+            default:
+                return "RP";
+        }
+    }
+    void setESRB(const int &lesrb) { esrb = lesrb; }
+
+    int Metarating() const { return metarating; }
+    QString Metarating_str() const
+    {
+        if (metarating == 0)
+            return "Unrated";
+
+        return QString::number(metarating);
+    }
+    void setMetarating(const int &lmetarating) { metarating = lmetarating; }
+
+    int Rating() const { return rating; }
+    QString Rating_str() const
+    {
+        if (rating == 0)
+            return "Unrated";
+
+        return QString::number(rating);
+    }
+    void setRating(const int &lrating) { rating = lrating; }
+
+    int Players() const { return players; }
+    void setPlayers(const int &lplayers) { players = lplayers; }
+
     QString Version() const { return version; }
     void setVersion(const QString &lversion) { version = lversion; }
 
@@ -136,6 +199,9 @@
     int Favorite() const { return favorite; }
     void setFavorite(bool updateDatabase = false);
 
+    int Display() const { return display; }
+    void setDisplay() { display = 1 - display; }
+
     QString getExtension();
     QString toString();
 
@@ -157,6 +223,11 @@
     QString allsystems;
     QString plot;
     QString publisher;
+    QString developer;
+    int esrb;
+    int metarating;
+    int rating;
+    int players;
     QString version;
     int romcount;
     int diskcount;
@@ -167,6 +238,7 @@
     QString fanart;
     QString boxart;
     QString inetref;
+    bool display;
 };
 
 bool operator==(const RomInfo& a, const RomInfo& b);
diff -ur /raidz/dev/htpc/mythtv-git/mythplugins/mythgame/mythgame/scripts/giantbomb/XSLT/giantbombGame.xsl mythtv-build-010912/mythplugins/mythgame/mythgame/scripts/giantbomb/XSLT/giantbombGame.xsl
--- /raidz/dev/htpc/mythtv-git/mythplugins/mythgame/mythgame/scripts/giantbomb/XSLT/giantbombGame.xsl	2011-11-14 18:31:36.553295639 -0600
+++ mythtv-build-010912/mythplugins/mythgame/mythgame/scripts/giantbomb/XSLT/giantbombGame.xsl	2012-01-09 22:18:45.597755371 -0600
@@ -63,23 +63,30 @@
                         </xsl:for-each>
                     </systems>
                 </xsl:if>
-                <xsl:if test=".//company">
+                <xsl:if test=".//publishers">
+                    <publishers>
+                        <xsl:for-each select=".//publishers/company">
+                            <xsl:element name="publisher">
+                                <xsl:attribute name="name"><xsl:value-of select="normalize-space(./name)"/></xsl:attribute>
+                            </xsl:element>
+                        </xsl:for-each>
+                    </publishers>
+                </xsl:if>
+                <xsl:if test=".//developers">
                     <studios>
-                        <xsl:for-each select=".//company">
+                        <xsl:for-each select=".//developers/company">
                             <xsl:element name="studio">
                                 <xsl:attribute name="name"><xsl:value-of select="normalize-space(./name)"/></xsl:attribute>
                             </xsl:element>
                         </xsl:for-each>
                     </studios>
                 </xsl:if>
+                <xsl:if test="./expected_release_year/text() != ''">
+                    <year><xsl:value-of select="normalize-space(./expected_release_year)"/></year>
+                </xsl:if>
                 <!-- Input format: 2001-10-23 00:00:00 -->
                 <xsl:if test="./original_release_date/text() != ''">
-                    <releasedate><xsl:value-of select="gamebombXpath:pubDate(string(./original_release_date), '%Y-%m-%d %H:%M:%S', '%Y-%m-%d')"/></releasedate>
-                </xsl:if>
-                <xsl:if test="./original_release_date/text() = ''">
-                    <xsl:if test="gamebombXpath:futureReleaseDate(.) != ''">
-                        <releasedate><xsl:value-of select="gamebombXpath:futureReleaseDate(.)"/></releasedate>
-                    </xsl:if>
+                    <year><xsl:value-of select="gamebombXpath:pubDate(string(./original_release_date), '%Y-%m-%d %H:%M:%S', '%Y')"/></year>
                 </xsl:if>
                 <!--Input format: 2010-05-10 16:59:49.972923 -->
                 <xsl:if test="./date_last_updated/text() != ''">
diff -ur /raidz/dev/htpc/mythtv-git/mythplugins/mythgame/mythgame/scripts/giantbomb/giantbomb_api.py mythtv-build-010912/mythplugins/mythgame/mythgame/scripts/giantbomb/giantbomb_api.py
--- /raidz/dev/htpc/mythtv-git/mythplugins/mythgame/mythgame/scripts/giantbomb/giantbomb_api.py	2011-11-14 18:31:36.553295639 -0600
+++ mythtv-build-010912/mythplugins/mythgame/mythgame/scripts/giantbomb/giantbomb_api.py	2012-01-09 22:18:45.597755371 -0600
@@ -103,6 +103,7 @@
         self.config['debug'] = debug
 
         self.config['searchURL'] = u'http://api.giantbomb.com/search/?api_key=%s&offset=0&query=%%s&resources=game&format=xml' % self.config['apikey']
+        self.config['platformsURL'] = u'http://api.giantbomb.com/game/%%s/?api_key=%s&format=xml&field_list=platforms' % self.config['apikey']
         self.config['dataURL'] = u'http://api.giantbomb.com/game/%%s/?api_key=%s&format=xml' % self.config['apikey']
 
         self.error_messages = {'GiantBombHttpError': u"! Error: A connection error to api.giantbomb.com was raised (%s)\n", 'GiantBombXmlError': u"! Error: Invalid XML was received from api.giantbomb.com (%s)\n", 'GiantBombBaseError': u"! Error: An error was raised (%s)\n", }
@@ -262,39 +263,6 @@
         return args[0]
     # end pubDate()
 
-    def futureReleaseDate(self, context, gameElement):
-        '''Convert the "expected" release date into the default MNV item format.
-        return the formatted pubDate string
-        return If there is not enough information to make a date then return an empty string
-        '''
-        try:
-            if gameElement.find('expected_release_year').text != None:
-                year = gameElement.find('expected_release_year').text
-            else:
-                year = None
-            if gameElement.find('expected_release_quarter').text != None:
-                quarter = gameElement.find('expected_release_quarter').text
-            else:
-                quarter = None
-            if gameElement.find('expected_release_month').text != None:
-                month = gameElement.find('expected_release_month').text
-            else:
-                month = None
-        except:
-            return u''
-        if not year:
-            return u''
-        if month and not quarter:
-            pubdate = time.strptime((u'%s-%s-01' % (year, month)), '%Y-%m-%d')
-        elif not month and quarter:
-            month = str((int(quarter)*3))
-            pubdate = time.strptime((u'%s-%s-01' % (year, month)), '%Y-%m-%d')
-        else:
-            pubdate = time.strptime((u'%s-12-01' % (year, )), '%Y-%m-%d')
-
-        return time.strftime('%Y-%m-%d', pubdate)
-    # end futureReleaseDate()
-
     def findImages(self, context, *args):
         '''Parse the "image" and "description" elements for images and put in a persistant array
         return True when there are images available
@@ -382,7 +350,6 @@
             'htmlToString': self.htmlToString,
             'getHtmlData': self.getHtmlData,
             'pubDate': self.pubDate,
-            'futureReleaseDate': self.futureReleaseDate,
             'findImages': self.findImages,
             'getImages': self.getImages,
             'supportedJobs': self.supportedJobs,
@@ -416,6 +383,20 @@
 
         items = queryXslt(queryResult)
 
+        games = items.xpath('//item')
+        for x in range(0, len(games)):
+            inrtag = games[x].find("inetref")
+            nametag = games[x].find("title")
+            url = self.config['platformsURL'] % inrtag.text
+            res = etree.parse(url, parser=self.xmlParser)
+            ptag = res.xpath('//name')
+            display = nametag.text
+            display += ' for '
+            for i in range(0, len(ptag)):
+                display += '%s/' % ptag[i].text
+            display = display[:-1]
+            nametag.text = display
+
         if items.getroot() != None:
             if len(items.xpath('//item')):
                 sys.stdout.write(etree.tostring(items, encoding='UTF-8', method="xml", xml_declaration=True, pretty_print=True, ))
diff -ur /raidz/dev/htpc/mythtv-git/mythplugins/mythgame/theme/default/game-ui.xml mythtv-build-010912/mythplugins/mythgame/theme/default/game-ui.xml
--- /raidz/dev/htpc/mythtv-git/mythplugins/mythgame/theme/default/game-ui.xml	2011-11-14 18:31:36.563295639 -0600
+++ mythtv-build-010912/mythplugins/mythgame/theme/default/game-ui.xml	2012-01-09 22:18:45.597755371 -0600
@@ -84,7 +84,7 @@
   <window name="edit_metadata">
 
     <textarea name="title" from="basetextarea">
-        <area>10,50,1260,50</area>
+        <area>10,10,780,50</area>
         <value>Edit Game Information</value>
         <align>hcenter,vcenter</align>
         <font>baselarge</font>
@@ -93,61 +93,91 @@
     <!-- Labels -->
 
     <textarea name="gamename_label" from="basetextarea">
-        <area>25,110,250,40</area>
+        <area>0,62,190,40</area>
         <value>Game Name:</value>
         <align>right,top</align>
     </textarea>
 
+    <textarea name="favorite_label" from="basetextarea">
+        <area>480,62,250,40</area>
+        <value>Favorite:</value>
+        <align>right,top</align>
+    </textarea>
+
     <textarea name="genre_label" from="basetextarea">
-        <area>25,155,250,40</area>
+        <area>0,107,190,40</area>
         <value>Genre:</value>
         <align>right,top</align>
     </textarea>
 
+    <textarea name="display_label" from="basetextarea">
+        <area>480,107,250,40</area>
+        <value>Display:</value>
+        <align>right,top</align>
+    </textarea>
+
     <textarea name="year_label" from="basetextarea">
-        <area>25,200,250,40</area>
+        <area>0,152,190,40</area>
         <value>Year:</value>
         <align>right,top</align>
     </textarea>
 
+    <textarea name="esrb_label" from="basetextarea">
+        <area>460,147,340,40</area>
+        <value>ESRB</value>
+        <align>center</align>
+    </textarea>
+
     <textarea name="country_label" from="basetextarea">
-        <area>25,245,250,40</area>
+        <area>0,197,190,40</area>
         <value>Country:</value>
         <align>right,top</align>
     </textarea>
 
     <textarea name="publisher_label" from="basetextarea">
-        <area>25,290,250,40</area>
+        <area>0,242,190,40</area>
         <value>Publisher:</value>
         <align>right,top</align>
     </textarea>
 
-    <textarea name="plot_label" from="basetextarea">
-        <area>25,335,250,40</area>
-        <value>Plot:</value>
+    <textarea name="rating_label" from="basetextarea">
+        <area>460,237,340,40</area>
+        <value>Rating</value>
+        <align>center</align>
+    </textarea>
+
+    <textarea name="developer_label" from="basetextarea">
+        <area>0,287,190,40</area>
+        <value>Developer:</value>
         <align>right,top</align>
     </textarea>
 
-    <textarea name="favorite_label" from="basetextarea">
-        <area>25,385,250,40</area>
-        <value>Favorite:</value>
+    <textarea name="players_label" from="basetextarea">
+        <area>0,332,190,40</area>
+        <value>Players:</value>
+        <align>right,top</align>
+    </textarea>
+
+    <textarea name="plot_label" from="basetextarea">
+        <area>0,377,190,40</area>
+        <value>Plot:</value>
         <align>right,top</align>
     </textarea>
 
     <textarea name="screenshot_label" from="basetextarea">
-        <area>25,430,250,40</area>
+        <area>0,430,190,40</area>
         <value>Screenshot:</value>
         <align>right,top</align>
     </textarea>
 
     <textarea name="fanart_label" from="basetextarea">
-        <area>25,475,250,40</area>
+        <area>0,475,190,40</area>
         <value>Fanart:</value>
         <align>right,top</align>
     </textarea>
 
     <textarea name="coverart_label" from="basetextarea">
-        <area>25,520,250,40</area>
+        <area>0,520,190,40</area>
         <value>Boxart:</value>
         <align>right,top</align>
     </textarea>
@@ -155,57 +185,105 @@
     <!-- Widgets -->
 
     <textedit name="title_edit" from="basetextedit">
-        <position>285,100</position>
+        <position>200,60</position>
     </textedit>
 
+    <checkbox name="favorite_check" from="basecheckbox">
+        <position>740,60</position>
+    </checkbox>
+
     <textedit name="genre_edit" from="basetextedit">
-        <position>285,145</position>
+        <position>200,105</position>
     </textedit>
 
+    <checkbox name="display_check" from="basecheckbox">
+        <position>740,105</position>
+    </checkbox>
+
     <textedit name="year_edit" from="basetextedit">
-        <position>285,190</position>
+        <position>200,150</position>
     </textedit>
 
     <textedit name="country_edit" from="basetextedit">
-        <position>285,235</position>
+        <position>200,195</position>
     </textedit>
 
+    <buttonlist name="esrb_list" from="baseselector">
+        <position>535,185</position>
+    </buttonlist>
+
     <textedit name="publisher_edit" from="basetextedit">
-        <position>285,280</position>
+        <position>200,240</position>
     </textedit>
 
-    <textedit name="description_edit" from="basetextedit">
-        <position>285,325</position>
+    <textedit name="developer_edit" from="basetextedit">
+        <position>200,285</position>
     </textedit>
 
-    <checkbox name="favorite_check" from="basecheckbox">
-        <position>285,380</position>
-    </checkbox>
+    <buttonlist name="rating_list" from="baseselector">
+        <position>535,275</position>
+    </buttonlist>
+
+    <textedit name="players_edit" from="basetextedit">
+        <position>200,330</position>
+    </textedit>
+
+    <textedit name="description_edit">
+        <area>200,365,590,60</area>
+        <statetype name="background">
+            <state name="active">
+                <area>0,0,590,60</area>
+                <shape name="background" from="basewidgetshape" />
+                <shape name="textbackground">
+                    <area>0,0,590,60</area>
+                    <type>roundbox</type>
+                    <cornerradius>4</cornerradius>
+                    <fill color="#FFFFFF" alpha="200" />
+                </shape>
+            </state>
+            <state name="selected" from="active">
+                <shape name="background">
+                    <shape name="background" from="baseselectedwidgetshape" />
+                </shape>
+                <shape name="textbackground">
+                    <fill color="#FFFFFF" alpha="255" />
+                </shape>
+            </state>
+            <state name="inactive" from="active" />
+        </statetype>
+        <imagetype name="cursor">
+        </imagetype>
+        <textarea name="text">
+            <area>3,1,557,57</area>
+            <font>basesmallblack</font>
+            <multiline>yes</multiline>
+        </textarea>
+    </textedit>
 
     <button name="screenshot_button" from="basesearchbutton">
-        <position>285,420</position>
+        <position>200,430</position>
     </button>
 
     <textarea name="screenshot_text" from="basetextarea">
-        <area>325,425,250,40</area>
+        <area>240,430,550,40</area>
         <value>/path/to/the/thing.jpg</value>
     </textarea>
 
     <button name="fanart_button" from="basesearchbutton">
-        <position>285,465</position>
+        <position>200,475</position>
     </button>
 
     <textarea name="fanart_text" from="basetextarea">
-        <area>325,470,250,40</area>
+        <area>240,475,550,40</area>
         <value>/path/to/the/thing.jpg</value>
     </textarea>
 
     <button name="coverart_button" from="basesearchbutton">
-        <position>285,510</position>
+        <position>200,520</position>
     </button>
 
     <textarea name="coverart_text" from="basetextarea">
-        <area>325,515,250,40</area>
+        <area>240,520,550,40</area>
         <value>/path/to/the/thing.jpg</value>
     </textarea>
 
diff -ur /raidz/dev/htpc/mythtv-git/mythplugins/mythgame/theme/default-wide/game-ui.xml mythtv-build-010912/mythplugins/mythgame/theme/default-wide/game-ui.xml
--- /raidz/dev/htpc/mythtv-git/mythplugins/mythgame/theme/default-wide/game-ui.xml	2011-11-14 18:31:36.563295639 -0600
+++ mythtv-build-010912/mythplugins/mythgame/theme/default-wide/game-ui.xml	2012-01-09 22:18:45.597755371 -0600
@@ -227,61 +227,91 @@
         <!-- Labels -->
 
         <textarea name="gamename_label" from="basetextarea">
-            <area>250,110,250,40</area>
+            <area>0,102,250,40</area>
             <value>Game Name:</value>
             <align>right,top</align>
         </textarea>
 
         <textarea name="genre_label" from="basetextarea">
-            <area>250,155,250,40</area>
+            <area>550,102,250,40</area>
             <value>Genre:</value>
             <align>right,top</align>
         </textarea>
 
         <textarea name="year_label" from="basetextarea">
-            <area>250,200,250,40</area>
+            <area>0,147,250,40</area>
             <value>Year:</value>
             <align>right,top</align>
         </textarea>
 
         <textarea name="country_label" from="basetextarea">
-            <area>250,245,250,40</area>
+            <area>550,147,250,40</area>
             <value>Country:</value>
             <align>right,top</align>
         </textarea>
 
         <textarea name="publisher_label" from="basetextarea">
-            <area>250,290,250,40</area>
+            <area>0,192,250,40</area>
             <value>Publisher:</value>
             <align>right,top</align>
         </textarea>
 
-        <textarea name="plot_label" from="basetextarea">
-            <area>250,335,250,40</area>
-            <value>Plot:</value>
+        <textarea name="developer_label" from="basetextarea">
+            <area>550,192,250,40</area>
+            <value>Developer:</value>
+            <align>right,top</align>
+        </textarea>
+
+        <textarea name="players_label" from="basetextarea">
+            <area>0,237,250,40</area>
+            <value>Players:</value>
             <align>right,top</align>
         </textarea>
 
         <textarea name="fav_label" from="basetextarea">
-            <area>250,400,250,40</area>
+            <area>520,237,250,40</area>
             <value>Favorite:</value>
             <align>right,top</align>
         </textarea>
 
+        <textarea name="display_label" from="basetextarea">
+            <area>800,237,250,40</area>
+            <value>Display:</value>
+            <align>right,top</align>
+        </textarea>
+
+        <textarea name="plot_label" from="basetextarea">
+            <area>0,305,250,40</area>
+            <value>Plot:</value>
+            <align>right,top</align>
+        </textarea>
+
+        <textarea name="esrb_label" from="basetextarea">
+            <area>0,382,290,40</area>
+            <value>ESRB:</value>
+            <align>right,top</align>
+        </textarea>
+
+        <textarea name="rating_label" from="basetextarea">
+            <area>550,382,290,40</area>
+            <value>Rating:</value>
+            <align>right,top</align>
+        </textarea>
+
         <textarea name="screenshot_label" from="basetextarea">
-            <area>250,445,250,40</area>
+            <area>0,425,250,40</area>
             <value>Screenshot:</value>
             <align>right,top</align>
         </textarea>
 
         <textarea name="fanart_label" from="basetextarea">
-            <area>250,490,250,40</area>
+            <area>0,470,250,40</area>
             <value>Fanart:</value>
             <align>right,top</align>
         </textarea>
 
         <textarea name="coverart_label" from="basetextarea">
-            <area>250,535,250,40</area>
+            <area>0,515,250,40</area>
             <value>Boxart:</value>
             <align>right,top</align>
         </textarea>
@@ -289,57 +319,106 @@
         <!-- Widgets -->
 
         <textedit name="title_edit" from="basetextedit">
-            <position>510,100</position>
+            <position>260,100</position>
         </textedit>
 
         <textedit name="genre_edit" from="basetextedit">
-            <position>510,145</position>
+            <position>810,100</position>
         </textedit>
 
         <textedit name="year_edit" from="basetextedit">
-            <position>510,190</position>
+            <position>260,145</position>
         </textedit>
 
         <textedit name="country_edit" from="basetextedit">
-            <position>510,235</position>
+            <position>810,145</position>
         </textedit>
 
         <textedit name="publisher_edit" from="basetextedit">
-            <position>510,280</position>
+            <position>260,190</position>
+        </textedit>
+
+        <textedit name="developer_edit" from="basetextedit">
+            <position>810,190</position>
         </textedit>
 
-        <textedit name="description_edit" from="basetextedit">
-            <position>510,325</position>
+        <textedit name="players_edit" from="basetextedit">
+            <position>260,235</position>
         </textedit>
 
         <checkbox name="favorite_check" from="basecheckbox">
-            <position>510,400</position>
+            <position>780,235</position>
         </checkbox>
 
+        <checkbox name="display_check" from="basecheckbox">
+            <position>1060,235</position>
+        </checkbox>
+
+        <textedit name="description_edit">
+            <area>260,280,830,85</area>
+            <statetype name="background">
+                <state name="active">
+                    <area>0,0,830,85</area>
+                    <shape name="background" from="basewidgetshape" />
+                    <shape name="textbackground">
+                        <area>0,0,830,85</area>
+                        <type>roundbox</type>
+                        <cornerradius>4</cornerradius>
+                        <fill color="#FFFFFF" alpha="200" />
+                    </shape>
+                </state>
+                <state name="selected" from="active">
+                    <shape name="background">
+                        <shape name="background" from="baseselectedwidgetshape" />
+                    </shape>
+                    <shape name="textbackground">
+                        <fill color="#FFFFFF" alpha="255" />
+                    </shape>
+                </state>
+                <state name="inactive" from="active" />
+            </statetype>
+            <imagetype name="cursor">
+                <filename>cursor.png</filename>
+            </imagetype>
+            <textarea name="text">
+                <area>3,1,797,82</area>
+                <font>basesmallblack</font>
+                <multiline>yes</multiline>
+            </textarea>
+        </textedit>
+
+        <buttonlist name="esrb_list" from="baseselector">
+            <position>300,375</position>
+        </buttonlist>
+
+        <buttonlist name="rating_list" from="baseselector">
+            <position>850,375</position>
+        </buttonlist>
+
         <button name="screenshot_button" from="basesearchbutton">
-            <position>510,445</position>
+            <position>260,425</position>
         </button>
 
         <textarea name="screenshot_text" from="basetextarea">
-            <area>550,440,750,40</area>
+            <area>300,425,950,40</area>
             <value>/path/to/the/thing.jpg</value>
         </textarea>
 
         <button name="fanart_button" from="basesearchbutton">
-            <position>510,480</position>
+            <position>260,470</position>
         </button>
 
         <textarea name="fanart_text" from="basetextarea">
-            <area>550,485,750,40</area>
+            <area>300,470,950,40</area>
             <value>/path/to/the/thing.jpg</value>
         </textarea>
 
         <button name="coverart_button" from="basesearchbutton">
-            <position>510,525</position>
+            <position>260,515</position>
         </button>
 
         <textarea name="coverart_text" from="basetextarea">
-            <area>550,530,750,40</area>
+            <area>300,515,950,40</area>
             <value>/path/to/the/thing.jpg</value>
         </textarea>
 
diff -ur /raidz/dev/htpc/mythtv-git/mythtv/libs/libmythmetadata/metadatacommon.cpp mythtv-build-010912/mythtv/libs/libmythmetadata/metadatacommon.cpp
--- /raidz/dev/htpc/mythtv-git/mythtv/libs/libmythmetadata/metadatacommon.cpp	2011-11-14 18:31:37.403295673 -0600
+++ mythtv-build-010912/mythtv/libs/libmythmetadata/metadatacommon.cpp	2012-01-09 22:18:45.597755371 -0600
@@ -55,6 +55,7 @@
     m_album(),
     m_tracknum(0),
     m_system(),
+    m_publishers(),
     m_year(0),
     m_releasedate(),
     m_lastupdated(),
@@ -119,6 +120,7 @@
     QString album,
     uint tracknum,
     const QString system,
+    const QStringList publishers,
     const uint year,
     const QDate releasedate,
     const QDateTime lastupdated,
@@ -179,6 +181,7 @@
     m_album(album),
     m_tracknum(tracknum),
     m_system(system),
+    m_publishers(publishers),
     m_year(year),
     m_releasedate(releasedate),
     m_lastupdated(lastupdated),
@@ -396,6 +399,7 @@
     metadataMap["album"] = m_album;
     metadataMap["tracknum"] = QString::number(m_tracknum);
     metadataMap["system"] = m_system;
+    metadataMap["publishers"] = m_publishers.join(", ");
     metadataMap["year"] = QString::number(m_year);
 
     metadataMap["releasedate"] = MythDateToString(m_releasedate, kDateFull);
@@ -799,6 +803,8 @@
         AddCertifications(lookup, item, docroot);
     if (lookup->GetCategories().size())
         AddCategories(lookup, item, docroot);
+    if (lookup->GetPublishers().size())
+        AddPublishers(lookup, item, docroot);
     if (lookup->GetStudios().size())
         AddStudios(lookup, item, docroot);
     if (lookup->GetCountries().size())
@@ -837,6 +843,23 @@
     }
 }
 
+void AddPublishers(MetadataLookup *lookup,
+                   QDomElement placetoadd,
+                   QDomDocument docroot)
+{
+    QStringList pubs = lookup->GetPublishers();
+    QDomElement publishers = docroot.createElement("publishers");
+    placetoadd.appendChild(publishers);
+
+    for (QStringList::const_iterator i = pubs.begin();
+            i != pubs.end(); ++i)
+    {
+        QDomElement pub = docroot.createElement("publisher");
+        publishers.appendChild(pub);
+        pub.setAttribute("name", *i);
+    }
+}
+
 void AddStudios(MetadataLookup *lookup,
                    QDomElement placetoadd,
                    QDomDocument docroot)
@@ -886,7 +909,7 @@
         channum, chansign, channame, chanplaybackfilters, recgroup,
         playgroup, seriesid, programid, storagegroup, album, system,
         inetref, tmsref, imdb, homepage, trailerURL, language;
-    QStringList categories, countries, studios;
+    QStringList categories, countries, publishers, studios;
     float userrating = 0;
     QDate releasedate;
     QDateTime lastupdated, startts, endts, recstartts, recendts;
@@ -1012,6 +1035,22 @@
         }
     }
 
+    // Publishers
+    QDomElement publishersxml = item.firstChildElement("publishers");
+    if (!publishersxml.isNull())
+    {
+        QDomElement publisher = publishersxml.firstChildElement("publisher");
+        if (!publisher.isNull())
+        {
+            while (!publisher.isNull())
+            {
+                if (publisher.hasAttribute("name"))
+                    publishers.append(publisher.attribute("name"));
+                publisher = publisher.nextSiblingElement("publisher");
+            }
+        }
+    }
+
     // Studios
     QDomElement studiosxml = item.firstChildElement("studios");
     if (!studiosxml.isNull())
@@ -1078,9 +1117,10 @@
         chanplaybackfilters, recgroup, playgroup, seriesid, programid,
         storagegroup, startts, endts, recstartts, recendts, programflags,
         audioproperties, videoproperties, subtitletype, certification,
-        countries, popularity, budget, revenue, album, tracknum, system, year,
-        releasedate, lastupdated, runtime, runtimesecs, inetref, tmsref,
-        imdb, people, studios, homepage, trailerURL, artwork, DownloadMap());
+        countries, popularity, budget, revenue, album, tracknum, system,
+        publishers, year, releasedate, lastupdated, runtime, runtimesecs,
+        inetref, tmsref, imdb, people, studios, homepage, trailerURL, artwork,
+        DownloadMap());
 }
 
 MetadataLookup* ParseMetadataMovieNFO(const QDomElement& item,
diff -ur /raidz/dev/htpc/mythtv-git/mythtv/libs/libmythmetadata/metadatacommon.h mythtv-build-010912/mythtv/libs/libmythmetadata/metadatacommon.h
--- /raidz/dev/htpc/mythtv-git/mythtv/libs/libmythmetadata/metadatacommon.h	2011-11-14 18:31:37.403295673 -0600
+++ mythtv-build-010912/mythtv/libs/libmythmetadata/metadatacommon.h	2012-01-09 22:18:45.601088658 -0600
@@ -118,6 +118,7 @@
         QString album,
         uint tracknum,
         QString system,
+        const QStringList publishers,
         const uint year,
         const QDate releasedate,
         const QDateTime lastupdated,
@@ -304,6 +305,7 @@
 
     // General - Game
     QString GetSystem() const { return m_system; };
+    QStringList GetPublishers() const { return m_publishers; };
 
     // Times
     uint GetYear() const { return m_year; };
@@ -384,6 +386,7 @@
 
     // General - Game
     QString m_system;
+    QStringList m_publishers;
 
     // Times
     uint m_year;
@@ -427,6 +430,9 @@
 META_PUBLIC void AddCategories(MetadataLookup *lookup,
                                QDomElement placetoadd,
                                QDomDocument docroot);
+META_PUBLIC void AddPublishers(MetadataLookup *lookup,
+                               QDomElement placetoadd,
+                               QDomDocument docroot);
 META_PUBLIC void AddStudios(MetadataLookup *lookup,
                             QDomElement placetoadd,
                             QDomDocument docroot);
