diff --git a/scheduler.module b/scheduler.module
index ed22cd8..cfae259 100644
--- a/scheduler.module
+++ b/scheduler.module
@@ -13,6 +13,7 @@ use Drupal\Core\Field\BaseFieldDefinition;
 use Drupal\Core\Form\FormStateInterface;
 use Drupal\Core\Url;
 use Drupal\node\NodeInterface;
+use Drupal\Core\Datetime\Element\Datetime;
 
 // @todo Move constants into a class, so we do not pollute the global space,
 // and use them like this, for example: SchedulerApi::MY_CONSTANT.
@@ -569,3 +570,30 @@ function scheduler_feeds_set_target($source, $entity, $target, $value, $mapping)
     $entity->$target = $timestamp;
   }
 }
+
+/**
+ * Callback for TimestampDatetimeNoDefaultWidget.
+ *
+ * Add default time to the input date if needed.
+ *
+ * @todo This function may not end up in .module. It should be located in 
+ * TimestampDatetimeNoDefaultWidget.php 
+ */
+function _scheduler_datetime_valuecallback(&$element, $input, FormStateInterface $form_state) {
+  // This callback will intercept the user input before form validation is done.
+  if ($input !== FALSE) {
+    $date_input  = $element['#date_date_element'] != 'none' && !empty($input['date']) ? $input['date'] : '';
+    $time_input  = $element['#date_time_element'] != 'none' && !empty($input['time']) ? $input['time'] : '';
+    
+    // If there is an input date but no time and the date-only option is on then
+    // set the input time to the default just as if the user entered this value.
+    $config = \Drupal::config('scheduler.settings');
+    $allow_date_only = $config->get('allow_date_only');
+    if (!empty($date_input) && empty($time_input) && $allow_date_only) {
+      $input['time'] = $config->get('default_time');
+    }
+  }
+  // Chain on to the standard valueCallback so that we do not duplicate the
+  // core code here.
+  return Datetime::valueCallback($element, $input, $form_state);
+}
diff --git a/src/Plugin/Field/FieldWidget/TimestampDatetimeNoDefaultWidget.php b/src/Plugin/Field/FieldWidget/TimestampDatetimeNoDefaultWidget.php
index e903dcf..8867886 100644
--- a/src/Plugin/Field/FieldWidget/TimestampDatetimeNoDefaultWidget.php
+++ b/src/Plugin/Field/FieldWidget/TimestampDatetimeNoDefaultWidget.php
@@ -32,13 +32,34 @@ class TimestampDatetimeNoDefaultWidget extends TimestampDatetimeWidget {
    */
   public function formElement(FieldItemListInterface $items, $delta, array $element, array &$form, FormStateInterface $form_state) {
     $element = parent::formElement($items, $delta, $element, $form, $form_state);
+    // @todo Do not these lines. The #description is entirely replaced by custom
+    // text in scheduler_form_node_form_alter()
     $date_format = DateFormat::load('html_date')->getPattern();
     $time_format = DateFormat::load('html_time')->getPattern();
     $element['value']['#description'] = $this->t('Format: %format. Leave blank to disable.', array('%format' => Datetime::formatExample($date_format . ' ' . $time_format)));
 
+    // Set the callback function to allow interception of the submitted user
+    // input and add the default time if needed. It is too late to try this in
+    // function massageFormValues as the validation has already been done. 
+    $element['value']['#value_callback'] = '_scheduler_datetime_valuecallback'; // works, but would be better within this class, not .module
+    
+//    $element['value']['#value_callback'] = array('::scheduler_TEMP_dt_vcb');  // gives uninitialised offset 'date' and 0
+//    $element['value']['#value_callback'] = '::scheduler_TEMP_dt_vcb'; // uninitialised offset 'date' and 0
+//    $element['value']['#value_callback'] = array(array($this, 'scheduler_TEMP_dt_vcb'));  // uninitialised offset 'date' and 0
+//    $element['value']['#value_callback'] = 'TimestampDatetimeNoDefaultWidget::scheduler_TEMP_dt_vcb';  // uninitialised offset 'date' and 0
+
+// also tried just $element['#value_callback'] with the above.  no error, but no activity either.
+
     return $element;
   }
 
+public function scheduler_TEMP_dt_vcb(&$element, $input, FormStateInterface $form_state) {
+  // Chain on to the standard valueCallback so that we do not duplicate the
+  // core code here.
+  //dsm('**scheduler_TEMP_dt_vcb**');
+  //dd('!!scheduler_TEMP_dt_vcb!!');
+  return Datetime::valueCallback($element, $input, $form_state); // get uninitialised errors even if this is commented out.
+}
   /**
    * {@inheritdoc}
    */
