Index: libs/libmythtv/firewirechannel.cpp
===================================================================
--- libs/libmythtv/firewirechannel.cpp	(revision 15445)
+++ libs/libmythtv/firewirechannel.cpp	(working copy)
@@ -22,7 +22,8 @@
     fw_opts(firewire_opts),
     device(NULL),
     current_channel(0),
-    isopen(false)
+    isopen(false),
+    initialized(false)
 {
     uint64_t guid = string_to_guid(videodevice);
     uint subunitid = 0; // we only support first tuner on STB...
@@ -40,6 +41,20 @@
     InitializeInputs();
 }
 
+bool FirewireChannel::Init(QString &inputname, QString &startchannel)
+{
+    if (!initialized)
+    {
+        DTVChannel::Init(inputname, startchannel);
+    }
+    else
+    {
+        VERBOSE(VB_CHANNEL, QString("[RE]Init(%1,%2)")
+                .arg(inputname).arg(startchannel));
+    }
+    initialized = true;
+}
+
 bool FirewireChannel::SetChannelByString(const QString &channum)
 {
     QString loc = LOC + QString("SetChannelByString(%1)").arg(channum);
@@ -209,6 +224,7 @@
 
 bool FirewireChannel::SetChannelByNumber(int channel)
 {
+    VERBOSE(VB_CHANNEL, QString("SetChannelByNumber(%1)").arg(channel));
     current_channel = channel;
 
     if (FirewireDevice::kAVCPowerOff == GetPowerState())
Index: libs/libmythtv/firewiredevice.cpp
===================================================================
--- libs/libmythtv/firewiredevice.cpp	(revision 15445)
+++ libs/libmythtv/firewiredevice.cpp	(working copy)
@@ -144,7 +144,11 @@
 bool FirewireDevice::SetChannel(const QString &panel_model,
                                 uint alt_method, uint channel)
 {
+    VERBOSE(VB_CHANNEL, QString("SetChannel(model %1, alt %2, chan %3)")
+            .arg(panel_model).arg(alt_method).arg(channel));
+
     QMutexLocker locker(&m_lock);
+    VERBOSE(VB_CHANNEL, "SetChannel() -- locked");
 
     if (!IsSTBSupported(panel_model))
     {
@@ -160,7 +164,12 @@
     digit[2] = (channel % 10);
 
     if (m_subunitid >= kAVCSubunitIdExtended)
+    {
+        VERBOSE(VB_IMPORTANT, LOC_ERR +
+                "SetChannel: Extended subunits are not supported.");
+
         return false;
+    }
 
     vector<uint8_t> cmd;
     vector<uint8_t> ret;
Index: libs/libmythtv/firewirerecorder.cpp
===================================================================
--- libs/libmythtv/firewirerecorder.cpp	(revision 15445)
+++ libs/libmythtv/firewirerecorder.cpp	(working copy)
@@ -175,20 +175,35 @@
         VERBOSE(VB_RECORD, LOC + "PauseAndWait("<<timeout<<") -- pause");
         if (!paused)
         {
+            VERBOSE(VB_RECORD, LOC + "PauseAndWait() -- stop");
             StopStreaming();
+            VERBOSE(VB_RECORD, LOC + "PauseAndWait() -- stopped");
+            VERBOSE(VB_RECORD, LOC + "PauseAndWait() -- setting 'paused'");
             paused = true;
+            VERBOSE(VB_RECORD, LOC + "PauseAndWait() -- 'paused' set");
             pauseWait.wakeAll();
             if (tvrec)
+            {
+                VERBOSE(VB_RECORD, LOC + "PauseAndWait() -- rec paused");
                 tvrec->RecorderPaused();
+            }
         }
+        VERBOSE(VB_RECORD, LOC + "PauseAndWait() -- wait for unpause");
         unpauseWait.wait(timeout);
+        VERBOSE(VB_RECORD, LOC + "PauseAndWait() -- unpaused or timeout");
     }
     if (!request_pause && paused)
     {
         VERBOSE(VB_RECORD, LOC + "PauseAndWait("<<timeout<<") -- unpause");
         StartStreaming();
+        VERBOSE(VB_RECORD, LOC + "PauseAndWait() -- clearing 'paused'");
         paused = false;
+        VERBOSE(VB_RECORD, LOC + "PauseAndWait() -- 'paused' cleared");
     }
+
+    VERBOSE(VB_RECORD, LOC + "PauseAndWait("<<timeout<<") -- done "
+            "-- paused("<<paused<<")");
+
     return paused;
 }
 
Index: libs/libmythtv/channelutil.cpp
===================================================================
--- libs/libmythtv/channelutil.cpp	(revision 15445)
+++ libs/libmythtv/channelutil.cpp	(working copy)
@@ -920,11 +920,16 @@
                                     const QString &new_channum,
                                     const QString &old_channum)
 {
+    VERBOSE(VB_CHANNEL, QString("IsOnSameMultiplex: old_channum: %1")
+            .arg(old_channum));
+    VERBOSE(VB_CHANNEL, QString("IsOnSameMultiplex: new_channum: %1")
+            .arg(old_channum));
+
     if (new_channum.isEmpty() || old_channum.isEmpty())
         return false;
 
-    if (new_channum == old_channum)
-        return true;
+//    if (new_channum == old_channum)
+//        return true;
 
     uint old_mplexid = GetMplexID(srcid, old_channum);
     if (!old_mplexid)
@@ -934,6 +939,10 @@
     if (!new_mplexid)
         return false;
 
+    VERBOSE(VB_CHANNEL, QString("IsOnSameMultiplex? %1==%2 -> %3")
+            .arg(old_mplexid).arg(new_mplexid)
+            .arg(old_mplexid == new_mplexid));
+
     return old_mplexid == new_mplexid;
 }
 
Index: libs/libmythtv/firewirechannel.h
===================================================================
--- libs/libmythtv/firewirechannel.h	(revision 15445)
+++ libs/libmythtv/firewirechannel.h	(working copy)
@@ -19,6 +19,7 @@
     ~FirewireChannel() { Close(); }
 
     // Commands
+    virtual bool Init(QString &inputname, QString &startchannel);
     virtual bool Open(void);
     virtual void Close(void);
 
@@ -45,6 +46,7 @@
     FirewireDevice    *device;
     uint               current_channel;
     bool               isopen;
+    bool               initialized;
 };
 
 #endif // _FIREWIRECHANNEL_H_
Index: libs/libmythtv/tv_rec.cpp
===================================================================
--- libs/libmythtv/tv_rec.cpp	(revision 15445)
+++ libs/libmythtv/tv_rec.cpp	(working copy)
@@ -2795,6 +2795,7 @@
  */
 void TVRec::PauseRecorder(void)
 {
+    VERBOSE(VB_IMPORTANT, "PauseRecorder -- begin");
     QMutexLocker lock(&stateChangeLock);
 
     if (!recorder)
@@ -2805,6 +2806,8 @@
     }
 
     recorder->Pause();
+    VERBOSE(VB_IMPORTANT, "PauseRecorder -- done "
+            "(still need to wait for pause)");
 } 
 
 /** \fn TVRec::RecorderPaused(void)
@@ -3012,7 +3015,7 @@
 void TVRec::SetChannel(QString name, uint requestType)
 {
     QMutexLocker lock(&stateChangeLock);
-    VERBOSE(VB_RECORD, LOC + "SetChannel()" + " -- begin");
+    VERBOSE(VB_RECORD, LOC + QString("SetChannel(%1) -- begin").arg(name));
 
     // Detect tuning request type if needed
     if (requestType & kFlagDetect)
@@ -3035,7 +3038,7 @@
         while (!HasFlags(kFlagRingBufferReady))
             WaitForEventThreadSleep();
     }
-    VERBOSE(VB_RECORD, LOC + "SetChannel()" + " -- end");
+    VERBOSE(VB_RECORD, LOC + QString("SetChannel(%1) -- end").arg(name));
 }
 
 /** \fn TVRec::GetNextProgram(int,QString&,QString&,QString&,QString&,QString&,QString&,QString&,QString&,QString&,QString&,QString&,QString&)
@@ -3335,7 +3338,7 @@
 
     uint    sourceid   = channel->GetCurrentSourceID();
     QString oldchannum = channel->GetCurrentName();
-    QString newchannum = request.channel;
+    QString newchannum = QDeepCopy<QString>(request.channel);
 
     if (ChannelUtil::IsOnSameMultiplex(sourceid, newchannum, oldchannum))
     {
@@ -3401,9 +3404,16 @@
                              kFlagEITScan|kFlagAntennaAdjust))
         {
             if (!recorder)
+            {
+                VERBOSE(VB_RECORD, LOC +
+                        "No recorder yet, calling TuningFrequency");
                 TuningFrequency(request);
+            }
             else
+            {
+                VERBOSE(VB_RECORD, LOC + "Waiting for recorder pause..");
                 SetFlags(kFlagWaitingForRecPause);
+            }
         }
         lastTuningRequest = request;
     }
@@ -3423,6 +3433,7 @@
             GetHDHRRecorder()->SetRingBuffer(NULL);
         }
 #endif // USING_HDHOMERUN
+        VERBOSE(VB_RECORD, LOC + "Recorder paused, calling TuningFrequency");
         TuningFrequency(lastTuningRequest);
     }
 
