diff --git a/ironic_python_agent/agent.py b/ironic_python_agent/agent.py
index 8c31e4557..e1fbbb3bd 100644
--- a/ironic_python_agent/agent.py
+++ b/ironic_python_agent/agent.py
@@ -253,7 +253,6 @@ class IronicPythonAgent(base.ExecuteCommandMixin):
         # Allows this to be turned on by the conductor while running,
         # in the event of long running ramdisks where the conductor
         # got upgraded somewhere along the way.
-        self.agent_token_required = cfg.CONF.agent_token_required
         self.generated_cert = None
 
     def get_status(self):
@@ -473,8 +472,6 @@ class IronicPythonAgent(base.ExecuteCommandMixin):
         md5_allowed = config.get('agent_md5_checksum_enable')
         if md5_allowed is not None:
             cfg.CONF.set_override('md5_enabled', md5_allowed)
-        if config.get('agent_token_required'):
-            self.agent_token_required = True
         token = config.get('agent_token')
         if token:
             if len(token) >= 32:
@@ -490,11 +487,15 @@ class IronicPythonAgent(base.ExecuteCommandMixin):
                             'intended and the deployment may fail '
                             'depending on settings in the ironic '
                             'deployment.')
-                if not self.agent_token and self.agent_token_required:
-                    LOG.error('Ironic is signaling that agent tokens '
-                              'are required, however we do not have '
-                              'a token on file. '
-                              'This is likely **FATAL**.')
+                if not self.agent_token:
+                    LOG.error('We do not have a token on file '
+                              'from the Ironic deployment, and '
+                              'one should be on file. '
+                              'Possible external agent restart '
+                              'outside of Ironic\'s process. '
+                              'This is **FATAL**.')
+                    self.serve_api = False
+                    self.lockdown = True
             else:
                 LOG.info('An invalid token was received.')
         if self.agent_token and not self.standalone:
@@ -561,7 +562,7 @@ class IronicPythonAgent(base.ExecuteCommandMixin):
                           'found, please check your pxe append parameters.')
 
         in_rescued_mode = os.path.exists('/etc/.rescued')
-        if not in_rescued_mode:
+        if not in_rescued_mode and self.serve_api:
             self.serve_ipa_api()
         else:
             # NOTE(cid): In rescued state, we don't call _lockdown_system() as
diff --git a/ironic_python_agent/config.py b/ironic_python_agent/config.py
index 1a3924adc..0a26df6d9 100644
--- a/ironic_python_agent/config.py
+++ b/ironic_python_agent/config.py
@@ -292,12 +292,6 @@ cli_opts = [
                     'This variable can be also configured via image_info.'
                     'Value coming from image_info takes precedence over'
                     'value coming from command line or configuration file.'),
-    cfg.BoolOpt('agent_token_required',
-                default=APARAMS.get('ipa-agent-token-required', False),
-                help='Control to enforce if API command requests should '
-                     'enforce token validation. The configuration provided '
-                     'by the conductor MAY override this and force this '
-                     'setting to be changed to True in memory.'),
     cfg.IntOpt('image_download_connection_timeout', min=1,
                default=APARAMS.get(
                    'ipa-image-download-connection-timeout', 60),
diff --git a/ironic_python_agent/tests/unit/extensions/test_poll.py b/ironic_python_agent/tests/unit/extensions/test_poll.py
index b144d1047..757b8699a 100644
--- a/ironic_python_agent/tests/unit/extensions/test_poll.py
+++ b/ironic_python_agent/tests/unit/extensions/test_poll.py
@@ -42,8 +42,7 @@ class TestPollExtension(base.IronicAgentTest):
     def test_set_node_info_success(self):
         self.mock_agent.standalone = True
         node_info = {'node': {'uuid': 'fake-node', 'properties': {}},
-                     'config': {'agent_token_required': True,
-                                'agent_token': 'blah' * 8}}
+                     'config': {'agent_token': 'blah' * 8}}
         result = self.agent_extension.set_node_info(node_info=node_info)
         self.mock_agent.process_lookup_data.assert_called_once_with(node_info)
         self.assertEqual('SUCCEEDED', result.command_status)
@@ -51,8 +50,7 @@ class TestPollExtension(base.IronicAgentTest):
     def test_set_node_info_not_standalone(self):
         self.mock_agent.standalone = False
         node_info = {'node': {'uuid': 'fake-node', 'properties': {}},
-                     'config': {'agent_token_required': True,
-                                'agent_token': 'blah' * 8}}
+                     'config': {'agent_token': 'blah' * 8}}
         self.assertRaises(errors.InvalidCommandError,
                           self.agent_extension.set_node_info,
                           node_info=node_info)
diff --git a/ironic_python_agent/tests/unit/test_agent.py b/ironic_python_agent/tests/unit/test_agent.py
index 231c74ef1..ced7c3915 100644
--- a/ironic_python_agent/tests/unit/test_agent.py
+++ b/ironic_python_agent/tests/unit/test_agent.py
@@ -465,7 +465,6 @@ class TestBaseAgent(ironic_agent_base.IronicAgentTest):
             'config': {
                 'heartbeat_timeout': 300,
                 'agent_token': '1' * 128,
-                'agent_token_required': True
             }
         }
 
@@ -1357,7 +1356,6 @@ class TestBaseAgentVMediaToken(ironic_agent_base.IronicAgentTest):
     def test_run_agent_token_vmedia(self, mock_get_managers, mock_wsgi,
                                     mock_wait, mock_dispatch):
         CONF.set_override('inspection_callback_url', '')
-
         wsgi_server = mock_wsgi.return_value
 
         def set_serve_api():
@@ -1373,11 +1371,11 @@ class TestBaseAgentVMediaToken(ironic_agent_base.IronicAgentTest):
             'config': {
                 'heartbeat_timeout': 300,
                 'agent_token': '********',
-                'agent_token_required': True
             }
         }
 
         self.agent.run()
+        self.assertFalse(self.agent.lockdown)
 
         mock_wsgi.assert_called_once_with(CONF, 'ironic-python-agent',
                                           app=self.agent.api,
diff --git a/releasenotes/notes/remove-agent-token-required-808e99b83b4456a1.yaml b/releasenotes/notes/remove-agent-token-required-808e99b83b4456a1.yaml
new file mode 100644
index 000000000..e727c831d
--- /dev/null
+++ b/releasenotes/notes/remove-agent-token-required-808e99b83b4456a1.yaml
@@ -0,0 +1,9 @@
+---
+security:
+  - |
+    The ``agent_token_required`` configuration option has been removed.
+    This was a knob to help ease the upgrade process by enabling operators
+    to express if their environment was requiring an agent token. This was
+    key to help navigate possible upgrade cases, however that was for the
+    migration *to* the Victoria release, and such an upgrade is outside
+    of the version support matrix of Ironic.