Index: mythtv/libs/libmythtv/dvbchannel.h
===================================================================
--- mythtv/libs/libmythtv/dvbchannel.h  (revision 9481)
+++ mythtv/libs/libmythtv/dvbchannel.h  (working copy)
@@ -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; };
@@ -100,6 +101,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; ///< Last tuning options sent to runing hardware
 
     volatile int      fd_frontend; ///< File descriptor for tuning hardware
     int               cardnum;     ///< DVB Card number
@@ -111,6 +113,7 @@
     bool              first_tune;  ///< Used to force hardware reset
 
     int               nextcapchannel; ///< Signal an input change
+    int               frequency_incr; ///< Incrementer/decrementer for tuning
 };
 
 #endif
Index: mythtv/libs/libmythtv/dvbchannel.cpp
===================================================================
--- mythtv/libs/libmythtv/dvbchannel.cpp        (revision 9481)
+++ mythtv/libs/libmythtv/dvbchannel.cpp        (working copy)
@@ -86,6 +86,7 @@
     bzero(&info, sizeof(info));
     has_crc_bug = CardUtil::HasDVBCRCBug(aCardNum);
     sigmon_delay = CardUtil::GetMinSignalMonitoringDelay(aCardNum);
+    frequency_incr = -10;
 }
 
 DVBChannel::~DVBChannel()
@@ -603,6 +604,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!");
@@ -630,6 +633,9 @@
         // 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: "
@@ -652,6 +658,15 @@
     return true;
 }
 
+/** \fn DVBChannel::Tune_again(void)
+ *  \brief Calls DVBChannel::Tune() with the last known parameters
+ *  \return DVBChannel::Tune()
+ */
+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
Index: mythtv/libs/libmythtv/tv_rec.cpp
===================================================================
--- mythtv/libs/libmythtv/tv_rec.cpp    (revision 9481)
+++ mythtv/libs/libmythtv/tv_rec.cpp    (working copy)
@@ -136,6 +136,11 @@
       // RingBuffer info
       ringBuffer(NULL), rbFilePrefix(""), rbFileExt("mpg")
 {
+      // Retune stuff
+      retune_timer = new TuningTimer();
+      retune_timer->setTimeout(10000);
+      retune_timer->start();
+      retune_requests = 0;
 }
 
 bool TVRec::CreateChannel(const QString &startchannel)
@@ -3262,6 +3267,8 @@
  */
 void TVRec::HandleTuning(void)
 {
+    bool handle_done = false;
+
     if (tuningRequests.size())
     {
         const TuningRequest *request = &tuningRequests.front();
@@ -3273,7 +3280,12 @@
                               kFlagEITScan|kFlagAntennaAdjust))
         {
             if (!recorder)
+            {
                 TuningFrequency(*request);
+                retune_timer->restart();
+                retune_timer->addMSecs(1);
+                retune_requests = 0;
+            }
             else
                 SetFlags(kFlagWaitingForRecPause);
         }
@@ -3302,15 +3314,28 @@
     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)
@@ -3452,6 +3477,19 @@
     ClearFlags(kFlagPendingActions);
 }
 
+/** \fn TVRec::RetuneChannel(void)
+ *  \brief Retunes a DVB channel
+ *  \return DVBChannel::Tune_again() or false if ifndef USING_DVB
+ */
+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.
  *
Index: mythtv/libs/libmythtv/tv_rec.h
===================================================================
--- mythtv/libs/libmythtv/tv_rec.h      (revision 9481)
+++ mythtv/libs/libmythtv/tv_rec.h      (working copy)
@@ -13,6 +13,7 @@
 #include "mythdeque.h"
 #include "programinfo.h"
 #include "tv.h"
+#include "util.h"
 
 #include "mythconfig.h"
 
@@ -51,6 +52,30 @@
     BROWSE_FAVORITE ///< Fetch information on the next favorite channel
 } BrowseDirections;
 
+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;
+};
+
 class GeneralDBOptions
 {
   public:
@@ -281,6 +306,7 @@
     bool TuningPMTCheck(void);
     void TuningNewRecorder(void);
     void TuningRestartRecorder(void);
+    bool RetuneChannel(void);
     uint TuningCheckForHWChange(const TuningRequest&,
                                 QString &channum,
                                 QString &inputname);
@@ -371,6 +397,10 @@
     QString      rbFilePrefix;
     QString      rbFileExt;
 
+    // Retune stuff
+    TuningTimer *retune_timer;
+    int retune_requests;
+
   public:
     static const uint kEITScanStartTimeout;
     static const uint kSignalMonitoringRate;
