diff --git a/core/modules/action/lib/Drupal/action/Plugin/views/field/BulkForm.php b/core/modules/action/lib/Drupal/action/Plugin/views/field/BulkForm.php
index 3d9f92e..631ece7 100644
--- a/core/modules/action/lib/Drupal/action/Plugin/views/field/BulkForm.php
+++ b/core/modules/action/lib/Drupal/action/Plugin/views/field/BulkForm.php
@@ -15,102 +15,4 @@
  *
  * @PluginID("action_bulk_form")
  */
-class BulkForm extends BulkFormBase {
-
-  /**
-   * Overrides \Drupal\views\Plugin\views\field\FieldPluginBase::defineOptions().
-   */
-  protected function defineOptions() {
-    $options = parent::defineOptions();
-    $options['include_exclude'] = array(
-      'default' => 'exclude',
-    );
-    $options['selected_actions'] = array(
-      'default' => array(),
-    );
-    return $options;
-  }
-
-  /**
-   * Overrides \Drupal\views\Plugin\views\field\FieldPluginBase::buildOptionsForm().
-   */
-  public function buildOptionsForm(&$form, &$form_state) {
-    parent::buildOptionsForm($form, $form_state);
-
-    $form['include_exclude'] = array(
-      '#type' => 'radios',
-      '#title' => t('Available actions'),
-      '#options' => array(
-        'exclude' => t('All actions, except selected'),
-        'include' => t('Only selected actions'),
-      ),
-      '#default_value' => $this->options['include_exclude'],
-    );
-    $form['selected_actions'] = array(
-      '#type' => 'checkboxes',
-      '#title' => t('Selected actions'),
-      '#options' => $this->getBulkOptions(FALSE),
-      '#default_value' => $this->options['selected_actions'],
-    );
-  }
-
-  /**
-   * Overrides \Drupal\views\Plugin\views\PluginBase::buildOptionsForm().
-   */
-  public function validateOptionsForm(&$form, &$form_state) {
-    parent::validateOptionsForm($form, $form_state);
-
-    $form_state['values']['options']['selected_actions'] = array_filter($form_state['values']['options']['selected_actions']);
-  }
-
-  /**
-   * Implements \Drupal\system\Plugin\views\field\BulkFormBase::getBulkOptions().
-   *
-   * @param bool $filtered
-   *   (optional) Whether to filter actions to selected actions.
-   */
-  protected function getBulkOptions($filtered = TRUE) {
-    // Get all available actions.
-    $entity_type = $this->getEntityType();
-    $options = array();
-    // Filter the action list.
-    foreach ($this->actions as $id => $action) {
-      if ($filtered) {
-        $in_selected = in_array($id, $this->options['selected_actions']);
-        // If the field is configured to include only the selected actions,
-        // skip actions that were not selected.
-        if (($this->options['include_exclude'] == 'include') && !$in_selected) {
-          continue;
-        }
-        // Otherwise, if the field is configured to exclude the selected
-        // actions, skip actions that were selected.
-        elseif (($this->options['include_exclude'] == 'exclude') && $in_selected) {
-          continue;
-        }
-      }
-      // Only allow actions that are valid for this entity type.
-      if (($action->getType() == $entity_type)) {
-        $options[$id] = $action->label();
-      }
-    }
-
-    return $options;
-  }
-
-  /**
-   * Implements \Drupal\system\Plugin\views\field\BulkFormBase::views_form_submit().
-   */
-  public function views_form_submit(&$form, &$form_state) {
-    parent::views_form_submit($form, $form_state);
-    if ($form_state['step'] == 'views_form_views_form') {
-      $count = count(array_filter($form_state['values'][$this->options['id']]));
-      $action = $this->actions[$form_state['values']['action']];
-      if ($count) {
-        drupal_set_message(format_plural($count, '%action was applied to @count item.', '%action was applied to @count items.', array(
-          '%action' => $action->label(),
-        )));
-      }
-    }
-  }
-
-}
+class BulkForm extends BulkFormBase {}
diff --git a/core/modules/node/lib/Drupal/node/Plugin/views/field/NodeBulkForm.php b/core/modules/node/lib/Drupal/node/Plugin/views/field/NodeBulkForm.php
index 68441f6..7fecca1 100644
--- a/core/modules/node/lib/Drupal/node/Plugin/views/field/NodeBulkForm.php
+++ b/core/modules/node/lib/Drupal/node/Plugin/views/field/NodeBulkForm.php
@@ -34,16 +34,6 @@ public function __construct(array $configuration, $plugin_id, array $plugin_defi
   /**
    * {@inheritdoc}
    */
-  public function views_form_validate(&$form, &$form_state) {
-    $selected = array_filter($form_state['values'][$this->options['id']]);
-    if (empty($selected)) {
-      form_set_error('', t('No items selected.'));
-    }
-  }
-
-  /**
-   * {@inheritdoc}
-   */
   public function views_form_submit(&$form, &$form_state) {
     parent::views_form_submit($form, $form_state);
     if ($form_state['step'] == 'views_form_views_form') {
diff --git a/core/modules/system/lib/Drupal/system/Plugin/views/field/BulkFormBase.php b/core/modules/system/lib/Drupal/system/Plugin/views/field/BulkFormBase.php
index f7c5ea2..24c9d81 100644
--- a/core/modules/system/lib/Drupal/system/Plugin/views/field/BulkFormBase.php
+++ b/core/modules/system/lib/Drupal/system/Plugin/views/field/BulkFormBase.php
@@ -73,6 +73,52 @@ public function preRender(&$values) {
   }
 
   /**
+   * Overrides \Drupal\views\Plugin\views\field\FieldPluginBase::defineOptions().
+   */
+  protected function defineOptions() {
+    $options = parent::defineOptions();
+    $options['include_exclude'] = array(
+      'default' => 'exclude',
+    );
+    $options['selected_actions'] = array(
+      'default' => array(),
+    );
+    return $options;
+  }
+
+  /**
+   * Overrides \Drupal\views\Plugin\views\field\FieldPluginBase::buildOptionsForm().
+   */
+  public function buildOptionsForm(&$form, &$form_state) {
+    parent::buildOptionsForm($form, $form_state);
+
+    $form['include_exclude'] = array(
+      '#type' => 'radios',
+      '#title' => t('Available actions'),
+      '#options' => array(
+        'exclude' => t('All actions, except selected'),
+        'include' => t('Only selected actions'),
+      ),
+      '#default_value' => $this->options['include_exclude'],
+    );
+    $form['selected_actions'] = array(
+      '#type' => 'checkboxes',
+      '#title' => t('Selected actions'),
+      '#options' => $this->getBulkOptions(FALSE),
+      '#default_value' => $this->options['selected_actions'],
+    );
+  }
+
+  /**
+   * Overrides \Drupal\views\Plugin\views\HandlerBase::validateOptionsForm().
+   */
+  public function validateOptionsForm(&$form, &$form_state) {
+    parent::validateOptionsForm($form, $form_state);
+
+    $form_state['values']['options']['selected_actions'] = array_filter($form_state['values']['options']['selected_actions']);
+  }
+
+  /**
    * Form constructor for the bulk form.
    *
    * @param array $form
@@ -131,13 +177,37 @@ public function views_form(&$form, &$form_state) {
   /**
    * Returns the available operations for this form.
    *
+   * @param bool $filtered
+   *   (optional) Whether to filter actions to selected actions.
    * @return array
    *   An associative array of operations, suitable for a select element.
    */
-  protected function getBulkOptions() {
-    return array_map(function ($action) {
-      return $action->label();
-    }, $this->actions);
+  protected function getBulkOptions($filtered = TRUE) {
+    // Get all available actions.
+    $entity_type = $this->getEntityType();
+    $options = array();
+    // Filter the action list.
+    foreach ($this->actions as $id => $action) {
+      if ($filtered) {
+        $in_selected = in_array($id, $this->options['selected_actions']);
+        // If the field is configured to include only the selected actions,
+        // skip actions that were not selected.
+        if (($this->options['include_exclude'] == 'include') && !$in_selected) {
+          continue;
+        }
+        // Otherwise, if the field is configured to exclude the selected
+        // actions, skip actions that were selected.
+        elseif (($this->options['include_exclude'] == 'exclude') && $in_selected) {
+          continue;
+        }
+      }
+      // Only allow actions that are valid for this entity type.
+      if (($action->getType() == $entity_type)) {
+        $options[$id] = $action->label();
+      }
+    }
+
+    return $options;
   }
 
   /**
@@ -165,6 +235,25 @@ public function views_form_submit(&$form, &$form_state) {
       if (!empty($operation_definition['confirm_form_path'])) {
         $form_state['redirect'] = $operation_definition['confirm_form_path'];
       }
+
+      $count = count(array_filter($form_state['values'][$this->options['id']]));
+      $action = $this->actions[$form_state['values']['action']];
+      if ($count) {
+        drupal_set_message(format_plural($count, '%action was applied to @count item.', '%action was applied to @count items.', array(
+          '%action' => $action->label(),
+        )));
+      }
+
+    }
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function views_form_validate(&$form, &$form_state) {
+    $selected = array_filter($form_state['values'][$this->options['id']]);
+    if (empty($selected)) {
+      form_set_error('', t('No items selected.'));
     }
   }
 
diff --git a/core/modules/user/lib/Drupal/user/Plugin/views/field/UserBulkForm.php b/core/modules/user/lib/Drupal/user/Plugin/views/field/UserBulkForm.php
index a302a50..5530204 100644
--- a/core/modules/user/lib/Drupal/user/Plugin/views/field/UserBulkForm.php
+++ b/core/modules/user/lib/Drupal/user/Plugin/views/field/UserBulkForm.php
@@ -51,14 +51,4 @@ public function views_form(&$form, &$form_state) {
     }
   }
 
-  /**
-   * {@inheritdoc}
-   */
-  public function views_form_validate(&$form, &$form_state) {
-    $selected = array_filter($form_state['values'][$this->options['id']]);
-    if (empty($selected)) {
-      form_set_error('', t('No users selected.'));
-    }
-  }
-
 }
diff --git a/core/modules/user/lib/Drupal/user/Tests/Views/BulkFormTest.php b/core/modules/user/lib/Drupal/user/Tests/Views/BulkFormTest.php
index d2d42fc..dd5ab6b 100644
--- a/core/modules/user/lib/Drupal/user/Tests/Views/BulkFormTest.php
+++ b/core/modules/user/lib/Drupal/user/Tests/Views/BulkFormTest.php
@@ -42,7 +42,7 @@ public function testBulkForm() {
     $this->drupalPost('test-user-bulk-form', $edit, t('Apply'));
     // @todo Validation errors are only shown on page refresh.
     $this->drupalGet('test-user-bulk-form');
-    $this->assertText(t('No users selected.'));
+    $this->assertText(t('No items selected.'));
 
     // Assign a role to a user.
     $account = entity_load('user', $this->users[0]->id());
