         delayRunOnMainThread(0.0) { 
             let components = self.calendar.components([.Year, .Month, .Day],  fromDate: date)
             let firstDayOfDate = self.calendar.dateFromComponents(components)
+            
             if !firstDayOfDate!.isWithinInclusiveBoundaryDates(self.startOfMonthCache, endDate: self.endOfMonthCache) {
+                // If the date is not within valid boundaries, then exit
                 return
             }
             
             let periodApart = self.calendar.components(.Month, fromDate: self.startOfMonthCache, toDate: date, options: [])
             let segmentIndex = periodApart.month
-            let sectionIndexPath =  self.pathsFromDates([date])[0]
-            let page = self.currentSectionPage
-            
-            
-            if page != segmentIndex {
-                return // Incorrect section
-            }
-            self.calendarView.selectItemAtIndexPath(sectionIndexPath, animated: false, scrollPosition: .None)
-            
-            // Handle selection
-            if self.calendarView.allowsMultipleSelection == false {
+            let allPathsFromDates = self.pathsFromDates([date])
+            
+            // If the date path youre searching for, doesnt exist, then return
+            if allPathsFromDates.count < 0 {
+                return
+            }
+            
+            let sectionIndexPath = allPathsFromDates[0]
+            
+            
+            let selectTheDate = {
+                if self.selectedIndexPaths.contains(sectionIndexPath) == false { // Can contain the value already if the user selected the same date twice.
+                    self.selectedDates.append(date)
+                    self.selectedIndexPaths.append(sectionIndexPath)
+                }
+                
+                self.calendarView.selectItemAtIndexPath(sectionIndexPath, animated: false, scrollPosition: .None)
+                self.collectionView(self.calendarView, didSelectItemAtIndexPath: sectionIndexPath)
+            }
+            
+            let deSelectTheDate = { (indexPath: NSIndexPath) -> Void in
+                self.calendarView.deselectItemAtIndexPath(indexPath, animated: false)
+                self.collectionView(self.calendarView, didDeselectItemAtIndexPath: indexPath)
+            }
+            
+            // Remove old selections
+            if self.calendarView.allowsMultipleSelection == false { // If single selection is ON
                 for indexPath in self.selectedIndexPaths {
-                    self.calendarView.deselectItemAtIndexPath(indexPath, animated: false)
-                    self.collectionView(self.calendarView, didDeselectItemAtIndexPath: indexPath)
+                    if indexPath != sectionIndexPath {
+                        deSelectTheDate(indexPath)
+                    }
                 }
-            }
-            self.collectionView(self.calendarView, didSelectItemAtIndexPath: sectionIndexPath)
-        }
-
+
+                // Add new selections
+                // Must be added here. If added in delegate didSelectItemAtIndexPath
+                
+                selectTheDate()
+                
+            } else { // If multiple selection is on. Multiple selection behaves differently to singleselection. It behaves like a toggle.
+                
+                if self.selectedIndexPaths.contains(sectionIndexPath) { // If this cell is already selected, then deselect it
+                    deSelectTheDate(sectionIndexPath)
+                } else {
+                    // Add new selections
+                    // Must be added here. If added in delegate didSelectItemAtIndexPath
+                    selectTheDate()
+                }
+            }
+        }
     }
     
     /// Reload the date of specified date-cells on the calendar-view

    
    
    private(set) var selectedIndexPaths : [NSIndexPath] = [NSIndexPath]()
    private(set) var selectedDates : [NSDate] = [NSDate]()

    private var monthInfoActivated = false
    lazy private var monthInfo : [[Int]] = {

                selectedDates.append(dateSelectedByUser)
            }
            let cellState = cellStateFromIndexPath(indexPath)
            
            delegate.calendar(self, didSelectDate: dateSelectedByUser, cell: selectedCell?.cellView, cellState: cellState)
        }
    }
}
