diff --git a/core/modules/views/lib/Drupal/views/Tests/Plugin/ArgumentValidatorTest.php b/core/modules/views/lib/Drupal/views/Tests/Plugin/ArgumentValidatorTest.php
index c22efac..8fc8759 100644
--- a/core/modules/views/lib/Drupal/views/Tests/Plugin/ArgumentValidatorTest.php
+++ b/core/modules/views/lib/Drupal/views/Tests/Plugin/ArgumentValidatorTest.php
@@ -9,6 +9,8 @@
 
 use Drupal\views\Tests\ViewUnitTestBase;
 
+use Drupal\views_test_data\Plugin\views\argument_validator\ArgumentValidatorTest as ArgumentValidatorTestPlugin;
+
 /**
  * Tests Views argument validators.
  */
@@ -19,7 +21,14 @@ class ArgumentValidatorTest extends ViewUnitTestBase {
    *
    * @var array
    */
-  public static $testViews = array('test_view_argument_validate_php', 'test_view_argument_validate_numeric');
+  public static $testViews = array('test_view_argument_validate_php', 'test_view_argument_validate_numeric', 'test_view');
+
+  /**
+   * Modules to enable.
+   *
+   * @var array
+   */
+  public static $modules = array('test_views_data');
 
   public static function getInfo() {
     return array(
@@ -51,4 +60,36 @@ function testArgumentValidateNumeric() {
     $this->assertTrue($view->argument['null']->validateArgument(12));
   }
 
+  /**
+   * Tests the argument validator test plugin.
+   *
+   * @see \Drupal\views_test_data\Plugin\views\argument_validator\ArgumentValidatorTest
+   */
+  public function testArgumentValidatorPlugin() {
+    $view = views_get_view('test_view');
+
+    // Add a new argument and set the test plugin for the argument_validator.
+    $options = array(
+      'specify_validation' => TRUE,
+      'validate' => array(
+        'type' => 'argument_validator_test'
+      )
+    );
+    $id = $view->addItem('default', 'argument', 'views_test_data', 'name', $options);
+    $view->initHandlers();
+    $argument = $view->argument[$id];
+    $test_value = $argument->options['validate_options']['test_value'] = $this->randomName();
+
+    $plugin = $argument->get_plugin('argument_validator');
+    $this->assertTrue($plugin instanceof ArgumentValidatorTestPlugin, 'The correct argument validator plugin is used.');
+
+    $this->assertFalse($plugin->validate_argument($this->randomName()), 'A random value does not validate');
+    $this->assertFalse($argument->validateArgument($this->randomName()), 'A random value does not validate');
+    $this->assertTrue($plugin->validate_argument($test_value), 'A proper argument validates.');
+
+    // Reset internal flag.
+    $argument->argument_validated = NULL;
+    $this->assertTrue($argument->validateArgument($test_value), 'A proper argument validates.');
+  }
+
 }
diff --git a/core/modules/views/lib/Drupal/views/Tests/UI/ArgumentValidatorTest.php b/core/modules/views/lib/Drupal/views/Tests/UI/ArgumentValidatorTest.php
new file mode 100644
index 0000000..56ea5df
--- /dev/null
+++ b/core/modules/views/lib/Drupal/views/Tests/UI/ArgumentValidatorTest.php
@@ -0,0 +1,56 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\views\Tests\UI\ArgumentValidatorTest.
+ */
+
+namespace Drupal\views\Tests\UI;
+
+/**
+ * Tests Views UI for argument validators.
+ */
+class ArgumentValidatorTest extends UITestBase {
+
+  /**
+   * Views used by this test.
+   *
+   * @var array
+   */
+  public static $testViews = array('test_argument');
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Argument validator: UI',
+      'group' => 'Views UI',
+      'description' => 'Tests Views UI for argument validators.',
+    );
+  }
+
+  /**
+   * Tests the UI of the generic argument validator.
+   */
+  public function testArgumentValidatorUI() {
+    $argument_settings_path = "admin/structure/views/nojs/config-item/test_argument/default/argument/id";
+    $this->drupalGet($argument_settings_path);
+
+    $this->assertOption('edit-options-validate-type', 'argument_validator_test', 'The test validator plugin appears.');
+
+    $random_value = $this->randomName();
+    $edit = array(
+      'options[validate][type]' => 'argument_validator_test',
+      'options[validate][options][argument_validator_test][test_value]' => $random_value,
+    );
+    $this->drupalPost(NULL, $edit, t('Apply'));
+    $this->drupalPost(NULL, array(), t('Save'));
+
+    $view = views_get_view('test_argument');
+    $view->initHandlers();
+    $this->assertFalse($view->argument['id']->validate_argument($this->randomName()), 'The test argument validator denies everything beside a specific value');
+    // Reset saved argument validation.
+    $view->argument['id']->argument_validated = NULL;
+    // Now pass in a valid value to be sure the process of safe works fine.
+    $this->assertTrue($view->argument['id']->validate_argument($random_value), 'The test argument validator accepts the valid value.');
+  }
+
+}
diff --git a/core/modules/views/tests/views_test_config/test_views/views.view.test_argument.yml b/core/modules/views/tests/views_test_config/test_views/views.view.test_argument.yml
new file mode 100644
index 0000000..54cbc2d
--- /dev/null
+++ b/core/modules/views/tests/views_test_config/test_views/views.view.test_argument.yml
@@ -0,0 +1,43 @@
+api_version: '3.0'
+base_table: views_test_data
+core: 8
+disabled: false
+display:
+  default:
+    display_options:
+      access:
+        type: perm
+      cache:
+        type: none
+      exposed_form:
+        type: basic
+      fields:
+        name:
+          alter:
+            ellipsis: '0'
+            word_boundary: '0'
+          field: name
+          id: name
+          label: ''
+          table: views_test_data
+          plugin_id: string
+      arguments:
+        id:
+          field: id
+          id: id
+          table: views_test_data
+          plugin_id: numeric
+      query:
+        type: views_query
+      use_more_always: '0'
+      style:
+        type: default
+      row:
+        type: fields
+    display_plugin: default
+    display_title: Master
+    id: default
+    position: '0'
+human_name: ''
+id: test_argument
+tag: ''
diff --git a/core/modules/views/tests/views_test_data/lib/Drupal/views_test_data/Plugin/views/argument_validator/ArgumentValidatorTest.php b/core/modules/views/tests/views_test_data/lib/Drupal/views_test_data/Plugin/views/argument_validator/ArgumentValidatorTest.php
new file mode 100644
index 0000000..8e07bc9
--- /dev/null
+++ b/core/modules/views/tests/views_test_data/lib/Drupal/views_test_data/Plugin/views/argument_validator/ArgumentValidatorTest.php
@@ -0,0 +1,55 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\views\Plugin\views\argument_validator\ArgumentValidatorTest.
+ */
+
+namespace Drupal\views_test_data\Plugin\views\argument_validator;
+
+use Drupal\views\Plugin\views\argument_validator\ArgumentValidatorPluginBase;
+use Drupal\Core\Annotation\Plugin;
+use Drupal\Core\Annotation\Translation;
+
+/**
+ * Defines a argument validator test plugin.
+ *
+ * @ingroup views_argument_validate_plugins
+ *
+ * @Plugin(
+ *   id = "argument_validator_test",
+ *   title = @Translation("Argument validator test")
+ * )
+ */
+class ArgumentValidatorTest extends ArgumentValidatorPluginBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function defineOptions() {
+    $options = parent::defineOptions();
+    $options['test_value'] = array('default' => '');
+
+    return $options;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function buildOptionsForm(&$form, &$form_state) {
+    parent::buildOptionsForm($form, $form_state);
+
+    $form['test_value'] = array(
+      '#type' => 'textfield',
+      '#default_value' => $this->options['test_value'],
+    );
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  function validate_argument($arg) {
+    return $arg == $this->options['test_value'];
+  }
+
+}
