diff --git a/reviewboard/accounts/forms/pages.py b/reviewboard/accounts/forms/pages.py
index 9444a7f78ff7ca655010962980911d4eae1fc27a..b5799f2a74fb87a2292000d487a6f83cca6008dd 100644
--- a/reviewboard/accounts/forms/pages.py
+++ b/reviewboard/accounts/forms/pages.py
@@ -90,6 +90,12 @@ class AccountSettingsForm(AccountPageForm):
         label=_('Show desktop notifications'),
         required=False)
 
+    publish_and_archive = forms.BooleanField(
+        label=_('Always have the archive option checked when publishing '
+                'review requests and reviews'),
+        required=False,
+        initial=False)
+
     def load(self):
         """Load data for the form."""
         profile = self.user.get_profile()
@@ -99,15 +105,16 @@ class AccountSettingsForm(AccountPageForm):
             'diffviewer_syntax_highlighting')
 
         self.set_initial({
+            'default_use_rich_text': profile.should_use_rich_text,
+            'enable_desktop_notifications':
+                profile.should_enable_desktop_notifications,
             'open_an_issue': profile.open_an_issue,
+            'publish_and_archive': profile.publish_and_archive,
+            'should_send_email': profile.should_send_email,
+            'should_send_own_updates': profile.should_send_own_updates,
             'syntax_highlighting': (profile.syntax_highlighting and
                                     diffviewer_syntax_highlighting),
             'timezone': profile.timezone,
-            'default_use_rich_text': profile.should_use_rich_text,
-            'should_send_email': profile.should_send_email,
-            'should_send_own_updates': profile.should_send_own_updates,
-            'enable_desktop_notifications':
-                profile.should_enable_desktop_notifications,
         })
 
         if not diffviewer_syntax_highlighting:
@@ -133,6 +140,8 @@ class AccountSettingsForm(AccountPageForm):
             self.cleaned_data['should_send_own_updates']
         profile.settings['enable_desktop_notifications'] = \
             self.cleaned_data['enable_desktop_notifications']
+        profile.publish_and_archive = \
+            self.cleaned_data['publish_and_archive']
         profile.save(update_fields=(
             'default_use_rich_text',
             'open_an_issue',
@@ -153,7 +162,8 @@ class AccountSettingsForm(AccountPageForm):
                            'timezone',
                            'syntax_highlighting',
                            'open_an_issue',
-                           'default_use_rich_text'),
+                           'default_use_rich_text',
+                           'publish_and_archive'),
             }),
             (_('Notifications'), {
                 'fields': ('should_send_email',
diff --git a/reviewboard/accounts/models.py b/reviewboard/accounts/models.py
index f4f1c66c88fe18fc0edad2ae55d5e47a1c42a92d..d4537af61f75cd8dd30eceee3826cd4b346c73ec 100644
--- a/reviewboard/accounts/models.py
+++ b/reviewboard/accounts/models.py
@@ -569,6 +569,39 @@ class Profile(models.Model):
         self.settings.setdefault('avatars', {})['avatar_service_id'] = \
             service.avatar_service_id
 
+    @property
+    def publish_and_archive(self) -> bool:
+        """Whether to always archive review requests after publishing.
+
+        Version Added:
+            7.0
+
+        Type:
+            bool
+        """
+        settings = self.settings or {}
+
+        return settings.get('publish_and_archive', False)
+
+    @publish_and_archive.setter
+    def publish_and_archive(
+        self,
+        archive: bool,
+    ) -> None:
+        """Set whether to always archive review requests after publishing.
+
+        The ``settings`` field will need to be saved after this is
+        modified.
+
+        Version Added:
+            7.0
+
+        Args:
+            archive (bool):
+                Whether or not to archive when publishing a review request.
+        """
+        self.settings['publish_and_archive'] = archive
+
     def get_display_name(self, viewing_user):
         """Return the name to display to the given user.
 
diff --git a/reviewboard/accounts/templatetags/accounts.py b/reviewboard/accounts/templatetags/accounts.py
index e042069f0d15252a793bab18c00ce63933d88703..44f1ee3885f43fae5694f1e351c5c8171e7a9214 100644
--- a/reviewboard/accounts/templatetags/accounts.py
+++ b/reviewboard/accounts/templatetags/accounts.py
@@ -113,6 +113,7 @@ def js_user_session_info(context):
                 'commentsOpenAnIssue': profile.open_an_issue,
                 'enableDesktopNotifications':
                     profile.should_enable_desktop_notifications,
+                'publishAndArchive': profile.publish_and_archive,
             })
         else:
             cur_timezone = timezone.get_current_timezone()
diff --git a/reviewboard/accounts/tests/test_account_settings_form.py b/reviewboard/accounts/tests/test_account_settings_form.py
index 7d3d8b41c16069012d58d28065ae5c501f1e00de..92f6e26be674ff87dea0042de32657a7b9f61511 100644
--- a/reviewboard/accounts/tests/test_account_settings_form.py
+++ b/reviewboard/accounts/tests/test_account_settings_form.py
@@ -1,6 +1,9 @@
 """Unit tests for reviewboard.accounts.forms.pages.AccountSettingsForm."""
 
+from __future__ import annotations
+
 from django.contrib.auth.models import User
+from django.http import HttpRequest
 from django.views.generic.base import View
 from djblets.testing.decorators import add_fixtures
 
@@ -13,6 +16,26 @@ from reviewboard.testing import TestCase
 class AccountSettingsFormTests(TestCase):
     """Unit tests for reviewboard.accounts.forms.pages.AccountSettingsForm."""
 
+    ######################
+    # Instance variables #
+    ######################
+
+    #: The HTTP request.
+    request: HttpRequest
+
+    #: The user profile.
+    profile: Profile
+
+    #: The user to test with.
+    user: User
+
+    def setUp(self) -> None:
+        """Setup for a unit test."""
+        super().setUp()
+        self.request = self.create_http_request()
+        self.user = self.create_user()
+        self.profile = self.user.get_profile()
+
     @add_fixtures(['test_users'])
     def test_save_syntax_highlighting_disabled(self):
         """Testing AccountSettingsForm.save() with
@@ -41,3 +64,117 @@ class AccountSettingsFormTests(TestCase):
 
         profile = Profile.objects.get(pk=profile.pk)
         self.assertTrue(profile.syntax_highlighting)
+
+    def test_load_initial_data(self) -> None:
+        """Testing initial data loading into the form"""
+        form = AccountSettingsForm(page=None,
+                                   request=self.request,
+                                   user=self.user)
+        form.load()
+
+        self.assertEqual(form['timezone'].initial, self.profile.timezone)
+        self.assertEqual(form['open_an_issue'].initial,
+                         self.profile.open_an_issue)
+        self.assertEqual(form['syntax_highlighting'].initial,
+                         self.profile.syntax_highlighting)
+        self.assertEqual(form['default_use_rich_text'].initial, True)
+        self.assertEqual(form['should_send_email'].initial,
+                         self.profile.should_send_email)
+        self.assertEqual(form['should_send_own_updates'].initial,
+                         self.profile.should_send_own_updates)
+        self.assertEqual(form['enable_desktop_notifications'].initial,
+                         self.profile.settings.get(
+                             'enable_desktop_notifications', True))
+        self.assertEqual(form['publish_and_archive'].initial,
+                         self.profile.publish_and_archive)
+
+    def test_load_with_new_profile_defaults(self) -> None:
+        """Testing AccountSettingsForm.load with profile defaults"""
+        self.profile.timezone = 'US/Pacific'
+        self.profile.syntax_highlighting = False
+
+        form = AccountSettingsForm(page=None,
+                                   request=self.request,
+                                   user=self.user)
+
+        form.load()
+
+        self.assertEqual(form['timezone'].initial, 'US/Pacific')
+        self.assertEqual(form['syntax_highlighting'].initial, False)
+
+    def test_save_data(self) -> None:
+        """Testing saving form data to profile"""
+        form_data = {
+            'default_use_rich_text': False,
+            'enable_desktop_notifications': False,
+            'open_an_issue': True,
+            'publish_and_archive': True,
+            'should_send_email': True,
+            'should_send_own_updates': False,
+            'syntax_highlighting': True,
+            'timezone': 'US/Pacific',
+        }
+        form = AccountSettingsForm(page=None,
+                                   request=self.request,
+                                   user=self.user,
+                                   data=form_data)
+
+        self.assertTrue(form.is_valid())
+        form.save()
+
+        profile = self.user.get_profile()
+        self.assertEqual(profile.timezone, 'US/Pacific')
+        self.assertEqual(profile.open_an_issue, True)
+        self.assertEqual(profile.syntax_highlighting, True)
+        self.assertEqual(profile.default_use_rich_text, False)
+        self.assertEqual(profile.should_send_email, True)
+        self.assertEqual(profile.should_send_own_updates, False)
+        self.assertEqual(profile.settings.get('enable_desktop_notifications'),
+                         False)
+        self.assertEqual(profile.publish_and_archive, True)
+
+    def test_invalid_data(self) -> None:
+        """Testing form validation with invalid data"""
+        form_data = {
+            'default_use_rich_text': 'not_a_boolean',  # Invalid boolean
+            'enable_desktop_notifications': False,
+            'open_an_issue': True,
+            'publish_and_archive': True,
+            'should_send_email': True,
+            'should_send_own_updates': False,
+            'syntax_highlighting': 'not_a_boolean',  # Invalid boolean
+
+            # Assuming 'Invalid Timezone' is invalid
+            'timezone': 'Invalid Timezone',
+        }
+        form = AccountSettingsForm(page=None,
+                                   request=self.request,
+                                   user=self.user,
+                                   data=form_data)
+
+        self.assertFalse(form.is_valid())
+        self.assertIn('timezone', form.errors)
+
+        # BooleanField interprets any value that is not True, False, 'true',
+        # 'false', 1, 0, '1', '0' as False, so they don't cause errors.
+        self.assertNotIn('syntax_highlighting', form.errors)
+        self.assertNotIn('default_use_rich_text', form.errors)
+
+    def test_missing_required_data(self) -> None:
+        """Testing form validation with missing required data"""
+        form_data = {
+            # 'timezone' Missing required field
+            'open_an_issue': True,
+            'syntax_highlighting': True,
+            'default_use_rich_text': True,
+            'should_send_email': True,
+            'should_send_own_updates': False,
+            'enable_desktop_notifications': False,
+            'publish_and_archive': True,
+        }
+        form = AccountSettingsForm(data=form_data, page=None,
+                                   request=self.request,
+                                   user=self.user)
+
+        self.assertFalse(form.is_valid())
+        self.assertIn('timezone', form.errors)
diff --git a/reviewboard/accounts/tests/test_template_tags.py b/reviewboard/accounts/tests/test_template_tags.py
index b090496b4b633c9ce291b8eb28fa277f0f049632..0dbe883b3836474ffd26c4dfc9c5df2da51c2682 100644
--- a/reviewboard/accounts/tests/test_template_tags.py
+++ b/reviewboard/accounts/tests/test_template_tags.py
@@ -81,6 +81,7 @@ class JSUserSessionInfoTests(TestCase):
                 'fullName': 'Test User',
                 'mutedReviewRequestsURL':
                     '/api/users/test/muted-review-requests/',
+                'publishAndArchive': False,
                 'readOnly': False,
                 'sessionURL': '/api/session/',
                 'timezoneOffset': expected_tz_offset,
@@ -146,6 +147,7 @@ class JSUserSessionInfoTests(TestCase):
                 'fullName': 'Test User',
                 'mutedReviewRequestsURL':
                     '/s/local-site-1/api/users/test/muted-review-requests/',
+                    'publishAndArchive': False,
                 'readOnly': False,
                 'sessionURL': '/s/local-site-1/api/session/',
                 'timezoneOffset': expected_tz_offset,
@@ -204,6 +206,7 @@ class JSUserSessionInfoTests(TestCase):
                     'fullName': 'Test User',
                     'mutedReviewRequestsURL':
                         '/api/users/test/muted-review-requests/',
+                    'publishAndArchive': False,
                     'readOnly': False,
                     'sessionURL': '/api/session/',
                     'timezoneOffset': '+0000',
@@ -240,6 +243,7 @@ class JSUserSessionInfoTests(TestCase):
                     'fullName': 'Test User',
                     'mutedReviewRequestsURL':
                         '/api/users/test/muted-review-requests/',
+                    'publishAndArchive': False,
                     'readOnly': False,
                     'sessionURL': '/api/session/',
                     'timezoneOffset': '+0000',
