Index: libs/libmythtv/diseqc.h
===================================================================
--- libs/libmythtv/diseqc.h	(revision 11349)
+++ libs/libmythtv/diseqc.h	(working copy)
@@ -369,12 +369,14 @@
     void SetLOFSwitch(uint lof_switch)    { m_lof_switch = lof_switch; }
     void SetLOFHigh(  uint lof_hi)        { m_lof_hi     = lof_hi;     }
     void SetLOFLow(   uint lof_lo)        { m_lof_lo     = lof_lo;     }
+    void SetPolarityInverted(bool inv)    { m_pol_inv    = inv;        }
 
     // Gets
     dvbdev_lnb_t GetType(void)      const { return m_type;             }
     uint         GetLOFSwitch(void) const { return m_lof_switch;       }
     uint         GetLOFHigh(void)   const { return m_lof_hi;           }
     uint         GetLOFLow(void)    const { return m_lof_lo;           }
+    bool         IsPolarityInverted(void) const { return m_pol_inv;    }
     bool         IsHighBand(const DVBTuning&) const;
     bool         IsHorizontal(const DVBTuning&) const;
     uint32_t     GetIntermediateFrequency(const DiSEqCDevSettings&,
@@ -393,6 +395,10 @@
     uint         m_lof_switch;
     uint         m_lof_hi;
     uint         m_lof_lo;
+    /// If a signal is circularly polarized the polarity will flip
+    /// on each reflection, so antenna systems with an even number
+    /// of reflectors will need to set this value.
+    bool         m_pol_inv;
 
     static const TypeTable LNBTypeTable[5];
 };
Index: libs/libmythtv/dbcheck.cpp
===================================================================
--- libs/libmythtv/dbcheck.cpp	(revision 11349)
+++ libs/libmythtv/dbcheck.cpp	(working copy)
@@ -10,7 +10,7 @@
 #include "mythdbcon.h"
 
 /// This is the DB schema version expected by the running MythTV instance.
-const QString currentDatabaseVersion = "1160";
+const QString currentDatabaseVersion = "1161";
 
 static bool UpdateDBVersionNumber(const QString &newnumber);
 static bool performActualUpdate(const QString updates[], QString version,
@@ -2546,6 +2546,17 @@
             return false;
     }
 
+    if (dbver == "1160")
+    {
+        const QString updates[] = {
+"ALTER TABLE diseqc_tree ADD COLUMN lnb_pol_inv TINYINT NOT NULL DEFAULT '0';",
+""
+};
+
+        if (!performActualUpdate(updates, "1161", dbver))
+            return false;
+    }
+
 //"ALTER TABLE capturecard DROP COLUMN dvb_recordts;" in 0.21
 //"ALTER TABLE capturecard DROP COLUMN dvb_hw_decoder;" in 0.21
 //"ALTER TABLE cardinput DROP COLUMN preference;" in 0.22
Index: libs/libmythtv/diseqcsettings.cpp
===================================================================
--- libs/libmythtv/diseqcsettings.cpp	(revision 11349)
+++ libs/libmythtv/diseqcsettings.cpp	(working copy)
@@ -489,25 +489,39 @@
     uint                       lof_sw;
     uint                       lof_lo;
     uint                       lof_hi;
+    bool                       pol_inv;
 };
 
 static lnb_preset lnb_presets[] =
 {
-    /* description, type, LOF switch, LOF low, LOF high */
+    /* description, type, LOF switch, LOF low, LOF high, inverted polarity */
     { DeviceTree::tr("Single (Europe)"),
-      DiSEqCDevLNB::kTypeVoltageControl,               0,  9750000,        0 },
+      DiSEqCDevLNB::kTypeVoltageControl,
+             0,  9750000,        0, false },
     { DeviceTree::tr("Universal (Europe)"),
-      DiSEqCDevLNB::kTypeVoltageAndToneControl, 11700000,  9750000, 10600000 },
+      DiSEqCDevLNB::kTypeVoltageAndToneControl,
+      11700000,  9750000, 10600000, false },
     { DeviceTree::tr("Circular (N. America)"),
-      DiSEqCDevLNB::kTypeVoltageControl,               0, 11250000,        0 },
+      DiSEqCDevLNB::kTypeVoltageControl,
+             0, 11250000,        0, false },
+    { DeviceTree::tr("Circular (Inv) (N. America)"),
+      DiSEqCDevLNB::kTypeVoltageControl,
+             0, 11250000,        0, true  },
     { DeviceTree::tr("Linear (N. America)"),
-      DiSEqCDevLNB::kTypeVoltageControl,               0, 10750000,        0 },
+      DiSEqCDevLNB::kTypeVoltageControl,
+             0, 10750000,        0, false },
     { DeviceTree::tr("C Band"),
-      DiSEqCDevLNB::kTypeVoltageControl,               0,  5150000,        0 },
+      DiSEqCDevLNB::kTypeVoltageControl,
+             0,  5150000,        0, false },
     { DeviceTree::tr("DishPro Bandstacked"),
-      DiSEqCDevLNB::kTypeBandstacked,                  0, 11250000, 14350000 },
+      DiSEqCDevLNB::kTypeBandstacked,
+             0, 11250000, 14350000, false },
+    { DeviceTree::tr("DishPro Bandstacked (Inv))"),
+      DiSEqCDevLNB::kTypeBandstacked,
+             0, 11250000, 14350000, true  },
     { QString::null,
-      DiSEqCDevLNB::kTypeVoltageControl,               0,        0,        0 },
+      DiSEqCDevLNB::kTypeVoltageControl,
+             0,        0,        0, false },
 };
 
 uint FindPreset(const DiSEqCDevLNB &lnb)
@@ -518,7 +532,8 @@
         if (lnb_presets[i].type   == lnb.GetType()      &&
             lnb_presets[i].lof_sw == lnb.GetLOFSwitch() &&
             lnb_presets[i].lof_lo == lnb.GetLOFLow()    &&
-            lnb_presets[i].lof_hi == lnb.GetLOFHigh())
+            lnb_presets[i].lof_hi == lnb.GetLOFHigh()   &&
+            lnb_presets[i].pol_inv== lnb.IsPolarityInverted())
         {
             break;
         }
@@ -677,6 +692,34 @@
     DiSEqCDevLNB &m_lnb;
 };
 
+class LNBPolarityInvertedSetting : public CheckBoxSetting
+{
+  public:
+    LNBPolarityInvertedSetting(DiSEqCDevLNB &lnb) : m_lnb(lnb)
+    {
+        setLabel(DeviceTree::tr("LNB Reversed"));
+        QString help = DeviceTree::tr(
+            "This defines whether the signal reaching the LNB "
+            "is reversed from normal polarization. This happens "
+            "to circular signals bouncing twice on a toroidal "
+            "dish.");
+        setHelpText(help);
+    }
+
+    virtual void load(void)
+    {
+        setValue(m_lnb.IsPolarityInverted());
+    }
+
+    virtual void save(void)
+    {
+        m_lnb.SetPolarityInverted(getValue());
+    }
+
+  private:
+    DiSEqCDevLNB &m_lnb;
+};
+
 //////////////////////////////////////// LNBConfig
 
 LNBConfig::LNBConfig(DiSEqCDevLNB &lnb)
@@ -696,6 +739,8 @@
     group->addChild(m_lof_lo);
     m_lof_hi = new LNBLOFHighSetting(lnb);
     group->addChild(m_lof_hi);
+    m_pol_inv = new LNBPolarityInvertedSetting(lnb);
+    group->addChild(m_pol_inv);
     connect(m_type, SIGNAL(valueChanged(const QString&)),
             this,   SLOT(  UpdateType(  void)));
     connect(preset, SIGNAL(valueChanged(const QString&)),
@@ -722,10 +767,12 @@
         m_lof_switch->setValue(QString::number(preset.lof_sw / 1000));
         m_lof_lo->setValue(QString::number(preset.lof_lo / 1000));
         m_lof_hi->setValue(QString::number(preset.lof_hi / 1000));
+        m_pol_inv->setValue(preset.pol_inv);
         m_type->setEnabled(false);
         m_lof_switch->setEnabled(false);
         m_lof_hi->setEnabled(false);
         m_lof_lo->setEnabled(false);
+        m_pol_inv->setEnabled(false);
     }
 }
 
@@ -741,16 +788,19 @@
             m_lof_switch->setEnabled(false);
             m_lof_hi->setEnabled(false);
             m_lof_lo->setEnabled(true);
+            m_pol_inv->setEnabled(true);
             break;
         case DiSEqCDevLNB::kTypeVoltageAndToneControl:
             m_lof_switch->setEnabled(true);
             m_lof_hi->setEnabled(true);
             m_lof_lo->setEnabled(true);
+            m_pol_inv->setEnabled(true);
             break;
         case DiSEqCDevLNB::kTypeBandstacked:
             m_lof_switch->setEnabled(false);
             m_lof_hi->setEnabled(true);
             m_lof_lo->setEnabled(true);
+            m_pol_inv->setEnabled(true);
             break;
     }
 }
Index: libs/libmythtv/diseqcsettings.h
===================================================================
--- libs/libmythtv/diseqcsettings.h	(revision 11349)
+++ libs/libmythtv/diseqcsettings.h	(working copy)
@@ -75,6 +75,7 @@
 class LNBLOFSwitchSetting;
 class LNBLOFLowSetting;
 class LNBLOFHighSetting;
+class LNBPolarityInvertedSetting;
 
 class LNBConfig : public ConfigurationWizard
 {
@@ -92,6 +93,7 @@
     LNBLOFSwitchSetting *m_lof_switch;
     LNBLOFLowSetting    *m_lof_lo;
     LNBLOFHighSetting   *m_lof_hi;
+    LNBPolarityInvertedSetting *m_pol_inv;
 };
 
 class DeviceTree : public ListBoxSetting
Index: libs/libmythtv/diseqc.cpp
===================================================================
--- libs/libmythtv/diseqc.cpp	(revision 11352)
+++ libs/libmythtv/diseqc.cpp	(working copy)
@@ -1907,7 +1907,8 @@
 DiSEqCDevLNB::DiSEqCDevLNB(DiSEqCDevTree &tree, uint devid)
     : DiSEqCDevDevice(tree, devid),
       m_type(kTypeVoltageAndToneControl), m_lof_switch(11700000),
-      m_lof_hi(10600000),       m_lof_lo(9750000)
+      m_lof_hi(10600000),       m_lof_lo(9750000),
+      m_pol_inv(false)
 {
     Reset();
 }
@@ -1942,7 +1943,7 @@
     query.prepare(
         "SELECT subtype,         lnb_lof_switch, "
         "       lnb_lof_hi,      lnb_lof_lo, "
-        "       cmd_repeat "
+        "       lnb_pol_inv,     cmd_repeat "
         "FROM diseqc_tree "
         "WHERE diseqcid = :DEVID");
     query.bindValue(":DEVID", GetDeviceID());
@@ -1959,6 +1960,7 @@
         m_lof_hi     = query.value(2).toInt();
         m_lof_lo     = query.value(3).toInt();
         m_repeat     = query.value(4).toUInt();
+        m_pol_inv    = query.value(5).toUInt();
     }
 
     return true;
@@ -1982,6 +1984,7 @@
             "    lnb_lof_switch  = :LOFSW,   "
             "    lnb_lof_lo      = :LOFLO,   "
             "    lnb_lof_hi      = :LOFHI,   "
+            "    lnb_pol_inv     = :POLINV "
             "    cmd_repeat      = :REPEAT   "
             "WHERE diseqcid = :DEVID");
     }
@@ -1991,11 +1994,13 @@
             "INSERT INTO diseqc_tree"
             " ( parentid,      ordinal,         type, "
             "   description,   subtype,         lnb_lof_switch, "
-            "   lnb_lof_lo,    lnb_lof_hi,      cmd_repeat ) "
+            "   lnb_lof_lo,    lnb_lof_hi,      lnb_pol_inv, "
+            "   cmd_repeat ) "
             "VALUES "
             " (:PARENT,       :ORDINAL,         'lnb', "
             "  :DESC,         :TYPE,            :LOFSW, "
-            "  :LOFLO,        :LOFHI,           :REPEAT ) ");
+            "  :LOFLO,        :LOFHI,           :POLINV, "
+            "  :REPEAT ) ");
     }
 
     if (m_parent)
@@ -2007,6 +2012,7 @@
     query.bindValue(":LOFSW",   m_lof_switch);
     query.bindValue(":LOFLO",   m_lof_lo);
     query.bindValue(":LOFHI",   m_lof_hi);
+    query.bindValue(":POLINV",  m_pol_inv);
     query.bindValue(":REPEAT",  m_repeat);
     query.bindValue(":DEVID",   GetDeviceID());
 
@@ -2058,7 +2064,7 @@
     (void) tuning;
 #ifdef USING_DVB
     char pol = tuning.PolarityChar();
-    return (pol == 'h' || pol == 'l');
+    return (pol == 'h' || pol == 'l') ^ IsPolarityInverted();
 #else
     return false;
 #endif // !USING_DVB
