diff --git a/CHANGELOG b/CHANGELOG
index e90d732c046d8a12b389af5e069017337883e55b_Q0hBTkdFTE9H..78cbc9fe311c3a272e3e73a0e0aaa4df7290ea0f_Q0hBTkdFTE9H 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,3 +1,4 @@
+* Manage non editable event
 * Add support for Python 3.8
 * Replace font-desc properties by font
 
diff --git a/doc/index.rst b/doc/index.rst
index e90d732c046d8a12b389af5e069017337883e55b_ZG9jL2luZGV4LnJzdA==..78cbc9fe311c3a272e3e73a0e0aaa4df7290ea0f_ZG9jL2luZGV4LnJzdA== 100644
--- a/doc/index.rst
+++ b/doc/index.rst
@@ -377,7 +377,7 @@
 :class:`Calendar <goocalendar.Calendar>`.
 
 .. class:: goocalendar.Event(caption, start[, end[, all_day[, text_color \
-   [, bg_color]]]])
+   [, bg_color[, editable]]]]])
 
    *caption* argument is mandatory and will be the string displayed on the
    event.  *start* argument is mandatory and determines the starting time of
@@ -387,7 +387,8 @@
    All other arguments are optional. *end* argument may be a datetime,
    all_day a boolean value. An event will be considered as all day
    event if no *end* argument is supplied. *text_color* and *bg_color*
-   arguments are supposed to be color strings.
+   arguments are supposed to be color strings. *editable* determines if the
+   event can be modified.
 
 Instance attributes:
 
@@ -421,6 +422,11 @@
 
    String determining background color.
 
+.. attribute:: editable
+
+    Boolean determining if the event can be modified.
+    Default value is `True`.
+
 .. attribute:: multidays
 
    Boolean property determining if the event is longer than one day.
diff --git a/examples/simple.py b/examples/simple.py
index e90d732c046d8a12b389af5e069017337883e55b_ZXhhbXBsZXMvc2ltcGxlLnB5..78cbc9fe311c3a272e3e73a0e0aaa4df7290ea0f_ZXhhbXBsZXMvc2ltcGxlLnB5 100644
--- a/examples/simple.py
+++ b/examples/simple.py
@@ -58,6 +58,13 @@
     bg_color='yellow')
 event_store.add(event)
 
+# A non editable event.
+event = Event("Non editable",
+    datetime.datetime(2007, 10, 9, 10),
+    datetime.datetime(2007, 10, 9, 11),
+    editable=False)
+event_store.add(event)
+
 # A singularity event.
 event = Event('Singularity',
     datetime.datetime(2007, 10, 7, 12),
diff --git a/goocalendar/_calendar.py b/goocalendar/_calendar.py
index e90d732c046d8a12b389af5e069017337883e55b_Z29vY2FsZW5kYXIvX2NhbGVuZGFyLnB5..78cbc9fe311c3a272e3e73a0e0aaa4df7290ea0f_Z29vY2FsZW5kYXIvX2NhbGVuZGFyLnB5 100644
--- a/goocalendar/_calendar.py
+++ b/goocalendar/_calendar.py
@@ -792,13 +792,31 @@
     @util.left_click
     def on_event_item_button_press_event(self, event_item, rect, event):
 
-        # Drag and drop starting coordinates
-        self._drag_x = event.x
-        self._drag_y = event.y
-        self._drag_height = 0
-        self._drag_start_date = self.get_cur_pointed_date(event.x, event.y)
-        self._drag_date = self._drag_start_date
-        self.set_has_tooltip(False)
-        event_item.raise_(None)
-        event_item.transparent = True
+        if event_item.event.editable:
+            # Drag and drop starting coordinates
+            self._drag_x = event.x
+            self._drag_y = event.y
+            self._drag_height = 0
+            self._drag_start_date = self.get_cur_pointed_date(event.x, event.y)
+            self._drag_date = self._drag_start_date
+            self.set_has_tooltip(False)
+            event_item.raise_(None)
+            event_item.transparent = True
+
+            event_item.width = self._day_width - 6  # Biggest event width
+            event_date = event_item.event.start.date()
+            daysdelta = self._drag_start_date - event_date
+            if self.view == 'week':
+                event_item.x = event_item.left_border
+                if ((event_item.event.all_day or event_item.event.multidays)
+                        and self._drag_start_date != event_date):
+                    event_item.x += daysdelta.days * self._day_width
+                    event_item.event.start += daysdelta
+                    if event_item.event.end:
+                        event_item.event.end += daysdelta
+                else:
+                    for item in event_item.event.event_items:
+                        if item != event_item:
+                            item.remove()
+                            self._event_items.remove(item)
 
@@ -804,17 +822,35 @@
 
-        event_item.width = self._day_width - 6  # Biggest event width
-        event_date = event_item.event.start.date()
-        daysdelta = self._drag_start_date - event_date
-        if self.view == 'week':
-            event_item.x = event_item.left_border
-            if ((event_item.event.all_day or event_item.event.multidays)
-                    and self._drag_start_date != event_date):
-                event_item.x += daysdelta.days * self._day_width
-                event_item.event.start += daysdelta
-                if event_item.event.end:
-                    event_item.event.end += daysdelta
-            else:
+                    event_item.height = 2 * self._line_height
+                    day_no = (int((event.x - self._timeline.width)
+                        / self._day_width))
+                    day_off = day_no * self._day_width + 2
+                    event_item.x = self._timeline.width + day_off
+                    if (event_item.no_caption or event.y < event_item.y
+                            or event.y > (event_item.y + event_item.height)):
+                        # click was not performed inside the new day item
+                        level_height = self.minute_height * self.MIN_PER_LEVEL
+                        cur_level = int((event.y - self._timeline.y)
+                            / level_height)
+                        nb_levels_per_hour = 60 / self.MIN_PER_LEVEL
+                        # click is in the middle
+                        cur_level -= nb_levels_per_hour
+                        if cur_level < 0:
+                            cur_level = 0
+                        event_item.y = (
+                            self._timeline.y + cur_level * level_height)
+                        nb_minutes = cur_level * self.MIN_PER_LEVEL
+                        hours, minutes = map(int, divmod(nb_minutes, 60))
+                        old_start = event_item.event.start
+                        new_start = \
+                            datetime.datetime.combine(self._drag_start_date,
+                            datetime.time(hours, minutes))
+                        event_item.event.start = new_start
+                        delta = new_start - old_start
+                        if event_item.event.end:
+                            event_item.event.end += delta
+                    event_item.no_caption = False
+            elif self.view == 'month':
                 for item in event_item.event.event_items:
                     if item != event_item:
                         item.remove()
                         self._event_items.remove(item)
@@ -817,55 +853,25 @@
                 for item in event_item.event.event_items:
                     if item != event_item:
                         item.remove()
                         self._event_items.remove(item)
-
-                event_item.height = 2 * self._line_height
-                day_no = (int((event.x - self._timeline.width)
-                    / self._day_width))
-                day_off = day_no * self._day_width + 2
-                event_item.x = self._timeline.width + day_off
-                if (event_item.no_caption or event.y < event_item.y
-                        or event.y > (event_item.y + event_item.height)):
-                    # click was not performed inside the new day item
-                    level_height = self.minute_height * self.MIN_PER_LEVEL
-                    cur_level = int((event.y - self._timeline.y)
-                        / level_height)
-                    nb_levels_per_hour = 60 / self.MIN_PER_LEVEL
-                    cur_level -= nb_levels_per_hour  # click is in the middle
-                    if cur_level < 0:
-                        cur_level = 0
-                    event_item.y = self._timeline.y + cur_level * level_height
-                    nb_minutes = cur_level * self.MIN_PER_LEVEL
-                    hours, minutes = map(int, divmod(nb_minutes, 60))
-                    old_start = event_item.event.start
-                    new_start = \
-                        datetime.datetime.combine(self._drag_start_date,
-                        datetime.time(hours, minutes))
-                    event_item.event.start = new_start
-                    delta = new_start - old_start
-                    if event_item.event.end:
-                        event_item.event.end += delta
-                event_item.no_caption = False
-        elif self.view == 'month':
-            for item in event_item.event.event_items:
-                if item != event_item:
-                    item.remove()
-                    self._event_items.remove(item)
-                else:
-                    event_item.event.start += daysdelta
-                    if event_item.event.end:
-                        event_item.event.end += daysdelta
-                    weekno = int(event.y / self._day_height)
-                    day_no = int(event.x / self._day_width)
-                    event_item.y = weekno * self._day_height
-                    event_item.y += int(self._line_height) + 1  # padding-top
-                    event_item.x = day_no * self._day_width + 2  # padding-left
-                    item_height = self._line_height + 2  # 2px between items
-                    while event_item.y < event.y:
-                        event_item.y += item_height
-                    event_item.y -= item_height
-                    event_item.no_caption = False
-        event_item.update()
+                    else:
+                        event_item.event.start += daysdelta
+                        if event_item.event.end:
+                            event_item.event.end += daysdelta
+                        weekno = int(event.y / self._day_height)
+                        day_no = int(event.x / self._day_width)
+                        event_item.y = weekno * self._day_height
+                        event_item.y += (
+                            int(self._line_height) + 1)  # padding-top
+                        event_item.x = (
+                            day_no * self._day_width + 2)  # padding-left
+                        item_height = (
+                            self._line_height + 2)  # 2px between items
+                        while event_item.y < event.y:
+                            event_item.y += item_height
+                        event_item.y -= item_height
+                        event_item.no_caption = False
+            event_item.update()
         self.emit('event-pressed', event_item.event)
 
         if self._is_double_click(event):
diff --git a/goocalendar/_event.py b/goocalendar/_event.py
index e90d732c046d8a12b389af5e069017337883e55b_Z29vY2FsZW5kYXIvX2V2ZW50LnB5..78cbc9fe311c3a272e3e73a0e0aaa4df7290ea0f_Z29vY2FsZW5kYXIvX2V2ZW50LnB5 100644
--- a/goocalendar/_event.py
+++ b/goocalendar/_event.py
@@ -20,6 +20,7 @@
         self.caption = caption
         self.start = start
         self.end = end
+        self.editable = kwargs.get('editable', True)
         self.all_day = kwargs.get('all_day', False)
         self.text_color = kwargs.get('text_color', None)
         self.bg_color = kwargs.get('bg_color', 'orangered')