diff --git a/gtk/gtkcalendar.c b/gtk/gtkcalendar.c
index 404dfe9..5ce46b8 100644
--- a/gtk/gtkcalendar.c
+++ b/gtk/gtkcalendar.c
@@ -942,7 +942,7 @@ calendar_queue_refresh (GtkCalendar *calendar)
 }
 
 static void
-calendar_set_month_next (GtkCalendar *calendar)
+real_calendar_set_month_next (GtkCalendar *calendar,gboolean block_day_signal)
 {
   gint month_len;
   GtkCalendarPrivate *priv = calendar->priv;
@@ -971,14 +971,18 @@ calendar_set_month_next (GtkCalendar *calendar)
   if (month_len < priv->selected_day)
     {
       priv->selected_day = 0;
-      gtk_calendar_select_day (calendar, month_len);
+      if (!block_day_signal)
+    	  gtk_calendar_select_day (calendar, month_len);
     }
   else
-    gtk_calendar_select_day (calendar, priv->selected_day);
+    if (!block_day_signal)
+    	gtk_calendar_select_day (calendar, priv->selected_day);
 
   calendar_queue_refresh (calendar);
 }
 
+#define calendar_set_month_next(A) real_calendar_set_month_next(A,FALSE)
+
 static void
 calendar_set_year_prev (GtkCalendar *calendar)
 {
@@ -1339,8 +1343,9 @@ calendar_day_rectangle (GtkCalendar  *calendar,
   rect->width = priv->day_width;
 }
 
+
 static void
-calendar_set_month_prev (GtkCalendar *calendar)
+real_calendar_set_month_prev (GtkCalendar *calendar,gboolean block_day_signal)
 {
   GtkCalendarPrivate *priv = calendar->priv;
   gint month_len;
@@ -1370,18 +1375,22 @@ calendar_set_month_prev (GtkCalendar *calendar)
   if (month_len < priv->selected_day)
     {
       priv->selected_day = 0;
-      gtk_calendar_select_day (calendar, month_len);
+      if (!block_day_signal)
+        gtk_calendar_select_day (calendar, month_len);
     }
   else
     {
       if (priv->selected_day < 0)
         priv->selected_day = priv->selected_day + 1 + month_length[leap (priv->year)][priv->month + 1];
-      gtk_calendar_select_day (calendar, priv->selected_day);
+      if (!block_day_signal)
+        gtk_calendar_select_day (calendar, priv->selected_day);
     }
 
   calendar_queue_refresh (calendar);
 }
 
+#define calendar_set_month_prev(A) real_calendar_set_month_prev(A,FALSE)
+
 
 /****************************************
  *           Basic object methods       *
@@ -2978,9 +2987,9 @@ calendar_main_button_press (GtkCalendar    *calendar,
       day = priv->day[row][col];
 
       if (day_month == MONTH_PREV)
-        calendar_set_month_prev (calendar);
+        real_calendar_set_month_prev (calendar,TRUE);
       else if (day_month == MONTH_NEXT)
-        calendar_set_month_next (calendar);
+        real_calendar_set_month_next (calendar,TRUE);
 
       if (!gtk_widget_has_focus (widget))
         gtk_widget_grab_focus (widget);
@@ -3310,9 +3319,9 @@ gtk_calendar_key_press (GtkWidget   *widget,
 
           day = priv->day[row][col];
           if (priv->day_month[row][col] == MONTH_PREV)
-            calendar_set_month_prev (calendar);
+            real_calendar_set_month_prev (calendar,TRUE);
           else if (priv->day_month[row][col] == MONTH_NEXT)
-            calendar_set_month_next (calendar);
+            real_calendar_set_month_next (calendar,TRUE);
 
           calendar_select_and_focus_day (calendar, day);
         }
