diff --git a/core/modules/datetime/datetime.views.inc b/core/modules/datetime/datetime.views.inc
new file mode 100644
index 0000000..84ade9b
--- /dev/null
+++ b/core/modules/datetime/datetime.views.inc
@@ -0,0 +1,38 @@
+<?php
+
+/**
+ * @file
+ * Provides views data for the datetime module.
+ */
+
+use Drupal\field\FieldStorageConfigInterface;
+
+/**
+ * Implements hook_field_views_data().
+ */
+function datetime_field_views_data(FieldStorageConfigInterface $field_storage) {
+  $data = field_views_field_default_views_data($field_storage);
+  foreach ($data as $table_name => $table_data) {
+    // Set the 'datetime' filter type.
+    $data[$table_name][$field_storage->getName() . '_value']['filter']['id'] = 'datetime';
+
+    // Set the 'datetime' argument type.
+    $data[$table_name][$field_storage->getName() . '_value']['argument']['id'] = 'datetime';
+
+    // Create year, month, and day arguments.
+    $group = $data[$table_name][$field_storage->getName() . '_value']['group'];
+    foreach (array('year', 'month', 'day') as $argument_type) {
+      $data[$table_name][$field_storage->getName() . '_value_' . $argument_type] = array(
+        'title' => $field_storage->getLabel() . ' (' . $argument_type . ')',
+        'help' => t('Date in the form of YYYY.'),
+        'argument' => array(
+          'field' => $field_storage->getName() . '_value',
+          'id' => 'datetime_' . $argument_type,
+        ),
+        'group' => $group,
+      );
+    }
+  }
+
+  return $data;
+}
diff --git a/core/modules/datetime/src/Plugin/views/argument/Date.php b/core/modules/datetime/src/Plugin/views/argument/Date.php
new file mode 100644
index 0000000..3615bad
--- /dev/null
+++ b/core/modules/datetime/src/Plugin/views/argument/Date.php
@@ -0,0 +1,35 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\datetime\Plugin\views\Argument\Date.
+ */
+namespace Drupal\datetime\Plugin\views\Argument;
+
+use Drupal\views\Plugin\views\argument\Date as NumericDate;
+
+/**
+ * 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.
+ *                  This is deprecated in favor of argument validators.
+ *
+ * @see \Drupal\views\ManyTonOneHelper
+ *
+ * @ingroup views_argument_handlers
+ *
+ * @ViewsArgument("datetime")
+ */
+class Date extends NumericDate {
+
+  /**
+   * Override to account for dates stored as strings.
+   */
+  public function getDateField() {
+    return "$this->tableAlias.$this->realField";
+  }
+}
\ No newline at end of file
diff --git a/core/modules/datetime/src/Plugin/views/argument/DayDate.php b/core/modules/datetime/src/Plugin/views/argument/DayDate.php
new file mode 100644
index 0000000..17d5cbd
--- /dev/null
+++ b/core/modules/datetime/src/Plugin/views/argument/DayDate.php
@@ -0,0 +1,22 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\datetime\Plugin\views\argument\DayDate.
+ */
+
+namespace Drupal\datetime\Plugin\views\argument;
+
+/**
+ * Argument handler for a day (DD)
+ *
+ * @ViewsArgument("datetime_day")
+ */
+class DayDate extends Date {
+
+  /**
+   * {@inheritdoc}
+   */
+  protected $argFormat = 'd';
+
+}
diff --git a/core/modules/datetime/src/Plugin/views/argument/MonthDate.php b/core/modules/datetime/src/Plugin/views/argument/MonthDate.php
new file mode 100644
index 0000000..1340eca
--- /dev/null
+++ b/core/modules/datetime/src/Plugin/views/argument/MonthDate.php
@@ -0,0 +1,22 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\datetime\Plugin\views\argument\MonthDate.
+ */
+
+namespace Drupal\datetime\Plugin\views\argument;
+
+/**
+ * Argument handler for a month (MM)
+ *
+ * @ViewsArgument("datetime_month")
+ */
+class MonthDate extends Date {
+
+  /**
+   * {@inheritdoc}
+   */
+  protected $argFormat = 'm';
+
+}
diff --git a/core/modules/datetime/src/Plugin/views/argument/YearDate.php b/core/modules/datetime/src/Plugin/views/argument/YearDate.php
new file mode 100644
index 0000000..de6827c
--- /dev/null
+++ b/core/modules/datetime/src/Plugin/views/argument/YearDate.php
@@ -0,0 +1,22 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\datetime\Plugin\views\argument\YearDate.
+ */
+
+namespace Drupal\datetime\Plugin\views\argument;
+
+/**
+ * Argument handler for a year (CCYY)
+ *
+ * @ViewsArgument("datetime_year")
+ */
+class YearDate extends Date {
+
+  /**
+   * {@inheritdoc}
+   */
+  protected $argFormat = 'Y';
+
+}
diff --git a/core/modules/datetime/src/Plugin/views/filter/Date.php b/core/modules/datetime/src/Plugin/views/filter/Date.php
new file mode 100644
index 0000000..9fab680
--- /dev/null
+++ b/core/modules/datetime/src/Plugin/views/filter/Date.php
@@ -0,0 +1,61 @@
+<?php
+
+/**
+ * @file
+ * Definition of Drupal\views\Plugin\views\filter\String.
+ */
+
+namespace Drupal\datetime\Plugin\views\filter;
+
+use Drupal\Core\Form\FormStateInterface;
+use Drupal\views\Plugin\views\filter\Date as NumericDate;
+
+/**
+ * Date/time views filter.
+ *
+ * Even thought dates are stored as strings, the numeric filter is extended
+ * because it provides more sensible operators.
+ *
+ * @ingroup views_filter_handlers
+ *
+ * @ViewsFilter("datetime")
+ */
+class Date extends NumericDate {
+
+  /**
+   * Override parent method, which deals with dates as integers.
+   */
+  protected function opBetween($field) {
+    $a = intval(strtotime($this->value['min'], 0));
+    $b = intval(strtotime($this->value['max'], 0));
+
+    if ($this->value['type'] == 'offset') {
+      $a = REQUEST_TIME + $a;
+      $b = REQUEST_TIME + $b;
+    }
+    // Convert to ISO format.
+    $a = date('c', $a);
+    $b = date('c', $b);
+
+    // This is safe because we are manually scrubbing the values.
+    // It is necessary to do it this way because $a and $b are formulas when using an offset.
+    $operator = strtoupper($this->operator);
+    $this->query->addWhereExpression($this->options['group'], "$field $operator '$a' AND '$b'");
+  }
+
+  /**
+   * Override parent method, which deals with dates as integers.
+   */
+  protected function opSimple($field) {
+    $value = intval(strtotime($this->value['value'], 0));
+    if (!empty($this->value['type']) && $this->value['type'] == 'offset') {
+      $value = REQUEST_TIME + $value;
+    }
+    // Convert to ISO.
+    $value = date('c', $value);
+    // This is safe because we are manually scrubbing the value.
+    // It is necessary to do it this way because $value is a formula when using an offset.
+    $this->query->addWhereExpression($this->options['group'], "$field $this->operator '$value'");
+
+  }
+}
