diff --git a/core/modules/views/src/Entity/View.php b/core/modules/views/src/Entity/View.php
index 3f13b6de9cfab582848c48cb0facf99f7c4e801e..1db000edb1e924dce5bd13d61aa823e6173a3c6d 100644
--- a/core/modules/views/src/Entity/View.php
+++ b/core/modules/views/src/Entity/View.php
@@ -2,16 +2,17 @@
 
 namespace Drupal\views\Entity;
 
-use Drupal\Core\Entity\Attribute\ConfigEntityType;
-use Drupal\Core\StringTranslation\TranslatableMarkup;
 use Drupal\Component\Utility\NestedArray;
 use Drupal\Core\Cache\Cache;
+use Drupal\Core\Config\Action\Attribute\ActionMethod;
 use Drupal\Core\Config\Entity\ConfigEntityBase;
+use Drupal\Core\Entity\Attribute\ConfigEntityType;
 use Drupal\Core\Entity\EntityStorageInterface;
 use Drupal\Core\Language\LanguageInterface;
+use Drupal\Core\StringTranslation\TranslatableMarkup;
 use Drupal\views\Plugin\DependentWithRemovalPluginInterface;
-use Drupal\views\Views;
 use Drupal\views\ViewEntityInterface;
+use Drupal\views\Views;
 
 /**
  * Defines a View configuration entity class.
@@ -145,6 +146,7 @@ public function label() {
   /**
    * {@inheritdoc}
    */
+  #[ActionMethod(adminLabel: new TranslatableMarkup('Add display'))]
   public function addDisplay($plugin_id = 'page', $title = NULL, $id = NULL) {
     if (empty($plugin_id)) {
       return FALSE;
@@ -232,6 +234,7 @@ public function &getDisplay($display_id) {
   /**
    * {@inheritdoc}
    */
+  #[ActionMethod(adminLabel: new TranslatableMarkup('Duplicate display as type'), pluralize: FALSE)]
   public function duplicateDisplayAsType($old_display_id, $new_display_type) {
     $executable = $this->getExecutable();
     $display = $executable->newDisplay($new_display_type);
diff --git a/core/modules/views/src/Plugin/ConfigAction/SetDisplayOption.php b/core/modules/views/src/Plugin/ConfigAction/SetDisplayOption.php
new file mode 100644
index 0000000000000000000000000000000000000000..d4a518249557e78f7737bd5bfcffb2a8454e3c06
--- /dev/null
+++ b/core/modules/views/src/Plugin/ConfigAction/SetDisplayOption.php
@@ -0,0 +1,148 @@
+<?php
+
+namespace Drupal\views\Plugin\ConfigAction;
+
+use Drupal\Core\Config\Action\Attribute\ConfigAction;
+use Drupal\Core\Config\Action\ConfigActionException;
+use Drupal\Core\Config\Action\ConfigActionPluginInterface;
+use Drupal\Core\Config\ConfigManagerInterface;
+use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
+use Drupal\Core\StringTranslation\TranslatableMarkup;
+use Drupal\views\ViewEntityInterface;
+use Drupal\views\ViewExecutable;
+use Symfony\Component\DependencyInjection\ContainerInterface;
+
+/**
+ * Config action for setting display option.
+ */
+#[ConfigAction(
+  id: 'view:setDisplayOption',
+  admin_label: new TranslatableMarkup('Views: Set Display Option'),
+  entity_types: ['view'],
+)]
+class SetDisplayOption implements ConfigActionPluginInterface, ContainerFactoryPluginInterface {
+
+  /**
+   * Constructs instance of ViewsDisplayOptionBase.
+   *
+   * @param \Drupal\Core\Config\ConfigManagerInterface $configManager
+   *   The configuration manager.
+   */
+  public function __construct(
+    protected readonly ConfigManagerInterface $configManager,
+  ) {
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
+    return new static($container->get('config.manager'));
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function apply(string $configName, mixed $value): void {
+    assert(is_array($value));
+    if (!array_is_list($value)) {
+      $value = [$value];
+    }
+    // Load the views executable.
+    $entity = $this->configManager->loadConfigEntityByName($configName);
+    if (empty($entity)) {
+      throw new ConfigActionException(sprintf('View %s does not exist', $configName));
+    }
+    if (!$entity instanceof ViewEntityInterface) {
+      throw new ConfigActionException(sprintf('%s is not view', $configName));
+    }
+    $view = $entity->getExecutable();
+    array_walk($value, [$this, 'applySingle'], $view);
+    $errors = $view->validate();
+    if (!empty($errors)) {
+      throw new ConfigActionException(sprintf('Validation of the view ended with following errors: %s', implode(', ', $errors)));
+    }
+    $view->save();
+  }
+
+  /**
+   * Configure view display option.
+   *
+   * {@inheritdoc}
+   */
+  protected function applySingle(array $value, int $key, ViewExecutable $view): void {
+    if (empty($value)) {
+      throw new ConfigActionException(sprintf('View %s cannot be updated because no option settings were provided', $view->id()));
+    }
+    if (empty($value['option'])) {
+      throw new ConfigActionException('No option provided');
+    }
+    $option = $value['option'];
+    if (empty($value['settings'])) {
+      throw new ConfigActionException('No settings provided');
+    }
+    $settings = $value['settings'];
+    $item = FALSE;
+    if (!empty($value['item'])) {
+      $item = $value['item'];
+    }
+    $display_id = 'default';
+    if (!empty($value['display_id'])) {
+      $display_id = $value['display_id'];
+    }
+    $override = FALSE;
+    if (isset($value['override'])) {
+      $override = (bool) $value['override'];
+    }
+    $allow_update = TRUE;
+    if (isset($value['allow_update'])) {
+      $allow_update = (bool) $value['allow_update'];
+    }
+    $view->setDisplay($display_id);
+    if ($item) {
+      $option_settings = $view->displayHandlers->get($display_id)->getOption($option);
+      if (!empty($option_settings[$item]) && !$allow_update) {
+        throw new ConfigActionException(sprintf('Item %s already exists in %s display for %s', $item, $display_id, $option));
+      }
+      // Check if the item needs to be placed in a specific position. This will
+      // help in case a field or filter needs to be added not to the end of the
+      // list.
+      if (!empty($value['item_sibling'])) {
+        $sibling = $value['item_sibling'];
+        if (!empty($value['position']) && in_array($value['position'], ['before', 'after'])) {
+          $position = $value['position'];
+        }
+        else {
+          $position = 'after';
+        }
+        $key_pos = array_search($sibling, array_keys($option_settings));
+        if ($key_pos !== FALSE) {
+          if ($position == 'after') {
+            $key_pos++;
+          }
+          if ($key_pos > 0) {
+            $second_array = array_splice($option_settings, $key_pos);
+            $settings = array_merge($option_settings, [$item => $settings], $second_array);
+          }
+          else {
+            $settings = array_merge([$item => $settings], $option_settings);
+          }
+        }
+        else {
+          throw new ConfigActionException(sprintf('Item sibling %s does not exist', $sibling));
+        }
+      }
+      else {
+        $option_settings[$item] = $settings;
+        $settings = $option_settings;
+      }
+    }
+    if ($override) {
+      $view->displayHandlers->get($display_id)->overrideOption($option, $settings);
+    }
+    else {
+      $view->displayHandlers->get($display_id)->setOption($option, $settings);
+    }
+  }
+
+}
diff --git a/core/modules/views/tests/src/Kernel/Plugin/ConfigAction/SetDisplayOptionConfigActionTest.php b/core/modules/views/tests/src/Kernel/Plugin/ConfigAction/SetDisplayOptionConfigActionTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..d4741e97ac8865165bf78e6c8f03db3187c88268
--- /dev/null
+++ b/core/modules/views/tests/src/Kernel/Plugin/ConfigAction/SetDisplayOptionConfigActionTest.php
@@ -0,0 +1,214 @@
+<?php
+
+declare(strict_types=1);
+
+namespace Drupal\Tests\views\Kernel\Plugin\ConfigAction;
+
+use Drupal\Core\Config\Action\ConfigActionException;
+use Drupal\Tests\views\Kernel\ViewsKernelTestBase;
+use Drupal\views\Views;
+
+/**
+ * @covers \Drupal\views\Plugin\ConfigAction\SetDisplayOption
+ *
+ * @group Recipe
+ * @group views
+ */
+class SetDisplayOptionConfigActionTest extends ViewsKernelTestBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  public static $testViews = ['entity_test_fields'];
+
+  /**
+   * Tests changing of view pager.
+   */
+  public function testSetViewsPager() : void {
+    $view = Views::getView('entity_test_fields');
+    $view->setDisplay();
+    $pager = $view->displayHandlers->get('default')->getOption('pager');
+    // Check that pager type is full.
+    $this->assertSame('full', $pager['type']);
+    // Apply config action that set pager to mini for default display.
+    $config_action_settings = [
+      'option' => 'pager',
+      'settings' => [
+        'type' => 'mini',
+        'options' => [
+          'items_per_page' => 5,
+        ],
+      ],
+    ];
+    $this->container->get('plugin.manager.config_action')->applyAction('setDisplayOption', 'views.view.entity_test_fields', $config_action_settings);
+    $view = Views::getView('entity_test_fields');
+    $view->setDisplay();
+    $pager = $view->displayHandlers->get('default')->getOption('pager');
+    // Check that pager type is mini.
+    $this->assertSame('mini', $pager['type']);
+  }
+
+  /**
+   * Tests adding a field to a default display.
+   */
+  public function testAddFieldToDefaultDisplay() : void {
+    $view = Views::getView('entity_test_fields');
+    $view->setDisplay();
+    $fields = $view->displayHandlers->get('default')->getOption('fields');
+    // Check that field type is not part of default display.
+    $this->assertArrayNotHasKey('type', $fields);
+    // Apply config action that adds field type to default display.
+    $config_action_settings = [
+      'option' => 'fields',
+      'item' => 'type',
+      'settings' => [
+        'id' => 'type',
+        'table' => 'entity_test',
+        'field' => 'type',
+        'entity_type' => 'entity_test',
+        'entity_field' => 'type',
+        'plugin_id' => 'field',
+        'exclude' => FALSE,
+        'alter' => [
+          'alter_text' => FALSE,
+        ],
+        'element_class' => '',
+        'empty' => '',
+        'hide_empty' => FALSE,
+        'empty_zero' => FALSE,
+        'hide_alter_empty' => TRUE,
+      ],
+    ];
+    $this->container->get('plugin.manager.config_action')->applyAction('setDisplayOption', 'views.view.entity_test_fields', $config_action_settings);
+    $view = Views::getView('entity_test_fields');
+    $view->setDisplay();
+    $fields = $view->displayHandlers->get('default')->getOption('fields');
+    // Check that field type now exists.
+    $this->assertArrayHasKey('type', $fields);
+    // Try to apply the action again without allow_update flag.
+    $this->expectException(ConfigActionException::class);
+    $this->expectExceptionMessage('Item type already exists in default display for fields');
+    $config_action_settings['allow_update'] = FALSE;
+    $this->container->get('plugin.manager.config_action')->applyAction('setDisplayOption', 'views.view.entity_test_fields', $config_action_settings);
+  }
+
+  /**
+   * Tests adding multiple fields to a default display.
+   */
+  public function testAddMultipleFieldsToDefaultDisplay() : void {
+    $view = Views::getView('entity_test_fields');
+    $view->setDisplay();
+    $fields = $view->displayHandlers->get('default')->getOption('fields');
+    // Check that field type is not part of default display.
+    $this->assertArrayNotHasKey('type', $fields);
+    // Check that field user_id is not part of default display.
+    $this->assertArrayNotHasKey('user_id', $fields);
+    // Apply config action that adds field type to default display.
+    $config_action_settings = [
+      [
+        'option' => 'fields',
+        'item' => 'user_id',
+        'settings' => [
+          'id' => 'user_id',
+          'table' => 'entity_test',
+          'field' => 'user_id',
+          'plugin_id' => 'field',
+          'entity_type' => 'entity_test',
+          'entity_field' => 'user_id',
+        ],
+      ],
+      [
+        'option' => 'fields',
+        'item' => 'type',
+        'item_sibling' => 'name',
+        'position' => 'before',
+        'settings' => [
+          'id' => 'type',
+          'table' => 'entity_test',
+          'field' => 'type',
+          'entity_type' => 'entity_test',
+          'entity_field' => 'type',
+          'plugin_id' => 'field',
+          'exclude' => FALSE,
+          'alter' => [
+            'alter_text' => FALSE,
+          ],
+          'element_class' => '',
+          'empty' => '',
+          'hide_empty' => FALSE,
+          'empty_zero' => FALSE,
+          'hide_alter_empty' => TRUE,
+        ],
+      ],
+    ];
+    $this->container->get('plugin.manager.config_action')->applyAction('setDisplayOption', 'views.view.entity_test_fields', $config_action_settings);
+    $view = Views::getView('entity_test_fields');
+    $view->setDisplay();
+    $fields = $view->displayHandlers->get('default')->getOption('fields');
+    // Check that field type now exists.
+    $this->assertArrayHasKey('type', $fields);
+    // Check that field user_id now exists.
+    $this->assertArrayHasKey('user_id', $fields);
+    // Check that type field is above name.
+    $name_position = array_search('name', array_keys($fields));
+    $type_position = array_search('type', array_keys($fields));
+    $this->assertGreaterThan($type_position, $name_position);
+  }
+
+  /**
+   * Tests adding field to a new display with override.
+   */
+  public function testAddFieldToOverriddenDisplay() : void {
+    $view = Views::getView('entity_test_fields');
+    $view->setDisplay();
+    $fields = $view->displayHandlers->get('default')->getOption('fields');
+    // Check that field type is not part of default display.
+    $this->assertArrayNotHasKey('type', $fields);
+    // Create a new display.
+    $config_action_settings = [
+      'old_display_id' => 'default',
+      'new_display_type' => 'block',
+    ];
+    $this->container->get('plugin.manager.config_action')->applyAction('duplicateDisplayAsType', 'views.view.entity_test_fields', $config_action_settings);
+    $view = Views::getView('entity_test_fields');
+    $view->setDisplay();
+    // Confirm that new display was created.
+    $this->assertTrue($view->displayHandlers->has('block_1'));
+    // Apply config action that adds field type to page_1 display only.
+    $config_action_settings = [
+      'display_id' => 'block_1',
+      'option' => 'fields',
+      'item' => 'type',
+      'override' => TRUE,
+      'settings' => [
+        'id' => 'type',
+        'table' => 'entity_test',
+        'field' => 'type',
+        'entity_type' => 'entity_test',
+        'entity_field' => 'type',
+        'plugin_id' => 'field',
+        'exclude' => FALSE,
+        'alter' => [
+          'alter_text' => FALSE,
+        ],
+        'element_class' => '',
+        'empty' => '',
+        'hide_empty' => FALSE,
+        'empty_zero' => FALSE,
+        'hide_alter_empty' => TRUE,
+      ],
+    ];
+    $this->container->get('plugin.manager.config_action')->applyAction('setDisplayOption', 'views.view.entity_test_fields', $config_action_settings);
+    // Check that field was added to page_3 and not to default.
+    $view = Views::getView('entity_test_fields');
+    $view->setDisplay();
+    $fields = $view->displayHandlers->get('default')->getOption('fields');
+    // Check that field type is not part of default display.
+    $this->assertArrayNotHasKey('type', $fields);
+    $view->setDisplay('block_1');
+    $fields = $view->displayHandlers->get('block_1')->getOption('fields');
+    // Check that field type is not part of default display.
+    $this->assertArrayHasKey('type', $fields);
+  }
+
+}
