Blob Blame History Raw
diff --git a/po/bn_IN.po b/po/bn_IN.po
index ddb046c..1414155 100644
--- a/po/bn_IN.po
+++ b/po/bn_IN.po
@@ -5,7 +5,7 @@ msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2015-09-02 14:20-0400\n"
-"PO-Revision-Date: 2015-09-23 11:55-0400\n"
+"PO-Revision-Date: 2015-09-29 03:28-0400\n"
 "Last-Translator: John Sefler <jsefler@redhat.com>\n"
 "Language-Team: Bengali (India)\n"
 "MIME-Version: 1.0\n"
@@ -2946,7 +2946,7 @@ msgstr ""
 #: ../src/subscription_manager/managercli.py:1952
 #, python-format
 msgid "    Available Repositories in %s"
-msgstr "        %s-এ উপলব্ধ সংগ্রহস্থল"
+msgstr "    %s-এ উপলব্ধ সংগ্রহস্থল"
 
 #: ../src/subscription_manager/managercli.py:1962
 msgid "There were no available repositories matching the specified criteria."
diff --git a/po/ko.po b/po/ko.po
index 1d7c226..6d334ba 100644
--- a/po/ko.po
+++ b/po/ko.po
@@ -1542,7 +1542,7 @@ msgstr "\n"
 #: ../src/subscription_manager/migrate/migrate.py:699
 #, python-format
 msgid "System '%s' successfully registered.\n"
-msgstr "시스템 '%s'이 성공적으로 등록되었습니다. \n"
+msgstr "시스템 '%s'이 성공적으로 등록되었습니다.\n"
 
 # translation auto-copied from project subscription-manager, version 1.11.X, document keys
 #: ../src/subscription_manager/migrate/migrate.py:703
@@ -1610,7 +1610,7 @@ msgstr "서브스크립션 관리자로 등록하는 동안 자동 첨부 (auto-
 msgid ""
 "service level to follow when attaching subscriptions, for no service level "
 "use --servicelevel=\"\""
-msgstr "서브스크립션을 첨부할 때 따라야 할 서비스 레벨, 서비스 레벨이 없는 경우 --servicelevel=\"\" 사용 "
+msgstr "서브스크립션을 첨부할 때 따라야 할 서비스 레벨, 서비스 레벨이 없는 경우 --servicelevel=\"\" 사용"
 
 #: ../src/subscription_manager/migrate/migrate.py:829
 msgid "don't use legacy proxy settings with destination server"
@@ -3398,7 +3398,7 @@ msgstr "매니페스트 zip이 잘못되었습니다."
 #: ../src/rct/manifest_commands.py:84
 #, python-format
 msgid "Unable to find file \"%s\" in manifest."
-msgstr "매니페스트에서 파일 \"%s\"를 찾을 수 없습니다. "
+msgstr "매니페스트에서 파일 \"%s\"를 찾을 수 없습니다."
 
 # translation auto-copied from project subscription-manager, version 1.11.X, document keys
 #: ../src/rct/manifest_commands.py:108
diff --git a/po/ml.po b/po/ml.po
index 2ae55b1..7defbf8 100644
--- a/po/ml.po
+++ b/po/ml.po
@@ -5,7 +5,7 @@ msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2015-09-02 14:20-0400\n"
-"PO-Revision-Date: 2015-09-22 04:48-0400\n"
+"PO-Revision-Date: 2015-09-29 03:19-0400\n"
 "Last-Translator: John Sefler <jsefler@redhat.com>\n"
 "Language-Team: Malayalam\n"
 "MIME-Version: 1.0\n"
@@ -1318,7 +1318,7 @@ msgstr ""
 #: ../src/subscription_manager/cli.py:61
 #, python-format
 msgid "%%prog %s [OPTIONS]"
-msgstr "%%prog %s [ഐച്ഛികങ്ങള്‍] "
+msgstr "%%prog %s [ഐച്ഛികങ്ങള്‍]"
 
 # translation auto-copied from project subscription-manager, version 1.11.X, document keys
 #: ../src/subscription_manager/cli.py:92
@@ -1341,12 +1341,12 @@ msgstr "മറ്റു് ഘടകങ്ങള്‍:"
 # translation auto-copied from project subscription-manager, version 1.11.X, document keys
 #: ../src/subscription_manager/reasons.py:85
 msgid "Product "
-msgstr "പ്രൊഡക്ട്"
+msgstr "പ്രൊഡക്ട് "
 
 # translation auto-copied from project subscription-manager, version 1.11.X, document keys
 #: ../src/subscription_manager/reasons.py:87
 msgid "Subscription "
-msgstr "സബ്സ്ക്രിപ്ഷന്‍"
+msgstr "സബ്സ്ക്രിപ്ഷന്‍ "
 
 # translation auto-copied from project subscription-manager, version 1.11.X, document keys
 #: ../src/subscription_manager/reasons.py:89
@@ -4065,7 +4065,7 @@ msgstr ""
 #: ../src/rhsm_debug/debug_commands.py:80
 #, python-format
 msgid "%%prog %s [OPTIONS] "
-msgstr "%%prog %s [ഐച്ഛികങ്ങള്‍]"
+msgstr "%%prog %s [ഐച്ഛികങ്ങള്‍] "
 
 # translation auto-copied from project subscription-manager, version 1.11.X, document keys
 #: ../src/rhsm_debug/debug_commands.py:85
diff --git a/po/ta_IN.po b/po/ta_IN.po
index de97c17..3a2d9ec 100644
--- a/po/ta_IN.po
+++ b/po/ta_IN.po
@@ -5,7 +5,7 @@ msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2015-09-02 14:20-0400\n"
-"PO-Revision-Date: 2015-09-23 12:35-0400\n"
+"PO-Revision-Date: 2015-09-29 03:15-0400\n"
 "Last-Translator: John Sefler <jsefler@redhat.com>\n"
 "Language-Team: American English <kde-i18n-doc@kde.org>\n"
 "MIME-Version: 1.0\n"
@@ -4640,7 +4640,7 @@ msgstr "எனது சந்தாபடுத்தல்கள் பார
 #: ../src/subscription_manager/gui/data/glade/mysubs.glade.h:2
 #: ../po/tmp_ui_links/mysubs.ui.glade.h:2
 msgid "Remove"
-msgstr "நீக்கவும் "
+msgstr "நீக்கவும்"
 
 # translation auto-copied from project subscription-manager, version 1.11.X, document keys
 #: ../src/subscription_manager/gui/data/glade/networkConfig.glade.h:1
@@ -4706,7 +4706,7 @@ msgstr "அங்கீகார சரிபார்க்கும்பெ
 #: ../src/subscription_manager/gui/data/glade/networkConfig.glade.h:11
 #: ../po/tmp_ui_links/networkConfig.ui.glade.h:17
 msgid "Proxy _Username:"
-msgstr "பதிலாள் பயனர்பெயர் (_U): "
+msgstr "பதிலாள் பயனர்பெயர் (_U):"
 
 # translation auto-copied from project subscription-manager, version 1.11.X, document keys
 #: ../src/subscription_manager/gui/data/glade/networkConfig.glade.h:12
diff --git a/po/zh_TW.po b/po/zh_TW.po
index ad88430..bca3cb0 100644
--- a/po/zh_TW.po
+++ b/po/zh_TW.po
@@ -8,7 +8,7 @@ msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2015-09-02 14:20-0400\n"
-"PO-Revision-Date: 2015-09-23 12:02-0400\n"
+"PO-Revision-Date: 2015-09-29 03:29-0400\n"
 "Last-Translator: John Sefler <jsefler@redhat.com>\n"
 "Language-Team: Chinese (Traditional, Taiwan)\n"
 "MIME-Version: 1.0\n"
@@ -2827,7 +2827,7 @@ msgstr "欲停用的軟體庫(可多次指定)。支援萬用字元(* 與
 #: ../src/subscription_manager/managercli.py:1952
 #, python-format
 msgid "    Available Repositories in %s"
-msgstr "%s 中的可用軟體庫"
+msgstr "    %s 中的可用軟體庫"
 
 #: ../src/subscription_manager/managercli.py:1962
 msgid "There were no available repositories matching the specified criteria."
diff --git a/rel-eng/packages/subscription-manager b/rel-eng/packages/subscription-manager
index 85b895f..ba45018 100644
--- a/rel-eng/packages/subscription-manager
+++ b/rel-eng/packages/subscription-manager
@@ -1 +1 @@
-1.15.9-12 ./
+1.15.9-13 ./
diff --git a/src/initial-setup/com_redhat_subscription_manager/gui/spokes/rhsm_gui.py b/src/initial-setup/com_redhat_subscription_manager/gui/spokes/rhsm_gui.py
index 15c98ff..131bc9b 100644
--- a/src/initial-setup/com_redhat_subscription_manager/gui/spokes/rhsm_gui.py
+++ b/src/initial-setup/com_redhat_subscription_manager/gui/spokes/rhsm_gui.py
@@ -54,7 +54,7 @@ class RHSMSpoke(FirstbootOnlySpokeMixIn, NormalSpoke):
     uiFile = "rhsm_gui.ui"
     helpFile = "SubscriptionManagerSpoke.xml"
     category = SystemCategory
-    icon = "face-cool-symbolic"
+    icon = "subscription-manager"
     title = "Subscription Manager"
 
     def __init__(self, data, storage, payload, instclass):
@@ -80,7 +80,7 @@ class RHSMSpoke(FirstbootOnlySpokeMixIn, NormalSpoke):
         self.register_box = self.builder.get_object("register_box")
         self.button_box = self.builder.get_object('navigation_button_box')
         self.proceed_button = self.builder.get_object('proceed_button')
-        self.cancel_button = self.builder.get_object('cancel_button')
+        self.back_button = self.builder.get_object('cancel_button')
 
         self.register_box.pack_start(self.register_widget.register_widget,
                                      True, True, 0)
@@ -88,7 +88,7 @@ class RHSMSpoke(FirstbootOnlySpokeMixIn, NormalSpoke):
         # Hook up the nav buttons in the gui
         # TODO: add a 'start over'?
         self.proceed_button.connect('clicked', self._on_register_button_clicked)
-        self.cancel_button.connect('clicked', self._on_cancel_button_clicked)
+        self.back_button.connect('clicked', self._on_back_button_clicked)
 
         # initial-setup will likely
         self.register_widget.connect('finished', self._on_finished)
@@ -204,15 +204,16 @@ class RHSMSpoke(FirstbootOnlySpokeMixIn, NormalSpoke):
 
         pass
 
-    def _on_cancel_button_clicked(self, button):
-        """Handler for self.cancel_buttons 'clicked' signal.
+    def _on_back_button_clicked(self, button):
+        """Handler for self.back_buttons 'clicked' signal.
 
         Clear out any user set values and return to the start screen."""
 
+        self.register_widget.emit('back')
         # TODO: clear out settings and restart?
         # TODO: attempt to undo the REST api calls we've made?
-        self.register_widget.set_initial_screen()
-        self.register_widget.clear_screens()
+        #self.register_widget.set_initial_screen()
+        #self.register_widget.clear_screens()
 
     def _on_register_button_clicked(self, button):
         """Handler for self.proceed_buttons 'clicked' signal.
@@ -283,6 +284,7 @@ class RHSMSpoke(FirstbootOnlySpokeMixIn, NormalSpoke):
     def _on_register_screen_ready_change(self, obj, value):
         ready = self.register_widget.current_screen.get_property('ready')
         self.proceed_button.set_sensitive(ready)
+        self.back_button.set_sensitive(ready)
 
     def _on_register_status_change(self, obj, value):
         """Handler for registergui.RegisterInfo's 'register-status' property notifications."""
diff --git a/src/initial-setup/com_redhat_subscription_manager/gui/spokes/rhsm_gui.ui b/src/initial-setup/com_redhat_subscription_manager/gui/spokes/rhsm_gui.ui
index 39c75f1..7541682 100644
--- a/src/initial-setup/com_redhat_subscription_manager/gui/spokes/rhsm_gui.ui
+++ b/src/initial-setup/com_redhat_subscription_manager/gui/spokes/rhsm_gui.ui
@@ -69,11 +69,11 @@
                             <property name="margin_bottom">4</property>
                             <child>
                               <object class="GtkButton" id="cancel_button">
-                                <property name="label" translatable="yes">Cancel</property>
+                                <property name="label">gtk-go-back</property>
                                 <property name="visible">True</property>
                                 <property name="can_focus">True</property>
                                 <property name="receives_default">False</property>
-                                <property name="yalign">0.43999999761581421</property>
+                                <property name="use_stock">True</property>
                               </object>
                               <packing>
                                 <property name="expand">True</property>
diff --git a/src/subscription_manager/gui/data/glade/register_dialog.glade b/src/subscription_manager/gui/data/glade/register_dialog.glade
index fe76ce1..454d463 100644
--- a/src/subscription_manager/gui/data/glade/register_dialog.glade
+++ b/src/subscription_manager/gui/data/glade/register_dialog.glade
@@ -19,16 +19,16 @@
             <property name="can_focus">False</property>
             <property name="layout_style">end</property>
             <child>
-              <object class="GtkButton" id="cancel_button">
-                <property name="label">gtk-cancel</property>
+              <object class="GtkButton" id="back_button">
+                <property name="label">gtk-go-back</property>
                 <property name="visible">True</property>
                 <property name="can_focus">True</property>
                 <property name="receives_default">True</property>
                 <property name="use_stock">True</property>
                 <property name="image_position">right</property>
                 <child internal-child="accessible">
-                  <object class="AtkObject" id="cancel_button-atkobject">
-                    <property name="AtkObject::accessible-name" translatable="yes">cancel_button</property>
+                  <object class="AtkObject" id="back_button-atkobject">
+                    <property name="AtkObject::accessible-name" translatable="yes">back_button</property>
                   </object>
                 </child>
               </object>
@@ -74,7 +74,7 @@
       </object>
     </child>
     <action-widgets>
-      <action-widget response="0">cancel_button</action-widget>
+      <action-widget response="0">back_button</action-widget>
       <action-widget response="0">register_button</action-widget>
     </action-widgets>
   </object>
diff --git a/src/subscription_manager/gui/data/ui/allsubs.ui b/src/subscription_manager/gui/data/ui/allsubs.ui
index cd409d3..f1b60bb 100644
--- a/src/subscription_manager/gui/data/ui/allsubs.ui
+++ b/src/subscription_manager/gui/data/ui/allsubs.ui
@@ -2,27 +2,13 @@
 <!-- Generated with glade 3.18.3 -->
 <interface>
   <requires lib="gtk+" version="3.0"/>
-  <object class="GtkAdjustment" id="subs_vpane_hadj">
-    <property name="upper">100</property>
-    <property name="step_increment">1</property>
-    <property name="page_increment">10</property>
-  </object>
-  <object class="GtkAdjustment" id="subs_vpane_vadj">
-    <property name="upper">100</property>
-    <property name="step_increment">1</property>
-    <property name="page_increment">10</property>
-  </object>
   <object class="GtkWindow" id="window1">
     <property name="can_focus">False</property>
-    <property name="halign">start</property>
-    <property name="valign">start</property>
     <property name="icon_name">subscription-manager</property>
     <child>
       <object class="GtkBox" id="content">
         <property name="visible">True</property>
         <property name="can_focus">False</property>
-        <property name="halign">start</property>
-        <property name="valign">start</property>
         <property name="border_width">12</property>
         <property name="orientation">vertical</property>
         <property name="spacing">4</property>
@@ -30,16 +16,12 @@
           <object class="GtkBox" id="vbox3">
             <property name="visible">True</property>
             <property name="can_focus">False</property>
-            <property name="halign">start</property>
-            <property name="valign">start</property>
             <property name="orientation">vertical</property>
             <property name="spacing">6</property>
             <child>
               <object class="GtkBox" id="hbox3">
                 <property name="visible">True</property>
                 <property name="can_focus">False</property>
-                <property name="halign">start</property>
-                <property name="valign">start</property>
                 <property name="spacing">6</property>
                 <child>
                   <object class="GtkLabel" id="label1">
@@ -134,14 +116,10 @@
               <object class="GtkBox" id="hbox2">
                 <property name="visible">True</property>
                 <property name="can_focus">False</property>
-                <property name="halign">end</property>
-                <property name="valign">start</property>
                 <child>
                   <object class="GtkLabel" id="edit_quantity_label">
                     <property name="visible">True</property>
                     <property name="can_focus">False</property>
-                    <property name="halign">end</property>
-                    <property name="valign">start</property>
                     <property name="label" translatable="yes">* Click to Adjust Quantity</property>
                     <property name="use_markup">True</property>
                     <property name="xalign">0.99000000953674316</property>
@@ -173,18 +151,15 @@
             <property name="visible">True</property>
             <property name="can_focus">True</property>
             <property name="orientation">vertical</property>
+            <property name="position">2</property>
             <property name="position_set">True</property>
             <child>
               <object class="GtkScrolledWindow" id="scrolledwindow">
+                <property name="height_request">125</property>
                 <property name="visible">True</property>
                 <property name="can_focus">True</property>
-                <property name="valign">start</property>
                 <property name="border_width">1</property>
-                <property name="hadjustment">subs_vpane_hadj</property>
-                <property name="vadjustment">subs_vpane_vadj</property>
-                <property name="shadow_type">etched-out</property>
-                <property name="min_content_width">240</property>
-                <property name="min_content_height">120</property>
+                <property name="shadow_type">etched-in</property>
               </object>
               <packing>
                 <property name="resize">True</property>
@@ -195,7 +170,7 @@
               <object class="GtkBox" id="details_box">
                 <property name="visible">True</property>
                 <property name="can_focus">False</property>
-                <property name="valign">end</property>
+                <property name="orientation">vertical</property>
                 <child>
                   <placeholder/>
                 </child>
@@ -216,13 +191,10 @@
           <object class="GtkBox" id="hbox1">
             <property name="visible">True</property>
             <property name="can_focus">False</property>
-            <property name="halign">end</property>
-            <property name="valign">start</property>
             <child>
               <object class="GtkButtonBox" id="subscribe_button_box">
                 <property name="visible">True</property>
                 <property name="can_focus">False</property>
-                <property name="valign">start</property>
                 <property name="layout_style">end</property>
                 <child>
                   <object class="GtkButton" id="subscribe_button">
diff --git a/src/subscription_manager/gui/data/ui/register_dialog.ui b/src/subscription_manager/gui/data/ui/register_dialog.ui
index 22fb3c5..3099ddc 100644
--- a/src/subscription_manager/gui/data/ui/register_dialog.ui
+++ b/src/subscription_manager/gui/data/ui/register_dialog.ui
@@ -32,15 +32,15 @@
             <property name="margin_bottom">4</property>
             <property name="hexpand">True</property>
             <child>
-              <object class="GtkButton" id="cancel_button">
-                <property name="label">gtk-cancel</property>
+              <object class="GtkButton" id="back_button">
+                <property name="label">gtk-go-back</property>
                 <property name="visible">True</property>
                 <property name="can_focus">True</property>
                 <property name="receives_default">True</property>
                 <property name="use_stock">True</property>
                 <child internal-child="accessible">
-                  <object class="AtkObject" id="cancel_button-atkobject">
-                    <property name="AtkObject::accessible-name">cancel_button</property>
+                  <object class="AtkObject" id="back_button-atkobject">
+                    <property name="AtkObject::accessible-name">back_button</property>
                   </object>
                 </child>
               </object>
diff --git a/src/subscription_manager/gui/mysubstab.py b/src/subscription_manager/gui/mysubstab.py
index 4eb3e2c..178d59c 100644
--- a/src/subscription_manager/gui/mysubstab.py
+++ b/src/subscription_manager/gui/mysubstab.py
@@ -153,7 +153,7 @@ class MySubscriptionsTab(widgets.SubscriptionManagerTab):
             # unregistered, just delete the certs directly
             action = EntCertDeleteAction(self.entitlement_dir)
             action.perform([serial])
-            self.update_subscriptions()
+        self.update_subscriptions()
 
     def unsubscribe_button_clicked(self, widget):
         selection = widgets.SelectionWrapper(self.top_view.get_selection(), self.store)
diff --git a/src/subscription_manager/gui/registergui.py b/src/subscription_manager/gui/registergui.py
index ed5213c..a07a646 100644
--- a/src/subscription_manager/gui/registergui.py
+++ b/src/subscription_manager/gui/registergui.py
@@ -28,7 +28,7 @@ from subscription_manager.ga import GObject as ga_GObject
 
 import rhsm.config as config
 from rhsm.utils import ServerUrlParseError
-from rhsm.connection import GoneException
+from rhsm.connection import GoneException, RestlibException
 
 from subscription_manager.branding import get_branding
 from subscription_manager.action_client import ActionClient
@@ -109,6 +109,35 @@ def reset_resolver():
         pass
 
 
+# FIXME: TODO: subclass collections.MutableSequence
+class UniqueList(object):
+    def __init__(self):
+        self._list = []
+
+    def append(self, item):
+        if item in self._list:
+            self._list.remove(item)
+        return self._list.append(item)
+
+    def __repr__(self):
+        list_buf = ','.join([repr(a) for a in self._list])
+        buf = "<UniqueList [%s] >" % list_buf
+        return buf
+
+    def remove(self, value):
+        return self._list.remove(value)
+
+    def last(self):
+        return self._list[-1]
+
+    def pop(self, index=None):
+        # list.pop() has a odd not quite a keyword optional arg
+        if index:
+            p = self._list.pop(index)
+        p = self._list.pop()
+        return p
+
+
 class RegisterInfo(ga_GObject.GObject):
     """GObject holding registration info and state.
 
@@ -170,6 +199,8 @@ class RegisterWidget(widgets.SubmanBaseWidget):
 
     __gsignals__ = {'proceed': (ga_GObject.SignalFlags.RUN_FIRST,
                                 None, []),
+                    'back': (ga_GObject.SignalFlags.RUN_FIRST,
+                             None, []),
                     'register-message': (ga_GObject.SignalFlags.RUN_FIRST,
                                          None, (ga_GObject.TYPE_PYOBJECT,
                                                 ga_GObject.TYPE_PYOBJECT)),
@@ -230,6 +261,8 @@ class RegisterWidget(widgets.SubmanBaseWidget):
         # expect this to be driving from the parent dialog
         self.proceed_handler = self.connect('proceed',
                                             self._on_proceed)
+        self.back_handler = self.connect('back',
+                                         self._on_back)
 
         # FIXME: change glade name
         self.details_label = self.register_details_label
@@ -255,6 +288,8 @@ class RegisterWidget(widgets.SubmanBaseWidget):
         # Track screens we "show" so we can choose a reasonable error screen
         self.screen_history = []
 
+        self.uniq_screen_history = UniqueList()
+        self.applied_screen_history = UniqueList()
         # FIXME: modify property instead
         self.callbacks = []
 
@@ -311,8 +346,7 @@ class RegisterWidget(widgets.SubmanBaseWidget):
         any parent dialogs for example)."""
 
         # return to the last gui screen we showed.
-        self._go_back_to_last_screen()
-
+        self._pop_last_screen()
         # FIXME: we have more info here, but we need a good 'blurb'
         #        for the status message.
         msg = _("Error during registration.")
@@ -320,7 +354,7 @@ class RegisterWidget(widgets.SubmanBaseWidget):
 
     def do_register_message(self, msg, msg_type=None):
         # NOTE: we ignore msg_type here
-        self._go_back_to_last_screen()
+        self._pop_last_screen()
         self.info.set_property('register-status', msg)
 
     def do_register_finished(self):
@@ -339,9 +373,10 @@ class RegisterWidget(widgets.SubmanBaseWidget):
         # close the window have something to display.
         self.done()
 
-    def _go_back_to_last_screen(self):
+    def _pop_last_screen(self):
         try:
-            self._set_screen(self.screen_history[-1])
+            last = self.applied_screen_history.pop()
+            self._set_screen(last)
         except IndexError:
             pass
 
@@ -391,7 +426,6 @@ class RegisterWidget(widgets.SubmanBaseWidget):
         This also represents screens that allow the user to potentially correct
         an error, so we track the history of these screens so errors can go to
         a useful screen."""
-        self.screen_history.append(current_screen.screens_index)
         self._set_screen(self._current_screen)
 
     # TODO: replace most of the gui flow logic in the Screen subclasses with
@@ -444,6 +478,13 @@ class RegisterWidget(widgets.SubmanBaseWidget):
 
     def apply_current_screen(self):
         """Extract any info from the widgets and call the screens apply()."""
+        #self._screen_history_append(self.current_screen.screens_index)
+
+        # The apply can emit a move to page signal, changing current_page
+        # So save current screen index first.
+        current_screen_index = self.current_screen.screens_index
+        self.applied_screen_history.append(current_screen_index)
+
         self.current_screen.apply()
 
     # FIXME: figure out to determine we are on first screen, then this
@@ -452,6 +493,9 @@ class RegisterWidget(widgets.SubmanBaseWidget):
     def _on_proceed(self, obj):
         self.apply_current_screen()
 
+    def _on_back(self, obj):
+        self._pop_last_screen()
+
     # switch-page should be after the current screen is reset
     def _on_switch_page(self, notebook, page, page_num):
         if self.current_screen.button_label:
@@ -536,8 +580,10 @@ class RegisterWidget(widgets.SubmanBaseWidget):
 
         if ready:
             self.handler_unblock(self.proceed_handler)
+            self.handler_unblock(self.back_handler)
         else:
             self.handler_block(self.proceed_handler)
+            self.handler_block(self.back_handler)
 
     # HMMM: If the connect/backend/async, and the auth info is composited into
     #       the same GObject, these could be class closure handlers
@@ -597,7 +643,7 @@ class RegisterDialog(widgets.SubmanBaseWidget):
 
     widget_names = ['register_dialog', 'register_dialog_main_vbox',
                     'register_details_label',
-                    'cancel_button', 'register_button', 'progress_label',
+                    'back_button', 'register_button', 'progress_label',
                     'dialog_vbox6']
 
     gui_file = "register_dialog"
@@ -642,7 +688,7 @@ class RegisterDialog(widgets.SubmanBaseWidget):
         #self.register_widget.initialize()
 
         self.register_button.connect('clicked', self._on_register_button_clicked)
-        self.cancel_button.connect('clicked', self.cancel)
+        self.back_button.connect('clicked', self._on_back_button_clicked)
 
         # update window title on register state changes
         self.reg_info.connect('notify::register-state',
@@ -701,9 +747,13 @@ class RegisterDialog(widgets.SubmanBaseWidget):
     def error_dialog(self, obj, msg):
         gui_utils.show_error_window(msg)
 
+    def _on_back_button_clicked(self, obj):
+        self.register_widget.emit('back')
+
     def _on_register_screen_ready_change(self, obj, value):
         ready = self.register_widget.current_screen.get_property('ready')
         self.register_button.set_sensitive(ready)
+        self.back_button.set_sensitive(ready)
 
     def _on_register_button_clicked(self, button):
         self.register_widget.emit('proceed')
@@ -812,7 +862,7 @@ class Screen(widgets.SubmanBaseWidget):
     # do whatever the screen indicates, and emit any signals indicating where
     # to move to next. apply() should not return anything.
     def apply(self):
-        pass
+        return True
 
     def post(self):
         pass
@@ -872,6 +922,7 @@ class NoGuiScreen(ga_GObject.GObject):
 
     def apply(self):
         self.emit('move-to-screen')
+        return True
 
     def post(self):
         pass
@@ -897,6 +948,7 @@ class PerformRegisterScreen(NoGuiScreen):
         if error is not None:
             self.emit('register-error', REGISTER_ERROR, error)
             # TODO: register state
+            self.pre_done()
             return
 
         try:
@@ -904,6 +956,7 @@ class PerformRegisterScreen(NoGuiScreen):
         except Exception, e:
             # hint: register error, back to creds?
             self.emit('register-error', REGISTER_ERROR, e)
+            self.pre_done()
             return
 
         # trigger a id cert reload
@@ -1006,6 +1059,7 @@ class ConfirmSubscriptionsScreen(Screen):
 
     def apply(self):
         self.emit('move-to-screen', PERFORM_SUBSCRIBE_PAGE)
+        return True
 
     def set_model(self):
         dry_run_result = self.info.get_property('dry-run-result')
@@ -1082,6 +1136,7 @@ class SelectSLAScreen(Screen):
 
     def apply(self):
         self.emit('move-to-screen', CONFIRM_SUBS_PAGE)
+        return True
 
     def clear(self):
         child_widgets = self.sla_radio_container.get_children()
@@ -1138,10 +1193,22 @@ class SelectSLAScreen(Screen):
                 self.emit('register-error', msg, None)
                 self.pre_done()
                 return
-                # TODO: where we should go from here?
+            elif isinstance(error[1], RestlibException) and error[1].code == "401":
+                # If we get here with a 401, we are using consumer cert auth
+                # so that means we are likely connecting to the wrong server
+                # url, since unregistered consumers talking to the correct
+                # serverurl would 410. Short of changing serverurl or re-registering
+                # there isn't much we can do to fix that.
+                msg = error[1].error_msg
+                # TODO: Provide a better error message reflecting above comment
+                self.emit('register-error', msg, None)
+                self.emit('attach-finished')
+                self.pre_done()
+                return
             else:
                 log.exception(error)
                 self.emit('register-error', _("Error subscribing"), error)
+                self.emit('attach-finished')
                 self.pre_done()
                 return
 
@@ -1264,6 +1331,7 @@ class EnvironmentScreen(Screen):
         model, tree_iter = self.environment_treeview.get_selection().get_selected()
         self.set_environment(model.get_value(tree_iter, 0))
         self.emit('move-to-screen', PERFORM_REGISTER_PAGE)
+        return True
 
     def set_environment(self, environment):
         self.info.set_property('environment', environment)
@@ -1336,6 +1404,7 @@ class OrganizationScreen(Screen):
         owner_key = model.get_value(tree_iter, 0)
         self.info.set_property('owner-key', owner_key)
         self.emit('move-to-screen', ENVIRONMENT_SELECT_PAGE)
+        return True
 
     def set_model(self, owners):
         owner_model = ga_Gtk.ListStore(str, str)
@@ -1428,10 +1497,10 @@ class CredentialsScreen(Screen):
         skip_auto_bind = self.skip_auto_bind.get_active()
 
         if not self._validate_consumername(consumername):
-            return
+            return False
 
         if not self._validate_account():
-            return
+            return False
 
         self.info.set_property('username', username)
         self.info.set_property('password', password)
@@ -1439,6 +1508,7 @@ class CredentialsScreen(Screen):
         self.info.set_property('consumername', consumername)
 
         self.emit('move-to-screen', OWNER_SELECT_PAGE)
+        return True
 
     def clear(self):
         self.account_login.set_text("")
@@ -1472,19 +1542,20 @@ class ActivationKeyScreen(Screen):
         consumername = self.consumer_entry.get_text().strip()
 
         if not self._validate_owner_key(owner_key):
-            return
+            return False
 
         if not self._validate_activation_keys(activation_keys):
-            return
+            return False
 
         if not self._validate_consumername(consumername):
-            return
+            return False
 
         self.info.set_property('consumername', consumername)
         self.info.set_property('owner-key', owner_key)
         self.info.set_property('activation-keys', activation_keys)
 
         self.emit('move-to-screen', PERFORM_REGISTER_PAGE)
+        return True
 
     def _split_activation_keys(self, entry):
         keys = re.split(',\s*|\s+', entry)
@@ -1626,19 +1697,19 @@ class ChooseServerScreen(Screen):
                               _("Unable to reach the server at %s:%s%s") %
                                 (hostname, port, prefix),
                               None)
-                    return
+                    return False
             except MissingCaCertException:
                 self.emit('register-error',
                           _("CA certificate for subscription service has not been installed."),
                           None)
-                return
+                return False
 
         except ServerUrlParseError:
             self.emit('register-error',
                       _("Please provide a hostname with optional port and/or prefix: "
                         "hostname[:port][/prefix]"),
                       None)
-            return
+            return False
 
         CFG.save()
 
@@ -1648,11 +1719,11 @@ class ChooseServerScreen(Screen):
 
         if self.activation_key_checkbox.get_active():
             self.emit('move-to-screen', ACTIVATION_KEY_PAGE)
-            return
+            return True
 
         else:
             self.emit('move-to-screen', CREDENTIALS_PAGE)
-            return
+            return True
 
     def set_server_entry(self, hostname, port, prefix):
         # No need to show port and prefix for hosted:
@@ -1995,10 +2066,11 @@ class InfoScreen(Screen):
         self.stay()
         if self.register_radio.get_active():
             self.emit('move-to-screen', CHOOSE_SERVER_PAGE)
-            return
+            return True
 
         else:
             self.emit('move-to-screen', FINISH)
+            return True
 
     def _on_why_register_button_clicked(self, button):
         self.why_register_dialog.show()
diff --git a/subscription-manager.spec b/subscription-manager.spec
index 9a62cdf..63e7a50 100644
--- a/subscription-manager.spec
+++ b/subscription-manager.spec
@@ -49,7 +49,7 @@
 
 Name: subscription-manager
 Version: 1.15.9
-Release: 12%{?dist}
+Release: 13%{?dist}
 Summary: Tools and libraries for subscription and repository management
 Group:   System Environment/Base
 License: GPLv2
@@ -542,6 +542,16 @@ fi
 %endif
 
 %changelog
+* Wed Sep 30 2015 Chris Rog <crog@redhat.com> 1.15.9-13
+- 1266480: Refresh TreeView selection after subscriptions are removed.
+  (awood@redhat.com)
+- 1267034: Handle 401 with cert based auth (alikins@redhat.com)
+- Allow 'back' to go back multiple times. (alikins@redhat.com)
+- 1262075,1267179,1243707: Fix back/cancel nav (alikins@redhat.com)
+- 1267287: Fix allsubs tab ui regression (alikins@redhat.com)
+- 1266994: Use our icon for initial-setup spoke icon (alikins@redhat.com)
+- 1265347, 1265371: More translations whitespace corrections (crog@redhat.com)
+
 * Mon Sep 28 2015 Chris Rog <crog@redhat.com> 1.15.9-12
 - 1261006: Handle multiple nav button clicks (alikins@redhat.com)
 - 1242998, 1254550: Fix "already reg'ed" in initial-setup (alikins@redhat.com)
diff --git a/test/test_registrationgui.py b/test/test_registrationgui.py
index 6ccd89b..6e99e6e 100644
--- a/test/test_registrationgui.py
+++ b/test/test_registrationgui.py
@@ -33,6 +33,7 @@ class RegisterWidgetTests(SubManFixture):
 
         self.rs._screens[CHOOSE_SERVER_PAGE] = Mock()
         self.rs._screens[CHOOSE_SERVER_PAGE].index = 0
+        self.rs._screens[CHOOSE_SERVER_PAGE].screens_index = 0
         self.rs._screens[CHOOSE_SERVER_PAGE].button_label = "Dummy"
         self.rs._screens[CHOOSE_SERVER_PAGE].apply.return_value = \
                 CREDENTIALS_PAGE