diff -ru libmythtv.pre_fix/dvbrecorder.cpp libmythtv/dvbrecorder.cpp
--- libmythtv.pre_fix/dvbrecorder.cpp   2006-01-20 13:48:36.000000000 -0500
+++ libmythtv/dvbrecorder.cpp   2006-01-21 15:35:12.000000000 -0500
@@ -125,6 +125,7 @@
 
     initDeCSA();
 
+    _has_payload = false;
 }
 
 DVBRecorder::~DVBRecorder()
@@ -897,11 +881,15 @@
     if (!info->payloadStartSeen)
     {
         if (!tspacket.PayloadStart())
+        {
+            _has_payload = false;
             return true; // not payload start - drop packet
+        }
 
         VERBOSE(VB_RECORD,
                 QString("PID 0x%1 Found Payload Start").arg(pid,0,16));
         info->payloadStartSeen = true;
+        _has_payload = true;
     }
 
     // Write PAT & PMT tables occasionally
diff -ru libmythtv.pre_fix/dvbrecorder.h libmythtv/dvbrecorder.h
--- libmythtv.pre_fix/dvbrecorder.h     2006-01-20 13:48:36.000000000 -0500
+++ libmythtv/dvbrecorder.h     2006-01-21 15:35:12.000000000 -0500
@@ -88,6 +88,9 @@
     bool IsOpen(void) const { return _stream_fd >= 0; }
     void Close(void);
 
+    bool HasPayload(void) const
+        { return _has_payload; }
+
     bool RecordsTransportStream(void) const
         { return _record_transport_stream_option; }
 
@@ -161,6 +164,7 @@
     ProgramMapTable         *_pmt;
     uint            _next_pmt_version;
     int             _ts_packets_until_psip_sync;
+    bool            _has_payload;
 
     // Input Misc
     /// PMT on input side
diff -ru libmythtv.pre_fix/tv_rec.cpp libmythtv/tv_rec.cpp
--- libmythtv.pre_fix/tv_rec.cpp        2006-01-20 13:48:36.000000000 -0500
+++ libmythtv/tv_rec.cpp        2006-01-21 15:57:37.000000000 -0500
@@ -129,6 +129,9 @@
       // RingBuffer info
       ringBuffer(NULL), rbFilePrefix(""), rbFileExt("mpg")
 {
+      // Retune stuff
+      retune_timer = new MythTimer();
+      retune_timer->start();
 }
 
 /** \fn TVRec::Init()
@@ -3207,6 +3210,8 @@
  */
 void TVRec::HandleTuning(void)
 {
+    bool handle_done = false;
+
     if (tuningRequests.size())
     {
         const TuningRequest *request = &tuningRequests.front();
@@ -3218,7 +3223,10 @@
                               kFlagEITScan|kFlagAntennaAdjust))
         {
             if (!recorder)
+            {
                 TuningFrequency(*request);
+                retune_timer->restart();
+            }
             else
                 SetFlags(kFlagWaitingForRecPause);
         }
@@ -3242,20 +3250,31 @@
         }
 #endif // USING_DVB
         TuningFrequency(lastTuningRequest);
+        retune_timer->restart();
     }
-
+    
     if (HasFlags(kFlagWaitingForSignal))
     {
         if (!TuningSignalCheck())
-            return;
+            handle_done = true;
     }
 
     if (HasFlags(kFlagWaitingForSIParser))
     {
         if (!TuningPMTCheck())
-            return;
+            handle_done = true;
     }
 
+#ifdef USING_DVB
+    if (HasFlags(kFlagWaitingForSignal) ||  // Just because we have signal, we 
+        HasFlags(kFlagWaitingForSIParser))  // may not have the right transponder
+        if (retune_timer->elapsed())
+            RetuneChannel();
+#endif // USING_DVB
+
+    if (handle_done)
+        return;
+
     if (HasFlags(kFlagNeedToStartRecorder))
     { 
         if (recorder)
@@ -3263,9 +3282,28 @@
         else
             TuningNewRecorder();
 
-        // If we got this far it is safe to set a new starting channel...
-        if (channel)
-            channel->StoreInputChannels();
+        SetFlags(kFlagWaitingForPayload);
+    }
+
+    if (HasFlags(kFlagWaitingForPayload))
+    {
+#ifdef USING_DVB
+        if (GetDVBRecorder())
+        {
+            // Check to see if we have a Payload Start
+            if (GetDVBRecorder()->HasPayload())
+            {
+                ClearFlags(kFlagWaitingForPayload);
+                
+                // If we got this far it is safe to set a new starting channel...
+                if (channel)
+                    channel->StoreInputChannels();
+            }
+        }
+        else
+        {
+#endif // USING_DVB
+
+            ClearFlags(kFlagWaitingForPayload);
+
+            if (channel)
+                channel->StoreInputChannels();
+#if USING_DVB
+        }
+#endif // USING_DVB
     }
 }
 
@@ -3340,6 +3378,17 @@
     ClearFlags(kFlagPendingActions);
 }
 
+/** \fn TVRec::RetuneChannel(void)
+ *  \brief Retunes a DVB channel
+ */
+bool TVRec::RetuneChannel(void)
+{
+#ifdef USING_DVB
+    if (GetDVBChannel())
+        return GetDVBChannel()->Tune_again();
+#endif // USING_DVB
+}
+
 /** \fn TVRec::TuningFrequency(const TuningRequest&)
  *  \brief Performs initial tuning required for any tuning event.
  *
@@ -3899,6 +3948,8 @@
             msg += "WaitingForSignal,";
         if (kFlagWaitingForSIParser & f)
             msg += "WaitingForSIParser,";
+        if (kFlagWaitingForPayload & f)
+            msg += "kFlagWaitingForPayload,";
         if (kFlagNeedToStartRecorder & f)
             msg += "NeedToStartRecorder,";
         if (kFlagKillRingBuffer & f)
diff -ru libmythtv.pre_fix/tv_rec.h libmythtv/tv_rec.h
--- libmythtv.pre_fix/tv_rec.h  2006-01-20 13:48:36.000000000 -0500
+++ libmythtv/tv_rec.h  2006-01-21 15:35:12.000000000 -0500
@@ -13,6 +13,7 @@
 #include "mythdeque.h"
 #include "programinfo.h"
 #include "tv.h"
+#include "util.h"
 
 class QSocket;
 class NuppelVideoRecorder;
@@ -276,6 +277,8 @@
     void TuningNewRecorder(void);
     void TuningRestartRecorder(void);
 
+    bool RetuneChannel(void);
+
     void HandleStateChange(void);
     void ChangeState(TVState nextState);
     bool StateIsRecording(TVState state);
@@ -362,6 +365,9 @@
     QString      rbFilePrefix;
     QString      rbFileExt;
 
+    // Retune stuff
+    MythTimer *retune_timer;
+
   public:
     static const uint kEITScanStartTimeout;
     static const uint kSignalMonitoringRate;
@@ -394,6 +400,7 @@
 
     static const uint kFlagNoRec                = 0x0000F000;
     static const uint kFlagKillRingBuffer       = 0x00010000;
+    static const uint kFlagWaitingForPayload    = 0x00020000;
 
     // Waiting stuff
     static const uint kFlagWaitingForRecPause   = 0x00100000;
diff -ru libmythtv.pre_fix/dvbchannel.cpp libmythtv/dvbchannel.cpp
--- libmythtv.clean/dvbchannel.cpp      2006-01-15 15:01:32.000000000 -0500
+++ libmythtv/dvbchannel.cpp    2006-01-15 15:05:48.000000000 -0500
@@ -642,6 +642,8 @@
     bool has_diseq = (FE_QPSK == info.type) && diseqc;
     struct dvb_frontend_parameters params = channel.tuning.params;

+    prev_channel.tuning = channel.tuning;
+
     if (fd_frontend < 0)
     {
         ERROR("DVBChannel::Tune: Card not open!");
@@ -686,6 +688,11 @@
     return true;
 }

+bool DVBChannel::Tune_again(void)
+{
+    return Tune(prev_channel, true);
+}
+
 /** \fn DVBChannel::GetTuningParams(DVBTuning& tuning) const
  *  \brief Fetches DVBTuning params from driver
  *  \return true on success, false on failure
diff -ru libmythtv.clean/dvbchannel.h libmythtv/dvbchannel.h
--- libmythtv.clean/dvbchannel.h        2006-01-15 15:01:32.000000000 -0500
+++ libmythtv/dvbchannel.h      2006-01-15 15:04:55.000000000 -0500
@@ -65,6 +65,7 @@
     bool SwitchToInput(const QString &inputname, const QString &chan);
     bool SwitchToInput(int newcapchannel, bool setstarting);
     bool Tune(const dvb_channel_t& channel, bool force_reset=false);
+    bool Tune_again(void);

     // Set/Get/Command just for SIScan/ScanWizardScanner
     void SetMultiplexID(int mplexid)          { currentTID = mplexid; };
@@ -105,6 +106,7 @@
     dvb_frontend_info info;        ///< Contains info on tuning hardware
     dvb_channel_t     chan_opts;   ///< Tuning options sent to tuning hardware
     DVBTuning         prev_tuning; ///< Last tuning options sent to hardware
+    dvb_channel_t     prev_channel;

     volatile int      fd_frontend; ///< File descriptor for tuning hardware
     int               cardnum;     ///< DVB Card number