diff --git a/mythtv/libs/libmythui/mythuibuttonlist.cpp b/mythtv/libs/libmythui/mythuibuttonlist.cpp
index 3601fab..d61ee24 100644
--- a/mythtv/libs/libmythui/mythuibuttonlist.cpp
+++ b/mythtv/libs/libmythui/mythuibuttonlist.cpp
@@ -1498,6 +1498,7 @@ void MythUIButtonList::SetValueByData(QVariant data)
 
 void MythUIButtonList::SetItemCurrent(MythUIButtonListItem *item)
 {
+    if (!item->isEnabled()) return;
     int newIndex = m_itemList.indexOf(item);
     SetItemCurrent(newIndex);
 }
@@ -1510,6 +1511,8 @@ void MythUIButtonList::SetItemCurrent(int current, int topPosition)
     if (current == -1 || current >= m_itemList.size())
         return;
 
+    if (!m_itemList.at(current)->isEnabled()) return;
+
     if (current == m_selPosition &&
         (topPosition == -1 || topPosition == m_topPosition))
         return;
@@ -1886,6 +1889,8 @@ bool MythUIButtonList::MoveUp(MovementUnit unit, uint amount)
             else if (m_wrapStyle == WrapCaptive)
                 return true;
 
+            findEnabledUp(unit);
+
             break;
 
         case MoveColumn:
@@ -1900,6 +1905,7 @@ bool MythUIButtonList::MoveUp(MovementUnit unit, uint amount)
                 m_selPosition = pos + (m_columns - 1);
             else if (m_wrapStyle == WrapCaptive)
                 return true;
+            findEnabledUp(unit);
 
             break;
 
@@ -1928,6 +1934,7 @@ bool MythUIButtonList::MoveUp(MovementUnit unit, uint amount)
             }
             else if (m_wrapStyle == WrapCaptive)
                 return true;
+            findEnabledUp(unit);
 
             break;
 
@@ -1936,15 +1943,18 @@ bool MythUIButtonList::MoveUp(MovementUnit unit, uint amount)
                 m_selPosition = qMax(0, m_selPosition - (int)m_itemsVisible);
             else
                 m_selPosition = PageUp();
+            findEnabledUp(unit);
 
             break;
 
         case MoveMid:
             m_selPosition = (int)(m_itemList.size() / 2);
+            findEnabledDown(unit);
             break;
 
         case MoveMax:
             m_selPosition = 0;
+            findEnabledDown(unit);
             break;
 
         case MoveByAmount:
@@ -1955,6 +1965,7 @@ bool MythUIButtonList::MoveUp(MovementUnit unit, uint amount)
                 else if (m_wrapStyle > WrapNone)
                     m_selPosition = m_itemList.size() - 1;
             }
+            findEnabledUp(unit);
 
             break;
     }
@@ -1972,6 +1983,88 @@ bool MythUIButtonList::MoveUp(MovementUnit unit, uint amount)
     return true;
 }
 
+
+/**
+ * If the current item is not enabled, find the next enabled one
+ */
+void MythUIButtonList::findEnabledDown(MovementUnit unit)
+{
+    if (m_selPosition<0 || m_selPosition >= m_itemList.size()
+            || m_itemList.at(m_selPosition)->isEnabled()) 
+        return;
+
+    int step = (unit=MoveRow)?m_columns:1;
+    if (unit == MoveRow && m_wrapStyle == WrapFlowing)unit=MoveItem;
+    if (unit == MoveColumn)
+    {
+        while ((m_selPosition + 1) % m_columns > 0 && !m_itemList.at(m_selPosition)->isEnabled())
+            ++m_selPosition;
+
+        if (m_itemList.at(m_selPosition)->isEnabled()) return;
+        if (m_wrapStyle > WrapNone)
+        {
+            m_selPosition = m_selPosition - (m_columns - 1);
+            while ((m_selPosition + 1) % m_columns > 0 && !m_itemList.at(m_selPosition)->isEnabled())
+                ++m_selPosition;
+        }
+    }
+    else 
+    {
+
+        while (!m_itemList.at(m_selPosition)->isEnabled()
+                &&  (m_selPosition < m_itemList.size() - step))
+            m_selPosition+=step;
+
+        if (!m_itemList.at(m_selPosition)->isEnabled() && m_wrapStyle > WrapNone)
+        {
+            m_selPosition=(m_selPosition+step)%m_itemList.size();
+
+            while (!m_itemList.at(m_selPosition)->isEnabled()
+                                &&  (m_selPosition < m_itemList.size() - step))
+                m_selPosition+=step;
+        }
+    }
+}
+
+void MythUIButtonList::findEnabledUp(MovementUnit unit)
+{
+    if (m_selPosition<0 || m_selPosition >= m_itemList.size()
+            || m_itemList.at(m_selPosition)->isEnabled()) 
+        return;
+
+    int step = (unit=MoveRow)?m_columns:1;
+    if (unit == MoveRow && m_wrapStyle == WrapFlowing)unit=MoveItem;
+    if (unit == MoveColumn)
+    {
+        while ((m_selPosition + 1) % m_columns > 0 && !m_itemList.at(m_selPosition)->isEnabled())
+            ++m_selPosition;
+
+        if (m_itemList.at(m_selPosition)->isEnabled()) return;
+        if (m_wrapStyle > WrapNone)
+        {
+            m_selPosition = m_selPosition - (m_columns - 1);
+            while ((m_selPosition + 1) % m_columns > 0 && !m_itemList.at(m_selPosition)->isEnabled())
+                ++m_selPosition;
+        }
+    }
+    else
+    {
+        while (!m_itemList.at(m_selPosition)->isEnabled()
+                &&  (m_selPosition < m_itemList.size() - step))
+            m_selPosition-=step;
+
+        if (!m_itemList.at(m_selPosition)->isEnabled() && m_wrapStyle > WrapNone)
+        {
+            m_selPosition=(m_selPosition+step)%m_itemList.size();
+
+            while (!m_itemList.at(m_selPosition)->isEnabled()
+                                &&  (m_selPosition < m_itemList.size() - step))
+                m_selPosition+=step;
+        }
+    }
+}
+
+
 bool MythUIButtonList::MoveDown(MovementUnit unit, uint amount)
 {
     int pos = m_selPosition;
@@ -1988,6 +2081,7 @@ bool MythUIButtonList::MoveDown(MovementUnit unit, uint amount)
                 m_selPosition = 0;
             else if (m_wrapStyle == WrapCaptive)
                 return true;
+            findEnabledDown(unit);
 
             break;
 
@@ -2003,6 +2097,7 @@ bool MythUIButtonList::MoveDown(MovementUnit unit, uint amount)
                 m_selPosition = pos - (m_columns - 1);
             else if (m_wrapStyle == WrapCaptive)
                 return true;
+            findEnabledDown(unit);
 
             break;
 
@@ -2023,7 +2118,7 @@ bool MythUIButtonList::MoveDown(MovementUnit unit, uint amount)
                 m_selPosition = (pos % m_columns);
             else if (m_wrapStyle == WrapCaptive)
                 return true;
-
+            findEnabledDown(unit);
             break;
 
         case MovePage:
@@ -2032,11 +2127,12 @@ bool MythUIButtonList::MoveDown(MovementUnit unit, uint amount)
                                      m_selPosition + (int)m_itemsVisible);
             else
                 m_selPosition = PageDown();
-
+            findEnabledDown(unit);
             break;
 
         case MoveMax:
             m_selPosition = m_itemCount - 1;
+            findEnabledUp(unit);
             break;
 
         case MoveByAmount:
@@ -2047,6 +2143,7 @@ bool MythUIButtonList::MoveDown(MovementUnit unit, uint amount)
                 else if (m_wrapStyle > WrapNone)
                     m_selPosition = 0;
             }
+            findEnabledDown(unit);
 
             break;
     }
@@ -2385,7 +2482,7 @@ bool MythUIButtonList::keyPressEvent(QKeyEvent *e)
         {
             MythUIButtonListItem *item = GetItemCurrent();
 
-            if (item)
+            if (item && item->isEnabled())
                 emit itemClicked(item);
         }
         else if (action == "SEARCH")
@@ -2886,6 +2983,8 @@ MythUIButtonListItem::MythUIButtonListItem(MythUIButtonList *lbtype,
     m_checkable = checkable;
     m_state     = state;
     m_showArrow = showArrow;
+    m_enabled   = true;
+
     m_data      = 0;
 
     if (state >= NotChecked)
@@ -2911,6 +3010,7 @@ MythUIButtonListItem::MythUIButtonListItem(MythUIButtonList *lbtype,
     m_checkable = false;
     m_state     = CantCheck;
     m_showArrow = false;
+    m_enabled   = true;
 
     if (m_parent)
         m_parent->InsertItem(this, listPosition);
@@ -3225,6 +3325,15 @@ void MythUIButtonListItem::setDrawArrow(bool flag)
     m_showArrow = flag;
 }
 
+bool MythUIButtonListItem::isEnabled() const
+{
+    return m_enabled;
+}
+void MythUIButtonListItem::setEnabled(bool flag)
+{
+    m_enabled = flag;
+}
+
 void MythUIButtonListItem::SetData(QVariant data)
 {
     m_data = data;
@@ -3250,7 +3359,11 @@ void MythUIButtonListItem::SetToRealButton(MythUIStateType *button, bool selecte
 
     QString state;
 
-    if (selected)
+    if (!m_enabled)
+    {
+        state = m_parent->m_active ? "disabledactive" : "disabledinactive";
+    }
+    else if (selected)
     {
         button->MoveToTop();
         state = m_parent->m_active ? "selectedactive" : "selectedinactive";
diff --git a/mythtv/libs/libmythui/mythuibuttonlist.h b/mythtv/libs/libmythui/mythuibuttonlist.h
index 81115ee..bf6e850 100644
--- a/mythtv/libs/libmythui/mythuibuttonlist.h
+++ b/mythtv/libs/libmythui/mythuibuttonlist.h
@@ -72,6 +72,9 @@ class MUI_PUBLIC MythUIButtonListItem
     bool checkable() const;
     void setCheckable(bool flag);
 
+    bool isEnabled() const;
+    void setEnabled(bool flag);
+
     CheckState state() const;
     void setChecked(CheckState state);
 
@@ -94,6 +97,7 @@ class MUI_PUBLIC MythUIButtonListItem
     CheckState      m_state;
     QVariant        m_data;
     bool            m_showArrow;
+    bool            m_enabled;
 
     QMap<QString, TextProperties> m_strings;
     QMap<QString, MythImage*> m_images;
@@ -234,6 +238,9 @@ class MUI_PUBLIC MythUIButtonList : public MythUIType
 
     bool DoFind(bool doMove, bool searchForward);
 
+    void findEnabledUp(MovementUnit unit);
+    void findEnabledDown(MovementUnit unit);
+
     /* methods for subclasses to override */
     virtual void CalculateVisibleItems(void);
     virtual QPoint GetButtonPosition(int column, int row) const;
