diff --git a/core/modules/node/src/Plugin/views/argument_default/NodeChanged.php b/core/modules/node/src/Plugin/views/argument_default/NodeChanged.php
new file mode 100644
index 0000000..7c3a51d
--- /dev/null
+++ b/core/modules/node/src/Plugin/views/argument_default/NodeChanged.php
@@ -0,0 +1,76 @@
+<?php
+
+/**
+ * @file
+ * Contains Drupal\node\Plugin\views\argument_default\NodeChanged.
+ */
+
+namespace Drupal\node\Plugin\views\argument_default;
+
+use Drupal\views\Plugin\CacheablePluginInterface;
+use Drupal\views\Plugin\views\argument_default\Date;
+use Drupal\node\NodeInterface;
+use Symfony\Component\DependencyInjection\ContainerInterface;
+use Drupal\Core\Routing\RouteMatchInterface;
+
+/**
+ * The current node created argument default handler.
+ *
+ * @ingroup views_argument_default_plugins
+ *
+ * @ViewsArgumentDefault(
+ *   id = "node_changed",
+ *   title = @Translation("Current node changed time")
+ * )
+ */
+class NodeChanged extends Date implements CacheablePluginInterface {
+
+  /**
+   * The route match.
+   *
+   * @var \Drupal\Core\Routing\RouteMatchInterface
+   */
+  protected $routeMatch;
+
+  /**
+   * Constructs a new Node instance.
+   *
+   * @param array $configuration
+   *   A configuration array containing information about the plugin instance.
+   * @param string $plugin_id
+   *   The plugin_id for the plugin instance.
+   * @param mixed $plugin_definition
+   *   The plugin implementation definition.
+   *
+   * @param \Drupal\Core\Routing\RouteMatchInterface $route_match
+   *   The route match.
+   */
+  public function __construct(array $configuration, $plugin_id, $plugin_definition, RouteMatchInterface $route_match) {
+    parent::__construct($configuration, $plugin_id, $plugin_definition);
+
+    $this->routeMatch = $route_match;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
+    return new static(
+      $configuration,
+      $plugin_id,
+      $plugin_definition,
+      $container->get('current_route_match')
+    );
+  }
+
+  /**
+   * Return the current node creation time if a current node can be found.
+   */
+  public function getArgument() {
+    if (($node = $this->routeMatch->getParameter('node')) && $node instanceof NodeInterface) {
+      return date($this->options['date_format'], $node->getChangedTime());
+    }
+    return FALSE;
+  }
+
+}
diff --git a/core/modules/node/src/Plugin/views/argument_default/NodeCreated.php b/core/modules/node/src/Plugin/views/argument_default/NodeCreated.php
new file mode 100644
index 0000000..4d990a2
--- /dev/null
+++ b/core/modules/node/src/Plugin/views/argument_default/NodeCreated.php
@@ -0,0 +1,76 @@
+<?php
+
+/**
+ * @file
+ * Contains Drupal\node\Plugin\views\argument_default\NodeCreated.
+ */
+
+namespace Drupal\node\Plugin\views\argument_default;
+
+use Drupal\views\Plugin\CacheablePluginInterface;
+use Drupal\views\Plugin\views\argument_default\Date;
+use Drupal\node\NodeInterface;
+use Symfony\Component\DependencyInjection\ContainerInterface;
+use Drupal\Core\Routing\RouteMatchInterface;
+
+/**
+ * The current node created argument default handler.
+ *
+ * @ingroup views_argument_default_plugins
+ *
+ * @ViewsArgumentDefault(
+ *   id = "node_created",
+ *   title = @Translation("Current node created time")
+ * )
+ */
+class NodeCreated extends Date implements CacheablePluginInterface {
+
+  /**
+   * The route match.
+   *
+   * @var \Drupal\Core\Routing\RouteMatchInterface
+   */
+  protected $routeMatch;
+
+  /**
+   * Constructs a new Node instance.
+   *
+   * @param array $configuration
+   *   A configuration array containing information about the plugin instance.
+   * @param string $plugin_id
+   *   The plugin_id for the plugin instance.
+   * @param mixed $plugin_definition
+   *   The plugin implementation definition.
+   *
+   * @param \Drupal\Core\Routing\RouteMatchInterface $route_match
+   *   The route match.
+   */
+  public function __construct(array $configuration, $plugin_id, $plugin_definition, RouteMatchInterface $route_match) {
+    parent::__construct($configuration, $plugin_id, $plugin_definition);
+
+    $this->routeMatch = $route_match;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
+    return new static(
+      $configuration,
+      $plugin_id,
+      $plugin_definition,
+      $container->get('current_route_match')
+    );
+  }
+
+  /**
+   * Return the current node creation time if a current node can be found.
+   */
+  public function getArgument() {
+    if (($node = $this->routeMatch->getParameter('node')) && $node instanceof NodeInterface) {
+      return date($this->options['date_format'], $node->getCreatedTime());
+    }
+    return FALSE;
+  }
+
+}
diff --git a/core/modules/views/src/Plugin/views/argument/Date.php b/core/modules/views/src/Plugin/views/argument/Date.php
index c737d38..1becb3c 100644
--- a/core/modules/views/src/Plugin/views/argument/Date.php
+++ b/core/modules/views/src/Plugin/views/argument/Date.php
@@ -18,8 +18,6 @@
 /**
  * Abstract argument handler for dates.
  *
- * Adds an option to set a default argument based on the current date.
- *
  * Definitions terms:
  * - many to one: If true, the "many to one" helper will be used.
  * - invalid input: A string to give to the user for obviously invalid input.
@@ -88,38 +86,11 @@ public static function create(ContainerInterface $container, array $configuratio
   }
 
   /**
-   * Add an option to set the default value to the current date.
+   * Set the default date argument to the given argFormat.
    */
   public function defaultArgumentForm(&$form, FormStateInterface $form_state) {
     parent::defaultArgumentForm($form, $form_state);
-    $form['default_argument_type']['#options'] += array('date' => $this->t('Current date'));
-    $form['default_argument_type']['#options'] += array('node_created' => $this->t("Current node's creation time"));
-    $form['default_argument_type']['#options'] += array('node_changed' => $this->t("Current node's update time"));
-  }
-
-  /**
-   * Set the empty argument value to the current date,
-   * formatted appropriately for this argument.
-   */
-  public function getDefaultArgument($raw = FALSE) {
-    if (!$raw && $this->options['default_argument_type'] == 'date') {
-      return date($this->argFormat, REQUEST_TIME);
-    }
-    elseif (!$raw && in_array($this->options['default_argument_type'], array('node_created', 'node_changed'))) {
-      $node = $this->routeMatch->getParameter('node');
-
-      if (!($node instanceof NodeInterface)) {
-        return parent::getDefaultArgument();
-      }
-      elseif ($this->options['default_argument_type'] == 'node_created') {
-        return date($this->argFormat, $node->getCreatedTime());
-      }
-      elseif ($this->options['default_argument_type'] == 'node_changed') {
-        return date($this->argFormat, $node->getChangedTime());
-      }
-    }
-
-    return parent::getDefaultArgument($raw);
+    $form['argument_default']['date']['date_format']['#default_value'] = $this->argFormat;
   }
 
   /**
diff --git a/core/modules/views/src/Plugin/views/argument_default/Date.php b/core/modules/views/src/Plugin/views/argument_default/Date.php
new file mode 100644
index 0000000..1d2bbfe
--- /dev/null
+++ b/core/modules/views/src/Plugin/views/argument_default/Date.php
@@ -0,0 +1,66 @@
+<?php
+
+/**
+ * @file
+ * Contains Drupal\views\Plugin\views\argument_default\Date.
+ */
+
+namespace Drupal\views\Plugin\views\argument_default;
+
+use Drupal\Core\Form\FormStateInterface;
+use Drupal\views\Plugin\CacheablePluginInterface;
+
+/**
+ * The current date argument default handler.
+ *
+ * @ingroup views_argument_default_plugins
+ *
+ * @ViewsArgumentDefault(
+ *   id = "date",
+ *   title = @Translation("Current date")
+ * )
+ */
+class Date extends ArgumentDefaultPluginBase implements CacheablePluginInterface {
+
+  protected function defineOptions() {
+    $options = parent::defineOptions();
+    $options['date_format'] = array('default' => '');
+
+    return $options;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function buildOptionsForm(&$form, FormStateInterface $form_state) {
+    parent::buildOptionsForm($form, $form_state);
+    $form['date_format'] = array(
+      '#type' => 'textfield',
+      '#title' => $this->t('Date format'),
+      '#default_value' => $this->options['date_format'],
+      '#description' => $this->t('Provide the date format you would like to use, see <a href="http://php.net/manual/en/function.date.php" target="_blank">the PHP docs</a> for date formats.'),
+    );
+  }
+
+  /**
+   * Return the default argument.
+   */
+  public function getArgument() {
+    return date($this->options['date_format'], REQUEST_TIME);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function isCacheable() {
+    return TRUE;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getCacheContexts() {
+    return [];
+  }
+
+}
diff --git a/core/modules/views/src/Tests/Plugin/ArgumentDefaultTest.php b/core/modules/views/src/Tests/Plugin/ArgumentDefaultTest.php
index 58dadf1..00143ff 100644
--- a/core/modules/views/src/Tests/Plugin/ArgumentDefaultTest.php
+++ b/core/modules/views/src/Tests/Plugin/ArgumentDefaultTest.php
@@ -23,7 +23,7 @@ class ArgumentDefaultTest extends PluginTestBase {
    *
    * @var array
    */
-  public static $testViews = array('test_view', 'test_argument_default_fixed', 'test_argument_default_current_user');
+  public static $testViews = array('test_view', 'test_argument_default_fixed', 'test_argument_default_current_user', 'test_argument_default_date');
 
   /**
    * Modules to enable.
@@ -123,6 +123,27 @@ function testArgumentDefaultFixed() {
   }
 
   /**
+   * Tests current date default argument.
+   */
+  function testArgumentDefaultDate() {
+    $date_format = 'Ymd';
+    $view = Views::getView('test_argument_default_date');
+    $view->setDisplay();
+    $options = $view->display_handler->getOption('arguments');
+    $options['null']['default_argument_options']['date_format'] = $date_format;
+    $view->display_handler->overrideOption('arguments', $options);
+    $view->initHandlers();
+
+    $this->assertEqual($view->argument['null']->getDefaultArgument(), date($date_format), 'Current date argument should be used by default.');
+
+    // Make sure that a normal argument provided is used
+    $override_date = '20000101';
+    $view->executeDisplay('default', array($override_date));
+
+    $this->assertEqual($view->args[0], $override_date, 'Provided date should be used.');
+  }
+
+  /**
    * @todo Test php default argument.
    */
   //function testArgumentDefaultPhp() {}
diff --git a/core/modules/views/tests/modules/views_test_config/test_views/views.view.test_argument_default_date.yml b/core/modules/views/tests/modules/views_test_config/test_views/views.view.test_argument_default_date.yml
new file mode 100644
index 0000000..ad74b84
--- /dev/null
+++ b/core/modules/views/tests/modules/views_test_config/test_views/views.view.test_argument_default_date.yml
@@ -0,0 +1,64 @@
+langcode: und
+status: true
+dependencies:
+  module:
+    - node
+id: test_argument_default_date
+label: ''
+module: views
+description: ''
+tag: ''
+base_table: node_field_data
+base_field: nid
+core: '8'
+display:
+  default:
+    display_options:
+      access:
+        type: none
+      arguments:
+        'null':
+          default_action: default
+          default_argument_type: date
+          field: 'null'
+          id: 'null'
+          must_not_be: false
+          table: views
+          plugin_id: 'null'
+      cache:
+        type: none
+      exposed_form:
+        type: basic
+      fields:
+        title:
+          alter:
+            alter_text: false
+            ellipsis: true
+            html: false
+            make_link: false
+            strip_tags: false
+            trim: false
+            word_boundary: true
+          empty_zero: false
+          field: title
+          hide_empty: false
+          id: title
+          link_to_node: false
+          table: node_field_data
+          plugin_id: node
+          entity_type: node
+          entity_field: title
+      pager:
+        options:
+          id: 0
+          items_per_page: 10
+          offset: 0
+        type: full
+      style:
+        type: default
+      row:
+        type: fields
+    display_plugin: default
+    display_title: Master
+    id: default
+    position: 0
