diff --git a/core/modules/datetime/config/schema/datetime.views.schema.yml b/core/modules/datetime/config/schema/datetime.views.schema.yml
new file mode 100644
index 0000000..a644eb8
--- /dev/null
+++ b/core/modules/datetime/config/schema/datetime.views.schema.yml
@@ -0,0 +1,9 @@
+# Schema for the views default arguments.
+
+views.argument_default.offset:
+  type: mapping
+  label: 'Offset'
+  mapping:
+    argument:
+      type: string
+      label: 'Offset Date'
diff --git a/core/modules/datetime/datetime.views.inc b/core/modules/datetime/datetime.views.inc
index c12a3ac..10b9ef1 100644
--- a/core/modules/datetime/datetime.views.inc
+++ b/core/modules/datetime/datetime.views.inc
@@ -28,6 +28,7 @@ function datetime_field_views_data(FieldStorageConfigInterface $field_storage) {
       'year' => t('Date in the form of YYYY.'),
       'month' => t('Date in the form of MM.'),
       'day' => t('Date in the form of DD.'),
+      'calculated' => t('Calculated Date.'),
     ];
     foreach ($arguments as $argument_type => $help_text) {
       $data[$table_name][$field_storage->getName() . '_value_' . $argument_type] = [
@@ -36,6 +37,8 @@ function datetime_field_views_data(FieldStorageConfigInterface $field_storage) {
         'argument' => [
           'field' => $field_storage->getName() . '_value',
           'id' => 'datetime_' . $argument_type,
+          'entity_type' => $field_storage->get('entity_type'),
+          'field_name' => $field_storage->getName(),
         ],
         'group' => $group,
       ];
diff --git a/core/modules/datetime/src/Plugin/views/argument/Date.php b/core/modules/datetime/src/Plugin/views/argument/Date.php
index 7bd5cdf..df683e5 100644
--- a/core/modules/datetime/src/Plugin/views/argument/Date.php
+++ b/core/modules/datetime/src/Plugin/views/argument/Date.php
@@ -7,7 +7,7 @@
 
 namespace Drupal\datetime\Plugin\views\Argument;
 
-use Drupal\views\Plugin\views\argument\Date as NumericDate;
+use Drupal\views\Plugin\views\argument\Date as FormulaicDate;
 
 /**
  * Abstract argument handler for dates.
@@ -25,7 +25,7 @@
  *
  * @ViewsArgument("datetime")
  */
-class Date extends NumericDate {
+class Date extends FormulaicDate {
 
   /**
    * {@inheritdoc}
diff --git a/core/modules/datetime/src/Plugin/views/argument/NumericDate.php b/core/modules/datetime/src/Plugin/views/argument/NumericDate.php
new file mode 100644
index 0000000..971bce0
--- /dev/null
+++ b/core/modules/datetime/src/Plugin/views/argument/NumericDate.php
@@ -0,0 +1,332 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\datetime\Plugin\views\Argument\NumericDate.
+ */
+
+namespace Drupal\datetime\Plugin\views\Argument;
+
+use Drupal\Core\Datetime\DateFormatter;
+use Drupal\Core\Form\FormStateInterface;
+use Drupal\datetime\Plugin\Field\FieldType\DateTimeItem;
+use Drupal\views\FieldAPIHandlerTrait;
+use Drupal\views\Plugin\views\argument\NumericArgument;
+use Symfony\Component\DependencyInjection\ContainerInterface;
+use Symfony\Component\HttpFoundation\RequestStack;
+
+/**
+ * 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.
+ *
+ * @see \Drupal\views\ManyTonOneHelper
+ *
+ * @ingroup views_argument_handlers
+ *
+ * @ViewsArgument("datetime_calculated")
+ */
+class NumericDate extends NumericArgument {
+
+  use FieldAPIHandlerTrait;
+
+  // Flag to allow the use of date offsets for default arguments.
+  public $canUseOffsetDate = TRUE;
+
+  /**
+   * The date formatter service.
+   *
+   * @var \Drupal\Core\Datetime\DateFormatter
+   */
+  protected $dateFormatter;
+
+  /**
+   * Date format for SQL conversion.
+   *
+   * @var string
+   *
+   * @see \Drupal\views\Plugin\views\query\Sql::getDateFormat()
+   */
+  protected $dateFormat = DATETIME_DATETIME_STORAGE_FORMAT;
+
+  /**
+   * The request stack used to determin current time.
+   *
+   * @var \Symfony\Component\HttpFoundation\RequestStack
+   */
+  protected $requestStack;
+
+  /**
+   * Constructs a new Date handler.
+   *
+   * @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\Datetime\DateFormatter $date_formatter
+   *   The date formatter service.
+   * @param \Symfony\Component\HttpFoundation\RequestStack
+   *   The request stack used to determine the current time.
+   */
+  public function __construct(array $configuration, $plugin_id, $plugin_definition, DateFormatter $date_formatter, RequestStack $request_stack) {
+    parent::__construct($configuration, $plugin_id, $plugin_definition);
+    $this->dateFormatter = $date_formatter;
+    $this->requestStack = $request_stack;
+
+    // Date format depends on field storage format.
+    $definition = $this->getFieldStorageDefinition();
+    if ($definition->getSetting('datetime_type') === DateTimeItem::DATETIME_TYPE_DATE) {
+      $this->dateFormat = DATETIME_DATE_STORAGE_FORMAT;
+    }
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
+    return new static(
+      $configuration,
+      $plugin_id,
+      $plugin_definition,
+      $container->get('date.formatter'),
+      $container->get('request_stack')
+    );
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getDateField() {
+    // Return the real field, since it is already in string format.
+    return "$this->tableAlias.$this->realField";
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getDateFormat($format) {
+    // Pass in the string-field option.
+    return $this->query->getDateFormat($this->getDateField(), $format, TRUE);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function defineOptions() {
+    $options = parent::defineOptions();
+
+    $options['type']['default'] = 'date';
+    $options['operator']['default'] = '=';
+
+    return $options;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function buildOptionsForm(&$form, FormStateInterface $form_state) {
+    parent::buildOptionsForm($form, $form_state);
+
+    // Unset unusable options.
+    unset($form['default_argument_type']['#options']['node']);
+    unset($form['default_argument_type']['#options']['taxonomy_tid']);
+    unset($form['default_argument_type']['#options']['current_user']);
+    unset($form['default_argument_type']['#options']['user']);
+    unset($form['argument_default']['node']);
+    unset($form['argument_default']['taxonomy_tid']);
+    unset($form['argument_default']['current_user']);
+    unset($form['argument_default']['user']);
+
+    // Unset the default numeric argument options.
+    unset($form['break_phrase']);
+    unset($form['not']);
+
+    $form['argument_default']['fixed']['argument']['#description'] = $this->t('A date in any machine readable format. CCYY-MM-DD HH:MM:SS is preferred.');
+
+    $this->operatorForm($form, $form_state);
+
+    $form['operator']['#fieldset'] = 'more';
+
+    $form['type'] = [
+      '#type' => 'radios',
+      '#title' => $this->t('Value type'),
+      '#options' => [
+        'date' => $this->t('A date in any machine readable format. CCYY-MM-DD_HH:MM:SS is preferred.'),
+        'offset' => $this->t('An offset from the current time such as "!example1" or "!example2"',
+          ['!example1' => '+1 day', '!example2' => '-2 hours -30 minutes']),
+      ],
+      '#default_value' => !empty($this->options['type']) ? $this->options['type'] : 'date',
+      '#fieldset' => 'more',
+    ];
+  }
+
+  function title() {
+    $title = parent::title();
+    $this->operator = $this->options['operator'] ?: '=';
+    $this->value = $this->argument ?: '';
+
+    return $title;
+  }
+
+    public function query($group_by = FALSE) {
+    $this->ensureMyTable();
+    $field = "$this->tableAlias.$this->realField";
+
+    $info = $this->operators();
+    if (!empty($info[$this->operator]['method'])) {
+      $this->{$info[$this->operator]['method']}($field);
+    }
+  }
+
+
+  /**
+   * Options form subform for setting the operator.
+   *
+   * This may be overridden by child classes, and it must
+   * define $form['operator'];
+   *
+   * @see buildOptionsForm()
+   */
+  protected function operatorForm(&$form, FormStateInterface $form_state) {
+    $options = $this->operatorOptions();
+    if (!empty($options)) {
+      $form['operator'] = array(
+        '#type' => count($options) < 10 ? 'radios' : 'select',
+        '#title' => $this->t('Operator'),
+        '#default_value' => !empty($this->options['operator']) ? $this->options['operator'] : '=',
+        '#options' => $options,
+      );
+    }
+  }
+
+  function operators() {
+    $operators = array(
+      '<' => array(
+        'title' => $this->t('Is less than'),
+        'method' => 'opSimple',
+        'short' => $this->t('<'),
+        'values' => 1,
+      ),
+      '<=' => array(
+        'title' => $this->t('Is less than or equal to'),
+        'method' => 'opSimple',
+        'short' => $this->t('<='),
+        'values' => 1,
+      ),
+      '=' => array(
+        'title' => $this->t('Is equal to'),
+        'method' => 'opSimple',
+        'short' => $this->t('='),
+        'values' => 1,
+      ),
+      '!=' => array(
+        'title' => $this->t('Is not equal to'),
+        'method' => 'opSimple',
+        'short' => $this->t('!='),
+        'values' => 1,
+      ),
+      '>=' => array(
+        'title' => $this->t('Is greater than or equal to'),
+        'method' => 'opSimple',
+        'short' => $this->t('>='),
+        'values' => 1,
+      ),
+      '>' => array(
+        'title' => $this->t('Is greater than'),
+        'method' => 'opSimple',
+        'short' => $this->t('>'),
+        'values' => 1,
+      ),
+      'regular_expression' => array(
+        'title' => $this->t('Regular expression'),
+        'short' => $this->t('regex'),
+        'method' => 'op_regex',
+        'values' => 1,
+      ),
+    );
+
+    // if the definition allows for the empty operator, add it.
+    if (!empty($this->definition['allow empty'])) {
+      $operators += array(
+        'empty' => array(
+          'title' => $this->t('Is empty (NULL)'),
+          'method' => 'opEmpty',
+          'short' => $this->t('empty'),
+          'values' => 0,
+        ),
+        'not empty' => array(
+          'title' => $this->t('Is not empty (NOT NULL)'),
+          'method' => 'opEmpty',
+          'short' => $this->t('not empty'),
+          'values' => 0,
+        ),
+      );
+    }
+
+    return $operators;
+  }
+
+  /**
+   * Provide a list of all the numeric operators
+   */
+  public function operatorOptions($which = 'title') {
+    $options = array();
+    foreach ($this->operators() as $id => $info) {
+      $options[$id] = $info[$which];
+    }
+
+    return $options;
+  }
+
+  protected function operatorValues($values = 1) {
+    $options = array();
+    foreach ($this->operators() as $id => $info) {
+      if ($info['values'] == $values) {
+        $options[] = $id;
+      }
+    }
+
+    return $options;
+  }
+
+  /**
+   * Override parent method, which deals with dates as integers.
+   */
+  protected function opSimple($field) {
+    $origin =  (!empty($this->options['type']) && $this->options['type'] == 'offset') ? $this->requestStack->getCurrentRequest()->server->get('REQUEST_TIME') : 0;
+    $value = intval(strtotime($this->argument, $origin));
+
+    // Convert to ISO. UTC is used since dates are stored in UTC.
+    $value = $this->query->getDateFormat("'" . $this->dateFormatter->format($value, 'custom', DATETIME_DATETIME_STORAGE_FORMAT, DATETIME_STORAGE_TIMEZONE) . "'", $this->dateFormat, TRUE);
+
+    // This is safe because we are manually scrubbing the value.
+    $field = $this->query->getDateFormat($field, $this->dateFormat, TRUE);
+    $this->query->addWhereExpression($this->options['group'], "$field $this->operator $value");
+  }
+
+  protected function opEmpty($field) {
+    if ($this->operator == 'empty') {
+      $operator = "IS NULL";
+    }
+    else {
+      $operator = "IS NOT NULL";
+    }
+
+    $this->query->addWhere($this->options['group'], $field, NULL, $operator);
+  }
+
+  /**
+   * Filters by a regular expression.
+   *
+   * @param string $field
+   *   The expression pointing to the queries field, for example "foo.bar".
+   */
+  protected function opRegex($field) {
+    $this->query->addWhere($this->options['group'], $field, $this->value, 'REGEXP');
+  }
+}
diff --git a/core/modules/datetime/src/Plugin/views/argument_default/Offset.php b/core/modules/datetime/src/Plugin/views/argument_default/Offset.php
new file mode 100644
index 0000000..83042b7
--- /dev/null
+++ b/core/modules/datetime/src/Plugin/views/argument_default/Offset.php
@@ -0,0 +1,74 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\datetime\Plugin\views\argument_default\Offset.
+ */
+
+namespace Drupal\datetime\Plugin\views\argument_default;
+
+use Drupal\Core\Form\FormStateInterface;
+use Drupal\views\Plugin\CacheablePluginInterface;
+use Drupal\views\Plugin\views\argument_default\ArgumentDefaultPluginBase;
+
+/**
+ * The offset argument default handler.
+ *
+ * @ingroup views_argument_default_plugins
+ *
+ * @ViewsArgumentDefault(
+ *   id = "offset",
+ *   title = @Translation("Offset Date")
+ * )
+ */
+class Offset extends ArgumentDefaultPluginBase implements CacheablePluginInterface {
+
+  protected function defineOptions() {
+    $options = parent::defineOptions();
+    $options['argument'] = array('default' => '');
+
+    return $options;
+  }
+
+  public function buildOptionsForm(&$form, FormStateInterface $form_state) {
+    parent::buildOptionsForm($form, $form_state);
+    $form['argument'] = array(
+      '#type' => 'textfield',
+      '#title' => $this->t('Offset Date'),
+      '#default_value' => $this->options['argument'],
+      '#description' => $this->t('An offset from the current time such as "!example1" or "!example2"',
+        ['!example1' => '+1 day', '!example2' => '-2 hours -30 minutes']),
+    );
+  }
+
+  /**
+   * Return the default argument.
+   */
+  public function getArgument() {
+    return $this->options['argument'];
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function isCacheable() {
+    return TRUE;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getCacheContexts() {
+    return [];
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function access() {
+    // Don't show this plugin unless the.
+    return ($this->argument->canUseOffsetDate ?: FALSE);
+  }
+
+
+}
