diff -rup libmythtv.no_hack/dvbchannel.cpp libmythtv/dvbchannel.cpp
--- libmythtv.no_hack/dvbchannel.cpp    2006-02-02 18:04:07.000000000 -0500
+++ libmythtv/dvbchannel.cpp    2006-02-02 18:17:02.000000000 -0500
@@ -82,6 +82,7 @@ DVBChannel::DVBChannel(int aCardNum, TVR
     dvbcam = new DVBCam(cardnum);
     bzero(&info, sizeof(info));
     has_crc_bug = CardUtil::HasDVBCRCBug(aCardNum);
+    frequency_incr = -10;
 }
 
 DVBChannel::~DVBChannel()
@@ -642,6 +643,8 @@ bool DVBChannel::Tune(const dvb_channel_
     bool has_diseq = (FE_QPSK == info.type) && diseqc;
     struct dvb_frontend_parameters params = channel.tuning.params;
 
+    prev_channel.tuning = channel.tuning;
+
 // (begin)softcam-0.4
     GENERAL(QString("invalidating DeCSA for card %1").arg(cardnum));
     //DVBRecorder::UpdateDeCSAKeys(cardnum, 'I', 0, NULL, 0);
@@ -674,6 +677,9 @@ bool DVBChannel::Tune(const dvb_channel_
         // Adjust for Satelite recievers which offset the frequency.
         params.frequency = tuned_frequency(channel.tuning, info.type, NULL);
 
+        frequency_incr = 0 - frequency_incr;
+        params.frequency = params.frequency + frequency_incr;
+
         if (ioctl(fd_frontend, FE_SET_FRONTEND, &params) < 0)
         {
             ERRNO("DVBChannel::Tune: "
@@ -691,6 +697,11 @@ bool DVBChannel::Tune(const dvb_channel_
     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 -rup libmythtv.no_hack/dvbchannel.h libmythtv/dvbchannel.h
--- libmythtv.no_hack/dvbchannel.h      2006-02-02 18:04:06.000000000 -0500
+++ libmythtv/dvbchannel.h      2006-02-02 18:17:46.000000000 -0500
@@ -65,6 +65,7 @@ class DVBChannel : public QObject, publi
     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 @@ class DVBChannel : public QObject, publi
     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
@@ -114,6 +116,7 @@ class DVBChannel : public QObject, publi
     bool              first_tune;  ///< Used to force hardware reset
 
     int               nextcapchannel; ///< Signal an input change
+    int               frequency_incr;
 };
 
 #endif
diff -rup libmythtv.no_hack/dvbdiseqc.cpp libmythtv/dvbdiseqc.cpp
--- libmythtv.no_hack/dvbdiseqc.cpp     2006-02-02 18:04:07.000000000 -0500
+++ libmythtv/dvbdiseqc.cpp     2006-02-03 16:13:41.000000000 -0500
@@ -52,7 +52,7 @@ DVBDiSEqC::DVBDiSEqC(int _cardnum, int _
 {
 
     // Number of repeats for DiSEqC 1.1 devices
-    repeat = 1;
+    repeat = 2;
 }
 
 DVBDiSEqC::~DVBDiSEqC()
Only in libmythtv: dvbdiseqc.cpp.rej
diff -rup libmythtv.no_hack/dvbrecorder.cpp libmythtv/dvbrecorder.cpp
--- libmythtv.no_hack/dvbrecorder.cpp   2006-02-02 18:04:06.000000000 -0500
+++ libmythtv/dvbrecorder.cpp   2006-02-02 18:06:24.000000000 -0500
@@ -127,6 +127,7 @@ DVBRecorder::DVBRecorder(TVRec *rec, DVB
     initDeCSA();
 // (end)softcsa-0.5.pre3
 
+    _has_payload = false;
 }
 
 DVBRecorder::~DVBRecorder()
@@ -880,11 +881,15 @@ bool DVBRecorder::ProcessTSPacket(const
     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 -rup libmythtv.no_hack/dvbrecorder.h libmythtv/dvbrecorder.h
--- libmythtv.no_hack/dvbrecorder.h     2006-02-02 18:04:07.000000000 -0500
+++ libmythtv/dvbrecorder.h     2006-02-02 18:06:24.000000000 -0500
@@ -94,6 +94,9 @@ class DVBRecorder: public DTVRecorder, p
     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; }
 
@@ -165,6 +168,7 @@ class DVBRecorder: public DTVRecorder, p
     ProgramMapTable         *_pmt;
     uint            _next_pmt_version;
     int             _ts_packets_until_psip_sync;
+    bool            _has_payload;
 
     // Input Misc
     /// PMT on input side
Only in libmythtv: siparser.cpp.orig
Only in libmythtv: siparser.h.orig
Only in libmythtv: siparser.h.rej
diff -rup libmythtv.no_hack/tv_rec.cpp libmythtv/tv_rec.cpp
--- libmythtv.no_hack/tv_rec.cpp        2006-02-02 18:04:07.000000000 -0500
+++ libmythtv/tv_rec.cpp        2006-02-02 18:27:27.000000000 -0500
@@ -130,6 +130,11 @@ TVRec::TVRec(int capturecardnum)
       // RingBuffer info
       ringBuffer(NULL), rbFilePrefix(""), rbFileExt("mpg")
 {
+      // Retune stuff
+      retune_timer = new TuningTimer();
+      retune_timer->setTimeout(10000);
+      retune_timer->start();
+      retune_requests = 0;
 }
 
 /** \fn TVRec::Init()
@@ -3188,6 +3193,8 @@ void TVRec::RingBufferChanged(RingBuffer
  */
 void TVRec::HandleTuning(void)
 {
+    bool handle_done = false;
+
     if (tuningRequests.size())
     {
         const TuningRequest *request = &tuningRequests.front();
@@ -3199,7 +3206,12 @@ void TVRec::HandleTuning(void)
                               kFlagEITScan|kFlagAntennaAdjust))
         {
             if (!recorder)
+            {
                 TuningFrequency(*request);
+                retune_timer->restart();
+                retune_timer->addMSecs(1);
+                retune_requests = 0;
+            }
             else
                 SetFlags(kFlagWaitingForRecPause);
         }
@@ -3221,22 +3233,39 @@ void TVRec::HandleTuning(void)
             GetDVBRecorder()->Close();
             GetDVBRecorder()->SetRingBuffer(NULL);
         }
+
+        retune_timer->restart();
+        retune_timer->addMSecs(1);
+        retune_requests = 0;
 #endif // USING_DVB
         TuningFrequency(lastTuningRequest);
     }
-
+   
     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() && (retune_requests < 30))
+        {
+            RetuneChannel();
+            retune_requests++;
+        }
+#endif // USING_DVB
+
+    if (handle_done)
+        return;
+
     if (HasFlags(kFlagNeedToStartRecorder))
     {
         if (recorder)
@@ -3244,9 +3273,35 @@ void TVRec::HandleTuning(void)
         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
     }
 }
 
@@ -3321,6 +3376,18 @@ void TVRec::TuningShutdowns(const Tuning
     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
+    return false;
+}
+
 /** \fn TVRec::TuningFrequency(const TuningRequest&)
  *  \brief Performs initial tuning required for any tuning event.
  *
@@ -3880,6 +3947,8 @@ QString TVRec::FlagToString(uint f)
             msg += "WaitingForSignal,";
         if (kFlagWaitingForSIParser & f)
             msg += "WaitingForSIParser,";
+        if (kFlagWaitingForPayload & f)
+            msg += "kFlagWaitingForPayload,";
         if (kFlagNeedToStartRecorder & f)
             msg += "NeedToStartRecorder,";
         if (kFlagKillRingBuffer & f)
diff -rup libmythtv.no_hack/tv_rec.h libmythtv/tv_rec.h
--- libmythtv.no_hack/tv_rec.h  2006-02-02 18:04:07.000000000 -0500
+++ libmythtv/tv_rec.h  2006-02-02 18:12:04.000000000 -0500
@@ -13,6 +13,7 @@
 #include "mythdeque.h"
 #include "programinfo.h"
 #include "tv.h"
+#include "util.h"
 
 class QSocket;
 class NuppelVideoRecorder;
@@ -37,6 +38,30 @@ class Channel;
 
 class PMTObject;
 
+class TuningTimer
+{
+  public:
+    TuningTimer() {}
+
+    void setTimeout(long t) { _timeout = t; }
+    long timeout(void) { return _timeout; }
+    void start() { t_timer.start(); }
+    int restart() { int ret = elapsed();
+                    t_timer.restart();
+                    return ret;
+                  }
+    int elapsed() { int ret = t_timer.elapsed();
+                    if (ret > _timeout) { ret = 0;  t_timer.restart(); }
+                    return ret;
+                  }
+
+    void addMSecs(int ms) { t_timer.addMSecs(ms); }
+
+  private:
+    QTime t_timer;
+    long _timeout;
+};
+
 /// Used to request ProgramInfo for channel browsing.
 typedef enum
 {
@@ -276,6 +301,8 @@ class TVRec : public QObject
     void TuningNewRecorder(void);
     void TuningRestartRecorder(void);
 
+    bool RetuneChannel(void);
+
     void HandleStateChange(void);
     void ChangeState(TVState nextState);
     bool StateIsRecording(TVState state);
@@ -362,6 +389,10 @@ class TVRec : public QObject
     QString      rbFilePrefix;
     QString      rbFileExt;
 
+    // Retune stuff
+    TuningTimer *retune_timer;
+    int retune_requests;
+
   public:
     static const uint kEITScanStartTimeout;
     static const uint kSignalMonitoringRate;
@@ -394,6 +425,7 @@ class TVRec : public QObject
 
     static const uint kFlagNoRec                = 0x0000F000;
     static const uint kFlagKillRingBuffer       = 0x00010000;
+    static const uint kFlagWaitingForPayload    = 0x00020000;
 
     // Waiting stuff
     static const uint kFlagWaitingForRecPause   = 0x00100000;