diff --git a/src/Plugin/Derivative/ViewsFieldTemplate.php b/src/Plugin/Derivative/ViewsFieldTemplate.php
index b8ec40d..6026aba 100644
--- a/src/Plugin/Derivative/ViewsFieldTemplate.php
+++ b/src/Plugin/Derivative/ViewsFieldTemplate.php
@@ -2,7 +2,6 @@
 
 namespace Drupal\calendar\Plugin\Derivative;
 
-
 use Drupal\Core\Entity\EntityFieldManagerInterface;
 use Drupal\Core\Entity\EntityTypeInterface;
 use Drupal\Core\Entity\EntityTypeManagerInterface;
@@ -143,13 +142,27 @@ class ViewsFieldTemplate implements ContainerDeriverInterface {
     $field_storages = $this->field_manager->getFieldStorageDefinitions($entity_type->id());
 
     foreach ($field_storages as $field_id => $field_storage) {
-      if ($field_storage->getType() == 'datetime') {
+      $type = $field_storage->getType();
+      $field_definition = \Drupal::service('plugin.manager.field.field_type')->getDefinition($type);
+      $class = $field_definition['class'];
+      $classes = [];
+      $classes[$type] = [];
+      $classes[$type][] = $class;
+      while ($class !== FALSE) {
+        $classes[$type][] = get_parent_class($class);
+        $class = end($classes[$type]);
+      }
+      if (in_array("Drupal\datetime\Plugin\Field\FieldType\DateTimeItem", $classes[$type])) {
         $entity_type_id = $entity_type->id();
-        // Find better way to get table name.
-        $field_table = $entity_type_id . '__' . $field_id;
-        $field_table_data = $this->viewsData->get($field_table);
-
-        if (isset($field_table_data[$field_id])) {
+        $views_data = $this->viewsData->get();
+        foreach ($views_data as $key => $data) {
+          if (strstr($key, $field_id) && isset($data[$field_id])) {
+            $field_table = $key;
+            $field_table_data = $data;
+            break;
+          }
+        }
+        if (isset($field_table_data)) {
           $derivative = [];
           $field_info = $field_table_data[$field_id];
           $derivative['field_id'] = $field_id;
diff --git a/src/Plugin/views/row/Calendar.php b/src/Plugin/views/row/Calendar.php
index f04727c..10f438b 100644
--- a/src/Plugin/views/row/Calendar.php
+++ b/src/Plugin/views/row/Calendar.php
@@ -356,19 +356,20 @@ class Calendar extends RowPluginBase {
 
     $data = CalendarHelper::dateViewFields($this->entityType);
 
-//    $data['name'] = 'node_field_data.created_year';
+    $data = $data['name'];
     $date_fields = [];
     /** @var $handler \Drupal\views\Plugin\views\argument\Formula */
     foreach ($this->view->getDisplay()->getHandlers('argument') as $handler) {
       if ($handler instanceof Date) {
         // Strip "_calendar" from the field name.
         $fieldName = $handler->realField;
-        if (!empty($data['alias'][$handler->table . '_' . $fieldName])) {
-          $date_fields[$fieldName] = $data['alias'][$handler->table . '_' . $fieldName];
-          $this->dateFields = $date_fields;
-        }
+        $alias = $handler->table . '.' . $fieldName;
+        $info = $data[$alias];
+        $field_name  = str_replace(array('_value2', '_value'), '', $info['real_field_name']);
+        $date_fields[$field_name] = $info;
         $this->dateArgument = $handler;
-
+ 
+        $this->dateFields = $date_fields;
       }
     }
 //
@@ -392,6 +393,16 @@ class Calendar extends RowPluginBase {
       return [];
     }
 
+    // unrelated to end date: this addresses issue where an entity on a calendar is duplicated
+    // if it has multiple entity references; ensure that the calendar entity is only displayed once
+    static $used = '';
+    if ($id != $used) {
+      $used = $id;
+    }
+    else {
+      return [];
+    }
+
     // There could be more than one date field in a view so iterate through all
     // of them to find the right values for this view result.
     foreach ($this->dateFields as $field_name => $info) {
@@ -421,36 +432,25 @@ class Calendar extends RowPluginBase {
       $entity->date_id = [];
       $item_start_date = NULL;
       $item_end_date   = NULL;
-      $granularity = 'second';
+      $granularity = 'month';
       $increment = 1;
 
       // @todo implement timezone support
-      if ($info['is_field']) {
-        // Should CalendarHelper::dateViewFields() be returning this already?
-        $entity_field_name = str_replace('_value', '', $field_name);
-        $datetime_type = $entity->getFieldDefinition($entity_field_name)->getSetting('datetime_type');
-        $storage_format = $datetime_type == 'date' ? DATETIME_DATE_STORAGE_FORMAT : DATETIME_DATETIME_STORAGE_FORMAT;
-//        $db_tz   = date_get_timezone_db($tz_handling, isset($item->$tz_field) ? $item->$tz_field : timezone_name_get($dateInfo->getTimezone()));
-//        $to_zone = date_get_timezone($tz_handling, isset($item->$tz_field)) ? $item->$tz_field : timezone_name_get($dateInfo->getTimezone());
-
-        $item_start_date = \DateTime::createFromFormat($storage_format, $row->{$info['query_name']});
-        $item_end_date = \DateTime::createFromFormat($storage_format, $row->{$info['query_name']});
-
-        // @todo don't hardcode
-//        $granularity = date_granularity_precision($cck_field['settings']['granularity']);
-        $granularity = 'week';
-//        $increment = $instance['widget']['settings']['increment'];
-      }
-      elseif ($entity->get($field_name)) {
+      if ($entity->get($field_name)) {
         $item = $entity->get($field_name)->getValue();
         // @todo handle timezones
 //        $db_tz   = date_get_timezone_db($tz_handling, isset($item->$tz_field) ? $item->$tz_field : timezone_name_get($dateInfo->getTimezone()));
 //        $to_zone = date_get_timezone($tz_handling, isset($item->$tz_field) ? $item->$tz_field : timezone_name_get($dateInfo->getTimezone()));
 //        $item_start_date = new dateObject($item, $db_tz);
-        $item_start_date = new \DateTime();
-        $item_start_date->setTimestamp($item[0]['value']);
-        $item_end_date   = $item_start_date;
-        $entity->date_id = ['calendar.' . $id . '.' . $field_name . '.0'];
+        $item_start_date = new \DateTime($item[0]['value']);
+
+        if (!empty($item[0]['end_value'])) {
+          $item_end_date = new \DateTime($item[0]['end_value']);
+        }
+        else {
+          $item_end_date = $item_start_date;
+        }
+        $entity->date_id = array('calendar.' . $id . '.' . $field_name . '.0');
       }
 
       // If we don't have a date value, go no further.
@@ -479,7 +479,7 @@ class Calendar extends RowPluginBase {
 
       // All calendar row plugins should provide a date_id that the theme can use.
       // @todo implement
-//      $event_container->date_id = $entity->date_id[0];
+      $event->date_id = $entity->date_id[0];
 
       // We are working with an array of partially rendered items
       // as we process the calendar, so we can group and organize them.
@@ -533,8 +533,8 @@ class Calendar extends RowPluginBase {
     $rows = [];
 
     $dateInfo = $this->dateArgument->view->dateInfo;
-//    $item_start_date = $event->date_start;
-//    $item_end_date = $event->date_end;
+    $item_start_date = $event->getStartDate()->getTimestamp();
+    $item_end_date = $event->getEndDate()->getTimestamp();
 //    $to_zone = $event->to_zone;
 //    $db_tz = $event->db_tz;
 //    $granularity = $event->granularity;
@@ -545,8 +545,7 @@ class Calendar extends RowPluginBase {
     // nodes so that we have a 'node' for each day that this item occupies in
     // this view.
     // @TODO make this work with the CalendarDateInfo object
-//    $now = max($dateInfo->min_zone_string, $this->dateFormatter->format($event->getStartDate()->getTimestamp(), 'Y-m-d'));
-//    $to = min($dateInfo->max_zone_string, $this->dateFormatter->format($event->getEndDate()->getTimestamp(), 'Y-m-d'));
+
     $now = $event->getStartDate()->format('Y-m-d');
     $to = $event->getEndDate()->format('Y-m-d');
     $next = new \DateTime();
@@ -576,23 +575,23 @@ class Calendar extends RowPluginBase {
       $end = $this->dateFormatter->format($next->getTimestamp(), 'custom', 'Y-m-d H:i:s');
 
       // Get start and end of item, formatted the same way.
-      $item_start = $this->dateFormatter->format($event->getStartDate()->getTimestamp(), 'custom', 'Y-m-d H:i:s');
-      $item_end = $this->dateFormatter->format($event->getEndDate()->getTimestamp(), 'custom', 'Y-m-d H:i:s');
+      $item_start = $this->dateFormatter->format($item_start_date, 'custom', 'Y-m-d H:i:s');
+      $item_end = $this->dateFormatter->format($item_end_date, 'custom', 'Y-m-d H:i:s');
 
       // Get intersection of current day and the node value's duration (as
       // strings in $to_zone timezone).
       $start_string = $item_start < $start ? $start : $item_start;
-      $entity->setStartDate(new \DateTime($start_string));
       $end_string = !empty($item_end) ? ($item_end > $end ? $end : $item_end) : NULL;
-      $entity->setEndDate(new \DateTime($end_string));
+      $entity->calendar_start_date = (new \DateTime($start_string));
+      $entity->calendar_end_date = (new \DateTime($end_string));
 
       // @TODO don't hardcode granularity and increment
-      $granularity = 'hour';
+      $granularity = 'day';
       $increment = 1;
       $entity->setAllDay(CalendarHelper::dateIsAllDay($entity->getStartDate()->format('Y-m-d H:i:s'), $entity->getEndDate()->format('Y-m-d H:i:s'), $granularity, $increment));
 
-      $calendar_start = new \DateTime();
-      $calendar_start->setTimestamp($entity->getStartDate()->getTimestamp());
+      $calendar_start = $this->dateFormatter->format($entity->calendar_start_date->getTimestamp(), 'custom', 'Y-m-d H:i:s');
+      $calendar_end = $this->dateFormatter->format($entity->calendar_end_date->getTimestamp(), 'custom', 'Y-m-d H:i:s');
 
 //      unset($entity->calendar_fields);
       if (isset($entity) && (empty($calendar_start))) {
@@ -601,13 +600,13 @@ class Calendar extends RowPluginBase {
         unset($entity);
       }
       else {
-//        $entity->date_id .= '.' . $position;
+        $entity->date_id .= '.' . $position;
         $rows[] = $entity;
         unset($entity);
       }
 
       $next->setTimestamp(strtotime('+1 second', $next->getTimestamp()));
-      $now = $this->dateFormatter->format($next->getTimestamp(), 'Y-m-d');
+      $now = $this->dateFormatter->format($next->getTimestamp(), 'custom', 'Y-m-d');
       $position++;
     }
     return $rows;
@@ -686,5 +685,5 @@ class Calendar extends RowPluginBase {
     ];
   }
 
-
 }
+
diff --git a/src/Plugin/views/style/Calendar.php b/src/Plugin/views/style/Calendar.php
index c340842..a46811e 100644
--- a/src/Plugin/views/style/Calendar.php
+++ b/src/Plugin/views/style/Calendar.php
@@ -538,9 +538,9 @@ class Calendar extends StylePluginBase {
       /** @var \Drupal\calendar\CalendarEvent $event_info */
       foreach ($events as $event_info) {
 //        $event->granularity = $this->dateInfo->granularity;
-        $item_start = $event_info->getStartDate()->format('Y-m-d');
-        $item_end = $event_info->getEndDate()->format('Y-m-d');
-        $time_start = $event_info->getStartDate()->format('H:i:s');
+        $item_start = $event_info->calendar_start_date->format('Y-m-d');
+        $item_end = $event_info->calendar_end_date->format('Y-m-d');
+        $time_start = $event_info->calendar_start_date->format('H:i:s');
         $event_info->setRenderedFields($this->rendered_fields[$row_index]);
         $items[$item_start][$time_start][] = $event_info;
       }
@@ -1134,7 +1134,7 @@ class Calendar extends StylePluginBase {
                     // future events
                     for ( $j = 0; $j < $row_diff; $j++) {
                       $bucket[($bucket_row_count + $j) ] = [
-                        'entry' => '&nbsp;',
+                        'entry' => '',
                         'colspan' => 1,
                         'rowspan' => 1,
                         'filled' => TRUE,
