Index: themes/G.A.N.T./ui.xml
===================================================================
--- themes/G.A.N.T./ui.xml	(revision 7738)
+++ themes/G.A.N.T./ui.xml	(working copy)
@@ -550,6 +550,202 @@
 
   </window>
 
+  <window name="schdiff">
+
+    <font name="active_font" face="Arial">
+      <color>#ffffff</color>
+      <size>16</size>
+      <size:small>11</size:small>
+      <bold>yes</bold>
+    </font>
+
+    <font name="inactive_font" face="Arial">
+      <color>#9999cc</color>
+      <size>16</size>
+      <size:small>11</size:small>
+      <bold>yes</bold>
+    </font>
+
+    <font name="record_font" face="Arial">
+      <color>#F7862B</color>
+      <size>16</size>
+      <size:small>11</size:small>
+      <bold>yes</bold>
+    </font>
+
+    <font name="recording_font" face="Arial">
+      <color>#FF33FF</color>
+      <size>16</size>
+      <size:small>11</size:small>
+      <bold>yes</bold>
+    </font>
+
+    <font name="norecordfnt" face="Arial">
+      <color>#999999</color>
+      <size>16</size>
+      <size:small>11</size:small>
+      <bold>yes</bold>
+    </font>
+
+    <font name="conflictfnt" face="Arial">
+      <color>#ffff33</color>
+      <size>16</size>
+      <size:small>11</size:small>
+      <bold>yes</bold>
+    </font>
+
+    <font name="currenttitle" face="Arial">
+      <color>#ffff33</color>
+      <size>18</size>
+      <size:small>12</size:small>
+      <bold>yes</bold>
+    </font>
+
+    <font name="title" face="Arial">
+      <color>#ffffff</color>
+      <dropcolor>#000000</dropcolor>
+      <size>27</size>
+      <size:small>13</size:small>
+      <shadow>3,3</shadow>
+      <bold>yes</bold>
+    </font>
+
+    <font name="info" face="Arial">
+      <color>#ffffff</color>
+      <size>17</size>
+      <size:small>8</size:small>
+      <shadow>1,1</shadow>
+      <bold>yes</bold>
+    </font>
+
+    <font name="message" face="Arial">
+      <color>#ffffff</color>
+      <size>16</size>
+      <size:small>10</size:small>
+      <shadow>1,1</shadow>
+      <bold>yes</bold>
+    </font>
+
+    <font name="messagegray" face="Arial">
+      <color>#999999</color>
+      <size>16</size>
+      <size:small>10</size:small>
+      <shadow>1,1</shadow>
+      <bold>yes</bold>
+    </font>
+
+    <font name="messageyellow" face="Arial">
+      <color>#ffff33</color>
+      <size>16</size>
+      <size:small>10</size:small>
+      <shadow>1,1</shadow>
+      <bold>yes</bold>
+    </font>
+
+    <container name="background">
+      <textarea name="sched" draworder="0">
+        <area>20,10,800,40</area>
+        <font>info</font>
+        <value>Scheduled Recordings:</value>
+      </textarea>
+      <image name="filler" draworder="0" fleximage="yes">
+        <filename>cr-background.png</filename>
+        <position>0,39</position>
+      </image>
+    </container>
+
+    <container name="conflict_info">
+      <area>400,10,380,30</area>
+      <textarea name="status" align="right" draworder="4">
+        <area>0,0,380,30</area>
+        <font>info</font>
+      </textarea>
+    </container>
+
+    <container name="showlevel_info">
+      <area>10,330,280,30</area>
+      <textarea name="showing" draworder="4">
+        <area>0,0,105,30</area>
+        <font>message</font>
+        <value>Showing:</value>
+      </textarea>
+      <textarea name="showlevel" draworder="4">
+        <area>110,0,150,30</area>
+        <font>message</font>
+      </textarea>
+    </container>
+
+    <container name="selector">
+      <area>0,39,800,290</area>
+      <listarea name="conflictlist" draworder="4">
+        <area>20,12,760,265</area>
+        <fcnfont name="conflictfnt" function="conflictingrecording"></fcnfont>
+        <fcnfont name="norecordfnt" function="disabledrecording"></fcnfont>
+        <fcnfont name="active_font" function="active"></fcnfont>
+        <fcnfont name="inactive_font" function="inactive"></fcnfont>
+        <fcnfont name="record_font" function="record"></fcnfont>
+        <fcnfont name="recording_font" function="recording"></fcnfont>
+        <fcnfont name="active_font" function="selected"></fcnfont>
+        <columnpadding>10</columnpadding>
+        <column number="1" width="160" context="-1"></column>
+        <column number="2" width="120" context="-1"></column>
+        <column number="3" width="370" context="-1"></column>
+        <column number="4" width="20" context="-1"></column>
+        <column number="5" width="20" context="-1"></column>
+        <items>9</items>
+        <image function="selectionbar" filename="cr-selectbar.png" location="-14,-5"></image>
+        <image function="uparrow" filename="uparrow.png" location="755,22"></image>
+        <image function="downarrow" filename="downarrow.png" location="755,230"></image>
+      </listarea>
+      <image name="showinglines" draworder="5" fleximage="no">
+        <filename>cr-lines.png</filename>
+        <position>0,0</position>
+      </image>
+    </container>
+
+    <container name="program_info">
+      <area>0,360,800,210</area>
+      <textarea name="title" draworder="6">
+        <area>20,0,800,40</area>
+        <font>title</font>
+      </textarea>
+      <textarea name="channel" draworder="6">
+        <area>20,40,160,30</area>
+        <font>info</font>
+      </textarea>
+      <textarea name="timedate" draworder="6">
+        <area>200,40,420,30</area>
+        <font>info</font>
+      </textarea>
+      <textarea name="subdescr" draworder="6">
+        <area>20,70,720,140</area>
+        <font>info</font>
+        <multiline>yes</multiline>
+        <value>%SUBTITLE|"|"
+%%STARS%%DESCRIPTION%</value>
+      </textarea>
+    </container>
+
+    <container name="status_info">
+      <area>300,330,480,30</area>
+      <textarea name="recordingstatus" align="right" draworder="6">
+        <area>0,0,480,30</area>
+        <font>message</font>
+      </textarea>
+    </container>
+ 
+
+   <container name="norecordings_list">
+      <textarea name="msg" align="center" draworder="8">
+         <area>0,110,800,70</area>
+         <font>info</font>
+         <value>No changes to the recording schedule to show</value>
+         <multiline>yes</multiline>
+      </textarea>
+    </container>
+
+  </window>
+
   <window name="recprioritychannels">
 
     <font name="active_font" face="Arial">
Index: themes/blue/ui.xml
===================================================================
--- themes/blue/ui.xml	(revision 7738)
+++ themes/blue/ui.xml	(working copy)
@@ -365,6 +365,114 @@
 
   </window>
 
+  <window name="schdiff">
+
+
+    <container name="background">
+      <area> 0, 0, 800, 600</area>
+      <textarea name="sched" draworder="0">
+        <area>20,10,800,40</area>
+        <font>info</font>
+        <value>Scheduled Recording Changes:</value>
+      </textarea>
+      <image name="filler" draworder="0" fleximage="no">
+        <filename>cr-background.png</filename>
+        <position>0,0</position>
+      </image>
+    </container>
+
+    <container name="conflict_info">
+      <area>400,10,380,30</area>
+      <textarea name="status" align="right" draworder="4">
+        <area>0,0,380,30</area>
+        <font>info</font>
+      </textarea>
+    </container>
+
+    <container name="showlevel_info">
+      <area>25,345,280,30</area>
+      <textarea name="showing" draworder="7">
+        <area>0,0,105,30</area>
+        <font>info</font>
+        <value>Showing:</value>
+      </textarea>
+      <textarea name="showlevel" draworder="7">
+        <area>110,0,150,30</area>
+        <font>info</font>
+      </textarea>
+    </container>
+
+    <container name="selector">
+      <area>0,39,800,290</area>
+      <listarea name="conflictlist" draworder="4">
+        <area>20,12,760,265</area>
+        <fcnfont name="list-conflict" function="conflictingrecording"></fcnfont>
+        <fcnfont name="list-norecord" function="disabledrecording"></fcnfont>
+        <fcnfont name="list-active" function="active"></fcnfont>
+        <fcnfont name="list-inactive" function="inactive"></fcnfont>
+        <fcnfont name="list-record" function="record"></fcnfont>
+        <fcnfont name="list-recording" function="recording"></fcnfont>
+        <fcnfont name="list-selected" function="selected"></fcnfont>
+        <columnpadding>10</columnpadding>
+        <column number="1" width="165" context="-1"></column>
+        <column number="2" width="110" context="-1"></column>
+        <column number="3" width="390" context="-1"></column>
+        <column number="4" width="20" context="-1"></column>
+        <column number="5" width="20" context="-1"></column>
+        <items>9</items>
+        <image function="selectionbar" filename="cr-selectbar.png" location="-10,-2"></image>
+        <image function="uparrow" filename="uparrow.png" location="745,12"></image>
+        <image function="downarrow" filename="downarrow.png" location="745,244"></image>
+      </listarea>
+      <image name="showinglines" draworder="5" fleximage="no">
+        <filename>cr-lines.png</filename>
+        <position>0,0</position>
+      </image>
+    </container>
+
+    <container name="program_info">
+      <area>25,365,775,210</area>
+      <textarea name="title" draworder="6">
+        <area>0,0,730,40</area>
+        <font>title</font>
+      </textarea>
+      <textarea name="channel" draworder="6">
+        <area>0,45,160,30</area>
+        <font>info</font>
+      </textarea>
+      <textarea name="timedate" draworder="6">
+        <area>175,45,420,30</area>
+        <font>info</font>
+      </textarea>
+      <textarea name="subdescr" draworder="6">
+        <area>0,75,720,140</area>
+        <font>metadata</font>
+        <multiline>yes</multiline>
+        <value>%SUBTITLE|"|"
+%%REPEAT%%STARS%%DESCRIPTION%</value>
+      </textarea>
+    </container>
+
+    <container name="status_info">
+      <area>300,345,480,30</area>
+      <textarea name="recordingstatus" align="right" draworder="6">
+        <area>0,0,480,30</area>
+        <font>recstatus</font>
+      </textarea>
+    </container>
+
+
+   <container name="norecordings_list">
+      <textarea name="msg" align="center" draworder="8">
+         <area>0,110,800,70</area>
+         <font>info</font>
+         <value>No changes to the recording schedule to show</value>
+         <multiline>yes</multiline>
+      </textarea>
+    </container>
+
+  </window>
+
   <window name="recprioritychannels">
 
     <container name="background">
Index: libs/libmythtv/channeleditor.cpp
===================================================================
--- libs/libmythtv/channeleditor.cpp	(revision 7738)
+++ libs/libmythtv/channeleditor.cpp	(working copy)
@@ -190,6 +190,7 @@
     };
 
     void save() {};
+    void save(QString) {};
     void load() 
     {
         MSqlQuery query(MSqlQuery::InitCon());
Index: libs/libmythtv/scheduledrecording.h
===================================================================
--- libs/libmythtv/scheduledrecording.h	(revision 7738)
+++ libs/libmythtv/scheduledrecording.h	(working copy)
@@ -91,6 +91,7 @@
 
     
     virtual void save();
+    virtual void save(QString);
 
     virtual void loadByID(int id);
     virtual void loadByProgram(const ProgramInfo* proginfo);
@@ -168,6 +169,7 @@
 
 public slots:
     void runProgList();
+    void testRecording();
 
 protected slots:
     void runShowDetails();
@@ -253,6 +255,7 @@
     virtual int exec();
     virtual void load();
     virtual void save() { };
+    virtual void save(QString) { };
 
 protected slots:
     void open(int id);
Index: libs/libmythtv/recordingprofile.h
===================================================================
--- libs/libmythtv/recordingprofile.h	(revision 7738)
+++ libs/libmythtv/recordingprofile.h	(working copy)
@@ -113,6 +113,7 @@
     virtual int exec();
     virtual void load();
     virtual void save() { };
+    virtual void save(QString) { };
 
 protected slots:
     void open(int id);
Index: libs/libmythtv/dvbtransporteditor.h
===================================================================
--- libs/libmythtv/dvbtransporteditor.h	(revision 7738)
+++ libs/libmythtv/dvbtransporteditor.h	(working copy)
@@ -87,6 +87,7 @@
     DVBTransportList() {}
 
     void save() { };
+    void save(QString) { };
     void load() 
     {
         fillSelections();
Index: libs/libmythtv/dvbtransporteditor.cpp
===================================================================
--- libs/libmythtv/dvbtransporteditor.cpp	(revision 7738)
+++ libs/libmythtv/dvbtransporteditor.cpp	(working copy)
@@ -69,6 +69,7 @@
     };
 
     void save() { };
+    void save(QString) { };
     void load() 
     {
         MSqlQuery query(MSqlQuery::InitCon());
Index: libs/libmythtv/videosource.h
===================================================================
--- libs/libmythtv/videosource.h	(revision 7738)
+++ libs/libmythtv/videosource.h	(working copy)
@@ -167,6 +167,7 @@
     XMLTV_generic_config(const VideoSource& _parent, QString _grabber);
 
     virtual void save();
+    virtual void save(QString) { save(); }
 
 protected:
     const VideoSource& parent;
@@ -178,6 +179,8 @@
 public:
     EITOnly_config(const VideoSource& _parent);
     virtual void save();
+    virtual void save(QString) { save(); }
+
 protected:
     UseEIT *useeit;
 };
@@ -205,6 +208,10 @@
         if (name)
             ConfigurationWizard::save();
     };
+    virtual void save(QString destination) {
+        if (name)
+            ConfigurationWizard::save(destination);
+    };
 
 private:
     class ID: virtual public IntegerSetting,
@@ -281,6 +288,11 @@
         settingValue = "";
         SimpleDBStorage::save();
     };
+    void save(QString destination) {
+        changed = true;
+        settingValue = "";
+        SimpleDBStorage::save(destination);
+    };
 };
 
 class DVBVbiDevice: public LineEditSetting, public CCSetting {
@@ -295,6 +307,11 @@
         settingValue = "";
         SimpleDBStorage::save();
     };
+    void save(QString destination) {
+        changed = true;
+        settingValue = "";
+        SimpleDBStorage::save(destination);
+    };
 };
 
 class DVBDiseqcInputList
@@ -439,6 +456,7 @@
     virtual int exec();
     virtual void load();
     virtual void save() { };
+    virtual void save(QString) { };
 
 public slots:
     void menu();
@@ -464,6 +482,7 @@
     virtual int exec();
     virtual void load();
     virtual void save() { };
+    virtual void save(QString) { };
 
 public slots:
     void menu(); 
@@ -483,6 +502,7 @@
     virtual int exec();
     virtual void load();
     virtual void save() { };
+    virtual void save(QString) { };
 
 protected:
     vector<CardInput*> cardinputs;
@@ -530,6 +550,7 @@
     void fillDiseqcSettingsInput(QString _pos, QString _port);
 
     virtual void save();
+    virtual void save(QString destination) { save(); }
 
   public slots:
     void channelScanner();
Index: libs/libmythtv/libmythtv.pro
===================================================================
--- libs/libmythtv/libmythtv.pro	(revision 7738)
+++ libs/libmythtv/libmythtv.pro	(working copy)
@@ -93,6 +93,7 @@
 HEADERS += sr_items.h               scheduledrecording.h
 HEADERS += signalmonitorvalue.h 
 HEADERS += mpeg/iso639.h
+HEADERS += viewschdiff.h
 HEADERS += livetvchain.h
 
 SOURCES += programinfo.cpp          proglist.cpp
@@ -106,6 +107,7 @@
 SOURCES += sr_items.cpp             scheduledrecording.cpp
 SOURCES += signalmonitorvalue.cpp
 SOURCES += mpeg/iso639.cpp
+SOURCES += viewschdiff.cpp
 SOURCES += livetvchain.cpp
 
 using_frontend {
Index: libs/libmythtv/scanwizardhelpers.h
===================================================================
--- libs/libmythtv/scanwizardhelpers.h	(revision 7738)
+++ libs/libmythtv/scanwizardhelpers.h	(working copy)
@@ -120,6 +120,7 @@
         { setLabel(QObject::tr("Video Source")); }
     virtual void load();
     virtual void save() {}
+    virtual void save(QString) {}
   private:
     int sourceid;
 };
@@ -135,6 +136,7 @@
         { setLabel(QObject::tr("Transport")); }
     virtual void load() { refresh(); }
     virtual void save() { ; }
+    virtual void save(QString) { ; }
 
     void refresh();
   public slots:
@@ -165,6 +167,7 @@
         { setLabel(QObject::tr("Capture Card")); }
     virtual void load() { refresh(); }
     virtual void save() { ; }
+    virtual void save(QString) { ; }
     void refresh();
 
   public slots:
Index: libs/libmythtv/programinfo.h
===================================================================
--- libs/libmythtv/programinfo.h	(revision 7738)
+++ libs/libmythtv/programinfo.h	(working copy)
@@ -320,7 +320,7 @@
         return at(index);
     };
 
-    bool FromScheduler(bool &hasConflicts);
+    bool FromScheduler(bool &hasConflicts, QString database = "");
     bool FromScheduler(void) {
         bool dummyConflicts;
         return FromScheduler(dummyConflicts);
Index: libs/libmythtv/programinfo.cpp
===================================================================
--- libs/libmythtv/programinfo.cpp	(revision 7738)
+++ libs/libmythtv/programinfo.cpp	(working copy)
@@ -3478,12 +3478,21 @@
  *                                                                           *
  * ************************************************************************* */
 
-bool ProgramList::FromScheduler(bool &hasConflicts)
+bool ProgramList::FromScheduler(bool &hasConflicts, QString database)
 {
     clear();
     hasConflicts = false;
 
-    QStringList slist = QString("QUERY_GETALLPENDING");
+    QString query;
+    if (database != "")
+    {
+        query = QString("QUERY_GETALLPENDING %1").arg(database);
+    } else {
+        query = QString("QUERY_GETALLPENDING");
+    }
+
+    QStringList slist = query;
+
     if (!gContext->SendReceiveStringList(slist) || slist.size() < 2)
     {
         VERBOSE(VB_IMPORTANT,
Index: libs/libmythtv/sr_root.h
===================================================================
--- libs/libmythtv/sr_root.h	(revision 7738)
+++ libs/libmythtv/sr_root.h	(working copy)
@@ -27,6 +27,7 @@
          DialogDoneListItem* cancelItem;
          DialogDoneListItem* recordAsShownItem;
          ManagedListItem* upcomingButton;         
+         ManagedListItem* testButton;         
          ManagedListItem* detailsButton;
 
          class SRSchedOptionsGroup* schedOptions;
Index: libs/libmythtv/scheduledrecording.cpp
===================================================================
--- libs/libmythtv/scheduledrecording.cpp	(revision 7738)
+++ libs/libmythtv/scheduledrecording.cpp	(working copy)
@@ -8,6 +8,7 @@
 #include "sr_dialog.h"
 #include "jobqueue.h"
 #include "mythdbcon.h"
+#include "viewschdiff.h"
 
 #include <qlayout.h>
 #include <qlabel.h>
@@ -435,6 +436,19 @@
     signalChange(getRecordID());
 }
 
+void ScheduledRecording::save(QString destination) 
+{
+    if (type->isChanged() && getRecordingType() == kNotRecording)
+    {
+        remove();
+    }
+    else
+    {
+        ConfigurationGroup::save(destination);
+    }
+    signalChange(getRecordID());
+}
+
 void ScheduledRecording::remove() 
 {
     int rid = getRecordID();
@@ -813,4 +827,84 @@
     recgroup->setChanged();
 }
 
+void
+ScheduledRecording::testRecording()
+{
+
+    QString ttable = "record_tmp";
+
+    MSqlQueryInfo dbcon = MSqlQuery::SchedCon();
+    MSqlQuery query(dbcon);
+    QString thequery;
+
+    thequery ="SELECT GET_LOCK(:LOCK, 2);";
+    query.prepare(thequery);
+    query.bindValue(":LOCK", "DiffSchedule");
+    query.exec();
+    if (query.lastError().type() != QSqlError::None)
+    {
+        QString msg =
+            QString("DB Error (Obtaining lock in testRecording): \n"
+                    "Query was: %1 \nError was: %2 \n")
+            .arg(thequery)
+            .arg(MythContext::DBErrorMessage(query.lastError()));
+        VERBOSE(VB_IMPORTANT, msg);
+        return;
+    }
+
+
+    thequery = QString("DROP TABLE IF EXISTS %1;").arg(ttable);
+    query.prepare(thequery);
+    query.exec();
+    if (query.lastError().type() != QSqlError::None)
+    {
+        QString msg =
+            QString("DB Error (deleting old table in testRecording): \n"
+                    "Query was: %1 \nError was: %2 \n")
+            .arg(thequery)
+            .arg(MythContext::DBErrorMessage(query.lastError()));
+        VERBOSE(VB_IMPORTANT, msg);
+        return;
+    }
+
+    thequery = QString("CREATE TABLE %1 SELECT * FROM record;").arg(ttable);
+    query.prepare(thequery);
+    query.exec();
+    if (query.lastError().type() != QSqlError::None)
+    {
+        QString msg =
+            QString("DB Error (create new table): \n"
+                    "Query was: %1 \nError was: %2 \n")
+            .arg(thequery)
+            .arg(MythContext::DBErrorMessage(query.lastError()));
+        VERBOSE(VB_IMPORTANT, msg);
+        return;
+    }
+
+    save(ttable);
+
+    ViewScheduleDiff vsd(gContext->GetMainWindow(), "Recording Changes", ttable);
+
+//    query2.prepare(QString("DROP TABLE %1;").arg(ttable));
+//    query2.exec();
+//fprintf (stderr, "drop2\n");
+
+    thequery = "SELECT RELEASE_LOCK(:LOCK);";
+    query.prepare(thequery);
+    query.bindValue(":LOCK", "DiffSchedule");
+    query.exec();
+    if (query.lastError().type() != QSqlError::None)
+    {
+        QString msg =
+            QString("DB Error (free lock): \n"
+                    "Query was: %1 \nError was: %2 \n")
+            .arg(thequery)
+            .arg(MythContext::DBErrorMessage(query.lastError()));
+        VERBOSE(VB_IMPORTANT, msg);
+        return;
+    }
+
+    vsd.exec();
+}
+
 /* vim: set expandtab tabstop=4 shiftwidth=4: */
Index: libs/libmythtv/sr_root.cpp
===================================================================
--- libs/libmythtv/sr_root.cpp	(revision 7738)
+++ libs/libmythtv/sr_root.cpp	(working copy)
@@ -10,7 +10,6 @@
     cancelItem->setState(MLS_BOLD);
     addItem(cancelItem);
 
-
     recType = new SRRecordingType(schedRec, _parentList, this);
     addItem(recType->getItem(), -1);
     connect(recType->getItem(), SIGNAL(changed(ManagedListItem*)), this, SLOT(itemChanged(ManagedListItem*)));
@@ -34,6 +33,11 @@
     addItem(upcomingButton, -1);
     connect(upcomingButton, SIGNAL(selected(ManagedListItem*)), _rec, SLOT(runProgList()));
 
+    testButton = new ManagedListItem(QObject::tr("Display recording changes"),
+                                         _parentList, this, "test");
+    addItem(testButton, -1);
+    connect(testButton, SIGNAL(selected(ManagedListItem*)), _rec, SLOT(testRecording()));
+
     recordAsShownItem = new DialogDoneListItem(QString("[ %1 ]").arg(QObject::tr("Save these settings")),
                                                MythDialog::Accepted, NULL, _parentList, this, "recordAsShown");
     recordAsShownItem->setState(MLS_BOLD);
Index: libs/libmythtv/channelsettings.h
===================================================================
--- libs/libmythtv/channelsettings.h	(revision 7738)
+++ libs/libmythtv/channelsettings.h	(working copy)
@@ -26,7 +26,7 @@
     };
 
     void load() { };
-    void save() 
+    void save(QString table) 
     {
         if (intValue() == 0) {
             setValue(findHighest());
@@ -53,7 +53,11 @@
             if (query.numRowsAffected() != 1)
                 cerr << "ChannelID:Failed to insert into: " << table << endl;
         }
-    };
+    }
+    void save() 
+    {
+        save(table);
+    }
 
     int findHighest(int floor = 1000)
     {
Index: libs/libmythtv/profilegroup.h
===================================================================
--- libs/libmythtv/profilegroup.h	(revision 7738)
+++ libs/libmythtv/profilegroup.h	(working copy)
@@ -114,6 +114,7 @@
     virtual int exec();
     virtual void load();
     virtual void save() {};
+    virtual void save(QString) {};
 
 protected slots:
     void open(int id);
Index: libs/libmythtv/channeleditor.h
===================================================================
--- libs/libmythtv/channeleditor.h	(revision 7738)
+++ libs/libmythtv/channeleditor.h	(working copy)
@@ -57,6 +57,7 @@
     };
 
     void save() {};
+    void save(QString) {};
     void load() {
         fillSelections();
     };
Index: libs/libmyth/settings.cpp
===================================================================
--- libs/libmyth/settings.cpp	(revision 7738)
+++ libs/libmyth/settings.cpp	(working copy)
@@ -109,6 +109,13 @@
         (*i)->save();
 }
 
+void ConfigurationGroup::save(QString destination) {
+    for(childList::iterator i = children.begin() ;
+        i != children.end() ;
+        ++i )
+        (*i)->save(destination);
+}
+
 QWidget* VerticalConfigurationGroup::configWidget(ConfigurationGroup *cg, 
                                                   QWidget* parent,
                                                   const char* widgetName) 
@@ -350,6 +357,13 @@
         children[top]->save();
 }
 
+void StackedConfigurationGroup::save(QString destination) {
+    if (saveAll)
+        ConfigurationGroup::save(destination);
+    else if (top < children.size())
+        children[top]->save(destination);
+}
+
 void TriggeredConfigurationGroup::setTrigger(Configurable* _trigger) {
     trigger = _trigger;
     // Make sure the stack is after the trigger
@@ -981,7 +995,7 @@
     }
 }
 
-void SimpleDBStorage::save() 
+void SimpleDBStorage::save(QString table) 
 {
     if (!isChanged())
         return;
@@ -1011,7 +1025,12 @@
     }
 }
 
-void AutoIncrementStorage::save() {
+void SimpleDBStorage::save() 
+{
+    save(table);
+}
+
+void AutoIncrementStorage::save(QString table) {
     if (intValue() == 0) 
     {
         // Generate a new, unique ID
@@ -1038,6 +1057,11 @@
     }
 }
 
+void AutoIncrementStorage::save() 
+{
+    save(table);
+}
+
 void ListBoxSetting::setEnabled(bool b)
 {
     Configurable::setEnabled(b);
Index: libs/libmyth/langsettings.cpp
===================================================================
--- libs/libmyth/langsettings.cpp	(revision 7738)
+++ libs/libmyth/langsettings.cpp	(working copy)
@@ -25,6 +25,7 @@
         gContext->SaveSetting("Language", getValue());
         LanguageSettings::reload();
     };
+    virtual void save(QString destination) { }
 };
 
 
Index: libs/libmyth/settings.h
===================================================================
--- libs/libmyth/settings.h	(revision 7738)
+++ libs/libmyth/settings.h	(working copy)
@@ -30,6 +30,7 @@
 
     virtual void load() = 0;
     virtual void save() = 0;
+    virtual void save(QString destination) = 0;
 
     // A name for looking up the setting
     void setName(QString str) {
@@ -123,6 +124,7 @@
     virtual void load();
 
     virtual void save();
+    virtual void save(QString destination);
 
     void setUseLabel(bool useit) { uselabel = useit; }
     void setUseFrame(bool useit) { useframe = useit; }
@@ -183,6 +185,7 @@
 
     void raise(Configurable* child);
     virtual void save();
+    virtual void save(QString destination);
 
     // save all children, or only the top?
     void setSaveAll(bool b) { saveAll = b; };
@@ -597,6 +600,7 @@
 
     virtual void load() = 0;
     virtual void save() = 0;
+    virtual void save(QString destination) = 0;
 
 protected:
     QString getColumn(void) const { return column; };
@@ -615,6 +619,7 @@
 
     virtual void load();
     virtual void save();
+    virtual void save(QString destination);
 
 protected:
 
@@ -628,6 +633,7 @@
 public:
     virtual void load() {  }
     virtual void save() {  }
+    virtual void save(QString) {  }
 };
 
 class AutoIncrementStorage: virtual public IntegerSetting, public DBStorage {
@@ -639,6 +645,7 @@
 
     virtual void load() { };
     virtual void save();
+    virtual void save(QString destination);
 };
 
 class ButtonSetting: virtual public Setting {
Index: libs/libmyth/managedlist.cpp
===================================================================
--- libs/libmyth/managedlist.cpp	(revision 7738)
+++ libs/libmyth/managedlist.cpp	(working copy)
@@ -682,7 +682,7 @@
         int newIndex = curGroup->getCurIndex();
         int itemCount = curGroup->getItemCount();
 
-        newIndex += (page ? itemCount : 1);
+        newIndex += (page ? listSize : 1);
 
         if (newIndex >= itemCount)
             newIndex = (page ? itemCount - 1 : newIndex - itemCount);
@@ -707,7 +707,7 @@
         int newIndex = curGroup->getCurIndex();
         int itemCount = curGroup->getItemCount();
 
-        newIndex -= (page ? itemCount : 1);
+        newIndex -= (page ? listSize : 1);
         if (newIndex < 0)
             newIndex = (page ? 0 : itemCount + newIndex);
 
Index: programs/mythfrontend/main.cpp
===================================================================
--- programs/mythfrontend/main.cpp	(revision 7738)
+++ programs/mythfrontend/main.cpp	(working copy)
@@ -23,6 +23,7 @@
 #include "previousbox.h"
 #include "customrecord.h"
 #include "viewscheduled.h"
+#include "viewschdiff.h"
 #include "programrecpriority.h"
 #include "channelrecpriority.h"
 #include "globalsettings.h"
Index: programs/mythbackend/mainserver.cpp
===================================================================
--- programs/mythbackend/mainserver.cpp	(revision 7738)
+++ programs/mythbackend/mainserver.cpp	(working copy)
@@ -379,7 +379,10 @@
     }
     else if (command == "QUERY_GETALLPENDING")
     {
-        HandleGetPendingRecordings(pbs);
+        if (tokens.size() == 1)
+            HandleGetPendingRecordings(pbs);
+        else
+            HandleGetPendingRecordings(pbs, tokens[1]);
     }
     else if (command == "QUERY_GETALLSCHEDULED")
     {
@@ -1937,14 +1940,24 @@
     SendResponse(pbssock, strlist);
 }
 
-void MainServer::HandleGetPendingRecordings(PlaybackSock *pbs)
+void MainServer::HandleGetPendingRecordings(PlaybackSock *pbs, QString database)
 {
     QSocket *pbssock = pbs->getSocket();
 
     QStringList strList;
 
-    if (m_sched)
-        m_sched->getAllPending(strList);
+    if (m_sched) {
+        if (database == "") m_sched->getAllPending(strList);
+        else {
+            // We need a different connection from the scheduler proper
+            // DDCon exists, although it's designed for other purposes.
+            MSqlQueryInfo dbconn = MSqlQuery::DDCon();
+            Scheduler *sched = new Scheduler(false, encoderList, database, &dbconn);
+            sched->FillRecordListFromDB();
+            sched->getAllPending(strList);
+            delete sched;
+        }
+    }
     else
     {
         strList << QString::number(0);
Index: programs/mythbackend/scheduler.cpp
===================================================================
--- programs/mythbackend/scheduler.cpp	(revision 7738)
+++ programs/mythbackend/scheduler.cpp	(working copy)
@@ -31,11 +31,16 @@
 #include "libmythtv/programinfo.h"
 #include "libmythtv/scheduledrecording.h"
 
-Scheduler::Scheduler(bool runthread, QMap<int, EncoderLink *> *tvList)
+Scheduler::Scheduler(bool runthread, QMap<int, EncoderLink *> *tvList, QString recordDB, MSqlQueryInfo *databaseConnection)
 {
     hasconflicts = false;
     m_tvList = tvList;
 
+    if (databaseConnection) dbConn = *databaseConnection;
+    else dbConn = MSqlQuery::SchedCon();
+
+    recordDatabase = recordDB;
+
     m_mainServer = NULL;
 
     m_isShuttingDown = false;
@@ -77,7 +82,7 @@
 {
     QString thequery;
 
-    MSqlQuery query(MSqlQuery::SchedCon());
+    MSqlQuery query(dbConn);
     query.prepare("SELECT NULL FROM capturecard;");
 
     int numcards = -1;
@@ -103,7 +108,7 @@
         while (query.next())
         {
             source = query.value(0).toInt();
-            MSqlQuery subquery(MSqlQuery::SchedCon());
+            MSqlQuery subquery(dbConn);
 
             subquery.prepare("SELECT cardinputid FROM cardinput WHERE "
                              "sourceid = :SOURCEID ORDER BY cardinputid;");
@@ -277,7 +282,7 @@
 
 void Scheduler::FillRecordListFromDB(void)
 {
-    MSqlQuery query(MSqlQuery::SchedCon());
+    MSqlQuery query(dbConn);
     query.prepare("CREATE TEMPORARY TABLE recordmatch "
                   "(recordid int unsigned, chanid int unsigned, "
                   " starttime datetime, manualid int unsigned, "
@@ -291,6 +296,16 @@
 
     UpdateMatches(-1);
     FillRecordList();
+
+    MSqlQuery queryDrop(dbConn);
+    queryDrop.prepare("DROP TEMPORARY TABLE recordmatch;");
+    queryDrop.exec();
+    if (!queryDrop.isActive())
+    {
+        MythContext::DBError("FillRecordListFromDB", queryDrop);
+        return;
+    }
+
 }
 
 void Scheduler::FillRecordListFromMaster(void)
@@ -980,7 +995,7 @@
 
     // Mark anything that was recording as aborted.  We'll fix it up.
     // if possible, after the slaves connect and we start scheduling.
-    MSqlQuery query(MSqlQuery::SchedCon());
+    MSqlQuery query(dbConn);
     query.prepare("UPDATE oldrecorded SET recstatus = :RSABORTED "
                   "  WHERE recstatus = :RSRECORDING");
     query.bindValue(":RSABORTED", rsAborted);
@@ -1425,11 +1440,11 @@
 
 void Scheduler::UpdateManuals(int recordid)
 {
-    MSqlQuery query(MSqlQuery::SchedCon());
+    MSqlQuery query(dbConn);
 
-    query.prepare("SELECT type,title,station,startdate,starttime, "
+    query.prepare(QString("SELECT type,title,station,startdate,starttime, "
                   " enddate,endtime "
-                  "FROM record WHERE recordid = :RECORDID");
+                  "FROM %1 WHERE recordid = :RECORDID").arg(recordDatabase));
     query.bindValue(":RECORDID", recordid);
     query.exec();
     if (!query.isActive() || query.size() != 1)
@@ -1529,14 +1544,14 @@
                                        QStringList &where, 
                                        MSqlBindings &bindings)
 {
-    MSqlQuery result(MSqlQuery::SchedCon());
+    MSqlQuery result(dbConn);
     QString query;
     QString qphrase;
 
     query = QString("SELECT recordid,search,subtitle,description "
-                    "FROM record WHERE search <> %1 AND "
-                    "(recordid = %2 OR %3 = -1) ")
-        .arg(kNoSearch).arg(recordid).arg(recordid);
+                    "FROM %1 WHERE search <> %2 AND "
+                    "(recordid = %3 OR %4 = -1) ")
+        .arg(recordDatabase).arg(kNoSearch).arg(recordid).arg(recordid);
 
     result.prepare(query);
 
@@ -1574,19 +1589,19 @@
         case kPowerSearch:
             qphrase.remove(QRegExp("^\\s*AND\\s+", false));
             from << result.value(2).toString();
-            where << (QString("record.recordid = ") + bindrecid +
+            where << (QString("%1.recordid = ").arg(recordDatabase) + bindrecid +
                       QString(" AND program.manualid = 0 AND ( %2 )")
                       .arg(qphrase));
             break;
         case kTitleSearch:
             from << "";
-            where << (QString("record.recordid = ") + bindrecid + " AND "
+            where << (QString("%1.recordid = ").arg(recordDatabase) + bindrecid + " AND "
                       "program.manualid = 0 AND "
                       "program.title LIKE " + bindlikephrase);
             break;
         case kKeywordSearch:
             from << "";
-            where << (QString("record.recordid = ") + bindrecid +
+            where << (QString("%1.recordid = ").arg(recordDatabase) + bindrecid +
                       " AND program.manualid = 0"
                       " AND (program.title LIKE " + bindlikephrase +
                       " OR program.subtitle LIKE " + bindlikephrase +
@@ -1594,7 +1609,7 @@
             break;
         case kPeopleSearch:
             from << ", people, credits";
-            where << (QString("record.recordid = ") + bindrecid + " AND "
+            where << (QString("%1.recordid = ").arg(recordDatabase) + bindrecid + " AND "
                       "program.manualid = 0 AND "
                       "people.name LIKE " + bindphrase + " AND "
                       "credits.person = people.person AND "
@@ -1604,8 +1619,8 @@
         case kManualSearch:
             UpdateManuals(result.value(0).toInt());
             from << "";
-            where << (QString("record.recordid = ") + bindrecid + " AND "
-                              "program.manualid = record.recordid ");
+            where << ((QString("%1.recordid = ").arg(recordDatabase)) + bindrecid + " AND " +
+                              QString("program.manualid = %1.recordid ").arg(recordDatabase));
             break;
         default:
             VERBOSE(VB_IMPORTANT, QString("Unknown RecSearchType "
@@ -1621,10 +1636,19 @@
     if (recordid == -1 || from.count() == 0)
     {
         from << "";
-        where << "record.search = :NRST AND "
-                 "(record.recordid = :NRRECORDID OR :NRRECORDID = -1) AND "
+        QString s("DATABASE.search = :NRST AND "
+                 "(DATABASE.recordid = :NRRECORDID OR :NRRECORDID = -1) AND "
                  "program.manualid = 0 AND "
-                 "program.title = record.title ";
+                 "program.title = DATABASE.title ");
+
+        while (1)
+        {
+            int i = s.find("DATABASE");
+            if (i == -1) break;
+            s = s.replace(i, strlen("DATABASE"), recordDatabase);
+        }
+
+        where << s;
         bindings[":NRST"] = kNoSearch;
         bindings[":NRRECORDID"] = recordid;
     }
@@ -1633,7 +1657,7 @@
 void Scheduler::UpdateMatches(int recordid) {
     struct timeval dbstart, dbend;
 
-    MSqlQuery query(MSqlQuery::SchedCon());
+    MSqlQuery query(dbConn);
     query.prepare("DELETE FROM recordmatch "
                   "WHERE recordid = :RECORDID OR :RECORDID = -1;");
 
@@ -1673,29 +1697,29 @@
     {
         QString query = QString(
 "INSERT INTO recordmatch (recordid, chanid, starttime, manualid) "
-"SELECT record.recordid, program.chanid, program.starttime, "
+"SELECT DATABASE.recordid, program.chanid, program.starttime, "
 " IF(search = %1, recordid, 0) "
-"FROM record, program ").arg(kManualSearch) + fromclauses[clause] + QString(
+"FROM DATABASE, program ").arg(kManualSearch) + fromclauses[clause] + QString(
 " INNER JOIN channel ON (channel.chanid = program.chanid) "
 "WHERE ") + whereclauses[clause] + QString(" AND channel.visible = 1 AND "
-"((record.type = %1 " // allrecord
-"OR record.type = %2 " // findonerecord
-"OR record.type = %3 " // finddailyrecord
-"OR record.type = %4) " // findweeklyrecord
+"((DATABASE.type = %1 " // allrecord
+"OR DATABASE.type = %2 " // findonerecord
+"OR DATABASE.type = %3 " // finddailyrecord
+"OR DATABASE.type = %4) " // findweeklyrecord
 " OR "
-" ((record.station = channel.callsign) " // channel matches
+" ((DATABASE.station = channel.callsign) " // channel matches
 "  AND "
-"  ((record.type = %5) " // channelrecord
+"  ((DATABASE.type = %5) " // channelrecord
 "   OR"
-"   ((TIME_TO_SEC(record.starttime) = TIME_TO_SEC(program.starttime)) " // timeslot matches
+"   ((TIME_TO_SEC(DATABASE.starttime) = TIME_TO_SEC(program.starttime)) " // timeslot matches
 "    AND "
-"    ((record.type = %6) " // timeslotrecord
+"    ((DATABASE.type = %6) " // timeslotrecord
 "     OR"
-"     ((DAYOFWEEK(record.startdate) = DAYOFWEEK(program.starttime) "
+"     ((DAYOFWEEK(DATABASE.startdate) = DAYOFWEEK(program.starttime) "
 "      AND "
-"      ((record.type = %7) " // weekslotrecord
+"      ((DATABASE.type = %7) " // weekslotrecord
 "       OR"
-"       ((TO_DAYS(record.startdate) = TO_DAYS(program.starttime)) " // date matches
+"       ((TO_DAYS(DATABASE.startdate) = TO_DAYS(program.starttime)) " // date matches
 "        )"
 "       )"
 "      )"
@@ -1713,10 +1737,17 @@
             .arg(kTimeslotRecord)
             .arg(kWeekslotRecord);
 
+        while (1)
+        {
+            int i = query.find("DATABASE");
+            if (i == -1) break;
+            query = query.replace(i, strlen("DATABASE"), recordDatabase);
+        }
+
         VERBOSE(VB_SCHEDULE, QString(" |-- Start DB Query %1...").arg(clause));
 
         gettimeofday(&dbstart, NULL);
-        MSqlQuery result(MSqlQuery::SchedCon());
+        MSqlQuery result(dbConn);
         result.prepare(query);
         result.bindValues(bindings);
         result.exec();
@@ -1757,8 +1788,8 @@
     QMap<int, bool> tooManyMap;
     bool checkTooMany = false;
 
-    MSqlQuery rlist(MSqlQuery::SchedCon());
-    rlist.prepare("SELECT recordid,title,maxepisodes,maxnewest FROM record;");
+    MSqlQuery rlist(dbConn);
+    rlist.prepare(QString("SELECT recordid,title,maxepisodes,maxnewest FROM %1;").arg(recordDatabase));
 
     rlist.exec();
 
@@ -1779,7 +1810,7 @@
 
         if (maxEpisodes && !maxNewest)
         {
-            MSqlQuery epicnt(MSqlQuery::SchedCon());
+            MSqlQuery epicnt(dbConn);
 
             epicnt.prepare("SELECT count(*) FROM recorded "
                            "WHERE title = :TITLE;");
@@ -1801,18 +1832,18 @@
     }
 
     QString progfindid = QString(
-"(CASE record.type "
+"(CASE DATABASE.type "
 "  WHEN %1 "
-"   THEN record.findid "
+"   THEN DATABASE.findid "
 "  WHEN %2 "
 "   THEN to_days(date_sub(program.starttime, interval "
-"                time_format(record.findtime, '%H:%i') hour_minute)) "
+"                time_format(DATABASE.findtime, '%H:%i') hour_minute)) "
 "  WHEN %3 "
 "   THEN floor((to_days(date_sub(program.starttime, interval "
-"               time_format(record.findtime, '%H:%i') hour_minute)) - "
-"               record.findday)/7) * 7 + record.findday "
+"               time_format(DATABASE.findtime, '%H:%i') hour_minute)) - "
+"               DATABASE.findday)/7) * 7 + DATABASE.findday "
 "  WHEN %4 "
-"   THEN record.findid "
+"   THEN DATABASE.findid "
 "  ELSE 0 "
 " END) ")
         .arg(kFindOneRecord)
@@ -1826,25 +1857,25 @@
 "program.title, program.subtitle, program.description, "
 "channel.channum, channel.callsign, channel.name, "
 "oldrecorded.endtime IS NOT NULL AS oldrecduplicate, program.category, "
-"record.recpriority, "
-"record.dupin, "
+"DATABASE.recpriority, "
+"DATABASE.dupin, "
 "recorded.endtime IS NOT NULL AND recorded.endtime < NOW() AS recduplicate, "
 "oldfind.findid IS NOT NULL AS findduplicate, "
-"record.type, record.recordid, "
-"program.starttime - INTERVAL record.startoffset minute AS recstartts, "
-"program.endtime + INTERVAL record.endoffset minute AS recendts, "
-"program.previouslyshown, record.recgroup, record.dupmethod, "
+"DATABASE.type, DATABASE.recordid, "
+"program.starttime - INTERVAL DATABASE.startoffset minute AS recstartts, "
+"program.endtime + INTERVAL DATABASE.endoffset minute AS recendts, "
+"program.previouslyshown, DATABASE.recgroup, DATABASE.dupmethod, "
 "channel.commfree, capturecard.cardid, "
 "cardinput.cardinputid, UPPER(cardinput.shareable) = 'Y' AS shareable, "
 "program.seriesid, program.programid, program.category_type, "
-"program.airdate, program.stars, program.originalairdate, record.inactive, "
-"record.parentid, ") + progfindid + ", record.tsdefault, "
+"program.airdate, program.stars, program.originalairdate, DATABASE.inactive, "
+"DATABASE.parentid, ") + progfindid + ", DATABASE.tsdefault, "
 "oldrecstatus.recstatus, oldrecstatus.reactivate, " 
 "channel.recpriority + cardinput.preference "
 + QString(
 "FROM recordmatch "
 
-" INNER JOIN record ON (recordmatch.recordid = record.recordid) "
+" INNER JOIN DATABASE ON (recordmatch.recordid = DATABASE.recordid) "
 " INNER JOIN program ON (recordmatch.chanid = program.chanid AND "
 "                        recordmatch.starttime = program.starttime AND "
 "                        recordmatch.manualid = program.manualid) "
@@ -1857,7 +1888,7 @@
 "    oldrecstatus.title = program.title ) "
 " LEFT JOIN oldrecorded ON "
 "  ( "
-"    record.dupmethod > 1 AND "
+"    DATABASE.dupmethod > 1 AND "
 "    oldrecorded.duplicate <> 0 AND "
 "    program.title = oldrecorded.title "
 "     AND "
@@ -1872,17 +1903,17 @@
 "      ( "
 "       (program.programid = '' OR oldrecorded.programid = '') "
 "       AND "
-"       (((record.dupmethod & 0x02) = 0) OR (program.subtitle <> '' "
+"       (((DATABASE.dupmethod & 0x02) = 0) OR (program.subtitle <> '' "
 "          AND program.subtitle = oldrecorded.subtitle)) "
 "       AND "
-"       (((record.dupmethod & 0x04) = 0) OR (program.description <> '' "
+"       (((DATABASE.dupmethod & 0x04) = 0) OR (program.description <> '' "
 "          AND program.description = oldrecorded.description)) "
 "      ) "
 "     ) "
 "  ) "
 " LEFT JOIN recorded ON "
 "  ( "
-"    record.dupmethod > 1 AND "
+"    DATABASE.dupmethod > 1 AND "
 "    program.title = recorded.title "
 "     AND "
 "     ( "
@@ -1896,10 +1927,10 @@
 "      ( "
 "       (program.programid = '' OR recorded.programid = '') "
 "       AND "
-"       (((record.dupmethod & 0x02) = 0) OR (program.subtitle <> '' "
+"       (((DATABASE.dupmethod & 0x02) = 0) OR (program.subtitle <> '' "
 "          AND program.subtitle = recorded.subtitle)) "
 "       AND "
-"       (((record.dupmethod & 0x04) = 0) OR (program.description <> '' "
+"       (((DATABASE.dupmethod & 0x04) = 0) OR (program.description <> '' "
 "          AND program.description = recorded.description)) "
 "      ) "
 "     ) "
@@ -1907,13 +1938,20 @@
 " LEFT JOIN oldfind ON "
 "  (oldfind.recordid = recordmatch.recordid AND "
 "   oldfind.findid = ") + progfindid + QString(") "
-" ORDER BY record.recordid DESC "
+" ORDER BY DATABASE.recordid DESC "
 );
 
+    while (1)
+    {
+        int i = query.find("DATABASE");
+        if (i == -1) break;
+        query = query.replace(i, strlen("DATABASE"), recordDatabase);
+    }
+
     VERBOSE(VB_SCHEDULE, QString(" |-- Start DB Query..."));
 
     gettimeofday(&dbstart, NULL);
-    MSqlQuery result(MSqlQuery::SchedCon());
+    MSqlQuery result(dbConn);
     result.prepare(query);
     result.exec();
     gettimeofday(&dbend, NULL);
@@ -1976,6 +2014,7 @@
         p->year = result.value(30).toString();
         p->stars =  result.value(31).toDouble();
 
+
         if (result.value(32).isNull())
         {
             p->originalAirDate = p->startts.date();
@@ -2081,22 +2120,29 @@
     RecList tmpList;
 
     QString query = QString(
-"SELECT record.recordid, record.type, record.chanid, "
-"record.starttime, record.startdate, record.endtime, record.enddate, "
-"record.startoffset, record.endoffset, "
-"record.title, record.subtitle, record.description, "
+"SELECT DATABASE.recordid, DATABASE.type, DATABASE.chanid, "
+"DATABASE.starttime, DATABASE.startdate, DATABASE.endtime, DATABASE.enddate, "
+"DATABASE.startoffset, DATABASE.endoffset, "
+"DATABASE.title, DATABASE.subtitle, DATABASE.description, "
 "channel.channum, channel.callsign, channel.name "
-"FROM record "
-" INNER JOIN channel ON (channel.chanid = record.chanid) "
-" LEFT JOIN recordmatch on record.recordid = recordmatch.recordid "
+"FROM DATABASE "
+" INNER JOIN channel ON (channel.chanid = DATABASE.chanid) "
+" LEFT JOIN recordmatch on DATABASE.recordid = recordmatch.recordid "
 "WHERE (type = %1 OR type = %2) AND recordmatch.chanid IS NULL")
         .arg(kSingleRecord)
         .arg(kOverrideRecord);
 
+    while (1)
+    {
+        int i = query.find("DATABASE");
+        if (i == -1) break;
+        query = query.replace(i, strlen("DATABASE"), recordDatabase);
+    }
+
     VERBOSE(VB_SCHEDULE, QString(" |-- Start DB Query..."));
 
     gettimeofday(&dbstart, NULL);
-    MSqlQuery result(MSqlQuery::SchedCon());
+    MSqlQuery result(dbConn);
     result.prepare(query);
     result.exec();
     gettimeofday(&dbend, NULL);
@@ -2166,18 +2212,25 @@
 void Scheduler::findAllScheduledPrograms(list<ProgramInfo *> &proglist)
 {
     QString temptime, tempdate;
-    QString query = QString("SELECT record.chanid, record.starttime, "
-"record.startdate, record.endtime, record.enddate, record.title, "
-"record.subtitle, record.description, record.recpriority, record.type, "
-"channel.name, record.recordid, record.recgroup, record.dupin, "
-"record.dupmethod, channel.commfree, channel.channum, record.station, "
-"record.seriesid, record.programid, record.category, record.findid, "
-"record.tsdefault "
-"FROM record "
-"LEFT JOIN channel ON channel.callsign = record.station "
+    QString query = QString("SELECT DATABASE.chanid, DATABASE.starttime, "
+"DATABASE.startdate, DATABASE.endtime, DATABASE.enddate, DATABASE.title, "
+"DATABASE.subtitle, DATABASE.description, DATABASE.recpriority, DATABASE.type, "
+"channel.name, DATABASE.recordid, DATABASE.recgroup, DATABASE.dupin, "
+"DATABASE.dupmethod, channel.commfree, channel.channum, DATABASE.station, "
+"DATABASE.seriesid, DATABASE.programid, DATABASE.category, DATABASE.findid, "
+"DATABASE.tsdefault "
+"FROM DATABASE "
+"LEFT JOIN channel ON channel.callsign = DATABASE.station "
 "GROUP BY recordid "
 "ORDER BY title ASC;");
 
+    while (1)
+    {
+        int i = query.find("DATABASE");
+        if (i == -1) break;
+        query = query.replace(i, strlen("DATABASE"), recordDatabase);
+    }
+
     MSqlQuery result(MSqlQuery::InitCon());
     result.prepare(query);
     result.exec();
Index: programs/mythbackend/mainserver.h
===================================================================
--- programs/mythbackend/mainserver.h	(revision 7738)
+++ programs/mythbackend/mainserver.h	(working copy)
@@ -83,7 +83,7 @@
     void HandleQueryFreeSpace(PlaybackSock *pbs, bool allBackends);
     void HandleQueryCheckFile(QStringList &slist, PlaybackSock *pbs);
     void HandleQueryGuideDataThrough(PlaybackSock *pbs);
-    void HandleGetPendingRecordings(PlaybackSock *pbs);
+    void HandleGetPendingRecordings(PlaybackSock *pbs, QString database = "");
     void HandleGetScheduledRecordings(PlaybackSock *pbs);
     void HandleGetConflictingRecordings(QStringList &slist, PlaybackSock *pbs);
     void HandleGetNextFreeRecorder(QStringList &slist, PlaybackSock *pbs);
Index: programs/mythbackend/scheduler.h
===================================================================
--- programs/mythbackend/scheduler.h	(revision 7738)
+++ programs/mythbackend/scheduler.h	(working copy)
@@ -22,7 +22,7 @@
 class Scheduler : public QObject
 {
   public:
-    Scheduler(bool runthread, QMap<int, EncoderLink *> *tvList);
+    Scheduler(bool runthread, QMap<int, EncoderLink *> *tvList, QString recorddb = "record", MSqlQueryInfo *dbConnUse = NULL);
     ~Scheduler();
 
     void Reschedule(int recordid);
@@ -61,6 +61,8 @@
     static void *SchedulerThread(void *param);
 
   private:
+    QString recordDatabase;
+
     void verifyCards(void);
 
     bool FillRecordList(void);
@@ -117,6 +119,7 @@
     MainServer *m_mainServer;
 
     bool m_isShuttingDown;
+    MSqlQueryInfo dbConn;
 
 };
 
