Index: libs/libmyth/mythdialogs.cpp
===================================================================
--- libs/libmyth/mythdialogs.cpp	(revision 14595)
+++ libs/libmyth/mythdialogs.cpp	(working copy)
@@ -624,7 +624,8 @@
     return popup.ExecPopup();
 }
 
-MythProgressDialog::MythProgressDialog(const QString &message, int totalSteps)
+MythProgressDialog::MythProgressDialog(const QString &message, int totalSteps, 
+                                         bool cancelButton, const QObject *target, const char *slot)
                   : MythDialog(gContext->GetMainWindow(), "progress", false)
 {
     int screenwidth, screenheight;
@@ -652,14 +653,24 @@
     vbox->setFrameShadow(QFrame::Raised);
     vbox->setMargin((int)(15 * wmult));
 
-    QLabel *msglabel = new QLabel(vbox);
+    msglabel = new QLabel(vbox);
     msglabel->setBackgroundOrigin(ParentOrigin);
     msglabel->setText(message);
+    vbox->setStretchFactor(msglabel, 5);
 
-    progress = new QProgressBar(totalSteps, vbox);
+    QHBox *hbox = new QHBox(vbox);
+    hbox->setSpacing(5);
+    
+    progress = new QProgressBar(totalSteps, hbox);
     progress->setBackgroundOrigin(ParentOrigin);
-    progress->setProgress(0);
 
+    if (cancelButton && slot && target)
+    {
+        MythPushButton *button = new MythPushButton("Cancel", hbox, 0);
+        button->setFocus();
+        connect(button, SIGNAL(pressed()), target, slot);
+    }
+
     setTotalSteps(totalSteps);
 
     if (class LCD * lcddev = LCD::Get())
@@ -707,6 +718,11 @@
     }
 }
 
+void MythProgressDialog::setLabel(QString newlabel)
+{
+    msglabel->setText(newlabel);
+}
+
 void MythProgressDialog::keyPressEvent(QKeyEvent *e)
 {
     bool handled = false;
@@ -728,16 +744,27 @@
 void MythProgressDialog::setTotalSteps(int totalSteps)
 {
     m_totalSteps = totalSteps;
+    progress->setTotalSteps(totalSteps);
     steps = totalSteps / 1000;
     if (steps == 0)
         steps = 1;
 }
 
-MythBusyDialog::MythBusyDialog(const QString &title)
-    : MythProgressDialog(title, 0), timer(NULL)
+MythProgressDialog::~MythProgressDialog()
 {
+    if (LCD *lcddev = LCD::Get())
+        lcddev->switchToTime();
 }
 
+
+MythBusyDialog::MythBusyDialog(const QString &title,
+                               bool cancelButton, const QObject *target, const char *slot)
+    : MythProgressDialog(title, 0,
+                         cancelButton, target, slot),
+                         timer(NULL)
+{
+}
+
 MythBusyDialog::~MythBusyDialog()
 {
     if (timer)
Index: libs/libmyth/settings.h
===================================================================
--- libs/libmyth/settings.h	(revision 14595)
+++ libs/libmyth/settings.h	(working copy)
@@ -409,6 +409,8 @@
     void setSelectionMode(MythListBox::SelectionMode mode);
     void setCurrentItem(int i) { if (widget) widget->setCurrentItem(i); }
     void setCurrentItem(const QString& str)  { if (widget) widget->setCurrentItem(str); }
+    int currentItem() { if (widget) return widget->currentItem();
+                         else return -1; }
 
     virtual void setEnabled(bool b);
 
@@ -668,6 +670,14 @@
                        allow_single_step, special_value_text) { }
 };
 
+class MPUBLIC TransListBoxSetting :
+    public ListBoxSetting, public TransientStorage
+{
+  public:
+    TransListBoxSetting() : ListBoxSetting(this), TransientStorage() { }
+};
+
+
 ///////////////////////////////////////////////////////////////////////////////
 
 class MPUBLIC HostSlider : public SliderSetting, public HostDBStorage
Index: libs/libmyth/mythdialogs.h
===================================================================
--- libs/libmyth/mythdialogs.h	(revision 14595)
+++ libs/libmyth/mythdialogs.h	(working copy)
@@ -189,19 +189,33 @@
 */
 class MPUBLIC MythProgressDialog: public MythDialog
 {
+    Q_OBJECT    
   public:
     /** Create a progress bar dialog.
         
         \param message the title string to appear in the progress dialog.
         \param totalSteps the total number of steps
+        \param cancelButton display cancel button
+        \param target target for pressed signal
+        \param slot slot for pressed signal
      */
-    MythProgressDialog(const QString& message, int totalSteps);
+    MythProgressDialog(const QString& message, int totalSteps = 0, 
+                       bool cancelButton = false, 
+                       const QObject * target = NULL, 
+                       const char * slot = NULL);
+    
+    ~MythProgressDialog();
 
+
     /* \brief Close the dialog.
 
         This will close the dialog and return the LCD to the Time screen 
     */
     void Close(void);
+
+    void keyPressEvent(QKeyEvent *);
+    
+  public slots:
     /* \brief Update the progress bar.  
 
        This will move the progress bar the percentage-completed as
@@ -211,11 +225,14 @@
        The LCD is updated as well.
     */
     void setProgress(int curprogress);
+    void setLabel(QString newlabel);
+    
+  signals:
+    void pressed();
 
-    void keyPressEvent(QKeyEvent *);
-
   protected:
     QProgressBar *progress;
+    QLabel *msglabel;
 
   private:
     void setTotalSteps(int totalSteps);
@@ -240,8 +257,14 @@
         the widget to indicate progress every 100msec;
 
         \param title the title to appear in the progress bar dialog
+        \cancelButton display cancel button
+        \param target target for pressed signal
+        \param slot slot for pressed signal
     */
-    MythBusyDialog(const QString &title);
+    MythBusyDialog(const QString &title,
+                   bool cancelButton = false, 
+                   const QObject * target = NULL, 
+                   const char * slot = NULL);
 
     ~MythBusyDialog();
 
Index: libs/libmyth/mythwidgets.h
===================================================================
--- libs/libmyth/mythwidgets.h	(revision 14595)
+++ libs/libmyth/mythwidgets.h	(working copy)
@@ -375,6 +375,8 @@
     virtual void keyPressEvent(QKeyEvent* e);
 
     void setHelpText(QString help) { helptext = help; }
+    
+    int currentItem() { return QListBox::currentItem(); }
 
   protected:
     void focusInEvent(QFocusEvent *e);
