diff --git a/goocalendar/_calendar.py b/goocalendar/_calendar.py
index 2144adbfa0d30854d1e61d96286ece7ea29fab50_Z29vY2FsZW5kYXIvX2NhbGVuZGFyLnB5..e7126ef8a1bc1d32d2c0b310d0321d429905da68_Z29vY2FsZW5kYXIvX2NhbGVuZGFyLnB5 100644
--- a/goocalendar/_calendar.py
+++ b/goocalendar/_calendar.py
@@ -19,5 +19,6 @@
     AVAILABLE_VIEWS = ["month", "week"]
     MIN_PER_LEVEL = 15  # Number of minutes per graduation for drag and drop
 
-    def __init__(self, event_store=None, view="month", time_format="%H:%M"):
+    def __init__(self, event_store=None, view="month", time_format="%H:%M",
+            firstweekday=calendar.SUNDAY):
         super(Calendar, self).__init__()
@@ -23,5 +24,4 @@
         super(Calendar, self).__init__()
-        self._cal = calendar.Calendar(calendar.SUNDAY)
         self._today = time.localtime(time.time())[:3]
         self._selected_day = None
         self._bg_rect = None
@@ -33,6 +33,7 @@
         self._event_added_sigid = None
         self._events_cleared_sigid = None
         self.event_store = event_store
+        self.firstweekday = firstweekday
         self._drag_start_date = None
         self._drag_date = None
         self._drag_x = None
@@ -81,6 +82,7 @@
             self.days.append(box)
 
     def select_from_tuple(self, new_date):
+        cal = calendar.Calendar(self.firstweekday)
         old_date = self.selected_date
         old_day = self._selected_day
         self.selected_date = new_date[:3]
@@ -88,8 +90,8 @@
         if self.view == "month":
             page_changed = old_date[:2] != new_date[:2]
         elif self.view == "week":
-            old_first_weekday = util.first_day_of_week(self._cal, old_date)
-            new_first_weekday = util.first_day_of_week(self._cal, new_date)
+            old_first_weekday = util.first_day_of_week(cal, old_date)
+            new_first_weekday = util.first_day_of_week(cal, new_date)
             page_changed = old_first_weekday != new_first_weekday
 
         # This is slow: When the month was changed we need to update
@@ -102,7 +104,7 @@
 
         # This is fast: Update only the old and newly selected days.
         # Find the canvas item that corresponds to the new date.
-        weeks = self._cal.monthdayscalendar(*new_date[:2])
+        weeks = cal.monthdayscalendar(*new_date[:2])
         found = -1
         for weekno, week in enumerate(weeks):
             for dayno, day in enumerate(week):
@@ -131,6 +133,7 @@
         self.select_from_tuple(new_time.timetuple())
 
     def previous_page(self):
+        cal = calendar.Calendar(self.firstweekday)
         date = datetime.datetime(*self.selected_date)
         if self.view == "month":
             selected_date = \
@@ -134,5 +137,5 @@
         date = datetime.datetime(*self.selected_date)
         if self.view == "month":
             selected_date = \
-                util.previous_month(self._cal, date).timetuple()[:3]
+                util.previous_month(cal, date).timetuple()[:3]
         elif self.view == "week":
@@ -138,5 +141,5 @@
         elif self.view == "week":
-            selected_date = util.previous_week(self._cal, date).timetuple()[:3]
+            selected_date = util.previous_week(cal, date).timetuple()[:3]
         self.select_from_tuple(selected_date)
 
     def next_page(self):
@@ -140,5 +143,6 @@
         self.select_from_tuple(selected_date)
 
     def next_page(self):
+        cal = calendar.Calendar(self.firstweekday)
         date = datetime.datetime(*self.selected_date)
         if self.view == "month":
@@ -143,4 +147,4 @@
         date = datetime.datetime(*self.selected_date)
         if self.view == "month":
-            date = util.next_month(self._cal, date)
+            date = util.next_month(cal, date)
         elif self.view == "week":
@@ -146,5 +150,5 @@
         elif self.view == "week":
-            date = util.next_week(self._cal, date)
+            date = util.next_week(cal, date)
         self.select(date)
 
     def set_view(self, level):
@@ -236,7 +240,8 @@
             self.set_size_request(new_width, height)  # Minimum widget size
 
         # Redraw all days.
-        weeks = util.my_monthdatescalendar(self._cal, *self.selected_date)
+        cal = calendar.Calendar(self.firstweekday)
+        weeks = util.my_monthdatescalendar(cal, *self.selected_date)
         for weekno, week in enumerate(weeks):
             # Hide all days that are not part of the current week.
             weekdays = [date.timetuple()[:3] for date in week]
@@ -310,7 +315,8 @@
 
         # Draw the grid.
         y_pos = 0
-        weeks = util.my_monthdatescalendar(self._cal, *self.selected_date)
+        cal = calendar.Calendar(self.firstweekday)
+        weeks = util.my_monthdatescalendar(cal, *self.selected_date)
         for weekno, week in enumerate(weeks):
             for dayno, date in enumerate(week):
                 # The color depends on whether each day is part of the
@@ -363,7 +369,8 @@
             self.set_size_request(new_width, new_height)
 
     def _get_day_item(self, find_date):
-        weeks = util.my_monthdatescalendar(self._cal, *find_date.timetuple())
+        cal = calendar.Calendar(self.firstweekday)
+        weeks = util.my_monthdatescalendar(cal, *find_date.timetuple())
         for weekno, week in enumerate(weeks):
             for dayno, date in enumerate(week):
                 if date == find_date:
@@ -377,7 +384,8 @@
         place.
         Days that are currently not in the view are not returned.
         """
-        weeks = util.my_monthdatescalendar(self._cal, *self.selected_date)
+        cal = calendar.Calendar(self.firstweekday)
+        weeks = util.my_monthdatescalendar(cal, *self.selected_date)
         start = event.start.timetuple()[:3]
         end = event.end if event.end else event.start
         end = end.timetuple()[:3]
@@ -422,4 +430,5 @@
         if not self._event_store:
             return
 
+        cal = calendar.Calendar(self.firstweekday)
         if self.view == "month":
@@ -425,6 +434,6 @@
         if self.view == "month":
-            weeks = util.my_monthdatescalendar(self._cal, *self.selected_date)
+            weeks = util.my_monthdatescalendar(cal, *self.selected_date)
             dates = []
             for week in weeks:
                 dates += week
         else:
@@ -427,8 +436,8 @@
             dates = []
             for week in weeks:
                 dates += week
         else:
-            dates = util.my_weekdatescalendar(self._cal, *self.selected_date)
+            dates = util.my_weekdatescalendar(cal, *self.selected_date)
 
         # Retrieve a list of all events in the current time span,
         # and sort them by event length.
@@ -473,7 +482,7 @@
             week_end = 0
             while week_end < len(days):
                 day = days[week_start]
-                weekday = (day.date.weekday() - self._cal.firstweekday) % 7
+                weekday = (day.date.weekday() - self.firstweekday) % 7
                 week_end = week_start + (7 - weekday)
                 week = days[week_start:week_end]
                 weeks.append(week)
@@ -671,7 +680,8 @@
         Return the date of the day_item pointed by two coordinates [x,y]
         """
         # Get current week
-        weeks = util.my_monthdatescalendar(self._cal, *self.selected_date)
+        cal = calendar.Calendar(self.firstweekday)
+        weeks = util.my_monthdatescalendar(cal, *self.selected_date)
         if self.view == 'week':
             cur_week, = (week for week in weeks for date in week
                 if self.selected_date[:3] == date.timetuple()[:3])