         if let presentedMonthView = monthViews[presented],
             let previousMonthView = monthViews[previous] ,
             presentedWeekView.monthView == presentedMonthView {
-                for weekView in presentedMonthView.weekViews {
-                    if weekView.index == presentedWeekView.index - 1 {
-                        return weekView
-                    }
-                }
-
-                for weekView in previousMonthView.weekViews {
-                    if weekView.index == previousMonthView.weekViews.count - 1 {
-                        return weekView
-                    }
-                }
+                if presentedWeekView.index - 1 >= 0 {
+                    return presentedMonthView.weekViews[presentedWeekView.index - 1]
+                }
+
+                var expectedWeekIndex = previousMonthView.weekViews.count - 1
+                let weekView = previousMonthView.weekViews[expectedWeekIndex]
+                //Check if the last week has weekdaysOut, otherwise, take next week to avoid showing duplicates
+                if weekView.weekdaysOut != nil {
+                  expectedWeekIndex -= 1
+                  return previousMonthView.weekViews[expectedWeekIndex]
+                }
+                return weekView
         } else if let previousMonthView = monthViews[previous] {
             monthViews[following] = monthViews[presented]
             monthViews[presented] = monthViews[previous]

    }

    public override func performedDayViewSelection(_ dayView: DayView) {
        let calendar = self.calendarView.delegate?.calendar?() ?? Calendar.current
        
        if dayView.isOut && calendarView.shouldScrollOnOutDayViewSelection {
            if dayView.date.day > 20 {
                let presentedDate = dayView.monthView.date
                calendarView.presentedDate = CVDate(date: self.dateBeforeDate(presentedDate!), calendar: calendar)
                presentPreviousView(dayView)
            } else {
                let presentedDate = dayView.monthView.date
                calendarView.presentedDate = CVDate(date: self.dateAfterDate(presentedDate!), calendar: calendar)
                presentNextView(dayView)
            }
        }
    }

    public override func presentPreviousView(_ view: UIView?) {

        if let presentedMonthView = monthViews[presented],
            let followingMonthView = monthViews[following] ,
            presentedWeekView.monthView == presentedMonthView {
                if presentedMonthView.weekViews.count > presentedWeekView.index + 1 {
                    return presentedMonthView.weekViews[presentedWeekView.index + 1]
                }
                var expectedWeekIndex = 0
                let weekView = followingMonthView.weekViews[expectedWeekIndex]
                //Check if the first week has weekdaysOut, otherwise, take next week to avoid showing duplicates
                if weekView.weekdaysOut != nil {
                  expectedWeekIndex += 1
                  return followingMonthView.weekViews[expectedWeekIndex]
                }
                return weekView
        } else if let followingMonthView = monthViews[following] {
            monthViews[previous] = monthViews[presented]
            monthViews[presented] = monthViews[following]
