[tryton-debian-vcs] tryton-modules-calendar-todo branch debian created. a9a600a85fe1dc3e863056e3922bcd37bd66eb06

Mathias Behrle tryton-debian-vcs at alioth.debian.org
Wed Nov 27 17:00:14 UTC 2013


The following commit has been merged in the debian branch:
https://alioth.debian.org/plugins/scmgit/cgi-bin/gitweb.cgi/?p=tryton/tryton-modules-calendar-todo.git;a=commitdiff;h=a9a600a85fe1dc3e863056e3922bcd37bd66eb06
commit a9a600a85fe1dc3e863056e3922bcd37bd66eb06
Author: Mathias Behrle <mathiasb at m9s.biz>
Date:   Mon Nov 25 20:30:09 2013 +0100

    Releasing debian version 3.0.0-1.

diff --git a/debian/changelog b/debian/changelog
index 0b0ed95..64fb83e 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,12 @@
+tryton-modules-calendar-todo (3.0.0-1) unstable; urgency=low
+
+  * Merging upstream version 3.0.0.
+  * Updating to standards version 3.9.5, no changes needed.
+  * Changing to buildsystem pybuild.
+  * Adding python-sql to Depends.
+
+ -- Mathias Behrle <mathiasb at m9s.biz>  Mon, 25 Nov 2013 17:53:45 +0100
+
 tryton-modules-calendar-todo (2.8.0-3) unstable; urgency=low
 
   * Removing pydist-overrides, it is no more needed.
commit f215d10e191683f7b800767cee734f918f1f0165
Author: Mathias Behrle <mathiasb at m9s.biz>
Date:   Mon Nov 25 17:42:26 2013 +0100

    Adding python-sql to Depends.

diff --git a/debian/control b/debian/control
index 3ebdd16..4cf02e8 100644
--- a/debian/control
+++ b/debian/control
@@ -16,7 +16,7 @@ Architecture: all
 Depends:
  ${misc:Depends}, ${python:Depends}, tryton-server (>= ${version:major}),
  tryton-modules-calendar (>= ${version:major}), python-dateutil, python-tz,
- python-vobject, python-webdav, python-pkg-resources
+ python-vobject, python-webdav, python-sql, python-pkg-resources
 Description: Tryton Application Platform (Calendar Todo Module)
  Tryton is a high-level general purpose application platform written in Python
  and using PostgreSQL as database engine. It is the core base of a complete
commit 803a5659dbe27b7457dc05814ba6cc3c47d12043
Author: Mathias Behrle <mathiasb at m9s.biz>
Date:   Sun Nov 24 19:51:51 2013 +0100

    Changing to buildsystem pybuild.

diff --git a/debian/control b/debian/control
index cdd70a1..3ebdd16 100644
--- a/debian/control
+++ b/debian/control
@@ -3,7 +3,8 @@ Section: python
 Priority: optional
 Maintainer: Debian Tryton Maintainers <maintainers at debian.tryton.org>
 Uploaders: Mathias Behrle <mathiasb at m9s.biz>
-Build-Depends: debhelper (>= 9), python (>= 2.6.6-3~), python-setuptools
+Build-Depends:
+ debhelper (>= 9), python (>= 2.6.6-3~), python-setuptools, dh-python
 Standards-Version: 3.9.5
 Homepage: http://www.tryton.org/
 Vcs-Browser: http://debian.tryton.org/gitweb/?p=packages/tryton-modules-calendar-todo.git
diff --git a/debian/rules b/debian/rules
index 30074ad..5b8c326 100755
--- a/debian/rules
+++ b/debian/rules
@@ -1,24 +1,17 @@
 #!/usr/bin/make -f
 
-MAJOR := $(shell python setup.py --version | awk -F "." '{print $$1 "." $$2}')
-PACKAGE_NAME := $(shell python setup.py --name)
-
-%:
-	dh ${@} --with python2
+# needed for pbuilder
+export LC_ALL=C.UTF-8
 
-override_dh_auto_clean:
-	dh_auto_clean
+MAJOR := $(shell python setup.py --version | awk -F "." '{print $$1 "." $$2}')
+PACKAGE_NAME := tryton-modules-$(shell python setup.py --name | sed s/^trytond_// | sed s/_/-/g)
+export PYBUILD_DESTDIR_python2=debian/${PACKAGE_NAME}
 
-override_dh_auto_build:
-	mv $(PACKAGE_NAME).egg-info $(PACKAGE_NAME).hen-info
-	mv PKG-INFO PKG-INFO.hen
-	dh_auto_build
+# Don't run tests for Tryton modules, they try to download dependencies from pypi
+export PYBUILD_DISABLE_python2.7=test
 
-override_dh_auto_install:
-	dh_auto_install
-	rm -rf *.egg-info
-	mv $(PACKAGE_NAME).hen-info $(PACKAGE_NAME).egg-info
-	mv PKG-INFO.hen PKG-INFO
+%:
+	dh ${@} --with python2 --buildsystem=pybuild
 
 override_dh_gencontrol:
 	dh_gencontrol -- -Vversion:major="$(MAJOR)"
commit 7a9592bf59eab2870c35e9a9e8562138547efe43
Author: Mathias Behrle <mathiasb at m9s.biz>
Date:   Sun Nov 24 19:14:21 2013 +0100

    Updating to standards version 3.9.5, no changes needed.

diff --git a/debian/control b/debian/control
index 1a9ad57..cdd70a1 100644
--- a/debian/control
+++ b/debian/control
@@ -4,7 +4,7 @@ Priority: optional
 Maintainer: Debian Tryton Maintainers <maintainers at debian.tryton.org>
 Uploaders: Mathias Behrle <mathiasb at m9s.biz>
 Build-Depends: debhelper (>= 9), python (>= 2.6.6-3~), python-setuptools
-Standards-Version: 3.9.4
+Standards-Version: 3.9.5
 Homepage: http://www.tryton.org/
 Vcs-Browser: http://debian.tryton.org/gitweb/?p=packages/tryton-modules-calendar-todo.git
 Vcs-Git: git://debian.tryton.org/packages/tryton-modules-calendar-todo.git
commit 8b84bcaf6b984ad7f677dd22ada92d70eabe2cc7
Author: Mathias Behrle <mathiasb at m9s.biz>
Date:   Sun Nov 24 17:26:49 2013 +0100

    Merging upstream version 3.0.0.

diff --git a/CHANGELOG b/CHANGELOG
index 9735814..ad7e2ac 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 bbf874a..e0e91e4 100644
--- a/INSTALL
+++ b/INSTALL
@@ -10,6 +10,7 @@ Prerequisites
  * pywebdav 0.9.8 or later (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/)
  * trytond_calendar (http://www.tryton.org/)
 
 Installation
diff --git a/PKG-INFO b/PKG-INFO
index d954667..fca3e1f 100644
--- a/PKG-INFO
+++ b/PKG-INFO
@@ -1,12 +1,12 @@
 Metadata-Version: 1.1
 Name: trytond_calendar_todo
-Version: 2.8.0
+Version: 3.0.0
 Summary: Tryton module to add TODO on 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_todo
         =====================
         
@@ -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/locale/ca_ES.po b/locale/ca_ES.po
index b35f41f..9ce1266 100644
--- a/locale/ca_ES.po
+++ b/locale/ca_ES.po
@@ -666,7 +666,7 @@ msgstr "Públic"
 
 msgctxt "selection:calendar.todo,status:"
 msgid ""
-msgstr " "
+msgstr ""
 
 msgctxt "selection:calendar.todo,status:"
 msgid "Cancelled"
@@ -686,7 +686,7 @@ msgstr "Necessitat-Acció"
 
 msgctxt "selection:calendar.todo.attendee,status:"
 msgid ""
-msgstr " "
+msgstr ""
 
 msgctxt "selection:calendar.todo.attendee,status:"
 msgid "Accepted"
diff --git a/locale/es_CO.po b/locale/es_CO.po
index 806d017..5c5b929 100644
--- a/locale/es_CO.po
+++ b/locale/es_CO.po
@@ -658,10 +658,9 @@ msgctxt "selection:calendar.todo,classification:"
 msgid "Public"
 msgstr "Público"
 
-#, fuzzy
 msgctxt "selection:calendar.todo,status:"
 msgid ""
-msgstr "Punto de Orden"
+msgstr ""
 
 msgctxt "selection:calendar.todo,status:"
 msgid "Cancelled"
@@ -679,10 +678,9 @@ msgctxt "selection:calendar.todo,status:"
 msgid "Needs-Action"
 msgstr "Necesita una Acción"
 
-#, fuzzy
 msgctxt "selection:calendar.todo.attendee,status:"
 msgid ""
-msgstr "Punto de Orden"
+msgstr ""
 
 msgctxt "selection:calendar.todo.attendee,status:"
 msgid "Accepted"
diff --git a/locale/es_ES.po b/locale/es_ES.po
index eed9e6b..4b70f1f 100644
--- a/locale/es_ES.po
+++ b/locale/es_ES.po
@@ -4,7 +4,7 @@ msgstr "Content-Type: text/plain; charset=utf-8\n"
 
 msgctxt "error:calendar.todo.exrule:"
 msgid "Invalid \"By Day\" in recurrence rule \"%s\""
-msgstr "El campo \"por dia\" de la regla de recurrencia \"%s\" no es correcto."
+msgstr "El campo \"por día\" de la regla de recurrencia \"%s\" no es correcto."
 
 msgctxt "error:calendar.todo.exrule:"
 msgid "Invalid \"By Hour\" in recurrence rule \"%s\""
@@ -46,7 +46,7 @@ msgstr ""
 
 msgctxt "error:calendar.todo.exrule:"
 msgid "Only one of \"until\" and \"count\" can be set."
-msgstr "Define un \"hasta\" y un \"contador\"."
+msgstr "Puede establecer \"hasta\" o bien \"nº de veces\", no ambos."
 
 msgctxt "error:calendar.todo.rrule:"
 msgid "Invalid \"By Day\" in recurrence rule \"%s\""
@@ -92,7 +92,7 @@ msgstr ""
 
 msgctxt "error:calendar.todo.rrule:"
 msgid "Only one of \"until\" and \"count\" can be set."
-msgstr "Define un \"hasta\" y un \"contador\"."
+msgstr "Puede establecer \"hasta\" o bien \"nº de veces\", no ambos."
 
 msgctxt "error:calendar.todo:"
 msgid "Todo \"%s\" can not be recurrent."
@@ -292,7 +292,7 @@ msgstr "Tarea"
 
 msgctxt "field:calendar.todo.alarm,valarm:"
 msgid "valarm"
-msgstr "valarm"
+msgstr "Alarma"
 
 msgctxt "field:calendar.todo.alarm,write_date:"
 msgid "Write Date"
@@ -416,7 +416,7 @@ msgstr "Por día del año"
 
 msgctxt "field:calendar.todo.exrule,count:"
 msgid "Count"
-msgstr "Contador"
+msgstr "Nº de veces"
 
 msgctxt "field:calendar.todo.exrule,create_date:"
 msgid "Create Date"
@@ -540,7 +540,7 @@ msgstr "Por día del año"
 
 msgctxt "field:calendar.todo.rrule,count:"
 msgid "Count"
-msgstr "Contador"
+msgstr "Nº de veces"
 
 msgctxt "field:calendar.todo.rrule,create_date:"
 msgid "Create Date"
@@ -596,19 +596,19 @@ msgstr "Identificador universal único."
 
 msgctxt "help:calendar.todo.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."
+msgstr "Ingnorar la hora del campo \"Fecha\" y usar sólo el día."
 
 msgctxt "help:calendar.todo.exrule,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."
+msgstr "Ingnorar la hora del campo \"Hasta la fecha\" y usar sólo el día."
 
 msgctxt "help:calendar.todo.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."
+msgstr "Ingnorar la hora del campo \"Fecha\" y usar sólo el día."
 
 msgctxt "help:calendar.todo.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."
+msgstr "Ingnora la hora del campo \"Hasta la fecha\" y usar sólo el día."
 
 msgctxt "model:calendar.todo,name:"
 msgid "Todo"
@@ -684,7 +684,7 @@ msgstr "En proceso"
 
 msgctxt "selection:calendar.todo,status:"
 msgid "Needs-Action"
-msgstr "Necesidad-Acción"
+msgstr "Requiere acción"
 
 msgctxt "selection:calendar.todo.attendee,status:"
 msgid ""
@@ -696,15 +696,15 @@ msgstr "Acceptado"
 
 msgctxt "selection:calendar.todo.attendee,status:"
 msgid "Declined"
-msgstr "Rechazar"
+msgstr "Rechazado"
 
 msgctxt "selection:calendar.todo.attendee,status:"
 msgid "Delegated"
-msgstr "Delegar"
+msgstr "Delegado"
 
 msgctxt "selection:calendar.todo.attendee,status:"
 msgid "Needs Action"
-msgstr "Necesidad  Acción"
+msgstr "Requiere acción"
 
 msgctxt "selection:calendar.todo.attendee,status:"
 msgid "Tentative"
@@ -844,7 +844,7 @@ msgstr "Regla de excepción"
 
 msgctxt "view:calendar.todo.exrule:"
 msgid "Exception Rules"
-msgstr "Reglas de excepciones"
+msgstr "Reglas de excepción"
 
 msgctxt "view:calendar.todo.rdate:"
 msgid "Recurrence Date"
diff --git a/locale/fr_FR.po b/locale/fr_FR.po
index efb455f..2f604a4 100644
--- a/locale/fr_FR.po
+++ b/locale/fr_FR.po
@@ -604,7 +604,7 @@ msgstr "Tâche"
 
 msgctxt "model:calendar.todo-calendar.category,name:"
 msgid "Todo - Category"
-msgstr "Todo - Catégorie"
+msgstr "Tâche - Catégorie"
 
 msgctxt "model:calendar.todo.alarm,name:"
 msgid "Alarm"
@@ -624,7 +624,7 @@ msgstr "Règle d'exception"
 
 msgctxt "model:calendar.todo.rdate,name:"
 msgid "Todo Recurrence Date"
-msgstr "Date de récurrence"
+msgstr "Date de récurrence de tâche"
 
 msgctxt "model:calendar.todo.rrule,name:"
 msgid "Recurrence Rule"
@@ -647,22 +647,10 @@ msgid "Confidential"
 msgstr "Confidentiel"
 
 msgctxt "selection:calendar.todo,classification:"
-msgid "Confidential"
-msgstr "Confidentiel"
-
-msgctxt "selection:calendar.todo,classification:"
 msgid "Private"
 msgstr "Privé"
 
 msgctxt "selection:calendar.todo,classification:"
-msgid "Private"
-msgstr "Privé"
-
-msgctxt "selection:calendar.todo,classification:"
-msgid "Public"
-msgstr "Publique"
-
-msgctxt "selection:calendar.todo,classification:"
 msgid "Public"
 msgstr "Publique"
 
@@ -671,14 +659,6 @@ msgid ""
 msgstr ""
 
 msgctxt "selection:calendar.todo,status:"
-msgid ""
-msgstr ""
-
-msgctxt "selection:calendar.todo,status:"
-msgid "Cancelled"
-msgstr "Annulé"
-
-msgctxt "selection:calendar.todo,status:"
 msgid "Cancelled"
 msgstr "Annulé"
 
@@ -687,22 +667,10 @@ msgid "Completed"
 msgstr "Complété"
 
 msgctxt "selection:calendar.todo,status:"
-msgid "Completed"
-msgstr "Complété"
-
-msgctxt "selection:calendar.todo,status:"
 msgid "In-Process"
 msgstr "En court"
 
 msgctxt "selection:calendar.todo,status:"
-msgid "In-Process"
-msgstr "En court"
-
-msgctxt "selection:calendar.todo,status:"
-msgid "Needs-Action"
-msgstr "Nécessite une action"
-
-msgctxt "selection:calendar.todo,status:"
 msgid "Needs-Action"
 msgstr "Nécessite une action"
 
@@ -847,21 +815,9 @@ msgid "Attendee"
 msgstr "Participant"
 
 msgctxt "view:calendar.todo.attendee:"
-msgid "Attendee"
-msgstr "Participant"
-
-msgctxt "view:calendar.todo.attendee:"
 msgid "Attendees"
 msgstr "Participants"
 
-msgctxt "view:calendar.todo.attendee:"
-msgid "Attendees"
-msgstr "Participants"
-
-msgctxt "view:calendar.todo.exdate:"
-msgid "Exception Date"
-msgstr "Date d'exception"
-
 msgctxt "view:calendar.todo.exdate:"
 msgid "Exception Date"
 msgstr "Date d'exception"
@@ -870,23 +826,11 @@ msgctxt "view:calendar.todo.exdate:"
 msgid "Exception Dates"
 msgstr "Dates d'exception"
 
-msgctxt "view:calendar.todo.exdate:"
-msgid "Exception Dates"
-msgstr "Dates d'exception"
-
 msgctxt "view:calendar.todo.exrule:"
 msgid "Exception Rule"
 msgstr "Règle d'exception"
 
 msgctxt "view:calendar.todo.exrule:"
-msgid "Exception Rule"
-msgstr "Règle d'exception"
-
-msgctxt "view:calendar.todo.exrule:"
-msgid "Exception Rules"
-msgstr "Règles d'exception"
-
-msgctxt "view:calendar.todo.exrule:"
 msgid "Exception Rules"
 msgstr "Règles d'exception"
 
@@ -895,21 +839,9 @@ msgid "Recurrence Date"
 msgstr "Date de récurrence"
 
 msgctxt "view:calendar.todo.rdate:"
-msgid "Recurrence Date"
-msgstr "Date de récurrence"
-
-msgctxt "view:calendar.todo.rdate:"
 msgid "Recurrence Dates"
 msgstr "Dates de récurrence"
 
-msgctxt "view:calendar.todo.rdate:"
-msgid "Recurrence Dates"
-msgstr "Dates de récurrence"
-
-msgctxt "view:calendar.todo.rrule:"
-msgid "Recurrence Rule"
-msgstr "Règle de récurrence"
-
 msgctxt "view:calendar.todo.rrule:"
 msgid "Recurrence Rule"
 msgstr "Règle de récurrence"
@@ -918,23 +850,11 @@ msgctxt "view:calendar.todo.rrule:"
 msgid "Recurrence Rules"
 msgstr "Règles de récurrence"
 
-msgctxt "view:calendar.todo.rrule:"
-msgid "Recurrence Rules"
-msgstr "Règles de récurrence"
-
 msgctxt "view:calendar.todo:"
 msgid "Attendees"
 msgstr "Participants"
 
 msgctxt "view:calendar.todo:"
-msgid "Attendees"
-msgstr "Participants"
-
-msgctxt "view:calendar.todo:"
-msgid "Categories"
-msgstr "Catégories"
-
-msgctxt "view:calendar.todo:"
 msgid "Categories"
 msgstr "Catégories"
 
@@ -943,29 +863,13 @@ msgid "General"
 msgstr "Général"
 
 msgctxt "view:calendar.todo:"
-msgid "General"
-msgstr "Général"
-
-msgctxt "view:calendar.todo:"
 msgid "Occurences"
 msgstr "Occurrences"
 
 msgctxt "view:calendar.todo:"
-msgid "Occurences"
-msgstr "Occurrences"
-
-msgctxt "view:calendar.todo:"
-msgid "Todo"
-msgstr "Tâche"
-
-msgctxt "view:calendar.todo:"
 msgid "Todo"
 msgstr "Tâche"
 
 msgctxt "view:calendar.todo:"
 msgid "Todos"
 msgstr "Tâches"
-
-msgctxt "view:calendar.todo:"
-msgid "Todos"
-msgstr "Tâches"
diff --git a/locale/es_CO.po b/locale/sl_SI.po
similarity index 71%
copy from locale/es_CO.po
copy to locale/sl_SI.po
index 806d017..5e59a73 100644
--- a/locale/es_CO.po
+++ b/locale/sl_SI.po
@@ -4,155 +4,155 @@ msgstr "Content-Type: text/plain; charset=utf-8\n"
 
 msgctxt "error:calendar.todo.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.todo.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.todo.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.todo.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.todo.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.todo.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.todo.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.todo.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.todo.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.todo.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.todo.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.todo.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.todo.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.todo.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.todo.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.todo.rrule:"
 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.todo.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.todo.rrule:"
 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.todo.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.todo.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.todo:"
 msgid "Todo \"%s\" can not be recurrent."
-msgstr "Tareas por Hacer \"%s\" no puede ser recurrente."
+msgstr "Todo \"%s\" se ne more ponavljati."
 
 msgctxt "error:calendar.todo:"
 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 "field:calendar.todo,alarms:"
 msgid "Alarms"
-msgstr "Alarmas"
+msgstr "Alarmi"
 
 msgctxt "field:calendar.todo,attendees:"
 msgid "Attendees"
-msgstr "Asistentes"
+msgstr "Navzoči"
 
 msgctxt "field:calendar.todo,calendar:"
 msgid "Calendar"
-msgstr "Calendario"
+msgstr "Koledar"
 
 msgctxt "field:calendar.todo,calendar_owner:"
 msgid "Owner"
-msgstr "Propietario"
+msgstr "Imetnik"
 
 msgctxt "field:calendar.todo,calendar_read_users:"
 msgid "Read Users"
-msgstr "Leer Usuarios"
+msgstr "Bralci"
 
 msgctxt "field:calendar.todo,calendar_write_users:"
 msgid "Write Users"
-msgstr "Modificado por Usuario"
+msgstr "Zapisovalci"
 
 msgctxt "field:calendar.todo,categories:"
 msgid "Categories"
-msgstr "Categorías"
+msgstr "Kategorije"
 
 msgctxt "field:calendar.todo,classification:"
 msgid "Classification"
-msgstr "Clasificación"
+msgstr "Klasifikacija"
 
 msgctxt "field:calendar.todo,completed:"
 msgid "Completed"
-msgstr "Completado"
+msgstr "Zaključeno"
 
 msgctxt "field:calendar.todo,create_date:"
 msgid "Create Date"
-msgstr "Fecha de Creación"
+msgstr "Ustvarjeno"
 
 msgctxt "field:calendar.todo,create_uid:"
 msgid "Create User"
-msgstr "Creado por Usuario"
+msgstr "Ustvaril"
 
 msgctxt "field:calendar.todo,description:"
 msgid "Description"
-msgstr "Descripción"
+msgstr "Opis"
 
 msgctxt "field:calendar.todo,dtstart:"
 msgid "Start Date"
-msgstr "Fecha Inicio"
+msgstr "Začetni datum"
 
 msgctxt "field:calendar.todo,due:"
 msgid "Due Date"
-msgstr "Fecha Debida"
+msgstr "Zapadlost"
 
 msgctxt "field:calendar.todo,exdates:"
 msgid "Exception Dates"
-msgstr "Fechas de Excepción"
+msgstr "Izjemni datumi"
 
 msgctxt "field:calendar.todo,exrules:"
 msgid "Exception Rules"
-msgstr "Reglas de Excepción"
+msgstr "Izjemna pravila"
 
 msgctxt "field:calendar.todo,id:"
 msgid "ID"
@@ -160,55 +160,55 @@ msgstr "ID"
 
 msgctxt "field:calendar.todo,location:"
 msgid "Location"
-msgstr "Lugar"
+msgstr "Lokacija"
 
 msgctxt "field:calendar.todo,occurences:"
 msgid "Occurences"
-msgstr "Ocurrencias"
+msgstr "Pojavljanje"
 
 msgctxt "field:calendar.todo,organizer:"
 msgid "Organizer"
-msgstr "Organizador"
+msgstr "Organizator"
 
 msgctxt "field:calendar.todo,parent:"
 msgid "Parent"
-msgstr "Padre"
+msgstr "Prednik"
 
 msgctxt "field:calendar.todo,percent_complete:"
 msgid "Percent complete"
-msgstr "Porcentaje completo"
+msgstr "Odstotek zaključenega"
 
 msgctxt "field:calendar.todo,rdates:"
 msgid "Recurrence Dates"
-msgstr "Fechas de Repetición"
+msgstr "Datumi ponovitev"
 
 msgctxt "field:calendar.todo,rec_name:"
 msgid "Name"
-msgstr "Nombre"
+msgstr "Ime"
 
 msgctxt "field:calendar.todo,recurrence:"
 msgid "Recurrence"
-msgstr "Repetición"
+msgstr "Ponovitev"
 
 msgctxt "field:calendar.todo,rrules:"
 msgid "Recurrence Rules"
-msgstr "Reglas de Repetición"
+msgstr "Pravila ponovitev"
 
 msgctxt "field:calendar.todo,sequence:"
 msgid "Sequence"
-msgstr "Secuencia"
+msgstr "Zap.št."
 
 msgctxt "field:calendar.todo,status:"
 msgid "Status"
-msgstr "Estado"
+msgstr "Status"
 
 msgctxt "field:calendar.todo,summary:"
 msgid "Summary"
-msgstr "Resumen"
+msgstr "Povzetek"
 
 msgctxt "field:calendar.todo,timezone:"
 msgid "Timezone"
-msgstr "Zona horaria"
+msgstr "Časovni pas"
 
 msgctxt "field:calendar.todo,uuid:"
 msgid "UUID"
@@ -216,27 +216,27 @@ msgstr "UUID"
 
 msgctxt "field:calendar.todo,vtodo:"
 msgid "vtodo"
-msgstr "v- por hacer"
+msgstr "vtodo"
 
 msgctxt "field:calendar.todo,write_date:"
 msgid "Write Date"
-msgstr "Fecha de Modificación"
+msgstr "Zapisano"
 
 msgctxt "field:calendar.todo,write_uid:"
 msgid "Write User"
-msgstr "Modificado por Usuario"
+msgstr "Zapisal"
 
 msgctxt "field:calendar.todo-calendar.category,category:"
 msgid "Category"
-msgstr "Categoría"
+msgstr "Kategorija"
 
 msgctxt "field:calendar.todo-calendar.category,create_date:"
 msgid "Create Date"
-msgstr "Fecha de Creación"
+msgstr "Ustvarjeno"
 
 msgctxt "field:calendar.todo-calendar.category,create_uid:"
 msgid "Create User"
-msgstr "Creado por Usuario"
+msgstr "Ustvaril"
 
 msgctxt "field:calendar.todo-calendar.category,id:"
 msgid "ID"
@@ -244,27 +244,27 @@ msgstr "ID"
 
 msgctxt "field:calendar.todo-calendar.category,rec_name:"
 msgid "Name"
-msgstr "Nombre"
+msgstr "Ime"
 
 msgctxt "field:calendar.todo-calendar.category,todo:"
 msgid "To-Do"
-msgstr "Por Hacer"
+msgstr "To-Do"
 
 msgctxt "field:calendar.todo-calendar.category,write_date:"
 msgid "Write Date"
-msgstr "Fecha de Modificación"
+msgstr "Zapisano"
 
 msgctxt "field:calendar.todo-calendar.category,write_uid:"
 msgid "Write User"
-msgstr "Modificado por Usuario"
+msgstr "Zapisal"
 
 msgctxt "field:calendar.todo.alarm,create_date:"
 msgid "Create Date"
-msgstr "Fecha de Creación"
+msgstr "Ustvarjeno"
 
 msgctxt "field:calendar.todo.alarm,create_uid:"
 msgid "Create User"
-msgstr "Creado por Usuario"
+msgstr "Ustvaril"
 
 msgctxt "field:calendar.todo.alarm,id:"
 msgid "ID"
@@ -272,39 +272,39 @@ msgstr "ID"
 
 msgctxt "field:calendar.todo.alarm,rec_name:"
 msgid "Name"
-msgstr "Nombre"
+msgstr "Ime"
 
 msgctxt "field:calendar.todo.alarm,todo:"
 msgid "Todo"
-msgstr "Por Hacer"
+msgstr "Todo"
 
 msgctxt "field:calendar.todo.alarm,valarm:"
 msgid "valarm"
-msgstr "valarma"
+msgstr "valarm"
 
 msgctxt "field:calendar.todo.alarm,write_date:"
 msgid "Write Date"
-msgstr "Fecha de Modificación"
+msgstr "Zapisano"
 
 msgctxt "field:calendar.todo.alarm,write_uid:"
 msgid "Write User"
-msgstr "Modificado por Usuario"
+msgstr "Zapisal"
 
 msgctxt "field:calendar.todo.attendee,attendee:"
 msgid "attendee"
-msgstr "Asistente"
+msgstr "Navzoči"
 
 msgctxt "field:calendar.todo.attendee,create_date:"
 msgid "Create Date"
-msgstr "Fecha de Creación"
+msgstr "Ustvarjeno"
 
 msgctxt "field:calendar.todo.attendee,create_uid:"
 msgid "Create User"
-msgstr "Creado por Usuario"
+msgstr "Ustvaril"
 
 msgctxt "field:calendar.todo.attendee,email:"
 msgid "Email"
-msgstr "Correo Electrónico"
+msgstr "E-pošta"
 
 msgctxt "field:calendar.todo.attendee,id:"
 msgid "ID"
@@ -312,39 +312,39 @@ msgstr "ID"
 
 msgctxt "field:calendar.todo.attendee,rec_name:"
 msgid "Name"
-msgstr "Nombre"
+msgstr "Ime"
 
 msgctxt "field:calendar.todo.attendee,status:"
 msgid "Participation Status"
-msgstr "Estado de Participación"
+msgstr "Status udeleženca"
 
 msgctxt "field:calendar.todo.attendee,todo:"
 msgid "Todo"
-msgstr "Por Hacer"
+msgstr "Todo"
 
 msgctxt "field:calendar.todo.attendee,write_date:"
 msgid "Write Date"
-msgstr "Fecha de Modificación"
+msgstr "Zapisano"
 
 msgctxt "field:calendar.todo.attendee,write_uid:"
 msgid "Write User"
-msgstr "Modificado por Usuario"
+msgstr "Zapisal"
 
 msgctxt "field:calendar.todo.exdate,create_date:"
 msgid "Create Date"
-msgstr "Fecha de Creación"
+msgstr "Ustvarjeno"
 
 msgctxt "field:calendar.todo.exdate,create_uid:"
 msgid "Create User"
-msgstr "Creado por Usuario"
+msgstr "Ustvaril"
 
 msgctxt "field:calendar.todo.exdate,date:"
 msgid "Is Date"
-msgstr "Esta Fecha"
+msgstr "Je datum"
 
 msgctxt "field:calendar.todo.exdate,datetime:"
 msgid "Date"
-msgstr "Fecha"
+msgstr "Datum"
 
 msgctxt "field:calendar.todo.exdate,id:"
 msgid "ID"
@@ -352,71 +352,71 @@ msgstr "ID"
 
 msgctxt "field:calendar.todo.exdate,rec_name:"
 msgid "Name"
-msgstr "Nombre"
+msgstr "Ime"
 
 msgctxt "field:calendar.todo.exdate,todo:"
 msgid "Todo"
-msgstr "Por Hacer"
+msgstr "Todo"
 
 msgctxt "field:calendar.todo.exdate,write_date:"
 msgid "Write Date"
-msgstr "Fecha de Modificación"
+msgstr "Zapisano"
 
 msgctxt "field:calendar.todo.exdate,write_uid:"
 msgid "Write User"
-msgstr "Modificado por Usuario"
+msgstr "Zapisal"
 
 msgctxt "field:calendar.todo.exrule,byday:"
 msgid "By Day"
-msgstr "Por Día"
+msgstr "Na dan"
 
 msgctxt "field:calendar.todo.exrule,byhour:"
 msgid "By Hour"
-msgstr "Por Hora"
+msgstr "Na uro"
 
 msgctxt "field:calendar.todo.exrule,byminute:"
 msgid "By Minute"
-msgstr "Por Minuto"
+msgstr "Na minuto"
 
 msgctxt "field:calendar.todo.exrule,bymonth:"
 msgid "By Month"
-msgstr "Por Mes"
+msgstr "Na mesec"
 
 msgctxt "field:calendar.todo.exrule,bymonthday:"
 msgid "By Month Day"
-msgstr "Por Día del Mes"
+msgstr "Na dan v mesecu"
 
 msgctxt "field:calendar.todo.exrule,bysecond:"
 msgid "By Second"
-msgstr "Por Segundo"
+msgstr "Na sekundo"
 
 msgctxt "field:calendar.todo.exrule,bysetpos:"
 msgid "By Position"
-msgstr "Por Posición"
+msgstr "Na pozicijo"
 
 msgctxt "field:calendar.todo.exrule,byweekno:"
 msgid "By Week Number"
-msgstr "Por Número de la Semana"
+msgstr "Na teden v letu"
 
 msgctxt "field:calendar.todo.exrule,byyearday:"
 msgid "By Year Day"
-msgstr "Por Día del Año"
+msgstr "Na dan v letu"
 
 msgctxt "field:calendar.todo.exrule,count:"
 msgid "Count"
-msgstr "Contar"
+msgstr "Število"
 
 msgctxt "field:calendar.todo.exrule,create_date:"
 msgid "Create Date"
-msgstr "Fecha de Creación"
+msgstr "Ustvarjeno"
 
 msgctxt "field:calendar.todo.exrule,create_uid:"
 msgid "Create User"
-msgstr "Creado por Usuario"
+msgstr "Ustvaril"
 
 msgctxt "field:calendar.todo.exrule,freq:"
 msgid "Frequency"
-msgstr "Frecuencia"
+msgstr "Frekvenca"
 
 msgctxt "field:calendar.todo.exrule,id:"
 msgid "ID"
@@ -424,51 +424,51 @@ msgstr "ID"
 
 msgctxt "field:calendar.todo.exrule,interval:"
 msgid "Interval"
-msgstr "Intervalo"
+msgstr "Interval"
 
 msgctxt "field:calendar.todo.exrule,rec_name:"
 msgid "Name"
-msgstr "Nombre"
+msgstr "Ime"
 
 msgctxt "field:calendar.todo.exrule,todo:"
 msgid "Todo"
-msgstr "Por Hacer"
+msgstr "Todo"
 
 msgctxt "field:calendar.todo.exrule,until:"
 msgid "Until Date"
-msgstr "Hasta la Fecha"
+msgstr "Do dne"
 
 msgctxt "field:calendar.todo.exrule,until_date:"
 msgid "Is Date"
-msgstr "Esta Fecha"
+msgstr "Je datum"
 
 msgctxt "field:calendar.todo.exrule,wkst:"
 msgid "Week Day"
-msgstr "Día de la Semana"
+msgstr "Dan v tednu"
 
 msgctxt "field:calendar.todo.exrule,write_date:"
 msgid "Write Date"
-msgstr "Fecha de Modificación"
+msgstr "Zapisano"
 
 msgctxt "field:calendar.todo.exrule,write_uid:"
 msgid "Write User"
-msgstr "Modificado por Usuario"
+msgstr "Zapisal"
 
 msgctxt "field:calendar.todo.rdate,create_date:"
 msgid "Create Date"
-msgstr "Fecha de Creación"
+msgstr "Ustvarjeno"
 
 msgctxt "field:calendar.todo.rdate,create_uid:"
 msgid "Create User"
-msgstr "Creado por Usuario"
+msgstr "Ustvaril"
 
 msgctxt "field:calendar.todo.rdate,date:"
 msgid "Is Date"
-msgstr "Esta Fecha"
+msgstr "Je datum"
 
 msgctxt "field:calendar.todo.rdate,datetime:"
 msgid "Date"
-msgstr "Fecha"
+msgstr "Datum"
 
 msgctxt "field:calendar.todo.rdate,id:"
 msgid "ID"
@@ -476,71 +476,71 @@ msgstr "ID"
 
 msgctxt "field:calendar.todo.rdate,rec_name:"
 msgid "Name"
-msgstr "Nombre"
+msgstr "Ime"
 
 msgctxt "field:calendar.todo.rdate,todo:"
 msgid "Todo"
-msgstr "Por Hacer"
+msgstr "Todo"
 
 msgctxt "field:calendar.todo.rdate,write_date:"
 msgid "Write Date"
-msgstr "Fecha de Modificación"
+msgstr "Zapisano"
 
 msgctxt "field:calendar.todo.rdate,write_uid:"
 msgid "Write User"
-msgstr "Modificado por Usuario"
+msgstr "Zapisal"
 
 msgctxt "field:calendar.todo.rrule,byday:"
 msgid "By Day"
-msgstr "Por Día"
+msgstr "Na dan"
 
 msgctxt "field:calendar.todo.rrule,byhour:"
 msgid "By Hour"
-msgstr "Por Hora"
+msgstr "Na uro"
 
 msgctxt "field:calendar.todo.rrule,byminute:"
 msgid "By Minute"
-msgstr "Por Minuto"
+msgstr "Na minuto"
 
 msgctxt "field:calendar.todo.rrule,bymonth:"
 msgid "By Month"
-msgstr "Por Mes"
+msgstr "Na mesec"
 
 msgctxt "field:calendar.todo.rrule,bymonthday:"
 msgid "By Month Day"
-msgstr "Por Día del Mes"
+msgstr "Na dan v mesecu"
 
 msgctxt "field:calendar.todo.rrule,bysecond:"
 msgid "By Second"
-msgstr "Por Segundo"
+msgstr "Na sekundo"
 
 msgctxt "field:calendar.todo.rrule,bysetpos:"
 msgid "By Position"
-msgstr "Por Posición"
+msgstr "Na pozicijo"
 
 msgctxt "field:calendar.todo.rrule,byweekno:"
 msgid "By Week Number"
-msgstr "Por Número de la Semana"
+msgstr "Na teden v letu"
 
 msgctxt "field:calendar.todo.rrule,byyearday:"
 msgid "By Year Day"
-msgstr "Por Día del Año"
+msgstr "Na dan v letu"
 
 msgctxt "field:calendar.todo.rrule,count:"
 msgid "Count"
-msgstr "Contar"
+msgstr "Število"
 
 msgctxt "field:calendar.todo.rrule,create_date:"
 msgid "Create Date"
-msgstr "Fecha de Creación"
+msgstr "Ustvarjeno"
 
 msgctxt "field:calendar.todo.rrule,create_uid:"
 msgid "Create User"
-msgstr "Creado por Usuario"
+msgstr "Ustvaril"
 
 msgctxt "field:calendar.todo.rrule,freq:"
 msgid "Frequency"
-msgstr "Frecuencia"
+msgstr "Frekvenca"
 
 msgctxt "field:calendar.todo.rrule,id:"
 msgid "ID"
@@ -548,334 +548,328 @@ msgstr "ID"
 
 msgctxt "field:calendar.todo.rrule,interval:"
 msgid "Interval"
-msgstr "Intervalo"
+msgstr "Interval"
 
 msgctxt "field:calendar.todo.rrule,rec_name:"
 msgid "Name"
-msgstr "Nombre"
+msgstr "Ime"
 
 msgctxt "field:calendar.todo.rrule,todo:"
 msgid "Todo"
-msgstr "Por Hacer"
+msgstr "Todo"
 
 msgctxt "field:calendar.todo.rrule,until:"
 msgid "Until Date"
-msgstr "Hasta la Fecha"
+msgstr "Do dne"
 
 msgctxt "field:calendar.todo.rrule,until_date:"
 msgid "Is Date"
-msgstr "Esta Fecha"
+msgstr "Je datum"
 
 msgctxt "field:calendar.todo.rrule,wkst:"
 msgid "Week Day"
-msgstr "Día de la Semana"
+msgstr "Dan v tednu"
 
 msgctxt "field:calendar.todo.rrule,write_date:"
 msgid "Write Date"
-msgstr "Fecha de Modificación"
+msgstr "Zapisano"
 
 msgctxt "field:calendar.todo.rrule,write_uid:"
 msgid "Write User"
-msgstr "Modificado por Usuario"
+msgstr "Zapisal"
 
 msgctxt "help:calendar.todo,uuid:"
 msgid "Universally Unique Identifier"
-msgstr "Identificador Único Universal"
+msgstr "Vsesplošno edinstven identifikator"
 
 msgctxt "help:calendar.todo.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.todo.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.todo.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.todo.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.todo,name:"
 msgid "Todo"
-msgstr "Por Hacer"
+msgstr "Todo"
 
 msgctxt "model:calendar.todo-calendar.category,name:"
 msgid "Todo - Category"
-msgstr "Por Hacer - Categoria"
+msgstr "Todo - Kategorija"
 
 msgctxt "model:calendar.todo.alarm,name:"
 msgid "Alarm"
-msgstr "Alarma"
+msgstr "Alarm"
 
 msgctxt "model:calendar.todo.attendee,name:"
 msgid "Attendee"
-msgstr "Asistente"
+msgstr "Navzoči"
 
 msgctxt "model:calendar.todo.exdate,name:"
 msgid "Exception Date"
-msgstr "Fecha de Excepción"
+msgstr "Izjemni datum"
 
 msgctxt "model:calendar.todo.exrule,name:"
 msgid "Exception Rule"
-msgstr "Regla de Excepción"
+msgstr "Izjemno pravilo"
 
 msgctxt "model:calendar.todo.rdate,name:"
 msgid "Todo Recurrence Date"
-msgstr "Fecha de Repetición"
+msgstr "Todo datum ponovitve"
 
 msgctxt "model:calendar.todo.rrule,name:"
 msgid "Recurrence Rule"
-msgstr "Regla de Repetición"
+msgstr "Pravilo ponovitve"
 
 msgctxt "model:ir.action,name:act_todo_form"
 msgid "Todos"
-msgstr "Por hacer"
+msgstr "Todoji"
 
 msgctxt "model:ir.action,name:act_todo_form3"
 msgid "Todos"
-msgstr "Por hacer"
+msgstr "Todoji"
 
 msgctxt "model:ir.ui.menu,name:menu_todo_form"
 msgid "Todos"
-msgstr "Por hacer"
+msgstr "Todoji"
 
 msgctxt "selection:calendar.todo,classification:"
 msgid "Confidential"
-msgstr "Confidencial"
+msgstr "Zaupno"
 
 msgctxt "selection:calendar.todo,classification:"
 msgid "Private"
-msgstr "Privado"
+msgstr "Zasebno"
 
 msgctxt "selection:calendar.todo,classification:"
 msgid "Public"
-msgstr "Público"
+msgstr "Javno"
 
-#, fuzzy
 msgctxt "selection:calendar.todo,status:"
 msgid ""
-msgstr "Punto de Orden"
+msgstr ""
 
 msgctxt "selection:calendar.todo,status:"
 msgid "Cancelled"
-msgstr "Cancelado"
+msgstr "Preklicano"
 
 msgctxt "selection:calendar.todo,status:"
 msgid "Completed"
-msgstr "Completado"
+msgstr "Zaključeno"
 
 msgctxt "selection:calendar.todo,status:"
 msgid "In-Process"
-msgstr "En-Proceso"
+msgstr "V teku"
 
 msgctxt "selection:calendar.todo,status:"
 msgid "Needs-Action"
-msgstr "Necesita una Acción"
+msgstr "Potreben ukrep"
 
-#, fuzzy
 msgctxt "selection:calendar.todo.attendee,status:"
 msgid ""
-msgstr "Punto de Orden"
+msgstr ""
 
 msgctxt "selection:calendar.todo.attendee,status:"
 msgid "Accepted"
-msgstr "Aceptado"
+msgstr "Sprejeto"
 
 msgctxt "selection:calendar.todo.attendee,status:"
 msgid "Declined"
-msgstr "Declinado"
+msgstr "Zavrnjeno"
 
 msgctxt "selection:calendar.todo.attendee,status:"
 msgid "Delegated"
-msgstr "Delegado"
+msgstr "Delegirano"
 
 msgctxt "selection:calendar.todo.attendee,status:"
 msgid "Needs Action"
-msgstr "Necesita una Acción"
+msgstr "Potreben ukrep"
 
 msgctxt "selection:calendar.todo.attendee,status:"
 msgid "Tentative"
-msgstr "Tentativa"
+msgstr "Negotovo"
 
 msgctxt "selection:calendar.todo.exrule,freq:"
 msgid "Daily"
-msgstr "Diario"
+msgstr "Dnevno"
 
 msgctxt "selection:calendar.todo.exrule,freq:"
 msgid "Hourly"
-msgstr "Cada Hora"
+msgstr "Na uro"
 
 msgctxt "selection:calendar.todo.exrule,freq:"
 msgid "Minutely"
-msgstr "Cada Minuto"
+msgstr "Na minuto"
 
 msgctxt "selection:calendar.todo.exrule,freq:"
 msgid "Monthly"
-msgstr "Mensualmente"
+msgstr "Mesečno"
 
 msgctxt "selection:calendar.todo.exrule,freq:"
 msgid "Secondly"
-msgstr "En segundo lugar"
+msgstr "Na sekundo"
 
 msgctxt "selection:calendar.todo.exrule,freq:"
 msgid "Weekly"
-msgstr "Semanalmente"
+msgstr "Tedensko"
 
 msgctxt "selection:calendar.todo.exrule,freq:"
 msgid "Yearly"
-msgstr "Anualmente"
+msgstr "Letno"
 
 msgctxt "selection:calendar.todo.exrule,wkst:"
 msgid "Friday"
-msgstr "Viernes"
+msgstr "Petek"
 
 msgctxt "selection:calendar.todo.exrule,wkst:"
 msgid "Monday"
-msgstr "Lunes"
+msgstr "Ponedeljek"
 
 msgctxt "selection:calendar.todo.exrule,wkst:"
 msgid "Saturday"
-msgstr "Sábado"
+msgstr "Sobota"
 
 msgctxt "selection:calendar.todo.exrule,wkst:"
 msgid "Sunday"
-msgstr "Domingo"
+msgstr "Nedelja"
 
 msgctxt "selection:calendar.todo.exrule,wkst:"
 msgid "Thursday"
-msgstr "Jueves"
+msgstr "Četrtek"
 
 msgctxt "selection:calendar.todo.exrule,wkst:"
 msgid "Tuesday"
-msgstr "Martes"
+msgstr "Torek"
 
 msgctxt "selection:calendar.todo.exrule,wkst:"
 msgid "Wednesday"
-msgstr "Miércoles"
+msgstr "Sreda"
 
 msgctxt "selection:calendar.todo.rrule,freq:"
 msgid "Daily"
-msgstr "Diario"
+msgstr "Dnevno"
 
 msgctxt "selection:calendar.todo.rrule,freq:"
 msgid "Hourly"
-msgstr "Cada Hora"
+msgstr "Na uro"
 
 msgctxt "selection:calendar.todo.rrule,freq:"
 msgid "Minutely"
-msgstr "Cada Minuto"
+msgstr "Na minuto"
 
 msgctxt "selection:calendar.todo.rrule,freq:"
 msgid "Monthly"
-msgstr "Mensualmente"
+msgstr "Mesečno"
 
 msgctxt "selection:calendar.todo.rrule,freq:"
 msgid "Secondly"
-msgstr "En segundo lugar"
+msgstr "Na sekundo"
 
 msgctxt "selection:calendar.todo.rrule,freq:"
 msgid "Weekly"
-msgstr "Semanalmente"
+msgstr "Tedensko"
 
 msgctxt "selection:calendar.todo.rrule,freq:"
 msgid "Yearly"
-msgstr "Anualmente"
+msgstr "Letno"
 
 msgctxt "selection:calendar.todo.rrule,wkst:"
 msgid "Friday"
-msgstr "Viernes"
+msgstr "Petek"
 
 msgctxt "selection:calendar.todo.rrule,wkst:"
 msgid "Monday"
-msgstr "Lunes"
+msgstr "Ponedeljek"
 
 msgctxt "selection:calendar.todo.rrule,wkst:"
 msgid "Saturday"
-msgstr "Sábado"
+msgstr "Sobota"
 
 msgctxt "selection:calendar.todo.rrule,wkst:"
 msgid "Sunday"
-msgstr "Domingo"
+msgstr "Nedelja"
 
 msgctxt "selection:calendar.todo.rrule,wkst:"
 msgid "Thursday"
-msgstr "Jueves"
+msgstr "Četrtek"
 
 msgctxt "selection:calendar.todo.rrule,wkst:"
 msgid "Tuesday"
-msgstr "Martes"
+msgstr "Torek"
 
 msgctxt "selection:calendar.todo.rrule,wkst:"
 msgid "Wednesday"
-msgstr "Miércoles"
+msgstr "Sreda"
 
 msgctxt "view:calendar.todo.attendee:"
 msgid "Attendee"
-msgstr "Asistente"
+msgstr "Navzoči"
 
 msgctxt "view:calendar.todo.attendee:"
 msgid "Attendees"
-msgstr "Asistentes"
+msgstr "Navzoči"
 
 msgctxt "view:calendar.todo.exdate:"
 msgid "Exception Date"
-msgstr "Fecha de Excepción"
+msgstr "Izjemni datum"
 
 msgctxt "view:calendar.todo.exdate:"
 msgid "Exception Dates"
-msgstr "Fechas de Excepción"
+msgstr "Izjemni datumi"
 
 msgctxt "view:calendar.todo.exrule:"
 msgid "Exception Rule"
-msgstr "Regla de Excepción"
+msgstr "Izjemno pravilo"
 
 msgctxt "view:calendar.todo.exrule:"
 msgid "Exception Rules"
-msgstr "Reglas de Excepción"
+msgstr "Izjemna pravila"
 
 msgctxt "view:calendar.todo.rdate:"
 msgid "Recurrence Date"
-msgstr "Fecha de Repetición"
+msgstr "Datum ponovitve"
 
 msgctxt "view:calendar.todo.rdate:"
 msgid "Recurrence Dates"
-msgstr "Fechas de Repetición"
+msgstr "Datumi ponovitev"
 
 msgctxt "view:calendar.todo.rrule:"
 msgid "Recurrence Rule"
-msgstr "Regla de Repetición"
+msgstr "Pravilo ponovitve"
 
 msgctxt "view:calendar.todo.rrule:"
 msgid "Recurrence Rules"
-msgstr "Reglas de Repetición"
+msgstr "Pravila ponovitev"
 
 msgctxt "view:calendar.todo:"
 msgid "Attendees"
-msgstr "Asistentes"
+msgstr "Navzoči"
 
 msgctxt "view:calendar.todo:"
 msgid "Categories"
-msgstr "Categorías"
+msgstr "Kategorije"
 
 msgctxt "view:calendar.todo:"
 msgid "General"
-msgstr "General"
+msgstr "Splošno"
 
 msgctxt "view:calendar.todo:"
 msgid "Occurences"
-msgstr "Ocurrencias"
+msgstr "Pojavljanje"
 
 msgctxt "view:calendar.todo:"
 msgid "Todo"
-msgstr "Por Hacer"
+msgstr "Todo"
 
 msgctxt "view:calendar.todo:"
 msgid "Todos"
-msgstr "Por hacer"
+msgstr "Todoji"
diff --git a/setup.py b/setup.py
index c64c9d6..60eaaa3 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_todo',
         '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 62e4f36..7593e9a 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_todo import suite
+
+__all__ = ['suite']
diff --git a/todo.py b/todo.py
index 1a81bbc..fd41a04 100644
--- a/todo.py
+++ b/todo.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 ModelSQL, ModelView, fields
 from trytond.tools import reduce_ids
-from trytond.backend import TableHandler
+from trytond import backend
 from trytond.pyson import Eval, If, Bool
 from trytond.transaction import Transaction
 from trytond.pool import Pool
@@ -191,7 +193,7 @@ class Todo(ModelSQL, ModelView):
 
     @classmethod
     def validate(cls, todos):
-        super(todos, cls).validate(todos)
+        super(Todo, cls).validate(todos)
         for todo in todos:
             todo.check_recurrence()
 
@@ -298,6 +300,7 @@ class Todo(ModelSQL, ModelView):
         pool = Pool()
         Calendar = pool.get('calendar.calendar')
         Collection = pool.get('webdav.collection')
+        table = cls.__table__()
 
         cursor = Transaction().cursor
 
@@ -310,10 +313,11 @@ class Todo(ModelSQL, ModelView):
         ids = [t.id for t in todos]
         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 "' + 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))
 
         for todo in todos:
             if (todo.calendar.owner
@@ -879,7 +883,9 @@ class TodoRDate(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'
@@ -892,13 +898,13 @@ class TodoRDate(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
@@ -944,7 +950,9 @@ class TodoRRule(RRuleMixin, ModelSQL, ModelView):
 
     @classmethod
     def __register__(cls, module_name):
+        TableHandler = backend.get('TableHandler')
         cursor = Transaction().cursor
+        sql_table = cls.__table__()
 
         super(TodoRRule, cls).__register__(module_name)
 
@@ -952,13 +960,13 @@ class TodoRRule(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
@@ -1015,7 +1023,9 @@ class TodoAttendee(AttendeeMixin, ModelSQL, ModelView):
 
     @classmethod
     def __register__(cls, module_name):
+        TableHandler = backend.get('TableHandler')
         cursor = Transaction().cursor
+        sql_table = cls.__table__()
 
         super(TodoAttendee, cls).__register__(module_name)
 
@@ -1023,13 +1033,14 @@ class TodoAttendee(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
@@ -1177,7 +1188,9 @@ class TodoAlarm(AlarmMixin, ModelSQL, ModelView):
 
     @classmethod
     def __register__(cls, module_name):
+        TableHandler = backend.get('TableHandler')
         cursor = Transaction().cursor
+        sql_table = cls.__table__()
 
         super(TodoAlarm, cls).__register__(module_name)
 
@@ -1185,10 +1198,11 @@ class TodoAlarm(AlarmMixin, ModelSQL, ModelView):
 
         # Migration from 2.6: Remove inherits calendar.alarm
         if table.column_exist('calendar_alarm'):
-            cursor.execute('UPDATE "' + cls._table + '" AS t '
-                'SET valarm = (SELECT a.valarm '
-                    'FROM calendar_alarm AS a '
-                    'WHERE a.id = t.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
diff --git a/todo.xml b/todo.xml
index 23e37d0..b0d1bfa 100644
--- a/todo.xml
+++ b/todo.xml
@@ -27,7 +27,7 @@ this repository contains the full copyright notices and license terms. -->
         <record model="ir.action.act_window" id="act_todo_form">
             <field name="name">Todos</field>
             <field name="res_model">calendar.todo</field>
-            <field name="domain">[('parent', '=', False)]</field>
+            <field name="domain">[('parent', '=', None)]</field>
         </record>
         <record model="ir.action.act_window.view" id="act_todo_form_view1">
             <field name="sequence" eval="10"/>
@@ -45,7 +45,7 @@ this repository contains the full copyright notices and license terms. -->
         <record model="ir.action.act_window" id="act_todo_form3">
             <field name="name">Todos</field>
             <field name="res_model">calendar.todo</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_todo_form3_view1">
             <field name="sequence" eval="10"/>
diff --git a/tryton.cfg b/tryton.cfg
index aae9557..3141578 100644
--- a/tryton.cfg
+++ b/tryton.cfg
@@ -1,5 +1,5 @@
 [tryton]
-version=2.8.0
+version=3.0.0
 depends:
     calendar
     ir
diff --git a/trytond_calendar_todo.egg-info/PKG-INFO b/trytond_calendar_todo.egg-info/PKG-INFO
index fa2a896..3a42499 100644
--- a/trytond_calendar_todo.egg-info/PKG-INFO
+++ b/trytond_calendar_todo.egg-info/PKG-INFO
@@ -1,12 +1,12 @@
 Metadata-Version: 1.1
 Name: trytond-calendar-todo
-Version: 2.8.0
+Version: 3.0.0
 Summary: Tryton module to add TODO on 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_todo
         =====================
         
@@ -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_todo.egg-info/SOURCES.txt b/trytond_calendar_todo.egg-info/SOURCES.txt
index 35807aa..7eab3a2 100644
--- a/trytond_calendar_todo.egg-info/SOURCES.txt
+++ b/trytond_calendar_todo.egg-info/SOURCES.txt
@@ -23,6 +23,7 @@ locale/es_ES.po
 locale/fr_FR.po
 locale/nl_NL.po
 locale/ru_RU.po
+locale/sl_SI.po
 trytond_calendar_todo.egg-info/PKG-INFO
 trytond_calendar_todo.egg-info/SOURCES.txt
 trytond_calendar_todo.egg-info/dependency_links.txt
diff --git a/trytond_calendar_todo.egg-info/requires.txt b/trytond_calendar_todo.egg-info/requires.txt
index d08f9d2..4636bab 100644
--- a/trytond_calendar_todo.egg-info/requires.txt
+++ b/trytond_calendar_todo.egg-info/requires.txt
@@ -2,5 +2,6 @@ vobject >= 0.8.0
 PyWebDAV >= 0.9.8
 python-dateutil
 pytz
-trytond_calendar >= 2.8, < 2.9
-trytond >= 2.8, < 2.9
\ No newline at end of file
+python-sql
+trytond_calendar >= 3.0, < 3.1
+trytond >= 3.0, < 3.1
\ No newline at end of file
diff --git a/webdav.py b/webdav.py
index 4fab749..5093fe3 100644
--- a/webdav.py
+++ b/webdav.py
@@ -3,6 +3,10 @@
 import vobject
 import urllib
 from pywebdav.lib.errors import DAV_NotFound, DAV_Forbidden
+from sql.functions import Extract
+from sql.conditionals import Coalesce
+from sql.aggregate import Max
+
 from trytond.tools import reduce_ids
 from trytond.transaction import Transaction
 from trytond.cache import Cache
@@ -149,6 +153,7 @@ class Collection:
     @classmethod
     def get_creationdate(cls, uri, cache=None):
         Todo = Pool().get('calendar.todo')
+        todo = Todo.__table__()
 
         cursor = Transaction().cursor
 
@@ -174,11 +179,10 @@ 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 create_date) '
-                        'FROM "' + Todo.__table__ + '" '
-                        'WHERE ' + red_sql, red_ids)
+                    red_sql = reduce_ids(todo.id, sub_ids)
+                    cursor.execute(*todo.select(todo.id,
+                            Extract('EPOCH', todo.create_date),
+                            where=red_sql))
                     for todo_id2, date in cursor.fetchall():
                         if todo_id2 == todo_id:
                             res = date
@@ -195,6 +199,7 @@ class Collection:
     @classmethod
     def get_lastmodified(cls, uri, cache=None):
         Todo = Pool().get('calendar.todo')
+        todo = Todo.__table__()
 
         cursor = Transaction().cursor
 
@@ -217,16 +222,13 @@ 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 "' + Todo.__table__ + '" '
-                        'WHERE ' + red_id_sql + ' '
-                            'OR ' + red_parent_sql + ' '
-                        'GROUP BY parent, id', red_id_ids + red_parent_ids)
+                    red_id_sql = reduce_ids(todo.id, sub_ids)
+                    red_parent_sql = reduce_ids(todo.parent, sub_ids)
+                    cursor.execute(*todo.select(Coalesce(todo.parent, todo.id),
+                            Max(Extract('EPOCH', Coalesce(todo.write_date,
+                                        todo.create_date))),
+                            where=red_id_sql | red_parent_sql,
+                            group_by=(todo.parent, todo.id)))
                     for todo_id2, date in cursor.fetchall():
                         if todo_id2 == todo_id:
                             res = date
commit 1616067e83538a6f5ff5684cd21ad574af1e44c2
Author: Mathias Behrle <mathiasb at m9s.biz>
Date:   Tue Aug 6 16:20:48 2013 +0200

    Releasing debian version 2.8.0-3.

diff --git a/debian/changelog b/debian/changelog
index da02604..0b0ed95 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,10 @@
+tryton-modules-calendar-todo (2.8.0-3) unstable; urgency=low
+
+  * Removing pydist-overrides, it is no more needed.
+  * Adapting the rules file to work also with git-buildpackage.
+
+ -- Mathias Behrle <mathiasb at m9s.biz>  Tue, 06 Aug 2013 13:32:36 +0200
+
 tryton-modules-calendar-todo (2.8.0-2) unstable; urgency=low
 
   * Removing needless empty line in rules.
commit ce015ab495f01042542cdec083f2ba398ad0af84
Author: Mathias Behrle <mathiasb at m9s.biz>
Date:   Mon Aug 5 18:06:36 2013 +0200

    Adapting the rules file to work also with git-buildpackage.

diff --git a/debian/rules b/debian/rules
index a6a1fb8..30074ad 100755
--- a/debian/rules
+++ b/debian/rules
@@ -1,13 +1,24 @@
 #!/usr/bin/make -f
 
 MAJOR := $(shell python setup.py --version | awk -F "." '{print $$1 "." $$2}')
+PACKAGE_NAME := $(shell python setup.py --name)
 
 %:
 	dh ${@} --with python2
 
 override_dh_auto_clean:
 	dh_auto_clean
+
+override_dh_auto_build:
+	mv $(PACKAGE_NAME).egg-info $(PACKAGE_NAME).hen-info
+	mv PKG-INFO PKG-INFO.hen
+	dh_auto_build
+
+override_dh_auto_install:
+	dh_auto_install
 	rm -rf *.egg-info
+	mv $(PACKAGE_NAME).hen-info $(PACKAGE_NAME).egg-info
+	mv PKG-INFO.hen PKG-INFO
 
 override_dh_gencontrol:
 	dh_gencontrol -- -Vversion:major="$(MAJOR)"
commit 5dea0b0442b838007074502149ef3ec15627a815
Author: Mathias Behrle <mathiasb at m9s.biz>
Date:   Mon Aug 5 14:04:41 2013 +0200

    Removing pydist-overrides, it is no more needed.

diff --git a/debian/pydist-overrides b/debian/pydist-overrides
deleted file mode 100644
index 9aad9d3..0000000
--- a/debian/pydist-overrides
+++ /dev/null
@@ -1,5 +0,0 @@
-python_dateutil python-dateutil
-vobject python-vobject
-PyWebDAV python-webdav
-pytz python-tz
-
commit 387a02ec1659681857a0f33d628748dfac27506b
Author: Mathias Behrle <mathiasb at m9s.biz>
Date:   Fri May 31 19:57:27 2013 +0200

    Releasing debian version 2.8.0-2.

diff --git a/debian/changelog b/debian/changelog
index 80a5ffc..da02604 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,9 @@
+tryton-modules-calendar-todo (2.8.0-2) unstable; urgency=low
+
+  * Removing needless empty line in rules.
+
+ -- Mathias Behrle <mathiasb at m9s.biz>  Fri, 31 May 2013 17:26:20 +0200
+
 tryton-modules-calendar-todo (2.8.0-1) experimental; urgency=low
 
   * Merging upstream version 2.8.0.
commit 411cef67e056f58bf48923f2665513bcab5023c5
Author: Mathias Behrle <mathiasb at m9s.biz>
Date:   Wed May 29 17:19:29 2013 +0200

    Removing needless empty line in rules.

diff --git a/debian/rules b/debian/rules
index 0f63ab4..a6a1fb8 100755
--- a/debian/rules
+++ b/debian/rules
@@ -7,7 +7,6 @@ MAJOR := $(shell python setup.py --version | awk -F "." '{print $$1 "." $$2}')
 
 override_dh_auto_clean:
 	dh_auto_clean
-
 	rm -rf *.egg-info
 
 override_dh_gencontrol:
commit 07215abaa2f804349cb4a4f727cbc9a888623a06
Author: Mathias Behrle <mathiasb at m9s.biz>
Date:   Thu May 2 17:27:03 2013 +0200

    Releasing debian version 2.8.0-1.

diff --git a/debian/changelog b/debian/changelog
index cb1bc13..80a5ffc 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,10 @@
+tryton-modules-calendar-todo (2.8.0-1) experimental; urgency=low
+
+  * Merging upstream version 2.8.0.
+  * Updating copyright.
+
+ -- Mathias Behrle <mathiasb at m9s.biz>  Thu, 02 May 2013 15:19:54 +0200
+
 tryton-modules-calendar-todo (2.6.1-3) experimental; urgency=low
 
   * Removing Daniel from Uploaders. Thanks for your work! (Closes: #704376).
commit bc0743c6d830168f878742fc3d9eabc07579f41f
Author: Mathias Behrle <mathiasb at m9s.biz>
Date:   Thu May 2 14:13:10 2013 +0200

    Updating copyright.

diff --git a/debian/copyright b/debian/copyright
index cbad1dd..c27df9a 100644
--- a/debian/copyright
+++ b/debian/copyright
@@ -1,9 +1,9 @@
 Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
 
 Files: *
-Copyright: 2009-2012 Cédric Krier
-           2009-2012 Bertrand Chenal
-           2009-2012 B2CK SPRL
+Copyright: 2009-2013 Cédric Krier
+           2009-2013 Bertrand Chenal
+           2009-2013 B2CK SPRL
 License: GPL-3+
 
 Files: debian/*
commit 85bfb20db0328d90e8f5abd2c7f17ae3b2d721a1
Author: Mathias Behrle <mathiasb at m9s.biz>
Date:   Thu May 2 00:35:40 2013 +0200

    Merging upstream version 2.8.0.

diff --git a/CHANGELOG b/CHANGELOG
index 1766455..9735814 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 d03b3f6..d954667 100644
--- a/PKG-INFO
+++ b/PKG-INFO
@@ -1,12 +1,12 @@
 Metadata-Version: 1.1
 Name: trytond_calendar_todo
-Version: 2.6.1
+Version: 2.8.0
 Summary: Tryton module to add TODO on 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_todo
         =====================
         
@@ -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/locale/bg_BG.po b/locale/bg_BG.po
index e234518..5300c26 100644
--- a/locale/bg_BG.po
+++ b/locale/bg_BG.po
@@ -2,13 +2,93 @@
 msgid ""
 msgstr "Content-Type: text/plain; charset=utf-8\n"
 
+msgctxt "error:calendar.todo.exrule:"
+msgid "Invalid \"By Day\" in recurrence rule \"%s\""
+msgstr ""
+
+msgctxt "error:calendar.todo.exrule:"
+msgid "Invalid \"By Hour\" in recurrence rule \"%s\""
+msgstr ""
+
+msgctxt "error:calendar.todo.exrule:"
+msgid "Invalid \"By Minute\" in recurrence rule \"%s\""
+msgstr ""
+
+msgctxt "error:calendar.todo.exrule:"
+msgid "Invalid \"By Month Day\" in recurrence rule \"%s\""
+msgstr ""
+
+msgctxt "error:calendar.todo.exrule:"
+msgid "Invalid \"By Month\" in recurrence rule \"%s\""
+msgstr ""
+
+msgctxt "error:calendar.todo.exrule:"
+msgid "Invalid \"By Position\" in recurrence rule \"%s\""
+msgstr ""
+
+msgctxt "error:calendar.todo.exrule:"
+msgid "Invalid \"By Second\" in recurrence rule \"%s\""
+msgstr ""
+
+msgctxt "error:calendar.todo.exrule:"
+msgid "Invalid \"By Week Number\" in recurrence rule \"%s\""
+msgstr ""
+
+msgctxt "error:calendar.todo.exrule:"
+msgid "Invalid \"By Year Day\" in recurrence rule \"%s\""
+msgstr ""
+
+msgctxt "error:calendar.todo.exrule:"
+msgid "Only one of \"until\" and \"count\" can be set."
+msgstr ""
+
+msgctxt "error:calendar.todo.rrule:"
+msgid "Invalid \"By Day\" in recurrence rule \"%s\""
+msgstr ""
+
+msgctxt "error:calendar.todo.rrule:"
+msgid "Invalid \"By Hour\" in recurrence rule \"%s\""
+msgstr ""
+
+msgctxt "error:calendar.todo.rrule:"
+msgid "Invalid \"By Minute\" in recurrence rule \"%s\""
+msgstr ""
+
+msgctxt "error:calendar.todo.rrule:"
+msgid "Invalid \"By Month Day\" in recurrence rule \"%s\""
+msgstr ""
+
+msgctxt "error:calendar.todo.rrule:"
+msgid "Invalid \"By Month\" in recurrence rule \"%s\""
+msgstr ""
+
+msgctxt "error:calendar.todo.rrule:"
+msgid "Invalid \"By Position\" in recurrence rule \"%s\""
+msgstr ""
+
+msgctxt "error:calendar.todo.rrule:"
+msgid "Invalid \"By Second\" in recurrence rule \"%s\""
+msgstr ""
+
+msgctxt "error:calendar.todo.rrule:"
+msgid "Invalid \"By Week Number\" in recurrence rule \"%s\""
+msgstr ""
+
+msgctxt "error:calendar.todo.rrule:"
+msgid "Invalid \"By Year Day\" in recurrence rule \"%s\""
+msgstr ""
+
+msgctxt "error:calendar.todo.rrule:"
+msgid "Only one of \"until\" and \"count\" can be set."
+msgstr ""
+
 msgctxt "error:calendar.todo:"
-msgid "Recurrence can not be recurrent!"
-msgstr "Повторението не може да е периодично!"
+msgid "Todo \"%s\" can not be recurrent."
+msgstr ""
 
 msgctxt "error:calendar.todo:"
-msgid "UUID and recurrence must be unique in a calendar!"
-msgstr "UUID и взаимна вложеност трябва да са уникални в календар!"
+msgid "UUID and recurrence must be unique in a calendar."
+msgstr ""
 
 msgctxt "field:calendar.todo,alarms:"
 msgid "Alarms"
@@ -178,10 +258,6 @@ msgctxt "field:calendar.todo-calendar.category,write_uid:"
 msgid "Write User"
 msgstr "Променено от"
 
-msgctxt "field:calendar.todo.alarm,calendar_alarm:"
-msgid "Calendar Alarm"
-msgstr "Аларма на календар"
-
 msgctxt "field:calendar.todo.alarm,create_date:"
 msgid "Create Date"
 msgstr "Създадено на"
@@ -202,6 +278,10 @@ msgctxt "field:calendar.todo.alarm,todo:"
 msgid "Todo"
 msgstr "Задача"
 
+msgctxt "field:calendar.todo.alarm,valarm:"
+msgid "valarm"
+msgstr ""
+
 msgctxt "field:calendar.todo.alarm,write_date:"
 msgid "Write Date"
 msgstr "Променено на"
@@ -210,9 +290,9 @@ msgctxt "field:calendar.todo.alarm,write_uid:"
 msgid "Write User"
 msgstr "Променено от"
 
-msgctxt "field:calendar.todo.attendee,calendar_attendee:"
-msgid "Calendar Attendee"
-msgstr "Присъстващ на календар"
+msgctxt "field:calendar.todo.attendee,attendee:"
+msgid "attendee"
+msgstr ""
 
 msgctxt "field:calendar.todo.attendee,create_date:"
 msgid "Create Date"
@@ -222,6 +302,11 @@ msgctxt "field:calendar.todo.attendee,create_uid:"
 msgid "Create User"
 msgstr "Създадено от"
 
+#, fuzzy
+msgctxt "field:calendar.todo.attendee,email:"
+msgid "Email"
+msgstr "Email"
+
 msgctxt "field:calendar.todo.attendee,id:"
 msgid "ID"
 msgstr "ID"
@@ -230,6 +315,10 @@ msgctxt "field:calendar.todo.attendee,rec_name:"
 msgid "Name"
 msgstr "Име"
 
+msgctxt "field:calendar.todo.attendee,status:"
+msgid "Participation Status"
+msgstr ""
+
 msgctxt "field:calendar.todo.attendee,todo:"
 msgid "Todo"
 msgstr "Задача"
@@ -242,10 +331,6 @@ msgctxt "field:calendar.todo.attendee,write_uid:"
 msgid "Write User"
 msgstr "Променено от"
 
-msgctxt "field:calendar.todo.exdate,calendar_date:"
-msgid "Calendar Date"
-msgstr "Дата от календар"
-
 msgctxt "field:calendar.todo.exdate,create_date:"
 msgid "Create Date"
 msgstr "Създадено на"
@@ -254,6 +339,15 @@ msgctxt "field:calendar.todo.exdate,create_uid:"
 msgid "Create User"
 msgstr "Създадено от"
 
+msgctxt "field:calendar.todo.exdate,date:"
+msgid "Is Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.todo.exdate,datetime:"
+msgid "Date"
+msgstr "Дата"
+
 msgctxt "field:calendar.todo.exdate,id:"
 msgid "ID"
 msgstr "ID"
@@ -274,8 +368,44 @@ msgctxt "field:calendar.todo.exdate,write_uid:"
 msgid "Write User"
 msgstr "Променено от"
 
-msgctxt "field:calendar.todo.exrule,calendar_rrule:"
-msgid "Calendar RRule"
+msgctxt "field:calendar.todo.exrule,byday:"
+msgid "By Day"
+msgstr ""
+
+msgctxt "field:calendar.todo.exrule,byhour:"
+msgid "By Hour"
+msgstr ""
+
+msgctxt "field:calendar.todo.exrule,byminute:"
+msgid "By Minute"
+msgstr ""
+
+msgctxt "field:calendar.todo.exrule,bymonth:"
+msgid "By Month"
+msgstr ""
+
+msgctxt "field:calendar.todo.exrule,bymonthday:"
+msgid "By Month Day"
+msgstr ""
+
+msgctxt "field:calendar.todo.exrule,bysecond:"
+msgid "By Second"
+msgstr ""
+
+msgctxt "field:calendar.todo.exrule,bysetpos:"
+msgid "By Position"
+msgstr ""
+
+msgctxt "field:calendar.todo.exrule,byweekno:"
+msgid "By Week Number"
+msgstr ""
+
+msgctxt "field:calendar.todo.exrule,byyearday:"
+msgid "By Year Day"
+msgstr ""
+
+msgctxt "field:calendar.todo.exrule,count:"
+msgid "Count"
 msgstr ""
 
 msgctxt "field:calendar.todo.exrule,create_date:"
@@ -286,10 +416,18 @@ msgctxt "field:calendar.todo.exrule,create_uid:"
 msgid "Create User"
 msgstr "Създадено от"
 
+msgctxt "field:calendar.todo.exrule,freq:"
+msgid "Frequency"
+msgstr ""
+
 msgctxt "field:calendar.todo.exrule,id:"
 msgid "ID"
 msgstr "ID"
 
+msgctxt "field:calendar.todo.exrule,interval:"
+msgid "Interval"
+msgstr ""
+
 msgctxt "field:calendar.todo.exrule,rec_name:"
 msgid "Name"
 msgstr "Име"
@@ -298,6 +436,19 @@ msgctxt "field:calendar.todo.exrule,todo:"
 msgid "Todo"
 msgstr "Задача"
 
+msgctxt "field:calendar.todo.exrule,until:"
+msgid "Until Date"
+msgstr ""
+
+msgctxt "field:calendar.todo.exrule,until_date:"
+msgid "Is Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.todo.exrule,wkst:"
+msgid "Week Day"
+msgstr "Ден от седмица"
+
 msgctxt "field:calendar.todo.exrule,write_date:"
 msgid "Write Date"
 msgstr "Променено на"
@@ -306,10 +457,6 @@ msgctxt "field:calendar.todo.exrule,write_uid:"
 msgid "Write User"
 msgstr "Променено от"
 
-msgctxt "field:calendar.todo.rdate,calendar_date:"
-msgid "Calendar Date"
-msgstr "Дата от календар"
-
 msgctxt "field:calendar.todo.rdate,create_date:"
 msgid "Create Date"
 msgstr "Създадено на"
@@ -318,6 +465,15 @@ msgctxt "field:calendar.todo.rdate,create_uid:"
 msgid "Create User"
 msgstr "Създадено от"
 
+msgctxt "field:calendar.todo.rdate,date:"
+msgid "Is Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.todo.rdate,datetime:"
+msgid "Date"
+msgstr "Дата"
+
 msgctxt "field:calendar.todo.rdate,id:"
 msgid "ID"
 msgstr "ID"
@@ -338,8 +494,44 @@ msgctxt "field:calendar.todo.rdate,write_uid:"
 msgid "Write User"
 msgstr "Променено от"
 
-msgctxt "field:calendar.todo.rrule,calendar_rrule:"
-msgid "Calendar RRule"
+msgctxt "field:calendar.todo.rrule,byday:"
+msgid "By Day"
+msgstr ""
+
+msgctxt "field:calendar.todo.rrule,byhour:"
+msgid "By Hour"
+msgstr ""
+
+msgctxt "field:calendar.todo.rrule,byminute:"
+msgid "By Minute"
+msgstr ""
+
+msgctxt "field:calendar.todo.rrule,bymonth:"
+msgid "By Month"
+msgstr ""
+
+msgctxt "field:calendar.todo.rrule,bymonthday:"
+msgid "By Month Day"
+msgstr ""
+
+msgctxt "field:calendar.todo.rrule,bysecond:"
+msgid "By Second"
+msgstr ""
+
+msgctxt "field:calendar.todo.rrule,bysetpos:"
+msgid "By Position"
+msgstr ""
+
+msgctxt "field:calendar.todo.rrule,byweekno:"
+msgid "By Week Number"
+msgstr ""
+
+msgctxt "field:calendar.todo.rrule,byyearday:"
+msgid "By Year Day"
+msgstr ""
+
+msgctxt "field:calendar.todo.rrule,count:"
+msgid "Count"
 msgstr ""
 
 msgctxt "field:calendar.todo.rrule,create_date:"
@@ -350,10 +542,18 @@ msgctxt "field:calendar.todo.rrule,create_uid:"
 msgid "Create User"
 msgstr "Създадено от"
 
+msgctxt "field:calendar.todo.rrule,freq:"
+msgid "Frequency"
+msgstr ""
+
 msgctxt "field:calendar.todo.rrule,id:"
 msgid "ID"
 msgstr "ID"
 
+msgctxt "field:calendar.todo.rrule,interval:"
+msgid "Interval"
+msgstr ""
+
 msgctxt "field:calendar.todo.rrule,rec_name:"
 msgid "Name"
 msgstr "Име"
@@ -362,6 +562,19 @@ msgctxt "field:calendar.todo.rrule,todo:"
 msgid "Todo"
 msgstr "Задача"
 
+msgctxt "field:calendar.todo.rrule,until:"
+msgid "Until Date"
+msgstr ""
+
+msgctxt "field:calendar.todo.rrule,until_date:"
+msgid "Is Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.todo.rrule,wkst:"
+msgid "Week Day"
+msgstr "Ден от седмица"
+
 msgctxt "field:calendar.todo.rrule,write_date:"
 msgid "Write Date"
 msgstr "Променено на"
@@ -374,6 +587,22 @@ msgctxt "help:calendar.todo,uuid:"
 msgid "Universally Unique Identifier"
 msgstr "Универсален иникален идентификатор"
 
+msgctxt "help:calendar.todo.exdate,date:"
+msgid "Ignore time of field \"Date\", but handle as date only."
+msgstr ""
+
+msgctxt "help:calendar.todo.exrule,until_date:"
+msgid "Ignore time of field \"Until Date\", but handle as date only."
+msgstr ""
+
+msgctxt "help:calendar.todo.rdate,date:"
+msgid "Ignore time of field \"Date\", but handle as date only."
+msgstr ""
+
+msgctxt "help:calendar.todo.rrule,until_date:"
+msgid "Ignore time of field \"Until Date\", but handle as date only."
+msgstr ""
+
 msgctxt "model:calendar.todo,name:"
 msgid "Todo"
 msgstr "Задача"
@@ -450,6 +679,157 @@ msgctxt "selection:calendar.todo,status:"
 msgid "Needs-Action"
 msgstr "Необходимо е действие"
 
+msgctxt "selection:calendar.todo.attendee,status:"
+msgid ""
+msgstr ""
+
+msgctxt "selection:calendar.todo.attendee,status:"
+msgid "Accepted"
+msgstr ""
+
+msgctxt "selection:calendar.todo.attendee,status:"
+msgid "Declined"
+msgstr ""
+
+msgctxt "selection:calendar.todo.attendee,status:"
+msgid "Delegated"
+msgstr ""
+
+msgctxt "selection:calendar.todo.attendee,status:"
+msgid "Needs Action"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:calendar.todo.attendee,status:"
+msgid "Tentative"
+msgstr "Пробен"
+
+msgctxt "selection:calendar.todo.exrule,freq:"
+msgid "Daily"
+msgstr ""
+
+msgctxt "selection:calendar.todo.exrule,freq:"
+msgid "Hourly"
+msgstr ""
+
+msgctxt "selection:calendar.todo.exrule,freq:"
+msgid "Minutely"
+msgstr ""
+
+msgctxt "selection:calendar.todo.exrule,freq:"
+msgid "Monthly"
+msgstr ""
+
+msgctxt "selection:calendar.todo.exrule,freq:"
+msgid "Secondly"
+msgstr ""
+
+msgctxt "selection:calendar.todo.exrule,freq:"
+msgid "Weekly"
+msgstr ""
+
+msgctxt "selection:calendar.todo.exrule,freq:"
+msgid "Yearly"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:calendar.todo.exrule,wkst:"
+msgid "Friday"
+msgstr "Петък"
+
+#, fuzzy
+msgctxt "selection:calendar.todo.exrule,wkst:"
+msgid "Monday"
+msgstr "Понеделник"
+
+#, fuzzy
+msgctxt "selection:calendar.todo.exrule,wkst:"
+msgid "Saturday"
+msgstr "Събота"
+
+#, fuzzy
+msgctxt "selection:calendar.todo.exrule,wkst:"
+msgid "Sunday"
+msgstr "Неделя"
+
+#, fuzzy
+msgctxt "selection:calendar.todo.exrule,wkst:"
+msgid "Thursday"
+msgstr "Четвъртък"
+
+#, fuzzy
+msgctxt "selection:calendar.todo.exrule,wkst:"
+msgid "Tuesday"
+msgstr "Вторник"
+
+#, fuzzy
+msgctxt "selection:calendar.todo.exrule,wkst:"
+msgid "Wednesday"
+msgstr "Сряда"
+
+msgctxt "selection:calendar.todo.rrule,freq:"
+msgid "Daily"
+msgstr ""
+
+msgctxt "selection:calendar.todo.rrule,freq:"
+msgid "Hourly"
+msgstr ""
+
+msgctxt "selection:calendar.todo.rrule,freq:"
+msgid "Minutely"
+msgstr ""
+
+msgctxt "selection:calendar.todo.rrule,freq:"
+msgid "Monthly"
+msgstr ""
+
+msgctxt "selection:calendar.todo.rrule,freq:"
+msgid "Secondly"
+msgstr ""
+
+msgctxt "selection:calendar.todo.rrule,freq:"
+msgid "Weekly"
+msgstr ""
+
+msgctxt "selection:calendar.todo.rrule,freq:"
+msgid "Yearly"
+msgstr ""
+
+#, fuzzy
+msgctxt "selection:calendar.todo.rrule,wkst:"
+msgid "Friday"
+msgstr "Петък"
+
+#, fuzzy
+msgctxt "selection:calendar.todo.rrule,wkst:"
+msgid "Monday"
+msgstr "Понеделник"
+
+#, fuzzy
+msgctxt "selection:calendar.todo.rrule,wkst:"
+msgid "Saturday"
+msgstr "Събота"
+
+#, fuzzy
+msgctxt "selection:calendar.todo.rrule,wkst:"
+msgid "Sunday"
+msgstr "Неделя"
+
+#, fuzzy
+msgctxt "selection:calendar.todo.rrule,wkst:"
+msgid "Thursday"
+msgstr "Четвъртък"
+
+#, fuzzy
+msgctxt "selection:calendar.todo.rrule,wkst:"
+msgid "Tuesday"
+msgstr "Вторник"
+
+#, fuzzy
+msgctxt "selection:calendar.todo.rrule,wkst:"
+msgid "Wednesday"
+msgstr "Сряда"
+
 msgctxt "view:calendar.todo.attendee:"
 msgid "Attendee"
 msgstr "Присъстващ"
diff --git a/locale/ca_ES.po b/locale/ca_ES.po
index c363f1b..b35f41f 100644
--- a/locale/ca_ES.po
+++ b/locale/ca_ES.po
@@ -2,13 +2,101 @@
 msgid ""
 msgstr "Content-Type: text/plain; charset=utf-8\n"
 
+msgctxt "error:calendar.todo.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.todo.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.todo.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.todo.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.todo.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.todo.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.todo.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.todo.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.todo.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.todo.exrule:"
+msgid "Only one of \"until\" and \"count\" can be set."
+msgstr "Defineix un \"fins\" i un \"comptador\"."
+
+msgctxt "error:calendar.todo.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.todo.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.todo.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.todo.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.todo.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.todo.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.todo.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.todo.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.todo.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.todo.rrule:"
+msgid "Only one of \"until\" and \"count\" can be set."
+msgstr "Defineix un \"fins\" i un \"comptador\"."
+
 msgctxt "error:calendar.todo:"
-msgid "Recurrence can not be recurrent!"
-msgstr "Una recurrencia no pot ser recurrent"
+msgid "Todo \"%s\" can not be recurrent."
+msgstr "La tasca \"%s\" no pot ser recurrent."
 
 msgctxt "error:calendar.todo:"
-msgid "UUID and recurrence must be unique in a calendar!"
-msgstr "UUID i recurrencia 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 "field:calendar.todo,alarms:"
 msgid "Alarms"
@@ -178,10 +266,6 @@ msgctxt "field:calendar.todo-calendar.category,write_uid:"
 msgid "Write User"
 msgstr "Usuari modificació"
 
-msgctxt "field:calendar.todo.alarm,calendar_alarm:"
-msgid "Calendar Alarm"
-msgstr "Alarma del calendari"
-
 msgctxt "field:calendar.todo.alarm,create_date:"
 msgid "Create Date"
 msgstr "Data creació"
@@ -202,6 +286,10 @@ msgctxt "field:calendar.todo.alarm,todo:"
 msgid "Todo"
 msgstr "Tasca"
 
+msgctxt "field:calendar.todo.alarm,valarm:"
+msgid "valarm"
+msgstr "valarm"
+
 msgctxt "field:calendar.todo.alarm,write_date:"
 msgid "Write Date"
 msgstr "Data modificació"
@@ -210,9 +298,9 @@ msgctxt "field:calendar.todo.alarm,write_uid:"
 msgid "Write User"
 msgstr "Usuari modificació"
 
-msgctxt "field:calendar.todo.attendee,calendar_attendee:"
-msgid "Calendar Attendee"
-msgstr "Calendari d'assistents"
+msgctxt "field:calendar.todo.attendee,attendee:"
+msgid "attendee"
+msgstr "assistent"
 
 msgctxt "field:calendar.todo.attendee,create_date:"
 msgid "Create Date"
@@ -222,6 +310,10 @@ msgctxt "field:calendar.todo.attendee,create_uid:"
 msgid "Create User"
 msgstr "Usuari creació"
 
+msgctxt "field:calendar.todo.attendee,email:"
+msgid "Email"
+msgstr "Email"
+
 msgctxt "field:calendar.todo.attendee,id:"
 msgid "ID"
 msgstr "ID"
@@ -230,6 +322,10 @@ msgctxt "field:calendar.todo.attendee,rec_name:"
 msgid "Name"
 msgstr "Nom"
 
+msgctxt "field:calendar.todo.attendee,status:"
+msgid "Participation Status"
+msgstr "Estat de participacions"
+
 msgctxt "field:calendar.todo.attendee,todo:"
 msgid "Todo"
 msgstr "Tasca"
@@ -242,10 +338,6 @@ msgctxt "field:calendar.todo.attendee,write_uid:"
 msgid "Write User"
 msgstr "Usuari modificació"
 
-msgctxt "field:calendar.todo.exdate,calendar_date:"
-msgid "Calendar Date"
-msgstr "Data calendari"
-
 msgctxt "field:calendar.todo.exdate,create_date:"
 msgid "Create Date"
 msgstr "Data creació"
@@ -254,6 +346,14 @@ msgctxt "field:calendar.todo.exdate,create_uid:"
 msgid "Create User"
 msgstr "Usuari creació"
 
+msgctxt "field:calendar.todo.exdate,date:"
+msgid "Is Date"
+msgstr "Es una data"
+
+msgctxt "field:calendar.todo.exdate,datetime:"
+msgid "Date"
+msgstr "Data"
+
 msgctxt "field:calendar.todo.exdate,id:"
 msgid "ID"
 msgstr "ID"
@@ -274,9 +374,45 @@ msgctxt "field:calendar.todo.exdate,write_uid:"
 msgid "Write User"
 msgstr "Usuari modificació"
 
-msgctxt "field:calendar.todo.exrule,calendar_rrule:"
-msgid "Calendar RRule"
-msgstr "Regla de recurrencia"
+msgctxt "field:calendar.todo.exrule,byday:"
+msgid "By Day"
+msgstr "Per dia"
+
+msgctxt "field:calendar.todo.exrule,byhour:"
+msgid "By Hour"
+msgstr "Per hora"
+
+msgctxt "field:calendar.todo.exrule,byminute:"
+msgid "By Minute"
+msgstr "Per minut"
+
+msgctxt "field:calendar.todo.exrule,bymonth:"
+msgid "By Month"
+msgstr "Per mes"
+
+msgctxt "field:calendar.todo.exrule,bymonthday:"
+msgid "By Month Day"
+msgstr "Per dia del mes"
+
+msgctxt "field:calendar.todo.exrule,bysecond:"
+msgid "By Second"
+msgstr "Per segon"
+
+msgctxt "field:calendar.todo.exrule,bysetpos:"
+msgid "By Position"
+msgstr "Per ubicació"
+
+msgctxt "field:calendar.todo.exrule,byweekno:"
+msgid "By Week Number"
+msgstr "Per número de la setmana"
+
+msgctxt "field:calendar.todo.exrule,byyearday:"
+msgid "By Year Day"
+msgstr "Per dia de l'any"
+
+msgctxt "field:calendar.todo.exrule,count:"
+msgid "Count"
+msgstr "Contador"
 
 msgctxt "field:calendar.todo.exrule,create_date:"
 msgid "Create Date"
@@ -286,10 +422,18 @@ msgctxt "field:calendar.todo.exrule,create_uid:"
 msgid "Create User"
 msgstr "Usuari creació"
 
+msgctxt "field:calendar.todo.exrule,freq:"
+msgid "Frequency"
+msgstr "Freqüència"
+
 msgctxt "field:calendar.todo.exrule,id:"
 msgid "ID"
 msgstr "ID"
 
+msgctxt "field:calendar.todo.exrule,interval:"
+msgid "Interval"
+msgstr "Intèrval"
+
 msgctxt "field:calendar.todo.exrule,rec_name:"
 msgid "Name"
 msgstr "Nom"
@@ -298,6 +442,18 @@ msgctxt "field:calendar.todo.exrule,todo:"
 msgid "Todo"
 msgstr "Tasca"
 
+msgctxt "field:calendar.todo.exrule,until:"
+msgid "Until Date"
+msgstr "Fins a la data"
+
+msgctxt "field:calendar.todo.exrule,until_date:"
+msgid "Is Date"
+msgstr "Es una data"
+
+msgctxt "field:calendar.todo.exrule,wkst:"
+msgid "Week Day"
+msgstr "Dia de la setmana"
+
 msgctxt "field:calendar.todo.exrule,write_date:"
 msgid "Write Date"
 msgstr "Data modificació"
@@ -306,10 +462,6 @@ msgctxt "field:calendar.todo.exrule,write_uid:"
 msgid "Write User"
 msgstr "Usuari modificació"
 
-msgctxt "field:calendar.todo.rdate,calendar_date:"
-msgid "Calendar Date"
-msgstr "Data calendari"
-
 msgctxt "field:calendar.todo.rdate,create_date:"
 msgid "Create Date"
 msgstr "Data creació"
@@ -318,6 +470,14 @@ msgctxt "field:calendar.todo.rdate,create_uid:"
 msgid "Create User"
 msgstr "Usuari creació"
 
+msgctxt "field:calendar.todo.rdate,date:"
+msgid "Is Date"
+msgstr "Es una data"
+
+msgctxt "field:calendar.todo.rdate,datetime:"
+msgid "Date"
+msgstr "Data"
+
 msgctxt "field:calendar.todo.rdate,id:"
 msgid "ID"
 msgstr "ID"
@@ -338,9 +498,45 @@ msgctxt "field:calendar.todo.rdate,write_uid:"
 msgid "Write User"
 msgstr "Usuari modificació"
 
-msgctxt "field:calendar.todo.rrule,calendar_rrule:"
-msgid "Calendar RRule"
-msgstr "Regla de recurrencia"
+msgctxt "field:calendar.todo.rrule,byday:"
+msgid "By Day"
+msgstr "Per dia"
+
+msgctxt "field:calendar.todo.rrule,byhour:"
+msgid "By Hour"
+msgstr "Per hora"
+
+msgctxt "field:calendar.todo.rrule,byminute:"
+msgid "By Minute"
+msgstr "Per minut"
+
+msgctxt "field:calendar.todo.rrule,bymonth:"
+msgid "By Month"
+msgstr "Per mes"
+
+msgctxt "field:calendar.todo.rrule,bymonthday:"
+msgid "By Month Day"
+msgstr "Per dia del mes"
+
+msgctxt "field:calendar.todo.rrule,bysecond:"
+msgid "By Second"
+msgstr "Per segon"
+
+msgctxt "field:calendar.todo.rrule,bysetpos:"
+msgid "By Position"
+msgstr "Per ubicació"
+
+msgctxt "field:calendar.todo.rrule,byweekno:"
+msgid "By Week Number"
+msgstr "Per número de la setmana"
+
+msgctxt "field:calendar.todo.rrule,byyearday:"
+msgid "By Year Day"
+msgstr "Per dia de l'any"
+
+msgctxt "field:calendar.todo.rrule,count:"
+msgid "Count"
+msgstr "Contador"
 
 msgctxt "field:calendar.todo.rrule,create_date:"
 msgid "Create Date"
@@ -350,10 +546,18 @@ msgctxt "field:calendar.todo.rrule,create_uid:"
 msgid "Create User"
 msgstr "Usuari creació"
 
+msgctxt "field:calendar.todo.rrule,freq:"
+msgid "Frequency"
+msgstr "Freqüència"
+
 msgctxt "field:calendar.todo.rrule,id:"
 msgid "ID"
 msgstr "ID"
 
+msgctxt "field:calendar.todo.rrule,interval:"
+msgid "Interval"
+msgstr "Intèrval"
+
 msgctxt "field:calendar.todo.rrule,rec_name:"
 msgid "Name"
 msgstr "Nom"
@@ -362,6 +566,18 @@ msgctxt "field:calendar.todo.rrule,todo:"
 msgid "Todo"
 msgstr "Tasca"
 
+msgctxt "field:calendar.todo.rrule,until:"
+msgid "Until Date"
+msgstr "Fins a la data"
+
+msgctxt "field:calendar.todo.rrule,until_date:"
+msgid "Is Date"
+msgstr "Es una data"
+
+msgctxt "field:calendar.todo.rrule,wkst:"
+msgid "Week Day"
+msgstr "Dia de la setmana"
+
 msgctxt "field:calendar.todo.rrule,write_date:"
 msgid "Write Date"
 msgstr "Data modificació"
@@ -374,6 +590,24 @@ msgctxt "help:calendar.todo,uuid:"
 msgid "Universally Unique Identifier"
 msgstr "Identificador universal únic"
 
+msgctxt "help:calendar.todo.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.todo.exrule,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 "help:calendar.todo.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 "help:calendar.todo.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.todo,name:"
 msgid "Todo"
 msgstr "Tasca"
@@ -430,10 +664,9 @@ msgctxt "selection:calendar.todo,classification:"
 msgid "Public"
 msgstr "Públic"
 
-#, fuzzy
 msgctxt "selection:calendar.todo,status:"
 msgid ""
-msgstr "Servidor"
+msgstr " "
 
 msgctxt "selection:calendar.todo,status:"
 msgid "Cancelled"
@@ -449,7 +682,143 @@ msgstr "En procés"
 
 msgctxt "selection:calendar.todo,status:"
 msgid "Needs-Action"
-msgstr "Necessita una acció"
+msgstr "Necessitat-Acció"
+
+msgctxt "selection:calendar.todo.attendee,status:"
+msgid ""
+msgstr " "
+
+msgctxt "selection:calendar.todo.attendee,status:"
+msgid "Accepted"
+msgstr "Acceptat"
+
+msgctxt "selection:calendar.todo.attendee,status:"
+msgid "Declined"
+msgstr "Refusar"
+
+msgctxt "selection:calendar.todo.attendee,status:"
+msgid "Delegated"
+msgstr "Delegar"
+
+msgctxt "selection:calendar.todo.attendee,status:"
+msgid "Needs Action"
+msgstr "Necessitat Acció"
+
+msgctxt "selection:calendar.todo.attendee,status:"
+msgid "Tentative"
+msgstr "Temptatiu"
+
+msgctxt "selection:calendar.todo.exrule,freq:"
+msgid "Daily"
+msgstr "Diariament"
+
+msgctxt "selection:calendar.todo.exrule,freq:"
+msgid "Hourly"
+msgstr "Cada hora"
+
+msgctxt "selection:calendar.todo.exrule,freq:"
+msgid "Minutely"
+msgstr "Cada minut"
+
+msgctxt "selection:calendar.todo.exrule,freq:"
+msgid "Monthly"
+msgstr "Mensualment"
+
+msgctxt "selection:calendar.todo.exrule,freq:"
+msgid "Secondly"
+msgstr "Cada segon"
+
+msgctxt "selection:calendar.todo.exrule,freq:"
+msgid "Weekly"
+msgstr "Setmanalment"
+
+msgctxt "selection:calendar.todo.exrule,freq:"
+msgid "Yearly"
+msgstr "Anualment"
+
+msgctxt "selection:calendar.todo.exrule,wkst:"
+msgid "Friday"
+msgstr "Divendres"
+
+msgctxt "selection:calendar.todo.exrule,wkst:"
+msgid "Monday"
+msgstr "Dilluns"
+
+msgctxt "selection:calendar.todo.exrule,wkst:"
+msgid "Saturday"
+msgstr "Dissabte"
+
+msgctxt "selection:calendar.todo.exrule,wkst:"
+msgid "Sunday"
+msgstr "Diumenge"
+
+msgctxt "selection:calendar.todo.exrule,wkst:"
+msgid "Thursday"
+msgstr "Dijous"
+
+msgctxt "selection:calendar.todo.exrule,wkst:"
+msgid "Tuesday"
+msgstr "Dimarts"
+
+msgctxt "selection:calendar.todo.exrule,wkst:"
+msgid "Wednesday"
+msgstr "Dimecres"
+
+msgctxt "selection:calendar.todo.rrule,freq:"
+msgid "Daily"
+msgstr "Diariament"
+
+msgctxt "selection:calendar.todo.rrule,freq:"
+msgid "Hourly"
+msgstr "Cada hora"
+
+msgctxt "selection:calendar.todo.rrule,freq:"
+msgid "Minutely"
+msgstr "Cada minut"
+
+msgctxt "selection:calendar.todo.rrule,freq:"
+msgid "Monthly"
+msgstr "Mensualment"
+
+msgctxt "selection:calendar.todo.rrule,freq:"
+msgid "Secondly"
+msgstr "Cada segon"
+
+msgctxt "selection:calendar.todo.rrule,freq:"
+msgid "Weekly"
+msgstr "Setmanalment"
+
+msgctxt "selection:calendar.todo.rrule,freq:"
+msgid "Yearly"
+msgstr "Anualment"
+
+msgctxt "selection:calendar.todo.rrule,wkst:"
+msgid "Friday"
+msgstr "Divendres"
+
+msgctxt "selection:calendar.todo.rrule,wkst:"
+msgid "Monday"
+msgstr "Dilluns"
+
+msgctxt "selection:calendar.todo.rrule,wkst:"
+msgid "Saturday"
+msgstr "Dissabte"
+
+msgctxt "selection:calendar.todo.rrule,wkst:"
+msgid "Sunday"
+msgstr "Diumenge"
+
+msgctxt "selection:calendar.todo.rrule,wkst:"
+msgid "Thursday"
+msgstr "Dijous"
+
+msgctxt "selection:calendar.todo.rrule,wkst:"
+msgid "Tuesday"
+msgstr "Dimarts"
+
+msgctxt "selection:calendar.todo.rrule,wkst:"
+msgid "Wednesday"
+msgstr "Dimecres"
 
 msgctxt "view:calendar.todo.attendee:"
 msgid "Attendee"
@@ -489,7 +858,7 @@ msgstr "Regla de recurrencia"
 
 msgctxt "view:calendar.todo.rrule:"
 msgid "Recurrence Rules"
-msgstr "Regles de recurrencia"
+msgstr "Regles de recurrència"
 
 msgctxt "view:calendar.todo:"
 msgid "Attendees"
@@ -508,10 +877,6 @@ msgid "Occurences"
 msgstr "Ocurrències"
 
 msgctxt "view:calendar.todo:"
-msgid "Recurrences"
-msgstr "Recurrencies"
-
-msgctxt "view:calendar.todo:"
 msgid "Todo"
 msgstr "Tasca"
 
diff --git a/locale/cs_CZ.po b/locale/cs_CZ.po
index 3b45346..cb26d50 100644
--- a/locale/cs_CZ.po
+++ b/locale/cs_CZ.po
@@ -2,12 +2,92 @@
 msgid ""
 msgstr "Content-Type: text/plain; charset=utf-8\n"
 
+msgctxt "error:calendar.todo.exrule:"
+msgid "Invalid \"By Day\" in recurrence rule \"%s\""
+msgstr ""
+
+msgctxt "error:calendar.todo.exrule:"
+msgid "Invalid \"By Hour\" in recurrence rule \"%s\""
+msgstr ""
+
+msgctxt "error:calendar.todo.exrule:"
+msgid "Invalid \"By Minute\" in recurrence rule \"%s\""
+msgstr ""
+
+msgctxt "error:calendar.todo.exrule:"
+msgid "Invalid \"By Month Day\" in recurrence rule \"%s\""
+msgstr ""
+
+msgctxt "error:calendar.todo.exrule:"
+msgid "Invalid \"By Month\" in recurrence rule \"%s\""
+msgstr ""
+
+msgctxt "error:calendar.todo.exrule:"
+msgid "Invalid \"By Position\" in recurrence rule \"%s\""
+msgstr ""
+
+msgctxt "error:calendar.todo.exrule:"
+msgid "Invalid \"By Second\" in recurrence rule \"%s\""
+msgstr ""
+
+msgctxt "error:calendar.todo.exrule:"
+msgid "Invalid \"By Week Number\" in recurrence rule \"%s\""
+msgstr ""
+
+msgctxt "error:calendar.todo.exrule:"
+msgid "Invalid \"By Year Day\" in recurrence rule \"%s\""
+msgstr ""
+
+msgctxt "error:calendar.todo.exrule:"
+msgid "Only one of \"until\" and \"count\" can be set."
+msgstr ""
+
+msgctxt "error:calendar.todo.rrule:"
+msgid "Invalid \"By Day\" in recurrence rule \"%s\""
+msgstr ""
+
+msgctxt "error:calendar.todo.rrule:"
+msgid "Invalid \"By Hour\" in recurrence rule \"%s\""
+msgstr ""
+
+msgctxt "error:calendar.todo.rrule:"
+msgid "Invalid \"By Minute\" in recurrence rule \"%s\""
+msgstr ""
+
+msgctxt "error:calendar.todo.rrule:"
+msgid "Invalid \"By Month Day\" in recurrence rule \"%s\""
+msgstr ""
+
+msgctxt "error:calendar.todo.rrule:"
+msgid "Invalid \"By Month\" in recurrence rule \"%s\""
+msgstr ""
+
+msgctxt "error:calendar.todo.rrule:"
+msgid "Invalid \"By Position\" in recurrence rule \"%s\""
+msgstr ""
+
+msgctxt "error:calendar.todo.rrule:"
+msgid "Invalid \"By Second\" in recurrence rule \"%s\""
+msgstr ""
+
+msgctxt "error:calendar.todo.rrule:"
+msgid "Invalid \"By Week Number\" in recurrence rule \"%s\""
+msgstr ""
+
+msgctxt "error:calendar.todo.rrule:"
+msgid "Invalid \"By Year Day\" in recurrence rule \"%s\""
+msgstr ""
+
+msgctxt "error:calendar.todo.rrule:"
+msgid "Only one of \"until\" and \"count\" can be set."
+msgstr ""
+
 msgctxt "error:calendar.todo:"
-msgid "Recurrence can not be recurrent!"
+msgid "Todo \"%s\" can not be recurrent."
 msgstr ""
 
 msgctxt "error:calendar.todo:"
-msgid "UUID and recurrence must be unique in a calendar!"
+msgid "UUID and recurrence must be unique in a calendar."
 msgstr ""
 
 msgctxt "field:calendar.todo,alarms:"
@@ -178,10 +258,6 @@ msgctxt "field:calendar.todo-calendar.category,write_uid:"
 msgid "Write User"
 msgstr ""
 
-msgctxt "field:calendar.todo.alarm,calendar_alarm:"
-msgid "Calendar Alarm"
-msgstr ""
-
 msgctxt "field:calendar.todo.alarm,create_date:"
 msgid "Create Date"
 msgstr ""
@@ -202,6 +278,10 @@ msgctxt "field:calendar.todo.alarm,todo:"
 msgid "Todo"
 msgstr ""
 
+msgctxt "field:calendar.todo.alarm,valarm:"
+msgid "valarm"
+msgstr ""
+
 msgctxt "field:calendar.todo.alarm,write_date:"
 msgid "Write Date"
 msgstr ""
@@ -210,8 +290,8 @@ msgctxt "field:calendar.todo.alarm,write_uid:"
 msgid "Write User"
 msgstr ""
 
-msgctxt "field:calendar.todo.attendee,calendar_attendee:"
-msgid "Calendar Attendee"
+msgctxt "field:calendar.todo.attendee,attendee:"
+msgid "attendee"
 msgstr ""
 
 msgctxt "field:calendar.todo.attendee,create_date:"
@@ -222,6 +302,10 @@ msgctxt "field:calendar.todo.attendee,create_uid:"
 msgid "Create User"
 msgstr ""
 
+msgctxt "field:calendar.todo.attendee,email:"
+msgid "Email"
+msgstr ""
+
 msgctxt "field:calendar.todo.attendee,id:"
 msgid "ID"
 msgstr ""
@@ -230,6 +314,10 @@ msgctxt "field:calendar.todo.attendee,rec_name:"
 msgid "Name"
 msgstr ""
 
+msgctxt "field:calendar.todo.attendee,status:"
+msgid "Participation Status"
+msgstr ""
+
 msgctxt "field:calendar.todo.attendee,todo:"
 msgid "Todo"
 msgstr ""
@@ -242,10 +330,6 @@ msgctxt "field:calendar.todo.attendee,write_uid:"
 msgid "Write User"
 msgstr ""
 
-msgctxt "field:calendar.todo.exdate,calendar_date:"
-msgid "Calendar Date"
-msgstr ""
-
 msgctxt "field:calendar.todo.exdate,create_date:"
 msgid "Create Date"
 msgstr ""
@@ -254,6 +338,14 @@ msgctxt "field:calendar.todo.exdate,create_uid:"
 msgid "Create User"
 msgstr ""
 
+msgctxt "field:calendar.todo.exdate,date:"
+msgid "Is Date"
+msgstr ""
+
+msgctxt "field:calendar.todo.exdate,datetime:"
+msgid "Date"
+msgstr ""
+
 msgctxt "field:calendar.todo.exdate,id:"
 msgid "ID"
 msgstr ""
@@ -274,8 +366,44 @@ msgctxt "field:calendar.todo.exdate,write_uid:"
 msgid "Write User"
 msgstr ""
 
-msgctxt "field:calendar.todo.exrule,calendar_rrule:"
-msgid "Calendar RRule"
+msgctxt "field:calendar.todo.exrule,byday:"
+msgid "By Day"
+msgstr ""
+
+msgctxt "field:calendar.todo.exrule,byhour:"
+msgid "By Hour"
+msgstr ""
+
+msgctxt "field:calendar.todo.exrule,byminute:"
+msgid "By Minute"
+msgstr ""
+
+msgctxt "field:calendar.todo.exrule,bymonth:"
+msgid "By Month"
+msgstr ""
+
+msgctxt "field:calendar.todo.exrule,bymonthday:"
+msgid "By Month Day"
+msgstr ""
+
+msgctxt "field:calendar.todo.exrule,bysecond:"
+msgid "By Second"
+msgstr ""
+
+msgctxt "field:calendar.todo.exrule,bysetpos:"
+msgid "By Position"
+msgstr ""
+
+msgctxt "field:calendar.todo.exrule,byweekno:"
+msgid "By Week Number"
+msgstr ""
+
+msgctxt "field:calendar.todo.exrule,byyearday:"
+msgid "By Year Day"
+msgstr ""
+
+msgctxt "field:calendar.todo.exrule,count:"
+msgid "Count"
 msgstr ""
 
 msgctxt "field:calendar.todo.exrule,create_date:"
@@ -286,10 +414,18 @@ msgctxt "field:calendar.todo.exrule,create_uid:"
 msgid "Create User"
 msgstr ""
 
+msgctxt "field:calendar.todo.exrule,freq:"
+msgid "Frequency"
+msgstr ""
+
 msgctxt "field:calendar.todo.exrule,id:"
 msgid "ID"
 msgstr ""
 
+msgctxt "field:calendar.todo.exrule,interval:"
+msgid "Interval"
+msgstr ""
+
 msgctxt "field:calendar.todo.exrule,rec_name:"
 msgid "Name"
 msgstr ""
@@ -298,6 +434,18 @@ msgctxt "field:calendar.todo.exrule,todo:"
 msgid "Todo"
 msgstr ""
 
+msgctxt "field:calendar.todo.exrule,until:"
+msgid "Until Date"
+msgstr ""
+
+msgctxt "field:calendar.todo.exrule,until_date:"
+msgid "Is Date"
+msgstr ""
+
+msgctxt "field:calendar.todo.exrule,wkst:"
+msgid "Week Day"
+msgstr ""
+
 msgctxt "field:calendar.todo.exrule,write_date:"
 msgid "Write Date"
 msgstr ""
@@ -306,10 +454,6 @@ msgctxt "field:calendar.todo.exrule,write_uid:"
 msgid "Write User"
 msgstr ""
 
-msgctxt "field:calendar.todo.rdate,calendar_date:"
-msgid "Calendar Date"
-msgstr ""
-
 msgctxt "field:calendar.todo.rdate,create_date:"
 msgid "Create Date"
 msgstr ""
@@ -318,6 +462,14 @@ msgctxt "field:calendar.todo.rdate,create_uid:"
 msgid "Create User"
 msgstr ""
 
+msgctxt "field:calendar.todo.rdate,date:"
+msgid "Is Date"
+msgstr ""
+
+msgctxt "field:calendar.todo.rdate,datetime:"
+msgid "Date"
+msgstr ""
+
 msgctxt "field:calendar.todo.rdate,id:"
 msgid "ID"
 msgstr ""
@@ -338,8 +490,44 @@ msgctxt "field:calendar.todo.rdate,write_uid:"
 msgid "Write User"
 msgstr ""
 
-msgctxt "field:calendar.todo.rrule,calendar_rrule:"
-msgid "Calendar RRule"
+msgctxt "field:calendar.todo.rrule,byday:"
+msgid "By Day"
+msgstr ""
+
+msgctxt "field:calendar.todo.rrule,byhour:"
+msgid "By Hour"
+msgstr ""
+
+msgctxt "field:calendar.todo.rrule,byminute:"
+msgid "By Minute"
+msgstr ""
+
+msgctxt "field:calendar.todo.rrule,bymonth:"
+msgid "By Month"
+msgstr ""
+
+msgctxt "field:calendar.todo.rrule,bymonthday:"
+msgid "By Month Day"
+msgstr ""
+
+msgctxt "field:calendar.todo.rrule,bysecond:"
+msgid "By Second"
+msgstr ""
+
+msgctxt "field:calendar.todo.rrule,bysetpos:"
+msgid "By Position"
+msgstr ""
+
+msgctxt "field:calendar.todo.rrule,byweekno:"
+msgid "By Week Number"
+msgstr ""
+
+msgctxt "field:calendar.todo.rrule,byyearday:"
+msgid "By Year Day"
+msgstr ""
+
+msgctxt "field:calendar.todo.rrule,count:"
+msgid "Count"
 msgstr ""
 
 msgctxt "field:calendar.todo.rrule,create_date:"
@@ -350,10 +538,18 @@ msgctxt "field:calendar.todo.rrule,create_uid:"
 msgid "Create User"
 msgstr ""
 
+msgctxt "field:calendar.todo.rrule,freq:"
+msgid "Frequency"
+msgstr ""
+
 msgctxt "field:calendar.todo.rrule,id:"
 msgid "ID"
 msgstr ""
 
+msgctxt "field:calendar.todo.rrule,interval:"
+msgid "Interval"
+msgstr ""
+
 msgctxt "field:calendar.todo.rrule,rec_name:"
 msgid "Name"
 msgstr ""
@@ -362,6 +558,18 @@ msgctxt "field:calendar.todo.rrule,todo:"
 msgid "Todo"
 msgstr ""
 
+msgctxt "field:calendar.todo.rrule,until:"
+msgid "Until Date"
+msgstr ""
+
+msgctxt "field:calendar.todo.rrule,until_date:"
+msgid "Is Date"
+msgstr ""
+
+msgctxt "field:calendar.todo.rrule,wkst:"
+msgid "Week Day"
+msgstr ""
+
 msgctxt "field:calendar.todo.rrule,write_date:"
 msgid "Write Date"
 msgstr ""
@@ -374,6 +582,22 @@ msgctxt "help:calendar.todo,uuid:"
 msgid "Universally Unique Identifier"
 msgstr ""
 
+msgctxt "help:calendar.todo.exdate,date:"
+msgid "Ignore time of field \"Date\", but handle as date only."
+msgstr ""
+
+msgctxt "help:calendar.todo.exrule,until_date:"
+msgid "Ignore time of field \"Until Date\", but handle as date only."
+msgstr ""
+
+msgctxt "help:calendar.todo.rdate,date:"
+msgid "Ignore time of field \"Date\", but handle as date only."
+msgstr ""
+
+msgctxt "help:calendar.todo.rrule,until_date:"
+msgid "Ignore time of field \"Until Date\", but handle as date only."
+msgstr ""
+
 msgctxt "model:calendar.todo,name:"
 msgid "Todo"
 msgstr ""
@@ -450,6 +674,142 @@ msgctxt "selection:calendar.todo,status:"
 msgid "Needs-Action"
 msgstr ""
 
+msgctxt "selection:calendar.todo.attendee,status:"
+msgid ""
+msgstr ""
+
+msgctxt "selection:calendar.todo.attendee,status:"
+msgid "Accepted"
+msgstr ""
+
+msgctxt "selection:calendar.todo.attendee,status:"
+msgid "Declined"
+msgstr ""
+
+msgctxt "selection:calendar.todo.attendee,status:"
+msgid "Delegated"
+msgstr ""
+
+msgctxt "selection:calendar.todo.attendee,status:"
+msgid "Needs Action"
+msgstr ""
+
+msgctxt "selection:calendar.todo.attendee,status:"
+msgid "Tentative"
+msgstr ""
+
+msgctxt "selection:calendar.todo.exrule,freq:"
+msgid "Daily"
+msgstr ""
+
+msgctxt "selection:calendar.todo.exrule,freq:"
+msgid "Hourly"
+msgstr ""
+
+msgctxt "selection:calendar.todo.exrule,freq:"
+msgid "Minutely"
+msgstr ""
+
+msgctxt "selection:calendar.todo.exrule,freq:"
+msgid "Monthly"
+msgstr ""
+
+msgctxt "selection:calendar.todo.exrule,freq:"
+msgid "Secondly"
+msgstr ""
+
+msgctxt "selection:calendar.todo.exrule,freq:"
+msgid "Weekly"
+msgstr ""
+
+msgctxt "selection:calendar.todo.exrule,freq:"
+msgid "Yearly"
+msgstr ""
+
+msgctxt "selection:calendar.todo.exrule,wkst:"
+msgid "Friday"
+msgstr ""
+
+msgctxt "selection:calendar.todo.exrule,wkst:"
+msgid "Monday"
+msgstr ""
+
+msgctxt "selection:calendar.todo.exrule,wkst:"
+msgid "Saturday"
+msgstr ""
+
+msgctxt "selection:calendar.todo.exrule,wkst:"
+msgid "Sunday"
+msgstr ""
+
+msgctxt "selection:calendar.todo.exrule,wkst:"
+msgid "Thursday"
+msgstr ""
+
+msgctxt "selection:calendar.todo.exrule,wkst:"
+msgid "Tuesday"
+msgstr ""
+
+msgctxt "selection:calendar.todo.exrule,wkst:"
+msgid "Wednesday"
+msgstr ""
+
+msgctxt "selection:calendar.todo.rrule,freq:"
+msgid "Daily"
+msgstr ""
+
+msgctxt "selection:calendar.todo.rrule,freq:"
+msgid "Hourly"
+msgstr ""
+
+msgctxt "selection:calendar.todo.rrule,freq:"
+msgid "Minutely"
+msgstr ""
+
+msgctxt "selection:calendar.todo.rrule,freq:"
+msgid "Monthly"
+msgstr ""
+
+msgctxt "selection:calendar.todo.rrule,freq:"
+msgid "Secondly"
+msgstr ""
+
+msgctxt "selection:calendar.todo.rrule,freq:"
+msgid "Weekly"
+msgstr ""
+
+msgctxt "selection:calendar.todo.rrule,freq:"
+msgid "Yearly"
+msgstr ""
+
+msgctxt "selection:calendar.todo.rrule,wkst:"
+msgid "Friday"
+msgstr ""
+
+msgctxt "selection:calendar.todo.rrule,wkst:"
+msgid "Monday"
+msgstr ""
+
+msgctxt "selection:calendar.todo.rrule,wkst:"
+msgid "Saturday"
+msgstr ""
+
+msgctxt "selection:calendar.todo.rrule,wkst:"
+msgid "Sunday"
+msgstr ""
+
+msgctxt "selection:calendar.todo.rrule,wkst:"
+msgid "Thursday"
+msgstr ""
+
+msgctxt "selection:calendar.todo.rrule,wkst:"
+msgid "Tuesday"
+msgstr ""
+
+msgctxt "selection:calendar.todo.rrule,wkst:"
+msgid "Wednesday"
+msgstr ""
+
 msgctxt "view:calendar.todo.attendee:"
 msgid "Attendee"
 msgstr ""
diff --git a/locale/de_DE.po b/locale/de_DE.po
index 5e40432..6f718d0 100644
--- a/locale/de_DE.po
+++ b/locale/de_DE.po
@@ -2,15 +2,94 @@
 msgid ""
 msgstr "Content-Type: text/plain; charset=utf-8\n"
 
+msgctxt "error:calendar.todo.exrule:"
+msgid "Invalid \"By Day\" in recurrence rule \"%s\""
+msgstr "Ungültiger Eintrag in \"Für Tag\" in Wiederholungsregel \"%s\""
+
+msgctxt "error:calendar.todo.exrule:"
+msgid "Invalid \"By Hour\" in recurrence rule \"%s\""
+msgstr "Ungültiger Eintrag in \"Für Stunde\" in Wiederholungsregel \"%s\""
+
+msgctxt "error:calendar.todo.exrule:"
+msgid "Invalid \"By Minute\" in recurrence rule \"%s\""
+msgstr "Ungültiger Eintrag in \"Für Minute\" in Wiederholungsregel \"%s\""
+
+msgctxt "error:calendar.todo.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.todo.exrule:"
+msgid "Invalid \"By Month\" in recurrence rule \"%s\""
+msgstr "Ungültiger Eintrag in \"Für Monat\" in Wiederholungsregel \"%s\""
+
+msgctxt "error:calendar.todo.exrule:"
+msgid "Invalid \"By Position\" in recurrence rule \"%s\""
+msgstr "Ungültiger Eintrag in \"Für Position\" in Wiederholungsregel \"%s\""
+
+msgctxt "error:calendar.todo.exrule:"
+msgid "Invalid \"By Second\" in recurrence rule \"%s\""
+msgstr "Ungültiger Eintrag in \"Für Sekunde\" in Wiederholungsregel \"%s\""
+
+msgctxt "error:calendar.todo.exrule:"
+msgid "Invalid \"By Week Number\" in recurrence rule \"%s\""
+msgstr "Ungültiger Eintrag in \"Für Wochennummer\" in Wiederholungsregel \"%s\""
+
+msgctxt "error:calendar.todo.exrule:"
+msgid "Invalid \"By Year Day\" in recurrence rule \"%s\""
+msgstr "Ungültiger Eintrag in \"Für Tag des Jahres\" in Wiederholungsregel \"%s\""
+
+msgctxt "error:calendar.todo.exrule:"
+msgid "Only one of \"until\" and \"count\" can be set."
+msgstr "Es kann nur eine der Optionen \"Bis\" oder \"Anzahl\" gesetzt werden."
+
+msgctxt "error:calendar.todo.rrule:"
+msgid "Invalid \"By Day\" in recurrence rule \"%s\""
+msgstr "Ungültiger Eintrag in \"Für Tag\" in Wiederholungsregel \"%s\""
+
+msgctxt "error:calendar.todo.rrule:"
+msgid "Invalid \"By Hour\" in recurrence rule \"%s\""
+msgstr "Ungültiger Eintrag in \"Für Stunde\" in Wiederholungsregel \"%s\""
+
+msgctxt "error:calendar.todo.rrule:"
+msgid "Invalid \"By Minute\" in recurrence rule \"%s\""
+msgstr "Ungültiger Eintrag in \"Für Minute\" in Wiederholungsregel \"%s\""
+
+msgctxt "error:calendar.todo.rrule:"
+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.todo.rrule:"
+msgid "Invalid \"By Month\" in recurrence rule \"%s\""
+msgstr "Ungültiger Eintrag in \"Für Monat\" in Wiederholungsregel \"%s\""
+
+msgctxt "error:calendar.todo.rrule:"
+msgid "Invalid \"By Position\" in recurrence rule \"%s\""
+msgstr "Ungültiger Eintrag in \"Für Position\" in Wiederholungsregel \"%s\""
+
+msgctxt "error:calendar.todo.rrule:"
+msgid "Invalid \"By Second\" in recurrence rule \"%s\""
+msgstr "Ungültiger Eintrag in \"Für Sekunde\" in Wiederholungsregel \"%s\""
+
+msgctxt "error:calendar.todo.rrule:"
+msgid "Invalid \"By Week Number\" in recurrence rule \"%s\""
+msgstr "Ungültiger Eintrag in \"Für Wochennummer\" in Wiederholungsregel \"%s\""
+
+msgctxt "error:calendar.todo.rrule:"
+msgid "Invalid \"By Year Day\" in recurrence rule \"%s\""
+msgstr "Ungültiger Eintrag in \"Für Tag des Jahres\" in Wiederholungsregel \"%s\""
+
+msgctxt "error:calendar.todo.rrule:"
+msgid "Only one of \"until\" and \"count\" can be set."
+msgstr "Es kann nur eine der Optionen \"Bis\" oder \"Anzahl\" gesetzt werden."
+
 msgctxt "error:calendar.todo:"
-msgid "Recurrence can not be recurrent!"
-msgstr "Wiederholungen können nicht rekursiv sein!"
+msgid "Todo \"%s\" can not be recurrent."
+msgstr "Aufgabe \"%s\" ist nicht wiederholbar."
 
 msgctxt "error:calendar.todo:"
-msgid "UUID and recurrence must be unique in a calendar!"
+msgid "UUID and recurrence must be unique in a calendar."
 msgstr ""
-"UUID und Wiederholung können in einem Kalender nicht mehrfach vergeben "
-"werden!"
+"UUID und Wiederholung können in einem Kalender nur einmal vergeben werden."
 
 msgctxt "field:calendar.todo,alarms:"
 msgid "Alarms"
@@ -180,10 +259,6 @@ msgctxt "field:calendar.todo-calendar.category,write_uid:"
 msgid "Write User"
 msgstr "Letzte Änderung durch"
 
-msgctxt "field:calendar.todo.alarm,calendar_alarm:"
-msgid "Calendar Alarm"
-msgstr "Kalender Alarm"
-
 msgctxt "field:calendar.todo.alarm,create_date:"
 msgid "Create Date"
 msgstr "Erstellungsdatum"
@@ -204,6 +279,10 @@ msgctxt "field:calendar.todo.alarm,todo:"
 msgid "Todo"
 msgstr "Aufgabe"
 
+msgctxt "field:calendar.todo.alarm,valarm:"
+msgid "valarm"
+msgstr ""
+
 msgctxt "field:calendar.todo.alarm,write_date:"
 msgid "Write Date"
 msgstr "Zuletzt geändert"
@@ -212,9 +291,9 @@ msgctxt "field:calendar.todo.alarm,write_uid:"
 msgid "Write User"
 msgstr "Letzte Änderung durch"
 
-msgctxt "field:calendar.todo.attendee,calendar_attendee:"
-msgid "Calendar Attendee"
-msgstr "Kalender Teilnehmer"
+msgctxt "field:calendar.todo.attendee,attendee:"
+msgid "attendee"
+msgstr "Teilnehmer"
 
 msgctxt "field:calendar.todo.attendee,create_date:"
 msgid "Create Date"
@@ -224,6 +303,10 @@ msgctxt "field:calendar.todo.attendee,create_uid:"
 msgid "Create User"
 msgstr "Erstellt durch"
 
+msgctxt "field:calendar.todo.attendee,email:"
+msgid "Email"
+msgstr "E-Mail"
+
 msgctxt "field:calendar.todo.attendee,id:"
 msgid "ID"
 msgstr "ID"
@@ -232,6 +315,10 @@ msgctxt "field:calendar.todo.attendee,rec_name:"
 msgid "Name"
 msgstr "Name"
 
+msgctxt "field:calendar.todo.attendee,status:"
+msgid "Participation Status"
+msgstr "Teilnahmestatus"
+
 msgctxt "field:calendar.todo.attendee,todo:"
 msgid "Todo"
 msgstr "Aufgabe"
@@ -244,10 +331,6 @@ msgctxt "field:calendar.todo.attendee,write_uid:"
 msgid "Write User"
 msgstr "Letzte Änderung durch"
 
-msgctxt "field:calendar.todo.exdate,calendar_date:"
-msgid "Calendar Date"
-msgstr "Kalender Datum"
-
 msgctxt "field:calendar.todo.exdate,create_date:"
 msgid "Create Date"
 msgstr "Erstellungsdatum"
@@ -256,6 +339,14 @@ msgctxt "field:calendar.todo.exdate,create_uid:"
 msgid "Create User"
 msgstr "Erstellt durch"
 
+msgctxt "field:calendar.todo.exdate,date:"
+msgid "Is Date"
+msgstr "Als Datum"
+
+msgctxt "field:calendar.todo.exdate,datetime:"
+msgid "Date"
+msgstr "Zeitpunkt"
+
 msgctxt "field:calendar.todo.exdate,id:"
 msgid "ID"
 msgstr "ID"
@@ -276,9 +367,45 @@ msgctxt "field:calendar.todo.exdate,write_uid:"
 msgid "Write User"
 msgstr "Letzte Änderung durch"
 
-msgctxt "field:calendar.todo.exrule,calendar_rrule:"
-msgid "Calendar RRule"
-msgstr "Kalender WRegel"
+msgctxt "field:calendar.todo.exrule,byday:"
+msgid "By Day"
+msgstr "Für Tag"
+
+msgctxt "field:calendar.todo.exrule,byhour:"
+msgid "By Hour"
+msgstr "Für Stunde"
+
+msgctxt "field:calendar.todo.exrule,byminute:"
+msgid "By Minute"
+msgstr "Für Minute"
+
+msgctxt "field:calendar.todo.exrule,bymonth:"
+msgid "By Month"
+msgstr "Für Monat"
+
+msgctxt "field:calendar.todo.exrule,bymonthday:"
+msgid "By Month Day"
+msgstr "Für Tag des Monats"
+
+msgctxt "field:calendar.todo.exrule,bysecond:"
+msgid "By Second"
+msgstr "Für Sekunde"
+
+msgctxt "field:calendar.todo.exrule,bysetpos:"
+msgid "By Position"
+msgstr "Für Position"
+
+msgctxt "field:calendar.todo.exrule,byweekno:"
+msgid "By Week Number"
+msgstr "Für Wochennummer"
+
+msgctxt "field:calendar.todo.exrule,byyearday:"
+msgid "By Year Day"
+msgstr "Für Tag des Jahres"
+
+msgctxt "field:calendar.todo.exrule,count:"
+msgid "Count"
+msgstr "Anzahl"
 
 msgctxt "field:calendar.todo.exrule,create_date:"
 msgid "Create Date"
@@ -288,10 +415,18 @@ msgctxt "field:calendar.todo.exrule,create_uid:"
 msgid "Create User"
 msgstr "Erstellt durch"
 
+msgctxt "field:calendar.todo.exrule,freq:"
+msgid "Frequency"
+msgstr "Häufigkeit"
+
 msgctxt "field:calendar.todo.exrule,id:"
 msgid "ID"
 msgstr "ID"
 
+msgctxt "field:calendar.todo.exrule,interval:"
+msgid "Interval"
+msgstr "Intervall"
+
 msgctxt "field:calendar.todo.exrule,rec_name:"
 msgid "Name"
 msgstr "Name"
@@ -300,6 +435,18 @@ msgctxt "field:calendar.todo.exrule,todo:"
 msgid "Todo"
 msgstr "Aufgabe"
 
+msgctxt "field:calendar.todo.exrule,until:"
+msgid "Until Date"
+msgstr "Bis Datum"
+
+msgctxt "field:calendar.todo.exrule,until_date:"
+msgid "Is Date"
+msgstr "Als Datum"
+
+msgctxt "field:calendar.todo.exrule,wkst:"
+msgid "Week Day"
+msgstr "Wochentag"
+
 msgctxt "field:calendar.todo.exrule,write_date:"
 msgid "Write Date"
 msgstr "Zuletzt geändert"
@@ -308,10 +455,6 @@ msgctxt "field:calendar.todo.exrule,write_uid:"
 msgid "Write User"
 msgstr "Letzte Änderung durch"
 
-msgctxt "field:calendar.todo.rdate,calendar_date:"
-msgid "Calendar Date"
-msgstr "Kalender Datum"
-
 msgctxt "field:calendar.todo.rdate,create_date:"
 msgid "Create Date"
 msgstr "Erstellungsdatum"
@@ -320,6 +463,14 @@ msgctxt "field:calendar.todo.rdate,create_uid:"
 msgid "Create User"
 msgstr "Erstellt durch"
 
+msgctxt "field:calendar.todo.rdate,date:"
+msgid "Is Date"
+msgstr "Als Datum"
+
+msgctxt "field:calendar.todo.rdate,datetime:"
+msgid "Date"
+msgstr "Zeitpunkt"
+
 msgctxt "field:calendar.todo.rdate,id:"
 msgid "ID"
 msgstr "ID"
@@ -340,9 +491,45 @@ msgctxt "field:calendar.todo.rdate,write_uid:"
 msgid "Write User"
 msgstr "Letzte Änderung durch"
 
-msgctxt "field:calendar.todo.rrule,calendar_rrule:"
-msgid "Calendar RRule"
-msgstr "Kalender WRegel"
+msgctxt "field:calendar.todo.rrule,byday:"
+msgid "By Day"
+msgstr "Für Tag"
+
+msgctxt "field:calendar.todo.rrule,byhour:"
+msgid "By Hour"
+msgstr "Für Stunde"
+
+msgctxt "field:calendar.todo.rrule,byminute:"
+msgid "By Minute"
+msgstr "Für Minute"
+
+msgctxt "field:calendar.todo.rrule,bymonth:"
+msgid "By Month"
+msgstr "Für Monat"
+
+msgctxt "field:calendar.todo.rrule,bymonthday:"
+msgid "By Month Day"
+msgstr "Für Tag des Monats"
+
+msgctxt "field:calendar.todo.rrule,bysecond:"
+msgid "By Second"
+msgstr "Für Sekunde"
+
+msgctxt "field:calendar.todo.rrule,bysetpos:"
+msgid "By Position"
+msgstr "Für Position"
+
+msgctxt "field:calendar.todo.rrule,byweekno:"
+msgid "By Week Number"
+msgstr "Für Wochennummer"
+
+msgctxt "field:calendar.todo.rrule,byyearday:"
+msgid "By Year Day"
+msgstr "Für Tag des Jahres"
+
+msgctxt "field:calendar.todo.rrule,count:"
+msgid "Count"
+msgstr "Anzahl"
 
 msgctxt "field:calendar.todo.rrule,create_date:"
 msgid "Create Date"
@@ -352,10 +539,18 @@ msgctxt "field:calendar.todo.rrule,create_uid:"
 msgid "Create User"
 msgstr "Erstellt durch"
 
+msgctxt "field:calendar.todo.rrule,freq:"
+msgid "Frequency"
+msgstr "Häufigkeit"
+
 msgctxt "field:calendar.todo.rrule,id:"
 msgid "ID"
 msgstr "ID"
 
+msgctxt "field:calendar.todo.rrule,interval:"
+msgid "Interval"
+msgstr "Intervall"
+
 msgctxt "field:calendar.todo.rrule,rec_name:"
 msgid "Name"
 msgstr "Name"
@@ -364,6 +559,18 @@ msgctxt "field:calendar.todo.rrule,todo:"
 msgid "Todo"
 msgstr "Aufgabe"
 
+msgctxt "field:calendar.todo.rrule,until:"
+msgid "Until Date"
+msgstr "Bis Datum"
+
+msgctxt "field:calendar.todo.rrule,until_date:"
+msgid "Is Date"
+msgstr "Als Datum"
+
+msgctxt "field:calendar.todo.rrule,wkst:"
+msgid "Week Day"
+msgstr "Wochentag"
+
 msgctxt "field:calendar.todo.rrule,write_date:"
 msgid "Write Date"
 msgstr "Zuletzt geändert"
@@ -376,6 +583,30 @@ msgctxt "help:calendar.todo,uuid:"
 msgid "Universally Unique Identifier"
 msgstr "Universally Unique Identifier"
 
+msgctxt "help:calendar.todo.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.todo.exrule,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 "help:calendar.todo.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 "help:calendar.todo.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.todo,name:"
 msgid "Todo"
 msgstr "Aufgabe"
@@ -452,6 +683,142 @@ msgctxt "selection:calendar.todo,status:"
 msgid "Needs-Action"
 msgstr "Benötigt Eingriff"
 
+msgctxt "selection:calendar.todo.attendee,status:"
+msgid ""
+msgstr ""
+
+msgctxt "selection:calendar.todo.attendee,status:"
+msgid "Accepted"
+msgstr "Bestätigt"
+
+msgctxt "selection:calendar.todo.attendee,status:"
+msgid "Declined"
+msgstr "Abgelehnt"
+
+msgctxt "selection:calendar.todo.attendee,status:"
+msgid "Delegated"
+msgstr "Delegiert"
+
+msgctxt "selection:calendar.todo.attendee,status:"
+msgid "Needs Action"
+msgstr "Benötigt Eingriff"
+
+msgctxt "selection:calendar.todo.attendee,status:"
+msgid "Tentative"
+msgstr "Unter Vorbehalt"
+
+msgctxt "selection:calendar.todo.exrule,freq:"
+msgid "Daily"
+msgstr "Täglich"
+
+msgctxt "selection:calendar.todo.exrule,freq:"
+msgid "Hourly"
+msgstr "Stündlich"
+
+msgctxt "selection:calendar.todo.exrule,freq:"
+msgid "Minutely"
+msgstr "Minütlich"
+
+msgctxt "selection:calendar.todo.exrule,freq:"
+msgid "Monthly"
+msgstr "Monatlich"
+
+msgctxt "selection:calendar.todo.exrule,freq:"
+msgid "Secondly"
+msgstr "Sekündlich"
+
+msgctxt "selection:calendar.todo.exrule,freq:"
+msgid "Weekly"
+msgstr "Wöchentlich"
+
+msgctxt "selection:calendar.todo.exrule,freq:"
+msgid "Yearly"
+msgstr "Jährlich"
+
+msgctxt "selection:calendar.todo.exrule,wkst:"
+msgid "Friday"
+msgstr "Freitag"
+
+msgctxt "selection:calendar.todo.exrule,wkst:"
+msgid "Monday"
+msgstr "Montag"
+
+msgctxt "selection:calendar.todo.exrule,wkst:"
+msgid "Saturday"
+msgstr "Samstag"
+
+msgctxt "selection:calendar.todo.exrule,wkst:"
+msgid "Sunday"
+msgstr "Sonntag"
+
+msgctxt "selection:calendar.todo.exrule,wkst:"
+msgid "Thursday"
+msgstr "Donnerstag"
+
+msgctxt "selection:calendar.todo.exrule,wkst:"
+msgid "Tuesday"
+msgstr "Dienstag"
+
+msgctxt "selection:calendar.todo.exrule,wkst:"
+msgid "Wednesday"
+msgstr "Mittwoch"
+
+msgctxt "selection:calendar.todo.rrule,freq:"
+msgid "Daily"
+msgstr "Täglich"
+
+msgctxt "selection:calendar.todo.rrule,freq:"
+msgid "Hourly"
+msgstr "Stündlich"
+
+msgctxt "selection:calendar.todo.rrule,freq:"
+msgid "Minutely"
+msgstr "Minütlich"
+
+msgctxt "selection:calendar.todo.rrule,freq:"
+msgid "Monthly"
+msgstr "Monatlich"
+
+msgctxt "selection:calendar.todo.rrule,freq:"
+msgid "Secondly"
+msgstr "Sekündlich"
+
+msgctxt "selection:calendar.todo.rrule,freq:"
+msgid "Weekly"
+msgstr "Wöchentlich"
+
+msgctxt "selection:calendar.todo.rrule,freq:"
+msgid "Yearly"
+msgstr "Jährlich"
+
+msgctxt "selection:calendar.todo.rrule,wkst:"
+msgid "Friday"
+msgstr "Freitag"
+
+msgctxt "selection:calendar.todo.rrule,wkst:"
+msgid "Monday"
+msgstr "Montag"
+
+msgctxt "selection:calendar.todo.rrule,wkst:"
+msgid "Saturday"
+msgstr "Samstag"
+
+msgctxt "selection:calendar.todo.rrule,wkst:"
+msgid "Sunday"
+msgstr "Sonntag"
+
+msgctxt "selection:calendar.todo.rrule,wkst:"
+msgid "Thursday"
+msgstr "Donnerstag"
+
+msgctxt "selection:calendar.todo.rrule,wkst:"
+msgid "Tuesday"
+msgstr "Dienstag"
+
+msgctxt "selection:calendar.todo.rrule,wkst:"
+msgid "Wednesday"
+msgstr "Mittwoch"
+
 msgctxt "view:calendar.todo.attendee:"
 msgid "Attendee"
 msgstr "Teilnehmer"
@@ -509,10 +876,6 @@ msgid "Occurences"
 msgstr "Ereignisse"
 
 msgctxt "view:calendar.todo:"
-msgid "Recurrences"
-msgstr "Wiederholungen"
-
-msgctxt "view:calendar.todo:"
 msgid "Todo"
 msgstr "Aufgabe"
 
diff --git a/locale/es_AR.po b/locale/es_AR.po
index e03cc96..8c96a51 100644
--- a/locale/es_AR.po
+++ b/locale/es_AR.po
@@ -2,13 +2,105 @@
 msgid ""
 msgstr "Content-Type: text/plain; charset=utf-8\n"
 
+msgctxt "error:calendar.todo.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.todo.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.todo.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.todo.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.todo.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.todo.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.todo.exrule:"
+msgid "Invalid \"By Second\" in recurrence rule \"%s\""
+msgstr ""
+"El campo «Por segundo» de la regla de recurrencia «%s» no es correcto."
+
+msgctxt "error:calendar.todo.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 "error:calendar.todo.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 "error:calendar.todo.exrule:"
+msgid "Only one of \"until\" and \"count\" can be set."
+msgstr "Sólo un «hasta» y «contador» puede ser definido."
+
+msgctxt "error:calendar.todo.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 "error:calendar.todo.rrule:"
+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.todo.rrule:"
+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.todo.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 "error:calendar.todo.rrule:"
+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.todo.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 "error:calendar.todo.rrule:"
+msgid "Invalid \"By Second\" in recurrence rule \"%s\""
+msgstr ""
+"El campo «Por segundo» de la regla de recurrencia «%s» no es correcto."
+
+msgctxt "error:calendar.todo.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 "error:calendar.todo.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 "error:calendar.todo.rrule:"
+msgid "Only one of \"until\" and \"count\" can be set."
+msgstr "Sólo un «hasta» y «contador» puede ser definido."
+
 msgctxt "error:calendar.todo:"
-msgid "Recurrence can not be recurrent!"
-msgstr "¡Una recurrencia no puede ser recurrente!"
+msgid "Todo \"%s\" can not be recurrent."
+msgstr "La tarea «%s» no puede ser recurrente."
 
 msgctxt "error:calendar.todo:"
-msgid "UUID and recurrence must be unique in a calendar!"
-msgstr "¡UUID y recurrencia deben ser únicos en un calendario!"
+msgid "UUID and recurrence must be unique in a calendar."
+msgstr "UUID y la recurrencia deben ser únicos en el calendario."
 
 msgctxt "field:calendar.todo,alarms:"
 msgid "Alarms"
@@ -178,10 +270,6 @@ msgctxt "field:calendar.todo-calendar.category,write_uid:"
 msgid "Write User"
 msgstr "Usuario modificación"
 
-msgctxt "field:calendar.todo.alarm,calendar_alarm:"
-msgid "Calendar Alarm"
-msgstr "Alarma del calendario"
-
 msgctxt "field:calendar.todo.alarm,create_date:"
 msgid "Create Date"
 msgstr "Fecha creación"
@@ -202,6 +290,10 @@ msgctxt "field:calendar.todo.alarm,todo:"
 msgid "Todo"
 msgstr "Tarea"
 
+msgctxt "field:calendar.todo.alarm,valarm:"
+msgid "valarm"
+msgstr "valarm"
+
 msgctxt "field:calendar.todo.alarm,write_date:"
 msgid "Write Date"
 msgstr "Fecha modificación"
@@ -210,9 +302,9 @@ msgctxt "field:calendar.todo.alarm,write_uid:"
 msgid "Write User"
 msgstr "Usuario modificación"
 
-msgctxt "field:calendar.todo.attendee,calendar_attendee:"
-msgid "Calendar Attendee"
-msgstr "Calendario de asistentes"
+msgctxt "field:calendar.todo.attendee,attendee:"
+msgid "attendee"
+msgstr "asistente"
 
 msgctxt "field:calendar.todo.attendee,create_date:"
 msgid "Create Date"
@@ -222,6 +314,10 @@ msgctxt "field:calendar.todo.attendee,create_uid:"
 msgid "Create User"
 msgstr "Usuario creación"
 
+msgctxt "field:calendar.todo.attendee,email:"
+msgid "Email"
+msgstr "Correo electrónico"
+
 msgctxt "field:calendar.todo.attendee,id:"
 msgid "ID"
 msgstr "ID"
@@ -230,6 +326,10 @@ msgctxt "field:calendar.todo.attendee,rec_name:"
 msgid "Name"
 msgstr "Nombre"
 
+msgctxt "field:calendar.todo.attendee,status:"
+msgid "Participation Status"
+msgstr "Estado de participación"
+
 msgctxt "field:calendar.todo.attendee,todo:"
 msgid "Todo"
 msgstr "Tarea"
@@ -242,10 +342,6 @@ msgctxt "field:calendar.todo.attendee,write_uid:"
 msgid "Write User"
 msgstr "Usuario modificación"
 
-msgctxt "field:calendar.todo.exdate,calendar_date:"
-msgid "Calendar Date"
-msgstr "Fecha calendario"
-
 msgctxt "field:calendar.todo.exdate,create_date:"
 msgid "Create Date"
 msgstr "Fecha creación"
@@ -254,6 +350,14 @@ msgctxt "field:calendar.todo.exdate,create_uid:"
 msgid "Create User"
 msgstr "Usuario creación"
 
+msgctxt "field:calendar.todo.exdate,date:"
+msgid "Is Date"
+msgstr "Es una fecha"
+
+msgctxt "field:calendar.todo.exdate,datetime:"
+msgid "Date"
+msgstr "Fecha"
+
 msgctxt "field:calendar.todo.exdate,id:"
 msgid "ID"
 msgstr "ID"
@@ -274,9 +378,45 @@ msgctxt "field:calendar.todo.exdate,write_uid:"
 msgid "Write User"
 msgstr "Usuario modificación"
 
-msgctxt "field:calendar.todo.exrule,calendar_rrule:"
-msgid "Calendar RRule"
-msgstr "Regla de recurrencia"
+msgctxt "field:calendar.todo.exrule,byday:"
+msgid "By Day"
+msgstr "Por día"
+
+msgctxt "field:calendar.todo.exrule,byhour:"
+msgid "By Hour"
+msgstr "Por hora"
+
+msgctxt "field:calendar.todo.exrule,byminute:"
+msgid "By Minute"
+msgstr "Por minuto"
+
+msgctxt "field:calendar.todo.exrule,bymonth:"
+msgid "By Month"
+msgstr "Por mes"
+
+msgctxt "field:calendar.todo.exrule,bymonthday:"
+msgid "By Month Day"
+msgstr "Por día del mes"
+
+msgctxt "field:calendar.todo.exrule,bysecond:"
+msgid "By Second"
+msgstr "Por segundo"
+
+msgctxt "field:calendar.todo.exrule,bysetpos:"
+msgid "By Position"
+msgstr "Por ubicación"
+
+msgctxt "field:calendar.todo.exrule,byweekno:"
+msgid "By Week Number"
+msgstr "Por número de la semana"
+
+msgctxt "field:calendar.todo.exrule,byyearday:"
+msgid "By Year Day"
+msgstr "Por día del año"
+
+msgctxt "field:calendar.todo.exrule,count:"
+msgid "Count"
+msgstr "Contador"
 
 msgctxt "field:calendar.todo.exrule,create_date:"
 msgid "Create Date"
@@ -286,10 +426,18 @@ msgctxt "field:calendar.todo.exrule,create_uid:"
 msgid "Create User"
 msgstr "Usuario creación"
 
+msgctxt "field:calendar.todo.exrule,freq:"
+msgid "Frequency"
+msgstr "Frecuencia"
+
 msgctxt "field:calendar.todo.exrule,id:"
 msgid "ID"
 msgstr "ID"
 
+msgctxt "field:calendar.todo.exrule,interval:"
+msgid "Interval"
+msgstr "Intervalo"
+
 msgctxt "field:calendar.todo.exrule,rec_name:"
 msgid "Name"
 msgstr "Nombre"
@@ -298,6 +446,18 @@ msgctxt "field:calendar.todo.exrule,todo:"
 msgid "Todo"
 msgstr "Tarea"
 
+msgctxt "field:calendar.todo.exrule,until:"
+msgid "Until Date"
+msgstr "Hasta la fecha"
+
+msgctxt "field:calendar.todo.exrule,until_date:"
+msgid "Is Date"
+msgstr "Es una fecha"
+
+msgctxt "field:calendar.todo.exrule,wkst:"
+msgid "Week Day"
+msgstr "Día de la semana"
+
 msgctxt "field:calendar.todo.exrule,write_date:"
 msgid "Write Date"
 msgstr "Fecha modificación"
@@ -306,10 +466,6 @@ msgctxt "field:calendar.todo.exrule,write_uid:"
 msgid "Write User"
 msgstr "Usuario modificación"
 
-msgctxt "field:calendar.todo.rdate,calendar_date:"
-msgid "Calendar Date"
-msgstr "Fecha calendario"
-
 msgctxt "field:calendar.todo.rdate,create_date:"
 msgid "Create Date"
 msgstr "Fecha creación"
@@ -318,6 +474,14 @@ msgctxt "field:calendar.todo.rdate,create_uid:"
 msgid "Create User"
 msgstr "Usuario creación"
 
+msgctxt "field:calendar.todo.rdate,date:"
+msgid "Is Date"
+msgstr "Es una fecha"
+
+msgctxt "field:calendar.todo.rdate,datetime:"
+msgid "Date"
+msgstr "Fecha"
+
 msgctxt "field:calendar.todo.rdate,id:"
 msgid "ID"
 msgstr "ID"
@@ -338,9 +502,45 @@ msgctxt "field:calendar.todo.rdate,write_uid:"
 msgid "Write User"
 msgstr "Usuario modificación"
 
-msgctxt "field:calendar.todo.rrule,calendar_rrule:"
-msgid "Calendar RRule"
-msgstr "Regla de recurrencia"
+msgctxt "field:calendar.todo.rrule,byday:"
+msgid "By Day"
+msgstr "Por día"
+
+msgctxt "field:calendar.todo.rrule,byhour:"
+msgid "By Hour"
+msgstr "Por hora"
+
+msgctxt "field:calendar.todo.rrule,byminute:"
+msgid "By Minute"
+msgstr "Por minuto"
+
+msgctxt "field:calendar.todo.rrule,bymonth:"
+msgid "By Month"
+msgstr "Por mes"
+
+msgctxt "field:calendar.todo.rrule,bymonthday:"
+msgid "By Month Day"
+msgstr "Por día del mes"
+
+msgctxt "field:calendar.todo.rrule,bysecond:"
+msgid "By Second"
+msgstr "Por segundo"
+
+msgctxt "field:calendar.todo.rrule,bysetpos:"
+msgid "By Position"
+msgstr "Por ubicación"
+
+msgctxt "field:calendar.todo.rrule,byweekno:"
+msgid "By Week Number"
+msgstr "Por número de la semana"
+
+msgctxt "field:calendar.todo.rrule,byyearday:"
+msgid "By Year Day"
+msgstr "Por día del año"
+
+msgctxt "field:calendar.todo.rrule,count:"
+msgid "Count"
+msgstr "Contador"
 
 msgctxt "field:calendar.todo.rrule,create_date:"
 msgid "Create Date"
@@ -350,10 +550,18 @@ msgctxt "field:calendar.todo.rrule,create_uid:"
 msgid "Create User"
 msgstr "Usuario creación"
 
+msgctxt "field:calendar.todo.rrule,freq:"
+msgid "Frequency"
+msgstr "Frecuencia"
+
 msgctxt "field:calendar.todo.rrule,id:"
 msgid "ID"
 msgstr "ID"
 
+msgctxt "field:calendar.todo.rrule,interval:"
+msgid "Interval"
+msgstr "Intervalo"
+
 msgctxt "field:calendar.todo.rrule,rec_name:"
 msgid "Name"
 msgstr "Nombre"
@@ -362,6 +570,18 @@ msgctxt "field:calendar.todo.rrule,todo:"
 msgid "Todo"
 msgstr "Tarea"
 
+msgctxt "field:calendar.todo.rrule,until:"
+msgid "Until Date"
+msgstr "Hasta la fecha"
+
+msgctxt "field:calendar.todo.rrule,until_date:"
+msgid "Is Date"
+msgstr "Es una fecha"
+
+msgctxt "field:calendar.todo.rrule,wkst:"
+msgid "Week Day"
+msgstr "Día de la semana"
+
 msgctxt "field:calendar.todo.rrule,write_date:"
 msgid "Write Date"
 msgstr "Fecha modificación"
@@ -374,6 +594,24 @@ msgctxt "help:calendar.todo,uuid:"
 msgid "Universally Unique Identifier"
 msgstr "Identificador universal único"
 
+msgctxt "help:calendar.todo.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.todo.exrule,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 "help:calendar.todo.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 "help:calendar.todo.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.todo,name:"
 msgid "Todo"
 msgstr "Tarea"
@@ -400,7 +638,7 @@ msgstr "Regla de excepción"
 
 msgctxt "model:calendar.todo.rdate,name:"
 msgid "Todo Recurrence Date"
-msgstr "Fecha recurrencia"
+msgstr "Fecha recurrencia de tarea"
 
 msgctxt "model:calendar.todo.rrule,name:"
 msgid "Recurrence Rule"
@@ -448,8 +686,144 @@ msgstr "En proceso"
 
 msgctxt "selection:calendar.todo,status:"
 msgid "Needs-Action"
+msgstr "Necesita-acción"
+
+msgctxt "selection:calendar.todo.attendee,status:"
+msgid ""
+msgstr ""
+
+msgctxt "selection:calendar.todo.attendee,status:"
+msgid "Accepted"
+msgstr "Aceptado"
+
+msgctxt "selection:calendar.todo.attendee,status:"
+msgid "Declined"
+msgstr "Rechazado"
+
+msgctxt "selection:calendar.todo.attendee,status:"
+msgid "Delegated"
+msgstr "Delegado"
+
+msgctxt "selection:calendar.todo.attendee,status:"
+msgid "Needs Action"
 msgstr "Necesita una acción"
 
+msgctxt "selection:calendar.todo.attendee,status:"
+msgid "Tentative"
+msgstr "Tentativo"
+
+msgctxt "selection:calendar.todo.exrule,freq:"
+msgid "Daily"
+msgstr "Diariamente"
+
+msgctxt "selection:calendar.todo.exrule,freq:"
+msgid "Hourly"
+msgstr "Cada hora"
+
+msgctxt "selection:calendar.todo.exrule,freq:"
+msgid "Minutely"
+msgstr "Cada minuto"
+
+msgctxt "selection:calendar.todo.exrule,freq:"
+msgid "Monthly"
+msgstr "Mensualmente"
+
+msgctxt "selection:calendar.todo.exrule,freq:"
+msgid "Secondly"
+msgstr "Cada segundo"
+
+msgctxt "selection:calendar.todo.exrule,freq:"
+msgid "Weekly"
+msgstr "Semanalmente"
+
+msgctxt "selection:calendar.todo.exrule,freq:"
+msgid "Yearly"
+msgstr "Anualmente"
+
+msgctxt "selection:calendar.todo.exrule,wkst:"
+msgid "Friday"
+msgstr "Viernes"
+
+msgctxt "selection:calendar.todo.exrule,wkst:"
+msgid "Monday"
+msgstr "Lunes"
+
+msgctxt "selection:calendar.todo.exrule,wkst:"
+msgid "Saturday"
+msgstr "Sábado"
+
+msgctxt "selection:calendar.todo.exrule,wkst:"
+msgid "Sunday"
+msgstr "Domingo"
+
+msgctxt "selection:calendar.todo.exrule,wkst:"
+msgid "Thursday"
+msgstr "Jueves"
+
+msgctxt "selection:calendar.todo.exrule,wkst:"
+msgid "Tuesday"
+msgstr "Martes"
+
+msgctxt "selection:calendar.todo.exrule,wkst:"
+msgid "Wednesday"
+msgstr "Miércoles"
+
+msgctxt "selection:calendar.todo.rrule,freq:"
+msgid "Daily"
+msgstr "Diariamente"
+
+msgctxt "selection:calendar.todo.rrule,freq:"
+msgid "Hourly"
+msgstr "Cada hora"
+
+msgctxt "selection:calendar.todo.rrule,freq:"
+msgid "Minutely"
+msgstr "Cada minuto"
+
+msgctxt "selection:calendar.todo.rrule,freq:"
+msgid "Monthly"
+msgstr "Mensualmente"
+
+msgctxt "selection:calendar.todo.rrule,freq:"
+msgid "Secondly"
+msgstr "Cada segundo"
+
+msgctxt "selection:calendar.todo.rrule,freq:"
+msgid "Weekly"
+msgstr "Semanalmente"
+
+msgctxt "selection:calendar.todo.rrule,freq:"
+msgid "Yearly"
+msgstr "Anualmente"
+
+msgctxt "selection:calendar.todo.rrule,wkst:"
+msgid "Friday"
+msgstr "Viernes"
+
+msgctxt "selection:calendar.todo.rrule,wkst:"
+msgid "Monday"
+msgstr "Lunes"
+
+msgctxt "selection:calendar.todo.rrule,wkst:"
+msgid "Saturday"
+msgstr "Sábado"
+
+msgctxt "selection:calendar.todo.rrule,wkst:"
+msgid "Sunday"
+msgstr "Domingo"
+
+msgctxt "selection:calendar.todo.rrule,wkst:"
+msgid "Thursday"
+msgstr "Jueves"
+
+msgctxt "selection:calendar.todo.rrule,wkst:"
+msgid "Tuesday"
+msgstr "Martes"
+
+msgctxt "selection:calendar.todo.rrule,wkst:"
+msgid "Wednesday"
+msgstr "Miércoles"
+
 msgctxt "view:calendar.todo.attendee:"
 msgid "Attendee"
 msgstr "Asistentes"
@@ -476,7 +850,7 @@ msgstr "Reglas de excepciones"
 
 msgctxt "view:calendar.todo.rdate:"
 msgid "Recurrence Date"
-msgstr "Fecha recurrencia"
+msgstr "Fecha de recurrencia"
 
 msgctxt "view:calendar.todo.rdate:"
 msgid "Recurrence Dates"
@@ -507,10 +881,6 @@ msgid "Occurences"
 msgstr "Ocurrencias"
 
 msgctxt "view:calendar.todo:"
-msgid "Recurrences"
-msgstr "Recurrencias"
-
-msgctxt "view:calendar.todo:"
 msgid "Todo"
 msgstr "Tarea"
 
diff --git a/locale/es_CO.po b/locale/es_CO.po
index 8c530f2..806d017 100644
--- a/locale/es_CO.po
+++ b/locale/es_CO.po
@@ -2,13 +2,93 @@
 msgid ""
 msgstr "Content-Type: text/plain; charset=utf-8\n"
 
+msgctxt "error:calendar.todo.exrule:"
+msgid "Invalid \"By Day\" in recurrence rule \"%s\""
+msgstr "Inválido \"Por Día\" en regla recurrente \"%s\""
+
+msgctxt "error:calendar.todo.exrule:"
+msgid "Invalid \"By Hour\" in recurrence rule \"%s\""
+msgstr "Inválido \"Por Hora\" en regla recurrente \"%s\""
+
+msgctxt "error:calendar.todo.exrule:"
+msgid "Invalid \"By Minute\" in recurrence rule \"%s\""
+msgstr "Inválido \"Por Minuto\" en regla recurrente \"%s\""
+
+msgctxt "error:calendar.todo.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.todo.exrule:"
+msgid "Invalid \"By Month\" in recurrence rule \"%s\""
+msgstr "Inválido \"Por Mes\" en regla recurrente \"%s\""
+
+msgctxt "error:calendar.todo.exrule:"
+msgid "Invalid \"By Position\" in recurrence rule \"%s\""
+msgstr "Inválido \"Por Position\" en regla recurrente \"%s\""
+
+msgctxt "error:calendar.todo.exrule:"
+msgid "Invalid \"By Second\" in recurrence rule \"%s\""
+msgstr "Inválido \"Por Segundo\" en regla recurrente \"%s\""
+
+msgctxt "error:calendar.todo.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.todo.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.todo.exrule:"
+msgid "Only one of \"until\" and \"count\" can be set."
+msgstr "Solo un \"hasta\" y \"contar\" pude ser establecido!"
+
+msgctxt "error:calendar.todo.rrule:"
+msgid "Invalid \"By Day\" in recurrence rule \"%s\""
+msgstr "Inválido \"Por Día\" en regla recurrente \"%s\""
+
+msgctxt "error:calendar.todo.rrule:"
+msgid "Invalid \"By Hour\" in recurrence rule \"%s\""
+msgstr "Inválido \"Por Hora\" en regla recurrente \"%s\""
+
+msgctxt "error:calendar.todo.rrule:"
+msgid "Invalid \"By Minute\" in recurrence rule \"%s\""
+msgstr "Inválido \"Por Minuto\" en regla recurrente \"%s\""
+
+msgctxt "error:calendar.todo.rrule:"
+msgid "Invalid \"By Month Day\" in recurrence rule \"%s\""
+msgstr "Inválido \"Por Día del Mes\" en regla recurrente \"%s\""
+
+msgctxt "error:calendar.todo.rrule:"
+msgid "Invalid \"By Month\" in recurrence rule \"%s\""
+msgstr "Inválido \"Por Mes\" en regla recurrente \"%s\""
+
+msgctxt "error:calendar.todo.rrule:"
+msgid "Invalid \"By Position\" in recurrence rule \"%s\""
+msgstr "Inválido \"Por Position\" en regla recurrente \"%s\""
+
+msgctxt "error:calendar.todo.rrule:"
+msgid "Invalid \"By Second\" in recurrence rule \"%s\""
+msgstr "Inválido \"Por Segundo\" en regla recurrente \"%s\""
+
+msgctxt "error:calendar.todo.rrule:"
+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.todo.rrule:"
+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.todo.rrule:"
+msgid "Only one of \"until\" and \"count\" can be set."
+msgstr "Solo un \"hasta\" y \"contar\" pude ser establecido!"
+
 msgctxt "error:calendar.todo:"
-msgid "Recurrence can not be recurrent!"
-msgstr "¡La repetición no puede repetirse!"
+msgid "Todo \"%s\" can not be recurrent."
+msgstr "Tareas por Hacer \"%s\" no puede ser recurrente."
 
 msgctxt "error:calendar.todo:"
-msgid "UUID and recurrence must be unique in a calendar!"
-msgstr "¡El UUID y la recurrencia deben ser únicos por calendario! "
+msgid "UUID and recurrence must be unique in a calendar."
+msgstr "UUID y recurrencia debe ser única en un calendario."
 
 msgctxt "field:calendar.todo,alarms:"
 msgid "Alarms"
@@ -178,10 +258,6 @@ msgctxt "field:calendar.todo-calendar.category,write_uid:"
 msgid "Write User"
 msgstr "Modificado por Usuario"
 
-msgctxt "field:calendar.todo.alarm,calendar_alarm:"
-msgid "Calendar Alarm"
-msgstr "Alarma del Calendario"
-
 msgctxt "field:calendar.todo.alarm,create_date:"
 msgid "Create Date"
 msgstr "Fecha de Creación"
@@ -202,6 +278,10 @@ msgctxt "field:calendar.todo.alarm,todo:"
 msgid "Todo"
 msgstr "Por Hacer"
 
+msgctxt "field:calendar.todo.alarm,valarm:"
+msgid "valarm"
+msgstr "valarma"
+
 msgctxt "field:calendar.todo.alarm,write_date:"
 msgid "Write Date"
 msgstr "Fecha de Modificación"
@@ -210,9 +290,9 @@ msgctxt "field:calendar.todo.alarm,write_uid:"
 msgid "Write User"
 msgstr "Modificado por Usuario"
 
-msgctxt "field:calendar.todo.attendee,calendar_attendee:"
-msgid "Calendar Attendee"
-msgstr "Asistente de Calendario "
+msgctxt "field:calendar.todo.attendee,attendee:"
+msgid "attendee"
+msgstr "Asistente"
 
 msgctxt "field:calendar.todo.attendee,create_date:"
 msgid "Create Date"
@@ -222,6 +302,10 @@ msgctxt "field:calendar.todo.attendee,create_uid:"
 msgid "Create User"
 msgstr "Creado por Usuario"
 
+msgctxt "field:calendar.todo.attendee,email:"
+msgid "Email"
+msgstr "Correo Electrónico"
+
 msgctxt "field:calendar.todo.attendee,id:"
 msgid "ID"
 msgstr "ID"
@@ -230,6 +314,10 @@ msgctxt "field:calendar.todo.attendee,rec_name:"
 msgid "Name"
 msgstr "Nombre"
 
+msgctxt "field:calendar.todo.attendee,status:"
+msgid "Participation Status"
+msgstr "Estado de Participación"
+
 msgctxt "field:calendar.todo.attendee,todo:"
 msgid "Todo"
 msgstr "Por Hacer"
@@ -242,10 +330,6 @@ msgctxt "field:calendar.todo.attendee,write_uid:"
 msgid "Write User"
 msgstr "Modificado por Usuario"
 
-msgctxt "field:calendar.todo.exdate,calendar_date:"
-msgid "Calendar Date"
-msgstr "Fecha Calendario"
-
 msgctxt "field:calendar.todo.exdate,create_date:"
 msgid "Create Date"
 msgstr "Fecha de Creación"
@@ -254,6 +338,14 @@ msgctxt "field:calendar.todo.exdate,create_uid:"
 msgid "Create User"
 msgstr "Creado por Usuario"
 
+msgctxt "field:calendar.todo.exdate,date:"
+msgid "Is Date"
+msgstr "Esta Fecha"
+
+msgctxt "field:calendar.todo.exdate,datetime:"
+msgid "Date"
+msgstr "Fecha"
+
 msgctxt "field:calendar.todo.exdate,id:"
 msgid "ID"
 msgstr "ID"
@@ -274,9 +366,45 @@ msgctxt "field:calendar.todo.exdate,write_uid:"
 msgid "Write User"
 msgstr "Modificado por Usuario"
 
-msgctxt "field:calendar.todo.exrule,calendar_rrule:"
-msgid "Calendar RRule"
-msgstr "Regla de Calendario"
+msgctxt "field:calendar.todo.exrule,byday:"
+msgid "By Day"
+msgstr "Por Día"
+
+msgctxt "field:calendar.todo.exrule,byhour:"
+msgid "By Hour"
+msgstr "Por Hora"
+
+msgctxt "field:calendar.todo.exrule,byminute:"
+msgid "By Minute"
+msgstr "Por Minuto"
+
+msgctxt "field:calendar.todo.exrule,bymonth:"
+msgid "By Month"
+msgstr "Por Mes"
+
+msgctxt "field:calendar.todo.exrule,bymonthday:"
+msgid "By Month Day"
+msgstr "Por Día del Mes"
+
+msgctxt "field:calendar.todo.exrule,bysecond:"
+msgid "By Second"
+msgstr "Por Segundo"
+
+msgctxt "field:calendar.todo.exrule,bysetpos:"
+msgid "By Position"
+msgstr "Por Posición"
+
+msgctxt "field:calendar.todo.exrule,byweekno:"
+msgid "By Week Number"
+msgstr "Por Número de la Semana"
+
+msgctxt "field:calendar.todo.exrule,byyearday:"
+msgid "By Year Day"
+msgstr "Por Día del Año"
+
+msgctxt "field:calendar.todo.exrule,count:"
+msgid "Count"
+msgstr "Contar"
 
 msgctxt "field:calendar.todo.exrule,create_date:"
 msgid "Create Date"
@@ -286,10 +414,18 @@ msgctxt "field:calendar.todo.exrule,create_uid:"
 msgid "Create User"
 msgstr "Creado por Usuario"
 
+msgctxt "field:calendar.todo.exrule,freq:"
+msgid "Frequency"
+msgstr "Frecuencia"
+
 msgctxt "field:calendar.todo.exrule,id:"
 msgid "ID"
 msgstr "ID"
 
+msgctxt "field:calendar.todo.exrule,interval:"
+msgid "Interval"
+msgstr "Intervalo"
+
 msgctxt "field:calendar.todo.exrule,rec_name:"
 msgid "Name"
 msgstr "Nombre"
@@ -298,6 +434,18 @@ msgctxt "field:calendar.todo.exrule,todo:"
 msgid "Todo"
 msgstr "Por Hacer"
 
+msgctxt "field:calendar.todo.exrule,until:"
+msgid "Until Date"
+msgstr "Hasta la Fecha"
+
+msgctxt "field:calendar.todo.exrule,until_date:"
+msgid "Is Date"
+msgstr "Esta Fecha"
+
+msgctxt "field:calendar.todo.exrule,wkst:"
+msgid "Week Day"
+msgstr "Día de la Semana"
+
 msgctxt "field:calendar.todo.exrule,write_date:"
 msgid "Write Date"
 msgstr "Fecha de Modificación"
@@ -306,10 +454,6 @@ msgctxt "field:calendar.todo.exrule,write_uid:"
 msgid "Write User"
 msgstr "Modificado por Usuario"
 
-msgctxt "field:calendar.todo.rdate,calendar_date:"
-msgid "Calendar Date"
-msgstr "Fecha Calendario"
-
 msgctxt "field:calendar.todo.rdate,create_date:"
 msgid "Create Date"
 msgstr "Fecha de Creación"
@@ -318,6 +462,14 @@ msgctxt "field:calendar.todo.rdate,create_uid:"
 msgid "Create User"
 msgstr "Creado por Usuario"
 
+msgctxt "field:calendar.todo.rdate,date:"
+msgid "Is Date"
+msgstr "Esta Fecha"
+
+msgctxt "field:calendar.todo.rdate,datetime:"
+msgid "Date"
+msgstr "Fecha"
+
 msgctxt "field:calendar.todo.rdate,id:"
 msgid "ID"
 msgstr "ID"
@@ -338,9 +490,45 @@ msgctxt "field:calendar.todo.rdate,write_uid:"
 msgid "Write User"
 msgstr "Modificado por Usuario"
 
-msgctxt "field:calendar.todo.rrule,calendar_rrule:"
-msgid "Calendar RRule"
-msgstr "Regla de Calendario"
+msgctxt "field:calendar.todo.rrule,byday:"
+msgid "By Day"
+msgstr "Por Día"
+
+msgctxt "field:calendar.todo.rrule,byhour:"
+msgid "By Hour"
+msgstr "Por Hora"
+
+msgctxt "field:calendar.todo.rrule,byminute:"
+msgid "By Minute"
+msgstr "Por Minuto"
+
+msgctxt "field:calendar.todo.rrule,bymonth:"
+msgid "By Month"
+msgstr "Por Mes"
+
+msgctxt "field:calendar.todo.rrule,bymonthday:"
+msgid "By Month Day"
+msgstr "Por Día del Mes"
+
+msgctxt "field:calendar.todo.rrule,bysecond:"
+msgid "By Second"
+msgstr "Por Segundo"
+
+msgctxt "field:calendar.todo.rrule,bysetpos:"
+msgid "By Position"
+msgstr "Por Posición"
+
+msgctxt "field:calendar.todo.rrule,byweekno:"
+msgid "By Week Number"
+msgstr "Por Número de la Semana"
+
+msgctxt "field:calendar.todo.rrule,byyearday:"
+msgid "By Year Day"
+msgstr "Por Día del Año"
+
+msgctxt "field:calendar.todo.rrule,count:"
+msgid "Count"
+msgstr "Contar"
 
 msgctxt "field:calendar.todo.rrule,create_date:"
 msgid "Create Date"
@@ -350,10 +538,18 @@ msgctxt "field:calendar.todo.rrule,create_uid:"
 msgid "Create User"
 msgstr "Creado por Usuario"
 
+msgctxt "field:calendar.todo.rrule,freq:"
+msgid "Frequency"
+msgstr "Frecuencia"
+
 msgctxt "field:calendar.todo.rrule,id:"
 msgid "ID"
 msgstr "ID"
 
+msgctxt "field:calendar.todo.rrule,interval:"
+msgid "Interval"
+msgstr "Intervalo"
+
 msgctxt "field:calendar.todo.rrule,rec_name:"
 msgid "Name"
 msgstr "Nombre"
@@ -362,6 +558,18 @@ msgctxt "field:calendar.todo.rrule,todo:"
 msgid "Todo"
 msgstr "Por Hacer"
 
+msgctxt "field:calendar.todo.rrule,until:"
+msgid "Until Date"
+msgstr "Hasta la Fecha"
+
+msgctxt "field:calendar.todo.rrule,until_date:"
+msgid "Is Date"
+msgstr "Esta Fecha"
+
+msgctxt "field:calendar.todo.rrule,wkst:"
+msgid "Week Day"
+msgstr "Día de la Semana"
+
 msgctxt "field:calendar.todo.rrule,write_date:"
 msgid "Write Date"
 msgstr "Fecha de Modificación"
@@ -374,6 +582,26 @@ msgctxt "help:calendar.todo,uuid:"
 msgid "Universally Unique Identifier"
 msgstr "Identificador Único Universal"
 
+msgctxt "help:calendar.todo.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.todo.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 "help:calendar.todo.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 "help:calendar.todo.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.todo,name:"
 msgid "Todo"
 msgstr "Por Hacer"
@@ -430,6 +658,7 @@ msgctxt "selection:calendar.todo,classification:"
 msgid "Public"
 msgstr "Público"
 
+#, fuzzy
 msgctxt "selection:calendar.todo,status:"
 msgid ""
 msgstr "Punto de Orden"
@@ -450,6 +679,143 @@ msgctxt "selection:calendar.todo,status:"
 msgid "Needs-Action"
 msgstr "Necesita una Acción"
 
+#, fuzzy
+msgctxt "selection:calendar.todo.attendee,status:"
+msgid ""
+msgstr "Punto de Orden"
+
+msgctxt "selection:calendar.todo.attendee,status:"
+msgid "Accepted"
+msgstr "Aceptado"
+
+msgctxt "selection:calendar.todo.attendee,status:"
+msgid "Declined"
+msgstr "Declinado"
+
+msgctxt "selection:calendar.todo.attendee,status:"
+msgid "Delegated"
+msgstr "Delegado"
+
+msgctxt "selection:calendar.todo.attendee,status:"
+msgid "Needs Action"
+msgstr "Necesita una Acción"
+
+msgctxt "selection:calendar.todo.attendee,status:"
+msgid "Tentative"
+msgstr "Tentativa"
+
+msgctxt "selection:calendar.todo.exrule,freq:"
+msgid "Daily"
+msgstr "Diario"
+
+msgctxt "selection:calendar.todo.exrule,freq:"
+msgid "Hourly"
+msgstr "Cada Hora"
+
+msgctxt "selection:calendar.todo.exrule,freq:"
+msgid "Minutely"
+msgstr "Cada Minuto"
+
+msgctxt "selection:calendar.todo.exrule,freq:"
+msgid "Monthly"
+msgstr "Mensualmente"
+
+msgctxt "selection:calendar.todo.exrule,freq:"
+msgid "Secondly"
+msgstr "En segundo lugar"
+
+msgctxt "selection:calendar.todo.exrule,freq:"
+msgid "Weekly"
+msgstr "Semanalmente"
+
+msgctxt "selection:calendar.todo.exrule,freq:"
+msgid "Yearly"
+msgstr "Anualmente"
+
+msgctxt "selection:calendar.todo.exrule,wkst:"
+msgid "Friday"
+msgstr "Viernes"
+
+msgctxt "selection:calendar.todo.exrule,wkst:"
+msgid "Monday"
+msgstr "Lunes"
+
+msgctxt "selection:calendar.todo.exrule,wkst:"
+msgid "Saturday"
+msgstr "Sábado"
+
+msgctxt "selection:calendar.todo.exrule,wkst:"
+msgid "Sunday"
+msgstr "Domingo"
+
+msgctxt "selection:calendar.todo.exrule,wkst:"
+msgid "Thursday"
+msgstr "Jueves"
+
+msgctxt "selection:calendar.todo.exrule,wkst:"
+msgid "Tuesday"
+msgstr "Martes"
+
+msgctxt "selection:calendar.todo.exrule,wkst:"
+msgid "Wednesday"
+msgstr "Miércoles"
+
+msgctxt "selection:calendar.todo.rrule,freq:"
+msgid "Daily"
+msgstr "Diario"
+
+msgctxt "selection:calendar.todo.rrule,freq:"
+msgid "Hourly"
+msgstr "Cada Hora"
+
+msgctxt "selection:calendar.todo.rrule,freq:"
+msgid "Minutely"
+msgstr "Cada Minuto"
+
+msgctxt "selection:calendar.todo.rrule,freq:"
+msgid "Monthly"
+msgstr "Mensualmente"
+
+msgctxt "selection:calendar.todo.rrule,freq:"
+msgid "Secondly"
+msgstr "En segundo lugar"
+
+msgctxt "selection:calendar.todo.rrule,freq:"
+msgid "Weekly"
+msgstr "Semanalmente"
+
+msgctxt "selection:calendar.todo.rrule,freq:"
+msgid "Yearly"
+msgstr "Anualmente"
+
+msgctxt "selection:calendar.todo.rrule,wkst:"
+msgid "Friday"
+msgstr "Viernes"
+
+msgctxt "selection:calendar.todo.rrule,wkst:"
+msgid "Monday"
+msgstr "Lunes"
+
+msgctxt "selection:calendar.todo.rrule,wkst:"
+msgid "Saturday"
+msgstr "Sábado"
+
+msgctxt "selection:calendar.todo.rrule,wkst:"
+msgid "Sunday"
+msgstr "Domingo"
+
+msgctxt "selection:calendar.todo.rrule,wkst:"
+msgid "Thursday"
+msgstr "Jueves"
+
+msgctxt "selection:calendar.todo.rrule,wkst:"
+msgid "Tuesday"
+msgstr "Martes"
+
+msgctxt "selection:calendar.todo.rrule,wkst:"
+msgid "Wednesday"
+msgstr "Miércoles"
+
 msgctxt "view:calendar.todo.attendee:"
 msgid "Attendee"
 msgstr "Asistente"
@@ -507,10 +873,6 @@ msgid "Occurences"
 msgstr "Ocurrencias"
 
 msgctxt "view:calendar.todo:"
-msgid "Recurrences"
-msgstr "Repeticiones"
-
-msgctxt "view:calendar.todo:"
 msgid "Todo"
 msgstr "Por Hacer"
 
diff --git a/locale/es_ES.po b/locale/es_ES.po
index 463df55..eed9e6b 100644
--- a/locale/es_ES.po
+++ b/locale/es_ES.po
@@ -2,13 +2,105 @@
 msgid ""
 msgstr "Content-Type: text/plain; charset=utf-8\n"
 
+msgctxt "error:calendar.todo.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.todo.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.todo.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.todo.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.todo.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.todo.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.todo.exrule:"
+msgid "Invalid \"By Second\" in recurrence rule \"%s\""
+msgstr "El campo \"por segundo\" de la regla de recurrencia \"%s\" no es correcto."
+
+msgctxt "error:calendar.todo.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 "error:calendar.todo.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 "error:calendar.todo.exrule:"
+msgid "Only one of \"until\" and \"count\" can be set."
+msgstr "Define un \"hasta\" y un \"contador\"."
+
+msgctxt "error:calendar.todo.rrule:"
+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.todo.rrule:"
+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.todo.rrule:"
+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.todo.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 "error:calendar.todo.rrule:"
+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.todo.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 "error:calendar.todo.rrule:"
+msgid "Invalid \"By Second\" in recurrence rule \"%s\""
+msgstr "El campo \"por segundo\" de la regla de recurrencia \"%s\" no es correcto."
+
+msgctxt "error:calendar.todo.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 "error:calendar.todo.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 "error:calendar.todo.rrule:"
+msgid "Only one of \"until\" and \"count\" can be set."
+msgstr "Define un \"hasta\" y un \"contador\"."
+
 msgctxt "error:calendar.todo:"
-msgid "Recurrence can not be recurrent!"
-msgstr "Una recurrencia no puede ser recurrente."
+msgid "Todo \"%s\" can not be recurrent."
+msgstr "La tarea \"%s\" no puede ser recurrente."
 
 msgctxt "error:calendar.todo:"
-msgid "UUID and recurrence must be unique in a calendar!"
-msgstr "UUID y recurrencia deben ser únicos en un calendario."
+msgid "UUID and recurrence must be unique in a calendar."
+msgstr "UUID y la recurrencia deber ser únicos en el calendario."
 
 msgctxt "field:calendar.todo,alarms:"
 msgid "Alarms"
@@ -178,10 +270,6 @@ msgctxt "field:calendar.todo-calendar.category,write_uid:"
 msgid "Write User"
 msgstr "Usuario modificación"
 
-msgctxt "field:calendar.todo.alarm,calendar_alarm:"
-msgid "Calendar Alarm"
-msgstr "Alarma del calendario"
-
 msgctxt "field:calendar.todo.alarm,create_date:"
 msgid "Create Date"
 msgstr "Fecha creación"
@@ -202,6 +290,10 @@ msgctxt "field:calendar.todo.alarm,todo:"
 msgid "Todo"
 msgstr "Tarea"
 
+msgctxt "field:calendar.todo.alarm,valarm:"
+msgid "valarm"
+msgstr "valarm"
+
 msgctxt "field:calendar.todo.alarm,write_date:"
 msgid "Write Date"
 msgstr "Fecha modificación"
@@ -210,9 +302,9 @@ msgctxt "field:calendar.todo.alarm,write_uid:"
 msgid "Write User"
 msgstr "Usuario modificación"
 
-msgctxt "field:calendar.todo.attendee,calendar_attendee:"
-msgid "Calendar Attendee"
-msgstr "Calendario de asistentes"
+msgctxt "field:calendar.todo.attendee,attendee:"
+msgid "attendee"
+msgstr "asistente"
 
 msgctxt "field:calendar.todo.attendee,create_date:"
 msgid "Create Date"
@@ -222,6 +314,10 @@ msgctxt "field:calendar.todo.attendee,create_uid:"
 msgid "Create User"
 msgstr "Usuario creación"
 
+msgctxt "field:calendar.todo.attendee,email:"
+msgid "Email"
+msgstr "Email"
+
 msgctxt "field:calendar.todo.attendee,id:"
 msgid "ID"
 msgstr "ID"
@@ -230,6 +326,10 @@ msgctxt "field:calendar.todo.attendee,rec_name:"
 msgid "Name"
 msgstr "Nombre"
 
+msgctxt "field:calendar.todo.attendee,status:"
+msgid "Participation Status"
+msgstr "Estat de participacions"
+
 msgctxt "field:calendar.todo.attendee,todo:"
 msgid "Todo"
 msgstr "Tarea"
@@ -242,10 +342,6 @@ msgctxt "field:calendar.todo.attendee,write_uid:"
 msgid "Write User"
 msgstr "Usuario modificación"
 
-msgctxt "field:calendar.todo.exdate,calendar_date:"
-msgid "Calendar Date"
-msgstr "Fecha calendario"
-
 msgctxt "field:calendar.todo.exdate,create_date:"
 msgid "Create Date"
 msgstr "Fecha creación"
@@ -254,6 +350,14 @@ msgctxt "field:calendar.todo.exdate,create_uid:"
 msgid "Create User"
 msgstr "Usuario creación"
 
+msgctxt "field:calendar.todo.exdate,date:"
+msgid "Is Date"
+msgstr "Es una fecha"
+
+msgctxt "field:calendar.todo.exdate,datetime:"
+msgid "Date"
+msgstr "Fecha"
+
 msgctxt "field:calendar.todo.exdate,id:"
 msgid "ID"
 msgstr "ID"
@@ -274,9 +378,45 @@ msgctxt "field:calendar.todo.exdate,write_uid:"
 msgid "Write User"
 msgstr "Usuario modificación"
 
-msgctxt "field:calendar.todo.exrule,calendar_rrule:"
-msgid "Calendar RRule"
-msgstr "Regla de recurrencia"
+msgctxt "field:calendar.todo.exrule,byday:"
+msgid "By Day"
+msgstr "Por día"
+
+msgctxt "field:calendar.todo.exrule,byhour:"
+msgid "By Hour"
+msgstr "Por hora"
+
+msgctxt "field:calendar.todo.exrule,byminute:"
+msgid "By Minute"
+msgstr "Por minuto"
+
+msgctxt "field:calendar.todo.exrule,bymonth:"
+msgid "By Month"
+msgstr "Por mes"
+
+msgctxt "field:calendar.todo.exrule,bymonthday:"
+msgid "By Month Day"
+msgstr "Por día del mes"
+
+msgctxt "field:calendar.todo.exrule,bysecond:"
+msgid "By Second"
+msgstr "Por segundo"
+
+msgctxt "field:calendar.todo.exrule,bysetpos:"
+msgid "By Position"
+msgstr "Por ubicación"
+
+msgctxt "field:calendar.todo.exrule,byweekno:"
+msgid "By Week Number"
+msgstr "Por número de la semana"
+
+msgctxt "field:calendar.todo.exrule,byyearday:"
+msgid "By Year Day"
+msgstr "Por día del año"
+
+msgctxt "field:calendar.todo.exrule,count:"
+msgid "Count"
+msgstr "Contador"
 
 msgctxt "field:calendar.todo.exrule,create_date:"
 msgid "Create Date"
@@ -286,10 +426,18 @@ msgctxt "field:calendar.todo.exrule,create_uid:"
 msgid "Create User"
 msgstr "Usuario creación"
 
+msgctxt "field:calendar.todo.exrule,freq:"
+msgid "Frequency"
+msgstr "Frecuencia"
+
 msgctxt "field:calendar.todo.exrule,id:"
 msgid "ID"
 msgstr "ID"
 
+msgctxt "field:calendar.todo.exrule,interval:"
+msgid "Interval"
+msgstr "Intérvalo"
+
 msgctxt "field:calendar.todo.exrule,rec_name:"
 msgid "Name"
 msgstr "Nombre"
@@ -298,6 +446,18 @@ msgctxt "field:calendar.todo.exrule,todo:"
 msgid "Todo"
 msgstr "Tarea"
 
+msgctxt "field:calendar.todo.exrule,until:"
+msgid "Until Date"
+msgstr "Hasta la fecha"
+
+msgctxt "field:calendar.todo.exrule,until_date:"
+msgid "Is Date"
+msgstr "Es una fecha"
+
+msgctxt "field:calendar.todo.exrule,wkst:"
+msgid "Week Day"
+msgstr "Día de la semana"
+
 msgctxt "field:calendar.todo.exrule,write_date:"
 msgid "Write Date"
 msgstr "Fecha modificación"
@@ -306,10 +466,6 @@ msgctxt "field:calendar.todo.exrule,write_uid:"
 msgid "Write User"
 msgstr "Usuario modificación"
 
-msgctxt "field:calendar.todo.rdate,calendar_date:"
-msgid "Calendar Date"
-msgstr "Fecha calendario"
-
 msgctxt "field:calendar.todo.rdate,create_date:"
 msgid "Create Date"
 msgstr "Fecha creación"
@@ -318,6 +474,14 @@ msgctxt "field:calendar.todo.rdate,create_uid:"
 msgid "Create User"
 msgstr "Usuario creación"
 
+msgctxt "field:calendar.todo.rdate,date:"
+msgid "Is Date"
+msgstr "Es una fecha"
+
+msgctxt "field:calendar.todo.rdate,datetime:"
+msgid "Date"
+msgstr "Fecha"
+
 msgctxt "field:calendar.todo.rdate,id:"
 msgid "ID"
 msgstr "ID"
@@ -338,9 +502,45 @@ msgctxt "field:calendar.todo.rdate,write_uid:"
 msgid "Write User"
 msgstr "Usuario modificación"
 
-msgctxt "field:calendar.todo.rrule,calendar_rrule:"
-msgid "Calendar RRule"
-msgstr "Regla de recurrencia"
+msgctxt "field:calendar.todo.rrule,byday:"
+msgid "By Day"
+msgstr "Por día"
+
+msgctxt "field:calendar.todo.rrule,byhour:"
+msgid "By Hour"
+msgstr "Por hora"
+
+msgctxt "field:calendar.todo.rrule,byminute:"
+msgid "By Minute"
+msgstr "Por minuto"
+
+msgctxt "field:calendar.todo.rrule,bymonth:"
+msgid "By Month"
+msgstr "Por mes"
+
+msgctxt "field:calendar.todo.rrule,bymonthday:"
+msgid "By Month Day"
+msgstr "Por día del mes"
+
+msgctxt "field:calendar.todo.rrule,bysecond:"
+msgid "By Second"
+msgstr "Por segundo"
+
+msgctxt "field:calendar.todo.rrule,bysetpos:"
+msgid "By Position"
+msgstr "Por ubicación"
+
+msgctxt "field:calendar.todo.rrule,byweekno:"
+msgid "By Week Number"
+msgstr "Por número de la semana"
+
+msgctxt "field:calendar.todo.rrule,byyearday:"
+msgid "By Year Day"
+msgstr "Por día del año"
+
+msgctxt "field:calendar.todo.rrule,count:"
+msgid "Count"
+msgstr "Contador"
 
 msgctxt "field:calendar.todo.rrule,create_date:"
 msgid "Create Date"
@@ -350,10 +550,18 @@ msgctxt "field:calendar.todo.rrule,create_uid:"
 msgid "Create User"
 msgstr "Usuario creación"
 
+msgctxt "field:calendar.todo.rrule,freq:"
+msgid "Frequency"
+msgstr "Frecuencia"
+
 msgctxt "field:calendar.todo.rrule,id:"
 msgid "ID"
 msgstr "ID"
 
+msgctxt "field:calendar.todo.rrule,interval:"
+msgid "Interval"
+msgstr "Intérvalo"
+
 msgctxt "field:calendar.todo.rrule,rec_name:"
 msgid "Name"
 msgstr "Nombre"
@@ -362,6 +570,18 @@ msgctxt "field:calendar.todo.rrule,todo:"
 msgid "Todo"
 msgstr "Tarea"
 
+msgctxt "field:calendar.todo.rrule,until:"
+msgid "Until Date"
+msgstr "Hasta la fecha"
+
+msgctxt "field:calendar.todo.rrule,until_date:"
+msgid "Is Date"
+msgstr "Es una fecha"
+
+msgctxt "field:calendar.todo.rrule,wkst:"
+msgid "Week Day"
+msgstr "Día de la semana"
+
 msgctxt "field:calendar.todo.rrule,write_date:"
 msgid "Write Date"
 msgstr "Fecha modificación"
@@ -374,6 +594,22 @@ msgctxt "help:calendar.todo,uuid:"
 msgid "Universally Unique Identifier"
 msgstr "Identificador universal único."
 
+msgctxt "help:calendar.todo.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.todo.exrule,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 "help:calendar.todo.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 "help:calendar.todo.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.todo,name:"
 msgid "Todo"
 msgstr "Tarea"
@@ -448,7 +684,143 @@ msgstr "En proceso"
 
 msgctxt "selection:calendar.todo,status:"
 msgid "Needs-Action"
-msgstr "Necesita acción"
+msgstr "Necesidad-Acción"
+
+msgctxt "selection:calendar.todo.attendee,status:"
+msgid ""
+msgstr ""
+
+msgctxt "selection:calendar.todo.attendee,status:"
+msgid "Accepted"
+msgstr "Acceptado"
+
+msgctxt "selection:calendar.todo.attendee,status:"
+msgid "Declined"
+msgstr "Rechazar"
+
+msgctxt "selection:calendar.todo.attendee,status:"
+msgid "Delegated"
+msgstr "Delegar"
+
+msgctxt "selection:calendar.todo.attendee,status:"
+msgid "Needs Action"
+msgstr "Necesidad  Acción"
+
+msgctxt "selection:calendar.todo.attendee,status:"
+msgid "Tentative"
+msgstr "Tentativo"
+
+msgctxt "selection:calendar.todo.exrule,freq:"
+msgid "Daily"
+msgstr "Diariamente"
+
+msgctxt "selection:calendar.todo.exrule,freq:"
+msgid "Hourly"
+msgstr "Cada hora"
+
+msgctxt "selection:calendar.todo.exrule,freq:"
+msgid "Minutely"
+msgstr "Cada minuto"
+
+msgctxt "selection:calendar.todo.exrule,freq:"
+msgid "Monthly"
+msgstr "Mensualmente"
+
+msgctxt "selection:calendar.todo.exrule,freq:"
+msgid "Secondly"
+msgstr "Cada segundo"
+
+msgctxt "selection:calendar.todo.exrule,freq:"
+msgid "Weekly"
+msgstr "Semanalmente"
+
+msgctxt "selection:calendar.todo.exrule,freq:"
+msgid "Yearly"
+msgstr "Anualmente"
+
+msgctxt "selection:calendar.todo.exrule,wkst:"
+msgid "Friday"
+msgstr "Viernes"
+
+msgctxt "selection:calendar.todo.exrule,wkst:"
+msgid "Monday"
+msgstr "Lunes"
+
+msgctxt "selection:calendar.todo.exrule,wkst:"
+msgid "Saturday"
+msgstr "Sábado"
+
+msgctxt "selection:calendar.todo.exrule,wkst:"
+msgid "Sunday"
+msgstr "Domingo"
+
+msgctxt "selection:calendar.todo.exrule,wkst:"
+msgid "Thursday"
+msgstr "Jueves"
+
+msgctxt "selection:calendar.todo.exrule,wkst:"
+msgid "Tuesday"
+msgstr "Martes"
+
+msgctxt "selection:calendar.todo.exrule,wkst:"
+msgid "Wednesday"
+msgstr "Miércoles"
+
+msgctxt "selection:calendar.todo.rrule,freq:"
+msgid "Daily"
+msgstr "Diariamente"
+
+msgctxt "selection:calendar.todo.rrule,freq:"
+msgid "Hourly"
+msgstr "Cada hora"
+
+msgctxt "selection:calendar.todo.rrule,freq:"
+msgid "Minutely"
+msgstr "Cada minuto"
+
+msgctxt "selection:calendar.todo.rrule,freq:"
+msgid "Monthly"
+msgstr "Mensualmente"
+
+msgctxt "selection:calendar.todo.rrule,freq:"
+msgid "Secondly"
+msgstr "Cada segundo"
+
+msgctxt "selection:calendar.todo.rrule,freq:"
+msgid "Weekly"
+msgstr "Semanalmente"
+
+msgctxt "selection:calendar.todo.rrule,freq:"
+msgid "Yearly"
+msgstr "Anualmente"
+
+msgctxt "selection:calendar.todo.rrule,wkst:"
+msgid "Friday"
+msgstr "Viernes"
+
+msgctxt "selection:calendar.todo.rrule,wkst:"
+msgid "Monday"
+msgstr "Lunes"
+
+msgctxt "selection:calendar.todo.rrule,wkst:"
+msgid "Saturday"
+msgstr "Sábado"
+
+msgctxt "selection:calendar.todo.rrule,wkst:"
+msgid "Sunday"
+msgstr "Domingo"
+
+msgctxt "selection:calendar.todo.rrule,wkst:"
+msgid "Thursday"
+msgstr "Jueves"
+
+msgctxt "selection:calendar.todo.rrule,wkst:"
+msgid "Tuesday"
+msgstr "Martes"
+
+msgctxt "selection:calendar.todo.rrule,wkst:"
+msgid "Wednesday"
+msgstr "Miércoles"
 
 msgctxt "view:calendar.todo.attendee:"
 msgid "Attendee"
@@ -507,10 +879,6 @@ msgid "Occurences"
 msgstr "Ocurrencias"
 
 msgctxt "view:calendar.todo:"
-msgid "Recurrences"
-msgstr "Recurrencias"
-
-msgctxt "view:calendar.todo:"
 msgid "Todo"
 msgstr "Tarea"
 
diff --git a/locale/fr_FR.po b/locale/fr_FR.po
index 993dc35..efb455f 100644
--- a/locale/fr_FR.po
+++ b/locale/fr_FR.po
@@ -2,21 +2,93 @@
 msgid ""
 msgstr "Content-Type: text/plain; charset=utf-8\n"
 
-msgctxt "error:calendar.todo:"
-msgid "Recurrence can not be recurrent!"
-msgstr "Une récurrence ne peut pas être récurrente !"
+msgctxt "error:calendar.todo.exrule:"
+msgid "Invalid \"By Day\" in recurrence rule \"%s\""
+msgstr "\"Par jour\" invalide dans la règle de récurrence \"%s\"."
 
-msgctxt "error:calendar.todo:"
-msgid "Recurrence can not be recurrent!"
-msgstr "Une récurrence ne peut pas être récurrente !"
+msgctxt "error:calendar.todo.exrule:"
+msgid "Invalid \"By Hour\" in recurrence rule \"%s\""
+msgstr "\"Par heure\" invalide dans la règle de récurrence \"%s\""
+
+msgctxt "error:calendar.todo.exrule:"
+msgid "Invalid \"By Minute\" in recurrence rule \"%s\""
+msgstr "\"Par minute\" invalide dans la règle de récurrence \"%s\"."
+
+msgctxt "error:calendar.todo.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.todo.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.todo.exrule:"
+msgid "Invalid \"By Position\" in recurrence rule \"%s\""
+msgstr "\"Par position\" invalide dans la règle de récurrence \"%s\"."
+
+msgctxt "error:calendar.todo.exrule:"
+msgid "Invalid \"By Second\" in recurrence rule \"%s\""
+msgstr "\"Par seconde\" invalide dans la règle de récurrence \"%s\"."
+
+msgctxt "error:calendar.todo.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.todo.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.todo.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.todo.rrule:"
+msgid "Invalid \"By Day\" in recurrence rule \"%s\""
+msgstr "\"Par jour\" invalide dans la règle de récurrence \"%s\"."
+
+msgctxt "error:calendar.todo.rrule:"
+msgid "Invalid \"By Hour\" in recurrence rule \"%s\""
+msgstr "\"Par heure\" invalide dans la règle de récurrence \"%s\"."
+
+msgctxt "error:calendar.todo.rrule:"
+msgid "Invalid \"By Minute\" in recurrence rule \"%s\""
+msgstr "\"Par minute\" invalide dans la règle de récurrence \"%s\"."
+
+msgctxt "error:calendar.todo.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.todo.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.todo.rrule:"
+msgid "Invalid \"By Position\" in recurrence rule \"%s\""
+msgstr "\"Par position\" invalide dans la règle de récurrence \"%s\"."
+
+msgctxt "error:calendar.todo.rrule:"
+msgid "Invalid \"By Second\" in recurrence rule \"%s\""
+msgstr "\"Par seconde\" invalide dans la règle de récurrence \"%s\"."
+
+msgctxt "error:calendar.todo.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 "error:calendar.todo.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 "error:calendar.todo.rrule:"
+msgid "Only one of \"until\" and \"count\" can be set."
+msgstr "\"Date de fin\" et \"Répétitions\" sont mutuellement exclusifs"
 
 msgctxt "error:calendar.todo:"
-msgid "UUID and recurrence must be unique in a calendar!"
-msgstr "UUID et récurrence doivent être uniques sur un calendrier !"
+msgid "Todo \"%s\" can not be recurrent."
+msgstr "La tâche \"%s\" ne peut pas être récurrente."
 
 msgctxt "error:calendar.todo:"
-msgid "UUID and recurrence must be unique in a calendar!"
-msgstr "UUID et récurrence doivent être uniques sur un calendrier !"
+msgid "UUID and recurrence must be unique in a calendar."
+msgstr "UUID et récurence doivent être unique dans un calendrier."
 
 msgctxt "field:calendar.todo,alarms:"
 msgid "Alarms"
@@ -186,10 +258,6 @@ msgctxt "field:calendar.todo-calendar.category,write_uid:"
 msgid "Write User"
 msgstr "Mis à jour par"
 
-msgctxt "field:calendar.todo.alarm,calendar_alarm:"
-msgid "Calendar Alarm"
-msgstr "Alarme calendrier"
-
 msgctxt "field:calendar.todo.alarm,create_date:"
 msgid "Create Date"
 msgstr "Date de création"
@@ -210,6 +278,10 @@ msgctxt "field:calendar.todo.alarm,todo:"
 msgid "Todo"
 msgstr "Tâche"
 
+msgctxt "field:calendar.todo.alarm,valarm:"
+msgid "valarm"
+msgstr "valarm"
+
 msgctxt "field:calendar.todo.alarm,write_date:"
 msgid "Write Date"
 msgstr "Date de mise à jour"
@@ -218,9 +290,9 @@ msgctxt "field:calendar.todo.alarm,write_uid:"
 msgid "Write User"
 msgstr "Mis à jour par"
 
-msgctxt "field:calendar.todo.attendee,calendar_attendee:"
-msgid "Calendar Attendee"
-msgstr "Participant calendrier"
+msgctxt "field:calendar.todo.attendee,attendee:"
+msgid "attendee"
+msgstr "participant"
 
 msgctxt "field:calendar.todo.attendee,create_date:"
 msgid "Create Date"
@@ -230,6 +302,10 @@ msgctxt "field:calendar.todo.attendee,create_uid:"
 msgid "Create User"
 msgstr "Créé par"
 
+msgctxt "field:calendar.todo.attendee,email:"
+msgid "Email"
+msgstr "E-mail"
+
 msgctxt "field:calendar.todo.attendee,id:"
 msgid "ID"
 msgstr "ID"
@@ -238,6 +314,10 @@ msgctxt "field:calendar.todo.attendee,rec_name:"
 msgid "Name"
 msgstr "Nom"
 
+msgctxt "field:calendar.todo.attendee,status:"
+msgid "Participation Status"
+msgstr "Statut de participation"
+
 msgctxt "field:calendar.todo.attendee,todo:"
 msgid "Todo"
 msgstr "Tâche"
@@ -250,10 +330,6 @@ msgctxt "field:calendar.todo.attendee,write_uid:"
 msgid "Write User"
 msgstr "Mis à jour par"
 
-msgctxt "field:calendar.todo.exdate,calendar_date:"
-msgid "Calendar Date"
-msgstr "Date calendrier"
-
 msgctxt "field:calendar.todo.exdate,create_date:"
 msgid "Create Date"
 msgstr "Date de création"
@@ -262,6 +338,14 @@ msgctxt "field:calendar.todo.exdate,create_uid:"
 msgid "Create User"
 msgstr "Créé par"
 
+msgctxt "field:calendar.todo.exdate,date:"
+msgid "Is Date"
+msgstr "Est une date"
+
+msgctxt "field:calendar.todo.exdate,datetime:"
+msgid "Date"
+msgstr "Date"
+
 msgctxt "field:calendar.todo.exdate,id:"
 msgid "ID"
 msgstr "ID"
@@ -282,9 +366,45 @@ msgctxt "field:calendar.todo.exdate,write_uid:"
 msgid "Write User"
 msgstr "Mis à jour par"
 
-msgctxt "field:calendar.todo.exrule,calendar_rrule:"
-msgid "Calendar RRule"
-msgstr "Règle de récurrence"
+msgctxt "field:calendar.todo.exrule,byday:"
+msgid "By Day"
+msgstr "Par jour"
+
+msgctxt "field:calendar.todo.exrule,byhour:"
+msgid "By Hour"
+msgstr "Par heure"
+
+msgctxt "field:calendar.todo.exrule,byminute:"
+msgid "By Minute"
+msgstr "Par minute"
+
+msgctxt "field:calendar.todo.exrule,bymonth:"
+msgid "By Month"
+msgstr "Par mois"
+
+msgctxt "field:calendar.todo.exrule,bymonthday:"
+msgid "By Month Day"
+msgstr "Par jour du mois"
+
+msgctxt "field:calendar.todo.exrule,bysecond:"
+msgid "By Second"
+msgstr "Par seconde"
+
+msgctxt "field:calendar.todo.exrule,bysetpos:"
+msgid "By Position"
+msgstr "Par position"
+
+msgctxt "field:calendar.todo.exrule,byweekno:"
+msgid "By Week Number"
+msgstr "Par numéro de semaine"
+
+msgctxt "field:calendar.todo.exrule,byyearday:"
+msgid "By Year Day"
+msgstr "Par jour de l'année"
+
+msgctxt "field:calendar.todo.exrule,count:"
+msgid "Count"
+msgstr "Répétitions"
 
 msgctxt "field:calendar.todo.exrule,create_date:"
 msgid "Create Date"
@@ -294,10 +414,18 @@ msgctxt "field:calendar.todo.exrule,create_uid:"
 msgid "Create User"
 msgstr "Créé par"
 
+msgctxt "field:calendar.todo.exrule,freq:"
+msgid "Frequency"
+msgstr "Fréquence"
+
 msgctxt "field:calendar.todo.exrule,id:"
 msgid "ID"
 msgstr "ID"
 
+msgctxt "field:calendar.todo.exrule,interval:"
+msgid "Interval"
+msgstr "Intervalle"
+
 msgctxt "field:calendar.todo.exrule,rec_name:"
 msgid "Name"
 msgstr "Nom"
@@ -306,6 +434,18 @@ msgctxt "field:calendar.todo.exrule,todo:"
 msgid "Todo"
 msgstr "Tâche"
 
+msgctxt "field:calendar.todo.exrule,until:"
+msgid "Until Date"
+msgstr "Date de fin"
+
+msgctxt "field:calendar.todo.exrule,until_date:"
+msgid "Is Date"
+msgstr "Est une date"
+
+msgctxt "field:calendar.todo.exrule,wkst:"
+msgid "Week Day"
+msgstr "Jour de la semaine"
+
 msgctxt "field:calendar.todo.exrule,write_date:"
 msgid "Write Date"
 msgstr "Date de mise à jour"
@@ -314,10 +454,6 @@ msgctxt "field:calendar.todo.exrule,write_uid:"
 msgid "Write User"
 msgstr "Mis à jour par"
 
-msgctxt "field:calendar.todo.rdate,calendar_date:"
-msgid "Calendar Date"
-msgstr "Date calendrier"
-
 msgctxt "field:calendar.todo.rdate,create_date:"
 msgid "Create Date"
 msgstr "Date de création"
@@ -326,6 +462,14 @@ msgctxt "field:calendar.todo.rdate,create_uid:"
 msgid "Create User"
 msgstr "Créé par"
 
+msgctxt "field:calendar.todo.rdate,date:"
+msgid "Is Date"
+msgstr "Est une date"
+
+msgctxt "field:calendar.todo.rdate,datetime:"
+msgid "Date"
+msgstr "Date"
+
 msgctxt "field:calendar.todo.rdate,id:"
 msgid "ID"
 msgstr "ID"
@@ -346,9 +490,45 @@ msgctxt "field:calendar.todo.rdate,write_uid:"
 msgid "Write User"
 msgstr "Mis à jour par"
 
-msgctxt "field:calendar.todo.rrule,calendar_rrule:"
-msgid "Calendar RRule"
-msgstr "Règle de récurrence"
+msgctxt "field:calendar.todo.rrule,byday:"
+msgid "By Day"
+msgstr "Par jour"
+
+msgctxt "field:calendar.todo.rrule,byhour:"
+msgid "By Hour"
+msgstr "Par heure"
+
+msgctxt "field:calendar.todo.rrule,byminute:"
+msgid "By Minute"
+msgstr "Par minute"
+
+msgctxt "field:calendar.todo.rrule,bymonth:"
+msgid "By Month"
+msgstr "Par mois"
+
+msgctxt "field:calendar.todo.rrule,bymonthday:"
+msgid "By Month Day"
+msgstr "Par jour du mois"
+
+msgctxt "field:calendar.todo.rrule,bysecond:"
+msgid "By Second"
+msgstr "Par seconde"
+
+msgctxt "field:calendar.todo.rrule,bysetpos:"
+msgid "By Position"
+msgstr "Par position"
+
+msgctxt "field:calendar.todo.rrule,byweekno:"
+msgid "By Week Number"
+msgstr "Par numéro de semaine"
+
+msgctxt "field:calendar.todo.rrule,byyearday:"
+msgid "By Year Day"
+msgstr "Par jour de l'année"
+
+msgctxt "field:calendar.todo.rrule,count:"
+msgid "Count"
+msgstr "Répétitions"
 
 msgctxt "field:calendar.todo.rrule,create_date:"
 msgid "Create Date"
@@ -358,10 +538,18 @@ msgctxt "field:calendar.todo.rrule,create_uid:"
 msgid "Create User"
 msgstr "Créé par"
 
+msgctxt "field:calendar.todo.rrule,freq:"
+msgid "Frequency"
+msgstr "Fréquence"
+
 msgctxt "field:calendar.todo.rrule,id:"
 msgid "ID"
 msgstr "ID"
 
+msgctxt "field:calendar.todo.rrule,interval:"
+msgid "Interval"
+msgstr "Intervalle"
+
 msgctxt "field:calendar.todo.rrule,rec_name:"
 msgid "Name"
 msgstr "Nom"
@@ -370,6 +558,18 @@ msgctxt "field:calendar.todo.rrule,todo:"
 msgid "Todo"
 msgstr "Tâche"
 
+msgctxt "field:calendar.todo.rrule,until:"
+msgid "Until Date"
+msgstr "Date de fin"
+
+msgctxt "field:calendar.todo.rrule,until_date:"
+msgid "Is Date"
+msgstr "Est une date"
+
+msgctxt "field:calendar.todo.rrule,wkst:"
+msgid "Week Day"
+msgstr "Jour de la semaine"
+
 msgctxt "field:calendar.todo.rrule,write_date:"
 msgid "Write Date"
 msgstr "Date de mise à jour"
@@ -382,6 +582,22 @@ msgctxt "help:calendar.todo,uuid:"
 msgid "Universally Unique Identifier"
 msgstr "Identificateur unique universel"
 
+msgctxt "help:calendar.todo.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.todo.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 "help:calendar.todo.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 "help:calendar.todo.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.todo,name:"
 msgid "Todo"
 msgstr "Tâche"
@@ -490,6 +706,142 @@ msgctxt "selection:calendar.todo,status:"
 msgid "Needs-Action"
 msgstr "Nécessite une action"
 
+msgctxt "selection:calendar.todo.attendee,status:"
+msgid ""
+msgstr ""
+
+msgctxt "selection:calendar.todo.attendee,status:"
+msgid "Accepted"
+msgstr "Accepté"
+
+msgctxt "selection:calendar.todo.attendee,status:"
+msgid "Declined"
+msgstr "Décliné"
+
+msgctxt "selection:calendar.todo.attendee,status:"
+msgid "Delegated"
+msgstr "Délégué"
+
+msgctxt "selection:calendar.todo.attendee,status:"
+msgid "Needs Action"
+msgstr "Nécessite une action"
+
+msgctxt "selection:calendar.todo.attendee,status:"
+msgid "Tentative"
+msgstr "Tentative"
+
+msgctxt "selection:calendar.todo.exrule,freq:"
+msgid "Daily"
+msgstr "Journalier"
+
+msgctxt "selection:calendar.todo.exrule,freq:"
+msgid "Hourly"
+msgstr "Horaire"
+
+msgctxt "selection:calendar.todo.exrule,freq:"
+msgid "Minutely"
+msgstr "Chaque minute"
+
+msgctxt "selection:calendar.todo.exrule,freq:"
+msgid "Monthly"
+msgstr "Mensuel"
+
+msgctxt "selection:calendar.todo.exrule,freq:"
+msgid "Secondly"
+msgstr "Chaque seconde"
+
+msgctxt "selection:calendar.todo.exrule,freq:"
+msgid "Weekly"
+msgstr "hebdomadaire"
+
+msgctxt "selection:calendar.todo.exrule,freq:"
+msgid "Yearly"
+msgstr "Annuel"
+
+msgctxt "selection:calendar.todo.exrule,wkst:"
+msgid "Friday"
+msgstr "Vendredi"
+
+msgctxt "selection:calendar.todo.exrule,wkst:"
+msgid "Monday"
+msgstr "Lundi"
+
+msgctxt "selection:calendar.todo.exrule,wkst:"
+msgid "Saturday"
+msgstr "Samedi"
+
+msgctxt "selection:calendar.todo.exrule,wkst:"
+msgid "Sunday"
+msgstr "Dimanche"
+
+msgctxt "selection:calendar.todo.exrule,wkst:"
+msgid "Thursday"
+msgstr "Jeudi"
+
+msgctxt "selection:calendar.todo.exrule,wkst:"
+msgid "Tuesday"
+msgstr "Mardi"
+
+msgctxt "selection:calendar.todo.exrule,wkst:"
+msgid "Wednesday"
+msgstr "Mercredi"
+
+msgctxt "selection:calendar.todo.rrule,freq:"
+msgid "Daily"
+msgstr "Journalier"
+
+msgctxt "selection:calendar.todo.rrule,freq:"
+msgid "Hourly"
+msgstr "Horaire"
+
+msgctxt "selection:calendar.todo.rrule,freq:"
+msgid "Minutely"
+msgstr "Chaque minute"
+
+msgctxt "selection:calendar.todo.rrule,freq:"
+msgid "Monthly"
+msgstr "Mensuel"
+
+msgctxt "selection:calendar.todo.rrule,freq:"
+msgid "Secondly"
+msgstr "Chaque seconde"
+
+msgctxt "selection:calendar.todo.rrule,freq:"
+msgid "Weekly"
+msgstr "hebdomadaire"
+
+msgctxt "selection:calendar.todo.rrule,freq:"
+msgid "Yearly"
+msgstr "Annuel"
+
+msgctxt "selection:calendar.todo.rrule,wkst:"
+msgid "Friday"
+msgstr "Vendredi"
+
+msgctxt "selection:calendar.todo.rrule,wkst:"
+msgid "Monday"
+msgstr "Lundi"
+
+msgctxt "selection:calendar.todo.rrule,wkst:"
+msgid "Saturday"
+msgstr "Samedi"
+
+msgctxt "selection:calendar.todo.rrule,wkst:"
+msgid "Sunday"
+msgstr "Dimanche"
+
+msgctxt "selection:calendar.todo.rrule,wkst:"
+msgid "Thursday"
+msgstr "Jeudi"
+
+msgctxt "selection:calendar.todo.rrule,wkst:"
+msgid "Tuesday"
+msgstr "Mardi"
+
+msgctxt "selection:calendar.todo.rrule,wkst:"
+msgid "Wednesday"
+msgstr "Mercredi"
+
 msgctxt "view:calendar.todo.attendee:"
 msgid "Attendee"
 msgstr "Participant"
@@ -603,10 +955,6 @@ msgid "Occurences"
 msgstr "Occurrences"
 
 msgctxt "view:calendar.todo:"
-msgid "Recurrences"
-msgstr "Récurrences"
-
-msgctxt "view:calendar.todo:"
 msgid "Todo"
 msgstr "Tâche"
 
diff --git a/locale/nl_NL.po b/locale/nl_NL.po
index c17980d..fcb4dec 100644
--- a/locale/nl_NL.po
+++ b/locale/nl_NL.po
@@ -2,12 +2,92 @@
 msgid ""
 msgstr "Content-Type: text/plain; charset=utf-8\n"
 
+msgctxt "error:calendar.todo.exrule:"
+msgid "Invalid \"By Day\" in recurrence rule \"%s\""
+msgstr ""
+
+msgctxt "error:calendar.todo.exrule:"
+msgid "Invalid \"By Hour\" in recurrence rule \"%s\""
+msgstr ""
+
+msgctxt "error:calendar.todo.exrule:"
+msgid "Invalid \"By Minute\" in recurrence rule \"%s\""
+msgstr ""
+
+msgctxt "error:calendar.todo.exrule:"
+msgid "Invalid \"By Month Day\" in recurrence rule \"%s\""
+msgstr ""
+
+msgctxt "error:calendar.todo.exrule:"
+msgid "Invalid \"By Month\" in recurrence rule \"%s\""
+msgstr ""
+
+msgctxt "error:calendar.todo.exrule:"
+msgid "Invalid \"By Position\" in recurrence rule \"%s\""
+msgstr ""
+
+msgctxt "error:calendar.todo.exrule:"
+msgid "Invalid \"By Second\" in recurrence rule \"%s\""
+msgstr ""
+
+msgctxt "error:calendar.todo.exrule:"
+msgid "Invalid \"By Week Number\" in recurrence rule \"%s\""
+msgstr ""
+
+msgctxt "error:calendar.todo.exrule:"
+msgid "Invalid \"By Year Day\" in recurrence rule \"%s\""
+msgstr ""
+
+msgctxt "error:calendar.todo.exrule:"
+msgid "Only one of \"until\" and \"count\" can be set."
+msgstr ""
+
+msgctxt "error:calendar.todo.rrule:"
+msgid "Invalid \"By Day\" in recurrence rule \"%s\""
+msgstr ""
+
+msgctxt "error:calendar.todo.rrule:"
+msgid "Invalid \"By Hour\" in recurrence rule \"%s\""
+msgstr ""
+
+msgctxt "error:calendar.todo.rrule:"
+msgid "Invalid \"By Minute\" in recurrence rule \"%s\""
+msgstr ""
+
+msgctxt "error:calendar.todo.rrule:"
+msgid "Invalid \"By Month Day\" in recurrence rule \"%s\""
+msgstr ""
+
+msgctxt "error:calendar.todo.rrule:"
+msgid "Invalid \"By Month\" in recurrence rule \"%s\""
+msgstr ""
+
+msgctxt "error:calendar.todo.rrule:"
+msgid "Invalid \"By Position\" in recurrence rule \"%s\""
+msgstr ""
+
+msgctxt "error:calendar.todo.rrule:"
+msgid "Invalid \"By Second\" in recurrence rule \"%s\""
+msgstr ""
+
+msgctxt "error:calendar.todo.rrule:"
+msgid "Invalid \"By Week Number\" in recurrence rule \"%s\""
+msgstr ""
+
+msgctxt "error:calendar.todo.rrule:"
+msgid "Invalid \"By Year Day\" in recurrence rule \"%s\""
+msgstr ""
+
+msgctxt "error:calendar.todo.rrule:"
+msgid "Only one of \"until\" and \"count\" can be set."
+msgstr ""
+
 msgctxt "error:calendar.todo:"
-msgid "Recurrence can not be recurrent!"
+msgid "Todo \"%s\" can not be recurrent."
 msgstr ""
 
 msgctxt "error:calendar.todo:"
-msgid "UUID and recurrence must be unique in a calendar!"
+msgid "UUID and recurrence must be unique in a calendar."
 msgstr ""
 
 msgctxt "field:calendar.todo,alarms:"
@@ -186,10 +266,6 @@ msgctxt "field:calendar.todo-calendar.category,write_uid:"
 msgid "Write User"
 msgstr ""
 
-msgctxt "field:calendar.todo.alarm,calendar_alarm:"
-msgid "Calendar Alarm"
-msgstr ""
-
 msgctxt "field:calendar.todo.alarm,create_date:"
 msgid "Create Date"
 msgstr ""
@@ -211,6 +287,10 @@ msgctxt "field:calendar.todo.alarm,todo:"
 msgid "Todo"
 msgstr ""
 
+msgctxt "field:calendar.todo.alarm,valarm:"
+msgid "valarm"
+msgstr ""
+
 msgctxt "field:calendar.todo.alarm,write_date:"
 msgid "Write Date"
 msgstr ""
@@ -219,8 +299,8 @@ msgctxt "field:calendar.todo.alarm,write_uid:"
 msgid "Write User"
 msgstr ""
 
-msgctxt "field:calendar.todo.attendee,calendar_attendee:"
-msgid "Calendar Attendee"
+msgctxt "field:calendar.todo.attendee,attendee:"
+msgid "attendee"
 msgstr ""
 
 msgctxt "field:calendar.todo.attendee,create_date:"
@@ -231,6 +311,11 @@ msgctxt "field:calendar.todo.attendee,create_uid:"
 msgid "Create User"
 msgstr ""
 
+#, fuzzy
+msgctxt "field:calendar.todo.attendee,email:"
+msgid "Email"
+msgstr "E-mail"
+
 msgctxt "field:calendar.todo.attendee,id:"
 msgid "ID"
 msgstr ""
@@ -240,6 +325,10 @@ msgctxt "field:calendar.todo.attendee,rec_name:"
 msgid "Name"
 msgstr "Naam bijlage"
 
+msgctxt "field:calendar.todo.attendee,status:"
+msgid "Participation Status"
+msgstr ""
+
 msgctxt "field:calendar.todo.attendee,todo:"
 msgid "Todo"
 msgstr ""
@@ -252,10 +341,6 @@ msgctxt "field:calendar.todo.attendee,write_uid:"
 msgid "Write User"
 msgstr ""
 
-msgctxt "field:calendar.todo.exdate,calendar_date:"
-msgid "Calendar Date"
-msgstr ""
-
 msgctxt "field:calendar.todo.exdate,create_date:"
 msgid "Create Date"
 msgstr ""
@@ -264,6 +349,15 @@ msgctxt "field:calendar.todo.exdate,create_uid:"
 msgid "Create User"
 msgstr ""
 
+msgctxt "field:calendar.todo.exdate,date:"
+msgid "Is Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.todo.exdate,datetime:"
+msgid "Date"
+msgstr "Vervaldatum"
+
 msgctxt "field:calendar.todo.exdate,id:"
 msgid "ID"
 msgstr ""
@@ -285,8 +379,44 @@ msgctxt "field:calendar.todo.exdate,write_uid:"
 msgid "Write User"
 msgstr ""
 
-msgctxt "field:calendar.todo.exrule,calendar_rrule:"
-msgid "Calendar RRule"
+msgctxt "field:calendar.todo.exrule,byday:"
+msgid "By Day"
+msgstr ""
+
+msgctxt "field:calendar.todo.exrule,byhour:"
+msgid "By Hour"
+msgstr ""
+
+msgctxt "field:calendar.todo.exrule,byminute:"
+msgid "By Minute"
+msgstr ""
+
+msgctxt "field:calendar.todo.exrule,bymonth:"
+msgid "By Month"
+msgstr ""
+
+msgctxt "field:calendar.todo.exrule,bymonthday:"
+msgid "By Month Day"
+msgstr ""
+
+msgctxt "field:calendar.todo.exrule,bysecond:"
+msgid "By Second"
+msgstr ""
+
+msgctxt "field:calendar.todo.exrule,bysetpos:"
+msgid "By Position"
+msgstr ""
+
+msgctxt "field:calendar.todo.exrule,byweekno:"
+msgid "By Week Number"
+msgstr ""
+
+msgctxt "field:calendar.todo.exrule,byyearday:"
+msgid "By Year Day"
+msgstr ""
+
+msgctxt "field:calendar.todo.exrule,count:"
+msgid "Count"
 msgstr ""
 
 msgctxt "field:calendar.todo.exrule,create_date:"
@@ -297,10 +427,18 @@ msgctxt "field:calendar.todo.exrule,create_uid:"
 msgid "Create User"
 msgstr ""
 
+msgctxt "field:calendar.todo.exrule,freq:"
+msgid "Frequency"
+msgstr ""
+
 msgctxt "field:calendar.todo.exrule,id:"
 msgid "ID"
 msgstr ""
 
+msgctxt "field:calendar.todo.exrule,interval:"
+msgid "Interval"
+msgstr ""
+
 #, fuzzy
 msgctxt "field:calendar.todo.exrule,rec_name:"
 msgid "Name"
@@ -310,6 +448,18 @@ msgctxt "field:calendar.todo.exrule,todo:"
 msgid "Todo"
 msgstr ""
 
+msgctxt "field:calendar.todo.exrule,until:"
+msgid "Until Date"
+msgstr ""
+
+msgctxt "field:calendar.todo.exrule,until_date:"
+msgid "Is Date"
+msgstr ""
+
+msgctxt "field:calendar.todo.exrule,wkst:"
+msgid "Week Day"
+msgstr ""
+
 msgctxt "field:calendar.todo.exrule,write_date:"
 msgid "Write Date"
 msgstr ""
@@ -318,10 +468,6 @@ msgctxt "field:calendar.todo.exrule,write_uid:"
 msgid "Write User"
 msgstr ""
 
-msgctxt "field:calendar.todo.rdate,calendar_date:"
-msgid "Calendar Date"
-msgstr ""
-
 msgctxt "field:calendar.todo.rdate,create_date:"
 msgid "Create Date"
 msgstr ""
@@ -330,6 +476,15 @@ msgctxt "field:calendar.todo.rdate,create_uid:"
 msgid "Create User"
 msgstr ""
 
+msgctxt "field:calendar.todo.rdate,date:"
+msgid "Is Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.todo.rdate,datetime:"
+msgid "Date"
+msgstr "Vervaldatum"
+
 msgctxt "field:calendar.todo.rdate,id:"
 msgid "ID"
 msgstr ""
@@ -351,8 +506,44 @@ msgctxt "field:calendar.todo.rdate,write_uid:"
 msgid "Write User"
 msgstr ""
 
-msgctxt "field:calendar.todo.rrule,calendar_rrule:"
-msgid "Calendar RRule"
+msgctxt "field:calendar.todo.rrule,byday:"
+msgid "By Day"
+msgstr ""
+
+msgctxt "field:calendar.todo.rrule,byhour:"
+msgid "By Hour"
+msgstr ""
+
+msgctxt "field:calendar.todo.rrule,byminute:"
+msgid "By Minute"
+msgstr ""
+
+msgctxt "field:calendar.todo.rrule,bymonth:"
+msgid "By Month"
+msgstr ""
+
+msgctxt "field:calendar.todo.rrule,bymonthday:"
+msgid "By Month Day"
+msgstr ""
+
+msgctxt "field:calendar.todo.rrule,bysecond:"
+msgid "By Second"
+msgstr ""
+
+msgctxt "field:calendar.todo.rrule,bysetpos:"
+msgid "By Position"
+msgstr ""
+
+msgctxt "field:calendar.todo.rrule,byweekno:"
+msgid "By Week Number"
+msgstr ""
+
+msgctxt "field:calendar.todo.rrule,byyearday:"
+msgid "By Year Day"
+msgstr ""
+
+msgctxt "field:calendar.todo.rrule,count:"
+msgid "Count"
 msgstr ""
 
 msgctxt "field:calendar.todo.rrule,create_date:"
@@ -363,10 +554,18 @@ msgctxt "field:calendar.todo.rrule,create_uid:"
 msgid "Create User"
 msgstr ""
 
+msgctxt "field:calendar.todo.rrule,freq:"
+msgid "Frequency"
+msgstr ""
+
 msgctxt "field:calendar.todo.rrule,id:"
 msgid "ID"
 msgstr ""
 
+msgctxt "field:calendar.todo.rrule,interval:"
+msgid "Interval"
+msgstr ""
+
 #, fuzzy
 msgctxt "field:calendar.todo.rrule,rec_name:"
 msgid "Name"
@@ -376,6 +575,18 @@ msgctxt "field:calendar.todo.rrule,todo:"
 msgid "Todo"
 msgstr ""
 
+msgctxt "field:calendar.todo.rrule,until:"
+msgid "Until Date"
+msgstr ""
+
+msgctxt "field:calendar.todo.rrule,until_date:"
+msgid "Is Date"
+msgstr ""
+
+msgctxt "field:calendar.todo.rrule,wkst:"
+msgid "Week Day"
+msgstr ""
+
 msgctxt "field:calendar.todo.rrule,write_date:"
 msgid "Write Date"
 msgstr ""
@@ -388,6 +599,22 @@ msgctxt "help:calendar.todo,uuid:"
 msgid "Universally Unique Identifier"
 msgstr ""
 
+msgctxt "help:calendar.todo.exdate,date:"
+msgid "Ignore time of field \"Date\", but handle as date only."
+msgstr ""
+
+msgctxt "help:calendar.todo.exrule,until_date:"
+msgid "Ignore time of field \"Until Date\", but handle as date only."
+msgstr ""
+
+msgctxt "help:calendar.todo.rdate,date:"
+msgid "Ignore time of field \"Date\", but handle as date only."
+msgstr ""
+
+msgctxt "help:calendar.todo.rrule,until_date:"
+msgid "Ignore time of field \"Until Date\", but handle as date only."
+msgstr ""
+
 msgctxt "model:calendar.todo,name:"
 msgid "Todo"
 msgstr ""
@@ -464,6 +691,142 @@ msgctxt "selection:calendar.todo,status:"
 msgid "Needs-Action"
 msgstr ""
 
+msgctxt "selection:calendar.todo.attendee,status:"
+msgid ""
+msgstr ""
+
+msgctxt "selection:calendar.todo.attendee,status:"
+msgid "Accepted"
+msgstr ""
+
+msgctxt "selection:calendar.todo.attendee,status:"
+msgid "Declined"
+msgstr ""
+
+msgctxt "selection:calendar.todo.attendee,status:"
+msgid "Delegated"
+msgstr ""
+
+msgctxt "selection:calendar.todo.attendee,status:"
+msgid "Needs Action"
+msgstr ""
+
+msgctxt "selection:calendar.todo.attendee,status:"
+msgid "Tentative"
+msgstr ""
+
+msgctxt "selection:calendar.todo.exrule,freq:"
+msgid "Daily"
+msgstr ""
+
+msgctxt "selection:calendar.todo.exrule,freq:"
+msgid "Hourly"
+msgstr ""
+
+msgctxt "selection:calendar.todo.exrule,freq:"
+msgid "Minutely"
+msgstr ""
+
+msgctxt "selection:calendar.todo.exrule,freq:"
+msgid "Monthly"
+msgstr ""
+
+msgctxt "selection:calendar.todo.exrule,freq:"
+msgid "Secondly"
+msgstr ""
+
+msgctxt "selection:calendar.todo.exrule,freq:"
+msgid "Weekly"
+msgstr ""
+
+msgctxt "selection:calendar.todo.exrule,freq:"
+msgid "Yearly"
+msgstr ""
+
+msgctxt "selection:calendar.todo.exrule,wkst:"
+msgid "Friday"
+msgstr ""
+
+msgctxt "selection:calendar.todo.exrule,wkst:"
+msgid "Monday"
+msgstr ""
+
+msgctxt "selection:calendar.todo.exrule,wkst:"
+msgid "Saturday"
+msgstr ""
+
+msgctxt "selection:calendar.todo.exrule,wkst:"
+msgid "Sunday"
+msgstr ""
+
+msgctxt "selection:calendar.todo.exrule,wkst:"
+msgid "Thursday"
+msgstr ""
+
+msgctxt "selection:calendar.todo.exrule,wkst:"
+msgid "Tuesday"
+msgstr ""
+
+msgctxt "selection:calendar.todo.exrule,wkst:"
+msgid "Wednesday"
+msgstr ""
+
+msgctxt "selection:calendar.todo.rrule,freq:"
+msgid "Daily"
+msgstr ""
+
+msgctxt "selection:calendar.todo.rrule,freq:"
+msgid "Hourly"
+msgstr ""
+
+msgctxt "selection:calendar.todo.rrule,freq:"
+msgid "Minutely"
+msgstr ""
+
+msgctxt "selection:calendar.todo.rrule,freq:"
+msgid "Monthly"
+msgstr ""
+
+msgctxt "selection:calendar.todo.rrule,freq:"
+msgid "Secondly"
+msgstr ""
+
+msgctxt "selection:calendar.todo.rrule,freq:"
+msgid "Weekly"
+msgstr ""
+
+msgctxt "selection:calendar.todo.rrule,freq:"
+msgid "Yearly"
+msgstr ""
+
+msgctxt "selection:calendar.todo.rrule,wkst:"
+msgid "Friday"
+msgstr ""
+
+msgctxt "selection:calendar.todo.rrule,wkst:"
+msgid "Monday"
+msgstr ""
+
+msgctxt "selection:calendar.todo.rrule,wkst:"
+msgid "Saturday"
+msgstr ""
+
+msgctxt "selection:calendar.todo.rrule,wkst:"
+msgid "Sunday"
+msgstr ""
+
+msgctxt "selection:calendar.todo.rrule,wkst:"
+msgid "Thursday"
+msgstr ""
+
+msgctxt "selection:calendar.todo.rrule,wkst:"
+msgid "Tuesday"
+msgstr ""
+
+msgctxt "selection:calendar.todo.rrule,wkst:"
+msgid "Wednesday"
+msgstr ""
+
 msgctxt "view:calendar.todo.attendee:"
 msgid "Attendee"
 msgstr ""
diff --git a/locale/ru_RU.po b/locale/ru_RU.po
index 54e0693..98c3d9f 100644
--- a/locale/ru_RU.po
+++ b/locale/ru_RU.po
@@ -2,13 +2,93 @@
 msgid ""
 msgstr "Content-Type: text/plain; charset=utf-8\n"
 
+msgctxt "error:calendar.todo.exrule:"
+msgid "Invalid \"By Day\" in recurrence rule \"%s\""
+msgstr "Некорректное значение \"В день\" в повторении \"%s\"."
+
+msgctxt "error:calendar.todo.exrule:"
+msgid "Invalid \"By Hour\" in recurrence rule \"%s\""
+msgstr "Некорректное значение \"В час\" в повторении \"%s\"."
+
+msgctxt "error:calendar.todo.exrule:"
+msgid "Invalid \"By Minute\" in recurrence rule \"%s\""
+msgstr "Некорректное значение \"В минуту\" в повторении \"%s\"."
+
+msgctxt "error:calendar.todo.exrule:"
+msgid "Invalid \"By Month Day\" in recurrence rule \"%s\""
+msgstr "Некорректное значение \"В день месяца\" в повторении \"%s\"."
+
+msgctxt "error:calendar.todo.exrule:"
+msgid "Invalid \"By Month\" in recurrence rule \"%s\""
+msgstr "Некорректное значение \"В месяц\" в повторении \"%s\"."
+
+msgctxt "error:calendar.todo.exrule:"
+msgid "Invalid \"By Position\" in recurrence rule \"%s\""
+msgstr "Некорректное значение \"По положению\" в повторении \"%s\"."
+
+msgctxt "error:calendar.todo.exrule:"
+msgid "Invalid \"By Second\" in recurrence rule \"%s\""
+msgstr "Некорректное значение \"В секунду\" в повторении \"%s\"."
+
+msgctxt "error:calendar.todo.exrule:"
+msgid "Invalid \"By Week Number\" in recurrence rule \"%s\""
+msgstr "Некорректное значение \"В неделю номер\" в повторении \"%s\"."
+
+msgctxt "error:calendar.todo.exrule:"
+msgid "Invalid \"By Year Day\" in recurrence rule \"%s\""
+msgstr "Некорректное значение \"В день года\" в повторении \"%s\"."
+
+msgctxt "error:calendar.todo.exrule:"
+msgid "Only one of \"until\" and \"count\" can be set."
+msgstr "Может быть задано только одно из полей - \"До даты\" или \"Кол-во\"."
+
+msgctxt "error:calendar.todo.rrule:"
+msgid "Invalid \"By Day\" in recurrence rule \"%s\""
+msgstr "Некорректное значение \"В день\" в повторении \"%s\"."
+
+msgctxt "error:calendar.todo.rrule:"
+msgid "Invalid \"By Hour\" in recurrence rule \"%s\""
+msgstr "Некорректное значение \"В час\" в повторении \"%s\"."
+
+msgctxt "error:calendar.todo.rrule:"
+msgid "Invalid \"By Minute\" in recurrence rule \"%s\""
+msgstr "Некорректное значение \"В минуту\" в повторении \"%s\"."
+
+msgctxt "error:calendar.todo.rrule:"
+msgid "Invalid \"By Month Day\" in recurrence rule \"%s\""
+msgstr "Некорректное значение \"В день месяца\" в повторении \"%s\"."
+
+msgctxt "error:calendar.todo.rrule:"
+msgid "Invalid \"By Month\" in recurrence rule \"%s\""
+msgstr "Некорректное значение \"В месяц\" в повторении \"%s\"."
+
+msgctxt "error:calendar.todo.rrule:"
+msgid "Invalid \"By Position\" in recurrence rule \"%s\""
+msgstr "Некорректное значение \"По положению\" в повторении \"%s\"."
+
+msgctxt "error:calendar.todo.rrule:"
+msgid "Invalid \"By Second\" in recurrence rule \"%s\""
+msgstr "Некорректное значение \"В секунду\" в повторении \"%s\"."
+
+msgctxt "error:calendar.todo.rrule:"
+msgid "Invalid \"By Week Number\" in recurrence rule \"%s\""
+msgstr "Некорректное значение \"В неделю номер\" в повторении \"%s\"."
+
+msgctxt "error:calendar.todo.rrule:"
+msgid "Invalid \"By Year Day\" in recurrence rule \"%s\""
+msgstr "Некорректное значение \"В день года\" в повторении \"%s\"."
+
+msgctxt "error:calendar.todo.rrule:"
+msgid "Only one of \"until\" and \"count\" can be set."
+msgstr "Может быть задано только одно из полей - \"До даты\" или \"Кол-во\"."
+
 msgctxt "error:calendar.todo:"
-msgid "Recurrence can not be recurrent!"
-msgstr ""
+msgid "Todo \"%s\" can not be recurrent."
+msgstr "Задача \"%s\" не может быть повторяемой."
 
 msgctxt "error:calendar.todo:"
-msgid "UUID and recurrence must be unique in a calendar!"
-msgstr ""
+msgid "UUID and recurrence must be unique in a calendar."
+msgstr "UUID и повторение должны быть уникальными в календаре."
 
 msgctxt "field:calendar.todo,alarms:"
 msgid "Alarms"
@@ -48,11 +128,11 @@ msgstr "Выполнен"
 
 msgctxt "field:calendar.todo,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Дата создания"
 
 msgctxt "field:calendar.todo,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Создано пользователем"
 
 msgctxt "field:calendar.todo,description:"
 msgid "Description"
@@ -76,7 +156,7 @@ msgstr "Правила исключения"
 
 msgctxt "field:calendar.todo,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:calendar.todo,location:"
 msgid "Location"
@@ -92,7 +172,7 @@ msgstr "Организатор"
 
 msgctxt "field:calendar.todo,parent:"
 msgid "Parent"
-msgstr "Основной"
+msgstr "Предок"
 
 msgctxt "field:calendar.todo,percent_complete:"
 msgid "Percent complete"
@@ -116,7 +196,7 @@ msgstr "Правила повторения"
 
 msgctxt "field:calendar.todo,sequence:"
 msgid "Sequence"
-msgstr "Последовательность"
+msgstr "Нумерация"
 
 msgctxt "field:calendar.todo,status:"
 msgid "Status"
@@ -132,7 +212,7 @@ msgstr "Зона времени"
 
 msgctxt "field:calendar.todo,uuid:"
 msgid "UUID"
-msgstr ""
+msgstr "UUID"
 
 msgctxt "field:calendar.todo,vtodo:"
 msgid "vtodo"
@@ -140,27 +220,27 @@ msgstr ""
 
 msgctxt "field:calendar.todo,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Дата изменения"
 
 msgctxt "field:calendar.todo,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Изменено пользователем"
 
 msgctxt "field:calendar.todo-calendar.category,category:"
 msgid "Category"
-msgstr "Категории"
+msgstr "Категория"
 
 msgctxt "field:calendar.todo-calendar.category,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Дата создания"
 
 msgctxt "field:calendar.todo-calendar.category,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Создано пользователем"
 
 msgctxt "field:calendar.todo-calendar.category,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:calendar.todo-calendar.category,rec_name:"
 msgid "Name"
@@ -172,27 +252,23 @@ msgstr "Дела"
 
 msgctxt "field:calendar.todo-calendar.category,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Дата изменения"
 
 msgctxt "field:calendar.todo-calendar.category,write_uid:"
 msgid "Write User"
-msgstr ""
-
-msgctxt "field:calendar.todo.alarm,calendar_alarm:"
-msgid "Calendar Alarm"
-msgstr "Сигнала календаря"
+msgstr "Изменено пользователем"
 
 msgctxt "field:calendar.todo.alarm,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Дата создания"
 
 msgctxt "field:calendar.todo.alarm,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Создано пользователем"
 
 msgctxt "field:calendar.todo.alarm,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:calendar.todo.alarm,rec_name:"
 msgid "Name"
@@ -202,61 +278,77 @@ msgctxt "field:calendar.todo.alarm,todo:"
 msgid "Todo"
 msgstr "Дело"
 
+msgctxt "field:calendar.todo.alarm,valarm:"
+msgid "valarm"
+msgstr ""
+
 msgctxt "field:calendar.todo.alarm,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Дата изменения"
 
 msgctxt "field:calendar.todo.alarm,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Изменено пользователем"
 
-msgctxt "field:calendar.todo.attendee,calendar_attendee:"
-msgid "Calendar Attendee"
-msgstr "Календарь участников"
+msgctxt "field:calendar.todo.attendee,attendee:"
+msgid "attendee"
+msgstr "участник"
 
 msgctxt "field:calendar.todo.attendee,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Дата создания"
 
 msgctxt "field:calendar.todo.attendee,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Создано пользователем"
+
+msgctxt "field:calendar.todo.attendee,email:"
+msgid "Email"
+msgstr "Эл.почта"
 
 msgctxt "field:calendar.todo.attendee,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:calendar.todo.attendee,rec_name:"
 msgid "Name"
 msgstr "Наименование"
 
+msgctxt "field:calendar.todo.attendee,status:"
+msgid "Participation Status"
+msgstr "Статус участия"
+
 msgctxt "field:calendar.todo.attendee,todo:"
 msgid "Todo"
 msgstr "Дело"
 
 msgctxt "field:calendar.todo.attendee,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Дата изменения"
 
 msgctxt "field:calendar.todo.attendee,write_uid:"
 msgid "Write User"
-msgstr ""
-
-msgctxt "field:calendar.todo.exdate,calendar_date:"
-msgid "Calendar Date"
-msgstr "День календаря"
+msgstr "Изменено пользователем"
 
 msgctxt "field:calendar.todo.exdate,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Дата создания"
 
 msgctxt "field:calendar.todo.exdate,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Создано пользователем"
+
+msgctxt "field:calendar.todo.exdate,date:"
+msgid "Is Date"
+msgstr "Только Дата"
+
+msgctxt "field:calendar.todo.exdate,datetime:"
+msgid "Date"
+msgstr "Дата"
 
 msgctxt "field:calendar.todo.exdate,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:calendar.todo.exdate,rec_name:"
 msgid "Name"
@@ -268,27 +360,71 @@ msgstr "Дело"
 
 msgctxt "field:calendar.todo.exdate,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Дата изменения"
 
 msgctxt "field:calendar.todo.exdate,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Изменено пользователем"
+
+msgctxt "field:calendar.todo.exrule,byday:"
+msgid "By Day"
+msgstr "В день"
+
+msgctxt "field:calendar.todo.exrule,byhour:"
+msgid "By Hour"
+msgstr "В час"
+
+msgctxt "field:calendar.todo.exrule,byminute:"
+msgid "By Minute"
+msgstr "В минуту"
+
+msgctxt "field:calendar.todo.exrule,bymonth:"
+msgid "By Month"
+msgstr "В месяц"
+
+msgctxt "field:calendar.todo.exrule,bymonthday:"
+msgid "By Month Day"
+msgstr "В день месяца"
+
+msgctxt "field:calendar.todo.exrule,bysecond:"
+msgid "By Second"
+msgstr "В секунду"
+
+msgctxt "field:calendar.todo.exrule,bysetpos:"
+msgid "By Position"
+msgstr "По положению"
+
+msgctxt "field:calendar.todo.exrule,byweekno:"
+msgid "By Week Number"
+msgstr "В неделю номер"
 
-msgctxt "field:calendar.todo.exrule,calendar_rrule:"
-msgid "Calendar RRule"
-msgstr "Правила календаря"
+msgctxt "field:calendar.todo.exrule,byyearday:"
+msgid "By Year Day"
+msgstr "В день года"
+
+msgctxt "field:calendar.todo.exrule,count:"
+msgid "Count"
+msgstr "Кол-во"
 
 msgctxt "field:calendar.todo.exrule,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Дата создания"
 
 msgctxt "field:calendar.todo.exrule,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Создано пользователем"
+
+msgctxt "field:calendar.todo.exrule,freq:"
+msgid "Frequency"
+msgstr "Повторение"
 
 msgctxt "field:calendar.todo.exrule,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
+
+msgctxt "field:calendar.todo.exrule,interval:"
+msgid "Interval"
+msgstr "Интервал"
 
 msgctxt "field:calendar.todo.exrule,rec_name:"
 msgid "Name"
@@ -298,29 +434,45 @@ msgctxt "field:calendar.todo.exrule,todo:"
 msgid "Todo"
 msgstr "Дело"
 
+msgctxt "field:calendar.todo.exrule,until:"
+msgid "Until Date"
+msgstr "До даты"
+
+msgctxt "field:calendar.todo.exrule,until_date:"
+msgid "Is Date"
+msgstr "Только Дата"
+
+msgctxt "field:calendar.todo.exrule,wkst:"
+msgid "Week Day"
+msgstr "День недели"
+
 msgctxt "field:calendar.todo.exrule,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Дата изменения"
 
 msgctxt "field:calendar.todo.exrule,write_uid:"
 msgid "Write User"
-msgstr ""
-
-msgctxt "field:calendar.todo.rdate,calendar_date:"
-msgid "Calendar Date"
-msgstr "День календаря"
+msgstr "Изменено пользователем"
 
 msgctxt "field:calendar.todo.rdate,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Дата создания"
 
 msgctxt "field:calendar.todo.rdate,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Создано пользователем"
+
+msgctxt "field:calendar.todo.rdate,date:"
+msgid "Is Date"
+msgstr "Только Дата"
+
+msgctxt "field:calendar.todo.rdate,datetime:"
+msgid "Date"
+msgstr "Дата"
 
 msgctxt "field:calendar.todo.rdate,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:calendar.todo.rdate,rec_name:"
 msgid "Name"
@@ -332,27 +484,71 @@ msgstr "Дело"
 
 msgctxt "field:calendar.todo.rdate,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Дата изменения"
 
 msgctxt "field:calendar.todo.rdate,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Изменено пользователем"
+
+msgctxt "field:calendar.todo.rrule,byday:"
+msgid "By Day"
+msgstr "В день"
+
+msgctxt "field:calendar.todo.rrule,byhour:"
+msgid "By Hour"
+msgstr "В час"
+
+msgctxt "field:calendar.todo.rrule,byminute:"
+msgid "By Minute"
+msgstr "В минуту"
+
+msgctxt "field:calendar.todo.rrule,bymonth:"
+msgid "By Month"
+msgstr "В месяц"
+
+msgctxt "field:calendar.todo.rrule,bymonthday:"
+msgid "By Month Day"
+msgstr "В день месяца"
+
+msgctxt "field:calendar.todo.rrule,bysecond:"
+msgid "By Second"
+msgstr "В секунду"
+
+msgctxt "field:calendar.todo.rrule,bysetpos:"
+msgid "By Position"
+msgstr "По положению"
+
+msgctxt "field:calendar.todo.rrule,byweekno:"
+msgid "By Week Number"
+msgstr "В неделю номер"
 
-msgctxt "field:calendar.todo.rrule,calendar_rrule:"
-msgid "Calendar RRule"
-msgstr "Правила календаря"
+msgctxt "field:calendar.todo.rrule,byyearday:"
+msgid "By Year Day"
+msgstr "В день года"
+
+msgctxt "field:calendar.todo.rrule,count:"
+msgid "Count"
+msgstr "Кол-во"
 
 msgctxt "field:calendar.todo.rrule,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Дата создания"
 
 msgctxt "field:calendar.todo.rrule,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Создано пользователем"
+
+msgctxt "field:calendar.todo.rrule,freq:"
+msgid "Frequency"
+msgstr "Повторение"
 
 msgctxt "field:calendar.todo.rrule,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
+
+msgctxt "field:calendar.todo.rrule,interval:"
+msgid "Interval"
+msgstr "Интервал"
 
 msgctxt "field:calendar.todo.rrule,rec_name:"
 msgid "Name"
@@ -362,17 +558,53 @@ msgctxt "field:calendar.todo.rrule,todo:"
 msgid "Todo"
 msgstr "Дело"
 
+msgctxt "field:calendar.todo.rrule,until:"
+msgid "Until Date"
+msgstr "До даты"
+
+msgctxt "field:calendar.todo.rrule,until_date:"
+msgid "Is Date"
+msgstr "Только Дата"
+
+msgctxt "field:calendar.todo.rrule,wkst:"
+msgid "Week Day"
+msgstr "День недели"
+
 msgctxt "field:calendar.todo.rrule,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Дата изменения"
 
 msgctxt "field:calendar.todo.rrule,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Изменено пользователем"
 
 msgctxt "help:calendar.todo,uuid:"
 msgid "Universally Unique Identifier"
-msgstr "Универсальный уникальный идентификатор"
+msgstr "Универсальный уникальный идентификатор (UUID)"
+
+msgctxt "help:calendar.todo.exdate,date:"
+msgid "Ignore time of field \"Date\", but handle as date only."
+msgstr ""
+"Если включено, то значение времени в поле \"Дата\" будет проигнорировано, "
+"будет использована только дата."
+
+msgctxt "help:calendar.todo.exrule,until_date:"
+msgid "Ignore time of field \"Until Date\", but handle as date only."
+msgstr ""
+"Если включено, то значение времени в поле \"До даты\" будет проигнорировано,"
+" будет использована только дата."
+
+msgctxt "help:calendar.todo.rdate,date:"
+msgid "Ignore time of field \"Date\", but handle as date only."
+msgstr ""
+"Если включено, то значение времени в поле \"Дата\" будет проигнорировано, "
+"будет использована только дата."
+
+msgctxt "help:calendar.todo.rrule,until_date:"
+msgid "Ignore time of field \"Until Date\", but handle as date only."
+msgstr ""
+"Если включено, то значение времени в поле \"До даты\" будет проигнорировано,"
+" будет использована только дата."
 
 msgctxt "model:calendar.todo,name:"
 msgid "Todo"
@@ -406,12 +638,10 @@ msgctxt "model:calendar.todo.rrule,name:"
 msgid "Recurrence Rule"
 msgstr "Правила повторения"
 
-#, fuzzy
 msgctxt "model:ir.action,name:act_todo_form"
 msgid "Todos"
 msgstr "Задачи"
 
-#, fuzzy
 msgctxt "model:ir.action,name:act_todo_form3"
 msgid "Todos"
 msgstr "Задачи"
@@ -452,6 +682,142 @@ msgctxt "selection:calendar.todo,status:"
 msgid "Needs-Action"
 msgstr "Требуется действие"
 
+msgctxt "selection:calendar.todo.attendee,status:"
+msgid ""
+msgstr ""
+
+msgctxt "selection:calendar.todo.attendee,status:"
+msgid "Accepted"
+msgstr "Принято"
+
+msgctxt "selection:calendar.todo.attendee,status:"
+msgid "Declined"
+msgstr "Отклонено"
+
+msgctxt "selection:calendar.todo.attendee,status:"
+msgid "Delegated"
+msgstr "Поручено"
+
+msgctxt "selection:calendar.todo.attendee,status:"
+msgid "Needs Action"
+msgstr "Требует вмешательства"
+
+msgctxt "selection:calendar.todo.attendee,status:"
+msgid "Tentative"
+msgstr "Предварительный"
+
+msgctxt "selection:calendar.todo.exrule,freq:"
+msgid "Daily"
+msgstr "Ежедневно"
+
+msgctxt "selection:calendar.todo.exrule,freq:"
+msgid "Hourly"
+msgstr "Ежечасно"
+
+msgctxt "selection:calendar.todo.exrule,freq:"
+msgid "Minutely"
+msgstr "Ежеминутно"
+
+msgctxt "selection:calendar.todo.exrule,freq:"
+msgid "Monthly"
+msgstr "Ежемесячно"
+
+msgctxt "selection:calendar.todo.exrule,freq:"
+msgid "Secondly"
+msgstr "Ежесекундно"
+
+msgctxt "selection:calendar.todo.exrule,freq:"
+msgid "Weekly"
+msgstr "Еженедельно"
+
+msgctxt "selection:calendar.todo.exrule,freq:"
+msgid "Yearly"
+msgstr "Ежегодно"
+
+msgctxt "selection:calendar.todo.exrule,wkst:"
+msgid "Friday"
+msgstr "Пятница"
+
+msgctxt "selection:calendar.todo.exrule,wkst:"
+msgid "Monday"
+msgstr "Понедельник"
+
+msgctxt "selection:calendar.todo.exrule,wkst:"
+msgid "Saturday"
+msgstr "Суббота"
+
+msgctxt "selection:calendar.todo.exrule,wkst:"
+msgid "Sunday"
+msgstr "Воскресенье"
+
+msgctxt "selection:calendar.todo.exrule,wkst:"
+msgid "Thursday"
+msgstr "Четверг"
+
+msgctxt "selection:calendar.todo.exrule,wkst:"
+msgid "Tuesday"
+msgstr "Вторник"
+
+msgctxt "selection:calendar.todo.exrule,wkst:"
+msgid "Wednesday"
+msgstr "Среда"
+
+msgctxt "selection:calendar.todo.rrule,freq:"
+msgid "Daily"
+msgstr "Ежедневно"
+
+msgctxt "selection:calendar.todo.rrule,freq:"
+msgid "Hourly"
+msgstr "Ежечасно"
+
+msgctxt "selection:calendar.todo.rrule,freq:"
+msgid "Minutely"
+msgstr "Ежеминутно"
+
+msgctxt "selection:calendar.todo.rrule,freq:"
+msgid "Monthly"
+msgstr "Ежемесячно"
+
+msgctxt "selection:calendar.todo.rrule,freq:"
+msgid "Secondly"
+msgstr "Ежесекундно"
+
+msgctxt "selection:calendar.todo.rrule,freq:"
+msgid "Weekly"
+msgstr "Еженедельно"
+
+msgctxt "selection:calendar.todo.rrule,freq:"
+msgid "Yearly"
+msgstr "Ежегодно"
+
+msgctxt "selection:calendar.todo.rrule,wkst:"
+msgid "Friday"
+msgstr "Пятница"
+
+msgctxt "selection:calendar.todo.rrule,wkst:"
+msgid "Monday"
+msgstr "Понедельник"
+
+msgctxt "selection:calendar.todo.rrule,wkst:"
+msgid "Saturday"
+msgstr "Суббота"
+
+msgctxt "selection:calendar.todo.rrule,wkst:"
+msgid "Sunday"
+msgstr "Воскресенье"
+
+msgctxt "selection:calendar.todo.rrule,wkst:"
+msgid "Thursday"
+msgstr "Четверг"
+
+msgctxt "selection:calendar.todo.rrule,wkst:"
+msgid "Tuesday"
+msgstr "Вторник"
+
+msgctxt "selection:calendar.todo.rrule,wkst:"
+msgid "Wednesday"
+msgstr "Среда"
+
 msgctxt "view:calendar.todo.attendee:"
 msgid "Attendee"
 msgstr "Участник"
diff --git a/setup.py b/setup.py
index 9036958..c64c9d6 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_todo',
     version=info.get('version', '0.0.1'),
@@ -36,16 +36,16 @@ setup(name='trytond_calendar_todo',
     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_todo': '.'},
     packages=[
         'trytond.modules.calendar_todo',
         'trytond.modules.calendar_todo.tests',
         ],
     package_data={
-        'trytond.modules.calendar_todo': info.get('xml', []) \
-            + ['tryton.cfg', 'locale/*.po'],
+        'trytond.modules.calendar_todo': (info.get('xml', [])
+            + ['tryton.cfg', 'view/*.xml', 'locale/*.po']),
         },
     classifiers=[
         'Development Status :: 5 - Production/Stable',
@@ -57,6 +57,7 @@ setup(name='trytond_calendar_todo',
         '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/todo.py b/todo.py
index dd97700..1a81bbc 100644
--- a/todo.py
+++ b/todo.py
@@ -12,6 +12,8 @@ from trytond.backend import TableHandler
 from trytond.pyson import Eval, If, Bool
 from trytond.transaction import Transaction
 from trytond.pool import Pool
+from trytond.modules.calendar import AlarmMixin, DateMixin, RRuleMixin, \
+    AttendeeMixin
 
 __all__ = ['Todo', 'TodoCategory', 'TodoRDate', 'TodoRRule', 'TodoExDate',
     'TodoExRule', 'TodoAttendee', 'TodoAlarm']
@@ -117,13 +119,10 @@ class Todo(ModelSQL, ModelView):
         cls._sql_constraints = [
             #XXX should be unique across all componenets
             ('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': 'Todo "%s" can not be recurrent.',
                 })
 
     @classmethod
@@ -136,7 +135,6 @@ class Todo(ModelSQL, ModelView):
             models_data = ModelData.search([
                 ('fs_id', '=', 'rule_group_read_todo_line3'),
                 ('module', '=', module_name),
-                ('inherit', '=', None),
                 ], limit=1)
             if models_data:
                 model_data, = models_data
@@ -191,6 +189,12 @@ class Todo(ModelSQL, ModelView):
     def search_calendar_field(cls, name, clause):
         return [('calendar.' + name[9:],) + tuple(clause[1:])]
 
+    @classmethod
+    def validate(cls, todos):
+        super(todos, cls).validate(todos)
+        for todo in todos:
+            todo.check_recurrence()
+
     def check_recurrence(self):
         '''
         Check the recurrence is not recurrent.
@@ -202,63 +206,64 @@ class Todo(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')
 
-        todo = super(Todo, cls).create(values)
-        if (todo.calendar.owner
-                and (todo.organizer == todo.calendar.owner.email
-                    or (todo.parent
-                        and todo.parent.organizer == \
-                            todo.parent.calendar.owner.email))):
-            if todo.organizer == todo.calendar.owner.email:
-                attendee_emails = [x.email for x in todo.attendees
-                        if x.status != 'declined'
-                        and x.email != todo.organizer]
-            else:
-                attendee_emails = [x.email for x in todo.parent.attendees
-                        if x.status != 'declined'
-                        and x.email != todo.parent.organizer]
-            if attendee_emails:
-                with Transaction().set_user(0):
-                    calendars = Calendar.search([
-                        ('owner.email', 'in', attendee_emails),
-                        ])
-                    if not todo.recurrence:
-                        for calendar in calendars:
-                            new_todo, = cls.copy([todo], default={
-                                'calendar': calendar.id,
-                                'occurences': None,
-                                'uuid': todo.uuid,
-                                })
-                            for occurence in todo.occurences:
-                                cls.copy([occurence], default={
+        todos = super(Todo, cls).create(vlist)
+        for todo in todos:
+            if (todo.calendar.owner
+                    and (todo.organizer == todo.calendar.owner.email
+                        or (todo.parent
+                            and todo.parent.organizer
+                            == todo.parent.calendar.owner.email))):
+                if todo.organizer == todo.calendar.owner.email:
+                    attendee_emails = [x.email for x in todo.attendees
+                            if x.status != 'declined'
+                            and x.email != todo.organizer]
+                else:
+                    attendee_emails = [x.email for x in todo.parent.attendees
+                            if x.status != 'declined'
+                            and x.email != todo.parent.organizer]
+                if attendee_emails:
+                    with Transaction().set_user(0):
+                        calendars = Calendar.search([
+                            ('owner.email', 'in', attendee_emails),
+                            ])
+                        if not todo.recurrence:
+                            for calendar in calendars:
+                                new_todo, = cls.copy([todo], default={
                                     'calendar': calendar.id,
-                                    'parent': new_todo.id,
-                                    'uuid': occurence.uuid,
+                                    'occurences': None,
+                                    'uuid': todo.uuid,
+                                    })
+                                for occurence in todo.occurences:
+                                    cls.copy([occurence], default={
+                                        'calendar': calendar.id,
+                                        'parent': new_todo.id,
+                                        'uuid': occurence.uuid,
+                                        })
+                        else:
+                            parents = cls.search([
+                                    ('uuid', '=', todo.uuid),
+                                    ('calendar.owner.email', 'in',
+                                        attendee_emails),
+                                    ('id', '!=', todo.id),
+                                    ('recurrence', '=', None),
+                                    ])
+                            for parent in parents:
+                                cls.copy([todo], default={
+                                    'calendar': parent.calendar.id,
+                                    'parent': parent.id,
+                                    'uuid': todo.uuid,
                                     })
-                    else:
-                        parents = cls.search([
-                            ('uuid', '=', todo.uuid),
-                            ('calendar.owner.email', 'in', attendee_emails),
-                            ('id', '!=', todo.id),
-                            ('recurrence', '=', None),
-                            ])
-                        for parent in parents:
-                            cls.copy([todo], default={
-                                'calendar': parent.calendar.id,
-                                'parent': parent.id,
-                                'uuid': todo.uuid,
-                                })
         # Restart the cache for todo
         Collection._todo_cache.clear()
-        return todo
+        return todos
 
     def _todo2update(self):
         res = {}
@@ -271,21 +276,21 @@ class Todo(ModelSQL, ModelView):
         res['status'] = self.status
         res['organizer'] = self.organizer
         res['rdates'] = [('delete_all',)]
-        for rdate in self.rdates:
-            vals = rdate._date2update()
-            res['rdates'].append(('create', vals))
+        to_create = [rdate._date2update() for rdate in self.rdates]
+        if to_create:
+            res['rdates'].append(('create', to_create))
         res['exdates'] = [('delete_all',)]
-        for exdate in self.exdates:
-            vals = exdate._date2update()
-            res['exdates'].append(('create', vals))
+        to_create = [exdate._date2update() for exdate in self.exdates]
+        if to_create:
+            res['exdates'].append(('create', to_create))
         res['rrules'] = [('delete_all',)]
-        for rrule in self.rrules:
-            vals = rrule._rule2update()
-            res['rrules'].append(('create', vals))
+        to_create = [rrule._rule2update() for rrule in self.rrules]
+        if to_create:
+            res['rrules'].append(('create', to_create))
         res['exrules'] = [('delete_all',)]
-        for exrule in self.exrules:
-            vals = exrule._rule2update()
-            res['exrules'].append(('create', vals))
+        to_create = [exrule._rule2update() for exrule in self.exrules]
+        if to_create:
+            res['exrules'].append(('create', to_create))
         return res
 
     @classmethod
@@ -306,15 +311,16 @@ class Todo(ModelSQL, ModelView):
         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 "' + cls._table + '" ' \
-                    'SET sequence = sequence + 1 ' \
-                    'WHERE ' + red_sql, red_ids)
+            cursor.execute('UPDATE "' + cls._table + '" '
+                'SET sequence = sequence + 1 '
+                'WHERE ' + red_sql, red_ids)
 
         for todo in todos:
-            if todo.calendar.owner \
-                    and (todo.organizer == todo.calendar.owner.email \
-                    or (todo.parent \
-                    and todo.parent.organizer == todo.calendar.owner.email)):
+            if (todo.calendar.owner
+                    and (todo.organizer == todo.calendar.owner.email
+                        or (todo.parent
+                            and todo.parent.organizer
+                            == todo.calendar.owner.email))):
                 if todo.organizer == todo.calendar.owner.email:
                     attendee_emails = [x.email for x in todo.attendees
                             if x.status != 'declined'
@@ -378,10 +384,11 @@ class Todo(ModelSQL, ModelView):
         Collection = pool.get('webdav.collection')
 
         for todo in todos:
-            if todo.calendar.owner \
-                    and (todo.organizer == todo.calendar.owner.email \
-                    or (todo.parent \
-                    and todo.parent.organizer == todo.calendar.owner.email)):
+            if (todo.calendar.owner
+                    and (todo.organizer == todo.calendar.owner.email
+                        or (todo.parent
+                            and todo.parent.organizer
+                            == todo.calendar.owner.email))):
                 if todo.organizer == todo.calendar.owner.email:
                     attendee_emails = [x.email for x in todo.attendees
                             if x.email != todo.organizer]
@@ -522,7 +529,7 @@ class Todo(ModelSQL, ModelView):
             else:
                 if vtodo.recurrence_id.value.tzinfo:
                     res['recurrence'] = \
-                            vtodo.recurrence_id.value.astimezone(tzlocal)
+                        vtodo.recurrence_id.value.astimezone(tzlocal)
                 else:
                     res['recurrence'] = vtodo.recurrence_id.value
         else:
@@ -538,11 +545,14 @@ class Todo(ModelSQL, ModelView):
             category_names2ids = {}
             for category in categories:
                 category_names2ids[category.name] = category.id
+            to_create = []
             for category in vtodo.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', [c.id for c in categories])]
         else:
             res['categories'] = [('unlink_all',)]
@@ -559,9 +569,9 @@ class Todo(ModelSQL, ModelView):
                 ('name', '=', vtodo.location.value),
                 ], limit=1)
             if not locations:
-                location, = Location.create({
-                    'name': vtodo.location.value,
-                    })
+                location, = Location.create([{
+                            'name': vtodo.location.value,
+                            }])
             else:
                 location, = locations
             res['location'] = location.id
@@ -584,6 +594,7 @@ class Todo(ModelSQL, ModelView):
                 attendees_todel[attendee.email] = attendee.id
         res['attendees'] = []
         if hasattr(vtodo, 'attendee'):
+            to_create = []
             while vtodo.attendee_list:
                 attendee = vtodo.attendee_list.pop()
                 vals = Attendee.attendee2values(attendee)
@@ -592,56 +603,67 @@ class Todo(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 todo:
             res['rdates'].append(('delete', [x.id for x in todo.rdates]))
         if hasattr(vtodo, 'rdate'):
+            to_create = []
             while vtodo.rdate_list:
                 rdate = vtodo.rdate_list.pop()
-                for date in rdate.value:
-                    vals = Rdate.date2values(date)
-                    res['rdates'].append(('create', vals))
+                to_create += [Rdate.date2values(date) for date in rdate.value]
+            if to_create:
+                res['rdates'].append(('create', to_create))
 
         res['exdates'] = []
         if todo:
             res['exdates'].append(('delete', [x.id for x in todo.exdates]))
         if hasattr(vtodo, 'exdate'):
+            to_create = []
             while vtodo.exdate_list:
                 exdate = vtodo.exdate_list.pop()
-                for date in exdate.value:
-                    vals = Exdate.date2values(date)
-                    res['exdates'].append(('create', vals))
+                to_create += [Exdate.date2values(date)
+                    for date in exdate.value]
+            if to_create:
+                res['exdates'].append(('create', to_create))
 
         res['rrules'] = []
         if todo:
             res['rrules'].append(('delete', [x.id for x in todo.rrules]))
         if hasattr(vtodo, 'rrule'):
+            to_create = []
             while vtodo.rrule_list:
                 rrule = vtodo.rrule_list.pop()
-                vals = Rrule.rule2values(rrule)
-                res['rrules'].append(('create', vals))
+                to_create.append(Rrule.rule2values(rrule))
+            if to_create:
+                res['rrules'].append(('create', to_create))
 
         res['exrules'] = []
         if todo:
             res['exrules'].append(('delete', [x.id for x in todo.exrules]))
         if hasattr(vtodo, 'exrule'):
+            to_create = []
             while vtodo.exrule_list:
                 exrule = vtodo.exrule_list.pop()
-                vals = Exrule.rule2values(exrule)
-                res['exrules'].append(('create', vals))
+                to_create.append(Exrule.rule2values(exrule))
+            if to_create:
+                res['exrules'].append(('create', to_create))
 
         if todo:
             res.setdefault('alarms', [])
             res['alarms'].append(('delete', [x.id for x in todo.alarms]))
         if hasattr(vtodo, 'valarm'):
             res.setdefault('alarms', [])
+            to_create = []
             while vtodo.valarm_list:
                 valarm = vtodo.valarm_list.pop()
-                vals = Alarm.valarm2values(valarm)
-                res['alarms'].append(('create', vals))
+                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:
@@ -656,6 +678,7 @@ class Todo(ModelSQL, ModelView):
         occurences_todel = []
         if todo:
             occurences_todel = [x.id for x in todo.occurences]
+        to_create = []
         for vtodo in vtodos:
             todo_id = None
             if todo:
@@ -673,7 +696,9 @@ class Todo(ModelSQL, ModelView):
             if todo_id:
                 res['occurences'].append(('write', todo_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'].append(('delete', occurences_todel))
@@ -723,7 +748,7 @@ class Todo(ModelSQL, ModelView):
             if not hasattr(vtodo, 'completed'):
                 vtodo.add('completed')
             vtodo.completed.value = self.completed.replace(tzinfo=tzlocal)\
-                    .astimezone(tzutc)
+                .astimezone(tzutc)
         elif hasattr(vtodo, 'completed'):
             del vtodo.completed
 
@@ -731,7 +756,7 @@ class Todo(ModelSQL, ModelView):
             if not hasattr(vtodo, 'dtstart'):
                 vtodo.add('dtstart')
             vtodo.dtstart.value = self.dtstart.replace(tzinfo=tzlocal)\
-                    .astimezone(tztodo)
+                .astimezone(tztodo)
         elif hasattr(vtodo, 'dtstart'):
             del vtodo.dtstart
 
@@ -739,7 +764,7 @@ class Todo(ModelSQL, ModelView):
             if not hasattr(vtodo, 'due'):
                 vtodo.add('due')
             vtodo.due.value = self.due.replace(tzinfo=tzlocal)\
-                    .astimezone(tztodo)
+                .astimezone(tztodo)
         elif hasattr(vtodo, 'due'):
             del vtodo.due
 
@@ -759,7 +784,7 @@ class Todo(ModelSQL, ModelView):
             if not hasattr(vtodo, 'recurrence-id'):
                 vtodo.add('recurrence-id')
             vtodo.recurrence_id.value = self.recurrence\
-                    .replace(tzinfo=tzlocal).astimezone(tztodo)
+                .replace(tzinfo=tzlocal).astimezone(tztodo)
         elif hasattr(vtodo, 'recurrence-id'):
             del vtodo.recurrence_id
         if self.status:
@@ -845,13 +870,10 @@ class TodoCategory(ModelSQL):
             ondelete='CASCADE', required=True, select=True)
 
 
-class TodoRDate(ModelSQL, ModelView):
+class TodoRDate(DateMixin, ModelSQL, ModelView):
     'Todo Recurrence Date'
     __name__ = 'calendar.todo.rdate'
-    _inherits = {'calendar.date': 'calendar_date'}
     _rec_name = 'datetime'
-    calendar_date = fields.Many2One('calendar.date', 'Calendar Date',
-            required=True, ondelete='CASCADE', select=True)
     todo = fields.Many2One('calendar.todo', 'Todo', ondelete='CASCADE',
             select=True, required=True)
 
@@ -866,13 +888,30 @@ class TodoRDate(ModelSQL, ModelView):
 
         super(TodoRDate, 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):
         Todo = Pool().get('calendar.todo')
-        if values.get('todo'):
-            # Update write_date of todo
-            Todo.write([Todo(values['todo'])], {})
-        return super(TodoRDate, cls).create(values)
+        towrite = []
+        for values in vlist:
+            if values.get('todo'):
+                # Update write_date of todo
+                towrite.append(values['todo'])
+        if towrite:
+            Todo.write(Todo.browse(towrite), {})
+        return super(TodoRDate, cls).create(vlist)
 
     @classmethod
     def write(cls, rdates, values):
@@ -889,47 +928,50 @@ class TodoRDate(ModelSQL, ModelView):
     def delete(cls, todo_rdates):
         pool = Pool()
         Todo = pool.get('calendar.todo')
-        Rdate = pool.get('calendar.date')
-        rdates = [a.calendar_date for a in todo_rdates]
         todos = [x.todo for x in todo_rdates]
         if todos:
             # Update write_date of todo
             Todo.write(todos, {})
         super(TodoRDate, cls).delete(todo_rdates)
-        if rdates:
-            Rdate.delete(rdates)
 
-    def _date2update(self):
-        return self.calendar_date._date2update()
-
-    @classmethod
-    def date2values(cls, date):
-        Date = Pool().get('calendar.date')
-        return Date.date2values(date.calendar_date)
-
-    @classmethod
-    def date2date(cls, date):
-        Date = Pool().get('calendar.date')
-        return Date.date2date(date.calendar_date)
 
-
-class TodoRRule(ModelSQL, ModelView):
+class TodoRRule(RRuleMixin, ModelSQL, ModelView):
     'Recurrence Rule'
     __name__ = 'calendar.todo.rrule'
-    _inherits = {'calendar.rrule': 'calendar_rrule'}
     _rec_name = 'freq'
-    calendar_rrule = fields.Many2One('calendar.rrule', 'Calendar RRule',
-            required=True, ondelete='CASCADE', select=True)
     todo = fields.Many2One('calendar.todo', 'Todo', ondelete='CASCADE',
             select=True, required=True)
 
     @classmethod
-    def create(cls, values):
+    def __register__(cls, module_name):
+        cursor = Transaction().cursor
+
+        super(TodoRRule, 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):
         Todo = Pool().get('calendar.todo')
-        if values.get('todo'):
-            # Update write_date of todo
-            Todo.write([Todo(values['todo'])], {})
-        return super(TodoRRule, cls).create(values)
+        towrite = []
+        for values in vlist:
+            if values.get('todo'):
+                # Update write_date of todo
+                towrite.append(values['todo'])
+        if towrite:
+            Todo.write(Todo.browse(towrite), {})
+        return super(TodoRRule, cls).create(vlist)
 
     @classmethod
     def write(cls, todo_rrules, values):
@@ -946,28 +988,11 @@ class TodoRRule(ModelSQL, ModelView):
     def delete(cls, todo_rrules):
         pool = Pool()
         Todo = pool.get('calendar.todo')
-        Rrule = pool.get('calendar.rrule')
-        rrules = [a.calendar_rrule for a in todo_rrules]
         todos = [x.todo for x in todo_rrules]
         if todos:
             # Update write_date of todo
             Todo.write(todos, {})
         super(TodoRRule, cls).delete(todo_rrules)
-        if rrules:
-            Rrule.delete(rrules)
-
-    def _rule2update(self):
-        return self.calendar_rrule._rule2update()
-
-    @classmethod
-    def rule2values(cls, rule):
-        Rule = Pool().get('calendar.rrule')
-        return Rule.rule2values(rule.calendar_rrule)
-
-    @classmethod
-    def rule2rule(cls, rule):
-        Rule = Pool().get('calendar.rrule')
-        return Rule.rule2rule(rule.calendar_rrule)
 
 
 class TodoExDate(TodoRDate):
@@ -982,48 +1007,69 @@ class TodoExRule(TodoRRule):
     _table = 'calendar_todo_exrule'  # Needed to override TodoRRule._table
 
 
-class TodoAttendee(ModelSQL, ModelView):
+class TodoAttendee(AttendeeMixin, ModelSQL, ModelView):
     'Attendee'
     __name__ = 'calendar.todo.attendee'
-    _inherits = {'calendar.attendee': 'calendar_attendee'}
-    calendar_attendee = fields.Many2One('calendar.attendee',
-        'Calendar Attendee', required=True, ondelete='CASCADE', select=True)
     todo = fields.Many2One('calendar.todo', 'Todo', ondelete='CASCADE',
             required=True, select=True)
 
     @classmethod
-    def create(cls, values):
+    def __register__(cls, module_name):
+        cursor = Transaction().cursor
+
+        super(TodoAttendee, 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):
         Todo = Pool().get('calendar.todo')
 
-        if values.get('todo'):
-            # Update write_date of todo
-            Todo.write([Todo(values['todo'])], {})
-        attendee = super(TodoAttendee, cls).create(values)
-        todo = attendee.todo
-        if (todo.calendar.owner
-                and (todo.organizer == todo.calendar.owner.email
-                    or (todo.parent
-                        and todo.parent.organizer == \
-                            todo.parent.calendar.owner.email))):
-            if todo.organizer == todo.calendar.owner.email:
-                attendee_emails = [x.email for x in todo.attendees
-                        if x.email != todo.organizer]
-            else:
-                attendee_emails = [x.email for x in todo.parent.attendees
-                        if x.email != todo.parent.organizer]
-            if attendee_emails:
-                with Transaction().set_user(0):
-                    todos = Todo.search([
-                        ('uuid', '=', todo.uuid),
-                        ('calendar.owner.email', 'in', attendee_emails),
-                        ('id', '!=', todo.id),
-                        ('recurrence', '=', todo.recurrence),
-                        ])
-                    for todo in todos:
-                        cls.copy([attendee], default={
-                            'todo': todo.id,
-                            })
-        return attendee
+        towrite = []
+        for values in vlist:
+            if values.get('todo'):
+                # Update write_date of todo
+                towrite.append(values['todo'])
+        if towrite:
+            Todo.write(Todo.browse(towrite), {})
+        attendees = super(TodoAttendee, cls).create(vlist)
+        for attendee in attendees:
+            todo = attendee.todo
+            if (todo.calendar.owner
+                    and (todo.organizer == todo.calendar.owner.email
+                        or (todo.parent
+                            and todo.parent.organizer
+                            == todo.parent.calendar.owner.email))):
+                if todo.organizer == todo.calendar.owner.email:
+                    attendee_emails = [x.email for x in todo.attendees
+                            if x.email != todo.organizer]
+                else:
+                    attendee_emails = [x.email for x in todo.parent.attendees
+                            if x.email != todo.parent.organizer]
+                if attendee_emails:
+                    with Transaction().set_user(0):
+                        todos = Todo.search([
+                            ('uuid', '=', todo.uuid),
+                            ('calendar.owner.email', 'in', attendee_emails),
+                            ('id', '!=', todo.id),
+                            ('recurrence', '=', todo.recurrence),
+                            ])
+                        for todo in todos:
+                            cls.copy([attendee], default={
+                                'todo': todo.id,
+                                })
+        return attendees
 
     @classmethod
     def write(cls, attendees, values):
@@ -1043,10 +1089,11 @@ class TodoAttendee(ModelSQL, ModelView):
         super(TodoAttendee, cls).write(attendees, values)
         for attendee in attendees:
             todo = attendee.todo
-            if todo.calendar.owner \
-                    and (todo.organizer == todo.calendar.owner.email \
-                    or (todo.parent \
-                    and todo.parent.organizer == todo.calendar.owner.email)):
+            if (todo.calendar.owner
+                    and (todo.organizer == todo.calendar.owner.email
+                        or (todo.parent
+                            and todo.parent.organizer
+                            == todo.calendar.owner.email))):
                 if todo.organizer == todo.calendar.owner.email:
                     attendee_emails = [x.email for x in todo.attendees
                             if x.email != todo.organizer]
@@ -1056,22 +1103,20 @@ class TodoAttendee(ModelSQL, ModelView):
                 if attendee_emails:
                     with Transaction().set_user(0):
                         attendees2 = cls.search([
-                            ('todo.uuid', '=', todo.uuid),
-                            ('todo.calendar.owner.email', 'in',
+                                ('todo.uuid', '=', todo.uuid),
+                                ('todo.calendar.owner.email', 'in',
                                     attendee_emails),
-                            ('id', '!=', attendee.id),
-                            ('todo.recurrence', '=', todo.recurrence),
-                            ('email', '=', attendee.email),
-                            ])
+                                ('id', '!=', attendee.id),
+                                ('todo.recurrence', '=', todo.recurrence),
+                                ('email', '=', attendee.email),
+                                ])
                         cls.write(attendees2, attendee._attendee2update())
 
     @classmethod
     def delete(cls, todo_attendees):
         pool = Pool()
         Todo = pool.get('calendar.todo')
-        Attendee = pool.get('calendar.attendee')
 
-        calendar_attendees = [a.calendar_attendee for a in todo_attendees]
         todos = [x.todo for x in todo_attendees]
         if todos:
             # Update write_date of todo
@@ -1079,10 +1124,11 @@ class TodoAttendee(ModelSQL, ModelView):
 
         for attendee in todo_attendees:
             todo = attendee.todo
-            if todo.calendar.owner \
-                    and (todo.organizer == todo.calendar.owner.email \
-                    or (todo.parent \
-                    and todo.parent.organizer == todo.calendar.owner.email)):
+            if (todo.calendar.owner
+                    and (todo.organizer == todo.calendar.owner.email
+                        or (todo.parent
+                            and todo.parent.organizer
+                            == todo.calendar.owner.email))):
                 if todo.organizer == todo.calendar.owner.email:
                     attendee_emails = [x.email for x in todo.attendees
                             if x.email != todo.organizer]
@@ -1100,10 +1146,10 @@ class TodoAttendee(ModelSQL, ModelView):
                             ('email', '=', attendee.email),
                             ])
                         cls.delete(attendees)
-            elif todo.calendar.organizer \
-                    and ((todo.organizer \
-                    or (todo.parent and todo.parent.organizer)) \
-                    and attendee.email == todo.calendar.owner.email):
+            elif (todo.calendar.organizer
+                    and ((todo.organizer
+                            or (todo.parent and todo.parent.organizer))
+                        and attendee.email == todo.calendar.owner.email)):
                 if todo.organizer:
                     organizer = todo.organizer
                 else:
@@ -1121,55 +1167,41 @@ class TodoAttendee(ModelSQL, ModelView):
                             'status': 'declined',
                             })
         super(TodoAttendee, cls).delete(todo_attendees)
-        if calendar_attendees:
-            Attendee.delete(calendar_attendees)
-
-    @classmethod
-    def copy(cls, todo_attendees, default=None):
-        Attendee = Pool().get('calendar.attendee')
 
-        if default is None:
-            default = {}
-        default = default.copy()
-        new_attendees = []
-        for attendee in todo_attendees:
-            default['calendar_attendee'], = Attendee.copy(
-                [attendee.calendar_attendee])
-            new_attendee, = super(TodoAttendee, cls).copy([attendee],
-                default=default)
-            new_attendees.append(new_attendee)
-        return new_attendees
 
-    def _attendee2update(self):
-        return self.calendar_attendee._attendee2update()
+class TodoAlarm(AlarmMixin, ModelSQL, ModelView):
+    'Alarm'
+    __name__ = 'calendar.todo.alarm'
+    todo = fields.Many2One('calendar.todo', 'Todo', ondelete='CASCADE',
+            required=True, select=True)
 
     @classmethod
-    def attendee2values(cls, attendee):
-        Attendee = Pool().get('calendar.attendee')
-        return Attendee.attendee2values(attendee.calendar_attendee)
+    def __register__(cls, module_name):
+        cursor = Transaction().cursor
 
-    @classmethod
-    def attendee2attendee(cls, attendee):
-        Attendee = Pool().get('calendar.attendee')
-        return Attendee.attendee2attendee(attendee.calendar_attendee)
+        super(TodoAlarm, cls).__register__(module_name)
 
+        table = TableHandler(cursor, cls, module_name)
 
-class TodoAlarm(ModelSQL):
-    'Alarm'
-    __name__ = 'calendar.todo.alarm'
-    _inherits = {'calendar.alarm': 'calendar_alarm'}
-    calendar_alarm = fields.Many2One('calendar.alarm', 'Calendar Alarm',
-            required=True, ondelete='CASCADE', select=True)
-    todo = fields.Many2One('calendar.todo', 'Todo', ondelete='CASCADE',
-            required=True, select=True)
+        # Migration from 2.6: Remove inherits calendar.alarm
+        if table.column_exist('calendar_alarm'):
+            cursor.execute('UPDATE "' + cls._table + '" AS t '
+                'SET valarm = (SELECT a.valarm '
+                    'FROM calendar_alarm AS a '
+                    'WHERE a.id = t.calendar_alarm)')
+            table.drop_column('calendar_alarm', True)
 
     @classmethod
-    def create(cls, values):
+    def create(cls, vlist):
         Todo = Pool().get('calendar.todo')
-        if values.get('todo'):
-            # Update write_date of todo
-            Todo.write([Todo(values['todo'])], {})
-        return super(TodoAlarm, cls).create(values)
+        towrite = []
+        for values in vlist:
+            if values.get('todo'):
+                # Update write_date of todo
+                towrite.append(values['todo'])
+        if towrite:
+            Todo.write(Todo.browse(towrite), {})
+        return super(TodoAlarm, cls).create(vlist)
 
     @classmethod
     def write(cls, alarms, values):
@@ -1186,21 +1218,8 @@ class TodoAlarm(ModelSQL):
     def delete(cls, todo_alarms):
         pool = Pool()
         Todo = pool.get('calendar.todo')
-        Alarm = pool.get('calendar.alarm')
-        alarms = [a.calendar_alarm for a in todo_alarms]
         todos = [x.todo for x in todo_alarms]
         if todos:
             # Update write_date of todo
             Todo.write(todos, {})
         super(TodoAlarm, cls).delete(todo_alarms)
-        if alarms:
-            Alarm.delete(alarms)
-
-    @classmethod
-    def valarm2values(cls, alarm):
-        Alarm = Pool().get('calendar.alarm')
-        return Alarm.valarm2values(alarm.calendar_alarm)
-
-    def alarm2valarm(self, alarm):
-        Alarm = Pool().get('calendar.alarm')
-        return Alarm.alarm2valarm(alarm.calendar_alarm)
diff --git a/todo.xml b/todo.xml
index d8d7e92..23e37d0 100644
--- a/todo.xml
+++ b/todo.xml
@@ -8,90 +8,20 @@ this repository contains the full copyright notices and license terms. -->
             <field name="model">calendar.todo</field>
             <field name="type">tree</field>
             <field name="priority" eval="10"/>
-            <field name="arch" type="xml">
-                <![CDATA[
-                <tree string="Todos">
-                    <field name="calendar"/>
-                    <field name="summary"/>
-                    <field name="dtstart"/>
-                    <field name="due"/>
-                    <field name="status"/>
-                    <field name="percent_complete"/>
-                </tree>
-                ]]>
-            </field>
+            <field name="name">todo_tree</field>
         </record>
 
         <record model="ir.ui.view" id="todo_view_tree_occurence">
             <field name="model">calendar.todo</field>
             <field name="type">tree</field>
             <field name="priority" eval="20"/>
-            <field name="arch" type="xml">
-                <![CDATA[
-                <tree string="Todos">
-                    <field name="summary"/>
-                    <field name="recurrence"/>
-                    <field name="dtstart"/>
-                    <field name="due"/>
-                    <field name="status"/>
-                    <field name="percent_complete"/>
-                </tree>
-                ]]>
-            </field>
+            <field name="name">todo_tree_occurence</field>
         </record>
 
         <record model="ir.ui.view" id="todo_view_form">
             <field name="model">calendar.todo</field>
             <field name="type">form</field>
-            <field name="arch" type="xml">
-                <![CDATA[
-                <form string="Todo">
-                    <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="dtstart"/>
-                            <field name="dtstart"/>
-                            <label name="due"/>
-                            <field name="due"/>
-                            <label name="percent_complete"/>
-                            <field name="percent_complete"/>
-                            <label name="completed"/>
-                            <field name="completed"/>
-                            <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_todo.todo_view_tree_occurence"/>
-                        </page>
-                    </notebook>
-                </form>
-                ]]>
-            </field>
+            <field name="name">todo_form</field>
         </record>
 
         <record model="ir.action.act_window" id="act_todo_form">
@@ -144,15 +74,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_todo_line1">
-            <field name="field" search="[('name', '=', 'calendar_owner'), ('model.model', '=', 'calendar.todo')]"/>
-            <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_todo"/>
         </record>
         <record model="ir.rule" id="rule_group_read_todo_line2">
-            <field name="field" search="[('name', '=', 'calendar_read_users'), ('model.model', '=', 'calendar.todo')]"/>
-            <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_todo"/>
         </record>
 
@@ -166,221 +92,72 @@ 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_todo_line1">
-            <field name="field" search="[('name', '=', 'calendar_owner'), ('model.model', '=', 'calendar.todo')]"/>
-            <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_todo"/>
         </record>
         <record model="ir.rule" id="rule_group_write_todo_line2">
-            <field name="field" search="[('name', '=', 'calendar_write_users'), ('model.model', '=', 'calendar.todo')]"/>
-            <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_todo"/>
         </record>
 
         <record model="ir.ui.view" id="attendee_view_tree">
             <field name="model">calendar.todo.attendee</field>
             <field name="type">tree</field>
-            <field name="arch" type="xml">
-                <![CDATA[
-                <tree string="Attendees">
-                    <field name="todo"/>
-                    <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.todo.attendee</field>
             <field name="type">form</field>
-            <field name="arch" type="xml">
-                <![CDATA[
-                <form string="Attendee">
-                    <label name="todo"/>
-                    <field name="todo" 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.todo.rdate</field>
             <field name="type">tree</field>
-            <field name="arch" type="xml">
-                <![CDATA[
-                <tree string="Recurrence Dates">
-                    <field name="todo"/>
-                    <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.todo.rdate</field>
             <field name="type">form</field>
-            <field name="arch" type="xml">
-                <![CDATA[
-                <form string="Recurrence Date">
-                    <label name="todo"/>
-                    <field name="todo" 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.todo.exdate</field>
             <field name="type">tree</field>
-            <field name="arch" type="xml">
-                <![CDATA[
-                <tree string="Exception Dates">
-                    <field name="todo"/>
-                    <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.todo.exdate</field>
             <field name="type">form</field>
-            <field name="arch" type="xml">
-                <![CDATA[
-                <form string="Exception Date">
-                    <label name="todo"/>
-                    <field name="todo" 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.todo.rrule</field>
             <field name="type">tree</field>
-            <field name="arch" type="xml">
-                <![CDATA[
-                <tree string="Recurrence Rules">
-                    <field name="todo"/>
-                    <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.todo.rrule</field>
             <field name="type">form</field>
-            <field name="arch" type="xml">
-                <![CDATA[
-                <form string="Recurrence Rule">
-                    <label name="todo"/>
-                    <field name="todo" 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.todo.exrule</field>
             <field name="type">tree</field>
-            <field name="arch" type="xml">
-                <![CDATA[
-                <tree string="Exception Rules">
-                    <field name="todo"/>
-                    <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.todo.exrule</field>
             <field name="type">form</field>
-            <field name="arch" type="xml">
-                <![CDATA[
-                <form string="Exception Rule">
-                    <label name="todo"/>
-                    <field name="todo" 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>
diff --git a/tryton.cfg b/tryton.cfg
index b904159..aae9557 100644
--- a/tryton.cfg
+++ b/tryton.cfg
@@ -1,5 +1,5 @@
 [tryton]
-version=2.6.1
+version=2.8.0
 depends:
     calendar
     ir
diff --git a/trytond_calendar_todo.egg-info/PKG-INFO b/trytond_calendar_todo.egg-info/PKG-INFO
index 3cdcac3..fa2a896 100644
--- a/trytond_calendar_todo.egg-info/PKG-INFO
+++ b/trytond_calendar_todo.egg-info/PKG-INFO
@@ -1,12 +1,12 @@
 Metadata-Version: 1.1
 Name: trytond-calendar-todo
-Version: 2.6.1
+Version: 2.8.0
 Summary: Tryton module to add TODO on 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_todo
         =====================
         
@@ -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_todo.egg-info/SOURCES.txt b/trytond_calendar_todo.egg-info/SOURCES.txt
index a150cbb..35807aa 100644
--- a/trytond_calendar_todo.egg-info/SOURCES.txt
+++ b/trytond_calendar_todo.egg-info/SOURCES.txt
@@ -29,4 +29,17 @@ trytond_calendar_todo.egg-info/dependency_links.txt
 trytond_calendar_todo.egg-info/entry_points.txt
 trytond_calendar_todo.egg-info/not-zip-safe
 trytond_calendar_todo.egg-info/requires.txt
-trytond_calendar_todo.egg-info/top_level.txt
\ No newline at end of file
+trytond_calendar_todo.egg-info/top_level.txt
+view/attendee_form.xml
+view/attendee_tree.xml
+view/exdate_form.xml
+view/exdate_tree.xml
+view/exrule_form.xml
+view/exrule_tree.xml
+view/rdate_form.xml
+view/rdate_tree.xml
+view/rrule_form.xml
+view/rrule_tree.xml
+view/todo_form.xml
+view/todo_tree.xml
+view/todo_tree_occurence.xml
\ No newline at end of file
diff --git a/trytond_calendar_todo.egg-info/requires.txt b/trytond_calendar_todo.egg-info/requires.txt
index 466ce88..d08f9d2 100644
--- a/trytond_calendar_todo.egg-info/requires.txt
+++ b/trytond_calendar_todo.egg-info/requires.txt
@@ -2,5 +2,5 @@ vobject >= 0.8.0
 PyWebDAV >= 0.9.8
 python-dateutil
 pytz
-trytond_calendar >= 2.6, < 2.7
-trytond >= 2.6, < 2.7
\ No newline at end of file
+trytond_calendar >= 2.8, < 2.9
+trytond >= 2.8, < 2.9
\ No newline at end of file
diff --git a/view/attendee_form.xml b/view/attendee_form.xml
new file mode 100644
index 0000000..20ce42d
--- /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="todo"/>
+    <field name="todo" 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..457870a
--- /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="todo"/>
+    <field name="email"/>
+    <field name="status"/>
+</tree>
diff --git a/view/exdate_form.xml b/view/exdate_form.xml
new file mode 100644
index 0000000..853ec7b
--- /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="todo"/>
+    <field name="todo" 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..ca5a2fe
--- /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="todo"/>
+    <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..4fdb681
--- /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="todo"/>
+    <field name="todo" 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..39009f5
--- /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="todo"/>
+    <field name="freq"/>
+</tree>
diff --git a/view/rdate_form.xml b/view/rdate_form.xml
new file mode 100644
index 0000000..9f4c7e6
--- /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="todo"/>
+    <field name="todo" 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..1f13877
--- /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="todo"/>
+    <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..1330bae
--- /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="todo"/>
+    <field name="todo" 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..5f3e92d
--- /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="todo"/>
+    <field name="freq"/>
+</tree>
diff --git a/view/todo_form.xml b/view/todo_form.xml
new file mode 100644
index 0000000..63ce6dd
--- /dev/null
+++ b/view/todo_form.xml
@@ -0,0 +1,48 @@
+<?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="Todo">
+    <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="dtstart"/>
+            <field name="dtstart"/>
+            <label name="due"/>
+            <field name="due"/>
+            <label name="percent_complete"/>
+            <field name="percent_complete"/>
+            <label name="completed"/>
+            <field name="completed"/>
+            <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_todo.todo_view_tree_occurence"/>
+        </page>
+    </notebook>
+</form>
diff --git a/view/todo_tree.xml b/view/todo_tree.xml
new file mode 100644
index 0000000..841d6bf
--- /dev/null
+++ b/view/todo_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="Todos">
+    <field name="calendar"/>
+    <field name="summary"/>
+    <field name="dtstart"/>
+    <field name="due"/>
+    <field name="status"/>
+    <field name="percent_complete"/>
+</tree>
diff --git a/view/todo_tree_occurence.xml b/view/todo_tree_occurence.xml
new file mode 100644
index 0000000..852fcf0
--- /dev/null
+++ b/view/todo_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="Todos">
+    <field name="summary"/>
+    <field name="recurrence"/>
+    <field name="dtstart"/>
+    <field name="due"/>
+    <field name="status"/>
+    <field name="percent_complete"/>
+</tree>
diff --git a/webdav.py b/webdav.py
index ed44d88..4fab749 100644
--- a/webdav.py
+++ b/webdav.py
@@ -109,7 +109,7 @@ class Collection:
         if uri and (uri not in ('Calendars', 'Calendars/')) 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_todo(filter)
                 todos = Todo.search([
                     ('calendar', '=', calendar_id),
@@ -175,16 +175,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 "' + Todo.__table__ + '" ' \
+                    cursor.execute('SELECT id, '
+                            'EXTRACT(epoch FROM create_date) '
+                        'FROM "' + Todo.__table__ + '" '
                         'WHERE ' + red_sql, red_ids)
                     for todo_id2, date in cursor.fetchall():
                         if todo_id2 == todo_id:
                             res = date
                         if cache is not None:
                             cache['_calendar'][Todo.__name__]\
-                                    .setdefault(todo_id2, {})
+                                .setdefault(todo_id2, {})
                             cache['_calendar'][Todo.__name__][
                                 todo_id2]['creationdate'] = date
                 if res is not None:
@@ -220,19 +220,19 @@ 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 "' + Todo.__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 "' + Todo.__table__ + '" '
+                        'WHERE ' + red_id_sql + ' '
+                            'OR ' + red_parent_sql + ' '
+                        'GROUP BY parent, id', red_id_ids + red_parent_ids)
                     for todo_id2, date in cursor.fetchall():
                         if todo_id2 == todo_id:
                             res = date
                         if cache is not None:
                             cache['_calendar'][Todo.__name__]\
-                                    .setdefault(todo_id2, {})
+                                .setdefault(todo_id2, {})
                             cache['_calendar'][Todo.__name__][
                                 todo_id2]['lastmodified'] = date
                 if res is not None:
@@ -274,10 +274,10 @@ class Collection:
             if not todo_id:
 
                 values = Todo.ical2values(None, ical, calendar_id)
-                todo = Todo.create(values)
+                todo, = Todo.create([values])
                 calendar = Calendar(calendar_id)
                 return Transaction().cursor.database_name + '/Calendars/' + \
-                        calendar.name + '/' + todo.uuid + '.ics'
+                    calendar.name + '/' + todo.uuid + '.ics'
             else:
                 values = Todo.ical2values(todo_id, ical, calendar_id)
                 Todo.write([Todo(todo_id)], values)
commit 77dc6f1ea96f64c14039c62c1cc56bdd858b02c4
Author: Mathias Behrle <mathiasb at m9s.biz>
Date:   Sat Apr 27 18:44:42 2013 +0200

    Releasing debian version 2.6.1-3.

diff --git a/debian/changelog b/debian/changelog
index e379cda..cb1bc13 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,10 @@
+tryton-modules-calendar-todo (2.6.1-3) experimental; urgency=low
+
+  * Removing Daniel from Uploaders. Thanks for your work! (Closes: #704376).
+  * Improving update of major version in Depends.
+
+ -- Mathias Behrle <mathiasb at m9s.biz>  Sat, 27 Apr 2013 15:06:20 +0200
+
 tryton-modules-calendar-todo (2.6.1-2) experimental; urgency=low
 
   * Updating Vcs-Git to correct address.
commit ce547fa15f1b688842729c49540ec23669dfbde2
Author: Mathias Behrle <mathiasb at m9s.biz>
Date:   Sat Apr 27 14:54:48 2013 +0200

    Improving update of major version in Depends.
    
    Pulling the major version for Depends directly from the package version.
    Thanks to Ilya Melnikov for pushing the idea.

diff --git a/debian/control b/debian/control
index cf89e29..1a9ad57 100644
--- a/debian/control
+++ b/debian/control
@@ -13,9 +13,9 @@ X-Python-Version: >= 2.6
 Package: tryton-modules-calendar-todo
 Architecture: all
 Depends:
- ${misc:Depends}, ${python:Depends}, tryton-server (>= 2.6),
- tryton-modules-calendar (>= 2.6), python-dateutil, python-tz, python-vobject,
- python-webdav, python-pkg-resources
+ ${misc:Depends}, ${python:Depends}, tryton-server (>= ${version:major}),
+ tryton-modules-calendar (>= ${version:major}), python-dateutil, python-tz,
+ python-vobject, python-webdav, python-pkg-resources
 Description: Tryton Application Platform (Calendar Todo Module)
  Tryton is a high-level general purpose application platform written in Python
  and using PostgreSQL as database engine. It is the core base of a complete
diff --git a/debian/rules b/debian/rules
index 1ae0776..0f63ab4 100755
--- a/debian/rules
+++ b/debian/rules
@@ -1,5 +1,7 @@
 #!/usr/bin/make -f
 
+MAJOR := $(shell python setup.py --version | awk -F "." '{print $$1 "." $$2}')
+
 %:
 	dh ${@} --with python2
 
@@ -8,5 +10,8 @@ override_dh_auto_clean:
 
 	rm -rf *.egg-info
 
+override_dh_gencontrol:
+	dh_gencontrol -- -Vversion:major="$(MAJOR)"
+
 override_dh_builddeb:
 	dh_builddeb -- -Zxz -z9
commit a25b60c075078ab4901bbbb1e51edaaa55849749
Author: Mathias Behrle <mathiasb at m9s.biz>
Date:   Sun Apr 21 23:29:29 2013 +0200

    Removing Daniel from Uploaders. Thanks for your work! (Closes: #704376).

diff --git a/debian/control b/debian/control
index ffda9d4..cf89e29 100644
--- a/debian/control
+++ b/debian/control
@@ -2,7 +2,7 @@ Source: tryton-modules-calendar-todo
 Section: python
 Priority: optional
 Maintainer: Debian Tryton Maintainers <maintainers at debian.tryton.org>
-Uploaders: Daniel Baumann <daniel at debian.org>, Mathias Behrle <mathiasb at m9s.biz>
+Uploaders: Mathias Behrle <mathiasb at m9s.biz>
 Build-Depends: debhelper (>= 9), python (>= 2.6.6-3~), python-setuptools
 Standards-Version: 3.9.4
 Homepage: http://www.tryton.org/
commit ff702c93228a163f8c64e67aef8b56f388b8b2a1
Author: Mathias Behrle <mathiasb at m9s.biz>
Date:   Sat Mar 23 15:04:02 2013 +0100

    Releasing debian version 2.6.1-2.

diff --git a/debian/changelog b/debian/changelog
index 4e86b6f..e379cda 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,10 @@
+tryton-modules-calendar-todo (2.6.1-2) experimental; urgency=low
+
+  * Updating Vcs-Git to correct address.
+  * Adding watch file. Thanks to Bart Martens <bartm at debian.org>.
+
+ -- Mathias Behrle <mathiasb at m9s.biz>  Sat, 23 Mar 2013 14:00:29 +0100
+
 tryton-modules-calendar-todo (2.6.1-1) experimental; urgency=low
 
   * Removing obsolete Dm-Upload-Allowed
commit 7498cb3806d65661a95d06846ae6088d62b1438f
Author: Mathias Behrle <mathiasb at m9s.biz>
Date:   Sat Mar 23 13:52:32 2013 +0100

    Adding watch file. Thanks to Bart Martens <bartm at debian.org>.

diff --git a/debian/watch b/debian/watch
new file mode 100644
index 0000000..b9e7219
--- /dev/null
+++ b/debian/watch
@@ -0,0 +1,2 @@
+version=3
+http://downloads.tryton.org/current/ .*trytond_calendar_todo-(\d.*)\.(?:tgz|tbz2|txz|tar\.(?:gz|bz2|xz))
commit f1e771ab30eef734fbae123ac5cf56d1a8af2513
Author: Mathias Behrle <mathiasb at m9s.biz>
Date:   Sat Feb 23 20:08:09 2013 +0100

    Updating Vcs-Git to correct address.

diff --git a/debian/control b/debian/control
index 561c68b..ffda9d4 100644
--- a/debian/control
+++ b/debian/control
@@ -7,7 +7,7 @@ Build-Depends: debhelper (>= 9), python (>= 2.6.6-3~), python-setuptools
 Standards-Version: 3.9.4
 Homepage: http://www.tryton.org/
 Vcs-Browser: http://debian.tryton.org/gitweb/?p=packages/tryton-modules-calendar-todo.git
-Vcs-Git: git://debian.tryton.org/git/packages/tryton-modules-calendar-todo.git
+Vcs-Git: git://debian.tryton.org/packages/tryton-modules-calendar-todo.git
 X-Python-Version: >= 2.6
 
 Package: tryton-modules-calendar-todo
commit 55135ef8d5111e7c124a816fc869d0ce3d126765
Author: Mathias Behrle <mathiasb at m9s.biz>
Date:   Sun Feb 17 13:50:40 2013 +0100

    Releasing debian version 2.6.1-1.

diff --git a/debian/changelog b/debian/changelog
index 49f47f7..4e86b6f 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,12 @@
+tryton-modules-calendar-todo (2.6.1-1) experimental; urgency=low
+
+  * Removing obsolete Dm-Upload-Allowed
+  * Updating to Standards-Version: 3.9.4, no changes needed.
+  * Merging upstream version 2.6.1.
+  * Updating copyright.
+
+ -- Mathias Behrle <mathiasb at m9s.biz>  Sat, 16 Feb 2013 21:37:47 +0100
+
 tryton-modules-calendar-todo (2.6.0-1) experimental; urgency=low
 
   * Merging upstream version 2.6.0.
commit 13292affbcdc57badbe87a0e276482d6c306dbf5
Author: Mathias Behrle <mathiasb at m9s.biz>
Date:   Sat Feb 16 21:29:19 2013 +0100

    Updating copyright.

diff --git a/debian/copyright b/debian/copyright
index 99aff32..cbad1dd 100644
--- a/debian/copyright
+++ b/debian/copyright
@@ -1,8 +1,7 @@
 Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
 
 Files: *
-Copyright:
-           2009-2012 Cedric Krier
+Copyright: 2009-2012 Cédric Krier
            2009-2012 Bertrand Chenal
            2009-2012 B2CK SPRL
 License: GPL-3+
@@ -10,7 +9,7 @@ License: GPL-3+
 Files: debian/*
 Copyright:
            2009-2012 Daniel Baumann <daniel at debian.org>
-           2012 Mathias Behrle <mathiasb at m9s.biz>
+           2012-2013 Mathias Behrle <mathiasb at m9s.biz>
 License: GPL-3+
 
 License: GPL-3+
commit 1cee554618abd042da0bed8af246fae191be4749
Author: Mathias Behrle <mathiasb at m9s.biz>
Date:   Fri Feb 15 20:50:39 2013 +0100

    Merging upstream version 2.6.1.

diff --git a/CHANGELOG b/CHANGELOG
index e9779b0..1766455 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 504b4c5..d03b3f6 100644
--- a/PKG-INFO
+++ b/PKG-INFO
@@ -1,6 +1,6 @@
-Metadata-Version: 1.0
+Metadata-Version: 1.1
 Name: trytond_calendar_todo
-Version: 2.6.0
+Version: 2.6.1
 Summary: Tryton module to add TODO on CalDAV
 Home-page: http://www.tryton.org/
 Author: Tryton
diff --git a/tryton.cfg b/tryton.cfg
index 2c4b4f3..b904159 100644
--- a/tryton.cfg
+++ b/tryton.cfg
@@ -1,5 +1,5 @@
 [tryton]
-version=2.6.0
+version=2.6.1
 depends:
     calendar
     ir
diff --git a/trytond_calendar_todo.egg-info/PKG-INFO b/trytond_calendar_todo.egg-info/PKG-INFO
index c684d79..3cdcac3 100644
--- a/trytond_calendar_todo.egg-info/PKG-INFO
+++ b/trytond_calendar_todo.egg-info/PKG-INFO
@@ -1,6 +1,6 @@
-Metadata-Version: 1.0
+Metadata-Version: 1.1
 Name: trytond-calendar-todo
-Version: 2.6.0
+Version: 2.6.1
 Summary: Tryton module to add TODO on CalDAV
 Home-page: http://www.tryton.org/
 Author: Tryton
diff --git a/webdav.py b/webdav.py
index b3ea843..ed44d88 100644
--- a/webdav.py
+++ b/webdav.py
@@ -126,7 +126,7 @@ class Collection:
 
     @classmethod
     def get_resourcetype(cls, 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 = cls.calendar(uri)
commit 95fd0a78b47c9707e79f3f6a03a403c52f358eeb
Author: Mathias Behrle <mathiasb at m9s.biz>
Date:   Fri Feb 15 19:28:28 2013 +0100

    Updating to Standards-Version: 3.9.4, no changes needed.

diff --git a/debian/control b/debian/control
index 14ae824..561c68b 100644
--- a/debian/control
+++ b/debian/control
@@ -4,7 +4,7 @@ Priority: optional
 Maintainer: Debian Tryton Maintainers <maintainers at debian.tryton.org>
 Uploaders: Daniel Baumann <daniel at debian.org>, Mathias Behrle <mathiasb at m9s.biz>
 Build-Depends: debhelper (>= 9), python (>= 2.6.6-3~), python-setuptools
-Standards-Version: 3.9.3
+Standards-Version: 3.9.4
 Homepage: http://www.tryton.org/
 Vcs-Browser: http://debian.tryton.org/gitweb/?p=packages/tryton-modules-calendar-todo.git
 Vcs-Git: git://debian.tryton.org/git/packages/tryton-modules-calendar-todo.git
commit 80e6362f6d0d8ff11b3bbcc6f3b6cb2faa30f7d9
Author: Mathias Behrle <mathiasb at m9s.biz>
Date:   Wed Feb 13 21:37:13 2013 +0100

    Removing obsolete Dm-Upload-Allowed

diff --git a/debian/control b/debian/control
index 5306392..14ae824 100644
--- a/debian/control
+++ b/debian/control
@@ -3,7 +3,6 @@ Section: python
 Priority: optional
 Maintainer: Debian Tryton Maintainers <maintainers at debian.tryton.org>
 Uploaders: Daniel Baumann <daniel at debian.org>, Mathias Behrle <mathiasb at m9s.biz>
-Dm-Upload-Allowed: yes
 Build-Depends: debhelper (>= 9), python (>= 2.6.6-3~), python-setuptools
 Standards-Version: 3.9.3
 Homepage: http://www.tryton.org/
commit 971d6f83cc5180d5e19667f8c51f6b8f37f77ac1
Author: Mathias Behrle <mathiasb at m9s.biz>
Date:   Wed Oct 24 22:01:54 2012 +0200

    Releasing debian version 2.6.0-1.

diff --git a/debian/changelog b/debian/changelog
index 9a1a501..49f47f7 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,10 @@
+tryton-modules-calendar-todo (2.6.0-1) experimental; urgency=low
+
+  * Merging upstream version 2.6.0.
+  * Bumping versioned tryton depends to 2.6.
+
+ -- Mathias Behrle <mathiasb at m9s.biz>  Wed, 24 Oct 2012 14:24:18 +0200
+
 tryton-modules-calendar-todo (2.4.2-2) experimental; urgency=low
 
   [ Daniel Baumann ]
commit 101d9648efa79deec158434f28618d0bc4765fdc
Author: Mathias Behrle <mathiasb at m9s.biz>
Date:   Tue Oct 23 19:59:46 2012 +0200

    Bumping versioned tryton depends to 2.6.

diff --git a/debian/control b/debian/control
index 44443ff..5306392 100644
--- a/debian/control
+++ b/debian/control
@@ -14,8 +14,8 @@ X-Python-Version: >= 2.6
 Package: tryton-modules-calendar-todo
 Architecture: all
 Depends:
- ${misc:Depends}, ${python:Depends}, tryton-server (>= 2.4),
- tryton-modules-calendar (>= 2.4), python-dateutil, python-tz, python-vobject,
+ ${misc:Depends}, ${python:Depends}, tryton-server (>= 2.6),
+ tryton-modules-calendar (>= 2.6), python-dateutil, python-tz, python-vobject,
  python-webdav, python-pkg-resources
 Description: Tryton Application Platform (Calendar Todo Module)
  Tryton is a high-level general purpose application platform written in Python
commit d8ee2fd0235d31c1c4ea4a48fde2080e16c1d7b8
Author: Mathias Behrle <mathiasb at m9s.biz>
Date:   Tue Oct 23 19:53:30 2012 +0200

    Merging upstream version 2.6.0.

diff --git a/CHANGELOG b/CHANGELOG
index b9a4c76..e9779b0 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 8e0cd51..504b4c5 100644
--- a/PKG-INFO
+++ b/PKG-INFO
@@ -1,13 +1,49 @@
 Metadata-Version: 1.0
 Name: trytond_calendar_todo
-Version: 2.4.2
-Summary: Add Todo support on CalDAV
+Version: 2.6.0
+Summary: Tryton module to add TODO on 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_todo
+        =====================
+        
+        The calendar_todo 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 ac725d6..5092231 100644
--- a/__init__.py
+++ b/__init__.py
@@ -1,6 +1,21 @@
 #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 .todo import *
 from .webdav import *
+
+
+def register():
+    Pool.register(
+        Todo,
+        TodoCategory,
+        TodoRDate,
+        TodoRRule,
+        TodoExDate,
+        TodoExRule,
+        TodoAttendee,
+        TodoAlarm,
+        Collection,
+        module='calendar_todo', type_='model')
diff --git a/__tryton__.py b/__tryton__.py
deleted file mode 100644
index 0c22fdc..0000000
--- a/__tryton__.py
+++ /dev/null
@@ -1,48 +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 Todo',
-    'name_bg_BG': 'Задачи за календар',
-    'name_ca_ES': 'Calendari de tasques pendents',
-    'name_de_DE': 'Kalender Aufgaben',
-    'name_es_AR': 'Calendario de tareas',
-    'name_es_CO': 'Calendario de tareas',
-    'name_es_ES': 'Calendario de tareas',
-    'name_fr_FR': 'Tâche Calendrier',
-    'name_ru_RU': 'Задачи для календаря',
-    'version': '2.4.2',
-    'author': 'B2CK',
-    'email': 'info at b2ck.com',
-    'website': 'http://www.tryton.org/',
-    'description': 'Add Todo support on CalDAV',
-    'description_bg_BG': 'Добавя поддръжка на задачи в CalDAV',
-    'description_ca_ES': 'Afegeix suport per tasques pendents al CalDAV.',
-    'description_de_DE': 'Fügt Unterstützung für Aufgaben in CalDAV hinzu',
-    'description_es_AR': 'Añade soporte de tareas sobre CalDAV',
-    'description_es_CO': 'Añade soporte de tareas sobre CalDAV',
-    'description_es_ES': 'Añade soporte de tareas sobre CalDAV',
-    'description_fr_FR': 'Ajoute la gestion des tâches au CalDAV',
-    'description_ru_RU': 'Добавление поддержки задач для CalDAV',
-    'depends': [
-        'ir',
-        'res',
-        'webdav',
-        'calendar',
-    ],
-    'xml': [
-        'todo.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/locale/ca_ES.po b/locale/ca_ES.po
index 3f3d17e..c363f1b 100644
--- a/locale/ca_ES.po
+++ b/locale/ca_ES.po
@@ -24,15 +24,15 @@ msgstr "Calendari"
 
 msgctxt "field:calendar.todo,calendar_owner:"
 msgid "Owner"
-msgstr "Amo"
+msgstr "Propietaris"
 
 msgctxt "field:calendar.todo,calendar_read_users:"
 msgid "Read Users"
-msgstr "Usuaris amb lectura"
+msgstr "Usuaris amb permisos de lectura"
 
 msgctxt "field:calendar.todo,calendar_write_users:"
 msgid "Write Users"
-msgstr "Usuaris amb escriptura"
+msgstr "Usuaris amb permisos d'escriptura"
 
 msgctxt "field:calendar.todo,categories:"
 msgid "Categories"
@@ -48,12 +48,11 @@ msgstr "Completada"
 
 msgctxt "field:calendar.todo,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Data creació"
 
-#, fuzzy
 msgctxt "field:calendar.todo,create_uid:"
 msgid "Create User"
-msgstr "Crear usuari"
+msgstr "Usuari creació"
 
 msgctxt "field:calendar.todo,description:"
 msgid "Description"
@@ -77,13 +76,12 @@ msgstr "Regles d'excepcions"
 
 msgctxt "field:calendar.todo,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:calendar.todo,location:"
 msgid "Location"
 msgstr "Ubicació"
 
-#, fuzzy
 msgctxt "field:calendar.todo,occurences:"
 msgid "Occurences"
 msgstr "Ocurrències"
@@ -142,11 +140,11 @@ msgstr "vtodo"
 
 msgctxt "field:calendar.todo,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Data modificació"
 
 msgctxt "field:calendar.todo,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Usuari modificació"
 
 msgctxt "field:calendar.todo-calendar.category,category:"
 msgid "Category"
@@ -154,16 +152,15 @@ msgstr "Categoria"
 
 msgctxt "field:calendar.todo-calendar.category,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Data creació"
 
-#, fuzzy
 msgctxt "field:calendar.todo-calendar.category,create_uid:"
 msgid "Create User"
-msgstr "Crear usuari"
+msgstr "Usuari creació"
 
 msgctxt "field:calendar.todo-calendar.category,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:calendar.todo-calendar.category,rec_name:"
 msgid "Name"
@@ -175,11 +172,11 @@ msgstr "Per fer"
 
 msgctxt "field:calendar.todo-calendar.category,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Data modificació"
 
 msgctxt "field:calendar.todo-calendar.category,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Usuari modificació"
 
 msgctxt "field:calendar.todo.alarm,calendar_alarm:"
 msgid "Calendar Alarm"
@@ -187,16 +184,15 @@ msgstr "Alarma del calendari"
 
 msgctxt "field:calendar.todo.alarm,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Data creació"
 
-#, fuzzy
 msgctxt "field:calendar.todo.alarm,create_uid:"
 msgid "Create User"
-msgstr "Crear usuari"
+msgstr "Usuari creació"
 
 msgctxt "field:calendar.todo.alarm,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:calendar.todo.alarm,rec_name:"
 msgid "Name"
@@ -208,11 +204,11 @@ msgstr "Tasca"
 
 msgctxt "field:calendar.todo.alarm,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Data modificació"
 
 msgctxt "field:calendar.todo.alarm,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Usuari modificació"
 
 msgctxt "field:calendar.todo.attendee,calendar_attendee:"
 msgid "Calendar Attendee"
@@ -220,16 +216,15 @@ msgstr "Calendari d'assistents"
 
 msgctxt "field:calendar.todo.attendee,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Data creació"
 
-#, fuzzy
 msgctxt "field:calendar.todo.attendee,create_uid:"
 msgid "Create User"
-msgstr "Crear usuari"
+msgstr "Usuari creació"
 
 msgctxt "field:calendar.todo.attendee,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:calendar.todo.attendee,rec_name:"
 msgid "Name"
@@ -241,28 +236,27 @@ msgstr "Tasca"
 
 msgctxt "field:calendar.todo.attendee,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Data modificació"
 
 msgctxt "field:calendar.todo.attendee,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Usuari modificació"
 
 msgctxt "field:calendar.todo.exdate,calendar_date:"
 msgid "Calendar Date"
-msgstr ""
+msgstr "Data calendari"
 
 msgctxt "field:calendar.todo.exdate,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Data creació"
 
-#, fuzzy
 msgctxt "field:calendar.todo.exdate,create_uid:"
 msgid "Create User"
-msgstr "Crear usuari"
+msgstr "Usuari creació"
 
 msgctxt "field:calendar.todo.exdate,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:calendar.todo.exdate,rec_name:"
 msgid "Name"
@@ -274,11 +268,11 @@ msgstr "Tasca"
 
 msgctxt "field:calendar.todo.exdate,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Data modificació"
 
 msgctxt "field:calendar.todo.exdate,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Usuari modificació"
 
 msgctxt "field:calendar.todo.exrule,calendar_rrule:"
 msgid "Calendar RRule"
@@ -286,16 +280,15 @@ msgstr "Regla de recurrencia"
 
 msgctxt "field:calendar.todo.exrule,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Data creació"
 
-#, fuzzy
 msgctxt "field:calendar.todo.exrule,create_uid:"
 msgid "Create User"
-msgstr "Crear usuari"
+msgstr "Usuari creació"
 
 msgctxt "field:calendar.todo.exrule,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:calendar.todo.exrule,rec_name:"
 msgid "Name"
@@ -307,28 +300,27 @@ msgstr "Tasca"
 
 msgctxt "field:calendar.todo.exrule,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Data modificació"
 
 msgctxt "field:calendar.todo.exrule,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Usuari modificació"
 
 msgctxt "field:calendar.todo.rdate,calendar_date:"
 msgid "Calendar Date"
-msgstr ""
+msgstr "Data calendari"
 
 msgctxt "field:calendar.todo.rdate,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Data creació"
 
-#, fuzzy
 msgctxt "field:calendar.todo.rdate,create_uid:"
 msgid "Create User"
-msgstr "Crear usuari"
+msgstr "Usuari creació"
 
 msgctxt "field:calendar.todo.rdate,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:calendar.todo.rdate,rec_name:"
 msgid "Name"
@@ -340,11 +332,11 @@ msgstr "Tasca"
 
 msgctxt "field:calendar.todo.rdate,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Data modificació"
 
 msgctxt "field:calendar.todo.rdate,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Usuari modificació"
 
 msgctxt "field:calendar.todo.rrule,calendar_rrule:"
 msgid "Calendar RRule"
@@ -352,16 +344,15 @@ msgstr "Regla de recurrencia"
 
 msgctxt "field:calendar.todo.rrule,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Data creació"
 
-#, fuzzy
 msgctxt "field:calendar.todo.rrule,create_uid:"
 msgid "Create User"
-msgstr "Crear usuari"
+msgstr "Usuari creació"
 
 msgctxt "field:calendar.todo.rrule,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:calendar.todo.rrule,rec_name:"
 msgid "Name"
@@ -373,11 +364,11 @@ msgstr "Tasca"
 
 msgctxt "field:calendar.todo.rrule,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Data modificació"
 
 msgctxt "field:calendar.todo.rrule,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Usuari modificació"
 
 msgctxt "help:calendar.todo,uuid:"
 msgid "Universally Unique Identifier"
@@ -397,7 +388,7 @@ msgstr "Alarma"
 
 msgctxt "model:calendar.todo.attendee,name:"
 msgid "Attendee"
-msgstr "Assistents"
+msgstr "Assistent"
 
 msgctxt "model:calendar.todo.exdate,name:"
 msgid "Exception Date"
@@ -407,7 +398,6 @@ msgctxt "model:calendar.todo.exrule,name:"
 msgid "Exception Rule"
 msgstr "Regla d'excepció"
 
-#, fuzzy
 msgctxt "model:calendar.todo.rdate,name:"
 msgid "Todo Recurrence Date"
 msgstr "Data de recurrencia"
@@ -420,7 +410,6 @@ msgctxt "model:ir.action,name:act_todo_form"
 msgid "Todos"
 msgstr "Tasques"
 
-#, fuzzy
 msgctxt "model:ir.action,name:act_todo_form3"
 msgid "Todos"
 msgstr "Tasques"
@@ -441,9 +430,10 @@ msgctxt "selection:calendar.todo,classification:"
 msgid "Public"
 msgstr "Públic"
 
+#, fuzzy
 msgctxt "selection:calendar.todo,status:"
 msgid ""
-msgstr ""
+msgstr "Servidor"
 
 msgctxt "selection:calendar.todo,status:"
 msgid "Cancelled"
@@ -463,7 +453,7 @@ msgstr "Necessita una acció"
 
 msgctxt "view:calendar.todo.attendee:"
 msgid "Attendee"
-msgstr "Assistents"
+msgstr "Assistent"
 
 msgctxt "view:calendar.todo.attendee:"
 msgid "Attendees"
@@ -513,14 +503,13 @@ msgctxt "view:calendar.todo:"
 msgid "General"
 msgstr "General"
 
-#, fuzzy
 msgctxt "view:calendar.todo:"
 msgid "Occurences"
 msgstr "Ocurrències"
 
 msgctxt "view:calendar.todo:"
 msgid "Recurrences"
-msgstr "Recurrencias"
+msgstr "Recurrencies"
 
 msgctxt "view:calendar.todo:"
 msgid "Todo"
diff --git a/locale/es_AR.po b/locale/es_AR.po
index adc2e33..e03cc96 100644
--- a/locale/es_AR.po
+++ b/locale/es_AR.po
@@ -64,7 +64,7 @@ msgstr "Fecha inicio"
 
 msgctxt "field:calendar.todo,due:"
 msgid "Due Date"
-msgstr "Fecha de vencimiento"
+msgstr "Fecha vencimiento"
 
 msgctxt "field:calendar.todo,exdates:"
 msgid "Exception Dates"
@@ -136,7 +136,7 @@ msgstr "UUID"
 
 msgctxt "field:calendar.todo,vtodo:"
 msgid "vtodo"
-msgstr "vtodo"
+msgstr "v- por hacer"
 
 msgctxt "field:calendar.todo,write_date:"
 msgid "Write Date"
@@ -244,7 +244,7 @@ msgstr "Usuario modificación"
 
 msgctxt "field:calendar.todo.exdate,calendar_date:"
 msgid "Calendar Date"
-msgstr "Fecha Calendario"
+msgstr "Fecha calendario"
 
 msgctxt "field:calendar.todo.exdate,create_date:"
 msgid "Create Date"
@@ -308,7 +308,7 @@ msgstr "Usuario modificación"
 
 msgctxt "field:calendar.todo.rdate,calendar_date:"
 msgid "Calendar Date"
-msgstr "Fecha Calendario"
+msgstr "Fecha calendario"
 
 msgctxt "field:calendar.todo.rdate,create_date:"
 msgid "Create Date"
@@ -400,7 +400,7 @@ msgstr "Regla de excepción"
 
 msgctxt "model:calendar.todo.rdate,name:"
 msgid "Todo Recurrence Date"
-msgstr "Fecha de recurrencia"
+msgstr "Fecha recurrencia"
 
 msgctxt "model:calendar.todo.rrule,name:"
 msgid "Recurrence Rule"
@@ -476,7 +476,7 @@ msgstr "Reglas de excepciones"
 
 msgctxt "view:calendar.todo.rdate:"
 msgid "Recurrence Date"
-msgstr "Fecha de recurrencia"
+msgstr "Fecha recurrencia"
 
 msgctxt "view:calendar.todo.rdate:"
 msgid "Recurrence Dates"
diff --git a/locale/es_CO.po b/locale/es_CO.po
index 6497ec2..8c530f2 100644
--- a/locale/es_CO.po
+++ b/locale/es_CO.po
@@ -32,7 +32,7 @@ msgstr "Leer Usuarios"
 
 msgctxt "field:calendar.todo,calendar_write_users:"
 msgid "Write Users"
-msgstr "Escribir Usuarios"
+msgstr "Modificado por Usuario"
 
 msgctxt "field:calendar.todo,categories:"
 msgid "Categories"
@@ -44,16 +44,15 @@ msgstr "Clasificación"
 
 msgctxt "field:calendar.todo,completed:"
 msgid "Completed"
-msgstr ""
+msgstr "Completado"
 
 msgctxt "field:calendar.todo,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Fecha de Creación"
 
-#, fuzzy
 msgctxt "field:calendar.todo,create_uid:"
 msgid "Create User"
-msgstr "Crear usuario"
+msgstr "Creado por Usuario"
 
 msgctxt "field:calendar.todo,description:"
 msgid "Description"
@@ -65,7 +64,7 @@ msgstr "Fecha Inicio"
 
 msgctxt "field:calendar.todo,due:"
 msgid "Due Date"
-msgstr ""
+msgstr "Fecha Debida"
 
 msgctxt "field:calendar.todo,exdates:"
 msgid "Exception Dates"
@@ -77,7 +76,7 @@ msgstr "Reglas de Excepción"
 
 msgctxt "field:calendar.todo,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:calendar.todo,location:"
 msgid "Location"
@@ -97,7 +96,7 @@ msgstr "Padre"
 
 msgctxt "field:calendar.todo,percent_complete:"
 msgid "Percent complete"
-msgstr ""
+msgstr "Porcentaje completo"
 
 msgctxt "field:calendar.todo,rdates:"
 msgid "Recurrence Dates"
@@ -137,15 +136,15 @@ msgstr "UUID"
 
 msgctxt "field:calendar.todo,vtodo:"
 msgid "vtodo"
-msgstr ""
+msgstr "v- por hacer"
 
 msgctxt "field:calendar.todo,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Fecha de Modificación"
 
 msgctxt "field:calendar.todo,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Modificado por Usuario"
 
 msgctxt "field:calendar.todo-calendar.category,category:"
 msgid "Category"
@@ -153,16 +152,15 @@ msgstr "Categoría"
 
 msgctxt "field:calendar.todo-calendar.category,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Fecha de Creación"
 
-#, fuzzy
 msgctxt "field:calendar.todo-calendar.category,create_uid:"
 msgid "Create User"
-msgstr "Crear usuario"
+msgstr "Creado por Usuario"
 
 msgctxt "field:calendar.todo-calendar.category,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:calendar.todo-calendar.category,rec_name:"
 msgid "Name"
@@ -170,32 +168,31 @@ msgstr "Nombre"
 
 msgctxt "field:calendar.todo-calendar.category,todo:"
 msgid "To-Do"
-msgstr ""
+msgstr "Por Hacer"
 
 msgctxt "field:calendar.todo-calendar.category,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Fecha de Modificación"
 
 msgctxt "field:calendar.todo-calendar.category,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Modificado por Usuario"
 
 msgctxt "field:calendar.todo.alarm,calendar_alarm:"
 msgid "Calendar Alarm"
-msgstr ""
+msgstr "Alarma del Calendario"
 
 msgctxt "field:calendar.todo.alarm,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Fecha de Creación"
 
-#, fuzzy
 msgctxt "field:calendar.todo.alarm,create_uid:"
 msgid "Create User"
-msgstr "Crear usuario"
+msgstr "Creado por Usuario"
 
 msgctxt "field:calendar.todo.alarm,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:calendar.todo.alarm,rec_name:"
 msgid "Name"
@@ -203,32 +200,31 @@ msgstr "Nombre"
 
 msgctxt "field:calendar.todo.alarm,todo:"
 msgid "Todo"
-msgstr ""
+msgstr "Por Hacer"
 
 msgctxt "field:calendar.todo.alarm,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Fecha de Modificación"
 
 msgctxt "field:calendar.todo.alarm,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Modificado por Usuario"
 
 msgctxt "field:calendar.todo.attendee,calendar_attendee:"
 msgid "Calendar Attendee"
-msgstr ""
+msgstr "Asistente de Calendario "
 
 msgctxt "field:calendar.todo.attendee,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Fecha de Creación"
 
-#, fuzzy
 msgctxt "field:calendar.todo.attendee,create_uid:"
 msgid "Create User"
-msgstr "Crear usuario"
+msgstr "Creado por Usuario"
 
 msgctxt "field:calendar.todo.attendee,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:calendar.todo.attendee,rec_name:"
 msgid "Name"
@@ -236,33 +232,31 @@ msgstr "Nombre"
 
 msgctxt "field:calendar.todo.attendee,todo:"
 msgid "Todo"
-msgstr ""
+msgstr "Por Hacer"
 
 msgctxt "field:calendar.todo.attendee,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Fecha de Modificación"
 
 msgctxt "field:calendar.todo.attendee,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Modificado por Usuario"
 
-#, fuzzy
 msgctxt "field:calendar.todo.exdate,calendar_date:"
 msgid "Calendar Date"
 msgstr "Fecha Calendario"
 
 msgctxt "field:calendar.todo.exdate,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Fecha de Creación"
 
-#, fuzzy
 msgctxt "field:calendar.todo.exdate,create_uid:"
 msgid "Create User"
-msgstr "Crear usuario"
+msgstr "Creado por Usuario"
 
 msgctxt "field:calendar.todo.exdate,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:calendar.todo.exdate,rec_name:"
 msgid "Name"
@@ -270,32 +264,31 @@ msgstr "Nombre"
 
 msgctxt "field:calendar.todo.exdate,todo:"
 msgid "Todo"
-msgstr ""
+msgstr "Por Hacer"
 
 msgctxt "field:calendar.todo.exdate,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Fecha de Modificación"
 
 msgctxt "field:calendar.todo.exdate,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Modificado por Usuario"
 
 msgctxt "field:calendar.todo.exrule,calendar_rrule:"
 msgid "Calendar RRule"
-msgstr ""
+msgstr "Regla de Calendario"
 
 msgctxt "field:calendar.todo.exrule,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Fecha de Creación"
 
-#, fuzzy
 msgctxt "field:calendar.todo.exrule,create_uid:"
 msgid "Create User"
-msgstr "Crear usuario"
+msgstr "Creado por Usuario"
 
 msgctxt "field:calendar.todo.exrule,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:calendar.todo.exrule,rec_name:"
 msgid "Name"
@@ -303,33 +296,31 @@ msgstr "Nombre"
 
 msgctxt "field:calendar.todo.exrule,todo:"
 msgid "Todo"
-msgstr ""
+msgstr "Por Hacer"
 
 msgctxt "field:calendar.todo.exrule,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Fecha de Modificación"
 
 msgctxt "field:calendar.todo.exrule,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Modificado por Usuario"
 
-#, fuzzy
 msgctxt "field:calendar.todo.rdate,calendar_date:"
 msgid "Calendar Date"
 msgstr "Fecha Calendario"
 
 msgctxt "field:calendar.todo.rdate,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Fecha de Creación"
 
-#, fuzzy
 msgctxt "field:calendar.todo.rdate,create_uid:"
 msgid "Create User"
-msgstr "Crear usuario"
+msgstr "Creado por Usuario"
 
 msgctxt "field:calendar.todo.rdate,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:calendar.todo.rdate,rec_name:"
 msgid "Name"
@@ -337,32 +328,31 @@ msgstr "Nombre"
 
 msgctxt "field:calendar.todo.rdate,todo:"
 msgid "Todo"
-msgstr ""
+msgstr "Por Hacer"
 
 msgctxt "field:calendar.todo.rdate,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Fecha de Modificación"
 
 msgctxt "field:calendar.todo.rdate,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Modificado por Usuario"
 
 msgctxt "field:calendar.todo.rrule,calendar_rrule:"
 msgid "Calendar RRule"
-msgstr ""
+msgstr "Regla de Calendario"
 
 msgctxt "field:calendar.todo.rrule,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Fecha de Creación"
 
-#, fuzzy
 msgctxt "field:calendar.todo.rrule,create_uid:"
 msgid "Create User"
-msgstr "Crear usuario"
+msgstr "Creado por Usuario"
 
 msgctxt "field:calendar.todo.rrule,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:calendar.todo.rrule,rec_name:"
 msgid "Name"
@@ -370,15 +360,15 @@ msgstr "Nombre"
 
 msgctxt "field:calendar.todo.rrule,todo:"
 msgid "Todo"
-msgstr ""
+msgstr "Por Hacer"
 
 msgctxt "field:calendar.todo.rrule,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Fecha de Modificación"
 
 msgctxt "field:calendar.todo.rrule,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Modificado por Usuario"
 
 msgctxt "help:calendar.todo,uuid:"
 msgid "Universally Unique Identifier"
@@ -386,11 +376,11 @@ msgstr "Identificador Único Universal"
 
 msgctxt "model:calendar.todo,name:"
 msgid "Todo"
-msgstr ""
+msgstr "Por Hacer"
 
 msgctxt "model:calendar.todo-calendar.category,name:"
 msgid "Todo - Category"
-msgstr ""
+msgstr "Por Hacer - Categoria"
 
 msgctxt "model:calendar.todo.alarm,name:"
 msgid "Alarm"
@@ -408,7 +398,6 @@ msgctxt "model:calendar.todo.exrule,name:"
 msgid "Exception Rule"
 msgstr "Regla de Excepción"
 
-#, fuzzy
 msgctxt "model:calendar.todo.rdate,name:"
 msgid "Todo Recurrence Date"
 msgstr "Fecha de Repetición"
@@ -417,7 +406,6 @@ msgctxt "model:calendar.todo.rrule,name:"
 msgid "Recurrence Rule"
 msgstr "Regla de Repetición"
 
-#, fuzzy
 msgctxt "model:ir.action,name:act_todo_form"
 msgid "Todos"
 msgstr "Por hacer"
@@ -426,7 +414,6 @@ msgctxt "model:ir.action,name:act_todo_form3"
 msgid "Todos"
 msgstr "Por hacer"
 
-#, fuzzy
 msgctxt "model:ir.ui.menu,name:menu_todo_form"
 msgid "Todos"
 msgstr "Por hacer"
@@ -445,7 +432,7 @@ msgstr "Público"
 
 msgctxt "selection:calendar.todo,status:"
 msgid ""
-msgstr ""
+msgstr "Punto de Orden"
 
 msgctxt "selection:calendar.todo,status:"
 msgid "Cancelled"
@@ -453,15 +440,15 @@ msgstr "Cancelado"
 
 msgctxt "selection:calendar.todo,status:"
 msgid "Completed"
-msgstr ""
+msgstr "Completado"
 
 msgctxt "selection:calendar.todo,status:"
 msgid "In-Process"
-msgstr ""
+msgstr "En-Proceso"
 
 msgctxt "selection:calendar.todo,status:"
 msgid "Needs-Action"
-msgstr ""
+msgstr "Necesita una Acción"
 
 msgctxt "view:calendar.todo.attendee:"
 msgid "Attendee"
@@ -525,9 +512,8 @@ msgstr "Repeticiones"
 
 msgctxt "view:calendar.todo:"
 msgid "Todo"
-msgstr ""
+msgstr "Por Hacer"
 
-#, fuzzy
 msgctxt "view:calendar.todo:"
 msgid "Todos"
 msgstr "Por hacer"
diff --git a/locale/es_ES.po b/locale/es_ES.po
index 950cf5d..463df55 100644
--- a/locale/es_ES.po
+++ b/locale/es_ES.po
@@ -28,11 +28,11 @@ msgstr "Propietario"
 
 msgctxt "field:calendar.todo,calendar_read_users:"
 msgid "Read Users"
-msgstr "Usuarios con lectura"
+msgstr "Usuarios con permisos de lectura"
 
 msgctxt "field:calendar.todo,calendar_write_users:"
 msgid "Write Users"
-msgstr "Usuarios con escritura"
+msgstr "Usuarios con permisos de escritura"
 
 msgctxt "field:calendar.todo,categories:"
 msgid "Categories"
@@ -452,7 +452,7 @@ msgstr "Necesita acción"
 
 msgctxt "view:calendar.todo.attendee:"
 msgid "Attendee"
-msgstr "Asistentes"
+msgstr "Asistente"
 
 msgctxt "view:calendar.todo.attendee:"
 msgid "Attendees"
diff --git a/setup.py b/setup.py
index baef0a5..9036958 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_todo',
     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 to add TODO on 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_todo': '.'},
     packages=[
         'trytond.modules.calendar_todo',
         'trytond.modules.calendar_todo.tests',
-    ],
+        ],
     package_data={
         'trytond.modules.calendar_todo': info.get('xml', []) \
-                + info.get('translation', []),
-    },
+            + ['tryton.cfg', 'locale/*.po'],
+        },
     classifiers=[
         'Development Status :: 5 - Production/Stable',
         'Environment :: Plugins',
@@ -57,7 +68,7 @@ setup(name='trytond_calendar_todo',
         'Programming Language :: Python :: 2.6',
         'Programming Language :: Python :: 2.7',
         'Topic :: Office/Business',
-    ],
+        ],
     license='GPL-3',
     install_requires=requires,
     zip_safe=False,
@@ -67,4 +78,4 @@ setup(name='trytond_calendar_todo',
     """,
     test_suite='tests',
     test_loader='trytond.test_loader:Loader',
-)
+    )
diff --git a/todo.py b/todo.py
index a581127..dd97700 100644
--- a/todo.py
+++ b/todo.py
@@ -13,6 +13,9 @@ from trytond.pyson import Eval, If, Bool
 from trytond.transaction import Transaction
 from trytond.pool import Pool
 
+__all__ = ['Todo', 'TodoCategory', 'TodoRDate', 'TodoRRule', 'TodoExDate',
+    'TodoExRule', 'TodoAttendee', 'TodoAlarm']
+
 tzlocal = dateutil.tz.tzlocal()
 tzutc = dateutil.tz.tzutc()
 
@@ -21,10 +24,8 @@ domimpl = xml.dom.minidom.getDOMImplementation()
 
 class Todo(ModelSQL, ModelView):
     "Todo"
-    _description = __doc__
-    _name = 'calendar.todo'
+    __name__ = 'calendar.todo'
     _rec_name = 'uuid'
-
     calendar = fields.Many2One('calendar.calendar', 'Calendar',
             required=True, select=True, ondelete="CASCADE")
     alarms = fields.One2Many('calendar.todo.alarm', 'todo', 'Alarms')
@@ -110,102 +111,107 @@ class Todo(ModelSQL, ModelView):
         'Write Users'), 'get_calendar_field', searcher='search_calendar_field')
     vtodo = fields.Binary('vtodo')
 
-    def __init__(self):
-        super(Todo, self).__init__()
-        self._sql_constraints = [
+    @classmethod
+    def __setup__(cls):
+        super(Todo, cls).__setup__()
+        cls._sql_constraints = [
             #XXX should be unique across all componenets
             ('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):
+        pool = Pool()
         # 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([
+            models_data = ModelData.search([
                 ('fs_id', '=', 'rule_group_read_todo_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(Todo, self).init(module_name)
+            if models_data:
+                model_data, = models_data
+                Rule.delete([Rule(model_data.db_id)])
+        super(Todo, 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_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 default_percent_complete(self):
+    @staticmethod
+    def default_percent_complete():
         return 0
 
-    def on_change_status(self, vals):
+    def on_change_status(self):
         res = {}
-        if 'status' not in vals:
+        if not getattr(self, 'status', None):
             return res
-        if vals['status'] == 'completed':
+        if self.status == 'completed':
             res['percent_complete'] = 100
-            if not vals.get('completed'):
+            if not getattr(self, 'completed', None):
                 res['completed'] = datetime.datetime.now()
 
         return res
 
-    def timezones(self):
+    @staticmethod
+    def timezones():
         return [(x, x) for x in pytz.common_timezones] + [('', '')]
 
-    def get_calendar_field(self, ids, name):
-        assert name in ('calendar_owner', 'calendar_read_users',
-                'calendar_write_users'), 'Invalid name'
-        res = {}
-        for todo in self.browse(ids):
-            name = name[9:]
-            if name in ('read_users', 'write_users'):
-                res[todo.id] = [x.id for x in todo.calendar[name]]
-            else:
-                res[todo.id] = todo.calendar[name].id
-        return res
+    def get_calendar_field(self, name):
+        name = name[9:]
+        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 todo in self.browse(ids):
-            if not todo.parent:
-                continue
-            if todo.rdates \
-                    or todo.rrules \
-                    or todo.exdates \
-                    or todo.exrules \
-                    or todo.occurences:
-                return False
+        if not self.parent:
+            return True
+        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(Todo, self).create(values)
-        todo = self.browse(res)
+        todo = super(Todo, cls).create(values)
         if (todo.calendar.owner
                 and (todo.organizer == todo.calendar.owner.email
                     or (todo.parent
@@ -221,73 +227,72 @@ class Todo(ModelSQL, ModelView):
                         and x.email != todo.parent.organizer]
             if attendee_emails:
                 with Transaction().set_user(0):
-                    calendar_ids = calendar_obj.search([
+                    calendars = Calendar.search([
                         ('owner.email', 'in', attendee_emails),
                         ])
                     if not todo.recurrence:
-                        for calendar_id in calendar_ids:
-                            new_id = self.copy(todo.id, default={
-                                'calendar': calendar_id,
+                        for calendar in calendars:
+                            new_todo, = cls.copy([todo], default={
+                                'calendar': calendar.id,
                                 'occurences': None,
+                                'uuid': todo.uuid,
                                 })
                             for occurence in todo.occurences:
-                                self.copy(occurence.id, default={
-                                    'calendar': calendar_id,
-                                    'parent': new_id,
+                                cls.copy([occurence], default={
+                                    'calendar': calendar.id,
+                                    'parent': new_todo.id,
+                                    'uuid': occurence.uuid,
                                     })
                     else:
-                        parent_ids = self.search([
+                        parents = cls.search([
                             ('uuid', '=', todo.uuid),
                             ('calendar.owner.email', 'in', attendee_emails),
                             ('id', '!=', todo.id),
                             ('recurrence', '=', None),
                             ])
-                        for parent in self.browse(parent_ids):
-                            self.copy(todo.id, default={
+                        for parent in parents:
+                            cls.copy([todo], default={
                                 'calendar': parent.calendar.id,
                                 'parent': parent.id,
+                                'uuid': todo.uuid,
                                 })
         # Restart the cache for todo
-        collection_obj.todo.reset()
-        return res
-
-    def _todo2update(self, todo):
-        pool = Pool()
-        rdate_obj = pool.get('calendar.todo.rdate')
-        exdate_obj = pool.get('calendar.todo.exdate')
-        rrule_obj = pool.get('calendar.todo.rrule')
-        exrule_obj = pool.get('calendar.todo.exrule')
+        Collection._todo_cache.clear()
+        return todo
 
+    def _todo2update(self):
         res = {}
-        res['summary'] = todo.summary
-        res['description'] = todo.description
-        res['dtstart'] = todo.dtstart
-        res['percent_complete'] = todo.percent_complete
-        res['completed'] = todo.completed
-        res['location'] = todo.location.id
-        res['status'] = todo.status
-        res['organizer'] = todo.organizer
+        res['summary'] = self.summary
+        res['description'] = self.description
+        res['dtstart'] = self.dtstart
+        res['percent_complete'] = self.percent_complete
+        res['completed'] = self.completed
+        res['location'] = self.location.id
+        res['status'] = self.status
+        res['organizer'] = self.organizer
         res['rdates'] = [('delete_all',)]
-        for rdate in todo.rdates:
-            vals = rdate_obj._date2update(rdate)
+        for rdate in self.rdates:
+            vals = rdate._date2update()
             res['rdates'].append(('create', vals))
         res['exdates'] = [('delete_all',)]
-        for exdate in todo.exdates:
-            vals = exdate_obj._date2update(exdate)
+        for exdate in self.exdates:
+            vals = exdate._date2update()
             res['exdates'].append(('create', vals))
         res['rrules'] = [('delete_all',)]
-        for rrule in todo.rrules:
-            vals = rrule_obj._rule2update(rrule)
+        for rrule in self.rrules:
+            vals = rrule._rule2update()
             res['rrules'].append(('create', vals))
         res['exrules'] = [('delete_all',)]
-        for exrule in todo.exrules:
-            vals = exrule_obj._rule2update(exrule)
+        for exrule in self.exrules:
+            vals = exrule._rule2update()
             res['exrules'].append(('create', vals))
         return res
 
-    def write(self, ids, values):
-        calendar_obj = Pool().get('calendar.calendar')
-        collection_obj = Pool().get('webdav.collection')
+    @classmethod
+    def write(cls, todos, values):
+        pool = Pool()
+        Calendar = pool.get('calendar.calendar')
+        Collection = pool.get('webdav.collection')
 
         cursor = Transaction().cursor
 
@@ -295,19 +300,17 @@ class Todo(ModelSQL, ModelView):
         if 'sequence' in values:
             del values['sequence']
 
-        res = super(Todo, self).write(ids, values)
-
-        if isinstance(ids, (int, long)):
-            ids = [ids]
+        super(Todo, cls).write(todos, values)
 
+        ids = [t.id for t in todos]
         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 + '" ' \
+            cursor.execute('UPDATE "' + cls._table + '" ' \
                     'SET sequence = sequence + 1 ' \
                     'WHERE ' + red_sql, red_ids)
 
-        for todo in self.browse(ids):
+        for todo in todos:
             if todo.calendar.owner \
                     and (todo.organizer == todo.calendar.owner.email \
                     or (todo.parent \
@@ -322,57 +325,59 @@ class Todo(ModelSQL, ModelView):
                             and x.email != todo.parent.organizer]
                 if attendee_emails:
                     with Transaction().set_user(0):
-                        todo_ids = self.search([
+                        todo2s = cls.search([
                             ('uuid', '=', todo.uuid),
                             ('calendar.owner.email', 'in', attendee_emails),
                             ('id', '!=', todo.id),
                             ('recurrence', '=', todo.recurrence),
                             ])
-                    for todo2 in self.browse(todo_ids):
+                    for todo2 in todo2s:
                         if todo2.calendar.owner.email in attendee_emails:
                             attendee_emails.remove(todo2.calendar.owner.email)
                     with Transaction().set_user(0):
-                        self.write(todo_ids, self._todo2update(todo))
+                        cls.write(todos, todo._todo2update())
                 if attendee_emails:
                     with Transaction().set_user(0):
-                        calendar_ids = calendar_obj.search([
+                        calendars = Calendar.search([
                             ('owner.email', 'in', attendee_emails),
                             ])
                         if not todo.recurrence:
-                            for calendar_id in calendar_ids:
-                                new_id = self.copy(todo.id, default={
-                                    'calendar': calendar_id,
+                            for calendar in calendars:
+                                new_todo, = cls.copy([todo], default={
+                                    'calendar': calendar.id,
                                     'occurences': None,
+                                    'uuid': todo.uuid,
                                     })
                                 for occurence in todo.occurences:
-                                    self.copy(occurence.id, default={
-                                        'calendar': calendar_id,
-                                        'parent': new_id,
+                                    cls.copy([occurence], default={
+                                        'calendar': calendar.id,
+                                        'parent': new_todo.id,
+                                        'uuid': occurence.uuid,
                                         })
                         else:
-                            parent_ids = self.search([
+                            parents = cls.search([
                                     ('uuid', '=', todo.uuid),
                                     ('calendar.owner.email', 'in',
                                         attendee_emails),
                                     ('id', '!=', todo.id),
                                     ('recurrence', '=', None),
                                     ])
-                            for parent in self.browse(parent_ids):
-                                self.copy(todo.id, default={
+                            for parent in parents:
+                                cls.copy([todo], default={
                                     'calendar': parent.calendar.id,
                                     'parent': parent.id,
+                                    'uuid': todo.uuid,
                                     })
         # Restart the cache for todo
-        collection_obj.todo.reset()
-        return res
+        Collection._todo_cache.clear()
 
-    def delete(self, ids):
-        attendee_obj = Pool().get('calendar.todo.attendee')
-        collection_obj = Pool().get('webdav.collection')
+    @classmethod
+    def delete(cls, todos):
+        pool = Pool()
+        Attendee = pool.get('calendar.todo.attendee')
+        Collection = pool.get('webdav.collection')
 
-        if isinstance(ids, (int, long)):
-            ids = [ids]
-        for todo in self.browse(ids):
+        for todo in todos:
             if todo.calendar.owner \
                     and (todo.organizer == todo.calendar.owner.email \
                     or (todo.parent \
@@ -385,13 +390,13 @@ class Todo(ModelSQL, ModelView):
                             if x.email != todo.parent.organizer]
                 if attendee_emails:
                     with Transaction().set_user(0):
-                        todo_ids = self.search([
+                        todos_delete = cls.search([
                             ('uuid', '=', todo.uuid),
                             ('calendar.owner.email', 'in', attendee_emails),
                             ('id', '!=', todo.id),
                             ('recurrence', '=', todo.recurrence),
                             ])
-                        self.delete(todo_ids)
+                        cls.delete(todos_delete)
             elif todo.organizer \
                     or (todo.parent and todo.parent.organizer):
                 if todo.organizer:
@@ -399,62 +404,54 @@ class Todo(ModelSQL, ModelView):
                 else:
                     organizer = todo.parent.organizer
                 with Transaction().set_user(0):
-                    todo_ids = self.search([
+                    todo2s = cls.search([
                         ('uuid', '=', todo.uuid),
                         ('calendar.owner.email', '=', organizer),
                         ('id', '!=', todo.id),
                         ('recurrence', '=', todo.recurrence),
                         ], limit=1)
-                    if todo_ids:
-                        todo2 = self.browse(todo_ids[0])
+                    if todo2s:
+                        todo2, = todo2s
                         for attendee in todo2.attendees:
                             if attendee.email == todo.calendar.owner.email:
-                                attendee_obj.write(attendee.id, {
+                                Attendee.write([attendee], {
                                     'status': 'declined',
                                     })
-        res = super(Todo, self).delete(ids)
+        super(Todo, cls).delete(todos)
         # Restart the cache for todo
-        collection_obj.todo.reset()
-        return res
-
-    def copy(self, ids, default=None):
-        int_id = isinstance(ids, (int, long))
-        if int_id:
-            ids = [ids]
+        Collection._todo_cache.clear()
 
+    @classmethod
+    def copy(cls, todos, default=None):
         if default is None:
             default = {}
 
-        new_ids = []
-        for todo_id in ids:
+        new_todos = []
+        for todo in todos:
             current_default = default.copy()
-            current_default['uuid'] = self.default_uuid()
-            new_id = super(Todo, self).copy(todo_id, default=current_default)
-            new_ids.append(new_id)
+            current_default.setdefault('uuid', cls.default_uuid())
+            new_todo, = super(Todo, cls).copy([todo], default=current_default)
+            new_todos.append(new_todo)
+        return new_todos
 
-        if int_id:
-            return new_ids[0]
-        return new_ids
-
-    def ical2values(self, todo_id, ical, calendar_id, vtodo=None):
+    @classmethod
+    def ical2values(cls, todo_id, ical, calendar_id, vtodo=None):
         '''
-        Convert iCalendar to values for create or write
-
-        :param todo_id: the todo id for write or None for create
-        :param ical: a ical instance of vobject
-        :param calendar_id: the calendar id of the todo
-        :param vtodo: the vtodo 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:
+        todo_id: the todo id for write or None for create
+        ical: a ical instance of vobject
+        calendar_id: the calendar id of the todo
+        vtodo: the vtodo of the ical to use if None use the first one
         '''
         pool = Pool()
-        category_obj = pool.get('calendar.category')
-        location_obj = pool.get('calendar.location')
-        alarm_obj = pool.get('calendar.todo.alarm')
-        attendee_obj = pool.get('calendar.todo.attendee')
-        rdate_obj = pool.get('calendar.todo.rdate')
-        exdate_obj = pool.get('calendar.todo.exdate')
-        rrule_obj = pool.get('calendar.todo.rrule')
-        exrule_obj = pool.get('calendar.todo.exrule')
+        Category = pool.get('calendar.category')
+        Location = pool.get('calendar.location')
+        Alarm = pool.get('calendar.todo.alarm')
+        Attendee = pool.get('calendar.todo.attendee')
+        Rdate = pool.get('calendar.todo.rdate')
+        Exdate = pool.get('calendar.todo.exdate')
+        Rrule = pool.get('calendar.todo.rrule')
+        Exrule = pool.get('calendar.todo.exrule')
 
         vtodos = []
         if not vtodo:
@@ -467,7 +464,7 @@ class Todo(ModelSQL, ModelView):
 
         todo = None
         if todo_id:
-            todo = self.browse(todo_id)
+            todo = cls(todo_id)
         res = {}
         if not todo:
             if hasattr(vtodo, 'uid'):
@@ -535,40 +532,39 @@ class Todo(ModelSQL, ModelView):
         else:
             res['status'] = ''
         if hasattr(vtodo, 'categories'):
-            category_ids = category_obj.search([
+            categories = Category.search([
                 ('name', 'in', [x for x in vtodo.categories.value]),
                 ])
-            categories = category_obj.browse(category_ids)
             category_names2ids = {}
             for category in categories:
                 category_names2ids[category.name] = category.id
             for category in vtodo.categories.value:
                 if category not in category_names2ids:
-                    category_ids.append(category_obj.create({
+                    categories.append(Category.create({
                         'name': category,
                         }))
-            res['categories'] = [('set', category_ids)]
+            res['categories'] = [('set', [c.id for c in categories])]
         else:
             res['categories'] = [('unlink_all',)]
         if hasattr(vtodo, 'class'):
             if getattr(vtodo, 'class').value.lower() in \
-                    dict(self.classification.selection):
+                    dict(cls.classification.selection):
                 res['classification'] = getattr(vtodo, 'class').value.lower()
             else:
                 res['classification'] = 'public'
         else:
             res['classification'] = 'public'
         if hasattr(vtodo, 'location'):
-            location_ids = location_obj.search([
+            locations = Location.search([
                 ('name', '=', vtodo.location.value),
                 ], limit=1)
-            if not location_ids:
-                location_id = location_obj.create({
+            if not locations:
+                location, = Location.create({
                     'name': vtodo.location.value,
                     })
             else:
-                location_id = location_ids[0]
-            res['location'] = location_id
+                location, = locations
+            res['location'] = location.id
         else:
             res['location'] = None
 
@@ -590,7 +586,7 @@ class Todo(ModelSQL, ModelView):
         if hasattr(vtodo, 'attendee'):
             while vtodo.attendee_list:
                 attendee = vtodo.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))
@@ -606,7 +602,7 @@ class Todo(ModelSQL, ModelView):
             while vtodo.rdate_list:
                 rdate = vtodo.rdate_list.pop()
                 for date in rdate.value:
-                    vals = rdate_obj.date2values(date)
+                    vals = Rdate.date2values(date)
                     res['rdates'].append(('create', vals))
 
         res['exdates'] = []
@@ -616,7 +612,7 @@ class Todo(ModelSQL, ModelView):
             while vtodo.exdate_list:
                 exdate = vtodo.exdate_list.pop()
                 for date in exdate.value:
-                    vals = exdate_obj.date2values(date)
+                    vals = Exdate.date2values(date)
                     res['exdates'].append(('create', vals))
 
         res['rrules'] = []
@@ -625,7 +621,7 @@ class Todo(ModelSQL, ModelView):
         if hasattr(vtodo, 'rrule'):
             while vtodo.rrule_list:
                 rrule = vtodo.rrule_list.pop()
-                vals = rrule_obj.rule2values(rrule)
+                vals = Rrule.rule2values(rrule)
                 res['rrules'].append(('create', vals))
 
         res['exrules'] = []
@@ -634,7 +630,7 @@ class Todo(ModelSQL, ModelView):
         if hasattr(vtodo, 'exrule'):
             while vtodo.exrule_list:
                 exrule = vtodo.exrule_list.pop()
-                vals = exrule_obj.rule2values(exrule)
+                vals = Exrule.rule2values(exrule)
                 res['exrules'].append(('create', vals))
 
         if todo:
@@ -644,7 +640,7 @@ class Todo(ModelSQL, ModelView):
             res.setdefault('alarms', [])
             while vtodo.valarm_list:
                 valarm = vtodo.valarm_list.pop()
-                vals = alarm_obj.valarm2values(valarm)
+                vals = Alarm.valarm2values(valarm)
                 res['alarms'].append(('create', vals))
 
         if hasattr(ical, 'vtimezone'):
@@ -668,7 +664,7 @@ class Todo(ModelSQL, ModelView):
                             == vtodo.recurrence_id.value:
                         todo_id = occurence.id
                         occurences_todel.remove(occurence.id)
-            vals = self.ical2values(todo_id, ical, calendar_id, vtodo=vtodo)
+            vals = cls.ical2values(todo_id, ical, calendar_id, vtodo=vtodo)
             if todo:
                 vals['uuid'] = todo.uuid
             else:
@@ -683,361 +679,326 @@ class Todo(ModelSQL, ModelView):
             res['occurences'].append(('delete', occurences_todel))
         return res
 
-    def todo2ical(self, todo):
+    def todo2ical(self):
         '''
         Return an iCalendar instance of vobject for todo
-
-        :param todo: a BrowseRecord of calendar.todo
-            or a calendar.todo id
-        :return: an iCalendar instance of vobject
         '''
         pool = Pool()
-        user_obj = pool.get('res.user')
-        alarm_obj = pool.get('calendar.todo.alarm')
-        attendee_obj = pool.get('calendar.todo.attendee')
-        rdate_obj = pool.get('calendar.todo.rdate')
-        exdate_obj = pool.get('calendar.todo.exdate')
-        rrule_obj = pool.get('calendar.todo.rrule')
-        exrule_obj = pool.get('calendar.todo.exrule')
-
-        if isinstance(todo, (int, long)):
-            todo = self.browse(todo)
-
-        user = user_obj.browse(Transaction().user)
-        if todo.timezone:
-            tztodo = pytz.timezone(todo.timezone)
+        User = pool.get('res.user')
+
+        user = User(Transaction().user)
+        if self.timezone:
+            tztodo = dateutil.tz.gettz(self.timezone)
         elif user.timezone:
-                tztodo = pytz.timezone(user.timezone)
+            tztodo = dateutil.tz.gettz(user.timezone)
         else:
             tztodo = tzlocal
 
         ical = vobject.iCalendar()
         vtodo = ical.add('vtodo')
-        if todo.vtodo:
-            ical.vtodo = vobject.readOne(str(todo.vtodo))
+        if self.vtodo:
+            ical.vtodo = vobject.readOne(str(self.vtodo))
             vtodo = ical.vtodo
             ical.vtodo.transformToNative()
-        if todo.summary:
+        if self.summary:
             if not hasattr(vtodo, 'summary'):
                 vtodo.add('summary')
-            vtodo.summary.value = todo.summary
+            vtodo.summary.value = self.summary
         elif hasattr(vtodo, 'summary'):
             del vtodo.summary
-        if todo.percent_complete:
+        if self.percent_complete:
             if not hasattr(vtodo, 'percent-complete'):
                 vtodo.add('percent-complete')
-            vtodo.percent_complete.value = str(todo.percent_complete)
+            vtodo.percent_complete.value = str(self.percent_complete)
         elif hasattr(vtodo, 'percent_complete'):
             del vtodo.percent_complete
-        if todo.description:
+        if self.description:
             if not hasattr(vtodo, 'description'):
                 vtodo.add('description')
-            vtodo.description.value = todo.description
+            vtodo.description.value = self.description
         elif hasattr(vtodo, 'description'):
             del vtodo.description
 
-        if todo.completed:
+        if self.completed:
             if not hasattr(vtodo, 'completed'):
                 vtodo.add('completed')
-            vtodo.completed.value = todo.completed.replace(tzinfo=tzlocal)\
+            vtodo.completed.value = self.completed.replace(tzinfo=tzlocal)\
                     .astimezone(tzutc)
         elif hasattr(vtodo, 'completed'):
             del vtodo.completed
 
-        if todo.dtstart:
+        if self.dtstart:
             if not hasattr(vtodo, 'dtstart'):
                 vtodo.add('dtstart')
-            vtodo.dtstart.value = todo.dtstart.replace(tzinfo=tzlocal)\
+            vtodo.dtstart.value = self.dtstart.replace(tzinfo=tzlocal)\
                     .astimezone(tztodo)
         elif hasattr(vtodo, 'dtstart'):
             del vtodo.dtstart
 
-        if todo.due:
+        if self.due:
             if not hasattr(vtodo, 'due'):
                 vtodo.add('due')
-            vtodo.due.value = todo.due.replace(tzinfo=tzlocal)\
+            vtodo.due.value = self.due.replace(tzinfo=tzlocal)\
                     .astimezone(tztodo)
         elif hasattr(vtodo, 'due'):
             del vtodo.due
 
         if not hasattr(vtodo, 'created'):
             vtodo.add('created')
-        vtodo.created.value = todo.create_date.replace(
+        vtodo.created.value = self.create_date.replace(
             tzinfo=tzlocal).astimezone(tztodo)
         if not hasattr(vtodo, 'dtstamp'):
             vtodo.add('dtstamp')
-        date = todo.write_date or todo.create_date
+        date = self.write_date or self.create_date
         vtodo.dtstamp.value = date.replace(tzinfo=tzlocal).astimezone(tztodo)
         if not hasattr(vtodo, 'last-modified'):
             vtodo.add('last-modified')
         vtodo.last_modified.value = date.replace(
             tzinfo=tzlocal).astimezone(tztodo)
-        if todo.recurrence and todo.parent:
+        if self.recurrence and self.parent:
             if not hasattr(vtodo, 'recurrence-id'):
                 vtodo.add('recurrence-id')
-            vtodo.recurrence_id.value = todo.recurrence\
+            vtodo.recurrence_id.value = self.recurrence\
                     .replace(tzinfo=tzlocal).astimezone(tztodo)
         elif hasattr(vtodo, 'recurrence-id'):
             del vtodo.recurrence_id
-        if todo.status:
+        if self.status:
             if not hasattr(vtodo, 'status'):
                 vtodo.add('status')
-            vtodo.status.value = todo.status.upper()
+            vtodo.status.value = self.status.upper()
         elif hasattr(vtodo, 'status'):
             del vtodo.status
         if not hasattr(vtodo, 'uid'):
             vtodo.add('uid')
-        vtodo.uid.value = todo.uuid
+        vtodo.uid.value = self.uuid
         if not hasattr(vtodo, 'sequence'):
             vtodo.add('sequence')
-        vtodo.sequence.value = str(todo.sequence) or '0'
-        if todo.categories:
+        vtodo.sequence.value = str(self.sequence) or '0'
+        if self.categories:
             if not hasattr(vtodo, 'categories'):
                 vtodo.add('categories')
-            vtodo.categories.value = [x.name for x in todo.categories]
+            vtodo.categories.value = [x.name for x in self.categories]
         elif hasattr(vtodo, 'categories'):
             del vtodo.categories
         if not hasattr(vtodo, 'class'):
             vtodo.add('class')
-            getattr(vtodo, 'class').value = todo.classification.upper()
+            getattr(vtodo, 'class').value = self.classification.upper()
         elif getattr(vtodo, 'class').value.lower() in \
                 dict(self.classification.selection):
-            getattr(vtodo, 'class').value = todo.classification.upper()
-        if todo.location:
+            getattr(vtodo, 'class').value = self.classification.upper()
+        if self.location:
             if not hasattr(vtodo, 'location'):
                 vtodo.add('location')
-            vtodo.location.value = todo.location.name
+            vtodo.location.value = self.location.name
         elif hasattr(vtodo, 'location'):
             del vtodo.location
 
-        if todo.organizer:
+        if self.organizer:
             if not hasattr(vtodo, 'organizer'):
                 vtodo.add('organizer')
-            vtodo.organizer.value = 'MAILTO:' + todo.organizer
+            vtodo.organizer.value = 'MAILTO:' + self.organizer
         elif hasattr(vtodo, 'organizer'):
             del vtodo.organizer
 
         vtodo.attendee_list = []
-        for attendee in todo.attendees:
-            vtodo.attendee_list.append(
-                attendee_obj.attendee2attendee(attendee))
+        for attendee in self.attendees:
+            vtodo.attendee_list.append(attendee.attendee2attendee())
 
-        if todo.rdates:
+        if self.rdates:
             vtodo.add('rdate')
             vtodo.rdate.value = []
-            for rdate in todo.rdates:
-                vtodo.rdate.value.append(rdate_obj.date2date(rdate))
+            for rdate in self.rdates:
+                vtodo.rdate.value.append(rdate.date2date())
 
-        if todo.exdates:
+        if self.exdates:
             vtodo.add('exdate')
             vtodo.exdate.value = []
-            for exdate in todo.exdates:
-                vtodo.exdate.value.append(exdate_obj.date2date(exdate))
+            for exdate in self.exdates:
+                vtodo.exdate.value.append(exdate.date2date())
 
-        if todo.rrules:
-            for rrule in todo.rrules:
-                vtodo.add('rrule').value = rrule_obj.rule2rule(rrule)
+        if self.rrules:
+            for rrule in self.rrules:
+                vtodo.add('rrule').value = rrule.rule2rule()
 
-        if todo.exrules:
-            for exrule in todo.exrules:
-                vtodo.add('exrule').value = exrule_obj.rule2rule(exrule)
+        if self.exrules:
+            for exrule in self.exrules:
+                vtodo.add('exrule').value = exrule.rule2rule()
 
         vtodo.valarm_list = []
-        for alarm in todo.alarms:
-            valarm = alarm_obj.alarm2valarm(alarm)
+        for alarm in self.alarms:
+            valarm = alarm.alarm2valarm()
             if valarm:
                 vtodo.valarm_list.append(valarm)
 
-        for occurence in todo.occurences:
+        for occurence in self.occurences:
             rical = self.todo2ical(occurence)
             ical.vtodo_list.append(rical.vtodo)
         return ical
 
-Todo()
-
 
 class TodoCategory(ModelSQL):
     'Todo - Category'
-    _description = __doc__
-    _name = 'calendar.todo-calendar.category'
-
+    __name__ = 'calendar.todo-calendar.category'
     todo = fields.Many2One('calendar.todo', 'To-Do', ondelete='CASCADE',
             required=True, select=True)
     category = fields.Many2One('calendar.category', 'Category',
             ondelete='CASCADE', required=True, select=True)
 
-TodoCategory()
-
 
 class TodoRDate(ModelSQL, ModelView):
     'Todo Recurrence Date'
-    _description = __doc__
-    _name = 'calendar.todo.rdate'
+    __name__ = 'calendar.todo.rdate'
     _inherits = {'calendar.date': 'calendar_date'}
     _rec_name = 'datetime'
-
     calendar_date = fields.Many2One('calendar.date', 'Calendar Date',
             required=True, ondelete='CASCADE', select=True)
     todo = fields.Many2One('calendar.todo', 'Todo', 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(TodoRDate, self).init(module_name)
+        super(TodoRDate, cls).__register__(module_name)
 
-    def create(self, values):
-        todo_obj = Pool().get('calendar.todo')
+    @classmethod
+    def create(cls, values):
+        Todo = Pool().get('calendar.todo')
         if values.get('todo'):
             # Update write_date of todo
-            todo_obj.write(values['todo'], {})
-        return super(TodoRDate, self).create(values)
-
-    def write(self, ids, values):
-        todo_obj = Pool().get('calendar.todo')
-        if isinstance(ids, (int, long)):
-            ids = [ids]
-        todo_ids = [x.todo.id for x in self.browse(ids)]
+            Todo.write([Todo(values['todo'])], {})
+        return super(TodoRDate, cls).create(values)
+
+    @classmethod
+    def write(cls, rdates, values):
+        Todo = Pool().get('calendar.todo')
+        todos = [x.todo for x in rdates]
         if values.get('todo'):
-            todo_ids.append(values['todo'])
-        if todo_ids:
+            todos.append(Todo(values['todo']))
+        if todos:
             # Update write_date of todo
-            todo_obj.write(todo_ids, {})
-        return super(TodoRDate, self).write(ids, values)
-
-    def delete(self, ids):
-        todo_obj = Pool().get('calendar.todo')
-        rdate_obj = Pool().get('calendar.date')
-        if isinstance(ids, (int, long)):
-            ids = [ids]
-        todo_rdates = self.browse(ids)
-        rdate_ids = [a.calendar_date.id for a in todo_rdates]
-        todo_ids = [x.todo.id for x in todo_rdates]
-        if todo_ids:
-            # Update write_date of todo
-            todo_obj.write(todo_ids, {})
-        res = super(TodoRDate, self).delete(ids)
-        if rdate_ids:
-            rdate_obj.delete(rdate_ids)
-        return res
+            Todo.write(todos, {})
+        super(TodoRDate, cls).write(rdates, values)
 
-    def _date2update(self, date):
-        date_obj = Pool().get('calendar.date')
-        return date_obj._date2update(date)
+    @classmethod
+    def delete(cls, todo_rdates):
+        pool = Pool()
+        Todo = pool.get('calendar.todo')
+        Rdate = pool.get('calendar.date')
+        rdates = [a.calendar_date for a in todo_rdates]
+        todos = [x.todo for x in todo_rdates]
+        if todos:
+            # Update write_date of todo
+            Todo.write(todos, {})
+        super(TodoRDate, cls).delete(todo_rdates)
+        if rdates:
+            Rdate.delete(rdates)
 
-    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.calendar_date)
 
-TodoRDate()
+    @classmethod
+    def date2date(cls, date):
+        Date = Pool().get('calendar.date')
+        return Date.date2date(date.calendar_date)
 
 
 class TodoRRule(ModelSQL, ModelView):
     'Recurrence Rule'
-    _description = __doc__
-    _name = 'calendar.todo.rrule'
+    __name__ = 'calendar.todo.rrule'
     _inherits = {'calendar.rrule': 'calendar_rrule'}
     _rec_name = 'freq'
-
     calendar_rrule = fields.Many2One('calendar.rrule', 'Calendar RRule',
             required=True, ondelete='CASCADE', select=True)
     todo = fields.Many2One('calendar.todo', 'Todo', ondelete='CASCADE',
             select=True, required=True)
 
-    def create(self, values):
-        todo_obj = Pool().get('calendar.todo')
+    @classmethod
+    def create(cls, values):
+        Todo = Pool().get('calendar.todo')
         if values.get('todo'):
             # Update write_date of todo
-            todo_obj.write(values['todo'], {})
-        return super(TodoRRule, self).create(values)
-
-    def write(self, ids, values):
-        todo_obj = Pool().get('calendar.todo')
-        if isinstance(ids, (int, long)):
-            ids = [ids]
-        todo_ids = [x.todo.id for x in self.browse(ids)]
+            Todo.write([Todo(values['todo'])], {})
+        return super(TodoRRule, cls).create(values)
+
+    @classmethod
+    def write(cls, todo_rrules, values):
+        Todo = Pool().get('calendar.todo')
+        todos = [x.todo for x in todo_rrules]
         if values.get('todo'):
-            todo_ids.append(values['todo'])
-        if todo_ids:
-            # Update write_date of todo
-            todo_obj.write(todo_ids, {})
-        return super(TodoRRule, self).write(ids, values)
-
-    def delete(self, ids):
-        todo_obj = Pool().get('calendar.todo')
-        rrule_obj = Pool().get('calendar.rrule')
-        if isinstance(ids, (int, long)):
-            ids = [ids]
-        todo_rrules = self.browse(ids)
-        rrule_ids = [a.calendar_rrule.id for a in todo_rrules]
-        todo_ids = [x.todo.id for x in todo_rrules]
-        if todo_ids:
+            todos.append(Todo(values['todo']))
+        if todos:
             # Update write_date of todo
-            todo_obj.write(todo_ids, {})
-        res = super(TodoRRule, self).delete(ids)
-        if rrule_ids:
-            rrule_obj.delete(rrule_ids)
-        return res
+            Todo.write(todos, {})
+        super(TodoRRule, cls).write(todo_rrules, values)
 
-    def _rule2update(self, rule):
-        rule_obj = Pool().get('calendar.rrule')
-        return rule_obj._rule2update(rule)
+    @classmethod
+    def delete(cls, todo_rrules):
+        pool = Pool()
+        Todo = pool.get('calendar.todo')
+        Rrule = pool.get('calendar.rrule')
+        rrules = [a.calendar_rrule for a in todo_rrules]
+        todos = [x.todo for x in todo_rrules]
+        if todos:
+            # Update write_date of todo
+            Todo.write(todos, {})
+        super(TodoRRule, cls).delete(todo_rrules)
+        if rrules:
+            Rrule.delete(rrules)
 
-    def rule2values(self, rule):
-        rule_obj = Pool().get('calendar.rrule')
-        return rule_obj.rule2values(rule)
+    def _rule2update(self):
+        return self.calendar_rrule._rule2update()
 
-    def rule2rule(self, rule):
-        rule_obj = Pool().get('calendar.rrule')
-        return rule_obj.rule2rule(rule)
+    @classmethod
+    def rule2values(cls, rule):
+        Rule = Pool().get('calendar.rrule')
+        return Rule.rule2values(rule.calendar_rrule)
 
-TodoRRule()
+    @classmethod
+    def rule2rule(cls, rule):
+        Rule = Pool().get('calendar.rrule')
+        return Rule.rule2rule(rule.calendar_rrule)
 
 
 class TodoExDate(TodoRDate):
     'Exception Date'
-    _description = __doc__
-    _name = 'calendar.todo.exdate'
-
-TodoExDate()
+    __name__ = 'calendar.todo.exdate'
+    _table = 'calendar_todo_exdate'  # Needed to override TodoRDate._table
 
 
 class TodoExRule(TodoRRule):
     'Exception Rule'
-    _description = __doc__
-    _name = 'calendar.todo.exrule'
-
-TodoExRule()
+    __name__ = 'calendar.todo.exrule'
+    _table = 'calendar_todo_exrule'  # Needed to override TodoRRule._table
 
 
 class TodoAttendee(ModelSQL, ModelView):
     'Attendee'
-    _description = __doc__
-    _name = 'calendar.todo.attendee'
+    __name__ = 'calendar.todo.attendee'
     _inherits = {'calendar.attendee': 'calendar_attendee'}
-
     calendar_attendee = fields.Many2One('calendar.attendee',
         'Calendar Attendee', required=True, ondelete='CASCADE', select=True)
     todo = fields.Many2One('calendar.todo', 'Todo', ondelete='CASCADE',
             required=True, select=True)
 
-    def create(self, values):
-        todo_obj = Pool().get('calendar.todo')
+    @classmethod
+    def create(cls, values):
+        Todo = Pool().get('calendar.todo')
 
         if values.get('todo'):
             # Update write_date of todo
-            todo_obj.write(values['todo'], {})
-        res = super(TodoAttendee, self).create(values)
-        attendee = self.browse(res)
+            Todo.write([Todo(values['todo'])], {})
+        attendee = super(TodoAttendee, cls).create(values)
         todo = attendee.todo
         if (todo.calendar.owner
                 and (todo.organizer == todo.calendar.owner.email
@@ -1052,36 +1013,34 @@ class TodoAttendee(ModelSQL, ModelView):
                         if x.email != todo.parent.organizer]
             if attendee_emails:
                 with Transaction().set_user(0):
-                    todo_ids = todo_obj.search([
+                    todos = Todo.search([
                         ('uuid', '=', todo.uuid),
                         ('calendar.owner.email', 'in', attendee_emails),
                         ('id', '!=', todo.id),
                         ('recurrence', '=', todo.recurrence),
                         ])
-                    for todo_id in todo_ids:
-                        self.copy(res, default={
-                            'todo': todo_id,
+                    for todo in todos:
+                        cls.copy([attendee], default={
+                            'todo': todo.id,
                             })
-        return res
+        return attendee
 
-    def write(self, ids, values):
-        todo_obj = Pool().get('calendar.todo')
+    @classmethod
+    def write(cls, attendees, values):
+        Todo = Pool().get('calendar.todo')
 
-        if isinstance(ids, (int, long)):
-            ids = [ids]
-        todo_ids = [x.todo.id for x in self.browse(ids)]
+        todos = [x.todo.id for x in attendees]
         if values.get('todo'):
-            todo_ids.append(values['todo'])
-        if todo_ids:
+            todos.append(Todo(values['todo']))
+        if todos:
             # Update write_date of todo
-            todo_obj.write(todo_ids, {})
+            Todo.write(todos, {})
 
         if 'email' in values:
             values = values.copy()
             del values['email']
 
-        res = super(TodoAttendee, self).write(ids, values)
-        attendees = self.browse(ids)
+        super(TodoAttendee, cls).write(attendees, values)
         for attendee in attendees:
             todo = attendee.todo
             if todo.calendar.owner \
@@ -1096,7 +1055,7 @@ class TodoAttendee(ModelSQL, ModelView):
                             if x.email != todo.parent.organizer]
                 if attendee_emails:
                     with Transaction().set_user(0):
-                        attendee_ids = self.search([
+                        attendees2 = cls.search([
                             ('todo.uuid', '=', todo.uuid),
                             ('todo.calendar.owner.email', 'in',
                                     attendee_emails),
@@ -1104,25 +1063,21 @@ class TodoAttendee(ModelSQL, ModelView):
                             ('todo.recurrence', '=', todo.recurrence),
                             ('email', '=', attendee.email),
                             ])
-                        self.write(attendee_ids, self._attendee2update(
-                                attendee))
-        return res
+                        cls.write(attendees2, attendee._attendee2update())
+
+    @classmethod
+    def delete(cls, todo_attendees):
+        pool = Pool()
+        Todo = pool.get('calendar.todo')
+        Attendee = pool.get('calendar.attendee')
 
-    def delete(self, ids):
-        todo_obj = Pool().get('calendar.todo')
-        attendee_obj = Pool().get('calendar.attendee')
-
-        if isinstance(ids, (int, long)):
-            ids = [ids]
-        todo_attendees = self.browse(ids)
-        calendar_attendee_ids = [a.calendar_attendee.id \
-                for a in todo_attendees]
-        todo_ids = [x.todo.id for x in todo_attendees]
-        if todo_ids:
+        calendar_attendees = [a.calendar_attendee for a in todo_attendees]
+        todos = [x.todo for x in todo_attendees]
+        if todos:
             # Update write_date of todo
-            todo_obj.write(todo_ids, {})
+            Todo.write(todos, {})
 
-        for attendee in self.browse(ids):
+        for attendee in todo_attendees:
             todo = attendee.todo
             if todo.calendar.owner \
                     and (todo.organizer == todo.calendar.owner.email \
@@ -1136,7 +1091,7 @@ class TodoAttendee(ModelSQL, ModelView):
                             if x.email != todo.parent.organizer]
                 if attendee_emails:
                     with Transaction().set_user(0):
-                        attendee_ids = self.search([
+                        attendees = cls.search([
                             ('todo.uuid', '=', todo.uuid),
                             ('todo.calendar.owner.email', 'in',
                                 attendee_emails),
@@ -1144,7 +1099,7 @@ class TodoAttendee(ModelSQL, ModelView):
                             ('todo.recurrence', '=', todo.recurrence),
                             ('email', '=', attendee.email),
                             ])
-                        self.delete(attendee_ids)
+                        cls.delete(attendees)
             elif todo.calendar.organizer \
                     and ((todo.organizer \
                     or (todo.parent and todo.parent.organizer)) \
@@ -1154,110 +1109,98 @@ class TodoAttendee(ModelSQL, ModelView):
                 else:
                     organizer = todo.parent.organizer
                 with Transaction().set_user(0):
-                    attendee_ids = self.search([
+                    attendees = cls.search([
                         ('todo.uuid', '=', todo.uuid),
                         ('todo.calendar.owner.email', '=', organizer),
                         ('id', '!=', attendee.id),
                         ('todo.recurrence', '=', todo.recurrence),
                         ('email', '=', attendee.email),
                         ])
-                    if attendee_ids:
-                        self.write(attendee_ids, {
+                    if attendees:
+                        cls.write(attendees, {
                             'status': 'declined',
                             })
-        res = super(TodoAttendee, self).delete(ids)
-        if calendar_attendee_ids:
-            attendee_obj.delete(calendar_attendee_ids)
-        return res
+        super(TodoAttendee, cls).delete(todo_attendees)
+        if calendar_attendees:
+            Attendee.delete(calendar_attendees)
 
-    def copy(self, ids, default=None):
-        attendee_obj = Pool().get('calendar.attendee')
+    @classmethod
+    def copy(cls, todo_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(TodoAttendee, self).copy(attendee.id,
-                    default=default)
-            new_ids.append(new_id)
-        if int_id:
-            return new_ids[0]
-        return new_ids
-
-    def _attendee2update(self, attendee):
-        attendee_obj = Pool().get('calendar.attendee')
-        return attendee_obj._attendee2update(attendee)
+        new_attendees = []
+        for attendee in todo_attendees:
+            default['calendar_attendee'], = Attendee.copy(
+                [attendee.calendar_attendee])
+            new_attendee, = super(TodoAttendee, cls).copy([attendee],
+                default=default)
+            new_attendees.append(new_attendee)
+        return new_attendees
 
-    def attendee2values(self, attendee):
-        attendee_obj = Pool().get('calendar.attendee')
-        return attendee_obj.attendee2values(attendee)
+    def _attendee2update(self):
+        return self.calendar_attendee._attendee2update()
 
-    def attendee2attendee(self, attendee):
-        attendee_obj = Pool().get('calendar.attendee')
-        return attendee_obj.attendee2attendee(attendee)
+    @classmethod
+    def attendee2values(cls, attendee):
+        Attendee = Pool().get('calendar.attendee')
+        return Attendee.attendee2values(attendee.calendar_attendee)
 
-TodoAttendee()
+    @classmethod
+    def attendee2attendee(cls, attendee):
+        Attendee = Pool().get('calendar.attendee')
+        return Attendee.attendee2attendee(attendee.calendar_attendee)
 
 
 class TodoAlarm(ModelSQL):
     'Alarm'
-    _description = __doc__
-    _name = 'calendar.todo.alarm'
+    __name__ = 'calendar.todo.alarm'
     _inherits = {'calendar.alarm': 'calendar_alarm'}
-
     calendar_alarm = fields.Many2One('calendar.alarm', 'Calendar Alarm',
             required=True, ondelete='CASCADE', select=True)
     todo = fields.Many2One('calendar.todo', 'Todo', ondelete='CASCADE',
             required=True, select=True)
 
-    def create(self, values):
-        todo_obj = Pool().get('calendar.todo')
+    @classmethod
+    def create(cls, values):
+        Todo = Pool().get('calendar.todo')
         if values.get('todo'):
             # Update write_date of todo
-            todo_obj.write(values['todo'], {})
-        return super(TodoAlarm, self).create(values)
-
-    def write(self, ids, values):
-        todo_obj = Pool().get('calendar.todo')
-        if isinstance(ids, (int, long)):
-            ids = [ids]
-        todo_ids = [x.todo.id for x in self.browse(ids)]
+            Todo.write([Todo(values['todo'])], {})
+        return super(TodoAlarm, cls).create(values)
+
+    @classmethod
+    def write(cls, alarms, values):
+        Todo = Pool().get('calendar.todo')
+        todos = [x.todo for x in alarms]
         if values.get('todo'):
-            todo_ids.append(values['todo'])
-        if todo_ids:
+            todos.append(Todo(values['todo']))
+        if todos:
             # Update write_date of todo
-            todo_obj.write(todo_ids, {})
-        return super(TodoAlarm, self).write(ids, values)
-
-    def delete(self, ids):
-        todo_obj = Pool().get('calendar.todo')
-        alarm_obj = Pool().get('calendar.alarm')
-        if isinstance(ids, (int, long)):
-            ids = [ids]
-        todo_alarms = self.browse(ids)
-        alarm_ids = [a.calendar_alarm.id for a in todo_alarms]
-        todo_ids = [x.todo.id for x in todo_alarms]
-        if todo_ids:
+            Todo.write(todos, {})
+        super(TodoAlarm, cls).write(alarms, values)
+
+    @classmethod
+    def delete(cls, todo_alarms):
+        pool = Pool()
+        Todo = pool.get('calendar.todo')
+        Alarm = pool.get('calendar.alarm')
+        alarms = [a.calendar_alarm for a in todo_alarms]
+        todos = [x.todo for x in todo_alarms]
+        if todos:
             # Update write_date of todo
-            todo_obj.write(todo_ids, {})
-        res = super(TodoAlarm, self).delete(ids)
-        if alarm_ids:
-            alarm_obj.delete(alarm_ids)
-        return res
+            Todo.write(todos, {})
+        super(TodoAlarm, cls).delete(todo_alarms)
+        if alarms:
+            Alarm.delete(alarms)
 
-    def valarm2values(self, alarm):
-        alarm_obj = Pool().get('calendar.alarm')
-        return alarm_obj.valarm2values(alarm)
+    @classmethod
+    def valarm2values(cls, alarm):
+        Alarm = Pool().get('calendar.alarm')
+        return Alarm.valarm2values(alarm.calendar_alarm)
 
     def alarm2valarm(self, alarm):
-        alarm_obj = Pool().get('calendar.alarm')
-        return alarm_obj.alarm2valarm(alarm)
-
-TodoAlarm()
+        Alarm = Pool().get('calendar.alarm')
+        return Alarm.alarm2valarm(alarm.calendar_alarm)
diff --git a/tryton.cfg b/tryton.cfg
new file mode 100644
index 0000000..2c4b4f3
--- /dev/null
+++ b/tryton.cfg
@@ -0,0 +1,9 @@
+[tryton]
+version=2.6.0
+depends:
+    calendar
+    ir
+    res
+    webdav
+xml:
+    todo.xml
diff --git a/trytond_calendar_todo.egg-info/PKG-INFO b/trytond_calendar_todo.egg-info/PKG-INFO
index 7546ef5..c684d79 100644
--- a/trytond_calendar_todo.egg-info/PKG-INFO
+++ b/trytond_calendar_todo.egg-info/PKG-INFO
@@ -1,13 +1,49 @@
 Metadata-Version: 1.0
 Name: trytond-calendar-todo
-Version: 2.4.2
-Summary: Add Todo support on CalDAV
+Version: 2.6.0
+Summary: Tryton module to add TODO on 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_todo
+        =====================
+        
+        The calendar_todo 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_todo.egg-info/SOURCES.txt b/trytond_calendar_todo.egg-info/SOURCES.txt
index 79ef172..a150cbb 100644
--- a/trytond_calendar_todo.egg-info/SOURCES.txt
+++ b/trytond_calendar_todo.egg-info/SOURCES.txt
@@ -6,8 +6,8 @@ MANIFEST.in
 README
 setup.py
 todo.xml
+tryton.cfg
 ./__init__.py
-./__tryton__.py
 ./caldav.py
 ./todo.py
 ./webdav.py
diff --git a/trytond_calendar_todo.egg-info/requires.txt b/trytond_calendar_todo.egg-info/requires.txt
index f65a590..466ce88 100644
--- a/trytond_calendar_todo.egg-info/requires.txt
+++ b/trytond_calendar_todo.egg-info/requires.txt
@@ -2,5 +2,5 @@ vobject >= 0.8.0
 PyWebDAV >= 0.9.8
 python-dateutil
 pytz
-trytond_calendar >= 2.4, < 2.5
-trytond >= 2.4, < 2.5
\ No newline at end of file
+trytond_calendar >= 2.6, < 2.7
+trytond >= 2.6, < 2.7
\ No newline at end of file
diff --git a/webdav.py b/webdav.py
index 0999191..b3ea843 100644
--- a/webdav.py
+++ b/webdav.py
@@ -3,36 +3,33 @@
 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.transaction import Transaction
 from trytond.cache import Cache
-from trytond.pool import Pool
+from trytond.pool import Pool, PoolMeta
 
+__all__ = ['Collection']
+__metaclass__ = PoolMeta
 
-class Collection(ModelSQL, ModelView):
 
-    _name = "webdav.collection"
+class Collection:
+    __name__ = "webdav.collection"
+    _todo_cache = Cache('webdav_collection.todo')
 
-    @Cache('webdav_collection.todo')
-    def todo(self, uri, calendar_id=False):
+    @classmethod
+    def todo(cls, uri, calendar_id=False):
         '''
         Return the todo id in the uri
-
-        :param uri: the uri
-        :param calendar_id: the calendar id
-        :return: todo id
-            or None if there is no todo
         '''
-        todo_obj = Pool().get('calendar.todo')
+        Todo = Pool().get('calendar.todo')
 
         if uri and uri.startswith('Calendars/'):
             calendar, todo_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
-            todo_ids = todo_obj.search([
+            todo_ids = Todo.search([
                 ('calendar', '=', calendar_id),
                 ('uuid', '=', todo_uri[:-4]),
                 ('parent', '=', None),
@@ -40,12 +37,10 @@ class Collection(ModelSQL, ModelView):
             if todo_ids:
                 return todo_ids[0]
 
-    def _caldav_filter_domain_todo(self, filter):
+    @classmethod
+    def _caldav_filter_domain_todo(cls, filter):
         '''
         Return a domain for caldav filter on todo
-
-        :param filter: the DOM Element of filter
-        :return: a list for domain
         '''
         res = []
         if not filter:
@@ -98,78 +93,81 @@ class Collection(ModelSQL, ModelView):
                         continue
                     if uri:
                         uri = urllib.unquote_plus(uri)
-                    todo_id = self.todo(uri)
+                    todo_id = cls.todo(uri)
                     if todo_id:
                         ids.append(todo_id)
             return [('id', 'in', ids)]
         return res
 
-    def get_childs(self, uri, filter=None, cache=None):
-        todo_obj = Pool().get('calendar.todo')
+    @classmethod
+    def get_childs(cls, uri, filter=None, cache=None):
+        Todo = Pool().get('calendar.todo')
 
-        res = super(Collection, self).get_childs(uri, filter=filter,
+        res = super(Collection, cls).get_childs(uri, filter=filter,
                 cache=cache)
 
         if uri and (uri not in ('Calendars', 'Calendars/')) 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_todo(filter)
-                todo_ids = todo_obj.search([
+                domain = cls._caldav_filter_domain_todo(filter)
+                todos = Todo.search([
                     ('calendar', '=', calendar_id),
                     domain,
                     ])
-                todos = todo_obj.browse(todo_ids)
                 if cache is not None:
                     cache.setdefault('_calendar', {})
-                    cache['_calendar'].setdefault(todo_obj._name, {})
-                    for todo_id in todo_ids:
-                        cache['_calendar'][todo_obj._name][todo_id] = {}
+                    cache['_calendar'].setdefault(Todo.__name__, {})
+                    for todo in todos:
+                        cache['_calendar'][Todo.__name__][todo.id] = {}
                 return res + [x.uuid + '.ics' for x in todos]
 
         return res
 
-    def get_resourcetype(self, uri, cache=None):
+    @classmethod
+    def get_resourcetype(cls, uri, cache=None):
         from DAV.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
-            if self.todo(uri, calendar_id=calendar_id):
+            if cls.todo(uri, calendar_id=calendar_id):
                 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_contenttype(self, uri, cache=None):
-        if self.todo(uri) \
-                or self.calendar(uri, ics=True):
+    @classmethod
+    def get_contenttype(cls, uri, cache=None):
+        if (cls.todo(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):
-        todo_obj = Pool().get('calendar.todo')
+    @classmethod
+    def get_creationdate(cls, uri, cache=None):
+        Todo = Pool().get('calendar.todo')
 
         cursor = Transaction().cursor
 
-        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 and (uri[10:].split('/', 1) + [None])[1]:
 
-            todo_id = self.todo(uri, calendar_id=calendar_id)
+            todo_id = cls.todo(uri, calendar_id=calendar_id)
             if todo_id:
                 if cache is not None:
                     cache.setdefault('_calendar', {})
-                    cache['_calendar'].setdefault(todo_obj._name, {})
-                    ids = cache['_calendar'][todo_obj._name].keys()
+                    cache['_calendar'].setdefault(Todo.__name__, {})
+                    ids = cache['_calendar'][Todo.__name__].keys()
                     if todo_id not in ids:
                         ids.append(todo_id)
                     elif 'creationdate' in cache['_calendar'][
-                            todo_obj._name][todo_id]:
-                        return cache['_calendar'][todo_obj._name][
+                            Todo.__name__][todo_id]:
+                        return cache['_calendar'][Todo.__name__][
                             todo_id]['creationdate']
                 else:
                     ids = [todo_id]
@@ -179,39 +177,40 @@ class Collection(ModelSQL, ModelView):
                     red_sql, red_ids = reduce_ids('id', sub_ids)
                     cursor.execute('SELECT id, ' \
                             'EXTRACT(epoch FROM create_date) ' \
-                        'FROM "' + todo_obj._table + '" ' \
+                        'FROM "' + Todo.__table__ + '" ' \
                         'WHERE ' + red_sql, red_ids)
                     for todo_id2, date in cursor.fetchall():
                         if todo_id2 == todo_id:
                             res = date
                         if cache is not None:
-                            cache['_calendar'][todo_obj._name]\
+                            cache['_calendar'][Todo.__name__]\
                                     .setdefault(todo_id2, {})
-                            cache['_calendar'][todo_obj._name][
+                            cache['_calendar'][Todo.__name__][
                                 todo_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):
-        todo_obj = Pool().get('calendar.todo')
+    @classmethod
+    def get_lastmodified(cls, uri, cache=None):
+        Todo = Pool().get('calendar.todo')
 
         cursor = Transaction().cursor
 
-        calendar_id = self.calendar(uri)
+        calendar_id = cls.calendar(uri)
         if calendar_id and (uri[10:].split('/', 1) + [None])[1]:
-            todo_id = self.todo(uri, calendar_id=calendar_id)
+            todo_id = cls.todo(uri, calendar_id=calendar_id)
             if todo_id:
                 if cache is not None:
                     cache.setdefault('_calendar', {})
-                    cache['_calendar'].setdefault(todo_obj._name, {})
-                    ids = cache['_calendar'][todo_obj._name].keys()
+                    cache['_calendar'].setdefault(Todo.__name__, {})
+                    ids = cache['_calendar'][Todo.__name__].keys()
                     if todo_id not in ids:
                         ids.append(todo_id)
                     elif 'lastmodified' in cache['_calendar'][
-                            todo_obj._name][todo_id]:
-                        return cache['_calendar'][todo_obj._name][
+                            Todo.__name__][todo_id]:
+                        return cache['_calendar'][Todo.__name__][
                             todo_id]['lastmodified']
                 else:
                     ids = [todo_id]
@@ -224,7 +223,7 @@ class Collection(ModelSQL, ModelView):
                     cursor.execute('SELECT COALESCE(parent, id), ' \
                                 'MAX(EXTRACT(epoch FROM ' \
                                 'COALESCE(write_date, create_date))) ' \
-                            'FROM "' + todo_obj._table + '" ' \
+                            'FROM "' + Todo.__table__ + '" ' \
                             'WHERE ' + red_id_sql + ' ' \
                                 'OR ' + red_parent_sql + ' ' \
                             'GROUP BY parent, id', red_id_ids + red_parent_ids)
@@ -232,83 +231,85 @@ class Collection(ModelSQL, ModelView):
                         if todo_id2 == todo_id:
                             res = date
                         if cache is not None:
-                            cache['_calendar'][todo_obj._name]\
+                            cache['_calendar'][Todo.__name__]\
                                     .setdefault(todo_id2, {})
-                            cache['_calendar'][todo_obj._name][
+                            cache['_calendar'][Todo.__name__][
                                 todo_id2]['lastmodified'] = 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):
-        todo_obj = Pool().get('calendar.todo')
+    @classmethod
+    def get_data(cls, uri, cache=None):
+        Todo = Pool().get('calendar.todo')
 
-        calendar_id = self.calendar(uri)
+        calendar_id = cls.calendar(uri)
         if calendar_id:
             if not (uri[10:].split('/', 1) + [None])[1]:
                 raise DAV_NotFound
-            todo_id = self.todo(uri, calendar_id=calendar_id)
+            todo_id = cls.todo(uri, calendar_id=calendar_id)
             if not todo_id:
-                return super(Collection, self).get_data(uri, cache=cache)
-            ical = todo_obj.todo2ical(todo_id)
+                return super(Collection, cls).get_data(uri, cache=cache)
+            ical = Todo(todo_id).todo2ical()
             return ical.serialize()
 
-        return super(Collection, self).get_data(uri, cache=cache)
+        return super(Collection, cls).get_data(uri, cache=cache)
 
-    def put(self, uri, data, content_type, cache=None):
-        todo_obj = Pool().get('calendar.todo')
-        calendar_obj = Pool().get('calendar.calendar')
+    @classmethod
+    def put(cls, uri, data, content_type, cache=None):
+        pool = Pool()
+        Todo = pool.get('calendar.todo')
+        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
-            todo_id = self.todo(uri, calendar_id=calendar_id)
+            todo_id = cls.todo(uri, calendar_id=calendar_id)
             ical = vobject.readOne(data)
             if not hasattr(ical, 'vtodo'):
-                return super(Collection, self).put(uri, data, content_type)
+                return super(Collection, cls).put(uri, data, content_type)
 
             if not todo_id:
 
-                values = todo_obj.ical2values(None, ical, calendar_id)
-                todo_id = todo_obj.create(values)
-                todo = todo_obj.browse(todo_id)
-                calendar = calendar_obj.browse(calendar_id)
+                values = Todo.ical2values(None, ical, calendar_id)
+                todo = Todo.create(values)
+                calendar = Calendar(calendar_id)
                 return Transaction().cursor.database_name + '/Calendars/' + \
                         calendar.name + '/' + todo.uuid + '.ics'
             else:
-                values = todo_obj.ical2values(todo_id, ical, calendar_id)
-                todo_obj.write(todo_id, values)
+                values = Todo.ical2values(todo_id, ical, calendar_id)
+                Todo.write([Todo(todo_id)], values)
                 return
 
-        return super(Collection, self).put(uri, data, content_type)
+        return super(Collection, cls).put(uri, data, content_type)
 
-    def rm(self, uri, cache=None):
-        todo_obj = Pool().get('calendar.todo')
+    @classmethod
+    def rm(cls, uri, cache=None):
+        Todo = Pool().get('calendar.todo')
 
-        calendar_id = self.calendar(uri)
+        calendar_id = cls.calendar(uri)
         if calendar_id:
             if not (uri[10:].split('/', 1) + [None])[1]:
                 raise DAV_Forbidden
-            todo_id = self.todo(uri, calendar_id=calendar_id)
+            todo_id = cls.todo(uri, calendar_id=calendar_id)
             if todo_id:
                 try:
-                    todo_obj.delete(todo_id)
+                    Todo.delete([Todo(todo_id)])
                 except Exception:
                     raise DAV_Forbidden
                 return 200
-        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.todo(uri, calendar_id=calendar_id):
+            if cls.todo(uri, calendar_id=calendar_id):
                 return 1
-        return super(Collection, self).exists(uri, cache=cache)
-
-Collection()
+        return super(Collection, cls).exists(uri, cache=cache)
commit 86d7007309187b5335e70366d86a9e910f35a4f9
Author: Mathias Behrle <mathiasb at m9s.biz>
Date:   Tue Sep 18 16:07:19 2012 +0200

    Releasing debian version 2.4.2-2.

diff --git a/debian/changelog b/debian/changelog
index 3e5a8a0..9a1a501 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,17 @@
+tryton-modules-calendar-todo (2.4.2-2) experimental; urgency=low
+
+  [ Daniel Baumann ]
+  * Updating maintainers field.
+  * Updating vcs fields.
+  * Correcting copyright file to match format version 1.0.
+  * Switching to xz compression.
+  * Updating to debhelper version 9.
+
+  [ Mathias Behrle ]
+  * Merging branch debian-wheezy-2.2 (Closes: #687754).
+
+ -- Mathias Behrle <mathiasb at m9s.biz>  Mon, 17 Sep 2012 16:47:04 +0200
+
 tryton-modules-calendar-todo (2.4.2-1) experimental; urgency=low
 
   * Merging upstream version 2.4.2.
commit 3ca0afdc026d049c8ed7386b8936f605093d00b9
Author: Daniel Baumann <daniel at debian.org>
Date:   Sat Jun 30 18:02:28 2012 +0200

    Updating to debhelper version 9.

diff --git a/debian/compat b/debian/compat
index 45a4fb7..ec63514 100644
--- a/debian/compat
+++ b/debian/compat
@@ -1 +1 @@
-8
+9
diff --git a/debian/control b/debian/control
index 840e0e4..44443ff 100644
--- a/debian/control
+++ b/debian/control
@@ -4,7 +4,7 @@ Priority: optional
 Maintainer: Debian Tryton Maintainers <maintainers at debian.tryton.org>
 Uploaders: Daniel Baumann <daniel at debian.org>, Mathias Behrle <mathiasb at m9s.biz>
 Dm-Upload-Allowed: yes
-Build-Depends: debhelper (>= 8), python (>= 2.6.6-3~), python-setuptools
+Build-Depends: debhelper (>= 9), python (>= 2.6.6-3~), python-setuptools
 Standards-Version: 3.9.3
 Homepage: http://www.tryton.org/
 Vcs-Browser: http://debian.tryton.org/gitweb/?p=packages/tryton-modules-calendar-todo.git
commit 5bb38926e18f2273059ca388df7cdfd50ea97137
Author: Daniel Baumann <daniel at debian.org>
Date:   Sat Jun 30 17:54:36 2012 +0200

    Switching to xz compression.

diff --git a/debian/rules b/debian/rules
index e32b791..1ae0776 100755
--- a/debian/rules
+++ b/debian/rules
@@ -7,3 +7,6 @@ override_dh_auto_clean:
 	dh_auto_clean
 
 	rm -rf *.egg-info
+
+override_dh_builddeb:
+	dh_builddeb -- -Zxz -z9
diff --git a/debian/source/options b/debian/source/options
index d053b65..22a4de9 100644
--- a/debian/source/options
+++ b/debian/source/options
@@ -1,2 +1,2 @@
-compression = gzip
+compression = xz
 compression-level = 9
commit 7182bf9777020874c89075e0d922dadc9c70a971
Author: Daniel Baumann <daniel at debian.org>
Date:   Sat Jun 30 17:50:23 2012 +0200

    Correcting copyright file to match format version 1.0.

diff --git a/debian/copyright b/debian/copyright
index 3ec403d..99aff32 100644
--- a/debian/copyright
+++ b/debian/copyright
@@ -2,15 +2,15 @@ Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
 
 Files: *
 Copyright:
- (C) 2009-2012 Cedric Krier
- (C) 2009-2012 Bertrand Chenal
- (C) 2009-2012 B2CK SPRL
+           2009-2012 Cedric Krier
+           2009-2012 Bertrand Chenal
+           2009-2012 B2CK SPRL
 License: GPL-3+
 
 Files: debian/*
 Copyright:
- (C) 2009-2012 Daniel Baumann <daniel at debian.org>
- (C) 2012 Mathias Behrle <mathiasb at m9s.biz>
+           2009-2012 Daniel Baumann <daniel at debian.org>
+           2012 Mathias Behrle <mathiasb at m9s.biz>
 License: GPL-3+
 
 License: GPL-3+
commit abf4e93f07e2cb5f425652510f1e789612a45e72
Author: Daniel Baumann <daniel at 127011.net>
Date:   Sat Jun 30 16:55:04 2012 +0200

    Updating vcs fields.

diff --git a/debian/control b/debian/control
index 4964fdd..840e0e4 100644
--- a/debian/control
+++ b/debian/control
@@ -7,8 +7,8 @@ Dm-Upload-Allowed: yes
 Build-Depends: debhelper (>= 8), python (>= 2.6.6-3~), python-setuptools
 Standards-Version: 3.9.3
 Homepage: http://www.tryton.org/
-Vcs-Browser: http://git.debian-maintainers.org/?p=tryton/tryton-modules-calendar-todo.git
-Vcs-Git: git://git.debian-maintainers.org/git/tryton/tryton-modules-calendar-todo.git
+Vcs-Browser: http://debian.tryton.org/gitweb/?p=packages/tryton-modules-calendar-todo.git
+Vcs-Git: git://debian.tryton.org/git/packages/tryton-modules-calendar-todo.git
 X-Python-Version: >= 2.6
 
 Package: tryton-modules-calendar-todo
commit e14be4dea312fb4daf695bee867fa9ff01aabad7
Author: Daniel Baumann <daniel at 127011.net>
Date:   Sat Jun 30 16:52:30 2012 +0200

    Updating maintainers field.

diff --git a/debian/control b/debian/control
index 106f8f7..4964fdd 100644
--- a/debian/control
+++ b/debian/control
@@ -1,7 +1,7 @@
 Source: tryton-modules-calendar-todo
 Section: python
 Priority: optional
-Maintainer: Debian Tryton Maintainers <tryton at lists.debian-maintainers.org>
+Maintainer: Debian Tryton Maintainers <maintainers at debian.tryton.org>
 Uploaders: Daniel Baumann <daniel at debian.org>, Mathias Behrle <mathiasb at m9s.biz>
 Dm-Upload-Allowed: yes
 Build-Depends: debhelper (>= 8), python (>= 2.6.6-3~), python-setuptools
commit d09cccbdc0df6e43d7ca307ce0d93bd974c62de7
Author: Mathias Behrle <mathiasb at m9s.biz>
Date:   Tue Sep 11 14:28:53 2012 +0200

    Releasing debian version 2.4.2-1.

diff --git a/debian/changelog b/debian/changelog
index cb475dd..3e5a8a0 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,9 @@
+tryton-modules-calendar-todo (2.4.2-1) experimental; urgency=low
+
+  * Merging upstream version 2.4.2.
+
+ -- Mathias Behrle <mathiasb at m9s.biz>  Tue, 11 Sep 2012 13:27:33 +0200
+
 tryton-modules-calendar-todo (2.4.1-1) experimental; urgency=low
 
   * Merging upstream version 2.4.0.
commit a31ce9618b11cd8f09d98f0fff312b212083052a
Author: Mathias Behrle <mathiasb at m9s.biz>
Date:   Tue Sep 11 13:25:52 2012 +0200

    Merging upstream version 2.4.2.

diff --git a/CHANGELOG b/CHANGELOG
index 629ed01..b9a4c76 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 e706a1e..8e0cd51 100644
--- a/PKG-INFO
+++ b/PKG-INFO
@@ -1,6 +1,6 @@
 Metadata-Version: 1.0
 Name: trytond_calendar_todo
-Version: 2.4.1
+Version: 2.4.2
 Summary: Add Todo support on CalDAV
 Home-page: http://www.tryton.org/
 Author: B2CK
diff --git a/__tryton__.py b/__tryton__.py
index 1798545..0c22fdc 100644
--- a/__tryton__.py
+++ b/__tryton__.py
@@ -11,7 +11,7 @@
     'name_es_ES': 'Calendario de tareas',
     'name_fr_FR': 'Tâche 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/todo.py b/todo.py
index 86250b6..a581127 100644
--- a/todo.py
+++ b/todo.py
@@ -417,6 +417,25 @@ class Todo(ModelSQL, ModelView):
         collection_obj.todo.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 todo_id in ids:
+            current_default = default.copy()
+            current_default['uuid'] = self.default_uuid()
+            new_id = super(Todo, self).copy(todo_id, default=current_default)
+            new_ids.append(new_id)
+
+        if int_id:
+            return new_ids[0]
+        return new_ids
+
     def ical2values(self, todo_id, ical, calendar_id, vtodo=None):
         '''
         Convert iCalendar to values for create or write
@@ -695,7 +714,7 @@ class Todo(ModelSQL, ModelView):
         ical = vobject.iCalendar()
         vtodo = ical.add('vtodo')
         if todo.vtodo:
-            ical.vtodo = vobject.readOne(todo.vtodo)
+            ical.vtodo = vobject.readOne(str(todo.vtodo))
             vtodo = ical.vtodo
             ical.vtodo.transformToNative()
         if todo.summary:
diff --git a/trytond_calendar_todo.egg-info/PKG-INFO b/trytond_calendar_todo.egg-info/PKG-INFO
index c4d44b0..7546ef5 100644
--- a/trytond_calendar_todo.egg-info/PKG-INFO
+++ b/trytond_calendar_todo.egg-info/PKG-INFO
@@ -1,6 +1,6 @@
 Metadata-Version: 1.0
 Name: trytond-calendar-todo
-Version: 2.4.1
+Version: 2.4.2
 Summary: Add Todo support on CalDAV
 Home-page: http://www.tryton.org/
 Author: B2CK
commit f8da269033dd1b20eb9ddf9b25105fd6bb7011eb
Author: Mathias Behrle <mathiasb at m9s.biz>
Date:   Sat Apr 28 12:43:16 2012 +0200

    Releasing debian version 2.4.1-1.

diff --git a/debian/changelog b/debian/changelog
index 818d944..cb475dd 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,13 @@
+tryton-modules-calendar-todo (2.4.1-1) experimental; urgency=low
+
+  * Merging upstream version 2.4.0.
+  * Merging upstream version 2.4.1.
+  * Updating Copyright.
+  * Removing patch 01-support-pywebdav-0.9.8, went upstream.
+  * Bumping versioned tryton depends to 2.4.
+
+ -- Mathias Behrle <mathiasb at m9s.biz>  Thu, 26 Apr 2012 19:36:44 +0200
+
 tryton-modules-calendar-todo (2.2.0-2) unstable; urgency=low
 
   * Updating to Standards-Version: 3.9.3, no changes needed.
commit 13c36b82e958c8296fda906d5f653b7da03f8ced
Author: Mathias Behrle <mathiasb at m9s.biz>
Date:   Thu Apr 26 19:10:56 2012 +0200

    Bumping versioned tryton depends to 2.4.

diff --git a/debian/control b/debian/control
index 3a81163..106f8f7 100644
--- a/debian/control
+++ b/debian/control
@@ -14,8 +14,8 @@ X-Python-Version: >= 2.6
 Package: tryton-modules-calendar-todo
 Architecture: all
 Depends:
- ${misc:Depends}, ${python:Depends}, tryton-server (>= 2.2),
- tryton-modules-calendar (>= 2.2), python-dateutil, python-tz, python-vobject,
+ ${misc:Depends}, ${python:Depends}, tryton-server (>= 2.4),
+ tryton-modules-calendar (>= 2.4), python-dateutil, python-tz, python-vobject,
  python-webdav, python-pkg-resources
 Description: Tryton Application Platform (Calendar Todo Module)
  Tryton is a high-level general purpose application platform written in Python
commit fbeafa4f140aa90973d5814a1a628e8030e18284
Author: Mathias Behrle <mathiasb at m9s.biz>
Date:   Thu Apr 26 00:47:24 2012 +0200

    Removing patch 01-support-pywebdav-0.9.8, went upstream.

diff --git a/debian/patches/01-support-pywebdav-0.9.8 b/debian/patches/01-support-pywebdav-0.9.8
deleted file mode 100644
index 24a9c76..0000000
--- a/debian/patches/01-support-pywebdav-0.9.8
+++ /dev/null
@@ -1,45 +0,0 @@
-Author: Mathias Behrle <mathiasb at m9s.biz>
-Description: Support new structure of pywebdav > 0.9.4.1.
---- tryton-modules-calendar-todo.orig/caldav.py	2012-01-02 12:49:21.541638844 +0100
-+++ tryton-modules-calendar-todo/caldav.py	2012-03-26 20:06:16.290050030 +0200
-@@ -2,8 +2,12 @@
- #this repository contains the full copyright notices and license terms.
- _TRYTON_RELOAD = False
- 
--from DAV import propfind
--from DAV.utils import get_uriparentpath
-+try:
-+    from DAV import propfind
-+    from DAV.utils import get_uriparentpath
-+except ImportError:
-+    from pywebdav.lib import propfind
-+    from pywebdav.lib.utils import get_uriparentpath
- from trytond.protocols.webdav import TrytonDAVInterface
- 
- _mk_prop_response = propfind.PROPFIND.mk_prop_response
---- tryton-modules-calendar-todo.orig/webdav.py	2012-01-02 12:49:21.613635117 +0100
-+++ tryton-modules-calendar-todo/webdav.py	2012-03-26 20:06:25.753733455 +0200
-@@ -2,7 +2,10 @@
- #this repository contains the full copyright notices and license terms.
- import vobject
- import urllib
--from DAV.errors import DAV_NotFound, DAV_Forbidden
-+try:
-+    from DAV.errors import DAV_NotFound, DAV_Forbidden
-+except ImportError:
-+    from pywebdav.lib.errors import DAV_NotFound, DAV_Forbidden
- from trytond.model import ModelView, ModelSQL
- from trytond.tools import reduce_ids
- from trytond.transaction import Transaction
-@@ -132,7 +135,10 @@
-         return res
- 
-     def get_resourcetype(self, uri, cache=None):
--        from DAV.constants import COLLECTION, OBJECT
-+        try:
-+            from DAV.constants import COLLECTION, OBJECT
-+        except ImportError:
-+            from pywebdav.lib.constants import COLLECTION, OBJECT
-         if uri in ('Calendars', 'Calendars/'):
-             return COLLECTION
-         calendar_id = self.calendar(uri)
diff --git a/debian/patches/series b/debian/patches/series
index 138cbbb..e69de29 100644
--- a/debian/patches/series
+++ b/debian/patches/series
@@ -1 +0,0 @@
-01-support-pywebdav-0.9.8
commit 9e683431d32db39aca88b9919c0e6b65544320c8
Author: Mathias Behrle <mathiasb at m9s.biz>
Date:   Wed Apr 25 20:08:32 2012 +0200

    Updating Copyright.

diff --git a/debian/copyright b/debian/copyright
index 31cd674..3ec403d 100644
--- a/debian/copyright
+++ b/debian/copyright
@@ -2,9 +2,9 @@ Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
 
 Files: *
 Copyright:
- (C) 2009-2011 Cedric Krier
- (C) 2009-2011 Bertrand Chenal
- (C) 2009-2011 B2CK SPRL
+ (C) 2009-2012 Cedric Krier
+ (C) 2009-2012 Bertrand Chenal
+ (C) 2009-2012 B2CK SPRL
 License: GPL-3+
 
 Files: debian/*
commit d2a2fa3990cdbef719840381c37807b4362d6aa3
Author: Mathias Behrle <mathiasb at m9s.biz>
Date:   Wed Apr 25 11:03:31 2012 +0200

    Merging upstream version 2.4.1.

diff --git a/CHANGELOG b/CHANGELOG
index b873356..629ed01 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 72e42bc..e706a1e 100644
--- a/PKG-INFO
+++ b/PKG-INFO
@@ -1,6 +1,6 @@
 Metadata-Version: 1.0
 Name: trytond_calendar_todo
-Version: 2.4.0
+Version: 2.4.1
 Summary: Add Todo support on CalDAV
 Home-page: http://www.tryton.org/
 Author: B2CK
diff --git a/__tryton__.py b/__tryton__.py
index 303f9da..1798545 100644
--- a/__tryton__.py
+++ b/__tryton__.py
@@ -11,7 +11,7 @@
     'name_es_ES': 'Calendario de tareas',
     'name_fr_FR': 'Tâche 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..adc2e33 100644
--- a/locale/es_AR.po
+++ b/locale/es_AR.po
@@ -1,3 +1,519 @@
 # 
 msgid ""
 msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "error:calendar.todo:"
+msgid "Recurrence can not be recurrent!"
+msgstr "¡Una recurrencia no puede ser recurrente!"
+
+msgctxt "error:calendar.todo:"
+msgid "UUID and recurrence must be unique in a calendar!"
+msgstr "¡UUID y recurrencia deben ser únicos en un calendario!"
+
+msgctxt "field:calendar.todo,alarms:"
+msgid "Alarms"
+msgstr "Alarmas"
+
+msgctxt "field:calendar.todo,attendees:"
+msgid "Attendees"
+msgstr "Asistentes"
+
+msgctxt "field:calendar.todo,calendar:"
+msgid "Calendar"
+msgstr "Calendario"
+
+msgctxt "field:calendar.todo,calendar_owner:"
+msgid "Owner"
+msgstr "Dueño"
+
+msgctxt "field:calendar.todo,calendar_read_users:"
+msgid "Read Users"
+msgstr "Usuarios con lectura"
+
+msgctxt "field:calendar.todo,calendar_write_users:"
+msgid "Write Users"
+msgstr "Usuarios con escritura"
+
+msgctxt "field:calendar.todo,categories:"
+msgid "Categories"
+msgstr "Categorías"
+
+msgctxt "field:calendar.todo,classification:"
+msgid "Classification"
+msgstr "Clasificación"
+
+msgctxt "field:calendar.todo,completed:"
+msgid "Completed"
+msgstr "Completada"
+
+msgctxt "field:calendar.todo,create_date:"
+msgid "Create Date"
+msgstr "Fecha creación"
+
+msgctxt "field:calendar.todo,create_uid:"
+msgid "Create User"
+msgstr "Usuario creación"
+
+msgctxt "field:calendar.todo,description:"
+msgid "Description"
+msgstr "Descripción"
+
+msgctxt "field:calendar.todo,dtstart:"
+msgid "Start Date"
+msgstr "Fecha inicio"
+
+msgctxt "field:calendar.todo,due:"
+msgid "Due Date"
+msgstr "Fecha de vencimiento"
+
+msgctxt "field:calendar.todo,exdates:"
+msgid "Exception Dates"
+msgstr "Fechas excluidas"
+
+msgctxt "field:calendar.todo,exrules:"
+msgid "Exception Rules"
+msgstr "Reglas de excepciones"
+
+msgctxt "field:calendar.todo,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.todo,location:"
+msgid "Location"
+msgstr "Ubicación"
+
+msgctxt "field:calendar.todo,occurences:"
+msgid "Occurences"
+msgstr "Ocurrencias"
+
+msgctxt "field:calendar.todo,organizer:"
+msgid "Organizer"
+msgstr "Organizador"
+
+msgctxt "field:calendar.todo,parent:"
+msgid "Parent"
+msgstr "Padre"
+
+msgctxt "field:calendar.todo,percent_complete:"
+msgid "Percent complete"
+msgstr "Porcentaje total"
+
+msgctxt "field:calendar.todo,rdates:"
+msgid "Recurrence Dates"
+msgstr "Fechas de recurrencia"
+
+msgctxt "field:calendar.todo,rec_name:"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:calendar.todo,recurrence:"
+msgid "Recurrence"
+msgstr "Recurrencia"
+
+msgctxt "field:calendar.todo,rrules:"
+msgid "Recurrence Rules"
+msgstr "Reglas de recurrencia"
+
+msgctxt "field:calendar.todo,sequence:"
+msgid "Sequence"
+msgstr "Secuencia"
+
+msgctxt "field:calendar.todo,status:"
+msgid "Status"
+msgstr "Estado"
+
+msgctxt "field:calendar.todo,summary:"
+msgid "Summary"
+msgstr "Resumen"
+
+msgctxt "field:calendar.todo,timezone:"
+msgid "Timezone"
+msgstr "Zona horaria"
+
+msgctxt "field:calendar.todo,uuid:"
+msgid "UUID"
+msgstr "UUID"
+
+msgctxt "field:calendar.todo,vtodo:"
+msgid "vtodo"
+msgstr "vtodo"
+
+msgctxt "field:calendar.todo,write_date:"
+msgid "Write Date"
+msgstr "Fecha modificación"
+
+msgctxt "field:calendar.todo,write_uid:"
+msgid "Write User"
+msgstr "Usuario modificación"
+
+msgctxt "field:calendar.todo-calendar.category,category:"
+msgid "Category"
+msgstr "Categoría"
+
+msgctxt "field:calendar.todo-calendar.category,create_date:"
+msgid "Create Date"
+msgstr "Fecha creación"
+
+msgctxt "field:calendar.todo-calendar.category,create_uid:"
+msgid "Create User"
+msgstr "Usuario creación"
+
+msgctxt "field:calendar.todo-calendar.category,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.todo-calendar.category,rec_name:"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:calendar.todo-calendar.category,todo:"
+msgid "To-Do"
+msgstr "Por hacer"
+
+msgctxt "field:calendar.todo-calendar.category,write_date:"
+msgid "Write Date"
+msgstr "Fecha modificación"
+
+msgctxt "field:calendar.todo-calendar.category,write_uid:"
+msgid "Write User"
+msgstr "Usuario modificación"
+
+msgctxt "field:calendar.todo.alarm,calendar_alarm:"
+msgid "Calendar Alarm"
+msgstr "Alarma del calendario"
+
+msgctxt "field:calendar.todo.alarm,create_date:"
+msgid "Create Date"
+msgstr "Fecha creación"
+
+msgctxt "field:calendar.todo.alarm,create_uid:"
+msgid "Create User"
+msgstr "Usuario creación"
+
+msgctxt "field:calendar.todo.alarm,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.todo.alarm,rec_name:"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:calendar.todo.alarm,todo:"
+msgid "Todo"
+msgstr "Tarea"
+
+msgctxt "field:calendar.todo.alarm,write_date:"
+msgid "Write Date"
+msgstr "Fecha modificación"
+
+msgctxt "field:calendar.todo.alarm,write_uid:"
+msgid "Write User"
+msgstr "Usuario modificación"
+
+msgctxt "field:calendar.todo.attendee,calendar_attendee:"
+msgid "Calendar Attendee"
+msgstr "Calendario de asistentes"
+
+msgctxt "field:calendar.todo.attendee,create_date:"
+msgid "Create Date"
+msgstr "Fecha creación"
+
+msgctxt "field:calendar.todo.attendee,create_uid:"
+msgid "Create User"
+msgstr "Usuario creación"
+
+msgctxt "field:calendar.todo.attendee,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.todo.attendee,rec_name:"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:calendar.todo.attendee,todo:"
+msgid "Todo"
+msgstr "Tarea"
+
+msgctxt "field:calendar.todo.attendee,write_date:"
+msgid "Write Date"
+msgstr "Fecha modificación"
+
+msgctxt "field:calendar.todo.attendee,write_uid:"
+msgid "Write User"
+msgstr "Usuario modificación"
+
+msgctxt "field:calendar.todo.exdate,calendar_date:"
+msgid "Calendar Date"
+msgstr "Fecha Calendario"
+
+msgctxt "field:calendar.todo.exdate,create_date:"
+msgid "Create Date"
+msgstr "Fecha creación"
+
+msgctxt "field:calendar.todo.exdate,create_uid:"
+msgid "Create User"
+msgstr "Usuario creación"
+
+msgctxt "field:calendar.todo.exdate,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.todo.exdate,rec_name:"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:calendar.todo.exdate,todo:"
+msgid "Todo"
+msgstr "Tarea"
+
+msgctxt "field:calendar.todo.exdate,write_date:"
+msgid "Write Date"
+msgstr "Fecha modificación"
+
+msgctxt "field:calendar.todo.exdate,write_uid:"
+msgid "Write User"
+msgstr "Usuario modificación"
+
+msgctxt "field:calendar.todo.exrule,calendar_rrule:"
+msgid "Calendar RRule"
+msgstr "Regla de recurrencia"
+
+msgctxt "field:calendar.todo.exrule,create_date:"
+msgid "Create Date"
+msgstr "Fecha creación"
+
+msgctxt "field:calendar.todo.exrule,create_uid:"
+msgid "Create User"
+msgstr "Usuario creación"
+
+msgctxt "field:calendar.todo.exrule,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.todo.exrule,rec_name:"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:calendar.todo.exrule,todo:"
+msgid "Todo"
+msgstr "Tarea"
+
+msgctxt "field:calendar.todo.exrule,write_date:"
+msgid "Write Date"
+msgstr "Fecha modificación"
+
+msgctxt "field:calendar.todo.exrule,write_uid:"
+msgid "Write User"
+msgstr "Usuario modificación"
+
+msgctxt "field:calendar.todo.rdate,calendar_date:"
+msgid "Calendar Date"
+msgstr "Fecha Calendario"
+
+msgctxt "field:calendar.todo.rdate,create_date:"
+msgid "Create Date"
+msgstr "Fecha creación"
+
+msgctxt "field:calendar.todo.rdate,create_uid:"
+msgid "Create User"
+msgstr "Usuario creación"
+
+msgctxt "field:calendar.todo.rdate,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.todo.rdate,rec_name:"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:calendar.todo.rdate,todo:"
+msgid "Todo"
+msgstr "Tarea"
+
+msgctxt "field:calendar.todo.rdate,write_date:"
+msgid "Write Date"
+msgstr "Fecha modificación"
+
+msgctxt "field:calendar.todo.rdate,write_uid:"
+msgid "Write User"
+msgstr "Usuario modificación"
+
+msgctxt "field:calendar.todo.rrule,calendar_rrule:"
+msgid "Calendar RRule"
+msgstr "Regla de recurrencia"
+
+msgctxt "field:calendar.todo.rrule,create_date:"
+msgid "Create Date"
+msgstr "Fecha creación"
+
+msgctxt "field:calendar.todo.rrule,create_uid:"
+msgid "Create User"
+msgstr "Usuario creación"
+
+msgctxt "field:calendar.todo.rrule,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.todo.rrule,rec_name:"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:calendar.todo.rrule,todo:"
+msgid "Todo"
+msgstr "Tarea"
+
+msgctxt "field:calendar.todo.rrule,write_date:"
+msgid "Write Date"
+msgstr "Fecha modificación"
+
+msgctxt "field:calendar.todo.rrule,write_uid:"
+msgid "Write User"
+msgstr "Usuario modificación"
+
+msgctxt "help:calendar.todo,uuid:"
+msgid "Universally Unique Identifier"
+msgstr "Identificador universal único"
+
+msgctxt "model:calendar.todo,name:"
+msgid "Todo"
+msgstr "Tarea"
+
+msgctxt "model:calendar.todo-calendar.category,name:"
+msgid "Todo - Category"
+msgstr "Tarea - Categoría"
+
+msgctxt "model:calendar.todo.alarm,name:"
+msgid "Alarm"
+msgstr "Alarma"
+
+msgctxt "model:calendar.todo.attendee,name:"
+msgid "Attendee"
+msgstr "Asistentes"
+
+msgctxt "model:calendar.todo.exdate,name:"
+msgid "Exception Date"
+msgstr "Fecha excluida"
+
+msgctxt "model:calendar.todo.exrule,name:"
+msgid "Exception Rule"
+msgstr "Regla de excepción"
+
+msgctxt "model:calendar.todo.rdate,name:"
+msgid "Todo Recurrence Date"
+msgstr "Fecha de recurrencia"
+
+msgctxt "model:calendar.todo.rrule,name:"
+msgid "Recurrence Rule"
+msgstr "Regla de recurrencia"
+
+msgctxt "model:ir.action,name:act_todo_form"
+msgid "Todos"
+msgstr "Tareas"
+
+msgctxt "model:ir.action,name:act_todo_form3"
+msgid "Todos"
+msgstr "Tareas"
+
+msgctxt "model:ir.ui.menu,name:menu_todo_form"
+msgid "Todos"
+msgstr "Tareas"
+
+msgctxt "selection:calendar.todo,classification:"
+msgid "Confidential"
+msgstr "Confidencial"
+
+msgctxt "selection:calendar.todo,classification:"
+msgid "Private"
+msgstr "Privado"
+
+msgctxt "selection:calendar.todo,classification:"
+msgid "Public"
+msgstr "Público"
+
+msgctxt "selection:calendar.todo,status:"
+msgid ""
+msgstr ""
+
+msgctxt "selection:calendar.todo,status:"
+msgid "Cancelled"
+msgstr "Cancelada"
+
+msgctxt "selection:calendar.todo,status:"
+msgid "Completed"
+msgstr "Completado"
+
+msgctxt "selection:calendar.todo,status:"
+msgid "In-Process"
+msgstr "En proceso"
+
+msgctxt "selection:calendar.todo,status:"
+msgid "Needs-Action"
+msgstr "Necesita una acción"
+
+msgctxt "view:calendar.todo.attendee:"
+msgid "Attendee"
+msgstr "Asistentes"
+
+msgctxt "view:calendar.todo.attendee:"
+msgid "Attendees"
+msgstr "Asistentes"
+
+msgctxt "view:calendar.todo.exdate:"
+msgid "Exception Date"
+msgstr "Fecha excluida"
+
+msgctxt "view:calendar.todo.exdate:"
+msgid "Exception Dates"
+msgstr "Fechas excluidas"
+
+msgctxt "view:calendar.todo.exrule:"
+msgid "Exception Rule"
+msgstr "Regla de excepción"
+
+msgctxt "view:calendar.todo.exrule:"
+msgid "Exception Rules"
+msgstr "Reglas de excepciones"
+
+msgctxt "view:calendar.todo.rdate:"
+msgid "Recurrence Date"
+msgstr "Fecha de recurrencia"
+
+msgctxt "view:calendar.todo.rdate:"
+msgid "Recurrence Dates"
+msgstr "Fechas de recurrencia"
+
+msgctxt "view:calendar.todo.rrule:"
+msgid "Recurrence Rule"
+msgstr "Regla de recurrencia"
+
+msgctxt "view:calendar.todo.rrule:"
+msgid "Recurrence Rules"
+msgstr "Reglas de recurrencia"
+
+msgctxt "view:calendar.todo:"
+msgid "Attendees"
+msgstr "Asistentes"
+
+msgctxt "view:calendar.todo:"
+msgid "Categories"
+msgstr "Categorías"
+
+msgctxt "view:calendar.todo:"
+msgid "General"
+msgstr "General"
+
+msgctxt "view:calendar.todo:"
+msgid "Occurences"
+msgstr "Ocurrencias"
+
+msgctxt "view:calendar.todo:"
+msgid "Recurrences"
+msgstr "Recurrencias"
+
+msgctxt "view:calendar.todo:"
+msgid "Todo"
+msgstr "Tarea"
+
+msgctxt "view:calendar.todo:"
+msgid "Todos"
+msgstr "Tareas"
diff --git a/trytond_calendar_todo.egg-info/PKG-INFO b/trytond_calendar_todo.egg-info/PKG-INFO
index 306c9f4..c4d44b0 100644
--- a/trytond_calendar_todo.egg-info/PKG-INFO
+++ b/trytond_calendar_todo.egg-info/PKG-INFO
@@ -1,6 +1,6 @@
 Metadata-Version: 1.0
 Name: trytond-calendar-todo
-Version: 2.4.0
+Version: 2.4.1
 Summary: Add Todo support on CalDAV
 Home-page: http://www.tryton.org/
 Author: B2CK
commit 8a7ea46ff4005186977d9a516263c5ef043215cf
Author: Mathias Behrle <mathiasb at m9s.biz>
Date:   Tue Apr 24 19:30:40 2012 +0200

    Merging upstream version 2.4.0.

diff --git a/CHANGELOG b/CHANGELOG
index 72099a7..b873356 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)
 
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 6577bda..bbf874a 100644
--- a/INSTALL
+++ b/INSTALL
@@ -4,10 +4,10 @@ Installing trytond_calendar_todo
 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 or later (http://vobject.skyhouseconsulting.com/)
- * pywebdav 0.9.3 or later (http://sourceforge.net/projects/pywebdav/)
+ * pywebdav 0.9.8 or later (http://sourceforge.net/projects/pywebdav/)
  * python-dateutil (http://labix.org/python-dateutil)
  * pytz (http://pytz.sourceforge.net/)
  * trytond_calendar (http://www.tryton.org/)
diff --git a/PKG-INFO b/PKG-INFO
index 782fc36..72e42bc 100644
--- a/PKG-INFO
+++ b/PKG-INFO
@@ -1,12 +1,12 @@
 Metadata-Version: 1.0
 Name: trytond_calendar_todo
-Version: 2.2.0
+Version: 2.4.0
 Summary: Add Todo support on CalDAV
 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 d62d024..ac725d6 100644
--- a/__init__.py
+++ b/__init__.py
@@ -1,6 +1,6 @@
 #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 todo import *
-from webdav import *
+from . import caldav
+from .todo import *
+from .webdav import *
diff --git a/__tryton__.py b/__tryton__.py
index 244dd66..303f9da 100644
--- a/__tryton__.py
+++ b/__tryton__.py
@@ -2,37 +2,43 @@
 #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 Todo',
-    'name_bg_BG' : 'Задачи за календар',
-    'name_de_DE' : 'Kalender Aufgaben',
+    'name': 'Calendar Todo',
+    'name_bg_BG': 'Задачи за календар',
+    'name_ca_ES': 'Calendari de tasques pendents',
+    'name_de_DE': 'Kalender Aufgaben',
+    'name_es_AR': 'Calendario de tareas',
     'name_es_CO': 'Calendario de tareas',
     'name_es_ES': 'Calendario de tareas',
-    'name_fr_FR' : 'Tâche Calendrier',
-    'name_ru_RU' : 'Задачи для календаря',
-    'version' : '2.2.0',
-    'author' : 'B2CK',
+    'name_fr_FR': 'Tâche Calendrier',
+    'name_ru_RU': 'Задачи для календаря',
+    'version': '2.4.0',
+    'author': 'B2CK',
     'email': 'info at b2ck.com',
     'website': 'http://www.tryton.org/',
     'description': 'Add Todo support on CalDAV',
-    'description_bg_BG' : 'Добавя поддръжка на задачи в CalDAV',
-    'description_de_DE' : 'Fügt Unterstützung für Aufgaben in CalDAV hinzu',
+    'description_bg_BG': 'Добавя поддръжка на задачи в CalDAV',
+    'description_ca_ES': 'Afegeix suport per tasques pendents al CalDAV.',
+    'description_de_DE': 'Fügt Unterstützung für Aufgaben in CalDAV hinzu',
+    'description_es_AR': 'Añade soporte de tareas sobre CalDAV',
     'description_es_CO': 'Añade soporte de tareas sobre CalDAV',
     'description_es_ES': 'Añade soporte de tareas sobre CalDAV',
     'description_fr_FR': 'Ajoute la gestion des tâches au CalDAV',
-    'description_ru_RU' : 'Добавление поддержки задач для CalDAV',
-    'depends' : [
+    'description_ru_RU': 'Добавление поддержки задач для CalDAV',
+    'depends': [
         'ir',
         'res',
         'webdav',
         'calendar',
     ],
-    'xml' : [
+    'xml': [
         'todo.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 2d2fe00..b5f32b3 100644
--- a/caldav.py
+++ b/caldav.py
@@ -1,13 +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.
-_TRYTON_RELOAD = False
-
-from DAV import propfind
-from DAV.utils import get_uriparentpath
+from pywebdav.lib import propfind
+from pywebdav.lib.utils import get_uriparentpath
 from trytond.protocols.webdav import TrytonDAVInterface
 
 _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 '')
diff --git a/locale/bg_BG.po b/locale/bg_BG.po
index ca18ebd..e234518 100644
--- a/locale/bg_BG.po
+++ b/locale/bg_BG.po
@@ -2,247 +2,407 @@
 msgid ""
 msgstr "Content-Type: text/plain; charset=utf-8\n"
 
-msgctxt "error:calendar.todo:0"
+msgctxt "error:calendar.todo:"
 msgid "Recurrence can not be recurrent!"
 msgstr "Повторението не може да е периодично!"
 
-msgctxt "error:calendar.todo:0"
+msgctxt "error:calendar.todo:"
 msgid "UUID and recurrence must be unique in a calendar!"
 msgstr "UUID и взаимна вложеност трябва да са уникални в календар!"
 
-msgctxt "field:calendar.todo,alarms:0"
+msgctxt "field:calendar.todo,alarms:"
 msgid "Alarms"
 msgstr "Аларми"
 
-msgctxt "field:calendar.todo,attendees:0"
+msgctxt "field:calendar.todo,attendees:"
 msgid "Attendees"
 msgstr "Присъстващи"
 
-msgctxt "field:calendar.todo,calendar:0"
+msgctxt "field:calendar.todo,calendar:"
 msgid "Calendar"
 msgstr "Календар"
 
-msgctxt "field:calendar.todo,calendar_owner:0"
+msgctxt "field:calendar.todo,calendar_owner:"
 msgid "Owner"
 msgstr "Собственик"
 
-msgctxt "field:calendar.todo,calendar_read_users:0"
+msgctxt "field:calendar.todo,calendar_read_users:"
 msgid "Read Users"
 msgstr "Потребители с права за четене"
 
-msgctxt "field:calendar.todo,calendar_write_users:0"
+msgctxt "field:calendar.todo,calendar_write_users:"
 msgid "Write Users"
 msgstr "Записване на потребители"
 
-msgctxt "field:calendar.todo,categories:0"
+msgctxt "field:calendar.todo,categories:"
 msgid "Categories"
 msgstr "Категории"
 
-msgctxt "field:calendar.todo,classification:0"
+msgctxt "field:calendar.todo,classification:"
 msgid "Classification"
 msgstr "Класификация"
 
-msgctxt "field:calendar.todo,completed:0"
+msgctxt "field:calendar.todo,completed:"
 msgid "Completed"
 msgstr "Изпълнен"
 
-msgctxt "field:calendar.todo,description:0"
+msgctxt "field:calendar.todo,create_date:"
+msgid "Create Date"
+msgstr "Създадено на"
+
+msgctxt "field:calendar.todo,create_uid:"
+msgid "Create User"
+msgstr "Създадено от"
+
+msgctxt "field:calendar.todo,description:"
 msgid "Description"
 msgstr "Описание"
 
-msgctxt "field:calendar.todo,dtstart:0"
+msgctxt "field:calendar.todo,dtstart:"
 msgid "Start Date"
 msgstr "Начална дата"
 
-msgctxt "field:calendar.todo,due:0"
+msgctxt "field:calendar.todo,due:"
 msgid "Due Date"
 msgstr "Дата на изпълнение"
 
-msgctxt "field:calendar.todo,exdates:0"
+msgctxt "field:calendar.todo,exdates:"
 msgid "Exception Dates"
 msgstr "Дати на грешките"
 
-msgctxt "field:calendar.todo,exrules:0"
+msgctxt "field:calendar.todo,exrules:"
 msgid "Exception Rules"
 msgstr "Правила при грешка"
 
-msgctxt "field:calendar.todo,location:0"
+msgctxt "field:calendar.todo,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.todo,location:"
 msgid "Location"
 msgstr "Местоположение"
 
-msgctxt "field:calendar.todo,occurences:0"
+msgctxt "field:calendar.todo,occurences:"
 msgid "Occurences"
 msgstr "Събития"
 
-msgctxt "field:calendar.todo,organizer:0"
+msgctxt "field:calendar.todo,organizer:"
 msgid "Organizer"
 msgstr "Организатор"
 
-msgctxt "field:calendar.todo,parent:0"
+msgctxt "field:calendar.todo,parent:"
 msgid "Parent"
 msgstr "Родител"
 
-msgctxt "field:calendar.todo,percent_complete:0"
+msgctxt "field:calendar.todo,percent_complete:"
 msgid "Percent complete"
 msgstr "Процент изпълнено"
 
-msgctxt "field:calendar.todo,rdates:0"
+msgctxt "field:calendar.todo,rdates:"
 msgid "Recurrence Dates"
 msgstr "Дати на повторяемост"
 
-msgctxt "field:calendar.todo,rec_name:0"
+msgctxt "field:calendar.todo,rec_name:"
 msgid "Name"
 msgstr "Име"
 
-msgctxt "field:calendar.todo,recurrence:0"
+msgctxt "field:calendar.todo,recurrence:"
 msgid "Recurrence"
 msgstr "Повторение"
 
-msgctxt "field:calendar.todo,rrules:0"
+msgctxt "field:calendar.todo,rrules:"
 msgid "Recurrence Rules"
 msgstr "Правила за повторяемост"
 
-msgctxt "field:calendar.todo,sequence:0"
+msgctxt "field:calendar.todo,sequence:"
 msgid "Sequence"
 msgstr "Последователност"
 
-msgctxt "field:calendar.todo,status:0"
+msgctxt "field:calendar.todo,status:"
 msgid "Status"
 msgstr "Състояние"
 
-msgctxt "field:calendar.todo,summary:0"
+msgctxt "field:calendar.todo,summary:"
 msgid "Summary"
 msgstr "Обобщено"
 
-msgctxt "field:calendar.todo,timezone:0"
+msgctxt "field:calendar.todo,timezone:"
 msgid "Timezone"
 msgstr "Времева зона"
 
-msgctxt "field:calendar.todo,uuid:0"
+msgctxt "field:calendar.todo,uuid:"
 msgid "UUID"
 msgstr "UUID"
 
-msgctxt "field:calendar.todo,vtodo:0"
+msgctxt "field:calendar.todo,vtodo:"
 msgid "vtodo"
 msgstr ""
 
-msgctxt "field:calendar.todo-calendar.category,category:0"
+msgctxt "field:calendar.todo,write_date:"
+msgid "Write Date"
+msgstr "Променено на"
+
+msgctxt "field:calendar.todo,write_uid:"
+msgid "Write User"
+msgstr "Променено от"
+
+msgctxt "field:calendar.todo-calendar.category,category:"
 msgid "Category"
 msgstr "Категория"
 
-msgctxt "field:calendar.todo-calendar.category,rec_name:0"
+msgctxt "field:calendar.todo-calendar.category,create_date:"
+msgid "Create Date"
+msgstr "Създадено на"
+
+msgctxt "field:calendar.todo-calendar.category,create_uid:"
+msgid "Create User"
+msgstr "Създадено от"
+
+msgctxt "field:calendar.todo-calendar.category,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.todo-calendar.category,rec_name:"
 msgid "Name"
 msgstr "Име"
 
-msgctxt "field:calendar.todo-calendar.category,todo:0"
+msgctxt "field:calendar.todo-calendar.category,todo:"
 msgid "To-Do"
 msgstr "Задача"
 
-msgctxt "field:calendar.todo.alarm,calendar_alarm:0"
+msgctxt "field:calendar.todo-calendar.category,write_date:"
+msgid "Write Date"
+msgstr "Променено на"
+
+msgctxt "field:calendar.todo-calendar.category,write_uid:"
+msgid "Write User"
+msgstr "Променено от"
+
+msgctxt "field:calendar.todo.alarm,calendar_alarm:"
 msgid "Calendar Alarm"
 msgstr "Аларма на календар"
 
-msgctxt "field:calendar.todo.alarm,rec_name:0"
+msgctxt "field:calendar.todo.alarm,create_date:"
+msgid "Create Date"
+msgstr "Създадено на"
+
+msgctxt "field:calendar.todo.alarm,create_uid:"
+msgid "Create User"
+msgstr "Създадено от"
+
+msgctxt "field:calendar.todo.alarm,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.todo.alarm,rec_name:"
 msgid "Name"
 msgstr "Име"
 
-msgctxt "field:calendar.todo.alarm,todo:0"
+msgctxt "field:calendar.todo.alarm,todo:"
 msgid "Todo"
 msgstr "Задача"
 
-msgctxt "field:calendar.todo.attendee,calendar_attendee:0"
+msgctxt "field:calendar.todo.alarm,write_date:"
+msgid "Write Date"
+msgstr "Променено на"
+
+msgctxt "field:calendar.todo.alarm,write_uid:"
+msgid "Write User"
+msgstr "Променено от"
+
+msgctxt "field:calendar.todo.attendee,calendar_attendee:"
 msgid "Calendar Attendee"
 msgstr "Присъстващ на календар"
 
-msgctxt "field:calendar.todo.attendee,rec_name:0"
+msgctxt "field:calendar.todo.attendee,create_date:"
+msgid "Create Date"
+msgstr "Създадено на"
+
+msgctxt "field:calendar.todo.attendee,create_uid:"
+msgid "Create User"
+msgstr "Създадено от"
+
+msgctxt "field:calendar.todo.attendee,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.todo.attendee,rec_name:"
 msgid "Name"
 msgstr "Име"
 
-msgctxt "field:calendar.todo.attendee,todo:0"
+msgctxt "field:calendar.todo.attendee,todo:"
 msgid "Todo"
 msgstr "Задача"
 
-msgctxt "field:calendar.todo.exdate,calendar_date:0"
+msgctxt "field:calendar.todo.attendee,write_date:"
+msgid "Write Date"
+msgstr "Променено на"
+
+msgctxt "field:calendar.todo.attendee,write_uid:"
+msgid "Write User"
+msgstr "Променено от"
+
+msgctxt "field:calendar.todo.exdate,calendar_date:"
 msgid "Calendar Date"
 msgstr "Дата от календар"
 
-msgctxt "field:calendar.todo.exdate,rec_name:0"
+msgctxt "field:calendar.todo.exdate,create_date:"
+msgid "Create Date"
+msgstr "Създадено на"
+
+msgctxt "field:calendar.todo.exdate,create_uid:"
+msgid "Create User"
+msgstr "Създадено от"
+
+msgctxt "field:calendar.todo.exdate,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.todo.exdate,rec_name:"
 msgid "Name"
 msgstr "Име"
 
-msgctxt "field:calendar.todo.exdate,todo:0"
+msgctxt "field:calendar.todo.exdate,todo:"
 msgid "Todo"
 msgstr "Задача"
 
-msgctxt "field:calendar.todo.exrule,calendar_rrule:0"
+msgctxt "field:calendar.todo.exdate,write_date:"
+msgid "Write Date"
+msgstr "Променено на"
+
+msgctxt "field:calendar.todo.exdate,write_uid:"
+msgid "Write User"
+msgstr "Променено от"
+
+msgctxt "field:calendar.todo.exrule,calendar_rrule:"
 msgid "Calendar RRule"
 msgstr ""
 
-msgctxt "field:calendar.todo.exrule,rec_name:0"
+msgctxt "field:calendar.todo.exrule,create_date:"
+msgid "Create Date"
+msgstr "Създадено на"
+
+msgctxt "field:calendar.todo.exrule,create_uid:"
+msgid "Create User"
+msgstr "Създадено от"
+
+msgctxt "field:calendar.todo.exrule,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.todo.exrule,rec_name:"
 msgid "Name"
 msgstr "Име"
 
-msgctxt "field:calendar.todo.exrule,todo:0"
+msgctxt "field:calendar.todo.exrule,todo:"
 msgid "Todo"
 msgstr "Задача"
 
-msgctxt "field:calendar.todo.rdate,calendar_date:0"
+msgctxt "field:calendar.todo.exrule,write_date:"
+msgid "Write Date"
+msgstr "Променено на"
+
+msgctxt "field:calendar.todo.exrule,write_uid:"
+msgid "Write User"
+msgstr "Променено от"
+
+msgctxt "field:calendar.todo.rdate,calendar_date:"
 msgid "Calendar Date"
 msgstr "Дата от календар"
 
-msgctxt "field:calendar.todo.rdate,rec_name:0"
+msgctxt "field:calendar.todo.rdate,create_date:"
+msgid "Create Date"
+msgstr "Създадено на"
+
+msgctxt "field:calendar.todo.rdate,create_uid:"
+msgid "Create User"
+msgstr "Създадено от"
+
+msgctxt "field:calendar.todo.rdate,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.todo.rdate,rec_name:"
 msgid "Name"
 msgstr "Име"
 
-msgctxt "field:calendar.todo.rdate,todo:0"
+msgctxt "field:calendar.todo.rdate,todo:"
 msgid "Todo"
 msgstr "Задача"
 
-msgctxt "field:calendar.todo.rrule,calendar_rrule:0"
+msgctxt "field:calendar.todo.rdate,write_date:"
+msgid "Write Date"
+msgstr "Променено на"
+
+msgctxt "field:calendar.todo.rdate,write_uid:"
+msgid "Write User"
+msgstr "Променено от"
+
+msgctxt "field:calendar.todo.rrule,calendar_rrule:"
 msgid "Calendar RRule"
 msgstr ""
 
-msgctxt "field:calendar.todo.rrule,rec_name:0"
+msgctxt "field:calendar.todo.rrule,create_date:"
+msgid "Create Date"
+msgstr "Създадено на"
+
+msgctxt "field:calendar.todo.rrule,create_uid:"
+msgid "Create User"
+msgstr "Създадено от"
+
+msgctxt "field:calendar.todo.rrule,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.todo.rrule,rec_name:"
 msgid "Name"
 msgstr "Име"
 
-msgctxt "field:calendar.todo.rrule,todo:0"
+msgctxt "field:calendar.todo.rrule,todo:"
 msgid "Todo"
 msgstr "Задача"
 
-msgctxt "help:calendar.todo,uuid:0"
+msgctxt "field:calendar.todo.rrule,write_date:"
+msgid "Write Date"
+msgstr "Променено на"
+
+msgctxt "field:calendar.todo.rrule,write_uid:"
+msgid "Write User"
+msgstr "Променено от"
+
+msgctxt "help:calendar.todo,uuid:"
 msgid "Universally Unique Identifier"
 msgstr "Универсален иникален идентификатор"
 
-msgctxt "model:calendar.todo,name:0"
+msgctxt "model:calendar.todo,name:"
 msgid "Todo"
 msgstr "Задача"
 
-msgctxt "model:calendar.todo-calendar.category,name:0"
+msgctxt "model:calendar.todo-calendar.category,name:"
 msgid "Todo - Category"
 msgstr "Задача - Категория"
 
-msgctxt "model:calendar.todo.alarm,name:0"
+msgctxt "model:calendar.todo.alarm,name:"
 msgid "Alarm"
 msgstr "Аларма"
 
-msgctxt "model:calendar.todo.attendee,name:0"
+msgctxt "model:calendar.todo.attendee,name:"
 msgid "Attendee"
 msgstr "Присъстващ"
 
-msgctxt "model:calendar.todo.exdate,name:0"
+msgctxt "model:calendar.todo.exdate,name:"
 msgid "Exception Date"
 msgstr "Дата на грешка"
 
-msgctxt "model:calendar.todo.exrule,name:0"
+msgctxt "model:calendar.todo.exrule,name:"
 msgid "Exception Rule"
 msgstr "Правило при грешка"
 
-msgctxt "model:calendar.todo.rdate,name:0"
+msgctxt "model:calendar.todo.rdate,name:"
 msgid "Todo Recurrence Date"
 msgstr "Дата на повторение на задача"
 
-msgctxt "model:calendar.todo.rrule,name:0"
+msgctxt "model:calendar.todo.rrule,name:"
 msgid "Recurrence Rule"
 msgstr "Правило за повторение"
 
@@ -258,98 +418,98 @@ msgctxt "model:ir.ui.menu,name:menu_todo_form"
 msgid "Todos"
 msgstr "Задачи"
 
-msgctxt "selection:calendar.todo,classification:0"
+msgctxt "selection:calendar.todo,classification:"
 msgid "Confidential"
 msgstr "Поверителен"
 
-msgctxt "selection:calendar.todo,classification:0"
+msgctxt "selection:calendar.todo,classification:"
 msgid "Private"
 msgstr "Частен"
 
-msgctxt "selection:calendar.todo,classification:0"
+msgctxt "selection:calendar.todo,classification:"
 msgid "Public"
 msgstr "Публичен"
 
-msgctxt "selection:calendar.todo,status:0"
+msgctxt "selection:calendar.todo,status:"
 msgid ""
 msgstr ""
 
-msgctxt "selection:calendar.todo,status:0"
+msgctxt "selection:calendar.todo,status:"
 msgid "Cancelled"
 msgstr "Отказан"
 
-msgctxt "selection:calendar.todo,status:0"
+msgctxt "selection:calendar.todo,status:"
 msgid "Completed"
 msgstr "Изпълнен"
 
-msgctxt "selection:calendar.todo,status:0"
+msgctxt "selection:calendar.todo,status:"
 msgid "In-Process"
 msgstr "Обработва се"
 
-msgctxt "selection:calendar.todo,status:0"
+msgctxt "selection:calendar.todo,status:"
 msgid "Needs-Action"
 msgstr "Необходимо е действие"
 
-msgctxt "view:calendar.todo.attendee:0"
+msgctxt "view:calendar.todo.attendee:"
 msgid "Attendee"
 msgstr "Присъстващ"
 
-msgctxt "view:calendar.todo.attendee:0"
+msgctxt "view:calendar.todo.attendee:"
 msgid "Attendees"
 msgstr "Присъстващи"
 
-msgctxt "view:calendar.todo.exdate:0"
+msgctxt "view:calendar.todo.exdate:"
 msgid "Exception Date"
 msgstr "Дата на грешка"
 
-msgctxt "view:calendar.todo.exdate:0"
+msgctxt "view:calendar.todo.exdate:"
 msgid "Exception Dates"
 msgstr "Дати на грешките"
 
-msgctxt "view:calendar.todo.exrule:0"
+msgctxt "view:calendar.todo.exrule:"
 msgid "Exception Rule"
 msgstr "Правило при грешка"
 
-msgctxt "view:calendar.todo.exrule:0"
+msgctxt "view:calendar.todo.exrule:"
 msgid "Exception Rules"
 msgstr "Правила при грешка"
 
-msgctxt "view:calendar.todo.rdate:0"
+msgctxt "view:calendar.todo.rdate:"
 msgid "Recurrence Date"
 msgstr "Повтаряща се дата"
 
-msgctxt "view:calendar.todo.rdate:0"
+msgctxt "view:calendar.todo.rdate:"
 msgid "Recurrence Dates"
 msgstr "Дати на повторяемост"
 
-msgctxt "view:calendar.todo.rrule:0"
+msgctxt "view:calendar.todo.rrule:"
 msgid "Recurrence Rule"
 msgstr "Правило за повторение"
 
-msgctxt "view:calendar.todo.rrule:0"
+msgctxt "view:calendar.todo.rrule:"
 msgid "Recurrence Rules"
 msgstr "Правила за повторяемост"
 
-msgctxt "view:calendar.todo:0"
+msgctxt "view:calendar.todo:"
 msgid "Attendees"
 msgstr "Присъстващи"
 
-msgctxt "view:calendar.todo:0"
+msgctxt "view:calendar.todo:"
 msgid "Categories"
 msgstr "Категории"
 
-msgctxt "view:calendar.todo:0"
+msgctxt "view:calendar.todo:"
 msgid "General"
 msgstr "Основен"
 
-msgctxt "view:calendar.todo:0"
+msgctxt "view:calendar.todo:"
 msgid "Occurences"
 msgstr "Събития"
 
-msgctxt "view:calendar.todo:0"
+msgctxt "view:calendar.todo:"
 msgid "Todo"
 msgstr "Задача"
 
-msgctxt "view:calendar.todo:0"
+msgctxt "view:calendar.todo:"
 msgid "Todos"
 msgstr "Задачи"
diff --git a/locale/ca_ES.po b/locale/ca_ES.po
new file mode 100644
index 0000000..3f3d17e
--- /dev/null
+++ b/locale/ca_ES.po
@@ -0,0 +1,531 @@
+# 
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "error:calendar.todo:"
+msgid "Recurrence can not be recurrent!"
+msgstr "Una recurrencia no pot ser recurrent"
+
+msgctxt "error:calendar.todo:"
+msgid "UUID and recurrence must be unique in a calendar!"
+msgstr "UUID i recurrencia han de ser únics en un calendari"
+
+msgctxt "field:calendar.todo,alarms:"
+msgid "Alarms"
+msgstr "Alarmes"
+
+msgctxt "field:calendar.todo,attendees:"
+msgid "Attendees"
+msgstr "Assistents"
+
+msgctxt "field:calendar.todo,calendar:"
+msgid "Calendar"
+msgstr "Calendari"
+
+msgctxt "field:calendar.todo,calendar_owner:"
+msgid "Owner"
+msgstr "Amo"
+
+msgctxt "field:calendar.todo,calendar_read_users:"
+msgid "Read Users"
+msgstr "Usuaris amb lectura"
+
+msgctxt "field:calendar.todo,calendar_write_users:"
+msgid "Write Users"
+msgstr "Usuaris amb escriptura"
+
+msgctxt "field:calendar.todo,categories:"
+msgid "Categories"
+msgstr "Categories"
+
+msgctxt "field:calendar.todo,classification:"
+msgid "Classification"
+msgstr "Classificació"
+
+msgctxt "field:calendar.todo,completed:"
+msgid "Completed"
+msgstr "Completada"
+
+msgctxt "field:calendar.todo,create_date:"
+msgid "Create Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.todo,create_uid:"
+msgid "Create User"
+msgstr "Crear usuari"
+
+msgctxt "field:calendar.todo,description:"
+msgid "Description"
+msgstr "Descripció"
+
+msgctxt "field:calendar.todo,dtstart:"
+msgid "Start Date"
+msgstr "Data inici"
+
+msgctxt "field:calendar.todo,due:"
+msgid "Due Date"
+msgstr "Data de venciment"
+
+msgctxt "field:calendar.todo,exdates:"
+msgid "Exception Dates"
+msgstr "Dates excloses"
+
+msgctxt "field:calendar.todo,exrules:"
+msgid "Exception Rules"
+msgstr "Regles d'excepcions"
+
+msgctxt "field:calendar.todo,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.todo,location:"
+msgid "Location"
+msgstr "Ubicació"
+
+#, fuzzy
+msgctxt "field:calendar.todo,occurences:"
+msgid "Occurences"
+msgstr "Ocurrències"
+
+msgctxt "field:calendar.todo,organizer:"
+msgid "Organizer"
+msgstr "Organitzador"
+
+msgctxt "field:calendar.todo,parent:"
+msgid "Parent"
+msgstr "Pare"
+
+msgctxt "field:calendar.todo,percent_complete:"
+msgid "Percent complete"
+msgstr "Percentatge total"
+
+msgctxt "field:calendar.todo,rdates:"
+msgid "Recurrence Dates"
+msgstr "Dates de recurrencia"
+
+msgctxt "field:calendar.todo,rec_name:"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:calendar.todo,recurrence:"
+msgid "Recurrence"
+msgstr "Recurrencia"
+
+msgctxt "field:calendar.todo,rrules:"
+msgid "Recurrence Rules"
+msgstr "Regles de recurrencia"
+
+msgctxt "field:calendar.todo,sequence:"
+msgid "Sequence"
+msgstr "Seqüència"
+
+msgctxt "field:calendar.todo,status:"
+msgid "Status"
+msgstr "Estat"
+
+msgctxt "field:calendar.todo,summary:"
+msgid "Summary"
+msgstr "Resum"
+
+msgctxt "field:calendar.todo,timezone:"
+msgid "Timezone"
+msgstr "Zona horària"
+
+msgctxt "field:calendar.todo,uuid:"
+msgid "UUID"
+msgstr "UUID"
+
+msgctxt "field:calendar.todo,vtodo:"
+msgid "vtodo"
+msgstr "vtodo"
+
+msgctxt "field:calendar.todo,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.todo,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.todo-calendar.category,category:"
+msgid "Category"
+msgstr "Categoria"
+
+msgctxt "field:calendar.todo-calendar.category,create_date:"
+msgid "Create Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.todo-calendar.category,create_uid:"
+msgid "Create User"
+msgstr "Crear usuari"
+
+msgctxt "field:calendar.todo-calendar.category,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.todo-calendar.category,rec_name:"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:calendar.todo-calendar.category,todo:"
+msgid "To-Do"
+msgstr "Per fer"
+
+msgctxt "field:calendar.todo-calendar.category,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.todo-calendar.category,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.todo.alarm,calendar_alarm:"
+msgid "Calendar Alarm"
+msgstr "Alarma del calendari"
+
+msgctxt "field:calendar.todo.alarm,create_date:"
+msgid "Create Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.todo.alarm,create_uid:"
+msgid "Create User"
+msgstr "Crear usuari"
+
+msgctxt "field:calendar.todo.alarm,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.todo.alarm,rec_name:"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:calendar.todo.alarm,todo:"
+msgid "Todo"
+msgstr "Tasca"
+
+msgctxt "field:calendar.todo.alarm,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.todo.alarm,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.todo.attendee,calendar_attendee:"
+msgid "Calendar Attendee"
+msgstr "Calendari d'assistents"
+
+msgctxt "field:calendar.todo.attendee,create_date:"
+msgid "Create Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.todo.attendee,create_uid:"
+msgid "Create User"
+msgstr "Crear usuari"
+
+msgctxt "field:calendar.todo.attendee,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.todo.attendee,rec_name:"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:calendar.todo.attendee,todo:"
+msgid "Todo"
+msgstr "Tasca"
+
+msgctxt "field:calendar.todo.attendee,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.todo.attendee,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.todo.exdate,calendar_date:"
+msgid "Calendar Date"
+msgstr ""
+
+msgctxt "field:calendar.todo.exdate,create_date:"
+msgid "Create Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.todo.exdate,create_uid:"
+msgid "Create User"
+msgstr "Crear usuari"
+
+msgctxt "field:calendar.todo.exdate,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.todo.exdate,rec_name:"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:calendar.todo.exdate,todo:"
+msgid "Todo"
+msgstr "Tasca"
+
+msgctxt "field:calendar.todo.exdate,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.todo.exdate,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.todo.exrule,calendar_rrule:"
+msgid "Calendar RRule"
+msgstr "Regla de recurrencia"
+
+msgctxt "field:calendar.todo.exrule,create_date:"
+msgid "Create Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.todo.exrule,create_uid:"
+msgid "Create User"
+msgstr "Crear usuari"
+
+msgctxt "field:calendar.todo.exrule,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.todo.exrule,rec_name:"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:calendar.todo.exrule,todo:"
+msgid "Todo"
+msgstr "Tasca"
+
+msgctxt "field:calendar.todo.exrule,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.todo.exrule,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.todo.rdate,calendar_date:"
+msgid "Calendar Date"
+msgstr ""
+
+msgctxt "field:calendar.todo.rdate,create_date:"
+msgid "Create Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.todo.rdate,create_uid:"
+msgid "Create User"
+msgstr "Crear usuari"
+
+msgctxt "field:calendar.todo.rdate,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.todo.rdate,rec_name:"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:calendar.todo.rdate,todo:"
+msgid "Todo"
+msgstr "Tasca"
+
+msgctxt "field:calendar.todo.rdate,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.todo.rdate,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.todo.rrule,calendar_rrule:"
+msgid "Calendar RRule"
+msgstr "Regla de recurrencia"
+
+msgctxt "field:calendar.todo.rrule,create_date:"
+msgid "Create Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.todo.rrule,create_uid:"
+msgid "Create User"
+msgstr "Crear usuari"
+
+msgctxt "field:calendar.todo.rrule,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.todo.rrule,rec_name:"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:calendar.todo.rrule,todo:"
+msgid "Todo"
+msgstr "Tasca"
+
+msgctxt "field:calendar.todo.rrule,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.todo.rrule,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "help:calendar.todo,uuid:"
+msgid "Universally Unique Identifier"
+msgstr "Identificador universal únic"
+
+msgctxt "model:calendar.todo,name:"
+msgid "Todo"
+msgstr "Tasca"
+
+msgctxt "model:calendar.todo-calendar.category,name:"
+msgid "Todo - Category"
+msgstr "Tasca - Categoria"
+
+msgctxt "model:calendar.todo.alarm,name:"
+msgid "Alarm"
+msgstr "Alarma"
+
+msgctxt "model:calendar.todo.attendee,name:"
+msgid "Attendee"
+msgstr "Assistents"
+
+msgctxt "model:calendar.todo.exdate,name:"
+msgid "Exception Date"
+msgstr "Data exclosa"
+
+msgctxt "model:calendar.todo.exrule,name:"
+msgid "Exception Rule"
+msgstr "Regla d'excepció"
+
+#, fuzzy
+msgctxt "model:calendar.todo.rdate,name:"
+msgid "Todo Recurrence Date"
+msgstr "Data de recurrencia"
+
+msgctxt "model:calendar.todo.rrule,name:"
+msgid "Recurrence Rule"
+msgstr "Regla de recurrencia"
+
+msgctxt "model:ir.action,name:act_todo_form"
+msgid "Todos"
+msgstr "Tasques"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_todo_form3"
+msgid "Todos"
+msgstr "Tasques"
+
+msgctxt "model:ir.ui.menu,name:menu_todo_form"
+msgid "Todos"
+msgstr "Tasques"
+
+msgctxt "selection:calendar.todo,classification:"
+msgid "Confidential"
+msgstr "Confidencial"
+
+msgctxt "selection:calendar.todo,classification:"
+msgid "Private"
+msgstr "Privat"
+
+msgctxt "selection:calendar.todo,classification:"
+msgid "Public"
+msgstr "Públic"
+
+msgctxt "selection:calendar.todo,status:"
+msgid ""
+msgstr ""
+
+msgctxt "selection:calendar.todo,status:"
+msgid "Cancelled"
+msgstr "Cancel·lada"
+
+msgctxt "selection:calendar.todo,status:"
+msgid "Completed"
+msgstr "Completat"
+
+msgctxt "selection:calendar.todo,status:"
+msgid "In-Process"
+msgstr "En procés"
+
+msgctxt "selection:calendar.todo,status:"
+msgid "Needs-Action"
+msgstr "Necessita una acció"
+
+msgctxt "view:calendar.todo.attendee:"
+msgid "Attendee"
+msgstr "Assistents"
+
+msgctxt "view:calendar.todo.attendee:"
+msgid "Attendees"
+msgstr "Assistents"
+
+msgctxt "view:calendar.todo.exdate:"
+msgid "Exception Date"
+msgstr "Data exclosa"
+
+msgctxt "view:calendar.todo.exdate:"
+msgid "Exception Dates"
+msgstr "Dates excloses"
+
+msgctxt "view:calendar.todo.exrule:"
+msgid "Exception Rule"
+msgstr "Regla d'excepció"
+
+msgctxt "view:calendar.todo.exrule:"
+msgid "Exception Rules"
+msgstr "Regles d'excepcions"
+
+msgctxt "view:calendar.todo.rdate:"
+msgid "Recurrence Date"
+msgstr "Data de recurrencia"
+
+msgctxt "view:calendar.todo.rdate:"
+msgid "Recurrence Dates"
+msgstr "Dates de recurrencia"
+
+msgctxt "view:calendar.todo.rrule:"
+msgid "Recurrence Rule"
+msgstr "Regla de recurrencia"
+
+msgctxt "view:calendar.todo.rrule:"
+msgid "Recurrence Rules"
+msgstr "Regles de recurrencia"
+
+msgctxt "view:calendar.todo:"
+msgid "Attendees"
+msgstr "Assistents"
+
+msgctxt "view:calendar.todo:"
+msgid "Categories"
+msgstr "Categories"
+
+msgctxt "view:calendar.todo:"
+msgid "General"
+msgstr "General"
+
+#, fuzzy
+msgctxt "view:calendar.todo:"
+msgid "Occurences"
+msgstr "Ocurrències"
+
+msgctxt "view:calendar.todo:"
+msgid "Recurrences"
+msgstr "Recurrencias"
+
+msgctxt "view:calendar.todo:"
+msgid "Todo"
+msgstr "Tasca"
+
+msgctxt "view:calendar.todo:"
+msgid "Todos"
+msgstr "Tasques"
diff --git a/locale/cs_CZ.po b/locale/cs_CZ.po
index 952cc84..3b45346 100644
--- a/locale/cs_CZ.po
+++ b/locale/cs_CZ.po
@@ -2,247 +2,407 @@
 msgid ""
 msgstr "Content-Type: text/plain; charset=utf-8\n"
 
-msgctxt "error:calendar.todo:0"
+msgctxt "error:calendar.todo:"
 msgid "Recurrence can not be recurrent!"
 msgstr ""
 
-msgctxt "error:calendar.todo:0"
+msgctxt "error:calendar.todo:"
 msgid "UUID and recurrence must be unique in a calendar!"
 msgstr ""
 
-msgctxt "field:calendar.todo,alarms:0"
+msgctxt "field:calendar.todo,alarms:"
 msgid "Alarms"
 msgstr ""
 
-msgctxt "field:calendar.todo,attendees:0"
+msgctxt "field:calendar.todo,attendees:"
 msgid "Attendees"
 msgstr ""
 
-msgctxt "field:calendar.todo,calendar:0"
+msgctxt "field:calendar.todo,calendar:"
 msgid "Calendar"
 msgstr ""
 
-msgctxt "field:calendar.todo,calendar_owner:0"
+msgctxt "field:calendar.todo,calendar_owner:"
 msgid "Owner"
 msgstr ""
 
-msgctxt "field:calendar.todo,calendar_read_users:0"
+msgctxt "field:calendar.todo,calendar_read_users:"
 msgid "Read Users"
 msgstr ""
 
-msgctxt "field:calendar.todo,calendar_write_users:0"
+msgctxt "field:calendar.todo,calendar_write_users:"
 msgid "Write Users"
 msgstr ""
 
-msgctxt "field:calendar.todo,categories:0"
+msgctxt "field:calendar.todo,categories:"
 msgid "Categories"
 msgstr ""
 
-msgctxt "field:calendar.todo,classification:0"
+msgctxt "field:calendar.todo,classification:"
 msgid "Classification"
 msgstr ""
 
-msgctxt "field:calendar.todo,completed:0"
+msgctxt "field:calendar.todo,completed:"
 msgid "Completed"
 msgstr ""
 
-msgctxt "field:calendar.todo,description:0"
+msgctxt "field:calendar.todo,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:calendar.todo,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:calendar.todo,description:"
 msgid "Description"
 msgstr ""
 
-msgctxt "field:calendar.todo,dtstart:0"
+msgctxt "field:calendar.todo,dtstart:"
 msgid "Start Date"
 msgstr ""
 
-msgctxt "field:calendar.todo,due:0"
+msgctxt "field:calendar.todo,due:"
 msgid "Due Date"
 msgstr ""
 
-msgctxt "field:calendar.todo,exdates:0"
+msgctxt "field:calendar.todo,exdates:"
 msgid "Exception Dates"
 msgstr ""
 
-msgctxt "field:calendar.todo,exrules:0"
+msgctxt "field:calendar.todo,exrules:"
 msgid "Exception Rules"
 msgstr ""
 
-msgctxt "field:calendar.todo,location:0"
+msgctxt "field:calendar.todo,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.todo,location:"
 msgid "Location"
 msgstr ""
 
-msgctxt "field:calendar.todo,occurences:0"
+msgctxt "field:calendar.todo,occurences:"
 msgid "Occurences"
 msgstr ""
 
-msgctxt "field:calendar.todo,organizer:0"
+msgctxt "field:calendar.todo,organizer:"
 msgid "Organizer"
 msgstr ""
 
-msgctxt "field:calendar.todo,parent:0"
+msgctxt "field:calendar.todo,parent:"
 msgid "Parent"
 msgstr ""
 
-msgctxt "field:calendar.todo,percent_complete:0"
+msgctxt "field:calendar.todo,percent_complete:"
 msgid "Percent complete"
 msgstr ""
 
-msgctxt "field:calendar.todo,rdates:0"
+msgctxt "field:calendar.todo,rdates:"
 msgid "Recurrence Dates"
 msgstr ""
 
-msgctxt "field:calendar.todo,rec_name:0"
+msgctxt "field:calendar.todo,rec_name:"
 msgid "Name"
 msgstr ""
 
-msgctxt "field:calendar.todo,recurrence:0"
+msgctxt "field:calendar.todo,recurrence:"
 msgid "Recurrence"
 msgstr ""
 
-msgctxt "field:calendar.todo,rrules:0"
+msgctxt "field:calendar.todo,rrules:"
 msgid "Recurrence Rules"
 msgstr ""
 
-msgctxt "field:calendar.todo,sequence:0"
+msgctxt "field:calendar.todo,sequence:"
 msgid "Sequence"
 msgstr ""
 
-msgctxt "field:calendar.todo,status:0"
+msgctxt "field:calendar.todo,status:"
 msgid "Status"
 msgstr ""
 
-msgctxt "field:calendar.todo,summary:0"
+msgctxt "field:calendar.todo,summary:"
 msgid "Summary"
 msgstr ""
 
-msgctxt "field:calendar.todo,timezone:0"
+msgctxt "field:calendar.todo,timezone:"
 msgid "Timezone"
 msgstr ""
 
-msgctxt "field:calendar.todo,uuid:0"
+msgctxt "field:calendar.todo,uuid:"
 msgid "UUID"
 msgstr ""
 
-msgctxt "field:calendar.todo,vtodo:0"
+msgctxt "field:calendar.todo,vtodo:"
 msgid "vtodo"
 msgstr ""
 
-msgctxt "field:calendar.todo-calendar.category,category:0"
+msgctxt "field:calendar.todo,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.todo,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.todo-calendar.category,category:"
 msgid "Category"
 msgstr ""
 
-msgctxt "field:calendar.todo-calendar.category,rec_name:0"
+msgctxt "field:calendar.todo-calendar.category,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:calendar.todo-calendar.category,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:calendar.todo-calendar.category,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.todo-calendar.category,rec_name:"
 msgid "Name"
 msgstr ""
 
-msgctxt "field:calendar.todo-calendar.category,todo:0"
+msgctxt "field:calendar.todo-calendar.category,todo:"
 msgid "To-Do"
 msgstr ""
 
-msgctxt "field:calendar.todo.alarm,calendar_alarm:0"
+msgctxt "field:calendar.todo-calendar.category,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.todo-calendar.category,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.todo.alarm,calendar_alarm:"
 msgid "Calendar Alarm"
 msgstr ""
 
-msgctxt "field:calendar.todo.alarm,rec_name:0"
+msgctxt "field:calendar.todo.alarm,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:calendar.todo.alarm,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:calendar.todo.alarm,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.todo.alarm,rec_name:"
 msgid "Name"
 msgstr ""
 
-msgctxt "field:calendar.todo.alarm,todo:0"
+msgctxt "field:calendar.todo.alarm,todo:"
 msgid "Todo"
 msgstr ""
 
-msgctxt "field:calendar.todo.attendee,calendar_attendee:0"
+msgctxt "field:calendar.todo.alarm,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.todo.alarm,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.todo.attendee,calendar_attendee:"
 msgid "Calendar Attendee"
 msgstr ""
 
-msgctxt "field:calendar.todo.attendee,rec_name:0"
+msgctxt "field:calendar.todo.attendee,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:calendar.todo.attendee,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:calendar.todo.attendee,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.todo.attendee,rec_name:"
 msgid "Name"
 msgstr ""
 
-msgctxt "field:calendar.todo.attendee,todo:0"
+msgctxt "field:calendar.todo.attendee,todo:"
 msgid "Todo"
 msgstr ""
 
-msgctxt "field:calendar.todo.exdate,calendar_date:0"
+msgctxt "field:calendar.todo.attendee,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.todo.attendee,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.todo.exdate,calendar_date:"
 msgid "Calendar Date"
 msgstr ""
 
-msgctxt "field:calendar.todo.exdate,rec_name:0"
+msgctxt "field:calendar.todo.exdate,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:calendar.todo.exdate,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:calendar.todo.exdate,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.todo.exdate,rec_name:"
 msgid "Name"
 msgstr ""
 
-msgctxt "field:calendar.todo.exdate,todo:0"
+msgctxt "field:calendar.todo.exdate,todo:"
 msgid "Todo"
 msgstr ""
 
-msgctxt "field:calendar.todo.exrule,calendar_rrule:0"
+msgctxt "field:calendar.todo.exdate,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.todo.exdate,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.todo.exrule,calendar_rrule:"
 msgid "Calendar RRule"
 msgstr ""
 
-msgctxt "field:calendar.todo.exrule,rec_name:0"
+msgctxt "field:calendar.todo.exrule,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:calendar.todo.exrule,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:calendar.todo.exrule,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.todo.exrule,rec_name:"
 msgid "Name"
 msgstr ""
 
-msgctxt "field:calendar.todo.exrule,todo:0"
+msgctxt "field:calendar.todo.exrule,todo:"
 msgid "Todo"
 msgstr ""
 
-msgctxt "field:calendar.todo.rdate,calendar_date:0"
+msgctxt "field:calendar.todo.exrule,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.todo.exrule,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.todo.rdate,calendar_date:"
 msgid "Calendar Date"
 msgstr ""
 
-msgctxt "field:calendar.todo.rdate,rec_name:0"
+msgctxt "field:calendar.todo.rdate,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:calendar.todo.rdate,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:calendar.todo.rdate,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.todo.rdate,rec_name:"
 msgid "Name"
 msgstr ""
 
-msgctxt "field:calendar.todo.rdate,todo:0"
+msgctxt "field:calendar.todo.rdate,todo:"
 msgid "Todo"
 msgstr ""
 
-msgctxt "field:calendar.todo.rrule,calendar_rrule:0"
+msgctxt "field:calendar.todo.rdate,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.todo.rdate,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.todo.rrule,calendar_rrule:"
 msgid "Calendar RRule"
 msgstr ""
 
-msgctxt "field:calendar.todo.rrule,rec_name:0"
+msgctxt "field:calendar.todo.rrule,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:calendar.todo.rrule,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:calendar.todo.rrule,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.todo.rrule,rec_name:"
 msgid "Name"
 msgstr ""
 
-msgctxt "field:calendar.todo.rrule,todo:0"
+msgctxt "field:calendar.todo.rrule,todo:"
 msgid "Todo"
 msgstr ""
 
-msgctxt "help:calendar.todo,uuid:0"
+msgctxt "field:calendar.todo.rrule,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.todo.rrule,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "help:calendar.todo,uuid:"
 msgid "Universally Unique Identifier"
 msgstr ""
 
-msgctxt "model:calendar.todo,name:0"
+msgctxt "model:calendar.todo,name:"
 msgid "Todo"
 msgstr ""
 
-msgctxt "model:calendar.todo-calendar.category,name:0"
+msgctxt "model:calendar.todo-calendar.category,name:"
 msgid "Todo - Category"
 msgstr ""
 
-msgctxt "model:calendar.todo.alarm,name:0"
+msgctxt "model:calendar.todo.alarm,name:"
 msgid "Alarm"
 msgstr ""
 
-msgctxt "model:calendar.todo.attendee,name:0"
+msgctxt "model:calendar.todo.attendee,name:"
 msgid "Attendee"
 msgstr ""
 
-msgctxt "model:calendar.todo.exdate,name:0"
+msgctxt "model:calendar.todo.exdate,name:"
 msgid "Exception Date"
 msgstr ""
 
-msgctxt "model:calendar.todo.exrule,name:0"
+msgctxt "model:calendar.todo.exrule,name:"
 msgid "Exception Rule"
 msgstr ""
 
-msgctxt "model:calendar.todo.rdate,name:0"
+msgctxt "model:calendar.todo.rdate,name:"
 msgid "Todo Recurrence Date"
 msgstr ""
 
-msgctxt "model:calendar.todo.rrule,name:0"
+msgctxt "model:calendar.todo.rrule,name:"
 msgid "Recurrence Rule"
 msgstr ""
 
@@ -258,98 +418,98 @@ msgctxt "model:ir.ui.menu,name:menu_todo_form"
 msgid "Todos"
 msgstr ""
 
-msgctxt "selection:calendar.todo,classification:0"
+msgctxt "selection:calendar.todo,classification:"
 msgid "Confidential"
 msgstr ""
 
-msgctxt "selection:calendar.todo,classification:0"
+msgctxt "selection:calendar.todo,classification:"
 msgid "Private"
 msgstr ""
 
-msgctxt "selection:calendar.todo,classification:0"
+msgctxt "selection:calendar.todo,classification:"
 msgid "Public"
 msgstr ""
 
-msgctxt "selection:calendar.todo,status:0"
+msgctxt "selection:calendar.todo,status:"
 msgid ""
 msgstr ""
 
-msgctxt "selection:calendar.todo,status:0"
+msgctxt "selection:calendar.todo,status:"
 msgid "Cancelled"
 msgstr ""
 
-msgctxt "selection:calendar.todo,status:0"
+msgctxt "selection:calendar.todo,status:"
 msgid "Completed"
 msgstr ""
 
-msgctxt "selection:calendar.todo,status:0"
+msgctxt "selection:calendar.todo,status:"
 msgid "In-Process"
 msgstr ""
 
-msgctxt "selection:calendar.todo,status:0"
+msgctxt "selection:calendar.todo,status:"
 msgid "Needs-Action"
 msgstr ""
 
-msgctxt "view:calendar.todo.attendee:0"
+msgctxt "view:calendar.todo.attendee:"
 msgid "Attendee"
 msgstr ""
 
-msgctxt "view:calendar.todo.attendee:0"
+msgctxt "view:calendar.todo.attendee:"
 msgid "Attendees"
 msgstr ""
 
-msgctxt "view:calendar.todo.exdate:0"
+msgctxt "view:calendar.todo.exdate:"
 msgid "Exception Date"
 msgstr ""
 
-msgctxt "view:calendar.todo.exdate:0"
+msgctxt "view:calendar.todo.exdate:"
 msgid "Exception Dates"
 msgstr ""
 
-msgctxt "view:calendar.todo.exrule:0"
+msgctxt "view:calendar.todo.exrule:"
 msgid "Exception Rule"
 msgstr ""
 
-msgctxt "view:calendar.todo.exrule:0"
+msgctxt "view:calendar.todo.exrule:"
 msgid "Exception Rules"
 msgstr ""
 
-msgctxt "view:calendar.todo.rdate:0"
+msgctxt "view:calendar.todo.rdate:"
 msgid "Recurrence Date"
 msgstr ""
 
-msgctxt "view:calendar.todo.rdate:0"
+msgctxt "view:calendar.todo.rdate:"
 msgid "Recurrence Dates"
 msgstr ""
 
-msgctxt "view:calendar.todo.rrule:0"
+msgctxt "view:calendar.todo.rrule:"
 msgid "Recurrence Rule"
 msgstr ""
 
-msgctxt "view:calendar.todo.rrule:0"
+msgctxt "view:calendar.todo.rrule:"
 msgid "Recurrence Rules"
 msgstr ""
 
-msgctxt "view:calendar.todo:0"
+msgctxt "view:calendar.todo:"
 msgid "Attendees"
 msgstr ""
 
-msgctxt "view:calendar.todo:0"
+msgctxt "view:calendar.todo:"
 msgid "Categories"
 msgstr ""
 
-msgctxt "view:calendar.todo:0"
+msgctxt "view:calendar.todo:"
 msgid "General"
 msgstr ""
 
-msgctxt "view:calendar.todo:0"
+msgctxt "view:calendar.todo:"
 msgid "Occurences"
 msgstr ""
 
-msgctxt "view:calendar.todo:0"
+msgctxt "view:calendar.todo:"
 msgid "Todo"
 msgstr ""
 
-msgctxt "view:calendar.todo:0"
+msgctxt "view:calendar.todo:"
 msgid "Todos"
 msgstr ""
diff --git a/locale/de_DE.po b/locale/de_DE.po
index e83f5d4..5e40432 100644
--- a/locale/de_DE.po
+++ b/locale/de_DE.po
@@ -2,249 +2,409 @@
 msgid ""
 msgstr "Content-Type: text/plain; charset=utf-8\n"
 
-msgctxt "error:calendar.todo:0"
+msgctxt "error:calendar.todo:"
 msgid "Recurrence can not be recurrent!"
 msgstr "Wiederholungen können nicht rekursiv sein!"
 
-msgctxt "error:calendar.todo:0"
+msgctxt "error:calendar.todo:"
 msgid "UUID and recurrence must be unique in a calendar!"
 msgstr ""
 "UUID und Wiederholung können in einem Kalender nicht mehrfach vergeben "
 "werden!"
 
-msgctxt "field:calendar.todo,alarms:0"
+msgctxt "field:calendar.todo,alarms:"
 msgid "Alarms"
 msgstr "Alarm"
 
-msgctxt "field:calendar.todo,attendees:0"
+msgctxt "field:calendar.todo,attendees:"
 msgid "Attendees"
 msgstr "Teilnehmer"
 
-msgctxt "field:calendar.todo,calendar:0"
+msgctxt "field:calendar.todo,calendar:"
 msgid "Calendar"
 msgstr "Kalender"
 
-msgctxt "field:calendar.todo,calendar_owner:0"
+msgctxt "field:calendar.todo,calendar_owner:"
 msgid "Owner"
 msgstr "Besitzer"
 
-msgctxt "field:calendar.todo,calendar_read_users:0"
+msgctxt "field:calendar.todo,calendar_read_users:"
 msgid "Read Users"
 msgstr "Benutzer mit Leseberechtigung"
 
-msgctxt "field:calendar.todo,calendar_write_users:0"
+msgctxt "field:calendar.todo,calendar_write_users:"
 msgid "Write Users"
 msgstr "Benutzer mit Schreibberechtigung"
 
-msgctxt "field:calendar.todo,categories:0"
+msgctxt "field:calendar.todo,categories:"
 msgid "Categories"
 msgstr "Kategorien"
 
-msgctxt "field:calendar.todo,classification:0"
+msgctxt "field:calendar.todo,classification:"
 msgid "Classification"
 msgstr "Klassifizierung"
 
-msgctxt "field:calendar.todo,completed:0"
+msgctxt "field:calendar.todo,completed:"
 msgid "Completed"
 msgstr "Abgeschlossen"
 
-msgctxt "field:calendar.todo,description:0"
+msgctxt "field:calendar.todo,create_date:"
+msgid "Create Date"
+msgstr "Erstellungsdatum"
+
+msgctxt "field:calendar.todo,create_uid:"
+msgid "Create User"
+msgstr "Erstellt durch"
+
+msgctxt "field:calendar.todo,description:"
 msgid "Description"
 msgstr "Bezeichnung"
 
-msgctxt "field:calendar.todo,dtstart:0"
+msgctxt "field:calendar.todo,dtstart:"
 msgid "Start Date"
 msgstr "Anfangsdatum"
 
-msgctxt "field:calendar.todo,due:0"
+msgctxt "field:calendar.todo,due:"
 msgid "Due Date"
 msgstr "Fälligkeitsdatum"
 
-msgctxt "field:calendar.todo,exdates:0"
+msgctxt "field:calendar.todo,exdates:"
 msgid "Exception Dates"
 msgstr "Ausnahmedaten"
 
-msgctxt "field:calendar.todo,exrules:0"
+msgctxt "field:calendar.todo,exrules:"
 msgid "Exception Rules"
 msgstr "Ausnahmeregeln"
 
-msgctxt "field:calendar.todo,location:0"
+msgctxt "field:calendar.todo,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.todo,location:"
 msgid "Location"
 msgstr "Ort"
 
-msgctxt "field:calendar.todo,occurences:0"
+msgctxt "field:calendar.todo,occurences:"
 msgid "Occurences"
 msgstr "Ereignisse"
 
-msgctxt "field:calendar.todo,organizer:0"
+msgctxt "field:calendar.todo,organizer:"
 msgid "Organizer"
 msgstr "Organisator"
 
-msgctxt "field:calendar.todo,parent:0"
+msgctxt "field:calendar.todo,parent:"
 msgid "Parent"
 msgstr "Übergeordnet (Aufgabe)"
 
-msgctxt "field:calendar.todo,percent_complete:0"
+msgctxt "field:calendar.todo,percent_complete:"
 msgid "Percent complete"
 msgstr "% erledigt"
 
-msgctxt "field:calendar.todo,rdates:0"
+msgctxt "field:calendar.todo,rdates:"
 msgid "Recurrence Dates"
 msgstr "Wiederholungsdaten"
 
-msgctxt "field:calendar.todo,rec_name:0"
+msgctxt "field:calendar.todo,rec_name:"
 msgid "Name"
 msgstr "Name"
 
-msgctxt "field:calendar.todo,recurrence:0"
+msgctxt "field:calendar.todo,recurrence:"
 msgid "Recurrence"
 msgstr "Wiederholung"
 
-msgctxt "field:calendar.todo,rrules:0"
+msgctxt "field:calendar.todo,rrules:"
 msgid "Recurrence Rules"
 msgstr "Wiederholungsregeln"
 
-msgctxt "field:calendar.todo,sequence:0"
+msgctxt "field:calendar.todo,sequence:"
 msgid "Sequence"
 msgstr "Revision"
 
-msgctxt "field:calendar.todo,status:0"
+msgctxt "field:calendar.todo,status:"
 msgid "Status"
 msgstr "Status"
 
-msgctxt "field:calendar.todo,summary:0"
+msgctxt "field:calendar.todo,summary:"
 msgid "Summary"
 msgstr "Zusammenfassung"
 
-msgctxt "field:calendar.todo,timezone:0"
+msgctxt "field:calendar.todo,timezone:"
 msgid "Timezone"
 msgstr "Zeitzone"
 
-msgctxt "field:calendar.todo,uuid:0"
+msgctxt "field:calendar.todo,uuid:"
 msgid "UUID"
 msgstr "UUID"
 
-msgctxt "field:calendar.todo,vtodo:0"
+msgctxt "field:calendar.todo,vtodo:"
 msgid "vtodo"
 msgstr "vtodo"
 
-msgctxt "field:calendar.todo-calendar.category,category:0"
+msgctxt "field:calendar.todo,write_date:"
+msgid "Write Date"
+msgstr "Zuletzt geändert"
+
+msgctxt "field:calendar.todo,write_uid:"
+msgid "Write User"
+msgstr "Letzte Änderung durch"
+
+msgctxt "field:calendar.todo-calendar.category,category:"
 msgid "Category"
 msgstr "Kategorie"
 
-msgctxt "field:calendar.todo-calendar.category,rec_name:0"
+msgctxt "field:calendar.todo-calendar.category,create_date:"
+msgid "Create Date"
+msgstr "Erstellungsdatum"
+
+msgctxt "field:calendar.todo-calendar.category,create_uid:"
+msgid "Create User"
+msgstr "Erstellt durch"
+
+msgctxt "field:calendar.todo-calendar.category,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.todo-calendar.category,rec_name:"
 msgid "Name"
 msgstr "Name"
 
-msgctxt "field:calendar.todo-calendar.category,todo:0"
+msgctxt "field:calendar.todo-calendar.category,todo:"
 msgid "To-Do"
 msgstr "Aufgabe"
 
-msgctxt "field:calendar.todo.alarm,calendar_alarm:0"
+msgctxt "field:calendar.todo-calendar.category,write_date:"
+msgid "Write Date"
+msgstr "Zuletzt geändert"
+
+msgctxt "field:calendar.todo-calendar.category,write_uid:"
+msgid "Write User"
+msgstr "Letzte Änderung durch"
+
+msgctxt "field:calendar.todo.alarm,calendar_alarm:"
 msgid "Calendar Alarm"
 msgstr "Kalender Alarm"
 
-msgctxt "field:calendar.todo.alarm,rec_name:0"
+msgctxt "field:calendar.todo.alarm,create_date:"
+msgid "Create Date"
+msgstr "Erstellungsdatum"
+
+msgctxt "field:calendar.todo.alarm,create_uid:"
+msgid "Create User"
+msgstr "Erstellt durch"
+
+msgctxt "field:calendar.todo.alarm,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.todo.alarm,rec_name:"
 msgid "Name"
 msgstr "Name"
 
-msgctxt "field:calendar.todo.alarm,todo:0"
+msgctxt "field:calendar.todo.alarm,todo:"
 msgid "Todo"
 msgstr "Aufgabe"
 
-msgctxt "field:calendar.todo.attendee,calendar_attendee:0"
+msgctxt "field:calendar.todo.alarm,write_date:"
+msgid "Write Date"
+msgstr "Zuletzt geändert"
+
+msgctxt "field:calendar.todo.alarm,write_uid:"
+msgid "Write User"
+msgstr "Letzte Änderung durch"
+
+msgctxt "field:calendar.todo.attendee,calendar_attendee:"
 msgid "Calendar Attendee"
 msgstr "Kalender Teilnehmer"
 
-msgctxt "field:calendar.todo.attendee,rec_name:0"
+msgctxt "field:calendar.todo.attendee,create_date:"
+msgid "Create Date"
+msgstr "Erstellungsdatum"
+
+msgctxt "field:calendar.todo.attendee,create_uid:"
+msgid "Create User"
+msgstr "Erstellt durch"
+
+msgctxt "field:calendar.todo.attendee,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.todo.attendee,rec_name:"
 msgid "Name"
 msgstr "Name"
 
-msgctxt "field:calendar.todo.attendee,todo:0"
+msgctxt "field:calendar.todo.attendee,todo:"
 msgid "Todo"
 msgstr "Aufgabe"
 
-msgctxt "field:calendar.todo.exdate,calendar_date:0"
+msgctxt "field:calendar.todo.attendee,write_date:"
+msgid "Write Date"
+msgstr "Zuletzt geändert"
+
+msgctxt "field:calendar.todo.attendee,write_uid:"
+msgid "Write User"
+msgstr "Letzte Änderung durch"
+
+msgctxt "field:calendar.todo.exdate,calendar_date:"
 msgid "Calendar Date"
 msgstr "Kalender Datum"
 
-msgctxt "field:calendar.todo.exdate,rec_name:0"
+msgctxt "field:calendar.todo.exdate,create_date:"
+msgid "Create Date"
+msgstr "Erstellungsdatum"
+
+msgctxt "field:calendar.todo.exdate,create_uid:"
+msgid "Create User"
+msgstr "Erstellt durch"
+
+msgctxt "field:calendar.todo.exdate,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.todo.exdate,rec_name:"
 msgid "Name"
 msgstr "Name"
 
-msgctxt "field:calendar.todo.exdate,todo:0"
+msgctxt "field:calendar.todo.exdate,todo:"
 msgid "Todo"
 msgstr "Aufgabe"
 
-msgctxt "field:calendar.todo.exrule,calendar_rrule:0"
+msgctxt "field:calendar.todo.exdate,write_date:"
+msgid "Write Date"
+msgstr "Zuletzt geändert"
+
+msgctxt "field:calendar.todo.exdate,write_uid:"
+msgid "Write User"
+msgstr "Letzte Änderung durch"
+
+msgctxt "field:calendar.todo.exrule,calendar_rrule:"
 msgid "Calendar RRule"
 msgstr "Kalender WRegel"
 
-msgctxt "field:calendar.todo.exrule,rec_name:0"
+msgctxt "field:calendar.todo.exrule,create_date:"
+msgid "Create Date"
+msgstr "Erstellungsdatum"
+
+msgctxt "field:calendar.todo.exrule,create_uid:"
+msgid "Create User"
+msgstr "Erstellt durch"
+
+msgctxt "field:calendar.todo.exrule,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.todo.exrule,rec_name:"
 msgid "Name"
 msgstr "Name"
 
-msgctxt "field:calendar.todo.exrule,todo:0"
+msgctxt "field:calendar.todo.exrule,todo:"
 msgid "Todo"
 msgstr "Aufgabe"
 
-msgctxt "field:calendar.todo.rdate,calendar_date:0"
+msgctxt "field:calendar.todo.exrule,write_date:"
+msgid "Write Date"
+msgstr "Zuletzt geändert"
+
+msgctxt "field:calendar.todo.exrule,write_uid:"
+msgid "Write User"
+msgstr "Letzte Änderung durch"
+
+msgctxt "field:calendar.todo.rdate,calendar_date:"
 msgid "Calendar Date"
 msgstr "Kalender Datum"
 
-msgctxt "field:calendar.todo.rdate,rec_name:0"
+msgctxt "field:calendar.todo.rdate,create_date:"
+msgid "Create Date"
+msgstr "Erstellungsdatum"
+
+msgctxt "field:calendar.todo.rdate,create_uid:"
+msgid "Create User"
+msgstr "Erstellt durch"
+
+msgctxt "field:calendar.todo.rdate,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.todo.rdate,rec_name:"
 msgid "Name"
 msgstr "Name"
 
-msgctxt "field:calendar.todo.rdate,todo:0"
+msgctxt "field:calendar.todo.rdate,todo:"
 msgid "Todo"
 msgstr "Aufgabe"
 
-msgctxt "field:calendar.todo.rrule,calendar_rrule:0"
+msgctxt "field:calendar.todo.rdate,write_date:"
+msgid "Write Date"
+msgstr "Zuletzt geändert"
+
+msgctxt "field:calendar.todo.rdate,write_uid:"
+msgid "Write User"
+msgstr "Letzte Änderung durch"
+
+msgctxt "field:calendar.todo.rrule,calendar_rrule:"
 msgid "Calendar RRule"
 msgstr "Kalender WRegel"
 
-msgctxt "field:calendar.todo.rrule,rec_name:0"
+msgctxt "field:calendar.todo.rrule,create_date:"
+msgid "Create Date"
+msgstr "Erstellungsdatum"
+
+msgctxt "field:calendar.todo.rrule,create_uid:"
+msgid "Create User"
+msgstr "Erstellt durch"
+
+msgctxt "field:calendar.todo.rrule,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.todo.rrule,rec_name:"
 msgid "Name"
 msgstr "Name"
 
-msgctxt "field:calendar.todo.rrule,todo:0"
+msgctxt "field:calendar.todo.rrule,todo:"
 msgid "Todo"
 msgstr "Aufgabe"
 
-msgctxt "help:calendar.todo,uuid:0"
+msgctxt "field:calendar.todo.rrule,write_date:"
+msgid "Write Date"
+msgstr "Zuletzt geändert"
+
+msgctxt "field:calendar.todo.rrule,write_uid:"
+msgid "Write User"
+msgstr "Letzte Änderung durch"
+
+msgctxt "help:calendar.todo,uuid:"
 msgid "Universally Unique Identifier"
 msgstr "Universally Unique Identifier"
 
-msgctxt "model:calendar.todo,name:0"
+msgctxt "model:calendar.todo,name:"
 msgid "Todo"
 msgstr "Aufgabe"
 
-msgctxt "model:calendar.todo-calendar.category,name:0"
+msgctxt "model:calendar.todo-calendar.category,name:"
 msgid "Todo - Category"
 msgstr "Aufgabe - Kategorie"
 
-msgctxt "model:calendar.todo.alarm,name:0"
+msgctxt "model:calendar.todo.alarm,name:"
 msgid "Alarm"
 msgstr "Alarm"
 
-msgctxt "model:calendar.todo.attendee,name:0"
+msgctxt "model:calendar.todo.attendee,name:"
 msgid "Attendee"
 msgstr "Teilnehmer"
 
-msgctxt "model:calendar.todo.exdate,name:0"
+msgctxt "model:calendar.todo.exdate,name:"
 msgid "Exception Date"
 msgstr "Ausnahmedatum"
 
-msgctxt "model:calendar.todo.exrule,name:0"
+msgctxt "model:calendar.todo.exrule,name:"
 msgid "Exception Rule"
 msgstr "Ausnahmeregel"
 
-msgctxt "model:calendar.todo.rdate,name:0"
+msgctxt "model:calendar.todo.rdate,name:"
 msgid "Todo Recurrence Date"
 msgstr "Aufgabe Wiederholungsdatum"
 
-msgctxt "model:calendar.todo.rrule,name:0"
+msgctxt "model:calendar.todo.rrule,name:"
 msgid "Recurrence Rule"
 msgstr "Wiederholungsregel"
 
@@ -260,102 +420,102 @@ msgctxt "model:ir.ui.menu,name:menu_todo_form"
 msgid "Todos"
 msgstr "Aufgaben"
 
-msgctxt "selection:calendar.todo,classification:0"
+msgctxt "selection:calendar.todo,classification:"
 msgid "Confidential"
 msgstr "Vertraulich"
 
-msgctxt "selection:calendar.todo,classification:0"
+msgctxt "selection:calendar.todo,classification:"
 msgid "Private"
 msgstr "Privat"
 
-msgctxt "selection:calendar.todo,classification:0"
+msgctxt "selection:calendar.todo,classification:"
 msgid "Public"
 msgstr "Öffentlich"
 
-msgctxt "selection:calendar.todo,status:0"
+msgctxt "selection:calendar.todo,status:"
 msgid ""
 msgstr ""
 
-msgctxt "selection:calendar.todo,status:0"
+msgctxt "selection:calendar.todo,status:"
 msgid "Cancelled"
 msgstr "Abgesagt"
 
-msgctxt "selection:calendar.todo,status:0"
+msgctxt "selection:calendar.todo,status:"
 msgid "Completed"
 msgstr "Abgeschlossen"
 
-msgctxt "selection:calendar.todo,status:0"
+msgctxt "selection:calendar.todo,status:"
 msgid "In-Process"
 msgstr "In Arbeit"
 
-msgctxt "selection:calendar.todo,status:0"
+msgctxt "selection:calendar.todo,status:"
 msgid "Needs-Action"
 msgstr "Benötigt Eingriff"
 
-msgctxt "view:calendar.todo.attendee:0"
+msgctxt "view:calendar.todo.attendee:"
 msgid "Attendee"
 msgstr "Teilnehmer"
 
-msgctxt "view:calendar.todo.attendee:0"
+msgctxt "view:calendar.todo.attendee:"
 msgid "Attendees"
 msgstr "Teilnehmer"
 
-msgctxt "view:calendar.todo.exdate:0"
+msgctxt "view:calendar.todo.exdate:"
 msgid "Exception Date"
 msgstr "Ausnahmedatum"
 
-msgctxt "view:calendar.todo.exdate:0"
+msgctxt "view:calendar.todo.exdate:"
 msgid "Exception Dates"
 msgstr "Ausnahmedaten"
 
-msgctxt "view:calendar.todo.exrule:0"
+msgctxt "view:calendar.todo.exrule:"
 msgid "Exception Rule"
 msgstr "Ausnahmeregel"
 
-msgctxt "view:calendar.todo.exrule:0"
+msgctxt "view:calendar.todo.exrule:"
 msgid "Exception Rules"
 msgstr "Ausnahmeregeln"
 
-msgctxt "view:calendar.todo.rdate:0"
+msgctxt "view:calendar.todo.rdate:"
 msgid "Recurrence Date"
 msgstr "Wiederholungsdatum"
 
-msgctxt "view:calendar.todo.rdate:0"
+msgctxt "view:calendar.todo.rdate:"
 msgid "Recurrence Dates"
 msgstr "Wiederholungsdaten"
 
-msgctxt "view:calendar.todo.rrule:0"
+msgctxt "view:calendar.todo.rrule:"
 msgid "Recurrence Rule"
 msgstr "Wiederholungsregel"
 
-msgctxt "view:calendar.todo.rrule:0"
+msgctxt "view:calendar.todo.rrule:"
 msgid "Recurrence Rules"
 msgstr "Wiederholungsregeln"
 
-msgctxt "view:calendar.todo:0"
+msgctxt "view:calendar.todo:"
 msgid "Attendees"
 msgstr "Teilnehmer"
 
-msgctxt "view:calendar.todo:0"
+msgctxt "view:calendar.todo:"
 msgid "Categories"
 msgstr "Kategorien"
 
-msgctxt "view:calendar.todo:0"
+msgctxt "view:calendar.todo:"
 msgid "General"
 msgstr "Allgemein"
 
-msgctxt "view:calendar.todo:0"
+msgctxt "view:calendar.todo:"
 msgid "Occurences"
 msgstr "Ereignisse"
 
-msgctxt "view:calendar.todo:0"
+msgctxt "view:calendar.todo:"
 msgid "Recurrences"
 msgstr "Wiederholungen"
 
-msgctxt "view:calendar.todo:0"
+msgctxt "view:calendar.todo:"
 msgid "Todo"
 msgstr "Aufgabe"
 
-msgctxt "view:calendar.todo:0"
+msgctxt "view:calendar.todo:"
 msgid "Todos"
 msgstr "Aufgaben"
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 90e30ea..6497ec2 100644
--- a/locale/es_CO.po
+++ b/locale/es_CO.po
@@ -2,250 +2,418 @@
 msgid ""
 msgstr "Content-Type: text/plain; charset=utf-8\n"
 
-msgctxt "error:calendar.todo:0"
+msgctxt "error:calendar.todo:"
 msgid "Recurrence can not be recurrent!"
 msgstr "¡La repetición no puede repetirse!"
 
-msgctxt "error:calendar.todo:0"
+msgctxt "error:calendar.todo:"
 msgid "UUID and recurrence must be unique in a calendar!"
 msgstr "¡El UUID y la recurrencia deben ser únicos por calendario! "
 
-msgctxt "field:calendar.todo,alarms:0"
+msgctxt "field:calendar.todo,alarms:"
 msgid "Alarms"
 msgstr "Alarmas"
 
-msgctxt "field:calendar.todo,attendees:0"
+msgctxt "field:calendar.todo,attendees:"
 msgid "Attendees"
 msgstr "Asistentes"
 
-msgctxt "field:calendar.todo,calendar:0"
+msgctxt "field:calendar.todo,calendar:"
 msgid "Calendar"
 msgstr "Calendario"
 
-msgctxt "field:calendar.todo,calendar_owner:0"
+msgctxt "field:calendar.todo,calendar_owner:"
 msgid "Owner"
 msgstr "Propietario"
 
-msgctxt "field:calendar.todo,calendar_read_users:0"
+msgctxt "field:calendar.todo,calendar_read_users:"
 msgid "Read Users"
 msgstr "Leer Usuarios"
 
-msgctxt "field:calendar.todo,calendar_write_users:0"
+msgctxt "field:calendar.todo,calendar_write_users:"
 msgid "Write Users"
 msgstr "Escribir Usuarios"
 
-msgctxt "field:calendar.todo,categories:0"
+msgctxt "field:calendar.todo,categories:"
 msgid "Categories"
 msgstr "Categorías"
 
-msgctxt "field:calendar.todo,classification:0"
+msgctxt "field:calendar.todo,classification:"
 msgid "Classification"
 msgstr "Clasificación"
 
-msgctxt "field:calendar.todo,completed:0"
+msgctxt "field:calendar.todo,completed:"
 msgid "Completed"
 msgstr ""
 
-msgctxt "field:calendar.todo,description:0"
+msgctxt "field:calendar.todo,create_date:"
+msgid "Create Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.todo,create_uid:"
+msgid "Create User"
+msgstr "Crear usuario"
+
+msgctxt "field:calendar.todo,description:"
 msgid "Description"
 msgstr "Descripción"
 
-msgctxt "field:calendar.todo,dtstart:0"
+msgctxt "field:calendar.todo,dtstart:"
 msgid "Start Date"
 msgstr "Fecha Inicio"
 
-msgctxt "field:calendar.todo,due:0"
+msgctxt "field:calendar.todo,due:"
 msgid "Due Date"
 msgstr ""
 
-msgctxt "field:calendar.todo,exdates:0"
+msgctxt "field:calendar.todo,exdates:"
 msgid "Exception Dates"
 msgstr "Fechas de Excepción"
 
-msgctxt "field:calendar.todo,exrules:0"
+msgctxt "field:calendar.todo,exrules:"
 msgid "Exception Rules"
 msgstr "Reglas de Excepción"
 
-msgctxt "field:calendar.todo,location:0"
+msgctxt "field:calendar.todo,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.todo,location:"
 msgid "Location"
 msgstr "Lugar"
 
-msgctxt "field:calendar.todo,occurences:0"
+msgctxt "field:calendar.todo,occurences:"
 msgid "Occurences"
 msgstr "Ocurrencias"
 
-msgctxt "field:calendar.todo,organizer:0"
+msgctxt "field:calendar.todo,organizer:"
 msgid "Organizer"
 msgstr "Organizador"
 
-msgctxt "field:calendar.todo,parent:0"
+msgctxt "field:calendar.todo,parent:"
 msgid "Parent"
 msgstr "Padre"
 
-msgctxt "field:calendar.todo,percent_complete:0"
+msgctxt "field:calendar.todo,percent_complete:"
 msgid "Percent complete"
 msgstr ""
 
-msgctxt "field:calendar.todo,rdates:0"
+msgctxt "field:calendar.todo,rdates:"
 msgid "Recurrence Dates"
 msgstr "Fechas de Repetición"
 
-msgctxt "field:calendar.todo,rec_name:0"
+msgctxt "field:calendar.todo,rec_name:"
 msgid "Name"
 msgstr "Nombre"
 
-msgctxt "field:calendar.todo,recurrence:0"
+msgctxt "field:calendar.todo,recurrence:"
 msgid "Recurrence"
 msgstr "Repetición"
 
-msgctxt "field:calendar.todo,rrules:0"
+msgctxt "field:calendar.todo,rrules:"
 msgid "Recurrence Rules"
 msgstr "Reglas de Repetición"
 
-msgctxt "field:calendar.todo,sequence:0"
+msgctxt "field:calendar.todo,sequence:"
 msgid "Sequence"
 msgstr "Secuencia"
 
-msgctxt "field:calendar.todo,status:0"
+msgctxt "field:calendar.todo,status:"
 msgid "Status"
 msgstr "Estado"
 
-msgctxt "field:calendar.todo,summary:0"
+msgctxt "field:calendar.todo,summary:"
 msgid "Summary"
 msgstr "Resumen"
 
-msgctxt "field:calendar.todo,timezone:0"
+msgctxt "field:calendar.todo,timezone:"
 msgid "Timezone"
 msgstr "Zona horaria"
 
-msgctxt "field:calendar.todo,uuid:0"
+msgctxt "field:calendar.todo,uuid:"
 msgid "UUID"
 msgstr "UUID"
 
-msgctxt "field:calendar.todo,vtodo:0"
+msgctxt "field:calendar.todo,vtodo:"
 msgid "vtodo"
 msgstr ""
 
-msgctxt "field:calendar.todo-calendar.category,category:0"
+msgctxt "field:calendar.todo,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.todo,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.todo-calendar.category,category:"
 msgid "Category"
 msgstr "Categoría"
 
-msgctxt "field:calendar.todo-calendar.category,rec_name:0"
+msgctxt "field:calendar.todo-calendar.category,create_date:"
+msgid "Create Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.todo-calendar.category,create_uid:"
+msgid "Create User"
+msgstr "Crear usuario"
+
+msgctxt "field:calendar.todo-calendar.category,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.todo-calendar.category,rec_name:"
 msgid "Name"
 msgstr "Nombre"
 
-msgctxt "field:calendar.todo-calendar.category,todo:0"
+msgctxt "field:calendar.todo-calendar.category,todo:"
 msgid "To-Do"
 msgstr ""
 
-msgctxt "field:calendar.todo.alarm,calendar_alarm:0"
+msgctxt "field:calendar.todo-calendar.category,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.todo-calendar.category,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.todo.alarm,calendar_alarm:"
 msgid "Calendar Alarm"
 msgstr ""
 
-msgctxt "field:calendar.todo.alarm,rec_name:0"
+msgctxt "field:calendar.todo.alarm,create_date:"
+msgid "Create Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.todo.alarm,create_uid:"
+msgid "Create User"
+msgstr "Crear usuario"
+
+msgctxt "field:calendar.todo.alarm,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.todo.alarm,rec_name:"
 msgid "Name"
 msgstr "Nombre"
 
-msgctxt "field:calendar.todo.alarm,todo:0"
+msgctxt "field:calendar.todo.alarm,todo:"
 msgid "Todo"
 msgstr ""
 
-msgctxt "field:calendar.todo.attendee,calendar_attendee:0"
+msgctxt "field:calendar.todo.alarm,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.todo.alarm,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.todo.attendee,calendar_attendee:"
 msgid "Calendar Attendee"
 msgstr ""
 
-msgctxt "field:calendar.todo.attendee,rec_name:0"
+msgctxt "field:calendar.todo.attendee,create_date:"
+msgid "Create Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.todo.attendee,create_uid:"
+msgid "Create User"
+msgstr "Crear usuario"
+
+msgctxt "field:calendar.todo.attendee,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.todo.attendee,rec_name:"
 msgid "Name"
 msgstr "Nombre"
 
-msgctxt "field:calendar.todo.attendee,todo:0"
+msgctxt "field:calendar.todo.attendee,todo:"
 msgid "Todo"
 msgstr ""
 
+msgctxt "field:calendar.todo.attendee,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.todo.attendee,write_uid:"
+msgid "Write User"
+msgstr ""
+
 #, fuzzy
-msgctxt "field:calendar.todo.exdate,calendar_date:0"
+msgctxt "field:calendar.todo.exdate,calendar_date:"
 msgid "Calendar Date"
 msgstr "Fecha Calendario"
 
-msgctxt "field:calendar.todo.exdate,rec_name:0"
+msgctxt "field:calendar.todo.exdate,create_date:"
+msgid "Create Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.todo.exdate,create_uid:"
+msgid "Create User"
+msgstr "Crear usuario"
+
+msgctxt "field:calendar.todo.exdate,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.todo.exdate,rec_name:"
 msgid "Name"
 msgstr "Nombre"
 
-msgctxt "field:calendar.todo.exdate,todo:0"
+msgctxt "field:calendar.todo.exdate,todo:"
 msgid "Todo"
 msgstr ""
 
-msgctxt "field:calendar.todo.exrule,calendar_rrule:0"
+msgctxt "field:calendar.todo.exdate,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.todo.exdate,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.todo.exrule,calendar_rrule:"
 msgid "Calendar RRule"
 msgstr ""
 
-msgctxt "field:calendar.todo.exrule,rec_name:0"
+msgctxt "field:calendar.todo.exrule,create_date:"
+msgid "Create Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.todo.exrule,create_uid:"
+msgid "Create User"
+msgstr "Crear usuario"
+
+msgctxt "field:calendar.todo.exrule,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.todo.exrule,rec_name:"
 msgid "Name"
 msgstr "Nombre"
 
-msgctxt "field:calendar.todo.exrule,todo:0"
+msgctxt "field:calendar.todo.exrule,todo:"
 msgid "Todo"
 msgstr ""
 
+msgctxt "field:calendar.todo.exrule,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.todo.exrule,write_uid:"
+msgid "Write User"
+msgstr ""
+
 #, fuzzy
-msgctxt "field:calendar.todo.rdate,calendar_date:0"
+msgctxt "field:calendar.todo.rdate,calendar_date:"
 msgid "Calendar Date"
 msgstr "Fecha Calendario"
 
-msgctxt "field:calendar.todo.rdate,rec_name:0"
+msgctxt "field:calendar.todo.rdate,create_date:"
+msgid "Create Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.todo.rdate,create_uid:"
+msgid "Create User"
+msgstr "Crear usuario"
+
+msgctxt "field:calendar.todo.rdate,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.todo.rdate,rec_name:"
 msgid "Name"
 msgstr "Nombre"
 
-msgctxt "field:calendar.todo.rdate,todo:0"
+msgctxt "field:calendar.todo.rdate,todo:"
 msgid "Todo"
 msgstr ""
 
-msgctxt "field:calendar.todo.rrule,calendar_rrule:0"
+msgctxt "field:calendar.todo.rdate,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.todo.rdate,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.todo.rrule,calendar_rrule:"
 msgid "Calendar RRule"
 msgstr ""
 
-msgctxt "field:calendar.todo.rrule,rec_name:0"
+msgctxt "field:calendar.todo.rrule,create_date:"
+msgid "Create Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.todo.rrule,create_uid:"
+msgid "Create User"
+msgstr "Crear usuario"
+
+msgctxt "field:calendar.todo.rrule,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.todo.rrule,rec_name:"
 msgid "Name"
 msgstr "Nombre"
 
-msgctxt "field:calendar.todo.rrule,todo:0"
+msgctxt "field:calendar.todo.rrule,todo:"
 msgid "Todo"
 msgstr ""
 
-msgctxt "help:calendar.todo,uuid:0"
+msgctxt "field:calendar.todo.rrule,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.todo.rrule,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "help:calendar.todo,uuid:"
 msgid "Universally Unique Identifier"
 msgstr "Identificador Único Universal"
 
-msgctxt "model:calendar.todo,name:0"
+msgctxt "model:calendar.todo,name:"
 msgid "Todo"
 msgstr ""
 
-msgctxt "model:calendar.todo-calendar.category,name:0"
+msgctxt "model:calendar.todo-calendar.category,name:"
 msgid "Todo - Category"
 msgstr ""
 
-msgctxt "model:calendar.todo.alarm,name:0"
+msgctxt "model:calendar.todo.alarm,name:"
 msgid "Alarm"
 msgstr "Alarma"
 
-msgctxt "model:calendar.todo.attendee,name:0"
+msgctxt "model:calendar.todo.attendee,name:"
 msgid "Attendee"
 msgstr "Asistente"
 
-msgctxt "model:calendar.todo.exdate,name:0"
+msgctxt "model:calendar.todo.exdate,name:"
 msgid "Exception Date"
 msgstr "Fecha de Excepción"
 
-msgctxt "model:calendar.todo.exrule,name:0"
+msgctxt "model:calendar.todo.exrule,name:"
 msgid "Exception Rule"
 msgstr "Regla de Excepción"
 
 #, fuzzy
-msgctxt "model:calendar.todo.rdate,name:0"
+msgctxt "model:calendar.todo.rdate,name:"
 msgid "Todo Recurrence Date"
 msgstr "Fecha de Repetición"
 
-msgctxt "model:calendar.todo.rrule,name:0"
+msgctxt "model:calendar.todo.rrule,name:"
 msgid "Recurrence Rule"
 msgstr "Regla de Repetición"
 
@@ -263,103 +431,103 @@ msgctxt "model:ir.ui.menu,name:menu_todo_form"
 msgid "Todos"
 msgstr "Por hacer"
 
-msgctxt "selection:calendar.todo,classification:0"
+msgctxt "selection:calendar.todo,classification:"
 msgid "Confidential"
 msgstr "Confidencial"
 
-msgctxt "selection:calendar.todo,classification:0"
+msgctxt "selection:calendar.todo,classification:"
 msgid "Private"
 msgstr "Privado"
 
-msgctxt "selection:calendar.todo,classification:0"
+msgctxt "selection:calendar.todo,classification:"
 msgid "Public"
 msgstr "Público"
 
-msgctxt "selection:calendar.todo,status:0"
+msgctxt "selection:calendar.todo,status:"
 msgid ""
 msgstr ""
 
-msgctxt "selection:calendar.todo,status:0"
+msgctxt "selection:calendar.todo,status:"
 msgid "Cancelled"
 msgstr "Cancelado"
 
-msgctxt "selection:calendar.todo,status:0"
+msgctxt "selection:calendar.todo,status:"
 msgid "Completed"
 msgstr ""
 
-msgctxt "selection:calendar.todo,status:0"
+msgctxt "selection:calendar.todo,status:"
 msgid "In-Process"
 msgstr ""
 
-msgctxt "selection:calendar.todo,status:0"
+msgctxt "selection:calendar.todo,status:"
 msgid "Needs-Action"
 msgstr ""
 
-msgctxt "view:calendar.todo.attendee:0"
+msgctxt "view:calendar.todo.attendee:"
 msgid "Attendee"
 msgstr "Asistente"
 
-msgctxt "view:calendar.todo.attendee:0"
+msgctxt "view:calendar.todo.attendee:"
 msgid "Attendees"
 msgstr "Asistentes"
 
-msgctxt "view:calendar.todo.exdate:0"
+msgctxt "view:calendar.todo.exdate:"
 msgid "Exception Date"
 msgstr "Fecha de Excepción"
 
-msgctxt "view:calendar.todo.exdate:0"
+msgctxt "view:calendar.todo.exdate:"
 msgid "Exception Dates"
 msgstr "Fechas de Excepción"
 
-msgctxt "view:calendar.todo.exrule:0"
+msgctxt "view:calendar.todo.exrule:"
 msgid "Exception Rule"
 msgstr "Regla de Excepción"
 
-msgctxt "view:calendar.todo.exrule:0"
+msgctxt "view:calendar.todo.exrule:"
 msgid "Exception Rules"
 msgstr "Reglas de Excepción"
 
-msgctxt "view:calendar.todo.rdate:0"
+msgctxt "view:calendar.todo.rdate:"
 msgid "Recurrence Date"
 msgstr "Fecha de Repetición"
 
-msgctxt "view:calendar.todo.rdate:0"
+msgctxt "view:calendar.todo.rdate:"
 msgid "Recurrence Dates"
 msgstr "Fechas de Repetición"
 
-msgctxt "view:calendar.todo.rrule:0"
+msgctxt "view:calendar.todo.rrule:"
 msgid "Recurrence Rule"
 msgstr "Regla de Repetición"
 
-msgctxt "view:calendar.todo.rrule:0"
+msgctxt "view:calendar.todo.rrule:"
 msgid "Recurrence Rules"
 msgstr "Reglas de Repetición"
 
-msgctxt "view:calendar.todo:0"
+msgctxt "view:calendar.todo:"
 msgid "Attendees"
 msgstr "Asistentes"
 
-msgctxt "view:calendar.todo:0"
+msgctxt "view:calendar.todo:"
 msgid "Categories"
 msgstr "Categorías"
 
-msgctxt "view:calendar.todo:0"
+msgctxt "view:calendar.todo:"
 msgid "General"
 msgstr "General"
 
-msgctxt "view:calendar.todo:0"
+msgctxt "view:calendar.todo:"
 msgid "Occurences"
 msgstr "Ocurrencias"
 
-msgctxt "view:calendar.todo:0"
+msgctxt "view:calendar.todo:"
 msgid "Recurrences"
 msgstr "Repeticiones"
 
-msgctxt "view:calendar.todo:0"
+msgctxt "view:calendar.todo:"
 msgid "Todo"
 msgstr ""
 
 #, fuzzy
-msgctxt "view:calendar.todo:0"
+msgctxt "view:calendar.todo:"
 msgid "Todos"
 msgstr "Por hacer"
diff --git a/locale/es_ES.po b/locale/es_ES.po
index 26b3e1f..950cf5d 100644
--- a/locale/es_ES.po
+++ b/locale/es_ES.po
@@ -2,249 +2,407 @@
 msgid ""
 msgstr "Content-Type: text/plain; charset=utf-8\n"
 
-msgctxt "error:calendar.todo:0"
+msgctxt "error:calendar.todo:"
 msgid "Recurrence can not be recurrent!"
-msgstr "Una recurrencia no puede ser recurrente"
+msgstr "Una recurrencia no puede ser recurrente."
 
-msgctxt "error:calendar.todo:0"
+msgctxt "error:calendar.todo:"
 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 "field:calendar.todo,alarms:0"
+msgctxt "field:calendar.todo,alarms:"
 msgid "Alarms"
 msgstr "Alarmas"
 
-msgctxt "field:calendar.todo,attendees:0"
+msgctxt "field:calendar.todo,attendees:"
 msgid "Attendees"
 msgstr "Asistentes"
 
-msgctxt "field:calendar.todo,calendar:0"
+msgctxt "field:calendar.todo,calendar:"
 msgid "Calendar"
 msgstr "Calendario"
 
-msgctxt "field:calendar.todo,calendar_owner:0"
+msgctxt "field:calendar.todo,calendar_owner:"
 msgid "Owner"
-msgstr "Dueño"
+msgstr "Propietario"
 
-msgctxt "field:calendar.todo,calendar_read_users:0"
+msgctxt "field:calendar.todo,calendar_read_users:"
 msgid "Read Users"
 msgstr "Usuarios con lectura"
 
-msgctxt "field:calendar.todo,calendar_write_users:0"
+msgctxt "field:calendar.todo,calendar_write_users:"
 msgid "Write Users"
 msgstr "Usuarios con escritura"
 
-msgctxt "field:calendar.todo,categories:0"
+msgctxt "field:calendar.todo,categories:"
 msgid "Categories"
 msgstr "Categorías"
 
-msgctxt "field:calendar.todo,classification:0"
+msgctxt "field:calendar.todo,classification:"
 msgid "Classification"
 msgstr "Clasificación"
 
-msgctxt "field:calendar.todo,completed:0"
+msgctxt "field:calendar.todo,completed:"
 msgid "Completed"
 msgstr "Completada"
 
-msgctxt "field:calendar.todo,description:0"
+msgctxt "field:calendar.todo,create_date:"
+msgid "Create Date"
+msgstr "Fecha creación"
+
+msgctxt "field:calendar.todo,create_uid:"
+msgid "Create User"
+msgstr "Usuario creación"
+
+msgctxt "field:calendar.todo,description:"
 msgid "Description"
 msgstr "Descripción"
 
-msgctxt "field:calendar.todo,dtstart:0"
+msgctxt "field:calendar.todo,dtstart:"
 msgid "Start Date"
-msgstr "Fecha inicio"
+msgstr "Fecha inicial"
 
-msgctxt "field:calendar.todo,due:0"
+msgctxt "field:calendar.todo,due:"
 msgid "Due Date"
-msgstr "Fecha de vencimiento"
+msgstr "Fecha vencimiento"
 
-msgctxt "field:calendar.todo,exdates:0"
+msgctxt "field:calendar.todo,exdates:"
 msgid "Exception Dates"
 msgstr "Fechas excluidas"
 
-msgctxt "field:calendar.todo,exrules:0"
+msgctxt "field:calendar.todo,exrules:"
 msgid "Exception Rules"
 msgstr "Reglas de excepciones"
 
-msgctxt "field:calendar.todo,location:0"
+msgctxt "field:calendar.todo,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.todo,location:"
 msgid "Location"
 msgstr "Ubicación"
 
-#, fuzzy
-msgctxt "field:calendar.todo,occurences:0"
+msgctxt "field:calendar.todo,occurences:"
 msgid "Occurences"
 msgstr "Ocurrencias"
 
-msgctxt "field:calendar.todo,organizer:0"
+msgctxt "field:calendar.todo,organizer:"
 msgid "Organizer"
 msgstr "Organizador"
 
-msgctxt "field:calendar.todo,parent:0"
+msgctxt "field:calendar.todo,parent:"
 msgid "Parent"
 msgstr "Padre"
 
-msgctxt "field:calendar.todo,percent_complete:0"
+msgctxt "field:calendar.todo,percent_complete:"
 msgid "Percent complete"
 msgstr "Porcentaje total"
 
-msgctxt "field:calendar.todo,rdates:0"
+msgctxt "field:calendar.todo,rdates:"
 msgid "Recurrence Dates"
 msgstr "Fechas de recurrencia"
 
-msgctxt "field:calendar.todo,rec_name:0"
+msgctxt "field:calendar.todo,rec_name:"
 msgid "Name"
 msgstr "Nombre"
 
-msgctxt "field:calendar.todo,recurrence:0"
+msgctxt "field:calendar.todo,recurrence:"
 msgid "Recurrence"
 msgstr "Recurrencia"
 
-msgctxt "field:calendar.todo,rrules:0"
+msgctxt "field:calendar.todo,rrules:"
 msgid "Recurrence Rules"
 msgstr "Reglas de recurrencia"
 
-msgctxt "field:calendar.todo,sequence:0"
+msgctxt "field:calendar.todo,sequence:"
 msgid "Sequence"
 msgstr "Secuencia"
 
-msgctxt "field:calendar.todo,status:0"
+msgctxt "field:calendar.todo,status:"
 msgid "Status"
 msgstr "Estado"
 
-msgctxt "field:calendar.todo,summary:0"
+msgctxt "field:calendar.todo,summary:"
 msgid "Summary"
 msgstr "Resumen"
 
-msgctxt "field:calendar.todo,timezone:0"
+msgctxt "field:calendar.todo,timezone:"
 msgid "Timezone"
 msgstr "Zona horaria"
 
-msgctxt "field:calendar.todo,uuid:0"
+msgctxt "field:calendar.todo,uuid:"
 msgid "UUID"
 msgstr "UUID"
 
-msgctxt "field:calendar.todo,vtodo:0"
+msgctxt "field:calendar.todo,vtodo:"
 msgid "vtodo"
-msgstr "vtodo"
+msgstr "vtarea"
 
-msgctxt "field:calendar.todo-calendar.category,category:0"
+msgctxt "field:calendar.todo,write_date:"
+msgid "Write Date"
+msgstr "Fecha modificación"
+
+msgctxt "field:calendar.todo,write_uid:"
+msgid "Write User"
+msgstr "Usuario modificación"
+
+msgctxt "field:calendar.todo-calendar.category,category:"
 msgid "Category"
 msgstr "Categoría"
 
-msgctxt "field:calendar.todo-calendar.category,rec_name:0"
+msgctxt "field:calendar.todo-calendar.category,create_date:"
+msgid "Create Date"
+msgstr "Fecha creación"
+
+msgctxt "field:calendar.todo-calendar.category,create_uid:"
+msgid "Create User"
+msgstr "Usuario creación"
+
+msgctxt "field:calendar.todo-calendar.category,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.todo-calendar.category,rec_name:"
 msgid "Name"
 msgstr "Nombre"
 
-msgctxt "field:calendar.todo-calendar.category,todo:0"
+msgctxt "field:calendar.todo-calendar.category,todo:"
 msgid "To-Do"
 msgstr "Por hacer"
 
-msgctxt "field:calendar.todo.alarm,calendar_alarm:0"
+msgctxt "field:calendar.todo-calendar.category,write_date:"
+msgid "Write Date"
+msgstr "Fecha modificación"
+
+msgctxt "field:calendar.todo-calendar.category,write_uid:"
+msgid "Write User"
+msgstr "Usuario modificación"
+
+msgctxt "field:calendar.todo.alarm,calendar_alarm:"
 msgid "Calendar Alarm"
 msgstr "Alarma del calendario"
 
-msgctxt "field:calendar.todo.alarm,rec_name:0"
+msgctxt "field:calendar.todo.alarm,create_date:"
+msgid "Create Date"
+msgstr "Fecha creación"
+
+msgctxt "field:calendar.todo.alarm,create_uid:"
+msgid "Create User"
+msgstr "Usuario creación"
+
+msgctxt "field:calendar.todo.alarm,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.todo.alarm,rec_name:"
 msgid "Name"
 msgstr "Nombre"
 
-msgctxt "field:calendar.todo.alarm,todo:0"
+msgctxt "field:calendar.todo.alarm,todo:"
 msgid "Todo"
 msgstr "Tarea"
 
-msgctxt "field:calendar.todo.attendee,calendar_attendee:0"
+msgctxt "field:calendar.todo.alarm,write_date:"
+msgid "Write Date"
+msgstr "Fecha modificación"
+
+msgctxt "field:calendar.todo.alarm,write_uid:"
+msgid "Write User"
+msgstr "Usuario modificación"
+
+msgctxt "field:calendar.todo.attendee,calendar_attendee:"
 msgid "Calendar Attendee"
 msgstr "Calendario de asistentes"
 
-msgctxt "field:calendar.todo.attendee,rec_name:0"
+msgctxt "field:calendar.todo.attendee,create_date:"
+msgid "Create Date"
+msgstr "Fecha creación"
+
+msgctxt "field:calendar.todo.attendee,create_uid:"
+msgid "Create User"
+msgstr "Usuario creación"
+
+msgctxt "field:calendar.todo.attendee,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.todo.attendee,rec_name:"
 msgid "Name"
 msgstr "Nombre"
 
-msgctxt "field:calendar.todo.attendee,todo:0"
+msgctxt "field:calendar.todo.attendee,todo:"
 msgid "Todo"
 msgstr "Tarea"
 
-msgctxt "field:calendar.todo.exdate,calendar_date:0"
+msgctxt "field:calendar.todo.attendee,write_date:"
+msgid "Write Date"
+msgstr "Fecha modificación"
+
+msgctxt "field:calendar.todo.attendee,write_uid:"
+msgid "Write User"
+msgstr "Usuario modificación"
+
+msgctxt "field:calendar.todo.exdate,calendar_date:"
 msgid "Calendar Date"
-msgstr ""
+msgstr "Fecha calendario"
+
+msgctxt "field:calendar.todo.exdate,create_date:"
+msgid "Create Date"
+msgstr "Fecha creación"
 
-msgctxt "field:calendar.todo.exdate,rec_name:0"
+msgctxt "field:calendar.todo.exdate,create_uid:"
+msgid "Create User"
+msgstr "Usuario creación"
+
+msgctxt "field:calendar.todo.exdate,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.todo.exdate,rec_name:"
 msgid "Name"
 msgstr "Nombre"
 
-msgctxt "field:calendar.todo.exdate,todo:0"
+msgctxt "field:calendar.todo.exdate,todo:"
 msgid "Todo"
 msgstr "Tarea"
 
-msgctxt "field:calendar.todo.exrule,calendar_rrule:0"
+msgctxt "field:calendar.todo.exdate,write_date:"
+msgid "Write Date"
+msgstr "Fecha modificación"
+
+msgctxt "field:calendar.todo.exdate,write_uid:"
+msgid "Write User"
+msgstr "Usuario modificación"
+
+msgctxt "field:calendar.todo.exrule,calendar_rrule:"
 msgid "Calendar RRule"
 msgstr "Regla de recurrencia"
 
-msgctxt "field:calendar.todo.exrule,rec_name:0"
+msgctxt "field:calendar.todo.exrule,create_date:"
+msgid "Create Date"
+msgstr "Fecha creación"
+
+msgctxt "field:calendar.todo.exrule,create_uid:"
+msgid "Create User"
+msgstr "Usuario creación"
+
+msgctxt "field:calendar.todo.exrule,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.todo.exrule,rec_name:"
 msgid "Name"
 msgstr "Nombre"
 
-msgctxt "field:calendar.todo.exrule,todo:0"
+msgctxt "field:calendar.todo.exrule,todo:"
 msgid "Todo"
 msgstr "Tarea"
 
-msgctxt "field:calendar.todo.rdate,calendar_date:0"
+msgctxt "field:calendar.todo.exrule,write_date:"
+msgid "Write Date"
+msgstr "Fecha modificación"
+
+msgctxt "field:calendar.todo.exrule,write_uid:"
+msgid "Write User"
+msgstr "Usuario modificación"
+
+msgctxt "field:calendar.todo.rdate,calendar_date:"
 msgid "Calendar Date"
-msgstr ""
+msgstr "Fecha calendario"
+
+msgctxt "field:calendar.todo.rdate,create_date:"
+msgid "Create Date"
+msgstr "Fecha creación"
 
-msgctxt "field:calendar.todo.rdate,rec_name:0"
+msgctxt "field:calendar.todo.rdate,create_uid:"
+msgid "Create User"
+msgstr "Usuario creación"
+
+msgctxt "field:calendar.todo.rdate,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.todo.rdate,rec_name:"
 msgid "Name"
 msgstr "Nombre"
 
-msgctxt "field:calendar.todo.rdate,todo:0"
+msgctxt "field:calendar.todo.rdate,todo:"
 msgid "Todo"
 msgstr "Tarea"
 
-msgctxt "field:calendar.todo.rrule,calendar_rrule:0"
+msgctxt "field:calendar.todo.rdate,write_date:"
+msgid "Write Date"
+msgstr "Fecha modificación"
+
+msgctxt "field:calendar.todo.rdate,write_uid:"
+msgid "Write User"
+msgstr "Usuario modificación"
+
+msgctxt "field:calendar.todo.rrule,calendar_rrule:"
 msgid "Calendar RRule"
 msgstr "Regla de recurrencia"
 
-msgctxt "field:calendar.todo.rrule,rec_name:0"
+msgctxt "field:calendar.todo.rrule,create_date:"
+msgid "Create Date"
+msgstr "Fecha creación"
+
+msgctxt "field:calendar.todo.rrule,create_uid:"
+msgid "Create User"
+msgstr "Usuario creación"
+
+msgctxt "field:calendar.todo.rrule,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.todo.rrule,rec_name:"
 msgid "Name"
 msgstr "Nombre"
 
-msgctxt "field:calendar.todo.rrule,todo:0"
+msgctxt "field:calendar.todo.rrule,todo:"
 msgid "Todo"
 msgstr "Tarea"
 
-msgctxt "help:calendar.todo,uuid:0"
+msgctxt "field:calendar.todo.rrule,write_date:"
+msgid "Write Date"
+msgstr "Fecha modificación"
+
+msgctxt "field:calendar.todo.rrule,write_uid:"
+msgid "Write User"
+msgstr "Usuario modificación"
+
+msgctxt "help:calendar.todo,uuid:"
 msgid "Universally Unique Identifier"
-msgstr "Identificador universal único"
+msgstr "Identificador universal único."
 
-msgctxt "model:calendar.todo,name:0"
+msgctxt "model:calendar.todo,name:"
 msgid "Todo"
 msgstr "Tarea"
 
-msgctxt "model:calendar.todo-calendar.category,name:0"
+msgctxt "model:calendar.todo-calendar.category,name:"
 msgid "Todo - Category"
 msgstr "Tarea - Categoría"
 
-msgctxt "model:calendar.todo.alarm,name:0"
+msgctxt "model:calendar.todo.alarm,name:"
 msgid "Alarm"
 msgstr "Alarma"
 
-msgctxt "model:calendar.todo.attendee,name:0"
+msgctxt "model:calendar.todo.attendee,name:"
 msgid "Attendee"
 msgstr "Asistentes"
 
-msgctxt "model:calendar.todo.exdate,name:0"
+msgctxt "model:calendar.todo.exdate,name:"
 msgid "Exception Date"
 msgstr "Fecha excluida"
 
-msgctxt "model:calendar.todo.exrule,name:0"
+msgctxt "model:calendar.todo.exrule,name:"
 msgid "Exception Rule"
 msgstr "Regla de excepción"
 
-#, fuzzy
-msgctxt "model:calendar.todo.rdate,name:0"
+msgctxt "model:calendar.todo.rdate,name:"
 msgid "Todo Recurrence Date"
-msgstr "Fecha de recurrencia"
+msgstr "Fecha recurrente de tarea"
 
-msgctxt "model:calendar.todo.rrule,name:0"
+msgctxt "model:calendar.todo.rrule,name:"
 msgid "Recurrence Rule"
 msgstr "Regla de recurrencia"
 
@@ -252,7 +410,6 @@ msgctxt "model:ir.action,name:act_todo_form"
 msgid "Todos"
 msgstr "Tareas"
 
-#, fuzzy
 msgctxt "model:ir.action,name:act_todo_form3"
 msgid "Todos"
 msgstr "Tareas"
@@ -261,103 +418,102 @@ msgctxt "model:ir.ui.menu,name:menu_todo_form"
 msgid "Todos"
 msgstr "Tareas"
 
-msgctxt "selection:calendar.todo,classification:0"
+msgctxt "selection:calendar.todo,classification:"
 msgid "Confidential"
 msgstr "Confidencial"
 
-msgctxt "selection:calendar.todo,classification:0"
+msgctxt "selection:calendar.todo,classification:"
 msgid "Private"
 msgstr "Privado"
 
-msgctxt "selection:calendar.todo,classification:0"
+msgctxt "selection:calendar.todo,classification:"
 msgid "Public"
 msgstr "Público"
 
-msgctxt "selection:calendar.todo,status:0"
+msgctxt "selection:calendar.todo,status:"
 msgid ""
 msgstr ""
 
-msgctxt "selection:calendar.todo,status:0"
+msgctxt "selection:calendar.todo,status:"
 msgid "Cancelled"
 msgstr "Cancelada"
 
-msgctxt "selection:calendar.todo,status:0"
+msgctxt "selection:calendar.todo,status:"
 msgid "Completed"
-msgstr "Completado"
+msgstr "Completada"
 
-msgctxt "selection:calendar.todo,status:0"
+msgctxt "selection:calendar.todo,status:"
 msgid "In-Process"
 msgstr "En proceso"
 
-msgctxt "selection:calendar.todo,status:0"
+msgctxt "selection:calendar.todo,status:"
 msgid "Needs-Action"
-msgstr "Necesita una acción"
+msgstr "Necesita acción"
 
-msgctxt "view:calendar.todo.attendee:0"
+msgctxt "view:calendar.todo.attendee:"
 msgid "Attendee"
 msgstr "Asistentes"
 
-msgctxt "view:calendar.todo.attendee:0"
+msgctxt "view:calendar.todo.attendee:"
 msgid "Attendees"
 msgstr "Asistentes"
 
-msgctxt "view:calendar.todo.exdate:0"
+msgctxt "view:calendar.todo.exdate:"
 msgid "Exception Date"
 msgstr "Fecha excluida"
 
-msgctxt "view:calendar.todo.exdate:0"
+msgctxt "view:calendar.todo.exdate:"
 msgid "Exception Dates"
 msgstr "Fechas excluidas"
 
-msgctxt "view:calendar.todo.exrule:0"
+msgctxt "view:calendar.todo.exrule:"
 msgid "Exception Rule"
 msgstr "Regla de excepción"
 
-msgctxt "view:calendar.todo.exrule:0"
+msgctxt "view:calendar.todo.exrule:"
 msgid "Exception Rules"
 msgstr "Reglas de excepciones"
 
-msgctxt "view:calendar.todo.rdate:0"
+msgctxt "view:calendar.todo.rdate:"
 msgid "Recurrence Date"
 msgstr "Fecha de recurrencia"
 
-msgctxt "view:calendar.todo.rdate:0"
+msgctxt "view:calendar.todo.rdate:"
 msgid "Recurrence Dates"
 msgstr "Fechas de recurrencia"
 
-msgctxt "view:calendar.todo.rrule:0"
+msgctxt "view:calendar.todo.rrule:"
 msgid "Recurrence Rule"
 msgstr "Regla de recurrencia"
 
-msgctxt "view:calendar.todo.rrule:0"
+msgctxt "view:calendar.todo.rrule:"
 msgid "Recurrence Rules"
 msgstr "Reglas de recurrencia"
 
-msgctxt "view:calendar.todo:0"
+msgctxt "view:calendar.todo:"
 msgid "Attendees"
 msgstr "Asistentes"
 
-msgctxt "view:calendar.todo:0"
+msgctxt "view:calendar.todo:"
 msgid "Categories"
 msgstr "Categorías"
 
-msgctxt "view:calendar.todo:0"
+msgctxt "view:calendar.todo:"
 msgid "General"
 msgstr "General"
 
-#, fuzzy
-msgctxt "view:calendar.todo:0"
+msgctxt "view:calendar.todo:"
 msgid "Occurences"
 msgstr "Ocurrencias"
 
-msgctxt "view:calendar.todo:0"
+msgctxt "view:calendar.todo:"
 msgid "Recurrences"
 msgstr "Recurrencias"
 
-msgctxt "view:calendar.todo:0"
+msgctxt "view:calendar.todo:"
 msgid "Todo"
 msgstr "Tarea"
 
-msgctxt "view:calendar.todo:0"
+msgctxt "view:calendar.todo:"
 msgid "Todos"
 msgstr "Tareas"
diff --git a/locale/fr_FR.po b/locale/fr_FR.po
index bbe3ff4..993dc35 100644
--- a/locale/fr_FR.po
+++ b/locale/fr_FR.po
@@ -2,247 +2,415 @@
 msgid ""
 msgstr "Content-Type: text/plain; charset=utf-8\n"
 
-msgctxt "error:calendar.todo:0"
+msgctxt "error:calendar.todo:"
 msgid "Recurrence can not be recurrent!"
 msgstr "Une récurrence ne peut pas être récurrente !"
 
-msgctxt "error:calendar.todo:0"
+msgctxt "error:calendar.todo:"
+msgid "Recurrence can not be recurrent!"
+msgstr "Une récurrence ne peut pas être récurrente !"
+
+msgctxt "error:calendar.todo:"
+msgid "UUID and recurrence must be unique in a calendar!"
+msgstr "UUID et récurrence doivent être uniques sur un calendrier !"
+
+msgctxt "error:calendar.todo:"
 msgid "UUID and recurrence must be unique in a calendar!"
 msgstr "UUID et récurrence doivent être uniques sur un calendrier !"
 
-msgctxt "field:calendar.todo,alarms:0"
+msgctxt "field:calendar.todo,alarms:"
 msgid "Alarms"
 msgstr "Alarmes"
 
-msgctxt "field:calendar.todo,attendees:0"
+msgctxt "field:calendar.todo,attendees:"
 msgid "Attendees"
 msgstr "Participants"
 
-msgctxt "field:calendar.todo,calendar:0"
+msgctxt "field:calendar.todo,calendar:"
 msgid "Calendar"
 msgstr "Calendrier"
 
-msgctxt "field:calendar.todo,calendar_owner:0"
+msgctxt "field:calendar.todo,calendar_owner:"
 msgid "Owner"
 msgstr "Propriétaire"
 
-msgctxt "field:calendar.todo,calendar_read_users:0"
+msgctxt "field:calendar.todo,calendar_read_users:"
 msgid "Read Users"
 msgstr "Utilisateurs en lecture"
 
-msgctxt "field:calendar.todo,calendar_write_users:0"
+msgctxt "field:calendar.todo,calendar_write_users:"
 msgid "Write Users"
 msgstr "Utilisateurs en écriture"
 
-msgctxt "field:calendar.todo,categories:0"
+msgctxt "field:calendar.todo,categories:"
 msgid "Categories"
 msgstr "Catégories"
 
-msgctxt "field:calendar.todo,classification:0"
+msgctxt "field:calendar.todo,classification:"
 msgid "Classification"
 msgstr "Classification"
 
-msgctxt "field:calendar.todo,completed:0"
+msgctxt "field:calendar.todo,completed:"
 msgid "Completed"
 msgstr "Complété"
 
-msgctxt "field:calendar.todo,description:0"
+msgctxt "field:calendar.todo,create_date:"
+msgid "Create Date"
+msgstr "Date de création"
+
+msgctxt "field:calendar.todo,create_uid:"
+msgid "Create User"
+msgstr "Créé par"
+
+msgctxt "field:calendar.todo,description:"
 msgid "Description"
 msgstr "Description"
 
-msgctxt "field:calendar.todo,dtstart:0"
+msgctxt "field:calendar.todo,dtstart:"
 msgid "Start Date"
 msgstr "Date de début"
 
-msgctxt "field:calendar.todo,due:0"
+msgctxt "field:calendar.todo,due:"
 msgid "Due Date"
 msgstr "Date d'échéance"
 
-msgctxt "field:calendar.todo,exdates:0"
+msgctxt "field:calendar.todo,exdates:"
 msgid "Exception Dates"
 msgstr "Dates d'exception"
 
-msgctxt "field:calendar.todo,exrules:0"
+msgctxt "field:calendar.todo,exrules:"
 msgid "Exception Rules"
 msgstr "Règles d'exception"
 
-msgctxt "field:calendar.todo,location:0"
+msgctxt "field:calendar.todo,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.todo,location:"
 msgid "Location"
 msgstr "Emplacement"
 
-msgctxt "field:calendar.todo,occurences:0"
+msgctxt "field:calendar.todo,occurences:"
 msgid "Occurences"
 msgstr "Occurrences"
 
-msgctxt "field:calendar.todo,organizer:0"
+msgctxt "field:calendar.todo,organizer:"
 msgid "Organizer"
 msgstr "Organisateur"
 
-msgctxt "field:calendar.todo,parent:0"
+msgctxt "field:calendar.todo,parent:"
 msgid "Parent"
 msgstr "Parent"
 
-msgctxt "field:calendar.todo,percent_complete:0"
+msgctxt "field:calendar.todo,percent_complete:"
 msgid "Percent complete"
 msgstr "Pourcentage effectué"
 
-msgctxt "field:calendar.todo,rdates:0"
+msgctxt "field:calendar.todo,rdates:"
 msgid "Recurrence Dates"
 msgstr "Dates de récurrence"
 
-msgctxt "field:calendar.todo,rec_name:0"
+msgctxt "field:calendar.todo,rec_name:"
 msgid "Name"
 msgstr "Nom"
 
-msgctxt "field:calendar.todo,recurrence:0"
+msgctxt "field:calendar.todo,recurrence:"
 msgid "Recurrence"
 msgstr "Récurrence"
 
-msgctxt "field:calendar.todo,rrules:0"
+msgctxt "field:calendar.todo,rrules:"
 msgid "Recurrence Rules"
 msgstr "Règles de récurrence"
 
-msgctxt "field:calendar.todo,sequence:0"
+msgctxt "field:calendar.todo,sequence:"
 msgid "Sequence"
 msgstr "Séquence"
 
-msgctxt "field:calendar.todo,status:0"
+msgctxt "field:calendar.todo,status:"
 msgid "Status"
 msgstr "Statut"
 
-msgctxt "field:calendar.todo,summary:0"
+msgctxt "field:calendar.todo,summary:"
 msgid "Summary"
 msgstr "Résumé"
 
-msgctxt "field:calendar.todo,timezone:0"
+msgctxt "field:calendar.todo,timezone:"
 msgid "Timezone"
 msgstr "Fuseau Horaire"
 
-msgctxt "field:calendar.todo,uuid:0"
+msgctxt "field:calendar.todo,uuid:"
 msgid "UUID"
 msgstr "UUID"
 
-msgctxt "field:calendar.todo,vtodo:0"
+msgctxt "field:calendar.todo,vtodo:"
 msgid "vtodo"
 msgstr "vtodo"
 
-msgctxt "field:calendar.todo-calendar.category,category:0"
+msgctxt "field:calendar.todo,write_date:"
+msgid "Write Date"
+msgstr "Date de mise à jour"
+
+msgctxt "field:calendar.todo,write_uid:"
+msgid "Write User"
+msgstr "Mis à jour par"
+
+msgctxt "field:calendar.todo-calendar.category,category:"
 msgid "Category"
 msgstr "Catégorie"
 
-msgctxt "field:calendar.todo-calendar.category,rec_name:0"
+msgctxt "field:calendar.todo-calendar.category,create_date:"
+msgid "Create Date"
+msgstr "Date de création"
+
+msgctxt "field:calendar.todo-calendar.category,create_uid:"
+msgid "Create User"
+msgstr "Créé par"
+
+msgctxt "field:calendar.todo-calendar.category,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.todo-calendar.category,rec_name:"
 msgid "Name"
 msgstr "Nom"
 
-msgctxt "field:calendar.todo-calendar.category,todo:0"
+msgctxt "field:calendar.todo-calendar.category,todo:"
 msgid "To-Do"
 msgstr "Tâche"
 
-msgctxt "field:calendar.todo.alarm,calendar_alarm:0"
+msgctxt "field:calendar.todo-calendar.category,write_date:"
+msgid "Write Date"
+msgstr "Date de mise à jour"
+
+msgctxt "field:calendar.todo-calendar.category,write_uid:"
+msgid "Write User"
+msgstr "Mis à jour par"
+
+msgctxt "field:calendar.todo.alarm,calendar_alarm:"
 msgid "Calendar Alarm"
 msgstr "Alarme calendrier"
 
-msgctxt "field:calendar.todo.alarm,rec_name:0"
+msgctxt "field:calendar.todo.alarm,create_date:"
+msgid "Create Date"
+msgstr "Date de création"
+
+msgctxt "field:calendar.todo.alarm,create_uid:"
+msgid "Create User"
+msgstr "Créé par"
+
+msgctxt "field:calendar.todo.alarm,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.todo.alarm,rec_name:"
 msgid "Name"
 msgstr "Nom"
 
-msgctxt "field:calendar.todo.alarm,todo:0"
+msgctxt "field:calendar.todo.alarm,todo:"
 msgid "Todo"
 msgstr "Tâche"
 
-msgctxt "field:calendar.todo.attendee,calendar_attendee:0"
+msgctxt "field:calendar.todo.alarm,write_date:"
+msgid "Write Date"
+msgstr "Date de mise à jour"
+
+msgctxt "field:calendar.todo.alarm,write_uid:"
+msgid "Write User"
+msgstr "Mis à jour par"
+
+msgctxt "field:calendar.todo.attendee,calendar_attendee:"
 msgid "Calendar Attendee"
 msgstr "Participant calendrier"
 
-msgctxt "field:calendar.todo.attendee,rec_name:0"
+msgctxt "field:calendar.todo.attendee,create_date:"
+msgid "Create Date"
+msgstr "Date de création"
+
+msgctxt "field:calendar.todo.attendee,create_uid:"
+msgid "Create User"
+msgstr "Créé par"
+
+msgctxt "field:calendar.todo.attendee,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.todo.attendee,rec_name:"
 msgid "Name"
 msgstr "Nom"
 
-msgctxt "field:calendar.todo.attendee,todo:0"
+msgctxt "field:calendar.todo.attendee,todo:"
 msgid "Todo"
 msgstr "Tâche"
 
-msgctxt "field:calendar.todo.exdate,calendar_date:0"
+msgctxt "field:calendar.todo.attendee,write_date:"
+msgid "Write Date"
+msgstr "Date de mise à jour"
+
+msgctxt "field:calendar.todo.attendee,write_uid:"
+msgid "Write User"
+msgstr "Mis à jour par"
+
+msgctxt "field:calendar.todo.exdate,calendar_date:"
 msgid "Calendar Date"
 msgstr "Date calendrier"
 
-msgctxt "field:calendar.todo.exdate,rec_name:0"
+msgctxt "field:calendar.todo.exdate,create_date:"
+msgid "Create Date"
+msgstr "Date de création"
+
+msgctxt "field:calendar.todo.exdate,create_uid:"
+msgid "Create User"
+msgstr "Créé par"
+
+msgctxt "field:calendar.todo.exdate,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.todo.exdate,rec_name:"
 msgid "Name"
 msgstr "Nom"
 
-msgctxt "field:calendar.todo.exdate,todo:0"
+msgctxt "field:calendar.todo.exdate,todo:"
 msgid "Todo"
 msgstr "Tâche"
 
-msgctxt "field:calendar.todo.exrule,calendar_rrule:0"
+msgctxt "field:calendar.todo.exdate,write_date:"
+msgid "Write Date"
+msgstr "Date de mise à jour"
+
+msgctxt "field:calendar.todo.exdate,write_uid:"
+msgid "Write User"
+msgstr "Mis à jour par"
+
+msgctxt "field:calendar.todo.exrule,calendar_rrule:"
 msgid "Calendar RRule"
 msgstr "Règle de récurrence"
 
-msgctxt "field:calendar.todo.exrule,rec_name:0"
+msgctxt "field:calendar.todo.exrule,create_date:"
+msgid "Create Date"
+msgstr "Date de création"
+
+msgctxt "field:calendar.todo.exrule,create_uid:"
+msgid "Create User"
+msgstr "Créé par"
+
+msgctxt "field:calendar.todo.exrule,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.todo.exrule,rec_name:"
 msgid "Name"
 msgstr "Nom"
 
-msgctxt "field:calendar.todo.exrule,todo:0"
+msgctxt "field:calendar.todo.exrule,todo:"
 msgid "Todo"
 msgstr "Tâche"
 
-msgctxt "field:calendar.todo.rdate,calendar_date:0"
+msgctxt "field:calendar.todo.exrule,write_date:"
+msgid "Write Date"
+msgstr "Date de mise à jour"
+
+msgctxt "field:calendar.todo.exrule,write_uid:"
+msgid "Write User"
+msgstr "Mis à jour par"
+
+msgctxt "field:calendar.todo.rdate,calendar_date:"
 msgid "Calendar Date"
 msgstr "Date calendrier"
 
-msgctxt "field:calendar.todo.rdate,rec_name:0"
+msgctxt "field:calendar.todo.rdate,create_date:"
+msgid "Create Date"
+msgstr "Date de création"
+
+msgctxt "field:calendar.todo.rdate,create_uid:"
+msgid "Create User"
+msgstr "Créé par"
+
+msgctxt "field:calendar.todo.rdate,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.todo.rdate,rec_name:"
 msgid "Name"
 msgstr "Nom"
 
-msgctxt "field:calendar.todo.rdate,todo:0"
+msgctxt "field:calendar.todo.rdate,todo:"
 msgid "Todo"
 msgstr "Tâche"
 
-msgctxt "field:calendar.todo.rrule,calendar_rrule:0"
+msgctxt "field:calendar.todo.rdate,write_date:"
+msgid "Write Date"
+msgstr "Date de mise à jour"
+
+msgctxt "field:calendar.todo.rdate,write_uid:"
+msgid "Write User"
+msgstr "Mis à jour par"
+
+msgctxt "field:calendar.todo.rrule,calendar_rrule:"
 msgid "Calendar RRule"
 msgstr "Règle de récurrence"
 
-msgctxt "field:calendar.todo.rrule,rec_name:0"
+msgctxt "field:calendar.todo.rrule,create_date:"
+msgid "Create Date"
+msgstr "Date de création"
+
+msgctxt "field:calendar.todo.rrule,create_uid:"
+msgid "Create User"
+msgstr "Créé par"
+
+msgctxt "field:calendar.todo.rrule,id:"
+msgid "ID"
+msgstr "ID"
+
+msgctxt "field:calendar.todo.rrule,rec_name:"
 msgid "Name"
 msgstr "Nom"
 
-msgctxt "field:calendar.todo.rrule,todo:0"
+msgctxt "field:calendar.todo.rrule,todo:"
 msgid "Todo"
 msgstr "Tâche"
 
-msgctxt "help:calendar.todo,uuid:0"
+msgctxt "field:calendar.todo.rrule,write_date:"
+msgid "Write Date"
+msgstr "Date de mise à jour"
+
+msgctxt "field:calendar.todo.rrule,write_uid:"
+msgid "Write User"
+msgstr "Mis à jour par"
+
+msgctxt "help:calendar.todo,uuid:"
 msgid "Universally Unique Identifier"
 msgstr "Identificateur unique universel"
 
-msgctxt "model:calendar.todo,name:0"
+msgctxt "model:calendar.todo,name:"
 msgid "Todo"
 msgstr "Tâche"
 
-msgctxt "model:calendar.todo-calendar.category,name:0"
+msgctxt "model:calendar.todo-calendar.category,name:"
 msgid "Todo - Category"
 msgstr "Todo - Catégorie"
 
-msgctxt "model:calendar.todo.alarm,name:0"
+msgctxt "model:calendar.todo.alarm,name:"
 msgid "Alarm"
 msgstr "Alarme"
 
-msgctxt "model:calendar.todo.attendee,name:0"
+msgctxt "model:calendar.todo.attendee,name:"
 msgid "Attendee"
 msgstr "Participant"
 
-msgctxt "model:calendar.todo.exdate,name:0"
+msgctxt "model:calendar.todo.exdate,name:"
 msgid "Exception Date"
 msgstr "Date d'exception"
 
-msgctxt "model:calendar.todo.exrule,name:0"
+msgctxt "model:calendar.todo.exrule,name:"
 msgid "Exception Rule"
 msgstr "Règle d'exception"
 
-msgctxt "model:calendar.todo.rdate,name:0"
+msgctxt "model:calendar.todo.rdate,name:"
 msgid "Todo Recurrence Date"
 msgstr "Date de récurrence"
 
-msgctxt "model:calendar.todo.rrule,name:0"
+msgctxt "model:calendar.todo.rrule,name:"
 msgid "Recurrence Rule"
 msgstr "Règle de récurrence"
 
@@ -258,102 +426,198 @@ msgctxt "model:ir.ui.menu,name:menu_todo_form"
 msgid "Todos"
 msgstr "Tâches"
 
-msgctxt "selection:calendar.todo,classification:0"
+msgctxt "selection:calendar.todo,classification:"
+msgid "Confidential"
+msgstr "Confidentiel"
+
+msgctxt "selection:calendar.todo,classification:"
 msgid "Confidential"
 msgstr "Confidentiel"
 
-msgctxt "selection:calendar.todo,classification:0"
+msgctxt "selection:calendar.todo,classification:"
+msgid "Private"
+msgstr "Privé"
+
+msgctxt "selection:calendar.todo,classification:"
 msgid "Private"
 msgstr "Privé"
 
-msgctxt "selection:calendar.todo,classification:0"
+msgctxt "selection:calendar.todo,classification:"
 msgid "Public"
 msgstr "Publique"
 
-msgctxt "selection:calendar.todo,status:0"
+msgctxt "selection:calendar.todo,classification:"
+msgid "Public"
+msgstr "Publique"
+
+msgctxt "selection:calendar.todo,status:"
 msgid ""
 msgstr ""
 
-msgctxt "selection:calendar.todo,status:0"
+msgctxt "selection:calendar.todo,status:"
+msgid ""
+msgstr ""
+
+msgctxt "selection:calendar.todo,status:"
+msgid "Cancelled"
+msgstr "Annulé"
+
+msgctxt "selection:calendar.todo,status:"
 msgid "Cancelled"
 msgstr "Annulé"
 
-msgctxt "selection:calendar.todo,status:0"
+msgctxt "selection:calendar.todo,status:"
+msgid "Completed"
+msgstr "Complété"
+
+msgctxt "selection:calendar.todo,status:"
 msgid "Completed"
 msgstr "Complété"
 
-msgctxt "selection:calendar.todo,status:0"
+msgctxt "selection:calendar.todo,status:"
+msgid "In-Process"
+msgstr "En court"
+
+msgctxt "selection:calendar.todo,status:"
 msgid "In-Process"
 msgstr "En court"
 
-msgctxt "selection:calendar.todo,status:0"
+msgctxt "selection:calendar.todo,status:"
 msgid "Needs-Action"
 msgstr "Nécessite une action"
 
-msgctxt "view:calendar.todo.attendee:0"
+msgctxt "selection:calendar.todo,status:"
+msgid "Needs-Action"
+msgstr "Nécessite une action"
+
+msgctxt "view:calendar.todo.attendee:"
 msgid "Attendee"
 msgstr "Participant"
 
-msgctxt "view:calendar.todo.attendee:0"
+msgctxt "view:calendar.todo.attendee:"
+msgid "Attendee"
+msgstr "Participant"
+
+msgctxt "view:calendar.todo.attendee:"
+msgid "Attendees"
+msgstr "Participants"
+
+msgctxt "view:calendar.todo.attendee:"
 msgid "Attendees"
 msgstr "Participants"
 
-msgctxt "view:calendar.todo.exdate:0"
+msgctxt "view:calendar.todo.exdate:"
+msgid "Exception Date"
+msgstr "Date d'exception"
+
+msgctxt "view:calendar.todo.exdate:"
 msgid "Exception Date"
 msgstr "Date d'exception"
 
-msgctxt "view:calendar.todo.exdate:0"
+msgctxt "view:calendar.todo.exdate:"
+msgid "Exception Dates"
+msgstr "Dates d'exception"
+
+msgctxt "view:calendar.todo.exdate:"
 msgid "Exception Dates"
 msgstr "Dates d'exception"
 
-msgctxt "view:calendar.todo.exrule:0"
+msgctxt "view:calendar.todo.exrule:"
 msgid "Exception Rule"
 msgstr "Règle d'exception"
 
-msgctxt "view:calendar.todo.exrule:0"
+msgctxt "view:calendar.todo.exrule:"
+msgid "Exception Rule"
+msgstr "Règle d'exception"
+
+msgctxt "view:calendar.todo.exrule:"
 msgid "Exception Rules"
 msgstr "Règles d'exception"
 
-msgctxt "view:calendar.todo.rdate:0"
+msgctxt "view:calendar.todo.exrule:"
+msgid "Exception Rules"
+msgstr "Règles d'exception"
+
+msgctxt "view:calendar.todo.rdate:"
 msgid "Recurrence Date"
 msgstr "Date de récurrence"
 
-msgctxt "view:calendar.todo.rdate:0"
+msgctxt "view:calendar.todo.rdate:"
+msgid "Recurrence Date"
+msgstr "Date de récurrence"
+
+msgctxt "view:calendar.todo.rdate:"
+msgid "Recurrence Dates"
+msgstr "Dates de récurrence"
+
+msgctxt "view:calendar.todo.rdate:"
 msgid "Recurrence Dates"
 msgstr "Dates de récurrence"
 
-msgctxt "view:calendar.todo.rrule:0"
+msgctxt "view:calendar.todo.rrule:"
+msgid "Recurrence Rule"
+msgstr "Règle de récurrence"
+
+msgctxt "view:calendar.todo.rrule:"
 msgid "Recurrence Rule"
 msgstr "Règle de récurrence"
 
-msgctxt "view:calendar.todo.rrule:0"
+msgctxt "view:calendar.todo.rrule:"
 msgid "Recurrence Rules"
 msgstr "Règles de récurrence"
 
-msgctxt "view:calendar.todo:0"
+msgctxt "view:calendar.todo.rrule:"
+msgid "Recurrence Rules"
+msgstr "Règles de récurrence"
+
+msgctxt "view:calendar.todo:"
 msgid "Attendees"
 msgstr "Participants"
 
-msgctxt "view:calendar.todo:0"
+msgctxt "view:calendar.todo:"
+msgid "Attendees"
+msgstr "Participants"
+
+msgctxt "view:calendar.todo:"
 msgid "Categories"
 msgstr "Catégories"
 
-msgctxt "view:calendar.todo:0"
+msgctxt "view:calendar.todo:"
+msgid "Categories"
+msgstr "Catégories"
+
+msgctxt "view:calendar.todo:"
 msgid "General"
 msgstr "Général"
 
-msgctxt "view:calendar.todo:0"
+msgctxt "view:calendar.todo:"
+msgid "General"
+msgstr "Général"
+
+msgctxt "view:calendar.todo:"
+msgid "Occurences"
+msgstr "Occurrences"
+
+msgctxt "view:calendar.todo:"
 msgid "Occurences"
 msgstr "Occurrences"
 
-msgctxt "view:calendar.todo:0"
+msgctxt "view:calendar.todo:"
 msgid "Recurrences"
 msgstr "Récurrences"
 
-msgctxt "view:calendar.todo:0"
+msgctxt "view:calendar.todo:"
+msgid "Todo"
+msgstr "Tâche"
+
+msgctxt "view:calendar.todo:"
 msgid "Todo"
 msgstr "Tâche"
 
-msgctxt "view:calendar.todo:0"
+msgctxt "view:calendar.todo:"
+msgid "Todos"
+msgstr "Tâches"
+
+msgctxt "view:calendar.todo:"
 msgid "Todos"
 msgstr "Tâches"
diff --git a/locale/nl_NL.po b/locale/nl_NL.po
index d98d936..c17980d 100644
--- a/locale/nl_NL.po
+++ b/locale/nl_NL.po
@@ -2,261 +2,421 @@
 msgid ""
 msgstr "Content-Type: text/plain; charset=utf-8\n"
 
-msgctxt "error:calendar.todo:0"
+msgctxt "error:calendar.todo:"
 msgid "Recurrence can not be recurrent!"
 msgstr ""
 
-msgctxt "error:calendar.todo:0"
+msgctxt "error:calendar.todo:"
 msgid "UUID and recurrence must be unique in a calendar!"
 msgstr ""
 
-msgctxt "field:calendar.todo,alarms:0"
+msgctxt "field:calendar.todo,alarms:"
 msgid "Alarms"
 msgstr ""
 
-msgctxt "field:calendar.todo,attendees:0"
+msgctxt "field:calendar.todo,attendees:"
 msgid "Attendees"
 msgstr ""
 
-msgctxt "field:calendar.todo,calendar:0"
+msgctxt "field:calendar.todo,calendar:"
 msgid "Calendar"
 msgstr ""
 
-msgctxt "field:calendar.todo,calendar_owner:0"
+msgctxt "field:calendar.todo,calendar_owner:"
 msgid "Owner"
 msgstr ""
 
-msgctxt "field:calendar.todo,calendar_read_users:0"
+msgctxt "field:calendar.todo,calendar_read_users:"
 msgid "Read Users"
 msgstr ""
 
-msgctxt "field:calendar.todo,calendar_write_users:0"
+msgctxt "field:calendar.todo,calendar_write_users:"
 msgid "Write Users"
 msgstr ""
 
 #, fuzzy
-msgctxt "field:calendar.todo,categories:0"
+msgctxt "field:calendar.todo,categories:"
 msgid "Categories"
 msgstr "Categorieën"
 
-msgctxt "field:calendar.todo,classification:0"
+msgctxt "field:calendar.todo,classification:"
 msgid "Classification"
 msgstr ""
 
-msgctxt "field:calendar.todo,completed:0"
+msgctxt "field:calendar.todo,completed:"
 msgid "Completed"
 msgstr ""
 
+msgctxt "field:calendar.todo,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:calendar.todo,create_uid:"
+msgid "Create User"
+msgstr ""
+
 #, fuzzy
-msgctxt "field:calendar.todo,description:0"
+msgctxt "field:calendar.todo,description:"
 msgid "Description"
 msgstr "Specificatie"
 
 #, fuzzy
-msgctxt "field:calendar.todo,dtstart:0"
+msgctxt "field:calendar.todo,dtstart:"
 msgid "Start Date"
 msgstr "Start datum"
 
-msgctxt "field:calendar.todo,due:0"
+msgctxt "field:calendar.todo,due:"
 msgid "Due Date"
 msgstr ""
 
-msgctxt "field:calendar.todo,exdates:0"
+msgctxt "field:calendar.todo,exdates:"
 msgid "Exception Dates"
 msgstr ""
 
-msgctxt "field:calendar.todo,exrules:0"
+msgctxt "field:calendar.todo,exrules:"
 msgid "Exception Rules"
 msgstr ""
 
-msgctxt "field:calendar.todo,location:0"
+msgctxt "field:calendar.todo,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.todo,location:"
 msgid "Location"
 msgstr ""
 
-msgctxt "field:calendar.todo,occurences:0"
+msgctxt "field:calendar.todo,occurences:"
 msgid "Occurences"
 msgstr ""
 
-msgctxt "field:calendar.todo,organizer:0"
+msgctxt "field:calendar.todo,organizer:"
 msgid "Organizer"
 msgstr ""
 
 #, fuzzy
-msgctxt "field:calendar.todo,parent:0"
+msgctxt "field:calendar.todo,parent:"
 msgid "Parent"
 msgstr "Bovenliggend niveau"
 
-msgctxt "field:calendar.todo,percent_complete:0"
+msgctxt "field:calendar.todo,percent_complete:"
 msgid "Percent complete"
 msgstr ""
 
-msgctxt "field:calendar.todo,rdates:0"
+msgctxt "field:calendar.todo,rdates:"
 msgid "Recurrence Dates"
 msgstr ""
 
 #, fuzzy
-msgctxt "field:calendar.todo,rec_name:0"
+msgctxt "field:calendar.todo,rec_name:"
 msgid "Name"
 msgstr "Naam bijlage"
 
-msgctxt "field:calendar.todo,recurrence:0"
+msgctxt "field:calendar.todo,recurrence:"
 msgid "Recurrence"
 msgstr ""
 
-msgctxt "field:calendar.todo,rrules:0"
+msgctxt "field:calendar.todo,rrules:"
 msgid "Recurrence Rules"
 msgstr ""
 
 #, fuzzy
-msgctxt "field:calendar.todo,sequence:0"
+msgctxt "field:calendar.todo,sequence:"
 msgid "Sequence"
 msgstr "Reeks"
 
-msgctxt "field:calendar.todo,status:0"
+msgctxt "field:calendar.todo,status:"
 msgid "Status"
 msgstr ""
 
-msgctxt "field:calendar.todo,summary:0"
+msgctxt "field:calendar.todo,summary:"
 msgid "Summary"
 msgstr ""
 
-msgctxt "field:calendar.todo,timezone:0"
+msgctxt "field:calendar.todo,timezone:"
 msgid "Timezone"
 msgstr ""
 
-msgctxt "field:calendar.todo,uuid:0"
+msgctxt "field:calendar.todo,uuid:"
 msgid "UUID"
 msgstr ""
 
-msgctxt "field:calendar.todo,vtodo:0"
+msgctxt "field:calendar.todo,vtodo:"
 msgid "vtodo"
 msgstr ""
 
+msgctxt "field:calendar.todo,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.todo,write_uid:"
+msgid "Write User"
+msgstr ""
+
 #, fuzzy
-msgctxt "field:calendar.todo-calendar.category,category:0"
+msgctxt "field:calendar.todo-calendar.category,category:"
 msgid "Category"
 msgstr "Categorie"
 
+msgctxt "field:calendar.todo-calendar.category,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:calendar.todo-calendar.category,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:calendar.todo-calendar.category,id:"
+msgid "ID"
+msgstr ""
+
 #, fuzzy
-msgctxt "field:calendar.todo-calendar.category,rec_name:0"
+msgctxt "field:calendar.todo-calendar.category,rec_name:"
 msgid "Name"
 msgstr "Naam bijlage"
 
-msgctxt "field:calendar.todo-calendar.category,todo:0"
+msgctxt "field:calendar.todo-calendar.category,todo:"
 msgid "To-Do"
 msgstr ""
 
-msgctxt "field:calendar.todo.alarm,calendar_alarm:0"
+msgctxt "field:calendar.todo-calendar.category,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.todo-calendar.category,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.todo.alarm,calendar_alarm:"
 msgid "Calendar Alarm"
 msgstr ""
 
+msgctxt "field:calendar.todo.alarm,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:calendar.todo.alarm,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:calendar.todo.alarm,id:"
+msgid "ID"
+msgstr ""
+
 #, fuzzy
-msgctxt "field:calendar.todo.alarm,rec_name:0"
+msgctxt "field:calendar.todo.alarm,rec_name:"
 msgid "Name"
 msgstr "Naam bijlage"
 
-msgctxt "field:calendar.todo.alarm,todo:0"
+msgctxt "field:calendar.todo.alarm,todo:"
 msgid "Todo"
 msgstr ""
 
-msgctxt "field:calendar.todo.attendee,calendar_attendee:0"
+msgctxt "field:calendar.todo.alarm,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.todo.alarm,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.todo.attendee,calendar_attendee:"
 msgid "Calendar Attendee"
 msgstr ""
 
+msgctxt "field:calendar.todo.attendee,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:calendar.todo.attendee,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:calendar.todo.attendee,id:"
+msgid "ID"
+msgstr ""
+
 #, fuzzy
-msgctxt "field:calendar.todo.attendee,rec_name:0"
+msgctxt "field:calendar.todo.attendee,rec_name:"
 msgid "Name"
 msgstr "Naam bijlage"
 
-msgctxt "field:calendar.todo.attendee,todo:0"
+msgctxt "field:calendar.todo.attendee,todo:"
 msgid "Todo"
 msgstr ""
 
-msgctxt "field:calendar.todo.exdate,calendar_date:0"
+msgctxt "field:calendar.todo.attendee,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.todo.attendee,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.todo.exdate,calendar_date:"
 msgid "Calendar Date"
 msgstr ""
 
+msgctxt "field:calendar.todo.exdate,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:calendar.todo.exdate,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:calendar.todo.exdate,id:"
+msgid "ID"
+msgstr ""
+
 #, fuzzy
-msgctxt "field:calendar.todo.exdate,rec_name:0"
+msgctxt "field:calendar.todo.exdate,rec_name:"
 msgid "Name"
 msgstr "Naam bijlage"
 
-msgctxt "field:calendar.todo.exdate,todo:0"
+msgctxt "field:calendar.todo.exdate,todo:"
 msgid "Todo"
 msgstr ""
 
-msgctxt "field:calendar.todo.exrule,calendar_rrule:0"
+msgctxt "field:calendar.todo.exdate,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.todo.exdate,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.todo.exrule,calendar_rrule:"
 msgid "Calendar RRule"
 msgstr ""
 
+msgctxt "field:calendar.todo.exrule,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:calendar.todo.exrule,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:calendar.todo.exrule,id:"
+msgid "ID"
+msgstr ""
+
 #, fuzzy
-msgctxt "field:calendar.todo.exrule,rec_name:0"
+msgctxt "field:calendar.todo.exrule,rec_name:"
 msgid "Name"
 msgstr "Naam bijlage"
 
-msgctxt "field:calendar.todo.exrule,todo:0"
+msgctxt "field:calendar.todo.exrule,todo:"
 msgid "Todo"
 msgstr ""
 
-msgctxt "field:calendar.todo.rdate,calendar_date:0"
+msgctxt "field:calendar.todo.exrule,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.todo.exrule,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.todo.rdate,calendar_date:"
 msgid "Calendar Date"
 msgstr ""
 
+msgctxt "field:calendar.todo.rdate,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:calendar.todo.rdate,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:calendar.todo.rdate,id:"
+msgid "ID"
+msgstr ""
+
 #, fuzzy
-msgctxt "field:calendar.todo.rdate,rec_name:0"
+msgctxt "field:calendar.todo.rdate,rec_name:"
 msgid "Name"
 msgstr "Naam bijlage"
 
-msgctxt "field:calendar.todo.rdate,todo:0"
+msgctxt "field:calendar.todo.rdate,todo:"
 msgid "Todo"
 msgstr ""
 
-msgctxt "field:calendar.todo.rrule,calendar_rrule:0"
+msgctxt "field:calendar.todo.rdate,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.todo.rdate,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.todo.rrule,calendar_rrule:"
 msgid "Calendar RRule"
 msgstr ""
 
+msgctxt "field:calendar.todo.rrule,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:calendar.todo.rrule,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:calendar.todo.rrule,id:"
+msgid "ID"
+msgstr ""
+
 #, fuzzy
-msgctxt "field:calendar.todo.rrule,rec_name:0"
+msgctxt "field:calendar.todo.rrule,rec_name:"
 msgid "Name"
 msgstr "Naam bijlage"
 
-msgctxt "field:calendar.todo.rrule,todo:0"
+msgctxt "field:calendar.todo.rrule,todo:"
 msgid "Todo"
 msgstr ""
 
-msgctxt "help:calendar.todo,uuid:0"
+msgctxt "field:calendar.todo.rrule,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.todo.rrule,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "help:calendar.todo,uuid:"
 msgid "Universally Unique Identifier"
 msgstr ""
 
-msgctxt "model:calendar.todo,name:0"
+msgctxt "model:calendar.todo,name:"
 msgid "Todo"
 msgstr ""
 
-msgctxt "model:calendar.todo-calendar.category,name:0"
+msgctxt "model:calendar.todo-calendar.category,name:"
 msgid "Todo - Category"
 msgstr ""
 
-msgctxt "model:calendar.todo.alarm,name:0"
+msgctxt "model:calendar.todo.alarm,name:"
 msgid "Alarm"
 msgstr ""
 
-msgctxt "model:calendar.todo.attendee,name:0"
+msgctxt "model:calendar.todo.attendee,name:"
 msgid "Attendee"
 msgstr ""
 
-msgctxt "model:calendar.todo.exdate,name:0"
+msgctxt "model:calendar.todo.exdate,name:"
 msgid "Exception Date"
 msgstr ""
 
-msgctxt "model:calendar.todo.exrule,name:0"
+msgctxt "model:calendar.todo.exrule,name:"
 msgid "Exception Rule"
 msgstr ""
 
-msgctxt "model:calendar.todo.rdate,name:0"
+msgctxt "model:calendar.todo.rdate,name:"
 msgid "Todo Recurrence Date"
 msgstr ""
 
-msgctxt "model:calendar.todo.rrule,name:0"
+msgctxt "model:calendar.todo.rrule,name:"
 msgid "Recurrence Rule"
 msgstr ""
 
@@ -272,100 +432,100 @@ msgctxt "model:ir.ui.menu,name:menu_todo_form"
 msgid "Todos"
 msgstr ""
 
-msgctxt "selection:calendar.todo,classification:0"
+msgctxt "selection:calendar.todo,classification:"
 msgid "Confidential"
 msgstr ""
 
-msgctxt "selection:calendar.todo,classification:0"
+msgctxt "selection:calendar.todo,classification:"
 msgid "Private"
 msgstr ""
 
-msgctxt "selection:calendar.todo,classification:0"
+msgctxt "selection:calendar.todo,classification:"
 msgid "Public"
 msgstr ""
 
-msgctxt "selection:calendar.todo,status:0"
+msgctxt "selection:calendar.todo,status:"
 msgid ""
 msgstr ""
 
-msgctxt "selection:calendar.todo,status:0"
+msgctxt "selection:calendar.todo,status:"
 msgid "Cancelled"
 msgstr ""
 
-msgctxt "selection:calendar.todo,status:0"
+msgctxt "selection:calendar.todo,status:"
 msgid "Completed"
 msgstr ""
 
-msgctxt "selection:calendar.todo,status:0"
+msgctxt "selection:calendar.todo,status:"
 msgid "In-Process"
 msgstr ""
 
-msgctxt "selection:calendar.todo,status:0"
+msgctxt "selection:calendar.todo,status:"
 msgid "Needs-Action"
 msgstr ""
 
-msgctxt "view:calendar.todo.attendee:0"
+msgctxt "view:calendar.todo.attendee:"
 msgid "Attendee"
 msgstr ""
 
-msgctxt "view:calendar.todo.attendee:0"
+msgctxt "view:calendar.todo.attendee:"
 msgid "Attendees"
 msgstr ""
 
-msgctxt "view:calendar.todo.exdate:0"
+msgctxt "view:calendar.todo.exdate:"
 msgid "Exception Date"
 msgstr ""
 
-msgctxt "view:calendar.todo.exdate:0"
+msgctxt "view:calendar.todo.exdate:"
 msgid "Exception Dates"
 msgstr ""
 
-msgctxt "view:calendar.todo.exrule:0"
+msgctxt "view:calendar.todo.exrule:"
 msgid "Exception Rule"
 msgstr ""
 
-msgctxt "view:calendar.todo.exrule:0"
+msgctxt "view:calendar.todo.exrule:"
 msgid "Exception Rules"
 msgstr ""
 
-msgctxt "view:calendar.todo.rdate:0"
+msgctxt "view:calendar.todo.rdate:"
 msgid "Recurrence Date"
 msgstr ""
 
-msgctxt "view:calendar.todo.rdate:0"
+msgctxt "view:calendar.todo.rdate:"
 msgid "Recurrence Dates"
 msgstr ""
 
-msgctxt "view:calendar.todo.rrule:0"
+msgctxt "view:calendar.todo.rrule:"
 msgid "Recurrence Rule"
 msgstr ""
 
-msgctxt "view:calendar.todo.rrule:0"
+msgctxt "view:calendar.todo.rrule:"
 msgid "Recurrence Rules"
 msgstr ""
 
-msgctxt "view:calendar.todo:0"
+msgctxt "view:calendar.todo:"
 msgid "Attendees"
 msgstr ""
 
 #, fuzzy
-msgctxt "view:calendar.todo:0"
+msgctxt "view:calendar.todo:"
 msgid "Categories"
 msgstr "Categorieën"
 
 #, fuzzy
-msgctxt "view:calendar.todo:0"
+msgctxt "view:calendar.todo:"
 msgid "General"
 msgstr "Algemeen"
 
-msgctxt "view:calendar.todo:0"
+msgctxt "view:calendar.todo:"
 msgid "Occurences"
 msgstr ""
 
-msgctxt "view:calendar.todo:0"
+msgctxt "view:calendar.todo:"
 msgid "Todo"
 msgstr ""
 
-msgctxt "view:calendar.todo:0"
+msgctxt "view:calendar.todo:"
 msgid "Todos"
 msgstr ""
diff --git a/locale/ru_RU.po b/locale/ru_RU.po
index ca4dbea..54e0693 100644
--- a/locale/ru_RU.po
+++ b/locale/ru_RU.po
@@ -2,247 +2,407 @@
 msgid ""
 msgstr "Content-Type: text/plain; charset=utf-8\n"
 
-msgctxt "error:calendar.todo:0"
+msgctxt "error:calendar.todo:"
 msgid "Recurrence can not be recurrent!"
 msgstr ""
 
-msgctxt "error:calendar.todo:0"
+msgctxt "error:calendar.todo:"
 msgid "UUID and recurrence must be unique in a calendar!"
 msgstr ""
 
-msgctxt "field:calendar.todo,alarms:0"
+msgctxt "field:calendar.todo,alarms:"
 msgid "Alarms"
 msgstr "Вызов"
 
-msgctxt "field:calendar.todo,attendees:0"
+msgctxt "field:calendar.todo,attendees:"
 msgid "Attendees"
 msgstr "Участники"
 
-msgctxt "field:calendar.todo,calendar:0"
+msgctxt "field:calendar.todo,calendar:"
 msgid "Calendar"
 msgstr "Календарь"
 
-msgctxt "field:calendar.todo,calendar_owner:0"
+msgctxt "field:calendar.todo,calendar_owner:"
 msgid "Owner"
 msgstr "Владелец"
 
-msgctxt "field:calendar.todo,calendar_read_users:0"
+msgctxt "field:calendar.todo,calendar_read_users:"
 msgid "Read Users"
 msgstr "Пользователи могут читать"
 
-msgctxt "field:calendar.todo,calendar_write_users:0"
+msgctxt "field:calendar.todo,calendar_write_users:"
 msgid "Write Users"
 msgstr "Пользователи могут писать"
 
-msgctxt "field:calendar.todo,categories:0"
+msgctxt "field:calendar.todo,categories:"
 msgid "Categories"
 msgstr "Категория"
 
-msgctxt "field:calendar.todo,classification:0"
+msgctxt "field:calendar.todo,classification:"
 msgid "Classification"
 msgstr "Классификация"
 
-msgctxt "field:calendar.todo,completed:0"
+msgctxt "field:calendar.todo,completed:"
 msgid "Completed"
 msgstr "Выполнен"
 
-msgctxt "field:calendar.todo,description:0"
+msgctxt "field:calendar.todo,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:calendar.todo,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:calendar.todo,description:"
 msgid "Description"
 msgstr "Описание"
 
-msgctxt "field:calendar.todo,dtstart:0"
+msgctxt "field:calendar.todo,dtstart:"
 msgid "Start Date"
 msgstr "Дата начала"
 
-msgctxt "field:calendar.todo,due:0"
+msgctxt "field:calendar.todo,due:"
 msgid "Due Date"
 msgstr "Срок сдачи"
 
-msgctxt "field:calendar.todo,exdates:0"
+msgctxt "field:calendar.todo,exdates:"
 msgid "Exception Dates"
 msgstr "Дата исключения"
 
-msgctxt "field:calendar.todo,exrules:0"
+msgctxt "field:calendar.todo,exrules:"
 msgid "Exception Rules"
 msgstr "Правила исключения"
 
-msgctxt "field:calendar.todo,location:0"
+msgctxt "field:calendar.todo,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.todo,location:"
 msgid "Location"
 msgstr "Местоположение"
 
-msgctxt "field:calendar.todo,occurences:0"
+msgctxt "field:calendar.todo,occurences:"
 msgid "Occurences"
 msgstr "Дополнительные задачи"
 
-msgctxt "field:calendar.todo,organizer:0"
+msgctxt "field:calendar.todo,organizer:"
 msgid "Organizer"
 msgstr "Организатор"
 
-msgctxt "field:calendar.todo,parent:0"
+msgctxt "field:calendar.todo,parent:"
 msgid "Parent"
 msgstr "Основной"
 
-msgctxt "field:calendar.todo,percent_complete:0"
+msgctxt "field:calendar.todo,percent_complete:"
 msgid "Percent complete"
 msgstr "Процент выполнения"
 
-msgctxt "field:calendar.todo,rdates:0"
+msgctxt "field:calendar.todo,rdates:"
 msgid "Recurrence Dates"
 msgstr "Даты повторения"
 
-msgctxt "field:calendar.todo,rec_name:0"
+msgctxt "field:calendar.todo,rec_name:"
 msgid "Name"
 msgstr "Наименование"
 
-msgctxt "field:calendar.todo,recurrence:0"
+msgctxt "field:calendar.todo,recurrence:"
 msgid "Recurrence"
 msgstr "Повторение"
 
-msgctxt "field:calendar.todo,rrules:0"
+msgctxt "field:calendar.todo,rrules:"
 msgid "Recurrence Rules"
 msgstr "Правила повторения"
 
-msgctxt "field:calendar.todo,sequence:0"
+msgctxt "field:calendar.todo,sequence:"
 msgid "Sequence"
 msgstr "Последовательность"
 
-msgctxt "field:calendar.todo,status:0"
+msgctxt "field:calendar.todo,status:"
 msgid "Status"
 msgstr "Состояние"
 
-msgctxt "field:calendar.todo,summary:0"
+msgctxt "field:calendar.todo,summary:"
 msgid "Summary"
 msgstr "Резюме"
 
-msgctxt "field:calendar.todo,timezone:0"
+msgctxt "field:calendar.todo,timezone:"
 msgid "Timezone"
 msgstr "Зона времени"
 
-msgctxt "field:calendar.todo,uuid:0"
+msgctxt "field:calendar.todo,uuid:"
 msgid "UUID"
 msgstr ""
 
-msgctxt "field:calendar.todo,vtodo:0"
+msgctxt "field:calendar.todo,vtodo:"
 msgid "vtodo"
 msgstr ""
 
-msgctxt "field:calendar.todo-calendar.category,category:0"
+msgctxt "field:calendar.todo,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.todo,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.todo-calendar.category,category:"
 msgid "Category"
 msgstr "Категории"
 
-msgctxt "field:calendar.todo-calendar.category,rec_name:0"
+msgctxt "field:calendar.todo-calendar.category,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:calendar.todo-calendar.category,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:calendar.todo-calendar.category,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.todo-calendar.category,rec_name:"
 msgid "Name"
 msgstr "Наименование"
 
-msgctxt "field:calendar.todo-calendar.category,todo:0"
+msgctxt "field:calendar.todo-calendar.category,todo:"
 msgid "To-Do"
 msgstr "Дела"
 
-msgctxt "field:calendar.todo.alarm,calendar_alarm:0"
+msgctxt "field:calendar.todo-calendar.category,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.todo-calendar.category,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.todo.alarm,calendar_alarm:"
 msgid "Calendar Alarm"
 msgstr "Сигнала календаря"
 
-msgctxt "field:calendar.todo.alarm,rec_name:0"
+msgctxt "field:calendar.todo.alarm,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:calendar.todo.alarm,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:calendar.todo.alarm,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.todo.alarm,rec_name:"
 msgid "Name"
 msgstr "Наименование"
 
-msgctxt "field:calendar.todo.alarm,todo:0"
+msgctxt "field:calendar.todo.alarm,todo:"
 msgid "Todo"
 msgstr "Дело"
 
-msgctxt "field:calendar.todo.attendee,calendar_attendee:0"
+msgctxt "field:calendar.todo.alarm,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.todo.alarm,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.todo.attendee,calendar_attendee:"
 msgid "Calendar Attendee"
 msgstr "Календарь участников"
 
-msgctxt "field:calendar.todo.attendee,rec_name:0"
+msgctxt "field:calendar.todo.attendee,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:calendar.todo.attendee,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:calendar.todo.attendee,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.todo.attendee,rec_name:"
 msgid "Name"
 msgstr "Наименование"
 
-msgctxt "field:calendar.todo.attendee,todo:0"
+msgctxt "field:calendar.todo.attendee,todo:"
 msgid "Todo"
 msgstr "Дело"
 
-msgctxt "field:calendar.todo.exdate,calendar_date:0"
+msgctxt "field:calendar.todo.attendee,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.todo.attendee,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.todo.exdate,calendar_date:"
 msgid "Calendar Date"
 msgstr "День календаря"
 
-msgctxt "field:calendar.todo.exdate,rec_name:0"
+msgctxt "field:calendar.todo.exdate,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:calendar.todo.exdate,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:calendar.todo.exdate,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.todo.exdate,rec_name:"
 msgid "Name"
 msgstr "Наименование"
 
-msgctxt "field:calendar.todo.exdate,todo:0"
+msgctxt "field:calendar.todo.exdate,todo:"
 msgid "Todo"
 msgstr "Дело"
 
-msgctxt "field:calendar.todo.exrule,calendar_rrule:0"
+msgctxt "field:calendar.todo.exdate,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.todo.exdate,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.todo.exrule,calendar_rrule:"
 msgid "Calendar RRule"
 msgstr "Правила календаря"
 
-msgctxt "field:calendar.todo.exrule,rec_name:0"
+msgctxt "field:calendar.todo.exrule,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:calendar.todo.exrule,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:calendar.todo.exrule,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.todo.exrule,rec_name:"
 msgid "Name"
 msgstr "Наименование"
 
-msgctxt "field:calendar.todo.exrule,todo:0"
+msgctxt "field:calendar.todo.exrule,todo:"
 msgid "Todo"
 msgstr "Дело"
 
-msgctxt "field:calendar.todo.rdate,calendar_date:0"
+msgctxt "field:calendar.todo.exrule,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.todo.exrule,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.todo.rdate,calendar_date:"
 msgid "Calendar Date"
 msgstr "День календаря"
 
-msgctxt "field:calendar.todo.rdate,rec_name:0"
+msgctxt "field:calendar.todo.rdate,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:calendar.todo.rdate,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:calendar.todo.rdate,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.todo.rdate,rec_name:"
 msgid "Name"
 msgstr "Наименование"
 
-msgctxt "field:calendar.todo.rdate,todo:0"
+msgctxt "field:calendar.todo.rdate,todo:"
 msgid "Todo"
 msgstr "Дело"
 
-msgctxt "field:calendar.todo.rrule,calendar_rrule:0"
+msgctxt "field:calendar.todo.rdate,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.todo.rdate,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "field:calendar.todo.rrule,calendar_rrule:"
 msgid "Calendar RRule"
 msgstr "Правила календаря"
 
-msgctxt "field:calendar.todo.rrule,rec_name:0"
+msgctxt "field:calendar.todo.rrule,create_date:"
+msgid "Create Date"
+msgstr ""
+
+msgctxt "field:calendar.todo.rrule,create_uid:"
+msgid "Create User"
+msgstr ""
+
+msgctxt "field:calendar.todo.rrule,id:"
+msgid "ID"
+msgstr ""
+
+msgctxt "field:calendar.todo.rrule,rec_name:"
 msgid "Name"
 msgstr "Наименование"
 
-msgctxt "field:calendar.todo.rrule,todo:0"
+msgctxt "field:calendar.todo.rrule,todo:"
 msgid "Todo"
 msgstr "Дело"
 
-msgctxt "help:calendar.todo,uuid:0"
+msgctxt "field:calendar.todo.rrule,write_date:"
+msgid "Write Date"
+msgstr ""
+
+msgctxt "field:calendar.todo.rrule,write_uid:"
+msgid "Write User"
+msgstr ""
+
+msgctxt "help:calendar.todo,uuid:"
 msgid "Universally Unique Identifier"
 msgstr "Универсальный уникальный идентификатор"
 
-msgctxt "model:calendar.todo,name:0"
+msgctxt "model:calendar.todo,name:"
 msgid "Todo"
 msgstr "Дело"
 
-msgctxt "model:calendar.todo-calendar.category,name:0"
+msgctxt "model:calendar.todo-calendar.category,name:"
 msgid "Todo - Category"
 msgstr "Категории - Дел"
 
-msgctxt "model:calendar.todo.alarm,name:0"
+msgctxt "model:calendar.todo.alarm,name:"
 msgid "Alarm"
 msgstr "Вызов"
 
-msgctxt "model:calendar.todo.attendee,name:0"
+msgctxt "model:calendar.todo.attendee,name:"
 msgid "Attendee"
 msgstr "Участник"
 
-msgctxt "model:calendar.todo.exdate,name:0"
+msgctxt "model:calendar.todo.exdate,name:"
 msgid "Exception Date"
 msgstr "Дата исключения"
 
-msgctxt "model:calendar.todo.exrule,name:0"
+msgctxt "model:calendar.todo.exrule,name:"
 msgid "Exception Rule"
 msgstr "Правило исключения"
 
-msgctxt "model:calendar.todo.rdate,name:0"
+msgctxt "model:calendar.todo.rdate,name:"
 msgid "Todo Recurrence Date"
 msgstr "Дела повторяющиеся по дате"
 
-msgctxt "model:calendar.todo.rrule,name:0"
+msgctxt "model:calendar.todo.rrule,name:"
 msgid "Recurrence Rule"
 msgstr "Правила повторения"
 
@@ -260,99 +420,98 @@ msgctxt "model:ir.ui.menu,name:menu_todo_form"
 msgid "Todos"
 msgstr "Задачи"
 
-msgctxt "selection:calendar.todo,classification:0"
+msgctxt "selection:calendar.todo,classification:"
 msgid "Confidential"
 msgstr "Конфиденциальное"
 
-msgctxt "selection:calendar.todo,classification:0"
+msgctxt "selection:calendar.todo,classification:"
 msgid "Private"
 msgstr "Личное"
 
-msgctxt "selection:calendar.todo,classification:0"
+msgctxt "selection:calendar.todo,classification:"
 msgid "Public"
 msgstr "Публичное"
 
-#, fuzzy
-msgctxt "selection:calendar.todo,status:0"
+msgctxt "selection:calendar.todo,status:"
 msgid ""
-msgstr "Резервный счет"
+msgstr ""
 
-msgctxt "selection:calendar.todo,status:0"
+msgctxt "selection:calendar.todo,status:"
 msgid "Cancelled"
 msgstr "Отмененно"
 
-msgctxt "selection:calendar.todo,status:0"
+msgctxt "selection:calendar.todo,status:"
 msgid "Completed"
 msgstr "Выполнен"
 
-msgctxt "selection:calendar.todo,status:0"
+msgctxt "selection:calendar.todo,status:"
 msgid "In-Process"
 msgstr "В процессе"
 
-msgctxt "selection:calendar.todo,status:0"
+msgctxt "selection:calendar.todo,status:"
 msgid "Needs-Action"
 msgstr "Требуется действие"
 
-msgctxt "view:calendar.todo.attendee:0"
+msgctxt "view:calendar.todo.attendee:"
 msgid "Attendee"
 msgstr "Участник"
 
-msgctxt "view:calendar.todo.attendee:0"
+msgctxt "view:calendar.todo.attendee:"
 msgid "Attendees"
 msgstr "Участники"
 
-msgctxt "view:calendar.todo.exdate:0"
+msgctxt "view:calendar.todo.exdate:"
 msgid "Exception Date"
 msgstr "Дата исключения"
 
-msgctxt "view:calendar.todo.exdate:0"
+msgctxt "view:calendar.todo.exdate:"
 msgid "Exception Dates"
 msgstr "Дата исключения"
 
-msgctxt "view:calendar.todo.exrule:0"
+msgctxt "view:calendar.todo.exrule:"
 msgid "Exception Rule"
 msgstr "Правило исключения"
 
-msgctxt "view:calendar.todo.exrule:0"
+msgctxt "view:calendar.todo.exrule:"
 msgid "Exception Rules"
 msgstr "Правила исключения"
 
-msgctxt "view:calendar.todo.rdate:0"
+msgctxt "view:calendar.todo.rdate:"
 msgid "Recurrence Date"
 msgstr "Даты повторения"
 
-msgctxt "view:calendar.todo.rdate:0"
+msgctxt "view:calendar.todo.rdate:"
 msgid "Recurrence Dates"
 msgstr "Даты повторения"
 
-msgctxt "view:calendar.todo.rrule:0"
+msgctxt "view:calendar.todo.rrule:"
 msgid "Recurrence Rule"
 msgstr "Правила повторения"
 
-msgctxt "view:calendar.todo.rrule:0"
+msgctxt "view:calendar.todo.rrule:"
 msgid "Recurrence Rules"
 msgstr "Правила повторения"
 
-msgctxt "view:calendar.todo:0"
+msgctxt "view:calendar.todo:"
 msgid "Attendees"
 msgstr "Участники"
 
-msgctxt "view:calendar.todo:0"
+msgctxt "view:calendar.todo:"
 msgid "Categories"
 msgstr "Категория"
 
-msgctxt "view:calendar.todo:0"
+msgctxt "view:calendar.todo:"
 msgid "General"
 msgstr "Основной"
 
-msgctxt "view:calendar.todo:0"
+msgctxt "view:calendar.todo:"
 msgid "Occurences"
 msgstr "Повторение"
 
-msgctxt "view:calendar.todo:0"
+msgctxt "view:calendar.todo:"
 msgid "Todo"
 msgstr "Дело"
 
-msgctxt "view:calendar.todo:0"
+msgctxt "view:calendar.todo:"
 msgid "Todos"
 msgstr "Дела"
diff --git a/setup.py b/setup.py
index 65d89f1..baef0a5 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 4dad3ab..62e4f36 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_todo import suite
+from .test_calendar_todo import suite
diff --git a/tests/test_calendar_todo.py b/tests/test_calendar_todo.py
index de92dd8..e5f93d6 100644
--- a/tests/test_calendar_todo.py
+++ b/tests/test_calendar_todo.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 CalendarTodoTestCase(unittest.TestCase):
         '''
         test_depends()
 
+
 def suite():
     suite = trytond.tests.test_tryton.suite()
     suite.addTests(unittest.TestLoader().loadTestsFromTestCase(
diff --git a/todo.py b/todo.py
index 6226af9..86250b6 100644
--- a/todo.py
+++ b/todo.py
@@ -26,7 +26,7 @@ class Todo(ModelSQL, ModelView):
     _rec_name = 'uuid'
 
     calendar = fields.Many2One('calendar.calendar', 'Calendar',
-            required=True, select=1, ondelete="CASCADE")
+            required=True, select=True, ondelete="CASCADE")
     alarms = fields.One2Many('calendar.todo.alarm', 'todo', 'Alarms')
     classification = fields.Selection([
         ('public', 'Public'),
@@ -38,7 +38,7 @@ class Todo(ModelSQL, ModelView):
             'readonly': Eval('status') != 'completed',
             }, depends=['status'])
     description = fields.Text('Description')
-    dtstart = fields.DateTime('Start Date', select=1)
+    dtstart = fields.DateTime('Start Date', select=True)
     location = fields.Many2One('calendar.location', 'Location')
     organizer = fields.Char('Organizer', states={
             'required': If(Bool(Eval('attendees')),
@@ -46,7 +46,7 @@ class Todo(ModelSQL, ModelView):
             }, depends=['attendees', 'parent'])
     attendees = fields.One2Many('calendar.todo.attendee', 'todo',
             'Attendees')
-    percent_complete = fields.Integer('Percent complete',
+    percent_complete = fields.Integer('Percent complete', required=True,
         states={
             'readonly': ~Eval('status').in_(['needs-action', 'in-process']),
             }, depends=['status'])
@@ -58,15 +58,15 @@ class Todo(ModelSQL, ModelView):
             states={
                 'invisible': Bool(Eval('parent')),
             }, depends=['uuid', 'calendar', 'parent'])
-    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'])
-    sequence = fields.Integer('Sequence')
+    sequence = fields.Integer('Sequence', required=True)
     parent = fields.Many2One('calendar.todo', 'Parent',
             domain=[
                 ('uuid', '=', Eval('uuid')),
-                ('parent', '=', False),
+                ('parent', '=', None),
                 ('calendar', '=', Eval('calendar'))
             ],
             ondelete='CASCADE', depends=['uuid', 'calendar'])
@@ -80,17 +80,19 @@ class Todo(ModelSQL, ModelView):
         ], 'Status', on_change=['status', 'completed', 'percent_complete'])
     summary = fields.Char('Summary')
     uuid = fields.Char('UUID', required=True,
-            help='Universally Unique Identifier', select=1)
-    due = fields.DateTime('Due Date', select=1)
+            help='Universally Unique Identifier', select=True)
+    due = fields.DateTime('Due Date', select=True)
     categories = fields.Many2Many('calendar.todo-calendar.category',
             'todo', 'category', 'Categories')
-    exdates = fields.One2Many('calendar.todo.exdate', 'todo', 'Exception Dates',
-            states={
-                'invisible': Bool(Eval('parent')),
+    exdates = fields.One2Many('calendar.todo.exdate', 'todo',
+        'Exception Dates',
+        states={
+            'invisible': Bool(Eval('parent')),
             }, depends=['parent'])
-    exrules = fields.One2Many('calendar.todo.exrule', 'todo', 'Exception Rules',
-            states={
-                'invisible': Bool(Eval('parent')),
+    exrules = fields.One2Many('calendar.todo.exrule', 'todo',
+        'Exception Rules',
+        states={
+            'invisible': Bool(Eval('parent')),
             }, depends=['parent'])
     rdates = fields.One2Many('calendar.todo.rdate', 'todo', 'Recurrence Dates',
             states={
@@ -111,8 +113,9 @@ class Todo(ModelSQL, ModelView):
     def __init__(self):
         super(Todo, self).__init__()
         self._sql_constraints = [
+            #XXX should be unique across all componenets
             ('uuid_recurrence_uniq', 'UNIQUE(uuid, calendar, recurrence)',
-                'UUID and recurrence must be unique in a calendar!'), #XXX should be unique across all componenets
+                'UUID and recurrence must be unique in a calendar!'),
         ]
         self._constraints += [
             ('check_recurrence', 'invalid_recurrence'),
@@ -129,7 +132,7 @@ class Todo(ModelSQL, ModelView):
             model_data_ids = model_data_obj.search([
                 ('fs_id', '=', 'rule_group_read_todo_line3'),
                 ('module', '=', module_name),
-                ('inherit', '=', False),
+                ('inherit', '=', None),
                 ], limit=1)
             if model_data_ids:
                 model_data = model_data_obj.browse(model_data_ids[0])
@@ -150,6 +153,9 @@ class Todo(ModelSQL, ModelView):
         user = user_obj.browse(Transaction().user)
         return user.timezone
 
+    def default_percent_complete(self):
+        return 0
+
     def on_change_status(self, vals):
         res = {}
         if 'status' not in vals:
@@ -200,10 +206,11 @@ class Todo(ModelSQL, ModelView):
 
         res = super(Todo, self).create(values)
         todo = self.browse(res)
-        if todo.calendar.owner \
-                and (todo.organizer == todo.calendar.owner.email \
-                or (todo.parent \
-                and todo.parent.organizer == todo.parent.calendar.owner.email)):
+        if (todo.calendar.owner
+                and (todo.organizer == todo.calendar.owner.email
+                    or (todo.parent
+                        and todo.parent.organizer == \
+                            todo.parent.calendar.owner.email))):
             if todo.organizer == todo.calendar.owner.email:
                 attendee_emails = [x.email for x in todo.attendees
                         if x.status != 'declined'
@@ -221,7 +228,7 @@ class Todo(ModelSQL, ModelView):
                         for calendar_id in calendar_ids:
                             new_id = self.copy(todo.id, default={
                                 'calendar': calendar_id,
-                                'occurences': False,
+                                'occurences': None,
                                 })
                             for occurence in todo.occurences:
                                 self.copy(occurence.id, default={
@@ -233,7 +240,7 @@ class Todo(ModelSQL, ModelView):
                             ('uuid', '=', todo.uuid),
                             ('calendar.owner.email', 'in', attendee_emails),
                             ('id', '!=', todo.id),
-                            ('recurrence', '=', False),
+                            ('recurrence', '=', None),
                             ])
                         for parent in self.browse(parent_ids):
                             self.copy(todo.id, default={
@@ -319,7 +326,7 @@ class Todo(ModelSQL, ModelView):
                             ('uuid', '=', todo.uuid),
                             ('calendar.owner.email', 'in', attendee_emails),
                             ('id', '!=', todo.id),
-                            ('recurrence', '=', todo.recurrence or False),
+                            ('recurrence', '=', todo.recurrence),
                             ])
                     for todo2 in self.browse(todo_ids):
                         if todo2.calendar.owner.email in attendee_emails:
@@ -335,7 +342,7 @@ class Todo(ModelSQL, ModelView):
                             for calendar_id in calendar_ids:
                                 new_id = self.copy(todo.id, default={
                                     'calendar': calendar_id,
-                                    'occurences': False,
+                                    'occurences': None,
                                     })
                                 for occurence in todo.occurences:
                                     self.copy(occurence.id, default={
@@ -344,11 +351,12 @@ class Todo(ModelSQL, ModelView):
                                         })
                         else:
                             parent_ids = self.search([
-                                ('uuid', '=', todo.uuid),
-                                ('calendar.owner.email', 'in', attendee_emails),
-                                ('id', '!=', todo.id),
-                                ('recurrence', '=', False),
-                                ])
+                                    ('uuid', '=', todo.uuid),
+                                    ('calendar.owner.email', 'in',
+                                        attendee_emails),
+                                    ('id', '!=', todo.id),
+                                    ('recurrence', '=', None),
+                                    ])
                             for parent in self.browse(parent_ids):
                                 self.copy(todo.id, default={
                                     'calendar': parent.calendar.id,
@@ -381,7 +389,7 @@ class Todo(ModelSQL, ModelView):
                             ('uuid', '=', todo.uuid),
                             ('calendar.owner.email', 'in', attendee_emails),
                             ('id', '!=', todo.id),
-                            ('recurrence', '=', todo.recurrence or False),
+                            ('recurrence', '=', todo.recurrence),
                             ])
                         self.delete(todo_ids)
             elif todo.organizer \
@@ -395,7 +403,7 @@ class Todo(ModelSQL, ModelView):
                         ('uuid', '=', todo.uuid),
                         ('calendar.owner.email', '=', organizer),
                         ('id', '!=', todo.id),
-                        ('recurrence', '=', todo.recurrence or False),
+                        ('recurrence', '=', todo.recurrence),
                         ], limit=1)
                     if todo_ids:
                         todo2 = self.browse(todo_ids[0])
@@ -422,7 +430,6 @@ class Todo(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.todo.alarm')
         attendee_obj = pool.get('calendar.todo.attendee')
         rdate_obj = pool.get('calendar.todo.rdate')
@@ -451,23 +458,24 @@ class Todo(ModelSQL, ModelView):
         if hasattr(vtodo, 'summary'):
             res['summary'] = vtodo.summary.value
         else:
-            res['summary'] = False
+            res['summary'] = None
         if hasattr(vtodo, 'description'):
             res['description'] = vtodo.description.value
         else:
-            res['description'] = False
+            res['description'] = None
         if hasattr(vtodo, 'percent_complete'):
             res['percent_complete'] = int(vtodo.percent_complete.value)
         else:
-            res['percent_complete'] = False
+            res['percent_complete'] = None
 
         if hasattr(vtodo, 'completed'):
             if not isinstance(vtodo.completed.value, datetime.datetime):
-                res['completed'] = datetime.datetime.combine(vtodo.completed.value,
-                        datetime.time())
+                res['completed'] = datetime.datetime.combine(
+                    vtodo.completed.value, datetime.time())
             else:
                 if vtodo.completed.value.tzinfo:
-                    res['completed'] = vtodo.completed.value.astimezone(tzlocal)
+                    res['completed'] = vtodo.completed.value.astimezone(
+                        tzlocal)
                 else:
                     res['completed'] = vtodo.completed.value
 
@@ -502,7 +510,7 @@ class Todo(ModelSQL, ModelView):
                 else:
                     res['recurrence'] = vtodo.recurrence_id.value
         else:
-            res['recurrence'] = False
+            res['recurrence'] = None
         if hasattr(vtodo, 'status'):
             res['status'] = vtodo.status.value.lower()
         else:
@@ -543,7 +551,7 @@ class Todo(ModelSQL, ModelView):
                 location_id = location_ids[0]
             res['location'] = location_id
         else:
-            res['location'] = False
+            res['location'] = None
 
         res['calendar'] = calendar_id
 
@@ -553,7 +561,7 @@ class Todo(ModelSQL, ModelView):
             else:
                 res['organizer'] = vtodo.organizer.value
         else:
-            res['organizer'] = False
+            res['organizer'] = None
 
         attendees_todel = {}
         if todo:
@@ -733,17 +741,18 @@ class Todo(ModelSQL, ModelView):
         elif hasattr(vtodo, 'due'):
             del vtodo.due
 
-
         if not hasattr(vtodo, 'created'):
             vtodo.add('created')
-        vtodo.created.value = todo.create_date.replace(tzinfo=tzlocal).astimezone(tztodo)
+        vtodo.created.value = todo.create_date.replace(
+            tzinfo=tzlocal).astimezone(tztodo)
         if not hasattr(vtodo, 'dtstamp'):
             vtodo.add('dtstamp')
         date = todo.write_date or todo.create_date
         vtodo.dtstamp.value = date.replace(tzinfo=tzlocal).astimezone(tztodo)
         if not hasattr(vtodo, 'last-modified'):
             vtodo.add('last-modified')
-        vtodo.last_modified.value = date.replace(tzinfo=tzlocal).astimezone(tztodo)
+        vtodo.last_modified.value = date.replace(
+            tzinfo=tzlocal).astimezone(tztodo)
         if todo.recurrence and todo.parent:
             if not hasattr(vtodo, 'recurrence-id'):
                 vtodo.add('recurrence-id')
@@ -791,7 +800,8 @@ class Todo(ModelSQL, ModelView):
 
         vtodo.attendee_list = []
         for attendee in todo.attendees:
-            vtodo.attendee_list.append(attendee_obj.attendee2attendee(attendee))
+            vtodo.attendee_list.append(
+                attendee_obj.attendee2attendee(attendee))
 
         if todo.rdates:
             vtodo.add('rdate')
@@ -833,9 +843,9 @@ class TodoCategory(ModelSQL):
     _name = 'calendar.todo-calendar.category'
 
     todo = fields.Many2One('calendar.todo', 'To-Do', 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)
 
 TodoCategory()
 
@@ -848,9 +858,9 @@ class TodoRDate(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)
     todo = fields.Many2One('calendar.todo', 'Todo', ondelete='CASCADE',
-            select=1, required=True)
+            select=True, required=True)
 
     def init(self, module_name):
         cursor = Transaction().cursor
@@ -920,9 +930,9 @@ class TodoRRule(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)
     todo = fields.Many2One('calendar.todo', 'Todo', ondelete='CASCADE',
-            select=1, required=True)
+            select=True, required=True)
 
     def create(self, values):
         todo_obj = Pool().get('calendar.todo')
@@ -997,9 +1007,9 @@ class TodoAttendee(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)
     todo = fields.Many2One('calendar.todo', 'Todo', ondelete='CASCADE',
-            required=True, select=1)
+            required=True, select=True)
 
     def create(self, values):
         todo_obj = Pool().get('calendar.todo')
@@ -1010,10 +1020,11 @@ class TodoAttendee(ModelSQL, ModelView):
         res = super(TodoAttendee, self).create(values)
         attendee = self.browse(res)
         todo = attendee.todo
-        if todo.calendar.owner \
-                and (todo.organizer == todo.calendar.owner.email \
-                or (todo.parent \
-                and todo.parent.organizer == todo.parent.calendar.owner.email)):
+        if (todo.calendar.owner
+                and (todo.organizer == todo.calendar.owner.email
+                    or (todo.parent
+                        and todo.parent.organizer == \
+                            todo.parent.calendar.owner.email))):
             if todo.organizer == todo.calendar.owner.email:
                 attendee_emails = [x.email for x in todo.attendees
                         if x.email != todo.organizer]
@@ -1026,7 +1037,7 @@ class TodoAttendee(ModelSQL, ModelView):
                         ('uuid', '=', todo.uuid),
                         ('calendar.owner.email', 'in', attendee_emails),
                         ('id', '!=', todo.id),
-                        ('recurrence', '=', todo.recurrence or False),
+                        ('recurrence', '=', todo.recurrence),
                         ])
                     for todo_id in todo_ids:
                         self.copy(res, default={
@@ -1071,7 +1082,7 @@ class TodoAttendee(ModelSQL, ModelView):
                             ('todo.calendar.owner.email', 'in',
                                     attendee_emails),
                             ('id', '!=', attendee.id),
-                            ('todo.recurrence', '=', todo.recurrence or False),
+                            ('todo.recurrence', '=', todo.recurrence),
                             ('email', '=', attendee.email),
                             ])
                         self.write(attendee_ids, self._attendee2update(
@@ -1111,7 +1122,7 @@ class TodoAttendee(ModelSQL, ModelView):
                             ('todo.calendar.owner.email', 'in',
                                 attendee_emails),
                             ('id', '!=', attendee.id),
-                            ('todo.recurrence', '=', todo.recurrence or False),
+                            ('todo.recurrence', '=', todo.recurrence),
                             ('email', '=', attendee.email),
                             ])
                         self.delete(attendee_ids)
@@ -1128,7 +1139,7 @@ class TodoAttendee(ModelSQL, ModelView):
                         ('todo.uuid', '=', todo.uuid),
                         ('todo.calendar.owner.email', '=', organizer),
                         ('id', '!=', attendee.id),
-                        ('todo.recurrence', '=', todo.recurrence or False),
+                        ('todo.recurrence', '=', todo.recurrence),
                         ('email', '=', attendee.email),
                         ])
                     if attendee_ids:
@@ -1183,9 +1194,9 @@ class TodoAlarm(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)
     todo = fields.Many2One('calendar.todo', 'Todo', ondelete='CASCADE',
-            required=True, select=1)
+            required=True, select=True)
 
     def create(self, values):
         todo_obj = Pool().get('calendar.todo')
diff --git a/todo.xml b/todo.xml
index 71a9d41..d8d7e92 100644
--- a/todo.xml
+++ b/todo.xml
@@ -7,6 +7,7 @@ this repository contains the full copyright notices and license terms. -->
         <record model="ir.ui.view" id="todo_view_tree">
             <field name="model">calendar.todo</field>
             <field name="type">tree</field>
+            <field name="priority" eval="10"/>
             <field name="arch" type="xml">
                 <![CDATA[
                 <tree string="Todos">
@@ -21,6 +22,24 @@ this repository contains the full copyright notices and license terms. -->
             </field>
         </record>
 
+        <record model="ir.ui.view" id="todo_view_tree_occurence">
+            <field name="model">calendar.todo</field>
+            <field name="type">tree</field>
+            <field name="priority" eval="20"/>
+            <field name="arch" type="xml">
+                <![CDATA[
+                <tree string="Todos">
+                    <field name="summary"/>
+                    <field name="recurrence"/>
+                    <field name="dtstart"/>
+                    <field name="due"/>
+                    <field name="status"/>
+                    <field name="percent_complete"/>
+                </tree>
+                ]]>
+            </field>
+        </record>
+
         <record model="ir.ui.view" id="todo_view_form">
             <field name="model">calendar.todo</field>
             <field name="type">form</field>
@@ -66,16 +85,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="Todos">
-                                    <field name="summary"/>
-                                    <field name="recurrence"/>
-                                    <field name="dtstart"/>
-                                    <field name="due"/>
-                                    <field name="status"/>
-                                    <field name="percent_complete"/>
-                                </tree>
-                            </field>
+                            <field name="occurences" colspan="4"
+                                view_ids="calendar_todo.todo_view_tree_occurence"/>
                         </page>
                     </notebook>
                 </form>
diff --git a/trytond_calendar_todo.egg-info/PKG-INFO b/trytond_calendar_todo.egg-info/PKG-INFO
index 41e6827..306c9f4 100644
--- a/trytond_calendar_todo.egg-info/PKG-INFO
+++ b/trytond_calendar_todo.egg-info/PKG-INFO
@@ -1,12 +1,12 @@
 Metadata-Version: 1.0
 Name: trytond-calendar-todo
-Version: 2.2.0
+Version: 2.4.0
 Summary: Add Todo support on CalDAV
 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_todo.egg-info/SOURCES.txt b/trytond_calendar_todo.egg-info/SOURCES.txt
index bb326df..79ef172 100644
--- a/trytond_calendar_todo.egg-info/SOURCES.txt
+++ b/trytond_calendar_todo.egg-info/SOURCES.txt
@@ -14,8 +14,10 @@ todo.xml
 ./tests/__init__.py
 ./tests/test_calendar_todo.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_todo.egg-info/requires.txt b/trytond_calendar_todo.egg-info/requires.txt
index f881d88..f65a590 100644
--- a/trytond_calendar_todo.egg-info/requires.txt
+++ b/trytond_calendar_todo.egg-info/requires.txt
@@ -1,6 +1,6 @@
 vobject >= 0.8.0
-PyWebDAV >= 0.9.3
+PyWebDAV >= 0.9.8
 python-dateutil
 pytz
-trytond_calendar >= 2.2, < 2.3
-trytond >= 2.2, < 2.3
\ No newline at end of file
+trytond_calendar >= 2.4, < 2.5
+trytond >= 2.4, < 2.5
\ No newline at end of file
diff --git a/webdav.py b/webdav.py
index e7db419..0999191 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.transaction import Transaction
@@ -17,12 +17,12 @@ class Collection(ModelSQL, ModelView):
     @Cache('webdav_collection.todo')
     def todo(self, uri, calendar_id=False):
         '''
-        Return the todo id in the uri or False
+        Return the todo id in the uri
 
         :param uri: the uri
         :param calendar_id: the calendar id
         :return: todo id
-            or False if there is no todo
+            or None if there is no todo
         '''
         todo_obj = Pool().get('calendar.todo')
 
@@ -31,15 +31,14 @@ class Collection(ModelSQL, ModelView):
             if not calendar_id:
                 calendar_id = self.calendar(uri)
                 if not calendar_id:
-                    return False
+                    return None
             todo_ids = todo_obj.search([
                 ('calendar', '=', calendar_id),
                 ('uuid', '=', todo_uri[:-4]),
-                ('parent', '=', False),
+                ('parent', '=', None),
                 ], limit=1)
             if todo_ids:
                 return todo_ids[0]
-        return False
 
     def _caldav_filter_domain_todo(self, filter):
         '''
@@ -106,7 +105,6 @@ class Collection(ModelSQL, ModelView):
         return res
 
     def get_childs(self, uri, filter=None, cache=None):
-        calendar_obj = Pool().get('calendar.calendar')
         todo_obj = Pool().get('calendar.todo')
 
         res = super(Collection, self).get_childs(uri, filter=filter,
@@ -152,7 +150,6 @@ class Collection(ModelSQL, ModelView):
         return super(Collection, self).get_contenttype(uri, cache=cache)
 
     def get_creationdate(self, uri, cache=None):
-        calendar_obj = Pool().get('calendar.calendar')
         todo_obj = Pool().get('calendar.todo')
 
         cursor = Transaction().cursor
@@ -170,10 +167,10 @@ class Collection(ModelSQL, ModelView):
                     ids = cache['_calendar'][todo_obj._name].keys()
                     if todo_id not in ids:
                         ids.append(todo_id)
-                    elif 'creationdate' in cache['_calendar']\
-                            [todo_obj._name][todo_id]:
-                        return cache['_calendar'][todo_obj._name]\
-                                [todo_id]['creationdate']
+                    elif 'creationdate' in cache['_calendar'][
+                            todo_obj._name][todo_id]:
+                        return cache['_calendar'][todo_obj._name][
+                            todo_id]['creationdate']
                 else:
                     ids = [todo_id]
                 res = None
@@ -190,15 +187,14 @@ class Collection(ModelSQL, ModelView):
                         if cache is not None:
                             cache['_calendar'][todo_obj._name]\
                                     .setdefault(todo_id2, {})
-                            cache['_calendar'][todo_obj._name]\
-                                    [todo_id2]['creationdate'] = date
+                            cache['_calendar'][todo_obj._name][
+                                todo_id2]['creationdate'] = date
                 if res is not None:
                     return res
 
         return super(Collection, self).get_creationdate(uri, cache=cache)
 
     def get_lastmodified(self, uri, cache=None):
-        calendar_obj = Pool().get('calendar.calendar')
         todo_obj = Pool().get('calendar.todo')
 
         cursor = Transaction().cursor
@@ -213,15 +209,15 @@ class Collection(ModelSQL, ModelView):
                     ids = cache['_calendar'][todo_obj._name].keys()
                     if todo_id not in ids:
                         ids.append(todo_id)
-                    elif 'lastmodified' in cache['_calendar']\
-                            [todo_obj._name][todo_id]:
-                        return cache['_calendar'][todo_obj._name]\
-                                [todo_id]['lastmodified']
+                    elif 'lastmodified' in cache['_calendar'][
+                            todo_obj._name][todo_id]:
+                        return cache['_calendar'][todo_obj._name][
+                            todo_id]['lastmodified']
                 else:
                     ids = [todo_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)
@@ -238,8 +234,8 @@ class Collection(ModelSQL, ModelView):
                         if cache is not None:
                             cache['_calendar'][todo_obj._name]\
                                     .setdefault(todo_id2, {})
-                            cache['_calendar'][todo_obj._name]\
-                                    [todo_id2]['lastmodified'] = date
+                            cache['_calendar'][todo_obj._name][
+                                todo_id2]['lastmodified'] = date
                 if res is not None:
                     return res
 
@@ -247,7 +243,6 @@ class Collection(ModelSQL, ModelView):
 
     def get_data(self, uri, cache=None):
         todo_obj = Pool().get('calendar.todo')
-        calendar_obj = Pool().get('calendar.calendar')
 
         calendar_id = self.calendar(uri)
         if calendar_id:
commit 8e5f4e53679b77ef4e2fcf66573fce78b6c021bc
Author: Mathias Behrle <mathiasb at m9s.biz>
Date:   Tue Mar 27 11:05:29 2012 +0200

    Releasing debian version 2.2.0-2.

diff --git a/debian/changelog b/debian/changelog
index 9848e87..818d944 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,13 @@
+tryton-modules-calendar-todo (2.2.0-2) unstable; urgency=low
+
+  * Updating to Standards-Version: 3.9.3, no changes needed.
+  * Updating year in copyright.
+  * Adding myself to copyright.
+  * Adding Format header for DEP5.
+  * Adding patch to support new structure of pywebdav > 0.9.4.1.
+
+ -- Mathias Behrle <mathiasb at m9s.biz>  Tue, 27 Mar 2012 10:37:00 +0200
+
 tryton-modules-calendar-todo (2.2.0-1) unstable; urgency=low
 
   * Bumping X-Python-Version to >=2.6.
commit 8101a7020753009d06148f8a97612a29c3ab5f3e
Author: Mathias Behrle <mathiasb at m9s.biz>
Date:   Tue Mar 27 10:33:43 2012 +0200

    Adding patch to support new structure of pywebdav > 0.9.4.1.

diff --git a/debian/patches/01-support-pywebdav-0.9.8 b/debian/patches/01-support-pywebdav-0.9.8
new file mode 100644
index 0000000..24a9c76
--- /dev/null
+++ b/debian/patches/01-support-pywebdav-0.9.8
@@ -0,0 +1,45 @@
+Author: Mathias Behrle <mathiasb at m9s.biz>
+Description: Support new structure of pywebdav > 0.9.4.1.
+--- tryton-modules-calendar-todo.orig/caldav.py	2012-01-02 12:49:21.541638844 +0100
++++ tryton-modules-calendar-todo/caldav.py	2012-03-26 20:06:16.290050030 +0200
+@@ -2,8 +2,12 @@
+ #this repository contains the full copyright notices and license terms.
+ _TRYTON_RELOAD = False
+ 
+-from DAV import propfind
+-from DAV.utils import get_uriparentpath
++try:
++    from DAV import propfind
++    from DAV.utils import get_uriparentpath
++except ImportError:
++    from pywebdav.lib import propfind
++    from pywebdav.lib.utils import get_uriparentpath
+ from trytond.protocols.webdav import TrytonDAVInterface
+ 
+ _mk_prop_response = propfind.PROPFIND.mk_prop_response
+--- tryton-modules-calendar-todo.orig/webdav.py	2012-01-02 12:49:21.613635117 +0100
++++ tryton-modules-calendar-todo/webdav.py	2012-03-26 20:06:25.753733455 +0200
+@@ -2,7 +2,10 @@
+ #this repository contains the full copyright notices and license terms.
+ import vobject
+ import urllib
+-from DAV.errors import DAV_NotFound, DAV_Forbidden
++try:
++    from DAV.errors import DAV_NotFound, DAV_Forbidden
++except ImportError:
++    from pywebdav.lib.errors import DAV_NotFound, DAV_Forbidden
+ from trytond.model import ModelView, ModelSQL
+ from trytond.tools import reduce_ids
+ from trytond.transaction import Transaction
+@@ -132,7 +135,10 @@
+         return res
+ 
+     def get_resourcetype(self, uri, cache=None):
+-        from DAV.constants import COLLECTION, OBJECT
++        try:
++            from DAV.constants import COLLECTION, OBJECT
++        except ImportError:
++            from pywebdav.lib.constants import COLLECTION, OBJECT
+         if uri in ('Calendars', 'Calendars/'):
+             return COLLECTION
+         calendar_id = self.calendar(uri)
diff --git a/debian/patches/series b/debian/patches/series
new file mode 100644
index 0000000..138cbbb
--- /dev/null
+++ b/debian/patches/series
@@ -0,0 +1 @@
+01-support-pywebdav-0.9.8
commit d37bfa70a901abca7e8fd6bb53c7017fab4ba225
Author: Mathias Behrle <mathiasb at m9s.biz>
Date:   Sun Mar 25 15:28:18 2012 +0200

    Adding Format header for DEP5.

diff --git a/debian/copyright b/debian/copyright
index c905bbf..31cd674 100644
--- a/debian/copyright
+++ b/debian/copyright
@@ -1,3 +1,5 @@
+Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
+
 Files: *
 Copyright:
  (C) 2009-2011 Cedric Krier
commit 6acd52c0d52ae9f013bef475620223e94e27a292
Author: Mathias Behrle <mathiasb at m9s.biz>
Date:   Fri Feb 24 14:09:12 2012 +0100

    Adding myself to copyright.

diff --git a/debian/copyright b/debian/copyright
index 6d5ec8c..c905bbf 100644
--- a/debian/copyright
+++ b/debian/copyright
@@ -6,7 +6,9 @@ Copyright:
 License: GPL-3+
 
 Files: debian/*
-Copyright: (C) 2009-2012 Daniel Baumann <daniel at debian.org>
+Copyright:
+ (C) 2009-2012 Daniel Baumann <daniel at debian.org>
+ (C) 2012 Mathias Behrle <mathiasb at m9s.biz>
 License: GPL-3+
 
 License: GPL-3+
commit 0703e97e47381c517917c4dfe2d7905e1c7fe8c1
Author: Mathias Behrle <mathiasb at m9s.biz>
Date:   Fri Feb 24 14:01:03 2012 +0100

    Updating year in copyright.

diff --git a/debian/copyright b/debian/copyright
index 6da6058..6d5ec8c 100644
--- a/debian/copyright
+++ b/debian/copyright
@@ -6,7 +6,7 @@ Copyright:
 License: GPL-3+
 
 Files: debian/*
-Copyright: (C) 2009-2011 Daniel Baumann <daniel at debian.org>
+Copyright: (C) 2009-2012 Daniel Baumann <daniel at debian.org>
 License: GPL-3+
 
 License: GPL-3+
commit fd86c238af4e5f071d3a53797a382adc288a7cb5
Author: Mathias Behrle <mathiasb at m9s.biz>
Date:   Fri Feb 24 13:47:01 2012 +0100

    Updating to Standards-Version: 3.9.3, no changes needed.

diff --git a/debian/control b/debian/control
index 9436ca8..3a81163 100644
--- a/debian/control
+++ b/debian/control
@@ -5,7 +5,7 @@ Maintainer: Debian Tryton Maintainers <tryton at lists.debian-maintainers.org>
 Uploaders: Daniel Baumann <daniel at debian.org>, Mathias Behrle <mathiasb at m9s.biz>
 Dm-Upload-Allowed: yes
 Build-Depends: debhelper (>= 8), python (>= 2.6.6-3~), python-setuptools
-Standards-Version: 3.9.2
+Standards-Version: 3.9.3
 Homepage: http://www.tryton.org/
 Vcs-Browser: http://git.debian-maintainers.org/?p=tryton/tryton-modules-calendar-todo.git
 Vcs-Git: git://git.debian-maintainers.org/git/tryton/tryton-modules-calendar-todo.git
commit 1a72d79d15142e15f93e0dc3527cc838dfc3c45f
Author: Mathias Behrle <mathiasb at m9s.biz>
Date:   Mon Dec 26 18:09:29 2011 +0100

    Releasing debian version 2.2.0-1.

diff --git a/debian/changelog b/debian/changelog
index a6d4593..9848e87 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,12 @@
+tryton-modules-calendar-todo (2.2.0-1) unstable; urgency=low
+
+  * Bumping X-Python-Version to >=2.6.
+  * Updating versioned tryton depends to 2.2.
+  * Merging upstream version 2.2.0.
+  * Removing deprecated XB-Python-Version for dh_python2.
+
+ -- Mathias Behrle <mathiasb at m9s.biz>  Mon, 26 Dec 2011 14:00:34 +0100
+
 tryton-modules-calendar-todo (2.0.0-2) unstable; urgency=low
 
   [ Daniel Baumann ]
commit ece2f1cdfd91cec1ef5ef7d4e36e4686bfa6f3b9
Author: Mathias Behrle <mathiasb at m9s.biz>
Date:   Sat Dec 17 13:59:42 2011 +0100

    Bumping X-Python-Version to >=2.6.

diff --git a/debian/control b/debian/control
index 67c14c5..9436ca8 100644
--- a/debian/control
+++ b/debian/control
@@ -9,7 +9,7 @@ Standards-Version: 3.9.2
 Homepage: http://www.tryton.org/
 Vcs-Browser: http://git.debian-maintainers.org/?p=tryton/tryton-modules-calendar-todo.git
 Vcs-Git: git://git.debian-maintainers.org/git/tryton/tryton-modules-calendar-todo.git
-X-Python-Version: >= 2.5
+X-Python-Version: >= 2.6
 
 Package: tryton-modules-calendar-todo
 Architecture: all
commit 3f93e4da1a6df6e68c88e87c8857d586f0a4ea3c
Author: Mathias Behrle <mathiasb at m9s.biz>
Date:   Tue Nov 1 15:19:31 2011 +0100

    Updating versioned tryton depends to 2.2.

diff --git a/debian/control b/debian/control
index 5370307..67c14c5 100644
--- a/debian/control
+++ b/debian/control
@@ -14,8 +14,8 @@ X-Python-Version: >= 2.5
 Package: tryton-modules-calendar-todo
 Architecture: all
 Depends:
- ${misc:Depends}, ${python:Depends}, tryton-server (>= 2.0),
- tryton-modules-calendar (>= 2.0), python-dateutil, python-tz, python-vobject,
+ ${misc:Depends}, ${python:Depends}, tryton-server (>= 2.2),
+ tryton-modules-calendar (>= 2.2), python-dateutil, python-tz, python-vobject,
  python-webdav, python-pkg-resources
 Description: Tryton Application Platform (Calendar Todo Module)
  Tryton is a high-level general purpose application platform written in Python
commit 896d5ce4093f7f716fbb03a72440c12326a0060c
Author: Mathias Behrle <mathiasb at m9s.biz>
Date:   Mon Oct 31 16:20:44 2011 +0100

    Merging upstream version 2.2.0.

diff --git a/CHANGELOG b/CHANGELOG
index 8d69511..72099a7 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,3 +1,6 @@
+Version 2.2.0 - 2011-10-24
+* Bug fixes (see mercurial logs for details)
+
 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 744dd33..782fc36 100644
--- a/PKG-INFO
+++ b/PKG-INFO
@@ -1,29 +1,31 @@
 Metadata-Version: 1.0
 Name: trytond_calendar_todo
-Version: 2.0.0
+Version: 2.2.0
 Summary: Add Todo support on CalDAV
 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 f04e3f8..244dd66 100644
--- a/__tryton__.py
+++ b/__tryton__.py
@@ -9,7 +9,7 @@
     'name_es_ES': 'Calendario de tareas',
     'name_fr_FR' : 'Tâche Calendrier',
     'name_ru_RU' : 'Задачи для календаря',
-    'version' : '2.0.0',
+    'version' : '2.2.0',
     'author' : 'B2CK',
     'email': 'info at b2ck.com',
     'website': 'http://www.tryton.org/',
@@ -30,11 +30,13 @@
         'todo.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 0446c93..0000000
--- a/bg_BG.csv
+++ /dev/null
@@ -1,91 +0,0 @@
-type,name,res_id,src,value,fuzzy
-error,calendar.todo,0,Recurrence can not be recurrent!,Повторението не може да е периодично!,0
-error,calendar.todo,0,UUID and recurrence must be unique in a calendar!,UUID и взаимна вложеност трябва да са уникални в календар!,0
-field,"calendar.todo,alarms",0,Alarms,Аларми,0
-field,"calendar.todo,attendees",0,Attendees,Присъстващи,0
-field,"calendar.todo,calendar",0,Calendar,Календар,0
-field,"calendar.todo,calendar_owner",0,Owner,Собственик,0
-field,"calendar.todo,calendar_read_users",0,Read Users,Потребители с права за четене,0
-field,"calendar.todo,calendar_write_users",0,Write Users,Записване на потребители,0
-field,"calendar.todo,categories",0,Categories,Категории,0
-field,"calendar.todo,classification",0,Classification,Класификация,0
-field,"calendar.todo,completed",0,Completed,Изпълнен,0
-field,"calendar.todo,description",0,Description,Описание,0
-field,"calendar.todo,dtstart",0,Start Date,Начална дата,0
-field,"calendar.todo,due",0,Due Date,Дата на изпълнение,0
-field,"calendar.todo,exdates",0,Exception Dates,Дати на грешките,0
-field,"calendar.todo,exrules",0,Exception Rules,Правила при грешка,0
-field,"calendar.todo,location",0,Location,Местоположение,0
-field,"calendar.todo,occurences",0,Occurences,Събития,0
-field,"calendar.todo,organizer",0,Organizer,Организатор,0
-field,"calendar.todo,parent",0,Parent,Родител,0
-field,"calendar.todo,percent_complete",0,Percent complete,Процент изпълнено,0
-field,"calendar.todo,rdates",0,Recurrence Dates,Дати на повторяемост,0
-field,"calendar.todo,rec_name",0,Name,Име,0
-field,"calendar.todo,recurrence",0,Recurrence,Повторение,0
-field,"calendar.todo,rrules",0,Recurrence Rules,Правила за повторяемост,0
-field,"calendar.todo,sequence",0,Sequence,Последователност,0
-field,"calendar.todo,status",0,Status,Състояние,0
-field,"calendar.todo,summary",0,Summary,Обобщено,0
-field,"calendar.todo,timezone",0,Timezone,Времева зона,0
-field,"calendar.todo,uuid",0,UUID,UUID,0
-field,"calendar.todo,vtodo",0,vtodo,,0
-field,"calendar.todo-calendar.category,category",0,Category,Категория,0
-field,"calendar.todo-calendar.category,rec_name",0,Name,Име,0
-field,"calendar.todo-calendar.category,todo",0,To-Do,Задача,0
-field,"calendar.todo.alarm,calendar_alarm",0,Calendar Alarm,Аларма на календар,0
-field,"calendar.todo.alarm,rec_name",0,Name,Име,0
-field,"calendar.todo.alarm,todo",0,Todo,Задача,0
-field,"calendar.todo.attendee,calendar_attendee",0,Calendar Attendee,Присъстващ на календар,0
-field,"calendar.todo.attendee,rec_name",0,Name,Име,0
-field,"calendar.todo.attendee,todo",0,Todo,Задача,0
-field,"calendar.todo.exdate,calendar_date",0,Calendar Date,Дата от календар,0
-field,"calendar.todo.exdate,rec_name",0,Name,Име,0
-field,"calendar.todo.exdate,todo",0,Todo,Задача,0
-field,"calendar.todo.exrule,calendar_rrule",0,Calendar RRule,,0
-field,"calendar.todo.exrule,rec_name",0,Name,Име,0
-field,"calendar.todo.exrule,todo",0,Todo,Задача,0
-field,"calendar.todo.rdate,calendar_date",0,Calendar Date,Дата от календар,0
-field,"calendar.todo.rdate,rec_name",0,Name,Име,0
-field,"calendar.todo.rdate,todo",0,Todo,Задача,0
-field,"calendar.todo.rrule,calendar_rrule",0,Calendar RRule,,0
-field,"calendar.todo.rrule,rec_name",0,Name,Име,0
-field,"calendar.todo.rrule,todo",0,Todo,Задача,0
-help,"calendar.todo,uuid",0,Universally Unique Identifier,Универсален иникален идентификатор,0
-model,"calendar.todo,name",0,Todo,Задача,0
-model,"calendar.todo-calendar.category,name",0,Todo - Category,Задача - Категория,0
-model,"calendar.todo.alarm,name",0,Alarm,Аларма,0
-model,"calendar.todo.attendee,name",0,Attendee,Присъстващ,0
-model,"calendar.todo.exdate,name",0,Exception Date,Дата на грешка,0
-model,"calendar.todo.exrule,name",0,Exception Rule,Правило при грешка,0
-model,"calendar.todo.rdate,name",0,Todo Recurrence Date,Дата на повторение на задача,0
-model,"calendar.todo.rrule,name",0,Recurrence Rule,Правило за повторение,0
-model,"ir.action,name",act_todo_form,Todos,Задачи,0
-model,"ir.action,name",act_todo_form2,Todos,Задачи,0
-model,"ir.action,name",act_todo_form3,Todos,Задачи,0
-model,"ir.ui.menu,name",menu_todo_form,Todos,Задачи,0
-model,"ir.ui.menu,name",menu_todo_form2,New Todo,Нова задача,0
-selection,"calendar.todo,classification",0,Confidential,Поверителен,0
-selection,"calendar.todo,classification",0,Private,Частен,0
-selection,"calendar.todo,classification",0,Public,Публичен,0
-selection,"calendar.todo,status",0,,,0
-selection,"calendar.todo,status",0,Cancelled,Отказан,0
-selection,"calendar.todo,status",0,Completed,Изпълнен,0
-selection,"calendar.todo,status",0,In-Process,Обработва се,0
-selection,"calendar.todo,status",0,Needs-Action,Необходимо е действие,0
-view,calendar.todo,0,Attendees,Присъстващи,0
-view,calendar.todo,0,Categories,Категории,0
-view,calendar.todo,0,General,Основен,0
-view,calendar.todo,0,Occurences,Събития,0
-view,calendar.todo,0,Todo,Задача,0
-view,calendar.todo,0,Todos,Задачи,0
-view,calendar.todo.attendee,0,Attendee,Присъстващ,0
-view,calendar.todo.attendee,0,Attendees,Присъстващи,0
-view,calendar.todo.exdate,0,Exception Date,Дата на грешка,0
-view,calendar.todo.exdate,0,Exception Dates,Дати на грешките,0
-view,calendar.todo.exrule,0,Exception Rule,Правило при грешка,0
-view,calendar.todo.exrule,0,Exception Rules,Правила при грешка,0
-view,calendar.todo.rdate,0,Recurrence Date,Повтаряща се дата,0
-view,calendar.todo.rdate,0,Recurrence Dates,Дати на повторяемост,0
-view,calendar.todo.rrule,0,Recurrence Rule,Правило за повторение,0
-view,calendar.todo.rrule,0,Recurrence Rules,Правила за повторяемост,0
diff --git a/de_DE.csv b/de_DE.csv
deleted file mode 100644
index d9bb158..0000000
--- a/de_DE.csv
+++ /dev/null
@@ -1,92 +0,0 @@
-type,name,res_id,src,value,fuzzy
-error,calendar.todo,0,Recurrence can not be recurrent!,Wiederholungen können nicht rekursiv sein!,0
-error,calendar.todo,0,UUID and recurrence must be unique in a calendar!,UUID und Wiederholung können in einem Kalender nicht mehrfach vergeben werden!,0
-field,"calendar.todo,alarms",0,Alarms,Alarm,0
-field,"calendar.todo,attendees",0,Attendees,Teilnehmer,0
-field,"calendar.todo,calendar",0,Calendar,Kalender,0
-field,"calendar.todo,calendar_owner",0,Owner,Besitzer,0
-field,"calendar.todo,calendar_read_users",0,Read Users,Benutzer mit Leseberechtigung,0
-field,"calendar.todo,calendar_write_users",0,Write Users,Benutzer mit Schreibberechtigung,0
-field,"calendar.todo,categories",0,Categories,Kategorien,0
-field,"calendar.todo,classification",0,Classification,Klassifizierung,0
-field,"calendar.todo,completed",0,Completed,Abgeschlossen,0
-field,"calendar.todo,description",0,Description,Bezeichnung,0
-field,"calendar.todo,dtstart",0,Start Date,Anfangsdatum,0
-field,"calendar.todo,due",0,Due Date,Fälligkeitsdatum,0
-field,"calendar.todo,exdates",0,Exception Dates,Ausnahmedaten,0
-field,"calendar.todo,exrules",0,Exception Rules,Ausnahmeregeln,0
-field,"calendar.todo,location",0,Location,Ort,0
-field,"calendar.todo,occurences",0,Occurences,Ereignisse,0
-field,"calendar.todo,organizer",0,Organizer,Organisator,0
-field,"calendar.todo,parent",0,Parent,Übergeordnet (Aufgabe),0
-field,"calendar.todo,percent_complete",0,Percent complete,% erledigt,0
-field,"calendar.todo,rdates",0,Recurrence Dates,Wiederholungsdaten,0
-field,"calendar.todo,rec_name",0,Name,Name,0
-field,"calendar.todo,recurrence",0,Recurrence,Wiederholung,0
-field,"calendar.todo,rrules",0,Recurrence Rules,Wiederholungsregeln,0
-field,"calendar.todo,sequence",0,Sequence,Revision,0
-field,"calendar.todo,status",0,Status,Status,0
-field,"calendar.todo,summary",0,Summary,Zusammenfassung,0
-field,"calendar.todo,timezone",0,Timezone,Zeitzone,0
-field,"calendar.todo,uuid",0,UUID,UUID,0
-field,"calendar.todo,vtodo",0,vtodo,vtodo,0
-field,"calendar.todo-calendar.category,category",0,Category,Kategorie,0
-field,"calendar.todo-calendar.category,rec_name",0,Name,Name,0
-field,"calendar.todo-calendar.category,todo",0,To-Do,Aufgabe,0
-field,"calendar.todo.alarm,calendar_alarm",0,Calendar Alarm,Kalender Alarm,0
-field,"calendar.todo.alarm,rec_name",0,Name,Name,0
-field,"calendar.todo.alarm,todo",0,Todo,Aufgabe,0
-field,"calendar.todo.attendee,calendar_attendee",0,Calendar Attendee,Kalender Teilnehmer,0
-field,"calendar.todo.attendee,rec_name",0,Name,Name,0
-field,"calendar.todo.attendee,todo",0,Todo,Aufgabe,0
-field,"calendar.todo.exdate,calendar_date",0,Calendar Date,Kalender Datum,0
-field,"calendar.todo.exdate,rec_name",0,Name,Name,0
-field,"calendar.todo.exdate,todo",0,Todo,Aufgabe,0
-field,"calendar.todo.exrule,calendar_rrule",0,Calendar RRule,Kalender WRegel,0
-field,"calendar.todo.exrule,rec_name",0,Name,Name,0
-field,"calendar.todo.exrule,todo",0,Todo,Aufgabe,0
-field,"calendar.todo.rdate,calendar_date",0,Calendar Date,Kalender Datum,0
-field,"calendar.todo.rdate,rec_name",0,Name,Name,0
-field,"calendar.todo.rdate,todo",0,Todo,Aufgabe,0
-field,"calendar.todo.rrule,calendar_rrule",0,Calendar RRule,Kalender WRegel,0
-field,"calendar.todo.rrule,rec_name",0,Name,Name,0
-field,"calendar.todo.rrule,todo",0,Todo,Aufgabe,0
-help,"calendar.todo,uuid",0,Universally Unique Identifier,Universally Unique Identifier,0
-model,"calendar.todo,name",0,Todo,Aufgabe,0
-model,"calendar.todo-calendar.category,name",0,Todo - Category,Aufgabe - Kategorie,0
-model,"calendar.todo.alarm,name",0,Alarm,Alarm,0
-model,"calendar.todo.attendee,name",0,Attendee,Teilnehmer,0
-model,"calendar.todo.exdate,name",0,Exception Date,Ausnahmedatum,0
-model,"calendar.todo.exrule,name",0,Exception Rule,Ausnahmeregel,0
-model,"calendar.todo.rdate,name",0,Todo Recurrence Date,Aufgabe Wiederholungsdatum,0
-model,"calendar.todo.rrule,name",0,Recurrence Rule,Wiederholungsregel,0
-model,"ir.action,name",act_todo_form,Todos,Aufgaben,0
-model,"ir.action,name",act_todo_form2,Todos,Aufgaben,0
-model,"ir.action,name",act_todo_form3,Todos,Aufgaben,0
-model,"ir.ui.menu,name",menu_todo_form,Todos,Aufgaben,0
-model,"ir.ui.menu,name",menu_todo_form2,New Todo,Neue Aufgabe,0
-selection,"calendar.todo,classification",0,Confidential,Vertraulich,0
-selection,"calendar.todo,classification",0,Private,Privat,0
-selection,"calendar.todo,classification",0,Public,Öffentlich,0
-selection,"calendar.todo,status",0,,,0
-selection,"calendar.todo,status",0,Cancelled,Abgesagt,0
-selection,"calendar.todo,status",0,Completed,Abgeschlossen,0
-selection,"calendar.todo,status",0,In-Process,In Arbeit,0
-selection,"calendar.todo,status",0,Needs-Action,Benötigt Eingriff,0
-view,calendar.todo,0,Attendees,Teilnehmer,0
-view,calendar.todo,0,Categories,Kategorien,0
-view,calendar.todo,0,General,Allgemein,0
-view,calendar.todo,0,Occurences,Ereignisse,0
-view,calendar.todo,0,Recurrences,Wiederholungen,0
-view,calendar.todo,0,Todo,Aufgabe,0
-view,calendar.todo,0,Todos,Aufgaben,0
-view,calendar.todo.attendee,0,Attendee,Teilnehmer,0
-view,calendar.todo.attendee,0,Attendees,Teilnehmer,0
-view,calendar.todo.exdate,0,Exception Date,Ausnahmedatum,0
-view,calendar.todo.exdate,0,Exception Dates,Ausnahmedaten,0
-view,calendar.todo.exrule,0,Exception Rule,Ausnahmeregel,0
-view,calendar.todo.exrule,0,Exception Rules,Ausnahmeregeln,0
-view,calendar.todo.rdate,0,Recurrence Date,Wiederholungsdatum,0
-view,calendar.todo.rdate,0,Recurrence Dates,Wiederholungsdaten,0
-view,calendar.todo.rrule,0,Recurrence Rule,Wiederholungsregel,0
-view,calendar.todo.rrule,0,Recurrence Rules,Wiederholungsregeln,0
diff --git a/es_CO.csv b/es_CO.csv
deleted file mode 100644
index c49cab3..0000000
--- a/es_CO.csv
+++ /dev/null
@@ -1,93 +0,0 @@
-type,name,res_id,src,value,fuzzy
-error,calendar.todo,0,Recurrence can not be recurrent!,¡La repetición no puede repetirse!,0
-error,calendar.todo,0,UUID and recurrence must be unique in a calendar!,¡El UUID y la recurrencia deben ser únicos por calendario! ,0
-field,"calendar.todo.alarm,calendar_alarm",0,Calendar Alarm,,0
-field,"calendar.todo.alarm,rec_name",0,Name,Nombre,0
-field,"calendar.todo,alarms",0,Alarms,Alarmas,0
-field,"calendar.todo.alarm,todo",0,Todo,,0
-field,"calendar.todo.attendee,calendar_attendee",0,Calendar Attendee,,0
-field,"calendar.todo.attendee,rec_name",0,Name,Nombre,0
-field,"calendar.todo,attendees",0,Attendees,Asistentes,0
-field,"calendar.todo.attendee,todo",0,Todo,,0
-field,"calendar.todo,calendar",0,Calendar,Calendario,0
-field,"calendar.todo-calendar.category,category",0,Category,Categoría,0
-field,"calendar.todo-calendar.category,rec_name",0,Name,Nombre,0
-field,"calendar.todo-calendar.category,todo",0,To-Do,,0
-field,"calendar.todo,calendar_owner",0,Owner,Propietario,0
-field,"calendar.todo,calendar_read_users",0,Read Users,Leer Usuarios,0
-field,"calendar.todo,calendar_write_users",0,Write Users,Escribir Usuarios,0
-field,"calendar.todo,categories",0,Categories,Categorías,0
-field,"calendar.todo,classification",0,Classification,Clasificación,0
-field,"calendar.todo,classification_public",0,Classification Public,Clasificación Pública,0
-field,"calendar.todo,completed",0,Completed,,0
-field,"calendar.todo,description",0,Description,Descripción,0
-field,"calendar.todo,dtstart",0,Start Date,Fecha Inicio,0
-field,"calendar.todo,due",0,Due Date,,0
-field,"calendar.todo.exdate,calendar_rdate",0,Calendar RDate,,0
-field,"calendar.todo.exdate,rec_name",0,Name,Nombre,0
-field,"calendar.todo,exdates",0,Exception Dates,Fechas de Excepción,0
-field,"calendar.todo.exdate,todo",0,Todo,,0
-field,"calendar.todo.exrule,calendar_rrule",0,Calendar RRule,,0
-field,"calendar.todo.exrule,rec_name",0,Name,Nombre,0
-field,"calendar.todo,exrules",0,Exception Rules,Reglas de Excepción,0
-field,"calendar.todo.exrule,todo",0,Todo,,0
-field,"calendar.todo,location",0,Location,Lugar,0
-field,"calendar.todo,occurences",0,Occurences,Ocurrencias,0
-field,"calendar.todo,organizer",0,Organizer,Organizador,0
-field,"calendar.todo,parent",0,Parent,Padre,0
-field,"calendar.todo,percent_complete",0,Percent complete,,0
-field,"calendar.todo.rdate,calendar_rdate",0,Calendar RDate,,0
-field,"calendar.todo.rdate,rec_name",0,Name,Nombre,0
-field,"calendar.todo,rdates",0,Recurrence Dates,Fechas de Repetición,0
-field,"calendar.todo.rdate,todo",0,Todo,,0
-field,"calendar.todo,rec_name",0,Name,Nombre,0
-field,"calendar.todo,recurrence",0,Recurrence,Repetición,0
-field,"calendar.todo.rrule,calendar_rrule",0,Calendar RRule,,0
-field,"calendar.todo.rrule,rec_name",0,Name,Nombre,0
-field,"calendar.todo,rrules",0,Recurrence Rules,Reglas de Repetición,0
-field,"calendar.todo.rrule,todo",0,Todo,,0
-field,"calendar.todo,sequence",0,Sequence,Secuencia,0
-field,"calendar.todo,status",0,Status,Estado,0
-field,"calendar.todo,summary",0,Summary,Resumen,0
-field,"calendar.todo,timezone",0,Timezone,Zona horaria,0
-field,"calendar.todo,uuid",0,UUID,UUID,0
-field,"calendar.todo,vtodo",0,vtodo,,0
-help,"calendar.todo,uuid",0,Universally Unique Identifier,Identificador Único Universal,0
-model,"calendar.todo.alarm,name",0,Alarm,Alarma,0
-model,"calendar.todo.attendee,name",0,Attendee,Asistente,0
-model,"calendar.todo-calendar.category,name",0,Todo - Category,,0
-model,"calendar.todo.exdate,name",0,Exception Date,Fecha de Excepción,0
-model,"calendar.todo.exrule,name",0,Exception Rule,Regla de Excepción,0
-model,"calendar.todo,name",0,Todo,,0
-model,"calendar.todo.rdate,name",0,Recurrence Date,Fecha de Repetición,0
-model,"calendar.todo.rrule,name",0,Recurrence Rule,Regla de Repetición,0
-model,"ir.action,name",act_todo_form,Todos,,0
-model,"ir.action,name",act_todo_form2,Todos,Por Hacer,0
-model,"ir.action,name",act_todo_form3,Todos,Por hacer,0
-model,"ir.ui.menu,name",menu_todo_form2,New Todo,Nuevo Por Hacer,0
-model,"ir.ui.menu,name",menu_todo_form,Todos,,0
-selection,"calendar.todo,classification",0,Confidential,Confidencial,0
-selection,"calendar.todo,classification",0,Private,Privado,0
-selection,"calendar.todo,classification",0,Public,Público,0
-selection,"calendar.todo,status",0,,,0
-selection,"calendar.todo,status",0,Cancelled,Cancelado,0
-selection,"calendar.todo,status",0,Completed,,0
-selection,"calendar.todo,status",0,In-Process,,0
-selection,"calendar.todo,status",0,Needs-Action,,0
-view,calendar.todo,0,Attendees,Asistentes,0
-view,calendar.todo,0,Categories,Categorías,0
-view,calendar.todo,0,General,General,0
-view,calendar.todo,0,Occurences,Ocurrencias,0
-view,calendar.todo,0,Recurrences,Repeticiones,0
-view,calendar.todo,0,Todo,,0
-view,calendar.todo,0,Todos,,0
-view,calendar.todo.attendee,0,Attendee,Asistente,0
-view,calendar.todo.attendee,0,Attendees,Asistentes,0
-view,calendar.todo.exdate,0,Exception Date,Fecha de Excepción,0
-view,calendar.todo.exdate,0,Exception Dates,Fechas de Excepción,0
-view,calendar.todo.exrule,0,Exception Rule,Regla de Excepción,0
-view,calendar.todo.exrule,0,Exception Rules,Reglas de Excepción,0
-view,calendar.todo.rdate,0,Recurrence Date,Fecha de Repetición,0
-view,calendar.todo.rdate,0,Recurrence Dates,Fechas de Repetición,0
-view,calendar.todo.rrule,0,Recurrence Rule,Regla de Repetición,0
-view,calendar.todo.rrule,0,Recurrence Rules,Reglas de Repetición,0
diff --git a/es_ES.csv b/es_ES.csv
deleted file mode 100644
index 5c5af3b..0000000
--- a/es_ES.csv
+++ /dev/null
@@ -1,89 +0,0 @@
-type,name,res_id,src,value,fuzzy
-error,calendar.todo,0,Recurrence can not be recurrent!,Una recurrencia no puede ser recurrente,0
-error,calendar.todo,0,UUID and recurrence must be unique in a calendar!,UUID y recurrencia deben ser únicos en un calendario,0
-field,"calendar.todo.alarm,calendar_alarm",0,Calendar Alarm,Alarma del calendario,0
-field,"calendar.todo.alarm,rec_name",0,Name,Nombre,0
-field,"calendar.todo,alarms",0,Alarms,Alarmas,0
-field,"calendar.todo.alarm,todo",0,Todo,Tarea,0
-field,"calendar.todo.attendee,calendar_attendee",0,Calendar Attendee,Calendario de asistentes,0
-field,"calendar.todo.attendee,rec_name",0,Name,Nombre,0
-field,"calendar.todo,attendees",0,Attendees,Asistentes,0
-field,"calendar.todo.attendee,todo",0,Todo,Tarea,0
-field,"calendar.todo,calendar",0,Calendar,Calendario,0
-field,"calendar.todo-calendar.category,category",0,Category,Categoría,0
-field,"calendar.todo-calendar.category,rec_name",0,Name,Nombre,0
-field,"calendar.todo-calendar.category,todo",0,To-Do,Por hacer,0
-field,"calendar.todo,calendar_owner",0,Owner,Dueño,0
-field,"calendar.todo,calendar_read_users",0,Read Users,Usuarios con lectura,0
-field,"calendar.todo,calendar_write_users",0,Write Users,Usuarios con escritura,0
-field,"calendar.todo,categories",0,Categories,Categorías,0
-field,"calendar.todo,classification",0,Classification,Clasificación,0
-field,"calendar.todo,classification_public",0,Classification Public,Clasificación pública,0
-field,"calendar.todo,completed",0,Completed,Completada,0
-field,"calendar.todo,description",0,Description,Descripción,0
-field,"calendar.todo,dtstart",0,Start Date,Fecha inicio,0
-field,"calendar.todo,due",0,Due Date,Fecha de vencimiento,0
-field,"calendar.todo.exdate,calendar_rdate",0,Calendar RDate,Fecha de recurrencia,0
-field,"calendar.todo.exdate,rec_name",0,Name,Nombre,0
-field,"calendar.todo,exdates",0,Exception Dates,Fechas excluidas,0
-field,"calendar.todo.exdate,todo",0,Todo,Tarea,0
-field,"calendar.todo.exrule,calendar_rrule",0,Calendar RRule,Regla de recurrencia,0
-field,"calendar.todo.exrule,rec_name",0,Name,Nombre,0
-field,"calendar.todo,exrules",0,Exception Rules,Reglas de excepciones,0
-field,"calendar.todo.exrule,todo",0,Todo,Tarea,0
-field,"calendar.todo,location",0,Location,Ubicación,0
-field,"calendar.todo,organizer",0,Organizer,Organizador,0
-field,"calendar.todo,parent",0,Parent,Padre,0
-field,"calendar.todo,percent_complete",0,Percent complete,Porcentaje total,0
-field,"calendar.todo.rdate,calendar_rdate",0,Calendar RDate,Fecha de recurrencia,0
-field,"calendar.todo.rdate,rec_name",0,Name,Nombre,0
-field,"calendar.todo,rdates",0,Recurrence Dates,Fechas de recurrencia,0
-field,"calendar.todo.rdate,todo",0,Todo,Tarea,0
-field,"calendar.todo,rec_name",0,Name,Nombre,0
-field,"calendar.todo,recurrence",0,Recurrence,Recurrencia,0
-field,"calendar.todo,recurrences",0,Recurrences,Recurrencias,0
-field,"calendar.todo.rrule,calendar_rrule",0,Calendar RRule,Regla de recurrencia,0
-field,"calendar.todo.rrule,rec_name",0,Name,Nombre,0
-field,"calendar.todo,rrules",0,Recurrence Rules,Reglas de recurrencia,0
-field,"calendar.todo.rrule,todo",0,Todo,Tarea,0
-field,"calendar.todo,sequence",0,Sequence,Secuencia,0
-field,"calendar.todo,status",0,Status,Estado,0
-field,"calendar.todo,summary",0,Summary,Resumen,0
-field,"calendar.todo,timezone",0,Timezone,Zona horaria,0
-field,"calendar.todo,uuid",0,UUID,UUID,0
-field,"calendar.todo,vtodo",0,vtodo,vtodo,0
-help,"calendar.todo,uuid",0,Universally Unique Identifier,Identificador universal único,0
-model,"calendar.todo.alarm,name",0,Alarm,Alarma,0
-model,"calendar.todo.attendee,name",0,Attendee,Asistentes,0
-model,"calendar.todo-calendar.category,name",0,Todo - Category,Tarea - Categoría,0
-model,"calendar.todo.exdate,name",0,Exception Date,Fecha excluida,0
-model,"calendar.todo.exrule,name",0,Exception Rule,Regla de excepción,0
-model,"calendar.todo,name",0,Todo,Tarea,0
-model,"calendar.todo.rdate,name",0,Recurrence Date,Fecha de recurrencia,0
-model,"calendar.todo.rrule,name",0,Recurrence Rule,Regla de recurrencia,0
-model,"ir.action,name",act_todo_form,Todos,Tareas,0
-model,"ir.ui.menu,name",menu_todo_form,Todos,Tareas,0
-selection,"calendar.todo,classification",0,Confidential,Confidencial,0
-selection,"calendar.todo,classification",0,Private,Privado,0
-selection,"calendar.todo,classification",0,Public,Público,0
-selection,"calendar.todo,status",0,,,0
-selection,"calendar.todo,status",0,Cancelled,Cancelada,0
-selection,"calendar.todo,status",0,Completed,Completado,0
-selection,"calendar.todo,status",0,In-Process,En proceso,0
-selection,"calendar.todo,status",0,Needs-Action,Necesita una acción,0
-view,calendar.todo,0,Attendees,Asistentes,0
-view,calendar.todo,0,Categories,Categorías,0
-view,calendar.todo,0,General,General,0
-view,calendar.todo,0,Recurrences,Recurrencias,0
-view,calendar.todo,0,Todo,Tarea,0
-view,calendar.todo,0,Todos,Tareas,0
-view,calendar.todo.attendee,0,Attendee,Asistentes,0
-view,calendar.todo.attendee,0,Attendees,Asistentes,0
-view,calendar.todo.exdate,0,Exception Date,Fecha excluida,0
-view,calendar.todo.exdate,0,Exception Dates,Fechas excluidas,0
-view,calendar.todo.exrule,0,Exception Rule,Regla de excepción,0
-view,calendar.todo.exrule,0,Exception Rules,Reglas de excepciones,0
-view,calendar.todo.rdate,0,Recurrence Date,Fecha de recurrencia,0
-view,calendar.todo.rdate,0,Recurrence Dates,Fechas de recurrencia,0
-view,calendar.todo.rrule,0,Recurrence Rule,Regla de recurrencia,0
-view,calendar.todo.rrule,0,Recurrence Rules,Reglas de recurrencia,0
diff --git a/fr_FR.csv b/fr_FR.csv
deleted file mode 100644
index 47863e2..0000000
--- a/fr_FR.csv
+++ /dev/null
@@ -1,92 +0,0 @@
-type,name,res_id,src,value,fuzzy
-error,calendar.todo,0,Recurrence can not be recurrent!,Une récurrence ne peut pas être récurrente !,0
-error,calendar.todo,0,UUID and recurrence must be unique in a calendar!,UUID et récurrence doivent être uniques sur un calendrier !,0
-field,"calendar.todo,alarms",0,Alarms,Alarmes,0
-field,"calendar.todo,attendees",0,Attendees,Participants,0
-field,"calendar.todo,calendar",0,Calendar,Calendrier,0
-field,"calendar.todo,calendar_owner",0,Owner,Propriétaire,0
-field,"calendar.todo,calendar_read_users",0,Read Users,Utilisateurs en lecture,0
-field,"calendar.todo,calendar_write_users",0,Write Users,Utilisateurs en écriture,0
-field,"calendar.todo,categories",0,Categories,Catégories,0
-field,"calendar.todo,classification",0,Classification,Classification,0
-field,"calendar.todo,completed",0,Completed,Complété,0
-field,"calendar.todo,description",0,Description,Description,0
-field,"calendar.todo,dtstart",0,Start Date,Date de début,0
-field,"calendar.todo,due",0,Due Date,Date d'échéance,0
-field,"calendar.todo,exdates",0,Exception Dates,Dates d'exception,0
-field,"calendar.todo,exrules",0,Exception Rules,Règles d'exception,0
-field,"calendar.todo,location",0,Location,Emplacement,0
-field,"calendar.todo,occurences",0,Occurences,Occurrences,0
-field,"calendar.todo,organizer",0,Organizer,Organisateur,0
-field,"calendar.todo,parent",0,Parent,Parent,0
-field,"calendar.todo,percent_complete",0,Percent complete,Pourcentage effectué,0
-field,"calendar.todo,rdates",0,Recurrence Dates,Dates de récurrence,0
-field,"calendar.todo,rec_name",0,Name,Nom,0
-field,"calendar.todo,recurrence",0,Recurrence,Récurrence,0
-field,"calendar.todo,rrules",0,Recurrence Rules,Règles de récurrence,0
-field,"calendar.todo,sequence",0,Sequence,Séquence,0
-field,"calendar.todo,status",0,Status,Statut,0
-field,"calendar.todo,summary",0,Summary,Résumé,0
-field,"calendar.todo,timezone",0,Timezone,Fuseau Horaire,0
-field,"calendar.todo,uuid",0,UUID,UUID,0
-field,"calendar.todo,vtodo",0,vtodo,vtodo,0
-field,"calendar.todo-calendar.category,category",0,Category,Catégorie,0
-field,"calendar.todo-calendar.category,rec_name",0,Name,Nom,0
-field,"calendar.todo-calendar.category,todo",0,To-Do,Tâche,0
-field,"calendar.todo.alarm,calendar_alarm",0,Calendar Alarm,Alarme calendrier,0
-field,"calendar.todo.alarm,rec_name",0,Name,Nom,0
-field,"calendar.todo.alarm,todo",0,Todo,Tâche,0
-field,"calendar.todo.attendee,calendar_attendee",0,Calendar Attendee,Participant calendrier,0
-field,"calendar.todo.attendee,rec_name",0,Name,Nom,0
-field,"calendar.todo.attendee,todo",0,Todo,Tâche,0
-field,"calendar.todo.exdate,calendar_date",0,Calendar Date,Date calendrier,0
-field,"calendar.todo.exdate,rec_name",0,Name,Nom,0
-field,"calendar.todo.exdate,todo",0,Todo,Tâche,0
-field,"calendar.todo.exrule,calendar_rrule",0,Calendar RRule,Règle de récurrence,0
-field,"calendar.todo.exrule,rec_name",0,Name,Nom,0
-field,"calendar.todo.exrule,todo",0,Todo,Tâche,0
-field,"calendar.todo.rdate,calendar_date",0,Calendar Date,Date calendrier,0
-field,"calendar.todo.rdate,rec_name",0,Name,Nom,0
-field,"calendar.todo.rdate,todo",0,Todo,Tâche,0
-field,"calendar.todo.rrule,calendar_rrule",0,Calendar RRule,Règle de récurrence,0
-field,"calendar.todo.rrule,rec_name",0,Name,Nom,0
-field,"calendar.todo.rrule,todo",0,Todo,Tâche,0
-help,"calendar.todo,uuid",0,Universally Unique Identifier,Identificateur unique universel,0
-model,"calendar.todo,name",0,Todo,Tâche,0
-model,"calendar.todo-calendar.category,name",0,Todo - Category,Todo - Catégorie,0
-model,"calendar.todo.alarm,name",0,Alarm,Alarme,0
-model,"calendar.todo.attendee,name",0,Attendee,Participant,0
-model,"calendar.todo.exdate,name",0,Exception Date,Date d'exception,0
-model,"calendar.todo.exrule,name",0,Exception Rule,Règle d'exception,0
-model,"calendar.todo.rdate,name",0,Todo Recurrence Date,Date de récurrence,0
-model,"calendar.todo.rrule,name",0,Recurrence Rule,Règle de récurrence,0
-model,"ir.action,name",act_todo_form,Todos,Tâches,0
-model,"ir.action,name",act_todo_form2,Todos,Tâches,0
-model,"ir.action,name",act_todo_form3,Todos,Tâches,0
-model,"ir.ui.menu,name",menu_todo_form,Todos,Tâches,0
-model,"ir.ui.menu,name",menu_todo_form2,New Todo,Nouvelle tâche,0
-selection,"calendar.todo,classification",0,Confidential,Confidentiel,0
-selection,"calendar.todo,classification",0,Private,Privé,0
-selection,"calendar.todo,classification",0,Public,Publique,0
-selection,"calendar.todo,status",0,,,0
-selection,"calendar.todo,status",0,Cancelled,Annulé,0
-selection,"calendar.todo,status",0,Completed,Complété,0
-selection,"calendar.todo,status",0,In-Process,En court,0
-selection,"calendar.todo,status",0,Needs-Action,Nécessite une action,0
-view,calendar.todo,0,Attendees,Participants,0
-view,calendar.todo,0,Categories,Catégories,0
-view,calendar.todo,0,General,Général,0
-view,calendar.todo,0,Occurences,Occurrences,0
-view,calendar.todo,0,Recurrences,Récurrences,0
-view,calendar.todo,0,Todo,Tâche,0
-view,calendar.todo,0,Todos,Tâches,0
-view,calendar.todo.attendee,0,Attendee,Participant,0
-view,calendar.todo.attendee,0,Attendees,Participants,0
-view,calendar.todo.exdate,0,Exception Date,Date d'exception,0
-view,calendar.todo.exdate,0,Exception Dates,Dates d'exception,0
-view,calendar.todo.exrule,0,Exception Rule,Règle d'exception,0
-view,calendar.todo.exrule,0,Exception Rules,Règles d'exception,0
-view,calendar.todo.rdate,0,Recurrence Date,Date de récurrence,0
-view,calendar.todo.rdate,0,Recurrence Dates,Dates de récurrence,0
-view,calendar.todo.rrule,0,Recurrence Rule,Règle de récurrence,0
-view,calendar.todo.rrule,0,Recurrence Rules,Règles de récurrence,0
diff --git a/locale/bg_BG.po b/locale/bg_BG.po
new file mode 100644
index 0000000..ca18ebd
--- /dev/null
+++ b/locale/bg_BG.po
@@ -0,0 +1,355 @@
+# 
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "error:calendar.todo:0"
+msgid "Recurrence can not be recurrent!"
+msgstr "Повторението не може да е периодично!"
+
+msgctxt "error:calendar.todo:0"
+msgid "UUID and recurrence must be unique in a calendar!"
+msgstr "UUID и взаимна вложеност трябва да са уникални в календар!"
+
+msgctxt "field:calendar.todo,alarms:0"
+msgid "Alarms"
+msgstr "Аларми"
+
+msgctxt "field:calendar.todo,attendees:0"
+msgid "Attendees"
+msgstr "Присъстващи"
+
+msgctxt "field:calendar.todo,calendar:0"
+msgid "Calendar"
+msgstr "Календар"
+
+msgctxt "field:calendar.todo,calendar_owner:0"
+msgid "Owner"
+msgstr "Собственик"
+
+msgctxt "field:calendar.todo,calendar_read_users:0"
+msgid "Read Users"
+msgstr "Потребители с права за четене"
+
+msgctxt "field:calendar.todo,calendar_write_users:0"
+msgid "Write Users"
+msgstr "Записване на потребители"
+
+msgctxt "field:calendar.todo,categories:0"
+msgid "Categories"
+msgstr "Категории"
+
+msgctxt "field:calendar.todo,classification:0"
+msgid "Classification"
+msgstr "Класификация"
+
+msgctxt "field:calendar.todo,completed:0"
+msgid "Completed"
+msgstr "Изпълнен"
+
+msgctxt "field:calendar.todo,description:0"
+msgid "Description"
+msgstr "Описание"
+
+msgctxt "field:calendar.todo,dtstart:0"
+msgid "Start Date"
+msgstr "Начална дата"
+
+msgctxt "field:calendar.todo,due:0"
+msgid "Due Date"
+msgstr "Дата на изпълнение"
+
+msgctxt "field:calendar.todo,exdates:0"
+msgid "Exception Dates"
+msgstr "Дати на грешките"
+
+msgctxt "field:calendar.todo,exrules:0"
+msgid "Exception Rules"
+msgstr "Правила при грешка"
+
+msgctxt "field:calendar.todo,location:0"
+msgid "Location"
+msgstr "Местоположение"
+
+msgctxt "field:calendar.todo,occurences:0"
+msgid "Occurences"
+msgstr "Събития"
+
+msgctxt "field:calendar.todo,organizer:0"
+msgid "Organizer"
+msgstr "Организатор"
+
+msgctxt "field:calendar.todo,parent:0"
+msgid "Parent"
+msgstr "Родител"
+
+msgctxt "field:calendar.todo,percent_complete:0"
+msgid "Percent complete"
+msgstr "Процент изпълнено"
+
+msgctxt "field:calendar.todo,rdates:0"
+msgid "Recurrence Dates"
+msgstr "Дати на повторяемост"
+
+msgctxt "field:calendar.todo,rec_name:0"
+msgid "Name"
+msgstr "Име"
+
+msgctxt "field:calendar.todo,recurrence:0"
+msgid "Recurrence"
+msgstr "Повторение"
+
+msgctxt "field:calendar.todo,rrules:0"
+msgid "Recurrence Rules"
+msgstr "Правила за повторяемост"
+
+msgctxt "field:calendar.todo,sequence:0"
+msgid "Sequence"
+msgstr "Последователност"
+
+msgctxt "field:calendar.todo,status:0"
+msgid "Status"
+msgstr "Състояние"
+
+msgctxt "field:calendar.todo,summary:0"
+msgid "Summary"
+msgstr "Обобщено"
+
+msgctxt "field:calendar.todo,timezone:0"
+msgid "Timezone"
+msgstr "Времева зона"
+
+msgctxt "field:calendar.todo,uuid:0"
+msgid "UUID"
+msgstr "UUID"
+
+msgctxt "field:calendar.todo,vtodo:0"
+msgid "vtodo"
+msgstr ""
+
+msgctxt "field:calendar.todo-calendar.category,category:0"
+msgid "Category"
+msgstr "Категория"
+
+msgctxt "field:calendar.todo-calendar.category,rec_name:0"
+msgid "Name"
+msgstr "Име"
+
+msgctxt "field:calendar.todo-calendar.category,todo:0"
+msgid "To-Do"
+msgstr "Задача"
+
+msgctxt "field:calendar.todo.alarm,calendar_alarm:0"
+msgid "Calendar Alarm"
+msgstr "Аларма на календар"
+
+msgctxt "field:calendar.todo.alarm,rec_name:0"
+msgid "Name"
+msgstr "Име"
+
+msgctxt "field:calendar.todo.alarm,todo:0"
+msgid "Todo"
+msgstr "Задача"
+
+msgctxt "field:calendar.todo.attendee,calendar_attendee:0"
+msgid "Calendar Attendee"
+msgstr "Присъстващ на календар"
+
+msgctxt "field:calendar.todo.attendee,rec_name:0"
+msgid "Name"
+msgstr "Име"
+
+msgctxt "field:calendar.todo.attendee,todo:0"
+msgid "Todo"
+msgstr "Задача"
+
+msgctxt "field:calendar.todo.exdate,calendar_date:0"
+msgid "Calendar Date"
+msgstr "Дата от календар"
+
+msgctxt "field:calendar.todo.exdate,rec_name:0"
+msgid "Name"
+msgstr "Име"
+
+msgctxt "field:calendar.todo.exdate,todo:0"
+msgid "Todo"
+msgstr "Задача"
+
+msgctxt "field:calendar.todo.exrule,calendar_rrule:0"
+msgid "Calendar RRule"
+msgstr ""
+
+msgctxt "field:calendar.todo.exrule,rec_name:0"
+msgid "Name"
+msgstr "Име"
+
+msgctxt "field:calendar.todo.exrule,todo:0"
+msgid "Todo"
+msgstr "Задача"
+
+msgctxt "field:calendar.todo.rdate,calendar_date:0"
+msgid "Calendar Date"
+msgstr "Дата от календар"
+
+msgctxt "field:calendar.todo.rdate,rec_name:0"
+msgid "Name"
+msgstr "Име"
+
+msgctxt "field:calendar.todo.rdate,todo:0"
+msgid "Todo"
+msgstr "Задача"
+
+msgctxt "field:calendar.todo.rrule,calendar_rrule:0"
+msgid "Calendar RRule"
+msgstr ""
+
+msgctxt "field:calendar.todo.rrule,rec_name:0"
+msgid "Name"
+msgstr "Име"
+
+msgctxt "field:calendar.todo.rrule,todo:0"
+msgid "Todo"
+msgstr "Задача"
+
+msgctxt "help:calendar.todo,uuid:0"
+msgid "Universally Unique Identifier"
+msgstr "Универсален иникален идентификатор"
+
+msgctxt "model:calendar.todo,name:0"
+msgid "Todo"
+msgstr "Задача"
+
+msgctxt "model:calendar.todo-calendar.category,name:0"
+msgid "Todo - Category"
+msgstr "Задача - Категория"
+
+msgctxt "model:calendar.todo.alarm,name:0"
+msgid "Alarm"
+msgstr "Аларма"
+
+msgctxt "model:calendar.todo.attendee,name:0"
+msgid "Attendee"
+msgstr "Присъстващ"
+
+msgctxt "model:calendar.todo.exdate,name:0"
+msgid "Exception Date"
+msgstr "Дата на грешка"
+
+msgctxt "model:calendar.todo.exrule,name:0"
+msgid "Exception Rule"
+msgstr "Правило при грешка"
+
+msgctxt "model:calendar.todo.rdate,name:0"
+msgid "Todo Recurrence Date"
+msgstr "Дата на повторение на задача"
+
+msgctxt "model:calendar.todo.rrule,name:0"
+msgid "Recurrence Rule"
+msgstr "Правило за повторение"
+
+msgctxt "model:ir.action,name:act_todo_form"
+msgid "Todos"
+msgstr "Задачи"
+
+msgctxt "model:ir.action,name:act_todo_form3"
+msgid "Todos"
+msgstr "Задачи"
+
+msgctxt "model:ir.ui.menu,name:menu_todo_form"
+msgid "Todos"
+msgstr "Задачи"
+
+msgctxt "selection:calendar.todo,classification:0"
+msgid "Confidential"
+msgstr "Поверителен"
+
+msgctxt "selection:calendar.todo,classification:0"
+msgid "Private"
+msgstr "Частен"
+
+msgctxt "selection:calendar.todo,classification:0"
+msgid "Public"
+msgstr "Публичен"
+
+msgctxt "selection:calendar.todo,status:0"
+msgid ""
+msgstr ""
+
+msgctxt "selection:calendar.todo,status:0"
+msgid "Cancelled"
+msgstr "Отказан"
+
+msgctxt "selection:calendar.todo,status:0"
+msgid "Completed"
+msgstr "Изпълнен"
+
+msgctxt "selection:calendar.todo,status:0"
+msgid "In-Process"
+msgstr "Обработва се"
+
+msgctxt "selection:calendar.todo,status:0"
+msgid "Needs-Action"
+msgstr "Необходимо е действие"
+
+msgctxt "view:calendar.todo.attendee:0"
+msgid "Attendee"
+msgstr "Присъстващ"
+
+msgctxt "view:calendar.todo.attendee:0"
+msgid "Attendees"
+msgstr "Присъстващи"
+
+msgctxt "view:calendar.todo.exdate:0"
+msgid "Exception Date"
+msgstr "Дата на грешка"
+
+msgctxt "view:calendar.todo.exdate:0"
+msgid "Exception Dates"
+msgstr "Дати на грешките"
+
+msgctxt "view:calendar.todo.exrule:0"
+msgid "Exception Rule"
+msgstr "Правило при грешка"
+
+msgctxt "view:calendar.todo.exrule:0"
+msgid "Exception Rules"
+msgstr "Правила при грешка"
+
+msgctxt "view:calendar.todo.rdate:0"
+msgid "Recurrence Date"
+msgstr "Повтаряща се дата"
+
+msgctxt "view:calendar.todo.rdate:0"
+msgid "Recurrence Dates"
+msgstr "Дати на повторяемост"
+
+msgctxt "view:calendar.todo.rrule:0"
+msgid "Recurrence Rule"
+msgstr "Правило за повторение"
+
+msgctxt "view:calendar.todo.rrule:0"
+msgid "Recurrence Rules"
+msgstr "Правила за повторяемост"
+
+msgctxt "view:calendar.todo:0"
+msgid "Attendees"
+msgstr "Присъстващи"
+
+msgctxt "view:calendar.todo:0"
+msgid "Categories"
+msgstr "Категории"
+
+msgctxt "view:calendar.todo:0"
+msgid "General"
+msgstr "Основен"
+
+msgctxt "view:calendar.todo:0"
+msgid "Occurences"
+msgstr "Събития"
+
+msgctxt "view:calendar.todo:0"
+msgid "Todo"
+msgstr "Задача"
+
+msgctxt "view:calendar.todo:0"
+msgid "Todos"
+msgstr "Задачи"
diff --git a/locale/cs_CZ.po b/locale/cs_CZ.po
new file mode 100644
index 0000000..952cc84
--- /dev/null
+++ b/locale/cs_CZ.po
@@ -0,0 +1,355 @@
+# 
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "error:calendar.todo:0"
+msgid "Recurrence can not be recurrent!"
+msgstr ""
+
+msgctxt "error:calendar.todo:0"
+msgid "UUID and recurrence must be unique in a calendar!"
+msgstr ""
+
+msgctxt "field:calendar.todo,alarms:0"
+msgid "Alarms"
+msgstr ""
+
+msgctxt "field:calendar.todo,attendees:0"
+msgid "Attendees"
+msgstr ""
+
+msgctxt "field:calendar.todo,calendar:0"
+msgid "Calendar"
+msgstr ""
+
+msgctxt "field:calendar.todo,calendar_owner:0"
+msgid "Owner"
+msgstr ""
+
+msgctxt "field:calendar.todo,calendar_read_users:0"
+msgid "Read Users"
+msgstr ""
+
+msgctxt "field:calendar.todo,calendar_write_users:0"
+msgid "Write Users"
+msgstr ""
+
+msgctxt "field:calendar.todo,categories:0"
+msgid "Categories"
+msgstr ""
+
+msgctxt "field:calendar.todo,classification:0"
+msgid "Classification"
+msgstr ""
+
+msgctxt "field:calendar.todo,completed:0"
+msgid "Completed"
+msgstr ""
+
+msgctxt "field:calendar.todo,description:0"
+msgid "Description"
+msgstr ""
+
+msgctxt "field:calendar.todo,dtstart:0"
+msgid "Start Date"
+msgstr ""
+
+msgctxt "field:calendar.todo,due:0"
+msgid "Due Date"
+msgstr ""
+
+msgctxt "field:calendar.todo,exdates:0"
+msgid "Exception Dates"
+msgstr ""
+
+msgctxt "field:calendar.todo,exrules:0"
+msgid "Exception Rules"
+msgstr ""
+
+msgctxt "field:calendar.todo,location:0"
+msgid "Location"
+msgstr ""
+
+msgctxt "field:calendar.todo,occurences:0"
+msgid "Occurences"
+msgstr ""
+
+msgctxt "field:calendar.todo,organizer:0"
+msgid "Organizer"
+msgstr ""
+
+msgctxt "field:calendar.todo,parent:0"
+msgid "Parent"
+msgstr ""
+
+msgctxt "field:calendar.todo,percent_complete:0"
+msgid "Percent complete"
+msgstr ""
+
+msgctxt "field:calendar.todo,rdates:0"
+msgid "Recurrence Dates"
+msgstr ""
+
+msgctxt "field:calendar.todo,rec_name:0"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:calendar.todo,recurrence:0"
+msgid "Recurrence"
+msgstr ""
+
+msgctxt "field:calendar.todo,rrules:0"
+msgid "Recurrence Rules"
+msgstr ""
+
+msgctxt "field:calendar.todo,sequence:0"
+msgid "Sequence"
+msgstr ""
+
+msgctxt "field:calendar.todo,status:0"
+msgid "Status"
+msgstr ""
+
+msgctxt "field:calendar.todo,summary:0"
+msgid "Summary"
+msgstr ""
+
+msgctxt "field:calendar.todo,timezone:0"
+msgid "Timezone"
+msgstr ""
+
+msgctxt "field:calendar.todo,uuid:0"
+msgid "UUID"
+msgstr ""
+
+msgctxt "field:calendar.todo,vtodo:0"
+msgid "vtodo"
+msgstr ""
+
+msgctxt "field:calendar.todo-calendar.category,category:0"
+msgid "Category"
+msgstr ""
+
+msgctxt "field:calendar.todo-calendar.category,rec_name:0"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:calendar.todo-calendar.category,todo:0"
+msgid "To-Do"
+msgstr ""
+
+msgctxt "field:calendar.todo.alarm,calendar_alarm:0"
+msgid "Calendar Alarm"
+msgstr ""
+
+msgctxt "field:calendar.todo.alarm,rec_name:0"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:calendar.todo.alarm,todo:0"
+msgid "Todo"
+msgstr ""
+
+msgctxt "field:calendar.todo.attendee,calendar_attendee:0"
+msgid "Calendar Attendee"
+msgstr ""
+
+msgctxt "field:calendar.todo.attendee,rec_name:0"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:calendar.todo.attendee,todo:0"
+msgid "Todo"
+msgstr ""
+
+msgctxt "field:calendar.todo.exdate,calendar_date:0"
+msgid "Calendar Date"
+msgstr ""
+
+msgctxt "field:calendar.todo.exdate,rec_name:0"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:calendar.todo.exdate,todo:0"
+msgid "Todo"
+msgstr ""
+
+msgctxt "field:calendar.todo.exrule,calendar_rrule:0"
+msgid "Calendar RRule"
+msgstr ""
+
+msgctxt "field:calendar.todo.exrule,rec_name:0"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:calendar.todo.exrule,todo:0"
+msgid "Todo"
+msgstr ""
+
+msgctxt "field:calendar.todo.rdate,calendar_date:0"
+msgid "Calendar Date"
+msgstr ""
+
+msgctxt "field:calendar.todo.rdate,rec_name:0"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:calendar.todo.rdate,todo:0"
+msgid "Todo"
+msgstr ""
+
+msgctxt "field:calendar.todo.rrule,calendar_rrule:0"
+msgid "Calendar RRule"
+msgstr ""
+
+msgctxt "field:calendar.todo.rrule,rec_name:0"
+msgid "Name"
+msgstr ""
+
+msgctxt "field:calendar.todo.rrule,todo:0"
+msgid "Todo"
+msgstr ""
+
+msgctxt "help:calendar.todo,uuid:0"
+msgid "Universally Unique Identifier"
+msgstr ""
+
+msgctxt "model:calendar.todo,name:0"
+msgid "Todo"
+msgstr ""
+
+msgctxt "model:calendar.todo-calendar.category,name:0"
+msgid "Todo - Category"
+msgstr ""
+
+msgctxt "model:calendar.todo.alarm,name:0"
+msgid "Alarm"
+msgstr ""
+
+msgctxt "model:calendar.todo.attendee,name:0"
+msgid "Attendee"
+msgstr ""
+
+msgctxt "model:calendar.todo.exdate,name:0"
+msgid "Exception Date"
+msgstr ""
+
+msgctxt "model:calendar.todo.exrule,name:0"
+msgid "Exception Rule"
+msgstr ""
+
+msgctxt "model:calendar.todo.rdate,name:0"
+msgid "Todo Recurrence Date"
+msgstr ""
+
+msgctxt "model:calendar.todo.rrule,name:0"
+msgid "Recurrence Rule"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_todo_form"
+msgid "Todos"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_todo_form3"
+msgid "Todos"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_todo_form"
+msgid "Todos"
+msgstr ""
+
+msgctxt "selection:calendar.todo,classification:0"
+msgid "Confidential"
+msgstr ""
+
+msgctxt "selection:calendar.todo,classification:0"
+msgid "Private"
+msgstr ""
+
+msgctxt "selection:calendar.todo,classification:0"
+msgid "Public"
+msgstr ""
+
+msgctxt "selection:calendar.todo,status:0"
+msgid ""
+msgstr ""
+
+msgctxt "selection:calendar.todo,status:0"
+msgid "Cancelled"
+msgstr ""
+
+msgctxt "selection:calendar.todo,status:0"
+msgid "Completed"
+msgstr ""
+
+msgctxt "selection:calendar.todo,status:0"
+msgid "In-Process"
+msgstr ""
+
+msgctxt "selection:calendar.todo,status:0"
+msgid "Needs-Action"
+msgstr ""
+
+msgctxt "view:calendar.todo.attendee:0"
+msgid "Attendee"
+msgstr ""
+
+msgctxt "view:calendar.todo.attendee:0"
+msgid "Attendees"
+msgstr ""
+
+msgctxt "view:calendar.todo.exdate:0"
+msgid "Exception Date"
+msgstr ""
+
+msgctxt "view:calendar.todo.exdate:0"
+msgid "Exception Dates"
+msgstr ""
+
+msgctxt "view:calendar.todo.exrule:0"
+msgid "Exception Rule"
+msgstr ""
+
+msgctxt "view:calendar.todo.exrule:0"
+msgid "Exception Rules"
+msgstr ""
+
+msgctxt "view:calendar.todo.rdate:0"
+msgid "Recurrence Date"
+msgstr ""
+
+msgctxt "view:calendar.todo.rdate:0"
+msgid "Recurrence Dates"
+msgstr ""
+
+msgctxt "view:calendar.todo.rrule:0"
+msgid "Recurrence Rule"
+msgstr ""
+
+msgctxt "view:calendar.todo.rrule:0"
+msgid "Recurrence Rules"
+msgstr ""
+
+msgctxt "view:calendar.todo:0"
+msgid "Attendees"
+msgstr ""
+
+msgctxt "view:calendar.todo:0"
+msgid "Categories"
+msgstr ""
+
+msgctxt "view:calendar.todo:0"
+msgid "General"
+msgstr ""
+
+msgctxt "view:calendar.todo:0"
+msgid "Occurences"
+msgstr ""
+
+msgctxt "view:calendar.todo:0"
+msgid "Todo"
+msgstr ""
+
+msgctxt "view:calendar.todo:0"
+msgid "Todos"
+msgstr ""
diff --git a/locale/de_DE.po b/locale/de_DE.po
new file mode 100644
index 0000000..e83f5d4
--- /dev/null
+++ b/locale/de_DE.po
@@ -0,0 +1,361 @@
+# 
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "error:calendar.todo:0"
+msgid "Recurrence can not be recurrent!"
+msgstr "Wiederholungen können nicht rekursiv sein!"
+
+msgctxt "error:calendar.todo: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 "field:calendar.todo,alarms:0"
+msgid "Alarms"
+msgstr "Alarm"
+
+msgctxt "field:calendar.todo,attendees:0"
+msgid "Attendees"
+msgstr "Teilnehmer"
+
+msgctxt "field:calendar.todo,calendar:0"
+msgid "Calendar"
+msgstr "Kalender"
+
+msgctxt "field:calendar.todo,calendar_owner:0"
+msgid "Owner"
+msgstr "Besitzer"
+
+msgctxt "field:calendar.todo,calendar_read_users:0"
+msgid "Read Users"
+msgstr "Benutzer mit Leseberechtigung"
+
+msgctxt "field:calendar.todo,calendar_write_users:0"
+msgid "Write Users"
+msgstr "Benutzer mit Schreibberechtigung"
+
+msgctxt "field:calendar.todo,categories:0"
+msgid "Categories"
+msgstr "Kategorien"
+
+msgctxt "field:calendar.todo,classification:0"
+msgid "Classification"
+msgstr "Klassifizierung"
+
+msgctxt "field:calendar.todo,completed:0"
+msgid "Completed"
+msgstr "Abgeschlossen"
+
+msgctxt "field:calendar.todo,description:0"
+msgid "Description"
+msgstr "Bezeichnung"
+
+msgctxt "field:calendar.todo,dtstart:0"
+msgid "Start Date"
+msgstr "Anfangsdatum"
+
+msgctxt "field:calendar.todo,due:0"
+msgid "Due Date"
+msgstr "Fälligkeitsdatum"
+
+msgctxt "field:calendar.todo,exdates:0"
+msgid "Exception Dates"
+msgstr "Ausnahmedaten"
+
+msgctxt "field:calendar.todo,exrules:0"
+msgid "Exception Rules"
+msgstr "Ausnahmeregeln"
+
+msgctxt "field:calendar.todo,location:0"
+msgid "Location"
+msgstr "Ort"
+
+msgctxt "field:calendar.todo,occurences:0"
+msgid "Occurences"
+msgstr "Ereignisse"
+
+msgctxt "field:calendar.todo,organizer:0"
+msgid "Organizer"
+msgstr "Organisator"
+
+msgctxt "field:calendar.todo,parent:0"
+msgid "Parent"
+msgstr "Übergeordnet (Aufgabe)"
+
+msgctxt "field:calendar.todo,percent_complete:0"
+msgid "Percent complete"
+msgstr "% erledigt"
+
+msgctxt "field:calendar.todo,rdates:0"
+msgid "Recurrence Dates"
+msgstr "Wiederholungsdaten"
+
+msgctxt "field:calendar.todo,rec_name:0"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:calendar.todo,recurrence:0"
+msgid "Recurrence"
+msgstr "Wiederholung"
+
+msgctxt "field:calendar.todo,rrules:0"
+msgid "Recurrence Rules"
+msgstr "Wiederholungsregeln"
+
+msgctxt "field:calendar.todo,sequence:0"
+msgid "Sequence"
+msgstr "Revision"
+
+msgctxt "field:calendar.todo,status:0"
+msgid "Status"
+msgstr "Status"
+
+msgctxt "field:calendar.todo,summary:0"
+msgid "Summary"
+msgstr "Zusammenfassung"
+
+msgctxt "field:calendar.todo,timezone:0"
+msgid "Timezone"
+msgstr "Zeitzone"
+
+msgctxt "field:calendar.todo,uuid:0"
+msgid "UUID"
+msgstr "UUID"
+
+msgctxt "field:calendar.todo,vtodo:0"
+msgid "vtodo"
+msgstr "vtodo"
+
+msgctxt "field:calendar.todo-calendar.category,category:0"
+msgid "Category"
+msgstr "Kategorie"
+
+msgctxt "field:calendar.todo-calendar.category,rec_name:0"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:calendar.todo-calendar.category,todo:0"
+msgid "To-Do"
+msgstr "Aufgabe"
+
+msgctxt "field:calendar.todo.alarm,calendar_alarm:0"
+msgid "Calendar Alarm"
+msgstr "Kalender Alarm"
+
+msgctxt "field:calendar.todo.alarm,rec_name:0"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:calendar.todo.alarm,todo:0"
+msgid "Todo"
+msgstr "Aufgabe"
+
+msgctxt "field:calendar.todo.attendee,calendar_attendee:0"
+msgid "Calendar Attendee"
+msgstr "Kalender Teilnehmer"
+
+msgctxt "field:calendar.todo.attendee,rec_name:0"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:calendar.todo.attendee,todo:0"
+msgid "Todo"
+msgstr "Aufgabe"
+
+msgctxt "field:calendar.todo.exdate,calendar_date:0"
+msgid "Calendar Date"
+msgstr "Kalender Datum"
+
+msgctxt "field:calendar.todo.exdate,rec_name:0"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:calendar.todo.exdate,todo:0"
+msgid "Todo"
+msgstr "Aufgabe"
+
+msgctxt "field:calendar.todo.exrule,calendar_rrule:0"
+msgid "Calendar RRule"
+msgstr "Kalender WRegel"
+
+msgctxt "field:calendar.todo.exrule,rec_name:0"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:calendar.todo.exrule,todo:0"
+msgid "Todo"
+msgstr "Aufgabe"
+
+msgctxt "field:calendar.todo.rdate,calendar_date:0"
+msgid "Calendar Date"
+msgstr "Kalender Datum"
+
+msgctxt "field:calendar.todo.rdate,rec_name:0"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:calendar.todo.rdate,todo:0"
+msgid "Todo"
+msgstr "Aufgabe"
+
+msgctxt "field:calendar.todo.rrule,calendar_rrule:0"
+msgid "Calendar RRule"
+msgstr "Kalender WRegel"
+
+msgctxt "field:calendar.todo.rrule,rec_name:0"
+msgid "Name"
+msgstr "Name"
+
+msgctxt "field:calendar.todo.rrule,todo:0"
+msgid "Todo"
+msgstr "Aufgabe"
+
+msgctxt "help:calendar.todo,uuid:0"
+msgid "Universally Unique Identifier"
+msgstr "Universally Unique Identifier"
+
+msgctxt "model:calendar.todo,name:0"
+msgid "Todo"
+msgstr "Aufgabe"
+
+msgctxt "model:calendar.todo-calendar.category,name:0"
+msgid "Todo - Category"
+msgstr "Aufgabe - Kategorie"
+
+msgctxt "model:calendar.todo.alarm,name:0"
+msgid "Alarm"
+msgstr "Alarm"
+
+msgctxt "model:calendar.todo.attendee,name:0"
+msgid "Attendee"
+msgstr "Teilnehmer"
+
+msgctxt "model:calendar.todo.exdate,name:0"
+msgid "Exception Date"
+msgstr "Ausnahmedatum"
+
+msgctxt "model:calendar.todo.exrule,name:0"
+msgid "Exception Rule"
+msgstr "Ausnahmeregel"
+
+msgctxt "model:calendar.todo.rdate,name:0"
+msgid "Todo Recurrence Date"
+msgstr "Aufgabe Wiederholungsdatum"
+
+msgctxt "model:calendar.todo.rrule,name:0"
+msgid "Recurrence Rule"
+msgstr "Wiederholungsregel"
+
+msgctxt "model:ir.action,name:act_todo_form"
+msgid "Todos"
+msgstr "Aufgaben"
+
+msgctxt "model:ir.action,name:act_todo_form3"
+msgid "Todos"
+msgstr "Aufgaben"
+
+msgctxt "model:ir.ui.menu,name:menu_todo_form"
+msgid "Todos"
+msgstr "Aufgaben"
+
+msgctxt "selection:calendar.todo,classification:0"
+msgid "Confidential"
+msgstr "Vertraulich"
+
+msgctxt "selection:calendar.todo,classification:0"
+msgid "Private"
+msgstr "Privat"
+
+msgctxt "selection:calendar.todo,classification:0"
+msgid "Public"
+msgstr "Öffentlich"
+
+msgctxt "selection:calendar.todo,status:0"
+msgid ""
+msgstr ""
+
+msgctxt "selection:calendar.todo,status:0"
+msgid "Cancelled"
+msgstr "Abgesagt"
+
+msgctxt "selection:calendar.todo,status:0"
+msgid "Completed"
+msgstr "Abgeschlossen"
+
+msgctxt "selection:calendar.todo,status:0"
+msgid "In-Process"
+msgstr "In Arbeit"
+
+msgctxt "selection:calendar.todo,status:0"
+msgid "Needs-Action"
+msgstr "Benötigt Eingriff"
+
+msgctxt "view:calendar.todo.attendee:0"
+msgid "Attendee"
+msgstr "Teilnehmer"
+
+msgctxt "view:calendar.todo.attendee:0"
+msgid "Attendees"
+msgstr "Teilnehmer"
+
+msgctxt "view:calendar.todo.exdate:0"
+msgid "Exception Date"
+msgstr "Ausnahmedatum"
+
+msgctxt "view:calendar.todo.exdate:0"
+msgid "Exception Dates"
+msgstr "Ausnahmedaten"
+
+msgctxt "view:calendar.todo.exrule:0"
+msgid "Exception Rule"
+msgstr "Ausnahmeregel"
+
+msgctxt "view:calendar.todo.exrule:0"
+msgid "Exception Rules"
+msgstr "Ausnahmeregeln"
+
+msgctxt "view:calendar.todo.rdate:0"
+msgid "Recurrence Date"
+msgstr "Wiederholungsdatum"
+
+msgctxt "view:calendar.todo.rdate:0"
+msgid "Recurrence Dates"
+msgstr "Wiederholungsdaten"
+
+msgctxt "view:calendar.todo.rrule:0"
+msgid "Recurrence Rule"
+msgstr "Wiederholungsregel"
+
+msgctxt "view:calendar.todo.rrule:0"
+msgid "Recurrence Rules"
+msgstr "Wiederholungsregeln"
+
+msgctxt "view:calendar.todo:0"
+msgid "Attendees"
+msgstr "Teilnehmer"
+
+msgctxt "view:calendar.todo:0"
+msgid "Categories"
+msgstr "Kategorien"
+
+msgctxt "view:calendar.todo:0"
+msgid "General"
+msgstr "Allgemein"
+
+msgctxt "view:calendar.todo:0"
+msgid "Occurences"
+msgstr "Ereignisse"
+
+msgctxt "view:calendar.todo:0"
+msgid "Recurrences"
+msgstr "Wiederholungen"
+
+msgctxt "view:calendar.todo:0"
+msgid "Todo"
+msgstr "Aufgabe"
+
+msgctxt "view:calendar.todo:0"
+msgid "Todos"
+msgstr "Aufgaben"
diff --git a/locale/es_CO.po b/locale/es_CO.po
new file mode 100644
index 0000000..90e30ea
--- /dev/null
+++ b/locale/es_CO.po
@@ -0,0 +1,365 @@
+# 
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "error:calendar.todo:0"
+msgid "Recurrence can not be recurrent!"
+msgstr "¡La repetición no puede repetirse!"
+
+msgctxt "error:calendar.todo:0"
+msgid "UUID and recurrence must be unique in a calendar!"
+msgstr "¡El UUID y la recurrencia deben ser únicos por calendario! "
+
+msgctxt "field:calendar.todo,alarms:0"
+msgid "Alarms"
+msgstr "Alarmas"
+
+msgctxt "field:calendar.todo,attendees:0"
+msgid "Attendees"
+msgstr "Asistentes"
+
+msgctxt "field:calendar.todo,calendar:0"
+msgid "Calendar"
+msgstr "Calendario"
+
+msgctxt "field:calendar.todo,calendar_owner:0"
+msgid "Owner"
+msgstr "Propietario"
+
+msgctxt "field:calendar.todo,calendar_read_users:0"
+msgid "Read Users"
+msgstr "Leer Usuarios"
+
+msgctxt "field:calendar.todo,calendar_write_users:0"
+msgid "Write Users"
+msgstr "Escribir Usuarios"
+
+msgctxt "field:calendar.todo,categories:0"
+msgid "Categories"
+msgstr "Categorías"
+
+msgctxt "field:calendar.todo,classification:0"
+msgid "Classification"
+msgstr "Clasificación"
+
+msgctxt "field:calendar.todo,completed:0"
+msgid "Completed"
+msgstr ""
+
+msgctxt "field:calendar.todo,description:0"
+msgid "Description"
+msgstr "Descripción"
+
+msgctxt "field:calendar.todo,dtstart:0"
+msgid "Start Date"
+msgstr "Fecha Inicio"
+
+msgctxt "field:calendar.todo,due:0"
+msgid "Due Date"
+msgstr ""
+
+msgctxt "field:calendar.todo,exdates:0"
+msgid "Exception Dates"
+msgstr "Fechas de Excepción"
+
+msgctxt "field:calendar.todo,exrules:0"
+msgid "Exception Rules"
+msgstr "Reglas de Excepción"
+
+msgctxt "field:calendar.todo,location:0"
+msgid "Location"
+msgstr "Lugar"
+
+msgctxt "field:calendar.todo,occurences:0"
+msgid "Occurences"
+msgstr "Ocurrencias"
+
+msgctxt "field:calendar.todo,organizer:0"
+msgid "Organizer"
+msgstr "Organizador"
+
+msgctxt "field:calendar.todo,parent:0"
+msgid "Parent"
+msgstr "Padre"
+
+msgctxt "field:calendar.todo,percent_complete:0"
+msgid "Percent complete"
+msgstr ""
+
+msgctxt "field:calendar.todo,rdates:0"
+msgid "Recurrence Dates"
+msgstr "Fechas de Repetición"
+
+msgctxt "field:calendar.todo,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:calendar.todo,recurrence:0"
+msgid "Recurrence"
+msgstr "Repetición"
+
+msgctxt "field:calendar.todo,rrules:0"
+msgid "Recurrence Rules"
+msgstr "Reglas de Repetición"
+
+msgctxt "field:calendar.todo,sequence:0"
+msgid "Sequence"
+msgstr "Secuencia"
+
+msgctxt "field:calendar.todo,status:0"
+msgid "Status"
+msgstr "Estado"
+
+msgctxt "field:calendar.todo,summary:0"
+msgid "Summary"
+msgstr "Resumen"
+
+msgctxt "field:calendar.todo,timezone:0"
+msgid "Timezone"
+msgstr "Zona horaria"
+
+msgctxt "field:calendar.todo,uuid:0"
+msgid "UUID"
+msgstr "UUID"
+
+msgctxt "field:calendar.todo,vtodo:0"
+msgid "vtodo"
+msgstr ""
+
+msgctxt "field:calendar.todo-calendar.category,category:0"
+msgid "Category"
+msgstr "Categoría"
+
+msgctxt "field:calendar.todo-calendar.category,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:calendar.todo-calendar.category,todo:0"
+msgid "To-Do"
+msgstr ""
+
+msgctxt "field:calendar.todo.alarm,calendar_alarm:0"
+msgid "Calendar Alarm"
+msgstr ""
+
+msgctxt "field:calendar.todo.alarm,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:calendar.todo.alarm,todo:0"
+msgid "Todo"
+msgstr ""
+
+msgctxt "field:calendar.todo.attendee,calendar_attendee:0"
+msgid "Calendar Attendee"
+msgstr ""
+
+msgctxt "field:calendar.todo.attendee,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:calendar.todo.attendee,todo:0"
+msgid "Todo"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.todo.exdate,calendar_date:0"
+msgid "Calendar Date"
+msgstr "Fecha Calendario"
+
+msgctxt "field:calendar.todo.exdate,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:calendar.todo.exdate,todo:0"
+msgid "Todo"
+msgstr ""
+
+msgctxt "field:calendar.todo.exrule,calendar_rrule:0"
+msgid "Calendar RRule"
+msgstr ""
+
+msgctxt "field:calendar.todo.exrule,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:calendar.todo.exrule,todo:0"
+msgid "Todo"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.todo.rdate,calendar_date:0"
+msgid "Calendar Date"
+msgstr "Fecha Calendario"
+
+msgctxt "field:calendar.todo.rdate,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:calendar.todo.rdate,todo:0"
+msgid "Todo"
+msgstr ""
+
+msgctxt "field:calendar.todo.rrule,calendar_rrule:0"
+msgid "Calendar RRule"
+msgstr ""
+
+msgctxt "field:calendar.todo.rrule,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:calendar.todo.rrule,todo:0"
+msgid "Todo"
+msgstr ""
+
+msgctxt "help:calendar.todo,uuid:0"
+msgid "Universally Unique Identifier"
+msgstr "Identificador Único Universal"
+
+msgctxt "model:calendar.todo,name:0"
+msgid "Todo"
+msgstr ""
+
+msgctxt "model:calendar.todo-calendar.category,name:0"
+msgid "Todo - Category"
+msgstr ""
+
+msgctxt "model:calendar.todo.alarm,name:0"
+msgid "Alarm"
+msgstr "Alarma"
+
+msgctxt "model:calendar.todo.attendee,name:0"
+msgid "Attendee"
+msgstr "Asistente"
+
+msgctxt "model:calendar.todo.exdate,name:0"
+msgid "Exception Date"
+msgstr "Fecha de Excepción"
+
+msgctxt "model:calendar.todo.exrule,name:0"
+msgid "Exception Rule"
+msgstr "Regla de Excepción"
+
+#, fuzzy
+msgctxt "model:calendar.todo.rdate,name:0"
+msgid "Todo Recurrence Date"
+msgstr "Fecha de Repetición"
+
+msgctxt "model:calendar.todo.rrule,name:0"
+msgid "Recurrence Rule"
+msgstr "Regla de Repetición"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_todo_form"
+msgid "Todos"
+msgstr "Por hacer"
+
+msgctxt "model:ir.action,name:act_todo_form3"
+msgid "Todos"
+msgstr "Por hacer"
+
+#, fuzzy
+msgctxt "model:ir.ui.menu,name:menu_todo_form"
+msgid "Todos"
+msgstr "Por hacer"
+
+msgctxt "selection:calendar.todo,classification:0"
+msgid "Confidential"
+msgstr "Confidencial"
+
+msgctxt "selection:calendar.todo,classification:0"
+msgid "Private"
+msgstr "Privado"
+
+msgctxt "selection:calendar.todo,classification:0"
+msgid "Public"
+msgstr "Público"
+
+msgctxt "selection:calendar.todo,status:0"
+msgid ""
+msgstr ""
+
+msgctxt "selection:calendar.todo,status:0"
+msgid "Cancelled"
+msgstr "Cancelado"
+
+msgctxt "selection:calendar.todo,status:0"
+msgid "Completed"
+msgstr ""
+
+msgctxt "selection:calendar.todo,status:0"
+msgid "In-Process"
+msgstr ""
+
+msgctxt "selection:calendar.todo,status:0"
+msgid "Needs-Action"
+msgstr ""
+
+msgctxt "view:calendar.todo.attendee:0"
+msgid "Attendee"
+msgstr "Asistente"
+
+msgctxt "view:calendar.todo.attendee:0"
+msgid "Attendees"
+msgstr "Asistentes"
+
+msgctxt "view:calendar.todo.exdate:0"
+msgid "Exception Date"
+msgstr "Fecha de Excepción"
+
+msgctxt "view:calendar.todo.exdate:0"
+msgid "Exception Dates"
+msgstr "Fechas de Excepción"
+
+msgctxt "view:calendar.todo.exrule:0"
+msgid "Exception Rule"
+msgstr "Regla de Excepción"
+
+msgctxt "view:calendar.todo.exrule:0"
+msgid "Exception Rules"
+msgstr "Reglas de Excepción"
+
+msgctxt "view:calendar.todo.rdate:0"
+msgid "Recurrence Date"
+msgstr "Fecha de Repetición"
+
+msgctxt "view:calendar.todo.rdate:0"
+msgid "Recurrence Dates"
+msgstr "Fechas de Repetición"
+
+msgctxt "view:calendar.todo.rrule:0"
+msgid "Recurrence Rule"
+msgstr "Regla de Repetición"
+
+msgctxt "view:calendar.todo.rrule:0"
+msgid "Recurrence Rules"
+msgstr "Reglas de Repetición"
+
+msgctxt "view:calendar.todo:0"
+msgid "Attendees"
+msgstr "Asistentes"
+
+msgctxt "view:calendar.todo:0"
+msgid "Categories"
+msgstr "Categorías"
+
+msgctxt "view:calendar.todo:0"
+msgid "General"
+msgstr "General"
+
+msgctxt "view:calendar.todo:0"
+msgid "Occurences"
+msgstr "Ocurrencias"
+
+msgctxt "view:calendar.todo:0"
+msgid "Recurrences"
+msgstr "Repeticiones"
+
+msgctxt "view:calendar.todo:0"
+msgid "Todo"
+msgstr ""
+
+#, fuzzy
+msgctxt "view:calendar.todo:0"
+msgid "Todos"
+msgstr "Por hacer"
diff --git a/locale/es_ES.po b/locale/es_ES.po
new file mode 100644
index 0000000..26b3e1f
--- /dev/null
+++ b/locale/es_ES.po
@@ -0,0 +1,363 @@
+# 
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "error:calendar.todo:0"
+msgid "Recurrence can not be recurrent!"
+msgstr "Una recurrencia no puede ser recurrente"
+
+msgctxt "error:calendar.todo:0"
+msgid "UUID and recurrence must be unique in a calendar!"
+msgstr "UUID y recurrencia deben ser únicos en un calendario"
+
+msgctxt "field:calendar.todo,alarms:0"
+msgid "Alarms"
+msgstr "Alarmas"
+
+msgctxt "field:calendar.todo,attendees:0"
+msgid "Attendees"
+msgstr "Asistentes"
+
+msgctxt "field:calendar.todo,calendar:0"
+msgid "Calendar"
+msgstr "Calendario"
+
+msgctxt "field:calendar.todo,calendar_owner:0"
+msgid "Owner"
+msgstr "Dueño"
+
+msgctxt "field:calendar.todo,calendar_read_users:0"
+msgid "Read Users"
+msgstr "Usuarios con lectura"
+
+msgctxt "field:calendar.todo,calendar_write_users:0"
+msgid "Write Users"
+msgstr "Usuarios con escritura"
+
+msgctxt "field:calendar.todo,categories:0"
+msgid "Categories"
+msgstr "Categorías"
+
+msgctxt "field:calendar.todo,classification:0"
+msgid "Classification"
+msgstr "Clasificación"
+
+msgctxt "field:calendar.todo,completed:0"
+msgid "Completed"
+msgstr "Completada"
+
+msgctxt "field:calendar.todo,description:0"
+msgid "Description"
+msgstr "Descripción"
+
+msgctxt "field:calendar.todo,dtstart:0"
+msgid "Start Date"
+msgstr "Fecha inicio"
+
+msgctxt "field:calendar.todo,due:0"
+msgid "Due Date"
+msgstr "Fecha de vencimiento"
+
+msgctxt "field:calendar.todo,exdates:0"
+msgid "Exception Dates"
+msgstr "Fechas excluidas"
+
+msgctxt "field:calendar.todo,exrules:0"
+msgid "Exception Rules"
+msgstr "Reglas de excepciones"
+
+msgctxt "field:calendar.todo,location:0"
+msgid "Location"
+msgstr "Ubicación"
+
+#, fuzzy
+msgctxt "field:calendar.todo,occurences:0"
+msgid "Occurences"
+msgstr "Ocurrencias"
+
+msgctxt "field:calendar.todo,organizer:0"
+msgid "Organizer"
+msgstr "Organizador"
+
+msgctxt "field:calendar.todo,parent:0"
+msgid "Parent"
+msgstr "Padre"
+
+msgctxt "field:calendar.todo,percent_complete:0"
+msgid "Percent complete"
+msgstr "Porcentaje total"
+
+msgctxt "field:calendar.todo,rdates:0"
+msgid "Recurrence Dates"
+msgstr "Fechas de recurrencia"
+
+msgctxt "field:calendar.todo,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:calendar.todo,recurrence:0"
+msgid "Recurrence"
+msgstr "Recurrencia"
+
+msgctxt "field:calendar.todo,rrules:0"
+msgid "Recurrence Rules"
+msgstr "Reglas de recurrencia"
+
+msgctxt "field:calendar.todo,sequence:0"
+msgid "Sequence"
+msgstr "Secuencia"
+
+msgctxt "field:calendar.todo,status:0"
+msgid "Status"
+msgstr "Estado"
+
+msgctxt "field:calendar.todo,summary:0"
+msgid "Summary"
+msgstr "Resumen"
+
+msgctxt "field:calendar.todo,timezone:0"
+msgid "Timezone"
+msgstr "Zona horaria"
+
+msgctxt "field:calendar.todo,uuid:0"
+msgid "UUID"
+msgstr "UUID"
+
+msgctxt "field:calendar.todo,vtodo:0"
+msgid "vtodo"
+msgstr "vtodo"
+
+msgctxt "field:calendar.todo-calendar.category,category:0"
+msgid "Category"
+msgstr "Categoría"
+
+msgctxt "field:calendar.todo-calendar.category,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:calendar.todo-calendar.category,todo:0"
+msgid "To-Do"
+msgstr "Por hacer"
+
+msgctxt "field:calendar.todo.alarm,calendar_alarm:0"
+msgid "Calendar Alarm"
+msgstr "Alarma del calendario"
+
+msgctxt "field:calendar.todo.alarm,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:calendar.todo.alarm,todo:0"
+msgid "Todo"
+msgstr "Tarea"
+
+msgctxt "field:calendar.todo.attendee,calendar_attendee:0"
+msgid "Calendar Attendee"
+msgstr "Calendario de asistentes"
+
+msgctxt "field:calendar.todo.attendee,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:calendar.todo.attendee,todo:0"
+msgid "Todo"
+msgstr "Tarea"
+
+msgctxt "field:calendar.todo.exdate,calendar_date:0"
+msgid "Calendar Date"
+msgstr ""
+
+msgctxt "field:calendar.todo.exdate,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:calendar.todo.exdate,todo:0"
+msgid "Todo"
+msgstr "Tarea"
+
+msgctxt "field:calendar.todo.exrule,calendar_rrule:0"
+msgid "Calendar RRule"
+msgstr "Regla de recurrencia"
+
+msgctxt "field:calendar.todo.exrule,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:calendar.todo.exrule,todo:0"
+msgid "Todo"
+msgstr "Tarea"
+
+msgctxt "field:calendar.todo.rdate,calendar_date:0"
+msgid "Calendar Date"
+msgstr ""
+
+msgctxt "field:calendar.todo.rdate,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:calendar.todo.rdate,todo:0"
+msgid "Todo"
+msgstr "Tarea"
+
+msgctxt "field:calendar.todo.rrule,calendar_rrule:0"
+msgid "Calendar RRule"
+msgstr "Regla de recurrencia"
+
+msgctxt "field:calendar.todo.rrule,rec_name:0"
+msgid "Name"
+msgstr "Nombre"
+
+msgctxt "field:calendar.todo.rrule,todo:0"
+msgid "Todo"
+msgstr "Tarea"
+
+msgctxt "help:calendar.todo,uuid:0"
+msgid "Universally Unique Identifier"
+msgstr "Identificador universal único"
+
+msgctxt "model:calendar.todo,name:0"
+msgid "Todo"
+msgstr "Tarea"
+
+msgctxt "model:calendar.todo-calendar.category,name:0"
+msgid "Todo - Category"
+msgstr "Tarea - Categoría"
+
+msgctxt "model:calendar.todo.alarm,name:0"
+msgid "Alarm"
+msgstr "Alarma"
+
+msgctxt "model:calendar.todo.attendee,name:0"
+msgid "Attendee"
+msgstr "Asistentes"
+
+msgctxt "model:calendar.todo.exdate,name:0"
+msgid "Exception Date"
+msgstr "Fecha excluida"
+
+msgctxt "model:calendar.todo.exrule,name:0"
+msgid "Exception Rule"
+msgstr "Regla de excepción"
+
+#, fuzzy
+msgctxt "model:calendar.todo.rdate,name:0"
+msgid "Todo Recurrence Date"
+msgstr "Fecha de recurrencia"
+
+msgctxt "model:calendar.todo.rrule,name:0"
+msgid "Recurrence Rule"
+msgstr "Regla de recurrencia"
+
+msgctxt "model:ir.action,name:act_todo_form"
+msgid "Todos"
+msgstr "Tareas"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_todo_form3"
+msgid "Todos"
+msgstr "Tareas"
+
+msgctxt "model:ir.ui.menu,name:menu_todo_form"
+msgid "Todos"
+msgstr "Tareas"
+
+msgctxt "selection:calendar.todo,classification:0"
+msgid "Confidential"
+msgstr "Confidencial"
+
+msgctxt "selection:calendar.todo,classification:0"
+msgid "Private"
+msgstr "Privado"
+
+msgctxt "selection:calendar.todo,classification:0"
+msgid "Public"
+msgstr "Público"
+
+msgctxt "selection:calendar.todo,status:0"
+msgid ""
+msgstr ""
+
+msgctxt "selection:calendar.todo,status:0"
+msgid "Cancelled"
+msgstr "Cancelada"
+
+msgctxt "selection:calendar.todo,status:0"
+msgid "Completed"
+msgstr "Completado"
+
+msgctxt "selection:calendar.todo,status:0"
+msgid "In-Process"
+msgstr "En proceso"
+
+msgctxt "selection:calendar.todo,status:0"
+msgid "Needs-Action"
+msgstr "Necesita una acción"
+
+msgctxt "view:calendar.todo.attendee:0"
+msgid "Attendee"
+msgstr "Asistentes"
+
+msgctxt "view:calendar.todo.attendee:0"
+msgid "Attendees"
+msgstr "Asistentes"
+
+msgctxt "view:calendar.todo.exdate:0"
+msgid "Exception Date"
+msgstr "Fecha excluida"
+
+msgctxt "view:calendar.todo.exdate:0"
+msgid "Exception Dates"
+msgstr "Fechas excluidas"
+
+msgctxt "view:calendar.todo.exrule:0"
+msgid "Exception Rule"
+msgstr "Regla de excepción"
+
+msgctxt "view:calendar.todo.exrule:0"
+msgid "Exception Rules"
+msgstr "Reglas de excepciones"
+
+msgctxt "view:calendar.todo.rdate:0"
+msgid "Recurrence Date"
+msgstr "Fecha de recurrencia"
+
+msgctxt "view:calendar.todo.rdate:0"
+msgid "Recurrence Dates"
+msgstr "Fechas de recurrencia"
+
+msgctxt "view:calendar.todo.rrule:0"
+msgid "Recurrence Rule"
+msgstr "Regla de recurrencia"
+
+msgctxt "view:calendar.todo.rrule:0"
+msgid "Recurrence Rules"
+msgstr "Reglas de recurrencia"
+
+msgctxt "view:calendar.todo:0"
+msgid "Attendees"
+msgstr "Asistentes"
+
+msgctxt "view:calendar.todo:0"
+msgid "Categories"
+msgstr "Categorías"
+
+msgctxt "view:calendar.todo:0"
+msgid "General"
+msgstr "General"
+
+#, fuzzy
+msgctxt "view:calendar.todo:0"
+msgid "Occurences"
+msgstr "Ocurrencias"
+
+msgctxt "view:calendar.todo:0"
+msgid "Recurrences"
+msgstr "Recurrencias"
+
+msgctxt "view:calendar.todo:0"
+msgid "Todo"
+msgstr "Tarea"
+
+msgctxt "view:calendar.todo:0"
+msgid "Todos"
+msgstr "Tareas"
diff --git a/locale/fr_FR.po b/locale/fr_FR.po
new file mode 100644
index 0000000..bbe3ff4
--- /dev/null
+++ b/locale/fr_FR.po
@@ -0,0 +1,359 @@
+# 
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "error:calendar.todo:0"
+msgid "Recurrence can not be recurrent!"
+msgstr "Une récurrence ne peut pas être récurrente !"
+
+msgctxt "error:calendar.todo:0"
+msgid "UUID and recurrence must be unique in a calendar!"
+msgstr "UUID et récurrence doivent être uniques sur un calendrier !"
+
+msgctxt "field:calendar.todo,alarms:0"
+msgid "Alarms"
+msgstr "Alarmes"
+
+msgctxt "field:calendar.todo,attendees:0"
+msgid "Attendees"
+msgstr "Participants"
+
+msgctxt "field:calendar.todo,calendar:0"
+msgid "Calendar"
+msgstr "Calendrier"
+
+msgctxt "field:calendar.todo,calendar_owner:0"
+msgid "Owner"
+msgstr "Propriétaire"
+
+msgctxt "field:calendar.todo,calendar_read_users:0"
+msgid "Read Users"
+msgstr "Utilisateurs en lecture"
+
+msgctxt "field:calendar.todo,calendar_write_users:0"
+msgid "Write Users"
+msgstr "Utilisateurs en écriture"
+
+msgctxt "field:calendar.todo,categories:0"
+msgid "Categories"
+msgstr "Catégories"
+
+msgctxt "field:calendar.todo,classification:0"
+msgid "Classification"
+msgstr "Classification"
+
+msgctxt "field:calendar.todo,completed:0"
+msgid "Completed"
+msgstr "Complété"
+
+msgctxt "field:calendar.todo,description:0"
+msgid "Description"
+msgstr "Description"
+
+msgctxt "field:calendar.todo,dtstart:0"
+msgid "Start Date"
+msgstr "Date de début"
+
+msgctxt "field:calendar.todo,due:0"
+msgid "Due Date"
+msgstr "Date d'échéance"
+
+msgctxt "field:calendar.todo,exdates:0"
+msgid "Exception Dates"
+msgstr "Dates d'exception"
+
+msgctxt "field:calendar.todo,exrules:0"
+msgid "Exception Rules"
+msgstr "Règles d'exception"
+
+msgctxt "field:calendar.todo,location:0"
+msgid "Location"
+msgstr "Emplacement"
+
+msgctxt "field:calendar.todo,occurences:0"
+msgid "Occurences"
+msgstr "Occurrences"
+
+msgctxt "field:calendar.todo,organizer:0"
+msgid "Organizer"
+msgstr "Organisateur"
+
+msgctxt "field:calendar.todo,parent:0"
+msgid "Parent"
+msgstr "Parent"
+
+msgctxt "field:calendar.todo,percent_complete:0"
+msgid "Percent complete"
+msgstr "Pourcentage effectué"
+
+msgctxt "field:calendar.todo,rdates:0"
+msgid "Recurrence Dates"
+msgstr "Dates de récurrence"
+
+msgctxt "field:calendar.todo,rec_name:0"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:calendar.todo,recurrence:0"
+msgid "Recurrence"
+msgstr "Récurrence"
+
+msgctxt "field:calendar.todo,rrules:0"
+msgid "Recurrence Rules"
+msgstr "Règles de récurrence"
+
+msgctxt "field:calendar.todo,sequence:0"
+msgid "Sequence"
+msgstr "Séquence"
+
+msgctxt "field:calendar.todo,status:0"
+msgid "Status"
+msgstr "Statut"
+
+msgctxt "field:calendar.todo,summary:0"
+msgid "Summary"
+msgstr "Résumé"
+
+msgctxt "field:calendar.todo,timezone:0"
+msgid "Timezone"
+msgstr "Fuseau Horaire"
+
+msgctxt "field:calendar.todo,uuid:0"
+msgid "UUID"
+msgstr "UUID"
+
+msgctxt "field:calendar.todo,vtodo:0"
+msgid "vtodo"
+msgstr "vtodo"
+
+msgctxt "field:calendar.todo-calendar.category,category:0"
+msgid "Category"
+msgstr "Catégorie"
+
+msgctxt "field:calendar.todo-calendar.category,rec_name:0"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:calendar.todo-calendar.category,todo:0"
+msgid "To-Do"
+msgstr "Tâche"
+
+msgctxt "field:calendar.todo.alarm,calendar_alarm:0"
+msgid "Calendar Alarm"
+msgstr "Alarme calendrier"
+
+msgctxt "field:calendar.todo.alarm,rec_name:0"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:calendar.todo.alarm,todo:0"
+msgid "Todo"
+msgstr "Tâche"
+
+msgctxt "field:calendar.todo.attendee,calendar_attendee:0"
+msgid "Calendar Attendee"
+msgstr "Participant calendrier"
+
+msgctxt "field:calendar.todo.attendee,rec_name:0"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:calendar.todo.attendee,todo:0"
+msgid "Todo"
+msgstr "Tâche"
+
+msgctxt "field:calendar.todo.exdate,calendar_date:0"
+msgid "Calendar Date"
+msgstr "Date calendrier"
+
+msgctxt "field:calendar.todo.exdate,rec_name:0"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:calendar.todo.exdate,todo:0"
+msgid "Todo"
+msgstr "Tâche"
+
+msgctxt "field:calendar.todo.exrule,calendar_rrule:0"
+msgid "Calendar RRule"
+msgstr "Règle de récurrence"
+
+msgctxt "field:calendar.todo.exrule,rec_name:0"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:calendar.todo.exrule,todo:0"
+msgid "Todo"
+msgstr "Tâche"
+
+msgctxt "field:calendar.todo.rdate,calendar_date:0"
+msgid "Calendar Date"
+msgstr "Date calendrier"
+
+msgctxt "field:calendar.todo.rdate,rec_name:0"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:calendar.todo.rdate,todo:0"
+msgid "Todo"
+msgstr "Tâche"
+
+msgctxt "field:calendar.todo.rrule,calendar_rrule:0"
+msgid "Calendar RRule"
+msgstr "Règle de récurrence"
+
+msgctxt "field:calendar.todo.rrule,rec_name:0"
+msgid "Name"
+msgstr "Nom"
+
+msgctxt "field:calendar.todo.rrule,todo:0"
+msgid "Todo"
+msgstr "Tâche"
+
+msgctxt "help:calendar.todo,uuid:0"
+msgid "Universally Unique Identifier"
+msgstr "Identificateur unique universel"
+
+msgctxt "model:calendar.todo,name:0"
+msgid "Todo"
+msgstr "Tâche"
+
+msgctxt "model:calendar.todo-calendar.category,name:0"
+msgid "Todo - Category"
+msgstr "Todo - Catégorie"
+
+msgctxt "model:calendar.todo.alarm,name:0"
+msgid "Alarm"
+msgstr "Alarme"
+
+msgctxt "model:calendar.todo.attendee,name:0"
+msgid "Attendee"
+msgstr "Participant"
+
+msgctxt "model:calendar.todo.exdate,name:0"
+msgid "Exception Date"
+msgstr "Date d'exception"
+
+msgctxt "model:calendar.todo.exrule,name:0"
+msgid "Exception Rule"
+msgstr "Règle d'exception"
+
+msgctxt "model:calendar.todo.rdate,name:0"
+msgid "Todo Recurrence Date"
+msgstr "Date de récurrence"
+
+msgctxt "model:calendar.todo.rrule,name:0"
+msgid "Recurrence Rule"
+msgstr "Règle de récurrence"
+
+msgctxt "model:ir.action,name:act_todo_form"
+msgid "Todos"
+msgstr "Tâches"
+
+msgctxt "model:ir.action,name:act_todo_form3"
+msgid "Todos"
+msgstr "Tâches"
+
+msgctxt "model:ir.ui.menu,name:menu_todo_form"
+msgid "Todos"
+msgstr "Tâches"
+
+msgctxt "selection:calendar.todo,classification:0"
+msgid "Confidential"
+msgstr "Confidentiel"
+
+msgctxt "selection:calendar.todo,classification:0"
+msgid "Private"
+msgstr "Privé"
+
+msgctxt "selection:calendar.todo,classification:0"
+msgid "Public"
+msgstr "Publique"
+
+msgctxt "selection:calendar.todo,status:0"
+msgid ""
+msgstr ""
+
+msgctxt "selection:calendar.todo,status:0"
+msgid "Cancelled"
+msgstr "Annulé"
+
+msgctxt "selection:calendar.todo,status:0"
+msgid "Completed"
+msgstr "Complété"
+
+msgctxt "selection:calendar.todo,status:0"
+msgid "In-Process"
+msgstr "En court"
+
+msgctxt "selection:calendar.todo,status:0"
+msgid "Needs-Action"
+msgstr "Nécessite une action"
+
+msgctxt "view:calendar.todo.attendee:0"
+msgid "Attendee"
+msgstr "Participant"
+
+msgctxt "view:calendar.todo.attendee:0"
+msgid "Attendees"
+msgstr "Participants"
+
+msgctxt "view:calendar.todo.exdate:0"
+msgid "Exception Date"
+msgstr "Date d'exception"
+
+msgctxt "view:calendar.todo.exdate:0"
+msgid "Exception Dates"
+msgstr "Dates d'exception"
+
+msgctxt "view:calendar.todo.exrule:0"
+msgid "Exception Rule"
+msgstr "Règle d'exception"
+
+msgctxt "view:calendar.todo.exrule:0"
+msgid "Exception Rules"
+msgstr "Règles d'exception"
+
+msgctxt "view:calendar.todo.rdate:0"
+msgid "Recurrence Date"
+msgstr "Date de récurrence"
+
+msgctxt "view:calendar.todo.rdate:0"
+msgid "Recurrence Dates"
+msgstr "Dates de récurrence"
+
+msgctxt "view:calendar.todo.rrule:0"
+msgid "Recurrence Rule"
+msgstr "Règle de récurrence"
+
+msgctxt "view:calendar.todo.rrule:0"
+msgid "Recurrence Rules"
+msgstr "Règles de récurrence"
+
+msgctxt "view:calendar.todo:0"
+msgid "Attendees"
+msgstr "Participants"
+
+msgctxt "view:calendar.todo:0"
+msgid "Categories"
+msgstr "Catégories"
+
+msgctxt "view:calendar.todo:0"
+msgid "General"
+msgstr "Général"
+
+msgctxt "view:calendar.todo:0"
+msgid "Occurences"
+msgstr "Occurrences"
+
+msgctxt "view:calendar.todo:0"
+msgid "Recurrences"
+msgstr "Récurrences"
+
+msgctxt "view:calendar.todo:0"
+msgid "Todo"
+msgstr "Tâche"
+
+msgctxt "view:calendar.todo:0"
+msgid "Todos"
+msgstr "Tâches"
diff --git a/locale/nl_NL.po b/locale/nl_NL.po
new file mode 100644
index 0000000..d98d936
--- /dev/null
+++ b/locale/nl_NL.po
@@ -0,0 +1,371 @@
+# 
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "error:calendar.todo:0"
+msgid "Recurrence can not be recurrent!"
+msgstr ""
+
+msgctxt "error:calendar.todo:0"
+msgid "UUID and recurrence must be unique in a calendar!"
+msgstr ""
+
+msgctxt "field:calendar.todo,alarms:0"
+msgid "Alarms"
+msgstr ""
+
+msgctxt "field:calendar.todo,attendees:0"
+msgid "Attendees"
+msgstr ""
+
+msgctxt "field:calendar.todo,calendar:0"
+msgid "Calendar"
+msgstr ""
+
+msgctxt "field:calendar.todo,calendar_owner:0"
+msgid "Owner"
+msgstr ""
+
+msgctxt "field:calendar.todo,calendar_read_users:0"
+msgid "Read Users"
+msgstr ""
+
+msgctxt "field:calendar.todo,calendar_write_users:0"
+msgid "Write Users"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.todo,categories:0"
+msgid "Categories"
+msgstr "Categorieën"
+
+msgctxt "field:calendar.todo,classification:0"
+msgid "Classification"
+msgstr ""
+
+msgctxt "field:calendar.todo,completed:0"
+msgid "Completed"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.todo,description:0"
+msgid "Description"
+msgstr "Specificatie"
+
+#, fuzzy
+msgctxt "field:calendar.todo,dtstart:0"
+msgid "Start Date"
+msgstr "Start datum"
+
+msgctxt "field:calendar.todo,due:0"
+msgid "Due Date"
+msgstr ""
+
+msgctxt "field:calendar.todo,exdates:0"
+msgid "Exception Dates"
+msgstr ""
+
+msgctxt "field:calendar.todo,exrules:0"
+msgid "Exception Rules"
+msgstr ""
+
+msgctxt "field:calendar.todo,location:0"
+msgid "Location"
+msgstr ""
+
+msgctxt "field:calendar.todo,occurences:0"
+msgid "Occurences"
+msgstr ""
+
+msgctxt "field:calendar.todo,organizer:0"
+msgid "Organizer"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.todo,parent:0"
+msgid "Parent"
+msgstr "Bovenliggend niveau"
+
+msgctxt "field:calendar.todo,percent_complete:0"
+msgid "Percent complete"
+msgstr ""
+
+msgctxt "field:calendar.todo,rdates:0"
+msgid "Recurrence Dates"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.todo,rec_name:0"
+msgid "Name"
+msgstr "Naam bijlage"
+
+msgctxt "field:calendar.todo,recurrence:0"
+msgid "Recurrence"
+msgstr ""
+
+msgctxt "field:calendar.todo,rrules:0"
+msgid "Recurrence Rules"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.todo,sequence:0"
+msgid "Sequence"
+msgstr "Reeks"
+
+msgctxt "field:calendar.todo,status:0"
+msgid "Status"
+msgstr ""
+
+msgctxt "field:calendar.todo,summary:0"
+msgid "Summary"
+msgstr ""
+
+msgctxt "field:calendar.todo,timezone:0"
+msgid "Timezone"
+msgstr ""
+
+msgctxt "field:calendar.todo,uuid:0"
+msgid "UUID"
+msgstr ""
+
+msgctxt "field:calendar.todo,vtodo:0"
+msgid "vtodo"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.todo-calendar.category,category:0"
+msgid "Category"
+msgstr "Categorie"
+
+#, fuzzy
+msgctxt "field:calendar.todo-calendar.category,rec_name:0"
+msgid "Name"
+msgstr "Naam bijlage"
+
+msgctxt "field:calendar.todo-calendar.category,todo:0"
+msgid "To-Do"
+msgstr ""
+
+msgctxt "field:calendar.todo.alarm,calendar_alarm:0"
+msgid "Calendar Alarm"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.todo.alarm,rec_name:0"
+msgid "Name"
+msgstr "Naam bijlage"
+
+msgctxt "field:calendar.todo.alarm,todo:0"
+msgid "Todo"
+msgstr ""
+
+msgctxt "field:calendar.todo.attendee,calendar_attendee:0"
+msgid "Calendar Attendee"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.todo.attendee,rec_name:0"
+msgid "Name"
+msgstr "Naam bijlage"
+
+msgctxt "field:calendar.todo.attendee,todo:0"
+msgid "Todo"
+msgstr ""
+
+msgctxt "field:calendar.todo.exdate,calendar_date:0"
+msgid "Calendar Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.todo.exdate,rec_name:0"
+msgid "Name"
+msgstr "Naam bijlage"
+
+msgctxt "field:calendar.todo.exdate,todo:0"
+msgid "Todo"
+msgstr ""
+
+msgctxt "field:calendar.todo.exrule,calendar_rrule:0"
+msgid "Calendar RRule"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.todo.exrule,rec_name:0"
+msgid "Name"
+msgstr "Naam bijlage"
+
+msgctxt "field:calendar.todo.exrule,todo:0"
+msgid "Todo"
+msgstr ""
+
+msgctxt "field:calendar.todo.rdate,calendar_date:0"
+msgid "Calendar Date"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.todo.rdate,rec_name:0"
+msgid "Name"
+msgstr "Naam bijlage"
+
+msgctxt "field:calendar.todo.rdate,todo:0"
+msgid "Todo"
+msgstr ""
+
+msgctxt "field:calendar.todo.rrule,calendar_rrule:0"
+msgid "Calendar RRule"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:calendar.todo.rrule,rec_name:0"
+msgid "Name"
+msgstr "Naam bijlage"
+
+msgctxt "field:calendar.todo.rrule,todo:0"
+msgid "Todo"
+msgstr ""
+
+msgctxt "help:calendar.todo,uuid:0"
+msgid "Universally Unique Identifier"
+msgstr ""
+
+msgctxt "model:calendar.todo,name:0"
+msgid "Todo"
+msgstr ""
+
+msgctxt "model:calendar.todo-calendar.category,name:0"
+msgid "Todo - Category"
+msgstr ""
+
+msgctxt "model:calendar.todo.alarm,name:0"
+msgid "Alarm"
+msgstr ""
+
+msgctxt "model:calendar.todo.attendee,name:0"
+msgid "Attendee"
+msgstr ""
+
+msgctxt "model:calendar.todo.exdate,name:0"
+msgid "Exception Date"
+msgstr ""
+
+msgctxt "model:calendar.todo.exrule,name:0"
+msgid "Exception Rule"
+msgstr ""
+
+msgctxt "model:calendar.todo.rdate,name:0"
+msgid "Todo Recurrence Date"
+msgstr ""
+
+msgctxt "model:calendar.todo.rrule,name:0"
+msgid "Recurrence Rule"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_todo_form"
+msgid "Todos"
+msgstr ""
+
+msgctxt "model:ir.action,name:act_todo_form3"
+msgid "Todos"
+msgstr ""
+
+msgctxt "model:ir.ui.menu,name:menu_todo_form"
+msgid "Todos"
+msgstr ""
+
+msgctxt "selection:calendar.todo,classification:0"
+msgid "Confidential"
+msgstr ""
+
+msgctxt "selection:calendar.todo,classification:0"
+msgid "Private"
+msgstr ""
+
+msgctxt "selection:calendar.todo,classification:0"
+msgid "Public"
+msgstr ""
+
+msgctxt "selection:calendar.todo,status:0"
+msgid ""
+msgstr ""
+
+msgctxt "selection:calendar.todo,status:0"
+msgid "Cancelled"
+msgstr ""
+
+msgctxt "selection:calendar.todo,status:0"
+msgid "Completed"
+msgstr ""
+
+msgctxt "selection:calendar.todo,status:0"
+msgid "In-Process"
+msgstr ""
+
+msgctxt "selection:calendar.todo,status:0"
+msgid "Needs-Action"
+msgstr ""
+
+msgctxt "view:calendar.todo.attendee:0"
+msgid "Attendee"
+msgstr ""
+
+msgctxt "view:calendar.todo.attendee:0"
+msgid "Attendees"
+msgstr ""
+
+msgctxt "view:calendar.todo.exdate:0"
+msgid "Exception Date"
+msgstr ""
+
+msgctxt "view:calendar.todo.exdate:0"
+msgid "Exception Dates"
+msgstr ""
+
+msgctxt "view:calendar.todo.exrule:0"
+msgid "Exception Rule"
+msgstr ""
+
+msgctxt "view:calendar.todo.exrule:0"
+msgid "Exception Rules"
+msgstr ""
+
+msgctxt "view:calendar.todo.rdate:0"
+msgid "Recurrence Date"
+msgstr ""
+
+msgctxt "view:calendar.todo.rdate:0"
+msgid "Recurrence Dates"
+msgstr ""
+
+msgctxt "view:calendar.todo.rrule:0"
+msgid "Recurrence Rule"
+msgstr ""
+
+msgctxt "view:calendar.todo.rrule:0"
+msgid "Recurrence Rules"
+msgstr ""
+
+msgctxt "view:calendar.todo:0"
+msgid "Attendees"
+msgstr ""
+
+#, fuzzy
+msgctxt "view:calendar.todo:0"
+msgid "Categories"
+msgstr "Categorieën"
+
+#, fuzzy
+msgctxt "view:calendar.todo:0"
+msgid "General"
+msgstr "Algemeen"
+
+msgctxt "view:calendar.todo:0"
+msgid "Occurences"
+msgstr ""
+
+msgctxt "view:calendar.todo:0"
+msgid "Todo"
+msgstr ""
+
+msgctxt "view:calendar.todo:0"
+msgid "Todos"
+msgstr ""
diff --git a/locale/ru_RU.po b/locale/ru_RU.po
new file mode 100644
index 0000000..ca4dbea
--- /dev/null
+++ b/locale/ru_RU.po
@@ -0,0 +1,358 @@
+# 
+msgid ""
+msgstr "Content-Type: text/plain; charset=utf-8\n"
+
+msgctxt "error:calendar.todo:0"
+msgid "Recurrence can not be recurrent!"
+msgstr ""
+
+msgctxt "error:calendar.todo:0"
+msgid "UUID and recurrence must be unique in a calendar!"
+msgstr ""
+
+msgctxt "field:calendar.todo,alarms:0"
+msgid "Alarms"
+msgstr "Вызов"
+
+msgctxt "field:calendar.todo,attendees:0"
+msgid "Attendees"
+msgstr "Участники"
+
+msgctxt "field:calendar.todo,calendar:0"
+msgid "Calendar"
+msgstr "Календарь"
+
+msgctxt "field:calendar.todo,calendar_owner:0"
+msgid "Owner"
+msgstr "Владелец"
+
+msgctxt "field:calendar.todo,calendar_read_users:0"
+msgid "Read Users"
+msgstr "Пользователи могут читать"
+
+msgctxt "field:calendar.todo,calendar_write_users:0"
+msgid "Write Users"
+msgstr "Пользователи могут писать"
+
+msgctxt "field:calendar.todo,categories:0"
+msgid "Categories"
+msgstr "Категория"
+
+msgctxt "field:calendar.todo,classification:0"
+msgid "Classification"
+msgstr "Классификация"
+
+msgctxt "field:calendar.todo,completed:0"
+msgid "Completed"
+msgstr "Выполнен"
+
+msgctxt "field:calendar.todo,description:0"
+msgid "Description"
+msgstr "Описание"
+
+msgctxt "field:calendar.todo,dtstart:0"
+msgid "Start Date"
+msgstr "Дата начала"
+
+msgctxt "field:calendar.todo,due:0"
+msgid "Due Date"
+msgstr "Срок сдачи"
+
+msgctxt "field:calendar.todo,exdates:0"
+msgid "Exception Dates"
+msgstr "Дата исключения"
+
+msgctxt "field:calendar.todo,exrules:0"
+msgid "Exception Rules"
+msgstr "Правила исключения"
+
+msgctxt "field:calendar.todo,location:0"
+msgid "Location"
+msgstr "Местоположение"
+
+msgctxt "field:calendar.todo,occurences:0"
+msgid "Occurences"
+msgstr "Дополнительные задачи"
+
+msgctxt "field:calendar.todo,organizer:0"
+msgid "Organizer"
+msgstr "Организатор"
+
+msgctxt "field:calendar.todo,parent:0"
+msgid "Parent"
+msgstr "Основной"
+
+msgctxt "field:calendar.todo,percent_complete:0"
+msgid "Percent complete"
+msgstr "Процент выполнения"
+
+msgctxt "field:calendar.todo,rdates:0"
+msgid "Recurrence Dates"
+msgstr "Даты повторения"
+
+msgctxt "field:calendar.todo,rec_name:0"
+msgid "Name"
+msgstr "Наименование"
+
+msgctxt "field:calendar.todo,recurrence:0"
+msgid "Recurrence"
+msgstr "Повторение"
+
+msgctxt "field:calendar.todo,rrules:0"
+msgid "Recurrence Rules"
+msgstr "Правила повторения"
+
+msgctxt "field:calendar.todo,sequence:0"
+msgid "Sequence"
+msgstr "Последовательность"
+
+msgctxt "field:calendar.todo,status:0"
+msgid "Status"
+msgstr "Состояние"
+
+msgctxt "field:calendar.todo,summary:0"
+msgid "Summary"
+msgstr "Резюме"
+
+msgctxt "field:calendar.todo,timezone:0"
+msgid "Timezone"
+msgstr "Зона времени"
+
+msgctxt "field:calendar.todo,uuid:0"
+msgid "UUID"
+msgstr ""
+
+msgctxt "field:calendar.todo,vtodo:0"
+msgid "vtodo"
+msgstr ""
+
+msgctxt "field:calendar.todo-calendar.category,category:0"
+msgid "Category"
+msgstr "Категории"
+
+msgctxt "field:calendar.todo-calendar.category,rec_name:0"
+msgid "Name"
+msgstr "Наименование"
+
+msgctxt "field:calendar.todo-calendar.category,todo:0"
+msgid "To-Do"
+msgstr "Дела"
+
+msgctxt "field:calendar.todo.alarm,calendar_alarm:0"
+msgid "Calendar Alarm"
+msgstr "Сигнала календаря"
+
+msgctxt "field:calendar.todo.alarm,rec_name:0"
+msgid "Name"
+msgstr "Наименование"
+
+msgctxt "field:calendar.todo.alarm,todo:0"
+msgid "Todo"
+msgstr "Дело"
+
+msgctxt "field:calendar.todo.attendee,calendar_attendee:0"
+msgid "Calendar Attendee"
+msgstr "Календарь участников"
+
+msgctxt "field:calendar.todo.attendee,rec_name:0"
+msgid "Name"
+msgstr "Наименование"
+
+msgctxt "field:calendar.todo.attendee,todo:0"
+msgid "Todo"
+msgstr "Дело"
+
+msgctxt "field:calendar.todo.exdate,calendar_date:0"
+msgid "Calendar Date"
+msgstr "День календаря"
+
+msgctxt "field:calendar.todo.exdate,rec_name:0"
+msgid "Name"
+msgstr "Наименование"
+
+msgctxt "field:calendar.todo.exdate,todo:0"
+msgid "Todo"
+msgstr "Дело"
+
+msgctxt "field:calendar.todo.exrule,calendar_rrule:0"
+msgid "Calendar RRule"
+msgstr "Правила календаря"
+
+msgctxt "field:calendar.todo.exrule,rec_name:0"
+msgid "Name"
+msgstr "Наименование"
+
+msgctxt "field:calendar.todo.exrule,todo:0"
+msgid "Todo"
+msgstr "Дело"
+
+msgctxt "field:calendar.todo.rdate,calendar_date:0"
+msgid "Calendar Date"
+msgstr "День календаря"
+
+msgctxt "field:calendar.todo.rdate,rec_name:0"
+msgid "Name"
+msgstr "Наименование"
+
+msgctxt "field:calendar.todo.rdate,todo:0"
+msgid "Todo"
+msgstr "Дело"
+
+msgctxt "field:calendar.todo.rrule,calendar_rrule:0"
+msgid "Calendar RRule"
+msgstr "Правила календаря"
+
+msgctxt "field:calendar.todo.rrule,rec_name:0"
+msgid "Name"
+msgstr "Наименование"
+
+msgctxt "field:calendar.todo.rrule,todo:0"
+msgid "Todo"
+msgstr "Дело"
+
+msgctxt "help:calendar.todo,uuid:0"
+msgid "Universally Unique Identifier"
+msgstr "Универсальный уникальный идентификатор"
+
+msgctxt "model:calendar.todo,name:0"
+msgid "Todo"
+msgstr "Дело"
+
+msgctxt "model:calendar.todo-calendar.category,name:0"
+msgid "Todo - Category"
+msgstr "Категории - Дел"
+
+msgctxt "model:calendar.todo.alarm,name:0"
+msgid "Alarm"
+msgstr "Вызов"
+
+msgctxt "model:calendar.todo.attendee,name:0"
+msgid "Attendee"
+msgstr "Участник"
+
+msgctxt "model:calendar.todo.exdate,name:0"
+msgid "Exception Date"
+msgstr "Дата исключения"
+
+msgctxt "model:calendar.todo.exrule,name:0"
+msgid "Exception Rule"
+msgstr "Правило исключения"
+
+msgctxt "model:calendar.todo.rdate,name:0"
+msgid "Todo Recurrence Date"
+msgstr "Дела повторяющиеся по дате"
+
+msgctxt "model:calendar.todo.rrule,name:0"
+msgid "Recurrence Rule"
+msgstr "Правила повторения"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_todo_form"
+msgid "Todos"
+msgstr "Задачи"
+
+#, fuzzy
+msgctxt "model:ir.action,name:act_todo_form3"
+msgid "Todos"
+msgstr "Задачи"
+
+msgctxt "model:ir.ui.menu,name:menu_todo_form"
+msgid "Todos"
+msgstr "Задачи"
+
+msgctxt "selection:calendar.todo,classification:0"
+msgid "Confidential"
+msgstr "Конфиденциальное"
+
+msgctxt "selection:calendar.todo,classification:0"
+msgid "Private"
+msgstr "Личное"
+
+msgctxt "selection:calendar.todo,classification:0"
+msgid "Public"
+msgstr "Публичное"
+
+#, fuzzy
+msgctxt "selection:calendar.todo,status:0"
+msgid ""
+msgstr "Резервный счет"
+
+msgctxt "selection:calendar.todo,status:0"
+msgid "Cancelled"
+msgstr "Отмененно"
+
+msgctxt "selection:calendar.todo,status:0"
+msgid "Completed"
+msgstr "Выполнен"
+
+msgctxt "selection:calendar.todo,status:0"
+msgid "In-Process"
+msgstr "В процессе"
+
+msgctxt "selection:calendar.todo,status:0"
+msgid "Needs-Action"
+msgstr "Требуется действие"
+
+msgctxt "view:calendar.todo.attendee:0"
+msgid "Attendee"
+msgstr "Участник"
+
+msgctxt "view:calendar.todo.attendee:0"
+msgid "Attendees"
+msgstr "Участники"
+
+msgctxt "view:calendar.todo.exdate:0"
+msgid "Exception Date"
+msgstr "Дата исключения"
+
+msgctxt "view:calendar.todo.exdate:0"
+msgid "Exception Dates"
+msgstr "Дата исключения"
+
+msgctxt "view:calendar.todo.exrule:0"
+msgid "Exception Rule"
+msgstr "Правило исключения"
+
+msgctxt "view:calendar.todo.exrule:0"
+msgid "Exception Rules"
+msgstr "Правила исключения"
+
+msgctxt "view:calendar.todo.rdate:0"
+msgid "Recurrence Date"
+msgstr "Даты повторения"
+
+msgctxt "view:calendar.todo.rdate:0"
+msgid "Recurrence Dates"
+msgstr "Даты повторения"
+
+msgctxt "view:calendar.todo.rrule:0"
+msgid "Recurrence Rule"
+msgstr "Правила повторения"
+
+msgctxt "view:calendar.todo.rrule:0"
+msgid "Recurrence Rules"
+msgstr "Правила повторения"
+
+msgctxt "view:calendar.todo:0"
+msgid "Attendees"
+msgstr "Участники"
+
+msgctxt "view:calendar.todo:0"
+msgid "Categories"
+msgstr "Категория"
+
+msgctxt "view:calendar.todo:0"
+msgid "General"
+msgstr "Основной"
+
+msgctxt "view:calendar.todo:0"
+msgid "Occurences"
+msgstr "Повторение"
+
+msgctxt "view:calendar.todo:0"
+msgid "Todo"
+msgstr "Дело"
+
+msgctxt "view:calendar.todo:0"
+msgid "Todos"
+msgstr "Дела"
diff --git a/ru_RU.csv b/ru_RU.csv
deleted file mode 100644
index ebc669f..0000000
--- a/ru_RU.csv
+++ /dev/null
@@ -1,95 +0,0 @@
-type,name,res_id,src,value,fuzzy
-error,calendar.todo,0,Recurrence can not be recurrent!,,0
-error,calendar.todo,0,UUID and recurrence must be unique in a calendar!,,0
-field,"calendar.todo,alarms",0,Alarms,Вызов,0
-field,"calendar.todo,attendees",0,Attendees,Участники,0
-field,"calendar.todo,calendar",0,Calendar,Календарь,0
-field,"calendar.todo,calendar_owner",0,Owner,Владелец,0
-field,"calendar.todo,calendar_read_users",0,Read Users,Пользователи могут читать,0
-field,"calendar.todo,calendar_write_users",0,Write Users,Пользователи могут писать,0
-field,"calendar.todo,categories",0,Categories,Категория,0
-field,"calendar.todo,classification",0,Classification,Классификация,0
-field,"calendar.todo,classification_public",0,Classification Public,Классификация общая,0
-field,"calendar.todo,completed",0,Completed,Выполнен,0
-field,"calendar.todo,description",0,Description,Описание,0
-field,"calendar.todo,dtstart",0,Start Date,Дата начала,0
-field,"calendar.todo,due",0,Due Date,Срок сдачи,0
-field,"calendar.todo,exdates",0,Exception Dates,Дата исключения,0
-field,"calendar.todo,exrules",0,Exception Rules,Правила исключения,0
-field,"calendar.todo,location",0,Location,Местоположение,0
-field,"calendar.todo,occurences",0,Occurences,Дополнительные задачи,0
-field,"calendar.todo,organizer",0,Organizer,Организатор,0
-field,"calendar.todo,parent",0,Parent,Основной,0
-field,"calendar.todo,percent_complete",0,Percent complete,Процент выполнения,0
-field,"calendar.todo,rdates",0,Recurrence Dates,Даты повторения,0
-field,"calendar.todo,rec_name",0,Name,Наименование,0
-field,"calendar.todo,recurrence",0,Recurrence,Повторение,0
-field,"calendar.todo,recurrences",0,Recurrences,Повторения,0
-field,"calendar.todo,rrules",0,Recurrence Rules,Правила повторения,0
-field,"calendar.todo,sequence",0,Sequence,Последовательность,0
-field,"calendar.todo,status",0,Status,Состояние,0
-field,"calendar.todo,summary",0,Summary,Резюме,0
-field,"calendar.todo,timezone",0,Timezone,Зона времени,0
-field,"calendar.todo,uuid",0,UUID,,0
-field,"calendar.todo,vtodo",0,vtodo,,0
-field,"calendar.todo-calendar.category,category",0,Category,Категории,0
-field,"calendar.todo-calendar.category,rec_name",0,Name,Наименование,0
-field,"calendar.todo-calendar.category,todo",0,To-Do,Дела,0
-field,"calendar.todo.alarm,calendar_alarm",0,Calendar Alarm,Сигнала календаря,0
-field,"calendar.todo.alarm,rec_name",0,Name,Наименование,0
-field,"calendar.todo.alarm,todo",0,Todo,Дело,0
-field,"calendar.todo.attendee,calendar_attendee",0,Calendar Attendee,Календарь участников,0
-field,"calendar.todo.attendee,rec_name",0,Name,Наименование,0
-field,"calendar.todo.attendee,todo",0,Todo,Дело,0
-field,"calendar.todo.exdate,calendar_date",0,Calendar Date,День календаря,0
-field,"calendar.todo.exdate,calendar_rdate",0,Calendar RDate,День календаря,0
-field,"calendar.todo.exdate,rec_name",0,Name,Наименование,0
-field,"calendar.todo.exdate,todo",0,Todo,Дело,0
-field,"calendar.todo.exrule,calendar_rrule",0,Calendar RRule,Правила календаря,0
-field,"calendar.todo.exrule,rec_name",0,Name,Наименование,0
-field,"calendar.todo.exrule,todo",0,Todo,Дело,0
-field,"calendar.todo.rdate,calendar_date",0,Calendar Date,День календаря,0
-field,"calendar.todo.rdate,calendar_rdate",0,Calendar RDate,День календаря,0
-field,"calendar.todo.rdate,rec_name",0,Name,Наименование,0
-field,"calendar.todo.rdate,todo",0,Todo,Дело,0
-field,"calendar.todo.rrule,calendar_rrule",0,Calendar RRule,Правила календаря,0
-field,"calendar.todo.rrule,rec_name",0,Name,Наименование,0
-field,"calendar.todo.rrule,todo",0,Todo,Дело,0
-help,"calendar.todo,uuid",0,Universally Unique Identifier,Универсальный уникальный идентификатор,0
-model,"calendar.todo,name",0,Todo,Дело,0
-model,"calendar.todo-calendar.category,name",0,Todo - Category,Категории - Дел,0
-model,"calendar.todo.alarm,name",0,Alarm,Вызов,0
-model,"calendar.todo.attendee,name",0,Attendee,Участник,0
-model,"calendar.todo.exdate,name",0,Exception Date,Дата исключения,0
-model,"calendar.todo.exrule,name",0,Exception Rule,Правило исключения,0
-model,"calendar.todo.rdate,name",0,Todo Recurrence Date,Дела повторяющиеся по дате,0
-model,"calendar.todo.rrule,name",0,Recurrence Rule,Правила повторения,0
-model,"ir.action,name",act_todo_form,Todos,,0
-model,"ir.action,name",act_todo_form2,Todos,,0
-model,"ir.action,name",act_todo_form3,Todos,,0
-model,"ir.ui.menu,name",menu_todo_form,Todos,Задачи,0
-model,"ir.ui.menu,name",menu_todo_form2,New Todo,Новая задача,0
-selection,"calendar.todo,classification",0,Confidential,Конфиденциальное,0
-selection,"calendar.todo,classification",0,Private,Личное,0
-selection,"calendar.todo,classification",0,Public,Публичное,0
-selection,"calendar.todo,status",0,,,0
-selection,"calendar.todo,status",0,Cancelled,Отмененно,0
-selection,"calendar.todo,status",0,Completed,Выполнен,0
-selection,"calendar.todo,status",0,In-Process,В процессе,0
-selection,"calendar.todo,status",0,Needs-Action,Требуется действие,0
-view,calendar.todo,0,Attendees,Участники,0
-view,calendar.todo,0,Categories,Категория,0
-view,calendar.todo,0,General,Основной,0
-view,calendar.todo,0,Occurences,Повторение,0
-view,calendar.todo,0,Todo,Дело,0
-view,calendar.todo,0,Todos,Дела,0
-view,calendar.todo.attendee,0,Attendee,Участник,0
-view,calendar.todo.attendee,0,Attendees,Участники,0
-view,calendar.todo.exdate,0,Exception Date,Дата исключения,0
-view,calendar.todo.exdate,0,Exception Dates,Дата исключения,0
-view,calendar.todo.exrule,0,Exception Rule,Правило исключения,0
-view,calendar.todo.exrule,0,Exception Rules,Правила исключения,0
-view,calendar.todo.rdate,0,Recurrence Date,Даты повторения,0
-view,calendar.todo.rdate,0,Recurrence Dates,Даты повторения,0
-view,calendar.todo.rrule,0,Recurrence Rule,Правила повторения,0
-view,calendar.todo.rrule,0,Recurrence Rules,Правила повторения,0
diff --git a/setup.py b/setup.py
index 7948e48..65d89f1 100644
--- a/setup.py
+++ b/setup.py
@@ -39,19 +39,21 @@ setup(name='trytond_calendar_todo',
     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',
diff --git a/tests/test_calendar_todo.py b/tests/test_calendar_todo.py
index 16ecb7b..de92dd8 100644
--- a/tests/test_calendar_todo.py
+++ b/tests/test_calendar_todo.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 CalendarTodoTestCase(unittest.TestCase):
@@ -27,6 +27,12 @@ class CalendarTodoTestCase(unittest.TestCase):
         '''
         test_view('calendar_todo')
 
+    def test0006depends(self):
+        '''
+        Test depends.
+        '''
+        test_depends()
+
 def suite():
     suite = trytond.tests.test_tryton.suite()
     suite.addTests(unittest.TestLoader().loadTestsFromTestCase(
diff --git a/todo.py b/todo.py
index 1dfe1bd..6226af9 100644
--- a/todo.py
+++ b/todo.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,8 +9,9 @@ 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 Not, Equal, Eval, If, Bool, In
+from trytond.pyson import Eval, If, Bool
 from trytond.transaction import Transaction
+from trytond.pool import Pool
 
 tzlocal = dateutil.tz.tzlocal()
 tzutc = dateutil.tz.tzutc()
@@ -34,23 +34,21 @@ class Todo(ModelSQL, ModelView):
         ('confidential', 'Confidential'),
         ], 'Classification', required=True)
     completed = fields.DateTime('Completed',
-            states={
-                'readonly': Not(Equal(Eval('status'), 'completed')),
+        states={
+            'readonly': Eval('status') != 'completed',
             }, depends=['status'])
     description = fields.Text('Description')
     dtstart = fields.DateTime('Start Date', select=1)
     location = fields.Many2One('calendar.location', 'Location')
     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.todo.attendee', 'todo',
             'Attendees')
     percent_complete = fields.Integer('Percent complete',
-            states={
-                'readonly': Not(In(Eval('status'),
-                    ['needs-action', 'in-process'])),
+        states={
+            'readonly': ~Eval('status').in_(['needs-action', 'in-process']),
             }, depends=['status'])
     occurences = fields.One2Many('calendar.todo', 'parent', 'Occurences',
             domain=[
@@ -61,9 +59,9 @@ class Todo(ModelSQL, ModelView):
                 'invisible': Bool(Eval('parent')),
             }, depends=['uuid', 'calendar', 'parent'])
     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'])
     sequence = fields.Integer('Sequence')
     parent = fields.Many2One('calendar.todo', 'Parent',
             domain=[
@@ -125,8 +123,8 @@ class Todo(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_todo_line3'),
@@ -148,7 +146,7 @@ class Todo(ModelSQL, ModelView):
         return 'public'
 
     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
 
@@ -197,8 +195,8 @@ class Todo(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(Todo, self).create(values)
         todo = self.browse(res)
@@ -247,10 +245,11 @@ class Todo(ModelSQL, ModelView):
         return res
 
     def _todo2update(self, todo):
-        rdate_obj = self.pool.get('calendar.todo.rdate')
-        exdate_obj = self.pool.get('calendar.todo.exdate')
-        rrule_obj = self.pool.get('calendar.todo.rrule')
-        exrule_obj = self.pool.get('calendar.todo.exrule')
+        pool = Pool()
+        rdate_obj = pool.get('calendar.todo.rdate')
+        exdate_obj = pool.get('calendar.todo.exdate')
+        rrule_obj = pool.get('calendar.todo.rrule')
+        exrule_obj = pool.get('calendar.todo.exrule')
 
         res = {}
         res['summary'] = todo.summary
@@ -280,8 +279,8 @@ class Todo(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
 
@@ -360,8 +359,8 @@ class Todo(ModelSQL, ModelView):
         return res
 
     def delete(self, ids):
-        attendee_obj = self.pool.get('calendar.todo.attendee')
-        collection_obj = self.pool.get('webdav.collection')
+        attendee_obj = Pool().get('calendar.todo.attendee')
+        collection_obj = Pool().get('webdav.collection')
 
         if isinstance(ids, (int, long)):
             ids = [ids]
@@ -420,15 +419,16 @@ class Todo(ModelSQL, ModelView):
         :param vtodo: the vtodo 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.todo.alarm')
-        attendee_obj = self.pool.get('calendar.todo.attendee')
-        rdate_obj = self.pool.get('calendar.todo.rdate')
-        exdate_obj = self.pool.get('calendar.todo.exdate')
-        rrule_obj = self.pool.get('calendar.todo.rrule')
-        exrule_obj = self.pool.get('calendar.todo.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.todo.alarm')
+        attendee_obj = pool.get('calendar.todo.attendee')
+        rdate_obj = pool.get('calendar.todo.rdate')
+        exdate_obj = pool.get('calendar.todo.exdate')
+        rrule_obj = pool.get('calendar.todo.rrule')
+        exrule_obj = pool.get('calendar.todo.exrule')
 
         vtodos = []
         if not vtodo:
@@ -664,13 +664,14 @@ class Todo(ModelSQL, ModelView):
             or a calendar.todo id
         :return: an iCalendar instance of vobject
         '''
-        user_obj = self.pool.get('res.user')
-        alarm_obj = self.pool.get('calendar.todo.alarm')
-        attendee_obj = self.pool.get('calendar.todo.attendee')
-        rdate_obj = self.pool.get('calendar.todo.rdate')
-        exdate_obj = self.pool.get('calendar.todo.exdate')
-        rrule_obj = self.pool.get('calendar.todo.rrule')
-        exrule_obj = self.pool.get('calendar.todo.exrule')
+        pool = Pool()
+        user_obj = pool.get('res.user')
+        alarm_obj = pool.get('calendar.todo.alarm')
+        attendee_obj = pool.get('calendar.todo.attendee')
+        rdate_obj = pool.get('calendar.todo.rdate')
+        exdate_obj = pool.get('calendar.todo.exdate')
+        rrule_obj = pool.get('calendar.todo.rrule')
+        exrule_obj = pool.get('calendar.todo.exrule')
 
         if isinstance(todo, (int, long)):
             todo = self.browse(todo)
@@ -862,14 +863,14 @@ class TodoRDate(ModelSQL, ModelView):
         return super(TodoRDate, self).init(module_name)
 
     def create(self, values):
-        todo_obj = self.pool.get('calendar.todo')
+        todo_obj = Pool().get('calendar.todo')
         if values.get('todo'):
             # Update write_date of todo
             todo_obj.write(values['todo'], {})
         return super(TodoRDate, self).create(values)
 
     def write(self, ids, values):
-        todo_obj = self.pool.get('calendar.todo')
+        todo_obj = Pool().get('calendar.todo')
         if isinstance(ids, (int, long)):
             ids = [ids]
         todo_ids = [x.todo.id for x in self.browse(ids)]
@@ -881,8 +882,8 @@ class TodoRDate(ModelSQL, ModelView):
         return super(TodoRDate, self).write(ids, values)
 
     def delete(self, ids):
-        todo_obj = self.pool.get('calendar.todo')
-        rdate_obj = self.pool.get('calendar.date')
+        todo_obj = Pool().get('calendar.todo')
+        rdate_obj = Pool().get('calendar.date')
         if isinstance(ids, (int, long)):
             ids = [ids]
         todo_rdates = self.browse(ids)
@@ -897,15 +898,15 @@ class TodoRDate(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)
 
 TodoRDate()
@@ -924,14 +925,14 @@ class TodoRRule(ModelSQL, ModelView):
             select=1, required=True)
 
     def create(self, values):
-        todo_obj = self.pool.get('calendar.todo')
+        todo_obj = Pool().get('calendar.todo')
         if values.get('todo'):
             # Update write_date of todo
             todo_obj.write(values['todo'], {})
         return super(TodoRRule, self).create(values)
 
     def write(self, ids, values):
-        todo_obj = self.pool.get('calendar.todo')
+        todo_obj = Pool().get('calendar.todo')
         if isinstance(ids, (int, long)):
             ids = [ids]
         todo_ids = [x.todo.id for x in self.browse(ids)]
@@ -943,8 +944,8 @@ class TodoRRule(ModelSQL, ModelView):
         return super(TodoRRule, self).write(ids, values)
 
     def delete(self, ids):
-        todo_obj = self.pool.get('calendar.todo')
-        rrule_obj = self.pool.get('calendar.rrule')
+        todo_obj = Pool().get('calendar.todo')
+        rrule_obj = Pool().get('calendar.rrule')
         if isinstance(ids, (int, long)):
             ids = [ids]
         todo_rrules = self.browse(ids)
@@ -959,15 +960,15 @@ class TodoRRule(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)
 
 TodoRRule()
@@ -1001,7 +1002,7 @@ class TodoAttendee(ModelSQL, ModelView):
             required=True, select=1)
 
     def create(self, values):
-        todo_obj = self.pool.get('calendar.todo')
+        todo_obj = Pool().get('calendar.todo')
 
         if values.get('todo'):
             # Update write_date of todo
@@ -1034,7 +1035,7 @@ class TodoAttendee(ModelSQL, ModelView):
         return res
 
     def write(self, ids, values):
-        todo_obj = self.pool.get('calendar.todo')
+        todo_obj = Pool().get('calendar.todo')
 
         if isinstance(ids, (int, long)):
             ids = [ids]
@@ -1078,8 +1079,8 @@ class TodoAttendee(ModelSQL, ModelView):
         return res
 
     def delete(self, ids):
-        todo_obj = self.pool.get('calendar.todo')
-        attendee_obj = self.pool.get('calendar.attendee')
+        todo_obj = Pool().get('calendar.todo')
+        attendee_obj = Pool().get('calendar.attendee')
 
         if isinstance(ids, (int, long)):
             ids = [ids]
@@ -1140,7 +1141,7 @@ class TodoAttendee(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)):
@@ -1161,15 +1162,15 @@ class TodoAttendee(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)
 
 TodoAttendee()
@@ -1187,14 +1188,14 @@ class TodoAlarm(ModelSQL):
             required=True, select=1)
 
     def create(self, values):
-        todo_obj = self.pool.get('calendar.todo')
+        todo_obj = Pool().get('calendar.todo')
         if values.get('todo'):
             # Update write_date of todo
             todo_obj.write(values['todo'], {})
         return super(TodoAlarm, self).create(values)
 
     def write(self, ids, values):
-        todo_obj = self.pool.get('calendar.todo')
+        todo_obj = Pool().get('calendar.todo')
         if isinstance(ids, (int, long)):
             ids = [ids]
         todo_ids = [x.todo.id for x in self.browse(ids)]
@@ -1206,8 +1207,8 @@ class TodoAlarm(ModelSQL):
         return super(TodoAlarm, self).write(ids, values)
 
     def delete(self, ids):
-        todo_obj = self.pool.get('calendar.todo')
-        alarm_obj = self.pool.get('calendar.alarm')
+        todo_obj = Pool().get('calendar.todo')
+        alarm_obj = Pool().get('calendar.alarm')
         if isinstance(ids, (int, long)):
             ids = [ids]
         todo_alarms = self.browse(ids)
@@ -1222,11 +1223,11 @@ class TodoAlarm(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)
 
 TodoAlarm()
diff --git a/todo.xml b/todo.xml
index fbc4aef..71a9d41 100644
--- a/todo.xml
+++ b/todo.xml
@@ -10,12 +10,12 @@ this repository contains the full copyright notices and license terms. -->
             <field name="arch" type="xml">
                 <![CDATA[
                 <tree string="Todos">
-                    <field name="calendar" select="1"/>
-                    <field name="summary" select="1"/>
-                    <field name="dtstart" select="1"/>
-                    <field name="due" select="1"/>
-                    <field name="status" select="2"/>
-                    <field name="percent_complete" select="2"/>
+                    <field name="calendar"/>
+                    <field name="summary"/>
+                    <field name="dtstart"/>
+                    <field name="due"/>
+                    <field name="status"/>
+                    <field name="percent_complete"/>
                 </tree>
                 ]]>
             </field>
@@ -53,7 +53,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">
@@ -69,12 +68,12 @@ this repository contains the full copyright notices and license terms. -->
                             <field name="exdates" colspan="2"/>
                             <field name="occurences" colspan="4">
                                 <tree string="Todos">
-                                    <field name="summary" select="1"/>
-                                    <field name="recurrence" select="1"/>
-                                    <field name="dtstart" select="2"/>
-                                    <field name="due" select="2"/>
-                                    <field name="status" select="2"/>
-                                    <field name="percent_complete" select="2"/>
+                                    <field name="summary"/>
+                                    <field name="recurrence"/>
+                                    <field name="dtstart"/>
+                                    <field name="due"/>
+                                    <field name="status"/>
+                                    <field name="percent_complete"/>
                                 </tree>
                             </field>
                         </page>
@@ -101,23 +100,6 @@ this repository contains the full copyright notices and license terms. -->
         </record>
         <menuitem parent="calendar.menu_calendar_form" sequence="30"
             action="act_todo_form" id="menu_todo_form"/>
-        <record model="ir.action.act_window" id="act_todo_form2">
-            <field name="name">Todos</field>
-            <field name="res_model">calendar.todo</field>
-            <field name="domain">[('parent', '=', False)]</field>
-        </record>
-        <record model="ir.action.act_window.view" id="act_todo_form2_view1">
-            <field name="sequence" eval="10"/>
-            <field name="view" ref="todo_view_form"/>
-            <field name="act_window" ref="act_todo_form2"/>
-        </record>
-        <record model="ir.action.act_window.view" id="act_todo_form2_view2">
-            <field name="sequence" eval="20"/>
-            <field name="view" ref="todo_view_tree"/>
-            <field name="act_window" ref="act_todo_form2"/>
-        </record>
-        <menuitem name="New Todo" parent="menu_todo_form" sequence="10"
-            action="act_todo_form2" id="menu_todo_form2"/>
 
         <record model="ir.action.act_window" id="act_todo_form3">
             <field name="name">Todos</field>
@@ -137,7 +119,7 @@ this repository contains the full copyright notices and license terms. -->
         <record model="ir.action.keyword"
                 id="act_open_todo_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_todo_form3"/>
         </record>
 
@@ -191,9 +173,9 @@ this repository contains the full copyright notices and license terms. -->
             <field name="arch" type="xml">
                 <![CDATA[
                 <tree string="Attendees">
-                    <field name="todo" select="1"/>
-                    <field name="email" select="1"/>
-                    <field name="status" select="1"/>
+                    <field name="todo"/>
+                    <field name="email"/>
+                    <field name="status"/>
                 </tree>
                 ]]>
             </field>
@@ -222,9 +204,9 @@ this repository contains the full copyright notices and license terms. -->
             <field name="arch" type="xml">
                 <![CDATA[
                 <tree string="Recurrence Dates">
-                    <field name="todo" select="1"/>
-                    <field name="datetime" select="1"/>
-                    <field name="date" select="2"/>
+                    <field name="todo"/>
+                    <field name="datetime"/>
+                    <field name="date"/>
                 </tree>
                 ]]>
             </field>
@@ -253,9 +235,9 @@ this repository contains the full copyright notices and license terms. -->
             <field name="arch" type="xml">
                 <![CDATA[
                 <tree string="Exception Dates">
-                    <field name="todo" select="1"/>
-                    <field name="datetime" select="1"/>
-                    <field name="date" select="2"/>
+                    <field name="todo"/>
+                    <field name="datetime"/>
+                    <field name="date"/>
                 </tree>
                 ]]>
             </field>
@@ -284,8 +266,8 @@ this repository contains the full copyright notices and license terms. -->
             <field name="arch" type="xml">
                 <![CDATA[
                 <tree string="Recurrence Rules">
-                    <field name="todo" select="1"/>
-                    <field name="freq" select="1"/>
+                    <field name="todo"/>
+                    <field name="freq"/>
                 </tree>
                 ]]>
             </field>
@@ -340,8 +322,8 @@ this repository contains the full copyright notices and license terms. -->
             <field name="arch" type="xml">
                 <![CDATA[
                 <tree string="Exception Rules">
-                    <field name="todo" select="1"/>
-                    <field name="freq" select="1"/>
+                    <field name="todo"/>
+                    <field name="freq"/>
                 </tree>
                 ]]>
             </field>
diff --git a/trytond_calendar_todo.egg-info/PKG-INFO b/trytond_calendar_todo.egg-info/PKG-INFO
index 5168095..41e6827 100644
--- a/trytond_calendar_todo.egg-info/PKG-INFO
+++ b/trytond_calendar_todo.egg-info/PKG-INFO
@@ -1,29 +1,31 @@
 Metadata-Version: 1.0
 Name: trytond-calendar-todo
-Version: 2.0.0
+Version: 2.2.0
 Summary: Add Todo support on CalDAV
 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_todo.egg-info/SOURCES.txt b/trytond_calendar_todo.egg-info/SOURCES.txt
index 6621296..bb326df 100644
--- a/trytond_calendar_todo.egg-info/SOURCES.txt
+++ b/trytond_calendar_todo.egg-info/SOURCES.txt
@@ -4,12 +4,6 @@ INSTALL
 LICENSE
 MANIFEST.in
 README
-bg_BG.csv
-de_DE.csv
-es_CO.csv
-es_ES.csv
-fr_FR.csv
-ru_RU.csv
 setup.py
 todo.xml
 ./__init__.py
@@ -19,6 +13,14 @@ todo.xml
 ./webdav.py
 ./tests/__init__.py
 ./tests/test_calendar_todo.py
+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_todo.egg-info/PKG-INFO
 trytond_calendar_todo.egg-info/SOURCES.txt
 trytond_calendar_todo.egg-info/dependency_links.txt
diff --git a/trytond_calendar_todo.egg-info/requires.txt b/trytond_calendar_todo.egg-info/requires.txt
index 4c76c9b..f881d88 100644
--- a/trytond_calendar_todo.egg-info/requires.txt
+++ b/trytond_calendar_todo.egg-info/requires.txt
@@ -2,5 +2,5 @@ vobject >= 0.8.0
 PyWebDAV >= 0.9.3
 python-dateutil
 pytz
-trytond_calendar >= 2.0, < 2.1
-trytond >= 2.0, < 2.1
\ No newline at end of file
+trytond_calendar >= 2.2, < 2.3
+trytond >= 2.2, < 2.3
\ No newline at end of file
diff --git a/webdav.py b/webdav.py
index 8350d45..e7db419 100644
--- a/webdav.py
+++ b/webdav.py
@@ -7,6 +7,7 @@ from trytond.model import ModelView, ModelSQL
 from trytond.tools import reduce_ids
 from trytond.transaction import Transaction
 from trytond.cache import Cache
+from trytond.pool import Pool
 
 
 class Collection(ModelSQL, ModelView):
@@ -23,7 +24,7 @@ class Collection(ModelSQL, ModelView):
         :return: todo id
             or False if there is no todo
         '''
-        todo_obj = self.pool.get('calendar.todo')
+        todo_obj = Pool().get('calendar.todo')
 
         if uri and uri.startswith('Calendars/'):
             calendar, todo_uri = (uri[10:].split('/', 1) + [None])[0:2]
@@ -105,8 +106,8 @@ class Collection(ModelSQL, ModelView):
         return res
 
     def get_childs(self, uri, filter=None, cache=None):
-        calendar_obj = self.pool.get('calendar.calendar')
-        todo_obj = self.pool.get('calendar.todo')
+        calendar_obj = Pool().get('calendar.calendar')
+        todo_obj = Pool().get('calendar.todo')
 
         res = super(Collection, self).get_childs(uri, filter=filter,
                 cache=cache)
@@ -151,8 +152,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')
-        todo_obj = self.pool.get('calendar.todo')
+        calendar_obj = Pool().get('calendar.calendar')
+        todo_obj = Pool().get('calendar.todo')
 
         cursor = Transaction().cursor
 
@@ -197,8 +198,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')
-        todo_obj = self.pool.get('calendar.todo')
+        calendar_obj = Pool().get('calendar.calendar')
+        todo_obj = Pool().get('calendar.todo')
 
         cursor = Transaction().cursor
 
@@ -245,8 +246,8 @@ class Collection(ModelSQL, ModelView):
         return super(Collection, self).get_lastmodified(uri, cache=cache)
 
     def get_data(self, uri, cache=None):
-        todo_obj = self.pool.get('calendar.todo')
-        calendar_obj = self.pool.get('calendar.calendar')
+        todo_obj = Pool().get('calendar.todo')
+        calendar_obj = Pool().get('calendar.calendar')
 
         calendar_id = self.calendar(uri)
         if calendar_id:
@@ -261,8 +262,8 @@ class Collection(ModelSQL, ModelView):
         return super(Collection, self).get_data(uri, cache=cache)
 
     def put(self, uri, data, content_type, cache=None):
-        todo_obj = self.pool.get('calendar.todo')
-        calendar_obj = self.pool.get('calendar.calendar')
+        todo_obj = Pool().get('calendar.todo')
+        calendar_obj = Pool().get('calendar.calendar')
 
         calendar_id = self.calendar(uri)
         if calendar_id:
@@ -289,7 +290,7 @@ class Collection(ModelSQL, ModelView):
         return super(Collection, self).put(uri, data, content_type)
 
     def rm(self, uri, cache=None):
-        todo_obj = self.pool.get('calendar.todo')
+        todo_obj = Pool().get('calendar.todo')
 
         calendar_id = self.calendar(uri)
         if calendar_id:
commit 40dc4778f568186f827dd42aa30f87a409179af5
Author: Mathias Behrle <mathiasb at m9s.biz>
Date:   Fri Jul 22 12:26:57 2011 +0200

    Removing deprecated XB-Python-Version for dh_python2.

diff --git a/debian/control b/debian/control
index 28528f1..5370307 100644
--- a/debian/control
+++ b/debian/control
@@ -17,7 +17,6 @@ Depends:
  ${misc:Depends}, ${python:Depends}, tryton-server (>= 2.0),
  tryton-modules-calendar (>= 2.0), python-dateutil, python-tz, python-vobject,
  python-webdav, python-pkg-resources
-XB-Python-Version: ${python:Versions}
 Description: Tryton Application Platform (Calendar Todo Module)
  Tryton is a high-level general purpose application platform written in Python
  and using PostgreSQL as database engine. It is the core base of a complete
commit 52a3f69e9e628aa293e484065670e586a9fb1a4b
Author: Mathias Behrle <mathiasb at m9s.biz>
Date:   Thu Jul 14 01:13:53 2011 +0200

    Releasing debian version 2.0.0-2.

diff --git a/debian/changelog b/debian/changelog
index 791e2a0..a6d4593 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,16 @@
+tryton-modules-calendar-todo (2.0.0-2) unstable; urgency=low
+
+  [ Daniel Baumann ]
+  * Removing for new source package version obsoleted README.source file.
+  * Adding options for source package.
+  * Compacting copyright file.
+  * Not wrapping uploaders field, it does not exceed 80 chars.
+
+  [ Mathias Behrle ]
+  * Moving from deprecated python-support to dh_python2.
+
+ -- Mathias Behrle <mathiasb at m9s.biz>  Thu, 14 Jul 2011 01:13:48 +0200
+
 tryton-modules-calendar-todo (2.0.0-1) unstable; urgency=low
 
   * Updating to standards version 3.9.2.
commit 6426a9e0e206517c87115823f15ce3634fa0f0db
Author: Mathias Behrle <mathiasb at m9s.biz>
Date:   Wed Jul 13 20:06:44 2011 +0200

    Moving from deprecated python-support to dh_python2.

diff --git a/debian/control b/debian/control
index cb3c298..28528f1 100644
--- a/debian/control
+++ b/debian/control
@@ -4,11 +4,12 @@ Priority: optional
 Maintainer: Debian Tryton Maintainers <tryton at lists.debian-maintainers.org>
 Uploaders: Daniel Baumann <daniel at debian.org>, Mathias Behrle <mathiasb at m9s.biz>
 Dm-Upload-Allowed: yes
-Build-Depends: debhelper (>= 8), python, python-setuptools, python-support
+Build-Depends: debhelper (>= 8), python (>= 2.6.6-3~), python-setuptools
 Standards-Version: 3.9.2
 Homepage: http://www.tryton.org/
 Vcs-Browser: http://git.debian-maintainers.org/?p=tryton/tryton-modules-calendar-todo.git
 Vcs-Git: git://git.debian-maintainers.org/git/tryton/tryton-modules-calendar-todo.git
+X-Python-Version: >= 2.5
 
 Package: tryton-modules-calendar-todo
 Architecture: all
diff --git a/debian/pycompat b/debian/pycompat
deleted file mode 100644
index 0cfbf08..0000000
--- a/debian/pycompat
+++ /dev/null
@@ -1 +0,0 @@
-2
diff --git a/debian/pydist-overrides b/debian/pydist-overrides
new file mode 100644
index 0000000..9aad9d3
--- /dev/null
+++ b/debian/pydist-overrides
@@ -0,0 +1,5 @@
+python_dateutil python-dateutil
+vobject python-vobject
+PyWebDAV python-webdav
+pytz python-tz
+
diff --git a/debian/pyversions b/debian/pyversions
deleted file mode 100644
index b3dc41e..0000000
--- a/debian/pyversions
+++ /dev/null
@@ -1 +0,0 @@
-2.5-
diff --git a/debian/rules b/debian/rules
index 000210b..e32b791 100755
--- a/debian/rules
+++ b/debian/rules
@@ -1,4 +1,9 @@
 #!/usr/bin/make -f
 
 %:
-	dh ${@}
+	dh ${@} --with python2
+
+override_dh_auto_clean:
+	dh_auto_clean
+
+	rm -rf *.egg-info
commit 9b7458e854d53feb63a37f04e85fbc63e6321842
Author: Daniel Baumann <daniel at debian.org>
Date:   Sun Jul 10 16:01:11 2011 +0200

    Not wrapping uploaders field, it does not exceed 80 chars.

diff --git a/debian/control b/debian/control
index a5afa3e..cb3c298 100644
--- a/debian/control
+++ b/debian/control
@@ -2,9 +2,7 @@ Source: tryton-modules-calendar-todo
 Section: python
 Priority: optional
 Maintainer: Debian Tryton Maintainers <tryton at lists.debian-maintainers.org>
-Uploaders:
- Daniel Baumann <daniel at debian.org>,
- Mathias Behrle <mathiasb at m9s.biz>
+Uploaders: Daniel Baumann <daniel at debian.org>, Mathias Behrle <mathiasb at m9s.biz>
 Dm-Upload-Allowed: yes
 Build-Depends: debhelper (>= 8), python, python-setuptools, python-support
 Standards-Version: 3.9.2
commit fac072fc4da30989bbbd808bfb0083f14a56392d
Author: Daniel Baumann <daniel at debian.org>
Date:   Sun Jul 10 15:54:39 2011 +0200

    Compacting copyright file.

diff --git a/debian/copyright b/debian/copyright
index 04f8161..6da6058 100644
--- a/debian/copyright
+++ b/debian/copyright
@@ -1,33 +1,15 @@
-Upstream-Contact: Tryton project <tryton at googlegroups.com>
-Upstream-Homepage: http://downloads.tryton.org/
-Maintainer-Contact: Debian Tryton Maintainers <tryton at lists.debian-maintainers.org>
-Maintainer-Homepage: http://tryton.debian-maintainers.org/
-
 Files: *
 Copyright:
  (C) 2009-2011 Cedric Krier
  (C) 2009-2011 Bertrand Chenal
  (C) 2009-2011 B2CK SPRL
 License: GPL-3+
- 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/>.
- .
- On Debian systems, the complete text of the GNU General Public License
- can be found in /usr/share/common-licenses/GPL-3 file.
 
 Files: debian/*
 Copyright: (C) 2009-2011 Daniel Baumann <daniel at debian.org>
 License: GPL-3+
+
+License: GPL-3+
  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
@@ -41,5 +23,5 @@ License: GPL-3+
  You should have received a copy of the GNU General Public License
  along with this program. If not, see <http://www.gnu.org/licenses/>.
  .
- On Debian systems, the complete text of the GNU General Public License
+ The complete text of the GNU General Public License
  can be found in /usr/share/common-licenses/GPL-3 file.
commit 9b3551bc822c35a385269c9a20363d894499a878
Author: Daniel Baumann <daniel at debian.org>
Date:   Sun Jul 10 15:38:54 2011 +0200

    Adding options for source package.

diff --git a/debian/source/options b/debian/source/options
new file mode 100644
index 0000000..d053b65
--- /dev/null
+++ b/debian/source/options
@@ -0,0 +1,2 @@
+compression = gzip
+compression-level = 9
commit bc65032b5763a988cb074639c62e5710e49b7605
Author: Daniel Baumann <daniel at debian.org>
Date:   Sun Jul 10 15:38:02 2011 +0200

    Removing for new source package version obsoleted README.source file.

diff --git a/debian/README.source b/debian/README.source
deleted file mode 100644
index 18b6b24..0000000
--- a/debian/README.source
+++ /dev/null
@@ -1,37 +0,0 @@
-Package Repositories
---------------------
-
-Backports for the current stable debian distribution as well as snapshots of
-unreleased versions may be available in repositories listed on the maintainers
-homepage. The current URL of the maintainer homepage can be seen in
-debian/copyright.
-
-
-Source Access
--------------
-
-You can obtain the sources of this package with:
-
-  $ apt-get source ${PACKAGE}
-
-whereas '${PACKAGE}' has to be replaced with the actual name of the package.
-
-This package is maintained with the Git version control system. The current git
-source tree can be obtained with:
-
-  $ git clone ${GIT_URI}
-
-whereas '${GIT_URI}' has to be replaced with the actual URI for the Git
-repository. The current Git URI can be seen in debian/control in the extracted
-package sources.
-
-More information about Git can be found in the git-core package.
-
-This package may use the Quilt patch system to manage all modifications to the
-upstream source. Changes, if any, are stored in the source package as diffs in
-debian/diff and are applied during the build. Current modifications can be
-applied to the source tree with:
-
-  $ QUILT_PATCHES=debian/patches quilt push -a
-
-More information about Quilt can be found in the quilt package.
commit d3e2026268ee9d594d4e9bb68a5897aaa96330d5
Author: Mathias Behrle <mathiasb at m9s.biz>
Date:   Tue May 24 21:40:01 2011 +0200

    Releasing debian version 2.0.0-1.

diff --git a/debian/changelog b/debian/changelog
index 0093e55..791e2a0 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,12 @@
+tryton-modules-calendar-todo (2.0.0-1) unstable; urgency=low
+
+  * Updating to standards version 3.9.2.
+  * Merging upstream version 2.0.0.
+  * Updating Copyright.
+  * Updating versioned tryton depends to 2.0.
+
+ -- Mathias Behrle <mathiasb at m9s.biz>  Tue, 24 May 2011 21:32:55 +0200
+
 tryton-modules-calendar-todo (1.8.0-2) unstable; urgency=low
 
   * Changing my email address.
commit 1610a1812e25a38a5cea99f0afc1e45961694beb
Author: Mathias Behrle <mathiasb at m9s.biz>
Date:   Tue May 24 21:21:34 2011 +0200

    Updating versioned tryton depends to 2.0.

diff --git a/debian/control b/debian/control
index a6834cd..a5afa3e 100644
--- a/debian/control
+++ b/debian/control
@@ -15,8 +15,8 @@ Vcs-Git: git://git.debian-maintainers.org/git/tryton/tryton-modules-calendar-tod
 Package: tryton-modules-calendar-todo
 Architecture: all
 Depends:
- ${misc:Depends}, ${python:Depends}, tryton-server (>= 1.8),
- tryton-modules-calendar (>= 1.8), python-dateutil, python-tz, python-vobject,
+ ${misc:Depends}, ${python:Depends}, tryton-server (>= 2.0),
+ tryton-modules-calendar (>= 2.0), python-dateutil, python-tz, python-vobject,
  python-webdav, python-pkg-resources
 XB-Python-Version: ${python:Versions}
 Description: Tryton Application Platform (Calendar Todo Module)
commit b308ed040d5b33c596aa11fc4ee0d6ba375d91c8
Author: Mathias Behrle <mathiasb at m9s.biz>
Date:   Tue May 24 20:40:03 2011 +0200

    Updating Copyright.

diff --git a/debian/copyright b/debian/copyright
index 213e426..04f8161 100644
--- a/debian/copyright
+++ b/debian/copyright
@@ -5,9 +5,9 @@ Maintainer-Homepage: http://tryton.debian-maintainers.org/
 
 Files: *
 Copyright:
- (C) 2009-2010 Cedric Krier
- (C) 2009-2010 Bertrand Chenal
- (C) 2009-2010 B2CK SPRL
+ (C) 2009-2011 Cedric Krier
+ (C) 2009-2011 Bertrand Chenal
+ (C) 2009-2011 B2CK SPRL
 License: GPL-3+
  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
commit 8a3a86d5ffd90061751004e6ac07cbf9ae80ad0d
Author: Mathias Behrle <mathiasb at m9s.biz>
Date:   Tue May 24 19:12:45 2011 +0200

    Merging upstream version 2.0.0.

diff --git a/CHANGELOG b/CHANGELOG
index 5ad4130..8d69511 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,3 +1,6 @@
+Version 2.0.0 - 2011-04-27
+* 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 1af6f43..744dd33 100644
--- a/PKG-INFO
+++ b/PKG-INFO
@@ -1,12 +1,12 @@
 Metadata-Version: 1.0
 Name: trytond_calendar_todo
-Version: 1.8.0
+Version: 2.0.0
 Summary: Add Todo support on CalDAV
 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 59480e6..f04e3f8 100644
--- a/__tryton__.py
+++ b/__tryton__.py
@@ -3,19 +3,23 @@
 #this repository contains the full copyright notices and license terms.
 {
     'name' : 'Calendar Todo',
+    'name_bg_BG' : 'Задачи за календар',
     'name_de_DE' : 'Kalender Aufgaben',
     'name_es_CO': 'Calendario de tareas',
     'name_es_ES': 'Calendario de tareas',
     'name_fr_FR' : 'Tâche Calendrier',
-    'version' : '1.8.0',
+    'name_ru_RU' : 'Задачи для календаря',
+    'version' : '2.0.0',
     'author' : 'B2CK',
     'email': 'info at b2ck.com',
     'website': 'http://www.tryton.org/',
     'description': 'Add Todo support on CalDAV',
+    'description_bg_BG' : 'Добавя поддръжка на задачи в CalDAV',
     'description_de_DE' : 'Fügt Unterstützung für Aufgaben in CalDAV hinzu',
     'description_es_CO': 'Añade soporte de tareas sobre CalDAV',
     'description_es_ES': 'Añade soporte de tareas sobre CalDAV',
     'description_fr_FR': 'Ajoute la gestion des tâches au CalDAV',
+    'description_ru_RU' : 'Добавление поддержки задач для CalDAV',
     'depends' : [
         'ir',
         'res',
@@ -26,9 +30,11 @@
         'todo.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..0446c93
--- /dev/null
+++ b/bg_BG.csv
@@ -0,0 +1,91 @@
+type,name,res_id,src,value,fuzzy
+error,calendar.todo,0,Recurrence can not be recurrent!,Повторението не може да е периодично!,0
+error,calendar.todo,0,UUID and recurrence must be unique in a calendar!,UUID и взаимна вложеност трябва да са уникални в календар!,0
+field,"calendar.todo,alarms",0,Alarms,Аларми,0
+field,"calendar.todo,attendees",0,Attendees,Присъстващи,0
+field,"calendar.todo,calendar",0,Calendar,Календар,0
+field,"calendar.todo,calendar_owner",0,Owner,Собственик,0
+field,"calendar.todo,calendar_read_users",0,Read Users,Потребители с права за четене,0
+field,"calendar.todo,calendar_write_users",0,Write Users,Записване на потребители,0
+field,"calendar.todo,categories",0,Categories,Категории,0
+field,"calendar.todo,classification",0,Classification,Класификация,0
+field,"calendar.todo,completed",0,Completed,Изпълнен,0
+field,"calendar.todo,description",0,Description,Описание,0
+field,"calendar.todo,dtstart",0,Start Date,Начална дата,0
+field,"calendar.todo,due",0,Due Date,Дата на изпълнение,0
+field,"calendar.todo,exdates",0,Exception Dates,Дати на грешките,0
+field,"calendar.todo,exrules",0,Exception Rules,Правила при грешка,0
+field,"calendar.todo,location",0,Location,Местоположение,0
+field,"calendar.todo,occurences",0,Occurences,Събития,0
+field,"calendar.todo,organizer",0,Organizer,Организатор,0
+field,"calendar.todo,parent",0,Parent,Родител,0
+field,"calendar.todo,percent_complete",0,Percent complete,Процент изпълнено,0
+field,"calendar.todo,rdates",0,Recurrence Dates,Дати на повторяемост,0
+field,"calendar.todo,rec_name",0,Name,Име,0
+field,"calendar.todo,recurrence",0,Recurrence,Повторение,0
+field,"calendar.todo,rrules",0,Recurrence Rules,Правила за повторяемост,0
+field,"calendar.todo,sequence",0,Sequence,Последователност,0
+field,"calendar.todo,status",0,Status,Състояние,0
+field,"calendar.todo,summary",0,Summary,Обобщено,0
+field,"calendar.todo,timezone",0,Timezone,Времева зона,0
+field,"calendar.todo,uuid",0,UUID,UUID,0
+field,"calendar.todo,vtodo",0,vtodo,,0
+field,"calendar.todo-calendar.category,category",0,Category,Категория,0
+field,"calendar.todo-calendar.category,rec_name",0,Name,Име,0
+field,"calendar.todo-calendar.category,todo",0,To-Do,Задача,0
+field,"calendar.todo.alarm,calendar_alarm",0,Calendar Alarm,Аларма на календар,0
+field,"calendar.todo.alarm,rec_name",0,Name,Име,0
+field,"calendar.todo.alarm,todo",0,Todo,Задача,0
+field,"calendar.todo.attendee,calendar_attendee",0,Calendar Attendee,Присъстващ на календар,0
+field,"calendar.todo.attendee,rec_name",0,Name,Име,0
+field,"calendar.todo.attendee,todo",0,Todo,Задача,0
+field,"calendar.todo.exdate,calendar_date",0,Calendar Date,Дата от календар,0
+field,"calendar.todo.exdate,rec_name",0,Name,Име,0
+field,"calendar.todo.exdate,todo",0,Todo,Задача,0
+field,"calendar.todo.exrule,calendar_rrule",0,Calendar RRule,,0
+field,"calendar.todo.exrule,rec_name",0,Name,Име,0
+field,"calendar.todo.exrule,todo",0,Todo,Задача,0
+field,"calendar.todo.rdate,calendar_date",0,Calendar Date,Дата от календар,0
+field,"calendar.todo.rdate,rec_name",0,Name,Име,0
+field,"calendar.todo.rdate,todo",0,Todo,Задача,0
+field,"calendar.todo.rrule,calendar_rrule",0,Calendar RRule,,0
+field,"calendar.todo.rrule,rec_name",0,Name,Име,0
+field,"calendar.todo.rrule,todo",0,Todo,Задача,0
+help,"calendar.todo,uuid",0,Universally Unique Identifier,Универсален иникален идентификатор,0
+model,"calendar.todo,name",0,Todo,Задача,0
+model,"calendar.todo-calendar.category,name",0,Todo - Category,Задача - Категория,0
+model,"calendar.todo.alarm,name",0,Alarm,Аларма,0
+model,"calendar.todo.attendee,name",0,Attendee,Присъстващ,0
+model,"calendar.todo.exdate,name",0,Exception Date,Дата на грешка,0
+model,"calendar.todo.exrule,name",0,Exception Rule,Правило при грешка,0
+model,"calendar.todo.rdate,name",0,Todo Recurrence Date,Дата на повторение на задача,0
+model,"calendar.todo.rrule,name",0,Recurrence Rule,Правило за повторение,0
+model,"ir.action,name",act_todo_form,Todos,Задачи,0
+model,"ir.action,name",act_todo_form2,Todos,Задачи,0
+model,"ir.action,name",act_todo_form3,Todos,Задачи,0
+model,"ir.ui.menu,name",menu_todo_form,Todos,Задачи,0
+model,"ir.ui.menu,name",menu_todo_form2,New Todo,Нова задача,0
+selection,"calendar.todo,classification",0,Confidential,Поверителен,0
+selection,"calendar.todo,classification",0,Private,Частен,0
+selection,"calendar.todo,classification",0,Public,Публичен,0
+selection,"calendar.todo,status",0,,,0
+selection,"calendar.todo,status",0,Cancelled,Отказан,0
+selection,"calendar.todo,status",0,Completed,Изпълнен,0
+selection,"calendar.todo,status",0,In-Process,Обработва се,0
+selection,"calendar.todo,status",0,Needs-Action,Необходимо е действие,0
+view,calendar.todo,0,Attendees,Присъстващи,0
+view,calendar.todo,0,Categories,Категории,0
+view,calendar.todo,0,General,Основен,0
+view,calendar.todo,0,Occurences,Събития,0
+view,calendar.todo,0,Todo,Задача,0
+view,calendar.todo,0,Todos,Задачи,0
+view,calendar.todo.attendee,0,Attendee,Присъстващ,0
+view,calendar.todo.attendee,0,Attendees,Присъстващи,0
+view,calendar.todo.exdate,0,Exception Date,Дата на грешка,0
+view,calendar.todo.exdate,0,Exception Dates,Дати на грешките,0
+view,calendar.todo.exrule,0,Exception Rule,Правило при грешка,0
+view,calendar.todo.exrule,0,Exception Rules,Правила при грешка,0
+view,calendar.todo.rdate,0,Recurrence Date,Повтаряща се дата,0
+view,calendar.todo.rdate,0,Recurrence Dates,Дати на повторяемост,0
+view,calendar.todo.rrule,0,Recurrence Rule,Правило за повторение,0
+view,calendar.todo.rrule,0,Recurrence Rules,Правила за повторяемост,0
diff --git a/ru_RU.csv b/ru_RU.csv
new file mode 100644
index 0000000..ebc669f
--- /dev/null
+++ b/ru_RU.csv
@@ -0,0 +1,95 @@
+type,name,res_id,src,value,fuzzy
+error,calendar.todo,0,Recurrence can not be recurrent!,,0
+error,calendar.todo,0,UUID and recurrence must be unique in a calendar!,,0
+field,"calendar.todo,alarms",0,Alarms,Вызов,0
+field,"calendar.todo,attendees",0,Attendees,Участники,0
+field,"calendar.todo,calendar",0,Calendar,Календарь,0
+field,"calendar.todo,calendar_owner",0,Owner,Владелец,0
+field,"calendar.todo,calendar_read_users",0,Read Users,Пользователи могут читать,0
+field,"calendar.todo,calendar_write_users",0,Write Users,Пользователи могут писать,0
+field,"calendar.todo,categories",0,Categories,Категория,0
+field,"calendar.todo,classification",0,Classification,Классификация,0
+field,"calendar.todo,classification_public",0,Classification Public,Классификация общая,0
+field,"calendar.todo,completed",0,Completed,Выполнен,0
+field,"calendar.todo,description",0,Description,Описание,0
+field,"calendar.todo,dtstart",0,Start Date,Дата начала,0
+field,"calendar.todo,due",0,Due Date,Срок сдачи,0
+field,"calendar.todo,exdates",0,Exception Dates,Дата исключения,0
+field,"calendar.todo,exrules",0,Exception Rules,Правила исключения,0
+field,"calendar.todo,location",0,Location,Местоположение,0
+field,"calendar.todo,occurences",0,Occurences,Дополнительные задачи,0
+field,"calendar.todo,organizer",0,Organizer,Организатор,0
+field,"calendar.todo,parent",0,Parent,Основной,0
+field,"calendar.todo,percent_complete",0,Percent complete,Процент выполнения,0
+field,"calendar.todo,rdates",0,Recurrence Dates,Даты повторения,0
+field,"calendar.todo,rec_name",0,Name,Наименование,0
+field,"calendar.todo,recurrence",0,Recurrence,Повторение,0
+field,"calendar.todo,recurrences",0,Recurrences,Повторения,0
+field,"calendar.todo,rrules",0,Recurrence Rules,Правила повторения,0
+field,"calendar.todo,sequence",0,Sequence,Последовательность,0
+field,"calendar.todo,status",0,Status,Состояние,0
+field,"calendar.todo,summary",0,Summary,Резюме,0
+field,"calendar.todo,timezone",0,Timezone,Зона времени,0
+field,"calendar.todo,uuid",0,UUID,,0
+field,"calendar.todo,vtodo",0,vtodo,,0
+field,"calendar.todo-calendar.category,category",0,Category,Категории,0
+field,"calendar.todo-calendar.category,rec_name",0,Name,Наименование,0
+field,"calendar.todo-calendar.category,todo",0,To-Do,Дела,0
+field,"calendar.todo.alarm,calendar_alarm",0,Calendar Alarm,Сигнала календаря,0
+field,"calendar.todo.alarm,rec_name",0,Name,Наименование,0
+field,"calendar.todo.alarm,todo",0,Todo,Дело,0
+field,"calendar.todo.attendee,calendar_attendee",0,Calendar Attendee,Календарь участников,0
+field,"calendar.todo.attendee,rec_name",0,Name,Наименование,0
+field,"calendar.todo.attendee,todo",0,Todo,Дело,0
+field,"calendar.todo.exdate,calendar_date",0,Calendar Date,День календаря,0
+field,"calendar.todo.exdate,calendar_rdate",0,Calendar RDate,День календаря,0
+field,"calendar.todo.exdate,rec_name",0,Name,Наименование,0
+field,"calendar.todo.exdate,todo",0,Todo,Дело,0
+field,"calendar.todo.exrule,calendar_rrule",0,Calendar RRule,Правила календаря,0
+field,"calendar.todo.exrule,rec_name",0,Name,Наименование,0
+field,"calendar.todo.exrule,todo",0,Todo,Дело,0
+field,"calendar.todo.rdate,calendar_date",0,Calendar Date,День календаря,0
+field,"calendar.todo.rdate,calendar_rdate",0,Calendar RDate,День календаря,0
+field,"calendar.todo.rdate,rec_name",0,Name,Наименование,0
+field,"calendar.todo.rdate,todo",0,Todo,Дело,0
+field,"calendar.todo.rrule,calendar_rrule",0,Calendar RRule,Правила календаря,0
+field,"calendar.todo.rrule,rec_name",0,Name,Наименование,0
+field,"calendar.todo.rrule,todo",0,Todo,Дело,0
+help,"calendar.todo,uuid",0,Universally Unique Identifier,Универсальный уникальный идентификатор,0
+model,"calendar.todo,name",0,Todo,Дело,0
+model,"calendar.todo-calendar.category,name",0,Todo - Category,Категории - Дел,0
+model,"calendar.todo.alarm,name",0,Alarm,Вызов,0
+model,"calendar.todo.attendee,name",0,Attendee,Участник,0
+model,"calendar.todo.exdate,name",0,Exception Date,Дата исключения,0
+model,"calendar.todo.exrule,name",0,Exception Rule,Правило исключения,0
+model,"calendar.todo.rdate,name",0,Todo Recurrence Date,Дела повторяющиеся по дате,0
+model,"calendar.todo.rrule,name",0,Recurrence Rule,Правила повторения,0
+model,"ir.action,name",act_todo_form,Todos,,0
+model,"ir.action,name",act_todo_form2,Todos,,0
+model,"ir.action,name",act_todo_form3,Todos,,0
+model,"ir.ui.menu,name",menu_todo_form,Todos,Задачи,0
+model,"ir.ui.menu,name",menu_todo_form2,New Todo,Новая задача,0
+selection,"calendar.todo,classification",0,Confidential,Конфиденциальное,0
+selection,"calendar.todo,classification",0,Private,Личное,0
+selection,"calendar.todo,classification",0,Public,Публичное,0
+selection,"calendar.todo,status",0,,,0
+selection,"calendar.todo,status",0,Cancelled,Отмененно,0
+selection,"calendar.todo,status",0,Completed,Выполнен,0
+selection,"calendar.todo,status",0,In-Process,В процессе,0
+selection,"calendar.todo,status",0,Needs-Action,Требуется действие,0
+view,calendar.todo,0,Attendees,Участники,0
+view,calendar.todo,0,Categories,Категория,0
+view,calendar.todo,0,General,Основной,0
+view,calendar.todo,0,Occurences,Повторение,0
+view,calendar.todo,0,Todo,Дело,0
+view,calendar.todo,0,Todos,Дела,0
+view,calendar.todo.attendee,0,Attendee,Участник,0
+view,calendar.todo.attendee,0,Attendees,Участники,0
+view,calendar.todo.exdate,0,Exception Date,Дата исключения,0
+view,calendar.todo.exdate,0,Exception Dates,Дата исключения,0
+view,calendar.todo.exrule,0,Exception Rule,Правило исключения,0
+view,calendar.todo.exrule,0,Exception Rules,Правила исключения,0
+view,calendar.todo.rdate,0,Recurrence Date,Даты повторения,0
+view,calendar.todo.rdate,0,Recurrence Dates,Даты повторения,0
+view,calendar.todo.rrule,0,Recurrence Rule,Правила повторения,0
+view,calendar.todo.rrule,0,Recurrence Rules,Правила повторения,0
diff --git a/setup.py b/setup.py
index 42102b3..7948e48 100644
--- a/setup.py
+++ b/setup.py
@@ -44,12 +44,16 @@ setup(name='trytond_calendar_todo',
         '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/todo.xml b/todo.xml
index 0994181..fbc4aef 100644
--- a/todo.xml
+++ b/todo.xml
@@ -87,7 +87,6 @@ this repository contains the full copyright notices and license terms. -->
         <record model="ir.action.act_window" id="act_todo_form">
             <field name="name">Todos</field>
             <field name="res_model">calendar.todo</field>
-            <field name="view_type">form</field>
             <field name="domain">[('parent', '=', False)]</field>
         </record>
         <record model="ir.action.act_window.view" id="act_todo_form_view1">
@@ -105,7 +104,6 @@ this repository contains the full copyright notices and license terms. -->
         <record model="ir.action.act_window" id="act_todo_form2">
             <field name="name">Todos</field>
             <field name="res_model">calendar.todo</field>
-            <field name="view_type">form</field>
             <field name="domain">[('parent', '=', False)]</field>
         </record>
         <record model="ir.action.act_window.view" id="act_todo_form2_view1">
@@ -124,7 +122,6 @@ this repository contains the full copyright notices and license terms. -->
         <record model="ir.action.act_window" id="act_todo_form3">
             <field name="name">Todos</field>
             <field name="res_model">calendar.todo</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_todo_form3_view1">
diff --git a/trytond_calendar_todo.egg-info/PKG-INFO b/trytond_calendar_todo.egg-info/PKG-INFO
index 93cb712..5168095 100644
--- a/trytond_calendar_todo.egg-info/PKG-INFO
+++ b/trytond_calendar_todo.egg-info/PKG-INFO
@@ -1,12 +1,12 @@
 Metadata-Version: 1.0
 Name: trytond-calendar-todo
-Version: 1.8.0
+Version: 2.0.0
 Summary: Add Todo support on CalDAV
 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_todo.egg-info/SOURCES.txt b/trytond_calendar_todo.egg-info/SOURCES.txt
index e25e4da..6621296 100644
--- a/trytond_calendar_todo.egg-info/SOURCES.txt
+++ b/trytond_calendar_todo.egg-info/SOURCES.txt
@@ -4,10 +4,12 @@ INSTALL
 LICENSE
 MANIFEST.in
 README
+bg_BG.csv
 de_DE.csv
 es_CO.csv
 es_ES.csv
 fr_FR.csv
+ru_RU.csv
 setup.py
 todo.xml
 ./__init__.py
diff --git a/trytond_calendar_todo.egg-info/requires.txt b/trytond_calendar_todo.egg-info/requires.txt
index b032e9a..4c76c9b 100644
--- a/trytond_calendar_todo.egg-info/requires.txt
+++ b/trytond_calendar_todo.egg-info/requires.txt
@@ -2,5 +2,5 @@ vobject >= 0.8.0
 PyWebDAV >= 0.9.3
 python-dateutil
 pytz
-trytond_calendar >= 1.8, < 1.9
-trytond >= 1.8, < 1.9
\ No newline at end of file
+trytond_calendar >= 2.0, < 2.1
+trytond >= 2.0, < 2.1
\ No newline at end of file
commit aadff102ef976b062f63ed2894cde0a927a71a69
Author: Mathias Behrle <mathiasb at m9s.biz>
Date:   Tue Apr 26 21:08:53 2011 +0200

    Updating to standards version 3.9.2.

diff --git a/debian/control b/debian/control
index f26ea4c..a6834cd 100644
--- a/debian/control
+++ b/debian/control
@@ -7,7 +7,7 @@ Uploaders:
  Mathias Behrle <mathiasb at m9s.biz>
 Dm-Upload-Allowed: yes
 Build-Depends: debhelper (>= 8), python, python-setuptools, python-support
-Standards-Version: 3.9.1
+Standards-Version: 3.9.2
 Homepage: http://www.tryton.org/
 Vcs-Browser: http://git.debian-maintainers.org/?p=tryton/tryton-modules-calendar-todo.git
 Vcs-Git: git://git.debian-maintainers.org/git/tryton/tryton-modules-calendar-todo.git
commit 6440eb168d2ee24efbeb2c5c8ecb9f2b46185f62
Author: Mathias Behrle <mathiasb at m9s.biz>
Date:   Tue Feb 15 13:08:53 2011 +0100

    Releasing debian version 1.8.0-2.

diff --git a/debian/changelog b/debian/changelog
index 2b869c9..0093e55 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,10 @@
+tryton-modules-calendar-todo (1.8.0-2) unstable; urgency=low
+
+  * Changing my email address.
+  * Updating Copyright.
+
+ -- Mathias Behrle <mathiasb at m9s.biz>  Tue, 15 Feb 2011 13:08:31 +0100
+
 tryton-modules-calendar-todo (1.8.0-1) experimental; urgency=low
 
   * Wrapping depends.
commit a028edfbe193423cb2a8beb687cd2048e9190b20
Author: Mathias Behrle <mathiasb at m9s.biz>
Date:   Tue Feb 15 12:38:41 2011 +0100

    Updating Copyright.

diff --git a/debian/copyright b/debian/copyright
index 489b0a2..213e426 100644
--- a/debian/copyright
+++ b/debian/copyright
@@ -26,7 +26,7 @@ License: GPL-3+
  can be found in /usr/share/common-licenses/GPL-3 file.
 
 Files: debian/*
-Copyright: (C) 2009-2010 Daniel Baumann <daniel at debian.org>
+Copyright: (C) 2009-2011 Daniel Baumann <daniel at debian.org>
 License: GPL-3+
  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
commit 5fdd9cd69b6ac47e239014b9b54a8cc9894eb97a
Author: Mathias Behrle <mathiasb at m9s.biz>
Date:   Sat Nov 20 11:48:53 2010 +0100

    Changing my email address.

diff --git a/debian/control b/debian/control
index 43a0cc2..f26ea4c 100644
--- a/debian/control
+++ b/debian/control
@@ -4,7 +4,7 @@ Priority: optional
 Maintainer: Debian Tryton Maintainers <tryton at lists.debian-maintainers.org>
 Uploaders:
  Daniel Baumann <daniel at debian.org>,
- Mathias Behrle <mathiasb at mbsolutions.selfip.biz>
+ Mathias Behrle <mathiasb at m9s.biz>
 Dm-Upload-Allowed: yes
 Build-Depends: debhelper (>= 8), python, python-setuptools, python-support
 Standards-Version: 3.9.1
commit cfabdf1bf1d1b9e7b2b90e2b4e90dfd6c49cf70a
Author: Daniel Baumann <daniel at debian.org>
Date:   Fri Nov 12 12:58:01 2010 +0100

    Releasing debian version 1.8.0-1.

diff --git a/debian/changelog b/debian/changelog
index d976e72..2b869c9 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,15 @@
+tryton-modules-calendar-todo (1.8.0-1) experimental; urgency=low
+
+  * Wrapping depends.
+  * Updating standards version to 3.9.0.
+  * Updating to debhelper version 8.
+  * Updating to standards version 3.9.1.
+  * Switching to source format 3.0 (quilt).
+  * Merging upstream version 1.8.0.
+  * Updating versioned tryton depends to 1.8.
+
+ -- Daniel Baumann <daniel at debian.org>  Fri, 12 Nov 2010 12:57:53 +0100
+
 tryton-modules-calendar-todo (1.6.0-1) unstable; urgency=low
 
   [ Daniel Baumann ]
commit e302f3222ba5e65d4b922672e2aa7da51af87036
Author: Daniel Baumann <daniel at debian.org>
Date:   Thu Nov 4 20:16:01 2010 +0100

    Updating versioned tryton depends to 1.8.

diff --git a/debian/control b/debian/control
index 81b8ebd..43a0cc2 100644
--- a/debian/control
+++ b/debian/control
@@ -15,8 +15,8 @@ Vcs-Git: git://git.debian-maintainers.org/git/tryton/tryton-modules-calendar-tod
 Package: tryton-modules-calendar-todo
 Architecture: all
 Depends:
- ${misc:Depends}, ${python:Depends}, tryton-server (>= 1.6),
- tryton-modules-calendar (>= 1.6), python-dateutil, python-tz, python-vobject,
+ ${misc:Depends}, ${python:Depends}, tryton-server (>= 1.8),
+ tryton-modules-calendar (>= 1.8), python-dateutil, python-tz, python-vobject,
  python-webdav, python-pkg-resources
 XB-Python-Version: ${python:Versions}
 Description: Tryton Application Platform (Calendar Todo Module)
commit 0e130da29549e1817c2d216feec3ed4a87b6e4cd
Author: Daniel Baumann <daniel at debian.org>
Date:   Thu Nov 4 20:13:24 2010 +0100

    Merging upstream version 1.8.0.

diff --git a/CHANGELOG b/CHANGELOG
index 515da05..5ad4130 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-10
 * Bug fixes (see mercurial logs for details)
 * Remove classification_public
diff --git a/PKG-INFO b/PKG-INFO
index 7987827..1af6f43 100644
--- a/PKG-INFO
+++ b/PKG-INFO
@@ -1,12 +1,12 @@
 Metadata-Version: 1.0
 Name: trytond_calendar_todo
-Version: 1.6.0
+Version: 1.8.0
 Summary: Add Todo support on CalDAV
 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 6cace63..59480e6 100644
--- a/__tryton__.py
+++ b/__tryton__.py
@@ -7,7 +7,7 @@
     'name_es_CO': 'Calendario de tareas',
     'name_es_ES': 'Calendario de tareas',
     'name_fr_FR' : 'Tâche Calendrier',
-    'version' : '1.6.0',
+    'version' : '1.8.0',
     'author' : 'B2CK',
     'email': 'info at b2ck.com',
     'website': 'http://www.tryton.org/',
diff --git a/de_DE.csv b/de_DE.csv
index 18347c8..d9bb158 100644
--- a/de_DE.csv
+++ b/de_DE.csv
@@ -1,18 +1,9 @@
 type,name,res_id,src,value,fuzzy
 error,calendar.todo,0,Recurrence can not be recurrent!,Wiederholungen können nicht rekursiv sein!,0
 error,calendar.todo,0,UUID and recurrence must be unique in a calendar!,UUID und Wiederholung können in einem Kalender nicht mehrfach vergeben werden!,0
-field,"calendar.todo.alarm,calendar_alarm",0,Calendar Alarm,Kalender Alarm,0
-field,"calendar.todo.alarm,rec_name",0,Name,Name,0
 field,"calendar.todo,alarms",0,Alarms,Alarm,0
-field,"calendar.todo.alarm,todo",0,Todo,Aufgabe,0
-field,"calendar.todo.attendee,calendar_attendee",0,Calendar Attendee,Kalender Teilnehmer,0
-field,"calendar.todo.attendee,rec_name",0,Name,Name,0
 field,"calendar.todo,attendees",0,Attendees,Teilnehmer,0
-field,"calendar.todo.attendee,todo",0,Todo,Aufgabe,0
 field,"calendar.todo,calendar",0,Calendar,Kalender,0
-field,"calendar.todo-calendar.category,category",0,Category,Kategorie,0
-field,"calendar.todo-calendar.category,rec_name",0,Name,Name,0
-field,"calendar.todo-calendar.category,todo",0,To-Do,Aufgabe,0
 field,"calendar.todo,calendar_owner",0,Owner,Besitzer,0
 field,"calendar.todo,calendar_read_users",0,Read Users,Benutzer mit Leseberechtigung,0
 field,"calendar.todo,calendar_write_users",0,Write Users,Benutzer mit Schreibberechtigung,0
@@ -22,49 +13,58 @@ field,"calendar.todo,completed",0,Completed,Abgeschlossen,0
 field,"calendar.todo,description",0,Description,Bezeichnung,0
 field,"calendar.todo,dtstart",0,Start Date,Anfangsdatum,0
 field,"calendar.todo,due",0,Due Date,Fälligkeitsdatum,0
-field,"calendar.todo.exdate,calendar_date",0,Calendar Date,Kalender Datum,0
-field,"calendar.todo.exdate,rec_name",0,Name,Name,0
 field,"calendar.todo,exdates",0,Exception Dates,Ausnahmedaten,0
-field,"calendar.todo.exdate,todo",0,Todo,Aufgabe,0
-field,"calendar.todo.exrule,calendar_rrule",0,Calendar RRule,Kalender WRegel,0
-field,"calendar.todo.exrule,rec_name",0,Name,Name,0
 field,"calendar.todo,exrules",0,Exception Rules,Ausnahmeregeln,0
-field,"calendar.todo.exrule,todo",0,Todo,Aufgabe,0
 field,"calendar.todo,location",0,Location,Ort,0
 field,"calendar.todo,occurences",0,Occurences,Ereignisse,0
 field,"calendar.todo,organizer",0,Organizer,Organisator,0
 field,"calendar.todo,parent",0,Parent,Übergeordnet (Aufgabe),0
 field,"calendar.todo,percent_complete",0,Percent complete,% erledigt,0
-field,"calendar.todo.rdate,calendar_date",0,Calendar Date,Kalender Datum,0
-field,"calendar.todo.rdate,rec_name",0,Name,Name,0
 field,"calendar.todo,rdates",0,Recurrence Dates,Wiederholungsdaten,0
-field,"calendar.todo.rdate,todo",0,Todo,Aufgabe,0
 field,"calendar.todo,rec_name",0,Name,Name,0
 field,"calendar.todo,recurrence",0,Recurrence,Wiederholung,0
-field,"calendar.todo.rrule,calendar_rrule",0,Calendar RRule,Kalender WRegel,0
-field,"calendar.todo.rrule,rec_name",0,Name,Name,0
 field,"calendar.todo,rrules",0,Recurrence Rules,Wiederholungsregeln,0
-field,"calendar.todo.rrule,todo",0,Todo,Aufgabe,0
 field,"calendar.todo,sequence",0,Sequence,Revision,0
 field,"calendar.todo,status",0,Status,Status,0
 field,"calendar.todo,summary",0,Summary,Zusammenfassung,0
 field,"calendar.todo,timezone",0,Timezone,Zeitzone,0
 field,"calendar.todo,uuid",0,UUID,UUID,0
 field,"calendar.todo,vtodo",0,vtodo,vtodo,0
+field,"calendar.todo-calendar.category,category",0,Category,Kategorie,0
+field,"calendar.todo-calendar.category,rec_name",0,Name,Name,0
+field,"calendar.todo-calendar.category,todo",0,To-Do,Aufgabe,0
+field,"calendar.todo.alarm,calendar_alarm",0,Calendar Alarm,Kalender Alarm,0
+field,"calendar.todo.alarm,rec_name",0,Name,Name,0
+field,"calendar.todo.alarm,todo",0,Todo,Aufgabe,0
+field,"calendar.todo.attendee,calendar_attendee",0,Calendar Attendee,Kalender Teilnehmer,0
+field,"calendar.todo.attendee,rec_name",0,Name,Name,0
+field,"calendar.todo.attendee,todo",0,Todo,Aufgabe,0
+field,"calendar.todo.exdate,calendar_date",0,Calendar Date,Kalender Datum,0
+field,"calendar.todo.exdate,rec_name",0,Name,Name,0
+field,"calendar.todo.exdate,todo",0,Todo,Aufgabe,0
+field,"calendar.todo.exrule,calendar_rrule",0,Calendar RRule,Kalender WRegel,0
+field,"calendar.todo.exrule,rec_name",0,Name,Name,0
+field,"calendar.todo.exrule,todo",0,Todo,Aufgabe,0
+field,"calendar.todo.rdate,calendar_date",0,Calendar Date,Kalender Datum,0
+field,"calendar.todo.rdate,rec_name",0,Name,Name,0
+field,"calendar.todo.rdate,todo",0,Todo,Aufgabe,0
+field,"calendar.todo.rrule,calendar_rrule",0,Calendar RRule,Kalender WRegel,0
+field,"calendar.todo.rrule,rec_name",0,Name,Name,0
+field,"calendar.todo.rrule,todo",0,Todo,Aufgabe,0
 help,"calendar.todo,uuid",0,Universally Unique Identifier,Universally Unique Identifier,0
+model,"calendar.todo,name",0,Todo,Aufgabe,0
+model,"calendar.todo-calendar.category,name",0,Todo - Category,Aufgabe - Kategorie,0
 model,"calendar.todo.alarm,name",0,Alarm,Alarm,0
 model,"calendar.todo.attendee,name",0,Attendee,Teilnehmer,0
-model,"calendar.todo-calendar.category,name",0,Todo - Category,Aufgabe - Kategorie,0
 model,"calendar.todo.exdate,name",0,Exception Date,Ausnahmedatum,0
 model,"calendar.todo.exrule,name",0,Exception Rule,Ausnahmeregel,0
-model,"calendar.todo,name",0,Todo,Aufgabe,0
 model,"calendar.todo.rdate,name",0,Todo Recurrence Date,Aufgabe Wiederholungsdatum,0
 model,"calendar.todo.rrule,name",0,Recurrence Rule,Wiederholungsregel,0
 model,"ir.action,name",act_todo_form,Todos,Aufgaben,0
 model,"ir.action,name",act_todo_form2,Todos,Aufgaben,0
 model,"ir.action,name",act_todo_form3,Todos,Aufgaben,0
-model,"ir.ui.menu,name",menu_todo_form2,New Todo,Neue Aufgabe,0
 model,"ir.ui.menu,name",menu_todo_form,Todos,Aufgaben,0
+model,"ir.ui.menu,name",menu_todo_form2,New Todo,Neue Aufgabe,0
 selection,"calendar.todo,classification",0,Confidential,Vertraulich,0
 selection,"calendar.todo,classification",0,Private,Privat,0
 selection,"calendar.todo,classification",0,Public,Öffentlich,0
diff --git a/fr_FR.csv b/fr_FR.csv
index 4459c8b..47863e2 100644
--- a/fr_FR.csv
+++ b/fr_FR.csv
@@ -1,18 +1,9 @@
 type,name,res_id,src,value,fuzzy
 error,calendar.todo,0,Recurrence can not be recurrent!,Une récurrence ne peut pas être récurrente !,0
 error,calendar.todo,0,UUID and recurrence must be unique in a calendar!,UUID et récurrence doivent être uniques sur un calendrier !,0
-field,"calendar.todo.alarm,calendar_alarm",0,Calendar Alarm,Alarme calendrier,0
-field,"calendar.todo.alarm,rec_name",0,Name,Nom,0
 field,"calendar.todo,alarms",0,Alarms,Alarmes,0
-field,"calendar.todo.alarm,todo",0,Todo,Tâche,0
-field,"calendar.todo.attendee,calendar_attendee",0,Calendar Attendee,Participant calendrier,0
-field,"calendar.todo.attendee,rec_name",0,Name,Nom,0
 field,"calendar.todo,attendees",0,Attendees,Participants,0
-field,"calendar.todo.attendee,todo",0,Todo,Tâche,0
 field,"calendar.todo,calendar",0,Calendar,Calendrier,0
-field,"calendar.todo-calendar.category,category",0,Category,Catégorie,0
-field,"calendar.todo-calendar.category,rec_name",0,Name,Nom,0
-field,"calendar.todo-calendar.category,todo",0,To-Do,Tâche,0
 field,"calendar.todo,calendar_owner",0,Owner,Propriétaire,0
 field,"calendar.todo,calendar_read_users",0,Read Users,Utilisateurs en lecture,0
 field,"calendar.todo,calendar_write_users",0,Write Users,Utilisateurs en écriture,0
@@ -22,49 +13,58 @@ field,"calendar.todo,completed",0,Completed,Complété,0
 field,"calendar.todo,description",0,Description,Description,0
 field,"calendar.todo,dtstart",0,Start Date,Date de début,0
 field,"calendar.todo,due",0,Due Date,Date d'échéance,0
-field,"calendar.todo.exdate,calendar_date",0,Calendar Date,Date calendrier,0
-field,"calendar.todo.exdate,rec_name",0,Name,Nom,0
 field,"calendar.todo,exdates",0,Exception Dates,Dates d'exception,0
-field,"calendar.todo.exdate,todo",0,Todo,Tâche,0
-field,"calendar.todo.exrule,calendar_rrule",0,Calendar RRule,Règle de récurrence,0
-field,"calendar.todo.exrule,rec_name",0,Name,Nom,0
 field,"calendar.todo,exrules",0,Exception Rules,Règles d'exception,0
-field,"calendar.todo.exrule,todo",0,Todo,Tâche,0
 field,"calendar.todo,location",0,Location,Emplacement,0
 field,"calendar.todo,occurences",0,Occurences,Occurrences,0
 field,"calendar.todo,organizer",0,Organizer,Organisateur,0
 field,"calendar.todo,parent",0,Parent,Parent,0
 field,"calendar.todo,percent_complete",0,Percent complete,Pourcentage effectué,0
-field,"calendar.todo.rdate,calendar_date",0,Calendar Date,Date calendrier,0
-field,"calendar.todo.rdate,rec_name",0,Name,Nom,0
 field,"calendar.todo,rdates",0,Recurrence Dates,Dates de récurrence,0
-field,"calendar.todo.rdate,todo",0,Todo,Tâche,0
 field,"calendar.todo,rec_name",0,Name,Nom,0
 field,"calendar.todo,recurrence",0,Recurrence,Récurrence,0
-field,"calendar.todo.rrule,calendar_rrule",0,Calendar RRule,Règle de récurrence,0
-field,"calendar.todo.rrule,rec_name",0,Name,Nom,0
 field,"calendar.todo,rrules",0,Recurrence Rules,Règles de récurrence,0
-field,"calendar.todo.rrule,todo",0,Todo,Tâche,0
 field,"calendar.todo,sequence",0,Sequence,Séquence,0
 field,"calendar.todo,status",0,Status,Statut,0
 field,"calendar.todo,summary",0,Summary,Résumé,0
 field,"calendar.todo,timezone",0,Timezone,Fuseau Horaire,0
 field,"calendar.todo,uuid",0,UUID,UUID,0
 field,"calendar.todo,vtodo",0,vtodo,vtodo,0
+field,"calendar.todo-calendar.category,category",0,Category,Catégorie,0
+field,"calendar.todo-calendar.category,rec_name",0,Name,Nom,0
+field,"calendar.todo-calendar.category,todo",0,To-Do,Tâche,0
+field,"calendar.todo.alarm,calendar_alarm",0,Calendar Alarm,Alarme calendrier,0
+field,"calendar.todo.alarm,rec_name",0,Name,Nom,0
+field,"calendar.todo.alarm,todo",0,Todo,Tâche,0
+field,"calendar.todo.attendee,calendar_attendee",0,Calendar Attendee,Participant calendrier,0
+field,"calendar.todo.attendee,rec_name",0,Name,Nom,0
+field,"calendar.todo.attendee,todo",0,Todo,Tâche,0
+field,"calendar.todo.exdate,calendar_date",0,Calendar Date,Date calendrier,0
+field,"calendar.todo.exdate,rec_name",0,Name,Nom,0
+field,"calendar.todo.exdate,todo",0,Todo,Tâche,0
+field,"calendar.todo.exrule,calendar_rrule",0,Calendar RRule,Règle de récurrence,0
+field,"calendar.todo.exrule,rec_name",0,Name,Nom,0
+field,"calendar.todo.exrule,todo",0,Todo,Tâche,0
+field,"calendar.todo.rdate,calendar_date",0,Calendar Date,Date calendrier,0
+field,"calendar.todo.rdate,rec_name",0,Name,Nom,0
+field,"calendar.todo.rdate,todo",0,Todo,Tâche,0
+field,"calendar.todo.rrule,calendar_rrule",0,Calendar RRule,Règle de récurrence,0
+field,"calendar.todo.rrule,rec_name",0,Name,Nom,0
+field,"calendar.todo.rrule,todo",0,Todo,Tâche,0
 help,"calendar.todo,uuid",0,Universally Unique Identifier,Identificateur unique universel,0
+model,"calendar.todo,name",0,Todo,Tâche,0
+model,"calendar.todo-calendar.category,name",0,Todo - Category,Todo - Catégorie,0
 model,"calendar.todo.alarm,name",0,Alarm,Alarme,0
 model,"calendar.todo.attendee,name",0,Attendee,Participant,0
-model,"calendar.todo-calendar.category,name",0,Todo - Category,Todo - Catégorie,0
 model,"calendar.todo.exdate,name",0,Exception Date,Date d'exception,0
 model,"calendar.todo.exrule,name",0,Exception Rule,Règle d'exception,0
-model,"calendar.todo,name",0,Todo,Tâche,0
 model,"calendar.todo.rdate,name",0,Todo Recurrence Date,Date de récurrence,0
 model,"calendar.todo.rrule,name",0,Recurrence Rule,Règle de récurrence,0
 model,"ir.action,name",act_todo_form,Todos,Tâches,0
 model,"ir.action,name",act_todo_form2,Todos,Tâches,0
 model,"ir.action,name",act_todo_form3,Todos,Tâches,0
-model,"ir.ui.menu,name",menu_todo_form2,New Todo,Nouvelle tâche,0
 model,"ir.ui.menu,name",menu_todo_form,Todos,Tâches,0
+model,"ir.ui.menu,name",menu_todo_form2,New Todo,Nouvelle tâche,0
 selection,"calendar.todo,classification",0,Confidential,Confidentiel,0
 selection,"calendar.todo,classification",0,Private,Privé,0
 selection,"calendar.todo,classification",0,Public,Publique,0
diff --git a/tests/test_calendar_todo.py b/tests/test_calendar_todo.py
index dc39509..16ecb7b 100644
--- a/tests/test_calendar_todo.py
+++ b/tests/test_calendar_todo.py
@@ -25,7 +25,7 @@ class CalendarTodoTestCase(unittest.TestCase):
         '''
         Test views.
         '''
-        self.assertRaises(Exception, test_view('calendar_todo'))
+        test_view('calendar_todo')
 
 def suite():
     suite = trytond.tests.test_tryton.suite()
diff --git a/todo.py b/todo.py
index d3e188b..1dfe1bd 100644
--- a/todo.py
+++ b/todo.py
@@ -1,17 +1,21 @@
 #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 reduce_ids
-from trytond.backend import TableHandler
-from trytond.pyson import Not, Equal, Eval, If, Bool, In
+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 Not, Equal, Eval, If, Bool, In
+from trytond.transaction import Transaction
+
+tzlocal = dateutil.tz.tzlocal()
+tzutc = dateutil.tz.tzutc()
+
 domimpl = xml.dom.minidom.getDOMImplementation()
 
 
@@ -119,35 +123,36 @@ class Todo(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_todo_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(Todo, 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_todo_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(Todo, 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_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 on_change_status(self, cursor, user, vals, context=None):
+    def on_change_status(self, vals):
         res = {}
         if 'status' not in vals:
             return res
@@ -158,14 +163,14 @@ class Todo(ModelSQL, ModelView):
 
         return res
 
-    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 todo in self.browse(cursor, user, ids, context=context):
+        for todo in self.browse(ids):
             name = name[9:]
             if name in ('read_users', 'write_users'):
                 res[todo.id] = [x.id for x in todo.calendar[name]]
@@ -173,14 +178,14 @@ class Todo(ModelSQL, ModelView):
                 res[todo.id] = todo.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 todo in self.browse(cursor, user, ids):
+        for todo in self.browse(ids):
             if not todo.parent:
                 continue
             if todo.rdates \
@@ -191,12 +196,12 @@ class Todo(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(Todo, self).create(cursor, user, values, context=context)
-        todo = self.browse(cursor, user, res, context=context)
+        res = super(Todo, self).create(values)
+        todo = self.browse(res)
         if todo.calendar.owner \
                 and (todo.organizer == todo.calendar.owner.email \
                 or (todo.parent \
@@ -210,38 +215,38 @@ class Todo(ModelSQL, ModelView):
                         if x.status != 'declined'
                         and x.email != todo.parent.organizer]
             if attendee_emails:
-                calendar_ids = calendar_obj.search(cursor, 0, [
-                    ('owner.email', 'in', attendee_emails),
-                    ], context=context)
-                if not todo.recurrence:
-                    for calendar_id in calendar_ids:
-                        new_id = self.copy(cursor, 0, todo.id, default={
-                            'calendar': calendar_id,
-                            'occurences': False,
-                            }, context=context)
-                        for occurence in todo.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 todo.recurrence:
+                        for calendar_id in calendar_ids:
+                            new_id = self.copy(todo.id, default={
                                 'calendar': calendar_id,
-                                'parent': new_id,
-                                }, context=context)
-                else:
-                    parent_ids = self.search(cursor, 0, [
-                        ('uuid', '=', todo.uuid),
-                        ('calendar.owner.email', 'in', attendee_emails),
-                        ('id', '!=', todo.id),
-                        ('recurrence', '=', False),
-                        ], context=context)
-                    for parent in self.browse(cursor, 0, parent_ids,
-                            context=context):
-                        self.copy(cursor, 0, todo.id, default={
-                            'calendar': parent.calendar.id,
-                            'parent': parent.id,
-                            }, context=context)
+                                'occurences': False,
+                                })
+                            for occurence in todo.occurences:
+                                self.copy(occurence.id, default={
+                                    'calendar': calendar_id,
+                                    'parent': new_id,
+                                    })
+                    else:
+                        parent_ids = self.search([
+                            ('uuid', '=', todo.uuid),
+                            ('calendar.owner.email', 'in', attendee_emails),
+                            ('id', '!=', todo.id),
+                            ('recurrence', '=', False),
+                            ])
+                        for parent in self.browse(parent_ids):
+                            self.copy(todo.id, default={
+                                'calendar': parent.calendar.id,
+                                'parent': parent.id,
+                                })
         # Restart the cache for todo
-        collection_obj.todo(cursor.dbname)
+        collection_obj.todo.reset()
         return res
 
-    def _todo2update(self, cursor, user, todo, context=None):
+    def _todo2update(self, todo):
         rdate_obj = self.pool.get('calendar.todo.rdate')
         exdate_obj = self.pool.get('calendar.todo.exdate')
         rrule_obj = self.pool.get('calendar.todo.rrule')
@@ -258,32 +263,33 @@ class Todo(ModelSQL, ModelView):
         res['organizer'] = todo.organizer
         res['rdates'] = [('delete_all',)]
         for rdate in todo.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 todo.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 todo.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 todo.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(Todo, self).write(cursor, user, ids, values,
-                context=context)
+        res = super(Todo, self).write(ids, values)
 
         if isinstance(ids, (int, long)):
             ids = [ids]
@@ -295,7 +301,7 @@ class Todo(ModelSQL, ModelView):
                     'SET sequence = sequence + 1 ' \
                     'WHERE ' + red_sql, red_ids)
 
-        for todo in self.browse(cursor, user, ids, context=context):
+        for todo in self.browse(ids):
             if todo.calendar.owner \
                     and (todo.organizer == todo.calendar.owner.email \
                     or (todo.parent \
@@ -309,57 +315,57 @@ class Todo(ModelSQL, ModelView):
                             if x.status != 'declined'
                             and x.email != todo.parent.organizer]
                 if attendee_emails:
-                    todo_ids = self.search(cursor, 0, [
-                        ('uuid', '=', todo.uuid),
-                        ('calendar.owner.email', 'in', attendee_emails),
-                        ('id', '!=', todo.id),
-                        ('recurrence', '=', todo.recurrence or False),
-                        ], context=context)
-                    for todo2 in self.browse(cursor, user, todo_ids,
-                            context=context):
+                    with Transaction().set_user(0):
+                        todo_ids = self.search([
+                            ('uuid', '=', todo.uuid),
+                            ('calendar.owner.email', 'in', attendee_emails),
+                            ('id', '!=', todo.id),
+                            ('recurrence', '=', todo.recurrence or False),
+                            ])
+                    for todo2 in self.browse(todo_ids):
                         if todo2.calendar.owner.email in attendee_emails:
                             attendee_emails.remove(todo2.calendar.owner.email)
-                    self.write(cursor, 0, todo_ids, self._todo2update(
-                        cursor, user, todo, context=context), context=context)
+                    with Transaction().set_user(0):
+                        self.write(todo_ids, self._todo2update(todo))
                 if attendee_emails:
-                    calendar_ids = calendar_obj.search(cursor, 0, [
-                        ('owner.email', 'in', attendee_emails),
-                        ], context=context)
-                    if not todo.recurrence:
-                        for calendar_id in calendar_ids:
-                            new_id = self.copy(cursor, 0, todo.id, default={
-                                'calendar': calendar_id,
-                                'occurences': False,
-                                }, context=context)
-                            for occurence in todo.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 todo.recurrence:
+                            for calendar_id in calendar_ids:
+                                new_id = self.copy(todo.id, default={
                                     'calendar': calendar_id,
-                                    'parent': new_id,
-                                    }, context=context)
-                    else:
-                        parent_ids = self.search(cursor, 0, [
-                            ('uuid', '=', todo.uuid),
-                            ('calendar.owner.email', 'in', attendee_emails),
-                            ('id', '!=', todo.id),
-                            ('recurrence', '=', False),
-                            ], context=context)
-                        for parent in self.browse(cursor, 0, parent_ids,
-                                context=context):
-                            self.copy(cursor, 0, todo.id, default={
-                                'calendar': parent.calendar.id,
-                                'parent': parent.id,
-                                }, context=context)
+                                    'occurences': False,
+                                    })
+                                for occurence in todo.occurences:
+                                    self.copy(occurence.id, default={
+                                        'calendar': calendar_id,
+                                        'parent': new_id,
+                                        })
+                        else:
+                            parent_ids = self.search([
+                                ('uuid', '=', todo.uuid),
+                                ('calendar.owner.email', 'in', attendee_emails),
+                                ('id', '!=', todo.id),
+                                ('recurrence', '=', False),
+                                ])
+                            for parent in self.browse(parent_ids):
+                                self.copy(todo.id, default={
+                                    'calendar': parent.calendar.id,
+                                    'parent': parent.id,
+                                    })
         # Restart the cache for todo
-        collection_obj.todo(cursor.dbname)
+        collection_obj.todo.reset()
         return res
 
-    def delete(self, cursor, user, ids, context=None):
+    def delete(self, ids):
         attendee_obj = self.pool.get('calendar.todo.attendee')
         collection_obj = self.pool.get('webdav.collection')
 
         if isinstance(ids, (int, long)):
             ids = [ids]
-        for todo in self.browse(cursor, user, ids, context=context):
+        for todo in self.browse(ids):
             if todo.calendar.owner \
                     and (todo.organizer == todo.calendar.owner.email \
                     or (todo.parent \
@@ -371,50 +377,47 @@ class Todo(ModelSQL, ModelView):
                     attendee_emails = [x.email for x in todo.parent.attendees
                             if x.email != todo.parent.organizer]
                 if attendee_emails:
-                    todo_ids = self.search(cursor, 0, [
-                        ('uuid', '=', todo.uuid),
-                        ('calendar.owner.email', 'in', attendee_emails),
-                        ('id', '!=', todo.id),
-                        ('recurrence', '=', todo.recurrence or False),
-                        ], context=context)
-                    self.delete(cursor, 0, todo_ids, context=context)
+                    with Transaction().set_user(0):
+                        todo_ids = self.search([
+                            ('uuid', '=', todo.uuid),
+                            ('calendar.owner.email', 'in', attendee_emails),
+                            ('id', '!=', todo.id),
+                            ('recurrence', '=', todo.recurrence or False),
+                            ])
+                        self.delete(todo_ids)
             elif todo.organizer \
                     or (todo.parent and todo.parent.organizer):
                 if todo.organizer:
                     organizer = todo.organizer
                 else:
                     organizer = todo.parent.organizer
-                todo_ids = self.search(cursor, 0, [
-                    ('uuid', '=', todo.uuid),
-                    ('calendar.owner.email', '=', organizer),
-                    ('id', '!=', todo.id),
-                    ('recurrence', '=', todo.recurrence or False),
-                    ], context=context, limit=1)
-                if todo_ids:
-                    todo2 = self.browse(cursor, 0, todo_ids[0],
-                            context=context)
-                    for attendee in todo2.attendees:
-                        if attendee.email == todo.calendar.owner.email:
-                            attendee_obj.write(cursor, 0, attendee.id, {
-                                'status': 'declined',
-                                }, context=context)
-        res = super(Todo, self).delete(cursor, user, ids, context=context)
+                with Transaction().set_user(0):
+                    todo_ids = self.search([
+                        ('uuid', '=', todo.uuid),
+                        ('calendar.owner.email', '=', organizer),
+                        ('id', '!=', todo.id),
+                        ('recurrence', '=', todo.recurrence or False),
+                        ], limit=1)
+                    if todo_ids:
+                        todo2 = self.browse(todo_ids[0])
+                        for attendee in todo2.attendees:
+                            if attendee.email == todo.calendar.owner.email:
+                                attendee_obj.write(attendee.id, {
+                                    'status': 'declined',
+                                    })
+        res = super(Todo, self).delete(ids)
         # Restart the cache for todo
-        collection_obj.todo(cursor.dbname)
+        collection_obj.todo.reset()
         return res
 
-    def ical2values(self, cursor, user, todo_id, ical, calendar_id,
-            vtodo=None, context=None):
+    def ical2values(self, todo_id, ical, calendar_id, vtodo=None):
         '''
         Convert iCalendar to values for create or write
 
-        :param cursor: the database cursor
-        :param user: the user id
         :param todo_id: the todo id for write or None for create
         :param ical: a ical instance of vobject
         :param calendar_id: the calendar id of the todo
         :param vtodo: the vtodo 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')
@@ -438,7 +441,7 @@ class Todo(ModelSQL, ModelView):
 
         todo = None
         if todo_id:
-            todo = self.browse(cursor, user, todo_id, context=context)
+            todo = self.browse(todo_id)
         res = {}
         if not todo:
             if hasattr(vtodo, 'uid'):
@@ -505,19 +508,18 @@ class Todo(ModelSQL, ModelView):
         else:
             res['status'] = ''
         if hasattr(vtodo, 'categories'):
-            category_ids = category_obj.search(cursor, user, [
+            category_ids = category_obj.search([
                 ('name', 'in', [x for x in vtodo.categories.value]),
-                ], context=context)
-            categories = category_obj.browse(cursor, user, category_ids,
-                    context=context)
+                ])
+            categories = category_obj.browse(category_ids)
             category_names2ids = {}
             for category in categories:
                 category_names2ids[category.name] = category.id
             for category in vtodo.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',)]
@@ -530,13 +532,13 @@ class Todo(ModelSQL, ModelView):
         else:
             res['classification'] = 'public'
         if hasattr(vtodo, 'location'):
-            location_ids = location_obj.search(cursor, user, [
+            location_ids = location_obj.search([
                 ('name', '=', vtodo.location.value),
-                ], limit=1, context=context)
+                ], limit=1)
             if not location_ids:
-                location_id = location_obj.create(cursor, user, {
+                location_id = location_obj.create({
                     'name': vtodo.location.value,
-                    }, context=context)
+                    })
             else:
                 location_id = location_ids[0]
             res['location'] = location_id
@@ -561,8 +563,7 @@ class Todo(ModelSQL, ModelView):
         if hasattr(vtodo, 'attendee'):
             while vtodo.attendee_list:
                 attendee = vtodo.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))
@@ -578,8 +579,7 @@ class Todo(ModelSQL, ModelView):
             while vtodo.rdate_list:
                 rdate = vtodo.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'] = []
@@ -589,8 +589,7 @@ class Todo(ModelSQL, ModelView):
             while vtodo.exdate_list:
                 exdate = vtodo.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'] = []
@@ -599,8 +598,7 @@ class Todo(ModelSQL, ModelView):
         if hasattr(vtodo, 'rrule'):
             while vtodo.rrule_list:
                 rrule = vtodo.rrule_list.pop()
-                vals = rrule_obj.rule2values(cursor, user, rrule,
-                        context=context)
+                vals = rrule_obj.rule2values(rrule)
                 res['rrules'].append(('create', vals))
 
         res['exrules'] = []
@@ -609,8 +607,7 @@ class Todo(ModelSQL, ModelView):
         if hasattr(vtodo, 'exrule'):
             while vtodo.exrule_list:
                 exrule = vtodo.exrule_list.pop()
-                vals = exrule_obj.rule2values(cursor, user, exrule,
-                        context=context)
+                vals = exrule_obj.rule2values(exrule)
                 res['exrules'].append(('create', vals))
 
         if todo:
@@ -620,8 +617,7 @@ class Todo(ModelSQL, ModelView):
             res.setdefault('alarms', [])
             while vtodo.valarm_list:
                 valarm = vtodo.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'):
@@ -645,8 +641,7 @@ class Todo(ModelSQL, ModelView):
                             == vtodo.recurrence_id.value:
                         todo_id = occurence.id
                         occurences_todel.remove(occurence.id)
-            vals = self.ical2values(cursor, user, todo_id, ical,
-                    calendar_id, vtodo=vtodo, context=context)
+            vals = self.ical2values(todo_id, ical, calendar_id, vtodo=vtodo)
             if todo:
                 vals['uuid'] = todo.uuid
             else:
@@ -661,17 +656,12 @@ class Todo(ModelSQL, ModelView):
             res['occurences'].append(('delete', occurences_todel))
         return res
 
-    def todo2ical(self, cursor, user, todo, context=None):
+    def todo2ical(self, todo):
         '''
         Return an iCalendar instance of vobject for todo
 
-        :param cursor: the database cursor
-        :param user: the user id
         :param todo: a BrowseRecord of calendar.todo
             or a calendar.todo 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')
@@ -683,13 +673,13 @@ class Todo(ModelSQL, ModelView):
         exrule_obj = self.pool.get('calendar.todo.exrule')
 
         if isinstance(todo, (int, long)):
-            todo = self.browse(cursor, user, todo, context=context)
+            todo = self.browse(todo)
 
-        user_ = user_obj.browse(cursor, user, user, context=context)
+        user = user_obj.browse(Transaction().user)
         if todo.timezone:
             tztodo = pytz.timezone(todo.timezone)
-        elif user_.timezone:
-                tztodo = pytz.timezone(user_.timezone)
+        elif user.timezone:
+                tztodo = pytz.timezone(user.timezone)
         else:
             tztodo = tzlocal
 
@@ -800,42 +790,36 @@ class Todo(ModelSQL, ModelView):
 
         vtodo.attendee_list = []
         for attendee in todo.attendees:
-            vtodo.attendee_list.append(attendee_obj.attendee2attendee(
-                cursor, user, attendee, context=context))
+            vtodo.attendee_list.append(attendee_obj.attendee2attendee(attendee))
 
         if todo.rdates:
             vtodo.add('rdate')
             vtodo.rdate.value = []
             for rdate in todo.rdates:
-                vtodo.rdate.value.append(rdate_obj.date2date(cursor, user,
-                    rdate, context=context))
+                vtodo.rdate.value.append(rdate_obj.date2date(rdate))
 
         if todo.exdates:
             vtodo.add('exdate')
             vtodo.exdate.value = []
             for exdate in todo.exdates:
-                vtodo.exdate.value.append(exdate_obj.date2date(cursor, user,
-                    exdate, context=context))
+                vtodo.exdate.value.append(exdate_obj.date2date(exdate))
 
         if todo.rrules:
             for rrule in todo.rrules:
-                vtodo.add('rrule').value = rrule_obj.rule2rule(cursor, user,
-                        rrule, context=context)
+                vtodo.add('rrule').value = rrule_obj.rule2rule(rrule)
 
         if todo.exrules:
             for exrule in todo.exrules:
-                vtodo.add('exrule').value = exrule_obj.rule2rule(cursor, user,
-                        exrule, context=context)
+                vtodo.add('exrule').value = exrule_obj.rule2rule(exrule)
 
         vtodo.valarm_list = []
         for alarm in todo.alarms:
-            valarm = alarm_obj.alarm2valarm(cursor, user, alarm,
-                    context=context)
+            valarm = alarm_obj.alarm2valarm(alarm)
             if valarm:
                 vtodo.valarm_list.append(valarm)
 
         for occurence in todo.occurences:
-            rical = self.todo2ical(cursor, user, occurence, context=context)
+            rical = self.todo2ical(occurence)
             ical.vtodo_list.append(rical.vtodo)
         return ical
 
@@ -867,64 +851,62 @@ class TodoRDate(ModelSQL, ModelView):
     todo = fields.Many2One('calendar.todo', 'Todo', 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(TodoRDate, self).init(cursor, module_name)
+        return super(TodoRDate, self).init(module_name)
 
-    def create(self, cursor, user, values, context=None):
+    def create(self, values):
         todo_obj = self.pool.get('calendar.todo')
         if values.get('todo'):
             # Update write_date of todo
-            todo_obj.write(cursor, user, values['todo'], {}, context=context)
-        return super(TodoRDate, self).create(cursor, user, values,
-                context=context)
+            todo_obj.write(values['todo'], {})
+        return super(TodoRDate, self).create(values)
 
-    def write(self, cursor, user, ids, values, context=None):
+    def write(self, ids, values):
         todo_obj = self.pool.get('calendar.todo')
         if isinstance(ids, (int, long)):
             ids = [ids]
-        todo_ids = [x.todo.id for x in self.browse(cursor, user, ids,
-            context=context)]
+        todo_ids = [x.todo.id for x in self.browse(ids)]
         if values.get('todo'):
             todo_ids.append(values['todo'])
         if todo_ids:
             # Update write_date of todo
-            todo_obj.write(cursor, user, todo_ids, {}, context=context)
-        return super(TodoRDate, self).write(cursor, user, ids, values,
-                context=context)
+            todo_obj.write(todo_ids, {})
+        return super(TodoRDate, self).write(ids, values)
 
-    def delete(self, cursor, user, ids, context=None):
+    def delete(self, ids):
         todo_obj = self.pool.get('calendar.todo')
         rdate_obj = self.pool.get('calendar.date')
         if isinstance(ids, (int, long)):
             ids = [ids]
-        todo_rdates = self.browse(cursor, user, ids, context=context)
+        todo_rdates = self.browse(ids)
         rdate_ids = [a.calendar_date.id for a in todo_rdates]
         todo_ids = [x.todo.id for x in todo_rdates]
         if todo_ids:
             # Update write_date of todo
-            todo_obj.write(cursor, user, todo_ids, {}, context=context)
-        res = super(TodoRDate, self).delete(cursor, user, ids, context=context)
+            todo_obj.write(todo_ids, {})
+        res = super(TodoRDate, 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)
 
 TodoRDate()
 
@@ -941,53 +923,52 @@ class TodoRRule(ModelSQL, ModelView):
     todo = fields.Many2One('calendar.todo', 'Todo', ondelete='CASCADE',
             select=1, required=True)
 
-    def create(self, cursor, user, values, context=None):
+    def create(self, values):
         todo_obj = self.pool.get('calendar.todo')
         if values.get('todo'):
             # Update write_date of todo
-            todo_obj.write(cursor, user, values['todo'], {}, context=context)
-        return super(TodoRRule, self).create(cursor, user, values, context=context)
+            todo_obj.write(values['todo'], {})
+        return super(TodoRRule, self).create(values)
 
-    def write(self, cursor, user, ids, values, context=None):
+    def write(self, ids, values):
         todo_obj = self.pool.get('calendar.todo')
         if isinstance(ids, (int, long)):
             ids = [ids]
-        todo_ids = [x.todo.id for x in self.browse(cursor, user, ids,
-            context=context)]
+        todo_ids = [x.todo.id for x in self.browse(ids)]
         if values.get('todo'):
             todo_ids.append(values['todo'])
         if todo_ids:
             # Update write_date of todo
-            todo_obj.write(cursor, user, todo_ids, {}, context=context)
-        return super(TodoRRule, self).write(cursor, user, ids, values, context=context)
+            todo_obj.write(todo_ids, {})
+        return super(TodoRRule, self).write(ids, values)
 
-    def delete(self, cursor, user, ids, context=None):
+    def delete(self, ids):
         todo_obj = self.pool.get('calendar.todo')
         rrule_obj = self.pool.get('calendar.rrule')
         if isinstance(ids, (int, long)):
             ids = [ids]
-        todo_rrules = self.browse(cursor, user, ids, context=context)
+        todo_rrules = self.browse(ids)
         rrule_ids = [a.calendar_rrule.id for a in todo_rrules]
         todo_ids = [x.todo.id for x in todo_rrules]
         if todo_ids:
             # Update write_date of todo
-            todo_obj.write(cursor, user, todo_ids, {}, context=context)
-        res = super(TodoRRule, self).delete(cursor, user, ids, context=context)
+            todo_obj.write(todo_ids, {})
+        res = super(TodoRRule, 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)
 
 TodoRRule()
 
@@ -1019,15 +1000,14 @@ class TodoAttendee(ModelSQL, ModelView):
     todo = fields.Many2One('calendar.todo', 'Todo', ondelete='CASCADE',
             required=True, select=1)
 
-    def create(self, cursor, user, values, context=None):
+    def create(self, values):
         todo_obj = self.pool.get('calendar.todo')
 
         if values.get('todo'):
             # Update write_date of todo
-            todo_obj.write(cursor, user, values['todo'], {}, context=context)
-        res = super(TodoAttendee, self).create(cursor, user, values,
-                context=context)
-        attendee = self.browse(cursor, user, res, context=context)
+            todo_obj.write(values['todo'], {})
+        res = super(TodoAttendee, self).create(values)
+        attendee = self.browse(res)
         todo = attendee.todo
         if todo.calendar.owner \
                 and (todo.organizer == todo.calendar.owner.email \
@@ -1040,38 +1020,37 @@ class TodoAttendee(ModelSQL, ModelView):
                 attendee_emails = [x.email for x in todo.parent.attendees
                         if x.email != todo.parent.organizer]
             if attendee_emails:
-                todo_ids = todo_obj.search(cursor, 0, [
-                    ('uuid', '=', todo.uuid),
-                    ('calendar.owner.email', 'in', attendee_emails),
-                    ('id', '!=', todo.id),
-                    ('recurrence', '=', todo.recurrence or False),
-                    ], context=context)
-                for todo_id in todo_ids:
-                    self.copy(cursor, 0, res, default={
-                        'todo': todo_id,
-                        }, context=context)
+                with Transaction().set_user(0):
+                    todo_ids = todo_obj.search([
+                        ('uuid', '=', todo.uuid),
+                        ('calendar.owner.email', 'in', attendee_emails),
+                        ('id', '!=', todo.id),
+                        ('recurrence', '=', todo.recurrence or False),
+                        ])
+                    for todo_id in todo_ids:
+                        self.copy(res, default={
+                            'todo': todo_id,
+                            })
         return res
 
-    def write(self, cursor, user, ids, values, context=None):
+    def write(self, ids, values):
         todo_obj = self.pool.get('calendar.todo')
 
         if isinstance(ids, (int, long)):
             ids = [ids]
-        todo_ids = [x.todo.id for x in self.browse(cursor, user, ids,
-            context=context)]
+        todo_ids = [x.todo.id for x in self.browse(ids)]
         if values.get('todo'):
             todo_ids.append(values['todo'])
         if todo_ids:
             # Update write_date of todo
-            todo_obj.write(cursor, user, todo_ids, {}, context=context)
+            todo_obj.write(todo_ids, {})
 
         if 'email' in values:
             values = values.copy()
             del values['email']
 
-        res = super(TodoAttendee, self).write(cursor, user, ids, values,
-                context=context)
-        attendees = self.browse(cursor, user, ids, context=context)
+        res = super(TodoAttendee, self).write(ids, values)
+        attendees = self.browse(ids)
         for attendee in attendees:
             todo = attendee.todo
             if todo.calendar.owner \
@@ -1085,32 +1064,34 @@ class TodoAttendee(ModelSQL, ModelView):
                     attendee_emails = [x.email for x in todo.parent.attendees
                             if x.email != todo.parent.organizer]
                 if attendee_emails:
-                    attendee_ids = self.search(cursor, 0, [
-                        ('todo.uuid', '=', todo.uuid),
-                        ('todo.calendar.owner.email', 'in', attendee_emails),
-                        ('id', '!=', attendee.id),
-                        ('todo.recurrence', '=', todo.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([
+                            ('todo.uuid', '=', todo.uuid),
+                            ('todo.calendar.owner.email', 'in',
+                                    attendee_emails),
+                            ('id', '!=', attendee.id),
+                            ('todo.recurrence', '=', todo.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):
         todo_obj = self.pool.get('calendar.todo')
         attendee_obj = self.pool.get('calendar.attendee')
 
         if isinstance(ids, (int, long)):
             ids = [ids]
-        todo_attendees = self.browse(cursor, user, ids, context=context)
+        todo_attendees = self.browse(ids)
         calendar_attendee_ids = [a.calendar_attendee.id \
                 for a in todo_attendees]
         todo_ids = [x.todo.id for x in todo_attendees]
         if todo_ids:
             # Update write_date of todo
-            todo_obj.write(cursor, user, todo_ids, {}, context=context)
+            todo_obj.write(todo_ids, {})
 
-        for attendee in self.browse(cursor, user, ids, context=context):
+        for attendee in self.browse(ids):
             todo = attendee.todo
             if todo.calendar.owner \
                     and (todo.organizer == todo.calendar.owner.email \
@@ -1123,14 +1104,16 @@ class TodoAttendee(ModelSQL, ModelView):
                     attendee_emails = [x.email for x in todo.attendees
                             if x.email != todo.parent.organizer]
                 if attendee_emails:
-                    attendee_ids = self.search(cursor, 0, [
-                        ('todo.uuid', '=', todo.uuid),
-                        ('todo.calendar.owner.email', 'in', attendee_emails),
-                        ('id', '!=', attendee.id),
-                        ('todo.recurrence', '=', todo.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([
+                            ('todo.uuid', '=', todo.uuid),
+                            ('todo.calendar.owner.email', 'in',
+                                attendee_emails),
+                            ('id', '!=', attendee.id),
+                            ('todo.recurrence', '=', todo.recurrence or False),
+                            ('email', '=', attendee.email),
+                            ])
+                        self.delete(attendee_ids)
             elif todo.calendar.organizer \
                     and ((todo.organizer \
                     or (todo.parent and todo.parent.organizer)) \
@@ -1139,24 +1122,24 @@ class TodoAttendee(ModelSQL, ModelView):
                     organizer = todo.organizer
                 else:
                     organizer = todo.parent.organizer
-                attendee_ids = self.search(cursor, 0, [
-                    ('todo.uuid', '=', todo.uuid),
-                    ('todo.calendar.owner.email', '=', organizer),
-                    ('id', '!=', attendee.id),
-                    ('todo.recurrence', '=', todo.recurrence or False),
-                    ('email', '=', attendee.email),
-                    ], context=context)
-                if attendee_ids:
-                    self.write(cursor, 0, attendee_ids, {
-                        'status': 'declined',
-                        }, context=context)
-        res = super(TodoAttendee, self).delete(cursor, user, ids, context=context)
+                with Transaction().set_user(0):
+                    attendee_ids = self.search([
+                        ('todo.uuid', '=', todo.uuid),
+                        ('todo.calendar.owner.email', '=', organizer),
+                        ('id', '!=', attendee.id),
+                        ('todo.recurrence', '=', todo.recurrence or False),
+                        ('email', '=', attendee.email),
+                        ])
+                    if attendee_ids:
+                        self.write(attendee_ids, {
+                            'status': 'declined',
+                            })
+        res = super(TodoAttendee, 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
@@ -1167,30 +1150,27 @@ class TodoAttendee(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(TodoAttendee, 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(TodoAttendee, 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)
 
 TodoAttendee()
 
@@ -1206,49 +1186,47 @@ class TodoAlarm(ModelSQL):
     todo = fields.Many2One('calendar.todo', 'Todo', ondelete='CASCADE',
             required=True, select=1)
 
-    def create(self, cursor, user, values, context=None):
+    def create(self, values):
         todo_obj = self.pool.get('calendar.todo')
         if values.get('todo'):
             # Update write_date of todo
-            todo_obj.write(cursor, user, values['todo'], {}, context=context)
-        return super(TodoAlarm, self).create(cursor, user, values, context=context)
+            todo_obj.write(values['todo'], {})
+        return super(TodoAlarm, self).create(values)
 
-    def write(self, cursor, user, ids, values, context=None):
+    def write(self, ids, values):
         todo_obj = self.pool.get('calendar.todo')
         if isinstance(ids, (int, long)):
             ids = [ids]
-        todo_ids = [x.todo.id for x in self.browse(cursor, user, ids,
-            context=context)]
+        todo_ids = [x.todo.id for x in self.browse(ids)]
         if values.get('todo'):
             todo_ids.append(values['todo'])
         if todo_ids:
             # Update write_date of todo
-            todo_obj.write(cursor, user, todo_ids, {}, context=context)
-        return super(TodoAlarm, self).write(cursor, user, ids, values,
-                context=context)
+            todo_obj.write(todo_ids, {})
+        return super(TodoAlarm, self).write(ids, values)
 
-    def delete(self, cursor, user, ids, context=None):
+    def delete(self, ids):
         todo_obj = self.pool.get('calendar.todo')
         alarm_obj = self.pool.get('calendar.alarm')
         if isinstance(ids, (int, long)):
             ids = [ids]
-        todo_alarms = self.browse(cursor, user, ids, context=context)
+        todo_alarms = self.browse(ids)
         alarm_ids = [a.calendar_alarm.id for a in todo_alarms]
         todo_ids = [x.todo.id for x in todo_alarms]
         if todo_ids:
             # Update write_date of todo
-            todo_obj.write(cursor, user, todo_ids, {}, context=context)
-        res = super(TodoAlarm, self).delete(cursor, user, ids, context=context)
+            todo_obj.write(todo_ids, {})
+        res = super(TodoAlarm, 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)
 
 TodoAlarm()
diff --git a/trytond_calendar_todo.egg-info/PKG-INFO b/trytond_calendar_todo.egg-info/PKG-INFO
index 2333195..93cb712 100644
--- a/trytond_calendar_todo.egg-info/PKG-INFO
+++ b/trytond_calendar_todo.egg-info/PKG-INFO
@@ -1,12 +1,12 @@
 Metadata-Version: 1.0
 Name: trytond-calendar-todo
-Version: 1.6.0
+Version: 1.8.0
 Summary: Add Todo support on CalDAV
 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_todo.egg-info/requires.txt b/trytond_calendar_todo.egg-info/requires.txt
index 159b890..b032e9a 100644
--- a/trytond_calendar_todo.egg-info/requires.txt
+++ b/trytond_calendar_todo.egg-info/requires.txt
@@ -2,5 +2,5 @@ vobject >= 0.8.0
 PyWebDAV >= 0.9.3
 python-dateutil
 pytz
-trytond_calendar >= 1.6, < 1.7
-trytond >= 1.6, < 1.7
\ No newline at end of file
+trytond_calendar >= 1.8, < 1.9
+trytond >= 1.8, < 1.9
\ No newline at end of file
diff --git a/webdav.py b/webdav.py
index c4fbc06..8350d45 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.transaction import Transaction
+from trytond.cache import Cache
 
 
 class Collection(ModelSQL, ModelView):
@@ -12,15 +14,12 @@ class Collection(ModelSQL, ModelView):
     _name = "webdav.collection"
 
     @Cache('webdav_collection.todo')
-    def todo(self, cursor, user, uri, calendar_id=False, context=None):
+    def todo(self, uri, calendar_id=False):
         '''
         Return the todo 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: todo id
             or False if there is no todo
         '''
@@ -29,26 +28,23 @@ class Collection(ModelSQL, ModelView):
         if uri and uri.startswith('Calendars/'):
             calendar, todo_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
-            todo_ids = todo_obj.search(cursor, user, [
+            todo_ids = todo_obj.search([
                 ('calendar', '=', calendar_id),
                 ('uuid', '=', todo_uri[:-4]),
                 ('parent', '=', False),
-                ], limit=1, context=context)
+                ], limit=1)
             if todo_ids:
                 return todo_ids[0]
         return False
 
-    def _caldav_filter_domain_todo(self, cursor, user, filter, context=None):
+    def _caldav_filter_domain_todo(self, filter):
         '''
         Return a domain for caldav filter on todo
 
-        :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 = []
@@ -98,36 +94,33 @@ 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)
-                    todo_id = self.todo(cursor, user, uri, context=context)
+                    todo_id = self.todo(uri)
                     if todo_id:
                         ids.append(todo_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')
         todo_obj = self.pool.get('calendar.todo')
 
-        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 uri and (uri not in ('Calendars', 'Calendars/')) 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_todo(cursor, user, filter,
-                        context=context)
-                todo_ids = todo_obj.search(cursor, user, [
+                domain = self._caldav_filter_domain_todo(filter)
+                todo_ids = todo_obj.search([
                     ('calendar', '=', calendar_id),
                     domain,
-                    ], context=context)
-                todos = todo_obj.browse(cursor, user, todo_ids,
-                        context=context)
+                    ])
+                todos = todo_obj.browse(todo_ids)
                 if cache is not None:
                     cache.setdefault('_calendar', {})
                     cache['_calendar'].setdefault(todo_obj._name, {})
@@ -137,41 +130,38 @@ class Collection(ModelSQL, ModelView):
 
         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
-            if self.todo(cursor, user, uri, calendar_id=calendar_id,
-                    context=context):
+            if self.todo(uri, calendar_id=calendar_id):
                 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_contenttype(self, cursor, user, uri, context=None, cache=None):
-        if self.todo(cursor, user, uri, context=context) \
-                or self.calendar(cursor, user, uri, ics=True, context=context):
+    def get_contenttype(self, uri, cache=None):
+        if self.todo(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')
         todo_obj = self.pool.get('calendar.todo')
 
-        calendar_id = self.calendar(cursor, user, uri, context=context)
+        cursor = Transaction().cursor
+
+        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 and (uri[10:].split('/', 1) + [None])[1]:
 
-            todo_id = self.todo(cursor, user, uri, calendar_id=calendar_id,
-                    context=context)
+            todo_id = self.todo(uri, calendar_id=calendar_id)
             if todo_id:
                 if cache is not None:
                     cache.setdefault('_calendar', {})
@@ -204,17 +194,17 @@ class Collection(ModelSQL, ModelView):
                 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')
         todo_obj = self.pool.get('calendar.todo')
 
-        calendar_id = self.calendar(cursor, user, uri, context=context)
+        cursor = Transaction().cursor
+
+        calendar_id = self.calendar(uri)
         if calendar_id and (uri[10:].split('/', 1) + [None])[1]:
-            todo_id = self.todo(cursor, user, uri, calendar_id=calendar_id,
-                    context=context)
+            todo_id = self.todo(uri, calendar_id=calendar_id)
             if todo_id:
                 if cache is not None:
                     cache.setdefault('_calendar', {})
@@ -252,95 +242,77 @@ class Collection(ModelSQL, ModelView):
                 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):
         todo_obj = self.pool.get('calendar.todo')
         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
-            todo_id = self.todo(cursor, user, uri, calendar_id=calendar_id,
-                    context=context)
+            todo_id = self.todo(uri, calendar_id=calendar_id)
             if not todo_id:
-                return super(Collection, self).get_data(cursor, user, uri,
-                        context=context, cache=cache)
-            ical = todo_obj.todo2ical(cursor, user, todo_id, context=context)
+                return super(Collection, self).get_data(uri, cache=cache)
+            ical = todo_obj.todo2ical(todo_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 put(self, cursor, user, uri, data, content_type, context=None,
-            cache=None):
+    def put(self, uri, data, content_type, cache=None):
         todo_obj = self.pool.get('calendar.todo')
         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
-            todo_id = self.todo(cursor, user, uri, calendar_id=calendar_id,
-                    context=context)
+            todo_id = self.todo(uri, calendar_id=calendar_id)
             ical = vobject.readOne(data)
             if not hasattr(ical, 'vtodo'):
-                return super(Collection, self).put(cursor, user, uri, data,
-                        content_type, context=context)
+                return super(Collection, self).put(uri, data, content_type)
 
             if not todo_id:
 
-                values = todo_obj.ical2values(cursor, user, None, ical,
-                        calendar_id, context=context)
-                todo_id = todo_obj.create(cursor, user, values,
-                        context=context)
-                todo = todo_obj.browse(cursor, user, todo_id,
-                        context=context)
-                calendar = calendar_obj.browse(cursor, user, calendar_id,
-                        context=context)
-                return cursor.database_name + '/Calendars/' + calendar.name + \
-                        '/' + todo.uuid + '.ics'
+                values = todo_obj.ical2values(None, ical, calendar_id)
+                todo_id = todo_obj.create(values)
+                todo = todo_obj.browse(todo_id)
+                calendar = calendar_obj.browse(calendar_id)
+                return Transaction().cursor.database_name + '/Calendars/' + \
+                        calendar.name + '/' + todo.uuid + '.ics'
             else:
-                values = todo_obj.ical2values(cursor, user, todo_id, ical,
-                        calendar_id, context=context)
-                todo_obj.write(cursor, user, todo_id, values,
-                        context=context)
+                values = todo_obj.ical2values(todo_id, ical, calendar_id)
+                todo_obj.write(todo_id, values)
                 return
 
-        return super(Collection, self).put(cursor, user, uri, data,
-                content_type, context=context)
+        return super(Collection, self).put(uri, data, content_type)
 
-    def rm(self, cursor, user, uri, context=None, cache=None):
+    def rm(self, uri, cache=None):
         todo_obj = self.pool.get('calendar.todo')
 
-        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
-            todo_id = self.todo(cursor, user, uri, calendar_id=calendar_id,
-                    context=context)
+            todo_id = self.todo(uri, calendar_id=calendar_id)
             if todo_id:
                 try:
-                    todo_obj.delete(cursor, user, todo_id, context=context)
-                except:
+                    todo_obj.delete(todo_id)
+                except Exception:
                     raise DAV_Forbidden
                 return 200
-        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.todo(cursor, user, uri, calendar_id=calendar_id,
-                    context=context):
+            if self.todo(uri, calendar_id=calendar_id):
                 return 1
-        return super(Collection, self).exists(cursor, user, uri, context=context,
-                cache=cache)
+        return super(Collection, self).exists(uri, cache=cache)
 
 Collection()
commit c837f477919a757f93fc060a5273f5e74b5a5d78
Author: Daniel Baumann <daniel at debian.org>
Date:   Tue Nov 2 14:26:35 2010 +0100

    Switching to source format 3.0 (quilt).

diff --git a/debian/source/format b/debian/source/format
index d3827e7..163aaf8 100644
--- a/debian/source/format
+++ b/debian/source/format
@@ -1 +1 @@
-1.0
+3.0 (quilt)
commit 56434a837223ed467582f173a13fc1e9bc00419d
Author: Daniel Baumann <daniel at debian.org>
Date:   Thu Sep 30 01:05:32 2010 +0200

    Updating to standards version 3.9.1.

diff --git a/debian/control b/debian/control
index b96bd2d..81b8ebd 100644
--- a/debian/control
+++ b/debian/control
@@ -7,7 +7,7 @@ Uploaders:
  Mathias Behrle <mathiasb at mbsolutions.selfip.biz>
 Dm-Upload-Allowed: yes
 Build-Depends: debhelper (>= 8), python, python-setuptools, python-support
-Standards-Version: 3.9.0
+Standards-Version: 3.9.1
 Homepage: http://www.tryton.org/
 Vcs-Browser: http://git.debian-maintainers.org/?p=tryton/tryton-modules-calendar-todo.git
 Vcs-Git: git://git.debian-maintainers.org/git/tryton/tryton-modules-calendar-todo.git
commit f76cae058b735b44574d28bd496834b4482d5f58
Author: Daniel Baumann <daniel at debian.org>
Date:   Thu Sep 30 01:04:04 2010 +0200

    Updating to debhelper version 8.

diff --git a/debian/compat b/debian/compat
index 7f8f011..45a4fb7 100644
--- a/debian/compat
+++ b/debian/compat
@@ -1 +1 @@
-7
+8
diff --git a/debian/control b/debian/control
index 0183d3e..b96bd2d 100644
--- a/debian/control
+++ b/debian/control
@@ -6,7 +6,7 @@ Uploaders:
  Daniel Baumann <daniel at debian.org>,
  Mathias Behrle <mathiasb at mbsolutions.selfip.biz>
 Dm-Upload-Allowed: yes
-Build-Depends: debhelper (>= 7), python, python-setuptools, python-support
+Build-Depends: debhelper (>= 8), python, python-setuptools, python-support
 Standards-Version: 3.9.0
 Homepage: http://www.tryton.org/
 Vcs-Browser: http://git.debian-maintainers.org/?p=tryton/tryton-modules-calendar-todo.git
commit 22dca12380e7b845451d34282d9f0ec9ed7c390e
Author: Daniel Baumann <daniel at debian.org>
Date:   Mon Jun 28 20:35:30 2010 +0200

    Updating standards version to 3.9.0.

diff --git a/debian/control b/debian/control
index a349818..0183d3e 100644
--- a/debian/control
+++ b/debian/control
@@ -7,7 +7,7 @@ Uploaders:
  Mathias Behrle <mathiasb at mbsolutions.selfip.biz>
 Dm-Upload-Allowed: yes
 Build-Depends: debhelper (>= 7), python, python-setuptools, python-support
-Standards-Version: 3.8.4
+Standards-Version: 3.9.0
 Homepage: http://www.tryton.org/
 Vcs-Browser: http://git.debian-maintainers.org/?p=tryton/tryton-modules-calendar-todo.git
 Vcs-Git: git://git.debian-maintainers.org/git/tryton/tryton-modules-calendar-todo.git
commit 859524063bea33b174a8ac01098a5c6757abbae5
Author: Daniel Baumann <daniel at debian.org>
Date:   Sat May 15 12:52:37 2010 +0200

    Wrapping depends.

diff --git a/debian/control b/debian/control
index 710ed3c..a349818 100644
--- a/debian/control
+++ b/debian/control
@@ -16,8 +16,8 @@ Package: tryton-modules-calendar-todo
 Architecture: all
 Depends:
  ${misc:Depends}, ${python:Depends}, tryton-server (>= 1.6),
- tryton-modules-calendar (>= 1.6), python-dateutil, python-tz,
- python-vobject, python-webdav, python-pkg-resources
+ tryton-modules-calendar (>= 1.6), python-dateutil, python-tz, python-vobject,
+ python-webdav, python-pkg-resources
 XB-Python-Version: ${python:Versions}
 Description: Tryton Application Platform (Calendar Todo Module)
  Tryton is a high-level general purpose application platform written in Python
commit aff5dac13a0de7dfdd547d038709a9f00068c2a3
Author: Mathias Behrle <mathiasb at mbsolutions.selfip.biz>
Date:   Thu May 13 12:00:31 2010 +0200

    Releasing debian version 1.6.0-1.

diff --git a/debian/changelog b/debian/changelog
index 4dc67ce..d976e72 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,15 @@
+tryton-modules-calendar-todo (1.6.0-1) unstable; urgency=low
+
+  [ Daniel Baumann ]
+  * Adding Dm-Upload-Allowed in control in preparation for Mathias.
+
+  [ Mathias Behrle ]
+  * Merging upstream version 1.6.0.
+  * Updating copyright.
+  * Updating depends.
+
+ -- Mathias Behrle <mathiasb at mbsolutions.selfip.biz>  Thu, 13 May 2010 12:00:13 +0200
+
 tryton-modules-calendar-todo (1.4.2-1) unstable; urgency=low
 
   * Updating year in copyright file.
commit 3312f262d3b3f4d60eca7b236516fa744c8f507d
Author: Mathias Behrle <mathiasb at mbsolutions.selfip.biz>
Date:   Thu May 13 12:00:02 2010 +0200

    Updating depends.

diff --git a/debian/control b/debian/control
index 50cdcc7..710ed3c 100644
--- a/debian/control
+++ b/debian/control
@@ -15,9 +15,9 @@ Vcs-Git: git://git.debian-maintainers.org/git/tryton/tryton-modules-calendar-tod
 Package: tryton-modules-calendar-todo
 Architecture: all
 Depends:
- ${misc:Depends}, ${python:Depends}, tryton-server (>= 1.4),
- tryton-modules-calendar (>= 1.4), python-dateutil, python-tz,
- python-vobject (>= 0.8.1c-1), python-webdav, python-pkg-resources
+ ${misc:Depends}, ${python:Depends}, tryton-server (>= 1.6),
+ tryton-modules-calendar (>= 1.6), python-dateutil, python-tz,
+ python-vobject, python-webdav, python-pkg-resources
 XB-Python-Version: ${python:Versions}
 Description: Tryton Application Platform (Calendar Todo Module)
  Tryton is a high-level general purpose application platform written in Python
commit 7601af2d8eab316b5b336ada656d567c5c0d14ef
Author: Mathias Behrle <mathiasb at mbsolutions.selfip.biz>
Date:   Thu May 13 11:59:57 2010 +0200

    Updating copyright.

diff --git a/debian/copyright b/debian/copyright
index dad4d26..489b0a2 100644
--- a/debian/copyright
+++ b/debian/copyright
@@ -5,9 +5,9 @@ Maintainer-Homepage: http://tryton.debian-maintainers.org/
 
 Files: *
 Copyright:
- (C) 2009 Cedric Krier
- (C) 2009 Bertrand Chenal
- (C) 2009 B2CK SPRL
+ (C) 2009-2010 Cedric Krier
+ (C) 2009-2010 Bertrand Chenal
+ (C) 2009-2010 B2CK SPRL
 License: GPL-3+
  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
commit 8a0a73fe67a842e283b466a6b4334e885ad8cc5c
Author: Mathias Behrle <mathiasb at mbsolutions.selfip.biz>
Date:   Thu May 13 11:29:01 2010 +0200

    Merging upstream version 1.6.0.

diff --git a/CHANGELOG b/CHANGELOG
index 035fbe7..515da05 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,8 +1,7 @@
-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-10
+* Bug fixes (see mercurial logs for details)
+* Remove classification_public
+* Rename recurrences into occurences on calendar.todo
 
 Version 1.4.0 - 2009-10-19
 * Initial release
diff --git a/MANIFEST.in b/MANIFEST.in
index 23bd33a..5343ad8 100644
--- a/MANIFEST.in
+++ b/MANIFEST.in
@@ -7,5 +7,3 @@ include LICENSE
 include *.xml
 include *.odt
 include *.csv
-include tests/*
-
diff --git a/PKG-INFO b/PKG-INFO
index 639e6a0..7987827 100644
--- a/PKG-INFO
+++ b/PKG-INFO
@@ -1,12 +1,12 @@
 Metadata-Version: 1.0
 Name: trytond_calendar_todo
-Version: 1.4.2
+Version: 1.6.0
 Summary: Add Todo support on CalDAV
 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/__tryton__.py b/__tryton__.py
index 5555d90..6cace63 100644
--- a/__tryton__.py
+++ b/__tryton__.py
@@ -7,7 +7,7 @@
     'name_es_CO': 'Calendario de tareas',
     'name_es_ES': 'Calendario de tareas',
     'name_fr_FR' : 'Tâche Calendrier',
-    'version' : '1.4.2',
+    'version' : '1.6.0',
     'author' : 'B2CK',
     'email': 'info at b2ck.com',
     'website': 'http://www.tryton.org/',
diff --git a/de_DE.csv b/de_DE.csv
index 1c38542..18347c8 100644
--- a/de_DE.csv
+++ b/de_DE.csv
@@ -18,12 +18,11 @@ field,"calendar.todo,calendar_read_users",0,Read Users,Benutzer mit Leseberechti
 field,"calendar.todo,calendar_write_users",0,Write Users,Benutzer mit Schreibberechtigung,0
 field,"calendar.todo,categories",0,Categories,Kategorien,0
 field,"calendar.todo,classification",0,Classification,Klassifizierung,0
-field,"calendar.todo,classification_public",0,Classification Public,Öffentliche Klassifizierung,0
 field,"calendar.todo,completed",0,Completed,Abgeschlossen,0
 field,"calendar.todo,description",0,Description,Bezeichnung,0
 field,"calendar.todo,dtstart",0,Start Date,Anfangsdatum,0
 field,"calendar.todo,due",0,Due Date,Fälligkeitsdatum,0
-field,"calendar.todo.exdate,calendar_rdate",0,Calendar RDate,Kalender WDatum,0
+field,"calendar.todo.exdate,calendar_date",0,Calendar Date,Kalender Datum,0
 field,"calendar.todo.exdate,rec_name",0,Name,Name,0
 field,"calendar.todo,exdates",0,Exception Dates,Ausnahmedaten,0
 field,"calendar.todo.exdate,todo",0,Todo,Aufgabe,0
@@ -32,21 +31,21 @@ field,"calendar.todo.exrule,rec_name",0,Name,Name,0
 field,"calendar.todo,exrules",0,Exception Rules,Ausnahmeregeln,0
 field,"calendar.todo.exrule,todo",0,Todo,Aufgabe,0
 field,"calendar.todo,location",0,Location,Ort,0
+field,"calendar.todo,occurences",0,Occurences,Ereignisse,0
 field,"calendar.todo,organizer",0,Organizer,Organisator,0
 field,"calendar.todo,parent",0,Parent,Übergeordnet (Aufgabe),0
 field,"calendar.todo,percent_complete",0,Percent complete,% erledigt,0
-field,"calendar.todo.rdate,calendar_rdate",0,Calendar RDate,Kalender WDatum,0
+field,"calendar.todo.rdate,calendar_date",0,Calendar Date,Kalender Datum,0
 field,"calendar.todo.rdate,rec_name",0,Name,Name,0
 field,"calendar.todo,rdates",0,Recurrence Dates,Wiederholungsdaten,0
 field,"calendar.todo.rdate,todo",0,Todo,Aufgabe,0
 field,"calendar.todo,rec_name",0,Name,Name,0
 field,"calendar.todo,recurrence",0,Recurrence,Wiederholung,0
-field,"calendar.todo,recurrences",0,Recurrences,Wiederholungen,0
 field,"calendar.todo.rrule,calendar_rrule",0,Calendar RRule,Kalender WRegel,0
 field,"calendar.todo.rrule,rec_name",0,Name,Name,0
 field,"calendar.todo,rrules",0,Recurrence Rules,Wiederholungsregeln,0
 field,"calendar.todo.rrule,todo",0,Todo,Aufgabe,0
-field,"calendar.todo,sequence",0,Sequence,Sequenz,0
+field,"calendar.todo,sequence",0,Sequence,Revision,0
 field,"calendar.todo,status",0,Status,Status,0
 field,"calendar.todo,summary",0,Summary,Zusammenfassung,0
 field,"calendar.todo,timezone",0,Timezone,Zeitzone,0
@@ -59,9 +58,12 @@ model,"calendar.todo-calendar.category,name",0,Todo - Category,Aufgabe - Kategor
 model,"calendar.todo.exdate,name",0,Exception Date,Ausnahmedatum,0
 model,"calendar.todo.exrule,name",0,Exception Rule,Ausnahmeregel,0
 model,"calendar.todo,name",0,Todo,Aufgabe,0
-model,"calendar.todo.rdate,name",0,Recurrence Date,Wiederholungsdatum,0
+model,"calendar.todo.rdate,name",0,Todo Recurrence Date,Aufgabe Wiederholungsdatum,0
 model,"calendar.todo.rrule,name",0,Recurrence Rule,Wiederholungsregel,0
 model,"ir.action,name",act_todo_form,Todos,Aufgaben,0
+model,"ir.action,name",act_todo_form2,Todos,Aufgaben,0
+model,"ir.action,name",act_todo_form3,Todos,Aufgaben,0
+model,"ir.ui.menu,name",menu_todo_form2,New Todo,Neue Aufgabe,0
 model,"ir.ui.menu,name",menu_todo_form,Todos,Aufgaben,0
 selection,"calendar.todo,classification",0,Confidential,Vertraulich,0
 selection,"calendar.todo,classification",0,Private,Privat,0
@@ -74,6 +76,7 @@ selection,"calendar.todo,status",0,Needs-Action,Benötigt Eingriff,0
 view,calendar.todo,0,Attendees,Teilnehmer,0
 view,calendar.todo,0,Categories,Kategorien,0
 view,calendar.todo,0,General,Allgemein,0
+view,calendar.todo,0,Occurences,Ereignisse,0
 view,calendar.todo,0,Recurrences,Wiederholungen,0
 view,calendar.todo,0,Todo,Aufgabe,0
 view,calendar.todo,0,Todos,Aufgaben,0
diff --git a/es_CO.csv b/es_CO.csv
index 554124d..c49cab3 100644
--- a/es_CO.csv
+++ b/es_CO.csv
@@ -32,6 +32,7 @@ field,"calendar.todo.exrule,rec_name",0,Name,Nombre,0
 field,"calendar.todo,exrules",0,Exception Rules,Reglas de Excepción,0
 field,"calendar.todo.exrule,todo",0,Todo,,0
 field,"calendar.todo,location",0,Location,Lugar,0
+field,"calendar.todo,occurences",0,Occurences,Ocurrencias,0
 field,"calendar.todo,organizer",0,Organizer,Organizador,0
 field,"calendar.todo,parent",0,Parent,Padre,0
 field,"calendar.todo,percent_complete",0,Percent complete,,0
@@ -41,7 +42,6 @@ field,"calendar.todo,rdates",0,Recurrence Dates,Fechas de Repetición,0
 field,"calendar.todo.rdate,todo",0,Todo,,0
 field,"calendar.todo,rec_name",0,Name,Nombre,0
 field,"calendar.todo,recurrence",0,Recurrence,Repetición,0
-field,"calendar.todo,recurrences",0,Recurrences,Repeticiones,0
 field,"calendar.todo.rrule,calendar_rrule",0,Calendar RRule,,0
 field,"calendar.todo.rrule,rec_name",0,Name,Nombre,0
 field,"calendar.todo,rrules",0,Recurrence Rules,Reglas de Repetición,0
@@ -62,6 +62,9 @@ model,"calendar.todo,name",0,Todo,,0
 model,"calendar.todo.rdate,name",0,Recurrence Date,Fecha de Repetición,0
 model,"calendar.todo.rrule,name",0,Recurrence Rule,Regla de Repetición,0
 model,"ir.action,name",act_todo_form,Todos,,0
+model,"ir.action,name",act_todo_form2,Todos,Por Hacer,0
+model,"ir.action,name",act_todo_form3,Todos,Por hacer,0
+model,"ir.ui.menu,name",menu_todo_form2,New Todo,Nuevo Por Hacer,0
 model,"ir.ui.menu,name",menu_todo_form,Todos,,0
 selection,"calendar.todo,classification",0,Confidential,Confidencial,0
 selection,"calendar.todo,classification",0,Private,Privado,0
@@ -74,6 +77,7 @@ selection,"calendar.todo,status",0,Needs-Action,,0
 view,calendar.todo,0,Attendees,Asistentes,0
 view,calendar.todo,0,Categories,Categorías,0
 view,calendar.todo,0,General,General,0
+view,calendar.todo,0,Occurences,Ocurrencias,0
 view,calendar.todo,0,Recurrences,Repeticiones,0
 view,calendar.todo,0,Todo,,0
 view,calendar.todo,0,Todos,,0
diff --git a/fr_FR.csv b/fr_FR.csv
index e2d1eee..4459c8b 100644
--- a/fr_FR.csv
+++ b/fr_FR.csv
@@ -18,12 +18,11 @@ field,"calendar.todo,calendar_read_users",0,Read Users,Utilisateurs en lecture,0
 field,"calendar.todo,calendar_write_users",0,Write Users,Utilisateurs en écriture,0
 field,"calendar.todo,categories",0,Categories,Catégories,0
 field,"calendar.todo,classification",0,Classification,Classification,0
-field,"calendar.todo,classification_public",0,Classification Public,Classification publique,0
 field,"calendar.todo,completed",0,Completed,Complété,0
 field,"calendar.todo,description",0,Description,Description,0
 field,"calendar.todo,dtstart",0,Start Date,Date de début,0
 field,"calendar.todo,due",0,Due Date,Date d'échéance,0
-field,"calendar.todo.exdate,calendar_rdate",0,Calendar RDate,Date de récurrence,0
+field,"calendar.todo.exdate,calendar_date",0,Calendar Date,Date calendrier,0
 field,"calendar.todo.exdate,rec_name",0,Name,Nom,0
 field,"calendar.todo,exdates",0,Exception Dates,Dates d'exception,0
 field,"calendar.todo.exdate,todo",0,Todo,Tâche,0
@@ -32,16 +31,16 @@ field,"calendar.todo.exrule,rec_name",0,Name,Nom,0
 field,"calendar.todo,exrules",0,Exception Rules,Règles d'exception,0
 field,"calendar.todo.exrule,todo",0,Todo,Tâche,0
 field,"calendar.todo,location",0,Location,Emplacement,0
+field,"calendar.todo,occurences",0,Occurences,Occurrences,0
 field,"calendar.todo,organizer",0,Organizer,Organisateur,0
 field,"calendar.todo,parent",0,Parent,Parent,0
 field,"calendar.todo,percent_complete",0,Percent complete,Pourcentage effectué,0
-field,"calendar.todo.rdate,calendar_rdate",0,Calendar RDate,Date de récurrence,0
+field,"calendar.todo.rdate,calendar_date",0,Calendar Date,Date calendrier,0
 field,"calendar.todo.rdate,rec_name",0,Name,Nom,0
 field,"calendar.todo,rdates",0,Recurrence Dates,Dates de récurrence,0
 field,"calendar.todo.rdate,todo",0,Todo,Tâche,0
 field,"calendar.todo,rec_name",0,Name,Nom,0
 field,"calendar.todo,recurrence",0,Recurrence,Récurrence,0
-field,"calendar.todo,recurrences",0,Recurrences,Récurrences,0
 field,"calendar.todo.rrule,calendar_rrule",0,Calendar RRule,Règle de récurrence,0
 field,"calendar.todo.rrule,rec_name",0,Name,Nom,0
 field,"calendar.todo,rrules",0,Recurrence Rules,Règles de récurrence,0
@@ -59,9 +58,12 @@ model,"calendar.todo-calendar.category,name",0,Todo - Category,Todo - Catégorie
 model,"calendar.todo.exdate,name",0,Exception Date,Date d'exception,0
 model,"calendar.todo.exrule,name",0,Exception Rule,Règle d'exception,0
 model,"calendar.todo,name",0,Todo,Tâche,0
-model,"calendar.todo.rdate,name",0,Recurrence Date,Date de récurrence,0
+model,"calendar.todo.rdate,name",0,Todo Recurrence Date,Date de récurrence,0
 model,"calendar.todo.rrule,name",0,Recurrence Rule,Règle de récurrence,0
 model,"ir.action,name",act_todo_form,Todos,Tâches,0
+model,"ir.action,name",act_todo_form2,Todos,Tâches,0
+model,"ir.action,name",act_todo_form3,Todos,Tâches,0
+model,"ir.ui.menu,name",menu_todo_form2,New Todo,Nouvelle tâche,0
 model,"ir.ui.menu,name",menu_todo_form,Todos,Tâches,0
 selection,"calendar.todo,classification",0,Confidential,Confidentiel,0
 selection,"calendar.todo,classification",0,Private,Privé,0
@@ -74,6 +76,7 @@ selection,"calendar.todo,status",0,Needs-Action,Nécessite une action,0
 view,calendar.todo,0,Attendees,Participants,0
 view,calendar.todo,0,Categories,Catégories,0
 view,calendar.todo,0,General,Général,0
+view,calendar.todo,0,Occurences,Occurrences,0
 view,calendar.todo,0,Recurrences,Récurrences,0
 view,calendar.todo,0,Todo,Tâche,0
 view,calendar.todo,0,Todos,Tâches,0
diff --git a/setup.py b/setup.py
index fab69c6..42102b3 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_todo',
     version=info.get('version', '0.0.1'),
@@ -27,6 +30,7 @@ setup(name='trytond_calendar_todo',
     package_dir={'trytond.modules.calendar_todo': '.'},
     packages=[
         'trytond.modules.calendar_todo',
+        'trytond.modules.calendar_todo.tests',
     ],
     package_data={
         'trytond.modules.calendar_todo': info.get('xml', []) \
@@ -55,4 +59,6 @@ setup(name='trytond_calendar_todo',
     [trytond.modules]
     calendar_todo = trytond.modules.calendar_todo
     """,
+    test_suite='tests',
+    test_loader='trytond.test_loader:Loader',
 )
diff --git a/tests/__init__.py b/tests/__init__.py
index ce85354..4dad3ab 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_todo import *
+from test_calendar_todo import suite
diff --git a/tests/test_calendar_todo.py b/tests/test_calendar_todo.py
index d9661c5..dc39509 100644
--- a/tests/test_calendar_todo.py
+++ b/tests/test_calendar_todo.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 CalendarTodoTestCase(unittest.TestCase):
@@ -28,11 +28,10 @@ class CalendarTodoTestCase(unittest.TestCase):
         self.assertRaises(Exception, test_view('calendar_todo'))
 
 def suite():
-    return unittest.TestLoader().loadTestsFromTestCase(CalendarTodoTestCase)
+    suite = trytond.tests.test_tryton.suite()
+    suite.addTests(unittest.TestLoader().loadTestsFromTestCase(
+        CalendarTodoTestCase))
+    return suite
 
 if __name__ == '__main__':
-    suiteTrytond = trytond.tests.test_tryton.suite()
-    suiteCalendarTodo = suite()
-    alltests = unittest.TestSuite([suiteTrytond, suiteCalendarTodo])
-    unittest.TextTestRunner(verbosity=2).run(alltests)
-    SOCK.disconnect()
+    unittest.TextTestRunner(verbosity=2).run(suite())
diff --git a/todo.py b/todo.py
index 3c02485..d3e188b 100644
--- a/todo.py
+++ b/todo.py
@@ -1,7 +1,9 @@
 #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.tools import reduce_ids
+from trytond.backend import TableHandler
+from trytond.pyson import Not, Equal, Eval, If, Bool, In
 import uuid
 import vobject
 import dateutil.tz
@@ -20,7 +22,7 @@ class Todo(ModelSQL, ModelView):
     _rec_name = 'uuid'
 
     calendar = fields.Many2One('calendar.calendar', 'Calendar',
-            required=True, select=1)
+            required=True, select=1, ondelete="CASCADE")
     alarms = fields.One2Many('calendar.todo.alarm', 'todo', 'Alarms')
     classification = fields.Selection([
         ('public', 'Public'),
@@ -29,35 +31,42 @@ class Todo(ModelSQL, ModelView):
         ], 'Classification', required=True)
     completed = fields.DateTime('Completed',
             states={
-                'readonly': "(status != 'completed')",
+                'readonly': Not(Equal(Eval('status'), 'completed')),
             }, depends=['status'])
     description = fields.Text('Description')
     dtstart = fields.DateTime('Start Date', select=1)
     location = fields.Many2One('calendar.location', 'Location')
     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.todo.attendee', 'todo',
             'Attendees')
     percent_complete = fields.Integer('Percent complete',
             states={
-                'readonly': "(status not in ('needs-action', 'in-process'))",
+                'readonly': Not(In(Eval('status'),
+                    ['needs-action', 'in-process'])),
             }, depends=['status'])
-    recurrences = fields.One2Many('calendar.todo', 'parent', 'Recurrences',
-            domain=["('uuid', '=', uuid)",
-                "('calendar', '=', calendar)"],
+    occurences = fields.One2Many('calendar.todo', 'parent', 'Occurences',
+            domain=[
+                ('uuid', '=', Eval('uuid')),
+                ('calendar', '=', Eval('calendar')),
+            ],
             states={
-                'invisible': "bool(parent)",
+                'invisible': Bool(Eval('parent')),
             }, depends=['uuid', 'calendar', 'parent'])
     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'])
     sequence = fields.Integer('Sequence')
     parent = fields.Many2One('calendar.todo', 'Parent',
-            domain=["('uuid', '=', uuid)",
-                "('parent', '=', False)",
-                "('calendar', '=', calendar)"],
+            domain=[
+                ('uuid', '=', Eval('uuid')),
+                ('parent', '=', False),
+                ('calendar', '=', Eval('calendar'))
+            ],
             ondelete='CASCADE', depends=['uuid', 'calendar'])
     timezone = fields.Selection('timezones', 'Timezone')
     status = fields.Selection([
@@ -75,32 +84,26 @@ class Todo(ModelSQL, ModelView):
             'todo', 'category', 'Categories')
     exdates = fields.One2Many('calendar.todo.exdate', 'todo', 'Exception Dates',
             states={
-                'invisible': "bool(parent)",
+                'invisible': Bool(Eval('parent')),
             }, depends=['parent'])
     exrules = fields.One2Many('calendar.todo.exrule', 'todo', 'Exception Rules',
             states={
-                'invisible': "bool(parent)",
+                'invisible': Bool(Eval('parent')),
             }, depends=['parent'])
     rdates = fields.One2Many('calendar.todo.rdate', 'todo', 'Recurrence Dates',
             states={
-                'invisible': "bool(parent)",
+                'invisible': Bool(Eval('parent')),
             }, depends=['parent'])
     rrules = fields.One2Many('calendar.todo.rrule', 'todo', 'Recurrence Rules',
             states={
-                'invisible': "bool(parent)",
+                'invisible': Bool(Eval('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.One2Many('res.user', None,
+        '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')
     vtodo = fields.Binary('vtodo')
 
     def __init__(self):
@@ -116,6 +119,20 @@ class Todo(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_todo_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(Todo, self).init(cursor, module_name)
+
     def default_uuid(self, cursor, user, context=None):
         return str(uuid.uuid4())
 
@@ -130,7 +147,7 @@ class Todo(ModelSQL, ModelView):
         user_ = user_obj.browse(cursor, user, user, context=context)
         return user_.timezone
 
-    def on_change_status(self, cursor, user, ids, vals, context=None):
+    def on_change_status(self, cursor, user, vals, context=None):
         res = {}
         if 'status' not in vals:
             return res
@@ -144,7 +161,7 @@ class Todo(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 = {}
@@ -156,35 +173,8 @@ class Todo(ModelSQL, ModelView):
                 res[todo.id] = todo.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 todo in self.browse(cursor, user, ids, context=context):
-            res[todo.id] = False
-            if todo.classification == 'public':
-                res[todo.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):
         '''
@@ -197,7 +187,7 @@ class Todo(ModelSQL, ModelView):
                     or todo.rrules \
                     or todo.exdates \
                     or todo.exrules \
-                    or todo.recurrences:
+                    or todo.occurences:
                 return False
         return True
 
@@ -227,10 +217,10 @@ class Todo(ModelSQL, ModelView):
                     for calendar_id in calendar_ids:
                         new_id = self.copy(cursor, 0, todo.id, default={
                             'calendar': calendar_id,
-                            'recurrences': False,
+                            'occurences': False,
                             }, context=context)
-                        for recurrence in todo.recurrences:
-                            self.copy(cursor, 0, recurrence.id, default={
+                        for occurence in todo.occurences:
+                            self.copy(cursor, 0, occurence.id, default={
                                 'calendar': calendar_id,
                                 'parent': new_id,
                                 }, context=context)
@@ -339,10 +329,10 @@ class Todo(ModelSQL, ModelView):
                         for calendar_id in calendar_ids:
                             new_id = self.copy(cursor, 0, todo.id, default={
                                 'calendar': calendar_id,
-                                'recurrences': False,
+                                'occurences': False,
                                 }, context=context)
-                            for recurrence in todo.recurrences:
-                                self.copy(cursor, 0, recurrence.id, default={
+                            for occurence in todo.occurences:
+                                self.copy(cursor, 0, occurence.id, default={
                                     'calendar': calendar_id,
                                     'parent': new_id,
                                     }, context=context)
@@ -644,31 +634,31 @@ class Todo(ModelSQL, ModelView):
 
         res['vtodo'] = vtodo.serialize()
 
-        recurrences_todel = []
+        occurences_todel = []
         if todo:
-            recurrences_todel = [x.id for x in todo.recurrences]
+            occurences_todel = [x.id for x in todo.occurences]
         for vtodo in vtodos:
             todo_id = None
             if todo:
-                for recurrence in todo.recurrences:
-                    if recurrence.recurrence.replace(tzinfo=tzlocal) \
+                for occurence in todo.occurences:
+                    if occurence.recurrence.replace(tzinfo=tzlocal) \
                             == vtodo.recurrence_id.value:
-                        todo_id = recurrence.id
-                        recurrences_todel.remove(recurrence.id)
+                        todo_id = occurence.id
+                        occurences_todel.remove(occurence.id)
             vals = self.ical2values(cursor, user, todo_id, ical,
                     calendar_id, vtodo=vtodo, context=context)
             if todo:
                 vals['uuid'] = todo.uuid
             else:
                 vals['uuid'] = res['uuid']
-            res.setdefault('recurrences', [])
+            res.setdefault('occurences', [])
             if todo_id:
-                res['recurrences'].append(('write', todo_id, vals))
+                res['occurences'].append(('write', todo_id, vals))
             else:
-                res['recurrences'].append(('create', vals))
-        if recurrences_todel:
-            res.setdefault('recurrences', [])
-            res['recurrences'].append(('delete', recurrences_todel))
+                res['occurences'].append(('create', vals))
+        if occurences_todel:
+            res.setdefault('occurences', [])
+            res['occurences'].append(('delete', occurences_todel))
         return res
 
     def todo2ical(self, cursor, user, todo, context=None):
@@ -766,11 +756,8 @@ class Todo(ModelSQL, ModelView):
         if todo.recurrence and todo.parent:
             if not hasattr(vtodo, 'recurrence-id'):
                 vtodo.add('recurrence-id')
-            if todo.all_day:
-                vtodo.recurrence_id.value = todo.recurrence.date()
-            else:
-                vtodo.recurrence_id.value = todo.recurrence\
-                        .replace(tzinfo=tzlocal).astimezone(tztodo)
+            vtodo.recurrence_id.value = todo.recurrence\
+                    .replace(tzinfo=tzlocal).astimezone(tztodo)
         elif hasattr(vtodo, 'recurrence-id'):
             del vtodo.recurrence_id
         if todo.status:
@@ -847,8 +834,8 @@ class Todo(ModelSQL, ModelView):
             if valarm:
                 vtodo.valarm_list.append(valarm)
 
-        for recurrence in todo.recurrences:
-            rical = self.todo2ical(cursor, user, recurrence, context=context)
+        for occurence in todo.occurences:
+            rical = self.todo2ical(cursor, user, occurence, context=context)
             ical.vtodo_list.append(rical.vtodo)
         return ical
 
@@ -869,17 +856,26 @@ TodoCategory()
 
 
 class TodoRDate(ModelSQL, ModelView):
-    'Recurrence Date'
+    'Todo Recurrence Date'
     _description = __doc__
     _name = 'calendar.todo.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)
     todo = fields.Many2One('calendar.todo', 'Todo', 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(TodoRDate, self).init(cursor, module_name)
+
     def create(self, cursor, user, values, context=None):
         todo_obj = self.pool.get('calendar.todo')
         if values.get('todo'):
@@ -904,11 +900,11 @@ class TodoRDate(ModelSQL, ModelView):
 
     def delete(self, cursor, user, ids, context=None):
         todo_obj = self.pool.get('calendar.todo')
-        rdate_obj = self.pool.get('calendar.rdate')
+        rdate_obj = self.pool.get('calendar.date')
         if isinstance(ids, (int, long)):
             ids = [ids]
         todo_rdates = self.browse(cursor, user, ids, context=context)
-        rdate_ids = [a.calendar_rdate.id for a in todo_rdates]
+        rdate_ids = [a.calendar_date.id for a in todo_rdates]
         todo_ids = [x.todo.id for x in todo_rdates]
         if todo_ids:
             # Update write_date of todo
@@ -919,15 +915,15 @@ class TodoRDate(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)
 
 TodoRDate()
diff --git a/todo.xml b/todo.xml
index 5d80374..0994181 100644
--- a/todo.xml
+++ b/todo.xml
@@ -61,13 +61,13 @@ this repository contains the full copyright notices and license terms. -->
                             <field name="organizer"/>
                             <field name="attendees" colspan="4"/>
                         </page>
-                        <page string="Recurrences" id="recurrences"
-                            states="{'invisible': '''bool(globals().get('_parent_parent'))'''}">
+                        <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="recurrences" colspan="4">
+                            <field name="occurences" colspan="4">
                                 <tree string="Todos">
                                     <field name="summary" select="1"/>
                                     <field name="recurrence" select="1"/>
@@ -100,8 +100,49 @@ this repository contains the full copyright notices and license terms. -->
             <field name="view" ref="todo_view_form"/>
             <field name="act_window" ref="act_todo_form"/>
         </record>
-        <menuitem parent="calendar.menu_calendar_form" sequence="1"
+        <menuitem parent="calendar.menu_calendar_form" sequence="30"
             action="act_todo_form" id="menu_todo_form"/>
+        <record model="ir.action.act_window" id="act_todo_form2">
+            <field name="name">Todos</field>
+            <field name="res_model">calendar.todo</field>
+            <field name="view_type">form</field>
+            <field name="domain">[('parent', '=', False)]</field>
+        </record>
+        <record model="ir.action.act_window.view" id="act_todo_form2_view1">
+            <field name="sequence" eval="10"/>
+            <field name="view" ref="todo_view_form"/>
+            <field name="act_window" ref="act_todo_form2"/>
+        </record>
+        <record model="ir.action.act_window.view" id="act_todo_form2_view2">
+            <field name="sequence" eval="20"/>
+            <field name="view" ref="todo_view_tree"/>
+            <field name="act_window" ref="act_todo_form2"/>
+        </record>
+        <menuitem name="New Todo" parent="menu_todo_form" sequence="10"
+            action="act_todo_form2" id="menu_todo_form2"/>
+
+        <record model="ir.action.act_window" id="act_todo_form3">
+            <field name="name">Todos</field>
+            <field name="res_model">calendar.todo</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_todo_form3_view1">
+            <field name="sequence" eval="10"/>
+            <field name="view" ref="todo_view_tree"/>
+            <field name="act_window" ref="act_todo_form3"/>
+        </record>
+        <record model="ir.action.act_window.view" id="act_todo_form3_view2">
+            <field name="sequence" eval="20"/>
+            <field name="view" ref="todo_view_form"/>
+            <field name="act_window" ref="act_todo_form3"/>
+        </record>
+        <record model="ir.action.keyword"
+                id="act_open_todo_keyword1">
+            <field name="keyword">form_relate</field>
+            <field name="model">calendar.calendar,0</field>
+            <field name="action" ref="act_todo_form3"/>
+        </record>
 
         <record model="ir.rule.group" id="rule_group_read_todo">
             <field name="model" search="[('model', '=', 'calendar.todo')]"/>
@@ -124,12 +165,6 @@ this repository contains the full copyright notices and license terms. -->
             <field name="operand">User</field>
             <field name="rule_group" ref="rule_group_read_todo"/>
         </record>
-        <record model="ir.rule" id="rule_group_read_todo_line3">
-            <field name="field" search="[('name', '=', 'classification_public'), ('model.model', '=', 'calendar.todo')]"/>
-            <field name="operator">=</field>
-            <field name="operand">True</field>
-            <field name="rule_group" ref="rule_group_read_todo"/>
-        </record>
 
         <record model="ir.rule.group" id="rule_group_write_todo">
             <field name="model" search="[('model', '=', 'calendar.todo')]"/>
diff --git a/trytond_calendar_todo.egg-info/PKG-INFO b/trytond_calendar_todo.egg-info/PKG-INFO
index cf08cc5..2333195 100644
--- a/trytond_calendar_todo.egg-info/PKG-INFO
+++ b/trytond_calendar_todo.egg-info/PKG-INFO
@@ -1,12 +1,12 @@
 Metadata-Version: 1.0
 Name: trytond-calendar-todo
-Version: 1.4.2
+Version: 1.6.0
 Summary: Add Todo support on CalDAV
 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_todo.egg-info/SOURCES.txt b/trytond_calendar_todo.egg-info/SOURCES.txt
index b3321ab..e25e4da 100644
--- a/trytond_calendar_todo.egg-info/SOURCES.txt
+++ b/trytond_calendar_todo.egg-info/SOURCES.txt
@@ -15,8 +15,8 @@ todo.xml
 ./caldav.py
 ./todo.py
 ./webdav.py
-tests/__init__.py
-tests/test_calendar_todo.py
+./tests/__init__.py
+./tests/test_calendar_todo.py
 trytond_calendar_todo.egg-info/PKG-INFO
 trytond_calendar_todo.egg-info/SOURCES.txt
 trytond_calendar_todo.egg-info/dependency_links.txt
diff --git a/trytond_calendar_todo.egg-info/requires.txt b/trytond_calendar_todo.egg-info/requires.txt
index 59de83b..159b890 100644
--- a/trytond_calendar_todo.egg-info/requires.txt
+++ b/trytond_calendar_todo.egg-info/requires.txt
@@ -2,6 +2,5 @@ vobject >= 0.8.0
 PyWebDAV >= 0.9.3
 python-dateutil
 pytz
-trytond_calendar
-trytond >= 1.4
-trytond < 1.5
\ No newline at end of file
+trytond_calendar >= 1.6, < 1.7
+trytond >= 1.6, < 1.7
\ No newline at end of file
diff --git a/webdav.py b/webdav.py
index 636f25d..c4fbc06 100644
--- a/webdav.py
+++ b/webdav.py
@@ -11,6 +11,7 @@ class Collection(ModelSQL, ModelView):
 
     _name = "webdav.collection"
 
+    @Cache('webdav_collection.todo')
     def todo(self, cursor, user, uri, calendar_id=False, context=None):
         '''
         Return the todo id in the uri or False
@@ -40,8 +41,6 @@ class Collection(ModelSQL, ModelView):
                 return todo_ids[0]
         return False
 
-    todo = Cache('webdav_collection.todo')(todo)
-
     def _caldav_filter_domain_todo(self, cursor, user, filter, context=None):
         '''
         Return a domain for caldav filter on todo
commit c6b98a687596401d1653db8b09d3b563a1348b8b
Author: Daniel Baumann <daniel at debian.org>
Date:   Fri Apr 9 14:31:33 2010 +0200

    Adding Dm-Upload-Allowed in control in preparation for Mathias.

diff --git a/debian/control b/debian/control
index 00a9739..50cdcc7 100644
--- a/debian/control
+++ b/debian/control
@@ -5,6 +5,7 @@ Maintainer: Debian Tryton Maintainers <tryton at lists.debian-maintainers.org>
 Uploaders:
  Daniel Baumann <daniel at debian.org>,
  Mathias Behrle <mathiasb at mbsolutions.selfip.biz>
+Dm-Upload-Allowed: yes
 Build-Depends: debhelper (>= 7), python, python-setuptools, python-support
 Standards-Version: 3.8.4
 Homepage: http://www.tryton.org/
commit bb9e3f1e1375887163129c64a0f263e674a3096a
Author: Daniel Baumann <daniel at debian.org>
Date:   Sat Feb 20 10:21:22 2010 +0100

    Releasing debian version 1.4.2-1.

diff --git a/debian/changelog b/debian/changelog
index ec727c2..4dc67ce 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,12 @@
+tryton-modules-calendar-todo (1.4.2-1) unstable; urgency=low
+
+  * Updating year in copyright file.
+  * Removing unneeded python-all-dev from build-depends.
+  * Updating to standards 3.8.4.
+  * Merging upstream version 1.4.2.
+
+ -- Daniel Baumann <daniel at debian.org>  Sat, 20 Feb 2010 10:21:16 +0100
+
 tryton-modules-calendar-todo (1.4.1-1) unstable; urgency=low
 
   [ Daniel Baumann ]
commit 44fc76581090bab55af107eab4dca90f77c562af
Author: Daniel Baumann <daniel at debian.org>
Date:   Sat Feb 20 10:20:33 2010 +0100

    Merging 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 7877d27..639e6a0 100644
--- a/PKG-INFO
+++ b/PKG-INFO
@@ -1,6 +1,6 @@
 Metadata-Version: 1.0
 Name: trytond_calendar_todo
-Version: 1.4.1
+Version: 1.4.2
 Summary: Add Todo support on CalDAV
 Home-page: http://www.tryton.org/
 Author: B2CK
diff --git a/__tryton__.py b/__tryton__.py
index db78023..5555d90 100644
--- a/__tryton__.py
+++ b/__tryton__.py
@@ -7,7 +7,7 @@
     'name_es_CO': 'Calendario de tareas',
     'name_es_ES': 'Calendario de tareas',
     'name_fr_FR' : 'Tâche Calendrier',
-    'version' : '1.4.1',
+    'version' : '1.4.2',
     'author' : 'B2CK',
     'email': 'info at b2ck.com',
     'website': 'http://www.tryton.org/',
diff --git a/todo.py b/todo.py
index fae2911..3c02485 100644
--- a/todo.py
+++ b/todo.py
@@ -50,7 +50,8 @@ class Todo(ModelSQL, ModelView):
                 'invisible': "bool(parent)",
             }, depends=['uuid', 'calendar', 'parent'])
     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'])
     sequence = fields.Integer('Sequence')
     parent = fields.Many2One('calendar.todo', 'Parent',
@@ -762,7 +763,7 @@ class Todo(ModelSQL, ModelView):
         if not hasattr(vtodo, 'last-modified'):
             vtodo.add('last-modified')
         vtodo.last_modified.value = date.replace(tzinfo=tzlocal).astimezone(tztodo)
-        if todo.recurrence:
+        if todo.recurrence and todo.parent:
             if not hasattr(vtodo, 'recurrence-id'):
                 vtodo.add('recurrence-id')
             if todo.all_day:
@@ -770,6 +771,8 @@ class Todo(ModelSQL, ModelView):
             else:
                 vtodo.recurrence_id.value = todo.recurrence\
                         .replace(tzinfo=tzlocal).astimezone(tztodo)
+        elif hasattr(vtodo, 'recurrence-id'):
+            del vtodo.recurrence_id
         if todo.status:
             if not hasattr(vtodo, 'status'):
                 vtodo.add('status')
diff --git a/todo.xml b/todo.xml
index ae6349d..5d80374 100644
--- a/todo.xml
+++ b/todo.xml
@@ -62,7 +62,7 @@ this repository contains the full copyright notices and license terms. -->
                             <field name="attendees" colspan="4"/>
                         </page>
                         <page string="Recurrences" id="recurrences"
-                            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_todo.egg-info/PKG-INFO b/trytond_calendar_todo.egg-info/PKG-INFO
index 9bbf22c..cf08cc5 100644
--- a/trytond_calendar_todo.egg-info/PKG-INFO
+++ b/trytond_calendar_todo.egg-info/PKG-INFO
@@ -1,6 +1,6 @@
 Metadata-Version: 1.0
 Name: trytond-calendar-todo
-Version: 1.4.1
+Version: 1.4.2
 Summary: Add Todo support on CalDAV
 Home-page: http://www.tryton.org/
 Author: B2CK
commit 3d48a69ea52fac1b564a17a501dc43df933c7587
Author: Daniel Baumann <daniel at debian.org>
Date:   Thu Jan 28 07:53:21 2010 +0100

    Updating to standards 3.8.4.

diff --git a/debian/control b/debian/control
index 0fd396b..00a9739 100644
--- a/debian/control
+++ b/debian/control
@@ -6,7 +6,7 @@ Uploaders:
  Daniel Baumann <daniel at debian.org>,
  Mathias Behrle <mathiasb at mbsolutions.selfip.biz>
 Build-Depends: debhelper (>= 7), python, python-setuptools, python-support
-Standards-Version: 3.8.3
+Standards-Version: 3.8.4
 Homepage: http://www.tryton.org/
 Vcs-Browser: http://git.debian-maintainers.org/?p=tryton/tryton-modules-calendar-todo.git
 Vcs-Git: git://git.debian-maintainers.org/git/tryton/tryton-modules-calendar-todo.git
commit bc71b0bbc47df9d9584c816538e286928dd2aea1
Author: Daniel Baumann <daniel at debian.org>
Date:   Mon Jan 25 10:12:27 2010 +0100

    Removing unneeded python-all-dev from build-depends.

diff --git a/debian/control b/debian/control
index c742de2..0fd396b 100644
--- a/debian/control
+++ b/debian/control
@@ -5,8 +5,7 @@ Maintainer: Debian Tryton Maintainers <tryton at lists.debian-maintainers.org>
 Uploaders:
  Daniel Baumann <daniel at debian.org>,
  Mathias Behrle <mathiasb at mbsolutions.selfip.biz>
-Build-Depends:
- debhelper (>= 7), python, python-all-dev, python-setuptools, python-support
+Build-Depends: debhelper (>= 7), python, python-setuptools, python-support
 Standards-Version: 3.8.3
 Homepage: http://www.tryton.org/
 Vcs-Browser: http://git.debian-maintainers.org/?p=tryton/tryton-modules-calendar-todo.git
commit e755a86a9b4baa8933944a00f7a805d5ede157ed
Author: Daniel Baumann <daniel at debian.org>
Date:   Sat Jan 2 11:35:12 2010 +0100

    Updating year in copyright file.

diff --git a/debian/copyright b/debian/copyright
index 2eed23b..dad4d26 100644
--- a/debian/copyright
+++ b/debian/copyright
@@ -26,7 +26,7 @@ License: GPL-3+
  can be found in /usr/share/common-licenses/GPL-3 file.
 
 Files: debian/*
-Copyright: (C) 2009 Daniel Baumann <daniel at debian.org>
+Copyright: (C) 2009-2010 Daniel Baumann <daniel at debian.org>
 License: GPL-3+
  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
commit 8ea656e4ee1419d7158893eb70b2494eceb58c84
Author: Daniel Baumann <daniel at debian.org>
Date:   Wed Nov 25 13:02:29 2009 +0100

    Releasing debian version 1.4.1-1.

diff --git a/debian/changelog b/debian/changelog
index fb6e052..ec727c2 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,18 @@
+tryton-modules-calendar-todo (1.4.1-1) unstable; urgency=low
+
+  [ Daniel Baumann ]
+  * Making depends versioned for tryton 1.4.
+
+  [ Mathias Behrle ]
+  * Adding versioned depend for python-vobject.
+
+  [ Daniel Baumann ]
+  * Merging upstream version 1.4.1.
+  * Updating README.source.
+  * Adding explicit debian source version 1.0 until switch to 3.0.
+
+ -- Daniel Baumann <daniel at debian.org>  Wed, 25 Nov 2009 13:02:20 +0100
+
 tryton-modules-calendar-todo (1.4.0-1) unstable; urgency=low
 
   * Initial release.
commit d1275c3fa802420a6fba0b2269e8ef2879a06bab
Author: Daniel Baumann <daniel at debian.org>
Date:   Wed Nov 25 13:02:05 2009 +0100

    Adding explicit debian source version 1.0 until switch to 3.0.

diff --git a/debian/source/format b/debian/source/format
new file mode 100644
index 0000000..d3827e7
--- /dev/null
+++ b/debian/source/format
@@ -0,0 +1 @@
+1.0
commit 31530c1dba6072cbf1870090d29e7e972d9374fe
Author: Daniel Baumann <daniel at debian.org>
Date:   Wed Nov 25 13:01:58 2009 +0100

    Updating README.source.

diff --git a/debian/README.source b/debian/README.source
index dcc7ba3..18b6b24 100644
--- a/debian/README.source
+++ b/debian/README.source
@@ -32,6 +32,6 @@ upstream source. Changes, if any, are stored in the source package as diffs in
 debian/diff and are applied during the build. Current modifications can be
 applied to the source tree with:
 
-  $ quilt push -a
+  $ QUILT_PATCHES=debian/patches quilt push -a
 
 More information about Quilt can be found in the quilt package.
commit 980f4b38aa7a8a31d571a85f1b56f19c8013a1d4
Author: Daniel Baumann <daniel at debian.org>
Date:   Wed Nov 25 13:01:38 2009 +0100

    Merging 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 27a8558..6577bda 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 or later (http://vobject.skyhouseconsulting.com/)
+ * pywebdav 0.9.3 or later (http://sourceforge.net/projects/pywebdav/)
  * python-dateutil (http://labix.org/python-dateutil)
  * pytz (http://pytz.sourceforge.net/)
  * trytond_calendar (http://www.tryton.org/)
diff --git a/PKG-INFO b/PKG-INFO
index c25f548..7877d27 100644
--- a/PKG-INFO
+++ b/PKG-INFO
@@ -1,6 +1,6 @@
 Metadata-Version: 1.0
 Name: trytond_calendar_todo
-Version: 1.4.0
+Version: 1.4.1
 Summary: Add Todo support on CalDAV
 Home-page: http://www.tryton.org/
 Author: B2CK
diff --git a/__tryton__.py b/__tryton__.py
index a27c01d..db78023 100644
--- a/__tryton__.py
+++ b/__tryton__.py
@@ -7,7 +7,7 @@
     'name_es_CO': 'Calendario de tareas',
     'name_es_ES': 'Calendario de tareas',
     'name_fr_FR' : 'Tâche 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 82d5241..2d2fe00 100644
--- a/caldav.py
+++ b/caldav.py
@@ -14,12 +14,13 @@ 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/'):
-        vc = doc.createElement('vtodo-collection')
-        vc.setAttribute('xmlns', 'http://groupdav.org/')
-        cols = res.getElementsByTagName('D:collection')
-        if cols:
-            cols[0].parentNode.appendChild(vc)
+    #Disable groupdav attribute for iPhone
+    #if  parent_uri in ('Calendars', 'Calendars/'):
+    #    vc = doc.createElement('vtodo-collection')
+    #    vc.setAttribute('xmlns', 'http://groupdav.org/')
+    #    cols = res.getElementsByTagName('D:collection')
+    #    if cols:
+    #        cols[0].parentNode.appendChild(vc)
     return res
 
 propfind.PROPFIND.mk_prop_response = mk_prop_response
diff --git a/setup.py b/setup.py
index 94e80dc..fab69c6 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/todo.py b/todo.py
index 566ec9a..fae2911 100644
--- a/todo.py
+++ b/todo.py
@@ -206,15 +206,18 @@ class Todo(ModelSQL, ModelView):
 
         res = super(Todo, self).create(cursor, user, values, context=context)
         todo = self.browse(cursor, user, res, context=context)
-        if todo.organizer == todo.calendar.owner.email \
+        if todo.calendar.owner \
+                and (todo.organizer == todo.calendar.owner.email \
                 or (todo.parent \
-                and todo.parent.organizer == todo.parent.calendar.owner.email):
+                and todo.parent.organizer == todo.parent.calendar.owner.email)):
             if todo.organizer == todo.calendar.owner.email:
                 attendee_emails = [x.email for x in todo.attendees
-                        if x.status != 'declined']
+                        if x.status != 'declined'
+                        and x.email != todo.organizer]
             else:
                 attendee_emails = [x.email for x in todo.parent.attendees
-                        if x.status != 'declined']
+                        if x.status != 'declined'
+                        and x.email != todo.parent.organizer]
             if attendee_emails:
                 calendar_ids = calendar_obj.search(cursor, 0, [
                     ('owner.email', 'in', attendee_emails),
@@ -302,15 +305,18 @@ class Todo(ModelSQL, ModelView):
                     'WHERE ' + red_sql, red_ids)
 
         for todo in self.browse(cursor, user, ids, context=context):
-            if todo.organizer == todo.calendar.owner.email \
+            if todo.calendar.owner \
+                    and (todo.organizer == todo.calendar.owner.email \
                     or (todo.parent \
-                    and todo.parent.organizer == todo.calendar.owner.email):
+                    and todo.parent.organizer == todo.calendar.owner.email)):
                 if todo.organizer == todo.calendar.owner.email:
                     attendee_emails = [x.email for x in todo.attendees
-                            if x.status != 'declined']
+                            if x.status != 'declined'
+                            and x.email != todo.organizer]
                 else:
                     attendee_emails = [x.email for x in todo.parent.attendees
-                            if x.status != 'declined']
+                            if x.status != 'declined'
+                            and x.email != todo.parent.organizer]
                 if attendee_emails:
                     todo_ids = self.search(cursor, 0, [
                         ('uuid', '=', todo.uuid),
@@ -363,13 +369,16 @@ class Todo(ModelSQL, ModelView):
         if isinstance(ids, (int, long)):
             ids = [ids]
         for todo in self.browse(cursor, user, ids, context=context):
-            if todo.organizer == todo.calendar.owner.email \
+            if todo.calendar.owner \
+                    and (todo.organizer == todo.calendar.owner.email \
                     or (todo.parent \
-                    and todo.parent.organizer == todo.calendar.owner.email):
+                    and todo.parent.organizer == todo.calendar.owner.email)):
                 if todo.organizer == todo.calendar.owner.email:
-                    attendee_emails = [x.email for x in todo.attendees]
+                    attendee_emails = [x.email for x in todo.attendees
+                            if x.email != todo.organizer]
                 else:
-                    attendee_emails = [x.email for x in todo.parent.attendees]
+                    attendee_emails = [x.email for x in todo.parent.attendees
+                            if x.email != todo.parent.organizer]
                 if attendee_emails:
                     todo_ids = self.search(cursor, 0, [
                         ('uuid', '=', todo.uuid),
@@ -398,9 +407,10 @@ class Todo(ModelSQL, ModelView):
                             attendee_obj.write(cursor, 0, attendee.id, {
                                 'status': 'declined',
                                 }, context=context)
+        res = super(Todo, self).delete(cursor, user, ids, context=context)
         # Restart the cache for todo
         collection_obj.todo(cursor.dbname)
-        return super(Todo, self).delete(cursor, user, ids, context=context)
+        return res
 
     def ical2values(self, cursor, user, todo_id, ical, calendar_id,
             vtodo=None, context=None):
@@ -1020,19 +1030,22 @@ class TodoAttendee(ModelSQL, ModelView):
                 context=context)
         attendee = self.browse(cursor, user, res, context=context)
         todo = attendee.todo
-        if todo.organizer == todo.calendar.owner.email \
+        if todo.calendar.owner \
+                and (todo.organizer == todo.calendar.owner.email \
                 or (todo.parent \
-                and todo.parent.organizer == todo.parent.calendar.owner.email):
+                and todo.parent.organizer == todo.parent.calendar.owner.email)):
             if todo.organizer == todo.calendar.owner.email:
-                attendee_emails = [x.email for x in todo.attendees]
+                attendee_emails = [x.email for x in todo.attendees
+                        if x.email != todo.organizer]
             else:
-                attendee_emails = [x.email for x in todo.parent.attendees]
+                attendee_emails = [x.email for x in todo.parent.attendees
+                        if x.email != todo.parent.organizer]
             if attendee_emails:
-                todo_ids = self.search(cursor, 0, [
-                    ('todo.uuid', '=', todo.uuid),
-                    ('todo.calendar.owner.email', 'in', attendee_emails),
+                todo_ids = todo_obj.search(cursor, 0, [
+                    ('uuid', '=', todo.uuid),
+                    ('calendar.owner.email', 'in', attendee_emails),
                     ('id', '!=', todo.id),
-                    ('todo.recurrence', '=', todo.recurrence or False),
+                    ('recurrence', '=', todo.recurrence or False),
                     ], context=context)
                 for todo_id in todo_ids:
                     self.copy(cursor, 0, res, default={
@@ -1062,13 +1075,16 @@ class TodoAttendee(ModelSQL, ModelView):
         attendees = self.browse(cursor, user, ids, context=context)
         for attendee in attendees:
             todo = attendee.todo
-            if todo.organizer == todo.calendar.owner.email \
+            if todo.calendar.owner \
+                    and (todo.organizer == todo.calendar.owner.email \
                     or (todo.parent \
-                    and todo.parent.organizer == todo.calendar.owner.email):
+                    and todo.parent.organizer == todo.calendar.owner.email)):
                 if todo.organizer == todo.calendar.owner.email:
-                    attendee_emails = [x.email for x in todo.attendees]
+                    attendee_emails = [x.email for x in todo.attendees
+                            if x.email != todo.organizer]
                 else:
-                    attendee_emails = [x.email for x in todo.parent.attendees]
+                    attendee_emails = [x.email for x in todo.parent.attendees
+                            if x.email != todo.parent.organizer]
                 if attendee_emails:
                     attendee_ids = self.search(cursor, 0, [
                         ('todo.uuid', '=', todo.uuid),
@@ -1097,13 +1113,16 @@ class TodoAttendee(ModelSQL, ModelView):
 
         for attendee in self.browse(cursor, user, ids, context=context):
             todo = attendee.todo
-            if todo.organizer == todo.calendar.owner.email \
+            if todo.calendar.owner \
+                    and (todo.organizer == todo.calendar.owner.email \
                     or (todo.parent \
-                    and todo.parent.organizer == todo.calendar.owner.email):
+                    and todo.parent.organizer == todo.calendar.owner.email)):
                 if todo.organizer == todo.calendar.owner.email:
-                    attendee_emails = [x.email for x in todo.attendees]
+                    attendee_emails = [x.email for x in todo.attendees
+                            if x.email != todo.organizer]
                 else:
-                    attendee_emails = [x.email for x in todo.attendees]
+                    attendee_emails = [x.email for x in todo.attendees
+                            if x.email != todo.parent.organizer]
                 if attendee_emails:
                     attendee_ids = self.search(cursor, 0, [
                         ('todo.uuid', '=', todo.uuid),
@@ -1113,9 +1132,10 @@ class TodoAttendee(ModelSQL, ModelView):
                         ('email', '=', attendee.email),
                         ], context=context)
                     self.delete(cursor, 0, attendee_ids, context=context)
-            elif (todo.organizer \
+            elif todo.calendar.organizer \
+                    and ((todo.organizer \
                     or (todo.parent and todo.parent.organizer)) \
-                    and attendee.email == todo.calendar.owner.email:
+                    and attendee.email == todo.calendar.owner.email):
                 if todo.organizer:
                     organizer = todo.organizer
                 else:
@@ -1137,6 +1157,27 @@ class TodoAttendee(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(TodoAttendee, 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,
diff --git a/trytond_calendar_todo.egg-info/PKG-INFO b/trytond_calendar_todo.egg-info/PKG-INFO
index 23dd6de..9bbf22c 100644
--- a/trytond_calendar_todo.egg-info/PKG-INFO
+++ b/trytond_calendar_todo.egg-info/PKG-INFO
@@ -1,6 +1,6 @@
 Metadata-Version: 1.0
 Name: trytond-calendar-todo
-Version: 1.4.0
+Version: 1.4.1
 Summary: Add Todo support on CalDAV
 Home-page: http://www.tryton.org/
 Author: B2CK
diff --git a/trytond_calendar_todo.egg-info/requires.txt b/trytond_calendar_todo.egg-info/requires.txt
index 7627a53..59de83b 100644
--- a/trytond_calendar_todo.egg-info/requires.txt
+++ b/trytond_calendar_todo.egg-info/requires.txt
@@ -1,5 +1,5 @@
-vobject
-PyWebDAV
+vobject >= 0.8.0
+PyWebDAV >= 0.9.3
 python-dateutil
 pytz
 trytond_calendar
commit 138f89ffb10aa6cf533f0acf1fc1593db6714fe8
Author: Mathias Behrle <mathiasb at mbsolutions.selfip.biz>
Date:   Thu Jan 7 07:25:05 2010 +0100

    Adding versioned depend for python-vobject.

diff --git a/debian/control b/debian/control
index 2b44d29..c742de2 100644
--- a/debian/control
+++ b/debian/control
@@ -16,8 +16,8 @@ Package: tryton-modules-calendar-todo
 Architecture: all
 Depends:
  ${misc:Depends}, ${python:Depends}, tryton-server (>= 1.4),
- tryton-modules-calendar (>= 1.4), python-dateutil, python-tz, python-vobject,
- python-webdav, python-pkg-resources
+ tryton-modules-calendar (>= 1.4), python-dateutil, python-tz,
+ python-vobject (>= 0.8.1c-1), python-webdav, python-pkg-resources
 XB-Python-Version: ${python:Versions}
 Description: Tryton Application Platform (Calendar Todo Module)
  Tryton is a high-level general purpose application platform written in Python
commit 2e0159dead799ad81dd953c75343018c54459aac
Author: Daniel Baumann <daniel at debian.org>
Date:   Thu Jan 7 07:24:37 2010 +0100

    Making depends versioned for tryton 1.4.

diff --git a/debian/control b/debian/control
index 192f737..2b44d29 100644
--- a/debian/control
+++ b/debian/control
@@ -15,9 +15,9 @@ Vcs-Git: git://git.debian-maintainers.org/git/tryton/tryton-modules-calendar-tod
 Package: tryton-modules-calendar-todo
 Architecture: all
 Depends:
- ${misc:Depends}, ${python:Depends}, tryton-server, tryton-modules-calendar,
- python-dateutil, python-tz, python-vobject, python-webdav,
- python-pkg-resources
+ ${misc:Depends}, ${python:Depends}, tryton-server (>= 1.4),
+ tryton-modules-calendar (>= 1.4), python-dateutil, python-tz, python-vobject,
+ python-webdav, python-pkg-resources
 XB-Python-Version: ${python:Versions}
 Description: Tryton Application Platform (Calendar Todo Module)
  Tryton is a high-level general purpose application platform written in Python
commit 460872c12e23f41d81ff999d308a69c269c5f3eb
Author: Daniel Baumann <daniel at debian.org>
Date:   Mon Oct 19 22:54:45 2009 +0200

    Adding debian version 1.4.0-1.

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..27a8558
--- /dev/null
+++ b/INSTALL
@@ -0,0 +1,34 @@
+Installing trytond_calendar_todo
+=================================
+
+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/)
+ * trytond_calendar (http://www.tryton.org/)
+
+Installation
+------------
+
+Once you've downloaded and unpacked the trytond_calendar_todo 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_todo.
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..23bd33a
--- /dev/null
+++ b/MANIFEST.in
@@ -0,0 +1,11 @@
+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..c25f548
--- /dev/null
+++ b/PKG-INFO
@@ -0,0 +1,25 @@
+Metadata-Version: 1.0
+Name: trytond_calendar_todo
+Version: 1.4.0
+Summary: Add Todo support on CalDAV
+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..c5ca2f9
--- /dev/null
+++ b/README
@@ -0,0 +1,36 @@
+trytond_calendar_todo
+=====================
+
+The calendar_todo 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..d62d024
--- /dev/null
+++ b/__init__.py
@@ -0,0 +1,6 @@
+#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 todo import *
+from webdav import *
diff --git a/__tryton__.py b/__tryton__.py
new file mode 100644
index 0000000..a27c01d
--- /dev/null
+++ b/__tryton__.py
@@ -0,0 +1,34 @@
+# -*- 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 Todo',
+    'name_de_DE' : 'Kalender Aufgaben',
+    'name_es_CO': 'Calendario de tareas',
+    'name_es_ES': 'Calendario de tareas',
+    'name_fr_FR' : 'Tâche Calendrier',
+    'version' : '1.4.0',
+    'author' : 'B2CK',
+    'email': 'info at b2ck.com',
+    'website': 'http://www.tryton.org/',
+    'description': 'Add Todo support on CalDAV',
+    'description_de_DE' : 'Fügt Unterstützung für Aufgaben in CalDAV hinzu',
+    'description_es_CO': 'Añade soporte de tareas sobre CalDAV',
+    'description_es_ES': 'Añade soporte de tareas sobre CalDAV',
+    'description_fr_FR': 'Ajoute la gestion des tâches au CalDAV',
+    'depends' : [
+        'ir',
+        'res',
+        'webdav',
+        'calendar',
+    ],
+    'xml' : [
+        'todo.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..82d5241
--- /dev/null
+++ b/caldav.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.
+_TRYTON_RELOAD = False
+
+from DAV import propfind
+from DAV.utils import get_uriparentpath
+from trytond.protocols.webdav import TrytonDAVInterface
+
+_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/'):
+        vc = doc.createElement('vtodo-collection')
+        vc.setAttribute('xmlns', 'http://groupdav.org/')
+        cols = res.getElementsByTagName('D:collection')
+        if cols:
+            cols[0].parentNode.appendChild(vc)
+    return res
+
+propfind.PROPFIND.mk_prop_response = mk_prop_response
diff --git a/de_DE.csv b/de_DE.csv
new file mode 100644
index 0000000..1c38542
--- /dev/null
+++ b/de_DE.csv
@@ -0,0 +1,89 @@
+type,name,res_id,src,value,fuzzy
+error,calendar.todo,0,Recurrence can not be recurrent!,Wiederholungen können nicht rekursiv sein!,0
+error,calendar.todo,0,UUID and recurrence must be unique in a calendar!,UUID und Wiederholung können in einem Kalender nicht mehrfach vergeben werden!,0
+field,"calendar.todo.alarm,calendar_alarm",0,Calendar Alarm,Kalender Alarm,0
+field,"calendar.todo.alarm,rec_name",0,Name,Name,0
+field,"calendar.todo,alarms",0,Alarms,Alarm,0
+field,"calendar.todo.alarm,todo",0,Todo,Aufgabe,0
+field,"calendar.todo.attendee,calendar_attendee",0,Calendar Attendee,Kalender Teilnehmer,0
+field,"calendar.todo.attendee,rec_name",0,Name,Name,0
+field,"calendar.todo,attendees",0,Attendees,Teilnehmer,0
+field,"calendar.todo.attendee,todo",0,Todo,Aufgabe,0
+field,"calendar.todo,calendar",0,Calendar,Kalender,0
+field,"calendar.todo-calendar.category,category",0,Category,Kategorie,0
+field,"calendar.todo-calendar.category,rec_name",0,Name,Name,0
+field,"calendar.todo-calendar.category,todo",0,To-Do,Aufgabe,0
+field,"calendar.todo,calendar_owner",0,Owner,Besitzer,0
+field,"calendar.todo,calendar_read_users",0,Read Users,Benutzer mit Leseberechtigung,0
+field,"calendar.todo,calendar_write_users",0,Write Users,Benutzer mit Schreibberechtigung,0
+field,"calendar.todo,categories",0,Categories,Kategorien,0
+field,"calendar.todo,classification",0,Classification,Klassifizierung,0
+field,"calendar.todo,classification_public",0,Classification Public,Öffentliche Klassifizierung,0
+field,"calendar.todo,completed",0,Completed,Abgeschlossen,0
+field,"calendar.todo,description",0,Description,Bezeichnung,0
+field,"calendar.todo,dtstart",0,Start Date,Anfangsdatum,0
+field,"calendar.todo,due",0,Due Date,Fälligkeitsdatum,0
+field,"calendar.todo.exdate,calendar_rdate",0,Calendar RDate,Kalender WDatum,0
+field,"calendar.todo.exdate,rec_name",0,Name,Name,0
+field,"calendar.todo,exdates",0,Exception Dates,Ausnahmedaten,0
+field,"calendar.todo.exdate,todo",0,Todo,Aufgabe,0
+field,"calendar.todo.exrule,calendar_rrule",0,Calendar RRule,Kalender WRegel,0
+field,"calendar.todo.exrule,rec_name",0,Name,Name,0
+field,"calendar.todo,exrules",0,Exception Rules,Ausnahmeregeln,0
+field,"calendar.todo.exrule,todo",0,Todo,Aufgabe,0
+field,"calendar.todo,location",0,Location,Ort,0
+field,"calendar.todo,organizer",0,Organizer,Organisator,0
+field,"calendar.todo,parent",0,Parent,Übergeordnet (Aufgabe),0
+field,"calendar.todo,percent_complete",0,Percent complete,% erledigt,0
+field,"calendar.todo.rdate,calendar_rdate",0,Calendar RDate,Kalender WDatum,0
+field,"calendar.todo.rdate,rec_name",0,Name,Name,0
+field,"calendar.todo,rdates",0,Recurrence Dates,Wiederholungsdaten,0
+field,"calendar.todo.rdate,todo",0,Todo,Aufgabe,0
+field,"calendar.todo,rec_name",0,Name,Name,0
+field,"calendar.todo,recurrence",0,Recurrence,Wiederholung,0
+field,"calendar.todo,recurrences",0,Recurrences,Wiederholungen,0
+field,"calendar.todo.rrule,calendar_rrule",0,Calendar RRule,Kalender WRegel,0
+field,"calendar.todo.rrule,rec_name",0,Name,Name,0
+field,"calendar.todo,rrules",0,Recurrence Rules,Wiederholungsregeln,0
+field,"calendar.todo.rrule,todo",0,Todo,Aufgabe,0
+field,"calendar.todo,sequence",0,Sequence,Sequenz,0
+field,"calendar.todo,status",0,Status,Status,0
+field,"calendar.todo,summary",0,Summary,Zusammenfassung,0
+field,"calendar.todo,timezone",0,Timezone,Zeitzone,0
+field,"calendar.todo,uuid",0,UUID,UUID,0
+field,"calendar.todo,vtodo",0,vtodo,vtodo,0
+help,"calendar.todo,uuid",0,Universally Unique Identifier,Universally Unique Identifier,0
+model,"calendar.todo.alarm,name",0,Alarm,Alarm,0
+model,"calendar.todo.attendee,name",0,Attendee,Teilnehmer,0
+model,"calendar.todo-calendar.category,name",0,Todo - Category,Aufgabe - Kategorie,0
+model,"calendar.todo.exdate,name",0,Exception Date,Ausnahmedatum,0
+model,"calendar.todo.exrule,name",0,Exception Rule,Ausnahmeregel,0
+model,"calendar.todo,name",0,Todo,Aufgabe,0
+model,"calendar.todo.rdate,name",0,Recurrence Date,Wiederholungsdatum,0
+model,"calendar.todo.rrule,name",0,Recurrence Rule,Wiederholungsregel,0
+model,"ir.action,name",act_todo_form,Todos,Aufgaben,0
+model,"ir.ui.menu,name",menu_todo_form,Todos,Aufgaben,0
+selection,"calendar.todo,classification",0,Confidential,Vertraulich,0
+selection,"calendar.todo,classification",0,Private,Privat,0
+selection,"calendar.todo,classification",0,Public,Öffentlich,0
+selection,"calendar.todo,status",0,,,0
+selection,"calendar.todo,status",0,Cancelled,Abgesagt,0
+selection,"calendar.todo,status",0,Completed,Abgeschlossen,0
+selection,"calendar.todo,status",0,In-Process,In Arbeit,0
+selection,"calendar.todo,status",0,Needs-Action,Benötigt Eingriff,0
+view,calendar.todo,0,Attendees,Teilnehmer,0
+view,calendar.todo,0,Categories,Kategorien,0
+view,calendar.todo,0,General,Allgemein,0
+view,calendar.todo,0,Recurrences,Wiederholungen,0
+view,calendar.todo,0,Todo,Aufgabe,0
+view,calendar.todo,0,Todos,Aufgaben,0
+view,calendar.todo.attendee,0,Attendee,Teilnehmer,0
+view,calendar.todo.attendee,0,Attendees,Teilnehmer,0
+view,calendar.todo.exdate,0,Exception Date,Ausnahmedatum,0
+view,calendar.todo.exdate,0,Exception Dates,Ausnahmedaten,0
+view,calendar.todo.exrule,0,Exception Rule,Ausnahmeregel,0
+view,calendar.todo.exrule,0,Exception Rules,Ausnahmeregeln,0
+view,calendar.todo.rdate,0,Recurrence Date,Wiederholungsdatum,0
+view,calendar.todo.rdate,0,Recurrence Dates,Wiederholungsdaten,0
+view,calendar.todo.rrule,0,Recurrence Rule,Wiederholungsregel,0
+view,calendar.todo.rrule,0,Recurrence Rules,Wiederholungsregeln,0
diff --git a/debian/README.source b/debian/README.source
new file mode 100644
index 0000000..dcc7ba3
--- /dev/null
+++ b/debian/README.source
@@ -0,0 +1,37 @@
+Package Repositories
+--------------------
+
+Backports for the current stable debian distribution as well as snapshots of
+unreleased versions may be available in repositories listed on the maintainers
+homepage. The current URL of the maintainer homepage can be seen in
+debian/copyright.
+
+
+Source Access
+-------------
+
+You can obtain the sources of this package with:
+
+  $ apt-get source ${PACKAGE}
+
+whereas '${PACKAGE}' has to be replaced with the actual name of the package.
+
+This package is maintained with the Git version control system. The current git
+source tree can be obtained with:
+
+  $ git clone ${GIT_URI}
+
+whereas '${GIT_URI}' has to be replaced with the actual URI for the Git
+repository. The current Git URI can be seen in debian/control in the extracted
+package sources.
+
+More information about Git can be found in the git-core package.
+
+This package may use the Quilt patch system to manage all modifications to the
+upstream source. Changes, if any, are stored in the source package as diffs in
+debian/diff and are applied during the build. Current modifications can be
+applied to the source tree with:
+
+  $ quilt push -a
+
+More information about Quilt can be found in the quilt package.
diff --git a/debian/changelog b/debian/changelog
new file mode 100644
index 0000000..fb6e052
--- /dev/null
+++ b/debian/changelog
@@ -0,0 +1,5 @@
+tryton-modules-calendar-todo (1.4.0-1) unstable; urgency=low
+
+  * Initial release.
+
+ -- Daniel Baumann <daniel at debian.org>  Mon, 19 Oct 2009 23:39:41 +0200
diff --git a/debian/compat b/debian/compat
new file mode 100644
index 0000000..7f8f011
--- /dev/null
+++ b/debian/compat
@@ -0,0 +1 @@
+7
diff --git a/debian/control b/debian/control
new file mode 100644
index 0000000..192f737
--- /dev/null
+++ b/debian/control
@@ -0,0 +1,27 @@
+Source: tryton-modules-calendar-todo
+Section: python
+Priority: optional
+Maintainer: Debian Tryton Maintainers <tryton at lists.debian-maintainers.org>
+Uploaders:
+ Daniel Baumann <daniel at debian.org>,
+ Mathias Behrle <mathiasb at mbsolutions.selfip.biz>
+Build-Depends:
+ debhelper (>= 7), python, python-all-dev, python-setuptools, python-support
+Standards-Version: 3.8.3
+Homepage: http://www.tryton.org/
+Vcs-Browser: http://git.debian-maintainers.org/?p=tryton/tryton-modules-calendar-todo.git
+Vcs-Git: git://git.debian-maintainers.org/git/tryton/tryton-modules-calendar-todo.git
+
+Package: tryton-modules-calendar-todo
+Architecture: all
+Depends:
+ ${misc:Depends}, ${python:Depends}, tryton-server, tryton-modules-calendar,
+ python-dateutil, python-tz, python-vobject, python-webdav,
+ python-pkg-resources
+XB-Python-Version: ${python:Versions}
+Description: Tryton Application Platform (Calendar Todo Module)
+ Tryton is a high-level general purpose application platform written in Python
+ and using PostgreSQL as database engine. It is the core base of a complete
+ business solution.
+ .
+ This module adds Todo support on CalDAV.
diff --git a/debian/copyright b/debian/copyright
new file mode 100644
index 0000000..2eed23b
--- /dev/null
+++ b/debian/copyright
@@ -0,0 +1,45 @@
+Upstream-Contact: Tryton project <tryton at googlegroups.com>
+Upstream-Homepage: http://downloads.tryton.org/
+Maintainer-Contact: Debian Tryton Maintainers <tryton at lists.debian-maintainers.org>
+Maintainer-Homepage: http://tryton.debian-maintainers.org/
+
+Files: *
+Copyright:
+ (C) 2009 Cedric Krier
+ (C) 2009 Bertrand Chenal
+ (C) 2009 B2CK SPRL
+License: GPL-3+
+ 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/>.
+ .
+ On Debian systems, the complete text of the GNU General Public License
+ can be found in /usr/share/common-licenses/GPL-3 file.
+
+Files: debian/*
+Copyright: (C) 2009 Daniel Baumann <daniel at debian.org>
+License: GPL-3+
+ 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/>.
+ .
+ On Debian systems, the complete text of the GNU General Public License
+ can be found in /usr/share/common-licenses/GPL-3 file.
diff --git a/debian/pycompat b/debian/pycompat
new file mode 100644
index 0000000..0cfbf08
--- /dev/null
+++ b/debian/pycompat
@@ -0,0 +1 @@
+2
diff --git a/debian/pyversions b/debian/pyversions
new file mode 100644
index 0000000..b3dc41e
--- /dev/null
+++ b/debian/pyversions
@@ -0,0 +1 @@
+2.5-
diff --git a/debian/rules b/debian/rules
new file mode 100755
index 0000000..000210b
--- /dev/null
+++ b/debian/rules
@@ -0,0 +1,4 @@
+#!/usr/bin/make -f
+
+%:
+	dh ${@}
diff --git a/es_CO.csv b/es_CO.csv
new file mode 100644
index 0000000..554124d
--- /dev/null
+++ b/es_CO.csv
@@ -0,0 +1,89 @@
+type,name,res_id,src,value,fuzzy
+error,calendar.todo,0,Recurrence can not be recurrent!,¡La repetición no puede repetirse!,0
+error,calendar.todo,0,UUID and recurrence must be unique in a calendar!,¡El UUID y la recurrencia deben ser únicos por calendario! ,0
+field,"calendar.todo.alarm,calendar_alarm",0,Calendar Alarm,,0
+field,"calendar.todo.alarm,rec_name",0,Name,Nombre,0
+field,"calendar.todo,alarms",0,Alarms,Alarmas,0
+field,"calendar.todo.alarm,todo",0,Todo,,0
+field,"calendar.todo.attendee,calendar_attendee",0,Calendar Attendee,,0
+field,"calendar.todo.attendee,rec_name",0,Name,Nombre,0
+field,"calendar.todo,attendees",0,Attendees,Asistentes,0
+field,"calendar.todo.attendee,todo",0,Todo,,0
+field,"calendar.todo,calendar",0,Calendar,Calendario,0
+field,"calendar.todo-calendar.category,category",0,Category,Categoría,0
+field,"calendar.todo-calendar.category,rec_name",0,Name,Nombre,0
+field,"calendar.todo-calendar.category,todo",0,To-Do,,0
+field,"calendar.todo,calendar_owner",0,Owner,Propietario,0
+field,"calendar.todo,calendar_read_users",0,Read Users,Leer Usuarios,0
+field,"calendar.todo,calendar_write_users",0,Write Users,Escribir Usuarios,0
+field,"calendar.todo,categories",0,Categories,Categorías,0
+field,"calendar.todo,classification",0,Classification,Clasificación,0
+field,"calendar.todo,classification_public",0,Classification Public,Clasificación Pública,0
+field,"calendar.todo,completed",0,Completed,,0
+field,"calendar.todo,description",0,Description,Descripción,0
+field,"calendar.todo,dtstart",0,Start Date,Fecha Inicio,0
+field,"calendar.todo,due",0,Due Date,,0
+field,"calendar.todo.exdate,calendar_rdate",0,Calendar RDate,,0
+field,"calendar.todo.exdate,rec_name",0,Name,Nombre,0
+field,"calendar.todo,exdates",0,Exception Dates,Fechas de Excepción,0
+field,"calendar.todo.exdate,todo",0,Todo,,0
+field,"calendar.todo.exrule,calendar_rrule",0,Calendar RRule,,0
+field,"calendar.todo.exrule,rec_name",0,Name,Nombre,0
+field,"calendar.todo,exrules",0,Exception Rules,Reglas de Excepción,0
+field,"calendar.todo.exrule,todo",0,Todo,,0
+field,"calendar.todo,location",0,Location,Lugar,0
+field,"calendar.todo,organizer",0,Organizer,Organizador,0
+field,"calendar.todo,parent",0,Parent,Padre,0
+field,"calendar.todo,percent_complete",0,Percent complete,,0
+field,"calendar.todo.rdate,calendar_rdate",0,Calendar RDate,,0
+field,"calendar.todo.rdate,rec_name",0,Name,Nombre,0
+field,"calendar.todo,rdates",0,Recurrence Dates,Fechas de Repetición,0
+field,"calendar.todo.rdate,todo",0,Todo,,0
+field,"calendar.todo,rec_name",0,Name,Nombre,0
+field,"calendar.todo,recurrence",0,Recurrence,Repetición,0
+field,"calendar.todo,recurrences",0,Recurrences,Repeticiones,0
+field,"calendar.todo.rrule,calendar_rrule",0,Calendar RRule,,0
+field,"calendar.todo.rrule,rec_name",0,Name,Nombre,0
+field,"calendar.todo,rrules",0,Recurrence Rules,Reglas de Repetición,0
+field,"calendar.todo.rrule,todo",0,Todo,,0
+field,"calendar.todo,sequence",0,Sequence,Secuencia,0
+field,"calendar.todo,status",0,Status,Estado,0
+field,"calendar.todo,summary",0,Summary,Resumen,0
+field,"calendar.todo,timezone",0,Timezone,Zona horaria,0
+field,"calendar.todo,uuid",0,UUID,UUID,0
+field,"calendar.todo,vtodo",0,vtodo,,0
+help,"calendar.todo,uuid",0,Universally Unique Identifier,Identificador Único Universal,0
+model,"calendar.todo.alarm,name",0,Alarm,Alarma,0
+model,"calendar.todo.attendee,name",0,Attendee,Asistente,0
+model,"calendar.todo-calendar.category,name",0,Todo - Category,,0
+model,"calendar.todo.exdate,name",0,Exception Date,Fecha de Excepción,0
+model,"calendar.todo.exrule,name",0,Exception Rule,Regla de Excepción,0
+model,"calendar.todo,name",0,Todo,,0
+model,"calendar.todo.rdate,name",0,Recurrence Date,Fecha de Repetición,0
+model,"calendar.todo.rrule,name",0,Recurrence Rule,Regla de Repetición,0
+model,"ir.action,name",act_todo_form,Todos,,0
+model,"ir.ui.menu,name",menu_todo_form,Todos,,0
+selection,"calendar.todo,classification",0,Confidential,Confidencial,0
+selection,"calendar.todo,classification",0,Private,Privado,0
+selection,"calendar.todo,classification",0,Public,Público,0
+selection,"calendar.todo,status",0,,,0
+selection,"calendar.todo,status",0,Cancelled,Cancelado,0
+selection,"calendar.todo,status",0,Completed,,0
+selection,"calendar.todo,status",0,In-Process,,0
+selection,"calendar.todo,status",0,Needs-Action,,0
+view,calendar.todo,0,Attendees,Asistentes,0
+view,calendar.todo,0,Categories,Categorías,0
+view,calendar.todo,0,General,General,0
+view,calendar.todo,0,Recurrences,Repeticiones,0
+view,calendar.todo,0,Todo,,0
+view,calendar.todo,0,Todos,,0
+view,calendar.todo.attendee,0,Attendee,Asistente,0
+view,calendar.todo.attendee,0,Attendees,Asistentes,0
+view,calendar.todo.exdate,0,Exception Date,Fecha de Excepción,0
+view,calendar.todo.exdate,0,Exception Dates,Fechas de Excepción,0
+view,calendar.todo.exrule,0,Exception Rule,Regla de Excepción,0
+view,calendar.todo.exrule,0,Exception Rules,Reglas de Excepción,0
+view,calendar.todo.rdate,0,Recurrence Date,Fecha de Repetición,0
+view,calendar.todo.rdate,0,Recurrence Dates,Fechas de Repetición,0
+view,calendar.todo.rrule,0,Recurrence Rule,Regla de Repetición,0
+view,calendar.todo.rrule,0,Recurrence Rules,Reglas de Repetición,0
diff --git a/es_ES.csv b/es_ES.csv
new file mode 100644
index 0000000..5c5af3b
--- /dev/null
+++ b/es_ES.csv
@@ -0,0 +1,89 @@
+type,name,res_id,src,value,fuzzy
+error,calendar.todo,0,Recurrence can not be recurrent!,Una recurrencia no puede ser recurrente,0
+error,calendar.todo,0,UUID and recurrence must be unique in a calendar!,UUID y recurrencia deben ser únicos en un calendario,0
+field,"calendar.todo.alarm,calendar_alarm",0,Calendar Alarm,Alarma del calendario,0
+field,"calendar.todo.alarm,rec_name",0,Name,Nombre,0
+field,"calendar.todo,alarms",0,Alarms,Alarmas,0
+field,"calendar.todo.alarm,todo",0,Todo,Tarea,0
+field,"calendar.todo.attendee,calendar_attendee",0,Calendar Attendee,Calendario de asistentes,0
+field,"calendar.todo.attendee,rec_name",0,Name,Nombre,0
+field,"calendar.todo,attendees",0,Attendees,Asistentes,0
+field,"calendar.todo.attendee,todo",0,Todo,Tarea,0
+field,"calendar.todo,calendar",0,Calendar,Calendario,0
+field,"calendar.todo-calendar.category,category",0,Category,Categoría,0
+field,"calendar.todo-calendar.category,rec_name",0,Name,Nombre,0
+field,"calendar.todo-calendar.category,todo",0,To-Do,Por hacer,0
+field,"calendar.todo,calendar_owner",0,Owner,Dueño,0
+field,"calendar.todo,calendar_read_users",0,Read Users,Usuarios con lectura,0
+field,"calendar.todo,calendar_write_users",0,Write Users,Usuarios con escritura,0
+field,"calendar.todo,categories",0,Categories,Categorías,0
+field,"calendar.todo,classification",0,Classification,Clasificación,0
+field,"calendar.todo,classification_public",0,Classification Public,Clasificación pública,0
+field,"calendar.todo,completed",0,Completed,Completada,0
+field,"calendar.todo,description",0,Description,Descripción,0
+field,"calendar.todo,dtstart",0,Start Date,Fecha inicio,0
+field,"calendar.todo,due",0,Due Date,Fecha de vencimiento,0
+field,"calendar.todo.exdate,calendar_rdate",0,Calendar RDate,Fecha de recurrencia,0
+field,"calendar.todo.exdate,rec_name",0,Name,Nombre,0
+field,"calendar.todo,exdates",0,Exception Dates,Fechas excluidas,0
+field,"calendar.todo.exdate,todo",0,Todo,Tarea,0
+field,"calendar.todo.exrule,calendar_rrule",0,Calendar RRule,Regla de recurrencia,0
+field,"calendar.todo.exrule,rec_name",0,Name,Nombre,0
+field,"calendar.todo,exrules",0,Exception Rules,Reglas de excepciones,0
+field,"calendar.todo.exrule,todo",0,Todo,Tarea,0
+field,"calendar.todo,location",0,Location,Ubicación,0
+field,"calendar.todo,organizer",0,Organizer,Organizador,0
+field,"calendar.todo,parent",0,Parent,Padre,0
+field,"calendar.todo,percent_complete",0,Percent complete,Porcentaje total,0
+field,"calendar.todo.rdate,calendar_rdate",0,Calendar RDate,Fecha de recurrencia,0
+field,"calendar.todo.rdate,rec_name",0,Name,Nombre,0
+field,"calendar.todo,rdates",0,Recurrence Dates,Fechas de recurrencia,0
+field,"calendar.todo.rdate,todo",0,Todo,Tarea,0
+field,"calendar.todo,rec_name",0,Name,Nombre,0
+field,"calendar.todo,recurrence",0,Recurrence,Recurrencia,0
+field,"calendar.todo,recurrences",0,Recurrences,Recurrencias,0
+field,"calendar.todo.rrule,calendar_rrule",0,Calendar RRule,Regla de recurrencia,0
+field,"calendar.todo.rrule,rec_name",0,Name,Nombre,0
+field,"calendar.todo,rrules",0,Recurrence Rules,Reglas de recurrencia,0
+field,"calendar.todo.rrule,todo",0,Todo,Tarea,0
+field,"calendar.todo,sequence",0,Sequence,Secuencia,0
+field,"calendar.todo,status",0,Status,Estado,0
+field,"calendar.todo,summary",0,Summary,Resumen,0
+field,"calendar.todo,timezone",0,Timezone,Zona horaria,0
+field,"calendar.todo,uuid",0,UUID,UUID,0
+field,"calendar.todo,vtodo",0,vtodo,vtodo,0
+help,"calendar.todo,uuid",0,Universally Unique Identifier,Identificador universal único,0
+model,"calendar.todo.alarm,name",0,Alarm,Alarma,0
+model,"calendar.todo.attendee,name",0,Attendee,Asistentes,0
+model,"calendar.todo-calendar.category,name",0,Todo - Category,Tarea - Categoría,0
+model,"calendar.todo.exdate,name",0,Exception Date,Fecha excluida,0
+model,"calendar.todo.exrule,name",0,Exception Rule,Regla de excepción,0
+model,"calendar.todo,name",0,Todo,Tarea,0
+model,"calendar.todo.rdate,name",0,Recurrence Date,Fecha de recurrencia,0
+model,"calendar.todo.rrule,name",0,Recurrence Rule,Regla de recurrencia,0
+model,"ir.action,name",act_todo_form,Todos,Tareas,0
+model,"ir.ui.menu,name",menu_todo_form,Todos,Tareas,0
+selection,"calendar.todo,classification",0,Confidential,Confidencial,0
+selection,"calendar.todo,classification",0,Private,Privado,0
+selection,"calendar.todo,classification",0,Public,Público,0
+selection,"calendar.todo,status",0,,,0
+selection,"calendar.todo,status",0,Cancelled,Cancelada,0
+selection,"calendar.todo,status",0,Completed,Completado,0
+selection,"calendar.todo,status",0,In-Process,En proceso,0
+selection,"calendar.todo,status",0,Needs-Action,Necesita una acción,0
+view,calendar.todo,0,Attendees,Asistentes,0
+view,calendar.todo,0,Categories,Categorías,0
+view,calendar.todo,0,General,General,0
+view,calendar.todo,0,Recurrences,Recurrencias,0
+view,calendar.todo,0,Todo,Tarea,0
+view,calendar.todo,0,Todos,Tareas,0
+view,calendar.todo.attendee,0,Attendee,Asistentes,0
+view,calendar.todo.attendee,0,Attendees,Asistentes,0
+view,calendar.todo.exdate,0,Exception Date,Fecha excluida,0
+view,calendar.todo.exdate,0,Exception Dates,Fechas excluidas,0
+view,calendar.todo.exrule,0,Exception Rule,Regla de excepción,0
+view,calendar.todo.exrule,0,Exception Rules,Reglas de excepciones,0
+view,calendar.todo.rdate,0,Recurrence Date,Fecha de recurrencia,0
+view,calendar.todo.rdate,0,Recurrence Dates,Fechas de recurrencia,0
+view,calendar.todo.rrule,0,Recurrence Rule,Regla de recurrencia,0
+view,calendar.todo.rrule,0,Recurrence Rules,Reglas de recurrencia,0
diff --git a/fr_FR.csv b/fr_FR.csv
new file mode 100644
index 0000000..e2d1eee
--- /dev/null
+++ b/fr_FR.csv
@@ -0,0 +1,89 @@
+type,name,res_id,src,value,fuzzy
+error,calendar.todo,0,Recurrence can not be recurrent!,Une récurrence ne peut pas être récurrente !,0
+error,calendar.todo,0,UUID and recurrence must be unique in a calendar!,UUID et récurrence doivent être uniques sur un calendrier !,0
+field,"calendar.todo.alarm,calendar_alarm",0,Calendar Alarm,Alarme calendrier,0
+field,"calendar.todo.alarm,rec_name",0,Name,Nom,0
+field,"calendar.todo,alarms",0,Alarms,Alarmes,0
+field,"calendar.todo.alarm,todo",0,Todo,Tâche,0
+field,"calendar.todo.attendee,calendar_attendee",0,Calendar Attendee,Participant calendrier,0
+field,"calendar.todo.attendee,rec_name",0,Name,Nom,0
+field,"calendar.todo,attendees",0,Attendees,Participants,0
+field,"calendar.todo.attendee,todo",0,Todo,Tâche,0
+field,"calendar.todo,calendar",0,Calendar,Calendrier,0
+field,"calendar.todo-calendar.category,category",0,Category,Catégorie,0
+field,"calendar.todo-calendar.category,rec_name",0,Name,Nom,0
+field,"calendar.todo-calendar.category,todo",0,To-Do,Tâche,0
+field,"calendar.todo,calendar_owner",0,Owner,Propriétaire,0
+field,"calendar.todo,calendar_read_users",0,Read Users,Utilisateurs en lecture,0
+field,"calendar.todo,calendar_write_users",0,Write Users,Utilisateurs en écriture,0
+field,"calendar.todo,categories",0,Categories,Catégories,0
+field,"calendar.todo,classification",0,Classification,Classification,0
+field,"calendar.todo,classification_public",0,Classification Public,Classification publique,0
+field,"calendar.todo,completed",0,Completed,Complété,0
+field,"calendar.todo,description",0,Description,Description,0
+field,"calendar.todo,dtstart",0,Start Date,Date de début,0
+field,"calendar.todo,due",0,Due Date,Date d'échéance,0
+field,"calendar.todo.exdate,calendar_rdate",0,Calendar RDate,Date de récurrence,0
+field,"calendar.todo.exdate,rec_name",0,Name,Nom,0
+field,"calendar.todo,exdates",0,Exception Dates,Dates d'exception,0
+field,"calendar.todo.exdate,todo",0,Todo,Tâche,0
+field,"calendar.todo.exrule,calendar_rrule",0,Calendar RRule,Règle de récurrence,0
+field,"calendar.todo.exrule,rec_name",0,Name,Nom,0
+field,"calendar.todo,exrules",0,Exception Rules,Règles d'exception,0
+field,"calendar.todo.exrule,todo",0,Todo,Tâche,0
+field,"calendar.todo,location",0,Location,Emplacement,0
+field,"calendar.todo,organizer",0,Organizer,Organisateur,0
+field,"calendar.todo,parent",0,Parent,Parent,0
+field,"calendar.todo,percent_complete",0,Percent complete,Pourcentage effectué,0
+field,"calendar.todo.rdate,calendar_rdate",0,Calendar RDate,Date de récurrence,0
+field,"calendar.todo.rdate,rec_name",0,Name,Nom,0
+field,"calendar.todo,rdates",0,Recurrence Dates,Dates de récurrence,0
+field,"calendar.todo.rdate,todo",0,Todo,Tâche,0
+field,"calendar.todo,rec_name",0,Name,Nom,0
+field,"calendar.todo,recurrence",0,Recurrence,Récurrence,0
+field,"calendar.todo,recurrences",0,Recurrences,Récurrences,0
+field,"calendar.todo.rrule,calendar_rrule",0,Calendar RRule,Règle de récurrence,0
+field,"calendar.todo.rrule,rec_name",0,Name,Nom,0
+field,"calendar.todo,rrules",0,Recurrence Rules,Règles de récurrence,0
+field,"calendar.todo.rrule,todo",0,Todo,Tâche,0
+field,"calendar.todo,sequence",0,Sequence,Séquence,0
+field,"calendar.todo,status",0,Status,Statut,0
+field,"calendar.todo,summary",0,Summary,Résumé,0
+field,"calendar.todo,timezone",0,Timezone,Fuseau Horaire,0
+field,"calendar.todo,uuid",0,UUID,UUID,0
+field,"calendar.todo,vtodo",0,vtodo,vtodo,0
+help,"calendar.todo,uuid",0,Universally Unique Identifier,Identificateur unique universel,0
+model,"calendar.todo.alarm,name",0,Alarm,Alarme,0
+model,"calendar.todo.attendee,name",0,Attendee,Participant,0
+model,"calendar.todo-calendar.category,name",0,Todo - Category,Todo - Catégorie,0
+model,"calendar.todo.exdate,name",0,Exception Date,Date d'exception,0
+model,"calendar.todo.exrule,name",0,Exception Rule,Règle d'exception,0
+model,"calendar.todo,name",0,Todo,Tâche,0
+model,"calendar.todo.rdate,name",0,Recurrence Date,Date de récurrence,0
+model,"calendar.todo.rrule,name",0,Recurrence Rule,Règle de récurrence,0
+model,"ir.action,name",act_todo_form,Todos,Tâches,0
+model,"ir.ui.menu,name",menu_todo_form,Todos,Tâches,0
+selection,"calendar.todo,classification",0,Confidential,Confidentiel,0
+selection,"calendar.todo,classification",0,Private,Privé,0
+selection,"calendar.todo,classification",0,Public,Publique,0
+selection,"calendar.todo,status",0,,,0
+selection,"calendar.todo,status",0,Cancelled,Annulé,0
+selection,"calendar.todo,status",0,Completed,Complété,0
+selection,"calendar.todo,status",0,In-Process,En court,0
+selection,"calendar.todo,status",0,Needs-Action,Nécessite une action,0
+view,calendar.todo,0,Attendees,Participants,0
+view,calendar.todo,0,Categories,Catégories,0
+view,calendar.todo,0,General,Général,0
+view,calendar.todo,0,Recurrences,Récurrences,0
+view,calendar.todo,0,Todo,Tâche,0
+view,calendar.todo,0,Todos,Tâches,0
+view,calendar.todo.attendee,0,Attendee,Participant,0
+view,calendar.todo.attendee,0,Attendees,Participants,0
+view,calendar.todo.exdate,0,Exception Date,Date d'exception,0
+view,calendar.todo.exdate,0,Exception Dates,Dates d'exception,0
+view,calendar.todo.exrule,0,Exception Rule,Règle d'exception,0
+view,calendar.todo.exrule,0,Exception Rules,Règles d'exception,0
+view,calendar.todo.rdate,0,Recurrence Date,Date de récurrence,0
+view,calendar.todo.rdate,0,Recurrence Dates,Dates de récurrence,0
+view,calendar.todo.rrule,0,Recurrence Rule,Règle de récurrence,0
+view,calendar.todo.rrule,0,Recurrence Rules,Règles de récurrence,0
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..94e80dc
--- /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_todo',
+    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_todo': '.'},
+    packages=[
+        'trytond.modules.calendar_todo',
+    ],
+    package_data={
+        'trytond.modules.calendar_todo': 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_todo = trytond.modules.calendar_todo
+    """,
+)
diff --git a/tests/__init__.py b/tests/__init__.py
new file mode 100644
index 0000000..ce85354
--- /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_todo import *
diff --git a/tests/test_calendar_todo.py b/tests/test_calendar_todo.py
new file mode 100644
index 0000000..d9661c5
--- /dev/null
+++ b/tests/test_calendar_todo.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 CalendarTodoTestCase(unittest.TestCase):
+    '''
+    Test Calendar Todo module.
+    '''
+
+    def setUp(self):
+        trytond.tests.test_tryton.install_module('calendar_todo')
+
+    def test0005views(self):
+        '''
+        Test views.
+        '''
+        self.assertRaises(Exception, test_view('calendar_todo'))
+
+def suite():
+    return unittest.TestLoader().loadTestsFromTestCase(CalendarTodoTestCase)
+
+if __name__ == '__main__':
+    suiteTrytond = trytond.tests.test_tryton.suite()
+    suiteCalendarTodo = suite()
+    alltests = unittest.TestSuite([suiteTrytond, suiteCalendarTodo])
+    unittest.TextTestRunner(verbosity=2).run(alltests)
+    SOCK.disconnect()
diff --git a/todo.py b/todo.py
new file mode 100644
index 0000000..566ec9a
--- /dev/null
+++ b/todo.py
@@ -0,0 +1,1214 @@
+#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 Todo(ModelSQL, ModelView):
+    "Todo"
+    _description = __doc__
+    _name = 'calendar.todo'
+    _rec_name = 'uuid'
+
+    calendar = fields.Many2One('calendar.calendar', 'Calendar',
+            required=True, select=1)
+    alarms = fields.One2Many('calendar.todo.alarm', 'todo', 'Alarms')
+    classification = fields.Selection([
+        ('public', 'Public'),
+        ('private', 'Private'),
+        ('confidential', 'Confidential'),
+        ], 'Classification', required=True)
+    completed = fields.DateTime('Completed',
+            states={
+                'readonly': "(status != 'completed')",
+            }, depends=['status'])
+    description = fields.Text('Description')
+    dtstart = fields.DateTime('Start Date', select=1)
+    location = fields.Many2One('calendar.location', 'Location')
+    organizer = fields.Char('Organizer', states={
+        'required': "bool(attendees) and not bool(parent)",
+        }, depends=['attendees', 'parent'])
+    attendees = fields.One2Many('calendar.todo.attendee', 'todo',
+            'Attendees')
+    percent_complete = fields.Integer('Percent complete',
+            states={
+                'readonly': "(status not in ('needs-action', 'in-process'))",
+            }, depends=['status'])
+    recurrences = fields.One2Many('calendar.todo', 'parent', 'Recurrences',
+            domain=["('uuid', '=', uuid)",
+                "('calendar', '=', calendar)"],
+            states={
+                'invisible': "bool(parent)",
+            }, depends=['uuid', 'calendar', 'parent'])
+    recurrence = fields.DateTime('Recurrence', select=1, states={
+                'invisible': "not bool(parent)",
+                }, depends=['parent'])
+    sequence = fields.Integer('Sequence')
+    parent = fields.Many2One('calendar.todo', 'Parent',
+            domain=["('uuid', '=', uuid)",
+                "('parent', '=', False)",
+                "('calendar', '=', calendar)"],
+            ondelete='CASCADE', depends=['uuid', 'calendar'])
+    timezone = fields.Selection('timezones', 'Timezone')
+    status = fields.Selection([
+        ('', ''),
+        ('needs-action', 'Needs-Action'),
+        ('completed', 'Completed'),
+        ('in-process', 'In-Process'),
+        ('cancelled', 'Cancelled'),
+        ], 'Status', on_change=['status', 'completed', 'percent_complete'])
+    summary = fields.Char('Summary')
+    uuid = fields.Char('UUID', required=True,
+            help='Universally Unique Identifier', select=1)
+    due = fields.DateTime('Due Date', select=1)
+    categories = fields.Many2Many('calendar.todo-calendar.category',
+            'todo', 'category', 'Categories')
+    exdates = fields.One2Many('calendar.todo.exdate', 'todo', 'Exception Dates',
+            states={
+                'invisible': "bool(parent)",
+            }, depends=['parent'])
+    exrules = fields.One2Many('calendar.todo.exrule', 'todo', 'Exception Rules',
+            states={
+                'invisible': "bool(parent)",
+            }, depends=['parent'])
+    rdates = fields.One2Many('calendar.todo.rdate', 'todo', 'Recurrence Dates',
+            states={
+                'invisible': "bool(parent)",
+            }, depends=['parent'])
+    rrules = fields.One2Many('calendar.todo.rrule', 'todo', 'Recurrence Rules',
+            states={
+                'invisible': "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')
+    vtodo = fields.Binary('vtodo')
+
+    def __init__(self):
+        super(Todo, self).__init__()
+        self._sql_constraints = [
+            ('uuid_recurrence_uniq', 'UNIQUE(uuid, calendar, recurrence)',
+                'UUID and recurrence must be unique in a calendar!'), #XXX should be unique across all componenets
+        ]
+        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_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 on_change_status(self, cursor, user, ids, vals, context=None):
+        res = {}
+        if 'status' not in vals:
+            return res
+        if vals['status'] == 'completed':
+            res['percent_complete'] = 100
+            if not vals.get('completed'):
+                res['completed'] = datetime.datetime.now()
+
+        return res
+
+    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 todo in self.browse(cursor, user, ids, context=context):
+            name = name[9:]
+            if name in ('read_users', 'write_users'):
+                res[todo.id] = [x.id for x in todo.calendar[name]]
+            else:
+                res[todo.id] = todo.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 todo in self.browse(cursor, user, ids, context=context):
+            res[todo.id] = False
+            if todo.classification == 'public':
+                res[todo.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 todo in self.browse(cursor, user, ids):
+            if not todo.parent:
+                continue
+            if todo.rdates \
+                    or todo.rrules \
+                    or todo.exdates \
+                    or todo.exrules \
+                    or todo.recurrences:
+                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(Todo, self).create(cursor, user, values, context=context)
+        todo = self.browse(cursor, user, res, context=context)
+        if todo.organizer == todo.calendar.owner.email \
+                or (todo.parent \
+                and todo.parent.organizer == todo.parent.calendar.owner.email):
+            if todo.organizer == todo.calendar.owner.email:
+                attendee_emails = [x.email for x in todo.attendees
+                        if x.status != 'declined']
+            else:
+                attendee_emails = [x.email for x in todo.parent.attendees
+                        if x.status != 'declined']
+            if attendee_emails:
+                calendar_ids = calendar_obj.search(cursor, 0, [
+                    ('owner.email', 'in', attendee_emails),
+                    ], context=context)
+                if not todo.recurrence:
+                    for calendar_id in calendar_ids:
+                        new_id = self.copy(cursor, 0, todo.id, default={
+                            'calendar': calendar_id,
+                            'recurrences': False,
+                            }, context=context)
+                        for recurrence in todo.recurrences:
+                            self.copy(cursor, 0, recurrence.id, default={
+                                'calendar': calendar_id,
+                                'parent': new_id,
+                                }, context=context)
+                else:
+                    parent_ids = self.search(cursor, 0, [
+                        ('uuid', '=', todo.uuid),
+                        ('calendar.owner.email', 'in', attendee_emails),
+                        ('id', '!=', todo.id),
+                        ('recurrence', '=', False),
+                        ], context=context)
+                    for parent in self.browse(cursor, 0, parent_ids,
+                            context=context):
+                        self.copy(cursor, 0, todo.id, default={
+                            'calendar': parent.calendar.id,
+                            'parent': parent.id,
+                            }, context=context)
+        # Restart the cache for todo
+        collection_obj.todo(cursor.dbname)
+        return res
+
+    def _todo2update(self, cursor, user, todo, context=None):
+        rdate_obj = self.pool.get('calendar.todo.rdate')
+        exdate_obj = self.pool.get('calendar.todo.exdate')
+        rrule_obj = self.pool.get('calendar.todo.rrule')
+        exrule_obj = self.pool.get('calendar.todo.exrule')
+
+        res = {}
+        res['summary'] = todo.summary
+        res['description'] = todo.description
+        res['dtstart'] = todo.dtstart
+        res['percent_complete'] = todo.percent_complete
+        res['completed'] = todo.completed
+        res['location'] = todo.location.id
+        res['status'] = todo.status
+        res['organizer'] = todo.organizer
+        res['rdates'] = [('delete_all',)]
+        for rdate in todo.rdates:
+            vals = rdate_obj._date2update(cursor, user, rdate, context=context)
+            res['rdates'].append(('create', vals))
+        res['exdates'] = [('delete_all',)]
+        for exdate in todo.exdates:
+            vals = exdate_obj._date2update(cursor, user, exdate, context=context)
+            res['exdates'].append(('create', vals))
+        res['rrules'] = [('delete_all',)]
+        for rrule in todo.rrules:
+            vals = rrule_obj._rule2update(cursor, user, rrule, context=context)
+            res['rrules'].append(('create', vals))
+        res['exrules'] = [('delete_all',)]
+        for exrule in todo.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(Todo, 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 todo in self.browse(cursor, user, ids, context=context):
+            if todo.organizer == todo.calendar.owner.email \
+                    or (todo.parent \
+                    and todo.parent.organizer == todo.calendar.owner.email):
+                if todo.organizer == todo.calendar.owner.email:
+                    attendee_emails = [x.email for x in todo.attendees
+                            if x.status != 'declined']
+                else:
+                    attendee_emails = [x.email for x in todo.parent.attendees
+                            if x.status != 'declined']
+                if attendee_emails:
+                    todo_ids = self.search(cursor, 0, [
+                        ('uuid', '=', todo.uuid),
+                        ('calendar.owner.email', 'in', attendee_emails),
+                        ('id', '!=', todo.id),
+                        ('recurrence', '=', todo.recurrence or False),
+                        ], context=context)
+                    for todo2 in self.browse(cursor, user, todo_ids,
+                            context=context):
+                        if todo2.calendar.owner.email in attendee_emails:
+                            attendee_emails.remove(todo2.calendar.owner.email)
+                    self.write(cursor, 0, todo_ids, self._todo2update(
+                        cursor, user, todo, context=context), context=context)
+                if attendee_emails:
+                    calendar_ids = calendar_obj.search(cursor, 0, [
+                        ('owner.email', 'in', attendee_emails),
+                        ], context=context)
+                    if not todo.recurrence:
+                        for calendar_id in calendar_ids:
+                            new_id = self.copy(cursor, 0, todo.id, default={
+                                'calendar': calendar_id,
+                                'recurrences': False,
+                                }, context=context)
+                            for recurrence in todo.recurrences:
+                                self.copy(cursor, 0, recurrence.id, default={
+                                    'calendar': calendar_id,
+                                    'parent': new_id,
+                                    }, context=context)
+                    else:
+                        parent_ids = self.search(cursor, 0, [
+                            ('uuid', '=', todo.uuid),
+                            ('calendar.owner.email', 'in', attendee_emails),
+                            ('id', '!=', todo.id),
+                            ('recurrence', '=', False),
+                            ], context=context)
+                        for parent in self.browse(cursor, 0, parent_ids,
+                                context=context):
+                            self.copy(cursor, 0, todo.id, default={
+                                'calendar': parent.calendar.id,
+                                'parent': parent.id,
+                                }, context=context)
+        # Restart the cache for todo
+        collection_obj.todo(cursor.dbname)
+        return res
+
+    def delete(self, cursor, user, ids, context=None):
+        attendee_obj = self.pool.get('calendar.todo.attendee')
+        collection_obj = self.pool.get('webdav.collection')
+
+        if isinstance(ids, (int, long)):
+            ids = [ids]
+        for todo in self.browse(cursor, user, ids, context=context):
+            if todo.organizer == todo.calendar.owner.email \
+                    or (todo.parent \
+                    and todo.parent.organizer == todo.calendar.owner.email):
+                if todo.organizer == todo.calendar.owner.email:
+                    attendee_emails = [x.email for x in todo.attendees]
+                else:
+                    attendee_emails = [x.email for x in todo.parent.attendees]
+                if attendee_emails:
+                    todo_ids = self.search(cursor, 0, [
+                        ('uuid', '=', todo.uuid),
+                        ('calendar.owner.email', 'in', attendee_emails),
+                        ('id', '!=', todo.id),
+                        ('recurrence', '=', todo.recurrence or False),
+                        ], context=context)
+                    self.delete(cursor, 0, todo_ids, context=context)
+            elif todo.organizer \
+                    or (todo.parent and todo.parent.organizer):
+                if todo.organizer:
+                    organizer = todo.organizer
+                else:
+                    organizer = todo.parent.organizer
+                todo_ids = self.search(cursor, 0, [
+                    ('uuid', '=', todo.uuid),
+                    ('calendar.owner.email', '=', organizer),
+                    ('id', '!=', todo.id),
+                    ('recurrence', '=', todo.recurrence or False),
+                    ], context=context, limit=1)
+                if todo_ids:
+                    todo2 = self.browse(cursor, 0, todo_ids[0],
+                            context=context)
+                    for attendee in todo2.attendees:
+                        if attendee.email == todo.calendar.owner.email:
+                            attendee_obj.write(cursor, 0, attendee.id, {
+                                'status': 'declined',
+                                }, context=context)
+        # Restart the cache for todo
+        collection_obj.todo(cursor.dbname)
+        return super(Todo, self).delete(cursor, user, ids, context=context)
+
+    def ical2values(self, cursor, user, todo_id, ical, calendar_id,
+            vtodo=None, context=None):
+        '''
+        Convert iCalendar to values for create or write
+
+        :param cursor: the database cursor
+        :param user: the user id
+        :param todo_id: the todo id for write or None for create
+        :param ical: a ical instance of vobject
+        :param calendar_id: the calendar id of the todo
+        :param vtodo: the vtodo 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.todo.alarm')
+        attendee_obj = self.pool.get('calendar.todo.attendee')
+        rdate_obj = self.pool.get('calendar.todo.rdate')
+        exdate_obj = self.pool.get('calendar.todo.exdate')
+        rrule_obj = self.pool.get('calendar.todo.rrule')
+        exrule_obj = self.pool.get('calendar.todo.exrule')
+
+        vtodos = []
+        if not vtodo:
+            vtodo = ical.vtodo
+
+            for i in ical.getChildren():
+                if i.name == 'VTODO' \
+                        and i != vtodo:
+                    vtodos.append(i)
+
+        todo = None
+        if todo_id:
+            todo = self.browse(cursor, user, todo_id, context=context)
+        res = {}
+        if not todo:
+            if hasattr(vtodo, 'uid'):
+                res['uuid'] = vtodo.uid.value
+            else:
+                res['uuid'] = str(uuid.uuid4())
+        if hasattr(vtodo, 'summary'):
+            res['summary'] = vtodo.summary.value
+        else:
+            res['summary'] = False
+        if hasattr(vtodo, 'description'):
+            res['description'] = vtodo.description.value
+        else:
+            res['description'] = False
+        if hasattr(vtodo, 'percent_complete'):
+            res['percent_complete'] = int(vtodo.percent_complete.value)
+        else:
+            res['percent_complete'] = False
+
+        if hasattr(vtodo, 'completed'):
+            if not isinstance(vtodo.completed.value, datetime.datetime):
+                res['completed'] = datetime.datetime.combine(vtodo.completed.value,
+                        datetime.time())
+            else:
+                if vtodo.completed.value.tzinfo:
+                    res['completed'] = vtodo.completed.value.astimezone(tzlocal)
+                else:
+                    res['completed'] = vtodo.completed.value
+
+        if hasattr(vtodo, 'dtstart'):
+            if not isinstance(vtodo.dtstart.value, datetime.datetime):
+                res['dtstart'] = datetime.datetime.combine(vtodo.dtstart.value,
+                        datetime.time())
+            else:
+                if vtodo.dtstart.value.tzinfo:
+                    res['dtstart'] = vtodo.dtstart.value.astimezone(tzlocal)
+                else:
+                    res['dtstart'] = vtodo.dtstart.value
+
+        if hasattr(vtodo, 'due'):
+            if not isinstance(vtodo.due.value, datetime.datetime):
+                res['due'] = datetime.datetime.combine(vtodo.due.value,
+                        datetime.time())
+            else:
+                if vtodo.due.value.tzinfo:
+                    res['due'] = vtodo.due.value.astimezone(tzlocal)
+                else:
+                    res['due'] = vtodo.due.value
+
+        if hasattr(vtodo, 'recurrence-id'):
+            if not isinstance(vtodo.recurrence_id.value, datetime.datetime):
+                res['recurrence'] = datetime.datetime.combine(
+                        vtodo.recurrence_id.value, datetime.time())
+            else:
+                if vtodo.recurrence_id.value.tzinfo:
+                    res['recurrence'] = \
+                            vtodo.recurrence_id.value.astimezone(tzlocal)
+                else:
+                    res['recurrence'] = vtodo.recurrence_id.value
+        else:
+            res['recurrence'] = False
+        if hasattr(vtodo, 'status'):
+            res['status'] = vtodo.status.value.lower()
+        else:
+            res['status'] = ''
+        if hasattr(vtodo, 'categories'):
+            category_ids = category_obj.search(cursor, user, [
+                ('name', 'in', [x for x in vtodo.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 vtodo.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(vtodo, 'class'):
+            if getattr(vtodo, 'class').value.lower() in \
+                    dict(self.classification.selection):
+                res['classification'] = getattr(vtodo, 'class').value.lower()
+            else:
+                res['classification'] = 'public'
+        else:
+            res['classification'] = 'public'
+        if hasattr(vtodo, 'location'):
+            location_ids = location_obj.search(cursor, user, [
+                ('name', '=', vtodo.location.value),
+                ], limit=1, context=context)
+            if not location_ids:
+                location_id = location_obj.create(cursor, user, {
+                    'name': vtodo.location.value,
+                    }, context=context)
+            else:
+                location_id = location_ids[0]
+            res['location'] = location_id
+        else:
+            res['location'] = False
+
+        res['calendar'] = calendar_id
+
+        if hasattr(vtodo, 'organizer'):
+            if vtodo.organizer.value.lower().startswith('mailto:'):
+                res['organizer'] = vtodo.organizer.value[7:]
+            else:
+                res['organizer'] = vtodo.organizer.value
+        else:
+            res['organizer'] = False
+
+        attendees_todel = {}
+        if todo:
+            for attendee in todo.attendees:
+                attendees_todel[attendee.email] = attendee.id
+        res['attendees'] = []
+        if hasattr(vtodo, 'attendee'):
+            while vtodo.attendee_list:
+                attendee = vtodo.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 todo:
+            res['rdates'].append(('delete', [x.id for x in todo.rdates]))
+        if hasattr(vtodo, 'rdate'):
+            while vtodo.rdate_list:
+                rdate = vtodo.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 todo:
+            res['exdates'].append(('delete', [x.id for x in todo.exdates]))
+        if hasattr(vtodo, 'exdate'):
+            while vtodo.exdate_list:
+                exdate = vtodo.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 todo:
+            res['rrules'].append(('delete', [x.id for x in todo.rrules]))
+        if hasattr(vtodo, 'rrule'):
+            while vtodo.rrule_list:
+                rrule = vtodo.rrule_list.pop()
+                vals = rrule_obj.rule2values(cursor, user, rrule,
+                        context=context)
+                res['rrules'].append(('create', vals))
+
+        res['exrules'] = []
+        if todo:
+            res['exrules'].append(('delete', [x.id for x in todo.exrules]))
+        if hasattr(vtodo, 'exrule'):
+            while vtodo.exrule_list:
+                exrule = vtodo.exrule_list.pop()
+                vals = exrule_obj.rule2values(cursor, user, exrule,
+                        context=context)
+                res['exrules'].append(('create', vals))
+
+        if todo:
+            res.setdefault('alarms', [])
+            res['alarms'].append(('delete', [x.id for x in todo.alarms]))
+        if hasattr(vtodo, 'valarm'):
+            res.setdefault('alarms', [])
+            while vtodo.valarm_list:
+                valarm = vtodo.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['vtodo'] = vtodo.serialize()
+
+        recurrences_todel = []
+        if todo:
+            recurrences_todel = [x.id for x in todo.recurrences]
+        for vtodo in vtodos:
+            todo_id = None
+            if todo:
+                for recurrence in todo.recurrences:
+                    if recurrence.recurrence.replace(tzinfo=tzlocal) \
+                            == vtodo.recurrence_id.value:
+                        todo_id = recurrence.id
+                        recurrences_todel.remove(recurrence.id)
+            vals = self.ical2values(cursor, user, todo_id, ical,
+                    calendar_id, vtodo=vtodo, context=context)
+            if todo:
+                vals['uuid'] = todo.uuid
+            else:
+                vals['uuid'] = res['uuid']
+            res.setdefault('recurrences', [])
+            if todo_id:
+                res['recurrences'].append(('write', todo_id, vals))
+            else:
+                res['recurrences'].append(('create', vals))
+        if recurrences_todel:
+            res.setdefault('recurrences', [])
+            res['recurrences'].append(('delete', recurrences_todel))
+        return res
+
+    def todo2ical(self, cursor, user, todo, context=None):
+        '''
+        Return an iCalendar instance of vobject for todo
+
+        :param cursor: the database cursor
+        :param user: the user id
+        :param todo: a BrowseRecord of calendar.todo
+            or a calendar.todo 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.todo.alarm')
+        attendee_obj = self.pool.get('calendar.todo.attendee')
+        rdate_obj = self.pool.get('calendar.todo.rdate')
+        exdate_obj = self.pool.get('calendar.todo.exdate')
+        rrule_obj = self.pool.get('calendar.todo.rrule')
+        exrule_obj = self.pool.get('calendar.todo.exrule')
+
+        if isinstance(todo, (int, long)):
+            todo = self.browse(cursor, user, todo, context=context)
+
+        user_ = user_obj.browse(cursor, user, user, context=context)
+        if todo.timezone:
+            tztodo = pytz.timezone(todo.timezone)
+        elif user_.timezone:
+                tztodo = pytz.timezone(user_.timezone)
+        else:
+            tztodo = tzlocal
+
+        ical = vobject.iCalendar()
+        vtodo = ical.add('vtodo')
+        if todo.vtodo:
+            ical.vtodo = vobject.readOne(todo.vtodo)
+            vtodo = ical.vtodo
+            ical.vtodo.transformToNative()
+        if todo.summary:
+            if not hasattr(vtodo, 'summary'):
+                vtodo.add('summary')
+            vtodo.summary.value = todo.summary
+        elif hasattr(vtodo, 'summary'):
+            del vtodo.summary
+        if todo.percent_complete:
+            if not hasattr(vtodo, 'percent-complete'):
+                vtodo.add('percent-complete')
+            vtodo.percent_complete.value = str(todo.percent_complete)
+        elif hasattr(vtodo, 'percent_complete'):
+            del vtodo.percent_complete
+        if todo.description:
+            if not hasattr(vtodo, 'description'):
+                vtodo.add('description')
+            vtodo.description.value = todo.description
+        elif hasattr(vtodo, 'description'):
+            del vtodo.description
+
+        if todo.completed:
+            if not hasattr(vtodo, 'completed'):
+                vtodo.add('completed')
+            vtodo.completed.value = todo.completed.replace(tzinfo=tzlocal)\
+                    .astimezone(tzutc)
+        elif hasattr(vtodo, 'completed'):
+            del vtodo.completed
+
+        if todo.dtstart:
+            if not hasattr(vtodo, 'dtstart'):
+                vtodo.add('dtstart')
+            vtodo.dtstart.value = todo.dtstart.replace(tzinfo=tzlocal)\
+                    .astimezone(tztodo)
+        elif hasattr(vtodo, 'dtstart'):
+            del vtodo.dtstart
+
+        if todo.due:
+            if not hasattr(vtodo, 'due'):
+                vtodo.add('due')
+            vtodo.due.value = todo.due.replace(tzinfo=tzlocal)\
+                    .astimezone(tztodo)
+        elif hasattr(vtodo, 'due'):
+            del vtodo.due
+
+
+        if not hasattr(vtodo, 'created'):
+            vtodo.add('created')
+        vtodo.created.value = todo.create_date.replace(tzinfo=tzlocal).astimezone(tztodo)
+        if not hasattr(vtodo, 'dtstamp'):
+            vtodo.add('dtstamp')
+        date = todo.write_date or todo.create_date
+        vtodo.dtstamp.value = date.replace(tzinfo=tzlocal).astimezone(tztodo)
+        if not hasattr(vtodo, 'last-modified'):
+            vtodo.add('last-modified')
+        vtodo.last_modified.value = date.replace(tzinfo=tzlocal).astimezone(tztodo)
+        if todo.recurrence:
+            if not hasattr(vtodo, 'recurrence-id'):
+                vtodo.add('recurrence-id')
+            if todo.all_day:
+                vtodo.recurrence_id.value = todo.recurrence.date()
+            else:
+                vtodo.recurrence_id.value = todo.recurrence\
+                        .replace(tzinfo=tzlocal).astimezone(tztodo)
+        if todo.status:
+            if not hasattr(vtodo, 'status'):
+                vtodo.add('status')
+            vtodo.status.value = todo.status.upper()
+        elif hasattr(vtodo, 'status'):
+            del vtodo.status
+        if not hasattr(vtodo, 'uid'):
+            vtodo.add('uid')
+        vtodo.uid.value = todo.uuid
+        if not hasattr(vtodo, 'sequence'):
+            vtodo.add('sequence')
+        vtodo.sequence.value = str(todo.sequence) or '0'
+        if todo.categories:
+            if not hasattr(vtodo, 'categories'):
+                vtodo.add('categories')
+            vtodo.categories.value = [x.name for x in todo.categories]
+        elif hasattr(vtodo, 'categories'):
+            del vtodo.categories
+        if not hasattr(vtodo, 'class'):
+            vtodo.add('class')
+            getattr(vtodo, 'class').value = todo.classification.upper()
+        elif getattr(vtodo, 'class').value.lower() in \
+                dict(self.classification.selection):
+            getattr(vtodo, 'class').value = todo.classification.upper()
+        if todo.location:
+            if not hasattr(vtodo, 'location'):
+                vtodo.add('location')
+            vtodo.location.value = todo.location.name
+        elif hasattr(vtodo, 'location'):
+            del vtodo.location
+
+        if todo.organizer:
+            if not hasattr(vtodo, 'organizer'):
+                vtodo.add('organizer')
+            vtodo.organizer.value = 'MAILTO:' + todo.organizer
+        elif hasattr(vtodo, 'organizer'):
+            del vtodo.organizer
+
+        vtodo.attendee_list = []
+        for attendee in todo.attendees:
+            vtodo.attendee_list.append(attendee_obj.attendee2attendee(
+                cursor, user, attendee, context=context))
+
+        if todo.rdates:
+            vtodo.add('rdate')
+            vtodo.rdate.value = []
+            for rdate in todo.rdates:
+                vtodo.rdate.value.append(rdate_obj.date2date(cursor, user,
+                    rdate, context=context))
+
+        if todo.exdates:
+            vtodo.add('exdate')
+            vtodo.exdate.value = []
+            for exdate in todo.exdates:
+                vtodo.exdate.value.append(exdate_obj.date2date(cursor, user,
+                    exdate, context=context))
+
+        if todo.rrules:
+            for rrule in todo.rrules:
+                vtodo.add('rrule').value = rrule_obj.rule2rule(cursor, user,
+                        rrule, context=context)
+
+        if todo.exrules:
+            for exrule in todo.exrules:
+                vtodo.add('exrule').value = exrule_obj.rule2rule(cursor, user,
+                        exrule, context=context)
+
+        vtodo.valarm_list = []
+        for alarm in todo.alarms:
+            valarm = alarm_obj.alarm2valarm(cursor, user, alarm,
+                    context=context)
+            if valarm:
+                vtodo.valarm_list.append(valarm)
+
+        for recurrence in todo.recurrences:
+            rical = self.todo2ical(cursor, user, recurrence, context=context)
+            ical.vtodo_list.append(rical.vtodo)
+        return ical
+
+Todo()
+
+
+class TodoCategory(ModelSQL):
+    'Todo - Category'
+    _description = __doc__
+    _name = 'calendar.todo-calendar.category'
+
+    todo = fields.Many2One('calendar.todo', 'To-Do', ondelete='CASCADE',
+            required=True, select=1)
+    category = fields.Many2One('calendar.category', 'Category',
+            ondelete='CASCADE', required=True, select=1)
+
+TodoCategory()
+
+
+class TodoRDate(ModelSQL, ModelView):
+    'Recurrence Date'
+    _description = __doc__
+    _name = 'calendar.todo.rdate'
+    _inherits = {'calendar.rdate': 'calendar_rdate'}
+    _rec_name = 'datetime'
+
+    calendar_rdate = fields.Many2One('calendar.rdate', 'Calendar RDate',
+            required=True, ondelete='CASCADE', select=1)
+    todo = fields.Many2One('calendar.todo', 'Todo', ondelete='CASCADE',
+            select=1, required=True)
+
+    def create(self, cursor, user, values, context=None):
+        todo_obj = self.pool.get('calendar.todo')
+        if values.get('todo'):
+            # Update write_date of todo
+            todo_obj.write(cursor, user, values['todo'], {}, context=context)
+        return super(TodoRDate, self).create(cursor, user, values,
+                context=context)
+
+    def write(self, cursor, user, ids, values, context=None):
+        todo_obj = self.pool.get('calendar.todo')
+        if isinstance(ids, (int, long)):
+            ids = [ids]
+        todo_ids = [x.todo.id for x in self.browse(cursor, user, ids,
+            context=context)]
+        if values.get('todo'):
+            todo_ids.append(values['todo'])
+        if todo_ids:
+            # Update write_date of todo
+            todo_obj.write(cursor, user, todo_ids, {}, context=context)
+        return super(TodoRDate, self).write(cursor, user, ids, values,
+                context=context)
+
+    def delete(self, cursor, user, ids, context=None):
+        todo_obj = self.pool.get('calendar.todo')
+        rdate_obj = self.pool.get('calendar.rdate')
+        if isinstance(ids, (int, long)):
+            ids = [ids]
+        todo_rdates = self.browse(cursor, user, ids, context=context)
+        rdate_ids = [a.calendar_rdate.id for a in todo_rdates]
+        todo_ids = [x.todo.id for x in todo_rdates]
+        if todo_ids:
+            # Update write_date of todo
+            todo_obj.write(cursor, user, todo_ids, {}, context=context)
+        res = super(TodoRDate, 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)
+
+TodoRDate()
+
+
+class TodoRRule(ModelSQL, ModelView):
+    'Recurrence Rule'
+    _description = __doc__
+    _name = 'calendar.todo.rrule'
+    _inherits = {'calendar.rrule': 'calendar_rrule'}
+    _rec_name = 'freq'
+
+    calendar_rrule = fields.Many2One('calendar.rrule', 'Calendar RRule',
+            required=True, ondelete='CASCADE', select=1)
+    todo = fields.Many2One('calendar.todo', 'Todo', ondelete='CASCADE',
+            select=1, required=True)
+
+    def create(self, cursor, user, values, context=None):
+        todo_obj = self.pool.get('calendar.todo')
+        if values.get('todo'):
+            # Update write_date of todo
+            todo_obj.write(cursor, user, values['todo'], {}, context=context)
+        return super(TodoRRule, self).create(cursor, user, values, context=context)
+
+    def write(self, cursor, user, ids, values, context=None):
+        todo_obj = self.pool.get('calendar.todo')
+        if isinstance(ids, (int, long)):
+            ids = [ids]
+        todo_ids = [x.todo.id for x in self.browse(cursor, user, ids,
+            context=context)]
+        if values.get('todo'):
+            todo_ids.append(values['todo'])
+        if todo_ids:
+            # Update write_date of todo
+            todo_obj.write(cursor, user, todo_ids, {}, context=context)
+        return super(TodoRRule, self).write(cursor, user, ids, values, context=context)
+
+    def delete(self, cursor, user, ids, context=None):
+        todo_obj = self.pool.get('calendar.todo')
+        rrule_obj = self.pool.get('calendar.rrule')
+        if isinstance(ids, (int, long)):
+            ids = [ids]
+        todo_rrules = self.browse(cursor, user, ids, context=context)
+        rrule_ids = [a.calendar_rrule.id for a in todo_rrules]
+        todo_ids = [x.todo.id for x in todo_rrules]
+        if todo_ids:
+            # Update write_date of todo
+            todo_obj.write(cursor, user, todo_ids, {}, context=context)
+        res = super(TodoRRule, 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)
+
+TodoRRule()
+
+
+class TodoExDate(TodoRDate):
+    'Exception Date'
+    _description = __doc__
+    _name = 'calendar.todo.exdate'
+
+TodoExDate()
+
+
+class TodoExRule(TodoRRule):
+    'Exception Rule'
+    _description = __doc__
+    _name = 'calendar.todo.exrule'
+
+TodoExRule()
+
+
+class TodoAttendee(ModelSQL, ModelView):
+    'Attendee'
+    _description = __doc__
+    _name = 'calendar.todo.attendee'
+    _inherits = {'calendar.attendee': 'calendar_attendee'}
+
+    calendar_attendee = fields.Many2One('calendar.attendee',
+            'Calendar Attendee', required=True, ondelete='CASCADE', select=1)
+    todo = fields.Many2One('calendar.todo', 'Todo', ondelete='CASCADE',
+            required=True, select=1)
+
+    def create(self, cursor, user, values, context=None):
+        todo_obj = self.pool.get('calendar.todo')
+
+        if values.get('todo'):
+            # Update write_date of todo
+            todo_obj.write(cursor, user, values['todo'], {}, context=context)
+        res = super(TodoAttendee, self).create(cursor, user, values,
+                context=context)
+        attendee = self.browse(cursor, user, res, context=context)
+        todo = attendee.todo
+        if todo.organizer == todo.calendar.owner.email \
+                or (todo.parent \
+                and todo.parent.organizer == todo.parent.calendar.owner.email):
+            if todo.organizer == todo.calendar.owner.email:
+                attendee_emails = [x.email for x in todo.attendees]
+            else:
+                attendee_emails = [x.email for x in todo.parent.attendees]
+            if attendee_emails:
+                todo_ids = self.search(cursor, 0, [
+                    ('todo.uuid', '=', todo.uuid),
+                    ('todo.calendar.owner.email', 'in', attendee_emails),
+                    ('id', '!=', todo.id),
+                    ('todo.recurrence', '=', todo.recurrence or False),
+                    ], context=context)
+                for todo_id in todo_ids:
+                    self.copy(cursor, 0, res, default={
+                        'todo': todo_id,
+                        }, context=context)
+        return res
+
+    def write(self, cursor, user, ids, values, context=None):
+        todo_obj = self.pool.get('calendar.todo')
+
+        if isinstance(ids, (int, long)):
+            ids = [ids]
+        todo_ids = [x.todo.id for x in self.browse(cursor, user, ids,
+            context=context)]
+        if values.get('todo'):
+            todo_ids.append(values['todo'])
+        if todo_ids:
+            # Update write_date of todo
+            todo_obj.write(cursor, user, todo_ids, {}, context=context)
+
+        if 'email' in values:
+            values = values.copy()
+            del values['email']
+
+        res = super(TodoAttendee, self).write(cursor, user, ids, values,
+                context=context)
+        attendees = self.browse(cursor, user, ids, context=context)
+        for attendee in attendees:
+            todo = attendee.todo
+            if todo.organizer == todo.calendar.owner.email \
+                    or (todo.parent \
+                    and todo.parent.organizer == todo.calendar.owner.email):
+                if todo.organizer == todo.calendar.owner.email:
+                    attendee_emails = [x.email for x in todo.attendees]
+                else:
+                    attendee_emails = [x.email for x in todo.parent.attendees]
+                if attendee_emails:
+                    attendee_ids = self.search(cursor, 0, [
+                        ('todo.uuid', '=', todo.uuid),
+                        ('todo.calendar.owner.email', 'in', attendee_emails),
+                        ('id', '!=', attendee.id),
+                        ('todo.recurrence', '=', todo.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):
+        todo_obj = self.pool.get('calendar.todo')
+        attendee_obj = self.pool.get('calendar.attendee')
+
+        if isinstance(ids, (int, long)):
+            ids = [ids]
+        todo_attendees = self.browse(cursor, user, ids, context=context)
+        calendar_attendee_ids = [a.calendar_attendee.id \
+                for a in todo_attendees]
+        todo_ids = [x.todo.id for x in todo_attendees]
+        if todo_ids:
+            # Update write_date of todo
+            todo_obj.write(cursor, user, todo_ids, {}, context=context)
+
+        for attendee in self.browse(cursor, user, ids, context=context):
+            todo = attendee.todo
+            if todo.organizer == todo.calendar.owner.email \
+                    or (todo.parent \
+                    and todo.parent.organizer == todo.calendar.owner.email):
+                if todo.organizer == todo.calendar.owner.email:
+                    attendee_emails = [x.email for x in todo.attendees]
+                else:
+                    attendee_emails = [x.email for x in todo.attendees]
+                if attendee_emails:
+                    attendee_ids = self.search(cursor, 0, [
+                        ('todo.uuid', '=', todo.uuid),
+                        ('todo.calendar.owner.email', 'in', attendee_emails),
+                        ('id', '!=', attendee.id),
+                        ('todo.recurrence', '=', todo.recurrence or False),
+                        ('email', '=', attendee.email),
+                        ], context=context)
+                    self.delete(cursor, 0, attendee_ids, context=context)
+            elif (todo.organizer \
+                    or (todo.parent and todo.parent.organizer)) \
+                    and attendee.email == todo.calendar.owner.email:
+                if todo.organizer:
+                    organizer = todo.organizer
+                else:
+                    organizer = todo.parent.organizer
+                attendee_ids = self.search(cursor, 0, [
+                    ('todo.uuid', '=', todo.uuid),
+                    ('todo.calendar.owner.email', '=', organizer),
+                    ('id', '!=', attendee.id),
+                    ('todo.recurrence', '=', todo.recurrence or False),
+                    ('email', '=', attendee.email),
+                    ], context=context)
+                if attendee_ids:
+                    self.write(cursor, 0, attendee_ids, {
+                        'status': 'declined',
+                        }, context=context)
+        res = super(TodoAttendee, 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)
+
+TodoAttendee()
+
+
+class TodoAlarm(ModelSQL):
+    'Alarm'
+    _description = __doc__
+    _name = 'calendar.todo.alarm'
+    _inherits = {'calendar.alarm': 'calendar_alarm'}
+
+    calendar_alarm = fields.Many2One('calendar.alarm', 'Calendar Alarm',
+            required=True, ondelete='CASCADE', select=1)
+    todo = fields.Many2One('calendar.todo', 'Todo', ondelete='CASCADE',
+            required=True, select=1)
+
+    def create(self, cursor, user, values, context=None):
+        todo_obj = self.pool.get('calendar.todo')
+        if values.get('todo'):
+            # Update write_date of todo
+            todo_obj.write(cursor, user, values['todo'], {}, context=context)
+        return super(TodoAlarm, self).create(cursor, user, values, context=context)
+
+    def write(self, cursor, user, ids, values, context=None):
+        todo_obj = self.pool.get('calendar.todo')
+        if isinstance(ids, (int, long)):
+            ids = [ids]
+        todo_ids = [x.todo.id for x in self.browse(cursor, user, ids,
+            context=context)]
+        if values.get('todo'):
+            todo_ids.append(values['todo'])
+        if todo_ids:
+            # Update write_date of todo
+            todo_obj.write(cursor, user, todo_ids, {}, context=context)
+        return super(TodoAlarm, self).write(cursor, user, ids, values,
+                context=context)
+
+    def delete(self, cursor, user, ids, context=None):
+        todo_obj = self.pool.get('calendar.todo')
+        alarm_obj = self.pool.get('calendar.alarm')
+        if isinstance(ids, (int, long)):
+            ids = [ids]
+        todo_alarms = self.browse(cursor, user, ids, context=context)
+        alarm_ids = [a.calendar_alarm.id for a in todo_alarms]
+        todo_ids = [x.todo.id for x in todo_alarms]
+        if todo_ids:
+            # Update write_date of todo
+            todo_obj.write(cursor, user, todo_ids, {}, context=context)
+        res = super(TodoAlarm, 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)
+
+TodoAlarm()
diff --git a/todo.xml b/todo.xml
new file mode 100644
index 0000000..ae6349d
--- /dev/null
+++ b/todo.xml
@@ -0,0 +1,362 @@
+<?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="ir.ui.view" id="todo_view_tree">
+            <field name="model">calendar.todo</field>
+            <field name="type">tree</field>
+            <field name="arch" type="xml">
+                <![CDATA[
+                <tree string="Todos">
+                    <field name="calendar" select="1"/>
+                    <field name="summary" select="1"/>
+                    <field name="dtstart" select="1"/>
+                    <field name="due" select="1"/>
+                    <field name="status" select="2"/>
+                    <field name="percent_complete" select="2"/>
+                </tree>
+                ]]>
+            </field>
+        </record>
+
+        <record model="ir.ui.view" id="todo_view_form">
+            <field name="model">calendar.todo</field>
+            <field name="type">form</field>
+            <field name="arch" type="xml">
+                <![CDATA[
+                <form string="Todo">
+                    <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="dtstart"/>
+                            <field name="dtstart"/>
+                            <label name="due"/>
+                            <field name="due"/>
+                            <label name="percent_complete"/>
+                            <field name="percent_complete"/>
+                            <label name="completed"/>
+                            <field name="completed"/>
+                            <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="Recurrences" id="recurrences"
+                            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="recurrences" colspan="4">
+                                <tree string="Todos">
+                                    <field name="summary" select="1"/>
+                                    <field name="recurrence" select="1"/>
+                                    <field name="dtstart" select="2"/>
+                                    <field name="due" select="2"/>
+                                    <field name="status" select="2"/>
+                                    <field name="percent_complete" select="2"/>
+                                </tree>
+                            </field>
+                        </page>
+                    </notebook>
+                </form>
+                ]]>
+            </field>
+        </record>
+
+        <record model="ir.action.act_window" id="act_todo_form">
+            <field name="name">Todos</field>
+            <field name="res_model">calendar.todo</field>
+            <field name="view_type">form</field>
+            <field name="domain">[('parent', '=', False)]</field>
+        </record>
+        <record model="ir.action.act_window.view" id="act_todo_form_view1">
+            <field name="sequence" eval="10"/>
+            <field name="view" ref="todo_view_tree"/>
+            <field name="act_window" ref="act_todo_form"/>
+        </record>
+        <record model="ir.action.act_window.view" id="act_todo_form_view2">
+            <field name="sequence" eval="20"/>
+            <field name="view" ref="todo_view_form"/>
+            <field name="act_window" ref="act_todo_form"/>
+        </record>
+        <menuitem parent="calendar.menu_calendar_form" sequence="1"
+            action="act_todo_form" id="menu_todo_form"/>
+
+        <record model="ir.rule.group" id="rule_group_read_todo">
+            <field name="model" search="[('model', '=', 'calendar.todo')]"/>
+            <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_todo_line1">
+            <field name="field" search="[('name', '=', 'calendar_owner'), ('model.model', '=', 'calendar.todo')]"/>
+            <field name="operator">=</field>
+            <field name="operand">User</field>
+            <field name="rule_group" ref="rule_group_read_todo"/>
+        </record>
+        <record model="ir.rule" id="rule_group_read_todo_line2">
+            <field name="field" search="[('name', '=', 'calendar_read_users'), ('model.model', '=', 'calendar.todo')]"/>
+            <field name="operator">=</field>
+            <field name="operand">User</field>
+            <field name="rule_group" ref="rule_group_read_todo"/>
+        </record>
+        <record model="ir.rule" id="rule_group_read_todo_line3">
+            <field name="field" search="[('name', '=', 'classification_public'), ('model.model', '=', 'calendar.todo')]"/>
+            <field name="operator">=</field>
+            <field name="operand">True</field>
+            <field name="rule_group" ref="rule_group_read_todo"/>
+        </record>
+
+        <record model="ir.rule.group" id="rule_group_write_todo">
+            <field name="model" search="[('model', '=', 'calendar.todo')]"/>
+            <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_todo_line1">
+            <field name="field" search="[('name', '=', 'calendar_owner'), ('model.model', '=', 'calendar.todo')]"/>
+            <field name="operator">=</field>
+            <field name="operand">User</field>
+            <field name="rule_group" ref="rule_group_write_todo"/>
+        </record>
+        <record model="ir.rule" id="rule_group_write_todo_line2">
+            <field name="field" search="[('name', '=', 'calendar_write_users'), ('model.model', '=', 'calendar.todo')]"/>
+            <field name="operator">=</field>
+            <field name="operand">User</field>
+            <field name="rule_group" ref="rule_group_write_todo"/>
+        </record>
+
+        <record model="ir.ui.view" id="attendee_view_tree">
+            <field name="model">calendar.todo.attendee</field>
+            <field name="type">tree</field>
+            <field name="arch" type="xml">
+                <![CDATA[
+                <tree string="Attendees">
+                    <field name="todo" 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.todo.attendee</field>
+            <field name="type">form</field>
+            <field name="arch" type="xml">
+                <![CDATA[
+                <form string="Attendee">
+                    <label name="todo"/>
+                    <field name="todo" 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.todo.rdate</field>
+            <field name="type">tree</field>
+            <field name="arch" type="xml">
+                <![CDATA[
+                <tree string="Recurrence Dates">
+                    <field name="todo" 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.todo.rdate</field>
+            <field name="type">form</field>
+            <field name="arch" type="xml">
+                <![CDATA[
+                <form string="Recurrence Date">
+                    <label name="todo"/>
+                    <field name="todo" 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.todo.exdate</field>
+            <field name="type">tree</field>
+            <field name="arch" type="xml">
+                <![CDATA[
+                <tree string="Exception Dates">
+                    <field name="todo" 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.todo.exdate</field>
+            <field name="type">form</field>
+            <field name="arch" type="xml">
+                <![CDATA[
+                <form string="Exception Date">
+                    <label name="todo"/>
+                    <field name="todo" 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.todo.rrule</field>
+            <field name="type">tree</field>
+            <field name="arch" type="xml">
+                <![CDATA[
+                <tree string="Recurrence Rules">
+                    <field name="todo" select="1"/>
+                    <field name="freq" select="1"/>
+                </tree>
+                ]]>
+            </field>
+        </record>
+
+        <record model="ir.ui.view" id="rrule_view_form">
+            <field name="model">calendar.todo.rrule</field>
+            <field name="type">form</field>
+            <field name="arch" type="xml">
+                <![CDATA[
+                <form string="Recurrence Rule">
+                    <label name="todo"/>
+                    <field name="todo" 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.todo.exrule</field>
+            <field name="type">tree</field>
+            <field name="arch" type="xml">
+                <![CDATA[
+                <tree string="Exception Rules">
+                    <field name="todo" select="1"/>
+                    <field name="freq" select="1"/>
+                </tree>
+                ]]>
+            </field>
+        </record>
+
+        <record model="ir.ui.view" id="exrule_view_form">
+            <field name="model">calendar.todo.exrule</field>
+            <field name="type">form</field>
+            <field name="arch" type="xml">
+                <![CDATA[
+                <form string="Exception Rule">
+                    <label name="todo"/>
+                    <field name="todo" 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/trytond_calendar_todo.egg-info/PKG-INFO b/trytond_calendar_todo.egg-info/PKG-INFO
new file mode 100644
index 0000000..23dd6de
--- /dev/null
+++ b/trytond_calendar_todo.egg-info/PKG-INFO
@@ -0,0 +1,25 @@
+Metadata-Version: 1.0
+Name: trytond-calendar-todo
+Version: 1.4.0
+Summary: Add Todo support on CalDAV
+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_todo.egg-info/SOURCES.txt b/trytond_calendar_todo.egg-info/SOURCES.txt
new file mode 100644
index 0000000..b3321ab
--- /dev/null
+++ b/trytond_calendar_todo.egg-info/SOURCES.txt
@@ -0,0 +1,26 @@
+CHANGELOG
+COPYRIGHT
+INSTALL
+LICENSE
+MANIFEST.in
+README
+de_DE.csv
+es_CO.csv
+es_ES.csv
+fr_FR.csv
+setup.py
+todo.xml
+./__init__.py
+./__tryton__.py
+./caldav.py
+./todo.py
+./webdav.py
+tests/__init__.py
+tests/test_calendar_todo.py
+trytond_calendar_todo.egg-info/PKG-INFO
+trytond_calendar_todo.egg-info/SOURCES.txt
+trytond_calendar_todo.egg-info/dependency_links.txt
+trytond_calendar_todo.egg-info/entry_points.txt
+trytond_calendar_todo.egg-info/not-zip-safe
+trytond_calendar_todo.egg-info/requires.txt
+trytond_calendar_todo.egg-info/top_level.txt
\ No newline at end of file
diff --git a/trytond_calendar_todo.egg-info/dependency_links.txt b/trytond_calendar_todo.egg-info/dependency_links.txt
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/trytond_calendar_todo.egg-info/dependency_links.txt
@@ -0,0 +1 @@
+
diff --git a/trytond_calendar_todo.egg-info/entry_points.txt b/trytond_calendar_todo.egg-info/entry_points.txt
new file mode 100644
index 0000000..23ce488
--- /dev/null
+++ b/trytond_calendar_todo.egg-info/entry_points.txt
@@ -0,0 +1,4 @@
+
+    [trytond.modules]
+    calendar_todo = trytond.modules.calendar_todo
+    
\ No newline at end of file
diff --git a/trytond_calendar_todo.egg-info/not-zip-safe b/trytond_calendar_todo.egg-info/not-zip-safe
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/trytond_calendar_todo.egg-info/not-zip-safe
@@ -0,0 +1 @@
+
diff --git a/trytond_calendar_todo.egg-info/requires.txt b/trytond_calendar_todo.egg-info/requires.txt
new file mode 100644
index 0000000..7627a53
--- /dev/null
+++ b/trytond_calendar_todo.egg-info/requires.txt
@@ -0,0 +1,7 @@
+vobject
+PyWebDAV
+python-dateutil
+pytz
+trytond_calendar
+trytond >= 1.4
+trytond < 1.5
\ No newline at end of file
diff --git a/trytond_calendar_todo.egg-info/top_level.txt b/trytond_calendar_todo.egg-info/top_level.txt
new file mode 100644
index 0000000..93df119
--- /dev/null
+++ b/trytond_calendar_todo.egg-info/top_level.txt
@@ -0,0 +1 @@
+trytond
diff --git a/webdav.py b/webdav.py
new file mode 100644
index 0000000..636f25d
--- /dev/null
+++ b/webdav.py
@@ -0,0 +1,347 @@
+#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
+
+
+class Collection(ModelSQL, ModelView):
+
+    _name = "webdav.collection"
+
+    def todo(self, cursor, user, uri, calendar_id=False, context=None):
+        '''
+        Return the todo 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: todo id
+            or False if there is no todo
+        '''
+        todo_obj = self.pool.get('calendar.todo')
+
+        if uri and uri.startswith('Calendars/'):
+            calendar, todo_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
+            todo_ids = todo_obj.search(cursor, user, [
+                ('calendar', '=', calendar_id),
+                ('uuid', '=', todo_uri[:-4]),
+                ('parent', '=', False),
+                ], limit=1, context=context)
+            if todo_ids:
+                return todo_ids[0]
+        return False
+
+    todo = Cache('webdav_collection.todo')(todo)
+
+    def _caldav_filter_domain_todo(self, cursor, user, filter, context=None):
+        '''
+        Return a domain for caldav filter on todo
+
+        :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)]
+                vtodo_filter = None
+                for vtodo_filter in vcalendar_filter.childNodes:
+                    if vtodo_filter.nodeType == vtodo_filter.TEXT_NODE:
+                        vtodo_filter = None
+                        continue
+                    if vtodo_filter.localName == 'comp-filter':
+                        if vtodo_filter.getAttribute('name') != 'VTODO':
+                            vtodo_filter = None
+                            continue
+                        break
+                if vtodo_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)
+                    todo_id = self.todo(cursor, user, uri, context=context)
+                    if todo_id:
+                        ids.append(todo_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')
+        todo_obj = self.pool.get('calendar.todo')
+
+        res = super(Collection, self).get_childs(cursor, user, uri,
+                filter=filter, context=context, cache=cache)
+
+        if uri and (uri not in ('Calendars', 'Calendars/')) 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_todo(cursor, user, filter,
+                        context=context)
+                todo_ids = todo_obj.search(cursor, user, [
+                    ('calendar', '=', calendar_id),
+                    domain,
+                    ], context=context)
+                todos = todo_obj.browse(cursor, user, todo_ids,
+                        context=context)
+                if cache is not None:
+                    cache.setdefault('_calendar', {})
+                    cache['_calendar'].setdefault(todo_obj._name, {})
+                    for todo_id in todo_ids:
+                        cache['_calendar'][todo_obj._name][todo_id] = {}
+                return res + [x.uuid + '.ics' for x in todos]
+
+        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.todo(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.todo(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')
+        todo_obj = self.pool.get('calendar.todo')
+
+        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 and (uri[10:].split('/', 1) + [None])[1]:
+
+            todo_id = self.todo(cursor, user, uri, calendar_id=calendar_id,
+                    context=context)
+            if todo_id:
+                if cache is not None:
+                    cache.setdefault('_calendar', {})
+                    cache['_calendar'].setdefault(todo_obj._name, {})
+                    ids = cache['_calendar'][todo_obj._name].keys()
+                    if todo_id not in ids:
+                        ids.append(todo_id)
+                    elif 'creationdate' in cache['_calendar']\
+                            [todo_obj._name][todo_id]:
+                        return cache['_calendar'][todo_obj._name]\
+                                [todo_id]['creationdate']
+                else:
+                    ids = [todo_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 "' + todo_obj._table + '" ' \
+                        'WHERE ' + red_sql, red_ids)
+                    for todo_id2, date in cursor.fetchall():
+                        if todo_id2 == todo_id:
+                            res = date
+                        if cache is not None:
+                            cache['_calendar'][todo_obj._name]\
+                                    .setdefault(todo_id2, {})
+                            cache['_calendar'][todo_obj._name]\
+                                    [todo_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')
+        todo_obj = self.pool.get('calendar.todo')
+
+        calendar_id = self.calendar(cursor, user, uri, context=context)
+        if calendar_id and (uri[10:].split('/', 1) + [None])[1]:
+            todo_id = self.todo(cursor, user, uri, calendar_id=calendar_id,
+                    context=context)
+            if todo_id:
+                if cache is not None:
+                    cache.setdefault('_calendar', {})
+                    cache['_calendar'].setdefault(todo_obj._name, {})
+                    ids = cache['_calendar'][todo_obj._name].keys()
+                    if todo_id not in ids:
+                        ids.append(todo_id)
+                    elif 'lastmodified' in cache['_calendar']\
+                            [todo_obj._name][todo_id]:
+                        return cache['_calendar'][todo_obj._name]\
+                                [todo_id]['lastmodified']
+                else:
+                    ids = [todo_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 "' + todo_obj._table + '" ' \
+                            'WHERE ' + red_id_sql + ' ' \
+                                'OR ' + red_parent_sql + ' ' \
+                            'GROUP BY parent, id', red_id_ids + red_parent_ids)
+                    for todo_id2, date in cursor.fetchall():
+                        if todo_id2 == todo_id:
+                            res = date
+                        if cache is not None:
+                            cache['_calendar'][todo_obj._name]\
+                                    .setdefault(todo_id2, {})
+                            cache['_calendar'][todo_obj._name]\
+                                    [todo_id2]['lastmodified'] = 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):
+        todo_obj = self.pool.get('calendar.todo')
+        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
+            todo_id = self.todo(cursor, user, uri, calendar_id=calendar_id,
+                    context=context)
+            if not todo_id:
+                return super(Collection, self).get_data(cursor, user, uri,
+                        context=context, cache=cache)
+            ical = todo_obj.todo2ical(cursor, user, todo_id, context=context)
+            return ical.serialize()
+
+        return super(Collection, self).get_data(cursor, user, uri,
+                context=context, cache=cache)
+
+    def put(self, cursor, user, uri, data, content_type, context=None,
+            cache=None):
+        todo_obj = self.pool.get('calendar.todo')
+        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
+            todo_id = self.todo(cursor, user, uri, calendar_id=calendar_id,
+                    context=context)
+            ical = vobject.readOne(data)
+            if not hasattr(ical, 'vtodo'):
+                return super(Collection, self).put(cursor, user, uri, data,
+                        content_type, context=context)
+
+            if not todo_id:
+
+                values = todo_obj.ical2values(cursor, user, None, ical,
+                        calendar_id, context=context)
+                todo_id = todo_obj.create(cursor, user, values,
+                        context=context)
+                todo = todo_obj.browse(cursor, user, todo_id,
+                        context=context)
+                calendar = calendar_obj.browse(cursor, user, calendar_id,
+                        context=context)
+                return cursor.database_name + '/Calendars/' + calendar.name + \
+                        '/' + todo.uuid + '.ics'
+            else:
+                values = todo_obj.ical2values(cursor, user, todo_id, ical,
+                        calendar_id, context=context)
+                todo_obj.write(cursor, user, todo_id, values,
+                        context=context)
+                return
+
+        return super(Collection, self).put(cursor, user, uri, data,
+                content_type, context=context)
+
+    def rm(self, cursor, user, uri, context=None, cache=None):
+        todo_obj = self.pool.get('calendar.todo')
+
+        calendar_id = self.calendar(cursor, user, uri, context=context)
+        if calendar_id:
+            if not (uri[10:].split('/', 1) + [None])[1]:
+                raise DAV_Forbidden
+            todo_id = self.todo(cursor, user, uri, calendar_id=calendar_id,
+                    context=context)
+            if todo_id:
+                try:
+                    todo_obj.delete(cursor, user, todo_id, context=context)
+                except:
+                    raise DAV_Forbidden
+                return 200
+        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.todo(cursor, user, uri, calendar_id=calendar_id,
+                    context=context):
+                return 1
+        return super(Collection, self).exists(cursor, user, uri, context=context,
+                cache=cache)
+
+Collection()
-- 
tryton-modules-calendar-todo



More information about the tryton-debian-vcs mailing list