diff --git a/css/calendar.css b/css/calendar.css
index 33e51d0..53b5204 100644
--- a/css/calendar.css
+++ b/css/calendar.css
@@ -411,3 +411,6 @@ nav.pager > ul {
 .calendar-calendar td.has-no-events {
 }
 */
+.calendar-calendar td.multi-day[colspan="0"] {
+  display: none;
+}
diff --git a/src/Plugin/views/style/Calendar.php b/src/Plugin/views/style/Calendar.php
index ccc173d..9ff65c9 100644
--- a/src/Plugin/views/style/Calendar.php
+++ b/src/Plugin/views/style/Calendar.php
@@ -126,6 +126,23 @@ class Calendar extends StylePluginBase {
    */
   protected $time;
 
+  /**
+   * Slots to keep the flag whether calendar cell is filled up with an event or not.
+   *
+   * @var array
+   *
+   * Example:
+   *
+   * @code
+   * $cellSlots = [
+   *   [1,0,0,0,1],
+   *   [0,1,1,0,1],
+   *   [0,1,1,1,0],
+   * ];
+   * @endcode
+   */
+  protected $cellSlots;
+
   /**
    * Overrides \Drupal\views\Plugin\views\style\StylePluginBase::init().
    *
@@ -529,6 +546,8 @@ class Calendar extends StylePluginBase {
       return;
     }
 
+    $this->initCellSlots();
+
     if (!$argument->validateValue()) {
       if (!$argument->getDateArg()->getValue()) {
         $msg = 'No calendar date argument value was provided.';
@@ -545,6 +564,8 @@ class Calendar extends StylePluginBase {
       return;
     }
 
+    $first_day = \Drupal::config('system.date')->get('first_day');
+
     // Add information from the date argument to the view.
     $this->dateInfo->setGranularity($argument->getGranularity());
     $this->dateInfo->setCalendarType($this->options['calendar_type']);
@@ -553,10 +574,14 @@ class Calendar extends StylePluginBase {
     $this->dateInfo->setMinMonth($argument->getMinDate()->format('n'));
     $this->dateInfo->setMinDay($argument->getMinDate()->format('j'));
     // @todo We shouldn't use DATETIME_DATE_STORAGE_FORMAT.
-    $this->dateInfo->setMinWeek(CalendarHelper::dateWeek(date_format($argument->getMinDate(), DateTimeItemInterface::DATE_STORAGE_FORMAT)));
+    $min_week = CalendarHelper::dateWeek(date_format($argument->getMinDate(), DateTimeItemInterface::DATE_STORAGE_FORMAT));
+    $this->dateInfo->setMinWeek($min_week);
     // $this->dateInfo->setRange($argument->options['calendar']['date_range']);
-    $this->dateInfo->setMinDate($argument->getMinDate());
-    $this->dateInfo->setMaxDate($argument->getMaxDate());
+    $min_date = $argument->getMinDate();
+    $max_date = $argument->getMaxDate();
+    $max_date->add(\DateInterval::createFromDateString($first_day . ' day'));
+    $this->dateInfo->setMinDate($min_date);
+    $this->dateInfo->setMaxDate($max_date);
     // @todo implement limit
     //   $this->dateInfo->limit = $argument->limit;
     // @todo What if the display doesn't have a route?
@@ -597,6 +622,7 @@ class Calendar extends StylePluginBase {
     // $this->dateInfo->max_zone_string = date_format($date, DATETIME_DATE_STORAGE_FORMAT);
     // Let views render fields the way it thinks they should look before we
     // start massaging them.
+
     $this->renderFields($this->view->result);
 
     // Invoke the row plugin to massage each result row into calendar items.
@@ -654,14 +680,15 @@ class Calendar extends StylePluginBase {
     // Adjust the theme to match the currently selected default.
     // Only the month view needs the special 'mini' class,
     // which is used to retrieve a different, more compact, theme.
+
     if ($this->options['calendar_type'] == 'month' && !empty($this->styleInfo->isMini())) {
       $this->definition['theme'] = 'calendar_mini';
     }
     // If the overlap option was selected, choose overlap version of the theme.
     elseif (in_array($this->options['calendar_type'], [
-      'week',
-      'day',
-    ]) && !empty($this->options['multiday_theme']) && !empty($this->options['theme_style'])) {
+        'week',
+        'day',
+      ]) && !empty($this->options['multiday_theme'])) {
       $this->definition['theme'] .= '_overlap';
     }
 
@@ -682,17 +709,20 @@ class Calendar extends StylePluginBase {
   public function calendarBuildMonth() {
     $week_days = CalendarHelper::weekDays(TRUE);
     $week_days = CalendarHelper::weekDaysOrdered($week_days);
-    // $month = date_format($this->curday, 'n');
     $current_day_date = $this->currentDay->format(DateTimeItemInterface::DATE_STORAGE_FORMAT);
+    $min_date = $this->dateInfo->getMinDate()->format(DateTimeItemInterface::DATE_STORAGE_FORMAT);
+    $max_date = $this->dateInfo->getMaxDate()->format(DateTimeItemInterface::DATE_STORAGE_FORMAT);
     $today = new \DateTime();
     $today = $today->format(DateTimeItemInterface::DATE_STORAGE_FORMAT);
     $day = $this->currentDay->format('j');
     $this->currentDay->modify('-' . strval($day - 1) . ' days');
     $rows = [];
+
     do {
       $init_day = clone($this->currentDay);
       $month = $this->currentDay->format('n');
       $week = CalendarHelper::dateWeek($current_day_date);
+
       $first_day = \Drupal::config('system.date')->get('first_day');
       list($multiday_buckets, $singleday_buckets, $total_rows) = array_values($this->calendarBuildWeek(TRUE));
 
@@ -708,10 +738,10 @@ class Calendar extends StylePluginBase {
 
         // If we're displaying the week number, add it as the first cell in the
         // week.
-        if ($i == 0 && !empty($this->styleInfo->isShowWeekNumbers()) && !in_array($this->dateInfo->getGranularity(), [
-          'day',
-          'week',
-        ])) {
+        if ($i == 0
+          && !empty($this->styleInfo->isShowWeekNumbers())
+          && !in_array($this->dateInfo->getGranularity(), ['day', 'week'])
+        ) {
           $url = CalendarHelper::getURLForGranularity($this->view, 'week', [$this->dateInfo->getMinYear() . $week]);
           if (!empty($url)) {
             $week_number = [
@@ -744,12 +774,13 @@ class Calendar extends StylePluginBase {
         $this->currentDay->modify('-' . ((7 + $day_week_day - $first_day) % 7) . ' days');
 
         foreach ($week_days as $week_day => $day_object) {
-
-          $current_day_date = $this->currentDay->format(DateTimeItemInterface::DATE_STORAGE_FORMAT);
           $item = NULL;
-          $in_month = !($current_day_date < $this->dateInfo->getMinDate()
-            ->format(DateTimeItemInterface::DATE_STORAGE_FORMAT) || $current_day_date > $this->dateInfo->getMaxDate()
-            ->format(DateTimeItemInterface::DATE_STORAGE_FORMAT) || $this->currentDay->format('n') != $month);
+          $current_day_date = $this->currentDay->format(DateTimeItemInterface::DATE_STORAGE_FORMAT);
+          $in_month = !(
+            $current_day_date < $min_date
+            || $current_day_date > $max_date
+            || $this->currentDay->format('n') != $month
+          );
 
           // Add the datebox.
           if ($i == 0) {
@@ -788,7 +819,7 @@ class Calendar extends StylePluginBase {
             // Process multiday buckets first.
             if ($index < $multi_count) {
               // If this item is filled with either a blank or an entry.
-              if ($multiday_buckets[$week_day][$index]['filled']) {
+              if (isset($multiday_buckets[$week_day][$index]['filled']) && ($multiday_buckets[$week_day][$index]['filled'])) {
 
                 // Add item and add class.
                 $item = $multiday_buckets[$week_day][$index];
@@ -819,7 +850,7 @@ class Calendar extends StylePluginBase {
 
               // If this is an actual entry, add classes regarding the state of
               // the item.
-              if ($multiday_buckets[$week_day][$index]['avail']) {
+              if (isset($multiday_buckets[$week_day][$index]['avail']) && $multiday_buckets[$week_day][$index]['avail']) {
                 $item['class'] .= ' ' . $week_day . ' ' . $index . ' no-entry ';
                 $item['class'] .= ($current_day_date == $today && $in_month ? ' today' : '') .
                   ($current_day_date < $today ? ' past' : '') .
@@ -948,8 +979,9 @@ class Calendar extends StylePluginBase {
 
       $current_day_date = $this->currentDay->format(DateTimeItemInterface::DATE_STORAGE_FORMAT);
       $current_day_month = $this->currentDay->format('n');
-    } while ($current_day_month == $month && $current_day_date <= $this->dateInfo->getMaxDate()
-      ->format(DateTimeItemInterface::DATE_STORAGE_FORMAT));
+    }
+    while ($current_day_month == $month && $current_day_date <= $max_date);
+
     // Merge the day names in as the first row.
     $rows = array_merge([CalendarHelper::weekHeader($this->view)], $rows);
     return $rows;
@@ -962,14 +994,15 @@ class Calendar extends StylePluginBase {
     $month = $this->currentDay->format('n');
     $day = $this->currentDay->format('j');
     $this->currentDay->modify('-' . strval($day - 1) . ' days');
+    $max_date = $this->dateInfo->getMaxDate()->format(DateTimeItemInterface::DATE_STORAGE_FORMAT);
     $rows = [];
 
     do {
       $rows = array_merge($rows, $this->calendarBuildMiniWeek());
       $current_day_date = $this->currentDay->format(DateTimeItemInterface::DATE_STORAGE_FORMAT);
       $current_day_month = $this->currentDay->format('n');
-    } while ($current_day_month == $month && $current_day_date <= $this->dateInfo->getMaxDate()
-      ->format(DateTimeItemInterface::DATE_STORAGE_FORMAT));
+    }
+    while ($current_day_month == $month && $current_day_date <= $max_date);
 
     // Merge the day names in as the first row.
     $rows = array_merge([CalendarHelper::weekHeader($this->view)], $rows);
@@ -990,6 +1023,8 @@ class Calendar extends StylePluginBase {
     $week_days = CalendarHelper::weekDays(TRUE);
     $week_days = CalendarHelper::weekDaysOrdered($week_days);
     $current_day_date = $this->currentDay->format(DateTimeItemInterface::DATE_STORAGE_FORMAT);
+    $min_date = $this->dateInfo->getMinDate()->format(DateTimeItemInterface::DATE_STORAGE_FORMAT);
+    $max_date = $this->dateInfo->getMaxDate()->format(DateTimeItemInterface::DATE_STORAGE_FORMAT);
     $month = $this->currentDay->format('n');
     $first_day = \Drupal::config('system.date')->get('first_day');
 
@@ -999,15 +1034,14 @@ class Calendar extends StylePluginBase {
     // Move backwards to the first day of the week.
     $day_week_day = $this->currentDay->format('w');
     $this->currentDay->modify('-' . ((7 + $day_week_day - $first_day) % 7) . ' days');
+    $multiday_theme = !empty($this->styleInfo->getMultiDayTheme()) && $this->styleInfo->getMultiDayTheme() == '1';
 
     foreach ($week_days as $i => $day_object) {
       // Create each bucket on the fly so it goes with the correct key order.
       $multiday_buckets[$i] = [];
       $singleday_buckets[$i] = [];
 
-      if ($check_month && ($current_day_date < $this->dateInfo->getMinDate()
-        ->format(DateTimeItemInterface::DATE_STORAGE_FORMAT) || $current_day_date > $this->dateInfo->getMaxDate()
-        ->format(DateTimeItemInterface::DATE_STORAGE_FORMAT) || $this->currentDay->format('n') != $month)) {
+      if ($check_month && ($current_day_date < $min_date || $current_day_date > $max_date || $this->currentDay->format('n') != $month)) {
         $singleday_buckets[$i][][] = [
           'entry' => [
             '#theme' => 'calendar_empty_day',
@@ -1020,7 +1054,13 @@ class Calendar extends StylePluginBase {
       else {
         $this->calendarBuildWeekDay($i, $multiday_buckets, $singleday_buckets);
       }
-      $total_rows = max(count($multiday_buckets[$i]) + 1, $total_rows);
+
+      if ($multiday_theme) {
+        $total_rows = max(count($multiday_buckets[$i]) + 1, $total_rows);
+      } else {
+        $total_rows = max(count($singleday_buckets[$i]) + 1, $total_rows);
+      }
+
       $this->currentDay->modify('+1 day');
       $current_day_date = $this->currentDay->format(DateTimeItemInterface::DATE_STORAGE_FORMAT);
     }
@@ -1045,6 +1085,8 @@ class Calendar extends StylePluginBase {
     $current_day_date = $this->currentDay->format(DateTimeItemInterface::DATE_STORAGE_FORMAT);
     $weekdays = CalendarHelper::untranslatedDays();
     $today = $this->dateFormatter->format($this->time->getRequestTime(), 'custom', DateTimeItemInterface::DATE_STORAGE_FORMAT);
+    $min_date = $this->dateInfo->getMinDate()->format(DateTimeItemInterface::DATE_STORAGE_FORMAT);
+    $max_date = $this->dateInfo->getMaxDate()->format(DateTimeItemInterface::DATE_STORAGE_FORMAT);
     $month = $this->currentDay->format('n');
     $week = CalendarHelper::dateWeek($current_day_date);
 
@@ -1078,9 +1120,8 @@ class Calendar extends StylePluginBase {
     for ($i = 0; $i < 7; $i++) {
       $current_day_date = $this->currentDay->format(DateTimeItemInterface::DATE_STORAGE_FORMAT);
       $class = strtolower($weekdays[$this->currentDay->format('w')] . ' mini');
-      if ($check_month && ($current_day_date < $this->dateInfo->getMinDate()
-        ->format(DateTimeItemInterface::DATE_STORAGE_FORMAT) || $current_day_date > $this->dateInfo->getMaxDate()
-        ->format(DateTimeItemInterface::DATE_STORAGE_FORMAT) || $this->currentDay->format('n') != $month)) {
+
+      if ($check_month && ($current_day_date < $min_date || $current_day_date > $max_date || $this->currentDay->format('n') != $month)) {
         $class .= ' empty';
 
         $content = [
@@ -1145,6 +1186,111 @@ class Calendar extends StylePluginBase {
     }
   }
 
+  /**
+   * Empty cell slots
+   */
+  public function initCellSlots () {
+    $this->cellSlots = [];
+  }
+
+  /**
+   * Check if slot is empty or not
+   *
+   * @param int $wday
+   *   The index of the day.
+   * @param int $index
+   *   The index of row.
+   */
+  public function isCellSlotEmpty ($index, $wday) {
+    if (!isset($this->cellSlots[$index][$wday])) return true;
+    return ($this->cellSlots[$index][$wday] === 0);
+  }
+
+  /**
+   * Fill slot
+   *
+   * @param any $initial_value
+   *   The initial value.
+   */
+  public function defaultCellSlotRow ($initial_value = 0) {
+    $row = [];
+    for ($i = 0; $i < 30; $i++) {
+      $row[$i] = $initial_value;
+    }
+    return $row;
+  }
+
+  /**
+   * Fill slot
+   *
+   * @param int $wday
+   *   The index of the day.
+   * @param int $index
+   *   The index of row.
+   * @param boolean|any $data
+   *   The slot data.
+   */
+  public function setCellSlot ($index, $wday, $length = 1, $data = 1) {
+    if (!isset($this->cellSlots[$index])) $this->cellSlots[$index] = $this->defaultCellSlotRow();
+    for ($i = $wday; $i < $wday + $length; $i++) {
+      if ($i < 31) $this->cellSlots[$index][$i] = $data;
+    }
+  }
+
+  /**
+   * Find empty slot
+   *
+   * @param int $wday
+   *   The index of the day.
+   * @param int $index
+   *   The index of row.
+   * @param boolean|any $data
+   *   The slot data.
+   */
+  public function findEmptyCellFloor ($wday, $length = 1, $only_append = false) {
+
+    $empty_found = false;
+
+    if (!$only_append) {
+      for ($i = 0; $i < count($this->cellSlots); $i++) {
+        if ($length > 0) $empty_found = true;
+        for ($j=$wday; $j<$wday + $length; $j++) {
+          if (!$this->isCellSlotEmpty($i, $j)) {
+            $empty_found = false;
+            break;
+          }
+        }
+        if ($empty_found) {
+          return $i;
+        }
+      }
+    }
+
+    $this->cellSlots[] = $this->defaultCellSlotRow();
+    return count($this->cellSlots) - 1;
+  }
+
+  /**
+   * Find empty slot
+   *
+   * @param int $wday
+   *   The index of the day.
+   * @param int $index
+   *   The index of row.
+   * @param boolean|any $data
+   *   The slot data.
+   */
+  public function findCellFloorById ($wday, $data) {
+    for ($i = 0; $i < count($this->cellSlots); $i++) {
+      if ($this->cellSlots[$i][$wday] == $data) {
+        return $i;
+      }
+    }
+
+    return false;
+  }
+
+
   /**
    * Fill in the selected day info into the event buckets.
    *
@@ -1156,7 +1302,12 @@ class Calendar extends StylePluginBase {
    *   The buckets holding singleday event info for a week.
    */
   public function calendarBuildWeekDay($wday, array &$multiday_buckets, array &$singleday_buckets) {
+    // Initialize $cellSots if it's start of the week.
+    $first_day = \Drupal::config('system.date')->get('first_day');
+    if ($wday == $first_day) $this->initCellSlots();
+
     $current_day_date = $this->currentDay->format(DateTimeItemInterface::DATE_STORAGE_FORMAT);
+    $day_value = intval($this->currentDay->format('j'));
 
     $max_events = $this->dateInfo->getCalendarType() == 'month' && !empty($this->styleInfo->getMaxItems()) ? $this->styleInfo->getMaxItems() : 0;
     $hide = !empty($this->styleInfo->getMaxItemsStyle()) ? ($this->styleInfo->getMaxItemsStyle() == 'hide') : FALSE;
@@ -1197,14 +1348,18 @@ class Calendar extends StylePluginBase {
               $all_day = $item->isAllDay();
 
               // Parse out date part.
-              $start_ydate = $this->dateFormatter->format($item->getStartDate()
-                ->getTimestamp(), 'custom', 'Y-m-d');
-              $end_ydate = $this->dateFormatter->format($item->getEndDate()
-                ->getTimestamp(), 'custom', 'Y-m-d');
+              $start_ydate = $this->dateFormatter->format($item->getStartDate()->getTimestamp(), 'custom', 'Y-m-d');
+              $end_ydate = $this->dateFormatter->format($item->getEndDate()->getTimestamp(), 'custom', 'Y-m-d');
               $cur_ydate = $this->dateFormatter->format($this->currentDay->getTimestamp(), 'custom', 'Y-m-d');
 
+              $cur_ydate_1 = date('Y-m-d', strtotime($cur_ydate . ' +1 day'));
+
               $is_multi_day = ($start_ydate < $cur_ydate || $end_ydate > $cur_ydate);
 
+              $day = \DateTime::createFromFormat('Y-m-d', $cur_ydate_1);
+              $day->setISODate((int)$day->format('o'), (int) $day->format('W'), 1);
+              $f = date('Y-m-d', strtotime($day->format('Y-m-d') . ' -1 day'));
+
               // Check if the event spans over multiple days.
               if ($multiday_theme && ($is_multi_day || $all_day)) {
 
@@ -1216,35 +1371,106 @@ class Calendar extends StylePluginBase {
                 // the multi-day event, then record this item, otherwise skip
                 // over.
                 $day_no = $this->currentDay->format('d');
-                if ($wday == 0 || $start_ydate == $cur_ydate || ($this->dateInfo->getGranularity() == 'month' && $day_no == 1) || ($all_day && !$is_multi_day)) {
+                if ($wday == $first_day || $start_ydate == $cur_ydate || ($this->dateInfo->getGranularity() == 'week')  || ($this->dateInfo->getGranularity() == 'month') || ($all_day && !$is_multi_day)) {
                   // Calculate the colspan for this event.
                   // If the last day of this event exceeds the end of the
                   // current month or week, truncate the remaining days.
                   $diff = CalendarHelper::difference($this->currentDay, $this->dateInfo->getMaxDate(), 'days');
-                  $remaining_days = ($this->dateInfo->getGranularity() == 'month') ? min(6 - $wday, $diff) : $diff - 1;
-                  // The bucket_cnt defines colspan. colspan = bucket_cnt + 1.
-                  $days = CalendarHelper::difference($this->currentDay, $item->getEndDate(), 'days');
-                  $bucket_cnt = max(0, min($days, $remaining_days));
-
-                  // See if there is an available slot to add an event.
-                  // This will allow an event to precede a row filled up by a
-                  // previous day event.
-                  $bucket_index = count($multiday_buckets[$wday]);
-                  for ($i = 0; $i < $bucket_index; $i++) {
-                    if ($multiday_buckets[$wday][$i]['avail']) {
-                      $bucket_index = $i;
-                      break;
-                    }
+                  $remaining_days = $diff - 1;
+                  if ($this->dateInfo->getGranularity() == 'month') {
+                    // Need to limit to week days
+                    $week_limit = ($wday < $first_day) ? ($first_day - $wday - 1) : (6 - $wday + $first_day);
+                    $remaining_days = min($week_limit, $diff);
                   }
 
-                  // Add continuation attributes.
-                  $item->continuation = $item->getStartDate() < $this->currentDay;
-                  $item->continues = $days > $bucket_cnt;
-                  $item->is_multi_day = TRUE;
+                  // if ($start_ydate == $cur_ydate || $cur_ydate == $f) {
+                  if ($start_ydate == $cur_ydate || $wday == $first_day) {
+
+                    // The bucket_cnt defines colspan. colspan = bucket_cnt + 1.
+                    $days = CalendarHelper::difference($this->currentDay, $item->getEndDate(), 'days');
+                    $bucket_cnt = max(0, min($days, $remaining_days));
+
+                    // Add continuation attributes.
+                    $item->continuation = $item->getStartDate() < $this->currentDay;
+                    $item->continues = $days > $bucket_cnt;
+                    $item->is_multi_day = TRUE;
+                    // Get new floor index available.
+                    $tr_floor = $this->findEmptyCellFloor($day_value - 1, $bucket_cnt + 1);
+                    $this->setCellSlot($tr_floor, $day_value - 1, $bucket_cnt + 1, $item->getEntityId());
+
+                    // Assign the item to the available bucket.
+                    // $multiday_buckets[$wday][$bucket_index] = [
+                    $multiday_buckets[$wday][$tr_floor] = [
+                      'colspan' => $bucket_cnt + 1,
+                      'rowspan' => 1,
+                      'filled' => TRUE,
+                      'avail' => FALSE,
+                      'all_day' => $all_day,
+                      'item' => $item,
+                      'wday' => $wday,
+                      'entry' => [
+                        '#theme' => 'calendar_item',
+                        '#view' => $this->view,
+                        '#rendered_fields' => $item->getRenderedFields(),
+                        '#item' => $item,
+                      ],
+                    ];
+
+                  } else {
+
+                    // The bucket_cnt defines colspan. colspan = bucket_cnt + 1.
+                    $days = CalendarHelper::difference($this->currentDay, $item->getEndDate(), 'days');
+                    $bucket_cnt = max(0, min($days, $remaining_days));
+
+                    // Get new floor index available.
+                    $tr_floor = $this->findCellFloorById($day_value - 1, $item->getEntityId());
+                    if ($tr_floor !== false) {
+
+                      // Add continuation attributes.
+                      $item->continuation = $item->getStartDate() < $this->currentDay;
+                      $item->continues = $days > $bucket_cnt;
+                      $item->is_multi_day = TRUE;
 
-                  // Assign the item to the available bucket.
-                  $multiday_buckets[$wday][$bucket_index] = [
-                    'colspan' => $bucket_cnt + 1,
+                      // Assign the item to the available bucket.
+                      // $multiday_buckets[$wday][$bucket_index] = [
+                      $multiday_buckets[$wday][$tr_floor] = [
+                        'colspan' => 0,
+                        'rowspan' => 1,
+                        'filled' => TRUE,
+                        'avail' => FALSE,
+                        'all_day' => $all_day,
+                        'item' => $item,
+                        'wday' => $wday,
+                        "dnone" => 'dnone',
+                        'entry' => [
+                          '#theme' => 'calendar_item',
+                          '#view' => $this->view,
+                          '#rendered_fields' => $item->getRenderedFields(),
+                          '#item' => $item,
+                        ],
+                      ];
+
+                    }
+                  }
+                }
+              } elseif ($max_events == CALENDAR_SHOW_ALL || $current_count < $max_events) {
+
+                //
+                // If you need to add single-day event amid of multiday events, following block should be enabled
+                // by removing "false && " in if statement.
+                //
+                if (false && $multiday_theme) {
+                  //
+                  // Get new floor index available.
+                  $tr_floor = $this->findEmptyCellFloor($day_value - 1, 1);
+                  $this->setCellSlot($tr_floor, $day_value - 1, 1, $item->getEntityId());
+
+                  //
+                  // Assign the item to the available bucket,
+                  // as if it's multiday event.
+                  //
+                  $multiday_buckets[$wday][$tr_floor] = [
+                    'colspan' => 1,
                     'rowspan' => 1,
                     'filled' => TRUE,
                     'avail' => FALSE,
@@ -1259,58 +1485,29 @@ class Calendar extends StylePluginBase {
                     ],
                   ];
 
-                  // Block out empty buckets for the next days in this event for
-                  // this week.
-                  for ($i = 0; $i < $bucket_cnt; $i++) {
-                    $bucket = &$multiday_buckets[$i + $wday + 1];
-                    if (!empty($bucket)) {
-                      $bucket_row_count = count($bucket);
-                    }
-                    else {
-                      $bucket_row_count = 0;
-                    }
-                    $row_diff = $bucket_index - $bucket_row_count;
-
-                    // Fill up the preceding buckets - these are available for
-                    // future events.
-                    for ($j = 0; $j < $row_diff; $j++) {
-                      $bucket[($bucket_row_count + $j)] = [
-                        'entry' => '',
-                        'colspan' => 1,
-                        'rowspan' => 1,
-                        'filled' => TRUE,
-                        'avail' => TRUE,
-                        'wday' => $wday,
-                        'item' => NULL,
-                      ];
-                    }
-                    $bucket[$bucket_index] = [
-                      'filled' => FALSE,
-                      'avail' => FALSE,
-                    ];
-                  }
+                } else {
+                  $current_count++;
+                  // Assign to single day bucket.
+                  $singleday_buckets[$wday][$time][] = [
+                    'entry' => [
+                      '#theme' => 'calendar_item',
+                      '#view' => $this->view,
+                      '#rendered_fields' => $item->getRenderedFields(),
+                      '#item' => $item,
+                    ],
+                    'item' => $item,
+                    'colspan' => 1,
+                    'rowspan' => 1,
+                    'filled' => TRUE,
+                    'avail' => FALSE,
+                    'wday' => $wday,
+                  ];
                 }
-              }
-              elseif ($max_events == CALENDAR_SHOW_ALL || $current_count < $max_events) {
-                $current_count++;
-                // Assign to single day bucket.
-                $singleday_buckets[$wday][$time][] = [
-                  'entry' => [
-                    '#theme' => 'calendar_item',
-                    '#view' => $this->view,
-                    '#rendered_fields' => $item->getRenderedFields(),
-                    '#item' => $item,
-                  ],
-                  'item' => $item,
-                  'colspan' => 1,
-                  'rowspan' => 1,
-                  'filled' => TRUE,
-                  'avail' => FALSE,
-                  'wday' => $wday,
-                ];
+
               }
 
             }
+
           }
         }
       }
@@ -1332,6 +1529,25 @@ class Calendar extends StylePluginBase {
         ];
       }
     }
+    //
+    // Fix multiday blank cell issue
+    //
+    foreach($multiday_buckets as $i => $row) {
+      for ($j = 0; $j < count($multiday_buckets[$i]); $j++) {
+        if (!isset($multiday_buckets[$i][$j])) {
+          $is_empty = $this->isCellSlotEmpty($i, $j);
+          $multiday_buckets[$i][$j] = [
+            'entry' => '',
+            'colspan' => 1,
+            'rowspan' => 1,
+            'filled' => TRUE,
+            'avail' => $is_empty ? TRUE :FALSE,
+            'wday' => $i,
+            'item' => NULL,
+          ];
+        }
+      }
+    }
   }
 
   /**
diff --git a/templates/calendar-week-overlap.html.twig b/templates/calendar-week-overlap.html.twig
index cb7926b..1f0ed4c 100644
--- a/templates/calendar-week-overlap.html.twig
+++ b/templates/calendar-week-overlap.html.twig
@@ -1,184 +1,115 @@
-<?php
+{#
 /**
  * @file
- * Template to display a view as a calendar week with overlapping items
- * 
- * @see template_preprocess_calendar_week.
+ * Template to display a view as a calendar week.
+ *
+ * Available variables:
+ * - day_names: An array of the day of week names for the table header.
+ * - rows: The rendered data for this week.
  *
- * $day_names: An array of the day of week names for the table header.
- * $rows: The rendered data for this week.
- * 
  * For each day of the week, you have:
- * $rows['date'] - the date for this day, formatted as YYYY-MM-DD.
- * $rows['datebox'] - the formatted datebox for this day.
- * $rows['empty'] - empty text for this day, if no items were found.
- * $rows['all_day'] - an array of formatted all day items.
- * $rows['items'] - an array of timed items for the day.
- * $rows['items'][$time_period]['hour'] - the formatted hour for a time period.
- * $rows['items'][$time_period]['ampm'] - the formatted ampm value, if any for a time period.
- * $rows['items'][$time_period]['values'] - An array of formatted items for a time period.
- * 
- * $view: The view.
- * $min_date_formatted: The minimum date for this calendar in the format YYYY-MM-DD HH:MM:SS.
- * $max_date_formatted: The maximum date for this calendar in the format YYYY-MM-DD HH:MM:SS.
- * 
+ * - rows['date'] - the date for this day, formatted as YYYY-MM-DD.
+ * - rows['datebox'] - the formatted datebox for this day.
+ * - rows['empty'] - empty text for this day, if no items were found.
+ * - rows['all_day'] - an array of formatted all day items.
+ * - rows['items'] - an array of timed items for the day.
+ * - rows['items'][$time_period]['hour'] - the formatted hour for a time period.
+ * - rows['items'][$time_period]['ampm'] - the formatted ampm value, if any for a time period.
+ * - rows['items'][$time_period]['values'] - An array of formatted items for a time period.
+ *
+ * @see template_preprocess_calendar_week()
+ *
+ * @ingroup themeable
  */
-?>
+#}
 <div class="calendar-calendar"><div class="week-view">
-  <div id="header-container">
-  <table class="full">
-  <tbody>
-    <tr class="holder"><td class="calendar-time-holder"></td><td class="calendar-day-holder"></td><td class="calendar-day-holder"></td><td class="calendar-day-holder"></td><td class="calendar-day-holder"></td><td class="calendar-day-holder"></td><td class="calendar-day-holder"></td><td class="calendar-day-holder"></td><td class="calendar-day-holder margin-right"></td></tr>
+<table class="full">
+  <thead>
     <tr>
-      <th class="calendar-agenda-hour">&nbsp;</th>
+      {% if by_hour_content > 0 or start_times is not empty %}
+      <th class="calendar-agenda-hour">{% trans %}Time{% endtrans %}</th>
+      {% endif %}
       {% for cell in day_names %}
         <th class="{{ cell.class }}" id="{{ cell.header_id }}">
           {{ cell.data }}
         </th>
       {% endfor %}
-      <th class="calendar-day-holder margin-right"></th>
     </tr>
-  </tbody>
-  </table>
-  </div>
-    {# Multi-day and all day events are not supported because dates don't have end values yes
-  <div id="multi-day-container">
-  <table class="full">
+  </thead>
   <tbody>
-  <tr class="holder"><td class="calendar-time-holder"></td><td class="calendar-day-holder"></td><td class="calendar-day-holder"></td><td class="calendar-day-holder"></td><td class="calendar-day-holder"></td><td class="calendar-day-holder"></td><td class="calendar-day-holder"></td><td class="calendar-day-holder"></td></tr>
-    {% for i in 0..multiday_rows %}
+
+    {%  for i in 0..multiday_rows %}
       {% set row_class = 'all-day' %}
-      {% set row_class_extra = '' %}
       {% if loop.first %}{% set row_class_extra = 'first' %}{% endif %}
       {% if loop.last %}{% set row_class_extra = 'last' %}{% endif %}
 
-      <tr class="{{ row_class }} {{ row_class_extra }}">
-        {% if loop.index0 == 0 and (by_hour_count > 0 or start_times is not empty) %}
+    <tr class="{{ row_class }} {{ row_class_extra }}">
+      {% if loop.index == 0 and (by_hour_count > 0 or start_times is not empty) %}
         <td class="{{ agenda_hour_class }}" rowspan="{{ multiday_rows }}">
           <span class="calendar-hour">{% trans with {'context': 'datetime'} %}All day{% endtrans %}</span>
         </td>
-        {% endif %}
-
-        {% for j in 0..7 %}
-          {% set cell = all_day[j][i] %}
-          {% if cell is not empty and cell.filled and cell['wday'] == j %}
-            {% for position in colpos..cell['wday'] %}
-              {% set col_class = "calendar-agenda-items multi-day"%}
-              {% set col_class_extra = '' %}
-              {% if loop.first %}{% set col_class_extra = 'first' %}{% endif %}
-              {% if loop.last %}{% set col_class_extra = 'last' %}{% endif %}
+      {% endif %}
 
-              <td class="{{ col_class }} {{ col_class_extra }}"><div class="inner">&nbsp;</div></td>
-            {% endfor %}
-
-            <td colspan="{{ cell['colspan'] }}" class="{{ col_class }}">
-              <div class="inner">
-                {{ cell.entry }}
-              </div>
-            </td>
-            {% set colpos = colpos + cell['colspan'] %}
-          {% endif %}
-        {% endfor %}
+      {% set colpos = 0 %}
+      {% for j in 0..6 %}
+        {% set cell = all_day[j][i] %}
+        {% if cell is not empty and cell.filled and cell['wday'] == j %}
+          {# {% for k in colpos..cell['wday'] %}
+            <td class="multi-day no-entry"><div class="inner">&nbsp;</div></td>
+          {% endfor %} #}
+          <td colspan="{{ cell['colspan'] }}" class="multi-day">
+            <div class="inner">
+              {{ cell.entry }}
+            </div>
+          </td>
+          {# {% set colpos = cell['wday'] + cell['colspan'] + 1 %} #}
+        {% else %}
+          <td class="multi-day no-entry"><div class="inner">&nbsp;</div></td>
+        {% endif %}
+      {% endfor %}
 
-        {% for k in colpos..7 %}
-          {% set col_class = "calendar-agenda-items multi-day no-entry" %}
-          {% set col_class_extra = '' %}
-          {% if loop.first %}{% set col_class_extra = 'first' %}{% endif %}
-          {% if loop.last %}{% set col_class_extra = 'last' %}{% endif %}
-          <td class="{{ col_class }} {{ col_class_extra }}"><div class="inner">&nbsp;</div></td>
-        {% endfor %}
-      </tr>
+      {# {% for j in colpos..6 %}
+        <td class="multi-day no-entry"><div class="inner">&nbsp;</div></td>
+      {% endfor %} #}
+    </tr>
     {% endfor %}
-
-    {% if multiday_rows == 0 %}
-      <tr>
-        <td class="{{ agenda_hour_class }}">
-          <span class="calendar-hour">{% trans with {'context': 'datetime'} %}All day{% endtrans %}</span>
-        </td>
-        {% for j in 0..7 %}
-          {% set col_class = "calendar-agenda-items multi-day no-entry" %}
-          {% set col_class_extra = '' %}
-          {% if loop.first %}{% set col_class_extra = 'first' %}{% endif %}
-          {% if loop.last %}{% set col_class_extra = 'last' %}{% endif %}
-          <td class="{{ col_class }} {{ col_class_extra }}"><div class="inner">&nbsp;</div></td>
-        {% endfor %}
-      </tr>
-    {% endif %}
-
-    <tr class="expand">
-      <td class="{{ agenda_hour_class }}">
-        <span class="calendar-hour">&nbsp;</span>
+    {% for time in items %}
+    <tr class="not-all-day">
+      <td class="calendar-agenda-hour">
+        <span class="calendar-hour">{{ time.hour }}</span><span class="calendar-ampm">{{ time.ampm }}</span>
       </td>
-
-      {% for j in 0..7 %}
-        {% set col_class = "calendar-agenda-items multi-day no-entry" %}
-        {% set col_class_extra = '' %}
-        {% if loop.first %}{% set col_class_extra = 'first' %}{% endif %}
-        {% if loop.last %}{% set col_class_extra = 'last' %}{% endif %}
-        <td class="{{ col_class }} {{ col_class_extra }}"><div class="inner">&nbsp;</div></td>
-      {% endfor %}
-      <td class="{{ col_class }}"><div class="inner">&nbsp;</div></td>
-     </tr>
-  </thead> 
-  </table>
-  </div>
-  <div class="header-body-divider">&nbsp;</div>
-  #}
-  <div id="single-day-container">
-    <table class="full">
-      <tbody>
-        <tr class="holder"><td class="calendar-time-holder"></td><td class="calendar-day-holder"></td><td class="calendar-day-holder"></td><td class="calendar-day-holder"></td><td class="calendar-day-holder"></td><td class="calendar-day-holder"></td><td class="calendar-day-holder"></td><td class="calendar-day-holder"></td></tr>
-        <tr>
-          {% for i in 0..7 %}
-            {% if loop.first %}
-              <td class="first">
-            {% elseif loop.index0 == 7 %}
-              <td class="last" headers="{{ header_ids[loop.index0 - 1] }}">
-            {% else %}
-              <td headers="{{ header_ids[loop.index0 - 1] }}">
-            {% endif %}
-
-            {% for time_cnt, start_time in start_times %}
-              {% if time_cnt == 0 %}
-                {% set class = 'first' %}
-              {% elseif time_cnt == start_times|length - 1 %}
-                {% set class = 'last' %}
-              {% else %}
-                {% set class = '' %}
-              {% endif %}
-
-              {% if loop.parent.loop.first %}
-                {% set time = items[start_time] %}
-                <div class="{{ class }} calendar-agenda-hour">
-                  <span class="calendar-hour">{{ time.hour }}</span><span class="calendar-ampm">{{ time.ampm }}</span>
-                </div>
-              {% else %}
-                <div class="{{ class }} calendar-agenda-items single-day">
-                <div class="half-hour">&nbsp;</div>
-                  <div class="calendar item-wrapper">
-                    <div class="inner">
-                      {#{% if items[start_time]['values'] is not empty %}{{ dump(items[start_time]['values']) }}{% endif %}#}
-                      {% if items[start_time]['values'][loop.parent.loop.index0 - 1] %}
-                        {% for item in items[start_time]['values'][loop.parent.loop.index0 - 1] %}
-                          {% if item['is_first'] %}
-                            <div class="item {{ item.class }} first_item">
-                          {% else %}
-                            <div class="item {{ item.class }}">
-                          {% endif %}
-                              {{ item.entry }}
-                            </div>
-                        {% endfor %}
-                      {% endif %}
-                    </div>
-                  </div>
-                </div>
-                {% endif %}
+      {% set current_position = 0 %}
+      {% for column in columns %}
+        {% set column_position = time.values.column[0] ? time.values.column[0].wday : loop.index %}
+        {% for i in column_position %}
+          <td class="calendar-agenda-items single-day">
+            <div class="calendar">
+              <div class="inner">&nbsp</div>
+            </div>
+          </td>
+        {% endfor %}
+        {% set current_position = column_position + 1 %}
+        <td class="calendar-agenda-items single-day" headers="{{ header_ids[loop.index - 1] }}">
+          <div class="calendar">
+            <div class="inner">
+              {% for item in time.values[column] %}
+                {{ item.entry }}
               {% endfor %}
-            </td>
-          {% endfor %}
-        </tr>
-      </tbody>
-    </table>
-  </div>
-  <div class="single-day-footer">&nbsp;</div>
+            </div>
+          </div>
+        </td>
+      {% endfor %}
+      {% if current_position < 7 %}
+        {% for i in current_position..6 %}
+          <td class="calendar-agenda-items single-day">
+            <div class="calendar">
+              <div class="inner">&nbsp</div>
+            </div>
+          </td>
+        {% endfor %}
+      {% endif %}
+    </tr>
+    {% endfor %}
+  </tbody>
+</table>
 </div></div>
diff --git a/templates/calendar-week.html.twig b/templates/calendar-week.html.twig
index 569a010..e312b85 100644
--- a/templates/calendar-week.html.twig
+++ b/templates/calendar-week.html.twig
@@ -37,6 +37,7 @@
     </tr>
   </thead>
   <tbody>
+
     {%  for i in 0..multiday_rows %}
       {% set row_class = 'all-day' %}
       {% if loop.first %}{% set row_class_extra = 'first' %}{% endif %}
@@ -49,27 +50,25 @@
         </td>
       {% endif %}
 
-      {% set colpos = 0 %}
       {% for j in 0..6 %}
         {% set cell = all_day[j][i] %}
         {% if cell is not empty and cell.filled and cell['wday'] == j %}
-          {% for k in colpos..cell['wday'] %}
-            <td class="multi-day no-entry"><div class="inner">&nbsp;</div></td>
-          {% endfor %}
           <td colspan="{{ cell['colspan'] }}" class="multi-day">
             <div class="inner">
               {{ cell.entry }}
             </div>
           </td>
-          {% set colpos = cell['wday'] + cell['colspan'] + 1 %}
+        {% else %}
+          <td class="calendar-agenda-items single-day">
+            <div class="calendar">
+              <div class="inner">&nbsp</div>
+            </div>
+          </td>
         {% endif %}
       {% endfor %}
-
-      {% for j in colpos..6 %}
-        <td class="multi-day no-entry"><div class="inner">&nbsp;</div></td>
-      {% endfor %}
     </tr>
     {% endfor %}
+
     {% for time in items %}
     <tr class="not-all-day">
       <td class="calendar-agenda-hour">
