[tryton-debian-vcs] tryton-modules-calendar branch upstream created. 3d467a3a67c92225487ede5b0f3770a00732477e

Mathias Behrle tryton-debian-vcs at alioth.debian.org
Wed Nov 27 16:59:30 UTC 2013


The following commit has been merged in the upstream branch:
https://alioth.debian.org/plugins/scmgit/cgi-bin/gitweb.cgi/?p=tryton/tryton-modules-calendar.git;a=commitdiff;h=3d467a3a67c92225487ede5b0f3770a00732477e
commit 3d467a3a67c92225487ede5b0f3770a00732477e
Author: Mathias Behrle <mathiasb at m9s.biz>
Date:   Sun Nov 24 17:26:33 2013 +0100

    Adding upstream version 3.0.0.

diff --git a/CHANGELOG b/CHANGELOG
index 434be38..32778ca 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,3 +1,6 @@
+Version 3.0.0 - 2013-10-21
+* Bug fixes (see mercurial logs for details)
+
 Version 2.8.0 - 2013-04-22
 * Bug fixes (see mercurial logs for details)
 
diff --git a/INSTALL b/INSTALL
index 81c19d7..6ed7bd6 100644
--- a/INSTALL
+++ b/INSTALL
@@ -10,6 +10,7 @@ Prerequisites
  * pywebdav >= 0.9.8 (http://sourceforge.net/projects/pywebdav/)
  * python-dateutil (http://labix.org/python-dateutil)
  * pytz (http://pytz.sourceforge.net/)
+ * python-sql (http://code.google.com/p/python-sql/)
 
 Installation
 ------------
diff --git a/PKG-INFO b/PKG-INFO
index d0ce93a..2845884 100644
--- a/PKG-INFO
+++ b/PKG-INFO
@@ -1,12 +1,12 @@
 Metadata-Version: 1.1
 Name: trytond_calendar
-Version: 2.8.0
+Version: 3.0.0
 Summary: Tryton module for CalDAV
 Home-page: http://www.tryton.org/
 Author: Tryton
 Author-email: UNKNOWN
 License: GPL-3
-Download-URL: http://downloads.tryton.org/2.8/
+Download-URL: http://downloads.tryton.org/3.0/
 Description: trytond_calendar
         ================
         
@@ -61,6 +61,7 @@ Classifier: Natural Language :: English
 Classifier: Natural Language :: French
 Classifier: Natural Language :: German
 Classifier: Natural Language :: Russian
+Classifier: Natural Language :: Slovenian
 Classifier: Natural Language :: Spanish
 Classifier: Operating System :: OS Independent
 Classifier: Programming Language :: Python :: 2.6
diff --git a/calendar.xml b/calendar.xml
index 535bd17..dbf7e8c 100644
--- a/calendar.xml
+++ b/calendar.xml
@@ -130,7 +130,7 @@ this repository contains the full copyright notices and license terms. -->
         <record model="ir.action.act_window" id="act_event_form">
             <field name="name">Events</field>
             <field name="res_model">calendar.event</field>
-            <field name="domain">[('parent', '=', False)]</field>
+            <field name="domain">[('parent', '=', None)]</field>
         </record>
         <record model="ir.action.act_window.view" id="act_event_form_view1">
             <field name="sequence" eval="10"/>
@@ -148,7 +148,7 @@ this repository contains the full copyright notices and license terms. -->
         <record model="ir.action.act_window" id="act_event_form3">
             <field name="name">Events</field>
             <field name="res_model">calendar.event</field>
-            <field name="domain">[('parent', '=', False), ('calendar', '=', Eval('active_id'))]</field>
+            <field name="domain">[('parent', '=', None), ('calendar', '=', Eval('active_id'))]</field>
         </record>
         <record model="ir.action.act_window.view" id="act_event_form3_view1">
             <field name="sequence" eval="10"/>
diff --git a/calendar_.py b/calendar_.py
index 4a9c2d3..83fed4f 100644
--- a/calendar_.py
+++ b/calendar_.py
@@ -6,9 +6,11 @@ import dateutil.tz
 import pytz
 import datetime
 import xml.dom.minidom
+from sql import Table, Column
+
 from trytond.model import Model, ModelSQL, ModelView, fields
 from trytond.tools import reduce_ids
-from trytond.backend import TableHandler
+from trytond import backend
 from trytond.pyson import If, Bool, Eval
 from trytond.transaction import Transaction
 from trytond.cache import Cache
@@ -652,12 +654,14 @@ class Event(ModelSQL, ModelView):
 
         super(Event, cls).write(events, values)
 
+        table = cls.__table__()
         for i in range(0, len(events), cursor.IN_MAX):
             sub_ids = map(int, events[i:i + cursor.IN_MAX])
-            red_sql, red_ids = reduce_ids('id', sub_ids)
-            cursor.execute('UPDATE "' + cls._table + '" '
-                'SET sequence = sequence + 1 '
-                'WHERE ' + red_sql, red_ids)
+            red_sql = reduce_ids(table.id, sub_ids)
+            cursor.execute(*table.update(
+                    columns=[table.sequence],
+                    values=[table.sequence + 1],
+                    where=red_sql))
 
         if not values:
             return
@@ -1230,7 +1234,9 @@ class EventAlarm(AlarmMixin, ModelSQL, ModelView):
 
     @classmethod
     def __register__(cls, module_name):
+        TableHandler = backend.get('TableHandler')
         cursor = Transaction().cursor
+        sql_table = cls.__table__()
 
         super(EventAlarm, cls).__register__(module_name)
 
@@ -1238,10 +1244,11 @@ class EventAlarm(AlarmMixin, ModelSQL, ModelView):
 
         # Migration from 2.6: Remove inherits calendar.alarm
         if table.column_exist('calendar_alarm'):
-            cursor.execute('UPDATE "' + cls._table + '" AS e '
-                'SET valarm = (SELECT a.valarm '
-                    'FROM calendar_alarm AS a '
-                    'WHERE a.id = e.calendar_alarm)')
+            alarm = Table('calendar_alarm')
+            cursor.execute(*sql_table.update(
+                    columns=[sql_table.valarm],
+                    values=[alarm.select(alarm.valarm,
+                            where=alarm.id == sql_table.calendar_alarm)]))
             table.drop_column('calendar_alarm', True)
 
     @classmethod
@@ -1352,7 +1359,9 @@ class EventAttendee(AttendeeMixin, ModelSQL, ModelView):
 
     @classmethod
     def __register__(cls, module_name):
+        TableHandler = backend.get('TableHandler')
         cursor = Transaction().cursor
+        sql_table = cls.__table__()
 
         super(EventAttendee, cls).__register__(module_name)
 
@@ -1360,13 +1369,14 @@ class EventAttendee(AttendeeMixin, ModelSQL, ModelView):
 
         # Migration from 2.6: Remove inherits calendar.attendee
         if table.column_exist('calendar_attendee'):
-            cursor.execute('UPDATE "' + cls._table + '" AS e '
-                'SET email = (SELECT a.email '
-                    'FROM calendar_attendee AS a '
-                    'WHERE a.id = e.calendar_attendee), '
-                'status = (SELECT a.status '
-                    'FROM calendar_attendee AS a '
-                    'WHERE a.id = e.calendar_attendee)')
+            attendee = Table('calendar_attendee')
+            cursor.execute(*sql_table.update(
+                    columns=[sql_table.email, sql_table.status],
+                    values=[attendee.select(attendee.email,
+                            where=attendee.id == sql_table.calendar_attendee),
+                        attendee.select(attendee.status,
+                            where=attendee.id == sql_table.calendar_attendee),
+                        ]))
             table.drop_column('calendar_attendee', True)
 
     @classmethod
@@ -1379,7 +1389,7 @@ class EventAttendee(AttendeeMixin, ModelSQL, ModelView):
                 to_write.append(values['event'])
 
         if to_write:
-            Event.write([Event.browse(to_write)], {})
+            Event.write(Event.browse(to_write), {})
         event_attendees = super(EventAttendee, cls).create(vlist)
         for event_attendee in event_attendees:
             event = event_attendee.event
@@ -1559,7 +1569,9 @@ class EventRDate(DateMixin, ModelSQL, ModelView):
 
     @classmethod
     def __register__(cls, module_name):
+        TableHandler = backend.get('TableHandler')
         cursor = Transaction().cursor
+        sql_table = cls.__table__()
         # Migration from 1.4: calendar_rdate renamed to calendar_date
         table = TableHandler(cursor, cls, module_name)
         old_column = 'calendar_rdate'
@@ -1572,13 +1584,13 @@ class EventRDate(DateMixin, ModelSQL, ModelView):
 
         # Migration from 2.6: Remove inherits calendar.date
         if table.column_exist('calendar_date'):
-            cursor.execute('UPDATE "' + cls._table + '" AS e '
-                'SET date = (SELECT a.date '
-                    'FROM calendar_date AS a '
-                    'WHERE a.id = e.calendar_date), '
-                'datetime = (SELECT a.datetime '
-                    'FROM calendar_date AS a '
-                    'WHERE a.id = e.calendar_date)')
+            date = Table('calendar_date')
+            cursor.execute(*sql_table.update(
+                    columns=[sql_table.date, sql_table.datetime],
+                    values=[date.select(date.date,
+                            where=date.id == sql_table.calendar_date),
+                        date.select(date.datetime,
+                            where=date.id == sql_table.calendar_date)]))
             table.drop_column('calendar_date', True)
 
     @classmethod
@@ -1677,9 +1689,10 @@ class RRuleMixin(Model):
                     'rule "%s"'),
                 'invalid_byweekno': ('Invalid "By Week Number" in recurrence '
                     'rule "%s"'),
-                'invalid_bymonth': 'Invalid "By Month" in recurrence rule "%s"',
-                'invalid_bysetpos': ('Invalid "By Position" in recurrence rule '
-                    '"%s"'),
+                'invalid_bymonth': (
+                    'Invalid "By Month" in recurrence rule "%s"'),
+                'invalid_bysetpos': (
+                    'Invalid "By Position" in recurrence rule "%s"'),
                 })
 
     @classmethod
@@ -1761,7 +1774,8 @@ class RRuleMixin(Model):
                 except Exception:
                     yeardaynum = -1000
                 if not (abs(yeardaynum) >= 1 and abs(yeardaynum) <= 366):
-                    self.raise_user_error('invalid_byyearday', (self.rec_name,))
+                    self.raise_user_error('invalid_byyearday',
+                        (self.rec_name,))
 
     def check_byweekno(self):
         if self.byweekno:
@@ -1865,7 +1879,9 @@ class EventRRule(RRuleMixin, ModelSQL, ModelView):
 
     @classmethod
     def __register__(cls, module_name):
+        TableHandler = backend.get('TableHandler')
         cursor = Transaction().cursor
+        sql_table = cls.__table__()
 
         super(EventRRule, cls).__register__(module_name)
 
@@ -1873,13 +1889,13 @@ class EventRRule(RRuleMixin, ModelSQL, ModelView):
 
         # Migration from 2.6: Remove inherits calendar.rrule
         if table.column_exist('calendar_rrule'):
+            rrule = Table('calendar_rrule')
             for field in (f for f in dir(RRuleMixin)
                     if isinstance(f, fields.Field)):
-                cursor.execute(('UPDATE "' + cls._table + '" AS e '
-                        'SET "%(field)s" = (SELECT a."%(field)s" '
-                            'FROM calendar_rrule AS r '
-                            'WHERE r.id = e.calendar_rrule)')
-                    % {'field': field})
+                cursor.execute(*sql_table.update(
+                        columns=[Column(sql_table, field)],
+                        values=[rrule.select(Column(rrule, field),
+                                where=rrule.id == sql_table.calendar_rrule)]))
             table.drop_column('calendar_rrule', True)
 
     @classmethod
diff --git a/locale/ca_ES.po b/locale/ca_ES.po
index 07679c6..30c7902 100644
--- a/locale/ca_ES.po
+++ b/locale/ca_ES.po
@@ -866,7 +866,7 @@ msgstr "Esdeveniments"
 
 msgctxt "model:ir.ui.menu,name:menu_calendar"
 msgid "Calendar"
-msgstr "Calendaris"
+msgstr "Calendari"
 
 msgctxt "model:ir.ui.menu,name:menu_calendar_form"
 msgid "Calendars"
@@ -894,7 +894,7 @@ msgstr "Públic"
 
 msgctxt "selection:calendar.event,status:"
 msgid ""
-msgstr " "
+msgstr ""
 
 msgctxt "selection:calendar.event,status:"
 msgid "Cancelled"
@@ -918,7 +918,7 @@ msgstr "Transparent"
 
 msgctxt "selection:calendar.event.attendee,status:"
 msgid ""
-msgstr " "
+msgstr ""
 
 msgctxt "selection:calendar.event.attendee,status:"
 msgid "Accepted"
diff --git a/locale/es_CO.po b/locale/es_CO.po
index 571f7af..867a4bb 100644
--- a/locale/es_CO.po
+++ b/locale/es_CO.po
@@ -886,10 +886,9 @@ msgctxt "selection:calendar.event,classification:"
 msgid "Public"
 msgstr "Público"
 
-#, fuzzy
 msgctxt "selection:calendar.event,status:"
 msgid ""
-msgstr "Punto de Orden"
+msgstr ""
 
 msgctxt "selection:calendar.event,status:"
 msgid "Cancelled"
@@ -911,10 +910,9 @@ msgctxt "selection:calendar.event,transp:"
 msgid "Transparent"
 msgstr "Transparente"
 
-#, fuzzy
 msgctxt "selection:calendar.event.attendee,status:"
 msgid ""
-msgstr "Punto de Orden"
+msgstr ""
 
 msgctxt "selection:calendar.event.attendee,status:"
 msgid "Accepted"
@@ -1048,7 +1046,6 @@ msgctxt "selection:calendar.event.rrule,wkst:"
 msgid "Wednesday"
 msgstr "Miércoles"
 
-#, fuzzy
 msgctxt "view:calendar.calendar:"
 msgid "Access Permissions"
 msgstr "Permisos de Acceso"
diff --git a/locale/es_ES.po b/locale/es_ES.po
index bc47ca4..eb130f3 100644
--- a/locale/es_ES.po
+++ b/locale/es_ES.po
@@ -928,15 +928,15 @@ msgstr "Acceptado"
 
 msgctxt "selection:calendar.event.attendee,status:"
 msgid "Declined"
-msgstr "Rechazar"
+msgstr "Rechazado"
 
 msgctxt "selection:calendar.event.attendee,status:"
 msgid "Delegated"
-msgstr "Delegar"
+msgstr "Delegado"
 
 msgctxt "selection:calendar.event.attendee,status:"
 msgid "Needs Action"
-msgstr "Necesidad  Acción"
+msgstr "Requiere acción"
 
 msgctxt "selection:calendar.event.attendee,status:"
 msgid "Tentative"
@@ -1080,7 +1080,7 @@ msgstr "Categoría"
 
 msgctxt "view:calendar.event.attendee:"
 msgid "Attendee"
-msgstr "Asistentes"
+msgstr "Asistente"
 
 msgctxt "view:calendar.event.attendee:"
 msgid "Attendees"
@@ -1100,7 +1100,7 @@ msgstr "Regla de excepción"
 
 msgctxt "view:calendar.event.exrule:"
 msgid "Exception Rules"
-msgstr "Reglas de excepciones"
+msgstr "Reglas de excepción"
 
 msgctxt "view:calendar.event.rdate:"
 msgid "Recurrence Date"
diff --git a/locale/fr_FR.po b/locale/fr_FR.po
index 7ac841e..3bdb16c 100644
--- a/locale/fr_FR.po
+++ b/locale/fr_FR.po
@@ -875,14 +875,6 @@ msgid "Confidential"
 msgstr "Confidentiel"
 
 msgctxt "selection:calendar.event,classification:"
-msgid "Confidential"
-msgstr "Confidentiel"
-
-msgctxt "selection:calendar.event,classification:"
-msgid "Private"
-msgstr "Privé"
-
-msgctxt "selection:calendar.event,classification:"
 msgid "Private"
 msgstr "Privé"
 
@@ -890,14 +882,6 @@ msgctxt "selection:calendar.event,classification:"
 msgid "Public"
 msgstr "Publique"
 
-msgctxt "selection:calendar.event,classification:"
-msgid "Public"
-msgstr "Publique"
-
-msgctxt "selection:calendar.event,status:"
-msgid ""
-msgstr ""
-
 msgctxt "selection:calendar.event,status:"
 msgid ""
 msgstr ""
@@ -907,14 +891,6 @@ msgid "Cancelled"
 msgstr "Annulé"
 
 msgctxt "selection:calendar.event,status:"
-msgid "Cancelled"
-msgstr "Annulé"
-
-msgctxt "selection:calendar.event,status:"
-msgid "Confirmed"
-msgstr "Confirmé"
-
-msgctxt "selection:calendar.event,status:"
 msgid "Confirmed"
 msgstr "Confirmé"
 
@@ -922,14 +898,6 @@ msgctxt "selection:calendar.event,status:"
 msgid "Tentative"
 msgstr "Tentative"
 
-msgctxt "selection:calendar.event,status:"
-msgid "Tentative"
-msgstr "Tentative"
-
-msgctxt "selection:calendar.event,transp:"
-msgid "Opaque"
-msgstr "Opaque"
-
 msgctxt "selection:calendar.event,transp:"
 msgid "Opaque"
 msgstr "Opaque"
@@ -938,10 +906,6 @@ msgctxt "selection:calendar.event,transp:"
 msgid "Transparent"
 msgstr "transparent"
 
-msgctxt "selection:calendar.event,transp:"
-msgid "Transparent"
-msgstr "transparent"
-
 msgctxt "selection:calendar.event.attendee,status:"
 msgid ""
 msgstr ""
@@ -1087,22 +1051,10 @@ msgid "Calendar"
 msgstr "Calendrier"
 
 msgctxt "view:calendar.calendar:"
-msgid "Calendar"
-msgstr "Calendrier"
-
-msgctxt "view:calendar.calendar:"
 msgid "Calendars"
 msgstr "Calendriers"
 
 msgctxt "view:calendar.calendar:"
-msgid "Calendars"
-msgstr "Calendriers"
-
-msgctxt "view:calendar.calendar:"
-msgid "General"
-msgstr "Général"
-
-msgctxt "view:calendar.calendar:"
 msgid "General"
 msgstr "Général"
 
@@ -1111,14 +1063,6 @@ msgid "Categories"
 msgstr "Catégories"
 
 msgctxt "view:calendar.category:"
-msgid "Categories"
-msgstr "Catégories"
-
-msgctxt "view:calendar.category:"
-msgid "Category"
-msgstr "Catégorie"
-
-msgctxt "view:calendar.category:"
 msgid "Category"
 msgstr "Catégorie"
 
@@ -1127,14 +1071,6 @@ msgid "Attendee"
 msgstr "Participant"
 
 msgctxt "view:calendar.event.attendee:"
-msgid "Attendee"
-msgstr "Participant"
-
-msgctxt "view:calendar.event.attendee:"
-msgid "Attendees"
-msgstr "Participants"
-
-msgctxt "view:calendar.event.attendee:"
 msgid "Attendees"
 msgstr "Participants"
 
@@ -1143,14 +1079,6 @@ msgid "Exception Date"
 msgstr "Date d'exception"
 
 msgctxt "view:calendar.event.exdate:"
-msgid "Exception Date"
-msgstr "Date d'exception"
-
-msgctxt "view:calendar.event.exdate:"
-msgid "Exception Dates"
-msgstr "Dates d'exception"
-
-msgctxt "view:calendar.event.exdate:"
 msgid "Exception Dates"
 msgstr "Dates d'exception"
 
@@ -1159,14 +1087,6 @@ msgid "Exception Rule"
 msgstr "Règle d'exception"
 
 msgctxt "view:calendar.event.exrule:"
-msgid "Exception Rule"
-msgstr "Règle d'exception"
-
-msgctxt "view:calendar.event.exrule:"
-msgid "Exception Rules"
-msgstr "Règles d'exception"
-
-msgctxt "view:calendar.event.exrule:"
 msgid "Exception Rules"
 msgstr "Règles d'exception"
 
@@ -1175,14 +1095,6 @@ msgid "Recurrence Date"
 msgstr "Date de récurrence"
 
 msgctxt "view:calendar.event.rdate:"
-msgid "Recurrence Date"
-msgstr "Date de récurrence"
-
-msgctxt "view:calendar.event.rdate:"
-msgid "Recurrence Dates"
-msgstr "Dates de récurrence"
-
-msgctxt "view:calendar.event.rdate:"
 msgid "Recurrence Dates"
 msgstr "Dates de récurrence"
 
@@ -1191,14 +1103,6 @@ msgid "Recurrence Rule"
 msgstr "Règle de récurrence"
 
 msgctxt "view:calendar.event.rrule:"
-msgid "Recurrence Rule"
-msgstr "Règle de récurrence"
-
-msgctxt "view:calendar.event.rrule:"
-msgid "Recurrence Rules"
-msgstr "Règles de récurrence"
-
-msgctxt "view:calendar.event.rrule:"
 msgid "Recurrence Rules"
 msgstr "Règles de récurrence"
 
@@ -1207,14 +1111,6 @@ msgid "Attendees"
 msgstr "Participants"
 
 msgctxt "view:calendar.event:"
-msgid "Attendees"
-msgstr "Participants"
-
-msgctxt "view:calendar.event:"
-msgid "Categories"
-msgstr "Catégories"
-
-msgctxt "view:calendar.event:"
 msgid "Categories"
 msgstr "Catégories"
 
@@ -1223,14 +1119,6 @@ msgid "Event"
 msgstr "Événement"
 
 msgctxt "view:calendar.event:"
-msgid "Event"
-msgstr "Événement"
-
-msgctxt "view:calendar.event:"
-msgid "Events"
-msgstr "Événements"
-
-msgctxt "view:calendar.event:"
 msgid "Events"
 msgstr "Événements"
 
@@ -1239,14 +1127,6 @@ msgid "General"
 msgstr "Général"
 
 msgctxt "view:calendar.event:"
-msgid "General"
-msgstr "Général"
-
-msgctxt "view:calendar.event:"
-msgid "Occurences"
-msgstr "Occurrences"
-
-msgctxt "view:calendar.event:"
 msgid "Occurences"
 msgstr "Occurrences"
 
@@ -1255,13 +1135,5 @@ msgid "Location"
 msgstr "Emplacement"
 
 msgctxt "view:calendar.location:"
-msgid "Location"
-msgstr "Emplacement"
-
-msgctxt "view:calendar.location:"
-msgid "Locations"
-msgstr "Emplacements"
-
-msgctxt "view:calendar.location:"
 msgid "Locations"
 msgstr "Emplacements"
diff --git a/locale/es_CO.po b/locale/sl_SI.po
similarity index 72%
copy from locale/es_CO.po
copy to locale/sl_SI.po
index 571f7af..4d76c5b 100644
--- a/locale/es_CO.po
+++ b/locale/sl_SI.po
@@ -4,123 +4,123 @@ msgstr "Content-Type: text/plain; charset=utf-8\n"
 
 msgctxt "error:calendar.calendar:"
 msgid "A user can have only one calendar."
-msgstr "Un usuario solo puede tener un calendario."
+msgstr "Uporabnik ima lahko samo en koledar."
 
 msgctxt "error:calendar.calendar:"
 msgid "Calendar name \"%s\" can not end with .ics"
-msgstr "El nombre del calendario \"%s\" no puede terminar con .ics"
+msgstr "Ime koledarja \"%s\" se ne sme končati z .ics"
 
 msgctxt "error:calendar.calendar:"
 msgid "The name of calendar must be unique."
-msgstr "El nombre de calendario debe ser único."
+msgstr "Ime koledarja mora biti edinstveno."
 
 msgctxt "error:calendar.category:"
 msgid "The name of calendar category must be unique."
-msgstr "¡El nombre de la categoría de calendario debe ser único!"
+msgstr "Ime kategorije koledarja mora biti edinstveno."
 
 msgctxt "error:calendar.event.exrule:"
 msgid "Invalid \"By Day\" in recurrence rule \"%s\""
-msgstr "Inválido \"Por Día\" en regla recurrente \"%s\""
+msgstr "Neveljavna izbira \"Na dan\" v ponovitvenem pravilu \"%s\""
 
 msgctxt "error:calendar.event.exrule:"
 msgid "Invalid \"By Hour\" in recurrence rule \"%s\""
-msgstr "Inválido \"Por Hora\" en regla recurrente \"%s\""
+msgstr "Neveljavna izbira \"Na uro\" v ponovitvenem pravilu \"%s\""
 
 msgctxt "error:calendar.event.exrule:"
 msgid "Invalid \"By Minute\" in recurrence rule \"%s\""
-msgstr "Inválido \"Por Minuto\" en regla recurrente \"%s\""
+msgstr "Neveljavna izbira \"Na minuto\" v ponovitvenem pravilu \"%s\""
 
 msgctxt "error:calendar.event.exrule:"
 msgid "Invalid \"By Month Day\" in recurrence rule \"%s\""
-msgstr "Inválido \"Por Día del Mes\" en regla recurrente \"%s\""
+msgstr "Neveljavna izbira \"Na dan v mesecu\" v ponovitvenem pravilu \"%s\""
 
 msgctxt "error:calendar.event.exrule:"
 msgid "Invalid \"By Month\" in recurrence rule \"%s\""
-msgstr "Inválido \"Por Mes\" en regla recurrente \"%s\""
+msgstr "Neveljavna izbira \"Na mesec\" v ponovitvenem pravilu \"%s\""
 
 msgctxt "error:calendar.event.exrule:"
 msgid "Invalid \"By Position\" in recurrence rule \"%s\""
-msgstr "Inválido \"Por Position\" en regla recurrente \"%s\""
+msgstr "Neveljavna izbira \"Na pozicijo\" v ponovitvenem pravilu \"%s\""
 
 msgctxt "error:calendar.event.exrule:"
 msgid "Invalid \"By Second\" in recurrence rule \"%s\""
-msgstr "Inválido \"Por Segundo\" en regla recurrente \"%s\""
+msgstr "Neveljavna izbira \"Na sekundo\" v ponovitvenem pravilu \"%s\""
 
 msgctxt "error:calendar.event.exrule:"
 msgid "Invalid \"By Week Number\" in recurrence rule \"%s\""
-msgstr "Inválido \"Por Número de la Semana\" en regla recurrente \"%s\""
+msgstr "Neveljavna izbira \"Na teden v letu\" v ponovitvenem pravilu \"%s\""
 
 msgctxt "error:calendar.event.exrule:"
 msgid "Invalid \"By Year Day\" in recurrence rule \"%s\""
-msgstr "Inválido \"Por Día del Año\" en regla recurrente \"%s\""
+msgstr "Neveljavna izbira \"Na dan v letu\" v ponovitvenem pravilu \"%s\""
 
 msgctxt "error:calendar.event.exrule:"
 msgid "Only one of \"until\" and \"count\" can be set."
-msgstr "Solo un \"hasta\" y \"contar\" pude ser establecido!"
+msgstr "Nastavi se lahko samo \"do\" ali \"število\"."
 
 msgctxt "error:calendar.event.rrule:"
 msgid "Invalid \"By Day\" in recurrence rule \"%s\""
-msgstr "Inválido \"Por Día\" en regla recurrente \"%s\""
+msgstr "Neveljavna izbira \"Na dan\" v ponovitvenem pravilu \"%s\""
 
 msgctxt "error:calendar.event.rrule:"
 msgid "Invalid \"By Hour\" in recurrence rule \"%s\""
-msgstr "Inválido \"Por Hora\" en regla recurrente \"%s\""
+msgstr "Neveljavna izbira \"Na uro\" v ponovitvenem pravilu \"%s\""
 
 msgctxt "error:calendar.event.rrule:"
 msgid "Invalid \"By Minute\" in recurrence rule \"%s\""
-msgstr "Inválido \"Por Minuto\" en regla recurrente \"%s\""
+msgstr "Neveljavna izbira \"Na minuto\" v ponovitvenem pravilu \"%s\""
 
 msgctxt "error:calendar.event.rrule:"
 msgid "Invalid \"By Month Day\" in recurrence rule \"%s\""
-msgstr "Inválido \"Por Día del Mes\" en regla recurrente \"%s\""
+msgstr "Neveljavna izbira \"Na dan v mesecu\" v ponovitvenem pravilu \"%s\""
 
 msgctxt "error:calendar.event.rrule:"
 msgid "Invalid \"By Month\" in recurrence rule \"%s\""
-msgstr "Inválido \"Por Mes\" en regla recurrente \"%s\""
+msgstr "Neveljavna izbira \"Na mesec\" v ponovitvenem pravilu \"%s\""
 
 msgctxt "error:calendar.event.rrule:"
 msgid "Invalid \"By Position\" in recurrence rule \"%s\""
-msgstr "Inválido \"Por Posición\" en regla recurrente \"%s\""
+msgstr "Neveljavna izbira \"Na pozicijo\" v ponovitvenem pravilu \"%s\""
 
 msgctxt "error:calendar.event.rrule:"
 msgid "Invalid \"By Second\" in recurrence rule \"%s\""
-msgstr "Inválido \"Por Segundo\" en regla recurrente \"%s\""
+msgstr "Neveljavna izbira \"Na sekundo\" v ponovitvenem pravilu \"%s\""
 
 msgctxt "error:calendar.event.rrule:"
 msgid "Invalid \"By Week Number\" in recurrence rule \"%s\""
-msgstr "Inválido \"Por Número de Semana\" en regla recurrente \"%s\""
+msgstr "Neveljavna izbira \"Na teden v letu\" v ponovitvenem pravilu \"%s\""
 
 msgctxt "error:calendar.event.rrule:"
 msgid "Invalid \"By Year Day\" in recurrence rule \"%s\""
-msgstr "Inválido \"Por Día del Año\" en regla recurrente \"%s\""
+msgstr "Neveljavna izbira \"Na dan v letu\" v ponovitvenem pravilu \"%s\""
 
 msgctxt "error:calendar.event.rrule:"
 msgid "Only one of \"until\" and \"count\" can be set."
-msgstr "Solo un \"hasta\" y \"contar\" pude ser establecido!"
+msgstr "Nastavi se lahko samo \"do\" ali \"število\"."
 
 msgctxt "error:calendar.event:"
 msgid "Recurrence \"%s\" can not be recurrent."
-msgstr "Recurrencia \"%s\" no puede ser recurrente."
+msgstr "Ponovitev \"%s\" se ne more ponavljati."
 
 msgctxt "error:calendar.event:"
 msgid "UUID and recurrence must be unique in a calendar."
-msgstr "UUID y recurrencia debe ser única en un calendario."
+msgstr "UUID in ponovitev morata biti v koledarju edinstvena."
 
 msgctxt "error:calendar.location:"
 msgid "The name of calendar location must be unique."
-msgstr "El nombre de la ubicación del calendario bede ser único."
+msgstr "Ime lokacije koledarja mora biti edinstveno."
 
 msgctxt "field:calendar.calendar,create_date:"
 msgid "Create Date"
-msgstr "Fecha de Creación"
+msgstr "Ustvarjeno"
 
 msgctxt "field:calendar.calendar,create_uid:"
 msgid "Create User"
-msgstr "Creado por Usuario"
+msgstr "Ustvaril"
 
 msgctxt "field:calendar.calendar,description:"
 msgid "Description"
-msgstr "Descripción"
+msgstr "Opis"
 
 msgctxt "field:calendar.calendar,id:"
 msgid "ID"
@@ -128,43 +128,43 @@ msgstr "ID"
 
 msgctxt "field:calendar.calendar,name:"
 msgid "Name"
-msgstr "Nombre"
+msgstr "Ident"
 
 msgctxt "field:calendar.calendar,owner:"
 msgid "Owner"
-msgstr "Propietario"
+msgstr "Imetnik"
 
 msgctxt "field:calendar.calendar,read_users:"
 msgid "Read Users"
-msgstr "Usuarios que pueden Leer"
+msgstr "Bralci"
 
 msgctxt "field:calendar.calendar,rec_name:"
 msgid "Name"
-msgstr "Nombre"
+msgstr "Ime"
 
 msgctxt "field:calendar.calendar,write_date:"
 msgid "Write Date"
-msgstr "Fecha de Modificación"
+msgstr "Zapisano"
 
 msgctxt "field:calendar.calendar,write_uid:"
 msgid "Write User"
-msgstr "Modificado por Usuario"
+msgstr "Zapisal"
 
 msgctxt "field:calendar.calendar,write_users:"
 msgid "Write Users"
-msgstr "Modificado por Usuario"
+msgstr "Zapisovalci"
 
 msgctxt "field:calendar.calendar-read-res.user,calendar:"
 msgid "Calendar"
-msgstr "Calendario"
+msgstr "Koledar"
 
 msgctxt "field:calendar.calendar-read-res.user,create_date:"
 msgid "Create Date"
-msgstr "Fecha de Creación"
+msgstr "Ustvarjeno"
 
 msgctxt "field:calendar.calendar-read-res.user,create_uid:"
 msgid "Create User"
-msgstr "Creado por Usuario"
+msgstr "Ustvaril"
 
 msgctxt "field:calendar.calendar-read-res.user,id:"
 msgid "ID"
@@ -172,31 +172,31 @@ msgstr "ID"
 
 msgctxt "field:calendar.calendar-read-res.user,rec_name:"
 msgid "Name"
-msgstr "Nombre"
+msgstr "Ime"
 
 msgctxt "field:calendar.calendar-read-res.user,user:"
 msgid "User"
-msgstr "Usuario"
+msgstr "Uporabnik"
 
 msgctxt "field:calendar.calendar-read-res.user,write_date:"
 msgid "Write Date"
-msgstr "Fecha de Modificación"
+msgstr "Zapisano"
 
 msgctxt "field:calendar.calendar-read-res.user,write_uid:"
 msgid "Write User"
-msgstr "Modificado por Usuario"
+msgstr "Zapisal"
 
 msgctxt "field:calendar.calendar-write-res.user,calendar:"
 msgid "Calendar"
-msgstr "Calendario"
+msgstr "Koledar"
 
 msgctxt "field:calendar.calendar-write-res.user,create_date:"
 msgid "Create Date"
-msgstr "Fecha de Creación"
+msgstr "Ustvarjeno"
 
 msgctxt "field:calendar.calendar-write-res.user,create_uid:"
 msgid "Create User"
-msgstr "Creado por Usuario"
+msgstr "Ustvaril"
 
 msgctxt "field:calendar.calendar-write-res.user,id:"
 msgid "ID"
@@ -204,27 +204,27 @@ msgstr "ID"
 
 msgctxt "field:calendar.calendar-write-res.user,rec_name:"
 msgid "Name"
-msgstr "Nombre"
+msgstr "Ime"
 
 msgctxt "field:calendar.calendar-write-res.user,user:"
 msgid "User"
-msgstr "Usuario"
+msgstr "Uporabnik"
 
 msgctxt "field:calendar.calendar-write-res.user,write_date:"
 msgid "Write Date"
-msgstr "Fecha de Modificación"
+msgstr "Zapisano"
 
 msgctxt "field:calendar.calendar-write-res.user,write_uid:"
 msgid "Write User"
-msgstr "Modificado por Usuario"
+msgstr "Zapisal"
 
 msgctxt "field:calendar.category,create_date:"
 msgid "Create Date"
-msgstr "Fecha de Creación"
+msgstr "Ustvarjeno"
 
 msgctxt "field:calendar.category,create_uid:"
 msgid "Create User"
-msgstr "Creado por Usuario"
+msgstr "Ustvaril"
 
 msgctxt "field:calendar.category,id:"
 msgid "ID"
@@ -232,83 +232,83 @@ msgstr "ID"
 
 msgctxt "field:calendar.category,name:"
 msgid "Name"
-msgstr "Nombre"
+msgstr "Naziv"
 
 msgctxt "field:calendar.category,rec_name:"
 msgid "Name"
-msgstr "Nombre"
+msgstr "Ime"
 
 msgctxt "field:calendar.category,write_date:"
 msgid "Write Date"
-msgstr "Fecha de Modificación"
+msgstr "Zapisano"
 
 msgctxt "field:calendar.category,write_uid:"
 msgid "Write User"
-msgstr "Modificado por Usuario"
+msgstr "Zapisal"
 
 msgctxt "field:calendar.event,alarms:"
 msgid "Alarms"
-msgstr "Alarmas"
+msgstr "Alarmi"
 
 msgctxt "field:calendar.event,all_day:"
 msgid "All Day"
-msgstr "Todo el Día"
+msgstr "Cel dan"
 
 msgctxt "field:calendar.event,attendees:"
 msgid "Attendees"
-msgstr "Asistentes"
+msgstr "Navzoči"
 
 msgctxt "field:calendar.event,calendar:"
 msgid "Calendar"
-msgstr "Calendario"
+msgstr "Koledar"
 
 msgctxt "field:calendar.event,calendar_owner:"
 msgid "Owner"
-msgstr "Propietario"
+msgstr "Imetnik"
 
 msgctxt "field:calendar.event,calendar_read_users:"
 msgid "Read Users"
-msgstr "Usuarios que pueden Leer"
+msgstr "Bralci"
 
 msgctxt "field:calendar.event,calendar_write_users:"
 msgid "Write Users"
-msgstr "Modificado por Usuario"
+msgstr "Zapisovalci"
 
 msgctxt "field:calendar.event,categories:"
 msgid "Categories"
-msgstr "Categorías"
+msgstr "Kategorije"
 
 msgctxt "field:calendar.event,classification:"
 msgid "Classification"
-msgstr "Clasificación"
+msgstr "Klasifikacija"
 
 msgctxt "field:calendar.event,create_date:"
 msgid "Create Date"
-msgstr "Fecha de Creación"
+msgstr "Ustvarjeno"
 
 msgctxt "field:calendar.event,create_uid:"
 msgid "Create User"
-msgstr "Creado por Usuario"
+msgstr "Ustvaril"
 
 msgctxt "field:calendar.event,description:"
 msgid "Description"
-msgstr "Descripción"
+msgstr "Opis"
 
 msgctxt "field:calendar.event,dtend:"
 msgid "End Date"
-msgstr "Fecha Fin"
+msgstr "Končni datum"
 
 msgctxt "field:calendar.event,dtstart:"
 msgid "Start Date"
-msgstr "Fecha Inicial"
+msgstr "Začetni datum"
 
 msgctxt "field:calendar.event,exdates:"
 msgid "Exception Dates"
-msgstr "Fechas de Excepción"
+msgstr "Izjemni datumi"
 
 msgctxt "field:calendar.event,exrules:"
 msgid "Exception Rules"
-msgstr "Reglas de Excepción"
+msgstr "Izjemna pravila"
 
 msgctxt "field:calendar.event,id:"
 msgid "ID"
@@ -316,55 +316,55 @@ msgstr "ID"
 
 msgctxt "field:calendar.event,location:"
 msgid "Location"
-msgstr "Lugar"
+msgstr "Lokacija"
 
 msgctxt "field:calendar.event,occurences:"
 msgid "Occurences"
-msgstr "Ocurrencias"
+msgstr "Pojavljanje"
 
 msgctxt "field:calendar.event,organizer:"
 msgid "Organizer"
-msgstr "Organizador"
+msgstr "Organizator"
 
 msgctxt "field:calendar.event,parent:"
 msgid "Parent"
-msgstr "Padre"
+msgstr "Poddogodek"
 
 msgctxt "field:calendar.event,rdates:"
 msgid "Recurrence Dates"
-msgstr "Fechas de Repetición"
+msgstr "Datumi ponovitev"
 
 msgctxt "field:calendar.event,rec_name:"
 msgid "Name"
-msgstr "Nombre"
+msgstr "Ime"
 
 msgctxt "field:calendar.event,recurrence:"
 msgid "Recurrence"
-msgstr "Repetición"
+msgstr "Ponovitev"
 
 msgctxt "field:calendar.event,rrules:"
 msgid "Recurrence Rules"
-msgstr "Reglas de Repetición"
+msgstr "Pravila ponovitev"
 
 msgctxt "field:calendar.event,sequence:"
 msgid "Sequence"
-msgstr "Secuencia"
+msgstr "Zap.št."
 
 msgctxt "field:calendar.event,status:"
 msgid "Status"
-msgstr "Estado"
+msgstr "Status"
 
 msgctxt "field:calendar.event,summary:"
 msgid "Summary"
-msgstr "Resumen"
+msgstr "Povzetek"
 
 msgctxt "field:calendar.event,timezone:"
 msgid "Timezone"
-msgstr "Zona horaria"
+msgstr "Časovni pas"
 
 msgctxt "field:calendar.event,transp:"
 msgid "Time Transparency"
-msgstr "Transparencia de Tiempo"
+msgstr "Časovna preglednost"
 
 msgctxt "field:calendar.event,uuid:"
 msgid "UUID"
@@ -372,31 +372,31 @@ msgstr "UUID"
 
 msgctxt "field:calendar.event,vevent:"
 msgid "vevent"
-msgstr "vevento"
+msgstr "vevent"
 
 msgctxt "field:calendar.event,write_date:"
 msgid "Write Date"
-msgstr "Fecha de Modificación"
+msgstr "Zapisano"
 
 msgctxt "field:calendar.event,write_uid:"
 msgid "Write User"
-msgstr "Modificado por Usuario"
+msgstr "Zapisal"
 
 msgctxt "field:calendar.event-calendar.category,category:"
 msgid "Category"
-msgstr "Categoría"
+msgstr "Kategorija"
 
 msgctxt "field:calendar.event-calendar.category,create_date:"
 msgid "Create Date"
-msgstr "Fecha de Creación"
+msgstr "Ustvarjeno"
 
 msgctxt "field:calendar.event-calendar.category,create_uid:"
 msgid "Create User"
-msgstr "Creado por Usuario"
+msgstr "Ustvaril"
 
 msgctxt "field:calendar.event-calendar.category,event:"
 msgid "Event"
-msgstr "Evento"
+msgstr "Dogodek"
 
 msgctxt "field:calendar.event-calendar.category,id:"
 msgid "ID"
@@ -404,27 +404,27 @@ msgstr "ID"
 
 msgctxt "field:calendar.event-calendar.category,rec_name:"
 msgid "Name"
-msgstr "Nombre"
+msgstr "Ime"
 
 msgctxt "field:calendar.event-calendar.category,write_date:"
 msgid "Write Date"
-msgstr "Fecha de Modificación"
+msgstr "Zapisano"
 
 msgctxt "field:calendar.event-calendar.category,write_uid:"
 msgid "Write User"
-msgstr "Modificado por Usuario"
+msgstr "Zapisal"
 
 msgctxt "field:calendar.event.alarm,create_date:"
 msgid "Create Date"
-msgstr "Fecha de Creación"
+msgstr "Ustvarjeno"
 
 msgctxt "field:calendar.event.alarm,create_uid:"
 msgid "Create User"
-msgstr "Creado por Usuario"
+msgstr "Ustvaril"
 
 msgctxt "field:calendar.event.alarm,event:"
 msgid "Event"
-msgstr "Evento"
+msgstr "Dogodek"
 
 msgctxt "field:calendar.event.alarm,id:"
 msgid "ID"
@@ -432,39 +432,39 @@ msgstr "ID"
 
 msgctxt "field:calendar.event.alarm,rec_name:"
 msgid "Name"
-msgstr "Nombre"
+msgstr "Ime"
 
 msgctxt "field:calendar.event.alarm,valarm:"
 msgid "valarm"
-msgstr "valarma"
+msgstr "valarm"
 
 msgctxt "field:calendar.event.alarm,write_date:"
 msgid "Write Date"
-msgstr "Fecha de Modificación"
+msgstr "Zapisano"
 
 msgctxt "field:calendar.event.alarm,write_uid:"
 msgid "Write User"
-msgstr "Modificado por Usuario"
+msgstr "Zapisal"
 
 msgctxt "field:calendar.event.attendee,attendee:"
 msgid "attendee"
-msgstr "Asistente"
+msgstr "Navzoči"
 
 msgctxt "field:calendar.event.attendee,create_date:"
 msgid "Create Date"
-msgstr "Fecha de Creación"
+msgstr "Ustvarjeno"
 
 msgctxt "field:calendar.event.attendee,create_uid:"
 msgid "Create User"
-msgstr "Creado por Usuario"
+msgstr "Ustvaril"
 
 msgctxt "field:calendar.event.attendee,email:"
 msgid "Email"
-msgstr "Correo Electrónico"
+msgstr "E-pošta"
 
 msgctxt "field:calendar.event.attendee,event:"
 msgid "Event"
-msgstr "Evento"
+msgstr "Dogodek"
 
 msgctxt "field:calendar.event.attendee,id:"
 msgid "ID"
@@ -472,39 +472,39 @@ msgstr "ID"
 
 msgctxt "field:calendar.event.attendee,rec_name:"
 msgid "Name"
-msgstr "Nombre"
+msgstr "Ime"
 
 msgctxt "field:calendar.event.attendee,status:"
 msgid "Participation Status"
-msgstr "Estado de Participación"
+msgstr "Status udeleženca"
 
 msgctxt "field:calendar.event.attendee,write_date:"
 msgid "Write Date"
-msgstr "Fecha de Modificación"
+msgstr "Zapisano"
 
 msgctxt "field:calendar.event.attendee,write_uid:"
 msgid "Write User"
-msgstr "Modificado por Usuario"
+msgstr "Zapisal"
 
 msgctxt "field:calendar.event.exdate,create_date:"
 msgid "Create Date"
-msgstr "Fecha de Creación"
+msgstr "Ustvarjeno"
 
 msgctxt "field:calendar.event.exdate,create_uid:"
 msgid "Create User"
-msgstr "Creado por Usuario"
+msgstr "Ustvaril"
 
 msgctxt "field:calendar.event.exdate,date:"
 msgid "Is Date"
-msgstr "Esta Fecha"
+msgstr "Je datum"
 
 msgctxt "field:calendar.event.exdate,datetime:"
 msgid "Date"
-msgstr "Fecha"
+msgstr "Datum"
 
 msgctxt "field:calendar.event.exdate,event:"
 msgid "Event"
-msgstr "Evento"
+msgstr "Dogodek"
 
 msgctxt "field:calendar.event.exdate,id:"
 msgid "ID"
@@ -512,71 +512,71 @@ msgstr "ID"
 
 msgctxt "field:calendar.event.exdate,rec_name:"
 msgid "Name"
-msgstr "Nombre"
+msgstr "Ime"
 
 msgctxt "field:calendar.event.exdate,write_date:"
 msgid "Write Date"
-msgstr "Fecha de Modificación"
+msgstr "Zapisano"
 
 msgctxt "field:calendar.event.exdate,write_uid:"
 msgid "Write User"
-msgstr "Modificado por Usuario"
+msgstr "Zapisal"
 
 msgctxt "field:calendar.event.exrule,byday:"
 msgid "By Day"
-msgstr "Por Día"
+msgstr "Na dan"
 
 msgctxt "field:calendar.event.exrule,byhour:"
 msgid "By Hour"
-msgstr "Por Hora"
+msgstr "Na uro"
 
 msgctxt "field:calendar.event.exrule,byminute:"
 msgid "By Minute"
-msgstr "Por Minuto"
+msgstr "Na minuto"
 
 msgctxt "field:calendar.event.exrule,bymonth:"
 msgid "By Month"
-msgstr "Por Mes"
+msgstr "Na mesec"
 
 msgctxt "field:calendar.event.exrule,bymonthday:"
 msgid "By Month Day"
-msgstr "Por Día del Mes"
+msgstr "Na dan v mesecu"
 
 msgctxt "field:calendar.event.exrule,bysecond:"
 msgid "By Second"
-msgstr "Por Segundo"
+msgstr "Na sekundo"
 
 msgctxt "field:calendar.event.exrule,bysetpos:"
 msgid "By Position"
-msgstr "Por Posición"
+msgstr "Na pozicijo"
 
 msgctxt "field:calendar.event.exrule,byweekno:"
 msgid "By Week Number"
-msgstr "Por Número de la Semana"
+msgstr "Na teden v letu"
 
 msgctxt "field:calendar.event.exrule,byyearday:"
 msgid "By Year Day"
-msgstr "Por Día del Año"
+msgstr "Na dan v letu"
 
 msgctxt "field:calendar.event.exrule,count:"
 msgid "Count"
-msgstr "Contar"
+msgstr "Število"
 
 msgctxt "field:calendar.event.exrule,create_date:"
 msgid "Create Date"
-msgstr "Fecha de Creación"
+msgstr "Ustvarjeno"
 
 msgctxt "field:calendar.event.exrule,create_uid:"
 msgid "Create User"
-msgstr "Creado por Usuario"
+msgstr "Ustvaril"
 
 msgctxt "field:calendar.event.exrule,event:"
 msgid "Event"
-msgstr "Evento"
+msgstr "Dogodek"
 
 msgctxt "field:calendar.event.exrule,freq:"
 msgid "Frequency"
-msgstr "Frecuencia"
+msgstr "Frekvenca"
 
 msgctxt "field:calendar.event.exrule,id:"
 msgid "ID"
@@ -584,51 +584,51 @@ msgstr "ID"
 
 msgctxt "field:calendar.event.exrule,interval:"
 msgid "Interval"
-msgstr "Intervalo"
+msgstr "Interval"
 
 msgctxt "field:calendar.event.exrule,rec_name:"
 msgid "Name"
-msgstr "Nombre"
+msgstr "Ime"
 
 msgctxt "field:calendar.event.exrule,until:"
 msgid "Until Date"
-msgstr "Hasta la Fecha"
+msgstr "Do dne"
 
 msgctxt "field:calendar.event.exrule,until_date:"
 msgid "Is Date"
-msgstr "Esta Fecha"
+msgstr "Je datum"
 
 msgctxt "field:calendar.event.exrule,wkst:"
 msgid "Week Day"
-msgstr "Día de la Semana"
+msgstr "Dan v tednu"
 
 msgctxt "field:calendar.event.exrule,write_date:"
 msgid "Write Date"
-msgstr "Fecha de Modificación"
+msgstr "Zapisano"
 
 msgctxt "field:calendar.event.exrule,write_uid:"
 msgid "Write User"
-msgstr "Modificado por Usuario"
+msgstr "Zapisal"
 
 msgctxt "field:calendar.event.rdate,create_date:"
 msgid "Create Date"
-msgstr "Fecha de Creación"
+msgstr "Ustvarjeno"
 
 msgctxt "field:calendar.event.rdate,create_uid:"
 msgid "Create User"
-msgstr "Creado por Usuario"
+msgstr "Ustvaril"
 
 msgctxt "field:calendar.event.rdate,date:"
 msgid "Is Date"
-msgstr "Esta Fecha"
+msgstr "Je datum"
 
 msgctxt "field:calendar.event.rdate,datetime:"
 msgid "Date"
-msgstr "Fecha"
+msgstr "Datum"
 
 msgctxt "field:calendar.event.rdate,event:"
 msgid "Event"
-msgstr "Evento"
+msgstr "Dogodek"
 
 msgctxt "field:calendar.event.rdate,id:"
 msgid "ID"
@@ -636,71 +636,71 @@ msgstr "ID"
 
 msgctxt "field:calendar.event.rdate,rec_name:"
 msgid "Name"
-msgstr "Nombre"
+msgstr "Ime"
 
 msgctxt "field:calendar.event.rdate,write_date:"
 msgid "Write Date"
-msgstr "Fecha de Modificación"
+msgstr "Zapisano"
 
 msgctxt "field:calendar.event.rdate,write_uid:"
 msgid "Write User"
-msgstr "Modificado por Usuario"
+msgstr "Zapisal"
 
 msgctxt "field:calendar.event.rrule,byday:"
 msgid "By Day"
-msgstr "Por Día"
+msgstr "Na dan"
 
 msgctxt "field:calendar.event.rrule,byhour:"
 msgid "By Hour"
-msgstr "Por Hora"
+msgstr "Na uro"
 
 msgctxt "field:calendar.event.rrule,byminute:"
 msgid "By Minute"
-msgstr "Por Minuto"
+msgstr "Na minuto"
 
 msgctxt "field:calendar.event.rrule,bymonth:"
 msgid "By Month"
-msgstr "Por Mes"
+msgstr "Na mesec"
 
 msgctxt "field:calendar.event.rrule,bymonthday:"
 msgid "By Month Day"
-msgstr "Por Día del Mes"
+msgstr "Na dan v mesecu"
 
 msgctxt "field:calendar.event.rrule,bysecond:"
 msgid "By Second"
-msgstr "Por Segundo"
+msgstr "Na sekundo"
 
 msgctxt "field:calendar.event.rrule,bysetpos:"
 msgid "By Position"
-msgstr "Por Posición"
+msgstr "Na pozicijo"
 
 msgctxt "field:calendar.event.rrule,byweekno:"
 msgid "By Week Number"
-msgstr "Por Número de la Semana"
+msgstr "Na teden v letu"
 
 msgctxt "field:calendar.event.rrule,byyearday:"
 msgid "By Year Day"
-msgstr "Por Día del Año"
+msgstr "Na dan v letu"
 
 msgctxt "field:calendar.event.rrule,count:"
 msgid "Count"
-msgstr "Contar"
+msgstr "Število"
 
 msgctxt "field:calendar.event.rrule,create_date:"
 msgid "Create Date"
-msgstr "Fecha de Creación"
+msgstr "Ustvarjeno"
 
 msgctxt "field:calendar.event.rrule,create_uid:"
 msgid "Create User"
-msgstr "Creado por Usuario"
+msgstr "Ustvaril"
 
 msgctxt "field:calendar.event.rrule,event:"
 msgid "Event"
-msgstr "Evento"
+msgstr "Dogodek"
 
 msgctxt "field:calendar.event.rrule,freq:"
 msgid "Frequency"
-msgstr "Frecuencia"
+msgstr "Frekvenca"
 
 msgctxt "field:calendar.event.rrule,id:"
 msgid "ID"
@@ -708,39 +708,39 @@ msgstr "ID"
 
 msgctxt "field:calendar.event.rrule,interval:"
 msgid "Interval"
-msgstr "Intervalo"
+msgstr "Interval"
 
 msgctxt "field:calendar.event.rrule,rec_name:"
 msgid "Name"
-msgstr "Nombre"
+msgstr "Ime"
 
 msgctxt "field:calendar.event.rrule,until:"
 msgid "Until Date"
-msgstr "Hasta la Fecha"
+msgstr "Do dne"
 
 msgctxt "field:calendar.event.rrule,until_date:"
 msgid "Is Date"
-msgstr "Esta Fecha"
+msgstr "Je datum"
 
 msgctxt "field:calendar.event.rrule,wkst:"
 msgid "Week Day"
-msgstr "Día de la Semana"
+msgstr "Dan v tednu"
 
 msgctxt "field:calendar.event.rrule,write_date:"
 msgid "Write Date"
-msgstr "Fecha de Modificación"
+msgstr "Zapisano"
 
 msgctxt "field:calendar.event.rrule,write_uid:"
 msgid "Write User"
-msgstr "Modificado por Usuario"
+msgstr "Zapisal"
 
 msgctxt "field:calendar.location,create_date:"
 msgid "Create Date"
-msgstr "Fecha de Creación"
+msgstr "Ustvarjeno"
 
 msgctxt "field:calendar.location,create_uid:"
 msgid "Create User"
-msgstr "Creado por Usuario"
+msgstr "Ustvaril"
 
 msgctxt "field:calendar.location,id:"
 msgid "ID"
@@ -748,399 +748,392 @@ msgstr "ID"
 
 msgctxt "field:calendar.location,name:"
 msgid "Name"
-msgstr "Nombre"
+msgstr "Naziv"
 
 msgctxt "field:calendar.location,rec_name:"
 msgid "Name"
-msgstr "Nombre"
+msgstr "Ime"
 
 msgctxt "field:calendar.location,write_date:"
 msgid "Write Date"
-msgstr "Fecha de Modificación"
+msgstr "Zapisano"
 
 msgctxt "field:calendar.location,write_uid:"
 msgid "Write User"
-msgstr "Modificado por Usuario"
+msgstr "Zapisal"
 
 msgctxt "field:res.user,calendars:"
 msgid "Calendars"
-msgstr "Calendarios"
+msgstr "Koledarji"
 
 msgctxt "help:calendar.calendar,owner:"
 msgid "The user must have an email"
-msgstr "El usuario debe tener un email"
+msgstr "Uporabnik mora imeti elektronski naslov"
 
 msgctxt "help:calendar.event,uuid:"
 msgid "Universally Unique Identifier"
-msgstr "Idenitificador Universal Único"
+msgstr "Vsesplošno edinstven identifikator"
 
 msgctxt "help:calendar.event.exdate,date:"
 msgid "Ignore time of field \"Date\", but handle as date only."
-msgstr "Ignore tiempo del campo \"Fecha\", pero manejelo como fecha solamente."
+msgstr "Prezri čas v polju \"Datum\" in ga samo obravnavaj kot datum."
 
 msgctxt "help:calendar.event.exrule,until_date:"
 msgid "Ignore time of field \"Until Date\", but handle as date only."
-msgstr ""
-"Ignore tiempo del campo \"Hasta la Fecha\", pero manejelo como fecha "
-"solamente."
+msgstr "Prezri čas v polju \"Do dne\" in ga samo obravnavaj kot datum."
 
 msgctxt "help:calendar.event.rdate,date:"
 msgid "Ignore time of field \"Date\", but handle as date only."
-msgstr "Ignore tiempo del campo \"Fecha\", pero manejelo como fecha solamente."
+msgstr "Prezri čas v polju \"Datum\" in ga samo obravnavaj kot datum."
 
 msgctxt "help:calendar.event.rrule,until_date:"
 msgid "Ignore time of field \"Until Date\", but handle as date only."
-msgstr ""
-"Ignore tiempo del campo \"Hasta la Fecha\", pero manejelo como fecha "
-"solamente."
+msgstr "Prezri čas v polju \"Do dne\" in ga samo obravnavaj kot datum."
 
 msgctxt "model:calendar.calendar,name:"
 msgid "Calendar"
-msgstr "Calendario"
+msgstr "Koledar"
 
 msgctxt "model:calendar.calendar-read-res.user,name:"
 msgid "Calendar - read - User"
-msgstr "Calendario - leer - Usuario"
+msgstr "Koledar - branje - Uporabnik"
 
 msgctxt "model:calendar.calendar-write-res.user,name:"
 msgid "Calendar - write - User"
-msgstr "Calendario - escribir - Usuario"
+msgstr "Koledar - pisanje - Uporabnik"
 
 msgctxt "model:calendar.category,name:"
 msgid "Category"
-msgstr "Categoría"
+msgstr "Kategorija"
 
 msgctxt "model:calendar.event,name:"
 msgid "Event"
-msgstr "Evento"
+msgstr "Dogodek"
 
 msgctxt "model:calendar.event-calendar.category,name:"
 msgid "Event - Category"
-msgstr "Evento - Categoría"
+msgstr "Dogodek - Kategorija"
 
 msgctxt "model:calendar.event.alarm,name:"
 msgid "Alarm"
-msgstr "Alarma"
+msgstr "Alarm"
 
 msgctxt "model:calendar.event.attendee,name:"
 msgid "Attendee"
-msgstr "Asistente"
+msgstr "Navzoči"
 
 msgctxt "model:calendar.event.exdate,name:"
 msgid "Exception Date"
-msgstr "Fecha de Excepción"
+msgstr "Izjemni datum"
 
 msgctxt "model:calendar.event.exrule,name:"
 msgid "Exception Rule"
-msgstr "Regla de Excepción"
+msgstr "Izjemno pravilo"
 
 msgctxt "model:calendar.event.rdate,name:"
 msgid "Recurrence Date"
-msgstr "Fecha de Repetición"
+msgstr "Datum ponovitve"
 
 msgctxt "model:calendar.event.rrule,name:"
 msgid "Recurrence Rule"
-msgstr "Regla de Repetición"
+msgstr "Pravilo ponovitve"
 
 msgctxt "model:calendar.location,name:"
 msgid "Location"
-msgstr "Lugar"
+msgstr "Lokacija"
 
 msgctxt "model:ir.action,name:act_calendar_form"
 msgid "Calendars"
-msgstr "Calendarios"
+msgstr "Koledarji"
 
 msgctxt "model:ir.action,name:act_event_form"
 msgid "Events"
-msgstr "Eventos"
+msgstr "Dogodki"
 
 msgctxt "model:ir.action,name:act_event_form3"
 msgid "Events"
-msgstr "Eventos"
+msgstr "Dogodki"
 
 msgctxt "model:ir.ui.menu,name:menu_calendar"
 msgid "Calendar"
-msgstr "Calendario"
+msgstr "Koledar"
 
 msgctxt "model:ir.ui.menu,name:menu_calendar_form"
 msgid "Calendars"
-msgstr "Calendarios"
+msgstr "Koledarji"
 
 msgctxt "model:ir.ui.menu,name:menu_event_form"
 msgid "Events"
-msgstr "Eventos"
+msgstr "Dogodki"
 
 msgctxt "model:res.group,name:group_calendar_admin"
 msgid "Calendar Administration"
-msgstr "Administración Calendario"
+msgstr "Koledar - vodenje"
 
 msgctxt "selection:calendar.event,classification:"
 msgid "Confidential"
-msgstr "Confidencial"
+msgstr "Zaupno"
 
 msgctxt "selection:calendar.event,classification:"
 msgid "Private"
-msgstr "Privado"
+msgstr "Zasebno"
 
 msgctxt "selection:calendar.event,classification:"
 msgid "Public"
-msgstr "Público"
+msgstr "Javno"
 
-#, fuzzy
 msgctxt "selection:calendar.event,status:"
 msgid ""
-msgstr "Punto de Orden"
+msgstr ""
 
 msgctxt "selection:calendar.event,status:"
 msgid "Cancelled"
-msgstr "Cancelado"
+msgstr "Preklicano"
 
 msgctxt "selection:calendar.event,status:"
 msgid "Confirmed"
-msgstr "Confirmado"
+msgstr "Potrjeno"
 
 msgctxt "selection:calendar.event,status:"
 msgid "Tentative"
-msgstr "Tentativa"
+msgstr "Negotovo"
 
 msgctxt "selection:calendar.event,transp:"
 msgid "Opaque"
-msgstr "Opaco"
+msgstr "Nepregledno"
 
 msgctxt "selection:calendar.event,transp:"
 msgid "Transparent"
-msgstr "Transparente"
+msgstr "Pregledno"
 
-#, fuzzy
 msgctxt "selection:calendar.event.attendee,status:"
 msgid ""
-msgstr "Punto de Orden"
+msgstr ""
 
 msgctxt "selection:calendar.event.attendee,status:"
 msgid "Accepted"
-msgstr "Aceptado"
+msgstr "Sprejeto"
 
 msgctxt "selection:calendar.event.attendee,status:"
 msgid "Declined"
-msgstr "Declinado"
+msgstr "Zavrnjeno"
 
 msgctxt "selection:calendar.event.attendee,status:"
 msgid "Delegated"
-msgstr "Delegado"
+msgstr "Delegirano"
 
 msgctxt "selection:calendar.event.attendee,status:"
 msgid "Needs Action"
-msgstr "Necesita una Acción"
+msgstr "Potreben ukrep"
 
 msgctxt "selection:calendar.event.attendee,status:"
 msgid "Tentative"
-msgstr "Tentativa"
+msgstr "Negotovo"
 
 msgctxt "selection:calendar.event.exrule,freq:"
 msgid "Daily"
-msgstr "Diario"
+msgstr "Dnevno"
 
 msgctxt "selection:calendar.event.exrule,freq:"
 msgid "Hourly"
-msgstr "Cada Hora"
+msgstr "Na uro"
 
 msgctxt "selection:calendar.event.exrule,freq:"
 msgid "Minutely"
-msgstr "Cada Minuto"
+msgstr "Na minuto"
 
 msgctxt "selection:calendar.event.exrule,freq:"
 msgid "Monthly"
-msgstr "Mensualmente"
+msgstr "Mesečno"
 
 msgctxt "selection:calendar.event.exrule,freq:"
 msgid "Secondly"
-msgstr "En segundo lugar"
+msgstr "Na sekundo"
 
 msgctxt "selection:calendar.event.exrule,freq:"
 msgid "Weekly"
-msgstr "Semanalmente"
+msgstr "Tedensko"
 
 msgctxt "selection:calendar.event.exrule,freq:"
 msgid "Yearly"
-msgstr "Anualmente"
+msgstr "Letno"
 
 msgctxt "selection:calendar.event.exrule,wkst:"
 msgid "Friday"
-msgstr "Viernes"
+msgstr "Petek"
 
 msgctxt "selection:calendar.event.exrule,wkst:"
 msgid "Monday"
-msgstr "Lunes"
+msgstr "Ponedeljek"
 
 msgctxt "selection:calendar.event.exrule,wkst:"
 msgid "Saturday"
-msgstr "Sábado"
+msgstr "Sobota"
 
 msgctxt "selection:calendar.event.exrule,wkst:"
 msgid "Sunday"
-msgstr "Domingo"
+msgstr "Nedelja"
 
 msgctxt "selection:calendar.event.exrule,wkst:"
 msgid "Thursday"
-msgstr "Jueves"
+msgstr "Četrtek"
 
 msgctxt "selection:calendar.event.exrule,wkst:"
 msgid "Tuesday"
-msgstr "Martes"
+msgstr "Torek"
 
 msgctxt "selection:calendar.event.exrule,wkst:"
 msgid "Wednesday"
-msgstr "Miércoles"
+msgstr "Sreda"
 
 msgctxt "selection:calendar.event.rrule,freq:"
 msgid "Daily"
-msgstr "Diario"
+msgstr "Dnevno"
 
 msgctxt "selection:calendar.event.rrule,freq:"
 msgid "Hourly"
-msgstr "Cada Hora"
+msgstr "Na uro"
 
 msgctxt "selection:calendar.event.rrule,freq:"
 msgid "Minutely"
-msgstr "Cada Minuto"
+msgstr "Na minuto"
 
 msgctxt "selection:calendar.event.rrule,freq:"
 msgid "Monthly"
-msgstr "Mensualmente"
+msgstr "Mesečno"
 
 msgctxt "selection:calendar.event.rrule,freq:"
 msgid "Secondly"
-msgstr "En segundo lugar"
+msgstr "Na sekundo"
 
 msgctxt "selection:calendar.event.rrule,freq:"
 msgid "Weekly"
-msgstr "Semanalmente"
+msgstr "Tedensko"
 
 msgctxt "selection:calendar.event.rrule,freq:"
 msgid "Yearly"
-msgstr "Anualmente"
+msgstr "Letno"
 
 msgctxt "selection:calendar.event.rrule,wkst:"
 msgid "Friday"
-msgstr "Viernes"
+msgstr "Petek"
 
 msgctxt "selection:calendar.event.rrule,wkst:"
 msgid "Monday"
-msgstr "Lunes"
+msgstr "Ponedeljek"
 
 msgctxt "selection:calendar.event.rrule,wkst:"
 msgid "Saturday"
-msgstr "Sábado"
+msgstr "Sobota"
 
 msgctxt "selection:calendar.event.rrule,wkst:"
 msgid "Sunday"
-msgstr "Domingo"
+msgstr "Nedelja"
 
 msgctxt "selection:calendar.event.rrule,wkst:"
 msgid "Thursday"
-msgstr "Jueves"
+msgstr "Četrtek"
 
 msgctxt "selection:calendar.event.rrule,wkst:"
 msgid "Tuesday"
-msgstr "Martes"
+msgstr "Torek"
 
 msgctxt "selection:calendar.event.rrule,wkst:"
 msgid "Wednesday"
-msgstr "Miércoles"
+msgstr "Sreda"
 
-#, fuzzy
 msgctxt "view:calendar.calendar:"
 msgid "Access Permissions"
-msgstr "Permisos de Acceso"
+msgstr "Dostop"
 
 msgctxt "view:calendar.calendar:"
 msgid "Calendar"
-msgstr "Calendario"
+msgstr "Koledar"
 
 msgctxt "view:calendar.calendar:"
 msgid "Calendars"
-msgstr "Calendarios"
+msgstr "Koledarji"
 
 msgctxt "view:calendar.calendar:"
 msgid "General"
-msgstr "General"
+msgstr "Splošno"
 
 msgctxt "view:calendar.category:"
 msgid "Categories"
-msgstr "Categorías"
+msgstr "Kategorije"
 
 msgctxt "view:calendar.category:"
 msgid "Category"
-msgstr "Categoría"
+msgstr "Kategorija"
 
 msgctxt "view:calendar.event.attendee:"
 msgid "Attendee"
-msgstr "Asistente"
+msgstr "Navzoči"
 
 msgctxt "view:calendar.event.attendee:"
 msgid "Attendees"
-msgstr "Asistentes"
+msgstr "Navzoči"
 
 msgctxt "view:calendar.event.exdate:"
 msgid "Exception Date"
-msgstr "Fecha de Excepción"
+msgstr "Izjemni datum"
 
 msgctxt "view:calendar.event.exdate:"
 msgid "Exception Dates"
-msgstr "Fechas de Excepción"
+msgstr "Izjemni datumi"
 
 msgctxt "view:calendar.event.exrule:"
 msgid "Exception Rule"
-msgstr "Regla de Excepción"
+msgstr "Izjemno pravilo"
 
 msgctxt "view:calendar.event.exrule:"
 msgid "Exception Rules"
-msgstr "Reglas de Excepción"
+msgstr "Izjemna pravila"
 
 msgctxt "view:calendar.event.rdate:"
 msgid "Recurrence Date"
-msgstr "Fecha de Repetición"
+msgstr "Datum ponovitve"
 
 msgctxt "view:calendar.event.rdate:"
 msgid "Recurrence Dates"
-msgstr "Fechas de Repetición"
+msgstr "Datumi ponovitev"
 
 msgctxt "view:calendar.event.rrule:"
 msgid "Recurrence Rule"
-msgstr "Regla de Repetición"
+msgstr "Pravilo ponovitve"
 
 msgctxt "view:calendar.event.rrule:"
 msgid "Recurrence Rules"
-msgstr "Reglas de Repetición"
+msgstr "Pravila ponovitev"
 
 msgctxt "view:calendar.event:"
 msgid "Attendees"
-msgstr "Asistentes"
+msgstr "Navzoči"
 
 msgctxt "view:calendar.event:"
 msgid "Categories"
-msgstr "Categorías"
+msgstr "Kategorije"
 
 msgctxt "view:calendar.event:"
 msgid "Event"
-msgstr "Evento"
+msgstr "Dogodek"
 
 msgctxt "view:calendar.event:"
 msgid "Events"
-msgstr "Eventos"
+msgstr "Dogodki"
 
 msgctxt "view:calendar.event:"
 msgid "General"
-msgstr "General"
+msgstr "Splošno"
 
 msgctxt "view:calendar.event:"
 msgid "Occurences"
-msgstr "Ocurrencias"
+msgstr "Pojavljanje"
 
 msgctxt "view:calendar.location:"
 msgid "Location"
-msgstr "Lugar"
+msgstr "Lokacija"
 
 msgctxt "view:calendar.location:"
 msgid "Locations"
-msgstr "Lugares"
+msgstr "Lokacije"
diff --git a/setup.py b/setup.py
index 91a746f..4267a73 100644
--- a/setup.py
+++ b/setup.py
@@ -21,7 +21,8 @@ major_version, minor_version, _ = info.get('version', '0.0.1').split('.', 2)
 major_version = int(major_version)
 minor_version = int(minor_version)
 
-requires = ['vobject >= 0.8.0', 'PyWebDAV >= 0.9.8', 'python-dateutil', 'pytz']
+requires = ['vobject >= 0.8.0', 'PyWebDAV >= 0.9.8', 'python-dateutil', 'pytz',
+    'python-sql']
 for dep in info.get('depends', []):
     if not re.match(r'(ir|res|webdav)(\W|$)', dep):
         requires.append('trytond_%s >= %s.%s, < %s.%s' %
@@ -64,6 +65,7 @@ setup(name='trytond_calendar',
         'Natural Language :: French',
         'Natural Language :: German',
         'Natural Language :: Russian',
+        'Natural Language :: Slovenian',
         'Natural Language :: Spanish',
         'Operating System :: OS Independent',
         'Programming Language :: Python :: 2.6',
diff --git a/tests/__init__.py b/tests/__init__.py
index 40ec561..84d6a76 100644
--- a/tests/__init__.py
+++ b/tests/__init__.py
@@ -2,3 +2,5 @@
 #this repository contains the full copyright notices and license terms.
 
 from .test_calendar import suite
+
+__all__ = ['suite']
diff --git a/tryton.cfg b/tryton.cfg
index c27871a..6b62a9f 100644
--- a/tryton.cfg
+++ b/tryton.cfg
@@ -1,5 +1,5 @@
 [tryton]
-version=2.8.0
+version=3.0.0
 depends:
     ir
     res
diff --git a/trytond_calendar.egg-info/PKG-INFO b/trytond_calendar.egg-info/PKG-INFO
index 741485f..4345681 100644
--- a/trytond_calendar.egg-info/PKG-INFO
+++ b/trytond_calendar.egg-info/PKG-INFO
@@ -1,12 +1,12 @@
 Metadata-Version: 1.1
 Name: trytond-calendar
-Version: 2.8.0
+Version: 3.0.0
 Summary: Tryton module for CalDAV
 Home-page: http://www.tryton.org/
 Author: Tryton
 Author-email: UNKNOWN
 License: GPL-3
-Download-URL: http://downloads.tryton.org/2.8/
+Download-URL: http://downloads.tryton.org/3.0/
 Description: trytond_calendar
         ================
         
@@ -61,6 +61,7 @@ Classifier: Natural Language :: English
 Classifier: Natural Language :: French
 Classifier: Natural Language :: German
 Classifier: Natural Language :: Russian
+Classifier: Natural Language :: Slovenian
 Classifier: Natural Language :: Spanish
 Classifier: Operating System :: OS Independent
 Classifier: Programming Language :: Python :: 2.6
diff --git a/trytond_calendar.egg-info/SOURCES.txt b/trytond_calendar.egg-info/SOURCES.txt
index a44e6d3..6fc119c 100644
--- a/trytond_calendar.egg-info/SOURCES.txt
+++ b/trytond_calendar.egg-info/SOURCES.txt
@@ -25,6 +25,7 @@ locale/es_ES.po
 locale/fr_FR.po
 locale/nl_NL.po
 locale/ru_RU.po
+locale/sl_SI.po
 trytond_calendar.egg-info/PKG-INFO
 trytond_calendar.egg-info/SOURCES.txt
 trytond_calendar.egg-info/dependency_links.txt
diff --git a/trytond_calendar.egg-info/requires.txt b/trytond_calendar.egg-info/requires.txt
index 823ce06..67ab9f8 100644
--- a/trytond_calendar.egg-info/requires.txt
+++ b/trytond_calendar.egg-info/requires.txt
@@ -2,7 +2,8 @@ vobject >= 0.8.0
 PyWebDAV >= 0.9.8
 python-dateutil
 pytz
-trytond >= 2.8, < 2.9
+python-sql
+trytond >= 3.0, < 3.1
 
 [test]
 caldav
\ No newline at end of file
diff --git a/webdav.py b/webdav.py
index ea6f3e7..cc99d87 100644
--- a/webdav.py
+++ b/webdav.py
@@ -2,6 +2,10 @@
 #this repository contains the full copyright notices and license terms.
 import vobject
 import urllib
+from sql.functions import Extract
+from sql.conditionals import Coalesce
+from sql.aggregate import Max
+
 from pywebdav.lib.errors import DAV_NotFound, DAV_Forbidden
 from trytond.tools import reduce_ids
 from trytond.cache import Cache
@@ -262,6 +266,8 @@ class Collection:
     def get_creationdate(cls, uri, cache=None):
         Calendar = Pool().get('calendar.calendar')
         Event = Pool().get('calendar.event')
+        calendar = Calendar.__table__()
+        event = Event.__table__()
 
         calendar_id = cls.calendar(uri)
         if not calendar_id:
@@ -284,11 +290,10 @@ class Collection:
                 cursor = Transaction().cursor
                 for i in range(0, len(ids), cursor.IN_MAX):
                     sub_ids = ids[i:i + cursor.IN_MAX]
-                    red_sql, red_ids = reduce_ids('id', sub_ids)
-                    cursor.execute('SELECT id, '
-                            'EXTRACT(epoch FROM create_date) '
-                        'FROM "' + Calendar._table + '" '
-                        'WHERE ' + red_sql, red_ids)
+                    red_sql = reduce_ids(calendar.id, sub_ids)
+                    cursor.execute(*calendar.select(calendar.id,
+                            Extract('EPOCH', calendar.create_date),
+                            where=red_sql))
                     for calendar_id2, date in cursor.fetchall():
                         if calendar_id2 == calendar_id:
                             res = date
@@ -318,11 +323,10 @@ class Collection:
                     cursor = Transaction().cursor
                     for i in range(0, len(ids), cursor.IN_MAX):
                         sub_ids = ids[i:i + cursor.IN_MAX]
-                        red_sql, red_ids = reduce_ids('id', sub_ids)
-                        cursor.execute('SELECT id, '
-                                'EXTRACT(epoch FROM create_date) '
-                            'FROM "' + Event._table + '" '
-                            'WHERE ' + red_sql, red_ids)
+                        red_sql = reduce_ids(event.id, sub_ids)
+                        cursor.execute(*event.select(event.id,
+                                Extract('EPOCH', event.create_date),
+                                where=red_sql))
                         for event_id2, date in cursor.fetchall():
                             if event_id2 == event_id:
                                 res = date
@@ -340,6 +344,8 @@ class Collection:
         pool = Pool()
         Calendar = pool.get('calendar.calendar')
         Event = pool.get('calendar.event')
+        calendar = Calendar.__table__()
+        event = Event.__table__()
 
         cursor = Transaction().cursor
         calendar_id = cls.calendar(uri)
@@ -360,12 +366,11 @@ class Collection:
                 res = None
                 for i in range(0, len(ids), cursor.IN_MAX):
                     sub_ids = ids[i:i + cursor.IN_MAX]
-                    red_sql, red_ids = reduce_ids('id', sub_ids)
-                    cursor.execute('SELECT id, '
-                            'EXTRACT(epoch FROM '
-                                'COALESCE(write_date, create_date)) '
-                        'FROM "' + Calendar._table + '" '
-                        'WHERE ' + red_sql, red_ids)
+                    red_sql = reduce_ids(calendar.id, sub_ids)
+                    cursor.execute(*calendar.select(calendar.id,
+                            Extract('EPOCH', Coalesce(calendar.write_date,
+                                    calendar.create_date)),
+                            where=red_sql))
                     for calendar_id2, date in cursor.fetchall():
                         if calendar_id2 == calendar_id:
                             res = date
@@ -394,17 +399,14 @@ class Collection:
                     res = None
                     for i in range(0, len(ids), cursor.IN_MAX / 2):
                         sub_ids = ids[i:i + cursor.IN_MAX / 2]
-                        red_id_sql, red_id_ids = reduce_ids('id', sub_ids)
-                        red_parent_sql, red_parent_ids = reduce_ids('parent',
-                                sub_ids)
-                        cursor.execute('SELECT COALESCE(parent, id), '
-                                'MAX(EXTRACT(epoch FROM '
-                                'COALESCE(write_date, create_date))) '
-                            'FROM "' + Event._table + '" '
-                            'WHERE ' + red_id_sql + ' '
-                                'OR ' + red_parent_sql + ' '
-                            'GROUP BY parent, id',
-                            red_id_ids + red_parent_ids)
+                        red_id_sql = reduce_ids(event.id, sub_ids)
+                        red_parent_sql = reduce_ids(event.parent, sub_ids)
+                        cursor.execute(*event.select(
+                                Coalesce(event.parent, event.id),
+                                Max(Extract('EPOCH', Coalesce(event.write_date,
+                                            event.create_date))),
+                                where=red_id_sql | red_parent_sql,
+                                group_by=(event.parent, event.id)))
                         for event_id2, date in cursor.fetchall():
                             if event_id2 == event_id:
                                 res = date
@@ -432,12 +434,12 @@ class Collection:
             res = None
             for i in range(0, len(ids), cursor.IN_MAX):
                 sub_ids = ids[i:i + cursor.IN_MAX]
-                red_sql, red_ids = reduce_ids('calendar', sub_ids)
-                cursor.execute('SELECT calendar, MAX(EXTRACT(epoch FROM '
-                        'COALESCE(write_date, create_date))) '
-                    'FROM "' + Event._table + '" '
-                    'WHERE ' + red_sql + ' '
-                    'GROUP BY calendar', red_ids)
+                red_sql = reduce_ids(event.calendar, sub_ids)
+                cursor.execute(*event.select(event.calendar,
+                        Max(Extract('EPOCH', Coalesce(event.write_date,
+                                    event.create_date))),
+                        where=red_sql,
+                        group_by=event.calendar))
                 for calendar_id2, date in cursor.fetchall():
                     if calendar_id2 == calendar_ics_id:
                         res = date
commit b355b7d614f21b74938630bb9078fb4b019ce7af
Author: Mathias Behrle <mathiasb at m9s.biz>
Date:   Thu May 2 00:35:26 2013 +0200

    Adding upstream version 2.8.0.

diff --git a/CHANGELOG b/CHANGELOG
index ce8b818..434be38 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,4 +1,4 @@
-Version 2.6.1 - 2012-12-23
+Version 2.8.0 - 2013-04-22
 * Bug fixes (see mercurial logs for details)
 
 Version 2.6.0 - 2012-10-22
diff --git a/COPYRIGHT b/COPYRIGHT
index 8ad4b79..a005001 100644
--- a/COPYRIGHT
+++ b/COPYRIGHT
@@ -1,6 +1,6 @@
-Copyright (C) 2009-2012 Cédric Krier.
-Copyright (C) 2009-2012 Bertrand Chenal.
-Copyright (C) 2009-2012 B2CK SPRL.
+Copyright (C) 2009-2013 Cédric Krier.
+Copyright (C) 2009-2013 Bertrand Chenal.
+Copyright (C) 2009-2013 B2CK SPRL.
 
 This program is free software: you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
diff --git a/MANIFEST.in b/MANIFEST.in
index 44969c7..18ce53c 100644
--- a/MANIFEST.in
+++ b/MANIFEST.in
@@ -6,5 +6,6 @@ include CHANGELOG
 include LICENSE
 include tryton.cfg
 include *.xml
+include view/*.xml
 include *.odt
 include locale/*.po
diff --git a/PKG-INFO b/PKG-INFO
index 37e5095..d0ce93a 100644
--- a/PKG-INFO
+++ b/PKG-INFO
@@ -1,12 +1,12 @@
 Metadata-Version: 1.1
 Name: trytond_calendar
-Version: 2.6.1
+Version: 2.8.0
 Summary: Tryton module for CalDAV
 Home-page: http://www.tryton.org/
 Author: Tryton
 Author-email: UNKNOWN
 License: GPL-3
-Download-URL: http://downloads.tryton.org/2.6/
+Download-URL: http://downloads.tryton.org/2.8/
 Description: trytond_calendar
         ================
         
@@ -54,6 +54,7 @@ Classifier: Intended Audience :: Legal Industry
 Classifier: Intended Audience :: Manufacturing
 Classifier: License :: OSI Approved :: GNU General Public License (GPL)
 Classifier: Natural Language :: Bulgarian
+Classifier: Natural Language :: Catalan
 Classifier: Natural Language :: Czech
 Classifier: Natural Language :: Dutch
 Classifier: Natural Language :: English
diff --git a/__init__.py b/__init__.py
index 81a621a..caf0820 100644
--- a/__init__.py
+++ b/__init__.py
@@ -18,14 +18,10 @@ def register():
         Location,
         Event,
         EventCategory,
-        Alarm,
         EventAlarm,
-        Attendee,
         EventAttendee,
-        Date,
         EventRDate,
         EventExDate,
-        RRule,
         EventRRule,
         EventExRule,
         User,
diff --git a/caldav.py b/caldav.py
index ae205be..a5fd3b1 100644
--- a/caldav.py
+++ b/caldav.py
@@ -38,7 +38,7 @@ def mk_prop_response(self, uri, good_props, bad_props, doc):
     if not parent_uri:
         return res
     dbname, parent_uri = TrytonDAVInterface.get_dburi(parent_uri)
-    if  parent_uri in ('Calendars', 'Calendars/'):
+    if parent_uri in ('Calendars', 'Calendars/'):
         ad = doc.createElement('calendar')
         ad.setAttribute('xmlns', 'urn:ietf:params:xml:ns:caldav')
         #Disable groupdav attribute for iPhone
@@ -295,7 +295,8 @@ def do_POST(self):
 
         try:
             DATA = '%s\n' % dc._get_caldav_post(uri, body, ct)
-        except DAV_Error, (ec, dd):
+        except DAV_Error, exception:
+            ec, _ = exception
             return self.send_status(ec)
         self.send_body_chunks(DATA, '200', 'OK', 'OK')
         return
diff --git a/calendar.xml b/calendar.xml
index 3294b35..535bd17 100644
--- a/calendar.xml
+++ b/calendar.xml
@@ -23,38 +23,12 @@ this repository contains the full copyright notices and license terms. -->
         <record model="ir.ui.view" id="calendar_view_tree">
             <field name="model">calendar.calendar</field>
             <field name="type">tree</field>
-            <field name="arch" type="xml">
-                <![CDATA[
-                <tree string="Calendars">
-                    <field name="name"/>
-                    <field name="owner"/>
-                </tree>
-                ]]>
-            </field>
+            <field name="name">calendar_tree</field>
         </record>
         <record model="ir.ui.view" id="calendar_view_form">
             <field name="model">calendar.calendar</field>
             <field name="type">form</field>
-            <field name="arch" type="xml">
-                <![CDATA[
-                <form string="Calendar">
-                    <label name="name"/>
-                    <field name="name"/>
-                    <label name="owner"/>
-                    <field name="owner"/>
-                    <notebook colspan="4">
-                        <page string="General" id="general">
-                            <separator name="description" colspan="4"/>
-                            <field name="description" colspan="4"/>
-                        </page>
-                        <page string="Security" id="security">
-                            <field name="read_users" colspan="4"/>
-                            <field name="write_users" colspan="4"/>
-                        </page>
-                    </notebook>
-                </form>
-                ]]>
-            </field>
+            <field name="name">calendar_form</field>
         </record>
         <record model="ir.action.act_window" id="act_calendar_form">
             <field name="name">Calendars</field>
@@ -83,15 +57,11 @@ this repository contains the full copyright notices and license terms. -->
             <field name="perm_delete" eval="False"/>
         </record>
         <record model="ir.rule" id="rule_group_read_calendar_line1">
-            <field name="field" search="[('name', '=', 'calendar_owner'), ('model.model', '=', 'calendar.event')]"/>
-            <field name="operator">=</field>
-            <field name="operand">User</field>
+            <field name="domain">[('calendar_owner', '=', user.id)]</field>
             <field name="rule_group" ref="rule_group_read_calendar"/>
         </record>
         <record model="ir.rule" id="rule_group_read_calendar_line2">
-            <field name="field" search="[('name', '=', 'calendar_read_users'), ('model.model', '=', 'calendar.event')]"/>
-            <field name="operator">=</field>
-            <field name="operand">User</field>
+            <field name="domain">[('calendar_read_users', '=', user.id)]</field>
             <field name="rule_group" ref="rule_group_read_calendar"/>
         </record>
 
@@ -105,157 +75,56 @@ this repository contains the full copyright notices and license terms. -->
             <field name="perm_delete" eval="True"/>
         </record>
         <record model="ir.rule" id="rule_group_write_calendar_line1">
-            <field name="field" search="[('name', '=', 'calendar_owner'), ('model.model', '=', 'calendar.event')]"/>
-            <field name="operator">=</field>
-            <field name="operand">User</field>
+            <field name="domain">[('calendar_owner', '=', user.id)]</field>
             <field name="rule_group" ref="rule_group_write_calendar"/>
         </record>
         <record model="ir.rule" id="rule_group_write_calendar_line2">
-            <field name="field" search="[('name', '=', 'calendar_write_users'), ('model.model', '=', 'calendar.event')]"/>
-            <field name="operator">=</field>
-            <field name="operand">User</field>
+            <field name="domain">[('calendar_write_users', '=', user.id)]</field>
             <field name="rule_group" ref="rule_group_write_calendar"/>
         </record>
 
         <record model="ir.ui.view" id="category_view_tree">
             <field name="model">calendar.category</field>
             <field name="type">tree</field>
-            <field name="arch" type="xml">
-                <![CDATA[
-                <tree string="Categories">
-                    <field name="name"/>
-                </tree>
-                ]]>
-            </field>
+            <field name="name">category_tree</field>
         </record>
 
         <record model="ir.ui.view" id="category_view_form">
             <field name="model">calendar.category</field>
             <field name="type">form</field>
-            <field name="arch" type="xml">
-                <![CDATA[
-                <form string="Category">
-                    <label name="name"/>
-                    <field name="name"/>
-                </form>
-                ]]>
-            </field>
+            <field name="name">category_form</field>
         </record>
 
         <record model="ir.ui.view" id="location_view_tree">
             <field name="model">calendar.location</field>
             <field name="type">tree</field>
-            <field name="arch" type="xml">
-                <![CDATA[
-                <tree string="Locations">
-                    <field name="name"/>
-                </tree>
-                ]]>
-            </field>
+            <field name="name">location_tree</field>
         </record>
 
         <record model="ir.ui.view" id="location_view_form">
             <field name="model">calendar.location</field>
             <field name="type">form</field>
-            <field name="arch" type="xml">
-                <![CDATA[
-                <form string="Location">
-                    <label name="name"/>
-                    <field name="name"/>
-                </form>
-                ]]>
-            </field>
+            <field name="name">location_form</field>
         </record>
 
         <record model="ir.ui.view" id="event_view_tree">
             <field name="model">calendar.event</field>
             <field name="type">tree</field>
             <field name="priority" eval="10"/>
-            <field name="arch" type="xml">
-                <![CDATA[
-                <tree string="Events">
-                    <field name="calendar"/>
-                    <field name="summary"/>
-                    <field name="all_day"/>
-                    <field name="dtstart"/>
-                    <field name="dtend"/>
-                    <field name="status"/>
-                </tree>
-                ]]>
-            </field>
+            <field name="name">event_tree</field>
         </record>
 
-        <record model="ir.ui.view" id="event_vieww_tree_occurence">
+        <record model="ir.ui.view" id="event_view_tree_occurence">
             <field name="model">calendar.event</field>
             <field name="type">tree</field>
             <field name="priority" eval="20"/>
-            <field name="arch" type="xml">
-                <![CDATA[
-                <tree string="Events">
-                    <field name="summary"/>
-                    <field name="recurrence"/>
-                    <field name="all_day"/>
-                    <field name="dtstart"/>
-                    <field name="dtend"/>
-                    <field name="status"/>
-                </tree>
-                ]]>
-            </field>
+            <field name="name">event_tree_occurence</field>
         </record>
 
         <record model="ir.ui.view" id="event_view_form">
             <field name="model">calendar.event</field>
             <field name="type">form</field>
-            <field name="arch" type="xml">
-                <![CDATA[
-                <form string="Event">
-                    <label name="summary"/>
-                    <field name="summary"/>
-                    <label name="recurrence"/>
-                    <field name="recurrence"/>
-                    <notebook colspan="4">
-                        <page string="General" id="general">
-                            <label name="location"/>
-                            <field name="location"/>
-                            <label name="status"/>
-                            <field name="status"/>
-                            <label name="classification"/>
-                            <field name="classification"/>
-                            <label name="calendar"/>
-                            <field name="calendar"/>
-                            <label name="all_day"/>
-                            <field name="all_day"/>
-                            <label name="transp"/>
-                            <field name="transp"/>
-                            <label name="dtstart"/>
-                            <field name="dtstart"/>
-                            <label name="dtend"/>
-                            <field name="dtend"/>
-                            <separator name="description" colspan="4"/>
-                            <field name="description" colspan="4"/>
-                        </page>
-                        <page string="Categories" id="categories">
-                            <field name="categories" colspan="4"/>
-                        </page>
-                        <page string="Attendees" id="attendees">
-                            <label name="organizer"/>
-                            <field name="organizer"/>
-                            <field name="attendees" colspan="4"/>
-                        </page>
-                        <page string="Occurences" id="occurences"
-                            states="{'invisible': Bool(Eval('_parent_parent'))}">
-                            <field name="rrules" colspan="2"/>
-                            <field name="rdates" colspan="2"/>
-                            <field name="exrules" colspan="2"/>
-                            <field name="exdates" colspan="2"/>
-                            <field name="occurences" colspan="4"
-                                view_ids="calendar.event_vieww_tree_occurence"/>
-                        </page>
-                    </notebook>
-                    <field name="parent" colspan="4" invisible="1"/>
-                </form>
-                ]]>
-            </field>
+            <field name="name">event_form</field>
         </record>
 
         <record model="ir.action.act_window" id="act_event_form">
@@ -301,208 +170,62 @@ this repository contains the full copyright notices and license terms. -->
         <record model="ir.ui.view" id="attendee_view_tree">
             <field name="model">calendar.event.attendee</field>
             <field name="type">tree</field>
-            <field name="arch" type="xml">
-                <![CDATA[
-                <tree string="Attendees">
-                    <field name="event"/>
-                    <field name="email"/>
-                    <field name="status"/>
-                </tree>
-                ]]>
-            </field>
+            <field name="name">attendee_tree</field>
         </record>
 
         <record model="ir.ui.view" id="attendee_view_form">
             <field name="model">calendar.event.attendee</field>
             <field name="type">form</field>
-            <field name="arch" type="xml">
-                <![CDATA[
-                <form string="Attendee">
-                    <label name="event"/>
-                    <field name="event" colspan="3"/>
-                    <label name="email"/>
-                    <field name="email"/>
-                    <label name="status"/>
-                    <field name="status"/>
-                </form>
-                ]]>
-            </field>
+            <field name="name">attendee_form</field>
         </record>
 
         <record model="ir.ui.view" id="rdate_view_tree">
             <field name="model">calendar.event.rdate</field>
             <field name="type">tree</field>
-            <field name="arch" type="xml">
-                <![CDATA[
-                <tree string="Recurrence Dates">
-                    <field name="event"/>
-                    <field name="datetime"/>
-                    <field name="date"/>
-                </tree>
-                ]]>
-            </field>
+            <field name="name">rdate_tree</field>
         </record>
 
         <record model="ir.ui.view" id="rdate_view_form">
             <field name="model">calendar.event.rdate</field>
             <field name="type">form</field>
-            <field name="arch" type="xml">
-                <![CDATA[
-                <form string="Recurrence Date">
-                    <label name="event"/>
-                    <field name="event" colspan="3"/>
-                    <label name="datetime"/>
-                    <field name="datetime"/>
-                    <label name="date"/>
-                    <field name="date"/>
-                </form>
-                ]]>
-            </field>
+            <field name="name">rdate_form</field>
         </record>
 
         <record model="ir.ui.view" id="exdate_view_tree">
             <field name="model">calendar.event.exdate</field>
             <field name="type">tree</field>
-            <field name="arch" type="xml">
-                <![CDATA[
-                <tree string="Exception Dates">
-                    <field name="event"/>
-                    <field name="datetime"/>
-                    <field name="date"/>
-                </tree>
-                ]]>
-            </field>
+            <field name="name">exdate_tree</field>
         </record>
 
         <record model="ir.ui.view" id="exdate_view_form">
             <field name="model">calendar.event.exdate</field>
             <field name="type">form</field>
-            <field name="arch" type="xml">
-                <![CDATA[
-                <form string="Exception Date">
-                    <label name="event"/>
-                    <field name="event" colspan="3"/>
-                    <label name="datetime"/>
-                    <field name="datetime"/>
-                    <label name="date"/>
-                    <field name="date"/>
-                </form>
-                ]]>
-            </field>
+            <field name="name">exdate_form</field>
         </record>
 
         <record model="ir.ui.view" id="rrule_view_tree">
             <field name="model">calendar.event.rrule</field>
             <field name="type">tree</field>
-            <field name="arch" type="xml">
-                <![CDATA[
-                <tree string="Recurrence Rules">
-                    <field name="event"/>
-                    <field name="freq"/>
-                </tree>
-                ]]>
-            </field>
+            <field name="name">rrule_tree</field>
         </record>
 
         <record model="ir.ui.view" id="rrule_view_form">
             <field name="model">calendar.event.rrule</field>
             <field name="type">form</field>
-            <field name="arch" type="xml">
-                <![CDATA[
-                <form string="Recurrence Rule">
-                    <label name="event"/>
-                    <field name="event" colspan="3"/>
-                    <label name="freq"/>
-                    <field name="freq" colspan="3"/>
-                    <label name="until"/>
-                    <field name="until"/>
-                    <label name="until_date"/>
-                    <field name="until_date"/>
-                    <label name="count"/>
-                    <field name="count" colspan="3"/>
-                    <label name="interval"/>
-                    <field name="interval" colspan="3"/>
-                    <label name="bysecond"/>
-                    <field name="bysecond" colspan="3"/>
-                    <label name="byminute"/>
-                    <field name="byminute" colspan="3"/>
-                    <label name="byhour"/>
-                    <field name="byhour" colspan="3"/>
-                    <label name="byday"/>
-                    <field name="byday" colspan="3"/>
-                    <label name="bymonthday"/>
-                    <field name="bymonthday" colspan="3"/>
-                    <label name="byyearday"/>
-                    <field name="byyearday" colspan="3"/>
-                    <label name="byweekno"/>
-                    <field name="byweekno" colspan="3"/>
-                    <label name="bymonth"/>
-                    <field name="bymonth" colspan="3"/>
-                    <label name="bysetpos"/>
-                    <field name="bysetpos" colspan="3"/>
-                    <label name="wkst"/>
-                    <field name="wkst" colspan="3"/>
-                </form>
-                ]]>
-            </field>
+            <field name="name">rrule_form</field>
         </record>
 
         <record model="ir.ui.view" id="exrule_view_tree">
             <field name="model">calendar.event.exrule</field>
             <field name="type">tree</field>
-            <field name="arch" type="xml">
-                <![CDATA[
-                <tree string="Exception Rules">
-                    <field name="event"/>
-                    <field name="freq"/>
-                </tree>
-                ]]>
-            </field>
+            <field name="name">exrule_tree</field>
         </record>
 
         <record model="ir.ui.view" id="exrule_view_form">
             <field name="model">calendar.event.exrule</field>
             <field name="type">form</field>
-            <field name="arch" type="xml">
-                <![CDATA[
-                <form string="Exception Rule">
-                    <label name="event"/>
-                    <field name="event" colspan="3"/>
-                    <label name="freq"/>
-                    <field name="freq" colspan="3"/>
-                    <label name="until"/>
-                    <field name="until"/>
-                    <label name="until_date"/>
-                    <field name="until_date"/>
-                    <label name="count"/>
-                    <field name="count" colspan="3"/>
-                    <label name="interval"/>
-                    <field name="interval" colspan="3"/>
-                    <label name="bysecond"/>
-                    <field name="bysecond" colspan="3"/>
-                    <label name="byminute"/>
-                    <field name="byminute" colspan="3"/>
-                    <label name="byhour"/>
-                    <field name="byhour" colspan="3"/>
-                    <label name="byday"/>
-                    <field name="byday" colspan="3"/>
-                    <label name="bymonthday"/>
-                    <field name="bymonthday" colspan="3"/>
-                    <label name="byyearday"/>
-                    <field name="byyearday" colspan="3"/>
-                    <label name="byweekno"/>
-                    <field name="byweekno" colspan="3"/>
-                    <label name="bymonth"/>
-                    <field name="bymonth" colspan="3"/>
-                    <label name="bysetpos"/>
-                    <field name="bysetpos" colspan="3"/>
-                    <label name="wkst"/>
-                    <field name="wkst" colspan="3"/>
-                </form>
-                ]]>
-            </field>
+            <field name="name">exrule_form</field>
         </record>
 
-
     </data>
 </tryton>
diff --git a/calendar_.py b/calendar_.py
index 1e63623..4a9c2d3 100644
--- a/calendar_.py
+++ b/calendar_.py
@@ -6,7 +6,7 @@ import dateutil.tz
 import pytz
 import datetime
 import xml.dom.minidom
-from trytond.model import ModelSQL, ModelView, fields
+from trytond.model import Model, ModelSQL, ModelView, fields
 from trytond.tools import reduce_ids
 from trytond.backend import TableHandler
 from trytond.pyson import If, Bool, Eval
@@ -15,8 +15,8 @@ from trytond.cache import Cache
 from trytond.pool import Pool
 
 __all__ = ['Calendar', 'ReadUser', 'WriteUser', 'Category', 'Location',
-    'Event', 'EventCategory', 'Alarm', 'EventAlarm', 'Attendee',
-    'EventAttendee', 'Date', 'EventRDate', 'EventExDate', 'RRule',
+    'Event', 'EventCategory', 'AlarmMixin', 'EventAlarm', 'AttendeeMixin',
+    'EventAttendee', 'DateMixin', 'EventRDate', 'EventExDate', 'RRuleMixin',
     'EventRRule', 'EventExRule']
 
 tzlocal = dateutil.tz.tzlocal()
@@ -43,21 +43,21 @@ class Calendar(ModelSQL, ModelView):
         super(Calendar, cls).__setup__()
         cls._sql_constraints = [
             ('name_uniq', 'UNIQUE(name)',
-                'The name of calendar must be unique!'),
+                'The name of calendar must be unique.'),
             ('owner_uniq', 'UNIQUE(owner)',
-                'A user can have only one calendar!'),
+                'A user can have only one calendar.'),
             ]
         cls._order.insert(0, ('name', 'ASC'))
-        cls._constraints += [
-            ('check_name', 'Calendar name can not end with .ics'),
-            ]
+        cls._error_messages.update({
+                'invalid_name': 'Calendar name "%s" can not end with .ics',
+                })
 
     @classmethod
-    def create(cls, vals):
-        calendar = super(Calendar, cls).create(vals)
+    def create(cls, vlist):
+        calendars = super(Calendar, cls).create(vlist)
         # Restart the cache for get_name
         cls._get_name_cache.clear()
-        return calendar
+        return calendars
 
     @classmethod
     def write(cls, calendars, vals):
@@ -71,13 +71,18 @@ class Calendar(ModelSQL, ModelView):
         # Restart the cache for calendar
         cls._get_name_cache.clear()
 
+    @classmethod
+    def validate(cls, calendars):
+        super(Calendar, cls).validate(calendars)
+        for calendar in calendars:
+            calendar.check_name()
+
     def check_name(self):
         '''
         Check the name doesn't end with .ics
         '''
         if self.name.endswith('.ics'):
-            return False
-        return True
+            self.raise_user_error('invalid_name', (self.name,))
 
     @classmethod
     def get_name(cls, name):
@@ -146,13 +151,13 @@ class Calendar(ModelSQL, ModelView):
         if not isinstance(dtstart, datetime.datetime):
             ical.vfreebusy.add('dtstart').value = dtstart
             dtstart = datetime.datetime.combine(dtstart, datetime.time())\
-                    .replace(tzinfo=tzlocal)
+                .replace(tzinfo=tzlocal)
         else:
             ical.vfreebusy.add('dtstart').value = dtstart.astimezone(tzutc)
         if not isinstance(dtend, datetime.datetime):
             ical.vfreebusy.add('dtend').value = dtend
             dtend = datetime.datetime.combine(dtend, datetime.time.max)\
-                    .replace(tzinfo=tzlocal)
+                .replace(tzinfo=tzlocal)
         else:
             ical.vfreebusy.add('dtend').value = dtend.astimezone(tzutc)
 
@@ -218,8 +223,8 @@ class Calendar(ModelSQL, ModelView):
                         freebusy_dtend = freebusy_dtstart
                     else:
                         freebusy_dtend = event.dtend.replace(tzinfo=tzlocal)\
-                                - event.dtstart.replace(tzinfo=tzlocal) \
-                                + freebusy_dtstart
+                            - event.dtstart.replace(tzinfo=tzlocal) \
+                            + freebusy_dtstart
                     f_dtstart_tz = freebusy_dtstart.replace(tzinfo=tzlocal)
                     f_dtend_tz = freebusy_dtend.replace(tzinfo=tzlocal)
                     if not ((f_dtstart_tz <= dtstart
@@ -238,7 +243,7 @@ class Calendar(ModelSQL, ModelView):
                                 occurence.dtstart.replace(tzinfo=tzlocal)
                             if occurence.dtend:
                                 freebusy_dtend = occurence.dtend\
-                                        .replace(tzinfo=tzlocal)
+                                    .replace(tzinfo=tzlocal)
                             else:
                                 freebusy_dtend = freebusy_dtstart
                             all_day = occurence.all_day
@@ -320,11 +325,11 @@ class Calendar(ModelSQL, ModelView):
                 if calendars:
                     vfreebusy = cls.freebusy(calendars[0].id, dtstart, dtend)
                     vfreebusy.vfreebusy.add('dtstamp').value = \
-                            ical.vfreebusy.dtstamp.value
+                        ical.vfreebusy.dtstamp.value
                     vfreebusy.vfreebusy.add('uid').value = \
-                            ical.vfreebusy.uid.value
+                        ical.vfreebusy.uid.value
                     vfreebusy.vfreebusy.add('organizer').value = \
-                            ical.vfreebusy.organizer.value
+                        ical.vfreebusy.organizer.value
                     vfreebusy.vfreebusy.add('attendee').value = attendee.value
 
                 status = doc.createElement('C:request-status')
@@ -368,7 +373,7 @@ class Category(ModelSQL, ModelView):
         super(Category, cls).__setup__()
         cls._sql_constraints = [
             ('name_uniq', 'UNIQUE(name)',
-                'The name of calendar category must be unique!'),
+                'The name of calendar category must be unique.'),
             ]
         cls._order.insert(0, ('name', 'ASC'))
 
@@ -383,7 +388,7 @@ class Location(ModelSQL, ModelView):
         super(Location, cls).__setup__()
         cls._sql_constraints = [
             ('name_uniq', 'UNIQUE(name)',
-                'The name of calendar location must be unique!'),
+                'The name of calendar location must be unique.'),
             ]
         cls._order.insert(0, ('name', 'ASC'))
 
@@ -479,13 +484,10 @@ class Event(ModelSQL, ModelView):
         super(Event, cls).__setup__()
         cls._sql_constraints = [
             ('uuid_recurrence_uniq', 'UNIQUE(uuid, calendar, recurrence)',
-                'UUID and recurrence must be unique in a calendar!'),
-            ]
-        cls._constraints += [
-            ('check_recurrence', 'invalid_recurrence'),
+                'UUID and recurrence must be unique in a calendar.'),
             ]
         cls._error_messages.update({
-                'invalid_recurrence': 'Recurrence can not be recurrent!',
+                'invalid_recurrence': 'Recurrence "%s" can not be recurrent.',
                 })
 
     @classmethod
@@ -497,7 +499,6 @@ class Event(ModelSQL, ModelView):
             models_data = ModelData.search([
                     ('fs_id', '=', 'rule_group_read_calendar_line3'),
                     ('module', '=', module_name),
-                    ('inherit', '=', None),
                     ], limit=1)
             if models_data:
                 model_data, = models_data
@@ -543,6 +544,12 @@ class Event(ModelSQL, ModelView):
     def search_calendar_field(cls, name, clause):
         return [('calendar.' + name[9:],) + tuple(clause[1:])]
 
+    @classmethod
+    def validate(cls, events):
+        super(Event, cls).validate(events)
+        for event in events:
+            event.check_recurrence()
+
     def check_recurrence(self):
         '''
         Check the recurrence is not recurrent.
@@ -553,64 +560,64 @@ class Event(ModelSQL, ModelView):
                     or self.exdates \
                     or self.exrules \
                     or self.occurences:
-                return False
-        return True
+                self.raise_user_error('invalid_recurrence', (self.rec_name,))
 
     @classmethod
-    def create(cls, values):
+    def create(cls, vlist):
         pool = Pool()
         Calendar = pool.get('calendar.calendar')
         Collection = pool.get('webdav.collection')
 
-        event = super(Event, cls).create(values)
-        if (event.calendar.owner
-                and (event.organizer == event.calendar.owner.email
-                    or (event.parent
-                        and event.parent.organizer == \
+        events = super(Event, cls).create(vlist)
+        for event in events:
+            if (event.calendar.owner
+                    and (event.organizer == event.calendar.owner.email
+                        or (event.parent
+                            and event.parent.organizer ==
                             event.parent.calendar.owner.email))):
-            if event.organizer == event.calendar.owner.email:
-                attendee_emails = [x.email for x in event.attendees
-                        if x.status != 'declined'
-                        and x.email != event.organizer]
-            else:
-                attendee_emails = [x.email for x in event.parent.attendees
-                        if x.status != 'declined'
-                        and x.email != event.parent.organizer]
-            if attendee_emails:
-                with Transaction().set_user(0):
-                    calendars = Calendar.search([
-                            ('owner.email', 'in', attendee_emails),
-                            ])
-                    if not event.recurrence:
-                        for calendar in calendars:
-                            new_event, = cls.copy([event], default={
-                                    'calendar': calendar.id,
-                                    'occurences': None,
-                                    'uuid': event.uuid,
-                                    })
-                            for occurence in event.occurences:
-                                cls.copy([occurence], default={
-                                    'calendar': calendar.id,
-                                    'parent': new_event.id,
-                                    'uuid': occurence.uuid,
-                                    })
-                    else:
-                        parents = cls.search([
-                                ('uuid', '=', event.uuid),
-                                ('calendar.owner.email', 'in',
-                                    attendee_emails),
-                                ('id', '!=', event.id),
-                                ('recurrence', '=', None),
+                if event.organizer == event.calendar.owner.email:
+                    attendee_emails = [x.email for x in event.attendees
+                            if x.status != 'declined'
+                            and x.email != event.organizer]
+                else:
+                    attendee_emails = [x.email for x in event.parent.attendees
+                            if x.status != 'declined'
+                            and x.email != event.parent.organizer]
+                if attendee_emails:
+                    with Transaction().set_user(0):
+                        calendars = Calendar.search([
+                                ('owner.email', 'in', attendee_emails),
                                 ])
-                        for parent in parents:
-                            cls.copy([event], default={
-                                    'calendar': parent.calendar.id,
-                                    'parent': parent.id,
-                                    'uuid': event.uuid,
-                                    })
+                        if not event.recurrence:
+                            for calendar in calendars:
+                                new_event, = cls.copy([event], default={
+                                        'calendar': calendar.id,
+                                        'occurences': None,
+                                        'uuid': event.uuid,
+                                        })
+                                for occurence in event.occurences:
+                                    cls.copy([occurence], default={
+                                        'calendar': calendar.id,
+                                        'parent': new_event.id,
+                                        'uuid': occurence.uuid,
+                                        })
+                        else:
+                            parents = cls.search([
+                                    ('uuid', '=', event.uuid),
+                                    ('calendar.owner.email', 'in',
+                                        attendee_emails),
+                                    ('id', '!=', event.id),
+                                    ('recurrence', '=', None),
+                                    ])
+                            for parent in parents:
+                                cls.copy([event], default={
+                                        'calendar': parent.calendar.id,
+                                        'parent': parent.id,
+                                        'uuid': event.uuid,
+                                        })
         # Restart the cache for event
         Collection._event_cache.clear()
-        return event
+        return events
 
     def _event2update(self):
         return {
@@ -622,14 +629,14 @@ class Event(ModelSQL, ModelView):
             'location': self.location.id if self.location else None,
             'status': self.status,
             'organizer': self.organizer,
-            'rdates': [('delete_all',)] + [('create', rdate._date2update())
-                for rdate in self.rdates],
-            'exdates': [('delete_all',)] + [('create', exdate._date2update())
-                for exdate in self.exdates],
-            'rrules': [('delete_all',)] + [('create', rrule._date2update())
-                for rrule in self.rrules],
-            'exrules': [('delete_all',)] + [('create', exrule._date2update())
-                for exrule in self.exrules],
+            'rdates': [('delete_all',)] + ('create', [rdate._date2update()
+                for rdate in self.rdates]),
+            'exdates': [('delete_all',)] + ('create', [exdate._date2update()
+                for exdate in self.exdates]),
+            'rrules': [('delete_all',)] + ('create', [rrule._date2update()
+                for rrule in self.rrules]),
+            'exrules': [('delete_all',)] + ('create', [exrule._date2update()
+                for exrule in self.exrules]),
             }
 
     @classmethod
@@ -655,10 +662,11 @@ class Event(ModelSQL, ModelView):
         if not values:
             return
         for event in events:
-            if event.calendar.owner \
-                    and (event.organizer == event.calendar.owner.email \
-                    or (event.parent \
-                    and event.parent.organizer == event.calendar.owner.email)):
+            if (event.calendar.owner
+                    and (event.organizer == event.calendar.owner.email
+                        or (event.parent
+                            and event.parent.organizer
+                            == event.calendar.owner.email))):
                 if event.organizer == event.calendar.owner.email:
                     attendee_emails = [x.email for x in event.attendees
                             if x.status != 'declined'
@@ -737,10 +745,11 @@ class Event(ModelSQL, ModelView):
         Collection = pool.get('webdav.collection')
 
         for event in events:
-            if event.calendar.owner \
-                    and (event.organizer == event.calendar.owner.email \
-                    or (event.parent \
-                    and event.parent.organizer == event.calendar.owner.email)):
+            if (event.calendar.owner
+                    and (event.organizer == event.calendar.owner.email
+                        or (event.parent
+                            and event.parent.organizer
+                            == event.calendar.owner.email))):
                 if event.organizer == event.calendar.owner.email:
                     attendee_emails = [x.email for x in event.attendees
                             if x.email != event.organizer]
@@ -787,6 +796,7 @@ class Event(ModelSQL, ModelView):
         the event id for write or None for create
         '''
         pool = Pool()
+        Attendee = pool.get('calendar.event.attendee')
         Category = pool.get('calendar.category')
         Location = pool.get('calendar.location')
         Alarm = pool.get('calendar.event.alarm')
@@ -853,7 +863,7 @@ class Event(ModelSQL, ModelView):
             else:
                 if vevent.recurrence_id.value.tzinfo:
                     res['recurrence'] = \
-                            vevent.recurrence_id.value.astimezone(tzlocal)
+                        vevent.recurrence_id.value.astimezone(tzlocal)
                 else:
                     res['recurrence'] = vevent.recurrence_id.value
         else:
@@ -870,11 +880,14 @@ class Event(ModelSQL, ModelView):
             category_names2ids = {}
             for category in categories:
                 category_names2ids[category.name] = category.id
+            to_create = []
             for category in vevent.categories.value:
                 if category not in category_names2ids:
-                    categories.append(Category.create({
-                                'name': category,
-                                }))
+                    to_create.append({
+                            'name': category,
+                            })
+            if to_create:
+                categories += Category.create(to_create)
             res['categories'] = [('set', map(int, categories))]
         else:
             res['categories'] = [('unlink_all',)]
@@ -892,9 +905,9 @@ class Event(ModelSQL, ModelView):
                         ('name', '=', vevent.location.value),
                         ], limit=1)
             if not locations:
-                location = Location.create({
-                        'name': vevent.location.value,
-                        })
+                location, = Location.create([{
+                            'name': vevent.location.value,
+                            }])
             else:
                 location, = locations
             res['location'] = location.id
@@ -922,6 +935,7 @@ class Event(ModelSQL, ModelView):
                 attendees_todel[attendee.email] = attendee.id
         res['attendees'] = []
         if hasattr(vevent, 'attendee'):
+            to_create = []
             while vevent.attendee_list:
                 attendee = vevent.attendee_list.pop()
                 vals = Attendee.attendee2values(attendee)
@@ -930,52 +944,66 @@ class Event(ModelSQL, ModelView):
                         [attendees_todel[vals['email']]], vals))
                     del attendees_todel[vals['email']]
                 else:
-                    res['attendees'].append(('create', vals))
+                    to_create.append(vals)
+            if to_create:
+                res['attendees'].append(('create', to_create))
         res['attendees'].append(('delete', attendees_todel.values()))
 
         res['rdates'] = []
         if event:
             res['rdates'].append(('delete', [x.id for x in event.rdates]))
         if hasattr(vevent, 'rdate'):
+            to_create = []
             while vevent.rdate_list:
                 rdate = vevent.rdate_list.pop()
-                for rdate in rdate.value:
-                    res['rdates'].append(('create', Rdate.date2values(rdate)))
+                to_create += [Rdate.date2values(d) for d in rdate.value]
+            if to_create:
+                res['rdates'].append(('create', to_create))
 
         res['exdates'] = []
         if event:
             res['exdates'].append(('delete', [x.id for x in event.exdates]))
         if hasattr(vevent, 'exdate'):
+            to_create = []
             while vevent.exdate_list:
                 exdate = vevent.exdate_list.pop()
-                for exdate in exdate.value:
-                    res['exdates'].append(('create',
-                            Exdate.date2values(exdate)))
+                to_create += [Exdate.date2values(d) for d in exdate.value]
+            if to_create:
+                res['exdates'].append(('create', to_create))
 
         res['rrules'] = []
         if event:
             res['rrules'].append(('delete', [x.id for x in event.rrules]))
         if hasattr(vevent, 'rrule'):
+            to_create = []
             while vevent.rrule_list:
                 rrule = vevent.rrule_list.pop()
-                res['rrules'].append(('create', Rrule.rule2values(rrule)))
+                to_create.append(Rrule.rule2values(rrule))
+            if to_create:
+                res['rrules'].append(('create', to_create))
 
         res['exrules'] = []
         if event:
             res['exrules'].append(('delete', [x.id for x in event.exrules]))
         if hasattr(vevent, 'exrule'):
+            to_create = []
             while vevent.exrule_list:
                 exrule = vevent.exrule_list.pop()
-                res['exrules'].append(('create', Exrule.rule2values(exrule)))
+                to_create.append(Exrule.rule2values(exrule))
+            if to_create:
+                res['exrules'].append(('create', to_create))
 
         if event:
             res.setdefault('alarms', [])
             res['alarms'].append(('delete', [x.id for x in event.alarms]))
         if hasattr(vevent, 'valarm'):
             res.setdefault('alarms', [])
+            to_create = []
             while vevent.valarm_list:
                 valarm = vevent.valarm_list.pop()
-                res['alarms'].append(('create', Alarm.valarm2values(valarm)))
+                to_create.append(Alarm.valarm2values(valarm))
+            if to_create:
+                res['alarms'].append(('create', to_create))
 
         if hasattr(ical, 'vtimezone'):
             if ical.vtimezone.tzid.value in pytz.common_timezones:
@@ -990,6 +1018,7 @@ class Event(ModelSQL, ModelView):
         occurences_todel = []
         if event:
             occurences_todel = [x.id for x in event.occurences]
+        to_create = []
         for vevent in vevents:
             event_id = None
             vals = cls.ical2values(event_id, ical, calendar_id, vevent=vevent)
@@ -1007,7 +1036,9 @@ class Event(ModelSQL, ModelView):
             if event_id:
                 res['occurences'].append(('write', event_id, vals))
             else:
-                res['occurences'].append(('create', vals))
+                to_create.append(vals)
+        if to_create:
+            res['occurences'].append(('create', to_create))
         if occurences_todel:
             res.setdefault('occurences', [])
             res['occurences'].insert(0, ('delete', occurences_todel))
@@ -1053,7 +1084,7 @@ class Event(ModelSQL, ModelView):
             vevent.dtstart.value = self.dtstart.date()
         else:
             vevent.dtstart.value = self.dtstart.replace(tzinfo=tzlocal)\
-                    .astimezone(tzevent)
+                .astimezone(tzevent)
         if self.dtend:
             if not hasattr(vevent, 'dtend'):
                 vevent.add('dtend')
@@ -1061,7 +1092,7 @@ class Event(ModelSQL, ModelView):
                 vevent.dtend.value = self.dtend.date()
             else:
                 vevent.dtend.value = self.dtend.replace(tzinfo=tzlocal)\
-                        .astimezone(tzevent)
+                    .astimezone(tzevent)
         elif hasattr(vevent, 'dtend'):
             del vevent.dtend
         if not hasattr(vevent, 'created'):
@@ -1081,7 +1112,7 @@ class Event(ModelSQL, ModelView):
                 vevent.recurrence_id.value = self.recurrence.date()
             else:
                 vevent.recurrence_id.value = self.recurrence\
-                        .replace(tzinfo=tzlocal).astimezone(tzevent)
+                    .replace(tzinfo=tzlocal).astimezone(tzevent)
         elif hasattr(vevent, 'recurrence-id'):
             del vevent.recurrence_id
         if self.status:
@@ -1171,9 +1202,7 @@ class EventCategory(ModelSQL):
             ondelete='CASCADE', required=True, select=True)
 
 
-class Alarm(ModelSQL):
-    'Alarm'
-    __name__ = 'calendar.alarm'
+class AlarmMixin:
     valarm = fields.Binary('valarm')
 
     @classmethod
@@ -1193,22 +1222,39 @@ class Alarm(ModelSQL):
             return vobject.readOne(str(self.valarm))
 
 
-class EventAlarm(ModelSQL):
+class EventAlarm(AlarmMixin, ModelSQL, ModelView):
     'Alarm'
     __name__ = 'calendar.event.alarm'
-    _inherits = {'calendar.alarm': 'calendar_alarm'}
-    calendar_alarm = fields.Many2One('calendar.alarm', 'Calendar Alarm',
-            required=True, ondelete='CASCADE', select=True)
     event = fields.Many2One('calendar.event', 'Event', ondelete='CASCADE',
             required=True, select=True)
 
     @classmethod
-    def create(cls, values):
+    def __register__(cls, module_name):
+        cursor = Transaction().cursor
+
+        super(EventAlarm, cls).__register__(module_name)
+
+        table = TableHandler(cursor, cls, module_name)
+
+        # Migration from 2.6: Remove inherits calendar.alarm
+        if table.column_exist('calendar_alarm'):
+            cursor.execute('UPDATE "' + cls._table + '" AS e '
+                'SET valarm = (SELECT a.valarm '
+                    'FROM calendar_alarm AS a '
+                    'WHERE a.id = e.calendar_alarm)')
+            table.drop_column('calendar_alarm', True)
+
+    @classmethod
+    def create(cls, vlist):
         Event = Pool().get('calendar.event')
-        if values.get('event'):
-            # Update write_date of event
-            Event.write(values['event'], {})
-        return super(EventAlarm, cls).create(values)
+        to_write = []
+        for values in vlist:
+            if values.get('event'):
+                # Update write_date of event
+                to_write.append(values['event'])
+        if to_write:
+            Event.write(Event.browse(to_write), {})
+        return super(EventAlarm, cls).create(vlist)
 
     @classmethod
     def write(cls, event_alarms, values):
@@ -1225,28 +1271,14 @@ class EventAlarm(ModelSQL):
     def delete(cls, event_alarms):
         pool = Pool()
         Event = pool.get('calendar.event')
-        Alarm = pool.get('calendar.alarm')
-        alarms = [a.calendar_alarm for a in event_alarms]
         events = [x.event for x in event_alarms]
         if events:
             # Update write_date of event
             Event.write(events, {})
         super(EventAlarm, cls).delete(event_alarms)
-        if alarms:
-            Alarm.delete(alarms)
 
-    @classmethod
-    def valarm2values(cls, alarm):
-        Alarm = Pool().get('calendar.alarm')
-        return Alarm.valarm2values(alarm)
-
-    def alarm2valarm(self):
-        return self.calendar_alarm.alarm2valarm()
 
-
-class Attendee(ModelSQL, ModelView):
-    'Attendee'
-    __name__ = 'calendar.attendee'
+class AttendeeMixin:
     email = fields.Char('Email', required=True, states={
         'readonly': Eval('id', 0) > 0,
         }, depends=['id'])
@@ -1312,47 +1344,70 @@ class Attendee(ModelSQL, ModelView):
         return res
 
 
-class EventAttendee(ModelSQL, ModelView):
+class EventAttendee(AttendeeMixin, ModelSQL, ModelView):
     'Attendee'
     __name__ = 'calendar.event.attendee'
-    _inherits = {'calendar.attendee': 'calendar_attendee'}
-    calendar_attendee = fields.Many2One('calendar.attendee',
-        'Calendar Attendee', required=True, ondelete='CASCADE', select=True)
     event = fields.Many2One('calendar.event', 'Event', ondelete='CASCADE',
         required=True, select=True)
 
     @classmethod
-    def create(cls, values):
+    def __register__(cls, module_name):
+        cursor = Transaction().cursor
+
+        super(EventAttendee, cls).__register__(module_name)
+
+        table = TableHandler(cursor, cls, module_name)
+
+        # Migration from 2.6: Remove inherits calendar.attendee
+        if table.column_exist('calendar_attendee'):
+            cursor.execute('UPDATE "' + cls._table + '" AS e '
+                'SET email = (SELECT a.email '
+                    'FROM calendar_attendee AS a '
+                    'WHERE a.id = e.calendar_attendee), '
+                'status = (SELECT a.status '
+                    'FROM calendar_attendee AS a '
+                    'WHERE a.id = e.calendar_attendee)')
+            table.drop_column('calendar_attendee', True)
+
+    @classmethod
+    def create(cls, vlist):
         Event = Pool().get('calendar.event')
-        if values.get('event'):
-            # Update write_date of event
-            Event.write([Event(values['event'])], {})
-        event_attendee = super(EventAttendee, cls).create(values)
-        event = event_attendee.event
-        if (event.calendar.owner
-                and (event.organizer == event.calendar.owner.email
-                    or (event.parent
-                        and event.parent.organizer == \
+        to_write = []
+        for values in vlist:
+            if values.get('event'):
+                # Update write_date of event
+                to_write.append(values['event'])
+
+        if to_write:
+            Event.write([Event.browse(to_write)], {})
+        event_attendees = super(EventAttendee, cls).create(vlist)
+        for event_attendee in event_attendees:
+            event = event_attendee.event
+            if (event.calendar.owner
+                    and (event.organizer == event.calendar.owner.email
+                        or (event.parent
+                            and event.parent.organizer ==
                             event.parent.calendar.owner.email))):
-            if event.organizer == event.calendar.owner.email:
-                attendee_emails = [x.email for x in event.attendees
-                        if x.email != event.organizer]
-            else:
-                attendee_emails = [x.email for x in event.parent.attendees
-                        if x.email != event.parent.organizer]
-            if attendee_emails:
-                with Transaction().set_user(0):
-                    events = Event.search([
-                            ('uuid', '=', event.uuid),
-                            ('calendar.owner.email', 'in', attendee_emails),
-                            ('id', '!=', event.id),
-                            ('recurrence', '=', event.recurrence),
-                            ])
-                    for event in events:
-                        cls.copy([event_attendee], default={
-                                'event': event.id,
-                                })
-        return event_attendee
+                if event.organizer == event.calendar.owner.email:
+                    attendee_emails = [x.email for x in event.attendees
+                            if x.email != event.organizer]
+                else:
+                    attendee_emails = [x.email for x in event.parent.attendees
+                            if x.email != event.parent.organizer]
+                if attendee_emails:
+                    with Transaction().set_user(0):
+                        events = Event.search([
+                                ('uuid', '=', event.uuid),
+                                ('calendar.owner.email', 'in',
+                                    attendee_emails),
+                                ('id', '!=', event.id),
+                                ('recurrence', '=', event.recurrence),
+                                ])
+                        for event in events:
+                            cls.copy([event_attendee], default={
+                                    'event': event.id,
+                                    })
+        return event_attendees
 
     @classmethod
     def write(cls, event_attendees, values):
@@ -1371,10 +1426,11 @@ class EventAttendee(ModelSQL, ModelView):
         super(EventAttendee, cls).write(event_attendees, values)
         for event_attendee in event_attendees:
             event = event_attendee.event
-            if event.calendar.owner \
-                    and (event.organizer == event.calendar.owner.email \
-                    or (event.parent \
-                    and event.parent.organizer == event.calendar.owner.email)):
+            if (event.calendar.owner
+                    and (event.organizer == event.calendar.owner.email
+                        or (event.parent
+                            and event.parent.organizer
+                            == event.calendar.owner.email))):
                 if event.organizer == event.calendar.owner.email:
                     attendee_emails = [x.email for x in event.attendees
                             if x.email != event.organizer]
@@ -1399,9 +1455,7 @@ class EventAttendee(ModelSQL, ModelView):
     def delete(cls, event_attendees):
         pool = Pool()
         Event = pool.get('calendar.event')
-        Attendee = pool.get('calendar.attendee')
 
-        calendar_attendees = [a.calendar_attendee for a in event_attendees]
         events = [x.event for x in event_attendees]
         if events:
             # Update write_date of event
@@ -1409,10 +1463,11 @@ class EventAttendee(ModelSQL, ModelView):
 
         for attendee in event_attendees:
             event = attendee.event
-            if event.calendar.owner \
-                    and (event.organizer == event.calendar.owner.email \
-                    or (event.parent \
-                    and event.parent.organizer == event.calendar.owner.email)):
+            if (event.calendar.owner
+                    and (event.organizer == event.calendar.owner.email
+                        or (event.parent
+                            and event.parent.organizer
+                            == event.calendar.owner.email))):
                 if event.organizer == event.calendar.owner.email:
                     attendee_emails = [x.email for x in event.attendees
                             if x.email != event.organizer]
@@ -1431,10 +1486,10 @@ class EventAttendee(ModelSQL, ModelView):
                                 ('email', '=', attendee.email),
                                 ])
                         cls.delete(attendees)
-            elif event.calendar.owner \
-                    and ((event.organizer \
-                    or (event.parent and event.parent.organizer)) \
-                    and attendee.email == event.calendar.owner.email):
+            elif (event.calendar.owner
+                    and ((event.organizer
+                            or (event.parent and event.parent.organizer))
+                        and attendee.email == event.calendar.owner.email)):
                 if event.organizer:
                     organizer = event.organizer
                 else:
@@ -1452,54 +1507,14 @@ class EventAttendee(ModelSQL, ModelView):
                                 'status': 'declined',
                                 })
         super(EventAttendee, cls).delete(event_attendees)
-        if calendar_attendees:
-            Attendee.delete(calendar_attendees)
-
-    @classmethod
-    def copy(cls, event_attendees, default=None):
-        Attendee = Pool().get('calendar.attendee')
-
-        if default is None:
-            default = {}
-        default = default.copy()
-        new_event_attendees = []
-        for event_attendee in event_attendees:
-            default['calendar_attendee'], = Attendee.copy(
-                    [event_attendee.calendar_attendee])
-            new_event_attendees.extend(super(EventAttendee, cls).copy(
-                    [event_attendee], default=default))
-        return new_event_attendees
-
-    def _attendee2update(self):
-        return self.calendar_attendee._attendee2update()
 
-    @staticmethod
-    def attendee2values(attendee):
-        Attendee = Pool().get('calendar.attendee')
-        return Attendee.attendee2values(attendee)
-
-    def attendee2attendee(self):
-        return self.calendar_attendee.attendee2attendee()
 
-
-class Date(ModelSQL, ModelView):
-    'Calendar Date'
-    __name__ = 'calendar.date'
+class DateMixin:
     _rec_name = 'datetime'
-    date = fields.Boolean('Is Date', help='Ignore time of field "Date", ' \
-            'but handle as date only.')
+    date = fields.Boolean('Is Date',
+        help='Ignore time of field "Date", but handle as date only.')
     datetime = fields.DateTime('Date', required=True)
 
-    @classmethod
-    def __register__(cls, module_name):
-        cursor = Transaction().cursor
-        # Migration from 1.4: calendar.rdate renamed to calendar.date
-        old_table = 'calendar_rdate'
-        if TableHandler.table_exist(cursor, old_table):
-            TableHandler.table_rename(cursor, old_table, cls._table)
-
-        super(Date, cls).__register__(module_name)
-
     def _date2update(self):
         return {
             'date': self.date,
@@ -1535,13 +1550,10 @@ class Date(ModelSQL, ModelView):
             return self.datetime.replace(tzinfo=tzlocal).astimezone(tzutc)
 
 
-class EventRDate(ModelSQL, ModelView):
+class EventRDate(DateMixin, ModelSQL, ModelView):
     'Recurrence Date'
     __name__ = 'calendar.event.rdate'
-    _inherits = {'calendar.date': 'calendar_date'}
     _rec_name = 'datetime'
-    calendar_date = fields.Many2One('calendar.date', 'Calendar Date',
-            required=True, ondelete='CASCADE', select=True)
     event = fields.Many2One('calendar.event', 'Event', ondelete='CASCADE',
             select=True, required=True)
 
@@ -1556,13 +1568,30 @@ class EventRDate(ModelSQL, ModelView):
 
         super(EventRDate, cls).__register__(module_name)
 
+        table = TableHandler(cursor, cls, module_name)
+
+        # Migration from 2.6: Remove inherits calendar.date
+        if table.column_exist('calendar_date'):
+            cursor.execute('UPDATE "' + cls._table + '" AS e '
+                'SET date = (SELECT a.date '
+                    'FROM calendar_date AS a '
+                    'WHERE a.id = e.calendar_date), '
+                'datetime = (SELECT a.datetime '
+                    'FROM calendar_date AS a '
+                    'WHERE a.id = e.calendar_date)')
+            table.drop_column('calendar_date', True)
+
     @classmethod
-    def create(cls, values):
+    def create(cls, vlist):
         Event = Pool().get('calendar.event')
-        if values.get('event'):
-            # Update write_date of event
-            Event.write([Event(values['event'])], {})
-        return super(EventRDate, cls).create(values)
+        to_write = []
+        for values in vlist:
+            if values.get('event'):
+                # Update write_date of event
+                to_write.append(values['event'])
+        if to_write:
+            Event.write(Event.browse(to_write), {})
+        return super(EventRDate, cls).create(vlist)
 
     @classmethod
     def write(cls, event_rdates, values):
@@ -1579,38 +1608,21 @@ class EventRDate(ModelSQL, ModelView):
     def delete(cls, event_rdates):
         pool = Pool()
         Event = pool.get('calendar.event')
-        Date = pool.get('calendar.date')
-        dates = [a.calendar_date for a in event_rdates]
         events = [x.event for x in event_rdates]
         if events:
             # Update write_date of event
             Event.write(events, {})
         super(EventRDate, cls).delete(event_rdates)
-        if dates:
-            Date.delete(dates)
-
-    def _date2update(self):
-        return self.calendar_date._date2update()
-
-    @classmethod
-    def date2values(cls, date):
-        Date = Pool().get('calendar.date')
-        return Date.date2values(date)
-
-    def date2date(self):
-        return self.calendar_date.date2date()
 
 
 class EventExDate(EventRDate):
     'Exception Date'
     __name__ = 'calendar.event.exdate'
+    _table = 'calendar_event_exdate'  # Needed to override EventRDate._table
 
 
-class RRule(ModelSQL, ModelView):
-    'Recurrence Rule'
-    __name__ = 'calendar.rrule'
+class RRuleMixin(Model):
     _rec_name = 'freq'
-
     freq = fields.Selection([
         ('secondly', 'Secondly'),
         ('minutely', 'Minutely'),
@@ -1620,8 +1632,8 @@ class RRule(ModelSQL, ModelView):
         ('monthly', 'Monthly'),
         ('yearly', 'Yearly'),
         ], 'Frequency', required=True)
-    until_date = fields.Boolean('Is Date', help='Ignore time of field ' \
-            '"Until Date", but handle as date only.')
+    until_date = fields.Boolean('Is Date',
+        help='Ignore time of field "Until Date", but handle as date only.')
     until = fields.DateTime('Until Date')
     count = fields.Integer('Count')
     interval = fields.Integer('Interval')
@@ -1646,42 +1658,43 @@ class RRule(ModelSQL, ModelView):
 
     @classmethod
     def __setup__(cls):
-        super(RRule, cls).__setup__()
+        super(RRuleMixin, cls).__setup__()
         cls._sql_constraints += [
             ('until_count_only_one',
                 'CHECK(until IS NULL OR count IS NULL OR count = 0)',
-                'Only one of "until" and "count" can be set!'),
-            ]
-        cls._constraints += [
-            ('check_bysecond', 'invalid_bysecond'),
-            ('check_byminute', 'invalid_byminute'),
-            ('check_byhour', 'invalid_byhour'),
-            ('check_byday', 'invalid_byday'),
-            ('check_bymonthday', 'invalid_bymonthday'),
-            ('check_byyearday', 'invalid_byyearday'),
-            ('check_byweekno', 'invalid_byweekno'),
-            ('check_bymonth', 'invalid_bymonth'),
-            ('check_bysetpos', 'invalid_bysetpos'),
+                'Only one of "until" and "count" can be set.'),
             ]
         cls._error_messages.update({
-                'invalid_bysecond': 'Invalid "By Second"',
-                'invalid_byminute': 'Invalid "By Minute"',
-                'invalid_byhour': 'Invalid "By Hour"',
-                'invalid_byday': 'Invalid "By Day"',
-                'invalid_bymonthday': 'Invalid "By Month Day"',
-                'invalid_byyearday': 'Invalid "By Year Day"',
-                'invalid_byweekno': 'Invalid "By Week Number"',
-                'invalid_bymonth': 'Invalid "By Month"',
-                'invalid_bysetpos': 'Invalid "By Position"',
+                'invalid_bysecond': ('Invalid "By Second" in recurrence rule '
+                    '"%s"'),
+                'invalid_byminute': ('Invalid "By Minute" in recurrence rule '
+                    '"%s"'),
+                'invalid_byhour': 'Invalid "By Hour" in recurrence rule "%s"',
+                'invalid_byday': 'Invalid "By Day" in recurrence rule "%s"',
+                'invalid_bymonthday': ('Invalid "By Month Day" in recurrence '
+                    'rule "%s"'),
+                'invalid_byyearday': ('Invalid "By Year Day" in recurrence '
+                    'rule "%s"'),
+                'invalid_byweekno': ('Invalid "By Week Number" in recurrence '
+                    'rule "%s"'),
+                'invalid_bymonth': 'Invalid "By Month" in recurrence rule "%s"',
+                'invalid_bysetpos': ('Invalid "By Position" in recurrence rule '
+                    '"%s"'),
                 })
 
     @classmethod
-    def __register__(cls, module_name):
-        cursor = Transaction().cursor
-        # Migrate from 1.4: unit_count replaced by until_count_only_one
-        table = TableHandler(cursor, cls, module_name)
-        table.drop_constraint('until_count')
-        return super(RRule, cls).__register__(module_name)
+    def validate(cls, rules):
+        super(RRuleMixin, cls).validate(rules)
+        for rule in rules:
+            rule.check_bysecond()
+            rule.check_byminute()
+            rule.check_byhour()
+            rule.check_byday()
+            rule.check_bymonthday()
+            rule.check_byyearday()
+            rule.check_byweekno()
+            rule.check_bymonth()
+            rule.check_bysetpos()
 
     def check_bysecond(self):
         if self.bysecond:
@@ -1689,10 +1702,9 @@ class RRule(ModelSQL, ModelView):
                 try:
                     second = int(second)
                 except Exception:
-                    return False
+                    second = -1
                 if not (second >= 0 and second <= 59):
-                    return False
-        return True
+                    self.raise_user_error('invalid_bysecond', (self.rec_name,))
 
     def check_byminute(self):
         if self.byminute:
@@ -1700,10 +1712,9 @@ class RRule(ModelSQL, ModelView):
                 try:
                     minute = int(minute)
                 except Exception:
-                    return False
+                    minute = -1
                 if not (minute >= 0 and minute <= 59):
-                    return False
-        return True
+                    self.raise_user_error('invalid_byminute', (self.rec_name,))
 
     def check_byhour(self):
         if self.byhour:
@@ -1711,27 +1722,25 @@ class RRule(ModelSQL, ModelView):
                 try:
                     hour = int(hour)
                 except Exception:
-                    return False
+                    hour = -1
                 if not (hour >= 0 and hour <= 23):
-                    return False
-        return True
+                    self.raise_user_error('invalid_byhour', (self.rec_name,))
 
     def check_byday(self):
         if self.byday:
             for weekdaynum in self.byday.split(','):
                 weekday = weekdaynum[-2:]
                 if weekday not in ('SU', 'MO', 'TU', 'WE', 'TH', 'FR', 'SA'):
-                    return False
+                    self.raise_user_error('invalid_byday', (self.rec_name,))
                 ordwk = weekday[:-2]
                 if not ordwk:
                     continue
                 try:
                     ordwk = int(ordwk)
                 except Exception:
-                    return False
+                    ordwk = -1
                 if not (abs(ordwk) >= 1 and abs(ordwk) <= 53):
-                    return False
-        return True
+                    self.raise_user_error('invalid_byday', (self.rec_name,))
 
     def check_bymonthday(self):
         if self.bymonthday:
@@ -1739,10 +1748,10 @@ class RRule(ModelSQL, ModelView):
                 try:
                     monthdaynum = int(monthdaynum)
                 except Exception:
-                    return False
+                    monthdaynum = -100
                 if not (abs(monthdaynum) >= 1 and abs(monthdaynum) <= 31):
-                    return False
-        return True
+                    self.raise_user_error('invalid_bymonthday', (
+                            self.rec_name,))
 
     def check_byyearday(self):
         if self.byyearday:
@@ -1750,10 +1759,9 @@ class RRule(ModelSQL, ModelView):
                 try:
                     yeardaynum = int(yeardaynum)
                 except Exception:
-                    return False
+                    yeardaynum = -1000
                 if not (abs(yeardaynum) >= 1 and abs(yeardaynum) <= 366):
-                    return False
-        return True
+                    self.raise_user_error('invalid_byyearday', (self.rec_name,))
 
     def check_byweekno(self):
         if self.byweekno:
@@ -1761,10 +1769,9 @@ class RRule(ModelSQL, ModelView):
                 try:
                     weeknum = int(weeknum)
                 except Exception:
-                    return False
+                    weeknum = -100
                 if not (abs(weeknum) >= 1 and abs(weeknum) <= 53):
-                    return False
-        return True
+                    self.raise_user_error('invalid_byweekno', (self.rec_name,))
 
     def check_bymonth(self):
         if self.bymonth:
@@ -1772,10 +1779,9 @@ class RRule(ModelSQL, ModelView):
                 try:
                     monthnum = int(monthnum)
                 except Exception:
-                    return False
+                    monthnum = -1
                 if not (monthnum >= 1 and monthnum <= 12):
-                    return False
-        return True
+                    self.raise_user_error('invalid_bymonth', (self.rec_name,))
 
     def check_bysetpos(self):
         if self.bysetpos:
@@ -1783,10 +1789,9 @@ class RRule(ModelSQL, ModelView):
                 try:
                     setposday = int(setposday)
                 except Exception:
-                    return False
+                    setposday = -1000
                 if not (abs(setposday) >= 1 and abs(setposday) <= 366):
-                    return False
-        return True
+                    self.raise_user_error('invalid_bysetpos', (self.rec_name,))
 
     def _rule2update(self):
         res = {}
@@ -1836,9 +1841,9 @@ class RRule(ModelSQL, ModelView):
             if self.until_date:
                 res += vobject.icalendar.dateToString(self.until.date())
             else:
-                res += vobject.icalendar.dateTimeToString(self.until\
-                        .replace(tzinfo=tzlocal).astimezone(tzutc),
-                        convertToUTC=True)
+                res += vobject.icalendar.dateTimeToString(self.until
+                    .replace(tzinfo=tzlocal).astimezone(tzutc),
+                    convertToUTC=True)
         elif self.count:
             res += ';COUNT=' + str(self.count)
         for field in ('freq', 'wkst'):
@@ -1852,24 +1857,42 @@ class RRule(ModelSQL, ModelView):
         return res
 
 
-class EventRRule(ModelSQL, ModelView):
+class EventRRule(RRuleMixin, ModelSQL, ModelView):
     'Recurrence Rule'
     __name__ = 'calendar.event.rrule'
-    _inherits = {'calendar.rrule': 'calendar_rrule'}
-    _rec_name = 'freq'
-
-    calendar_rrule = fields.Many2One('calendar.rrule', 'Calendar RRule',
-            required=True, ondelete='CASCADE', select=True)
     event = fields.Many2One('calendar.event', 'Event', ondelete='CASCADE',
             select=True, required=True)
 
     @classmethod
-    def create(cls, values):
+    def __register__(cls, module_name):
+        cursor = Transaction().cursor
+
+        super(EventRRule, cls).__register__(module_name)
+
+        table = TableHandler(cursor, cls, module_name)
+
+        # Migration from 2.6: Remove inherits calendar.rrule
+        if table.column_exist('calendar_rrule'):
+            for field in (f for f in dir(RRuleMixin)
+                    if isinstance(f, fields.Field)):
+                cursor.execute(('UPDATE "' + cls._table + '" AS e '
+                        'SET "%(field)s" = (SELECT a."%(field)s" '
+                            'FROM calendar_rrule AS r '
+                            'WHERE r.id = e.calendar_rrule)')
+                    % {'field': field})
+            table.drop_column('calendar_rrule', True)
+
+    @classmethod
+    def create(cls, vlist):
         Event = Pool().get('calendar.event')
-        if values.get('event'):
-            # Update write_date of event
-            Event.write([Event(values['event'])], {})
-        return super(EventRRule, cls).create(values)
+        to_write = []
+        for values in vlist:
+            if values.get('event'):
+                # Update write_date of event
+                to_write.append(values['event'])
+        if to_write:
+            Event.write(Event.browse(to_write), {})
+        return super(EventRRule, cls).create(vlist)
 
     @classmethod
     def write(cls, event_rrules, values):
@@ -1886,26 +1909,11 @@ class EventRRule(ModelSQL, ModelView):
     def delete(cls, event_rrules):
         pool = Pool()
         Event = pool.get('calendar.event')
-        Rrule = pool.get('calendar.rrule')
-        rrules = [a.calendar_rrule for a in event_rrules]
         events = [x.event for x in event_rrules]
         if events:
             # Update write_date of event
             Event.write(events, {})
         super(EventRRule, cls).delete(event_rrules)
-        if rrules:
-            Rrule.delete(rrules)
-
-    def _rule2update(self):
-        return self.calendar_rrule._rule2update()
-
-    @classmethod
-    def rule2values(self, rule):
-        Rule = Pool().get('calendar.rrule')
-        return Rule.rule2values(rule)
-
-    def rule2rule(self):
-        return self.calendar_rrule.rule2rule()
 
 
 class EventExRule(EventRRule):
diff --git a/locale/bg_BG.po b/locale/bg_BG.po
index 537b2ff..f74ad13 100644
--- a/locale/bg_BG.po
+++ b/locale/bg_BG.po
@@ -3,132 +3,112 @@ msgid ""
 msgstr "Content-Type: text/plain; charset=utf-8\n"
 
 msgctxt "error:calendar.calendar:"
-msgid "A user can have only one calendar!"
-msgstr "Потребителя може да има само един календар!"
+msgid "A user can have only one calendar."
+msgstr ""
 
 msgctxt "error:calendar.calendar:"
-msgid "The name of calendar must be unique!"
-msgstr "Името на календара трябва да е уникално!"
-
-msgctxt "error:calendar.category:"
-msgid "The name of calendar category must be unique!"
-msgstr "Името на категорията на календара трябва да е уникално!"
-
-msgctxt "error:calendar.event:"
-msgid "Recurrence can not be recurrent!"
-msgstr "Повторението не може да е периодично!"
-
-msgctxt "error:calendar.event:"
-msgid "UUID and recurrence must be unique in a calendar!"
-msgstr "UUID и взаимна вложеност трябва да са уникални в календар!"
-
-msgctxt "error:calendar.location:"
-msgid "The name of calendar location must be unique!"
-msgstr "Името на местонахождението на календара трябва да е уникално!"
-
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Day\""
-msgstr "Невалиден \"По ден\""
+msgid "Calendar name \"%s\" can not end with .ics"
+msgstr ""
 
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Hour\""
-msgstr "Навалиден \"По час\""
+msgctxt "error:calendar.calendar:"
+msgid "The name of calendar must be unique."
+msgstr ""
 
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Minute\""
-msgstr "Невалиден \"По минута\""
+msgctxt "error:calendar.category:"
+msgid "The name of calendar category must be unique."
+msgstr ""
 
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Month Day\""
-msgstr "Невалиден \"По ден от месец\""
+msgctxt "error:calendar.event.exrule:"
+msgid "Invalid \"By Day\" in recurrence rule \"%s\""
+msgstr ""
 
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Month\""
-msgstr "Невалидно \"По месец\""
+msgctxt "error:calendar.event.exrule:"
+msgid "Invalid \"By Hour\" in recurrence rule \"%s\""
+msgstr ""
 
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Position\""
-msgstr "Невалиден \"По позиция\""
+msgctxt "error:calendar.event.exrule:"
+msgid "Invalid \"By Minute\" in recurrence rule \"%s\""
+msgstr ""
 
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Second\""
-msgstr "Невалиден \"По секунда\""
+msgctxt "error:calendar.event.exrule:"
+msgid "Invalid \"By Month Day\" in recurrence rule \"%s\""
+msgstr ""
 
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Week Number\""
-msgstr "Невалиден \"По номер на седмица\""
+msgctxt "error:calendar.event.exrule:"
+msgid "Invalid \"By Month\" in recurrence rule \"%s\""
+msgstr ""
 
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Year Day\""
-msgstr "Невалиден \"По ден от годината\""
+msgctxt "error:calendar.event.exrule:"
+msgid "Invalid \"By Position\" in recurrence rule \"%s\""
+msgstr ""
 
-msgctxt "error:calendar.rrule:"
-msgid "Only one of \"until\" and \"count\" can be set!"
-msgstr "\"Крайна дата\" и \"брой\" не може да се попълва по едно и също време!"
+msgctxt "error:calendar.event.exrule:"
+msgid "Invalid \"By Second\" in recurrence rule \"%s\""
+msgstr ""
 
-msgctxt "field:calendar.alarm,create_date:"
-msgid "Create Date"
-msgstr "Създадено на"
+msgctxt "error:calendar.event.exrule:"
+msgid "Invalid \"By Week Number\" in recurrence rule \"%s\""
+msgstr ""
 
-msgctxt "field:calendar.alarm,create_uid:"
-msgid "Create User"
-msgstr "Създадено от"
+msgctxt "error:calendar.event.exrule:"
+msgid "Invalid \"By Year Day\" in recurrence rule \"%s\""
+msgstr ""
 
-msgctxt "field:calendar.alarm,id:"
-msgid "ID"
-msgstr "ID"
+msgctxt "error:calendar.event.exrule:"
+msgid "Only one of \"until\" and \"count\" can be set."
+msgstr ""
 
-msgctxt "field:calendar.alarm,rec_name:"
-msgid "Name"
-msgstr "Име"
+msgctxt "error:calendar.event.rrule:"
+msgid "Invalid \"By Day\" in recurrence rule \"%s\""
+msgstr ""
 
-msgctxt "field:calendar.alarm,valarm:"
-msgid "valarm"
+msgctxt "error:calendar.event.rrule:"
+msgid "Invalid \"By Hour\" in recurrence rule \"%s\""
 msgstr ""
 
-msgctxt "field:calendar.alarm,write_date:"
-msgid "Write Date"
-msgstr "Променено на"
+msgctxt "error:calendar.event.rrule:"
+msgid "Invalid \"By Minute\" in recurrence rule \"%s\""
+msgstr ""
 
-msgctxt "field:calendar.alarm,write_uid:"
-msgid "Write User"
-msgstr "Променено от"
+msgctxt "error:calendar.event.rrule:"
+msgid "Invalid \"By Month Day\" in recurrence rule \"%s\""
+msgstr ""
 
-msgctxt "field:calendar.attendee,attendee:"
-msgid "attendee"
-msgstr "присътващ"
+msgctxt "error:calendar.event.rrule:"
+msgid "Invalid \"By Month\" in recurrence rule \"%s\""
+msgstr ""
 
-msgctxt "field:calendar.attendee,create_date:"
-msgid "Create Date"
-msgstr "Създадено на"
+msgctxt "error:calendar.event.rrule:"
+msgid "Invalid \"By Position\" in recurrence rule \"%s\""
+msgstr ""
 
-msgctxt "field:calendar.attendee,create_uid:"
-msgid "Create User"
-msgstr "Създадено от"
+msgctxt "error:calendar.event.rrule:"
+msgid "Invalid \"By Second\" in recurrence rule \"%s\""
+msgstr ""
 
-msgctxt "field:calendar.attendee,email:"
-msgid "Email"
-msgstr "Email"
+msgctxt "error:calendar.event.rrule:"
+msgid "Invalid \"By Week Number\" in recurrence rule \"%s\""
+msgstr ""
 
-msgctxt "field:calendar.attendee,id:"
-msgid "ID"
-msgstr "ID"
+msgctxt "error:calendar.event.rrule:"
+msgid "Invalid \"By Year Day\" in recurrence rule \"%s\""
+msgstr ""
 
-msgctxt "field:calendar.attendee,rec_name:"
-msgid "Name"
-msgstr "Име"
+msgctxt "error:calendar.event.rrule:"
+msgid "Only one of \"until\" and \"count\" can be set."
+msgstr ""
 
-msgctxt "field:calendar.attendee,status:"
-msgid "Participation Status"
-msgstr "Статус на участие"
+msgctxt "error:calendar.event:"
+msgid "Recurrence \"%s\" can not be recurrent."
+msgstr ""
 
-msgctxt "field:calendar.attendee,write_date:"
-msgid "Write Date"
-msgstr "Променено на"
+msgctxt "error:calendar.event:"
+msgid "UUID and recurrence must be unique in a calendar."
+msgstr ""
 
-msgctxt "field:calendar.attendee,write_uid:"
-msgid "Write User"
-msgstr "Променено от"
+msgctxt "error:calendar.location:"
+msgid "The name of calendar location must be unique."
+msgstr ""
 
 msgctxt "field:calendar.calendar,create_date:"
 msgid "Create Date"
@@ -266,38 +246,6 @@ msgctxt "field:calendar.category,write_uid:"
 msgid "Write User"
 msgstr "Променено от"
 
-msgctxt "field:calendar.date,create_date:"
-msgid "Create Date"
-msgstr "Създадено на"
-
-msgctxt "field:calendar.date,create_uid:"
-msgid "Create User"
-msgstr "Създадено от"
-
-msgctxt "field:calendar.date,date:"
-msgid "Is Date"
-msgstr "Е дата"
-
-msgctxt "field:calendar.date,datetime:"
-msgid "Date"
-msgstr "Дата"
-
-msgctxt "field:calendar.date,id:"
-msgid "ID"
-msgstr "ID"
-
-msgctxt "field:calendar.date,rec_name:"
-msgid "Name"
-msgstr "Име"
-
-msgctxt "field:calendar.date,write_date:"
-msgid "Write Date"
-msgstr "Променено на"
-
-msgctxt "field:calendar.date,write_uid:"
-msgid "Write User"
-msgstr "Променено от"
-
 msgctxt "field:calendar.event,alarms:"
 msgid "Alarms"
 msgstr "Аларми"
@@ -466,10 +414,6 @@ msgctxt "field:calendar.event-calendar.category,write_uid:"
 msgid "Write User"
 msgstr "Променено от"
 
-msgctxt "field:calendar.event.alarm,calendar_alarm:"
-msgid "Calendar Alarm"
-msgstr "Аларма на календар"
-
 msgctxt "field:calendar.event.alarm,create_date:"
 msgid "Create Date"
 msgstr "Създадено на"
@@ -490,6 +434,10 @@ msgctxt "field:calendar.event.alarm,rec_name:"
 msgid "Name"
 msgstr "Име"
 
+msgctxt "field:calendar.event.alarm,valarm:"
+msgid "valarm"
+msgstr ""
+
 msgctxt "field:calendar.event.alarm,write_date:"
 msgid "Write Date"
 msgstr "Променено на"
@@ -498,9 +446,9 @@ msgctxt "field:calendar.event.alarm,write_uid:"
 msgid "Write User"
 msgstr "Променено от"
 
-msgctxt "field:calendar.event.attendee,calendar_attendee:"
-msgid "Calendar Attendee"
-msgstr "Присъстващ на календар"
+msgctxt "field:calendar.event.attendee,attendee:"
+msgid "attendee"
+msgstr ""
 
 msgctxt "field:calendar.event.attendee,create_date:"
 msgid "Create Date"
@@ -510,6 +458,11 @@ msgctxt "field:calendar.event.attendee,create_uid:"
 msgid "Create User"
 msgstr "Създадено от"
 
+#, fuzzy
+msgctxt "field:calendar.event.attendee,email:"
+msgid "Email"
+msgstr "Email"
+
 msgctxt "field:calendar.event.attendee,event:"
 msgid "Event"
 msgstr "Събитие"
@@ -522,6 +475,10 @@ msgctxt "field:calendar.event.attendee,rec_name:"
 msgid "Name"
 msgstr "Име"
 
+msgctxt "field:calendar.event.attendee,status:"
+msgid "Participation Status"
+msgstr ""
+
 msgctxt "field:calendar.event.attendee,write_date:"
 msgid "Write Date"
 msgstr "Променено на"
@@ -530,10 +487,6 @@ msgctxt "field:calendar.event.attendee,write_uid:"
 msgid "Write User"
 msgstr "Променено от"
 
-msgctxt "field:calendar.event.exdate,calendar_date:"
-msgid "Calendar Date"
-msgstr "Дата от календар"
-
 msgctxt "field:calendar.event.exdate,create_date:"
 msgid "Create Date"
 msgstr "Създадено на"
@@ -542,6 +495,15 @@ msgctxt "field:calendar.event.exdate,create_uid:"
 msgid "Create User"
 msgstr "Създадено от"
 
+msgctxt "field:calendar.event.exdate,date:"
+msgid "Is Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.event.exdate,datetime:"
+msgid "Date"
+msgstr "Дата"
+
 msgctxt "field:calendar.event.exdate,event:"
 msgid "Event"
 msgstr "Събитие"
@@ -562,8 +524,44 @@ msgctxt "field:calendar.event.exdate,write_uid:"
 msgid "Write User"
 msgstr "Променено от"
 
-msgctxt "field:calendar.event.exrule,calendar_rrule:"
-msgid "Calendar RRule"
+msgctxt "field:calendar.event.exrule,byday:"
+msgid "By Day"
+msgstr ""
+
+msgctxt "field:calendar.event.exrule,byhour:"
+msgid "By Hour"
+msgstr ""
+
+msgctxt "field:calendar.event.exrule,byminute:"
+msgid "By Minute"
+msgstr ""
+
+msgctxt "field:calendar.event.exrule,bymonth:"
+msgid "By Month"
+msgstr ""
+
+msgctxt "field:calendar.event.exrule,bymonthday:"
+msgid "By Month Day"
+msgstr ""
+
+msgctxt "field:calendar.event.exrule,bysecond:"
+msgid "By Second"
+msgstr ""
+
+msgctxt "field:calendar.event.exrule,bysetpos:"
+msgid "By Position"
+msgstr ""
+
+msgctxt "field:calendar.event.exrule,byweekno:"
+msgid "By Week Number"
+msgstr ""
+
+msgctxt "field:calendar.event.exrule,byyearday:"
+msgid "By Year Day"
+msgstr ""
+
+msgctxt "field:calendar.event.exrule,count:"
+msgid "Count"
 msgstr ""
 
 msgctxt "field:calendar.event.exrule,create_date:"
@@ -578,14 +576,35 @@ msgctxt "field:calendar.event.exrule,event:"
 msgid "Event"
 msgstr "Събитие"
 
+msgctxt "field:calendar.event.exrule,freq:"
+msgid "Frequency"
+msgstr ""
+
 msgctxt "field:calendar.event.exrule,id:"
 msgid "ID"
 msgstr "ID"
 
+msgctxt "field:calendar.event.exrule,interval:"
+msgid "Interval"
+msgstr ""
+
 msgctxt "field:calendar.event.exrule,rec_name:"
 msgid "Name"
 msgstr "Име"
 
+msgctxt "field:calendar.event.exrule,until:"
+msgid "Until Date"
+msgstr ""
+
+msgctxt "field:calendar.event.exrule,until_date:"
+msgid "Is Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.event.exrule,wkst:"
+msgid "Week Day"
+msgstr "Ден от седмица"
+
 msgctxt "field:calendar.event.exrule,write_date:"
 msgid "Write Date"
 msgstr "Променено на"
@@ -594,10 +613,6 @@ msgctxt "field:calendar.event.exrule,write_uid:"
 msgid "Write User"
 msgstr "Променено от"
 
-msgctxt "field:calendar.event.rdate,calendar_date:"
-msgid "Calendar Date"
-msgstr "Дата от календар"
-
 msgctxt "field:calendar.event.rdate,create_date:"
 msgid "Create Date"
 msgstr "Създадено на"
@@ -606,6 +621,15 @@ msgctxt "field:calendar.event.rdate,create_uid:"
 msgid "Create User"
 msgstr "Създадено от"
 
+msgctxt "field:calendar.event.rdate,date:"
+msgid "Is Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.event.rdate,datetime:"
+msgid "Date"
+msgstr "Дата"
+
 msgctxt "field:calendar.event.rdate,event:"
 msgid "Event"
 msgstr "Събитие"
@@ -626,8 +650,44 @@ msgctxt "field:calendar.event.rdate,write_uid:"
 msgid "Write User"
 msgstr "Променено от"
 
-msgctxt "field:calendar.event.rrule,calendar_rrule:"
-msgid "Calendar RRule"
+msgctxt "field:calendar.event.rrule,byday:"
+msgid "By Day"
+msgstr ""
+
+msgctxt "field:calendar.event.rrule,byhour:"
+msgid "By Hour"
+msgstr ""
+
+msgctxt "field:calendar.event.rrule,byminute:"
+msgid "By Minute"
+msgstr ""
+
+msgctxt "field:calendar.event.rrule,bymonth:"
+msgid "By Month"
+msgstr ""
+
+msgctxt "field:calendar.event.rrule,bymonthday:"
+msgid "By Month Day"
+msgstr ""
+
+msgctxt "field:calendar.event.rrule,bysecond:"
+msgid "By Second"
+msgstr ""
+
+msgctxt "field:calendar.event.rrule,bysetpos:"
+msgid "By Position"
+msgstr ""
+
+msgctxt "field:calendar.event.rrule,byweekno:"
+msgid "By Week Number"
+msgstr ""
+
+msgctxt "field:calendar.event.rrule,byyearday:"
+msgid "By Year Day"
+msgstr ""
+
+msgctxt "field:calendar.event.rrule,count:"
+msgid "Count"
 msgstr ""
 
 msgctxt "field:calendar.event.rrule,create_date:"
@@ -642,14 +702,35 @@ msgctxt "field:calendar.event.rrule,event:"
 msgid "Event"
 msgstr "Събитие"
 
+msgctxt "field:calendar.event.rrule,freq:"
+msgid "Frequency"
+msgstr ""
+
 msgctxt "field:calendar.event.rrule,id:"
 msgid "ID"
 msgstr "ID"
 
+msgctxt "field:calendar.event.rrule,interval:"
+msgid "Interval"
+msgstr ""
+
 msgctxt "field:calendar.event.rrule,rec_name:"
 msgid "Name"
 msgstr "Име"
 
+msgctxt "field:calendar.event.rrule,until:"
+msgid "Until Date"
+msgstr ""
+
+msgctxt "field:calendar.event.rrule,until_date:"
+msgid "Is Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.event.rrule,wkst:"
+msgid "Week Day"
+msgstr "Ден от седмица"
+
 msgctxt "field:calendar.event.rrule,write_date:"
 msgid "Write Date"
 msgstr "Променено на"
@@ -686,90 +767,6 @@ msgctxt "field:calendar.location,write_uid:"
 msgid "Write User"
 msgstr "Променено от"
 
-msgctxt "field:calendar.rrule,byday:"
-msgid "By Day"
-msgstr "По ден"
-
-msgctxt "field:calendar.rrule,byhour:"
-msgid "By Hour"
-msgstr "По час"
-
-msgctxt "field:calendar.rrule,byminute:"
-msgid "By Minute"
-msgstr "По минута"
-
-msgctxt "field:calendar.rrule,bymonth:"
-msgid "By Month"
-msgstr "По месец"
-
-msgctxt "field:calendar.rrule,bymonthday:"
-msgid "By Month Day"
-msgstr "По ден от месеца"
-
-msgctxt "field:calendar.rrule,bysecond:"
-msgid "By Second"
-msgstr "По секунда"
-
-msgctxt "field:calendar.rrule,bysetpos:"
-msgid "By Position"
-msgstr "По позиция"
-
-msgctxt "field:calendar.rrule,byweekno:"
-msgid "By Week Number"
-msgstr "По номер на седмицата"
-
-msgctxt "field:calendar.rrule,byyearday:"
-msgid "By Year Day"
-msgstr "По ден от годината"
-
-msgctxt "field:calendar.rrule,count:"
-msgid "Count"
-msgstr "Брой"
-
-msgctxt "field:calendar.rrule,create_date:"
-msgid "Create Date"
-msgstr "Създадено на"
-
-msgctxt "field:calendar.rrule,create_uid:"
-msgid "Create User"
-msgstr "Създадено от"
-
-msgctxt "field:calendar.rrule,freq:"
-msgid "Frequency"
-msgstr "Честота"
-
-msgctxt "field:calendar.rrule,id:"
-msgid "ID"
-msgstr "ID"
-
-msgctxt "field:calendar.rrule,interval:"
-msgid "Interval"
-msgstr "Интервал"
-
-msgctxt "field:calendar.rrule,rec_name:"
-msgid "Name"
-msgstr "Име"
-
-msgctxt "field:calendar.rrule,until:"
-msgid "Until Date"
-msgstr "До дата"
-
-msgctxt "field:calendar.rrule,until_date:"
-msgid "Is Date"
-msgstr "Е дата"
-
-msgctxt "field:calendar.rrule,wkst:"
-msgid "Week Day"
-msgstr "Ден от седмица"
-
-msgctxt "field:calendar.rrule,write_date:"
-msgid "Write Date"
-msgstr "Променено на"
-
-msgctxt "field:calendar.rrule,write_uid:"
-msgid "Write User"
-msgstr "Променено от"
-
 msgctxt "field:res.user,calendars:"
 msgid "Calendars"
 msgstr "Календари"
@@ -778,25 +775,25 @@ msgctxt "help:calendar.calendar,owner:"
 msgid "The user must have an email"
 msgstr "Потребителя трябва да има email"
 
-msgctxt "help:calendar.date,date:"
-msgid "Ignore time of field \"Date\", but handle as date only."
-msgstr "От полето \"Дата\" се игнорира часа и се използва само датата."
-
 msgctxt "help:calendar.event,uuid:"
 msgid "Universally Unique Identifier"
 msgstr "Универсален иникален идентификатор"
 
-msgctxt "help:calendar.rrule,until_date:"
+msgctxt "help:calendar.event.exdate,date:"
+msgid "Ignore time of field \"Date\", but handle as date only."
+msgstr ""
+
+msgctxt "help:calendar.event.exrule,until_date:"
 msgid "Ignore time of field \"Until Date\", but handle as date only."
-msgstr "От полето \"До дата\" се игнорира часа и се използва само датата."
+msgstr ""
 
-msgctxt "model:calendar.alarm,name:"
-msgid "Alarm"
-msgstr "Аларма"
+msgctxt "help:calendar.event.rdate,date:"
+msgid "Ignore time of field \"Date\", but handle as date only."
+msgstr ""
 
-msgctxt "model:calendar.attendee,name:"
-msgid "Attendee"
-msgstr "Присъстващ"
+msgctxt "help:calendar.event.rrule,until_date:"
+msgid "Ignore time of field \"Until Date\", but handle as date only."
+msgstr ""
 
 msgctxt "model:calendar.calendar,name:"
 msgid "Calendar"
@@ -814,10 +811,6 @@ msgctxt "model:calendar.category,name:"
 msgid "Category"
 msgstr "Категория"
 
-msgctxt "model:calendar.date,name:"
-msgid "Calendar Date"
-msgstr "Дата от календар"
-
 msgctxt "model:calendar.event,name:"
 msgid "Event"
 msgstr "Събитие"
@@ -854,10 +847,6 @@ msgctxt "model:calendar.location,name:"
 msgid "Location"
 msgstr "Местоположение"
 
-msgctxt "model:calendar.rrule,name:"
-msgid "Recurrence Rule"
-msgstr "Правило за повторение"
-
 msgctxt "model:ir.action,name:act_calendar_form"
 msgid "Calendars"
 msgstr "Календари"
@@ -886,30 +875,6 @@ msgctxt "model:res.group,name:group_calendar_admin"
 msgid "Calendar Administration"
 msgstr "Управление на календар"
 
-msgctxt "selection:calendar.attendee,status:"
-msgid ""
-msgstr ""
-
-msgctxt "selection:calendar.attendee,status:"
-msgid "Accepted"
-msgstr "Приет"
-
-msgctxt "selection:calendar.attendee,status:"
-msgid "Declined"
-msgstr "Отхвърлен"
-
-msgctxt "selection:calendar.attendee,status:"
-msgid "Delegated"
-msgstr "Делегиран"
-
-msgctxt "selection:calendar.attendee,status:"
-msgid "Needs Action"
-msgstr "Необходимо е действие"
-
-msgctxt "selection:calendar.attendee,status:"
-msgid "Tentative"
-msgstr "Пробен"
-
 msgctxt "selection:calendar.event,classification:"
 msgid "Confidential"
 msgstr "Поверителен"
@@ -946,62 +911,162 @@ msgctxt "selection:calendar.event,transp:"
 msgid "Transparent"
 msgstr "Прозрачен"
 
-msgctxt "selection:calendar.rrule,freq:"
+msgctxt "selection:calendar.event.attendee,status:"
+msgid ""
+msgstr ""
+
+msgctxt "selection:calendar.event.attendee,status:"
+msgid "Accepted"
+msgstr ""
+
+msgctxt "selection:calendar.event.attendee,status:"
+msgid "Declined"
+msgstr ""
+
+msgctxt "selection:calendar.event.attendee,status:"
+msgid "Delegated"
+msgstr ""
+
+msgctxt "selection:calendar.event.attendee,status:"
+msgid "Needs Action"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:calendar.event.attendee,status:"
+msgid "Tentative"
+msgstr "Пробен"
+
+msgctxt "selection:calendar.event.exrule,freq:"
 msgid "Daily"
-msgstr "Ежедневно"
+msgstr ""
 
-msgctxt "selection:calendar.rrule,freq:"
+msgctxt "selection:calendar.event.exrule,freq:"
 msgid "Hourly"
-msgstr "Ежечасно"
+msgstr ""
 
-msgctxt "selection:calendar.rrule,freq:"
+msgctxt "selection:calendar.event.exrule,freq:"
 msgid "Minutely"
-msgstr "Ежеминутно"
+msgstr ""
 
-msgctxt "selection:calendar.rrule,freq:"
+msgctxt "selection:calendar.event.exrule,freq:"
 msgid "Monthly"
-msgstr "Месечно"
+msgstr ""
 
-msgctxt "selection:calendar.rrule,freq:"
+msgctxt "selection:calendar.event.exrule,freq:"
 msgid "Secondly"
-msgstr "Всяка секунда"
+msgstr ""
 
-msgctxt "selection:calendar.rrule,freq:"
+msgctxt "selection:calendar.event.exrule,freq:"
 msgid "Weekly"
-msgstr "Седмично"
+msgstr ""
 
-msgctxt "selection:calendar.rrule,freq:"
+msgctxt "selection:calendar.event.exrule,freq:"
 msgid "Yearly"
-msgstr "Годишно"
+msgstr ""
 
-msgctxt "selection:calendar.rrule,wkst:"
+#, fuzzy
+msgctxt "selection:calendar.event.exrule,wkst:"
 msgid "Friday"
 msgstr "Петък"
 
-msgctxt "selection:calendar.rrule,wkst:"
+#, fuzzy
+msgctxt "selection:calendar.event.exrule,wkst:"
 msgid "Monday"
 msgstr "Понеделник"
 
-msgctxt "selection:calendar.rrule,wkst:"
+#, fuzzy
+msgctxt "selection:calendar.event.exrule,wkst:"
 msgid "Saturday"
 msgstr "Събота"
 
-msgctxt "selection:calendar.rrule,wkst:"
+#, fuzzy
+msgctxt "selection:calendar.event.exrule,wkst:"
 msgid "Sunday"
 msgstr "Неделя"
 
-msgctxt "selection:calendar.rrule,wkst:"
+#, fuzzy
+msgctxt "selection:calendar.event.exrule,wkst:"
 msgid "Thursday"
 msgstr "Четвъртък"
 
-msgctxt "selection:calendar.rrule,wkst:"
+#, fuzzy
+msgctxt "selection:calendar.event.exrule,wkst:"
 msgid "Tuesday"
 msgstr "Вторник"
 
-msgctxt "selection:calendar.rrule,wkst:"
+#, fuzzy
+msgctxt "selection:calendar.event.exrule,wkst:"
 msgid "Wednesday"
 msgstr "Сряда"
 
+msgctxt "selection:calendar.event.rrule,freq:"
+msgid "Daily"
+msgstr ""
+
+msgctxt "selection:calendar.event.rrule,freq:"
+msgid "Hourly"
+msgstr ""
+
+msgctxt "selection:calendar.event.rrule,freq:"
+msgid "Minutely"
+msgstr ""
+
+msgctxt "selection:calendar.event.rrule,freq:"
+msgid "Monthly"
+msgstr ""
+
+msgctxt "selection:calendar.event.rrule,freq:"
+msgid "Secondly"
+msgstr ""
+
+msgctxt "selection:calendar.event.rrule,freq:"
+msgid "Weekly"
+msgstr ""
+
+msgctxt "selection:calendar.event.rrule,freq:"
+msgid "Yearly"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:calendar.event.rrule,wkst:"
+msgid "Friday"
+msgstr "Петък"
+
+#, fuzzy
+msgctxt "selection:calendar.event.rrule,wkst:"
+msgid "Monday"
+msgstr "Понеделник"
+
+#, fuzzy
+msgctxt "selection:calendar.event.rrule,wkst:"
+msgid "Saturday"
+msgstr "Събота"
+
+#, fuzzy
+msgctxt "selection:calendar.event.rrule,wkst:"
+msgid "Sunday"
+msgstr "Неделя"
+
+#, fuzzy
+msgctxt "selection:calendar.event.rrule,wkst:"
+msgid "Thursday"
+msgstr "Четвъртък"
+
+#, fuzzy
+msgctxt "selection:calendar.event.rrule,wkst:"
+msgid "Tuesday"
+msgstr "Вторник"
+
+#, fuzzy
+msgctxt "selection:calendar.event.rrule,wkst:"
+msgid "Wednesday"
+msgstr "Сряда"
+
+#, fuzzy
+msgctxt "view:calendar.calendar:"
+msgid "Access Permissions"
+msgstr "Фактура"
+
 msgctxt "view:calendar.calendar:"
 msgid "Calendar"
 msgstr "Календар"
@@ -1014,10 +1079,6 @@ msgctxt "view:calendar.calendar:"
 msgid "General"
 msgstr "Основен"
 
-msgctxt "view:calendar.calendar:"
-msgid "Security"
-msgstr "Сигурност"
-
 msgctxt "view:calendar.category:"
 msgid "Categories"
 msgstr "Категории"
diff --git a/locale/ca_ES.po b/locale/ca_ES.po
index 5dd0706..07679c6 100644
--- a/locale/ca_ES.po
+++ b/locale/ca_ES.po
@@ -3,132 +3,120 @@ msgid ""
 msgstr "Content-Type: text/plain; charset=utf-8\n"
 
 msgctxt "error:calendar.calendar:"
-msgid "A user can have only one calendar!"
-msgstr "Un usuari només pot tenir un calendari"
+msgid "A user can have only one calendar."
+msgstr "Un usuari només pot tenir un calendari."
 
 msgctxt "error:calendar.calendar:"
-msgid "The name of calendar must be unique!"
-msgstr "El nom del calendari ha de ser únic"
+msgid "Calendar name \"%s\" can not end with .ics"
+msgstr "El nom del calendari \"%s\" no ha de finalitzar amb la extensió .ics"
+
+msgctxt "error:calendar.calendar:"
+msgid "The name of calendar must be unique."
+msgstr "El nom del calendari ha de ser únic."
 
 msgctxt "error:calendar.category:"
-msgid "The name of calendar category must be unique!"
-msgstr "El nom de la categoria del calendari ha de ser únic"
+msgid "The name of calendar category must be unique."
+msgstr "El nom de la categoria del calendari ha de ser únic."
+
+msgctxt "error:calendar.event.exrule:"
+msgid "Invalid \"By Day\" in recurrence rule \"%s\""
+msgstr "El camp \"per dia\" de la regla de recurrència \"%s\" no és correcte."
+
+msgctxt "error:calendar.event.exrule:"
+msgid "Invalid \"By Hour\" in recurrence rule \"%s\""
+msgstr "El camp \"per hora\" de la regla de recurrència \"%s\" no és correcte."
+
+msgctxt "error:calendar.event.exrule:"
+msgid "Invalid \"By Minute\" in recurrence rule \"%s\""
+msgstr "El camp \"per minut\" de la regla de recurrència \"%s\" no és correcte."
+
+msgctxt "error:calendar.event.exrule:"
+msgid "Invalid \"By Month Day\" in recurrence rule \"%s\""
+msgstr "El camp \"per dia del mes\" de la regla de recurrència \"%s\" no és correcte."
+
+msgctxt "error:calendar.event.exrule:"
+msgid "Invalid \"By Month\" in recurrence rule \"%s\""
+msgstr "El camp \"per mes\" de la regla de recurrència \"%s\" no és correcte."
+
+msgctxt "error:calendar.event.exrule:"
+msgid "Invalid \"By Position\" in recurrence rule \"%s\""
+msgstr "El camp \"per ubicació\" de la regla de recurrència \"%s\" no és correcte."
+
+msgctxt "error:calendar.event.exrule:"
+msgid "Invalid \"By Second\" in recurrence rule \"%s\""
+msgstr "El camp \"per segon\" de la regla de recurrència \"%s\" no és correcte."
+
+msgctxt "error:calendar.event.exrule:"
+msgid "Invalid \"By Week Number\" in recurrence rule \"%s\""
+msgstr ""
+"El camp \"per número de la setmana\" de la regla de recurrència \"%s\" no és"
+" correcte."
+
+msgctxt "error:calendar.event.exrule:"
+msgid "Invalid \"By Year Day\" in recurrence rule \"%s\""
+msgstr ""
+"El camp \"per dia de l'any\" de la regla de recurrència \"%s\" no és "
+"correcte."
+
+msgctxt "error:calendar.event.exrule:"
+msgid "Only one of \"until\" and \"count\" can be set."
+msgstr "Defineix un \"fins\" i un \"comptador\"."
+
+msgctxt "error:calendar.event.rrule:"
+msgid "Invalid \"By Day\" in recurrence rule \"%s\""
+msgstr "El camp \"per dia\" de la regla de recurrència \"%s\" no és correcte."
+
+msgctxt "error:calendar.event.rrule:"
+msgid "Invalid \"By Hour\" in recurrence rule \"%s\""
+msgstr "El camp \"per hora\" de la regla de recurrència \"%s\" no és correcte."
+
+msgctxt "error:calendar.event.rrule:"
+msgid "Invalid \"By Minute\" in recurrence rule \"%s\""
+msgstr "El camp \"per minut\" de la regla de recurrència \"%s\" no és correcte."
+
+msgctxt "error:calendar.event.rrule:"
+msgid "Invalid \"By Month Day\" in recurrence rule \"%s\""
+msgstr "El camp \"per dia del mes\" de la regla de recurrència \"%s\" no és correcte."
+
+msgctxt "error:calendar.event.rrule:"
+msgid "Invalid \"By Month\" in recurrence rule \"%s\""
+msgstr "El camp \"per mes\" de la regla de recurrència \"%s\" no és correcte."
+
+msgctxt "error:calendar.event.rrule:"
+msgid "Invalid \"By Position\" in recurrence rule \"%s\""
+msgstr "El camp \"per ubicació\" de la regla de recurrència \"%s\" no és correcte."
+
+msgctxt "error:calendar.event.rrule:"
+msgid "Invalid \"By Second\" in recurrence rule \"%s\""
+msgstr "El camp \"per segon\" de la regla de recurrència \"%s\" no és correcte."
+
+msgctxt "error:calendar.event.rrule:"
+msgid "Invalid \"By Week Number\" in recurrence rule \"%s\""
+msgstr ""
+"El camp \"per número de la setmana\" de la regla de recurrència \"%s\" no és"
+" correcte."
+
+msgctxt "error:calendar.event.rrule:"
+msgid "Invalid \"By Year Day\" in recurrence rule \"%s\""
+msgstr ""
+"El camp \"per dia de l'any\" de la regla de recurrència \"%s\" no és "
+"correcte."
+
+msgctxt "error:calendar.event.rrule:"
+msgid "Only one of \"until\" and \"count\" can be set."
+msgstr "Defineix un \"fins\" i un \"comptador\"."
 
 msgctxt "error:calendar.event:"
-msgid "Recurrence can not be recurrent!"
-msgstr "Una recurrència no pot ser recurrent"
+msgid "Recurrence \"%s\" can not be recurrent."
+msgstr "La recurrència \"%s\" no pot ser recurrent."
 
 msgctxt "error:calendar.event:"
-msgid "UUID and recurrence must be unique in a calendar!"
-msgstr "L'UUID i la recurrència han de ser únics en un calendari"
+msgid "UUID and recurrence must be unique in a calendar."
+msgstr "UUID i la recurrència han de ser únic en el calendari."
 
 msgctxt "error:calendar.location:"
-msgid "The name of calendar location must be unique!"
-msgstr "El nom de la ubicació del calendari ha de ser únic"
-
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Day\""
-msgstr "Invàlid «per dia»"
-
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Hour\""
-msgstr "Invàlid «per dia»"
-
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Minute\""
-msgstr "Invàlid «per minut»"
-
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Month Day\""
-msgstr "Invàlid «per dia del mes»"
-
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Month\""
-msgstr "Invàlid «per mes»"
-
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Position\""
-msgstr "Invàlid «per posició»"
-
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Second\""
-msgstr "Invàlid «per segons»"
-
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Week Number\""
-msgstr "Invàlid «per nombre de setmana»"
-
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Year Day\""
-msgstr "Invàlid «per dia de l'any»"
-
-msgctxt "error:calendar.rrule:"
-msgid "Only one of \"until\" and \"count\" can be set!"
-msgstr "Només es pot usar o «Fins a» o «Nombre de vegades»"
-
-msgctxt "field:calendar.alarm,create_date:"
-msgid "Create Date"
-msgstr "Data creació"
-
-msgctxt "field:calendar.alarm,create_uid:"
-msgid "Create User"
-msgstr "Usuari creació"
-
-msgctxt "field:calendar.alarm,id:"
-msgid "ID"
-msgstr "ID"
-
-msgctxt "field:calendar.alarm,rec_name:"
-msgid "Name"
-msgstr "Nom"
-
-msgctxt "field:calendar.alarm,valarm:"
-msgid "valarm"
-msgstr "valarm"
-
-msgctxt "field:calendar.alarm,write_date:"
-msgid "Write Date"
-msgstr "Data modificació"
-
-msgctxt "field:calendar.alarm,write_uid:"
-msgid "Write User"
-msgstr "Usuari modificació"
-
-msgctxt "field:calendar.attendee,attendee:"
-msgid "attendee"
-msgstr "assistent"
-
-msgctxt "field:calendar.attendee,create_date:"
-msgid "Create Date"
-msgstr "Data creació"
-
-msgctxt "field:calendar.attendee,create_uid:"
-msgid "Create User"
-msgstr "Usuari creació"
-
-msgctxt "field:calendar.attendee,email:"
-msgid "Email"
-msgstr "Correu electrònic"
-
-msgctxt "field:calendar.attendee,id:"
-msgid "ID"
-msgstr "ID"
-
-msgctxt "field:calendar.attendee,rec_name:"
-msgid "Name"
-msgstr "Nom"
-
-msgctxt "field:calendar.attendee,status:"
-msgid "Participation Status"
-msgstr "Estat de participació"
-
-msgctxt "field:calendar.attendee,write_date:"
-msgid "Write Date"
-msgstr "Data modificació"
-
-msgctxt "field:calendar.attendee,write_uid:"
-msgid "Write User"
-msgstr "Usuari modificació"
+msgid "The name of calendar location must be unique."
+msgstr "El nom de la ubicació del calendari ha de ser únic."
 
 msgctxt "field:calendar.calendar,create_date:"
 msgid "Create Date"
@@ -266,38 +254,6 @@ msgctxt "field:calendar.category,write_uid:"
 msgid "Write User"
 msgstr "Usuari modificació"
 
-msgctxt "field:calendar.date,create_date:"
-msgid "Create Date"
-msgstr "Data creació"
-
-msgctxt "field:calendar.date,create_uid:"
-msgid "Create User"
-msgstr "Usuari creació"
-
-msgctxt "field:calendar.date,date:"
-msgid "Is Date"
-msgstr "És data"
-
-msgctxt "field:calendar.date,datetime:"
-msgid "Date"
-msgstr "Data"
-
-msgctxt "field:calendar.date,id:"
-msgid "ID"
-msgstr "ID"
-
-msgctxt "field:calendar.date,rec_name:"
-msgid "Name"
-msgstr "Nom"
-
-msgctxt "field:calendar.date,write_date:"
-msgid "Write Date"
-msgstr "Data modificació"
-
-msgctxt "field:calendar.date,write_uid:"
-msgid "Write User"
-msgstr "Usuari modificació"
-
 msgctxt "field:calendar.event,alarms:"
 msgid "Alarms"
 msgstr "Alarmes"
@@ -466,10 +422,6 @@ msgctxt "field:calendar.event-calendar.category,write_uid:"
 msgid "Write User"
 msgstr "Usuari modificació"
 
-msgctxt "field:calendar.event.alarm,calendar_alarm:"
-msgid "Calendar Alarm"
-msgstr "Alarma del calendari"
-
 msgctxt "field:calendar.event.alarm,create_date:"
 msgid "Create Date"
 msgstr "Data creació"
@@ -490,6 +442,10 @@ msgctxt "field:calendar.event.alarm,rec_name:"
 msgid "Name"
 msgstr "Nom"
 
+msgctxt "field:calendar.event.alarm,valarm:"
+msgid "valarm"
+msgstr "valarm"
+
 msgctxt "field:calendar.event.alarm,write_date:"
 msgid "Write Date"
 msgstr "Data modificació"
@@ -498,9 +454,9 @@ msgctxt "field:calendar.event.alarm,write_uid:"
 msgid "Write User"
 msgstr "Usuari modificació"
 
-msgctxt "field:calendar.event.attendee,calendar_attendee:"
-msgid "Calendar Attendee"
-msgstr "Calendari d'assistents"
+msgctxt "field:calendar.event.attendee,attendee:"
+msgid "attendee"
+msgstr "assistent"
 
 msgctxt "field:calendar.event.attendee,create_date:"
 msgid "Create Date"
@@ -510,6 +466,10 @@ msgctxt "field:calendar.event.attendee,create_uid:"
 msgid "Create User"
 msgstr "Usuari creació"
 
+msgctxt "field:calendar.event.attendee,email:"
+msgid "Email"
+msgstr "Email"
+
 msgctxt "field:calendar.event.attendee,event:"
 msgid "Event"
 msgstr "Esdeveniment"
@@ -522,6 +482,10 @@ msgctxt "field:calendar.event.attendee,rec_name:"
 msgid "Name"
 msgstr "Nom"
 
+msgctxt "field:calendar.event.attendee,status:"
+msgid "Participation Status"
+msgstr "Estat de participacions"
+
 msgctxt "field:calendar.event.attendee,write_date:"
 msgid "Write Date"
 msgstr "Data modificació"
@@ -530,10 +494,6 @@ msgctxt "field:calendar.event.attendee,write_uid:"
 msgid "Write User"
 msgstr "Usuari modificació"
 
-msgctxt "field:calendar.event.exdate,calendar_date:"
-msgid "Calendar Date"
-msgstr "Data calendari"
-
 msgctxt "field:calendar.event.exdate,create_date:"
 msgid "Create Date"
 msgstr "Data creació"
@@ -542,6 +502,14 @@ msgctxt "field:calendar.event.exdate,create_uid:"
 msgid "Create User"
 msgstr "Usuari creació"
 
+msgctxt "field:calendar.event.exdate,date:"
+msgid "Is Date"
+msgstr "Es una data"
+
+msgctxt "field:calendar.event.exdate,datetime:"
+msgid "Date"
+msgstr "Data"
+
 msgctxt "field:calendar.event.exdate,event:"
 msgid "Event"
 msgstr "Esdeveniment"
@@ -562,9 +530,45 @@ msgctxt "field:calendar.event.exdate,write_uid:"
 msgid "Write User"
 msgstr "Usuari modificació"
 
-msgctxt "field:calendar.event.exrule,calendar_rrule:"
-msgid "Calendar RRule"
-msgstr "Regla de recurrència"
+msgctxt "field:calendar.event.exrule,byday:"
+msgid "By Day"
+msgstr "Per dia"
+
+msgctxt "field:calendar.event.exrule,byhour:"
+msgid "By Hour"
+msgstr "Per hora"
+
+msgctxt "field:calendar.event.exrule,byminute:"
+msgid "By Minute"
+msgstr "Per minut"
+
+msgctxt "field:calendar.event.exrule,bymonth:"
+msgid "By Month"
+msgstr "Per mes"
+
+msgctxt "field:calendar.event.exrule,bymonthday:"
+msgid "By Month Day"
+msgstr "Per dia del mes"
+
+msgctxt "field:calendar.event.exrule,bysecond:"
+msgid "By Second"
+msgstr "Per segon"
+
+msgctxt "field:calendar.event.exrule,bysetpos:"
+msgid "By Position"
+msgstr "Per ubicació"
+
+msgctxt "field:calendar.event.exrule,byweekno:"
+msgid "By Week Number"
+msgstr "Per número de la setmana"
+
+msgctxt "field:calendar.event.exrule,byyearday:"
+msgid "By Year Day"
+msgstr "Per dia de l'any"
+
+msgctxt "field:calendar.event.exrule,count:"
+msgid "Count"
+msgstr "Contador"
 
 msgctxt "field:calendar.event.exrule,create_date:"
 msgid "Create Date"
@@ -578,14 +582,34 @@ msgctxt "field:calendar.event.exrule,event:"
 msgid "Event"
 msgstr "Esdeveniment"
 
+msgctxt "field:calendar.event.exrule,freq:"
+msgid "Frequency"
+msgstr "Freqüència"
+
 msgctxt "field:calendar.event.exrule,id:"
 msgid "ID"
 msgstr "ID"
 
+msgctxt "field:calendar.event.exrule,interval:"
+msgid "Interval"
+msgstr "Intèrval"
+
 msgctxt "field:calendar.event.exrule,rec_name:"
 msgid "Name"
 msgstr "Nom"
 
+msgctxt "field:calendar.event.exrule,until:"
+msgid "Until Date"
+msgstr "Fins a la data"
+
+msgctxt "field:calendar.event.exrule,until_date:"
+msgid "Is Date"
+msgstr "Es una data"
+
+msgctxt "field:calendar.event.exrule,wkst:"
+msgid "Week Day"
+msgstr "Dia de la setmana"
+
 msgctxt "field:calendar.event.exrule,write_date:"
 msgid "Write Date"
 msgstr "Data modificació"
@@ -594,10 +618,6 @@ msgctxt "field:calendar.event.exrule,write_uid:"
 msgid "Write User"
 msgstr "Usuari modificació"
 
-msgctxt "field:calendar.event.rdate,calendar_date:"
-msgid "Calendar Date"
-msgstr "Data calendari"
-
 msgctxt "field:calendar.event.rdate,create_date:"
 msgid "Create Date"
 msgstr "Data creació"
@@ -606,6 +626,14 @@ msgctxt "field:calendar.event.rdate,create_uid:"
 msgid "Create User"
 msgstr "Usuari creació"
 
+msgctxt "field:calendar.event.rdate,date:"
+msgid "Is Date"
+msgstr "Es una data"
+
+msgctxt "field:calendar.event.rdate,datetime:"
+msgid "Date"
+msgstr "Data"
+
 msgctxt "field:calendar.event.rdate,event:"
 msgid "Event"
 msgstr "Esdeveniment"
@@ -626,147 +654,119 @@ msgctxt "field:calendar.event.rdate,write_uid:"
 msgid "Write User"
 msgstr "Usuari modificació"
 
-msgctxt "field:calendar.event.rrule,calendar_rrule:"
-msgid "Calendar RRule"
-msgstr "Regla de recurrència"
-
-msgctxt "field:calendar.event.rrule,create_date:"
-msgid "Create Date"
-msgstr "Data creació"
-
-msgctxt "field:calendar.event.rrule,create_uid:"
-msgid "Create User"
-msgstr "Usuari creació"
-
-msgctxt "field:calendar.event.rrule,event:"
-msgid "Event"
-msgstr "Esdeveniment"
-
-msgctxt "field:calendar.event.rrule,id:"
-msgid "ID"
-msgstr "ID"
-
-msgctxt "field:calendar.event.rrule,rec_name:"
-msgid "Name"
-msgstr "Nom"
-
-msgctxt "field:calendar.event.rrule,write_date:"
-msgid "Write Date"
-msgstr "Data modificació"
-
-msgctxt "field:calendar.event.rrule,write_uid:"
-msgid "Write User"
-msgstr "Usuari modificació"
-
-msgctxt "field:calendar.location,create_date:"
-msgid "Create Date"
-msgstr "Data creació"
-
-msgctxt "field:calendar.location,create_uid:"
-msgid "Create User"
-msgstr "Usuari creació"
-
-msgctxt "field:calendar.location,id:"
-msgid "ID"
-msgstr "ID"
-
-msgctxt "field:calendar.location,name:"
-msgid "Name"
-msgstr "Nom"
-
-msgctxt "field:calendar.location,rec_name:"
-msgid "Name"
-msgstr "Nom"
-
-msgctxt "field:calendar.location,write_date:"
-msgid "Write Date"
-msgstr "Data modificació"
-
-msgctxt "field:calendar.location,write_uid:"
-msgid "Write User"
-msgstr "Usuari modificació"
-
-msgctxt "field:calendar.rrule,byday:"
+msgctxt "field:calendar.event.rrule,byday:"
 msgid "By Day"
 msgstr "Per dia"
 
-msgctxt "field:calendar.rrule,byhour:"
+msgctxt "field:calendar.event.rrule,byhour:"
 msgid "By Hour"
 msgstr "Per hora"
 
-msgctxt "field:calendar.rrule,byminute:"
+msgctxt "field:calendar.event.rrule,byminute:"
 msgid "By Minute"
 msgstr "Per minut"
 
-msgctxt "field:calendar.rrule,bymonth:"
+msgctxt "field:calendar.event.rrule,bymonth:"
 msgid "By Month"
 msgstr "Per mes"
 
-msgctxt "field:calendar.rrule,bymonthday:"
+msgctxt "field:calendar.event.rrule,bymonthday:"
 msgid "By Month Day"
 msgstr "Per dia del mes"
 
-msgctxt "field:calendar.rrule,bysecond:"
+msgctxt "field:calendar.event.rrule,bysecond:"
 msgid "By Second"
 msgstr "Per segon"
 
-msgctxt "field:calendar.rrule,bysetpos:"
+msgctxt "field:calendar.event.rrule,bysetpos:"
 msgid "By Position"
-msgstr "Per posició"
+msgstr "Per ubicació"
 
-msgctxt "field:calendar.rrule,byweekno:"
+msgctxt "field:calendar.event.rrule,byweekno:"
 msgid "By Week Number"
-msgstr "Per dia de la setmana"
+msgstr "Per número de la setmana"
 
-msgctxt "field:calendar.rrule,byyearday:"
+msgctxt "field:calendar.event.rrule,byyearday:"
 msgid "By Year Day"
 msgstr "Per dia de l'any"
 
-msgctxt "field:calendar.rrule,count:"
+msgctxt "field:calendar.event.rrule,count:"
 msgid "Count"
-msgstr "Nombre de vegades"
+msgstr "Contador"
 
-msgctxt "field:calendar.rrule,create_date:"
+msgctxt "field:calendar.event.rrule,create_date:"
 msgid "Create Date"
 msgstr "Data creació"
 
-msgctxt "field:calendar.rrule,create_uid:"
+msgctxt "field:calendar.event.rrule,create_uid:"
 msgid "Create User"
 msgstr "Usuari creació"
 
-msgctxt "field:calendar.rrule,freq:"
+msgctxt "field:calendar.event.rrule,event:"
+msgid "Event"
+msgstr "Esdeveniment"
+
+msgctxt "field:calendar.event.rrule,freq:"
 msgid "Frequency"
 msgstr "Freqüència"
 
-msgctxt "field:calendar.rrule,id:"
+msgctxt "field:calendar.event.rrule,id:"
 msgid "ID"
 msgstr "ID"
 
-msgctxt "field:calendar.rrule,interval:"
+msgctxt "field:calendar.event.rrule,interval:"
 msgid "Interval"
-msgstr "Interval"
+msgstr "Intèrval"
 
-msgctxt "field:calendar.rrule,rec_name:"
+msgctxt "field:calendar.event.rrule,rec_name:"
 msgid "Name"
 msgstr "Nom"
 
-msgctxt "field:calendar.rrule,until:"
+msgctxt "field:calendar.event.rrule,until:"
 msgid "Until Date"
 msgstr "Fins a la data"
 
-msgctxt "field:calendar.rrule,until_date:"
+msgctxt "field:calendar.event.rrule,until_date:"
 msgid "Is Date"
-msgstr "És data"
+msgstr "Es una data"
 
-msgctxt "field:calendar.rrule,wkst:"
+msgctxt "field:calendar.event.rrule,wkst:"
 msgid "Week Day"
 msgstr "Dia de la setmana"
 
-msgctxt "field:calendar.rrule,write_date:"
+msgctxt "field:calendar.event.rrule,write_date:"
+msgid "Write Date"
+msgstr "Data modificació"
+
+msgctxt "field:calendar.event.rrule,write_uid:"
+msgid "Write User"
+msgstr "Usuari modificació"
+
+msgctxt "field:calendar.location,create_date:"
+msgid "Create Date"
+msgstr "Data creació"
+
+msgctxt "field:calendar.location,create_uid:"
+msgid "Create User"
+msgstr "Usuari creació"
+
+msgctxt "field:calendar.location,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.location,name:"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:calendar.location,rec_name:"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:calendar.location,write_date:"
 msgid "Write Date"
 msgstr "Data modificació"
 
-msgctxt "field:calendar.rrule,write_uid:"
+msgctxt "field:calendar.location,write_uid:"
 msgid "Write User"
 msgstr "Usuari modificació"
 
@@ -778,25 +778,27 @@ msgctxt "help:calendar.calendar,owner:"
 msgid "The user must have an email"
 msgstr "L'usuari ha de tenir un correu electrònic"
 
-msgctxt "help:calendar.date,date:"
-msgid "Ignore time of field \"Date\", but handle as date only."
-msgstr "Ignora l'hora del camp \"Data\" i tracta només la data."
-
 msgctxt "help:calendar.event,uuid:"
 msgid "Universally Unique Identifier"
 msgstr "Identificador universal únic"
 
-msgctxt "help:calendar.rrule,until_date:"
+msgctxt "help:calendar.event.exdate,date:"
+msgid "Ignore time of field \"Date\", but handle as date only."
+msgstr "Ingnora la hora del camp \"Data\", però utilitza com a única data."
+
+msgctxt "help:calendar.event.exrule,until_date:"
 msgid "Ignore time of field \"Until Date\", but handle as date only."
-msgstr "Ignora l'hora del camp «Fins a la data» i tracta'l com a data."
+msgstr ""
+"Ingnora la hora del camp \"Fins a la data\", però utilitza com a única data."
 
-msgctxt "model:calendar.alarm,name:"
-msgid "Alarm"
-msgstr "Alarma"
+msgctxt "help:calendar.event.rdate,date:"
+msgid "Ignore time of field \"Date\", but handle as date only."
+msgstr "Ingnora la hora del camp \"Data\", però utilitza com a única data."
 
-msgctxt "model:calendar.attendee,name:"
-msgid "Attendee"
-msgstr "Assistent"
+msgctxt "help:calendar.event.rrule,until_date:"
+msgid "Ignore time of field \"Until Date\", but handle as date only."
+msgstr ""
+"Ingnora la hora del camp \"Fins a la data\", però utilitza com a única data."
 
 msgctxt "model:calendar.calendar,name:"
 msgid "Calendar"
@@ -814,10 +816,6 @@ msgctxt "model:calendar.category,name:"
 msgid "Category"
 msgstr "Categoria"
 
-msgctxt "model:calendar.date,name:"
-msgid "Calendar Date"
-msgstr "Data calendari"
-
 msgctxt "model:calendar.event,name:"
 msgid "Event"
 msgstr "Esdeveniment"
@@ -854,10 +852,6 @@ msgctxt "model:calendar.location,name:"
 msgid "Location"
 msgstr "Ubicació"
 
-msgctxt "model:calendar.rrule,name:"
-msgid "Recurrence Rule"
-msgstr "Regla de recurrència"
-
 msgctxt "model:ir.action,name:act_calendar_form"
 msgid "Calendars"
 msgstr "Calendaris"
@@ -886,31 +880,6 @@ msgctxt "model:res.group,name:group_calendar_admin"
 msgid "Calendar Administration"
 msgstr "Administració de calendari"
 
-#, fuzzy
-msgctxt "selection:calendar.attendee,status:"
-msgid ""
-msgstr "Recreat"
-
-msgctxt "selection:calendar.attendee,status:"
-msgid "Accepted"
-msgstr "Acceptada"
-
-msgctxt "selection:calendar.attendee,status:"
-msgid "Declined"
-msgstr "Refusat"
-
-msgctxt "selection:calendar.attendee,status:"
-msgid "Delegated"
-msgstr "Delegada"
-
-msgctxt "selection:calendar.attendee,status:"
-msgid "Needs Action"
-msgstr "Necessita una acció"
-
-msgctxt "selection:calendar.attendee,status:"
-msgid "Tentative"
-msgstr "Temptativa"
-
 msgctxt "selection:calendar.event,classification:"
 msgid "Confidential"
 msgstr "Confidencial"
@@ -923,10 +892,9 @@ msgctxt "selection:calendar.event,classification:"
 msgid "Public"
 msgstr "Públic"
 
-#, fuzzy
 msgctxt "selection:calendar.event,status:"
 msgid ""
-msgstr "Recreat"
+msgstr " "
 
 msgctxt "selection:calendar.event,status:"
 msgid "Cancelled"
@@ -948,63 +916,147 @@ msgctxt "selection:calendar.event,transp:"
 msgid "Transparent"
 msgstr "Transparent"
 
-msgctxt "selection:calendar.rrule,freq:"
+msgctxt "selection:calendar.event.attendee,status:"
+msgid ""
+msgstr " "
+
+msgctxt "selection:calendar.event.attendee,status:"
+msgid "Accepted"
+msgstr "Acceptat"
+
+msgctxt "selection:calendar.event.attendee,status:"
+msgid "Declined"
+msgstr "Refusar"
+
+msgctxt "selection:calendar.event.attendee,status:"
+msgid "Delegated"
+msgstr "Delegar"
+
+msgctxt "selection:calendar.event.attendee,status:"
+msgid "Needs Action"
+msgstr "Necessitat Acció"
+
+msgctxt "selection:calendar.event.attendee,status:"
+msgid "Tentative"
+msgstr "Temptatiu"
+
+msgctxt "selection:calendar.event.exrule,freq:"
+msgid "Daily"
+msgstr "Diariament"
+
+msgctxt "selection:calendar.event.exrule,freq:"
+msgid "Hourly"
+msgstr "Cada hora"
+
+msgctxt "selection:calendar.event.exrule,freq:"
+msgid "Minutely"
+msgstr "Cada minut"
+
+msgctxt "selection:calendar.event.exrule,freq:"
+msgid "Monthly"
+msgstr "Mensualment"
+
+msgctxt "selection:calendar.event.exrule,freq:"
+msgid "Secondly"
+msgstr "Cada segon"
+
+msgctxt "selection:calendar.event.exrule,freq:"
+msgid "Weekly"
+msgstr "Setmanalment"
+
+msgctxt "selection:calendar.event.exrule,freq:"
+msgid "Yearly"
+msgstr "Anualment"
+
+msgctxt "selection:calendar.event.exrule,wkst:"
+msgid "Friday"
+msgstr "Divendres"
+
+msgctxt "selection:calendar.event.exrule,wkst:"
+msgid "Monday"
+msgstr "Dilluns"
+
+msgctxt "selection:calendar.event.exrule,wkst:"
+msgid "Saturday"
+msgstr "Dissabte"
+
+msgctxt "selection:calendar.event.exrule,wkst:"
+msgid "Sunday"
+msgstr "Diumenge"
+
+msgctxt "selection:calendar.event.exrule,wkst:"
+msgid "Thursday"
+msgstr "Dijous"
+
+msgctxt "selection:calendar.event.exrule,wkst:"
+msgid "Tuesday"
+msgstr "Dimarts"
+
+msgctxt "selection:calendar.event.exrule,wkst:"
+msgid "Wednesday"
+msgstr "Dimecres"
+
+msgctxt "selection:calendar.event.rrule,freq:"
 msgid "Daily"
-msgstr "Diàriament"
+msgstr "Diariament"
 
-msgctxt "selection:calendar.rrule,freq:"
+msgctxt "selection:calendar.event.rrule,freq:"
 msgid "Hourly"
 msgstr "Cada hora"
 
-msgctxt "selection:calendar.rrule,freq:"
+msgctxt "selection:calendar.event.rrule,freq:"
 msgid "Minutely"
 msgstr "Cada minut"
 
-msgctxt "selection:calendar.rrule,freq:"
+msgctxt "selection:calendar.event.rrule,freq:"
 msgid "Monthly"
 msgstr "Mensualment"
 
-msgctxt "selection:calendar.rrule,freq:"
+msgctxt "selection:calendar.event.rrule,freq:"
 msgid "Secondly"
 msgstr "Cada segon"
 
-msgctxt "selection:calendar.rrule,freq:"
+msgctxt "selection:calendar.event.rrule,freq:"
 msgid "Weekly"
 msgstr "Setmanalment"
 
-msgctxt "selection:calendar.rrule,freq:"
+msgctxt "selection:calendar.event.rrule,freq:"
 msgid "Yearly"
 msgstr "Anualment"
 
-msgctxt "selection:calendar.rrule,wkst:"
+msgctxt "selection:calendar.event.rrule,wkst:"
 msgid "Friday"
 msgstr "Divendres"
 
-msgctxt "selection:calendar.rrule,wkst:"
+msgctxt "selection:calendar.event.rrule,wkst:"
 msgid "Monday"
 msgstr "Dilluns"
 
-msgctxt "selection:calendar.rrule,wkst:"
+msgctxt "selection:calendar.event.rrule,wkst:"
 msgid "Saturday"
 msgstr "Dissabte"
 
-msgctxt "selection:calendar.rrule,wkst:"
+msgctxt "selection:calendar.event.rrule,wkst:"
 msgid "Sunday"
 msgstr "Diumenge"
 
-msgctxt "selection:calendar.rrule,wkst:"
+msgctxt "selection:calendar.event.rrule,wkst:"
 msgid "Thursday"
 msgstr "Dijous"
 
-msgctxt "selection:calendar.rrule,wkst:"
+msgctxt "selection:calendar.event.rrule,wkst:"
 msgid "Tuesday"
 msgstr "Dimarts"
 
-msgctxt "selection:calendar.rrule,wkst:"
+msgctxt "selection:calendar.event.rrule,wkst:"
 msgid "Wednesday"
 msgstr "Dimecres"
 
 msgctxt "view:calendar.calendar:"
+msgid "Access Permissions"
+msgstr "Permisos d'accés"
+
+msgctxt "view:calendar.calendar:"
 msgid "Calendar"
 msgstr "Calendari"
 
@@ -1016,10 +1068,6 @@ msgctxt "view:calendar.calendar:"
 msgid "General"
 msgstr "General"
 
-msgctxt "view:calendar.calendar:"
-msgid "Security"
-msgstr "Seguretat"
-
 msgctxt "view:calendar.category:"
 msgid "Categories"
 msgstr "Categories"
diff --git a/locale/cs_CZ.po b/locale/cs_CZ.po
index 4d23715..2a615b2 100644
--- a/locale/cs_CZ.po
+++ b/locale/cs_CZ.po
@@ -3,131 +3,111 @@ msgid ""
 msgstr "Content-Type: text/plain; charset=utf-8\n"
 
 msgctxt "error:calendar.calendar:"
-msgid "A user can have only one calendar!"
+msgid "A user can have only one calendar."
 msgstr ""
 
 msgctxt "error:calendar.calendar:"
-msgid "The name of calendar must be unique!"
+msgid "Calendar name \"%s\" can not end with .ics"
 msgstr ""
 
-msgctxt "error:calendar.category:"
-msgid "The name of calendar category must be unique!"
-msgstr ""
-
-msgctxt "error:calendar.event:"
-msgid "Recurrence can not be recurrent!"
-msgstr ""
-
-msgctxt "error:calendar.event:"
-msgid "UUID and recurrence must be unique in a calendar!"
+msgctxt "error:calendar.calendar:"
+msgid "The name of calendar must be unique."
 msgstr ""
 
-msgctxt "error:calendar.location:"
-msgid "The name of calendar location must be unique!"
+msgctxt "error:calendar.category:"
+msgid "The name of calendar category must be unique."
 msgstr ""
 
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Day\""
+msgctxt "error:calendar.event.exrule:"
+msgid "Invalid \"By Day\" in recurrence rule \"%s\""
 msgstr ""
 
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Hour\""
+msgctxt "error:calendar.event.exrule:"
+msgid "Invalid \"By Hour\" in recurrence rule \"%s\""
 msgstr ""
 
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Minute\""
+msgctxt "error:calendar.event.exrule:"
+msgid "Invalid \"By Minute\" in recurrence rule \"%s\""
 msgstr ""
 
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Month Day\""
+msgctxt "error:calendar.event.exrule:"
+msgid "Invalid \"By Month Day\" in recurrence rule \"%s\""
 msgstr ""
 
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Month\""
+msgctxt "error:calendar.event.exrule:"
+msgid "Invalid \"By Month\" in recurrence rule \"%s\""
 msgstr ""
 
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Position\""
+msgctxt "error:calendar.event.exrule:"
+msgid "Invalid \"By Position\" in recurrence rule \"%s\""
 msgstr ""
 
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Second\""
+msgctxt "error:calendar.event.exrule:"
+msgid "Invalid \"By Second\" in recurrence rule \"%s\""
 msgstr ""
 
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Week Number\""
+msgctxt "error:calendar.event.exrule:"
+msgid "Invalid \"By Week Number\" in recurrence rule \"%s\""
 msgstr ""
 
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Year Day\""
+msgctxt "error:calendar.event.exrule:"
+msgid "Invalid \"By Year Day\" in recurrence rule \"%s\""
 msgstr ""
 
-msgctxt "error:calendar.rrule:"
-msgid "Only one of \"until\" and \"count\" can be set!"
+msgctxt "error:calendar.event.exrule:"
+msgid "Only one of \"until\" and \"count\" can be set."
 msgstr ""
 
-msgctxt "field:calendar.alarm,create_date:"
-msgid "Create Date"
+msgctxt "error:calendar.event.rrule:"
+msgid "Invalid \"By Day\" in recurrence rule \"%s\""
 msgstr ""
 
-msgctxt "field:calendar.alarm,create_uid:"
-msgid "Create User"
+msgctxt "error:calendar.event.rrule:"
+msgid "Invalid \"By Hour\" in recurrence rule \"%s\""
 msgstr ""
 
-msgctxt "field:calendar.alarm,id:"
-msgid "ID"
+msgctxt "error:calendar.event.rrule:"
+msgid "Invalid \"By Minute\" in recurrence rule \"%s\""
 msgstr ""
 
-msgctxt "field:calendar.alarm,rec_name:"
-msgid "Name"
+msgctxt "error:calendar.event.rrule:"
+msgid "Invalid \"By Month Day\" in recurrence rule \"%s\""
 msgstr ""
 
-msgctxt "field:calendar.alarm,valarm:"
-msgid "valarm"
+msgctxt "error:calendar.event.rrule:"
+msgid "Invalid \"By Month\" in recurrence rule \"%s\""
 msgstr ""
 
-msgctxt "field:calendar.alarm,write_date:"
-msgid "Write Date"
+msgctxt "error:calendar.event.rrule:"
+msgid "Invalid \"By Position\" in recurrence rule \"%s\""
 msgstr ""
 
-msgctxt "field:calendar.alarm,write_uid:"
-msgid "Write User"
+msgctxt "error:calendar.event.rrule:"
+msgid "Invalid \"By Second\" in recurrence rule \"%s\""
 msgstr ""
 
-msgctxt "field:calendar.attendee,attendee:"
-msgid "attendee"
+msgctxt "error:calendar.event.rrule:"
+msgid "Invalid \"By Week Number\" in recurrence rule \"%s\""
 msgstr ""
 
-msgctxt "field:calendar.attendee,create_date:"
-msgid "Create Date"
+msgctxt "error:calendar.event.rrule:"
+msgid "Invalid \"By Year Day\" in recurrence rule \"%s\""
 msgstr ""
 
-msgctxt "field:calendar.attendee,create_uid:"
-msgid "Create User"
+msgctxt "error:calendar.event.rrule:"
+msgid "Only one of \"until\" and \"count\" can be set."
 msgstr ""
 
-msgctxt "field:calendar.attendee,email:"
-msgid "Email"
-msgstr ""
-
-msgctxt "field:calendar.attendee,id:"
-msgid "ID"
-msgstr ""
-
-msgctxt "field:calendar.attendee,rec_name:"
-msgid "Name"
-msgstr ""
-
-msgctxt "field:calendar.attendee,status:"
-msgid "Participation Status"
+msgctxt "error:calendar.event:"
+msgid "Recurrence \"%s\" can not be recurrent."
 msgstr ""
 
-msgctxt "field:calendar.attendee,write_date:"
-msgid "Write Date"
+msgctxt "error:calendar.event:"
+msgid "UUID and recurrence must be unique in a calendar."
 msgstr ""
 
-msgctxt "field:calendar.attendee,write_uid:"
-msgid "Write User"
+msgctxt "error:calendar.location:"
+msgid "The name of calendar location must be unique."
 msgstr ""
 
 msgctxt "field:calendar.calendar,create_date:"
@@ -266,38 +246,6 @@ msgctxt "field:calendar.category,write_uid:"
 msgid "Write User"
 msgstr ""
 
-msgctxt "field:calendar.date,create_date:"
-msgid "Create Date"
-msgstr ""
-
-msgctxt "field:calendar.date,create_uid:"
-msgid "Create User"
-msgstr ""
-
-msgctxt "field:calendar.date,date:"
-msgid "Is Date"
-msgstr ""
-
-msgctxt "field:calendar.date,datetime:"
-msgid "Date"
-msgstr ""
-
-msgctxt "field:calendar.date,id:"
-msgid "ID"
-msgstr ""
-
-msgctxt "field:calendar.date,rec_name:"
-msgid "Name"
-msgstr ""
-
-msgctxt "field:calendar.date,write_date:"
-msgid "Write Date"
-msgstr ""
-
-msgctxt "field:calendar.date,write_uid:"
-msgid "Write User"
-msgstr ""
-
 msgctxt "field:calendar.event,alarms:"
 msgid "Alarms"
 msgstr ""
@@ -466,10 +414,6 @@ msgctxt "field:calendar.event-calendar.category,write_uid:"
 msgid "Write User"
 msgstr ""
 
-msgctxt "field:calendar.event.alarm,calendar_alarm:"
-msgid "Calendar Alarm"
-msgstr ""
-
 msgctxt "field:calendar.event.alarm,create_date:"
 msgid "Create Date"
 msgstr ""
@@ -490,6 +434,10 @@ msgctxt "field:calendar.event.alarm,rec_name:"
 msgid "Name"
 msgstr ""
 
+msgctxt "field:calendar.event.alarm,valarm:"
+msgid "valarm"
+msgstr ""
+
 msgctxt "field:calendar.event.alarm,write_date:"
 msgid "Write Date"
 msgstr ""
@@ -498,8 +446,8 @@ msgctxt "field:calendar.event.alarm,write_uid:"
 msgid "Write User"
 msgstr ""
 
-msgctxt "field:calendar.event.attendee,calendar_attendee:"
-msgid "Calendar Attendee"
+msgctxt "field:calendar.event.attendee,attendee:"
+msgid "attendee"
 msgstr ""
 
 msgctxt "field:calendar.event.attendee,create_date:"
@@ -510,6 +458,10 @@ msgctxt "field:calendar.event.attendee,create_uid:"
 msgid "Create User"
 msgstr ""
 
+msgctxt "field:calendar.event.attendee,email:"
+msgid "Email"
+msgstr ""
+
 msgctxt "field:calendar.event.attendee,event:"
 msgid "Event"
 msgstr ""
@@ -522,6 +474,10 @@ msgctxt "field:calendar.event.attendee,rec_name:"
 msgid "Name"
 msgstr ""
 
+msgctxt "field:calendar.event.attendee,status:"
+msgid "Participation Status"
+msgstr ""
+
 msgctxt "field:calendar.event.attendee,write_date:"
 msgid "Write Date"
 msgstr ""
@@ -530,10 +486,6 @@ msgctxt "field:calendar.event.attendee,write_uid:"
 msgid "Write User"
 msgstr ""
 
-msgctxt "field:calendar.event.exdate,calendar_date:"
-msgid "Calendar Date"
-msgstr ""
-
 msgctxt "field:calendar.event.exdate,create_date:"
 msgid "Create Date"
 msgstr ""
@@ -542,6 +494,14 @@ msgctxt "field:calendar.event.exdate,create_uid:"
 msgid "Create User"
 msgstr ""
 
+msgctxt "field:calendar.event.exdate,date:"
+msgid "Is Date"
+msgstr ""
+
+msgctxt "field:calendar.event.exdate,datetime:"
+msgid "Date"
+msgstr ""
+
 msgctxt "field:calendar.event.exdate,event:"
 msgid "Event"
 msgstr ""
@@ -562,211 +522,243 @@ msgctxt "field:calendar.event.exdate,write_uid:"
 msgid "Write User"
 msgstr ""
 
-msgctxt "field:calendar.event.exrule,calendar_rrule:"
-msgid "Calendar RRule"
+msgctxt "field:calendar.event.exrule,byday:"
+msgid "By Day"
 msgstr ""
 
-msgctxt "field:calendar.event.exrule,create_date:"
-msgid "Create Date"
+msgctxt "field:calendar.event.exrule,byhour:"
+msgid "By Hour"
 msgstr ""
 
-msgctxt "field:calendar.event.exrule,create_uid:"
-msgid "Create User"
+msgctxt "field:calendar.event.exrule,byminute:"
+msgid "By Minute"
 msgstr ""
 
-msgctxt "field:calendar.event.exrule,event:"
-msgid "Event"
+msgctxt "field:calendar.event.exrule,bymonth:"
+msgid "By Month"
 msgstr ""
 
-msgctxt "field:calendar.event.exrule,id:"
-msgid "ID"
+msgctxt "field:calendar.event.exrule,bymonthday:"
+msgid "By Month Day"
 msgstr ""
 
-msgctxt "field:calendar.event.exrule,rec_name:"
-msgid "Name"
+msgctxt "field:calendar.event.exrule,bysecond:"
+msgid "By Second"
 msgstr ""
 
-msgctxt "field:calendar.event.exrule,write_date:"
-msgid "Write Date"
+msgctxt "field:calendar.event.exrule,bysetpos:"
+msgid "By Position"
 msgstr ""
 
-msgctxt "field:calendar.event.exrule,write_uid:"
-msgid "Write User"
+msgctxt "field:calendar.event.exrule,byweekno:"
+msgid "By Week Number"
+msgstr ""
+
+msgctxt "field:calendar.event.exrule,byyearday:"
+msgid "By Year Day"
 msgstr ""
 
-msgctxt "field:calendar.event.rdate,calendar_date:"
-msgid "Calendar Date"
+msgctxt "field:calendar.event.exrule,count:"
+msgid "Count"
 msgstr ""
 
-msgctxt "field:calendar.event.rdate,create_date:"
+msgctxt "field:calendar.event.exrule,create_date:"
 msgid "Create Date"
 msgstr ""
 
-msgctxt "field:calendar.event.rdate,create_uid:"
+msgctxt "field:calendar.event.exrule,create_uid:"
 msgid "Create User"
 msgstr ""
 
-msgctxt "field:calendar.event.rdate,event:"
+msgctxt "field:calendar.event.exrule,event:"
 msgid "Event"
 msgstr ""
 
-msgctxt "field:calendar.event.rdate,id:"
-msgid "ID"
+msgctxt "field:calendar.event.exrule,freq:"
+msgid "Frequency"
 msgstr ""
 
-msgctxt "field:calendar.event.rdate,rec_name:"
-msgid "Name"
+msgctxt "field:calendar.event.exrule,id:"
+msgid "ID"
 msgstr ""
 
-msgctxt "field:calendar.event.rdate,write_date:"
-msgid "Write Date"
+msgctxt "field:calendar.event.exrule,interval:"
+msgid "Interval"
 msgstr ""
 
-msgctxt "field:calendar.event.rdate,write_uid:"
-msgid "Write User"
+msgctxt "field:calendar.event.exrule,rec_name:"
+msgid "Name"
 msgstr ""
 
-msgctxt "field:calendar.event.rrule,calendar_rrule:"
-msgid "Calendar RRule"
+msgctxt "field:calendar.event.exrule,until:"
+msgid "Until Date"
 msgstr ""
 
-msgctxt "field:calendar.event.rrule,create_date:"
-msgid "Create Date"
+msgctxt "field:calendar.event.exrule,until_date:"
+msgid "Is Date"
 msgstr ""
 
-msgctxt "field:calendar.event.rrule,create_uid:"
-msgid "Create User"
+msgctxt "field:calendar.event.exrule,wkst:"
+msgid "Week Day"
 msgstr ""
 
-msgctxt "field:calendar.event.rrule,event:"
-msgid "Event"
+msgctxt "field:calendar.event.exrule,write_date:"
+msgid "Write Date"
 msgstr ""
 
-msgctxt "field:calendar.event.rrule,id:"
-msgid "ID"
+msgctxt "field:calendar.event.exrule,write_uid:"
+msgid "Write User"
 msgstr ""
 
-msgctxt "field:calendar.event.rrule,rec_name:"
-msgid "Name"
+msgctxt "field:calendar.event.rdate,create_date:"
+msgid "Create Date"
 msgstr ""
 
-msgctxt "field:calendar.event.rrule,write_date:"
-msgid "Write Date"
+msgctxt "field:calendar.event.rdate,create_uid:"
+msgid "Create User"
 msgstr ""
 
-msgctxt "field:calendar.event.rrule,write_uid:"
-msgid "Write User"
+msgctxt "field:calendar.event.rdate,date:"
+msgid "Is Date"
 msgstr ""
 
-msgctxt "field:calendar.location,create_date:"
-msgid "Create Date"
+msgctxt "field:calendar.event.rdate,datetime:"
+msgid "Date"
 msgstr ""
 
-msgctxt "field:calendar.location,create_uid:"
-msgid "Create User"
+msgctxt "field:calendar.event.rdate,event:"
+msgid "Event"
 msgstr ""
 
-msgctxt "field:calendar.location,id:"
+msgctxt "field:calendar.event.rdate,id:"
 msgid "ID"
 msgstr ""
 
-msgctxt "field:calendar.location,name:"
-msgid "Name"
-msgstr ""
-
-msgctxt "field:calendar.location,rec_name:"
+msgctxt "field:calendar.event.rdate,rec_name:"
 msgid "Name"
 msgstr ""
 
-msgctxt "field:calendar.location,write_date:"
+msgctxt "field:calendar.event.rdate,write_date:"
 msgid "Write Date"
 msgstr ""
 
-msgctxt "field:calendar.location,write_uid:"
+msgctxt "field:calendar.event.rdate,write_uid:"
 msgid "Write User"
 msgstr ""
 
-msgctxt "field:calendar.rrule,byday:"
+msgctxt "field:calendar.event.rrule,byday:"
 msgid "By Day"
 msgstr ""
 
-msgctxt "field:calendar.rrule,byhour:"
+msgctxt "field:calendar.event.rrule,byhour:"
 msgid "By Hour"
 msgstr ""
 
-msgctxt "field:calendar.rrule,byminute:"
+msgctxt "field:calendar.event.rrule,byminute:"
 msgid "By Minute"
 msgstr ""
 
-msgctxt "field:calendar.rrule,bymonth:"
+msgctxt "field:calendar.event.rrule,bymonth:"
 msgid "By Month"
 msgstr ""
 
-msgctxt "field:calendar.rrule,bymonthday:"
+msgctxt "field:calendar.event.rrule,bymonthday:"
 msgid "By Month Day"
 msgstr ""
 
-msgctxt "field:calendar.rrule,bysecond:"
+msgctxt "field:calendar.event.rrule,bysecond:"
 msgid "By Second"
 msgstr ""
 
-msgctxt "field:calendar.rrule,bysetpos:"
+msgctxt "field:calendar.event.rrule,bysetpos:"
 msgid "By Position"
 msgstr ""
 
-msgctxt "field:calendar.rrule,byweekno:"
+msgctxt "field:calendar.event.rrule,byweekno:"
 msgid "By Week Number"
 msgstr ""
 
-msgctxt "field:calendar.rrule,byyearday:"
+msgctxt "field:calendar.event.rrule,byyearday:"
 msgid "By Year Day"
 msgstr ""
 
-msgctxt "field:calendar.rrule,count:"
+msgctxt "field:calendar.event.rrule,count:"
 msgid "Count"
 msgstr ""
 
-msgctxt "field:calendar.rrule,create_date:"
+msgctxt "field:calendar.event.rrule,create_date:"
 msgid "Create Date"
 msgstr ""
 
-msgctxt "field:calendar.rrule,create_uid:"
+msgctxt "field:calendar.event.rrule,create_uid:"
 msgid "Create User"
 msgstr ""
 
-msgctxt "field:calendar.rrule,freq:"
+msgctxt "field:calendar.event.rrule,event:"
+msgid "Event"
+msgstr ""
+
+msgctxt "field:calendar.event.rrule,freq:"
 msgid "Frequency"
 msgstr ""
 
-msgctxt "field:calendar.rrule,id:"
+msgctxt "field:calendar.event.rrule,id:"
 msgid "ID"
 msgstr ""
 
-msgctxt "field:calendar.rrule,interval:"
+msgctxt "field:calendar.event.rrule,interval:"
 msgid "Interval"
 msgstr ""
 
-msgctxt "field:calendar.rrule,rec_name:"
+msgctxt "field:calendar.event.rrule,rec_name:"
 msgid "Name"
 msgstr ""
 
-msgctxt "field:calendar.rrule,until:"
+msgctxt "field:calendar.event.rrule,until:"
 msgid "Until Date"
 msgstr ""
 
-msgctxt "field:calendar.rrule,until_date:"
+msgctxt "field:calendar.event.rrule,until_date:"
 msgid "Is Date"
 msgstr ""
 
-msgctxt "field:calendar.rrule,wkst:"
+msgctxt "field:calendar.event.rrule,wkst:"
 msgid "Week Day"
 msgstr ""
 
-msgctxt "field:calendar.rrule,write_date:"
+msgctxt "field:calendar.event.rrule,write_date:"
 msgid "Write Date"
 msgstr ""
 
-msgctxt "field:calendar.rrule,write_uid:"
+msgctxt "field:calendar.event.rrule,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.location,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:calendar.location,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:calendar.location,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.location,name:"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:calendar.location,rec_name:"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:calendar.location,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.location,write_uid:"
 msgid "Write User"
 msgstr ""
 
@@ -778,24 +770,24 @@ msgctxt "help:calendar.calendar,owner:"
 msgid "The user must have an email"
 msgstr ""
 
-msgctxt "help:calendar.date,date:"
-msgid "Ignore time of field \"Date\", but handle as date only."
-msgstr ""
-
 msgctxt "help:calendar.event,uuid:"
 msgid "Universally Unique Identifier"
 msgstr ""
 
-msgctxt "help:calendar.rrule,until_date:"
+msgctxt "help:calendar.event.exdate,date:"
+msgid "Ignore time of field \"Date\", but handle as date only."
+msgstr ""
+
+msgctxt "help:calendar.event.exrule,until_date:"
 msgid "Ignore time of field \"Until Date\", but handle as date only."
 msgstr ""
 
-msgctxt "model:calendar.alarm,name:"
-msgid "Alarm"
+msgctxt "help:calendar.event.rdate,date:"
+msgid "Ignore time of field \"Date\", but handle as date only."
 msgstr ""
 
-msgctxt "model:calendar.attendee,name:"
-msgid "Attendee"
+msgctxt "help:calendar.event.rrule,until_date:"
+msgid "Ignore time of field \"Until Date\", but handle as date only."
 msgstr ""
 
 msgctxt "model:calendar.calendar,name:"
@@ -814,10 +806,6 @@ msgctxt "model:calendar.category,name:"
 msgid "Category"
 msgstr ""
 
-msgctxt "model:calendar.date,name:"
-msgid "Calendar Date"
-msgstr ""
-
 msgctxt "model:calendar.event,name:"
 msgid "Event"
 msgstr ""
@@ -854,10 +842,6 @@ msgctxt "model:calendar.location,name:"
 msgid "Location"
 msgstr ""
 
-msgctxt "model:calendar.rrule,name:"
-msgid "Recurrence Rule"
-msgstr ""
-
 msgctxt "model:ir.action,name:act_calendar_form"
 msgid "Calendars"
 msgstr ""
@@ -886,30 +870,6 @@ msgctxt "model:res.group,name:group_calendar_admin"
 msgid "Calendar Administration"
 msgstr ""
 
-msgctxt "selection:calendar.attendee,status:"
-msgid ""
-msgstr ""
-
-msgctxt "selection:calendar.attendee,status:"
-msgid "Accepted"
-msgstr ""
-
-msgctxt "selection:calendar.attendee,status:"
-msgid "Declined"
-msgstr ""
-
-msgctxt "selection:calendar.attendee,status:"
-msgid "Delegated"
-msgstr ""
-
-msgctxt "selection:calendar.attendee,status:"
-msgid "Needs Action"
-msgstr ""
-
-msgctxt "selection:calendar.attendee,status:"
-msgid "Tentative"
-msgstr ""
-
 msgctxt "selection:calendar.event,classification:"
 msgid "Confidential"
 msgstr ""
@@ -946,76 +906,156 @@ msgctxt "selection:calendar.event,transp:"
 msgid "Transparent"
 msgstr ""
 
-msgctxt "selection:calendar.rrule,freq:"
+msgctxt "selection:calendar.event.attendee,status:"
+msgid ""
+msgstr ""
+
+msgctxt "selection:calendar.event.attendee,status:"
+msgid "Accepted"
+msgstr ""
+
+msgctxt "selection:calendar.event.attendee,status:"
+msgid "Declined"
+msgstr ""
+
+msgctxt "selection:calendar.event.attendee,status:"
+msgid "Delegated"
+msgstr ""
+
+msgctxt "selection:calendar.event.attendee,status:"
+msgid "Needs Action"
+msgstr ""
+
+msgctxt "selection:calendar.event.attendee,status:"
+msgid "Tentative"
+msgstr ""
+
+msgctxt "selection:calendar.event.exrule,freq:"
+msgid "Daily"
+msgstr ""
+
+msgctxt "selection:calendar.event.exrule,freq:"
+msgid "Hourly"
+msgstr ""
+
+msgctxt "selection:calendar.event.exrule,freq:"
+msgid "Minutely"
+msgstr ""
+
+msgctxt "selection:calendar.event.exrule,freq:"
+msgid "Monthly"
+msgstr ""
+
+msgctxt "selection:calendar.event.exrule,freq:"
+msgid "Secondly"
+msgstr ""
+
+msgctxt "selection:calendar.event.exrule,freq:"
+msgid "Weekly"
+msgstr ""
+
+msgctxt "selection:calendar.event.exrule,freq:"
+msgid "Yearly"
+msgstr ""
+
+msgctxt "selection:calendar.event.exrule,wkst:"
+msgid "Friday"
+msgstr ""
+
+msgctxt "selection:calendar.event.exrule,wkst:"
+msgid "Monday"
+msgstr ""
+
+msgctxt "selection:calendar.event.exrule,wkst:"
+msgid "Saturday"
+msgstr ""
+
+msgctxt "selection:calendar.event.exrule,wkst:"
+msgid "Sunday"
+msgstr ""
+
+msgctxt "selection:calendar.event.exrule,wkst:"
+msgid "Thursday"
+msgstr ""
+
+msgctxt "selection:calendar.event.exrule,wkst:"
+msgid "Tuesday"
+msgstr ""
+
+msgctxt "selection:calendar.event.exrule,wkst:"
+msgid "Wednesday"
+msgstr ""
+
+msgctxt "selection:calendar.event.rrule,freq:"
 msgid "Daily"
 msgstr ""
 
-msgctxt "selection:calendar.rrule,freq:"
+msgctxt "selection:calendar.event.rrule,freq:"
 msgid "Hourly"
 msgstr ""
 
-msgctxt "selection:calendar.rrule,freq:"
+msgctxt "selection:calendar.event.rrule,freq:"
 msgid "Minutely"
 msgstr ""
 
-msgctxt "selection:calendar.rrule,freq:"
+msgctxt "selection:calendar.event.rrule,freq:"
 msgid "Monthly"
 msgstr ""
 
-msgctxt "selection:calendar.rrule,freq:"
+msgctxt "selection:calendar.event.rrule,freq:"
 msgid "Secondly"
 msgstr ""
 
-msgctxt "selection:calendar.rrule,freq:"
+msgctxt "selection:calendar.event.rrule,freq:"
 msgid "Weekly"
 msgstr ""
 
-msgctxt "selection:calendar.rrule,freq:"
+msgctxt "selection:calendar.event.rrule,freq:"
 msgid "Yearly"
 msgstr ""
 
-msgctxt "selection:calendar.rrule,wkst:"
+msgctxt "selection:calendar.event.rrule,wkst:"
 msgid "Friday"
 msgstr ""
 
-msgctxt "selection:calendar.rrule,wkst:"
+msgctxt "selection:calendar.event.rrule,wkst:"
 msgid "Monday"
 msgstr ""
 
-msgctxt "selection:calendar.rrule,wkst:"
+msgctxt "selection:calendar.event.rrule,wkst:"
 msgid "Saturday"
 msgstr ""
 
-msgctxt "selection:calendar.rrule,wkst:"
+msgctxt "selection:calendar.event.rrule,wkst:"
 msgid "Sunday"
 msgstr ""
 
-msgctxt "selection:calendar.rrule,wkst:"
+msgctxt "selection:calendar.event.rrule,wkst:"
 msgid "Thursday"
 msgstr ""
 
-msgctxt "selection:calendar.rrule,wkst:"
+msgctxt "selection:calendar.event.rrule,wkst:"
 msgid "Tuesday"
 msgstr ""
 
-msgctxt "selection:calendar.rrule,wkst:"
+msgctxt "selection:calendar.event.rrule,wkst:"
 msgid "Wednesday"
 msgstr ""
 
 msgctxt "view:calendar.calendar:"
-msgid "Calendar"
+msgid "Access Permissions"
 msgstr ""
 
 msgctxt "view:calendar.calendar:"
-msgid "Calendars"
+msgid "Calendar"
 msgstr ""
 
 msgctxt "view:calendar.calendar:"
-msgid "General"
+msgid "Calendars"
 msgstr ""
 
 msgctxt "view:calendar.calendar:"
-msgid "Security"
+msgid "General"
 msgstr ""
 
 msgctxt "view:calendar.category:"
diff --git a/locale/de_DE.po b/locale/de_DE.po
index fd10881..314f9c1 100644
--- a/locale/de_DE.po
+++ b/locale/de_DE.po
@@ -3,134 +3,113 @@ msgid ""
 msgstr "Content-Type: text/plain; charset=utf-8\n"
 
 msgctxt "error:calendar.calendar:"
-msgid "A user can have only one calendar!"
-msgstr "Es ist nur ein Kalender pro Benutzer möglich!"
+msgid "A user can have only one calendar."
+msgstr "Es kann nur ein Kalender pro Benutzer eingetragen werden."
 
 msgctxt "error:calendar.calendar:"
-msgid "The name of calendar must be unique!"
-msgstr "Kalendername kann nicht mehrfach vergeben werden!"
+msgid "Calendar name \"%s\" can not end with .ics"
+msgstr "Der Name des Kalenders darf nicht mit .ics enden"
 
-msgctxt "error:calendar.category:"
-msgid "The name of calendar category must be unique!"
-msgstr "Name für Kalenderkategorie kann nicht mehrfach vergeben werden!"
-
-msgctxt "error:calendar.event:"
-msgid "Recurrence can not be recurrent!"
-msgstr "Wiederholungen können nicht rekursiv sein!"
-
-msgctxt "error:calendar.event:"
-msgid "UUID and recurrence must be unique in a calendar!"
-msgstr ""
-"UUID und Wiederholung können in einem Kalender nicht mehrfach vergeben "
-"werden!"
-
-msgctxt "error:calendar.location:"
-msgid "The name of calendar location must be unique!"
-msgstr "Name für Kalenderort kann nicht mehrfach vergeben werden!"
-
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Day\""
-msgstr "Ungültig \"Für Tag\""
-
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Hour\""
-msgstr "Ungültig \"Für Stunde\""
+msgctxt "error:calendar.calendar:"
+msgid "The name of calendar must be unique."
+msgstr "Der Name eines Kalenders kann nur einmal vergeben werden."
 
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Minute\""
-msgstr "Ungültig \"Für Minute\""
+msgctxt "error:calendar.category:"
+msgid "The name of calendar category must be unique."
+msgstr "Der Name einer Kalenderkategorie kann nur einmal vergeben werden."
 
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Month Day\""
-msgstr "Ungültig \"Für Tag des Monats\""
+msgctxt "error:calendar.event.exrule:"
+msgid "Invalid \"By Day\" in recurrence rule \"%s\""
+msgstr "Ungültiger Eintrag in \"Für Tag\" in Wiederholungsregel \"%s\""
 
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Month\""
-msgstr "Ungültig \"Für Monat\""
+msgctxt "error:calendar.event.exrule:"
+msgid "Invalid \"By Hour\" in recurrence rule \"%s\""
+msgstr "Ungültiger Eintrag in \"Für Stunde\" in Wiederholungsregel \"%s\""
 
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Position\""
-msgstr "Ungültig \"Für Position\""
+msgctxt "error:calendar.event.exrule:"
+msgid "Invalid \"By Minute\" in recurrence rule \"%s\""
+msgstr "Ungültiger Eintrag in \"Für Minute\" in Wiederholungsregel \"%s\""
 
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Second\""
-msgstr "Ungültig \"Für Sekunde\""
+msgctxt "error:calendar.event.exrule:"
+msgid "Invalid \"By Month Day\" in recurrence rule \"%s\""
+msgstr "Ungültiger Eintrag in \"Für Tag des Monats\" in Wiederholungsregel \"%s\""
 
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Week Number\""
-msgstr "Ungültig \"Für Woche Nummer\""
+msgctxt "error:calendar.event.exrule:"
+msgid "Invalid \"By Month\" in recurrence rule \"%s\""
+msgstr "Ungültiger Eintrag in \"Für Monat\" in Wiederholungsregel \"%s\""
 
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Year Day\""
-msgstr "Ungültig \"Für Tag des Jahres\""
+msgctxt "error:calendar.event.exrule:"
+msgid "Invalid \"By Position\" in recurrence rule \"%s\""
+msgstr "Ungültiger Eintrag in \"Für Position\" in Wiederholungsregel \"%s\""
 
-msgctxt "error:calendar.rrule:"
-msgid "Only one of \"until\" and \"count\" can be set!"
-msgstr "Es kann nur entweder \"Bis\" oder \"Anzahl\" gesetzt werden!"
+msgctxt "error:calendar.event.exrule:"
+msgid "Invalid \"By Second\" in recurrence rule \"%s\""
+msgstr "Ungültiger Eintrag in \"Für Sekunde\" in Wiederholungsregel \"%s\""
 
-msgctxt "field:calendar.alarm,create_date:"
-msgid "Create Date"
-msgstr "Erstellungsdatum"
+msgctxt "error:calendar.event.exrule:"
+msgid "Invalid \"By Week Number\" in recurrence rule \"%s\""
+msgstr "Ungültiger Eintrag in \"Für Wochennummer\" in Wiederholungsregel \"%s\""
 
-msgctxt "field:calendar.alarm,create_uid:"
-msgid "Create User"
-msgstr "Erstellt durch"
+msgctxt "error:calendar.event.exrule:"
+msgid "Invalid \"By Year Day\" in recurrence rule \"%s\""
+msgstr "Ungültiger Eintrag in \"Für Tag des Jahres\" in Wiederholungsregel \"%s\""
 
-msgctxt "field:calendar.alarm,id:"
-msgid "ID"
-msgstr "ID"
+msgctxt "error:calendar.event.exrule:"
+msgid "Only one of \"until\" and \"count\" can be set."
+msgstr "Es kann nur eine der Optionen \"Bis\" oder \"Anzahl\" gesetzt werden."
 
-msgctxt "field:calendar.alarm,rec_name:"
-msgid "Name"
-msgstr "Name"
+msgctxt "error:calendar.event.rrule:"
+msgid "Invalid \"By Day\" in recurrence rule \"%s\""
+msgstr "Ungültiger Eintrag in \"Für Tag\" in Wiederholungsregel \"%s\""
 
-msgctxt "field:calendar.alarm,valarm:"
-msgid "valarm"
-msgstr "valarm"
+msgctxt "error:calendar.event.rrule:"
+msgid "Invalid \"By Hour\" in recurrence rule \"%s\""
+msgstr "Ungültiger Eintrag in \"Für Stunde\" in Wiederholungsregel \"%s\""
 
-msgctxt "field:calendar.alarm,write_date:"
-msgid "Write Date"
-msgstr "Zuletzt geändert"
+msgctxt "error:calendar.event.rrule:"
+msgid "Invalid \"By Minute\" in recurrence rule \"%s\""
+msgstr "Ungültiger Eintrag in \"Für Minute\" in Wiederholungsregel \"%s\""
 
-msgctxt "field:calendar.alarm,write_uid:"
-msgid "Write User"
-msgstr "Letzte Änderung durch"
+msgctxt "error:calendar.event.rrule:"
+msgid "Invalid \"By Month Day\" in recurrence rule \"%s\""
+msgstr "Ungültiger Eintrag in \"Für Tag des Monats\" in Wiederholungsregel \"%s\""
 
-msgctxt "field:calendar.attendee,attendee:"
-msgid "attendee"
-msgstr "Teilnehmer"
+msgctxt "error:calendar.event.rrule:"
+msgid "Invalid \"By Month\" in recurrence rule \"%s\""
+msgstr "Ungültiger Eintrag in \"Für Monat\" in Wiederholungsregel \"%s\""
 
-msgctxt "field:calendar.attendee,create_date:"
-msgid "Create Date"
-msgstr "Erstellungsdatum"
+msgctxt "error:calendar.event.rrule:"
+msgid "Invalid \"By Position\" in recurrence rule \"%s\""
+msgstr "Ungültiger Eintrag in \"Für Position\" in Wiederholungsregel \"%s\""
 
-msgctxt "field:calendar.attendee,create_uid:"
-msgid "Create User"
-msgstr "Erstellt durch"
+msgctxt "error:calendar.event.rrule:"
+msgid "Invalid \"By Second\" in recurrence rule \"%s\""
+msgstr "Ungültiger Eintrag in \"Für Sekunde\" in Wiederholungsregel \"%s\""
 
-msgctxt "field:calendar.attendee,email:"
-msgid "Email"
-msgstr "E-Mail"
+msgctxt "error:calendar.event.rrule:"
+msgid "Invalid \"By Week Number\" in recurrence rule \"%s\""
+msgstr "Ungültiger Eintrag in \"Für Wochennummer\" in Wiederholungsregel \"%s\""
 
-msgctxt "field:calendar.attendee,id:"
-msgid "ID"
-msgstr "ID"
+msgctxt "error:calendar.event.rrule:"
+msgid "Invalid \"By Year Day\" in recurrence rule \"%s\""
+msgstr "Ungültiger Eintrag in \"Für Tag des Jahres\" in Wiederholungsregel \"%s\""
 
-msgctxt "field:calendar.attendee,rec_name:"
-msgid "Name"
-msgstr "Name"
+msgctxt "error:calendar.event.rrule:"
+msgid "Only one of \"until\" and \"count\" can be set."
+msgstr "Es kann nur eine der Optionen \"Bis\" oder \"Anzahl\" gesetzt werden."
 
-msgctxt "field:calendar.attendee,status:"
-msgid "Participation Status"
-msgstr "Teilnahmestatus"
+msgctxt "error:calendar.event:"
+msgid "Recurrence \"%s\" can not be recurrent."
+msgstr "Wiederholung \"%s\" kann sich nicht wiederholen."
 
-msgctxt "field:calendar.attendee,write_date:"
-msgid "Write Date"
-msgstr "Zuletzt geändert"
+msgctxt "error:calendar.event:"
+msgid "UUID and recurrence must be unique in a calendar."
+msgstr ""
+"UUID und Wiederholung können in einem Kalender nur einmal vergeben werden."
 
-msgctxt "field:calendar.attendee,write_uid:"
-msgid "Write User"
-msgstr "Letzte Änderung durch"
+msgctxt "error:calendar.location:"
+msgid "The name of calendar location must be unique."
+msgstr "Der Name eines Kalenderorts kann nur einmal vergeben werden."
 
 msgctxt "field:calendar.calendar,create_date:"
 msgid "Create Date"
@@ -268,38 +247,6 @@ msgctxt "field:calendar.category,write_uid:"
 msgid "Write User"
 msgstr "Letzte Änderung durch"
 
-msgctxt "field:calendar.date,create_date:"
-msgid "Create Date"
-msgstr "Erstellungsdatum"
-
-msgctxt "field:calendar.date,create_uid:"
-msgid "Create User"
-msgstr "Erstellt durch"
-
-msgctxt "field:calendar.date,date:"
-msgid "Is Date"
-msgstr "Als Datum"
-
-msgctxt "field:calendar.date,datetime:"
-msgid "Date"
-msgstr "Zeitpunkt"
-
-msgctxt "field:calendar.date,id:"
-msgid "ID"
-msgstr "ID"
-
-msgctxt "field:calendar.date,rec_name:"
-msgid "Name"
-msgstr "Name"
-
-msgctxt "field:calendar.date,write_date:"
-msgid "Write Date"
-msgstr "Zuletzt geändert"
-
-msgctxt "field:calendar.date,write_uid:"
-msgid "Write User"
-msgstr "Letzte Änderung durch"
-
 msgctxt "field:calendar.event,alarms:"
 msgid "Alarms"
 msgstr "Alarm"
@@ -468,10 +415,6 @@ msgctxt "field:calendar.event-calendar.category,write_uid:"
 msgid "Write User"
 msgstr "Letzte Änderung durch"
 
-msgctxt "field:calendar.event.alarm,calendar_alarm:"
-msgid "Calendar Alarm"
-msgstr "Kalender Alarm"
-
 msgctxt "field:calendar.event.alarm,create_date:"
 msgid "Create Date"
 msgstr "Erstellungsdatum"
@@ -492,6 +435,10 @@ msgctxt "field:calendar.event.alarm,rec_name:"
 msgid "Name"
 msgstr "Name"
 
+msgctxt "field:calendar.event.alarm,valarm:"
+msgid "valarm"
+msgstr ""
+
 msgctxt "field:calendar.event.alarm,write_date:"
 msgid "Write Date"
 msgstr "Zuletzt geändert"
@@ -500,9 +447,9 @@ msgctxt "field:calendar.event.alarm,write_uid:"
 msgid "Write User"
 msgstr "Letzte Änderung durch"
 
-msgctxt "field:calendar.event.attendee,calendar_attendee:"
-msgid "Calendar Attendee"
-msgstr "Kalender Teilnehmer"
+msgctxt "field:calendar.event.attendee,attendee:"
+msgid "attendee"
+msgstr "Teilnehmer"
 
 msgctxt "field:calendar.event.attendee,create_date:"
 msgid "Create Date"
@@ -512,6 +459,10 @@ msgctxt "field:calendar.event.attendee,create_uid:"
 msgid "Create User"
 msgstr "Erstellt durch"
 
+msgctxt "field:calendar.event.attendee,email:"
+msgid "Email"
+msgstr "E-Mail"
+
 msgctxt "field:calendar.event.attendee,event:"
 msgid "Event"
 msgstr "Termin"
@@ -524,6 +475,10 @@ msgctxt "field:calendar.event.attendee,rec_name:"
 msgid "Name"
 msgstr "Name"
 
+msgctxt "field:calendar.event.attendee,status:"
+msgid "Participation Status"
+msgstr "Teilnahmestatus"
+
 msgctxt "field:calendar.event.attendee,write_date:"
 msgid "Write Date"
 msgstr "Zuletzt geändert"
@@ -532,10 +487,6 @@ msgctxt "field:calendar.event.attendee,write_uid:"
 msgid "Write User"
 msgstr "Letzte Änderung durch"
 
-msgctxt "field:calendar.event.exdate,calendar_date:"
-msgid "Calendar Date"
-msgstr "Kalender Datum"
-
 msgctxt "field:calendar.event.exdate,create_date:"
 msgid "Create Date"
 msgstr "Erstellungsdatum"
@@ -544,6 +495,14 @@ msgctxt "field:calendar.event.exdate,create_uid:"
 msgid "Create User"
 msgstr "Erstellt durch"
 
+msgctxt "field:calendar.event.exdate,date:"
+msgid "Is Date"
+msgstr "Als Datum"
+
+msgctxt "field:calendar.event.exdate,datetime:"
+msgid "Date"
+msgstr "Zeitpunkt"
+
 msgctxt "field:calendar.event.exdate,event:"
 msgid "Event"
 msgstr "Termin"
@@ -564,9 +523,45 @@ msgctxt "field:calendar.event.exdate,write_uid:"
 msgid "Write User"
 msgstr "Letzte Änderung durch"
 
-msgctxt "field:calendar.event.exrule,calendar_rrule:"
-msgid "Calendar RRule"
-msgstr "Kalender WRegel"
+msgctxt "field:calendar.event.exrule,byday:"
+msgid "By Day"
+msgstr "Für Tag"
+
+msgctxt "field:calendar.event.exrule,byhour:"
+msgid "By Hour"
+msgstr "Für Stunde"
+
+msgctxt "field:calendar.event.exrule,byminute:"
+msgid "By Minute"
+msgstr "Für Minute"
+
+msgctxt "field:calendar.event.exrule,bymonth:"
+msgid "By Month"
+msgstr "Für Monat"
+
+msgctxt "field:calendar.event.exrule,bymonthday:"
+msgid "By Month Day"
+msgstr "Für Tag des Monats"
+
+msgctxt "field:calendar.event.exrule,bysecond:"
+msgid "By Second"
+msgstr "Für Sekunde"
+
+msgctxt "field:calendar.event.exrule,bysetpos:"
+msgid "By Position"
+msgstr "Für Position"
+
+msgctxt "field:calendar.event.exrule,byweekno:"
+msgid "By Week Number"
+msgstr "Für Wochennummer"
+
+msgctxt "field:calendar.event.exrule,byyearday:"
+msgid "By Year Day"
+msgstr "Für Tag des Jahres"
+
+msgctxt "field:calendar.event.exrule,count:"
+msgid "Count"
+msgstr "Anzahl"
 
 msgctxt "field:calendar.event.exrule,create_date:"
 msgid "Create Date"
@@ -580,14 +575,34 @@ msgctxt "field:calendar.event.exrule,event:"
 msgid "Event"
 msgstr "Termin"
 
+msgctxt "field:calendar.event.exrule,freq:"
+msgid "Frequency"
+msgstr "Häufigkeit"
+
 msgctxt "field:calendar.event.exrule,id:"
 msgid "ID"
 msgstr "ID"
 
+msgctxt "field:calendar.event.exrule,interval:"
+msgid "Interval"
+msgstr "Intervall"
+
 msgctxt "field:calendar.event.exrule,rec_name:"
 msgid "Name"
 msgstr "Name"
 
+msgctxt "field:calendar.event.exrule,until:"
+msgid "Until Date"
+msgstr "Bis Datum"
+
+msgctxt "field:calendar.event.exrule,until_date:"
+msgid "Is Date"
+msgstr "Als Datum"
+
+msgctxt "field:calendar.event.exrule,wkst:"
+msgid "Week Day"
+msgstr "Wochentag"
+
 msgctxt "field:calendar.event.exrule,write_date:"
 msgid "Write Date"
 msgstr "Zuletzt geändert"
@@ -596,10 +611,6 @@ msgctxt "field:calendar.event.exrule,write_uid:"
 msgid "Write User"
 msgstr "Letzte Änderung durch"
 
-msgctxt "field:calendar.event.rdate,calendar_date:"
-msgid "Calendar Date"
-msgstr "Kalender Datum"
-
 msgctxt "field:calendar.event.rdate,create_date:"
 msgid "Create Date"
 msgstr "Erstellungsdatum"
@@ -608,6 +619,14 @@ msgctxt "field:calendar.event.rdate,create_uid:"
 msgid "Create User"
 msgstr "Erstellt durch"
 
+msgctxt "field:calendar.event.rdate,date:"
+msgid "Is Date"
+msgstr "Als Datum"
+
+msgctxt "field:calendar.event.rdate,datetime:"
+msgid "Date"
+msgstr "Zeitpunkt"
+
 msgctxt "field:calendar.event.rdate,event:"
 msgid "Event"
 msgstr "Termin"
@@ -628,147 +647,119 @@ msgctxt "field:calendar.event.rdate,write_uid:"
 msgid "Write User"
 msgstr "Letzte Änderung durch"
 
-msgctxt "field:calendar.event.rrule,calendar_rrule:"
-msgid "Calendar RRule"
-msgstr "Kalender WRegel"
-
-msgctxt "field:calendar.event.rrule,create_date:"
-msgid "Create Date"
-msgstr "Erstellungsdatum"
-
-msgctxt "field:calendar.event.rrule,create_uid:"
-msgid "Create User"
-msgstr "Erstellt durch"
-
-msgctxt "field:calendar.event.rrule,event:"
-msgid "Event"
-msgstr "Termin"
-
-msgctxt "field:calendar.event.rrule,id:"
-msgid "ID"
-msgstr "ID"
-
-msgctxt "field:calendar.event.rrule,rec_name:"
-msgid "Name"
-msgstr "Name"
-
-msgctxt "field:calendar.event.rrule,write_date:"
-msgid "Write Date"
-msgstr "Zuletzt geändert"
-
-msgctxt "field:calendar.event.rrule,write_uid:"
-msgid "Write User"
-msgstr "Letzte Änderung durch"
-
-msgctxt "field:calendar.location,create_date:"
-msgid "Create Date"
-msgstr "Erstellungsdatum"
-
-msgctxt "field:calendar.location,create_uid:"
-msgid "Create User"
-msgstr "Erstellt durch"
-
-msgctxt "field:calendar.location,id:"
-msgid "ID"
-msgstr "ID"
-
-msgctxt "field:calendar.location,name:"
-msgid "Name"
-msgstr "Name"
-
-msgctxt "field:calendar.location,rec_name:"
-msgid "Name"
-msgstr "Name"
-
-msgctxt "field:calendar.location,write_date:"
-msgid "Write Date"
-msgstr "Zuletzt geändert"
-
-msgctxt "field:calendar.location,write_uid:"
-msgid "Write User"
-msgstr "Letzte Änderung durch"
-
-msgctxt "field:calendar.rrule,byday:"
+msgctxt "field:calendar.event.rrule,byday:"
 msgid "By Day"
 msgstr "Für Tag"
 
-msgctxt "field:calendar.rrule,byhour:"
+msgctxt "field:calendar.event.rrule,byhour:"
 msgid "By Hour"
 msgstr "Für Stunde"
 
-msgctxt "field:calendar.rrule,byminute:"
+msgctxt "field:calendar.event.rrule,byminute:"
 msgid "By Minute"
 msgstr "Für Minute"
 
-msgctxt "field:calendar.rrule,bymonth:"
+msgctxt "field:calendar.event.rrule,bymonth:"
 msgid "By Month"
 msgstr "Für Monat"
 
-msgctxt "field:calendar.rrule,bymonthday:"
+msgctxt "field:calendar.event.rrule,bymonthday:"
 msgid "By Month Day"
 msgstr "Für Tag des Monats"
 
-msgctxt "field:calendar.rrule,bysecond:"
+msgctxt "field:calendar.event.rrule,bysecond:"
 msgid "By Second"
 msgstr "Für Sekunde"
 
-msgctxt "field:calendar.rrule,bysetpos:"
+msgctxt "field:calendar.event.rrule,bysetpos:"
 msgid "By Position"
 msgstr "Für Position"
 
-msgctxt "field:calendar.rrule,byweekno:"
+msgctxt "field:calendar.event.rrule,byweekno:"
 msgid "By Week Number"
-msgstr "Für Woche Nummer"
+msgstr "Für Wochennummer"
 
-msgctxt "field:calendar.rrule,byyearday:"
+msgctxt "field:calendar.event.rrule,byyearday:"
 msgid "By Year Day"
 msgstr "Für Tag des Jahres"
 
-msgctxt "field:calendar.rrule,count:"
+msgctxt "field:calendar.event.rrule,count:"
 msgid "Count"
 msgstr "Anzahl"
 
-msgctxt "field:calendar.rrule,create_date:"
+msgctxt "field:calendar.event.rrule,create_date:"
 msgid "Create Date"
 msgstr "Erstellungsdatum"
 
-msgctxt "field:calendar.rrule,create_uid:"
+msgctxt "field:calendar.event.rrule,create_uid:"
 msgid "Create User"
 msgstr "Erstellt durch"
 
-msgctxt "field:calendar.rrule,freq:"
+msgctxt "field:calendar.event.rrule,event:"
+msgid "Event"
+msgstr "Termin"
+
+msgctxt "field:calendar.event.rrule,freq:"
 msgid "Frequency"
 msgstr "Häufigkeit"
 
-msgctxt "field:calendar.rrule,id:"
+msgctxt "field:calendar.event.rrule,id:"
 msgid "ID"
 msgstr "ID"
 
-msgctxt "field:calendar.rrule,interval:"
+msgctxt "field:calendar.event.rrule,interval:"
 msgid "Interval"
 msgstr "Intervall"
 
-msgctxt "field:calendar.rrule,rec_name:"
+msgctxt "field:calendar.event.rrule,rec_name:"
 msgid "Name"
 msgstr "Name"
 
-msgctxt "field:calendar.rrule,until:"
+msgctxt "field:calendar.event.rrule,until:"
 msgid "Until Date"
-msgstr "Bis Zeitpunkt"
+msgstr "Bis Datum"
 
-msgctxt "field:calendar.rrule,until_date:"
+msgctxt "field:calendar.event.rrule,until_date:"
 msgid "Is Date"
 msgstr "Als Datum"
 
-msgctxt "field:calendar.rrule,wkst:"
+msgctxt "field:calendar.event.rrule,wkst:"
 msgid "Week Day"
 msgstr "Wochentag"
 
-msgctxt "field:calendar.rrule,write_date:"
+msgctxt "field:calendar.event.rrule,write_date:"
 msgid "Write Date"
 msgstr "Zuletzt geändert"
 
-msgctxt "field:calendar.rrule,write_uid:"
+msgctxt "field:calendar.event.rrule,write_uid:"
+msgid "Write User"
+msgstr "Letzte Änderung durch"
+
+msgctxt "field:calendar.location,create_date:"
+msgid "Create Date"
+msgstr "Erstellungsdatum"
+
+msgctxt "field:calendar.location,create_uid:"
+msgid "Create User"
+msgstr "Erstellt durch"
+
+msgctxt "field:calendar.location,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.location,name:"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:calendar.location,rec_name:"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:calendar.location,write_date:"
+msgid "Write Date"
+msgstr "Zuletzt geändert"
+
+msgctxt "field:calendar.location,write_uid:"
 msgid "Write User"
 msgstr "Letzte Änderung durch"
 
@@ -778,27 +769,35 @@ msgstr "Kalender"
 
 msgctxt "help:calendar.calendar,owner:"
 msgid "The user must have an email"
-msgstr "Dem Benutzer muss eine E-Mail-Adresse zugeordnet sein!"
-
-msgctxt "help:calendar.date,date:"
-msgid "Ignore time of field \"Date\", but handle as date only."
-msgstr "Verwende von Feld \"Zeitpunkt\" nur das Datum ohne den Zeitanteil."
+msgstr "Dem Benutzer muss eine E-Mailadresse zugeordnet sein!"
 
 msgctxt "help:calendar.event,uuid:"
 msgid "Universally Unique Identifier"
 msgstr "Universally Unique Identifier"
 
-msgctxt "help:calendar.rrule,until_date:"
+msgctxt "help:calendar.event.exdate,date:"
+msgid "Ignore time of field \"Date\", but handle as date only."
+msgstr ""
+"Zeit von Feld \"Datum\" ignorieren, sondern nur als Datum ohne Zeit "
+"behandeln."
+
+msgctxt "help:calendar.event.exrule,until_date:"
 msgid "Ignore time of field \"Until Date\", but handle as date only."
-msgstr "Verwende von Feld \"Bis Zeitpunkt\" nur das Datum ohne den Zeitanteil."
+msgstr ""
+"Zeit von Feld \"Bis Datum\" ignorieren, sondern nur als Datum ohne Zeit "
+"behandeln."
 
-msgctxt "model:calendar.alarm,name:"
-msgid "Alarm"
-msgstr "Alarm"
+msgctxt "help:calendar.event.rdate,date:"
+msgid "Ignore time of field \"Date\", but handle as date only."
+msgstr ""
+"Zeit von Feld \"Datum\" ignorieren, sondern nur als Datum ohne Zeit "
+"behandeln."
 
-msgctxt "model:calendar.attendee,name:"
-msgid "Attendee"
-msgstr "Teilnehmer"
+msgctxt "help:calendar.event.rrule,until_date:"
+msgid "Ignore time of field \"Until Date\", but handle as date only."
+msgstr ""
+"Zeit von Feld \"Bis Datum\" ignorieren, sondern nur als Datum ohne Zeit "
+"behandeln."
 
 msgctxt "model:calendar.calendar,name:"
 msgid "Calendar"
@@ -816,10 +815,6 @@ msgctxt "model:calendar.category,name:"
 msgid "Category"
 msgstr "Kategorie"
 
-msgctxt "model:calendar.date,name:"
-msgid "Calendar Date"
-msgstr "Kalender Datum"
-
 msgctxt "model:calendar.event,name:"
 msgid "Event"
 msgstr "Termin"
@@ -856,10 +851,6 @@ msgctxt "model:calendar.location,name:"
 msgid "Location"
 msgstr "Ort"
 
-msgctxt "model:calendar.rrule,name:"
-msgid "Recurrence Rule"
-msgstr "Wiederholungsregel"
-
 msgctxt "model:ir.action,name:act_calendar_form"
 msgid "Calendars"
 msgstr "Kalender"
@@ -888,30 +879,6 @@ msgctxt "model:res.group,name:group_calendar_admin"
 msgid "Calendar Administration"
 msgstr "Kalender Administration"
 
-msgctxt "selection:calendar.attendee,status:"
-msgid ""
-msgstr ""
-
-msgctxt "selection:calendar.attendee,status:"
-msgid "Accepted"
-msgstr "Angenommen"
-
-msgctxt "selection:calendar.attendee,status:"
-msgid "Declined"
-msgstr "Abgelehnt"
-
-msgctxt "selection:calendar.attendee,status:"
-msgid "Delegated"
-msgstr "Delegiert"
-
-msgctxt "selection:calendar.attendee,status:"
-msgid "Needs Action"
-msgstr "Aktion erforderlich"
-
-msgctxt "selection:calendar.attendee,status:"
-msgid "Tentative"
-msgstr "Unter Vorbehalt"
-
 msgctxt "selection:calendar.event,classification:"
 msgid "Confidential"
 msgstr "Vertraulich"
@@ -948,62 +915,146 @@ msgctxt "selection:calendar.event,transp:"
 msgid "Transparent"
 msgstr "Transparent"
 
-msgctxt "selection:calendar.rrule,freq:"
+msgctxt "selection:calendar.event.attendee,status:"
+msgid ""
+msgstr ""
+
+msgctxt "selection:calendar.event.attendee,status:"
+msgid "Accepted"
+msgstr "Bestätigt"
+
+msgctxt "selection:calendar.event.attendee,status:"
+msgid "Declined"
+msgstr "Abgelehnt"
+
+msgctxt "selection:calendar.event.attendee,status:"
+msgid "Delegated"
+msgstr "Delegiert"
+
+msgctxt "selection:calendar.event.attendee,status:"
+msgid "Needs Action"
+msgstr "Benötigt Eingriff"
+
+msgctxt "selection:calendar.event.attendee,status:"
+msgid "Tentative"
+msgstr "Unter Vorbehalt"
+
+msgctxt "selection:calendar.event.exrule,freq:"
 msgid "Daily"
 msgstr "Täglich"
 
-msgctxt "selection:calendar.rrule,freq:"
+msgctxt "selection:calendar.event.exrule,freq:"
 msgid "Hourly"
 msgstr "Stündlich"
 
-msgctxt "selection:calendar.rrule,freq:"
+msgctxt "selection:calendar.event.exrule,freq:"
 msgid "Minutely"
 msgstr "Minütlich"
 
-msgctxt "selection:calendar.rrule,freq:"
+msgctxt "selection:calendar.event.exrule,freq:"
 msgid "Monthly"
 msgstr "Monatlich"
 
-msgctxt "selection:calendar.rrule,freq:"
+msgctxt "selection:calendar.event.exrule,freq:"
 msgid "Secondly"
 msgstr "Sekündlich"
 
-msgctxt "selection:calendar.rrule,freq:"
+msgctxt "selection:calendar.event.exrule,freq:"
 msgid "Weekly"
 msgstr "Wöchentlich"
 
-msgctxt "selection:calendar.rrule,freq:"
+msgctxt "selection:calendar.event.exrule,freq:"
 msgid "Yearly"
 msgstr "Jährlich"
 
-msgctxt "selection:calendar.rrule,wkst:"
+msgctxt "selection:calendar.event.exrule,wkst:"
 msgid "Friday"
 msgstr "Freitag"
 
-msgctxt "selection:calendar.rrule,wkst:"
+msgctxt "selection:calendar.event.exrule,wkst:"
 msgid "Monday"
 msgstr "Montag"
 
-msgctxt "selection:calendar.rrule,wkst:"
+msgctxt "selection:calendar.event.exrule,wkst:"
 msgid "Saturday"
 msgstr "Samstag"
 
-msgctxt "selection:calendar.rrule,wkst:"
+msgctxt "selection:calendar.event.exrule,wkst:"
 msgid "Sunday"
 msgstr "Sonntag"
 
-msgctxt "selection:calendar.rrule,wkst:"
+msgctxt "selection:calendar.event.exrule,wkst:"
 msgid "Thursday"
 msgstr "Donnerstag"
 
-msgctxt "selection:calendar.rrule,wkst:"
+msgctxt "selection:calendar.event.exrule,wkst:"
 msgid "Tuesday"
 msgstr "Dienstag"
 
-msgctxt "selection:calendar.rrule,wkst:"
+msgctxt "selection:calendar.event.exrule,wkst:"
 msgid "Wednesday"
 msgstr "Mittwoch"
 
+msgctxt "selection:calendar.event.rrule,freq:"
+msgid "Daily"
+msgstr "Täglich"
+
+msgctxt "selection:calendar.event.rrule,freq:"
+msgid "Hourly"
+msgstr "Stündlich"
+
+msgctxt "selection:calendar.event.rrule,freq:"
+msgid "Minutely"
+msgstr "Minütlich"
+
+msgctxt "selection:calendar.event.rrule,freq:"
+msgid "Monthly"
+msgstr "Monatlich"
+
+msgctxt "selection:calendar.event.rrule,freq:"
+msgid "Secondly"
+msgstr "Sekündlich"
+
+msgctxt "selection:calendar.event.rrule,freq:"
+msgid "Weekly"
+msgstr "Wöchentlich"
+
+msgctxt "selection:calendar.event.rrule,freq:"
+msgid "Yearly"
+msgstr "Jährlich"
+
+msgctxt "selection:calendar.event.rrule,wkst:"
+msgid "Friday"
+msgstr "Freitag"
+
+msgctxt "selection:calendar.event.rrule,wkst:"
+msgid "Monday"
+msgstr "Montag"
+
+msgctxt "selection:calendar.event.rrule,wkst:"
+msgid "Saturday"
+msgstr "Samstag"
+
+msgctxt "selection:calendar.event.rrule,wkst:"
+msgid "Sunday"
+msgstr "Sonntag"
+
+msgctxt "selection:calendar.event.rrule,wkst:"
+msgid "Thursday"
+msgstr "Donnerstag"
+
+msgctxt "selection:calendar.event.rrule,wkst:"
+msgid "Tuesday"
+msgstr "Dienstag"
+
+msgctxt "selection:calendar.event.rrule,wkst:"
+msgid "Wednesday"
+msgstr "Mittwoch"
+
+msgctxt "view:calendar.calendar:"
+msgid "Access Permissions"
+msgstr "Zugriffsberechtigungen"
+
 msgctxt "view:calendar.calendar:"
 msgid "Calendar"
 msgstr "Kalender"
@@ -1016,10 +1067,6 @@ msgctxt "view:calendar.calendar:"
 msgid "General"
 msgstr "Allgemein"
 
-msgctxt "view:calendar.calendar:"
-msgid "Security"
-msgstr "Sicherheit"
-
 msgctxt "view:calendar.category:"
 msgid "Categories"
 msgstr "Kategorien"
@@ -1092,10 +1139,6 @@ msgctxt "view:calendar.event:"
 msgid "Occurences"
 msgstr "Ereignisse"
 
-msgctxt "view:calendar.event:"
-msgid "Recurrences"
-msgstr "Wiederholungen"
-
 msgctxt "view:calendar.location:"
 msgid "Location"
 msgstr "Ort"
diff --git a/locale/es_AR.po b/locale/es_AR.po
index 39ec4b4..9805a8d 100644
--- a/locale/es_AR.po
+++ b/locale/es_AR.po
@@ -3,132 +3,124 @@ msgid ""
 msgstr "Content-Type: text/plain; charset=utf-8\n"
 
 msgctxt "error:calendar.calendar:"
-msgid "A user can have only one calendar!"
-msgstr "¡Un usuario solo puede tener un calendario!"
+msgid "A user can have only one calendar."
+msgstr "Un usuario sólo puede tener un calendario."
 
 msgctxt "error:calendar.calendar:"
-msgid "The name of calendar must be unique!"
-msgstr "¡El nombre del calendario debe ser único!"
+msgid "Calendar name \"%s\" can not end with .ics"
+msgstr "El nombre del calendario «%s» no debe terminar con la extensión .ics"
 
-msgctxt "error:calendar.category:"
-msgid "The name of calendar category must be unique!"
-msgstr "¡El nombre de la categoría  del calendario debe ser único!"
-
-msgctxt "error:calendar.event:"
-msgid "Recurrence can not be recurrent!"
-msgstr "¡Una recurrencia no puede ser recurrente!"
-
-msgctxt "error:calendar.event:"
-msgid "UUID and recurrence must be unique in a calendar!"
-msgstr "¡UUID y recurrencia deben ser únicos en un calendario!"
-
-msgctxt "error:calendar.location:"
-msgid "The name of calendar location must be unique!"
-msgstr "¡El nombre de la ubicación del calendario debe ser único!"
-
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Day\""
-msgstr "Inválido «por día»"
-
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Hour\""
-msgstr "Inválido «por hora»"
+msgctxt "error:calendar.calendar:"
+msgid "The name of calendar must be unique."
+msgstr "El nombre del calendario debe ser único."
 
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Minute\""
-msgstr "Inválido «por minuto»"
+msgctxt "error:calendar.category:"
+msgid "The name of calendar category must be unique."
+msgstr "El nombre de la categoría del calendario debe ser único."
 
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Month Day\""
-msgstr "Inválido «por día del mes»"
+msgctxt "error:calendar.event.exrule:"
+msgid "Invalid \"By Day\" in recurrence rule \"%s\""
+msgstr "El campo «Por día» de la regla de recurrencia «%s» no es correcto."
 
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Month\""
-msgstr "Inválido «por mes»"
+msgctxt "error:calendar.event.exrule:"
+msgid "Invalid \"By Hour\" in recurrence rule \"%s\""
+msgstr "El campo «Por hora» de la regla de recurrencia «%s» no es correcto."
 
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Position\""
-msgstr "Inválido «por posición»"
+msgctxt "error:calendar.event.exrule:"
+msgid "Invalid \"By Minute\" in recurrence rule \"%s\""
+msgstr "El campo «Por minuto» de la regla de recurrencia «%s» no es correcto."
 
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Second\""
-msgstr "Inválido «por segundos»"
+msgctxt "error:calendar.event.exrule:"
+msgid "Invalid \"By Month Day\" in recurrence rule \"%s\""
+msgstr ""
+"El campo «Por día del mes» de la regla de recurrencia «%s» no es correcto."
 
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Week Number\""
-msgstr "Inválido «por número de semana»"
+msgctxt "error:calendar.event.exrule:"
+msgid "Invalid \"By Month\" in recurrence rule \"%s\""
+msgstr "El campo «Por mes» de la regla de recurrencia «%s» no es correcto."
 
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Year Day\""
-msgstr "Inválido «por día del año»"
+msgctxt "error:calendar.event.exrule:"
+msgid "Invalid \"By Position\" in recurrence rule \"%s\""
+msgstr ""
+"El campo «Por ubicación» de la regla de recurrencia «%s» no es correcto."
 
-msgctxt "error:calendar.rrule:"
-msgid "Only one of \"until\" and \"count\" can be set!"
-msgstr "¡Solo se puede usar o «hasta» o «Número de veces»!"
+msgctxt "error:calendar.event.exrule:"
+msgid "Invalid \"By Second\" in recurrence rule \"%s\""
+msgstr ""
+"El campo «Por segundo» de la regla de recurrencia «%s» no es correcto."
 
-msgctxt "field:calendar.alarm,create_date:"
-msgid "Create Date"
-msgstr "Fecha creación"
+msgctxt "error:calendar.event.exrule:"
+msgid "Invalid \"By Week Number\" in recurrence rule \"%s\""
+msgstr ""
+"El campo «Por número de la semana» de la regla de recurrencia «%s» no es "
+"correcto."
 
-msgctxt "field:calendar.alarm,create_uid:"
-msgid "Create User"
-msgstr "Usuario creación"
+msgctxt "error:calendar.event.exrule:"
+msgid "Invalid \"By Year Day\" in recurrence rule \"%s\""
+msgstr ""
+"El campo «Por día del año» de la regla de recurrencia «%s» no es correcto."
 
-msgctxt "field:calendar.alarm,id:"
-msgid "ID"
-msgstr "ID"
+msgctxt "error:calendar.event.exrule:"
+msgid "Only one of \"until\" and \"count\" can be set."
+msgstr "Sólo un «hasta» y «contador» puede ser definido."
 
-msgctxt "field:calendar.alarm,rec_name:"
-msgid "Name"
-msgstr "Nombre"
+msgctxt "error:calendar.event.rrule:"
+msgid "Invalid \"By Day\" in recurrence rule \"%s\""
+msgstr "El campo «Por día» de la regla de recurrencia «%s» no es correcto."
 
-msgctxt "field:calendar.alarm,valarm:"
-msgid "valarm"
-msgstr "valarm"
+msgctxt "error:calendar.event.rrule:"
+msgid "Invalid \"By Hour\" in recurrence rule \"%s\""
+msgstr "El campo «Por hora» de la regla de recurrencia «%s» no es correcto."
 
-msgctxt "field:calendar.alarm,write_date:"
-msgid "Write Date"
-msgstr "Fecha modificación"
+msgctxt "error:calendar.event.rrule:"
+msgid "Invalid \"By Minute\" in recurrence rule \"%s\""
+msgstr "El campo «Por minuto» de la regla de recurrencia «%s» no es correcto."
 
-msgctxt "field:calendar.alarm,write_uid:"
-msgid "Write User"
-msgstr "Usuario modificación"
+msgctxt "error:calendar.event.rrule:"
+msgid "Invalid \"By Month Day\" in recurrence rule \"%s\""
+msgstr ""
+"El campo «Por día del mes» de la regla de recurrencia «%s» no es correcto."
 
-msgctxt "field:calendar.attendee,attendee:"
-msgid "attendee"
-msgstr "asistentes"
+msgctxt "error:calendar.event.rrule:"
+msgid "Invalid \"By Month\" in recurrence rule \"%s\""
+msgstr "El campo «Por mes» de la regla de recurrencia «%s» no es correcto."
 
-msgctxt "field:calendar.attendee,create_date:"
-msgid "Create Date"
-msgstr "Fecha creación"
+msgctxt "error:calendar.event.rrule:"
+msgid "Invalid \"By Position\" in recurrence rule \"%s\""
+msgstr ""
+"El campo «Por ubicación» de la regla de recurrencia «%s» no es correcto."
 
-msgctxt "field:calendar.attendee,create_uid:"
-msgid "Create User"
-msgstr "Usuario creación"
+msgctxt "error:calendar.event.rrule:"
+msgid "Invalid \"By Second\" in recurrence rule \"%s\""
+msgstr ""
+"El campo «Por segundo» de la regla de recurrencia «%s» no es correcto."
 
-msgctxt "field:calendar.attendee,email:"
-msgid "Email"
-msgstr "Correo electrónico"
+msgctxt "error:calendar.event.rrule:"
+msgid "Invalid \"By Week Number\" in recurrence rule \"%s\""
+msgstr ""
+"El campo «Por número de la semana» de la regla de recurrencia «%s» no es "
+"correcto."
 
-msgctxt "field:calendar.attendee,id:"
-msgid "ID"
-msgstr "ID"
+msgctxt "error:calendar.event.rrule:"
+msgid "Invalid \"By Year Day\" in recurrence rule \"%s\""
+msgstr ""
+"El campo «Por día del año» de la regla de recurrencia «%s» no es correcto."
 
-msgctxt "field:calendar.attendee,rec_name:"
-msgid "Name"
-msgstr "Nombre"
+msgctxt "error:calendar.event.rrule:"
+msgid "Only one of \"until\" and \"count\" can be set."
+msgstr "Sólo un «hasta» y «contador» puede ser definido."
 
-msgctxt "field:calendar.attendee,status:"
-msgid "Participation Status"
-msgstr "Estado de participación"
+msgctxt "error:calendar.event:"
+msgid "Recurrence \"%s\" can not be recurrent."
+msgstr "La recurrencia «%s» no puede ser recurrente."
 
-msgctxt "field:calendar.attendee,write_date:"
-msgid "Write Date"
-msgstr "Fecha modificación"
+msgctxt "error:calendar.event:"
+msgid "UUID and recurrence must be unique in a calendar."
+msgstr "UUID y la recurrencia deben ser únicos en el calendario."
 
-msgctxt "field:calendar.attendee,write_uid:"
-msgid "Write User"
-msgstr "Usuario modificación"
+msgctxt "error:calendar.location:"
+msgid "The name of calendar location must be unique."
+msgstr "El nombre de la ubicación del calendario debe ser único."
 
 msgctxt "field:calendar.calendar,create_date:"
 msgid "Create Date"
@@ -266,38 +258,6 @@ msgctxt "field:calendar.category,write_uid:"
 msgid "Write User"
 msgstr "Usuario modificación"
 
-msgctxt "field:calendar.date,create_date:"
-msgid "Create Date"
-msgstr "Fecha creación"
-
-msgctxt "field:calendar.date,create_uid:"
-msgid "Create User"
-msgstr "Usuario creación"
-
-msgctxt "field:calendar.date,date:"
-msgid "Is Date"
-msgstr "Es fecha"
-
-msgctxt "field:calendar.date,datetime:"
-msgid "Date"
-msgstr "Fecha"
-
-msgctxt "field:calendar.date,id:"
-msgid "ID"
-msgstr "ID"
-
-msgctxt "field:calendar.date,rec_name:"
-msgid "Name"
-msgstr "Nombre del campo"
-
-msgctxt "field:calendar.date,write_date:"
-msgid "Write Date"
-msgstr "Fecha modificación"
-
-msgctxt "field:calendar.date,write_uid:"
-msgid "Write User"
-msgstr "Usuario modificación"
-
 msgctxt "field:calendar.event,alarms:"
 msgid "Alarms"
 msgstr "Alarmas"
@@ -466,10 +426,6 @@ msgctxt "field:calendar.event-calendar.category,write_uid:"
 msgid "Write User"
 msgstr "Usuario modificación"
 
-msgctxt "field:calendar.event.alarm,calendar_alarm:"
-msgid "Calendar Alarm"
-msgstr "Alarma del calendario"
-
 msgctxt "field:calendar.event.alarm,create_date:"
 msgid "Create Date"
 msgstr "Fecha creación"
@@ -490,6 +446,10 @@ msgctxt "field:calendar.event.alarm,rec_name:"
 msgid "Name"
 msgstr "Nombre"
 
+msgctxt "field:calendar.event.alarm,valarm:"
+msgid "valarm"
+msgstr "valarm"
+
 msgctxt "field:calendar.event.alarm,write_date:"
 msgid "Write Date"
 msgstr "Fecha modificación"
@@ -498,9 +458,9 @@ msgctxt "field:calendar.event.alarm,write_uid:"
 msgid "Write User"
 msgstr "Usuario modificación"
 
-msgctxt "field:calendar.event.attendee,calendar_attendee:"
-msgid "Calendar Attendee"
-msgstr "Calendario de asistentes"
+msgctxt "field:calendar.event.attendee,attendee:"
+msgid "attendee"
+msgstr "asistente"
 
 msgctxt "field:calendar.event.attendee,create_date:"
 msgid "Create Date"
@@ -510,6 +470,10 @@ msgctxt "field:calendar.event.attendee,create_uid:"
 msgid "Create User"
 msgstr "Usuario creación"
 
+msgctxt "field:calendar.event.attendee,email:"
+msgid "Email"
+msgstr "Correo electrónico"
+
 msgctxt "field:calendar.event.attendee,event:"
 msgid "Event"
 msgstr "Evento"
@@ -522,6 +486,10 @@ msgctxt "field:calendar.event.attendee,rec_name:"
 msgid "Name"
 msgstr "Nombre"
 
+msgctxt "field:calendar.event.attendee,status:"
+msgid "Participation Status"
+msgstr "Estado de participación"
+
 msgctxt "field:calendar.event.attendee,write_date:"
 msgid "Write Date"
 msgstr "Fecha modificación"
@@ -530,10 +498,6 @@ msgctxt "field:calendar.event.attendee,write_uid:"
 msgid "Write User"
 msgstr "Usuario modificación"
 
-msgctxt "field:calendar.event.exdate,calendar_date:"
-msgid "Calendar Date"
-msgstr "Fecha Calendario"
-
 msgctxt "field:calendar.event.exdate,create_date:"
 msgid "Create Date"
 msgstr "Fecha creación"
@@ -542,6 +506,14 @@ msgctxt "field:calendar.event.exdate,create_uid:"
 msgid "Create User"
 msgstr "Usuario creación"
 
+msgctxt "field:calendar.event.exdate,date:"
+msgid "Is Date"
+msgstr "Es una fecha"
+
+msgctxt "field:calendar.event.exdate,datetime:"
+msgid "Date"
+msgstr "Fecha"
+
 msgctxt "field:calendar.event.exdate,event:"
 msgid "Event"
 msgstr "Evento"
@@ -562,9 +534,45 @@ msgctxt "field:calendar.event.exdate,write_uid:"
 msgid "Write User"
 msgstr "Usuario modificación"
 
-msgctxt "field:calendar.event.exrule,calendar_rrule:"
-msgid "Calendar RRule"
-msgstr "Regla de recurrencia"
+msgctxt "field:calendar.event.exrule,byday:"
+msgid "By Day"
+msgstr "Por día"
+
+msgctxt "field:calendar.event.exrule,byhour:"
+msgid "By Hour"
+msgstr "Por hora"
+
+msgctxt "field:calendar.event.exrule,byminute:"
+msgid "By Minute"
+msgstr "Por minuto"
+
+msgctxt "field:calendar.event.exrule,bymonth:"
+msgid "By Month"
+msgstr "Por mes"
+
+msgctxt "field:calendar.event.exrule,bymonthday:"
+msgid "By Month Day"
+msgstr "Por día del mes"
+
+msgctxt "field:calendar.event.exrule,bysecond:"
+msgid "By Second"
+msgstr "Por segundo"
+
+msgctxt "field:calendar.event.exrule,bysetpos:"
+msgid "By Position"
+msgstr "Por ubicación"
+
+msgctxt "field:calendar.event.exrule,byweekno:"
+msgid "By Week Number"
+msgstr "Por número de la semana"
+
+msgctxt "field:calendar.event.exrule,byyearday:"
+msgid "By Year Day"
+msgstr "Por día del año"
+
+msgctxt "field:calendar.event.exrule,count:"
+msgid "Count"
+msgstr "Contador"
 
 msgctxt "field:calendar.event.exrule,create_date:"
 msgid "Create Date"
@@ -578,14 +586,34 @@ msgctxt "field:calendar.event.exrule,event:"
 msgid "Event"
 msgstr "Evento"
 
+msgctxt "field:calendar.event.exrule,freq:"
+msgid "Frequency"
+msgstr "Frecuencia"
+
 msgctxt "field:calendar.event.exrule,id:"
 msgid "ID"
 msgstr "ID"
 
+msgctxt "field:calendar.event.exrule,interval:"
+msgid "Interval"
+msgstr "Intervalo"
+
 msgctxt "field:calendar.event.exrule,rec_name:"
 msgid "Name"
 msgstr "Nombre"
 
+msgctxt "field:calendar.event.exrule,until:"
+msgid "Until Date"
+msgstr "Hasta la fecha"
+
+msgctxt "field:calendar.event.exrule,until_date:"
+msgid "Is Date"
+msgstr "Es una fecha"
+
+msgctxt "field:calendar.event.exrule,wkst:"
+msgid "Week Day"
+msgstr "Día de la semana"
+
 msgctxt "field:calendar.event.exrule,write_date:"
 msgid "Write Date"
 msgstr "Fecha modificación"
@@ -594,10 +622,6 @@ msgctxt "field:calendar.event.exrule,write_uid:"
 msgid "Write User"
 msgstr "Usuario modificación"
 
-msgctxt "field:calendar.event.rdate,calendar_date:"
-msgid "Calendar Date"
-msgstr "Fecha Calendario"
-
 msgctxt "field:calendar.event.rdate,create_date:"
 msgid "Create Date"
 msgstr "Fecha creación"
@@ -606,6 +630,14 @@ msgctxt "field:calendar.event.rdate,create_uid:"
 msgid "Create User"
 msgstr "Usuario creación"
 
+msgctxt "field:calendar.event.rdate,date:"
+msgid "Is Date"
+msgstr "Es una fecha"
+
+msgctxt "field:calendar.event.rdate,datetime:"
+msgid "Date"
+msgstr "Fecha"
+
 msgctxt "field:calendar.event.rdate,event:"
 msgid "Event"
 msgstr "Evento"
@@ -626,147 +658,119 @@ msgctxt "field:calendar.event.rdate,write_uid:"
 msgid "Write User"
 msgstr "Usuario modificación"
 
-msgctxt "field:calendar.event.rrule,calendar_rrule:"
-msgid "Calendar RRule"
-msgstr "Regla de recurrencia"
-
-msgctxt "field:calendar.event.rrule,create_date:"
-msgid "Create Date"
-msgstr "Fecha creación"
-
-msgctxt "field:calendar.event.rrule,create_uid:"
-msgid "Create User"
-msgstr "Usuario creación"
-
-msgctxt "field:calendar.event.rrule,event:"
-msgid "Event"
-msgstr "Evento"
-
-msgctxt "field:calendar.event.rrule,id:"
-msgid "ID"
-msgstr "ID"
-
-msgctxt "field:calendar.event.rrule,rec_name:"
-msgid "Name"
-msgstr "Nombre"
-
-msgctxt "field:calendar.event.rrule,write_date:"
-msgid "Write Date"
-msgstr "Fecha modificación"
-
-msgctxt "field:calendar.event.rrule,write_uid:"
-msgid "Write User"
-msgstr "Usuario modificación"
-
-msgctxt "field:calendar.location,create_date:"
-msgid "Create Date"
-msgstr "Fecha creación"
-
-msgctxt "field:calendar.location,create_uid:"
-msgid "Create User"
-msgstr "Usuario creación"
-
-msgctxt "field:calendar.location,id:"
-msgid "ID"
-msgstr "ID"
-
-msgctxt "field:calendar.location,name:"
-msgid "Name"
-msgstr "Nombre"
-
-msgctxt "field:calendar.location,rec_name:"
-msgid "Name"
-msgstr "Nombre"
-
-msgctxt "field:calendar.location,write_date:"
-msgid "Write Date"
-msgstr "Fecha modificación"
-
-msgctxt "field:calendar.location,write_uid:"
-msgid "Write User"
-msgstr "Usuario modificación"
-
-msgctxt "field:calendar.rrule,byday:"
+msgctxt "field:calendar.event.rrule,byday:"
 msgid "By Day"
 msgstr "Por día"
 
-msgctxt "field:calendar.rrule,byhour:"
+msgctxt "field:calendar.event.rrule,byhour:"
 msgid "By Hour"
 msgstr "Por hora"
 
-msgctxt "field:calendar.rrule,byminute:"
+msgctxt "field:calendar.event.rrule,byminute:"
 msgid "By Minute"
 msgstr "Por minuto"
 
-msgctxt "field:calendar.rrule,bymonth:"
+msgctxt "field:calendar.event.rrule,bymonth:"
 msgid "By Month"
 msgstr "Por mes"
 
-msgctxt "field:calendar.rrule,bymonthday:"
+msgctxt "field:calendar.event.rrule,bymonthday:"
 msgid "By Month Day"
 msgstr "Por día del mes"
 
-msgctxt "field:calendar.rrule,bysecond:"
+msgctxt "field:calendar.event.rrule,bysecond:"
 msgid "By Second"
 msgstr "Por segundo"
 
-msgctxt "field:calendar.rrule,bysetpos:"
+msgctxt "field:calendar.event.rrule,bysetpos:"
 msgid "By Position"
-msgstr "Por posición"
+msgstr "Por ubicación"
 
-msgctxt "field:calendar.rrule,byweekno:"
+msgctxt "field:calendar.event.rrule,byweekno:"
 msgid "By Week Number"
-msgstr "Por día de la semana"
+msgstr "Por número de la semana"
 
-msgctxt "field:calendar.rrule,byyearday:"
+msgctxt "field:calendar.event.rrule,byyearday:"
 msgid "By Year Day"
 msgstr "Por día del año"
 
-msgctxt "field:calendar.rrule,count:"
+msgctxt "field:calendar.event.rrule,count:"
 msgid "Count"
-msgstr "Número de veces"
+msgstr "Contador"
 
-msgctxt "field:calendar.rrule,create_date:"
+msgctxt "field:calendar.event.rrule,create_date:"
 msgid "Create Date"
 msgstr "Fecha creación"
 
-msgctxt "field:calendar.rrule,create_uid:"
+msgctxt "field:calendar.event.rrule,create_uid:"
 msgid "Create User"
 msgstr "Usuario creación"
 
-msgctxt "field:calendar.rrule,freq:"
+msgctxt "field:calendar.event.rrule,event:"
+msgid "Event"
+msgstr "Evento"
+
+msgctxt "field:calendar.event.rrule,freq:"
 msgid "Frequency"
 msgstr "Frecuencia"
 
-msgctxt "field:calendar.rrule,id:"
+msgctxt "field:calendar.event.rrule,id:"
 msgid "ID"
 msgstr "ID"
 
-msgctxt "field:calendar.rrule,interval:"
+msgctxt "field:calendar.event.rrule,interval:"
 msgid "Interval"
 msgstr "Intervalo"
 
-msgctxt "field:calendar.rrule,rec_name:"
+msgctxt "field:calendar.event.rrule,rec_name:"
 msgid "Name"
 msgstr "Nombre"
 
-msgctxt "field:calendar.rrule,until:"
+msgctxt "field:calendar.event.rrule,until:"
 msgid "Until Date"
 msgstr "Hasta la fecha"
 
-msgctxt "field:calendar.rrule,until_date:"
+msgctxt "field:calendar.event.rrule,until_date:"
 msgid "Is Date"
-msgstr "Es fecha"
+msgstr "Es una fecha"
 
-msgctxt "field:calendar.rrule,wkst:"
+msgctxt "field:calendar.event.rrule,wkst:"
 msgid "Week Day"
 msgstr "Día de la semana"
 
-msgctxt "field:calendar.rrule,write_date:"
+msgctxt "field:calendar.event.rrule,write_date:"
 msgid "Write Date"
 msgstr "Fecha modificación"
 
-msgctxt "field:calendar.rrule,write_uid:"
+msgctxt "field:calendar.event.rrule,write_uid:"
+msgid "Write User"
+msgstr "Usuario modificación"
+
+msgctxt "field:calendar.location,create_date:"
+msgid "Create Date"
+msgstr "Fecha creación"
+
+msgctxt "field:calendar.location,create_uid:"
+msgid "Create User"
+msgstr "Usuario creación"
+
+msgctxt "field:calendar.location,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.location,name:"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:calendar.location,rec_name:"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:calendar.location,write_date:"
+msgid "Write Date"
+msgstr "Fecha modificación"
+
+msgctxt "field:calendar.location,write_uid:"
 msgid "Write User"
 msgstr "Usuario modificación"
 
@@ -778,25 +782,27 @@ msgctxt "help:calendar.calendar,owner:"
 msgid "The user must have an email"
 msgstr "El usuario debe tener un correo electrónico"
 
-msgctxt "help:calendar.date,date:"
-msgid "Ignore time of field \"Date\", but handle as date only."
-msgstr "Ignore tiempo del campo \"Fecha\", pero manejelo como fecha solamente."
-
 msgctxt "help:calendar.event,uuid:"
 msgid "Universally Unique Identifier"
 msgstr "Identificador universal único"
 
-msgctxt "help:calendar.rrule,until_date:"
+msgctxt "help:calendar.event.exdate,date:"
+msgid "Ignore time of field \"Date\", but handle as date only."
+msgstr "Ignora la hora del campo «Fecha», pero usar como única fecha."
+
+msgctxt "help:calendar.event.exrule,until_date:"
 msgid "Ignore time of field \"Until Date\", but handle as date only."
-msgstr "Ignora la hora del campo «Hasta la fecha», y trata solo la fecha"
+msgstr ""
+"Ignora la hora del campo «Hasta la fecha», pero usar como única fecha."
 
-msgctxt "model:calendar.alarm,name:"
-msgid "Alarm"
-msgstr "Alarma"
+msgctxt "help:calendar.event.rdate,date:"
+msgid "Ignore time of field \"Date\", but handle as date only."
+msgstr "Ignora la hora del campo «Fecha», pero usar como única fecha."
 
-msgctxt "model:calendar.attendee,name:"
-msgid "Attendee"
-msgstr "Asistentes"
+msgctxt "help:calendar.event.rrule,until_date:"
+msgid "Ignore time of field \"Until Date\", but handle as date only."
+msgstr ""
+"Ignora la hora del campo «Hasta la fecha», pero usar como única fecha."
 
 msgctxt "model:calendar.calendar,name:"
 msgid "Calendar"
@@ -804,20 +810,16 @@ msgstr "Calendario"
 
 msgctxt "model:calendar.calendar-read-res.user,name:"
 msgid "Calendar - read - User"
-msgstr "Calendario - leer - usuario"
+msgstr "Calendario - leer - Usuario"
 
 msgctxt "model:calendar.calendar-write-res.user,name:"
 msgid "Calendar - write - User"
-msgstr "Calendario - escribir - usuario"
+msgstr "Calendario - escribir - Usuario"
 
 msgctxt "model:calendar.category,name:"
 msgid "Category"
 msgstr "Categoría"
 
-msgctxt "model:calendar.date,name:"
-msgid "Calendar Date"
-msgstr "Fecha Calendario"
-
 msgctxt "model:calendar.event,name:"
 msgid "Event"
 msgstr "Evento"
@@ -854,10 +856,6 @@ msgctxt "model:calendar.location,name:"
 msgid "Location"
 msgstr "Ubicación"
 
-msgctxt "model:calendar.rrule,name:"
-msgid "Recurrence Rule"
-msgstr "Regla de recurrencia"
-
 msgctxt "model:ir.action,name:act_calendar_form"
 msgid "Calendars"
 msgstr "Calendarios"
@@ -872,7 +870,7 @@ msgstr "Eventos"
 
 msgctxt "model:ir.ui.menu,name:menu_calendar"
 msgid "Calendar"
-msgstr "Gestión de calendario"
+msgstr "Calendarios"
 
 msgctxt "model:ir.ui.menu,name:menu_calendar_form"
 msgid "Calendars"
@@ -886,30 +884,6 @@ msgctxt "model:res.group,name:group_calendar_admin"
 msgid "Calendar Administration"
 msgstr "Administración de calendario"
 
-msgctxt "selection:calendar.attendee,status:"
-msgid ""
-msgstr ""
-
-msgctxt "selection:calendar.attendee,status:"
-msgid "Accepted"
-msgstr "Aceptada"
-
-msgctxt "selection:calendar.attendee,status:"
-msgid "Declined"
-msgstr "Rehusado"
-
-msgctxt "selection:calendar.attendee,status:"
-msgid "Delegated"
-msgstr "Delegada"
-
-msgctxt "selection:calendar.attendee,status:"
-msgid "Needs Action"
-msgstr "Necesita una acción"
-
-msgctxt "selection:calendar.attendee,status:"
-msgid "Tentative"
-msgstr "Tentativa"
-
 msgctxt "selection:calendar.event,classification:"
 msgid "Confidential"
 msgstr "Confidencial"
@@ -946,63 +920,147 @@ msgctxt "selection:calendar.event,transp:"
 msgid "Transparent"
 msgstr "Transparente"
 
-msgctxt "selection:calendar.rrule,freq:"
+msgctxt "selection:calendar.event.attendee,status:"
+msgid ""
+msgstr ""
+
+msgctxt "selection:calendar.event.attendee,status:"
+msgid "Accepted"
+msgstr "Aceptado"
+
+msgctxt "selection:calendar.event.attendee,status:"
+msgid "Declined"
+msgstr "Rechazado"
+
+msgctxt "selection:calendar.event.attendee,status:"
+msgid "Delegated"
+msgstr "Delegado"
+
+msgctxt "selection:calendar.event.attendee,status:"
+msgid "Needs Action"
+msgstr "Necesita una acción"
+
+msgctxt "selection:calendar.event.attendee,status:"
+msgid "Tentative"
+msgstr "Tentativo"
+
+msgctxt "selection:calendar.event.exrule,freq:"
+msgid "Daily"
+msgstr "Diariamente"
+
+msgctxt "selection:calendar.event.exrule,freq:"
+msgid "Hourly"
+msgstr "Cada hora"
+
+msgctxt "selection:calendar.event.exrule,freq:"
+msgid "Minutely"
+msgstr "Cada minuto"
+
+msgctxt "selection:calendar.event.exrule,freq:"
+msgid "Monthly"
+msgstr "Mensualmente"
+
+msgctxt "selection:calendar.event.exrule,freq:"
+msgid "Secondly"
+msgstr "Cada segundo"
+
+msgctxt "selection:calendar.event.exrule,freq:"
+msgid "Weekly"
+msgstr "Semanalmente"
+
+msgctxt "selection:calendar.event.exrule,freq:"
+msgid "Yearly"
+msgstr "Anualmente"
+
+msgctxt "selection:calendar.event.exrule,wkst:"
+msgid "Friday"
+msgstr "Viernes"
+
+msgctxt "selection:calendar.event.exrule,wkst:"
+msgid "Monday"
+msgstr "Lunes"
+
+msgctxt "selection:calendar.event.exrule,wkst:"
+msgid "Saturday"
+msgstr "Sábado"
+
+msgctxt "selection:calendar.event.exrule,wkst:"
+msgid "Sunday"
+msgstr "Domingo"
+
+msgctxt "selection:calendar.event.exrule,wkst:"
+msgid "Thursday"
+msgstr "Jueves"
+
+msgctxt "selection:calendar.event.exrule,wkst:"
+msgid "Tuesday"
+msgstr "Martes"
+
+msgctxt "selection:calendar.event.exrule,wkst:"
+msgid "Wednesday"
+msgstr "Miércoles"
+
+msgctxt "selection:calendar.event.rrule,freq:"
 msgid "Daily"
 msgstr "Diariamente"
 
-msgctxt "selection:calendar.rrule,freq:"
+msgctxt "selection:calendar.event.rrule,freq:"
 msgid "Hourly"
 msgstr "Cada hora"
 
-msgctxt "selection:calendar.rrule,freq:"
+msgctxt "selection:calendar.event.rrule,freq:"
 msgid "Minutely"
 msgstr "Cada minuto"
 
-msgctxt "selection:calendar.rrule,freq:"
+msgctxt "selection:calendar.event.rrule,freq:"
 msgid "Monthly"
 msgstr "Mensualmente"
 
-msgctxt "selection:calendar.rrule,freq:"
+msgctxt "selection:calendar.event.rrule,freq:"
 msgid "Secondly"
 msgstr "Cada segundo"
 
-msgctxt "selection:calendar.rrule,freq:"
+msgctxt "selection:calendar.event.rrule,freq:"
 msgid "Weekly"
 msgstr "Semanalmente"
 
-msgctxt "selection:calendar.rrule,freq:"
+msgctxt "selection:calendar.event.rrule,freq:"
 msgid "Yearly"
 msgstr "Anualmente"
 
-msgctxt "selection:calendar.rrule,wkst:"
+msgctxt "selection:calendar.event.rrule,wkst:"
 msgid "Friday"
 msgstr "Viernes"
 
-msgctxt "selection:calendar.rrule,wkst:"
+msgctxt "selection:calendar.event.rrule,wkst:"
 msgid "Monday"
 msgstr "Lunes"
 
-msgctxt "selection:calendar.rrule,wkst:"
+msgctxt "selection:calendar.event.rrule,wkst:"
 msgid "Saturday"
 msgstr "Sábado"
 
-msgctxt "selection:calendar.rrule,wkst:"
+msgctxt "selection:calendar.event.rrule,wkst:"
 msgid "Sunday"
 msgstr "Domingo"
 
-msgctxt "selection:calendar.rrule,wkst:"
+msgctxt "selection:calendar.event.rrule,wkst:"
 msgid "Thursday"
 msgstr "Jueves"
 
-msgctxt "selection:calendar.rrule,wkst:"
+msgctxt "selection:calendar.event.rrule,wkst:"
 msgid "Tuesday"
 msgstr "Martes"
 
-msgctxt "selection:calendar.rrule,wkst:"
+msgctxt "selection:calendar.event.rrule,wkst:"
 msgid "Wednesday"
 msgstr "Miércoles"
 
 msgctxt "view:calendar.calendar:"
+msgid "Access Permissions"
+msgstr "Permisos de acceso"
+
+msgctxt "view:calendar.calendar:"
 msgid "Calendar"
 msgstr "Calendario"
 
@@ -1014,10 +1072,6 @@ msgctxt "view:calendar.calendar:"
 msgid "General"
 msgstr "General"
 
-msgctxt "view:calendar.calendar:"
-msgid "Security"
-msgstr "Seguridad"
-
 msgctxt "view:calendar.category:"
 msgid "Categories"
 msgstr "Categorías"
diff --git a/locale/es_CO.po b/locale/es_CO.po
index eaf3e4d..571f7af 100644
--- a/locale/es_CO.po
+++ b/locale/es_CO.po
@@ -3,132 +3,112 @@ msgid ""
 msgstr "Content-Type: text/plain; charset=utf-8\n"
 
 msgctxt "error:calendar.calendar:"
-msgid "A user can have only one calendar!"
-msgstr "¡Un usuario puede tener a lo sumo un calendario!"
+msgid "A user can have only one calendar."
+msgstr "Un usuario solo puede tener un calendario."
 
 msgctxt "error:calendar.calendar:"
-msgid "The name of calendar must be unique!"
-msgstr "¡El nombre del calendario es único!"
+msgid "Calendar name \"%s\" can not end with .ics"
+msgstr "El nombre del calendario \"%s\" no puede terminar con .ics"
+
+msgctxt "error:calendar.calendar:"
+msgid "The name of calendar must be unique."
+msgstr "El nombre de calendario debe ser único."
 
 msgctxt "error:calendar.category:"
-msgid "The name of calendar category must be unique!"
+msgid "The name of calendar category must be unique."
 msgstr "¡El nombre de la categoría de calendario debe ser único!"
 
-msgctxt "error:calendar.event:"
-msgid "Recurrence can not be recurrent!"
-msgstr "¡La repetición no puede repetirse!"
-
-msgctxt "error:calendar.event:"
-msgid "UUID and recurrence must be unique in a calendar!"
-msgstr "¡El UUID y la recurrencia deben ser únicos por calendario! "
+msgctxt "error:calendar.event.exrule:"
+msgid "Invalid \"By Day\" in recurrence rule \"%s\""
+msgstr "Inválido \"Por Día\" en regla recurrente \"%s\""
 
-msgctxt "error:calendar.location:"
-msgid "The name of calendar location must be unique!"
-msgstr "¡El nombre del lugar del calendario debe ser único!"
+msgctxt "error:calendar.event.exrule:"
+msgid "Invalid \"By Hour\" in recurrence rule \"%s\""
+msgstr "Inválido \"Por Hora\" en regla recurrente \"%s\""
 
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Day\""
-msgstr "Inválido \"Por Día\""
+msgctxt "error:calendar.event.exrule:"
+msgid "Invalid \"By Minute\" in recurrence rule \"%s\""
+msgstr "Inválido \"Por Minuto\" en regla recurrente \"%s\""
 
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Hour\""
-msgstr "Inválido \"Por Hora\""
+msgctxt "error:calendar.event.exrule:"
+msgid "Invalid \"By Month Day\" in recurrence rule \"%s\""
+msgstr "Inválido \"Por Día del Mes\" en regla recurrente \"%s\""
 
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Minute\""
-msgstr "Inválido \"Por Minuto\""
+msgctxt "error:calendar.event.exrule:"
+msgid "Invalid \"By Month\" in recurrence rule \"%s\""
+msgstr "Inválido \"Por Mes\" en regla recurrente \"%s\""
 
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Month Day\""
-msgstr "Inválido \"Por Día del Mes\""
+msgctxt "error:calendar.event.exrule:"
+msgid "Invalid \"By Position\" in recurrence rule \"%s\""
+msgstr "Inválido \"Por Position\" en regla recurrente \"%s\""
 
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Month\""
-msgstr "Inválido \"Por Mes\""
+msgctxt "error:calendar.event.exrule:"
+msgid "Invalid \"By Second\" in recurrence rule \"%s\""
+msgstr "Inválido \"Por Segundo\" en regla recurrente \"%s\""
 
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Position\""
-msgstr "Inválido \"Por Posición\""
+msgctxt "error:calendar.event.exrule:"
+msgid "Invalid \"By Week Number\" in recurrence rule \"%s\""
+msgstr "Inválido \"Por Número de la Semana\" en regla recurrente \"%s\""
 
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Second\""
-msgstr "Inválido \"Por Segundo\""
+msgctxt "error:calendar.event.exrule:"
+msgid "Invalid \"By Year Day\" in recurrence rule \"%s\""
+msgstr "Inválido \"Por Día del Año\" en regla recurrente \"%s\""
 
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Week Number\""
-msgstr "Inválido \"Por Número de Semana\""
-
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Year Day\""
-msgstr "Inválido \"Por Día del Año\""
-
-msgctxt "error:calendar.rrule:"
-msgid "Only one of \"until\" and \"count\" can be set!"
+msgctxt "error:calendar.event.exrule:"
+msgid "Only one of \"until\" and \"count\" can be set."
 msgstr "Solo un \"hasta\" y \"contar\" pude ser establecido!"
 
-msgctxt "field:calendar.alarm,create_date:"
-msgid "Create Date"
-msgstr "Fecha de Creación"
+msgctxt "error:calendar.event.rrule:"
+msgid "Invalid \"By Day\" in recurrence rule \"%s\""
+msgstr "Inválido \"Por Día\" en regla recurrente \"%s\""
 
-msgctxt "field:calendar.alarm,create_uid:"
-msgid "Create User"
-msgstr "Creado por Usuario"
-
-msgctxt "field:calendar.alarm,id:"
-msgid "ID"
-msgstr "ID"
-
-msgctxt "field:calendar.alarm,rec_name:"
-msgid "Name"
-msgstr "Nombre"
-
-msgctxt "field:calendar.alarm,valarm:"
-msgid "valarm"
-msgstr "valarma"
+msgctxt "error:calendar.event.rrule:"
+msgid "Invalid \"By Hour\" in recurrence rule \"%s\""
+msgstr "Inválido \"Por Hora\" en regla recurrente \"%s\""
 
-msgctxt "field:calendar.alarm,write_date:"
-msgid "Write Date"
-msgstr "Fecha de Modificación"
+msgctxt "error:calendar.event.rrule:"
+msgid "Invalid \"By Minute\" in recurrence rule \"%s\""
+msgstr "Inválido \"Por Minuto\" en regla recurrente \"%s\""
 
-msgctxt "field:calendar.alarm,write_uid:"
-msgid "Write User"
-msgstr "Modificado por Usuario"
+msgctxt "error:calendar.event.rrule:"
+msgid "Invalid \"By Month Day\" in recurrence rule \"%s\""
+msgstr "Inválido \"Por Día del Mes\" en regla recurrente \"%s\""
 
-msgctxt "field:calendar.attendee,attendee:"
-msgid "attendee"
-msgstr "Asistente"
+msgctxt "error:calendar.event.rrule:"
+msgid "Invalid \"By Month\" in recurrence rule \"%s\""
+msgstr "Inválido \"Por Mes\" en regla recurrente \"%s\""
 
-msgctxt "field:calendar.attendee,create_date:"
-msgid "Create Date"
-msgstr "Fecha de Creación"
+msgctxt "error:calendar.event.rrule:"
+msgid "Invalid \"By Position\" in recurrence rule \"%s\""
+msgstr "Inválido \"Por Posición\" en regla recurrente \"%s\""
 
-msgctxt "field:calendar.attendee,create_uid:"
-msgid "Create User"
-msgstr "Creado por Usuario"
+msgctxt "error:calendar.event.rrule:"
+msgid "Invalid \"By Second\" in recurrence rule \"%s\""
+msgstr "Inválido \"Por Segundo\" en regla recurrente \"%s\""
 
-msgctxt "field:calendar.attendee,email:"
-msgid "Email"
-msgstr "Correo Electrónico"
+msgctxt "error:calendar.event.rrule:"
+msgid "Invalid \"By Week Number\" in recurrence rule \"%s\""
+msgstr "Inválido \"Por Número de Semana\" en regla recurrente \"%s\""
 
-msgctxt "field:calendar.attendee,id:"
-msgid "ID"
-msgstr "ID"
+msgctxt "error:calendar.event.rrule:"
+msgid "Invalid \"By Year Day\" in recurrence rule \"%s\""
+msgstr "Inválido \"Por Día del Año\" en regla recurrente \"%s\""
 
-msgctxt "field:calendar.attendee,rec_name:"
-msgid "Name"
-msgstr "Nombre"
+msgctxt "error:calendar.event.rrule:"
+msgid "Only one of \"until\" and \"count\" can be set."
+msgstr "Solo un \"hasta\" y \"contar\" pude ser establecido!"
 
-msgctxt "field:calendar.attendee,status:"
-msgid "Participation Status"
-msgstr "Estado de Participación"
+msgctxt "error:calendar.event:"
+msgid "Recurrence \"%s\" can not be recurrent."
+msgstr "Recurrencia \"%s\" no puede ser recurrente."
 
-msgctxt "field:calendar.attendee,write_date:"
-msgid "Write Date"
-msgstr "Fecha de Modificación"
+msgctxt "error:calendar.event:"
+msgid "UUID and recurrence must be unique in a calendar."
+msgstr "UUID y recurrencia debe ser única en un calendario."
 
-msgctxt "field:calendar.attendee,write_uid:"
-msgid "Write User"
-msgstr "Modificado por Usuario"
+msgctxt "error:calendar.location:"
+msgid "The name of calendar location must be unique."
+msgstr "El nombre de la ubicación del calendario bede ser único."
 
 msgctxt "field:calendar.calendar,create_date:"
 msgid "Create Date"
@@ -266,38 +246,6 @@ msgctxt "field:calendar.category,write_uid:"
 msgid "Write User"
 msgstr "Modificado por Usuario"
 
-msgctxt "field:calendar.date,create_date:"
-msgid "Create Date"
-msgstr "Fecha de Creación"
-
-msgctxt "field:calendar.date,create_uid:"
-msgid "Create User"
-msgstr "Creado por Usuario"
-
-msgctxt "field:calendar.date,date:"
-msgid "Is Date"
-msgstr "Es Fecha"
-
-msgctxt "field:calendar.date,datetime:"
-msgid "Date"
-msgstr "Fecha"
-
-msgctxt "field:calendar.date,id:"
-msgid "ID"
-msgstr "ID"
-
-msgctxt "field:calendar.date,rec_name:"
-msgid "Name"
-msgstr "Nombre"
-
-msgctxt "field:calendar.date,write_date:"
-msgid "Write Date"
-msgstr "Fecha de Modificación"
-
-msgctxt "field:calendar.date,write_uid:"
-msgid "Write User"
-msgstr "Modificado por Usuario"
-
 msgctxt "field:calendar.event,alarms:"
 msgid "Alarms"
 msgstr "Alarmas"
@@ -466,10 +414,6 @@ msgctxt "field:calendar.event-calendar.category,write_uid:"
 msgid "Write User"
 msgstr "Modificado por Usuario"
 
-msgctxt "field:calendar.event.alarm,calendar_alarm:"
-msgid "Calendar Alarm"
-msgstr "Alarma del Calendario"
-
 msgctxt "field:calendar.event.alarm,create_date:"
 msgid "Create Date"
 msgstr "Fecha de Creación"
@@ -490,6 +434,10 @@ msgctxt "field:calendar.event.alarm,rec_name:"
 msgid "Name"
 msgstr "Nombre"
 
+msgctxt "field:calendar.event.alarm,valarm:"
+msgid "valarm"
+msgstr "valarma"
+
 msgctxt "field:calendar.event.alarm,write_date:"
 msgid "Write Date"
 msgstr "Fecha de Modificación"
@@ -498,9 +446,9 @@ msgctxt "field:calendar.event.alarm,write_uid:"
 msgid "Write User"
 msgstr "Modificado por Usuario"
 
-msgctxt "field:calendar.event.attendee,calendar_attendee:"
-msgid "Calendar Attendee"
-msgstr "Asistente de Calendario "
+msgctxt "field:calendar.event.attendee,attendee:"
+msgid "attendee"
+msgstr "Asistente"
 
 msgctxt "field:calendar.event.attendee,create_date:"
 msgid "Create Date"
@@ -510,6 +458,10 @@ msgctxt "field:calendar.event.attendee,create_uid:"
 msgid "Create User"
 msgstr "Creado por Usuario"
 
+msgctxt "field:calendar.event.attendee,email:"
+msgid "Email"
+msgstr "Correo Electrónico"
+
 msgctxt "field:calendar.event.attendee,event:"
 msgid "Event"
 msgstr "Evento"
@@ -522,6 +474,10 @@ msgctxt "field:calendar.event.attendee,rec_name:"
 msgid "Name"
 msgstr "Nombre"
 
+msgctxt "field:calendar.event.attendee,status:"
+msgid "Participation Status"
+msgstr "Estado de Participación"
+
 msgctxt "field:calendar.event.attendee,write_date:"
 msgid "Write Date"
 msgstr "Fecha de Modificación"
@@ -530,10 +486,6 @@ msgctxt "field:calendar.event.attendee,write_uid:"
 msgid "Write User"
 msgstr "Modificado por Usuario"
 
-msgctxt "field:calendar.event.exdate,calendar_date:"
-msgid "Calendar Date"
-msgstr "Fecha Calendario"
-
 msgctxt "field:calendar.event.exdate,create_date:"
 msgid "Create Date"
 msgstr "Fecha de Creación"
@@ -542,6 +494,14 @@ msgctxt "field:calendar.event.exdate,create_uid:"
 msgid "Create User"
 msgstr "Creado por Usuario"
 
+msgctxt "field:calendar.event.exdate,date:"
+msgid "Is Date"
+msgstr "Esta Fecha"
+
+msgctxt "field:calendar.event.exdate,datetime:"
+msgid "Date"
+msgstr "Fecha"
+
 msgctxt "field:calendar.event.exdate,event:"
 msgid "Event"
 msgstr "Evento"
@@ -562,9 +522,45 @@ msgctxt "field:calendar.event.exdate,write_uid:"
 msgid "Write User"
 msgstr "Modificado por Usuario"
 
-msgctxt "field:calendar.event.exrule,calendar_rrule:"
-msgid "Calendar RRule"
-msgstr "Regla de Calendario"
+msgctxt "field:calendar.event.exrule,byday:"
+msgid "By Day"
+msgstr "Por Día"
+
+msgctxt "field:calendar.event.exrule,byhour:"
+msgid "By Hour"
+msgstr "Por Hora"
+
+msgctxt "field:calendar.event.exrule,byminute:"
+msgid "By Minute"
+msgstr "Por Minuto"
+
+msgctxt "field:calendar.event.exrule,bymonth:"
+msgid "By Month"
+msgstr "Por Mes"
+
+msgctxt "field:calendar.event.exrule,bymonthday:"
+msgid "By Month Day"
+msgstr "Por Día del Mes"
+
+msgctxt "field:calendar.event.exrule,bysecond:"
+msgid "By Second"
+msgstr "Por Segundo"
+
+msgctxt "field:calendar.event.exrule,bysetpos:"
+msgid "By Position"
+msgstr "Por Posición"
+
+msgctxt "field:calendar.event.exrule,byweekno:"
+msgid "By Week Number"
+msgstr "Por Número de la Semana"
+
+msgctxt "field:calendar.event.exrule,byyearday:"
+msgid "By Year Day"
+msgstr "Por Día del Año"
+
+msgctxt "field:calendar.event.exrule,count:"
+msgid "Count"
+msgstr "Contar"
 
 msgctxt "field:calendar.event.exrule,create_date:"
 msgid "Create Date"
@@ -578,14 +574,34 @@ msgctxt "field:calendar.event.exrule,event:"
 msgid "Event"
 msgstr "Evento"
 
+msgctxt "field:calendar.event.exrule,freq:"
+msgid "Frequency"
+msgstr "Frecuencia"
+
 msgctxt "field:calendar.event.exrule,id:"
 msgid "ID"
 msgstr "ID"
 
+msgctxt "field:calendar.event.exrule,interval:"
+msgid "Interval"
+msgstr "Intervalo"
+
 msgctxt "field:calendar.event.exrule,rec_name:"
 msgid "Name"
 msgstr "Nombre"
 
+msgctxt "field:calendar.event.exrule,until:"
+msgid "Until Date"
+msgstr "Hasta la Fecha"
+
+msgctxt "field:calendar.event.exrule,until_date:"
+msgid "Is Date"
+msgstr "Esta Fecha"
+
+msgctxt "field:calendar.event.exrule,wkst:"
+msgid "Week Day"
+msgstr "Día de la Semana"
+
 msgctxt "field:calendar.event.exrule,write_date:"
 msgid "Write Date"
 msgstr "Fecha de Modificación"
@@ -594,10 +610,6 @@ msgctxt "field:calendar.event.exrule,write_uid:"
 msgid "Write User"
 msgstr "Modificado por Usuario"
 
-msgctxt "field:calendar.event.rdate,calendar_date:"
-msgid "Calendar Date"
-msgstr "Fecha Calendario"
-
 msgctxt "field:calendar.event.rdate,create_date:"
 msgid "Create Date"
 msgstr "Fecha de Creación"
@@ -606,6 +618,14 @@ msgctxt "field:calendar.event.rdate,create_uid:"
 msgid "Create User"
 msgstr "Creado por Usuario"
 
+msgctxt "field:calendar.event.rdate,date:"
+msgid "Is Date"
+msgstr "Esta Fecha"
+
+msgctxt "field:calendar.event.rdate,datetime:"
+msgid "Date"
+msgstr "Fecha"
+
 msgctxt "field:calendar.event.rdate,event:"
 msgid "Event"
 msgstr "Evento"
@@ -626,147 +646,119 @@ msgctxt "field:calendar.event.rdate,write_uid:"
 msgid "Write User"
 msgstr "Modificado por Usuario"
 
-msgctxt "field:calendar.event.rrule,calendar_rrule:"
-msgid "Calendar RRule"
-msgstr "Regla de Calendario"
-
-msgctxt "field:calendar.event.rrule,create_date:"
-msgid "Create Date"
-msgstr "Fecha de Creación"
-
-msgctxt "field:calendar.event.rrule,create_uid:"
-msgid "Create User"
-msgstr "Creado por Usuario"
-
-msgctxt "field:calendar.event.rrule,event:"
-msgid "Event"
-msgstr "Evento"
-
-msgctxt "field:calendar.event.rrule,id:"
-msgid "ID"
-msgstr "ID"
-
-msgctxt "field:calendar.event.rrule,rec_name:"
-msgid "Name"
-msgstr "Nombre"
-
-msgctxt "field:calendar.event.rrule,write_date:"
-msgid "Write Date"
-msgstr "Fecha de Modificación"
-
-msgctxt "field:calendar.event.rrule,write_uid:"
-msgid "Write User"
-msgstr "Modificado por Usuario"
-
-msgctxt "field:calendar.location,create_date:"
-msgid "Create Date"
-msgstr "Fecha de Creación"
-
-msgctxt "field:calendar.location,create_uid:"
-msgid "Create User"
-msgstr "Creado por Usuario"
-
-msgctxt "field:calendar.location,id:"
-msgid "ID"
-msgstr "ID"
-
-msgctxt "field:calendar.location,name:"
-msgid "Name"
-msgstr "Nombre"
-
-msgctxt "field:calendar.location,rec_name:"
-msgid "Name"
-msgstr "Nombre"
-
-msgctxt "field:calendar.location,write_date:"
-msgid "Write Date"
-msgstr "Fecha de Modificación"
-
-msgctxt "field:calendar.location,write_uid:"
-msgid "Write User"
-msgstr "Modificado por Usuario"
-
-msgctxt "field:calendar.rrule,byday:"
+msgctxt "field:calendar.event.rrule,byday:"
 msgid "By Day"
 msgstr "Por Día"
 
-msgctxt "field:calendar.rrule,byhour:"
+msgctxt "field:calendar.event.rrule,byhour:"
 msgid "By Hour"
 msgstr "Por Hora"
 
-msgctxt "field:calendar.rrule,byminute:"
+msgctxt "field:calendar.event.rrule,byminute:"
 msgid "By Minute"
 msgstr "Por Minuto"
 
-msgctxt "field:calendar.rrule,bymonth:"
+msgctxt "field:calendar.event.rrule,bymonth:"
 msgid "By Month"
 msgstr "Por Mes"
 
-msgctxt "field:calendar.rrule,bymonthday:"
+msgctxt "field:calendar.event.rrule,bymonthday:"
 msgid "By Month Day"
 msgstr "Por Día del Mes"
 
-msgctxt "field:calendar.rrule,bysecond:"
+msgctxt "field:calendar.event.rrule,bysecond:"
 msgid "By Second"
 msgstr "Por Segundo"
 
-msgctxt "field:calendar.rrule,bysetpos:"
+msgctxt "field:calendar.event.rrule,bysetpos:"
 msgid "By Position"
 msgstr "Por Posición"
 
-msgctxt "field:calendar.rrule,byweekno:"
+msgctxt "field:calendar.event.rrule,byweekno:"
 msgid "By Week Number"
 msgstr "Por Número de la Semana"
 
-msgctxt "field:calendar.rrule,byyearday:"
+msgctxt "field:calendar.event.rrule,byyearday:"
 msgid "By Year Day"
 msgstr "Por Día del Año"
 
-msgctxt "field:calendar.rrule,count:"
+msgctxt "field:calendar.event.rrule,count:"
 msgid "Count"
 msgstr "Contar"
 
-msgctxt "field:calendar.rrule,create_date:"
+msgctxt "field:calendar.event.rrule,create_date:"
 msgid "Create Date"
 msgstr "Fecha de Creación"
 
-msgctxt "field:calendar.rrule,create_uid:"
+msgctxt "field:calendar.event.rrule,create_uid:"
 msgid "Create User"
 msgstr "Creado por Usuario"
 
-msgctxt "field:calendar.rrule,freq:"
+msgctxt "field:calendar.event.rrule,event:"
+msgid "Event"
+msgstr "Evento"
+
+msgctxt "field:calendar.event.rrule,freq:"
 msgid "Frequency"
 msgstr "Frecuencia"
 
-msgctxt "field:calendar.rrule,id:"
+msgctxt "field:calendar.event.rrule,id:"
 msgid "ID"
 msgstr "ID"
 
-msgctxt "field:calendar.rrule,interval:"
+msgctxt "field:calendar.event.rrule,interval:"
 msgid "Interval"
 msgstr "Intervalo"
 
-msgctxt "field:calendar.rrule,rec_name:"
+msgctxt "field:calendar.event.rrule,rec_name:"
 msgid "Name"
 msgstr "Nombre"
 
-msgctxt "field:calendar.rrule,until:"
+msgctxt "field:calendar.event.rrule,until:"
 msgid "Until Date"
 msgstr "Hasta la Fecha"
 
-msgctxt "field:calendar.rrule,until_date:"
+msgctxt "field:calendar.event.rrule,until_date:"
 msgid "Is Date"
-msgstr "Es Fecha"
+msgstr "Esta Fecha"
 
-msgctxt "field:calendar.rrule,wkst:"
+msgctxt "field:calendar.event.rrule,wkst:"
 msgid "Week Day"
 msgstr "Día de la Semana"
 
-msgctxt "field:calendar.rrule,write_date:"
+msgctxt "field:calendar.event.rrule,write_date:"
+msgid "Write Date"
+msgstr "Fecha de Modificación"
+
+msgctxt "field:calendar.event.rrule,write_uid:"
+msgid "Write User"
+msgstr "Modificado por Usuario"
+
+msgctxt "field:calendar.location,create_date:"
+msgid "Create Date"
+msgstr "Fecha de Creación"
+
+msgctxt "field:calendar.location,create_uid:"
+msgid "Create User"
+msgstr "Creado por Usuario"
+
+msgctxt "field:calendar.location,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.location,name:"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:calendar.location,rec_name:"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:calendar.location,write_date:"
 msgid "Write Date"
 msgstr "Fecha de Modificación"
 
-msgctxt "field:calendar.rrule,write_uid:"
+msgctxt "field:calendar.location,write_uid:"
 msgid "Write User"
 msgstr "Modificado por Usuario"
 
@@ -778,27 +770,29 @@ msgctxt "help:calendar.calendar,owner:"
 msgid "The user must have an email"
 msgstr "El usuario debe tener un email"
 
-msgctxt "help:calendar.date,date:"
-msgid "Ignore time of field \"Date\", but handle as date only."
-msgstr "Ignore tiempo del campo \"Fecha\", pero manejelo como fecha solamente."
-
 msgctxt "help:calendar.event,uuid:"
 msgid "Universally Unique Identifier"
 msgstr "Idenitificador Universal Único"
 
-msgctxt "help:calendar.rrule,until_date:"
+msgctxt "help:calendar.event.exdate,date:"
+msgid "Ignore time of field \"Date\", but handle as date only."
+msgstr "Ignore tiempo del campo \"Fecha\", pero manejelo como fecha solamente."
+
+msgctxt "help:calendar.event.exrule,until_date:"
 msgid "Ignore time of field \"Until Date\", but handle as date only."
 msgstr ""
 "Ignore tiempo del campo \"Hasta la Fecha\", pero manejelo como fecha "
 "solamente."
 
-msgctxt "model:calendar.alarm,name:"
-msgid "Alarm"
-msgstr "Alarma"
+msgctxt "help:calendar.event.rdate,date:"
+msgid "Ignore time of field \"Date\", but handle as date only."
+msgstr "Ignore tiempo del campo \"Fecha\", pero manejelo como fecha solamente."
 
-msgctxt "model:calendar.attendee,name:"
-msgid "Attendee"
-msgstr "Asistente"
+msgctxt "help:calendar.event.rrule,until_date:"
+msgid "Ignore time of field \"Until Date\", but handle as date only."
+msgstr ""
+"Ignore tiempo del campo \"Hasta la Fecha\", pero manejelo como fecha "
+"solamente."
 
 msgctxt "model:calendar.calendar,name:"
 msgid "Calendar"
@@ -816,10 +810,6 @@ msgctxt "model:calendar.category,name:"
 msgid "Category"
 msgstr "Categoría"
 
-msgctxt "model:calendar.date,name:"
-msgid "Calendar Date"
-msgstr "Fecha Calendario"
-
 msgctxt "model:calendar.event,name:"
 msgid "Event"
 msgstr "Evento"
@@ -856,10 +846,6 @@ msgctxt "model:calendar.location,name:"
 msgid "Location"
 msgstr "Lugar"
 
-msgctxt "model:calendar.rrule,name:"
-msgid "Recurrence Rule"
-msgstr "Regla de Repetición"
-
 msgctxt "model:ir.action,name:act_calendar_form"
 msgid "Calendars"
 msgstr "Calendarios"
@@ -888,30 +874,6 @@ msgctxt "model:res.group,name:group_calendar_admin"
 msgid "Calendar Administration"
 msgstr "Administración Calendario"
 
-msgctxt "selection:calendar.attendee,status:"
-msgid ""
-msgstr "Punto de Orden"
-
-msgctxt "selection:calendar.attendee,status:"
-msgid "Accepted"
-msgstr "Aceptado"
-
-msgctxt "selection:calendar.attendee,status:"
-msgid "Declined"
-msgstr "Declinado"
-
-msgctxt "selection:calendar.attendee,status:"
-msgid "Delegated"
-msgstr "Delegado"
-
-msgctxt "selection:calendar.attendee,status:"
-msgid "Needs Action"
-msgstr "Necesita una Acción"
-
-msgctxt "selection:calendar.attendee,status:"
-msgid "Tentative"
-msgstr "Tentativa"
-
 msgctxt "selection:calendar.event,classification:"
 msgid "Confidential"
 msgstr "Confidencial"
@@ -924,6 +886,7 @@ msgctxt "selection:calendar.event,classification:"
 msgid "Public"
 msgstr "Público"
 
+#, fuzzy
 msgctxt "selection:calendar.event,status:"
 msgid ""
 msgstr "Punto de Orden"
@@ -948,62 +911,148 @@ msgctxt "selection:calendar.event,transp:"
 msgid "Transparent"
 msgstr "Transparente"
 
-msgctxt "selection:calendar.rrule,freq:"
+#, fuzzy
+msgctxt "selection:calendar.event.attendee,status:"
+msgid ""
+msgstr "Punto de Orden"
+
+msgctxt "selection:calendar.event.attendee,status:"
+msgid "Accepted"
+msgstr "Aceptado"
+
+msgctxt "selection:calendar.event.attendee,status:"
+msgid "Declined"
+msgstr "Declinado"
+
+msgctxt "selection:calendar.event.attendee,status:"
+msgid "Delegated"
+msgstr "Delegado"
+
+msgctxt "selection:calendar.event.attendee,status:"
+msgid "Needs Action"
+msgstr "Necesita una Acción"
+
+msgctxt "selection:calendar.event.attendee,status:"
+msgid "Tentative"
+msgstr "Tentativa"
+
+msgctxt "selection:calendar.event.exrule,freq:"
+msgid "Daily"
+msgstr "Diario"
+
+msgctxt "selection:calendar.event.exrule,freq:"
+msgid "Hourly"
+msgstr "Cada Hora"
+
+msgctxt "selection:calendar.event.exrule,freq:"
+msgid "Minutely"
+msgstr "Cada Minuto"
+
+msgctxt "selection:calendar.event.exrule,freq:"
+msgid "Monthly"
+msgstr "Mensualmente"
+
+msgctxt "selection:calendar.event.exrule,freq:"
+msgid "Secondly"
+msgstr "En segundo lugar"
+
+msgctxt "selection:calendar.event.exrule,freq:"
+msgid "Weekly"
+msgstr "Semanalmente"
+
+msgctxt "selection:calendar.event.exrule,freq:"
+msgid "Yearly"
+msgstr "Anualmente"
+
+msgctxt "selection:calendar.event.exrule,wkst:"
+msgid "Friday"
+msgstr "Viernes"
+
+msgctxt "selection:calendar.event.exrule,wkst:"
+msgid "Monday"
+msgstr "Lunes"
+
+msgctxt "selection:calendar.event.exrule,wkst:"
+msgid "Saturday"
+msgstr "Sábado"
+
+msgctxt "selection:calendar.event.exrule,wkst:"
+msgid "Sunday"
+msgstr "Domingo"
+
+msgctxt "selection:calendar.event.exrule,wkst:"
+msgid "Thursday"
+msgstr "Jueves"
+
+msgctxt "selection:calendar.event.exrule,wkst:"
+msgid "Tuesday"
+msgstr "Martes"
+
+msgctxt "selection:calendar.event.exrule,wkst:"
+msgid "Wednesday"
+msgstr "Miércoles"
+
+msgctxt "selection:calendar.event.rrule,freq:"
 msgid "Daily"
 msgstr "Diario"
 
-msgctxt "selection:calendar.rrule,freq:"
+msgctxt "selection:calendar.event.rrule,freq:"
 msgid "Hourly"
 msgstr "Cada Hora"
 
-msgctxt "selection:calendar.rrule,freq:"
+msgctxt "selection:calendar.event.rrule,freq:"
 msgid "Minutely"
 msgstr "Cada Minuto"
 
-msgctxt "selection:calendar.rrule,freq:"
+msgctxt "selection:calendar.event.rrule,freq:"
 msgid "Monthly"
 msgstr "Mensualmente"
 
-msgctxt "selection:calendar.rrule,freq:"
+msgctxt "selection:calendar.event.rrule,freq:"
 msgid "Secondly"
 msgstr "En segundo lugar"
 
-msgctxt "selection:calendar.rrule,freq:"
+msgctxt "selection:calendar.event.rrule,freq:"
 msgid "Weekly"
 msgstr "Semanalmente"
 
-msgctxt "selection:calendar.rrule,freq:"
+msgctxt "selection:calendar.event.rrule,freq:"
 msgid "Yearly"
 msgstr "Anualmente"
 
-msgctxt "selection:calendar.rrule,wkst:"
+msgctxt "selection:calendar.event.rrule,wkst:"
 msgid "Friday"
 msgstr "Viernes"
 
-msgctxt "selection:calendar.rrule,wkst:"
+msgctxt "selection:calendar.event.rrule,wkst:"
 msgid "Monday"
 msgstr "Lunes"
 
-msgctxt "selection:calendar.rrule,wkst:"
+msgctxt "selection:calendar.event.rrule,wkst:"
 msgid "Saturday"
 msgstr "Sábado"
 
-msgctxt "selection:calendar.rrule,wkst:"
+msgctxt "selection:calendar.event.rrule,wkst:"
 msgid "Sunday"
 msgstr "Domingo"
 
-msgctxt "selection:calendar.rrule,wkst:"
+msgctxt "selection:calendar.event.rrule,wkst:"
 msgid "Thursday"
 msgstr "Jueves"
 
-msgctxt "selection:calendar.rrule,wkst:"
+msgctxt "selection:calendar.event.rrule,wkst:"
 msgid "Tuesday"
 msgstr "Martes"
 
-msgctxt "selection:calendar.rrule,wkst:"
+msgctxt "selection:calendar.event.rrule,wkst:"
 msgid "Wednesday"
 msgstr "Miércoles"
 
+#, fuzzy
+msgctxt "view:calendar.calendar:"
+msgid "Access Permissions"
+msgstr "Permisos de Acceso"
+
 msgctxt "view:calendar.calendar:"
 msgid "Calendar"
 msgstr "Calendario"
@@ -1016,10 +1065,6 @@ msgctxt "view:calendar.calendar:"
 msgid "General"
 msgstr "General"
 
-msgctxt "view:calendar.calendar:"
-msgid "Security"
-msgstr "Seguridad"
-
 msgctxt "view:calendar.category:"
 msgid "Categories"
 msgstr "Categorías"
@@ -1092,10 +1137,6 @@ msgctxt "view:calendar.event:"
 msgid "Occurences"
 msgstr "Ocurrencias"
 
-msgctxt "view:calendar.event:"
-msgid "Recurrences"
-msgstr "Repeticiones"
-
 msgctxt "view:calendar.location:"
 msgid "Location"
 msgstr "Lugar"
diff --git a/locale/es_ES.po b/locale/es_ES.po
index aaf4fd4..bc47ca4 100644
--- a/locale/es_ES.po
+++ b/locale/es_ES.po
@@ -3,132 +3,124 @@ msgid ""
 msgstr "Content-Type: text/plain; charset=utf-8\n"
 
 msgctxt "error:calendar.calendar:"
-msgid "A user can have only one calendar!"
+msgid "A user can have only one calendar."
 msgstr "Un usuario sólo puede tener un calendario."
 
 msgctxt "error:calendar.calendar:"
-msgid "The name of calendar must be unique!"
+msgid "Calendar name \"%s\" can not end with .ics"
+msgstr "El nombre del calendario \"%s\" no debe terminar con la extensión .ics"
+
+msgctxt "error:calendar.calendar:"
+msgid "The name of calendar must be unique."
 msgstr "El nombre del calendario debe ser único."
 
 msgctxt "error:calendar.category:"
-msgid "The name of calendar category must be unique!"
+msgid "The name of calendar category must be unique."
 msgstr "El nombre de la categoría del calendario debe ser único."
 
-msgctxt "error:calendar.event:"
-msgid "Recurrence can not be recurrent!"
-msgstr "Una recurrencia no puede ser recurrente."
-
-msgctxt "error:calendar.event:"
-msgid "UUID and recurrence must be unique in a calendar!"
-msgstr "UUID y recurrencia deben ser únicos en un calendario."
-
-msgctxt "error:calendar.location:"
-msgid "The name of calendar location must be unique!"
-msgstr "El nombre de la ubicación del calendario debe ser único."
-
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Day\""
-msgstr "\"Por día\" no es correcto."
-
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Hour\""
-msgstr "\"Por hora\" no es correcto."
+msgctxt "error:calendar.event.exrule:"
+msgid "Invalid \"By Day\" in recurrence rule \"%s\""
+msgstr "El campo \"por dia\" de la regla de recurrencia \"%s\" no es correcto."
 
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Minute\""
-msgstr "\"Por minuto\" no es correcto."
+msgctxt "error:calendar.event.exrule:"
+msgid "Invalid \"By Hour\" in recurrence rule \"%s\""
+msgstr "El campo \"por hora\" de la regla de recurrencia \"%s\" no es correcto."
 
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Month Day\""
-msgstr "\"Por día del mes\" no es correcto."
+msgctxt "error:calendar.event.exrule:"
+msgid "Invalid \"By Minute\" in recurrence rule \"%s\""
+msgstr "El campo \"por minuto\" de la regla de recurrencia \"%s\" no es correcto."
 
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Month\""
-msgstr "\"Por mes\" no es correcto."
-
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Position\""
-msgstr "\"Por posición\" no es correcto."
-
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Second\""
-msgstr "\"Por segundos\" no es correcto."
+msgctxt "error:calendar.event.exrule:"
+msgid "Invalid \"By Month Day\" in recurrence rule \"%s\""
+msgstr ""
+"El campo \"por día del mes\" de la regla de recurrencia \"%s\" no es "
+"correcto."
 
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Week Number\""
-msgstr "\"Por número de semana\" no es correcto."
+msgctxt "error:calendar.event.exrule:"
+msgid "Invalid \"By Month\" in recurrence rule \"%s\""
+msgstr "El campo \"por mes\" de la regla de recurrencia \"%s\" no es correcto."
 
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Year Day\""
-msgstr "\"Por día del año\" no es correcto."
+msgctxt "error:calendar.event.exrule:"
+msgid "Invalid \"By Position\" in recurrence rule \"%s\""
+msgstr "El campo \"por ubicación\" de la regla de recurrencia \"%s\" no es correcto."
 
-msgctxt "error:calendar.rrule:"
-msgid "Only one of \"until\" and \"count\" can be set!"
-msgstr "Sólo se puede usar o \"Hasta\" o \"Número de veces\"."
+msgctxt "error:calendar.event.exrule:"
+msgid "Invalid \"By Second\" in recurrence rule \"%s\""
+msgstr "El campo \"por segundo\" de la regla de recurrencia \"%s\" no es correcto."
 
-msgctxt "field:calendar.alarm,create_date:"
-msgid "Create Date"
-msgstr "Fecha creación"
+msgctxt "error:calendar.event.exrule:"
+msgid "Invalid \"By Week Number\" in recurrence rule \"%s\""
+msgstr ""
+"El campo \"por número de la semana\" de la regla de recurrencia \"%s\" no es"
+" correcto."
 
-msgctxt "field:calendar.alarm,create_uid:"
-msgid "Create User"
-msgstr "Usuario creación"
+msgctxt "error:calendar.event.exrule:"
+msgid "Invalid \"By Year Day\" in recurrence rule \"%s\""
+msgstr ""
+"El campo \"por día del año\" de la regla de recurrencia \"%s\" no es "
+"correcto."
 
-msgctxt "field:calendar.alarm,id:"
-msgid "ID"
-msgstr "ID"
+msgctxt "error:calendar.event.exrule:"
+msgid "Only one of \"until\" and \"count\" can be set."
+msgstr "Define un \"hasta\" y un \"contador\"."
 
-msgctxt "field:calendar.alarm,rec_name:"
-msgid "Name"
-msgstr "Nombre"
+msgctxt "error:calendar.event.rrule:"
+msgid "Invalid \"By Day\" in recurrence rule \"%s\""
+msgstr "El campo \"por dia\" de la regla de recurrencia \"%s\" no es correcto."
 
-msgctxt "field:calendar.alarm,valarm:"
-msgid "valarm"
-msgstr "valarm"
+msgctxt "error:calendar.event.rrule:"
+msgid "Invalid \"By Hour\" in recurrence rule \"%s\""
+msgstr "El campo \"por hora\" de la regla de recurrencia \"%s\" no es correcto."
 
-msgctxt "field:calendar.alarm,write_date:"
-msgid "Write Date"
-msgstr "Fecha modificación"
+msgctxt "error:calendar.event.rrule:"
+msgid "Invalid \"By Minute\" in recurrence rule \"%s\""
+msgstr "El campo \"por minuto\" de la regla de recurrencia \"%s\" no es correcto."
 
-msgctxt "field:calendar.alarm,write_uid:"
-msgid "Write User"
-msgstr "Usuario modificación"
+msgctxt "error:calendar.event.rrule:"
+msgid "Invalid \"By Month Day\" in recurrence rule \"%s\""
+msgstr ""
+"El campo \"por día del mes\" de la regla de recurrencia \"%s\" no es "
+"correcto."
 
-msgctxt "field:calendar.attendee,attendee:"
-msgid "attendee"
-msgstr "asistentes"
+msgctxt "error:calendar.event.rrule:"
+msgid "Invalid \"By Month\" in recurrence rule \"%s\""
+msgstr "El campo \"por mes\" de la regla de recurrencia \"%s\" no es correcto."
 
-msgctxt "field:calendar.attendee,create_date:"
-msgid "Create Date"
-msgstr "Fecha creación"
+msgctxt "error:calendar.event.rrule:"
+msgid "Invalid \"By Position\" in recurrence rule \"%s\""
+msgstr "El campo \"por ubicación\" de la regla de recurrencia \"%s\" no es correcto."
 
-msgctxt "field:calendar.attendee,create_uid:"
-msgid "Create User"
-msgstr "Usuario creación"
+msgctxt "error:calendar.event.rrule:"
+msgid "Invalid \"By Second\" in recurrence rule \"%s\""
+msgstr "El campo \"por segundo\" de la regla de recurrencia \"%s\" no es correcto."
 
-msgctxt "field:calendar.attendee,email:"
-msgid "Email"
-msgstr "Correo electrónico"
+msgctxt "error:calendar.event.rrule:"
+msgid "Invalid \"By Week Number\" in recurrence rule \"%s\""
+msgstr ""
+"El campo \"por número de la semana\" de la regla de recurrencia \"%s\" no es"
+" correcto."
 
-msgctxt "field:calendar.attendee,id:"
-msgid "ID"
-msgstr "ID"
+msgctxt "error:calendar.event.rrule:"
+msgid "Invalid \"By Year Day\" in recurrence rule \"%s\""
+msgstr ""
+"El campo \"por día del año\" de la regla de recurrencia \"%s\" no es "
+"correcto."
 
-msgctxt "field:calendar.attendee,rec_name:"
-msgid "Name"
-msgstr "Nombre"
+msgctxt "error:calendar.event.rrule:"
+msgid "Only one of \"until\" and \"count\" can be set."
+msgstr "Define un \"hasta\" y un \"contador\"."
 
-msgctxt "field:calendar.attendee,status:"
-msgid "Participation Status"
-msgstr "Estado de participación"
+msgctxt "error:calendar.event:"
+msgid "Recurrence \"%s\" can not be recurrent."
+msgstr "La recurrencia \"%s\" no puede ser recurrente."
 
-msgctxt "field:calendar.attendee,write_date:"
-msgid "Write Date"
-msgstr "Fecha modificación"
+msgctxt "error:calendar.event:"
+msgid "UUID and recurrence must be unique in a calendar."
+msgstr "UUID y la recurrencia deber ser únicos en el calendario."
 
-msgctxt "field:calendar.attendee,write_uid:"
-msgid "Write User"
-msgstr "Usuario modificación"
+msgctxt "error:calendar.location:"
+msgid "The name of calendar location must be unique."
+msgstr "El nombre de la ubicación del calendario debe ser único."
 
 msgctxt "field:calendar.calendar,create_date:"
 msgid "Create Date"
@@ -266,38 +258,6 @@ msgctxt "field:calendar.category,write_uid:"
 msgid "Write User"
 msgstr "Usuario modificación"
 
-msgctxt "field:calendar.date,create_date:"
-msgid "Create Date"
-msgstr "Fecha creación"
-
-msgctxt "field:calendar.date,create_uid:"
-msgid "Create User"
-msgstr "Usuario creación"
-
-msgctxt "field:calendar.date,date:"
-msgid "Is Date"
-msgstr "Es fecha"
-
-msgctxt "field:calendar.date,datetime:"
-msgid "Date"
-msgstr "Fecha"
-
-msgctxt "field:calendar.date,id:"
-msgid "ID"
-msgstr "ID"
-
-msgctxt "field:calendar.date,rec_name:"
-msgid "Name"
-msgstr "Nombre"
-
-msgctxt "field:calendar.date,write_date:"
-msgid "Write Date"
-msgstr "Fecha modificación"
-
-msgctxt "field:calendar.date,write_uid:"
-msgid "Write User"
-msgstr "Usuario modificación"
-
 msgctxt "field:calendar.event,alarms:"
 msgid "Alarms"
 msgstr "Alarmas"
@@ -466,10 +426,6 @@ msgctxt "field:calendar.event-calendar.category,write_uid:"
 msgid "Write User"
 msgstr "Usuario modificación"
 
-msgctxt "field:calendar.event.alarm,calendar_alarm:"
-msgid "Calendar Alarm"
-msgstr "Alarma del calendario"
-
 msgctxt "field:calendar.event.alarm,create_date:"
 msgid "Create Date"
 msgstr "Fecha creación"
@@ -490,6 +446,10 @@ msgctxt "field:calendar.event.alarm,rec_name:"
 msgid "Name"
 msgstr "Nombre"
 
+msgctxt "field:calendar.event.alarm,valarm:"
+msgid "valarm"
+msgstr "valarm"
+
 msgctxt "field:calendar.event.alarm,write_date:"
 msgid "Write Date"
 msgstr "Fecha modificación"
@@ -498,9 +458,9 @@ msgctxt "field:calendar.event.alarm,write_uid:"
 msgid "Write User"
 msgstr "Usuario modificación"
 
-msgctxt "field:calendar.event.attendee,calendar_attendee:"
-msgid "Calendar Attendee"
-msgstr "Calendario de asistentes"
+msgctxt "field:calendar.event.attendee,attendee:"
+msgid "attendee"
+msgstr "asistente"
 
 msgctxt "field:calendar.event.attendee,create_date:"
 msgid "Create Date"
@@ -510,6 +470,10 @@ msgctxt "field:calendar.event.attendee,create_uid:"
 msgid "Create User"
 msgstr "Usuario creación"
 
+msgctxt "field:calendar.event.attendee,email:"
+msgid "Email"
+msgstr "Email"
+
 msgctxt "field:calendar.event.attendee,event:"
 msgid "Event"
 msgstr "Evento"
@@ -522,6 +486,10 @@ msgctxt "field:calendar.event.attendee,rec_name:"
 msgid "Name"
 msgstr "Nombre"
 
+msgctxt "field:calendar.event.attendee,status:"
+msgid "Participation Status"
+msgstr "Estat de participacions"
+
 msgctxt "field:calendar.event.attendee,write_date:"
 msgid "Write Date"
 msgstr "Fecha modificación"
@@ -530,10 +498,6 @@ msgctxt "field:calendar.event.attendee,write_uid:"
 msgid "Write User"
 msgstr "Usuario modificación"
 
-msgctxt "field:calendar.event.exdate,calendar_date:"
-msgid "Calendar Date"
-msgstr "Fecha calendario"
-
 msgctxt "field:calendar.event.exdate,create_date:"
 msgid "Create Date"
 msgstr "Fecha creación"
@@ -542,6 +506,14 @@ msgctxt "field:calendar.event.exdate,create_uid:"
 msgid "Create User"
 msgstr "Usuario creación"
 
+msgctxt "field:calendar.event.exdate,date:"
+msgid "Is Date"
+msgstr "Es una fecha"
+
+msgctxt "field:calendar.event.exdate,datetime:"
+msgid "Date"
+msgstr "Fecha"
+
 msgctxt "field:calendar.event.exdate,event:"
 msgid "Event"
 msgstr "Evento"
@@ -562,9 +534,45 @@ msgctxt "field:calendar.event.exdate,write_uid:"
 msgid "Write User"
 msgstr "Usuario modificación"
 
-msgctxt "field:calendar.event.exrule,calendar_rrule:"
-msgid "Calendar RRule"
-msgstr "Regla de recurrencia"
+msgctxt "field:calendar.event.exrule,byday:"
+msgid "By Day"
+msgstr "Por día"
+
+msgctxt "field:calendar.event.exrule,byhour:"
+msgid "By Hour"
+msgstr "Por hora"
+
+msgctxt "field:calendar.event.exrule,byminute:"
+msgid "By Minute"
+msgstr "Por minuto"
+
+msgctxt "field:calendar.event.exrule,bymonth:"
+msgid "By Month"
+msgstr "Por mes"
+
+msgctxt "field:calendar.event.exrule,bymonthday:"
+msgid "By Month Day"
+msgstr "Por día del mes"
+
+msgctxt "field:calendar.event.exrule,bysecond:"
+msgid "By Second"
+msgstr "Por segundo"
+
+msgctxt "field:calendar.event.exrule,bysetpos:"
+msgid "By Position"
+msgstr "Por ubicación"
+
+msgctxt "field:calendar.event.exrule,byweekno:"
+msgid "By Week Number"
+msgstr "Por número de la semana"
+
+msgctxt "field:calendar.event.exrule,byyearday:"
+msgid "By Year Day"
+msgstr "Por día del año"
+
+msgctxt "field:calendar.event.exrule,count:"
+msgid "Count"
+msgstr "Contador"
 
 msgctxt "field:calendar.event.exrule,create_date:"
 msgid "Create Date"
@@ -578,14 +586,34 @@ msgctxt "field:calendar.event.exrule,event:"
 msgid "Event"
 msgstr "Evento"
 
+msgctxt "field:calendar.event.exrule,freq:"
+msgid "Frequency"
+msgstr "Frecuencia"
+
 msgctxt "field:calendar.event.exrule,id:"
 msgid "ID"
 msgstr "ID"
 
+msgctxt "field:calendar.event.exrule,interval:"
+msgid "Interval"
+msgstr "Intérvalo"
+
 msgctxt "field:calendar.event.exrule,rec_name:"
 msgid "Name"
 msgstr "Nombre"
 
+msgctxt "field:calendar.event.exrule,until:"
+msgid "Until Date"
+msgstr "Hasta la fecha"
+
+msgctxt "field:calendar.event.exrule,until_date:"
+msgid "Is Date"
+msgstr "Es una fecha"
+
+msgctxt "field:calendar.event.exrule,wkst:"
+msgid "Week Day"
+msgstr "Día de la semana"
+
 msgctxt "field:calendar.event.exrule,write_date:"
 msgid "Write Date"
 msgstr "Fecha modificación"
@@ -594,10 +622,6 @@ msgctxt "field:calendar.event.exrule,write_uid:"
 msgid "Write User"
 msgstr "Usuario modificación"
 
-msgctxt "field:calendar.event.rdate,calendar_date:"
-msgid "Calendar Date"
-msgstr "Fecha calendario"
-
 msgctxt "field:calendar.event.rdate,create_date:"
 msgid "Create Date"
 msgstr "Fecha creación"
@@ -606,6 +630,14 @@ msgctxt "field:calendar.event.rdate,create_uid:"
 msgid "Create User"
 msgstr "Usuario creación"
 
+msgctxt "field:calendar.event.rdate,date:"
+msgid "Is Date"
+msgstr "Es una fecha"
+
+msgctxt "field:calendar.event.rdate,datetime:"
+msgid "Date"
+msgstr "Fecha"
+
 msgctxt "field:calendar.event.rdate,event:"
 msgid "Event"
 msgstr "Evento"
@@ -626,147 +658,119 @@ msgctxt "field:calendar.event.rdate,write_uid:"
 msgid "Write User"
 msgstr "Usuario modificación"
 
-msgctxt "field:calendar.event.rrule,calendar_rrule:"
-msgid "Calendar RRule"
-msgstr "Regla de recurrencia"
-
-msgctxt "field:calendar.event.rrule,create_date:"
-msgid "Create Date"
-msgstr "Fecha creación"
-
-msgctxt "field:calendar.event.rrule,create_uid:"
-msgid "Create User"
-msgstr "Usuario creación"
-
-msgctxt "field:calendar.event.rrule,event:"
-msgid "Event"
-msgstr "Evento"
-
-msgctxt "field:calendar.event.rrule,id:"
-msgid "ID"
-msgstr "ID"
-
-msgctxt "field:calendar.event.rrule,rec_name:"
-msgid "Name"
-msgstr "Nombre"
-
-msgctxt "field:calendar.event.rrule,write_date:"
-msgid "Write Date"
-msgstr "Fecha modificación"
-
-msgctxt "field:calendar.event.rrule,write_uid:"
-msgid "Write User"
-msgstr "Usuario modificación"
-
-msgctxt "field:calendar.location,create_date:"
-msgid "Create Date"
-msgstr "Fecha creación"
-
-msgctxt "field:calendar.location,create_uid:"
-msgid "Create User"
-msgstr "Usuario creación"
-
-msgctxt "field:calendar.location,id:"
-msgid "ID"
-msgstr "ID"
-
-msgctxt "field:calendar.location,name:"
-msgid "Name"
-msgstr "Nombre"
-
-msgctxt "field:calendar.location,rec_name:"
-msgid "Name"
-msgstr "Nombre"
-
-msgctxt "field:calendar.location,write_date:"
-msgid "Write Date"
-msgstr "Fecha modificación"
-
-msgctxt "field:calendar.location,write_uid:"
-msgid "Write User"
-msgstr "Usuario modificación"
-
-msgctxt "field:calendar.rrule,byday:"
+msgctxt "field:calendar.event.rrule,byday:"
 msgid "By Day"
 msgstr "Por día"
 
-msgctxt "field:calendar.rrule,byhour:"
+msgctxt "field:calendar.event.rrule,byhour:"
 msgid "By Hour"
 msgstr "Por hora"
 
-msgctxt "field:calendar.rrule,byminute:"
+msgctxt "field:calendar.event.rrule,byminute:"
 msgid "By Minute"
 msgstr "Por minuto"
 
-msgctxt "field:calendar.rrule,bymonth:"
+msgctxt "field:calendar.event.rrule,bymonth:"
 msgid "By Month"
 msgstr "Por mes"
 
-msgctxt "field:calendar.rrule,bymonthday:"
+msgctxt "field:calendar.event.rrule,bymonthday:"
 msgid "By Month Day"
 msgstr "Por día del mes"
 
-msgctxt "field:calendar.rrule,bysecond:"
+msgctxt "field:calendar.event.rrule,bysecond:"
 msgid "By Second"
 msgstr "Por segundo"
 
-msgctxt "field:calendar.rrule,bysetpos:"
+msgctxt "field:calendar.event.rrule,bysetpos:"
 msgid "By Position"
-msgstr "Por posición"
+msgstr "Por ubicación"
 
-msgctxt "field:calendar.rrule,byweekno:"
+msgctxt "field:calendar.event.rrule,byweekno:"
 msgid "By Week Number"
-msgstr "Por número de semana"
+msgstr "Por número de la semana"
 
-msgctxt "field:calendar.rrule,byyearday:"
+msgctxt "field:calendar.event.rrule,byyearday:"
 msgid "By Year Day"
 msgstr "Por día del año"
 
-msgctxt "field:calendar.rrule,count:"
+msgctxt "field:calendar.event.rrule,count:"
 msgid "Count"
-msgstr "Número de veces"
+msgstr "Contador"
 
-msgctxt "field:calendar.rrule,create_date:"
+msgctxt "field:calendar.event.rrule,create_date:"
 msgid "Create Date"
 msgstr "Fecha creación"
 
-msgctxt "field:calendar.rrule,create_uid:"
+msgctxt "field:calendar.event.rrule,create_uid:"
 msgid "Create User"
 msgstr "Usuario creación"
 
-msgctxt "field:calendar.rrule,freq:"
+msgctxt "field:calendar.event.rrule,event:"
+msgid "Event"
+msgstr "Evento"
+
+msgctxt "field:calendar.event.rrule,freq:"
 msgid "Frequency"
 msgstr "Frecuencia"
 
-msgctxt "field:calendar.rrule,id:"
+msgctxt "field:calendar.event.rrule,id:"
 msgid "ID"
 msgstr "ID"
 
-msgctxt "field:calendar.rrule,interval:"
+msgctxt "field:calendar.event.rrule,interval:"
 msgid "Interval"
-msgstr "Intervalo"
+msgstr "Intérvalo"
 
-msgctxt "field:calendar.rrule,rec_name:"
+msgctxt "field:calendar.event.rrule,rec_name:"
 msgid "Name"
 msgstr "Nombre"
 
-msgctxt "field:calendar.rrule,until:"
+msgctxt "field:calendar.event.rrule,until:"
 msgid "Until Date"
 msgstr "Hasta la fecha"
 
-msgctxt "field:calendar.rrule,until_date:"
+msgctxt "field:calendar.event.rrule,until_date:"
 msgid "Is Date"
-msgstr "Es fecha"
+msgstr "Es una fecha"
 
-msgctxt "field:calendar.rrule,wkst:"
+msgctxt "field:calendar.event.rrule,wkst:"
 msgid "Week Day"
 msgstr "Día de la semana"
 
-msgctxt "field:calendar.rrule,write_date:"
+msgctxt "field:calendar.event.rrule,write_date:"
+msgid "Write Date"
+msgstr "Fecha modificación"
+
+msgctxt "field:calendar.event.rrule,write_uid:"
+msgid "Write User"
+msgstr "Usuario modificación"
+
+msgctxt "field:calendar.location,create_date:"
+msgid "Create Date"
+msgstr "Fecha creación"
+
+msgctxt "field:calendar.location,create_uid:"
+msgid "Create User"
+msgstr "Usuario creación"
+
+msgctxt "field:calendar.location,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.location,name:"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:calendar.location,rec_name:"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:calendar.location,write_date:"
 msgid "Write Date"
 msgstr "Fecha modificación"
 
-msgctxt "field:calendar.rrule,write_uid:"
+msgctxt "field:calendar.location,write_uid:"
 msgid "Write User"
 msgstr "Usuario modificación"
 
@@ -778,25 +782,25 @@ msgctxt "help:calendar.calendar,owner:"
 msgid "The user must have an email"
 msgstr "El usuario debe tener un correo electrónico."
 
-msgctxt "help:calendar.date,date:"
-msgid "Ignore time of field \"Date\", but handle as date only."
-msgstr "Ignora la hora del campo \"Fecha\" y trata sólo la fecha."
-
 msgctxt "help:calendar.event,uuid:"
 msgid "Universally Unique Identifier"
 msgstr "Identificador universal único."
 
-msgctxt "help:calendar.rrule,until_date:"
+msgctxt "help:calendar.event.exdate,date:"
+msgid "Ignore time of field \"Date\", but handle as date only."
+msgstr "Ingnora la hora del campo \"Fecha\", pero usar como única fecha."
+
+msgctxt "help:calendar.event.exrule,until_date:"
 msgid "Ignore time of field \"Until Date\", but handle as date only."
-msgstr "Ignora la hora del campo \"Hasta la fecha\" y trata sólo la fecha."
+msgstr "Ingnora la hora del campo \"Hasta la fecha\", pero usar como única fecha."
 
-msgctxt "model:calendar.alarm,name:"
-msgid "Alarm"
-msgstr "Alarma"
+msgctxt "help:calendar.event.rdate,date:"
+msgid "Ignore time of field \"Date\", but handle as date only."
+msgstr "Ingnora la hora del campo \"Fecha\", pero usar como única fecha."
 
-msgctxt "model:calendar.attendee,name:"
-msgid "Attendee"
-msgstr "Asistentes"
+msgctxt "help:calendar.event.rrule,until_date:"
+msgid "Ignore time of field \"Until Date\", but handle as date only."
+msgstr "Ingnora la hora del campo \"Hasta la fecha\", pero usar como única fecha."
 
 msgctxt "model:calendar.calendar,name:"
 msgid "Calendar"
@@ -814,10 +818,6 @@ msgctxt "model:calendar.category,name:"
 msgid "Category"
 msgstr "Categoría"
 
-msgctxt "model:calendar.date,name:"
-msgid "Calendar Date"
-msgstr "Fecha calendario"
-
 msgctxt "model:calendar.event,name:"
 msgid "Event"
 msgstr "Evento"
@@ -854,10 +854,6 @@ msgctxt "model:calendar.location,name:"
 msgid "Location"
 msgstr "Ubicación"
 
-msgctxt "model:calendar.rrule,name:"
-msgid "Recurrence Rule"
-msgstr "Regla de recurrencia"
-
 msgctxt "model:ir.action,name:act_calendar_form"
 msgid "Calendars"
 msgstr "Calendarios"
@@ -886,30 +882,6 @@ msgctxt "model:res.group,name:group_calendar_admin"
 msgid "Calendar Administration"
 msgstr "Administración de calendario"
 
-msgctxt "selection:calendar.attendee,status:"
-msgid ""
-msgstr ""
-
-msgctxt "selection:calendar.attendee,status:"
-msgid "Accepted"
-msgstr "Aceptada"
-
-msgctxt "selection:calendar.attendee,status:"
-msgid "Declined"
-msgstr "Rehusada"
-
-msgctxt "selection:calendar.attendee,status:"
-msgid "Delegated"
-msgstr "Delegada"
-
-msgctxt "selection:calendar.attendee,status:"
-msgid "Needs Action"
-msgstr "Necesita acción"
-
-msgctxt "selection:calendar.attendee,status:"
-msgid "Tentative"
-msgstr "Tentativa"
-
 msgctxt "selection:calendar.event,classification:"
 msgid "Confidential"
 msgstr "Confidencial"
@@ -946,63 +918,147 @@ msgctxt "selection:calendar.event,transp:"
 msgid "Transparent"
 msgstr "Transparente"
 
-msgctxt "selection:calendar.rrule,freq:"
+msgctxt "selection:calendar.event.attendee,status:"
+msgid ""
+msgstr ""
+
+msgctxt "selection:calendar.event.attendee,status:"
+msgid "Accepted"
+msgstr "Acceptado"
+
+msgctxt "selection:calendar.event.attendee,status:"
+msgid "Declined"
+msgstr "Rechazar"
+
+msgctxt "selection:calendar.event.attendee,status:"
+msgid "Delegated"
+msgstr "Delegar"
+
+msgctxt "selection:calendar.event.attendee,status:"
+msgid "Needs Action"
+msgstr "Necesidad  Acción"
+
+msgctxt "selection:calendar.event.attendee,status:"
+msgid "Tentative"
+msgstr "Tentativo"
+
+msgctxt "selection:calendar.event.exrule,freq:"
 msgid "Daily"
 msgstr "Diariamente"
 
-msgctxt "selection:calendar.rrule,freq:"
+msgctxt "selection:calendar.event.exrule,freq:"
 msgid "Hourly"
 msgstr "Cada hora"
 
-msgctxt "selection:calendar.rrule,freq:"
+msgctxt "selection:calendar.event.exrule,freq:"
 msgid "Minutely"
 msgstr "Cada minuto"
 
-msgctxt "selection:calendar.rrule,freq:"
+msgctxt "selection:calendar.event.exrule,freq:"
 msgid "Monthly"
 msgstr "Mensualmente"
 
-msgctxt "selection:calendar.rrule,freq:"
+msgctxt "selection:calendar.event.exrule,freq:"
 msgid "Secondly"
 msgstr "Cada segundo"
 
-msgctxt "selection:calendar.rrule,freq:"
+msgctxt "selection:calendar.event.exrule,freq:"
 msgid "Weekly"
 msgstr "Semanalmente"
 
-msgctxt "selection:calendar.rrule,freq:"
+msgctxt "selection:calendar.event.exrule,freq:"
 msgid "Yearly"
 msgstr "Anualmente"
 
-msgctxt "selection:calendar.rrule,wkst:"
+msgctxt "selection:calendar.event.exrule,wkst:"
 msgid "Friday"
 msgstr "Viernes"
 
-msgctxt "selection:calendar.rrule,wkst:"
+msgctxt "selection:calendar.event.exrule,wkst:"
 msgid "Monday"
 msgstr "Lunes"
 
-msgctxt "selection:calendar.rrule,wkst:"
+msgctxt "selection:calendar.event.exrule,wkst:"
 msgid "Saturday"
 msgstr "Sábado"
 
-msgctxt "selection:calendar.rrule,wkst:"
+msgctxt "selection:calendar.event.exrule,wkst:"
 msgid "Sunday"
 msgstr "Domingo"
 
-msgctxt "selection:calendar.rrule,wkst:"
+msgctxt "selection:calendar.event.exrule,wkst:"
 msgid "Thursday"
 msgstr "Jueves"
 
-msgctxt "selection:calendar.rrule,wkst:"
+msgctxt "selection:calendar.event.exrule,wkst:"
 msgid "Tuesday"
 msgstr "Martes"
 
-msgctxt "selection:calendar.rrule,wkst:"
+msgctxt "selection:calendar.event.exrule,wkst:"
+msgid "Wednesday"
+msgstr "Miércoles"
+
+msgctxt "selection:calendar.event.rrule,freq:"
+msgid "Daily"
+msgstr "Diariamente"
+
+msgctxt "selection:calendar.event.rrule,freq:"
+msgid "Hourly"
+msgstr "Cada hora"
+
+msgctxt "selection:calendar.event.rrule,freq:"
+msgid "Minutely"
+msgstr "Cada minuto"
+
+msgctxt "selection:calendar.event.rrule,freq:"
+msgid "Monthly"
+msgstr "Mensualmente"
+
+msgctxt "selection:calendar.event.rrule,freq:"
+msgid "Secondly"
+msgstr "Cada segundo"
+
+msgctxt "selection:calendar.event.rrule,freq:"
+msgid "Weekly"
+msgstr "Semanalmente"
+
+msgctxt "selection:calendar.event.rrule,freq:"
+msgid "Yearly"
+msgstr "Anualmente"
+
+msgctxt "selection:calendar.event.rrule,wkst:"
+msgid "Friday"
+msgstr "Viernes"
+
+msgctxt "selection:calendar.event.rrule,wkst:"
+msgid "Monday"
+msgstr "Lunes"
+
+msgctxt "selection:calendar.event.rrule,wkst:"
+msgid "Saturday"
+msgstr "Sábado"
+
+msgctxt "selection:calendar.event.rrule,wkst:"
+msgid "Sunday"
+msgstr "Domingo"
+
+msgctxt "selection:calendar.event.rrule,wkst:"
+msgid "Thursday"
+msgstr "Jueves"
+
+msgctxt "selection:calendar.event.rrule,wkst:"
+msgid "Tuesday"
+msgstr "Martes"
+
+msgctxt "selection:calendar.event.rrule,wkst:"
 msgid "Wednesday"
 msgstr "Miércoles"
 
 msgctxt "view:calendar.calendar:"
+msgid "Access Permissions"
+msgstr "Permisos de acceso"
+
+msgctxt "view:calendar.calendar:"
 msgid "Calendar"
 msgstr "Calendario"
 
@@ -1014,10 +1070,6 @@ msgctxt "view:calendar.calendar:"
 msgid "General"
 msgstr "General"
 
-msgctxt "view:calendar.calendar:"
-msgid "Security"
-msgstr "Seguridad"
-
 msgctxt "view:calendar.category:"
 msgid "Categories"
 msgstr "Categorías"
diff --git a/locale/fr_FR.po b/locale/fr_FR.po
index 19822de..7ac841e 100644
--- a/locale/fr_FR.po
+++ b/locale/fr_FR.po
@@ -3,196 +3,112 @@ msgid ""
 msgstr "Content-Type: text/plain; charset=utf-8\n"
 
 msgctxt "error:calendar.calendar:"
-msgid "A user can have only one calendar!"
-msgstr "Un utilisateur ne peut avoir qu'un seul calendrier !"
+msgid "A user can have only one calendar."
+msgstr "Un utilisteur ne peut avoir qu'un seul calendrier"
 
 msgctxt "error:calendar.calendar:"
-msgid "A user can have only one calendar!"
-msgstr "Un utilisateur ne peut avoir qu'un seul calendrier !"
+msgid "Calendar name \"%s\" can not end with .ics"
+msgstr "Le nom de calendrier \"%s\" ne peut terminer par \".ics\""
 
 msgctxt "error:calendar.calendar:"
-msgid "The name of calendar must be unique!"
-msgstr "Le nom du calendrier doit être unique !"
-
-msgctxt "error:calendar.calendar:"
-msgid "The name of calendar must be unique!"
-msgstr "Le nom du calendrier doit être unique !"
-
-msgctxt "error:calendar.category:"
-msgid "The name of calendar category must be unique!"
-msgstr "Le nom de la catégorie de calendrier doit être unique"
+msgid "The name of calendar must be unique."
+msgstr "le nom du calendrier doit être unique."
 
 msgctxt "error:calendar.category:"
-msgid "The name of calendar category must be unique!"
-msgstr "Le nom de la catégorie de calendrier doit être unique"
-
-msgctxt "error:calendar.event:"
-msgid "Recurrence can not be recurrent!"
-msgstr "Une récurrence ne peut pas être récurrente !"
-
-msgctxt "error:calendar.event:"
-msgid "Recurrence can not be recurrent!"
-msgstr "Une récurrence ne peut pas être récurrente !"
-
-msgctxt "error:calendar.event:"
-msgid "UUID and recurrence must be unique in a calendar!"
-msgstr "UUID et récurrence doivent être uniques sur un calendrier !"
-
-msgctxt "error:calendar.event:"
-msgid "UUID and recurrence must be unique in a calendar!"
-msgstr "UUID et récurrence doivent être uniques sur un calendrier !"
-
-msgctxt "error:calendar.location:"
-msgid "The name of calendar location must be unique!"
-msgstr "Le nom de l'emplacement doit être unique !"
-
-msgctxt "error:calendar.location:"
-msgid "The name of calendar location must be unique!"
-msgstr "Le nom de l'emplacement doit être unique !"
-
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Day\""
-msgstr "\"Par jour\" invalide"
+msgid "The name of calendar category must be unique."
+msgstr "Le nom du calendrier doit être unique."
 
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Day\""
-msgstr "\"Par jour\" invalide"
+msgctxt "error:calendar.event.exrule:"
+msgid "Invalid \"By Day\" in recurrence rule \"%s\""
+msgstr "\"Par jour\" invalide dans la règle de récurrence \"%s\"."
 
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Hour\""
-msgstr "\"Par heure\" invalide"
+msgctxt "error:calendar.event.exrule:"
+msgid "Invalid \"By Hour\" in recurrence rule \"%s\""
+msgstr "\"Par heure\" invalide dans la règle de récurrence \"%s\"."
 
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Hour\""
-msgstr "\"Par heure\" invalide"
+msgctxt "error:calendar.event.exrule:"
+msgid "Invalid \"By Minute\" in recurrence rule \"%s\""
+msgstr "\"Par minute\" invalide dans la règle de récurrence \"%s\"."
 
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Minute\""
-msgstr "\"Par minute\" invalide"
+msgctxt "error:calendar.event.exrule:"
+msgid "Invalid \"By Month Day\" in recurrence rule \"%s\""
+msgstr "Champ \"Par jour du mois\" invalide pour la règle de récurrence \"%s\"."
 
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Minute\""
-msgstr "\"Par minute\" invalide"
+msgctxt "error:calendar.event.exrule:"
+msgid "Invalid \"By Month\" in recurrence rule \"%s\""
+msgstr "Champ \"Par mois\" invalide pour la règle de récurrence \"%s\"."
 
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Month Day\""
-msgstr "\"Par jour du mois\" invalide"
+msgctxt "error:calendar.event.exrule:"
+msgid "Invalid \"By Position\" in recurrence rule \"%s\""
+msgstr "\"Par position\" invalide dans la règle de récurrence \"%s\"."
 
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Month Day\""
-msgstr "\"Par jour du mois\" invalide"
+msgctxt "error:calendar.event.exrule:"
+msgid "Invalid \"By Second\" in recurrence rule \"%s\""
+msgstr "\"Par seconde\" invalide dans la règle de récurrence \"%s\"."
 
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Month\""
-msgstr "\"Par mois\" invalide"
+msgctxt "error:calendar.event.exrule:"
+msgid "Invalid \"By Week Number\" in recurrence rule \"%s\""
+msgstr "\"Par numéro de semaine\" invalide dans la règle de récurrence \"%s\"."
 
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Month\""
-msgstr "\"Par mois\" invalide"
+msgctxt "error:calendar.event.exrule:"
+msgid "Invalid \"By Year Day\" in recurrence rule \"%s\""
+msgstr "\"Par jour de l'année\" invalide dans la règle de récurrence \"%s\"."
 
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Position\""
-msgstr "\"Par position\" invalide"
+msgctxt "error:calendar.event.exrule:"
+msgid "Only one of \"until\" and \"count\" can be set."
+msgstr "\"Date de fin\" et \"Répétitions\" sont mutuellement exclusifs"
 
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Position\""
-msgstr "\"Par position\" invalide"
+msgctxt "error:calendar.event.rrule:"
+msgid "Invalid \"By Day\" in recurrence rule \"%s\""
+msgstr "\"Par jour\" invalide dans la règle de récurrence \"%s\"."
 
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Second\""
-msgstr "\"Par seconde\" invalide"
+msgctxt "error:calendar.event.rrule:"
+msgid "Invalid \"By Hour\" in recurrence rule \"%s\""
+msgstr "\"Par heure\" invalide dans la règle de récurrence \"%s\"."
 
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Second\""
-msgstr "\"Par seconde\" invalide"
+msgctxt "error:calendar.event.rrule:"
+msgid "Invalid \"By Minute\" in recurrence rule \"%s\""
+msgstr "\"Par minute\" invalide dans la règle de récurrence \"%s\"."
 
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Week Number\""
-msgstr "\"Par jour de la semaine\" invalide"
+msgctxt "error:calendar.event.rrule:"
+msgid "Invalid \"By Month Day\" in recurrence rule \"%s\""
+msgstr "Champ \"Par jour du mois\" invalide pour la règle de récurrence \"%s\"."
 
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Week Number\""
-msgstr "\"Par jour de la semaine\" invalide"
+msgctxt "error:calendar.event.rrule:"
+msgid "Invalid \"By Month\" in recurrence rule \"%s\""
+msgstr "Champ \"Par mois\" invalide pour la règle de récurrence \"%s\"."
 
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Year Day\""
-msgstr "\"Par jour de l'année\" invalide"
+msgctxt "error:calendar.event.rrule:"
+msgid "Invalid \"By Position\" in recurrence rule \"%s\""
+msgstr "\"Par position\" invalide dans la règle de récurrence \"%s\"."
 
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Year Day\""
-msgstr "\"Par jour de l'année\" invalide"
+msgctxt "error:calendar.event.rrule:"
+msgid "Invalid \"By Second\" in recurrence rule \"%s\""
+msgstr "\"Par seconde\" invalide dans la règle de récurrence \"%s\"."
 
-msgctxt "error:calendar.rrule:"
-msgid "Only one of \"until\" and \"count\" can be set!"
-msgstr "\"Date de fin\" et \"Répétitions\" ne peuvent être remplis en même temps !"
-
-msgctxt "error:calendar.rrule:"
-msgid "Only one of \"until\" and \"count\" can be set!"
-msgstr "\"Date de fin\" et \"Répétitions\" ne peuvent être remplis en même temps !"
-
-msgctxt "field:calendar.alarm,create_date:"
-msgid "Create Date"
-msgstr "Date de création"
-
-msgctxt "field:calendar.alarm,create_uid:"
-msgid "Create User"
-msgstr "Créé par"
-
-msgctxt "field:calendar.alarm,id:"
-msgid "ID"
-msgstr "ID"
-
-msgctxt "field:calendar.alarm,rec_name:"
-msgid "Name"
-msgstr "Nom"
-
-msgctxt "field:calendar.alarm,valarm:"
-msgid "valarm"
-msgstr "valarm"
-
-msgctxt "field:calendar.alarm,write_date:"
-msgid "Write Date"
-msgstr "Date de mise à jour"
-
-msgctxt "field:calendar.alarm,write_uid:"
-msgid "Write User"
-msgstr "Mis à jour par"
-
-msgctxt "field:calendar.attendee,attendee:"
-msgid "attendee"
-msgstr "participant"
-
-msgctxt "field:calendar.attendee,create_date:"
-msgid "Create Date"
-msgstr "Date de création"
-
-msgctxt "field:calendar.attendee,create_uid:"
-msgid "Create User"
-msgstr "Créé par"
-
-msgctxt "field:calendar.attendee,email:"
-msgid "Email"
-msgstr "E-mail"
+msgctxt "error:calendar.event.rrule:"
+msgid "Invalid \"By Week Number\" in recurrence rule \"%s\""
+msgstr "\"Par numéro de semaine\" invalide dans la règle de récurrence \"%s\"."
 
-msgctxt "field:calendar.attendee,id:"
-msgid "ID"
-msgstr "ID"
+msgctxt "error:calendar.event.rrule:"
+msgid "Invalid \"By Year Day\" in recurrence rule \"%s\""
+msgstr "\"Par jour de l'année\" invalide dans la règle de récurrence \"%s\"."
 
-msgctxt "field:calendar.attendee,rec_name:"
-msgid "Name"
-msgstr "Nom"
+msgctxt "error:calendar.event.rrule:"
+msgid "Only one of \"until\" and \"count\" can be set."
+msgstr "\"Date de fin\" et \"Répétitions\" sont mutuellement exclusifs"
 
-msgctxt "field:calendar.attendee,status:"
-msgid "Participation Status"
-msgstr "Statut de participation"
+msgctxt "error:calendar.event:"
+msgid "Recurrence \"%s\" can not be recurrent."
+msgstr "La récurrence \"%s\" ne peut pas être récurrente."
 
-msgctxt "field:calendar.attendee,write_date:"
-msgid "Write Date"
-msgstr "Date de mise à jour"
+msgctxt "error:calendar.event:"
+msgid "UUID and recurrence must be unique in a calendar."
+msgstr "UUID et récurence doivent être unique dans un calendrier."
 
-msgctxt "field:calendar.attendee,write_uid:"
-msgid "Write User"
-msgstr "Mis à jour par"
+msgctxt "error:calendar.location:"
+msgid "The name of calendar location must be unique."
+msgstr "Le nom de l'emplacement doit être unique."
 
 msgctxt "field:calendar.calendar,create_date:"
 msgid "Create Date"
@@ -330,38 +246,6 @@ msgctxt "field:calendar.category,write_uid:"
 msgid "Write User"
 msgstr "Mis à jour par"
 
-msgctxt "field:calendar.date,create_date:"
-msgid "Create Date"
-msgstr "Date de création"
-
-msgctxt "field:calendar.date,create_uid:"
-msgid "Create User"
-msgstr "Créé par"
-
-msgctxt "field:calendar.date,date:"
-msgid "Is Date"
-msgstr "Est une date"
-
-msgctxt "field:calendar.date,datetime:"
-msgid "Date"
-msgstr "Date"
-
-msgctxt "field:calendar.date,id:"
-msgid "ID"
-msgstr "ID"
-
-msgctxt "field:calendar.date,rec_name:"
-msgid "Name"
-msgstr "Nom"
-
-msgctxt "field:calendar.date,write_date:"
-msgid "Write Date"
-msgstr "Date de mise à jour"
-
-msgctxt "field:calendar.date,write_uid:"
-msgid "Write User"
-msgstr "Mis à jour par"
-
 msgctxt "field:calendar.event,alarms:"
 msgid "Alarms"
 msgstr "Alarmes"
@@ -530,10 +414,6 @@ msgctxt "field:calendar.event-calendar.category,write_uid:"
 msgid "Write User"
 msgstr "Mis à jour par"
 
-msgctxt "field:calendar.event.alarm,calendar_alarm:"
-msgid "Calendar Alarm"
-msgstr "Alarme calendrier"
-
 msgctxt "field:calendar.event.alarm,create_date:"
 msgid "Create Date"
 msgstr "Date de création"
@@ -554,6 +434,10 @@ msgctxt "field:calendar.event.alarm,rec_name:"
 msgid "Name"
 msgstr "Nom"
 
+msgctxt "field:calendar.event.alarm,valarm:"
+msgid "valarm"
+msgstr "valarm"
+
 msgctxt "field:calendar.event.alarm,write_date:"
 msgid "Write Date"
 msgstr "Date de mise à jour"
@@ -562,9 +446,9 @@ msgctxt "field:calendar.event.alarm,write_uid:"
 msgid "Write User"
 msgstr "Mis à jour par"
 
-msgctxt "field:calendar.event.attendee,calendar_attendee:"
-msgid "Calendar Attendee"
-msgstr "Participant calendrier"
+msgctxt "field:calendar.event.attendee,attendee:"
+msgid "attendee"
+msgstr "participant"
 
 msgctxt "field:calendar.event.attendee,create_date:"
 msgid "Create Date"
@@ -574,6 +458,10 @@ msgctxt "field:calendar.event.attendee,create_uid:"
 msgid "Create User"
 msgstr "Créé par"
 
+msgctxt "field:calendar.event.attendee,email:"
+msgid "Email"
+msgstr "E-mail"
+
 msgctxt "field:calendar.event.attendee,event:"
 msgid "Event"
 msgstr "Événement"
@@ -586,6 +474,10 @@ msgctxt "field:calendar.event.attendee,rec_name:"
 msgid "Name"
 msgstr "Nom"
 
+msgctxt "field:calendar.event.attendee,status:"
+msgid "Participation Status"
+msgstr "Statut de participation"
+
 msgctxt "field:calendar.event.attendee,write_date:"
 msgid "Write Date"
 msgstr "Date de mise à jour"
@@ -594,10 +486,6 @@ msgctxt "field:calendar.event.attendee,write_uid:"
 msgid "Write User"
 msgstr "Mis à jour par"
 
-msgctxt "field:calendar.event.exdate,calendar_date:"
-msgid "Calendar Date"
-msgstr "Date calendrier"
-
 msgctxt "field:calendar.event.exdate,create_date:"
 msgid "Create Date"
 msgstr "Date de création"
@@ -606,6 +494,14 @@ msgctxt "field:calendar.event.exdate,create_uid:"
 msgid "Create User"
 msgstr "Créé par"
 
+msgctxt "field:calendar.event.exdate,date:"
+msgid "Is Date"
+msgstr "Est une date"
+
+msgctxt "field:calendar.event.exdate,datetime:"
+msgid "Date"
+msgstr "Date"
+
 msgctxt "field:calendar.event.exdate,event:"
 msgid "Event"
 msgstr "Événement"
@@ -626,9 +522,45 @@ msgctxt "field:calendar.event.exdate,write_uid:"
 msgid "Write User"
 msgstr "Mis à jour par"
 
-msgctxt "field:calendar.event.exrule,calendar_rrule:"
-msgid "Calendar RRule"
-msgstr "Règle de récurrence"
+msgctxt "field:calendar.event.exrule,byday:"
+msgid "By Day"
+msgstr "Par jour"
+
+msgctxt "field:calendar.event.exrule,byhour:"
+msgid "By Hour"
+msgstr "Par heure"
+
+msgctxt "field:calendar.event.exrule,byminute:"
+msgid "By Minute"
+msgstr "Par minute"
+
+msgctxt "field:calendar.event.exrule,bymonth:"
+msgid "By Month"
+msgstr "Par mois"
+
+msgctxt "field:calendar.event.exrule,bymonthday:"
+msgid "By Month Day"
+msgstr "Par jour du mois"
+
+msgctxt "field:calendar.event.exrule,bysecond:"
+msgid "By Second"
+msgstr "Par seconde"
+
+msgctxt "field:calendar.event.exrule,bysetpos:"
+msgid "By Position"
+msgstr "Par position"
+
+msgctxt "field:calendar.event.exrule,byweekno:"
+msgid "By Week Number"
+msgstr "Par numéro de semaine"
+
+msgctxt "field:calendar.event.exrule,byyearday:"
+msgid "By Year Day"
+msgstr "Par jour de l'année"
+
+msgctxt "field:calendar.event.exrule,count:"
+msgid "Count"
+msgstr "Répétitions"
 
 msgctxt "field:calendar.event.exrule,create_date:"
 msgid "Create Date"
@@ -642,14 +574,34 @@ msgctxt "field:calendar.event.exrule,event:"
 msgid "Event"
 msgstr "Événement"
 
+msgctxt "field:calendar.event.exrule,freq:"
+msgid "Frequency"
+msgstr "Fréquence"
+
 msgctxt "field:calendar.event.exrule,id:"
 msgid "ID"
 msgstr "ID"
 
+msgctxt "field:calendar.event.exrule,interval:"
+msgid "Interval"
+msgstr "Intervalle"
+
 msgctxt "field:calendar.event.exrule,rec_name:"
 msgid "Name"
 msgstr "Nom"
 
+msgctxt "field:calendar.event.exrule,until:"
+msgid "Until Date"
+msgstr "Date de fin"
+
+msgctxt "field:calendar.event.exrule,until_date:"
+msgid "Is Date"
+msgstr "Est une date"
+
+msgctxt "field:calendar.event.exrule,wkst:"
+msgid "Week Day"
+msgstr "Jour de la semaine"
+
 msgctxt "field:calendar.event.exrule,write_date:"
 msgid "Write Date"
 msgstr "Date de mise à jour"
@@ -658,10 +610,6 @@ msgctxt "field:calendar.event.exrule,write_uid:"
 msgid "Write User"
 msgstr "Mis à jour par"
 
-msgctxt "field:calendar.event.rdate,calendar_date:"
-msgid "Calendar Date"
-msgstr "Date calendrier"
-
 msgctxt "field:calendar.event.rdate,create_date:"
 msgid "Create Date"
 msgstr "Date de création"
@@ -670,6 +618,14 @@ msgctxt "field:calendar.event.rdate,create_uid:"
 msgid "Create User"
 msgstr "Créé par"
 
+msgctxt "field:calendar.event.rdate,date:"
+msgid "Is Date"
+msgstr "Est une date"
+
+msgctxt "field:calendar.event.rdate,datetime:"
+msgid "Date"
+msgstr "Date"
+
 msgctxt "field:calendar.event.rdate,event:"
 msgid "Event"
 msgstr "Événement"
@@ -690,147 +646,119 @@ msgctxt "field:calendar.event.rdate,write_uid:"
 msgid "Write User"
 msgstr "Mis à jour par"
 
-msgctxt "field:calendar.event.rrule,calendar_rrule:"
-msgid "Calendar RRule"
-msgstr "Règle de récurrence"
-
-msgctxt "field:calendar.event.rrule,create_date:"
-msgid "Create Date"
-msgstr "Date de création"
-
-msgctxt "field:calendar.event.rrule,create_uid:"
-msgid "Create User"
-msgstr "Créé par"
-
-msgctxt "field:calendar.event.rrule,event:"
-msgid "Event"
-msgstr "Événement"
-
-msgctxt "field:calendar.event.rrule,id:"
-msgid "ID"
-msgstr "ID"
-
-msgctxt "field:calendar.event.rrule,rec_name:"
-msgid "Name"
-msgstr "Nom"
-
-msgctxt "field:calendar.event.rrule,write_date:"
-msgid "Write Date"
-msgstr "Date de mise à jour"
-
-msgctxt "field:calendar.event.rrule,write_uid:"
-msgid "Write User"
-msgstr "Mis à jour par"
-
-msgctxt "field:calendar.location,create_date:"
-msgid "Create Date"
-msgstr "Date de création"
-
-msgctxt "field:calendar.location,create_uid:"
-msgid "Create User"
-msgstr "Créé par"
-
-msgctxt "field:calendar.location,id:"
-msgid "ID"
-msgstr "ID"
-
-msgctxt "field:calendar.location,name:"
-msgid "Name"
-msgstr "Nom"
-
-msgctxt "field:calendar.location,rec_name:"
-msgid "Name"
-msgstr "Nom"
-
-msgctxt "field:calendar.location,write_date:"
-msgid "Write Date"
-msgstr "Date de mise à jour"
-
-msgctxt "field:calendar.location,write_uid:"
-msgid "Write User"
-msgstr "Mis à jour par"
-
-msgctxt "field:calendar.rrule,byday:"
+msgctxt "field:calendar.event.rrule,byday:"
 msgid "By Day"
 msgstr "Par jour"
 
-msgctxt "field:calendar.rrule,byhour:"
+msgctxt "field:calendar.event.rrule,byhour:"
 msgid "By Hour"
 msgstr "Par heure"
 
-msgctxt "field:calendar.rrule,byminute:"
+msgctxt "field:calendar.event.rrule,byminute:"
 msgid "By Minute"
 msgstr "Par minute"
 
-msgctxt "field:calendar.rrule,bymonth:"
+msgctxt "field:calendar.event.rrule,bymonth:"
 msgid "By Month"
 msgstr "Par mois"
 
-msgctxt "field:calendar.rrule,bymonthday:"
+msgctxt "field:calendar.event.rrule,bymonthday:"
 msgid "By Month Day"
 msgstr "Par jour du mois"
 
-msgctxt "field:calendar.rrule,bysecond:"
+msgctxt "field:calendar.event.rrule,bysecond:"
 msgid "By Second"
 msgstr "Par seconde"
 
-msgctxt "field:calendar.rrule,bysetpos:"
+msgctxt "field:calendar.event.rrule,bysetpos:"
 msgid "By Position"
 msgstr "Par position"
 
-msgctxt "field:calendar.rrule,byweekno:"
+msgctxt "field:calendar.event.rrule,byweekno:"
 msgid "By Week Number"
 msgstr "Par numéro de semaine"
 
-msgctxt "field:calendar.rrule,byyearday:"
+msgctxt "field:calendar.event.rrule,byyearday:"
 msgid "By Year Day"
 msgstr "Par jour de l'année"
 
-msgctxt "field:calendar.rrule,count:"
+msgctxt "field:calendar.event.rrule,count:"
 msgid "Count"
 msgstr "Répétitions"
 
-msgctxt "field:calendar.rrule,create_date:"
+msgctxt "field:calendar.event.rrule,create_date:"
 msgid "Create Date"
 msgstr "Date de création"
 
-msgctxt "field:calendar.rrule,create_uid:"
+msgctxt "field:calendar.event.rrule,create_uid:"
 msgid "Create User"
 msgstr "Créé par"
 
-msgctxt "field:calendar.rrule,freq:"
+msgctxt "field:calendar.event.rrule,event:"
+msgid "Event"
+msgstr "Événement"
+
+msgctxt "field:calendar.event.rrule,freq:"
 msgid "Frequency"
 msgstr "Fréquence"
 
-msgctxt "field:calendar.rrule,id:"
+msgctxt "field:calendar.event.rrule,id:"
 msgid "ID"
 msgstr "ID"
 
-msgctxt "field:calendar.rrule,interval:"
+msgctxt "field:calendar.event.rrule,interval:"
 msgid "Interval"
 msgstr "Intervalle"
 
-msgctxt "field:calendar.rrule,rec_name:"
+msgctxt "field:calendar.event.rrule,rec_name:"
 msgid "Name"
 msgstr "Nom"
 
-msgctxt "field:calendar.rrule,until:"
+msgctxt "field:calendar.event.rrule,until:"
 msgid "Until Date"
 msgstr "Date de fin"
 
-msgctxt "field:calendar.rrule,until_date:"
+msgctxt "field:calendar.event.rrule,until_date:"
 msgid "Is Date"
 msgstr "Est une date"
 
-msgctxt "field:calendar.rrule,wkst:"
+msgctxt "field:calendar.event.rrule,wkst:"
 msgid "Week Day"
 msgstr "Jour de la semaine"
 
-msgctxt "field:calendar.rrule,write_date:"
+msgctxt "field:calendar.event.rrule,write_date:"
 msgid "Write Date"
 msgstr "Date de mise à jour"
 
-msgctxt "field:calendar.rrule,write_uid:"
+msgctxt "field:calendar.event.rrule,write_uid:"
+msgid "Write User"
+msgstr "Mis à jour par"
+
+msgctxt "field:calendar.location,create_date:"
+msgid "Create Date"
+msgstr "Date de création"
+
+msgctxt "field:calendar.location,create_uid:"
+msgid "Create User"
+msgstr "Créé par"
+
+msgctxt "field:calendar.location,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.location,name:"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:calendar.location,rec_name:"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:calendar.location,write_date:"
+msgid "Write Date"
+msgstr "Date de mise à jour"
+
+msgctxt "field:calendar.location,write_uid:"
 msgid "Write User"
 msgstr "Mis à jour par"
 
@@ -842,25 +770,25 @@ msgctxt "help:calendar.calendar,owner:"
 msgid "The user must have an email"
 msgstr "L'utilisateur doit avoir une adresse mail"
 
-msgctxt "help:calendar.date,date:"
-msgid "Ignore time of field \"Date\", but handle as date only."
-msgstr "Ignorer l'heure du champ \"Date\" et considérer uniquement la date"
-
 msgctxt "help:calendar.event,uuid:"
 msgid "Universally Unique Identifier"
 msgstr "Identificateur unique universel"
 
-msgctxt "help:calendar.rrule,until_date:"
+msgctxt "help:calendar.event.exdate,date:"
+msgid "Ignore time of field \"Date\", but handle as date only."
+msgstr "Ignorer l'heure du champ \"Date\" et considérer uniquement la date"
+
+msgctxt "help:calendar.event.exrule,until_date:"
 msgid "Ignore time of field \"Until Date\", but handle as date only."
 msgstr "Ignorer l'heure du champ \"Date de fin\" et considérer uniquement la date"
 
-msgctxt "model:calendar.alarm,name:"
-msgid "Alarm"
-msgstr "Alarme"
+msgctxt "help:calendar.event.rdate,date:"
+msgid "Ignore time of field \"Date\", but handle as date only."
+msgstr "Ignorer l'heure du champ \"Date\" et considérer uniquement la date"
 
-msgctxt "model:calendar.attendee,name:"
-msgid "Attendee"
-msgstr "Participant"
+msgctxt "help:calendar.event.rrule,until_date:"
+msgid "Ignore time of field \"Until Date\", but handle as date only."
+msgstr "Ignorer l'heure du champ \"Date de fin\" et considérer uniquement la date"
 
 msgctxt "model:calendar.calendar,name:"
 msgid "Calendar"
@@ -878,10 +806,6 @@ msgctxt "model:calendar.category,name:"
 msgid "Category"
 msgstr "Catégorie"
 
-msgctxt "model:calendar.date,name:"
-msgid "Calendar Date"
-msgstr "Date calendrier"
-
 msgctxt "model:calendar.event,name:"
 msgid "Event"
 msgstr "Événement"
@@ -918,10 +842,6 @@ msgctxt "model:calendar.location,name:"
 msgid "Location"
 msgstr "Emplacement"
 
-msgctxt "model:calendar.rrule,name:"
-msgid "Recurrence Rule"
-msgstr "Règle de récurrence"
-
 msgctxt "model:ir.action,name:act_calendar_form"
 msgid "Calendars"
 msgstr "Calendriers"
@@ -950,54 +870,6 @@ msgctxt "model:res.group,name:group_calendar_admin"
 msgid "Calendar Administration"
 msgstr "Administration calendrier"
 
-msgctxt "selection:calendar.attendee,status:"
-msgid ""
-msgstr ""
-
-msgctxt "selection:calendar.attendee,status:"
-msgid ""
-msgstr ""
-
-msgctxt "selection:calendar.attendee,status:"
-msgid "Accepted"
-msgstr "Accepté"
-
-msgctxt "selection:calendar.attendee,status:"
-msgid "Accepted"
-msgstr "Accepté"
-
-msgctxt "selection:calendar.attendee,status:"
-msgid "Declined"
-msgstr "Décliné"
-
-msgctxt "selection:calendar.attendee,status:"
-msgid "Declined"
-msgstr "Décliné"
-
-msgctxt "selection:calendar.attendee,status:"
-msgid "Delegated"
-msgstr "Délégué"
-
-msgctxt "selection:calendar.attendee,status:"
-msgid "Delegated"
-msgstr "Délégué"
-
-msgctxt "selection:calendar.attendee,status:"
-msgid "Needs Action"
-msgstr "Nécessite une action"
-
-msgctxt "selection:calendar.attendee,status:"
-msgid "Needs Action"
-msgstr "Nécessite une action"
-
-msgctxt "selection:calendar.attendee,status:"
-msgid "Tentative"
-msgstr "Tentative"
-
-msgctxt "selection:calendar.attendee,status:"
-msgid "Tentative"
-msgstr "Tentative"
-
 msgctxt "selection:calendar.event,classification:"
 msgid "Confidential"
 msgstr "Confidentiel"
@@ -1070,117 +942,145 @@ msgctxt "selection:calendar.event,transp:"
 msgid "Transparent"
 msgstr "transparent"
 
-msgctxt "selection:calendar.rrule,freq:"
-msgid "Daily"
-msgstr "Journalier"
+msgctxt "selection:calendar.event.attendee,status:"
+msgid ""
+msgstr ""
+
+msgctxt "selection:calendar.event.attendee,status:"
+msgid "Accepted"
+msgstr "Accepté"
+
+msgctxt "selection:calendar.event.attendee,status:"
+msgid "Declined"
+msgstr "Décliné"
 
-msgctxt "selection:calendar.rrule,freq:"
+msgctxt "selection:calendar.event.attendee,status:"
+msgid "Delegated"
+msgstr "Délégué"
+
+msgctxt "selection:calendar.event.attendee,status:"
+msgid "Needs Action"
+msgstr "Nécessite une action"
+
+msgctxt "selection:calendar.event.attendee,status:"
+msgid "Tentative"
+msgstr "Tentative"
+
+msgctxt "selection:calendar.event.exrule,freq:"
 msgid "Daily"
 msgstr "Journalier"
 
-msgctxt "selection:calendar.rrule,freq:"
-msgid "Hourly"
-msgstr "Horaire"
-
-msgctxt "selection:calendar.rrule,freq:"
+msgctxt "selection:calendar.event.exrule,freq:"
 msgid "Hourly"
 msgstr "Horaire"
 
-msgctxt "selection:calendar.rrule,freq:"
+msgctxt "selection:calendar.event.exrule,freq:"
 msgid "Minutely"
 msgstr "Chaque minute"
 
-msgctxt "selection:calendar.rrule,freq:"
-msgid "Minutely"
-msgstr "Chaque minute"
-
-msgctxt "selection:calendar.rrule,freq:"
+msgctxt "selection:calendar.event.exrule,freq:"
 msgid "Monthly"
 msgstr "Mensuel"
 
-msgctxt "selection:calendar.rrule,freq:"
-msgid "Monthly"
-msgstr "Mensuel"
-
-msgctxt "selection:calendar.rrule,freq:"
+msgctxt "selection:calendar.event.exrule,freq:"
 msgid "Secondly"
 msgstr "Chaque seconde"
 
-msgctxt "selection:calendar.rrule,freq:"
-msgid "Secondly"
-msgstr "Chaque seconde"
-
-msgctxt "selection:calendar.rrule,freq:"
-msgid "Weekly"
-msgstr "hebdomadaire"
-
-msgctxt "selection:calendar.rrule,freq:"
+msgctxt "selection:calendar.event.exrule,freq:"
 msgid "Weekly"
 msgstr "hebdomadaire"
 
-msgctxt "selection:calendar.rrule,freq:"
+msgctxt "selection:calendar.event.exrule,freq:"
 msgid "Yearly"
 msgstr "Annuel"
 
-msgctxt "selection:calendar.rrule,freq:"
-msgid "Yearly"
-msgstr "Annuel"
-
-msgctxt "selection:calendar.rrule,wkst:"
-msgid "Friday"
-msgstr "Vendredi"
-
-msgctxt "selection:calendar.rrule,wkst:"
+msgctxt "selection:calendar.event.exrule,wkst:"
 msgid "Friday"
 msgstr "Vendredi"
 
-msgctxt "selection:calendar.rrule,wkst:"
-msgid "Monday"
-msgstr "Lundi"
-
-msgctxt "selection:calendar.rrule,wkst:"
+msgctxt "selection:calendar.event.exrule,wkst:"
 msgid "Monday"
 msgstr "Lundi"
 
-msgctxt "selection:calendar.rrule,wkst:"
-msgid "Saturday"
-msgstr "Samedi"
-
-msgctxt "selection:calendar.rrule,wkst:"
+msgctxt "selection:calendar.event.exrule,wkst:"
 msgid "Saturday"
 msgstr "Samedi"
 
-msgctxt "selection:calendar.rrule,wkst:"
+msgctxt "selection:calendar.event.exrule,wkst:"
 msgid "Sunday"
 msgstr "Dimanche"
 
-msgctxt "selection:calendar.rrule,wkst:"
-msgid "Sunday"
-msgstr "Dimanche"
-
-msgctxt "selection:calendar.rrule,wkst:"
-msgid "Thursday"
-msgstr "Jeudi"
-
-msgctxt "selection:calendar.rrule,wkst:"
+msgctxt "selection:calendar.event.exrule,wkst:"
 msgid "Thursday"
 msgstr "Jeudi"
 
-msgctxt "selection:calendar.rrule,wkst:"
+msgctxt "selection:calendar.event.exrule,wkst:"
 msgid "Tuesday"
 msgstr "Mardi"
 
-msgctxt "selection:calendar.rrule,wkst:"
+msgctxt "selection:calendar.event.exrule,wkst:"
+msgid "Wednesday"
+msgstr "Mercredi"
+
+msgctxt "selection:calendar.event.rrule,freq:"
+msgid "Daily"
+msgstr "Journalier"
+
+msgctxt "selection:calendar.event.rrule,freq:"
+msgid "Hourly"
+msgstr "Horaire"
+
+msgctxt "selection:calendar.event.rrule,freq:"
+msgid "Minutely"
+msgstr "Chaque minute"
+
+msgctxt "selection:calendar.event.rrule,freq:"
+msgid "Monthly"
+msgstr "Mensuel"
+
+msgctxt "selection:calendar.event.rrule,freq:"
+msgid "Secondly"
+msgstr "Chaque seconde"
+
+msgctxt "selection:calendar.event.rrule,freq:"
+msgid "Weekly"
+msgstr "hebdomadaire"
+
+msgctxt "selection:calendar.event.rrule,freq:"
+msgid "Yearly"
+msgstr "Annuel"
+
+msgctxt "selection:calendar.event.rrule,wkst:"
+msgid "Friday"
+msgstr "Vendredi"
+
+msgctxt "selection:calendar.event.rrule,wkst:"
+msgid "Monday"
+msgstr "Lundi"
+
+msgctxt "selection:calendar.event.rrule,wkst:"
+msgid "Saturday"
+msgstr "Samedi"
+
+msgctxt "selection:calendar.event.rrule,wkst:"
+msgid "Sunday"
+msgstr "Dimanche"
+
+msgctxt "selection:calendar.event.rrule,wkst:"
+msgid "Thursday"
+msgstr "Jeudi"
+
+msgctxt "selection:calendar.event.rrule,wkst:"
 msgid "Tuesday"
 msgstr "Mardi"
 
-msgctxt "selection:calendar.rrule,wkst:"
+msgctxt "selection:calendar.event.rrule,wkst:"
 msgid "Wednesday"
 msgstr "Mercredi"
 
-msgctxt "selection:calendar.rrule,wkst:"
-msgid "Wednesday"
-msgstr "Mercredi"
+msgctxt "view:calendar.calendar:"
+msgid "Access Permissions"
+msgstr "Permissions d'accès"
 
 msgctxt "view:calendar.calendar:"
 msgid "Calendar"
@@ -1206,14 +1106,6 @@ msgctxt "view:calendar.calendar:"
 msgid "General"
 msgstr "Général"
 
-msgctxt "view:calendar.calendar:"
-msgid "Security"
-msgstr "Sécurité"
-
-msgctxt "view:calendar.calendar:"
-msgid "Security"
-msgstr "Sécurité"
-
 msgctxt "view:calendar.category:"
 msgid "Categories"
 msgstr "Catégories"
diff --git a/locale/nl_NL.po b/locale/nl_NL.po
index 96ff8d9..c1b5a15 100644
--- a/locale/nl_NL.po
+++ b/locale/nl_NL.po
@@ -3,134 +3,111 @@ msgid ""
 msgstr "Content-Type: text/plain; charset=utf-8\n"
 
 msgctxt "error:calendar.calendar:"
-msgid "A user can have only one calendar!"
+msgid "A user can have only one calendar."
 msgstr ""
 
 msgctxt "error:calendar.calendar:"
-msgid "The name of calendar must be unique!"
+msgid "Calendar name \"%s\" can not end with .ics"
 msgstr ""
 
-msgctxt "error:calendar.category:"
-msgid "The name of calendar category must be unique!"
+msgctxt "error:calendar.calendar:"
+msgid "The name of calendar must be unique."
 msgstr ""
 
-msgctxt "error:calendar.event:"
-msgid "Recurrence can not be recurrent!"
+msgctxt "error:calendar.category:"
+msgid "The name of calendar category must be unique."
 msgstr ""
 
-msgctxt "error:calendar.event:"
-msgid "UUID and recurrence must be unique in a calendar!"
+msgctxt "error:calendar.event.exrule:"
+msgid "Invalid \"By Day\" in recurrence rule \"%s\""
 msgstr ""
 
-msgctxt "error:calendar.location:"
-msgid "The name of calendar location must be unique!"
+msgctxt "error:calendar.event.exrule:"
+msgid "Invalid \"By Hour\" in recurrence rule \"%s\""
 msgstr ""
 
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Day\""
+msgctxt "error:calendar.event.exrule:"
+msgid "Invalid \"By Minute\" in recurrence rule \"%s\""
 msgstr ""
 
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Hour\""
+msgctxt "error:calendar.event.exrule:"
+msgid "Invalid \"By Month Day\" in recurrence rule \"%s\""
 msgstr ""
 
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Minute\""
+msgctxt "error:calendar.event.exrule:"
+msgid "Invalid \"By Month\" in recurrence rule \"%s\""
 msgstr ""
 
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Month Day\""
+msgctxt "error:calendar.event.exrule:"
+msgid "Invalid \"By Position\" in recurrence rule \"%s\""
 msgstr ""
 
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Month\""
+msgctxt "error:calendar.event.exrule:"
+msgid "Invalid \"By Second\" in recurrence rule \"%s\""
 msgstr ""
 
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Position\""
+msgctxt "error:calendar.event.exrule:"
+msgid "Invalid \"By Week Number\" in recurrence rule \"%s\""
 msgstr ""
 
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Second\""
+msgctxt "error:calendar.event.exrule:"
+msgid "Invalid \"By Year Day\" in recurrence rule \"%s\""
 msgstr ""
 
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Week Number\""
+msgctxt "error:calendar.event.exrule:"
+msgid "Only one of \"until\" and \"count\" can be set."
 msgstr ""
 
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Year Day\""
+msgctxt "error:calendar.event.rrule:"
+msgid "Invalid \"By Day\" in recurrence rule \"%s\""
 msgstr ""
 
-msgctxt "error:calendar.rrule:"
-msgid "Only one of \"until\" and \"count\" can be set!"
+msgctxt "error:calendar.event.rrule:"
+msgid "Invalid \"By Hour\" in recurrence rule \"%s\""
 msgstr ""
 
-msgctxt "field:calendar.alarm,create_date:"
-msgid "Create Date"
+msgctxt "error:calendar.event.rrule:"
+msgid "Invalid \"By Minute\" in recurrence rule \"%s\""
 msgstr ""
 
-msgctxt "field:calendar.alarm,create_uid:"
-msgid "Create User"
+msgctxt "error:calendar.event.rrule:"
+msgid "Invalid \"By Month Day\" in recurrence rule \"%s\""
 msgstr ""
 
-msgctxt "field:calendar.alarm,id:"
-msgid "ID"
+msgctxt "error:calendar.event.rrule:"
+msgid "Invalid \"By Month\" in recurrence rule \"%s\""
 msgstr ""
 
-#, fuzzy
-msgctxt "field:calendar.alarm,rec_name:"
-msgid "Name"
-msgstr "Naam bijlage"
-
-msgctxt "field:calendar.alarm,valarm:"
-msgid "valarm"
-msgstr ""
-
-msgctxt "field:calendar.alarm,write_date:"
-msgid "Write Date"
+msgctxt "error:calendar.event.rrule:"
+msgid "Invalid \"By Position\" in recurrence rule \"%s\""
 msgstr ""
 
-msgctxt "field:calendar.alarm,write_uid:"
-msgid "Write User"
+msgctxt "error:calendar.event.rrule:"
+msgid "Invalid \"By Second\" in recurrence rule \"%s\""
 msgstr ""
 
-msgctxt "field:calendar.attendee,attendee:"
-msgid "attendee"
+msgctxt "error:calendar.event.rrule:"
+msgid "Invalid \"By Week Number\" in recurrence rule \"%s\""
 msgstr ""
 
-msgctxt "field:calendar.attendee,create_date:"
-msgid "Create Date"
+msgctxt "error:calendar.event.rrule:"
+msgid "Invalid \"By Year Day\" in recurrence rule \"%s\""
 msgstr ""
 
-msgctxt "field:calendar.attendee,create_uid:"
-msgid "Create User"
+msgctxt "error:calendar.event.rrule:"
+msgid "Only one of \"until\" and \"count\" can be set."
 msgstr ""
 
-#, fuzzy
-msgctxt "field:calendar.attendee,email:"
-msgid "Email"
-msgstr "E-mail"
-
-msgctxt "field:calendar.attendee,id:"
-msgid "ID"
-msgstr ""
-
-#, fuzzy
-msgctxt "field:calendar.attendee,rec_name:"
-msgid "Name"
-msgstr "Naam bijlage"
-
-msgctxt "field:calendar.attendee,status:"
-msgid "Participation Status"
+msgctxt "error:calendar.event:"
+msgid "Recurrence \"%s\" can not be recurrent."
 msgstr ""
 
-msgctxt "field:calendar.attendee,write_date:"
-msgid "Write Date"
+msgctxt "error:calendar.event:"
+msgid "UUID and recurrence must be unique in a calendar."
 msgstr ""
 
-msgctxt "field:calendar.attendee,write_uid:"
-msgid "Write User"
+msgctxt "error:calendar.location:"
+msgid "The name of calendar location must be unique."
 msgstr ""
 
 msgctxt "field:calendar.calendar,create_date:"
@@ -278,40 +255,6 @@ msgctxt "field:calendar.category,write_uid:"
 msgid "Write User"
 msgstr ""
 
-msgctxt "field:calendar.date,create_date:"
-msgid "Create Date"
-msgstr ""
-
-msgctxt "field:calendar.date,create_uid:"
-msgid "Create User"
-msgstr ""
-
-msgctxt "field:calendar.date,date:"
-msgid "Is Date"
-msgstr ""
-
-#, fuzzy
-msgctxt "field:calendar.date,datetime:"
-msgid "Date"
-msgstr "Vervaldatum"
-
-msgctxt "field:calendar.date,id:"
-msgid "ID"
-msgstr ""
-
-#, fuzzy
-msgctxt "field:calendar.date,rec_name:"
-msgid "Name"
-msgstr "Naam bijlage"
-
-msgctxt "field:calendar.date,write_date:"
-msgid "Write Date"
-msgstr ""
-
-msgctxt "field:calendar.date,write_uid:"
-msgid "Write User"
-msgstr ""
-
 msgctxt "field:calendar.event,alarms:"
 msgid "Alarms"
 msgstr ""
@@ -489,10 +432,6 @@ msgctxt "field:calendar.event-calendar.category,write_uid:"
 msgid "Write User"
 msgstr ""
 
-msgctxt "field:calendar.event.alarm,calendar_alarm:"
-msgid "Calendar Alarm"
-msgstr ""
-
 msgctxt "field:calendar.event.alarm,create_date:"
 msgid "Create Date"
 msgstr ""
@@ -514,6 +453,10 @@ msgctxt "field:calendar.event.alarm,rec_name:"
 msgid "Name"
 msgstr "Naam bijlage"
 
+msgctxt "field:calendar.event.alarm,valarm:"
+msgid "valarm"
+msgstr ""
+
 msgctxt "field:calendar.event.alarm,write_date:"
 msgid "Write Date"
 msgstr ""
@@ -522,8 +465,8 @@ msgctxt "field:calendar.event.alarm,write_uid:"
 msgid "Write User"
 msgstr ""
 
-msgctxt "field:calendar.event.attendee,calendar_attendee:"
-msgid "Calendar Attendee"
+msgctxt "field:calendar.event.attendee,attendee:"
+msgid "attendee"
 msgstr ""
 
 msgctxt "field:calendar.event.attendee,create_date:"
@@ -534,6 +477,11 @@ msgctxt "field:calendar.event.attendee,create_uid:"
 msgid "Create User"
 msgstr ""
 
+#, fuzzy
+msgctxt "field:calendar.event.attendee,email:"
+msgid "Email"
+msgstr "E-mail"
+
 msgctxt "field:calendar.event.attendee,event:"
 msgid "Event"
 msgstr ""
@@ -547,6 +495,10 @@ msgctxt "field:calendar.event.attendee,rec_name:"
 msgid "Name"
 msgstr "Naam bijlage"
 
+msgctxt "field:calendar.event.attendee,status:"
+msgid "Participation Status"
+msgstr ""
+
 msgctxt "field:calendar.event.attendee,write_date:"
 msgid "Write Date"
 msgstr ""
@@ -555,10 +507,6 @@ msgctxt "field:calendar.event.attendee,write_uid:"
 msgid "Write User"
 msgstr ""
 
-msgctxt "field:calendar.event.exdate,calendar_date:"
-msgid "Calendar Date"
-msgstr ""
-
 msgctxt "field:calendar.event.exdate,create_date:"
 msgid "Create Date"
 msgstr ""
@@ -567,6 +515,15 @@ msgctxt "field:calendar.event.exdate,create_uid:"
 msgid "Create User"
 msgstr ""
 
+msgctxt "field:calendar.event.exdate,date:"
+msgid "Is Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.event.exdate,datetime:"
+msgid "Date"
+msgstr "Vervaldatum"
+
 msgctxt "field:calendar.event.exdate,event:"
 msgid "Event"
 msgstr ""
@@ -588,217 +545,249 @@ msgctxt "field:calendar.event.exdate,write_uid:"
 msgid "Write User"
 msgstr ""
 
-msgctxt "field:calendar.event.exrule,calendar_rrule:"
-msgid "Calendar RRule"
+msgctxt "field:calendar.event.exrule,byday:"
+msgid "By Day"
 msgstr ""
 
-msgctxt "field:calendar.event.exrule,create_date:"
-msgid "Create Date"
+msgctxt "field:calendar.event.exrule,byhour:"
+msgid "By Hour"
 msgstr ""
 
-msgctxt "field:calendar.event.exrule,create_uid:"
-msgid "Create User"
+msgctxt "field:calendar.event.exrule,byminute:"
+msgid "By Minute"
 msgstr ""
 
-msgctxt "field:calendar.event.exrule,event:"
-msgid "Event"
+msgctxt "field:calendar.event.exrule,bymonth:"
+msgid "By Month"
 msgstr ""
 
-msgctxt "field:calendar.event.exrule,id:"
-msgid "ID"
+msgctxt "field:calendar.event.exrule,bymonthday:"
+msgid "By Month Day"
 msgstr ""
 
-#, fuzzy
-msgctxt "field:calendar.event.exrule,rec_name:"
-msgid "Name"
-msgstr "Naam bijlage"
+msgctxt "field:calendar.event.exrule,bysecond:"
+msgid "By Second"
+msgstr ""
 
-msgctxt "field:calendar.event.exrule,write_date:"
-msgid "Write Date"
+msgctxt "field:calendar.event.exrule,bysetpos:"
+msgid "By Position"
 msgstr ""
 
-msgctxt "field:calendar.event.exrule,write_uid:"
-msgid "Write User"
+msgctxt "field:calendar.event.exrule,byweekno:"
+msgid "By Week Number"
 msgstr ""
 
-msgctxt "field:calendar.event.rdate,calendar_date:"
-msgid "Calendar Date"
+msgctxt "field:calendar.event.exrule,byyearday:"
+msgid "By Year Day"
 msgstr ""
 
-msgctxt "field:calendar.event.rdate,create_date:"
+msgctxt "field:calendar.event.exrule,count:"
+msgid "Count"
+msgstr ""
+
+msgctxt "field:calendar.event.exrule,create_date:"
 msgid "Create Date"
 msgstr ""
 
-msgctxt "field:calendar.event.rdate,create_uid:"
+msgctxt "field:calendar.event.exrule,create_uid:"
 msgid "Create User"
 msgstr ""
 
-msgctxt "field:calendar.event.rdate,event:"
+msgctxt "field:calendar.event.exrule,event:"
 msgid "Event"
 msgstr ""
 
-msgctxt "field:calendar.event.rdate,id:"
-msgid "ID"
-msgstr ""
-
-#, fuzzy
-msgctxt "field:calendar.event.rdate,rec_name:"
-msgid "Name"
-msgstr "Naam bijlage"
-
-msgctxt "field:calendar.event.rdate,write_date:"
-msgid "Write Date"
+msgctxt "field:calendar.event.exrule,freq:"
+msgid "Frequency"
 msgstr ""
 
-msgctxt "field:calendar.event.rdate,write_uid:"
-msgid "Write User"
+msgctxt "field:calendar.event.exrule,id:"
+msgid "ID"
 msgstr ""
 
-msgctxt "field:calendar.event.rrule,calendar_rrule:"
-msgid "Calendar RRule"
+msgctxt "field:calendar.event.exrule,interval:"
+msgid "Interval"
 msgstr ""
 
-msgctxt "field:calendar.event.rrule,create_date:"
-msgid "Create Date"
-msgstr ""
+#, fuzzy
+msgctxt "field:calendar.event.exrule,rec_name:"
+msgid "Name"
+msgstr "Naam bijlage"
 
-msgctxt "field:calendar.event.rrule,create_uid:"
-msgid "Create User"
+msgctxt "field:calendar.event.exrule,until:"
+msgid "Until Date"
 msgstr ""
 
-msgctxt "field:calendar.event.rrule,event:"
-msgid "Event"
+msgctxt "field:calendar.event.exrule,until_date:"
+msgid "Is Date"
 msgstr ""
 
-msgctxt "field:calendar.event.rrule,id:"
-msgid "ID"
+msgctxt "field:calendar.event.exrule,wkst:"
+msgid "Week Day"
 msgstr ""
 
-#, fuzzy
-msgctxt "field:calendar.event.rrule,rec_name:"
-msgid "Name"
-msgstr "Naam bijlage"
-
-msgctxt "field:calendar.event.rrule,write_date:"
+msgctxt "field:calendar.event.exrule,write_date:"
 msgid "Write Date"
 msgstr ""
 
-msgctxt "field:calendar.event.rrule,write_uid:"
+msgctxt "field:calendar.event.exrule,write_uid:"
 msgid "Write User"
 msgstr ""
 
-msgctxt "field:calendar.location,create_date:"
+msgctxt "field:calendar.event.rdate,create_date:"
 msgid "Create Date"
 msgstr ""
 
-msgctxt "field:calendar.location,create_uid:"
+msgctxt "field:calendar.event.rdate,create_uid:"
 msgid "Create User"
 msgstr ""
 
-msgctxt "field:calendar.location,id:"
-msgid "ID"
+msgctxt "field:calendar.event.rdate,date:"
+msgid "Is Date"
 msgstr ""
 
 #, fuzzy
-msgctxt "field:calendar.location,name:"
-msgid "Name"
-msgstr "Naam bijlage"
+msgctxt "field:calendar.event.rdate,datetime:"
+msgid "Date"
+msgstr "Vervaldatum"
+
+msgctxt "field:calendar.event.rdate,event:"
+msgid "Event"
+msgstr ""
+
+msgctxt "field:calendar.event.rdate,id:"
+msgid "ID"
+msgstr ""
 
 #, fuzzy
-msgctxt "field:calendar.location,rec_name:"
+msgctxt "field:calendar.event.rdate,rec_name:"
 msgid "Name"
 msgstr "Naam bijlage"
 
-msgctxt "field:calendar.location,write_date:"
+msgctxt "field:calendar.event.rdate,write_date:"
 msgid "Write Date"
 msgstr ""
 
-msgctxt "field:calendar.location,write_uid:"
+msgctxt "field:calendar.event.rdate,write_uid:"
 msgid "Write User"
 msgstr ""
 
-msgctxt "field:calendar.rrule,byday:"
+msgctxt "field:calendar.event.rrule,byday:"
 msgid "By Day"
 msgstr ""
 
-msgctxt "field:calendar.rrule,byhour:"
+msgctxt "field:calendar.event.rrule,byhour:"
 msgid "By Hour"
 msgstr ""
 
-msgctxt "field:calendar.rrule,byminute:"
+msgctxt "field:calendar.event.rrule,byminute:"
 msgid "By Minute"
 msgstr ""
 
-msgctxt "field:calendar.rrule,bymonth:"
+msgctxt "field:calendar.event.rrule,bymonth:"
 msgid "By Month"
 msgstr ""
 
-msgctxt "field:calendar.rrule,bymonthday:"
+msgctxt "field:calendar.event.rrule,bymonthday:"
 msgid "By Month Day"
 msgstr ""
 
-msgctxt "field:calendar.rrule,bysecond:"
+msgctxt "field:calendar.event.rrule,bysecond:"
 msgid "By Second"
 msgstr ""
 
-msgctxt "field:calendar.rrule,bysetpos:"
+msgctxt "field:calendar.event.rrule,bysetpos:"
 msgid "By Position"
 msgstr ""
 
-msgctxt "field:calendar.rrule,byweekno:"
+msgctxt "field:calendar.event.rrule,byweekno:"
 msgid "By Week Number"
 msgstr ""
 
-msgctxt "field:calendar.rrule,byyearday:"
+msgctxt "field:calendar.event.rrule,byyearday:"
 msgid "By Year Day"
 msgstr ""
 
-msgctxt "field:calendar.rrule,count:"
+msgctxt "field:calendar.event.rrule,count:"
 msgid "Count"
 msgstr ""
 
-msgctxt "field:calendar.rrule,create_date:"
+msgctxt "field:calendar.event.rrule,create_date:"
 msgid "Create Date"
 msgstr ""
 
-msgctxt "field:calendar.rrule,create_uid:"
+msgctxt "field:calendar.event.rrule,create_uid:"
 msgid "Create User"
 msgstr ""
 
-msgctxt "field:calendar.rrule,freq:"
+msgctxt "field:calendar.event.rrule,event:"
+msgid "Event"
+msgstr ""
+
+msgctxt "field:calendar.event.rrule,freq:"
 msgid "Frequency"
 msgstr ""
 
-msgctxt "field:calendar.rrule,id:"
+msgctxt "field:calendar.event.rrule,id:"
 msgid "ID"
 msgstr ""
 
-msgctxt "field:calendar.rrule,interval:"
+msgctxt "field:calendar.event.rrule,interval:"
 msgid "Interval"
 msgstr ""
 
 #, fuzzy
-msgctxt "field:calendar.rrule,rec_name:"
+msgctxt "field:calendar.event.rrule,rec_name:"
 msgid "Name"
 msgstr "Naam bijlage"
 
-msgctxt "field:calendar.rrule,until:"
+msgctxt "field:calendar.event.rrule,until:"
 msgid "Until Date"
 msgstr ""
 
-msgctxt "field:calendar.rrule,until_date:"
+msgctxt "field:calendar.event.rrule,until_date:"
 msgid "Is Date"
 msgstr ""
 
-msgctxt "field:calendar.rrule,wkst:"
+msgctxt "field:calendar.event.rrule,wkst:"
 msgid "Week Day"
 msgstr ""
 
-msgctxt "field:calendar.rrule,write_date:"
+msgctxt "field:calendar.event.rrule,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.event.rrule,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.location,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:calendar.location,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:calendar.location,id:"
+msgid "ID"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.location,name:"
+msgid "Name"
+msgstr "Naam bijlage"
+
+#, fuzzy
+msgctxt "field:calendar.location,rec_name:"
+msgid "Name"
+msgstr "Naam bijlage"
+
+msgctxt "field:calendar.location,write_date:"
 msgid "Write Date"
 msgstr ""
 
-msgctxt "field:calendar.rrule,write_uid:"
+msgctxt "field:calendar.location,write_uid:"
 msgid "Write User"
 msgstr ""
 
@@ -810,24 +799,24 @@ msgctxt "help:calendar.calendar,owner:"
 msgid "The user must have an email"
 msgstr ""
 
-msgctxt "help:calendar.date,date:"
-msgid "Ignore time of field \"Date\", but handle as date only."
-msgstr ""
-
 msgctxt "help:calendar.event,uuid:"
 msgid "Universally Unique Identifier"
 msgstr ""
 
-msgctxt "help:calendar.rrule,until_date:"
+msgctxt "help:calendar.event.exdate,date:"
+msgid "Ignore time of field \"Date\", but handle as date only."
+msgstr ""
+
+msgctxt "help:calendar.event.exrule,until_date:"
 msgid "Ignore time of field \"Until Date\", but handle as date only."
 msgstr ""
 
-msgctxt "model:calendar.alarm,name:"
-msgid "Alarm"
+msgctxt "help:calendar.event.rdate,date:"
+msgid "Ignore time of field \"Date\", but handle as date only."
 msgstr ""
 
-msgctxt "model:calendar.attendee,name:"
-msgid "Attendee"
+msgctxt "help:calendar.event.rrule,until_date:"
+msgid "Ignore time of field \"Until Date\", but handle as date only."
 msgstr ""
 
 msgctxt "model:calendar.calendar,name:"
@@ -847,10 +836,6 @@ msgctxt "model:calendar.category,name:"
 msgid "Category"
 msgstr "Categorie"
 
-msgctxt "model:calendar.date,name:"
-msgid "Calendar Date"
-msgstr ""
-
 msgctxt "model:calendar.event,name:"
 msgid "Event"
 msgstr ""
@@ -887,10 +872,6 @@ msgctxt "model:calendar.location,name:"
 msgid "Location"
 msgstr ""
 
-msgctxt "model:calendar.rrule,name:"
-msgid "Recurrence Rule"
-msgstr ""
-
 msgctxt "model:ir.action,name:act_calendar_form"
 msgid "Calendars"
 msgstr ""
@@ -919,30 +900,6 @@ msgctxt "model:res.group,name:group_calendar_admin"
 msgid "Calendar Administration"
 msgstr ""
 
-msgctxt "selection:calendar.attendee,status:"
-msgid ""
-msgstr ""
-
-msgctxt "selection:calendar.attendee,status:"
-msgid "Accepted"
-msgstr ""
-
-msgctxt "selection:calendar.attendee,status:"
-msgid "Declined"
-msgstr ""
-
-msgctxt "selection:calendar.attendee,status:"
-msgid "Delegated"
-msgstr ""
-
-msgctxt "selection:calendar.attendee,status:"
-msgid "Needs Action"
-msgstr ""
-
-msgctxt "selection:calendar.attendee,status:"
-msgid "Tentative"
-msgstr ""
-
 msgctxt "selection:calendar.event,classification:"
 msgid "Confidential"
 msgstr ""
@@ -980,63 +937,147 @@ msgctxt "selection:calendar.event,transp:"
 msgid "Transparent"
 msgstr ""
 
-msgctxt "selection:calendar.rrule,freq:"
+msgctxt "selection:calendar.event.attendee,status:"
+msgid ""
+msgstr ""
+
+msgctxt "selection:calendar.event.attendee,status:"
+msgid "Accepted"
+msgstr ""
+
+msgctxt "selection:calendar.event.attendee,status:"
+msgid "Declined"
+msgstr ""
+
+msgctxt "selection:calendar.event.attendee,status:"
+msgid "Delegated"
+msgstr ""
+
+msgctxt "selection:calendar.event.attendee,status:"
+msgid "Needs Action"
+msgstr ""
+
+msgctxt "selection:calendar.event.attendee,status:"
+msgid "Tentative"
+msgstr ""
+
+msgctxt "selection:calendar.event.exrule,freq:"
+msgid "Daily"
+msgstr ""
+
+msgctxt "selection:calendar.event.exrule,freq:"
+msgid "Hourly"
+msgstr ""
+
+msgctxt "selection:calendar.event.exrule,freq:"
+msgid "Minutely"
+msgstr ""
+
+msgctxt "selection:calendar.event.exrule,freq:"
+msgid "Monthly"
+msgstr ""
+
+msgctxt "selection:calendar.event.exrule,freq:"
+msgid "Secondly"
+msgstr ""
+
+msgctxt "selection:calendar.event.exrule,freq:"
+msgid "Weekly"
+msgstr ""
+
+msgctxt "selection:calendar.event.exrule,freq:"
+msgid "Yearly"
+msgstr ""
+
+msgctxt "selection:calendar.event.exrule,wkst:"
+msgid "Friday"
+msgstr ""
+
+msgctxt "selection:calendar.event.exrule,wkst:"
+msgid "Monday"
+msgstr ""
+
+msgctxt "selection:calendar.event.exrule,wkst:"
+msgid "Saturday"
+msgstr ""
+
+msgctxt "selection:calendar.event.exrule,wkst:"
+msgid "Sunday"
+msgstr ""
+
+msgctxt "selection:calendar.event.exrule,wkst:"
+msgid "Thursday"
+msgstr ""
+
+msgctxt "selection:calendar.event.exrule,wkst:"
+msgid "Tuesday"
+msgstr ""
+
+msgctxt "selection:calendar.event.exrule,wkst:"
+msgid "Wednesday"
+msgstr ""
+
+msgctxt "selection:calendar.event.rrule,freq:"
 msgid "Daily"
 msgstr ""
 
-msgctxt "selection:calendar.rrule,freq:"
+msgctxt "selection:calendar.event.rrule,freq:"
 msgid "Hourly"
 msgstr ""
 
-msgctxt "selection:calendar.rrule,freq:"
+msgctxt "selection:calendar.event.rrule,freq:"
 msgid "Minutely"
 msgstr ""
 
-msgctxt "selection:calendar.rrule,freq:"
+msgctxt "selection:calendar.event.rrule,freq:"
 msgid "Monthly"
 msgstr ""
 
-msgctxt "selection:calendar.rrule,freq:"
+msgctxt "selection:calendar.event.rrule,freq:"
 msgid "Secondly"
 msgstr ""
 
-msgctxt "selection:calendar.rrule,freq:"
+msgctxt "selection:calendar.event.rrule,freq:"
 msgid "Weekly"
 msgstr ""
 
-msgctxt "selection:calendar.rrule,freq:"
+msgctxt "selection:calendar.event.rrule,freq:"
 msgid "Yearly"
 msgstr ""
 
-msgctxt "selection:calendar.rrule,wkst:"
+msgctxt "selection:calendar.event.rrule,wkst:"
 msgid "Friday"
 msgstr ""
 
-msgctxt "selection:calendar.rrule,wkst:"
+msgctxt "selection:calendar.event.rrule,wkst:"
 msgid "Monday"
 msgstr ""
 
-msgctxt "selection:calendar.rrule,wkst:"
+msgctxt "selection:calendar.event.rrule,wkst:"
 msgid "Saturday"
 msgstr ""
 
-msgctxt "selection:calendar.rrule,wkst:"
+msgctxt "selection:calendar.event.rrule,wkst:"
 msgid "Sunday"
 msgstr ""
 
-msgctxt "selection:calendar.rrule,wkst:"
+msgctxt "selection:calendar.event.rrule,wkst:"
 msgid "Thursday"
 msgstr ""
 
-msgctxt "selection:calendar.rrule,wkst:"
+msgctxt "selection:calendar.event.rrule,wkst:"
 msgid "Tuesday"
 msgstr ""
 
-msgctxt "selection:calendar.rrule,wkst:"
+msgctxt "selection:calendar.event.rrule,wkst:"
 msgid "Wednesday"
 msgstr ""
 
 msgctxt "view:calendar.calendar:"
+msgid "Access Permissions"
+msgstr ""
+
+msgctxt "view:calendar.calendar:"
 msgid "Calendar"
 msgstr ""
 
@@ -1049,10 +1090,6 @@ msgctxt "view:calendar.calendar:"
 msgid "General"
 msgstr "Algemeen"
 
-msgctxt "view:calendar.calendar:"
-msgid "Security"
-msgstr ""
-
 #, fuzzy
 msgctxt "view:calendar.category:"
 msgid "Categories"
diff --git a/locale/ru_RU.po b/locale/ru_RU.po
index 4c2e639..e5bb5c8 100644
--- a/locale/ru_RU.po
+++ b/locale/ru_RU.po
@@ -3,140 +3,120 @@ msgid ""
 msgstr "Content-Type: text/plain; charset=utf-8\n"
 
 msgctxt "error:calendar.calendar:"
-msgid "A user can have only one calendar!"
-msgstr "Пользователь может иметь только Один календарь!"
+msgid "A user can have only one calendar."
+msgstr "Пользователь может иметь только один календарь."
 
 msgctxt "error:calendar.calendar:"
-msgid "The name of calendar must be unique!"
-msgstr "Имя календаря должно быть уникально"
+msgid "Calendar name \"%s\" can not end with .ics"
+msgstr "Название календаря \"%s\" не может оканчиваться на \".ics\"."
+
+msgctxt "error:calendar.calendar:"
+msgid "The name of calendar must be unique."
+msgstr "Название календаря должно быть уникальным."
 
 msgctxt "error:calendar.category:"
-msgid "The name of calendar category must be unique!"
-msgstr ""
+msgid "The name of calendar category must be unique."
+msgstr "Название категории календаря должно быть уникальным."
 
-msgctxt "error:calendar.event:"
-msgid "Recurrence can not be recurrent!"
-msgstr ""
+msgctxt "error:calendar.event.exrule:"
+msgid "Invalid \"By Day\" in recurrence rule \"%s\""
+msgstr "Некорректное значение \"В день\" в повторении \"%s\"."
 
-msgctxt "error:calendar.event:"
-msgid "UUID and recurrence must be unique in a calendar!"
-msgstr ""
+msgctxt "error:calendar.event.exrule:"
+msgid "Invalid \"By Hour\" in recurrence rule \"%s\""
+msgstr "Некорректное значение \"В час\" в повторении \"%s\"."
 
-msgctxt "error:calendar.location:"
-msgid "The name of calendar location must be unique!"
-msgstr ""
+msgctxt "error:calendar.event.exrule:"
+msgid "Invalid \"By Minute\" in recurrence rule \"%s\""
+msgstr "Некорректное значение \"В минуту\" в повторении \"%s\"."
 
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Day\""
-msgstr "Неверное поле \"По дням\""
+msgctxt "error:calendar.event.exrule:"
+msgid "Invalid \"By Month Day\" in recurrence rule \"%s\""
+msgstr "Некорректное значение \"В день месяца\" в повторении \"%s\"."
 
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Hour\""
-msgstr "Неверное поле \"По часам\""
+msgctxt "error:calendar.event.exrule:"
+msgid "Invalid \"By Month\" in recurrence rule \"%s\""
+msgstr "Некорректное значение \"В месяц\" в повторении \"%s\"."
 
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Minute\""
-msgstr "Неверное поле \"По минутам\""
+msgctxt "error:calendar.event.exrule:"
+msgid "Invalid \"By Position\" in recurrence rule \"%s\""
+msgstr "Некорректное значение \"По положению\" в повторении \"%s\"."
 
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Month Day\""
-msgstr "Неверное поле \"По дням месяца\""
+msgctxt "error:calendar.event.exrule:"
+msgid "Invalid \"By Second\" in recurrence rule \"%s\""
+msgstr "Некорректное значение \"В секунду\" в повторении \"%s\"."
 
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Month\""
-msgstr "Неверное поле \"По месяцам\""
+msgctxt "error:calendar.event.exrule:"
+msgid "Invalid \"By Week Number\" in recurrence rule \"%s\""
+msgstr "Некорректное значение \"В неделю номер\" в повторении \"%s\"."
 
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Position\""
-msgstr "Неверное поле \"По позиции\""
+msgctxt "error:calendar.event.exrule:"
+msgid "Invalid \"By Year Day\" in recurrence rule \"%s\""
+msgstr "Некорректное значение \"В день года\" в повторении \"%s\"."
 
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Second\""
-msgstr "Неверное поле \"По секундам\""
+msgctxt "error:calendar.event.exrule:"
+msgid "Only one of \"until\" and \"count\" can be set."
+msgstr "Может быть задано только одно из полей - \"До даты\" или \"Кол-во\"."
 
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Week Number\""
-msgstr "Неверное поле \"По номерам недель\""
+msgctxt "error:calendar.event.rrule:"
+msgid "Invalid \"By Day\" in recurrence rule \"%s\""
+msgstr "Некорректное значение \"В день\" в повторении \"%s\"."
 
-msgctxt "error:calendar.rrule:"
-msgid "Invalid \"By Year Day\""
-msgstr "Неверный \"По дням года\""
+msgctxt "error:calendar.event.rrule:"
+msgid "Invalid \"By Hour\" in recurrence rule \"%s\""
+msgstr "Некорректное значение \"В час\" в повторении \"%s\"."
 
-msgctxt "error:calendar.rrule:"
-msgid "Only one of \"until\" and \"count\" can be set!"
-msgstr ""
+msgctxt "error:calendar.event.rrule:"
+msgid "Invalid \"By Minute\" in recurrence rule \"%s\""
+msgstr "Некорректное значение \"В минуту\" в повторении \"%s\"."
 
-msgctxt "field:calendar.alarm,create_date:"
-msgid "Create Date"
-msgstr ""
+msgctxt "error:calendar.event.rrule:"
+msgid "Invalid \"By Month Day\" in recurrence rule \"%s\""
+msgstr "Некорректное значение \"В день месяца\" в повторении \"%s\"."
 
-msgctxt "field:calendar.alarm,create_uid:"
-msgid "Create User"
-msgstr ""
+msgctxt "error:calendar.event.rrule:"
+msgid "Invalid \"By Month\" in recurrence rule \"%s\""
+msgstr "Некорректное значение \"В месяц\" в повторении \"%s\"."
 
-msgctxt "field:calendar.alarm,id:"
-msgid "ID"
-msgstr ""
+msgctxt "error:calendar.event.rrule:"
+msgid "Invalid \"By Position\" in recurrence rule \"%s\""
+msgstr "Некорректное значение \"По положению\" в повторении \"%s\"."
 
-msgctxt "field:calendar.alarm,rec_name:"
-msgid "Name"
-msgstr "Наименование"
+msgctxt "error:calendar.event.rrule:"
+msgid "Invalid \"By Second\" in recurrence rule \"%s\""
+msgstr "Некорректное значение \"В секунду\" в повторении \"%s\"."
 
-msgctxt "field:calendar.alarm,valarm:"
-msgid "valarm"
-msgstr ""
+msgctxt "error:calendar.event.rrule:"
+msgid "Invalid \"By Week Number\" in recurrence rule \"%s\""
+msgstr "Некорректное значение \"В неделю номер\" в повторении \"%s\"."
 
-msgctxt "field:calendar.alarm,write_date:"
-msgid "Write Date"
-msgstr ""
+msgctxt "error:calendar.event.rrule:"
+msgid "Invalid \"By Year Day\" in recurrence rule \"%s\""
+msgstr "Некорректное значение \"В день года\" в повторении \"%s\"."
 
-msgctxt "field:calendar.alarm,write_uid:"
-msgid "Write User"
-msgstr ""
+msgctxt "error:calendar.event.rrule:"
+msgid "Only one of \"until\" and \"count\" can be set."
+msgstr "Может быть задано только одно из полей - \"До даты\" или \"Кол-во\"."
 
-msgctxt "field:calendar.attendee,attendee:"
-msgid "attendee"
-msgstr "участник"
-
-msgctxt "field:calendar.attendee,create_date:"
-msgid "Create Date"
-msgstr ""
-
-msgctxt "field:calendar.attendee,create_uid:"
-msgid "Create User"
-msgstr ""
-
-msgctxt "field:calendar.attendee,email:"
-msgid "Email"
-msgstr "Эл.почта"
-
-msgctxt "field:calendar.attendee,id:"
-msgid "ID"
-msgstr ""
-
-msgctxt "field:calendar.attendee,rec_name:"
-msgid "Name"
-msgstr "Наименование"
-
-msgctxt "field:calendar.attendee,status:"
-msgid "Participation Status"
-msgstr "Статус участия"
+msgctxt "error:calendar.event:"
+msgid "Recurrence \"%s\" can not be recurrent."
+msgstr "Повторение \"%s\" не может быть повторяемым."
 
-msgctxt "field:calendar.attendee,write_date:"
-msgid "Write Date"
-msgstr ""
+msgctxt "error:calendar.event:"
+msgid "UUID and recurrence must be unique in a calendar."
+msgstr "UUID и повторение должны быть уникальными в календаре."
 
-msgctxt "field:calendar.attendee,write_uid:"
-msgid "Write User"
-msgstr ""
+msgctxt "error:calendar.location:"
+msgid "The name of calendar location must be unique."
+msgstr "Название местоположения календаря должно быть уникальным."
 
 msgctxt "field:calendar.calendar,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Дата создания"
 
 msgctxt "field:calendar.calendar,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Создано пользователем"
 
 msgctxt "field:calendar.calendar,description:"
 msgid "Description"
@@ -144,7 +124,7 @@ msgstr "Описание"
 
 msgctxt "field:calendar.calendar,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:calendar.calendar,name:"
 msgid "Name"
@@ -164,11 +144,11 @@ msgstr "Наименование"
 
 msgctxt "field:calendar.calendar,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Дата изменения"
 
 msgctxt "field:calendar.calendar,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Изменено пользователем"
 
 msgctxt "field:calendar.calendar,write_users:"
 msgid "Write Users"
@@ -180,15 +160,15 @@ msgstr "Календар"
 
 msgctxt "field:calendar.calendar-read-res.user,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Дата создания"
 
 msgctxt "field:calendar.calendar-read-res.user,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Создано пользователем"
 
 msgctxt "field:calendar.calendar-read-res.user,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:calendar.calendar-read-res.user,rec_name:"
 msgid "Name"
@@ -200,11 +180,11 @@ msgstr "Пользователь"
 
 msgctxt "field:calendar.calendar-read-res.user,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Дата изменения"
 
 msgctxt "field:calendar.calendar-read-res.user,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Изменено пользователем"
 
 msgctxt "field:calendar.calendar-write-res.user,calendar:"
 msgid "Calendar"
@@ -212,15 +192,15 @@ msgstr "Календарь"
 
 msgctxt "field:calendar.calendar-write-res.user,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Дата создания"
 
 msgctxt "field:calendar.calendar-write-res.user,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Создано пользователем"
 
 msgctxt "field:calendar.calendar-write-res.user,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:calendar.calendar-write-res.user,rec_name:"
 msgid "Name"
@@ -232,23 +212,23 @@ msgstr "Пользователь"
 
 msgctxt "field:calendar.calendar-write-res.user,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Дата изменения"
 
 msgctxt "field:calendar.calendar-write-res.user,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Изменено пользователем"
 
 msgctxt "field:calendar.category,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Дата создания"
 
 msgctxt "field:calendar.category,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Создано пользователем"
 
 msgctxt "field:calendar.category,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:calendar.category,name:"
 msgid "Name"
@@ -260,43 +240,11 @@ msgstr "Наименование"
 
 msgctxt "field:calendar.category,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Дата изменения"
 
 msgctxt "field:calendar.category,write_uid:"
 msgid "Write User"
-msgstr ""
-
-msgctxt "field:calendar.date,create_date:"
-msgid "Create Date"
-msgstr ""
-
-msgctxt "field:calendar.date,create_uid:"
-msgid "Create User"
-msgstr ""
-
-msgctxt "field:calendar.date,date:"
-msgid "Is Date"
-msgstr "Весь день"
-
-msgctxt "field:calendar.date,datetime:"
-msgid "Date"
-msgstr "Дата"
-
-msgctxt "field:calendar.date,id:"
-msgid "ID"
-msgstr ""
-
-msgctxt "field:calendar.date,rec_name:"
-msgid "Name"
-msgstr "Наименование"
-
-msgctxt "field:calendar.date,write_date:"
-msgid "Write Date"
-msgstr ""
-
-msgctxt "field:calendar.date,write_uid:"
-msgid "Write User"
-msgstr ""
+msgstr "Изменено пользователем"
 
 msgctxt "field:calendar.event,alarms:"
 msgid "Alarms"
@@ -336,11 +284,11 @@ msgstr "Классификация"
 
 msgctxt "field:calendar.event,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Дата создания"
 
 msgctxt "field:calendar.event,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Создано пользователем"
 
 msgctxt "field:calendar.event,description:"
 msgid "Description"
@@ -364,7 +312,7 @@ msgstr "Правила исключения"
 
 msgctxt "field:calendar.event,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:calendar.event,location:"
 msgid "Location"
@@ -380,7 +328,7 @@ msgstr "Организатор"
 
 msgctxt "field:calendar.event,parent:"
 msgid "Parent"
-msgstr "Основной"
+msgstr "Предок"
 
 msgctxt "field:calendar.event,rdates:"
 msgid "Recurrence Dates"
@@ -400,7 +348,7 @@ msgstr "Правила повторения"
 
 msgctxt "field:calendar.event,sequence:"
 msgid "Sequence"
-msgstr "Последовательность"
+msgstr "Нумерация"
 
 msgctxt "field:calendar.event,status:"
 msgid "Status"
@@ -416,11 +364,11 @@ msgstr "Зона времени"
 
 msgctxt "field:calendar.event,transp:"
 msgid "Time Transparency"
-msgstr "Время Прозрачность"
+msgstr "Доступность в это время"
 
 msgctxt "field:calendar.event,uuid:"
 msgid "UUID"
-msgstr ""
+msgstr "UUID"
 
 msgctxt "field:calendar.event,vevent:"
 msgid "vevent"
@@ -428,23 +376,23 @@ msgstr ""
 
 msgctxt "field:calendar.event,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Дата изменения"
 
 msgctxt "field:calendar.event,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Изменено пользователем"
 
 msgctxt "field:calendar.event-calendar.category,category:"
 msgid "Category"
-msgstr "Категории"
+msgstr "Категория"
 
 msgctxt "field:calendar.event-calendar.category,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Дата создания"
 
 msgctxt "field:calendar.event-calendar.category,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Создано пользователем"
 
 msgctxt "field:calendar.event-calendar.category,event:"
 msgid "Event"
@@ -452,7 +400,7 @@ msgstr "Событие"
 
 msgctxt "field:calendar.event-calendar.category,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:calendar.event-calendar.category,rec_name:"
 msgid "Name"
@@ -460,23 +408,19 @@ msgstr "Наименование"
 
 msgctxt "field:calendar.event-calendar.category,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Дата изменения"
 
 msgctxt "field:calendar.event-calendar.category,write_uid:"
 msgid "Write User"
-msgstr ""
-
-msgctxt "field:calendar.event.alarm,calendar_alarm:"
-msgid "Calendar Alarm"
-msgstr "Сигнала календаря"
+msgstr "Изменено пользователем"
 
 msgctxt "field:calendar.event.alarm,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Дата создания"
 
 msgctxt "field:calendar.event.alarm,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Создано пользователем"
 
 msgctxt "field:calendar.event.alarm,event:"
 msgid "Event"
@@ -484,31 +428,39 @@ msgstr "Событие"
 
 msgctxt "field:calendar.event.alarm,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:calendar.event.alarm,rec_name:"
 msgid "Name"
 msgstr "Наименование"
 
+msgctxt "field:calendar.event.alarm,valarm:"
+msgid "valarm"
+msgstr ""
+
 msgctxt "field:calendar.event.alarm,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Дата изменения"
 
 msgctxt "field:calendar.event.alarm,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Изменено пользователем"
 
-msgctxt "field:calendar.event.attendee,calendar_attendee:"
-msgid "Calendar Attendee"
-msgstr "Календарь участников"
+msgctxt "field:calendar.event.attendee,attendee:"
+msgid "attendee"
+msgstr "участник"
 
 msgctxt "field:calendar.event.attendee,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Дата создания"
 
 msgctxt "field:calendar.event.attendee,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Создано пользователем"
+
+msgctxt "field:calendar.event.attendee,email:"
+msgid "Email"
+msgstr "Эл.почта"
 
 msgctxt "field:calendar.event.attendee,event:"
 msgid "Event"
@@ -516,31 +468,39 @@ msgstr "Событие"
 
 msgctxt "field:calendar.event.attendee,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:calendar.event.attendee,rec_name:"
 msgid "Name"
 msgstr "Наименование"
 
+msgctxt "field:calendar.event.attendee,status:"
+msgid "Participation Status"
+msgstr "Статус участия"
+
 msgctxt "field:calendar.event.attendee,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Дата изменения"
 
 msgctxt "field:calendar.event.attendee,write_uid:"
 msgid "Write User"
-msgstr ""
-
-msgctxt "field:calendar.event.exdate,calendar_date:"
-msgid "Calendar Date"
-msgstr "День календаря"
+msgstr "Изменено пользователем"
 
 msgctxt "field:calendar.event.exdate,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Дата создания"
 
 msgctxt "field:calendar.event.exdate,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Создано пользователем"
+
+msgctxt "field:calendar.event.exdate,date:"
+msgid "Is Date"
+msgstr "Только Дата"
+
+msgctxt "field:calendar.event.exdate,datetime:"
+msgid "Date"
+msgstr "Дата"
 
 msgctxt "field:calendar.event.exdate,event:"
 msgid "Event"
@@ -548,7 +508,7 @@ msgstr "Событие"
 
 msgctxt "field:calendar.event.exdate,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:calendar.event.exdate,rec_name:"
 msgid "Name"
@@ -556,55 +516,115 @@ msgstr "Наименование"
 
 msgctxt "field:calendar.event.exdate,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Дата изменения"
 
 msgctxt "field:calendar.event.exdate,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Изменено пользователем"
 
-msgctxt "field:calendar.event.exrule,calendar_rrule:"
-msgid "Calendar RRule"
-msgstr "Правила календаря"
+msgctxt "field:calendar.event.exrule,byday:"
+msgid "By Day"
+msgstr "В день"
+
+msgctxt "field:calendar.event.exrule,byhour:"
+msgid "By Hour"
+msgstr "В час"
+
+msgctxt "field:calendar.event.exrule,byminute:"
+msgid "By Minute"
+msgstr "В минуту"
+
+msgctxt "field:calendar.event.exrule,bymonth:"
+msgid "By Month"
+msgstr "В месяц"
+
+msgctxt "field:calendar.event.exrule,bymonthday:"
+msgid "By Month Day"
+msgstr "В день месяца"
+
+msgctxt "field:calendar.event.exrule,bysecond:"
+msgid "By Second"
+msgstr "В секунду"
+
+msgctxt "field:calendar.event.exrule,bysetpos:"
+msgid "By Position"
+msgstr "По положению"
+
+msgctxt "field:calendar.event.exrule,byweekno:"
+msgid "By Week Number"
+msgstr "В неделю номер"
+
+msgctxt "field:calendar.event.exrule,byyearday:"
+msgid "By Year Day"
+msgstr "В день года"
+
+msgctxt "field:calendar.event.exrule,count:"
+msgid "Count"
+msgstr "Кол-во"
 
 msgctxt "field:calendar.event.exrule,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Дата создания"
 
 msgctxt "field:calendar.event.exrule,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Создано пользователем"
 
 msgctxt "field:calendar.event.exrule,event:"
 msgid "Event"
 msgstr "Событие"
 
+msgctxt "field:calendar.event.exrule,freq:"
+msgid "Frequency"
+msgstr "Повторение"
+
 msgctxt "field:calendar.event.exrule,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
+
+msgctxt "field:calendar.event.exrule,interval:"
+msgid "Interval"
+msgstr "Интервал"
 
 msgctxt "field:calendar.event.exrule,rec_name:"
 msgid "Name"
 msgstr "Наименование"
 
+msgctxt "field:calendar.event.exrule,until:"
+msgid "Until Date"
+msgstr "До даты"
+
+msgctxt "field:calendar.event.exrule,until_date:"
+msgid "Is Date"
+msgstr "Только Дата"
+
+msgctxt "field:calendar.event.exrule,wkst:"
+msgid "Week Day"
+msgstr "День недели"
+
 msgctxt "field:calendar.event.exrule,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Дата изменения"
 
 msgctxt "field:calendar.event.exrule,write_uid:"
 msgid "Write User"
-msgstr ""
-
-msgctxt "field:calendar.event.rdate,calendar_date:"
-msgid "Calendar Date"
-msgstr "День календаря"
+msgstr "Изменено пользователем"
 
 msgctxt "field:calendar.event.rdate,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Дата создания"
 
 msgctxt "field:calendar.event.rdate,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Создано пользователем"
+
+msgctxt "field:calendar.event.rdate,date:"
+msgid "Is Date"
+msgstr "Только Дата"
+
+msgctxt "field:calendar.event.rdate,datetime:"
+msgid "Date"
+msgstr "Дата"
 
 msgctxt "field:calendar.event.rdate,event:"
 msgid "Event"
@@ -612,7 +632,7 @@ msgstr "Событие"
 
 msgctxt "field:calendar.event.rdate,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:calendar.event.rdate,rec_name:"
 msgid "Name"
@@ -620,55 +640,111 @@ msgstr "Наименование"
 
 msgctxt "field:calendar.event.rdate,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Дата изменения"
 
 msgctxt "field:calendar.event.rdate,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Изменено пользователем"
+
+msgctxt "field:calendar.event.rrule,byday:"
+msgid "By Day"
+msgstr "В день"
+
+msgctxt "field:calendar.event.rrule,byhour:"
+msgid "By Hour"
+msgstr "В час"
+
+msgctxt "field:calendar.event.rrule,byminute:"
+msgid "By Minute"
+msgstr "В минуту"
+
+msgctxt "field:calendar.event.rrule,bymonth:"
+msgid "By Month"
+msgstr "В месяц"
+
+msgctxt "field:calendar.event.rrule,bymonthday:"
+msgid "By Month Day"
+msgstr "В день месяца"
+
+msgctxt "field:calendar.event.rrule,bysecond:"
+msgid "By Second"
+msgstr "В секунду"
+
+msgctxt "field:calendar.event.rrule,bysetpos:"
+msgid "By Position"
+msgstr "По положению"
+
+msgctxt "field:calendar.event.rrule,byweekno:"
+msgid "By Week Number"
+msgstr "В неделю номер"
+
+msgctxt "field:calendar.event.rrule,byyearday:"
+msgid "By Year Day"
+msgstr "В день года"
 
-msgctxt "field:calendar.event.rrule,calendar_rrule:"
-msgid "Calendar RRule"
-msgstr "Правила календаря"
+msgctxt "field:calendar.event.rrule,count:"
+msgid "Count"
+msgstr "Кол-во"
 
 msgctxt "field:calendar.event.rrule,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Дата создания"
 
 msgctxt "field:calendar.event.rrule,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Создано пользователем"
 
 msgctxt "field:calendar.event.rrule,event:"
 msgid "Event"
 msgstr "Событие"
 
+msgctxt "field:calendar.event.rrule,freq:"
+msgid "Frequency"
+msgstr "Повторение"
+
 msgctxt "field:calendar.event.rrule,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
+
+msgctxt "field:calendar.event.rrule,interval:"
+msgid "Interval"
+msgstr "Интервал"
 
 msgctxt "field:calendar.event.rrule,rec_name:"
 msgid "Name"
 msgstr "Наименование"
 
+msgctxt "field:calendar.event.rrule,until:"
+msgid "Until Date"
+msgstr "До даты"
+
+msgctxt "field:calendar.event.rrule,until_date:"
+msgid "Is Date"
+msgstr "Только Дата"
+
+msgctxt "field:calendar.event.rrule,wkst:"
+msgid "Week Day"
+msgstr "День недели"
+
 msgctxt "field:calendar.event.rrule,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Дата изменения"
 
 msgctxt "field:calendar.event.rrule,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Изменено пользователем"
 
 msgctxt "field:calendar.location,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Дата создания"
 
 msgctxt "field:calendar.location,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Создано пользователем"
 
 msgctxt "field:calendar.location,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:calendar.location,name:"
 msgid "Name"
@@ -680,95 +756,11 @@ msgstr "Наименование"
 
 msgctxt "field:calendar.location,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Дата изменения"
 
 msgctxt "field:calendar.location,write_uid:"
 msgid "Write User"
-msgstr ""
-
-msgctxt "field:calendar.rrule,byday:"
-msgid "By Day"
-msgstr "По дням"
-
-msgctxt "field:calendar.rrule,byhour:"
-msgid "By Hour"
-msgstr "По часам"
-
-msgctxt "field:calendar.rrule,byminute:"
-msgid "By Minute"
-msgstr "По минутам"
-
-msgctxt "field:calendar.rrule,bymonth:"
-msgid "By Month"
-msgstr "По месячно"
-
-msgctxt "field:calendar.rrule,bymonthday:"
-msgid "By Month Day"
-msgstr "По дням месяца"
-
-msgctxt "field:calendar.rrule,bysecond:"
-msgid "By Second"
-msgstr "По секундам"
-
-msgctxt "field:calendar.rrule,bysetpos:"
-msgid "By Position"
-msgstr "По позиции"
-
-msgctxt "field:calendar.rrule,byweekno:"
-msgid "By Week Number"
-msgstr "По номерам недель"
-
-msgctxt "field:calendar.rrule,byyearday:"
-msgid "By Year Day"
-msgstr "По дням года"
-
-msgctxt "field:calendar.rrule,count:"
-msgid "Count"
-msgstr "Количество"
-
-msgctxt "field:calendar.rrule,create_date:"
-msgid "Create Date"
-msgstr ""
-
-msgctxt "field:calendar.rrule,create_uid:"
-msgid "Create User"
-msgstr ""
-
-msgctxt "field:calendar.rrule,freq:"
-msgid "Frequency"
-msgstr "Частота"
-
-msgctxt "field:calendar.rrule,id:"
-msgid "ID"
-msgstr ""
-
-msgctxt "field:calendar.rrule,interval:"
-msgid "Interval"
-msgstr "Внутренний"
-
-msgctxt "field:calendar.rrule,rec_name:"
-msgid "Name"
-msgstr "Наименование"
-
-msgctxt "field:calendar.rrule,until:"
-msgid "Until Date"
-msgstr "До даты"
-
-msgctxt "field:calendar.rrule,until_date:"
-msgid "Is Date"
-msgstr "Весь день"
-
-msgctxt "field:calendar.rrule,wkst:"
-msgid "Week Day"
-msgstr "День недели"
-
-msgctxt "field:calendar.rrule,write_date:"
-msgid "Write Date"
-msgstr ""
-
-msgctxt "field:calendar.rrule,write_uid:"
-msgid "Write User"
-msgstr ""
+msgstr "Изменено пользователем"
 
 msgctxt "field:res.user,calendars:"
 msgid "Calendars"
@@ -776,27 +768,35 @@ msgstr "Календари"
 
 msgctxt "help:calendar.calendar,owner:"
 msgid "The user must have an email"
-msgstr ""
-
-msgctxt "help:calendar.date,date:"
-msgid "Ignore time of field \"Date\", but handle as date only."
-msgstr "Время игнорируется в поле \"Дата\", действует только дата"
+msgstr "У пользователя должна быть эл.почта."
 
 msgctxt "help:calendar.event,uuid:"
 msgid "Universally Unique Identifier"
-msgstr "Универсальный уникальный идентификатор"
+msgstr "Универсальный уникальный идентификатор (UUID)"
+
+msgctxt "help:calendar.event.exdate,date:"
+msgid "Ignore time of field \"Date\", but handle as date only."
+msgstr ""
+"Если включено, то значение времени в поле \"Дата\" будет проигнорировано, "
+"будет использована только дата."
 
-msgctxt "help:calendar.rrule,until_date:"
+msgctxt "help:calendar.event.exrule,until_date:"
 msgid "Ignore time of field \"Until Date\", but handle as date only."
-msgstr "Время игнорируется в поле \"До даты\", действует только дата"
+msgstr ""
+"Если включено, то значение времени в поле \"До даты\" будет проигнорировано,"
+" будет использована только дата."
 
-msgctxt "model:calendar.alarm,name:"
-msgid "Alarm"
-msgstr "Вызов"
+msgctxt "help:calendar.event.rdate,date:"
+msgid "Ignore time of field \"Date\", but handle as date only."
+msgstr ""
+"Если включено, то значение времени в поле \"Дата\" будет проигнорировано, "
+"будет использована только дата."
 
-msgctxt "model:calendar.attendee,name:"
-msgid "Attendee"
-msgstr "Участник"
+msgctxt "help:calendar.event.rrule,until_date:"
+msgid "Ignore time of field \"Until Date\", but handle as date only."
+msgstr ""
+"Если включено, то значение времени в поле \"До даты\" будет проигнорировано,"
+" будет использована только дата."
 
 msgctxt "model:calendar.calendar,name:"
 msgid "Calendar"
@@ -812,11 +812,7 @@ msgstr "Пользователи могут писать"
 
 msgctxt "model:calendar.category,name:"
 msgid "Category"
-msgstr "Категории"
-
-msgctxt "model:calendar.date,name:"
-msgid "Calendar Date"
-msgstr "День календаря"
+msgstr "Категория"
 
 msgctxt "model:calendar.event,name:"
 msgid "Event"
@@ -854,25 +850,18 @@ msgctxt "model:calendar.location,name:"
 msgid "Location"
 msgstr "Местоположение"
 
-msgctxt "model:calendar.rrule,name:"
-msgid "Recurrence Rule"
-msgstr "Правила повторения"
-
 msgctxt "model:ir.action,name:act_calendar_form"
 msgid "Calendars"
 msgstr "Календари"
 
-#, fuzzy
 msgctxt "model:ir.action,name:act_event_form"
 msgid "Events"
 msgstr "События"
 
-#, fuzzy
 msgctxt "model:ir.action,name:act_event_form3"
 msgid "Events"
 msgstr "События"
 
-#, fuzzy
 msgctxt "model:ir.ui.menu,name:menu_calendar"
 msgid "Calendar"
 msgstr "Календари"
@@ -889,30 +878,6 @@ msgctxt "model:res.group,name:group_calendar_admin"
 msgid "Calendar Administration"
 msgstr "Управление календарем"
 
-msgctxt "selection:calendar.attendee,status:"
-msgid ""
-msgstr ""
-
-msgctxt "selection:calendar.attendee,status:"
-msgid "Accepted"
-msgstr "Подтверждено"
-
-msgctxt "selection:calendar.attendee,status:"
-msgid "Declined"
-msgstr "Отклонено"
-
-msgctxt "selection:calendar.attendee,status:"
-msgid "Delegated"
-msgstr "Делегировано"
-
-msgctxt "selection:calendar.attendee,status:"
-msgid "Needs Action"
-msgstr "Требуется действие"
-
-msgctxt "selection:calendar.attendee,status:"
-msgid "Tentative"
-msgstr "Предварительный"
-
 msgctxt "selection:calendar.event,classification:"
 msgid "Confidential"
 msgstr "Конфиденциальное"
@@ -943,69 +908,153 @@ msgstr "Предварительный"
 
 msgctxt "selection:calendar.event,transp:"
 msgid "Opaque"
-msgstr "Непрозрачный"
+msgstr "Доступен"
 
 msgctxt "selection:calendar.event,transp:"
 msgid "Transparent"
-msgstr "Прозрачный"
+msgstr "Не доступен"
 
-msgctxt "selection:calendar.rrule,freq:"
+msgctxt "selection:calendar.event.attendee,status:"
+msgid ""
+msgstr ""
+
+msgctxt "selection:calendar.event.attendee,status:"
+msgid "Accepted"
+msgstr "Принято"
+
+msgctxt "selection:calendar.event.attendee,status:"
+msgid "Declined"
+msgstr "Отклонено"
+
+msgctxt "selection:calendar.event.attendee,status:"
+msgid "Delegated"
+msgstr "Поручено"
+
+msgctxt "selection:calendar.event.attendee,status:"
+msgid "Needs Action"
+msgstr "Требует вмешательства"
+
+msgctxt "selection:calendar.event.attendee,status:"
+msgid "Tentative"
+msgstr "Предварительный"
+
+msgctxt "selection:calendar.event.exrule,freq:"
+msgid "Daily"
+msgstr "Ежедневно"
+
+msgctxt "selection:calendar.event.exrule,freq:"
+msgid "Hourly"
+msgstr "Ежечасно"
+
+msgctxt "selection:calendar.event.exrule,freq:"
+msgid "Minutely"
+msgstr "Ежеминутно"
+
+msgctxt "selection:calendar.event.exrule,freq:"
+msgid "Monthly"
+msgstr "Ежемесячно"
+
+msgctxt "selection:calendar.event.exrule,freq:"
+msgid "Secondly"
+msgstr "Ежесекундно"
+
+msgctxt "selection:calendar.event.exrule,freq:"
+msgid "Weekly"
+msgstr "Еженедельно"
+
+msgctxt "selection:calendar.event.exrule,freq:"
+msgid "Yearly"
+msgstr "Ежегодно"
+
+msgctxt "selection:calendar.event.exrule,wkst:"
+msgid "Friday"
+msgstr "Пятница"
+
+msgctxt "selection:calendar.event.exrule,wkst:"
+msgid "Monday"
+msgstr "Понедельник"
+
+msgctxt "selection:calendar.event.exrule,wkst:"
+msgid "Saturday"
+msgstr "Суббота"
+
+msgctxt "selection:calendar.event.exrule,wkst:"
+msgid "Sunday"
+msgstr "Воскресенье"
+
+msgctxt "selection:calendar.event.exrule,wkst:"
+msgid "Thursday"
+msgstr "Четверг"
+
+msgctxt "selection:calendar.event.exrule,wkst:"
+msgid "Tuesday"
+msgstr "Вторник"
+
+msgctxt "selection:calendar.event.exrule,wkst:"
+msgid "Wednesday"
+msgstr "Среда"
+
+msgctxt "selection:calendar.event.rrule,freq:"
 msgid "Daily"
-msgstr "Ежедневный"
+msgstr "Ежедневно"
 
-msgctxt "selection:calendar.rrule,freq:"
+msgctxt "selection:calendar.event.rrule,freq:"
 msgid "Hourly"
-msgstr "Ежечасный"
+msgstr "Ежечасно"
 
-msgctxt "selection:calendar.rrule,freq:"
+msgctxt "selection:calendar.event.rrule,freq:"
 msgid "Minutely"
 msgstr "Ежеминутно"
 
-msgctxt "selection:calendar.rrule,freq:"
+msgctxt "selection:calendar.event.rrule,freq:"
 msgid "Monthly"
 msgstr "Ежемесячно"
 
-msgctxt "selection:calendar.rrule,freq:"
+msgctxt "selection:calendar.event.rrule,freq:"
 msgid "Secondly"
-msgstr "Ежесекудно"
+msgstr "Ежесекундно"
 
-msgctxt "selection:calendar.rrule,freq:"
+msgctxt "selection:calendar.event.rrule,freq:"
 msgid "Weekly"
 msgstr "Еженедельно"
 
-msgctxt "selection:calendar.rrule,freq:"
+msgctxt "selection:calendar.event.rrule,freq:"
 msgid "Yearly"
 msgstr "Ежегодно"
 
-msgctxt "selection:calendar.rrule,wkst:"
+msgctxt "selection:calendar.event.rrule,wkst:"
 msgid "Friday"
 msgstr "Пятница"
 
-msgctxt "selection:calendar.rrule,wkst:"
+msgctxt "selection:calendar.event.rrule,wkst:"
 msgid "Monday"
 msgstr "Понедельник"
 
-msgctxt "selection:calendar.rrule,wkst:"
+msgctxt "selection:calendar.event.rrule,wkst:"
 msgid "Saturday"
 msgstr "Суббота"
 
-msgctxt "selection:calendar.rrule,wkst:"
+msgctxt "selection:calendar.event.rrule,wkst:"
 msgid "Sunday"
 msgstr "Воскресенье"
 
-msgctxt "selection:calendar.rrule,wkst:"
+msgctxt "selection:calendar.event.rrule,wkst:"
 msgid "Thursday"
 msgstr "Четверг"
 
-msgctxt "selection:calendar.rrule,wkst:"
+msgctxt "selection:calendar.event.rrule,wkst:"
 msgid "Tuesday"
 msgstr "Вторник"
 
-msgctxt "selection:calendar.rrule,wkst:"
+msgctxt "selection:calendar.event.rrule,wkst:"
 msgid "Wednesday"
 msgstr "Среда"
 
 msgctxt "view:calendar.calendar:"
+msgid "Access Permissions"
+msgstr "Права доступа"
+
+msgctxt "view:calendar.calendar:"
 msgid "Calendar"
 msgstr "Календарь"
 
@@ -1017,17 +1066,13 @@ msgctxt "view:calendar.calendar:"
 msgid "General"
 msgstr "Основной"
 
-msgctxt "view:calendar.calendar:"
-msgid "Security"
-msgstr "Доступ"
-
 msgctxt "view:calendar.category:"
 msgid "Categories"
 msgstr "Категория"
 
 msgctxt "view:calendar.category:"
 msgid "Category"
-msgstr "Категории"
+msgstr "Категория"
 
 msgctxt "view:calendar.event.attendee:"
 msgid "Attendee"
diff --git a/setup.py b/setup.py
index d0e0e98..91a746f 100644
--- a/setup.py
+++ b/setup.py
@@ -25,10 +25,10 @@ requires = ['vobject >= 0.8.0', 'PyWebDAV >= 0.9.8', 'python-dateutil', 'pytz']
 for dep in info.get('depends', []):
     if not re.match(r'(ir|res|webdav)(\W|$)', dep):
         requires.append('trytond_%s >= %s.%s, < %s.%s' %
-                (dep, major_version, minor_version, major_version,
-                    minor_version + 1))
+            (dep, major_version, minor_version, major_version,
+                minor_version + 1))
 requires.append('trytond >= %s.%s, < %s.%s' %
-        (major_version, minor_version, major_version, minor_version + 1))
+    (major_version, minor_version, major_version, minor_version + 1))
 
 setup(name='trytond_calendar',
     version=info.get('version', '0.0.1'),
@@ -36,16 +36,16 @@ setup(name='trytond_calendar',
     long_description=read('README'),
     author='Tryton',
     url='http://www.tryton.org/',
-    download_url="http://downloads.tryton.org/" + \
-        info.get('version', '0.0.1').rsplit('.', 1)[0] + '/',
+    download_url=("http://downloads.tryton.org/" +
+        info.get('version', '0.0.1').rsplit('.', 1)[0] + '/'),
     package_dir={'trytond.modules.calendar': '.'},
     packages=[
         'trytond.modules.calendar',
         'trytond.modules.calendar.tests',
         ],
     package_data={
-        'trytond.modules.calendar': info.get('xml', []) \
-            + ['tryton.cfg', 'locale/*.po'],
+        'trytond.modules.calendar': (info.get('xml', [])
+            + ['tryton.cfg', 'view/*.xml', 'locale/*.po']),
         },
     classifiers=[
         'Development Status :: 5 - Production/Stable',
@@ -57,6 +57,7 @@ setup(name='trytond_calendar',
         'Intended Audience :: Manufacturing',
         'License :: OSI Approved :: GNU General Public License (GPL)',
         'Natural Language :: Bulgarian',
+        'Natural Language :: Catalan',
         'Natural Language :: Czech',
         'Natural Language :: Dutch',
         'Natural Language :: English',
diff --git a/tryton.cfg b/tryton.cfg
index 76539b5..c27871a 100644
--- a/tryton.cfg
+++ b/tryton.cfg
@@ -1,5 +1,5 @@
 [tryton]
-version=2.6.1
+version=2.8.0
 depends:
     ir
     res
diff --git a/trytond_calendar.egg-info/PKG-INFO b/trytond_calendar.egg-info/PKG-INFO
index 664e32b..741485f 100644
--- a/trytond_calendar.egg-info/PKG-INFO
+++ b/trytond_calendar.egg-info/PKG-INFO
@@ -1,12 +1,12 @@
 Metadata-Version: 1.1
 Name: trytond-calendar
-Version: 2.6.1
+Version: 2.8.0
 Summary: Tryton module for CalDAV
 Home-page: http://www.tryton.org/
 Author: Tryton
 Author-email: UNKNOWN
 License: GPL-3
-Download-URL: http://downloads.tryton.org/2.6/
+Download-URL: http://downloads.tryton.org/2.8/
 Description: trytond_calendar
         ================
         
@@ -54,6 +54,7 @@ Classifier: Intended Audience :: Legal Industry
 Classifier: Intended Audience :: Manufacturing
 Classifier: License :: OSI Approved :: GNU General Public License (GPL)
 Classifier: Natural Language :: Bulgarian
+Classifier: Natural Language :: Catalan
 Classifier: Natural Language :: Czech
 Classifier: Natural Language :: Dutch
 Classifier: Natural Language :: English
diff --git a/trytond_calendar.egg-info/SOURCES.txt b/trytond_calendar.egg-info/SOURCES.txt
index 773ccae..a44e6d3 100644
--- a/trytond_calendar.egg-info/SOURCES.txt
+++ b/trytond_calendar.egg-info/SOURCES.txt
@@ -31,4 +31,23 @@ trytond_calendar.egg-info/dependency_links.txt
 trytond_calendar.egg-info/entry_points.txt
 trytond_calendar.egg-info/not-zip-safe
 trytond_calendar.egg-info/requires.txt
-trytond_calendar.egg-info/top_level.txt
\ No newline at end of file
+trytond_calendar.egg-info/top_level.txt
+view/attendee_form.xml
+view/attendee_tree.xml
+view/calendar_form.xml
+view/calendar_tree.xml
+view/category_form.xml
+view/category_tree.xml
+view/event_form.xml
+view/event_tree.xml
+view/event_tree_occurence.xml
+view/exdate_form.xml
+view/exdate_tree.xml
+view/exrule_form.xml
+view/exrule_tree.xml
+view/location_form.xml
+view/location_tree.xml
+view/rdate_form.xml
+view/rdate_tree.xml
+view/rrule_form.xml
+view/rrule_tree.xml
\ No newline at end of file
diff --git a/trytond_calendar.egg-info/requires.txt b/trytond_calendar.egg-info/requires.txt
index 050605d..823ce06 100644
--- a/trytond_calendar.egg-info/requires.txt
+++ b/trytond_calendar.egg-info/requires.txt
@@ -2,7 +2,7 @@ vobject >= 0.8.0
 PyWebDAV >= 0.9.8
 python-dateutil
 pytz
-trytond >= 2.6, < 2.7
+trytond >= 2.8, < 2.9
 
 [test]
 caldav
\ No newline at end of file
diff --git a/view/attendee_form.xml b/view/attendee_form.xml
new file mode 100644
index 0000000..de1f8f4
--- /dev/null
+++ b/view/attendee_form.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0"?>
+<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of
+this repository contains the full copyright notices and license terms. -->
+<form string="Attendee">
+    <label name="event"/>
+    <field name="event" colspan="3"/>
+    <label name="email"/>
+    <field name="email"/>
+    <label name="status"/>
+    <field name="status"/>
+</form>
diff --git a/view/attendee_tree.xml b/view/attendee_tree.xml
new file mode 100644
index 0000000..326faf1
--- /dev/null
+++ b/view/attendee_tree.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0"?>
+<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of
+this repository contains the full copyright notices and license terms. -->
+<tree string="Attendees">
+    <field name="event"/>
+    <field name="email"/>
+    <field name="status"/>
+</tree>
diff --git a/view/calendar_form.xml b/view/calendar_form.xml
new file mode 100644
index 0000000..fd4ad51
--- /dev/null
+++ b/view/calendar_form.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0"?>
+<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of
+this repository contains the full copyright notices and license terms. -->
+<form string="Calendar">
+    <label name="name"/>
+    <field name="name"/>
+    <label name="owner"/>
+    <field name="owner"/>
+    <notebook colspan="4">
+        <page string="General" id="general">
+            <separator name="description" colspan="4"/>
+            <field name="description" colspan="4"/>
+        </page>
+        <page string="Access Permissions" id="permissions">
+            <field name="read_users" colspan="4"/>
+            <field name="write_users" colspan="4"/>
+        </page>
+    </notebook>
+</form>
diff --git a/view/calendar_tree.xml b/view/calendar_tree.xml
new file mode 100644
index 0000000..bb0ca72
--- /dev/null
+++ b/view/calendar_tree.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0"?>
+<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of
+this repository contains the full copyright notices and license terms. -->
+<tree string="Calendars">
+    <field name="name"/>
+    <field name="owner"/>
+</tree>
diff --git a/view/category_form.xml b/view/category_form.xml
new file mode 100644
index 0000000..66d69b2
--- /dev/null
+++ b/view/category_form.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0"?>
+<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of
+this repository contains the full copyright notices and license terms. -->
+<form string="Category">
+    <label name="name"/>
+    <field name="name"/>
+</form>
diff --git a/view/category_tree.xml b/view/category_tree.xml
new file mode 100644
index 0000000..e35b2fa
--- /dev/null
+++ b/view/category_tree.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0"?>
+<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of
+this repository contains the full copyright notices and license terms. -->
+<tree string="Categories">
+    <field name="name"/>
+</tree>
diff --git a/view/event_form.xml b/view/event_form.xml
new file mode 100644
index 0000000..5eced8a
--- /dev/null
+++ b/view/event_form.xml
@@ -0,0 +1,49 @@
+<?xml version="1.0"?>
+<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of
+this repository contains the full copyright notices and license terms. -->
+<form string="Event">
+    <label name="summary"/>
+    <field name="summary"/>
+    <label name="recurrence"/>
+    <field name="recurrence"/>
+    <notebook colspan="4">
+        <page string="General" id="general">
+            <label name="location"/>
+            <field name="location"/>
+            <label name="status"/>
+            <field name="status"/>
+            <label name="classification"/>
+            <field name="classification"/>
+            <label name="calendar"/>
+            <field name="calendar"/>
+            <label name="all_day"/>
+            <field name="all_day"/>
+            <label name="transp"/>
+            <field name="transp"/>
+            <label name="dtstart"/>
+            <field name="dtstart"/>
+            <label name="dtend"/>
+            <field name="dtend"/>
+            <separator name="description" colspan="4"/>
+            <field name="description" colspan="4"/>
+        </page>
+        <page string="Categories" id="categories">
+            <field name="categories" colspan="4"/>
+        </page>
+        <page string="Attendees" id="attendees">
+            <label name="organizer"/>
+            <field name="organizer"/>
+            <field name="attendees" colspan="4"/>
+        </page>
+        <page string="Occurences" id="occurences"
+            states="{'invisible': Bool(Eval('_parent_parent'))}">
+            <field name="rrules" colspan="2"/>
+            <field name="rdates" colspan="2"/>
+            <field name="exrules" colspan="2"/>
+            <field name="exdates" colspan="2"/>
+            <field name="occurences" colspan="4"
+                view_ids="calendar.event_view_tree_occurence"/>
+        </page>
+    </notebook>
+    <field name="parent" colspan="4" invisible="1"/>
+</form>
diff --git a/view/event_tree.xml b/view/event_tree.xml
new file mode 100644
index 0000000..aba889b
--- /dev/null
+++ b/view/event_tree.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0"?>
+<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of
+this repository contains the full copyright notices and license terms. -->
+<tree string="Events">
+    <field name="calendar"/>
+    <field name="summary"/>
+    <field name="all_day"/>
+    <field name="dtstart"/>
+    <field name="dtend"/>
+    <field name="status"/>
+</tree>
diff --git a/view/event_tree_occurence.xml b/view/event_tree_occurence.xml
new file mode 100644
index 0000000..94d560f
--- /dev/null
+++ b/view/event_tree_occurence.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0"?>
+<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of
+this repository contains the full copyright notices and license terms. -->
+<tree string="Events">
+    <field name="summary"/>
+    <field name="recurrence"/>
+    <field name="all_day"/>
+    <field name="dtstart"/>
+    <field name="dtend"/>
+    <field name="status"/>
+</tree>
diff --git a/view/exdate_form.xml b/view/exdate_form.xml
new file mode 100644
index 0000000..9177295
--- /dev/null
+++ b/view/exdate_form.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0"?>
+<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of
+this repository contains the full copyright notices and license terms. -->
+<form string="Exception Date">
+    <label name="event"/>
+    <field name="event" colspan="3"/>
+    <label name="datetime"/>
+    <field name="datetime"/>
+    <label name="date"/>
+    <field name="date"/>
+</form>
diff --git a/view/exdate_tree.xml b/view/exdate_tree.xml
new file mode 100644
index 0000000..6b353ff
--- /dev/null
+++ b/view/exdate_tree.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0"?>
+<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of
+this repository contains the full copyright notices and license terms. -->
+<tree string="Exception Dates">
+    <field name="event"/>
+    <field name="datetime"/>
+    <field name="date"/>
+</tree>
diff --git a/view/exrule_form.xml b/view/exrule_form.xml
new file mode 100644
index 0000000..4ae4dcc
--- /dev/null
+++ b/view/exrule_form.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0"?>
+<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of
+this repository contains the full copyright notices and license terms. -->
+<form string="Exception Rule">
+    <label name="event"/>
+    <field name="event" colspan="3"/>
+    <label name="freq"/>
+    <field name="freq" colspan="3"/>
+    <label name="until"/>
+    <field name="until"/>
+    <label name="until_date"/>
+    <field name="until_date"/>
+    <label name="count"/>
+    <field name="count" colspan="3"/>
+    <label name="interval"/>
+    <field name="interval" colspan="3"/>
+    <label name="bysecond"/>
+    <field name="bysecond" colspan="3"/>
+    <label name="byminute"/>
+    <field name="byminute" colspan="3"/>
+    <label name="byhour"/>
+    <field name="byhour" colspan="3"/>
+    <label name="byday"/>
+    <field name="byday" colspan="3"/>
+    <label name="bymonthday"/>
+    <field name="bymonthday" colspan="3"/>
+    <label name="byyearday"/>
+    <field name="byyearday" colspan="3"/>
+    <label name="byweekno"/>
+    <field name="byweekno" colspan="3"/>
+    <label name="bymonth"/>
+    <field name="bymonth" colspan="3"/>
+    <label name="bysetpos"/>
+    <field name="bysetpos" colspan="3"/>
+    <label name="wkst"/>
+    <field name="wkst" colspan="3"/>
+</form>
diff --git a/view/exrule_tree.xml b/view/exrule_tree.xml
new file mode 100644
index 0000000..8828610
--- /dev/null
+++ b/view/exrule_tree.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0"?>
+<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of
+this repository contains the full copyright notices and license terms. -->
+<tree string="Exception Rules">
+    <field name="event"/>
+    <field name="freq"/>
+</tree>
diff --git a/view/location_form.xml b/view/location_form.xml
new file mode 100644
index 0000000..84cd824
--- /dev/null
+++ b/view/location_form.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0"?>
+<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of
+this repository contains the full copyright notices and license terms. -->
+<form string="Location">
+    <label name="name"/>
+    <field name="name"/>
+</form>
diff --git a/view/location_tree.xml b/view/location_tree.xml
new file mode 100644
index 0000000..afdf674
--- /dev/null
+++ b/view/location_tree.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0"?>
+<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of
+this repository contains the full copyright notices and license terms. -->
+<tree string="Locations">
+    <field name="name"/>
+</tree>
diff --git a/view/rdate_form.xml b/view/rdate_form.xml
new file mode 100644
index 0000000..f908bd4
--- /dev/null
+++ b/view/rdate_form.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0"?>
+<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of
+this repository contains the full copyright notices and license terms. -->
+<form string="Recurrence Date">
+    <label name="event"/>
+    <field name="event" colspan="3"/>
+    <label name="datetime"/>
+    <field name="datetime"/>
+    <label name="date"/>
+    <field name="date"/>
+</form>
diff --git a/view/rdate_tree.xml b/view/rdate_tree.xml
new file mode 100644
index 0000000..adfd8ab
--- /dev/null
+++ b/view/rdate_tree.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0"?>
+<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of
+this repository contains the full copyright notices and license terms. -->
+<tree string="Recurrence Dates">
+    <field name="event"/>
+    <field name="datetime"/>
+    <field name="date"/>
+</tree>
diff --git a/view/rrule_form.xml b/view/rrule_form.xml
new file mode 100644
index 0000000..52405fc
--- /dev/null
+++ b/view/rrule_form.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0"?>
+<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of
+this repository contains the full copyright notices and license terms. -->
+<form string="Recurrence Rule">
+    <label name="event"/>
+    <field name="event" colspan="3"/>
+    <label name="freq"/>
+    <field name="freq" colspan="3"/>
+    <label name="until"/>
+    <field name="until"/>
+    <label name="until_date"/>
+    <field name="until_date"/>
+    <label name="count"/>
+    <field name="count" colspan="3"/>
+    <label name="interval"/>
+    <field name="interval" colspan="3"/>
+    <label name="bysecond"/>
+    <field name="bysecond" colspan="3"/>
+    <label name="byminute"/>
+    <field name="byminute" colspan="3"/>
+    <label name="byhour"/>
+    <field name="byhour" colspan="3"/>
+    <label name="byday"/>
+    <field name="byday" colspan="3"/>
+    <label name="bymonthday"/>
+    <field name="bymonthday" colspan="3"/>
+    <label name="byyearday"/>
+    <field name="byyearday" colspan="3"/>
+    <label name="byweekno"/>
+    <field name="byweekno" colspan="3"/>
+    <label name="bymonth"/>
+    <field name="bymonth" colspan="3"/>
+    <label name="bysetpos"/>
+    <field name="bysetpos" colspan="3"/>
+    <label name="wkst"/>
+    <field name="wkst" colspan="3"/>
+</form>
diff --git a/view/rrule_tree.xml b/view/rrule_tree.xml
new file mode 100644
index 0000000..85fb7e1
--- /dev/null
+++ b/view/rrule_tree.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0"?>
+<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of
+this repository contains the full copyright notices and license terms. -->
+<tree string="Recurrence Rules">
+    <field name="event"/>
+    <field name="freq"/>
+</tree>
diff --git a/webdav.py b/webdav.py
index 2209151..ea6f3e7 100644
--- a/webdav.py
+++ b/webdav.py
@@ -197,11 +197,11 @@ class Collection:
                 cache['_calendar'].setdefault(Calendar.__name__, {})
                 for calendar in calendars:
                     cache['_calendar'][Calendar.__name__][calendar.id] = {}
-            return [x.name for x in calendars] + \
-                    [x.name + '.ics' for x in calendars]
+            return ([x.name for x in calendars]
+                + [x.name + '.ics' for x in calendars])
         if uri and uri.startswith('Calendars/'):
             calendar_id = cls.calendar(uri)
-            if  calendar_id and not (uri[10:].split('/', 1) + [None])[1]:
+            if calendar_id and not (uri[10:].split('/', 1) + [None])[1]:
                 domain = cls._caldav_filter_domain_event(filter)
                 events = Event.search([
                         ('calendar', '=', calendar_id),
@@ -285,16 +285,16 @@ class Collection:
                 for i in range(0, len(ids), cursor.IN_MAX):
                     sub_ids = ids[i:i + cursor.IN_MAX]
                     red_sql, red_ids = reduce_ids('id', sub_ids)
-                    cursor.execute('SELECT id, ' \
-                                'EXTRACT(epoch FROM create_date) ' \
-                            'FROM "' + Calendar._table + '" ' \
-                            'WHERE ' + red_sql, red_ids)
+                    cursor.execute('SELECT id, '
+                            'EXTRACT(epoch FROM create_date) '
+                        'FROM "' + Calendar._table + '" '
+                        'WHERE ' + red_sql, red_ids)
                     for calendar_id2, date in cursor.fetchall():
                         if calendar_id2 == calendar_id:
                             res = date
                         if cache is not None:
                             cache['_calendar'][Calendar.__name__]\
-                                    .setdefault(calendar_id2, {})
+                                .setdefault(calendar_id2, {})
                             cache['_calendar'][Calendar.__name__][
                                 calendar_id2]['creationdate'] = date
                 if res is not None:
@@ -319,16 +319,16 @@ class Collection:
                     for i in range(0, len(ids), cursor.IN_MAX):
                         sub_ids = ids[i:i + cursor.IN_MAX]
                         red_sql, red_ids = reduce_ids('id', sub_ids)
-                        cursor.execute('SELECT id, ' \
-                                'EXTRACT(epoch FROM create_date) ' \
-                            'FROM "' + Event._table + '" ' \
+                        cursor.execute('SELECT id, '
+                                'EXTRACT(epoch FROM create_date) '
+                            'FROM "' + Event._table + '" '
                             'WHERE ' + red_sql, red_ids)
                         for event_id2, date in cursor.fetchall():
                             if event_id2 == event_id:
                                 res = date
                             if cache is not None:
                                 cache['_calendar'][Event.__name__]\
-                                        .setdefault(event_id2, {})
+                                    .setdefault(event_id2, {})
                                 cache['_calendar'][Event.__name__][
                                     event_id2]['creationdate'] = date
                     if res is not None:
@@ -361,17 +361,17 @@ class Collection:
                 for i in range(0, len(ids), cursor.IN_MAX):
                     sub_ids = ids[i:i + cursor.IN_MAX]
                     red_sql, red_ids = reduce_ids('id', sub_ids)
-                    cursor.execute('SELECT id, ' \
-                                'EXTRACT(epoch FROM ' \
-                                'COALESCE(write_date, create_date)) ' \
-                            'FROM "' + Calendar._table + '" ' \
-                                'WHERE ' + red_sql, red_ids)
+                    cursor.execute('SELECT id, '
+                            'EXTRACT(epoch FROM '
+                                'COALESCE(write_date, create_date)) '
+                        'FROM "' + Calendar._table + '" '
+                        'WHERE ' + red_sql, red_ids)
                     for calendar_id2, date in cursor.fetchall():
                         if calendar_id2 == calendar_id:
                             res = date
                         if cache is not None:
                             cache['_calendar'][Calendar.__name__]\
-                                    .setdefault(calendar_id2, {})
+                                .setdefault(calendar_id2, {})
                             cache['_calendar'][Calendar.__name__][
                                 calendar_id2]['lastmodified'] = date
                 if res is not None:
@@ -397,20 +397,20 @@ class Collection:
                         red_id_sql, red_id_ids = reduce_ids('id', sub_ids)
                         red_parent_sql, red_parent_ids = reduce_ids('parent',
                                 sub_ids)
-                        cursor.execute('SELECT COALESCE(parent, id), ' \
-                                    'MAX(EXTRACT(epoch FROM ' \
-                                    'COALESCE(write_date, create_date))) ' \
-                                'FROM "' + Event._table + '" ' \
-                                'WHERE ' + red_id_sql + ' ' \
-                                    'OR ' + red_parent_sql + ' ' \
-                                'GROUP BY parent, id',
-                                red_id_ids + red_parent_ids)
+                        cursor.execute('SELECT COALESCE(parent, id), '
+                                'MAX(EXTRACT(epoch FROM '
+                                'COALESCE(write_date, create_date))) '
+                            'FROM "' + Event._table + '" '
+                            'WHERE ' + red_id_sql + ' '
+                                'OR ' + red_parent_sql + ' '
+                            'GROUP BY parent, id',
+                            red_id_ids + red_parent_ids)
                         for event_id2, date in cursor.fetchall():
                             if event_id2 == event_id:
                                 res = date
                             if cache is not None:
                                 cache['_calendar'][Event.__name__]\
-                                        .setdefault(event_id2, {})
+                                    .setdefault(event_id2, {})
                                 cache['_calendar'][Event.__name__][
                                     event_id2]['lastmodified'] = date
                     if res is not None:
@@ -433,17 +433,17 @@ class Collection:
             for i in range(0, len(ids), cursor.IN_MAX):
                 sub_ids = ids[i:i + cursor.IN_MAX]
                 red_sql, red_ids = reduce_ids('calendar', sub_ids)
-                cursor.execute('SELECT calendar, MAX(EXTRACT(epoch FROM ' \
-                            'COALESCE(write_date, create_date))) ' \
-                        'FROM "' + Event._table + '" ' \
-                        'WHERE ' + red_sql + ' ' \
-                        'GROUP BY calendar', red_ids)
+                cursor.execute('SELECT calendar, MAX(EXTRACT(epoch FROM '
+                        'COALESCE(write_date, create_date))) '
+                    'FROM "' + Event._table + '" '
+                    'WHERE ' + red_sql + ' '
+                    'GROUP BY calendar', red_ids)
                 for calendar_id2, date in cursor.fetchall():
                     if calendar_id2 == calendar_ics_id:
                         res = date
                     if cache is not None:
                         cache['_calendar'][Calendar.__name__]\
-                                .setdefault(calendar_id2, {})
+                            .setdefault(calendar_id2, {})
                         cache['_calendar'][Calendar.__name__][
                             calendar_id2]['lastmodified ics'] = date
             if res is not None:
@@ -498,7 +498,7 @@ class Collection:
                         res = calendar.description
                     if cache is not None:
                         cache['_calendar'][Calendar.__name__]\
-                                .setdefault(calendar.id, {})
+                            .setdefault(calendar.id, {})
                         cache['_calendar'][Calendar.__name__][
                             calendar.id]['calendar_description'] = \
                                 calendar.description
@@ -554,7 +554,7 @@ class Collection:
             if not event_id:
                 ical = vobject.readOne(data)
                 values = Event.ical2values(None, ical, calendar_id)
-                event = Event.create(values)
+                event, = Event.create([values])
                 calendar = Calendar(calendar_id)
                 return (Transaction().cursor.database_name + '/Calendars/' +
                         calendar.name + '/' + event.uuid + '.ics')
commit 057422a0e028cb8fc3987460b684586d04012f79
Author: Mathias Behrle <mathiasb at m9s.biz>
Date:   Fri Feb 15 20:50:36 2013 +0100

    Adding upstream version 2.6.1.

diff --git a/CHANGELOG b/CHANGELOG
index 31faf34..ce8b818 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,3 +1,6 @@
+Version 2.6.1 - 2012-12-23
+* Bug fixes (see mercurial logs for details)
+
 Version 2.6.0 - 2012-10-22
 * Bug fixes (see mercurial logs for details)
 
diff --git a/PKG-INFO b/PKG-INFO
index 3d18025..37e5095 100644
--- a/PKG-INFO
+++ b/PKG-INFO
@@ -1,6 +1,6 @@
-Metadata-Version: 1.0
+Metadata-Version: 1.1
 Name: trytond_calendar
-Version: 2.6.0
+Version: 2.6.1
 Summary: Tryton module for CalDAV
 Home-page: http://www.tryton.org/
 Author: Tryton
diff --git a/calendar_.py b/calendar_.py
index 230681a..1e63623 100644
--- a/calendar_.py
+++ b/calendar_.py
@@ -96,8 +96,7 @@ class Calendar(ModelSQL, ModelView):
             cls._get_name_cache.set(name, calendar_id)
         return calendar_id
 
-    @staticmethod
-    def calendar2ical(calendar_id):
+    def calendar2ical(self):
         '''
         Return an iCalendar object for the given calendar_id containing
         all the vevent objects
@@ -107,7 +106,7 @@ class Calendar(ModelSQL, ModelView):
         ical = vobject.iCalendar()
         ical.vevent_list = []
         events = Event.search([
-                ('calendar', '=', calendar_id),
+                ('calendar', '=', self.id),
                 ('parent', '=', None),
                 ])
         for event in events:
diff --git a/tryton.cfg b/tryton.cfg
index 3e2b6cc..76539b5 100644
--- a/tryton.cfg
+++ b/tryton.cfg
@@ -1,5 +1,5 @@
 [tryton]
-version=2.6.0
+version=2.6.1
 depends:
     ir
     res
diff --git a/trytond_calendar.egg-info/PKG-INFO b/trytond_calendar.egg-info/PKG-INFO
index f4586fa..664e32b 100644
--- a/trytond_calendar.egg-info/PKG-INFO
+++ b/trytond_calendar.egg-info/PKG-INFO
@@ -1,6 +1,6 @@
-Metadata-Version: 1.0
+Metadata-Version: 1.1
 Name: trytond-calendar
-Version: 2.6.0
+Version: 2.6.1
 Summary: Tryton module for CalDAV
 Home-page: http://www.tryton.org/
 Author: Tryton
diff --git a/webdav.py b/webdav.py
index fd55fc3..2209151 100644
--- a/webdav.py
+++ b/webdav.py
@@ -364,7 +364,7 @@ class Collection:
                     cursor.execute('SELECT id, ' \
                                 'EXTRACT(epoch FROM ' \
                                 'COALESCE(write_date, create_date)) ' \
-                            'FROM "' + Calendar.__table__ + '" ' \
+                            'FROM "' + Calendar._table + '" ' \
                                 'WHERE ' + red_sql, red_ids)
                     for calendar_id2, date in cursor.fetchall():
                         if calendar_id2 == calendar_id:
commit 0507de4e4e02b6c89f6582b5b485b8309b3ab6a1
Author: Mathias Behrle <mathiasb at m9s.biz>
Date:   Tue Oct 23 19:53:29 2012 +0200

    Adding upstream version 2.6.0.

diff --git a/CHANGELOG b/CHANGELOG
index 480068b..31faf34 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,9 +1,6 @@
-Version 2.4.2 - 2012-09-02
+Version 2.6.0 - 2012-10-22
 * Bug fixes (see mercurial logs for details)
 
-Version 2.4.1 - 2012-04-24
-* Restore es_AR translation
-
 Version 2.4.0 - 2012-04-23
 * Bug fixes (see mercurial logs for details)
 
diff --git a/MANIFEST.in b/MANIFEST.in
index 7f5d5fd..44969c7 100644
--- a/MANIFEST.in
+++ b/MANIFEST.in
@@ -4,6 +4,7 @@ include TODO
 include COPYRIGHT
 include CHANGELOG
 include LICENSE
+include tryton.cfg
 include *.xml
 include *.odt
 include locale/*.po
diff --git a/PKG-INFO b/PKG-INFO
index 0457a01..3d18025 100644
--- a/PKG-INFO
+++ b/PKG-INFO
@@ -1,13 +1,49 @@
 Metadata-Version: 1.0
 Name: trytond_calendar
-Version: 2.4.2
-Summary: Add CalDAV support
+Version: 2.6.0
+Summary: Tryton module for CalDAV
 Home-page: http://www.tryton.org/
-Author: B2CK
-Author-email: info at b2ck.com
+Author: Tryton
+Author-email: UNKNOWN
 License: GPL-3
-Download-URL: http://downloads.tryton.org/2.4/
-Description: UNKNOWN
+Download-URL: http://downloads.tryton.org/2.6/
+Description: trytond_calendar
+        ================
+        
+        The calendar module of the Tryton application platform.  See
+        __tryton__.py
+        
+        Installing
+        ----------
+        
+        See INSTALL
+        
+        Support
+        -------
+        
+        If you encounter any problems with Tryton, please don't hesitate to ask
+        questions on the Tryton bug tracker, mailing list, wiki or IRC channel:
+        
+          http://bugs.tryton.org/
+          http://groups.tryton.org/
+          http://wiki.tryton.org/
+          irc://irc.freenode.net/tryton
+        
+        License
+        -------
+        
+        See LICENSE
+        
+        Copyright
+        ---------
+        
+        See COPYRIGHT
+        
+        
+        For more information please visit the Tryton web site:
+        
+          http://www.tryton.org/
+        
 Platform: UNKNOWN
 Classifier: Development Status :: 5 - Production/Stable
 Classifier: Environment :: Plugins
diff --git a/__init__.py b/__init__.py
index 0f1995e..81a621a 100644
--- a/__init__.py
+++ b/__init__.py
@@ -1,7 +1,32 @@
 #This file is part of Tryton.  The COPYRIGHT file at the top level of
 #this repository contains the full copyright notices and license terms.
 
+from trytond.pool import Pool
 from . import caldav
 from .webdav import *
 from .calendar_ import *
 from .res import *
+
+
+def register():
+    Pool.register(
+        Collection,
+        Calendar,
+        ReadUser,
+        WriteUser,
+        Category,
+        Location,
+        Event,
+        EventCategory,
+        Alarm,
+        EventAlarm,
+        Attendee,
+        EventAttendee,
+        Date,
+        EventRDate,
+        EventExDate,
+        RRule,
+        EventRRule,
+        EventExRule,
+        User,
+        module='calendar', type_='model')
diff --git a/__tryton__.py b/__tryton__.py
deleted file mode 100644
index b532430..0000000
--- a/__tryton__.py
+++ /dev/null
@@ -1,47 +0,0 @@
-# -*- coding: utf-8 -*-
-#This file is part of Tryton.  The COPYRIGHT file at the top level of
-#this repository contains the full copyright notices and license terms.
-{
-    'name': 'Calendar',
-    'name_bg_BG': 'Календар',
-    'name_ca_ES': 'Calendari',
-    'name_de_DE': 'Kalender',
-    'name_es_AR': 'Calendario',
-    'name_es_CO': 'Calendario',
-    'name_es_ES': 'Calendario',
-    'name_fr_FR': 'Calendrier',
-    'name_ru_RU': 'Календарь',
-    'version': '2.4.2',
-    'author': 'B2CK',
-    'email': 'info at b2ck.com',
-    'website': 'http://www.tryton.org/',
-    'description': 'Add CalDAV support',
-    'description_bg_BG': 'Добавя подръжка на CalDAV',
-    'description_ca_ES': 'Afegeix suport per CalDAV.',
-    'description_de_DE': 'Fügt Unterstützung für CalDAV hinzu',
-    'description_es_AR': 'Añade soporte para CalDAV',
-    'description_es_CO': 'Añade soporte para CalDAV',
-    'description_es_ES': 'Añade soporte para CalDAV',
-    'description_fr_FR': 'Ajoute le support CalDAV',
-    'description_ru_RU': 'Добавление поддержки CalDAV',
-    'depends': [
-        'ir',
-        'res',
-        'webdav',
-    ],
-    'xml': [
-        'calendar.xml',
-    ],
-    'translation': [
-        'locale/bg_BG.po',
-        'locale/ca_ES.po',
-        'locale/cs_CZ.po',
-        'locale/de_DE.po',
-        'locale/es_AR.po',
-        'locale/es_CO.po',
-        'locale/es_ES.po',
-        'locale/fr_FR.po',
-        'locale/nl_NL.po',
-        'locale/ru_RU.po',
-    ],
-}
diff --git a/caldav.py b/caldav.py
index 2595186..ae205be 100644
--- a/caldav.py
+++ b/caldav.py
@@ -59,11 +59,11 @@ def _get_caldav_calendar_description(self, uri):
         raise DAV_NotFound
     pool = Pool(Transaction().cursor.database_name)
     try:
-        collection_obj = pool.get('webdav.collection')
+        Collection = pool.get('webdav.collection')
     except KeyError:
         raise DAV_NotFound
     try:
-        res = collection_obj.get_calendar_description(dburi, cache=CACHE)
+        res = Collection.get_calendar_description(dburi, cache=CACHE)
     except AttributeError:
         raise DAV_NotFound
     except DAV_Error, exception:
@@ -84,11 +84,11 @@ def _get_caldav_calendar_data(self, uri):
         raise DAV_NotFound
     pool = Pool(Transaction().cursor.database_name)
     try:
-        collection_obj = pool.get('webdav.collection')
+        Collection = pool.get('webdav.collection')
     except KeyError:
         raise DAV_NotFound
     try:
-        res = collection_obj.get_calendar_data(dburi, cache=CACHE)
+        res = Collection.get_calendar_data(dburi, cache=CACHE)
     except AttributeError:
         raise DAV_NotFound
     except DAV_Error, exception:
@@ -108,11 +108,11 @@ def _get_caldav_calendar_home_set(self, uri):
         raise DAV_NotFound
     pool = Pool(Transaction().cursor.database_name)
     try:
-        collection_obj = pool.get('webdav.collection')
+        Collection = pool.get('webdav.collection')
     except KeyError:
         raise DAV_NotFound
     try:
-        res = collection_obj.get_calendar_home_set(dburi, cache=CACHE)
+        res = Collection.get_calendar_home_set(dburi, cache=CACHE)
     except AttributeError:
         raise DAV_NotFound
     except DAV_Error, exception:
@@ -142,11 +142,11 @@ def _get_caldav_calendar_user_address_set(self, uri):
         raise DAV_NotFound
     pool = Pool(Transaction().cursor.database_name)
     try:
-        collection_obj = pool.get('webdav.collection')
+        Collection = pool.get('webdav.collection')
     except KeyError:
         raise DAV_NotFound
     try:
-        res = collection_obj.get_calendar_user_address_set(dburi, cache=CACHE)
+        res = Collection.get_calendar_user_address_set(dburi, cache=CACHE)
     except AttributeError:
         raise DAV_NotFound
     except DAV_Error, exception:
@@ -172,11 +172,11 @@ def _get_caldav_schedule_inbox_URL(self, uri):
         raise DAV_NotFound
     pool = Pool(Transaction().cursor.database_name)
     try:
-        collection_obj = pool.get('webdav.collection')
+        Collection = pool.get('webdav.collection')
     except KeyError:
         raise DAV_NotFound
     try:
-        res = collection_obj.get_schedule_inbox_URL(dburi, cache=CACHE)
+        res = Collection.get_schedule_inbox_URL(dburi, cache=CACHE)
     except AttributeError:
         raise DAV_NotFound
     except DAV_Error, exception:
@@ -204,11 +204,11 @@ def _get_caldav_schedule_outbox_URL(self, uri):
         raise DAV_NotFound
     pool = Pool(Transaction().cursor.database_name)
     try:
-        collection_obj = pool.get('webdav.collection')
+        Collection = pool.get('webdav.collection')
     except KeyError:
         raise DAV_NotFound
     try:
-        res = collection_obj.get_schedule_outbox_URL(dburi, cache=CACHE)
+        res = Collection.get_schedule_outbox_URL(dburi, cache=CACHE)
     except AttributeError:
         raise DAV_NotFound
     except DAV_Error, exception:
@@ -258,9 +258,9 @@ def _get_caldav_post(self, uri, body, contenttype=''):
     if not dbname:
         raise DAV_Forbidden
     pool = Pool(Transaction().cursor.database_name)
-    calendar_obj = pool.get('calendar.calendar')
+    Calendar = pool.get('calendar.calendar')
     try:
-        res = calendar_obj.post(dburi, body)
+        res = Calendar.post(dburi, body)
     except AttributeError:
         raise DAV_NotFound
     except DAV_Error, exception:
diff --git a/calendar_.py b/calendar_.py
index 123e07b..230681a 100644
--- a/calendar_.py
+++ b/calendar_.py
@@ -13,6 +13,12 @@ from trytond.pyson import If, Bool, Eval
 from trytond.transaction import Transaction
 from trytond.cache import Cache
 from trytond.pool import Pool
+
+__all__ = ['Calendar', 'ReadUser', 'WriteUser', 'Category', 'Location',
+    'Event', 'EventCategory', 'Alarm', 'EventAlarm', 'Attendee',
+    'EventAttendee', 'Date', 'EventRDate', 'EventExDate', 'RRule',
+    'EventRRule', 'EventExRule']
+
 tzlocal = dateutil.tz.tzlocal()
 tzutc = dateutil.tz.tzutc()
 domimpl = xml.dom.minidom.getDOMImplementation()
@@ -20,9 +26,7 @@ domimpl = xml.dom.minidom.getDOMImplementation()
 
 class Calendar(ModelSQL, ModelView):
     "Calendar"
-    _description = __doc__
-    _name = 'calendar.calendar'
-
+    __name__ = 'calendar.calendar'
     name = fields.Char('Name', required=True, select=True)
     description = fields.Text('Description')
     owner = fields.Many2One('res.user', 'Owner', select=True,
@@ -32,95 +36,96 @@ class Calendar(ModelSQL, ModelView):
             'calendar', 'user', 'Read Users')
     write_users = fields.Many2Many('calendar.calendar-write-res.user',
             'calendar', 'user', 'Write Users')
+    _get_name_cache = Cache('calendar_calendar.get_name')
 
-    def __init__(self):
-        super(Calendar, self).__init__()
-        self._sql_constraints = [
+    @classmethod
+    def __setup__(cls):
+        super(Calendar, cls).__setup__()
+        cls._sql_constraints = [
             ('name_uniq', 'UNIQUE(name)',
                 'The name of calendar must be unique!'),
             ('owner_uniq', 'UNIQUE(owner)',
                 'A user can have only one calendar!'),
-        ]
-        self._order.insert(0, ('name', 'ASC'))
-        self._constraints += [
+            ]
+        cls._order.insert(0, ('name', 'ASC'))
+        cls._constraints += [
             ('check_name', 'Calendar name can not end with .ics'),
-        ]
+            ]
 
-    def create(self, vals):
-        res = super(Calendar, self).create(vals)
+    @classmethod
+    def create(cls, vals):
+        calendar = super(Calendar, cls).create(vals)
         # Restart the cache for get_name
-        self.get_name.reset()
-        return res
+        cls._get_name_cache.clear()
+        return calendar
 
-    def write(self, ids, vals):
-        res = super(Calendar, self).write(ids, vals)
+    @classmethod
+    def write(cls, calendars, vals):
+        super(Calendar, cls).write(calendars, vals)
         # Restart the cache for get_name
-        self.get_name.reset()
-        return res
+        cls._get_name_cache.clear()
 
-    def delete(self, ids):
-        res = super(Calendar, self).delete(ids)
+    @classmethod
+    def delete(cls, calendars):
+        super(Calendar, cls).delete(calendars)
         # Restart the cache for calendar
-        self.get_name.reset()
-        return res
+        cls._get_name_cache.clear()
 
-    def check_name(self, ids):
+    def check_name(self):
         '''
         Check the name doesn't end with .ics
         '''
-        for calendar in self.browse(ids):
-            if calendar.name.endswith('.ics'):
-                return False
+        if self.name.endswith('.ics'):
+            return False
         return True
 
-    @Cache('calendar_calendar.get_name')
-    def get_name(self, name):
+    @classmethod
+    def get_name(cls, name):
         '''
         Return the calendar id of the name
-
-        :param name: the calendar name
-        :return: the calendar.calendar id
         '''
-        calendar_ids = self.search([
-            ('name', '=', name),
-            ], limit=1)
-        if calendar_ids:
-            return calendar_ids[0]
+        calendar_id = cls._get_name_cache.get(name, default=-1)
+        if calendar_id == -1:
+            calendars = cls.search([
+                ('name', '=', name),
+                ], limit=1)
+            if calendars:
+                calendar_id = calendars[0].id
+            else:
+                calendar_id = None
+            cls._get_name_cache.set(name, calendar_id)
+        return calendar_id
 
-    def calendar2ical(self, calendar_id):
+    @staticmethod
+    def calendar2ical(calendar_id):
         '''
         Return an iCalendar object for the given calendar_id containing
         all the vevent objects
-
-        :param calendar_id: an id of calendar.calendar
-        :return: an iCalendar
         '''
-        event_obj = Pool().get('calendar.event')
+        Event = Pool().get('calendar.event')
 
         ical = vobject.iCalendar()
         ical.vevent_list = []
-        event_ids = event_obj.search([
-            ('calendar', '=', calendar_id),
-            ('parent', '=', None),
-            ])
-        for event in event_obj.browse(event_ids):
-            ical2 = event_obj.event2ical(event.id)
+        events = Event.search([
+                ('calendar', '=', calendar_id),
+                ('parent', '=', None),
+                ])
+        for event in events:
+            ical2 = event.event2ical()
             ical.vevent_list.extend(ical2.vevent_list)
         return ical
 
-    def _fbtype(self, event):
+    @property
+    def _fbtype(self):
         '''
         Return the freebusy type for give transparent and status
-
-        :param event: a BrowseRecord of calendar.event
-        :return: a freebusy type ('FREE', 'BUSY', 'BUSY-TENTATIVE')
         '''
-        if event.transp == 'opaque':
-            if not event.status or event.status == 'confirmed':
+        if self.transp == 'opaque':
+            if not self.status or self.status == 'confirmed':
                 fbtype = 'BUSY'
-            elif event.status == 'cancelled':
+            elif self.status == 'cancelled':
                 fbtype = 'FREE'
-            elif event.status == 'tentative':
+            elif self.status == 'tentative':
                 fbtype = 'BUSY-TENTATIVE'
             else:
                 fbtype = 'BUSY'
@@ -128,17 +133,13 @@ class Calendar(ModelSQL, ModelView):
             fbtype = 'FREE'
         return fbtype
 
-    def freebusy(self, calendar_id, dtstart, dtend):
+    @classmethod
+    def freebusy(cls, calendar_id, dtstart, dtend):
         '''
         Return an iCalendar object for the given calendar_id with the
         vfreebusy objects between the two dates
-
-        :param calendar_id: an id of calendar.calendar
-        :param dtstart: a date or datetime
-        :param dtend: a date of datetime
-        :return: an iCalendar
         '''
-        event_obj = Pool().get('calendar.event')
+        Event = Pool().get('calendar.event')
 
         ical = vobject.iCalendar()
         ical.add('method').value = 'REPLY'
@@ -157,31 +158,30 @@ class Calendar(ModelSQL, ModelView):
             ical.vfreebusy.add('dtend').value = dtend.astimezone(tzutc)
 
         with Transaction().set_user(0):
-            event_ids = event_obj.search([
-                ['OR',
-                    [('dtstart', '<=', dtstart),
-                        ('dtend', '>=', dtstart)],
-                    [('dtstart', '<=', dtend),
-                        ('dtend', '>=', dtend)],
-                    [('dtstart', '>=', dtstart),
-                        ('dtend', '<=', dtend)],
-                    [('dtstart', '>=', dtstart),
-                        ('dtstart', '<=', dtend),
-                        ('dtend', '=', None)]],
-                ('parent', '=', None),
-                ('rdates', '=', None),
-                ('rrules', '=', None),
-                ('exdates', '=', None),
-                ('exrules', '=', None),
-                ('occurences', '=', None),
-                ('calendar', '=', calendar_id),
-                ])
-            events = event_obj.browse(event_ids)
+            events = Event.search([
+                    ['OR',
+                        [('dtstart', '<=', dtstart),
+                            ('dtend', '>=', dtstart)],
+                        [('dtstart', '<=', dtend),
+                            ('dtend', '>=', dtend)],
+                        [('dtstart', '>=', dtstart),
+                            ('dtend', '<=', dtend)],
+                        [('dtstart', '>=', dtstart),
+                            ('dtstart', '<=', dtend),
+                            ('dtend', '=', None)]],
+                    ('parent', '=', None),
+                    ('rdates', '=', None),
+                    ('rrules', '=', None),
+                    ('exdates', '=', None),
+                    ('exrules', '=', None),
+                    ('occurences', '=', None),
+                    ('calendar', '=', calendar_id),
+                    ])
 
         for event in events:
             # Don't group freebusy as sunbird doesn't handle it
             freebusy = ical.vfreebusy.add('freebusy')
-            freebusy.fbtype_param = self._fbtype(event)
+            freebusy.fbtype_param = event._fbtype
             if event.dtstart.replace(tzinfo=tzlocal) >= dtstart:
                 freebusy_dtstart = event.dtstart.replace(tzinfo=tzlocal)
             else:
@@ -195,22 +195,21 @@ class Calendar(ModelSQL, ModelView):
                 freebusy_dtend.astimezone(tzutc))]
 
         with Transaction().set_user(0):
-            event_ids = event_obj.search([
-                ('parent', '=', None),
-                ('dtstart', '<=', dtend),
-                ['OR',
-                    ('rdates', '!=', None),
-                    ('rrules', '!=', None),
-                    ('exdates', '!=', None),
-                    ('exrules', '!=', None),
-                    ('occurences', '!=', None),
-                ],
-                ('calendar', '=', calendar_id),
-                ])
-            events = event_obj.browse(event_ids)
+            events = Event.search([
+                    ('parent', '=', None),
+                    ('dtstart', '<=', dtend),
+                    ['OR',
+                        ('rdates', '!=', None),
+                        ('rrules', '!=', None),
+                        ('exdates', '!=', None),
+                        ('exrules', '!=', None),
+                        ('occurences', '!=', None),
+                        ],
+                    ('calendar', '=', calendar_id),
+                    ])
 
         for event in events:
-            event_ical = event_obj.event2ical(event)
+            event_ical = event.event2ical()
             if event_ical.vevent.rruleset:
                 between_dtstart, between_dtend = dtstart, dtend
                 for freebusy_dtstart in event_ical.vevent.rruleset:
@@ -231,7 +230,7 @@ class Calendar(ModelSQL, ModelView):
                             or (f_dtstart_tz >= dtstart
                                 and f_dtend_tz <= dtend)):
                         continue
-                    freebusy_fbtype = self._fbtype(event)
+                    freebusy_fbtype = event._fbtype
                     all_day = event.all_day
                     for occurence in event.occurences:
                         if (occurence.recurrence.replace(tzinfo=tzlocal)
@@ -244,7 +243,7 @@ class Calendar(ModelSQL, ModelView):
                             else:
                                 freebusy_dtend = freebusy_dtstart
                             all_day = occurence.all_day
-                            freebusy_fbtype = self._fbtype(occurence)
+                            freebusy_fbtype = occurence._fbtype
                             break
                     freebusy = ical.vfreebusy.add('freebusy')
                     freebusy.fbtype_param = freebusy_fbtype
@@ -263,21 +262,19 @@ class Calendar(ModelSQL, ModelView):
                             freebusy_dtend.astimezone(tzutc))]
         return ical
 
-    def post(self, uri, data):
+    @classmethod
+    def post(cls, uri, data):
         '''
-        Handle post of vfreebusy request
-
-        :param uri: the posted uri
-        :param data: the posted data
-        :return: the xml with schedule-response
+        Handle post of vfreebusy request and return the XML with
+        schedule-response
         '''
         from pywebdav.lib.errors import DAV_Forbidden
-        collection_obj = Pool().get('webdav.collection')
+        Collection = Pool().get('webdav.collection')
 
-        calendar_id = collection_obj.calendar(uri)
+        calendar_id = Collection.calendar(uri)
         if not calendar_id:
             raise DAV_Forbidden
-        calendar = self.browse(calendar_id)
+        calendar = cls(calendar_id)
         if calendar.owner.id != Transaction().user:
             raise DAV_Forbidden
         ical = vobject.readOne(data)
@@ -318,11 +315,11 @@ class Calendar(ModelSQL, ModelView):
                 if attendee.value.lower().startswith('mailto:'):
                     email = attendee.value[7:]
                 with Transaction().set_user(0):
-                    calendar_ids = self.search([
-                        ('owner.email', '=', email),
-                        ])
-                if calendar_ids:
-                    vfreebusy = self.freebusy(calendar_ids[0], dtstart, dtend)
+                    calendars = cls.search([
+                            ('owner.email', '=', email),
+                            ])
+                if calendars:
+                    vfreebusy = cls.freebusy(calendars[0].id, dtstart, dtend)
                     vfreebusy.vfreebusy.add('dtstamp').value = \
                             ical.vfreebusy.dtstamp.value
                     vfreebusy.vfreebusy.add('uid').value = \
@@ -343,77 +340,59 @@ class Calendar(ModelSQL, ModelView):
             return doc.toxml(encoding='utf-8')
         raise DAV_Forbidden
 
-Calendar()
-
 
 class ReadUser(ModelSQL):
     'Calendar - read - User'
-    _description = __doc__
-    _name = 'calendar.calendar-read-res.user'
-
+    __name__ = 'calendar.calendar-read-res.user'
     calendar = fields.Many2One('calendar.calendar', 'Calendar',
             ondelete='CASCADE', required=True, select=True)
     user = fields.Many2One('res.user', 'User', ondelete='CASCADE',
             required=True, select=True)
 
-ReadUser()
-
 
 class WriteUser(ModelSQL):
     'Calendar - write - User'
-    _description = __doc__
-    _name = 'calendar.calendar-write-res.user'
-
+    __name__ = 'calendar.calendar-write-res.user'
     calendar = fields.Many2One('calendar.calendar', 'Calendar',
             ondelete='CASCADE', required=True, select=True)
     user = fields.Many2One('res.user', 'User', ondelete='CASCADE',
             required=True, select=True)
 
-WriteUser()
-
 
 class Category(ModelSQL, ModelView):
     "Category"
-    _description = __doc__
-    _name = 'calendar.category'
-
+    __name__ = 'calendar.category'
     name = fields.Char('Name', required=True, select=True)
 
-    def __init__(self):
-        super(Category, self).__init__()
-        self._sql_constraints = [
+    @classmethod
+    def __setup__(cls):
+        super(Category, cls).__setup__()
+        cls._sql_constraints = [
             ('name_uniq', 'UNIQUE(name)',
                 'The name of calendar category must be unique!'),
-        ]
-        self._order.insert(0, ('name', 'ASC'))
-
-Category()
+            ]
+        cls._order.insert(0, ('name', 'ASC'))
 
 
 class Location(ModelSQL, ModelView):
     "Location"
-    _description = __doc__
-    _name = 'calendar.location'
-
+    __name__ = 'calendar.location'
     name = fields.Char('Name', required=True, select=True)
 
-    def __init__(self):
-        super(Location, self).__init__()
-        self._sql_constraints = [
+    @classmethod
+    def __setup__(cls):
+        super(Location, cls).__setup__()
+        cls._sql_constraints = [
             ('name_uniq', 'UNIQUE(name)',
                 'The name of calendar location must be unique!'),
-        ]
-        self._order.insert(0, ('name', 'ASC'))
-
-Location()
+            ]
+        cls._order.insert(0, ('name', 'ASC'))
 
 
 class Event(ModelSQL, ModelView):
     "Event"
-    _description = __doc__
-    _name = 'calendar.event'
+    __name__ = 'calendar.event'
     _rec_name = 'uuid'
-
     uuid = fields.Char('UUID', required=True,
             help='Universally Unique Identifier', select=True)
     calendar = fields.Many2One('calendar.calendar', 'Calendar',
@@ -496,90 +475,95 @@ class Event(ModelSQL, ModelView):
         'Write Users'), 'get_calendar_field', searcher='search_calendar_field')
     vevent = fields.Binary('vevent')
 
-    def __init__(self):
-        super(Event, self).__init__()
-        self._sql_constraints = [
+    @classmethod
+    def __setup__(cls):
+        super(Event, cls).__setup__()
+        cls._sql_constraints = [
             ('uuid_recurrence_uniq', 'UNIQUE(uuid, calendar, recurrence)',
                 'UUID and recurrence must be unique in a calendar!'),
-        ]
-        self._constraints += [
+            ]
+        cls._constraints += [
             ('check_recurrence', 'invalid_recurrence'),
-        ]
-        self._error_messages.update({
-            'invalid_recurrence': 'Recurrence can not be recurrent!',
-        })
+            ]
+        cls._error_messages.update({
+                'invalid_recurrence': 'Recurrence can not be recurrent!',
+                })
 
-    def init(self, module_name):
+    @classmethod
+    def __register__(cls, module_name):
         # Migrate from 1.4: remove classification_public
-        model_data_obj = Pool().get('ir.model.data')
-        rule_obj = Pool().get('ir.rule')
+        ModelData = Pool().get('ir.model.data')
+        Rule = Pool().get('ir.rule')
         with Transaction().set_user(0):
-            model_data_ids = model_data_obj.search([
-                ('fs_id', '=', 'rule_group_read_calendar_line3'),
-                ('module', '=', module_name),
-                ('inherit', '=', None),
-                ], limit=1)
-            if model_data_ids:
-                model_data = model_data_obj.browse(model_data_ids[0])
-                rule_obj.delete(model_data.db_id)
-        return super(Event, self).init(module_name)
+            models_data = ModelData.search([
+                    ('fs_id', '=', 'rule_group_read_calendar_line3'),
+                    ('module', '=', module_name),
+                    ('inherit', '=', None),
+                    ], limit=1)
+            if models_data:
+                model_data, = models_data
+                Rule.delete([Rule(model_data.db_id)])
+        return super(Event, cls).__register__(module_name)
 
-    def default_uuid(self):
+    @staticmethod
+    def default_uuid():
         return str(uuid.uuid4())
 
-    def default_sequence(self):
+    @staticmethod
+    def default_sequence():
         return 0
 
-    def default_classification(self):
+    @staticmethod
+    def default_classification():
         return 'public'
 
-    def default_transp(self):
+    @staticmethod
+    def default_transp():
         return 'opaque'
 
-    def default_timezone(self):
-        user_obj = Pool().get('res.user')
-        user = user_obj.browse(Transaction().user)
+    @staticmethod
+    def default_timezone():
+        User = Pool().get('res.user')
+        user = User(Transaction().user)
         return user.timezone
 
-    def timezones(self):
+    @staticmethod
+    def timezones():
         return [(x, x) for x in pytz.common_timezones] + [('', '')]
 
-    def get_calendar_field(self, ids, name):
+    def get_calendar_field(self, name):
         assert name in ('calendar_owner', 'calendar_read_users',
                 'calendar_write_users'), 'Invalid name'
-        res = {}
         name = name[9:]
-        for event in self.browse(ids):
-            if name in ('read_users', 'write_users'):
-                res[event.id] = [x.id for x in event.calendar[name]]
-            else:
-                res[event.id] = event.calendar[name].id
-        return res
+        if name in ('read_users', 'write_users'):
+            return [x.id for x in getattr(self.calendar, name)]
+        else:
+            return getattr(self.calendar, name).id
 
-    def search_calendar_field(self, name, clause):
-        return [('calendar.' + name[9:],) + clause[1:]]
+    @classmethod
+    def search_calendar_field(cls, name, clause):
+        return [('calendar.' + name[9:],) + tuple(clause[1:])]
 
-    def check_recurrence(self, ids):
+    def check_recurrence(self):
         '''
         Check the recurrence is not recurrent.
         '''
-        for event in self.browse(ids):
-            if not event.parent:
-                continue
-            if event.rdates \
-                    or event.rrules \
-                    or event.exdates \
-                    or event.exrules \
-                    or event.occurences:
+        if self.parent:
+            if self.rdates \
+                    or self.rrules \
+                    or self.exdates \
+                    or self.exrules \
+                    or self.occurences:
                 return False
         return True
 
-    def create(self, values):
-        calendar_obj = Pool().get('calendar.calendar')
-        collection_obj = Pool().get('webdav.collection')
+    @classmethod
+    def create(cls, values):
+        pool = Pool()
+        Calendar = pool.get('calendar.calendar')
+        Collection = pool.get('webdav.collection')
 
-        res = super(Event, self).create(values)
-        event = self.browse(res)
+        event = super(Event, cls).create(values)
         if (event.calendar.owner
                 and (event.organizer == event.calendar.owner.email
                     or (event.parent
@@ -595,94 +579,83 @@ class Event(ModelSQL, ModelView):
                         and x.email != event.parent.organizer]
             if attendee_emails:
                 with Transaction().set_user(0):
-                    calendar_ids = calendar_obj.search([
-                        ('owner.email', 'in', attendee_emails),
-                        ])
+                    calendars = Calendar.search([
+                            ('owner.email', 'in', attendee_emails),
+                            ])
                     if not event.recurrence:
-                        for calendar_id in calendar_ids:
-                            new_id = self.copy(event.id, default={
-                                'calendar': calendar_id,
-                                'occurences': None,
-                                })
+                        for calendar in calendars:
+                            new_event, = cls.copy([event], default={
+                                    'calendar': calendar.id,
+                                    'occurences': None,
+                                    'uuid': event.uuid,
+                                    })
                             for occurence in event.occurences:
-                                self.copy(occurence.id, default={
-                                    'calendar': calendar_id,
-                                    'parent': new_id,
+                                cls.copy([occurence], default={
+                                    'calendar': calendar.id,
+                                    'parent': new_event.id,
+                                    'uuid': occurence.uuid,
                                     })
                     else:
-                        parent_ids = self.search([
-                            ('uuid', '=', event.uuid),
-                            ('calendar.owner.email', 'in', attendee_emails),
-                            ('id', '!=', event.id),
-                            ('recurrence', '=', None),
-                            ])
-                        for parent in self.browse(parent_ids):
-                            self.copy(event.id, default={
-                                'calendar': parent.calendar.id,
-                                'parent': parent.id,
-                                })
+                        parents = cls.search([
+                                ('uuid', '=', event.uuid),
+                                ('calendar.owner.email', 'in',
+                                    attendee_emails),
+                                ('id', '!=', event.id),
+                                ('recurrence', '=', None),
+                                ])
+                        for parent in parents:
+                            cls.copy([event], default={
+                                    'calendar': parent.calendar.id,
+                                    'parent': parent.id,
+                                    'uuid': event.uuid,
+                                    })
         # Restart the cache for event
-        collection_obj.event.reset()
-        return res
-
-    def _event2update(self, event):
+        Collection._event_cache.clear()
+        return event
+
+    def _event2update(self):
+        return {
+            'summary': self.summary,
+            'description': self.description,
+            'all_day': self.all_day,
+            'dtstart': self.dtstart,
+            'dtend': self.dtend,
+            'location': self.location.id if self.location else None,
+            'status': self.status,
+            'organizer': self.organizer,
+            'rdates': [('delete_all',)] + [('create', rdate._date2update())
+                for rdate in self.rdates],
+            'exdates': [('delete_all',)] + [('create', exdate._date2update())
+                for exdate in self.exdates],
+            'rrules': [('delete_all',)] + [('create', rrule._date2update())
+                for rrule in self.rrules],
+            'exrules': [('delete_all',)] + [('create', exrule._date2update())
+                for exrule in self.exrules],
+            }
+
+    @classmethod
+    def write(cls, events, values):
         pool = Pool()
-        rdate_obj = pool.get('calendar.event.rdate')
-        exdate_obj = pool.get('calendar.event.exdate')
-        rrule_obj = pool.get('calendar.event.rrule')
-        exrule_obj = pool.get('calendar.event.exrule')
-
-        res = {}
-        res['summary'] = event.summary
-        res['description'] = event.description
-        res['all_day'] = event.all_day
-        res['dtstart'] = event.dtstart
-        res['dtend'] = event.dtend
-        res['location'] = event.location.id
-        res['status'] = event.status
-        res['organizer'] = event.organizer
-        res['rdates'] = [('delete_all',)]
-        for rdate in event.rdates:
-            vals = rdate_obj._date2update(rdate)
-            res['rdates'].append(('create', vals))
-        res['exdates'] = [('delete_all',)]
-        for exdate in event.exdates:
-            vals = exdate_obj._date2update(exdate)
-            res['exdates'].append(('create', vals))
-        res['rrules'] = [('delete_all',)]
-        for rrule in event.rrules:
-            vals = rrule_obj._rule2update(rrule)
-            res['rrules'].append(('create', vals))
-        res['exrules'] = [('delete_all',)]
-        for exrule in event.exrules:
-            vals = exrule_obj._rule2update(exrule)
-            res['exrules'].append(('create', vals))
-        return res
-
-    def write(self, ids, values):
-        calendar_obj = Pool().get('calendar.calendar')
-        collection_obj = Pool().get('webdav.collection')
+        Calendar = pool.get('calendar.calendar')
+        Collection = pool.get('webdav.collection')
         cursor = Transaction().cursor
 
         values = values.copy()
         if 'sequence' in values:
             del values['sequence']
 
-        res = super(Event, self).write(ids, values)
-
-        if isinstance(ids, (int, long)):
-            ids = [ids]
+        super(Event, cls).write(events, values)
 
-        for i in range(0, len(ids), cursor.IN_MAX):
-            sub_ids = ids[i:i + cursor.IN_MAX]
+        for i in range(0, len(events), cursor.IN_MAX):
+            sub_ids = map(int, events[i:i + cursor.IN_MAX])
             red_sql, red_ids = reduce_ids('id', sub_ids)
-            cursor.execute('UPDATE "' + self._table + '" ' \
-                    'SET sequence = sequence + 1 ' \
-                    'WHERE ' + red_sql, red_ids)
+            cursor.execute('UPDATE "' + cls._table + '" '
+                'SET sequence = sequence + 1 '
+                'WHERE ' + red_sql, red_ids)
 
         if not values:
-            return res
-        for event in self.browse(ids):
+            return
+        for event in events:
             if event.calendar.owner \
                     and (event.organizer == event.calendar.owner.email \
                     or (event.parent \
@@ -696,79 +669,75 @@ class Event(ModelSQL, ModelView):
                             if x.status != 'declined'
                             and x.email != event.parent.organizer]
                 with Transaction().set_user(0):
-                    event_ids = self.search([
-                        ('uuid', '=', event.uuid),
-                        ('id', '!=', event.id),
-                        ('recurrence', '=', event.recurrence),
-                        ])
-                    for event2 in self.browse(event_ids):
+                    events2 = cls.search([
+                            ('uuid', '=', event.uuid),
+                            ('id', '!=', event.id),
+                            ('recurrence', '=', event.recurrence),
+                            ])
+                    for event2 in events2[:]:
                         if event2.calendar.owner.email in attendee_emails:
                             attendee_emails.remove(
                                     event2.calendar.owner.email)
                         else:
-                            event_ids.remove(event2.id)
-                            self.delete(event2.id)
-                    if event_ids:
-                        self.write(event_ids, self._event2update(event))
+                            events2.remove(event2)
+                            cls.delete([event2])
+                    if events2:
+                        cls.write(events2, event._event2update())
                 if attendee_emails:
                     with Transaction().set_user(0):
-                        calendar_ids = calendar_obj.search([
-                            ('owner.email', 'in', attendee_emails),
-                            ])
+                        calendars = Calendar.search([
+                                ('owner.email', 'in', attendee_emails),
+                                ])
                         if not event.recurrence:
-                            for calendar_id in calendar_ids:
-                                new_id = self.copy(event.id, default={
-                                    'calendar': calendar_id,
-                                    'occurences': None,
-                                    })
-                                for occurence in event.occurences:
-                                    self.copy(occurence.id, default={
-                                        'calendar': calendar_id,
-                                        'parent': new_id,
+                            for calendar in calendars:
+                                new_event, = cls.copy([event], default={
+                                        'calendar': calendar.id,
+                                        'occurences': None,
+                                        'uuid': event.uuid,
                                         })
+                                for occurence in event.occurences:
+                                    cls.copy([occurence], default={
+                                            'calendar': calendar.id,
+                                            'parent': new_event.id,
+                                            'uuid': occurence.uuid,
+                                            })
                         else:
-                            parent_ids = self.search([
+                            parents = cls.search([
                                     ('uuid', '=', event.uuid),
                                     ('calendar.owner.email', 'in',
                                         attendee_emails),
                                     ('id', '!=', event.id),
                                     ('recurrence', '=', None),
                                     ])
-                            for parent in self.browse(parent_ids):
-                                self.copy(event.id, default={
-                                    'calendar': parent.calendar.id,
-                                    'parent': parent.id,
-                                    })
+                            for parent in parents:
+                                cls.copy([event], default={
+                                        'calendar': parent.calendar.id,
+                                        'parent': parent.id,
+                                        'uuid': event.uuid,
+                                        })
         # Restart the cache for event
-        collection_obj.event.reset()
-        return res
-
-    def copy(self, ids, default=None):
-        int_id = isinstance(ids, (int, long))
-        if int_id:
-            ids = [ids]
+        Collection._event_cache.clear()
 
+    @classmethod
+    def copy(cls, events, default=None):
         if default is None:
             default = {}
 
-        new_ids = []
-        for event_id in ids:
+        new_events = []
+        for event in events:
             current_default = default.copy()
-            current_default['uuid'] = self.default_uuid()
-            new_id = super(Event, self).copy(event_id, default=current_default)
-            new_ids.append(new_id)
-
-        if int_id:
-            return new_ids[0]
-        return new_ids
+            current_default.setdefault('uuid', cls.default_uuid())
+            new_events.extend(super(Event, cls).copy([event],
+                    default=current_default))
+        return new_events
 
-    def delete(self, ids):
-        attendee_obj = Pool().get('calendar.event.attendee')
-        collection_obj = Pool().get('webdav.collection')
+    @classmethod
+    def delete(cls, events):
+        pool = Pool()
+        Attendee = pool.get('calendar.event.attendee')
+        Collection = pool.get('webdav.collection')
 
-        if isinstance(ids, (int, long)):
-            ids = [ids]
-        for event in self.browse(ids):
+        for event in events:
             if event.calendar.owner \
                     and (event.organizer == event.calendar.owner.email \
                     or (event.parent \
@@ -781,13 +750,13 @@ class Event(ModelSQL, ModelView):
                             if x.email != event.parent.organizer]
                 if attendee_emails:
                     with Transaction().set_user(0):
-                        event_ids = self.search([
-                            ('uuid', '=', event.uuid),
-                            ('calendar.owner.email', 'in', attendee_emails),
-                            ('id', '!=', event.id),
-                            ('recurrence', '=', event.recurrence),
-                            ])
-                        self.delete(event_ids)
+                        cls.delete(cls.search([
+                                    ('uuid', '=', event.uuid),
+                                    ('calendar.owner.email', 'in',
+                                        attendee_emails),
+                                    ('id', '!=', event.id),
+                                    ('recurrence', '=', event.recurrence),
+                                    ]))
             elif event.organizer \
                     or (event.parent and event.parent.organizer):
                 if event.organizer:
@@ -795,43 +764,37 @@ class Event(ModelSQL, ModelView):
                 else:
                     organizer = event.parent.organizer
                 with Transaction().set_user(0):
-                    event_ids = self.search([
-                        ('uuid', '=', event.uuid),
-                        ('calendar.owner.email', '=', organizer),
-                        ('id', '!=', event.id),
-                        ('recurrence', '=', event.recurrence),
-                        ], limit=1)
-                    if event_ids:
-                        event2 = self.browse(event_ids[0])
+                    events2 = cls.search([
+                            ('uuid', '=', event.uuid),
+                            ('calendar.owner.email', '=', organizer),
+                            ('id', '!=', event.id),
+                            ('recurrence', '=', event.recurrence),
+                            ], limit=1)
+                    if events2:
+                        event2, = events2
                         for attendee in event2.attendees:
                             if attendee.email == event.calendar.owner.email:
-                                attendee_obj.write(attendee.id, {
-                                    'status': 'declined',
-                                    })
-        res = super(Event, self).delete(ids)
+                                Attendee.write([attendee], {
+                                        'status': 'declined',
+                                        })
+        super(Event, cls).delete(events)
         # Restart the cache for event
-        collection_obj.event.reset()
-        return res
+        Collection._event_cache.clear()
 
-    def ical2values(self, event_id, ical, calendar_id, vevent=None):
+    @classmethod
+    def ical2values(cls, event_id, ical, calendar_id, vevent=None):
         '''
-        Convert iCalendar to values for create or write
-
-        :param event_id: the event id for write or None for create
-        :param ical: a ical instance of vobject
-        :param calendar_id: the calendar id of the event
-        :param vevent: the vevent of the ical to use if None use the first one
-        :return: a dictionary with values
+        Convert iCalendar to values for create or write with
+        the event id for write or None for create
         '''
         pool = Pool()
-        category_obj = pool.get('calendar.category')
-        location_obj = pool.get('calendar.location')
-        alarm_obj = pool.get('calendar.event.alarm')
-        attendee_obj = pool.get('calendar.event.attendee')
-        rdate_obj = pool.get('calendar.event.rdate')
-        exdate_obj = pool.get('calendar.event.exdate')
-        rrule_obj = pool.get('calendar.event.rrule')
-        exrule_obj = pool.get('calendar.event.exrule')
+        Category = pool.get('calendar.category')
+        Location = pool.get('calendar.location')
+        Alarm = pool.get('calendar.event.alarm')
+        Rdate = pool.get('calendar.event.rdate')
+        Exdate = pool.get('calendar.event.exdate')
+        Rrule = pool.get('calendar.rrule')
+        Exrule = pool.get('calendar.event.exrule')
 
         vevents = []
         if not vevent:
@@ -844,7 +807,7 @@ class Event(ModelSQL, ModelView):
 
         event = None
         if event_id:
-            event = self.browse(event_id)
+            event = cls(event_id)
 
         res = {}
         if not event:
@@ -902,24 +865,23 @@ class Event(ModelSQL, ModelView):
             res['status'] = ''
         if hasattr(vevent, 'categories'):
             with Transaction().set_context(active_test=False):
-                category_ids = category_obj.search([
-                    ('name', 'in', [x for x in vevent.categories.value]),
-                    ])
-            categories = category_obj.browse(category_ids)
+                categories = Category.search([
+                        ('name', 'in', [x for x in vevent.categories.value]),
+                        ])
             category_names2ids = {}
             for category in categories:
                 category_names2ids[category.name] = category.id
             for category in vevent.categories.value:
                 if category not in category_names2ids:
-                    category_ids.append(category_obj.create({
-                        'name': category,
-                        }))
-            res['categories'] = [('set', category_ids)]
+                    categories.append(Category.create({
+                                'name': category,
+                                }))
+            res['categories'] = [('set', map(int, categories))]
         else:
             res['categories'] = [('unlink_all',)]
         if hasattr(vevent, 'class'):
             if getattr(vevent, 'class').value.lower() in \
-                    dict(self.classification.selection):
+                    dict(cls.classification.selection):
                 res['classification'] = getattr(vevent, 'class').value.lower()
             else:
                 res['classification'] = 'public'
@@ -927,16 +889,16 @@ class Event(ModelSQL, ModelView):
             res['classification'] = 'public'
         if hasattr(vevent, 'location'):
             with Transaction().set_context(active_test=False):
-                location_ids = location_obj.search([
-                    ('name', '=', vevent.location.value),
-                    ], limit=1)
-            if not location_ids:
-                location_id = location_obj.create({
-                    'name': vevent.location.value,
-                    })
+                locations = Location.search([
+                        ('name', '=', vevent.location.value),
+                        ], limit=1)
+            if not locations:
+                location = Location.create({
+                        'name': vevent.location.value,
+                        })
             else:
-                location_id = location_ids[0]
-            res['location'] = location_id
+                location, = locations
+            res['location'] = location.id
         else:
             res['location'] = None
 
@@ -963,10 +925,10 @@ class Event(ModelSQL, ModelView):
         if hasattr(vevent, 'attendee'):
             while vevent.attendee_list:
                 attendee = vevent.attendee_list.pop()
-                vals = attendee_obj.attendee2values(attendee)
+                vals = Attendee.attendee2values(attendee)
                 if vals['email'] in attendees_todel:
                     res['attendees'].append(('write',
-                        attendees_todel[vals['email']], vals))
+                        [attendees_todel[vals['email']]], vals))
                     del attendees_todel[vals['email']]
                 else:
                     res['attendees'].append(('create', vals))
@@ -978,9 +940,8 @@ class Event(ModelSQL, ModelView):
         if hasattr(vevent, 'rdate'):
             while vevent.rdate_list:
                 rdate = vevent.rdate_list.pop()
-                for date in rdate.value:
-                    vals = rdate_obj.date2values(date)
-                    res['rdates'].append(('create', vals))
+                for rdate in rdate.value:
+                    res['rdates'].append(('create', Rdate.date2values(rdate)))
 
         res['exdates'] = []
         if event:
@@ -988,9 +949,9 @@ class Event(ModelSQL, ModelView):
         if hasattr(vevent, 'exdate'):
             while vevent.exdate_list:
                 exdate = vevent.exdate_list.pop()
-                for date in exdate.value:
-                    vals = exdate_obj.date2values(date)
-                    res['exdates'].append(('create', vals))
+                for exdate in exdate.value:
+                    res['exdates'].append(('create',
+                            Exdate.date2values(exdate)))
 
         res['rrules'] = []
         if event:
@@ -998,8 +959,7 @@ class Event(ModelSQL, ModelView):
         if hasattr(vevent, 'rrule'):
             while vevent.rrule_list:
                 rrule = vevent.rrule_list.pop()
-                vals = rrule_obj.rule2values(rrule)
-                res['rrules'].append(('create', vals))
+                res['rrules'].append(('create', Rrule.rule2values(rrule)))
 
         res['exrules'] = []
         if event:
@@ -1007,8 +967,7 @@ class Event(ModelSQL, ModelView):
         if hasattr(vevent, 'exrule'):
             while vevent.exrule_list:
                 exrule = vevent.exrule_list.pop()
-                vals = exrule_obj.rule2values(exrule)
-                res['exrules'].append(('create', vals))
+                res['exrules'].append(('create', Exrule.rule2values(exrule)))
 
         if event:
             res.setdefault('alarms', [])
@@ -1017,8 +976,7 @@ class Event(ModelSQL, ModelView):
             res.setdefault('alarms', [])
             while vevent.valarm_list:
                 valarm = vevent.valarm_list.pop()
-                vals = alarm_obj.valarm2values(valarm)
-                res['alarms'].append(('create', vals))
+                res['alarms'].append(('create', Alarm.valarm2values(valarm)))
 
         if hasattr(ical, 'vtimezone'):
             if ical.vtimezone.tzid.value in pytz.common_timezones:
@@ -1035,7 +993,7 @@ class Event(ModelSQL, ModelView):
             occurences_todel = [x.id for x in event.occurences]
         for vevent in vevents:
             event_id = None
-            vals = self.ical2values(event_id, ical, calendar_id, vevent=vevent)
+            vals = cls.ical2values(event_id, ical, calendar_id, vevent=vevent)
             if event:
                 for occurence in event.occurences:
                     if vals['recurrence'] == \
@@ -1056,280 +1014,240 @@ class Event(ModelSQL, ModelView):
             res['occurences'].insert(0, ('delete', occurences_todel))
         return res
 
-    def event2ical(self, event):
+    def event2ical(self):
         '''
         Return an iCalendar instance of vobject for event
-
-        :param event: a BrowseRecord of calendar.event
-            or a calendar.event id
-        :param calendar: a BrowseRecord of calendar.calendar
-            or a calendar.calendar id
-        :return: an iCalendar instance of vobject
         '''
         pool = Pool()
-        user_obj = pool.get('res.user')
-        alarm_obj = pool.get('calendar.event.alarm')
-        attendee_obj = pool.get('calendar.event.attendee')
-        rdate_obj = pool.get('calendar.event.rdate')
-        exdate_obj = pool.get('calendar.event.exdate')
-        rrule_obj = pool.get('calendar.event.rrule')
-        exrule_obj = pool.get('calendar.event.exrule')
-
-        if isinstance(event, (int, long)):
-            event = self.browse(event)
-
-        user = user_obj.browse(Transaction().user)
-        if event.timezone:
-            tzevent = pytz.timezone(event.timezone)
+        User = pool.get('res.user')
+
+        user = User(Transaction().user)
+        if self.timezone:
+            tzevent = pytz.timezone(self.timezone)
+            tzevent = dateutil.tz.gettz(self.timezone)
         elif user.timezone:
-                tzevent = pytz.timezone(user.timezone)
+            tzevent = dateutil.tz.gettz(user.timezone)
         else:
             tzevent = tzlocal
 
         ical = vobject.iCalendar()
         vevent = ical.add('vevent')
-        if event.vevent:
-            ical.vevent = vobject.readOne(str(event.vevent))
+        if self.vevent:
+            ical.vevent = vobject.readOne(str(self.vevent))
             vevent = ical.vevent
             ical.vevent.transformToNative()
-        if event.summary:
+        if self.summary:
             if not hasattr(vevent, 'summary'):
                 vevent.add('summary')
-            vevent.summary.value = event.summary
+            vevent.summary.value = self.summary
         elif hasattr(vevent, 'summary'):
             del vevent.summary
-        if event.description:
+        if self.description:
             if not hasattr(vevent, 'description'):
                 vevent.add('description')
-            vevent.description.value = event.description
+            vevent.description.value = self.description
         elif hasattr(vevent, 'description'):
             del vevent.description
         if not hasattr(vevent, 'dtstart'):
             vevent.add('dtstart')
-        if event.all_day:
-            vevent.dtstart.value = event.dtstart.date()
+        if self.all_day:
+            vevent.dtstart.value = self.dtstart.date()
         else:
-            vevent.dtstart.value = event.dtstart.replace(tzinfo=tzlocal)\
+            vevent.dtstart.value = self.dtstart.replace(tzinfo=tzlocal)\
                     .astimezone(tzevent)
-        if event.dtend:
+        if self.dtend:
             if not hasattr(vevent, 'dtend'):
                 vevent.add('dtend')
-            if event.all_day:
-                vevent.dtend.value = event.dtend.date()
+            if self.all_day:
+                vevent.dtend.value = self.dtend.date()
             else:
-                vevent.dtend.value = event.dtend.replace(tzinfo=tzlocal)\
+                vevent.dtend.value = self.dtend.replace(tzinfo=tzlocal)\
                         .astimezone(tzevent)
         elif hasattr(vevent, 'dtend'):
             del vevent.dtend
         if not hasattr(vevent, 'created'):
             vevent.add('created')
-        vevent.created.value = event.create_date.replace(tzinfo=tzlocal)
+        vevent.created.value = self.create_date.replace(tzinfo=tzlocal)
         if not hasattr(vevent, 'dtstamp'):
             vevent.add('dtstamp')
-        date = event.write_date or event.create_date
+        date = self.write_date or self.create_date
         vevent.dtstamp.value = date.replace(tzinfo=tzlocal)
         if not hasattr(vevent, 'last-modified'):
             vevent.add('last-modified')
         vevent.last_modified.value = date.replace(tzinfo=tzlocal)
-        if event.recurrence and event.parent:
+        if self.recurrence and self.parent:
             if not hasattr(vevent, 'recurrence-id'):
                 vevent.add('recurrence-id')
-            if event.all_day:
-                vevent.recurrence_id.value = event.recurrence.date()
+            if self.all_day:
+                vevent.recurrence_id.value = self.recurrence.date()
             else:
-                vevent.recurrence_id.value = event.recurrence\
+                vevent.recurrence_id.value = self.recurrence\
                         .replace(tzinfo=tzlocal).astimezone(tzevent)
         elif hasattr(vevent, 'recurrence-id'):
             del vevent.recurrence_id
-        if event.status:
+        if self.status:
             if not hasattr(vevent, 'status'):
                 vevent.add('status')
-            vevent.status.value = event.status.upper()
+            vevent.status.value = self.status.upper()
         elif hasattr(vevent, 'status'):
             del vevent.status
         if not hasattr(vevent, 'uid'):
             vevent.add('uid')
-        vevent.uid.value = event.uuid
+        vevent.uid.value = self.uuid
         if not hasattr(vevent, 'sequence'):
             vevent.add('sequence')
-        vevent.sequence.value = str(event.sequence) or '0'
-        if event.categories:
+        vevent.sequence.value = str(self.sequence) or '0'
+        if self.categories:
             if not hasattr(vevent, 'categories'):
                 vevent.add('categories')
-            vevent.categories.value = [x.name for x in event.categories]
+            vevent.categories.value = [x.name for x in self.categories]
         elif hasattr(vevent, 'categories'):
             del vevent.categories
         if not hasattr(vevent, 'class'):
             vevent.add('class')
-            getattr(vevent, 'class').value = event.classification.upper()
+            getattr(vevent, 'class').value = self.classification.upper()
         elif getattr(vevent, 'class').value.lower() in \
-                dict(self.classification.selection):
-            getattr(vevent, 'class').value = event.classification.upper()
-        if event.location:
+                dict(self.__class__.classification.selection):
+            getattr(vevent, 'class').value = self.classification.upper()
+        if self.location:
             if not hasattr(vevent, 'location'):
                 vevent.add('location')
-            vevent.location.value = event.location.name
+            vevent.location.value = self.location.name
         elif hasattr(vevent, 'location'):
             del vevent.location
 
         if not hasattr(vevent, 'transp'):
             vevent.add('transp')
-        vevent.transp.value = event.transp.upper()
+        vevent.transp.value = self.transp.upper()
 
-        if event.organizer:
+        if self.organizer:
             if not hasattr(vevent, 'organizer'):
                 vevent.add('organizer')
-            vevent.organizer.value = 'MAILTO:' + event.organizer
+            vevent.organizer.value = 'MAILTO:' + self.organizer
         elif hasattr(vevent, 'organizer'):
             del vevent.organizer
 
         vevent.attendee_list = []
-        for attendee in event.attendees:
-            vevent.attendee_list.append(attendee_obj.attendee2attendee(
-                attendee))
+        for attendee in self.attendees:
+            vevent.attendee_list.append(attendee.attendee2attendee())
 
-        if event.rdates:
+        if self.rdates:
             vevent.add('rdate')
             vevent.rdate.value = []
-            for rdate in event.rdates:
-                vevent.rdate.value.append(rdate_obj.date2date(rdate))
+            for rdate in self.rdates:
+                vevent.rdate.value.append(rdate.date2date())
 
-        if event.exdates:
+        if self.exdates:
             vevent.add('exdate')
             vevent.exdate.value = []
-            for exdate in event.exdates:
-                vevent.exdate.value.append(exdate_obj.date2date(exdate))
+            for exdate in self.exdates:
+                vevent.exdate.value.append(exdate.date2date())
 
-        if event.rrules:
-            for rrule in event.rrules:
-                vevent.add('rrule').value = rrule_obj.rule2rule(rrule)
+        if self.rrules:
+            for rrule in self.rrules:
+                vevent.add('rrule').value = rrule.rule2rule()
 
-        if event.exrules:
-            for exrule in event.exrules:
-                vevent.add('exrule').value = exrule_obj.rule2rule(exrule)
+        if self.exrules:
+            for exrule in self.exrules:
+                vevent.add('exrule').value = exrule.rule2rule()
 
         vevent.valarm_list = []
-        for alarm in event.alarms:
-            valarm = alarm_obj.alarm2valarm(alarm)
+        for alarm in self.alarms:
+            valarm = alarm.alarm2valarm()
             if valarm:
                 vevent.valarm_list.append(valarm)
 
-        for occurence in event.occurences:
-            oical = self.event2ical(occurence)
+        for occurence in self.occurences:
+            oical = occurence.event2ical()
             ical.vevent_list.append(oical.vevent)
         return ical
 
-Event()
-
 
 class EventCategory(ModelSQL):
     'Event - Category'
-    _description = __doc__
-    _name = 'calendar.event-calendar.category'
-
+    __name__ = 'calendar.event-calendar.category'
     event = fields.Many2One('calendar.event', 'Event', ondelete='CASCADE',
             required=True, select=True)
     category = fields.Many2One('calendar.category', 'Category',
             ondelete='CASCADE', required=True, select=True)
 
-EventCategory()
-
 
 class Alarm(ModelSQL):
     'Alarm'
-    _description = __doc__
-    _name = 'calendar.alarm'
-
+    __name__ = 'calendar.alarm'
     valarm = fields.Binary('valarm')
 
-    def valarm2values(self, valarm):
+    @classmethod
+    def valarm2values(cls, valarm):
         '''
         Convert a valarm object into values for create or write
-
-        :param valarm: the valarm object
-        :return: a dictionary with values
         '''
-        res = {}
-        res['valarm'] = valarm.serialize()
-        return res
+        return {
+            'valarm': valarm.serialize(),
+            }
 
-    def alarm2valarm(self, alarm):
+    def alarm2valarm(self):
         '''
         Return a valarm instance of vobject for alarm
-
-        :param alarm: a BrowseRecord of calendar.event.alarm
-        :return: a valarm instance of vobject
         '''
-        valarm = None
-        if alarm.valarm:
-            valarm = vobject.readOne(str(alarm.valarm))
-        return valarm
-
-Alarm()
+        if self.valarm:
+            return vobject.readOne(str(self.valarm))
 
 
 class EventAlarm(ModelSQL):
     'Alarm'
-    _description = __doc__
-    _name = 'calendar.event.alarm'
+    __name__ = 'calendar.event.alarm'
     _inherits = {'calendar.alarm': 'calendar_alarm'}
-
     calendar_alarm = fields.Many2One('calendar.alarm', 'Calendar Alarm',
             required=True, ondelete='CASCADE', select=True)
     event = fields.Many2One('calendar.event', 'Event', ondelete='CASCADE',
             required=True, select=True)
 
-    def create(self, values):
-        event_obj = Pool().get('calendar.event')
+    @classmethod
+    def create(cls, values):
+        Event = Pool().get('calendar.event')
         if values.get('event'):
             # Update write_date of event
-            event_obj.write(values['event'], {})
-        return super(EventAlarm, self).create(values)
-
-    def write(self, ids, values):
-        event_obj = Pool().get('calendar.event')
-        if isinstance(ids, (int, long)):
-            ids = [ids]
-        event_ids = [x.event.id for x in self.browse(ids)]
+            Event.write(values['event'], {})
+        return super(EventAlarm, cls).create(values)
+
+    @classmethod
+    def write(cls, event_alarms, values):
+        Event = Pool().get('calendar.event')
+        events = [x.event for x in event_alarms]
         if values.get('event'):
-            event_ids.append(values['event'])
-        if event_ids:
-            # Update write_date of event
-            event_obj.write(event_ids, {})
-        return super(EventAlarm, self).write(ids, values)
-
-    def delete(self, ids):
-        event_obj = Pool().get('calendar.event')
-        alarm_obj = Pool().get('calendar.alarm')
-        if isinstance(ids, (int, long)):
-            ids = [ids]
-        event_alarms = self.browse(ids)
-        alarm_ids = [a.calendar_alarm.id for a in event_alarms]
-        event_ids = [x.event.id for x in event_alarms]
-        if event_ids:
+            events.append(Event(values['event']))
+        if events:
             # Update write_date of event
-            event_obj.write(event_ids, {})
-        res = super(EventAlarm, self).delete(ids)
-        if alarm_ids:
-            alarm_obj.delete(alarm_ids)
-        return res
+            Event.write(events, {})
+        return super(EventAlarm, cls).write(event_alarms, values)
 
-    def valarm2values(self, alarm):
-        alarm_obj = Pool().get('calendar.alarm')
-        return alarm_obj.valarm2values(alarm)
+    @classmethod
+    def delete(cls, event_alarms):
+        pool = Pool()
+        Event = pool.get('calendar.event')
+        Alarm = pool.get('calendar.alarm')
+        alarms = [a.calendar_alarm for a in event_alarms]
+        events = [x.event for x in event_alarms]
+        if events:
+            # Update write_date of event
+            Event.write(events, {})
+        super(EventAlarm, cls).delete(event_alarms)
+        if alarms:
+            Alarm.delete(alarms)
 
-    def alarm2valarm(self, alarm):
-        alarm_obj = Pool().get('calendar.alarm')
-        return alarm_obj.alarm2valarm(alarm)
+    @classmethod
+    def valarm2values(cls, alarm):
+        Alarm = Pool().get('calendar.alarm')
+        return Alarm.valarm2values(alarm)
 
-EventAlarm()
+    def alarm2valarm(self):
+        return self.calendar_alarm.alarm2valarm()
 
 
 class Attendee(ModelSQL, ModelView):
     'Attendee'
-    _description = __doc__
-    _name = 'calendar.attendee'
-
+    __name__ = 'calendar.attendee'
     email = fields.Char('Email', required=True, states={
         'readonly': Eval('id', 0) > 0,
         }, depends=['id'])
@@ -1343,20 +1261,19 @@ class Attendee(ModelSQL, ModelView):
         ], 'Participation Status')
     attendee = fields.Binary('attendee')
 
-    def default_status(self):
+    @staticmethod
+    def default_status():
         return ''
 
-    def _attendee2update(self, attendee):
-        res = {}
-        res['status'] = attendee.status
-        return res
+    def _attendee2update(self):
+        return {
+            'status': self.status,
+            }
 
-    def attendee2values(self, attendee):
+    @classmethod
+    def attendee2values(cls, attendee):
         '''
         Convert a attendee object into values for create or write
-
-        :param attendee: the attendee object
-        :return: a dictionary with values
         '''
         res = {}
         if attendee.value.lower().startswith('mailto:'):
@@ -1365,60 +1282,54 @@ class Attendee(ModelSQL, ModelView):
             res['email'] = attendee.value
         res['status'] = ''
         if hasattr(attendee, 'partstat_param'):
-            if attendee.partstat_param.lower() in dict(self.status.selection):
+            if attendee.partstat_param.lower() in dict(cls.status.selection):
                 res['status'] = attendee.partstat_param.lower()
         res['attendee'] = attendee.serialize()
         return res
 
-    def attendee2attendee(self, attendee):
+    def attendee2attendee(self):
         '''
         Return a attendee instance of vobject for attendee
-
-        :param attendee: a BrowseRecord of calendar.event.attendee
-        :return: a attendee instance of vobject
         '''
         res = None
-        if attendee.attendee:
+        if self.attendee:
             res = vobject.base.textLineToContentLine(
-                    str(attendee.attendee).replace('\r\n ', ''))
+                    str(self.attendee).replace('\r\n ', ''))
         else:
             res = vobject.base.ContentLine('ATTENDEE', [], '')
 
-        if attendee.status:
+        selection = dict(self.__class__.status.selection)
+        if self.status:
             if hasattr(res, 'partstat_param'):
-                if res.partstat_param.lower() in dict(self.status.selection):
-                    res.partstat_param = attendee.status.upper()
+                if res.partstat_param.lower() in selection:
+                    res.partstat_param = self.status.upper()
             else:
-                res.partstat_param = attendee.status.upper()
+                res.partstat_param = self.status.upper()
         elif hasattr(res, 'partstat_param'):
-            if res.partstat_param.lower() in dict(self.status.selection):
+            if res.partstat_param.lower() in selection:
                 del res.partstat_param
 
-        res.value = 'MAILTO:' + attendee.email
+        res.value = 'MAILTO:' + self.email
         return res
 
-Attendee()
-
 
 class EventAttendee(ModelSQL, ModelView):
     'Attendee'
-    _description = __doc__
-    _name = 'calendar.event.attendee'
+    __name__ = 'calendar.event.attendee'
     _inherits = {'calendar.attendee': 'calendar_attendee'}
-
     calendar_attendee = fields.Many2One('calendar.attendee',
         'Calendar Attendee', required=True, ondelete='CASCADE', select=True)
     event = fields.Many2One('calendar.event', 'Event', ondelete='CASCADE',
         required=True, select=True)
 
-    def create(self, values):
-        event_obj = Pool().get('calendar.event')
+    @classmethod
+    def create(cls, values):
+        Event = Pool().get('calendar.event')
         if values.get('event'):
             # Update write_date of event
-            event_obj.write(values['event'], {})
-        res = super(EventAttendee, self).create(values)
-        attendee = self.browse(res)
-        event = attendee.event
+            Event.write([Event(values['event'])], {})
+        event_attendee = super(EventAttendee, cls).create(values)
+        event = event_attendee.event
         if (event.calendar.owner
                 and (event.organizer == event.calendar.owner.email
                     or (event.parent
@@ -1432,37 +1343,35 @@ class EventAttendee(ModelSQL, ModelView):
                         if x.email != event.parent.organizer]
             if attendee_emails:
                 with Transaction().set_user(0):
-                    event_ids = event_obj.search([
-                        ('uuid', '=', event.uuid),
-                        ('calendar.owner.email', 'in', attendee_emails),
-                        ('id', '!=', event.id),
-                        ('recurrence', '=', event.recurrence),
-                        ])
-                    for event_id in event_ids:
-                        self.copy(res, default={
-                            'event': event_id,
-                            })
-        return res
+                    events = Event.search([
+                            ('uuid', '=', event.uuid),
+                            ('calendar.owner.email', 'in', attendee_emails),
+                            ('id', '!=', event.id),
+                            ('recurrence', '=', event.recurrence),
+                            ])
+                    for event in events:
+                        cls.copy([event_attendee], default={
+                                'event': event.id,
+                                })
+        return event_attendee
 
-    def write(self, ids, values):
-        event_obj = Pool().get('calendar.event')
-        if isinstance(ids, (int, long)):
-            ids = [ids]
-        event_ids = [x.event.id for x in self.browse(ids)]
+    @classmethod
+    def write(cls, event_attendees, values):
+        Event = Pool().get('calendar.event')
+        events = [x.event for x in event_attendees]
         if values.get('event'):
-            event_ids.append(values['event'])
-        if event_ids:
+            events.append(Event(values['event']))
+        if events:
             # Update write_date of event
-            event_obj.write(event_ids, {})
+            Event.write(events, {})
 
         if 'email' in values:
             values = values.copy()
             del values['email']
 
-        res = super(EventAttendee, self).write(ids, values)
-        attendees = self.browse(ids)
-        for attendee in attendees:
-            event = attendee.event
+        super(EventAttendee, cls).write(event_attendees, values)
+        for event_attendee in event_attendees:
+            event = event_attendee.event
             if event.calendar.owner \
                     and (event.organizer == event.calendar.owner.email \
                     or (event.parent \
@@ -1475,34 +1384,31 @@ class EventAttendee(ModelSQL, ModelView):
                             if x.email != event.parent.organizer]
                 if attendee_emails:
                     with Transaction().set_user(0):
-                        attendee_ids = self.search([
-                            ('event.uuid', '=', event.uuid),
-                            ('event.calendar.owner.email', 'in',
-                                attendee_emails),
-                            ('id', '!=', attendee.id),
-                            ('event.recurrence', '=',
-                                event.recurrence),
-                            ('email', '=', attendee.email),
-                            ])
-                        self.write(attendee_ids, self._attendee2update(
-                            attendee))
-        return res
+                        other_attendees = cls.search([
+                                ('event.uuid', '=', event.uuid),
+                                ('event.calendar.owner.email', 'in',
+                                    attendee_emails),
+                                ('id', '!=', event_attendee.id),
+                                ('event.recurrence', '=',
+                                    event.recurrence),
+                                ('email', '=', event_attendee.email),
+                                ])
+                        cls.write(other_attendees,
+                            event_attendee._attendee2update())
+
+    @classmethod
+    def delete(cls, event_attendees):
+        pool = Pool()
+        Event = pool.get('calendar.event')
+        Attendee = pool.get('calendar.attendee')
 
-    def delete(self, ids):
-        event_obj = Pool().get('calendar.event')
-        attendee_obj = Pool().get('calendar.attendee')
-
-        if isinstance(ids, (int, long)):
-            ids = [ids]
-        event_attendees = self.browse(ids)
-        calendar_attendee_ids = [a.calendar_attendee.id \
-                for a in event_attendees]
-        event_ids = [x.event.id for x in event_attendees]
-        if event_ids:
+        calendar_attendees = [a.calendar_attendee for a in event_attendees]
+        events = [x.event for x in event_attendees]
+        if events:
             # Update write_date of event
-            event_obj.write(event_ids, {})
+            Event.write(events, {})
 
-        for attendee in self.browse(ids):
+        for attendee in event_attendees:
             event = attendee.event
             if event.calendar.owner \
                     and (event.organizer == event.calendar.owner.email \
@@ -1516,16 +1422,16 @@ class EventAttendee(ModelSQL, ModelView):
                             if x.email != event.parent.organizer]
                 if attendee_emails:
                     with Transaction().set_user(0):
-                        attendee_ids = self.search([
-                            ('event.uuid', '=', event.uuid),
-                            ('event.calendar.owner.email', 'in',
-                                attendee_emails),
-                            ('id', '!=', attendee.id),
-                            ('event.recurrence', '=',
-                                event.recurrence),
-                            ('email', '=', attendee.email),
-                            ])
-                        self.delete(attendee_ids)
+                        attendees = cls.search([
+                                ('event.uuid', '=', event.uuid),
+                                ('event.calendar.owner.email', 'in',
+                                    attendee_emails),
+                                ('id', '!=', attendee.id),
+                                ('event.recurrence', '=',
+                                    event.recurrence),
+                                ('email', '=', attendee.email),
+                                ])
+                        cls.delete(attendees)
             elif event.calendar.owner \
                     and ((event.organizer \
                     or (event.parent and event.parent.organizer)) \
@@ -1535,89 +1441,76 @@ class EventAttendee(ModelSQL, ModelView):
                 else:
                     organizer = event.parent.organizer
                 with Transaction().set_user(0):
-                    attendee_ids = self.search([
-                        ('event.uuid', '=', event.uuid),
-                        ('event.calendar.owner.email', '=', organizer),
-                        ('id', '!=', attendee.id),
-                        ('event.recurrence', '=', event.recurrence),
-                        ('email', '=', attendee.email),
-                        ])
-                    if attendee_ids:
-                        self.write(attendee_ids, {
-                            'status': 'declined',
-                            })
-        res = super(EventAttendee, self).delete(ids)
-        if calendar_attendee_ids:
-            attendee_obj.delete(calendar_attendee_ids)
-        return res
+                    attendees = cls.search([
+                            ('event.uuid', '=', event.uuid),
+                            ('event.calendar.owner.email', '=', organizer),
+                            ('id', '!=', attendee.id),
+                            ('event.recurrence', '=', event.recurrence),
+                            ('email', '=', attendee.email),
+                            ])
+                    if attendees:
+                        cls.write(attendees, {
+                                'status': 'declined',
+                                })
+        super(EventAttendee, cls).delete(event_attendees)
+        if calendar_attendees:
+            Attendee.delete(calendar_attendees)
 
-    def copy(self, ids, default=None):
-        attendee_obj = Pool().get('calendar.attendee')
+    @classmethod
+    def copy(cls, event_attendees, default=None):
+        Attendee = Pool().get('calendar.attendee')
 
-        int_id = False
-        if isinstance(ids, (int, long)):
-            int_id = True
-            ids = [ids]
         if default is None:
             default = {}
         default = default.copy()
-        new_ids = []
-        for attendee in self.browse(ids):
-            default['calendar_attendee'] = attendee_obj.copy(
-                    attendee.calendar_attendee.id)
-            new_id = super(EventAttendee, self).copy(attendee.id,
-                    default=default)
-            new_ids.append(new_id)
-        if int_id:
-            return new_ids[0]
-        return new_ids
+        new_event_attendees = []
+        for event_attendee in event_attendees:
+            default['calendar_attendee'], = Attendee.copy(
+                    [event_attendee.calendar_attendee])
+            new_event_attendees.extend(super(EventAttendee, cls).copy(
+                    [event_attendee], default=default))
+        return new_event_attendees
 
-    def _attendee2update(self, attendee):
-        attendee_obj = Pool().get('calendar.attendee')
-        return attendee_obj._attendee2update(attendee)
+    def _attendee2update(self):
+        return self.calendar_attendee._attendee2update()
 
-    def attendee2values(self, attendee):
-        attendee_obj = Pool().get('calendar.attendee')
-        return attendee_obj.attendee2values(attendee)
+    @staticmethod
+    def attendee2values(attendee):
+        Attendee = Pool().get('calendar.attendee')
+        return Attendee.attendee2values(attendee)
 
-    def attendee2attendee(self, attendee):
-        attendee_obj = Pool().get('calendar.attendee')
-        return attendee_obj.attendee2attendee(attendee)
-
-EventAttendee()
+    def attendee2attendee(self):
+        return self.calendar_attendee.attendee2attendee()
 
 
 class Date(ModelSQL, ModelView):
     'Calendar Date'
-    _description = __doc__
-    _name = 'calendar.date'
+    __name__ = 'calendar.date'
     _rec_name = 'datetime'
-
     date = fields.Boolean('Is Date', help='Ignore time of field "Date", ' \
             'but handle as date only.')
     datetime = fields.DateTime('Date', required=True)
 
-    def init(self, module_name):
+    @classmethod
+    def __register__(cls, module_name):
         cursor = Transaction().cursor
         # Migration from 1.4: calendar.rdate renamed to calendar.date
         old_table = 'calendar_rdate'
         if TableHandler.table_exist(cursor, old_table):
-            TableHandler.table_rename(cursor, old_table, self._table)
+            TableHandler.table_rename(cursor, old_table, cls._table)
 
-        return super(Date, self).init(module_name)
+        super(Date, cls).__register__(module_name)
 
-    def _date2update(self, date):
-        res = {}
-        res['date'] = date.date
-        res['datetime'] = date.datetime
-        return res
+    def _date2update(self):
+        return {
+            'date': self.date,
+            'datetime': self.datetime,
+            }
 
-    def date2values(self, date):
+    @staticmethod
+    def date2values(date):
         '''
         Convert a date object into values for create or write
-
-        :param date: the date object
-        :return: a dictionary with values
         '''
         res = {}
         if not isinstance(date, datetime.datetime):
@@ -1632,108 +1525,91 @@ class Date(ModelSQL, ModelView):
                 res['datetime'] = date
         return res
 
-    def date2date(self, date):
+    def date2date(self):
         '''
         Return a datetime for date
-
-        :param date: a BrowseRecord of calendar.date or
-            calendar.exdate
-        :return: a datetime
         '''
-        if date.date:
-            res = date.datetime.date()
+        if self.date:
+            return self.date.datetime.date()
         else:
             # Convert to UTC as sunbird doesn't handle tzid
-            res = date.datetime.replace(tzinfo=tzlocal).astimezone(tzutc)
-        return res
-
-Date()
+            return self.datetime.replace(tzinfo=tzlocal).astimezone(tzutc)
 
 
 class EventRDate(ModelSQL, ModelView):
     'Recurrence Date'
-    _description = __doc__
-    _name = 'calendar.event.rdate'
+    __name__ = 'calendar.event.rdate'
     _inherits = {'calendar.date': 'calendar_date'}
     _rec_name = 'datetime'
-
     calendar_date = fields.Many2One('calendar.date', 'Calendar Date',
             required=True, ondelete='CASCADE', select=True)
     event = fields.Many2One('calendar.event', 'Event', ondelete='CASCADE',
             select=True, required=True)
 
-    def init(self, module_name):
+    @classmethod
+    def __register__(cls, module_name):
         cursor = Transaction().cursor
         # Migration from 1.4: calendar_rdate renamed to calendar_date
-        table = TableHandler(cursor, self, module_name)
+        table = TableHandler(cursor, cls, module_name)
         old_column = 'calendar_rdate'
         if table.column_exist(old_column):
             table.column_rename(old_column, 'calendar_date')
 
-        return super(EventRDate, self).init(module_name)
+        super(EventRDate, cls).__register__(module_name)
 
-    def create(self, values):
-        event_obj = Pool().get('calendar.event')
+    @classmethod
+    def create(cls, values):
+        Event = Pool().get('calendar.event')
         if values.get('event'):
             # Update write_date of event
-            event_obj.write(values['event'], {})
-        return super(EventRDate, self).create(values)
-
-    def write(self, ids, values):
-        event_obj = Pool().get('calendar.event')
-        if isinstance(ids, (int, long)):
-            ids = [ids]
-        event_ids = [x.event.id for x in self.browse(ids)]
+            Event.write([Event(values['event'])], {})
+        return super(EventRDate, cls).create(values)
+
+    @classmethod
+    def write(cls, event_rdates, values):
+        Event = Pool().get('calendar.event')
+        events = [x.event for x in event_rdates]
         if values.get('event'):
-            event_ids.append(values['event'])
-        if event_ids:
-            # Update write_date of event
-            event_obj.write(event_ids, {})
-        return super(EventRDate, self).write(ids, values)
-
-    def delete(self, ids):
-        event_obj = Pool().get('calendar.event')
-        rdate_obj = Pool().get('calendar.date')
-        if isinstance(ids, (int, long)):
-            ids = [ids]
-        event_rdates = self.browse(ids)
-        rdate_ids = [a.calendar_date.id for a in event_rdates]
-        event_ids = [x.event.id for x in event_rdates]
-        if event_ids:
+            events.append(Event(values['event']))
+        if events:
             # Update write_date of event
-            event_obj.write(event_ids, {})
-        res = super(EventRDate, self).delete(ids)
-        if rdate_ids:
-            rdate_obj.delete(rdate_ids)
-        return res
+            Event.write(events, {})
+        super(EventRDate, cls).write(event_rdates, values)
 
-    def _date2update(self, date):
-        date_obj = Pool().get('calendar.date')
-        return date_obj._date2update(date)
+    @classmethod
+    def delete(cls, event_rdates):
+        pool = Pool()
+        Event = pool.get('calendar.event')
+        Date = pool.get('calendar.date')
+        dates = [a.calendar_date for a in event_rdates]
+        events = [x.event for x in event_rdates]
+        if events:
+            # Update write_date of event
+            Event.write(events, {})
+        super(EventRDate, cls).delete(event_rdates)
+        if dates:
+            Date.delete(dates)
 
-    def date2values(self, date):
-        date_obj = Pool().get('calendar.date')
-        return date_obj.date2values(date)
+    def _date2update(self):
+        return self.calendar_date._date2update()
 
-    def date2date(self, date):
-        date_obj = Pool().get('calendar.date')
-        return date_obj.date2date(date)
+    @classmethod
+    def date2values(cls, date):
+        Date = Pool().get('calendar.date')
+        return Date.date2values(date)
 
-EventRDate()
+    def date2date(self):
+        return self.calendar_date.date2date()
 
 
 class EventExDate(EventRDate):
     'Exception Date'
-    _description = __doc__
-    _name = 'calendar.event.exdate'
-
-EventExDate()
+    __name__ = 'calendar.event.exdate'
 
 
 class RRule(ModelSQL, ModelView):
     'Recurrence Rule'
-    _description = __doc__
-    _name = 'calendar.rrule'
+    __name__ = 'calendar.rrule'
     _rec_name = 'freq'
 
     freq = fields.Selection([
@@ -1769,14 +1645,15 @@ class RRule(ModelSQL, ModelView):
         ('sa', 'Saturday'),
         ], 'Week Day', sort=False)
 
-    def __init__(self):
-        super(RRule, self).__init__()
-        self._sql_constraints += [
+    @classmethod
+    def __setup__(cls):
+        super(RRule, cls).__setup__()
+        cls._sql_constraints += [
             ('until_count_only_one',
                 'CHECK(until IS NULL OR count IS NULL OR count = 0)',
                 'Only one of "until" and "count" can be set!'),
-        ]
-        self._constraints += [
+            ]
+        cls._constraints += [
             ('check_bysecond', 'invalid_bysecond'),
             ('check_byminute', 'invalid_byminute'),
             ('check_byhour', 'invalid_byhour'),
@@ -1786,31 +1663,30 @@ class RRule(ModelSQL, ModelView):
             ('check_byweekno', 'invalid_byweekno'),
             ('check_bymonth', 'invalid_bymonth'),
             ('check_bysetpos', 'invalid_bysetpos'),
-        ]
-        self._error_messages.update({
-            'invalid_bysecond': 'Invalid "By Second"',
-            'invalid_byminute': 'Invalid "By Minute"',
-            'invalid_byhour': 'Invalid "By Hour"',
-            'invalid_byday': 'Invalid "By Day"',
-            'invalid_bymonthday': 'Invalid "By Month Day"',
-            'invalid_byyearday': 'Invalid "By Year Day"',
-            'invalid_byweekno': 'Invalid "By Week Number"',
-            'invalid_bymonth': 'Invalid "By Month"',
-            'invalid_bysetpos': 'Invalid "By Position"',
-        })
-
-    def init(self, module_name):
+            ]
+        cls._error_messages.update({
+                'invalid_bysecond': 'Invalid "By Second"',
+                'invalid_byminute': 'Invalid "By Minute"',
+                'invalid_byhour': 'Invalid "By Hour"',
+                'invalid_byday': 'Invalid "By Day"',
+                'invalid_bymonthday': 'Invalid "By Month Day"',
+                'invalid_byyearday': 'Invalid "By Year Day"',
+                'invalid_byweekno': 'Invalid "By Week Number"',
+                'invalid_bymonth': 'Invalid "By Month"',
+                'invalid_bysetpos': 'Invalid "By Position"',
+                })
+
+    @classmethod
+    def __register__(cls, module_name):
         cursor = Transaction().cursor
         # Migrate from 1.4: unit_count replaced by until_count_only_one
-        table = TableHandler(cursor, self, module_name)
+        table = TableHandler(cursor, cls, module_name)
         table.drop_constraint('until_count')
-        return super(RRule, self).init(module_name)
+        return super(RRule, cls).__register__(module_name)
 
-    def check_bysecond(self, ids):
-        for rule in self.browse(ids):
-            if not rule.bysecond:
-                continue
-            for second in rule.bysecond.split(','):
+    def check_bysecond(self):
+        if self.bysecond:
+            for second in self.bysecond.split(','):
                 try:
                     second = int(second)
                 except Exception:
@@ -1819,11 +1695,9 @@ class RRule(ModelSQL, ModelView):
                     return False
         return True
 
-    def check_byminute(self, ids):
-        for rule in self.browse(ids):
-            if not rule.byminute:
-                continue
-            for minute in rule.byminute.split(','):
+    def check_byminute(self):
+        if self.byminute:
+            for minute in self.byminute.split(','):
                 try:
                     minute = int(minute)
                 except Exception:
@@ -1832,11 +1706,9 @@ class RRule(ModelSQL, ModelView):
                     return False
         return True
 
-    def check_byhour(self, ids):
-        for rule in self.browse(ids):
-            if not rule.byhour:
-                continue
-            for hour in rule.byhour.split(','):
+    def check_byhour(self):
+        if self.byhour:
+            for hour in self.byhour.split(','):
                 try:
                     hour = int(hour)
                 except Exception:
@@ -1845,11 +1717,9 @@ class RRule(ModelSQL, ModelView):
                     return False
         return True
 
-    def check_byday(self, ids):
-        for rule in self.browse(ids):
-            if not rule.byday:
-                continue
-            for weekdaynum in rule.byday.split(','):
+    def check_byday(self):
+        if self.byday:
+            for weekdaynum in self.byday.split(','):
                 weekday = weekdaynum[-2:]
                 if weekday not in ('SU', 'MO', 'TU', 'WE', 'TH', 'FR', 'SA'):
                     return False
@@ -1864,11 +1734,9 @@ class RRule(ModelSQL, ModelView):
                     return False
         return True
 
-    def check_bymonthday(self, ids):
-        for rule in self.browse(ids):
-            if not rule.bymonthday:
-                continue
-            for monthdaynum in rule.bymonthday.split(','):
+    def check_bymonthday(self):
+        if self.bymonthday:
+            for monthdaynum in self.bymonthday.split(','):
                 try:
                     monthdaynum = int(monthdaynum)
                 except Exception:
@@ -1877,11 +1745,9 @@ class RRule(ModelSQL, ModelView):
                     return False
         return True
 
-    def check_byyearday(self, ids):
-        for rule in self.browse(ids):
-            if not rule.byyearday:
-                continue
-            for yeardaynum in rule.byyearday.split(','):
+    def check_byyearday(self):
+        if self.byyearday:
+            for yeardaynum in self.byyearday.split(','):
                 try:
                     yeardaynum = int(yeardaynum)
                 except Exception:
@@ -1890,11 +1756,9 @@ class RRule(ModelSQL, ModelView):
                     return False
         return True
 
-    def check_byweekno(self, ids):
-        for rule in self.browse(ids):
-            if not rule.byweekno:
-                continue
-            for weeknum in rule.byweekno.split(','):
+    def check_byweekno(self):
+        if self.byweekno:
+            for weeknum in self.byweekno.split(','):
                 try:
                     weeknum = int(weeknum)
                 except Exception:
@@ -1903,11 +1767,9 @@ class RRule(ModelSQL, ModelView):
                     return False
         return True
 
-    def check_bymonth(self, ids):
-        for rule in self.browse(ids):
-            if not rule.bymonth:
-                continue
-            for monthnum in rule.bymonth.split(','):
+    def check_bymonth(self):
+        if self.bymonth:
+            for monthnum in self.bymonth.split(','):
                 try:
                     monthnum = int(monthnum)
                 except Exception:
@@ -1916,11 +1778,9 @@ class RRule(ModelSQL, ModelView):
                     return False
         return True
 
-    def check_bysetpos(self, ids):
-        for rule in self.browse(ids):
-            if not rule.bysetpos:
-                continue
-            for setposday in rule.bysetpos.split(','):
+    def check_bysetpos(self):
+        if self.bysetpos:
+            for setposday in self.bysetpos.split(','):
                 try:
                     setposday = int(setposday)
                 except Exception:
@@ -1929,20 +1789,18 @@ class RRule(ModelSQL, ModelView):
                     return False
         return True
 
-    def _rule2update(self, rule):
+    def _rule2update(self):
         res = {}
         for field in ('freq', 'until_date', 'until', 'count', 'interval',
                 'bysecond', 'byminute', 'byhour', 'byday', 'bymonthday',
                 'byyearday', 'byweekno', 'bymonth', 'bysetpos', 'wkst'):
-            res[field] = rule[field]
+            res[field] = getattr(self, field)
         return res
 
-    def rule2values(self, rule):
+    @classmethod
+    def rule2values(cls, rule):
         '''
         Convert a rule object into values for create or write
-
-        :param rule: teh rule object
-        :return: a dictionary with values
         '''
         res = {}
         for attr in str(rule.value).replace('\\', '').split(';'):
@@ -1969,42 +1827,35 @@ class RRule(ModelSQL, ModelView):
                 res[field] = value
         return res
 
-    def rule2rule(self, rule):
+    def rule2rule(self):
         '''
         Return a rule string for rule
-
-        :param rule: a BrowseRecord of calendar.rrule or
-            calendar.exrule
-        :return: a string
         '''
-        res = 'FREQ=' + rule.freq.upper()
-        if rule.until:
+        res = 'FREQ=' + self.freq.upper()
+        if self.until:
             res += ';UNTIL='
-            if rule.until_date:
-                res += vobject.icalendar.dateToString(rule.until.date())
+            if self.until_date:
+                res += vobject.icalendar.dateToString(self.until.date())
             else:
-                res += vobject.icalendar.dateTimeToString(rule.until\
+                res += vobject.icalendar.dateTimeToString(self.until\
                         .replace(tzinfo=tzlocal).astimezone(tzutc),
                         convertToUTC=True)
-        elif rule.count:
-            res += ';COUNT=' + str(rule.count)
+        elif self.count:
+            res += ';COUNT=' + str(self.count)
         for field in ('freq', 'wkst'):
-            if rule[field]:
-                res += ';' + field.upper() + '=' + rule[field].upper()
+            if getattr(self, field):
+                res += ';' + field.upper() + '=' + getattr(self, field).upper()
         for field in ('interval', 'bysecond', 'byminute', 'byhour',
                 'byday', 'bymonthday', 'byyearday', 'byweekno',
                 'bymonth', 'bysetpos'):
-            if rule[field]:
-                res += ';' + field.upper() + '=' + str(rule[field])
+            if getattr(self, field):
+                res += ';' + field.upper() + '=' + str(getattr(self, field))
         return res
 
-RRule()
-
 
 class EventRRule(ModelSQL, ModelView):
     'Recurrence Rule'
-    _description = __doc__
-    _name = 'calendar.event.rrule'
+    __name__ = 'calendar.event.rrule'
     _inherits = {'calendar.rrule': 'calendar_rrule'}
     _rec_name = 'freq'
 
@@ -2013,59 +1864,52 @@ class EventRRule(ModelSQL, ModelView):
     event = fields.Many2One('calendar.event', 'Event', ondelete='CASCADE',
             select=True, required=True)
 
-    def create(self, values):
-        event_obj = Pool().get('calendar.event')
+    @classmethod
+    def create(cls, values):
+        Event = Pool().get('calendar.event')
         if values.get('event'):
             # Update write_date of event
-            event_obj.write(values['event'], {})
-        return super(EventRRule, self).create(values)
-
-    def write(self, ids, values):
-        event_obj = Pool().get('calendar.event')
-        if isinstance(ids, (int, long)):
-            ids = [ids]
-        event_ids = [x.event.id for x in self.browse(ids)]
+            Event.write([Event(values['event'])], {})
+        return super(EventRRule, cls).create(values)
+
+    @classmethod
+    def write(cls, event_rrules, values):
+        Event = Pool().get('calendar.event')
+        events = [x.event for x in event_rrules]
         if values.get('event'):
-            event_ids.append(values['event'])
-        if event_ids:
+            events.append(Event(values['event']))
+        if events:
             # Update write_date of event
-            event_obj.write(event_ids, {})
-        return super(EventRRule, self).write(ids, values)
-
-    def delete(self, ids):
-        event_obj = Pool().get('calendar.event')
-        rrule_obj = Pool().get('calendar.rrule')
-        if isinstance(ids, (int, long)):
-            ids = [ids]
-        event_rrules = self.browse(ids)
-        rrule_ids = [a.calendar_rrule.id for a in event_rrules]
-        event_ids = [x.event.id for x in event_rrules]
-        if event_ids:
+            Event.write(events, {})
+        super(EventRRule, cls).write(event_rrules, values)
+
+    @classmethod
+    def delete(cls, event_rrules):
+        pool = Pool()
+        Event = pool.get('calendar.event')
+        Rrule = pool.get('calendar.rrule')
+        rrules = [a.calendar_rrule for a in event_rrules]
+        events = [x.event for x in event_rrules]
+        if events:
             # Update write_date of event
-            event_obj.write(event_ids, {})
-        res = super(EventRRule, self).delete(ids)
-        if rrule_ids:
-            rrule_obj.delete(rrule_ids)
-        return res
+            Event.write(events, {})
+        super(EventRRule, cls).delete(event_rrules)
+        if rrules:
+            Rrule.delete(rrules)
 
-    def _rule2update(self, rule):
-        rule_obj = Pool().get('calendar.rrule')
-        return rule_obj._rule2update(rule)
+    def _rule2update(self):
+        return self.calendar_rrule._rule2update()
 
+    @classmethod
     def rule2values(self, rule):
-        rule_obj = Pool().get('calendar.rrule')
-        return rule_obj.rule2values(rule)
+        Rule = Pool().get('calendar.rrule')
+        return Rule.rule2values(rule)
 
-    def rule2rule(self, rule):
-        rule_obj = Pool().get('calendar.rrule')
-        return rule_obj.rule2rule(rule)
-
-EventRRule()
+    def rule2rule(self):
+        return self.calendar_rrule.rule2rule()
 
 
 class EventExRule(EventRRule):
     'Exception Rule'
-    _description = __doc__
-    _name = 'calendar.event.exrule'
-
-EventExRule()
+    __name__ = 'calendar.event.exrule'
+    _table = 'calendar_event_exrule'  # Needed to override EventRRule._table
diff --git a/locale/ca_ES.po b/locale/ca_ES.po
index bb1658b..5dd0706 100644
--- a/locale/ca_ES.po
+++ b/locale/ca_ES.po
@@ -68,16 +68,15 @@ msgstr "Només es pot usar o «Fins a» o «Nombre de vegades»"
 
 msgctxt "field:calendar.alarm,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Data creació"
 
-#, fuzzy
 msgctxt "field:calendar.alarm,create_uid:"
 msgid "Create User"
-msgstr "Crear usuari"
+msgstr "Usuari creació"
 
 msgctxt "field:calendar.alarm,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:calendar.alarm,rec_name:"
 msgid "Name"
@@ -89,24 +88,23 @@ msgstr "valarm"
 
 msgctxt "field:calendar.alarm,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Data modificació"
 
 msgctxt "field:calendar.alarm,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Usuari modificació"
 
 msgctxt "field:calendar.attendee,attendee:"
 msgid "attendee"
-msgstr "assistents"
+msgstr "assistent"
 
 msgctxt "field:calendar.attendee,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Data creació"
 
-#, fuzzy
 msgctxt "field:calendar.attendee,create_uid:"
 msgid "Create User"
-msgstr "Crear usuari"
+msgstr "Usuari creació"
 
 msgctxt "field:calendar.attendee,email:"
 msgid "Email"
@@ -114,7 +112,7 @@ msgstr "Correu electrònic"
 
 msgctxt "field:calendar.attendee,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:calendar.attendee,rec_name:"
 msgid "Name"
@@ -126,20 +124,19 @@ msgstr "Estat de participació"
 
 msgctxt "field:calendar.attendee,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Data modificació"
 
 msgctxt "field:calendar.attendee,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Usuari modificació"
 
 msgctxt "field:calendar.calendar,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Data creació"
 
-#, fuzzy
 msgctxt "field:calendar.calendar,create_uid:"
 msgid "Create User"
-msgstr "Crear usuari"
+msgstr "Usuari creació"
 
 msgctxt "field:calendar.calendar,description:"
 msgid "Description"
@@ -147,7 +144,7 @@ msgstr "Descripció"
 
 msgctxt "field:calendar.calendar,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:calendar.calendar,name:"
 msgid "Name"
@@ -155,7 +152,7 @@ msgstr "Nom"
 
 msgctxt "field:calendar.calendar,owner:"
 msgid "Owner"
-msgstr "Amo"
+msgstr "Propietari"
 
 msgctxt "field:calendar.calendar,read_users:"
 msgid "Read Users"
@@ -167,11 +164,11 @@ msgstr "Nom"
 
 msgctxt "field:calendar.calendar,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Data modificació"
 
 msgctxt "field:calendar.calendar,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Usuari modificació"
 
 msgctxt "field:calendar.calendar,write_users:"
 msgid "Write Users"
@@ -183,16 +180,15 @@ msgstr "Calendari"
 
 msgctxt "field:calendar.calendar-read-res.user,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Data creació"
 
-#, fuzzy
 msgctxt "field:calendar.calendar-read-res.user,create_uid:"
 msgid "Create User"
-msgstr "Crear usuari"
+msgstr "Usuari creació"
 
 msgctxt "field:calendar.calendar-read-res.user,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:calendar.calendar-read-res.user,rec_name:"
 msgid "Name"
@@ -204,11 +200,11 @@ msgstr "Usuari"
 
 msgctxt "field:calendar.calendar-read-res.user,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Data modificació"
 
 msgctxt "field:calendar.calendar-read-res.user,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Usuari modificació"
 
 msgctxt "field:calendar.calendar-write-res.user,calendar:"
 msgid "Calendar"
@@ -216,16 +212,15 @@ msgstr "Calendari"
 
 msgctxt "field:calendar.calendar-write-res.user,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Data creació"
 
-#, fuzzy
 msgctxt "field:calendar.calendar-write-res.user,create_uid:"
 msgid "Create User"
-msgstr "Crear usuari"
+msgstr "Usuari creació"
 
 msgctxt "field:calendar.calendar-write-res.user,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:calendar.calendar-write-res.user,rec_name:"
 msgid "Name"
@@ -237,24 +232,23 @@ msgstr "Usuari"
 
 msgctxt "field:calendar.calendar-write-res.user,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Data modificació"
 
 msgctxt "field:calendar.calendar-write-res.user,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Usuari modificació"
 
 msgctxt "field:calendar.category,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Data creació"
 
-#, fuzzy
 msgctxt "field:calendar.category,create_uid:"
 msgid "Create User"
-msgstr "Crear usuari"
+msgstr "Usuari creació"
 
 msgctxt "field:calendar.category,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:calendar.category,name:"
 msgid "Name"
@@ -266,47 +260,43 @@ msgstr "Nom"
 
 msgctxt "field:calendar.category,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Data modificació"
 
 msgctxt "field:calendar.category,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Usuari modificació"
 
 msgctxt "field:calendar.date,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Data creació"
 
-#, fuzzy
 msgctxt "field:calendar.date,create_uid:"
 msgid "Create User"
-msgstr "Crear usuari"
+msgstr "Usuari creació"
 
-#, fuzzy
 msgctxt "field:calendar.date,date:"
 msgid "Is Date"
 msgstr "És data"
 
-#, fuzzy
 msgctxt "field:calendar.date,datetime:"
 msgid "Date"
 msgstr "Data"
 
 msgctxt "field:calendar.date,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
-#, fuzzy
 msgctxt "field:calendar.date,rec_name:"
 msgid "Name"
-msgstr "Nom del camp"
+msgstr "Nom"
 
 msgctxt "field:calendar.date,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Data modificació"
 
 msgctxt "field:calendar.date,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Usuari modificació"
 
 msgctxt "field:calendar.event,alarms:"
 msgid "Alarms"
@@ -326,7 +316,7 @@ msgstr "Calendari"
 
 msgctxt "field:calendar.event,calendar_owner:"
 msgid "Owner"
-msgstr "Amo"
+msgstr "Propietari"
 
 msgctxt "field:calendar.event,calendar_read_users:"
 msgid "Read Users"
@@ -346,12 +336,11 @@ msgstr "Classificació"
 
 msgctxt "field:calendar.event,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Data creació"
 
-#, fuzzy
 msgctxt "field:calendar.event,create_uid:"
 msgid "Create User"
-msgstr "Crear usuari"
+msgstr "Usuari creació"
 
 msgctxt "field:calendar.event,description:"
 msgid "Description"
@@ -375,7 +364,7 @@ msgstr "Regles d'excepció"
 
 msgctxt "field:calendar.event,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:calendar.event,location:"
 msgid "Location"
@@ -439,11 +428,11 @@ msgstr "vevent"
 
 msgctxt "field:calendar.event,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Data modificació"
 
 msgctxt "field:calendar.event,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Usuari modificació"
 
 msgctxt "field:calendar.event-calendar.category,category:"
 msgid "Category"
@@ -451,12 +440,11 @@ msgstr "Categoria"
 
 msgctxt "field:calendar.event-calendar.category,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Data creació"
 
-#, fuzzy
 msgctxt "field:calendar.event-calendar.category,create_uid:"
 msgid "Create User"
-msgstr "Crear usuari"
+msgstr "Usuari creació"
 
 msgctxt "field:calendar.event-calendar.category,event:"
 msgid "Event"
@@ -464,7 +452,7 @@ msgstr "Esdeveniment"
 
 msgctxt "field:calendar.event-calendar.category,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:calendar.event-calendar.category,rec_name:"
 msgid "Name"
@@ -472,11 +460,11 @@ msgstr "Nom"
 
 msgctxt "field:calendar.event-calendar.category,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Data modificació"
 
 msgctxt "field:calendar.event-calendar.category,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Usuari modificació"
 
 msgctxt "field:calendar.event.alarm,calendar_alarm:"
 msgid "Calendar Alarm"
@@ -484,12 +472,11 @@ msgstr "Alarma del calendari"
 
 msgctxt "field:calendar.event.alarm,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Data creació"
 
-#, fuzzy
 msgctxt "field:calendar.event.alarm,create_uid:"
 msgid "Create User"
-msgstr "Crear usuari"
+msgstr "Usuari creació"
 
 msgctxt "field:calendar.event.alarm,event:"
 msgid "Event"
@@ -497,7 +484,7 @@ msgstr "Esdeveniment"
 
 msgctxt "field:calendar.event.alarm,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:calendar.event.alarm,rec_name:"
 msgid "Name"
@@ -505,11 +492,11 @@ msgstr "Nom"
 
 msgctxt "field:calendar.event.alarm,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Data modificació"
 
 msgctxt "field:calendar.event.alarm,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Usuari modificació"
 
 msgctxt "field:calendar.event.attendee,calendar_attendee:"
 msgid "Calendar Attendee"
@@ -517,12 +504,11 @@ msgstr "Calendari d'assistents"
 
 msgctxt "field:calendar.event.attendee,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Data creació"
 
-#, fuzzy
 msgctxt "field:calendar.event.attendee,create_uid:"
 msgid "Create User"
-msgstr "Crear usuari"
+msgstr "Usuari creació"
 
 msgctxt "field:calendar.event.attendee,event:"
 msgid "Event"
@@ -530,7 +516,7 @@ msgstr "Esdeveniment"
 
 msgctxt "field:calendar.event.attendee,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:calendar.event.attendee,rec_name:"
 msgid "Name"
@@ -538,24 +524,23 @@ msgstr "Nom"
 
 msgctxt "field:calendar.event.attendee,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Data modificació"
 
 msgctxt "field:calendar.event.attendee,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Usuari modificació"
 
 msgctxt "field:calendar.event.exdate,calendar_date:"
 msgid "Calendar Date"
-msgstr ""
+msgstr "Data calendari"
 
 msgctxt "field:calendar.event.exdate,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Data creació"
 
-#, fuzzy
 msgctxt "field:calendar.event.exdate,create_uid:"
 msgid "Create User"
-msgstr "Crear usuari"
+msgstr "Usuari creació"
 
 msgctxt "field:calendar.event.exdate,event:"
 msgid "Event"
@@ -563,7 +548,7 @@ msgstr "Esdeveniment"
 
 msgctxt "field:calendar.event.exdate,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:calendar.event.exdate,rec_name:"
 msgid "Name"
@@ -571,11 +556,11 @@ msgstr "Nom"
 
 msgctxt "field:calendar.event.exdate,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Data modificació"
 
 msgctxt "field:calendar.event.exdate,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Usuari modificació"
 
 msgctxt "field:calendar.event.exrule,calendar_rrule:"
 msgid "Calendar RRule"
@@ -583,12 +568,11 @@ msgstr "Regla de recurrència"
 
 msgctxt "field:calendar.event.exrule,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Data creació"
 
-#, fuzzy
 msgctxt "field:calendar.event.exrule,create_uid:"
 msgid "Create User"
-msgstr "Crear usuari"
+msgstr "Usuari creació"
 
 msgctxt "field:calendar.event.exrule,event:"
 msgid "Event"
@@ -596,7 +580,7 @@ msgstr "Esdeveniment"
 
 msgctxt "field:calendar.event.exrule,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:calendar.event.exrule,rec_name:"
 msgid "Name"
@@ -604,24 +588,23 @@ msgstr "Nom"
 
 msgctxt "field:calendar.event.exrule,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Data modificació"
 
 msgctxt "field:calendar.event.exrule,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Usuari modificació"
 
 msgctxt "field:calendar.event.rdate,calendar_date:"
 msgid "Calendar Date"
-msgstr ""
+msgstr "Data calendari"
 
 msgctxt "field:calendar.event.rdate,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Data creació"
 
-#, fuzzy
 msgctxt "field:calendar.event.rdate,create_uid:"
 msgid "Create User"
-msgstr "Crear usuari"
+msgstr "Usuari creació"
 
 msgctxt "field:calendar.event.rdate,event:"
 msgid "Event"
@@ -629,7 +612,7 @@ msgstr "Esdeveniment"
 
 msgctxt "field:calendar.event.rdate,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:calendar.event.rdate,rec_name:"
 msgid "Name"
@@ -637,11 +620,11 @@ msgstr "Nom"
 
 msgctxt "field:calendar.event.rdate,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Data modificació"
 
 msgctxt "field:calendar.event.rdate,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Usuari modificació"
 
 msgctxt "field:calendar.event.rrule,calendar_rrule:"
 msgid "Calendar RRule"
@@ -649,12 +632,11 @@ msgstr "Regla de recurrència"
 
 msgctxt "field:calendar.event.rrule,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Data creació"
 
-#, fuzzy
 msgctxt "field:calendar.event.rrule,create_uid:"
 msgid "Create User"
-msgstr "Crear usuari"
+msgstr "Usuari creació"
 
 msgctxt "field:calendar.event.rrule,event:"
 msgid "Event"
@@ -662,7 +644,7 @@ msgstr "Esdeveniment"
 
 msgctxt "field:calendar.event.rrule,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:calendar.event.rrule,rec_name:"
 msgid "Name"
@@ -670,24 +652,23 @@ msgstr "Nom"
 
 msgctxt "field:calendar.event.rrule,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Data modificació"
 
 msgctxt "field:calendar.event.rrule,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Usuari modificació"
 
 msgctxt "field:calendar.location,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Data creació"
 
-#, fuzzy
 msgctxt "field:calendar.location,create_uid:"
 msgid "Create User"
-msgstr "Crear usuari"
+msgstr "Usuari creació"
 
 msgctxt "field:calendar.location,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:calendar.location,name:"
 msgid "Name"
@@ -699,11 +680,11 @@ msgstr "Nom"
 
 msgctxt "field:calendar.location,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Data modificació"
 
 msgctxt "field:calendar.location,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Usuari modificació"
 
 msgctxt "field:calendar.rrule,byday:"
 msgid "By Day"
@@ -747,12 +728,11 @@ msgstr "Nombre de vegades"
 
 msgctxt "field:calendar.rrule,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Data creació"
 
-#, fuzzy
 msgctxt "field:calendar.rrule,create_uid:"
 msgid "Create User"
-msgstr "Crear usuari"
+msgstr "Usuari creació"
 
 msgctxt "field:calendar.rrule,freq:"
 msgid "Frequency"
@@ -760,7 +740,7 @@ msgstr "Freqüència"
 
 msgctxt "field:calendar.rrule,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:calendar.rrule,interval:"
 msgid "Interval"
@@ -784,11 +764,11 @@ msgstr "Dia de la setmana"
 
 msgctxt "field:calendar.rrule,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Data modificació"
 
 msgctxt "field:calendar.rrule,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Usuari modificació"
 
 msgctxt "field:res.user,calendars:"
 msgid "Calendars"
@@ -800,7 +780,7 @@ msgstr "L'usuari ha de tenir un correu electrònic"
 
 msgctxt "help:calendar.date,date:"
 msgid "Ignore time of field \"Date\", but handle as date only."
-msgstr ""
+msgstr "Ignora l'hora del camp \"Data\" i tracta només la data."
 
 msgctxt "help:calendar.event,uuid:"
 msgid "Universally Unique Identifier"
@@ -816,7 +796,7 @@ msgstr "Alarma"
 
 msgctxt "model:calendar.attendee,name:"
 msgid "Attendee"
-msgstr "Assistents"
+msgstr "Assistent"
 
 msgctxt "model:calendar.calendar,name:"
 msgid "Calendar"
@@ -824,11 +804,11 @@ msgstr "Calendari"
 
 msgctxt "model:calendar.calendar-read-res.user,name:"
 msgid "Calendar - read - User"
-msgstr "Calendari - llegir - usuari"
+msgstr "Calendari - lectura - usuari"
 
 msgctxt "model:calendar.calendar-write-res.user,name:"
 msgid "Calendar - write - User"
-msgstr "Calendari - escriure - usuari"
+msgstr "Calendari - escriptura - usuari"
 
 msgctxt "model:calendar.category,name:"
 msgid "Category"
@@ -836,7 +816,7 @@ msgstr "Categoria"
 
 msgctxt "model:calendar.date,name:"
 msgid "Calendar Date"
-msgstr ""
+msgstr "Data calendari"
 
 msgctxt "model:calendar.event,name:"
 msgid "Event"
@@ -852,7 +832,7 @@ msgstr "Alarma"
 
 msgctxt "model:calendar.event.attendee,name:"
 msgid "Attendee"
-msgstr "Assistents"
+msgstr "Assistent"
 
 msgctxt "model:calendar.event.exdate,name:"
 msgid "Exception Date"
@@ -886,15 +866,13 @@ msgctxt "model:ir.action,name:act_event_form"
 msgid "Events"
 msgstr "Esdeveniments"
 
-#, fuzzy
 msgctxt "model:ir.action,name:act_event_form3"
 msgid "Events"
 msgstr "Esdeveniments"
 
-#, fuzzy
 msgctxt "model:ir.ui.menu,name:menu_calendar"
 msgid "Calendar"
-msgstr "Gestió de calendari"
+msgstr "Calendaris"
 
 msgctxt "model:ir.ui.menu,name:menu_calendar_form"
 msgid "Calendars"
@@ -908,9 +886,10 @@ msgctxt "model:res.group,name:group_calendar_admin"
 msgid "Calendar Administration"
 msgstr "Administració de calendari"
 
+#, fuzzy
 msgctxt "selection:calendar.attendee,status:"
 msgid ""
-msgstr ""
+msgstr "Recreat"
 
 msgctxt "selection:calendar.attendee,status:"
 msgid "Accepted"
@@ -944,9 +923,10 @@ msgctxt "selection:calendar.event,classification:"
 msgid "Public"
 msgstr "Públic"
 
+#, fuzzy
 msgctxt "selection:calendar.event,status:"
 msgid ""
-msgstr ""
+msgstr "Recreat"
 
 msgctxt "selection:calendar.event,status:"
 msgid "Cancelled"
@@ -1050,7 +1030,7 @@ msgstr "Categoria"
 
 msgctxt "view:calendar.event.attendee:"
 msgid "Attendee"
-msgstr "Assistents"
+msgstr "Assistent"
 
 msgctxt "view:calendar.event.attendee:"
 msgid "Attendees"
diff --git a/locale/es_CO.po b/locale/es_CO.po
index 707e3dc..eaf3e4d 100644
--- a/locale/es_CO.po
+++ b/locale/es_CO.po
@@ -28,56 +28,55 @@ msgstr "¡El nombre del lugar del calendario debe ser único!"
 
 msgctxt "error:calendar.rrule:"
 msgid "Invalid \"By Day\""
-msgstr ""
+msgstr "Inválido \"Por Día\""
 
 msgctxt "error:calendar.rrule:"
 msgid "Invalid \"By Hour\""
-msgstr ""
+msgstr "Inválido \"Por Hora\""
 
 msgctxt "error:calendar.rrule:"
 msgid "Invalid \"By Minute\""
-msgstr ""
+msgstr "Inválido \"Por Minuto\""
 
 msgctxt "error:calendar.rrule:"
 msgid "Invalid \"By Month Day\""
-msgstr ""
+msgstr "Inválido \"Por Día del Mes\""
 
 msgctxt "error:calendar.rrule:"
 msgid "Invalid \"By Month\""
-msgstr ""
+msgstr "Inválido \"Por Mes\""
 
 msgctxt "error:calendar.rrule:"
 msgid "Invalid \"By Position\""
-msgstr ""
+msgstr "Inválido \"Por Posición\""
 
 msgctxt "error:calendar.rrule:"
 msgid "Invalid \"By Second\""
-msgstr ""
+msgstr "Inválido \"Por Segundo\""
 
 msgctxt "error:calendar.rrule:"
 msgid "Invalid \"By Week Number\""
-msgstr ""
+msgstr "Inválido \"Por Número de Semana\""
 
 msgctxt "error:calendar.rrule:"
 msgid "Invalid \"By Year Day\""
-msgstr ""
+msgstr "Inválido \"Por Día del Año\""
 
 msgctxt "error:calendar.rrule:"
 msgid "Only one of \"until\" and \"count\" can be set!"
-msgstr ""
+msgstr "Solo un \"hasta\" y \"contar\" pude ser establecido!"
 
 msgctxt "field:calendar.alarm,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Fecha de Creación"
 
-#, fuzzy
 msgctxt "field:calendar.alarm,create_uid:"
 msgid "Create User"
-msgstr "Crear usuario"
+msgstr "Creado por Usuario"
 
 msgctxt "field:calendar.alarm,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:calendar.alarm,rec_name:"
 msgid "Name"
@@ -85,28 +84,27 @@ msgstr "Nombre"
 
 msgctxt "field:calendar.alarm,valarm:"
 msgid "valarm"
-msgstr ""
+msgstr "valarma"
 
 msgctxt "field:calendar.alarm,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Fecha de Modificación"
 
 msgctxt "field:calendar.alarm,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Modificado por Usuario"
 
 msgctxt "field:calendar.attendee,attendee:"
 msgid "attendee"
-msgstr ""
+msgstr "Asistente"
 
 msgctxt "field:calendar.attendee,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Fecha de Creación"
 
-#, fuzzy
 msgctxt "field:calendar.attendee,create_uid:"
 msgid "Create User"
-msgstr "Crear usuario"
+msgstr "Creado por Usuario"
 
 msgctxt "field:calendar.attendee,email:"
 msgid "Email"
@@ -114,7 +112,7 @@ msgstr "Correo Electrónico"
 
 msgctxt "field:calendar.attendee,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:calendar.attendee,rec_name:"
 msgid "Name"
@@ -122,24 +120,23 @@ msgstr "Nombre"
 
 msgctxt "field:calendar.attendee,status:"
 msgid "Participation Status"
-msgstr ""
+msgstr "Estado de Participación"
 
 msgctxt "field:calendar.attendee,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Fecha de Modificación"
 
 msgctxt "field:calendar.attendee,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Modificado por Usuario"
 
 msgctxt "field:calendar.calendar,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Fecha de Creación"
 
-#, fuzzy
 msgctxt "field:calendar.calendar,create_uid:"
 msgid "Create User"
-msgstr "Crear usuario"
+msgstr "Creado por Usuario"
 
 msgctxt "field:calendar.calendar,description:"
 msgid "Description"
@@ -147,7 +144,7 @@ msgstr "Descripción"
 
 msgctxt "field:calendar.calendar,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:calendar.calendar,name:"
 msgid "Name"
@@ -167,15 +164,15 @@ msgstr "Nombre"
 
 msgctxt "field:calendar.calendar,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Fecha de Modificación"
 
 msgctxt "field:calendar.calendar,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Modificado por Usuario"
 
 msgctxt "field:calendar.calendar,write_users:"
 msgid "Write Users"
-msgstr "Escribir Usuarios"
+msgstr "Modificado por Usuario"
 
 msgctxt "field:calendar.calendar-read-res.user,calendar:"
 msgid "Calendar"
@@ -183,16 +180,15 @@ msgstr "Calendario"
 
 msgctxt "field:calendar.calendar-read-res.user,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Fecha de Creación"
 
-#, fuzzy
 msgctxt "field:calendar.calendar-read-res.user,create_uid:"
 msgid "Create User"
-msgstr "Crear usuario"
+msgstr "Creado por Usuario"
 
 msgctxt "field:calendar.calendar-read-res.user,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:calendar.calendar-read-res.user,rec_name:"
 msgid "Name"
@@ -204,11 +200,11 @@ msgstr "Usuario"
 
 msgctxt "field:calendar.calendar-read-res.user,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Fecha de Modificación"
 
 msgctxt "field:calendar.calendar-read-res.user,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Modificado por Usuario"
 
 msgctxt "field:calendar.calendar-write-res.user,calendar:"
 msgid "Calendar"
@@ -216,16 +212,15 @@ msgstr "Calendario"
 
 msgctxt "field:calendar.calendar-write-res.user,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Fecha de Creación"
 
-#, fuzzy
 msgctxt "field:calendar.calendar-write-res.user,create_uid:"
 msgid "Create User"
-msgstr "Crear usuario"
+msgstr "Creado por Usuario"
 
 msgctxt "field:calendar.calendar-write-res.user,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:calendar.calendar-write-res.user,rec_name:"
 msgid "Name"
@@ -237,24 +232,23 @@ msgstr "Usuario"
 
 msgctxt "field:calendar.calendar-write-res.user,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Fecha de Modificación"
 
 msgctxt "field:calendar.calendar-write-res.user,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Modificado por Usuario"
 
 msgctxt "field:calendar.category,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Fecha de Creación"
 
-#, fuzzy
 msgctxt "field:calendar.category,create_uid:"
 msgid "Create User"
-msgstr "Crear usuario"
+msgstr "Creado por Usuario"
 
 msgctxt "field:calendar.category,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:calendar.category,name:"
 msgid "Name"
@@ -266,46 +260,43 @@ msgstr "Nombre"
 
 msgctxt "field:calendar.category,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Fecha de Modificación"
 
 msgctxt "field:calendar.category,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Modificado por Usuario"
 
 msgctxt "field:calendar.date,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Fecha de Creación"
 
-#, fuzzy
 msgctxt "field:calendar.date,create_uid:"
 msgid "Create User"
-msgstr "Crear usuario"
+msgstr "Creado por Usuario"
 
 msgctxt "field:calendar.date,date:"
 msgid "Is Date"
 msgstr "Es Fecha"
 
-#, fuzzy
 msgctxt "field:calendar.date,datetime:"
 msgid "Date"
 msgstr "Fecha"
 
 msgctxt "field:calendar.date,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
-#, fuzzy
 msgctxt "field:calendar.date,rec_name:"
 msgid "Name"
-msgstr "Nombre de Contacto"
+msgstr "Nombre"
 
 msgctxt "field:calendar.date,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Fecha de Modificación"
 
 msgctxt "field:calendar.date,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Modificado por Usuario"
 
 msgctxt "field:calendar.event,alarms:"
 msgid "Alarms"
@@ -333,7 +324,7 @@ msgstr "Usuarios que pueden Leer"
 
 msgctxt "field:calendar.event,calendar_write_users:"
 msgid "Write Users"
-msgstr "Escribir Usuarios"
+msgstr "Modificado por Usuario"
 
 msgctxt "field:calendar.event,categories:"
 msgid "Categories"
@@ -345,12 +336,11 @@ msgstr "Clasificación"
 
 msgctxt "field:calendar.event,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Fecha de Creación"
 
-#, fuzzy
 msgctxt "field:calendar.event,create_uid:"
 msgid "Create User"
-msgstr "Crear usuario"
+msgstr "Creado por Usuario"
 
 msgctxt "field:calendar.event,description:"
 msgid "Description"
@@ -374,13 +364,12 @@ msgstr "Reglas de Excepción"
 
 msgctxt "field:calendar.event,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:calendar.event,location:"
 msgid "Location"
 msgstr "Lugar"
 
-#, fuzzy
 msgctxt "field:calendar.event,occurences:"
 msgid "Occurences"
 msgstr "Ocurrencias"
@@ -439,11 +428,11 @@ msgstr "vevento"
 
 msgctxt "field:calendar.event,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Fecha de Modificación"
 
 msgctxt "field:calendar.event,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Modificado por Usuario"
 
 msgctxt "field:calendar.event-calendar.category,category:"
 msgid "Category"
@@ -451,12 +440,11 @@ msgstr "Categoría"
 
 msgctxt "field:calendar.event-calendar.category,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Fecha de Creación"
 
-#, fuzzy
 msgctxt "field:calendar.event-calendar.category,create_uid:"
 msgid "Create User"
-msgstr "Crear usuario"
+msgstr "Creado por Usuario"
 
 msgctxt "field:calendar.event-calendar.category,event:"
 msgid "Event"
@@ -464,7 +452,7 @@ msgstr "Evento"
 
 msgctxt "field:calendar.event-calendar.category,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:calendar.event-calendar.category,rec_name:"
 msgid "Name"
@@ -472,24 +460,23 @@ msgstr "Nombre"
 
 msgctxt "field:calendar.event-calendar.category,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Fecha de Modificación"
 
 msgctxt "field:calendar.event-calendar.category,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Modificado por Usuario"
 
 msgctxt "field:calendar.event.alarm,calendar_alarm:"
 msgid "Calendar Alarm"
-msgstr ""
+msgstr "Alarma del Calendario"
 
 msgctxt "field:calendar.event.alarm,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Fecha de Creación"
 
-#, fuzzy
 msgctxt "field:calendar.event.alarm,create_uid:"
 msgid "Create User"
-msgstr "Crear usuario"
+msgstr "Creado por Usuario"
 
 msgctxt "field:calendar.event.alarm,event:"
 msgid "Event"
@@ -497,7 +484,7 @@ msgstr "Evento"
 
 msgctxt "field:calendar.event.alarm,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:calendar.event.alarm,rec_name:"
 msgid "Name"
@@ -505,24 +492,23 @@ msgstr "Nombre"
 
 msgctxt "field:calendar.event.alarm,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Fecha de Modificación"
 
 msgctxt "field:calendar.event.alarm,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Modificado por Usuario"
 
 msgctxt "field:calendar.event.attendee,calendar_attendee:"
 msgid "Calendar Attendee"
-msgstr ""
+msgstr "Asistente de Calendario "
 
 msgctxt "field:calendar.event.attendee,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Fecha de Creación"
 
-#, fuzzy
 msgctxt "field:calendar.event.attendee,create_uid:"
 msgid "Create User"
-msgstr "Crear usuario"
+msgstr "Creado por Usuario"
 
 msgctxt "field:calendar.event.attendee,event:"
 msgid "Event"
@@ -530,7 +516,7 @@ msgstr "Evento"
 
 msgctxt "field:calendar.event.attendee,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:calendar.event.attendee,rec_name:"
 msgid "Name"
@@ -538,11 +524,11 @@ msgstr "Nombre"
 
 msgctxt "field:calendar.event.attendee,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Fecha de Modificación"
 
 msgctxt "field:calendar.event.attendee,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Modificado por Usuario"
 
 msgctxt "field:calendar.event.exdate,calendar_date:"
 msgid "Calendar Date"
@@ -550,12 +536,11 @@ msgstr "Fecha Calendario"
 
 msgctxt "field:calendar.event.exdate,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Fecha de Creación"
 
-#, fuzzy
 msgctxt "field:calendar.event.exdate,create_uid:"
 msgid "Create User"
-msgstr "Crear usuario"
+msgstr "Creado por Usuario"
 
 msgctxt "field:calendar.event.exdate,event:"
 msgid "Event"
@@ -563,7 +548,7 @@ msgstr "Evento"
 
 msgctxt "field:calendar.event.exdate,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:calendar.event.exdate,rec_name:"
 msgid "Name"
@@ -571,24 +556,23 @@ msgstr "Nombre"
 
 msgctxt "field:calendar.event.exdate,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Fecha de Modificación"
 
 msgctxt "field:calendar.event.exdate,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Modificado por Usuario"
 
 msgctxt "field:calendar.event.exrule,calendar_rrule:"
 msgid "Calendar RRule"
-msgstr ""
+msgstr "Regla de Calendario"
 
 msgctxt "field:calendar.event.exrule,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Fecha de Creación"
 
-#, fuzzy
 msgctxt "field:calendar.event.exrule,create_uid:"
 msgid "Create User"
-msgstr "Crear usuario"
+msgstr "Creado por Usuario"
 
 msgctxt "field:calendar.event.exrule,event:"
 msgid "Event"
@@ -596,7 +580,7 @@ msgstr "Evento"
 
 msgctxt "field:calendar.event.exrule,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:calendar.event.exrule,rec_name:"
 msgid "Name"
@@ -604,11 +588,11 @@ msgstr "Nombre"
 
 msgctxt "field:calendar.event.exrule,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Fecha de Modificación"
 
 msgctxt "field:calendar.event.exrule,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Modificado por Usuario"
 
 msgctxt "field:calendar.event.rdate,calendar_date:"
 msgid "Calendar Date"
@@ -616,12 +600,11 @@ msgstr "Fecha Calendario"
 
 msgctxt "field:calendar.event.rdate,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Fecha de Creación"
 
-#, fuzzy
 msgctxt "field:calendar.event.rdate,create_uid:"
 msgid "Create User"
-msgstr "Crear usuario"
+msgstr "Creado por Usuario"
 
 msgctxt "field:calendar.event.rdate,event:"
 msgid "Event"
@@ -629,7 +612,7 @@ msgstr "Evento"
 
 msgctxt "field:calendar.event.rdate,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:calendar.event.rdate,rec_name:"
 msgid "Name"
@@ -637,24 +620,23 @@ msgstr "Nombre"
 
 msgctxt "field:calendar.event.rdate,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Fecha de Modificación"
 
 msgctxt "field:calendar.event.rdate,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Modificado por Usuario"
 
 msgctxt "field:calendar.event.rrule,calendar_rrule:"
 msgid "Calendar RRule"
-msgstr ""
+msgstr "Regla de Calendario"
 
 msgctxt "field:calendar.event.rrule,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Fecha de Creación"
 
-#, fuzzy
 msgctxt "field:calendar.event.rrule,create_uid:"
 msgid "Create User"
-msgstr "Crear usuario"
+msgstr "Creado por Usuario"
 
 msgctxt "field:calendar.event.rrule,event:"
 msgid "Event"
@@ -662,7 +644,7 @@ msgstr "Evento"
 
 msgctxt "field:calendar.event.rrule,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:calendar.event.rrule,rec_name:"
 msgid "Name"
@@ -670,24 +652,23 @@ msgstr "Nombre"
 
 msgctxt "field:calendar.event.rrule,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Fecha de Modificación"
 
 msgctxt "field:calendar.event.rrule,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Modificado por Usuario"
 
 msgctxt "field:calendar.location,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Fecha de Creación"
 
-#, fuzzy
 msgctxt "field:calendar.location,create_uid:"
 msgid "Create User"
-msgstr "Crear usuario"
+msgstr "Creado por Usuario"
 
 msgctxt "field:calendar.location,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:calendar.location,name:"
 msgid "Name"
@@ -699,72 +680,71 @@ msgstr "Nombre"
 
 msgctxt "field:calendar.location,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Fecha de Modificación"
 
 msgctxt "field:calendar.location,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Modificado por Usuario"
 
 msgctxt "field:calendar.rrule,byday:"
 msgid "By Day"
-msgstr ""
+msgstr "Por Día"
 
 msgctxt "field:calendar.rrule,byhour:"
 msgid "By Hour"
-msgstr ""
+msgstr "Por Hora"
 
 msgctxt "field:calendar.rrule,byminute:"
 msgid "By Minute"
-msgstr ""
+msgstr "Por Minuto"
 
 msgctxt "field:calendar.rrule,bymonth:"
 msgid "By Month"
-msgstr ""
+msgstr "Por Mes"
 
 msgctxt "field:calendar.rrule,bymonthday:"
 msgid "By Month Day"
-msgstr ""
+msgstr "Por Día del Mes"
 
 msgctxt "field:calendar.rrule,bysecond:"
 msgid "By Second"
-msgstr ""
+msgstr "Por Segundo"
 
 msgctxt "field:calendar.rrule,bysetpos:"
 msgid "By Position"
-msgstr ""
+msgstr "Por Posición"
 
 msgctxt "field:calendar.rrule,byweekno:"
 msgid "By Week Number"
-msgstr ""
+msgstr "Por Número de la Semana"
 
 msgctxt "field:calendar.rrule,byyearday:"
 msgid "By Year Day"
-msgstr ""
+msgstr "Por Día del Año"
 
 msgctxt "field:calendar.rrule,count:"
 msgid "Count"
-msgstr ""
+msgstr "Contar"
 
 msgctxt "field:calendar.rrule,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Fecha de Creación"
 
-#, fuzzy
 msgctxt "field:calendar.rrule,create_uid:"
 msgid "Create User"
-msgstr "Crear usuario"
+msgstr "Creado por Usuario"
 
 msgctxt "field:calendar.rrule,freq:"
 msgid "Frequency"
-msgstr ""
+msgstr "Frecuencia"
 
 msgctxt "field:calendar.rrule,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:calendar.rrule,interval:"
 msgid "Interval"
-msgstr ""
+msgstr "Intervalo"
 
 msgctxt "field:calendar.rrule,rec_name:"
 msgid "Name"
@@ -772,9 +752,8 @@ msgstr "Nombre"
 
 msgctxt "field:calendar.rrule,until:"
 msgid "Until Date"
-msgstr ""
+msgstr "Hasta la Fecha"
 
-#, fuzzy
 msgctxt "field:calendar.rrule,until_date:"
 msgid "Is Date"
 msgstr "Es Fecha"
@@ -785,11 +764,11 @@ msgstr "Día de la Semana"
 
 msgctxt "field:calendar.rrule,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Fecha de Modificación"
 
 msgctxt "field:calendar.rrule,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Modificado por Usuario"
 
 msgctxt "field:res.user,calendars:"
 msgid "Calendars"
@@ -797,7 +776,7 @@ msgstr "Calendarios"
 
 msgctxt "help:calendar.calendar,owner:"
 msgid "The user must have an email"
-msgstr ""
+msgstr "El usuario debe tener un email"
 
 msgctxt "help:calendar.date,date:"
 msgid "Ignore time of field \"Date\", but handle as date only."
@@ -810,6 +789,8 @@ msgstr "Idenitificador Universal Único"
 msgctxt "help:calendar.rrule,until_date:"
 msgid "Ignore time of field \"Until Date\", but handle as date only."
 msgstr ""
+"Ignore tiempo del campo \"Hasta la Fecha\", pero manejelo como fecha "
+"solamente."
 
 msgctxt "model:calendar.alarm,name:"
 msgid "Alarm"
@@ -891,7 +872,6 @@ msgctxt "model:ir.action,name:act_event_form3"
 msgid "Events"
 msgstr "Eventos"
 
-#, fuzzy
 msgctxt "model:ir.ui.menu,name:menu_calendar"
 msgid "Calendar"
 msgstr "Calendario"
@@ -906,27 +886,27 @@ msgstr "Eventos"
 
 msgctxt "model:res.group,name:group_calendar_admin"
 msgid "Calendar Administration"
-msgstr "Administrar Calendario"
+msgstr "Administración Calendario"
 
 msgctxt "selection:calendar.attendee,status:"
 msgid ""
-msgstr ""
+msgstr "Punto de Orden"
 
 msgctxt "selection:calendar.attendee,status:"
 msgid "Accepted"
-msgstr ""
+msgstr "Aceptado"
 
 msgctxt "selection:calendar.attendee,status:"
 msgid "Declined"
-msgstr ""
+msgstr "Declinado"
 
 msgctxt "selection:calendar.attendee,status:"
 msgid "Delegated"
-msgstr ""
+msgstr "Delegado"
 
 msgctxt "selection:calendar.attendee,status:"
 msgid "Needs Action"
-msgstr ""
+msgstr "Necesita una Acción"
 
 msgctxt "selection:calendar.attendee,status:"
 msgid "Tentative"
@@ -946,7 +926,7 @@ msgstr "Público"
 
 msgctxt "selection:calendar.event,status:"
 msgid ""
-msgstr ""
+msgstr "Punto de Orden"
 
 msgctxt "selection:calendar.event,status:"
 msgid "Cancelled"
@@ -970,31 +950,31 @@ msgstr "Transparente"
 
 msgctxt "selection:calendar.rrule,freq:"
 msgid "Daily"
-msgstr ""
+msgstr "Diario"
 
 msgctxt "selection:calendar.rrule,freq:"
 msgid "Hourly"
-msgstr ""
+msgstr "Cada Hora"
 
 msgctxt "selection:calendar.rrule,freq:"
 msgid "Minutely"
-msgstr ""
+msgstr "Cada Minuto"
 
 msgctxt "selection:calendar.rrule,freq:"
 msgid "Monthly"
-msgstr ""
+msgstr "Mensualmente"
 
 msgctxt "selection:calendar.rrule,freq:"
 msgid "Secondly"
-msgstr ""
+msgstr "En segundo lugar"
 
 msgctxt "selection:calendar.rrule,freq:"
 msgid "Weekly"
-msgstr ""
+msgstr "Semanalmente"
 
 msgctxt "selection:calendar.rrule,freq:"
 msgid "Yearly"
-msgstr ""
+msgstr "Anualmente"
 
 msgctxt "selection:calendar.rrule,wkst:"
 msgid "Friday"
@@ -1108,7 +1088,6 @@ msgctxt "view:calendar.event:"
 msgid "General"
 msgstr "General"
 
-#, fuzzy
 msgctxt "view:calendar.event:"
 msgid "Occurences"
 msgstr "Ocurrencias"
diff --git a/locale/es_ES.po b/locale/es_ES.po
index ac105e3..aaf4fd4 100644
--- a/locale/es_ES.po
+++ b/locale/es_ES.po
@@ -872,7 +872,7 @@ msgstr "Eventos"
 
 msgctxt "model:ir.ui.menu,name:menu_calendar"
 msgid "Calendar"
-msgstr "Calendario"
+msgstr "Calendarios"
 
 msgctxt "model:ir.ui.menu,name:menu_calendar_form"
 msgid "Calendars"
diff --git a/res.py b/res.py
index 82c8925..cd9aee4 100644
--- a/res.py
+++ b/res.py
@@ -1,27 +1,26 @@
 #This file is part of Tryton.  The COPYRIGHT file at the top level of
 #this repository contains the full copyright notices and license terms.
-import copy
-from trytond.model import ModelView, ModelSQL, fields
+from trytond.model import fields
+from trytond.pool import PoolMeta
 from trytond.pyson import Bool, Eval
 
+__all__ = ['User']
+__metaclass__ = PoolMeta
 
-class User(ModelSQL, ModelView):
-    _name = 'res.user'
+
+class User:
+    __name__ = 'res.user'
 
     calendars = fields.One2Many('calendar.calendar', 'owner', 'Calendars')
 
-    def __init__(self):
-        super(User, self).__init__()
-        self.email = copy.copy(self.email)
-        self.email.states = copy.copy(self.email.states)
-        self.email.depends = copy.copy(self.email.depends)
+    @classmethod
+    def __setup__(cls):
+        super(User, cls).__setup__()
         required = Bool(Eval('calendars'))
-        if not self.email.states.get('required'):
-            self.email.states['required'] = required
+        if not cls.email.states.get('required'):
+            cls.email.states['required'] = required
         else:
-            self.email.states['required'] = (
-                self.email.states['required'] | required)
-        if 'calendars' not in self.email.depends:
-            self.email.depends.append('calendars')
-
-User()
+            cls.email.states['required'] = (
+                cls.email.states['required'] | required)
+        if 'calendars' not in cls.email.depends:
+            cls.email.depends.append('calendars')
diff --git a/setup.py b/setup.py
index 2af98de..d0e0e98 100644
--- a/setup.py
+++ b/setup.py
@@ -4,8 +4,19 @@
 
 from setuptools import setup
 import re
+import os
+import ConfigParser
 
-info = eval(open('__tryton__.py').read())
+
+def read(fname):
+    return open(os.path.join(os.path.dirname(__file__), fname)).read()
+
+config = ConfigParser.ConfigParser()
+config.readfp(open('tryton.cfg'))
+info = dict(config.items('tryton'))
+for key in ('depends', 'extras_depend', 'xml'):
+    if key in info:
+        info[key] = info[key].strip().splitlines()
 major_version, minor_version, _ = info.get('version', '0.0.1').split('.', 2)
 major_version = int(major_version)
 minor_version = int(minor_version)
@@ -21,21 +32,21 @@ requires.append('trytond >= %s.%s, < %s.%s' %
 
 setup(name='trytond_calendar',
     version=info.get('version', '0.0.1'),
-    description=info.get('description', ''),
-    author=info.get('author', ''),
-    author_email=info.get('email', ''),
-    url=info.get('website', ''),
+    description='Tryton module for CalDAV',
+    long_description=read('README'),
+    author='Tryton',
+    url='http://www.tryton.org/',
     download_url="http://downloads.tryton.org/" + \
-            info.get('version', '0.0.1').rsplit('.', 1)[0] + '/',
+        info.get('version', '0.0.1').rsplit('.', 1)[0] + '/',
     package_dir={'trytond.modules.calendar': '.'},
     packages=[
         'trytond.modules.calendar',
         'trytond.modules.calendar.tests',
-    ],
+        ],
     package_data={
         'trytond.modules.calendar': info.get('xml', []) \
-                + info.get('translation', []),
-    },
+            + ['tryton.cfg', 'locale/*.po'],
+        },
     classifiers=[
         'Development Status :: 5 - Production/Stable',
         'Environment :: Plugins',
@@ -57,12 +68,12 @@ setup(name='trytond_calendar',
         'Programming Language :: Python :: 2.6',
         'Programming Language :: Python :: 2.7',
         'Topic :: Office/Business',
-    ],
+        ],
     license='GPL-3',
     install_requires=requires,
     extras_require={
         'test': ['caldav'],
-    },
+        },
     zip_safe=False,
     entry_points="""
     [trytond.modules]
@@ -70,4 +81,4 @@ setup(name='trytond_calendar',
     """,
     test_suite='tests',
     test_loader='trytond.test_loader:Loader',
-)
+    )
diff --git a/tests/scenario_calendar.py b/tests/scenario_calendar.py
index 38a0344..50903f7 100644
--- a/tests/scenario_calendar.py
+++ b/tests/scenario_calendar.py
@@ -18,7 +18,7 @@ def install_module(name, config):
     module, = Module.find([('name', '=', name)])
     if module.state != 'installed':
         Module.install([module.id], config.context)
-        Wizard('ir.module.module.install_upgrade').execute('start')
+        Wizard('ir.module.module.install_upgrade').execute('upgrade')
 
 
 def configure_user(login, config):
@@ -111,6 +111,8 @@ class TestCase(unittest.TestCase):
             attendee.value = 'MAILTO:%s at example.com' % name
             attendees.append(attendee)
         vevent.attendee_list = attendees
+        caldav.Event(self.client, data=ical.serialize(),
+            parent=self.calendar).save()
 
         Event = Model.get('calendar.event')
         owner_event, = Event.find([
diff --git a/tryton.cfg b/tryton.cfg
new file mode 100644
index 0000000..3e2b6cc
--- /dev/null
+++ b/tryton.cfg
@@ -0,0 +1,8 @@
+[tryton]
+version=2.6.0
+depends:
+    ir
+    res
+    webdav
+xml:
+    calendar.xml
diff --git a/trytond_calendar.egg-info/PKG-INFO b/trytond_calendar.egg-info/PKG-INFO
index bbd4e7a..f4586fa 100644
--- a/trytond_calendar.egg-info/PKG-INFO
+++ b/trytond_calendar.egg-info/PKG-INFO
@@ -1,13 +1,49 @@
 Metadata-Version: 1.0
 Name: trytond-calendar
-Version: 2.4.2
-Summary: Add CalDAV support
+Version: 2.6.0
+Summary: Tryton module for CalDAV
 Home-page: http://www.tryton.org/
-Author: B2CK
-Author-email: info at b2ck.com
+Author: Tryton
+Author-email: UNKNOWN
 License: GPL-3
-Download-URL: http://downloads.tryton.org/2.4/
-Description: UNKNOWN
+Download-URL: http://downloads.tryton.org/2.6/
+Description: trytond_calendar
+        ================
+        
+        The calendar module of the Tryton application platform.  See
+        __tryton__.py
+        
+        Installing
+        ----------
+        
+        See INSTALL
+        
+        Support
+        -------
+        
+        If you encounter any problems with Tryton, please don't hesitate to ask
+        questions on the Tryton bug tracker, mailing list, wiki or IRC channel:
+        
+          http://bugs.tryton.org/
+          http://groups.tryton.org/
+          http://wiki.tryton.org/
+          irc://irc.freenode.net/tryton
+        
+        License
+        -------
+        
+        See LICENSE
+        
+        Copyright
+        ---------
+        
+        See COPYRIGHT
+        
+        
+        For more information please visit the Tryton web site:
+        
+          http://www.tryton.org/
+        
 Platform: UNKNOWN
 Classifier: Development Status :: 5 - Production/Stable
 Classifier: Environment :: Plugins
diff --git a/trytond_calendar.egg-info/SOURCES.txt b/trytond_calendar.egg-info/SOURCES.txt
index 5aa3999..773ccae 100644
--- a/trytond_calendar.egg-info/SOURCES.txt
+++ b/trytond_calendar.egg-info/SOURCES.txt
@@ -6,8 +6,8 @@ MANIFEST.in
 README
 calendar.xml
 setup.py
+tryton.cfg
 ./__init__.py
-./__tryton__.py
 ./caldav.py
 ./calendar_.py
 ./res.py
diff --git a/trytond_calendar.egg-info/requires.txt b/trytond_calendar.egg-info/requires.txt
index fabff6c..050605d 100644
--- a/trytond_calendar.egg-info/requires.txt
+++ b/trytond_calendar.egg-info/requires.txt
@@ -2,7 +2,7 @@ vobject >= 0.8.0
 PyWebDAV >= 0.9.8
 python-dateutil
 pytz
-trytond >= 2.4, < 2.5
+trytond >= 2.6, < 2.7
 
 [test]
 caldav
\ No newline at end of file
diff --git a/webdav.py b/webdav.py
index 93b5a12..fd55fc3 100644
--- a/webdav.py
+++ b/webdav.py
@@ -3,11 +3,13 @@
 import vobject
 import urllib
 from pywebdav.lib.errors import DAV_NotFound, DAV_Forbidden
-from trytond.model import ModelView, ModelSQL
 from trytond.tools import reduce_ids
 from trytond.cache import Cache
 from trytond.transaction import Transaction
-from trytond.pool import Pool
+from trytond.pool import Pool, PoolMeta
+
+__all__ = ['Collection']
+__metaclass__ = PoolMeta
 
 CALDAV_NS = 'urn:ietf:params:xml:ns:caldav'
 
@@ -45,19 +47,16 @@ def _comp_filter_domain(dtstart, dtend):
             ]]
 
 
-class Collection(ModelSQL, ModelView):
-
-    _name = "webdav.collection"
+class Collection:
+    __name__ = "webdav.collection"
+    _event_cache = Cache('webdav_collection.event')
 
-    def calendar(self, uri, ics=False):
+    @staticmethod
+    def calendar(uri, ics=False):
         '''
         Return the calendar id in the uri
-
-        :param uri: the uri
-        :return: calendar id
-            or None if there is no calendar
         '''
-        calendar_obj = Pool().get('calendar.calendar')
+        Calendar = Pool().get('calendar.calendar')
 
         if uri and uri.startswith('Calendars/'):
             calendar, uri = (uri[10:].split('/', 1) + [None])[0:2]
@@ -66,40 +65,41 @@ class Collection(ModelSQL, ModelView):
                     calendar = calendar[:-4]
                 else:
                     return None
-            return calendar_obj.get_name(calendar)
+            return Calendar.get_name(calendar)
 
-    @Cache('webdav_collection.event')
-    def event(self, uri, calendar_id=False):
+    @classmethod
+    def event(cls, uri, calendar_id=False):
         '''
         Return the event id in the uri
-
-        :param uri: the uri
-        :param calendar_id: the calendar id
-        :return: event id
-            or None if there is no event
         '''
-        event_obj = Pool().get('calendar.event')
-
+        Event = Pool().get('calendar.event')
+
+        key = (uri, calendar_id)
+        event_id = cls._event_cache.get(key, default=-1)
+        if event_id != -1:
+            return event_id
+        else:
+            event_id = None
         if uri and uri.startswith('Calendars/'):
             calendar, event_uri = (uri[10:].split('/', 1) + [None])[0:2]
             if not calendar_id:
-                calendar_id = self.calendar(uri)
+                calendar_id = cls.calendar(uri)
                 if not calendar_id:
                     return None
-            event_ids = event_obj.search([
-                ('calendar', '=', calendar_id),
-                ('uuid', '=', event_uri[:-4]),
-                ('parent', '=', None),
-                ], limit=1)
-            if event_ids:
-                return event_ids[0]
-
-    def _caldav_filter_domain_calendar(self, filter):
+            events = Event.search([
+                    ('calendar', '=', calendar_id),
+                    ('uuid', '=', event_uri[:-4]),
+                    ('parent', '=', None),
+                    ], limit=1)
+            if events:
+                event_id = events[0].id
+        cls._event_cache.set(key, event_id)
+        return event_id
+
+    @staticmethod
+    def _caldav_filter_domain_calendar(filter):
         '''
         Return a domain for caldav filter on calendar
-
-        :param filter: the DOM Element of filter
-        :return: a list for domain
         '''
         if not filter:
             return []
@@ -107,12 +107,10 @@ class Collection(ModelSQL, ModelView):
             return [('id', '=', 0)]
         return [('id', '=', 0)]
 
-    def _caldav_filter_domain_event(self, filter):
+    @classmethod
+    def _caldav_filter_domain_event(cls, filter):
         '''
         Return a domain for caldav filter on event
-
-        :param filter: the DOM Element of filter
-        :return: a list for domain
         '''
         res = []
         if not filter:
@@ -174,107 +172,111 @@ class Collection(ModelSQL, ModelView):
                         continue
                     if uri:
                         uri = urllib.unquote_plus(uri)
-                    event_id = self.event(uri)
+                    event_id = cls.event(uri)
                     if event_id:
                         ids.append(event_id)
             return [('id', 'in', ids)]
         return res
 
-    def get_childs(self, uri, filter=None, cache=None):
-        calendar_obj = Pool().get('calendar.calendar')
-        event_obj = Pool().get('calendar.event')
+    @classmethod
+    def get_childs(cls, uri, filter=None, cache=None):
+        pool = Pool()
+        Calendar = pool.get('calendar.calendar')
+        Event = pool.get('calendar.event')
 
         if uri in ('Calendars', 'Calendars/'):
-            domain = self._caldav_filter_domain_calendar(filter)
+            domain = cls._caldav_filter_domain_calendar(filter)
             domain = [['OR',
                     ('owner', '=', Transaction().user),
                     ('read_users', '=', Transaction().user),
                     ],
                 domain]
-            calendar_ids = calendar_obj.search(domain)
-            calendars = calendar_obj.browse(calendar_ids)
+            calendars = Calendar.search(domain)
             if cache is not None:
                 cache.setdefault('_calendar', {})
-                cache['_calendar'].setdefault(calendar_obj._name, {})
-                for calendar_id in calendar_ids:
-                    cache['_calendar'][calendar_obj._name][calendar_id] = {}
+                cache['_calendar'].setdefault(Calendar.__name__, {})
+                for calendar in calendars:
+                    cache['_calendar'][Calendar.__name__][calendar.id] = {}
             return [x.name for x in calendars] + \
                     [x.name + '.ics' for x in calendars]
         if uri and uri.startswith('Calendars/'):
-            calendar_id = self.calendar(uri)
+            calendar_id = cls.calendar(uri)
             if  calendar_id and not (uri[10:].split('/', 1) + [None])[1]:
-                domain = self._caldav_filter_domain_event(filter)
-                event_ids = event_obj.search([
-                    ('calendar', '=', calendar_id),
-                    domain,
-                    ])
-                events = event_obj.browse(event_ids)
+                domain = cls._caldav_filter_domain_event(filter)
+                events = Event.search([
+                        ('calendar', '=', calendar_id),
+                        domain,
+                        ])
                 if cache is not None:
                     cache.setdefault('_calendar', {})
-                    cache['_calendar'].setdefault(event_obj._name, {})
-                    for event_id in event_ids:
-                        cache['_calendar'][event_obj._name][event_id] = {}
+                    cache['_calendar'].setdefault(Event.__name__, {})
+                    for event in events:
+                        cache['_calendar'][Event.__name__][event.id] = {}
                 return [x.uuid + '.ics' for x in events]
             return []
-        res = super(Collection, self).get_childs(uri, filter=filter,
-                cache=cache)
+        childs = super(Collection, cls).get_childs(uri, filter=filter,
+            cache=cache)
         if not uri and not filter:
-            res.append('Calendars')
+            childs.append('Calendars')
         elif not uri and filter:
             if filter.localName == 'principal-property-search':
-                res.append('Calendars')
-        return res
+                childs.append('Calendars')
+        return childs
 
-    def get_resourcetype(self, uri, cache=None):
+    @classmethod
+    def get_resourcetype(cls, uri, cache=None):
         from pywebdav.lib.constants import COLLECTION, OBJECT
         if uri in ('Calendars', 'Calendars/'):
             return COLLECTION
-        calendar_id = self.calendar(uri)
+        calendar_id = cls.calendar(uri)
         if calendar_id:
             if not (uri[10:].split('/', 1) + [None])[1]:
                 return COLLECTION
             return OBJECT
-        elif self.calendar(uri, ics=True):
+        elif cls.calendar(uri, ics=True):
             return OBJECT
-        return super(Collection, self).get_resourcetype(uri, cache=cache)
+        return super(Collection, cls).get_resourcetype(uri, cache=cache)
 
-    def get_displayname(self, uri, cache=None):
-        calendar_obj = Pool().get('calendar.calendar')
+    @classmethod
+    def get_displayname(cls, uri, cache=None):
+        Calendar = Pool().get('calendar.calendar')
         if uri in ('Calendars', 'Calendars/'):
             return 'Calendars'
-        calendar_id = self.calendar(uri)
+        calendar_id = cls.calendar(uri)
         if calendar_id:
             if not (uri[10:].split('/', 1) + [None])[1]:
-                return calendar_obj.browse(calendar_id).rec_name
+                return Calendar(calendar_id).rec_name
             return uri.split('/')[-1]
-        elif self.calendar(uri, ics=True):
+        elif cls.calendar(uri, ics=True):
             return uri.split('/')[-1]
-        return super(Collection, self).get_displayname(uri, cache=cache)
+        return super(Collection, cls).get_displayname(uri, cache=cache)
 
-    def get_contenttype(self, uri, cache=None):
-        if self.event(uri) \
-                or self.calendar(uri, ics=True):
+    @classmethod
+    def get_contenttype(cls, uri, cache=None):
+        if cls.event(uri) \
+                or cls.calendar(uri, ics=True):
             return 'text/calendar'
-        return super(Collection, self).get_contenttype(uri, cache=cache)
+        return super(Collection, cls).get_contenttype(uri, cache=cache)
 
-    def get_creationdate(self, uri, cache=None):
-        calendar_obj = Pool().get('calendar.calendar')
-        event_obj = Pool().get('calendar.event')
+    @classmethod
+    def get_creationdate(cls, uri, cache=None):
+        Calendar = Pool().get('calendar.calendar')
+        Event = Pool().get('calendar.event')
 
-        calendar_id = self.calendar(uri)
+        calendar_id = cls.calendar(uri)
         if not calendar_id:
-            calendar_id = self.calendar(uri, ics=True)
+            calendar_id = cls.calendar(uri, ics=True)
         if calendar_id:
             if not (uri[10:].split('/', 1) + [None])[1]:
                 if cache is not None:
                     cache.setdefault('_calendar', {})
-                    cache['_calendar'].setdefault(calendar_obj._name, {})
-                    ids = cache['_calendar'][calendar_obj._name].keys()
+                    cache['_calendar'].setdefault(Calendar.__name__, {})
+                    ids = cache['_calendar'][Calendar.__name__].keys()
                     if calendar_id not in ids:
                         ids.append(calendar_id)
                     elif 'creationdate' in cache['_calendar'][
-                            calendar_obj._name][calendar_id]:
-                        return cache['_calendar'][calendar_obj._name][
+                            Calendar.__name__][calendar_id]:
+                        return cache['_calendar'][Calendar.__name__][
                             calendar_id]['creationdate']
                 else:
                     ids = [calendar_id]
@@ -285,30 +287,30 @@ class Collection(ModelSQL, ModelView):
                     red_sql, red_ids = reduce_ids('id', sub_ids)
                     cursor.execute('SELECT id, ' \
                                 'EXTRACT(epoch FROM create_date) ' \
-                            'FROM "' + calendar_obj._table + '" ' \
+                            'FROM "' + Calendar._table + '" ' \
                             'WHERE ' + red_sql, red_ids)
                     for calendar_id2, date in cursor.fetchall():
                         if calendar_id2 == calendar_id:
                             res = date
                         if cache is not None:
-                            cache['_calendar'][calendar_obj._name]\
+                            cache['_calendar'][Calendar.__name__]\
                                     .setdefault(calendar_id2, {})
-                            cache['_calendar'][calendar_obj._name][
+                            cache['_calendar'][Calendar.__name__][
                                 calendar_id2]['creationdate'] = date
                 if res is not None:
                     return res
             else:
-                event_id = self.event(uri, calendar_id=calendar_id)
+                event_id = cls.event(uri, calendar_id=calendar_id)
                 if event_id:
                     if cache is not None:
                         cache.setdefault('_calendar', {})
-                        cache['_calendar'].setdefault(event_obj._name, {})
-                        ids = cache['_calendar'][event_obj._name].keys()
+                        cache['_calendar'].setdefault(Event.__name__, {})
+                        ids = cache['_calendar'][Event.__name__].keys()
                         if event_id not in ids:
                             ids.append(event_id)
                         elif 'creationdate' in cache['_calendar'][
-                                event_obj._name][event_id]:
-                            return cache['_calendar'][event_obj._name][
+                                Event.__name__][event_id]:
+                            return cache['_calendar'][Event.__name__][
                                 event_id]['creationdate']
                     else:
                         ids = [event_id]
@@ -319,37 +321,39 @@ class Collection(ModelSQL, ModelView):
                         red_sql, red_ids = reduce_ids('id', sub_ids)
                         cursor.execute('SELECT id, ' \
                                 'EXTRACT(epoch FROM create_date) ' \
-                            'FROM "' + event_obj._table + '" ' \
+                            'FROM "' + Event._table + '" ' \
                             'WHERE ' + red_sql, red_ids)
                         for event_id2, date in cursor.fetchall():
                             if event_id2 == event_id:
                                 res = date
                             if cache is not None:
-                                cache['_calendar'][event_obj._name]\
+                                cache['_calendar'][Event.__name__]\
                                         .setdefault(event_id2, {})
-                                cache['_calendar'][event_obj._name][
+                                cache['_calendar'][Event.__name__][
                                     event_id2]['creationdate'] = date
                     if res is not None:
                         return res
-        return super(Collection, self).get_creationdate(uri, cache=cache)
+        return super(Collection, cls).get_creationdate(uri, cache=cache)
 
-    def get_lastmodified(self, uri, cache=None):
-        calendar_obj = Pool().get('calendar.calendar')
-        event_obj = Pool().get('calendar.event')
+    @classmethod
+    def get_lastmodified(cls, uri, cache=None):
+        pool = Pool()
+        Calendar = pool.get('calendar.calendar')
+        Event = pool.get('calendar.event')
 
         cursor = Transaction().cursor
-        calendar_id = self.calendar(uri)
+        calendar_id = cls.calendar(uri)
         if calendar_id:
             if not (uri[10:].split('/', 1) + [None])[1]:
                 if cache is not None:
                     cache.setdefault('_calendar', {})
-                    cache['_calendar'].setdefault(calendar_obj._name, {})
-                    ids = cache['_calendar'][calendar_obj._name].keys()
+                    cache['_calendar'].setdefault(Calendar.__name__, {})
+                    ids = cache['_calendar'][Calendar.__name__].keys()
                     if calendar_id not in ids:
                         ids.append(calendar_id)
                     elif 'lastmodified' in cache['_calendar'][
-                            calendar_obj._name][calendar_id]:
-                        return cache['_calendar'][calendar_obj._name][
+                            Calendar.__name__][calendar_id]:
+                        return cache['_calendar'][Calendar.__name__][
                             calendar_id]['lastmodified']
                 else:
                     ids = [calendar_id]
@@ -360,30 +364,30 @@ class Collection(ModelSQL, ModelView):
                     cursor.execute('SELECT id, ' \
                                 'EXTRACT(epoch FROM ' \
                                 'COALESCE(write_date, create_date)) ' \
-                            'FROM "' + calendar_obj._table + '" ' \
+                            'FROM "' + Calendar.__table__ + '" ' \
                                 'WHERE ' + red_sql, red_ids)
                     for calendar_id2, date in cursor.fetchall():
                         if calendar_id2 == calendar_id:
                             res = date
                         if cache is not None:
-                            cache['_calendar'][calendar_obj._name]\
+                            cache['_calendar'][Calendar.__name__]\
                                     .setdefault(calendar_id2, {})
-                            cache['_calendar'][calendar_obj._name][
+                            cache['_calendar'][Calendar.__name__][
                                 calendar_id2]['lastmodified'] = date
                 if res is not None:
                     return res
             else:
-                event_id = self.event(uri, calendar_id=calendar_id)
+                event_id = cls.event(uri, calendar_id=calendar_id)
                 if event_id:
                     if cache is not None:
                         cache.setdefault('_calendar', {})
-                        cache['_calendar'].setdefault(event_obj._name, {})
-                        ids = cache['_calendar'][event_obj._name].keys()
+                        cache['_calendar'].setdefault(Event.__name__, {})
+                        ids = cache['_calendar'][Event.__name__].keys()
                         if event_id not in ids:
                             ids.append(event_id)
                         elif 'lastmodified' in cache['_calendar'][
-                                event_obj._name][event_id]:
-                            return cache['_calendar'][event_obj._name][
+                                Event.__name__][event_id]:
+                            return cache['_calendar'][Event.__name__][
                                 event_id]['lastmodified']
                     else:
                         ids = [event_id]
@@ -396,7 +400,7 @@ class Collection(ModelSQL, ModelView):
                         cursor.execute('SELECT COALESCE(parent, id), ' \
                                     'MAX(EXTRACT(epoch FROM ' \
                                     'COALESCE(write_date, create_date))) ' \
-                                'FROM "' + event_obj._table + '" ' \
+                                'FROM "' + Event._table + '" ' \
                                 'WHERE ' + red_id_sql + ' ' \
                                     'OR ' + red_parent_sql + ' ' \
                                 'GROUP BY parent, id',
@@ -405,23 +409,23 @@ class Collection(ModelSQL, ModelView):
                             if event_id2 == event_id:
                                 res = date
                             if cache is not None:
-                                cache['_calendar'][event_obj._name]\
+                                cache['_calendar'][Event.__name__]\
                                         .setdefault(event_id2, {})
-                                cache['_calendar'][event_obj._name][
+                                cache['_calendar'][Event.__name__][
                                     event_id2]['lastmodified'] = date
                     if res is not None:
                         return res
-        calendar_ics_id = self.calendar(uri, ics=True)
+        calendar_ics_id = cls.calendar(uri, ics=True)
         if calendar_ics_id:
             if cache is not None:
                 cache.setdefault('_calendar', {})
-                cache['_calendar'].setdefault(calendar_obj._name, {})
-                ids = cache['_calendar'][calendar_obj._name].keys()
+                cache['_calendar'].setdefault(Calendar.__name__, {})
+                ids = cache['_calendar'][Calendar.__name__].keys()
                 if calendar_ics_id not in ids:
                     ids.append(calendar_ics_id)
                 elif 'lastmodified ics' in cache['_calendar'][
-                        calendar_obj._name][calendar_ics_id]:
-                    return cache['_calendar'][calendar_obj._name][
+                        Calendar.__name__][calendar_ics_id]:
+                    return cache['_calendar'][Calendar.__name__][
                         calendar_ics_id]['lastmodified ics']
             else:
                 ids = [calendar_ics_id]
@@ -431,200 +435,210 @@ class Collection(ModelSQL, ModelView):
                 red_sql, red_ids = reduce_ids('calendar', sub_ids)
                 cursor.execute('SELECT calendar, MAX(EXTRACT(epoch FROM ' \
                             'COALESCE(write_date, create_date))) ' \
-                        'FROM "' + event_obj._table + '" ' \
+                        'FROM "' + Event._table + '" ' \
                         'WHERE ' + red_sql + ' ' \
                         'GROUP BY calendar', red_ids)
                 for calendar_id2, date in cursor.fetchall():
                     if calendar_id2 == calendar_ics_id:
                         res = date
                     if cache is not None:
-                        cache['_calendar'][calendar_obj._name]\
+                        cache['_calendar'][Calendar.__name__]\
                                 .setdefault(calendar_id2, {})
-                        cache['_calendar'][calendar_obj._name][
+                        cache['_calendar'][Calendar.__name__][
                             calendar_id2]['lastmodified ics'] = date
             if res is not None:
                 return res
-        return super(Collection, self).get_lastmodified(uri, cache=cache)
+        return super(Collection, cls).get_lastmodified(uri, cache=cache)
 
-    def get_data(self, uri, cache=None):
-        event_obj = Pool().get('calendar.event')
-        calendar_obj = Pool().get('calendar.calendar')
+    @classmethod
+    def get_data(cls, uri, cache=None):
+        pool = Pool()
+        Event = pool.get('calendar.event')
+        Calendar = pool.get('calendar.calendar')
 
-        calendar_id = self.calendar(uri)
+        calendar_id = cls.calendar(uri)
         if calendar_id:
             if not (uri[10:].split('/', 1) + [None])[1]:
                 raise DAV_NotFound
-            event_id = self.event(uri, calendar_id=calendar_id)
+            event_id = cls.event(uri, calendar_id=calendar_id)
             if not event_id:
                 raise DAV_NotFound
-            ical = event_obj.event2ical(event_id)
+            ical = Event(event_id).event2ical()
             return ical.serialize()
-        calendar_ics_id = self.calendar(uri, ics=True)
+        calendar_ics_id = cls.calendar(uri, ics=True)
         if calendar_ics_id:
-            ical = calendar_obj.calendar2ical(calendar_ics_id)
+            ical = Calendar(calendar_ics_id).calendar2ical()
             return ical.serialize()
-        return super(Collection, self).get_data(uri, cache=cache)
+        return super(Collection, cls).get_data(uri, cache=cache)
 
-    def get_calendar_description(self, uri, cache=None):
-        calendar_obj = Pool().get('calendar.calendar')
+    @classmethod
+    def get_calendar_description(cls, uri, cache=None):
+        Calendar = Pool().get('calendar.calendar')
 
-        calendar_id = self.calendar(uri)
+        calendar_id = cls.calendar(uri)
         if calendar_id:
             if not (uri[10:].split('/', 1) + [None])[1]:
                 if cache is not None:
                     cache.setdefault('_calendar', {})
-                    cache['_calendar'].setdefault(calendar_obj._name, {})
-                    ids = cache['_calendar'][calendar_obj._name].keys()
+                    cache['_calendar'].setdefault(Calendar.__name__, {})
+                    ids = cache['_calendar'][Calendar.__name__].keys()
                     if calendar_id not in ids:
                         ids.append(calendar_id)
                     elif 'calendar_description' in cache['_calendar'][
-                            calendar_obj._name][calendar_id]:
-                        res = cache['_calendar'][calendar_obj._name][
+                            Calendar.__name__][calendar_id]:
+                        res = cache['_calendar'][Calendar.__name__][
                             calendar_id]['calendar_description']
                         if res is not None:
                             return res
                 else:
                     ids = [calendar_id]
                 res = None
-                for calendar in calendar_obj.browse(ids):
+                for calendar in Calendar.browse(ids):
                     if calendar.id == calendar_id:
                         res = calendar.description
                     if cache is not None:
-                        cache['_calendar'][calendar_obj._name]\
+                        cache['_calendar'][Calendar.__name__]\
                                 .setdefault(calendar.id, {})
-                        cache['_calendar'][calendar_obj._name][
+                        cache['_calendar'][Calendar.__name__][
                             calendar.id]['calendar_description'] = \
                                 calendar.description
                 if res is not None:
                     return res
         raise DAV_NotFound
 
-    def get_calendar_data(self, uri, cache=None):
-        return self.get_data(uri, cache=cache).decode('utf-8')
+    @classmethod
+    def get_calendar_data(cls, uri, cache=None):
+        return cls.get_data(uri, cache=cache).decode('utf-8')
 
-    def get_calendar_home_set(self, uri, cache=None):
+    @staticmethod
+    def get_calendar_home_set(uri, cache=None):
         return '/Calendars'
 
-    def get_calendar_user_address_set(self, uri, cache=None):
-        user_obj = Pool().get('res.user')
-        user = user_obj.browse(Transaction().user)
+    @staticmethod
+    def get_calendar_user_address_set(uri, cache=None):
+        User = Pool().get('res.user')
+        user = User(Transaction().user)
         if user.email:
             return user.email
         raise DAV_NotFound
 
-    def get_schedule_inbox_URL(self, uri, cache=None):
-        calendar_obj = Pool().get('calendar.calendar')
+    @staticmethod
+    def get_schedule_inbox_URL(uri, cache=None):
+        Calendar = Pool().get('calendar.calendar')
         user = Transaction().user
 
-        calendar_ids = calendar_obj.search([
+        calendars = Calendar.search([
             ('owner', '=', user),
             ], limit=1)
-        if not calendar_ids:
+        if not calendars:
             # Sunbird failed with no value
             return '/Calendars'
-        calendar = calendar_obj.browse(calendar_ids[0])
+        calendar, = calendars
         return '/Calendars/' + calendar.name
 
-    def get_schedule_outbox_URL(self, uri, cache=None):
-        return self.get_schedule_inbox_URL(uri, cache=cache)
+    @classmethod
+    def get_schedule_outbox_URL(cls, uri, cache=None):
+        return cls.get_schedule_inbox_URL(uri, cache=cache)
 
-    def put(self, uri, data, content_type, cache=None):
-        event_obj = Pool().get('calendar.event')
-        calendar_obj = Pool().get('calendar.calendar')
+    @classmethod
+    def put(cls, uri, data, content_type, cache=None):
+        pool = Pool()
+        Event = pool.get('calendar.event')
+        Calendar = pool.get('calendar.calendar')
 
-        calendar_id = self.calendar(uri)
+        calendar_id = cls.calendar(uri)
         if calendar_id:
             if not (uri[10:].split('/', 1) + [None])[1]:
                 raise DAV_Forbidden
-            event_id = self.event(uri, calendar_id=calendar_id)
+            event_id = cls.event(uri, calendar_id=calendar_id)
             if not event_id:
                 ical = vobject.readOne(data)
-                values = event_obj.ical2values(None, ical, calendar_id)
-                event_id = event_obj.create(values)
-                event = event_obj.browse(event_id)
-                calendar = calendar_obj.browse(calendar_id)
+                values = Event.ical2values(None, ical, calendar_id)
+                event = Event.create(values)
+                calendar = Calendar(calendar_id)
                 return (Transaction().cursor.database_name + '/Calendars/' +
                         calendar.name + '/' + event.uuid + '.ics')
             else:
                 ical = vobject.readOne(data)
-                values = event_obj.ical2values(event_id, ical, calendar_id)
-                event_obj.write(event_id, values)
+                values = Event.ical2values(event_id, ical, calendar_id)
+                Event.write([Event(event_id)], values)
                 return
-        calendar_ics_id = self.calendar(uri, ics=True)
+        calendar_ics_id = cls.calendar(uri, ics=True)
         if calendar_ics_id:
             raise DAV_Forbidden
-        return super(Collection, self).put(uri, data, content_type)
+        return super(Collection, cls).put(uri, data, content_type)
 
-    def mkcol(self, uri, cache=None):
+    @classmethod
+    def mkcol(cls, uri, cache=None):
         if uri and uri.startswith('Calendars/'):
             raise DAV_Forbidden
-        return super(Collection, self).mkcol(uri, cache=cache)
+        return super(Collection, cls).mkcol(uri, cache=cache)
 
-    def rmcol(self, uri, cache=None):
-        calendar_obj = Pool().get('calendar.calendar')
+    @classmethod
+    def rmcol(cls, uri, cache=None):
+        Calendar = Pool().get('calendar.calendar')
 
-        calendar_id = self.calendar(uri)
+        calendar_id = cls.calendar(uri)
         if calendar_id:
             if not (uri[10:].split('/', 1) + [None])[1]:
                 try:
-                    calendar_obj.delete(calendar_id)
+                    Calendar.delete([Calendar(calendar_id)])
                 except Exception:
                     raise DAV_Forbidden
                 return 200
             raise DAV_Forbidden
-        return super(Collection, self).rmcol(uri, cache=cache)
+        return super(Collection, cls).rmcol(uri, cache=cache)
 
-    def rm(self, uri, cache=None):
-        event_obj = Pool().get('calendar.event')
+    @classmethod
+    def rm(cls, uri, cache=None):
+        Event = Pool().get('calendar.event')
 
-        calendar_id = self.calendar(uri)
+        calendar_id = cls.calendar(uri)
         if calendar_id:
             if not (uri[10:].split('/', 1) + [None])[1]:
                 return 403
-            event_id = self.event(uri, calendar_id=calendar_id)
+            event_id = cls.event(uri, calendar_id=calendar_id)
             if event_id:
                 try:
-                    event_obj.delete(event_id)
+                    Event.delete([Event(event_id)])
                 except Exception:
                     return 403
                 return 200
             return 404
-        calendar_ics_id = self.calendar(uri, ics=True)
+        calendar_ics_id = cls.calendar(uri, ics=True)
         if calendar_ics_id:
             return 403
-        return super(Collection, self).rm(uri, cache=cache)
+        return super(Collection, cls).rm(uri, cache=cache)
 
-    def exists(self, uri, cache=None):
+    @classmethod
+    def exists(cls, uri, cache=None):
         if uri in ('Calendars', 'Calendars/'):
             return 1
-        calendar_id = self.calendar(uri)
+        calendar_id = cls.calendar(uri)
         if calendar_id:
             if not (uri[10:].split('/', 1) + [None])[1]:
                 return 1
-            if self.event(uri, calendar_id=calendar_id):
+            if cls.event(uri, calendar_id=calendar_id):
                 return 1
-        calendar_ics_id = self.calendar(uri, ics=True)
+        calendar_ics_id = cls.calendar(uri, ics=True)
         if calendar_ics_id:
             return 1
-        return super(Collection, self).exists(uri, cache=cache)
+        return super(Collection, cls).exists(uri, cache=cache)
 
-    def current_user_privilege_set(self, uri, cache=None):
+    @classmethod
+    def current_user_privilege_set(cls, uri, cache=None):
         '''
         Return the privileges of the current user for uri
         Privileges ares: create, read, write, delete
-
-        :param uri: the uri
-        :param cache: the cache
-        :return: a list of privileges
         '''
-        calendar_obj = Pool().get('calendar.calendar')
+        Calendar = Pool().get('calendar.calendar')
 
         if uri in ('Calendars', 'Calendars/'):
             return ['create', 'read', 'write', 'delete']
         if uri and uri.startswith('Calendars/'):
-            calendar_id = self.calendar(uri)
+            calendar_id = cls.calendar(uri)
             if calendar_id:
-                calendar = calendar_obj.browse(calendar_id)
+                calendar = Calendar(calendar_id)
                 user = Transaction().user
                 if user == calendar.owner.id:
                     return ['create', 'read', 'write', 'delete']
@@ -635,7 +649,5 @@ class Collection(ModelSQL, ModelView):
                     res.extend(['read', 'write', 'delete'])
                 return res
             return []
-        return super(Collection, self).current_user_privilege_set(uri,
-                cache=cache)
-
-Collection()
+        return super(Collection, cls).current_user_privilege_set(uri,
+            cache=cache)
commit 76410f325140add7b044dcf827a87ba3f29dd401
Author: Mathias Behrle <mathiasb at m9s.biz>
Date:   Tue Sep 11 13:25:50 2012 +0200

    Adding upstream version 2.4.2.

diff --git a/CHANGELOG b/CHANGELOG
index 7885356..480068b 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,3 +1,6 @@
+Version 2.4.2 - 2012-09-02
+* Bug fixes (see mercurial logs for details)
+
 Version 2.4.1 - 2012-04-24
 * Restore es_AR translation
 
diff --git a/PKG-INFO b/PKG-INFO
index 4022f0b..0457a01 100644
--- a/PKG-INFO
+++ b/PKG-INFO
@@ -1,6 +1,6 @@
 Metadata-Version: 1.0
 Name: trytond_calendar
-Version: 2.4.1
+Version: 2.4.2
 Summary: Add CalDAV support
 Home-page: http://www.tryton.org/
 Author: B2CK
diff --git a/__tryton__.py b/__tryton__.py
index 82394ba..b532430 100644
--- a/__tryton__.py
+++ b/__tryton__.py
@@ -11,7 +11,7 @@
     'name_es_ES': 'Calendario',
     'name_fr_FR': 'Calendrier',
     'name_ru_RU': 'Календарь',
-    'version': '2.4.1',
+    'version': '2.4.2',
     'author': 'B2CK',
     'email': 'info at b2ck.com',
     'website': 'http://www.tryton.org/',
diff --git a/calendar_.py b/calendar_.py
index fef6c1d..123e07b 100644
--- a/calendar_.py
+++ b/calendar_.py
@@ -271,7 +271,7 @@ class Calendar(ModelSQL, ModelView):
         :param data: the posted data
         :return: the xml with schedule-response
         '''
-        from DAV.errors import DAV_Forbidden
+        from pywebdav.lib.errors import DAV_Forbidden
         collection_obj = Pool().get('webdav.collection')
 
         calendar_id = collection_obj.calendar(uri)
@@ -548,8 +548,8 @@ class Event(ModelSQL, ModelView):
         assert name in ('calendar_owner', 'calendar_read_users',
                 'calendar_write_users'), 'Invalid name'
         res = {}
+        name = name[9:]
         for event in self.browse(ids):
-            name = name[9:]
             if name in ('read_users', 'write_users'):
                 res[event.id] = [x.id for x in event.calendar[name]]
             else:
@@ -743,6 +743,25 @@ class Event(ModelSQL, ModelView):
         collection_obj.event.reset()
         return res
 
+    def copy(self, ids, default=None):
+        int_id = isinstance(ids, (int, long))
+        if int_id:
+            ids = [ids]
+
+        if default is None:
+            default = {}
+
+        new_ids = []
+        for event_id in ids:
+            current_default = default.copy()
+            current_default['uuid'] = self.default_uuid()
+            new_id = super(Event, self).copy(event_id, default=current_default)
+            new_ids.append(new_id)
+
+        if int_id:
+            return new_ids[0]
+        return new_ids
+
     def delete(self, ids):
         attendee_obj = Pool().get('calendar.event.attendee')
         collection_obj = Pool().get('webdav.collection')
@@ -1070,7 +1089,7 @@ class Event(ModelSQL, ModelView):
         ical = vobject.iCalendar()
         vevent = ical.add('vevent')
         if event.vevent:
-            ical.vevent = vobject.readOne(event.vevent)
+            ical.vevent = vobject.readOne(str(event.vevent))
             vevent = ical.vevent
             ical.vevent.transformToNative()
         if event.summary:
@@ -1243,7 +1262,7 @@ class Alarm(ModelSQL):
         '''
         valarm = None
         if alarm.valarm:
-            valarm = vobject.readOne(alarm.valarm)
+            valarm = vobject.readOne(str(alarm.valarm))
         return valarm
 
 Alarm()
@@ -1361,7 +1380,7 @@ class Attendee(ModelSQL, ModelView):
         res = None
         if attendee.attendee:
             res = vobject.base.textLineToContentLine(
-                    attendee.attendee.replace('\r\n ', ''))
+                    str(attendee.attendee).replace('\r\n ', ''))
         else:
             res = vobject.base.ContentLine('ATTENDEE', [], '')
 
diff --git a/trytond_calendar.egg-info/PKG-INFO b/trytond_calendar.egg-info/PKG-INFO
index be19eb1..bbd4e7a 100644
--- a/trytond_calendar.egg-info/PKG-INFO
+++ b/trytond_calendar.egg-info/PKG-INFO
@@ -1,6 +1,6 @@
 Metadata-Version: 1.0
 Name: trytond-calendar
-Version: 2.4.1
+Version: 2.4.2
 Summary: Add CalDAV support
 Home-page: http://www.tryton.org/
 Author: B2CK
diff --git a/webdav.py b/webdav.py
index 4ce94a4..93b5a12 100644
--- a/webdav.py
+++ b/webdav.py
@@ -226,7 +226,7 @@ class Collection(ModelSQL, ModelView):
         return res
 
     def get_resourcetype(self, uri, cache=None):
-        from DAV.constants import COLLECTION, OBJECT
+        from pywebdav.lib.constants import COLLECTION, OBJECT
         if uri in ('Calendars', 'Calendars/'):
             return COLLECTION
         calendar_id = self.calendar(uri)
commit b73260e8aedca8b5471eebe95582d9414dcd8bf7
Author: Mathias Behrle <mathiasb at m9s.biz>
Date:   Wed Apr 25 11:03:30 2012 +0200

    Adding upstream version 2.4.1.

diff --git a/CHANGELOG b/CHANGELOG
index 236087d..7885356 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,3 +1,6 @@
+Version 2.4.1 - 2012-04-24
+* Restore es_AR translation
+
 Version 2.4.0 - 2012-04-23
 * Bug fixes (see mercurial logs for details)
 
diff --git a/PKG-INFO b/PKG-INFO
index 7a975ed..4022f0b 100644
--- a/PKG-INFO
+++ b/PKG-INFO
@@ -1,6 +1,6 @@
 Metadata-Version: 1.0
 Name: trytond_calendar
-Version: 2.4.0
+Version: 2.4.1
 Summary: Add CalDAV support
 Home-page: http://www.tryton.org/
 Author: B2CK
diff --git a/__tryton__.py b/__tryton__.py
index 351343a..82394ba 100644
--- a/__tryton__.py
+++ b/__tryton__.py
@@ -11,7 +11,7 @@
     'name_es_ES': 'Calendario',
     'name_fr_FR': 'Calendrier',
     'name_ru_RU': 'Календарь',
-    'version': '2.4.0',
+    'version': '2.4.1',
     'author': 'B2CK',
     'email': 'info at b2ck.com',
     'website': 'http://www.tryton.org/',
diff --git a/locale/es_AR.po b/locale/es_AR.po
index 542f292..39ec4b4 100644
--- a/locale/es_AR.po
+++ b/locale/es_AR.po
@@ -1,3 +1,1099 @@
 # 
 msgid ""
 msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "error:calendar.calendar:"
+msgid "A user can have only one calendar!"
+msgstr "¡Un usuario solo puede tener un calendario!"
+
+msgctxt "error:calendar.calendar:"
+msgid "The name of calendar must be unique!"
+msgstr "¡El nombre del calendario debe ser único!"
+
+msgctxt "error:calendar.category:"
+msgid "The name of calendar category must be unique!"
+msgstr "¡El nombre de la categoría  del calendario debe ser único!"
+
+msgctxt "error:calendar.event:"
+msgid "Recurrence can not be recurrent!"
+msgstr "¡Una recurrencia no puede ser recurrente!"
+
+msgctxt "error:calendar.event:"
+msgid "UUID and recurrence must be unique in a calendar!"
+msgstr "¡UUID y recurrencia deben ser únicos en un calendario!"
+
+msgctxt "error:calendar.location:"
+msgid "The name of calendar location must be unique!"
+msgstr "¡El nombre de la ubicación del calendario debe ser único!"
+
+msgctxt "error:calendar.rrule:"
+msgid "Invalid \"By Day\""
+msgstr "Inválido «por día»"
+
+msgctxt "error:calendar.rrule:"
+msgid "Invalid \"By Hour\""
+msgstr "Inválido «por hora»"
+
+msgctxt "error:calendar.rrule:"
+msgid "Invalid \"By Minute\""
+msgstr "Inválido «por minuto»"
+
+msgctxt "error:calendar.rrule:"
+msgid "Invalid \"By Month Day\""
+msgstr "Inválido «por día del mes»"
+
+msgctxt "error:calendar.rrule:"
+msgid "Invalid \"By Month\""
+msgstr "Inválido «por mes»"
+
+msgctxt "error:calendar.rrule:"
+msgid "Invalid \"By Position\""
+msgstr "Inválido «por posición»"
+
+msgctxt "error:calendar.rrule:"
+msgid "Invalid \"By Second\""
+msgstr "Inválido «por segundos»"
+
+msgctxt "error:calendar.rrule:"
+msgid "Invalid \"By Week Number\""
+msgstr "Inválido «por número de semana»"
+
+msgctxt "error:calendar.rrule:"
+msgid "Invalid \"By Year Day\""
+msgstr "Inválido «por día del año»"
+
+msgctxt "error:calendar.rrule:"
+msgid "Only one of \"until\" and \"count\" can be set!"
+msgstr "¡Solo se puede usar o «hasta» o «Número de veces»!"
+
+msgctxt "field:calendar.alarm,create_date:"
+msgid "Create Date"
+msgstr "Fecha creación"
+
+msgctxt "field:calendar.alarm,create_uid:"
+msgid "Create User"
+msgstr "Usuario creación"
+
+msgctxt "field:calendar.alarm,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.alarm,rec_name:"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:calendar.alarm,valarm:"
+msgid "valarm"
+msgstr "valarm"
+
+msgctxt "field:calendar.alarm,write_date:"
+msgid "Write Date"
+msgstr "Fecha modificación"
+
+msgctxt "field:calendar.alarm,write_uid:"
+msgid "Write User"
+msgstr "Usuario modificación"
+
+msgctxt "field:calendar.attendee,attendee:"
+msgid "attendee"
+msgstr "asistentes"
+
+msgctxt "field:calendar.attendee,create_date:"
+msgid "Create Date"
+msgstr "Fecha creación"
+
+msgctxt "field:calendar.attendee,create_uid:"
+msgid "Create User"
+msgstr "Usuario creación"
+
+msgctxt "field:calendar.attendee,email:"
+msgid "Email"
+msgstr "Correo electrónico"
+
+msgctxt "field:calendar.attendee,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.attendee,rec_name:"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:calendar.attendee,status:"
+msgid "Participation Status"
+msgstr "Estado de participación"
+
+msgctxt "field:calendar.attendee,write_date:"
+msgid "Write Date"
+msgstr "Fecha modificación"
+
+msgctxt "field:calendar.attendee,write_uid:"
+msgid "Write User"
+msgstr "Usuario modificación"
+
+msgctxt "field:calendar.calendar,create_date:"
+msgid "Create Date"
+msgstr "Fecha creación"
+
+msgctxt "field:calendar.calendar,create_uid:"
+msgid "Create User"
+msgstr "Usuario creación"
+
+msgctxt "field:calendar.calendar,description:"
+msgid "Description"
+msgstr "Descripción"
+
+msgctxt "field:calendar.calendar,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.calendar,name:"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:calendar.calendar,owner:"
+msgid "Owner"
+msgstr "Dueño"
+
+msgctxt "field:calendar.calendar,read_users:"
+msgid "Read Users"
+msgstr "Usuarios con lectura"
+
+msgctxt "field:calendar.calendar,rec_name:"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:calendar.calendar,write_date:"
+msgid "Write Date"
+msgstr "Fecha modificación"
+
+msgctxt "field:calendar.calendar,write_uid:"
+msgid "Write User"
+msgstr "Usuario modificación"
+
+msgctxt "field:calendar.calendar,write_users:"
+msgid "Write Users"
+msgstr "Usuarios con escritura"
+
+msgctxt "field:calendar.calendar-read-res.user,calendar:"
+msgid "Calendar"
+msgstr "Calendario"
+
+msgctxt "field:calendar.calendar-read-res.user,create_date:"
+msgid "Create Date"
+msgstr "Fecha creación"
+
+msgctxt "field:calendar.calendar-read-res.user,create_uid:"
+msgid "Create User"
+msgstr "Usuario creación"
+
+msgctxt "field:calendar.calendar-read-res.user,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.calendar-read-res.user,rec_name:"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:calendar.calendar-read-res.user,user:"
+msgid "User"
+msgstr "Usuario"
+
+msgctxt "field:calendar.calendar-read-res.user,write_date:"
+msgid "Write Date"
+msgstr "Fecha modificación"
+
+msgctxt "field:calendar.calendar-read-res.user,write_uid:"
+msgid "Write User"
+msgstr "Usuario modificación"
+
+msgctxt "field:calendar.calendar-write-res.user,calendar:"
+msgid "Calendar"
+msgstr "Calendario"
+
+msgctxt "field:calendar.calendar-write-res.user,create_date:"
+msgid "Create Date"
+msgstr "Fecha creación"
+
+msgctxt "field:calendar.calendar-write-res.user,create_uid:"
+msgid "Create User"
+msgstr "Usuario creación"
+
+msgctxt "field:calendar.calendar-write-res.user,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.calendar-write-res.user,rec_name:"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:calendar.calendar-write-res.user,user:"
+msgid "User"
+msgstr "Usuario"
+
+msgctxt "field:calendar.calendar-write-res.user,write_date:"
+msgid "Write Date"
+msgstr "Fecha modificación"
+
+msgctxt "field:calendar.calendar-write-res.user,write_uid:"
+msgid "Write User"
+msgstr "Usuario modificación"
+
+msgctxt "field:calendar.category,create_date:"
+msgid "Create Date"
+msgstr "Fecha creación"
+
+msgctxt "field:calendar.category,create_uid:"
+msgid "Create User"
+msgstr "Usuario creación"
+
+msgctxt "field:calendar.category,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.category,name:"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:calendar.category,rec_name:"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:calendar.category,write_date:"
+msgid "Write Date"
+msgstr "Fecha modificación"
+
+msgctxt "field:calendar.category,write_uid:"
+msgid "Write User"
+msgstr "Usuario modificación"
+
+msgctxt "field:calendar.date,create_date:"
+msgid "Create Date"
+msgstr "Fecha creación"
+
+msgctxt "field:calendar.date,create_uid:"
+msgid "Create User"
+msgstr "Usuario creación"
+
+msgctxt "field:calendar.date,date:"
+msgid "Is Date"
+msgstr "Es fecha"
+
+msgctxt "field:calendar.date,datetime:"
+msgid "Date"
+msgstr "Fecha"
+
+msgctxt "field:calendar.date,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.date,rec_name:"
+msgid "Name"
+msgstr "Nombre del campo"
+
+msgctxt "field:calendar.date,write_date:"
+msgid "Write Date"
+msgstr "Fecha modificación"
+
+msgctxt "field:calendar.date,write_uid:"
+msgid "Write User"
+msgstr "Usuario modificación"
+
+msgctxt "field:calendar.event,alarms:"
+msgid "Alarms"
+msgstr "Alarmas"
+
+msgctxt "field:calendar.event,all_day:"
+msgid "All Day"
+msgstr "Todo el día"
+
+msgctxt "field:calendar.event,attendees:"
+msgid "Attendees"
+msgstr "Asistentes"
+
+msgctxt "field:calendar.event,calendar:"
+msgid "Calendar"
+msgstr "Calendario"
+
+msgctxt "field:calendar.event,calendar_owner:"
+msgid "Owner"
+msgstr "Dueño"
+
+msgctxt "field:calendar.event,calendar_read_users:"
+msgid "Read Users"
+msgstr "Usuarios con lectura"
+
+msgctxt "field:calendar.event,calendar_write_users:"
+msgid "Write Users"
+msgstr "Usuarios con escritura"
+
+msgctxt "field:calendar.event,categories:"
+msgid "Categories"
+msgstr "Categorías"
+
+msgctxt "field:calendar.event,classification:"
+msgid "Classification"
+msgstr "Clasificación"
+
+msgctxt "field:calendar.event,create_date:"
+msgid "Create Date"
+msgstr "Fecha creación"
+
+msgctxt "field:calendar.event,create_uid:"
+msgid "Create User"
+msgstr "Usuario creación"
+
+msgctxt "field:calendar.event,description:"
+msgid "Description"
+msgstr "Descripción"
+
+msgctxt "field:calendar.event,dtend:"
+msgid "End Date"
+msgstr "Fecha fin"
+
+msgctxt "field:calendar.event,dtstart:"
+msgid "Start Date"
+msgstr "Fecha inicio"
+
+msgctxt "field:calendar.event,exdates:"
+msgid "Exception Dates"
+msgstr "Fechas excluidas"
+
+msgctxt "field:calendar.event,exrules:"
+msgid "Exception Rules"
+msgstr "Reglas de excepción"
+
+msgctxt "field:calendar.event,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.event,location:"
+msgid "Location"
+msgstr "Ubicación"
+
+msgctxt "field:calendar.event,occurences:"
+msgid "Occurences"
+msgstr "Ocurrencias"
+
+msgctxt "field:calendar.event,organizer:"
+msgid "Organizer"
+msgstr "Organizador"
+
+msgctxt "field:calendar.event,parent:"
+msgid "Parent"
+msgstr "Padre"
+
+msgctxt "field:calendar.event,rdates:"
+msgid "Recurrence Dates"
+msgstr "Fechas de recurrencia"
+
+msgctxt "field:calendar.event,rec_name:"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:calendar.event,recurrence:"
+msgid "Recurrence"
+msgstr "Recurrencia"
+
+msgctxt "field:calendar.event,rrules:"
+msgid "Recurrence Rules"
+msgstr "Reglas de recurrencia"
+
+msgctxt "field:calendar.event,sequence:"
+msgid "Sequence"
+msgstr "Secuencia"
+
+msgctxt "field:calendar.event,status:"
+msgid "Status"
+msgstr "Estado"
+
+msgctxt "field:calendar.event,summary:"
+msgid "Summary"
+msgstr "Resumen"
+
+msgctxt "field:calendar.event,timezone:"
+msgid "Timezone"
+msgstr "Zona horaria"
+
+msgctxt "field:calendar.event,transp:"
+msgid "Time Transparency"
+msgstr "Tiempo de transparencia"
+
+msgctxt "field:calendar.event,uuid:"
+msgid "UUID"
+msgstr "UUID"
+
+msgctxt "field:calendar.event,vevent:"
+msgid "vevent"
+msgstr "vevent"
+
+msgctxt "field:calendar.event,write_date:"
+msgid "Write Date"
+msgstr "Fecha modificación"
+
+msgctxt "field:calendar.event,write_uid:"
+msgid "Write User"
+msgstr "Usuario modificación"
+
+msgctxt "field:calendar.event-calendar.category,category:"
+msgid "Category"
+msgstr "Categoría"
+
+msgctxt "field:calendar.event-calendar.category,create_date:"
+msgid "Create Date"
+msgstr "Fecha creación"
+
+msgctxt "field:calendar.event-calendar.category,create_uid:"
+msgid "Create User"
+msgstr "Usuario creación"
+
+msgctxt "field:calendar.event-calendar.category,event:"
+msgid "Event"
+msgstr "Evento"
+
+msgctxt "field:calendar.event-calendar.category,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.event-calendar.category,rec_name:"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:calendar.event-calendar.category,write_date:"
+msgid "Write Date"
+msgstr "Fecha modificación"
+
+msgctxt "field:calendar.event-calendar.category,write_uid:"
+msgid "Write User"
+msgstr "Usuario modificación"
+
+msgctxt "field:calendar.event.alarm,calendar_alarm:"
+msgid "Calendar Alarm"
+msgstr "Alarma del calendario"
+
+msgctxt "field:calendar.event.alarm,create_date:"
+msgid "Create Date"
+msgstr "Fecha creación"
+
+msgctxt "field:calendar.event.alarm,create_uid:"
+msgid "Create User"
+msgstr "Usuario creación"
+
+msgctxt "field:calendar.event.alarm,event:"
+msgid "Event"
+msgstr "Evento"
+
+msgctxt "field:calendar.event.alarm,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.event.alarm,rec_name:"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:calendar.event.alarm,write_date:"
+msgid "Write Date"
+msgstr "Fecha modificación"
+
+msgctxt "field:calendar.event.alarm,write_uid:"
+msgid "Write User"
+msgstr "Usuario modificación"
+
+msgctxt "field:calendar.event.attendee,calendar_attendee:"
+msgid "Calendar Attendee"
+msgstr "Calendario de asistentes"
+
+msgctxt "field:calendar.event.attendee,create_date:"
+msgid "Create Date"
+msgstr "Fecha creación"
+
+msgctxt "field:calendar.event.attendee,create_uid:"
+msgid "Create User"
+msgstr "Usuario creación"
+
+msgctxt "field:calendar.event.attendee,event:"
+msgid "Event"
+msgstr "Evento"
+
+msgctxt "field:calendar.event.attendee,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.event.attendee,rec_name:"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:calendar.event.attendee,write_date:"
+msgid "Write Date"
+msgstr "Fecha modificación"
+
+msgctxt "field:calendar.event.attendee,write_uid:"
+msgid "Write User"
+msgstr "Usuario modificación"
+
+msgctxt "field:calendar.event.exdate,calendar_date:"
+msgid "Calendar Date"
+msgstr "Fecha Calendario"
+
+msgctxt "field:calendar.event.exdate,create_date:"
+msgid "Create Date"
+msgstr "Fecha creación"
+
+msgctxt "field:calendar.event.exdate,create_uid:"
+msgid "Create User"
+msgstr "Usuario creación"
+
+msgctxt "field:calendar.event.exdate,event:"
+msgid "Event"
+msgstr "Evento"
+
+msgctxt "field:calendar.event.exdate,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.event.exdate,rec_name:"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:calendar.event.exdate,write_date:"
+msgid "Write Date"
+msgstr "Fecha modificación"
+
+msgctxt "field:calendar.event.exdate,write_uid:"
+msgid "Write User"
+msgstr "Usuario modificación"
+
+msgctxt "field:calendar.event.exrule,calendar_rrule:"
+msgid "Calendar RRule"
+msgstr "Regla de recurrencia"
+
+msgctxt "field:calendar.event.exrule,create_date:"
+msgid "Create Date"
+msgstr "Fecha creación"
+
+msgctxt "field:calendar.event.exrule,create_uid:"
+msgid "Create User"
+msgstr "Usuario creación"
+
+msgctxt "field:calendar.event.exrule,event:"
+msgid "Event"
+msgstr "Evento"
+
+msgctxt "field:calendar.event.exrule,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.event.exrule,rec_name:"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:calendar.event.exrule,write_date:"
+msgid "Write Date"
+msgstr "Fecha modificación"
+
+msgctxt "field:calendar.event.exrule,write_uid:"
+msgid "Write User"
+msgstr "Usuario modificación"
+
+msgctxt "field:calendar.event.rdate,calendar_date:"
+msgid "Calendar Date"
+msgstr "Fecha Calendario"
+
+msgctxt "field:calendar.event.rdate,create_date:"
+msgid "Create Date"
+msgstr "Fecha creación"
+
+msgctxt "field:calendar.event.rdate,create_uid:"
+msgid "Create User"
+msgstr "Usuario creación"
+
+msgctxt "field:calendar.event.rdate,event:"
+msgid "Event"
+msgstr "Evento"
+
+msgctxt "field:calendar.event.rdate,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.event.rdate,rec_name:"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:calendar.event.rdate,write_date:"
+msgid "Write Date"
+msgstr "Fecha modificación"
+
+msgctxt "field:calendar.event.rdate,write_uid:"
+msgid "Write User"
+msgstr "Usuario modificación"
+
+msgctxt "field:calendar.event.rrule,calendar_rrule:"
+msgid "Calendar RRule"
+msgstr "Regla de recurrencia"
+
+msgctxt "field:calendar.event.rrule,create_date:"
+msgid "Create Date"
+msgstr "Fecha creación"
+
+msgctxt "field:calendar.event.rrule,create_uid:"
+msgid "Create User"
+msgstr "Usuario creación"
+
+msgctxt "field:calendar.event.rrule,event:"
+msgid "Event"
+msgstr "Evento"
+
+msgctxt "field:calendar.event.rrule,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.event.rrule,rec_name:"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:calendar.event.rrule,write_date:"
+msgid "Write Date"
+msgstr "Fecha modificación"
+
+msgctxt "field:calendar.event.rrule,write_uid:"
+msgid "Write User"
+msgstr "Usuario modificación"
+
+msgctxt "field:calendar.location,create_date:"
+msgid "Create Date"
+msgstr "Fecha creación"
+
+msgctxt "field:calendar.location,create_uid:"
+msgid "Create User"
+msgstr "Usuario creación"
+
+msgctxt "field:calendar.location,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.location,name:"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:calendar.location,rec_name:"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:calendar.location,write_date:"
+msgid "Write Date"
+msgstr "Fecha modificación"
+
+msgctxt "field:calendar.location,write_uid:"
+msgid "Write User"
+msgstr "Usuario modificación"
+
+msgctxt "field:calendar.rrule,byday:"
+msgid "By Day"
+msgstr "Por día"
+
+msgctxt "field:calendar.rrule,byhour:"
+msgid "By Hour"
+msgstr "Por hora"
+
+msgctxt "field:calendar.rrule,byminute:"
+msgid "By Minute"
+msgstr "Por minuto"
+
+msgctxt "field:calendar.rrule,bymonth:"
+msgid "By Month"
+msgstr "Por mes"
+
+msgctxt "field:calendar.rrule,bymonthday:"
+msgid "By Month Day"
+msgstr "Por día del mes"
+
+msgctxt "field:calendar.rrule,bysecond:"
+msgid "By Second"
+msgstr "Por segundo"
+
+msgctxt "field:calendar.rrule,bysetpos:"
+msgid "By Position"
+msgstr "Por posición"
+
+msgctxt "field:calendar.rrule,byweekno:"
+msgid "By Week Number"
+msgstr "Por día de la semana"
+
+msgctxt "field:calendar.rrule,byyearday:"
+msgid "By Year Day"
+msgstr "Por día del año"
+
+msgctxt "field:calendar.rrule,count:"
+msgid "Count"
+msgstr "Número de veces"
+
+msgctxt "field:calendar.rrule,create_date:"
+msgid "Create Date"
+msgstr "Fecha creación"
+
+msgctxt "field:calendar.rrule,create_uid:"
+msgid "Create User"
+msgstr "Usuario creación"
+
+msgctxt "field:calendar.rrule,freq:"
+msgid "Frequency"
+msgstr "Frecuencia"
+
+msgctxt "field:calendar.rrule,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.rrule,interval:"
+msgid "Interval"
+msgstr "Intervalo"
+
+msgctxt "field:calendar.rrule,rec_name:"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:calendar.rrule,until:"
+msgid "Until Date"
+msgstr "Hasta la fecha"
+
+msgctxt "field:calendar.rrule,until_date:"
+msgid "Is Date"
+msgstr "Es fecha"
+
+msgctxt "field:calendar.rrule,wkst:"
+msgid "Week Day"
+msgstr "Día de la semana"
+
+msgctxt "field:calendar.rrule,write_date:"
+msgid "Write Date"
+msgstr "Fecha modificación"
+
+msgctxt "field:calendar.rrule,write_uid:"
+msgid "Write User"
+msgstr "Usuario modificación"
+
+msgctxt "field:res.user,calendars:"
+msgid "Calendars"
+msgstr "Calendarios"
+
+msgctxt "help:calendar.calendar,owner:"
+msgid "The user must have an email"
+msgstr "El usuario debe tener un correo electrónico"
+
+msgctxt "help:calendar.date,date:"
+msgid "Ignore time of field \"Date\", but handle as date only."
+msgstr "Ignore tiempo del campo \"Fecha\", pero manejelo como fecha solamente."
+
+msgctxt "help:calendar.event,uuid:"
+msgid "Universally Unique Identifier"
+msgstr "Identificador universal único"
+
+msgctxt "help:calendar.rrule,until_date:"
+msgid "Ignore time of field \"Until Date\", but handle as date only."
+msgstr "Ignora la hora del campo «Hasta la fecha», y trata solo la fecha"
+
+msgctxt "model:calendar.alarm,name:"
+msgid "Alarm"
+msgstr "Alarma"
+
+msgctxt "model:calendar.attendee,name:"
+msgid "Attendee"
+msgstr "Asistentes"
+
+msgctxt "model:calendar.calendar,name:"
+msgid "Calendar"
+msgstr "Calendario"
+
+msgctxt "model:calendar.calendar-read-res.user,name:"
+msgid "Calendar - read - User"
+msgstr "Calendario - leer - usuario"
+
+msgctxt "model:calendar.calendar-write-res.user,name:"
+msgid "Calendar - write - User"
+msgstr "Calendario - escribir - usuario"
+
+msgctxt "model:calendar.category,name:"
+msgid "Category"
+msgstr "Categoría"
+
+msgctxt "model:calendar.date,name:"
+msgid "Calendar Date"
+msgstr "Fecha Calendario"
+
+msgctxt "model:calendar.event,name:"
+msgid "Event"
+msgstr "Evento"
+
+msgctxt "model:calendar.event-calendar.category,name:"
+msgid "Event - Category"
+msgstr "Evento - Categoría"
+
+msgctxt "model:calendar.event.alarm,name:"
+msgid "Alarm"
+msgstr "Alarma"
+
+msgctxt "model:calendar.event.attendee,name:"
+msgid "Attendee"
+msgstr "Asistentes"
+
+msgctxt "model:calendar.event.exdate,name:"
+msgid "Exception Date"
+msgstr "Fecha excluida"
+
+msgctxt "model:calendar.event.exrule,name:"
+msgid "Exception Rule"
+msgstr "Regla de excepción"
+
+msgctxt "model:calendar.event.rdate,name:"
+msgid "Recurrence Date"
+msgstr "Fecha de recurrencia"
+
+msgctxt "model:calendar.event.rrule,name:"
+msgid "Recurrence Rule"
+msgstr "Regla de recurrencia"
+
+msgctxt "model:calendar.location,name:"
+msgid "Location"
+msgstr "Ubicación"
+
+msgctxt "model:calendar.rrule,name:"
+msgid "Recurrence Rule"
+msgstr "Regla de recurrencia"
+
+msgctxt "model:ir.action,name:act_calendar_form"
+msgid "Calendars"
+msgstr "Calendarios"
+
+msgctxt "model:ir.action,name:act_event_form"
+msgid "Events"
+msgstr "Eventos"
+
+msgctxt "model:ir.action,name:act_event_form3"
+msgid "Events"
+msgstr "Eventos"
+
+msgctxt "model:ir.ui.menu,name:menu_calendar"
+msgid "Calendar"
+msgstr "Gestión de calendario"
+
+msgctxt "model:ir.ui.menu,name:menu_calendar_form"
+msgid "Calendars"
+msgstr "Calendarios"
+
+msgctxt "model:ir.ui.menu,name:menu_event_form"
+msgid "Events"
+msgstr "Eventos"
+
+msgctxt "model:res.group,name:group_calendar_admin"
+msgid "Calendar Administration"
+msgstr "Administración de calendario"
+
+msgctxt "selection:calendar.attendee,status:"
+msgid ""
+msgstr ""
+
+msgctxt "selection:calendar.attendee,status:"
+msgid "Accepted"
+msgstr "Aceptada"
+
+msgctxt "selection:calendar.attendee,status:"
+msgid "Declined"
+msgstr "Rehusado"
+
+msgctxt "selection:calendar.attendee,status:"
+msgid "Delegated"
+msgstr "Delegada"
+
+msgctxt "selection:calendar.attendee,status:"
+msgid "Needs Action"
+msgstr "Necesita una acción"
+
+msgctxt "selection:calendar.attendee,status:"
+msgid "Tentative"
+msgstr "Tentativa"
+
+msgctxt "selection:calendar.event,classification:"
+msgid "Confidential"
+msgstr "Confidencial"
+
+msgctxt "selection:calendar.event,classification:"
+msgid "Private"
+msgstr "Privado"
+
+msgctxt "selection:calendar.event,classification:"
+msgid "Public"
+msgstr "Público"
+
+msgctxt "selection:calendar.event,status:"
+msgid ""
+msgstr ""
+
+msgctxt "selection:calendar.event,status:"
+msgid "Cancelled"
+msgstr "Cancelado"
+
+msgctxt "selection:calendar.event,status:"
+msgid "Confirmed"
+msgstr "Confirmada"
+
+msgctxt "selection:calendar.event,status:"
+msgid "Tentative"
+msgstr "Tentativo"
+
+msgctxt "selection:calendar.event,transp:"
+msgid "Opaque"
+msgstr "Opaco"
+
+msgctxt "selection:calendar.event,transp:"
+msgid "Transparent"
+msgstr "Transparente"
+
+msgctxt "selection:calendar.rrule,freq:"
+msgid "Daily"
+msgstr "Diariamente"
+
+msgctxt "selection:calendar.rrule,freq:"
+msgid "Hourly"
+msgstr "Cada hora"
+
+msgctxt "selection:calendar.rrule,freq:"
+msgid "Minutely"
+msgstr "Cada minuto"
+
+msgctxt "selection:calendar.rrule,freq:"
+msgid "Monthly"
+msgstr "Mensualmente"
+
+msgctxt "selection:calendar.rrule,freq:"
+msgid "Secondly"
+msgstr "Cada segundo"
+
+msgctxt "selection:calendar.rrule,freq:"
+msgid "Weekly"
+msgstr "Semanalmente"
+
+msgctxt "selection:calendar.rrule,freq:"
+msgid "Yearly"
+msgstr "Anualmente"
+
+msgctxt "selection:calendar.rrule,wkst:"
+msgid "Friday"
+msgstr "Viernes"
+
+msgctxt "selection:calendar.rrule,wkst:"
+msgid "Monday"
+msgstr "Lunes"
+
+msgctxt "selection:calendar.rrule,wkst:"
+msgid "Saturday"
+msgstr "Sábado"
+
+msgctxt "selection:calendar.rrule,wkst:"
+msgid "Sunday"
+msgstr "Domingo"
+
+msgctxt "selection:calendar.rrule,wkst:"
+msgid "Thursday"
+msgstr "Jueves"
+
+msgctxt "selection:calendar.rrule,wkst:"
+msgid "Tuesday"
+msgstr "Martes"
+
+msgctxt "selection:calendar.rrule,wkst:"
+msgid "Wednesday"
+msgstr "Miércoles"
+
+msgctxt "view:calendar.calendar:"
+msgid "Calendar"
+msgstr "Calendario"
+
+msgctxt "view:calendar.calendar:"
+msgid "Calendars"
+msgstr "Calendarios"
+
+msgctxt "view:calendar.calendar:"
+msgid "General"
+msgstr "General"
+
+msgctxt "view:calendar.calendar:"
+msgid "Security"
+msgstr "Seguridad"
+
+msgctxt "view:calendar.category:"
+msgid "Categories"
+msgstr "Categorías"
+
+msgctxt "view:calendar.category:"
+msgid "Category"
+msgstr "Categoría"
+
+msgctxt "view:calendar.event.attendee:"
+msgid "Attendee"
+msgstr "Asistentes"
+
+msgctxt "view:calendar.event.attendee:"
+msgid "Attendees"
+msgstr "Asistentes"
+
+msgctxt "view:calendar.event.exdate:"
+msgid "Exception Date"
+msgstr "Fecha excluida"
+
+msgctxt "view:calendar.event.exdate:"
+msgid "Exception Dates"
+msgstr "Fechas excluidas"
+
+msgctxt "view:calendar.event.exrule:"
+msgid "Exception Rule"
+msgstr "Regla de excepción"
+
+msgctxt "view:calendar.event.exrule:"
+msgid "Exception Rules"
+msgstr "Reglas de excepciones"
+
+msgctxt "view:calendar.event.rdate:"
+msgid "Recurrence Date"
+msgstr "Fecha de recurrencia"
+
+msgctxt "view:calendar.event.rdate:"
+msgid "Recurrence Dates"
+msgstr "Fechas de recurrencia"
+
+msgctxt "view:calendar.event.rrule:"
+msgid "Recurrence Rule"
+msgstr "Regla de recurrencia"
+
+msgctxt "view:calendar.event.rrule:"
+msgid "Recurrence Rules"
+msgstr "Reglas de recurrencia"
+
+msgctxt "view:calendar.event:"
+msgid "Attendees"
+msgstr "Asistentes"
+
+msgctxt "view:calendar.event:"
+msgid "Categories"
+msgstr "Categorías"
+
+msgctxt "view:calendar.event:"
+msgid "Event"
+msgstr "Evento"
+
+msgctxt "view:calendar.event:"
+msgid "Events"
+msgstr "Eventos"
+
+msgctxt "view:calendar.event:"
+msgid "General"
+msgstr "General"
+
+msgctxt "view:calendar.event:"
+msgid "Occurences"
+msgstr "Ocurrencias"
+
+msgctxt "view:calendar.location:"
+msgid "Location"
+msgstr "Ubicación"
+
+msgctxt "view:calendar.location:"
+msgid "Locations"
+msgstr "Ubicaciones"
diff --git a/trytond_calendar.egg-info/PKG-INFO b/trytond_calendar.egg-info/PKG-INFO
index e7c3b87..be19eb1 100644
--- a/trytond_calendar.egg-info/PKG-INFO
+++ b/trytond_calendar.egg-info/PKG-INFO
@@ -1,6 +1,6 @@
 Metadata-Version: 1.0
 Name: trytond-calendar
-Version: 2.4.0
+Version: 2.4.1
 Summary: Add CalDAV support
 Home-page: http://www.tryton.org/
 Author: B2CK
commit 2ab6a5886387d9ba02f6c0a6f8ca846b8484cd1d
Author: Mathias Behrle <mathiasb at m9s.biz>
Date:   Tue Apr 24 19:30:39 2012 +0200

    Adding upstream version 2.4.0.

diff --git a/CHANGELOG b/CHANGELOG
index b9c58e4..236087d 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,3 +1,6 @@
+Version 2.4.0 - 2012-04-23
+* Bug fixes (see mercurial logs for details)
+
 Version 2.2.0 - 2011-10-24
 * Bug fixes (see mercurial logs for details)
 * Basic support of event time-range filter
diff --git a/COPYRIGHT b/COPYRIGHT
index 1245dd5..8ad4b79 100644
--- a/COPYRIGHT
+++ b/COPYRIGHT
@@ -1,6 +1,6 @@
-Copyright (C) 2009-2011 Cédric Krier.
-Copyright (C) 2009-2011 Bertrand Chenal.
-Copyright (C) 2009-2011 B2CK SPRL.
+Copyright (C) 2009-2012 Cédric Krier.
+Copyright (C) 2009-2012 Bertrand Chenal.
+Copyright (C) 2009-2012 B2CK SPRL.
 
 This program is free software: you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
diff --git a/INSTALL b/INSTALL
index 9a3da7b..81c19d7 100644
--- a/INSTALL
+++ b/INSTALL
@@ -4,10 +4,10 @@ Installing trytond_calendar
 Prerequisites
 -------------
 
- * Python 2.5 or later (http://www.python.org/)
+ * Python 2.6 or later (http://www.python.org/)
  * trytond (http://www.tryton.org/)
  * vobject >= 0.8.0 (http://vobject.skyhouseconsulting.com/)
- * pywebdav >= 0.9.3 (http://sourceforge.net/projects/pywebdav/)
+ * pywebdav >= 0.9.8 (http://sourceforge.net/projects/pywebdav/)
  * python-dateutil (http://labix.org/python-dateutil)
  * pytz (http://pytz.sourceforge.net/)
 
diff --git a/PKG-INFO b/PKG-INFO
index bf5bc32..7a975ed 100644
--- a/PKG-INFO
+++ b/PKG-INFO
@@ -1,12 +1,12 @@
 Metadata-Version: 1.0
 Name: trytond_calendar
-Version: 2.2.0
+Version: 2.4.0
 Summary: Add CalDAV support
 Home-page: http://www.tryton.org/
 Author: B2CK
 Author-email: info at b2ck.com
 License: GPL-3
-Download-URL: http://downloads.tryton.org/2.2/
+Download-URL: http://downloads.tryton.org/2.4/
 Description: UNKNOWN
 Platform: UNKNOWN
 Classifier: Development Status :: 5 - Production/Stable
diff --git a/__init__.py b/__init__.py
index a09702d..0f1995e 100644
--- a/__init__.py
+++ b/__init__.py
@@ -1,7 +1,7 @@
 #This file is part of Tryton.  The COPYRIGHT file at the top level of
 #this repository contains the full copyright notices and license terms.
 
-import caldav
-from webdav import *
-from calendar import *
-from res import *
+from . import caldav
+from .webdav import *
+from .calendar_ import *
+from .res import *
diff --git a/__tryton__.py b/__tryton__.py
index b4aa5d1..351343a 100644
--- a/__tryton__.py
+++ b/__tryton__.py
@@ -2,36 +2,42 @@
 #This file is part of Tryton.  The COPYRIGHT file at the top level of
 #this repository contains the full copyright notices and license terms.
 {
-    'name' : 'Calendar',
-    'name_bg_BG' : 'Календар',
-    'name_de_DE' : 'Kalender',
-    'name_es_CO' : 'Calendario',
-    'name_es_ES' : 'Calendario',
-    'name_fr_FR' : 'Calendrier',
-    'name_ru_RU' : 'Календарь',
-    'version' : '2.2.0',
-    'author' : 'B2CK',
+    'name': 'Calendar',
+    'name_bg_BG': 'Календар',
+    'name_ca_ES': 'Calendari',
+    'name_de_DE': 'Kalender',
+    'name_es_AR': 'Calendario',
+    'name_es_CO': 'Calendario',
+    'name_es_ES': 'Calendario',
+    'name_fr_FR': 'Calendrier',
+    'name_ru_RU': 'Календарь',
+    'version': '2.4.0',
+    'author': 'B2CK',
     'email': 'info at b2ck.com',
     'website': 'http://www.tryton.org/',
     'description': 'Add CalDAV support',
-    'description_bg_BG' : 'Добавя подръжка на CalDAV',
-    'description_de_DE' : 'Fügt Unterstützung für CalDAV hinzu',
-    'description_es_CO' : 'Añade soporte para CalDAV',
-    'description_es_ES' : 'Añade soporte para CalDAV',
-    'description_fr_FR' : 'Ajoute le support CalDAV',
-    'description_ru_RU' : 'Добавление поддержки CalDAV',
-    'depends' : [
+    'description_bg_BG': 'Добавя подръжка на CalDAV',
+    'description_ca_ES': 'Afegeix suport per CalDAV.',
+    'description_de_DE': 'Fügt Unterstützung für CalDAV hinzu',
+    'description_es_AR': 'Añade soporte para CalDAV',
+    'description_es_CO': 'Añade soporte para CalDAV',
+    'description_es_ES': 'Añade soporte para CalDAV',
+    'description_fr_FR': 'Ajoute le support CalDAV',
+    'description_ru_RU': 'Добавление поддержки CalDAV',
+    'depends': [
         'ir',
         'res',
         'webdav',
     ],
-    'xml' : [
+    'xml': [
         'calendar.xml',
     ],
     'translation': [
         'locale/bg_BG.po',
+        'locale/ca_ES.po',
         'locale/cs_CZ.po',
         'locale/de_DE.po',
+        'locale/es_AR.po',
         'locale/es_CO.po',
         'locale/es_ES.po',
         'locale/fr_FR.po',
diff --git a/caldav.py b/caldav.py
index 4b6d56a..2595186 100644
--- a/caldav.py
+++ b/caldav.py
@@ -4,16 +4,15 @@ import urlparse
 import urllib
 from string import atoi
 import xml.dom.minidom
-from DAV import propfind
-from DAV.errors import *
-from DAV.utils import get_uriparentpath
-from DAV.constants import DAV_VERSION_1, DAV_VERSION_2
+from pywebdav.lib import propfind
+from pywebdav.lib.errors import DAV_NotFound, DAV_Error, DAV_Forbidden
+from pywebdav.lib.utils import get_uriparentpath
+from pywebdav.lib.constants import DAV_VERSION_1, DAV_VERSION_2
 from trytond.protocols.webdav import TrytonDAVInterface, CACHE, \
         WebDAVAuthRequestHandler
 from trytond.pool import Pool
 from trytond.transaction import Transaction
 
-_TRYTON_RELOAD = False
 domimpl = xml.dom.minidom.getDOMImplementation()
 
 TrytonDAVInterface.PROPS['urn:ietf:params:xml:ns:caldav'] = (
@@ -24,14 +23,15 @@ TrytonDAVInterface.PROPS['urn:ietf:params:xml:ns:caldav'] = (
         'schedule-inbox-URL',
         'schedule-outbox-URL',
     )
-TrytonDAVInterface.PROPS['DAV:'] = tuple(list(TrytonDAVInterface.PROPS['DAV:']) \
-        + ['principal-collection-set'])
+TrytonDAVInterface.PROPS['DAV:'] = tuple(list(TrytonDAVInterface.PROPS['DAV:'])
+    + ['principal-collection-set'])
 TrytonDAVInterface.M_NS['urn:ietf:params:xml:ns:caldav'] = '_get_caldav'
-DAV_VERSION_1['version'] += ',calendar-access,calendar-schedule'#,calendar-auto-schedule'
-DAV_VERSION_2['version'] += ',calendar-access,calendar-schedule'#,calendar-auto-schedule'
+DAV_VERSION_1['version'] += ',calendar-access,calendar-schedule'
+DAV_VERSION_2['version'] += ',calendar-access,calendar-schedule'
 
 _mk_prop_response = propfind.PROPFIND.mk_prop_response
 
+
 def mk_prop_response(self, uri, good_props, bad_props, doc):
     res = _mk_prop_response(self, uri, good_props, bad_props, doc)
     parent_uri = get_uriparentpath(uri and uri.strip('/') or '')
@@ -52,6 +52,7 @@ def mk_prop_response(self, uri, good_props, bad_props, doc):
 
 propfind.PROPFIND.mk_prop_response = mk_prop_response
 
+
 def _get_caldav_calendar_description(self, uri):
     dbname, dburi = self._get_dburi(uri)
     if not dbname:
@@ -65,7 +66,7 @@ def _get_caldav_calendar_description(self, uri):
         res = collection_obj.get_calendar_description(dburi, cache=CACHE)
     except AttributeError:
         raise DAV_NotFound
-    except (DAV_Error, DAV_NotFound, DAV_Secret, DAV_Forbidden), exception:
+    except DAV_Error, exception:
         self._log_exception(exception)
         raise
     except Exception, exception:
@@ -73,7 +74,9 @@ def _get_caldav_calendar_description(self, uri):
         raise DAV_Error(500)
     return res
 
-TrytonDAVInterface._get_caldav_calendar_description = _get_caldav_calendar_description
+TrytonDAVInterface._get_caldav_calendar_description = \
+    _get_caldav_calendar_description
+
 
 def _get_caldav_calendar_data(self, uri):
     dbname, dburi = self._get_dburi(uri)
@@ -88,7 +91,7 @@ def _get_caldav_calendar_data(self, uri):
         res = collection_obj.get_calendar_data(dburi, cache=CACHE)
     except AttributeError:
         raise DAV_NotFound
-    except (DAV_Error, DAV_NotFound, DAV_Secret, DAV_Forbidden), exception:
+    except DAV_Error, exception:
         self._log_exception(exception)
         raise
     except Exception, exception:
@@ -98,6 +101,7 @@ def _get_caldav_calendar_data(self, uri):
 
 TrytonDAVInterface._get_caldav_calendar_data = _get_caldav_calendar_data
 
+
 def _get_caldav_calendar_home_set(self, uri):
     dbname, dburi = self._get_dburi(uri)
     if not dbname:
@@ -111,7 +115,7 @@ def _get_caldav_calendar_home_set(self, uri):
         res = collection_obj.get_calendar_home_set(dburi, cache=CACHE)
     except AttributeError:
         raise DAV_NotFound
-    except (DAV_Error, DAV_NotFound, DAV_Secret, DAV_Forbidden), exception:
+    except DAV_Error, exception:
         self._log_exception(exception)
         raise
     except Exception, exception:
@@ -128,7 +132,9 @@ def _get_caldav_calendar_home_set(self, uri):
     href.appendChild(huri)
     return href
 
-TrytonDAVInterface._get_caldav_calendar_home_set = _get_caldav_calendar_home_set
+TrytonDAVInterface._get_caldav_calendar_home_set = \
+    _get_caldav_calendar_home_set
+
 
 def _get_caldav_calendar_user_address_set(self, uri):
     dbname, dburi = self._get_dburi(uri)
@@ -143,7 +149,7 @@ def _get_caldav_calendar_user_address_set(self, uri):
         res = collection_obj.get_calendar_user_address_set(dburi, cache=CACHE)
     except AttributeError:
         raise DAV_NotFound
-    except (DAV_Error, DAV_NotFound, DAV_Secret, DAV_Forbidden), exception:
+    except DAV_Error, exception:
         self._log_exception(exception)
         raise
     except Exception, exception:
@@ -156,7 +162,9 @@ def _get_caldav_calendar_user_address_set(self, uri):
     href.appendChild(huri)
     return href
 
-TrytonDAVInterface._get_caldav_calendar_user_address_set = _get_caldav_calendar_user_address_set
+TrytonDAVInterface._get_caldav_calendar_user_address_set = \
+    _get_caldav_calendar_user_address_set
+
 
 def _get_caldav_schedule_inbox_URL(self, uri):
     dbname, dburi = self._get_dburi(uri)
@@ -171,7 +179,7 @@ def _get_caldav_schedule_inbox_URL(self, uri):
         res = collection_obj.get_schedule_inbox_URL(dburi, cache=CACHE)
     except AttributeError:
         raise DAV_NotFound
-    except (DAV_Error, DAV_NotFound, DAV_Secret, DAV_Forbidden), exception:
+    except DAV_Error, exception:
         self._log_exception(exception)
         raise
     except Exception, exception:
@@ -186,7 +194,9 @@ def _get_caldav_schedule_inbox_URL(self, uri):
     href.appendChild(huri)
     return href
 
-TrytonDAVInterface._get_caldav_schedule_inbox_URL = _get_caldav_schedule_inbox_URL
+TrytonDAVInterface._get_caldav_schedule_inbox_URL = \
+    _get_caldav_schedule_inbox_URL
+
 
 def _get_caldav_schedule_outbox_URL(self, uri):
     dbname, dburi = self._get_dburi(uri)
@@ -201,7 +211,7 @@ def _get_caldav_schedule_outbox_URL(self, uri):
         res = collection_obj.get_schedule_outbox_URL(dburi, cache=CACHE)
     except AttributeError:
         raise DAV_NotFound
-    except (DAV_Error, DAV_NotFound, DAV_Secret, DAV_Forbidden), exception:
+    except DAV_Error, exception:
         self._log_exception(exception)
         raise
     except Exception, exception:
@@ -216,12 +226,14 @@ def _get_caldav_schedule_outbox_URL(self, uri):
     href.appendChild(huri)
     return href
 
-TrytonDAVInterface._get_caldav_schedule_outbox_URL = _get_caldav_schedule_outbox_URL
+TrytonDAVInterface._get_caldav_schedule_outbox_URL = \
+    _get_caldav_schedule_outbox_URL
 
 _prev_get_dav_principal_collection_set = hasattr(TrytonDAVInterface,
         '_get_dav_principal_collection_set') and \
                 TrytonDAVInterface._get_dav_principal_collection_set or None
 
+
 def _get_dav_principal_collection_set(self, uri):
     dbname, dburi = self._get_dburi(uri)
     if dburi.startswith('Calendars'):
@@ -237,7 +249,9 @@ def _get_dav_principal_collection_set(self, uri):
         return _prev_get_dav_principal_collection_set(self, uri)
     raise DAV_NotFound
 
-TrytonDAVInterface._get_dav_principal_collection_set = _get_dav_principal_collection_set
+TrytonDAVInterface._get_dav_principal_collection_set = \
+    _get_dav_principal_collection_set
+
 
 def _get_caldav_post(self, uri, body, contenttype=''):
     dbname, dburi = self._get_dburi(uri)
@@ -249,7 +263,7 @@ def _get_caldav_post(self, uri, body, contenttype=''):
         res = calendar_obj.post(dburi, body)
     except AttributeError:
         raise DAV_NotFound
-    except (DAV_Error, DAV_NotFound, DAV_Secret, DAV_Forbidden), exception:
+    except DAV_Error, exception:
         self._log_exception(exception)
         raise
     except Exception, exception:
@@ -261,24 +275,23 @@ TrytonDAVInterface._get_caldav_post = _get_caldav_post
 
 _prev_do_POST = WebDAVAuthRequestHandler.do_POST
 
+
 def do_POST(self):
-    dc=self.IFACE_CLASS
+    dc = self.IFACE_CLASS
 
-    uri=urlparse.urljoin(self.get_baseuri(dc), self.path)
-    uri=urllib.unquote(uri)
+    uri = urlparse.urljoin(self.get_baseuri(dc), self.path)
+    uri = urllib.unquote(uri)
 
     dbname, dburi = TrytonDAVInterface.get_dburi(uri)
     if dburi.startswith('Calendars'):
         # read the body
-        body=None
-        if self.headers.has_key("Content-Length"):
-            l=self.headers['Content-Length']
-            body=self.rfile.read(atoi(l))
-        ct=None
-        if self.headers.has_key("Content-Type"):
-            ct=self.headers['Content-Type']
-
-        headers = {}
+        body = None
+        if 'Content-Length' in self.headers:
+            l = self.headers['Content-Length']
+            body = self.rfile.read(atoi(l))
+        ct = None
+        if 'Content-Type' in self.headers:
+            ct = self.headers['Content-Type']
 
         try:
             DATA = '%s\n' % dc._get_caldav_post(uri, body, ct)
diff --git a/calendar.xml b/calendar.xml
index bdf5ea1..3294b35 100644
--- a/calendar.xml
+++ b/calendar.xml
@@ -170,6 +170,7 @@ this repository contains the full copyright notices and license terms. -->
         <record model="ir.ui.view" id="event_view_tree">
             <field name="model">calendar.event</field>
             <field name="type">tree</field>
+            <field name="priority" eval="10"/>
             <field name="arch" type="xml">
                 <![CDATA[
                 <tree string="Events">
@@ -184,6 +185,24 @@ this repository contains the full copyright notices and license terms. -->
             </field>
         </record>
 
+        <record model="ir.ui.view" id="event_vieww_tree_occurence">
+            <field name="model">calendar.event</field>
+            <field name="type">tree</field>
+            <field name="priority" eval="20"/>
+            <field name="arch" type="xml">
+                <![CDATA[
+                <tree string="Events">
+                    <field name="summary"/>
+                    <field name="recurrence"/>
+                    <field name="all_day"/>
+                    <field name="dtstart"/>
+                    <field name="dtend"/>
+                    <field name="status"/>
+                </tree>
+                ]]>
+            </field>
+        </record>
+
         <record model="ir.ui.view" id="event_view_form">
             <field name="model">calendar.event</field>
             <field name="type">form</field>
@@ -229,16 +248,8 @@ this repository contains the full copyright notices and license terms. -->
                             <field name="rdates" colspan="2"/>
                             <field name="exrules" colspan="2"/>
                             <field name="exdates" colspan="2"/>
-                            <field name="occurences" colspan="4">
-                                <tree string="Events">
-                                    <field name="summary"/>
-                                    <field name="recurrence"/>
-                                    <field name="all_day"/>
-                                    <field name="dtstart"/>
-                                    <field name="dtend"/>
-                                    <field name="status"/>
-                                </tree>
-                            </field>
+                            <field name="occurences" colspan="4"
+                                view_ids="calendar.event_vieww_tree_occurence"/>
                         </page>
                     </notebook>
                     <field name="parent" colspan="4" invisible="1"/>
diff --git a/calendar.py b/calendar_.py
similarity index 93%
rename from calendar.py
rename to calendar_.py
index 24d3635..fef6c1d 100644
--- a/calendar.py
+++ b/calendar_.py
@@ -23,10 +23,10 @@ class Calendar(ModelSQL, ModelView):
     _description = __doc__
     _name = 'calendar.calendar'
 
-    name = fields.Char('Name', required=True, select=1)
+    name = fields.Char('Name', required=True, select=True)
     description = fields.Text('Description')
-    owner = fields.Many2One('res.user', 'Owner', select=1,
-            domain=[('email', '!=', False)],
+    owner = fields.Many2One('res.user', 'Owner', select=True,
+            domain=[('email', '!=', None)],
             help='The user must have an email')
     read_users = fields.Many2Many('calendar.calendar-read-res.user',
             'calendar', 'user', 'Read Users')
@@ -79,14 +79,13 @@ class Calendar(ModelSQL, ModelView):
         Return the calendar id of the name
 
         :param name: the calendar name
-        :return: the calendar.calendar id or False
+        :return: the calendar.calendar id
         '''
         calendar_ids = self.search([
             ('name', '=', name),
             ], limit=1)
         if calendar_ids:
             return calendar_ids[0]
-        return False
 
     def calendar2ical(self, calendar_id):
         '''
@@ -102,7 +101,7 @@ class Calendar(ModelSQL, ModelView):
         ical.vevent_list = []
         event_ids = event_obj.search([
             ('calendar', '=', calendar_id),
-            ('parent', '=', False),
+            ('parent', '=', None),
             ])
         for event in event_obj.browse(event_ids):
             ical2 = event_obj.event2ical(event.id)
@@ -168,13 +167,13 @@ class Calendar(ModelSQL, ModelView):
                         ('dtend', '<=', dtend)],
                     [('dtstart', '>=', dtstart),
                         ('dtstart', '<=', dtend),
-                        ('dtend', '=', False)]],
-                ('parent', '=', False),
-                ('rdates', '=', False),
-                ('rrules', '=', False),
-                ('exdates', '=', False),
-                ('exrules', '=', False),
-                ('occurences', '=', False),
+                        ('dtend', '=', None)]],
+                ('parent', '=', None),
+                ('rdates', '=', None),
+                ('rrules', '=', None),
+                ('exdates', '=', None),
+                ('exrules', '=', None),
+                ('occurences', '=', None),
                 ('calendar', '=', calendar_id),
                 ])
             events = event_obj.browse(event_ids)
@@ -197,14 +196,14 @@ class Calendar(ModelSQL, ModelView):
 
         with Transaction().set_user(0):
             event_ids = event_obj.search([
-                ('parent', '=', False),
+                ('parent', '=', None),
                 ('dtstart', '<=', dtend),
                 ['OR',
-                    ('rdates', '!=', False),
-                    ('rrules', '!=', False),
-                    ('exdates', '!=', False),
-                    ('exrules', '!=', False),
-                    ('occurences', '!=', False),
+                    ('rdates', '!=', None),
+                    ('rrules', '!=', None),
+                    ('exdates', '!=', None),
+                    ('exrules', '!=', None),
+                    ('occurences', '!=', None),
                 ],
                 ('calendar', '=', calendar_id),
                 ])
@@ -214,9 +213,6 @@ class Calendar(ModelSQL, ModelView):
             event_ical = event_obj.event2ical(event)
             if event_ical.vevent.rruleset:
                 between_dtstart, between_dtend = dtstart, dtend
-                if event.all_day:
-                    between_dtstart = dtstart.replace(tzinfo=None)
-                    between_dtend = dtend.replace(tzinfo=None)
                 for freebusy_dtstart in event_ical.vevent.rruleset:
                     if freebusy_dtstart.replace(tzinfo=tzlocal) > dtend:
                         break
@@ -226,19 +222,22 @@ class Calendar(ModelSQL, ModelView):
                         freebusy_dtend = event.dtend.replace(tzinfo=tzlocal)\
                                 - event.dtstart.replace(tzinfo=tzlocal) \
                                 + freebusy_dtstart
-                    if not ((freebusy_dtstart.replace(tzinfo=tzlocal) <= dtstart
-                        and freebusy_dtend.replace(tzinfo=tzlocal) >= dtstart)
-                        or (freebusy_dtstart.replace(tzinfo=tzlocal) <= dtend
-                        and freebusy_dtend.replace(tzinfo=tzlocal) >= dtend)
-                        or (freebusy_dtstart.replace(tzinfo=tzlocal) >= dtstart
-                        and freebusy_dtend.replace(tzinfo=tzlocal) <= dtend)):
+                    f_dtstart_tz = freebusy_dtstart.replace(tzinfo=tzlocal)
+                    f_dtend_tz = freebusy_dtend.replace(tzinfo=tzlocal)
+                    if not ((f_dtstart_tz <= dtstart
+                                and f_dtend_tz >= dtstart)
+                            or (f_dtstart_tz <= dtend
+                                and f_dtend_tz >= dtend)
+                            or (f_dtstart_tz >= dtstart
+                                and f_dtend_tz <= dtend)):
                         continue
                     freebusy_fbtype = self._fbtype(event)
                     all_day = event.all_day
                     for occurence in event.occurences:
-                        if occurence.recurrence.replace(tzinfo=tzlocal) == \
-                                freebusy_dtstart.replace(tzinfo=tzlocal):
-                            freebusy_dtstart = occurence.dtstart.replace(tzinfo=tzlocal)
+                        if (occurence.recurrence.replace(tzinfo=tzlocal)
+                                == f_dtstart_tz):
+                            freebusy_dtstart = \
+                                occurence.dtstart.replace(tzinfo=tzlocal)
                             if occurence.dtend:
                                 freebusy_dtend = occurence.dtend\
                                         .replace(tzinfo=tzlocal)
@@ -249,16 +248,15 @@ class Calendar(ModelSQL, ModelView):
                             break
                     freebusy = ical.vfreebusy.add('freebusy')
                     freebusy.fbtype_param = freebusy_fbtype
-                    if freebusy_dtstart.replace(tzinfo=tzlocal) <= dtstart:
+                    if f_dtstart_tz <= dtstart:
                         freebusy_dtstart = dtstart
-                    if freebusy_dtend.replace(tzinfo=tzlocal) >= dtend:
+                    if f_dtend_tz >= dtend:
                         freebusy_dtend = dtend
                     if all_day:
                         freebusy.value = [(
-                            freebusy_dtstart.replace(tzinfo=tzlocal)\
-                                    .astimezone(tzutc),
-                            freebusy_dtend.replace(tzinfo=tzlocal)\
-                                    .astimezone(tzutc))]
+                                f_dtstart_tz.astimezone(tzutc),
+                                f_dtend_tz.astimezone(tzutc),
+                                )]
                     else:
                         freebusy.value = [(
                             freebusy_dtstart.astimezone(tzutc),
@@ -334,8 +332,9 @@ class Calendar(ModelSQL, ModelView):
                     vfreebusy.vfreebusy.add('attendee').value = attendee.value
 
                 status = doc.createElement('C:request-status')
-                status.appendChild(doc.createTextNode(vfreebusy and \
-                        '2.0;Success' or '5.3;No scheduling support for user.'))
+                status.appendChild(doc.createTextNode(vfreebusy
+                        and '2.0;Success'
+                        or '5.3;No scheduling support for user.'))
                 resp.appendChild(status)
                 if vfreebusy:
                     data = doc.createElement('C:calendar-data')
@@ -353,9 +352,9 @@ class ReadUser(ModelSQL):
     _name = 'calendar.calendar-read-res.user'
 
     calendar = fields.Many2One('calendar.calendar', 'Calendar',
-            ondelete='CASCADE', required=True, select=1)
+            ondelete='CASCADE', required=True, select=True)
     user = fields.Many2One('res.user', 'User', ondelete='CASCADE',
-            required=True, select=1)
+            required=True, select=True)
 
 ReadUser()
 
@@ -366,9 +365,9 @@ class WriteUser(ModelSQL):
     _name = 'calendar.calendar-write-res.user'
 
     calendar = fields.Many2One('calendar.calendar', 'Calendar',
-            ondelete='CASCADE', required=True, select=1)
+            ondelete='CASCADE', required=True, select=True)
     user = fields.Many2One('res.user', 'User', ondelete='CASCADE',
-            required=True, select=1)
+            required=True, select=True)
 
 WriteUser()
 
@@ -378,7 +377,7 @@ class Category(ModelSQL, ModelView):
     _description = __doc__
     _name = 'calendar.category'
 
-    name = fields.Char('Name', required=True, select=1)
+    name = fields.Char('Name', required=True, select=True)
 
     def __init__(self):
         super(Category, self).__init__()
@@ -396,7 +395,7 @@ class Location(ModelSQL, ModelView):
     _description = __doc__
     _name = 'calendar.location'
 
-    name = fields.Char('Name', required=True, select=1)
+    name = fields.Char('Name', required=True, select=True)
 
     def __init__(self):
         super(Location, self).__init__()
@@ -416,15 +415,15 @@ class Event(ModelSQL, ModelView):
     _rec_name = 'uuid'
 
     uuid = fields.Char('UUID', required=True,
-            help='Universally Unique Identifier', select=1)
+            help='Universally Unique Identifier', select=True)
     calendar = fields.Many2One('calendar.calendar', 'Calendar',
-            required=True, select=1, ondelete="CASCADE")
+            required=True, select=True, ondelete="CASCADE")
     summary = fields.Char('Summary')
-    sequence = fields.Integer('Sequence')
+    sequence = fields.Integer('Sequence', required=True)
     description = fields.Text('Description')
     all_day = fields.Boolean('All Day')
-    dtstart = fields.DateTime('Start Date', required=True, select=1)
-    dtend = fields.DateTime('End Date', select=1)
+    dtstart = fields.DateTime('Start Date', required=True, select=True)
+    dtend = fields.DateTime('End Date', select=True)
     timezone = fields.Selection('timezones', 'Timezone')
     categories = fields.Many2Many('calendar.event-calendar.category',
             'event', 'category', 'Categories')
@@ -450,19 +449,23 @@ class Event(ModelSQL, ModelView):
         ('transparent', 'Transparent'),
         ], 'Time Transparency', required=True)
     alarms = fields.One2Many('calendar.event.alarm', 'event', 'Alarms')
-    rdates = fields.One2Many('calendar.event.rdate', 'event', 'Recurrence Dates',
+    rdates = fields.One2Many('calendar.event.rdate', 'event',
+        'Recurrence Dates',
         states={
             'invisible': Bool(Eval('parent')),
             }, depends=['parent'])
-    rrules = fields.One2Many('calendar.event.rrule', 'event', 'Recurrence Rules',
+    rrules = fields.One2Many('calendar.event.rrule', 'event',
+        'Recurrence Rules',
         states={
             'invisible': Bool(Eval('parent')),
             }, depends=['parent'])
-    exdates = fields.One2Many('calendar.event.exdate', 'event', 'Exception Dates',
+    exdates = fields.One2Many('calendar.event.exdate', 'event',
+        'Exception Dates',
         states={
             'invisible': Bool(Eval('parent')),
             }, depends=['parent'])
-    exrules = fields.One2Many('calendar.event.exrule', 'event', 'Exception Rules',
+    exrules = fields.One2Many('calendar.event.exrule', 'event',
+        'Exception Rules',
         states={
             'invisible': Bool(Eval('parent')),
             }, depends=['parent'])
@@ -477,11 +480,11 @@ class Event(ModelSQL, ModelView):
     parent = fields.Many2One('calendar.event', 'Parent',
         domain=[
             ('uuid', '=', Eval('uuid')),
-            ('parent', '=', False),
+            ('parent', '=', None),
             ('calendar', '=', Eval('calendar')),
             ],
         ondelete='CASCADE', depends=['uuid', 'calendar'])
-    recurrence = fields.DateTime('Recurrence', select=1, states={
+    recurrence = fields.DateTime('Recurrence', select=True, states={
             'invisible': ~Eval('_parent_parent'),
             'required': Bool(Eval('_parent_parent')),
             }, depends=['parent'])
@@ -514,7 +517,7 @@ class Event(ModelSQL, ModelView):
             model_data_ids = model_data_obj.search([
                 ('fs_id', '=', 'rule_group_read_calendar_line3'),
                 ('module', '=', module_name),
-                ('inherit', '=', False),
+                ('inherit', '=', None),
                 ], limit=1)
             if model_data_ids:
                 model_data = model_data_obj.browse(model_data_ids[0])
@@ -577,10 +580,11 @@ class Event(ModelSQL, ModelView):
 
         res = super(Event, self).create(values)
         event = self.browse(res)
-        if event.calendar.owner \
-                and (event.organizer == event.calendar.owner.email \
-                or (event.parent \
-                and event.parent.organizer == event.parent.calendar.owner.email)):
+        if (event.calendar.owner
+                and (event.organizer == event.calendar.owner.email
+                    or (event.parent
+                        and event.parent.organizer == \
+                            event.parent.calendar.owner.email))):
             if event.organizer == event.calendar.owner.email:
                 attendee_emails = [x.email for x in event.attendees
                         if x.status != 'declined'
@@ -598,7 +602,7 @@ class Event(ModelSQL, ModelView):
                         for calendar_id in calendar_ids:
                             new_id = self.copy(event.id, default={
                                 'calendar': calendar_id,
-                                'occurences': False,
+                                'occurences': None,
                                 })
                             for occurence in event.occurences:
                                 self.copy(occurence.id, default={
@@ -610,7 +614,7 @@ class Event(ModelSQL, ModelView):
                             ('uuid', '=', event.uuid),
                             ('calendar.owner.email', 'in', attendee_emails),
                             ('id', '!=', event.id),
-                            ('recurrence', '=', False),
+                            ('recurrence', '=', None),
                             ])
                         for parent in self.browse(parent_ids):
                             self.copy(event.id, default={
@@ -695,7 +699,7 @@ class Event(ModelSQL, ModelView):
                     event_ids = self.search([
                         ('uuid', '=', event.uuid),
                         ('id', '!=', event.id),
-                        ('recurrence', '=', event.recurrence or False),
+                        ('recurrence', '=', event.recurrence),
                         ])
                     for event2 in self.browse(event_ids):
                         if event2.calendar.owner.email in attendee_emails:
@@ -715,7 +719,7 @@ class Event(ModelSQL, ModelView):
                             for calendar_id in calendar_ids:
                                 new_id = self.copy(event.id, default={
                                     'calendar': calendar_id,
-                                    'occurences': False,
+                                    'occurences': None,
                                     })
                                 for occurence in event.occurences:
                                     self.copy(occurence.id, default={
@@ -724,11 +728,12 @@ class Event(ModelSQL, ModelView):
                                         })
                         else:
                             parent_ids = self.search([
-                                ('uuid', '=', event.uuid),
-                                ('calendar.owner.email', 'in', attendee_emails),
-                                ('id', '!=', event.id),
-                                ('recurrence', '=', False),
-                                ])
+                                    ('uuid', '=', event.uuid),
+                                    ('calendar.owner.email', 'in',
+                                        attendee_emails),
+                                    ('id', '!=', event.id),
+                                    ('recurrence', '=', None),
+                                    ])
                             for parent in self.browse(parent_ids):
                                 self.copy(event.id, default={
                                     'calendar': parent.calendar.id,
@@ -761,7 +766,7 @@ class Event(ModelSQL, ModelView):
                             ('uuid', '=', event.uuid),
                             ('calendar.owner.email', 'in', attendee_emails),
                             ('id', '!=', event.id),
-                            ('recurrence', '=', event.recurrence or False),
+                            ('recurrence', '=', event.recurrence),
                             ])
                         self.delete(event_ids)
             elif event.organizer \
@@ -775,7 +780,7 @@ class Event(ModelSQL, ModelView):
                         ('uuid', '=', event.uuid),
                         ('calendar.owner.email', '=', organizer),
                         ('id', '!=', event.id),
-                        ('recurrence', '=', event.recurrence or False),
+                        ('recurrence', '=', event.recurrence),
                         ], limit=1)
                     if event_ids:
                         event2 = self.browse(event_ids[0])
@@ -802,7 +807,6 @@ class Event(ModelSQL, ModelView):
         pool = Pool()
         category_obj = pool.get('calendar.category')
         location_obj = pool.get('calendar.location')
-        user_obj = pool.get('res.user')
         alarm_obj = pool.get('calendar.event.alarm')
         attendee_obj = pool.get('calendar.event.attendee')
         rdate_obj = pool.get('calendar.event.rdate')
@@ -832,11 +836,11 @@ class Event(ModelSQL, ModelView):
         if hasattr(vevent, 'summary'):
             res['summary'] = vevent.summary.value
         else:
-            res['summary'] = False
+            res['summary'] = None
         if hasattr(vevent, 'description'):
             res['description'] = vevent.description.value
         else:
-            res['description'] = False
+            res['description'] = None
         if not isinstance(vevent.dtstart.value, datetime.datetime):
             res['all_day'] = True
             res['dtstart'] = datetime.datetime.combine(vevent.dtstart.value,
@@ -859,7 +863,7 @@ class Event(ModelSQL, ModelView):
         elif hasattr(vevent, 'duration') and hasattr(vevent, 'dtstart'):
             res['dtend'] = vevent.dtstart.value + vevent.duration.value
         else:
-            res['dtend'] = False
+            res['dtend'] = None
         if hasattr(vevent, 'recurrence-id'):
             if not isinstance(vevent.recurrence_id.value, datetime.datetime):
                 res['recurrence'] = datetime.datetime.combine(
@@ -872,7 +876,7 @@ class Event(ModelSQL, ModelView):
                 else:
                     res['recurrence'] = vevent.recurrence_id.value
         else:
-            res['recurrence'] = False
+            res['recurrence'] = None
         if hasattr(vevent, 'status'):
             res['status'] = vevent.status.value.lower()
         else:
@@ -915,7 +919,7 @@ class Event(ModelSQL, ModelView):
                 location_id = location_ids[0]
             res['location'] = location_id
         else:
-            res['location'] = False
+            res['location'] = None
 
         res['calendar'] = calendar_id
 
@@ -930,7 +934,7 @@ class Event(ModelSQL, ModelView):
             else:
                 res['organizer'] = vevent.organizer.value
         else:
-            res['organizer'] = False
+            res['organizer'] = None
 
         attendees_todel = {}
         if event:
@@ -1205,9 +1209,9 @@ class EventCategory(ModelSQL):
     _name = 'calendar.event-calendar.category'
 
     event = fields.Many2One('calendar.event', 'Event', ondelete='CASCADE',
-            required=True, select=1)
+            required=True, select=True)
     category = fields.Many2One('calendar.category', 'Category',
-            ondelete='CASCADE', required=True, select=1)
+            ondelete='CASCADE', required=True, select=True)
 
 EventCategory()
 
@@ -1252,9 +1256,9 @@ class EventAlarm(ModelSQL):
     _inherits = {'calendar.alarm': 'calendar_alarm'}
 
     calendar_alarm = fields.Many2One('calendar.alarm', 'Calendar Alarm',
-            required=True, ondelete='CASCADE', select=1)
+            required=True, ondelete='CASCADE', select=True)
     event = fields.Many2One('calendar.event', 'Event', ondelete='CASCADE',
-            required=True, select=1)
+            required=True, select=True)
 
     def create(self, values):
         event_obj = Pool().get('calendar.event')
@@ -1384,9 +1388,9 @@ class EventAttendee(ModelSQL, ModelView):
     _inherits = {'calendar.attendee': 'calendar_attendee'}
 
     calendar_attendee = fields.Many2One('calendar.attendee',
-            'Calendar Attendee', required=True, ondelete='CASCADE', select=1)
+        'Calendar Attendee', required=True, ondelete='CASCADE', select=True)
     event = fields.Many2One('calendar.event', 'Event', ondelete='CASCADE',
-            required=True, select=1)
+        required=True, select=True)
 
     def create(self, values):
         event_obj = Pool().get('calendar.event')
@@ -1396,10 +1400,11 @@ class EventAttendee(ModelSQL, ModelView):
         res = super(EventAttendee, self).create(values)
         attendee = self.browse(res)
         event = attendee.event
-        if event.calendar.owner \
-                and (event.organizer == event.calendar.owner.email \
-                or (event.parent \
-                and event.parent.organizer == event.parent.calendar.owner.email)):
+        if (event.calendar.owner
+                and (event.organizer == event.calendar.owner.email
+                    or (event.parent
+                        and event.parent.organizer == \
+                            event.parent.calendar.owner.email))):
             if event.organizer == event.calendar.owner.email:
                 attendee_emails = [x.email for x in event.attendees
                         if x.email != event.organizer]
@@ -1412,7 +1417,7 @@ class EventAttendee(ModelSQL, ModelView):
                         ('uuid', '=', event.uuid),
                         ('calendar.owner.email', 'in', attendee_emails),
                         ('id', '!=', event.id),
-                        ('recurrence', '=', event.recurrence or False),
+                        ('recurrence', '=', event.recurrence),
                         ])
                     for event_id in event_ids:
                         self.copy(res, default={
@@ -1457,7 +1462,7 @@ class EventAttendee(ModelSQL, ModelView):
                                 attendee_emails),
                             ('id', '!=', attendee.id),
                             ('event.recurrence', '=',
-                                event.recurrence or False),
+                                event.recurrence),
                             ('email', '=', attendee.email),
                             ])
                         self.write(attendee_ids, self._attendee2update(
@@ -1498,7 +1503,7 @@ class EventAttendee(ModelSQL, ModelView):
                                 attendee_emails),
                             ('id', '!=', attendee.id),
                             ('event.recurrence', '=',
-                                event.recurrence or False),
+                                event.recurrence),
                             ('email', '=', attendee.email),
                             ])
                         self.delete(attendee_ids)
@@ -1515,7 +1520,7 @@ class EventAttendee(ModelSQL, ModelView):
                         ('event.uuid', '=', event.uuid),
                         ('event.calendar.owner.email', '=', organizer),
                         ('id', '!=', attendee.id),
-                        ('event.recurrence', '=', event.recurrence or False),
+                        ('event.recurrence', '=', event.recurrence),
                         ('email', '=', attendee.email),
                         ])
                     if attendee_ids:
@@ -1634,9 +1639,9 @@ class EventRDate(ModelSQL, ModelView):
     _rec_name = 'datetime'
 
     calendar_date = fields.Many2One('calendar.date', 'Calendar Date',
-            required=True, ondelete='CASCADE', select=1)
+            required=True, ondelete='CASCADE', select=True)
     event = fields.Many2One('calendar.event', 'Event', ondelete='CASCADE',
-            select=1, required=True)
+            select=True, required=True)
 
     def init(self, module_name):
         cursor = Transaction().cursor
@@ -1778,7 +1783,7 @@ class RRule(ModelSQL, ModelView):
     def init(self, module_name):
         cursor = Transaction().cursor
         # Migrate from 1.4: unit_count replaced by until_count_only_one
-        table  = TableHandler(cursor, self, module_name)
+        table = TableHandler(cursor, self, module_name)
         table.drop_constraint('until_count')
         return super(RRule, self).init(module_name)
 
@@ -1985,10 +1990,9 @@ class EventRRule(ModelSQL, ModelView):
     _rec_name = 'freq'
 
     calendar_rrule = fields.Many2One('calendar.rrule', 'Calendar RRule',
-            required=True, ondelete='CASCADE', select=1)
+            required=True, ondelete='CASCADE', select=True)
     event = fields.Many2One('calendar.event', 'Event', ondelete='CASCADE',
-            select=1, required=True)
-
+            select=True, required=True)
 
     def create(self, values):
         event_obj = Pool().get('calendar.event')
diff --git a/locale/bg_BG.po b/locale/bg_BG.po
index 0c5f80b..537b2ff 100644
--- a/locale/bg_BG.po
+++ b/locale/bg_BG.po
@@ -2,519 +2,859 @@
 msgid ""
 msgstr "Content-Type: text/plain; charset=utf-8\n"
 
-msgctxt "error:calendar.calendar:0"
+msgctxt "error:calendar.calendar:"
 msgid "A user can have only one calendar!"
 msgstr "Потребителя може да има само един календар!"
 
-msgctxt "error:calendar.calendar:0"
+msgctxt "error:calendar.calendar:"
 msgid "The name of calendar must be unique!"
 msgstr "Името на календара трябва да е уникално!"
 
-msgctxt "error:calendar.category:0"
+msgctxt "error:calendar.category:"
 msgid "The name of calendar category must be unique!"
 msgstr "Името на категорията на календара трябва да е уникално!"
 
-msgctxt "error:calendar.event:0"
+msgctxt "error:calendar.event:"
 msgid "Recurrence can not be recurrent!"
 msgstr "Повторението не може да е периодично!"
 
-msgctxt "error:calendar.event:0"
+msgctxt "error:calendar.event:"
 msgid "UUID and recurrence must be unique in a calendar!"
 msgstr "UUID и взаимна вложеност трябва да са уникални в календар!"
 
-msgctxt "error:calendar.location:0"
+msgctxt "error:calendar.location:"
 msgid "The name of calendar location must be unique!"
 msgstr "Името на местонахождението на календара трябва да е уникално!"
 
-msgctxt "error:calendar.rrule:0"
+msgctxt "error:calendar.rrule:"
 msgid "Invalid \"By Day\""
 msgstr "Невалиден \"По ден\""
 
-msgctxt "error:calendar.rrule:0"
+msgctxt "error:calendar.rrule:"
 msgid "Invalid \"By Hour\""
 msgstr "Навалиден \"По час\""
 
-msgctxt "error:calendar.rrule:0"
+msgctxt "error:calendar.rrule:"
 msgid "Invalid \"By Minute\""
 msgstr "Невалиден \"По минута\""
 
-msgctxt "error:calendar.rrule:0"
+msgctxt "error:calendar.rrule:"
 msgid "Invalid \"By Month Day\""
 msgstr "Невалиден \"По ден от месец\""
 
-msgctxt "error:calendar.rrule:0"
+msgctxt "error:calendar.rrule:"
 msgid "Invalid \"By Month\""
 msgstr "Невалидно \"По месец\""
 
-msgctxt "error:calendar.rrule:0"
+msgctxt "error:calendar.rrule:"
 msgid "Invalid \"By Position\""
 msgstr "Невалиден \"По позиция\""
 
-msgctxt "error:calendar.rrule:0"
+msgctxt "error:calendar.rrule:"
 msgid "Invalid \"By Second\""
 msgstr "Невалиден \"По секунда\""
 
-msgctxt "error:calendar.rrule:0"
+msgctxt "error:calendar.rrule:"
 msgid "Invalid \"By Week Number\""
 msgstr "Невалиден \"По номер на седмица\""
 
-msgctxt "error:calendar.rrule:0"
+msgctxt "error:calendar.rrule:"
 msgid "Invalid \"By Year Day\""
 msgstr "Невалиден \"По ден от годината\""
 
-msgctxt "error:calendar.rrule:0"
+msgctxt "error:calendar.rrule:"
 msgid "Only one of \"until\" and \"count\" can be set!"
 msgstr "\"Крайна дата\" и \"брой\" не може да се попълва по едно и също време!"
 
-msgctxt "field:calendar.alarm,rec_name:0"
+msgctxt "field:calendar.alarm,create_date:"
+msgid "Create Date"
+msgstr "Създадено на"
+
+msgctxt "field:calendar.alarm,create_uid:"
+msgid "Create User"
+msgstr "Създадено от"
+
+msgctxt "field:calendar.alarm,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.alarm,rec_name:"
 msgid "Name"
 msgstr "Име"
 
-msgctxt "field:calendar.alarm,valarm:0"
+msgctxt "field:calendar.alarm,valarm:"
 msgid "valarm"
 msgstr ""
 
-msgctxt "field:calendar.attendee,attendee:0"
+msgctxt "field:calendar.alarm,write_date:"
+msgid "Write Date"
+msgstr "Променено на"
+
+msgctxt "field:calendar.alarm,write_uid:"
+msgid "Write User"
+msgstr "Променено от"
+
+msgctxt "field:calendar.attendee,attendee:"
 msgid "attendee"
 msgstr "присътващ"
 
-msgctxt "field:calendar.attendee,email:0"
+msgctxt "field:calendar.attendee,create_date:"
+msgid "Create Date"
+msgstr "Създадено на"
+
+msgctxt "field:calendar.attendee,create_uid:"
+msgid "Create User"
+msgstr "Създадено от"
+
+msgctxt "field:calendar.attendee,email:"
 msgid "Email"
 msgstr "Email"
 
-msgctxt "field:calendar.attendee,rec_name:0"
+msgctxt "field:calendar.attendee,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.attendee,rec_name:"
 msgid "Name"
 msgstr "Име"
 
-msgctxt "field:calendar.attendee,status:0"
+msgctxt "field:calendar.attendee,status:"
 msgid "Participation Status"
 msgstr "Статус на участие"
 
-msgctxt "field:calendar.calendar,description:0"
+msgctxt "field:calendar.attendee,write_date:"
+msgid "Write Date"
+msgstr "Променено на"
+
+msgctxt "field:calendar.attendee,write_uid:"
+msgid "Write User"
+msgstr "Променено от"
+
+msgctxt "field:calendar.calendar,create_date:"
+msgid "Create Date"
+msgstr "Създадено на"
+
+msgctxt "field:calendar.calendar,create_uid:"
+msgid "Create User"
+msgstr "Създадено от"
+
+msgctxt "field:calendar.calendar,description:"
 msgid "Description"
 msgstr "Описание"
 
-msgctxt "field:calendar.calendar,name:0"
+msgctxt "field:calendar.calendar,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.calendar,name:"
 msgid "Name"
 msgstr "Име"
 
-msgctxt "field:calendar.calendar,owner:0"
+msgctxt "field:calendar.calendar,owner:"
 msgid "Owner"
 msgstr "Собственик"
 
-msgctxt "field:calendar.calendar,read_users:0"
+msgctxt "field:calendar.calendar,read_users:"
 msgid "Read Users"
 msgstr "Потребители с права за четене"
 
-msgctxt "field:calendar.calendar,rec_name:0"
+msgctxt "field:calendar.calendar,rec_name:"
 msgid "Name"
 msgstr "Име"
 
-msgctxt "field:calendar.calendar,write_users:0"
+msgctxt "field:calendar.calendar,write_date:"
+msgid "Write Date"
+msgstr "Променено на"
+
+msgctxt "field:calendar.calendar,write_uid:"
+msgid "Write User"
+msgstr "Променено от"
+
+msgctxt "field:calendar.calendar,write_users:"
 msgid "Write Users"
 msgstr "Записване на потребители"
 
-msgctxt "field:calendar.calendar-read-res.user,calendar:0"
+msgctxt "field:calendar.calendar-read-res.user,calendar:"
 msgid "Calendar"
 msgstr "Календар"
 
-msgctxt "field:calendar.calendar-read-res.user,rec_name:0"
+msgctxt "field:calendar.calendar-read-res.user,create_date:"
+msgid "Create Date"
+msgstr "Създадено на"
+
+msgctxt "field:calendar.calendar-read-res.user,create_uid:"
+msgid "Create User"
+msgstr "Създадено от"
+
+msgctxt "field:calendar.calendar-read-res.user,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.calendar-read-res.user,rec_name:"
 msgid "Name"
 msgstr "Име"
 
-msgctxt "field:calendar.calendar-read-res.user,user:0"
+msgctxt "field:calendar.calendar-read-res.user,user:"
 msgid "User"
 msgstr "Потребител"
 
-msgctxt "field:calendar.calendar-write-res.user,calendar:0"
+msgctxt "field:calendar.calendar-read-res.user,write_date:"
+msgid "Write Date"
+msgstr "Променено на"
+
+msgctxt "field:calendar.calendar-read-res.user,write_uid:"
+msgid "Write User"
+msgstr "Променено от"
+
+msgctxt "field:calendar.calendar-write-res.user,calendar:"
 msgid "Calendar"
 msgstr "Календар"
 
-msgctxt "field:calendar.calendar-write-res.user,rec_name:0"
+msgctxt "field:calendar.calendar-write-res.user,create_date:"
+msgid "Create Date"
+msgstr "Създадено на"
+
+msgctxt "field:calendar.calendar-write-res.user,create_uid:"
+msgid "Create User"
+msgstr "Създадено от"
+
+msgctxt "field:calendar.calendar-write-res.user,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.calendar-write-res.user,rec_name:"
 msgid "Name"
 msgstr "Име"
 
-msgctxt "field:calendar.calendar-write-res.user,user:0"
+msgctxt "field:calendar.calendar-write-res.user,user:"
 msgid "User"
 msgstr "Потребител"
 
-msgctxt "field:calendar.category,name:0"
+msgctxt "field:calendar.calendar-write-res.user,write_date:"
+msgid "Write Date"
+msgstr "Променено на"
+
+msgctxt "field:calendar.calendar-write-res.user,write_uid:"
+msgid "Write User"
+msgstr "Променено от"
+
+msgctxt "field:calendar.category,create_date:"
+msgid "Create Date"
+msgstr "Създадено на"
+
+msgctxt "field:calendar.category,create_uid:"
+msgid "Create User"
+msgstr "Създадено от"
+
+msgctxt "field:calendar.category,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.category,name:"
 msgid "Name"
 msgstr "Име"
 
-msgctxt "field:calendar.category,rec_name:0"
+msgctxt "field:calendar.category,rec_name:"
 msgid "Name"
 msgstr "Име"
 
-msgctxt "field:calendar.date,date:0"
+msgctxt "field:calendar.category,write_date:"
+msgid "Write Date"
+msgstr "Променено на"
+
+msgctxt "field:calendar.category,write_uid:"
+msgid "Write User"
+msgstr "Променено от"
+
+msgctxt "field:calendar.date,create_date:"
+msgid "Create Date"
+msgstr "Създадено на"
+
+msgctxt "field:calendar.date,create_uid:"
+msgid "Create User"
+msgstr "Създадено от"
+
+msgctxt "field:calendar.date,date:"
 msgid "Is Date"
 msgstr "Е дата"
 
-msgctxt "field:calendar.date,datetime:0"
+msgctxt "field:calendar.date,datetime:"
 msgid "Date"
 msgstr "Дата"
 
-msgctxt "field:calendar.date,rec_name:0"
+msgctxt "field:calendar.date,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.date,rec_name:"
 msgid "Name"
 msgstr "Име"
 
-msgctxt "field:calendar.event,alarms:0"
+msgctxt "field:calendar.date,write_date:"
+msgid "Write Date"
+msgstr "Променено на"
+
+msgctxt "field:calendar.date,write_uid:"
+msgid "Write User"
+msgstr "Променено от"
+
+msgctxt "field:calendar.event,alarms:"
 msgid "Alarms"
 msgstr "Аларми"
 
-msgctxt "field:calendar.event,all_day:0"
+msgctxt "field:calendar.event,all_day:"
 msgid "All Day"
 msgstr "Всички дни"
 
-msgctxt "field:calendar.event,attendees:0"
+msgctxt "field:calendar.event,attendees:"
 msgid "Attendees"
 msgstr "Присъстващи"
 
-msgctxt "field:calendar.event,calendar:0"
+msgctxt "field:calendar.event,calendar:"
 msgid "Calendar"
 msgstr "Календар"
 
-msgctxt "field:calendar.event,calendar_owner:0"
+msgctxt "field:calendar.event,calendar_owner:"
 msgid "Owner"
 msgstr "Собственик"
 
-msgctxt "field:calendar.event,calendar_read_users:0"
+msgctxt "field:calendar.event,calendar_read_users:"
 msgid "Read Users"
 msgstr "Потребители с права за четене"
 
-msgctxt "field:calendar.event,calendar_write_users:0"
+msgctxt "field:calendar.event,calendar_write_users:"
 msgid "Write Users"
 msgstr "Записване на потребители"
 
-msgctxt "field:calendar.event,categories:0"
+msgctxt "field:calendar.event,categories:"
 msgid "Categories"
 msgstr "Категории"
 
-msgctxt "field:calendar.event,classification:0"
+msgctxt "field:calendar.event,classification:"
 msgid "Classification"
 msgstr "Класификация"
 
-msgctxt "field:calendar.event,description:0"
+msgctxt "field:calendar.event,create_date:"
+msgid "Create Date"
+msgstr "Създадено на"
+
+msgctxt "field:calendar.event,create_uid:"
+msgid "Create User"
+msgstr "Създадено от"
+
+msgctxt "field:calendar.event,description:"
 msgid "Description"
 msgstr "Описание"
 
-msgctxt "field:calendar.event,dtend:0"
+msgctxt "field:calendar.event,dtend:"
 msgid "End Date"
 msgstr "Крайна дата"
 
-msgctxt "field:calendar.event,dtstart:0"
+msgctxt "field:calendar.event,dtstart:"
 msgid "Start Date"
 msgstr "Начална дата"
 
-msgctxt "field:calendar.event,exdates:0"
+msgctxt "field:calendar.event,exdates:"
 msgid "Exception Dates"
 msgstr "Дати на грешките"
 
-msgctxt "field:calendar.event,exrules:0"
+msgctxt "field:calendar.event,exrules:"
 msgid "Exception Rules"
 msgstr "Правила при грешка"
 
-msgctxt "field:calendar.event,location:0"
+msgctxt "field:calendar.event,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.event,location:"
 msgid "Location"
 msgstr "Местоположение"
 
-msgctxt "field:calendar.event,occurences:0"
+msgctxt "field:calendar.event,occurences:"
 msgid "Occurences"
 msgstr "Събития"
 
-msgctxt "field:calendar.event,organizer:0"
+msgctxt "field:calendar.event,organizer:"
 msgid "Organizer"
 msgstr "Организатор"
 
-msgctxt "field:calendar.event,parent:0"
+msgctxt "field:calendar.event,parent:"
 msgid "Parent"
 msgstr "Родител"
 
-msgctxt "field:calendar.event,rdates:0"
+msgctxt "field:calendar.event,rdates:"
 msgid "Recurrence Dates"
 msgstr "Дати на повторяемост"
 
-msgctxt "field:calendar.event,rec_name:0"
+msgctxt "field:calendar.event,rec_name:"
 msgid "Name"
 msgstr "Име"
 
-msgctxt "field:calendar.event,recurrence:0"
+msgctxt "field:calendar.event,recurrence:"
 msgid "Recurrence"
 msgstr "Повторение"
 
-msgctxt "field:calendar.event,rrules:0"
+msgctxt "field:calendar.event,rrules:"
 msgid "Recurrence Rules"
 msgstr "Правила за повторяемост"
 
-msgctxt "field:calendar.event,sequence:0"
+msgctxt "field:calendar.event,sequence:"
 msgid "Sequence"
 msgstr "Последователност"
 
-msgctxt "field:calendar.event,status:0"
+msgctxt "field:calendar.event,status:"
 msgid "Status"
 msgstr "Състояние"
 
-msgctxt "field:calendar.event,summary:0"
+msgctxt "field:calendar.event,summary:"
 msgid "Summary"
 msgstr "Обобщено"
 
-msgctxt "field:calendar.event,timezone:0"
+msgctxt "field:calendar.event,timezone:"
 msgid "Timezone"
 msgstr "Времева зона"
 
-msgctxt "field:calendar.event,transp:0"
+msgctxt "field:calendar.event,transp:"
 msgid "Time Transparency"
 msgstr "Прозрачен във времето"
 
-msgctxt "field:calendar.event,uuid:0"
+msgctxt "field:calendar.event,uuid:"
 msgid "UUID"
 msgstr "UUID"
 
-msgctxt "field:calendar.event,vevent:0"
+msgctxt "field:calendar.event,vevent:"
 msgid "vevent"
 msgstr ""
 
-msgctxt "field:calendar.event-calendar.category,category:0"
+msgctxt "field:calendar.event,write_date:"
+msgid "Write Date"
+msgstr "Променено на"
+
+msgctxt "field:calendar.event,write_uid:"
+msgid "Write User"
+msgstr "Променено от"
+
+msgctxt "field:calendar.event-calendar.category,category:"
 msgid "Category"
 msgstr "Категория"
 
-msgctxt "field:calendar.event-calendar.category,event:0"
+msgctxt "field:calendar.event-calendar.category,create_date:"
+msgid "Create Date"
+msgstr "Създадено на"
+
+msgctxt "field:calendar.event-calendar.category,create_uid:"
+msgid "Create User"
+msgstr "Създадено от"
+
+msgctxt "field:calendar.event-calendar.category,event:"
 msgid "Event"
 msgstr "Събитие"
 
-msgctxt "field:calendar.event-calendar.category,rec_name:0"
+msgctxt "field:calendar.event-calendar.category,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.event-calendar.category,rec_name:"
 msgid "Name"
 msgstr "Име"
 
-msgctxt "field:calendar.event.alarm,calendar_alarm:0"
+msgctxt "field:calendar.event-calendar.category,write_date:"
+msgid "Write Date"
+msgstr "Променено на"
+
+msgctxt "field:calendar.event-calendar.category,write_uid:"
+msgid "Write User"
+msgstr "Променено от"
+
+msgctxt "field:calendar.event.alarm,calendar_alarm:"
 msgid "Calendar Alarm"
 msgstr "Аларма на календар"
 
-msgctxt "field:calendar.event.alarm,event:0"
+msgctxt "field:calendar.event.alarm,create_date:"
+msgid "Create Date"
+msgstr "Създадено на"
+
+msgctxt "field:calendar.event.alarm,create_uid:"
+msgid "Create User"
+msgstr "Създадено от"
+
+msgctxt "field:calendar.event.alarm,event:"
 msgid "Event"
 msgstr "Събитие"
 
-msgctxt "field:calendar.event.alarm,rec_name:0"
+msgctxt "field:calendar.event.alarm,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.event.alarm,rec_name:"
 msgid "Name"
 msgstr "Име"
 
-msgctxt "field:calendar.event.attendee,calendar_attendee:0"
+msgctxt "field:calendar.event.alarm,write_date:"
+msgid "Write Date"
+msgstr "Променено на"
+
+msgctxt "field:calendar.event.alarm,write_uid:"
+msgid "Write User"
+msgstr "Променено от"
+
+msgctxt "field:calendar.event.attendee,calendar_attendee:"
 msgid "Calendar Attendee"
 msgstr "Присъстващ на календар"
 
-msgctxt "field:calendar.event.attendee,event:0"
+msgctxt "field:calendar.event.attendee,create_date:"
+msgid "Create Date"
+msgstr "Създадено на"
+
+msgctxt "field:calendar.event.attendee,create_uid:"
+msgid "Create User"
+msgstr "Създадено от"
+
+msgctxt "field:calendar.event.attendee,event:"
 msgid "Event"
 msgstr "Събитие"
 
-msgctxt "field:calendar.event.attendee,rec_name:0"
+msgctxt "field:calendar.event.attendee,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.event.attendee,rec_name:"
 msgid "Name"
 msgstr "Име"
 
-msgctxt "field:calendar.event.exdate,calendar_date:0"
+msgctxt "field:calendar.event.attendee,write_date:"
+msgid "Write Date"
+msgstr "Променено на"
+
+msgctxt "field:calendar.event.attendee,write_uid:"
+msgid "Write User"
+msgstr "Променено от"
+
+msgctxt "field:calendar.event.exdate,calendar_date:"
 msgid "Calendar Date"
 msgstr "Дата от календар"
 
-msgctxt "field:calendar.event.exdate,event:0"
+msgctxt "field:calendar.event.exdate,create_date:"
+msgid "Create Date"
+msgstr "Създадено на"
+
+msgctxt "field:calendar.event.exdate,create_uid:"
+msgid "Create User"
+msgstr "Създадено от"
+
+msgctxt "field:calendar.event.exdate,event:"
 msgid "Event"
 msgstr "Събитие"
 
-msgctxt "field:calendar.event.exdate,rec_name:0"
+msgctxt "field:calendar.event.exdate,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.event.exdate,rec_name:"
 msgid "Name"
 msgstr "Име"
 
-msgctxt "field:calendar.event.exrule,calendar_rrule:0"
+msgctxt "field:calendar.event.exdate,write_date:"
+msgid "Write Date"
+msgstr "Променено на"
+
+msgctxt "field:calendar.event.exdate,write_uid:"
+msgid "Write User"
+msgstr "Променено от"
+
+msgctxt "field:calendar.event.exrule,calendar_rrule:"
 msgid "Calendar RRule"
 msgstr ""
 
-msgctxt "field:calendar.event.exrule,event:0"
+msgctxt "field:calendar.event.exrule,create_date:"
+msgid "Create Date"
+msgstr "Създадено на"
+
+msgctxt "field:calendar.event.exrule,create_uid:"
+msgid "Create User"
+msgstr "Създадено от"
+
+msgctxt "field:calendar.event.exrule,event:"
 msgid "Event"
 msgstr "Събитие"
 
-msgctxt "field:calendar.event.exrule,rec_name:0"
+msgctxt "field:calendar.event.exrule,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.event.exrule,rec_name:"
 msgid "Name"
 msgstr "Име"
 
-msgctxt "field:calendar.event.rdate,calendar_date:0"
+msgctxt "field:calendar.event.exrule,write_date:"
+msgid "Write Date"
+msgstr "Променено на"
+
+msgctxt "field:calendar.event.exrule,write_uid:"
+msgid "Write User"
+msgstr "Променено от"
+
+msgctxt "field:calendar.event.rdate,calendar_date:"
 msgid "Calendar Date"
 msgstr "Дата от календар"
 
-msgctxt "field:calendar.event.rdate,event:0"
+msgctxt "field:calendar.event.rdate,create_date:"
+msgid "Create Date"
+msgstr "Създадено на"
+
+msgctxt "field:calendar.event.rdate,create_uid:"
+msgid "Create User"
+msgstr "Създадено от"
+
+msgctxt "field:calendar.event.rdate,event:"
 msgid "Event"
 msgstr "Събитие"
 
-msgctxt "field:calendar.event.rdate,rec_name:0"
+msgctxt "field:calendar.event.rdate,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.event.rdate,rec_name:"
 msgid "Name"
 msgstr "Име"
 
-msgctxt "field:calendar.event.rrule,calendar_rrule:0"
+msgctxt "field:calendar.event.rdate,write_date:"
+msgid "Write Date"
+msgstr "Променено на"
+
+msgctxt "field:calendar.event.rdate,write_uid:"
+msgid "Write User"
+msgstr "Променено от"
+
+msgctxt "field:calendar.event.rrule,calendar_rrule:"
 msgid "Calendar RRule"
 msgstr ""
 
-msgctxt "field:calendar.event.rrule,event:0"
+msgctxt "field:calendar.event.rrule,create_date:"
+msgid "Create Date"
+msgstr "Създадено на"
+
+msgctxt "field:calendar.event.rrule,create_uid:"
+msgid "Create User"
+msgstr "Създадено от"
+
+msgctxt "field:calendar.event.rrule,event:"
 msgid "Event"
 msgstr "Събитие"
 
-msgctxt "field:calendar.event.rrule,rec_name:0"
+msgctxt "field:calendar.event.rrule,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.event.rrule,rec_name:"
 msgid "Name"
 msgstr "Име"
 
-msgctxt "field:calendar.location,name:0"
+msgctxt "field:calendar.event.rrule,write_date:"
+msgid "Write Date"
+msgstr "Променено на"
+
+msgctxt "field:calendar.event.rrule,write_uid:"
+msgid "Write User"
+msgstr "Променено от"
+
+msgctxt "field:calendar.location,create_date:"
+msgid "Create Date"
+msgstr "Създадено на"
+
+msgctxt "field:calendar.location,create_uid:"
+msgid "Create User"
+msgstr "Създадено от"
+
+msgctxt "field:calendar.location,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.location,name:"
 msgid "Name"
 msgstr "Име"
 
-msgctxt "field:calendar.location,rec_name:0"
+msgctxt "field:calendar.location,rec_name:"
 msgid "Name"
 msgstr "Име"
 
-msgctxt "field:calendar.rrule,byday:0"
+msgctxt "field:calendar.location,write_date:"
+msgid "Write Date"
+msgstr "Променено на"
+
+msgctxt "field:calendar.location,write_uid:"
+msgid "Write User"
+msgstr "Променено от"
+
+msgctxt "field:calendar.rrule,byday:"
 msgid "By Day"
 msgstr "По ден"
 
-msgctxt "field:calendar.rrule,byhour:0"
+msgctxt "field:calendar.rrule,byhour:"
 msgid "By Hour"
 msgstr "По час"
 
-msgctxt "field:calendar.rrule,byminute:0"
+msgctxt "field:calendar.rrule,byminute:"
 msgid "By Minute"
 msgstr "По минута"
 
-msgctxt "field:calendar.rrule,bymonth:0"
+msgctxt "field:calendar.rrule,bymonth:"
 msgid "By Month"
 msgstr "По месец"
 
-msgctxt "field:calendar.rrule,bymonthday:0"
+msgctxt "field:calendar.rrule,bymonthday:"
 msgid "By Month Day"
 msgstr "По ден от месеца"
 
-msgctxt "field:calendar.rrule,bysecond:0"
+msgctxt "field:calendar.rrule,bysecond:"
 msgid "By Second"
 msgstr "По секунда"
 
-msgctxt "field:calendar.rrule,bysetpos:0"
+msgctxt "field:calendar.rrule,bysetpos:"
 msgid "By Position"
 msgstr "По позиция"
 
-msgctxt "field:calendar.rrule,byweekno:0"
+msgctxt "field:calendar.rrule,byweekno:"
 msgid "By Week Number"
 msgstr "По номер на седмицата"
 
-msgctxt "field:calendar.rrule,byyearday:0"
+msgctxt "field:calendar.rrule,byyearday:"
 msgid "By Year Day"
 msgstr "По ден от годината"
 
-msgctxt "field:calendar.rrule,count:0"
+msgctxt "field:calendar.rrule,count:"
 msgid "Count"
 msgstr "Брой"
 
-msgctxt "field:calendar.rrule,freq:0"
+msgctxt "field:calendar.rrule,create_date:"
+msgid "Create Date"
+msgstr "Създадено на"
+
+msgctxt "field:calendar.rrule,create_uid:"
+msgid "Create User"
+msgstr "Създадено от"
+
+msgctxt "field:calendar.rrule,freq:"
 msgid "Frequency"
 msgstr "Честота"
 
-msgctxt "field:calendar.rrule,interval:0"
+msgctxt "field:calendar.rrule,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.rrule,interval:"
 msgid "Interval"
 msgstr "Интервал"
 
-msgctxt "field:calendar.rrule,rec_name:0"
+msgctxt "field:calendar.rrule,rec_name:"
 msgid "Name"
 msgstr "Име"
 
-msgctxt "field:calendar.rrule,until:0"
+msgctxt "field:calendar.rrule,until:"
 msgid "Until Date"
 msgstr "До дата"
 
-msgctxt "field:calendar.rrule,until_date:0"
+msgctxt "field:calendar.rrule,until_date:"
 msgid "Is Date"
 msgstr "Е дата"
 
-msgctxt "field:calendar.rrule,wkst:0"
+msgctxt "field:calendar.rrule,wkst:"
 msgid "Week Day"
 msgstr "Ден от седмица"
 
-msgctxt "field:res.user,calendars:0"
+msgctxt "field:calendar.rrule,write_date:"
+msgid "Write Date"
+msgstr "Променено на"
+
+msgctxt "field:calendar.rrule,write_uid:"
+msgid "Write User"
+msgstr "Променено от"
+
+msgctxt "field:res.user,calendars:"
 msgid "Calendars"
 msgstr "Календари"
 
-msgctxt "help:calendar.calendar,owner:0"
+msgctxt "help:calendar.calendar,owner:"
 msgid "The user must have an email"
 msgstr "Потребителя трябва да има email"
 
-msgctxt "help:calendar.date,date:0"
+msgctxt "help:calendar.date,date:"
 msgid "Ignore time of field \"Date\", but handle as date only."
 msgstr "От полето \"Дата\" се игнорира часа и се използва само датата."
 
-msgctxt "help:calendar.event,uuid:0"
+msgctxt "help:calendar.event,uuid:"
 msgid "Universally Unique Identifier"
 msgstr "Универсален иникален идентификатор"
 
-msgctxt "help:calendar.rrule,until_date:0"
+msgctxt "help:calendar.rrule,until_date:"
 msgid "Ignore time of field \"Until Date\", but handle as date only."
 msgstr "От полето \"До дата\" се игнорира часа и се използва само датата."
 
-msgctxt "model:calendar.alarm,name:0"
+msgctxt "model:calendar.alarm,name:"
 msgid "Alarm"
 msgstr "Аларма"
 
-msgctxt "model:calendar.attendee,name:0"
+msgctxt "model:calendar.attendee,name:"
 msgid "Attendee"
 msgstr "Присъстващ"
 
-msgctxt "model:calendar.calendar,name:0"
+msgctxt "model:calendar.calendar,name:"
 msgid "Calendar"
 msgstr "Календар"
 
-msgctxt "model:calendar.calendar-read-res.user,name:0"
+msgctxt "model:calendar.calendar-read-res.user,name:"
 msgid "Calendar - read - User"
 msgstr ""
 
-msgctxt "model:calendar.calendar-write-res.user,name:0"
+msgctxt "model:calendar.calendar-write-res.user,name:"
 msgid "Calendar - write - User"
 msgstr ""
 
-msgctxt "model:calendar.category,name:0"
+msgctxt "model:calendar.category,name:"
 msgid "Category"
 msgstr "Категория"
 
-msgctxt "model:calendar.date,name:0"
+msgctxt "model:calendar.date,name:"
 msgid "Calendar Date"
 msgstr "Дата от календар"
 
-msgctxt "model:calendar.event,name:0"
+msgctxt "model:calendar.event,name:"
 msgid "Event"
 msgstr "Събитие"
 
-msgctxt "model:calendar.event-calendar.category,name:0"
+msgctxt "model:calendar.event-calendar.category,name:"
 msgid "Event - Category"
 msgstr "Събитие - категория"
 
-msgctxt "model:calendar.event.alarm,name:0"
+msgctxt "model:calendar.event.alarm,name:"
 msgid "Alarm"
 msgstr "Аларма"
 
-msgctxt "model:calendar.event.attendee,name:0"
+msgctxt "model:calendar.event.attendee,name:"
 msgid "Attendee"
 msgstr "Присъстващ"
 
-msgctxt "model:calendar.event.exdate,name:0"
+msgctxt "model:calendar.event.exdate,name:"
 msgid "Exception Date"
 msgstr "Дата на грешка"
 
-msgctxt "model:calendar.event.exrule,name:0"
+msgctxt "model:calendar.event.exrule,name:"
 msgid "Exception Rule"
 msgstr "Правило при грешка"
 
-msgctxt "model:calendar.event.rdate,name:0"
+msgctxt "model:calendar.event.rdate,name:"
 msgid "Recurrence Date"
 msgstr "Повтаряща се дата"
 
-msgctxt "model:calendar.event.rrule,name:0"
+msgctxt "model:calendar.event.rrule,name:"
 msgid "Recurrence Rule"
 msgstr "Правило за повторение"
 
-msgctxt "model:calendar.location,name:0"
+msgctxt "model:calendar.location,name:"
 msgid "Location"
 msgstr "Местоположение"
 
-msgctxt "model:calendar.rrule,name:0"
+msgctxt "model:calendar.rrule,name:"
 msgid "Recurrence Rule"
 msgstr "Правило за повторение"
 
@@ -530,7 +870,6 @@ msgctxt "model:ir.action,name:act_event_form3"
 msgid "Events"
 msgstr "Събития"
 
-#, fuzzy
 msgctxt "model:ir.ui.menu,name:menu_calendar"
 msgid "Calendar"
 msgstr "Управление на календари"
@@ -547,214 +886,214 @@ msgctxt "model:res.group,name:group_calendar_admin"
 msgid "Calendar Administration"
 msgstr "Управление на календар"
 
-msgctxt "selection:calendar.attendee,status:0"
+msgctxt "selection:calendar.attendee,status:"
 msgid ""
 msgstr ""
 
-msgctxt "selection:calendar.attendee,status:0"
+msgctxt "selection:calendar.attendee,status:"
 msgid "Accepted"
 msgstr "Приет"
 
-msgctxt "selection:calendar.attendee,status:0"
+msgctxt "selection:calendar.attendee,status:"
 msgid "Declined"
 msgstr "Отхвърлен"
 
-msgctxt "selection:calendar.attendee,status:0"
+msgctxt "selection:calendar.attendee,status:"
 msgid "Delegated"
 msgstr "Делегиран"
 
-msgctxt "selection:calendar.attendee,status:0"
+msgctxt "selection:calendar.attendee,status:"
 msgid "Needs Action"
 msgstr "Необходимо е действие"
 
-msgctxt "selection:calendar.attendee,status:0"
+msgctxt "selection:calendar.attendee,status:"
 msgid "Tentative"
 msgstr "Пробен"
 
-msgctxt "selection:calendar.event,classification:0"
+msgctxt "selection:calendar.event,classification:"
 msgid "Confidential"
 msgstr "Поверителен"
 
-msgctxt "selection:calendar.event,classification:0"
+msgctxt "selection:calendar.event,classification:"
 msgid "Private"
 msgstr "Частен"
 
-msgctxt "selection:calendar.event,classification:0"
+msgctxt "selection:calendar.event,classification:"
 msgid "Public"
 msgstr "Публичен"
 
-msgctxt "selection:calendar.event,status:0"
+msgctxt "selection:calendar.event,status:"
 msgid ""
 msgstr ""
 
-msgctxt "selection:calendar.event,status:0"
+msgctxt "selection:calendar.event,status:"
 msgid "Cancelled"
 msgstr "Отказан"
 
-msgctxt "selection:calendar.event,status:0"
+msgctxt "selection:calendar.event,status:"
 msgid "Confirmed"
 msgstr "Потвърден"
 
-msgctxt "selection:calendar.event,status:0"
+msgctxt "selection:calendar.event,status:"
 msgid "Tentative"
 msgstr "Пробен"
 
-msgctxt "selection:calendar.event,transp:0"
+msgctxt "selection:calendar.event,transp:"
 msgid "Opaque"
 msgstr "Непрозрачен"
 
-msgctxt "selection:calendar.event,transp:0"
+msgctxt "selection:calendar.event,transp:"
 msgid "Transparent"
 msgstr "Прозрачен"
 
-msgctxt "selection:calendar.rrule,freq:0"
+msgctxt "selection:calendar.rrule,freq:"
 msgid "Daily"
 msgstr "Ежедневно"
 
-msgctxt "selection:calendar.rrule,freq:0"
+msgctxt "selection:calendar.rrule,freq:"
 msgid "Hourly"
 msgstr "Ежечасно"
 
-msgctxt "selection:calendar.rrule,freq:0"
+msgctxt "selection:calendar.rrule,freq:"
 msgid "Minutely"
 msgstr "Ежеминутно"
 
-msgctxt "selection:calendar.rrule,freq:0"
+msgctxt "selection:calendar.rrule,freq:"
 msgid "Monthly"
 msgstr "Месечно"
 
-msgctxt "selection:calendar.rrule,freq:0"
+msgctxt "selection:calendar.rrule,freq:"
 msgid "Secondly"
 msgstr "Всяка секунда"
 
-msgctxt "selection:calendar.rrule,freq:0"
+msgctxt "selection:calendar.rrule,freq:"
 msgid "Weekly"
 msgstr "Седмично"
 
-msgctxt "selection:calendar.rrule,freq:0"
+msgctxt "selection:calendar.rrule,freq:"
 msgid "Yearly"
 msgstr "Годишно"
 
-msgctxt "selection:calendar.rrule,wkst:0"
+msgctxt "selection:calendar.rrule,wkst:"
 msgid "Friday"
 msgstr "Петък"
 
-msgctxt "selection:calendar.rrule,wkst:0"
+msgctxt "selection:calendar.rrule,wkst:"
 msgid "Monday"
 msgstr "Понеделник"
 
-msgctxt "selection:calendar.rrule,wkst:0"
+msgctxt "selection:calendar.rrule,wkst:"
 msgid "Saturday"
 msgstr "Събота"
 
-msgctxt "selection:calendar.rrule,wkst:0"
+msgctxt "selection:calendar.rrule,wkst:"
 msgid "Sunday"
 msgstr "Неделя"
 
-msgctxt "selection:calendar.rrule,wkst:0"
+msgctxt "selection:calendar.rrule,wkst:"
 msgid "Thursday"
 msgstr "Четвъртък"
 
-msgctxt "selection:calendar.rrule,wkst:0"
+msgctxt "selection:calendar.rrule,wkst:"
 msgid "Tuesday"
 msgstr "Вторник"
 
-msgctxt "selection:calendar.rrule,wkst:0"
+msgctxt "selection:calendar.rrule,wkst:"
 msgid "Wednesday"
-msgstr "Четвъртък"
+msgstr "Сряда"
 
-msgctxt "view:calendar.calendar:0"
+msgctxt "view:calendar.calendar:"
 msgid "Calendar"
 msgstr "Календар"
 
-msgctxt "view:calendar.calendar:0"
+msgctxt "view:calendar.calendar:"
 msgid "Calendars"
 msgstr "Календари"
 
-msgctxt "view:calendar.calendar:0"
+msgctxt "view:calendar.calendar:"
 msgid "General"
 msgstr "Основен"
 
-msgctxt "view:calendar.calendar:0"
+msgctxt "view:calendar.calendar:"
 msgid "Security"
 msgstr "Сигурност"
 
-msgctxt "view:calendar.category:0"
+msgctxt "view:calendar.category:"
 msgid "Categories"
 msgstr "Категории"
 
-msgctxt "view:calendar.category:0"
+msgctxt "view:calendar.category:"
 msgid "Category"
 msgstr "Категория"
 
-msgctxt "view:calendar.event.attendee:0"
+msgctxt "view:calendar.event.attendee:"
 msgid "Attendee"
 msgstr "Присъстващ"
 
-msgctxt "view:calendar.event.attendee:0"
+msgctxt "view:calendar.event.attendee:"
 msgid "Attendees"
 msgstr "Присъстващи"
 
-msgctxt "view:calendar.event.exdate:0"
+msgctxt "view:calendar.event.exdate:"
 msgid "Exception Date"
 msgstr "Дата на грешка"
 
-msgctxt "view:calendar.event.exdate:0"
+msgctxt "view:calendar.event.exdate:"
 msgid "Exception Dates"
 msgstr "Дати на грешките"
 
-msgctxt "view:calendar.event.exrule:0"
+msgctxt "view:calendar.event.exrule:"
 msgid "Exception Rule"
 msgstr "Правило при грешка"
 
-msgctxt "view:calendar.event.exrule:0"
+msgctxt "view:calendar.event.exrule:"
 msgid "Exception Rules"
 msgstr "Правила при грешка"
 
-msgctxt "view:calendar.event.rdate:0"
+msgctxt "view:calendar.event.rdate:"
 msgid "Recurrence Date"
 msgstr "Повтаряща се дата"
 
-msgctxt "view:calendar.event.rdate:0"
+msgctxt "view:calendar.event.rdate:"
 msgid "Recurrence Dates"
 msgstr "Дати на повторяемост"
 
-msgctxt "view:calendar.event.rrule:0"
+msgctxt "view:calendar.event.rrule:"
 msgid "Recurrence Rule"
 msgstr "Правило за повторение"
 
-msgctxt "view:calendar.event.rrule:0"
+msgctxt "view:calendar.event.rrule:"
 msgid "Recurrence Rules"
 msgstr "Правила за повторяемост"
 
-msgctxt "view:calendar.event:0"
+msgctxt "view:calendar.event:"
 msgid "Attendees"
 msgstr "Присъстващи"
 
-msgctxt "view:calendar.event:0"
+msgctxt "view:calendar.event:"
 msgid "Categories"
 msgstr "Категории"
 
-msgctxt "view:calendar.event:0"
+msgctxt "view:calendar.event:"
 msgid "Event"
 msgstr "Събитие"
 
-msgctxt "view:calendar.event:0"
+msgctxt "view:calendar.event:"
 msgid "Events"
 msgstr "Събития"
 
-msgctxt "view:calendar.event:0"
+msgctxt "view:calendar.event:"
 msgid "General"
 msgstr "Основен"
 
-msgctxt "view:calendar.event:0"
+msgctxt "view:calendar.event:"
 msgid "Occurences"
 msgstr "Събития"
 
-msgctxt "view:calendar.location:0"
+msgctxt "view:calendar.location:"
 msgid "Location"
 msgstr "Местоположение"
 
-msgctxt "view:calendar.location:0"
+msgctxt "view:calendar.location:"
 msgid "Locations"
 msgstr "Местонахождения"
diff --git a/locale/ca_ES.po b/locale/ca_ES.po
new file mode 100644
index 0000000..bb1658b
--- /dev/null
+++ b/locale/ca_ES.po
@@ -0,0 +1,1121 @@
+# 
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "error:calendar.calendar:"
+msgid "A user can have only one calendar!"
+msgstr "Un usuari només pot tenir un calendari"
+
+msgctxt "error:calendar.calendar:"
+msgid "The name of calendar must be unique!"
+msgstr "El nom del calendari ha de ser únic"
+
+msgctxt "error:calendar.category:"
+msgid "The name of calendar category must be unique!"
+msgstr "El nom de la categoria del calendari ha de ser únic"
+
+msgctxt "error:calendar.event:"
+msgid "Recurrence can not be recurrent!"
+msgstr "Una recurrència no pot ser recurrent"
+
+msgctxt "error:calendar.event:"
+msgid "UUID and recurrence must be unique in a calendar!"
+msgstr "L'UUID i la recurrència han de ser únics en un calendari"
+
+msgctxt "error:calendar.location:"
+msgid "The name of calendar location must be unique!"
+msgstr "El nom de la ubicació del calendari ha de ser únic"
+
+msgctxt "error:calendar.rrule:"
+msgid "Invalid \"By Day\""
+msgstr "Invàlid «per dia»"
+
+msgctxt "error:calendar.rrule:"
+msgid "Invalid \"By Hour\""
+msgstr "Invàlid «per dia»"
+
+msgctxt "error:calendar.rrule:"
+msgid "Invalid \"By Minute\""
+msgstr "Invàlid «per minut»"
+
+msgctxt "error:calendar.rrule:"
+msgid "Invalid \"By Month Day\""
+msgstr "Invàlid «per dia del mes»"
+
+msgctxt "error:calendar.rrule:"
+msgid "Invalid \"By Month\""
+msgstr "Invàlid «per mes»"
+
+msgctxt "error:calendar.rrule:"
+msgid "Invalid \"By Position\""
+msgstr "Invàlid «per posició»"
+
+msgctxt "error:calendar.rrule:"
+msgid "Invalid \"By Second\""
+msgstr "Invàlid «per segons»"
+
+msgctxt "error:calendar.rrule:"
+msgid "Invalid \"By Week Number\""
+msgstr "Invàlid «per nombre de setmana»"
+
+msgctxt "error:calendar.rrule:"
+msgid "Invalid \"By Year Day\""
+msgstr "Invàlid «per dia de l'any»"
+
+msgctxt "error:calendar.rrule:"
+msgid "Only one of \"until\" and \"count\" can be set!"
+msgstr "Només es pot usar o «Fins a» o «Nombre de vegades»"
+
+msgctxt "field:calendar.alarm,create_date:"
+msgid "Create Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.alarm,create_uid:"
+msgid "Create User"
+msgstr "Crear usuari"
+
+msgctxt "field:calendar.alarm,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.alarm,rec_name:"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:calendar.alarm,valarm:"
+msgid "valarm"
+msgstr "valarm"
+
+msgctxt "field:calendar.alarm,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.alarm,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.attendee,attendee:"
+msgid "attendee"
+msgstr "assistents"
+
+msgctxt "field:calendar.attendee,create_date:"
+msgid "Create Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.attendee,create_uid:"
+msgid "Create User"
+msgstr "Crear usuari"
+
+msgctxt "field:calendar.attendee,email:"
+msgid "Email"
+msgstr "Correu electrònic"
+
+msgctxt "field:calendar.attendee,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.attendee,rec_name:"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:calendar.attendee,status:"
+msgid "Participation Status"
+msgstr "Estat de participació"
+
+msgctxt "field:calendar.attendee,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.attendee,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.calendar,create_date:"
+msgid "Create Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.calendar,create_uid:"
+msgid "Create User"
+msgstr "Crear usuari"
+
+msgctxt "field:calendar.calendar,description:"
+msgid "Description"
+msgstr "Descripció"
+
+msgctxt "field:calendar.calendar,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.calendar,name:"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:calendar.calendar,owner:"
+msgid "Owner"
+msgstr "Amo"
+
+msgctxt "field:calendar.calendar,read_users:"
+msgid "Read Users"
+msgstr "Usuaris amb lectura"
+
+msgctxt "field:calendar.calendar,rec_name:"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:calendar.calendar,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.calendar,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.calendar,write_users:"
+msgid "Write Users"
+msgstr "Usuaris amb escriptura"
+
+msgctxt "field:calendar.calendar-read-res.user,calendar:"
+msgid "Calendar"
+msgstr "Calendari"
+
+msgctxt "field:calendar.calendar-read-res.user,create_date:"
+msgid "Create Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.calendar-read-res.user,create_uid:"
+msgid "Create User"
+msgstr "Crear usuari"
+
+msgctxt "field:calendar.calendar-read-res.user,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.calendar-read-res.user,rec_name:"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:calendar.calendar-read-res.user,user:"
+msgid "User"
+msgstr "Usuari"
+
+msgctxt "field:calendar.calendar-read-res.user,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.calendar-read-res.user,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.calendar-write-res.user,calendar:"
+msgid "Calendar"
+msgstr "Calendari"
+
+msgctxt "field:calendar.calendar-write-res.user,create_date:"
+msgid "Create Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.calendar-write-res.user,create_uid:"
+msgid "Create User"
+msgstr "Crear usuari"
+
+msgctxt "field:calendar.calendar-write-res.user,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.calendar-write-res.user,rec_name:"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:calendar.calendar-write-res.user,user:"
+msgid "User"
+msgstr "Usuari"
+
+msgctxt "field:calendar.calendar-write-res.user,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.calendar-write-res.user,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.category,create_date:"
+msgid "Create Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.category,create_uid:"
+msgid "Create User"
+msgstr "Crear usuari"
+
+msgctxt "field:calendar.category,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.category,name:"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:calendar.category,rec_name:"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:calendar.category,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.category,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.date,create_date:"
+msgid "Create Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.date,create_uid:"
+msgid "Create User"
+msgstr "Crear usuari"
+
+#, fuzzy
+msgctxt "field:calendar.date,date:"
+msgid "Is Date"
+msgstr "És data"
+
+#, fuzzy
+msgctxt "field:calendar.date,datetime:"
+msgid "Date"
+msgstr "Data"
+
+msgctxt "field:calendar.date,id:"
+msgid "ID"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.date,rec_name:"
+msgid "Name"
+msgstr "Nom del camp"
+
+msgctxt "field:calendar.date,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.date,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.event,alarms:"
+msgid "Alarms"
+msgstr "Alarmes"
+
+msgctxt "field:calendar.event,all_day:"
+msgid "All Day"
+msgstr "Tot el dia"
+
+msgctxt "field:calendar.event,attendees:"
+msgid "Attendees"
+msgstr "Assistents"
+
+msgctxt "field:calendar.event,calendar:"
+msgid "Calendar"
+msgstr "Calendari"
+
+msgctxt "field:calendar.event,calendar_owner:"
+msgid "Owner"
+msgstr "Amo"
+
+msgctxt "field:calendar.event,calendar_read_users:"
+msgid "Read Users"
+msgstr "Usuaris amb lectura"
+
+msgctxt "field:calendar.event,calendar_write_users:"
+msgid "Write Users"
+msgstr "Usuaris amb escriptura"
+
+msgctxt "field:calendar.event,categories:"
+msgid "Categories"
+msgstr "Categories"
+
+msgctxt "field:calendar.event,classification:"
+msgid "Classification"
+msgstr "Classificació"
+
+msgctxt "field:calendar.event,create_date:"
+msgid "Create Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.event,create_uid:"
+msgid "Create User"
+msgstr "Crear usuari"
+
+msgctxt "field:calendar.event,description:"
+msgid "Description"
+msgstr "Descripció"
+
+msgctxt "field:calendar.event,dtend:"
+msgid "End Date"
+msgstr "Data final"
+
+msgctxt "field:calendar.event,dtstart:"
+msgid "Start Date"
+msgstr "Data inici"
+
+msgctxt "field:calendar.event,exdates:"
+msgid "Exception Dates"
+msgstr "Dates excloses"
+
+msgctxt "field:calendar.event,exrules:"
+msgid "Exception Rules"
+msgstr "Regles d'excepció"
+
+msgctxt "field:calendar.event,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.event,location:"
+msgid "Location"
+msgstr "Ubicació"
+
+msgctxt "field:calendar.event,occurences:"
+msgid "Occurences"
+msgstr "Ocurrències"
+
+msgctxt "field:calendar.event,organizer:"
+msgid "Organizer"
+msgstr "Organitzador"
+
+msgctxt "field:calendar.event,parent:"
+msgid "Parent"
+msgstr "Pare"
+
+msgctxt "field:calendar.event,rdates:"
+msgid "Recurrence Dates"
+msgstr "Dates de recurrència"
+
+msgctxt "field:calendar.event,rec_name:"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:calendar.event,recurrence:"
+msgid "Recurrence"
+msgstr "Recurrència"
+
+msgctxt "field:calendar.event,rrules:"
+msgid "Recurrence Rules"
+msgstr "Regles de recurrència"
+
+msgctxt "field:calendar.event,sequence:"
+msgid "Sequence"
+msgstr "Seqüència"
+
+msgctxt "field:calendar.event,status:"
+msgid "Status"
+msgstr "Estat"
+
+msgctxt "field:calendar.event,summary:"
+msgid "Summary"
+msgstr "Resum"
+
+msgctxt "field:calendar.event,timezone:"
+msgid "Timezone"
+msgstr "Zona horària"
+
+msgctxt "field:calendar.event,transp:"
+msgid "Time Transparency"
+msgstr "Temps de transparència"
+
+msgctxt "field:calendar.event,uuid:"
+msgid "UUID"
+msgstr "UUID"
+
+msgctxt "field:calendar.event,vevent:"
+msgid "vevent"
+msgstr "vevent"
+
+msgctxt "field:calendar.event,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.event,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.event-calendar.category,category:"
+msgid "Category"
+msgstr "Categoria"
+
+msgctxt "field:calendar.event-calendar.category,create_date:"
+msgid "Create Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.event-calendar.category,create_uid:"
+msgid "Create User"
+msgstr "Crear usuari"
+
+msgctxt "field:calendar.event-calendar.category,event:"
+msgid "Event"
+msgstr "Esdeveniment"
+
+msgctxt "field:calendar.event-calendar.category,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.event-calendar.category,rec_name:"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:calendar.event-calendar.category,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.event-calendar.category,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.event.alarm,calendar_alarm:"
+msgid "Calendar Alarm"
+msgstr "Alarma del calendari"
+
+msgctxt "field:calendar.event.alarm,create_date:"
+msgid "Create Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.event.alarm,create_uid:"
+msgid "Create User"
+msgstr "Crear usuari"
+
+msgctxt "field:calendar.event.alarm,event:"
+msgid "Event"
+msgstr "Esdeveniment"
+
+msgctxt "field:calendar.event.alarm,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.event.alarm,rec_name:"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:calendar.event.alarm,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.event.alarm,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.event.attendee,calendar_attendee:"
+msgid "Calendar Attendee"
+msgstr "Calendari d'assistents"
+
+msgctxt "field:calendar.event.attendee,create_date:"
+msgid "Create Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.event.attendee,create_uid:"
+msgid "Create User"
+msgstr "Crear usuari"
+
+msgctxt "field:calendar.event.attendee,event:"
+msgid "Event"
+msgstr "Esdeveniment"
+
+msgctxt "field:calendar.event.attendee,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.event.attendee,rec_name:"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:calendar.event.attendee,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.event.attendee,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.event.exdate,calendar_date:"
+msgid "Calendar Date"
+msgstr ""
+
+msgctxt "field:calendar.event.exdate,create_date:"
+msgid "Create Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.event.exdate,create_uid:"
+msgid "Create User"
+msgstr "Crear usuari"
+
+msgctxt "field:calendar.event.exdate,event:"
+msgid "Event"
+msgstr "Esdeveniment"
+
+msgctxt "field:calendar.event.exdate,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.event.exdate,rec_name:"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:calendar.event.exdate,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.event.exdate,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.event.exrule,calendar_rrule:"
+msgid "Calendar RRule"
+msgstr "Regla de recurrència"
+
+msgctxt "field:calendar.event.exrule,create_date:"
+msgid "Create Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.event.exrule,create_uid:"
+msgid "Create User"
+msgstr "Crear usuari"
+
+msgctxt "field:calendar.event.exrule,event:"
+msgid "Event"
+msgstr "Esdeveniment"
+
+msgctxt "field:calendar.event.exrule,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.event.exrule,rec_name:"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:calendar.event.exrule,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.event.exrule,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.event.rdate,calendar_date:"
+msgid "Calendar Date"
+msgstr ""
+
+msgctxt "field:calendar.event.rdate,create_date:"
+msgid "Create Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.event.rdate,create_uid:"
+msgid "Create User"
+msgstr "Crear usuari"
+
+msgctxt "field:calendar.event.rdate,event:"
+msgid "Event"
+msgstr "Esdeveniment"
+
+msgctxt "field:calendar.event.rdate,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.event.rdate,rec_name:"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:calendar.event.rdate,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.event.rdate,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.event.rrule,calendar_rrule:"
+msgid "Calendar RRule"
+msgstr "Regla de recurrència"
+
+msgctxt "field:calendar.event.rrule,create_date:"
+msgid "Create Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.event.rrule,create_uid:"
+msgid "Create User"
+msgstr "Crear usuari"
+
+msgctxt "field:calendar.event.rrule,event:"
+msgid "Event"
+msgstr "Esdeveniment"
+
+msgctxt "field:calendar.event.rrule,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.event.rrule,rec_name:"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:calendar.event.rrule,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.event.rrule,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.location,create_date:"
+msgid "Create Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.location,create_uid:"
+msgid "Create User"
+msgstr "Crear usuari"
+
+msgctxt "field:calendar.location,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.location,name:"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:calendar.location,rec_name:"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:calendar.location,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.location,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.rrule,byday:"
+msgid "By Day"
+msgstr "Per dia"
+
+msgctxt "field:calendar.rrule,byhour:"
+msgid "By Hour"
+msgstr "Per hora"
+
+msgctxt "field:calendar.rrule,byminute:"
+msgid "By Minute"
+msgstr "Per minut"
+
+msgctxt "field:calendar.rrule,bymonth:"
+msgid "By Month"
+msgstr "Per mes"
+
+msgctxt "field:calendar.rrule,bymonthday:"
+msgid "By Month Day"
+msgstr "Per dia del mes"
+
+msgctxt "field:calendar.rrule,bysecond:"
+msgid "By Second"
+msgstr "Per segon"
+
+msgctxt "field:calendar.rrule,bysetpos:"
+msgid "By Position"
+msgstr "Per posició"
+
+msgctxt "field:calendar.rrule,byweekno:"
+msgid "By Week Number"
+msgstr "Per dia de la setmana"
+
+msgctxt "field:calendar.rrule,byyearday:"
+msgid "By Year Day"
+msgstr "Per dia de l'any"
+
+msgctxt "field:calendar.rrule,count:"
+msgid "Count"
+msgstr "Nombre de vegades"
+
+msgctxt "field:calendar.rrule,create_date:"
+msgid "Create Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.rrule,create_uid:"
+msgid "Create User"
+msgstr "Crear usuari"
+
+msgctxt "field:calendar.rrule,freq:"
+msgid "Frequency"
+msgstr "Freqüència"
+
+msgctxt "field:calendar.rrule,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.rrule,interval:"
+msgid "Interval"
+msgstr "Interval"
+
+msgctxt "field:calendar.rrule,rec_name:"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:calendar.rrule,until:"
+msgid "Until Date"
+msgstr "Fins a la data"
+
+msgctxt "field:calendar.rrule,until_date:"
+msgid "Is Date"
+msgstr "És data"
+
+msgctxt "field:calendar.rrule,wkst:"
+msgid "Week Day"
+msgstr "Dia de la setmana"
+
+msgctxt "field:calendar.rrule,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.rrule,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:res.user,calendars:"
+msgid "Calendars"
+msgstr "Calendaris"
+
+msgctxt "help:calendar.calendar,owner:"
+msgid "The user must have an email"
+msgstr "L'usuari ha de tenir un correu electrònic"
+
+msgctxt "help:calendar.date,date:"
+msgid "Ignore time of field \"Date\", but handle as date only."
+msgstr ""
+
+msgctxt "help:calendar.event,uuid:"
+msgid "Universally Unique Identifier"
+msgstr "Identificador universal únic"
+
+msgctxt "help:calendar.rrule,until_date:"
+msgid "Ignore time of field \"Until Date\", but handle as date only."
+msgstr "Ignora l'hora del camp «Fins a la data» i tracta'l com a data."
+
+msgctxt "model:calendar.alarm,name:"
+msgid "Alarm"
+msgstr "Alarma"
+
+msgctxt "model:calendar.attendee,name:"
+msgid "Attendee"
+msgstr "Assistents"
+
+msgctxt "model:calendar.calendar,name:"
+msgid "Calendar"
+msgstr "Calendari"
+
+msgctxt "model:calendar.calendar-read-res.user,name:"
+msgid "Calendar - read - User"
+msgstr "Calendari - llegir - usuari"
+
+msgctxt "model:calendar.calendar-write-res.user,name:"
+msgid "Calendar - write - User"
+msgstr "Calendari - escriure - usuari"
+
+msgctxt "model:calendar.category,name:"
+msgid "Category"
+msgstr "Categoria"
+
+msgctxt "model:calendar.date,name:"
+msgid "Calendar Date"
+msgstr ""
+
+msgctxt "model:calendar.event,name:"
+msgid "Event"
+msgstr "Esdeveniment"
+
+msgctxt "model:calendar.event-calendar.category,name:"
+msgid "Event - Category"
+msgstr "Esdeveniment - Categoria"
+
+msgctxt "model:calendar.event.alarm,name:"
+msgid "Alarm"
+msgstr "Alarma"
+
+msgctxt "model:calendar.event.attendee,name:"
+msgid "Attendee"
+msgstr "Assistents"
+
+msgctxt "model:calendar.event.exdate,name:"
+msgid "Exception Date"
+msgstr "Data exclosa"
+
+msgctxt "model:calendar.event.exrule,name:"
+msgid "Exception Rule"
+msgstr "Regla d'excepció"
+
+msgctxt "model:calendar.event.rdate,name:"
+msgid "Recurrence Date"
+msgstr "Data de recurrència"
+
+msgctxt "model:calendar.event.rrule,name:"
+msgid "Recurrence Rule"
+msgstr "Regla de recurrència"
+
+msgctxt "model:calendar.location,name:"
+msgid "Location"
+msgstr "Ubicació"
+
+msgctxt "model:calendar.rrule,name:"
+msgid "Recurrence Rule"
+msgstr "Regla de recurrència"
+
+msgctxt "model:ir.action,name:act_calendar_form"
+msgid "Calendars"
+msgstr "Calendaris"
+
+msgctxt "model:ir.action,name:act_event_form"
+msgid "Events"
+msgstr "Esdeveniments"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_event_form3"
+msgid "Events"
+msgstr "Esdeveniments"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_calendar"
+msgid "Calendar"
+msgstr "Gestió de calendari"
+
+msgctxt "model:ir.ui.menu,name:menu_calendar_form"
+msgid "Calendars"
+msgstr "Calendaris"
+
+msgctxt "model:ir.ui.menu,name:menu_event_form"
+msgid "Events"
+msgstr "Esdeveniments"
+
+msgctxt "model:res.group,name:group_calendar_admin"
+msgid "Calendar Administration"
+msgstr "Administració de calendari"
+
+msgctxt "selection:calendar.attendee,status:"
+msgid ""
+msgstr ""
+
+msgctxt "selection:calendar.attendee,status:"
+msgid "Accepted"
+msgstr "Acceptada"
+
+msgctxt "selection:calendar.attendee,status:"
+msgid "Declined"
+msgstr "Refusat"
+
+msgctxt "selection:calendar.attendee,status:"
+msgid "Delegated"
+msgstr "Delegada"
+
+msgctxt "selection:calendar.attendee,status:"
+msgid "Needs Action"
+msgstr "Necessita una acció"
+
+msgctxt "selection:calendar.attendee,status:"
+msgid "Tentative"
+msgstr "Temptativa"
+
+msgctxt "selection:calendar.event,classification:"
+msgid "Confidential"
+msgstr "Confidencial"
+
+msgctxt "selection:calendar.event,classification:"
+msgid "Private"
+msgstr "Privat"
+
+msgctxt "selection:calendar.event,classification:"
+msgid "Public"
+msgstr "Públic"
+
+msgctxt "selection:calendar.event,status:"
+msgid ""
+msgstr ""
+
+msgctxt "selection:calendar.event,status:"
+msgid "Cancelled"
+msgstr "Cancel·lat"
+
+msgctxt "selection:calendar.event,status:"
+msgid "Confirmed"
+msgstr "Confirmada"
+
+msgctxt "selection:calendar.event,status:"
+msgid "Tentative"
+msgstr "Temptatiu"
+
+msgctxt "selection:calendar.event,transp:"
+msgid "Opaque"
+msgstr "Opac"
+
+msgctxt "selection:calendar.event,transp:"
+msgid "Transparent"
+msgstr "Transparent"
+
+msgctxt "selection:calendar.rrule,freq:"
+msgid "Daily"
+msgstr "Diàriament"
+
+msgctxt "selection:calendar.rrule,freq:"
+msgid "Hourly"
+msgstr "Cada hora"
+
+msgctxt "selection:calendar.rrule,freq:"
+msgid "Minutely"
+msgstr "Cada minut"
+
+msgctxt "selection:calendar.rrule,freq:"
+msgid "Monthly"
+msgstr "Mensualment"
+
+msgctxt "selection:calendar.rrule,freq:"
+msgid "Secondly"
+msgstr "Cada segon"
+
+msgctxt "selection:calendar.rrule,freq:"
+msgid "Weekly"
+msgstr "Setmanalment"
+
+msgctxt "selection:calendar.rrule,freq:"
+msgid "Yearly"
+msgstr "Anualment"
+
+msgctxt "selection:calendar.rrule,wkst:"
+msgid "Friday"
+msgstr "Divendres"
+
+msgctxt "selection:calendar.rrule,wkst:"
+msgid "Monday"
+msgstr "Dilluns"
+
+msgctxt "selection:calendar.rrule,wkst:"
+msgid "Saturday"
+msgstr "Dissabte"
+
+msgctxt "selection:calendar.rrule,wkst:"
+msgid "Sunday"
+msgstr "Diumenge"
+
+msgctxt "selection:calendar.rrule,wkst:"
+msgid "Thursday"
+msgstr "Dijous"
+
+msgctxt "selection:calendar.rrule,wkst:"
+msgid "Tuesday"
+msgstr "Dimarts"
+
+msgctxt "selection:calendar.rrule,wkst:"
+msgid "Wednesday"
+msgstr "Dimecres"
+
+msgctxt "view:calendar.calendar:"
+msgid "Calendar"
+msgstr "Calendari"
+
+msgctxt "view:calendar.calendar:"
+msgid "Calendars"
+msgstr "Calendaris"
+
+msgctxt "view:calendar.calendar:"
+msgid "General"
+msgstr "General"
+
+msgctxt "view:calendar.calendar:"
+msgid "Security"
+msgstr "Seguretat"
+
+msgctxt "view:calendar.category:"
+msgid "Categories"
+msgstr "Categories"
+
+msgctxt "view:calendar.category:"
+msgid "Category"
+msgstr "Categoria"
+
+msgctxt "view:calendar.event.attendee:"
+msgid "Attendee"
+msgstr "Assistents"
+
+msgctxt "view:calendar.event.attendee:"
+msgid "Attendees"
+msgstr "Assistents"
+
+msgctxt "view:calendar.event.exdate:"
+msgid "Exception Date"
+msgstr "Data exclosa"
+
+msgctxt "view:calendar.event.exdate:"
+msgid "Exception Dates"
+msgstr "Dates excloses"
+
+msgctxt "view:calendar.event.exrule:"
+msgid "Exception Rule"
+msgstr "Regla d'excepció"
+
+msgctxt "view:calendar.event.exrule:"
+msgid "Exception Rules"
+msgstr "Regles d'excepcions"
+
+msgctxt "view:calendar.event.rdate:"
+msgid "Recurrence Date"
+msgstr "Data de recurrència"
+
+msgctxt "view:calendar.event.rdate:"
+msgid "Recurrence Dates"
+msgstr "Dates de recurrència"
+
+msgctxt "view:calendar.event.rrule:"
+msgid "Recurrence Rule"
+msgstr "Regla de recurrència"
+
+msgctxt "view:calendar.event.rrule:"
+msgid "Recurrence Rules"
+msgstr "Regles de recurrència"
+
+msgctxt "view:calendar.event:"
+msgid "Attendees"
+msgstr "Assistents"
+
+msgctxt "view:calendar.event:"
+msgid "Categories"
+msgstr "Categories"
+
+msgctxt "view:calendar.event:"
+msgid "Event"
+msgstr "Esdeveniment"
+
+msgctxt "view:calendar.event:"
+msgid "Events"
+msgstr "Esdeveniments"
+
+msgctxt "view:calendar.event:"
+msgid "General"
+msgstr "General"
+
+msgctxt "view:calendar.event:"
+msgid "Occurences"
+msgstr "Ocurrències"
+
+msgctxt "view:calendar.location:"
+msgid "Location"
+msgstr "Ubicació"
+
+msgctxt "view:calendar.location:"
+msgid "Locations"
+msgstr "Ubicacions"
diff --git a/locale/cs_CZ.po b/locale/cs_CZ.po
index 72d4400..4d23715 100644
--- a/locale/cs_CZ.po
+++ b/locale/cs_CZ.po
@@ -2,519 +2,859 @@
 msgid ""
 msgstr "Content-Type: text/plain; charset=utf-8\n"
 
-msgctxt "error:calendar.calendar:0"
+msgctxt "error:calendar.calendar:"
 msgid "A user can have only one calendar!"
 msgstr ""
 
-msgctxt "error:calendar.calendar:0"
+msgctxt "error:calendar.calendar:"
 msgid "The name of calendar must be unique!"
 msgstr ""
 
-msgctxt "error:calendar.category:0"
+msgctxt "error:calendar.category:"
 msgid "The name of calendar category must be unique!"
 msgstr ""
 
-msgctxt "error:calendar.event:0"
+msgctxt "error:calendar.event:"
 msgid "Recurrence can not be recurrent!"
 msgstr ""
 
-msgctxt "error:calendar.event:0"
+msgctxt "error:calendar.event:"
 msgid "UUID and recurrence must be unique in a calendar!"
 msgstr ""
 
-msgctxt "error:calendar.location:0"
+msgctxt "error:calendar.location:"
 msgid "The name of calendar location must be unique!"
 msgstr ""
 
-msgctxt "error:calendar.rrule:0"
+msgctxt "error:calendar.rrule:"
 msgid "Invalid \"By Day\""
 msgstr ""
 
-msgctxt "error:calendar.rrule:0"
+msgctxt "error:calendar.rrule:"
 msgid "Invalid \"By Hour\""
 msgstr ""
 
-msgctxt "error:calendar.rrule:0"
+msgctxt "error:calendar.rrule:"
 msgid "Invalid \"By Minute\""
 msgstr ""
 
-msgctxt "error:calendar.rrule:0"
+msgctxt "error:calendar.rrule:"
 msgid "Invalid \"By Month Day\""
 msgstr ""
 
-msgctxt "error:calendar.rrule:0"
+msgctxt "error:calendar.rrule:"
 msgid "Invalid \"By Month\""
 msgstr ""
 
-msgctxt "error:calendar.rrule:0"
+msgctxt "error:calendar.rrule:"
 msgid "Invalid \"By Position\""
 msgstr ""
 
-msgctxt "error:calendar.rrule:0"
+msgctxt "error:calendar.rrule:"
 msgid "Invalid \"By Second\""
 msgstr ""
 
-msgctxt "error:calendar.rrule:0"
+msgctxt "error:calendar.rrule:"
 msgid "Invalid \"By Week Number\""
 msgstr ""
 
-msgctxt "error:calendar.rrule:0"
+msgctxt "error:calendar.rrule:"
 msgid "Invalid \"By Year Day\""
 msgstr ""
 
-msgctxt "error:calendar.rrule:0"
+msgctxt "error:calendar.rrule:"
 msgid "Only one of \"until\" and \"count\" can be set!"
 msgstr ""
 
-msgctxt "field:calendar.alarm,rec_name:0"
+msgctxt "field:calendar.alarm,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:calendar.alarm,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:calendar.alarm,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.alarm,rec_name:"
 msgid "Name"
 msgstr ""
 
-msgctxt "field:calendar.alarm,valarm:0"
+msgctxt "field:calendar.alarm,valarm:"
 msgid "valarm"
 msgstr ""
 
-msgctxt "field:calendar.attendee,attendee:0"
+msgctxt "field:calendar.alarm,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.alarm,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.attendee,attendee:"
 msgid "attendee"
 msgstr ""
 
-msgctxt "field:calendar.attendee,email:0"
+msgctxt "field:calendar.attendee,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:calendar.attendee,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:calendar.attendee,email:"
 msgid "Email"
 msgstr ""
 
-msgctxt "field:calendar.attendee,rec_name:0"
+msgctxt "field:calendar.attendee,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.attendee,rec_name:"
 msgid "Name"
 msgstr ""
 
-msgctxt "field:calendar.attendee,status:0"
+msgctxt "field:calendar.attendee,status:"
 msgid "Participation Status"
 msgstr ""
 
-msgctxt "field:calendar.calendar,description:0"
+msgctxt "field:calendar.attendee,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.attendee,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.calendar,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:calendar.calendar,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:calendar.calendar,description:"
 msgid "Description"
 msgstr ""
 
-msgctxt "field:calendar.calendar,name:0"
+msgctxt "field:calendar.calendar,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.calendar,name:"
 msgid "Name"
 msgstr ""
 
-msgctxt "field:calendar.calendar,owner:0"
+msgctxt "field:calendar.calendar,owner:"
 msgid "Owner"
 msgstr ""
 
-msgctxt "field:calendar.calendar,read_users:0"
+msgctxt "field:calendar.calendar,read_users:"
 msgid "Read Users"
 msgstr ""
 
-msgctxt "field:calendar.calendar,rec_name:0"
+msgctxt "field:calendar.calendar,rec_name:"
 msgid "Name"
 msgstr ""
 
-msgctxt "field:calendar.calendar,write_users:0"
+msgctxt "field:calendar.calendar,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.calendar,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.calendar,write_users:"
 msgid "Write Users"
 msgstr ""
 
-msgctxt "field:calendar.calendar-read-res.user,calendar:0"
+msgctxt "field:calendar.calendar-read-res.user,calendar:"
 msgid "Calendar"
 msgstr ""
 
-msgctxt "field:calendar.calendar-read-res.user,rec_name:0"
+msgctxt "field:calendar.calendar-read-res.user,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:calendar.calendar-read-res.user,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:calendar.calendar-read-res.user,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.calendar-read-res.user,rec_name:"
 msgid "Name"
 msgstr ""
 
-msgctxt "field:calendar.calendar-read-res.user,user:0"
+msgctxt "field:calendar.calendar-read-res.user,user:"
 msgid "User"
 msgstr ""
 
-msgctxt "field:calendar.calendar-write-res.user,calendar:0"
+msgctxt "field:calendar.calendar-read-res.user,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.calendar-read-res.user,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.calendar-write-res.user,calendar:"
 msgid "Calendar"
 msgstr ""
 
-msgctxt "field:calendar.calendar-write-res.user,rec_name:0"
+msgctxt "field:calendar.calendar-write-res.user,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:calendar.calendar-write-res.user,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:calendar.calendar-write-res.user,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.calendar-write-res.user,rec_name:"
 msgid "Name"
 msgstr ""
 
-msgctxt "field:calendar.calendar-write-res.user,user:0"
+msgctxt "field:calendar.calendar-write-res.user,user:"
 msgid "User"
 msgstr ""
 
-msgctxt "field:calendar.category,name:0"
+msgctxt "field:calendar.calendar-write-res.user,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.calendar-write-res.user,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.category,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:calendar.category,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:calendar.category,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.category,name:"
 msgid "Name"
 msgstr ""
 
-msgctxt "field:calendar.category,rec_name:0"
+msgctxt "field:calendar.category,rec_name:"
 msgid "Name"
 msgstr ""
 
-msgctxt "field:calendar.date,date:0"
+msgctxt "field:calendar.category,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.category,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.date,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:calendar.date,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:calendar.date,date:"
 msgid "Is Date"
 msgstr ""
 
-msgctxt "field:calendar.date,datetime:0"
+msgctxt "field:calendar.date,datetime:"
 msgid "Date"
 msgstr ""
 
-msgctxt "field:calendar.date,rec_name:0"
+msgctxt "field:calendar.date,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.date,rec_name:"
 msgid "Name"
 msgstr ""
 
-msgctxt "field:calendar.event,alarms:0"
+msgctxt "field:calendar.date,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.date,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.event,alarms:"
 msgid "Alarms"
 msgstr ""
 
-msgctxt "field:calendar.event,all_day:0"
+msgctxt "field:calendar.event,all_day:"
 msgid "All Day"
 msgstr ""
 
-msgctxt "field:calendar.event,attendees:0"
+msgctxt "field:calendar.event,attendees:"
 msgid "Attendees"
 msgstr ""
 
-msgctxt "field:calendar.event,calendar:0"
+msgctxt "field:calendar.event,calendar:"
 msgid "Calendar"
 msgstr ""
 
-msgctxt "field:calendar.event,calendar_owner:0"
+msgctxt "field:calendar.event,calendar_owner:"
 msgid "Owner"
 msgstr ""
 
-msgctxt "field:calendar.event,calendar_read_users:0"
+msgctxt "field:calendar.event,calendar_read_users:"
 msgid "Read Users"
 msgstr ""
 
-msgctxt "field:calendar.event,calendar_write_users:0"
+msgctxt "field:calendar.event,calendar_write_users:"
 msgid "Write Users"
 msgstr ""
 
-msgctxt "field:calendar.event,categories:0"
+msgctxt "field:calendar.event,categories:"
 msgid "Categories"
 msgstr ""
 
-msgctxt "field:calendar.event,classification:0"
+msgctxt "field:calendar.event,classification:"
 msgid "Classification"
 msgstr ""
 
-msgctxt "field:calendar.event,description:0"
+msgctxt "field:calendar.event,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:calendar.event,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:calendar.event,description:"
 msgid "Description"
 msgstr ""
 
-msgctxt "field:calendar.event,dtend:0"
+msgctxt "field:calendar.event,dtend:"
 msgid "End Date"
 msgstr ""
 
-msgctxt "field:calendar.event,dtstart:0"
+msgctxt "field:calendar.event,dtstart:"
 msgid "Start Date"
 msgstr ""
 
-msgctxt "field:calendar.event,exdates:0"
+msgctxt "field:calendar.event,exdates:"
 msgid "Exception Dates"
 msgstr ""
 
-msgctxt "field:calendar.event,exrules:0"
+msgctxt "field:calendar.event,exrules:"
 msgid "Exception Rules"
 msgstr ""
 
-msgctxt "field:calendar.event,location:0"
+msgctxt "field:calendar.event,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.event,location:"
 msgid "Location"
 msgstr ""
 
-msgctxt "field:calendar.event,occurences:0"
+msgctxt "field:calendar.event,occurences:"
 msgid "Occurences"
 msgstr ""
 
-msgctxt "field:calendar.event,organizer:0"
+msgctxt "field:calendar.event,organizer:"
 msgid "Organizer"
 msgstr ""
 
-msgctxt "field:calendar.event,parent:0"
+msgctxt "field:calendar.event,parent:"
 msgid "Parent"
 msgstr ""
 
-msgctxt "field:calendar.event,rdates:0"
+msgctxt "field:calendar.event,rdates:"
 msgid "Recurrence Dates"
 msgstr ""
 
-msgctxt "field:calendar.event,rec_name:0"
+msgctxt "field:calendar.event,rec_name:"
 msgid "Name"
 msgstr ""
 
-msgctxt "field:calendar.event,recurrence:0"
+msgctxt "field:calendar.event,recurrence:"
 msgid "Recurrence"
 msgstr ""
 
-msgctxt "field:calendar.event,rrules:0"
+msgctxt "field:calendar.event,rrules:"
 msgid "Recurrence Rules"
 msgstr ""
 
-msgctxt "field:calendar.event,sequence:0"
+msgctxt "field:calendar.event,sequence:"
 msgid "Sequence"
 msgstr ""
 
-msgctxt "field:calendar.event,status:0"
+msgctxt "field:calendar.event,status:"
 msgid "Status"
 msgstr ""
 
-msgctxt "field:calendar.event,summary:0"
+msgctxt "field:calendar.event,summary:"
 msgid "Summary"
 msgstr ""
 
-msgctxt "field:calendar.event,timezone:0"
+msgctxt "field:calendar.event,timezone:"
 msgid "Timezone"
 msgstr ""
 
-msgctxt "field:calendar.event,transp:0"
+msgctxt "field:calendar.event,transp:"
 msgid "Time Transparency"
 msgstr ""
 
-msgctxt "field:calendar.event,uuid:0"
+msgctxt "field:calendar.event,uuid:"
 msgid "UUID"
 msgstr ""
 
-msgctxt "field:calendar.event,vevent:0"
+msgctxt "field:calendar.event,vevent:"
 msgid "vevent"
 msgstr ""
 
-msgctxt "field:calendar.event-calendar.category,category:0"
+msgctxt "field:calendar.event,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.event,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.event-calendar.category,category:"
 msgid "Category"
 msgstr ""
 
-msgctxt "field:calendar.event-calendar.category,event:0"
+msgctxt "field:calendar.event-calendar.category,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:calendar.event-calendar.category,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:calendar.event-calendar.category,event:"
 msgid "Event"
 msgstr ""
 
-msgctxt "field:calendar.event-calendar.category,rec_name:0"
+msgctxt "field:calendar.event-calendar.category,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.event-calendar.category,rec_name:"
 msgid "Name"
 msgstr ""
 
-msgctxt "field:calendar.event.alarm,calendar_alarm:0"
+msgctxt "field:calendar.event-calendar.category,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.event-calendar.category,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.event.alarm,calendar_alarm:"
 msgid "Calendar Alarm"
 msgstr ""
 
-msgctxt "field:calendar.event.alarm,event:0"
+msgctxt "field:calendar.event.alarm,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:calendar.event.alarm,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:calendar.event.alarm,event:"
 msgid "Event"
 msgstr ""
 
-msgctxt "field:calendar.event.alarm,rec_name:0"
+msgctxt "field:calendar.event.alarm,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.event.alarm,rec_name:"
 msgid "Name"
 msgstr ""
 
-msgctxt "field:calendar.event.attendee,calendar_attendee:0"
+msgctxt "field:calendar.event.alarm,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.event.alarm,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.event.attendee,calendar_attendee:"
 msgid "Calendar Attendee"
 msgstr ""
 
-msgctxt "field:calendar.event.attendee,event:0"
+msgctxt "field:calendar.event.attendee,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:calendar.event.attendee,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:calendar.event.attendee,event:"
 msgid "Event"
 msgstr ""
 
-msgctxt "field:calendar.event.attendee,rec_name:0"
+msgctxt "field:calendar.event.attendee,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.event.attendee,rec_name:"
 msgid "Name"
 msgstr ""
 
-msgctxt "field:calendar.event.exdate,calendar_date:0"
+msgctxt "field:calendar.event.attendee,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.event.attendee,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.event.exdate,calendar_date:"
 msgid "Calendar Date"
 msgstr ""
 
-msgctxt "field:calendar.event.exdate,event:0"
+msgctxt "field:calendar.event.exdate,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:calendar.event.exdate,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:calendar.event.exdate,event:"
 msgid "Event"
 msgstr ""
 
-msgctxt "field:calendar.event.exdate,rec_name:0"
+msgctxt "field:calendar.event.exdate,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.event.exdate,rec_name:"
 msgid "Name"
 msgstr ""
 
-msgctxt "field:calendar.event.exrule,calendar_rrule:0"
+msgctxt "field:calendar.event.exdate,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.event.exdate,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.event.exrule,calendar_rrule:"
 msgid "Calendar RRule"
 msgstr ""
 
-msgctxt "field:calendar.event.exrule,event:0"
+msgctxt "field:calendar.event.exrule,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:calendar.event.exrule,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:calendar.event.exrule,event:"
 msgid "Event"
 msgstr ""
 
-msgctxt "field:calendar.event.exrule,rec_name:0"
+msgctxt "field:calendar.event.exrule,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.event.exrule,rec_name:"
 msgid "Name"
 msgstr ""
 
-msgctxt "field:calendar.event.rdate,calendar_date:0"
+msgctxt "field:calendar.event.exrule,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.event.exrule,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.event.rdate,calendar_date:"
 msgid "Calendar Date"
 msgstr ""
 
-msgctxt "field:calendar.event.rdate,event:0"
+msgctxt "field:calendar.event.rdate,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:calendar.event.rdate,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:calendar.event.rdate,event:"
 msgid "Event"
 msgstr ""
 
-msgctxt "field:calendar.event.rdate,rec_name:0"
+msgctxt "field:calendar.event.rdate,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.event.rdate,rec_name:"
 msgid "Name"
 msgstr ""
 
-msgctxt "field:calendar.event.rrule,calendar_rrule:0"
+msgctxt "field:calendar.event.rdate,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.event.rdate,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.event.rrule,calendar_rrule:"
 msgid "Calendar RRule"
 msgstr ""
 
-msgctxt "field:calendar.event.rrule,event:0"
+msgctxt "field:calendar.event.rrule,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:calendar.event.rrule,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:calendar.event.rrule,event:"
 msgid "Event"
 msgstr ""
 
-msgctxt "field:calendar.event.rrule,rec_name:0"
+msgctxt "field:calendar.event.rrule,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.event.rrule,rec_name:"
 msgid "Name"
 msgstr ""
 
-msgctxt "field:calendar.location,name:0"
+msgctxt "field:calendar.event.rrule,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.event.rrule,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.location,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:calendar.location,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:calendar.location,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.location,name:"
 msgid "Name"
 msgstr ""
 
-msgctxt "field:calendar.location,rec_name:0"
+msgctxt "field:calendar.location,rec_name:"
 msgid "Name"
 msgstr ""
 
-msgctxt "field:calendar.rrule,byday:0"
+msgctxt "field:calendar.location,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.location,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.rrule,byday:"
 msgid "By Day"
 msgstr ""
 
-msgctxt "field:calendar.rrule,byhour:0"
+msgctxt "field:calendar.rrule,byhour:"
 msgid "By Hour"
 msgstr ""
 
-msgctxt "field:calendar.rrule,byminute:0"
+msgctxt "field:calendar.rrule,byminute:"
 msgid "By Minute"
 msgstr ""
 
-msgctxt "field:calendar.rrule,bymonth:0"
+msgctxt "field:calendar.rrule,bymonth:"
 msgid "By Month"
 msgstr ""
 
-msgctxt "field:calendar.rrule,bymonthday:0"
+msgctxt "field:calendar.rrule,bymonthday:"
 msgid "By Month Day"
 msgstr ""
 
-msgctxt "field:calendar.rrule,bysecond:0"
+msgctxt "field:calendar.rrule,bysecond:"
 msgid "By Second"
 msgstr ""
 
-msgctxt "field:calendar.rrule,bysetpos:0"
+msgctxt "field:calendar.rrule,bysetpos:"
 msgid "By Position"
 msgstr ""
 
-msgctxt "field:calendar.rrule,byweekno:0"
+msgctxt "field:calendar.rrule,byweekno:"
 msgid "By Week Number"
 msgstr ""
 
-msgctxt "field:calendar.rrule,byyearday:0"
+msgctxt "field:calendar.rrule,byyearday:"
 msgid "By Year Day"
 msgstr ""
 
-msgctxt "field:calendar.rrule,count:0"
+msgctxt "field:calendar.rrule,count:"
 msgid "Count"
 msgstr ""
 
-msgctxt "field:calendar.rrule,freq:0"
+msgctxt "field:calendar.rrule,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:calendar.rrule,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:calendar.rrule,freq:"
 msgid "Frequency"
 msgstr ""
 
-msgctxt "field:calendar.rrule,interval:0"
+msgctxt "field:calendar.rrule,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.rrule,interval:"
 msgid "Interval"
 msgstr ""
 
-msgctxt "field:calendar.rrule,rec_name:0"
+msgctxt "field:calendar.rrule,rec_name:"
 msgid "Name"
 msgstr ""
 
-msgctxt "field:calendar.rrule,until:0"
+msgctxt "field:calendar.rrule,until:"
 msgid "Until Date"
 msgstr ""
 
-msgctxt "field:calendar.rrule,until_date:0"
+msgctxt "field:calendar.rrule,until_date:"
 msgid "Is Date"
 msgstr ""
 
-msgctxt "field:calendar.rrule,wkst:0"
+msgctxt "field:calendar.rrule,wkst:"
 msgid "Week Day"
 msgstr ""
 
-msgctxt "field:res.user,calendars:0"
+msgctxt "field:calendar.rrule,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.rrule,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:res.user,calendars:"
 msgid "Calendars"
 msgstr ""
 
-msgctxt "help:calendar.calendar,owner:0"
+msgctxt "help:calendar.calendar,owner:"
 msgid "The user must have an email"
 msgstr ""
 
-msgctxt "help:calendar.date,date:0"
+msgctxt "help:calendar.date,date:"
 msgid "Ignore time of field \"Date\", but handle as date only."
 msgstr ""
 
-msgctxt "help:calendar.event,uuid:0"
+msgctxt "help:calendar.event,uuid:"
 msgid "Universally Unique Identifier"
 msgstr ""
 
-msgctxt "help:calendar.rrule,until_date:0"
+msgctxt "help:calendar.rrule,until_date:"
 msgid "Ignore time of field \"Until Date\", but handle as date only."
 msgstr ""
 
-msgctxt "model:calendar.alarm,name:0"
+msgctxt "model:calendar.alarm,name:"
 msgid "Alarm"
 msgstr ""
 
-msgctxt "model:calendar.attendee,name:0"
+msgctxt "model:calendar.attendee,name:"
 msgid "Attendee"
 msgstr ""
 
-msgctxt "model:calendar.calendar,name:0"
+msgctxt "model:calendar.calendar,name:"
 msgid "Calendar"
 msgstr ""
 
-msgctxt "model:calendar.calendar-read-res.user,name:0"
+msgctxt "model:calendar.calendar-read-res.user,name:"
 msgid "Calendar - read - User"
 msgstr ""
 
-msgctxt "model:calendar.calendar-write-res.user,name:0"
+msgctxt "model:calendar.calendar-write-res.user,name:"
 msgid "Calendar - write - User"
 msgstr ""
 
-msgctxt "model:calendar.category,name:0"
+msgctxt "model:calendar.category,name:"
 msgid "Category"
 msgstr ""
 
-msgctxt "model:calendar.date,name:0"
+msgctxt "model:calendar.date,name:"
 msgid "Calendar Date"
 msgstr ""
 
-msgctxt "model:calendar.event,name:0"
+msgctxt "model:calendar.event,name:"
 msgid "Event"
 msgstr ""
 
-msgctxt "model:calendar.event-calendar.category,name:0"
+msgctxt "model:calendar.event-calendar.category,name:"
 msgid "Event - Category"
 msgstr ""
 
-msgctxt "model:calendar.event.alarm,name:0"
+msgctxt "model:calendar.event.alarm,name:"
 msgid "Alarm"
 msgstr ""
 
-msgctxt "model:calendar.event.attendee,name:0"
+msgctxt "model:calendar.event.attendee,name:"
 msgid "Attendee"
 msgstr ""
 
-msgctxt "model:calendar.event.exdate,name:0"
+msgctxt "model:calendar.event.exdate,name:"
 msgid "Exception Date"
 msgstr ""
 
-msgctxt "model:calendar.event.exrule,name:0"
+msgctxt "model:calendar.event.exrule,name:"
 msgid "Exception Rule"
 msgstr ""
 
-msgctxt "model:calendar.event.rdate,name:0"
+msgctxt "model:calendar.event.rdate,name:"
 msgid "Recurrence Date"
 msgstr ""
 
-msgctxt "model:calendar.event.rrule,name:0"
+msgctxt "model:calendar.event.rrule,name:"
 msgid "Recurrence Rule"
 msgstr ""
 
-msgctxt "model:calendar.location,name:0"
+msgctxt "model:calendar.location,name:"
 msgid "Location"
 msgstr ""
 
-msgctxt "model:calendar.rrule,name:0"
+msgctxt "model:calendar.rrule,name:"
 msgid "Recurrence Rule"
 msgstr ""
 
@@ -546,214 +886,214 @@ msgctxt "model:res.group,name:group_calendar_admin"
 msgid "Calendar Administration"
 msgstr ""
 
-msgctxt "selection:calendar.attendee,status:0"
+msgctxt "selection:calendar.attendee,status:"
 msgid ""
 msgstr ""
 
-msgctxt "selection:calendar.attendee,status:0"
+msgctxt "selection:calendar.attendee,status:"
 msgid "Accepted"
 msgstr ""
 
-msgctxt "selection:calendar.attendee,status:0"
+msgctxt "selection:calendar.attendee,status:"
 msgid "Declined"
 msgstr ""
 
-msgctxt "selection:calendar.attendee,status:0"
+msgctxt "selection:calendar.attendee,status:"
 msgid "Delegated"
 msgstr ""
 
-msgctxt "selection:calendar.attendee,status:0"
+msgctxt "selection:calendar.attendee,status:"
 msgid "Needs Action"
 msgstr ""
 
-msgctxt "selection:calendar.attendee,status:0"
+msgctxt "selection:calendar.attendee,status:"
 msgid "Tentative"
 msgstr ""
 
-msgctxt "selection:calendar.event,classification:0"
+msgctxt "selection:calendar.event,classification:"
 msgid "Confidential"
 msgstr ""
 
-msgctxt "selection:calendar.event,classification:0"
+msgctxt "selection:calendar.event,classification:"
 msgid "Private"
 msgstr ""
 
-msgctxt "selection:calendar.event,classification:0"
+msgctxt "selection:calendar.event,classification:"
 msgid "Public"
 msgstr ""
 
-msgctxt "selection:calendar.event,status:0"
+msgctxt "selection:calendar.event,status:"
 msgid ""
 msgstr ""
 
-msgctxt "selection:calendar.event,status:0"
+msgctxt "selection:calendar.event,status:"
 msgid "Cancelled"
 msgstr ""
 
-msgctxt "selection:calendar.event,status:0"
+msgctxt "selection:calendar.event,status:"
 msgid "Confirmed"
 msgstr ""
 
-msgctxt "selection:calendar.event,status:0"
+msgctxt "selection:calendar.event,status:"
 msgid "Tentative"
 msgstr ""
 
-msgctxt "selection:calendar.event,transp:0"
+msgctxt "selection:calendar.event,transp:"
 msgid "Opaque"
 msgstr ""
 
-msgctxt "selection:calendar.event,transp:0"
+msgctxt "selection:calendar.event,transp:"
 msgid "Transparent"
 msgstr ""
 
-msgctxt "selection:calendar.rrule,freq:0"
+msgctxt "selection:calendar.rrule,freq:"
 msgid "Daily"
 msgstr ""
 
-msgctxt "selection:calendar.rrule,freq:0"
+msgctxt "selection:calendar.rrule,freq:"
 msgid "Hourly"
 msgstr ""
 
-msgctxt "selection:calendar.rrule,freq:0"
+msgctxt "selection:calendar.rrule,freq:"
 msgid "Minutely"
 msgstr ""
 
-msgctxt "selection:calendar.rrule,freq:0"
+msgctxt "selection:calendar.rrule,freq:"
 msgid "Monthly"
 msgstr ""
 
-msgctxt "selection:calendar.rrule,freq:0"
+msgctxt "selection:calendar.rrule,freq:"
 msgid "Secondly"
 msgstr ""
 
-msgctxt "selection:calendar.rrule,freq:0"
+msgctxt "selection:calendar.rrule,freq:"
 msgid "Weekly"
 msgstr ""
 
-msgctxt "selection:calendar.rrule,freq:0"
+msgctxt "selection:calendar.rrule,freq:"
 msgid "Yearly"
 msgstr ""
 
-msgctxt "selection:calendar.rrule,wkst:0"
+msgctxt "selection:calendar.rrule,wkst:"
 msgid "Friday"
 msgstr ""
 
-msgctxt "selection:calendar.rrule,wkst:0"
+msgctxt "selection:calendar.rrule,wkst:"
 msgid "Monday"
 msgstr ""
 
-msgctxt "selection:calendar.rrule,wkst:0"
+msgctxt "selection:calendar.rrule,wkst:"
 msgid "Saturday"
 msgstr ""
 
-msgctxt "selection:calendar.rrule,wkst:0"
+msgctxt "selection:calendar.rrule,wkst:"
 msgid "Sunday"
 msgstr ""
 
-msgctxt "selection:calendar.rrule,wkst:0"
+msgctxt "selection:calendar.rrule,wkst:"
 msgid "Thursday"
 msgstr ""
 
-msgctxt "selection:calendar.rrule,wkst:0"
+msgctxt "selection:calendar.rrule,wkst:"
 msgid "Tuesday"
 msgstr ""
 
-msgctxt "selection:calendar.rrule,wkst:0"
+msgctxt "selection:calendar.rrule,wkst:"
 msgid "Wednesday"
 msgstr ""
 
-msgctxt "view:calendar.calendar:0"
+msgctxt "view:calendar.calendar:"
 msgid "Calendar"
 msgstr ""
 
-msgctxt "view:calendar.calendar:0"
+msgctxt "view:calendar.calendar:"
 msgid "Calendars"
 msgstr ""
 
-msgctxt "view:calendar.calendar:0"
+msgctxt "view:calendar.calendar:"
 msgid "General"
 msgstr ""
 
-msgctxt "view:calendar.calendar:0"
+msgctxt "view:calendar.calendar:"
 msgid "Security"
 msgstr ""
 
-msgctxt "view:calendar.category:0"
+msgctxt "view:calendar.category:"
 msgid "Categories"
 msgstr ""
 
-msgctxt "view:calendar.category:0"
+msgctxt "view:calendar.category:"
 msgid "Category"
 msgstr ""
 
-msgctxt "view:calendar.event.attendee:0"
+msgctxt "view:calendar.event.attendee:"
 msgid "Attendee"
 msgstr ""
 
-msgctxt "view:calendar.event.attendee:0"
+msgctxt "view:calendar.event.attendee:"
 msgid "Attendees"
 msgstr ""
 
-msgctxt "view:calendar.event.exdate:0"
+msgctxt "view:calendar.event.exdate:"
 msgid "Exception Date"
 msgstr ""
 
-msgctxt "view:calendar.event.exdate:0"
+msgctxt "view:calendar.event.exdate:"
 msgid "Exception Dates"
 msgstr ""
 
-msgctxt "view:calendar.event.exrule:0"
+msgctxt "view:calendar.event.exrule:"
 msgid "Exception Rule"
 msgstr ""
 
-msgctxt "view:calendar.event.exrule:0"
+msgctxt "view:calendar.event.exrule:"
 msgid "Exception Rules"
 msgstr ""
 
-msgctxt "view:calendar.event.rdate:0"
+msgctxt "view:calendar.event.rdate:"
 msgid "Recurrence Date"
 msgstr ""
 
-msgctxt "view:calendar.event.rdate:0"
+msgctxt "view:calendar.event.rdate:"
 msgid "Recurrence Dates"
 msgstr ""
 
-msgctxt "view:calendar.event.rrule:0"
+msgctxt "view:calendar.event.rrule:"
 msgid "Recurrence Rule"
 msgstr ""
 
-msgctxt "view:calendar.event.rrule:0"
+msgctxt "view:calendar.event.rrule:"
 msgid "Recurrence Rules"
 msgstr ""
 
-msgctxt "view:calendar.event:0"
+msgctxt "view:calendar.event:"
 msgid "Attendees"
 msgstr ""
 
-msgctxt "view:calendar.event:0"
+msgctxt "view:calendar.event:"
 msgid "Categories"
 msgstr ""
 
-msgctxt "view:calendar.event:0"
+msgctxt "view:calendar.event:"
 msgid "Event"
 msgstr ""
 
-msgctxt "view:calendar.event:0"
+msgctxt "view:calendar.event:"
 msgid "Events"
 msgstr ""
 
-msgctxt "view:calendar.event:0"
+msgctxt "view:calendar.event:"
 msgid "General"
 msgstr ""
 
-msgctxt "view:calendar.event:0"
+msgctxt "view:calendar.event:"
 msgid "Occurences"
 msgstr ""
 
-msgctxt "view:calendar.location:0"
+msgctxt "view:calendar.location:"
 msgid "Location"
 msgstr ""
 
-msgctxt "view:calendar.location:0"
+msgctxt "view:calendar.location:"
 msgid "Locations"
 msgstr ""
diff --git a/locale/de_DE.po b/locale/de_DE.po
index f4c7715..fd10881 100644
--- a/locale/de_DE.po
+++ b/locale/de_DE.po
@@ -2,521 +2,861 @@
 msgid ""
 msgstr "Content-Type: text/plain; charset=utf-8\n"
 
-msgctxt "error:calendar.calendar:0"
+msgctxt "error:calendar.calendar:"
 msgid "A user can have only one calendar!"
 msgstr "Es ist nur ein Kalender pro Benutzer möglich!"
 
-msgctxt "error:calendar.calendar:0"
+msgctxt "error:calendar.calendar:"
 msgid "The name of calendar must be unique!"
 msgstr "Kalendername kann nicht mehrfach vergeben werden!"
 
-msgctxt "error:calendar.category:0"
+msgctxt "error:calendar.category:"
 msgid "The name of calendar category must be unique!"
 msgstr "Name für Kalenderkategorie kann nicht mehrfach vergeben werden!"
 
-msgctxt "error:calendar.event:0"
+msgctxt "error:calendar.event:"
 msgid "Recurrence can not be recurrent!"
 msgstr "Wiederholungen können nicht rekursiv sein!"
 
-msgctxt "error:calendar.event:0"
+msgctxt "error:calendar.event:"
 msgid "UUID and recurrence must be unique in a calendar!"
 msgstr ""
 "UUID und Wiederholung können in einem Kalender nicht mehrfach vergeben "
 "werden!"
 
-msgctxt "error:calendar.location:0"
+msgctxt "error:calendar.location:"
 msgid "The name of calendar location must be unique!"
 msgstr "Name für Kalenderort kann nicht mehrfach vergeben werden!"
 
-msgctxt "error:calendar.rrule:0"
+msgctxt "error:calendar.rrule:"
 msgid "Invalid \"By Day\""
 msgstr "Ungültig \"Für Tag\""
 
-msgctxt "error:calendar.rrule:0"
+msgctxt "error:calendar.rrule:"
 msgid "Invalid \"By Hour\""
 msgstr "Ungültig \"Für Stunde\""
 
-msgctxt "error:calendar.rrule:0"
+msgctxt "error:calendar.rrule:"
 msgid "Invalid \"By Minute\""
 msgstr "Ungültig \"Für Minute\""
 
-msgctxt "error:calendar.rrule:0"
+msgctxt "error:calendar.rrule:"
 msgid "Invalid \"By Month Day\""
 msgstr "Ungültig \"Für Tag des Monats\""
 
-msgctxt "error:calendar.rrule:0"
+msgctxt "error:calendar.rrule:"
 msgid "Invalid \"By Month\""
 msgstr "Ungültig \"Für Monat\""
 
-msgctxt "error:calendar.rrule:0"
+msgctxt "error:calendar.rrule:"
 msgid "Invalid \"By Position\""
 msgstr "Ungültig \"Für Position\""
 
-msgctxt "error:calendar.rrule:0"
+msgctxt "error:calendar.rrule:"
 msgid "Invalid \"By Second\""
 msgstr "Ungültig \"Für Sekunde\""
 
-msgctxt "error:calendar.rrule:0"
+msgctxt "error:calendar.rrule:"
 msgid "Invalid \"By Week Number\""
 msgstr "Ungültig \"Für Woche Nummer\""
 
-msgctxt "error:calendar.rrule:0"
+msgctxt "error:calendar.rrule:"
 msgid "Invalid \"By Year Day\""
 msgstr "Ungültig \"Für Tag des Jahres\""
 
-msgctxt "error:calendar.rrule:0"
+msgctxt "error:calendar.rrule:"
 msgid "Only one of \"until\" and \"count\" can be set!"
 msgstr "Es kann nur entweder \"Bis\" oder \"Anzahl\" gesetzt werden!"
 
-msgctxt "field:calendar.alarm,rec_name:0"
+msgctxt "field:calendar.alarm,create_date:"
+msgid "Create Date"
+msgstr "Erstellungsdatum"
+
+msgctxt "field:calendar.alarm,create_uid:"
+msgid "Create User"
+msgstr "Erstellt durch"
+
+msgctxt "field:calendar.alarm,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.alarm,rec_name:"
 msgid "Name"
 msgstr "Name"
 
-msgctxt "field:calendar.alarm,valarm:0"
+msgctxt "field:calendar.alarm,valarm:"
 msgid "valarm"
 msgstr "valarm"
 
-msgctxt "field:calendar.attendee,attendee:0"
+msgctxt "field:calendar.alarm,write_date:"
+msgid "Write Date"
+msgstr "Zuletzt geändert"
+
+msgctxt "field:calendar.alarm,write_uid:"
+msgid "Write User"
+msgstr "Letzte Änderung durch"
+
+msgctxt "field:calendar.attendee,attendee:"
 msgid "attendee"
 msgstr "Teilnehmer"
 
-msgctxt "field:calendar.attendee,email:0"
+msgctxt "field:calendar.attendee,create_date:"
+msgid "Create Date"
+msgstr "Erstellungsdatum"
+
+msgctxt "field:calendar.attendee,create_uid:"
+msgid "Create User"
+msgstr "Erstellt durch"
+
+msgctxt "field:calendar.attendee,email:"
 msgid "Email"
 msgstr "E-Mail"
 
-msgctxt "field:calendar.attendee,rec_name:0"
+msgctxt "field:calendar.attendee,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.attendee,rec_name:"
 msgid "Name"
 msgstr "Name"
 
-msgctxt "field:calendar.attendee,status:0"
+msgctxt "field:calendar.attendee,status:"
 msgid "Participation Status"
 msgstr "Teilnahmestatus"
 
-msgctxt "field:calendar.calendar,description:0"
+msgctxt "field:calendar.attendee,write_date:"
+msgid "Write Date"
+msgstr "Zuletzt geändert"
+
+msgctxt "field:calendar.attendee,write_uid:"
+msgid "Write User"
+msgstr "Letzte Änderung durch"
+
+msgctxt "field:calendar.calendar,create_date:"
+msgid "Create Date"
+msgstr "Erstellungsdatum"
+
+msgctxt "field:calendar.calendar,create_uid:"
+msgid "Create User"
+msgstr "Erstellt durch"
+
+msgctxt "field:calendar.calendar,description:"
 msgid "Description"
 msgstr "Bezeichnung"
 
-msgctxt "field:calendar.calendar,name:0"
+msgctxt "field:calendar.calendar,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.calendar,name:"
 msgid "Name"
 msgstr "Name"
 
-msgctxt "field:calendar.calendar,owner:0"
+msgctxt "field:calendar.calendar,owner:"
 msgid "Owner"
 msgstr "Besitzer"
 
-msgctxt "field:calendar.calendar,read_users:0"
+msgctxt "field:calendar.calendar,read_users:"
 msgid "Read Users"
 msgstr "Benutzer mit Leseberechtigung"
 
-msgctxt "field:calendar.calendar,rec_name:0"
+msgctxt "field:calendar.calendar,rec_name:"
 msgid "Name"
 msgstr "Name"
 
-msgctxt "field:calendar.calendar,write_users:0"
+msgctxt "field:calendar.calendar,write_date:"
+msgid "Write Date"
+msgstr "Zuletzt geändert"
+
+msgctxt "field:calendar.calendar,write_uid:"
+msgid "Write User"
+msgstr "Letzte Änderung durch"
+
+msgctxt "field:calendar.calendar,write_users:"
 msgid "Write Users"
 msgstr "Benutzer mit Schreibberechtigung"
 
-msgctxt "field:calendar.calendar-read-res.user,calendar:0"
+msgctxt "field:calendar.calendar-read-res.user,calendar:"
 msgid "Calendar"
 msgstr "Kalender"
 
-msgctxt "field:calendar.calendar-read-res.user,rec_name:0"
+msgctxt "field:calendar.calendar-read-res.user,create_date:"
+msgid "Create Date"
+msgstr "Erstellungsdatum"
+
+msgctxt "field:calendar.calendar-read-res.user,create_uid:"
+msgid "Create User"
+msgstr "Erstellt durch"
+
+msgctxt "field:calendar.calendar-read-res.user,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.calendar-read-res.user,rec_name:"
 msgid "Name"
 msgstr "Name"
 
-msgctxt "field:calendar.calendar-read-res.user,user:0"
+msgctxt "field:calendar.calendar-read-res.user,user:"
 msgid "User"
 msgstr "Benutzer"
 
-msgctxt "field:calendar.calendar-write-res.user,calendar:0"
+msgctxt "field:calendar.calendar-read-res.user,write_date:"
+msgid "Write Date"
+msgstr "Zuletzt geändert"
+
+msgctxt "field:calendar.calendar-read-res.user,write_uid:"
+msgid "Write User"
+msgstr "Letzte Änderung durch"
+
+msgctxt "field:calendar.calendar-write-res.user,calendar:"
 msgid "Calendar"
 msgstr "Kalender"
 
-msgctxt "field:calendar.calendar-write-res.user,rec_name:0"
+msgctxt "field:calendar.calendar-write-res.user,create_date:"
+msgid "Create Date"
+msgstr "Erstellungsdatum"
+
+msgctxt "field:calendar.calendar-write-res.user,create_uid:"
+msgid "Create User"
+msgstr "Erstellt durch"
+
+msgctxt "field:calendar.calendar-write-res.user,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.calendar-write-res.user,rec_name:"
 msgid "Name"
 msgstr "Name"
 
-msgctxt "field:calendar.calendar-write-res.user,user:0"
+msgctxt "field:calendar.calendar-write-res.user,user:"
 msgid "User"
 msgstr "Benutzer"
 
-msgctxt "field:calendar.category,name:0"
+msgctxt "field:calendar.calendar-write-res.user,write_date:"
+msgid "Write Date"
+msgstr "Zuletzt geändert"
+
+msgctxt "field:calendar.calendar-write-res.user,write_uid:"
+msgid "Write User"
+msgstr "Letzte Änderung durch"
+
+msgctxt "field:calendar.category,create_date:"
+msgid "Create Date"
+msgstr "Erstellungsdatum"
+
+msgctxt "field:calendar.category,create_uid:"
+msgid "Create User"
+msgstr "Erstellt durch"
+
+msgctxt "field:calendar.category,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.category,name:"
 msgid "Name"
 msgstr "Name"
 
-msgctxt "field:calendar.category,rec_name:0"
+msgctxt "field:calendar.category,rec_name:"
 msgid "Name"
 msgstr "Name"
 
-msgctxt "field:calendar.date,date:0"
+msgctxt "field:calendar.category,write_date:"
+msgid "Write Date"
+msgstr "Zuletzt geändert"
+
+msgctxt "field:calendar.category,write_uid:"
+msgid "Write User"
+msgstr "Letzte Änderung durch"
+
+msgctxt "field:calendar.date,create_date:"
+msgid "Create Date"
+msgstr "Erstellungsdatum"
+
+msgctxt "field:calendar.date,create_uid:"
+msgid "Create User"
+msgstr "Erstellt durch"
+
+msgctxt "field:calendar.date,date:"
 msgid "Is Date"
 msgstr "Als Datum"
 
-msgctxt "field:calendar.date,datetime:0"
+msgctxt "field:calendar.date,datetime:"
 msgid "Date"
 msgstr "Zeitpunkt"
 
-msgctxt "field:calendar.date,rec_name:0"
+msgctxt "field:calendar.date,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.date,rec_name:"
 msgid "Name"
 msgstr "Name"
 
-msgctxt "field:calendar.event,alarms:0"
+msgctxt "field:calendar.date,write_date:"
+msgid "Write Date"
+msgstr "Zuletzt geändert"
+
+msgctxt "field:calendar.date,write_uid:"
+msgid "Write User"
+msgstr "Letzte Änderung durch"
+
+msgctxt "field:calendar.event,alarms:"
 msgid "Alarms"
 msgstr "Alarm"
 
-msgctxt "field:calendar.event,all_day:0"
+msgctxt "field:calendar.event,all_day:"
 msgid "All Day"
 msgstr "Ganztägig"
 
-msgctxt "field:calendar.event,attendees:0"
+msgctxt "field:calendar.event,attendees:"
 msgid "Attendees"
 msgstr "Teilnehmer"
 
-msgctxt "field:calendar.event,calendar:0"
+msgctxt "field:calendar.event,calendar:"
 msgid "Calendar"
 msgstr "Kalender"
 
-msgctxt "field:calendar.event,calendar_owner:0"
+msgctxt "field:calendar.event,calendar_owner:"
 msgid "Owner"
 msgstr "Besitzer"
 
-msgctxt "field:calendar.event,calendar_read_users:0"
+msgctxt "field:calendar.event,calendar_read_users:"
 msgid "Read Users"
 msgstr "Benutzer mit Leseberechtigung"
 
-msgctxt "field:calendar.event,calendar_write_users:0"
+msgctxt "field:calendar.event,calendar_write_users:"
 msgid "Write Users"
 msgstr "Benutzer mit Schreibberechtigung"
 
-msgctxt "field:calendar.event,categories:0"
+msgctxt "field:calendar.event,categories:"
 msgid "Categories"
 msgstr "Kategorien"
 
-msgctxt "field:calendar.event,classification:0"
+msgctxt "field:calendar.event,classification:"
 msgid "Classification"
 msgstr "Klassifizierung"
 
-msgctxt "field:calendar.event,description:0"
+msgctxt "field:calendar.event,create_date:"
+msgid "Create Date"
+msgstr "Erstellungsdatum"
+
+msgctxt "field:calendar.event,create_uid:"
+msgid "Create User"
+msgstr "Erstellt durch"
+
+msgctxt "field:calendar.event,description:"
 msgid "Description"
 msgstr "Bezeichnung"
 
-msgctxt "field:calendar.event,dtend:0"
+msgctxt "field:calendar.event,dtend:"
 msgid "End Date"
 msgstr "Enddatum"
 
-msgctxt "field:calendar.event,dtstart:0"
+msgctxt "field:calendar.event,dtstart:"
 msgid "Start Date"
 msgstr "Anfangsdatum"
 
-msgctxt "field:calendar.event,exdates:0"
+msgctxt "field:calendar.event,exdates:"
 msgid "Exception Dates"
 msgstr "Ausnahmedaten"
 
-msgctxt "field:calendar.event,exrules:0"
+msgctxt "field:calendar.event,exrules:"
 msgid "Exception Rules"
 msgstr "Ausnahmeregeln"
 
-msgctxt "field:calendar.event,location:0"
+msgctxt "field:calendar.event,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.event,location:"
 msgid "Location"
 msgstr "Ort"
 
-msgctxt "field:calendar.event,occurences:0"
+msgctxt "field:calendar.event,occurences:"
 msgid "Occurences"
 msgstr "Ereignisse"
 
-msgctxt "field:calendar.event,organizer:0"
+msgctxt "field:calendar.event,organizer:"
 msgid "Organizer"
 msgstr "Organisator"
 
-msgctxt "field:calendar.event,parent:0"
+msgctxt "field:calendar.event,parent:"
 msgid "Parent"
 msgstr "Übergeordnet (Termin)"
 
-msgctxt "field:calendar.event,rdates:0"
+msgctxt "field:calendar.event,rdates:"
 msgid "Recurrence Dates"
 msgstr "Wiederholungsdaten"
 
-msgctxt "field:calendar.event,rec_name:0"
+msgctxt "field:calendar.event,rec_name:"
 msgid "Name"
 msgstr "Name"
 
-msgctxt "field:calendar.event,recurrence:0"
+msgctxt "field:calendar.event,recurrence:"
 msgid "Recurrence"
 msgstr "Wiederholung"
 
-msgctxt "field:calendar.event,rrules:0"
+msgctxt "field:calendar.event,rrules:"
 msgid "Recurrence Rules"
 msgstr "Wiederholungsregeln"
 
-msgctxt "field:calendar.event,sequence:0"
+msgctxt "field:calendar.event,sequence:"
 msgid "Sequence"
 msgstr "Revision"
 
-msgctxt "field:calendar.event,status:0"
+msgctxt "field:calendar.event,status:"
 msgid "Status"
 msgstr "Status"
 
-msgctxt "field:calendar.event,summary:0"
+msgctxt "field:calendar.event,summary:"
 msgid "Summary"
 msgstr "Zusammenfassung"
 
-msgctxt "field:calendar.event,timezone:0"
+msgctxt "field:calendar.event,timezone:"
 msgid "Timezone"
 msgstr "Zeitzone"
 
-msgctxt "field:calendar.event,transp:0"
+msgctxt "field:calendar.event,transp:"
 msgid "Time Transparency"
 msgstr "Zeittransparenz"
 
-msgctxt "field:calendar.event,uuid:0"
+msgctxt "field:calendar.event,uuid:"
 msgid "UUID"
 msgstr "UUID"
 
-msgctxt "field:calendar.event,vevent:0"
+msgctxt "field:calendar.event,vevent:"
 msgid "vevent"
 msgstr "vevent"
 
-msgctxt "field:calendar.event-calendar.category,category:0"
+msgctxt "field:calendar.event,write_date:"
+msgid "Write Date"
+msgstr "Zuletzt geändert"
+
+msgctxt "field:calendar.event,write_uid:"
+msgid "Write User"
+msgstr "Letzte Änderung durch"
+
+msgctxt "field:calendar.event-calendar.category,category:"
 msgid "Category"
 msgstr "Kategorie"
 
-msgctxt "field:calendar.event-calendar.category,event:0"
+msgctxt "field:calendar.event-calendar.category,create_date:"
+msgid "Create Date"
+msgstr "Erstellungsdatum"
+
+msgctxt "field:calendar.event-calendar.category,create_uid:"
+msgid "Create User"
+msgstr "Erstellt durch"
+
+msgctxt "field:calendar.event-calendar.category,event:"
 msgid "Event"
 msgstr "Termin"
 
-msgctxt "field:calendar.event-calendar.category,rec_name:0"
+msgctxt "field:calendar.event-calendar.category,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.event-calendar.category,rec_name:"
 msgid "Name"
 msgstr "Name"
 
-msgctxt "field:calendar.event.alarm,calendar_alarm:0"
+msgctxt "field:calendar.event-calendar.category,write_date:"
+msgid "Write Date"
+msgstr "Zuletzt geändert"
+
+msgctxt "field:calendar.event-calendar.category,write_uid:"
+msgid "Write User"
+msgstr "Letzte Änderung durch"
+
+msgctxt "field:calendar.event.alarm,calendar_alarm:"
 msgid "Calendar Alarm"
 msgstr "Kalender Alarm"
 
-msgctxt "field:calendar.event.alarm,event:0"
+msgctxt "field:calendar.event.alarm,create_date:"
+msgid "Create Date"
+msgstr "Erstellungsdatum"
+
+msgctxt "field:calendar.event.alarm,create_uid:"
+msgid "Create User"
+msgstr "Erstellt durch"
+
+msgctxt "field:calendar.event.alarm,event:"
 msgid "Event"
 msgstr "Termin"
 
-msgctxt "field:calendar.event.alarm,rec_name:0"
+msgctxt "field:calendar.event.alarm,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.event.alarm,rec_name:"
 msgid "Name"
 msgstr "Name"
 
-msgctxt "field:calendar.event.attendee,calendar_attendee:0"
+msgctxt "field:calendar.event.alarm,write_date:"
+msgid "Write Date"
+msgstr "Zuletzt geändert"
+
+msgctxt "field:calendar.event.alarm,write_uid:"
+msgid "Write User"
+msgstr "Letzte Änderung durch"
+
+msgctxt "field:calendar.event.attendee,calendar_attendee:"
 msgid "Calendar Attendee"
 msgstr "Kalender Teilnehmer"
 
-msgctxt "field:calendar.event.attendee,event:0"
+msgctxt "field:calendar.event.attendee,create_date:"
+msgid "Create Date"
+msgstr "Erstellungsdatum"
+
+msgctxt "field:calendar.event.attendee,create_uid:"
+msgid "Create User"
+msgstr "Erstellt durch"
+
+msgctxt "field:calendar.event.attendee,event:"
 msgid "Event"
 msgstr "Termin"
 
-msgctxt "field:calendar.event.attendee,rec_name:0"
+msgctxt "field:calendar.event.attendee,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.event.attendee,rec_name:"
 msgid "Name"
 msgstr "Name"
 
-msgctxt "field:calendar.event.exdate,calendar_date:0"
+msgctxt "field:calendar.event.attendee,write_date:"
+msgid "Write Date"
+msgstr "Zuletzt geändert"
+
+msgctxt "field:calendar.event.attendee,write_uid:"
+msgid "Write User"
+msgstr "Letzte Änderung durch"
+
+msgctxt "field:calendar.event.exdate,calendar_date:"
 msgid "Calendar Date"
 msgstr "Kalender Datum"
 
-msgctxt "field:calendar.event.exdate,event:0"
+msgctxt "field:calendar.event.exdate,create_date:"
+msgid "Create Date"
+msgstr "Erstellungsdatum"
+
+msgctxt "field:calendar.event.exdate,create_uid:"
+msgid "Create User"
+msgstr "Erstellt durch"
+
+msgctxt "field:calendar.event.exdate,event:"
 msgid "Event"
 msgstr "Termin"
 
-msgctxt "field:calendar.event.exdate,rec_name:0"
+msgctxt "field:calendar.event.exdate,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.event.exdate,rec_name:"
 msgid "Name"
 msgstr "Name"
 
-msgctxt "field:calendar.event.exrule,calendar_rrule:0"
+msgctxt "field:calendar.event.exdate,write_date:"
+msgid "Write Date"
+msgstr "Zuletzt geändert"
+
+msgctxt "field:calendar.event.exdate,write_uid:"
+msgid "Write User"
+msgstr "Letzte Änderung durch"
+
+msgctxt "field:calendar.event.exrule,calendar_rrule:"
 msgid "Calendar RRule"
 msgstr "Kalender WRegel"
 
-msgctxt "field:calendar.event.exrule,event:0"
+msgctxt "field:calendar.event.exrule,create_date:"
+msgid "Create Date"
+msgstr "Erstellungsdatum"
+
+msgctxt "field:calendar.event.exrule,create_uid:"
+msgid "Create User"
+msgstr "Erstellt durch"
+
+msgctxt "field:calendar.event.exrule,event:"
 msgid "Event"
 msgstr "Termin"
 
-msgctxt "field:calendar.event.exrule,rec_name:0"
+msgctxt "field:calendar.event.exrule,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.event.exrule,rec_name:"
 msgid "Name"
 msgstr "Name"
 
-msgctxt "field:calendar.event.rdate,calendar_date:0"
+msgctxt "field:calendar.event.exrule,write_date:"
+msgid "Write Date"
+msgstr "Zuletzt geändert"
+
+msgctxt "field:calendar.event.exrule,write_uid:"
+msgid "Write User"
+msgstr "Letzte Änderung durch"
+
+msgctxt "field:calendar.event.rdate,calendar_date:"
 msgid "Calendar Date"
 msgstr "Kalender Datum"
 
-msgctxt "field:calendar.event.rdate,event:0"
+msgctxt "field:calendar.event.rdate,create_date:"
+msgid "Create Date"
+msgstr "Erstellungsdatum"
+
+msgctxt "field:calendar.event.rdate,create_uid:"
+msgid "Create User"
+msgstr "Erstellt durch"
+
+msgctxt "field:calendar.event.rdate,event:"
 msgid "Event"
 msgstr "Termin"
 
-msgctxt "field:calendar.event.rdate,rec_name:0"
+msgctxt "field:calendar.event.rdate,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.event.rdate,rec_name:"
 msgid "Name"
 msgstr "Name"
 
-msgctxt "field:calendar.event.rrule,calendar_rrule:0"
+msgctxt "field:calendar.event.rdate,write_date:"
+msgid "Write Date"
+msgstr "Zuletzt geändert"
+
+msgctxt "field:calendar.event.rdate,write_uid:"
+msgid "Write User"
+msgstr "Letzte Änderung durch"
+
+msgctxt "field:calendar.event.rrule,calendar_rrule:"
 msgid "Calendar RRule"
 msgstr "Kalender WRegel"
 
-msgctxt "field:calendar.event.rrule,event:0"
+msgctxt "field:calendar.event.rrule,create_date:"
+msgid "Create Date"
+msgstr "Erstellungsdatum"
+
+msgctxt "field:calendar.event.rrule,create_uid:"
+msgid "Create User"
+msgstr "Erstellt durch"
+
+msgctxt "field:calendar.event.rrule,event:"
 msgid "Event"
 msgstr "Termin"
 
-msgctxt "field:calendar.event.rrule,rec_name:0"
+msgctxt "field:calendar.event.rrule,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.event.rrule,rec_name:"
 msgid "Name"
 msgstr "Name"
 
-msgctxt "field:calendar.location,name:0"
+msgctxt "field:calendar.event.rrule,write_date:"
+msgid "Write Date"
+msgstr "Zuletzt geändert"
+
+msgctxt "field:calendar.event.rrule,write_uid:"
+msgid "Write User"
+msgstr "Letzte Änderung durch"
+
+msgctxt "field:calendar.location,create_date:"
+msgid "Create Date"
+msgstr "Erstellungsdatum"
+
+msgctxt "field:calendar.location,create_uid:"
+msgid "Create User"
+msgstr "Erstellt durch"
+
+msgctxt "field:calendar.location,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.location,name:"
 msgid "Name"
 msgstr "Name"
 
-msgctxt "field:calendar.location,rec_name:0"
+msgctxt "field:calendar.location,rec_name:"
 msgid "Name"
 msgstr "Name"
 
-msgctxt "field:calendar.rrule,byday:0"
+msgctxt "field:calendar.location,write_date:"
+msgid "Write Date"
+msgstr "Zuletzt geändert"
+
+msgctxt "field:calendar.location,write_uid:"
+msgid "Write User"
+msgstr "Letzte Änderung durch"
+
+msgctxt "field:calendar.rrule,byday:"
 msgid "By Day"
 msgstr "Für Tag"
 
-msgctxt "field:calendar.rrule,byhour:0"
+msgctxt "field:calendar.rrule,byhour:"
 msgid "By Hour"
 msgstr "Für Stunde"
 
-msgctxt "field:calendar.rrule,byminute:0"
+msgctxt "field:calendar.rrule,byminute:"
 msgid "By Minute"
 msgstr "Für Minute"
 
-msgctxt "field:calendar.rrule,bymonth:0"
+msgctxt "field:calendar.rrule,bymonth:"
 msgid "By Month"
 msgstr "Für Monat"
 
-msgctxt "field:calendar.rrule,bymonthday:0"
+msgctxt "field:calendar.rrule,bymonthday:"
 msgid "By Month Day"
 msgstr "Für Tag des Monats"
 
-msgctxt "field:calendar.rrule,bysecond:0"
+msgctxt "field:calendar.rrule,bysecond:"
 msgid "By Second"
 msgstr "Für Sekunde"
 
-msgctxt "field:calendar.rrule,bysetpos:0"
+msgctxt "field:calendar.rrule,bysetpos:"
 msgid "By Position"
 msgstr "Für Position"
 
-msgctxt "field:calendar.rrule,byweekno:0"
+msgctxt "field:calendar.rrule,byweekno:"
 msgid "By Week Number"
 msgstr "Für Woche Nummer"
 
-msgctxt "field:calendar.rrule,byyearday:0"
+msgctxt "field:calendar.rrule,byyearday:"
 msgid "By Year Day"
 msgstr "Für Tag des Jahres"
 
-msgctxt "field:calendar.rrule,count:0"
+msgctxt "field:calendar.rrule,count:"
 msgid "Count"
 msgstr "Anzahl"
 
-msgctxt "field:calendar.rrule,freq:0"
+msgctxt "field:calendar.rrule,create_date:"
+msgid "Create Date"
+msgstr "Erstellungsdatum"
+
+msgctxt "field:calendar.rrule,create_uid:"
+msgid "Create User"
+msgstr "Erstellt durch"
+
+msgctxt "field:calendar.rrule,freq:"
 msgid "Frequency"
 msgstr "Häufigkeit"
 
-msgctxt "field:calendar.rrule,interval:0"
+msgctxt "field:calendar.rrule,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.rrule,interval:"
 msgid "Interval"
 msgstr "Intervall"
 
-msgctxt "field:calendar.rrule,rec_name:0"
+msgctxt "field:calendar.rrule,rec_name:"
 msgid "Name"
 msgstr "Name"
 
-msgctxt "field:calendar.rrule,until:0"
+msgctxt "field:calendar.rrule,until:"
 msgid "Until Date"
 msgstr "Bis Zeitpunkt"
 
-msgctxt "field:calendar.rrule,until_date:0"
+msgctxt "field:calendar.rrule,until_date:"
 msgid "Is Date"
 msgstr "Als Datum"
 
-msgctxt "field:calendar.rrule,wkst:0"
+msgctxt "field:calendar.rrule,wkst:"
 msgid "Week Day"
 msgstr "Wochentag"
 
-msgctxt "field:res.user,calendars:0"
+msgctxt "field:calendar.rrule,write_date:"
+msgid "Write Date"
+msgstr "Zuletzt geändert"
+
+msgctxt "field:calendar.rrule,write_uid:"
+msgid "Write User"
+msgstr "Letzte Änderung durch"
+
+msgctxt "field:res.user,calendars:"
 msgid "Calendars"
 msgstr "Kalender"
 
-msgctxt "help:calendar.calendar,owner:0"
+msgctxt "help:calendar.calendar,owner:"
 msgid "The user must have an email"
 msgstr "Dem Benutzer muss eine E-Mail-Adresse zugeordnet sein!"
 
-msgctxt "help:calendar.date,date:0"
+msgctxt "help:calendar.date,date:"
 msgid "Ignore time of field \"Date\", but handle as date only."
 msgstr "Verwende von Feld \"Zeitpunkt\" nur das Datum ohne den Zeitanteil."
 
-msgctxt "help:calendar.event,uuid:0"
+msgctxt "help:calendar.event,uuid:"
 msgid "Universally Unique Identifier"
 msgstr "Universally Unique Identifier"
 
-msgctxt "help:calendar.rrule,until_date:0"
+msgctxt "help:calendar.rrule,until_date:"
 msgid "Ignore time of field \"Until Date\", but handle as date only."
 msgstr "Verwende von Feld \"Bis Zeitpunkt\" nur das Datum ohne den Zeitanteil."
 
-msgctxt "model:calendar.alarm,name:0"
+msgctxt "model:calendar.alarm,name:"
 msgid "Alarm"
 msgstr "Alarm"
 
-msgctxt "model:calendar.attendee,name:0"
+msgctxt "model:calendar.attendee,name:"
 msgid "Attendee"
 msgstr "Teilnehmer"
 
-msgctxt "model:calendar.calendar,name:0"
+msgctxt "model:calendar.calendar,name:"
 msgid "Calendar"
 msgstr "Kalender"
 
-msgctxt "model:calendar.calendar-read-res.user,name:0"
+msgctxt "model:calendar.calendar-read-res.user,name:"
 msgid "Calendar - read - User"
 msgstr "Kalender - Schreiben - Benutzer"
 
-msgctxt "model:calendar.calendar-write-res.user,name:0"
+msgctxt "model:calendar.calendar-write-res.user,name:"
 msgid "Calendar - write - User"
 msgstr "Kalender - Lesen - Benutzer"
 
-msgctxt "model:calendar.category,name:0"
+msgctxt "model:calendar.category,name:"
 msgid "Category"
 msgstr "Kategorie"
 
-msgctxt "model:calendar.date,name:0"
+msgctxt "model:calendar.date,name:"
 msgid "Calendar Date"
 msgstr "Kalender Datum"
 
-msgctxt "model:calendar.event,name:0"
+msgctxt "model:calendar.event,name:"
 msgid "Event"
 msgstr "Termin"
 
-msgctxt "model:calendar.event-calendar.category,name:0"
+msgctxt "model:calendar.event-calendar.category,name:"
 msgid "Event - Category"
 msgstr "Termin - Kategorie"
 
-msgctxt "model:calendar.event.alarm,name:0"
+msgctxt "model:calendar.event.alarm,name:"
 msgid "Alarm"
 msgstr "Alarm"
 
-msgctxt "model:calendar.event.attendee,name:0"
+msgctxt "model:calendar.event.attendee,name:"
 msgid "Attendee"
 msgstr "Teilnehmer"
 
-msgctxt "model:calendar.event.exdate,name:0"
+msgctxt "model:calendar.event.exdate,name:"
 msgid "Exception Date"
 msgstr "Ausnahmedatum"
 
-msgctxt "model:calendar.event.exrule,name:0"
+msgctxt "model:calendar.event.exrule,name:"
 msgid "Exception Rule"
 msgstr "Ausnahmeregel"
 
-msgctxt "model:calendar.event.rdate,name:0"
+msgctxt "model:calendar.event.rdate,name:"
 msgid "Recurrence Date"
 msgstr "Wiederholungsdatum"
 
-msgctxt "model:calendar.event.rrule,name:0"
+msgctxt "model:calendar.event.rrule,name:"
 msgid "Recurrence Rule"
 msgstr "Wiederholungsregel"
 
-msgctxt "model:calendar.location,name:0"
+msgctxt "model:calendar.location,name:"
 msgid "Location"
 msgstr "Ort"
 
-msgctxt "model:calendar.rrule,name:0"
+msgctxt "model:calendar.rrule,name:"
 msgid "Recurrence Rule"
 msgstr "Wiederholungsregel"
 
@@ -548,218 +888,218 @@ msgctxt "model:res.group,name:group_calendar_admin"
 msgid "Calendar Administration"
 msgstr "Kalender Administration"
 
-msgctxt "selection:calendar.attendee,status:0"
+msgctxt "selection:calendar.attendee,status:"
 msgid ""
 msgstr ""
 
-msgctxt "selection:calendar.attendee,status:0"
+msgctxt "selection:calendar.attendee,status:"
 msgid "Accepted"
 msgstr "Angenommen"
 
-msgctxt "selection:calendar.attendee,status:0"
+msgctxt "selection:calendar.attendee,status:"
 msgid "Declined"
 msgstr "Abgelehnt"
 
-msgctxt "selection:calendar.attendee,status:0"
+msgctxt "selection:calendar.attendee,status:"
 msgid "Delegated"
 msgstr "Delegiert"
 
-msgctxt "selection:calendar.attendee,status:0"
+msgctxt "selection:calendar.attendee,status:"
 msgid "Needs Action"
 msgstr "Aktion erforderlich"
 
-msgctxt "selection:calendar.attendee,status:0"
+msgctxt "selection:calendar.attendee,status:"
 msgid "Tentative"
 msgstr "Unter Vorbehalt"
 
-msgctxt "selection:calendar.event,classification:0"
+msgctxt "selection:calendar.event,classification:"
 msgid "Confidential"
 msgstr "Vertraulich"
 
-msgctxt "selection:calendar.event,classification:0"
+msgctxt "selection:calendar.event,classification:"
 msgid "Private"
 msgstr "Privat"
 
-msgctxt "selection:calendar.event,classification:0"
+msgctxt "selection:calendar.event,classification:"
 msgid "Public"
 msgstr "Öffentlich"
 
-msgctxt "selection:calendar.event,status:0"
+msgctxt "selection:calendar.event,status:"
 msgid ""
 msgstr ""
 
-msgctxt "selection:calendar.event,status:0"
+msgctxt "selection:calendar.event,status:"
 msgid "Cancelled"
 msgstr "Abgesagt"
 
-msgctxt "selection:calendar.event,status:0"
+msgctxt "selection:calendar.event,status:"
 msgid "Confirmed"
 msgstr "Bestätigt"
 
-msgctxt "selection:calendar.event,status:0"
+msgctxt "selection:calendar.event,status:"
 msgid "Tentative"
 msgstr "Unter Vorbehalt"
 
-msgctxt "selection:calendar.event,transp:0"
+msgctxt "selection:calendar.event,transp:"
 msgid "Opaque"
 msgstr "Opak"
 
-msgctxt "selection:calendar.event,transp:0"
+msgctxt "selection:calendar.event,transp:"
 msgid "Transparent"
 msgstr "Transparent"
 
-msgctxt "selection:calendar.rrule,freq:0"
+msgctxt "selection:calendar.rrule,freq:"
 msgid "Daily"
 msgstr "Täglich"
 
-msgctxt "selection:calendar.rrule,freq:0"
+msgctxt "selection:calendar.rrule,freq:"
 msgid "Hourly"
 msgstr "Stündlich"
 
-msgctxt "selection:calendar.rrule,freq:0"
+msgctxt "selection:calendar.rrule,freq:"
 msgid "Minutely"
 msgstr "Minütlich"
 
-msgctxt "selection:calendar.rrule,freq:0"
+msgctxt "selection:calendar.rrule,freq:"
 msgid "Monthly"
 msgstr "Monatlich"
 
-msgctxt "selection:calendar.rrule,freq:0"
+msgctxt "selection:calendar.rrule,freq:"
 msgid "Secondly"
 msgstr "Sekündlich"
 
-msgctxt "selection:calendar.rrule,freq:0"
+msgctxt "selection:calendar.rrule,freq:"
 msgid "Weekly"
 msgstr "Wöchentlich"
 
-msgctxt "selection:calendar.rrule,freq:0"
+msgctxt "selection:calendar.rrule,freq:"
 msgid "Yearly"
 msgstr "Jährlich"
 
-msgctxt "selection:calendar.rrule,wkst:0"
+msgctxt "selection:calendar.rrule,wkst:"
 msgid "Friday"
 msgstr "Freitag"
 
-msgctxt "selection:calendar.rrule,wkst:0"
+msgctxt "selection:calendar.rrule,wkst:"
 msgid "Monday"
 msgstr "Montag"
 
-msgctxt "selection:calendar.rrule,wkst:0"
+msgctxt "selection:calendar.rrule,wkst:"
 msgid "Saturday"
 msgstr "Samstag"
 
-msgctxt "selection:calendar.rrule,wkst:0"
+msgctxt "selection:calendar.rrule,wkst:"
 msgid "Sunday"
 msgstr "Sonntag"
 
-msgctxt "selection:calendar.rrule,wkst:0"
+msgctxt "selection:calendar.rrule,wkst:"
 msgid "Thursday"
 msgstr "Donnerstag"
 
-msgctxt "selection:calendar.rrule,wkst:0"
+msgctxt "selection:calendar.rrule,wkst:"
 msgid "Tuesday"
 msgstr "Dienstag"
 
-msgctxt "selection:calendar.rrule,wkst:0"
+msgctxt "selection:calendar.rrule,wkst:"
 msgid "Wednesday"
 msgstr "Mittwoch"
 
-msgctxt "view:calendar.calendar:0"
+msgctxt "view:calendar.calendar:"
 msgid "Calendar"
 msgstr "Kalender"
 
-msgctxt "view:calendar.calendar:0"
+msgctxt "view:calendar.calendar:"
 msgid "Calendars"
 msgstr "Kalender"
 
-msgctxt "view:calendar.calendar:0"
+msgctxt "view:calendar.calendar:"
 msgid "General"
 msgstr "Allgemein"
 
-msgctxt "view:calendar.calendar:0"
+msgctxt "view:calendar.calendar:"
 msgid "Security"
 msgstr "Sicherheit"
 
-msgctxt "view:calendar.category:0"
+msgctxt "view:calendar.category:"
 msgid "Categories"
 msgstr "Kategorien"
 
-msgctxt "view:calendar.category:0"
+msgctxt "view:calendar.category:"
 msgid "Category"
 msgstr "Kategorie"
 
-msgctxt "view:calendar.event.attendee:0"
+msgctxt "view:calendar.event.attendee:"
 msgid "Attendee"
 msgstr "Teilnehmer"
 
-msgctxt "view:calendar.event.attendee:0"
+msgctxt "view:calendar.event.attendee:"
 msgid "Attendees"
 msgstr "Teilnehmer"
 
-msgctxt "view:calendar.event.exdate:0"
+msgctxt "view:calendar.event.exdate:"
 msgid "Exception Date"
 msgstr "Ausnahmedatum"
 
-msgctxt "view:calendar.event.exdate:0"
+msgctxt "view:calendar.event.exdate:"
 msgid "Exception Dates"
 msgstr "Ausnahmedaten"
 
-msgctxt "view:calendar.event.exrule:0"
+msgctxt "view:calendar.event.exrule:"
 msgid "Exception Rule"
 msgstr "Ausnahmeregel"
 
-msgctxt "view:calendar.event.exrule:0"
+msgctxt "view:calendar.event.exrule:"
 msgid "Exception Rules"
 msgstr "Ausnahmeregeln"
 
-msgctxt "view:calendar.event.rdate:0"
+msgctxt "view:calendar.event.rdate:"
 msgid "Recurrence Date"
 msgstr "Wiederholungsdatum"
 
-msgctxt "view:calendar.event.rdate:0"
+msgctxt "view:calendar.event.rdate:"
 msgid "Recurrence Dates"
 msgstr "Wiederholungsdaten"
 
-msgctxt "view:calendar.event.rrule:0"
+msgctxt "view:calendar.event.rrule:"
 msgid "Recurrence Rule"
 msgstr "Wiederholungsregel"
 
-msgctxt "view:calendar.event.rrule:0"
+msgctxt "view:calendar.event.rrule:"
 msgid "Recurrence Rules"
 msgstr "Wiederholungsregeln"
 
-msgctxt "view:calendar.event:0"
+msgctxt "view:calendar.event:"
 msgid "Attendees"
 msgstr "Teilnehmer"
 
-msgctxt "view:calendar.event:0"
+msgctxt "view:calendar.event:"
 msgid "Categories"
 msgstr "Kategorien"
 
-msgctxt "view:calendar.event:0"
+msgctxt "view:calendar.event:"
 msgid "Event"
 msgstr "Termin"
 
-msgctxt "view:calendar.event:0"
+msgctxt "view:calendar.event:"
 msgid "Events"
 msgstr "Termine"
 
-msgctxt "view:calendar.event:0"
+msgctxt "view:calendar.event:"
 msgid "General"
 msgstr "Allgemein"
 
-msgctxt "view:calendar.event:0"
+msgctxt "view:calendar.event:"
 msgid "Occurences"
 msgstr "Ereignisse"
 
-msgctxt "view:calendar.event:0"
+msgctxt "view:calendar.event:"
 msgid "Recurrences"
 msgstr "Wiederholungen"
 
-msgctxt "view:calendar.location:0"
+msgctxt "view:calendar.location:"
 msgid "Location"
 msgstr "Ort"
 
-msgctxt "view:calendar.location:0"
+msgctxt "view:calendar.location:"
 msgid "Locations"
 msgstr "Orte"
diff --git a/locale/es_AR.po b/locale/es_AR.po
new file mode 100644
index 0000000..542f292
--- /dev/null
+++ b/locale/es_AR.po
@@ -0,0 +1,3 @@
+# 
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
diff --git a/locale/es_CO.po b/locale/es_CO.po
index da25b87..707e3dc 100644
--- a/locale/es_CO.po
+++ b/locale/es_CO.po
@@ -2,523 +2,880 @@
 msgid ""
 msgstr "Content-Type: text/plain; charset=utf-8\n"
 
-msgctxt "error:calendar.calendar:0"
+msgctxt "error:calendar.calendar:"
 msgid "A user can have only one calendar!"
 msgstr "¡Un usuario puede tener a lo sumo un calendario!"
 
-msgctxt "error:calendar.calendar:0"
+msgctxt "error:calendar.calendar:"
 msgid "The name of calendar must be unique!"
 msgstr "¡El nombre del calendario es único!"
 
-msgctxt "error:calendar.category:0"
+msgctxt "error:calendar.category:"
 msgid "The name of calendar category must be unique!"
 msgstr "¡El nombre de la categoría de calendario debe ser único!"
 
-msgctxt "error:calendar.event:0"
+msgctxt "error:calendar.event:"
 msgid "Recurrence can not be recurrent!"
 msgstr "¡La repetición no puede repetirse!"
 
-msgctxt "error:calendar.event:0"
+msgctxt "error:calendar.event:"
 msgid "UUID and recurrence must be unique in a calendar!"
 msgstr "¡El UUID y la recurrencia deben ser únicos por calendario! "
 
-msgctxt "error:calendar.location:0"
+msgctxt "error:calendar.location:"
 msgid "The name of calendar location must be unique!"
 msgstr "¡El nombre del lugar del calendario debe ser único!"
 
-msgctxt "error:calendar.rrule:0"
+msgctxt "error:calendar.rrule:"
 msgid "Invalid \"By Day\""
 msgstr ""
 
-msgctxt "error:calendar.rrule:0"
+msgctxt "error:calendar.rrule:"
 msgid "Invalid \"By Hour\""
 msgstr ""
 
-msgctxt "error:calendar.rrule:0"
+msgctxt "error:calendar.rrule:"
 msgid "Invalid \"By Minute\""
 msgstr ""
 
-msgctxt "error:calendar.rrule:0"
+msgctxt "error:calendar.rrule:"
 msgid "Invalid \"By Month Day\""
 msgstr ""
 
-msgctxt "error:calendar.rrule:0"
+msgctxt "error:calendar.rrule:"
 msgid "Invalid \"By Month\""
 msgstr ""
 
-msgctxt "error:calendar.rrule:0"
+msgctxt "error:calendar.rrule:"
 msgid "Invalid \"By Position\""
 msgstr ""
 
-msgctxt "error:calendar.rrule:0"
+msgctxt "error:calendar.rrule:"
 msgid "Invalid \"By Second\""
 msgstr ""
 
-msgctxt "error:calendar.rrule:0"
+msgctxt "error:calendar.rrule:"
 msgid "Invalid \"By Week Number\""
 msgstr ""
 
-msgctxt "error:calendar.rrule:0"
+msgctxt "error:calendar.rrule:"
 msgid "Invalid \"By Year Day\""
 msgstr ""
 
-msgctxt "error:calendar.rrule:0"
+msgctxt "error:calendar.rrule:"
 msgid "Only one of \"until\" and \"count\" can be set!"
 msgstr ""
 
-msgctxt "field:calendar.alarm,rec_name:0"
+msgctxt "field:calendar.alarm,create_date:"
+msgid "Create Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.alarm,create_uid:"
+msgid "Create User"
+msgstr "Crear usuario"
+
+msgctxt "field:calendar.alarm,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.alarm,rec_name:"
 msgid "Name"
 msgstr "Nombre"
 
-msgctxt "field:calendar.alarm,valarm:0"
+msgctxt "field:calendar.alarm,valarm:"
 msgid "valarm"
 msgstr ""
 
-msgctxt "field:calendar.attendee,attendee:0"
+msgctxt "field:calendar.alarm,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.alarm,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.attendee,attendee:"
 msgid "attendee"
 msgstr ""
 
-msgctxt "field:calendar.attendee,email:0"
+msgctxt "field:calendar.attendee,create_date:"
+msgid "Create Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.attendee,create_uid:"
+msgid "Create User"
+msgstr "Crear usuario"
+
+msgctxt "field:calendar.attendee,email:"
 msgid "Email"
 msgstr "Correo Electrónico"
 
-msgctxt "field:calendar.attendee,rec_name:0"
+msgctxt "field:calendar.attendee,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.attendee,rec_name:"
 msgid "Name"
 msgstr "Nombre"
 
-msgctxt "field:calendar.attendee,status:0"
+msgctxt "field:calendar.attendee,status:"
 msgid "Participation Status"
 msgstr ""
 
-msgctxt "field:calendar.calendar,description:0"
+msgctxt "field:calendar.attendee,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.attendee,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.calendar,create_date:"
+msgid "Create Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.calendar,create_uid:"
+msgid "Create User"
+msgstr "Crear usuario"
+
+msgctxt "field:calendar.calendar,description:"
 msgid "Description"
 msgstr "Descripción"
 
-msgctxt "field:calendar.calendar,name:0"
+msgctxt "field:calendar.calendar,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.calendar,name:"
 msgid "Name"
 msgstr "Nombre"
 
-msgctxt "field:calendar.calendar,owner:0"
+msgctxt "field:calendar.calendar,owner:"
 msgid "Owner"
 msgstr "Propietario"
 
-msgctxt "field:calendar.calendar,read_users:0"
+msgctxt "field:calendar.calendar,read_users:"
 msgid "Read Users"
 msgstr "Usuarios que pueden Leer"
 
-msgctxt "field:calendar.calendar,rec_name:0"
+msgctxt "field:calendar.calendar,rec_name:"
 msgid "Name"
 msgstr "Nombre"
 
-msgctxt "field:calendar.calendar,write_users:0"
+msgctxt "field:calendar.calendar,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.calendar,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.calendar,write_users:"
 msgid "Write Users"
 msgstr "Escribir Usuarios"
 
-msgctxt "field:calendar.calendar-read-res.user,calendar:0"
+msgctxt "field:calendar.calendar-read-res.user,calendar:"
 msgid "Calendar"
 msgstr "Calendario"
 
-msgctxt "field:calendar.calendar-read-res.user,rec_name:0"
+msgctxt "field:calendar.calendar-read-res.user,create_date:"
+msgid "Create Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.calendar-read-res.user,create_uid:"
+msgid "Create User"
+msgstr "Crear usuario"
+
+msgctxt "field:calendar.calendar-read-res.user,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.calendar-read-res.user,rec_name:"
 msgid "Name"
 msgstr "Nombre"
 
-msgctxt "field:calendar.calendar-read-res.user,user:0"
+msgctxt "field:calendar.calendar-read-res.user,user:"
 msgid "User"
 msgstr "Usuario"
 
-msgctxt "field:calendar.calendar-write-res.user,calendar:0"
+msgctxt "field:calendar.calendar-read-res.user,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.calendar-read-res.user,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.calendar-write-res.user,calendar:"
 msgid "Calendar"
 msgstr "Calendario"
 
-msgctxt "field:calendar.calendar-write-res.user,rec_name:0"
+msgctxt "field:calendar.calendar-write-res.user,create_date:"
+msgid "Create Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.calendar-write-res.user,create_uid:"
+msgid "Create User"
+msgstr "Crear usuario"
+
+msgctxt "field:calendar.calendar-write-res.user,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.calendar-write-res.user,rec_name:"
 msgid "Name"
 msgstr "Nombre"
 
-msgctxt "field:calendar.calendar-write-res.user,user:0"
+msgctxt "field:calendar.calendar-write-res.user,user:"
 msgid "User"
 msgstr "Usuario"
 
-msgctxt "field:calendar.category,name:0"
+msgctxt "field:calendar.calendar-write-res.user,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.calendar-write-res.user,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.category,create_date:"
+msgid "Create Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.category,create_uid:"
+msgid "Create User"
+msgstr "Crear usuario"
+
+msgctxt "field:calendar.category,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.category,name:"
 msgid "Name"
 msgstr "Nombre"
 
-msgctxt "field:calendar.category,rec_name:0"
+msgctxt "field:calendar.category,rec_name:"
 msgid "Name"
 msgstr "Nombre"
 
-msgctxt "field:calendar.date,date:0"
+msgctxt "field:calendar.category,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.category,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.date,create_date:"
+msgid "Create Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.date,create_uid:"
+msgid "Create User"
+msgstr "Crear usuario"
+
+msgctxt "field:calendar.date,date:"
 msgid "Is Date"
 msgstr "Es Fecha"
 
 #, fuzzy
-msgctxt "field:calendar.date,datetime:0"
+msgctxt "field:calendar.date,datetime:"
 msgid "Date"
 msgstr "Fecha"
 
+msgctxt "field:calendar.date,id:"
+msgid "ID"
+msgstr ""
+
 #, fuzzy
-msgctxt "field:calendar.date,rec_name:0"
+msgctxt "field:calendar.date,rec_name:"
 msgid "Name"
 msgstr "Nombre de Contacto"
 
-msgctxt "field:calendar.event,alarms:0"
+msgctxt "field:calendar.date,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.date,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.event,alarms:"
 msgid "Alarms"
 msgstr "Alarmas"
 
-msgctxt "field:calendar.event,all_day:0"
+msgctxt "field:calendar.event,all_day:"
 msgid "All Day"
 msgstr "Todo el Día"
 
-msgctxt "field:calendar.event,attendees:0"
+msgctxt "field:calendar.event,attendees:"
 msgid "Attendees"
 msgstr "Asistentes"
 
-msgctxt "field:calendar.event,calendar:0"
+msgctxt "field:calendar.event,calendar:"
 msgid "Calendar"
 msgstr "Calendario"
 
-msgctxt "field:calendar.event,calendar_owner:0"
+msgctxt "field:calendar.event,calendar_owner:"
 msgid "Owner"
 msgstr "Propietario"
 
-msgctxt "field:calendar.event,calendar_read_users:0"
+msgctxt "field:calendar.event,calendar_read_users:"
 msgid "Read Users"
 msgstr "Usuarios que pueden Leer"
 
-msgctxt "field:calendar.event,calendar_write_users:0"
+msgctxt "field:calendar.event,calendar_write_users:"
 msgid "Write Users"
 msgstr "Escribir Usuarios"
 
-msgctxt "field:calendar.event,categories:0"
+msgctxt "field:calendar.event,categories:"
 msgid "Categories"
 msgstr "Categorías"
 
-msgctxt "field:calendar.event,classification:0"
+msgctxt "field:calendar.event,classification:"
 msgid "Classification"
 msgstr "Clasificación"
 
-msgctxt "field:calendar.event,description:0"
+msgctxt "field:calendar.event,create_date:"
+msgid "Create Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.event,create_uid:"
+msgid "Create User"
+msgstr "Crear usuario"
+
+msgctxt "field:calendar.event,description:"
 msgid "Description"
 msgstr "Descripción"
 
-msgctxt "field:calendar.event,dtend:0"
+msgctxt "field:calendar.event,dtend:"
 msgid "End Date"
 msgstr "Fecha Fin"
 
-msgctxt "field:calendar.event,dtstart:0"
+msgctxt "field:calendar.event,dtstart:"
 msgid "Start Date"
 msgstr "Fecha Inicial"
 
-msgctxt "field:calendar.event,exdates:0"
+msgctxt "field:calendar.event,exdates:"
 msgid "Exception Dates"
 msgstr "Fechas de Excepción"
 
-msgctxt "field:calendar.event,exrules:0"
+msgctxt "field:calendar.event,exrules:"
 msgid "Exception Rules"
 msgstr "Reglas de Excepción"
 
-msgctxt "field:calendar.event,location:0"
+msgctxt "field:calendar.event,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.event,location:"
 msgid "Location"
 msgstr "Lugar"
 
 #, fuzzy
-msgctxt "field:calendar.event,occurences:0"
+msgctxt "field:calendar.event,occurences:"
 msgid "Occurences"
 msgstr "Ocurrencias"
 
-msgctxt "field:calendar.event,organizer:0"
+msgctxt "field:calendar.event,organizer:"
 msgid "Organizer"
 msgstr "Organizador"
 
-msgctxt "field:calendar.event,parent:0"
+msgctxt "field:calendar.event,parent:"
 msgid "Parent"
 msgstr "Padre"
 
-msgctxt "field:calendar.event,rdates:0"
+msgctxt "field:calendar.event,rdates:"
 msgid "Recurrence Dates"
 msgstr "Fechas de Repetición"
 
-msgctxt "field:calendar.event,rec_name:0"
+msgctxt "field:calendar.event,rec_name:"
 msgid "Name"
 msgstr "Nombre"
 
-msgctxt "field:calendar.event,recurrence:0"
+msgctxt "field:calendar.event,recurrence:"
 msgid "Recurrence"
 msgstr "Repetición"
 
-msgctxt "field:calendar.event,rrules:0"
+msgctxt "field:calendar.event,rrules:"
 msgid "Recurrence Rules"
 msgstr "Reglas de Repetición"
 
-msgctxt "field:calendar.event,sequence:0"
+msgctxt "field:calendar.event,sequence:"
 msgid "Sequence"
 msgstr "Secuencia"
 
-msgctxt "field:calendar.event,status:0"
+msgctxt "field:calendar.event,status:"
 msgid "Status"
 msgstr "Estado"
 
-msgctxt "field:calendar.event,summary:0"
+msgctxt "field:calendar.event,summary:"
 msgid "Summary"
 msgstr "Resumen"
 
-msgctxt "field:calendar.event,timezone:0"
+msgctxt "field:calendar.event,timezone:"
 msgid "Timezone"
 msgstr "Zona horaria"
 
-msgctxt "field:calendar.event,transp:0"
+msgctxt "field:calendar.event,transp:"
 msgid "Time Transparency"
 msgstr "Transparencia de Tiempo"
 
-msgctxt "field:calendar.event,uuid:0"
+msgctxt "field:calendar.event,uuid:"
 msgid "UUID"
 msgstr "UUID"
 
-msgctxt "field:calendar.event,vevent:0"
+msgctxt "field:calendar.event,vevent:"
 msgid "vevent"
 msgstr "vevento"
 
-msgctxt "field:calendar.event-calendar.category,category:0"
+msgctxt "field:calendar.event,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.event,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.event-calendar.category,category:"
 msgid "Category"
 msgstr "Categoría"
 
-msgctxt "field:calendar.event-calendar.category,event:0"
+msgctxt "field:calendar.event-calendar.category,create_date:"
+msgid "Create Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.event-calendar.category,create_uid:"
+msgid "Create User"
+msgstr "Crear usuario"
+
+msgctxt "field:calendar.event-calendar.category,event:"
 msgid "Event"
 msgstr "Evento"
 
-msgctxt "field:calendar.event-calendar.category,rec_name:0"
+msgctxt "field:calendar.event-calendar.category,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.event-calendar.category,rec_name:"
 msgid "Name"
 msgstr "Nombre"
 
-msgctxt "field:calendar.event.alarm,calendar_alarm:0"
+msgctxt "field:calendar.event-calendar.category,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.event-calendar.category,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.event.alarm,calendar_alarm:"
 msgid "Calendar Alarm"
 msgstr ""
 
-msgctxt "field:calendar.event.alarm,event:0"
+msgctxt "field:calendar.event.alarm,create_date:"
+msgid "Create Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.event.alarm,create_uid:"
+msgid "Create User"
+msgstr "Crear usuario"
+
+msgctxt "field:calendar.event.alarm,event:"
 msgid "Event"
 msgstr "Evento"
 
-msgctxt "field:calendar.event.alarm,rec_name:0"
+msgctxt "field:calendar.event.alarm,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.event.alarm,rec_name:"
 msgid "Name"
 msgstr "Nombre"
 
-msgctxt "field:calendar.event.attendee,calendar_attendee:0"
+msgctxt "field:calendar.event.alarm,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.event.alarm,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.event.attendee,calendar_attendee:"
 msgid "Calendar Attendee"
 msgstr ""
 
-msgctxt "field:calendar.event.attendee,event:0"
+msgctxt "field:calendar.event.attendee,create_date:"
+msgid "Create Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.event.attendee,create_uid:"
+msgid "Create User"
+msgstr "Crear usuario"
+
+msgctxt "field:calendar.event.attendee,event:"
 msgid "Event"
 msgstr "Evento"
 
-msgctxt "field:calendar.event.attendee,rec_name:0"
+msgctxt "field:calendar.event.attendee,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.event.attendee,rec_name:"
 msgid "Name"
 msgstr "Nombre"
 
-msgctxt "field:calendar.event.exdate,calendar_date:0"
+msgctxt "field:calendar.event.attendee,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.event.attendee,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.event.exdate,calendar_date:"
 msgid "Calendar Date"
 msgstr "Fecha Calendario"
 
-msgctxt "field:calendar.event.exdate,event:0"
+msgctxt "field:calendar.event.exdate,create_date:"
+msgid "Create Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.event.exdate,create_uid:"
+msgid "Create User"
+msgstr "Crear usuario"
+
+msgctxt "field:calendar.event.exdate,event:"
 msgid "Event"
 msgstr "Evento"
 
-msgctxt "field:calendar.event.exdate,rec_name:0"
+msgctxt "field:calendar.event.exdate,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.event.exdate,rec_name:"
 msgid "Name"
 msgstr "Nombre"
 
-msgctxt "field:calendar.event.exrule,calendar_rrule:0"
+msgctxt "field:calendar.event.exdate,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.event.exdate,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.event.exrule,calendar_rrule:"
 msgid "Calendar RRule"
 msgstr ""
 
-msgctxt "field:calendar.event.exrule,event:0"
+msgctxt "field:calendar.event.exrule,create_date:"
+msgid "Create Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.event.exrule,create_uid:"
+msgid "Create User"
+msgstr "Crear usuario"
+
+msgctxt "field:calendar.event.exrule,event:"
 msgid "Event"
 msgstr "Evento"
 
-msgctxt "field:calendar.event.exrule,rec_name:0"
+msgctxt "field:calendar.event.exrule,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.event.exrule,rec_name:"
 msgid "Name"
 msgstr "Nombre"
 
-msgctxt "field:calendar.event.rdate,calendar_date:0"
+msgctxt "field:calendar.event.exrule,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.event.exrule,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.event.rdate,calendar_date:"
 msgid "Calendar Date"
 msgstr "Fecha Calendario"
 
-msgctxt "field:calendar.event.rdate,event:0"
+msgctxt "field:calendar.event.rdate,create_date:"
+msgid "Create Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.event.rdate,create_uid:"
+msgid "Create User"
+msgstr "Crear usuario"
+
+msgctxt "field:calendar.event.rdate,event:"
 msgid "Event"
 msgstr "Evento"
 
-msgctxt "field:calendar.event.rdate,rec_name:0"
+msgctxt "field:calendar.event.rdate,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.event.rdate,rec_name:"
 msgid "Name"
 msgstr "Nombre"
 
-msgctxt "field:calendar.event.rrule,calendar_rrule:0"
+msgctxt "field:calendar.event.rdate,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.event.rdate,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.event.rrule,calendar_rrule:"
 msgid "Calendar RRule"
 msgstr ""
 
-msgctxt "field:calendar.event.rrule,event:0"
+msgctxt "field:calendar.event.rrule,create_date:"
+msgid "Create Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.event.rrule,create_uid:"
+msgid "Create User"
+msgstr "Crear usuario"
+
+msgctxt "field:calendar.event.rrule,event:"
 msgid "Event"
 msgstr "Evento"
 
-msgctxt "field:calendar.event.rrule,rec_name:0"
+msgctxt "field:calendar.event.rrule,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.event.rrule,rec_name:"
 msgid "Name"
 msgstr "Nombre"
 
-msgctxt "field:calendar.location,name:0"
+msgctxt "field:calendar.event.rrule,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.event.rrule,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.location,create_date:"
+msgid "Create Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.location,create_uid:"
+msgid "Create User"
+msgstr "Crear usuario"
+
+msgctxt "field:calendar.location,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.location,name:"
 msgid "Name"
 msgstr "Nombre"
 
-msgctxt "field:calendar.location,rec_name:0"
+msgctxt "field:calendar.location,rec_name:"
 msgid "Name"
 msgstr "Nombre"
 
-msgctxt "field:calendar.rrule,byday:0"
+msgctxt "field:calendar.location,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.location,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.rrule,byday:"
 msgid "By Day"
 msgstr ""
 
-msgctxt "field:calendar.rrule,byhour:0"
+msgctxt "field:calendar.rrule,byhour:"
 msgid "By Hour"
 msgstr ""
 
-msgctxt "field:calendar.rrule,byminute:0"
+msgctxt "field:calendar.rrule,byminute:"
 msgid "By Minute"
 msgstr ""
 
-msgctxt "field:calendar.rrule,bymonth:0"
+msgctxt "field:calendar.rrule,bymonth:"
 msgid "By Month"
 msgstr ""
 
-msgctxt "field:calendar.rrule,bymonthday:0"
+msgctxt "field:calendar.rrule,bymonthday:"
 msgid "By Month Day"
 msgstr ""
 
-msgctxt "field:calendar.rrule,bysecond:0"
+msgctxt "field:calendar.rrule,bysecond:"
 msgid "By Second"
 msgstr ""
 
-msgctxt "field:calendar.rrule,bysetpos:0"
+msgctxt "field:calendar.rrule,bysetpos:"
 msgid "By Position"
 msgstr ""
 
-msgctxt "field:calendar.rrule,byweekno:0"
+msgctxt "field:calendar.rrule,byweekno:"
 msgid "By Week Number"
 msgstr ""
 
-msgctxt "field:calendar.rrule,byyearday:0"
+msgctxt "field:calendar.rrule,byyearday:"
 msgid "By Year Day"
 msgstr ""
 
-msgctxt "field:calendar.rrule,count:0"
+msgctxt "field:calendar.rrule,count:"
 msgid "Count"
 msgstr ""
 
-msgctxt "field:calendar.rrule,freq:0"
+msgctxt "field:calendar.rrule,create_date:"
+msgid "Create Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.rrule,create_uid:"
+msgid "Create User"
+msgstr "Crear usuario"
+
+msgctxt "field:calendar.rrule,freq:"
 msgid "Frequency"
 msgstr ""
 
-msgctxt "field:calendar.rrule,interval:0"
+msgctxt "field:calendar.rrule,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.rrule,interval:"
 msgid "Interval"
 msgstr ""
 
-msgctxt "field:calendar.rrule,rec_name:0"
+msgctxt "field:calendar.rrule,rec_name:"
 msgid "Name"
 msgstr "Nombre"
 
-msgctxt "field:calendar.rrule,until:0"
+msgctxt "field:calendar.rrule,until:"
 msgid "Until Date"
 msgstr ""
 
 #, fuzzy
-msgctxt "field:calendar.rrule,until_date:0"
+msgctxt "field:calendar.rrule,until_date:"
 msgid "Is Date"
 msgstr "Es Fecha"
 
-msgctxt "field:calendar.rrule,wkst:0"
+msgctxt "field:calendar.rrule,wkst:"
 msgid "Week Day"
 msgstr "Día de la Semana"
 
-msgctxt "field:res.user,calendars:0"
+msgctxt "field:calendar.rrule,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.rrule,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:res.user,calendars:"
 msgid "Calendars"
 msgstr "Calendarios"
 
-msgctxt "help:calendar.calendar,owner:0"
+msgctxt "help:calendar.calendar,owner:"
 msgid "The user must have an email"
 msgstr ""
 
-msgctxt "help:calendar.date,date:0"
+msgctxt "help:calendar.date,date:"
 msgid "Ignore time of field \"Date\", but handle as date only."
 msgstr "Ignore tiempo del campo \"Fecha\", pero manejelo como fecha solamente."
 
-msgctxt "help:calendar.event,uuid:0"
+msgctxt "help:calendar.event,uuid:"
 msgid "Universally Unique Identifier"
 msgstr "Idenitificador Universal Único"
 
-msgctxt "help:calendar.rrule,until_date:0"
+msgctxt "help:calendar.rrule,until_date:"
 msgid "Ignore time of field \"Until Date\", but handle as date only."
 msgstr ""
 
-msgctxt "model:calendar.alarm,name:0"
+msgctxt "model:calendar.alarm,name:"
 msgid "Alarm"
 msgstr "Alarma"
 
-msgctxt "model:calendar.attendee,name:0"
+msgctxt "model:calendar.attendee,name:"
 msgid "Attendee"
 msgstr "Asistente"
 
-msgctxt "model:calendar.calendar,name:0"
+msgctxt "model:calendar.calendar,name:"
 msgid "Calendar"
 msgstr "Calendario"
 
-msgctxt "model:calendar.calendar-read-res.user,name:0"
+msgctxt "model:calendar.calendar-read-res.user,name:"
 msgid "Calendar - read - User"
 msgstr "Calendario - leer - Usuario"
 
-msgctxt "model:calendar.calendar-write-res.user,name:0"
+msgctxt "model:calendar.calendar-write-res.user,name:"
 msgid "Calendar - write - User"
 msgstr "Calendario - escribir - Usuario"
 
-msgctxt "model:calendar.category,name:0"
+msgctxt "model:calendar.category,name:"
 msgid "Category"
 msgstr "Categoría"
 
-msgctxt "model:calendar.date,name:0"
+msgctxt "model:calendar.date,name:"
 msgid "Calendar Date"
 msgstr "Fecha Calendario"
 
-msgctxt "model:calendar.event,name:0"
+msgctxt "model:calendar.event,name:"
 msgid "Event"
 msgstr "Evento"
 
-msgctxt "model:calendar.event-calendar.category,name:0"
+msgctxt "model:calendar.event-calendar.category,name:"
 msgid "Event - Category"
 msgstr "Evento - Categoría"
 
-msgctxt "model:calendar.event.alarm,name:0"
+msgctxt "model:calendar.event.alarm,name:"
 msgid "Alarm"
 msgstr "Alarma"
 
-msgctxt "model:calendar.event.attendee,name:0"
+msgctxt "model:calendar.event.attendee,name:"
 msgid "Attendee"
 msgstr "Asistente"
 
-msgctxt "model:calendar.event.exdate,name:0"
+msgctxt "model:calendar.event.exdate,name:"
 msgid "Exception Date"
 msgstr "Fecha de Excepción"
 
-msgctxt "model:calendar.event.exrule,name:0"
+msgctxt "model:calendar.event.exrule,name:"
 msgid "Exception Rule"
 msgstr "Regla de Excepción"
 
-msgctxt "model:calendar.event.rdate,name:0"
+msgctxt "model:calendar.event.rdate,name:"
 msgid "Recurrence Date"
 msgstr "Fecha de Repetición"
 
-msgctxt "model:calendar.event.rrule,name:0"
+msgctxt "model:calendar.event.rrule,name:"
 msgid "Recurrence Rule"
 msgstr "Regla de Repetición"
 
-msgctxt "model:calendar.location,name:0"
+msgctxt "model:calendar.location,name:"
 msgid "Location"
 msgstr "Lugar"
 
-msgctxt "model:calendar.rrule,name:0"
+msgctxt "model:calendar.rrule,name:"
 msgid "Recurrence Rule"
 msgstr "Regla de Repetición"
 
@@ -551,219 +908,219 @@ msgctxt "model:res.group,name:group_calendar_admin"
 msgid "Calendar Administration"
 msgstr "Administrar Calendario"
 
-msgctxt "selection:calendar.attendee,status:0"
+msgctxt "selection:calendar.attendee,status:"
 msgid ""
 msgstr ""
 
-msgctxt "selection:calendar.attendee,status:0"
+msgctxt "selection:calendar.attendee,status:"
 msgid "Accepted"
 msgstr ""
 
-msgctxt "selection:calendar.attendee,status:0"
+msgctxt "selection:calendar.attendee,status:"
 msgid "Declined"
 msgstr ""
 
-msgctxt "selection:calendar.attendee,status:0"
+msgctxt "selection:calendar.attendee,status:"
 msgid "Delegated"
 msgstr ""
 
-msgctxt "selection:calendar.attendee,status:0"
+msgctxt "selection:calendar.attendee,status:"
 msgid "Needs Action"
 msgstr ""
 
-msgctxt "selection:calendar.attendee,status:0"
+msgctxt "selection:calendar.attendee,status:"
 msgid "Tentative"
 msgstr "Tentativa"
 
-msgctxt "selection:calendar.event,classification:0"
+msgctxt "selection:calendar.event,classification:"
 msgid "Confidential"
 msgstr "Confidencial"
 
-msgctxt "selection:calendar.event,classification:0"
+msgctxt "selection:calendar.event,classification:"
 msgid "Private"
 msgstr "Privado"
 
-msgctxt "selection:calendar.event,classification:0"
+msgctxt "selection:calendar.event,classification:"
 msgid "Public"
 msgstr "Público"
 
-msgctxt "selection:calendar.event,status:0"
+msgctxt "selection:calendar.event,status:"
 msgid ""
 msgstr ""
 
-msgctxt "selection:calendar.event,status:0"
+msgctxt "selection:calendar.event,status:"
 msgid "Cancelled"
 msgstr "Cancelado"
 
-msgctxt "selection:calendar.event,status:0"
+msgctxt "selection:calendar.event,status:"
 msgid "Confirmed"
 msgstr "Confirmado"
 
-msgctxt "selection:calendar.event,status:0"
+msgctxt "selection:calendar.event,status:"
 msgid "Tentative"
 msgstr "Tentativa"
 
-msgctxt "selection:calendar.event,transp:0"
+msgctxt "selection:calendar.event,transp:"
 msgid "Opaque"
 msgstr "Opaco"
 
-msgctxt "selection:calendar.event,transp:0"
+msgctxt "selection:calendar.event,transp:"
 msgid "Transparent"
 msgstr "Transparente"
 
-msgctxt "selection:calendar.rrule,freq:0"
+msgctxt "selection:calendar.rrule,freq:"
 msgid "Daily"
 msgstr ""
 
-msgctxt "selection:calendar.rrule,freq:0"
+msgctxt "selection:calendar.rrule,freq:"
 msgid "Hourly"
 msgstr ""
 
-msgctxt "selection:calendar.rrule,freq:0"
+msgctxt "selection:calendar.rrule,freq:"
 msgid "Minutely"
 msgstr ""
 
-msgctxt "selection:calendar.rrule,freq:0"
+msgctxt "selection:calendar.rrule,freq:"
 msgid "Monthly"
 msgstr ""
 
-msgctxt "selection:calendar.rrule,freq:0"
+msgctxt "selection:calendar.rrule,freq:"
 msgid "Secondly"
 msgstr ""
 
-msgctxt "selection:calendar.rrule,freq:0"
+msgctxt "selection:calendar.rrule,freq:"
 msgid "Weekly"
 msgstr ""
 
-msgctxt "selection:calendar.rrule,freq:0"
+msgctxt "selection:calendar.rrule,freq:"
 msgid "Yearly"
 msgstr ""
 
-msgctxt "selection:calendar.rrule,wkst:0"
+msgctxt "selection:calendar.rrule,wkst:"
 msgid "Friday"
 msgstr "Viernes"
 
-msgctxt "selection:calendar.rrule,wkst:0"
+msgctxt "selection:calendar.rrule,wkst:"
 msgid "Monday"
 msgstr "Lunes"
 
-msgctxt "selection:calendar.rrule,wkst:0"
+msgctxt "selection:calendar.rrule,wkst:"
 msgid "Saturday"
 msgstr "Sábado"
 
-msgctxt "selection:calendar.rrule,wkst:0"
+msgctxt "selection:calendar.rrule,wkst:"
 msgid "Sunday"
 msgstr "Domingo"
 
-msgctxt "selection:calendar.rrule,wkst:0"
+msgctxt "selection:calendar.rrule,wkst:"
 msgid "Thursday"
 msgstr "Jueves"
 
-msgctxt "selection:calendar.rrule,wkst:0"
+msgctxt "selection:calendar.rrule,wkst:"
 msgid "Tuesday"
 msgstr "Martes"
 
-msgctxt "selection:calendar.rrule,wkst:0"
+msgctxt "selection:calendar.rrule,wkst:"
 msgid "Wednesday"
 msgstr "Miércoles"
 
-msgctxt "view:calendar.calendar:0"
+msgctxt "view:calendar.calendar:"
 msgid "Calendar"
 msgstr "Calendario"
 
-msgctxt "view:calendar.calendar:0"
+msgctxt "view:calendar.calendar:"
 msgid "Calendars"
 msgstr "Calendarios"
 
-msgctxt "view:calendar.calendar:0"
+msgctxt "view:calendar.calendar:"
 msgid "General"
 msgstr "General"
 
-msgctxt "view:calendar.calendar:0"
+msgctxt "view:calendar.calendar:"
 msgid "Security"
 msgstr "Seguridad"
 
-msgctxt "view:calendar.category:0"
+msgctxt "view:calendar.category:"
 msgid "Categories"
 msgstr "Categorías"
 
-msgctxt "view:calendar.category:0"
+msgctxt "view:calendar.category:"
 msgid "Category"
 msgstr "Categoría"
 
-msgctxt "view:calendar.event.attendee:0"
+msgctxt "view:calendar.event.attendee:"
 msgid "Attendee"
 msgstr "Asistente"
 
-msgctxt "view:calendar.event.attendee:0"
+msgctxt "view:calendar.event.attendee:"
 msgid "Attendees"
 msgstr "Asistentes"
 
-msgctxt "view:calendar.event.exdate:0"
+msgctxt "view:calendar.event.exdate:"
 msgid "Exception Date"
 msgstr "Fecha de Excepción"
 
-msgctxt "view:calendar.event.exdate:0"
+msgctxt "view:calendar.event.exdate:"
 msgid "Exception Dates"
 msgstr "Fechas de Excepción"
 
-msgctxt "view:calendar.event.exrule:0"
+msgctxt "view:calendar.event.exrule:"
 msgid "Exception Rule"
 msgstr "Regla de Excepción"
 
-msgctxt "view:calendar.event.exrule:0"
+msgctxt "view:calendar.event.exrule:"
 msgid "Exception Rules"
 msgstr "Reglas de Excepción"
 
-msgctxt "view:calendar.event.rdate:0"
+msgctxt "view:calendar.event.rdate:"
 msgid "Recurrence Date"
 msgstr "Fecha de Repetición"
 
-msgctxt "view:calendar.event.rdate:0"
+msgctxt "view:calendar.event.rdate:"
 msgid "Recurrence Dates"
 msgstr "Fechas de Repetición"
 
-msgctxt "view:calendar.event.rrule:0"
+msgctxt "view:calendar.event.rrule:"
 msgid "Recurrence Rule"
 msgstr "Regla de Repetición"
 
-msgctxt "view:calendar.event.rrule:0"
+msgctxt "view:calendar.event.rrule:"
 msgid "Recurrence Rules"
 msgstr "Reglas de Repetición"
 
-msgctxt "view:calendar.event:0"
+msgctxt "view:calendar.event:"
 msgid "Attendees"
 msgstr "Asistentes"
 
-msgctxt "view:calendar.event:0"
+msgctxt "view:calendar.event:"
 msgid "Categories"
 msgstr "Categorías"
 
-msgctxt "view:calendar.event:0"
+msgctxt "view:calendar.event:"
 msgid "Event"
 msgstr "Evento"
 
-msgctxt "view:calendar.event:0"
+msgctxt "view:calendar.event:"
 msgid "Events"
 msgstr "Eventos"
 
-msgctxt "view:calendar.event:0"
+msgctxt "view:calendar.event:"
 msgid "General"
 msgstr "General"
 
 #, fuzzy
-msgctxt "view:calendar.event:0"
+msgctxt "view:calendar.event:"
 msgid "Occurences"
 msgstr "Ocurrencias"
 
-msgctxt "view:calendar.event:0"
+msgctxt "view:calendar.event:"
 msgid "Recurrences"
 msgstr "Repeticiones"
 
-msgctxt "view:calendar.location:0"
+msgctxt "view:calendar.location:"
 msgid "Location"
 msgstr "Lugar"
 
-msgctxt "view:calendar.location:0"
+msgctxt "view:calendar.location:"
 msgid "Locations"
 msgstr "Lugares"
diff --git a/locale/es_ES.po b/locale/es_ES.po
index d905bdc..ac105e3 100644
--- a/locale/es_ES.po
+++ b/locale/es_ES.po
@@ -2,522 +2,859 @@
 msgid ""
 msgstr "Content-Type: text/plain; charset=utf-8\n"
 
-msgctxt "error:calendar.calendar:0"
+msgctxt "error:calendar.calendar:"
 msgid "A user can have only one calendar!"
-msgstr "Un usuario solo puede tener un calendario"
+msgstr "Un usuario sólo puede tener un calendario."
 
-msgctxt "error:calendar.calendar:0"
+msgctxt "error:calendar.calendar:"
 msgid "The name of calendar must be unique!"
-msgstr "El nombre del calendario debe ser único"
+msgstr "El nombre del calendario debe ser único."
 
-msgctxt "error:calendar.category:0"
+msgctxt "error:calendar.category:"
 msgid "The name of calendar category must be unique!"
-msgstr "El nombre de la categoría  del calendario debe ser único"
+msgstr "El nombre de la categoría del calendario debe ser único."
 
-msgctxt "error:calendar.event:0"
+msgctxt "error:calendar.event:"
 msgid "Recurrence can not be recurrent!"
-msgstr "Una recurrencia no puede ser recurrente"
+msgstr "Una recurrencia no puede ser recurrente."
 
-msgctxt "error:calendar.event:0"
+msgctxt "error:calendar.event:"
 msgid "UUID and recurrence must be unique in a calendar!"
-msgstr "UUID y recurrencia deben ser únicos en un calendario"
+msgstr "UUID y recurrencia deben ser únicos en un calendario."
 
-msgctxt "error:calendar.location:0"
+msgctxt "error:calendar.location:"
 msgid "The name of calendar location must be unique!"
-msgstr "El nombre de la ubicación del calendario debe ser único"
+msgstr "El nombre de la ubicación del calendario debe ser único."
 
-msgctxt "error:calendar.rrule:0"
+msgctxt "error:calendar.rrule:"
 msgid "Invalid \"By Day\""
-msgstr "Inválido «por día»"
+msgstr "\"Por día\" no es correcto."
 
-msgctxt "error:calendar.rrule:0"
+msgctxt "error:calendar.rrule:"
 msgid "Invalid \"By Hour\""
-msgstr "Inválido «por hora»"
+msgstr "\"Por hora\" no es correcto."
 
-msgctxt "error:calendar.rrule:0"
+msgctxt "error:calendar.rrule:"
 msgid "Invalid \"By Minute\""
-msgstr "Inválido «por minuto»"
+msgstr "\"Por minuto\" no es correcto."
 
-msgctxt "error:calendar.rrule:0"
+msgctxt "error:calendar.rrule:"
 msgid "Invalid \"By Month Day\""
-msgstr "Inválido «por día del mes»"
+msgstr "\"Por día del mes\" no es correcto."
 
-msgctxt "error:calendar.rrule:0"
+msgctxt "error:calendar.rrule:"
 msgid "Invalid \"By Month\""
-msgstr "Inválido «por mes»"
+msgstr "\"Por mes\" no es correcto."
 
-msgctxt "error:calendar.rrule:0"
+msgctxt "error:calendar.rrule:"
 msgid "Invalid \"By Position\""
-msgstr "Inválido «por posición»"
+msgstr "\"Por posición\" no es correcto."
 
-msgctxt "error:calendar.rrule:0"
+msgctxt "error:calendar.rrule:"
 msgid "Invalid \"By Second\""
-msgstr "Inválido «por segundos»"
+msgstr "\"Por segundos\" no es correcto."
 
-msgctxt "error:calendar.rrule:0"
+msgctxt "error:calendar.rrule:"
 msgid "Invalid \"By Week Number\""
-msgstr "Inválido «por número de semana»"
+msgstr "\"Por número de semana\" no es correcto."
 
-msgctxt "error:calendar.rrule:0"
+msgctxt "error:calendar.rrule:"
 msgid "Invalid \"By Year Day\""
-msgstr "Inválido «por día del año»"
+msgstr "\"Por día del año\" no es correcto."
 
-msgctxt "error:calendar.rrule:0"
+msgctxt "error:calendar.rrule:"
 msgid "Only one of \"until\" and \"count\" can be set!"
-msgstr "Solo se puede usar o «hasta» o «Número de veces»"
+msgstr "Sólo se puede usar o \"Hasta\" o \"Número de veces\"."
 
-msgctxt "field:calendar.alarm,rec_name:0"
+msgctxt "field:calendar.alarm,create_date:"
+msgid "Create Date"
+msgstr "Fecha creación"
+
+msgctxt "field:calendar.alarm,create_uid:"
+msgid "Create User"
+msgstr "Usuario creación"
+
+msgctxt "field:calendar.alarm,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.alarm,rec_name:"
 msgid "Name"
 msgstr "Nombre"
 
-msgctxt "field:calendar.alarm,valarm:0"
+msgctxt "field:calendar.alarm,valarm:"
 msgid "valarm"
 msgstr "valarm"
 
-msgctxt "field:calendar.attendee,attendee:0"
+msgctxt "field:calendar.alarm,write_date:"
+msgid "Write Date"
+msgstr "Fecha modificación"
+
+msgctxt "field:calendar.alarm,write_uid:"
+msgid "Write User"
+msgstr "Usuario modificación"
+
+msgctxt "field:calendar.attendee,attendee:"
 msgid "attendee"
 msgstr "asistentes"
 
-msgctxt "field:calendar.attendee,email:0"
+msgctxt "field:calendar.attendee,create_date:"
+msgid "Create Date"
+msgstr "Fecha creación"
+
+msgctxt "field:calendar.attendee,create_uid:"
+msgid "Create User"
+msgstr "Usuario creación"
+
+msgctxt "field:calendar.attendee,email:"
 msgid "Email"
 msgstr "Correo electrónico"
 
-msgctxt "field:calendar.attendee,rec_name:0"
+msgctxt "field:calendar.attendee,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.attendee,rec_name:"
 msgid "Name"
 msgstr "Nombre"
 
-msgctxt "field:calendar.attendee,status:0"
+msgctxt "field:calendar.attendee,status:"
 msgid "Participation Status"
 msgstr "Estado de participación"
 
-msgctxt "field:calendar.calendar,description:0"
+msgctxt "field:calendar.attendee,write_date:"
+msgid "Write Date"
+msgstr "Fecha modificación"
+
+msgctxt "field:calendar.attendee,write_uid:"
+msgid "Write User"
+msgstr "Usuario modificación"
+
+msgctxt "field:calendar.calendar,create_date:"
+msgid "Create Date"
+msgstr "Fecha creación"
+
+msgctxt "field:calendar.calendar,create_uid:"
+msgid "Create User"
+msgstr "Usuario creación"
+
+msgctxt "field:calendar.calendar,description:"
 msgid "Description"
 msgstr "Descripción"
 
-msgctxt "field:calendar.calendar,name:0"
+msgctxt "field:calendar.calendar,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.calendar,name:"
 msgid "Name"
 msgstr "Nombre"
 
-msgctxt "field:calendar.calendar,owner:0"
+msgctxt "field:calendar.calendar,owner:"
 msgid "Owner"
-msgstr "Dueño"
+msgstr "Propietario"
 
-msgctxt "field:calendar.calendar,read_users:0"
+msgctxt "field:calendar.calendar,read_users:"
 msgid "Read Users"
 msgstr "Usuarios con lectura"
 
-msgctxt "field:calendar.calendar,rec_name:0"
+msgctxt "field:calendar.calendar,rec_name:"
 msgid "Name"
 msgstr "Nombre"
 
-msgctxt "field:calendar.calendar,write_users:0"
+msgctxt "field:calendar.calendar,write_date:"
+msgid "Write Date"
+msgstr "Fecha modificación"
+
+msgctxt "field:calendar.calendar,write_uid:"
+msgid "Write User"
+msgstr "Usuario modificación"
+
+msgctxt "field:calendar.calendar,write_users:"
 msgid "Write Users"
 msgstr "Usuarios con escritura"
 
-msgctxt "field:calendar.calendar-read-res.user,calendar:0"
+msgctxt "field:calendar.calendar-read-res.user,calendar:"
 msgid "Calendar"
 msgstr "Calendario"
 
-msgctxt "field:calendar.calendar-read-res.user,rec_name:0"
+msgctxt "field:calendar.calendar-read-res.user,create_date:"
+msgid "Create Date"
+msgstr "Fecha creación"
+
+msgctxt "field:calendar.calendar-read-res.user,create_uid:"
+msgid "Create User"
+msgstr "Usuario creación"
+
+msgctxt "field:calendar.calendar-read-res.user,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.calendar-read-res.user,rec_name:"
 msgid "Name"
 msgstr "Nombre"
 
-msgctxt "field:calendar.calendar-read-res.user,user:0"
+msgctxt "field:calendar.calendar-read-res.user,user:"
 msgid "User"
 msgstr "Usuario"
 
-msgctxt "field:calendar.calendar-write-res.user,calendar:0"
+msgctxt "field:calendar.calendar-read-res.user,write_date:"
+msgid "Write Date"
+msgstr "Fecha modificación"
+
+msgctxt "field:calendar.calendar-read-res.user,write_uid:"
+msgid "Write User"
+msgstr "Usuario modificación"
+
+msgctxt "field:calendar.calendar-write-res.user,calendar:"
 msgid "Calendar"
 msgstr "Calendario"
 
-msgctxt "field:calendar.calendar-write-res.user,rec_name:0"
+msgctxt "field:calendar.calendar-write-res.user,create_date:"
+msgid "Create Date"
+msgstr "Fecha creación"
+
+msgctxt "field:calendar.calendar-write-res.user,create_uid:"
+msgid "Create User"
+msgstr "Usuario creación"
+
+msgctxt "field:calendar.calendar-write-res.user,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.calendar-write-res.user,rec_name:"
 msgid "Name"
 msgstr "Nombre"
 
-msgctxt "field:calendar.calendar-write-res.user,user:0"
+msgctxt "field:calendar.calendar-write-res.user,user:"
 msgid "User"
 msgstr "Usuario"
 
-msgctxt "field:calendar.category,name:0"
+msgctxt "field:calendar.calendar-write-res.user,write_date:"
+msgid "Write Date"
+msgstr "Fecha modificación"
+
+msgctxt "field:calendar.calendar-write-res.user,write_uid:"
+msgid "Write User"
+msgstr "Usuario modificación"
+
+msgctxt "field:calendar.category,create_date:"
+msgid "Create Date"
+msgstr "Fecha creación"
+
+msgctxt "field:calendar.category,create_uid:"
+msgid "Create User"
+msgstr "Usuario creación"
+
+msgctxt "field:calendar.category,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.category,name:"
 msgid "Name"
 msgstr "Nombre"
 
-msgctxt "field:calendar.category,rec_name:0"
+msgctxt "field:calendar.category,rec_name:"
 msgid "Name"
 msgstr "Nombre"
 
-#, fuzzy
-msgctxt "field:calendar.date,date:0"
+msgctxt "field:calendar.category,write_date:"
+msgid "Write Date"
+msgstr "Fecha modificación"
+
+msgctxt "field:calendar.category,write_uid:"
+msgid "Write User"
+msgstr "Usuario modificación"
+
+msgctxt "field:calendar.date,create_date:"
+msgid "Create Date"
+msgstr "Fecha creación"
+
+msgctxt "field:calendar.date,create_uid:"
+msgid "Create User"
+msgstr "Usuario creación"
+
+msgctxt "field:calendar.date,date:"
 msgid "Is Date"
 msgstr "Es fecha"
 
-#, fuzzy
-msgctxt "field:calendar.date,datetime:0"
+msgctxt "field:calendar.date,datetime:"
 msgid "Date"
 msgstr "Fecha"
 
-#, fuzzy
-msgctxt "field:calendar.date,rec_name:0"
+msgctxt "field:calendar.date,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.date,rec_name:"
 msgid "Name"
-msgstr "Nombre del campo"
+msgstr "Nombre"
+
+msgctxt "field:calendar.date,write_date:"
+msgid "Write Date"
+msgstr "Fecha modificación"
 
-msgctxt "field:calendar.event,alarms:0"
+msgctxt "field:calendar.date,write_uid:"
+msgid "Write User"
+msgstr "Usuario modificación"
+
+msgctxt "field:calendar.event,alarms:"
 msgid "Alarms"
 msgstr "Alarmas"
 
-msgctxt "field:calendar.event,all_day:0"
+msgctxt "field:calendar.event,all_day:"
 msgid "All Day"
 msgstr "Todo el día"
 
-msgctxt "field:calendar.event,attendees:0"
+msgctxt "field:calendar.event,attendees:"
 msgid "Attendees"
 msgstr "Asistentes"
 
-msgctxt "field:calendar.event,calendar:0"
+msgctxt "field:calendar.event,calendar:"
 msgid "Calendar"
 msgstr "Calendario"
 
-msgctxt "field:calendar.event,calendar_owner:0"
+msgctxt "field:calendar.event,calendar_owner:"
 msgid "Owner"
-msgstr "Dueño"
+msgstr "Propietario"
 
-msgctxt "field:calendar.event,calendar_read_users:0"
+msgctxt "field:calendar.event,calendar_read_users:"
 msgid "Read Users"
 msgstr "Usuarios con lectura"
 
-msgctxt "field:calendar.event,calendar_write_users:0"
+msgctxt "field:calendar.event,calendar_write_users:"
 msgid "Write Users"
 msgstr "Usuarios con escritura"
 
-msgctxt "field:calendar.event,categories:0"
+msgctxt "field:calendar.event,categories:"
 msgid "Categories"
 msgstr "Categorías"
 
-msgctxt "field:calendar.event,classification:0"
+msgctxt "field:calendar.event,classification:"
 msgid "Classification"
 msgstr "Clasificación"
 
-msgctxt "field:calendar.event,description:0"
+msgctxt "field:calendar.event,create_date:"
+msgid "Create Date"
+msgstr "Fecha creación"
+
+msgctxt "field:calendar.event,create_uid:"
+msgid "Create User"
+msgstr "Usuario creación"
+
+msgctxt "field:calendar.event,description:"
 msgid "Description"
 msgstr "Descripción"
 
-msgctxt "field:calendar.event,dtend:0"
+msgctxt "field:calendar.event,dtend:"
 msgid "End Date"
-msgstr "Fecha fin"
+msgstr "Fecha final"
 
-msgctxt "field:calendar.event,dtstart:0"
+msgctxt "field:calendar.event,dtstart:"
 msgid "Start Date"
-msgstr "Fecha inicio"
+msgstr "Fecha inicial"
 
-msgctxt "field:calendar.event,exdates:0"
+msgctxt "field:calendar.event,exdates:"
 msgid "Exception Dates"
 msgstr "Fechas excluidas"
 
-msgctxt "field:calendar.event,exrules:0"
+msgctxt "field:calendar.event,exrules:"
 msgid "Exception Rules"
 msgstr "Reglas de excepción"
 
-msgctxt "field:calendar.event,location:0"
+msgctxt "field:calendar.event,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.event,location:"
 msgid "Location"
 msgstr "Ubicación"
 
-msgctxt "field:calendar.event,occurences:0"
+msgctxt "field:calendar.event,occurences:"
 msgid "Occurences"
 msgstr "Ocurrencias"
 
-msgctxt "field:calendar.event,organizer:0"
+msgctxt "field:calendar.event,organizer:"
 msgid "Organizer"
 msgstr "Organizador"
 
-msgctxt "field:calendar.event,parent:0"
+msgctxt "field:calendar.event,parent:"
 msgid "Parent"
 msgstr "Padre"
 
-msgctxt "field:calendar.event,rdates:0"
+msgctxt "field:calendar.event,rdates:"
 msgid "Recurrence Dates"
 msgstr "Fechas de recurrencia"
 
-msgctxt "field:calendar.event,rec_name:0"
+msgctxt "field:calendar.event,rec_name:"
 msgid "Name"
 msgstr "Nombre"
 
-msgctxt "field:calendar.event,recurrence:0"
+msgctxt "field:calendar.event,recurrence:"
 msgid "Recurrence"
 msgstr "Recurrencia"
 
-msgctxt "field:calendar.event,rrules:0"
+msgctxt "field:calendar.event,rrules:"
 msgid "Recurrence Rules"
 msgstr "Reglas de recurrencia"
 
-msgctxt "field:calendar.event,sequence:0"
+msgctxt "field:calendar.event,sequence:"
 msgid "Sequence"
 msgstr "Secuencia"
 
-msgctxt "field:calendar.event,status:0"
+msgctxt "field:calendar.event,status:"
 msgid "Status"
 msgstr "Estado"
 
-msgctxt "field:calendar.event,summary:0"
+msgctxt "field:calendar.event,summary:"
 msgid "Summary"
 msgstr "Resumen"
 
-msgctxt "field:calendar.event,timezone:0"
+msgctxt "field:calendar.event,timezone:"
 msgid "Timezone"
 msgstr "Zona horaria"
 
-msgctxt "field:calendar.event,transp:0"
+msgctxt "field:calendar.event,transp:"
 msgid "Time Transparency"
 msgstr "Tiempo de transparencia"
 
-msgctxt "field:calendar.event,uuid:0"
+msgctxt "field:calendar.event,uuid:"
 msgid "UUID"
 msgstr "UUID"
 
-msgctxt "field:calendar.event,vevent:0"
+msgctxt "field:calendar.event,vevent:"
 msgid "vevent"
 msgstr "vevent"
 
-msgctxt "field:calendar.event-calendar.category,category:0"
+msgctxt "field:calendar.event,write_date:"
+msgid "Write Date"
+msgstr "Fecha modificación"
+
+msgctxt "field:calendar.event,write_uid:"
+msgid "Write User"
+msgstr "Usuario modificación"
+
+msgctxt "field:calendar.event-calendar.category,category:"
 msgid "Category"
 msgstr "Categoría"
 
-msgctxt "field:calendar.event-calendar.category,event:0"
+msgctxt "field:calendar.event-calendar.category,create_date:"
+msgid "Create Date"
+msgstr "Fecha creación"
+
+msgctxt "field:calendar.event-calendar.category,create_uid:"
+msgid "Create User"
+msgstr "Usuario creación"
+
+msgctxt "field:calendar.event-calendar.category,event:"
 msgid "Event"
 msgstr "Evento"
 
-msgctxt "field:calendar.event-calendar.category,rec_name:0"
+msgctxt "field:calendar.event-calendar.category,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.event-calendar.category,rec_name:"
 msgid "Name"
 msgstr "Nombre"
 
-msgctxt "field:calendar.event.alarm,calendar_alarm:0"
+msgctxt "field:calendar.event-calendar.category,write_date:"
+msgid "Write Date"
+msgstr "Fecha modificación"
+
+msgctxt "field:calendar.event-calendar.category,write_uid:"
+msgid "Write User"
+msgstr "Usuario modificación"
+
+msgctxt "field:calendar.event.alarm,calendar_alarm:"
 msgid "Calendar Alarm"
 msgstr "Alarma del calendario"
 
-msgctxt "field:calendar.event.alarm,event:0"
+msgctxt "field:calendar.event.alarm,create_date:"
+msgid "Create Date"
+msgstr "Fecha creación"
+
+msgctxt "field:calendar.event.alarm,create_uid:"
+msgid "Create User"
+msgstr "Usuario creación"
+
+msgctxt "field:calendar.event.alarm,event:"
 msgid "Event"
 msgstr "Evento"
 
-msgctxt "field:calendar.event.alarm,rec_name:0"
+msgctxt "field:calendar.event.alarm,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.event.alarm,rec_name:"
 msgid "Name"
 msgstr "Nombre"
 
-msgctxt "field:calendar.event.attendee,calendar_attendee:0"
+msgctxt "field:calendar.event.alarm,write_date:"
+msgid "Write Date"
+msgstr "Fecha modificación"
+
+msgctxt "field:calendar.event.alarm,write_uid:"
+msgid "Write User"
+msgstr "Usuario modificación"
+
+msgctxt "field:calendar.event.attendee,calendar_attendee:"
 msgid "Calendar Attendee"
 msgstr "Calendario de asistentes"
 
-msgctxt "field:calendar.event.attendee,event:0"
+msgctxt "field:calendar.event.attendee,create_date:"
+msgid "Create Date"
+msgstr "Fecha creación"
+
+msgctxt "field:calendar.event.attendee,create_uid:"
+msgid "Create User"
+msgstr "Usuario creación"
+
+msgctxt "field:calendar.event.attendee,event:"
 msgid "Event"
 msgstr "Evento"
 
-msgctxt "field:calendar.event.attendee,rec_name:0"
+msgctxt "field:calendar.event.attendee,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.event.attendee,rec_name:"
 msgid "Name"
 msgstr "Nombre"
 
-msgctxt "field:calendar.event.exdate,calendar_date:0"
+msgctxt "field:calendar.event.attendee,write_date:"
+msgid "Write Date"
+msgstr "Fecha modificación"
+
+msgctxt "field:calendar.event.attendee,write_uid:"
+msgid "Write User"
+msgstr "Usuario modificación"
+
+msgctxt "field:calendar.event.exdate,calendar_date:"
 msgid "Calendar Date"
-msgstr ""
+msgstr "Fecha calendario"
+
+msgctxt "field:calendar.event.exdate,create_date:"
+msgid "Create Date"
+msgstr "Fecha creación"
 
-msgctxt "field:calendar.event.exdate,event:0"
+msgctxt "field:calendar.event.exdate,create_uid:"
+msgid "Create User"
+msgstr "Usuario creación"
+
+msgctxt "field:calendar.event.exdate,event:"
 msgid "Event"
 msgstr "Evento"
 
-msgctxt "field:calendar.event.exdate,rec_name:0"
+msgctxt "field:calendar.event.exdate,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.event.exdate,rec_name:"
 msgid "Name"
 msgstr "Nombre"
 
-msgctxt "field:calendar.event.exrule,calendar_rrule:0"
+msgctxt "field:calendar.event.exdate,write_date:"
+msgid "Write Date"
+msgstr "Fecha modificación"
+
+msgctxt "field:calendar.event.exdate,write_uid:"
+msgid "Write User"
+msgstr "Usuario modificación"
+
+msgctxt "field:calendar.event.exrule,calendar_rrule:"
 msgid "Calendar RRule"
 msgstr "Regla de recurrencia"
 
-msgctxt "field:calendar.event.exrule,event:0"
+msgctxt "field:calendar.event.exrule,create_date:"
+msgid "Create Date"
+msgstr "Fecha creación"
+
+msgctxt "field:calendar.event.exrule,create_uid:"
+msgid "Create User"
+msgstr "Usuario creación"
+
+msgctxt "field:calendar.event.exrule,event:"
 msgid "Event"
 msgstr "Evento"
 
-msgctxt "field:calendar.event.exrule,rec_name:0"
+msgctxt "field:calendar.event.exrule,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.event.exrule,rec_name:"
 msgid "Name"
 msgstr "Nombre"
 
-msgctxt "field:calendar.event.rdate,calendar_date:0"
+msgctxt "field:calendar.event.exrule,write_date:"
+msgid "Write Date"
+msgstr "Fecha modificación"
+
+msgctxt "field:calendar.event.exrule,write_uid:"
+msgid "Write User"
+msgstr "Usuario modificación"
+
+msgctxt "field:calendar.event.rdate,calendar_date:"
 msgid "Calendar Date"
-msgstr ""
+msgstr "Fecha calendario"
+
+msgctxt "field:calendar.event.rdate,create_date:"
+msgid "Create Date"
+msgstr "Fecha creación"
 
-msgctxt "field:calendar.event.rdate,event:0"
+msgctxt "field:calendar.event.rdate,create_uid:"
+msgid "Create User"
+msgstr "Usuario creación"
+
+msgctxt "field:calendar.event.rdate,event:"
 msgid "Event"
 msgstr "Evento"
 
-msgctxt "field:calendar.event.rdate,rec_name:0"
+msgctxt "field:calendar.event.rdate,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.event.rdate,rec_name:"
 msgid "Name"
 msgstr "Nombre"
 
-msgctxt "field:calendar.event.rrule,calendar_rrule:0"
+msgctxt "field:calendar.event.rdate,write_date:"
+msgid "Write Date"
+msgstr "Fecha modificación"
+
+msgctxt "field:calendar.event.rdate,write_uid:"
+msgid "Write User"
+msgstr "Usuario modificación"
+
+msgctxt "field:calendar.event.rrule,calendar_rrule:"
 msgid "Calendar RRule"
 msgstr "Regla de recurrencia"
 
-msgctxt "field:calendar.event.rrule,event:0"
+msgctxt "field:calendar.event.rrule,create_date:"
+msgid "Create Date"
+msgstr "Fecha creación"
+
+msgctxt "field:calendar.event.rrule,create_uid:"
+msgid "Create User"
+msgstr "Usuario creación"
+
+msgctxt "field:calendar.event.rrule,event:"
 msgid "Event"
 msgstr "Evento"
 
-msgctxt "field:calendar.event.rrule,rec_name:0"
+msgctxt "field:calendar.event.rrule,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.event.rrule,rec_name:"
 msgid "Name"
 msgstr "Nombre"
 
-msgctxt "field:calendar.location,name:0"
+msgctxt "field:calendar.event.rrule,write_date:"
+msgid "Write Date"
+msgstr "Fecha modificación"
+
+msgctxt "field:calendar.event.rrule,write_uid:"
+msgid "Write User"
+msgstr "Usuario modificación"
+
+msgctxt "field:calendar.location,create_date:"
+msgid "Create Date"
+msgstr "Fecha creación"
+
+msgctxt "field:calendar.location,create_uid:"
+msgid "Create User"
+msgstr "Usuario creación"
+
+msgctxt "field:calendar.location,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.location,name:"
 msgid "Name"
 msgstr "Nombre"
 
-msgctxt "field:calendar.location,rec_name:0"
+msgctxt "field:calendar.location,rec_name:"
 msgid "Name"
 msgstr "Nombre"
 
-msgctxt "field:calendar.rrule,byday:0"
+msgctxt "field:calendar.location,write_date:"
+msgid "Write Date"
+msgstr "Fecha modificación"
+
+msgctxt "field:calendar.location,write_uid:"
+msgid "Write User"
+msgstr "Usuario modificación"
+
+msgctxt "field:calendar.rrule,byday:"
 msgid "By Day"
 msgstr "Por día"
 
-msgctxt "field:calendar.rrule,byhour:0"
+msgctxt "field:calendar.rrule,byhour:"
 msgid "By Hour"
 msgstr "Por hora"
 
-msgctxt "field:calendar.rrule,byminute:0"
+msgctxt "field:calendar.rrule,byminute:"
 msgid "By Minute"
 msgstr "Por minuto"
 
-msgctxt "field:calendar.rrule,bymonth:0"
+msgctxt "field:calendar.rrule,bymonth:"
 msgid "By Month"
 msgstr "Por mes"
 
-msgctxt "field:calendar.rrule,bymonthday:0"
+msgctxt "field:calendar.rrule,bymonthday:"
 msgid "By Month Day"
 msgstr "Por día del mes"
 
-msgctxt "field:calendar.rrule,bysecond:0"
+msgctxt "field:calendar.rrule,bysecond:"
 msgid "By Second"
 msgstr "Por segundo"
 
-msgctxt "field:calendar.rrule,bysetpos:0"
+msgctxt "field:calendar.rrule,bysetpos:"
 msgid "By Position"
 msgstr "Por posición"
 
-msgctxt "field:calendar.rrule,byweekno:0"
+msgctxt "field:calendar.rrule,byweekno:"
 msgid "By Week Number"
-msgstr "Por día de la semana"
+msgstr "Por número de semana"
 
-msgctxt "field:calendar.rrule,byyearday:0"
+msgctxt "field:calendar.rrule,byyearday:"
 msgid "By Year Day"
 msgstr "Por día del año"
 
-msgctxt "field:calendar.rrule,count:0"
+msgctxt "field:calendar.rrule,count:"
 msgid "Count"
 msgstr "Número de veces"
 
-msgctxt "field:calendar.rrule,freq:0"
+msgctxt "field:calendar.rrule,create_date:"
+msgid "Create Date"
+msgstr "Fecha creación"
+
+msgctxt "field:calendar.rrule,create_uid:"
+msgid "Create User"
+msgstr "Usuario creación"
+
+msgctxt "field:calendar.rrule,freq:"
 msgid "Frequency"
 msgstr "Frecuencia"
 
-msgctxt "field:calendar.rrule,interval:0"
+msgctxt "field:calendar.rrule,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.rrule,interval:"
 msgid "Interval"
 msgstr "Intervalo"
 
-msgctxt "field:calendar.rrule,rec_name:0"
+msgctxt "field:calendar.rrule,rec_name:"
 msgid "Name"
 msgstr "Nombre"
 
-msgctxt "field:calendar.rrule,until:0"
+msgctxt "field:calendar.rrule,until:"
 msgid "Until Date"
 msgstr "Hasta la fecha"
 
-msgctxt "field:calendar.rrule,until_date:0"
+msgctxt "field:calendar.rrule,until_date:"
 msgid "Is Date"
 msgstr "Es fecha"
 
-msgctxt "field:calendar.rrule,wkst:0"
+msgctxt "field:calendar.rrule,wkst:"
 msgid "Week Day"
 msgstr "Día de la semana"
 
-msgctxt "field:res.user,calendars:0"
+msgctxt "field:calendar.rrule,write_date:"
+msgid "Write Date"
+msgstr "Fecha modificación"
+
+msgctxt "field:calendar.rrule,write_uid:"
+msgid "Write User"
+msgstr "Usuario modificación"
+
+msgctxt "field:res.user,calendars:"
 msgid "Calendars"
 msgstr "Calendarios"
 
-msgctxt "help:calendar.calendar,owner:0"
+msgctxt "help:calendar.calendar,owner:"
 msgid "The user must have an email"
-msgstr "El usuario debe tener un correo electrónico"
+msgstr "El usuario debe tener un correo electrónico."
 
-msgctxt "help:calendar.date,date:0"
+msgctxt "help:calendar.date,date:"
 msgid "Ignore time of field \"Date\", but handle as date only."
-msgstr ""
+msgstr "Ignora la hora del campo \"Fecha\" y trata sólo la fecha."
 
-msgctxt "help:calendar.event,uuid:0"
+msgctxt "help:calendar.event,uuid:"
 msgid "Universally Unique Identifier"
-msgstr "Identificador universal único"
+msgstr "Identificador universal único."
 
-msgctxt "help:calendar.rrule,until_date:0"
+msgctxt "help:calendar.rrule,until_date:"
 msgid "Ignore time of field \"Until Date\", but handle as date only."
-msgstr "Ignora la hora del campo «Hasta la fecha», y trata solo la fecha"
+msgstr "Ignora la hora del campo \"Hasta la fecha\" y trata sólo la fecha."
 
-msgctxt "model:calendar.alarm,name:0"
+msgctxt "model:calendar.alarm,name:"
 msgid "Alarm"
 msgstr "Alarma"
 
-msgctxt "model:calendar.attendee,name:0"
+msgctxt "model:calendar.attendee,name:"
 msgid "Attendee"
 msgstr "Asistentes"
 
-msgctxt "model:calendar.calendar,name:0"
+msgctxt "model:calendar.calendar,name:"
 msgid "Calendar"
 msgstr "Calendario"
 
-msgctxt "model:calendar.calendar-read-res.user,name:0"
+msgctxt "model:calendar.calendar-read-res.user,name:"
 msgid "Calendar - read - User"
-msgstr "Calendario - leer - usuario"
+msgstr "Calendario - leer - Usuario"
 
-msgctxt "model:calendar.calendar-write-res.user,name:0"
+msgctxt "model:calendar.calendar-write-res.user,name:"
 msgid "Calendar - write - User"
-msgstr "Calendario - escribir - usuario"
+msgstr "Calendario - escribir - Usuario"
 
-msgctxt "model:calendar.category,name:0"
+msgctxt "model:calendar.category,name:"
 msgid "Category"
 msgstr "Categoría"
 
-msgctxt "model:calendar.date,name:0"
+msgctxt "model:calendar.date,name:"
 msgid "Calendar Date"
-msgstr ""
+msgstr "Fecha calendario"
 
-msgctxt "model:calendar.event,name:0"
+msgctxt "model:calendar.event,name:"
 msgid "Event"
 msgstr "Evento"
 
-msgctxt "model:calendar.event-calendar.category,name:0"
+msgctxt "model:calendar.event-calendar.category,name:"
 msgid "Event - Category"
 msgstr "Evento - Categoría"
 
-msgctxt "model:calendar.event.alarm,name:0"
+msgctxt "model:calendar.event.alarm,name:"
 msgid "Alarm"
 msgstr "Alarma"
 
-msgctxt "model:calendar.event.attendee,name:0"
+msgctxt "model:calendar.event.attendee,name:"
 msgid "Attendee"
 msgstr "Asistentes"
 
-msgctxt "model:calendar.event.exdate,name:0"
+msgctxt "model:calendar.event.exdate,name:"
 msgid "Exception Date"
 msgstr "Fecha excluida"
 
-msgctxt "model:calendar.event.exrule,name:0"
+msgctxt "model:calendar.event.exrule,name:"
 msgid "Exception Rule"
 msgstr "Regla de excepción"
 
-msgctxt "model:calendar.event.rdate,name:0"
+msgctxt "model:calendar.event.rdate,name:"
 msgid "Recurrence Date"
 msgstr "Fecha de recurrencia"
 
-msgctxt "model:calendar.event.rrule,name:0"
+msgctxt "model:calendar.event.rrule,name:"
 msgid "Recurrence Rule"
 msgstr "Regla de recurrencia"
 
-msgctxt "model:calendar.location,name:0"
+msgctxt "model:calendar.location,name:"
 msgid "Location"
 msgstr "Ubicación"
 
-msgctxt "model:calendar.rrule,name:0"
+msgctxt "model:calendar.rrule,name:"
 msgid "Recurrence Rule"
 msgstr "Regla de recurrencia"
 
@@ -529,15 +866,13 @@ msgctxt "model:ir.action,name:act_event_form"
 msgid "Events"
 msgstr "Eventos"
 
-#, fuzzy
 msgctxt "model:ir.action,name:act_event_form3"
 msgid "Events"
 msgstr "Eventos"
 
-#, fuzzy
 msgctxt "model:ir.ui.menu,name:menu_calendar"
 msgid "Calendar"
-msgstr "Gestión de calendario"
+msgstr "Calendario"
 
 msgctxt "model:ir.ui.menu,name:menu_calendar_form"
 msgid "Calendars"
@@ -551,214 +886,214 @@ msgctxt "model:res.group,name:group_calendar_admin"
 msgid "Calendar Administration"
 msgstr "Administración de calendario"
 
-msgctxt "selection:calendar.attendee,status:0"
+msgctxt "selection:calendar.attendee,status:"
 msgid ""
 msgstr ""
 
-msgctxt "selection:calendar.attendee,status:0"
+msgctxt "selection:calendar.attendee,status:"
 msgid "Accepted"
 msgstr "Aceptada"
 
-msgctxt "selection:calendar.attendee,status:0"
+msgctxt "selection:calendar.attendee,status:"
 msgid "Declined"
-msgstr "Rehusado"
+msgstr "Rehusada"
 
-msgctxt "selection:calendar.attendee,status:0"
+msgctxt "selection:calendar.attendee,status:"
 msgid "Delegated"
 msgstr "Delegada"
 
-msgctxt "selection:calendar.attendee,status:0"
+msgctxt "selection:calendar.attendee,status:"
 msgid "Needs Action"
-msgstr "Necesita una acción"
+msgstr "Necesita acción"
 
-msgctxt "selection:calendar.attendee,status:0"
+msgctxt "selection:calendar.attendee,status:"
 msgid "Tentative"
 msgstr "Tentativa"
 
-msgctxt "selection:calendar.event,classification:0"
+msgctxt "selection:calendar.event,classification:"
 msgid "Confidential"
 msgstr "Confidencial"
 
-msgctxt "selection:calendar.event,classification:0"
+msgctxt "selection:calendar.event,classification:"
 msgid "Private"
 msgstr "Privado"
 
-msgctxt "selection:calendar.event,classification:0"
+msgctxt "selection:calendar.event,classification:"
 msgid "Public"
 msgstr "Público"
 
-msgctxt "selection:calendar.event,status:0"
+msgctxt "selection:calendar.event,status:"
 msgid ""
 msgstr ""
 
-msgctxt "selection:calendar.event,status:0"
+msgctxt "selection:calendar.event,status:"
 msgid "Cancelled"
 msgstr "Cancelado"
 
-msgctxt "selection:calendar.event,status:0"
+msgctxt "selection:calendar.event,status:"
 msgid "Confirmed"
-msgstr "Confirmada"
+msgstr "Confirmado"
 
-msgctxt "selection:calendar.event,status:0"
+msgctxt "selection:calendar.event,status:"
 msgid "Tentative"
 msgstr "Tentativo"
 
-msgctxt "selection:calendar.event,transp:0"
+msgctxt "selection:calendar.event,transp:"
 msgid "Opaque"
 msgstr "Opaco"
 
-msgctxt "selection:calendar.event,transp:0"
+msgctxt "selection:calendar.event,transp:"
 msgid "Transparent"
 msgstr "Transparente"
 
-msgctxt "selection:calendar.rrule,freq:0"
+msgctxt "selection:calendar.rrule,freq:"
 msgid "Daily"
 msgstr "Diariamente"
 
-msgctxt "selection:calendar.rrule,freq:0"
+msgctxt "selection:calendar.rrule,freq:"
 msgid "Hourly"
 msgstr "Cada hora"
 
-msgctxt "selection:calendar.rrule,freq:0"
+msgctxt "selection:calendar.rrule,freq:"
 msgid "Minutely"
 msgstr "Cada minuto"
 
-msgctxt "selection:calendar.rrule,freq:0"
+msgctxt "selection:calendar.rrule,freq:"
 msgid "Monthly"
 msgstr "Mensualmente"
 
-msgctxt "selection:calendar.rrule,freq:0"
+msgctxt "selection:calendar.rrule,freq:"
 msgid "Secondly"
 msgstr "Cada segundo"
 
-msgctxt "selection:calendar.rrule,freq:0"
+msgctxt "selection:calendar.rrule,freq:"
 msgid "Weekly"
 msgstr "Semanalmente"
 
-msgctxt "selection:calendar.rrule,freq:0"
+msgctxt "selection:calendar.rrule,freq:"
 msgid "Yearly"
 msgstr "Anualmente"
 
-msgctxt "selection:calendar.rrule,wkst:0"
+msgctxt "selection:calendar.rrule,wkst:"
 msgid "Friday"
 msgstr "Viernes"
 
-msgctxt "selection:calendar.rrule,wkst:0"
+msgctxt "selection:calendar.rrule,wkst:"
 msgid "Monday"
 msgstr "Lunes"
 
-msgctxt "selection:calendar.rrule,wkst:0"
+msgctxt "selection:calendar.rrule,wkst:"
 msgid "Saturday"
 msgstr "Sábado"
 
-msgctxt "selection:calendar.rrule,wkst:0"
+msgctxt "selection:calendar.rrule,wkst:"
 msgid "Sunday"
 msgstr "Domingo"
 
-msgctxt "selection:calendar.rrule,wkst:0"
+msgctxt "selection:calendar.rrule,wkst:"
 msgid "Thursday"
 msgstr "Jueves"
 
-msgctxt "selection:calendar.rrule,wkst:0"
+msgctxt "selection:calendar.rrule,wkst:"
 msgid "Tuesday"
 msgstr "Martes"
 
-msgctxt "selection:calendar.rrule,wkst:0"
+msgctxt "selection:calendar.rrule,wkst:"
 msgid "Wednesday"
 msgstr "Miércoles"
 
-msgctxt "view:calendar.calendar:0"
+msgctxt "view:calendar.calendar:"
 msgid "Calendar"
 msgstr "Calendario"
 
-msgctxt "view:calendar.calendar:0"
+msgctxt "view:calendar.calendar:"
 msgid "Calendars"
 msgstr "Calendarios"
 
-msgctxt "view:calendar.calendar:0"
+msgctxt "view:calendar.calendar:"
 msgid "General"
 msgstr "General"
 
-msgctxt "view:calendar.calendar:0"
+msgctxt "view:calendar.calendar:"
 msgid "Security"
 msgstr "Seguridad"
 
-msgctxt "view:calendar.category:0"
+msgctxt "view:calendar.category:"
 msgid "Categories"
 msgstr "Categorías"
 
-msgctxt "view:calendar.category:0"
+msgctxt "view:calendar.category:"
 msgid "Category"
 msgstr "Categoría"
 
-msgctxt "view:calendar.event.attendee:0"
+msgctxt "view:calendar.event.attendee:"
 msgid "Attendee"
 msgstr "Asistentes"
 
-msgctxt "view:calendar.event.attendee:0"
+msgctxt "view:calendar.event.attendee:"
 msgid "Attendees"
 msgstr "Asistentes"
 
-msgctxt "view:calendar.event.exdate:0"
+msgctxt "view:calendar.event.exdate:"
 msgid "Exception Date"
 msgstr "Fecha excluida"
 
-msgctxt "view:calendar.event.exdate:0"
+msgctxt "view:calendar.event.exdate:"
 msgid "Exception Dates"
 msgstr "Fechas excluidas"
 
-msgctxt "view:calendar.event.exrule:0"
+msgctxt "view:calendar.event.exrule:"
 msgid "Exception Rule"
 msgstr "Regla de excepción"
 
-msgctxt "view:calendar.event.exrule:0"
+msgctxt "view:calendar.event.exrule:"
 msgid "Exception Rules"
 msgstr "Reglas de excepciones"
 
-msgctxt "view:calendar.event.rdate:0"
+msgctxt "view:calendar.event.rdate:"
 msgid "Recurrence Date"
 msgstr "Fecha de recurrencia"
 
-msgctxt "view:calendar.event.rdate:0"
+msgctxt "view:calendar.event.rdate:"
 msgid "Recurrence Dates"
 msgstr "Fechas de recurrencia"
 
-msgctxt "view:calendar.event.rrule:0"
+msgctxt "view:calendar.event.rrule:"
 msgid "Recurrence Rule"
 msgstr "Regla de recurrencia"
 
-msgctxt "view:calendar.event.rrule:0"
+msgctxt "view:calendar.event.rrule:"
 msgid "Recurrence Rules"
 msgstr "Reglas de recurrencia"
 
-msgctxt "view:calendar.event:0"
+msgctxt "view:calendar.event:"
 msgid "Attendees"
 msgstr "Asistentes"
 
-msgctxt "view:calendar.event:0"
+msgctxt "view:calendar.event:"
 msgid "Categories"
 msgstr "Categorías"
 
-msgctxt "view:calendar.event:0"
+msgctxt "view:calendar.event:"
 msgid "Event"
 msgstr "Evento"
 
-msgctxt "view:calendar.event:0"
+msgctxt "view:calendar.event:"
 msgid "Events"
 msgstr "Eventos"
 
-msgctxt "view:calendar.event:0"
+msgctxt "view:calendar.event:"
 msgid "General"
 msgstr "General"
 
-msgctxt "view:calendar.event:0"
+msgctxt "view:calendar.event:"
 msgid "Occurences"
 msgstr "Ocurrencias"
 
-msgctxt "view:calendar.location:0"
+msgctxt "view:calendar.location:"
 msgid "Location"
 msgstr "Ubicación"
 
-msgctxt "view:calendar.location:0"
+msgctxt "view:calendar.location:"
 msgid "Locations"
 msgstr "Ubicaciones"
diff --git a/locale/fr_FR.po b/locale/fr_FR.po
index 69bc39e..19822de 100644
--- a/locale/fr_FR.po
+++ b/locale/fr_FR.po
@@ -2,519 +2,923 @@
 msgid ""
 msgstr "Content-Type: text/plain; charset=utf-8\n"
 
-msgctxt "error:calendar.calendar:0"
+msgctxt "error:calendar.calendar:"
 msgid "A user can have only one calendar!"
 msgstr "Un utilisateur ne peut avoir qu'un seul calendrier !"
 
-msgctxt "error:calendar.calendar:0"
+msgctxt "error:calendar.calendar:"
+msgid "A user can have only one calendar!"
+msgstr "Un utilisateur ne peut avoir qu'un seul calendrier !"
+
+msgctxt "error:calendar.calendar:"
+msgid "The name of calendar must be unique!"
+msgstr "Le nom du calendrier doit être unique !"
+
+msgctxt "error:calendar.calendar:"
 msgid "The name of calendar must be unique!"
 msgstr "Le nom du calendrier doit être unique !"
 
-msgctxt "error:calendar.category:0"
+msgctxt "error:calendar.category:"
 msgid "The name of calendar category must be unique!"
 msgstr "Le nom de la catégorie de calendrier doit être unique"
 
-msgctxt "error:calendar.event:0"
+msgctxt "error:calendar.category:"
+msgid "The name of calendar category must be unique!"
+msgstr "Le nom de la catégorie de calendrier doit être unique"
+
+msgctxt "error:calendar.event:"
 msgid "Recurrence can not be recurrent!"
 msgstr "Une récurrence ne peut pas être récurrente !"
 
-msgctxt "error:calendar.event:0"
+msgctxt "error:calendar.event:"
+msgid "Recurrence can not be recurrent!"
+msgstr "Une récurrence ne peut pas être récurrente !"
+
+msgctxt "error:calendar.event:"
+msgid "UUID and recurrence must be unique in a calendar!"
+msgstr "UUID et récurrence doivent être uniques sur un calendrier !"
+
+msgctxt "error:calendar.event:"
 msgid "UUID and recurrence must be unique in a calendar!"
 msgstr "UUID et récurrence doivent être uniques sur un calendrier !"
 
-msgctxt "error:calendar.location:0"
+msgctxt "error:calendar.location:"
 msgid "The name of calendar location must be unique!"
 msgstr "Le nom de l'emplacement doit être unique !"
 
-msgctxt "error:calendar.rrule:0"
+msgctxt "error:calendar.location:"
+msgid "The name of calendar location must be unique!"
+msgstr "Le nom de l'emplacement doit être unique !"
+
+msgctxt "error:calendar.rrule:"
 msgid "Invalid \"By Day\""
 msgstr "\"Par jour\" invalide"
 
-msgctxt "error:calendar.rrule:0"
+msgctxt "error:calendar.rrule:"
+msgid "Invalid \"By Day\""
+msgstr "\"Par jour\" invalide"
+
+msgctxt "error:calendar.rrule:"
+msgid "Invalid \"By Hour\""
+msgstr "\"Par heure\" invalide"
+
+msgctxt "error:calendar.rrule:"
 msgid "Invalid \"By Hour\""
 msgstr "\"Par heure\" invalide"
 
-msgctxt "error:calendar.rrule:0"
+msgctxt "error:calendar.rrule:"
 msgid "Invalid \"By Minute\""
 msgstr "\"Par minute\" invalide"
 
-msgctxt "error:calendar.rrule:0"
+msgctxt "error:calendar.rrule:"
+msgid "Invalid \"By Minute\""
+msgstr "\"Par minute\" invalide"
+
+msgctxt "error:calendar.rrule:"
+msgid "Invalid \"By Month Day\""
+msgstr "\"Par jour du mois\" invalide"
+
+msgctxt "error:calendar.rrule:"
 msgid "Invalid \"By Month Day\""
 msgstr "\"Par jour du mois\" invalide"
 
-msgctxt "error:calendar.rrule:0"
+msgctxt "error:calendar.rrule:"
+msgid "Invalid \"By Month\""
+msgstr "\"Par mois\" invalide"
+
+msgctxt "error:calendar.rrule:"
 msgid "Invalid \"By Month\""
 msgstr "\"Par mois\" invalide"
 
-msgctxt "error:calendar.rrule:0"
+msgctxt "error:calendar.rrule:"
 msgid "Invalid \"By Position\""
 msgstr "\"Par position\" invalide"
 
-msgctxt "error:calendar.rrule:0"
+msgctxt "error:calendar.rrule:"
+msgid "Invalid \"By Position\""
+msgstr "\"Par position\" invalide"
+
+msgctxt "error:calendar.rrule:"
 msgid "Invalid \"By Second\""
 msgstr "\"Par seconde\" invalide"
 
-msgctxt "error:calendar.rrule:0"
+msgctxt "error:calendar.rrule:"
+msgid "Invalid \"By Second\""
+msgstr "\"Par seconde\" invalide"
+
+msgctxt "error:calendar.rrule:"
+msgid "Invalid \"By Week Number\""
+msgstr "\"Par jour de la semaine\" invalide"
+
+msgctxt "error:calendar.rrule:"
 msgid "Invalid \"By Week Number\""
 msgstr "\"Par jour de la semaine\" invalide"
 
-msgctxt "error:calendar.rrule:0"
+msgctxt "error:calendar.rrule:"
 msgid "Invalid \"By Year Day\""
 msgstr "\"Par jour de l'année\" invalide"
 
-msgctxt "error:calendar.rrule:0"
+msgctxt "error:calendar.rrule:"
+msgid "Invalid \"By Year Day\""
+msgstr "\"Par jour de l'année\" invalide"
+
+msgctxt "error:calendar.rrule:"
+msgid "Only one of \"until\" and \"count\" can be set!"
+msgstr "\"Date de fin\" et \"Répétitions\" ne peuvent être remplis en même temps !"
+
+msgctxt "error:calendar.rrule:"
 msgid "Only one of \"until\" and \"count\" can be set!"
 msgstr "\"Date de fin\" et \"Répétitions\" ne peuvent être remplis en même temps !"
 
-msgctxt "field:calendar.alarm,rec_name:0"
+msgctxt "field:calendar.alarm,create_date:"
+msgid "Create Date"
+msgstr "Date de création"
+
+msgctxt "field:calendar.alarm,create_uid:"
+msgid "Create User"
+msgstr "Créé par"
+
+msgctxt "field:calendar.alarm,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.alarm,rec_name:"
 msgid "Name"
 msgstr "Nom"
 
-msgctxt "field:calendar.alarm,valarm:0"
+msgctxt "field:calendar.alarm,valarm:"
 msgid "valarm"
 msgstr "valarm"
 
-msgctxt "field:calendar.attendee,attendee:0"
+msgctxt "field:calendar.alarm,write_date:"
+msgid "Write Date"
+msgstr "Date de mise à jour"
+
+msgctxt "field:calendar.alarm,write_uid:"
+msgid "Write User"
+msgstr "Mis à jour par"
+
+msgctxt "field:calendar.attendee,attendee:"
 msgid "attendee"
 msgstr "participant"
 
-msgctxt "field:calendar.attendee,email:0"
+msgctxt "field:calendar.attendee,create_date:"
+msgid "Create Date"
+msgstr "Date de création"
+
+msgctxt "field:calendar.attendee,create_uid:"
+msgid "Create User"
+msgstr "Créé par"
+
+msgctxt "field:calendar.attendee,email:"
 msgid "Email"
 msgstr "E-mail"
 
-msgctxt "field:calendar.attendee,rec_name:0"
+msgctxt "field:calendar.attendee,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.attendee,rec_name:"
 msgid "Name"
 msgstr "Nom"
 
-msgctxt "field:calendar.attendee,status:0"
+msgctxt "field:calendar.attendee,status:"
 msgid "Participation Status"
 msgstr "Statut de participation"
 
-msgctxt "field:calendar.calendar,description:0"
+msgctxt "field:calendar.attendee,write_date:"
+msgid "Write Date"
+msgstr "Date de mise à jour"
+
+msgctxt "field:calendar.attendee,write_uid:"
+msgid "Write User"
+msgstr "Mis à jour par"
+
+msgctxt "field:calendar.calendar,create_date:"
+msgid "Create Date"
+msgstr "Date de création"
+
+msgctxt "field:calendar.calendar,create_uid:"
+msgid "Create User"
+msgstr "Créé par"
+
+msgctxt "field:calendar.calendar,description:"
 msgid "Description"
 msgstr "Description"
 
-msgctxt "field:calendar.calendar,name:0"
+msgctxt "field:calendar.calendar,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.calendar,name:"
 msgid "Name"
 msgstr "Nom"
 
-msgctxt "field:calendar.calendar,owner:0"
+msgctxt "field:calendar.calendar,owner:"
 msgid "Owner"
 msgstr "Propriétaire"
 
-msgctxt "field:calendar.calendar,read_users:0"
+msgctxt "field:calendar.calendar,read_users:"
 msgid "Read Users"
 msgstr "Utilisateurs en lecture"
 
-msgctxt "field:calendar.calendar,rec_name:0"
+msgctxt "field:calendar.calendar,rec_name:"
 msgid "Name"
 msgstr "Nom"
 
-msgctxt "field:calendar.calendar,write_users:0"
+msgctxt "field:calendar.calendar,write_date:"
+msgid "Write Date"
+msgstr "Date de mise à jour"
+
+msgctxt "field:calendar.calendar,write_uid:"
+msgid "Write User"
+msgstr "Mis à jour par"
+
+msgctxt "field:calendar.calendar,write_users:"
 msgid "Write Users"
 msgstr "Utilisateurs en écriture"
 
-msgctxt "field:calendar.calendar-read-res.user,calendar:0"
+msgctxt "field:calendar.calendar-read-res.user,calendar:"
 msgid "Calendar"
 msgstr "Calendrier"
 
-msgctxt "field:calendar.calendar-read-res.user,rec_name:0"
+msgctxt "field:calendar.calendar-read-res.user,create_date:"
+msgid "Create Date"
+msgstr "Date de création"
+
+msgctxt "field:calendar.calendar-read-res.user,create_uid:"
+msgid "Create User"
+msgstr "Créé par"
+
+msgctxt "field:calendar.calendar-read-res.user,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.calendar-read-res.user,rec_name:"
 msgid "Name"
 msgstr "Nom"
 
-msgctxt "field:calendar.calendar-read-res.user,user:0"
+msgctxt "field:calendar.calendar-read-res.user,user:"
 msgid "User"
 msgstr "Utilisateur"
 
-msgctxt "field:calendar.calendar-write-res.user,calendar:0"
+msgctxt "field:calendar.calendar-read-res.user,write_date:"
+msgid "Write Date"
+msgstr "Date de mise à jour"
+
+msgctxt "field:calendar.calendar-read-res.user,write_uid:"
+msgid "Write User"
+msgstr "Mis à jour par"
+
+msgctxt "field:calendar.calendar-write-res.user,calendar:"
 msgid "Calendar"
 msgstr "Calendrier"
 
-msgctxt "field:calendar.calendar-write-res.user,rec_name:0"
+msgctxt "field:calendar.calendar-write-res.user,create_date:"
+msgid "Create Date"
+msgstr "Date de création"
+
+msgctxt "field:calendar.calendar-write-res.user,create_uid:"
+msgid "Create User"
+msgstr "Créé par"
+
+msgctxt "field:calendar.calendar-write-res.user,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.calendar-write-res.user,rec_name:"
 msgid "Name"
 msgstr "Nom"
 
-msgctxt "field:calendar.calendar-write-res.user,user:0"
+msgctxt "field:calendar.calendar-write-res.user,user:"
 msgid "User"
 msgstr "Utilisateur"
 
-msgctxt "field:calendar.category,name:0"
+msgctxt "field:calendar.calendar-write-res.user,write_date:"
+msgid "Write Date"
+msgstr "Date de mise à jour"
+
+msgctxt "field:calendar.calendar-write-res.user,write_uid:"
+msgid "Write User"
+msgstr "Mis à jour par"
+
+msgctxt "field:calendar.category,create_date:"
+msgid "Create Date"
+msgstr "Date de création"
+
+msgctxt "field:calendar.category,create_uid:"
+msgid "Create User"
+msgstr "Créé par"
+
+msgctxt "field:calendar.category,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.category,name:"
 msgid "Name"
 msgstr "Nom"
 
-msgctxt "field:calendar.category,rec_name:0"
+msgctxt "field:calendar.category,rec_name:"
 msgid "Name"
 msgstr "Nom"
 
-msgctxt "field:calendar.date,date:0"
+msgctxt "field:calendar.category,write_date:"
+msgid "Write Date"
+msgstr "Date de mise à jour"
+
+msgctxt "field:calendar.category,write_uid:"
+msgid "Write User"
+msgstr "Mis à jour par"
+
+msgctxt "field:calendar.date,create_date:"
+msgid "Create Date"
+msgstr "Date de création"
+
+msgctxt "field:calendar.date,create_uid:"
+msgid "Create User"
+msgstr "Créé par"
+
+msgctxt "field:calendar.date,date:"
 msgid "Is Date"
 msgstr "Est une date"
 
-msgctxt "field:calendar.date,datetime:0"
+msgctxt "field:calendar.date,datetime:"
 msgid "Date"
 msgstr "Date"
 
-msgctxt "field:calendar.date,rec_name:0"
+msgctxt "field:calendar.date,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.date,rec_name:"
 msgid "Name"
 msgstr "Nom"
 
-msgctxt "field:calendar.event,alarms:0"
+msgctxt "field:calendar.date,write_date:"
+msgid "Write Date"
+msgstr "Date de mise à jour"
+
+msgctxt "field:calendar.date,write_uid:"
+msgid "Write User"
+msgstr "Mis à jour par"
+
+msgctxt "field:calendar.event,alarms:"
 msgid "Alarms"
 msgstr "Alarmes"
 
-msgctxt "field:calendar.event,all_day:0"
+msgctxt "field:calendar.event,all_day:"
 msgid "All Day"
 msgstr "Toute la journée"
 
-msgctxt "field:calendar.event,attendees:0"
+msgctxt "field:calendar.event,attendees:"
 msgid "Attendees"
 msgstr "Participants"
 
-msgctxt "field:calendar.event,calendar:0"
+msgctxt "field:calendar.event,calendar:"
 msgid "Calendar"
 msgstr "Calendrier"
 
-msgctxt "field:calendar.event,calendar_owner:0"
+msgctxt "field:calendar.event,calendar_owner:"
 msgid "Owner"
 msgstr "Propriétaire"
 
-msgctxt "field:calendar.event,calendar_read_users:0"
+msgctxt "field:calendar.event,calendar_read_users:"
 msgid "Read Users"
 msgstr "Utilisateurs en lecture"
 
-msgctxt "field:calendar.event,calendar_write_users:0"
+msgctxt "field:calendar.event,calendar_write_users:"
 msgid "Write Users"
 msgstr "Utilisateurs en écriture"
 
-msgctxt "field:calendar.event,categories:0"
+msgctxt "field:calendar.event,categories:"
 msgid "Categories"
 msgstr "Catégories"
 
-msgctxt "field:calendar.event,classification:0"
+msgctxt "field:calendar.event,classification:"
 msgid "Classification"
 msgstr "Classification"
 
-msgctxt "field:calendar.event,description:0"
+msgctxt "field:calendar.event,create_date:"
+msgid "Create Date"
+msgstr "Date de création"
+
+msgctxt "field:calendar.event,create_uid:"
+msgid "Create User"
+msgstr "Créé par"
+
+msgctxt "field:calendar.event,description:"
 msgid "Description"
 msgstr "Description"
 
-msgctxt "field:calendar.event,dtend:0"
+msgctxt "field:calendar.event,dtend:"
 msgid "End Date"
 msgstr "Date de fin"
 
-msgctxt "field:calendar.event,dtstart:0"
+msgctxt "field:calendar.event,dtstart:"
 msgid "Start Date"
 msgstr "Date de début"
 
-msgctxt "field:calendar.event,exdates:0"
+msgctxt "field:calendar.event,exdates:"
 msgid "Exception Dates"
 msgstr "Dates d'exception"
 
-msgctxt "field:calendar.event,exrules:0"
+msgctxt "field:calendar.event,exrules:"
 msgid "Exception Rules"
 msgstr "Règles d'exception"
 
-msgctxt "field:calendar.event,location:0"
+msgctxt "field:calendar.event,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.event,location:"
 msgid "Location"
 msgstr "Emplacement"
 
-msgctxt "field:calendar.event,occurences:0"
+msgctxt "field:calendar.event,occurences:"
 msgid "Occurences"
 msgstr "Occurrences"
 
-msgctxt "field:calendar.event,organizer:0"
+msgctxt "field:calendar.event,organizer:"
 msgid "Organizer"
 msgstr "Organisateur"
 
-msgctxt "field:calendar.event,parent:0"
+msgctxt "field:calendar.event,parent:"
 msgid "Parent"
 msgstr "Parent"
 
-msgctxt "field:calendar.event,rdates:0"
+msgctxt "field:calendar.event,rdates:"
 msgid "Recurrence Dates"
 msgstr "Dates de récurrence"
 
-msgctxt "field:calendar.event,rec_name:0"
+msgctxt "field:calendar.event,rec_name:"
 msgid "Name"
 msgstr "Nom"
 
-msgctxt "field:calendar.event,recurrence:0"
+msgctxt "field:calendar.event,recurrence:"
 msgid "Recurrence"
 msgstr "Récurrence"
 
-msgctxt "field:calendar.event,rrules:0"
+msgctxt "field:calendar.event,rrules:"
 msgid "Recurrence Rules"
 msgstr "Règles de récurrence"
 
-msgctxt "field:calendar.event,sequence:0"
+msgctxt "field:calendar.event,sequence:"
 msgid "Sequence"
 msgstr "Séquence"
 
-msgctxt "field:calendar.event,status:0"
+msgctxt "field:calendar.event,status:"
 msgid "Status"
 msgstr "Statut"
 
-msgctxt "field:calendar.event,summary:0"
+msgctxt "field:calendar.event,summary:"
 msgid "Summary"
 msgstr "Résumé"
 
-msgctxt "field:calendar.event,timezone:0"
+msgctxt "field:calendar.event,timezone:"
 msgid "Timezone"
 msgstr "Fuseau Horaire"
 
-msgctxt "field:calendar.event,transp:0"
+msgctxt "field:calendar.event,transp:"
 msgid "Time Transparency"
 msgstr "Transparence"
 
-msgctxt "field:calendar.event,uuid:0"
+msgctxt "field:calendar.event,uuid:"
 msgid "UUID"
 msgstr "UUID"
 
-msgctxt "field:calendar.event,vevent:0"
+msgctxt "field:calendar.event,vevent:"
 msgid "vevent"
 msgstr "vevent"
 
-msgctxt "field:calendar.event-calendar.category,category:0"
+msgctxt "field:calendar.event,write_date:"
+msgid "Write Date"
+msgstr "Date de mise à jour"
+
+msgctxt "field:calendar.event,write_uid:"
+msgid "Write User"
+msgstr "Mis à jour par"
+
+msgctxt "field:calendar.event-calendar.category,category:"
 msgid "Category"
 msgstr "Catégorie"
 
-msgctxt "field:calendar.event-calendar.category,event:0"
+msgctxt "field:calendar.event-calendar.category,create_date:"
+msgid "Create Date"
+msgstr "Date de création"
+
+msgctxt "field:calendar.event-calendar.category,create_uid:"
+msgid "Create User"
+msgstr "Créé par"
+
+msgctxt "field:calendar.event-calendar.category,event:"
 msgid "Event"
 msgstr "Événement"
 
-msgctxt "field:calendar.event-calendar.category,rec_name:0"
+msgctxt "field:calendar.event-calendar.category,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.event-calendar.category,rec_name:"
 msgid "Name"
 msgstr "Nom"
 
-msgctxt "field:calendar.event.alarm,calendar_alarm:0"
+msgctxt "field:calendar.event-calendar.category,write_date:"
+msgid "Write Date"
+msgstr "Date de mise à jour"
+
+msgctxt "field:calendar.event-calendar.category,write_uid:"
+msgid "Write User"
+msgstr "Mis à jour par"
+
+msgctxt "field:calendar.event.alarm,calendar_alarm:"
 msgid "Calendar Alarm"
 msgstr "Alarme calendrier"
 
-msgctxt "field:calendar.event.alarm,event:0"
+msgctxt "field:calendar.event.alarm,create_date:"
+msgid "Create Date"
+msgstr "Date de création"
+
+msgctxt "field:calendar.event.alarm,create_uid:"
+msgid "Create User"
+msgstr "Créé par"
+
+msgctxt "field:calendar.event.alarm,event:"
 msgid "Event"
 msgstr "Événement"
 
-msgctxt "field:calendar.event.alarm,rec_name:0"
+msgctxt "field:calendar.event.alarm,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.event.alarm,rec_name:"
 msgid "Name"
 msgstr "Nom"
 
-msgctxt "field:calendar.event.attendee,calendar_attendee:0"
+msgctxt "field:calendar.event.alarm,write_date:"
+msgid "Write Date"
+msgstr "Date de mise à jour"
+
+msgctxt "field:calendar.event.alarm,write_uid:"
+msgid "Write User"
+msgstr "Mis à jour par"
+
+msgctxt "field:calendar.event.attendee,calendar_attendee:"
 msgid "Calendar Attendee"
 msgstr "Participant calendrier"
 
-msgctxt "field:calendar.event.attendee,event:0"
+msgctxt "field:calendar.event.attendee,create_date:"
+msgid "Create Date"
+msgstr "Date de création"
+
+msgctxt "field:calendar.event.attendee,create_uid:"
+msgid "Create User"
+msgstr "Créé par"
+
+msgctxt "field:calendar.event.attendee,event:"
 msgid "Event"
 msgstr "Événement"
 
-msgctxt "field:calendar.event.attendee,rec_name:0"
+msgctxt "field:calendar.event.attendee,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.event.attendee,rec_name:"
 msgid "Name"
 msgstr "Nom"
 
-msgctxt "field:calendar.event.exdate,calendar_date:0"
+msgctxt "field:calendar.event.attendee,write_date:"
+msgid "Write Date"
+msgstr "Date de mise à jour"
+
+msgctxt "field:calendar.event.attendee,write_uid:"
+msgid "Write User"
+msgstr "Mis à jour par"
+
+msgctxt "field:calendar.event.exdate,calendar_date:"
 msgid "Calendar Date"
 msgstr "Date calendrier"
 
-msgctxt "field:calendar.event.exdate,event:0"
+msgctxt "field:calendar.event.exdate,create_date:"
+msgid "Create Date"
+msgstr "Date de création"
+
+msgctxt "field:calendar.event.exdate,create_uid:"
+msgid "Create User"
+msgstr "Créé par"
+
+msgctxt "field:calendar.event.exdate,event:"
 msgid "Event"
 msgstr "Événement"
 
-msgctxt "field:calendar.event.exdate,rec_name:0"
+msgctxt "field:calendar.event.exdate,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.event.exdate,rec_name:"
 msgid "Name"
 msgstr "Nom"
 
-msgctxt "field:calendar.event.exrule,calendar_rrule:0"
+msgctxt "field:calendar.event.exdate,write_date:"
+msgid "Write Date"
+msgstr "Date de mise à jour"
+
+msgctxt "field:calendar.event.exdate,write_uid:"
+msgid "Write User"
+msgstr "Mis à jour par"
+
+msgctxt "field:calendar.event.exrule,calendar_rrule:"
 msgid "Calendar RRule"
 msgstr "Règle de récurrence"
 
-msgctxt "field:calendar.event.exrule,event:0"
+msgctxt "field:calendar.event.exrule,create_date:"
+msgid "Create Date"
+msgstr "Date de création"
+
+msgctxt "field:calendar.event.exrule,create_uid:"
+msgid "Create User"
+msgstr "Créé par"
+
+msgctxt "field:calendar.event.exrule,event:"
 msgid "Event"
 msgstr "Événement"
 
-msgctxt "field:calendar.event.exrule,rec_name:0"
+msgctxt "field:calendar.event.exrule,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.event.exrule,rec_name:"
 msgid "Name"
 msgstr "Nom"
 
-msgctxt "field:calendar.event.rdate,calendar_date:0"
+msgctxt "field:calendar.event.exrule,write_date:"
+msgid "Write Date"
+msgstr "Date de mise à jour"
+
+msgctxt "field:calendar.event.exrule,write_uid:"
+msgid "Write User"
+msgstr "Mis à jour par"
+
+msgctxt "field:calendar.event.rdate,calendar_date:"
 msgid "Calendar Date"
 msgstr "Date calendrier"
 
-msgctxt "field:calendar.event.rdate,event:0"
+msgctxt "field:calendar.event.rdate,create_date:"
+msgid "Create Date"
+msgstr "Date de création"
+
+msgctxt "field:calendar.event.rdate,create_uid:"
+msgid "Create User"
+msgstr "Créé par"
+
+msgctxt "field:calendar.event.rdate,event:"
 msgid "Event"
 msgstr "Événement"
 
-msgctxt "field:calendar.event.rdate,rec_name:0"
+msgctxt "field:calendar.event.rdate,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.event.rdate,rec_name:"
 msgid "Name"
 msgstr "Nom"
 
-msgctxt "field:calendar.event.rrule,calendar_rrule:0"
+msgctxt "field:calendar.event.rdate,write_date:"
+msgid "Write Date"
+msgstr "Date de mise à jour"
+
+msgctxt "field:calendar.event.rdate,write_uid:"
+msgid "Write User"
+msgstr "Mis à jour par"
+
+msgctxt "field:calendar.event.rrule,calendar_rrule:"
 msgid "Calendar RRule"
 msgstr "Règle de récurrence"
 
-msgctxt "field:calendar.event.rrule,event:0"
+msgctxt "field:calendar.event.rrule,create_date:"
+msgid "Create Date"
+msgstr "Date de création"
+
+msgctxt "field:calendar.event.rrule,create_uid:"
+msgid "Create User"
+msgstr "Créé par"
+
+msgctxt "field:calendar.event.rrule,event:"
 msgid "Event"
 msgstr "Événement"
 
-msgctxt "field:calendar.event.rrule,rec_name:0"
+msgctxt "field:calendar.event.rrule,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.event.rrule,rec_name:"
 msgid "Name"
 msgstr "Nom"
 
-msgctxt "field:calendar.location,name:0"
+msgctxt "field:calendar.event.rrule,write_date:"
+msgid "Write Date"
+msgstr "Date de mise à jour"
+
+msgctxt "field:calendar.event.rrule,write_uid:"
+msgid "Write User"
+msgstr "Mis à jour par"
+
+msgctxt "field:calendar.location,create_date:"
+msgid "Create Date"
+msgstr "Date de création"
+
+msgctxt "field:calendar.location,create_uid:"
+msgid "Create User"
+msgstr "Créé par"
+
+msgctxt "field:calendar.location,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.location,name:"
 msgid "Name"
 msgstr "Nom"
 
-msgctxt "field:calendar.location,rec_name:0"
+msgctxt "field:calendar.location,rec_name:"
 msgid "Name"
 msgstr "Nom"
 
-msgctxt "field:calendar.rrule,byday:0"
+msgctxt "field:calendar.location,write_date:"
+msgid "Write Date"
+msgstr "Date de mise à jour"
+
+msgctxt "field:calendar.location,write_uid:"
+msgid "Write User"
+msgstr "Mis à jour par"
+
+msgctxt "field:calendar.rrule,byday:"
 msgid "By Day"
 msgstr "Par jour"
 
-msgctxt "field:calendar.rrule,byhour:0"
+msgctxt "field:calendar.rrule,byhour:"
 msgid "By Hour"
 msgstr "Par heure"
 
-msgctxt "field:calendar.rrule,byminute:0"
+msgctxt "field:calendar.rrule,byminute:"
 msgid "By Minute"
 msgstr "Par minute"
 
-msgctxt "field:calendar.rrule,bymonth:0"
+msgctxt "field:calendar.rrule,bymonth:"
 msgid "By Month"
 msgstr "Par mois"
 
-msgctxt "field:calendar.rrule,bymonthday:0"
+msgctxt "field:calendar.rrule,bymonthday:"
 msgid "By Month Day"
 msgstr "Par jour du mois"
 
-msgctxt "field:calendar.rrule,bysecond:0"
+msgctxt "field:calendar.rrule,bysecond:"
 msgid "By Second"
 msgstr "Par seconde"
 
-msgctxt "field:calendar.rrule,bysetpos:0"
+msgctxt "field:calendar.rrule,bysetpos:"
 msgid "By Position"
 msgstr "Par position"
 
-msgctxt "field:calendar.rrule,byweekno:0"
+msgctxt "field:calendar.rrule,byweekno:"
 msgid "By Week Number"
 msgstr "Par numéro de semaine"
 
-msgctxt "field:calendar.rrule,byyearday:0"
+msgctxt "field:calendar.rrule,byyearday:"
 msgid "By Year Day"
 msgstr "Par jour de l'année"
 
-msgctxt "field:calendar.rrule,count:0"
+msgctxt "field:calendar.rrule,count:"
 msgid "Count"
 msgstr "Répétitions"
 
-msgctxt "field:calendar.rrule,freq:0"
+msgctxt "field:calendar.rrule,create_date:"
+msgid "Create Date"
+msgstr "Date de création"
+
+msgctxt "field:calendar.rrule,create_uid:"
+msgid "Create User"
+msgstr "Créé par"
+
+msgctxt "field:calendar.rrule,freq:"
 msgid "Frequency"
 msgstr "Fréquence"
 
-msgctxt "field:calendar.rrule,interval:0"
+msgctxt "field:calendar.rrule,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.rrule,interval:"
 msgid "Interval"
 msgstr "Intervalle"
 
-msgctxt "field:calendar.rrule,rec_name:0"
+msgctxt "field:calendar.rrule,rec_name:"
 msgid "Name"
 msgstr "Nom"
 
-msgctxt "field:calendar.rrule,until:0"
+msgctxt "field:calendar.rrule,until:"
 msgid "Until Date"
 msgstr "Date de fin"
 
-msgctxt "field:calendar.rrule,until_date:0"
+msgctxt "field:calendar.rrule,until_date:"
 msgid "Is Date"
 msgstr "Est une date"
 
-msgctxt "field:calendar.rrule,wkst:0"
+msgctxt "field:calendar.rrule,wkst:"
 msgid "Week Day"
 msgstr "Jour de la semaine"
 
-msgctxt "field:res.user,calendars:0"
+msgctxt "field:calendar.rrule,write_date:"
+msgid "Write Date"
+msgstr "Date de mise à jour"
+
+msgctxt "field:calendar.rrule,write_uid:"
+msgid "Write User"
+msgstr "Mis à jour par"
+
+msgctxt "field:res.user,calendars:"
 msgid "Calendars"
 msgstr "Calendriers"
 
-msgctxt "help:calendar.calendar,owner:0"
+msgctxt "help:calendar.calendar,owner:"
 msgid "The user must have an email"
 msgstr "L'utilisateur doit avoir une adresse mail"
 
-msgctxt "help:calendar.date,date:0"
+msgctxt "help:calendar.date,date:"
 msgid "Ignore time of field \"Date\", but handle as date only."
 msgstr "Ignorer l'heure du champ \"Date\" et considérer uniquement la date"
 
-msgctxt "help:calendar.event,uuid:0"
+msgctxt "help:calendar.event,uuid:"
 msgid "Universally Unique Identifier"
 msgstr "Identificateur unique universel"
 
-msgctxt "help:calendar.rrule,until_date:0"
+msgctxt "help:calendar.rrule,until_date:"
 msgid "Ignore time of field \"Until Date\", but handle as date only."
 msgstr "Ignorer l'heure du champ \"Date de fin\" et considérer uniquement la date"
 
-msgctxt "model:calendar.alarm,name:0"
+msgctxt "model:calendar.alarm,name:"
 msgid "Alarm"
 msgstr "Alarme"
 
-msgctxt "model:calendar.attendee,name:0"
+msgctxt "model:calendar.attendee,name:"
 msgid "Attendee"
 msgstr "Participant"
 
-msgctxt "model:calendar.calendar,name:0"
+msgctxt "model:calendar.calendar,name:"
 msgid "Calendar"
 msgstr "Calendrier"
 
-msgctxt "model:calendar.calendar-read-res.user,name:0"
+msgctxt "model:calendar.calendar-read-res.user,name:"
 msgid "Calendar - read - User"
 msgstr "Calendrier - Lecture - Utilisateur"
 
-msgctxt "model:calendar.calendar-write-res.user,name:0"
+msgctxt "model:calendar.calendar-write-res.user,name:"
 msgid "Calendar - write - User"
 msgstr "Calendrier - Écriture - Utilisateur"
 
-msgctxt "model:calendar.category,name:0"
+msgctxt "model:calendar.category,name:"
 msgid "Category"
 msgstr "Catégorie"
 
-msgctxt "model:calendar.date,name:0"
+msgctxt "model:calendar.date,name:"
 msgid "Calendar Date"
 msgstr "Date calendrier"
 
-msgctxt "model:calendar.event,name:0"
+msgctxt "model:calendar.event,name:"
 msgid "Event"
 msgstr "Événement"
 
-msgctxt "model:calendar.event-calendar.category,name:0"
+msgctxt "model:calendar.event-calendar.category,name:"
 msgid "Event - Category"
 msgstr "Évenement - Catégorie"
 
-msgctxt "model:calendar.event.alarm,name:0"
+msgctxt "model:calendar.event.alarm,name:"
 msgid "Alarm"
 msgstr "Alarme"
 
-msgctxt "model:calendar.event.attendee,name:0"
+msgctxt "model:calendar.event.attendee,name:"
 msgid "Attendee"
 msgstr "Participant"
 
-msgctxt "model:calendar.event.exdate,name:0"
+msgctxt "model:calendar.event.exdate,name:"
 msgid "Exception Date"
 msgstr "Date d'exception"
 
-msgctxt "model:calendar.event.exrule,name:0"
+msgctxt "model:calendar.event.exrule,name:"
 msgid "Exception Rule"
 msgstr "Règle d'exception"
 
-msgctxt "model:calendar.event.rdate,name:0"
+msgctxt "model:calendar.event.rdate,name:"
 msgid "Recurrence Date"
 msgstr "Date de récurrence"
 
-msgctxt "model:calendar.event.rrule,name:0"
+msgctxt "model:calendar.event.rrule,name:"
 msgid "Recurrence Rule"
 msgstr "Règle de récurrence"
 
-msgctxt "model:calendar.location,name:0"
+msgctxt "model:calendar.location,name:"
 msgid "Location"
 msgstr "Emplacement"
 
-msgctxt "model:calendar.rrule,name:0"
+msgctxt "model:calendar.rrule,name:"
 msgid "Recurrence Rule"
 msgstr "Règle de récurrence"
 
@@ -546,214 +950,426 @@ msgctxt "model:res.group,name:group_calendar_admin"
 msgid "Calendar Administration"
 msgstr "Administration calendrier"
 
-msgctxt "selection:calendar.attendee,status:0"
+msgctxt "selection:calendar.attendee,status:"
 msgid ""
 msgstr ""
 
-msgctxt "selection:calendar.attendee,status:0"
+msgctxt "selection:calendar.attendee,status:"
+msgid ""
+msgstr ""
+
+msgctxt "selection:calendar.attendee,status:"
+msgid "Accepted"
+msgstr "Accepté"
+
+msgctxt "selection:calendar.attendee,status:"
 msgid "Accepted"
 msgstr "Accepté"
 
-msgctxt "selection:calendar.attendee,status:0"
+msgctxt "selection:calendar.attendee,status:"
+msgid "Declined"
+msgstr "Décliné"
+
+msgctxt "selection:calendar.attendee,status:"
 msgid "Declined"
 msgstr "Décliné"
 
-msgctxt "selection:calendar.attendee,status:0"
+msgctxt "selection:calendar.attendee,status:"
 msgid "Delegated"
 msgstr "Délégué"
 
-msgctxt "selection:calendar.attendee,status:0"
+msgctxt "selection:calendar.attendee,status:"
+msgid "Delegated"
+msgstr "Délégué"
+
+msgctxt "selection:calendar.attendee,status:"
+msgid "Needs Action"
+msgstr "Nécessite une action"
+
+msgctxt "selection:calendar.attendee,status:"
 msgid "Needs Action"
 msgstr "Nécessite une action"
 
-msgctxt "selection:calendar.attendee,status:0"
+msgctxt "selection:calendar.attendee,status:"
+msgid "Tentative"
+msgstr "Tentative"
+
+msgctxt "selection:calendar.attendee,status:"
 msgid "Tentative"
 msgstr "Tentative"
 
-msgctxt "selection:calendar.event,classification:0"
+msgctxt "selection:calendar.event,classification:"
 msgid "Confidential"
 msgstr "Confidentiel"
 
-msgctxt "selection:calendar.event,classification:0"
+msgctxt "selection:calendar.event,classification:"
+msgid "Confidential"
+msgstr "Confidentiel"
+
+msgctxt "selection:calendar.event,classification:"
 msgid "Private"
 msgstr "Privé"
 
-msgctxt "selection:calendar.event,classification:0"
+msgctxt "selection:calendar.event,classification:"
+msgid "Private"
+msgstr "Privé"
+
+msgctxt "selection:calendar.event,classification:"
 msgid "Public"
 msgstr "Publique"
 
-msgctxt "selection:calendar.event,status:0"
+msgctxt "selection:calendar.event,classification:"
+msgid "Public"
+msgstr "Publique"
+
+msgctxt "selection:calendar.event,status:"
 msgid ""
 msgstr ""
 
-msgctxt "selection:calendar.event,status:0"
+msgctxt "selection:calendar.event,status:"
+msgid ""
+msgstr ""
+
+msgctxt "selection:calendar.event,status:"
 msgid "Cancelled"
 msgstr "Annulé"
 
-msgctxt "selection:calendar.event,status:0"
+msgctxt "selection:calendar.event,status:"
+msgid "Cancelled"
+msgstr "Annulé"
+
+msgctxt "selection:calendar.event,status:"
 msgid "Confirmed"
 msgstr "Confirmé"
 
-msgctxt "selection:calendar.event,status:0"
+msgctxt "selection:calendar.event,status:"
+msgid "Confirmed"
+msgstr "Confirmé"
+
+msgctxt "selection:calendar.event,status:"
 msgid "Tentative"
 msgstr "Tentative"
 
-msgctxt "selection:calendar.event,transp:0"
+msgctxt "selection:calendar.event,status:"
+msgid "Tentative"
+msgstr "Tentative"
+
+msgctxt "selection:calendar.event,transp:"
+msgid "Opaque"
+msgstr "Opaque"
+
+msgctxt "selection:calendar.event,transp:"
 msgid "Opaque"
 msgstr "Opaque"
 
-msgctxt "selection:calendar.event,transp:0"
+msgctxt "selection:calendar.event,transp:"
 msgid "Transparent"
 msgstr "transparent"
 
-msgctxt "selection:calendar.rrule,freq:0"
+msgctxt "selection:calendar.event,transp:"
+msgid "Transparent"
+msgstr "transparent"
+
+msgctxt "selection:calendar.rrule,freq:"
 msgid "Daily"
 msgstr "Journalier"
 
-msgctxt "selection:calendar.rrule,freq:0"
+msgctxt "selection:calendar.rrule,freq:"
+msgid "Daily"
+msgstr "Journalier"
+
+msgctxt "selection:calendar.rrule,freq:"
 msgid "Hourly"
 msgstr "Horaire"
 
-msgctxt "selection:calendar.rrule,freq:0"
+msgctxt "selection:calendar.rrule,freq:"
+msgid "Hourly"
+msgstr "Horaire"
+
+msgctxt "selection:calendar.rrule,freq:"
 msgid "Minutely"
 msgstr "Chaque minute"
 
-msgctxt "selection:calendar.rrule,freq:0"
+msgctxt "selection:calendar.rrule,freq:"
+msgid "Minutely"
+msgstr "Chaque minute"
+
+msgctxt "selection:calendar.rrule,freq:"
 msgid "Monthly"
 msgstr "Mensuel"
 
-msgctxt "selection:calendar.rrule,freq:0"
+msgctxt "selection:calendar.rrule,freq:"
+msgid "Monthly"
+msgstr "Mensuel"
+
+msgctxt "selection:calendar.rrule,freq:"
+msgid "Secondly"
+msgstr "Chaque seconde"
+
+msgctxt "selection:calendar.rrule,freq:"
 msgid "Secondly"
 msgstr "Chaque seconde"
 
-msgctxt "selection:calendar.rrule,freq:0"
+msgctxt "selection:calendar.rrule,freq:"
 msgid "Weekly"
 msgstr "hebdomadaire"
 
-msgctxt "selection:calendar.rrule,freq:0"
+msgctxt "selection:calendar.rrule,freq:"
+msgid "Weekly"
+msgstr "hebdomadaire"
+
+msgctxt "selection:calendar.rrule,freq:"
 msgid "Yearly"
 msgstr "Annuel"
 
-msgctxt "selection:calendar.rrule,wkst:0"
+msgctxt "selection:calendar.rrule,freq:"
+msgid "Yearly"
+msgstr "Annuel"
+
+msgctxt "selection:calendar.rrule,wkst:"
+msgid "Friday"
+msgstr "Vendredi"
+
+msgctxt "selection:calendar.rrule,wkst:"
 msgid "Friday"
 msgstr "Vendredi"
 
-msgctxt "selection:calendar.rrule,wkst:0"
+msgctxt "selection:calendar.rrule,wkst:"
 msgid "Monday"
 msgstr "Lundi"
 
-msgctxt "selection:calendar.rrule,wkst:0"
+msgctxt "selection:calendar.rrule,wkst:"
+msgid "Monday"
+msgstr "Lundi"
+
+msgctxt "selection:calendar.rrule,wkst:"
 msgid "Saturday"
 msgstr "Samedi"
 
-msgctxt "selection:calendar.rrule,wkst:0"
+msgctxt "selection:calendar.rrule,wkst:"
+msgid "Saturday"
+msgstr "Samedi"
+
+msgctxt "selection:calendar.rrule,wkst:"
+msgid "Sunday"
+msgstr "Dimanche"
+
+msgctxt "selection:calendar.rrule,wkst:"
 msgid "Sunday"
 msgstr "Dimanche"
 
-msgctxt "selection:calendar.rrule,wkst:0"
+msgctxt "selection:calendar.rrule,wkst:"
 msgid "Thursday"
 msgstr "Jeudi"
 
-msgctxt "selection:calendar.rrule,wkst:0"
+msgctxt "selection:calendar.rrule,wkst:"
+msgid "Thursday"
+msgstr "Jeudi"
+
+msgctxt "selection:calendar.rrule,wkst:"
 msgid "Tuesday"
 msgstr "Mardi"
 
-msgctxt "selection:calendar.rrule,wkst:0"
+msgctxt "selection:calendar.rrule,wkst:"
+msgid "Tuesday"
+msgstr "Mardi"
+
+msgctxt "selection:calendar.rrule,wkst:"
+msgid "Wednesday"
+msgstr "Mercredi"
+
+msgctxt "selection:calendar.rrule,wkst:"
 msgid "Wednesday"
 msgstr "Mercredi"
 
-msgctxt "view:calendar.calendar:0"
+msgctxt "view:calendar.calendar:"
 msgid "Calendar"
 msgstr "Calendrier"
 
-msgctxt "view:calendar.calendar:0"
+msgctxt "view:calendar.calendar:"
+msgid "Calendar"
+msgstr "Calendrier"
+
+msgctxt "view:calendar.calendar:"
+msgid "Calendars"
+msgstr "Calendriers"
+
+msgctxt "view:calendar.calendar:"
 msgid "Calendars"
 msgstr "Calendriers"
 
-msgctxt "view:calendar.calendar:0"
+msgctxt "view:calendar.calendar:"
+msgid "General"
+msgstr "Général"
+
+msgctxt "view:calendar.calendar:"
 msgid "General"
 msgstr "Général"
 
-msgctxt "view:calendar.calendar:0"
+msgctxt "view:calendar.calendar:"
 msgid "Security"
 msgstr "Sécurité"
 
-msgctxt "view:calendar.category:0"
+msgctxt "view:calendar.calendar:"
+msgid "Security"
+msgstr "Sécurité"
+
+msgctxt "view:calendar.category:"
 msgid "Categories"
 msgstr "Catégories"
 
-msgctxt "view:calendar.category:0"
+msgctxt "view:calendar.category:"
+msgid "Categories"
+msgstr "Catégories"
+
+msgctxt "view:calendar.category:"
+msgid "Category"
+msgstr "Catégorie"
+
+msgctxt "view:calendar.category:"
 msgid "Category"
 msgstr "Catégorie"
 
-msgctxt "view:calendar.event.attendee:0"
+msgctxt "view:calendar.event.attendee:"
 msgid "Attendee"
 msgstr "Participant"
 
-msgctxt "view:calendar.event.attendee:0"
+msgctxt "view:calendar.event.attendee:"
+msgid "Attendee"
+msgstr "Participant"
+
+msgctxt "view:calendar.event.attendee:"
 msgid "Attendees"
 msgstr "Participants"
 
-msgctxt "view:calendar.event.exdate:0"
+msgctxt "view:calendar.event.attendee:"
+msgid "Attendees"
+msgstr "Participants"
+
+msgctxt "view:calendar.event.exdate:"
+msgid "Exception Date"
+msgstr "Date d'exception"
+
+msgctxt "view:calendar.event.exdate:"
 msgid "Exception Date"
 msgstr "Date d'exception"
 
-msgctxt "view:calendar.event.exdate:0"
+msgctxt "view:calendar.event.exdate:"
 msgid "Exception Dates"
 msgstr "Dates d'exception"
 
-msgctxt "view:calendar.event.exrule:0"
+msgctxt "view:calendar.event.exdate:"
+msgid "Exception Dates"
+msgstr "Dates d'exception"
+
+msgctxt "view:calendar.event.exrule:"
 msgid "Exception Rule"
 msgstr "Règle d'exception"
 
-msgctxt "view:calendar.event.exrule:0"
+msgctxt "view:calendar.event.exrule:"
+msgid "Exception Rule"
+msgstr "Règle d'exception"
+
+msgctxt "view:calendar.event.exrule:"
+msgid "Exception Rules"
+msgstr "Règles d'exception"
+
+msgctxt "view:calendar.event.exrule:"
 msgid "Exception Rules"
 msgstr "Règles d'exception"
 
-msgctxt "view:calendar.event.rdate:0"
+msgctxt "view:calendar.event.rdate:"
 msgid "Recurrence Date"
 msgstr "Date de récurrence"
 
-msgctxt "view:calendar.event.rdate:0"
+msgctxt "view:calendar.event.rdate:"
+msgid "Recurrence Date"
+msgstr "Date de récurrence"
+
+msgctxt "view:calendar.event.rdate:"
 msgid "Recurrence Dates"
 msgstr "Dates de récurrence"
 
-msgctxt "view:calendar.event.rrule:0"
+msgctxt "view:calendar.event.rdate:"
+msgid "Recurrence Dates"
+msgstr "Dates de récurrence"
+
+msgctxt "view:calendar.event.rrule:"
+msgid "Recurrence Rule"
+msgstr "Règle de récurrence"
+
+msgctxt "view:calendar.event.rrule:"
 msgid "Recurrence Rule"
 msgstr "Règle de récurrence"
 
-msgctxt "view:calendar.event.rrule:0"
+msgctxt "view:calendar.event.rrule:"
 msgid "Recurrence Rules"
 msgstr "Règles de récurrence"
 
-msgctxt "view:calendar.event:0"
+msgctxt "view:calendar.event.rrule:"
+msgid "Recurrence Rules"
+msgstr "Règles de récurrence"
+
+msgctxt "view:calendar.event:"
 msgid "Attendees"
 msgstr "Participants"
 
-msgctxt "view:calendar.event:0"
+msgctxt "view:calendar.event:"
+msgid "Attendees"
+msgstr "Participants"
+
+msgctxt "view:calendar.event:"
+msgid "Categories"
+msgstr "Catégories"
+
+msgctxt "view:calendar.event:"
 msgid "Categories"
 msgstr "Catégories"
 
-msgctxt "view:calendar.event:0"
+msgctxt "view:calendar.event:"
 msgid "Event"
 msgstr "Événement"
 
-msgctxt "view:calendar.event:0"
+msgctxt "view:calendar.event:"
+msgid "Event"
+msgstr "Événement"
+
+msgctxt "view:calendar.event:"
 msgid "Events"
 msgstr "Événements"
 
-msgctxt "view:calendar.event:0"
+msgctxt "view:calendar.event:"
+msgid "Events"
+msgstr "Événements"
+
+msgctxt "view:calendar.event:"
+msgid "General"
+msgstr "Général"
+
+msgctxt "view:calendar.event:"
 msgid "General"
 msgstr "Général"
 
-msgctxt "view:calendar.event:0"
+msgctxt "view:calendar.event:"
 msgid "Occurences"
 msgstr "Occurrences"
 
-msgctxt "view:calendar.location:0"
+msgctxt "view:calendar.event:"
+msgid "Occurences"
+msgstr "Occurrences"
+
+msgctxt "view:calendar.location:"
 msgid "Location"
 msgstr "Emplacement"
 
-msgctxt "view:calendar.location:0"
+msgctxt "view:calendar.location:"
+msgid "Location"
+msgstr "Emplacement"
+
+msgctxt "view:calendar.location:"
+msgid "Locations"
+msgstr "Emplacements"
+
+msgctxt "view:calendar.location:"
 msgid "Locations"
 msgstr "Emplacements"
diff --git a/locale/nl_NL.po b/locale/nl_NL.po
index d4aa135..96ff8d9 100644
--- a/locale/nl_NL.po
+++ b/locale/nl_NL.po
@@ -2,552 +2,892 @@
 msgid ""
 msgstr "Content-Type: text/plain; charset=utf-8\n"
 
-msgctxt "error:calendar.calendar:0"
+msgctxt "error:calendar.calendar:"
 msgid "A user can have only one calendar!"
 msgstr ""
 
-msgctxt "error:calendar.calendar:0"
+msgctxt "error:calendar.calendar:"
 msgid "The name of calendar must be unique!"
 msgstr ""
 
-msgctxt "error:calendar.category:0"
+msgctxt "error:calendar.category:"
 msgid "The name of calendar category must be unique!"
 msgstr ""
 
-msgctxt "error:calendar.event:0"
+msgctxt "error:calendar.event:"
 msgid "Recurrence can not be recurrent!"
 msgstr ""
 
-msgctxt "error:calendar.event:0"
+msgctxt "error:calendar.event:"
 msgid "UUID and recurrence must be unique in a calendar!"
 msgstr ""
 
-msgctxt "error:calendar.location:0"
+msgctxt "error:calendar.location:"
 msgid "The name of calendar location must be unique!"
 msgstr ""
 
-msgctxt "error:calendar.rrule:0"
+msgctxt "error:calendar.rrule:"
 msgid "Invalid \"By Day\""
 msgstr ""
 
-msgctxt "error:calendar.rrule:0"
+msgctxt "error:calendar.rrule:"
 msgid "Invalid \"By Hour\""
 msgstr ""
 
-msgctxt "error:calendar.rrule:0"
+msgctxt "error:calendar.rrule:"
 msgid "Invalid \"By Minute\""
 msgstr ""
 
-msgctxt "error:calendar.rrule:0"
+msgctxt "error:calendar.rrule:"
 msgid "Invalid \"By Month Day\""
 msgstr ""
 
-msgctxt "error:calendar.rrule:0"
+msgctxt "error:calendar.rrule:"
 msgid "Invalid \"By Month\""
 msgstr ""
 
-msgctxt "error:calendar.rrule:0"
+msgctxt "error:calendar.rrule:"
 msgid "Invalid \"By Position\""
 msgstr ""
 
-msgctxt "error:calendar.rrule:0"
+msgctxt "error:calendar.rrule:"
 msgid "Invalid \"By Second\""
 msgstr ""
 
-msgctxt "error:calendar.rrule:0"
+msgctxt "error:calendar.rrule:"
 msgid "Invalid \"By Week Number\""
 msgstr ""
 
-msgctxt "error:calendar.rrule:0"
+msgctxt "error:calendar.rrule:"
 msgid "Invalid \"By Year Day\""
 msgstr ""
 
-msgctxt "error:calendar.rrule:0"
+msgctxt "error:calendar.rrule:"
 msgid "Only one of \"until\" and \"count\" can be set!"
 msgstr ""
 
+msgctxt "field:calendar.alarm,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:calendar.alarm,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:calendar.alarm,id:"
+msgid "ID"
+msgstr ""
+
 #, fuzzy
-msgctxt "field:calendar.alarm,rec_name:0"
+msgctxt "field:calendar.alarm,rec_name:"
 msgid "Name"
 msgstr "Naam bijlage"
 
-msgctxt "field:calendar.alarm,valarm:0"
+msgctxt "field:calendar.alarm,valarm:"
 msgid "valarm"
 msgstr ""
 
-msgctxt "field:calendar.attendee,attendee:0"
+msgctxt "field:calendar.alarm,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.alarm,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.attendee,attendee:"
 msgid "attendee"
 msgstr ""
 
+msgctxt "field:calendar.attendee,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:calendar.attendee,create_uid:"
+msgid "Create User"
+msgstr ""
+
 #, fuzzy
-msgctxt "field:calendar.attendee,email:0"
+msgctxt "field:calendar.attendee,email:"
 msgid "Email"
 msgstr "E-mail"
 
+msgctxt "field:calendar.attendee,id:"
+msgid "ID"
+msgstr ""
+
 #, fuzzy
-msgctxt "field:calendar.attendee,rec_name:0"
+msgctxt "field:calendar.attendee,rec_name:"
 msgid "Name"
 msgstr "Naam bijlage"
 
-msgctxt "field:calendar.attendee,status:0"
+msgctxt "field:calendar.attendee,status:"
 msgid "Participation Status"
 msgstr ""
 
+msgctxt "field:calendar.attendee,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.attendee,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.calendar,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:calendar.calendar,create_uid:"
+msgid "Create User"
+msgstr ""
+
 #, fuzzy
-msgctxt "field:calendar.calendar,description:0"
+msgctxt "field:calendar.calendar,description:"
 msgid "Description"
 msgstr "Specificatie"
 
+msgctxt "field:calendar.calendar,id:"
+msgid "ID"
+msgstr ""
+
 #, fuzzy
-msgctxt "field:calendar.calendar,name:0"
+msgctxt "field:calendar.calendar,name:"
 msgid "Name"
 msgstr "Naam bijlage"
 
-msgctxt "field:calendar.calendar,owner:0"
+msgctxt "field:calendar.calendar,owner:"
 msgid "Owner"
 msgstr ""
 
-msgctxt "field:calendar.calendar,read_users:0"
+msgctxt "field:calendar.calendar,read_users:"
 msgid "Read Users"
 msgstr ""
 
 #, fuzzy
-msgctxt "field:calendar.calendar,rec_name:0"
+msgctxt "field:calendar.calendar,rec_name:"
 msgid "Name"
 msgstr "Naam bijlage"
 
-msgctxt "field:calendar.calendar,write_users:0"
+msgctxt "field:calendar.calendar,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.calendar,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.calendar,write_users:"
 msgid "Write Users"
 msgstr ""
 
-msgctxt "field:calendar.calendar-read-res.user,calendar:0"
+msgctxt "field:calendar.calendar-read-res.user,calendar:"
 msgid "Calendar"
 msgstr ""
 
+msgctxt "field:calendar.calendar-read-res.user,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:calendar.calendar-read-res.user,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:calendar.calendar-read-res.user,id:"
+msgid "ID"
+msgstr ""
+
 #, fuzzy
-msgctxt "field:calendar.calendar-read-res.user,rec_name:0"
+msgctxt "field:calendar.calendar-read-res.user,rec_name:"
 msgid "Name"
 msgstr "Naam bijlage"
 
 #, fuzzy
-msgctxt "field:calendar.calendar-read-res.user,user:0"
+msgctxt "field:calendar.calendar-read-res.user,user:"
 msgid "User"
 msgstr "Gebruiker"
 
-msgctxt "field:calendar.calendar-write-res.user,calendar:0"
+msgctxt "field:calendar.calendar-read-res.user,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.calendar-read-res.user,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.calendar-write-res.user,calendar:"
 msgid "Calendar"
 msgstr ""
 
+msgctxt "field:calendar.calendar-write-res.user,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:calendar.calendar-write-res.user,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:calendar.calendar-write-res.user,id:"
+msgid "ID"
+msgstr ""
+
 #, fuzzy
-msgctxt "field:calendar.calendar-write-res.user,rec_name:0"
+msgctxt "field:calendar.calendar-write-res.user,rec_name:"
 msgid "Name"
 msgstr "Naam bijlage"
 
 #, fuzzy
-msgctxt "field:calendar.calendar-write-res.user,user:0"
+msgctxt "field:calendar.calendar-write-res.user,user:"
 msgid "User"
 msgstr "Gebruiker"
 
+msgctxt "field:calendar.calendar-write-res.user,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.calendar-write-res.user,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.category,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:calendar.category,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:calendar.category,id:"
+msgid "ID"
+msgstr ""
+
 #, fuzzy
-msgctxt "field:calendar.category,name:0"
+msgctxt "field:calendar.category,name:"
 msgid "Name"
 msgstr "Naam bijlage"
 
 #, fuzzy
-msgctxt "field:calendar.category,rec_name:0"
+msgctxt "field:calendar.category,rec_name:"
 msgid "Name"
 msgstr "Naam bijlage"
 
-msgctxt "field:calendar.date,date:0"
+msgctxt "field:calendar.category,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.category,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.date,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:calendar.date,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:calendar.date,date:"
 msgid "Is Date"
 msgstr ""
 
 #, fuzzy
-msgctxt "field:calendar.date,datetime:0"
+msgctxt "field:calendar.date,datetime:"
 msgid "Date"
 msgstr "Vervaldatum"
 
+msgctxt "field:calendar.date,id:"
+msgid "ID"
+msgstr ""
+
 #, fuzzy
-msgctxt "field:calendar.date,rec_name:0"
+msgctxt "field:calendar.date,rec_name:"
 msgid "Name"
 msgstr "Naam bijlage"
 
-msgctxt "field:calendar.event,alarms:0"
+msgctxt "field:calendar.date,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.date,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.event,alarms:"
 msgid "Alarms"
 msgstr ""
 
-msgctxt "field:calendar.event,all_day:0"
+msgctxt "field:calendar.event,all_day:"
 msgid "All Day"
 msgstr ""
 
-msgctxt "field:calendar.event,attendees:0"
+msgctxt "field:calendar.event,attendees:"
 msgid "Attendees"
 msgstr ""
 
-msgctxt "field:calendar.event,calendar:0"
+msgctxt "field:calendar.event,calendar:"
 msgid "Calendar"
 msgstr ""
 
-msgctxt "field:calendar.event,calendar_owner:0"
+msgctxt "field:calendar.event,calendar_owner:"
 msgid "Owner"
 msgstr ""
 
-msgctxt "field:calendar.event,calendar_read_users:0"
+msgctxt "field:calendar.event,calendar_read_users:"
 msgid "Read Users"
 msgstr ""
 
-msgctxt "field:calendar.event,calendar_write_users:0"
+msgctxt "field:calendar.event,calendar_write_users:"
 msgid "Write Users"
 msgstr ""
 
 #, fuzzy
-msgctxt "field:calendar.event,categories:0"
+msgctxt "field:calendar.event,categories:"
 msgid "Categories"
 msgstr "Categorieën"
 
-msgctxt "field:calendar.event,classification:0"
+msgctxt "field:calendar.event,classification:"
 msgid "Classification"
 msgstr ""
 
+msgctxt "field:calendar.event,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:calendar.event,create_uid:"
+msgid "Create User"
+msgstr ""
+
 #, fuzzy
-msgctxt "field:calendar.event,description:0"
+msgctxt "field:calendar.event,description:"
 msgid "Description"
 msgstr "Specificatie"
 
 #, fuzzy
-msgctxt "field:calendar.event,dtend:0"
+msgctxt "field:calendar.event,dtend:"
 msgid "End Date"
 msgstr "Eind datum"
 
 #, fuzzy
-msgctxt "field:calendar.event,dtstart:0"
+msgctxt "field:calendar.event,dtstart:"
 msgid "Start Date"
 msgstr "Start datum"
 
-msgctxt "field:calendar.event,exdates:0"
+msgctxt "field:calendar.event,exdates:"
 msgid "Exception Dates"
 msgstr ""
 
-msgctxt "field:calendar.event,exrules:0"
+msgctxt "field:calendar.event,exrules:"
 msgid "Exception Rules"
 msgstr ""
 
-msgctxt "field:calendar.event,location:0"
+msgctxt "field:calendar.event,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.event,location:"
 msgid "Location"
 msgstr ""
 
-msgctxt "field:calendar.event,occurences:0"
+msgctxt "field:calendar.event,occurences:"
 msgid "Occurences"
 msgstr ""
 
-msgctxt "field:calendar.event,organizer:0"
+msgctxt "field:calendar.event,organizer:"
 msgid "Organizer"
 msgstr ""
 
 #, fuzzy
-msgctxt "field:calendar.event,parent:0"
+msgctxt "field:calendar.event,parent:"
 msgid "Parent"
 msgstr "Bovenliggend niveau"
 
-msgctxt "field:calendar.event,rdates:0"
+msgctxt "field:calendar.event,rdates:"
 msgid "Recurrence Dates"
 msgstr ""
 
 #, fuzzy
-msgctxt "field:calendar.event,rec_name:0"
+msgctxt "field:calendar.event,rec_name:"
 msgid "Name"
 msgstr "Naam bijlage"
 
-msgctxt "field:calendar.event,recurrence:0"
+msgctxt "field:calendar.event,recurrence:"
 msgid "Recurrence"
 msgstr ""
 
-msgctxt "field:calendar.event,rrules:0"
+msgctxt "field:calendar.event,rrules:"
 msgid "Recurrence Rules"
 msgstr ""
 
 #, fuzzy
-msgctxt "field:calendar.event,sequence:0"
+msgctxt "field:calendar.event,sequence:"
 msgid "Sequence"
 msgstr "Reeks"
 
-msgctxt "field:calendar.event,status:0"
+msgctxt "field:calendar.event,status:"
 msgid "Status"
 msgstr ""
 
-msgctxt "field:calendar.event,summary:0"
+msgctxt "field:calendar.event,summary:"
 msgid "Summary"
 msgstr ""
 
-msgctxt "field:calendar.event,timezone:0"
+msgctxt "field:calendar.event,timezone:"
 msgid "Timezone"
 msgstr ""
 
-msgctxt "field:calendar.event,transp:0"
+msgctxt "field:calendar.event,transp:"
 msgid "Time Transparency"
 msgstr ""
 
-msgctxt "field:calendar.event,uuid:0"
+msgctxt "field:calendar.event,uuid:"
 msgid "UUID"
 msgstr ""
 
-msgctxt "field:calendar.event,vevent:0"
+msgctxt "field:calendar.event,vevent:"
 msgid "vevent"
 msgstr ""
 
+msgctxt "field:calendar.event,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.event,write_uid:"
+msgid "Write User"
+msgstr ""
+
 #, fuzzy
-msgctxt "field:calendar.event-calendar.category,category:0"
+msgctxt "field:calendar.event-calendar.category,category:"
 msgid "Category"
 msgstr "Categorie"
 
-msgctxt "field:calendar.event-calendar.category,event:0"
+msgctxt "field:calendar.event-calendar.category,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:calendar.event-calendar.category,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:calendar.event-calendar.category,event:"
 msgid "Event"
 msgstr ""
 
+msgctxt "field:calendar.event-calendar.category,id:"
+msgid "ID"
+msgstr ""
+
 #, fuzzy
-msgctxt "field:calendar.event-calendar.category,rec_name:0"
+msgctxt "field:calendar.event-calendar.category,rec_name:"
 msgid "Name"
 msgstr "Naam bijlage"
 
-msgctxt "field:calendar.event.alarm,calendar_alarm:0"
+msgctxt "field:calendar.event-calendar.category,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.event-calendar.category,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.event.alarm,calendar_alarm:"
 msgid "Calendar Alarm"
 msgstr ""
 
-msgctxt "field:calendar.event.alarm,event:0"
+msgctxt "field:calendar.event.alarm,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:calendar.event.alarm,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:calendar.event.alarm,event:"
 msgid "Event"
 msgstr ""
 
+msgctxt "field:calendar.event.alarm,id:"
+msgid "ID"
+msgstr ""
+
 #, fuzzy
-msgctxt "field:calendar.event.alarm,rec_name:0"
+msgctxt "field:calendar.event.alarm,rec_name:"
 msgid "Name"
 msgstr "Naam bijlage"
 
-msgctxt "field:calendar.event.attendee,calendar_attendee:0"
+msgctxt "field:calendar.event.alarm,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.event.alarm,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.event.attendee,calendar_attendee:"
 msgid "Calendar Attendee"
 msgstr ""
 
-msgctxt "field:calendar.event.attendee,event:0"
+msgctxt "field:calendar.event.attendee,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:calendar.event.attendee,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:calendar.event.attendee,event:"
 msgid "Event"
 msgstr ""
 
+msgctxt "field:calendar.event.attendee,id:"
+msgid "ID"
+msgstr ""
+
 #, fuzzy
-msgctxt "field:calendar.event.attendee,rec_name:0"
+msgctxt "field:calendar.event.attendee,rec_name:"
 msgid "Name"
 msgstr "Naam bijlage"
 
-msgctxt "field:calendar.event.exdate,calendar_date:0"
+msgctxt "field:calendar.event.attendee,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.event.attendee,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.event.exdate,calendar_date:"
 msgid "Calendar Date"
 msgstr ""
 
-msgctxt "field:calendar.event.exdate,event:0"
+msgctxt "field:calendar.event.exdate,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:calendar.event.exdate,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:calendar.event.exdate,event:"
 msgid "Event"
 msgstr ""
 
+msgctxt "field:calendar.event.exdate,id:"
+msgid "ID"
+msgstr ""
+
 #, fuzzy
-msgctxt "field:calendar.event.exdate,rec_name:0"
+msgctxt "field:calendar.event.exdate,rec_name:"
 msgid "Name"
 msgstr "Naam bijlage"
 
-msgctxt "field:calendar.event.exrule,calendar_rrule:0"
+msgctxt "field:calendar.event.exdate,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.event.exdate,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.event.exrule,calendar_rrule:"
 msgid "Calendar RRule"
 msgstr ""
 
-msgctxt "field:calendar.event.exrule,event:0"
+msgctxt "field:calendar.event.exrule,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:calendar.event.exrule,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:calendar.event.exrule,event:"
 msgid "Event"
 msgstr ""
 
+msgctxt "field:calendar.event.exrule,id:"
+msgid "ID"
+msgstr ""
+
 #, fuzzy
-msgctxt "field:calendar.event.exrule,rec_name:0"
+msgctxt "field:calendar.event.exrule,rec_name:"
 msgid "Name"
 msgstr "Naam bijlage"
 
-msgctxt "field:calendar.event.rdate,calendar_date:0"
+msgctxt "field:calendar.event.exrule,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.event.exrule,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.event.rdate,calendar_date:"
 msgid "Calendar Date"
 msgstr ""
 
-msgctxt "field:calendar.event.rdate,event:0"
+msgctxt "field:calendar.event.rdate,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:calendar.event.rdate,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:calendar.event.rdate,event:"
 msgid "Event"
 msgstr ""
 
+msgctxt "field:calendar.event.rdate,id:"
+msgid "ID"
+msgstr ""
+
 #, fuzzy
-msgctxt "field:calendar.event.rdate,rec_name:0"
+msgctxt "field:calendar.event.rdate,rec_name:"
 msgid "Name"
 msgstr "Naam bijlage"
 
-msgctxt "field:calendar.event.rrule,calendar_rrule:0"
+msgctxt "field:calendar.event.rdate,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.event.rdate,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.event.rrule,calendar_rrule:"
 msgid "Calendar RRule"
 msgstr ""
 
-msgctxt "field:calendar.event.rrule,event:0"
+msgctxt "field:calendar.event.rrule,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:calendar.event.rrule,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:calendar.event.rrule,event:"
 msgid "Event"
 msgstr ""
 
+msgctxt "field:calendar.event.rrule,id:"
+msgid "ID"
+msgstr ""
+
 #, fuzzy
-msgctxt "field:calendar.event.rrule,rec_name:0"
+msgctxt "field:calendar.event.rrule,rec_name:"
 msgid "Name"
 msgstr "Naam bijlage"
 
+msgctxt "field:calendar.event.rrule,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.event.rrule,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.location,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:calendar.location,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:calendar.location,id:"
+msgid "ID"
+msgstr ""
+
 #, fuzzy
-msgctxt "field:calendar.location,name:0"
+msgctxt "field:calendar.location,name:"
 msgid "Name"
 msgstr "Naam bijlage"
 
 #, fuzzy
-msgctxt "field:calendar.location,rec_name:0"
+msgctxt "field:calendar.location,rec_name:"
 msgid "Name"
 msgstr "Naam bijlage"
 
-msgctxt "field:calendar.rrule,byday:0"
+msgctxt "field:calendar.location,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.location,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.rrule,byday:"
 msgid "By Day"
 msgstr ""
 
-msgctxt "field:calendar.rrule,byhour:0"
+msgctxt "field:calendar.rrule,byhour:"
 msgid "By Hour"
 msgstr ""
 
-msgctxt "field:calendar.rrule,byminute:0"
+msgctxt "field:calendar.rrule,byminute:"
 msgid "By Minute"
 msgstr ""
 
-msgctxt "field:calendar.rrule,bymonth:0"
+msgctxt "field:calendar.rrule,bymonth:"
 msgid "By Month"
 msgstr ""
 
-msgctxt "field:calendar.rrule,bymonthday:0"
+msgctxt "field:calendar.rrule,bymonthday:"
 msgid "By Month Day"
 msgstr ""
 
-msgctxt "field:calendar.rrule,bysecond:0"
+msgctxt "field:calendar.rrule,bysecond:"
 msgid "By Second"
 msgstr ""
 
-msgctxt "field:calendar.rrule,bysetpos:0"
+msgctxt "field:calendar.rrule,bysetpos:"
 msgid "By Position"
 msgstr ""
 
-msgctxt "field:calendar.rrule,byweekno:0"
+msgctxt "field:calendar.rrule,byweekno:"
 msgid "By Week Number"
 msgstr ""
 
-msgctxt "field:calendar.rrule,byyearday:0"
+msgctxt "field:calendar.rrule,byyearday:"
 msgid "By Year Day"
 msgstr ""
 
-msgctxt "field:calendar.rrule,count:0"
+msgctxt "field:calendar.rrule,count:"
 msgid "Count"
 msgstr ""
 
-msgctxt "field:calendar.rrule,freq:0"
+msgctxt "field:calendar.rrule,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:calendar.rrule,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:calendar.rrule,freq:"
 msgid "Frequency"
 msgstr ""
 
-msgctxt "field:calendar.rrule,interval:0"
+msgctxt "field:calendar.rrule,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.rrule,interval:"
 msgid "Interval"
 msgstr ""
 
 #, fuzzy
-msgctxt "field:calendar.rrule,rec_name:0"
+msgctxt "field:calendar.rrule,rec_name:"
 msgid "Name"
 msgstr "Naam bijlage"
 
-msgctxt "field:calendar.rrule,until:0"
+msgctxt "field:calendar.rrule,until:"
 msgid "Until Date"
 msgstr ""
 
-msgctxt "field:calendar.rrule,until_date:0"
+msgctxt "field:calendar.rrule,until_date:"
 msgid "Is Date"
 msgstr ""
 
-msgctxt "field:calendar.rrule,wkst:0"
+msgctxt "field:calendar.rrule,wkst:"
 msgid "Week Day"
 msgstr ""
 
-msgctxt "field:res.user,calendars:0"
+msgctxt "field:calendar.rrule,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.rrule,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:res.user,calendars:"
 msgid "Calendars"
 msgstr ""
 
-msgctxt "help:calendar.calendar,owner:0"
+msgctxt "help:calendar.calendar,owner:"
 msgid "The user must have an email"
 msgstr ""
 
-msgctxt "help:calendar.date,date:0"
+msgctxt "help:calendar.date,date:"
 msgid "Ignore time of field \"Date\", but handle as date only."
 msgstr ""
 
-msgctxt "help:calendar.event,uuid:0"
+msgctxt "help:calendar.event,uuid:"
 msgid "Universally Unique Identifier"
 msgstr ""
 
-msgctxt "help:calendar.rrule,until_date:0"
+msgctxt "help:calendar.rrule,until_date:"
 msgid "Ignore time of field \"Until Date\", but handle as date only."
 msgstr ""
 
-msgctxt "model:calendar.alarm,name:0"
+msgctxt "model:calendar.alarm,name:"
 msgid "Alarm"
 msgstr ""
 
-msgctxt "model:calendar.attendee,name:0"
+msgctxt "model:calendar.attendee,name:"
 msgid "Attendee"
 msgstr ""
 
-msgctxt "model:calendar.calendar,name:0"
+msgctxt "model:calendar.calendar,name:"
 msgid "Calendar"
 msgstr ""
 
-msgctxt "model:calendar.calendar-read-res.user,name:0"
+msgctxt "model:calendar.calendar-read-res.user,name:"
 msgid "Calendar - read - User"
 msgstr ""
 
-msgctxt "model:calendar.calendar-write-res.user,name:0"
+msgctxt "model:calendar.calendar-write-res.user,name:"
 msgid "Calendar - write - User"
 msgstr ""
 
 #, fuzzy
-msgctxt "model:calendar.category,name:0"
+msgctxt "model:calendar.category,name:"
 msgid "Category"
 msgstr "Categorie"
 
-msgctxt "model:calendar.date,name:0"
+msgctxt "model:calendar.date,name:"
 msgid "Calendar Date"
 msgstr ""
 
-msgctxt "model:calendar.event,name:0"
+msgctxt "model:calendar.event,name:"
 msgid "Event"
 msgstr ""
 
-msgctxt "model:calendar.event-calendar.category,name:0"
+msgctxt "model:calendar.event-calendar.category,name:"
 msgid "Event - Category"
 msgstr ""
 
-msgctxt "model:calendar.event.alarm,name:0"
+msgctxt "model:calendar.event.alarm,name:"
 msgid "Alarm"
 msgstr ""
 
-msgctxt "model:calendar.event.attendee,name:0"
+msgctxt "model:calendar.event.attendee,name:"
 msgid "Attendee"
 msgstr ""
 
-msgctxt "model:calendar.event.exdate,name:0"
+msgctxt "model:calendar.event.exdate,name:"
 msgid "Exception Date"
 msgstr ""
 
-msgctxt "model:calendar.event.exrule,name:0"
+msgctxt "model:calendar.event.exrule,name:"
 msgid "Exception Rule"
 msgstr ""
 
-msgctxt "model:calendar.event.rdate,name:0"
+msgctxt "model:calendar.event.rdate,name:"
 msgid "Recurrence Date"
 msgstr ""
 
-msgctxt "model:calendar.event.rrule,name:0"
+msgctxt "model:calendar.event.rrule,name:"
 msgid "Recurrence Rule"
 msgstr ""
 
-msgctxt "model:calendar.location,name:0"
+msgctxt "model:calendar.location,name:"
 msgid "Location"
 msgstr ""
 
-msgctxt "model:calendar.rrule,name:0"
+msgctxt "model:calendar.rrule,name:"
 msgid "Recurrence Rule"
 msgstr ""
 
@@ -579,220 +919,220 @@ msgctxt "model:res.group,name:group_calendar_admin"
 msgid "Calendar Administration"
 msgstr ""
 
-msgctxt "selection:calendar.attendee,status:0"
+msgctxt "selection:calendar.attendee,status:"
 msgid ""
 msgstr ""
 
-msgctxt "selection:calendar.attendee,status:0"
+msgctxt "selection:calendar.attendee,status:"
 msgid "Accepted"
 msgstr ""
 
-msgctxt "selection:calendar.attendee,status:0"
+msgctxt "selection:calendar.attendee,status:"
 msgid "Declined"
 msgstr ""
 
-msgctxt "selection:calendar.attendee,status:0"
+msgctxt "selection:calendar.attendee,status:"
 msgid "Delegated"
 msgstr ""
 
-msgctxt "selection:calendar.attendee,status:0"
+msgctxt "selection:calendar.attendee,status:"
 msgid "Needs Action"
 msgstr ""
 
-msgctxt "selection:calendar.attendee,status:0"
+msgctxt "selection:calendar.attendee,status:"
 msgid "Tentative"
 msgstr ""
 
-msgctxt "selection:calendar.event,classification:0"
+msgctxt "selection:calendar.event,classification:"
 msgid "Confidential"
 msgstr ""
 
-msgctxt "selection:calendar.event,classification:0"
+msgctxt "selection:calendar.event,classification:"
 msgid "Private"
 msgstr ""
 
-msgctxt "selection:calendar.event,classification:0"
+msgctxt "selection:calendar.event,classification:"
 msgid "Public"
 msgstr ""
 
-msgctxt "selection:calendar.event,status:0"
+msgctxt "selection:calendar.event,status:"
 msgid ""
 msgstr ""
 
-msgctxt "selection:calendar.event,status:0"
+msgctxt "selection:calendar.event,status:"
 msgid "Cancelled"
 msgstr ""
 
 #, fuzzy
-msgctxt "selection:calendar.event,status:0"
+msgctxt "selection:calendar.event,status:"
 msgid "Confirmed"
 msgstr "Bevestigd"
 
-msgctxt "selection:calendar.event,status:0"
+msgctxt "selection:calendar.event,status:"
 msgid "Tentative"
 msgstr ""
 
-msgctxt "selection:calendar.event,transp:0"
+msgctxt "selection:calendar.event,transp:"
 msgid "Opaque"
 msgstr ""
 
-msgctxt "selection:calendar.event,transp:0"
+msgctxt "selection:calendar.event,transp:"
 msgid "Transparent"
 msgstr ""
 
-msgctxt "selection:calendar.rrule,freq:0"
+msgctxt "selection:calendar.rrule,freq:"
 msgid "Daily"
 msgstr ""
 
-msgctxt "selection:calendar.rrule,freq:0"
+msgctxt "selection:calendar.rrule,freq:"
 msgid "Hourly"
 msgstr ""
 
-msgctxt "selection:calendar.rrule,freq:0"
+msgctxt "selection:calendar.rrule,freq:"
 msgid "Minutely"
 msgstr ""
 
-msgctxt "selection:calendar.rrule,freq:0"
+msgctxt "selection:calendar.rrule,freq:"
 msgid "Monthly"
 msgstr ""
 
-msgctxt "selection:calendar.rrule,freq:0"
+msgctxt "selection:calendar.rrule,freq:"
 msgid "Secondly"
 msgstr ""
 
-msgctxt "selection:calendar.rrule,freq:0"
+msgctxt "selection:calendar.rrule,freq:"
 msgid "Weekly"
 msgstr ""
 
-msgctxt "selection:calendar.rrule,freq:0"
+msgctxt "selection:calendar.rrule,freq:"
 msgid "Yearly"
 msgstr ""
 
-msgctxt "selection:calendar.rrule,wkst:0"
+msgctxt "selection:calendar.rrule,wkst:"
 msgid "Friday"
 msgstr ""
 
-msgctxt "selection:calendar.rrule,wkst:0"
+msgctxt "selection:calendar.rrule,wkst:"
 msgid "Monday"
 msgstr ""
 
-msgctxt "selection:calendar.rrule,wkst:0"
+msgctxt "selection:calendar.rrule,wkst:"
 msgid "Saturday"
 msgstr ""
 
-msgctxt "selection:calendar.rrule,wkst:0"
+msgctxt "selection:calendar.rrule,wkst:"
 msgid "Sunday"
 msgstr ""
 
-msgctxt "selection:calendar.rrule,wkst:0"
+msgctxt "selection:calendar.rrule,wkst:"
 msgid "Thursday"
 msgstr ""
 
-msgctxt "selection:calendar.rrule,wkst:0"
+msgctxt "selection:calendar.rrule,wkst:"
 msgid "Tuesday"
 msgstr ""
 
-msgctxt "selection:calendar.rrule,wkst:0"
+msgctxt "selection:calendar.rrule,wkst:"
 msgid "Wednesday"
 msgstr ""
 
-msgctxt "view:calendar.calendar:0"
+msgctxt "view:calendar.calendar:"
 msgid "Calendar"
 msgstr ""
 
-msgctxt "view:calendar.calendar:0"
+msgctxt "view:calendar.calendar:"
 msgid "Calendars"
 msgstr ""
 
 #, fuzzy
-msgctxt "view:calendar.calendar:0"
+msgctxt "view:calendar.calendar:"
 msgid "General"
 msgstr "Algemeen"
 
-msgctxt "view:calendar.calendar:0"
+msgctxt "view:calendar.calendar:"
 msgid "Security"
 msgstr ""
 
 #, fuzzy
-msgctxt "view:calendar.category:0"
+msgctxt "view:calendar.category:"
 msgid "Categories"
 msgstr "Categorieën"
 
 #, fuzzy
-msgctxt "view:calendar.category:0"
+msgctxt "view:calendar.category:"
 msgid "Category"
 msgstr "Categorie"
 
-msgctxt "view:calendar.event.attendee:0"
+msgctxt "view:calendar.event.attendee:"
 msgid "Attendee"
 msgstr ""
 
-msgctxt "view:calendar.event.attendee:0"
+msgctxt "view:calendar.event.attendee:"
 msgid "Attendees"
 msgstr ""
 
-msgctxt "view:calendar.event.exdate:0"
+msgctxt "view:calendar.event.exdate:"
 msgid "Exception Date"
 msgstr ""
 
-msgctxt "view:calendar.event.exdate:0"
+msgctxt "view:calendar.event.exdate:"
 msgid "Exception Dates"
 msgstr ""
 
-msgctxt "view:calendar.event.exrule:0"
+msgctxt "view:calendar.event.exrule:"
 msgid "Exception Rule"
 msgstr ""
 
-msgctxt "view:calendar.event.exrule:0"
+msgctxt "view:calendar.event.exrule:"
 msgid "Exception Rules"
 msgstr ""
 
-msgctxt "view:calendar.event.rdate:0"
+msgctxt "view:calendar.event.rdate:"
 msgid "Recurrence Date"
 msgstr ""
 
-msgctxt "view:calendar.event.rdate:0"
+msgctxt "view:calendar.event.rdate:"
 msgid "Recurrence Dates"
 msgstr ""
 
-msgctxt "view:calendar.event.rrule:0"
+msgctxt "view:calendar.event.rrule:"
 msgid "Recurrence Rule"
 msgstr ""
 
-msgctxt "view:calendar.event.rrule:0"
+msgctxt "view:calendar.event.rrule:"
 msgid "Recurrence Rules"
 msgstr ""
 
-msgctxt "view:calendar.event:0"
+msgctxt "view:calendar.event:"
 msgid "Attendees"
 msgstr ""
 
 #, fuzzy
-msgctxt "view:calendar.event:0"
+msgctxt "view:calendar.event:"
 msgid "Categories"
 msgstr "Categorieën"
 
-msgctxt "view:calendar.event:0"
+msgctxt "view:calendar.event:"
 msgid "Event"
 msgstr ""
 
-msgctxt "view:calendar.event:0"
+msgctxt "view:calendar.event:"
 msgid "Events"
 msgstr ""
 
 #, fuzzy
-msgctxt "view:calendar.event:0"
+msgctxt "view:calendar.event:"
 msgid "General"
 msgstr "Algemeen"
 
-msgctxt "view:calendar.event:0"
+msgctxt "view:calendar.event:"
 msgid "Occurences"
 msgstr ""
 
-msgctxt "view:calendar.location:0"
+msgctxt "view:calendar.location:"
 msgid "Location"
 msgstr ""
 
-msgctxt "view:calendar.location:0"
+msgctxt "view:calendar.location:"
 msgid "Locations"
 msgstr ""
diff --git a/locale/ru_RU.po b/locale/ru_RU.po
index 0ab492d..4c2e639 100644
--- a/locale/ru_RU.po
+++ b/locale/ru_RU.po
@@ -2,519 +2,859 @@
 msgid ""
 msgstr "Content-Type: text/plain; charset=utf-8\n"
 
-msgctxt "error:calendar.calendar:0"
+msgctxt "error:calendar.calendar:"
 msgid "A user can have only one calendar!"
 msgstr "Пользователь может иметь только Один календарь!"
 
-msgctxt "error:calendar.calendar:0"
+msgctxt "error:calendar.calendar:"
 msgid "The name of calendar must be unique!"
 msgstr "Имя календаря должно быть уникально"
 
-msgctxt "error:calendar.category:0"
+msgctxt "error:calendar.category:"
 msgid "The name of calendar category must be unique!"
 msgstr ""
 
-msgctxt "error:calendar.event:0"
+msgctxt "error:calendar.event:"
 msgid "Recurrence can not be recurrent!"
 msgstr ""
 
-msgctxt "error:calendar.event:0"
+msgctxt "error:calendar.event:"
 msgid "UUID and recurrence must be unique in a calendar!"
 msgstr ""
 
-msgctxt "error:calendar.location:0"
+msgctxt "error:calendar.location:"
 msgid "The name of calendar location must be unique!"
 msgstr ""
 
-msgctxt "error:calendar.rrule:0"
+msgctxt "error:calendar.rrule:"
 msgid "Invalid \"By Day\""
 msgstr "Неверное поле \"По дням\""
 
-msgctxt "error:calendar.rrule:0"
+msgctxt "error:calendar.rrule:"
 msgid "Invalid \"By Hour\""
 msgstr "Неверное поле \"По часам\""
 
-msgctxt "error:calendar.rrule:0"
+msgctxt "error:calendar.rrule:"
 msgid "Invalid \"By Minute\""
 msgstr "Неверное поле \"По минутам\""
 
-msgctxt "error:calendar.rrule:0"
+msgctxt "error:calendar.rrule:"
 msgid "Invalid \"By Month Day\""
 msgstr "Неверное поле \"По дням месяца\""
 
-msgctxt "error:calendar.rrule:0"
+msgctxt "error:calendar.rrule:"
 msgid "Invalid \"By Month\""
 msgstr "Неверное поле \"По месяцам\""
 
-msgctxt "error:calendar.rrule:0"
+msgctxt "error:calendar.rrule:"
 msgid "Invalid \"By Position\""
 msgstr "Неверное поле \"По позиции\""
 
-msgctxt "error:calendar.rrule:0"
+msgctxt "error:calendar.rrule:"
 msgid "Invalid \"By Second\""
 msgstr "Неверное поле \"По секундам\""
 
-msgctxt "error:calendar.rrule:0"
+msgctxt "error:calendar.rrule:"
 msgid "Invalid \"By Week Number\""
 msgstr "Неверное поле \"По номерам недель\""
 
-msgctxt "error:calendar.rrule:0"
+msgctxt "error:calendar.rrule:"
 msgid "Invalid \"By Year Day\""
 msgstr "Неверный \"По дням года\""
 
-msgctxt "error:calendar.rrule:0"
+msgctxt "error:calendar.rrule:"
 msgid "Only one of \"until\" and \"count\" can be set!"
 msgstr ""
 
-msgctxt "field:calendar.alarm,rec_name:0"
+msgctxt "field:calendar.alarm,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:calendar.alarm,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:calendar.alarm,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.alarm,rec_name:"
 msgid "Name"
 msgstr "Наименование"
 
-msgctxt "field:calendar.alarm,valarm:0"
+msgctxt "field:calendar.alarm,valarm:"
 msgid "valarm"
 msgstr ""
 
-msgctxt "field:calendar.attendee,attendee:0"
+msgctxt "field:calendar.alarm,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.alarm,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.attendee,attendee:"
 msgid "attendee"
 msgstr "участник"
 
-msgctxt "field:calendar.attendee,email:0"
+msgctxt "field:calendar.attendee,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:calendar.attendee,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:calendar.attendee,email:"
 msgid "Email"
 msgstr "Эл.почта"
 
-msgctxt "field:calendar.attendee,rec_name:0"
+msgctxt "field:calendar.attendee,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.attendee,rec_name:"
 msgid "Name"
 msgstr "Наименование"
 
-msgctxt "field:calendar.attendee,status:0"
+msgctxt "field:calendar.attendee,status:"
 msgid "Participation Status"
 msgstr "Статус участия"
 
-msgctxt "field:calendar.calendar,description:0"
+msgctxt "field:calendar.attendee,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.attendee,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.calendar,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:calendar.calendar,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:calendar.calendar,description:"
 msgid "Description"
 msgstr "Описание"
 
-msgctxt "field:calendar.calendar,name:0"
+msgctxt "field:calendar.calendar,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.calendar,name:"
 msgid "Name"
 msgstr "Наименование"
 
-msgctxt "field:calendar.calendar,owner:0"
+msgctxt "field:calendar.calendar,owner:"
 msgid "Owner"
 msgstr "Владелец"
 
-msgctxt "field:calendar.calendar,read_users:0"
+msgctxt "field:calendar.calendar,read_users:"
 msgid "Read Users"
 msgstr "Пользователи могут читать"
 
-msgctxt "field:calendar.calendar,rec_name:0"
+msgctxt "field:calendar.calendar,rec_name:"
 msgid "Name"
 msgstr "Наименование"
 
-msgctxt "field:calendar.calendar,write_users:0"
+msgctxt "field:calendar.calendar,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.calendar,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.calendar,write_users:"
 msgid "Write Users"
 msgstr "Пользователи могут писать"
 
-msgctxt "field:calendar.calendar-read-res.user,calendar:0"
+msgctxt "field:calendar.calendar-read-res.user,calendar:"
 msgid "Calendar"
 msgstr "Календар"
 
-msgctxt "field:calendar.calendar-read-res.user,rec_name:0"
+msgctxt "field:calendar.calendar-read-res.user,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:calendar.calendar-read-res.user,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:calendar.calendar-read-res.user,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.calendar-read-res.user,rec_name:"
 msgid "Name"
 msgstr "Наименование"
 
-msgctxt "field:calendar.calendar-read-res.user,user:0"
+msgctxt "field:calendar.calendar-read-res.user,user:"
 msgid "User"
 msgstr "Пользователь"
 
-msgctxt "field:calendar.calendar-write-res.user,calendar:0"
+msgctxt "field:calendar.calendar-read-res.user,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.calendar-read-res.user,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.calendar-write-res.user,calendar:"
 msgid "Calendar"
 msgstr "Календарь"
 
-msgctxt "field:calendar.calendar-write-res.user,rec_name:0"
+msgctxt "field:calendar.calendar-write-res.user,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:calendar.calendar-write-res.user,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:calendar.calendar-write-res.user,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.calendar-write-res.user,rec_name:"
 msgid "Name"
 msgstr "Наименование"
 
-msgctxt "field:calendar.calendar-write-res.user,user:0"
+msgctxt "field:calendar.calendar-write-res.user,user:"
 msgid "User"
 msgstr "Пользователь"
 
-msgctxt "field:calendar.category,name:0"
+msgctxt "field:calendar.calendar-write-res.user,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.calendar-write-res.user,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.category,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:calendar.category,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:calendar.category,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.category,name:"
 msgid "Name"
 msgstr "Наименование"
 
-msgctxt "field:calendar.category,rec_name:0"
+msgctxt "field:calendar.category,rec_name:"
 msgid "Name"
 msgstr "Наименование"
 
-msgctxt "field:calendar.date,date:0"
+msgctxt "field:calendar.category,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.category,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.date,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:calendar.date,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:calendar.date,date:"
 msgid "Is Date"
 msgstr "Весь день"
 
-msgctxt "field:calendar.date,datetime:0"
+msgctxt "field:calendar.date,datetime:"
 msgid "Date"
 msgstr "Дата"
 
-msgctxt "field:calendar.date,rec_name:0"
+msgctxt "field:calendar.date,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.date,rec_name:"
 msgid "Name"
 msgstr "Наименование"
 
-msgctxt "field:calendar.event,alarms:0"
+msgctxt "field:calendar.date,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.date,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.event,alarms:"
 msgid "Alarms"
 msgstr "Вызовы"
 
-msgctxt "field:calendar.event,all_day:0"
+msgctxt "field:calendar.event,all_day:"
 msgid "All Day"
 msgstr "Все дни"
 
-msgctxt "field:calendar.event,attendees:0"
+msgctxt "field:calendar.event,attendees:"
 msgid "Attendees"
 msgstr "Участники"
 
-msgctxt "field:calendar.event,calendar:0"
+msgctxt "field:calendar.event,calendar:"
 msgid "Calendar"
 msgstr "Календарь"
 
-msgctxt "field:calendar.event,calendar_owner:0"
+msgctxt "field:calendar.event,calendar_owner:"
 msgid "Owner"
 msgstr "Владелец"
 
-msgctxt "field:calendar.event,calendar_read_users:0"
+msgctxt "field:calendar.event,calendar_read_users:"
 msgid "Read Users"
 msgstr "Пользователи могут читать"
 
-msgctxt "field:calendar.event,calendar_write_users:0"
+msgctxt "field:calendar.event,calendar_write_users:"
 msgid "Write Users"
 msgstr "Пользователи могут писать"
 
-msgctxt "field:calendar.event,categories:0"
+msgctxt "field:calendar.event,categories:"
 msgid "Categories"
 msgstr "Категория"
 
-msgctxt "field:calendar.event,classification:0"
+msgctxt "field:calendar.event,classification:"
 msgid "Classification"
 msgstr "Классификация"
 
-msgctxt "field:calendar.event,description:0"
+msgctxt "field:calendar.event,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:calendar.event,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:calendar.event,description:"
 msgid "Description"
 msgstr "Описание"
 
-msgctxt "field:calendar.event,dtend:0"
+msgctxt "field:calendar.event,dtend:"
 msgid "End Date"
 msgstr "Дата окончания"
 
-msgctxt "field:calendar.event,dtstart:0"
+msgctxt "field:calendar.event,dtstart:"
 msgid "Start Date"
 msgstr "Дата начала"
 
-msgctxt "field:calendar.event,exdates:0"
+msgctxt "field:calendar.event,exdates:"
 msgid "Exception Dates"
 msgstr "Дата исключения"
 
-msgctxt "field:calendar.event,exrules:0"
+msgctxt "field:calendar.event,exrules:"
 msgid "Exception Rules"
 msgstr "Правила исключения"
 
-msgctxt "field:calendar.event,location:0"
+msgctxt "field:calendar.event,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.event,location:"
 msgid "Location"
 msgstr "Местоположение"
 
-msgctxt "field:calendar.event,occurences:0"
+msgctxt "field:calendar.event,occurences:"
 msgid "Occurences"
 msgstr "Дополнительные задачи"
 
-msgctxt "field:calendar.event,organizer:0"
+msgctxt "field:calendar.event,organizer:"
 msgid "Organizer"
 msgstr "Организатор"
 
-msgctxt "field:calendar.event,parent:0"
+msgctxt "field:calendar.event,parent:"
 msgid "Parent"
 msgstr "Основной"
 
-msgctxt "field:calendar.event,rdates:0"
+msgctxt "field:calendar.event,rdates:"
 msgid "Recurrence Dates"
 msgstr "Даты повторения"
 
-msgctxt "field:calendar.event,rec_name:0"
+msgctxt "field:calendar.event,rec_name:"
 msgid "Name"
 msgstr "Наименование"
 
-msgctxt "field:calendar.event,recurrence:0"
+msgctxt "field:calendar.event,recurrence:"
 msgid "Recurrence"
 msgstr "Повторение"
 
-msgctxt "field:calendar.event,rrules:0"
+msgctxt "field:calendar.event,rrules:"
 msgid "Recurrence Rules"
 msgstr "Правила повторения"
 
-msgctxt "field:calendar.event,sequence:0"
+msgctxt "field:calendar.event,sequence:"
 msgid "Sequence"
 msgstr "Последовательность"
 
-msgctxt "field:calendar.event,status:0"
+msgctxt "field:calendar.event,status:"
 msgid "Status"
 msgstr "Состояние"
 
-msgctxt "field:calendar.event,summary:0"
+msgctxt "field:calendar.event,summary:"
 msgid "Summary"
 msgstr "Резюме"
 
-msgctxt "field:calendar.event,timezone:0"
+msgctxt "field:calendar.event,timezone:"
 msgid "Timezone"
 msgstr "Зона времени"
 
-msgctxt "field:calendar.event,transp:0"
+msgctxt "field:calendar.event,transp:"
 msgid "Time Transparency"
 msgstr "Время Прозрачность"
 
-msgctxt "field:calendar.event,uuid:0"
+msgctxt "field:calendar.event,uuid:"
 msgid "UUID"
 msgstr ""
 
-msgctxt "field:calendar.event,vevent:0"
+msgctxt "field:calendar.event,vevent:"
 msgid "vevent"
 msgstr ""
 
-msgctxt "field:calendar.event-calendar.category,category:0"
+msgctxt "field:calendar.event,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.event,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.event-calendar.category,category:"
 msgid "Category"
 msgstr "Категории"
 
-msgctxt "field:calendar.event-calendar.category,event:0"
+msgctxt "field:calendar.event-calendar.category,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:calendar.event-calendar.category,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:calendar.event-calendar.category,event:"
 msgid "Event"
 msgstr "Событие"
 
-msgctxt "field:calendar.event-calendar.category,rec_name:0"
+msgctxt "field:calendar.event-calendar.category,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.event-calendar.category,rec_name:"
 msgid "Name"
 msgstr "Наименование"
 
-msgctxt "field:calendar.event.alarm,calendar_alarm:0"
+msgctxt "field:calendar.event-calendar.category,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.event-calendar.category,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.event.alarm,calendar_alarm:"
 msgid "Calendar Alarm"
 msgstr "Сигнала календаря"
 
-msgctxt "field:calendar.event.alarm,event:0"
+msgctxt "field:calendar.event.alarm,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:calendar.event.alarm,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:calendar.event.alarm,event:"
 msgid "Event"
 msgstr "Событие"
 
-msgctxt "field:calendar.event.alarm,rec_name:0"
+msgctxt "field:calendar.event.alarm,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.event.alarm,rec_name:"
 msgid "Name"
 msgstr "Наименование"
 
-msgctxt "field:calendar.event.attendee,calendar_attendee:0"
+msgctxt "field:calendar.event.alarm,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.event.alarm,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.event.attendee,calendar_attendee:"
 msgid "Calendar Attendee"
 msgstr "Календарь участников"
 
-msgctxt "field:calendar.event.attendee,event:0"
+msgctxt "field:calendar.event.attendee,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:calendar.event.attendee,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:calendar.event.attendee,event:"
 msgid "Event"
 msgstr "Событие"
 
-msgctxt "field:calendar.event.attendee,rec_name:0"
+msgctxt "field:calendar.event.attendee,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.event.attendee,rec_name:"
 msgid "Name"
 msgstr "Наименование"
 
-msgctxt "field:calendar.event.exdate,calendar_date:0"
+msgctxt "field:calendar.event.attendee,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.event.attendee,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.event.exdate,calendar_date:"
 msgid "Calendar Date"
 msgstr "День календаря"
 
-msgctxt "field:calendar.event.exdate,event:0"
+msgctxt "field:calendar.event.exdate,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:calendar.event.exdate,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:calendar.event.exdate,event:"
 msgid "Event"
 msgstr "Событие"
 
-msgctxt "field:calendar.event.exdate,rec_name:0"
+msgctxt "field:calendar.event.exdate,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.event.exdate,rec_name:"
 msgid "Name"
 msgstr "Наименование"
 
-msgctxt "field:calendar.event.exrule,calendar_rrule:0"
+msgctxt "field:calendar.event.exdate,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.event.exdate,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.event.exrule,calendar_rrule:"
 msgid "Calendar RRule"
 msgstr "Правила календаря"
 
-msgctxt "field:calendar.event.exrule,event:0"
+msgctxt "field:calendar.event.exrule,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:calendar.event.exrule,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:calendar.event.exrule,event:"
 msgid "Event"
 msgstr "Событие"
 
-msgctxt "field:calendar.event.exrule,rec_name:0"
+msgctxt "field:calendar.event.exrule,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.event.exrule,rec_name:"
 msgid "Name"
 msgstr "Наименование"
 
-msgctxt "field:calendar.event.rdate,calendar_date:0"
+msgctxt "field:calendar.event.exrule,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.event.exrule,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.event.rdate,calendar_date:"
 msgid "Calendar Date"
 msgstr "День календаря"
 
-msgctxt "field:calendar.event.rdate,event:0"
+msgctxt "field:calendar.event.rdate,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:calendar.event.rdate,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:calendar.event.rdate,event:"
 msgid "Event"
 msgstr "Событие"
 
-msgctxt "field:calendar.event.rdate,rec_name:0"
+msgctxt "field:calendar.event.rdate,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.event.rdate,rec_name:"
 msgid "Name"
 msgstr "Наименование"
 
-msgctxt "field:calendar.event.rrule,calendar_rrule:0"
+msgctxt "field:calendar.event.rdate,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.event.rdate,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.event.rrule,calendar_rrule:"
 msgid "Calendar RRule"
 msgstr "Правила календаря"
 
-msgctxt "field:calendar.event.rrule,event:0"
+msgctxt "field:calendar.event.rrule,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:calendar.event.rrule,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:calendar.event.rrule,event:"
 msgid "Event"
 msgstr "Событие"
 
-msgctxt "field:calendar.event.rrule,rec_name:0"
+msgctxt "field:calendar.event.rrule,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.event.rrule,rec_name:"
 msgid "Name"
 msgstr "Наименование"
 
-msgctxt "field:calendar.location,name:0"
+msgctxt "field:calendar.event.rrule,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.event.rrule,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.location,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:calendar.location,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:calendar.location,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.location,name:"
 msgid "Name"
 msgstr "Наименование"
 
-msgctxt "field:calendar.location,rec_name:0"
+msgctxt "field:calendar.location,rec_name:"
 msgid "Name"
 msgstr "Наименование"
 
-msgctxt "field:calendar.rrule,byday:0"
+msgctxt "field:calendar.location,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.location,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.rrule,byday:"
 msgid "By Day"
 msgstr "По дням"
 
-msgctxt "field:calendar.rrule,byhour:0"
+msgctxt "field:calendar.rrule,byhour:"
 msgid "By Hour"
 msgstr "По часам"
 
-msgctxt "field:calendar.rrule,byminute:0"
+msgctxt "field:calendar.rrule,byminute:"
 msgid "By Minute"
 msgstr "По минутам"
 
-msgctxt "field:calendar.rrule,bymonth:0"
+msgctxt "field:calendar.rrule,bymonth:"
 msgid "By Month"
 msgstr "По месячно"
 
-msgctxt "field:calendar.rrule,bymonthday:0"
+msgctxt "field:calendar.rrule,bymonthday:"
 msgid "By Month Day"
 msgstr "По дням месяца"
 
-msgctxt "field:calendar.rrule,bysecond:0"
+msgctxt "field:calendar.rrule,bysecond:"
 msgid "By Second"
 msgstr "По секундам"
 
-msgctxt "field:calendar.rrule,bysetpos:0"
+msgctxt "field:calendar.rrule,bysetpos:"
 msgid "By Position"
 msgstr "По позиции"
 
-msgctxt "field:calendar.rrule,byweekno:0"
+msgctxt "field:calendar.rrule,byweekno:"
 msgid "By Week Number"
 msgstr "По номерам недель"
 
-msgctxt "field:calendar.rrule,byyearday:0"
+msgctxt "field:calendar.rrule,byyearday:"
 msgid "By Year Day"
 msgstr "По дням года"
 
-msgctxt "field:calendar.rrule,count:0"
+msgctxt "field:calendar.rrule,count:"
 msgid "Count"
 msgstr "Количество"
 
-msgctxt "field:calendar.rrule,freq:0"
+msgctxt "field:calendar.rrule,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:calendar.rrule,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:calendar.rrule,freq:"
 msgid "Frequency"
 msgstr "Частота"
 
-msgctxt "field:calendar.rrule,interval:0"
+msgctxt "field:calendar.rrule,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.rrule,interval:"
 msgid "Interval"
 msgstr "Внутренний"
 
-msgctxt "field:calendar.rrule,rec_name:0"
+msgctxt "field:calendar.rrule,rec_name:"
 msgid "Name"
 msgstr "Наименование"
 
-msgctxt "field:calendar.rrule,until:0"
+msgctxt "field:calendar.rrule,until:"
 msgid "Until Date"
 msgstr "До даты"
 
-msgctxt "field:calendar.rrule,until_date:0"
+msgctxt "field:calendar.rrule,until_date:"
 msgid "Is Date"
 msgstr "Весь день"
 
-msgctxt "field:calendar.rrule,wkst:0"
+msgctxt "field:calendar.rrule,wkst:"
 msgid "Week Day"
 msgstr "День недели"
 
-msgctxt "field:res.user,calendars:0"
+msgctxt "field:calendar.rrule,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.rrule,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:res.user,calendars:"
 msgid "Calendars"
 msgstr "Календари"
 
-msgctxt "help:calendar.calendar,owner:0"
+msgctxt "help:calendar.calendar,owner:"
 msgid "The user must have an email"
 msgstr ""
 
-msgctxt "help:calendar.date,date:0"
+msgctxt "help:calendar.date,date:"
 msgid "Ignore time of field \"Date\", but handle as date only."
 msgstr "Время игнорируется в поле \"Дата\", действует только дата"
 
-msgctxt "help:calendar.event,uuid:0"
+msgctxt "help:calendar.event,uuid:"
 msgid "Universally Unique Identifier"
 msgstr "Универсальный уникальный идентификатор"
 
-msgctxt "help:calendar.rrule,until_date:0"
+msgctxt "help:calendar.rrule,until_date:"
 msgid "Ignore time of field \"Until Date\", but handle as date only."
 msgstr "Время игнорируется в поле \"До даты\", действует только дата"
 
-msgctxt "model:calendar.alarm,name:0"
+msgctxt "model:calendar.alarm,name:"
 msgid "Alarm"
 msgstr "Вызов"
 
-msgctxt "model:calendar.attendee,name:0"
+msgctxt "model:calendar.attendee,name:"
 msgid "Attendee"
 msgstr "Участник"
 
-msgctxt "model:calendar.calendar,name:0"
+msgctxt "model:calendar.calendar,name:"
 msgid "Calendar"
 msgstr "Календарь"
 
-msgctxt "model:calendar.calendar-read-res.user,name:0"
+msgctxt "model:calendar.calendar-read-res.user,name:"
 msgid "Calendar - read - User"
 msgstr "Пользователи могут читать"
 
-msgctxt "model:calendar.calendar-write-res.user,name:0"
+msgctxt "model:calendar.calendar-write-res.user,name:"
 msgid "Calendar - write - User"
 msgstr "Пользователи могут писать"
 
-msgctxt "model:calendar.category,name:0"
+msgctxt "model:calendar.category,name:"
 msgid "Category"
 msgstr "Категории"
 
-msgctxt "model:calendar.date,name:0"
+msgctxt "model:calendar.date,name:"
 msgid "Calendar Date"
 msgstr "День календаря"
 
-msgctxt "model:calendar.event,name:0"
+msgctxt "model:calendar.event,name:"
 msgid "Event"
 msgstr "Событие"
 
-msgctxt "model:calendar.event-calendar.category,name:0"
+msgctxt "model:calendar.event-calendar.category,name:"
 msgid "Event - Category"
 msgstr "Категории - События"
 
-msgctxt "model:calendar.event.alarm,name:0"
+msgctxt "model:calendar.event.alarm,name:"
 msgid "Alarm"
 msgstr "Вызов"
 
-msgctxt "model:calendar.event.attendee,name:0"
+msgctxt "model:calendar.event.attendee,name:"
 msgid "Attendee"
 msgstr "Участник"
 
-msgctxt "model:calendar.event.exdate,name:0"
+msgctxt "model:calendar.event.exdate,name:"
 msgid "Exception Date"
 msgstr "Дата исключения"
 
-msgctxt "model:calendar.event.exrule,name:0"
+msgctxt "model:calendar.event.exrule,name:"
 msgid "Exception Rule"
 msgstr "Правило исключения"
 
-msgctxt "model:calendar.event.rdate,name:0"
+msgctxt "model:calendar.event.rdate,name:"
 msgid "Recurrence Date"
 msgstr "Даты повторения"
 
-msgctxt "model:calendar.event.rrule,name:0"
+msgctxt "model:calendar.event.rrule,name:"
 msgid "Recurrence Rule"
 msgstr "Правила повторения"
 
-msgctxt "model:calendar.location,name:0"
+msgctxt "model:calendar.location,name:"
 msgid "Location"
 msgstr "Местоположение"
 
-msgctxt "model:calendar.rrule,name:0"
+msgctxt "model:calendar.rrule,name:"
 msgid "Recurrence Rule"
 msgstr "Правила повторения"
 
@@ -549,216 +889,214 @@ msgctxt "model:res.group,name:group_calendar_admin"
 msgid "Calendar Administration"
 msgstr "Управление календарем"
 
-#, fuzzy
-msgctxt "selection:calendar.attendee,status:0"
+msgctxt "selection:calendar.attendee,status:"
 msgid ""
-msgstr "Резервный счет"
+msgstr ""
 
-msgctxt "selection:calendar.attendee,status:0"
+msgctxt "selection:calendar.attendee,status:"
 msgid "Accepted"
 msgstr "Подтверждено"
 
-msgctxt "selection:calendar.attendee,status:0"
+msgctxt "selection:calendar.attendee,status:"
 msgid "Declined"
 msgstr "Отклонено"
 
-msgctxt "selection:calendar.attendee,status:0"
+msgctxt "selection:calendar.attendee,status:"
 msgid "Delegated"
 msgstr "Делегировано"
 
-msgctxt "selection:calendar.attendee,status:0"
+msgctxt "selection:calendar.attendee,status:"
 msgid "Needs Action"
 msgstr "Требуется действие"
 
-msgctxt "selection:calendar.attendee,status:0"
+msgctxt "selection:calendar.attendee,status:"
 msgid "Tentative"
 msgstr "Предварительный"
 
-msgctxt "selection:calendar.event,classification:0"
+msgctxt "selection:calendar.event,classification:"
 msgid "Confidential"
 msgstr "Конфиденциальное"
 
-msgctxt "selection:calendar.event,classification:0"
+msgctxt "selection:calendar.event,classification:"
 msgid "Private"
 msgstr "Личное"
 
-msgctxt "selection:calendar.event,classification:0"
+msgctxt "selection:calendar.event,classification:"
 msgid "Public"
 msgstr "Публичное"
 
-#, fuzzy
-msgctxt "selection:calendar.event,status:0"
+msgctxt "selection:calendar.event,status:"
 msgid ""
-msgstr "Резервный счет"
+msgstr ""
 
-msgctxt "selection:calendar.event,status:0"
+msgctxt "selection:calendar.event,status:"
 msgid "Cancelled"
 msgstr "Отмененно"
 
-msgctxt "selection:calendar.event,status:0"
+msgctxt "selection:calendar.event,status:"
 msgid "Confirmed"
 msgstr "Подтвержденно"
 
-msgctxt "selection:calendar.event,status:0"
+msgctxt "selection:calendar.event,status:"
 msgid "Tentative"
 msgstr "Предварительный"
 
-msgctxt "selection:calendar.event,transp:0"
+msgctxt "selection:calendar.event,transp:"
 msgid "Opaque"
 msgstr "Непрозрачный"
 
-msgctxt "selection:calendar.event,transp:0"
+msgctxt "selection:calendar.event,transp:"
 msgid "Transparent"
 msgstr "Прозрачный"
 
-msgctxt "selection:calendar.rrule,freq:0"
+msgctxt "selection:calendar.rrule,freq:"
 msgid "Daily"
 msgstr "Ежедневный"
 
-msgctxt "selection:calendar.rrule,freq:0"
+msgctxt "selection:calendar.rrule,freq:"
 msgid "Hourly"
 msgstr "Ежечасный"
 
-msgctxt "selection:calendar.rrule,freq:0"
+msgctxt "selection:calendar.rrule,freq:"
 msgid "Minutely"
 msgstr "Ежеминутно"
 
-msgctxt "selection:calendar.rrule,freq:0"
+msgctxt "selection:calendar.rrule,freq:"
 msgid "Monthly"
 msgstr "Ежемесячно"
 
-msgctxt "selection:calendar.rrule,freq:0"
+msgctxt "selection:calendar.rrule,freq:"
 msgid "Secondly"
 msgstr "Ежесекудно"
 
-msgctxt "selection:calendar.rrule,freq:0"
+msgctxt "selection:calendar.rrule,freq:"
 msgid "Weekly"
 msgstr "Еженедельно"
 
-msgctxt "selection:calendar.rrule,freq:0"
+msgctxt "selection:calendar.rrule,freq:"
 msgid "Yearly"
 msgstr "Ежегодно"
 
-msgctxt "selection:calendar.rrule,wkst:0"
+msgctxt "selection:calendar.rrule,wkst:"
 msgid "Friday"
 msgstr "Пятница"
 
-msgctxt "selection:calendar.rrule,wkst:0"
+msgctxt "selection:calendar.rrule,wkst:"
 msgid "Monday"
 msgstr "Понедельник"
 
-msgctxt "selection:calendar.rrule,wkst:0"
+msgctxt "selection:calendar.rrule,wkst:"
 msgid "Saturday"
 msgstr "Суббота"
 
-msgctxt "selection:calendar.rrule,wkst:0"
+msgctxt "selection:calendar.rrule,wkst:"
 msgid "Sunday"
 msgstr "Воскресенье"
 
-msgctxt "selection:calendar.rrule,wkst:0"
+msgctxt "selection:calendar.rrule,wkst:"
 msgid "Thursday"
 msgstr "Четверг"
 
-msgctxt "selection:calendar.rrule,wkst:0"
+msgctxt "selection:calendar.rrule,wkst:"
 msgid "Tuesday"
 msgstr "Вторник"
 
-msgctxt "selection:calendar.rrule,wkst:0"
+msgctxt "selection:calendar.rrule,wkst:"
 msgid "Wednesday"
 msgstr "Среда"
 
-msgctxt "view:calendar.calendar:0"
+msgctxt "view:calendar.calendar:"
 msgid "Calendar"
 msgstr "Календарь"
 
-msgctxt "view:calendar.calendar:0"
+msgctxt "view:calendar.calendar:"
 msgid "Calendars"
 msgstr "Календари"
 
-msgctxt "view:calendar.calendar:0"
+msgctxt "view:calendar.calendar:"
 msgid "General"
 msgstr "Основной"
 
-msgctxt "view:calendar.calendar:0"
+msgctxt "view:calendar.calendar:"
 msgid "Security"
 msgstr "Доступ"
 
-msgctxt "view:calendar.category:0"
+msgctxt "view:calendar.category:"
 msgid "Categories"
 msgstr "Категория"
 
-msgctxt "view:calendar.category:0"
+msgctxt "view:calendar.category:"
 msgid "Category"
 msgstr "Категории"
 
-msgctxt "view:calendar.event.attendee:0"
+msgctxt "view:calendar.event.attendee:"
 msgid "Attendee"
 msgstr "Участник"
 
-msgctxt "view:calendar.event.attendee:0"
+msgctxt "view:calendar.event.attendee:"
 msgid "Attendees"
 msgstr "Участники"
 
-msgctxt "view:calendar.event.exdate:0"
+msgctxt "view:calendar.event.exdate:"
 msgid "Exception Date"
 msgstr "Дата исключения"
 
-msgctxt "view:calendar.event.exdate:0"
+msgctxt "view:calendar.event.exdate:"
 msgid "Exception Dates"
 msgstr "Дата исключения"
 
-msgctxt "view:calendar.event.exrule:0"
+msgctxt "view:calendar.event.exrule:"
 msgid "Exception Rule"
 msgstr "Правило исключения"
 
-msgctxt "view:calendar.event.exrule:0"
+msgctxt "view:calendar.event.exrule:"
 msgid "Exception Rules"
 msgstr "Правила исключения"
 
-msgctxt "view:calendar.event.rdate:0"
+msgctxt "view:calendar.event.rdate:"
 msgid "Recurrence Date"
 msgstr "Даты повторения"
 
-msgctxt "view:calendar.event.rdate:0"
+msgctxt "view:calendar.event.rdate:"
 msgid "Recurrence Dates"
 msgstr "Даты повторения"
 
-msgctxt "view:calendar.event.rrule:0"
+msgctxt "view:calendar.event.rrule:"
 msgid "Recurrence Rule"
 msgstr "Правила повторения"
 
-msgctxt "view:calendar.event.rrule:0"
+msgctxt "view:calendar.event.rrule:"
 msgid "Recurrence Rules"
 msgstr "Правила повторения"
 
-msgctxt "view:calendar.event:0"
+msgctxt "view:calendar.event:"
 msgid "Attendees"
 msgstr "Участники"
 
-msgctxt "view:calendar.event:0"
+msgctxt "view:calendar.event:"
 msgid "Categories"
 msgstr "Категория"
 
-msgctxt "view:calendar.event:0"
+msgctxt "view:calendar.event:"
 msgid "Event"
 msgstr "Событие"
 
-msgctxt "view:calendar.event:0"
+msgctxt "view:calendar.event:"
 msgid "Events"
 msgstr "События"
 
-msgctxt "view:calendar.event:0"
+msgctxt "view:calendar.event:"
 msgid "General"
 msgstr "Основной"
 
-msgctxt "view:calendar.event:0"
+msgctxt "view:calendar.event:"
 msgid "Occurences"
 msgstr "Повторение"
 
-msgctxt "view:calendar.location:0"
+msgctxt "view:calendar.location:"
 msgid "Location"
 msgstr "Местоположение"
 
-msgctxt "view:calendar.location:0"
+msgctxt "view:calendar.location:"
 msgid "Locations"
 msgstr "Местоположения"
diff --git a/setup.py b/setup.py
index 94fef71..2af98de 100644
--- a/setup.py
+++ b/setup.py
@@ -10,9 +10,9 @@ major_version, minor_version, _ = info.get('version', '0.0.1').split('.', 2)
 major_version = int(major_version)
 minor_version = int(minor_version)
 
-requires = ['vobject >= 0.8.0', 'PyWebDAV >= 0.9.3', 'python-dateutil', 'pytz']
+requires = ['vobject >= 0.8.0', 'PyWebDAV >= 0.9.8', 'python-dateutil', 'pytz']
 for dep in info.get('depends', []):
-    if not re.match(r'(ir|res|workflow|webdav)(\W|$)', dep):
+    if not re.match(r'(ir|res|webdav)(\W|$)', dep):
         requires.append('trytond_%s >= %s.%s, < %s.%s' %
                 (dep, major_version, minor_version, major_version,
                     minor_version + 1))
diff --git a/tests/__init__.py b/tests/__init__.py
index 8b786f9..40ec561 100644
--- a/tests/__init__.py
+++ b/tests/__init__.py
@@ -1,4 +1,4 @@
 #This file is part of Tryton.  The COPYRIGHT file at the top level of
 #this repository contains the full copyright notices and license terms.
 
-from test_calendar import suite
+from .test_calendar import suite
diff --git a/tests/scenario_calendar.py b/tests/scenario_calendar.py
index 649e47e..38a0344 100644
--- a/tests/scenario_calendar.py
+++ b/tests/scenario_calendar.py
@@ -12,13 +12,15 @@ import caldav
 import vobject
 from proteus import config, Model, Wizard
 
+
 def install_module(name, config):
     Module = Model.get('ir.module.module')
     module, = Module.find([('name', '=', name)])
     if module.state != 'installed':
-        Module.button_install([module.id], config.context)
+        Module.install([module.id], config.context)
         Wizard('ir.module.module.install_upgrade').execute('start')
 
+
 def configure_user(login, config):
     User = Model.get('res.user')
     users = User.find([('login', '=', login)])
@@ -30,6 +32,7 @@ def configure_user(login, config):
         user.email = email
         user.save()
 
+
 def create_calendar(login, user, config):
     Calendar = Model.get('calendar.calendar')
     User = Model.get('res.user')
@@ -64,7 +67,8 @@ class TestCase(unittest.TestCase):
         vevent.add('summary')
         vevent.summary.value = 'Test event'
         vevent.add('dtstart')
-        vevent.dtstart.value = datetime.datetime.now() + relativedelta(months=1)
+        vevent.dtstart.value = (datetime.datetime.now()
+            + relativedelta(months=1))
         vevent.add('dtend')
         vevent.dtend.value = datetime.datetime.now() + relativedelta(months=1,
             hours=1)
@@ -107,8 +111,6 @@ class TestCase(unittest.TestCase):
             attendee.value = 'MAILTO:%s at example.com' % name
             attendees.append(attendee)
         vevent.attendee_list = attendees
-        event = caldav.Event(self.client, data=ical.serialize(),
-            parent=self.calendar).save()
 
         Event = Model.get('calendar.event')
         owner_event, = Event.find([
@@ -124,7 +126,8 @@ class TestCase(unittest.TestCase):
         'Update status of attendee'
         for event in self.calendar.events():
             event.load()
-            if event.instance.vevent.summary.value == 'Test event with attendee':
+            value = event.instance.vevent.summary.value
+            if value == 'Test event with attendee':
                 break
         for attendee in event.instance.vevent.attendee_list:
             attendee.partstat_param = 'accepted'
@@ -141,7 +144,8 @@ class TestCase(unittest.TestCase):
         'Delete attendee'
         for event in self.calendar.events():
             event.load()
-            if event.instance.vevent.summary.value == 'Test event with attendee':
+            value = event.instance.vevent.summary.value
+            if value == 'Test event with attendee':
                 break
         event.instance.vevent.attendee_list = []
         event.save()
diff --git a/tests/test_calendar.py b/tests/test_calendar.py
index 207654b..55fabea 100644
--- a/tests/test_calendar.py
+++ b/tests/test_calendar.py
@@ -2,7 +2,8 @@
 #This file is part of Tryton.  The COPYRIGHT file at the top level of
 #this repository contains the full copyright notices and license terms.
 
-import sys, os
+import sys
+import os
 DIR = os.path.abspath(os.path.normpath(os.path.join(__file__,
     '..', '..', '..', '..', '..', 'trytond')))
 if os.path.isdir(DIR):
@@ -33,6 +34,7 @@ class CalendarTestCase(unittest.TestCase):
         '''
         test_depends()
 
+
 def suite():
     suite = trytond.tests.test_tryton.suite()
     suite.addTests(unittest.TestLoader().loadTestsFromTestCase(
diff --git a/trytond_calendar.egg-info/PKG-INFO b/trytond_calendar.egg-info/PKG-INFO
index 7a50dec..e7c3b87 100644
--- a/trytond_calendar.egg-info/PKG-INFO
+++ b/trytond_calendar.egg-info/PKG-INFO
@@ -1,12 +1,12 @@
 Metadata-Version: 1.0
 Name: trytond-calendar
-Version: 2.2.0
+Version: 2.4.0
 Summary: Add CalDAV support
 Home-page: http://www.tryton.org/
 Author: B2CK
 Author-email: info at b2ck.com
 License: GPL-3
-Download-URL: http://downloads.tryton.org/2.2/
+Download-URL: http://downloads.tryton.org/2.4/
 Description: UNKNOWN
 Platform: UNKNOWN
 Classifier: Development Status :: 5 - Production/Stable
diff --git a/trytond_calendar.egg-info/SOURCES.txt b/trytond_calendar.egg-info/SOURCES.txt
index 24835cd..5aa3999 100644
--- a/trytond_calendar.egg-info/SOURCES.txt
+++ b/trytond_calendar.egg-info/SOURCES.txt
@@ -9,15 +9,17 @@ setup.py
 ./__init__.py
 ./__tryton__.py
 ./caldav.py
-./calendar.py
+./calendar_.py
 ./res.py
 ./webdav.py
 ./tests/__init__.py
 ./tests/scenario_calendar.py
 ./tests/test_calendar.py
 locale/bg_BG.po
+locale/ca_ES.po
 locale/cs_CZ.po
 locale/de_DE.po
+locale/es_AR.po
 locale/es_CO.po
 locale/es_ES.po
 locale/fr_FR.po
diff --git a/trytond_calendar.egg-info/requires.txt b/trytond_calendar.egg-info/requires.txt
index fe966b1..fabff6c 100644
--- a/trytond_calendar.egg-info/requires.txt
+++ b/trytond_calendar.egg-info/requires.txt
@@ -1,8 +1,8 @@
 vobject >= 0.8.0
-PyWebDAV >= 0.9.3
+PyWebDAV >= 0.9.8
 python-dateutil
 pytz
-trytond >= 2.2, < 2.3
+trytond >= 2.4, < 2.5
 
 [test]
 caldav
\ No newline at end of file
diff --git a/webdav.py b/webdav.py
index 03186fe..4ce94a4 100644
--- a/webdav.py
+++ b/webdav.py
@@ -2,7 +2,7 @@
 #this repository contains the full copyright notices and license terms.
 import vobject
 import urllib
-from DAV.errors import DAV_NotFound, DAV_Forbidden
+from pywebdav.lib.errors import DAV_NotFound, DAV_Forbidden
 from trytond.model import ModelView, ModelSQL
 from trytond.tools import reduce_ids
 from trytond.cache import Cache
@@ -11,6 +11,7 @@ from trytond.pool import Pool
 
 CALDAV_NS = 'urn:ietf:params:xml:ns:caldav'
 
+
 def _comp_filter_domain(dtstart, dtend):
     return ['OR',
         [
@@ -23,37 +24,38 @@ def _comp_filter_domain(dtstart, dtend):
                     ('dtend', '<=', dtend)],
                 [('dtstart', '>=', dtstart),
                     ('dtstart', '<=', dtend),
-                    ('dtend', '=', False)]],
-            ('parent', '=', False),
-            ('rdates', '=', False),
-            ('rrules', '=', False),
-            ('exdates', '=', False),
-            ('exrules', '=', False),
-            ('occurences', '=', False),
+                    ('dtend', '=', None)]],
+            ('parent', '=', None),
+            ('rdates', '=', None),
+            ('rrules', '=', None),
+            ('exdates', '=', None),
+            ('exrules', '=', None),
+            ('occurences', '=', None),
             ],
-        [ #TODO manage better recurring event
-            ('parent', '=', False),
+        [  # TODO manage better recurring event
+            ('parent', '=', None),
             ('dtstart', '<=', dtend),
             ['OR',
-                ('rdates', '!=', False),
-                ('rrules', '!=', False),
-                ('exdates', '!=', False),
-                ('exrules', '!=', False),
-                ('occurences', '!=', False),
+                ('rdates', '!=', None),
+                ('rrules', '!=', None),
+                ('exdates', '!=', None),
+                ('exrules', '!=', None),
+                ('occurences', '!=', None),
                 ]
             ]]
 
+
 class Collection(ModelSQL, ModelView):
 
     _name = "webdav.collection"
 
     def calendar(self, uri, ics=False):
         '''
-        Return the calendar id in the uri or False
+        Return the calendar id in the uri
 
         :param uri: the uri
         :return: calendar id
-            or False if there is no calendar
+            or None if there is no calendar
         '''
         calendar_obj = Pool().get('calendar.calendar')
 
@@ -63,19 +65,18 @@ class Collection(ModelSQL, ModelView):
                 if calendar.endswith('.ics'):
                     calendar = calendar[:-4]
                 else:
-                    return False
+                    return None
             return calendar_obj.get_name(calendar)
-        return False
 
     @Cache('webdav_collection.event')
     def event(self, uri, calendar_id=False):
         '''
-        Return the event id in the uri or False
+        Return the event id in the uri
 
         :param uri: the uri
         :param calendar_id: the calendar id
         :return: event id
-            or False if there is no event
+            or None if there is no event
         '''
         event_obj = Pool().get('calendar.event')
 
@@ -84,15 +85,14 @@ class Collection(ModelSQL, ModelView):
             if not calendar_id:
                 calendar_id = self.calendar(uri)
                 if not calendar_id:
-                    return False
+                    return None
             event_ids = event_obj.search([
                 ('calendar', '=', calendar_id),
                 ('uuid', '=', event_uri[:-4]),
-                ('parent', '=', False),
+                ('parent', '=', None),
                 ], limit=1)
             if event_ids:
                 return event_ids[0]
-        return False
 
     def _caldav_filter_domain_calendar(self, filter):
         '''
@@ -186,8 +186,11 @@ class Collection(ModelSQL, ModelView):
 
         if uri in ('Calendars', 'Calendars/'):
             domain = self._caldav_filter_domain_calendar(filter)
-            domain = [['OR', ('owner', '=', Transaction().user), ('read_users', '=', Transaction().user)],
-                    domain]
+            domain = [['OR',
+                    ('owner', '=', Transaction().user),
+                    ('read_users', '=', Transaction().user),
+                    ],
+                domain]
             calendar_ids = calendar_obj.search(domain)
             calendars = calendar_obj.browse(calendar_ids)
             if cache is not None:
@@ -269,10 +272,10 @@ class Collection(ModelSQL, ModelView):
                     ids = cache['_calendar'][calendar_obj._name].keys()
                     if calendar_id not in ids:
                         ids.append(calendar_id)
-                    elif 'creationdate' in cache['_calendar']\
-                            [calendar_obj._name][calendar_id]:
-                        return cache['_calendar'][calendar_obj._name]\
-                                [calendar_id]['creationdate']
+                    elif 'creationdate' in cache['_calendar'][
+                            calendar_obj._name][calendar_id]:
+                        return cache['_calendar'][calendar_obj._name][
+                            calendar_id]['creationdate']
                 else:
                     ids = [calendar_id]
                 res = None
@@ -290,8 +293,8 @@ class Collection(ModelSQL, ModelView):
                         if cache is not None:
                             cache['_calendar'][calendar_obj._name]\
                                     .setdefault(calendar_id2, {})
-                            cache['_calendar'][calendar_obj._name]\
-                                    [calendar_id2]['creationdate'] = date
+                            cache['_calendar'][calendar_obj._name][
+                                calendar_id2]['creationdate'] = date
                 if res is not None:
                     return res
             else:
@@ -303,10 +306,10 @@ class Collection(ModelSQL, ModelView):
                         ids = cache['_calendar'][event_obj._name].keys()
                         if event_id not in ids:
                             ids.append(event_id)
-                        elif 'creationdate' in cache['_calendar']\
-                                [event_obj._name][event_id]:
-                            return cache['_calendar'][event_obj._name]\
-                                    [event_id]['creationdate']
+                        elif 'creationdate' in cache['_calendar'][
+                                event_obj._name][event_id]:
+                            return cache['_calendar'][event_obj._name][
+                                event_id]['creationdate']
                     else:
                         ids = [event_id]
                     res = None
@@ -324,8 +327,8 @@ class Collection(ModelSQL, ModelView):
                             if cache is not None:
                                 cache['_calendar'][event_obj._name]\
                                         .setdefault(event_id2, {})
-                                cache['_calendar'][event_obj._name]\
-                                        [event_id2]['creationdate'] = date
+                                cache['_calendar'][event_obj._name][
+                                    event_id2]['creationdate'] = date
                     if res is not None:
                         return res
         return super(Collection, self).get_creationdate(uri, cache=cache)
@@ -344,10 +347,10 @@ class Collection(ModelSQL, ModelView):
                     ids = cache['_calendar'][calendar_obj._name].keys()
                     if calendar_id not in ids:
                         ids.append(calendar_id)
-                    elif 'lastmodified' in cache['_calendar']\
-                            [calendar_obj._name][calendar_id]:
-                        return cache['_calendar'][calendar_obj._name]\
-                                [calendar_id]['lastmodified']
+                    elif 'lastmodified' in cache['_calendar'][
+                            calendar_obj._name][calendar_id]:
+                        return cache['_calendar'][calendar_obj._name][
+                            calendar_id]['lastmodified']
                 else:
                     ids = [calendar_id]
                 res = None
@@ -365,8 +368,8 @@ class Collection(ModelSQL, ModelView):
                         if cache is not None:
                             cache['_calendar'][calendar_obj._name]\
                                     .setdefault(calendar_id2, {})
-                            cache['_calendar'][calendar_obj._name]\
-                                    [calendar_id2]['lastmodified'] = date
+                            cache['_calendar'][calendar_obj._name][
+                                calendar_id2]['lastmodified'] = date
                 if res is not None:
                     return res
             else:
@@ -378,15 +381,15 @@ class Collection(ModelSQL, ModelView):
                         ids = cache['_calendar'][event_obj._name].keys()
                         if event_id not in ids:
                             ids.append(event_id)
-                        elif 'lastmodified' in cache['_calendar']\
-                                [event_obj._name][event_id]:
-                            return cache['_calendar'][event_obj._name]\
-                                    [event_id]['lastmodified']
+                        elif 'lastmodified' in cache['_calendar'][
+                                event_obj._name][event_id]:
+                            return cache['_calendar'][event_obj._name][
+                                event_id]['lastmodified']
                     else:
                         ids = [event_id]
                     res = None
-                    for i in range(0, len(ids), cursor.IN_MAX/2):
-                        sub_ids = ids[i:i + cursor.IN_MAX/2]
+                    for i in range(0, len(ids), cursor.IN_MAX / 2):
+                        sub_ids = ids[i:i + cursor.IN_MAX / 2]
                         red_id_sql, red_id_ids = reduce_ids('id', sub_ids)
                         red_parent_sql, red_parent_ids = reduce_ids('parent',
                                 sub_ids)
@@ -404,8 +407,8 @@ class Collection(ModelSQL, ModelView):
                             if cache is not None:
                                 cache['_calendar'][event_obj._name]\
                                         .setdefault(event_id2, {})
-                                cache['_calendar'][event_obj._name]\
-                                        [event_id2]['lastmodified'] = date
+                                cache['_calendar'][event_obj._name][
+                                    event_id2]['lastmodified'] = date
                     if res is not None:
                         return res
         calendar_ics_id = self.calendar(uri, ics=True)
@@ -416,10 +419,10 @@ class Collection(ModelSQL, ModelView):
                 ids = cache['_calendar'][calendar_obj._name].keys()
                 if calendar_ics_id not in ids:
                     ids.append(calendar_ics_id)
-                elif 'lastmodified ics' in cache['_calendar']\
-                        [calendar_obj._name][calendar_ics_id]:
-                    return cache['_calendar'][calendar_obj._name]\
-                            [calendar_ics_id]['lastmodified ics']
+                elif 'lastmodified ics' in cache['_calendar'][
+                        calendar_obj._name][calendar_ics_id]:
+                    return cache['_calendar'][calendar_obj._name][
+                        calendar_ics_id]['lastmodified ics']
             else:
                 ids = [calendar_ics_id]
             res = None
@@ -437,8 +440,8 @@ class Collection(ModelSQL, ModelView):
                     if cache is not None:
                         cache['_calendar'][calendar_obj._name]\
                                 .setdefault(calendar_id2, {})
-                        cache['_calendar'][calendar_obj._name]\
-                                [calendar_id2]['lastmodified ics'] = date
+                        cache['_calendar'][calendar_obj._name][
+                            calendar_id2]['lastmodified ics'] = date
             if res is not None:
                 return res
         return super(Collection, self).get_lastmodified(uri, cache=cache)
@@ -474,10 +477,10 @@ class Collection(ModelSQL, ModelView):
                     ids = cache['_calendar'][calendar_obj._name].keys()
                     if calendar_id not in ids:
                         ids.append(calendar_id)
-                    elif 'calendar_description' in cache['_calendar']\
-                            [calendar_obj._name][calendar_id]:
-                        res = cache['_calendar'][calendar_obj._name]\
-                                [calendar_id]['calendar_description']
+                    elif 'calendar_description' in cache['_calendar'][
+                            calendar_obj._name][calendar_id]:
+                        res = cache['_calendar'][calendar_obj._name][
+                            calendar_id]['calendar_description']
                         if res is not None:
                             return res
                 else:
@@ -489,8 +492,8 @@ class Collection(ModelSQL, ModelView):
                     if cache is not None:
                         cache['_calendar'][calendar_obj._name]\
                                 .setdefault(calendar.id, {})
-                        cache['_calendar'][calendar_obj._name]\
-                                [calendar.id]['calendar_description'] = \
+                        cache['_calendar'][calendar_obj._name][
+                            calendar.id]['calendar_description'] = \
                                 calendar.description
                 if res is not None:
                     return res
commit cd31eebdff7da1f03bd6cb4682b11816dcdc6975
Author: Mathias Behrle <mathiasb at m9s.biz>
Date:   Mon Oct 31 16:20:33 2011 +0100

    Adding upstream version 2.2.0.

diff --git a/CHANGELOG b/CHANGELOG
index 698aff4..b9c58e4 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,3 +1,7 @@
+Version 2.2.0 - 2011-10-24
+* Bug fixes (see mercurial logs for details)
+* Basic support of event time-range filter
+
 Version 2.0.0 - 2011-04-27
 * Bug fixes (see mercurial logs for details)
 
diff --git a/MANIFEST.in b/MANIFEST.in
index 5343ad8..7f5d5fd 100644
--- a/MANIFEST.in
+++ b/MANIFEST.in
@@ -6,4 +6,4 @@ include CHANGELOG
 include LICENSE
 include *.xml
 include *.odt
-include *.csv
+include locale/*.po
diff --git a/PKG-INFO b/PKG-INFO
index c8be40d..bf5bc32 100644
--- a/PKG-INFO
+++ b/PKG-INFO
@@ -1,29 +1,31 @@
 Metadata-Version: 1.0
 Name: trytond_calendar
-Version: 2.0.0
+Version: 2.2.0
 Summary: Add CalDAV support
 Home-page: http://www.tryton.org/
 Author: B2CK
 Author-email: info at b2ck.com
 License: GPL-3
-Download-URL: http://downloads.tryton.org/2.0/
+Download-URL: http://downloads.tryton.org/2.2/
 Description: UNKNOWN
 Platform: UNKNOWN
 Classifier: Development Status :: 5 - Production/Stable
 Classifier: Environment :: Plugins
+Classifier: Framework :: Tryton
 Classifier: Intended Audience :: Developers
 Classifier: Intended Audience :: Financial and Insurance Industry
 Classifier: Intended Audience :: Legal Industry
 Classifier: Intended Audience :: Manufacturing
 Classifier: License :: OSI Approved :: GNU General Public License (GPL)
 Classifier: Natural Language :: Bulgarian
+Classifier: Natural Language :: Czech
+Classifier: Natural Language :: Dutch
 Classifier: Natural Language :: English
 Classifier: Natural Language :: French
 Classifier: Natural Language :: German
 Classifier: Natural Language :: Russian
 Classifier: Natural Language :: Spanish
 Classifier: Operating System :: OS Independent
-Classifier: Programming Language :: Python :: 2.5
 Classifier: Programming Language :: Python :: 2.6
 Classifier: Programming Language :: Python :: 2.7
 Classifier: Topic :: Office/Business
diff --git a/__tryton__.py b/__tryton__.py
index fce5345..b4aa5d1 100644
--- a/__tryton__.py
+++ b/__tryton__.py
@@ -9,7 +9,7 @@
     'name_es_ES' : 'Calendario',
     'name_fr_FR' : 'Calendrier',
     'name_ru_RU' : 'Календарь',
-    'version' : '2.0.0',
+    'version' : '2.2.0',
     'author' : 'B2CK',
     'email': 'info at b2ck.com',
     'website': 'http://www.tryton.org/',
@@ -29,11 +29,13 @@
         'calendar.xml',
     ],
     'translation': [
-        'bg_BG.csv',
-        'de_DE.csv',
-        'es_CO.csv',
-        'es_ES.csv',
-        'fr_FR.csv',
-        'ru_RU.csv',
+        'locale/bg_BG.po',
+        'locale/cs_CZ.po',
+        'locale/de_DE.po',
+        'locale/es_CO.po',
+        'locale/es_ES.po',
+        'locale/fr_FR.po',
+        'locale/nl_NL.po',
+        'locale/ru_RU.po',
     ],
 }
diff --git a/bg_BG.csv b/bg_BG.csv
deleted file mode 100644
index 0a8f1c9..0000000
--- a/bg_BG.csv
+++ /dev/null
@@ -1,194 +0,0 @@
-type,name,res_id,src,value,fuzzy
-error,calendar.calendar,0,A user can have only one calendar!,Потребителя може да има само един календар!,0
-error,calendar.calendar,0,The name of calendar must be unique!,Името на календара трябва да е уникално!,0
-error,calendar.category,0,The name of calendar category must be unique!,Името на категорията на календара трябва да е уникално!,0
-error,calendar.event,0,Recurrence can not be recurrent!,Повторението не може да е периодично!,0
-error,calendar.event,0,UUID and recurrence must be unique in a calendar!,UUID и взаимна вложеност трябва да са уникални в календар!,0
-error,calendar.location,0,The name of calendar location must be unique!,Името на местонахождението на календара трябва да е уникално!,0
-error,calendar.rrule,0,"Invalid ""By Day""","Невалиден ""По ден""",0
-error,calendar.rrule,0,"Invalid ""By Hour""","Навалиден ""По час""",0
-error,calendar.rrule,0,"Invalid ""By Minute""","Невалиден ""По минута""",0
-error,calendar.rrule,0,"Invalid ""By Month Day""","Невалиден ""По ден от месец""",0
-error,calendar.rrule,0,"Invalid ""By Month""","Невалидно ""По месец""",0
-error,calendar.rrule,0,"Invalid ""By Position""","Невалиден ""По позиция""",0
-error,calendar.rrule,0,"Invalid ""By Second""","Невалиден ""По секунда""",0
-error,calendar.rrule,0,"Invalid ""By Week Number""","Невалиден ""По номер на седмица""",0
-error,calendar.rrule,0,"Invalid ""By Year Day""","Невалиден ""По ден от годината""",0
-error,calendar.rrule,0,"Only one of ""until"" and ""count"" can be set!","""Крайна дата"" и ""брой"" не може да се попълва по едно и също време!",0
-field,"calendar.alarm,rec_name",0,Name,Име,0
-field,"calendar.alarm,valarm",0,valarm,,0
-field,"calendar.attendee,attendee",0,attendee,присътващ,0
-field,"calendar.attendee,email",0,Email,Email,0
-field,"calendar.attendee,rec_name",0,Name,Име,0
-field,"calendar.attendee,status",0,Participation Status,Статус на участие,0
-field,"calendar.calendar,description",0,Description,Описание,0
-field,"calendar.calendar,name",0,Name,Име,0
-field,"calendar.calendar,owner",0,Owner,Собственик,0
-field,"calendar.calendar,read_users",0,Read Users,Потребители с права за четене,0
-field,"calendar.calendar,rec_name",0,Name,Име,0
-field,"calendar.calendar,write_users",0,Write Users,Записване на потребители,0
-field,"calendar.calendar-read-res.user,calendar",0,Calendar,Календар,0
-field,"calendar.calendar-read-res.user,rec_name",0,Name,Име,0
-field,"calendar.calendar-read-res.user,user",0,User,Потребител,0
-field,"calendar.calendar-write-res.user,calendar",0,Calendar,Календар,0
-field,"calendar.calendar-write-res.user,rec_name",0,Name,Име,0
-field,"calendar.calendar-write-res.user,user",0,User,Потребител,0
-field,"calendar.category,name",0,Name,Име,0
-field,"calendar.category,rec_name",0,Name,Име,0
-field,"calendar.date,date",0,Is Date,Е дата,0
-field,"calendar.date,datetime",0,Date,Дата,0
-field,"calendar.date,rec_name",0,Name,Име,0
-field,"calendar.event,alarms",0,Alarms,Аларми,0
-field,"calendar.event,all_day",0,All Day,Всички дни,0
-field,"calendar.event,attendees",0,Attendees,Присъстващи,0
-field,"calendar.event,calendar",0,Calendar,Календар,0
-field,"calendar.event,calendar_owner",0,Owner,Собственик,0
-field,"calendar.event,calendar_read_users",0,Read Users,Потребители с права за четене,0
-field,"calendar.event,calendar_write_users",0,Write Users,Записване на потребители,0
-field,"calendar.event,categories",0,Categories,Категории,0
-field,"calendar.event,classification",0,Classification,Класификация,0
-field,"calendar.event,description",0,Description,Описание,0
-field,"calendar.event,dtend",0,End Date,Крайна дата,0
-field,"calendar.event,dtstart",0,Start Date,Начална дата,0
-field,"calendar.event,exdates",0,Exception Dates,Дати на грешките,0
-field,"calendar.event,exrules",0,Exception Rules,Правила при грешка,0
-field,"calendar.event,location",0,Location,Местоположение,0
-field,"calendar.event,occurences",0,Occurences,Събития,0
-field,"calendar.event,organizer",0,Organizer,Организатор,0
-field,"calendar.event,parent",0,Parent,Родител,0
-field,"calendar.event,rdates",0,Recurrence Dates,Дати на повторяемост,0
-field,"calendar.event,rec_name",0,Name,Име,0
-field,"calendar.event,recurrence",0,Recurrence,Повторение,0
-field,"calendar.event,rrules",0,Recurrence Rules,Правила за повторяемост,0
-field,"calendar.event,sequence",0,Sequence,Последователност,0
-field,"calendar.event,status",0,Status,Състояние,0
-field,"calendar.event,summary",0,Summary,Обобщено,0
-field,"calendar.event,timezone",0,Timezone,Времева зона,0
-field,"calendar.event,transp",0,Time Transparency,Прозрачен във времето,0
-field,"calendar.event,uuid",0,UUID,UUID,0
-field,"calendar.event,vevent",0,vevent,,0
-field,"calendar.event-calendar.category,category",0,Category,Категория,0
-field,"calendar.event-calendar.category,event",0,Event,Събитие,0
-field,"calendar.event-calendar.category,rec_name",0,Name,Име,0
-field,"calendar.event.alarm,calendar_alarm",0,Calendar Alarm,Аларма на календар,0
-field,"calendar.event.alarm,event",0,Event,Събитие,0
-field,"calendar.event.alarm,rec_name",0,Name,Име,0
-field,"calendar.event.attendee,calendar_attendee",0,Calendar Attendee,Присъстващ на календар,0
-field,"calendar.event.attendee,event",0,Event,Събитие,0
-field,"calendar.event.attendee,rec_name",0,Name,Име,0
-field,"calendar.event.exdate,calendar_date",0,Calendar Date,Дата от календар,0
-field,"calendar.event.exdate,event",0,Event,Събитие,0
-field,"calendar.event.exdate,rec_name",0,Name,Име,0
-field,"calendar.event.exrule,calendar_rrule",0,Calendar RRule,,0
-field,"calendar.event.exrule,event",0,Event,Събитие,0
-field,"calendar.event.exrule,rec_name",0,Name,Име,0
-field,"calendar.event.rdate,calendar_date",0,Calendar Date,Дата от календар,0
-field,"calendar.event.rdate,event",0,Event,Събитие,0
-field,"calendar.event.rdate,rec_name",0,Name,Име,0
-field,"calendar.event.rrule,calendar_rrule",0,Calendar RRule,,0
-field,"calendar.event.rrule,event",0,Event,Събитие,0
-field,"calendar.event.rrule,rec_name",0,Name,Име,0
-field,"calendar.location,name",0,Name,Име,0
-field,"calendar.location,rec_name",0,Name,Име,0
-field,"calendar.rrule,byday",0,By Day,По ден,0
-field,"calendar.rrule,byhour",0,By Hour,По час,0
-field,"calendar.rrule,byminute",0,By Minute,По минута,0
-field,"calendar.rrule,bymonth",0,By Month,По месец,0
-field,"calendar.rrule,bymonthday",0,By Month Day,По ден от месеца,0
-field,"calendar.rrule,bysecond",0,By Second,По секунда,0
-field,"calendar.rrule,bysetpos",0,By Position,По позиция,0
-field,"calendar.rrule,byweekno",0,By Week Number,По номер на седмицата,0
-field,"calendar.rrule,byyearday",0,By Year Day,По ден от годината,0
-field,"calendar.rrule,count",0,Count,Брой,0
-field,"calendar.rrule,freq",0,Frequency,Честота,0
-field,"calendar.rrule,interval",0,Interval,Интервал,0
-field,"calendar.rrule,rec_name",0,Name,Име,0
-field,"calendar.rrule,until",0,Until Date,До дата,0
-field,"calendar.rrule,until_date",0,Is Date,Е дата,0
-field,"calendar.rrule,wkst",0,Week Day,Ден от седмица,0
-field,"res.user,calendars",0,Calendars,Календари,0
-help,"calendar.calendar,owner",0,The user must have an email,Потребителя трябва да има email,0
-help,"calendar.date,date",0,"Ignore time of field ""Date"", but handle as date only.","От полето ""Дата"" се игнорира часа и се използва само датата.",0
-help,"calendar.event,uuid",0,Universally Unique Identifier,Универсален иникален идентификатор,0
-help,"calendar.rrule,until_date",0,"Ignore time of field ""Until Date"", but handle as date only.","От полето ""До дата"" се игнорира часа и се използва само датата.",0
-model,"calendar.alarm,name",0,Alarm,Аларма,0
-model,"calendar.attendee,name",0,Attendee,Присъстващ,0
-model,"calendar.calendar,name",0,Calendar,Календар,0
-model,"calendar.calendar-read-res.user,name",0,Calendar - read - User,,0
-model,"calendar.calendar-write-res.user,name",0,Calendar - write - User,,0
-model,"calendar.category,name",0,Category,Категория,0
-model,"calendar.date,name",0,Calendar Date,Дата от календар,0
-model,"calendar.event,name",0,Event,Събитие,0
-model,"calendar.event-calendar.category,name",0,Event - Category,Събитие - категория,0
-model,"calendar.event.alarm,name",0,Alarm,Аларма,0
-model,"calendar.event.attendee,name",0,Attendee,Присъстващ,0
-model,"calendar.event.exdate,name",0,Exception Date,Дата на грешка,0
-model,"calendar.event.exrule,name",0,Exception Rule,Правило при грешка,0
-model,"calendar.event.rdate,name",0,Recurrence Date,Повтаряща се дата,0
-model,"calendar.event.rrule,name",0,Recurrence Rule,Правило за повторение,0
-model,"calendar.location,name",0,Location,Местоположение,0
-model,"calendar.rrule,name",0,Recurrence Rule,Правило за повторение,0
-model,"ir.action,name",act_calendar_form,Calendars,Календари,0
-model,"ir.action,name",act_calendar_form2,Calendars,Календари,0
-model,"ir.action,name",act_event_form,Events,Събития,0
-model,"ir.action,name",act_event_form2,Events,Събития,0
-model,"ir.action,name",act_event_form3,Events,Събития,0
-model,"ir.ui.menu,name",menu_calendar,Calendar Management,Управление на календари,0
-model,"ir.ui.menu,name",menu_calendar_form,Calendars,Календари,0
-model,"ir.ui.menu,name",menu_calendar_form2,New Calendar,Нов календар,0
-model,"ir.ui.menu,name",menu_event_form,Events,Събития,0
-model,"ir.ui.menu,name",menu_event_form2,New Event,Ново събитие,0
-model,"res.group,name",group_calendar_admin,Calendar Administration,Управление на календар,0
-selection,"calendar.attendee,status",0,,,0
-selection,"calendar.attendee,status",0,Accepted,Приет,0
-selection,"calendar.attendee,status",0,Declined,Отхвърлен,0
-selection,"calendar.attendee,status",0,Delegated,Делегиран,0
-selection,"calendar.attendee,status",0,Needs Action,Необходимо е действие,0
-selection,"calendar.attendee,status",0,Tentative,Пробен,0
-selection,"calendar.event,classification",0,Confidential,Поверителен,0
-selection,"calendar.event,classification",0,Private,Частен,0
-selection,"calendar.event,classification",0,Public,Публичен,0
-selection,"calendar.event,status",0,,,0
-selection,"calendar.event,status",0,Cancelled,Отказан,0
-selection,"calendar.event,status",0,Confirmed,Потвърден,0
-selection,"calendar.event,status",0,Tentative,Пробен,0
-selection,"calendar.event,transp",0,Opaque,Непрозрачен,0
-selection,"calendar.event,transp",0,Transparent,Прозрачен,0
-selection,"calendar.rrule,freq",0,Daily,Ежедневно,0
-selection,"calendar.rrule,freq",0,Hourly,Ежечасно,0
-selection,"calendar.rrule,freq",0,Minutely,Ежеминутно,0
-selection,"calendar.rrule,freq",0,Monthly,Месечно,0
-selection,"calendar.rrule,freq",0,Secondly,Всяка секунда,0
-selection,"calendar.rrule,freq",0,Weekly,Седмично,0
-selection,"calendar.rrule,freq",0,Yearly,Годишно,0
-selection,"calendar.rrule,wkst",0,Friday,Петък,0
-selection,"calendar.rrule,wkst",0,Monday,Понеделник,0
-selection,"calendar.rrule,wkst",0,Saturday,Събота,0
-selection,"calendar.rrule,wkst",0,Sunday,Неделя,0
-selection,"calendar.rrule,wkst",0,Thursday,Четвъртък,0
-selection,"calendar.rrule,wkst",0,Tuesday,Вторник,0
-selection,"calendar.rrule,wkst",0,Wednesday,Четвъртък,0
-view,calendar.calendar,0,Calendar,Календар,0
-view,calendar.calendar,0,Calendars,Календари,0
-view,calendar.calendar,0,General,Основен,0
-view,calendar.calendar,0,Security,Сигурност,0
-view,calendar.category,0,Categories,Категории,0
-view,calendar.category,0,Category,Категория,0
-view,calendar.event,0,Attendees,Присъстващи,0
-view,calendar.event,0,Categories,Категории,0
-view,calendar.event,0,Event,Събитие,0
-view,calendar.event,0,Events,Събития,0
-view,calendar.event,0,General,Основен,0
-view,calendar.event,0,Occurences,Събития,0
-view,calendar.event.attendee,0,Attendee,Присъстващ,0
-view,calendar.event.attendee,0,Attendees,Присъстващи,0
-view,calendar.event.exdate,0,Exception Date,Дата на грешка,0
-view,calendar.event.exdate,0,Exception Dates,Дати на грешките,0
-view,calendar.event.exrule,0,Exception Rule,Правило при грешка,0
-view,calendar.event.exrule,0,Exception Rules,Правила при грешка,0
-view,calendar.event.rdate,0,Recurrence Date,Повтаряща се дата,0
-view,calendar.event.rdate,0,Recurrence Dates,Дати на повторяемост,0
-view,calendar.event.rrule,0,Recurrence Rule,Правило за повторение,0
-view,calendar.event.rrule,0,Recurrence Rules,Правила за повторяемост,0
-view,calendar.location,0,Location,Местоположение,0
-view,calendar.location,0,Locations,Местонахождения,0
diff --git a/calendar.py b/calendar.py
index d5204e8..24d3635 100644
--- a/calendar.py
+++ b/calendar.py
@@ -1,6 +1,5 @@
 #This file is part of Tryton.  The COPYRIGHT file at the top level of
 #this repository contains the full copyright notices and license terms.
-from __future__ import with_statement
 import uuid
 import vobject
 import dateutil.tz
@@ -10,9 +9,10 @@ import xml.dom.minidom
 from trytond.model import ModelSQL, ModelView, fields
 from trytond.tools import reduce_ids
 from trytond.backend import TableHandler
-from trytond.pyson import If, Bool, Not, Eval, Greater
+from trytond.pyson import If, Bool, Eval
 from trytond.transaction import Transaction
 from trytond.cache import Cache
+from trytond.pool import Pool
 tzlocal = dateutil.tz.tzlocal()
 tzutc = dateutil.tz.tzutc()
 domimpl = xml.dom.minidom.getDOMImplementation()
@@ -96,7 +96,7 @@ class Calendar(ModelSQL, ModelView):
         :param calendar_id: an id of calendar.calendar
         :return: an iCalendar
         '''
-        event_obj = self.pool.get('calendar.event')
+        event_obj = Pool().get('calendar.event')
 
         ical = vobject.iCalendar()
         ical.vevent_list = []
@@ -139,7 +139,7 @@ class Calendar(ModelSQL, ModelView):
         :param dtend: a date of datetime
         :return: an iCalendar
         '''
-        event_obj = self.pool.get('calendar.event')
+        event_obj = Pool().get('calendar.event')
 
         ical = vobject.iCalendar()
         ical.add('method').value = 'REPLY'
@@ -274,13 +274,13 @@ class Calendar(ModelSQL, ModelView):
         :return: the xml with schedule-response
         '''
         from DAV.errors import DAV_Forbidden
-        collection_obj = self.pool.get('webdav.collection')
+        collection_obj = Pool().get('webdav.collection')
 
         calendar_id = collection_obj.calendar(uri)
         if not calendar_id:
             raise DAV_Forbidden
         calendar = self.browse(calendar_id)
-        if calendar.owner.id != user:
+        if calendar.owner.id != Transaction().user:
             raise DAV_Forbidden
         ical = vobject.readOne(data)
         if ical.method.value == 'REQUEST' \
@@ -441,8 +441,8 @@ class Event(ModelSQL, ModelView):
         ('cancelled', 'Cancelled'),
         ], 'Status')
     organizer = fields.Char('Organizer', states={
-        'required': If(Bool(Eval('attendees')), Not(Bool(Eval('parent'))), False),
-        }, depends=['attendees', 'parent'])
+            'required': If(Bool(Eval('attendees')), ~Eval('parent'), False),
+            }, depends=['attendees', 'parent'])
     attendees = fields.One2Many('calendar.event.attendee', 'event',
             'Attendees')
     transp = fields.Selection([
@@ -451,40 +451,40 @@ class Event(ModelSQL, ModelView):
         ], 'Time Transparency', required=True)
     alarms = fields.One2Many('calendar.event.alarm', 'event', 'Alarms')
     rdates = fields.One2Many('calendar.event.rdate', 'event', 'Recurrence Dates',
-            states={
-                'invisible': Bool(Eval('parent')),
+        states={
+            'invisible': Bool(Eval('parent')),
             }, depends=['parent'])
     rrules = fields.One2Many('calendar.event.rrule', 'event', 'Recurrence Rules',
-            states={
-                'invisible': Bool(Eval('parent')),
+        states={
+            'invisible': Bool(Eval('parent')),
             }, depends=['parent'])
     exdates = fields.One2Many('calendar.event.exdate', 'event', 'Exception Dates',
-            states={
-                'invisible': Bool(Eval('parent')),
+        states={
+            'invisible': Bool(Eval('parent')),
             }, depends=['parent'])
     exrules = fields.One2Many('calendar.event.exrule', 'event', 'Exception Rules',
-            states={
-                'invisible': Bool(Eval('parent')),
+        states={
+            'invisible': Bool(Eval('parent')),
             }, depends=['parent'])
     occurences = fields.One2Many('calendar.event', 'parent', 'Occurences',
-            domain=[
-                ('uuid', '=', Eval('uuid')),
-                ('calendar', '=', Eval('calendar')),
+        domain=[
+            ('uuid', '=', Eval('uuid')),
+            ('calendar', '=', Eval('calendar')),
             ],
-            states={
-                'invisible': Bool(Eval('parent')),
+        states={
+            'invisible': Bool(Eval('parent')),
             }, depends=['uuid', 'calendar', 'parent'])
     parent = fields.Many2One('calendar.event', 'Parent',
-            domain=[
-                ('uuid', '=', Eval('uuid')),
-                ('parent', '=', False),
-                ('calendar', '=', Eval('calendar')),
+        domain=[
+            ('uuid', '=', Eval('uuid')),
+            ('parent', '=', False),
+            ('calendar', '=', Eval('calendar')),
             ],
-            ondelete='CASCADE', depends=['uuid', 'calendar'])
+        ondelete='CASCADE', depends=['uuid', 'calendar'])
     recurrence = fields.DateTime('Recurrence', select=1, states={
-                'invisible': Not(Bool(Eval('_parent_parent'))),
-                'required': Bool(Eval('_parent_parent')),
-                }, depends=['parent'])
+            'invisible': ~Eval('_parent_parent'),
+            'required': Bool(Eval('_parent_parent')),
+            }, depends=['parent'])
     calendar_owner = fields.Function(fields.Many2One('res.user', 'Owner'),
             'get_calendar_field', searcher='search_calendar_field')
     calendar_read_users = fields.Function(fields.Many2One('res.user',
@@ -508,8 +508,8 @@ class Event(ModelSQL, ModelView):
 
     def init(self, module_name):
         # Migrate from 1.4: remove classification_public
-        model_data_obj = self.pool.get('ir.model.data')
-        rule_obj = self.pool.get('ir.rule')
+        model_data_obj = Pool().get('ir.model.data')
+        rule_obj = Pool().get('ir.rule')
         with Transaction().set_user(0):
             model_data_ids = model_data_obj.search([
                 ('fs_id', '=', 'rule_group_read_calendar_line3'),
@@ -534,7 +534,7 @@ class Event(ModelSQL, ModelView):
         return 'opaque'
 
     def default_timezone(self):
-        user_obj = self.pool.get('res.user')
+        user_obj = Pool().get('res.user')
         user = user_obj.browse(Transaction().user)
         return user.timezone
 
@@ -572,8 +572,8 @@ class Event(ModelSQL, ModelView):
         return True
 
     def create(self, values):
-        calendar_obj = self.pool.get('calendar.calendar')
-        collection_obj = self.pool.get('webdav.collection')
+        calendar_obj = Pool().get('calendar.calendar')
+        collection_obj = Pool().get('webdav.collection')
 
         res = super(Event, self).create(values)
         event = self.browse(res)
@@ -622,10 +622,11 @@ class Event(ModelSQL, ModelView):
         return res
 
     def _event2update(self, event):
-        rdate_obj = self.pool.get('calendar.event.rdate')
-        exdate_obj = self.pool.get('calendar.event.exdate')
-        rrule_obj = self.pool.get('calendar.event.rrule')
-        exrule_obj = self.pool.get('calendar.event.exrule')
+        pool = Pool()
+        rdate_obj = pool.get('calendar.event.rdate')
+        exdate_obj = pool.get('calendar.event.exdate')
+        rrule_obj = pool.get('calendar.event.rrule')
+        exrule_obj = pool.get('calendar.event.exrule')
 
         res = {}
         res['summary'] = event.summary
@@ -655,8 +656,8 @@ class Event(ModelSQL, ModelView):
         return res
 
     def write(self, ids, values):
-        calendar_obj = self.pool.get('calendar.calendar')
-        collection_obj = self.pool.get('webdav.collection')
+        calendar_obj = Pool().get('calendar.calendar')
+        collection_obj = Pool().get('webdav.collection')
         cursor = Transaction().cursor
 
         values = values.copy()
@@ -675,6 +676,8 @@ class Event(ModelSQL, ModelView):
                     'SET sequence = sequence + 1 ' \
                     'WHERE ' + red_sql, red_ids)
 
+        if not values:
+            return res
         for event in self.browse(ids):
             if event.calendar.owner \
                     and (event.organizer == event.calendar.owner.email \
@@ -688,18 +691,20 @@ class Event(ModelSQL, ModelView):
                     attendee_emails = [x.email for x in event.parent.attendees
                             if x.status != 'declined'
                             and x.email != event.parent.organizer]
-                if attendee_emails:
-                    with Transaction().set_user(0):
-                        event_ids = self.search([
-                            ('uuid', '=', event.uuid),
-                            ('calendar.owner.email', 'in', attendee_emails),
-                            ('id', '!=', event.id),
-                            ('recurrence', '=', event.recurrence or False),
-                            ])
-                        for event2 in self.browse(event_ids):
-                            if event2.calendar.owner.email in attendee_emails:
-                                attendee_emails.remove(
-                                        event2.calendar.owner.email)
+                with Transaction().set_user(0):
+                    event_ids = self.search([
+                        ('uuid', '=', event.uuid),
+                        ('id', '!=', event.id),
+                        ('recurrence', '=', event.recurrence or False),
+                        ])
+                    for event2 in self.browse(event_ids):
+                        if event2.calendar.owner.email in attendee_emails:
+                            attendee_emails.remove(
+                                    event2.calendar.owner.email)
+                        else:
+                            event_ids.remove(event2.id)
+                            self.delete(event2.id)
+                    if event_ids:
                         self.write(event_ids, self._event2update(event))
                 if attendee_emails:
                     with Transaction().set_user(0):
@@ -734,8 +739,8 @@ class Event(ModelSQL, ModelView):
         return res
 
     def delete(self, ids):
-        attendee_obj = self.pool.get('calendar.event.attendee')
-        collection_obj = self.pool.get('webdav.collection')
+        attendee_obj = Pool().get('calendar.event.attendee')
+        collection_obj = Pool().get('webdav.collection')
 
         if isinstance(ids, (int, long)):
             ids = [ids]
@@ -794,15 +799,16 @@ class Event(ModelSQL, ModelView):
         :param vevent: the vevent of the ical to use if None use the first one
         :return: a dictionary with values
         '''
-        category_obj = self.pool.get('calendar.category')
-        location_obj = self.pool.get('calendar.location')
-        user_obj = self.pool.get('res.user')
-        alarm_obj = self.pool.get('calendar.event.alarm')
-        attendee_obj = self.pool.get('calendar.event.attendee')
-        rdate_obj = self.pool.get('calendar.event.rdate')
-        exdate_obj = self.pool.get('calendar.event.exdate')
-        rrule_obj = self.pool.get('calendar.event.rrule')
-        exrule_obj = self.pool.get('calendar.event.exrule')
+        pool = Pool()
+        category_obj = pool.get('calendar.category')
+        location_obj = pool.get('calendar.location')
+        user_obj = pool.get('res.user')
+        alarm_obj = pool.get('calendar.event.alarm')
+        attendee_obj = pool.get('calendar.event.attendee')
+        rdate_obj = pool.get('calendar.event.rdate')
+        exdate_obj = pool.get('calendar.event.exdate')
+        rrule_obj = pool.get('calendar.event.rrule')
+        exrule_obj = pool.get('calendar.event.exrule')
 
         vevents = []
         if not vevent:
@@ -1037,13 +1043,14 @@ class Event(ModelSQL, ModelView):
             or a calendar.calendar id
         :return: an iCalendar instance of vobject
         '''
-        user_obj = self.pool.get('res.user')
-        alarm_obj = self.pool.get('calendar.event.alarm')
-        attendee_obj = self.pool.get('calendar.event.attendee')
-        rdate_obj = self.pool.get('calendar.event.rdate')
-        exdate_obj = self.pool.get('calendar.event.exdate')
-        rrule_obj = self.pool.get('calendar.event.rrule')
-        exrule_obj = self.pool.get('calendar.event.exrule')
+        pool = Pool()
+        user_obj = pool.get('res.user')
+        alarm_obj = pool.get('calendar.event.alarm')
+        attendee_obj = pool.get('calendar.event.attendee')
+        rdate_obj = pool.get('calendar.event.rdate')
+        exdate_obj = pool.get('calendar.event.exdate')
+        rrule_obj = pool.get('calendar.event.rrule')
+        exrule_obj = pool.get('calendar.event.exrule')
 
         if isinstance(event, (int, long)):
             event = self.browse(event)
@@ -1250,14 +1257,14 @@ class EventAlarm(ModelSQL):
             required=True, select=1)
 
     def create(self, values):
-        event_obj = self.pool.get('calendar.event')
+        event_obj = Pool().get('calendar.event')
         if values.get('event'):
             # Update write_date of event
             event_obj.write(values['event'], {})
         return super(EventAlarm, self).create(values)
 
     def write(self, ids, values):
-        event_obj = self.pool.get('calendar.event')
+        event_obj = Pool().get('calendar.event')
         if isinstance(ids, (int, long)):
             ids = [ids]
         event_ids = [x.event.id for x in self.browse(ids)]
@@ -1269,8 +1276,8 @@ class EventAlarm(ModelSQL):
         return super(EventAlarm, self).write(ids, values)
 
     def delete(self, ids):
-        event_obj = self.pool.get('calendar.event')
-        alarm_obj = self.pool.get('calendar.alarm')
+        event_obj = Pool().get('calendar.event')
+        alarm_obj = Pool().get('calendar.alarm')
         if isinstance(ids, (int, long)):
             ids = [ids]
         event_alarms = self.browse(ids)
@@ -1285,11 +1292,11 @@ class EventAlarm(ModelSQL):
         return res
 
     def valarm2values(self, alarm):
-        alarm_obj = self.pool.get('calendar.alarm')
+        alarm_obj = Pool().get('calendar.alarm')
         return alarm_obj.valarm2values(alarm)
 
     def alarm2valarm(self, alarm):
-        alarm_obj = self.pool.get('calendar.alarm')
+        alarm_obj = Pool().get('calendar.alarm')
         return alarm_obj.alarm2valarm(alarm)
 
 EventAlarm()
@@ -1301,8 +1308,8 @@ class Attendee(ModelSQL, ModelView):
     _name = 'calendar.attendee'
 
     email = fields.Char('Email', required=True, states={
-        'readonly': Greater(Eval('active_id', 0), 0),
-        })
+        'readonly': Eval('id', 0) > 0,
+        }, depends=['id'])
     status = fields.Selection([
         ('', ''),
         ('needs-action', 'Needs Action'),
@@ -1382,7 +1389,7 @@ class EventAttendee(ModelSQL, ModelView):
             required=True, select=1)
 
     def create(self, values):
-        event_obj = self.pool.get('calendar.event')
+        event_obj = Pool().get('calendar.event')
         if values.get('event'):
             # Update write_date of event
             event_obj.write(values['event'], {})
@@ -1414,7 +1421,7 @@ class EventAttendee(ModelSQL, ModelView):
         return res
 
     def write(self, ids, values):
-        event_obj = self.pool.get('calendar.event')
+        event_obj = Pool().get('calendar.event')
         if isinstance(ids, (int, long)):
             ids = [ids]
         event_ids = [x.event.id for x in self.browse(ids)]
@@ -1458,8 +1465,8 @@ class EventAttendee(ModelSQL, ModelView):
         return res
 
     def delete(self, ids):
-        event_obj = self.pool.get('calendar.event')
-        attendee_obj = self.pool.get('calendar.attendee')
+        event_obj = Pool().get('calendar.event')
+        attendee_obj = Pool().get('calendar.attendee')
 
         if isinstance(ids, (int, long)):
             ids = [ids]
@@ -1521,7 +1528,7 @@ class EventAttendee(ModelSQL, ModelView):
         return res
 
     def copy(self, ids, default=None):
-        attendee_obj = self.pool.get('calendar.attendee')
+        attendee_obj = Pool().get('calendar.attendee')
 
         int_id = False
         if isinstance(ids, (int, long)):
@@ -1542,15 +1549,15 @@ class EventAttendee(ModelSQL, ModelView):
         return new_ids
 
     def _attendee2update(self, attendee):
-        attendee_obj = self.pool.get('calendar.attendee')
+        attendee_obj = Pool().get('calendar.attendee')
         return attendee_obj._attendee2update(attendee)
 
     def attendee2values(self, attendee):
-        attendee_obj = self.pool.get('calendar.attendee')
+        attendee_obj = Pool().get('calendar.attendee')
         return attendee_obj.attendee2values(attendee)
 
     def attendee2attendee(self, attendee):
-        attendee_obj = self.pool.get('calendar.attendee')
+        attendee_obj = Pool().get('calendar.attendee')
         return attendee_obj.attendee2attendee(attendee)
 
 EventAttendee()
@@ -1642,14 +1649,14 @@ class EventRDate(ModelSQL, ModelView):
         return super(EventRDate, self).init(module_name)
 
     def create(self, values):
-        event_obj = self.pool.get('calendar.event')
+        event_obj = Pool().get('calendar.event')
         if values.get('event'):
             # Update write_date of event
             event_obj.write(values['event'], {})
         return super(EventRDate, self).create(values)
 
     def write(self, ids, values):
-        event_obj = self.pool.get('calendar.event')
+        event_obj = Pool().get('calendar.event')
         if isinstance(ids, (int, long)):
             ids = [ids]
         event_ids = [x.event.id for x in self.browse(ids)]
@@ -1661,8 +1668,8 @@ class EventRDate(ModelSQL, ModelView):
         return super(EventRDate, self).write(ids, values)
 
     def delete(self, ids):
-        event_obj = self.pool.get('calendar.event')
-        rdate_obj = self.pool.get('calendar.date')
+        event_obj = Pool().get('calendar.event')
+        rdate_obj = Pool().get('calendar.date')
         if isinstance(ids, (int, long)):
             ids = [ids]
         event_rdates = self.browse(ids)
@@ -1677,15 +1684,15 @@ class EventRDate(ModelSQL, ModelView):
         return res
 
     def _date2update(self, date):
-        date_obj = self.pool.get('calendar.date')
+        date_obj = Pool().get('calendar.date')
         return date_obj._date2update(date)
 
     def date2values(self, date):
-        date_obj = self.pool.get('calendar.date')
+        date_obj = Pool().get('calendar.date')
         return date_obj.date2values(date)
 
     def date2date(self, date):
-        date_obj = self.pool.get('calendar.date')
+        date_obj = Pool().get('calendar.date')
         return date_obj.date2date(date)
 
 EventRDate()
@@ -1984,14 +1991,14 @@ class EventRRule(ModelSQL, ModelView):
 
 
     def create(self, values):
-        event_obj = self.pool.get('calendar.event')
+        event_obj = Pool().get('calendar.event')
         if values.get('event'):
             # Update write_date of event
             event_obj.write(values['event'], {})
         return super(EventRRule, self).create(values)
 
     def write(self, ids, values):
-        event_obj = self.pool.get('calendar.event')
+        event_obj = Pool().get('calendar.event')
         if isinstance(ids, (int, long)):
             ids = [ids]
         event_ids = [x.event.id for x in self.browse(ids)]
@@ -2003,8 +2010,8 @@ class EventRRule(ModelSQL, ModelView):
         return super(EventRRule, self).write(ids, values)
 
     def delete(self, ids):
-        event_obj = self.pool.get('calendar.event')
-        rrule_obj = self.pool.get('calendar.rrule')
+        event_obj = Pool().get('calendar.event')
+        rrule_obj = Pool().get('calendar.rrule')
         if isinstance(ids, (int, long)):
             ids = [ids]
         event_rrules = self.browse(ids)
@@ -2019,15 +2026,15 @@ class EventRRule(ModelSQL, ModelView):
         return res
 
     def _rule2update(self, rule):
-        rule_obj = self.pool.get('calendar.rrule')
+        rule_obj = Pool().get('calendar.rrule')
         return rule_obj._rule2update(rule)
 
     def rule2values(self, rule):
-        rule_obj = self.pool.get('calendar.rrule')
+        rule_obj = Pool().get('calendar.rrule')
         return rule_obj.rule2values(rule)
 
     def rule2rule(self, rule):
-        rule_obj = self.pool.get('calendar.rrule')
+        rule_obj = Pool().get('calendar.rrule')
         return rule_obj.rule2rule(rule)
 
 EventRRule()
diff --git a/calendar.xml b/calendar.xml
index c668799..bdf5ea1 100644
--- a/calendar.xml
+++ b/calendar.xml
@@ -7,14 +7,18 @@ this repository contains the full copyright notices and license terms. -->
         <record model="res.group" id="group_calendar_admin">
             <field name="name">Calendar Administration</field>
         </record>
-        <record model="res.user" id="res.user_admin">
-            <field name="groups" eval="[('add', ref('group_calendar_admin'))]"/>
+        <record model="res.user-res.group"
+            id="user_admin_group_calendar_admin">
+            <field name="user" ref="res.user_admin"/>
+            <field name="group" ref="group_calendar_admin"/>
         </record>
-        <record model="res.user" id="res.user_trigger">
-            <field name="groups" eval="[('add', ref('group_calendar_admin'))]"/>
+        <record model="res.user-res.group"
+            id="user_trigger_group_calendar_admin">
+            <field name="user" ref="res.user_trigger"/>
+            <field name="group" ref="group_calendar_admin"/>
         </record>
 
-        <menuitem name="Calendar Management" sequence="8" id="menu_calendar"/>
+        <menuitem name="Calendar" sequence="8" id="menu_calendar"/>
 
         <record model="ir.ui.view" id="calendar_view_tree">
             <field name="model">calendar.calendar</field>
@@ -22,8 +26,8 @@ this repository contains the full copyright notices and license terms. -->
             <field name="arch" type="xml">
                 <![CDATA[
                 <tree string="Calendars">
-                    <field name="name" select="1"/>
-                    <field name="owner" select="1"/>
+                    <field name="name"/>
+                    <field name="owner"/>
                 </tree>
                 ]]>
             </field>
@@ -44,9 +48,7 @@ this repository contains the full copyright notices and license terms. -->
                             <field name="description" colspan="4"/>
                         </page>
                         <page string="Security" id="security">
-                            <separator name="read_users" colspan="4"/>
                             <field name="read_users" colspan="4"/>
-                            <separator name="write_users" colspan="4"/>
                             <field name="write_users" colspan="4"/>
                         </page>
                     </notebook>
@@ -70,22 +72,6 @@ this repository contains the full copyright notices and license terms. -->
         </record>
         <menuitem parent="menu_calendar" sequence="1"
             action="act_calendar_form" id="menu_calendar_form"/>
-        <record model="ir.action.act_window" id="act_calendar_form2">
-            <field name="name">Calendars</field>
-            <field name="res_model">calendar.calendar</field>
-        </record>
-        <record model="ir.action.act_window.view" id="act_calendar_form2_view1">
-            <field name="sequence" eval="10"/>
-            <field name="view" ref="calendar_view_form"/>
-            <field name="act_window" ref="act_calendar_form2"/>
-        </record>
-        <record model="ir.action.act_window.view" id="act_calendar_form2_view2">
-            <field name="sequence" eval="20"/>
-            <field name="view" ref="calendar_view_tree"/>
-            <field name="act_window" ref="act_calendar_form2"/>
-        </record>
-        <menuitem name="New Calendar" parent="menu_calendar_form" sequence="10"
-            action="act_calendar_form2" id="menu_calendar_form2"/>
 
         <record model="ir.rule.group" id="rule_group_read_calendar">
             <field name="model" search="[('model', '=', 'calendar.event')]"/>
@@ -137,7 +123,7 @@ this repository contains the full copyright notices and license terms. -->
             <field name="arch" type="xml">
                 <![CDATA[
                 <tree string="Categories">
-                    <field name="name" select="1"/>
+                    <field name="name"/>
                 </tree>
                 ]]>
             </field>
@@ -162,7 +148,7 @@ this repository contains the full copyright notices and license terms. -->
             <field name="arch" type="xml">
                 <![CDATA[
                 <tree string="Locations">
-                    <field name="name" select="1"/>
+                    <field name="name"/>
                 </tree>
                 ]]>
             </field>
@@ -187,12 +173,12 @@ this repository contains the full copyright notices and license terms. -->
             <field name="arch" type="xml">
                 <![CDATA[
                 <tree string="Events">
-                    <field name="calendar" select="1"/>
-                    <field name="summary" select="1"/>
+                    <field name="calendar"/>
+                    <field name="summary"/>
                     <field name="all_day"/>
-                    <field name="dtstart" select="1"/>
-                    <field name="dtend" select="2"/>
-                    <field name="status" select="2"/>
+                    <field name="dtstart"/>
+                    <field name="dtend"/>
+                    <field name="status"/>
                 </tree>
                 ]]>
             </field>
@@ -230,7 +216,6 @@ this repository contains the full copyright notices and license terms. -->
                             <field name="description" colspan="4"/>
                         </page>
                         <page string="Categories" id="categories">
-                            <separator name="categories" colspan="4"/>
                             <field name="categories" colspan="4"/>
                         </page>
                         <page string="Attendees" id="attendees">
@@ -246,12 +231,12 @@ this repository contains the full copyright notices and license terms. -->
                             <field name="exdates" colspan="2"/>
                             <field name="occurences" colspan="4">
                                 <tree string="Events">
-                                    <field name="summary" select="1"/>
-                                    <field name="recurrence" select="1"/>
+                                    <field name="summary"/>
+                                    <field name="recurrence"/>
                                     <field name="all_day"/>
-                                    <field name="dtstart" select="2"/>
-                                    <field name="dtend" select="2"/>
-                                    <field name="status" select="2"/>
+                                    <field name="dtstart"/>
+                                    <field name="dtend"/>
+                                    <field name="status"/>
                                 </tree>
                             </field>
                         </page>
@@ -279,23 +264,6 @@ this repository contains the full copyright notices and license terms. -->
         </record>
         <menuitem parent="menu_calendar_form" sequence="20"
             action="act_event_form" id="menu_event_form"/>
-        <record model="ir.action.act_window" id="act_event_form2">
-            <field name="name">Events</field>
-            <field name="res_model">calendar.event</field>
-            <field name="domain">[('parent', '=', False)]</field>
-        </record>
-        <record model="ir.action.act_window.view" id="act_event_form2_view1">
-            <field name="sequence" eval="10"/>
-            <field name="view" ref="event_view_form"/>
-            <field name="act_window" ref="act_event_form2"/>
-        </record>
-        <record model="ir.action.act_window.view" id="act_event_form2_view2">
-            <field name="sequence" eval="20"/>
-            <field name="view" ref="event_view_tree"/>
-            <field name="act_window" ref="act_event_form2"/>
-        </record>
-        <menuitem name="New Event" parent="menu_event_form" sequence="10"
-            action="act_event_form2" id="menu_event_form2"/>
 
         <record model="ir.action.act_window" id="act_event_form3">
             <field name="name">Events</field>
@@ -315,7 +283,7 @@ this repository contains the full copyright notices and license terms. -->
         <record model="ir.action.keyword"
                 id="act_open_event_keyword1">
             <field name="keyword">form_relate</field>
-            <field name="model">calendar.calendar,0</field>
+            <field name="model">calendar.calendar,-1</field>
             <field name="action" ref="act_event_form3"/>
         </record>
 
@@ -325,9 +293,9 @@ this repository contains the full copyright notices and license terms. -->
             <field name="arch" type="xml">
                 <![CDATA[
                 <tree string="Attendees">
-                    <field name="event" select="1"/>
-                    <field name="email" select="1"/>
-                    <field name="status" select="1"/>
+                    <field name="event"/>
+                    <field name="email"/>
+                    <field name="status"/>
                 </tree>
                 ]]>
             </field>
@@ -356,9 +324,9 @@ this repository contains the full copyright notices and license terms. -->
             <field name="arch" type="xml">
                 <![CDATA[
                 <tree string="Recurrence Dates">
-                    <field name="event" select="1"/>
-                    <field name="datetime" select="1"/>
-                    <field name="date" select="2"/>
+                    <field name="event"/>
+                    <field name="datetime"/>
+                    <field name="date"/>
                 </tree>
                 ]]>
             </field>
@@ -387,9 +355,9 @@ this repository contains the full copyright notices and license terms. -->
             <field name="arch" type="xml">
                 <![CDATA[
                 <tree string="Exception Dates">
-                    <field name="event" select="1"/>
-                    <field name="datetime" select="1"/>
-                    <field name="date" select="2"/>
+                    <field name="event"/>
+                    <field name="datetime"/>
+                    <field name="date"/>
                 </tree>
                 ]]>
             </field>
@@ -418,8 +386,8 @@ this repository contains the full copyright notices and license terms. -->
             <field name="arch" type="xml">
                 <![CDATA[
                 <tree string="Recurrence Rules">
-                    <field name="event" select="1"/>
-                    <field name="freq" select="1"/>
+                    <field name="event"/>
+                    <field name="freq"/>
                 </tree>
                 ]]>
             </field>
@@ -474,8 +442,8 @@ this repository contains the full copyright notices and license terms. -->
             <field name="arch" type="xml">
                 <![CDATA[
                 <tree string="Exception Rules">
-                    <field name="event" select="1"/>
-                    <field name="freq" select="1"/>
+                    <field name="event"/>
+                    <field name="freq"/>
                 </tree>
                 ]]>
             </field>
diff --git a/de_DE.csv b/de_DE.csv
deleted file mode 100644
index 7202432..0000000
--- a/de_DE.csv
+++ /dev/null
@@ -1,195 +0,0 @@
-type,name,res_id,src,value,fuzzy
-error,calendar.calendar,0,A user can have only one calendar!,Es ist nur ein Kalender pro Benutzer möglich!,0
-error,calendar.calendar,0,The name of calendar must be unique!,Kalendername kann nicht mehrfach vergeben werden!,0
-error,calendar.category,0,The name of calendar category must be unique!,Name für Kalenderkategorie kann nicht mehrfach vergeben werden!,0
-error,calendar.event,0,Recurrence can not be recurrent!,Wiederholungen können nicht rekursiv sein!,0
-error,calendar.event,0,UUID and recurrence must be unique in a calendar!,UUID und Wiederholung können in einem Kalender nicht mehrfach vergeben werden!,0
-error,calendar.location,0,The name of calendar location must be unique!,Name für Kalenderort kann nicht mehrfach vergeben werden!,0
-error,calendar.rrule,0,"Invalid ""By Day""","Ungültig ""Für Tag""",0
-error,calendar.rrule,0,"Invalid ""By Hour""","Ungültig ""Für Stunde""",0
-error,calendar.rrule,0,"Invalid ""By Minute""","Ungültig ""Für Minute""",0
-error,calendar.rrule,0,"Invalid ""By Month Day""","Ungültig ""Für Tag des Monats""",0
-error,calendar.rrule,0,"Invalid ""By Month""","Ungültig ""Für Monat""",0
-error,calendar.rrule,0,"Invalid ""By Position""","Ungültig ""Für Position""",0
-error,calendar.rrule,0,"Invalid ""By Second""","Ungültig ""Für Sekunde""",0
-error,calendar.rrule,0,"Invalid ""By Week Number""","Ungültig ""Für Woche Nummer""",0
-error,calendar.rrule,0,"Invalid ""By Year Day""","Ungültig ""Für Tag des Jahres""",0
-error,calendar.rrule,0,"Only one of ""until"" and ""count"" can be set!","Es kann nur entweder ""Bis"" oder ""Anzahl"" gesetzt werden!",0
-field,"calendar.alarm,rec_name",0,Name,Name,0
-field,"calendar.alarm,valarm",0,valarm,valarm,0
-field,"calendar.attendee,attendee",0,attendee,Teilnehmer,0
-field,"calendar.attendee,email",0,Email,E-Mail,0
-field,"calendar.attendee,rec_name",0,Name,Name,0
-field,"calendar.attendee,status",0,Participation Status,Teilnahmestatus,0
-field,"calendar.calendar,description",0,Description,Bezeichnung,0
-field,"calendar.calendar,name",0,Name,Name,0
-field,"calendar.calendar,owner",0,Owner,Besitzer,0
-field,"calendar.calendar,read_users",0,Read Users,Benutzer mit Leseberechtigung,0
-field,"calendar.calendar,rec_name",0,Name,Name,0
-field,"calendar.calendar,write_users",0,Write Users,Benutzer mit Schreibberechtigung,0
-field,"calendar.calendar-read-res.user,calendar",0,Calendar,Kalender,0
-field,"calendar.calendar-read-res.user,rec_name",0,Name,Name,0
-field,"calendar.calendar-read-res.user,user",0,User,Benutzer,0
-field,"calendar.calendar-write-res.user,calendar",0,Calendar,Kalender,0
-field,"calendar.calendar-write-res.user,rec_name",0,Name,Name,0
-field,"calendar.calendar-write-res.user,user",0,User,Benutzer,0
-field,"calendar.category,name",0,Name,Name,0
-field,"calendar.category,rec_name",0,Name,Name,0
-field,"calendar.date,date",0,Is Date,Als Datum,0
-field,"calendar.date,datetime",0,Date,Zeitpunkt,0
-field,"calendar.date,rec_name",0,Name,Name,0
-field,"calendar.event,alarms",0,Alarms,Alarm,0
-field,"calendar.event,all_day",0,All Day,Ganztägig,0
-field,"calendar.event,attendees",0,Attendees,Teilnehmer,0
-field,"calendar.event,calendar",0,Calendar,Kalender,0
-field,"calendar.event,calendar_owner",0,Owner,Besitzer,0
-field,"calendar.event,calendar_read_users",0,Read Users,Benutzer mit Leseberechtigung,0
-field,"calendar.event,calendar_write_users",0,Write Users,Benutzer mit Schreibberechtigung,0
-field,"calendar.event,categories",0,Categories,Kategorien,0
-field,"calendar.event,classification",0,Classification,Klassifizierung,0
-field,"calendar.event,description",0,Description,Bezeichnung,0
-field,"calendar.event,dtend",0,End Date,Enddatum,0
-field,"calendar.event,dtstart",0,Start Date,Anfangsdatum,0
-field,"calendar.event,exdates",0,Exception Dates,Ausnahmedaten,0
-field,"calendar.event,exrules",0,Exception Rules,Ausnahmeregeln,0
-field,"calendar.event,location",0,Location,Ort,0
-field,"calendar.event,occurences",0,Occurences,Ereignisse,0
-field,"calendar.event,organizer",0,Organizer,Organisator,0
-field,"calendar.event,parent",0,Parent,Übergeordnet (Termin),0
-field,"calendar.event,rdates",0,Recurrence Dates,Wiederholungsdaten,0
-field,"calendar.event,rec_name",0,Name,Name,0
-field,"calendar.event,recurrence",0,Recurrence,Wiederholung,0
-field,"calendar.event,rrules",0,Recurrence Rules,Wiederholungsregeln,0
-field,"calendar.event,sequence",0,Sequence,Revision,0
-field,"calendar.event,status",0,Status,Status,0
-field,"calendar.event,summary",0,Summary,Zusammenfassung,0
-field,"calendar.event,timezone",0,Timezone,Zeitzone,0
-field,"calendar.event,transp",0,Time Transparency,Zeittransparenz,0
-field,"calendar.event,uuid",0,UUID,UUID,0
-field,"calendar.event,vevent",0,vevent,vevent,0
-field,"calendar.event-calendar.category,category",0,Category,Kategorie,0
-field,"calendar.event-calendar.category,event",0,Event,Termin,0
-field,"calendar.event-calendar.category,rec_name",0,Name,Name,0
-field,"calendar.event.alarm,calendar_alarm",0,Calendar Alarm,Kalender Alarm,0
-field,"calendar.event.alarm,event",0,Event,Termin,0
-field,"calendar.event.alarm,rec_name",0,Name,Name,0
-field,"calendar.event.attendee,calendar_attendee",0,Calendar Attendee,Kalender Teilnehmer,0
-field,"calendar.event.attendee,event",0,Event,Termin,0
-field,"calendar.event.attendee,rec_name",0,Name,Name,0
-field,"calendar.event.exdate,calendar_date",0,Calendar Date,Kalender Datum,0
-field,"calendar.event.exdate,event",0,Event,Termin,0
-field,"calendar.event.exdate,rec_name",0,Name,Name,0
-field,"calendar.event.exrule,calendar_rrule",0,Calendar RRule,Kalender WRegel,0
-field,"calendar.event.exrule,event",0,Event,Termin,0
-field,"calendar.event.exrule,rec_name",0,Name,Name,0
-field,"calendar.event.rdate,calendar_date",0,Calendar Date,Kalender Datum,0
-field,"calendar.event.rdate,event",0,Event,Termin,0
-field,"calendar.event.rdate,rec_name",0,Name,Name,0
-field,"calendar.event.rrule,calendar_rrule",0,Calendar RRule,Kalender WRegel,0
-field,"calendar.event.rrule,event",0,Event,Termin,0
-field,"calendar.event.rrule,rec_name",0,Name,Name,0
-field,"calendar.location,name",0,Name,Name,0
-field,"calendar.location,rec_name",0,Name,Name,0
-field,"calendar.rrule,byday",0,By Day,Für Tag,0
-field,"calendar.rrule,byhour",0,By Hour,Für Stunde,0
-field,"calendar.rrule,byminute",0,By Minute,Für Minute,0
-field,"calendar.rrule,bymonth",0,By Month,Für Monat,0
-field,"calendar.rrule,bymonthday",0,By Month Day,Für Tag des Monats,0
-field,"calendar.rrule,bysecond",0,By Second,Für Sekunde,0
-field,"calendar.rrule,bysetpos",0,By Position,Für Position,0
-field,"calendar.rrule,byweekno",0,By Week Number,Für Woche Nummer,0
-field,"calendar.rrule,byyearday",0,By Year Day,Für Tag des Jahres,0
-field,"calendar.rrule,count",0,Count,Anzahl,0
-field,"calendar.rrule,freq",0,Frequency,Häufigkeit,0
-field,"calendar.rrule,interval",0,Interval,Intervall,0
-field,"calendar.rrule,rec_name",0,Name,Name,0
-field,"calendar.rrule,until",0,Until Date,Bis Zeitpunkt,0
-field,"calendar.rrule,until_date",0,Is Date,Als Datum,0
-field,"calendar.rrule,wkst",0,Week Day,Wochentag,0
-field,"res.user,calendars",0,Calendars,Kalender,0
-help,"calendar.calendar,owner",0,The user must have an email,Dem Benutzer muss eine E-Mail-Adresse zugeordnet sein!,0
-help,"calendar.date,date",0,"Ignore time of field ""Date"", but handle as date only.","Verwende von Feld ""Zeitpunkt"" nur das Datum ohne den Zeitanteil.",0
-help,"calendar.event,uuid",0,Universally Unique Identifier,Universally Unique Identifier,0
-help,"calendar.rrule,until_date",0,"Ignore time of field ""Until Date"", but handle as date only.","Verwende von Feld ""Bis Zeitpunkt"" nur das Datum ohne den Zeitanteil.",0
-model,"calendar.alarm,name",0,Alarm,Alarm,0
-model,"calendar.attendee,name",0,Attendee,Teilnehmer,0
-model,"calendar.calendar,name",0,Calendar,Kalender,0
-model,"calendar.calendar-read-res.user,name",0,Calendar - read - User,Kalender - Schreiben - Benutzer,0
-model,"calendar.calendar-write-res.user,name",0,Calendar - write - User,Kalender - Lesen - Benutzer,0
-model,"calendar.category,name",0,Category,Kategorie,0
-model,"calendar.date,name",0,Calendar Date,Kalender Datum,0
-model,"calendar.event,name",0,Event,Termin,0
-model,"calendar.event-calendar.category,name",0,Event - Category,Termin - Kategorie,0
-model,"calendar.event.alarm,name",0,Alarm,Alarm,0
-model,"calendar.event.attendee,name",0,Attendee,Teilnehmer,0
-model,"calendar.event.exdate,name",0,Exception Date,Ausnahmedatum,0
-model,"calendar.event.exrule,name",0,Exception Rule,Ausnahmeregel,0
-model,"calendar.event.rdate,name",0,Recurrence Date,Wiederholungsdatum,0
-model,"calendar.event.rrule,name",0,Recurrence Rule,Wiederholungsregel,0
-model,"calendar.location,name",0,Location,Ort,0
-model,"calendar.rrule,name",0,Recurrence Rule,Wiederholungsregel,0
-model,"ir.action,name",act_calendar_form,Calendars,Kalender,0
-model,"ir.action,name",act_calendar_form2,Calendars,Kalender,0
-model,"ir.action,name",act_event_form,Events,Termine,0
-model,"ir.action,name",act_event_form2,Events,Termine,0
-model,"ir.action,name",act_event_form3,Events,Termine,0
-model,"ir.ui.menu,name",menu_calendar,Calendar Management,Kalender,0
-model,"ir.ui.menu,name",menu_calendar_form,Calendars,Kalender,0
-model,"ir.ui.menu,name",menu_calendar_form2,New Calendar,Neuer Kalender,0
-model,"ir.ui.menu,name",menu_event_form,Events,Termine,0
-model,"ir.ui.menu,name",menu_event_form2,New Event,Neuer Termin,0
-model,"res.group,name",group_calendar_admin,Calendar Administration,Kalender Administration,0
-selection,"calendar.attendee,status",0,,,0
-selection,"calendar.attendee,status",0,Accepted,Angenommen,0
-selection,"calendar.attendee,status",0,Declined,Abgelehnt,0
-selection,"calendar.attendee,status",0,Delegated,Delegiert,0
-selection,"calendar.attendee,status",0,Needs Action,Aktion erforderlich,0
-selection,"calendar.attendee,status",0,Tentative,Unter Vorbehalt,0
-selection,"calendar.event,classification",0,Confidential,Vertraulich,0
-selection,"calendar.event,classification",0,Private,Privat,0
-selection,"calendar.event,classification",0,Public,Öffentlich,0
-selection,"calendar.event,status",0,,,0
-selection,"calendar.event,status",0,Cancelled,Abgesagt,0
-selection,"calendar.event,status",0,Confirmed,Bestätigt,0
-selection,"calendar.event,status",0,Tentative,Unter Vorbehalt,0
-selection,"calendar.event,transp",0,Opaque,Opak,0
-selection,"calendar.event,transp",0,Transparent,Transparent,0
-selection,"calendar.rrule,freq",0,Daily,Täglich,0
-selection,"calendar.rrule,freq",0,Hourly,Stündlich,0
-selection,"calendar.rrule,freq",0,Minutely,Minütlich,0
-selection,"calendar.rrule,freq",0,Monthly,Monatlich,0
-selection,"calendar.rrule,freq",0,Secondly,Sekündlich,0
-selection,"calendar.rrule,freq",0,Weekly,Wöchentlich,0
-selection,"calendar.rrule,freq",0,Yearly,Jährlich,0
-selection,"calendar.rrule,wkst",0,Friday,Freitag,0
-selection,"calendar.rrule,wkst",0,Monday,Montag,0
-selection,"calendar.rrule,wkst",0,Saturday,Samstag,0
-selection,"calendar.rrule,wkst",0,Sunday,Sonntag,0
-selection,"calendar.rrule,wkst",0,Thursday,Donnerstag,0
-selection,"calendar.rrule,wkst",0,Tuesday,Dienstag,0
-selection,"calendar.rrule,wkst",0,Wednesday,Mittwoch,0
-view,calendar.calendar,0,Calendar,Kalender,0
-view,calendar.calendar,0,Calendars,Kalender,0
-view,calendar.calendar,0,General,Allgemein,0
-view,calendar.calendar,0,Security,Sicherheit,0
-view,calendar.category,0,Categories,Kategorien,0
-view,calendar.category,0,Category,Kategorie,0
-view,calendar.event,0,Attendees,Teilnehmer,0
-view,calendar.event,0,Categories,Kategorien,0
-view,calendar.event,0,Event,Termin,0
-view,calendar.event,0,Events,Termine,0
-view,calendar.event,0,General,Allgemein,0
-view,calendar.event,0,Occurences,Ereignisse,0
-view,calendar.event,0,Recurrences,Wiederholungen,0
-view,calendar.event.attendee,0,Attendee,Teilnehmer,0
-view,calendar.event.attendee,0,Attendees,Teilnehmer,0
-view,calendar.event.exdate,0,Exception Date,Ausnahmedatum,0
-view,calendar.event.exdate,0,Exception Dates,Ausnahmedaten,0
-view,calendar.event.exrule,0,Exception Rule,Ausnahmeregel,0
-view,calendar.event.exrule,0,Exception Rules,Ausnahmeregeln,0
-view,calendar.event.rdate,0,Recurrence Date,Wiederholungsdatum,0
-view,calendar.event.rdate,0,Recurrence Dates,Wiederholungsdaten,0
-view,calendar.event.rrule,0,Recurrence Rule,Wiederholungsregel,0
-view,calendar.event.rrule,0,Recurrence Rules,Wiederholungsregeln,0
-view,calendar.location,0,Location,Ort,0
-view,calendar.location,0,Locations,Orte,0
diff --git a/es_CO.csv b/es_CO.csv
deleted file mode 100644
index 6b16971..0000000
--- a/es_CO.csv
+++ /dev/null
@@ -1,195 +0,0 @@
-type,name,res_id,src,value,fuzzy
-error,calendar.calendar,0,A user can have only one calendar!,¡Un usuario puede tener a lo sumo un calendario!,0
-error,calendar.calendar,0,The name of calendar must be unique!,¡El nombre del calendario es único!,0
-error,calendar.category,0,The name of calendar category must be unique!,¡El nombre de la categoría de calendario debe ser único!,0
-error,calendar.event,0,Recurrence can not be recurrent!,¡La repetición no puede repetirse!,0
-error,calendar.event,0,UUID and recurrence must be unique in a calendar!,¡El UUID y la recurrencia deben ser únicos por calendario! ,0
-error,calendar.location,0,The name of calendar location must be unique!,¡El nombre del lugar del calendario debe ser único!,0
-error,calendar.rrule,0,"Invalid ""By Day""",,0
-error,calendar.rrule,0,"Invalid ""By Hour""",,0
-error,calendar.rrule,0,"Invalid ""By Minute""",,0
-error,calendar.rrule,0,"Invalid ""By Month""",,0
-error,calendar.rrule,0,"Invalid ""By Month Day""",,0
-error,calendar.rrule,0,"Invalid ""By Position""",,0
-error,calendar.rrule,0,"Invalid ""By Second""",,0
-error,calendar.rrule,0,"Invalid ""By Week Number""",,0
-error,calendar.rrule,0,"Invalid ""By Year Day""",,0
-error,calendar.rrule,0,"Only one of ""until"" and ""count"" can be set!",,0
-field,"calendar.alarm,rec_name",0,Name,Nombre,0
-field,"calendar.alarm,valarm",0,valarm,,0
-field,"calendar.attendee,attendee",0,attendee,,0
-field,"calendar.attendee,email",0,Email,Correo Electrónico,0
-field,"calendar.attendee,rec_name",0,Name,Nombre,0
-field,"calendar.attendee,status",0,Participation Status,,0
-field,"calendar.calendar,description",0,Description,Descripción,0
-field,"calendar.calendar,name",0,Name,Nombre,0
-field,"calendar.calendar,owner",0,Owner,Propietario,0
-field,"calendar.calendar-read-res.user,calendar",0,Calendar,Calendario,0
-field,"calendar.calendar-read-res.user,rec_name",0,Name,Nombre,0
-field,"calendar.calendar-read-res.user,user",0,User,Usuario,0
-field,"calendar.calendar,read_users",0,Read Users,Usuarios que pueden Leer,0
-field,"calendar.calendar,rec_name",0,Name,Nombre,0
-field,"calendar.calendar-write-res.user,calendar",0,Calendar,Calendario,0
-field,"calendar.calendar-write-res.user,rec_name",0,Name,Nombre,0
-field,"calendar.calendar-write-res.user,user",0,User,Usuario,0
-field,"calendar.calendar,write_users",0,Write Users,Escribir Usuarios,0
-field,"calendar.category,name",0,Name,Nombre,0
-field,"calendar.category,rec_name",0,Name,Nombre,0
-field,"calendar.date,date",0,Is Date,Es Fecha,0
-field,"calendar.date,datetime",0,Date,Fecha,1
-field,"calendar.date,rec_name",0,Name,Nombre de Contacto,1
-field,"calendar.event.alarm,calendar_alarm",0,Calendar Alarm,,0
-field,"calendar.event.alarm,event",0,Event,Evento,0
-field,"calendar.event.alarm,rec_name",0,Name,Nombre,0
-field,"calendar.event,alarms",0,Alarms,Alarmas,0
-field,"calendar.event,all_day",0,All Day,Todo el Día,0
-field,"calendar.event.attendee,calendar_attendee",0,Calendar Attendee,,0
-field,"calendar.event.attendee,event",0,Event,Evento,0
-field,"calendar.event.attendee,rec_name",0,Name,Nombre,0
-field,"calendar.event,attendees",0,Attendees,Asistentes,0
-field,"calendar.event,calendar",0,Calendar,Calendario,0
-field,"calendar.event-calendar.category,category",0,Category,Categoría,0
-field,"calendar.event-calendar.category,event",0,Event,Evento,0
-field,"calendar.event-calendar.category,rec_name",0,Name,Nombre,0
-field,"calendar.event,calendar_owner",0,Owner,Propietario,0
-field,"calendar.event,calendar_read_users",0,Read Users,Usuarios que pueden Leer,0
-field,"calendar.event,calendar_write_users",0,Write Users,Escribir Usuarios,0
-field,"calendar.event,categories",0,Categories,Categorías,0
-field,"calendar.event,classification",0,Classification,Clasificación,0
-field,"calendar.event,description",0,Description,Descripción,0
-field,"calendar.event,dtend",0,End Date,Fecha Fin,0
-field,"calendar.event,dtstart",0,Start Date,Fecha Inicial,0
-field,"calendar.event.exdate,calendar_date",0,Calendar Date,Fecha Calendario,0
-field,"calendar.event.exdate,event",0,Event,Evento,0
-field,"calendar.event.exdate,rec_name",0,Name,Nombre,0
-field,"calendar.event,exdates",0,Exception Dates,Fechas de Excepción,0
-field,"calendar.event.exrule,calendar_rrule",0,Calendar RRule,,0
-field,"calendar.event.exrule,event",0,Event,Evento,0
-field,"calendar.event.exrule,rec_name",0,Name,Nombre,0
-field,"calendar.event,exrules",0,Exception Rules,Reglas de Excepción,0
-field,"calendar.event,location",0,Location,Lugar,0
-field,"calendar.event,occurences",0,Occurences,Ocurrencias,1
-field,"calendar.event,organizer",0,Organizer,Organizador,0
-field,"calendar.event,parent",0,Parent,Padre,0
-field,"calendar.event.rdate,calendar_date",0,Calendar Date,Fecha Calendario,0
-field,"calendar.event.rdate,event",0,Event,Evento,0
-field,"calendar.event.rdate,rec_name",0,Name,Nombre,0
-field,"calendar.event,rdates",0,Recurrence Dates,Fechas de Repetición,0
-field,"calendar.event,rec_name",0,Name,Nombre,0
-field,"calendar.event,recurrence",0,Recurrence,Repetición,0
-field,"calendar.event.rrule,calendar_rrule",0,Calendar RRule,,0
-field,"calendar.event.rrule,event",0,Event,Evento,0
-field,"calendar.event.rrule,rec_name",0,Name,Nombre,0
-field,"calendar.event,rrules",0,Recurrence Rules,Reglas de Repetición,0
-field,"calendar.event,sequence",0,Sequence,Secuencia,0
-field,"calendar.event,status",0,Status,Estado,0
-field,"calendar.event,summary",0,Summary,Resumen,0
-field,"calendar.event,timezone",0,Timezone,Zona horaria,0
-field,"calendar.event,transp",0,Time Transparency,Transparencia de Tiempo,0
-field,"calendar.event,uuid",0,UUID,UUID,0
-field,"calendar.event,vevent",0,vevent,vevento,0
-field,"calendar.location,name",0,Name,Nombre,0
-field,"calendar.location,rec_name",0,Name,Nombre,0
-field,"calendar.rrule,byday",0,By Day,,0
-field,"calendar.rrule,byhour",0,By Hour,,0
-field,"calendar.rrule,byminute",0,By Minute,,0
-field,"calendar.rrule,bymonth",0,By Month,,0
-field,"calendar.rrule,bymonthday",0,By Month Day,,0
-field,"calendar.rrule,bysecond",0,By Second,,0
-field,"calendar.rrule,bysetpos",0,By Position,,0
-field,"calendar.rrule,byweekno",0,By Week Number,,0
-field,"calendar.rrule,byyearday",0,By Year Day,,0
-field,"calendar.rrule,count",0,Count,,0
-field,"calendar.rrule,freq",0,Frequency,,0
-field,"calendar.rrule,interval",0,Interval,,0
-field,"calendar.rrule,rec_name",0,Name,Nombre,0
-field,"calendar.rrule,until",0,Until Date,,0
-field,"calendar.rrule,until_date",0,Is Date,,0
-field,"calendar.rrule,wkst",0,Week Day,Día de la Semana,0
-field,"res.user,calendars",0,Calendars,Calendarios,0
-help,"calendar.calendar,owner",0,The user must have an email,,0
-help,"calendar.date,date",0,"Ignore time of field ""Date"", but handle as date only.","Ignore tiempo del campo ""Fecha"", pero manejelo como fecha solamente.",0
-help,"calendar.event,uuid",0,Universally Unique Identifier,Idenitificador Universal Único,0
-help,"calendar.rrule,until_date",0,"Ignore time of field ""Until Date"", but handle as date only.",,0
-model,"calendar.alarm,name",0,Alarm,Alarma,0
-model,"calendar.attendee,name",0,Attendee,Asistente,0
-model,"calendar.calendar,name",0,Calendar,Calendario,0
-model,"calendar.calendar-read-res.user,name",0,Calendar - read - User,Calendario - leer - Usuario,0
-model,"calendar.calendar-write-res.user,name",0,Calendar - write - User,Calendario - escribir - Usuario,0
-model,"calendar.category,name",0,Category,Categoría,0
-model,"calendar.date,name",0,Calendar Date,Fecha Calendario,0
-model,"calendar.event.alarm,name",0,Alarm,Alarma,0
-model,"calendar.event.attendee,name",0,Attendee,Asistente,0
-model,"calendar.event-calendar.category,name",0,Event - Category,Evento - Categoría,0
-model,"calendar.event.exdate,name",0,Exception Date,Fecha de Excepción,0
-model,"calendar.event.exrule,name",0,Exception Rule,Regla de Excepción,0
-model,"calendar.event,name",0,Event,Evento,0
-model,"calendar.event.rdate,name",0,Recurrence Date,Fecha de Repetición,0
-model,"calendar.event.rrule,name",0,Recurrence Rule,Regla de Repetición,0
-model,"calendar.location,name",0,Location,Lugar,0
-model,"calendar.rrule,name",0,Recurrence Rule,Regla de Repetición,0
-model,"ir.action,name",act_calendar_form,Calendars,Calendarios,0
-model,"ir.action,name",act_calendar_form2,Calendars,Calendarios,0
-model,"ir.action,name",act_event_form,Events,Eventos,0
-model,"ir.action,name",act_event_form2,Events,Eventos,0
-model,"ir.action,name",act_event_form3,Events,Eventos,0
-model,"ir.ui.menu,name",menu_calendar,Calendar Management,Calendario,0
-model,"ir.ui.menu,name",menu_calendar_form,Calendars,Calendarios,0
-model,"ir.ui.menu,name",menu_event_form,Events,Eventos,0
-model,"ir.ui.menu,name",menu_calendar_form2,New Calendar,Nuevo Calendario,0
-model,"ir.ui.menu,name",menu_event_form2,New Event,Nuevo Evento,0
-model,"res.group,name",group_calendar_admin,Calendar Administration,Administrar Calendario,0
-selection,"calendar.attendee,status",0,,,0
-selection,"calendar.attendee,status",0,Accepted,,0
-selection,"calendar.attendee,status",0,Declined,,0
-selection,"calendar.attendee,status",0,Delegated,,0
-selection,"calendar.attendee,status",0,Needs Action,,0
-selection,"calendar.attendee,status",0,Tentative,Tentativa,0
-selection,"calendar.event,classification",0,Confidential,Confidencial,0
-selection,"calendar.event,classification",0,Private,Privado,0
-selection,"calendar.event,classification",0,Public,Público,0
-selection,"calendar.event,status",0,,,0
-selection,"calendar.event,status",0,Cancelled,Cancelado,0
-selection,"calendar.event,status",0,Confirmed,Confirmado,0
-selection,"calendar.event,status",0,Tentative,Tentativa,0
-selection,"calendar.event,transp",0,Opaque,Opaco,0
-selection,"calendar.event,transp",0,Transparent,Transparente,0
-selection,"calendar.rrule,freq",0,Daily,,0
-selection,"calendar.rrule,freq",0,Hourly,,0
-selection,"calendar.rrule,freq",0,Minutely,,0
-selection,"calendar.rrule,freq",0,Monthly,,0
-selection,"calendar.rrule,freq",0,Secondly,,0
-selection,"calendar.rrule,freq",0,Weekly,,0
-selection,"calendar.rrule,freq",0,Yearly,,0
-selection,"calendar.rrule,wkst",0,Friday,Viernes,0
-selection,"calendar.rrule,wkst",0,Monday,Lunes,0
-selection,"calendar.rrule,wkst",0,Saturday,Sábado,0
-selection,"calendar.rrule,wkst",0,Sunday,Domingo,0
-selection,"calendar.rrule,wkst",0,Thursday,Jueves,0
-selection,"calendar.rrule,wkst",0,Tuesday,Martes,0
-selection,"calendar.rrule,wkst",0,Wednesday,Miércoles,0
-view,calendar.calendar,0,Calendar,Calendario,0
-view,calendar.calendar,0,Calendars,Calendarios,0
-view,calendar.calendar,0,General,General,0
-view,calendar.calendar,0,Security,Seguridad,0
-view,calendar.category,0,Categories,Categorías,0
-view,calendar.category,0,Category,Categoría,0
-view,calendar.event,0,Attendees,Asistentes,0
-view,calendar.event,0,Categories,Categorías,0
-view,calendar.event,0,Event,Evento,0
-view,calendar.event,0,Events,Eventos,0
-view,calendar.event,0,General,General,0
-view,calendar.event,0,Occurences,Ocurrencias,1
-view,calendar.event,0,Recurrences,Repeticiones,0
-view,calendar.event.attendee,0,Attendee,Asistente,0
-view,calendar.event.attendee,0,Attendees,Asistentes,0
-view,calendar.event.exdate,0,Exception Date,Fecha de Excepción,0
-view,calendar.event.exdate,0,Exception Dates,Fechas de Excepción,0
-view,calendar.event.exrule,0,Exception Rule,Regla de Excepción,0
-view,calendar.event.exrule,0,Exception Rules,Reglas de Excepción,0
-view,calendar.event.rdate,0,Recurrence Date,Fecha de Repetición,0
-view,calendar.event.rdate,0,Recurrence Dates,Fechas de Repetición,0
-view,calendar.event.rrule,0,Recurrence Rule,Regla de Repetición,0
-view,calendar.event.rrule,0,Recurrence Rules,Reglas de Repetición,0
-view,calendar.location,0,Location,Lugar,0
-view,calendar.location,0,Locations,Lugares,0
diff --git a/es_ES.csv b/es_ES.csv
deleted file mode 100644
index 6feec26..0000000
--- a/es_ES.csv
+++ /dev/null
@@ -1,190 +0,0 @@
-type,name,res_id,src,value,fuzzy
-error,calendar.calendar,0,A user can have only one calendar!,Un usuario solo puede tener un calendario,0
-error,calendar.calendar,0,The name of calendar must be unique!,El nombre del calendario debe ser único,0
-error,calendar.category,0,The name of calendar category must be unique!,El nombre de la categoría  del calendario debe ser único,0
-error,calendar.event,0,Recurrence can not be recurrent!,Una recurrencia no puede ser recurrente,0
-error,calendar.event,0,UUID and recurrence must be unique in a calendar!,UUID y recurrencia deben ser únicos en un calendario,0
-error,calendar.location,0,The name of calendar location must be unique!,El nombre de la ubicación del calendario debe ser único,0
-error,calendar.rrule,0,"Invalid ""By Day""",Inválido «por día»,0
-error,calendar.rrule,0,"Invalid ""By Hour""",Inválido «por hora»,0
-error,calendar.rrule,0,"Invalid ""By Minute""",Inválido «por minuto»,0
-error,calendar.rrule,0,"Invalid ""By Month""",Inválido «por mes»,0
-error,calendar.rrule,0,"Invalid ""By Month Day""",Inválido «por día del mes»,0
-error,calendar.rrule,0,"Invalid ""By Position""",Inválido «por posición»,0
-error,calendar.rrule,0,"Invalid ""By Second""",Inválido «por segundos»,0
-error,calendar.rrule,0,"Invalid ""By Week Number""",Inválido «por número de semana»,0
-error,calendar.rrule,0,"Invalid ""By Year Day""",Inválido «por día del año»,0
-error,calendar.rrule,0,"Only one of ""until"" and ""count"" can be set!",Solo se puede usar o «hasta» o «Número de veces»,0
-field,"calendar.alarm,rec_name",0,Name,Nombre,0
-field,"calendar.alarm,valarm",0,valarm,valarm,0
-field,"calendar.attendee,attendee",0,attendee,asistentes,0
-field,"calendar.attendee,email",0,Email,Correo electrónico,0
-field,"calendar.attendee,rec_name",0,Name,Nombre,0
-field,"calendar.attendee,status",0,Participation Status,Estado de participación,0
-field,"calendar.calendar,description",0,Description,Descripción,0
-field,"calendar.calendar,name",0,Name,Nombre,0
-field,"calendar.calendar,owner",0,Owner,Dueño,0
-field,"calendar.calendar-read-res.user,calendar",0,Calendar,Calendario,0
-field,"calendar.calendar-read-res.user,rec_name",0,Name,Nombre,0
-field,"calendar.calendar-read-res.user,user",0,User,Usuario,0
-field,"calendar.calendar,read_users",0,Read Users,Usuarios con lectura,0
-field,"calendar.calendar,rec_name",0,Name,Nombre,0
-field,"calendar.calendar-write-res.user,calendar",0,Calendar,Calendario,0
-field,"calendar.calendar-write-res.user,rec_name",0,Name,Nombre,0
-field,"calendar.calendar-write-res.user,user",0,User,Usuario,0
-field,"calendar.calendar,write_users",0,Write Users,Usuarios con escritura,0
-field,"calendar.category,name",0,Name,Nombre,0
-field,"calendar.category,rec_name",0,Name,Nombre,0
-field,"calendar.event.alarm,calendar_alarm",0,Calendar Alarm,Alarma del calendario,0
-field,"calendar.event.alarm,event",0,Event,Evento,0
-field,"calendar.event.alarm,rec_name",0,Name,Nombre,0
-field,"calendar.event,alarms",0,Alarms,Alarmas,0
-field,"calendar.event,all_day",0,All Day,Todo el día,0
-field,"calendar.event.attendee,calendar_attendee",0,Calendar Attendee,Calendario de asistentes,0
-field,"calendar.event.attendee,event",0,Event,Evento,0
-field,"calendar.event.attendee,rec_name",0,Name,Nombre,0
-field,"calendar.event,attendees",0,Attendees,Asistentes,0
-field,"calendar.event,calendar",0,Calendar,Calendario,0
-field,"calendar.event-calendar.category,category",0,Category,Categoría,0
-field,"calendar.event-calendar.category,event",0,Event,Evento,0
-field,"calendar.event-calendar.category,rec_name",0,Name,Nombre,0
-field,"calendar.event,calendar_owner",0,Owner,Dueño,0
-field,"calendar.event,calendar_read_users",0,Read Users,Usuarios con lectura,0
-field,"calendar.event,calendar_write_users",0,Write Users,Usuarios con escritura,0
-field,"calendar.event,categories",0,Categories,Categorías,0
-field,"calendar.event,classification",0,Classification,Clasificación,0
-field,"calendar.event,classification_public",0,Classification Public,Clasificación pública,0
-field,"calendar.event,description",0,Description,Descripción,0
-field,"calendar.event,dtend",0,End Date,Fecha fin,0
-field,"calendar.event,dtstart",0,Start Date,Fecha inicio,0
-field,"calendar.event.exdate,calendar_rdate",0,Calendar RDate,Fecha de recurrencia,0
-field,"calendar.event.exdate,event",0,Event,Evento,0
-field,"calendar.event.exdate,rec_name",0,Name,Nombre,0
-field,"calendar.event,exdates",0,Exception Dates,Fechas excluidas,0
-field,"calendar.event.exrule,calendar_rrule",0,Calendar RRule,Regla de recurrencia,0
-field,"calendar.event.exrule,event",0,Event,Evento,0
-field,"calendar.event.exrule,rec_name",0,Name,Nombre,0
-field,"calendar.event,exrules",0,Exception Rules,Reglas de excepción,0
-field,"calendar.event,location",0,Location,Ubicación,0
-field,"calendar.event,occurences",0,Occurences,Ocurrencias,0
-field,"calendar.event,organizer",0,Organizer,Organizador,0
-field,"calendar.event,parent",0,Parent,Padre,0
-field,"calendar.event.rdate,calendar_rdate",0,Calendar RDate,Fecha de recurrencia,0
-field,"calendar.event.rdate,event",0,Event,Evento,0
-field,"calendar.event.rdate,rec_name",0,Name,Nombre,0
-field,"calendar.event,rdates",0,Recurrence Dates,Fechas de recurrencia,0
-field,"calendar.event,rec_name",0,Name,Nombre,0
-field,"calendar.event,recurrence",0,Recurrence,Recurrencia,0
-field,"calendar.event.rrule,calendar_rrule",0,Calendar RRule,Regla de recurrencia,0
-field,"calendar.event.rrule,event",0,Event,Evento,0
-field,"calendar.event.rrule,rec_name",0,Name,Nombre,0
-field,"calendar.event,rrules",0,Recurrence Rules,Reglas de recurrencia,0
-field,"calendar.event,sequence",0,Sequence,Secuencia,0
-field,"calendar.event,status",0,Status,Estado,0
-field,"calendar.event,summary",0,Summary,Resumen,0
-field,"calendar.event,timezone",0,Timezone,Zona horaria,0
-field,"calendar.event,transp",0,Time Transparency,Tiempo de transparencia,0
-field,"calendar.event,uuid",0,UUID,UUID,0
-field,"calendar.event,vevent",0,vevent,vevent,0
-field,"calendar.location,name",0,Name,Nombre,0
-field,"calendar.location,rec_name",0,Name,Nombre,0
-field,"calendar.rdate,date",0,Is Date,Es fecha,0
-field,"calendar.rdate,datetime",0,Date,Fecha,0
-field,"calendar.rdate,rec_name",0,Name,Nombre,0
-field,"calendar.rrule,byday",0,By Day,Por día,0
-field,"calendar.rrule,byhour",0,By Hour,Por hora,0
-field,"calendar.rrule,byminute",0,By Minute,Por minuto,0
-field,"calendar.rrule,bymonth",0,By Month,Por mes,0
-field,"calendar.rrule,bymonthday",0,By Month Day,Por día del mes,0
-field,"calendar.rrule,bysecond",0,By Second,Por segundo,0
-field,"calendar.rrule,bysetpos",0,By Position,Por posición,0
-field,"calendar.rrule,byweekno",0,By Week Number,Por día de la semana,0
-field,"calendar.rrule,byyearday",0,By Year Day,Por día del año,0
-field,"calendar.rrule,count",0,Count,Número de veces,0
-field,"calendar.rrule,freq",0,Frequency,Frecuencia,0
-field,"calendar.rrule,interval",0,Interval,Intervalo,0
-field,"calendar.rrule,rec_name",0,Name,Nombre,0
-field,"calendar.rrule,until",0,Until Date,Hasta la fecha,0
-field,"calendar.rrule,until_date",0,Is Date,Es fecha,0
-field,"calendar.rrule,wkst",0,Week Day,Día de la semana,0
-field,"res.user,calendars",0,Calendars,Calendarios,0
-help,"calendar.calendar,owner",0,The user must have an email,El usuario debe tener un correo electrónico,0
-help,"calendar.event,uuid",0,Universally Unique Identifier,Identificador universal único,0
-help,"calendar.rdate,date",0,"Ignore time of field ""Date"", but handle as date only.",Ignora la hora del campo «Fecha» y lo trata como fecha.,0
-help,"calendar.rrule,until_date",0,"Ignore time of field ""Until Date"", but handle as date only.","Ignora la hora del campo «Hasta la fecha», y trata solo la fecha",0
-model,"calendar.alarm,name",0,Alarm,Alarma,0
-model,"calendar.attendee,name",0,Attendee,Asistentes,0
-model,"calendar.calendar,name",0,Calendar,Calendario,0
-model,"calendar.calendar-read-res.user,name",0,Calendar - read - User,Calendario - leer - usuario,0
-model,"calendar.calendar-write-res.user,name",0,Calendar - write - User,Calendario - escribir - usuario,0
-model,"calendar.category,name",0,Category,Categoría,0
-model,"calendar.event.alarm,name",0,Alarm,Alarma,0
-model,"calendar.event.attendee,name",0,Attendee,Asistentes,0
-model,"calendar.event-calendar.category,name",0,Event - Category,Evento - Categoría,0
-model,"calendar.event.exdate,name",0,Exception Date,Fecha excluida,0
-model,"calendar.event.exrule,name",0,Exception Rule,Regla de excepción,0
-model,"calendar.event,name",0,Event,Evento,0
-model,"calendar.event.rdate,name",0,Recurrence Date,Fecha de recurrencia,0
-model,"calendar.event.rrule,name",0,Recurrence Rule,Regla de recurrencia,0
-model,"calendar.location,name",0,Location,Ubicación,0
-model,"calendar.rdate,name",0,Recurrence Date,Fecha de recurrencia,0
-model,"calendar.rrule,name",0,Recurrence Rule,Regla de recurrencia,0
-model,"ir.action,name",act_calendar_form,Calendars,Calendarios,0
-model,"ir.action,name",act_event_form,Events,Eventos,0
-model,"ir.ui.menu,name",menu_calendar,Calendar Management,Gestión de calendario,0
-model,"ir.ui.menu,name",menu_calendar_form,Calendars,Calendarios,0
-model,"ir.ui.menu,name",menu_event_form,Events,Eventos,0
-model,"res.group,name",group_calendar_admin,Calendar Administration,Administración de calendario,0
-selection,"calendar.attendee,status",0,,,0
-selection,"calendar.attendee,status",0,Accepted,Aceptada,0
-selection,"calendar.attendee,status",0,Declined,Rehusado,0
-selection,"calendar.attendee,status",0,Delegated,Delegada,0
-selection,"calendar.attendee,status",0,Needs Action,Necesita una acción,0
-selection,"calendar.attendee,status",0,Tentative,Tentativa,0
-selection,"calendar.event,classification",0,Confidential,Confidencial,0
-selection,"calendar.event,classification",0,Private,Privado,0
-selection,"calendar.event,classification",0,Public,Público,0
-selection,"calendar.event,status",0,,,0
-selection,"calendar.event,status",0,Cancelled,Cancelado,0
-selection,"calendar.event,status",0,Confirmed,Confirmada,0
-selection,"calendar.event,status",0,Tentative,Tentativo,0
-selection,"calendar.event,transp",0,Opaque,Opaco,0
-selection,"calendar.event,transp",0,Transparent,Transparente,0
-selection,"calendar.rrule,freq",0,Daily,Diariamente,0
-selection,"calendar.rrule,freq",0,Hourly,Cada hora,0
-selection,"calendar.rrule,freq",0,Minutely,Cada minuto,0
-selection,"calendar.rrule,freq",0,Monthly,Mensualmente,0
-selection,"calendar.rrule,freq",0,Secondly,Cada segundo,0
-selection,"calendar.rrule,freq",0,Weekly,Semanalmente,0
-selection,"calendar.rrule,freq",0,Yearly,Anualmente,0
-selection,"calendar.rrule,wkst",0,Friday,Viernes,0
-selection,"calendar.rrule,wkst",0,Monday,Lunes,0
-selection,"calendar.rrule,wkst",0,Saturday,Sábado,0
-selection,"calendar.rrule,wkst",0,Sunday,Domingo,0
-selection,"calendar.rrule,wkst",0,Thursday,Jueves,0
-selection,"calendar.rrule,wkst",0,Tuesday,Martes,0
-selection,"calendar.rrule,wkst",0,Wednesday,Miércoles,0
-view,calendar.calendar,0,Calendar,Calendario,0
-view,calendar.calendar,0,Calendars,Calendarios,0
-view,calendar.calendar,0,General,General,0
-view,calendar.calendar,0,Security,Seguridad,0
-view,calendar.category,0,Categories,Categorías,0
-view,calendar.category,0,Category,Categoría,0
-view,calendar.event,0,Attendees,Asistentes,0
-view,calendar.event,0,Categories,Categorías,0
-view,calendar.event,0,Event,Evento,0
-view,calendar.event,0,Events,Eventos,0
-view,calendar.event,0,General,General,0
-view,calendar.event,0,Occurences,Ocurrencias,0
-view,calendar.event.attendee,0,Attendee,Asistentes,0
-view,calendar.event.attendee,0,Attendees,Asistentes,0
-view,calendar.event.exdate,0,Exception Date,Fecha excluida,0
-view,calendar.event.exdate,0,Exception Dates,Fechas excluidas,0
-view,calendar.event.exrule,0,Exception Rule,Regla de excepción,0
-view,calendar.event.exrule,0,Exception Rules,Reglas de excepciones,0
-view,calendar.event.rdate,0,Recurrence Date,Fecha de recurrencia,0
-view,calendar.event.rdate,0,Recurrence Dates,Fechas de recurrencia,0
-view,calendar.event.rrule,0,Recurrence Rule,Regla de recurrencia,0
-view,calendar.event.rrule,0,Recurrence Rules,Reglas de recurrencia,0
-view,calendar.location,0,Location,Ubicación,0
-view,calendar.location,0,Locations,Ubicaciones,0
diff --git a/fr_FR.csv b/fr_FR.csv
deleted file mode 100644
index b814ecf..0000000
--- a/fr_FR.csv
+++ /dev/null
@@ -1,194 +0,0 @@
-type,name,res_id,src,value,fuzzy
-error,calendar.calendar,0,A user can have only one calendar!,Un utilisateur ne peut avoir qu'un seul calendrier !,0
-error,calendar.calendar,0,The name of calendar must be unique!,Le nom du calendrier doit être unique !,0
-error,calendar.category,0,The name of calendar category must be unique!,Le nom de la catégorie de calendrier doit être unique,0
-error,calendar.event,0,Recurrence can not be recurrent!,Une récurrence ne peut pas être récurrente !,0
-error,calendar.event,0,UUID and recurrence must be unique in a calendar!,UUID et récurrence doivent être uniques sur un calendrier !,0
-error,calendar.location,0,The name of calendar location must be unique!,Le nom de l'emplacement doit être unique !,0
-error,calendar.rrule,0,"Invalid ""By Day""","""Par jour"" invalide",0
-error,calendar.rrule,0,"Invalid ""By Hour""","""Par heure"" invalide",0
-error,calendar.rrule,0,"Invalid ""By Minute""","""Par minute"" invalide",0
-error,calendar.rrule,0,"Invalid ""By Month Day""","""Par jour du mois"" invalide",0
-error,calendar.rrule,0,"Invalid ""By Month""","""Par mois"" invalide",0
-error,calendar.rrule,0,"Invalid ""By Position""","""Par position"" invalide",0
-error,calendar.rrule,0,"Invalid ""By Second""","""Par seconde"" invalide",0
-error,calendar.rrule,0,"Invalid ""By Week Number""","""Par jour de la semaine"" invalide",0
-error,calendar.rrule,0,"Invalid ""By Year Day""","""Par jour de l'année"" invalide",0
-error,calendar.rrule,0,"Only one of ""until"" and ""count"" can be set!","""Date de fin"" et ""Répétitions"" ne peuvent être remplis en même temps !",0
-field,"calendar.alarm,rec_name",0,Name,Nom,0
-field,"calendar.alarm,valarm",0,valarm,valarm,0
-field,"calendar.attendee,attendee",0,attendee,participant,0
-field,"calendar.attendee,email",0,Email,E-mail,0
-field,"calendar.attendee,rec_name",0,Name,Nom,0
-field,"calendar.attendee,status",0,Participation Status,Statut de participation,0
-field,"calendar.calendar,description",0,Description,Description,0
-field,"calendar.calendar,name",0,Name,Nom,0
-field,"calendar.calendar,owner",0,Owner,Propriétaire,0
-field,"calendar.calendar,read_users",0,Read Users,Utilisateurs en lecture,0
-field,"calendar.calendar,rec_name",0,Name,Nom,0
-field,"calendar.calendar,write_users",0,Write Users,Utilisateurs en écriture,0
-field,"calendar.calendar-read-res.user,calendar",0,Calendar,Calendrier,0
-field,"calendar.calendar-read-res.user,rec_name",0,Name,Nom,0
-field,"calendar.calendar-read-res.user,user",0,User,Utilisateur,0
-field,"calendar.calendar-write-res.user,calendar",0,Calendar,Calendrier,0
-field,"calendar.calendar-write-res.user,rec_name",0,Name,Nom,0
-field,"calendar.calendar-write-res.user,user",0,User,Utilisateur,0
-field,"calendar.category,name",0,Name,Nom,0
-field,"calendar.category,rec_name",0,Name,Nom,0
-field,"calendar.date,date",0,Is Date,Est une date,0
-field,"calendar.date,datetime",0,Date,Date,0
-field,"calendar.date,rec_name",0,Name,Nom,0
-field,"calendar.event,alarms",0,Alarms,Alarmes,0
-field,"calendar.event,all_day",0,All Day,Toute la journée,0
-field,"calendar.event,attendees",0,Attendees,Participants,0
-field,"calendar.event,calendar",0,Calendar,Calendrier,0
-field,"calendar.event,calendar_owner",0,Owner,Propriétaire,0
-field,"calendar.event,calendar_read_users",0,Read Users,Utilisateurs en lecture,0
-field,"calendar.event,calendar_write_users",0,Write Users,Utilisateurs en écriture,0
-field,"calendar.event,categories",0,Categories,Catégories,0
-field,"calendar.event,classification",0,Classification,Classification,0
-field,"calendar.event,description",0,Description,Description,0
-field,"calendar.event,dtend",0,End Date,Date de fin,0
-field,"calendar.event,dtstart",0,Start Date,Date de début,0
-field,"calendar.event,exdates",0,Exception Dates,Dates d'exception,0
-field,"calendar.event,exrules",0,Exception Rules,Règles d'exception,0
-field,"calendar.event,location",0,Location,Emplacement,0
-field,"calendar.event,occurences",0,Occurences,Occurrences,0
-field,"calendar.event,organizer",0,Organizer,Organisateur,0
-field,"calendar.event,parent",0,Parent,Parent,0
-field,"calendar.event,rdates",0,Recurrence Dates,Dates de récurrence,0
-field,"calendar.event,rec_name",0,Name,Nom,0
-field,"calendar.event,recurrence",0,Recurrence,Récurrence,0
-field,"calendar.event,rrules",0,Recurrence Rules,Règles de récurrence,0
-field,"calendar.event,sequence",0,Sequence,Séquence,0
-field,"calendar.event,status",0,Status,Statut,0
-field,"calendar.event,summary",0,Summary,Résumé,0
-field,"calendar.event,timezone",0,Timezone,Fuseau Horaire,0
-field,"calendar.event,transp",0,Time Transparency,Transparence,0
-field,"calendar.event,uuid",0,UUID,UUID,0
-field,"calendar.event,vevent",0,vevent,vevent,0
-field,"calendar.event-calendar.category,category",0,Category,Catégorie,0
-field,"calendar.event-calendar.category,event",0,Event,Événement,0
-field,"calendar.event-calendar.category,rec_name",0,Name,Nom,0
-field,"calendar.event.alarm,calendar_alarm",0,Calendar Alarm,Alarme calendrier,0
-field,"calendar.event.alarm,event",0,Event,Événement,0
-field,"calendar.event.alarm,rec_name",0,Name,Nom,0
-field,"calendar.event.attendee,calendar_attendee",0,Calendar Attendee,Participant calendrier,0
-field,"calendar.event.attendee,event",0,Event,Événement,0
-field,"calendar.event.attendee,rec_name",0,Name,Nom,0
-field,"calendar.event.exdate,calendar_date",0,Calendar Date,Date calendrier,0
-field,"calendar.event.exdate,event",0,Event,Événement,0
-field,"calendar.event.exdate,rec_name",0,Name,Nom,0
-field,"calendar.event.exrule,calendar_rrule",0,Calendar RRule,Règle de récurrence,0
-field,"calendar.event.exrule,event",0,Event,Événement,0
-field,"calendar.event.exrule,rec_name",0,Name,Nom,0
-field,"calendar.event.rdate,calendar_date",0,Calendar Date,Date calendrier,0
-field,"calendar.event.rdate,event",0,Event,Événement,0
-field,"calendar.event.rdate,rec_name",0,Name,Nom,0
-field,"calendar.event.rrule,calendar_rrule",0,Calendar RRule,Règle de récurrence,0
-field,"calendar.event.rrule,event",0,Event,Événement,0
-field,"calendar.event.rrule,rec_name",0,Name,Nom,0
-field,"calendar.location,name",0,Name,Nom,0
-field,"calendar.location,rec_name",0,Name,Nom,0
-field,"calendar.rrule,byday",0,By Day,Par jour,0
-field,"calendar.rrule,byhour",0,By Hour,Par heure,0
-field,"calendar.rrule,byminute",0,By Minute,Par minute,0
-field,"calendar.rrule,bymonth",0,By Month,Par mois,0
-field,"calendar.rrule,bymonthday",0,By Month Day,Par jour du mois,0
-field,"calendar.rrule,bysecond",0,By Second,Par seconde,0
-field,"calendar.rrule,bysetpos",0,By Position,Par position,0
-field,"calendar.rrule,byweekno",0,By Week Number,Par numéro de semaine,0
-field,"calendar.rrule,byyearday",0,By Year Day,Par jour de l'année,0
-field,"calendar.rrule,count",0,Count,Répétitions,0
-field,"calendar.rrule,freq",0,Frequency,Fréquence,0
-field,"calendar.rrule,interval",0,Interval,Intervalle,0
-field,"calendar.rrule,rec_name",0,Name,Nom,0
-field,"calendar.rrule,until",0,Until Date,Date de fin,0
-field,"calendar.rrule,until_date",0,Is Date,Est une date,0
-field,"calendar.rrule,wkst",0,Week Day,Jour de la semaine,0
-field,"res.user,calendars",0,Calendars,Calendriers,0
-help,"calendar.calendar,owner",0,The user must have an email,L'utilisateur doit avoir une adresse mail,0
-help,"calendar.date,date",0,"Ignore time of field ""Date"", but handle as date only.","Ignorer l'heure du champ ""Date"" et considérer uniquement la date",0
-help,"calendar.event,uuid",0,Universally Unique Identifier,Identificateur unique universel,0
-help,"calendar.rrule,until_date",0,"Ignore time of field ""Until Date"", but handle as date only.","Ignorer l'heure du champ ""Date de fin"" et considérer uniquement la date",0
-model,"calendar.alarm,name",0,Alarm,Alarme,0
-model,"calendar.attendee,name",0,Attendee,Participant,0
-model,"calendar.calendar,name",0,Calendar,Calendrier,0
-model,"calendar.calendar-read-res.user,name",0,Calendar - read - User,Calendrier - Lecture - Utilisateur,0
-model,"calendar.calendar-write-res.user,name",0,Calendar - write - User,Calendrier - Écriture - Utilisateur,0
-model,"calendar.category,name",0,Category,Catégorie,0
-model,"calendar.date,name",0,Calendar Date,Date calendrier,0
-model,"calendar.event,name",0,Event,Événement,0
-model,"calendar.event-calendar.category,name",0,Event - Category,Évenement - Catégorie,0
-model,"calendar.event.alarm,name",0,Alarm,Alarme,0
-model,"calendar.event.attendee,name",0,Attendee,Participant,0
-model,"calendar.event.exdate,name",0,Exception Date,Date d'exception,0
-model,"calendar.event.exrule,name",0,Exception Rule,Règle d'exception,0
-model,"calendar.event.rdate,name",0,Recurrence Date,Date de récurrence,0
-model,"calendar.event.rrule,name",0,Recurrence Rule,Règle de récurrence,0
-model,"calendar.location,name",0,Location,Emplacement,0
-model,"calendar.rrule,name",0,Recurrence Rule,Règle de récurrence,0
-model,"ir.action,name",act_calendar_form,Calendars,Calendriers,0
-model,"ir.action,name",act_calendar_form2,Calendars,Calendriers,0
-model,"ir.action,name",act_event_form,Events,Événement,0
-model,"ir.action,name",act_event_form2,Events,Événements,0
-model,"ir.action,name",act_event_form3,Events,Événements,0
-model,"ir.ui.menu,name",menu_calendar,Calendar Management,Gestion de calendrier,0
-model,"ir.ui.menu,name",menu_calendar_form,Calendars,Calendriers,0
-model,"ir.ui.menu,name",menu_calendar_form2,New Calendar,Nouveau calendrier,0
-model,"ir.ui.menu,name",menu_event_form,Events,Évenement,0
-model,"ir.ui.menu,name",menu_event_form2,New Event,Nouvel événement,0
-model,"res.group,name",group_calendar_admin,Calendar Administration,Administration calendrier,0
-selection,"calendar.attendee,status",0,,,0
-selection,"calendar.attendee,status",0,Accepted,Accepté,0
-selection,"calendar.attendee,status",0,Declined,Décliné,0
-selection,"calendar.attendee,status",0,Delegated,Délégué,0
-selection,"calendar.attendee,status",0,Needs Action,Nécessite une action,0
-selection,"calendar.attendee,status",0,Tentative,Tentative,0
-selection,"calendar.event,classification",0,Confidential,Confidentiel,0
-selection,"calendar.event,classification",0,Private,Privé,0
-selection,"calendar.event,classification",0,Public,Publique,0
-selection,"calendar.event,status",0,,,0
-selection,"calendar.event,status",0,Cancelled,Annulé,0
-selection,"calendar.event,status",0,Confirmed,Confirmé,0
-selection,"calendar.event,status",0,Tentative,Tentative,0
-selection,"calendar.event,transp",0,Opaque,Opaque,0
-selection,"calendar.event,transp",0,Transparent,transparent,0
-selection,"calendar.rrule,freq",0,Daily,Journalier,0
-selection,"calendar.rrule,freq",0,Hourly,Horaire,0
-selection,"calendar.rrule,freq",0,Minutely,Chaque minute,0
-selection,"calendar.rrule,freq",0,Monthly,Mensuel,0
-selection,"calendar.rrule,freq",0,Secondly,Chaque seconde,0
-selection,"calendar.rrule,freq",0,Weekly,hebdomadaire,0
-selection,"calendar.rrule,freq",0,Yearly,Annuel,0
-selection,"calendar.rrule,wkst",0,Friday,Vendredi,0
-selection,"calendar.rrule,wkst",0,Monday,Lundi,0
-selection,"calendar.rrule,wkst",0,Saturday,Samedi,0
-selection,"calendar.rrule,wkst",0,Sunday,Dimanche,0
-selection,"calendar.rrule,wkst",0,Thursday,Jeudi,0
-selection,"calendar.rrule,wkst",0,Tuesday,Mardi,0
-selection,"calendar.rrule,wkst",0,Wednesday,Mercredi,0
-view,calendar.calendar,0,Calendar,Calendrier,0
-view,calendar.calendar,0,Calendars,Calendriers,0
-view,calendar.calendar,0,General,Général,0
-view,calendar.calendar,0,Security,Sécurité,0
-view,calendar.category,0,Categories,Catégories,0
-view,calendar.category,0,Category,Catégorie,0
-view,calendar.event,0,Attendees,Participants,0
-view,calendar.event,0,Categories,Catégories,0
-view,calendar.event,0,Event,Événement,0
-view,calendar.event,0,Events,Événements,0
-view,calendar.event,0,General,Général,0
-view,calendar.event,0,Occurences,Occurrences,0
-view,calendar.event.attendee,0,Attendee,Participant,0
-view,calendar.event.attendee,0,Attendees,Participants,0
-view,calendar.event.exdate,0,Exception Date,Date d'exception,0
-view,calendar.event.exdate,0,Exception Dates,Dates d'exception,0
-view,calendar.event.exrule,0,Exception Rule,Règle d'exception,0
-view,calendar.event.exrule,0,Exception Rules,Règles d'exception,0
-view,calendar.event.rdate,0,Recurrence Date,Date de récurrence,0
-view,calendar.event.rdate,0,Recurrence Dates,Dates de récurrence,0
-view,calendar.event.rrule,0,Recurrence Rule,Règle de récurrence,0
-view,calendar.event.rrule,0,Recurrence Rules,Règles de récurrence,0
-view,calendar.location,0,Location,Emplacement,0
-view,calendar.location,0,Locations,Emplacements,0
diff --git a/locale/bg_BG.po b/locale/bg_BG.po
new file mode 100644
index 0000000..0c5f80b
--- /dev/null
+++ b/locale/bg_BG.po
@@ -0,0 +1,760 @@
+# 
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "error:calendar.calendar:0"
+msgid "A user can have only one calendar!"
+msgstr "Потребителя може да има само един календар!"
+
+msgctxt "error:calendar.calendar:0"
+msgid "The name of calendar must be unique!"
+msgstr "Името на календара трябва да е уникално!"
+
+msgctxt "error:calendar.category:0"
+msgid "The name of calendar category must be unique!"
+msgstr "Името на категорията на календара трябва да е уникално!"
+
+msgctxt "error:calendar.event:0"
+msgid "Recurrence can not be recurrent!"
+msgstr "Повторението не може да е периодично!"
+
+msgctxt "error:calendar.event:0"
+msgid "UUID and recurrence must be unique in a calendar!"
+msgstr "UUID и взаимна вложеност трябва да са уникални в календар!"
+
+msgctxt "error:calendar.location:0"
+msgid "The name of calendar location must be unique!"
+msgstr "Името на местонахождението на календара трябва да е уникално!"
+
+msgctxt "error:calendar.rrule:0"
+msgid "Invalid \"By Day\""
+msgstr "Невалиден \"По ден\""
+
+msgctxt "error:calendar.rrule:0"
+msgid "Invalid \"By Hour\""
+msgstr "Навалиден \"По час\""
+
+msgctxt "error:calendar.rrule:0"
+msgid "Invalid \"By Minute\""
+msgstr "Невалиден \"По минута\""
+
+msgctxt "error:calendar.rrule:0"
+msgid "Invalid \"By Month Day\""
+msgstr "Невалиден \"По ден от месец\""
+
+msgctxt "error:calendar.rrule:0"
+msgid "Invalid \"By Month\""
+msgstr "Невалидно \"По месец\""
+
+msgctxt "error:calendar.rrule:0"
+msgid "Invalid \"By Position\""
+msgstr "Невалиден \"По позиция\""
+
+msgctxt "error:calendar.rrule:0"
+msgid "Invalid \"By Second\""
+msgstr "Невалиден \"По секунда\""
+
+msgctxt "error:calendar.rrule:0"
+msgid "Invalid \"By Week Number\""
+msgstr "Невалиден \"По номер на седмица\""
+
+msgctxt "error:calendar.rrule:0"
+msgid "Invalid \"By Year Day\""
+msgstr "Невалиден \"По ден от годината\""
+
+msgctxt "error:calendar.rrule:0"
+msgid "Only one of \"until\" and \"count\" can be set!"
+msgstr "\"Крайна дата\" и \"брой\" не може да се попълва по едно и също време!"
+
+msgctxt "field:calendar.alarm,rec_name:0"
+msgid "Name"
+msgstr "Име"
+
+msgctxt "field:calendar.alarm,valarm:0"
+msgid "valarm"
+msgstr ""
+
+msgctxt "field:calendar.attendee,attendee:0"
+msgid "attendee"
+msgstr "присътващ"
+
+msgctxt "field:calendar.attendee,email:0"
+msgid "Email"
+msgstr "Email"
+
+msgctxt "field:calendar.attendee,rec_name:0"
+msgid "Name"
+msgstr "Име"
+
+msgctxt "field:calendar.attendee,status:0"
+msgid "Participation Status"
+msgstr "Статус на участие"
+
+msgctxt "field:calendar.calendar,description:0"
+msgid "Description"
+msgstr "Описание"
+
+msgctxt "field:calendar.calendar,name:0"
+msgid "Name"
+msgstr "Име"
+
+msgctxt "field:calendar.calendar,owner:0"
+msgid "Owner"
+msgstr "Собственик"
+
+msgctxt "field:calendar.calendar,read_users:0"
+msgid "Read Users"
+msgstr "Потребители с права за четене"
+
+msgctxt "field:calendar.calendar,rec_name:0"
+msgid "Name"
+msgstr "Име"
+
+msgctxt "field:calendar.calendar,write_users:0"
+msgid "Write Users"
+msgstr "Записване на потребители"
+
+msgctxt "field:calendar.calendar-read-res.user,calendar:0"
+msgid "Calendar"
+msgstr "Календар"
+
+msgctxt "field:calendar.calendar-read-res.user,rec_name:0"
+msgid "Name"
+msgstr "Име"
+
+msgctxt "field:calendar.calendar-read-res.user,user:0"
+msgid "User"
+msgstr "Потребител"
+
+msgctxt "field:calendar.calendar-write-res.user,calendar:0"
+msgid "Calendar"
+msgstr "Календар"
+
+msgctxt "field:calendar.calendar-write-res.user,rec_name:0"
+msgid "Name"
+msgstr "Име"
+
+msgctxt "field:calendar.calendar-write-res.user,user:0"
+msgid "User"
+msgstr "Потребител"
+
+msgctxt "field:calendar.category,name:0"
+msgid "Name"
+msgstr "Име"
+
+msgctxt "field:calendar.category,rec_name:0"
+msgid "Name"
+msgstr "Име"
+
+msgctxt "field:calendar.date,date:0"
+msgid "Is Date"
+msgstr "Е дата"
+
+msgctxt "field:calendar.date,datetime:0"
+msgid "Date"
+msgstr "Дата"
+
+msgctxt "field:calendar.date,rec_name:0"
+msgid "Name"
+msgstr "Име"
+
+msgctxt "field:calendar.event,alarms:0"
+msgid "Alarms"
+msgstr "Аларми"
+
+msgctxt "field:calendar.event,all_day:0"
+msgid "All Day"
+msgstr "Всички дни"
+
+msgctxt "field:calendar.event,attendees:0"
+msgid "Attendees"
+msgstr "Присъстващи"
+
+msgctxt "field:calendar.event,calendar:0"
+msgid "Calendar"
+msgstr "Календар"
+
+msgctxt "field:calendar.event,calendar_owner:0"
+msgid "Owner"
+msgstr "Собственик"
+
+msgctxt "field:calendar.event,calendar_read_users:0"
+msgid "Read Users"
+msgstr "Потребители с права за четене"
+
+msgctxt "field:calendar.event,calendar_write_users:0"
+msgid "Write Users"
+msgstr "Записване на потребители"
+
+msgctxt "field:calendar.event,categories:0"
+msgid "Categories"
+msgstr "Категории"
+
+msgctxt "field:calendar.event,classification:0"
+msgid "Classification"
+msgstr "Класификация"
+
+msgctxt "field:calendar.event,description:0"
+msgid "Description"
+msgstr "Описание"
+
+msgctxt "field:calendar.event,dtend:0"
+msgid "End Date"
+msgstr "Крайна дата"
+
+msgctxt "field:calendar.event,dtstart:0"
+msgid "Start Date"
+msgstr "Начална дата"
+
+msgctxt "field:calendar.event,exdates:0"
+msgid "Exception Dates"
+msgstr "Дати на грешките"
+
+msgctxt "field:calendar.event,exrules:0"
+msgid "Exception Rules"
+msgstr "Правила при грешка"
+
+msgctxt "field:calendar.event,location:0"
+msgid "Location"
+msgstr "Местоположение"
+
+msgctxt "field:calendar.event,occurences:0"
+msgid "Occurences"
+msgstr "Събития"
+
+msgctxt "field:calendar.event,organizer:0"
+msgid "Organizer"
+msgstr "Организатор"
+
+msgctxt "field:calendar.event,parent:0"
+msgid "Parent"
+msgstr "Родител"
+
+msgctxt "field:calendar.event,rdates:0"
+msgid "Recurrence Dates"
+msgstr "Дати на повторяемост"
+
+msgctxt "field:calendar.event,rec_name:0"
+msgid "Name"
+msgstr "Име"
+
+msgctxt "field:calendar.event,recurrence:0"
+msgid "Recurrence"
+msgstr "Повторение"
+
+msgctxt "field:calendar.event,rrules:0"
+msgid "Recurrence Rules"
+msgstr "Правила за повторяемост"
+
+msgctxt "field:calendar.event,sequence:0"
+msgid "Sequence"
+msgstr "Последователност"
+
+msgctxt "field:calendar.event,status:0"
+msgid "Status"
+msgstr "Състояние"
+
+msgctxt "field:calendar.event,summary:0"
+msgid "Summary"
+msgstr "Обобщено"
+
+msgctxt "field:calendar.event,timezone:0"
+msgid "Timezone"
+msgstr "Времева зона"
+
+msgctxt "field:calendar.event,transp:0"
+msgid "Time Transparency"
+msgstr "Прозрачен във времето"
+
+msgctxt "field:calendar.event,uuid:0"
+msgid "UUID"
+msgstr "UUID"
+
+msgctxt "field:calendar.event,vevent:0"
+msgid "vevent"
+msgstr ""
+
+msgctxt "field:calendar.event-calendar.category,category:0"
+msgid "Category"
+msgstr "Категория"
+
+msgctxt "field:calendar.event-calendar.category,event:0"
+msgid "Event"
+msgstr "Събитие"
+
+msgctxt "field:calendar.event-calendar.category,rec_name:0"
+msgid "Name"
+msgstr "Име"
+
+msgctxt "field:calendar.event.alarm,calendar_alarm:0"
+msgid "Calendar Alarm"
+msgstr "Аларма на календар"
+
+msgctxt "field:calendar.event.alarm,event:0"
+msgid "Event"
+msgstr "Събитие"
+
+msgctxt "field:calendar.event.alarm,rec_name:0"
+msgid "Name"
+msgstr "Име"
+
+msgctxt "field:calendar.event.attendee,calendar_attendee:0"
+msgid "Calendar Attendee"
+msgstr "Присъстващ на календар"
+
+msgctxt "field:calendar.event.attendee,event:0"
+msgid "Event"
+msgstr "Събитие"
+
+msgctxt "field:calendar.event.attendee,rec_name:0"
+msgid "Name"
+msgstr "Име"
+
+msgctxt "field:calendar.event.exdate,calendar_date:0"
+msgid "Calendar Date"
+msgstr "Дата от календар"
+
+msgctxt "field:calendar.event.exdate,event:0"
+msgid "Event"
+msgstr "Събитие"
+
+msgctxt "field:calendar.event.exdate,rec_name:0"
+msgid "Name"
+msgstr "Име"
+
+msgctxt "field:calendar.event.exrule,calendar_rrule:0"
+msgid "Calendar RRule"
+msgstr ""
+
+msgctxt "field:calendar.event.exrule,event:0"
+msgid "Event"
+msgstr "Събитие"
+
+msgctxt "field:calendar.event.exrule,rec_name:0"
+msgid "Name"
+msgstr "Име"
+
+msgctxt "field:calendar.event.rdate,calendar_date:0"
+msgid "Calendar Date"
+msgstr "Дата от календар"
+
+msgctxt "field:calendar.event.rdate,event:0"
+msgid "Event"
+msgstr "Събитие"
+
+msgctxt "field:calendar.event.rdate,rec_name:0"
+msgid "Name"
+msgstr "Име"
+
+msgctxt "field:calendar.event.rrule,calendar_rrule:0"
+msgid "Calendar RRule"
+msgstr ""
+
+msgctxt "field:calendar.event.rrule,event:0"
+msgid "Event"
+msgstr "Събитие"
+
+msgctxt "field:calendar.event.rrule,rec_name:0"
+msgid "Name"
+msgstr "Име"
+
+msgctxt "field:calendar.location,name:0"
+msgid "Name"
+msgstr "Име"
+
+msgctxt "field:calendar.location,rec_name:0"
+msgid "Name"
+msgstr "Име"
+
+msgctxt "field:calendar.rrule,byday:0"
+msgid "By Day"
+msgstr "По ден"
+
+msgctxt "field:calendar.rrule,byhour:0"
+msgid "By Hour"
+msgstr "По час"
+
+msgctxt "field:calendar.rrule,byminute:0"
+msgid "By Minute"
+msgstr "По минута"
+
+msgctxt "field:calendar.rrule,bymonth:0"
+msgid "By Month"
+msgstr "По месец"
+
+msgctxt "field:calendar.rrule,bymonthday:0"
+msgid "By Month Day"
+msgstr "По ден от месеца"
+
+msgctxt "field:calendar.rrule,bysecond:0"
+msgid "By Second"
+msgstr "По секунда"
+
+msgctxt "field:calendar.rrule,bysetpos:0"
+msgid "By Position"
+msgstr "По позиция"
+
+msgctxt "field:calendar.rrule,byweekno:0"
+msgid "By Week Number"
+msgstr "По номер на седмицата"
+
+msgctxt "field:calendar.rrule,byyearday:0"
+msgid "By Year Day"
+msgstr "По ден от годината"
+
+msgctxt "field:calendar.rrule,count:0"
+msgid "Count"
+msgstr "Брой"
+
+msgctxt "field:calendar.rrule,freq:0"
+msgid "Frequency"
+msgstr "Честота"
+
+msgctxt "field:calendar.rrule,interval:0"
+msgid "Interval"
+msgstr "Интервал"
+
+msgctxt "field:calendar.rrule,rec_name:0"
+msgid "Name"
+msgstr "Име"
+
+msgctxt "field:calendar.rrule,until:0"
+msgid "Until Date"
+msgstr "До дата"
+
+msgctxt "field:calendar.rrule,until_date:0"
+msgid "Is Date"
+msgstr "Е дата"
+
+msgctxt "field:calendar.rrule,wkst:0"
+msgid "Week Day"
+msgstr "Ден от седмица"
+
+msgctxt "field:res.user,calendars:0"
+msgid "Calendars"
+msgstr "Календари"
+
+msgctxt "help:calendar.calendar,owner:0"
+msgid "The user must have an email"
+msgstr "Потребителя трябва да има email"
+
+msgctxt "help:calendar.date,date:0"
+msgid "Ignore time of field \"Date\", but handle as date only."
+msgstr "От полето \"Дата\" се игнорира часа и се използва само датата."
+
+msgctxt "help:calendar.event,uuid:0"
+msgid "Universally Unique Identifier"
+msgstr "Универсален иникален идентификатор"
+
+msgctxt "help:calendar.rrule,until_date:0"
+msgid "Ignore time of field \"Until Date\", but handle as date only."
+msgstr "От полето \"До дата\" се игнорира часа и се използва само датата."
+
+msgctxt "model:calendar.alarm,name:0"
+msgid "Alarm"
+msgstr "Аларма"
+
+msgctxt "model:calendar.attendee,name:0"
+msgid "Attendee"
+msgstr "Присъстващ"
+
+msgctxt "model:calendar.calendar,name:0"
+msgid "Calendar"
+msgstr "Календар"
+
+msgctxt "model:calendar.calendar-read-res.user,name:0"
+msgid "Calendar - read - User"
+msgstr ""
+
+msgctxt "model:calendar.calendar-write-res.user,name:0"
+msgid "Calendar - write - User"
+msgstr ""
+
+msgctxt "model:calendar.category,name:0"
+msgid "Category"
+msgstr "Категория"
+
+msgctxt "model:calendar.date,name:0"
+msgid "Calendar Date"
+msgstr "Дата от календар"
+
+msgctxt "model:calendar.event,name:0"
+msgid "Event"
+msgstr "Събитие"
+
+msgctxt "model:calendar.event-calendar.category,name:0"
+msgid "Event - Category"
+msgstr "Събитие - категория"
+
+msgctxt "model:calendar.event.alarm,name:0"
+msgid "Alarm"
+msgstr "Аларма"
+
+msgctxt "model:calendar.event.attendee,name:0"
+msgid "Attendee"
+msgstr "Присъстващ"
+
+msgctxt "model:calendar.event.exdate,name:0"
+msgid "Exception Date"
+msgstr "Дата на грешка"
+
+msgctxt "model:calendar.event.exrule,name:0"
+msgid "Exception Rule"
+msgstr "Правило при грешка"
+
+msgctxt "model:calendar.event.rdate,name:0"
+msgid "Recurrence Date"
+msgstr "Повтаряща се дата"
+
+msgctxt "model:calendar.event.rrule,name:0"
+msgid "Recurrence Rule"
+msgstr "Правило за повторение"
+
+msgctxt "model:calendar.location,name:0"
+msgid "Location"
+msgstr "Местоположение"
+
+msgctxt "model:calendar.rrule,name:0"
+msgid "Recurrence Rule"
+msgstr "Правило за повторение"
+
+msgctxt "model:ir.action,name:act_calendar_form"
+msgid "Calendars"
+msgstr "Календари"
+
+msgctxt "model:ir.action,name:act_event_form"
+msgid "Events"
+msgstr "Събития"
+
+msgctxt "model:ir.action,name:act_event_form3"
+msgid "Events"
+msgstr "Събития"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_calendar"
+msgid "Calendar"
+msgstr "Управление на календари"
+
+msgctxt "model:ir.ui.menu,name:menu_calendar_form"
+msgid "Calendars"
+msgstr "Календари"
+
+msgctxt "model:ir.ui.menu,name:menu_event_form"
+msgid "Events"
+msgstr "Събития"
+
+msgctxt "model:res.group,name:group_calendar_admin"
+msgid "Calendar Administration"
+msgstr "Управление на календар"
+
+msgctxt "selection:calendar.attendee,status:0"
+msgid ""
+msgstr ""
+
+msgctxt "selection:calendar.attendee,status:0"
+msgid "Accepted"
+msgstr "Приет"
+
+msgctxt "selection:calendar.attendee,status:0"
+msgid "Declined"
+msgstr "Отхвърлен"
+
+msgctxt "selection:calendar.attendee,status:0"
+msgid "Delegated"
+msgstr "Делегиран"
+
+msgctxt "selection:calendar.attendee,status:0"
+msgid "Needs Action"
+msgstr "Необходимо е действие"
+
+msgctxt "selection:calendar.attendee,status:0"
+msgid "Tentative"
+msgstr "Пробен"
+
+msgctxt "selection:calendar.event,classification:0"
+msgid "Confidential"
+msgstr "Поверителен"
+
+msgctxt "selection:calendar.event,classification:0"
+msgid "Private"
+msgstr "Частен"
+
+msgctxt "selection:calendar.event,classification:0"
+msgid "Public"
+msgstr "Публичен"
+
+msgctxt "selection:calendar.event,status:0"
+msgid ""
+msgstr ""
+
+msgctxt "selection:calendar.event,status:0"
+msgid "Cancelled"
+msgstr "Отказан"
+
+msgctxt "selection:calendar.event,status:0"
+msgid "Confirmed"
+msgstr "Потвърден"
+
+msgctxt "selection:calendar.event,status:0"
+msgid "Tentative"
+msgstr "Пробен"
+
+msgctxt "selection:calendar.event,transp:0"
+msgid "Opaque"
+msgstr "Непрозрачен"
+
+msgctxt "selection:calendar.event,transp:0"
+msgid "Transparent"
+msgstr "Прозрачен"
+
+msgctxt "selection:calendar.rrule,freq:0"
+msgid "Daily"
+msgstr "Ежедневно"
+
+msgctxt "selection:calendar.rrule,freq:0"
+msgid "Hourly"
+msgstr "Ежечасно"
+
+msgctxt "selection:calendar.rrule,freq:0"
+msgid "Minutely"
+msgstr "Ежеминутно"
+
+msgctxt "selection:calendar.rrule,freq:0"
+msgid "Monthly"
+msgstr "Месечно"
+
+msgctxt "selection:calendar.rrule,freq:0"
+msgid "Secondly"
+msgstr "Всяка секунда"
+
+msgctxt "selection:calendar.rrule,freq:0"
+msgid "Weekly"
+msgstr "Седмично"
+
+msgctxt "selection:calendar.rrule,freq:0"
+msgid "Yearly"
+msgstr "Годишно"
+
+msgctxt "selection:calendar.rrule,wkst:0"
+msgid "Friday"
+msgstr "Петък"
+
+msgctxt "selection:calendar.rrule,wkst:0"
+msgid "Monday"
+msgstr "Понеделник"
+
+msgctxt "selection:calendar.rrule,wkst:0"
+msgid "Saturday"
+msgstr "Събота"
+
+msgctxt "selection:calendar.rrule,wkst:0"
+msgid "Sunday"
+msgstr "Неделя"
+
+msgctxt "selection:calendar.rrule,wkst:0"
+msgid "Thursday"
+msgstr "Четвъртък"
+
+msgctxt "selection:calendar.rrule,wkst:0"
+msgid "Tuesday"
+msgstr "Вторник"
+
+msgctxt "selection:calendar.rrule,wkst:0"
+msgid "Wednesday"
+msgstr "Четвъртък"
+
+msgctxt "view:calendar.calendar:0"
+msgid "Calendar"
+msgstr "Календар"
+
+msgctxt "view:calendar.calendar:0"
+msgid "Calendars"
+msgstr "Календари"
+
+msgctxt "view:calendar.calendar:0"
+msgid "General"
+msgstr "Основен"
+
+msgctxt "view:calendar.calendar:0"
+msgid "Security"
+msgstr "Сигурност"
+
+msgctxt "view:calendar.category:0"
+msgid "Categories"
+msgstr "Категории"
+
+msgctxt "view:calendar.category:0"
+msgid "Category"
+msgstr "Категория"
+
+msgctxt "view:calendar.event.attendee:0"
+msgid "Attendee"
+msgstr "Присъстващ"
+
+msgctxt "view:calendar.event.attendee:0"
+msgid "Attendees"
+msgstr "Присъстващи"
+
+msgctxt "view:calendar.event.exdate:0"
+msgid "Exception Date"
+msgstr "Дата на грешка"
+
+msgctxt "view:calendar.event.exdate:0"
+msgid "Exception Dates"
+msgstr "Дати на грешките"
+
+msgctxt "view:calendar.event.exrule:0"
+msgid "Exception Rule"
+msgstr "Правило при грешка"
+
+msgctxt "view:calendar.event.exrule:0"
+msgid "Exception Rules"
+msgstr "Правила при грешка"
+
+msgctxt "view:calendar.event.rdate:0"
+msgid "Recurrence Date"
+msgstr "Повтаряща се дата"
+
+msgctxt "view:calendar.event.rdate:0"
+msgid "Recurrence Dates"
+msgstr "Дати на повторяемост"
+
+msgctxt "view:calendar.event.rrule:0"
+msgid "Recurrence Rule"
+msgstr "Правило за повторение"
+
+msgctxt "view:calendar.event.rrule:0"
+msgid "Recurrence Rules"
+msgstr "Правила за повторяемост"
+
+msgctxt "view:calendar.event:0"
+msgid "Attendees"
+msgstr "Присъстващи"
+
+msgctxt "view:calendar.event:0"
+msgid "Categories"
+msgstr "Категории"
+
+msgctxt "view:calendar.event:0"
+msgid "Event"
+msgstr "Събитие"
+
+msgctxt "view:calendar.event:0"
+msgid "Events"
+msgstr "Събития"
+
+msgctxt "view:calendar.event:0"
+msgid "General"
+msgstr "Основен"
+
+msgctxt "view:calendar.event:0"
+msgid "Occurences"
+msgstr "Събития"
+
+msgctxt "view:calendar.location:0"
+msgid "Location"
+msgstr "Местоположение"
+
+msgctxt "view:calendar.location:0"
+msgid "Locations"
+msgstr "Местонахождения"
diff --git a/locale/cs_CZ.po b/locale/cs_CZ.po
new file mode 100644
index 0000000..72d4400
--- /dev/null
+++ b/locale/cs_CZ.po
@@ -0,0 +1,759 @@
+# 
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "error:calendar.calendar:0"
+msgid "A user can have only one calendar!"
+msgstr ""
+
+msgctxt "error:calendar.calendar:0"
+msgid "The name of calendar must be unique!"
+msgstr ""
+
+msgctxt "error:calendar.category:0"
+msgid "The name of calendar category must be unique!"
+msgstr ""
+
+msgctxt "error:calendar.event:0"
+msgid "Recurrence can not be recurrent!"
+msgstr ""
+
+msgctxt "error:calendar.event:0"
+msgid "UUID and recurrence must be unique in a calendar!"
+msgstr ""
+
+msgctxt "error:calendar.location:0"
+msgid "The name of calendar location must be unique!"
+msgstr ""
+
+msgctxt "error:calendar.rrule:0"
+msgid "Invalid \"By Day\""
+msgstr ""
+
+msgctxt "error:calendar.rrule:0"
+msgid "Invalid \"By Hour\""
+msgstr ""
+
+msgctxt "error:calendar.rrule:0"
+msgid "Invalid \"By Minute\""
+msgstr ""
+
+msgctxt "error:calendar.rrule:0"
+msgid "Invalid \"By Month Day\""
+msgstr ""
+
+msgctxt "error:calendar.rrule:0"
+msgid "Invalid \"By Month\""
+msgstr ""
+
+msgctxt "error:calendar.rrule:0"
+msgid "Invalid \"By Position\""
+msgstr ""
+
+msgctxt "error:calendar.rrule:0"
+msgid "Invalid \"By Second\""
+msgstr ""
+
+msgctxt "error:calendar.rrule:0"
+msgid "Invalid \"By Week Number\""
+msgstr ""
+
+msgctxt "error:calendar.rrule:0"
+msgid "Invalid \"By Year Day\""
+msgstr ""
+
+msgctxt "error:calendar.rrule:0"
+msgid "Only one of \"until\" and \"count\" can be set!"
+msgstr ""
+
+msgctxt "field:calendar.alarm,rec_name:0"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:calendar.alarm,valarm:0"
+msgid "valarm"
+msgstr ""
+
+msgctxt "field:calendar.attendee,attendee:0"
+msgid "attendee"
+msgstr ""
+
+msgctxt "field:calendar.attendee,email:0"
+msgid "Email"
+msgstr ""
+
+msgctxt "field:calendar.attendee,rec_name:0"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:calendar.attendee,status:0"
+msgid "Participation Status"
+msgstr ""
+
+msgctxt "field:calendar.calendar,description:0"
+msgid "Description"
+msgstr ""
+
+msgctxt "field:calendar.calendar,name:0"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:calendar.calendar,owner:0"
+msgid "Owner"
+msgstr ""
+
+msgctxt "field:calendar.calendar,read_users:0"
+msgid "Read Users"
+msgstr ""
+
+msgctxt "field:calendar.calendar,rec_name:0"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:calendar.calendar,write_users:0"
+msgid "Write Users"
+msgstr ""
+
+msgctxt "field:calendar.calendar-read-res.user,calendar:0"
+msgid "Calendar"
+msgstr ""
+
+msgctxt "field:calendar.calendar-read-res.user,rec_name:0"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:calendar.calendar-read-res.user,user:0"
+msgid "User"
+msgstr ""
+
+msgctxt "field:calendar.calendar-write-res.user,calendar:0"
+msgid "Calendar"
+msgstr ""
+
+msgctxt "field:calendar.calendar-write-res.user,rec_name:0"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:calendar.calendar-write-res.user,user:0"
+msgid "User"
+msgstr ""
+
+msgctxt "field:calendar.category,name:0"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:calendar.category,rec_name:0"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:calendar.date,date:0"
+msgid "Is Date"
+msgstr ""
+
+msgctxt "field:calendar.date,datetime:0"
+msgid "Date"
+msgstr ""
+
+msgctxt "field:calendar.date,rec_name:0"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:calendar.event,alarms:0"
+msgid "Alarms"
+msgstr ""
+
+msgctxt "field:calendar.event,all_day:0"
+msgid "All Day"
+msgstr ""
+
+msgctxt "field:calendar.event,attendees:0"
+msgid "Attendees"
+msgstr ""
+
+msgctxt "field:calendar.event,calendar:0"
+msgid "Calendar"
+msgstr ""
+
+msgctxt "field:calendar.event,calendar_owner:0"
+msgid "Owner"
+msgstr ""
+
+msgctxt "field:calendar.event,calendar_read_users:0"
+msgid "Read Users"
+msgstr ""
+
+msgctxt "field:calendar.event,calendar_write_users:0"
+msgid "Write Users"
+msgstr ""
+
+msgctxt "field:calendar.event,categories:0"
+msgid "Categories"
+msgstr ""
+
+msgctxt "field:calendar.event,classification:0"
+msgid "Classification"
+msgstr ""
+
+msgctxt "field:calendar.event,description:0"
+msgid "Description"
+msgstr ""
+
+msgctxt "field:calendar.event,dtend:0"
+msgid "End Date"
+msgstr ""
+
+msgctxt "field:calendar.event,dtstart:0"
+msgid "Start Date"
+msgstr ""
+
+msgctxt "field:calendar.event,exdates:0"
+msgid "Exception Dates"
+msgstr ""
+
+msgctxt "field:calendar.event,exrules:0"
+msgid "Exception Rules"
+msgstr ""
+
+msgctxt "field:calendar.event,location:0"
+msgid "Location"
+msgstr ""
+
+msgctxt "field:calendar.event,occurences:0"
+msgid "Occurences"
+msgstr ""
+
+msgctxt "field:calendar.event,organizer:0"
+msgid "Organizer"
+msgstr ""
+
+msgctxt "field:calendar.event,parent:0"
+msgid "Parent"
+msgstr ""
+
+msgctxt "field:calendar.event,rdates:0"
+msgid "Recurrence Dates"
+msgstr ""
+
+msgctxt "field:calendar.event,rec_name:0"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:calendar.event,recurrence:0"
+msgid "Recurrence"
+msgstr ""
+
+msgctxt "field:calendar.event,rrules:0"
+msgid "Recurrence Rules"
+msgstr ""
+
+msgctxt "field:calendar.event,sequence:0"
+msgid "Sequence"
+msgstr ""
+
+msgctxt "field:calendar.event,status:0"
+msgid "Status"
+msgstr ""
+
+msgctxt "field:calendar.event,summary:0"
+msgid "Summary"
+msgstr ""
+
+msgctxt "field:calendar.event,timezone:0"
+msgid "Timezone"
+msgstr ""
+
+msgctxt "field:calendar.event,transp:0"
+msgid "Time Transparency"
+msgstr ""
+
+msgctxt "field:calendar.event,uuid:0"
+msgid "UUID"
+msgstr ""
+
+msgctxt "field:calendar.event,vevent:0"
+msgid "vevent"
+msgstr ""
+
+msgctxt "field:calendar.event-calendar.category,category:0"
+msgid "Category"
+msgstr ""
+
+msgctxt "field:calendar.event-calendar.category,event:0"
+msgid "Event"
+msgstr ""
+
+msgctxt "field:calendar.event-calendar.category,rec_name:0"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:calendar.event.alarm,calendar_alarm:0"
+msgid "Calendar Alarm"
+msgstr ""
+
+msgctxt "field:calendar.event.alarm,event:0"
+msgid "Event"
+msgstr ""
+
+msgctxt "field:calendar.event.alarm,rec_name:0"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:calendar.event.attendee,calendar_attendee:0"
+msgid "Calendar Attendee"
+msgstr ""
+
+msgctxt "field:calendar.event.attendee,event:0"
+msgid "Event"
+msgstr ""
+
+msgctxt "field:calendar.event.attendee,rec_name:0"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:calendar.event.exdate,calendar_date:0"
+msgid "Calendar Date"
+msgstr ""
+
+msgctxt "field:calendar.event.exdate,event:0"
+msgid "Event"
+msgstr ""
+
+msgctxt "field:calendar.event.exdate,rec_name:0"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:calendar.event.exrule,calendar_rrule:0"
+msgid "Calendar RRule"
+msgstr ""
+
+msgctxt "field:calendar.event.exrule,event:0"
+msgid "Event"
+msgstr ""
+
+msgctxt "field:calendar.event.exrule,rec_name:0"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:calendar.event.rdate,calendar_date:0"
+msgid "Calendar Date"
+msgstr ""
+
+msgctxt "field:calendar.event.rdate,event:0"
+msgid "Event"
+msgstr ""
+
+msgctxt "field:calendar.event.rdate,rec_name:0"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:calendar.event.rrule,calendar_rrule:0"
+msgid "Calendar RRule"
+msgstr ""
+
+msgctxt "field:calendar.event.rrule,event:0"
+msgid "Event"
+msgstr ""
+
+msgctxt "field:calendar.event.rrule,rec_name:0"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:calendar.location,name:0"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:calendar.location,rec_name:0"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:calendar.rrule,byday:0"
+msgid "By Day"
+msgstr ""
+
+msgctxt "field:calendar.rrule,byhour:0"
+msgid "By Hour"
+msgstr ""
+
+msgctxt "field:calendar.rrule,byminute:0"
+msgid "By Minute"
+msgstr ""
+
+msgctxt "field:calendar.rrule,bymonth:0"
+msgid "By Month"
+msgstr ""
+
+msgctxt "field:calendar.rrule,bymonthday:0"
+msgid "By Month Day"
+msgstr ""
+
+msgctxt "field:calendar.rrule,bysecond:0"
+msgid "By Second"
+msgstr ""
+
+msgctxt "field:calendar.rrule,bysetpos:0"
+msgid "By Position"
+msgstr ""
+
+msgctxt "field:calendar.rrule,byweekno:0"
+msgid "By Week Number"
+msgstr ""
+
+msgctxt "field:calendar.rrule,byyearday:0"
+msgid "By Year Day"
+msgstr ""
+
+msgctxt "field:calendar.rrule,count:0"
+msgid "Count"
+msgstr ""
+
+msgctxt "field:calendar.rrule,freq:0"
+msgid "Frequency"
+msgstr ""
+
+msgctxt "field:calendar.rrule,interval:0"
+msgid "Interval"
+msgstr ""
+
+msgctxt "field:calendar.rrule,rec_name:0"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:calendar.rrule,until:0"
+msgid "Until Date"
+msgstr ""
+
+msgctxt "field:calendar.rrule,until_date:0"
+msgid "Is Date"
+msgstr ""
+
+msgctxt "field:calendar.rrule,wkst:0"
+msgid "Week Day"
+msgstr ""
+
+msgctxt "field:res.user,calendars:0"
+msgid "Calendars"
+msgstr ""
+
+msgctxt "help:calendar.calendar,owner:0"
+msgid "The user must have an email"
+msgstr ""
+
+msgctxt "help:calendar.date,date:0"
+msgid "Ignore time of field \"Date\", but handle as date only."
+msgstr ""
+
+msgctxt "help:calendar.event,uuid:0"
+msgid "Universally Unique Identifier"
+msgstr ""
+
+msgctxt "help:calendar.rrule,until_date:0"
+msgid "Ignore time of field \"Until Date\", but handle as date only."
+msgstr ""
+
+msgctxt "model:calendar.alarm,name:0"
+msgid "Alarm"
+msgstr ""
+
+msgctxt "model:calendar.attendee,name:0"
+msgid "Attendee"
+msgstr ""
+
+msgctxt "model:calendar.calendar,name:0"
+msgid "Calendar"
+msgstr ""
+
+msgctxt "model:calendar.calendar-read-res.user,name:0"
+msgid "Calendar - read - User"
+msgstr ""
+
+msgctxt "model:calendar.calendar-write-res.user,name:0"
+msgid "Calendar - write - User"
+msgstr ""
+
+msgctxt "model:calendar.category,name:0"
+msgid "Category"
+msgstr ""
+
+msgctxt "model:calendar.date,name:0"
+msgid "Calendar Date"
+msgstr ""
+
+msgctxt "model:calendar.event,name:0"
+msgid "Event"
+msgstr ""
+
+msgctxt "model:calendar.event-calendar.category,name:0"
+msgid "Event - Category"
+msgstr ""
+
+msgctxt "model:calendar.event.alarm,name:0"
+msgid "Alarm"
+msgstr ""
+
+msgctxt "model:calendar.event.attendee,name:0"
+msgid "Attendee"
+msgstr ""
+
+msgctxt "model:calendar.event.exdate,name:0"
+msgid "Exception Date"
+msgstr ""
+
+msgctxt "model:calendar.event.exrule,name:0"
+msgid "Exception Rule"
+msgstr ""
+
+msgctxt "model:calendar.event.rdate,name:0"
+msgid "Recurrence Date"
+msgstr ""
+
+msgctxt "model:calendar.event.rrule,name:0"
+msgid "Recurrence Rule"
+msgstr ""
+
+msgctxt "model:calendar.location,name:0"
+msgid "Location"
+msgstr ""
+
+msgctxt "model:calendar.rrule,name:0"
+msgid "Recurrence Rule"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_calendar_form"
+msgid "Calendars"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_event_form"
+msgid "Events"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_event_form3"
+msgid "Events"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_calendar"
+msgid "Calendar"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_calendar_form"
+msgid "Calendars"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_event_form"
+msgid "Events"
+msgstr ""
+
+msgctxt "model:res.group,name:group_calendar_admin"
+msgid "Calendar Administration"
+msgstr ""
+
+msgctxt "selection:calendar.attendee,status:0"
+msgid ""
+msgstr ""
+
+msgctxt "selection:calendar.attendee,status:0"
+msgid "Accepted"
+msgstr ""
+
+msgctxt "selection:calendar.attendee,status:0"
+msgid "Declined"
+msgstr ""
+
+msgctxt "selection:calendar.attendee,status:0"
+msgid "Delegated"
+msgstr ""
+
+msgctxt "selection:calendar.attendee,status:0"
+msgid "Needs Action"
+msgstr ""
+
+msgctxt "selection:calendar.attendee,status:0"
+msgid "Tentative"
+msgstr ""
+
+msgctxt "selection:calendar.event,classification:0"
+msgid "Confidential"
+msgstr ""
+
+msgctxt "selection:calendar.event,classification:0"
+msgid "Private"
+msgstr ""
+
+msgctxt "selection:calendar.event,classification:0"
+msgid "Public"
+msgstr ""
+
+msgctxt "selection:calendar.event,status:0"
+msgid ""
+msgstr ""
+
+msgctxt "selection:calendar.event,status:0"
+msgid "Cancelled"
+msgstr ""
+
+msgctxt "selection:calendar.event,status:0"
+msgid "Confirmed"
+msgstr ""
+
+msgctxt "selection:calendar.event,status:0"
+msgid "Tentative"
+msgstr ""
+
+msgctxt "selection:calendar.event,transp:0"
+msgid "Opaque"
+msgstr ""
+
+msgctxt "selection:calendar.event,transp:0"
+msgid "Transparent"
+msgstr ""
+
+msgctxt "selection:calendar.rrule,freq:0"
+msgid "Daily"
+msgstr ""
+
+msgctxt "selection:calendar.rrule,freq:0"
+msgid "Hourly"
+msgstr ""
+
+msgctxt "selection:calendar.rrule,freq:0"
+msgid "Minutely"
+msgstr ""
+
+msgctxt "selection:calendar.rrule,freq:0"
+msgid "Monthly"
+msgstr ""
+
+msgctxt "selection:calendar.rrule,freq:0"
+msgid "Secondly"
+msgstr ""
+
+msgctxt "selection:calendar.rrule,freq:0"
+msgid "Weekly"
+msgstr ""
+
+msgctxt "selection:calendar.rrule,freq:0"
+msgid "Yearly"
+msgstr ""
+
+msgctxt "selection:calendar.rrule,wkst:0"
+msgid "Friday"
+msgstr ""
+
+msgctxt "selection:calendar.rrule,wkst:0"
+msgid "Monday"
+msgstr ""
+
+msgctxt "selection:calendar.rrule,wkst:0"
+msgid "Saturday"
+msgstr ""
+
+msgctxt "selection:calendar.rrule,wkst:0"
+msgid "Sunday"
+msgstr ""
+
+msgctxt "selection:calendar.rrule,wkst:0"
+msgid "Thursday"
+msgstr ""
+
+msgctxt "selection:calendar.rrule,wkst:0"
+msgid "Tuesday"
+msgstr ""
+
+msgctxt "selection:calendar.rrule,wkst:0"
+msgid "Wednesday"
+msgstr ""
+
+msgctxt "view:calendar.calendar:0"
+msgid "Calendar"
+msgstr ""
+
+msgctxt "view:calendar.calendar:0"
+msgid "Calendars"
+msgstr ""
+
+msgctxt "view:calendar.calendar:0"
+msgid "General"
+msgstr ""
+
+msgctxt "view:calendar.calendar:0"
+msgid "Security"
+msgstr ""
+
+msgctxt "view:calendar.category:0"
+msgid "Categories"
+msgstr ""
+
+msgctxt "view:calendar.category:0"
+msgid "Category"
+msgstr ""
+
+msgctxt "view:calendar.event.attendee:0"
+msgid "Attendee"
+msgstr ""
+
+msgctxt "view:calendar.event.attendee:0"
+msgid "Attendees"
+msgstr ""
+
+msgctxt "view:calendar.event.exdate:0"
+msgid "Exception Date"
+msgstr ""
+
+msgctxt "view:calendar.event.exdate:0"
+msgid "Exception Dates"
+msgstr ""
+
+msgctxt "view:calendar.event.exrule:0"
+msgid "Exception Rule"
+msgstr ""
+
+msgctxt "view:calendar.event.exrule:0"
+msgid "Exception Rules"
+msgstr ""
+
+msgctxt "view:calendar.event.rdate:0"
+msgid "Recurrence Date"
+msgstr ""
+
+msgctxt "view:calendar.event.rdate:0"
+msgid "Recurrence Dates"
+msgstr ""
+
+msgctxt "view:calendar.event.rrule:0"
+msgid "Recurrence Rule"
+msgstr ""
+
+msgctxt "view:calendar.event.rrule:0"
+msgid "Recurrence Rules"
+msgstr ""
+
+msgctxt "view:calendar.event:0"
+msgid "Attendees"
+msgstr ""
+
+msgctxt "view:calendar.event:0"
+msgid "Categories"
+msgstr ""
+
+msgctxt "view:calendar.event:0"
+msgid "Event"
+msgstr ""
+
+msgctxt "view:calendar.event:0"
+msgid "Events"
+msgstr ""
+
+msgctxt "view:calendar.event:0"
+msgid "General"
+msgstr ""
+
+msgctxt "view:calendar.event:0"
+msgid "Occurences"
+msgstr ""
+
+msgctxt "view:calendar.location:0"
+msgid "Location"
+msgstr ""
+
+msgctxt "view:calendar.location:0"
+msgid "Locations"
+msgstr ""
diff --git a/locale/de_DE.po b/locale/de_DE.po
new file mode 100644
index 0000000..f4c7715
--- /dev/null
+++ b/locale/de_DE.po
@@ -0,0 +1,765 @@
+# 
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "error:calendar.calendar:0"
+msgid "A user can have only one calendar!"
+msgstr "Es ist nur ein Kalender pro Benutzer möglich!"
+
+msgctxt "error:calendar.calendar:0"
+msgid "The name of calendar must be unique!"
+msgstr "Kalendername kann nicht mehrfach vergeben werden!"
+
+msgctxt "error:calendar.category:0"
+msgid "The name of calendar category must be unique!"
+msgstr "Name für Kalenderkategorie kann nicht mehrfach vergeben werden!"
+
+msgctxt "error:calendar.event:0"
+msgid "Recurrence can not be recurrent!"
+msgstr "Wiederholungen können nicht rekursiv sein!"
+
+msgctxt "error:calendar.event:0"
+msgid "UUID and recurrence must be unique in a calendar!"
+msgstr ""
+"UUID und Wiederholung können in einem Kalender nicht mehrfach vergeben "
+"werden!"
+
+msgctxt "error:calendar.location:0"
+msgid "The name of calendar location must be unique!"
+msgstr "Name für Kalenderort kann nicht mehrfach vergeben werden!"
+
+msgctxt "error:calendar.rrule:0"
+msgid "Invalid \"By Day\""
+msgstr "Ungültig \"Für Tag\""
+
+msgctxt "error:calendar.rrule:0"
+msgid "Invalid \"By Hour\""
+msgstr "Ungültig \"Für Stunde\""
+
+msgctxt "error:calendar.rrule:0"
+msgid "Invalid \"By Minute\""
+msgstr "Ungültig \"Für Minute\""
+
+msgctxt "error:calendar.rrule:0"
+msgid "Invalid \"By Month Day\""
+msgstr "Ungültig \"Für Tag des Monats\""
+
+msgctxt "error:calendar.rrule:0"
+msgid "Invalid \"By Month\""
+msgstr "Ungültig \"Für Monat\""
+
+msgctxt "error:calendar.rrule:0"
+msgid "Invalid \"By Position\""
+msgstr "Ungültig \"Für Position\""
+
+msgctxt "error:calendar.rrule:0"
+msgid "Invalid \"By Second\""
+msgstr "Ungültig \"Für Sekunde\""
+
+msgctxt "error:calendar.rrule:0"
+msgid "Invalid \"By Week Number\""
+msgstr "Ungültig \"Für Woche Nummer\""
+
+msgctxt "error:calendar.rrule:0"
+msgid "Invalid \"By Year Day\""
+msgstr "Ungültig \"Für Tag des Jahres\""
+
+msgctxt "error:calendar.rrule:0"
+msgid "Only one of \"until\" and \"count\" can be set!"
+msgstr "Es kann nur entweder \"Bis\" oder \"Anzahl\" gesetzt werden!"
+
+msgctxt "field:calendar.alarm,rec_name:0"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:calendar.alarm,valarm:0"
+msgid "valarm"
+msgstr "valarm"
+
+msgctxt "field:calendar.attendee,attendee:0"
+msgid "attendee"
+msgstr "Teilnehmer"
+
+msgctxt "field:calendar.attendee,email:0"
+msgid "Email"
+msgstr "E-Mail"
+
+msgctxt "field:calendar.attendee,rec_name:0"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:calendar.attendee,status:0"
+msgid "Participation Status"
+msgstr "Teilnahmestatus"
+
+msgctxt "field:calendar.calendar,description:0"
+msgid "Description"
+msgstr "Bezeichnung"
+
+msgctxt "field:calendar.calendar,name:0"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:calendar.calendar,owner:0"
+msgid "Owner"
+msgstr "Besitzer"
+
+msgctxt "field:calendar.calendar,read_users:0"
+msgid "Read Users"
+msgstr "Benutzer mit Leseberechtigung"
+
+msgctxt "field:calendar.calendar,rec_name:0"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:calendar.calendar,write_users:0"
+msgid "Write Users"
+msgstr "Benutzer mit Schreibberechtigung"
+
+msgctxt "field:calendar.calendar-read-res.user,calendar:0"
+msgid "Calendar"
+msgstr "Kalender"
+
+msgctxt "field:calendar.calendar-read-res.user,rec_name:0"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:calendar.calendar-read-res.user,user:0"
+msgid "User"
+msgstr "Benutzer"
+
+msgctxt "field:calendar.calendar-write-res.user,calendar:0"
+msgid "Calendar"
+msgstr "Kalender"
+
+msgctxt "field:calendar.calendar-write-res.user,rec_name:0"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:calendar.calendar-write-res.user,user:0"
+msgid "User"
+msgstr "Benutzer"
+
+msgctxt "field:calendar.category,name:0"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:calendar.category,rec_name:0"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:calendar.date,date:0"
+msgid "Is Date"
+msgstr "Als Datum"
+
+msgctxt "field:calendar.date,datetime:0"
+msgid "Date"
+msgstr "Zeitpunkt"
+
+msgctxt "field:calendar.date,rec_name:0"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:calendar.event,alarms:0"
+msgid "Alarms"
+msgstr "Alarm"
+
+msgctxt "field:calendar.event,all_day:0"
+msgid "All Day"
+msgstr "Ganztägig"
+
+msgctxt "field:calendar.event,attendees:0"
+msgid "Attendees"
+msgstr "Teilnehmer"
+
+msgctxt "field:calendar.event,calendar:0"
+msgid "Calendar"
+msgstr "Kalender"
+
+msgctxt "field:calendar.event,calendar_owner:0"
+msgid "Owner"
+msgstr "Besitzer"
+
+msgctxt "field:calendar.event,calendar_read_users:0"
+msgid "Read Users"
+msgstr "Benutzer mit Leseberechtigung"
+
+msgctxt "field:calendar.event,calendar_write_users:0"
+msgid "Write Users"
+msgstr "Benutzer mit Schreibberechtigung"
+
+msgctxt "field:calendar.event,categories:0"
+msgid "Categories"
+msgstr "Kategorien"
+
+msgctxt "field:calendar.event,classification:0"
+msgid "Classification"
+msgstr "Klassifizierung"
+
+msgctxt "field:calendar.event,description:0"
+msgid "Description"
+msgstr "Bezeichnung"
+
+msgctxt "field:calendar.event,dtend:0"
+msgid "End Date"
+msgstr "Enddatum"
+
+msgctxt "field:calendar.event,dtstart:0"
+msgid "Start Date"
+msgstr "Anfangsdatum"
+
+msgctxt "field:calendar.event,exdates:0"
+msgid "Exception Dates"
+msgstr "Ausnahmedaten"
+
+msgctxt "field:calendar.event,exrules:0"
+msgid "Exception Rules"
+msgstr "Ausnahmeregeln"
+
+msgctxt "field:calendar.event,location:0"
+msgid "Location"
+msgstr "Ort"
+
+msgctxt "field:calendar.event,occurences:0"
+msgid "Occurences"
+msgstr "Ereignisse"
+
+msgctxt "field:calendar.event,organizer:0"
+msgid "Organizer"
+msgstr "Organisator"
+
+msgctxt "field:calendar.event,parent:0"
+msgid "Parent"
+msgstr "Übergeordnet (Termin)"
+
+msgctxt "field:calendar.event,rdates:0"
+msgid "Recurrence Dates"
+msgstr "Wiederholungsdaten"
+
+msgctxt "field:calendar.event,rec_name:0"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:calendar.event,recurrence:0"
+msgid "Recurrence"
+msgstr "Wiederholung"
+
+msgctxt "field:calendar.event,rrules:0"
+msgid "Recurrence Rules"
+msgstr "Wiederholungsregeln"
+
+msgctxt "field:calendar.event,sequence:0"
+msgid "Sequence"
+msgstr "Revision"
+
+msgctxt "field:calendar.event,status:0"
+msgid "Status"
+msgstr "Status"
+
+msgctxt "field:calendar.event,summary:0"
+msgid "Summary"
+msgstr "Zusammenfassung"
+
+msgctxt "field:calendar.event,timezone:0"
+msgid "Timezone"
+msgstr "Zeitzone"
+
+msgctxt "field:calendar.event,transp:0"
+msgid "Time Transparency"
+msgstr "Zeittransparenz"
+
+msgctxt "field:calendar.event,uuid:0"
+msgid "UUID"
+msgstr "UUID"
+
+msgctxt "field:calendar.event,vevent:0"
+msgid "vevent"
+msgstr "vevent"
+
+msgctxt "field:calendar.event-calendar.category,category:0"
+msgid "Category"
+msgstr "Kategorie"
+
+msgctxt "field:calendar.event-calendar.category,event:0"
+msgid "Event"
+msgstr "Termin"
+
+msgctxt "field:calendar.event-calendar.category,rec_name:0"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:calendar.event.alarm,calendar_alarm:0"
+msgid "Calendar Alarm"
+msgstr "Kalender Alarm"
+
+msgctxt "field:calendar.event.alarm,event:0"
+msgid "Event"
+msgstr "Termin"
+
+msgctxt "field:calendar.event.alarm,rec_name:0"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:calendar.event.attendee,calendar_attendee:0"
+msgid "Calendar Attendee"
+msgstr "Kalender Teilnehmer"
+
+msgctxt "field:calendar.event.attendee,event:0"
+msgid "Event"
+msgstr "Termin"
+
+msgctxt "field:calendar.event.attendee,rec_name:0"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:calendar.event.exdate,calendar_date:0"
+msgid "Calendar Date"
+msgstr "Kalender Datum"
+
+msgctxt "field:calendar.event.exdate,event:0"
+msgid "Event"
+msgstr "Termin"
+
+msgctxt "field:calendar.event.exdate,rec_name:0"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:calendar.event.exrule,calendar_rrule:0"
+msgid "Calendar RRule"
+msgstr "Kalender WRegel"
+
+msgctxt "field:calendar.event.exrule,event:0"
+msgid "Event"
+msgstr "Termin"
+
+msgctxt "field:calendar.event.exrule,rec_name:0"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:calendar.event.rdate,calendar_date:0"
+msgid "Calendar Date"
+msgstr "Kalender Datum"
+
+msgctxt "field:calendar.event.rdate,event:0"
+msgid "Event"
+msgstr "Termin"
+
+msgctxt "field:calendar.event.rdate,rec_name:0"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:calendar.event.rrule,calendar_rrule:0"
+msgid "Calendar RRule"
+msgstr "Kalender WRegel"
+
+msgctxt "field:calendar.event.rrule,event:0"
+msgid "Event"
+msgstr "Termin"
+
+msgctxt "field:calendar.event.rrule,rec_name:0"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:calendar.location,name:0"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:calendar.location,rec_name:0"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:calendar.rrule,byday:0"
+msgid "By Day"
+msgstr "Für Tag"
+
+msgctxt "field:calendar.rrule,byhour:0"
+msgid "By Hour"
+msgstr "Für Stunde"
+
+msgctxt "field:calendar.rrule,byminute:0"
+msgid "By Minute"
+msgstr "Für Minute"
+
+msgctxt "field:calendar.rrule,bymonth:0"
+msgid "By Month"
+msgstr "Für Monat"
+
+msgctxt "field:calendar.rrule,bymonthday:0"
+msgid "By Month Day"
+msgstr "Für Tag des Monats"
+
+msgctxt "field:calendar.rrule,bysecond:0"
+msgid "By Second"
+msgstr "Für Sekunde"
+
+msgctxt "field:calendar.rrule,bysetpos:0"
+msgid "By Position"
+msgstr "Für Position"
+
+msgctxt "field:calendar.rrule,byweekno:0"
+msgid "By Week Number"
+msgstr "Für Woche Nummer"
+
+msgctxt "field:calendar.rrule,byyearday:0"
+msgid "By Year Day"
+msgstr "Für Tag des Jahres"
+
+msgctxt "field:calendar.rrule,count:0"
+msgid "Count"
+msgstr "Anzahl"
+
+msgctxt "field:calendar.rrule,freq:0"
+msgid "Frequency"
+msgstr "Häufigkeit"
+
+msgctxt "field:calendar.rrule,interval:0"
+msgid "Interval"
+msgstr "Intervall"
+
+msgctxt "field:calendar.rrule,rec_name:0"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:calendar.rrule,until:0"
+msgid "Until Date"
+msgstr "Bis Zeitpunkt"
+
+msgctxt "field:calendar.rrule,until_date:0"
+msgid "Is Date"
+msgstr "Als Datum"
+
+msgctxt "field:calendar.rrule,wkst:0"
+msgid "Week Day"
+msgstr "Wochentag"
+
+msgctxt "field:res.user,calendars:0"
+msgid "Calendars"
+msgstr "Kalender"
+
+msgctxt "help:calendar.calendar,owner:0"
+msgid "The user must have an email"
+msgstr "Dem Benutzer muss eine E-Mail-Adresse zugeordnet sein!"
+
+msgctxt "help:calendar.date,date:0"
+msgid "Ignore time of field \"Date\", but handle as date only."
+msgstr "Verwende von Feld \"Zeitpunkt\" nur das Datum ohne den Zeitanteil."
+
+msgctxt "help:calendar.event,uuid:0"
+msgid "Universally Unique Identifier"
+msgstr "Universally Unique Identifier"
+
+msgctxt "help:calendar.rrule,until_date:0"
+msgid "Ignore time of field \"Until Date\", but handle as date only."
+msgstr "Verwende von Feld \"Bis Zeitpunkt\" nur das Datum ohne den Zeitanteil."
+
+msgctxt "model:calendar.alarm,name:0"
+msgid "Alarm"
+msgstr "Alarm"
+
+msgctxt "model:calendar.attendee,name:0"
+msgid "Attendee"
+msgstr "Teilnehmer"
+
+msgctxt "model:calendar.calendar,name:0"
+msgid "Calendar"
+msgstr "Kalender"
+
+msgctxt "model:calendar.calendar-read-res.user,name:0"
+msgid "Calendar - read - User"
+msgstr "Kalender - Schreiben - Benutzer"
+
+msgctxt "model:calendar.calendar-write-res.user,name:0"
+msgid "Calendar - write - User"
+msgstr "Kalender - Lesen - Benutzer"
+
+msgctxt "model:calendar.category,name:0"
+msgid "Category"
+msgstr "Kategorie"
+
+msgctxt "model:calendar.date,name:0"
+msgid "Calendar Date"
+msgstr "Kalender Datum"
+
+msgctxt "model:calendar.event,name:0"
+msgid "Event"
+msgstr "Termin"
+
+msgctxt "model:calendar.event-calendar.category,name:0"
+msgid "Event - Category"
+msgstr "Termin - Kategorie"
+
+msgctxt "model:calendar.event.alarm,name:0"
+msgid "Alarm"
+msgstr "Alarm"
+
+msgctxt "model:calendar.event.attendee,name:0"
+msgid "Attendee"
+msgstr "Teilnehmer"
+
+msgctxt "model:calendar.event.exdate,name:0"
+msgid "Exception Date"
+msgstr "Ausnahmedatum"
+
+msgctxt "model:calendar.event.exrule,name:0"
+msgid "Exception Rule"
+msgstr "Ausnahmeregel"
+
+msgctxt "model:calendar.event.rdate,name:0"
+msgid "Recurrence Date"
+msgstr "Wiederholungsdatum"
+
+msgctxt "model:calendar.event.rrule,name:0"
+msgid "Recurrence Rule"
+msgstr "Wiederholungsregel"
+
+msgctxt "model:calendar.location,name:0"
+msgid "Location"
+msgstr "Ort"
+
+msgctxt "model:calendar.rrule,name:0"
+msgid "Recurrence Rule"
+msgstr "Wiederholungsregel"
+
+msgctxt "model:ir.action,name:act_calendar_form"
+msgid "Calendars"
+msgstr "Kalender"
+
+msgctxt "model:ir.action,name:act_event_form"
+msgid "Events"
+msgstr "Termine"
+
+msgctxt "model:ir.action,name:act_event_form3"
+msgid "Events"
+msgstr "Termine"
+
+msgctxt "model:ir.ui.menu,name:menu_calendar"
+msgid "Calendar"
+msgstr "Kalender"
+
+msgctxt "model:ir.ui.menu,name:menu_calendar_form"
+msgid "Calendars"
+msgstr "Kalender"
+
+msgctxt "model:ir.ui.menu,name:menu_event_form"
+msgid "Events"
+msgstr "Termine"
+
+msgctxt "model:res.group,name:group_calendar_admin"
+msgid "Calendar Administration"
+msgstr "Kalender Administration"
+
+msgctxt "selection:calendar.attendee,status:0"
+msgid ""
+msgstr ""
+
+msgctxt "selection:calendar.attendee,status:0"
+msgid "Accepted"
+msgstr "Angenommen"
+
+msgctxt "selection:calendar.attendee,status:0"
+msgid "Declined"
+msgstr "Abgelehnt"
+
+msgctxt "selection:calendar.attendee,status:0"
+msgid "Delegated"
+msgstr "Delegiert"
+
+msgctxt "selection:calendar.attendee,status:0"
+msgid "Needs Action"
+msgstr "Aktion erforderlich"
+
+msgctxt "selection:calendar.attendee,status:0"
+msgid "Tentative"
+msgstr "Unter Vorbehalt"
+
+msgctxt "selection:calendar.event,classification:0"
+msgid "Confidential"
+msgstr "Vertraulich"
+
+msgctxt "selection:calendar.event,classification:0"
+msgid "Private"
+msgstr "Privat"
+
+msgctxt "selection:calendar.event,classification:0"
+msgid "Public"
+msgstr "Öffentlich"
+
+msgctxt "selection:calendar.event,status:0"
+msgid ""
+msgstr ""
+
+msgctxt "selection:calendar.event,status:0"
+msgid "Cancelled"
+msgstr "Abgesagt"
+
+msgctxt "selection:calendar.event,status:0"
+msgid "Confirmed"
+msgstr "Bestätigt"
+
+msgctxt "selection:calendar.event,status:0"
+msgid "Tentative"
+msgstr "Unter Vorbehalt"
+
+msgctxt "selection:calendar.event,transp:0"
+msgid "Opaque"
+msgstr "Opak"
+
+msgctxt "selection:calendar.event,transp:0"
+msgid "Transparent"
+msgstr "Transparent"
+
+msgctxt "selection:calendar.rrule,freq:0"
+msgid "Daily"
+msgstr "Täglich"
+
+msgctxt "selection:calendar.rrule,freq:0"
+msgid "Hourly"
+msgstr "Stündlich"
+
+msgctxt "selection:calendar.rrule,freq:0"
+msgid "Minutely"
+msgstr "Minütlich"
+
+msgctxt "selection:calendar.rrule,freq:0"
+msgid "Monthly"
+msgstr "Monatlich"
+
+msgctxt "selection:calendar.rrule,freq:0"
+msgid "Secondly"
+msgstr "Sekündlich"
+
+msgctxt "selection:calendar.rrule,freq:0"
+msgid "Weekly"
+msgstr "Wöchentlich"
+
+msgctxt "selection:calendar.rrule,freq:0"
+msgid "Yearly"
+msgstr "Jährlich"
+
+msgctxt "selection:calendar.rrule,wkst:0"
+msgid "Friday"
+msgstr "Freitag"
+
+msgctxt "selection:calendar.rrule,wkst:0"
+msgid "Monday"
+msgstr "Montag"
+
+msgctxt "selection:calendar.rrule,wkst:0"
+msgid "Saturday"
+msgstr "Samstag"
+
+msgctxt "selection:calendar.rrule,wkst:0"
+msgid "Sunday"
+msgstr "Sonntag"
+
+msgctxt "selection:calendar.rrule,wkst:0"
+msgid "Thursday"
+msgstr "Donnerstag"
+
+msgctxt "selection:calendar.rrule,wkst:0"
+msgid "Tuesday"
+msgstr "Dienstag"
+
+msgctxt "selection:calendar.rrule,wkst:0"
+msgid "Wednesday"
+msgstr "Mittwoch"
+
+msgctxt "view:calendar.calendar:0"
+msgid "Calendar"
+msgstr "Kalender"
+
+msgctxt "view:calendar.calendar:0"
+msgid "Calendars"
+msgstr "Kalender"
+
+msgctxt "view:calendar.calendar:0"
+msgid "General"
+msgstr "Allgemein"
+
+msgctxt "view:calendar.calendar:0"
+msgid "Security"
+msgstr "Sicherheit"
+
+msgctxt "view:calendar.category:0"
+msgid "Categories"
+msgstr "Kategorien"
+
+msgctxt "view:calendar.category:0"
+msgid "Category"
+msgstr "Kategorie"
+
+msgctxt "view:calendar.event.attendee:0"
+msgid "Attendee"
+msgstr "Teilnehmer"
+
+msgctxt "view:calendar.event.attendee:0"
+msgid "Attendees"
+msgstr "Teilnehmer"
+
+msgctxt "view:calendar.event.exdate:0"
+msgid "Exception Date"
+msgstr "Ausnahmedatum"
+
+msgctxt "view:calendar.event.exdate:0"
+msgid "Exception Dates"
+msgstr "Ausnahmedaten"
+
+msgctxt "view:calendar.event.exrule:0"
+msgid "Exception Rule"
+msgstr "Ausnahmeregel"
+
+msgctxt "view:calendar.event.exrule:0"
+msgid "Exception Rules"
+msgstr "Ausnahmeregeln"
+
+msgctxt "view:calendar.event.rdate:0"
+msgid "Recurrence Date"
+msgstr "Wiederholungsdatum"
+
+msgctxt "view:calendar.event.rdate:0"
+msgid "Recurrence Dates"
+msgstr "Wiederholungsdaten"
+
+msgctxt "view:calendar.event.rrule:0"
+msgid "Recurrence Rule"
+msgstr "Wiederholungsregel"
+
+msgctxt "view:calendar.event.rrule:0"
+msgid "Recurrence Rules"
+msgstr "Wiederholungsregeln"
+
+msgctxt "view:calendar.event:0"
+msgid "Attendees"
+msgstr "Teilnehmer"
+
+msgctxt "view:calendar.event:0"
+msgid "Categories"
+msgstr "Kategorien"
+
+msgctxt "view:calendar.event:0"
+msgid "Event"
+msgstr "Termin"
+
+msgctxt "view:calendar.event:0"
+msgid "Events"
+msgstr "Termine"
+
+msgctxt "view:calendar.event:0"
+msgid "General"
+msgstr "Allgemein"
+
+msgctxt "view:calendar.event:0"
+msgid "Occurences"
+msgstr "Ereignisse"
+
+msgctxt "view:calendar.event:0"
+msgid "Recurrences"
+msgstr "Wiederholungen"
+
+msgctxt "view:calendar.location:0"
+msgid "Location"
+msgstr "Ort"
+
+msgctxt "view:calendar.location:0"
+msgid "Locations"
+msgstr "Orte"
diff --git a/locale/es_CO.po b/locale/es_CO.po
new file mode 100644
index 0000000..da25b87
--- /dev/null
+++ b/locale/es_CO.po
@@ -0,0 +1,769 @@
+# 
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "error:calendar.calendar:0"
+msgid "A user can have only one calendar!"
+msgstr "¡Un usuario puede tener a lo sumo un calendario!"
+
+msgctxt "error:calendar.calendar:0"
+msgid "The name of calendar must be unique!"
+msgstr "¡El nombre del calendario es único!"
+
+msgctxt "error:calendar.category:0"
+msgid "The name of calendar category must be unique!"
+msgstr "¡El nombre de la categoría de calendario debe ser único!"
+
+msgctxt "error:calendar.event:0"
+msgid "Recurrence can not be recurrent!"
+msgstr "¡La repetición no puede repetirse!"
+
+msgctxt "error:calendar.event:0"
+msgid "UUID and recurrence must be unique in a calendar!"
+msgstr "¡El UUID y la recurrencia deben ser únicos por calendario! "
+
+msgctxt "error:calendar.location:0"
+msgid "The name of calendar location must be unique!"
+msgstr "¡El nombre del lugar del calendario debe ser único!"
+
+msgctxt "error:calendar.rrule:0"
+msgid "Invalid \"By Day\""
+msgstr ""
+
+msgctxt "error:calendar.rrule:0"
+msgid "Invalid \"By Hour\""
+msgstr ""
+
+msgctxt "error:calendar.rrule:0"
+msgid "Invalid \"By Minute\""
+msgstr ""
+
+msgctxt "error:calendar.rrule:0"
+msgid "Invalid \"By Month Day\""
+msgstr ""
+
+msgctxt "error:calendar.rrule:0"
+msgid "Invalid \"By Month\""
+msgstr ""
+
+msgctxt "error:calendar.rrule:0"
+msgid "Invalid \"By Position\""
+msgstr ""
+
+msgctxt "error:calendar.rrule:0"
+msgid "Invalid \"By Second\""
+msgstr ""
+
+msgctxt "error:calendar.rrule:0"
+msgid "Invalid \"By Week Number\""
+msgstr ""
+
+msgctxt "error:calendar.rrule:0"
+msgid "Invalid \"By Year Day\""
+msgstr ""
+
+msgctxt "error:calendar.rrule:0"
+msgid "Only one of \"until\" and \"count\" can be set!"
+msgstr ""
+
+msgctxt "field:calendar.alarm,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:calendar.alarm,valarm:0"
+msgid "valarm"
+msgstr ""
+
+msgctxt "field:calendar.attendee,attendee:0"
+msgid "attendee"
+msgstr ""
+
+msgctxt "field:calendar.attendee,email:0"
+msgid "Email"
+msgstr "Correo Electrónico"
+
+msgctxt "field:calendar.attendee,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:calendar.attendee,status:0"
+msgid "Participation Status"
+msgstr ""
+
+msgctxt "field:calendar.calendar,description:0"
+msgid "Description"
+msgstr "Descripción"
+
+msgctxt "field:calendar.calendar,name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:calendar.calendar,owner:0"
+msgid "Owner"
+msgstr "Propietario"
+
+msgctxt "field:calendar.calendar,read_users:0"
+msgid "Read Users"
+msgstr "Usuarios que pueden Leer"
+
+msgctxt "field:calendar.calendar,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:calendar.calendar,write_users:0"
+msgid "Write Users"
+msgstr "Escribir Usuarios"
+
+msgctxt "field:calendar.calendar-read-res.user,calendar:0"
+msgid "Calendar"
+msgstr "Calendario"
+
+msgctxt "field:calendar.calendar-read-res.user,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:calendar.calendar-read-res.user,user:0"
+msgid "User"
+msgstr "Usuario"
+
+msgctxt "field:calendar.calendar-write-res.user,calendar:0"
+msgid "Calendar"
+msgstr "Calendario"
+
+msgctxt "field:calendar.calendar-write-res.user,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:calendar.calendar-write-res.user,user:0"
+msgid "User"
+msgstr "Usuario"
+
+msgctxt "field:calendar.category,name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:calendar.category,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:calendar.date,date:0"
+msgid "Is Date"
+msgstr "Es Fecha"
+
+#, fuzzy
+msgctxt "field:calendar.date,datetime:0"
+msgid "Date"
+msgstr "Fecha"
+
+#, fuzzy
+msgctxt "field:calendar.date,rec_name:0"
+msgid "Name"
+msgstr "Nombre de Contacto"
+
+msgctxt "field:calendar.event,alarms:0"
+msgid "Alarms"
+msgstr "Alarmas"
+
+msgctxt "field:calendar.event,all_day:0"
+msgid "All Day"
+msgstr "Todo el Día"
+
+msgctxt "field:calendar.event,attendees:0"
+msgid "Attendees"
+msgstr "Asistentes"
+
+msgctxt "field:calendar.event,calendar:0"
+msgid "Calendar"
+msgstr "Calendario"
+
+msgctxt "field:calendar.event,calendar_owner:0"
+msgid "Owner"
+msgstr "Propietario"
+
+msgctxt "field:calendar.event,calendar_read_users:0"
+msgid "Read Users"
+msgstr "Usuarios que pueden Leer"
+
+msgctxt "field:calendar.event,calendar_write_users:0"
+msgid "Write Users"
+msgstr "Escribir Usuarios"
+
+msgctxt "field:calendar.event,categories:0"
+msgid "Categories"
+msgstr "Categorías"
+
+msgctxt "field:calendar.event,classification:0"
+msgid "Classification"
+msgstr "Clasificación"
+
+msgctxt "field:calendar.event,description:0"
+msgid "Description"
+msgstr "Descripción"
+
+msgctxt "field:calendar.event,dtend:0"
+msgid "End Date"
+msgstr "Fecha Fin"
+
+msgctxt "field:calendar.event,dtstart:0"
+msgid "Start Date"
+msgstr "Fecha Inicial"
+
+msgctxt "field:calendar.event,exdates:0"
+msgid "Exception Dates"
+msgstr "Fechas de Excepción"
+
+msgctxt "field:calendar.event,exrules:0"
+msgid "Exception Rules"
+msgstr "Reglas de Excepción"
+
+msgctxt "field:calendar.event,location:0"
+msgid "Location"
+msgstr "Lugar"
+
+#, fuzzy
+msgctxt "field:calendar.event,occurences:0"
+msgid "Occurences"
+msgstr "Ocurrencias"
+
+msgctxt "field:calendar.event,organizer:0"
+msgid "Organizer"
+msgstr "Organizador"
+
+msgctxt "field:calendar.event,parent:0"
+msgid "Parent"
+msgstr "Padre"
+
+msgctxt "field:calendar.event,rdates:0"
+msgid "Recurrence Dates"
+msgstr "Fechas de Repetición"
+
+msgctxt "field:calendar.event,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:calendar.event,recurrence:0"
+msgid "Recurrence"
+msgstr "Repetición"
+
+msgctxt "field:calendar.event,rrules:0"
+msgid "Recurrence Rules"
+msgstr "Reglas de Repetición"
+
+msgctxt "field:calendar.event,sequence:0"
+msgid "Sequence"
+msgstr "Secuencia"
+
+msgctxt "field:calendar.event,status:0"
+msgid "Status"
+msgstr "Estado"
+
+msgctxt "field:calendar.event,summary:0"
+msgid "Summary"
+msgstr "Resumen"
+
+msgctxt "field:calendar.event,timezone:0"
+msgid "Timezone"
+msgstr "Zona horaria"
+
+msgctxt "field:calendar.event,transp:0"
+msgid "Time Transparency"
+msgstr "Transparencia de Tiempo"
+
+msgctxt "field:calendar.event,uuid:0"
+msgid "UUID"
+msgstr "UUID"
+
+msgctxt "field:calendar.event,vevent:0"
+msgid "vevent"
+msgstr "vevento"
+
+msgctxt "field:calendar.event-calendar.category,category:0"
+msgid "Category"
+msgstr "Categoría"
+
+msgctxt "field:calendar.event-calendar.category,event:0"
+msgid "Event"
+msgstr "Evento"
+
+msgctxt "field:calendar.event-calendar.category,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:calendar.event.alarm,calendar_alarm:0"
+msgid "Calendar Alarm"
+msgstr ""
+
+msgctxt "field:calendar.event.alarm,event:0"
+msgid "Event"
+msgstr "Evento"
+
+msgctxt "field:calendar.event.alarm,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:calendar.event.attendee,calendar_attendee:0"
+msgid "Calendar Attendee"
+msgstr ""
+
+msgctxt "field:calendar.event.attendee,event:0"
+msgid "Event"
+msgstr "Evento"
+
+msgctxt "field:calendar.event.attendee,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:calendar.event.exdate,calendar_date:0"
+msgid "Calendar Date"
+msgstr "Fecha Calendario"
+
+msgctxt "field:calendar.event.exdate,event:0"
+msgid "Event"
+msgstr "Evento"
+
+msgctxt "field:calendar.event.exdate,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:calendar.event.exrule,calendar_rrule:0"
+msgid "Calendar RRule"
+msgstr ""
+
+msgctxt "field:calendar.event.exrule,event:0"
+msgid "Event"
+msgstr "Evento"
+
+msgctxt "field:calendar.event.exrule,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:calendar.event.rdate,calendar_date:0"
+msgid "Calendar Date"
+msgstr "Fecha Calendario"
+
+msgctxt "field:calendar.event.rdate,event:0"
+msgid "Event"
+msgstr "Evento"
+
+msgctxt "field:calendar.event.rdate,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:calendar.event.rrule,calendar_rrule:0"
+msgid "Calendar RRule"
+msgstr ""
+
+msgctxt "field:calendar.event.rrule,event:0"
+msgid "Event"
+msgstr "Evento"
+
+msgctxt "field:calendar.event.rrule,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:calendar.location,name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:calendar.location,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:calendar.rrule,byday:0"
+msgid "By Day"
+msgstr ""
+
+msgctxt "field:calendar.rrule,byhour:0"
+msgid "By Hour"
+msgstr ""
+
+msgctxt "field:calendar.rrule,byminute:0"
+msgid "By Minute"
+msgstr ""
+
+msgctxt "field:calendar.rrule,bymonth:0"
+msgid "By Month"
+msgstr ""
+
+msgctxt "field:calendar.rrule,bymonthday:0"
+msgid "By Month Day"
+msgstr ""
+
+msgctxt "field:calendar.rrule,bysecond:0"
+msgid "By Second"
+msgstr ""
+
+msgctxt "field:calendar.rrule,bysetpos:0"
+msgid "By Position"
+msgstr ""
+
+msgctxt "field:calendar.rrule,byweekno:0"
+msgid "By Week Number"
+msgstr ""
+
+msgctxt "field:calendar.rrule,byyearday:0"
+msgid "By Year Day"
+msgstr ""
+
+msgctxt "field:calendar.rrule,count:0"
+msgid "Count"
+msgstr ""
+
+msgctxt "field:calendar.rrule,freq:0"
+msgid "Frequency"
+msgstr ""
+
+msgctxt "field:calendar.rrule,interval:0"
+msgid "Interval"
+msgstr ""
+
+msgctxt "field:calendar.rrule,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:calendar.rrule,until:0"
+msgid "Until Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.rrule,until_date:0"
+msgid "Is Date"
+msgstr "Es Fecha"
+
+msgctxt "field:calendar.rrule,wkst:0"
+msgid "Week Day"
+msgstr "Día de la Semana"
+
+msgctxt "field:res.user,calendars:0"
+msgid "Calendars"
+msgstr "Calendarios"
+
+msgctxt "help:calendar.calendar,owner:0"
+msgid "The user must have an email"
+msgstr ""
+
+msgctxt "help:calendar.date,date:0"
+msgid "Ignore time of field \"Date\", but handle as date only."
+msgstr "Ignore tiempo del campo \"Fecha\", pero manejelo como fecha solamente."
+
+msgctxt "help:calendar.event,uuid:0"
+msgid "Universally Unique Identifier"
+msgstr "Idenitificador Universal Único"
+
+msgctxt "help:calendar.rrule,until_date:0"
+msgid "Ignore time of field \"Until Date\", but handle as date only."
+msgstr ""
+
+msgctxt "model:calendar.alarm,name:0"
+msgid "Alarm"
+msgstr "Alarma"
+
+msgctxt "model:calendar.attendee,name:0"
+msgid "Attendee"
+msgstr "Asistente"
+
+msgctxt "model:calendar.calendar,name:0"
+msgid "Calendar"
+msgstr "Calendario"
+
+msgctxt "model:calendar.calendar-read-res.user,name:0"
+msgid "Calendar - read - User"
+msgstr "Calendario - leer - Usuario"
+
+msgctxt "model:calendar.calendar-write-res.user,name:0"
+msgid "Calendar - write - User"
+msgstr "Calendario - escribir - Usuario"
+
+msgctxt "model:calendar.category,name:0"
+msgid "Category"
+msgstr "Categoría"
+
+msgctxt "model:calendar.date,name:0"
+msgid "Calendar Date"
+msgstr "Fecha Calendario"
+
+msgctxt "model:calendar.event,name:0"
+msgid "Event"
+msgstr "Evento"
+
+msgctxt "model:calendar.event-calendar.category,name:0"
+msgid "Event - Category"
+msgstr "Evento - Categoría"
+
+msgctxt "model:calendar.event.alarm,name:0"
+msgid "Alarm"
+msgstr "Alarma"
+
+msgctxt "model:calendar.event.attendee,name:0"
+msgid "Attendee"
+msgstr "Asistente"
+
+msgctxt "model:calendar.event.exdate,name:0"
+msgid "Exception Date"
+msgstr "Fecha de Excepción"
+
+msgctxt "model:calendar.event.exrule,name:0"
+msgid "Exception Rule"
+msgstr "Regla de Excepción"
+
+msgctxt "model:calendar.event.rdate,name:0"
+msgid "Recurrence Date"
+msgstr "Fecha de Repetición"
+
+msgctxt "model:calendar.event.rrule,name:0"
+msgid "Recurrence Rule"
+msgstr "Regla de Repetición"
+
+msgctxt "model:calendar.location,name:0"
+msgid "Location"
+msgstr "Lugar"
+
+msgctxt "model:calendar.rrule,name:0"
+msgid "Recurrence Rule"
+msgstr "Regla de Repetición"
+
+msgctxt "model:ir.action,name:act_calendar_form"
+msgid "Calendars"
+msgstr "Calendarios"
+
+msgctxt "model:ir.action,name:act_event_form"
+msgid "Events"
+msgstr "Eventos"
+
+msgctxt "model:ir.action,name:act_event_form3"
+msgid "Events"
+msgstr "Eventos"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_calendar"
+msgid "Calendar"
+msgstr "Calendario"
+
+msgctxt "model:ir.ui.menu,name:menu_calendar_form"
+msgid "Calendars"
+msgstr "Calendarios"
+
+msgctxt "model:ir.ui.menu,name:menu_event_form"
+msgid "Events"
+msgstr "Eventos"
+
+msgctxt "model:res.group,name:group_calendar_admin"
+msgid "Calendar Administration"
+msgstr "Administrar Calendario"
+
+msgctxt "selection:calendar.attendee,status:0"
+msgid ""
+msgstr ""
+
+msgctxt "selection:calendar.attendee,status:0"
+msgid "Accepted"
+msgstr ""
+
+msgctxt "selection:calendar.attendee,status:0"
+msgid "Declined"
+msgstr ""
+
+msgctxt "selection:calendar.attendee,status:0"
+msgid "Delegated"
+msgstr ""
+
+msgctxt "selection:calendar.attendee,status:0"
+msgid "Needs Action"
+msgstr ""
+
+msgctxt "selection:calendar.attendee,status:0"
+msgid "Tentative"
+msgstr "Tentativa"
+
+msgctxt "selection:calendar.event,classification:0"
+msgid "Confidential"
+msgstr "Confidencial"
+
+msgctxt "selection:calendar.event,classification:0"
+msgid "Private"
+msgstr "Privado"
+
+msgctxt "selection:calendar.event,classification:0"
+msgid "Public"
+msgstr "Público"
+
+msgctxt "selection:calendar.event,status:0"
+msgid ""
+msgstr ""
+
+msgctxt "selection:calendar.event,status:0"
+msgid "Cancelled"
+msgstr "Cancelado"
+
+msgctxt "selection:calendar.event,status:0"
+msgid "Confirmed"
+msgstr "Confirmado"
+
+msgctxt "selection:calendar.event,status:0"
+msgid "Tentative"
+msgstr "Tentativa"
+
+msgctxt "selection:calendar.event,transp:0"
+msgid "Opaque"
+msgstr "Opaco"
+
+msgctxt "selection:calendar.event,transp:0"
+msgid "Transparent"
+msgstr "Transparente"
+
+msgctxt "selection:calendar.rrule,freq:0"
+msgid "Daily"
+msgstr ""
+
+msgctxt "selection:calendar.rrule,freq:0"
+msgid "Hourly"
+msgstr ""
+
+msgctxt "selection:calendar.rrule,freq:0"
+msgid "Minutely"
+msgstr ""
+
+msgctxt "selection:calendar.rrule,freq:0"
+msgid "Monthly"
+msgstr ""
+
+msgctxt "selection:calendar.rrule,freq:0"
+msgid "Secondly"
+msgstr ""
+
+msgctxt "selection:calendar.rrule,freq:0"
+msgid "Weekly"
+msgstr ""
+
+msgctxt "selection:calendar.rrule,freq:0"
+msgid "Yearly"
+msgstr ""
+
+msgctxt "selection:calendar.rrule,wkst:0"
+msgid "Friday"
+msgstr "Viernes"
+
+msgctxt "selection:calendar.rrule,wkst:0"
+msgid "Monday"
+msgstr "Lunes"
+
+msgctxt "selection:calendar.rrule,wkst:0"
+msgid "Saturday"
+msgstr "Sábado"
+
+msgctxt "selection:calendar.rrule,wkst:0"
+msgid "Sunday"
+msgstr "Domingo"
+
+msgctxt "selection:calendar.rrule,wkst:0"
+msgid "Thursday"
+msgstr "Jueves"
+
+msgctxt "selection:calendar.rrule,wkst:0"
+msgid "Tuesday"
+msgstr "Martes"
+
+msgctxt "selection:calendar.rrule,wkst:0"
+msgid "Wednesday"
+msgstr "Miércoles"
+
+msgctxt "view:calendar.calendar:0"
+msgid "Calendar"
+msgstr "Calendario"
+
+msgctxt "view:calendar.calendar:0"
+msgid "Calendars"
+msgstr "Calendarios"
+
+msgctxt "view:calendar.calendar:0"
+msgid "General"
+msgstr "General"
+
+msgctxt "view:calendar.calendar:0"
+msgid "Security"
+msgstr "Seguridad"
+
+msgctxt "view:calendar.category:0"
+msgid "Categories"
+msgstr "Categorías"
+
+msgctxt "view:calendar.category:0"
+msgid "Category"
+msgstr "Categoría"
+
+msgctxt "view:calendar.event.attendee:0"
+msgid "Attendee"
+msgstr "Asistente"
+
+msgctxt "view:calendar.event.attendee:0"
+msgid "Attendees"
+msgstr "Asistentes"
+
+msgctxt "view:calendar.event.exdate:0"
+msgid "Exception Date"
+msgstr "Fecha de Excepción"
+
+msgctxt "view:calendar.event.exdate:0"
+msgid "Exception Dates"
+msgstr "Fechas de Excepción"
+
+msgctxt "view:calendar.event.exrule:0"
+msgid "Exception Rule"
+msgstr "Regla de Excepción"
+
+msgctxt "view:calendar.event.exrule:0"
+msgid "Exception Rules"
+msgstr "Reglas de Excepción"
+
+msgctxt "view:calendar.event.rdate:0"
+msgid "Recurrence Date"
+msgstr "Fecha de Repetición"
+
+msgctxt "view:calendar.event.rdate:0"
+msgid "Recurrence Dates"
+msgstr "Fechas de Repetición"
+
+msgctxt "view:calendar.event.rrule:0"
+msgid "Recurrence Rule"
+msgstr "Regla de Repetición"
+
+msgctxt "view:calendar.event.rrule:0"
+msgid "Recurrence Rules"
+msgstr "Reglas de Repetición"
+
+msgctxt "view:calendar.event:0"
+msgid "Attendees"
+msgstr "Asistentes"
+
+msgctxt "view:calendar.event:0"
+msgid "Categories"
+msgstr "Categorías"
+
+msgctxt "view:calendar.event:0"
+msgid "Event"
+msgstr "Evento"
+
+msgctxt "view:calendar.event:0"
+msgid "Events"
+msgstr "Eventos"
+
+msgctxt "view:calendar.event:0"
+msgid "General"
+msgstr "General"
+
+#, fuzzy
+msgctxt "view:calendar.event:0"
+msgid "Occurences"
+msgstr "Ocurrencias"
+
+msgctxt "view:calendar.event:0"
+msgid "Recurrences"
+msgstr "Repeticiones"
+
+msgctxt "view:calendar.location:0"
+msgid "Location"
+msgstr "Lugar"
+
+msgctxt "view:calendar.location:0"
+msgid "Locations"
+msgstr "Lugares"
diff --git a/locale/es_ES.po b/locale/es_ES.po
new file mode 100644
index 0000000..d905bdc
--- /dev/null
+++ b/locale/es_ES.po
@@ -0,0 +1,764 @@
+# 
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "error:calendar.calendar:0"
+msgid "A user can have only one calendar!"
+msgstr "Un usuario solo puede tener un calendario"
+
+msgctxt "error:calendar.calendar:0"
+msgid "The name of calendar must be unique!"
+msgstr "El nombre del calendario debe ser único"
+
+msgctxt "error:calendar.category:0"
+msgid "The name of calendar category must be unique!"
+msgstr "El nombre de la categoría  del calendario debe ser único"
+
+msgctxt "error:calendar.event:0"
+msgid "Recurrence can not be recurrent!"
+msgstr "Una recurrencia no puede ser recurrente"
+
+msgctxt "error:calendar.event:0"
+msgid "UUID and recurrence must be unique in a calendar!"
+msgstr "UUID y recurrencia deben ser únicos en un calendario"
+
+msgctxt "error:calendar.location:0"
+msgid "The name of calendar location must be unique!"
+msgstr "El nombre de la ubicación del calendario debe ser único"
+
+msgctxt "error:calendar.rrule:0"
+msgid "Invalid \"By Day\""
+msgstr "Inválido «por día»"
+
+msgctxt "error:calendar.rrule:0"
+msgid "Invalid \"By Hour\""
+msgstr "Inválido «por hora»"
+
+msgctxt "error:calendar.rrule:0"
+msgid "Invalid \"By Minute\""
+msgstr "Inválido «por minuto»"
+
+msgctxt "error:calendar.rrule:0"
+msgid "Invalid \"By Month Day\""
+msgstr "Inválido «por día del mes»"
+
+msgctxt "error:calendar.rrule:0"
+msgid "Invalid \"By Month\""
+msgstr "Inválido «por mes»"
+
+msgctxt "error:calendar.rrule:0"
+msgid "Invalid \"By Position\""
+msgstr "Inválido «por posición»"
+
+msgctxt "error:calendar.rrule:0"
+msgid "Invalid \"By Second\""
+msgstr "Inválido «por segundos»"
+
+msgctxt "error:calendar.rrule:0"
+msgid "Invalid \"By Week Number\""
+msgstr "Inválido «por número de semana»"
+
+msgctxt "error:calendar.rrule:0"
+msgid "Invalid \"By Year Day\""
+msgstr "Inválido «por día del año»"
+
+msgctxt "error:calendar.rrule:0"
+msgid "Only one of \"until\" and \"count\" can be set!"
+msgstr "Solo se puede usar o «hasta» o «Número de veces»"
+
+msgctxt "field:calendar.alarm,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:calendar.alarm,valarm:0"
+msgid "valarm"
+msgstr "valarm"
+
+msgctxt "field:calendar.attendee,attendee:0"
+msgid "attendee"
+msgstr "asistentes"
+
+msgctxt "field:calendar.attendee,email:0"
+msgid "Email"
+msgstr "Correo electrónico"
+
+msgctxt "field:calendar.attendee,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:calendar.attendee,status:0"
+msgid "Participation Status"
+msgstr "Estado de participación"
+
+msgctxt "field:calendar.calendar,description:0"
+msgid "Description"
+msgstr "Descripción"
+
+msgctxt "field:calendar.calendar,name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:calendar.calendar,owner:0"
+msgid "Owner"
+msgstr "Dueño"
+
+msgctxt "field:calendar.calendar,read_users:0"
+msgid "Read Users"
+msgstr "Usuarios con lectura"
+
+msgctxt "field:calendar.calendar,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:calendar.calendar,write_users:0"
+msgid "Write Users"
+msgstr "Usuarios con escritura"
+
+msgctxt "field:calendar.calendar-read-res.user,calendar:0"
+msgid "Calendar"
+msgstr "Calendario"
+
+msgctxt "field:calendar.calendar-read-res.user,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:calendar.calendar-read-res.user,user:0"
+msgid "User"
+msgstr "Usuario"
+
+msgctxt "field:calendar.calendar-write-res.user,calendar:0"
+msgid "Calendar"
+msgstr "Calendario"
+
+msgctxt "field:calendar.calendar-write-res.user,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:calendar.calendar-write-res.user,user:0"
+msgid "User"
+msgstr "Usuario"
+
+msgctxt "field:calendar.category,name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:calendar.category,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+#, fuzzy
+msgctxt "field:calendar.date,date:0"
+msgid "Is Date"
+msgstr "Es fecha"
+
+#, fuzzy
+msgctxt "field:calendar.date,datetime:0"
+msgid "Date"
+msgstr "Fecha"
+
+#, fuzzy
+msgctxt "field:calendar.date,rec_name:0"
+msgid "Name"
+msgstr "Nombre del campo"
+
+msgctxt "field:calendar.event,alarms:0"
+msgid "Alarms"
+msgstr "Alarmas"
+
+msgctxt "field:calendar.event,all_day:0"
+msgid "All Day"
+msgstr "Todo el día"
+
+msgctxt "field:calendar.event,attendees:0"
+msgid "Attendees"
+msgstr "Asistentes"
+
+msgctxt "field:calendar.event,calendar:0"
+msgid "Calendar"
+msgstr "Calendario"
+
+msgctxt "field:calendar.event,calendar_owner:0"
+msgid "Owner"
+msgstr "Dueño"
+
+msgctxt "field:calendar.event,calendar_read_users:0"
+msgid "Read Users"
+msgstr "Usuarios con lectura"
+
+msgctxt "field:calendar.event,calendar_write_users:0"
+msgid "Write Users"
+msgstr "Usuarios con escritura"
+
+msgctxt "field:calendar.event,categories:0"
+msgid "Categories"
+msgstr "Categorías"
+
+msgctxt "field:calendar.event,classification:0"
+msgid "Classification"
+msgstr "Clasificación"
+
+msgctxt "field:calendar.event,description:0"
+msgid "Description"
+msgstr "Descripción"
+
+msgctxt "field:calendar.event,dtend:0"
+msgid "End Date"
+msgstr "Fecha fin"
+
+msgctxt "field:calendar.event,dtstart:0"
+msgid "Start Date"
+msgstr "Fecha inicio"
+
+msgctxt "field:calendar.event,exdates:0"
+msgid "Exception Dates"
+msgstr "Fechas excluidas"
+
+msgctxt "field:calendar.event,exrules:0"
+msgid "Exception Rules"
+msgstr "Reglas de excepción"
+
+msgctxt "field:calendar.event,location:0"
+msgid "Location"
+msgstr "Ubicación"
+
+msgctxt "field:calendar.event,occurences:0"
+msgid "Occurences"
+msgstr "Ocurrencias"
+
+msgctxt "field:calendar.event,organizer:0"
+msgid "Organizer"
+msgstr "Organizador"
+
+msgctxt "field:calendar.event,parent:0"
+msgid "Parent"
+msgstr "Padre"
+
+msgctxt "field:calendar.event,rdates:0"
+msgid "Recurrence Dates"
+msgstr "Fechas de recurrencia"
+
+msgctxt "field:calendar.event,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:calendar.event,recurrence:0"
+msgid "Recurrence"
+msgstr "Recurrencia"
+
+msgctxt "field:calendar.event,rrules:0"
+msgid "Recurrence Rules"
+msgstr "Reglas de recurrencia"
+
+msgctxt "field:calendar.event,sequence:0"
+msgid "Sequence"
+msgstr "Secuencia"
+
+msgctxt "field:calendar.event,status:0"
+msgid "Status"
+msgstr "Estado"
+
+msgctxt "field:calendar.event,summary:0"
+msgid "Summary"
+msgstr "Resumen"
+
+msgctxt "field:calendar.event,timezone:0"
+msgid "Timezone"
+msgstr "Zona horaria"
+
+msgctxt "field:calendar.event,transp:0"
+msgid "Time Transparency"
+msgstr "Tiempo de transparencia"
+
+msgctxt "field:calendar.event,uuid:0"
+msgid "UUID"
+msgstr "UUID"
+
+msgctxt "field:calendar.event,vevent:0"
+msgid "vevent"
+msgstr "vevent"
+
+msgctxt "field:calendar.event-calendar.category,category:0"
+msgid "Category"
+msgstr "Categoría"
+
+msgctxt "field:calendar.event-calendar.category,event:0"
+msgid "Event"
+msgstr "Evento"
+
+msgctxt "field:calendar.event-calendar.category,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:calendar.event.alarm,calendar_alarm:0"
+msgid "Calendar Alarm"
+msgstr "Alarma del calendario"
+
+msgctxt "field:calendar.event.alarm,event:0"
+msgid "Event"
+msgstr "Evento"
+
+msgctxt "field:calendar.event.alarm,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:calendar.event.attendee,calendar_attendee:0"
+msgid "Calendar Attendee"
+msgstr "Calendario de asistentes"
+
+msgctxt "field:calendar.event.attendee,event:0"
+msgid "Event"
+msgstr "Evento"
+
+msgctxt "field:calendar.event.attendee,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:calendar.event.exdate,calendar_date:0"
+msgid "Calendar Date"
+msgstr ""
+
+msgctxt "field:calendar.event.exdate,event:0"
+msgid "Event"
+msgstr "Evento"
+
+msgctxt "field:calendar.event.exdate,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:calendar.event.exrule,calendar_rrule:0"
+msgid "Calendar RRule"
+msgstr "Regla de recurrencia"
+
+msgctxt "field:calendar.event.exrule,event:0"
+msgid "Event"
+msgstr "Evento"
+
+msgctxt "field:calendar.event.exrule,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:calendar.event.rdate,calendar_date:0"
+msgid "Calendar Date"
+msgstr ""
+
+msgctxt "field:calendar.event.rdate,event:0"
+msgid "Event"
+msgstr "Evento"
+
+msgctxt "field:calendar.event.rdate,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:calendar.event.rrule,calendar_rrule:0"
+msgid "Calendar RRule"
+msgstr "Regla de recurrencia"
+
+msgctxt "field:calendar.event.rrule,event:0"
+msgid "Event"
+msgstr "Evento"
+
+msgctxt "field:calendar.event.rrule,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:calendar.location,name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:calendar.location,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:calendar.rrule,byday:0"
+msgid "By Day"
+msgstr "Por día"
+
+msgctxt "field:calendar.rrule,byhour:0"
+msgid "By Hour"
+msgstr "Por hora"
+
+msgctxt "field:calendar.rrule,byminute:0"
+msgid "By Minute"
+msgstr "Por minuto"
+
+msgctxt "field:calendar.rrule,bymonth:0"
+msgid "By Month"
+msgstr "Por mes"
+
+msgctxt "field:calendar.rrule,bymonthday:0"
+msgid "By Month Day"
+msgstr "Por día del mes"
+
+msgctxt "field:calendar.rrule,bysecond:0"
+msgid "By Second"
+msgstr "Por segundo"
+
+msgctxt "field:calendar.rrule,bysetpos:0"
+msgid "By Position"
+msgstr "Por posición"
+
+msgctxt "field:calendar.rrule,byweekno:0"
+msgid "By Week Number"
+msgstr "Por día de la semana"
+
+msgctxt "field:calendar.rrule,byyearday:0"
+msgid "By Year Day"
+msgstr "Por día del año"
+
+msgctxt "field:calendar.rrule,count:0"
+msgid "Count"
+msgstr "Número de veces"
+
+msgctxt "field:calendar.rrule,freq:0"
+msgid "Frequency"
+msgstr "Frecuencia"
+
+msgctxt "field:calendar.rrule,interval:0"
+msgid "Interval"
+msgstr "Intervalo"
+
+msgctxt "field:calendar.rrule,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:calendar.rrule,until:0"
+msgid "Until Date"
+msgstr "Hasta la fecha"
+
+msgctxt "field:calendar.rrule,until_date:0"
+msgid "Is Date"
+msgstr "Es fecha"
+
+msgctxt "field:calendar.rrule,wkst:0"
+msgid "Week Day"
+msgstr "Día de la semana"
+
+msgctxt "field:res.user,calendars:0"
+msgid "Calendars"
+msgstr "Calendarios"
+
+msgctxt "help:calendar.calendar,owner:0"
+msgid "The user must have an email"
+msgstr "El usuario debe tener un correo electrónico"
+
+msgctxt "help:calendar.date,date:0"
+msgid "Ignore time of field \"Date\", but handle as date only."
+msgstr ""
+
+msgctxt "help:calendar.event,uuid:0"
+msgid "Universally Unique Identifier"
+msgstr "Identificador universal único"
+
+msgctxt "help:calendar.rrule,until_date:0"
+msgid "Ignore time of field \"Until Date\", but handle as date only."
+msgstr "Ignora la hora del campo «Hasta la fecha», y trata solo la fecha"
+
+msgctxt "model:calendar.alarm,name:0"
+msgid "Alarm"
+msgstr "Alarma"
+
+msgctxt "model:calendar.attendee,name:0"
+msgid "Attendee"
+msgstr "Asistentes"
+
+msgctxt "model:calendar.calendar,name:0"
+msgid "Calendar"
+msgstr "Calendario"
+
+msgctxt "model:calendar.calendar-read-res.user,name:0"
+msgid "Calendar - read - User"
+msgstr "Calendario - leer - usuario"
+
+msgctxt "model:calendar.calendar-write-res.user,name:0"
+msgid "Calendar - write - User"
+msgstr "Calendario - escribir - usuario"
+
+msgctxt "model:calendar.category,name:0"
+msgid "Category"
+msgstr "Categoría"
+
+msgctxt "model:calendar.date,name:0"
+msgid "Calendar Date"
+msgstr ""
+
+msgctxt "model:calendar.event,name:0"
+msgid "Event"
+msgstr "Evento"
+
+msgctxt "model:calendar.event-calendar.category,name:0"
+msgid "Event - Category"
+msgstr "Evento - Categoría"
+
+msgctxt "model:calendar.event.alarm,name:0"
+msgid "Alarm"
+msgstr "Alarma"
+
+msgctxt "model:calendar.event.attendee,name:0"
+msgid "Attendee"
+msgstr "Asistentes"
+
+msgctxt "model:calendar.event.exdate,name:0"
+msgid "Exception Date"
+msgstr "Fecha excluida"
+
+msgctxt "model:calendar.event.exrule,name:0"
+msgid "Exception Rule"
+msgstr "Regla de excepción"
+
+msgctxt "model:calendar.event.rdate,name:0"
+msgid "Recurrence Date"
+msgstr "Fecha de recurrencia"
+
+msgctxt "model:calendar.event.rrule,name:0"
+msgid "Recurrence Rule"
+msgstr "Regla de recurrencia"
+
+msgctxt "model:calendar.location,name:0"
+msgid "Location"
+msgstr "Ubicación"
+
+msgctxt "model:calendar.rrule,name:0"
+msgid "Recurrence Rule"
+msgstr "Regla de recurrencia"
+
+msgctxt "model:ir.action,name:act_calendar_form"
+msgid "Calendars"
+msgstr "Calendarios"
+
+msgctxt "model:ir.action,name:act_event_form"
+msgid "Events"
+msgstr "Eventos"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_event_form3"
+msgid "Events"
+msgstr "Eventos"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_calendar"
+msgid "Calendar"
+msgstr "Gestión de calendario"
+
+msgctxt "model:ir.ui.menu,name:menu_calendar_form"
+msgid "Calendars"
+msgstr "Calendarios"
+
+msgctxt "model:ir.ui.menu,name:menu_event_form"
+msgid "Events"
+msgstr "Eventos"
+
+msgctxt "model:res.group,name:group_calendar_admin"
+msgid "Calendar Administration"
+msgstr "Administración de calendario"
+
+msgctxt "selection:calendar.attendee,status:0"
+msgid ""
+msgstr ""
+
+msgctxt "selection:calendar.attendee,status:0"
+msgid "Accepted"
+msgstr "Aceptada"
+
+msgctxt "selection:calendar.attendee,status:0"
+msgid "Declined"
+msgstr "Rehusado"
+
+msgctxt "selection:calendar.attendee,status:0"
+msgid "Delegated"
+msgstr "Delegada"
+
+msgctxt "selection:calendar.attendee,status:0"
+msgid "Needs Action"
+msgstr "Necesita una acción"
+
+msgctxt "selection:calendar.attendee,status:0"
+msgid "Tentative"
+msgstr "Tentativa"
+
+msgctxt "selection:calendar.event,classification:0"
+msgid "Confidential"
+msgstr "Confidencial"
+
+msgctxt "selection:calendar.event,classification:0"
+msgid "Private"
+msgstr "Privado"
+
+msgctxt "selection:calendar.event,classification:0"
+msgid "Public"
+msgstr "Público"
+
+msgctxt "selection:calendar.event,status:0"
+msgid ""
+msgstr ""
+
+msgctxt "selection:calendar.event,status:0"
+msgid "Cancelled"
+msgstr "Cancelado"
+
+msgctxt "selection:calendar.event,status:0"
+msgid "Confirmed"
+msgstr "Confirmada"
+
+msgctxt "selection:calendar.event,status:0"
+msgid "Tentative"
+msgstr "Tentativo"
+
+msgctxt "selection:calendar.event,transp:0"
+msgid "Opaque"
+msgstr "Opaco"
+
+msgctxt "selection:calendar.event,transp:0"
+msgid "Transparent"
+msgstr "Transparente"
+
+msgctxt "selection:calendar.rrule,freq:0"
+msgid "Daily"
+msgstr "Diariamente"
+
+msgctxt "selection:calendar.rrule,freq:0"
+msgid "Hourly"
+msgstr "Cada hora"
+
+msgctxt "selection:calendar.rrule,freq:0"
+msgid "Minutely"
+msgstr "Cada minuto"
+
+msgctxt "selection:calendar.rrule,freq:0"
+msgid "Monthly"
+msgstr "Mensualmente"
+
+msgctxt "selection:calendar.rrule,freq:0"
+msgid "Secondly"
+msgstr "Cada segundo"
+
+msgctxt "selection:calendar.rrule,freq:0"
+msgid "Weekly"
+msgstr "Semanalmente"
+
+msgctxt "selection:calendar.rrule,freq:0"
+msgid "Yearly"
+msgstr "Anualmente"
+
+msgctxt "selection:calendar.rrule,wkst:0"
+msgid "Friday"
+msgstr "Viernes"
+
+msgctxt "selection:calendar.rrule,wkst:0"
+msgid "Monday"
+msgstr "Lunes"
+
+msgctxt "selection:calendar.rrule,wkst:0"
+msgid "Saturday"
+msgstr "Sábado"
+
+msgctxt "selection:calendar.rrule,wkst:0"
+msgid "Sunday"
+msgstr "Domingo"
+
+msgctxt "selection:calendar.rrule,wkst:0"
+msgid "Thursday"
+msgstr "Jueves"
+
+msgctxt "selection:calendar.rrule,wkst:0"
+msgid "Tuesday"
+msgstr "Martes"
+
+msgctxt "selection:calendar.rrule,wkst:0"
+msgid "Wednesday"
+msgstr "Miércoles"
+
+msgctxt "view:calendar.calendar:0"
+msgid "Calendar"
+msgstr "Calendario"
+
+msgctxt "view:calendar.calendar:0"
+msgid "Calendars"
+msgstr "Calendarios"
+
+msgctxt "view:calendar.calendar:0"
+msgid "General"
+msgstr "General"
+
+msgctxt "view:calendar.calendar:0"
+msgid "Security"
+msgstr "Seguridad"
+
+msgctxt "view:calendar.category:0"
+msgid "Categories"
+msgstr "Categorías"
+
+msgctxt "view:calendar.category:0"
+msgid "Category"
+msgstr "Categoría"
+
+msgctxt "view:calendar.event.attendee:0"
+msgid "Attendee"
+msgstr "Asistentes"
+
+msgctxt "view:calendar.event.attendee:0"
+msgid "Attendees"
+msgstr "Asistentes"
+
+msgctxt "view:calendar.event.exdate:0"
+msgid "Exception Date"
+msgstr "Fecha excluida"
+
+msgctxt "view:calendar.event.exdate:0"
+msgid "Exception Dates"
+msgstr "Fechas excluidas"
+
+msgctxt "view:calendar.event.exrule:0"
+msgid "Exception Rule"
+msgstr "Regla de excepción"
+
+msgctxt "view:calendar.event.exrule:0"
+msgid "Exception Rules"
+msgstr "Reglas de excepciones"
+
+msgctxt "view:calendar.event.rdate:0"
+msgid "Recurrence Date"
+msgstr "Fecha de recurrencia"
+
+msgctxt "view:calendar.event.rdate:0"
+msgid "Recurrence Dates"
+msgstr "Fechas de recurrencia"
+
+msgctxt "view:calendar.event.rrule:0"
+msgid "Recurrence Rule"
+msgstr "Regla de recurrencia"
+
+msgctxt "view:calendar.event.rrule:0"
+msgid "Recurrence Rules"
+msgstr "Reglas de recurrencia"
+
+msgctxt "view:calendar.event:0"
+msgid "Attendees"
+msgstr "Asistentes"
+
+msgctxt "view:calendar.event:0"
+msgid "Categories"
+msgstr "Categorías"
+
+msgctxt "view:calendar.event:0"
+msgid "Event"
+msgstr "Evento"
+
+msgctxt "view:calendar.event:0"
+msgid "Events"
+msgstr "Eventos"
+
+msgctxt "view:calendar.event:0"
+msgid "General"
+msgstr "General"
+
+msgctxt "view:calendar.event:0"
+msgid "Occurences"
+msgstr "Ocurrencias"
+
+msgctxt "view:calendar.location:0"
+msgid "Location"
+msgstr "Ubicación"
+
+msgctxt "view:calendar.location:0"
+msgid "Locations"
+msgstr "Ubicaciones"
diff --git a/locale/fr_FR.po b/locale/fr_FR.po
new file mode 100644
index 0000000..69bc39e
--- /dev/null
+++ b/locale/fr_FR.po
@@ -0,0 +1,759 @@
+# 
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "error:calendar.calendar:0"
+msgid "A user can have only one calendar!"
+msgstr "Un utilisateur ne peut avoir qu'un seul calendrier !"
+
+msgctxt "error:calendar.calendar:0"
+msgid "The name of calendar must be unique!"
+msgstr "Le nom du calendrier doit être unique !"
+
+msgctxt "error:calendar.category:0"
+msgid "The name of calendar category must be unique!"
+msgstr "Le nom de la catégorie de calendrier doit être unique"
+
+msgctxt "error:calendar.event:0"
+msgid "Recurrence can not be recurrent!"
+msgstr "Une récurrence ne peut pas être récurrente !"
+
+msgctxt "error:calendar.event:0"
+msgid "UUID and recurrence must be unique in a calendar!"
+msgstr "UUID et récurrence doivent être uniques sur un calendrier !"
+
+msgctxt "error:calendar.location:0"
+msgid "The name of calendar location must be unique!"
+msgstr "Le nom de l'emplacement doit être unique !"
+
+msgctxt "error:calendar.rrule:0"
+msgid "Invalid \"By Day\""
+msgstr "\"Par jour\" invalide"
+
+msgctxt "error:calendar.rrule:0"
+msgid "Invalid \"By Hour\""
+msgstr "\"Par heure\" invalide"
+
+msgctxt "error:calendar.rrule:0"
+msgid "Invalid \"By Minute\""
+msgstr "\"Par minute\" invalide"
+
+msgctxt "error:calendar.rrule:0"
+msgid "Invalid \"By Month Day\""
+msgstr "\"Par jour du mois\" invalide"
+
+msgctxt "error:calendar.rrule:0"
+msgid "Invalid \"By Month\""
+msgstr "\"Par mois\" invalide"
+
+msgctxt "error:calendar.rrule:0"
+msgid "Invalid \"By Position\""
+msgstr "\"Par position\" invalide"
+
+msgctxt "error:calendar.rrule:0"
+msgid "Invalid \"By Second\""
+msgstr "\"Par seconde\" invalide"
+
+msgctxt "error:calendar.rrule:0"
+msgid "Invalid \"By Week Number\""
+msgstr "\"Par jour de la semaine\" invalide"
+
+msgctxt "error:calendar.rrule:0"
+msgid "Invalid \"By Year Day\""
+msgstr "\"Par jour de l'année\" invalide"
+
+msgctxt "error:calendar.rrule:0"
+msgid "Only one of \"until\" and \"count\" can be set!"
+msgstr "\"Date de fin\" et \"Répétitions\" ne peuvent être remplis en même temps !"
+
+msgctxt "field:calendar.alarm,rec_name:0"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:calendar.alarm,valarm:0"
+msgid "valarm"
+msgstr "valarm"
+
+msgctxt "field:calendar.attendee,attendee:0"
+msgid "attendee"
+msgstr "participant"
+
+msgctxt "field:calendar.attendee,email:0"
+msgid "Email"
+msgstr "E-mail"
+
+msgctxt "field:calendar.attendee,rec_name:0"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:calendar.attendee,status:0"
+msgid "Participation Status"
+msgstr "Statut de participation"
+
+msgctxt "field:calendar.calendar,description:0"
+msgid "Description"
+msgstr "Description"
+
+msgctxt "field:calendar.calendar,name:0"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:calendar.calendar,owner:0"
+msgid "Owner"
+msgstr "Propriétaire"
+
+msgctxt "field:calendar.calendar,read_users:0"
+msgid "Read Users"
+msgstr "Utilisateurs en lecture"
+
+msgctxt "field:calendar.calendar,rec_name:0"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:calendar.calendar,write_users:0"
+msgid "Write Users"
+msgstr "Utilisateurs en écriture"
+
+msgctxt "field:calendar.calendar-read-res.user,calendar:0"
+msgid "Calendar"
+msgstr "Calendrier"
+
+msgctxt "field:calendar.calendar-read-res.user,rec_name:0"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:calendar.calendar-read-res.user,user:0"
+msgid "User"
+msgstr "Utilisateur"
+
+msgctxt "field:calendar.calendar-write-res.user,calendar:0"
+msgid "Calendar"
+msgstr "Calendrier"
+
+msgctxt "field:calendar.calendar-write-res.user,rec_name:0"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:calendar.calendar-write-res.user,user:0"
+msgid "User"
+msgstr "Utilisateur"
+
+msgctxt "field:calendar.category,name:0"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:calendar.category,rec_name:0"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:calendar.date,date:0"
+msgid "Is Date"
+msgstr "Est une date"
+
+msgctxt "field:calendar.date,datetime:0"
+msgid "Date"
+msgstr "Date"
+
+msgctxt "field:calendar.date,rec_name:0"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:calendar.event,alarms:0"
+msgid "Alarms"
+msgstr "Alarmes"
+
+msgctxt "field:calendar.event,all_day:0"
+msgid "All Day"
+msgstr "Toute la journée"
+
+msgctxt "field:calendar.event,attendees:0"
+msgid "Attendees"
+msgstr "Participants"
+
+msgctxt "field:calendar.event,calendar:0"
+msgid "Calendar"
+msgstr "Calendrier"
+
+msgctxt "field:calendar.event,calendar_owner:0"
+msgid "Owner"
+msgstr "Propriétaire"
+
+msgctxt "field:calendar.event,calendar_read_users:0"
+msgid "Read Users"
+msgstr "Utilisateurs en lecture"
+
+msgctxt "field:calendar.event,calendar_write_users:0"
+msgid "Write Users"
+msgstr "Utilisateurs en écriture"
+
+msgctxt "field:calendar.event,categories:0"
+msgid "Categories"
+msgstr "Catégories"
+
+msgctxt "field:calendar.event,classification:0"
+msgid "Classification"
+msgstr "Classification"
+
+msgctxt "field:calendar.event,description:0"
+msgid "Description"
+msgstr "Description"
+
+msgctxt "field:calendar.event,dtend:0"
+msgid "End Date"
+msgstr "Date de fin"
+
+msgctxt "field:calendar.event,dtstart:0"
+msgid "Start Date"
+msgstr "Date de début"
+
+msgctxt "field:calendar.event,exdates:0"
+msgid "Exception Dates"
+msgstr "Dates d'exception"
+
+msgctxt "field:calendar.event,exrules:0"
+msgid "Exception Rules"
+msgstr "Règles d'exception"
+
+msgctxt "field:calendar.event,location:0"
+msgid "Location"
+msgstr "Emplacement"
+
+msgctxt "field:calendar.event,occurences:0"
+msgid "Occurences"
+msgstr "Occurrences"
+
+msgctxt "field:calendar.event,organizer:0"
+msgid "Organizer"
+msgstr "Organisateur"
+
+msgctxt "field:calendar.event,parent:0"
+msgid "Parent"
+msgstr "Parent"
+
+msgctxt "field:calendar.event,rdates:0"
+msgid "Recurrence Dates"
+msgstr "Dates de récurrence"
+
+msgctxt "field:calendar.event,rec_name:0"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:calendar.event,recurrence:0"
+msgid "Recurrence"
+msgstr "Récurrence"
+
+msgctxt "field:calendar.event,rrules:0"
+msgid "Recurrence Rules"
+msgstr "Règles de récurrence"
+
+msgctxt "field:calendar.event,sequence:0"
+msgid "Sequence"
+msgstr "Séquence"
+
+msgctxt "field:calendar.event,status:0"
+msgid "Status"
+msgstr "Statut"
+
+msgctxt "field:calendar.event,summary:0"
+msgid "Summary"
+msgstr "Résumé"
+
+msgctxt "field:calendar.event,timezone:0"
+msgid "Timezone"
+msgstr "Fuseau Horaire"
+
+msgctxt "field:calendar.event,transp:0"
+msgid "Time Transparency"
+msgstr "Transparence"
+
+msgctxt "field:calendar.event,uuid:0"
+msgid "UUID"
+msgstr "UUID"
+
+msgctxt "field:calendar.event,vevent:0"
+msgid "vevent"
+msgstr "vevent"
+
+msgctxt "field:calendar.event-calendar.category,category:0"
+msgid "Category"
+msgstr "Catégorie"
+
+msgctxt "field:calendar.event-calendar.category,event:0"
+msgid "Event"
+msgstr "Événement"
+
+msgctxt "field:calendar.event-calendar.category,rec_name:0"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:calendar.event.alarm,calendar_alarm:0"
+msgid "Calendar Alarm"
+msgstr "Alarme calendrier"
+
+msgctxt "field:calendar.event.alarm,event:0"
+msgid "Event"
+msgstr "Événement"
+
+msgctxt "field:calendar.event.alarm,rec_name:0"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:calendar.event.attendee,calendar_attendee:0"
+msgid "Calendar Attendee"
+msgstr "Participant calendrier"
+
+msgctxt "field:calendar.event.attendee,event:0"
+msgid "Event"
+msgstr "Événement"
+
+msgctxt "field:calendar.event.attendee,rec_name:0"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:calendar.event.exdate,calendar_date:0"
+msgid "Calendar Date"
+msgstr "Date calendrier"
+
+msgctxt "field:calendar.event.exdate,event:0"
+msgid "Event"
+msgstr "Événement"
+
+msgctxt "field:calendar.event.exdate,rec_name:0"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:calendar.event.exrule,calendar_rrule:0"
+msgid "Calendar RRule"
+msgstr "Règle de récurrence"
+
+msgctxt "field:calendar.event.exrule,event:0"
+msgid "Event"
+msgstr "Événement"
+
+msgctxt "field:calendar.event.exrule,rec_name:0"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:calendar.event.rdate,calendar_date:0"
+msgid "Calendar Date"
+msgstr "Date calendrier"
+
+msgctxt "field:calendar.event.rdate,event:0"
+msgid "Event"
+msgstr "Événement"
+
+msgctxt "field:calendar.event.rdate,rec_name:0"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:calendar.event.rrule,calendar_rrule:0"
+msgid "Calendar RRule"
+msgstr "Règle de récurrence"
+
+msgctxt "field:calendar.event.rrule,event:0"
+msgid "Event"
+msgstr "Événement"
+
+msgctxt "field:calendar.event.rrule,rec_name:0"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:calendar.location,name:0"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:calendar.location,rec_name:0"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:calendar.rrule,byday:0"
+msgid "By Day"
+msgstr "Par jour"
+
+msgctxt "field:calendar.rrule,byhour:0"
+msgid "By Hour"
+msgstr "Par heure"
+
+msgctxt "field:calendar.rrule,byminute:0"
+msgid "By Minute"
+msgstr "Par minute"
+
+msgctxt "field:calendar.rrule,bymonth:0"
+msgid "By Month"
+msgstr "Par mois"
+
+msgctxt "field:calendar.rrule,bymonthday:0"
+msgid "By Month Day"
+msgstr "Par jour du mois"
+
+msgctxt "field:calendar.rrule,bysecond:0"
+msgid "By Second"
+msgstr "Par seconde"
+
+msgctxt "field:calendar.rrule,bysetpos:0"
+msgid "By Position"
+msgstr "Par position"
+
+msgctxt "field:calendar.rrule,byweekno:0"
+msgid "By Week Number"
+msgstr "Par numéro de semaine"
+
+msgctxt "field:calendar.rrule,byyearday:0"
+msgid "By Year Day"
+msgstr "Par jour de l'année"
+
+msgctxt "field:calendar.rrule,count:0"
+msgid "Count"
+msgstr "Répétitions"
+
+msgctxt "field:calendar.rrule,freq:0"
+msgid "Frequency"
+msgstr "Fréquence"
+
+msgctxt "field:calendar.rrule,interval:0"
+msgid "Interval"
+msgstr "Intervalle"
+
+msgctxt "field:calendar.rrule,rec_name:0"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:calendar.rrule,until:0"
+msgid "Until Date"
+msgstr "Date de fin"
+
+msgctxt "field:calendar.rrule,until_date:0"
+msgid "Is Date"
+msgstr "Est une date"
+
+msgctxt "field:calendar.rrule,wkst:0"
+msgid "Week Day"
+msgstr "Jour de la semaine"
+
+msgctxt "field:res.user,calendars:0"
+msgid "Calendars"
+msgstr "Calendriers"
+
+msgctxt "help:calendar.calendar,owner:0"
+msgid "The user must have an email"
+msgstr "L'utilisateur doit avoir une adresse mail"
+
+msgctxt "help:calendar.date,date:0"
+msgid "Ignore time of field \"Date\", but handle as date only."
+msgstr "Ignorer l'heure du champ \"Date\" et considérer uniquement la date"
+
+msgctxt "help:calendar.event,uuid:0"
+msgid "Universally Unique Identifier"
+msgstr "Identificateur unique universel"
+
+msgctxt "help:calendar.rrule,until_date:0"
+msgid "Ignore time of field \"Until Date\", but handle as date only."
+msgstr "Ignorer l'heure du champ \"Date de fin\" et considérer uniquement la date"
+
+msgctxt "model:calendar.alarm,name:0"
+msgid "Alarm"
+msgstr "Alarme"
+
+msgctxt "model:calendar.attendee,name:0"
+msgid "Attendee"
+msgstr "Participant"
+
+msgctxt "model:calendar.calendar,name:0"
+msgid "Calendar"
+msgstr "Calendrier"
+
+msgctxt "model:calendar.calendar-read-res.user,name:0"
+msgid "Calendar - read - User"
+msgstr "Calendrier - Lecture - Utilisateur"
+
+msgctxt "model:calendar.calendar-write-res.user,name:0"
+msgid "Calendar - write - User"
+msgstr "Calendrier - Écriture - Utilisateur"
+
+msgctxt "model:calendar.category,name:0"
+msgid "Category"
+msgstr "Catégorie"
+
+msgctxt "model:calendar.date,name:0"
+msgid "Calendar Date"
+msgstr "Date calendrier"
+
+msgctxt "model:calendar.event,name:0"
+msgid "Event"
+msgstr "Événement"
+
+msgctxt "model:calendar.event-calendar.category,name:0"
+msgid "Event - Category"
+msgstr "Évenement - Catégorie"
+
+msgctxt "model:calendar.event.alarm,name:0"
+msgid "Alarm"
+msgstr "Alarme"
+
+msgctxt "model:calendar.event.attendee,name:0"
+msgid "Attendee"
+msgstr "Participant"
+
+msgctxt "model:calendar.event.exdate,name:0"
+msgid "Exception Date"
+msgstr "Date d'exception"
+
+msgctxt "model:calendar.event.exrule,name:0"
+msgid "Exception Rule"
+msgstr "Règle d'exception"
+
+msgctxt "model:calendar.event.rdate,name:0"
+msgid "Recurrence Date"
+msgstr "Date de récurrence"
+
+msgctxt "model:calendar.event.rrule,name:0"
+msgid "Recurrence Rule"
+msgstr "Règle de récurrence"
+
+msgctxt "model:calendar.location,name:0"
+msgid "Location"
+msgstr "Emplacement"
+
+msgctxt "model:calendar.rrule,name:0"
+msgid "Recurrence Rule"
+msgstr "Règle de récurrence"
+
+msgctxt "model:ir.action,name:act_calendar_form"
+msgid "Calendars"
+msgstr "Calendriers"
+
+msgctxt "model:ir.action,name:act_event_form"
+msgid "Events"
+msgstr "Événement"
+
+msgctxt "model:ir.action,name:act_event_form3"
+msgid "Events"
+msgstr "Événements"
+
+msgctxt "model:ir.ui.menu,name:menu_calendar"
+msgid "Calendar"
+msgstr "Calendrier"
+
+msgctxt "model:ir.ui.menu,name:menu_calendar_form"
+msgid "Calendars"
+msgstr "Calendriers"
+
+msgctxt "model:ir.ui.menu,name:menu_event_form"
+msgid "Events"
+msgstr "Évenement"
+
+msgctxt "model:res.group,name:group_calendar_admin"
+msgid "Calendar Administration"
+msgstr "Administration calendrier"
+
+msgctxt "selection:calendar.attendee,status:0"
+msgid ""
+msgstr ""
+
+msgctxt "selection:calendar.attendee,status:0"
+msgid "Accepted"
+msgstr "Accepté"
+
+msgctxt "selection:calendar.attendee,status:0"
+msgid "Declined"
+msgstr "Décliné"
+
+msgctxt "selection:calendar.attendee,status:0"
+msgid "Delegated"
+msgstr "Délégué"
+
+msgctxt "selection:calendar.attendee,status:0"
+msgid "Needs Action"
+msgstr "Nécessite une action"
+
+msgctxt "selection:calendar.attendee,status:0"
+msgid "Tentative"
+msgstr "Tentative"
+
+msgctxt "selection:calendar.event,classification:0"
+msgid "Confidential"
+msgstr "Confidentiel"
+
+msgctxt "selection:calendar.event,classification:0"
+msgid "Private"
+msgstr "Privé"
+
+msgctxt "selection:calendar.event,classification:0"
+msgid "Public"
+msgstr "Publique"
+
+msgctxt "selection:calendar.event,status:0"
+msgid ""
+msgstr ""
+
+msgctxt "selection:calendar.event,status:0"
+msgid "Cancelled"
+msgstr "Annulé"
+
+msgctxt "selection:calendar.event,status:0"
+msgid "Confirmed"
+msgstr "Confirmé"
+
+msgctxt "selection:calendar.event,status:0"
+msgid "Tentative"
+msgstr "Tentative"
+
+msgctxt "selection:calendar.event,transp:0"
+msgid "Opaque"
+msgstr "Opaque"
+
+msgctxt "selection:calendar.event,transp:0"
+msgid "Transparent"
+msgstr "transparent"
+
+msgctxt "selection:calendar.rrule,freq:0"
+msgid "Daily"
+msgstr "Journalier"
+
+msgctxt "selection:calendar.rrule,freq:0"
+msgid "Hourly"
+msgstr "Horaire"
+
+msgctxt "selection:calendar.rrule,freq:0"
+msgid "Minutely"
+msgstr "Chaque minute"
+
+msgctxt "selection:calendar.rrule,freq:0"
+msgid "Monthly"
+msgstr "Mensuel"
+
+msgctxt "selection:calendar.rrule,freq:0"
+msgid "Secondly"
+msgstr "Chaque seconde"
+
+msgctxt "selection:calendar.rrule,freq:0"
+msgid "Weekly"
+msgstr "hebdomadaire"
+
+msgctxt "selection:calendar.rrule,freq:0"
+msgid "Yearly"
+msgstr "Annuel"
+
+msgctxt "selection:calendar.rrule,wkst:0"
+msgid "Friday"
+msgstr "Vendredi"
+
+msgctxt "selection:calendar.rrule,wkst:0"
+msgid "Monday"
+msgstr "Lundi"
+
+msgctxt "selection:calendar.rrule,wkst:0"
+msgid "Saturday"
+msgstr "Samedi"
+
+msgctxt "selection:calendar.rrule,wkst:0"
+msgid "Sunday"
+msgstr "Dimanche"
+
+msgctxt "selection:calendar.rrule,wkst:0"
+msgid "Thursday"
+msgstr "Jeudi"
+
+msgctxt "selection:calendar.rrule,wkst:0"
+msgid "Tuesday"
+msgstr "Mardi"
+
+msgctxt "selection:calendar.rrule,wkst:0"
+msgid "Wednesday"
+msgstr "Mercredi"
+
+msgctxt "view:calendar.calendar:0"
+msgid "Calendar"
+msgstr "Calendrier"
+
+msgctxt "view:calendar.calendar:0"
+msgid "Calendars"
+msgstr "Calendriers"
+
+msgctxt "view:calendar.calendar:0"
+msgid "General"
+msgstr "Général"
+
+msgctxt "view:calendar.calendar:0"
+msgid "Security"
+msgstr "Sécurité"
+
+msgctxt "view:calendar.category:0"
+msgid "Categories"
+msgstr "Catégories"
+
+msgctxt "view:calendar.category:0"
+msgid "Category"
+msgstr "Catégorie"
+
+msgctxt "view:calendar.event.attendee:0"
+msgid "Attendee"
+msgstr "Participant"
+
+msgctxt "view:calendar.event.attendee:0"
+msgid "Attendees"
+msgstr "Participants"
+
+msgctxt "view:calendar.event.exdate:0"
+msgid "Exception Date"
+msgstr "Date d'exception"
+
+msgctxt "view:calendar.event.exdate:0"
+msgid "Exception Dates"
+msgstr "Dates d'exception"
+
+msgctxt "view:calendar.event.exrule:0"
+msgid "Exception Rule"
+msgstr "Règle d'exception"
+
+msgctxt "view:calendar.event.exrule:0"
+msgid "Exception Rules"
+msgstr "Règles d'exception"
+
+msgctxt "view:calendar.event.rdate:0"
+msgid "Recurrence Date"
+msgstr "Date de récurrence"
+
+msgctxt "view:calendar.event.rdate:0"
+msgid "Recurrence Dates"
+msgstr "Dates de récurrence"
+
+msgctxt "view:calendar.event.rrule:0"
+msgid "Recurrence Rule"
+msgstr "Règle de récurrence"
+
+msgctxt "view:calendar.event.rrule:0"
+msgid "Recurrence Rules"
+msgstr "Règles de récurrence"
+
+msgctxt "view:calendar.event:0"
+msgid "Attendees"
+msgstr "Participants"
+
+msgctxt "view:calendar.event:0"
+msgid "Categories"
+msgstr "Catégories"
+
+msgctxt "view:calendar.event:0"
+msgid "Event"
+msgstr "Événement"
+
+msgctxt "view:calendar.event:0"
+msgid "Events"
+msgstr "Événements"
+
+msgctxt "view:calendar.event:0"
+msgid "General"
+msgstr "Général"
+
+msgctxt "view:calendar.event:0"
+msgid "Occurences"
+msgstr "Occurrences"
+
+msgctxt "view:calendar.location:0"
+msgid "Location"
+msgstr "Emplacement"
+
+msgctxt "view:calendar.location:0"
+msgid "Locations"
+msgstr "Emplacements"
diff --git a/locale/nl_NL.po b/locale/nl_NL.po
new file mode 100644
index 0000000..d4aa135
--- /dev/null
+++ b/locale/nl_NL.po
@@ -0,0 +1,798 @@
+# 
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "error:calendar.calendar:0"
+msgid "A user can have only one calendar!"
+msgstr ""
+
+msgctxt "error:calendar.calendar:0"
+msgid "The name of calendar must be unique!"
+msgstr ""
+
+msgctxt "error:calendar.category:0"
+msgid "The name of calendar category must be unique!"
+msgstr ""
+
+msgctxt "error:calendar.event:0"
+msgid "Recurrence can not be recurrent!"
+msgstr ""
+
+msgctxt "error:calendar.event:0"
+msgid "UUID and recurrence must be unique in a calendar!"
+msgstr ""
+
+msgctxt "error:calendar.location:0"
+msgid "The name of calendar location must be unique!"
+msgstr ""
+
+msgctxt "error:calendar.rrule:0"
+msgid "Invalid \"By Day\""
+msgstr ""
+
+msgctxt "error:calendar.rrule:0"
+msgid "Invalid \"By Hour\""
+msgstr ""
+
+msgctxt "error:calendar.rrule:0"
+msgid "Invalid \"By Minute\""
+msgstr ""
+
+msgctxt "error:calendar.rrule:0"
+msgid "Invalid \"By Month Day\""
+msgstr ""
+
+msgctxt "error:calendar.rrule:0"
+msgid "Invalid \"By Month\""
+msgstr ""
+
+msgctxt "error:calendar.rrule:0"
+msgid "Invalid \"By Position\""
+msgstr ""
+
+msgctxt "error:calendar.rrule:0"
+msgid "Invalid \"By Second\""
+msgstr ""
+
+msgctxt "error:calendar.rrule:0"
+msgid "Invalid \"By Week Number\""
+msgstr ""
+
+msgctxt "error:calendar.rrule:0"
+msgid "Invalid \"By Year Day\""
+msgstr ""
+
+msgctxt "error:calendar.rrule:0"
+msgid "Only one of \"until\" and \"count\" can be set!"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.alarm,rec_name:0"
+msgid "Name"
+msgstr "Naam bijlage"
+
+msgctxt "field:calendar.alarm,valarm:0"
+msgid "valarm"
+msgstr ""
+
+msgctxt "field:calendar.attendee,attendee:0"
+msgid "attendee"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.attendee,email:0"
+msgid "Email"
+msgstr "E-mail"
+
+#, fuzzy
+msgctxt "field:calendar.attendee,rec_name:0"
+msgid "Name"
+msgstr "Naam bijlage"
+
+msgctxt "field:calendar.attendee,status:0"
+msgid "Participation Status"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.calendar,description:0"
+msgid "Description"
+msgstr "Specificatie"
+
+#, fuzzy
+msgctxt "field:calendar.calendar,name:0"
+msgid "Name"
+msgstr "Naam bijlage"
+
+msgctxt "field:calendar.calendar,owner:0"
+msgid "Owner"
+msgstr ""
+
+msgctxt "field:calendar.calendar,read_users:0"
+msgid "Read Users"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.calendar,rec_name:0"
+msgid "Name"
+msgstr "Naam bijlage"
+
+msgctxt "field:calendar.calendar,write_users:0"
+msgid "Write Users"
+msgstr ""
+
+msgctxt "field:calendar.calendar-read-res.user,calendar:0"
+msgid "Calendar"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.calendar-read-res.user,rec_name:0"
+msgid "Name"
+msgstr "Naam bijlage"
+
+#, fuzzy
+msgctxt "field:calendar.calendar-read-res.user,user:0"
+msgid "User"
+msgstr "Gebruiker"
+
+msgctxt "field:calendar.calendar-write-res.user,calendar:0"
+msgid "Calendar"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.calendar-write-res.user,rec_name:0"
+msgid "Name"
+msgstr "Naam bijlage"
+
+#, fuzzy
+msgctxt "field:calendar.calendar-write-res.user,user:0"
+msgid "User"
+msgstr "Gebruiker"
+
+#, fuzzy
+msgctxt "field:calendar.category,name:0"
+msgid "Name"
+msgstr "Naam bijlage"
+
+#, fuzzy
+msgctxt "field:calendar.category,rec_name:0"
+msgid "Name"
+msgstr "Naam bijlage"
+
+msgctxt "field:calendar.date,date:0"
+msgid "Is Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.date,datetime:0"
+msgid "Date"
+msgstr "Vervaldatum"
+
+#, fuzzy
+msgctxt "field:calendar.date,rec_name:0"
+msgid "Name"
+msgstr "Naam bijlage"
+
+msgctxt "field:calendar.event,alarms:0"
+msgid "Alarms"
+msgstr ""
+
+msgctxt "field:calendar.event,all_day:0"
+msgid "All Day"
+msgstr ""
+
+msgctxt "field:calendar.event,attendees:0"
+msgid "Attendees"
+msgstr ""
+
+msgctxt "field:calendar.event,calendar:0"
+msgid "Calendar"
+msgstr ""
+
+msgctxt "field:calendar.event,calendar_owner:0"
+msgid "Owner"
+msgstr ""
+
+msgctxt "field:calendar.event,calendar_read_users:0"
+msgid "Read Users"
+msgstr ""
+
+msgctxt "field:calendar.event,calendar_write_users:0"
+msgid "Write Users"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.event,categories:0"
+msgid "Categories"
+msgstr "Categorieën"
+
+msgctxt "field:calendar.event,classification:0"
+msgid "Classification"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.event,description:0"
+msgid "Description"
+msgstr "Specificatie"
+
+#, fuzzy
+msgctxt "field:calendar.event,dtend:0"
+msgid "End Date"
+msgstr "Eind datum"
+
+#, fuzzy
+msgctxt "field:calendar.event,dtstart:0"
+msgid "Start Date"
+msgstr "Start datum"
+
+msgctxt "field:calendar.event,exdates:0"
+msgid "Exception Dates"
+msgstr ""
+
+msgctxt "field:calendar.event,exrules:0"
+msgid "Exception Rules"
+msgstr ""
+
+msgctxt "field:calendar.event,location:0"
+msgid "Location"
+msgstr ""
+
+msgctxt "field:calendar.event,occurences:0"
+msgid "Occurences"
+msgstr ""
+
+msgctxt "field:calendar.event,organizer:0"
+msgid "Organizer"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.event,parent:0"
+msgid "Parent"
+msgstr "Bovenliggend niveau"
+
+msgctxt "field:calendar.event,rdates:0"
+msgid "Recurrence Dates"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.event,rec_name:0"
+msgid "Name"
+msgstr "Naam bijlage"
+
+msgctxt "field:calendar.event,recurrence:0"
+msgid "Recurrence"
+msgstr ""
+
+msgctxt "field:calendar.event,rrules:0"
+msgid "Recurrence Rules"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.event,sequence:0"
+msgid "Sequence"
+msgstr "Reeks"
+
+msgctxt "field:calendar.event,status:0"
+msgid "Status"
+msgstr ""
+
+msgctxt "field:calendar.event,summary:0"
+msgid "Summary"
+msgstr ""
+
+msgctxt "field:calendar.event,timezone:0"
+msgid "Timezone"
+msgstr ""
+
+msgctxt "field:calendar.event,transp:0"
+msgid "Time Transparency"
+msgstr ""
+
+msgctxt "field:calendar.event,uuid:0"
+msgid "UUID"
+msgstr ""
+
+msgctxt "field:calendar.event,vevent:0"
+msgid "vevent"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.event-calendar.category,category:0"
+msgid "Category"
+msgstr "Categorie"
+
+msgctxt "field:calendar.event-calendar.category,event:0"
+msgid "Event"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.event-calendar.category,rec_name:0"
+msgid "Name"
+msgstr "Naam bijlage"
+
+msgctxt "field:calendar.event.alarm,calendar_alarm:0"
+msgid "Calendar Alarm"
+msgstr ""
+
+msgctxt "field:calendar.event.alarm,event:0"
+msgid "Event"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.event.alarm,rec_name:0"
+msgid "Name"
+msgstr "Naam bijlage"
+
+msgctxt "field:calendar.event.attendee,calendar_attendee:0"
+msgid "Calendar Attendee"
+msgstr ""
+
+msgctxt "field:calendar.event.attendee,event:0"
+msgid "Event"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.event.attendee,rec_name:0"
+msgid "Name"
+msgstr "Naam bijlage"
+
+msgctxt "field:calendar.event.exdate,calendar_date:0"
+msgid "Calendar Date"
+msgstr ""
+
+msgctxt "field:calendar.event.exdate,event:0"
+msgid "Event"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.event.exdate,rec_name:0"
+msgid "Name"
+msgstr "Naam bijlage"
+
+msgctxt "field:calendar.event.exrule,calendar_rrule:0"
+msgid "Calendar RRule"
+msgstr ""
+
+msgctxt "field:calendar.event.exrule,event:0"
+msgid "Event"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.event.exrule,rec_name:0"
+msgid "Name"
+msgstr "Naam bijlage"
+
+msgctxt "field:calendar.event.rdate,calendar_date:0"
+msgid "Calendar Date"
+msgstr ""
+
+msgctxt "field:calendar.event.rdate,event:0"
+msgid "Event"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.event.rdate,rec_name:0"
+msgid "Name"
+msgstr "Naam bijlage"
+
+msgctxt "field:calendar.event.rrule,calendar_rrule:0"
+msgid "Calendar RRule"
+msgstr ""
+
+msgctxt "field:calendar.event.rrule,event:0"
+msgid "Event"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.event.rrule,rec_name:0"
+msgid "Name"
+msgstr "Naam bijlage"
+
+#, fuzzy
+msgctxt "field:calendar.location,name:0"
+msgid "Name"
+msgstr "Naam bijlage"
+
+#, fuzzy
+msgctxt "field:calendar.location,rec_name:0"
+msgid "Name"
+msgstr "Naam bijlage"
+
+msgctxt "field:calendar.rrule,byday:0"
+msgid "By Day"
+msgstr ""
+
+msgctxt "field:calendar.rrule,byhour:0"
+msgid "By Hour"
+msgstr ""
+
+msgctxt "field:calendar.rrule,byminute:0"
+msgid "By Minute"
+msgstr ""
+
+msgctxt "field:calendar.rrule,bymonth:0"
+msgid "By Month"
+msgstr ""
+
+msgctxt "field:calendar.rrule,bymonthday:0"
+msgid "By Month Day"
+msgstr ""
+
+msgctxt "field:calendar.rrule,bysecond:0"
+msgid "By Second"
+msgstr ""
+
+msgctxt "field:calendar.rrule,bysetpos:0"
+msgid "By Position"
+msgstr ""
+
+msgctxt "field:calendar.rrule,byweekno:0"
+msgid "By Week Number"
+msgstr ""
+
+msgctxt "field:calendar.rrule,byyearday:0"
+msgid "By Year Day"
+msgstr ""
+
+msgctxt "field:calendar.rrule,count:0"
+msgid "Count"
+msgstr ""
+
+msgctxt "field:calendar.rrule,freq:0"
+msgid "Frequency"
+msgstr ""
+
+msgctxt "field:calendar.rrule,interval:0"
+msgid "Interval"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.rrule,rec_name:0"
+msgid "Name"
+msgstr "Naam bijlage"
+
+msgctxt "field:calendar.rrule,until:0"
+msgid "Until Date"
+msgstr ""
+
+msgctxt "field:calendar.rrule,until_date:0"
+msgid "Is Date"
+msgstr ""
+
+msgctxt "field:calendar.rrule,wkst:0"
+msgid "Week Day"
+msgstr ""
+
+msgctxt "field:res.user,calendars:0"
+msgid "Calendars"
+msgstr ""
+
+msgctxt "help:calendar.calendar,owner:0"
+msgid "The user must have an email"
+msgstr ""
+
+msgctxt "help:calendar.date,date:0"
+msgid "Ignore time of field \"Date\", but handle as date only."
+msgstr ""
+
+msgctxt "help:calendar.event,uuid:0"
+msgid "Universally Unique Identifier"
+msgstr ""
+
+msgctxt "help:calendar.rrule,until_date:0"
+msgid "Ignore time of field \"Until Date\", but handle as date only."
+msgstr ""
+
+msgctxt "model:calendar.alarm,name:0"
+msgid "Alarm"
+msgstr ""
+
+msgctxt "model:calendar.attendee,name:0"
+msgid "Attendee"
+msgstr ""
+
+msgctxt "model:calendar.calendar,name:0"
+msgid "Calendar"
+msgstr ""
+
+msgctxt "model:calendar.calendar-read-res.user,name:0"
+msgid "Calendar - read - User"
+msgstr ""
+
+msgctxt "model:calendar.calendar-write-res.user,name:0"
+msgid "Calendar - write - User"
+msgstr ""
+
+#, fuzzy
+msgctxt "model:calendar.category,name:0"
+msgid "Category"
+msgstr "Categorie"
+
+msgctxt "model:calendar.date,name:0"
+msgid "Calendar Date"
+msgstr ""
+
+msgctxt "model:calendar.event,name:0"
+msgid "Event"
+msgstr ""
+
+msgctxt "model:calendar.event-calendar.category,name:0"
+msgid "Event - Category"
+msgstr ""
+
+msgctxt "model:calendar.event.alarm,name:0"
+msgid "Alarm"
+msgstr ""
+
+msgctxt "model:calendar.event.attendee,name:0"
+msgid "Attendee"
+msgstr ""
+
+msgctxt "model:calendar.event.exdate,name:0"
+msgid "Exception Date"
+msgstr ""
+
+msgctxt "model:calendar.event.exrule,name:0"
+msgid "Exception Rule"
+msgstr ""
+
+msgctxt "model:calendar.event.rdate,name:0"
+msgid "Recurrence Date"
+msgstr ""
+
+msgctxt "model:calendar.event.rrule,name:0"
+msgid "Recurrence Rule"
+msgstr ""
+
+msgctxt "model:calendar.location,name:0"
+msgid "Location"
+msgstr ""
+
+msgctxt "model:calendar.rrule,name:0"
+msgid "Recurrence Rule"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_calendar_form"
+msgid "Calendars"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_event_form"
+msgid "Events"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_event_form3"
+msgid "Events"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_calendar"
+msgid "Calendar"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_calendar_form"
+msgid "Calendars"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_event_form"
+msgid "Events"
+msgstr ""
+
+msgctxt "model:res.group,name:group_calendar_admin"
+msgid "Calendar Administration"
+msgstr ""
+
+msgctxt "selection:calendar.attendee,status:0"
+msgid ""
+msgstr ""
+
+msgctxt "selection:calendar.attendee,status:0"
+msgid "Accepted"
+msgstr ""
+
+msgctxt "selection:calendar.attendee,status:0"
+msgid "Declined"
+msgstr ""
+
+msgctxt "selection:calendar.attendee,status:0"
+msgid "Delegated"
+msgstr ""
+
+msgctxt "selection:calendar.attendee,status:0"
+msgid "Needs Action"
+msgstr ""
+
+msgctxt "selection:calendar.attendee,status:0"
+msgid "Tentative"
+msgstr ""
+
+msgctxt "selection:calendar.event,classification:0"
+msgid "Confidential"
+msgstr ""
+
+msgctxt "selection:calendar.event,classification:0"
+msgid "Private"
+msgstr ""
+
+msgctxt "selection:calendar.event,classification:0"
+msgid "Public"
+msgstr ""
+
+msgctxt "selection:calendar.event,status:0"
+msgid ""
+msgstr ""
+
+msgctxt "selection:calendar.event,status:0"
+msgid "Cancelled"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:calendar.event,status:0"
+msgid "Confirmed"
+msgstr "Bevestigd"
+
+msgctxt "selection:calendar.event,status:0"
+msgid "Tentative"
+msgstr ""
+
+msgctxt "selection:calendar.event,transp:0"
+msgid "Opaque"
+msgstr ""
+
+msgctxt "selection:calendar.event,transp:0"
+msgid "Transparent"
+msgstr ""
+
+msgctxt "selection:calendar.rrule,freq:0"
+msgid "Daily"
+msgstr ""
+
+msgctxt "selection:calendar.rrule,freq:0"
+msgid "Hourly"
+msgstr ""
+
+msgctxt "selection:calendar.rrule,freq:0"
+msgid "Minutely"
+msgstr ""
+
+msgctxt "selection:calendar.rrule,freq:0"
+msgid "Monthly"
+msgstr ""
+
+msgctxt "selection:calendar.rrule,freq:0"
+msgid "Secondly"
+msgstr ""
+
+msgctxt "selection:calendar.rrule,freq:0"
+msgid "Weekly"
+msgstr ""
+
+msgctxt "selection:calendar.rrule,freq:0"
+msgid "Yearly"
+msgstr ""
+
+msgctxt "selection:calendar.rrule,wkst:0"
+msgid "Friday"
+msgstr ""
+
+msgctxt "selection:calendar.rrule,wkst:0"
+msgid "Monday"
+msgstr ""
+
+msgctxt "selection:calendar.rrule,wkst:0"
+msgid "Saturday"
+msgstr ""
+
+msgctxt "selection:calendar.rrule,wkst:0"
+msgid "Sunday"
+msgstr ""
+
+msgctxt "selection:calendar.rrule,wkst:0"
+msgid "Thursday"
+msgstr ""
+
+msgctxt "selection:calendar.rrule,wkst:0"
+msgid "Tuesday"
+msgstr ""
+
+msgctxt "selection:calendar.rrule,wkst:0"
+msgid "Wednesday"
+msgstr ""
+
+msgctxt "view:calendar.calendar:0"
+msgid "Calendar"
+msgstr ""
+
+msgctxt "view:calendar.calendar:0"
+msgid "Calendars"
+msgstr ""
+
+#, fuzzy
+msgctxt "view:calendar.calendar:0"
+msgid "General"
+msgstr "Algemeen"
+
+msgctxt "view:calendar.calendar:0"
+msgid "Security"
+msgstr ""
+
+#, fuzzy
+msgctxt "view:calendar.category:0"
+msgid "Categories"
+msgstr "Categorieën"
+
+#, fuzzy
+msgctxt "view:calendar.category:0"
+msgid "Category"
+msgstr "Categorie"
+
+msgctxt "view:calendar.event.attendee:0"
+msgid "Attendee"
+msgstr ""
+
+msgctxt "view:calendar.event.attendee:0"
+msgid "Attendees"
+msgstr ""
+
+msgctxt "view:calendar.event.exdate:0"
+msgid "Exception Date"
+msgstr ""
+
+msgctxt "view:calendar.event.exdate:0"
+msgid "Exception Dates"
+msgstr ""
+
+msgctxt "view:calendar.event.exrule:0"
+msgid "Exception Rule"
+msgstr ""
+
+msgctxt "view:calendar.event.exrule:0"
+msgid "Exception Rules"
+msgstr ""
+
+msgctxt "view:calendar.event.rdate:0"
+msgid "Recurrence Date"
+msgstr ""
+
+msgctxt "view:calendar.event.rdate:0"
+msgid "Recurrence Dates"
+msgstr ""
+
+msgctxt "view:calendar.event.rrule:0"
+msgid "Recurrence Rule"
+msgstr ""
+
+msgctxt "view:calendar.event.rrule:0"
+msgid "Recurrence Rules"
+msgstr ""
+
+msgctxt "view:calendar.event:0"
+msgid "Attendees"
+msgstr ""
+
+#, fuzzy
+msgctxt "view:calendar.event:0"
+msgid "Categories"
+msgstr "Categorieën"
+
+msgctxt "view:calendar.event:0"
+msgid "Event"
+msgstr ""
+
+msgctxt "view:calendar.event:0"
+msgid "Events"
+msgstr ""
+
+#, fuzzy
+msgctxt "view:calendar.event:0"
+msgid "General"
+msgstr "Algemeen"
+
+msgctxt "view:calendar.event:0"
+msgid "Occurences"
+msgstr ""
+
+msgctxt "view:calendar.location:0"
+msgid "Location"
+msgstr ""
+
+msgctxt "view:calendar.location:0"
+msgid "Locations"
+msgstr ""
diff --git a/locale/ru_RU.po b/locale/ru_RU.po
new file mode 100644
index 0000000..0ab492d
--- /dev/null
+++ b/locale/ru_RU.po
@@ -0,0 +1,764 @@
+# 
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "error:calendar.calendar:0"
+msgid "A user can have only one calendar!"
+msgstr "Пользователь может иметь только Один календарь!"
+
+msgctxt "error:calendar.calendar:0"
+msgid "The name of calendar must be unique!"
+msgstr "Имя календаря должно быть уникально"
+
+msgctxt "error:calendar.category:0"
+msgid "The name of calendar category must be unique!"
+msgstr ""
+
+msgctxt "error:calendar.event:0"
+msgid "Recurrence can not be recurrent!"
+msgstr ""
+
+msgctxt "error:calendar.event:0"
+msgid "UUID and recurrence must be unique in a calendar!"
+msgstr ""
+
+msgctxt "error:calendar.location:0"
+msgid "The name of calendar location must be unique!"
+msgstr ""
+
+msgctxt "error:calendar.rrule:0"
+msgid "Invalid \"By Day\""
+msgstr "Неверное поле \"По дням\""
+
+msgctxt "error:calendar.rrule:0"
+msgid "Invalid \"By Hour\""
+msgstr "Неверное поле \"По часам\""
+
+msgctxt "error:calendar.rrule:0"
+msgid "Invalid \"By Minute\""
+msgstr "Неверное поле \"По минутам\""
+
+msgctxt "error:calendar.rrule:0"
+msgid "Invalid \"By Month Day\""
+msgstr "Неверное поле \"По дням месяца\""
+
+msgctxt "error:calendar.rrule:0"
+msgid "Invalid \"By Month\""
+msgstr "Неверное поле \"По месяцам\""
+
+msgctxt "error:calendar.rrule:0"
+msgid "Invalid \"By Position\""
+msgstr "Неверное поле \"По позиции\""
+
+msgctxt "error:calendar.rrule:0"
+msgid "Invalid \"By Second\""
+msgstr "Неверное поле \"По секундам\""
+
+msgctxt "error:calendar.rrule:0"
+msgid "Invalid \"By Week Number\""
+msgstr "Неверное поле \"По номерам недель\""
+
+msgctxt "error:calendar.rrule:0"
+msgid "Invalid \"By Year Day\""
+msgstr "Неверный \"По дням года\""
+
+msgctxt "error:calendar.rrule:0"
+msgid "Only one of \"until\" and \"count\" can be set!"
+msgstr ""
+
+msgctxt "field:calendar.alarm,rec_name:0"
+msgid "Name"
+msgstr "Наименование"
+
+msgctxt "field:calendar.alarm,valarm:0"
+msgid "valarm"
+msgstr ""
+
+msgctxt "field:calendar.attendee,attendee:0"
+msgid "attendee"
+msgstr "участник"
+
+msgctxt "field:calendar.attendee,email:0"
+msgid "Email"
+msgstr "Эл.почта"
+
+msgctxt "field:calendar.attendee,rec_name:0"
+msgid "Name"
+msgstr "Наименование"
+
+msgctxt "field:calendar.attendee,status:0"
+msgid "Participation Status"
+msgstr "Статус участия"
+
+msgctxt "field:calendar.calendar,description:0"
+msgid "Description"
+msgstr "Описание"
+
+msgctxt "field:calendar.calendar,name:0"
+msgid "Name"
+msgstr "Наименование"
+
+msgctxt "field:calendar.calendar,owner:0"
+msgid "Owner"
+msgstr "Владелец"
+
+msgctxt "field:calendar.calendar,read_users:0"
+msgid "Read Users"
+msgstr "Пользователи могут читать"
+
+msgctxt "field:calendar.calendar,rec_name:0"
+msgid "Name"
+msgstr "Наименование"
+
+msgctxt "field:calendar.calendar,write_users:0"
+msgid "Write Users"
+msgstr "Пользователи могут писать"
+
+msgctxt "field:calendar.calendar-read-res.user,calendar:0"
+msgid "Calendar"
+msgstr "Календар"
+
+msgctxt "field:calendar.calendar-read-res.user,rec_name:0"
+msgid "Name"
+msgstr "Наименование"
+
+msgctxt "field:calendar.calendar-read-res.user,user:0"
+msgid "User"
+msgstr "Пользователь"
+
+msgctxt "field:calendar.calendar-write-res.user,calendar:0"
+msgid "Calendar"
+msgstr "Календарь"
+
+msgctxt "field:calendar.calendar-write-res.user,rec_name:0"
+msgid "Name"
+msgstr "Наименование"
+
+msgctxt "field:calendar.calendar-write-res.user,user:0"
+msgid "User"
+msgstr "Пользователь"
+
+msgctxt "field:calendar.category,name:0"
+msgid "Name"
+msgstr "Наименование"
+
+msgctxt "field:calendar.category,rec_name:0"
+msgid "Name"
+msgstr "Наименование"
+
+msgctxt "field:calendar.date,date:0"
+msgid "Is Date"
+msgstr "Весь день"
+
+msgctxt "field:calendar.date,datetime:0"
+msgid "Date"
+msgstr "Дата"
+
+msgctxt "field:calendar.date,rec_name:0"
+msgid "Name"
+msgstr "Наименование"
+
+msgctxt "field:calendar.event,alarms:0"
+msgid "Alarms"
+msgstr "Вызовы"
+
+msgctxt "field:calendar.event,all_day:0"
+msgid "All Day"
+msgstr "Все дни"
+
+msgctxt "field:calendar.event,attendees:0"
+msgid "Attendees"
+msgstr "Участники"
+
+msgctxt "field:calendar.event,calendar:0"
+msgid "Calendar"
+msgstr "Календарь"
+
+msgctxt "field:calendar.event,calendar_owner:0"
+msgid "Owner"
+msgstr "Владелец"
+
+msgctxt "field:calendar.event,calendar_read_users:0"
+msgid "Read Users"
+msgstr "Пользователи могут читать"
+
+msgctxt "field:calendar.event,calendar_write_users:0"
+msgid "Write Users"
+msgstr "Пользователи могут писать"
+
+msgctxt "field:calendar.event,categories:0"
+msgid "Categories"
+msgstr "Категория"
+
+msgctxt "field:calendar.event,classification:0"
+msgid "Classification"
+msgstr "Классификация"
+
+msgctxt "field:calendar.event,description:0"
+msgid "Description"
+msgstr "Описание"
+
+msgctxt "field:calendar.event,dtend:0"
+msgid "End Date"
+msgstr "Дата окончания"
+
+msgctxt "field:calendar.event,dtstart:0"
+msgid "Start Date"
+msgstr "Дата начала"
+
+msgctxt "field:calendar.event,exdates:0"
+msgid "Exception Dates"
+msgstr "Дата исключения"
+
+msgctxt "field:calendar.event,exrules:0"
+msgid "Exception Rules"
+msgstr "Правила исключения"
+
+msgctxt "field:calendar.event,location:0"
+msgid "Location"
+msgstr "Местоположение"
+
+msgctxt "field:calendar.event,occurences:0"
+msgid "Occurences"
+msgstr "Дополнительные задачи"
+
+msgctxt "field:calendar.event,organizer:0"
+msgid "Organizer"
+msgstr "Организатор"
+
+msgctxt "field:calendar.event,parent:0"
+msgid "Parent"
+msgstr "Основной"
+
+msgctxt "field:calendar.event,rdates:0"
+msgid "Recurrence Dates"
+msgstr "Даты повторения"
+
+msgctxt "field:calendar.event,rec_name:0"
+msgid "Name"
+msgstr "Наименование"
+
+msgctxt "field:calendar.event,recurrence:0"
+msgid "Recurrence"
+msgstr "Повторение"
+
+msgctxt "field:calendar.event,rrules:0"
+msgid "Recurrence Rules"
+msgstr "Правила повторения"
+
+msgctxt "field:calendar.event,sequence:0"
+msgid "Sequence"
+msgstr "Последовательность"
+
+msgctxt "field:calendar.event,status:0"
+msgid "Status"
+msgstr "Состояние"
+
+msgctxt "field:calendar.event,summary:0"
+msgid "Summary"
+msgstr "Резюме"
+
+msgctxt "field:calendar.event,timezone:0"
+msgid "Timezone"
+msgstr "Зона времени"
+
+msgctxt "field:calendar.event,transp:0"
+msgid "Time Transparency"
+msgstr "Время Прозрачность"
+
+msgctxt "field:calendar.event,uuid:0"
+msgid "UUID"
+msgstr ""
+
+msgctxt "field:calendar.event,vevent:0"
+msgid "vevent"
+msgstr ""
+
+msgctxt "field:calendar.event-calendar.category,category:0"
+msgid "Category"
+msgstr "Категории"
+
+msgctxt "field:calendar.event-calendar.category,event:0"
+msgid "Event"
+msgstr "Событие"
+
+msgctxt "field:calendar.event-calendar.category,rec_name:0"
+msgid "Name"
+msgstr "Наименование"
+
+msgctxt "field:calendar.event.alarm,calendar_alarm:0"
+msgid "Calendar Alarm"
+msgstr "Сигнала календаря"
+
+msgctxt "field:calendar.event.alarm,event:0"
+msgid "Event"
+msgstr "Событие"
+
+msgctxt "field:calendar.event.alarm,rec_name:0"
+msgid "Name"
+msgstr "Наименование"
+
+msgctxt "field:calendar.event.attendee,calendar_attendee:0"
+msgid "Calendar Attendee"
+msgstr "Календарь участников"
+
+msgctxt "field:calendar.event.attendee,event:0"
+msgid "Event"
+msgstr "Событие"
+
+msgctxt "field:calendar.event.attendee,rec_name:0"
+msgid "Name"
+msgstr "Наименование"
+
+msgctxt "field:calendar.event.exdate,calendar_date:0"
+msgid "Calendar Date"
+msgstr "День календаря"
+
+msgctxt "field:calendar.event.exdate,event:0"
+msgid "Event"
+msgstr "Событие"
+
+msgctxt "field:calendar.event.exdate,rec_name:0"
+msgid "Name"
+msgstr "Наименование"
+
+msgctxt "field:calendar.event.exrule,calendar_rrule:0"
+msgid "Calendar RRule"
+msgstr "Правила календаря"
+
+msgctxt "field:calendar.event.exrule,event:0"
+msgid "Event"
+msgstr "Событие"
+
+msgctxt "field:calendar.event.exrule,rec_name:0"
+msgid "Name"
+msgstr "Наименование"
+
+msgctxt "field:calendar.event.rdate,calendar_date:0"
+msgid "Calendar Date"
+msgstr "День календаря"
+
+msgctxt "field:calendar.event.rdate,event:0"
+msgid "Event"
+msgstr "Событие"
+
+msgctxt "field:calendar.event.rdate,rec_name:0"
+msgid "Name"
+msgstr "Наименование"
+
+msgctxt "field:calendar.event.rrule,calendar_rrule:0"
+msgid "Calendar RRule"
+msgstr "Правила календаря"
+
+msgctxt "field:calendar.event.rrule,event:0"
+msgid "Event"
+msgstr "Событие"
+
+msgctxt "field:calendar.event.rrule,rec_name:0"
+msgid "Name"
+msgstr "Наименование"
+
+msgctxt "field:calendar.location,name:0"
+msgid "Name"
+msgstr "Наименование"
+
+msgctxt "field:calendar.location,rec_name:0"
+msgid "Name"
+msgstr "Наименование"
+
+msgctxt "field:calendar.rrule,byday:0"
+msgid "By Day"
+msgstr "По дням"
+
+msgctxt "field:calendar.rrule,byhour:0"
+msgid "By Hour"
+msgstr "По часам"
+
+msgctxt "field:calendar.rrule,byminute:0"
+msgid "By Minute"
+msgstr "По минутам"
+
+msgctxt "field:calendar.rrule,bymonth:0"
+msgid "By Month"
+msgstr "По месячно"
+
+msgctxt "field:calendar.rrule,bymonthday:0"
+msgid "By Month Day"
+msgstr "По дням месяца"
+
+msgctxt "field:calendar.rrule,bysecond:0"
+msgid "By Second"
+msgstr "По секундам"
+
+msgctxt "field:calendar.rrule,bysetpos:0"
+msgid "By Position"
+msgstr "По позиции"
+
+msgctxt "field:calendar.rrule,byweekno:0"
+msgid "By Week Number"
+msgstr "По номерам недель"
+
+msgctxt "field:calendar.rrule,byyearday:0"
+msgid "By Year Day"
+msgstr "По дням года"
+
+msgctxt "field:calendar.rrule,count:0"
+msgid "Count"
+msgstr "Количество"
+
+msgctxt "field:calendar.rrule,freq:0"
+msgid "Frequency"
+msgstr "Частота"
+
+msgctxt "field:calendar.rrule,interval:0"
+msgid "Interval"
+msgstr "Внутренний"
+
+msgctxt "field:calendar.rrule,rec_name:0"
+msgid "Name"
+msgstr "Наименование"
+
+msgctxt "field:calendar.rrule,until:0"
+msgid "Until Date"
+msgstr "До даты"
+
+msgctxt "field:calendar.rrule,until_date:0"
+msgid "Is Date"
+msgstr "Весь день"
+
+msgctxt "field:calendar.rrule,wkst:0"
+msgid "Week Day"
+msgstr "День недели"
+
+msgctxt "field:res.user,calendars:0"
+msgid "Calendars"
+msgstr "Календари"
+
+msgctxt "help:calendar.calendar,owner:0"
+msgid "The user must have an email"
+msgstr ""
+
+msgctxt "help:calendar.date,date:0"
+msgid "Ignore time of field \"Date\", but handle as date only."
+msgstr "Время игнорируется в поле \"Дата\", действует только дата"
+
+msgctxt "help:calendar.event,uuid:0"
+msgid "Universally Unique Identifier"
+msgstr "Универсальный уникальный идентификатор"
+
+msgctxt "help:calendar.rrule,until_date:0"
+msgid "Ignore time of field \"Until Date\", but handle as date only."
+msgstr "Время игнорируется в поле \"До даты\", действует только дата"
+
+msgctxt "model:calendar.alarm,name:0"
+msgid "Alarm"
+msgstr "Вызов"
+
+msgctxt "model:calendar.attendee,name:0"
+msgid "Attendee"
+msgstr "Участник"
+
+msgctxt "model:calendar.calendar,name:0"
+msgid "Calendar"
+msgstr "Календарь"
+
+msgctxt "model:calendar.calendar-read-res.user,name:0"
+msgid "Calendar - read - User"
+msgstr "Пользователи могут читать"
+
+msgctxt "model:calendar.calendar-write-res.user,name:0"
+msgid "Calendar - write - User"
+msgstr "Пользователи могут писать"
+
+msgctxt "model:calendar.category,name:0"
+msgid "Category"
+msgstr "Категории"
+
+msgctxt "model:calendar.date,name:0"
+msgid "Calendar Date"
+msgstr "День календаря"
+
+msgctxt "model:calendar.event,name:0"
+msgid "Event"
+msgstr "Событие"
+
+msgctxt "model:calendar.event-calendar.category,name:0"
+msgid "Event - Category"
+msgstr "Категории - События"
+
+msgctxt "model:calendar.event.alarm,name:0"
+msgid "Alarm"
+msgstr "Вызов"
+
+msgctxt "model:calendar.event.attendee,name:0"
+msgid "Attendee"
+msgstr "Участник"
+
+msgctxt "model:calendar.event.exdate,name:0"
+msgid "Exception Date"
+msgstr "Дата исключения"
+
+msgctxt "model:calendar.event.exrule,name:0"
+msgid "Exception Rule"
+msgstr "Правило исключения"
+
+msgctxt "model:calendar.event.rdate,name:0"
+msgid "Recurrence Date"
+msgstr "Даты повторения"
+
+msgctxt "model:calendar.event.rrule,name:0"
+msgid "Recurrence Rule"
+msgstr "Правила повторения"
+
+msgctxt "model:calendar.location,name:0"
+msgid "Location"
+msgstr "Местоположение"
+
+msgctxt "model:calendar.rrule,name:0"
+msgid "Recurrence Rule"
+msgstr "Правила повторения"
+
+msgctxt "model:ir.action,name:act_calendar_form"
+msgid "Calendars"
+msgstr "Календари"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_event_form"
+msgid "Events"
+msgstr "События"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_event_form3"
+msgid "Events"
+msgstr "События"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_calendar"
+msgid "Calendar"
+msgstr "Календари"
+
+msgctxt "model:ir.ui.menu,name:menu_calendar_form"
+msgid "Calendars"
+msgstr "Календари"
+
+msgctxt "model:ir.ui.menu,name:menu_event_form"
+msgid "Events"
+msgstr "События"
+
+msgctxt "model:res.group,name:group_calendar_admin"
+msgid "Calendar Administration"
+msgstr "Управление календарем"
+
+#, fuzzy
+msgctxt "selection:calendar.attendee,status:0"
+msgid ""
+msgstr "Резервный счет"
+
+msgctxt "selection:calendar.attendee,status:0"
+msgid "Accepted"
+msgstr "Подтверждено"
+
+msgctxt "selection:calendar.attendee,status:0"
+msgid "Declined"
+msgstr "Отклонено"
+
+msgctxt "selection:calendar.attendee,status:0"
+msgid "Delegated"
+msgstr "Делегировано"
+
+msgctxt "selection:calendar.attendee,status:0"
+msgid "Needs Action"
+msgstr "Требуется действие"
+
+msgctxt "selection:calendar.attendee,status:0"
+msgid "Tentative"
+msgstr "Предварительный"
+
+msgctxt "selection:calendar.event,classification:0"
+msgid "Confidential"
+msgstr "Конфиденциальное"
+
+msgctxt "selection:calendar.event,classification:0"
+msgid "Private"
+msgstr "Личное"
+
+msgctxt "selection:calendar.event,classification:0"
+msgid "Public"
+msgstr "Публичное"
+
+#, fuzzy
+msgctxt "selection:calendar.event,status:0"
+msgid ""
+msgstr "Резервный счет"
+
+msgctxt "selection:calendar.event,status:0"
+msgid "Cancelled"
+msgstr "Отмененно"
+
+msgctxt "selection:calendar.event,status:0"
+msgid "Confirmed"
+msgstr "Подтвержденно"
+
+msgctxt "selection:calendar.event,status:0"
+msgid "Tentative"
+msgstr "Предварительный"
+
+msgctxt "selection:calendar.event,transp:0"
+msgid "Opaque"
+msgstr "Непрозрачный"
+
+msgctxt "selection:calendar.event,transp:0"
+msgid "Transparent"
+msgstr "Прозрачный"
+
+msgctxt "selection:calendar.rrule,freq:0"
+msgid "Daily"
+msgstr "Ежедневный"
+
+msgctxt "selection:calendar.rrule,freq:0"
+msgid "Hourly"
+msgstr "Ежечасный"
+
+msgctxt "selection:calendar.rrule,freq:0"
+msgid "Minutely"
+msgstr "Ежеминутно"
+
+msgctxt "selection:calendar.rrule,freq:0"
+msgid "Monthly"
+msgstr "Ежемесячно"
+
+msgctxt "selection:calendar.rrule,freq:0"
+msgid "Secondly"
+msgstr "Ежесекудно"
+
+msgctxt "selection:calendar.rrule,freq:0"
+msgid "Weekly"
+msgstr "Еженедельно"
+
+msgctxt "selection:calendar.rrule,freq:0"
+msgid "Yearly"
+msgstr "Ежегодно"
+
+msgctxt "selection:calendar.rrule,wkst:0"
+msgid "Friday"
+msgstr "Пятница"
+
+msgctxt "selection:calendar.rrule,wkst:0"
+msgid "Monday"
+msgstr "Понедельник"
+
+msgctxt "selection:calendar.rrule,wkst:0"
+msgid "Saturday"
+msgstr "Суббота"
+
+msgctxt "selection:calendar.rrule,wkst:0"
+msgid "Sunday"
+msgstr "Воскресенье"
+
+msgctxt "selection:calendar.rrule,wkst:0"
+msgid "Thursday"
+msgstr "Четверг"
+
+msgctxt "selection:calendar.rrule,wkst:0"
+msgid "Tuesday"
+msgstr "Вторник"
+
+msgctxt "selection:calendar.rrule,wkst:0"
+msgid "Wednesday"
+msgstr "Среда"
+
+msgctxt "view:calendar.calendar:0"
+msgid "Calendar"
+msgstr "Календарь"
+
+msgctxt "view:calendar.calendar:0"
+msgid "Calendars"
+msgstr "Календари"
+
+msgctxt "view:calendar.calendar:0"
+msgid "General"
+msgstr "Основной"
+
+msgctxt "view:calendar.calendar:0"
+msgid "Security"
+msgstr "Доступ"
+
+msgctxt "view:calendar.category:0"
+msgid "Categories"
+msgstr "Категория"
+
+msgctxt "view:calendar.category:0"
+msgid "Category"
+msgstr "Категории"
+
+msgctxt "view:calendar.event.attendee:0"
+msgid "Attendee"
+msgstr "Участник"
+
+msgctxt "view:calendar.event.attendee:0"
+msgid "Attendees"
+msgstr "Участники"
+
+msgctxt "view:calendar.event.exdate:0"
+msgid "Exception Date"
+msgstr "Дата исключения"
+
+msgctxt "view:calendar.event.exdate:0"
+msgid "Exception Dates"
+msgstr "Дата исключения"
+
+msgctxt "view:calendar.event.exrule:0"
+msgid "Exception Rule"
+msgstr "Правило исключения"
+
+msgctxt "view:calendar.event.exrule:0"
+msgid "Exception Rules"
+msgstr "Правила исключения"
+
+msgctxt "view:calendar.event.rdate:0"
+msgid "Recurrence Date"
+msgstr "Даты повторения"
+
+msgctxt "view:calendar.event.rdate:0"
+msgid "Recurrence Dates"
+msgstr "Даты повторения"
+
+msgctxt "view:calendar.event.rrule:0"
+msgid "Recurrence Rule"
+msgstr "Правила повторения"
+
+msgctxt "view:calendar.event.rrule:0"
+msgid "Recurrence Rules"
+msgstr "Правила повторения"
+
+msgctxt "view:calendar.event:0"
+msgid "Attendees"
+msgstr "Участники"
+
+msgctxt "view:calendar.event:0"
+msgid "Categories"
+msgstr "Категория"
+
+msgctxt "view:calendar.event:0"
+msgid "Event"
+msgstr "Событие"
+
+msgctxt "view:calendar.event:0"
+msgid "Events"
+msgstr "События"
+
+msgctxt "view:calendar.event:0"
+msgid "General"
+msgstr "Основной"
+
+msgctxt "view:calendar.event:0"
+msgid "Occurences"
+msgstr "Повторение"
+
+msgctxt "view:calendar.location:0"
+msgid "Location"
+msgstr "Местоположение"
+
+msgctxt "view:calendar.location:0"
+msgid "Locations"
+msgstr "Местоположения"
diff --git a/res.py b/res.py
index 2329f67..82c8925 100644
--- a/res.py
+++ b/res.py
@@ -2,7 +2,7 @@
 #this repository contains the full copyright notices and license terms.
 import copy
 from trytond.model import ModelView, ModelSQL, fields
-from trytond.pyson import Bool, Eval, Or
+from trytond.pyson import Bool, Eval
 
 
 class User(ModelSQL, ModelView):
@@ -19,9 +19,8 @@ class User(ModelSQL, ModelView):
         if not self.email.states.get('required'):
             self.email.states['required'] = required
         else:
-            self.email.states['required'] = \
-                    Or(self.email.states['required'],
-                            required)
+            self.email.states['required'] = (
+                self.email.states['required'] | required)
         if 'calendars' not in self.email.depends:
             self.email.depends.append('calendars')
 
diff --git a/ru_RU.csv b/ru_RU.csv
deleted file mode 100644
index 5a6e85f..0000000
--- a/ru_RU.csv
+++ /dev/null
@@ -1,202 +0,0 @@
-type,name,res_id,src,value,fuzzy
-error,calendar.calendar,0,A user can have only one calendar!,Пользователь может иметь только Один календарь!,0
-error,calendar.calendar,0,The name of calendar must be unique!,Имя календаря должно быть уникально,0
-error,calendar.category,0,The name of calendar category must be unique!,,0
-error,calendar.event,0,Recurrence can not be recurrent!,,0
-error,calendar.event,0,UUID and recurrence must be unique in a calendar!,,0
-error,calendar.location,0,The name of calendar location must be unique!,,0
-error,calendar.rrule,0,"Invalid ""By Day""","Неверное поле ""По дням""",0
-error,calendar.rrule,0,"Invalid ""By Hour""","Неверное поле ""По часам""",0
-error,calendar.rrule,0,"Invalid ""By Minute""","Неверное поле ""По минутам""",0
-error,calendar.rrule,0,"Invalid ""By Month Day""","Неверное поле ""По дням месяца""",0
-error,calendar.rrule,0,"Invalid ""By Month""","Неверное поле ""По месяцам""",0
-error,calendar.rrule,0,"Invalid ""By Position""","Неверное поле ""По позиции""",0
-error,calendar.rrule,0,"Invalid ""By Second""","Неверное поле ""По секундам""",0
-error,calendar.rrule,0,"Invalid ""By Week Number""","Неверное поле ""По номерам недель""",0
-error,calendar.rrule,0,"Invalid ""By Year Day""","Неверный ""По дням года""",0
-error,calendar.rrule,0,"Only one of ""until"" and ""count"" can be set!",,0
-field,"calendar.alarm,rec_name",0,Name,Наименование,0
-field,"calendar.alarm,valarm",0,valarm,,0
-field,"calendar.attendee,attendee",0,attendee,участник,0
-field,"calendar.attendee,email",0,Email,Эл.почта,0
-field,"calendar.attendee,rec_name",0,Name,Наименование,0
-field,"calendar.attendee,status",0,Participation Status,Статус участия,0
-field,"calendar.calendar,description",0,Description,Описание,0
-field,"calendar.calendar,name",0,Name,Наименование,0
-field,"calendar.calendar,owner",0,Owner,Владелец,0
-field,"calendar.calendar,read_users",0,Read Users,Пользователи могут читать,0
-field,"calendar.calendar,rec_name",0,Name,Наименование,0
-field,"calendar.calendar,write_users",0,Write Users,Пользователи могут писать,0
-field,"calendar.calendar-read-res.user,calendar",0,Calendar,Календар,0
-field,"calendar.calendar-read-res.user,rec_name",0,Name,Наименование,0
-field,"calendar.calendar-read-res.user,user",0,User,Пользователь,0
-field,"calendar.calendar-write-res.user,calendar",0,Calendar,Календарь,0
-field,"calendar.calendar-write-res.user,rec_name",0,Name,Наименование,0
-field,"calendar.calendar-write-res.user,user",0,User,Пользователь,0
-field,"calendar.category,name",0,Name,Наименование,0
-field,"calendar.category,rec_name",0,Name,Наименование,0
-field,"calendar.date,date",0,Is Date,Весь день,0
-field,"calendar.date,datetime",0,Date,Дата,0
-field,"calendar.date,rec_name",0,Name,Наименование,0
-field,"calendar.event,alarms",0,Alarms,Вызовы,0
-field,"calendar.event,all_day",0,All Day,Все дни,0
-field,"calendar.event,attendees",0,Attendees,Участники,0
-field,"calendar.event,calendar",0,Calendar,Календарь,0
-field,"calendar.event,calendar_owner",0,Owner,Владелец,0
-field,"calendar.event,calendar_read_users",0,Read Users,Пользователи могут читать,0
-field,"calendar.event,calendar_write_users",0,Write Users,Пользователи могут писать,0
-field,"calendar.event,categories",0,Categories,Категория,0
-field,"calendar.event,classification",0,Classification,Классификация,0
-field,"calendar.event,classification_public",0,Classification Public,Классификация общая,0
-field,"calendar.event,description",0,Description,Описание,0
-field,"calendar.event,dtend",0,End Date,Дата окончания,0
-field,"calendar.event,dtstart",0,Start Date,Дата начала,0
-field,"calendar.event,exdates",0,Exception Dates,Дата исключения,0
-field,"calendar.event,exrules",0,Exception Rules,Правила исключения,0
-field,"calendar.event,location",0,Location,Местоположение,0
-field,"calendar.event,occurences",0,Occurences,Дополнительные задачи,0
-field,"calendar.event,organizer",0,Organizer,Организатор,0
-field,"calendar.event,parent",0,Parent,Основной,0
-field,"calendar.event,rdates",0,Recurrence Dates,Даты повторения,0
-field,"calendar.event,rec_name",0,Name,Наименование,0
-field,"calendar.event,recurrence",0,Recurrence,Повторение,0
-field,"calendar.event,rrules",0,Recurrence Rules,Правила повторения,0
-field,"calendar.event,sequence",0,Sequence,Последовательность,0
-field,"calendar.event,status",0,Status,Состояние,0
-field,"calendar.event,summary",0,Summary,Резюме,0
-field,"calendar.event,timezone",0,Timezone,Зона времени,0
-field,"calendar.event,transp",0,Time Transparency,Время Прозрачность,0
-field,"calendar.event,uuid",0,UUID,,0
-field,"calendar.event,vevent",0,vevent,,0
-field,"calendar.event-calendar.category,category",0,Category,Категории,0
-field,"calendar.event-calendar.category,event",0,Event,Событие,0
-field,"calendar.event-calendar.category,rec_name",0,Name,Наименование,0
-field,"calendar.event.alarm,calendar_alarm",0,Calendar Alarm,Сигнала календаря,0
-field,"calendar.event.alarm,event",0,Event,Событие,0
-field,"calendar.event.alarm,rec_name",0,Name,Наименование,0
-field,"calendar.event.attendee,calendar_attendee",0,Calendar Attendee,Календарь участников,0
-field,"calendar.event.attendee,event",0,Event,Событие,0
-field,"calendar.event.attendee,rec_name",0,Name,Наименование,0
-field,"calendar.event.exdate,calendar_date",0,Calendar Date,День календаря,0
-field,"calendar.event.exdate,calendar_rdate",0,Calendar RDate,День календаря,0
-field,"calendar.event.exdate,event",0,Event,Событие,0
-field,"calendar.event.exdate,rec_name",0,Name,Наименование,0
-field,"calendar.event.exrule,calendar_rrule",0,Calendar RRule,Правила календаря,0
-field,"calendar.event.exrule,event",0,Event,Событие,0
-field,"calendar.event.exrule,rec_name",0,Name,Наименование,0
-field,"calendar.event.rdate,calendar_date",0,Calendar Date,День календаря,0
-field,"calendar.event.rdate,calendar_rdate",0,Calendar RDate,День календаря,0
-field,"calendar.event.rdate,event",0,Event,Событие,0
-field,"calendar.event.rdate,rec_name",0,Name,Наименование,0
-field,"calendar.event.rrule,calendar_rrule",0,Calendar RRule,Правила календаря,0
-field,"calendar.event.rrule,event",0,Event,Событие,0
-field,"calendar.event.rrule,rec_name",0,Name,Наименование,0
-field,"calendar.location,name",0,Name,Наименование,0
-field,"calendar.location,rec_name",0,Name,Наименование,0
-field,"calendar.rdate,date",0,Is Date,Весь день,0
-field,"calendar.rdate,datetime",0,Date,Дата,0
-field,"calendar.rdate,rec_name",0,Name,Наименование,0
-field,"calendar.rrule,byday",0,By Day,По дням,0
-field,"calendar.rrule,byhour",0,By Hour,По часам,0
-field,"calendar.rrule,byminute",0,By Minute,По минутам,0
-field,"calendar.rrule,bymonth",0,By Month,По месячно,0
-field,"calendar.rrule,bymonthday",0,By Month Day,По дням месяца,0
-field,"calendar.rrule,bysecond",0,By Second,По секундам,0
-field,"calendar.rrule,bysetpos",0,By Position,По позиции,0
-field,"calendar.rrule,byweekno",0,By Week Number,По номерам недель,0
-field,"calendar.rrule,byyearday",0,By Year Day,По дням года,0
-field,"calendar.rrule,count",0,Count,Количество,0
-field,"calendar.rrule,freq",0,Frequency,Частота,0
-field,"calendar.rrule,interval",0,Interval,Внутренний,0
-field,"calendar.rrule,rec_name",0,Name,Наименование,0
-field,"calendar.rrule,until",0,Until Date,До даты,0
-field,"calendar.rrule,until_date",0,Is Date,Весь день,0
-field,"calendar.rrule,wkst",0,Week Day,День недели,0
-field,"res.user,calendars",0,Calendars,Календари,0
-help,"calendar.calendar,owner",0,The user must have an email,,0
-help,"calendar.date,date",0,"Ignore time of field ""Date"", but handle as date only.","Время игнорируется в поле ""Дата"", действует только дата",0
-help,"calendar.event,uuid",0,Universally Unique Identifier,Универсальный уникальный идентификатор,0
-help,"calendar.rdate,date",0,"Ignore time of field ""Date"", but handle as date only.","Время игнорируется в поле ""Дата"", действует только дата",0
-help,"calendar.rrule,until_date",0,"Ignore time of field ""Until Date"", but handle as date only.","Время игнорируется в поле ""До даты"", действует только дата",0
-model,"calendar.alarm,name",0,Alarm,Вызов,0
-model,"calendar.attendee,name",0,Attendee,Участник,0
-model,"calendar.calendar,name",0,Calendar,Календарь,0
-model,"calendar.calendar-read-res.user,name",0,Calendar - read - User,Пользователи могут читать,0
-model,"calendar.calendar-write-res.user,name",0,Calendar - write - User,Пользователи могут писать,0
-model,"calendar.category,name",0,Category,Категории,0
-model,"calendar.date,name",0,Calendar Date,День календаря,0
-model,"calendar.event,name",0,Event,Событие,0
-model,"calendar.event-calendar.category,name",0,Event - Category,Категории - События,0
-model,"calendar.event.alarm,name",0,Alarm,Вызов,0
-model,"calendar.event.attendee,name",0,Attendee,Участник,0
-model,"calendar.event.exdate,name",0,Exception Date,Дата исключения,0
-model,"calendar.event.exrule,name",0,Exception Rule,Правило исключения,0
-model,"calendar.event.rdate,name",0,Recurrence Date,Даты повторения,0
-model,"calendar.event.rrule,name",0,Recurrence Rule,Правила повторения,0
-model,"calendar.location,name",0,Location,Местоположение,0
-model,"calendar.rdate,name",0,Recurrence Date,Даты повторения,0
-model,"calendar.rrule,name",0,Recurrence Rule,Правила повторения,0
-model,"ir.action,name",act_calendar_form,Calendars,Календари,0
-model,"ir.action,name",act_calendar_form2,Calendars,Календари,0
-model,"ir.action,name",act_event_form,Events,,0
-model,"ir.action,name",act_event_form2,Events,,0
-model,"ir.action,name",act_event_form3,Events,,0
-model,"ir.ui.menu,name",menu_calendar,Calendar Management,Календари,0
-model,"ir.ui.menu,name",menu_calendar_form,Calendars,Календари,0
-model,"ir.ui.menu,name",menu_calendar_form2,New Calendar,Новый календарь,0
-model,"ir.ui.menu,name",menu_event_form,Events,События,0
-model,"ir.ui.menu,name",menu_event_form2,New Event,Новое событие,0
-model,"res.group,name",group_calendar_admin,Calendar Administration,Управление календарем,0
-selection,"calendar.attendee,status",0,,,0
-selection,"calendar.attendee,status",0,Accepted,Подтверждено,0
-selection,"calendar.attendee,status",0,Declined,Отклонено,0
-selection,"calendar.attendee,status",0,Delegated,Делегировано,0
-selection,"calendar.attendee,status",0,Needs Action,Требуется действие,0
-selection,"calendar.attendee,status",0,Tentative,Предварительный,0
-selection,"calendar.event,classification",0,Confidential,Конфиденциальное,0
-selection,"calendar.event,classification",0,Private,Личное,0
-selection,"calendar.event,classification",0,Public,Публичное,0
-selection,"calendar.event,status",0,,,0
-selection,"calendar.event,status",0,Cancelled,Отмененно,0
-selection,"calendar.event,status",0,Confirmed,Подтвержденно,0
-selection,"calendar.event,status",0,Tentative,Предварительный,0
-selection,"calendar.event,transp",0,Opaque,Непрозрачный,0
-selection,"calendar.event,transp",0,Transparent,Прозрачный,0
-selection,"calendar.rrule,freq",0,Daily,Ежедневный,0
-selection,"calendar.rrule,freq",0,Hourly,Ежечасный,0
-selection,"calendar.rrule,freq",0,Minutely,Ежеминутно,0
-selection,"calendar.rrule,freq",0,Monthly,Ежемесячно,0
-selection,"calendar.rrule,freq",0,Secondly,Ежесекудно,0
-selection,"calendar.rrule,freq",0,Weekly,Еженедельно,0
-selection,"calendar.rrule,freq",0,Yearly,Ежегодно,0
-selection,"calendar.rrule,wkst",0,Friday,Пятница,0
-selection,"calendar.rrule,wkst",0,Monday,Понедельник,0
-selection,"calendar.rrule,wkst",0,Saturday,Суббота,0
-selection,"calendar.rrule,wkst",0,Sunday,Воскресенье,0
-selection,"calendar.rrule,wkst",0,Thursday,Четверг,0
-selection,"calendar.rrule,wkst",0,Tuesday,Вторник,0
-selection,"calendar.rrule,wkst",0,Wednesday,Среда,0
-view,calendar.calendar,0,Calendar,Календарь,0
-view,calendar.calendar,0,Calendars,Календари,0
-view,calendar.calendar,0,General,Основной,0
-view,calendar.calendar,0,Security,Доступ,0
-view,calendar.category,0,Categories,Категория,0
-view,calendar.category,0,Category,Категории,0
-view,calendar.event,0,Attendees,Участники,0
-view,calendar.event,0,Categories,Категория,0
-view,calendar.event,0,Event,Событие,0
-view,calendar.event,0,Events,События,0
-view,calendar.event,0,General,Основной,0
-view,calendar.event,0,Occurences,Повторение,0
-view,calendar.event.attendee,0,Attendee,Участник,0
-view,calendar.event.attendee,0,Attendees,Участники,0
-view,calendar.event.exdate,0,Exception Date,Дата исключения,0
-view,calendar.event.exdate,0,Exception Dates,Дата исключения,0
-view,calendar.event.exrule,0,Exception Rule,Правило исключения,0
-view,calendar.event.exrule,0,Exception Rules,Правила исключения,0
-view,calendar.event.rdate,0,Recurrence Date,Даты повторения,0
-view,calendar.event.rdate,0,Recurrence Dates,Даты повторения,0
-view,calendar.event.rrule,0,Recurrence Rule,Правила повторения,0
-view,calendar.event.rrule,0,Recurrence Rules,Правила повторения,0
-view,calendar.location,0,Location,Местоположение,0
-view,calendar.location,0,Locations,Местоположения,0
diff --git a/setup.py b/setup.py
index 50e3711..94fef71 100644
--- a/setup.py
+++ b/setup.py
@@ -39,25 +39,30 @@ setup(name='trytond_calendar',
     classifiers=[
         'Development Status :: 5 - Production/Stable',
         'Environment :: Plugins',
+        'Framework :: Tryton',
         'Intended Audience :: Developers',
         'Intended Audience :: Financial and Insurance Industry',
         'Intended Audience :: Legal Industry',
         'Intended Audience :: Manufacturing',
         'License :: OSI Approved :: GNU General Public License (GPL)',
         'Natural Language :: Bulgarian',
+        'Natural Language :: Czech',
+        'Natural Language :: Dutch',
         'Natural Language :: English',
         'Natural Language :: French',
         'Natural Language :: German',
         'Natural Language :: Russian',
         'Natural Language :: Spanish',
         'Operating System :: OS Independent',
-        'Programming Language :: Python :: 2.5',
         'Programming Language :: Python :: 2.6',
         'Programming Language :: Python :: 2.7',
         'Topic :: Office/Business',
     ],
     license='GPL-3',
     install_requires=requires,
+    extras_require={
+        'test': ['caldav'],
+    },
     zip_safe=False,
     entry_points="""
     [trytond.modules]
diff --git a/tests/__init__.pyc b/tests/__init__.pyc
deleted file mode 100644
index b370054..0000000
Binary files a/tests/__init__.pyc and /dev/null differ
diff --git a/tests/scenario_calendar.py b/tests/scenario_calendar.py
new file mode 100644
index 0000000..649e47e
--- /dev/null
+++ b/tests/scenario_calendar.py
@@ -0,0 +1,174 @@
+#!/usr/bin/env python
+#This file is part of Tryton.  The COPYRIGHT file at the top level of
+#this repository contains the full copyright notices and license terms.
+from optparse import OptionParser
+from urlparse import urlparse
+import unittest
+import sys
+import datetime
+
+from dateutil.relativedelta import relativedelta
+import caldav
+import vobject
+from proteus import config, Model, Wizard
+
+def install_module(name, config):
+    Module = Model.get('ir.module.module')
+    module, = Module.find([('name', '=', name)])
+    if module.state != 'installed':
+        Module.button_install([module.id], config.context)
+        Wizard('ir.module.module.install_upgrade').execute('start')
+
+def configure_user(login, config):
+    User = Model.get('res.user')
+    users = User.find([('login', '=', login)])
+    email = '%s at example.com' % login
+    if not users:
+        User(login=login, name=login, email=email).save()
+    else:
+        user, = users
+        user.email = email
+        user.save()
+
+def create_calendar(login, user, config):
+    Calendar = Model.get('calendar.calendar')
+    User = Model.get('res.user')
+    current_user, = User.find([('login', '=', login)])
+    main_user, = User.find([('login', '=', user)])
+    for calendar in Calendar.find([('owner', '=', login)]):
+        calendar.write_users.append(User(main_user.id))
+        calendar.save()
+        calendar.delete()
+    calendar = Calendar(name=login, owner=current_user)
+    if login != 'bar':
+        calendar.read_users.append(main_user)
+    calendar.save()
+
+
+class TestCase(unittest.TestCase):
+
+    def setUp(self):
+        self.client = caldav.DAVClient(URL)
+        self.principal = caldav.Principal(self.client, URL)
+        self.calendar, = [x for x in self.principal.calendars()
+            if x.url.path.endswith(user)]
+
+    def test0010calendar(self):
+        'Test calendar'
+        calendar, _ = self.principal.calendars()
+
+    def test0020create_event(self):
+        'Create event'
+        ical = vobject.iCalendar()
+        vevent = ical.add('vevent')
+        vevent.add('summary')
+        vevent.summary.value = 'Test event'
+        vevent.add('dtstart')
+        vevent.dtstart.value = datetime.datetime.now() + relativedelta(months=1)
+        vevent.add('dtend')
+        vevent.dtend.value = datetime.datetime.now() + relativedelta(months=1,
+            hours=1)
+        caldav.Event(self.client, data=ical.serialize(),
+            parent=self.calendar).save()
+
+    def test0030search_event(self):
+        'Search date'
+        events = self.calendar.date_search(datetime.datetime.now(),
+            datetime.datetime.now() + relativedelta(months=2))
+        self.assertEqual(len(events), 1)
+        events = self.calendar.date_search(
+            datetime.datetime.now() - relativedelta(months=1),
+            datetime.datetime.now())
+        self.assertEqual(len(events), 0)
+
+    def test0040get_event(self):
+        'Get event'
+        event = self.calendar.events()[0]
+        event.load()
+        self.assertEqual(event.url, self.calendar.event(event.id).url)
+
+    def test0050create_event_attendee(self):
+        'Create event with attendee'
+        ical = vobject.iCalendar()
+        vevent = ical.add('vevent')
+        vevent.add('summary')
+        vevent.summary.value = 'Test event with attendee'
+        vevent.add('dtstart')
+        vevent.dtstart.value = datetime.datetime.now() + relativedelta(days=10)
+        vevent.add('dtend')
+        vevent.dtend.value = datetime.datetime.now() + relativedelta(days=10,
+            hours=4)
+        vevent.add('organizer')
+        vevent.organizer.value = '%s at example.com' % user
+        attendees = []
+        for name in ('foo', 'bar'):
+            attendee = vobject.base.ContentLine('ATTENDEE', [], '')
+            attendee.partstat_param = 'TENTATIVE'
+            attendee.value = 'MAILTO:%s at example.com' % name
+            attendees.append(attendee)
+        vevent.attendee_list = attendees
+        event = caldav.Event(self.client, data=ical.serialize(),
+            parent=self.calendar).save()
+
+        Event = Model.get('calendar.event')
+        owner_event, = Event.find([
+                ('calendar.owner.email', '=', '%s at example.com' % user),
+                ('summary', '=', vevent.summary.value),
+                ])
+        attendee_event, = Event.find([
+                ('calendar.owner.email', '=', 'foo at example.com'),
+                ])
+        self.assertEqual(attendee_event.uuid, owner_event.uuid)
+
+    def test0060update_attendee_status(self):
+        'Update status of attendee'
+        for event in self.calendar.events():
+            event.load()
+            if event.instance.vevent.summary.value == 'Test event with attendee':
+                break
+        for attendee in event.instance.vevent.attendee_list:
+            attendee.partstat_param = 'accepted'
+        event.save()
+
+        Event = Model.get('calendar.event')
+        attendee_event, = Event.find([
+                ('calendar.owner.email', '=', 'foo at example.com'),
+                ])
+        for attendee in attendee_event.attendees:
+            self.assertEqual(attendee.status, 'accepted')
+
+    def test0070delete_attendee(self):
+        'Delete attendee'
+        for event in self.calendar.events():
+            event.load()
+            if event.instance.vevent.summary.value == 'Test event with attendee':
+                break
+        event.instance.vevent.attendee_list = []
+        event.save()
+
+        Event = Model.get('calendar.event')
+        self.assertEqual(Event.find([
+                    ('calendar.owner.email', '=', 'foo at example.com'),
+                    ]), [])
+
+if __name__ == '__main__':
+    parser = OptionParser()
+    parser.add_option('--xmlrpc', dest='xmlrpc', metavar='URL',
+        help='use trytond XML-RPC at URL')
+    parser.add_option('--url', dest='url', metavar='URL',
+        help='use calendar at URL')
+    (options, args) = parser.parse_args()
+    config = config.set_xmlrpc(options.xmlrpc)
+    xmlrpc_user = urlparse(options.xmlrpc).username
+    user = urlparse(options.url).username
+    assert xmlrpc_user == user
+    assert user != 'foo'
+    install_module('calendar', config)
+    configure_user(user, config)
+    configure_user('foo', config)
+    configure_user('bar', config)
+    create_calendar(user, user, config)
+    create_calendar('foo', user, config)
+    create_calendar('bar', user, config)
+    URL = options.url
+    unittest.main(argv=sys.argv[:1])
diff --git a/tests/test_calendar.py b/tests/test_calendar.py
index cc80b0a..207654b 100644
--- a/tests/test_calendar.py
+++ b/tests/test_calendar.py
@@ -10,7 +10,7 @@ if os.path.isdir(DIR):
 
 import unittest
 import trytond.tests.test_tryton
-from trytond.tests.test_tryton import test_view
+from trytond.tests.test_tryton import test_view, test_depends
 
 
 class CalendarTestCase(unittest.TestCase):
@@ -27,6 +27,12 @@ class CalendarTestCase(unittest.TestCase):
         '''
         test_view('calendar')
 
+    def test0006depends(self):
+        '''
+        Test depends.
+        '''
+        test_depends()
+
 def suite():
     suite = trytond.tests.test_tryton.suite()
     suite.addTests(unittest.TestLoader().loadTestsFromTestCase(
diff --git a/tests/test_calendar.pyc b/tests/test_calendar.pyc
deleted file mode 100644
index 02dbc50..0000000
Binary files a/tests/test_calendar.pyc and /dev/null differ
diff --git a/trytond_calendar.egg-info/PKG-INFO b/trytond_calendar.egg-info/PKG-INFO
index 3a458b7..7a50dec 100644
--- a/trytond_calendar.egg-info/PKG-INFO
+++ b/trytond_calendar.egg-info/PKG-INFO
@@ -1,29 +1,31 @@
 Metadata-Version: 1.0
 Name: trytond-calendar
-Version: 2.0.0
+Version: 2.2.0
 Summary: Add CalDAV support
 Home-page: http://www.tryton.org/
 Author: B2CK
 Author-email: info at b2ck.com
 License: GPL-3
-Download-URL: http://downloads.tryton.org/2.0/
+Download-URL: http://downloads.tryton.org/2.2/
 Description: UNKNOWN
 Platform: UNKNOWN
 Classifier: Development Status :: 5 - Production/Stable
 Classifier: Environment :: Plugins
+Classifier: Framework :: Tryton
 Classifier: Intended Audience :: Developers
 Classifier: Intended Audience :: Financial and Insurance Industry
 Classifier: Intended Audience :: Legal Industry
 Classifier: Intended Audience :: Manufacturing
 Classifier: License :: OSI Approved :: GNU General Public License (GPL)
 Classifier: Natural Language :: Bulgarian
+Classifier: Natural Language :: Czech
+Classifier: Natural Language :: Dutch
 Classifier: Natural Language :: English
 Classifier: Natural Language :: French
 Classifier: Natural Language :: German
 Classifier: Natural Language :: Russian
 Classifier: Natural Language :: Spanish
 Classifier: Operating System :: OS Independent
-Classifier: Programming Language :: Python :: 2.5
 Classifier: Programming Language :: Python :: 2.6
 Classifier: Programming Language :: Python :: 2.7
 Classifier: Topic :: Office/Business
diff --git a/trytond_calendar.egg-info/SOURCES.txt b/trytond_calendar.egg-info/SOURCES.txt
index de3adb7..24835cd 100644
--- a/trytond_calendar.egg-info/SOURCES.txt
+++ b/trytond_calendar.egg-info/SOURCES.txt
@@ -4,13 +4,7 @@ INSTALL
 LICENSE
 MANIFEST.in
 README
-bg_BG.csv
 calendar.xml
-de_DE.csv
-es_CO.csv
-es_ES.csv
-fr_FR.csv
-ru_RU.csv
 setup.py
 ./__init__.py
 ./__tryton__.py
@@ -19,11 +13,16 @@ setup.py
 ./res.py
 ./webdav.py
 ./tests/__init__.py
+./tests/scenario_calendar.py
 ./tests/test_calendar.py
-tests/__init__.py
-tests/__init__.pyc
-tests/test_calendar.py
-tests/test_calendar.pyc
+locale/bg_BG.po
+locale/cs_CZ.po
+locale/de_DE.po
+locale/es_CO.po
+locale/es_ES.po
+locale/fr_FR.po
+locale/nl_NL.po
+locale/ru_RU.po
 trytond_calendar.egg-info/PKG-INFO
 trytond_calendar.egg-info/SOURCES.txt
 trytond_calendar.egg-info/dependency_links.txt
diff --git a/trytond_calendar.egg-info/requires.txt b/trytond_calendar.egg-info/requires.txt
index ccd0e32..fe966b1 100644
--- a/trytond_calendar.egg-info/requires.txt
+++ b/trytond_calendar.egg-info/requires.txt
@@ -2,4 +2,7 @@ vobject >= 0.8.0
 PyWebDAV >= 0.9.3
 python-dateutil
 pytz
-trytond >= 2.0, < 2.1
\ No newline at end of file
+trytond >= 2.2, < 2.3
+
+[test]
+caldav
\ No newline at end of file
diff --git a/webdav.py b/webdav.py
index 62b7e0b..03186fe 100644
--- a/webdav.py
+++ b/webdav.py
@@ -7,9 +7,41 @@ from trytond.model import ModelView, ModelSQL
 from trytond.tools import reduce_ids
 from trytond.cache import Cache
 from trytond.transaction import Transaction
+from trytond.pool import Pool
 
 CALDAV_NS = 'urn:ietf:params:xml:ns:caldav'
 
+def _comp_filter_domain(dtstart, dtend):
+    return ['OR',
+        [
+            ['OR',
+                [('dtstart', '<=', dtstart),
+                    ('dtend', '>=', dtstart)],
+                [('dtstart', '<=', dtend),
+                    ('dtend', '>=', dtend)],
+                [('dtstart', '>=', dtstart),
+                    ('dtend', '<=', dtend)],
+                [('dtstart', '>=', dtstart),
+                    ('dtstart', '<=', dtend),
+                    ('dtend', '=', False)]],
+            ('parent', '=', False),
+            ('rdates', '=', False),
+            ('rrules', '=', False),
+            ('exdates', '=', False),
+            ('exrules', '=', False),
+            ('occurences', '=', False),
+            ],
+        [ #TODO manage better recurring event
+            ('parent', '=', False),
+            ('dtstart', '<=', dtend),
+            ['OR',
+                ('rdates', '!=', False),
+                ('rrules', '!=', False),
+                ('exdates', '!=', False),
+                ('exrules', '!=', False),
+                ('occurences', '!=', False),
+                ]
+            ]]
 
 class Collection(ModelSQL, ModelView):
 
@@ -23,7 +55,7 @@ class Collection(ModelSQL, ModelView):
         :return: calendar id
             or False if there is no calendar
         '''
-        calendar_obj = self.pool.get('calendar.calendar')
+        calendar_obj = Pool().get('calendar.calendar')
 
         if uri and uri.startswith('Calendars/'):
             calendar, uri = (uri[10:].split('/', 1) + [None])[0:2]
@@ -45,7 +77,7 @@ class Collection(ModelSQL, ModelView):
         :return: event id
             or False if there is no event
         '''
-        event_obj = self.pool.get('calendar.event')
+        event_obj = Pool().get('calendar.event')
 
         if uri and uri.startswith('Calendars/'):
             calendar, event_uri = (uri[10:].split('/', 1) + [None])[0:2]
@@ -88,6 +120,7 @@ class Collection(ModelSQL, ModelView):
         if filter.localName == 'principal-property-search':
             return [('id', '=', 0)]
         elif filter.localName == 'calendar-query':
+            result = []
             calendar_filter = None
             for e in filter.childNodes:
                 if e.nodeType == e.TEXT_NODE:
@@ -111,11 +144,19 @@ class Collection(ModelSQL, ModelView):
                         if vevent_filter.getAttribute('name') != 'VEVENT':
                             vevent_filter = None
                             continue
+                        for comp_filter in vevent_filter.childNodes:
+                            if comp_filter.localName != 'time-range':
+                                continue
+                            start = comp_filter.getAttribute('start')
+                            start = vobject.icalendar.stringToDateTime(start)
+                            end = comp_filter.getAttribute('end')
+                            end = vobject.icalendar.stringToDateTime(end)
+                            result.append(_comp_filter_domain(start, end))
                         break
                 if vevent_filter is None:
                     return [('id', '=', 0)]
                 break
-            return []
+            return result
         elif filter.localName == 'calendar-multiget':
             ids = []
             for e in filter.childNodes:
@@ -140,8 +181,8 @@ class Collection(ModelSQL, ModelView):
         return res
 
     def get_childs(self, uri, filter=None, cache=None):
-        calendar_obj = self.pool.get('calendar.calendar')
-        event_obj = self.pool.get('calendar.event')
+        calendar_obj = Pool().get('calendar.calendar')
+        event_obj = Pool().get('calendar.event')
 
         if uri in ('Calendars', 'Calendars/'):
             domain = self._caldav_filter_domain_calendar(filter)
@@ -195,7 +236,7 @@ class Collection(ModelSQL, ModelView):
         return super(Collection, self).get_resourcetype(uri, cache=cache)
 
     def get_displayname(self, uri, cache=None):
-        calendar_obj = self.pool.get('calendar.calendar')
+        calendar_obj = Pool().get('calendar.calendar')
         if uri in ('Calendars', 'Calendars/'):
             return 'Calendars'
         calendar_id = self.calendar(uri)
@@ -214,8 +255,8 @@ class Collection(ModelSQL, ModelView):
         return super(Collection, self).get_contenttype(uri, cache=cache)
 
     def get_creationdate(self, uri, cache=None):
-        calendar_obj = self.pool.get('calendar.calendar')
-        event_obj = self.pool.get('calendar.event')
+        calendar_obj = Pool().get('calendar.calendar')
+        event_obj = Pool().get('calendar.event')
 
         calendar_id = self.calendar(uri)
         if not calendar_id:
@@ -290,8 +331,8 @@ class Collection(ModelSQL, ModelView):
         return super(Collection, self).get_creationdate(uri, cache=cache)
 
     def get_lastmodified(self, uri, cache=None):
-        calendar_obj = self.pool.get('calendar.calendar')
-        event_obj = self.pool.get('calendar.event')
+        calendar_obj = Pool().get('calendar.calendar')
+        event_obj = Pool().get('calendar.event')
 
         cursor = Transaction().cursor
         calendar_id = self.calendar(uri)
@@ -403,8 +444,8 @@ class Collection(ModelSQL, ModelView):
         return super(Collection, self).get_lastmodified(uri, cache=cache)
 
     def get_data(self, uri, cache=None):
-        event_obj = self.pool.get('calendar.event')
-        calendar_obj = self.pool.get('calendar.calendar')
+        event_obj = Pool().get('calendar.event')
+        calendar_obj = Pool().get('calendar.calendar')
 
         calendar_id = self.calendar(uri)
         if calendar_id:
@@ -422,7 +463,7 @@ class Collection(ModelSQL, ModelView):
         return super(Collection, self).get_data(uri, cache=cache)
 
     def get_calendar_description(self, uri, cache=None):
-        calendar_obj = self.pool.get('calendar.calendar')
+        calendar_obj = Pool().get('calendar.calendar')
 
         calendar_id = self.calendar(uri)
         if calendar_id:
@@ -462,14 +503,14 @@ class Collection(ModelSQL, ModelView):
         return '/Calendars'
 
     def get_calendar_user_address_set(self, uri, cache=None):
-        user_obj = self.pool.get('res.user')
+        user_obj = Pool().get('res.user')
         user = user_obj.browse(Transaction().user)
         if user.email:
             return user.email
         raise DAV_NotFound
 
     def get_schedule_inbox_URL(self, uri, cache=None):
-        calendar_obj = self.pool.get('calendar.calendar')
+        calendar_obj = Pool().get('calendar.calendar')
         user = Transaction().user
 
         calendar_ids = calendar_obj.search([
@@ -485,8 +526,8 @@ class Collection(ModelSQL, ModelView):
         return self.get_schedule_inbox_URL(uri, cache=cache)
 
     def put(self, uri, data, content_type, cache=None):
-        event_obj = self.pool.get('calendar.event')
-        calendar_obj = self.pool.get('calendar.calendar')
+        event_obj = Pool().get('calendar.event')
+        calendar_obj = Pool().get('calendar.calendar')
 
         calendar_id = self.calendar(uri)
         if calendar_id:
@@ -517,7 +558,7 @@ class Collection(ModelSQL, ModelView):
         return super(Collection, self).mkcol(uri, cache=cache)
 
     def rmcol(self, uri, cache=None):
-        calendar_obj = self.pool.get('calendar.calendar')
+        calendar_obj = Pool().get('calendar.calendar')
 
         calendar_id = self.calendar(uri)
         if calendar_id:
@@ -531,7 +572,7 @@ class Collection(ModelSQL, ModelView):
         return super(Collection, self).rmcol(uri, cache=cache)
 
     def rm(self, uri, cache=None):
-        event_obj = self.pool.get('calendar.event')
+        event_obj = Pool().get('calendar.event')
 
         calendar_id = self.calendar(uri)
         if calendar_id:
@@ -573,7 +614,7 @@ class Collection(ModelSQL, ModelView):
         :param cache: the cache
         :return: a list of privileges
         '''
-        calendar_obj = self.pool.get('calendar.calendar')
+        calendar_obj = Pool().get('calendar.calendar')
 
         if uri in ('Calendars', 'Calendars/'):
             return ['create', 'read', 'write', 'delete']
commit e214fca6dae88caaba5a19f34f2c63c98fe28021
Author: Mathias Behrle <mathiasb at m9s.biz>
Date:   Tue May 24 19:12:43 2011 +0200

    Adding upstream version 2.0.0.

diff --git a/CHANGELOG b/CHANGELOG
index 4869665..698aff4 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,4 +1,4 @@
-Version 1.8.1 - 2011-02-13
+Version 2.0.0 - 2011-04-27
 * Bug fixes (see mercurial logs for details)
 
 Version 1.8.0 - 2010-11-01
diff --git a/PKG-INFO b/PKG-INFO
index c5e22a2..c8be40d 100644
--- a/PKG-INFO
+++ b/PKG-INFO
@@ -1,12 +1,12 @@
 Metadata-Version: 1.0
 Name: trytond_calendar
-Version: 1.8.1
+Version: 2.0.0
 Summary: Add CalDAV support
 Home-page: http://www.tryton.org/
 Author: B2CK
 Author-email: info at b2ck.com
 License: GPL-3
-Download-URL: http://downloads.tryton.org/1.8/
+Download-URL: http://downloads.tryton.org/2.0/
 Description: UNKNOWN
 Platform: UNKNOWN
 Classifier: Development Status :: 5 - Production/Stable
@@ -16,10 +16,14 @@ Classifier: Intended Audience :: Financial and Insurance Industry
 Classifier: Intended Audience :: Legal Industry
 Classifier: Intended Audience :: Manufacturing
 Classifier: License :: OSI Approved :: GNU General Public License (GPL)
+Classifier: Natural Language :: Bulgarian
 Classifier: Natural Language :: English
 Classifier: Natural Language :: French
 Classifier: Natural Language :: German
+Classifier: Natural Language :: Russian
 Classifier: Natural Language :: Spanish
 Classifier: Operating System :: OS Independent
-Classifier: Programming Language :: Python
+Classifier: Programming Language :: Python :: 2.5
+Classifier: Programming Language :: Python :: 2.6
+Classifier: Programming Language :: Python :: 2.7
 Classifier: Topic :: Office/Business
diff --git a/__tryton__.py b/__tryton__.py
index 07b6402..fce5345 100644
--- a/__tryton__.py
+++ b/__tryton__.py
@@ -3,19 +3,23 @@
 #this repository contains the full copyright notices and license terms.
 {
     'name' : 'Calendar',
+    'name_bg_BG' : 'Календар',
     'name_de_DE' : 'Kalender',
     'name_es_CO' : 'Calendario',
     'name_es_ES' : 'Calendario',
     'name_fr_FR' : 'Calendrier',
-    'version' : '1.8.1',
+    'name_ru_RU' : 'Календарь',
+    'version' : '2.0.0',
     'author' : 'B2CK',
     'email': 'info at b2ck.com',
     'website': 'http://www.tryton.org/',
     'description': 'Add CalDAV support',
+    'description_bg_BG' : 'Добавя подръжка на CalDAV',
     'description_de_DE' : 'Fügt Unterstützung für CalDAV hinzu',
     'description_es_CO' : 'Añade soporte para CalDAV',
     'description_es_ES' : 'Añade soporte para CalDAV',
-    'description_fr_FR': 'Ajoute le support CalDAV',
+    'description_fr_FR' : 'Ajoute le support CalDAV',
+    'description_ru_RU' : 'Добавление поддержки CalDAV',
     'depends' : [
         'ir',
         'res',
@@ -25,9 +29,11 @@
         'calendar.xml',
     ],
     'translation': [
+        'bg_BG.csv',
         'de_DE.csv',
         'es_CO.csv',
         'es_ES.csv',
         'fr_FR.csv',
+        'ru_RU.csv',
     ],
 }
diff --git a/bg_BG.csv b/bg_BG.csv
new file mode 100644
index 0000000..0a8f1c9
--- /dev/null
+++ b/bg_BG.csv
@@ -0,0 +1,194 @@
+type,name,res_id,src,value,fuzzy
+error,calendar.calendar,0,A user can have only one calendar!,Потребителя може да има само един календар!,0
+error,calendar.calendar,0,The name of calendar must be unique!,Името на календара трябва да е уникално!,0
+error,calendar.category,0,The name of calendar category must be unique!,Името на категорията на календара трябва да е уникално!,0
+error,calendar.event,0,Recurrence can not be recurrent!,Повторението не може да е периодично!,0
+error,calendar.event,0,UUID and recurrence must be unique in a calendar!,UUID и взаимна вложеност трябва да са уникални в календар!,0
+error,calendar.location,0,The name of calendar location must be unique!,Името на местонахождението на календара трябва да е уникално!,0
+error,calendar.rrule,0,"Invalid ""By Day""","Невалиден ""По ден""",0
+error,calendar.rrule,0,"Invalid ""By Hour""","Навалиден ""По час""",0
+error,calendar.rrule,0,"Invalid ""By Minute""","Невалиден ""По минута""",0
+error,calendar.rrule,0,"Invalid ""By Month Day""","Невалиден ""По ден от месец""",0
+error,calendar.rrule,0,"Invalid ""By Month""","Невалидно ""По месец""",0
+error,calendar.rrule,0,"Invalid ""By Position""","Невалиден ""По позиция""",0
+error,calendar.rrule,0,"Invalid ""By Second""","Невалиден ""По секунда""",0
+error,calendar.rrule,0,"Invalid ""By Week Number""","Невалиден ""По номер на седмица""",0
+error,calendar.rrule,0,"Invalid ""By Year Day""","Невалиден ""По ден от годината""",0
+error,calendar.rrule,0,"Only one of ""until"" and ""count"" can be set!","""Крайна дата"" и ""брой"" не може да се попълва по едно и също време!",0
+field,"calendar.alarm,rec_name",0,Name,Име,0
+field,"calendar.alarm,valarm",0,valarm,,0
+field,"calendar.attendee,attendee",0,attendee,присътващ,0
+field,"calendar.attendee,email",0,Email,Email,0
+field,"calendar.attendee,rec_name",0,Name,Име,0
+field,"calendar.attendee,status",0,Participation Status,Статус на участие,0
+field,"calendar.calendar,description",0,Description,Описание,0
+field,"calendar.calendar,name",0,Name,Име,0
+field,"calendar.calendar,owner",0,Owner,Собственик,0
+field,"calendar.calendar,read_users",0,Read Users,Потребители с права за четене,0
+field,"calendar.calendar,rec_name",0,Name,Име,0
+field,"calendar.calendar,write_users",0,Write Users,Записване на потребители,0
+field,"calendar.calendar-read-res.user,calendar",0,Calendar,Календар,0
+field,"calendar.calendar-read-res.user,rec_name",0,Name,Име,0
+field,"calendar.calendar-read-res.user,user",0,User,Потребител,0
+field,"calendar.calendar-write-res.user,calendar",0,Calendar,Календар,0
+field,"calendar.calendar-write-res.user,rec_name",0,Name,Име,0
+field,"calendar.calendar-write-res.user,user",0,User,Потребител,0
+field,"calendar.category,name",0,Name,Име,0
+field,"calendar.category,rec_name",0,Name,Име,0
+field,"calendar.date,date",0,Is Date,Е дата,0
+field,"calendar.date,datetime",0,Date,Дата,0
+field,"calendar.date,rec_name",0,Name,Име,0
+field,"calendar.event,alarms",0,Alarms,Аларми,0
+field,"calendar.event,all_day",0,All Day,Всички дни,0
+field,"calendar.event,attendees",0,Attendees,Присъстващи,0
+field,"calendar.event,calendar",0,Calendar,Календар,0
+field,"calendar.event,calendar_owner",0,Owner,Собственик,0
+field,"calendar.event,calendar_read_users",0,Read Users,Потребители с права за четене,0
+field,"calendar.event,calendar_write_users",0,Write Users,Записване на потребители,0
+field,"calendar.event,categories",0,Categories,Категории,0
+field,"calendar.event,classification",0,Classification,Класификация,0
+field,"calendar.event,description",0,Description,Описание,0
+field,"calendar.event,dtend",0,End Date,Крайна дата,0
+field,"calendar.event,dtstart",0,Start Date,Начална дата,0
+field,"calendar.event,exdates",0,Exception Dates,Дати на грешките,0
+field,"calendar.event,exrules",0,Exception Rules,Правила при грешка,0
+field,"calendar.event,location",0,Location,Местоположение,0
+field,"calendar.event,occurences",0,Occurences,Събития,0
+field,"calendar.event,organizer",0,Organizer,Организатор,0
+field,"calendar.event,parent",0,Parent,Родител,0
+field,"calendar.event,rdates",0,Recurrence Dates,Дати на повторяемост,0
+field,"calendar.event,rec_name",0,Name,Име,0
+field,"calendar.event,recurrence",0,Recurrence,Повторение,0
+field,"calendar.event,rrules",0,Recurrence Rules,Правила за повторяемост,0
+field,"calendar.event,sequence",0,Sequence,Последователност,0
+field,"calendar.event,status",0,Status,Състояние,0
+field,"calendar.event,summary",0,Summary,Обобщено,0
+field,"calendar.event,timezone",0,Timezone,Времева зона,0
+field,"calendar.event,transp",0,Time Transparency,Прозрачен във времето,0
+field,"calendar.event,uuid",0,UUID,UUID,0
+field,"calendar.event,vevent",0,vevent,,0
+field,"calendar.event-calendar.category,category",0,Category,Категория,0
+field,"calendar.event-calendar.category,event",0,Event,Събитие,0
+field,"calendar.event-calendar.category,rec_name",0,Name,Име,0
+field,"calendar.event.alarm,calendar_alarm",0,Calendar Alarm,Аларма на календар,0
+field,"calendar.event.alarm,event",0,Event,Събитие,0
+field,"calendar.event.alarm,rec_name",0,Name,Име,0
+field,"calendar.event.attendee,calendar_attendee",0,Calendar Attendee,Присъстващ на календар,0
+field,"calendar.event.attendee,event",0,Event,Събитие,0
+field,"calendar.event.attendee,rec_name",0,Name,Име,0
+field,"calendar.event.exdate,calendar_date",0,Calendar Date,Дата от календар,0
+field,"calendar.event.exdate,event",0,Event,Събитие,0
+field,"calendar.event.exdate,rec_name",0,Name,Име,0
+field,"calendar.event.exrule,calendar_rrule",0,Calendar RRule,,0
+field,"calendar.event.exrule,event",0,Event,Събитие,0
+field,"calendar.event.exrule,rec_name",0,Name,Име,0
+field,"calendar.event.rdate,calendar_date",0,Calendar Date,Дата от календар,0
+field,"calendar.event.rdate,event",0,Event,Събитие,0
+field,"calendar.event.rdate,rec_name",0,Name,Име,0
+field,"calendar.event.rrule,calendar_rrule",0,Calendar RRule,,0
+field,"calendar.event.rrule,event",0,Event,Събитие,0
+field,"calendar.event.rrule,rec_name",0,Name,Име,0
+field,"calendar.location,name",0,Name,Име,0
+field,"calendar.location,rec_name",0,Name,Име,0
+field,"calendar.rrule,byday",0,By Day,По ден,0
+field,"calendar.rrule,byhour",0,By Hour,По час,0
+field,"calendar.rrule,byminute",0,By Minute,По минута,0
+field,"calendar.rrule,bymonth",0,By Month,По месец,0
+field,"calendar.rrule,bymonthday",0,By Month Day,По ден от месеца,0
+field,"calendar.rrule,bysecond",0,By Second,По секунда,0
+field,"calendar.rrule,bysetpos",0,By Position,По позиция,0
+field,"calendar.rrule,byweekno",0,By Week Number,По номер на седмицата,0
+field,"calendar.rrule,byyearday",0,By Year Day,По ден от годината,0
+field,"calendar.rrule,count",0,Count,Брой,0
+field,"calendar.rrule,freq",0,Frequency,Честота,0
+field,"calendar.rrule,interval",0,Interval,Интервал,0
+field,"calendar.rrule,rec_name",0,Name,Име,0
+field,"calendar.rrule,until",0,Until Date,До дата,0
+field,"calendar.rrule,until_date",0,Is Date,Е дата,0
+field,"calendar.rrule,wkst",0,Week Day,Ден от седмица,0
+field,"res.user,calendars",0,Calendars,Календари,0
+help,"calendar.calendar,owner",0,The user must have an email,Потребителя трябва да има email,0
+help,"calendar.date,date",0,"Ignore time of field ""Date"", but handle as date only.","От полето ""Дата"" се игнорира часа и се използва само датата.",0
+help,"calendar.event,uuid",0,Universally Unique Identifier,Универсален иникален идентификатор,0
+help,"calendar.rrule,until_date",0,"Ignore time of field ""Until Date"", but handle as date only.","От полето ""До дата"" се игнорира часа и се използва само датата.",0
+model,"calendar.alarm,name",0,Alarm,Аларма,0
+model,"calendar.attendee,name",0,Attendee,Присъстващ,0
+model,"calendar.calendar,name",0,Calendar,Календар,0
+model,"calendar.calendar-read-res.user,name",0,Calendar - read - User,,0
+model,"calendar.calendar-write-res.user,name",0,Calendar - write - User,,0
+model,"calendar.category,name",0,Category,Категория,0
+model,"calendar.date,name",0,Calendar Date,Дата от календар,0
+model,"calendar.event,name",0,Event,Събитие,0
+model,"calendar.event-calendar.category,name",0,Event - Category,Събитие - категория,0
+model,"calendar.event.alarm,name",0,Alarm,Аларма,0
+model,"calendar.event.attendee,name",0,Attendee,Присъстващ,0
+model,"calendar.event.exdate,name",0,Exception Date,Дата на грешка,0
+model,"calendar.event.exrule,name",0,Exception Rule,Правило при грешка,0
+model,"calendar.event.rdate,name",0,Recurrence Date,Повтаряща се дата,0
+model,"calendar.event.rrule,name",0,Recurrence Rule,Правило за повторение,0
+model,"calendar.location,name",0,Location,Местоположение,0
+model,"calendar.rrule,name",0,Recurrence Rule,Правило за повторение,0
+model,"ir.action,name",act_calendar_form,Calendars,Календари,0
+model,"ir.action,name",act_calendar_form2,Calendars,Календари,0
+model,"ir.action,name",act_event_form,Events,Събития,0
+model,"ir.action,name",act_event_form2,Events,Събития,0
+model,"ir.action,name",act_event_form3,Events,Събития,0
+model,"ir.ui.menu,name",menu_calendar,Calendar Management,Управление на календари,0
+model,"ir.ui.menu,name",menu_calendar_form,Calendars,Календари,0
+model,"ir.ui.menu,name",menu_calendar_form2,New Calendar,Нов календар,0
+model,"ir.ui.menu,name",menu_event_form,Events,Събития,0
+model,"ir.ui.menu,name",menu_event_form2,New Event,Ново събитие,0
+model,"res.group,name",group_calendar_admin,Calendar Administration,Управление на календар,0
+selection,"calendar.attendee,status",0,,,0
+selection,"calendar.attendee,status",0,Accepted,Приет,0
+selection,"calendar.attendee,status",0,Declined,Отхвърлен,0
+selection,"calendar.attendee,status",0,Delegated,Делегиран,0
+selection,"calendar.attendee,status",0,Needs Action,Необходимо е действие,0
+selection,"calendar.attendee,status",0,Tentative,Пробен,0
+selection,"calendar.event,classification",0,Confidential,Поверителен,0
+selection,"calendar.event,classification",0,Private,Частен,0
+selection,"calendar.event,classification",0,Public,Публичен,0
+selection,"calendar.event,status",0,,,0
+selection,"calendar.event,status",0,Cancelled,Отказан,0
+selection,"calendar.event,status",0,Confirmed,Потвърден,0
+selection,"calendar.event,status",0,Tentative,Пробен,0
+selection,"calendar.event,transp",0,Opaque,Непрозрачен,0
+selection,"calendar.event,transp",0,Transparent,Прозрачен,0
+selection,"calendar.rrule,freq",0,Daily,Ежедневно,0
+selection,"calendar.rrule,freq",0,Hourly,Ежечасно,0
+selection,"calendar.rrule,freq",0,Minutely,Ежеминутно,0
+selection,"calendar.rrule,freq",0,Monthly,Месечно,0
+selection,"calendar.rrule,freq",0,Secondly,Всяка секунда,0
+selection,"calendar.rrule,freq",0,Weekly,Седмично,0
+selection,"calendar.rrule,freq",0,Yearly,Годишно,0
+selection,"calendar.rrule,wkst",0,Friday,Петък,0
+selection,"calendar.rrule,wkst",0,Monday,Понеделник,0
+selection,"calendar.rrule,wkst",0,Saturday,Събота,0
+selection,"calendar.rrule,wkst",0,Sunday,Неделя,0
+selection,"calendar.rrule,wkst",0,Thursday,Четвъртък,0
+selection,"calendar.rrule,wkst",0,Tuesday,Вторник,0
+selection,"calendar.rrule,wkst",0,Wednesday,Четвъртък,0
+view,calendar.calendar,0,Calendar,Календар,0
+view,calendar.calendar,0,Calendars,Календари,0
+view,calendar.calendar,0,General,Основен,0
+view,calendar.calendar,0,Security,Сигурност,0
+view,calendar.category,0,Categories,Категории,0
+view,calendar.category,0,Category,Категория,0
+view,calendar.event,0,Attendees,Присъстващи,0
+view,calendar.event,0,Categories,Категории,0
+view,calendar.event,0,Event,Събитие,0
+view,calendar.event,0,Events,Събития,0
+view,calendar.event,0,General,Основен,0
+view,calendar.event,0,Occurences,Събития,0
+view,calendar.event.attendee,0,Attendee,Присъстващ,0
+view,calendar.event.attendee,0,Attendees,Присъстващи,0
+view,calendar.event.exdate,0,Exception Date,Дата на грешка,0
+view,calendar.event.exdate,0,Exception Dates,Дати на грешките,0
+view,calendar.event.exrule,0,Exception Rule,Правило при грешка,0
+view,calendar.event.exrule,0,Exception Rules,Правила при грешка,0
+view,calendar.event.rdate,0,Recurrence Date,Повтаряща се дата,0
+view,calendar.event.rdate,0,Recurrence Dates,Дати на повторяемост,0
+view,calendar.event.rrule,0,Recurrence Rule,Правило за повторение,0
+view,calendar.event.rrule,0,Recurrence Rules,Правила за повторяемост,0
+view,calendar.location,0,Location,Местоположение,0
+view,calendar.location,0,Locations,Местонахождения,0
diff --git a/calendar.xml b/calendar.xml
index 475994b..c668799 100644
--- a/calendar.xml
+++ b/calendar.xml
@@ -57,7 +57,6 @@ this repository contains the full copyright notices and license terms. -->
         <record model="ir.action.act_window" id="act_calendar_form">
             <field name="name">Calendars</field>
             <field name="res_model">calendar.calendar</field>
-            <field name="view_type">form</field>
         </record>
         <record model="ir.action.act_window.view" id="act_calendar_form_view1">
             <field name="sequence" eval="10"/>
@@ -74,7 +73,6 @@ this repository contains the full copyright notices and license terms. -->
         <record model="ir.action.act_window" id="act_calendar_form2">
             <field name="name">Calendars</field>
             <field name="res_model">calendar.calendar</field>
-            <field name="view_type">form</field>
         </record>
         <record model="ir.action.act_window.view" id="act_calendar_form2_view1">
             <field name="sequence" eval="10"/>
@@ -267,7 +265,6 @@ this repository contains the full copyright notices and license terms. -->
         <record model="ir.action.act_window" id="act_event_form">
             <field name="name">Events</field>
             <field name="res_model">calendar.event</field>
-            <field name="view_type">form</field>
             <field name="domain">[('parent', '=', False)]</field>
         </record>
         <record model="ir.action.act_window.view" id="act_event_form_view1">
@@ -285,7 +282,6 @@ this repository contains the full copyright notices and license terms. -->
         <record model="ir.action.act_window" id="act_event_form2">
             <field name="name">Events</field>
             <field name="res_model">calendar.event</field>
-            <field name="view_type">form</field>
             <field name="domain">[('parent', '=', False)]</field>
         </record>
         <record model="ir.action.act_window.view" id="act_event_form2_view1">
@@ -304,7 +300,6 @@ this repository contains the full copyright notices and license terms. -->
         <record model="ir.action.act_window" id="act_event_form3">
             <field name="name">Events</field>
             <field name="res_model">calendar.event</field>
-            <field name="view_type">form</field>
             <field name="domain">[('parent', '=', False), ('calendar', '=', Eval('active_id'))]</field>
         </record>
         <record model="ir.action.act_window.view" id="act_event_form3_view1">
diff --git a/ru_RU.csv b/ru_RU.csv
new file mode 100644
index 0000000..5a6e85f
--- /dev/null
+++ b/ru_RU.csv
@@ -0,0 +1,202 @@
+type,name,res_id,src,value,fuzzy
+error,calendar.calendar,0,A user can have only one calendar!,Пользователь может иметь только Один календарь!,0
+error,calendar.calendar,0,The name of calendar must be unique!,Имя календаря должно быть уникально,0
+error,calendar.category,0,The name of calendar category must be unique!,,0
+error,calendar.event,0,Recurrence can not be recurrent!,,0
+error,calendar.event,0,UUID and recurrence must be unique in a calendar!,,0
+error,calendar.location,0,The name of calendar location must be unique!,,0
+error,calendar.rrule,0,"Invalid ""By Day""","Неверное поле ""По дням""",0
+error,calendar.rrule,0,"Invalid ""By Hour""","Неверное поле ""По часам""",0
+error,calendar.rrule,0,"Invalid ""By Minute""","Неверное поле ""По минутам""",0
+error,calendar.rrule,0,"Invalid ""By Month Day""","Неверное поле ""По дням месяца""",0
+error,calendar.rrule,0,"Invalid ""By Month""","Неверное поле ""По месяцам""",0
+error,calendar.rrule,0,"Invalid ""By Position""","Неверное поле ""По позиции""",0
+error,calendar.rrule,0,"Invalid ""By Second""","Неверное поле ""По секундам""",0
+error,calendar.rrule,0,"Invalid ""By Week Number""","Неверное поле ""По номерам недель""",0
+error,calendar.rrule,0,"Invalid ""By Year Day""","Неверный ""По дням года""",0
+error,calendar.rrule,0,"Only one of ""until"" and ""count"" can be set!",,0
+field,"calendar.alarm,rec_name",0,Name,Наименование,0
+field,"calendar.alarm,valarm",0,valarm,,0
+field,"calendar.attendee,attendee",0,attendee,участник,0
+field,"calendar.attendee,email",0,Email,Эл.почта,0
+field,"calendar.attendee,rec_name",0,Name,Наименование,0
+field,"calendar.attendee,status",0,Participation Status,Статус участия,0
+field,"calendar.calendar,description",0,Description,Описание,0
+field,"calendar.calendar,name",0,Name,Наименование,0
+field,"calendar.calendar,owner",0,Owner,Владелец,0
+field,"calendar.calendar,read_users",0,Read Users,Пользователи могут читать,0
+field,"calendar.calendar,rec_name",0,Name,Наименование,0
+field,"calendar.calendar,write_users",0,Write Users,Пользователи могут писать,0
+field,"calendar.calendar-read-res.user,calendar",0,Calendar,Календар,0
+field,"calendar.calendar-read-res.user,rec_name",0,Name,Наименование,0
+field,"calendar.calendar-read-res.user,user",0,User,Пользователь,0
+field,"calendar.calendar-write-res.user,calendar",0,Calendar,Календарь,0
+field,"calendar.calendar-write-res.user,rec_name",0,Name,Наименование,0
+field,"calendar.calendar-write-res.user,user",0,User,Пользователь,0
+field,"calendar.category,name",0,Name,Наименование,0
+field,"calendar.category,rec_name",0,Name,Наименование,0
+field,"calendar.date,date",0,Is Date,Весь день,0
+field,"calendar.date,datetime",0,Date,Дата,0
+field,"calendar.date,rec_name",0,Name,Наименование,0
+field,"calendar.event,alarms",0,Alarms,Вызовы,0
+field,"calendar.event,all_day",0,All Day,Все дни,0
+field,"calendar.event,attendees",0,Attendees,Участники,0
+field,"calendar.event,calendar",0,Calendar,Календарь,0
+field,"calendar.event,calendar_owner",0,Owner,Владелец,0
+field,"calendar.event,calendar_read_users",0,Read Users,Пользователи могут читать,0
+field,"calendar.event,calendar_write_users",0,Write Users,Пользователи могут писать,0
+field,"calendar.event,categories",0,Categories,Категория,0
+field,"calendar.event,classification",0,Classification,Классификация,0
+field,"calendar.event,classification_public",0,Classification Public,Классификация общая,0
+field,"calendar.event,description",0,Description,Описание,0
+field,"calendar.event,dtend",0,End Date,Дата окончания,0
+field,"calendar.event,dtstart",0,Start Date,Дата начала,0
+field,"calendar.event,exdates",0,Exception Dates,Дата исключения,0
+field,"calendar.event,exrules",0,Exception Rules,Правила исключения,0
+field,"calendar.event,location",0,Location,Местоположение,0
+field,"calendar.event,occurences",0,Occurences,Дополнительные задачи,0
+field,"calendar.event,organizer",0,Organizer,Организатор,0
+field,"calendar.event,parent",0,Parent,Основной,0
+field,"calendar.event,rdates",0,Recurrence Dates,Даты повторения,0
+field,"calendar.event,rec_name",0,Name,Наименование,0
+field,"calendar.event,recurrence",0,Recurrence,Повторение,0
+field,"calendar.event,rrules",0,Recurrence Rules,Правила повторения,0
+field,"calendar.event,sequence",0,Sequence,Последовательность,0
+field,"calendar.event,status",0,Status,Состояние,0
+field,"calendar.event,summary",0,Summary,Резюме,0
+field,"calendar.event,timezone",0,Timezone,Зона времени,0
+field,"calendar.event,transp",0,Time Transparency,Время Прозрачность,0
+field,"calendar.event,uuid",0,UUID,,0
+field,"calendar.event,vevent",0,vevent,,0
+field,"calendar.event-calendar.category,category",0,Category,Категории,0
+field,"calendar.event-calendar.category,event",0,Event,Событие,0
+field,"calendar.event-calendar.category,rec_name",0,Name,Наименование,0
+field,"calendar.event.alarm,calendar_alarm",0,Calendar Alarm,Сигнала календаря,0
+field,"calendar.event.alarm,event",0,Event,Событие,0
+field,"calendar.event.alarm,rec_name",0,Name,Наименование,0
+field,"calendar.event.attendee,calendar_attendee",0,Calendar Attendee,Календарь участников,0
+field,"calendar.event.attendee,event",0,Event,Событие,0
+field,"calendar.event.attendee,rec_name",0,Name,Наименование,0
+field,"calendar.event.exdate,calendar_date",0,Calendar Date,День календаря,0
+field,"calendar.event.exdate,calendar_rdate",0,Calendar RDate,День календаря,0
+field,"calendar.event.exdate,event",0,Event,Событие,0
+field,"calendar.event.exdate,rec_name",0,Name,Наименование,0
+field,"calendar.event.exrule,calendar_rrule",0,Calendar RRule,Правила календаря,0
+field,"calendar.event.exrule,event",0,Event,Событие,0
+field,"calendar.event.exrule,rec_name",0,Name,Наименование,0
+field,"calendar.event.rdate,calendar_date",0,Calendar Date,День календаря,0
+field,"calendar.event.rdate,calendar_rdate",0,Calendar RDate,День календаря,0
+field,"calendar.event.rdate,event",0,Event,Событие,0
+field,"calendar.event.rdate,rec_name",0,Name,Наименование,0
+field,"calendar.event.rrule,calendar_rrule",0,Calendar RRule,Правила календаря,0
+field,"calendar.event.rrule,event",0,Event,Событие,0
+field,"calendar.event.rrule,rec_name",0,Name,Наименование,0
+field,"calendar.location,name",0,Name,Наименование,0
+field,"calendar.location,rec_name",0,Name,Наименование,0
+field,"calendar.rdate,date",0,Is Date,Весь день,0
+field,"calendar.rdate,datetime",0,Date,Дата,0
+field,"calendar.rdate,rec_name",0,Name,Наименование,0
+field,"calendar.rrule,byday",0,By Day,По дням,0
+field,"calendar.rrule,byhour",0,By Hour,По часам,0
+field,"calendar.rrule,byminute",0,By Minute,По минутам,0
+field,"calendar.rrule,bymonth",0,By Month,По месячно,0
+field,"calendar.rrule,bymonthday",0,By Month Day,По дням месяца,0
+field,"calendar.rrule,bysecond",0,By Second,По секундам,0
+field,"calendar.rrule,bysetpos",0,By Position,По позиции,0
+field,"calendar.rrule,byweekno",0,By Week Number,По номерам недель,0
+field,"calendar.rrule,byyearday",0,By Year Day,По дням года,0
+field,"calendar.rrule,count",0,Count,Количество,0
+field,"calendar.rrule,freq",0,Frequency,Частота,0
+field,"calendar.rrule,interval",0,Interval,Внутренний,0
+field,"calendar.rrule,rec_name",0,Name,Наименование,0
+field,"calendar.rrule,until",0,Until Date,До даты,0
+field,"calendar.rrule,until_date",0,Is Date,Весь день,0
+field,"calendar.rrule,wkst",0,Week Day,День недели,0
+field,"res.user,calendars",0,Calendars,Календари,0
+help,"calendar.calendar,owner",0,The user must have an email,,0
+help,"calendar.date,date",0,"Ignore time of field ""Date"", but handle as date only.","Время игнорируется в поле ""Дата"", действует только дата",0
+help,"calendar.event,uuid",0,Universally Unique Identifier,Универсальный уникальный идентификатор,0
+help,"calendar.rdate,date",0,"Ignore time of field ""Date"", but handle as date only.","Время игнорируется в поле ""Дата"", действует только дата",0
+help,"calendar.rrule,until_date",0,"Ignore time of field ""Until Date"", but handle as date only.","Время игнорируется в поле ""До даты"", действует только дата",0
+model,"calendar.alarm,name",0,Alarm,Вызов,0
+model,"calendar.attendee,name",0,Attendee,Участник,0
+model,"calendar.calendar,name",0,Calendar,Календарь,0
+model,"calendar.calendar-read-res.user,name",0,Calendar - read - User,Пользователи могут читать,0
+model,"calendar.calendar-write-res.user,name",0,Calendar - write - User,Пользователи могут писать,0
+model,"calendar.category,name",0,Category,Категории,0
+model,"calendar.date,name",0,Calendar Date,День календаря,0
+model,"calendar.event,name",0,Event,Событие,0
+model,"calendar.event-calendar.category,name",0,Event - Category,Категории - События,0
+model,"calendar.event.alarm,name",0,Alarm,Вызов,0
+model,"calendar.event.attendee,name",0,Attendee,Участник,0
+model,"calendar.event.exdate,name",0,Exception Date,Дата исключения,0
+model,"calendar.event.exrule,name",0,Exception Rule,Правило исключения,0
+model,"calendar.event.rdate,name",0,Recurrence Date,Даты повторения,0
+model,"calendar.event.rrule,name",0,Recurrence Rule,Правила повторения,0
+model,"calendar.location,name",0,Location,Местоположение,0
+model,"calendar.rdate,name",0,Recurrence Date,Даты повторения,0
+model,"calendar.rrule,name",0,Recurrence Rule,Правила повторения,0
+model,"ir.action,name",act_calendar_form,Calendars,Календари,0
+model,"ir.action,name",act_calendar_form2,Calendars,Календари,0
+model,"ir.action,name",act_event_form,Events,,0
+model,"ir.action,name",act_event_form2,Events,,0
+model,"ir.action,name",act_event_form3,Events,,0
+model,"ir.ui.menu,name",menu_calendar,Calendar Management,Календари,0
+model,"ir.ui.menu,name",menu_calendar_form,Calendars,Календари,0
+model,"ir.ui.menu,name",menu_calendar_form2,New Calendar,Новый календарь,0
+model,"ir.ui.menu,name",menu_event_form,Events,События,0
+model,"ir.ui.menu,name",menu_event_form2,New Event,Новое событие,0
+model,"res.group,name",group_calendar_admin,Calendar Administration,Управление календарем,0
+selection,"calendar.attendee,status",0,,,0
+selection,"calendar.attendee,status",0,Accepted,Подтверждено,0
+selection,"calendar.attendee,status",0,Declined,Отклонено,0
+selection,"calendar.attendee,status",0,Delegated,Делегировано,0
+selection,"calendar.attendee,status",0,Needs Action,Требуется действие,0
+selection,"calendar.attendee,status",0,Tentative,Предварительный,0
+selection,"calendar.event,classification",0,Confidential,Конфиденциальное,0
+selection,"calendar.event,classification",0,Private,Личное,0
+selection,"calendar.event,classification",0,Public,Публичное,0
+selection,"calendar.event,status",0,,,0
+selection,"calendar.event,status",0,Cancelled,Отмененно,0
+selection,"calendar.event,status",0,Confirmed,Подтвержденно,0
+selection,"calendar.event,status",0,Tentative,Предварительный,0
+selection,"calendar.event,transp",0,Opaque,Непрозрачный,0
+selection,"calendar.event,transp",0,Transparent,Прозрачный,0
+selection,"calendar.rrule,freq",0,Daily,Ежедневный,0
+selection,"calendar.rrule,freq",0,Hourly,Ежечасный,0
+selection,"calendar.rrule,freq",0,Minutely,Ежеминутно,0
+selection,"calendar.rrule,freq",0,Monthly,Ежемесячно,0
+selection,"calendar.rrule,freq",0,Secondly,Ежесекудно,0
+selection,"calendar.rrule,freq",0,Weekly,Еженедельно,0
+selection,"calendar.rrule,freq",0,Yearly,Ежегодно,0
+selection,"calendar.rrule,wkst",0,Friday,Пятница,0
+selection,"calendar.rrule,wkst",0,Monday,Понедельник,0
+selection,"calendar.rrule,wkst",0,Saturday,Суббота,0
+selection,"calendar.rrule,wkst",0,Sunday,Воскресенье,0
+selection,"calendar.rrule,wkst",0,Thursday,Четверг,0
+selection,"calendar.rrule,wkst",0,Tuesday,Вторник,0
+selection,"calendar.rrule,wkst",0,Wednesday,Среда,0
+view,calendar.calendar,0,Calendar,Календарь,0
+view,calendar.calendar,0,Calendars,Календари,0
+view,calendar.calendar,0,General,Основной,0
+view,calendar.calendar,0,Security,Доступ,0
+view,calendar.category,0,Categories,Категория,0
+view,calendar.category,0,Category,Категории,0
+view,calendar.event,0,Attendees,Участники,0
+view,calendar.event,0,Categories,Категория,0
+view,calendar.event,0,Event,Событие,0
+view,calendar.event,0,Events,События,0
+view,calendar.event,0,General,Основной,0
+view,calendar.event,0,Occurences,Повторение,0
+view,calendar.event.attendee,0,Attendee,Участник,0
+view,calendar.event.attendee,0,Attendees,Участники,0
+view,calendar.event.exdate,0,Exception Date,Дата исключения,0
+view,calendar.event.exdate,0,Exception Dates,Дата исключения,0
+view,calendar.event.exrule,0,Exception Rule,Правило исключения,0
+view,calendar.event.exrule,0,Exception Rules,Правила исключения,0
+view,calendar.event.rdate,0,Recurrence Date,Даты повторения,0
+view,calendar.event.rdate,0,Recurrence Dates,Даты повторения,0
+view,calendar.event.rrule,0,Recurrence Rule,Правила повторения,0
+view,calendar.event.rrule,0,Recurrence Rules,Правила повторения,0
+view,calendar.location,0,Location,Местоположение,0
+view,calendar.location,0,Locations,Местоположения,0
diff --git a/setup.py b/setup.py
index 461d886..50e3711 100644
--- a/setup.py
+++ b/setup.py
@@ -44,12 +44,16 @@ setup(name='trytond_calendar',
         'Intended Audience :: Legal Industry',
         'Intended Audience :: Manufacturing',
         'License :: OSI Approved :: GNU General Public License (GPL)',
+        'Natural Language :: Bulgarian',
         'Natural Language :: English',
         'Natural Language :: French',
         'Natural Language :: German',
+        'Natural Language :: Russian',
         'Natural Language :: Spanish',
         'Operating System :: OS Independent',
-        'Programming Language :: Python',
+        'Programming Language :: Python :: 2.5',
+        'Programming Language :: Python :: 2.6',
+        'Programming Language :: Python :: 2.7',
         'Topic :: Office/Business',
     ],
     license='GPL-3',
diff --git a/tests/__init__.pyc b/tests/__init__.pyc
new file mode 100644
index 0000000..b370054
Binary files /dev/null and b/tests/__init__.pyc differ
diff --git a/tests/test_calendar.pyc b/tests/test_calendar.pyc
new file mode 100644
index 0000000..02dbc50
Binary files /dev/null and b/tests/test_calendar.pyc differ
diff --git a/trytond_calendar.egg-info/PKG-INFO b/trytond_calendar.egg-info/PKG-INFO
index e6c9d58..3a458b7 100644
--- a/trytond_calendar.egg-info/PKG-INFO
+++ b/trytond_calendar.egg-info/PKG-INFO
@@ -1,12 +1,12 @@
 Metadata-Version: 1.0
 Name: trytond-calendar
-Version: 1.8.1
+Version: 2.0.0
 Summary: Add CalDAV support
 Home-page: http://www.tryton.org/
 Author: B2CK
 Author-email: info at b2ck.com
 License: GPL-3
-Download-URL: http://downloads.tryton.org/1.8/
+Download-URL: http://downloads.tryton.org/2.0/
 Description: UNKNOWN
 Platform: UNKNOWN
 Classifier: Development Status :: 5 - Production/Stable
@@ -16,10 +16,14 @@ Classifier: Intended Audience :: Financial and Insurance Industry
 Classifier: Intended Audience :: Legal Industry
 Classifier: Intended Audience :: Manufacturing
 Classifier: License :: OSI Approved :: GNU General Public License (GPL)
+Classifier: Natural Language :: Bulgarian
 Classifier: Natural Language :: English
 Classifier: Natural Language :: French
 Classifier: Natural Language :: German
+Classifier: Natural Language :: Russian
 Classifier: Natural Language :: Spanish
 Classifier: Operating System :: OS Independent
-Classifier: Programming Language :: Python
+Classifier: Programming Language :: Python :: 2.5
+Classifier: Programming Language :: Python :: 2.6
+Classifier: Programming Language :: Python :: 2.7
 Classifier: Topic :: Office/Business
diff --git a/trytond_calendar.egg-info/SOURCES.txt b/trytond_calendar.egg-info/SOURCES.txt
index ec48332..de3adb7 100644
--- a/trytond_calendar.egg-info/SOURCES.txt
+++ b/trytond_calendar.egg-info/SOURCES.txt
@@ -4,11 +4,13 @@ INSTALL
 LICENSE
 MANIFEST.in
 README
+bg_BG.csv
 calendar.xml
 de_DE.csv
 es_CO.csv
 es_ES.csv
 fr_FR.csv
+ru_RU.csv
 setup.py
 ./__init__.py
 ./__tryton__.py
@@ -18,6 +20,10 @@ setup.py
 ./webdav.py
 ./tests/__init__.py
 ./tests/test_calendar.py
+tests/__init__.py
+tests/__init__.pyc
+tests/test_calendar.py
+tests/test_calendar.pyc
 trytond_calendar.egg-info/PKG-INFO
 trytond_calendar.egg-info/SOURCES.txt
 trytond_calendar.egg-info/dependency_links.txt
diff --git a/trytond_calendar.egg-info/requires.txt b/trytond_calendar.egg-info/requires.txt
index 707195e..ccd0e32 100644
--- a/trytond_calendar.egg-info/requires.txt
+++ b/trytond_calendar.egg-info/requires.txt
@@ -2,4 +2,4 @@ vobject >= 0.8.0
 PyWebDAV >= 0.9.3
 python-dateutil
 pytz
-trytond >= 1.8, < 1.9
\ No newline at end of file
+trytond >= 2.0, < 2.1
\ No newline at end of file
commit b31be2a30f4e71d9ce74434a93902c434f6dd98e
Author: Mathias Behrle <mathiasb at m9s.biz>
Date:   Tue Feb 15 11:46:12 2011 +0100

    Adding upstream version 1.8.1.

diff --git a/CHANGELOG b/CHANGELOG
index cda8551..4869665 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,3 +1,6 @@
+Version 1.8.1 - 2011-02-13
+* Bug fixes (see mercurial logs for details)
+
 Version 1.8.0 - 2010-11-01
 * Bug fixes (see mercurial logs for details)
 
diff --git a/COPYRIGHT b/COPYRIGHT
index 6e6811c..1245dd5 100644
--- a/COPYRIGHT
+++ b/COPYRIGHT
@@ -1,6 +1,6 @@
-Copyright (C) 2009-2010 Cédric Krier.
-Copyright (C) 2009-2010 Bertrand Chenal.
-Copyright (C) 2009-2010 B2CK SPRL.
+Copyright (C) 2009-2011 Cédric Krier.
+Copyright (C) 2009-2011 Bertrand Chenal.
+Copyright (C) 2009-2011 B2CK SPRL.
 
 This program is free software: you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
diff --git a/PKG-INFO b/PKG-INFO
index 1419342..c5e22a2 100644
--- a/PKG-INFO
+++ b/PKG-INFO
@@ -1,6 +1,6 @@
 Metadata-Version: 1.0
 Name: trytond_calendar
-Version: 1.8.0
+Version: 1.8.1
 Summary: Add CalDAV support
 Home-page: http://www.tryton.org/
 Author: B2CK
diff --git a/__tryton__.py b/__tryton__.py
index 615a3e5..07b6402 100644
--- a/__tryton__.py
+++ b/__tryton__.py
@@ -7,7 +7,7 @@
     'name_es_CO' : 'Calendario',
     'name_es_ES' : 'Calendario',
     'name_fr_FR' : 'Calendrier',
-    'version' : '1.8.0',
+    'version' : '1.8.1',
     'author' : 'B2CK',
     'email': 'info at b2ck.com',
     'website': 'http://www.tryton.org/',
diff --git a/tests/__init__.pyc b/tests/__init__.pyc
deleted file mode 100644
index b370054..0000000
Binary files a/tests/__init__.pyc and /dev/null differ
diff --git a/tests/test_calendar.pyc b/tests/test_calendar.pyc
deleted file mode 100644
index 02dbc50..0000000
Binary files a/tests/test_calendar.pyc and /dev/null differ
diff --git a/trytond_calendar.egg-info/PKG-INFO b/trytond_calendar.egg-info/PKG-INFO
index 4b0bad5..e6c9d58 100644
--- a/trytond_calendar.egg-info/PKG-INFO
+++ b/trytond_calendar.egg-info/PKG-INFO
@@ -1,6 +1,6 @@
 Metadata-Version: 1.0
 Name: trytond-calendar
-Version: 1.8.0
+Version: 1.8.1
 Summary: Add CalDAV support
 Home-page: http://www.tryton.org/
 Author: B2CK
diff --git a/trytond_calendar.egg-info/SOURCES.txt b/trytond_calendar.egg-info/SOURCES.txt
index 86154dc..ec48332 100644
--- a/trytond_calendar.egg-info/SOURCES.txt
+++ b/trytond_calendar.egg-info/SOURCES.txt
@@ -18,10 +18,6 @@ setup.py
 ./webdav.py
 ./tests/__init__.py
 ./tests/test_calendar.py
-tests/__init__.py
-tests/__init__.pyc
-tests/test_calendar.py
-tests/test_calendar.pyc
 trytond_calendar.egg-info/PKG-INFO
 trytond_calendar.egg-info/SOURCES.txt
 trytond_calendar.egg-info/dependency_links.txt
diff --git a/webdav.py b/webdav.py
index a086807..62b7e0b 100644
--- a/webdav.py
+++ b/webdav.py
@@ -581,6 +581,7 @@ class Collection(ModelSQL, ModelView):
             calendar_id = self.calendar(uri)
             if calendar_id:
                 calendar = calendar_obj.browse(calendar_id)
+                user = Transaction().user
                 if user == calendar.owner.id:
                     return ['create', 'read', 'write', 'delete']
                 res = []
commit e6f9511ad2ec4941b9d2f9fe6c995f7129e64d2e
Author: Daniel Baumann <daniel at debian.org>
Date:   Thu Nov 4 20:12:11 2010 +0100

    Adding upstream version 1.8.0.

diff --git a/CHANGELOG b/CHANGELOG
index ecc0320..cda8551 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,3 +1,6 @@
+Version 1.8.0 - 2010-11-01
+* Bug fixes (see mercurial logs for details)
+
 Version 1.6.0 - 2010-05-09
 * Bug fixes (see mercurial logs for details)
 * Remove classification_public
diff --git a/MANIFEST.in b/MANIFEST.in
index c61b52d..5343ad8 100644
--- a/MANIFEST.in
+++ b/MANIFEST.in
@@ -7,4 +7,3 @@ include LICENSE
 include *.xml
 include *.odt
 include *.csv
-include tests/*
diff --git a/PKG-INFO b/PKG-INFO
index df6d2d5..1419342 100644
--- a/PKG-INFO
+++ b/PKG-INFO
@@ -1,12 +1,12 @@
 Metadata-Version: 1.0
 Name: trytond_calendar
-Version: 1.6.0
+Version: 1.8.0
 Summary: Add CalDAV support
 Home-page: http://www.tryton.org/
 Author: B2CK
 Author-email: info at b2ck.com
 License: GPL-3
-Download-URL: http://downloads.tryton.org/1.6/
+Download-URL: http://downloads.tryton.org/1.8/
 Description: UNKNOWN
 Platform: UNKNOWN
 Classifier: Development Status :: 5 - Production/Stable
diff --git a/__tryton__.py b/__tryton__.py
index 57872dc..615a3e5 100644
--- a/__tryton__.py
+++ b/__tryton__.py
@@ -7,7 +7,7 @@
     'name_es_CO' : 'Calendario',
     'name_es_ES' : 'Calendario',
     'name_fr_FR' : 'Calendrier',
-    'version' : '1.6.0',
+    'version' : '1.8.0',
     'author' : 'B2CK',
     'email': 'info at b2ck.com',
     'website': 'http://www.tryton.org/',
diff --git a/caldav.py b/caldav.py
index ed10a27..4b6d56a 100644
--- a/caldav.py
+++ b/caldav.py
@@ -1,18 +1,19 @@
 #This file is part of Tryton.  The COPYRIGHT file at the top level of
 #this repository contains the full copyright notices and license terms.
-_TRYTON_RELOAD = False
-
+import urlparse
+import urllib
+from string import atoi
+import xml.dom.minidom
 from DAV import propfind
 from DAV.errors import *
 from DAV.utils import get_uriparentpath
 from DAV.constants import DAV_VERSION_1, DAV_VERSION_2
-from trytond.protocols.webdav import TrytonDAVInterface, USER_ID, CACHE, \
-        DATABASE, WebDAVAuthRequestHandler
+from trytond.protocols.webdav import TrytonDAVInterface, CACHE, \
+        WebDAVAuthRequestHandler
 from trytond.pool import Pool
-import urlparse
-import urllib
-from string import atoi
-import xml.dom.minidom
+from trytond.transaction import Transaction
+
+_TRYTON_RELOAD = False
 domimpl = xml.dom.minidom.getDOMImplementation()
 
 TrytonDAVInterface.PROPS['urn:ietf:params:xml:ns:caldav'] = (
@@ -55,15 +56,13 @@ def _get_caldav_calendar_description(self, uri):
     dbname, dburi = self._get_dburi(uri)
     if not dbname:
         raise DAV_NotFound
-    cursor = DATABASE['cursor']
-    pool = Pool(DATABASE['dbname'])
+    pool = Pool(Transaction().cursor.database_name)
     try:
         collection_obj = pool.get('webdav.collection')
     except KeyError:
         raise DAV_NotFound
     try:
-        res = collection_obj.get_calendar_description(cursor, int(USER_ID), dburi,
-                cache=CACHE)
+        res = collection_obj.get_calendar_description(dburi, cache=CACHE)
     except AttributeError:
         raise DAV_NotFound
     except (DAV_Error, DAV_NotFound, DAV_Secret, DAV_Forbidden), exception:
@@ -80,15 +79,13 @@ def _get_caldav_calendar_data(self, uri):
     dbname, dburi = self._get_dburi(uri)
     if not dbname:
         raise DAV_NotFound
-    cursor = DATABASE['cursor']
-    pool = Pool(DATABASE['dbname'])
+    pool = Pool(Transaction().cursor.database_name)
     try:
         collection_obj = pool.get('webdav.collection')
     except KeyError:
         raise DAV_NotFound
     try:
-        res = collection_obj.get_calendar_data(cursor, int(USER_ID), dburi,
-                cache=CACHE)
+        res = collection_obj.get_calendar_data(dburi, cache=CACHE)
     except AttributeError:
         raise DAV_NotFound
     except (DAV_Error, DAV_NotFound, DAV_Secret, DAV_Forbidden), exception:
@@ -105,15 +102,13 @@ def _get_caldav_calendar_home_set(self, uri):
     dbname, dburi = self._get_dburi(uri)
     if not dbname:
         raise DAV_NotFound
-    cursor = DATABASE['cursor']
-    pool = Pool(DATABASE['dbname'])
+    pool = Pool(Transaction().cursor.database_name)
     try:
         collection_obj = pool.get('webdav.collection')
     except KeyError:
         raise DAV_NotFound
     try:
-        res = collection_obj.get_calendar_home_set(cursor, int(USER_ID), dburi,
-                cache=CACHE)
+        res = collection_obj.get_calendar_home_set(dburi, cache=CACHE)
     except AttributeError:
         raise DAV_NotFound
     except (DAV_Error, DAV_NotFound, DAV_Secret, DAV_Forbidden), exception:
@@ -139,15 +134,13 @@ def _get_caldav_calendar_user_address_set(self, uri):
     dbname, dburi = self._get_dburi(uri)
     if not dbname:
         raise DAV_NotFound
-    cursor = DATABASE['cursor']
-    pool = Pool(DATABASE['dbname'])
+    pool = Pool(Transaction().cursor.database_name)
     try:
         collection_obj = pool.get('webdav.collection')
     except KeyError:
         raise DAV_NotFound
     try:
-        res = collection_obj.get_calendar_user_address_set(cursor,
-                int(USER_ID), dburi, cache=CACHE)
+        res = collection_obj.get_calendar_user_address_set(dburi, cache=CACHE)
     except AttributeError:
         raise DAV_NotFound
     except (DAV_Error, DAV_NotFound, DAV_Secret, DAV_Forbidden), exception:
@@ -169,15 +162,13 @@ def _get_caldav_schedule_inbox_URL(self, uri):
     dbname, dburi = self._get_dburi(uri)
     if not dbname:
         raise DAV_NotFound
-    cursor = DATABASE['cursor']
-    pool = Pool(DATABASE['dbname'])
+    pool = Pool(Transaction().cursor.database_name)
     try:
         collection_obj = pool.get('webdav.collection')
     except KeyError:
         raise DAV_NotFound
     try:
-        res = collection_obj.get_schedule_inbox_URL(cursor, int(USER_ID), dburi,
-                cache=CACHE)
+        res = collection_obj.get_schedule_inbox_URL(dburi, cache=CACHE)
     except AttributeError:
         raise DAV_NotFound
     except (DAV_Error, DAV_NotFound, DAV_Secret, DAV_Forbidden), exception:
@@ -201,15 +192,13 @@ def _get_caldav_schedule_outbox_URL(self, uri):
     dbname, dburi = self._get_dburi(uri)
     if not dbname:
         raise DAV_NotFound
-    cursor = DATABASE['cursor']
-    pool = Pool(DATABASE['dbname'])
+    pool = Pool(Transaction().cursor.database_name)
     try:
         collection_obj = pool.get('webdav.collection')
     except KeyError:
         raise DAV_NotFound
     try:
-        res = collection_obj.get_schedule_outbox_URL(cursor, int(USER_ID), dburi,
-                cache=CACHE)
+        res = collection_obj.get_schedule_outbox_URL(dburi, cache=CACHE)
     except AttributeError:
         raise DAV_NotFound
     except (DAV_Error, DAV_NotFound, DAV_Secret, DAV_Forbidden), exception:
@@ -254,11 +243,10 @@ def _get_caldav_post(self, uri, body, contenttype=''):
     dbname, dburi = self._get_dburi(uri)
     if not dbname:
         raise DAV_Forbidden
-    cursor = DATABASE['cursor']
-    pool = Pool(DATABASE['dbname'])
+    pool = Pool(Transaction().cursor.database_name)
     calendar_obj = pool.get('calendar.calendar')
     try:
-        res = calendar_obj.post(cursor, int(USER_ID), dburi, body)
+        res = calendar_obj.post(dburi, body)
     except AttributeError:
         raise DAV_NotFound
     except (DAV_Error, DAV_NotFound, DAV_Secret, DAV_Forbidden), exception:
diff --git a/calendar.py b/calendar.py
index be0c723..d5204e8 100644
--- a/calendar.py
+++ b/calendar.py
@@ -1,17 +1,20 @@
 #This file is part of Tryton.  The COPYRIGHT file at the top level of
 #this repository contains the full copyright notices and license terms.
-from trytond.model import ModelSQL, ModelView, fields
-from trytond.tools import Cache, reduce_ids
-from trytond.backend import TableHandler
-from trytond.pyson import If, Bool, Not, Eval, Greater
+from __future__ import with_statement
 import uuid
 import vobject
 import dateutil.tz
-tzlocal = dateutil.tz.tzlocal()
-tzutc = dateutil.tz.tzutc()
 import pytz
 import datetime
 import xml.dom.minidom
+from trytond.model import ModelSQL, ModelView, fields
+from trytond.tools import reduce_ids
+from trytond.backend import TableHandler
+from trytond.pyson import If, Bool, Not, Eval, Greater
+from trytond.transaction import Transaction
+from trytond.cache import Cache
+tzlocal = dateutil.tz.tzlocal()
+tzutc = dateutil.tz.tzutc()
 domimpl = xml.dom.minidom.getDOMImplementation()
 
 
@@ -43,86 +46,74 @@ class Calendar(ModelSQL, ModelView):
             ('check_name', 'Calendar name can not end with .ics'),
         ]
 
-    def create(self, cursor, user, vals, context=None):
-        res = super(Calendar, self).create(cursor, user, vals, context=context)
+    def create(self, vals):
+        res = super(Calendar, self).create(vals)
         # Restart the cache for get_name
-        self.get_name(cursor.dbname)
+        self.get_name.reset()
         return res
 
-    def write(self, cursor, user, ids, vals, context=None):
-        res = super(Calendar, self).write(cursor, user, ids, vals,
-                context=context)
+    def write(self, ids, vals):
+        res = super(Calendar, self).write(ids, vals)
         # Restart the cache for get_name
-        self.get_name(cursor.dbname)
+        self.get_name.reset()
         return res
 
-    def delete(self, cursor, user, ids, context=None):
-        res = super(Calendar, self).delete(cursor, user, ids, context=context)
+    def delete(self, ids):
+        res = super(Calendar, self).delete(ids)
         # Restart the cache for calendar
-        self.get_name(cursor.dbname)
+        self.get_name.reset()
         return res
 
-    def check_name(self, cursor, user, ids):
+    def check_name(self, ids):
         '''
         Check the name doesn't end with .ics
         '''
-        for calendar in self.browse(cursor, user, ids):
+        for calendar in self.browse(ids):
             if calendar.name.endswith('.ics'):
                 return False
         return True
 
     @Cache('calendar_calendar.get_name')
-    def get_name(self, cursor, user, name, context=None):
+    def get_name(self, name):
         '''
         Return the calendar id of the name
 
-        :param cursor: the database cursor
-        :param user: the user id
         :param name: the calendar name
-        :param context: the context
         :return: the calendar.calendar id or False
         '''
-        calendar_ids = self.search(cursor, user, [
+        calendar_ids = self.search([
             ('name', '=', name),
-            ], limit=1, context=context)
+            ], limit=1)
         if calendar_ids:
             return calendar_ids[0]
         return False
 
-    def calendar2ical(self, cursor, user, calendar_id, context=None):
+    def calendar2ical(self, calendar_id):
         '''
         Return an iCalendar object for the given calendar_id containing
         all the vevent objects
 
-        :param cursor: the database cursor
-        :param user: the user id
         :param calendar_id: an id of calendar.calendar
-        :param context: the context
         :return: an iCalendar
         '''
         event_obj = self.pool.get('calendar.event')
 
         ical = vobject.iCalendar()
         ical.vevent_list = []
-        event_ids = event_obj.search(cursor, user, [
+        event_ids = event_obj.search([
             ('calendar', '=', calendar_id),
             ('parent', '=', False),
-            ], context=context)
-        for event in event_obj.browse(cursor, user, event_ids,
-                context=context):
-            ical2 = event_obj.event2ical(cursor, user, event.id,
-                    context=context)
+            ])
+        for event in event_obj.browse(event_ids):
+            ical2 = event_obj.event2ical(event.id)
             ical.vevent_list.extend(ical2.vevent_list)
         return ical
 
-    def _fbtype(self, cursor, user, event, context=None):
+    def _fbtype(self, event):
         '''
         Return the freebusy type for give transparent and status
 
-        :param cursor: the database cursor
-        :param user: the user id
         :param event: a BrowseRecord of calendar.event
-        :param context: the context
         :return: a freebusy type ('FREE', 'BUSY', 'BUSY-TENTATIVE')
         '''
         if event.transp == 'opaque':
@@ -138,17 +129,14 @@ class Calendar(ModelSQL, ModelView):
             fbtype = 'FREE'
         return fbtype
 
-    def freebusy(self, cursor, user, calendar_id, dtstart, dtend, context=None):
+    def freebusy(self, calendar_id, dtstart, dtend):
         '''
         Return an iCalendar object for the given calendar_id with the
         vfreebusy objects between the two dates
 
-        :param cursor: the database cursor
-        :param user: the user id
         :param calendar_id: an id of calendar.calendar
         :param dtstart: a date or datetime
         :param dtend: a date of datetime
-        :param context: the context
         :return: an iCalendar
         '''
         event_obj = self.pool.get('calendar.event')
@@ -169,31 +157,32 @@ class Calendar(ModelSQL, ModelView):
         else:
             ical.vfreebusy.add('dtend').value = dtend.astimezone(tzutc)
 
-        event_ids = event_obj.search(cursor, 0, [
-            ['OR',
-                [('dtstart', '<=', dtstart),
-                    ('dtend', '>=', dtstart)],
-                [('dtstart', '<=', dtend),
-                    ('dtend', '>=', dtend)],
-                [('dtstart', '>=', dtstart),
-                    ('dtend', '<=', dtend)],
-                [('dtstart', '>=', dtstart),
-                    ('dtstart', '<=', dtend),
-                    ('dtend', '=', False)]],
-            ('parent', '=', False),
-            ('rdates', '=', False),
-            ('rrules', '=', False),
-            ('exdates', '=', False),
-            ('exrules', '=', False),
-            ('occurences', '=', False),
-            ('calendar', '=', calendar_id),
-            ], context=context)
-
-        for event in event_obj.browse(cursor, 0, event_ids, context=context):
+        with Transaction().set_user(0):
+            event_ids = event_obj.search([
+                ['OR',
+                    [('dtstart', '<=', dtstart),
+                        ('dtend', '>=', dtstart)],
+                    [('dtstart', '<=', dtend),
+                        ('dtend', '>=', dtend)],
+                    [('dtstart', '>=', dtstart),
+                        ('dtend', '<=', dtend)],
+                    [('dtstart', '>=', dtstart),
+                        ('dtstart', '<=', dtend),
+                        ('dtend', '=', False)]],
+                ('parent', '=', False),
+                ('rdates', '=', False),
+                ('rrules', '=', False),
+                ('exdates', '=', False),
+                ('exrules', '=', False),
+                ('occurences', '=', False),
+                ('calendar', '=', calendar_id),
+                ])
+            events = event_obj.browse(event_ids)
+
+        for event in events:
             # Don't group freebusy as sunbird doesn't handle it
             freebusy = ical.vfreebusy.add('freebusy')
-            freebusy.fbtype_param = self._fbtype(cursor, user, event,
-                    context=context)
+            freebusy.fbtype_param = self._fbtype(event)
             if event.dtstart.replace(tzinfo=tzlocal) >= dtstart:
                 freebusy_dtstart = event.dtstart.replace(tzinfo=tzlocal)
             else:
@@ -206,21 +195,23 @@ class Calendar(ModelSQL, ModelView):
                 freebusy_dtstart.astimezone(tzutc),
                 freebusy_dtend.astimezone(tzutc))]
 
-        event_ids = event_obj.search(cursor, 0, [
-            ('parent', '=', False),
-            ('dtstart', '<=', dtend),
-            ['OR',
-                ('rdates', '!=', False),
-                ('rrules', '!=', False),
-                ('exdates', '!=', False),
-                ('exrules', '!=', False),
-                ('occurences', '!=', False),
-            ],
-            ('calendar', '=', calendar_id),
-            ], context=context)
-        for event in event_obj.browse(cursor, 0, event_ids, context=context):
-            event_ical = event_obj.event2ical(cursor, user, event,
-                    context=context)
+        with Transaction().set_user(0):
+            event_ids = event_obj.search([
+                ('parent', '=', False),
+                ('dtstart', '<=', dtend),
+                ['OR',
+                    ('rdates', '!=', False),
+                    ('rrules', '!=', False),
+                    ('exdates', '!=', False),
+                    ('exrules', '!=', False),
+                    ('occurences', '!=', False),
+                ],
+                ('calendar', '=', calendar_id),
+                ])
+            events = event_obj.browse(event_ids)
+
+        for event in events:
+            event_ical = event_obj.event2ical(event)
             if event_ical.vevent.rruleset:
                 between_dtstart, between_dtend = dtstart, dtend
                 if event.all_day:
@@ -242,8 +233,7 @@ class Calendar(ModelSQL, ModelView):
                         or (freebusy_dtstart.replace(tzinfo=tzlocal) >= dtstart
                         and freebusy_dtend.replace(tzinfo=tzlocal) <= dtend)):
                         continue
-                    freebusy_fbtype = self._fbtype(cursor, user, event,
-                            context=context)
+                    freebusy_fbtype = self._fbtype(event)
                     all_day = event.all_day
                     for occurence in event.occurences:
                         if occurence.recurrence.replace(tzinfo=tzlocal) == \
@@ -255,8 +245,7 @@ class Calendar(ModelSQL, ModelView):
                             else:
                                 freebusy_dtend = freebusy_dtstart
                             all_day = occurence.all_day
-                            freebusy_fbtype = self._fbtype(cursor, user,
-                                    occurence, context=context)
+                            freebusy_fbtype = self._fbtype(occurence)
                             break
                     freebusy = ical.vfreebusy.add('freebusy')
                     freebusy.fbtype_param = freebusy_fbtype
@@ -276,26 +265,21 @@ class Calendar(ModelSQL, ModelView):
                             freebusy_dtend.astimezone(tzutc))]
         return ical
 
-    def post(self, cursor, user, uri, data, context=None):
+    def post(self, uri, data):
         '''
         Handle post of vfreebusy request
 
-        :param cursor: the database cursor
-        :param user: the user id
         :param uri: the posted uri
         :param data: the posted data
-        :param context: the context
         :return: the xml with schedule-response
         '''
         from DAV.errors import DAV_Forbidden
         collection_obj = self.pool.get('webdav.collection')
 
-        calendar_id = collection_obj.calendar(cursor, user, uri,
-                context=context)
+        calendar_id = collection_obj.calendar(uri)
         if not calendar_id:
             raise DAV_Forbidden
-        calendar = self.browse(cursor, user, calendar_id,
-                context=context)
+        calendar = self.browse(calendar_id)
         if calendar.owner.id != user:
             raise DAV_Forbidden
         ical = vobject.readOne(data)
@@ -335,12 +319,12 @@ class Calendar(ModelSQL, ModelView):
                 email = attendee.value
                 if attendee.value.lower().startswith('mailto:'):
                     email = attendee.value[7:]
-                calendar_ids = self.search(cursor, 0, [
-                    ('owner.email', '=', email),
-                    ], context=context)
+                with Transaction().set_user(0):
+                    calendar_ids = self.search([
+                        ('owner.email', '=', email),
+                        ])
                 if calendar_ids:
-                    vfreebusy = self.freebusy(cursor, user, calendar_ids[0],
-                            dtstart, dtend, context=context)
+                    vfreebusy = self.freebusy(calendar_ids[0], dtstart, dtend)
                     vfreebusy.vfreebusy.add('dtstamp').value = \
                             ical.vfreebusy.dtstamp.value
                     vfreebusy.vfreebusy.add('uid').value = \
@@ -522,45 +506,46 @@ class Event(ModelSQL, ModelView):
             'invalid_recurrence': 'Recurrence can not be recurrent!',
         })
 
-    def init(self, cursor, module_name):
+    def init(self, module_name):
         # Migrate from 1.4: remove classification_public
         model_data_obj = self.pool.get('ir.model.data')
         rule_obj = self.pool.get('ir.rule')
-        model_data_ids = model_data_obj.search(cursor, 0, [
-            ('fs_id', '=', 'rule_group_read_calendar_line3'),
-            ('module', '=', module_name),
-            ('inherit', '=', False),
-            ], limit=1)
-        if model_data_ids:
-            model_data = model_data_obj.browse(cursor, 0, model_data_ids[0])
-            rule_obj.delete(cursor, 0, model_data.db_id)
-        return super(Event, self).init(cursor, module_name)
-
-    def default_uuid(self, cursor, user, context=None):
+        with Transaction().set_user(0):
+            model_data_ids = model_data_obj.search([
+                ('fs_id', '=', 'rule_group_read_calendar_line3'),
+                ('module', '=', module_name),
+                ('inherit', '=', False),
+                ], limit=1)
+            if model_data_ids:
+                model_data = model_data_obj.browse(model_data_ids[0])
+                rule_obj.delete(model_data.db_id)
+        return super(Event, self).init(module_name)
+
+    def default_uuid(self):
         return str(uuid.uuid4())
 
-    def default_sequence(self, cursor, user, context=None):
+    def default_sequence(self):
         return 0
 
-    def default_classification(self, cursor, user, context=None):
+    def default_classification(self):
         return 'public'
 
-    def default_transp(self, cursor, user, context=None):
+    def default_transp(self):
         return 'opaque'
 
-    def default_timezone(self, cursor, user, context=None):
+    def default_timezone(self):
         user_obj = self.pool.get('res.user')
-        user_ = user_obj.browse(cursor, user, user, context=context)
-        return user_.timezone
+        user = user_obj.browse(Transaction().user)
+        return user.timezone
 
-    def timezones(self, cursor, user, context=None):
+    def timezones(self):
         return [(x, x) for x in pytz.common_timezones] + [('', '')]
 
-    def get_calendar_field(self, cursor, user, ids, name, context=None):
+    def get_calendar_field(self, ids, name):
         assert name in ('calendar_owner', 'calendar_read_users',
                 'calendar_write_users'), 'Invalid name'
         res = {}
-        for event in self.browse(cursor, user, ids, context=context):
+        for event in self.browse(ids):
             name = name[9:]
             if name in ('read_users', 'write_users'):
                 res[event.id] = [x.id for x in event.calendar[name]]
@@ -568,14 +553,14 @@ class Event(ModelSQL, ModelView):
                 res[event.id] = event.calendar[name].id
         return res
 
-    def search_calendar_field(self, cursor, user, name, clause, context=None):
+    def search_calendar_field(self, name, clause):
         return [('calendar.' + name[9:],) + clause[1:]]
 
-    def check_recurrence(self, cursor, user, ids):
+    def check_recurrence(self, ids):
         '''
         Check the recurrence is not recurrent.
         '''
-        for event in self.browse(cursor, user, ids):
+        for event in self.browse(ids):
             if not event.parent:
                 continue
             if event.rdates \
@@ -586,12 +571,12 @@ class Event(ModelSQL, ModelView):
                 return False
         return True
 
-    def create(self, cursor, user, values, context=None):
+    def create(self, values):
         calendar_obj = self.pool.get('calendar.calendar')
         collection_obj = self.pool.get('webdav.collection')
 
-        res = super(Event, self).create(cursor, user, values, context=context)
-        event = self.browse(cursor, user, res, context=context)
+        res = super(Event, self).create(values)
+        event = self.browse(res)
         if event.calendar.owner \
                 and (event.organizer == event.calendar.owner.email \
                 or (event.parent \
@@ -605,38 +590,38 @@ class Event(ModelSQL, ModelView):
                         if x.status != 'declined'
                         and x.email != event.parent.organizer]
             if attendee_emails:
-                calendar_ids = calendar_obj.search(cursor, 0, [
-                    ('owner.email', 'in', attendee_emails),
-                    ], context=context)
-                if not event.recurrence:
-                    for calendar_id in calendar_ids:
-                        new_id = self.copy(cursor, 0, event.id, default={
-                            'calendar': calendar_id,
-                            'occurences': False,
-                            }, context=context)
-                        for occurence in event.occurences:
-                            self.copy(cursor, 0, occurence.id, default={
+                with Transaction().set_user(0):
+                    calendar_ids = calendar_obj.search([
+                        ('owner.email', 'in', attendee_emails),
+                        ])
+                    if not event.recurrence:
+                        for calendar_id in calendar_ids:
+                            new_id = self.copy(event.id, default={
                                 'calendar': calendar_id,
-                                'parent': new_id,
-                                }, context=context)
-                else:
-                    parent_ids = self.search(cursor, 0, [
-                        ('uuid', '=', event.uuid),
-                        ('calendar.owner.email', 'in', attendee_emails),
-                        ('id', '!=', event.id),
-                        ('recurrence', '=', False),
-                        ], context=context)
-                    for parent in self.browse(cursor, 0, parent_ids,
-                            context=context):
-                        self.copy(cursor, 0, event.id, default={
-                            'calendar': parent.calendar.id,
-                            'parent': parent.id,
-                            }, context=context)
+                                'occurences': False,
+                                })
+                            for occurence in event.occurences:
+                                self.copy(occurence.id, default={
+                                    'calendar': calendar_id,
+                                    'parent': new_id,
+                                    })
+                    else:
+                        parent_ids = self.search([
+                            ('uuid', '=', event.uuid),
+                            ('calendar.owner.email', 'in', attendee_emails),
+                            ('id', '!=', event.id),
+                            ('recurrence', '=', False),
+                            ])
+                        for parent in self.browse(parent_ids):
+                            self.copy(event.id, default={
+                                'calendar': parent.calendar.id,
+                                'parent': parent.id,
+                                })
         # Restart the cache for event
-        collection_obj.event(cursor.dbname)
+        collection_obj.event.reset()
         return res
 
-    def _event2update(self, cursor, user, event, context=None):
+    def _event2update(self, event):
         rdate_obj = self.pool.get('calendar.event.rdate')
         exdate_obj = self.pool.get('calendar.event.exdate')
         rrule_obj = self.pool.get('calendar.event.rrule')
@@ -653,32 +638,32 @@ class Event(ModelSQL, ModelView):
         res['organizer'] = event.organizer
         res['rdates'] = [('delete_all',)]
         for rdate in event.rdates:
-            vals = rdate_obj._date2update(cursor, user, rdate, context=context)
+            vals = rdate_obj._date2update(rdate)
             res['rdates'].append(('create', vals))
         res['exdates'] = [('delete_all',)]
         for exdate in event.exdates:
-            vals = exdate_obj._date2update(cursor, user, exdate, context=context)
+            vals = exdate_obj._date2update(exdate)
             res['exdates'].append(('create', vals))
         res['rrules'] = [('delete_all',)]
         for rrule in event.rrules:
-            vals = rrule_obj._rule2update(cursor, user, rrule, context=context)
+            vals = rrule_obj._rule2update(rrule)
             res['rrules'].append(('create', vals))
         res['exrules'] = [('delete_all',)]
         for exrule in event.exrules:
-            vals = exrule_obj._rule2update(cursor, user, exrule, context=context)
+            vals = exrule_obj._rule2update(exrule)
             res['exrules'].append(('create', vals))
         return res
 
-    def write(self, cursor, user, ids, values, context=None):
+    def write(self, ids, values):
         calendar_obj = self.pool.get('calendar.calendar')
         collection_obj = self.pool.get('webdav.collection')
+        cursor = Transaction().cursor
 
         values = values.copy()
         if 'sequence' in values:
             del values['sequence']
 
-        res = super(Event, self).write(cursor, user, ids, values,
-                context=context)
+        res = super(Event, self).write(ids, values)
 
         if isinstance(ids, (int, long)):
             ids = [ids]
@@ -690,7 +675,7 @@ class Event(ModelSQL, ModelView):
                     'SET sequence = sequence + 1 ' \
                     'WHERE ' + red_sql, red_ids)
 
-        for event in self.browse(cursor, user, ids, context=context):
+        for event in self.browse(ids):
             if event.calendar.owner \
                     and (event.organizer == event.calendar.owner.email \
                     or (event.parent \
@@ -704,57 +689,57 @@ class Event(ModelSQL, ModelView):
                             if x.status != 'declined'
                             and x.email != event.parent.organizer]
                 if attendee_emails:
-                    event_ids = self.search(cursor, 0, [
-                        ('uuid', '=', event.uuid),
-                        ('calendar.owner.email', 'in', attendee_emails),
-                        ('id', '!=', event.id),
-                        ('recurrence', '=', event.recurrence or False),
-                        ], context=context)
-                    for event2 in self.browse(cursor, user, event_ids,
-                            context=context):
-                        if event2.calendar.owner.email in attendee_emails:
-                            attendee_emails.remove(event2.calendar.owner.email)
-                    self.write(cursor, 0, event_ids, self._event2update(
-                        cursor, user, event, context=context), context=context)
-                if attendee_emails:
-                    calendar_ids = calendar_obj.search(cursor, 0, [
-                        ('owner.email', 'in', attendee_emails),
-                        ], context=context)
-                    if not event.recurrence:
-                        for calendar_id in calendar_ids:
-                            new_id = self.copy(cursor, 0, event.id, default={
-                                'calendar': calendar_id,
-                                'occurences': False,
-                                }, context=context)
-                            for occurence in event.occurences:
-                                self.copy(cursor, 0, occurence.id, default={
-                                    'calendar': calendar_id,
-                                    'parent': new_id,
-                                    }, context=context)
-                    else:
-                        parent_ids = self.search(cursor, 0, [
+                    with Transaction().set_user(0):
+                        event_ids = self.search([
                             ('uuid', '=', event.uuid),
                             ('calendar.owner.email', 'in', attendee_emails),
                             ('id', '!=', event.id),
-                            ('recurrence', '=', False),
-                            ], context=context)
-                        for parent in self.browse(cursor, 0, parent_ids,
-                                context=context):
-                            self.copy(cursor, 0, event.id, default={
-                                'calendar': parent.calendar.id,
-                                'parent': parent.id,
-                                }, context=context)
+                            ('recurrence', '=', event.recurrence or False),
+                            ])
+                        for event2 in self.browse(event_ids):
+                            if event2.calendar.owner.email in attendee_emails:
+                                attendee_emails.remove(
+                                        event2.calendar.owner.email)
+                        self.write(event_ids, self._event2update(event))
+                if attendee_emails:
+                    with Transaction().set_user(0):
+                        calendar_ids = calendar_obj.search([
+                            ('owner.email', 'in', attendee_emails),
+                            ])
+                        if not event.recurrence:
+                            for calendar_id in calendar_ids:
+                                new_id = self.copy(event.id, default={
+                                    'calendar': calendar_id,
+                                    'occurences': False,
+                                    })
+                                for occurence in event.occurences:
+                                    self.copy(occurence.id, default={
+                                        'calendar': calendar_id,
+                                        'parent': new_id,
+                                        })
+                        else:
+                            parent_ids = self.search([
+                                ('uuid', '=', event.uuid),
+                                ('calendar.owner.email', 'in', attendee_emails),
+                                ('id', '!=', event.id),
+                                ('recurrence', '=', False),
+                                ])
+                            for parent in self.browse(parent_ids):
+                                self.copy(event.id, default={
+                                    'calendar': parent.calendar.id,
+                                    'parent': parent.id,
+                                    })
         # Restart the cache for event
-        collection_obj.event(cursor.dbname)
+        collection_obj.event.reset()
         return res
 
-    def delete(self, cursor, user, ids, context=None):
+    def delete(self, ids):
         attendee_obj = self.pool.get('calendar.event.attendee')
         collection_obj = self.pool.get('webdav.collection')
 
         if isinstance(ids, (int, long)):
             ids = [ids]
-        for event in self.browse(cursor, user, ids, context=context):
+        for event in self.browse(ids):
             if event.calendar.owner \
                     and (event.organizer == event.calendar.owner.email \
                     or (event.parent \
@@ -766,50 +751,47 @@ class Event(ModelSQL, ModelView):
                     attendee_emails = [x.email for x in event.parent.attendees
                             if x.email != event.parent.organizer]
                 if attendee_emails:
-                    event_ids = self.search(cursor, 0, [
-                        ('uuid', '=', event.uuid),
-                        ('calendar.owner.email', 'in', attendee_emails),
-                        ('id', '!=', event.id),
-                        ('recurrence', '=', event.recurrence or False),
-                        ], context=context)
-                    self.delete(cursor, 0, event_ids, context=context)
+                    with Transaction().set_user(0):
+                        event_ids = self.search([
+                            ('uuid', '=', event.uuid),
+                            ('calendar.owner.email', 'in', attendee_emails),
+                            ('id', '!=', event.id),
+                            ('recurrence', '=', event.recurrence or False),
+                            ])
+                        self.delete(event_ids)
             elif event.organizer \
                     or (event.parent and event.parent.organizer):
                 if event.organizer:
                     organizer = event.organizer
                 else:
                     organizer = event.parent.organizer
-                event_ids = self.search(cursor, 0, [
-                    ('uuid', '=', event.uuid),
-                    ('calendar.owner.email', '=', organizer),
-                    ('id', '!=', event.id),
-                    ('recurrence', '=', event.recurrence or False),
-                    ], context=context, limit=1)
-                if event_ids:
-                    event2 = self.browse(cursor, 0, event_ids[0],
-                            context=context)
-                    for attendee in event2.attendees:
-                        if attendee.email == event.calendar.owner.email:
-                            attendee_obj.write(cursor, 0, attendee.id, {
-                                'status': 'declined',
-                                }, context=context)
-        res = super(Event, self).delete(cursor, user, ids, context=context)
+                with Transaction().set_user(0):
+                    event_ids = self.search([
+                        ('uuid', '=', event.uuid),
+                        ('calendar.owner.email', '=', organizer),
+                        ('id', '!=', event.id),
+                        ('recurrence', '=', event.recurrence or False),
+                        ], limit=1)
+                    if event_ids:
+                        event2 = self.browse(event_ids[0])
+                        for attendee in event2.attendees:
+                            if attendee.email == event.calendar.owner.email:
+                                attendee_obj.write(attendee.id, {
+                                    'status': 'declined',
+                                    })
+        res = super(Event, self).delete(ids)
         # Restart the cache for event
-        collection_obj.event(cursor.dbname)
+        collection_obj.event.reset()
         return res
 
-    def ical2values(self, cursor, user, event_id, ical, calendar_id,
-            vevent=None, context=None):
+    def ical2values(self, event_id, ical, calendar_id, vevent=None):
         '''
         Convert iCalendar to values for create or write
 
-        :param cursor: the database cursor
-        :param user: the user id
         :param event_id: the event id for write or None for create
         :param ical: a ical instance of vobject
         :param calendar_id: the calendar id of the event
         :param vevent: the vevent of the ical to use if None use the first one
-        :param context: the context
         :return: a dictionary with values
         '''
         category_obj = self.pool.get('calendar.category')
@@ -822,9 +804,6 @@ class Event(ModelSQL, ModelView):
         rrule_obj = self.pool.get('calendar.event.rrule')
         exrule_obj = self.pool.get('calendar.event.exrule')
 
-        if context is None:
-            context = {}
-
         vevents = []
         if not vevent:
             vevent = ical.vevent
@@ -836,7 +815,7 @@ class Event(ModelSQL, ModelView):
 
         event = None
         if event_id:
-            event = self.browse(cursor, user, event_id, context=context)
+            event = self.browse(event_id)
 
         res = {}
         if not event:
@@ -893,21 +872,19 @@ class Event(ModelSQL, ModelView):
         else:
             res['status'] = ''
         if hasattr(vevent, 'categories'):
-            ctx = context.copy()
-            ctx['active_test'] = False
-            category_ids = category_obj.search(cursor, user, [
-                ('name', 'in', [x for x in vevent.categories.value]),
-                ], context=context)
-            categories = category_obj.browse(cursor, user, category_ids,
-                    context=context)
+            with Transaction().set_context(active_test=False):
+                category_ids = category_obj.search([
+                    ('name', 'in', [x for x in vevent.categories.value]),
+                    ])
+            categories = category_obj.browse(category_ids)
             category_names2ids = {}
             for category in categories:
                 category_names2ids[category.name] = category.id
             for category in vevent.categories.value:
                 if category not in category_names2ids:
-                    category_ids.append(category_obj.create(cursor, user, {
+                    category_ids.append(category_obj.create({
                         'name': category,
-                        }, context=context))
+                        }))
             res['categories'] = [('set', category_ids)]
         else:
             res['categories'] = [('unlink_all',)]
@@ -920,15 +897,14 @@ class Event(ModelSQL, ModelView):
         else:
             res['classification'] = 'public'
         if hasattr(vevent, 'location'):
-            ctx = context.copy()
-            ctx['active_test'] = False
-            location_ids = location_obj.search(cursor, user, [
-                ('name', '=', vevent.location.value),
-                ], limit=1, context=ctx)
+            with Transaction().set_context(active_test=False):
+                location_ids = location_obj.search([
+                    ('name', '=', vevent.location.value),
+                    ], limit=1)
             if not location_ids:
-                location_id = location_obj.create(cursor, user, {
+                location_id = location_obj.create({
                     'name': vevent.location.value,
-                    }, context=context)
+                    })
             else:
                 location_id = location_ids[0]
             res['location'] = location_id
@@ -958,8 +934,7 @@ class Event(ModelSQL, ModelView):
         if hasattr(vevent, 'attendee'):
             while vevent.attendee_list:
                 attendee = vevent.attendee_list.pop()
-                vals = attendee_obj.attendee2values(cursor, user, attendee,
-                        context=context)
+                vals = attendee_obj.attendee2values(attendee)
                 if vals['email'] in attendees_todel:
                     res['attendees'].append(('write',
                         attendees_todel[vals['email']], vals))
@@ -975,8 +950,7 @@ class Event(ModelSQL, ModelView):
             while vevent.rdate_list:
                 rdate = vevent.rdate_list.pop()
                 for date in rdate.value:
-                    vals = rdate_obj.date2values(cursor, user, date,
-                            context=context)
+                    vals = rdate_obj.date2values(date)
                     res['rdates'].append(('create', vals))
 
         res['exdates'] = []
@@ -986,8 +960,7 @@ class Event(ModelSQL, ModelView):
             while vevent.exdate_list:
                 exdate = vevent.exdate_list.pop()
                 for date in exdate.value:
-                    vals = exdate_obj.date2values(cursor, user, date,
-                            context=context)
+                    vals = exdate_obj.date2values(date)
                     res['exdates'].append(('create', vals))
 
         res['rrules'] = []
@@ -996,8 +969,7 @@ class Event(ModelSQL, ModelView):
         if hasattr(vevent, 'rrule'):
             while vevent.rrule_list:
                 rrule = vevent.rrule_list.pop()
-                vals = rrule_obj.rule2values(cursor, user, rrule,
-                        context=context)
+                vals = rrule_obj.rule2values(rrule)
                 res['rrules'].append(('create', vals))
 
         res['exrules'] = []
@@ -1006,8 +978,7 @@ class Event(ModelSQL, ModelView):
         if hasattr(vevent, 'exrule'):
             while vevent.exrule_list:
                 exrule = vevent.exrule_list.pop()
-                vals = exrule_obj.rule2values(cursor, user, exrule,
-                        context=context)
+                vals = exrule_obj.rule2values(exrule)
                 res['exrules'].append(('create', vals))
 
         if event:
@@ -1017,8 +988,7 @@ class Event(ModelSQL, ModelView):
             res.setdefault('alarms', [])
             while vevent.valarm_list:
                 valarm = vevent.valarm_list.pop()
-                vals = alarm_obj.valarm2values(cursor, user, valarm,
-                        context=context)
+                vals = alarm_obj.valarm2values(valarm)
                 res['alarms'].append(('create', vals))
 
         if hasattr(ical, 'vtimezone'):
@@ -1036,8 +1006,7 @@ class Event(ModelSQL, ModelView):
             occurences_todel = [x.id for x in event.occurences]
         for vevent in vevents:
             event_id = None
-            vals = self.ical2values(cursor, user, event_id, ical,
-                    calendar_id, vevent=vevent, context=context)
+            vals = self.ical2values(event_id, ical, calendar_id, vevent=vevent)
             if event:
                 for occurence in event.occurences:
                     if vals['recurrence'] == \
@@ -1058,17 +1027,14 @@ class Event(ModelSQL, ModelView):
             res['occurences'].insert(0, ('delete', occurences_todel))
         return res
 
-    def event2ical(self, cursor, user, event, context=None):
+    def event2ical(self, event):
         '''
         Return an iCalendar instance of vobject for event
 
-        :param cursor: the database cursor
-        :param user: the user id
         :param event: a BrowseRecord of calendar.event
             or a calendar.event id
         :param calendar: a BrowseRecord of calendar.calendar
             or a calendar.calendar id
-        :param context: the context
         :return: an iCalendar instance of vobject
         '''
         user_obj = self.pool.get('res.user')
@@ -1080,13 +1046,13 @@ class Event(ModelSQL, ModelView):
         exrule_obj = self.pool.get('calendar.event.exrule')
 
         if isinstance(event, (int, long)):
-            event = self.browse(cursor, user, event, context=context)
+            event = self.browse(event)
 
-        user_ = user_obj.browse(cursor, user, user, context=context)
+        user = user_obj.browse(Transaction().user)
         if event.timezone:
             tzevent = pytz.timezone(event.timezone)
-        elif user_.timezone:
-                tzevent = pytz.timezone(user_.timezone)
+        elif user.timezone:
+                tzevent = pytz.timezone(user.timezone)
         else:
             tzevent = tzlocal
 
@@ -1190,41 +1156,36 @@ class Event(ModelSQL, ModelView):
         vevent.attendee_list = []
         for attendee in event.attendees:
             vevent.attendee_list.append(attendee_obj.attendee2attendee(
-                cursor, user, attendee, context=context))
+                attendee))
 
         if event.rdates:
             vevent.add('rdate')
             vevent.rdate.value = []
             for rdate in event.rdates:
-                vevent.rdate.value.append(rdate_obj.date2date(cursor, user,
-                    rdate, context=context))
+                vevent.rdate.value.append(rdate_obj.date2date(rdate))
 
         if event.exdates:
             vevent.add('exdate')
             vevent.exdate.value = []
             for exdate in event.exdates:
-                vevent.exdate.value.append(exdate_obj.date2date(cursor, user,
-                    exdate, context=context))
+                vevent.exdate.value.append(exdate_obj.date2date(exdate))
 
         if event.rrules:
             for rrule in event.rrules:
-                vevent.add('rrule').value = rrule_obj.rule2rule(cursor, user,
-                        rrule, context=context)
+                vevent.add('rrule').value = rrule_obj.rule2rule(rrule)
 
         if event.exrules:
             for exrule in event.exrules:
-                vevent.add('exrule').value = exrule_obj.rule2rule(cursor, user,
-                        exrule, context=context)
+                vevent.add('exrule').value = exrule_obj.rule2rule(exrule)
 
         vevent.valarm_list = []
         for alarm in event.alarms:
-            valarm = alarm_obj.alarm2valarm(cursor, user, alarm,
-                    context=context)
+            valarm = alarm_obj.alarm2valarm(alarm)
             if valarm:
                 vevent.valarm_list.append(valarm)
 
         for occurence in event.occurences:
-            oical = self.event2ical(cursor, user, occurence, context=context)
+            oical = self.event2ical(occurence)
             ical.vevent_list.append(oical.vevent)
         return ical
 
@@ -1251,28 +1212,22 @@ class Alarm(ModelSQL):
 
     valarm = fields.Binary('valarm')
 
-    def valarm2values(self, cursor, user, valarm, context=None):
+    def valarm2values(self, valarm):
         '''
         Convert a valarm object into values for create or write
 
-        :param cursor: the database cursor
-        :param user: the user id
         :param valarm: the valarm object
-        :param context: the context
         :return: a dictionary with values
         '''
         res = {}
         res['valarm'] = valarm.serialize()
         return res
 
-    def alarm2valarm(self, cursor, user, alarm, context=None):
+    def alarm2valarm(self, alarm):
         '''
         Return a valarm instance of vobject for alarm
 
-        :param cursor: the database cursor
-        :param user: the user id
         :param alarm: a BrowseRecord of calendar.event.alarm
-        :param context: the context
         :return: a valarm instance of vobject
         '''
         valarm = None
@@ -1294,50 +1249,48 @@ class EventAlarm(ModelSQL):
     event = fields.Many2One('calendar.event', 'Event', ondelete='CASCADE',
             required=True, select=1)
 
-    def create(self, cursor, user, values, context=None):
+    def create(self, values):
         event_obj = self.pool.get('calendar.event')
         if values.get('event'):
             # Update write_date of event
-            event_obj.write(cursor, user, values['event'], {}, context=context)
-        return super(EventAlarm, self).create(cursor, user, values, context=context)
+            event_obj.write(values['event'], {})
+        return super(EventAlarm, self).create(values)
 
-    def write(self, cursor, user, ids, values, context=None):
+    def write(self, ids, values):
         event_obj = self.pool.get('calendar.event')
         if isinstance(ids, (int, long)):
             ids = [ids]
-        event_ids = [x.event.id for x in self.browse(cursor, user, ids,
-            context=context)]
+        event_ids = [x.event.id for x in self.browse(ids)]
         if values.get('event'):
             event_ids.append(values['event'])
         if event_ids:
             # Update write_date of event
-            event_obj.write(cursor, user, event_ids, {}, context=context)
-        return super(EventAlarm, self).write(cursor, user, ids, values,
-                context=context)
+            event_obj.write(event_ids, {})
+        return super(EventAlarm, self).write(ids, values)
 
-    def delete(self, cursor, user, ids, context=None):
+    def delete(self, ids):
         event_obj = self.pool.get('calendar.event')
         alarm_obj = self.pool.get('calendar.alarm')
         if isinstance(ids, (int, long)):
             ids = [ids]
-        event_alarms = self.browse(cursor, user, ids, context=context)
+        event_alarms = self.browse(ids)
         alarm_ids = [a.calendar_alarm.id for a in event_alarms]
         event_ids = [x.event.id for x in event_alarms]
         if event_ids:
             # Update write_date of event
-            event_obj.write(cursor, user, event_ids, {}, context=context)
-        res = super(EventAlarm, self).delete(cursor, user, ids, context=context)
+            event_obj.write(event_ids, {})
+        res = super(EventAlarm, self).delete(ids)
         if alarm_ids:
-            alarm_obj.delete(cursor, user, alarm_ids, context=context)
+            alarm_obj.delete(alarm_ids)
         return res
 
-    def valarm2values(self, cursor, user, alarm, context=None):
+    def valarm2values(self, alarm):
         alarm_obj = self.pool.get('calendar.alarm')
-        return alarm_obj.valarm2values(cursor, user, alarm, context=context)
+        return alarm_obj.valarm2values(alarm)
 
-    def alarm2valarm(self, cursor, user, alarm, context=None):
+    def alarm2valarm(self, alarm):
         alarm_obj = self.pool.get('calendar.alarm')
-        return alarm_obj.alarm2valarm(cursor, user, alarm, context=context)
+        return alarm_obj.alarm2valarm(alarm)
 
 EventAlarm()
 
@@ -1360,22 +1313,19 @@ class Attendee(ModelSQL, ModelView):
         ], 'Participation Status')
     attendee = fields.Binary('attendee')
 
-    def default_status(self, cursor, user, context=None):
+    def default_status(self):
         return ''
 
-    def _attendee2update(self, cursor, user, attendee, context=None):
+    def _attendee2update(self, attendee):
         res = {}
         res['status'] = attendee.status
         return res
 
-    def attendee2values(self, cursor, user, attendee, context=None):
+    def attendee2values(self, attendee):
         '''
         Convert a attendee object into values for create or write
 
-        :param cursor: the database cursor
-        :param user: the user id
         :param attendee: the attendee object
-        :param context: the context
         :return: a dictionary with values
         '''
         res = {}
@@ -1390,14 +1340,11 @@ class Attendee(ModelSQL, ModelView):
         res['attendee'] = attendee.serialize()
         return res
 
-    def attendee2attendee(self, cursor, user, attendee, context=None):
+    def attendee2attendee(self, attendee):
         '''
         Return a attendee instance of vobject for attendee
 
-        :param cursor: the database cursor
-        :param user: the user id
         :param attendee: a BrowseRecord of calendar.event.attendee
-        :param context: the context
         :return: a attendee instance of vobject
         '''
         res = None
@@ -1434,14 +1381,13 @@ class EventAttendee(ModelSQL, ModelView):
     event = fields.Many2One('calendar.event', 'Event', ondelete='CASCADE',
             required=True, select=1)
 
-    def create(self, cursor, user, values, context=None):
+    def create(self, values):
         event_obj = self.pool.get('calendar.event')
         if values.get('event'):
             # Update write_date of event
-            event_obj.write(cursor, user, values['event'], {}, context=context)
-        res = super(EventAttendee, self).create(cursor, user, values,
-                context=context)
-        attendee = self.browse(cursor, user, res, context=context)
+            event_obj.write(values['event'], {})
+        res = super(EventAttendee, self).create(values)
+        attendee = self.browse(res)
         event = attendee.event
         if event.calendar.owner \
                 and (event.organizer == event.calendar.owner.email \
@@ -1454,37 +1400,36 @@ class EventAttendee(ModelSQL, ModelView):
                 attendee_emails = [x.email for x in event.parent.attendees
                         if x.email != event.parent.organizer]
             if attendee_emails:
-                event_ids = event_obj.search(cursor, 0, [
-                    ('uuid', '=', event.uuid),
-                    ('calendar.owner.email', 'in', attendee_emails),
-                    ('id', '!=', event.id),
-                    ('recurrence', '=', event.recurrence or False),
-                    ], context=context)
-                for event_id in event_ids:
-                    self.copy(cursor, 0, res, default={
-                        'event': event_id,
-                        }, context=context)
+                with Transaction().set_user(0):
+                    event_ids = event_obj.search([
+                        ('uuid', '=', event.uuid),
+                        ('calendar.owner.email', 'in', attendee_emails),
+                        ('id', '!=', event.id),
+                        ('recurrence', '=', event.recurrence or False),
+                        ])
+                    for event_id in event_ids:
+                        self.copy(res, default={
+                            'event': event_id,
+                            })
         return res
 
-    def write(self, cursor, user, ids, values, context=None):
+    def write(self, ids, values):
         event_obj = self.pool.get('calendar.event')
         if isinstance(ids, (int, long)):
             ids = [ids]
-        event_ids = [x.event.id for x in self.browse(cursor, user, ids,
-            context=context)]
+        event_ids = [x.event.id for x in self.browse(ids)]
         if values.get('event'):
             event_ids.append(values['event'])
         if event_ids:
             # Update write_date of event
-            event_obj.write(cursor, user, event_ids, {}, context=context)
+            event_obj.write(event_ids, {})
 
         if 'email' in values:
             values = values.copy()
             del values['email']
 
-        res = super(EventAttendee, self).write(cursor, user, ids, values,
-                context=context)
-        attendees = self.browse(cursor, user, ids, context=context)
+        res = super(EventAttendee, self).write(ids, values)
+        attendees = self.browse(ids)
         for attendee in attendees:
             event = attendee.event
             if event.calendar.owner \
@@ -1498,32 +1443,35 @@ class EventAttendee(ModelSQL, ModelView):
                     attendee_emails = [x.email for x in event.parent.attendees
                             if x.email != event.parent.organizer]
                 if attendee_emails:
-                    attendee_ids = self.search(cursor, 0, [
-                        ('event.uuid', '=', event.uuid),
-                        ('event.calendar.owner.email', 'in', attendee_emails),
-                        ('id', '!=', attendee.id),
-                        ('event.recurrence', '=', event.recurrence or False),
-                        ('email', '=', attendee.email),
-                        ], context=context)
-                    self.write(cursor, 0, attendee_ids, self._attendee2update(
-                        cursor, user, attendee, context=context), context=context)
+                    with Transaction().set_user(0):
+                        attendee_ids = self.search([
+                            ('event.uuid', '=', event.uuid),
+                            ('event.calendar.owner.email', 'in',
+                                attendee_emails),
+                            ('id', '!=', attendee.id),
+                            ('event.recurrence', '=',
+                                event.recurrence or False),
+                            ('email', '=', attendee.email),
+                            ])
+                        self.write(attendee_ids, self._attendee2update(
+                            attendee))
         return res
 
-    def delete(self, cursor, user, ids, context=None):
+    def delete(self, ids):
         event_obj = self.pool.get('calendar.event')
         attendee_obj = self.pool.get('calendar.attendee')
 
         if isinstance(ids, (int, long)):
             ids = [ids]
-        event_attendees = self.browse(cursor, user, ids, context=context)
+        event_attendees = self.browse(ids)
         calendar_attendee_ids = [a.calendar_attendee.id \
                 for a in event_attendees]
         event_ids = [x.event.id for x in event_attendees]
         if event_ids:
             # Update write_date of event
-            event_obj.write(cursor, user, event_ids, {}, context=context)
+            event_obj.write(event_ids, {})
 
-        for attendee in self.browse(cursor, user, ids, context=context):
+        for attendee in self.browse(ids):
             event = attendee.event
             if event.calendar.owner \
                     and (event.organizer == event.calendar.owner.email \
@@ -1536,14 +1484,17 @@ class EventAttendee(ModelSQL, ModelView):
                     attendee_emails = [x.email for x in event.parent.attendees
                             if x.email != event.parent.organizer]
                 if attendee_emails:
-                    attendee_ids = self.search(cursor, 0, [
-                        ('event.uuid', '=', event.uuid),
-                        ('event.calendar.owner.email', 'in', attendee_emails),
-                        ('id', '!=', attendee.id),
-                        ('event.recurrence', '=', event.recurrence or False),
-                        ('email', '=', attendee.email),
-                        ], context=context)
-                    self.delete(cursor, 0, attendee_ids, context=context)
+                    with Transaction().set_user(0):
+                        attendee_ids = self.search([
+                            ('event.uuid', '=', event.uuid),
+                            ('event.calendar.owner.email', 'in',
+                                attendee_emails),
+                            ('id', '!=', attendee.id),
+                            ('event.recurrence', '=',
+                                event.recurrence or False),
+                            ('email', '=', attendee.email),
+                            ])
+                        self.delete(attendee_ids)
             elif event.calendar.owner \
                     and ((event.organizer \
                     or (event.parent and event.parent.organizer)) \
@@ -1552,24 +1503,24 @@ class EventAttendee(ModelSQL, ModelView):
                     organizer = event.organizer
                 else:
                     organizer = event.parent.organizer
-                attendee_ids = self.search(cursor, 0, [
-                    ('event.uuid', '=', event.uuid),
-                    ('event.calendar.owner.email', '=', organizer),
-                    ('id', '!=', attendee.id),
-                    ('event.recurrence', '=', event.recurrence or False),
-                    ('email', '=', attendee.email),
-                    ], context=context)
-                if attendee_ids:
-                    self.write(cursor, 0, attendee_ids, {
-                        'status': 'declined',
-                        }, context=context)
-        res = super(EventAttendee, self).delete(cursor, user, ids, context=context)
+                with Transaction().set_user(0):
+                    attendee_ids = self.search([
+                        ('event.uuid', '=', event.uuid),
+                        ('event.calendar.owner.email', '=', organizer),
+                        ('id', '!=', attendee.id),
+                        ('event.recurrence', '=', event.recurrence or False),
+                        ('email', '=', attendee.email),
+                        ])
+                    if attendee_ids:
+                        self.write(attendee_ids, {
+                            'status': 'declined',
+                            })
+        res = super(EventAttendee, self).delete(ids)
         if calendar_attendee_ids:
-            attendee_obj.delete(cursor, user, calendar_attendee_ids,
-                    context=context)
+            attendee_obj.delete(calendar_attendee_ids)
         return res
 
-    def copy(self, cursor, user, ids, default=None, context=None):
+    def copy(self, ids, default=None):
         attendee_obj = self.pool.get('calendar.attendee')
 
         int_id = False
@@ -1580,30 +1531,27 @@ class EventAttendee(ModelSQL, ModelView):
             default = {}
         default = default.copy()
         new_ids = []
-        for attendee in self.browse(cursor, user, ids, context=context):
-            default['calendar_attendee'] = attendee_obj.copy(cursor, user,
-                    attendee.calendar_attendee.id, context=context)
-            new_id = super(EventAttendee, self).copy(cursor, user, attendee.id,
-                    default=default, context=context)
+        for attendee in self.browse(ids):
+            default['calendar_attendee'] = attendee_obj.copy(
+                    attendee.calendar_attendee.id)
+            new_id = super(EventAttendee, self).copy(attendee.id,
+                    default=default)
             new_ids.append(new_id)
         if int_id:
             return new_ids[0]
         return new_ids
 
-    def _attendee2update(self, cursor, user, attendee, context=None):
+    def _attendee2update(self, attendee):
         attendee_obj = self.pool.get('calendar.attendee')
-        return attendee_obj._attendee2update(cursor, user, attendee,
-                context=context)
+        return attendee_obj._attendee2update(attendee)
 
-    def attendee2values(self, cursor, user, attendee, context=None):
+    def attendee2values(self, attendee):
         attendee_obj = self.pool.get('calendar.attendee')
-        return attendee_obj.attendee2values(cursor, user, attendee,
-                context=context)
+        return attendee_obj.attendee2values(attendee)
 
-    def attendee2attendee(self, cursor, user, attendee, context=None):
+    def attendee2attendee(self, attendee):
         attendee_obj = self.pool.get('calendar.attendee')
-        return attendee_obj.attendee2attendee(cursor, user, attendee,
-                context=context)
+        return attendee_obj.attendee2attendee(attendee)
 
 EventAttendee()
 
@@ -1618,28 +1566,26 @@ class Date(ModelSQL, ModelView):
             'but handle as date only.')
     datetime = fields.DateTime('Date', required=True)
 
-    def init(self, cursor, module_name):
+    def init(self, module_name):
+        cursor = Transaction().cursor
         # Migration from 1.4: calendar.rdate renamed to calendar.date
         old_table = 'calendar_rdate'
         if TableHandler.table_exist(cursor, old_table):
             TableHandler.table_rename(cursor, old_table, self._table)
 
-        return super(Date, self).init(cursor, module_name)
+        return super(Date, self).init(module_name)
 
-    def _date2update(self, cursor, user, date, context=None):
+    def _date2update(self, date):
         res = {}
         res['date'] = date.date
         res['datetime'] = date.datetime
         return res
 
-    def date2values(self, cursor, user, date, context=None):
+    def date2values(self, date):
         '''
         Convert a date object into values for create or write
 
-        :param cursor: the database cursor
-        :param user: the user id
         :param date: the date object
-        :param context: the context
         :return: a dictionary with values
         '''
         res = {}
@@ -1655,15 +1601,12 @@ class Date(ModelSQL, ModelView):
                 res['datetime'] = date
         return res
 
-    def date2date(self, cursor, user, date, context=None):
+    def date2date(self, date):
         '''
         Return a datetime for date
 
-        :param cursor: the database cursor
-        :param user: the user id
         :param date: a BrowseRecord of calendar.date or
             calendar.exdate
-        :param context: the context
         :return: a datetime
         '''
         if date.date:
@@ -1688,64 +1631,62 @@ class EventRDate(ModelSQL, ModelView):
     event = fields.Many2One('calendar.event', 'Event', ondelete='CASCADE',
             select=1, required=True)
 
-    def init(self, cursor, module_name):
+    def init(self, module_name):
+        cursor = Transaction().cursor
         # Migration from 1.4: calendar_rdate renamed to calendar_date
         table = TableHandler(cursor, self, module_name)
         old_column = 'calendar_rdate'
         if table.column_exist(old_column):
             table.column_rename(old_column, 'calendar_date')
 
-        return super(EventRDate, self).init(cursor, module_name)
+        return super(EventRDate, self).init(module_name)
 
-    def create(self, cursor, user, values, context=None):
+    def create(self, values):
         event_obj = self.pool.get('calendar.event')
         if values.get('event'):
             # Update write_date of event
-            event_obj.write(cursor, user, values['event'], {}, context=context)
-        return super(EventRDate, self).create(cursor, user, values,
-                context=context)
+            event_obj.write(values['event'], {})
+        return super(EventRDate, self).create(values)
 
-    def write(self, cursor, user, ids, values, context=None):
+    def write(self, ids, values):
         event_obj = self.pool.get('calendar.event')
         if isinstance(ids, (int, long)):
             ids = [ids]
-        event_ids = [x.event.id for x in self.browse(cursor, user, ids,
-            context=context)]
+        event_ids = [x.event.id for x in self.browse(ids)]
         if values.get('event'):
             event_ids.append(values['event'])
         if event_ids:
             # Update write_date of event
-            event_obj.write(cursor, user, event_ids, {}, context=context)
-        return super(EventRDate, self).write(cursor, user, ids, values,
-                context=context)
+            event_obj.write(event_ids, {})
+        return super(EventRDate, self).write(ids, values)
 
-    def delete(self, cursor, user, ids, context=None):
+    def delete(self, ids):
         event_obj = self.pool.get('calendar.event')
         rdate_obj = self.pool.get('calendar.date')
         if isinstance(ids, (int, long)):
             ids = [ids]
-        event_rdates = self.browse(cursor, user, ids, context=context)
+        event_rdates = self.browse(ids)
         rdate_ids = [a.calendar_date.id for a in event_rdates]
         event_ids = [x.event.id for x in event_rdates]
         if event_ids:
             # Update write_date of event
-            event_obj.write(cursor, user, event_ids, {}, context=context)
-        res = super(EventRDate, self).delete(cursor, user, ids, context=context)
+            event_obj.write(event_ids, {})
+        res = super(EventRDate, self).delete(ids)
         if rdate_ids:
-            rdate_obj.delete(cursor, user, rdate_ids, context=context)
+            rdate_obj.delete(rdate_ids)
         return res
 
-    def _date2update(self, cursor, user, date, context=None):
+    def _date2update(self, date):
         date_obj = self.pool.get('calendar.date')
-        return date_obj._date2update(cursor, user, date, context=context)
+        return date_obj._date2update(date)
 
-    def date2values(self, cursor, user, date, context=None):
+    def date2values(self, date):
         date_obj = self.pool.get('calendar.date')
-        return date_obj.date2values(cursor, user, date, context=context)
+        return date_obj.date2values(date)
 
-    def date2date(self, cursor, user, date, context=None):
+    def date2date(self, date):
         date_obj = self.pool.get('calendar.date')
-        return date_obj.date2date(cursor, user, date, context=context)
+        return date_obj.date2date(date)
 
 EventRDate()
 
@@ -1827,53 +1768,54 @@ class RRule(ModelSQL, ModelView):
             'invalid_bysetpos': 'Invalid "By Position"',
         })
 
-    def init(self, cursor, module_name):
+    def init(self, module_name):
+        cursor = Transaction().cursor
         # Migrate from 1.4: unit_count replaced by until_count_only_one
         table  = TableHandler(cursor, self, module_name)
         table.drop_constraint('until_count')
-        return super(RRule, self).init(cursor, module_name)
+        return super(RRule, self).init(module_name)
 
-    def check_bysecond(self, cursor, user, ids):
-        for rule in self.browse(cursor, user, ids):
+    def check_bysecond(self, ids):
+        for rule in self.browse(ids):
             if not rule.bysecond:
                 continue
             for second in rule.bysecond.split(','):
                 try:
                     second = int(second)
-                except:
+                except Exception:
                     return False
                 if not (second >= 0 and second <= 59):
                     return False
         return True
 
-    def check_byminute(self, cursor, user, ids):
-        for rule in self.browse(cursor, user, ids):
+    def check_byminute(self, ids):
+        for rule in self.browse(ids):
             if not rule.byminute:
                 continue
             for minute in rule.byminute.split(','):
                 try:
                     minute = int(minute)
-                except:
+                except Exception:
                     return False
                 if not (minute >= 0 and minute <= 59):
                     return False
         return True
 
-    def check_byhour(self, cursor, user, ids):
-        for rule in self.browse(cursor, user, ids):
+    def check_byhour(self, ids):
+        for rule in self.browse(ids):
             if not rule.byhour:
                 continue
             for hour in rule.byhour.split(','):
                 try:
                     hour = int(hour)
-                except:
+                except Exception:
                     return False
                 if not (hour >= 0 and hour <= 23):
                     return False
         return True
 
-    def check_byday(self, cursor, user, ids):
-        for rule in self.browse(cursor, user, ids):
+    def check_byday(self, ids):
+        for rule in self.browse(ids):
             if not rule.byday:
                 continue
             for weekdaynum in rule.byday.split(','):
@@ -1885,78 +1827,78 @@ class RRule(ModelSQL, ModelView):
                     continue
                 try:
                     ordwk = int(ordwk)
-                except:
+                except Exception:
                     return False
                 if not (abs(ordwk) >= 1 and abs(ordwk) <= 53):
                     return False
         return True
 
-    def check_bymonthday(self, cursor, user, ids):
-        for rule in self.browse(cursor, user, ids):
+    def check_bymonthday(self, ids):
+        for rule in self.browse(ids):
             if not rule.bymonthday:
                 continue
             for monthdaynum in rule.bymonthday.split(','):
                 try:
                     monthdaynum = int(monthdaynum)
-                except:
+                except Exception:
                     return False
                 if not (abs(monthdaynum) >= 1 and abs(monthdaynum) <= 31):
                     return False
         return True
 
-    def check_byyearday(self, cursor, user, ids):
-        for rule in self.browse(cursor, user, ids):
+    def check_byyearday(self, ids):
+        for rule in self.browse(ids):
             if not rule.byyearday:
                 continue
             for yeardaynum in rule.byyearday.split(','):
                 try:
                     yeardaynum = int(yeardaynum)
-                except:
+                except Exception:
                     return False
                 if not (abs(yeardaynum) >= 1 and abs(yeardaynum) <= 366):
                     return False
         return True
 
-    def check_byweekno(self, cursor, user, ids):
-        for rule in self.browse(cursor, user, ids):
+    def check_byweekno(self, ids):
+        for rule in self.browse(ids):
             if not rule.byweekno:
                 continue
             for weeknum in rule.byweekno.split(','):
                 try:
                     weeknum = int(weeknum)
-                except:
+                except Exception:
                     return False
                 if not (abs(weeknum) >= 1 and abs(weeknum) <= 53):
                     return False
         return True
 
-    def check_bymonth(self, cursor, user, ids):
-        for rule in self.browse(cursor, user, ids):
+    def check_bymonth(self, ids):
+        for rule in self.browse(ids):
             if not rule.bymonth:
                 continue
             for monthnum in rule.bymonth.split(','):
                 try:
                     monthnum = int(monthnum)
-                except:
+                except Exception:
                     return False
                 if not (monthnum >= 1 and monthnum <= 12):
                     return False
         return True
 
-    def check_bysetpos(self, cursor, user, ids):
-        for rule in self.browse(cursor, user, ids):
+    def check_bysetpos(self, ids):
+        for rule in self.browse(ids):
             if not rule.bysetpos:
                 continue
             for setposday in rule.bysetpos.split(','):
                 try:
                     setposday = int(setposday)
-                except:
+                except Exception:
                     return False
                 if not (abs(setposday) >= 1 and abs(setposday) <= 366):
                     return False
         return True
 
-    def _rule2update(self, cursor, user, rule, context=None):
+    def _rule2update(self, rule):
         res = {}
         for field in ('freq', 'until_date', 'until', 'count', 'interval',
                 'bysecond', 'byminute', 'byhour', 'byday', 'bymonthday',
@@ -1964,14 +1906,11 @@ class RRule(ModelSQL, ModelView):
             res[field] = rule[field]
         return res
 
-    def rule2values(self, cursor, user, rule, context=None):
+    def rule2values(self, rule):
         '''
         Convert a rule object into values for create or write
 
-        :param cursor: the database cursor
-        :param user: the user id
         :param rule: teh rule object
-        :param context: the context
         :return: a dictionary with values
         '''
         res = {}
@@ -1981,7 +1920,7 @@ class RRule(ModelSQL, ModelView):
             if field == 'until':
                 try:
                     value = vobject.icalendar.stringToDateTime(value)
-                except:
+                except Exception:
                     value = vobject.icalendar.stringToDate(value)
                 if not isinstance(value, datetime.datetime):
                     res['until_date'] = True
@@ -1999,15 +1938,12 @@ class RRule(ModelSQL, ModelView):
                 res[field] = value
         return res
 
-    def rule2rule(self, cursor, user, rule, context=None):
+    def rule2rule(self, rule):
         '''
         Return a rule string for rule
 
-        :param cursor: the database cursor
-        :param user: the user id
         :param rule: a BrowseRecord of calendar.rrule or
             calendar.exrule
-        :param context: the context
         :return: a string
         '''
         res = 'FREQ=' + rule.freq.upper()
@@ -2047,53 +1983,52 @@ class EventRRule(ModelSQL, ModelView):
             select=1, required=True)
 
 
-    def create(self, cursor, user, values, context=None):
+    def create(self, values):
         event_obj = self.pool.get('calendar.event')
         if values.get('event'):
             # Update write_date of event
-            event_obj.write(cursor, user, values['event'], {}, context=context)
-        return super(EventRRule, self).create(cursor, user, values, context=context)
+            event_obj.write(values['event'], {})
+        return super(EventRRule, self).create(values)
 
-    def write(self, cursor, user, ids, values, context=None):
+    def write(self, ids, values):
         event_obj = self.pool.get('calendar.event')
         if isinstance(ids, (int, long)):
             ids = [ids]
-        event_ids = [x.event.id for x in self.browse(cursor, user, ids,
-            context=context)]
+        event_ids = [x.event.id for x in self.browse(ids)]
         if values.get('event'):
             event_ids.append(values['event'])
         if event_ids:
             # Update write_date of event
-            event_obj.write(cursor, user, event_ids, {}, context=context)
-        return super(EventRRule, self).write(cursor, user, ids, values, context=context)
+            event_obj.write(event_ids, {})
+        return super(EventRRule, self).write(ids, values)
 
-    def delete(self, cursor, user, ids, context=None):
+    def delete(self, ids):
         event_obj = self.pool.get('calendar.event')
         rrule_obj = self.pool.get('calendar.rrule')
         if isinstance(ids, (int, long)):
             ids = [ids]
-        event_rrules = self.browse(cursor, user, ids, context=context)
+        event_rrules = self.browse(ids)
         rrule_ids = [a.calendar_rrule.id for a in event_rrules]
         event_ids = [x.event.id for x in event_rrules]
         if event_ids:
             # Update write_date of event
-            event_obj.write(cursor, user, event_ids, {}, context=context)
-        res = super(EventRRule, self).delete(cursor, user, ids, context=context)
+            event_obj.write(event_ids, {})
+        res = super(EventRRule, self).delete(ids)
         if rrule_ids:
-            rrule_obj.delete(cursor, user, rrule_ids, context=context)
+            rrule_obj.delete(rrule_ids)
         return res
 
-    def _rule2update(self, cursor, user, rule, context=None):
+    def _rule2update(self, rule):
         rule_obj = self.pool.get('calendar.rrule')
-        return rule_obj._rule2update(cursor, user, rule, context=context)
+        return rule_obj._rule2update(rule)
 
-    def rule2values(self, cursor, user, rule, context=None):
+    def rule2values(self, rule):
         rule_obj = self.pool.get('calendar.rrule')
-        return rule_obj.rule2values(cursor, user, rule, context=context)
+        return rule_obj.rule2values(rule)
 
-    def rule2rule(self, cursor, user, rule, context=None):
+    def rule2rule(self, rule):
         rule_obj = self.pool.get('calendar.rrule')
-        return rule_obj.rule2rule(cursor, user, rule, context=context)
+        return rule_obj.rule2rule(rule)
 
 EventRRule()
 
diff --git a/calendar.xml b/calendar.xml
index 07e9a33..475994b 100644
--- a/calendar.xml
+++ b/calendar.xml
@@ -10,6 +10,9 @@ this repository contains the full copyright notices and license terms. -->
         <record model="res.user" id="res.user_admin">
             <field name="groups" eval="[('add', ref('group_calendar_admin'))]"/>
         </record>
+        <record model="res.user" id="res.user_trigger">
+            <field name="groups" eval="[('add', ref('group_calendar_admin'))]"/>
+        </record>
 
         <menuitem name="Calendar Management" sequence="8" id="menu_calendar"/>
 
diff --git a/de_DE.csv b/de_DE.csv
index ba69519..7202432 100644
--- a/de_DE.csv
+++ b/de_DE.csv
@@ -8,8 +8,8 @@ error,calendar.location,0,The name of calendar location must be unique!,Name fü
 error,calendar.rrule,0,"Invalid ""By Day""","Ungültig ""Für Tag""",0
 error,calendar.rrule,0,"Invalid ""By Hour""","Ungültig ""Für Stunde""",0
 error,calendar.rrule,0,"Invalid ""By Minute""","Ungültig ""Für Minute""",0
-error,calendar.rrule,0,"Invalid ""By Month""","Ungültig ""Für Monat""",0
 error,calendar.rrule,0,"Invalid ""By Month Day""","Ungültig ""Für Tag des Monats""",0
+error,calendar.rrule,0,"Invalid ""By Month""","Ungültig ""Für Monat""",0
 error,calendar.rrule,0,"Invalid ""By Position""","Ungültig ""Für Position""",0
 error,calendar.rrule,0,"Invalid ""By Second""","Ungültig ""Für Sekunde""",0
 error,calendar.rrule,0,"Invalid ""By Week Number""","Ungültig ""Für Woche Nummer""",0
@@ -24,33 +24,24 @@ field,"calendar.attendee,status",0,Participation Status,Teilnahmestatus,0
 field,"calendar.calendar,description",0,Description,Bezeichnung,0
 field,"calendar.calendar,name",0,Name,Name,0
 field,"calendar.calendar,owner",0,Owner,Besitzer,0
+field,"calendar.calendar,read_users",0,Read Users,Benutzer mit Leseberechtigung,0
+field,"calendar.calendar,rec_name",0,Name,Name,0
+field,"calendar.calendar,write_users",0,Write Users,Benutzer mit Schreibberechtigung,0
 field,"calendar.calendar-read-res.user,calendar",0,Calendar,Kalender,0
 field,"calendar.calendar-read-res.user,rec_name",0,Name,Name,0
 field,"calendar.calendar-read-res.user,user",0,User,Benutzer,0
-field,"calendar.calendar,read_users",0,Read Users,Benutzer mit Leseberechtigung,0
-field,"calendar.calendar,rec_name",0,Name,Name,0
 field,"calendar.calendar-write-res.user,calendar",0,Calendar,Kalender,0
 field,"calendar.calendar-write-res.user,rec_name",0,Name,Name,0
 field,"calendar.calendar-write-res.user,user",0,User,Benutzer,0
-field,"calendar.calendar,write_users",0,Write Users,Benutzer mit Schreibberechtigung,0
 field,"calendar.category,name",0,Name,Name,0
 field,"calendar.category,rec_name",0,Name,Name,0
 field,"calendar.date,date",0,Is Date,Als Datum,0
 field,"calendar.date,datetime",0,Date,Zeitpunkt,0
 field,"calendar.date,rec_name",0,Name,Name,0
-field,"calendar.event.alarm,calendar_alarm",0,Calendar Alarm,Kalender Alarm,0
-field,"calendar.event.alarm,event",0,Event,Termin,0
-field,"calendar.event.alarm,rec_name",0,Name,Name,0
 field,"calendar.event,alarms",0,Alarms,Alarm,0
 field,"calendar.event,all_day",0,All Day,Ganztägig,0
-field,"calendar.event.attendee,calendar_attendee",0,Calendar Attendee,Kalender Teilnehmer,0
-field,"calendar.event.attendee,event",0,Event,Termin,0
-field,"calendar.event.attendee,rec_name",0,Name,Name,0
 field,"calendar.event,attendees",0,Attendees,Teilnehmer,0
 field,"calendar.event,calendar",0,Calendar,Kalender,0
-field,"calendar.event-calendar.category,category",0,Category,Kategorie,0
-field,"calendar.event-calendar.category,event",0,Event,Termin,0
-field,"calendar.event-calendar.category,rec_name",0,Name,Name,0
 field,"calendar.event,calendar_owner",0,Owner,Besitzer,0
 field,"calendar.event,calendar_read_users",0,Read Users,Benutzer mit Leseberechtigung,0
 field,"calendar.event,calendar_write_users",0,Write Users,Benutzer mit Schreibberechtigung,0
@@ -59,27 +50,15 @@ field,"calendar.event,classification",0,Classification,Klassifizierung,0
 field,"calendar.event,description",0,Description,Bezeichnung,0
 field,"calendar.event,dtend",0,End Date,Enddatum,0
 field,"calendar.event,dtstart",0,Start Date,Anfangsdatum,0
-field,"calendar.event.exdate,calendar_date",0,Calendar Date,Kalender Datum,0
-field,"calendar.event.exdate,event",0,Event,Termin,0
-field,"calendar.event.exdate,rec_name",0,Name,Name,0
 field,"calendar.event,exdates",0,Exception Dates,Ausnahmedaten,0
-field,"calendar.event.exrule,calendar_rrule",0,Calendar RRule,Kalender WRegel,0
-field,"calendar.event.exrule,event",0,Event,Termin,0
-field,"calendar.event.exrule,rec_name",0,Name,Name,0
 field,"calendar.event,exrules",0,Exception Rules,Ausnahmeregeln,0
 field,"calendar.event,location",0,Location,Ort,0
 field,"calendar.event,occurences",0,Occurences,Ereignisse,0
 field,"calendar.event,organizer",0,Organizer,Organisator,0
 field,"calendar.event,parent",0,Parent,Übergeordnet (Termin),0
-field,"calendar.event.rdate,calendar_date",0,Calendar Date,Kalender Datum,0
-field,"calendar.event.rdate,event",0,Event,Termin,0
-field,"calendar.event.rdate,rec_name",0,Name,Name,0
 field,"calendar.event,rdates",0,Recurrence Dates,Wiederholungsdaten,0
 field,"calendar.event,rec_name",0,Name,Name,0
 field,"calendar.event,recurrence",0,Recurrence,Wiederholung,0
-field,"calendar.event.rrule,calendar_rrule",0,Calendar RRule,Kalender WRegel,0
-field,"calendar.event.rrule,event",0,Event,Termin,0
-field,"calendar.event.rrule,rec_name",0,Name,Name,0
 field,"calendar.event,rrules",0,Recurrence Rules,Wiederholungsregeln,0
 field,"calendar.event,sequence",0,Sequence,Revision,0
 field,"calendar.event,status",0,Status,Status,0
@@ -88,6 +67,27 @@ field,"calendar.event,timezone",0,Timezone,Zeitzone,0
 field,"calendar.event,transp",0,Time Transparency,Zeittransparenz,0
 field,"calendar.event,uuid",0,UUID,UUID,0
 field,"calendar.event,vevent",0,vevent,vevent,0
+field,"calendar.event-calendar.category,category",0,Category,Kategorie,0
+field,"calendar.event-calendar.category,event",0,Event,Termin,0
+field,"calendar.event-calendar.category,rec_name",0,Name,Name,0
+field,"calendar.event.alarm,calendar_alarm",0,Calendar Alarm,Kalender Alarm,0
+field,"calendar.event.alarm,event",0,Event,Termin,0
+field,"calendar.event.alarm,rec_name",0,Name,Name,0
+field,"calendar.event.attendee,calendar_attendee",0,Calendar Attendee,Kalender Teilnehmer,0
+field,"calendar.event.attendee,event",0,Event,Termin,0
+field,"calendar.event.attendee,rec_name",0,Name,Name,0
+field,"calendar.event.exdate,calendar_date",0,Calendar Date,Kalender Datum,0
+field,"calendar.event.exdate,event",0,Event,Termin,0
+field,"calendar.event.exdate,rec_name",0,Name,Name,0
+field,"calendar.event.exrule,calendar_rrule",0,Calendar RRule,Kalender WRegel,0
+field,"calendar.event.exrule,event",0,Event,Termin,0
+field,"calendar.event.exrule,rec_name",0,Name,Name,0
+field,"calendar.event.rdate,calendar_date",0,Calendar Date,Kalender Datum,0
+field,"calendar.event.rdate,event",0,Event,Termin,0
+field,"calendar.event.rdate,rec_name",0,Name,Name,0
+field,"calendar.event.rrule,calendar_rrule",0,Calendar RRule,Kalender WRegel,0
+field,"calendar.event.rrule,event",0,Event,Termin,0
+field,"calendar.event.rrule,rec_name",0,Name,Name,0
 field,"calendar.location,name",0,Name,Name,0
 field,"calendar.location,rec_name",0,Name,Name,0
 field,"calendar.rrule,byday",0,By Day,Für Tag,0
@@ -118,12 +118,12 @@ model,"calendar.calendar-read-res.user,name",0,Calendar - read - User,Kalender -
 model,"calendar.calendar-write-res.user,name",0,Calendar - write - User,Kalender - Lesen - Benutzer,0
 model,"calendar.category,name",0,Category,Kategorie,0
 model,"calendar.date,name",0,Calendar Date,Kalender Datum,0
+model,"calendar.event,name",0,Event,Termin,0
+model,"calendar.event-calendar.category,name",0,Event - Category,Termin - Kategorie,0
 model,"calendar.event.alarm,name",0,Alarm,Alarm,0
 model,"calendar.event.attendee,name",0,Attendee,Teilnehmer,0
-model,"calendar.event-calendar.category,name",0,Event - Category,Termin - Kategorie,0
 model,"calendar.event.exdate,name",0,Exception Date,Ausnahmedatum,0
 model,"calendar.event.exrule,name",0,Exception Rule,Ausnahmeregel,0
-model,"calendar.event,name",0,Event,Termin,0
 model,"calendar.event.rdate,name",0,Recurrence Date,Wiederholungsdatum,0
 model,"calendar.event.rrule,name",0,Recurrence Rule,Wiederholungsregel,0
 model,"calendar.location,name",0,Location,Ort,0
@@ -135,8 +135,8 @@ model,"ir.action,name",act_event_form2,Events,Termine,0
 model,"ir.action,name",act_event_form3,Events,Termine,0
 model,"ir.ui.menu,name",menu_calendar,Calendar Management,Kalender,0
 model,"ir.ui.menu,name",menu_calendar_form,Calendars,Kalender,0
-model,"ir.ui.menu,name",menu_event_form,Events,Termine,0
 model,"ir.ui.menu,name",menu_calendar_form2,New Calendar,Neuer Kalender,0
+model,"ir.ui.menu,name",menu_event_form,Events,Termine,0
 model,"ir.ui.menu,name",menu_event_form2,New Event,Neuer Termin,0
 model,"res.group,name",group_calendar_admin,Calendar Administration,Kalender Administration,0
 selection,"calendar.attendee,status",0,,,0
diff --git a/fr_FR.csv b/fr_FR.csv
index b2df1a2..b814ecf 100644
--- a/fr_FR.csv
+++ b/fr_FR.csv
@@ -8,8 +8,8 @@ error,calendar.location,0,The name of calendar location must be unique!,Le nom d
 error,calendar.rrule,0,"Invalid ""By Day""","""Par jour"" invalide",0
 error,calendar.rrule,0,"Invalid ""By Hour""","""Par heure"" invalide",0
 error,calendar.rrule,0,"Invalid ""By Minute""","""Par minute"" invalide",0
-error,calendar.rrule,0,"Invalid ""By Month""","""Par mois"" invalide",0
 error,calendar.rrule,0,"Invalid ""By Month Day""","""Par jour du mois"" invalide",0
+error,calendar.rrule,0,"Invalid ""By Month""","""Par mois"" invalide",0
 error,calendar.rrule,0,"Invalid ""By Position""","""Par position"" invalide",0
 error,calendar.rrule,0,"Invalid ""By Second""","""Par seconde"" invalide",0
 error,calendar.rrule,0,"Invalid ""By Week Number""","""Par jour de la semaine"" invalide",0
@@ -24,33 +24,24 @@ field,"calendar.attendee,status",0,Participation Status,Statut de participation,
 field,"calendar.calendar,description",0,Description,Description,0
 field,"calendar.calendar,name",0,Name,Nom,0
 field,"calendar.calendar,owner",0,Owner,Propriétaire,0
+field,"calendar.calendar,read_users",0,Read Users,Utilisateurs en lecture,0
+field,"calendar.calendar,rec_name",0,Name,Nom,0
+field,"calendar.calendar,write_users",0,Write Users,Utilisateurs en écriture,0
 field,"calendar.calendar-read-res.user,calendar",0,Calendar,Calendrier,0
 field,"calendar.calendar-read-res.user,rec_name",0,Name,Nom,0
 field,"calendar.calendar-read-res.user,user",0,User,Utilisateur,0
-field,"calendar.calendar,read_users",0,Read Users,Utilisateurs en lecture,0
-field,"calendar.calendar,rec_name",0,Name,Nom,0
 field,"calendar.calendar-write-res.user,calendar",0,Calendar,Calendrier,0
 field,"calendar.calendar-write-res.user,rec_name",0,Name,Nom,0
 field,"calendar.calendar-write-res.user,user",0,User,Utilisateur,0
-field,"calendar.calendar,write_users",0,Write Users,Utilisateurs en écriture,0
 field,"calendar.category,name",0,Name,Nom,0
 field,"calendar.category,rec_name",0,Name,Nom,0
 field,"calendar.date,date",0,Is Date,Est une date,0
 field,"calendar.date,datetime",0,Date,Date,0
 field,"calendar.date,rec_name",0,Name,Nom,0
-field,"calendar.event.alarm,calendar_alarm",0,Calendar Alarm,Alarme calendrier,0
-field,"calendar.event.alarm,event",0,Event,Événement,0
-field,"calendar.event.alarm,rec_name",0,Name,Nom,0
 field,"calendar.event,alarms",0,Alarms,Alarmes,0
 field,"calendar.event,all_day",0,All Day,Toute la journée,0
-field,"calendar.event.attendee,calendar_attendee",0,Calendar Attendee,Participant calendrier,0
-field,"calendar.event.attendee,event",0,Event,Événement,0
-field,"calendar.event.attendee,rec_name",0,Name,Nom,0
 field,"calendar.event,attendees",0,Attendees,Participants,0
 field,"calendar.event,calendar",0,Calendar,Calendrier,0
-field,"calendar.event-calendar.category,category",0,Category,Catégorie,0
-field,"calendar.event-calendar.category,event",0,Event,Événement,0
-field,"calendar.event-calendar.category,rec_name",0,Name,Nom,0
 field,"calendar.event,calendar_owner",0,Owner,Propriétaire,0
 field,"calendar.event,calendar_read_users",0,Read Users,Utilisateurs en lecture,0
 field,"calendar.event,calendar_write_users",0,Write Users,Utilisateurs en écriture,0
@@ -59,28 +50,15 @@ field,"calendar.event,classification",0,Classification,Classification,0
 field,"calendar.event,description",0,Description,Description,0
 field,"calendar.event,dtend",0,End Date,Date de fin,0
 field,"calendar.event,dtstart",0,Start Date,Date de début,0
-field,"calendar.event.exdate,calendar_date",0,Calendar Date,Date calendrier,0
-field,"calendar.event.exdate,event",0,Event,Événement,0
-field,"calendar.event.exdate,rec_name",0,Name,Nom,0
 field,"calendar.event,exdates",0,Exception Dates,Dates d'exception,0
-field,"calendar.event.exrule,calendar_rrule",0,Calendar RRule,Règle de récurrence,0
-field,"calendar.event.exrule,event",0,Event,Événement,0
-field,"calendar.event.exrule,rec_name",0,Name,Nom,0
 field,"calendar.event,exrules",0,Exception Rules,Règles d'exception,0
 field,"calendar.event,location",0,Location,Emplacement,0
 field,"calendar.event,occurences",0,Occurences,Occurrences,0
 field,"calendar.event,organizer",0,Organizer,Organisateur,0
 field,"calendar.event,parent",0,Parent,Parent,0
-field,"calendar.event.rdate,calendar_date",0,Calendar Date,Date calendrier,0
-field,"calendar.event.rdate,calendar_rdate",0,Calendar RDate,Date de récurrence,0
-field,"calendar.event.rdate,event",0,Event,Événement,0
-field,"calendar.event.rdate,rec_name",0,Name,Nom,0
 field,"calendar.event,rdates",0,Recurrence Dates,Dates de récurrence,0
 field,"calendar.event,rec_name",0,Name,Nom,0
 field,"calendar.event,recurrence",0,Recurrence,Récurrence,0
-field,"calendar.event.rrule,calendar_rrule",0,Calendar RRule,Règle de récurrence,0
-field,"calendar.event.rrule,event",0,Event,Événement,0
-field,"calendar.event.rrule,rec_name",0,Name,Nom,0
 field,"calendar.event,rrules",0,Recurrence Rules,Règles de récurrence,0
 field,"calendar.event,sequence",0,Sequence,Séquence,0
 field,"calendar.event,status",0,Status,Statut,0
@@ -89,9 +67,29 @@ field,"calendar.event,timezone",0,Timezone,Fuseau Horaire,0
 field,"calendar.event,transp",0,Time Transparency,Transparence,0
 field,"calendar.event,uuid",0,UUID,UUID,0
 field,"calendar.event,vevent",0,vevent,vevent,0
+field,"calendar.event-calendar.category,category",0,Category,Catégorie,0
+field,"calendar.event-calendar.category,event",0,Event,Événement,0
+field,"calendar.event-calendar.category,rec_name",0,Name,Nom,0
+field,"calendar.event.alarm,calendar_alarm",0,Calendar Alarm,Alarme calendrier,0
+field,"calendar.event.alarm,event",0,Event,Événement,0
+field,"calendar.event.alarm,rec_name",0,Name,Nom,0
+field,"calendar.event.attendee,calendar_attendee",0,Calendar Attendee,Participant calendrier,0
+field,"calendar.event.attendee,event",0,Event,Événement,0
+field,"calendar.event.attendee,rec_name",0,Name,Nom,0
+field,"calendar.event.exdate,calendar_date",0,Calendar Date,Date calendrier,0
+field,"calendar.event.exdate,event",0,Event,Événement,0
+field,"calendar.event.exdate,rec_name",0,Name,Nom,0
+field,"calendar.event.exrule,calendar_rrule",0,Calendar RRule,Règle de récurrence,0
+field,"calendar.event.exrule,event",0,Event,Événement,0
+field,"calendar.event.exrule,rec_name",0,Name,Nom,0
+field,"calendar.event.rdate,calendar_date",0,Calendar Date,Date calendrier,0
+field,"calendar.event.rdate,event",0,Event,Événement,0
+field,"calendar.event.rdate,rec_name",0,Name,Nom,0
+field,"calendar.event.rrule,calendar_rrule",0,Calendar RRule,Règle de récurrence,0
+field,"calendar.event.rrule,event",0,Event,Événement,0
+field,"calendar.event.rrule,rec_name",0,Name,Nom,0
 field,"calendar.location,name",0,Name,Nom,0
 field,"calendar.location,rec_name",0,Name,Nom,0
-field,"calendar.rdate,date",0,Is Date,Est une date,0
 field,"calendar.rrule,byday",0,By Day,Par jour,0
 field,"calendar.rrule,byhour",0,By Hour,Par heure,0
 field,"calendar.rrule,byminute",0,By Minute,Par minute,0
@@ -120,12 +118,12 @@ model,"calendar.calendar-read-res.user,name",0,Calendar - read - User,Calendrier
 model,"calendar.calendar-write-res.user,name",0,Calendar - write - User,Calendrier - Écriture - Utilisateur,0
 model,"calendar.category,name",0,Category,Catégorie,0
 model,"calendar.date,name",0,Calendar Date,Date calendrier,0
+model,"calendar.event,name",0,Event,Événement,0
+model,"calendar.event-calendar.category,name",0,Event - Category,Évenement - Catégorie,0
 model,"calendar.event.alarm,name",0,Alarm,Alarme,0
 model,"calendar.event.attendee,name",0,Attendee,Participant,0
-model,"calendar.event-calendar.category,name",0,Event - Category,Évenement - Catégorie,0
 model,"calendar.event.exdate,name",0,Exception Date,Date d'exception,0
 model,"calendar.event.exrule,name",0,Exception Rule,Règle d'exception,0
-model,"calendar.event,name",0,Event,Événement,0
 model,"calendar.event.rdate,name",0,Recurrence Date,Date de récurrence,0
 model,"calendar.event.rrule,name",0,Recurrence Rule,Règle de récurrence,0
 model,"calendar.location,name",0,Location,Emplacement,0
@@ -137,8 +135,8 @@ model,"ir.action,name",act_event_form2,Events,Événements,0
 model,"ir.action,name",act_event_form3,Events,Événements,0
 model,"ir.ui.menu,name",menu_calendar,Calendar Management,Gestion de calendrier,0
 model,"ir.ui.menu,name",menu_calendar_form,Calendars,Calendriers,0
-model,"ir.ui.menu,name",menu_event_form,Events,Évenement,0
 model,"ir.ui.menu,name",menu_calendar_form2,New Calendar,Nouveau calendrier,0
+model,"ir.ui.menu,name",menu_event_form,Events,Évenement,0
 model,"ir.ui.menu,name",menu_event_form2,New Event,Nouvel événement,0
 model,"res.group,name",group_calendar_admin,Calendar Administration,Administration calendrier,0
 selection,"calendar.attendee,status",0,,,0
diff --git a/res.py b/res.py
index b9221bf..2329f67 100644
--- a/res.py
+++ b/res.py
@@ -1,8 +1,8 @@
 #This file is part of Tryton.  The COPYRIGHT file at the top level of
 #this repository contains the full copyright notices and license terms.
+import copy
 from trytond.model import ModelView, ModelSQL, fields
 from trytond.pyson import Bool, Eval, Or
-import copy
 
 
 class User(ModelSQL, ModelView):
diff --git a/tests/test_calendar.py b/tests/test_calendar.py
index 4f42b7c..cc80b0a 100644
--- a/tests/test_calendar.py
+++ b/tests/test_calendar.py
@@ -25,7 +25,7 @@ class CalendarTestCase(unittest.TestCase):
         '''
         Test views.
         '''
-        self.assertRaises(Exception, test_view('calendar'))
+        test_view('calendar')
 
 def suite():
     suite = trytond.tests.test_tryton.suite()
diff --git a/tests/test_calendar.pyc b/tests/test_calendar.pyc
index 07e8ac7..02dbc50 100644
Binary files a/tests/test_calendar.pyc and b/tests/test_calendar.pyc differ
diff --git a/trytond_calendar.egg-info/PKG-INFO b/trytond_calendar.egg-info/PKG-INFO
index d049f34..4b0bad5 100644
--- a/trytond_calendar.egg-info/PKG-INFO
+++ b/trytond_calendar.egg-info/PKG-INFO
@@ -1,12 +1,12 @@
 Metadata-Version: 1.0
 Name: trytond-calendar
-Version: 1.6.0
+Version: 1.8.0
 Summary: Add CalDAV support
 Home-page: http://www.tryton.org/
 Author: B2CK
 Author-email: info at b2ck.com
 License: GPL-3
-Download-URL: http://downloads.tryton.org/1.6/
+Download-URL: http://downloads.tryton.org/1.8/
 Description: UNKNOWN
 Platform: UNKNOWN
 Classifier: Development Status :: 5 - Production/Stable
diff --git a/trytond_calendar.egg-info/requires.txt b/trytond_calendar.egg-info/requires.txt
index 44242eb..707195e 100644
--- a/trytond_calendar.egg-info/requires.txt
+++ b/trytond_calendar.egg-info/requires.txt
@@ -2,4 +2,4 @@ vobject >= 0.8.0
 PyWebDAV >= 0.9.3
 python-dateutil
 pytz
-trytond >= 1.6, < 1.7
\ No newline at end of file
+trytond >= 1.8, < 1.9
\ No newline at end of file
diff --git a/webdav.py b/webdav.py
index 3f14d1a..a086807 100644
--- a/webdav.py
+++ b/webdav.py
@@ -1,10 +1,12 @@
 #This file is part of Tryton.  The COPYRIGHT file at the top level of
 #this repository contains the full copyright notices and license terms.
-from trytond.model import ModelView, ModelSQL
-from trytond.tools import Cache, reduce_ids
-from DAV.errors import DAV_NotFound, DAV_Forbidden
 import vobject
 import urllib
+from DAV.errors import DAV_NotFound, DAV_Forbidden
+from trytond.model import ModelView, ModelSQL
+from trytond.tools import reduce_ids
+from trytond.cache import Cache
+from trytond.transaction import Transaction
 
 CALDAV_NS = 'urn:ietf:params:xml:ns:caldav'
 
@@ -13,14 +15,11 @@ class Collection(ModelSQL, ModelView):
 
     _name = "webdav.collection"
 
-    def calendar(self, cursor, user, uri, ics=False, context=None):
+    def calendar(self, uri, ics=False):
         '''
         Return the calendar id in the uri or False
 
-        :param cursor: the database cursor
-        :param user: the user id
         :param uri: the uri
-        :param context: the context
         :return: calendar id
             or False if there is no calendar
         '''
@@ -33,19 +32,16 @@ class Collection(ModelSQL, ModelView):
                     calendar = calendar[:-4]
                 else:
                     return False
-            return calendar_obj.get_name(cursor, user, calendar, context=context)
+            return calendar_obj.get_name(calendar)
         return False
 
     @Cache('webdav_collection.event')
-    def event(self, cursor, user, uri, calendar_id=False, context=None):
+    def event(self, uri, calendar_id=False):
         '''
         Return the event id in the uri or False
 
-        :param cursor: the database cursor
-        :param user: the user id
         :param uri: the uri
         :param calendar_id: the calendar id
-        :param context: the context
         :return: event id
             or False if there is no event
         '''
@@ -54,26 +50,23 @@ class Collection(ModelSQL, ModelView):
         if uri and uri.startswith('Calendars/'):
             calendar, event_uri = (uri[10:].split('/', 1) + [None])[0:2]
             if not calendar_id:
-                calendar_id = self.calendar(cursor, user, uri, context=context)
+                calendar_id = self.calendar(uri)
                 if not calendar_id:
                     return False
-            event_ids = event_obj.search(cursor, user, [
+            event_ids = event_obj.search([
                 ('calendar', '=', calendar_id),
                 ('uuid', '=', event_uri[:-4]),
                 ('parent', '=', False),
-                ], limit=1, context=context)
+                ], limit=1)
             if event_ids:
                 return event_ids[0]
         return False
 
-    def _caldav_filter_domain_calendar(self, cursor, user, filter, context=None):
+    def _caldav_filter_domain_calendar(self, filter):
         '''
         Return a domain for caldav filter on calendar
 
-        :param cursor: the database cursor
-        :param user: the user id
         :param filter: the DOM Element of filter
-        :param context: the context
         :return: a list for domain
         '''
         if not filter:
@@ -82,14 +75,11 @@ class Collection(ModelSQL, ModelView):
             return [('id', '=', 0)]
         return [('id', '=', 0)]
 
-    def _caldav_filter_domain_event(self, cursor, user, filter, context=None):
+    def _caldav_filter_domain_event(self, filter):
         '''
         Return a domain for caldav filter on event
 
-        :param cursor: the database cursor
-        :param user: the user id
         :param filter: the DOM Element of filter
-        :param context: the context
         :return: a list for domain
         '''
         res = []
@@ -139,30 +129,26 @@ class Collection(ModelSQL, ModelView):
                     if not dbname:
                         continue
                     dbname == urllib.unquote_plus(dbname)
-                    if dbname != cursor.database_name:
+                    if dbname != Transaction().cursor.database_name:
                         continue
                     if uri:
                         uri = urllib.unquote_plus(uri)
-                    event_id = self.event(cursor, user, uri, context=context)
+                    event_id = self.event(uri)
                     if event_id:
                         ids.append(event_id)
             return [('id', 'in', ids)]
         return res
 
-    def get_childs(self, cursor, user, uri, filter=None, context=None,
-            cache=None):
+    def get_childs(self, uri, filter=None, cache=None):
         calendar_obj = self.pool.get('calendar.calendar')
         event_obj = self.pool.get('calendar.event')
 
         if uri in ('Calendars', 'Calendars/'):
-            domain = self._caldav_filter_domain_calendar(cursor, user,
-                    filter, context=context)
-            domain = [['OR', ('owner', '=', user), ('read_users', '=', user)],
+            domain = self._caldav_filter_domain_calendar(filter)
+            domain = [['OR', ('owner', '=', Transaction().user), ('read_users', '=', Transaction().user)],
                     domain]
-            calendar_ids = calendar_obj.search(cursor, user, domain,
-                    context=context)
-            calendars = calendar_obj.browse(cursor, user, calendar_ids,
-                    context=context)
+            calendar_ids = calendar_obj.search(domain)
+            calendars = calendar_obj.browse(calendar_ids)
             if cache is not None:
                 cache.setdefault('_calendar', {})
                 cache['_calendar'].setdefault(calendar_obj._name, {})
@@ -171,16 +157,14 @@ class Collection(ModelSQL, ModelView):
             return [x.name for x in calendars] + \
                     [x.name + '.ics' for x in calendars]
         if uri and uri.startswith('Calendars/'):
-            calendar_id = self.calendar(cursor, user, uri, context=context)
+            calendar_id = self.calendar(uri)
             if  calendar_id and not (uri[10:].split('/', 1) + [None])[1]:
-                domain = self._caldav_filter_domain_event(cursor, user, filter,
-                        context=context)
-                event_ids = event_obj.search(cursor, user, [
+                domain = self._caldav_filter_domain_event(filter)
+                event_ids = event_obj.search([
                     ('calendar', '=', calendar_id),
                     domain,
-                    ], context=context)
-                events = event_obj.browse(cursor, user, event_ids,
-                        context=context)
+                    ])
+                events = event_obj.browse(event_ids)
                 if cache is not None:
                     cache.setdefault('_calendar', {})
                     cache['_calendar'].setdefault(event_obj._name, {})
@@ -188,8 +172,8 @@ class Collection(ModelSQL, ModelView):
                         cache['_calendar'][event_obj._name][event_id] = {}
                 return [x.uuid + '.ics' for x in events]
             return []
-        res = super(Collection, self).get_childs(cursor, user, uri,
-                filter=filter, context=context, cache=cache)
+        res = super(Collection, self).get_childs(uri, filter=filter,
+                cache=cache)
         if not uri and not filter:
             res.append('Calendars')
         elif not uri and filter:
@@ -197,50 +181,45 @@ class Collection(ModelSQL, ModelView):
                 res.append('Calendars')
         return res
 
-    def get_resourcetype(self, cursor, user, uri, context=None, cache=None):
+    def get_resourcetype(self, uri, cache=None):
         from DAV.constants import COLLECTION, OBJECT
         if uri in ('Calendars', 'Calendars/'):
             return COLLECTION
-        calendar_id = self.calendar(cursor, user, uri, context=context)
+        calendar_id = self.calendar(uri)
         if calendar_id:
             if not (uri[10:].split('/', 1) + [None])[1]:
                 return COLLECTION
             return OBJECT
-        elif self.calendar(cursor, user, uri, ics=True, context=context):
+        elif self.calendar(uri, ics=True):
             return OBJECT
-        return super(Collection, self).get_resourcetype(cursor, user, uri,
-                context=context, cache=cache)
+        return super(Collection, self).get_resourcetype(uri, cache=cache)
 
-    def get_displayname(self, cursor, user, uri, context=None, cache=None):
+    def get_displayname(self, uri, cache=None):
         calendar_obj = self.pool.get('calendar.calendar')
         if uri in ('Calendars', 'Calendars/'):
             return 'Calendars'
-        calendar_id = self.calendar(cursor, user, uri, context=context)
+        calendar_id = self.calendar(uri)
         if calendar_id:
             if not (uri[10:].split('/', 1) + [None])[1]:
-                return calendar_obj.browse(cursor, user, calendar_id,
-                        context=context).rec_name
+                return calendar_obj.browse(calendar_id).rec_name
             return uri.split('/')[-1]
-        elif self.calendar(cursor, user, uri, ics=True, context=context):
+        elif self.calendar(uri, ics=True):
             return uri.split('/')[-1]
-        return super(Collection, self).get_displayname(cursor, user, uri,
-                context=context, cache=cache)
+        return super(Collection, self).get_displayname(uri, cache=cache)
 
-    def get_contenttype(self, cursor, user, uri, context=None, cache=None):
-        if self.event(cursor, user, uri, context=context) \
-                or self.calendar(cursor, user, uri, ics=True, context=context):
+    def get_contenttype(self, uri, cache=None):
+        if self.event(uri) \
+                or self.calendar(uri, ics=True):
             return 'text/calendar'
-        return super(Collection, self).get_contenttype(cursor, user, uri,
-                context=context, cache=cache)
+        return super(Collection, self).get_contenttype(uri, cache=cache)
 
-    def get_creationdate(self, cursor, user, uri, context=None, cache=None):
+    def get_creationdate(self, uri, cache=None):
         calendar_obj = self.pool.get('calendar.calendar')
         event_obj = self.pool.get('calendar.event')
 
-        calendar_id = self.calendar(cursor, user, uri, context=context)
+        calendar_id = self.calendar(uri)
         if not calendar_id:
-            calendar_id = self.calendar(cursor, user, uri, ics=True,
-                    context=context)
+            calendar_id = self.calendar(uri, ics=True)
         if calendar_id:
             if not (uri[10:].split('/', 1) + [None])[1]:
                 if cache is not None:
@@ -256,6 +235,7 @@ class Collection(ModelSQL, ModelView):
                 else:
                     ids = [calendar_id]
                 res = None
+                cursor = Transaction().cursor
                 for i in range(0, len(ids), cursor.IN_MAX):
                     sub_ids = ids[i:i + cursor.IN_MAX]
                     red_sql, red_ids = reduce_ids('id', sub_ids)
@@ -274,8 +254,7 @@ class Collection(ModelSQL, ModelView):
                 if res is not None:
                     return res
             else:
-                event_id = self.event(cursor, user, uri, calendar_id=calendar_id,
-                        context=context)
+                event_id = self.event(uri, calendar_id=calendar_id)
                 if event_id:
                     if cache is not None:
                         cache.setdefault('_calendar', {})
@@ -290,6 +269,7 @@ class Collection(ModelSQL, ModelView):
                     else:
                         ids = [event_id]
                     res = None
+                    cursor = Transaction().cursor
                     for i in range(0, len(ids), cursor.IN_MAX):
                         sub_ids = ids[i:i + cursor.IN_MAX]
                         red_sql, red_ids = reduce_ids('id', sub_ids)
@@ -307,14 +287,14 @@ class Collection(ModelSQL, ModelView):
                                         [event_id2]['creationdate'] = date
                     if res is not None:
                         return res
-        return super(Collection, self).get_creationdate(cursor, user, uri,
-                context=context, cache=cache)
+        return super(Collection, self).get_creationdate(uri, cache=cache)
 
-    def get_lastmodified(self, cursor, user, uri, context=None, cache=None):
+    def get_lastmodified(self, uri, cache=None):
         calendar_obj = self.pool.get('calendar.calendar')
         event_obj = self.pool.get('calendar.event')
 
-        calendar_id = self.calendar(cursor, user, uri, context=context)
+        cursor = Transaction().cursor
+        calendar_id = self.calendar(uri)
         if calendar_id:
             if not (uri[10:].split('/', 1) + [None])[1]:
                 if cache is not None:
@@ -349,8 +329,7 @@ class Collection(ModelSQL, ModelView):
                 if res is not None:
                     return res
             else:
-                event_id = self.event(cursor, user, uri, calendar_id=calendar_id,
-                        context=context)
+                event_id = self.event(uri, calendar_id=calendar_id)
                 if event_id:
                     if cache is not None:
                         cache.setdefault('_calendar', {})
@@ -388,8 +367,7 @@ class Collection(ModelSQL, ModelView):
                                         [event_id2]['lastmodified'] = date
                     if res is not None:
                         return res
-        calendar_ics_id = self.calendar(cursor, user, uri, ics=True,
-                context=context)
+        calendar_ics_id = self.calendar(uri, ics=True)
         if calendar_ics_id:
             if cache is not None:
                 cache.setdefault('_calendar', {})
@@ -422,37 +400,31 @@ class Collection(ModelSQL, ModelView):
                                 [calendar_id2]['lastmodified ics'] = date
             if res is not None:
                 return res
-        return super(Collection, self).get_lastmodified(cursor, user, uri,
-                context=context, cache=cache)
+        return super(Collection, self).get_lastmodified(uri, cache=cache)
 
-    def get_data(self, cursor, user, uri, context=None, cache=None):
+    def get_data(self, uri, cache=None):
         event_obj = self.pool.get('calendar.event')
         calendar_obj = self.pool.get('calendar.calendar')
 
-        calendar_id = self.calendar(cursor, user, uri, context=context)
+        calendar_id = self.calendar(uri)
         if calendar_id:
             if not (uri[10:].split('/', 1) + [None])[1]:
                 raise DAV_NotFound
-            event_id = self.event(cursor, user, uri, calendar_id=calendar_id,
-                    context=context)
+            event_id = self.event(uri, calendar_id=calendar_id)
             if not event_id:
                 raise DAV_NotFound
-            ical = event_obj.event2ical(cursor, user, event_id, context=context)
+            ical = event_obj.event2ical(event_id)
             return ical.serialize()
-        calendar_ics_id = self.calendar(cursor, user, uri, ics=True,
-                context=context)
+        calendar_ics_id = self.calendar(uri, ics=True)
         if calendar_ics_id:
-            ical = calendar_obj.calendar2ical(cursor, user, calendar_ics_id,
-                    context=context)
+            ical = calendar_obj.calendar2ical(calendar_ics_id)
             return ical.serialize()
-        return super(Collection, self).get_data(cursor, user, uri,
-                context=context, cache=cache)
+        return super(Collection, self).get_data(uri, cache=cache)
 
-    def get_calendar_description(self, cursor, user, uri, context=None,
-            cache=None):
+    def get_calendar_description(self, uri, cache=None):
         calendar_obj = self.pool.get('calendar.calendar')
 
-        calendar_id = self.calendar(cursor, user, uri, context=context)
+        calendar_id = self.calendar(uri)
         if calendar_id:
             if not (uri[10:].split('/', 1) + [None])[1]:
                 if cache is not None:
@@ -470,8 +442,7 @@ class Collection(ModelSQL, ModelView):
                 else:
                     ids = [calendar_id]
                 res = None
-                for calendar in calendar_obj.browse(cursor, user, ids,
-                        context=context):
+                for calendar in calendar_obj.browse(ids):
                     if calendar.id == calendar_id:
                         res = calendar.description
                     if cache is not None:
@@ -484,150 +455,121 @@ class Collection(ModelSQL, ModelView):
                     return res
         raise DAV_NotFound
 
-    def get_calendar_data(self, cursor, user, uri, context=None, cache=None):
-        return self.get_data(cursor, user, uri, context=context, cache=cache)\
-                .decode('utf-8')
+    def get_calendar_data(self, uri, cache=None):
+        return self.get_data(uri, cache=cache).decode('utf-8')
 
-    def get_calendar_home_set(self, cursor, user, uri, context=None,
-            cache=None):
+    def get_calendar_home_set(self, uri, cache=None):
         return '/Calendars'
 
-    def get_calendar_user_address_set(self, cursor, user_id, uri, context=None,
-            cache=None):
+    def get_calendar_user_address_set(self, uri, cache=None):
         user_obj = self.pool.get('res.user')
-        user = user_obj.browse(cursor, user_id, user_id, context=context)
+        user = user_obj.browse(Transaction().user)
         if user.email:
             return user.email
         raise DAV_NotFound
 
-    def get_schedule_inbox_URL(self, cursor, user, uri, context=None,
-            cache=None):
+    def get_schedule_inbox_URL(self, uri, cache=None):
         calendar_obj = self.pool.get('calendar.calendar')
+        user = Transaction().user
 
-        calendar_ids = calendar_obj.search(cursor, user, [
+        calendar_ids = calendar_obj.search([
             ('owner', '=', user),
-            ], limit=1, context=context)
+            ], limit=1)
         if not calendar_ids:
             # Sunbird failed with no value
             return '/Calendars'
-        calendar = calendar_obj.browse(cursor, user, calendar_ids[0],
-                context=context)
+        calendar = calendar_obj.browse(calendar_ids[0])
         return '/Calendars/' + calendar.name
 
-    def get_schedule_outbox_URL(self, cursor, user, uri, context=None,
-            cache=None):
-        return self.get_schedule_inbox_URL(cursor, user, uri, context=context,
-                cache=cache)
+    def get_schedule_outbox_URL(self, uri, cache=None):
+        return self.get_schedule_inbox_URL(uri, cache=cache)
 
-    def put(self, cursor, user, uri, data, content_type, context=None,
-            cache=None):
+    def put(self, uri, data, content_type, cache=None):
         event_obj = self.pool.get('calendar.event')
         calendar_obj = self.pool.get('calendar.calendar')
 
-        calendar_id = self.calendar(cursor, user, uri, context=context)
+        calendar_id = self.calendar(uri)
         if calendar_id:
             if not (uri[10:].split('/', 1) + [None])[1]:
                 raise DAV_Forbidden
-            event_id = self.event(cursor, user, uri, calendar_id=calendar_id,
-                    context=context)
+            event_id = self.event(uri, calendar_id=calendar_id)
             if not event_id:
                 ical = vobject.readOne(data)
-                values = event_obj.ical2values(cursor, user, None, ical,
-                        calendar_id, context=context)
-                event_id = event_obj.create(cursor, user, values,
-                        context=context)
-                event = event_obj.browse(cursor, user, event_id,
-                        context=context)
-                calendar = calendar_obj.browse(cursor, user, calendar_id,
-                        context=context)
-                return cursor.database_name + '/Calendars/' + calendar.name + \
-                        '/' + event.uuid + '.ics'
+                values = event_obj.ical2values(None, ical, calendar_id)
+                event_id = event_obj.create(values)
+                event = event_obj.browse(event_id)
+                calendar = calendar_obj.browse(calendar_id)
+                return (Transaction().cursor.database_name + '/Calendars/' +
+                        calendar.name + '/' + event.uuid + '.ics')
             else:
                 ical = vobject.readOne(data)
-                values = event_obj.ical2values(cursor, user, event_id, ical,
-                        calendar_id, context=context)
-                event_obj.write(cursor, user, event_id, values,
-                        context=context)
+                values = event_obj.ical2values(event_id, ical, calendar_id)
+                event_obj.write(event_id, values)
                 return
-        calendar_ics_id = self.calendar(cursor, user, uri, ics=True,
-                context=context)
+        calendar_ics_id = self.calendar(uri, ics=True)
         if calendar_ics_id:
             raise DAV_Forbidden
-        return super(Collection, self).put(cursor, user, uri, data,
-                content_type, context=context)
+        return super(Collection, self).put(uri, data, content_type)
 
-    def mkcol(self, cursor, user, uri, context=None, cache=None):
+    def mkcol(self, uri, cache=None):
         if uri and uri.startswith('Calendars/'):
             raise DAV_Forbidden
-        return super(Collection, self).mkcol(cursor, user, uri, context=context,
-                cache=cache)
+        return super(Collection, self).mkcol(uri, cache=cache)
 
-    def rmcol(self, cursor, user, uri, context=None, cache=None):
+    def rmcol(self, uri, cache=None):
         calendar_obj = self.pool.get('calendar.calendar')
 
-        calendar_id = self.calendar(cursor, user, uri, context=context)
+        calendar_id = self.calendar(uri)
         if calendar_id:
             if not (uri[10:].split('/', 1) + [None])[1]:
                 try:
-                    calendar_obj.delete(cursor, user, calendar_id,
-                            context=context)
-                except:
+                    calendar_obj.delete(calendar_id)
+                except Exception:
                     raise DAV_Forbidden
                 return 200
             raise DAV_Forbidden
-        return super(Collection, self).rmcol(cursor, user, uri, context=context,
-                cache=cache)
+        return super(Collection, self).rmcol(uri, cache=cache)
 
-    def rm(self, cursor, user, uri, context=None, cache=None):
+    def rm(self, uri, cache=None):
         event_obj = self.pool.get('calendar.event')
 
-        calendar_id = self.calendar(cursor, user, uri, context=context)
+        calendar_id = self.calendar(uri)
         if calendar_id:
             if not (uri[10:].split('/', 1) + [None])[1]:
                 return 403
-            event_id = self.event(cursor, user, uri, calendar_id=calendar_id,
-                    context=context)
+            event_id = self.event(uri, calendar_id=calendar_id)
             if event_id:
                 try:
-                    event_obj.delete(cursor, user, event_id, context=context)
-                except:
+                    event_obj.delete(event_id)
+                except Exception:
                     return 403
                 return 200
             return 404
-        calendar_ics_id = self.calendar(cursor, user, uri, ics=True,
-                context=context)
+        calendar_ics_id = self.calendar(uri, ics=True)
         if calendar_ics_id:
             return 403
-        return super(Collection, self).rm(cursor, user, uri, context=context,
-                cache=cache)
+        return super(Collection, self).rm(uri, cache=cache)
 
-    def exists(self, cursor, user, uri, context=None, cache=None):
+    def exists(self, uri, cache=None):
         if uri in ('Calendars', 'Calendars/'):
             return 1
-        calendar_id = self.calendar(cursor, user, uri, context=context)
+        calendar_id = self.calendar(uri)
         if calendar_id:
             if not (uri[10:].split('/', 1) + [None])[1]:
                 return 1
-            if self.event(cursor, user, uri, calendar_id=calendar_id,
-                    context=context):
+            if self.event(uri, calendar_id=calendar_id):
                 return 1
-        calendar_ics_id = self.calendar(cursor, user, uri, ics=True,
-                context=context)
+        calendar_ics_id = self.calendar(uri, ics=True)
         if calendar_ics_id:
             return 1
-        return super(Collection, self).exists(cursor, user, uri, context=context,
-                cache=cache)
+        return super(Collection, self).exists(uri, cache=cache)
 
-    def current_user_privilege_set(self, cursor, user, uri, context=None,
-            cache=None):
+    def current_user_privilege_set(self, uri, cache=None):
         '''
         Return the privileges of the current user for uri
         Privileges ares: create, read, write, delete
 
-        :param cursor: the database cursor
-        :param user: the user id
         :param uri: the uri
-        :param context: the context
         :param cache: the cache
         :return: a list of privileges
         '''
@@ -636,10 +578,9 @@ class Collection(ModelSQL, ModelView):
         if uri in ('Calendars', 'Calendars/'):
             return ['create', 'read', 'write', 'delete']
         if uri and uri.startswith('Calendars/'):
-            calendar_id = self.calendar(cursor, user, uri, context=context)
+            calendar_id = self.calendar(uri)
             if calendar_id:
-                calendar = calendar_obj.browse(cursor, user, calendar_id,
-                        context=context)
+                calendar = calendar_obj.browse(calendar_id)
                 if user == calendar.owner.id:
                     return ['create', 'read', 'write', 'delete']
                 res = []
@@ -649,7 +590,7 @@ class Collection(ModelSQL, ModelView):
                     res.extend(['read', 'write', 'delete'])
                 return res
             return []
-        return super(Collection, self).current_user_privilege_set(cursor, user,
-                uri, context=context, cache=cache)
+        return super(Collection, self).current_user_privilege_set(uri,
+                cache=cache)
 
 Collection()
commit 504d77091f536edd3abdcf4ca60c6496c0d50e8e
Author: Mathias Behrle <mathiasb at mbsolutions.selfip.biz>
Date:   Mon May 10 16:49:29 2010 +0200

    Adding upstream version 1.6.0.

diff --git a/CHANGELOG b/CHANGELOG
index 035fbe7..ecc0320 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,8 +1,6 @@
-Version 1.4.2 - 2010-02-16
-* Some bug fixes (see mercurial logs for details)
-
-Version 1.4.1 - 2009-11-23
-* Some bug fixes (see mercurial logs for details)
+Version 1.6.0 - 2010-05-09
+* Bug fixes (see mercurial logs for details)
+* Remove classification_public
 
 Version 1.4.0 - 2009-10-19
 * Initial release
diff --git a/PKG-INFO b/PKG-INFO
index f37d9ae..df6d2d5 100644
--- a/PKG-INFO
+++ b/PKG-INFO
@@ -1,12 +1,12 @@
 Metadata-Version: 1.0
 Name: trytond_calendar
-Version: 1.4.2
+Version: 1.6.0
 Summary: Add CalDAV support
 Home-page: http://www.tryton.org/
 Author: B2CK
 Author-email: info at b2ck.com
 License: GPL-3
-Download-URL: http://downloads.tryton.org/1.4/
+Download-URL: http://downloads.tryton.org/1.6/
 Description: UNKNOWN
 Platform: UNKNOWN
 Classifier: Development Status :: 5 - Production/Stable
diff --git a/README b/README
index fdb062c..b662e80 100644
--- a/README
+++ b/README
@@ -1,5 +1,5 @@
 trytond_calendar
-======================
+================
 
 The calendar module of the Tryton application platform.  See
 __tryton__.py
diff --git a/__tryton__.py b/__tryton__.py
index 4830f9f..57872dc 100644
--- a/__tryton__.py
+++ b/__tryton__.py
@@ -7,7 +7,7 @@
     'name_es_CO' : 'Calendario',
     'name_es_ES' : 'Calendario',
     'name_fr_FR' : 'Calendrier',
-    'version' : '1.4.2',
+    'version' : '1.6.0',
     'author' : 'B2CK',
     'email': 'info at b2ck.com',
     'website': 'http://www.tryton.org/',
diff --git a/calendar.py b/calendar.py
index 20c61f4..be0c723 100644
--- a/calendar.py
+++ b/calendar.py
@@ -2,6 +2,8 @@
 #this repository contains the full copyright notices and license terms.
 from trytond.model import ModelSQL, ModelView, fields
 from trytond.tools import Cache, reduce_ids
+from trytond.backend import TableHandler
+from trytond.pyson import If, Bool, Not, Eval, Greater
 import uuid
 import vobject
 import dateutil.tz
@@ -69,6 +71,7 @@ class Calendar(ModelSQL, ModelView):
                 return False
         return True
 
+    @Cache('calendar_calendar.get_name')
     def get_name(self, cursor, user, name, context=None):
         '''
         Return the calendar id of the name
@@ -86,8 +89,6 @@ class Calendar(ModelSQL, ModelView):
             return calendar_ids[0]
         return False
 
-    get_name = Cache('calendar_calendar.get_name')(get_name)
-
     def calendar2ical(self, cursor, user, calendar_id, context=None):
         '''
         Return an iCalendar object for the given calendar_id containing
@@ -286,6 +287,7 @@ class Calendar(ModelSQL, ModelView):
         :param context: the context
         :return: the xml with schedule-response
         '''
+        from DAV.errors import DAV_Forbidden
         collection_obj = self.pool.get('webdav.collection')
 
         calendar_id = collection_obj.calendar(cursor, user, uri,
@@ -432,7 +434,7 @@ class Event(ModelSQL, ModelView):
     uuid = fields.Char('UUID', required=True,
             help='Universally Unique Identifier', select=1)
     calendar = fields.Many2One('calendar.calendar', 'Calendar',
-            required=True, select=1)
+            required=True, select=1, ondelete="CASCADE")
     summary = fields.Char('Summary')
     sequence = fields.Integer('Sequence')
     description = fields.Text('Description')
@@ -455,7 +457,7 @@ class Event(ModelSQL, ModelView):
         ('cancelled', 'Cancelled'),
         ], 'Status')
     organizer = fields.Char('Organizer', states={
-        'required': "bool(attendees) and not bool(parent)",
+        'required': If(Bool(Eval('attendees')), Not(Bool(Eval('parent'))), False),
         }, depends=['attendees', 'parent'])
     attendees = fields.One2Many('calendar.event.attendee', 'event',
             'Attendees')
@@ -466,47 +468,45 @@ class Event(ModelSQL, ModelView):
     alarms = fields.One2Many('calendar.event.alarm', 'event', 'Alarms')
     rdates = fields.One2Many('calendar.event.rdate', 'event', 'Recurrence Dates',
             states={
-                'invisible': "bool(parent)",
+                'invisible': Bool(Eval('parent')),
             }, depends=['parent'])
     rrules = fields.One2Many('calendar.event.rrule', 'event', 'Recurrence Rules',
             states={
-                'invisible': "bool(parent)",
+                'invisible': Bool(Eval('parent')),
             }, depends=['parent'])
     exdates = fields.One2Many('calendar.event.exdate', 'event', 'Exception Dates',
             states={
-                'invisible': "bool(parent)",
+                'invisible': Bool(Eval('parent')),
             }, depends=['parent'])
     exrules = fields.One2Many('calendar.event.exrule', 'event', 'Exception Rules',
             states={
-                'invisible': "bool(parent)",
+                'invisible': Bool(Eval('parent')),
             }, depends=['parent'])
     occurences = fields.One2Many('calendar.event', 'parent', 'Occurences',
-            domain=["('uuid', '=', uuid)",
-                "('calendar', '=', calendar)"],
+            domain=[
+                ('uuid', '=', Eval('uuid')),
+                ('calendar', '=', Eval('calendar')),
+            ],
             states={
-                'invisible': "bool(parent)",
+                'invisible': Bool(Eval('parent')),
             }, depends=['uuid', 'calendar', 'parent'])
     parent = fields.Many2One('calendar.event', 'Parent',
-            domain=["('uuid', '=', uuid)",
-                "('parent', '=', False)",
-                "('calendar', '=', calendar)"],
+            domain=[
+                ('uuid', '=', Eval('uuid')),
+                ('parent', '=', False),
+                ('calendar', '=', Eval('calendar')),
+            ],
             ondelete='CASCADE', depends=['uuid', 'calendar'])
     recurrence = fields.DateTime('Recurrence', select=1, states={
-                'invisible': "not bool(globals().get('_parent_parent'))",
-                'required': "bool(globals().get('_parent_parent'))",
+                'invisible': Not(Bool(Eval('_parent_parent'))),
+                'required': Bool(Eval('_parent_parent')),
                 }, depends=['parent'])
-    calendar_owner = fields.Function('get_calendar_field',
-            type='many2one', relation='res.user', string='Owner',
-            fnct_search='search_calendar_field')
-    calendar_read_users = fields.Function('get_calendar_field',
-            type='many2many', relation='res.user', string='Read Users',
-            fnct_search='search_calendar_field')
-    calendar_write_users = fields.Function('get_calendar_field',
-            type='many2many', relation='res.user', string='Write Users',
-            fnct_search='search_calendar_field')
-    classification_public = fields.Function('get_classification_public',
-            type='boolean', string='Classification Public',
-            fnct_search='search_classification_public')
+    calendar_owner = fields.Function(fields.Many2One('res.user', 'Owner'),
+            'get_calendar_field', searcher='search_calendar_field')
+    calendar_read_users = fields.Function(fields.Many2One('res.user',
+        'Read Users'), 'get_calendar_field', searcher='search_calendar_field')
+    calendar_write_users = fields.Function(fields.One2Many('res.user', None,
+        'Write Users'), 'get_calendar_field', searcher='search_calendar_field')
     vevent = fields.Binary('vevent')
 
     def __init__(self):
@@ -522,6 +522,20 @@ class Event(ModelSQL, ModelView):
             'invalid_recurrence': 'Recurrence can not be recurrent!',
         })
 
+    def init(self, cursor, module_name):
+        # Migrate from 1.4: remove classification_public
+        model_data_obj = self.pool.get('ir.model.data')
+        rule_obj = self.pool.get('ir.rule')
+        model_data_ids = model_data_obj.search(cursor, 0, [
+            ('fs_id', '=', 'rule_group_read_calendar_line3'),
+            ('module', '=', module_name),
+            ('inherit', '=', False),
+            ], limit=1)
+        if model_data_ids:
+            model_data = model_data_obj.browse(cursor, 0, model_data_ids[0])
+            rule_obj.delete(cursor, 0, model_data.db_id)
+        return super(Event, self).init(cursor, module_name)
+
     def default_uuid(self, cursor, user, context=None):
         return str(uuid.uuid4())
 
@@ -542,7 +556,7 @@ class Event(ModelSQL, ModelView):
     def timezones(self, cursor, user, context=None):
         return [(x, x) for x in pytz.common_timezones] + [('', '')]
 
-    def get_calendar_field(self, cursor, user, ids, name, arg, context=None):
+    def get_calendar_field(self, cursor, user, ids, name, context=None):
         assert name in ('calendar_owner', 'calendar_read_users',
                 'calendar_write_users'), 'Invalid name'
         res = {}
@@ -554,35 +568,8 @@ class Event(ModelSQL, ModelView):
                 res[event.id] = event.calendar[name].id
         return res
 
-    def search_calendar_field(self, cursor, user, name, args, context=None):
-        args2 = []
-        i = 0
-        while i < len(args):
-            field = args[i][0][9:]
-            args2.append(tuple(['calendar.' + field] + list(args[i])[1:]))
-            i += 1
-        return args2
-
-    def get_classification_public(self, cursor, user, ids, name, arg,
-            context=None):
-        res = {}
-        for event in self.browse(cursor, user, ids, context=context):
-            res[event.id] = False
-            if event.classification == 'public':
-                res[event.id] = True
-        return res
-
-    def search_classification_public(self, cursor, user, name, args,
-            context=None):
-        args2 = []
-        i = 0
-        while i < len(args):
-            if args[i][2]:
-                args2.append(('classification', '=', 'public'))
-            else:
-                args2.append(('classification', '!=', 'public'))
-            i += 1
-        return args2
+    def search_calendar_field(self, cursor, user, name, clause, context=None):
+        return [('calendar.' + name[9:],) + clause[1:]]
 
     def check_recurrence(self, cursor, user, ids):
         '''
@@ -1361,7 +1348,7 @@ class Attendee(ModelSQL, ModelView):
     _name = 'calendar.attendee'
 
     email = fields.Char('Email', required=True, states={
-        'readonly': 'active_id > 0',
+        'readonly': Greater(Eval('active_id', 0), 0),
         })
     status = fields.Selection([
         ('', ''),
@@ -1621,16 +1608,24 @@ class EventAttendee(ModelSQL, ModelView):
 EventAttendee()
 
 
-class RDate(ModelSQL, ModelView):
-    'Recurrence Date'
+class Date(ModelSQL, ModelView):
+    'Calendar Date'
     _description = __doc__
-    _name = 'calendar.rdate'
+    _name = 'calendar.date'
     _rec_name = 'datetime'
 
     date = fields.Boolean('Is Date', help='Ignore time of field "Date", ' \
             'but handle as date only.')
     datetime = fields.DateTime('Date', required=True)
 
+    def init(self, cursor, module_name):
+        # Migration from 1.4: calendar.rdate renamed to calendar.date
+        old_table = 'calendar_rdate'
+        if TableHandler.table_exist(cursor, old_table):
+            TableHandler.table_rename(cursor, old_table, self._table)
+
+        return super(Date, self).init(cursor, module_name)
+
     def _date2update(self, cursor, user, date, context=None):
         res = {}
         res['date'] = date.date
@@ -1666,7 +1661,7 @@ class RDate(ModelSQL, ModelView):
 
         :param cursor: the database cursor
         :param user: the user id
-        :param date: a BrowseRecord of calendar.rdate or
+        :param date: a BrowseRecord of calendar.date or
             calendar.exdate
         :param context: the context
         :return: a datetime
@@ -1678,21 +1673,30 @@ class RDate(ModelSQL, ModelView):
             res = date.datetime.replace(tzinfo=tzlocal).astimezone(tzutc)
         return res
 
-RDate()
+Date()
 
 
 class EventRDate(ModelSQL, ModelView):
     'Recurrence Date'
     _description = __doc__
     _name = 'calendar.event.rdate'
-    _inherits = {'calendar.rdate': 'calendar_rdate'}
+    _inherits = {'calendar.date': 'calendar_date'}
     _rec_name = 'datetime'
 
-    calendar_rdate = fields.Many2One('calendar.rdate', 'Calendar RDate',
+    calendar_date = fields.Many2One('calendar.date', 'Calendar Date',
             required=True, ondelete='CASCADE', select=1)
     event = fields.Many2One('calendar.event', 'Event', ondelete='CASCADE',
             select=1, required=True)
 
+    def init(self, cursor, module_name):
+        # Migration from 1.4: calendar_rdate renamed to calendar_date
+        table = TableHandler(cursor, self, module_name)
+        old_column = 'calendar_rdate'
+        if table.column_exist(old_column):
+            table.column_rename(old_column, 'calendar_date')
+
+        return super(EventRDate, self).init(cursor, module_name)
+
     def create(self, cursor, user, values, context=None):
         event_obj = self.pool.get('calendar.event')
         if values.get('event'):
@@ -1717,11 +1721,11 @@ class EventRDate(ModelSQL, ModelView):
 
     def delete(self, cursor, user, ids, context=None):
         event_obj = self.pool.get('calendar.event')
-        rdate_obj = self.pool.get('calendar.rdate')
+        rdate_obj = self.pool.get('calendar.date')
         if isinstance(ids, (int, long)):
             ids = [ids]
         event_rdates = self.browse(cursor, user, ids, context=context)
-        rdate_ids = [a.calendar_rdate.id for a in event_rdates]
+        rdate_ids = [a.calendar_date.id for a in event_rdates]
         event_ids = [x.event.id for x in event_rdates]
         if event_ids:
             # Update write_date of event
@@ -1732,15 +1736,15 @@ class EventRDate(ModelSQL, ModelView):
         return res
 
     def _date2update(self, cursor, user, date, context=None):
-        date_obj = self.pool.get('calendar.rdate')
+        date_obj = self.pool.get('calendar.date')
         return date_obj._date2update(cursor, user, date, context=context)
 
     def date2values(self, cursor, user, date, context=None):
-        date_obj = self.pool.get('calendar.rdate')
+        date_obj = self.pool.get('calendar.date')
         return date_obj.date2values(cursor, user, date, context=context)
 
     def date2date(self, cursor, user, date, context=None):
-        date_obj = self.pool.get('calendar.rdate')
+        date_obj = self.pool.get('calendar.date')
         return date_obj.date2date(cursor, user, date, context=context)
 
 EventRDate()
@@ -1796,8 +1800,8 @@ class RRule(ModelSQL, ModelView):
     def __init__(self):
         super(RRule, self).__init__()
         self._sql_constraints += [
-            ('until_count',
-                'CHECK(until IS NULL OR count IS NULL)',
+            ('until_count_only_one',
+                'CHECK(until IS NULL OR count IS NULL OR count = 0)',
                 'Only one of "until" and "count" can be set!'),
         ]
         self._constraints += [
@@ -1823,6 +1827,12 @@ class RRule(ModelSQL, ModelView):
             'invalid_bysetpos': 'Invalid "By Position"',
         })
 
+    def init(self, cursor, module_name):
+        # Migrate from 1.4: unit_count replaced by until_count_only_one
+        table  = TableHandler(cursor, self, module_name)
+        table.drop_constraint('until_count')
+        return super(RRule, self).init(cursor, module_name)
+
     def check_bysecond(self, cursor, user, ids):
         for rule in self.browse(cursor, user, ids):
             if not rule.bysecond:
diff --git a/calendar.xml b/calendar.xml
index 8a0b020..07e9a33 100644
--- a/calendar.xml
+++ b/calendar.xml
@@ -68,6 +68,23 @@ this repository contains the full copyright notices and license terms. -->
         </record>
         <menuitem parent="menu_calendar" sequence="1"
             action="act_calendar_form" id="menu_calendar_form"/>
+        <record model="ir.action.act_window" id="act_calendar_form2">
+            <field name="name">Calendars</field>
+            <field name="res_model">calendar.calendar</field>
+            <field name="view_type">form</field>
+        </record>
+        <record model="ir.action.act_window.view" id="act_calendar_form2_view1">
+            <field name="sequence" eval="10"/>
+            <field name="view" ref="calendar_view_form"/>
+            <field name="act_window" ref="act_calendar_form2"/>
+        </record>
+        <record model="ir.action.act_window.view" id="act_calendar_form2_view2">
+            <field name="sequence" eval="20"/>
+            <field name="view" ref="calendar_view_tree"/>
+            <field name="act_window" ref="act_calendar_form2"/>
+        </record>
+        <menuitem name="New Calendar" parent="menu_calendar_form" sequence="10"
+            action="act_calendar_form2" id="menu_calendar_form2"/>
 
         <record model="ir.rule.group" id="rule_group_read_calendar">
             <field name="model" search="[('model', '=', 'calendar.event')]"/>
@@ -90,12 +107,6 @@ this repository contains the full copyright notices and license terms. -->
             <field name="operand">User</field>
             <field name="rule_group" ref="rule_group_read_calendar"/>
         </record>
-        <record model="ir.rule" id="rule_group_read_calendar_line3">
-            <field name="field" search="[('name', '=', 'classification_public'), ('model.model', '=', 'calendar.event')]"/>
-            <field name="operator">=</field>
-            <field name="operand">True</field>
-            <field name="rule_group" ref="rule_group_read_calendar"/>
-        </record>
 
         <record model="ir.rule.group" id="rule_group_write_calendar">
             <field name="model" search="[('model', '=', 'calendar.event')]"/>
@@ -227,7 +238,7 @@ this repository contains the full copyright notices and license terms. -->
                             <field name="attendees" colspan="4"/>
                         </page>
                         <page string="Occurences" id="occurences"
-                            states="{'invisible': '''bool(globals().get('_parent_parent'))'''}">
+                            states="{'invisible': Bool(Eval('_parent_parent'))}">
                             <field name="rrules" colspan="2"/>
                             <field name="rdates" colspan="2"/>
                             <field name="exrules" colspan="2"/>
@@ -266,8 +277,49 @@ this repository contains the full copyright notices and license terms. -->
             <field name="view" ref="event_view_form"/>
             <field name="act_window" ref="act_event_form"/>
         </record>
-        <menuitem parent="menu_calendar_form" sequence="1"
+        <menuitem parent="menu_calendar_form" sequence="20"
             action="act_event_form" id="menu_event_form"/>
+        <record model="ir.action.act_window" id="act_event_form2">
+            <field name="name">Events</field>
+            <field name="res_model">calendar.event</field>
+            <field name="view_type">form</field>
+            <field name="domain">[('parent', '=', False)]</field>
+        </record>
+        <record model="ir.action.act_window.view" id="act_event_form2_view1">
+            <field name="sequence" eval="10"/>
+            <field name="view" ref="event_view_form"/>
+            <field name="act_window" ref="act_event_form2"/>
+        </record>
+        <record model="ir.action.act_window.view" id="act_event_form2_view2">
+            <field name="sequence" eval="20"/>
+            <field name="view" ref="event_view_tree"/>
+            <field name="act_window" ref="act_event_form2"/>
+        </record>
+        <menuitem name="New Event" parent="menu_event_form" sequence="10"
+            action="act_event_form2" id="menu_event_form2"/>
+
+        <record model="ir.action.act_window" id="act_event_form3">
+            <field name="name">Events</field>
+            <field name="res_model">calendar.event</field>
+            <field name="view_type">form</field>
+            <field name="domain">[('parent', '=', False), ('calendar', '=', Eval('active_id'))]</field>
+        </record>
+        <record model="ir.action.act_window.view" id="act_event_form3_view1">
+            <field name="sequence" eval="10"/>
+            <field name="view" ref="event_view_tree"/>
+            <field name="act_window" ref="act_event_form3"/>
+        </record>
+        <record model="ir.action.act_window.view" id="act_event_form3_view2">
+            <field name="sequence" eval="20"/>
+            <field name="view" ref="event_view_form"/>
+            <field name="act_window" ref="act_event_form3"/>
+        </record>
+        <record model="ir.action.keyword"
+                id="act_open_event_keyword1">
+            <field name="keyword">form_relate</field>
+            <field name="model">calendar.calendar,0</field>
+            <field name="action" ref="act_event_form3"/>
+        </record>
 
         <record model="ir.ui.view" id="attendee_view_tree">
             <field name="model">calendar.event.attendee</field>
diff --git a/de_DE.csv b/de_DE.csv
index abef7ff..ba69519 100644
--- a/de_DE.csv
+++ b/de_DE.csv
@@ -35,6 +35,9 @@ field,"calendar.calendar-write-res.user,user",0,User,Benutzer,0
 field,"calendar.calendar,write_users",0,Write Users,Benutzer mit Schreibberechtigung,0
 field,"calendar.category,name",0,Name,Name,0
 field,"calendar.category,rec_name",0,Name,Name,0
+field,"calendar.date,date",0,Is Date,Als Datum,0
+field,"calendar.date,datetime",0,Date,Zeitpunkt,0
+field,"calendar.date,rec_name",0,Name,Name,0
 field,"calendar.event.alarm,calendar_alarm",0,Calendar Alarm,Kalender Alarm,0
 field,"calendar.event.alarm,event",0,Event,Termin,0
 field,"calendar.event.alarm,rec_name",0,Name,Name,0
@@ -53,11 +56,10 @@ field,"calendar.event,calendar_read_users",0,Read Users,Benutzer mit Leseberecht
 field,"calendar.event,calendar_write_users",0,Write Users,Benutzer mit Schreibberechtigung,0
 field,"calendar.event,categories",0,Categories,Kategorien,0
 field,"calendar.event,classification",0,Classification,Klassifizierung,0
-field,"calendar.event,classification_public",0,Classification Public,Öffentliche Klassifizierung,0
 field,"calendar.event,description",0,Description,Bezeichnung,0
 field,"calendar.event,dtend",0,End Date,Enddatum,0
 field,"calendar.event,dtstart",0,Start Date,Anfangsdatum,0
-field,"calendar.event.exdate,calendar_rdate",0,Calendar RDate,Kalender WDatum,0
+field,"calendar.event.exdate,calendar_date",0,Calendar Date,Kalender Datum,0
 field,"calendar.event.exdate,event",0,Event,Termin,0
 field,"calendar.event.exdate,rec_name",0,Name,Name,0
 field,"calendar.event,exdates",0,Exception Dates,Ausnahmedaten,0
@@ -69,7 +71,7 @@ field,"calendar.event,location",0,Location,Ort,0
 field,"calendar.event,occurences",0,Occurences,Ereignisse,0
 field,"calendar.event,organizer",0,Organizer,Organisator,0
 field,"calendar.event,parent",0,Parent,Übergeordnet (Termin),0
-field,"calendar.event.rdate,calendar_rdate",0,Calendar RDate,Kalender WDatum,0
+field,"calendar.event.rdate,calendar_date",0,Calendar Date,Kalender Datum,0
 field,"calendar.event.rdate,event",0,Event,Termin,0
 field,"calendar.event.rdate,rec_name",0,Name,Name,0
 field,"calendar.event,rdates",0,Recurrence Dates,Wiederholungsdaten,0
@@ -79,7 +81,7 @@ field,"calendar.event.rrule,calendar_rrule",0,Calendar RRule,Kalender WRegel,0
 field,"calendar.event.rrule,event",0,Event,Termin,0
 field,"calendar.event.rrule,rec_name",0,Name,Name,0
 field,"calendar.event,rrules",0,Recurrence Rules,Wiederholungsregeln,0
-field,"calendar.event,sequence",0,Sequence,Sequenz,0
+field,"calendar.event,sequence",0,Sequence,Revision,0
 field,"calendar.event,status",0,Status,Status,0
 field,"calendar.event,summary",0,Summary,Zusammenfassung,0
 field,"calendar.event,timezone",0,Timezone,Zeitzone,0
@@ -88,9 +90,6 @@ field,"calendar.event,uuid",0,UUID,UUID,0
 field,"calendar.event,vevent",0,vevent,vevent,0
 field,"calendar.location,name",0,Name,Name,0
 field,"calendar.location,rec_name",0,Name,Name,0
-field,"calendar.rdate,date",0,Is Date,Als Datum,0
-field,"calendar.rdate,datetime",0,Date,Zeitpunkt,0
-field,"calendar.rdate,rec_name",0,Name,Name,0
 field,"calendar.rrule,byday",0,By Day,Für Tag,0
 field,"calendar.rrule,byhour",0,By Hour,Für Stunde,0
 field,"calendar.rrule,byminute",0,By Minute,Für Minute,0
@@ -109,8 +108,8 @@ field,"calendar.rrule,until_date",0,Is Date,Als Datum,0
 field,"calendar.rrule,wkst",0,Week Day,Wochentag,0
 field,"res.user,calendars",0,Calendars,Kalender,0
 help,"calendar.calendar,owner",0,The user must have an email,Dem Benutzer muss eine E-Mail-Adresse zugeordnet sein!,0
+help,"calendar.date,date",0,"Ignore time of field ""Date"", but handle as date only.","Verwende von Feld ""Zeitpunkt"" nur das Datum ohne den Zeitanteil.",0
 help,"calendar.event,uuid",0,Universally Unique Identifier,Universally Unique Identifier,0
-help,"calendar.rdate,date",0,"Ignore time of field ""Date"", but handle as date only.","Verwende von Feld ""Zeitpunkt"" nur das Datum ohne den Zeitanteil.",0
 help,"calendar.rrule,until_date",0,"Ignore time of field ""Until Date"", but handle as date only.","Verwende von Feld ""Bis Zeitpunkt"" nur das Datum ohne den Zeitanteil.",0
 model,"calendar.alarm,name",0,Alarm,Alarm,0
 model,"calendar.attendee,name",0,Attendee,Teilnehmer,0
@@ -118,6 +117,7 @@ model,"calendar.calendar,name",0,Calendar,Kalender,0
 model,"calendar.calendar-read-res.user,name",0,Calendar - read - User,Kalender - Schreiben - Benutzer,0
 model,"calendar.calendar-write-res.user,name",0,Calendar - write - User,Kalender - Lesen - Benutzer,0
 model,"calendar.category,name",0,Category,Kategorie,0
+model,"calendar.date,name",0,Calendar Date,Kalender Datum,0
 model,"calendar.event.alarm,name",0,Alarm,Alarm,0
 model,"calendar.event.attendee,name",0,Attendee,Teilnehmer,0
 model,"calendar.event-calendar.category,name",0,Event - Category,Termin - Kategorie,0
@@ -127,13 +127,17 @@ model,"calendar.event,name",0,Event,Termin,0
 model,"calendar.event.rdate,name",0,Recurrence Date,Wiederholungsdatum,0
 model,"calendar.event.rrule,name",0,Recurrence Rule,Wiederholungsregel,0
 model,"calendar.location,name",0,Location,Ort,0
-model,"calendar.rdate,name",0,Recurrence Date,Wiederholungsdatum,0
 model,"calendar.rrule,name",0,Recurrence Rule,Wiederholungsregel,0
 model,"ir.action,name",act_calendar_form,Calendars,Kalender,0
+model,"ir.action,name",act_calendar_form2,Calendars,Kalender,0
 model,"ir.action,name",act_event_form,Events,Termine,0
+model,"ir.action,name",act_event_form2,Events,Termine,0
+model,"ir.action,name",act_event_form3,Events,Termine,0
 model,"ir.ui.menu,name",menu_calendar,Calendar Management,Kalender,0
 model,"ir.ui.menu,name",menu_calendar_form,Calendars,Kalender,0
 model,"ir.ui.menu,name",menu_event_form,Events,Termine,0
+model,"ir.ui.menu,name",menu_calendar_form2,New Calendar,Neuer Kalender,0
+model,"ir.ui.menu,name",menu_event_form2,New Event,Neuer Termin,0
 model,"res.group,name",group_calendar_admin,Calendar Administration,Kalender Administration,0
 selection,"calendar.attendee,status",0,,,0
 selection,"calendar.attendee,status",0,Accepted,Angenommen,0
diff --git a/es_CO.csv b/es_CO.csv
index ad65390..6b16971 100644
--- a/es_CO.csv
+++ b/es_CO.csv
@@ -35,6 +35,9 @@ field,"calendar.calendar-write-res.user,user",0,User,Usuario,0
 field,"calendar.calendar,write_users",0,Write Users,Escribir Usuarios,0
 field,"calendar.category,name",0,Name,Nombre,0
 field,"calendar.category,rec_name",0,Name,Nombre,0
+field,"calendar.date,date",0,Is Date,Es Fecha,0
+field,"calendar.date,datetime",0,Date,Fecha,1
+field,"calendar.date,rec_name",0,Name,Nombre de Contacto,1
 field,"calendar.event.alarm,calendar_alarm",0,Calendar Alarm,,0
 field,"calendar.event.alarm,event",0,Event,Evento,0
 field,"calendar.event.alarm,rec_name",0,Name,Nombre,0
@@ -53,11 +56,10 @@ field,"calendar.event,calendar_read_users",0,Read Users,Usuarios que pueden Leer
 field,"calendar.event,calendar_write_users",0,Write Users,Escribir Usuarios,0
 field,"calendar.event,categories",0,Categories,Categorías,0
 field,"calendar.event,classification",0,Classification,Clasificación,0
-field,"calendar.event,classification_public",0,Classification Public,Clasificación Pública,0
 field,"calendar.event,description",0,Description,Descripción,0
 field,"calendar.event,dtend",0,End Date,Fecha Fin,0
 field,"calendar.event,dtstart",0,Start Date,Fecha Inicial,0
-field,"calendar.event.exdate,calendar_rdate",0,Calendar RDate,,0
+field,"calendar.event.exdate,calendar_date",0,Calendar Date,Fecha Calendario,0
 field,"calendar.event.exdate,event",0,Event,Evento,0
 field,"calendar.event.exdate,rec_name",0,Name,Nombre,0
 field,"calendar.event,exdates",0,Exception Dates,Fechas de Excepción,0
@@ -66,10 +68,10 @@ field,"calendar.event.exrule,event",0,Event,Evento,0
 field,"calendar.event.exrule,rec_name",0,Name,Nombre,0
 field,"calendar.event,exrules",0,Exception Rules,Reglas de Excepción,0
 field,"calendar.event,location",0,Location,Lugar,0
-field,"calendar.event,occurences",0,Occurences,,0
+field,"calendar.event,occurences",0,Occurences,Ocurrencias,1
 field,"calendar.event,organizer",0,Organizer,Organizador,0
 field,"calendar.event,parent",0,Parent,Padre,0
-field,"calendar.event.rdate,calendar_rdate",0,Calendar RDate,,0
+field,"calendar.event.rdate,calendar_date",0,Calendar Date,Fecha Calendario,0
 field,"calendar.event.rdate,event",0,Event,Evento,0
 field,"calendar.event.rdate,rec_name",0,Name,Nombre,0
 field,"calendar.event,rdates",0,Recurrence Dates,Fechas de Repetición,0
@@ -88,9 +90,6 @@ field,"calendar.event,uuid",0,UUID,UUID,0
 field,"calendar.event,vevent",0,vevent,vevento,0
 field,"calendar.location,name",0,Name,Nombre,0
 field,"calendar.location,rec_name",0,Name,Nombre,0
-field,"calendar.rdate,date",0,Is Date,,0
-field,"calendar.rdate,datetime",0,Date,Fecha,0
-field,"calendar.rdate,rec_name",0,Name,Nombre,0
 field,"calendar.rrule,byday",0,By Day,,0
 field,"calendar.rrule,byhour",0,By Hour,,0
 field,"calendar.rrule,byminute",0,By Minute,,0
@@ -109,8 +108,8 @@ field,"calendar.rrule,until_date",0,Is Date,,0
 field,"calendar.rrule,wkst",0,Week Day,Día de la Semana,0
 field,"res.user,calendars",0,Calendars,Calendarios,0
 help,"calendar.calendar,owner",0,The user must have an email,,0
+help,"calendar.date,date",0,"Ignore time of field ""Date"", but handle as date only.","Ignore tiempo del campo ""Fecha"", pero manejelo como fecha solamente.",0
 help,"calendar.event,uuid",0,Universally Unique Identifier,Idenitificador Universal Único,0
-help,"calendar.rdate,date",0,"Ignore time of field ""Date"", but handle as date only.",,0
 help,"calendar.rrule,until_date",0,"Ignore time of field ""Until Date"", but handle as date only.",,0
 model,"calendar.alarm,name",0,Alarm,Alarma,0
 model,"calendar.attendee,name",0,Attendee,Asistente,0
@@ -118,6 +117,7 @@ model,"calendar.calendar,name",0,Calendar,Calendario,0
 model,"calendar.calendar-read-res.user,name",0,Calendar - read - User,Calendario - leer - Usuario,0
 model,"calendar.calendar-write-res.user,name",0,Calendar - write - User,Calendario - escribir - Usuario,0
 model,"calendar.category,name",0,Category,Categoría,0
+model,"calendar.date,name",0,Calendar Date,Fecha Calendario,0
 model,"calendar.event.alarm,name",0,Alarm,Alarma,0
 model,"calendar.event.attendee,name",0,Attendee,Asistente,0
 model,"calendar.event-calendar.category,name",0,Event - Category,Evento - Categoría,0
@@ -127,13 +127,17 @@ model,"calendar.event,name",0,Event,Evento,0
 model,"calendar.event.rdate,name",0,Recurrence Date,Fecha de Repetición,0
 model,"calendar.event.rrule,name",0,Recurrence Rule,Regla de Repetición,0
 model,"calendar.location,name",0,Location,Lugar,0
-model,"calendar.rdate,name",0,Recurrence Date,Fecha de Repetición,0
 model,"calendar.rrule,name",0,Recurrence Rule,Regla de Repetición,0
 model,"ir.action,name",act_calendar_form,Calendars,Calendarios,0
+model,"ir.action,name",act_calendar_form2,Calendars,Calendarios,0
 model,"ir.action,name",act_event_form,Events,Eventos,0
+model,"ir.action,name",act_event_form2,Events,Eventos,0
+model,"ir.action,name",act_event_form3,Events,Eventos,0
 model,"ir.ui.menu,name",menu_calendar,Calendar Management,Calendario,0
 model,"ir.ui.menu,name",menu_calendar_form,Calendars,Calendarios,0
 model,"ir.ui.menu,name",menu_event_form,Events,Eventos,0
+model,"ir.ui.menu,name",menu_calendar_form2,New Calendar,Nuevo Calendario,0
+model,"ir.ui.menu,name",menu_event_form2,New Event,Nuevo Evento,0
 model,"res.group,name",group_calendar_admin,Calendar Administration,Administrar Calendario,0
 selection,"calendar.attendee,status",0,,,0
 selection,"calendar.attendee,status",0,Accepted,,0
@@ -175,7 +179,7 @@ view,calendar.event,0,Categories,Categorías,0
 view,calendar.event,0,Event,Evento,0
 view,calendar.event,0,Events,Eventos,0
 view,calendar.event,0,General,General,0
-view,calendar.event,0,Occurences,,0
+view,calendar.event,0,Occurences,Ocurrencias,1
 view,calendar.event,0,Recurrences,Repeticiones,0
 view,calendar.event.attendee,0,Attendee,Asistente,0
 view,calendar.event.attendee,0,Attendees,Asistentes,0
diff --git a/fr_FR.csv b/fr_FR.csv
index 68ec678..b2df1a2 100644
--- a/fr_FR.csv
+++ b/fr_FR.csv
@@ -35,6 +35,9 @@ field,"calendar.calendar-write-res.user,user",0,User,Utilisateur,0
 field,"calendar.calendar,write_users",0,Write Users,Utilisateurs en écriture,0
 field,"calendar.category,name",0,Name,Nom,0
 field,"calendar.category,rec_name",0,Name,Nom,0
+field,"calendar.date,date",0,Is Date,Est une date,0
+field,"calendar.date,datetime",0,Date,Date,0
+field,"calendar.date,rec_name",0,Name,Nom,0
 field,"calendar.event.alarm,calendar_alarm",0,Calendar Alarm,Alarme calendrier,0
 field,"calendar.event.alarm,event",0,Event,Événement,0
 field,"calendar.event.alarm,rec_name",0,Name,Nom,0
@@ -53,11 +56,10 @@ field,"calendar.event,calendar_read_users",0,Read Users,Utilisateurs en lecture,
 field,"calendar.event,calendar_write_users",0,Write Users,Utilisateurs en écriture,0
 field,"calendar.event,categories",0,Categories,Catégories,0
 field,"calendar.event,classification",0,Classification,Classification,0
-field,"calendar.event,classification_public",0,Classification Public,Classification publique,0
 field,"calendar.event,description",0,Description,Description,0
 field,"calendar.event,dtend",0,End Date,Date de fin,0
 field,"calendar.event,dtstart",0,Start Date,Date de début,0
-field,"calendar.event.exdate,calendar_rdate",0,Calendar RDate,Date de récurrence,0
+field,"calendar.event.exdate,calendar_date",0,Calendar Date,Date calendrier,0
 field,"calendar.event.exdate,event",0,Event,Événement,0
 field,"calendar.event.exdate,rec_name",0,Name,Nom,0
 field,"calendar.event,exdates",0,Exception Dates,Dates d'exception,0
@@ -69,6 +71,7 @@ field,"calendar.event,location",0,Location,Emplacement,0
 field,"calendar.event,occurences",0,Occurences,Occurrences,0
 field,"calendar.event,organizer",0,Organizer,Organisateur,0
 field,"calendar.event,parent",0,Parent,Parent,0
+field,"calendar.event.rdate,calendar_date",0,Calendar Date,Date calendrier,0
 field,"calendar.event.rdate,calendar_rdate",0,Calendar RDate,Date de récurrence,0
 field,"calendar.event.rdate,event",0,Event,Événement,0
 field,"calendar.event.rdate,rec_name",0,Name,Nom,0
@@ -89,8 +92,6 @@ field,"calendar.event,vevent",0,vevent,vevent,0
 field,"calendar.location,name",0,Name,Nom,0
 field,"calendar.location,rec_name",0,Name,Nom,0
 field,"calendar.rdate,date",0,Is Date,Est une date,0
-field,"calendar.rdate,datetime",0,Date,Date,0
-field,"calendar.rdate,rec_name",0,Name,Nom,0
 field,"calendar.rrule,byday",0,By Day,Par jour,0
 field,"calendar.rrule,byhour",0,By Hour,Par heure,0
 field,"calendar.rrule,byminute",0,By Minute,Par minute,0
@@ -109,15 +110,16 @@ field,"calendar.rrule,until_date",0,Is Date,Est une date,0
 field,"calendar.rrule,wkst",0,Week Day,Jour de la semaine,0
 field,"res.user,calendars",0,Calendars,Calendriers,0
 help,"calendar.calendar,owner",0,The user must have an email,L'utilisateur doit avoir une adresse mail,0
+help,"calendar.date,date",0,"Ignore time of field ""Date"", but handle as date only.","Ignorer l'heure du champ ""Date"" et considérer uniquement la date",0
 help,"calendar.event,uuid",0,Universally Unique Identifier,Identificateur unique universel,0
-help,"calendar.rdate,date",0,"Ignore time of field ""Date"", but handle as date only.","Ignore l'heure du champ ""Date""",0
-help,"calendar.rrule,until_date",0,"Ignore time of field ""Until Date"", but handle as date only.","Ignore l'heure du champ ""Date de fin""",0
+help,"calendar.rrule,until_date",0,"Ignore time of field ""Until Date"", but handle as date only.","Ignorer l'heure du champ ""Date de fin"" et considérer uniquement la date",0
 model,"calendar.alarm,name",0,Alarm,Alarme,0
 model,"calendar.attendee,name",0,Attendee,Participant,0
 model,"calendar.calendar,name",0,Calendar,Calendrier,0
 model,"calendar.calendar-read-res.user,name",0,Calendar - read - User,Calendrier - Lecture - Utilisateur,0
 model,"calendar.calendar-write-res.user,name",0,Calendar - write - User,Calendrier - Écriture - Utilisateur,0
 model,"calendar.category,name",0,Category,Catégorie,0
+model,"calendar.date,name",0,Calendar Date,Date calendrier,0
 model,"calendar.event.alarm,name",0,Alarm,Alarme,0
 model,"calendar.event.attendee,name",0,Attendee,Participant,0
 model,"calendar.event-calendar.category,name",0,Event - Category,Évenement - Catégorie,0
@@ -127,13 +129,17 @@ model,"calendar.event,name",0,Event,Événement,0
 model,"calendar.event.rdate,name",0,Recurrence Date,Date de récurrence,0
 model,"calendar.event.rrule,name",0,Recurrence Rule,Règle de récurrence,0
 model,"calendar.location,name",0,Location,Emplacement,0
-model,"calendar.rdate,name",0,Recurrence Date,Date de récurrence,0
 model,"calendar.rrule,name",0,Recurrence Rule,Règle de récurrence,0
 model,"ir.action,name",act_calendar_form,Calendars,Calendriers,0
+model,"ir.action,name",act_calendar_form2,Calendars,Calendriers,0
 model,"ir.action,name",act_event_form,Events,Événement,0
+model,"ir.action,name",act_event_form2,Events,Événements,0
+model,"ir.action,name",act_event_form3,Events,Événements,0
 model,"ir.ui.menu,name",menu_calendar,Calendar Management,Gestion de calendrier,0
 model,"ir.ui.menu,name",menu_calendar_form,Calendars,Calendriers,0
 model,"ir.ui.menu,name",menu_event_form,Events,Évenement,0
+model,"ir.ui.menu,name",menu_calendar_form2,New Calendar,Nouveau calendrier,0
+model,"ir.ui.menu,name",menu_event_form2,New Event,Nouvel événement,0
 model,"res.group,name",group_calendar_admin,Calendar Administration,Administration calendrier,0
 selection,"calendar.attendee,status",0,,,0
 selection,"calendar.attendee,status",0,Accepted,Accepté,0
diff --git a/res.py b/res.py
index 66e3a3f..b9221bf 100644
--- a/res.py
+++ b/res.py
@@ -1,6 +1,7 @@
 #This file is part of Tryton.  The COPYRIGHT file at the top level of
 #this repository contains the full copyright notices and license terms.
 from trytond.model import ModelView, ModelSQL, fields
+from trytond.pyson import Bool, Eval, Or
 import copy
 
 
@@ -14,11 +15,13 @@ class User(ModelSQL, ModelView):
         self.email = copy.copy(self.email)
         self.email.states = copy.copy(self.email.states)
         self.email.depends = copy.copy(self.email.depends)
-        if 'required' in self.email.states:
-            self.email.states['required'] = '(' + self.email.states['required'] \
-                    + ') or bool(calendars)'
+        required = Bool(Eval('calendars'))
+        if not self.email.states.get('required'):
+            self.email.states['required'] = required
         else:
-            self.email.states['required'] = 'bool(calendars)'
+            self.email.states['required'] = \
+                    Or(self.email.states['required'],
+                            required)
         if 'calendars' not in self.email.depends:
             self.email.depends.append('calendars')
 
diff --git a/setup.py b/setup.py
index af2225e..461d886 100644
--- a/setup.py
+++ b/setup.py
@@ -2,19 +2,22 @@
 #This file is part of Tryton.  The COPYRIGHT file at the top level of
 #this repository contains the full copyright notices and license terms.
 
-from setuptools import setup, find_packages
+from setuptools import setup
 import re
 
-info = eval(file('__tryton__.py').read())
+info = eval(open('__tryton__.py').read())
+major_version, minor_version, _ = info.get('version', '0.0.1').split('.', 2)
+major_version = int(major_version)
+minor_version = int(minor_version)
 
 requires = ['vobject >= 0.8.0', 'PyWebDAV >= 0.9.3', 'python-dateutil', 'pytz']
 for dep in info.get('depends', []):
     if not re.match(r'(ir|res|workflow|webdav)(\W|$)', dep):
-        requires.append('trytond_' + dep)
-
-major_version, minor_version, _ = info.get('version', '0.0.1').split('.', 2)
-requires.append('trytond >= %s.%s' % (major_version, minor_version))
-requires.append('trytond < %s.%s' % (major_version, int(minor_version) + 1))
+        requires.append('trytond_%s >= %s.%s, < %s.%s' %
+                (dep, major_version, minor_version, major_version,
+                    minor_version + 1))
+requires.append('trytond >= %s.%s, < %s.%s' %
+        (major_version, minor_version, major_version, minor_version + 1))
 
 setup(name='trytond_calendar',
     version=info.get('version', '0.0.1'),
@@ -27,6 +30,7 @@ setup(name='trytond_calendar',
     package_dir={'trytond.modules.calendar': '.'},
     packages=[
         'trytond.modules.calendar',
+        'trytond.modules.calendar.tests',
     ],
     package_data={
         'trytond.modules.calendar': info.get('xml', []) \
@@ -55,4 +59,6 @@ setup(name='trytond_calendar',
     [trytond.modules]
     calendar = trytond.modules.calendar
     """,
+    test_suite='tests',
+    test_loader='trytond.test_loader:Loader',
 )
diff --git a/tests/__init__.py b/tests/__init__.py
index 2680025..8b786f9 100644
--- a/tests/__init__.py
+++ b/tests/__init__.py
@@ -1,4 +1,4 @@
 #This file is part of Tryton.  The COPYRIGHT file at the top level of
 #this repository contains the full copyright notices and license terms.
 
-from test_calendar import *
+from test_calendar import suite
diff --git a/tests/__init__.pyc b/tests/__init__.pyc
new file mode 100644
index 0000000..b370054
Binary files /dev/null and b/tests/__init__.pyc differ
diff --git a/tests/test_calendar.py b/tests/test_calendar.py
index 78e6314..4f42b7c 100644
--- a/tests/test_calendar.py
+++ b/tests/test_calendar.py
@@ -10,7 +10,7 @@ if os.path.isdir(DIR):
 
 import unittest
 import trytond.tests.test_tryton
-from trytond.tests.test_tryton import RPCProxy, CONTEXT, SOCK, test_view
+from trytond.tests.test_tryton import test_view
 
 
 class CalendarTestCase(unittest.TestCase):
@@ -28,11 +28,10 @@ class CalendarTestCase(unittest.TestCase):
         self.assertRaises(Exception, test_view('calendar'))
 
 def suite():
-    return unittest.TestLoader().loadTestsFromTestCase(CalendarTestCase)
+    suite = trytond.tests.test_tryton.suite()
+    suite.addTests(unittest.TestLoader().loadTestsFromTestCase(
+        CalendarTestCase))
+    return suite
 
 if __name__ == '__main__':
-    suiteTrytond = trytond.tests.test_tryton.suite()
-    suiteCalendar = suite()
-    alltests = unittest.TestSuite([suiteTrytond, suiteCalendar])
-    unittest.TextTestRunner(verbosity=2).run(alltests)
-    SOCK.disconnect()
+    unittest.TextTestRunner(verbosity=2).run(suite())
diff --git a/tests/test_calendar.pyc b/tests/test_calendar.pyc
new file mode 100644
index 0000000..07e8ac7
Binary files /dev/null and b/tests/test_calendar.pyc differ
diff --git a/trytond_calendar.egg-info/PKG-INFO b/trytond_calendar.egg-info/PKG-INFO
index fcd595c..d049f34 100644
--- a/trytond_calendar.egg-info/PKG-INFO
+++ b/trytond_calendar.egg-info/PKG-INFO
@@ -1,12 +1,12 @@
 Metadata-Version: 1.0
 Name: trytond-calendar
-Version: 1.4.2
+Version: 1.6.0
 Summary: Add CalDAV support
 Home-page: http://www.tryton.org/
 Author: B2CK
 Author-email: info at b2ck.com
 License: GPL-3
-Download-URL: http://downloads.tryton.org/1.4/
+Download-URL: http://downloads.tryton.org/1.6/
 Description: UNKNOWN
 Platform: UNKNOWN
 Classifier: Development Status :: 5 - Production/Stable
diff --git a/trytond_calendar.egg-info/SOURCES.txt b/trytond_calendar.egg-info/SOURCES.txt
index bafc0ca..86154dc 100644
--- a/trytond_calendar.egg-info/SOURCES.txt
+++ b/trytond_calendar.egg-info/SOURCES.txt
@@ -16,8 +16,12 @@ setup.py
 ./calendar.py
 ./res.py
 ./webdav.py
+./tests/__init__.py
+./tests/test_calendar.py
 tests/__init__.py
+tests/__init__.pyc
 tests/test_calendar.py
+tests/test_calendar.pyc
 trytond_calendar.egg-info/PKG-INFO
 trytond_calendar.egg-info/SOURCES.txt
 trytond_calendar.egg-info/dependency_links.txt
diff --git a/trytond_calendar.egg-info/requires.txt b/trytond_calendar.egg-info/requires.txt
index 43123aa..44242eb 100644
--- a/trytond_calendar.egg-info/requires.txt
+++ b/trytond_calendar.egg-info/requires.txt
@@ -2,5 +2,4 @@ vobject >= 0.8.0
 PyWebDAV >= 0.9.3
 python-dateutil
 pytz
-trytond >= 1.4
-trytond < 1.5
\ No newline at end of file
+trytond >= 1.6, < 1.7
\ No newline at end of file
diff --git a/webdav.py b/webdav.py
index 52870ba..3f14d1a 100644
--- a/webdav.py
+++ b/webdav.py
@@ -36,6 +36,7 @@ class Collection(ModelSQL, ModelView):
             return calendar_obj.get_name(cursor, user, calendar, context=context)
         return False
 
+    @Cache('webdav_collection.event')
     def event(self, cursor, user, uri, calendar_id=False, context=None):
         '''
         Return the event id in the uri or False
@@ -65,8 +66,6 @@ class Collection(ModelSQL, ModelView):
                 return event_ids[0]
         return False
 
-    event = Cache('webdav_collection.event')(event)
-
     def _caldav_filter_domain_calendar(self, cursor, user, filter, context=None):
         '''
         Return a domain for caldav filter on calendar
@@ -212,6 +211,21 @@ class Collection(ModelSQL, ModelView):
         return super(Collection, self).get_resourcetype(cursor, user, uri,
                 context=context, cache=cache)
 
+    def get_displayname(self, cursor, user, uri, context=None, cache=None):
+        calendar_obj = self.pool.get('calendar.calendar')
+        if uri in ('Calendars', 'Calendars/'):
+            return 'Calendars'
+        calendar_id = self.calendar(cursor, user, uri, context=context)
+        if calendar_id:
+            if not (uri[10:].split('/', 1) + [None])[1]:
+                return calendar_obj.browse(cursor, user, calendar_id,
+                        context=context).rec_name
+            return uri.split('/')[-1]
+        elif self.calendar(cursor, user, uri, ics=True, context=context):
+            return uri.split('/')[-1]
+        return super(Collection, self).get_displayname(cursor, user, uri,
+                context=context, cache=cache)
+
     def get_contenttype(self, cursor, user, uri, context=None, cache=None):
         if self.event(cursor, user, uri, context=context) \
                 or self.calendar(cursor, user, uri, ics=True, context=context):
@@ -604,4 +618,38 @@ class Collection(ModelSQL, ModelView):
         return super(Collection, self).exists(cursor, user, uri, context=context,
                 cache=cache)
 
+    def current_user_privilege_set(self, cursor, user, uri, context=None,
+            cache=None):
+        '''
+        Return the privileges of the current user for uri
+        Privileges ares: create, read, write, delete
+
+        :param cursor: the database cursor
+        :param user: the user id
+        :param uri: the uri
+        :param context: the context
+        :param cache: the cache
+        :return: a list of privileges
+        '''
+        calendar_obj = self.pool.get('calendar.calendar')
+
+        if uri in ('Calendars', 'Calendars/'):
+            return ['create', 'read', 'write', 'delete']
+        if uri and uri.startswith('Calendars/'):
+            calendar_id = self.calendar(cursor, user, uri, context=context)
+            if calendar_id:
+                calendar = calendar_obj.browse(cursor, user, calendar_id,
+                        context=context)
+                if user == calendar.owner.id:
+                    return ['create', 'read', 'write', 'delete']
+                res = []
+                if user in (x.id for x in calendar.read_users):
+                    res.append('read')
+                if user in (x.id for x in calendar.write_users):
+                    res.extend(['read', 'write', 'delete'])
+                return res
+            return []
+        return super(Collection, self).current_user_privilege_set(cursor, user,
+                uri, context=context, cache=cache)
+
 Collection()
commit 7acb61aa8fb7054d3dc8e9575a219eed205701ac
Author: Daniel Baumann <daniel at debian.org>
Date:   Sat Feb 20 10:13:28 2010 +0100

    Adding upstream version 1.4.2.

diff --git a/CHANGELOG b/CHANGELOG
index f0a3015..035fbe7 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,3 +1,6 @@
+Version 1.4.2 - 2010-02-16
+* Some bug fixes (see mercurial logs for details)
+
 Version 1.4.1 - 2009-11-23
 * Some bug fixes (see mercurial logs for details)
 
diff --git a/COPYRIGHT b/COPYRIGHT
index 3a474ed..6e6811c 100644
--- a/COPYRIGHT
+++ b/COPYRIGHT
@@ -1,6 +1,6 @@
-Copyright (C) 2009 Cédric Krier.
-Copyright (C) 2009 Bertrand Chenal.
-Copyright (C) 2009 B2CK SPRL.
+Copyright (C) 2009-2010 Cédric Krier.
+Copyright (C) 2009-2010 Bertrand Chenal.
+Copyright (C) 2009-2010 B2CK SPRL.
 
 This program is free software: you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
diff --git a/PKG-INFO b/PKG-INFO
index bd52731..f37d9ae 100644
--- a/PKG-INFO
+++ b/PKG-INFO
@@ -1,6 +1,6 @@
 Metadata-Version: 1.0
 Name: trytond_calendar
-Version: 1.4.1
+Version: 1.4.2
 Summary: Add CalDAV support
 Home-page: http://www.tryton.org/
 Author: B2CK
diff --git a/__tryton__.py b/__tryton__.py
index 18974ca..4830f9f 100644
--- a/__tryton__.py
+++ b/__tryton__.py
@@ -7,7 +7,7 @@
     'name_es_CO' : 'Calendario',
     'name_es_ES' : 'Calendario',
     'name_fr_FR' : 'Calendrier',
-    'version' : '1.4.1',
+    'version' : '1.4.2',
     'author' : 'B2CK',
     'email': 'info at b2ck.com',
     'website': 'http://www.tryton.org/',
diff --git a/calendar.py b/calendar.py
index e59e000..20c61f4 100644
--- a/calendar.py
+++ b/calendar.py
@@ -492,7 +492,8 @@ class Event(ModelSQL, ModelView):
                 "('calendar', '=', calendar)"],
             ondelete='CASCADE', depends=['uuid', 'calendar'])
     recurrence = fields.DateTime('Recurrence', select=1, states={
-                'invisible': "not bool(parent)",
+                'invisible': "not bool(globals().get('_parent_parent'))",
+                'required': "bool(globals().get('_parent_parent'))",
                 }, depends=['parent'])
     calendar_owner = fields.Function('get_calendar_field',
             type='many2one', relation='res.user', string='Owner',
@@ -890,7 +891,8 @@ class Event(ModelSQL, ModelView):
         if hasattr(vevent, 'recurrence-id'):
             if not isinstance(vevent.recurrence_id.value, datetime.datetime):
                 res['recurrence'] = datetime.datetime.combine(
-                        vevent.recurrence_id.value, datetime.time())
+                        vevent.recurrence_id.value, datetime.time()
+                        ).replace(tzinfo=tzlocal)
             else:
                 if vevent.recurrence_id.value.tzinfo:
                     res['recurrence'] = \
@@ -1047,14 +1049,14 @@ class Event(ModelSQL, ModelView):
             occurences_todel = [x.id for x in event.occurences]
         for vevent in vevents:
             event_id = None
+            vals = self.ical2values(cursor, user, event_id, ical,
+                    calendar_id, vevent=vevent, context=context)
             if event:
                 for occurence in event.occurences:
-                    if occurence.recurrence.replace(tzinfo=tzlocal) \
-                            == vevent.recurrence_id.value:
+                    if vals['recurrence'] == \
+                            occurence.recurrence.replace(tzinfo=tzlocal):
                         event_id = occurence.id
                         occurences_todel.remove(occurence.id)
-            vals = self.ical2values(cursor, user, event_id, ical,
-                    calendar_id, vevent=vevent, context=context)
             if event:
                 vals['uuid'] = event.uuid
             else:
@@ -1066,7 +1068,7 @@ class Event(ModelSQL, ModelView):
                 res['occurences'].append(('create', vals))
         if occurences_todel:
             res.setdefault('occurences', [])
-            res['occurences'].append(('delete', occurences_todel))
+            res['occurences'].insert(0, ('delete', occurences_todel))
         return res
 
     def event2ical(self, cursor, user, event, context=None):
@@ -1146,7 +1148,7 @@ class Event(ModelSQL, ModelView):
         if not hasattr(vevent, 'last-modified'):
             vevent.add('last-modified')
         vevent.last_modified.value = date.replace(tzinfo=tzlocal)
-        if event.recurrence:
+        if event.recurrence and event.parent:
             if not hasattr(vevent, 'recurrence-id'):
                 vevent.add('recurrence-id')
             if event.all_day:
@@ -1154,6 +1156,8 @@ class Event(ModelSQL, ModelView):
             else:
                 vevent.recurrence_id.value = event.recurrence\
                         .replace(tzinfo=tzlocal).astimezone(tzevent)
+        elif hasattr(vevent, 'recurrence-id'):
+            del vevent.recurrence_id
         if event.status:
             if not hasattr(vevent, 'status'):
                 vevent.add('status')
@@ -1185,6 +1189,10 @@ class Event(ModelSQL, ModelView):
         elif hasattr(vevent, 'location'):
             del vevent.location
 
+        if not hasattr(vevent, 'transp'):
+            vevent.add('transp')
+        vevent.transp.value = event.transp.upper()
+
         if event.organizer:
             if not hasattr(vevent, 'organizer'):
                 vevent.add('organizer')
diff --git a/calendar.xml b/calendar.xml
index 589c48e..8a0b020 100644
--- a/calendar.xml
+++ b/calendar.xml
@@ -227,7 +227,7 @@ this repository contains the full copyright notices and license terms. -->
                             <field name="attendees" colspan="4"/>
                         </page>
                         <page string="Occurences" id="occurences"
-                            states="{'invisible': '''bool(parent)'''}">
+                            states="{'invisible': '''bool(globals().get('_parent_parent'))'''}">
                             <field name="rrules" colspan="2"/>
                             <field name="rdates" colspan="2"/>
                             <field name="exrules" colspan="2"/>
diff --git a/trytond_calendar.egg-info/PKG-INFO b/trytond_calendar.egg-info/PKG-INFO
index 4466f2b..fcd595c 100644
--- a/trytond_calendar.egg-info/PKG-INFO
+++ b/trytond_calendar.egg-info/PKG-INFO
@@ -1,6 +1,6 @@
 Metadata-Version: 1.0
 Name: trytond-calendar
-Version: 1.4.1
+Version: 1.4.2
 Summary: Add CalDAV support
 Home-page: http://www.tryton.org/
 Author: B2CK
commit b7a1d427257e0c249ef19d7f5ef5fa0264251e5c
Author: Daniel Baumann <daniel at debian.org>
Date:   Wed Nov 25 12:58:42 2009 +0100

    Adding upstream version 1.4.1.

diff --git a/CHANGELOG b/CHANGELOG
index 931601e..f0a3015 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,2 +1,5 @@
+Version 1.4.1 - 2009-11-23
+* Some bug fixes (see mercurial logs for details)
+
 Version 1.4.0 - 2009-10-19
 * Initial release
diff --git a/INSTALL b/INSTALL
index 5e40877..9a3da7b 100644
--- a/INSTALL
+++ b/INSTALL
@@ -6,8 +6,8 @@ Prerequisites
 
  * Python 2.5 or later (http://www.python.org/)
  * trytond (http://www.tryton.org/)
- * vobject (http://vobject.skyhouseconsulting.com/)
- * pywebdav (http://sourceforge.net/projects/pywebdav/)
+ * vobject >= 0.8.0 (http://vobject.skyhouseconsulting.com/)
+ * pywebdav >= 0.9.3 (http://sourceforge.net/projects/pywebdav/)
  * python-dateutil (http://labix.org/python-dateutil)
  * pytz (http://pytz.sourceforge.net/)
 
diff --git a/PKG-INFO b/PKG-INFO
index d4b55fa..bd52731 100644
--- a/PKG-INFO
+++ b/PKG-INFO
@@ -1,6 +1,6 @@
 Metadata-Version: 1.0
 Name: trytond_calendar
-Version: 1.4.0
+Version: 1.4.1
 Summary: Add CalDAV support
 Home-page: http://www.tryton.org/
 Author: B2CK
diff --git a/__tryton__.py b/__tryton__.py
index 5c2f618..18974ca 100644
--- a/__tryton__.py
+++ b/__tryton__.py
@@ -7,7 +7,7 @@
     'name_es_CO' : 'Calendario',
     'name_es_ES' : 'Calendario',
     'name_fr_FR' : 'Calendrier',
-    'version' : '1.4.0',
+    'version' : '1.4.1',
     'author' : 'B2CK',
     'email': 'info at b2ck.com',
     'website': 'http://www.tryton.org/',
diff --git a/caldav.py b/caldav.py
index 560e13b..ed10a27 100644
--- a/caldav.py
+++ b/caldav.py
@@ -40,26 +40,32 @@ def mk_prop_response(self, uri, good_props, bad_props, doc):
     if  parent_uri in ('Calendars', 'Calendars/'):
         ad = doc.createElement('calendar')
         ad.setAttribute('xmlns', 'urn:ietf:params:xml:ns:caldav')
-        vc = doc.createElement('vevent-collection')
-        vc.setAttribute('xmlns', 'http://groupdav.org/')
+        #Disable groupdav attribute for iPhone
+        #vc = doc.createElement('vevent-collection')
+        #vc.setAttribute('xmlns', 'http://groupdav.org/')
         cols = res.getElementsByTagName('D:collection')
         if cols:
             cols[0].parentNode.appendChild(ad)
-            cols[0].parentNode.appendChild(vc)
+            #cols[0].parentNode.appendChild(vc)
     return res
 
 propfind.PROPFIND.mk_prop_response = mk_prop_response
 
 def _get_caldav_calendar_description(self, uri):
     dbname, dburi = self._get_dburi(uri)
+    if not dbname:
+        raise DAV_NotFound
     cursor = DATABASE['cursor']
     pool = Pool(DATABASE['dbname'])
-    collection_obj = pool.get('webdav.collection')
+    try:
+        collection_obj = pool.get('webdav.collection')
+    except KeyError:
+        raise DAV_NotFound
     try:
         res = collection_obj.get_calendar_description(cursor, int(USER_ID), dburi,
                 cache=CACHE)
     except AttributeError:
-        return ''
+        raise DAV_NotFound
     except (DAV_Error, DAV_NotFound, DAV_Secret, DAV_Forbidden), exception:
         self._log_exception(exception)
         raise
@@ -72,12 +78,19 @@ TrytonDAVInterface._get_caldav_calendar_description = _get_caldav_calendar_descr
 
 def _get_caldav_calendar_data(self, uri):
     dbname, dburi = self._get_dburi(uri)
+    if not dbname:
+        raise DAV_NotFound
     cursor = DATABASE['cursor']
     pool = Pool(DATABASE['dbname'])
-    collection_obj = pool.get('webdav.collection')
+    try:
+        collection_obj = pool.get('webdav.collection')
+    except KeyError:
+        raise DAV_NotFound
     try:
         res = collection_obj.get_calendar_data(cursor, int(USER_ID), dburi,
                 cache=CACHE)
+    except AttributeError:
+        raise DAV_NotFound
     except (DAV_Error, DAV_NotFound, DAV_Secret, DAV_Forbidden), exception:
         self._log_exception(exception)
         raise
@@ -90,12 +103,19 @@ TrytonDAVInterface._get_caldav_calendar_data = _get_caldav_calendar_data
 
 def _get_caldav_calendar_home_set(self, uri):
     dbname, dburi = self._get_dburi(uri)
+    if not dbname:
+        raise DAV_NotFound
     cursor = DATABASE['cursor']
     pool = Pool(DATABASE['dbname'])
-    collection_obj = pool.get('webdav.collection')
+    try:
+        collection_obj = pool.get('webdav.collection')
+    except KeyError:
+        raise DAV_NotFound
     try:
         res = collection_obj.get_calendar_home_set(cursor, int(USER_ID), dburi,
                 cache=CACHE)
+    except AttributeError:
+        raise DAV_NotFound
     except (DAV_Error, DAV_NotFound, DAV_Secret, DAV_Forbidden), exception:
         self._log_exception(exception)
         raise
@@ -107,7 +127,9 @@ def _get_caldav_calendar_home_set(self, uri):
     doc = domimpl.createDocument(None, 'href', None)
     href = doc.documentElement
     href.tagName = 'D:href'
-    huri = doc.createTextNode(urlparse.urlunsplit(uparts))
+    #iPhone doesn't handle "http" in href
+    #huri = doc.createTextNode(urlparse.urlunsplit(uparts))
+    huri = doc.createTextNode(urllib.quote('/' + dbname + res))
     href.appendChild(huri)
     return href
 
@@ -115,12 +137,19 @@ TrytonDAVInterface._get_caldav_calendar_home_set = _get_caldav_calendar_home_set
 
 def _get_caldav_calendar_user_address_set(self, uri):
     dbname, dburi = self._get_dburi(uri)
+    if not dbname:
+        raise DAV_NotFound
     cursor = DATABASE['cursor']
     pool = Pool(DATABASE['dbname'])
-    collection_obj = pool.get('webdav.collection')
+    try:
+        collection_obj = pool.get('webdav.collection')
+    except KeyError:
+        raise DAV_NotFound
     try:
         res = collection_obj.get_calendar_user_address_set(cursor,
                 int(USER_ID), dburi, cache=CACHE)
+    except AttributeError:
+        raise DAV_NotFound
     except (DAV_Error, DAV_NotFound, DAV_Secret, DAV_Forbidden), exception:
         self._log_exception(exception)
         raise
@@ -138,12 +167,19 @@ TrytonDAVInterface._get_caldav_calendar_user_address_set = _get_caldav_calendar_
 
 def _get_caldav_schedule_inbox_URL(self, uri):
     dbname, dburi = self._get_dburi(uri)
+    if not dbname:
+        raise DAV_NotFound
     cursor = DATABASE['cursor']
     pool = Pool(DATABASE['dbname'])
-    collection_obj = pool.get('webdav.collection')
+    try:
+        collection_obj = pool.get('webdav.collection')
+    except KeyError:
+        raise DAV_NotFound
     try:
         res = collection_obj.get_schedule_inbox_URL(cursor, int(USER_ID), dburi,
                 cache=CACHE)
+    except AttributeError:
+        raise DAV_NotFound
     except (DAV_Error, DAV_NotFound, DAV_Secret, DAV_Forbidden), exception:
         self._log_exception(exception)
         raise
@@ -163,12 +199,19 @@ TrytonDAVInterface._get_caldav_schedule_inbox_URL = _get_caldav_schedule_inbox_U
 
 def _get_caldav_schedule_outbox_URL(self, uri):
     dbname, dburi = self._get_dburi(uri)
+    if not dbname:
+        raise DAV_NotFound
     cursor = DATABASE['cursor']
     pool = Pool(DATABASE['dbname'])
-    collection_obj = pool.get('webdav.collection')
+    try:
+        collection_obj = pool.get('webdav.collection')
+    except KeyError:
+        raise DAV_NotFound
     try:
         res = collection_obj.get_schedule_outbox_URL(cursor, int(USER_ID), dburi,
                 cache=CACHE)
+    except AttributeError:
+        raise DAV_NotFound
     except (DAV_Error, DAV_NotFound, DAV_Secret, DAV_Forbidden), exception:
         self._log_exception(exception)
         raise
@@ -201,17 +244,23 @@ def _get_dav_principal_collection_set(self, uri):
         huri = doc.createTextNode(urlparse.urlunsplit(uparts))
         href.appendChild(huri)
         return href
-    return _prev_get_dav_principal_collection_set(self, uri)
+    if _prev_get_dav_principal_collection_set:
+        return _prev_get_dav_principal_collection_set(self, uri)
+    raise DAV_NotFound
 
 TrytonDAVInterface._get_dav_principal_collection_set = _get_dav_principal_collection_set
 
 def _get_caldav_post(self, uri, body, contenttype=''):
     dbname, dburi = self._get_dburi(uri)
+    if not dbname:
+        raise DAV_Forbidden
     cursor = DATABASE['cursor']
     pool = Pool(DATABASE['dbname'])
     calendar_obj = pool.get('calendar.calendar')
     try:
         res = calendar_obj.post(cursor, int(USER_ID), dburi, body)
+    except AttributeError:
+        raise DAV_NotFound
     except (DAV_Error, DAV_NotFound, DAV_Secret, DAV_Forbidden), exception:
         self._log_exception(exception)
         raise
diff --git a/calendar.py b/calendar.py
index b4b426e..e59e000 100644
--- a/calendar.py
+++ b/calendar.py
@@ -207,6 +207,7 @@ class Calendar(ModelSQL, ModelView):
 
         event_ids = event_obj.search(cursor, 0, [
             ('parent', '=', False),
+            ('dtstart', '<=', dtend),
             ['OR',
                 ('rdates', '!=', False),
                 ('rrules', '!=', False),
@@ -225,6 +226,8 @@ class Calendar(ModelSQL, ModelView):
                     between_dtstart = dtstart.replace(tzinfo=None)
                     between_dtend = dtend.replace(tzinfo=None)
                 for freebusy_dtstart in event_ical.vevent.rruleset:
+                    if freebusy_dtstart.replace(tzinfo=tzlocal) > dtend:
+                        break
                     if not event.dtend:
                         freebusy_dtend = freebusy_dtstart
                     else:
@@ -243,7 +246,8 @@ class Calendar(ModelSQL, ModelView):
                     all_day = event.all_day
                     for occurence in event.occurences:
                         if occurence.recurrence.replace(tzinfo=tzlocal) == \
-                                freebusy_dtstart:
+                                freebusy_dtstart.replace(tzinfo=tzlocal):
+                            freebusy_dtstart = occurence.dtstart.replace(tzinfo=tzlocal)
                             if occurence.dtend:
                                 freebusy_dtend = occurence.dtend\
                                         .replace(tzinfo=tzlocal)
@@ -879,8 +883,8 @@ class Event(ModelSQL, ModelView):
                     res['dtend'] = vevent.dtend.value.astimezone(tzlocal)
                 else:
                     res['dtend'] = vevent.dtend.value
-        elif hasattr(vevent, 'duration') and res['dtstart']:
-            res['dtend'] = dtstart + vevent.duration
+        elif hasattr(vevent, 'duration') and hasattr(vevent, 'dtstart'):
+            res['dtend'] = vevent.dtstart.value + vevent.duration.value
         else:
             res['dtend'] = False
         if hasattr(vevent, 'recurrence-id'):
@@ -1570,6 +1574,27 @@ class EventAttendee(ModelSQL, ModelView):
                     context=context)
         return res
 
+    def copy(self, cursor, user, ids, default=None, context=None):
+        attendee_obj = self.pool.get('calendar.attendee')
+
+        int_id = False
+        if isinstance(ids, (int, long)):
+            int_id = True
+            ids = [ids]
+        if default is None:
+            default = {}
+        default = default.copy()
+        new_ids = []
+        for attendee in self.browse(cursor, user, ids, context=context):
+            default['calendar_attendee'] = attendee_obj.copy(cursor, user,
+                    attendee.calendar_attendee.id, context=context)
+            new_id = super(EventAttendee, self).copy(cursor, user, attendee.id,
+                    default=default, context=context)
+            new_ids.append(new_id)
+        if int_id:
+            return new_ids[0]
+        return new_ids
+
     def _attendee2update(self, cursor, user, attendee, context=None):
         attendee_obj = self.pool.get('calendar.attendee')
         return attendee_obj._attendee2update(cursor, user, attendee,
@@ -1974,7 +1999,7 @@ class RRule(ModelSQL, ModelView):
                 res += vobject.icalendar.dateToString(rule.until.date())
             else:
                 res += vobject.icalendar.dateTimeToString(rule.until\
-                        .replace(tzinfo=tzlocal).astimezone(utc),
+                        .replace(tzinfo=tzlocal).astimezone(tzutc),
                         convertToUTC=True)
         elif rule.count:
             res += ';COUNT=' + str(rule.count)
diff --git a/setup.py b/setup.py
index acce95a..af2225e 100644
--- a/setup.py
+++ b/setup.py
@@ -7,7 +7,7 @@ import re
 
 info = eval(file('__tryton__.py').read())
 
-requires = ['vobject', 'PyWebDAV', 'python-dateutil', 'pytz']
+requires = ['vobject >= 0.8.0', 'PyWebDAV >= 0.9.3', 'python-dateutil', 'pytz']
 for dep in info.get('depends', []):
     if not re.match(r'(ir|res|workflow|webdav)(\W|$)', dep):
         requires.append('trytond_' + dep)
diff --git a/trytond_calendar.egg-info/PKG-INFO b/trytond_calendar.egg-info/PKG-INFO
index d54b60d..4466f2b 100644
--- a/trytond_calendar.egg-info/PKG-INFO
+++ b/trytond_calendar.egg-info/PKG-INFO
@@ -1,6 +1,6 @@
 Metadata-Version: 1.0
 Name: trytond-calendar
-Version: 1.4.0
+Version: 1.4.1
 Summary: Add CalDAV support
 Home-page: http://www.tryton.org/
 Author: B2CK
diff --git a/trytond_calendar.egg-info/requires.txt b/trytond_calendar.egg-info/requires.txt
index 2160975..43123aa 100644
--- a/trytond_calendar.egg-info/requires.txt
+++ b/trytond_calendar.egg-info/requires.txt
@@ -1,5 +1,5 @@
-vobject
-PyWebDAV
+vobject >= 0.8.0
+PyWebDAV >= 0.9.3
 python-dateutil
 pytz
 trytond >= 1.4
diff --git a/webdav.py b/webdav.py
index 66a3966..52870ba 100644
--- a/webdav.py
+++ b/webdav.py
@@ -158,6 +158,8 @@ class Collection(ModelSQL, ModelView):
         if uri in ('Calendars', 'Calendars/'):
             domain = self._caldav_filter_domain_calendar(cursor, user,
                     filter, context=context)
+            domain = [['OR', ('owner', '=', user), ('read_users', '=', user)],
+                    domain]
             calendar_ids = calendar_obj.search(cursor, user, domain,
                     context=context)
             calendars = calendar_obj.browse(cursor, user, calendar_ids,
@@ -204,9 +206,7 @@ class Collection(ModelSQL, ModelView):
         if calendar_id:
             if not (uri[10:].split('/', 1) + [None])[1]:
                 return COLLECTION
-            if self.event(cursor, user, uri, calendar_id=calendar_id,
-                    context=context):
-                return OBJECT
+            return OBJECT
         elif self.calendar(cursor, user, uri, ics=True, context=context):
             return OBJECT
         return super(Collection, self).get_resourcetype(cursor, user, uri,
@@ -449,8 +449,10 @@ class Collection(ModelSQL, ModelView):
                         ids.append(calendar_id)
                     elif 'calendar_description' in cache['_calendar']\
                             [calendar_obj._name][calendar_id]:
-                        return cache['_calendar'][calendar_obj._name]\
+                        res = cache['_calendar'][calendar_obj._name]\
                                 [calendar_id]['calendar_description']
+                        if res is not None:
+                            return res
                 else:
                     ids = [calendar_id]
                 res = None
@@ -492,7 +494,8 @@ class Collection(ModelSQL, ModelView):
             ('owner', '=', user),
             ], limit=1, context=context)
         if not calendar_ids:
-            raise DAV_NotFound
+            # Sunbird failed with no value
+            return '/Calendars'
         calendar = calendar_obj.browse(cursor, user, calendar_ids[0],
                 context=context)
         return '/Calendars/' + calendar.name
@@ -567,19 +570,20 @@ class Collection(ModelSQL, ModelView):
         calendar_id = self.calendar(cursor, user, uri, context=context)
         if calendar_id:
             if not (uri[10:].split('/', 1) + [None])[1]:
-                raise DAV_Forbidden
+                return 403
             event_id = self.event(cursor, user, uri, calendar_id=calendar_id,
                     context=context)
             if event_id:
                 try:
                     event_obj.delete(cursor, user, event_id, context=context)
                 except:
-                    raise DAV_Forbidden
+                    return 403
                 return 200
+            return 404
         calendar_ics_id = self.calendar(cursor, user, uri, ics=True,
                 context=context)
         if calendar_ics_id:
-            raise DAV_Forbidden
+            return 403
         return super(Collection, self).rm(cursor, user, uri, context=context,
                 cache=cache)
 
commit 93eb1fc962121c325cbfb90898f7d770e922347c
Author: Daniel Baumann <daniel at debian.org>
Date:   Mon Oct 19 22:54:43 2009 +0200

    Adding upstream version 1.4.0.

diff --git a/CHANGELOG b/CHANGELOG
new file mode 100644
index 0000000..931601e
--- /dev/null
+++ b/CHANGELOG
@@ -0,0 +1,2 @@
+Version 1.4.0 - 2009-10-19
+* Initial release
diff --git a/COPYRIGHT b/COPYRIGHT
new file mode 100644
index 0000000..3a474ed
--- /dev/null
+++ b/COPYRIGHT
@@ -0,0 +1,16 @@
+Copyright (C) 2009 Cédric Krier.
+Copyright (C) 2009 Bertrand Chenal.
+Copyright (C) 2009 B2CK SPRL.
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.
diff --git a/INSTALL b/INSTALL
new file mode 100644
index 0000000..5e40877
--- /dev/null
+++ b/INSTALL
@@ -0,0 +1,33 @@
+Installing trytond_calendar
+=================================
+
+Prerequisites
+-------------
+
+ * Python 2.5 or later (http://www.python.org/)
+ * trytond (http://www.tryton.org/)
+ * vobject (http://vobject.skyhouseconsulting.com/)
+ * pywebdav (http://sourceforge.net/projects/pywebdav/)
+ * python-dateutil (http://labix.org/python-dateutil)
+ * pytz (http://pytz.sourceforge.net/)
+
+Installation
+------------
+
+Once you've downloaded and unpacked the trytond_calendar source
+release, enter the directory where the archive was unpacked, and run:
+
+    python setup.py install
+
+Note that you may need administrator/root privileges for this step, as
+this command will by default attempt to install module to the Python
+site-packages directory on your system.
+
+For advanced options, please refer to the easy_install and/or the distutils
+documentation:
+
+  http://peak.telecommunity.com/DevCenter/EasyInstall
+  http://docs.python.org/inst/inst.html
+
+To use without installation, extract the archive into ``trytond/modules`` with
+the directory name calendar.
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..94a9ed0
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,674 @@
+                    GNU GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.
+
+  Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+  For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+  Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+  Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Use with the GNU Affero General Public License.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+    <program>  Copyright (C) <year>  <name of author>
+    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+  The GNU General Public License does not permit incorporating your program
+into proprietary programs.  If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.  But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
diff --git a/MANIFEST.in b/MANIFEST.in
new file mode 100644
index 0000000..c61b52d
--- /dev/null
+++ b/MANIFEST.in
@@ -0,0 +1,10 @@
+include INSTALL
+include README
+include TODO
+include COPYRIGHT
+include CHANGELOG
+include LICENSE
+include *.xml
+include *.odt
+include *.csv
+include tests/*
diff --git a/PKG-INFO b/PKG-INFO
new file mode 100644
index 0000000..d4b55fa
--- /dev/null
+++ b/PKG-INFO
@@ -0,0 +1,25 @@
+Metadata-Version: 1.0
+Name: trytond_calendar
+Version: 1.4.0
+Summary: Add CalDAV support
+Home-page: http://www.tryton.org/
+Author: B2CK
+Author-email: info at b2ck.com
+License: GPL-3
+Download-URL: http://downloads.tryton.org/1.4/
+Description: UNKNOWN
+Platform: UNKNOWN
+Classifier: Development Status :: 5 - Production/Stable
+Classifier: Environment :: Plugins
+Classifier: Intended Audience :: Developers
+Classifier: Intended Audience :: Financial and Insurance Industry
+Classifier: Intended Audience :: Legal Industry
+Classifier: Intended Audience :: Manufacturing
+Classifier: License :: OSI Approved :: GNU General Public License (GPL)
+Classifier: Natural Language :: English
+Classifier: Natural Language :: French
+Classifier: Natural Language :: German
+Classifier: Natural Language :: Spanish
+Classifier: Operating System :: OS Independent
+Classifier: Programming Language :: Python
+Classifier: Topic :: Office/Business
diff --git a/README b/README
new file mode 100644
index 0000000..fdb062c
--- /dev/null
+++ b/README
@@ -0,0 +1,36 @@
+trytond_calendar
+======================
+
+The calendar module of the Tryton application platform.  See
+__tryton__.py
+
+Installing
+----------
+
+See INSTALL
+
+Support
+-------
+
+If you encounter any problems with Tryton, please don't hesitate to ask
+questions on the Tryton bug tracker, mailing list, wiki or IRC channel:
+
+  http://bugs.tryton.org/
+  http://groups.tryton.org/
+  http://wiki.tryton.org/
+  irc://irc.freenode.net/tryton
+
+License
+-------
+
+See LICENSE
+
+Copyright
+---------
+
+See COPYRIGHT
+
+
+For more information please visit the Tryton web site:
+
+  http://www.tryton.org/
diff --git a/__init__.py b/__init__.py
new file mode 100644
index 0000000..a09702d
--- /dev/null
+++ b/__init__.py
@@ -0,0 +1,7 @@
+#This file is part of Tryton.  The COPYRIGHT file at the top level of
+#this repository contains the full copyright notices and license terms.
+
+import caldav
+from webdav import *
+from calendar import *
+from res import *
diff --git a/__tryton__.py b/__tryton__.py
new file mode 100644
index 0000000..5c2f618
--- /dev/null
+++ b/__tryton__.py
@@ -0,0 +1,33 @@
+# -*- coding: utf-8 -*-
+#This file is part of Tryton.  The COPYRIGHT file at the top level of
+#this repository contains the full copyright notices and license terms.
+{
+    'name' : 'Calendar',
+    'name_de_DE' : 'Kalender',
+    'name_es_CO' : 'Calendario',
+    'name_es_ES' : 'Calendario',
+    'name_fr_FR' : 'Calendrier',
+    'version' : '1.4.0',
+    'author' : 'B2CK',
+    'email': 'info at b2ck.com',
+    'website': 'http://www.tryton.org/',
+    'description': 'Add CalDAV support',
+    'description_de_DE' : 'Fügt Unterstützung für CalDAV hinzu',
+    'description_es_CO' : 'Añade soporte para CalDAV',
+    'description_es_ES' : 'Añade soporte para CalDAV',
+    'description_fr_FR': 'Ajoute le support CalDAV',
+    'depends' : [
+        'ir',
+        'res',
+        'webdav',
+    ],
+    'xml' : [
+        'calendar.xml',
+    ],
+    'translation': [
+        'de_DE.csv',
+        'es_CO.csv',
+        'es_ES.csv',
+        'fr_FR.csv',
+    ],
+}
diff --git a/caldav.py b/caldav.py
new file mode 100644
index 0000000..560e13b
--- /dev/null
+++ b/caldav.py
@@ -0,0 +1,254 @@
+#This file is part of Tryton.  The COPYRIGHT file at the top level of
+#this repository contains the full copyright notices and license terms.
+_TRYTON_RELOAD = False
+
+from DAV import propfind
+from DAV.errors import *
+from DAV.utils import get_uriparentpath
+from DAV.constants import DAV_VERSION_1, DAV_VERSION_2
+from trytond.protocols.webdav import TrytonDAVInterface, USER_ID, CACHE, \
+        DATABASE, WebDAVAuthRequestHandler
+from trytond.pool import Pool
+import urlparse
+import urllib
+from string import atoi
+import xml.dom.minidom
+domimpl = xml.dom.minidom.getDOMImplementation()
+
+TrytonDAVInterface.PROPS['urn:ietf:params:xml:ns:caldav'] = (
+        'calendar-description',
+        'calendar-data',
+        'calendar-home-set',
+        'calendar-user-address-set',
+        'schedule-inbox-URL',
+        'schedule-outbox-URL',
+    )
+TrytonDAVInterface.PROPS['DAV:'] = tuple(list(TrytonDAVInterface.PROPS['DAV:']) \
+        + ['principal-collection-set'])
+TrytonDAVInterface.M_NS['urn:ietf:params:xml:ns:caldav'] = '_get_caldav'
+DAV_VERSION_1['version'] += ',calendar-access,calendar-schedule'#,calendar-auto-schedule'
+DAV_VERSION_2['version'] += ',calendar-access,calendar-schedule'#,calendar-auto-schedule'
+
+_mk_prop_response = propfind.PROPFIND.mk_prop_response
+
+def mk_prop_response(self, uri, good_props, bad_props, doc):
+    res = _mk_prop_response(self, uri, good_props, bad_props, doc)
+    parent_uri = get_uriparentpath(uri and uri.strip('/') or '')
+    if not parent_uri:
+        return res
+    dbname, parent_uri = TrytonDAVInterface.get_dburi(parent_uri)
+    if  parent_uri in ('Calendars', 'Calendars/'):
+        ad = doc.createElement('calendar')
+        ad.setAttribute('xmlns', 'urn:ietf:params:xml:ns:caldav')
+        vc = doc.createElement('vevent-collection')
+        vc.setAttribute('xmlns', 'http://groupdav.org/')
+        cols = res.getElementsByTagName('D:collection')
+        if cols:
+            cols[0].parentNode.appendChild(ad)
+            cols[0].parentNode.appendChild(vc)
+    return res
+
+propfind.PROPFIND.mk_prop_response = mk_prop_response
+
+def _get_caldav_calendar_description(self, uri):
+    dbname, dburi = self._get_dburi(uri)
+    cursor = DATABASE['cursor']
+    pool = Pool(DATABASE['dbname'])
+    collection_obj = pool.get('webdav.collection')
+    try:
+        res = collection_obj.get_calendar_description(cursor, int(USER_ID), dburi,
+                cache=CACHE)
+    except AttributeError:
+        return ''
+    except (DAV_Error, DAV_NotFound, DAV_Secret, DAV_Forbidden), exception:
+        self._log_exception(exception)
+        raise
+    except Exception, exception:
+        self._log_exception(exception)
+        raise DAV_Error(500)
+    return res
+
+TrytonDAVInterface._get_caldav_calendar_description = _get_caldav_calendar_description
+
+def _get_caldav_calendar_data(self, uri):
+    dbname, dburi = self._get_dburi(uri)
+    cursor = DATABASE['cursor']
+    pool = Pool(DATABASE['dbname'])
+    collection_obj = pool.get('webdav.collection')
+    try:
+        res = collection_obj.get_calendar_data(cursor, int(USER_ID), dburi,
+                cache=CACHE)
+    except (DAV_Error, DAV_NotFound, DAV_Secret, DAV_Forbidden), exception:
+        self._log_exception(exception)
+        raise
+    except Exception, exception:
+        self._log_exception(exception)
+        raise DAV_Error(500)
+    return res
+
+TrytonDAVInterface._get_caldav_calendar_data = _get_caldav_calendar_data
+
+def _get_caldav_calendar_home_set(self, uri):
+    dbname, dburi = self._get_dburi(uri)
+    cursor = DATABASE['cursor']
+    pool = Pool(DATABASE['dbname'])
+    collection_obj = pool.get('webdav.collection')
+    try:
+        res = collection_obj.get_calendar_home_set(cursor, int(USER_ID), dburi,
+                cache=CACHE)
+    except (DAV_Error, DAV_NotFound, DAV_Secret, DAV_Forbidden), exception:
+        self._log_exception(exception)
+        raise
+    except Exception, exception:
+        self._log_exception(exception)
+        raise DAV_Error(500)
+    uparts = list(urlparse.urlsplit(uri))
+    uparts[2] = urllib.quote(dbname + res)
+    doc = domimpl.createDocument(None, 'href', None)
+    href = doc.documentElement
+    href.tagName = 'D:href'
+    huri = doc.createTextNode(urlparse.urlunsplit(uparts))
+    href.appendChild(huri)
+    return href
+
+TrytonDAVInterface._get_caldav_calendar_home_set = _get_caldav_calendar_home_set
+
+def _get_caldav_calendar_user_address_set(self, uri):
+    dbname, dburi = self._get_dburi(uri)
+    cursor = DATABASE['cursor']
+    pool = Pool(DATABASE['dbname'])
+    collection_obj = pool.get('webdav.collection')
+    try:
+        res = collection_obj.get_calendar_user_address_set(cursor,
+                int(USER_ID), dburi, cache=CACHE)
+    except (DAV_Error, DAV_NotFound, DAV_Secret, DAV_Forbidden), exception:
+        self._log_exception(exception)
+        raise
+    except Exception, exception:
+        self._log_exception(exception)
+        raise DAV_Error(500)
+    doc = domimpl.createDocument(None, 'href', None)
+    href = doc.documentElement
+    href.tagName = 'D:href'
+    huri = doc.createTextNode('MAILTO:' + res)
+    href.appendChild(huri)
+    return href
+
+TrytonDAVInterface._get_caldav_calendar_user_address_set = _get_caldav_calendar_user_address_set
+
+def _get_caldav_schedule_inbox_URL(self, uri):
+    dbname, dburi = self._get_dburi(uri)
+    cursor = DATABASE['cursor']
+    pool = Pool(DATABASE['dbname'])
+    collection_obj = pool.get('webdav.collection')
+    try:
+        res = collection_obj.get_schedule_inbox_URL(cursor, int(USER_ID), dburi,
+                cache=CACHE)
+    except (DAV_Error, DAV_NotFound, DAV_Secret, DAV_Forbidden), exception:
+        self._log_exception(exception)
+        raise
+    except Exception, exception:
+        self._log_exception(exception)
+        raise DAV_Error(500)
+    uparts = list(urlparse.urlsplit(uri))
+    uparts[2] = urllib.quote(dbname + res)
+    doc = domimpl.createDocument(None, 'href', None)
+    href = doc.documentElement
+    href.tagName = 'D:href'
+    huri = doc.createTextNode(urlparse.urlunsplit(uparts))
+    href.appendChild(huri)
+    return href
+
+TrytonDAVInterface._get_caldav_schedule_inbox_URL = _get_caldav_schedule_inbox_URL
+
+def _get_caldav_schedule_outbox_URL(self, uri):
+    dbname, dburi = self._get_dburi(uri)
+    cursor = DATABASE['cursor']
+    pool = Pool(DATABASE['dbname'])
+    collection_obj = pool.get('webdav.collection')
+    try:
+        res = collection_obj.get_schedule_outbox_URL(cursor, int(USER_ID), dburi,
+                cache=CACHE)
+    except (DAV_Error, DAV_NotFound, DAV_Secret, DAV_Forbidden), exception:
+        self._log_exception(exception)
+        raise
+    except Exception, exception:
+        self._log_exception(exception)
+        raise DAV_Error(500)
+    uparts = list(urlparse.urlsplit(uri))
+    uparts[2] = urllib.quote(dbname + res)
+    doc = domimpl.createDocument(None, 'href', None)
+    href = doc.documentElement
+    href.tagName = 'D:href'
+    huri = doc.createTextNode(urlparse.urlunsplit(uparts))
+    href.appendChild(huri)
+    return href
+
+TrytonDAVInterface._get_caldav_schedule_outbox_URL = _get_caldav_schedule_outbox_URL
+
+_prev_get_dav_principal_collection_set = hasattr(TrytonDAVInterface,
+        '_get_dav_principal_collection_set') and \
+                TrytonDAVInterface._get_dav_principal_collection_set or None
+
+def _get_dav_principal_collection_set(self, uri):
+    dbname, dburi = self._get_dburi(uri)
+    if dburi.startswith('Calendars'):
+        uparts = list(urlparse.urlsplit(uri))
+        uparts[2] = urllib.quote(dbname + '/Calendars/')
+        doc = domimpl.createDocument(None, 'href', None)
+        href = doc.documentElement
+        href.tagName = 'D:href'
+        huri = doc.createTextNode(urlparse.urlunsplit(uparts))
+        href.appendChild(huri)
+        return href
+    return _prev_get_dav_principal_collection_set(self, uri)
+
+TrytonDAVInterface._get_dav_principal_collection_set = _get_dav_principal_collection_set
+
+def _get_caldav_post(self, uri, body, contenttype=''):
+    dbname, dburi = self._get_dburi(uri)
+    cursor = DATABASE['cursor']
+    pool = Pool(DATABASE['dbname'])
+    calendar_obj = pool.get('calendar.calendar')
+    try:
+        res = calendar_obj.post(cursor, int(USER_ID), dburi, body)
+    except (DAV_Error, DAV_NotFound, DAV_Secret, DAV_Forbidden), exception:
+        self._log_exception(exception)
+        raise
+    except Exception, exception:
+        self._log_exception(exception)
+        raise DAV_Error(500)
+    return res
+
+TrytonDAVInterface._get_caldav_post = _get_caldav_post
+
+_prev_do_POST = WebDAVAuthRequestHandler.do_POST
+
+def do_POST(self):
+    dc=self.IFACE_CLASS
+
+    uri=urlparse.urljoin(self.get_baseuri(dc), self.path)
+    uri=urllib.unquote(uri)
+
+    dbname, dburi = TrytonDAVInterface.get_dburi(uri)
+    if dburi.startswith('Calendars'):
+        # read the body
+        body=None
+        if self.headers.has_key("Content-Length"):
+            l=self.headers['Content-Length']
+            body=self.rfile.read(atoi(l))
+        ct=None
+        if self.headers.has_key("Content-Type"):
+            ct=self.headers['Content-Type']
+
+        headers = {}
+
+        try:
+            DATA = '%s\n' % dc._get_caldav_post(uri, body, ct)
+        except DAV_Error, (ec, dd):
+            return self.send_status(ec)
+        self.send_body_chunks(DATA, '200', 'OK', 'OK')
+        return
+    return _prev_do_POST(self)
+
+WebDAVAuthRequestHandler.do_POST = do_POST
diff --git a/calendar.py b/calendar.py
new file mode 100644
index 0000000..b4b426e
--- /dev/null
+++ b/calendar.py
@@ -0,0 +1,2063 @@
+#This file is part of Tryton.  The COPYRIGHT file at the top level of
+#this repository contains the full copyright notices and license terms.
+from trytond.model import ModelSQL, ModelView, fields
+from trytond.tools import Cache, reduce_ids
+import uuid
+import vobject
+import dateutil.tz
+tzlocal = dateutil.tz.tzlocal()
+tzutc = dateutil.tz.tzutc()
+import pytz
+import datetime
+import xml.dom.minidom
+domimpl = xml.dom.minidom.getDOMImplementation()
+
+
+class Calendar(ModelSQL, ModelView):
+    "Calendar"
+    _description = __doc__
+    _name = 'calendar.calendar'
+
+    name = fields.Char('Name', required=True, select=1)
+    description = fields.Text('Description')
+    owner = fields.Many2One('res.user', 'Owner', select=1,
+            domain=[('email', '!=', False)],
+            help='The user must have an email')
+    read_users = fields.Many2Many('calendar.calendar-read-res.user',
+            'calendar', 'user', 'Read Users')
+    write_users = fields.Many2Many('calendar.calendar-write-res.user',
+            'calendar', 'user', 'Write Users')
+
+    def __init__(self):
+        super(Calendar, self).__init__()
+        self._sql_constraints = [
+            ('name_uniq', 'UNIQUE(name)',
+                'The name of calendar must be unique!'),
+            ('owner_uniq', 'UNIQUE(owner)',
+                'A user can have only one calendar!'),
+        ]
+        self._order.insert(0, ('name', 'ASC'))
+        self._constraints += [
+            ('check_name', 'Calendar name can not end with .ics'),
+        ]
+
+    def create(self, cursor, user, vals, context=None):
+        res = super(Calendar, self).create(cursor, user, vals, context=context)
+        # Restart the cache for get_name
+        self.get_name(cursor.dbname)
+        return res
+
+    def write(self, cursor, user, ids, vals, context=None):
+        res = super(Calendar, self).write(cursor, user, ids, vals,
+                context=context)
+        # Restart the cache for get_name
+        self.get_name(cursor.dbname)
+        return res
+
+    def delete(self, cursor, user, ids, context=None):
+        res = super(Calendar, self).delete(cursor, user, ids, context=context)
+        # Restart the cache for calendar
+        self.get_name(cursor.dbname)
+        return res
+
+    def check_name(self, cursor, user, ids):
+        '''
+        Check the name doesn't end with .ics
+        '''
+        for calendar in self.browse(cursor, user, ids):
+            if calendar.name.endswith('.ics'):
+                return False
+        return True
+
+    def get_name(self, cursor, user, name, context=None):
+        '''
+        Return the calendar id of the name
+
+        :param cursor: the database cursor
+        :param user: the user id
+        :param name: the calendar name
+        :param context: the context
+        :return: the calendar.calendar id or False
+        '''
+        calendar_ids = self.search(cursor, user, [
+            ('name', '=', name),
+            ], limit=1, context=context)
+        if calendar_ids:
+            return calendar_ids[0]
+        return False
+
+    get_name = Cache('calendar_calendar.get_name')(get_name)
+
+    def calendar2ical(self, cursor, user, calendar_id, context=None):
+        '''
+        Return an iCalendar object for the given calendar_id containing
+        all the vevent objects
+
+        :param cursor: the database cursor
+        :param user: the user id
+        :param calendar_id: an id of calendar.calendar
+        :param context: the context
+        :return: an iCalendar
+        '''
+        event_obj = self.pool.get('calendar.event')
+
+        ical = vobject.iCalendar()
+        ical.vevent_list = []
+        event_ids = event_obj.search(cursor, user, [
+            ('calendar', '=', calendar_id),
+            ('parent', '=', False),
+            ], context=context)
+        for event in event_obj.browse(cursor, user, event_ids,
+                context=context):
+            ical2 = event_obj.event2ical(cursor, user, event.id,
+                    context=context)
+            ical.vevent_list.extend(ical2.vevent_list)
+        return ical
+
+    def _fbtype(self, cursor, user, event, context=None):
+        '''
+        Return the freebusy type for give transparent and status
+
+        :param cursor: the database cursor
+        :param user: the user id
+        :param event: a BrowseRecord of calendar.event
+        :param context: the context
+        :return: a freebusy type ('FREE', 'BUSY', 'BUSY-TENTATIVE')
+        '''
+        if event.transp == 'opaque':
+            if not event.status or event.status == 'confirmed':
+                fbtype = 'BUSY'
+            elif event.status == 'cancelled':
+                fbtype = 'FREE'
+            elif event.status == 'tentative':
+                fbtype = 'BUSY-TENTATIVE'
+            else:
+                fbtype = 'BUSY'
+        else:
+            fbtype = 'FREE'
+        return fbtype
+
+    def freebusy(self, cursor, user, calendar_id, dtstart, dtend, context=None):
+        '''
+        Return an iCalendar object for the given calendar_id with the
+        vfreebusy objects between the two dates
+
+        :param cursor: the database cursor
+        :param user: the user id
+        :param calendar_id: an id of calendar.calendar
+        :param dtstart: a date or datetime
+        :param dtend: a date of datetime
+        :param context: the context
+        :return: an iCalendar
+        '''
+        event_obj = self.pool.get('calendar.event')
+
+        ical = vobject.iCalendar()
+        ical.add('method').value = 'REPLY'
+        ical.add('vfreebusy')
+        if not isinstance(dtstart, datetime.datetime):
+            ical.vfreebusy.add('dtstart').value = dtstart
+            dtstart = datetime.datetime.combine(dtstart, datetime.time())\
+                    .replace(tzinfo=tzlocal)
+        else:
+            ical.vfreebusy.add('dtstart').value = dtstart.astimezone(tzutc)
+        if not isinstance(dtend, datetime.datetime):
+            ical.vfreebusy.add('dtend').value = dtend
+            dtend = datetime.datetime.combine(dtend, datetime.time.max)\
+                    .replace(tzinfo=tzlocal)
+        else:
+            ical.vfreebusy.add('dtend').value = dtend.astimezone(tzutc)
+
+        event_ids = event_obj.search(cursor, 0, [
+            ['OR',
+                [('dtstart', '<=', dtstart),
+                    ('dtend', '>=', dtstart)],
+                [('dtstart', '<=', dtend),
+                    ('dtend', '>=', dtend)],
+                [('dtstart', '>=', dtstart),
+                    ('dtend', '<=', dtend)],
+                [('dtstart', '>=', dtstart),
+                    ('dtstart', '<=', dtend),
+                    ('dtend', '=', False)]],
+            ('parent', '=', False),
+            ('rdates', '=', False),
+            ('rrules', '=', False),
+            ('exdates', '=', False),
+            ('exrules', '=', False),
+            ('occurences', '=', False),
+            ('calendar', '=', calendar_id),
+            ], context=context)
+
+        for event in event_obj.browse(cursor, 0, event_ids, context=context):
+            # Don't group freebusy as sunbird doesn't handle it
+            freebusy = ical.vfreebusy.add('freebusy')
+            freebusy.fbtype_param = self._fbtype(cursor, user, event,
+                    context=context)
+            if event.dtstart.replace(tzinfo=tzlocal) >= dtstart:
+                freebusy_dtstart = event.dtstart.replace(tzinfo=tzlocal)
+            else:
+                freebusy_dtstart = dtstart
+            if event.dtend.replace(tzinfo=tzlocal) <= dtend:
+                freebusy_dtend = event.dtend.replace(tzinfo=tzlocal)
+            else:
+                freebusy_dtend = dtend
+            freebusy.value = [(
+                freebusy_dtstart.astimezone(tzutc),
+                freebusy_dtend.astimezone(tzutc))]
+
+        event_ids = event_obj.search(cursor, 0, [
+            ('parent', '=', False),
+            ['OR',
+                ('rdates', '!=', False),
+                ('rrules', '!=', False),
+                ('exdates', '!=', False),
+                ('exrules', '!=', False),
+                ('occurences', '!=', False),
+            ],
+            ('calendar', '=', calendar_id),
+            ], context=context)
+        for event in event_obj.browse(cursor, 0, event_ids, context=context):
+            event_ical = event_obj.event2ical(cursor, user, event,
+                    context=context)
+            if event_ical.vevent.rruleset:
+                between_dtstart, between_dtend = dtstart, dtend
+                if event.all_day:
+                    between_dtstart = dtstart.replace(tzinfo=None)
+                    between_dtend = dtend.replace(tzinfo=None)
+                for freebusy_dtstart in event_ical.vevent.rruleset:
+                    if not event.dtend:
+                        freebusy_dtend = freebusy_dtstart
+                    else:
+                        freebusy_dtend = event.dtend.replace(tzinfo=tzlocal)\
+                                - event.dtstart.replace(tzinfo=tzlocal) \
+                                + freebusy_dtstart
+                    if not ((freebusy_dtstart.replace(tzinfo=tzlocal) <= dtstart
+                        and freebusy_dtend.replace(tzinfo=tzlocal) >= dtstart)
+                        or (freebusy_dtstart.replace(tzinfo=tzlocal) <= dtend
+                        and freebusy_dtend.replace(tzinfo=tzlocal) >= dtend)
+                        or (freebusy_dtstart.replace(tzinfo=tzlocal) >= dtstart
+                        and freebusy_dtend.replace(tzinfo=tzlocal) <= dtend)):
+                        continue
+                    freebusy_fbtype = self._fbtype(cursor, user, event,
+                            context=context)
+                    all_day = event.all_day
+                    for occurence in event.occurences:
+                        if occurence.recurrence.replace(tzinfo=tzlocal) == \
+                                freebusy_dtstart:
+                            if occurence.dtend:
+                                freebusy_dtend = occurence.dtend\
+                                        .replace(tzinfo=tzlocal)
+                            else:
+                                freebusy_dtend = freebusy_dtstart
+                            all_day = occurence.all_day
+                            freebusy_fbtype = self._fbtype(cursor, user,
+                                    occurence, context=context)
+                            break
+                    freebusy = ical.vfreebusy.add('freebusy')
+                    freebusy.fbtype_param = freebusy_fbtype
+                    if freebusy_dtstart.replace(tzinfo=tzlocal) <= dtstart:
+                        freebusy_dtstart = dtstart
+                    if freebusy_dtend.replace(tzinfo=tzlocal) >= dtend:
+                        freebusy_dtend = dtend
+                    if all_day:
+                        freebusy.value = [(
+                            freebusy_dtstart.replace(tzinfo=tzlocal)\
+                                    .astimezone(tzutc),
+                            freebusy_dtend.replace(tzinfo=tzlocal)\
+                                    .astimezone(tzutc))]
+                    else:
+                        freebusy.value = [(
+                            freebusy_dtstart.astimezone(tzutc),
+                            freebusy_dtend.astimezone(tzutc))]
+        return ical
+
+    def post(self, cursor, user, uri, data, context=None):
+        '''
+        Handle post of vfreebusy request
+
+        :param cursor: the database cursor
+        :param user: the user id
+        :param uri: the posted uri
+        :param data: the posted data
+        :param context: the context
+        :return: the xml with schedule-response
+        '''
+        collection_obj = self.pool.get('webdav.collection')
+
+        calendar_id = collection_obj.calendar(cursor, user, uri,
+                context=context)
+        if not calendar_id:
+            raise DAV_Forbidden
+        calendar = self.browse(cursor, user, calendar_id,
+                context=context)
+        if calendar.owner.id != user:
+            raise DAV_Forbidden
+        ical = vobject.readOne(data)
+        if ical.method.value == 'REQUEST' \
+                and hasattr(ical, 'vfreebusy'):
+            doc = domimpl.createDocument(None, 'schedule-response', None)
+            sr = doc.documentElement
+            sr.setAttribute('xmlns:D', 'DAV:')
+            sr.setAttribute('xmlns:C', 'urn:ietf:params:xml:ns:caldav')
+            sr.tagName = 'C:schedule-response'
+
+            if not isinstance(ical.vfreebusy.dtstart.value, datetime.datetime):
+                dtstart = ical.vfreebusy.dtstart.value
+            else:
+                if ical.vfreebusy.dtstart.value.tzinfo:
+                    dtstart = ical.vfreebusy.dtstart.value.astimezone(tzlocal)
+                else:
+                    dtstart = ical.vfreebusy.dtstart.value
+            if not isinstance(ical.vfreebusy.dtend.value, datetime.datetime):
+                dtend = ical.vfreebusy.dtend.value
+            else:
+                if ical.vfreebusy.dtend.value.tzinfo:
+                    dtend = ical.vfreebusy.dtend.value.astimezone(tzlocal)
+                else:
+                    dtend = ical.vfreebusy.dtend.value
+            for attendee in ical.vfreebusy.attendee_list:
+                resp = doc.createElement('C:response')
+                sr.appendChild(resp)
+                recipient = doc.createElement('C:recipient')
+                href = doc.createElement('D:href')
+                huri = doc.createTextNode(attendee.value)
+                href.appendChild(huri)
+                recipient.appendChild(href)
+                resp.appendChild(recipient)
+
+                vfreebusy = None
+                email = attendee.value
+                if attendee.value.lower().startswith('mailto:'):
+                    email = attendee.value[7:]
+                calendar_ids = self.search(cursor, 0, [
+                    ('owner.email', '=', email),
+                    ], context=context)
+                if calendar_ids:
+                    vfreebusy = self.freebusy(cursor, user, calendar_ids[0],
+                            dtstart, dtend, context=context)
+                    vfreebusy.vfreebusy.add('dtstamp').value = \
+                            ical.vfreebusy.dtstamp.value
+                    vfreebusy.vfreebusy.add('uid').value = \
+                            ical.vfreebusy.uid.value
+                    vfreebusy.vfreebusy.add('organizer').value = \
+                            ical.vfreebusy.organizer.value
+                    vfreebusy.vfreebusy.add('attendee').value = attendee.value
+
+                status = doc.createElement('C:request-status')
+                status.appendChild(doc.createTextNode(vfreebusy and \
+                        '2.0;Success' or '5.3;No scheduling support for user.'))
+                resp.appendChild(status)
+                if vfreebusy:
+                    data = doc.createElement('C:calendar-data')
+                    data.appendChild(doc.createTextNode(vfreebusy.serialize()))
+                    resp.appendChild(data)
+            return doc.toxml(encoding='utf-8')
+        raise DAV_Forbidden
+
+Calendar()
+
+
+class ReadUser(ModelSQL):
+    'Calendar - read - User'
+    _description = __doc__
+    _name = 'calendar.calendar-read-res.user'
+
+    calendar = fields.Many2One('calendar.calendar', 'Calendar',
+            ondelete='CASCADE', required=True, select=1)
+    user = fields.Many2One('res.user', 'User', ondelete='CASCADE',
+            required=True, select=1)
+
+ReadUser()
+
+
+class WriteUser(ModelSQL):
+    'Calendar - write - User'
+    _description = __doc__
+    _name = 'calendar.calendar-write-res.user'
+
+    calendar = fields.Many2One('calendar.calendar', 'Calendar',
+            ondelete='CASCADE', required=True, select=1)
+    user = fields.Many2One('res.user', 'User', ondelete='CASCADE',
+            required=True, select=1)
+
+WriteUser()
+
+
+class Category(ModelSQL, ModelView):
+    "Category"
+    _description = __doc__
+    _name = 'calendar.category'
+
+    name = fields.Char('Name', required=True, select=1)
+
+    def __init__(self):
+        super(Category, self).__init__()
+        self._sql_constraints = [
+            ('name_uniq', 'UNIQUE(name)',
+                'The name of calendar category must be unique!'),
+        ]
+        self._order.insert(0, ('name', 'ASC'))
+
+Category()
+
+
+class Location(ModelSQL, ModelView):
+    "Location"
+    _description = __doc__
+    _name = 'calendar.location'
+
+    name = fields.Char('Name', required=True, select=1)
+
+    def __init__(self):
+        super(Location, self).__init__()
+        self._sql_constraints = [
+            ('name_uniq', 'UNIQUE(name)',
+                'The name of calendar location must be unique!'),
+        ]
+        self._order.insert(0, ('name', 'ASC'))
+
+Location()
+
+
+class Event(ModelSQL, ModelView):
+    "Event"
+    _description = __doc__
+    _name = 'calendar.event'
+    _rec_name = 'uuid'
+
+    uuid = fields.Char('UUID', required=True,
+            help='Universally Unique Identifier', select=1)
+    calendar = fields.Many2One('calendar.calendar', 'Calendar',
+            required=True, select=1)
+    summary = fields.Char('Summary')
+    sequence = fields.Integer('Sequence')
+    description = fields.Text('Description')
+    all_day = fields.Boolean('All Day')
+    dtstart = fields.DateTime('Start Date', required=True, select=1)
+    dtend = fields.DateTime('End Date', select=1)
+    timezone = fields.Selection('timezones', 'Timezone')
+    categories = fields.Many2Many('calendar.event-calendar.category',
+            'event', 'category', 'Categories')
+    classification = fields.Selection([
+        ('public', 'Public'),
+        ('private', 'Private'),
+        ('confidential', 'Confidential'),
+        ], 'Classification', required=True)
+    location = fields.Many2One('calendar.location', 'Location')
+    status = fields.Selection([
+        ('', ''),
+        ('tentative', 'Tentative'),
+        ('confirmed', 'Confirmed'),
+        ('cancelled', 'Cancelled'),
+        ], 'Status')
+    organizer = fields.Char('Organizer', states={
+        'required': "bool(attendees) and not bool(parent)",
+        }, depends=['attendees', 'parent'])
+    attendees = fields.One2Many('calendar.event.attendee', 'event',
+            'Attendees')
+    transp = fields.Selection([
+        ('opaque', 'Opaque'),
+        ('transparent', 'Transparent'),
+        ], 'Time Transparency', required=True)
+    alarms = fields.One2Many('calendar.event.alarm', 'event', 'Alarms')
+    rdates = fields.One2Many('calendar.event.rdate', 'event', 'Recurrence Dates',
+            states={
+                'invisible': "bool(parent)",
+            }, depends=['parent'])
+    rrules = fields.One2Many('calendar.event.rrule', 'event', 'Recurrence Rules',
+            states={
+                'invisible': "bool(parent)",
+            }, depends=['parent'])
+    exdates = fields.One2Many('calendar.event.exdate', 'event', 'Exception Dates',
+            states={
+                'invisible': "bool(parent)",
+            }, depends=['parent'])
+    exrules = fields.One2Many('calendar.event.exrule', 'event', 'Exception Rules',
+            states={
+                'invisible': "bool(parent)",
+            }, depends=['parent'])
+    occurences = fields.One2Many('calendar.event', 'parent', 'Occurences',
+            domain=["('uuid', '=', uuid)",
+                "('calendar', '=', calendar)"],
+            states={
+                'invisible': "bool(parent)",
+            }, depends=['uuid', 'calendar', 'parent'])
+    parent = fields.Many2One('calendar.event', 'Parent',
+            domain=["('uuid', '=', uuid)",
+                "('parent', '=', False)",
+                "('calendar', '=', calendar)"],
+            ondelete='CASCADE', depends=['uuid', 'calendar'])
+    recurrence = fields.DateTime('Recurrence', select=1, states={
+                'invisible': "not bool(parent)",
+                }, depends=['parent'])
+    calendar_owner = fields.Function('get_calendar_field',
+            type='many2one', relation='res.user', string='Owner',
+            fnct_search='search_calendar_field')
+    calendar_read_users = fields.Function('get_calendar_field',
+            type='many2many', relation='res.user', string='Read Users',
+            fnct_search='search_calendar_field')
+    calendar_write_users = fields.Function('get_calendar_field',
+            type='many2many', relation='res.user', string='Write Users',
+            fnct_search='search_calendar_field')
+    classification_public = fields.Function('get_classification_public',
+            type='boolean', string='Classification Public',
+            fnct_search='search_classification_public')
+    vevent = fields.Binary('vevent')
+
+    def __init__(self):
+        super(Event, self).__init__()
+        self._sql_constraints = [
+            ('uuid_recurrence_uniq', 'UNIQUE(uuid, calendar, recurrence)',
+                'UUID and recurrence must be unique in a calendar!'),
+        ]
+        self._constraints += [
+            ('check_recurrence', 'invalid_recurrence'),
+        ]
+        self._error_messages.update({
+            'invalid_recurrence': 'Recurrence can not be recurrent!',
+        })
+
+    def default_uuid(self, cursor, user, context=None):
+        return str(uuid.uuid4())
+
+    def default_sequence(self, cursor, user, context=None):
+        return 0
+
+    def default_classification(self, cursor, user, context=None):
+        return 'public'
+
+    def default_transp(self, cursor, user, context=None):
+        return 'opaque'
+
+    def default_timezone(self, cursor, user, context=None):
+        user_obj = self.pool.get('res.user')
+        user_ = user_obj.browse(cursor, user, user, context=context)
+        return user_.timezone
+
+    def timezones(self, cursor, user, context=None):
+        return [(x, x) for x in pytz.common_timezones] + [('', '')]
+
+    def get_calendar_field(self, cursor, user, ids, name, arg, context=None):
+        assert name in ('calendar_owner', 'calendar_read_users',
+                'calendar_write_users'), 'Invalid name'
+        res = {}
+        for event in self.browse(cursor, user, ids, context=context):
+            name = name[9:]
+            if name in ('read_users', 'write_users'):
+                res[event.id] = [x.id for x in event.calendar[name]]
+            else:
+                res[event.id] = event.calendar[name].id
+        return res
+
+    def search_calendar_field(self, cursor, user, name, args, context=None):
+        args2 = []
+        i = 0
+        while i < len(args):
+            field = args[i][0][9:]
+            args2.append(tuple(['calendar.' + field] + list(args[i])[1:]))
+            i += 1
+        return args2
+
+    def get_classification_public(self, cursor, user, ids, name, arg,
+            context=None):
+        res = {}
+        for event in self.browse(cursor, user, ids, context=context):
+            res[event.id] = False
+            if event.classification == 'public':
+                res[event.id] = True
+        return res
+
+    def search_classification_public(self, cursor, user, name, args,
+            context=None):
+        args2 = []
+        i = 0
+        while i < len(args):
+            if args[i][2]:
+                args2.append(('classification', '=', 'public'))
+            else:
+                args2.append(('classification', '!=', 'public'))
+            i += 1
+        return args2
+
+    def check_recurrence(self, cursor, user, ids):
+        '''
+        Check the recurrence is not recurrent.
+        '''
+        for event in self.browse(cursor, user, ids):
+            if not event.parent:
+                continue
+            if event.rdates \
+                    or event.rrules \
+                    or event.exdates \
+                    or event.exrules \
+                    or event.occurences:
+                return False
+        return True
+
+    def create(self, cursor, user, values, context=None):
+        calendar_obj = self.pool.get('calendar.calendar')
+        collection_obj = self.pool.get('webdav.collection')
+
+        res = super(Event, self).create(cursor, user, values, context=context)
+        event = self.browse(cursor, user, res, context=context)
+        if event.calendar.owner \
+                and (event.organizer == event.calendar.owner.email \
+                or (event.parent \
+                and event.parent.organizer == event.parent.calendar.owner.email)):
+            if event.organizer == event.calendar.owner.email:
+                attendee_emails = [x.email for x in event.attendees
+                        if x.status != 'declined'
+                        and x.email != event.organizer]
+            else:
+                attendee_emails = [x.email for x in event.parent.attendees
+                        if x.status != 'declined'
+                        and x.email != event.parent.organizer]
+            if attendee_emails:
+                calendar_ids = calendar_obj.search(cursor, 0, [
+                    ('owner.email', 'in', attendee_emails),
+                    ], context=context)
+                if not event.recurrence:
+                    for calendar_id in calendar_ids:
+                        new_id = self.copy(cursor, 0, event.id, default={
+                            'calendar': calendar_id,
+                            'occurences': False,
+                            }, context=context)
+                        for occurence in event.occurences:
+                            self.copy(cursor, 0, occurence.id, default={
+                                'calendar': calendar_id,
+                                'parent': new_id,
+                                }, context=context)
+                else:
+                    parent_ids = self.search(cursor, 0, [
+                        ('uuid', '=', event.uuid),
+                        ('calendar.owner.email', 'in', attendee_emails),
+                        ('id', '!=', event.id),
+                        ('recurrence', '=', False),
+                        ], context=context)
+                    for parent in self.browse(cursor, 0, parent_ids,
+                            context=context):
+                        self.copy(cursor, 0, event.id, default={
+                            'calendar': parent.calendar.id,
+                            'parent': parent.id,
+                            }, context=context)
+        # Restart the cache for event
+        collection_obj.event(cursor.dbname)
+        return res
+
+    def _event2update(self, cursor, user, event, context=None):
+        rdate_obj = self.pool.get('calendar.event.rdate')
+        exdate_obj = self.pool.get('calendar.event.exdate')
+        rrule_obj = self.pool.get('calendar.event.rrule')
+        exrule_obj = self.pool.get('calendar.event.exrule')
+
+        res = {}
+        res['summary'] = event.summary
+        res['description'] = event.description
+        res['all_day'] = event.all_day
+        res['dtstart'] = event.dtstart
+        res['dtend'] = event.dtend
+        res['location'] = event.location.id
+        res['status'] = event.status
+        res['organizer'] = event.organizer
+        res['rdates'] = [('delete_all',)]
+        for rdate in event.rdates:
+            vals = rdate_obj._date2update(cursor, user, rdate, context=context)
+            res['rdates'].append(('create', vals))
+        res['exdates'] = [('delete_all',)]
+        for exdate in event.exdates:
+            vals = exdate_obj._date2update(cursor, user, exdate, context=context)
+            res['exdates'].append(('create', vals))
+        res['rrules'] = [('delete_all',)]
+        for rrule in event.rrules:
+            vals = rrule_obj._rule2update(cursor, user, rrule, context=context)
+            res['rrules'].append(('create', vals))
+        res['exrules'] = [('delete_all',)]
+        for exrule in event.exrules:
+            vals = exrule_obj._rule2update(cursor, user, exrule, context=context)
+            res['exrules'].append(('create', vals))
+        return res
+
+    def write(self, cursor, user, ids, values, context=None):
+        calendar_obj = self.pool.get('calendar.calendar')
+        collection_obj = self.pool.get('webdav.collection')
+
+        values = values.copy()
+        if 'sequence' in values:
+            del values['sequence']
+
+        res = super(Event, self).write(cursor, user, ids, values,
+                context=context)
+
+        if isinstance(ids, (int, long)):
+            ids = [ids]
+
+        for i in range(0, len(ids), cursor.IN_MAX):
+            sub_ids = ids[i:i + cursor.IN_MAX]
+            red_sql, red_ids = reduce_ids('id', sub_ids)
+            cursor.execute('UPDATE "' + self._table + '" ' \
+                    'SET sequence = sequence + 1 ' \
+                    'WHERE ' + red_sql, red_ids)
+
+        for event in self.browse(cursor, user, ids, context=context):
+            if event.calendar.owner \
+                    and (event.organizer == event.calendar.owner.email \
+                    or (event.parent \
+                    and event.parent.organizer == event.calendar.owner.email)):
+                if event.organizer == event.calendar.owner.email:
+                    attendee_emails = [x.email for x in event.attendees
+                            if x.status != 'declined'
+                            and x.email != event.organizer]
+                else:
+                    attendee_emails = [x.email for x in event.parent.attendees
+                            if x.status != 'declined'
+                            and x.email != event.parent.organizer]
+                if attendee_emails:
+                    event_ids = self.search(cursor, 0, [
+                        ('uuid', '=', event.uuid),
+                        ('calendar.owner.email', 'in', attendee_emails),
+                        ('id', '!=', event.id),
+                        ('recurrence', '=', event.recurrence or False),
+                        ], context=context)
+                    for event2 in self.browse(cursor, user, event_ids,
+                            context=context):
+                        if event2.calendar.owner.email in attendee_emails:
+                            attendee_emails.remove(event2.calendar.owner.email)
+                    self.write(cursor, 0, event_ids, self._event2update(
+                        cursor, user, event, context=context), context=context)
+                if attendee_emails:
+                    calendar_ids = calendar_obj.search(cursor, 0, [
+                        ('owner.email', 'in', attendee_emails),
+                        ], context=context)
+                    if not event.recurrence:
+                        for calendar_id in calendar_ids:
+                            new_id = self.copy(cursor, 0, event.id, default={
+                                'calendar': calendar_id,
+                                'occurences': False,
+                                }, context=context)
+                            for occurence in event.occurences:
+                                self.copy(cursor, 0, occurence.id, default={
+                                    'calendar': calendar_id,
+                                    'parent': new_id,
+                                    }, context=context)
+                    else:
+                        parent_ids = self.search(cursor, 0, [
+                            ('uuid', '=', event.uuid),
+                            ('calendar.owner.email', 'in', attendee_emails),
+                            ('id', '!=', event.id),
+                            ('recurrence', '=', False),
+                            ], context=context)
+                        for parent in self.browse(cursor, 0, parent_ids,
+                                context=context):
+                            self.copy(cursor, 0, event.id, default={
+                                'calendar': parent.calendar.id,
+                                'parent': parent.id,
+                                }, context=context)
+        # Restart the cache for event
+        collection_obj.event(cursor.dbname)
+        return res
+
+    def delete(self, cursor, user, ids, context=None):
+        attendee_obj = self.pool.get('calendar.event.attendee')
+        collection_obj = self.pool.get('webdav.collection')
+
+        if isinstance(ids, (int, long)):
+            ids = [ids]
+        for event in self.browse(cursor, user, ids, context=context):
+            if event.calendar.owner \
+                    and (event.organizer == event.calendar.owner.email \
+                    or (event.parent \
+                    and event.parent.organizer == event.calendar.owner.email)):
+                if event.organizer == event.calendar.owner.email:
+                    attendee_emails = [x.email for x in event.attendees
+                            if x.email != event.organizer]
+                else:
+                    attendee_emails = [x.email for x in event.parent.attendees
+                            if x.email != event.parent.organizer]
+                if attendee_emails:
+                    event_ids = self.search(cursor, 0, [
+                        ('uuid', '=', event.uuid),
+                        ('calendar.owner.email', 'in', attendee_emails),
+                        ('id', '!=', event.id),
+                        ('recurrence', '=', event.recurrence or False),
+                        ], context=context)
+                    self.delete(cursor, 0, event_ids, context=context)
+            elif event.organizer \
+                    or (event.parent and event.parent.organizer):
+                if event.organizer:
+                    organizer = event.organizer
+                else:
+                    organizer = event.parent.organizer
+                event_ids = self.search(cursor, 0, [
+                    ('uuid', '=', event.uuid),
+                    ('calendar.owner.email', '=', organizer),
+                    ('id', '!=', event.id),
+                    ('recurrence', '=', event.recurrence or False),
+                    ], context=context, limit=1)
+                if event_ids:
+                    event2 = self.browse(cursor, 0, event_ids[0],
+                            context=context)
+                    for attendee in event2.attendees:
+                        if attendee.email == event.calendar.owner.email:
+                            attendee_obj.write(cursor, 0, attendee.id, {
+                                'status': 'declined',
+                                }, context=context)
+        res = super(Event, self).delete(cursor, user, ids, context=context)
+        # Restart the cache for event
+        collection_obj.event(cursor.dbname)
+        return res
+
+    def ical2values(self, cursor, user, event_id, ical, calendar_id,
+            vevent=None, context=None):
+        '''
+        Convert iCalendar to values for create or write
+
+        :param cursor: the database cursor
+        :param user: the user id
+        :param event_id: the event id for write or None for create
+        :param ical: a ical instance of vobject
+        :param calendar_id: the calendar id of the event
+        :param vevent: the vevent of the ical to use if None use the first one
+        :param context: the context
+        :return: a dictionary with values
+        '''
+        category_obj = self.pool.get('calendar.category')
+        location_obj = self.pool.get('calendar.location')
+        user_obj = self.pool.get('res.user')
+        alarm_obj = self.pool.get('calendar.event.alarm')
+        attendee_obj = self.pool.get('calendar.event.attendee')
+        rdate_obj = self.pool.get('calendar.event.rdate')
+        exdate_obj = self.pool.get('calendar.event.exdate')
+        rrule_obj = self.pool.get('calendar.event.rrule')
+        exrule_obj = self.pool.get('calendar.event.exrule')
+
+        if context is None:
+            context = {}
+
+        vevents = []
+        if not vevent:
+            vevent = ical.vevent
+
+            for i in ical.getChildren():
+                if i.name == 'VEVENT' \
+                        and i != vevent:
+                    vevents.append(i)
+
+        event = None
+        if event_id:
+            event = self.browse(cursor, user, event_id, context=context)
+
+        res = {}
+        if not event:
+            if hasattr(vevent, 'uid'):
+                res['uuid'] = vevent.uid.value
+            else:
+                res['uuid'] = str(uuid.uuid4())
+        if hasattr(vevent, 'summary'):
+            res['summary'] = vevent.summary.value
+        else:
+            res['summary'] = False
+        if hasattr(vevent, 'description'):
+            res['description'] = vevent.description.value
+        else:
+            res['description'] = False
+        if not isinstance(vevent.dtstart.value, datetime.datetime):
+            res['all_day'] = True
+            res['dtstart'] = datetime.datetime.combine(vevent.dtstart.value,
+                    datetime.time())
+        else:
+            res['all_day'] = False
+            if vevent.dtstart.value.tzinfo:
+                res['dtstart'] = vevent.dtstart.value.astimezone(tzlocal)
+            else:
+                res['dtstart'] = vevent.dtstart.value
+        if hasattr(vevent, 'dtend'):
+            if not isinstance(vevent.dtend.value, datetime.datetime):
+                res['dtend'] = datetime.datetime.combine(vevent.dtend.value,
+                        datetime.time())
+            else:
+                if vevent.dtend.value.tzinfo:
+                    res['dtend'] = vevent.dtend.value.astimezone(tzlocal)
+                else:
+                    res['dtend'] = vevent.dtend.value
+        elif hasattr(vevent, 'duration') and res['dtstart']:
+            res['dtend'] = dtstart + vevent.duration
+        else:
+            res['dtend'] = False
+        if hasattr(vevent, 'recurrence-id'):
+            if not isinstance(vevent.recurrence_id.value, datetime.datetime):
+                res['recurrence'] = datetime.datetime.combine(
+                        vevent.recurrence_id.value, datetime.time())
+            else:
+                if vevent.recurrence_id.value.tzinfo:
+                    res['recurrence'] = \
+                            vevent.recurrence_id.value.astimezone(tzlocal)
+                else:
+                    res['recurrence'] = vevent.recurrence_id.value
+        else:
+            res['recurrence'] = False
+        if hasattr(vevent, 'status'):
+            res['status'] = vevent.status.value.lower()
+        else:
+            res['status'] = ''
+        if hasattr(vevent, 'categories'):
+            ctx = context.copy()
+            ctx['active_test'] = False
+            category_ids = category_obj.search(cursor, user, [
+                ('name', 'in', [x for x in vevent.categories.value]),
+                ], context=context)
+            categories = category_obj.browse(cursor, user, category_ids,
+                    context=context)
+            category_names2ids = {}
+            for category in categories:
+                category_names2ids[category.name] = category.id
+            for category in vevent.categories.value:
+                if category not in category_names2ids:
+                    category_ids.append(category_obj.create(cursor, user, {
+                        'name': category,
+                        }, context=context))
+            res['categories'] = [('set', category_ids)]
+        else:
+            res['categories'] = [('unlink_all',)]
+        if hasattr(vevent, 'class'):
+            if getattr(vevent, 'class').value.lower() in \
+                    dict(self.classification.selection):
+                res['classification'] = getattr(vevent, 'class').value.lower()
+            else:
+                res['classification'] = 'public'
+        else:
+            res['classification'] = 'public'
+        if hasattr(vevent, 'location'):
+            ctx = context.copy()
+            ctx['active_test'] = False
+            location_ids = location_obj.search(cursor, user, [
+                ('name', '=', vevent.location.value),
+                ], limit=1, context=ctx)
+            if not location_ids:
+                location_id = location_obj.create(cursor, user, {
+                    'name': vevent.location.value,
+                    }, context=context)
+            else:
+                location_id = location_ids[0]
+            res['location'] = location_id
+        else:
+            res['location'] = False
+
+        res['calendar'] = calendar_id
+
+        if hasattr(vevent, 'transp'):
+            res['transp'] = vevent.transp.value.lower()
+        else:
+            res['transp'] = 'opaque'
+
+        if hasattr(vevent, 'organizer'):
+            if vevent.organizer.value.lower().startswith('mailto:'):
+                res['organizer'] = vevent.organizer.value[7:]
+            else:
+                res['organizer'] = vevent.organizer.value
+        else:
+            res['organizer'] = False
+
+        attendees_todel = {}
+        if event:
+            for attendee in event.attendees:
+                attendees_todel[attendee.email] = attendee.id
+        res['attendees'] = []
+        if hasattr(vevent, 'attendee'):
+            while vevent.attendee_list:
+                attendee = vevent.attendee_list.pop()
+                vals = attendee_obj.attendee2values(cursor, user, attendee,
+                        context=context)
+                if vals['email'] in attendees_todel:
+                    res['attendees'].append(('write',
+                        attendees_todel[vals['email']], vals))
+                    del attendees_todel[vals['email']]
+                else:
+                    res['attendees'].append(('create', vals))
+        res['attendees'].append(('delete', attendees_todel.values()))
+
+        res['rdates'] = []
+        if event:
+            res['rdates'].append(('delete', [x.id for x in event.rdates]))
+        if hasattr(vevent, 'rdate'):
+            while vevent.rdate_list:
+                rdate = vevent.rdate_list.pop()
+                for date in rdate.value:
+                    vals = rdate_obj.date2values(cursor, user, date,
+                            context=context)
+                    res['rdates'].append(('create', vals))
+
+        res['exdates'] = []
+        if event:
+            res['exdates'].append(('delete', [x.id for x in event.exdates]))
+        if hasattr(vevent, 'exdate'):
+            while vevent.exdate_list:
+                exdate = vevent.exdate_list.pop()
+                for date in exdate.value:
+                    vals = exdate_obj.date2values(cursor, user, date,
+                            context=context)
+                    res['exdates'].append(('create', vals))
+
+        res['rrules'] = []
+        if event:
+            res['rrules'].append(('delete', [x.id for x in event.rrules]))
+        if hasattr(vevent, 'rrule'):
+            while vevent.rrule_list:
+                rrule = vevent.rrule_list.pop()
+                vals = rrule_obj.rule2values(cursor, user, rrule,
+                        context=context)
+                res['rrules'].append(('create', vals))
+
+        res['exrules'] = []
+        if event:
+            res['exrules'].append(('delete', [x.id for x in event.exrules]))
+        if hasattr(vevent, 'exrule'):
+            while vevent.exrule_list:
+                exrule = vevent.exrule_list.pop()
+                vals = exrule_obj.rule2values(cursor, user, exrule,
+                        context=context)
+                res['exrules'].append(('create', vals))
+
+        if event:
+            res.setdefault('alarms', [])
+            res['alarms'].append(('delete', [x.id for x in event.alarms]))
+        if hasattr(vevent, 'valarm'):
+            res.setdefault('alarms', [])
+            while vevent.valarm_list:
+                valarm = vevent.valarm_list.pop()
+                vals = alarm_obj.valarm2values(cursor, user, valarm,
+                        context=context)
+                res['alarms'].append(('create', vals))
+
+        if hasattr(ical, 'vtimezone'):
+            if ical.vtimezone.tzid.value in pytz.common_timezones:
+                res['timezone'] = ical.vtimezone.tzid.value
+            else:
+                for timezone in pytz.common_timezones:
+                    if ical.vtimezone.tzid.value.endswith(timezone):
+                        res['timezone'] = timezone
+
+        res['vevent'] = vevent.serialize()
+
+        occurences_todel = []
+        if event:
+            occurences_todel = [x.id for x in event.occurences]
+        for vevent in vevents:
+            event_id = None
+            if event:
+                for occurence in event.occurences:
+                    if occurence.recurrence.replace(tzinfo=tzlocal) \
+                            == vevent.recurrence_id.value:
+                        event_id = occurence.id
+                        occurences_todel.remove(occurence.id)
+            vals = self.ical2values(cursor, user, event_id, ical,
+                    calendar_id, vevent=vevent, context=context)
+            if event:
+                vals['uuid'] = event.uuid
+            else:
+                vals['uuid'] = res['uuid']
+            res.setdefault('occurences', [])
+            if event_id:
+                res['occurences'].append(('write', event_id, vals))
+            else:
+                res['occurences'].append(('create', vals))
+        if occurences_todel:
+            res.setdefault('occurences', [])
+            res['occurences'].append(('delete', occurences_todel))
+        return res
+
+    def event2ical(self, cursor, user, event, context=None):
+        '''
+        Return an iCalendar instance of vobject for event
+
+        :param cursor: the database cursor
+        :param user: the user id
+        :param event: a BrowseRecord of calendar.event
+            or a calendar.event id
+        :param calendar: a BrowseRecord of calendar.calendar
+            or a calendar.calendar id
+        :param context: the context
+        :return: an iCalendar instance of vobject
+        '''
+        user_obj = self.pool.get('res.user')
+        alarm_obj = self.pool.get('calendar.event.alarm')
+        attendee_obj = self.pool.get('calendar.event.attendee')
+        rdate_obj = self.pool.get('calendar.event.rdate')
+        exdate_obj = self.pool.get('calendar.event.exdate')
+        rrule_obj = self.pool.get('calendar.event.rrule')
+        exrule_obj = self.pool.get('calendar.event.exrule')
+
+        if isinstance(event, (int, long)):
+            event = self.browse(cursor, user, event, context=context)
+
+        user_ = user_obj.browse(cursor, user, user, context=context)
+        if event.timezone:
+            tzevent = pytz.timezone(event.timezone)
+        elif user_.timezone:
+                tzevent = pytz.timezone(user_.timezone)
+        else:
+            tzevent = tzlocal
+
+        ical = vobject.iCalendar()
+        vevent = ical.add('vevent')
+        if event.vevent:
+            ical.vevent = vobject.readOne(event.vevent)
+            vevent = ical.vevent
+            ical.vevent.transformToNative()
+        if event.summary:
+            if not hasattr(vevent, 'summary'):
+                vevent.add('summary')
+            vevent.summary.value = event.summary
+        elif hasattr(vevent, 'summary'):
+            del vevent.summary
+        if event.description:
+            if not hasattr(vevent, 'description'):
+                vevent.add('description')
+            vevent.description.value = event.description
+        elif hasattr(vevent, 'description'):
+            del vevent.description
+        if not hasattr(vevent, 'dtstart'):
+            vevent.add('dtstart')
+        if event.all_day:
+            vevent.dtstart.value = event.dtstart.date()
+        else:
+            vevent.dtstart.value = event.dtstart.replace(tzinfo=tzlocal)\
+                    .astimezone(tzevent)
+        if event.dtend:
+            if not hasattr(vevent, 'dtend'):
+                vevent.add('dtend')
+            if event.all_day:
+                vevent.dtend.value = event.dtend.date()
+            else:
+                vevent.dtend.value = event.dtend.replace(tzinfo=tzlocal)\
+                        .astimezone(tzevent)
+        elif hasattr(vevent, 'dtend'):
+            del vevent.dtend
+        if not hasattr(vevent, 'created'):
+            vevent.add('created')
+        vevent.created.value = event.create_date.replace(tzinfo=tzlocal)
+        if not hasattr(vevent, 'dtstamp'):
+            vevent.add('dtstamp')
+        date = event.write_date or event.create_date
+        vevent.dtstamp.value = date.replace(tzinfo=tzlocal)
+        if not hasattr(vevent, 'last-modified'):
+            vevent.add('last-modified')
+        vevent.last_modified.value = date.replace(tzinfo=tzlocal)
+        if event.recurrence:
+            if not hasattr(vevent, 'recurrence-id'):
+                vevent.add('recurrence-id')
+            if event.all_day:
+                vevent.recurrence_id.value = event.recurrence.date()
+            else:
+                vevent.recurrence_id.value = event.recurrence\
+                        .replace(tzinfo=tzlocal).astimezone(tzevent)
+        if event.status:
+            if not hasattr(vevent, 'status'):
+                vevent.add('status')
+            vevent.status.value = event.status.upper()
+        elif hasattr(vevent, 'status'):
+            del vevent.status
+        if not hasattr(vevent, 'uid'):
+            vevent.add('uid')
+        vevent.uid.value = event.uuid
+        if not hasattr(vevent, 'sequence'):
+            vevent.add('sequence')
+        vevent.sequence.value = str(event.sequence) or '0'
+        if event.categories:
+            if not hasattr(vevent, 'categories'):
+                vevent.add('categories')
+            vevent.categories.value = [x.name for x in event.categories]
+        elif hasattr(vevent, 'categories'):
+            del vevent.categories
+        if not hasattr(vevent, 'class'):
+            vevent.add('class')
+            getattr(vevent, 'class').value = event.classification.upper()
+        elif getattr(vevent, 'class').value.lower() in \
+                dict(self.classification.selection):
+            getattr(vevent, 'class').value = event.classification.upper()
+        if event.location:
+            if not hasattr(vevent, 'location'):
+                vevent.add('location')
+            vevent.location.value = event.location.name
+        elif hasattr(vevent, 'location'):
+            del vevent.location
+
+        if event.organizer:
+            if not hasattr(vevent, 'organizer'):
+                vevent.add('organizer')
+            vevent.organizer.value = 'MAILTO:' + event.organizer
+        elif hasattr(vevent, 'organizer'):
+            del vevent.organizer
+
+        vevent.attendee_list = []
+        for attendee in event.attendees:
+            vevent.attendee_list.append(attendee_obj.attendee2attendee(
+                cursor, user, attendee, context=context))
+
+        if event.rdates:
+            vevent.add('rdate')
+            vevent.rdate.value = []
+            for rdate in event.rdates:
+                vevent.rdate.value.append(rdate_obj.date2date(cursor, user,
+                    rdate, context=context))
+
+        if event.exdates:
+            vevent.add('exdate')
+            vevent.exdate.value = []
+            for exdate in event.exdates:
+                vevent.exdate.value.append(exdate_obj.date2date(cursor, user,
+                    exdate, context=context))
+
+        if event.rrules:
+            for rrule in event.rrules:
+                vevent.add('rrule').value = rrule_obj.rule2rule(cursor, user,
+                        rrule, context=context)
+
+        if event.exrules:
+            for exrule in event.exrules:
+                vevent.add('exrule').value = exrule_obj.rule2rule(cursor, user,
+                        exrule, context=context)
+
+        vevent.valarm_list = []
+        for alarm in event.alarms:
+            valarm = alarm_obj.alarm2valarm(cursor, user, alarm,
+                    context=context)
+            if valarm:
+                vevent.valarm_list.append(valarm)
+
+        for occurence in event.occurences:
+            oical = self.event2ical(cursor, user, occurence, context=context)
+            ical.vevent_list.append(oical.vevent)
+        return ical
+
+Event()
+
+
+class EventCategory(ModelSQL):
+    'Event - Category'
+    _description = __doc__
+    _name = 'calendar.event-calendar.category'
+
+    event = fields.Many2One('calendar.event', 'Event', ondelete='CASCADE',
+            required=True, select=1)
+    category = fields.Many2One('calendar.category', 'Category',
+            ondelete='CASCADE', required=True, select=1)
+
+EventCategory()
+
+
+class Alarm(ModelSQL):
+    'Alarm'
+    _description = __doc__
+    _name = 'calendar.alarm'
+
+    valarm = fields.Binary('valarm')
+
+    def valarm2values(self, cursor, user, valarm, context=None):
+        '''
+        Convert a valarm object into values for create or write
+
+        :param cursor: the database cursor
+        :param user: the user id
+        :param valarm: the valarm object
+        :param context: the context
+        :return: a dictionary with values
+        '''
+        res = {}
+        res['valarm'] = valarm.serialize()
+        return res
+
+    def alarm2valarm(self, cursor, user, alarm, context=None):
+        '''
+        Return a valarm instance of vobject for alarm
+
+        :param cursor: the database cursor
+        :param user: the user id
+        :param alarm: a BrowseRecord of calendar.event.alarm
+        :param context: the context
+        :return: a valarm instance of vobject
+        '''
+        valarm = None
+        if alarm.valarm:
+            valarm = vobject.readOne(alarm.valarm)
+        return valarm
+
+Alarm()
+
+
+class EventAlarm(ModelSQL):
+    'Alarm'
+    _description = __doc__
+    _name = 'calendar.event.alarm'
+    _inherits = {'calendar.alarm': 'calendar_alarm'}
+
+    calendar_alarm = fields.Many2One('calendar.alarm', 'Calendar Alarm',
+            required=True, ondelete='CASCADE', select=1)
+    event = fields.Many2One('calendar.event', 'Event', ondelete='CASCADE',
+            required=True, select=1)
+
+    def create(self, cursor, user, values, context=None):
+        event_obj = self.pool.get('calendar.event')
+        if values.get('event'):
+            # Update write_date of event
+            event_obj.write(cursor, user, values['event'], {}, context=context)
+        return super(EventAlarm, self).create(cursor, user, values, context=context)
+
+    def write(self, cursor, user, ids, values, context=None):
+        event_obj = self.pool.get('calendar.event')
+        if isinstance(ids, (int, long)):
+            ids = [ids]
+        event_ids = [x.event.id for x in self.browse(cursor, user, ids,
+            context=context)]
+        if values.get('event'):
+            event_ids.append(values['event'])
+        if event_ids:
+            # Update write_date of event
+            event_obj.write(cursor, user, event_ids, {}, context=context)
+        return super(EventAlarm, self).write(cursor, user, ids, values,
+                context=context)
+
+    def delete(self, cursor, user, ids, context=None):
+        event_obj = self.pool.get('calendar.event')
+        alarm_obj = self.pool.get('calendar.alarm')
+        if isinstance(ids, (int, long)):
+            ids = [ids]
+        event_alarms = self.browse(cursor, user, ids, context=context)
+        alarm_ids = [a.calendar_alarm.id for a in event_alarms]
+        event_ids = [x.event.id for x in event_alarms]
+        if event_ids:
+            # Update write_date of event
+            event_obj.write(cursor, user, event_ids, {}, context=context)
+        res = super(EventAlarm, self).delete(cursor, user, ids, context=context)
+        if alarm_ids:
+            alarm_obj.delete(cursor, user, alarm_ids, context=context)
+        return res
+
+    def valarm2values(self, cursor, user, alarm, context=None):
+        alarm_obj = self.pool.get('calendar.alarm')
+        return alarm_obj.valarm2values(cursor, user, alarm, context=context)
+
+    def alarm2valarm(self, cursor, user, alarm, context=None):
+        alarm_obj = self.pool.get('calendar.alarm')
+        return alarm_obj.alarm2valarm(cursor, user, alarm, context=context)
+
+EventAlarm()
+
+
+class Attendee(ModelSQL, ModelView):
+    'Attendee'
+    _description = __doc__
+    _name = 'calendar.attendee'
+
+    email = fields.Char('Email', required=True, states={
+        'readonly': 'active_id > 0',
+        })
+    status = fields.Selection([
+        ('', ''),
+        ('needs-action', 'Needs Action'),
+        ('accepted', 'Accepted'),
+        ('declined', 'Declined'),
+        ('tentative', 'Tentative'),
+        ('delegated', 'Delegated'),
+        ], 'Participation Status')
+    attendee = fields.Binary('attendee')
+
+    def default_status(self, cursor, user, context=None):
+        return ''
+
+    def _attendee2update(self, cursor, user, attendee, context=None):
+        res = {}
+        res['status'] = attendee.status
+        return res
+
+    def attendee2values(self, cursor, user, attendee, context=None):
+        '''
+        Convert a attendee object into values for create or write
+
+        :param cursor: the database cursor
+        :param user: the user id
+        :param attendee: the attendee object
+        :param context: the context
+        :return: a dictionary with values
+        '''
+        res = {}
+        if attendee.value.lower().startswith('mailto:'):
+            res['email'] = attendee.value[7:]
+        else:
+            res['email'] = attendee.value
+        res['status'] = ''
+        if hasattr(attendee, 'partstat_param'):
+            if attendee.partstat_param.lower() in dict(self.status.selection):
+                res['status'] = attendee.partstat_param.lower()
+        res['attendee'] = attendee.serialize()
+        return res
+
+    def attendee2attendee(self, cursor, user, attendee, context=None):
+        '''
+        Return a attendee instance of vobject for attendee
+
+        :param cursor: the database cursor
+        :param user: the user id
+        :param attendee: a BrowseRecord of calendar.event.attendee
+        :param context: the context
+        :return: a attendee instance of vobject
+        '''
+        res = None
+        if attendee.attendee:
+            res = vobject.base.textLineToContentLine(
+                    attendee.attendee.replace('\r\n ', ''))
+        else:
+            res = vobject.base.ContentLine('ATTENDEE', [], '')
+
+        if attendee.status:
+            if hasattr(res, 'partstat_param'):
+                if res.partstat_param.lower() in dict(self.status.selection):
+                    res.partstat_param = attendee.status.upper()
+            else:
+                res.partstat_param = attendee.status.upper()
+        elif hasattr(res, 'partstat_param'):
+            if res.partstat_param.lower() in dict(self.status.selection):
+                del res.partstat_param
+
+        res.value = 'MAILTO:' + attendee.email
+        return res
+
+Attendee()
+
+
+class EventAttendee(ModelSQL, ModelView):
+    'Attendee'
+    _description = __doc__
+    _name = 'calendar.event.attendee'
+    _inherits = {'calendar.attendee': 'calendar_attendee'}
+
+    calendar_attendee = fields.Many2One('calendar.attendee',
+            'Calendar Attendee', required=True, ondelete='CASCADE', select=1)
+    event = fields.Many2One('calendar.event', 'Event', ondelete='CASCADE',
+            required=True, select=1)
+
+    def create(self, cursor, user, values, context=None):
+        event_obj = self.pool.get('calendar.event')
+        if values.get('event'):
+            # Update write_date of event
+            event_obj.write(cursor, user, values['event'], {}, context=context)
+        res = super(EventAttendee, self).create(cursor, user, values,
+                context=context)
+        attendee = self.browse(cursor, user, res, context=context)
+        event = attendee.event
+        if event.calendar.owner \
+                and (event.organizer == event.calendar.owner.email \
+                or (event.parent \
+                and event.parent.organizer == event.parent.calendar.owner.email)):
+            if event.organizer == event.calendar.owner.email:
+                attendee_emails = [x.email for x in event.attendees
+                        if x.email != event.organizer]
+            else:
+                attendee_emails = [x.email for x in event.parent.attendees
+                        if x.email != event.parent.organizer]
+            if attendee_emails:
+                event_ids = event_obj.search(cursor, 0, [
+                    ('uuid', '=', event.uuid),
+                    ('calendar.owner.email', 'in', attendee_emails),
+                    ('id', '!=', event.id),
+                    ('recurrence', '=', event.recurrence or False),
+                    ], context=context)
+                for event_id in event_ids:
+                    self.copy(cursor, 0, res, default={
+                        'event': event_id,
+                        }, context=context)
+        return res
+
+    def write(self, cursor, user, ids, values, context=None):
+        event_obj = self.pool.get('calendar.event')
+        if isinstance(ids, (int, long)):
+            ids = [ids]
+        event_ids = [x.event.id for x in self.browse(cursor, user, ids,
+            context=context)]
+        if values.get('event'):
+            event_ids.append(values['event'])
+        if event_ids:
+            # Update write_date of event
+            event_obj.write(cursor, user, event_ids, {}, context=context)
+
+        if 'email' in values:
+            values = values.copy()
+            del values['email']
+
+        res = super(EventAttendee, self).write(cursor, user, ids, values,
+                context=context)
+        attendees = self.browse(cursor, user, ids, context=context)
+        for attendee in attendees:
+            event = attendee.event
+            if event.calendar.owner \
+                    and (event.organizer == event.calendar.owner.email \
+                    or (event.parent \
+                    and event.parent.organizer == event.calendar.owner.email)):
+                if event.organizer == event.calendar.owner.email:
+                    attendee_emails = [x.email for x in event.attendees
+                            if x.email != event.organizer]
+                else:
+                    attendee_emails = [x.email for x in event.parent.attendees
+                            if x.email != event.parent.organizer]
+                if attendee_emails:
+                    attendee_ids = self.search(cursor, 0, [
+                        ('event.uuid', '=', event.uuid),
+                        ('event.calendar.owner.email', 'in', attendee_emails),
+                        ('id', '!=', attendee.id),
+                        ('event.recurrence', '=', event.recurrence or False),
+                        ('email', '=', attendee.email),
+                        ], context=context)
+                    self.write(cursor, 0, attendee_ids, self._attendee2update(
+                        cursor, user, attendee, context=context), context=context)
+        return res
+
+    def delete(self, cursor, user, ids, context=None):
+        event_obj = self.pool.get('calendar.event')
+        attendee_obj = self.pool.get('calendar.attendee')
+
+        if isinstance(ids, (int, long)):
+            ids = [ids]
+        event_attendees = self.browse(cursor, user, ids, context=context)
+        calendar_attendee_ids = [a.calendar_attendee.id \
+                for a in event_attendees]
+        event_ids = [x.event.id for x in event_attendees]
+        if event_ids:
+            # Update write_date of event
+            event_obj.write(cursor, user, event_ids, {}, context=context)
+
+        for attendee in self.browse(cursor, user, ids, context=context):
+            event = attendee.event
+            if event.calendar.owner \
+                    and (event.organizer == event.calendar.owner.email \
+                    or (event.parent \
+                    and event.parent.organizer == event.calendar.owner.email)):
+                if event.organizer == event.calendar.owner.email:
+                    attendee_emails = [x.email for x in event.attendees
+                            if x.email != event.organizer]
+                else:
+                    attendee_emails = [x.email for x in event.parent.attendees
+                            if x.email != event.parent.organizer]
+                if attendee_emails:
+                    attendee_ids = self.search(cursor, 0, [
+                        ('event.uuid', '=', event.uuid),
+                        ('event.calendar.owner.email', 'in', attendee_emails),
+                        ('id', '!=', attendee.id),
+                        ('event.recurrence', '=', event.recurrence or False),
+                        ('email', '=', attendee.email),
+                        ], context=context)
+                    self.delete(cursor, 0, attendee_ids, context=context)
+            elif event.calendar.owner \
+                    and ((event.organizer \
+                    or (event.parent and event.parent.organizer)) \
+                    and attendee.email == event.calendar.owner.email):
+                if event.organizer:
+                    organizer = event.organizer
+                else:
+                    organizer = event.parent.organizer
+                attendee_ids = self.search(cursor, 0, [
+                    ('event.uuid', '=', event.uuid),
+                    ('event.calendar.owner.email', '=', organizer),
+                    ('id', '!=', attendee.id),
+                    ('event.recurrence', '=', event.recurrence or False),
+                    ('email', '=', attendee.email),
+                    ], context=context)
+                if attendee_ids:
+                    self.write(cursor, 0, attendee_ids, {
+                        'status': 'declined',
+                        }, context=context)
+        res = super(EventAttendee, self).delete(cursor, user, ids, context=context)
+        if calendar_attendee_ids:
+            attendee_obj.delete(cursor, user, calendar_attendee_ids,
+                    context=context)
+        return res
+
+    def _attendee2update(self, cursor, user, attendee, context=None):
+        attendee_obj = self.pool.get('calendar.attendee')
+        return attendee_obj._attendee2update(cursor, user, attendee,
+                context=context)
+
+    def attendee2values(self, cursor, user, attendee, context=None):
+        attendee_obj = self.pool.get('calendar.attendee')
+        return attendee_obj.attendee2values(cursor, user, attendee,
+                context=context)
+
+    def attendee2attendee(self, cursor, user, attendee, context=None):
+        attendee_obj = self.pool.get('calendar.attendee')
+        return attendee_obj.attendee2attendee(cursor, user, attendee,
+                context=context)
+
+EventAttendee()
+
+
+class RDate(ModelSQL, ModelView):
+    'Recurrence Date'
+    _description = __doc__
+    _name = 'calendar.rdate'
+    _rec_name = 'datetime'
+
+    date = fields.Boolean('Is Date', help='Ignore time of field "Date", ' \
+            'but handle as date only.')
+    datetime = fields.DateTime('Date', required=True)
+
+    def _date2update(self, cursor, user, date, context=None):
+        res = {}
+        res['date'] = date.date
+        res['datetime'] = date.datetime
+        return res
+
+    def date2values(self, cursor, user, date, context=None):
+        '''
+        Convert a date object into values for create or write
+
+        :param cursor: the database cursor
+        :param user: the user id
+        :param date: the date object
+        :param context: the context
+        :return: a dictionary with values
+        '''
+        res = {}
+        if not isinstance(date, datetime.datetime):
+            res['date'] = True
+            res['datetime'] = datetime.datetime.combine(date,
+                    datetime.time())
+        else:
+            res['date'] = False
+            if date.tzinfo:
+                res['datetime'] = date.astimezone(tzlocal)
+            else:
+                res['datetime'] = date
+        return res
+
+    def date2date(self, cursor, user, date, context=None):
+        '''
+        Return a datetime for date
+
+        :param cursor: the database cursor
+        :param user: the user id
+        :param date: a BrowseRecord of calendar.rdate or
+            calendar.exdate
+        :param context: the context
+        :return: a datetime
+        '''
+        if date.date:
+            res = date.datetime.date()
+        else:
+            # Convert to UTC as sunbird doesn't handle tzid
+            res = date.datetime.replace(tzinfo=tzlocal).astimezone(tzutc)
+        return res
+
+RDate()
+
+
+class EventRDate(ModelSQL, ModelView):
+    'Recurrence Date'
+    _description = __doc__
+    _name = 'calendar.event.rdate'
+    _inherits = {'calendar.rdate': 'calendar_rdate'}
+    _rec_name = 'datetime'
+
+    calendar_rdate = fields.Many2One('calendar.rdate', 'Calendar RDate',
+            required=True, ondelete='CASCADE', select=1)
+    event = fields.Many2One('calendar.event', 'Event', ondelete='CASCADE',
+            select=1, required=True)
+
+    def create(self, cursor, user, values, context=None):
+        event_obj = self.pool.get('calendar.event')
+        if values.get('event'):
+            # Update write_date of event
+            event_obj.write(cursor, user, values['event'], {}, context=context)
+        return super(EventRDate, self).create(cursor, user, values,
+                context=context)
+
+    def write(self, cursor, user, ids, values, context=None):
+        event_obj = self.pool.get('calendar.event')
+        if isinstance(ids, (int, long)):
+            ids = [ids]
+        event_ids = [x.event.id for x in self.browse(cursor, user, ids,
+            context=context)]
+        if values.get('event'):
+            event_ids.append(values['event'])
+        if event_ids:
+            # Update write_date of event
+            event_obj.write(cursor, user, event_ids, {}, context=context)
+        return super(EventRDate, self).write(cursor, user, ids, values,
+                context=context)
+
+    def delete(self, cursor, user, ids, context=None):
+        event_obj = self.pool.get('calendar.event')
+        rdate_obj = self.pool.get('calendar.rdate')
+        if isinstance(ids, (int, long)):
+            ids = [ids]
+        event_rdates = self.browse(cursor, user, ids, context=context)
+        rdate_ids = [a.calendar_rdate.id for a in event_rdates]
+        event_ids = [x.event.id for x in event_rdates]
+        if event_ids:
+            # Update write_date of event
+            event_obj.write(cursor, user, event_ids, {}, context=context)
+        res = super(EventRDate, self).delete(cursor, user, ids, context=context)
+        if rdate_ids:
+            rdate_obj.delete(cursor, user, rdate_ids, context=context)
+        return res
+
+    def _date2update(self, cursor, user, date, context=None):
+        date_obj = self.pool.get('calendar.rdate')
+        return date_obj._date2update(cursor, user, date, context=context)
+
+    def date2values(self, cursor, user, date, context=None):
+        date_obj = self.pool.get('calendar.rdate')
+        return date_obj.date2values(cursor, user, date, context=context)
+
+    def date2date(self, cursor, user, date, context=None):
+        date_obj = self.pool.get('calendar.rdate')
+        return date_obj.date2date(cursor, user, date, context=context)
+
+EventRDate()
+
+
+class EventExDate(EventRDate):
+    'Exception Date'
+    _description = __doc__
+    _name = 'calendar.event.exdate'
+
+EventExDate()
+
+
+class RRule(ModelSQL, ModelView):
+    'Recurrence Rule'
+    _description = __doc__
+    _name = 'calendar.rrule'
+    _rec_name = 'freq'
+
+    freq = fields.Selection([
+        ('secondly', 'Secondly'),
+        ('minutely', 'Minutely'),
+        ('hourly', 'Hourly'),
+        ('daily', 'Daily'),
+        ('weekly', 'Weekly'),
+        ('monthly', 'Monthly'),
+        ('yearly', 'Yearly'),
+        ], 'Frequency', required=True)
+    until_date = fields.Boolean('Is Date', help='Ignore time of field ' \
+            '"Until Date", but handle as date only.')
+    until = fields.DateTime('Until Date')
+    count = fields.Integer('Count')
+    interval = fields.Integer('Interval')
+    bysecond = fields.Char('By Second')
+    byminute = fields.Char('By Minute')
+    byhour = fields.Char('By Hour')
+    byday = fields.Char('By Day')
+    bymonthday = fields.Char('By Month Day')
+    byyearday = fields.Char('By Year Day')
+    byweekno = fields.Char('By Week Number')
+    bymonth = fields.Char('By Month')
+    bysetpos = fields.Char('By Position')
+    wkst = fields.Selection([
+        ('su', 'Sunday'),
+        ('mo', 'Monday'),
+        ('tu', 'Tuesday'),
+        ('we', 'Wednesday'),
+        ('th', 'Thursday'),
+        ('fr', 'Friday'),
+        ('sa', 'Saturday'),
+        ], 'Week Day', sort=False)
+
+    def __init__(self):
+        super(RRule, self).__init__()
+        self._sql_constraints += [
+            ('until_count',
+                'CHECK(until IS NULL OR count IS NULL)',
+                'Only one of "until" and "count" can be set!'),
+        ]
+        self._constraints += [
+            ('check_bysecond', 'invalid_bysecond'),
+            ('check_byminute', 'invalid_byminute'),
+            ('check_byhour', 'invalid_byhour'),
+            ('check_byday', 'invalid_byday'),
+            ('check_bymonthday', 'invalid_bymonthday'),
+            ('check_byyearday', 'invalid_byyearday'),
+            ('check_byweekno', 'invalid_byweekno'),
+            ('check_bymonth', 'invalid_bymonth'),
+            ('check_bysetpos', 'invalid_bysetpos'),
+        ]
+        self._error_messages.update({
+            'invalid_bysecond': 'Invalid "By Second"',
+            'invalid_byminute': 'Invalid "By Minute"',
+            'invalid_byhour': 'Invalid "By Hour"',
+            'invalid_byday': 'Invalid "By Day"',
+            'invalid_bymonthday': 'Invalid "By Month Day"',
+            'invalid_byyearday': 'Invalid "By Year Day"',
+            'invalid_byweekno': 'Invalid "By Week Number"',
+            'invalid_bymonth': 'Invalid "By Month"',
+            'invalid_bysetpos': 'Invalid "By Position"',
+        })
+
+    def check_bysecond(self, cursor, user, ids):
+        for rule in self.browse(cursor, user, ids):
+            if not rule.bysecond:
+                continue
+            for second in rule.bysecond.split(','):
+                try:
+                    second = int(second)
+                except:
+                    return False
+                if not (second >= 0 and second <= 59):
+                    return False
+        return True
+
+    def check_byminute(self, cursor, user, ids):
+        for rule in self.browse(cursor, user, ids):
+            if not rule.byminute:
+                continue
+            for minute in rule.byminute.split(','):
+                try:
+                    minute = int(minute)
+                except:
+                    return False
+                if not (minute >= 0 and minute <= 59):
+                    return False
+        return True
+
+    def check_byhour(self, cursor, user, ids):
+        for rule in self.browse(cursor, user, ids):
+            if not rule.byhour:
+                continue
+            for hour in rule.byhour.split(','):
+                try:
+                    hour = int(hour)
+                except:
+                    return False
+                if not (hour >= 0 and hour <= 23):
+                    return False
+        return True
+
+    def check_byday(self, cursor, user, ids):
+        for rule in self.browse(cursor, user, ids):
+            if not rule.byday:
+                continue
+            for weekdaynum in rule.byday.split(','):
+                weekday = weekdaynum[-2:]
+                if weekday not in ('SU', 'MO', 'TU', 'WE', 'TH', 'FR', 'SA'):
+                    return False
+                ordwk = weekday[:-2]
+                if not ordwk:
+                    continue
+                try:
+                    ordwk = int(ordwk)
+                except:
+                    return False
+                if not (abs(ordwk) >= 1 and abs(ordwk) <= 53):
+                    return False
+        return True
+
+    def check_bymonthday(self, cursor, user, ids):
+        for rule in self.browse(cursor, user, ids):
+            if not rule.bymonthday:
+                continue
+            for monthdaynum in rule.bymonthday.split(','):
+                try:
+                    monthdaynum = int(monthdaynum)
+                except:
+                    return False
+                if not (abs(monthdaynum) >= 1 and abs(monthdaynum) <= 31):
+                    return False
+        return True
+
+    def check_byyearday(self, cursor, user, ids):
+        for rule in self.browse(cursor, user, ids):
+            if not rule.byyearday:
+                continue
+            for yeardaynum in rule.byyearday.split(','):
+                try:
+                    yeardaynum = int(yeardaynum)
+                except:
+                    return False
+                if not (abs(yeardaynum) >= 1 and abs(yeardaynum) <= 366):
+                    return False
+        return True
+
+    def check_byweekno(self, cursor, user, ids):
+        for rule in self.browse(cursor, user, ids):
+            if not rule.byweekno:
+                continue
+            for weeknum in rule.byweekno.split(','):
+                try:
+                    weeknum = int(weeknum)
+                except:
+                    return False
+                if not (abs(weeknum) >= 1 and abs(weeknum) <= 53):
+                    return False
+        return True
+
+    def check_bymonth(self, cursor, user, ids):
+        for rule in self.browse(cursor, user, ids):
+            if not rule.bymonth:
+                continue
+            for monthnum in rule.bymonth.split(','):
+                try:
+                    monthnum = int(monthnum)
+                except:
+                    return False
+                if not (monthnum >= 1 and monthnum <= 12):
+                    return False
+        return True
+
+    def check_bysetpos(self, cursor, user, ids):
+        for rule in self.browse(cursor, user, ids):
+            if not rule.bysetpos:
+                continue
+            for setposday in rule.bysetpos.split(','):
+                try:
+                    setposday = int(setposday)
+                except:
+                    return False
+                if not (abs(setposday) >= 1 and abs(setposday) <= 366):
+                    return False
+        return True
+
+    def _rule2update(self, cursor, user, rule, context=None):
+        res = {}
+        for field in ('freq', 'until_date', 'until', 'count', 'interval',
+                'bysecond', 'byminute', 'byhour', 'byday', 'bymonthday',
+                'byyearday', 'byweekno', 'bymonth', 'bysetpos', 'wkst'):
+            res[field] = rule[field]
+        return res
+
+    def rule2values(self, cursor, user, rule, context=None):
+        '''
+        Convert a rule object into values for create or write
+
+        :param cursor: the database cursor
+        :param user: the user id
+        :param rule: teh rule object
+        :param context: the context
+        :return: a dictionary with values
+        '''
+        res = {}
+        for attr in str(rule.value).replace('\\', '').split(';'):
+            field, value = attr.split('=')
+            field = field.lower()
+            if field == 'until':
+                try:
+                    value = vobject.icalendar.stringToDateTime(value)
+                except:
+                    value = vobject.icalendar.stringToDate(value)
+                if not isinstance(value, datetime.datetime):
+                    res['until_date'] = True
+                    res['until'] = datetime.datetime.combine(value,
+                            datetime.time())
+                else:
+                    res['until_date'] = False
+                    if value.tzinfo:
+                        res['until'] = value.astimezone(tzlocal)
+                    else:
+                        res['until'] = value
+            elif field in ('freq', 'wkst'):
+                res[field] = value.lower()
+            else:
+                res[field] = value
+        return res
+
+    def rule2rule(self, cursor, user, rule, context=None):
+        '''
+        Return a rule string for rule
+
+        :param cursor: the database cursor
+        :param user: the user id
+        :param rule: a BrowseRecord of calendar.rrule or
+            calendar.exrule
+        :param context: the context
+        :return: a string
+        '''
+        res = 'FREQ=' + rule.freq.upper()
+        if rule.until:
+            res += ';UNTIL='
+            if rule.until_date:
+                res += vobject.icalendar.dateToString(rule.until.date())
+            else:
+                res += vobject.icalendar.dateTimeToString(rule.until\
+                        .replace(tzinfo=tzlocal).astimezone(utc),
+                        convertToUTC=True)
+        elif rule.count:
+            res += ';COUNT=' + str(rule.count)
+        for field in ('freq', 'wkst'):
+            if rule[field]:
+                res += ';' + field.upper() + '=' + rule[field].upper()
+        for field in ('interval', 'bysecond', 'byminute', 'byhour',
+                'byday', 'bymonthday', 'byyearday', 'byweekno',
+                'bymonth', 'bysetpos'):
+            if rule[field]:
+                res += ';' + field.upper() + '=' + str(rule[field])
+        return res
+
+RRule()
+
+
+class EventRRule(ModelSQL, ModelView):
+    'Recurrence Rule'
+    _description = __doc__
+    _name = 'calendar.event.rrule'
+    _inherits = {'calendar.rrule': 'calendar_rrule'}
+    _rec_name = 'freq'
+
+    calendar_rrule = fields.Many2One('calendar.rrule', 'Calendar RRule',
+            required=True, ondelete='CASCADE', select=1)
+    event = fields.Many2One('calendar.event', 'Event', ondelete='CASCADE',
+            select=1, required=True)
+
+
+    def create(self, cursor, user, values, context=None):
+        event_obj = self.pool.get('calendar.event')
+        if values.get('event'):
+            # Update write_date of event
+            event_obj.write(cursor, user, values['event'], {}, context=context)
+        return super(EventRRule, self).create(cursor, user, values, context=context)
+
+    def write(self, cursor, user, ids, values, context=None):
+        event_obj = self.pool.get('calendar.event')
+        if isinstance(ids, (int, long)):
+            ids = [ids]
+        event_ids = [x.event.id for x in self.browse(cursor, user, ids,
+            context=context)]
+        if values.get('event'):
+            event_ids.append(values['event'])
+        if event_ids:
+            # Update write_date of event
+            event_obj.write(cursor, user, event_ids, {}, context=context)
+        return super(EventRRule, self).write(cursor, user, ids, values, context=context)
+
+    def delete(self, cursor, user, ids, context=None):
+        event_obj = self.pool.get('calendar.event')
+        rrule_obj = self.pool.get('calendar.rrule')
+        if isinstance(ids, (int, long)):
+            ids = [ids]
+        event_rrules = self.browse(cursor, user, ids, context=context)
+        rrule_ids = [a.calendar_rrule.id for a in event_rrules]
+        event_ids = [x.event.id for x in event_rrules]
+        if event_ids:
+            # Update write_date of event
+            event_obj.write(cursor, user, event_ids, {}, context=context)
+        res = super(EventRRule, self).delete(cursor, user, ids, context=context)
+        if rrule_ids:
+            rrule_obj.delete(cursor, user, rrule_ids, context=context)
+        return res
+
+    def _rule2update(self, cursor, user, rule, context=None):
+        rule_obj = self.pool.get('calendar.rrule')
+        return rule_obj._rule2update(cursor, user, rule, context=context)
+
+    def rule2values(self, cursor, user, rule, context=None):
+        rule_obj = self.pool.get('calendar.rrule')
+        return rule_obj.rule2values(cursor, user, rule, context=context)
+
+    def rule2rule(self, cursor, user, rule, context=None):
+        rule_obj = self.pool.get('calendar.rrule')
+        return rule_obj.rule2rule(cursor, user, rule, context=context)
+
+EventRRule()
+
+
+class EventExRule(EventRRule):
+    'Exception Rule'
+    _description = __doc__
+    _name = 'calendar.event.exrule'
+
+EventExRule()
diff --git a/calendar.xml b/calendar.xml
new file mode 100644
index 0000000..589c48e
--- /dev/null
+++ b/calendar.xml
@@ -0,0 +1,479 @@
+<?xml version="1.0"?>
+<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of
+this repository contains the full copyright notices and license terms. -->
+<tryton>
+    <data>
+
+        <record model="res.group" id="group_calendar_admin">
+            <field name="name">Calendar Administration</field>
+        </record>
+        <record model="res.user" id="res.user_admin">
+            <field name="groups" eval="[('add', ref('group_calendar_admin'))]"/>
+        </record>
+
+        <menuitem name="Calendar Management" sequence="8" id="menu_calendar"/>
+
+        <record model="ir.ui.view" id="calendar_view_tree">
+            <field name="model">calendar.calendar</field>
+            <field name="type">tree</field>
+            <field name="arch" type="xml">
+                <![CDATA[
+                <tree string="Calendars">
+                    <field name="name" select="1"/>
+                    <field name="owner" select="1"/>
+                </tree>
+                ]]>
+            </field>
+        </record>
+        <record model="ir.ui.view" id="calendar_view_form">
+            <field name="model">calendar.calendar</field>
+            <field name="type">form</field>
+            <field name="arch" type="xml">
+                <![CDATA[
+                <form string="Calendar">
+                    <label name="name"/>
+                    <field name="name"/>
+                    <label name="owner"/>
+                    <field name="owner"/>
+                    <notebook colspan="4">
+                        <page string="General" id="general">
+                            <separator name="description" colspan="4"/>
+                            <field name="description" colspan="4"/>
+                        </page>
+                        <page string="Security" id="security">
+                            <separator name="read_users" colspan="4"/>
+                            <field name="read_users" colspan="4"/>
+                            <separator name="write_users" colspan="4"/>
+                            <field name="write_users" colspan="4"/>
+                        </page>
+                    </notebook>
+                </form>
+                ]]>
+            </field>
+        </record>
+        <record model="ir.action.act_window" id="act_calendar_form">
+            <field name="name">Calendars</field>
+            <field name="res_model">calendar.calendar</field>
+            <field name="view_type">form</field>
+        </record>
+        <record model="ir.action.act_window.view" id="act_calendar_form_view1">
+            <field name="sequence" eval="10"/>
+            <field name="view" ref="calendar_view_tree"/>
+            <field name="act_window" ref="act_calendar_form"/>
+        </record>
+        <record model="ir.action.act_window.view" id="act_calendar_form_view2">
+            <field name="sequence" eval="20"/>
+            <field name="view" ref="calendar_view_form"/>
+            <field name="act_window" ref="act_calendar_form"/>
+        </record>
+        <menuitem parent="menu_calendar" sequence="1"
+            action="act_calendar_form" id="menu_calendar_form"/>
+
+        <record model="ir.rule.group" id="rule_group_read_calendar">
+            <field name="model" search="[('model', '=', 'calendar.event')]"/>
+            <field name="global_p" eval="False"/>
+            <field name="default_p" eval="True"/>
+            <field name="perm_read" eval="True"/>
+            <field name="perm_write" eval="False"/>
+            <field name="perm_create" eval="False"/>
+            <field name="perm_delete" eval="False"/>
+        </record>
+        <record model="ir.rule" id="rule_group_read_calendar_line1">
+            <field name="field" search="[('name', '=', 'calendar_owner'), ('model.model', '=', 'calendar.event')]"/>
+            <field name="operator">=</field>
+            <field name="operand">User</field>
+            <field name="rule_group" ref="rule_group_read_calendar"/>
+        </record>
+        <record model="ir.rule" id="rule_group_read_calendar_line2">
+            <field name="field" search="[('name', '=', 'calendar_read_users'), ('model.model', '=', 'calendar.event')]"/>
+            <field name="operator">=</field>
+            <field name="operand">User</field>
+            <field name="rule_group" ref="rule_group_read_calendar"/>
+        </record>
+        <record model="ir.rule" id="rule_group_read_calendar_line3">
+            <field name="field" search="[('name', '=', 'classification_public'), ('model.model', '=', 'calendar.event')]"/>
+            <field name="operator">=</field>
+            <field name="operand">True</field>
+            <field name="rule_group" ref="rule_group_read_calendar"/>
+        </record>
+
+        <record model="ir.rule.group" id="rule_group_write_calendar">
+            <field name="model" search="[('model', '=', 'calendar.event')]"/>
+            <field name="global_p" eval="False"/>
+            <field name="default_p" eval="True"/>
+            <field name="perm_read" eval="True"/>
+            <field name="perm_write" eval="True"/>
+            <field name="perm_create" eval="True"/>
+            <field name="perm_delete" eval="True"/>
+        </record>
+        <record model="ir.rule" id="rule_group_write_calendar_line1">
+            <field name="field" search="[('name', '=', 'calendar_owner'), ('model.model', '=', 'calendar.event')]"/>
+            <field name="operator">=</field>
+            <field name="operand">User</field>
+            <field name="rule_group" ref="rule_group_write_calendar"/>
+        </record>
+        <record model="ir.rule" id="rule_group_write_calendar_line2">
+            <field name="field" search="[('name', '=', 'calendar_write_users'), ('model.model', '=', 'calendar.event')]"/>
+            <field name="operator">=</field>
+            <field name="operand">User</field>
+            <field name="rule_group" ref="rule_group_write_calendar"/>
+        </record>
+
+        <record model="ir.ui.view" id="category_view_tree">
+            <field name="model">calendar.category</field>
+            <field name="type">tree</field>
+            <field name="arch" type="xml">
+                <![CDATA[
+                <tree string="Categories">
+                    <field name="name" select="1"/>
+                </tree>
+                ]]>
+            </field>
+        </record>
+
+        <record model="ir.ui.view" id="category_view_form">
+            <field name="model">calendar.category</field>
+            <field name="type">form</field>
+            <field name="arch" type="xml">
+                <![CDATA[
+                <form string="Category">
+                    <label name="name"/>
+                    <field name="name"/>
+                </form>
+                ]]>
+            </field>
+        </record>
+
+        <record model="ir.ui.view" id="location_view_tree">
+            <field name="model">calendar.location</field>
+            <field name="type">tree</field>
+            <field name="arch" type="xml">
+                <![CDATA[
+                <tree string="Locations">
+                    <field name="name" select="1"/>
+                </tree>
+                ]]>
+            </field>
+        </record>
+
+        <record model="ir.ui.view" id="location_view_form">
+            <field name="model">calendar.location</field>
+            <field name="type">form</field>
+            <field name="arch" type="xml">
+                <![CDATA[
+                <form string="Location">
+                    <label name="name"/>
+                    <field name="name"/>
+                </form>
+                ]]>
+            </field>
+        </record>
+
+        <record model="ir.ui.view" id="event_view_tree">
+            <field name="model">calendar.event</field>
+            <field name="type">tree</field>
+            <field name="arch" type="xml">
+                <![CDATA[
+                <tree string="Events">
+                    <field name="calendar" select="1"/>
+                    <field name="summary" select="1"/>
+                    <field name="all_day"/>
+                    <field name="dtstart" select="1"/>
+                    <field name="dtend" select="2"/>
+                    <field name="status" select="2"/>
+                </tree>
+                ]]>
+            </field>
+        </record>
+
+        <record model="ir.ui.view" id="event_view_form">
+            <field name="model">calendar.event</field>
+            <field name="type">form</field>
+            <field name="arch" type="xml">
+                <![CDATA[
+                <form string="Event">
+                    <label name="summary"/>
+                    <field name="summary"/>
+                    <label name="recurrence"/>
+                    <field name="recurrence"/>
+                    <notebook colspan="4">
+                        <page string="General" id="general">
+                            <label name="location"/>
+                            <field name="location"/>
+                            <label name="status"/>
+                            <field name="status"/>
+                            <label name="classification"/>
+                            <field name="classification"/>
+                            <label name="calendar"/>
+                            <field name="calendar"/>
+                            <label name="all_day"/>
+                            <field name="all_day"/>
+                            <label name="transp"/>
+                            <field name="transp"/>
+                            <label name="dtstart"/>
+                            <field name="dtstart"/>
+                            <label name="dtend"/>
+                            <field name="dtend"/>
+                            <separator name="description" colspan="4"/>
+                            <field name="description" colspan="4"/>
+                        </page>
+                        <page string="Categories" id="categories">
+                            <separator name="categories" colspan="4"/>
+                            <field name="categories" colspan="4"/>
+                        </page>
+                        <page string="Attendees" id="attendees">
+                            <label name="organizer"/>
+                            <field name="organizer"/>
+                            <field name="attendees" colspan="4"/>
+                        </page>
+                        <page string="Occurences" id="occurences"
+                            states="{'invisible': '''bool(parent)'''}">
+                            <field name="rrules" colspan="2"/>
+                            <field name="rdates" colspan="2"/>
+                            <field name="exrules" colspan="2"/>
+                            <field name="exdates" colspan="2"/>
+                            <field name="occurences" colspan="4">
+                                <tree string="Events">
+                                    <field name="summary" select="1"/>
+                                    <field name="recurrence" select="1"/>
+                                    <field name="all_day"/>
+                                    <field name="dtstart" select="2"/>
+                                    <field name="dtend" select="2"/>
+                                    <field name="status" select="2"/>
+                                </tree>
+                            </field>
+                        </page>
+                    </notebook>
+                    <field name="parent" colspan="4" invisible="1"/>
+                </form>
+                ]]>
+            </field>
+        </record>
+
+        <record model="ir.action.act_window" id="act_event_form">
+            <field name="name">Events</field>
+            <field name="res_model">calendar.event</field>
+            <field name="view_type">form</field>
+            <field name="domain">[('parent', '=', False)]</field>
+        </record>
+        <record model="ir.action.act_window.view" id="act_event_form_view1">
+            <field name="sequence" eval="10"/>
+            <field name="view" ref="event_view_tree"/>
+            <field name="act_window" ref="act_event_form"/>
+        </record>
+        <record model="ir.action.act_window.view" id="act_event_form_view2">
+            <field name="sequence" eval="20"/>
+            <field name="view" ref="event_view_form"/>
+            <field name="act_window" ref="act_event_form"/>
+        </record>
+        <menuitem parent="menu_calendar_form" sequence="1"
+            action="act_event_form" id="menu_event_form"/>
+
+        <record model="ir.ui.view" id="attendee_view_tree">
+            <field name="model">calendar.event.attendee</field>
+            <field name="type">tree</field>
+            <field name="arch" type="xml">
+                <![CDATA[
+                <tree string="Attendees">
+                    <field name="event" select="1"/>
+                    <field name="email" select="1"/>
+                    <field name="status" select="1"/>
+                </tree>
+                ]]>
+            </field>
+        </record>
+
+        <record model="ir.ui.view" id="attendee_view_form">
+            <field name="model">calendar.event.attendee</field>
+            <field name="type">form</field>
+            <field name="arch" type="xml">
+                <![CDATA[
+                <form string="Attendee">
+                    <label name="event"/>
+                    <field name="event" colspan="3"/>
+                    <label name="email"/>
+                    <field name="email"/>
+                    <label name="status"/>
+                    <field name="status"/>
+                </form>
+                ]]>
+            </field>
+        </record>
+
+        <record model="ir.ui.view" id="rdate_view_tree">
+            <field name="model">calendar.event.rdate</field>
+            <field name="type">tree</field>
+            <field name="arch" type="xml">
+                <![CDATA[
+                <tree string="Recurrence Dates">
+                    <field name="event" select="1"/>
+                    <field name="datetime" select="1"/>
+                    <field name="date" select="2"/>
+                </tree>
+                ]]>
+            </field>
+        </record>
+
+        <record model="ir.ui.view" id="rdate_view_form">
+            <field name="model">calendar.event.rdate</field>
+            <field name="type">form</field>
+            <field name="arch" type="xml">
+                <![CDATA[
+                <form string="Recurrence Date">
+                    <label name="event"/>
+                    <field name="event" colspan="3"/>
+                    <label name="datetime"/>
+                    <field name="datetime"/>
+                    <label name="date"/>
+                    <field name="date"/>
+                </form>
+                ]]>
+            </field>
+        </record>
+
+        <record model="ir.ui.view" id="exdate_view_tree">
+            <field name="model">calendar.event.exdate</field>
+            <field name="type">tree</field>
+            <field name="arch" type="xml">
+                <![CDATA[
+                <tree string="Exception Dates">
+                    <field name="event" select="1"/>
+                    <field name="datetime" select="1"/>
+                    <field name="date" select="2"/>
+                </tree>
+                ]]>
+            </field>
+        </record>
+
+        <record model="ir.ui.view" id="exdate_view_form">
+            <field name="model">calendar.event.exdate</field>
+            <field name="type">form</field>
+            <field name="arch" type="xml">
+                <![CDATA[
+                <form string="Exception Date">
+                    <label name="event"/>
+                    <field name="event" colspan="3"/>
+                    <label name="datetime"/>
+                    <field name="datetime"/>
+                    <label name="date"/>
+                    <field name="date"/>
+                </form>
+                ]]>
+            </field>
+        </record>
+
+        <record model="ir.ui.view" id="rrule_view_tree">
+            <field name="model">calendar.event.rrule</field>
+            <field name="type">tree</field>
+            <field name="arch" type="xml">
+                <![CDATA[
+                <tree string="Recurrence Rules">
+                    <field name="event" select="1"/>
+                    <field name="freq" select="1"/>
+                </tree>
+                ]]>
+            </field>
+        </record>
+
+        <record model="ir.ui.view" id="rrule_view_form">
+            <field name="model">calendar.event.rrule</field>
+            <field name="type">form</field>
+            <field name="arch" type="xml">
+                <![CDATA[
+                <form string="Recurrence Rule">
+                    <label name="event"/>
+                    <field name="event" colspan="3"/>
+                    <label name="freq"/>
+                    <field name="freq" colspan="3"/>
+                    <label name="until"/>
+                    <field name="until"/>
+                    <label name="until_date"/>
+                    <field name="until_date"/>
+                    <label name="count"/>
+                    <field name="count" colspan="3"/>
+                    <label name="interval"/>
+                    <field name="interval" colspan="3"/>
+                    <label name="bysecond"/>
+                    <field name="bysecond" colspan="3"/>
+                    <label name="byminute"/>
+                    <field name="byminute" colspan="3"/>
+                    <label name="byhour"/>
+                    <field name="byhour" colspan="3"/>
+                    <label name="byday"/>
+                    <field name="byday" colspan="3"/>
+                    <label name="bymonthday"/>
+                    <field name="bymonthday" colspan="3"/>
+                    <label name="byyearday"/>
+                    <field name="byyearday" colspan="3"/>
+                    <label name="byweekno"/>
+                    <field name="byweekno" colspan="3"/>
+                    <label name="bymonth"/>
+                    <field name="bymonth" colspan="3"/>
+                    <label name="bysetpos"/>
+                    <field name="bysetpos" colspan="3"/>
+                    <label name="wkst"/>
+                    <field name="wkst" colspan="3"/>
+                </form>
+                ]]>
+            </field>
+        </record>
+
+        <record model="ir.ui.view" id="exrule_view_tree">
+            <field name="model">calendar.event.exrule</field>
+            <field name="type">tree</field>
+            <field name="arch" type="xml">
+                <![CDATA[
+                <tree string="Exception Rules">
+                    <field name="event" select="1"/>
+                    <field name="freq" select="1"/>
+                </tree>
+                ]]>
+            </field>
+        </record>
+
+        <record model="ir.ui.view" id="exrule_view_form">
+            <field name="model">calendar.event.exrule</field>
+            <field name="type">form</field>
+            <field name="arch" type="xml">
+                <![CDATA[
+                <form string="Exception Rule">
+                    <label name="event"/>
+                    <field name="event" colspan="3"/>
+                    <label name="freq"/>
+                    <field name="freq" colspan="3"/>
+                    <label name="until"/>
+                    <field name="until"/>
+                    <label name="until_date"/>
+                    <field name="until_date"/>
+                    <label name="count"/>
+                    <field name="count" colspan="3"/>
+                    <label name="interval"/>
+                    <field name="interval" colspan="3"/>
+                    <label name="bysecond"/>
+                    <field name="bysecond" colspan="3"/>
+                    <label name="byminute"/>
+                    <field name="byminute" colspan="3"/>
+                    <label name="byhour"/>
+                    <field name="byhour" colspan="3"/>
+                    <label name="byday"/>
+                    <field name="byday" colspan="3"/>
+                    <label name="bymonthday"/>
+                    <field name="bymonthday" colspan="3"/>
+                    <label name="byyearday"/>
+                    <field name="byyearday" colspan="3"/>
+                    <label name="byweekno"/>
+                    <field name="byweekno" colspan="3"/>
+                    <label name="bymonth"/>
+                    <field name="bymonth" colspan="3"/>
+                    <label name="bysetpos"/>
+                    <field name="bysetpos" colspan="3"/>
+                    <label name="wkst"/>
+                    <field name="wkst" colspan="3"/>
+                </form>
+                ]]>
+            </field>
+        </record>
+
+
+    </data>
+</tryton>
diff --git a/de_DE.csv b/de_DE.csv
new file mode 100644
index 0000000..abef7ff
--- /dev/null
+++ b/de_DE.csv
@@ -0,0 +1,191 @@
+type,name,res_id,src,value,fuzzy
+error,calendar.calendar,0,A user can have only one calendar!,Es ist nur ein Kalender pro Benutzer möglich!,0
+error,calendar.calendar,0,The name of calendar must be unique!,Kalendername kann nicht mehrfach vergeben werden!,0
+error,calendar.category,0,The name of calendar category must be unique!,Name für Kalenderkategorie kann nicht mehrfach vergeben werden!,0
+error,calendar.event,0,Recurrence can not be recurrent!,Wiederholungen können nicht rekursiv sein!,0
+error,calendar.event,0,UUID and recurrence must be unique in a calendar!,UUID und Wiederholung können in einem Kalender nicht mehrfach vergeben werden!,0
+error,calendar.location,0,The name of calendar location must be unique!,Name für Kalenderort kann nicht mehrfach vergeben werden!,0
+error,calendar.rrule,0,"Invalid ""By Day""","Ungültig ""Für Tag""",0
+error,calendar.rrule,0,"Invalid ""By Hour""","Ungültig ""Für Stunde""",0
+error,calendar.rrule,0,"Invalid ""By Minute""","Ungültig ""Für Minute""",0
+error,calendar.rrule,0,"Invalid ""By Month""","Ungültig ""Für Monat""",0
+error,calendar.rrule,0,"Invalid ""By Month Day""","Ungültig ""Für Tag des Monats""",0
+error,calendar.rrule,0,"Invalid ""By Position""","Ungültig ""Für Position""",0
+error,calendar.rrule,0,"Invalid ""By Second""","Ungültig ""Für Sekunde""",0
+error,calendar.rrule,0,"Invalid ""By Week Number""","Ungültig ""Für Woche Nummer""",0
+error,calendar.rrule,0,"Invalid ""By Year Day""","Ungültig ""Für Tag des Jahres""",0
+error,calendar.rrule,0,"Only one of ""until"" and ""count"" can be set!","Es kann nur entweder ""Bis"" oder ""Anzahl"" gesetzt werden!",0
+field,"calendar.alarm,rec_name",0,Name,Name,0
+field,"calendar.alarm,valarm",0,valarm,valarm,0
+field,"calendar.attendee,attendee",0,attendee,Teilnehmer,0
+field,"calendar.attendee,email",0,Email,E-Mail,0
+field,"calendar.attendee,rec_name",0,Name,Name,0
+field,"calendar.attendee,status",0,Participation Status,Teilnahmestatus,0
+field,"calendar.calendar,description",0,Description,Bezeichnung,0
+field,"calendar.calendar,name",0,Name,Name,0
+field,"calendar.calendar,owner",0,Owner,Besitzer,0
+field,"calendar.calendar-read-res.user,calendar",0,Calendar,Kalender,0
+field,"calendar.calendar-read-res.user,rec_name",0,Name,Name,0
+field,"calendar.calendar-read-res.user,user",0,User,Benutzer,0
+field,"calendar.calendar,read_users",0,Read Users,Benutzer mit Leseberechtigung,0
+field,"calendar.calendar,rec_name",0,Name,Name,0
+field,"calendar.calendar-write-res.user,calendar",0,Calendar,Kalender,0
+field,"calendar.calendar-write-res.user,rec_name",0,Name,Name,0
+field,"calendar.calendar-write-res.user,user",0,User,Benutzer,0
+field,"calendar.calendar,write_users",0,Write Users,Benutzer mit Schreibberechtigung,0
+field,"calendar.category,name",0,Name,Name,0
+field,"calendar.category,rec_name",0,Name,Name,0
+field,"calendar.event.alarm,calendar_alarm",0,Calendar Alarm,Kalender Alarm,0
+field,"calendar.event.alarm,event",0,Event,Termin,0
+field,"calendar.event.alarm,rec_name",0,Name,Name,0
+field,"calendar.event,alarms",0,Alarms,Alarm,0
+field,"calendar.event,all_day",0,All Day,Ganztägig,0
+field,"calendar.event.attendee,calendar_attendee",0,Calendar Attendee,Kalender Teilnehmer,0
+field,"calendar.event.attendee,event",0,Event,Termin,0
+field,"calendar.event.attendee,rec_name",0,Name,Name,0
+field,"calendar.event,attendees",0,Attendees,Teilnehmer,0
+field,"calendar.event,calendar",0,Calendar,Kalender,0
+field,"calendar.event-calendar.category,category",0,Category,Kategorie,0
+field,"calendar.event-calendar.category,event",0,Event,Termin,0
+field,"calendar.event-calendar.category,rec_name",0,Name,Name,0
+field,"calendar.event,calendar_owner",0,Owner,Besitzer,0
+field,"calendar.event,calendar_read_users",0,Read Users,Benutzer mit Leseberechtigung,0
+field,"calendar.event,calendar_write_users",0,Write Users,Benutzer mit Schreibberechtigung,0
+field,"calendar.event,categories",0,Categories,Kategorien,0
+field,"calendar.event,classification",0,Classification,Klassifizierung,0
+field,"calendar.event,classification_public",0,Classification Public,Öffentliche Klassifizierung,0
+field,"calendar.event,description",0,Description,Bezeichnung,0
+field,"calendar.event,dtend",0,End Date,Enddatum,0
+field,"calendar.event,dtstart",0,Start Date,Anfangsdatum,0
+field,"calendar.event.exdate,calendar_rdate",0,Calendar RDate,Kalender WDatum,0
+field,"calendar.event.exdate,event",0,Event,Termin,0
+field,"calendar.event.exdate,rec_name",0,Name,Name,0
+field,"calendar.event,exdates",0,Exception Dates,Ausnahmedaten,0
+field,"calendar.event.exrule,calendar_rrule",0,Calendar RRule,Kalender WRegel,0
+field,"calendar.event.exrule,event",0,Event,Termin,0
+field,"calendar.event.exrule,rec_name",0,Name,Name,0
+field,"calendar.event,exrules",0,Exception Rules,Ausnahmeregeln,0
+field,"calendar.event,location",0,Location,Ort,0
+field,"calendar.event,occurences",0,Occurences,Ereignisse,0
+field,"calendar.event,organizer",0,Organizer,Organisator,0
+field,"calendar.event,parent",0,Parent,Übergeordnet (Termin),0
+field,"calendar.event.rdate,calendar_rdate",0,Calendar RDate,Kalender WDatum,0
+field,"calendar.event.rdate,event",0,Event,Termin,0
+field,"calendar.event.rdate,rec_name",0,Name,Name,0
+field,"calendar.event,rdates",0,Recurrence Dates,Wiederholungsdaten,0
+field,"calendar.event,rec_name",0,Name,Name,0
+field,"calendar.event,recurrence",0,Recurrence,Wiederholung,0
+field,"calendar.event.rrule,calendar_rrule",0,Calendar RRule,Kalender WRegel,0
+field,"calendar.event.rrule,event",0,Event,Termin,0
+field,"calendar.event.rrule,rec_name",0,Name,Name,0
+field,"calendar.event,rrules",0,Recurrence Rules,Wiederholungsregeln,0
+field,"calendar.event,sequence",0,Sequence,Sequenz,0
+field,"calendar.event,status",0,Status,Status,0
+field,"calendar.event,summary",0,Summary,Zusammenfassung,0
+field,"calendar.event,timezone",0,Timezone,Zeitzone,0
+field,"calendar.event,transp",0,Time Transparency,Zeittransparenz,0
+field,"calendar.event,uuid",0,UUID,UUID,0
+field,"calendar.event,vevent",0,vevent,vevent,0
+field,"calendar.location,name",0,Name,Name,0
+field,"calendar.location,rec_name",0,Name,Name,0
+field,"calendar.rdate,date",0,Is Date,Als Datum,0
+field,"calendar.rdate,datetime",0,Date,Zeitpunkt,0
+field,"calendar.rdate,rec_name",0,Name,Name,0
+field,"calendar.rrule,byday",0,By Day,Für Tag,0
+field,"calendar.rrule,byhour",0,By Hour,Für Stunde,0
+field,"calendar.rrule,byminute",0,By Minute,Für Minute,0
+field,"calendar.rrule,bymonth",0,By Month,Für Monat,0
+field,"calendar.rrule,bymonthday",0,By Month Day,Für Tag des Monats,0
+field,"calendar.rrule,bysecond",0,By Second,Für Sekunde,0
+field,"calendar.rrule,bysetpos",0,By Position,Für Position,0
+field,"calendar.rrule,byweekno",0,By Week Number,Für Woche Nummer,0
+field,"calendar.rrule,byyearday",0,By Year Day,Für Tag des Jahres,0
+field,"calendar.rrule,count",0,Count,Anzahl,0
+field,"calendar.rrule,freq",0,Frequency,Häufigkeit,0
+field,"calendar.rrule,interval",0,Interval,Intervall,0
+field,"calendar.rrule,rec_name",0,Name,Name,0
+field,"calendar.rrule,until",0,Until Date,Bis Zeitpunkt,0
+field,"calendar.rrule,until_date",0,Is Date,Als Datum,0
+field,"calendar.rrule,wkst",0,Week Day,Wochentag,0
+field,"res.user,calendars",0,Calendars,Kalender,0
+help,"calendar.calendar,owner",0,The user must have an email,Dem Benutzer muss eine E-Mail-Adresse zugeordnet sein!,0
+help,"calendar.event,uuid",0,Universally Unique Identifier,Universally Unique Identifier,0
+help,"calendar.rdate,date",0,"Ignore time of field ""Date"", but handle as date only.","Verwende von Feld ""Zeitpunkt"" nur das Datum ohne den Zeitanteil.",0
+help,"calendar.rrule,until_date",0,"Ignore time of field ""Until Date"", but handle as date only.","Verwende von Feld ""Bis Zeitpunkt"" nur das Datum ohne den Zeitanteil.",0
+model,"calendar.alarm,name",0,Alarm,Alarm,0
+model,"calendar.attendee,name",0,Attendee,Teilnehmer,0
+model,"calendar.calendar,name",0,Calendar,Kalender,0
+model,"calendar.calendar-read-res.user,name",0,Calendar - read - User,Kalender - Schreiben - Benutzer,0
+model,"calendar.calendar-write-res.user,name",0,Calendar - write - User,Kalender - Lesen - Benutzer,0
+model,"calendar.category,name",0,Category,Kategorie,0
+model,"calendar.event.alarm,name",0,Alarm,Alarm,0
+model,"calendar.event.attendee,name",0,Attendee,Teilnehmer,0
+model,"calendar.event-calendar.category,name",0,Event - Category,Termin - Kategorie,0
+model,"calendar.event.exdate,name",0,Exception Date,Ausnahmedatum,0
+model,"calendar.event.exrule,name",0,Exception Rule,Ausnahmeregel,0
+model,"calendar.event,name",0,Event,Termin,0
+model,"calendar.event.rdate,name",0,Recurrence Date,Wiederholungsdatum,0
+model,"calendar.event.rrule,name",0,Recurrence Rule,Wiederholungsregel,0
+model,"calendar.location,name",0,Location,Ort,0
+model,"calendar.rdate,name",0,Recurrence Date,Wiederholungsdatum,0
+model,"calendar.rrule,name",0,Recurrence Rule,Wiederholungsregel,0
+model,"ir.action,name",act_calendar_form,Calendars,Kalender,0
+model,"ir.action,name",act_event_form,Events,Termine,0
+model,"ir.ui.menu,name",menu_calendar,Calendar Management,Kalender,0
+model,"ir.ui.menu,name",menu_calendar_form,Calendars,Kalender,0
+model,"ir.ui.menu,name",menu_event_form,Events,Termine,0
+model,"res.group,name",group_calendar_admin,Calendar Administration,Kalender Administration,0
+selection,"calendar.attendee,status",0,,,0
+selection,"calendar.attendee,status",0,Accepted,Angenommen,0
+selection,"calendar.attendee,status",0,Declined,Abgelehnt,0
+selection,"calendar.attendee,status",0,Delegated,Delegiert,0
+selection,"calendar.attendee,status",0,Needs Action,Aktion erforderlich,0
+selection,"calendar.attendee,status",0,Tentative,Unter Vorbehalt,0
+selection,"calendar.event,classification",0,Confidential,Vertraulich,0
+selection,"calendar.event,classification",0,Private,Privat,0
+selection,"calendar.event,classification",0,Public,Öffentlich,0
+selection,"calendar.event,status",0,,,0
+selection,"calendar.event,status",0,Cancelled,Abgesagt,0
+selection,"calendar.event,status",0,Confirmed,Bestätigt,0
+selection,"calendar.event,status",0,Tentative,Unter Vorbehalt,0
+selection,"calendar.event,transp",0,Opaque,Opak,0
+selection,"calendar.event,transp",0,Transparent,Transparent,0
+selection,"calendar.rrule,freq",0,Daily,Täglich,0
+selection,"calendar.rrule,freq",0,Hourly,Stündlich,0
+selection,"calendar.rrule,freq",0,Minutely,Minütlich,0
+selection,"calendar.rrule,freq",0,Monthly,Monatlich,0
+selection,"calendar.rrule,freq",0,Secondly,Sekündlich,0
+selection,"calendar.rrule,freq",0,Weekly,Wöchentlich,0
+selection,"calendar.rrule,freq",0,Yearly,Jährlich,0
+selection,"calendar.rrule,wkst",0,Friday,Freitag,0
+selection,"calendar.rrule,wkst",0,Monday,Montag,0
+selection,"calendar.rrule,wkst",0,Saturday,Samstag,0
+selection,"calendar.rrule,wkst",0,Sunday,Sonntag,0
+selection,"calendar.rrule,wkst",0,Thursday,Donnerstag,0
+selection,"calendar.rrule,wkst",0,Tuesday,Dienstag,0
+selection,"calendar.rrule,wkst",0,Wednesday,Mittwoch,0
+view,calendar.calendar,0,Calendar,Kalender,0
+view,calendar.calendar,0,Calendars,Kalender,0
+view,calendar.calendar,0,General,Allgemein,0
+view,calendar.calendar,0,Security,Sicherheit,0
+view,calendar.category,0,Categories,Kategorien,0
+view,calendar.category,0,Category,Kategorie,0
+view,calendar.event,0,Attendees,Teilnehmer,0
+view,calendar.event,0,Categories,Kategorien,0
+view,calendar.event,0,Event,Termin,0
+view,calendar.event,0,Events,Termine,0
+view,calendar.event,0,General,Allgemein,0
+view,calendar.event,0,Occurences,Ereignisse,0
+view,calendar.event,0,Recurrences,Wiederholungen,0
+view,calendar.event.attendee,0,Attendee,Teilnehmer,0
+view,calendar.event.attendee,0,Attendees,Teilnehmer,0
+view,calendar.event.exdate,0,Exception Date,Ausnahmedatum,0
+view,calendar.event.exdate,0,Exception Dates,Ausnahmedaten,0
+view,calendar.event.exrule,0,Exception Rule,Ausnahmeregel,0
+view,calendar.event.exrule,0,Exception Rules,Ausnahmeregeln,0
+view,calendar.event.rdate,0,Recurrence Date,Wiederholungsdatum,0
+view,calendar.event.rdate,0,Recurrence Dates,Wiederholungsdaten,0
+view,calendar.event.rrule,0,Recurrence Rule,Wiederholungsregel,0
+view,calendar.event.rrule,0,Recurrence Rules,Wiederholungsregeln,0
+view,calendar.location,0,Location,Ort,0
+view,calendar.location,0,Locations,Orte,0
diff --git a/es_CO.csv b/es_CO.csv
new file mode 100644
index 0000000..ad65390
--- /dev/null
+++ b/es_CO.csv
@@ -0,0 +1,191 @@
+type,name,res_id,src,value,fuzzy
+error,calendar.calendar,0,A user can have only one calendar!,¡Un usuario puede tener a lo sumo un calendario!,0
+error,calendar.calendar,0,The name of calendar must be unique!,¡El nombre del calendario es único!,0
+error,calendar.category,0,The name of calendar category must be unique!,¡El nombre de la categoría de calendario debe ser único!,0
+error,calendar.event,0,Recurrence can not be recurrent!,¡La repetición no puede repetirse!,0
+error,calendar.event,0,UUID and recurrence must be unique in a calendar!,¡El UUID y la recurrencia deben ser únicos por calendario! ,0
+error,calendar.location,0,The name of calendar location must be unique!,¡El nombre del lugar del calendario debe ser único!,0
+error,calendar.rrule,0,"Invalid ""By Day""",,0
+error,calendar.rrule,0,"Invalid ""By Hour""",,0
+error,calendar.rrule,0,"Invalid ""By Minute""",,0
+error,calendar.rrule,0,"Invalid ""By Month""",,0
+error,calendar.rrule,0,"Invalid ""By Month Day""",,0
+error,calendar.rrule,0,"Invalid ""By Position""",,0
+error,calendar.rrule,0,"Invalid ""By Second""",,0
+error,calendar.rrule,0,"Invalid ""By Week Number""",,0
+error,calendar.rrule,0,"Invalid ""By Year Day""",,0
+error,calendar.rrule,0,"Only one of ""until"" and ""count"" can be set!",,0
+field,"calendar.alarm,rec_name",0,Name,Nombre,0
+field,"calendar.alarm,valarm",0,valarm,,0
+field,"calendar.attendee,attendee",0,attendee,,0
+field,"calendar.attendee,email",0,Email,Correo Electrónico,0
+field,"calendar.attendee,rec_name",0,Name,Nombre,0
+field,"calendar.attendee,status",0,Participation Status,,0
+field,"calendar.calendar,description",0,Description,Descripción,0
+field,"calendar.calendar,name",0,Name,Nombre,0
+field,"calendar.calendar,owner",0,Owner,Propietario,0
+field,"calendar.calendar-read-res.user,calendar",0,Calendar,Calendario,0
+field,"calendar.calendar-read-res.user,rec_name",0,Name,Nombre,0
+field,"calendar.calendar-read-res.user,user",0,User,Usuario,0
+field,"calendar.calendar,read_users",0,Read Users,Usuarios que pueden Leer,0
+field,"calendar.calendar,rec_name",0,Name,Nombre,0
+field,"calendar.calendar-write-res.user,calendar",0,Calendar,Calendario,0
+field,"calendar.calendar-write-res.user,rec_name",0,Name,Nombre,0
+field,"calendar.calendar-write-res.user,user",0,User,Usuario,0
+field,"calendar.calendar,write_users",0,Write Users,Escribir Usuarios,0
+field,"calendar.category,name",0,Name,Nombre,0
+field,"calendar.category,rec_name",0,Name,Nombre,0
+field,"calendar.event.alarm,calendar_alarm",0,Calendar Alarm,,0
+field,"calendar.event.alarm,event",0,Event,Evento,0
+field,"calendar.event.alarm,rec_name",0,Name,Nombre,0
+field,"calendar.event,alarms",0,Alarms,Alarmas,0
+field,"calendar.event,all_day",0,All Day,Todo el Día,0
+field,"calendar.event.attendee,calendar_attendee",0,Calendar Attendee,,0
+field,"calendar.event.attendee,event",0,Event,Evento,0
+field,"calendar.event.attendee,rec_name",0,Name,Nombre,0
+field,"calendar.event,attendees",0,Attendees,Asistentes,0
+field,"calendar.event,calendar",0,Calendar,Calendario,0
+field,"calendar.event-calendar.category,category",0,Category,Categoría,0
+field,"calendar.event-calendar.category,event",0,Event,Evento,0
+field,"calendar.event-calendar.category,rec_name",0,Name,Nombre,0
+field,"calendar.event,calendar_owner",0,Owner,Propietario,0
+field,"calendar.event,calendar_read_users",0,Read Users,Usuarios que pueden Leer,0
+field,"calendar.event,calendar_write_users",0,Write Users,Escribir Usuarios,0
+field,"calendar.event,categories",0,Categories,Categorías,0
+field,"calendar.event,classification",0,Classification,Clasificación,0
+field,"calendar.event,classification_public",0,Classification Public,Clasificación Pública,0
+field,"calendar.event,description",0,Description,Descripción,0
+field,"calendar.event,dtend",0,End Date,Fecha Fin,0
+field,"calendar.event,dtstart",0,Start Date,Fecha Inicial,0
+field,"calendar.event.exdate,calendar_rdate",0,Calendar RDate,,0
+field,"calendar.event.exdate,event",0,Event,Evento,0
+field,"calendar.event.exdate,rec_name",0,Name,Nombre,0
+field,"calendar.event,exdates",0,Exception Dates,Fechas de Excepción,0
+field,"calendar.event.exrule,calendar_rrule",0,Calendar RRule,,0
+field,"calendar.event.exrule,event",0,Event,Evento,0
+field,"calendar.event.exrule,rec_name",0,Name,Nombre,0
+field,"calendar.event,exrules",0,Exception Rules,Reglas de Excepción,0
+field,"calendar.event,location",0,Location,Lugar,0
+field,"calendar.event,occurences",0,Occurences,,0
+field,"calendar.event,organizer",0,Organizer,Organizador,0
+field,"calendar.event,parent",0,Parent,Padre,0
+field,"calendar.event.rdate,calendar_rdate",0,Calendar RDate,,0
+field,"calendar.event.rdate,event",0,Event,Evento,0
+field,"calendar.event.rdate,rec_name",0,Name,Nombre,0
+field,"calendar.event,rdates",0,Recurrence Dates,Fechas de Repetición,0
+field,"calendar.event,rec_name",0,Name,Nombre,0
+field,"calendar.event,recurrence",0,Recurrence,Repetición,0
+field,"calendar.event.rrule,calendar_rrule",0,Calendar RRule,,0
+field,"calendar.event.rrule,event",0,Event,Evento,0
+field,"calendar.event.rrule,rec_name",0,Name,Nombre,0
+field,"calendar.event,rrules",0,Recurrence Rules,Reglas de Repetición,0
+field,"calendar.event,sequence",0,Sequence,Secuencia,0
+field,"calendar.event,status",0,Status,Estado,0
+field,"calendar.event,summary",0,Summary,Resumen,0
+field,"calendar.event,timezone",0,Timezone,Zona horaria,0
+field,"calendar.event,transp",0,Time Transparency,Transparencia de Tiempo,0
+field,"calendar.event,uuid",0,UUID,UUID,0
+field,"calendar.event,vevent",0,vevent,vevento,0
+field,"calendar.location,name",0,Name,Nombre,0
+field,"calendar.location,rec_name",0,Name,Nombre,0
+field,"calendar.rdate,date",0,Is Date,,0
+field,"calendar.rdate,datetime",0,Date,Fecha,0
+field,"calendar.rdate,rec_name",0,Name,Nombre,0
+field,"calendar.rrule,byday",0,By Day,,0
+field,"calendar.rrule,byhour",0,By Hour,,0
+field,"calendar.rrule,byminute",0,By Minute,,0
+field,"calendar.rrule,bymonth",0,By Month,,0
+field,"calendar.rrule,bymonthday",0,By Month Day,,0
+field,"calendar.rrule,bysecond",0,By Second,,0
+field,"calendar.rrule,bysetpos",0,By Position,,0
+field,"calendar.rrule,byweekno",0,By Week Number,,0
+field,"calendar.rrule,byyearday",0,By Year Day,,0
+field,"calendar.rrule,count",0,Count,,0
+field,"calendar.rrule,freq",0,Frequency,,0
+field,"calendar.rrule,interval",0,Interval,,0
+field,"calendar.rrule,rec_name",0,Name,Nombre,0
+field,"calendar.rrule,until",0,Until Date,,0
+field,"calendar.rrule,until_date",0,Is Date,,0
+field,"calendar.rrule,wkst",0,Week Day,Día de la Semana,0
+field,"res.user,calendars",0,Calendars,Calendarios,0
+help,"calendar.calendar,owner",0,The user must have an email,,0
+help,"calendar.event,uuid",0,Universally Unique Identifier,Idenitificador Universal Único,0
+help,"calendar.rdate,date",0,"Ignore time of field ""Date"", but handle as date only.",,0
+help,"calendar.rrule,until_date",0,"Ignore time of field ""Until Date"", but handle as date only.",,0
+model,"calendar.alarm,name",0,Alarm,Alarma,0
+model,"calendar.attendee,name",0,Attendee,Asistente,0
+model,"calendar.calendar,name",0,Calendar,Calendario,0
+model,"calendar.calendar-read-res.user,name",0,Calendar - read - User,Calendario - leer - Usuario,0
+model,"calendar.calendar-write-res.user,name",0,Calendar - write - User,Calendario - escribir - Usuario,0
+model,"calendar.category,name",0,Category,Categoría,0
+model,"calendar.event.alarm,name",0,Alarm,Alarma,0
+model,"calendar.event.attendee,name",0,Attendee,Asistente,0
+model,"calendar.event-calendar.category,name",0,Event - Category,Evento - Categoría,0
+model,"calendar.event.exdate,name",0,Exception Date,Fecha de Excepción,0
+model,"calendar.event.exrule,name",0,Exception Rule,Regla de Excepción,0
+model,"calendar.event,name",0,Event,Evento,0
+model,"calendar.event.rdate,name",0,Recurrence Date,Fecha de Repetición,0
+model,"calendar.event.rrule,name",0,Recurrence Rule,Regla de Repetición,0
+model,"calendar.location,name",0,Location,Lugar,0
+model,"calendar.rdate,name",0,Recurrence Date,Fecha de Repetición,0
+model,"calendar.rrule,name",0,Recurrence Rule,Regla de Repetición,0
+model,"ir.action,name",act_calendar_form,Calendars,Calendarios,0
+model,"ir.action,name",act_event_form,Events,Eventos,0
+model,"ir.ui.menu,name",menu_calendar,Calendar Management,Calendario,0
+model,"ir.ui.menu,name",menu_calendar_form,Calendars,Calendarios,0
+model,"ir.ui.menu,name",menu_event_form,Events,Eventos,0
+model,"res.group,name",group_calendar_admin,Calendar Administration,Administrar Calendario,0
+selection,"calendar.attendee,status",0,,,0
+selection,"calendar.attendee,status",0,Accepted,,0
+selection,"calendar.attendee,status",0,Declined,,0
+selection,"calendar.attendee,status",0,Delegated,,0
+selection,"calendar.attendee,status",0,Needs Action,,0
+selection,"calendar.attendee,status",0,Tentative,Tentativa,0
+selection,"calendar.event,classification",0,Confidential,Confidencial,0
+selection,"calendar.event,classification",0,Private,Privado,0
+selection,"calendar.event,classification",0,Public,Público,0
+selection,"calendar.event,status",0,,,0
+selection,"calendar.event,status",0,Cancelled,Cancelado,0
+selection,"calendar.event,status",0,Confirmed,Confirmado,0
+selection,"calendar.event,status",0,Tentative,Tentativa,0
+selection,"calendar.event,transp",0,Opaque,Opaco,0
+selection,"calendar.event,transp",0,Transparent,Transparente,0
+selection,"calendar.rrule,freq",0,Daily,,0
+selection,"calendar.rrule,freq",0,Hourly,,0
+selection,"calendar.rrule,freq",0,Minutely,,0
+selection,"calendar.rrule,freq",0,Monthly,,0
+selection,"calendar.rrule,freq",0,Secondly,,0
+selection,"calendar.rrule,freq",0,Weekly,,0
+selection,"calendar.rrule,freq",0,Yearly,,0
+selection,"calendar.rrule,wkst",0,Friday,Viernes,0
+selection,"calendar.rrule,wkst",0,Monday,Lunes,0
+selection,"calendar.rrule,wkst",0,Saturday,Sábado,0
+selection,"calendar.rrule,wkst",0,Sunday,Domingo,0
+selection,"calendar.rrule,wkst",0,Thursday,Jueves,0
+selection,"calendar.rrule,wkst",0,Tuesday,Martes,0
+selection,"calendar.rrule,wkst",0,Wednesday,Miércoles,0
+view,calendar.calendar,0,Calendar,Calendario,0
+view,calendar.calendar,0,Calendars,Calendarios,0
+view,calendar.calendar,0,General,General,0
+view,calendar.calendar,0,Security,Seguridad,0
+view,calendar.category,0,Categories,Categorías,0
+view,calendar.category,0,Category,Categoría,0
+view,calendar.event,0,Attendees,Asistentes,0
+view,calendar.event,0,Categories,Categorías,0
+view,calendar.event,0,Event,Evento,0
+view,calendar.event,0,Events,Eventos,0
+view,calendar.event,0,General,General,0
+view,calendar.event,0,Occurences,,0
+view,calendar.event,0,Recurrences,Repeticiones,0
+view,calendar.event.attendee,0,Attendee,Asistente,0
+view,calendar.event.attendee,0,Attendees,Asistentes,0
+view,calendar.event.exdate,0,Exception Date,Fecha de Excepción,0
+view,calendar.event.exdate,0,Exception Dates,Fechas de Excepción,0
+view,calendar.event.exrule,0,Exception Rule,Regla de Excepción,0
+view,calendar.event.exrule,0,Exception Rules,Reglas de Excepción,0
+view,calendar.event.rdate,0,Recurrence Date,Fecha de Repetición,0
+view,calendar.event.rdate,0,Recurrence Dates,Fechas de Repetición,0
+view,calendar.event.rrule,0,Recurrence Rule,Regla de Repetición,0
+view,calendar.event.rrule,0,Recurrence Rules,Reglas de Repetición,0
+view,calendar.location,0,Location,Lugar,0
+view,calendar.location,0,Locations,Lugares,0
diff --git a/es_ES.csv b/es_ES.csv
new file mode 100644
index 0000000..6feec26
--- /dev/null
+++ b/es_ES.csv
@@ -0,0 +1,190 @@
+type,name,res_id,src,value,fuzzy
+error,calendar.calendar,0,A user can have only one calendar!,Un usuario solo puede tener un calendario,0
+error,calendar.calendar,0,The name of calendar must be unique!,El nombre del calendario debe ser único,0
+error,calendar.category,0,The name of calendar category must be unique!,El nombre de la categoría  del calendario debe ser único,0
+error,calendar.event,0,Recurrence can not be recurrent!,Una recurrencia no puede ser recurrente,0
+error,calendar.event,0,UUID and recurrence must be unique in a calendar!,UUID y recurrencia deben ser únicos en un calendario,0
+error,calendar.location,0,The name of calendar location must be unique!,El nombre de la ubicación del calendario debe ser único,0
+error,calendar.rrule,0,"Invalid ""By Day""",Inválido «por día»,0
+error,calendar.rrule,0,"Invalid ""By Hour""",Inválido «por hora»,0
+error,calendar.rrule,0,"Invalid ""By Minute""",Inválido «por minuto»,0
+error,calendar.rrule,0,"Invalid ""By Month""",Inválido «por mes»,0
+error,calendar.rrule,0,"Invalid ""By Month Day""",Inválido «por día del mes»,0
+error,calendar.rrule,0,"Invalid ""By Position""",Inválido «por posición»,0
+error,calendar.rrule,0,"Invalid ""By Second""",Inválido «por segundos»,0
+error,calendar.rrule,0,"Invalid ""By Week Number""",Inválido «por número de semana»,0
+error,calendar.rrule,0,"Invalid ""By Year Day""",Inválido «por día del año»,0
+error,calendar.rrule,0,"Only one of ""until"" and ""count"" can be set!",Solo se puede usar o «hasta» o «Número de veces»,0
+field,"calendar.alarm,rec_name",0,Name,Nombre,0
+field,"calendar.alarm,valarm",0,valarm,valarm,0
+field,"calendar.attendee,attendee",0,attendee,asistentes,0
+field,"calendar.attendee,email",0,Email,Correo electrónico,0
+field,"calendar.attendee,rec_name",0,Name,Nombre,0
+field,"calendar.attendee,status",0,Participation Status,Estado de participación,0
+field,"calendar.calendar,description",0,Description,Descripción,0
+field,"calendar.calendar,name",0,Name,Nombre,0
+field,"calendar.calendar,owner",0,Owner,Dueño,0
+field,"calendar.calendar-read-res.user,calendar",0,Calendar,Calendario,0
+field,"calendar.calendar-read-res.user,rec_name",0,Name,Nombre,0
+field,"calendar.calendar-read-res.user,user",0,User,Usuario,0
+field,"calendar.calendar,read_users",0,Read Users,Usuarios con lectura,0
+field,"calendar.calendar,rec_name",0,Name,Nombre,0
+field,"calendar.calendar-write-res.user,calendar",0,Calendar,Calendario,0
+field,"calendar.calendar-write-res.user,rec_name",0,Name,Nombre,0
+field,"calendar.calendar-write-res.user,user",0,User,Usuario,0
+field,"calendar.calendar,write_users",0,Write Users,Usuarios con escritura,0
+field,"calendar.category,name",0,Name,Nombre,0
+field,"calendar.category,rec_name",0,Name,Nombre,0
+field,"calendar.event.alarm,calendar_alarm",0,Calendar Alarm,Alarma del calendario,0
+field,"calendar.event.alarm,event",0,Event,Evento,0
+field,"calendar.event.alarm,rec_name",0,Name,Nombre,0
+field,"calendar.event,alarms",0,Alarms,Alarmas,0
+field,"calendar.event,all_day",0,All Day,Todo el día,0
+field,"calendar.event.attendee,calendar_attendee",0,Calendar Attendee,Calendario de asistentes,0
+field,"calendar.event.attendee,event",0,Event,Evento,0
+field,"calendar.event.attendee,rec_name",0,Name,Nombre,0
+field,"calendar.event,attendees",0,Attendees,Asistentes,0
+field,"calendar.event,calendar",0,Calendar,Calendario,0
+field,"calendar.event-calendar.category,category",0,Category,Categoría,0
+field,"calendar.event-calendar.category,event",0,Event,Evento,0
+field,"calendar.event-calendar.category,rec_name",0,Name,Nombre,0
+field,"calendar.event,calendar_owner",0,Owner,Dueño,0
+field,"calendar.event,calendar_read_users",0,Read Users,Usuarios con lectura,0
+field,"calendar.event,calendar_write_users",0,Write Users,Usuarios con escritura,0
+field,"calendar.event,categories",0,Categories,Categorías,0
+field,"calendar.event,classification",0,Classification,Clasificación,0
+field,"calendar.event,classification_public",0,Classification Public,Clasificación pública,0
+field,"calendar.event,description",0,Description,Descripción,0
+field,"calendar.event,dtend",0,End Date,Fecha fin,0
+field,"calendar.event,dtstart",0,Start Date,Fecha inicio,0
+field,"calendar.event.exdate,calendar_rdate",0,Calendar RDate,Fecha de recurrencia,0
+field,"calendar.event.exdate,event",0,Event,Evento,0
+field,"calendar.event.exdate,rec_name",0,Name,Nombre,0
+field,"calendar.event,exdates",0,Exception Dates,Fechas excluidas,0
+field,"calendar.event.exrule,calendar_rrule",0,Calendar RRule,Regla de recurrencia,0
+field,"calendar.event.exrule,event",0,Event,Evento,0
+field,"calendar.event.exrule,rec_name",0,Name,Nombre,0
+field,"calendar.event,exrules",0,Exception Rules,Reglas de excepción,0
+field,"calendar.event,location",0,Location,Ubicación,0
+field,"calendar.event,occurences",0,Occurences,Ocurrencias,0
+field,"calendar.event,organizer",0,Organizer,Organizador,0
+field,"calendar.event,parent",0,Parent,Padre,0
+field,"calendar.event.rdate,calendar_rdate",0,Calendar RDate,Fecha de recurrencia,0
+field,"calendar.event.rdate,event",0,Event,Evento,0
+field,"calendar.event.rdate,rec_name",0,Name,Nombre,0
+field,"calendar.event,rdates",0,Recurrence Dates,Fechas de recurrencia,0
+field,"calendar.event,rec_name",0,Name,Nombre,0
+field,"calendar.event,recurrence",0,Recurrence,Recurrencia,0
+field,"calendar.event.rrule,calendar_rrule",0,Calendar RRule,Regla de recurrencia,0
+field,"calendar.event.rrule,event",0,Event,Evento,0
+field,"calendar.event.rrule,rec_name",0,Name,Nombre,0
+field,"calendar.event,rrules",0,Recurrence Rules,Reglas de recurrencia,0
+field,"calendar.event,sequence",0,Sequence,Secuencia,0
+field,"calendar.event,status",0,Status,Estado,0
+field,"calendar.event,summary",0,Summary,Resumen,0
+field,"calendar.event,timezone",0,Timezone,Zona horaria,0
+field,"calendar.event,transp",0,Time Transparency,Tiempo de transparencia,0
+field,"calendar.event,uuid",0,UUID,UUID,0
+field,"calendar.event,vevent",0,vevent,vevent,0
+field,"calendar.location,name",0,Name,Nombre,0
+field,"calendar.location,rec_name",0,Name,Nombre,0
+field,"calendar.rdate,date",0,Is Date,Es fecha,0
+field,"calendar.rdate,datetime",0,Date,Fecha,0
+field,"calendar.rdate,rec_name",0,Name,Nombre,0
+field,"calendar.rrule,byday",0,By Day,Por día,0
+field,"calendar.rrule,byhour",0,By Hour,Por hora,0
+field,"calendar.rrule,byminute",0,By Minute,Por minuto,0
+field,"calendar.rrule,bymonth",0,By Month,Por mes,0
+field,"calendar.rrule,bymonthday",0,By Month Day,Por día del mes,0
+field,"calendar.rrule,bysecond",0,By Second,Por segundo,0
+field,"calendar.rrule,bysetpos",0,By Position,Por posición,0
+field,"calendar.rrule,byweekno",0,By Week Number,Por día de la semana,0
+field,"calendar.rrule,byyearday",0,By Year Day,Por día del año,0
+field,"calendar.rrule,count",0,Count,Número de veces,0
+field,"calendar.rrule,freq",0,Frequency,Frecuencia,0
+field,"calendar.rrule,interval",0,Interval,Intervalo,0
+field,"calendar.rrule,rec_name",0,Name,Nombre,0
+field,"calendar.rrule,until",0,Until Date,Hasta la fecha,0
+field,"calendar.rrule,until_date",0,Is Date,Es fecha,0
+field,"calendar.rrule,wkst",0,Week Day,Día de la semana,0
+field,"res.user,calendars",0,Calendars,Calendarios,0
+help,"calendar.calendar,owner",0,The user must have an email,El usuario debe tener un correo electrónico,0
+help,"calendar.event,uuid",0,Universally Unique Identifier,Identificador universal único,0
+help,"calendar.rdate,date",0,"Ignore time of field ""Date"", but handle as date only.",Ignora la hora del campo «Fecha» y lo trata como fecha.,0
+help,"calendar.rrule,until_date",0,"Ignore time of field ""Until Date"", but handle as date only.","Ignora la hora del campo «Hasta la fecha», y trata solo la fecha",0
+model,"calendar.alarm,name",0,Alarm,Alarma,0
+model,"calendar.attendee,name",0,Attendee,Asistentes,0
+model,"calendar.calendar,name",0,Calendar,Calendario,0
+model,"calendar.calendar-read-res.user,name",0,Calendar - read - User,Calendario - leer - usuario,0
+model,"calendar.calendar-write-res.user,name",0,Calendar - write - User,Calendario - escribir - usuario,0
+model,"calendar.category,name",0,Category,Categoría,0
+model,"calendar.event.alarm,name",0,Alarm,Alarma,0
+model,"calendar.event.attendee,name",0,Attendee,Asistentes,0
+model,"calendar.event-calendar.category,name",0,Event - Category,Evento - Categoría,0
+model,"calendar.event.exdate,name",0,Exception Date,Fecha excluida,0
+model,"calendar.event.exrule,name",0,Exception Rule,Regla de excepción,0
+model,"calendar.event,name",0,Event,Evento,0
+model,"calendar.event.rdate,name",0,Recurrence Date,Fecha de recurrencia,0
+model,"calendar.event.rrule,name",0,Recurrence Rule,Regla de recurrencia,0
+model,"calendar.location,name",0,Location,Ubicación,0
+model,"calendar.rdate,name",0,Recurrence Date,Fecha de recurrencia,0
+model,"calendar.rrule,name",0,Recurrence Rule,Regla de recurrencia,0
+model,"ir.action,name",act_calendar_form,Calendars,Calendarios,0
+model,"ir.action,name",act_event_form,Events,Eventos,0
+model,"ir.ui.menu,name",menu_calendar,Calendar Management,Gestión de calendario,0
+model,"ir.ui.menu,name",menu_calendar_form,Calendars,Calendarios,0
+model,"ir.ui.menu,name",menu_event_form,Events,Eventos,0
+model,"res.group,name",group_calendar_admin,Calendar Administration,Administración de calendario,0
+selection,"calendar.attendee,status",0,,,0
+selection,"calendar.attendee,status",0,Accepted,Aceptada,0
+selection,"calendar.attendee,status",0,Declined,Rehusado,0
+selection,"calendar.attendee,status",0,Delegated,Delegada,0
+selection,"calendar.attendee,status",0,Needs Action,Necesita una acción,0
+selection,"calendar.attendee,status",0,Tentative,Tentativa,0
+selection,"calendar.event,classification",0,Confidential,Confidencial,0
+selection,"calendar.event,classification",0,Private,Privado,0
+selection,"calendar.event,classification",0,Public,Público,0
+selection,"calendar.event,status",0,,,0
+selection,"calendar.event,status",0,Cancelled,Cancelado,0
+selection,"calendar.event,status",0,Confirmed,Confirmada,0
+selection,"calendar.event,status",0,Tentative,Tentativo,0
+selection,"calendar.event,transp",0,Opaque,Opaco,0
+selection,"calendar.event,transp",0,Transparent,Transparente,0
+selection,"calendar.rrule,freq",0,Daily,Diariamente,0
+selection,"calendar.rrule,freq",0,Hourly,Cada hora,0
+selection,"calendar.rrule,freq",0,Minutely,Cada minuto,0
+selection,"calendar.rrule,freq",0,Monthly,Mensualmente,0
+selection,"calendar.rrule,freq",0,Secondly,Cada segundo,0
+selection,"calendar.rrule,freq",0,Weekly,Semanalmente,0
+selection,"calendar.rrule,freq",0,Yearly,Anualmente,0
+selection,"calendar.rrule,wkst",0,Friday,Viernes,0
+selection,"calendar.rrule,wkst",0,Monday,Lunes,0
+selection,"calendar.rrule,wkst",0,Saturday,Sábado,0
+selection,"calendar.rrule,wkst",0,Sunday,Domingo,0
+selection,"calendar.rrule,wkst",0,Thursday,Jueves,0
+selection,"calendar.rrule,wkst",0,Tuesday,Martes,0
+selection,"calendar.rrule,wkst",0,Wednesday,Miércoles,0
+view,calendar.calendar,0,Calendar,Calendario,0
+view,calendar.calendar,0,Calendars,Calendarios,0
+view,calendar.calendar,0,General,General,0
+view,calendar.calendar,0,Security,Seguridad,0
+view,calendar.category,0,Categories,Categorías,0
+view,calendar.category,0,Category,Categoría,0
+view,calendar.event,0,Attendees,Asistentes,0
+view,calendar.event,0,Categories,Categorías,0
+view,calendar.event,0,Event,Evento,0
+view,calendar.event,0,Events,Eventos,0
+view,calendar.event,0,General,General,0
+view,calendar.event,0,Occurences,Ocurrencias,0
+view,calendar.event.attendee,0,Attendee,Asistentes,0
+view,calendar.event.attendee,0,Attendees,Asistentes,0
+view,calendar.event.exdate,0,Exception Date,Fecha excluida,0
+view,calendar.event.exdate,0,Exception Dates,Fechas excluidas,0
+view,calendar.event.exrule,0,Exception Rule,Regla de excepción,0
+view,calendar.event.exrule,0,Exception Rules,Reglas de excepciones,0
+view,calendar.event.rdate,0,Recurrence Date,Fecha de recurrencia,0
+view,calendar.event.rdate,0,Recurrence Dates,Fechas de recurrencia,0
+view,calendar.event.rrule,0,Recurrence Rule,Regla de recurrencia,0
+view,calendar.event.rrule,0,Recurrence Rules,Reglas de recurrencia,0
+view,calendar.location,0,Location,Ubicación,0
+view,calendar.location,0,Locations,Ubicaciones,0
diff --git a/fr_FR.csv b/fr_FR.csv
new file mode 100644
index 0000000..68ec678
--- /dev/null
+++ b/fr_FR.csv
@@ -0,0 +1,190 @@
+type,name,res_id,src,value,fuzzy
+error,calendar.calendar,0,A user can have only one calendar!,Un utilisateur ne peut avoir qu'un seul calendrier !,0
+error,calendar.calendar,0,The name of calendar must be unique!,Le nom du calendrier doit être unique !,0
+error,calendar.category,0,The name of calendar category must be unique!,Le nom de la catégorie de calendrier doit être unique,0
+error,calendar.event,0,Recurrence can not be recurrent!,Une récurrence ne peut pas être récurrente !,0
+error,calendar.event,0,UUID and recurrence must be unique in a calendar!,UUID et récurrence doivent être uniques sur un calendrier !,0
+error,calendar.location,0,The name of calendar location must be unique!,Le nom de l'emplacement doit être unique !,0
+error,calendar.rrule,0,"Invalid ""By Day""","""Par jour"" invalide",0
+error,calendar.rrule,0,"Invalid ""By Hour""","""Par heure"" invalide",0
+error,calendar.rrule,0,"Invalid ""By Minute""","""Par minute"" invalide",0
+error,calendar.rrule,0,"Invalid ""By Month""","""Par mois"" invalide",0
+error,calendar.rrule,0,"Invalid ""By Month Day""","""Par jour du mois"" invalide",0
+error,calendar.rrule,0,"Invalid ""By Position""","""Par position"" invalide",0
+error,calendar.rrule,0,"Invalid ""By Second""","""Par seconde"" invalide",0
+error,calendar.rrule,0,"Invalid ""By Week Number""","""Par jour de la semaine"" invalide",0
+error,calendar.rrule,0,"Invalid ""By Year Day""","""Par jour de l'année"" invalide",0
+error,calendar.rrule,0,"Only one of ""until"" and ""count"" can be set!","""Date de fin"" et ""Répétitions"" ne peuvent être remplis en même temps !",0
+field,"calendar.alarm,rec_name",0,Name,Nom,0
+field,"calendar.alarm,valarm",0,valarm,valarm,0
+field,"calendar.attendee,attendee",0,attendee,participant,0
+field,"calendar.attendee,email",0,Email,E-mail,0
+field,"calendar.attendee,rec_name",0,Name,Nom,0
+field,"calendar.attendee,status",0,Participation Status,Statut de participation,0
+field,"calendar.calendar,description",0,Description,Description,0
+field,"calendar.calendar,name",0,Name,Nom,0
+field,"calendar.calendar,owner",0,Owner,Propriétaire,0
+field,"calendar.calendar-read-res.user,calendar",0,Calendar,Calendrier,0
+field,"calendar.calendar-read-res.user,rec_name",0,Name,Nom,0
+field,"calendar.calendar-read-res.user,user",0,User,Utilisateur,0
+field,"calendar.calendar,read_users",0,Read Users,Utilisateurs en lecture,0
+field,"calendar.calendar,rec_name",0,Name,Nom,0
+field,"calendar.calendar-write-res.user,calendar",0,Calendar,Calendrier,0
+field,"calendar.calendar-write-res.user,rec_name",0,Name,Nom,0
+field,"calendar.calendar-write-res.user,user",0,User,Utilisateur,0
+field,"calendar.calendar,write_users",0,Write Users,Utilisateurs en écriture,0
+field,"calendar.category,name",0,Name,Nom,0
+field,"calendar.category,rec_name",0,Name,Nom,0
+field,"calendar.event.alarm,calendar_alarm",0,Calendar Alarm,Alarme calendrier,0
+field,"calendar.event.alarm,event",0,Event,Événement,0
+field,"calendar.event.alarm,rec_name",0,Name,Nom,0
+field,"calendar.event,alarms",0,Alarms,Alarmes,0
+field,"calendar.event,all_day",0,All Day,Toute la journée,0
+field,"calendar.event.attendee,calendar_attendee",0,Calendar Attendee,Participant calendrier,0
+field,"calendar.event.attendee,event",0,Event,Événement,0
+field,"calendar.event.attendee,rec_name",0,Name,Nom,0
+field,"calendar.event,attendees",0,Attendees,Participants,0
+field,"calendar.event,calendar",0,Calendar,Calendrier,0
+field,"calendar.event-calendar.category,category",0,Category,Catégorie,0
+field,"calendar.event-calendar.category,event",0,Event,Événement,0
+field,"calendar.event-calendar.category,rec_name",0,Name,Nom,0
+field,"calendar.event,calendar_owner",0,Owner,Propriétaire,0
+field,"calendar.event,calendar_read_users",0,Read Users,Utilisateurs en lecture,0
+field,"calendar.event,calendar_write_users",0,Write Users,Utilisateurs en écriture,0
+field,"calendar.event,categories",0,Categories,Catégories,0
+field,"calendar.event,classification",0,Classification,Classification,0
+field,"calendar.event,classification_public",0,Classification Public,Classification publique,0
+field,"calendar.event,description",0,Description,Description,0
+field,"calendar.event,dtend",0,End Date,Date de fin,0
+field,"calendar.event,dtstart",0,Start Date,Date de début,0
+field,"calendar.event.exdate,calendar_rdate",0,Calendar RDate,Date de récurrence,0
+field,"calendar.event.exdate,event",0,Event,Événement,0
+field,"calendar.event.exdate,rec_name",0,Name,Nom,0
+field,"calendar.event,exdates",0,Exception Dates,Dates d'exception,0
+field,"calendar.event.exrule,calendar_rrule",0,Calendar RRule,Règle de récurrence,0
+field,"calendar.event.exrule,event",0,Event,Événement,0
+field,"calendar.event.exrule,rec_name",0,Name,Nom,0
+field,"calendar.event,exrules",0,Exception Rules,Règles d'exception,0
+field,"calendar.event,location",0,Location,Emplacement,0
+field,"calendar.event,occurences",0,Occurences,Occurrences,0
+field,"calendar.event,organizer",0,Organizer,Organisateur,0
+field,"calendar.event,parent",0,Parent,Parent,0
+field,"calendar.event.rdate,calendar_rdate",0,Calendar RDate,Date de récurrence,0
+field,"calendar.event.rdate,event",0,Event,Événement,0
+field,"calendar.event.rdate,rec_name",0,Name,Nom,0
+field,"calendar.event,rdates",0,Recurrence Dates,Dates de récurrence,0
+field,"calendar.event,rec_name",0,Name,Nom,0
+field,"calendar.event,recurrence",0,Recurrence,Récurrence,0
+field,"calendar.event.rrule,calendar_rrule",0,Calendar RRule,Règle de récurrence,0
+field,"calendar.event.rrule,event",0,Event,Événement,0
+field,"calendar.event.rrule,rec_name",0,Name,Nom,0
+field,"calendar.event,rrules",0,Recurrence Rules,Règles de récurrence,0
+field,"calendar.event,sequence",0,Sequence,Séquence,0
+field,"calendar.event,status",0,Status,Statut,0
+field,"calendar.event,summary",0,Summary,Résumé,0
+field,"calendar.event,timezone",0,Timezone,Fuseau Horaire,0
+field,"calendar.event,transp",0,Time Transparency,Transparence,0
+field,"calendar.event,uuid",0,UUID,UUID,0
+field,"calendar.event,vevent",0,vevent,vevent,0
+field,"calendar.location,name",0,Name,Nom,0
+field,"calendar.location,rec_name",0,Name,Nom,0
+field,"calendar.rdate,date",0,Is Date,Est une date,0
+field,"calendar.rdate,datetime",0,Date,Date,0
+field,"calendar.rdate,rec_name",0,Name,Nom,0
+field,"calendar.rrule,byday",0,By Day,Par jour,0
+field,"calendar.rrule,byhour",0,By Hour,Par heure,0
+field,"calendar.rrule,byminute",0,By Minute,Par minute,0
+field,"calendar.rrule,bymonth",0,By Month,Par mois,0
+field,"calendar.rrule,bymonthday",0,By Month Day,Par jour du mois,0
+field,"calendar.rrule,bysecond",0,By Second,Par seconde,0
+field,"calendar.rrule,bysetpos",0,By Position,Par position,0
+field,"calendar.rrule,byweekno",0,By Week Number,Par numéro de semaine,0
+field,"calendar.rrule,byyearday",0,By Year Day,Par jour de l'année,0
+field,"calendar.rrule,count",0,Count,Répétitions,0
+field,"calendar.rrule,freq",0,Frequency,Fréquence,0
+field,"calendar.rrule,interval",0,Interval,Intervalle,0
+field,"calendar.rrule,rec_name",0,Name,Nom,0
+field,"calendar.rrule,until",0,Until Date,Date de fin,0
+field,"calendar.rrule,until_date",0,Is Date,Est une date,0
+field,"calendar.rrule,wkst",0,Week Day,Jour de la semaine,0
+field,"res.user,calendars",0,Calendars,Calendriers,0
+help,"calendar.calendar,owner",0,The user must have an email,L'utilisateur doit avoir une adresse mail,0
+help,"calendar.event,uuid",0,Universally Unique Identifier,Identificateur unique universel,0
+help,"calendar.rdate,date",0,"Ignore time of field ""Date"", but handle as date only.","Ignore l'heure du champ ""Date""",0
+help,"calendar.rrule,until_date",0,"Ignore time of field ""Until Date"", but handle as date only.","Ignore l'heure du champ ""Date de fin""",0
+model,"calendar.alarm,name",0,Alarm,Alarme,0
+model,"calendar.attendee,name",0,Attendee,Participant,0
+model,"calendar.calendar,name",0,Calendar,Calendrier,0
+model,"calendar.calendar-read-res.user,name",0,Calendar - read - User,Calendrier - Lecture - Utilisateur,0
+model,"calendar.calendar-write-res.user,name",0,Calendar - write - User,Calendrier - Écriture - Utilisateur,0
+model,"calendar.category,name",0,Category,Catégorie,0
+model,"calendar.event.alarm,name",0,Alarm,Alarme,0
+model,"calendar.event.attendee,name",0,Attendee,Participant,0
+model,"calendar.event-calendar.category,name",0,Event - Category,Évenement - Catégorie,0
+model,"calendar.event.exdate,name",0,Exception Date,Date d'exception,0
+model,"calendar.event.exrule,name",0,Exception Rule,Règle d'exception,0
+model,"calendar.event,name",0,Event,Événement,0
+model,"calendar.event.rdate,name",0,Recurrence Date,Date de récurrence,0
+model,"calendar.event.rrule,name",0,Recurrence Rule,Règle de récurrence,0
+model,"calendar.location,name",0,Location,Emplacement,0
+model,"calendar.rdate,name",0,Recurrence Date,Date de récurrence,0
+model,"calendar.rrule,name",0,Recurrence Rule,Règle de récurrence,0
+model,"ir.action,name",act_calendar_form,Calendars,Calendriers,0
+model,"ir.action,name",act_event_form,Events,Événement,0
+model,"ir.ui.menu,name",menu_calendar,Calendar Management,Gestion de calendrier,0
+model,"ir.ui.menu,name",menu_calendar_form,Calendars,Calendriers,0
+model,"ir.ui.menu,name",menu_event_form,Events,Évenement,0
+model,"res.group,name",group_calendar_admin,Calendar Administration,Administration calendrier,0
+selection,"calendar.attendee,status",0,,,0
+selection,"calendar.attendee,status",0,Accepted,Accepté,0
+selection,"calendar.attendee,status",0,Declined,Décliné,0
+selection,"calendar.attendee,status",0,Delegated,Délégué,0
+selection,"calendar.attendee,status",0,Needs Action,Nécessite une action,0
+selection,"calendar.attendee,status",0,Tentative,Tentative,0
+selection,"calendar.event,classification",0,Confidential,Confidentiel,0
+selection,"calendar.event,classification",0,Private,Privé,0
+selection,"calendar.event,classification",0,Public,Publique,0
+selection,"calendar.event,status",0,,,0
+selection,"calendar.event,status",0,Cancelled,Annulé,0
+selection,"calendar.event,status",0,Confirmed,Confirmé,0
+selection,"calendar.event,status",0,Tentative,Tentative,0
+selection,"calendar.event,transp",0,Opaque,Opaque,0
+selection,"calendar.event,transp",0,Transparent,transparent,0
+selection,"calendar.rrule,freq",0,Daily,Journalier,0
+selection,"calendar.rrule,freq",0,Hourly,Horaire,0
+selection,"calendar.rrule,freq",0,Minutely,Chaque minute,0
+selection,"calendar.rrule,freq",0,Monthly,Mensuel,0
+selection,"calendar.rrule,freq",0,Secondly,Chaque seconde,0
+selection,"calendar.rrule,freq",0,Weekly,hebdomadaire,0
+selection,"calendar.rrule,freq",0,Yearly,Annuel,0
+selection,"calendar.rrule,wkst",0,Friday,Vendredi,0
+selection,"calendar.rrule,wkst",0,Monday,Lundi,0
+selection,"calendar.rrule,wkst",0,Saturday,Samedi,0
+selection,"calendar.rrule,wkst",0,Sunday,Dimanche,0
+selection,"calendar.rrule,wkst",0,Thursday,Jeudi,0
+selection,"calendar.rrule,wkst",0,Tuesday,Mardi,0
+selection,"calendar.rrule,wkst",0,Wednesday,Mercredi,0
+view,calendar.calendar,0,Calendar,Calendrier,0
+view,calendar.calendar,0,Calendars,Calendriers,0
+view,calendar.calendar,0,General,Général,0
+view,calendar.calendar,0,Security,Sécurité,0
+view,calendar.category,0,Categories,Catégories,0
+view,calendar.category,0,Category,Catégorie,0
+view,calendar.event,0,Attendees,Participants,0
+view,calendar.event,0,Categories,Catégories,0
+view,calendar.event,0,Event,Événement,0
+view,calendar.event,0,Events,Événements,0
+view,calendar.event,0,General,Général,0
+view,calendar.event,0,Occurences,Occurrences,0
+view,calendar.event.attendee,0,Attendee,Participant,0
+view,calendar.event.attendee,0,Attendees,Participants,0
+view,calendar.event.exdate,0,Exception Date,Date d'exception,0
+view,calendar.event.exdate,0,Exception Dates,Dates d'exception,0
+view,calendar.event.exrule,0,Exception Rule,Règle d'exception,0
+view,calendar.event.exrule,0,Exception Rules,Règles d'exception,0
+view,calendar.event.rdate,0,Recurrence Date,Date de récurrence,0
+view,calendar.event.rdate,0,Recurrence Dates,Dates de récurrence,0
+view,calendar.event.rrule,0,Recurrence Rule,Règle de récurrence,0
+view,calendar.event.rrule,0,Recurrence Rules,Règles de récurrence,0
+view,calendar.location,0,Location,Emplacement,0
+view,calendar.location,0,Locations,Emplacements,0
diff --git a/res.py b/res.py
new file mode 100644
index 0000000..66e3a3f
--- /dev/null
+++ b/res.py
@@ -0,0 +1,25 @@
+#This file is part of Tryton.  The COPYRIGHT file at the top level of
+#this repository contains the full copyright notices and license terms.
+from trytond.model import ModelView, ModelSQL, fields
+import copy
+
+
+class User(ModelSQL, ModelView):
+    _name = 'res.user'
+
+    calendars = fields.One2Many('calendar.calendar', 'owner', 'Calendars')
+
+    def __init__(self):
+        super(User, self).__init__()
+        self.email = copy.copy(self.email)
+        self.email.states = copy.copy(self.email.states)
+        self.email.depends = copy.copy(self.email.depends)
+        if 'required' in self.email.states:
+            self.email.states['required'] = '(' + self.email.states['required'] \
+                    + ') or bool(calendars)'
+        else:
+            self.email.states['required'] = 'bool(calendars)'
+        if 'calendars' not in self.email.depends:
+            self.email.depends.append('calendars')
+
+User()
diff --git a/setup.cfg b/setup.cfg
new file mode 100644
index 0000000..861a9f5
--- /dev/null
+++ b/setup.cfg
@@ -0,0 +1,5 @@
+[egg_info]
+tag_build = 
+tag_date = 0
+tag_svn_revision = 0
+
diff --git a/setup.py b/setup.py
new file mode 100644
index 0000000..acce95a
--- /dev/null
+++ b/setup.py
@@ -0,0 +1,58 @@
+#!/usr/bin/env python
+#This file is part of Tryton.  The COPYRIGHT file at the top level of
+#this repository contains the full copyright notices and license terms.
+
+from setuptools import setup, find_packages
+import re
+
+info = eval(file('__tryton__.py').read())
+
+requires = ['vobject', 'PyWebDAV', 'python-dateutil', 'pytz']
+for dep in info.get('depends', []):
+    if not re.match(r'(ir|res|workflow|webdav)(\W|$)', dep):
+        requires.append('trytond_' + dep)
+
+major_version, minor_version, _ = info.get('version', '0.0.1').split('.', 2)
+requires.append('trytond >= %s.%s' % (major_version, minor_version))
+requires.append('trytond < %s.%s' % (major_version, int(minor_version) + 1))
+
+setup(name='trytond_calendar',
+    version=info.get('version', '0.0.1'),
+    description=info.get('description', ''),
+    author=info.get('author', ''),
+    author_email=info.get('email', ''),
+    url=info.get('website', ''),
+    download_url="http://downloads.tryton.org/" + \
+            info.get('version', '0.0.1').rsplit('.', 1)[0] + '/',
+    package_dir={'trytond.modules.calendar': '.'},
+    packages=[
+        'trytond.modules.calendar',
+    ],
+    package_data={
+        'trytond.modules.calendar': info.get('xml', []) \
+                + info.get('translation', []),
+    },
+    classifiers=[
+        'Development Status :: 5 - Production/Stable',
+        'Environment :: Plugins',
+        'Intended Audience :: Developers',
+        'Intended Audience :: Financial and Insurance Industry',
+        'Intended Audience :: Legal Industry',
+        'Intended Audience :: Manufacturing',
+        'License :: OSI Approved :: GNU General Public License (GPL)',
+        'Natural Language :: English',
+        'Natural Language :: French',
+        'Natural Language :: German',
+        'Natural Language :: Spanish',
+        'Operating System :: OS Independent',
+        'Programming Language :: Python',
+        'Topic :: Office/Business',
+    ],
+    license='GPL-3',
+    install_requires=requires,
+    zip_safe=False,
+    entry_points="""
+    [trytond.modules]
+    calendar = trytond.modules.calendar
+    """,
+)
diff --git a/tests/__init__.py b/tests/__init__.py
new file mode 100644
index 0000000..2680025
--- /dev/null
+++ b/tests/__init__.py
@@ -0,0 +1,4 @@
+#This file is part of Tryton.  The COPYRIGHT file at the top level of
+#this repository contains the full copyright notices and license terms.
+
+from test_calendar import *
diff --git a/tests/test_calendar.py b/tests/test_calendar.py
new file mode 100644
index 0000000..78e6314
--- /dev/null
+++ b/tests/test_calendar.py
@@ -0,0 +1,38 @@
+#!/usr/bin/env python
+#This file is part of Tryton.  The COPYRIGHT file at the top level of
+#this repository contains the full copyright notices and license terms.
+
+import sys, os
+DIR = os.path.abspath(os.path.normpath(os.path.join(__file__,
+    '..', '..', '..', '..', '..', 'trytond')))
+if os.path.isdir(DIR):
+    sys.path.insert(0, os.path.dirname(DIR))
+
+import unittest
+import trytond.tests.test_tryton
+from trytond.tests.test_tryton import RPCProxy, CONTEXT, SOCK, test_view
+
+
+class CalendarTestCase(unittest.TestCase):
+    '''
+    Test Calendar module.
+    '''
+
+    def setUp(self):
+        trytond.tests.test_tryton.install_module('calendar')
+
+    def test0005views(self):
+        '''
+        Test views.
+        '''
+        self.assertRaises(Exception, test_view('calendar'))
+
+def suite():
+    return unittest.TestLoader().loadTestsFromTestCase(CalendarTestCase)
+
+if __name__ == '__main__':
+    suiteTrytond = trytond.tests.test_tryton.suite()
+    suiteCalendar = suite()
+    alltests = unittest.TestSuite([suiteTrytond, suiteCalendar])
+    unittest.TextTestRunner(verbosity=2).run(alltests)
+    SOCK.disconnect()
diff --git a/trytond_calendar.egg-info/PKG-INFO b/trytond_calendar.egg-info/PKG-INFO
new file mode 100644
index 0000000..d54b60d
--- /dev/null
+++ b/trytond_calendar.egg-info/PKG-INFO
@@ -0,0 +1,25 @@
+Metadata-Version: 1.0
+Name: trytond-calendar
+Version: 1.4.0
+Summary: Add CalDAV support
+Home-page: http://www.tryton.org/
+Author: B2CK
+Author-email: info at b2ck.com
+License: GPL-3
+Download-URL: http://downloads.tryton.org/1.4/
+Description: UNKNOWN
+Platform: UNKNOWN
+Classifier: Development Status :: 5 - Production/Stable
+Classifier: Environment :: Plugins
+Classifier: Intended Audience :: Developers
+Classifier: Intended Audience :: Financial and Insurance Industry
+Classifier: Intended Audience :: Legal Industry
+Classifier: Intended Audience :: Manufacturing
+Classifier: License :: OSI Approved :: GNU General Public License (GPL)
+Classifier: Natural Language :: English
+Classifier: Natural Language :: French
+Classifier: Natural Language :: German
+Classifier: Natural Language :: Spanish
+Classifier: Operating System :: OS Independent
+Classifier: Programming Language :: Python
+Classifier: Topic :: Office/Business
diff --git a/trytond_calendar.egg-info/SOURCES.txt b/trytond_calendar.egg-info/SOURCES.txt
new file mode 100644
index 0000000..bafc0ca
--- /dev/null
+++ b/trytond_calendar.egg-info/SOURCES.txt
@@ -0,0 +1,27 @@
+CHANGELOG
+COPYRIGHT
+INSTALL
+LICENSE
+MANIFEST.in
+README
+calendar.xml
+de_DE.csv
+es_CO.csv
+es_ES.csv
+fr_FR.csv
+setup.py
+./__init__.py
+./__tryton__.py
+./caldav.py
+./calendar.py
+./res.py
+./webdav.py
+tests/__init__.py
+tests/test_calendar.py
+trytond_calendar.egg-info/PKG-INFO
+trytond_calendar.egg-info/SOURCES.txt
+trytond_calendar.egg-info/dependency_links.txt
+trytond_calendar.egg-info/entry_points.txt
+trytond_calendar.egg-info/not-zip-safe
+trytond_calendar.egg-info/requires.txt
+trytond_calendar.egg-info/top_level.txt
\ No newline at end of file
diff --git a/trytond_calendar.egg-info/dependency_links.txt b/trytond_calendar.egg-info/dependency_links.txt
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/trytond_calendar.egg-info/dependency_links.txt
@@ -0,0 +1 @@
+
diff --git a/trytond_calendar.egg-info/entry_points.txt b/trytond_calendar.egg-info/entry_points.txt
new file mode 100644
index 0000000..b136ca9
--- /dev/null
+++ b/trytond_calendar.egg-info/entry_points.txt
@@ -0,0 +1,4 @@
+
+    [trytond.modules]
+    calendar = trytond.modules.calendar
+    
\ No newline at end of file
diff --git a/trytond_calendar.egg-info/not-zip-safe b/trytond_calendar.egg-info/not-zip-safe
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/trytond_calendar.egg-info/not-zip-safe
@@ -0,0 +1 @@
+
diff --git a/trytond_calendar.egg-info/requires.txt b/trytond_calendar.egg-info/requires.txt
new file mode 100644
index 0000000..2160975
--- /dev/null
+++ b/trytond_calendar.egg-info/requires.txt
@@ -0,0 +1,6 @@
+vobject
+PyWebDAV
+python-dateutil
+pytz
+trytond >= 1.4
+trytond < 1.5
\ No newline at end of file
diff --git a/trytond_calendar.egg-info/top_level.txt b/trytond_calendar.egg-info/top_level.txt
new file mode 100644
index 0000000..93df119
--- /dev/null
+++ b/trytond_calendar.egg-info/top_level.txt
@@ -0,0 +1 @@
+trytond
diff --git a/webdav.py b/webdav.py
new file mode 100644
index 0000000..66a3966
--- /dev/null
+++ b/webdav.py
@@ -0,0 +1,603 @@
+#This file is part of Tryton.  The COPYRIGHT file at the top level of
+#this repository contains the full copyright notices and license terms.
+from trytond.model import ModelView, ModelSQL
+from trytond.tools import Cache, reduce_ids
+from DAV.errors import DAV_NotFound, DAV_Forbidden
+import vobject
+import urllib
+
+CALDAV_NS = 'urn:ietf:params:xml:ns:caldav'
+
+
+class Collection(ModelSQL, ModelView):
+
+    _name = "webdav.collection"
+
+    def calendar(self, cursor, user, uri, ics=False, context=None):
+        '''
+        Return the calendar id in the uri or False
+
+        :param cursor: the database cursor
+        :param user: the user id
+        :param uri: the uri
+        :param context: the context
+        :return: calendar id
+            or False if there is no calendar
+        '''
+        calendar_obj = self.pool.get('calendar.calendar')
+
+        if uri and uri.startswith('Calendars/'):
+            calendar, uri = (uri[10:].split('/', 1) + [None])[0:2]
+            if ics:
+                if calendar.endswith('.ics'):
+                    calendar = calendar[:-4]
+                else:
+                    return False
+            return calendar_obj.get_name(cursor, user, calendar, context=context)
+        return False
+
+    def event(self, cursor, user, uri, calendar_id=False, context=None):
+        '''
+        Return the event id in the uri or False
+
+        :param cursor: the database cursor
+        :param user: the user id
+        :param uri: the uri
+        :param calendar_id: the calendar id
+        :param context: the context
+        :return: event id
+            or False if there is no event
+        '''
+        event_obj = self.pool.get('calendar.event')
+
+        if uri and uri.startswith('Calendars/'):
+            calendar, event_uri = (uri[10:].split('/', 1) + [None])[0:2]
+            if not calendar_id:
+                calendar_id = self.calendar(cursor, user, uri, context=context)
+                if not calendar_id:
+                    return False
+            event_ids = event_obj.search(cursor, user, [
+                ('calendar', '=', calendar_id),
+                ('uuid', '=', event_uri[:-4]),
+                ('parent', '=', False),
+                ], limit=1, context=context)
+            if event_ids:
+                return event_ids[0]
+        return False
+
+    event = Cache('webdav_collection.event')(event)
+
+    def _caldav_filter_domain_calendar(self, cursor, user, filter, context=None):
+        '''
+        Return a domain for caldav filter on calendar
+
+        :param cursor: the database cursor
+        :param user: the user id
+        :param filter: the DOM Element of filter
+        :param context: the context
+        :return: a list for domain
+        '''
+        if not filter:
+            return []
+        if filter.localName == 'principal-property-search':
+            return [('id', '=', 0)]
+        return [('id', '=', 0)]
+
+    def _caldav_filter_domain_event(self, cursor, user, filter, context=None):
+        '''
+        Return a domain for caldav filter on event
+
+        :param cursor: the database cursor
+        :param user: the user id
+        :param filter: the DOM Element of filter
+        :param context: the context
+        :return: a list for domain
+        '''
+        res = []
+        if not filter:
+            return []
+        if filter.localName == 'principal-property-search':
+            return [('id', '=', 0)]
+        elif filter.localName == 'calendar-query':
+            calendar_filter = None
+            for e in filter.childNodes:
+                if e.nodeType == e.TEXT_NODE:
+                    continue
+                if e.localName == 'filter':
+                    calendar_filter = e
+                    break
+            if calendar_filter is None:
+                return []
+            for vcalendar_filter in calendar_filter.childNodes:
+                if vcalendar_filter.nodeType == vcalendar_filter.TEXT_NODE:
+                    continue
+                if vcalendar_filter.getAttribute('name') != 'VCALENDAR':
+                    return [('id', '=', 0)]
+                vevent_filter = None
+                for vevent_filter in vcalendar_filter.childNodes:
+                    if vevent_filter.nodeType == vevent_filter.TEXT_NODE:
+                        vevent_filter = None
+                        continue
+                    if vevent_filter.localName == 'comp-filter':
+                        if vevent_filter.getAttribute('name') != 'VEVENT':
+                            vevent_filter = None
+                            continue
+                        break
+                if vevent_filter is None:
+                    return [('id', '=', 0)]
+                break
+            return []
+        elif filter.localName == 'calendar-multiget':
+            ids = []
+            for e in filter.childNodes:
+                if e.nodeType == e.TEXT_NODE:
+                    continue
+                if e.localName == 'href':
+                    if not e.firstChild:
+                        continue
+                    uri = e.firstChild.data
+                    dbname, uri = (uri.lstrip('/').split('/', 1) + [None])[0:2]
+                    if not dbname:
+                        continue
+                    dbname == urllib.unquote_plus(dbname)
+                    if dbname != cursor.database_name:
+                        continue
+                    if uri:
+                        uri = urllib.unquote_plus(uri)
+                    event_id = self.event(cursor, user, uri, context=context)
+                    if event_id:
+                        ids.append(event_id)
+            return [('id', 'in', ids)]
+        return res
+
+    def get_childs(self, cursor, user, uri, filter=None, context=None,
+            cache=None):
+        calendar_obj = self.pool.get('calendar.calendar')
+        event_obj = self.pool.get('calendar.event')
+
+        if uri in ('Calendars', 'Calendars/'):
+            domain = self._caldav_filter_domain_calendar(cursor, user,
+                    filter, context=context)
+            calendar_ids = calendar_obj.search(cursor, user, domain,
+                    context=context)
+            calendars = calendar_obj.browse(cursor, user, calendar_ids,
+                    context=context)
+            if cache is not None:
+                cache.setdefault('_calendar', {})
+                cache['_calendar'].setdefault(calendar_obj._name, {})
+                for calendar_id in calendar_ids:
+                    cache['_calendar'][calendar_obj._name][calendar_id] = {}
+            return [x.name for x in calendars] + \
+                    [x.name + '.ics' for x in calendars]
+        if uri and uri.startswith('Calendars/'):
+            calendar_id = self.calendar(cursor, user, uri, context=context)
+            if  calendar_id and not (uri[10:].split('/', 1) + [None])[1]:
+                domain = self._caldav_filter_domain_event(cursor, user, filter,
+                        context=context)
+                event_ids = event_obj.search(cursor, user, [
+                    ('calendar', '=', calendar_id),
+                    domain,
+                    ], context=context)
+                events = event_obj.browse(cursor, user, event_ids,
+                        context=context)
+                if cache is not None:
+                    cache.setdefault('_calendar', {})
+                    cache['_calendar'].setdefault(event_obj._name, {})
+                    for event_id in event_ids:
+                        cache['_calendar'][event_obj._name][event_id] = {}
+                return [x.uuid + '.ics' for x in events]
+            return []
+        res = super(Collection, self).get_childs(cursor, user, uri,
+                filter=filter, context=context, cache=cache)
+        if not uri and not filter:
+            res.append('Calendars')
+        elif not uri and filter:
+            if filter.localName == 'principal-property-search':
+                res.append('Calendars')
+        return res
+
+    def get_resourcetype(self, cursor, user, uri, context=None, cache=None):
+        from DAV.constants import COLLECTION, OBJECT
+        if uri in ('Calendars', 'Calendars/'):
+            return COLLECTION
+        calendar_id = self.calendar(cursor, user, uri, context=context)
+        if calendar_id:
+            if not (uri[10:].split('/', 1) + [None])[1]:
+                return COLLECTION
+            if self.event(cursor, user, uri, calendar_id=calendar_id,
+                    context=context):
+                return OBJECT
+        elif self.calendar(cursor, user, uri, ics=True, context=context):
+            return OBJECT
+        return super(Collection, self).get_resourcetype(cursor, user, uri,
+                context=context, cache=cache)
+
+    def get_contenttype(self, cursor, user, uri, context=None, cache=None):
+        if self.event(cursor, user, uri, context=context) \
+                or self.calendar(cursor, user, uri, ics=True, context=context):
+            return 'text/calendar'
+        return super(Collection, self).get_contenttype(cursor, user, uri,
+                context=context, cache=cache)
+
+    def get_creationdate(self, cursor, user, uri, context=None, cache=None):
+        calendar_obj = self.pool.get('calendar.calendar')
+        event_obj = self.pool.get('calendar.event')
+
+        calendar_id = self.calendar(cursor, user, uri, context=context)
+        if not calendar_id:
+            calendar_id = self.calendar(cursor, user, uri, ics=True,
+                    context=context)
+        if calendar_id:
+            if not (uri[10:].split('/', 1) + [None])[1]:
+                if cache is not None:
+                    cache.setdefault('_calendar', {})
+                    cache['_calendar'].setdefault(calendar_obj._name, {})
+                    ids = cache['_calendar'][calendar_obj._name].keys()
+                    if calendar_id not in ids:
+                        ids.append(calendar_id)
+                    elif 'creationdate' in cache['_calendar']\
+                            [calendar_obj._name][calendar_id]:
+                        return cache['_calendar'][calendar_obj._name]\
+                                [calendar_id]['creationdate']
+                else:
+                    ids = [calendar_id]
+                res = None
+                for i in range(0, len(ids), cursor.IN_MAX):
+                    sub_ids = ids[i:i + cursor.IN_MAX]
+                    red_sql, red_ids = reduce_ids('id', sub_ids)
+                    cursor.execute('SELECT id, ' \
+                                'EXTRACT(epoch FROM create_date) ' \
+                            'FROM "' + calendar_obj._table + '" ' \
+                            'WHERE ' + red_sql, red_ids)
+                    for calendar_id2, date in cursor.fetchall():
+                        if calendar_id2 == calendar_id:
+                            res = date
+                        if cache is not None:
+                            cache['_calendar'][calendar_obj._name]\
+                                    .setdefault(calendar_id2, {})
+                            cache['_calendar'][calendar_obj._name]\
+                                    [calendar_id2]['creationdate'] = date
+                if res is not None:
+                    return res
+            else:
+                event_id = self.event(cursor, user, uri, calendar_id=calendar_id,
+                        context=context)
+                if event_id:
+                    if cache is not None:
+                        cache.setdefault('_calendar', {})
+                        cache['_calendar'].setdefault(event_obj._name, {})
+                        ids = cache['_calendar'][event_obj._name].keys()
+                        if event_id not in ids:
+                            ids.append(event_id)
+                        elif 'creationdate' in cache['_calendar']\
+                                [event_obj._name][event_id]:
+                            return cache['_calendar'][event_obj._name]\
+                                    [event_id]['creationdate']
+                    else:
+                        ids = [event_id]
+                    res = None
+                    for i in range(0, len(ids), cursor.IN_MAX):
+                        sub_ids = ids[i:i + cursor.IN_MAX]
+                        red_sql, red_ids = reduce_ids('id', sub_ids)
+                        cursor.execute('SELECT id, ' \
+                                'EXTRACT(epoch FROM create_date) ' \
+                            'FROM "' + event_obj._table + '" ' \
+                            'WHERE ' + red_sql, red_ids)
+                        for event_id2, date in cursor.fetchall():
+                            if event_id2 == event_id:
+                                res = date
+                            if cache is not None:
+                                cache['_calendar'][event_obj._name]\
+                                        .setdefault(event_id2, {})
+                                cache['_calendar'][event_obj._name]\
+                                        [event_id2]['creationdate'] = date
+                    if res is not None:
+                        return res
+        return super(Collection, self).get_creationdate(cursor, user, uri,
+                context=context, cache=cache)
+
+    def get_lastmodified(self, cursor, user, uri, context=None, cache=None):
+        calendar_obj = self.pool.get('calendar.calendar')
+        event_obj = self.pool.get('calendar.event')
+
+        calendar_id = self.calendar(cursor, user, uri, context=context)
+        if calendar_id:
+            if not (uri[10:].split('/', 1) + [None])[1]:
+                if cache is not None:
+                    cache.setdefault('_calendar', {})
+                    cache['_calendar'].setdefault(calendar_obj._name, {})
+                    ids = cache['_calendar'][calendar_obj._name].keys()
+                    if calendar_id not in ids:
+                        ids.append(calendar_id)
+                    elif 'lastmodified' in cache['_calendar']\
+                            [calendar_obj._name][calendar_id]:
+                        return cache['_calendar'][calendar_obj._name]\
+                                [calendar_id]['lastmodified']
+                else:
+                    ids = [calendar_id]
+                res = None
+                for i in range(0, len(ids), cursor.IN_MAX):
+                    sub_ids = ids[i:i + cursor.IN_MAX]
+                    red_sql, red_ids = reduce_ids('id', sub_ids)
+                    cursor.execute('SELECT id, ' \
+                                'EXTRACT(epoch FROM ' \
+                                'COALESCE(write_date, create_date)) ' \
+                            'FROM "' + calendar_obj._table + '" ' \
+                                'WHERE ' + red_sql, red_ids)
+                    for calendar_id2, date in cursor.fetchall():
+                        if calendar_id2 == calendar_id:
+                            res = date
+                        if cache is not None:
+                            cache['_calendar'][calendar_obj._name]\
+                                    .setdefault(calendar_id2, {})
+                            cache['_calendar'][calendar_obj._name]\
+                                    [calendar_id2]['lastmodified'] = date
+                if res is not None:
+                    return res
+            else:
+                event_id = self.event(cursor, user, uri, calendar_id=calendar_id,
+                        context=context)
+                if event_id:
+                    if cache is not None:
+                        cache.setdefault('_calendar', {})
+                        cache['_calendar'].setdefault(event_obj._name, {})
+                        ids = cache['_calendar'][event_obj._name].keys()
+                        if event_id not in ids:
+                            ids.append(event_id)
+                        elif 'lastmodified' in cache['_calendar']\
+                                [event_obj._name][event_id]:
+                            return cache['_calendar'][event_obj._name]\
+                                    [event_id]['lastmodified']
+                    else:
+                        ids = [event_id]
+                    res = None
+                    for i in range(0, len(ids), cursor.IN_MAX/2):
+                        sub_ids = ids[i:i + cursor.IN_MAX/2]
+                        red_id_sql, red_id_ids = reduce_ids('id', sub_ids)
+                        red_parent_sql, red_parent_ids = reduce_ids('parent',
+                                sub_ids)
+                        cursor.execute('SELECT COALESCE(parent, id), ' \
+                                    'MAX(EXTRACT(epoch FROM ' \
+                                    'COALESCE(write_date, create_date))) ' \
+                                'FROM "' + event_obj._table + '" ' \
+                                'WHERE ' + red_id_sql + ' ' \
+                                    'OR ' + red_parent_sql + ' ' \
+                                'GROUP BY parent, id',
+                                red_id_ids + red_parent_ids)
+                        for event_id2, date in cursor.fetchall():
+                            if event_id2 == event_id:
+                                res = date
+                            if cache is not None:
+                                cache['_calendar'][event_obj._name]\
+                                        .setdefault(event_id2, {})
+                                cache['_calendar'][event_obj._name]\
+                                        [event_id2]['lastmodified'] = date
+                    if res is not None:
+                        return res
+        calendar_ics_id = self.calendar(cursor, user, uri, ics=True,
+                context=context)
+        if calendar_ics_id:
+            if cache is not None:
+                cache.setdefault('_calendar', {})
+                cache['_calendar'].setdefault(calendar_obj._name, {})
+                ids = cache['_calendar'][calendar_obj._name].keys()
+                if calendar_ics_id not in ids:
+                    ids.append(calendar_ics_id)
+                elif 'lastmodified ics' in cache['_calendar']\
+                        [calendar_obj._name][calendar_ics_id]:
+                    return cache['_calendar'][calendar_obj._name]\
+                            [calendar_ics_id]['lastmodified ics']
+            else:
+                ids = [calendar_ics_id]
+            res = None
+            for i in range(0, len(ids), cursor.IN_MAX):
+                sub_ids = ids[i:i + cursor.IN_MAX]
+                red_sql, red_ids = reduce_ids('calendar', sub_ids)
+                cursor.execute('SELECT calendar, MAX(EXTRACT(epoch FROM ' \
+                            'COALESCE(write_date, create_date))) ' \
+                        'FROM "' + event_obj._table + '" ' \
+                        'WHERE ' + red_sql + ' ' \
+                        'GROUP BY calendar', red_ids)
+                for calendar_id2, date in cursor.fetchall():
+                    if calendar_id2 == calendar_ics_id:
+                        res = date
+                    if cache is not None:
+                        cache['_calendar'][calendar_obj._name]\
+                                .setdefault(calendar_id2, {})
+                        cache['_calendar'][calendar_obj._name]\
+                                [calendar_id2]['lastmodified ics'] = date
+            if res is not None:
+                return res
+        return super(Collection, self).get_lastmodified(cursor, user, uri,
+                context=context, cache=cache)
+
+    def get_data(self, cursor, user, uri, context=None, cache=None):
+        event_obj = self.pool.get('calendar.event')
+        calendar_obj = self.pool.get('calendar.calendar')
+
+        calendar_id = self.calendar(cursor, user, uri, context=context)
+        if calendar_id:
+            if not (uri[10:].split('/', 1) + [None])[1]:
+                raise DAV_NotFound
+            event_id = self.event(cursor, user, uri, calendar_id=calendar_id,
+                    context=context)
+            if not event_id:
+                raise DAV_NotFound
+            ical = event_obj.event2ical(cursor, user, event_id, context=context)
+            return ical.serialize()
+        calendar_ics_id = self.calendar(cursor, user, uri, ics=True,
+                context=context)
+        if calendar_ics_id:
+            ical = calendar_obj.calendar2ical(cursor, user, calendar_ics_id,
+                    context=context)
+            return ical.serialize()
+        return super(Collection, self).get_data(cursor, user, uri,
+                context=context, cache=cache)
+
+    def get_calendar_description(self, cursor, user, uri, context=None,
+            cache=None):
+        calendar_obj = self.pool.get('calendar.calendar')
+
+        calendar_id = self.calendar(cursor, user, uri, context=context)
+        if calendar_id:
+            if not (uri[10:].split('/', 1) + [None])[1]:
+                if cache is not None:
+                    cache.setdefault('_calendar', {})
+                    cache['_calendar'].setdefault(calendar_obj._name, {})
+                    ids = cache['_calendar'][calendar_obj._name].keys()
+                    if calendar_id not in ids:
+                        ids.append(calendar_id)
+                    elif 'calendar_description' in cache['_calendar']\
+                            [calendar_obj._name][calendar_id]:
+                        return cache['_calendar'][calendar_obj._name]\
+                                [calendar_id]['calendar_description']
+                else:
+                    ids = [calendar_id]
+                res = None
+                for calendar in calendar_obj.browse(cursor, user, ids,
+                        context=context):
+                    if calendar.id == calendar_id:
+                        res = calendar.description
+                    if cache is not None:
+                        cache['_calendar'][calendar_obj._name]\
+                                .setdefault(calendar.id, {})
+                        cache['_calendar'][calendar_obj._name]\
+                                [calendar.id]['calendar_description'] = \
+                                calendar.description
+                if res is not None:
+                    return res
+        raise DAV_NotFound
+
+    def get_calendar_data(self, cursor, user, uri, context=None, cache=None):
+        return self.get_data(cursor, user, uri, context=context, cache=cache)\
+                .decode('utf-8')
+
+    def get_calendar_home_set(self, cursor, user, uri, context=None,
+            cache=None):
+        return '/Calendars'
+
+    def get_calendar_user_address_set(self, cursor, user_id, uri, context=None,
+            cache=None):
+        user_obj = self.pool.get('res.user')
+        user = user_obj.browse(cursor, user_id, user_id, context=context)
+        if user.email:
+            return user.email
+        raise DAV_NotFound
+
+    def get_schedule_inbox_URL(self, cursor, user, uri, context=None,
+            cache=None):
+        calendar_obj = self.pool.get('calendar.calendar')
+
+        calendar_ids = calendar_obj.search(cursor, user, [
+            ('owner', '=', user),
+            ], limit=1, context=context)
+        if not calendar_ids:
+            raise DAV_NotFound
+        calendar = calendar_obj.browse(cursor, user, calendar_ids[0],
+                context=context)
+        return '/Calendars/' + calendar.name
+
+    def get_schedule_outbox_URL(self, cursor, user, uri, context=None,
+            cache=None):
+        return self.get_schedule_inbox_URL(cursor, user, uri, context=context,
+                cache=cache)
+
+    def put(self, cursor, user, uri, data, content_type, context=None,
+            cache=None):
+        event_obj = self.pool.get('calendar.event')
+        calendar_obj = self.pool.get('calendar.calendar')
+
+        calendar_id = self.calendar(cursor, user, uri, context=context)
+        if calendar_id:
+            if not (uri[10:].split('/', 1) + [None])[1]:
+                raise DAV_Forbidden
+            event_id = self.event(cursor, user, uri, calendar_id=calendar_id,
+                    context=context)
+            if not event_id:
+                ical = vobject.readOne(data)
+                values = event_obj.ical2values(cursor, user, None, ical,
+                        calendar_id, context=context)
+                event_id = event_obj.create(cursor, user, values,
+                        context=context)
+                event = event_obj.browse(cursor, user, event_id,
+                        context=context)
+                calendar = calendar_obj.browse(cursor, user, calendar_id,
+                        context=context)
+                return cursor.database_name + '/Calendars/' + calendar.name + \
+                        '/' + event.uuid + '.ics'
+            else:
+                ical = vobject.readOne(data)
+                values = event_obj.ical2values(cursor, user, event_id, ical,
+                        calendar_id, context=context)
+                event_obj.write(cursor, user, event_id, values,
+                        context=context)
+                return
+        calendar_ics_id = self.calendar(cursor, user, uri, ics=True,
+                context=context)
+        if calendar_ics_id:
+            raise DAV_Forbidden
+        return super(Collection, self).put(cursor, user, uri, data,
+                content_type, context=context)
+
+    def mkcol(self, cursor, user, uri, context=None, cache=None):
+        if uri and uri.startswith('Calendars/'):
+            raise DAV_Forbidden
+        return super(Collection, self).mkcol(cursor, user, uri, context=context,
+                cache=cache)
+
+    def rmcol(self, cursor, user, uri, context=None, cache=None):
+        calendar_obj = self.pool.get('calendar.calendar')
+
+        calendar_id = self.calendar(cursor, user, uri, context=context)
+        if calendar_id:
+            if not (uri[10:].split('/', 1) + [None])[1]:
+                try:
+                    calendar_obj.delete(cursor, user, calendar_id,
+                            context=context)
+                except:
+                    raise DAV_Forbidden
+                return 200
+            raise DAV_Forbidden
+        return super(Collection, self).rmcol(cursor, user, uri, context=context,
+                cache=cache)
+
+    def rm(self, cursor, user, uri, context=None, cache=None):
+        event_obj = self.pool.get('calendar.event')
+
+        calendar_id = self.calendar(cursor, user, uri, context=context)
+        if calendar_id:
+            if not (uri[10:].split('/', 1) + [None])[1]:
+                raise DAV_Forbidden
+            event_id = self.event(cursor, user, uri, calendar_id=calendar_id,
+                    context=context)
+            if event_id:
+                try:
+                    event_obj.delete(cursor, user, event_id, context=context)
+                except:
+                    raise DAV_Forbidden
+                return 200
+        calendar_ics_id = self.calendar(cursor, user, uri, ics=True,
+                context=context)
+        if calendar_ics_id:
+            raise DAV_Forbidden
+        return super(Collection, self).rm(cursor, user, uri, context=context,
+                cache=cache)
+
+    def exists(self, cursor, user, uri, context=None, cache=None):
+        if uri in ('Calendars', 'Calendars/'):
+            return 1
+        calendar_id = self.calendar(cursor, user, uri, context=context)
+        if calendar_id:
+            if not (uri[10:].split('/', 1) + [None])[1]:
+                return 1
+            if self.event(cursor, user, uri, calendar_id=calendar_id,
+                    context=context):
+                return 1
+        calendar_ics_id = self.calendar(cursor, user, uri, ics=True,
+                context=context)
+        if calendar_ics_id:
+            return 1
+        return super(Collection, self).exists(cursor, user, uri, context=context,
+                cache=cache)
+
+Collection()
-- 
tryton-modules-calendar



More information about the tryton-debian-vcs mailing list