diff --git a/core/src/main/java/hudson/scheduler/CronTab.java b/core/src/main/java/hudson/scheduler/CronTab.java
index 2cd3802..9cbe988 100644
--- a/core/src/main/java/hudson/scheduler/CronTab.java
+++ b/core/src/main/java/hudson/scheduler/CronTab.java
@@ -318,11 +318,20 @@ public final class CronTab {
                     // since higher order field is affected by this, we need to restart from all over
                     continue OUTER;
                 } else {
-                    f.setTo(cal,next);
-                    f.addTo(cal,1);
-                    CalendarField.MINUTE.addTo(cal,-1);
+                    // Calendar is Locale and can cause infinite loops here. HUDSON-8401
+                    if ((f == CalendarField.DAY_OF_WEEK) && (cal.getFirstDayOfWeek() + f.offset > next) && (cal.getFirstDayOfWeek() + f.offset <= cur)){
+                      // wrapping a week down..
+                      f.setTo(cal,next);
+                      CalendarField.MINUTE.addTo(cal,-1);
+                      f.addTo(cal,-6);
+                    }
+                    else {
+                      f.setTo(cal,next);
+                      f.addTo(cal,1);
+                      CalendarField.MINUTE.addTo(cal,-1);
+                    }
                     if (f.redoAdjustmentIfModified)
-                        continue OUTER; // when we modify DAY_OF_MONTH and DAY_OF_WEEK, do it all over from the top
+                      continue OUTER; // when we modify DAY_OF_MONTH and DAY_OF_WEEK, do it all over from the top
                 }
             }
             return cal; // all fields adjusted