diff --git a/core/misc/dialog/dialog.ajax.es6.js b/core/misc/dialog/dialog.ajax.es6.js
index 8dca3720..8ed4f014 100644
--- a/core/misc/dialog/dialog.ajax.es6.js
+++ b/core/misc/dialog/dialog.ajax.es6.js
@@ -125,9 +125,30 @@
     response.method = 'html';
     ajax.commands.insert(ajax, response, status);

-    // Move the buttons to the jQuery UI dialog buttons area.
-    if (!response.dialogOptions.buttons) {
+    response.dialogOptions = response.dialogOptions || {};
+
+    // By default drupalAutoButtons is true.
+    if (typeof response.dialogOptions.drupalAutoButtons === 'undefined') {
       response.dialogOptions.drupalAutoButtons = true;
+    } else if (response.dialogOptions.drupalAutoButtons === 'false') {
+      // Boolean 'false' values in Ajax post parameters are interpreted
+      // as string literals in Drupal\Core\Render\MainContent\DialogRenderer and
+      // need to be converted back to boolean false.
+      // @see https://www.drupal.org/project/drupal/issues/3014136
+      // @see https://www.drupal.org/project/drupal/issues/2793343
+      response.dialogOptions.drupalAutoButtons = false;
+    } else {
+      // Force boolean value.
+      response.dialogOptions.drupalAutoButtons =
+        !!response.dialogOptions.drupalAutoButtons;
+    }
+
+    // If drupalAutoButtons is true and the buttons option is not explicity set,
+    // move any form action buttons to the jQuery UI dialog buttons area.
+    if (
+      !response.dialogOptions.buttons &&
+      response.dialogOptions.drupalAutoButtons
+    ) {
       response.dialogOptions.buttons =
         Drupal.behaviors.dialog.prepareDialogButtons($dialog);
     }
@@ -139,7 +160,6 @@
     });

     // Open the dialog itself.
-    response.dialogOptions = response.dialogOptions || {};
     const dialog = Drupal.dialog($dialog.get(0), response.dialogOptions);
     if (response.dialogOptions.modal) {
       dialog.showModal();
diff --git a/core/misc/dialog/dialog.ajax.js b/core/misc/dialog/dialog.ajax.js
index 39438be1..e1796f55 100644
--- a/core/misc/dialog/dialog.ajax.js
+++ b/core/misc/dialog/dialog.ajax.js
@@ -64,15 +64,21 @@
     response.command = 'insert';
     response.method = 'html';
     ajax.commands.insert(ajax, response, status);
-    if (!response.dialogOptions.buttons) {
+    response.dialogOptions = response.dialogOptions || {};
+    if (typeof response.dialogOptions.drupalAutoButtons === 'undefined') {
       response.dialogOptions.drupalAutoButtons = true;
+    } else if (response.dialogOptions.drupalAutoButtons === 'false') {
+      response.dialogOptions.drupalAutoButtons = false;
+    } else {
+      response.dialogOptions.drupalAutoButtons = !!response.dialogOptions.drupalAutoButtons;
+    }
+    if (!response.dialogOptions.buttons && response.dialogOptions.drupalAutoButtons) {
       response.dialogOptions.buttons = Drupal.behaviors.dialog.prepareDialogButtons($dialog);
     }
     $dialog.on('dialogButtonsChange', function () {
       var buttons = Drupal.behaviors.dialog.prepareDialogButtons($dialog);
       $dialog.dialog('option', 'buttons', buttons);
     });
-    response.dialogOptions = response.dialogOptions || {};
     var dialog = Drupal.dialog($dialog.get(0), response.dialogOptions);
     if (response.dialogOptions.modal) {
       dialog.showModal();
@@ -107,4 +113,4 @@
   $(window).on('dialog:beforeclose', function (e, dialog, $element) {
     $element.off('.dialog');
   });
-})(jQuery, Drupal);
\ No newline at end of file
+})(jQuery, Drupal);
diff --git a/core/modules/system/tests/modules/dialog_renderer_test/dialog_renderer_test.routing.yml b/core/modules/system/tests/modules/dialog_renderer_test/dialog_renderer_test.routing.yml
index c1358248..20efc9dd 100644
--- a/core/modules/system/tests/modules/dialog_renderer_test/dialog_renderer_test.routing.yml
+++ b/core/modules/system/tests/modules/dialog_renderer_test/dialog_renderer_test.routing.yml
@@ -29,3 +29,11 @@ dialog_renderer_test.modal_content_input:
     _title: 'Thing 3'
   requirements:
     _access: 'TRUE'
+
+dialog_renderer_test.modal_form:
+  path: '/dialog_renderer-form'
+  defaults:
+    _form: '\Drupal\dialog_renderer_test\Form\TestForm'
+    _title: 'Modal Form'
+  requirements:
+    _access: 'TRUE'
diff --git a/core/modules/system/tests/modules/dialog_renderer_test/src/Controller/TestController.php b/core/modules/system/tests/modules/dialog_renderer_test/src/Controller/TestController.php
index 469e35a1..37d69d65 100644
--- a/core/modules/system/tests/modules/dialog_renderer_test/src/Controller/TestController.php
+++ b/core/modules/system/tests/modules/dialog_renderer_test/src/Controller/TestController.php
@@ -186,6 +186,54 @@ public function linksDisplay() {
           ],
         ],
       ],
+      'auto_buttons_default' => [
+        '#title' => 'Auto buttons default!',
+        '#type' => 'link',
+        '#url' => Url::fromRoute('dialog_renderer_test.modal_form'),
+        '#attributes' => [
+          'class' => ['use-ajax'],
+          'data-dialog-type' => 'dialog',
+        ],
+        '#attached' => [
+          'library' => [
+            'core/drupal.ajax',
+          ],
+        ],
+      ],
+      'auto_buttons_false' => [
+        '#title' => 'Auto buttons false!',
+        '#type' => 'link',
+        '#url' => Url::fromRoute('dialog_renderer_test.modal_form'),
+        '#attributes' => [
+          'class' => ['use-ajax'],
+          'data-dialog-type' => 'dialog',
+          'data-dialog-options' => Json::encode([
+            'drupalAutoButtons' => FALSE,
+          ]),
+        ],
+        '#attached' => [
+          'library' => [
+            'core/drupal.ajax',
+          ],
+        ],
+      ],
+      'auto_buttons_true' => [
+        '#title' => 'Auto buttons true!',
+        '#type' => 'link',
+        '#url' => Url::fromRoute('dialog_renderer_test.modal_form'),
+        '#attributes' => [
+          'class' => ['use-ajax'],
+          'data-dialog-type' => 'dialog',
+          'data-dialog-options' => Json::encode([
+            'drupalAutoButtons' => TRUE,
+          ]),
+        ],
+        '#attached' => [
+          'library' => [
+            'core/drupal.ajax',
+          ],
+        ],
+      ],
     ];
   }

diff --git a/core/modules/system/tests/src/FunctionalJavascript/ModalRendererTest.php b/core/modules/system/tests/src/FunctionalJavascript/ModalRendererTest.php
index 0760f704..743b38dc 100644
--- a/core/modules/system/tests/src/FunctionalJavascript/ModalRendererTest.php
+++ b/core/modules/system/tests/src/FunctionalJavascript/ModalRendererTest.php
@@ -74,6 +74,29 @@ public function testModalRenderer() {
     // Tabbable should focus the item with autofocus inside button pane.
     $this->assertJsCondition('document.activeElement === tabbable.tabbable(document.querySelector(".ui-dialog .ui-dialog-content"))[1]');
     $this->assertJsCondition('document.activeElement === document.querySelector(".ui-dialog .form-text")');
+
+    // By default, buttons within "action" form elements are changed to jQuery
+    // ui buttons and moved into the 'ui-dialog-buttonpane' container.
+    $this->drupalGet('/dialog_renderer-test-links');
+    $this->clickLink('Auto buttons default!');
+    $session_assert->assertWaitOnAjaxRequest();
+    $session_assert->elementExists('css', '.ui-dialog-buttonpane .ui-dialog-buttonset .js-form-submit');
+
+    // When the drupalAutoButtons option is false, buttons SHOULD NOT be moved
+    // into the 'ui-dialog-buttonpane' container.
+    $this->drupalGet('/dialog_renderer-test-links');
+    $this->clickLink('Auto buttons false!');
+    $session_assert->assertWaitOnAjaxRequest();
+    $session_assert->elementExists('css', '.form-actions');
+    $session_assert->elementNotExists('css', '.ui-dialog-buttonpane');
+
+    // When the drupalAutoButtons option is true, buttons SHOULD be moved
+    // into the 'ui-dialog-buttonpane' container.
+    $this->drupalGet('/dialog_renderer-test-links');
+    $this->clickLink('Auto buttons true!');
+    $session_assert->assertWaitOnAjaxRequest();
+    $session_assert->elementExists('css', '.ui-dialog-buttonpane .ui-dialog-buttonset .js-form-submit');
+
   }

 }
