diff --git a/crates/installer/templates/installer-ui.wxs b/crates/installer/templates/installer-ui.wxs
--- a/crates/installer/templates/installer-ui.wxs
+++ b/crates/installer/templates/installer-ui.wxs
@@ -157,7 +157,7 @@
       </Dialog>
 
       <!-- Shown by Windows Installer (Restart Manager) when an upgrade or repair must replace files
-           that a running app holds open. OK closes those programs (MSIRMSHUTDOWN=2) and
+           that a running app holds open. OK requests Restart Manager shutdown/restart and
            continues; Cancel ends setup. -->
       <Dialog Id="MsiRMFilesInUse" Width="370" Height="200" Title="[ProductName] Setup" KeepModeless="yes">
         <Control Id="Title" Type="Text" X="20" Y="15" Width="330" Height="25" Text="{\CraftInstallerTitle}Files in use" />
@@ -165,7 +165,7 @@
             Text="These programs are using files that setup needs to update. Click OK to close them and continue, or Cancel to stop setup." />
         <Control Id="List" Type="ListBox" X="20" Y="80" Width="330" Height="55" Property="FileInUseProcess" Sunken="yes" TabSkip="yes" />
         <Control Id="OK" Type="PushButton" X="195" Y="165" Width="75" Height="23" Default="yes" Text="OK">
-          <Publish Property="MSIRMSHUTDOWN" Value="2" Order="1" />
+          <Publish Event="RMShutdownAndRestart" Value="0" Order="1" />
           <Publish Event="EndDialog" Value="Return" Order="2" />
         </Control>
         <Control Id="Cancel" Type="PushButton" X="280" Y="165" Width="70" Height="23" Cancel="yes" Text="Cancel">
diff --git a/crates/installer/tests/restart_manager.rs b/crates/installer/tests/restart_manager.rs
new file mode 100644
--- /dev/null
+++ b/crates/installer/tests/restart_manager.rs
@@ -0,0 +1,13 @@
+use craft_installer::{WindowsApp, windows_ui};
+
+#[test]
+fn every_profile_requests_restart_manager_shutdown_instead_of_restart_only_flags() {
+    for app in WindowsApp::ALL {
+        let source = windows_ui(app);
+        let dialog = source.split("<Dialog Id=\"MsiRMFilesInUse\"").nth(1).unwrap().split("</Dialog>").next().unwrap();
+        let ok = dialog.split("<Control Id=\"OK\"").nth(1).unwrap().split("</Control>").next().unwrap();
+        assert!(ok.contains(r#"<Publish Event="RMShutdownAndRestart" Value="0" Order="1" />"#), "{} must request application shutdown", app.name());
+        assert!(ok.contains(r#"<Publish Event="EndDialog" Value="Return" Order="2" />"#), "{} must return to MSI", app.name());
+        assert!(!ok.contains("MSIRMSHUTDOWN"), "{} must not require restart registration before shutdown", app.name());
+    }
+}
