diff --git a/core/modules/datetime_range/datetime_range.libraries.yml b/core/modules/datetime_range/datetime_range.libraries.yml
new file mode 100644
index 0000000..a99056e
--- /dev/null
+++ b/core/modules/datetime_range/datetime_range.libraries.yml
@@ -0,0 +1,8 @@
+drupal.datetime_range:
+  version: VERSION
+  js:
+    js/datetime_range.js: {}
+  dependencies:
+    - core/jquery
+    - core/drupal
+    - core/jquery.once
diff --git a/core/modules/datetime_range/js/datetime_range.es6.js b/core/modules/datetime_range/js/datetime_range.es6.js
new file mode 100644
index 0000000..4976ddd
--- /dev/null
+++ b/core/modules/datetime_range/js/datetime_range.es6.js
@@ -0,0 +1,35 @@
+/**
+ * @file
+ * Support functions for the datetime_range module.
+ */
+
+/*
+ * @todo Add in logic for adjusting the time.
+ * @todo Add in logic for handling date+time vs date-only.
+ * @todo Add in logic for non-HTML5 aware browsers to do the right things
+ *   with the polyfill.
+ */
+
+(function ($, Drupal) {
+  Drupal.behaviors.datetime_range = {
+    attach(context, settings) {
+      $('.field--type-daterange', context).once('datetime_range').each(function () {
+        const $field = $(this);
+        const $start_date = $field.find('input[type="date"].field-daterange-start');
+        const $end_date = $field.find('input[type="date"].field-daterange-end');
+
+        $start_date.on('change', function () {
+          const start_date = this.value;
+          const end_date = $end_date.val();
+
+          if (start_date) {
+            if (end_date && start_date > end_date) {
+              $end_date.val(start_date);
+            }
+            $end_date.prop('min', start_date);
+          }
+        })
+      });
+    },
+  }
+}(jQuery, Drupal));
diff --git a/core/modules/datetime_range/js/datetime_range.js b/core/modules/datetime_range/js/datetime_range.js
new file mode 100644
index 0000000..88e2e92
--- /dev/null
+++ b/core/modules/datetime_range/js/datetime_range.js
@@ -0,0 +1,30 @@
+/**
+* DO NOT EDIT THIS FILE.
+* See the following change record for more information,
+* https://www.drupal.org/node/2815083
+* @preserve
+**/
+
+(function ($, Drupal) {
+  Drupal.behaviors.datetime_range = {
+    attach: function attach(context, settings) {
+      $('.field--type-daterange', context).once('datetime_range').each(function () {
+        var $field = $(this);
+        var $start_date = $field.find('input[type="date"].field-daterange-start');
+        var $end_date = $field.find('input[type="date"].field-daterange-end');
+
+        $start_date.on('change', function () {
+          var start_date = this.value;
+          var end_date = $end_date.val();
+
+          if (start_date) {
+            if (end_date && start_date > end_date) {
+              $end_date.val(start_date);
+            }
+            $end_date.prop('min', start_date);
+          }
+        });
+      });
+    }
+  };
+})(jQuery, Drupal);
\ No newline at end of file
diff --git a/core/modules/datetime_range/src/Plugin/Field/FieldWidget/DateRangeWidgetBase.php b/core/modules/datetime_range/src/Plugin/Field/FieldWidget/DateRangeWidgetBase.php
index e99374c..bb46e25 100644
--- a/core/modules/datetime_range/src/Plugin/Field/FieldWidget/DateRangeWidgetBase.php
+++ b/core/modules/datetime_range/src/Plugin/Field/FieldWidget/DateRangeWidgetBase.php
@@ -25,10 +25,13 @@ public function formElement(FieldItemListInterface $items, $delta, array $elemen
 
     $element['#element_validate'][] = [$this, 'validateStartEnd'];
     $element['value']['#title'] = $this->t('Start date');
+    $element['value']['#attributes']['class'][] = 'field-daterange-start';
 
     $element['end_value'] = [
       '#title' => $this->t('End date'),
     ] + $element['value'];
+    $element['end_value']['#attributes']['class'] = array_diff($element['end_value']['#attributes']['class'], ['field-daterange-start']);
+    $element['end_value']['#attributes']['class'][] = 'field-daterange-end';
 
     if ($items[$delta]->start_date) {
       /** @var \Drupal\Core\Datetime\DrupalDateTime $start_date */
@@ -40,8 +43,13 @@ public function formElement(FieldItemListInterface $items, $delta, array $elemen
       /** @var \Drupal\Core\Datetime\DrupalDateTime $end_date */
       $end_date = $items[$delta]->end_date;
       $element['end_value']['#default_value'] = $this->createDefaultValue($end_date, $element['end_value']['#date_timezone']);
+
+      // @todo Add in logic to set the min value on the date input if there is a
+      //   valid start date.
     }
 
+    $element['#attached']['library'][] = 'datetime_range/drupal.datetime_range';
+
     return $element;
   }
 
