diff --git a/CHANGELOG.md b/CHANGELOG.md
index 57002893..f41d813c 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -3,8 +3,7 @@
## [Unreleased]
### Added
-- Pre-update backup **notice + live-progress modal** on the admin update pages (Joomla Update and Extensions → Update). Because the server-side `onExtensionBeforeUpdate` backup runs synchronously and can't drive a browser modal, the system plugin now injects a "back up before you update" notice with a **Back up now** button that runs the same stepped backup as the dashboard and shows a live progress bar. On success it pings a new `ajax.preupdateAck` endpoint, which arms the same throttle the server-side hook checks — so clicking Joomla's Update afterwards won't run a duplicate backup. Gated by the existing `show_update_notice` + `backup_before_update` params. (#196)
-- Pre-update modal **phase 2 — "Auto-run on Update click"** (new opt-in param `preupdate_auto_intercept`, off by default). When enabled, clicking the toolbar **Update** button on the Joomla Update / Extensions-update page first pops the backup progress modal, runs the pre-update backup, then automatically continues the update. Implemented by wrapping `Joomla.submitbutton` for the `update.update` / `update.install` tasks only (Find Updates / Clear Cache are untouched); the manual "Back up now" notice remains as a fallback for any flow that doesn't route through `submitbutton`. (#196)
+- **Full-screen backup screen** (`view=runbackup`) for both pre-update and manual backups, modelled on Akeeba's Backup-on-Update — replaces the earlier popup-modal approach. Clicking Joomla's **Install the update** now redirects (server-side, Akeeba-style) to a dedicated full-page backup screen that runs the stepped backup with a real progress bar and then **automatically continues the update** via a validated `returnurl` (flagged `is_backed_up=1` so the backup isn't repeated). Crucially, **no backup runs synchronously inside the update request** — which is what white-screened large sites. The dashboard **Backup Now** now opens the same full-screen screen instead of an inline modal. (#196)
- Retention now prunes **remote** copies too: when a backup is pruned by age/count, its archive is deleted from every enabled remote destination (SFTP / FTP / S3 / Google Drive), not just the local copy. Each uploader gained an idempotent `delete()` method (already-absent file = success), and removal is best-effort — a failing destination is logged but never blocks local pruning. The shared standalone `restore.php` is intentionally left in place (every backup overwrites it, so newer backups still depend on it). (#229)
### Changed
diff --git a/source/packages/com_mokosuitebackup/config.xml b/source/packages/com_mokosuitebackup/config.xml
index 94650c5b..84db7fca 100644
--- a/source/packages/com_mokosuitebackup/config.xml
+++ b/source/packages/com_mokosuitebackup/config.xml
@@ -151,18 +151,6 @@
-
-
-
-
+ * @copyright Copyright (C) 2026 Moko Consulting. All rights reserved.
+ * @license GNU General Public License version 3 or later; see LICENSE
+ */
+
+namespace Joomla\Component\MokoSuiteBackup\Administrator\View\Runbackup;
+
+defined('_JEXEC') or die;
+
+use Joomla\CMS\Factory;
+use Joomla\CMS\Language\Text;
+use Joomla\CMS\MVC\View\HtmlView as BaseHtmlView;
+use Joomla\CMS\Toolbar\ToolbarHelper;
+
+/**
+ * Full-screen "run a backup" progress view.
+ *
+ * Auto-starts the stepped backup (ajax.init → loop ajax.step) and shows a
+ * full-page progress screen. Used both by the dashboard "Backup Now" action
+ * and — via the system plugin's pre-update redirect — as the interstitial
+ * between clicking Joomla's Update and the update actually running. When a
+ * `returnurl` is supplied the page redirects there once the backup completes
+ * (e.g. back to `com_joomlaupdate&task=update.install&is_backed_up=1`).
+ */
+class HtmlView extends BaseHtmlView
+{
+ public int $profileId = 1;
+
+ public string $profileTitle = '';
+
+ public string $description = '';
+
+ /** Raw (possibly base64) return URL from the request; validated in the layout. */
+ public string $returnUrl = '';
+
+ public bool $autostart = true;
+
+ public function display($tpl = null): void
+ {
+ $input = Factory::getApplication()->getInput();
+
+ $this->profileId = (int) $input->getInt('profile_id', $input->getInt('profileid', 1));
+ $this->description = $input->getString('description', '');
+ $this->returnUrl = $input->getRaw('returnurl', '');
+ $this->autostart = (bool) $input->getInt('autostart', 1);
+
+ if ($this->profileId <= 0) {
+ $this->profileId = 1;
+ }
+
+ $this->profileTitle = $this->loadProfileTitle($this->profileId);
+
+ $this->addToolbar();
+
+ parent::display($tpl);
+ }
+
+ /**
+ * Look up the target profile's title for display (best-effort).
+ */
+ private function loadProfileTitle(int $profileId): string
+ {
+ try {
+ $db = Factory::getContainer()->get(\Joomla\Database\DatabaseInterface::class);
+ $query = $db->getQuery(true)
+ ->select($db->quoteName('title'))
+ ->from($db->quoteName('#__mokosuitebackup_profiles'))
+ ->where($db->quoteName('id') . ' = ' . (int) $profileId);
+ $db->setQuery($query);
+
+ return (string) ($db->loadResult() ?? '');
+ } catch (\Throwable $e) {
+ return '';
+ }
+ }
+
+ protected function addToolbar(): void
+ {
+ ToolbarHelper::title(
+ Text::_('COM_MOKOJOOMBACKUP_SHORT') . ': ' . Text::_('COM_MOKOJOOMBACKUP_RUNBACKUP_TITLE'),
+ 'archive'
+ );
+ }
+}
diff --git a/source/packages/com_mokosuitebackup/tmpl/dashboard/default.php b/source/packages/com_mokosuitebackup/tmpl/dashboard/default.php
index 565acd9e..e861acdc 100644
--- a/source/packages/com_mokosuitebackup/tmpl/dashboard/default.php
+++ b/source/packages/com_mokosuitebackup/tmpl/dashboard/default.php
@@ -17,6 +17,9 @@ use Joomla\CMS\Session\Session;
$ajaxToken = Session::getFormToken();
$ajaxUrl = Route::_('index.php?option=com_mokosuitebackup&format=json', false);
+
+$runbackupUrl = Route::_('index.php?option=com_mokosuitebackup&view=runbackup&autostart=1', false);
+$liveSite = trim((string) \Joomla\CMS\Factory::getApplication()->get('live_site', ''));
?>
defaultDirWarning) : ?>