             
             if today.compare(self.viewController.selectedDate) == .OrderedAscending
             {
+                self.showToday(today, animations: self.showPreviousView, monthViewReuse: self.reuseNextMonthView) { finished in
+                 
+                    if finished
+                    {
+                        self.previousMonthViewDidShow(finished)
+                        
+                        let newStartDate = self.nextMonthStartDate(currentMonthStartDate: self.currentMonthView.startDate)
+                        
+                        self.nextMonthView.update(newStartDate: newStartDate)
+                    }
+                }
+            }
+            else if today.compare(self.viewController.selectedDate) == .OrderedDescending
+            {
+                self.showToday(today, animations: self.showNextView, monthViewReuse: self.reusePreviousMonthView) { finished in
+                    
+                    if finished
+                    {
+                        self.nextMonthViewDidShow(finished)
+                        
+                        let newStartDate = self.previousMonthStartDate(currentMonthStartDate: self.currentMonthView.startDate)
+                        
+                        self.previousMonthView.update(newStartDate: newStartDate)
+                    }
+                }
+            }
+        }
+    }
+    
+    private func showToday(today: NSDate, animations: () -> Void, monthViewReuse: ((NSDate) -> Void), completion: ((Bool) -> Void))
+    {
+        UIView.animateWithDuration(0.08, animations: animations) { finished in
+            
+            if finished
+            {
+                let newStartDate = self.currentMonthStartDate(fromDate: today)
                 
+                monthViewReuse(newStartDate)
+
+                self.resetLayout()
+                
+                UIView.animateWithDuration(0.08, animations: animations) { finished in completion(finished) }
+            }
+        }
+    }
+    
+    private func findTodayInWeekViews()
+    {
+        if self.previousWeekView.containsToday
+        {
+            UIView.animateWithDuration(0.15, animations: self.showPreviousView, completion: self.previousWeekViewDidShow)
+        }
+        else if self.currentWeekView.containsToday
+        {
+            let todayComponents = self.viewController.calendar.components([.Weekday, .WeekOfYear], fromDate: NSDate())
+            
+            self.currentWeekView.setSelectedDate(weekday: todayComponents.weekday)
+        }
+        else if self.nextWeekView.containsToday
+        {
+            UIView.animateWithDuration(0.15, animations: self.showNextView, completion: self.nextWeekViewDidShow)
+        }
+        else
+        {
+            let today = NSDate()
+            
+            if today.compare(self.viewController.selectedDate) == .OrderedAscending
+            {
+                self.showToday(today, animations: self.showPreviousView, weekViewReuse: self.reuseNextWeekView) { finished in
+                 
+                    if finished
+                    {
+                        self.previousWeekViewDidShow(finished)
+                        
+                        let newDates = self.nextWeekDates(currentWeekDates: self.currentWeekView.dates)
+                        
+                        self.nextWeekView.update(newDates: newDates)
+                    }
+                }
             }
             else if today.compare(self.viewController.selectedDate) == .OrderedDescending
             {
+                self.showToday(today, animations: self.showNextView, weekViewReuse: self.reusePreviousWeekView) { finished in
+                    
+                    if finished
+                    {
+                        self.nextWeekViewDidShow(finished)
+                        
+                        let newDates = self.previousWeekDates(currentWeekDates: self.currentWeekView.dates)
+                        
+                        self.previousWeekView.update(newDates: newDates)
+                    }
+                }
+            }
+        }
+    }
+    
+    private func showToday(today: NSDate, animations: () -> Void, weekViewReuse: (([NSDate?]) -> Void), completion: ((Bool) -> Void))
+    {
+        UIView.animateWithDuration(0.08, animations: animations) { finished in
+            
+            if finished
+            {
+                let newDates = self.currentWeekDates(fromDate: today)
                 
-            }
-        }
-    }
-    
-    private func findTodayInWeekViews()
-    {
-        if self.previousWeekView.containsToday
-        {
-            UIView.animateWithDuration(0.25, animations: self.showPreviousView, completion: self.previousWeekViewDidShow)
-        }
-        else if self.currentWeekView.containsToday
-        {
-            let todayComponents = self.viewController.calendar.components([.Weekday, .WeekOfYear], fromDate: NSDate())
-            
-            self.currentWeekView.setSelectedDate(weekday: todayComponents.weekday)
-        }
-        else if self.nextWeekView.containsToday
-        {
-            UIView.animateWithDuration(0.25, animations: self.showNextView, completion: self.nextWeekViewDidShow)
-        }
-        else
-        {
-            let today = NSDate()
-            
-            if today.compare(self.viewController.selectedDate) == .OrderedAscending
-            {
+                weekViewReuse(newDates)
                 
-            }
-            else if today.compare(self.viewController.selectedDate) == .OrderedDescending
-            {
+                self.resetLayout()
                 
+                UIView.animateWithDuration(0.08, animations: animations) { finished in completion(finished) }
             }
         }
     }

        }
        else if self.nextMonthView.containsToday
        {
            UIView.animateWithDuration(0.25, animations: self.showNextView, completion: self.nextMonthViewDidShow)
        }
        else
        {

    {
        if self.previousMonthView.containsToday
        {
            UIView.animateWithDuration(0.15, animations: self.showPreviousView, completion: self.previousMonthViewDidShow)
        }
        else if self.currentMonthView.containsToday
        {
