diff --git a/web/settings/account-settings.react.js b/web/settings/account-settings.react.js
--- a/web/settings/account-settings.react.js
+++ b/web/settings/account-settings.react.js
@@ -12,6 +12,7 @@
 
 import css from './account-settings.css';
 import AppearanceChangeModal from './appearance-change-modal.react.js';
+import BackupTestRestoreModal from './backup-test-restore-modal.react.js';
 import PasswordChangeModal from './password-change-modal.js';
 import BlockListModal from './relationship/block-list-modal.react.js';
 import FriendListModal from './relationship/friend-list-modal.react.js';
@@ -76,6 +77,11 @@
     [addListener, popModal, pushModal, removeListener],
   );
 
+  const openBackupTestRestoreModal = React.useCallback(
+    () => pushModal(<BackupTestRestoreModal onClose={popModal} />),
+    [popModal, pushModal],
+  );
+
   const showAppearanceModal = React.useCallback(
     () => pushModal(<AppearanceChangeModal />),
     [pushModal],
@@ -146,6 +152,24 @@
       </div>
     );
   }
+  let backup;
+  if (staffCanSee) {
+    backup = (
+      <div className={css.preferencesContainer}>
+        <h4 className={css.preferencesHeader}>Backup menu</h4>
+        <div className={css.content}>
+          <ul>
+            <li>
+              <span>Test backup restore</span>
+              <Button variant="text" onClick={openBackupTestRestoreModal}>
+                <p className={css.buttonText}>Insert data</p>
+              </Button>
+            </li>
+          </ul>
+        </div>
+      </div>
+    );
+  }
 
   return (
     <div className={css.container}>
@@ -180,6 +204,7 @@
         </div>
         {preferences}
         {tunnelbroker}
+        {backup}
       </div>
     </div>
   );
diff --git a/web/settings/backup-test-restore-modal.css b/web/settings/backup-test-restore-modal.css
new file mode 100644
--- /dev/null
+++ b/web/settings/backup-test-restore-modal.css
@@ -0,0 +1,25 @@
+.modalBody {
+  padding: 24px 40px 32px;
+  color: var(--fg);
+}
+
+.content {
+  display: flex;
+  flex-direction: column;
+  gap: 10px;
+}
+
+.footer {
+  display: flex;
+  flex-direction: row-reverse;
+  justify-content: space-between;
+  padding-top: 8px;
+}
+
+.modalError {
+  font-size: var(--xs-font-12);
+  color: var(--error);
+  font-style: italic;
+  padding-left: 6px;
+  align-self: center;
+}
diff --git a/web/settings/backup-test-restore-modal.react.js b/web/settings/backup-test-restore-modal.react.js
new file mode 100644
--- /dev/null
+++ b/web/settings/backup-test-restore-modal.react.js
@@ -0,0 +1,118 @@
+// @flow
+
+import invariant from 'invariant';
+import * as React from 'react';
+
+import { IdentityClientContext } from 'lib/shared/identity-client-context.js';
+
+import css from './backup-test-restore-modal.css';
+import Button from '../components/button.react.js';
+import { getDatabaseModule } from '../database/database-module-provider.js';
+import Input from '../modals/input.react.js';
+import Modal from '../modals/modal.react.js';
+import { workerRequestMessageTypes } from '../types/worker-types.js';
+
+type Props = {
+  +onClose: () => void,
+};
+
+function BackupTestRestoreModal(props: Props): React.Node {
+  const { onClose } = props;
+  const [backupID, setBackupID] = React.useState('');
+  const [backupDataKey, setBackupDataKey] = React.useState('');
+  const [backupLogDataKey, setBackupLogDataKey] = React.useState('');
+  const [inProgress, setInProgress] = React.useState(false);
+  const [errorMessage, setErrorMessage] = React.useState('');
+
+  const client = React.useContext(IdentityClientContext);
+
+  const onSubmit = React.useCallback(
+    async (event: SyntheticEvent<HTMLButtonElement>) => {
+      event.preventDefault();
+
+      setInProgress(true);
+      void (async () => {
+        try {
+          if (!client) {
+            throw new Error('No identity client');
+          }
+
+          const authMetadata = await client.getAuthMetadata();
+
+          const databaseModule = await getDatabaseModule();
+          await databaseModule.schedule({
+            type: workerRequestMessageTypes.BACKUP_RESTORE,
+            authMetadata,
+            backupID,
+            backupDataKey,
+            backupLogDataKey,
+          });
+        } catch (e) {
+          setErrorMessage(e.message);
+        }
+        setInProgress(false);
+      })();
+    },
+    [backupDataKey, backupID, backupLogDataKey, client],
+  );
+
+  let errorMsg;
+  if (errorMessage) {
+    errorMsg = <div className={css.modalError}>{errorMessage}</div>;
+  }
+
+  return (
+    <Modal name="Test backup restore" onClose={onClose} size="large">
+      <div className={css.modalBody}>
+        <div className={css.content}>
+          <Input
+            type="text"
+            value={backupID}
+            onChange={(event: SyntheticEvent<HTMLInputElement>) => {
+              const target = event.target;
+              invariant(target instanceof HTMLInputElement, 'target not input');
+              setBackupID(target.value);
+            }}
+            disabled={inProgress}
+            label="Backup ID"
+          />
+          <Input
+            type="text"
+            value={backupDataKey}
+            onChange={(event: SyntheticEvent<HTMLInputElement>) => {
+              const target = event.target;
+              invariant(target instanceof HTMLInputElement, 'target not input');
+              setBackupDataKey(target.value);
+            }}
+            disabled={inProgress}
+            label="Backup Data Encryption Key"
+          />
+          <Input
+            type="text"
+            value={backupLogDataKey}
+            onChange={(event: SyntheticEvent<HTMLInputElement>) => {
+              const target = event.target;
+              invariant(target instanceof HTMLInputElement, 'target not input');
+              setBackupLogDataKey(target.value);
+            }}
+            disabled={inProgress}
+            label="Backup Logs Encryption Key"
+          />
+        </div>
+        <div className={css.footer}>
+          <Button
+            type="submit"
+            variant="filled"
+            onClick={onSubmit}
+            disabled={!backupID || !backupDataKey || inProgress}
+          >
+            Restore
+          </Button>
+          {errorMsg}
+        </div>
+      </div>
+    </Modal>
+  );
+}
+
+export default BackupTestRestoreModal;