[tryton-debian-vcs] tryton-server branch debian updated. debian/2.8.3-1-12-gf78c56d

git repository hosting tryton-debian-vcs at m9s.biz
Mon Nov 25 19:39:18 UTC 2013


The following commit has been merged in the debian branch:
http://debian.tryton.org/gitweb/?p=packages/tryton-server.git;a=commitdiff;h=debian/2.8.3-1-12-gf78c56d

commit f78c56da869bacb31b9e5fadc4ce94fc96e97bb3
Author: Mathias Behrle <mathiasb at m9s.biz>
Date:   Mon Nov 25 20:30:44 2013 +0100

    Releasing debian version 3.0.0-1.

diff --git a/debian/changelog b/debian/changelog
index f00c325..fb73917 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,19 @@
+tryton-server (3.0.0-1) unstable; urgency=low
+
+  * Adding tryton-server-doc to Suggests.
+  * Adding tryton-modules-all to Suggests.
+  * Merging upstream version 3.0.0.
+  * Updating Depends.
+  * Refreshing patches.
+  * Adding NEWS for the new major version 3.0.0.
+  * Updating README.Debian.
+  * Removing echo messages from postinst.
+  * Updating manpage.
+  * Updating to standards version 3.9.5, no changes needed.
+  * Changing to buildsystem pybuild.
+
+ -- Mathias Behrle <mathiasb at m9s.biz>  Mon, 25 Nov 2013 17:56:04 +0100
+
 tryton-server (2.8.3-1) unstable; urgency=low
 
   * Merging upstream version 2.8.3.
commit 8fb66b8ec71195582867746dd396ebfa5d2305fb
Author: Mathias Behrle <mathiasb at m9s.biz>
Date:   Sun Nov 24 19:51:52 2013 +0100

    Changing to buildsystem pybuild.

diff --git a/debian/control b/debian/control
index 6222183..9fff141 100644
--- a/debian/control
+++ b/debian/control
@@ -5,7 +5,7 @@ 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,
- python-sphinx (>= 1.0.7+dfsg)
+ python-sphinx (>= 1.0.7+dfsg), dh-python
 Standards-Version: 3.9.5
 Homepage: http://www.tryton.org/
 Vcs-Browser: http://debian.tryton.org/gitweb/?p=packages/tryton-server.git
diff --git a/debian/rules b/debian/rules
index 59b9533..6656a0d 100755
--- a/debian/rules
+++ b/debian/rules
@@ -1,26 +1,24 @@
 #!/usr/bin/make -f
 
-%:
-	dh ${@} --with python2,sphinxdoc
+# needed for pbuilder
+export LC_ALL=C.UTF-8
+
+export PYBUILD_DESTDIR_python2=debian/tryton-server
 
-PACKAGE_NAME = $(shell python setup.py --name)
+# Don't run tests for Tryton packages, they try to download dependencies from pypi
+export PYBUILD_DISABLE_python2.7=test
+
+%:
+	dh ${@} --with python2,sphinxdoc --buildsystem=pybuild
 
 override_dh_auto_clean:
 	dh_auto_clean
 	rm -rf build
 
 override_dh_auto_build:
-	mv $(PACKAGE_NAME).egg-info $(PACKAGE_NAME).hen-info
-	mv PKG-INFO PKG-INFO.hen
 	dh_auto_build
 	sphinx-build doc build/html
 
-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_installinit:
 	dh_installinit --update-rcd-params='defaults 21'
 
diff --git a/debian/tryton-server.install b/debian/tryton-server.install
index be4692b..c7c68db 100644
--- a/debian/tryton-server.install
+++ b/debian/tryton-server.install
@@ -1,2 +1 @@
 etc/trytond.conf	/etc
-debian/tmp/usr/*	/usr
commit 346145eb7eaf134ed963c407c2a054c78fc19ca5
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 aa8091b..6222183 100644
--- a/debian/control
+++ b/debian/control
@@ -6,7 +6,7 @@ Uploaders: Mathias Behrle <mathiasb at m9s.biz>
 Build-Depends:
  debhelper (>= 9), python (>= 2.6.6-3~), python-setuptools,
  python-sphinx (>= 1.0.7+dfsg)
-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-server.git
 Vcs-Git: git://debian.tryton.org/packages/tryton-server.git
commit bdb0acbf230a69d57766917d94314a95fc0b0ea7
Author: Mathias Behrle <mathiasb at m9s.biz>
Date:   Sun Nov 24 19:00:48 2013 +0100

    Updating manpage.

diff --git a/debian/manpages/trytond.1 b/debian/manpages/trytond.1
index b573292..6d8ddb6 100644
--- a/debian/manpages/trytond.1
+++ b/debian/manpages/trytond.1
@@ -1,4 +1,4 @@
-.TH TRYTOND 1 "2013\-02\-14" "2.6" "Tryton Application Platform"
+.TH TRYTOND 1 "2013\-11\-24" "3.0" "Tryton Application Platform"
 
 .SH NAME
 trytond \- Tryton Application Platform (Server)
commit a97406409a82184202d76175bf05c021ff740b52
Author: Mathias Behrle <mathiasb at m9s.biz>
Date:   Sun Nov 24 18:49:32 2013 +0100

    Removing echo messages from postinst.

diff --git a/debian/tryton-server.postinst b/debian/tryton-server.postinst
index be574be..2d3436a 100644
--- a/debian/tryton-server.postinst
+++ b/debian/tryton-server.postinst
@@ -27,23 +27,6 @@ case "${1}" in
 		# configuration file.
 		chown ${TRYTON_USER}:${TRYTON_USER} ${TRYTON_CONFFILE}
 		chmod 0440 ${TRYTON_CONFFILE}
-
-		echo
-		echo "* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *"
-		echo "* Tryton Setup:                                                         *"
-		echo "* Tryton uses a database (RDBMS), preferably PostgreSQL to store its    *"
-		echo "* data. You have to setup this database manually.                       *"
-		echo "* Please read /usr/share/doc/tryton-server/README.Debian how to do it.  *"
-		echo "*                                                                       *"
-		echo "* Note: If you intend to use solely Neso, the standalone application    *"
-		echo "* of Tryton, no database setup is required.                             *"
-		echo "*                                                                       *"
-		echo "* Tryton Upgrade:                                                       *"
-		echo "* On upgrades of major versions (i.e. second number of version string)  *"
-		echo "* you have also to run a database update on existing databases.         *"
-		echo "* Please read /usr/share/doc/tryton-server/README.Debian how to do it.  *"
-		echo "* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *"
-		echo
 		;;
 
 	abort-upgrade|abort-remove|abort-deconfigure)
commit 1944264112b17b8cbdf8e698f82bc7c94811b1a0
Author: Mathias Behrle <mathiasb at m9s.biz>
Date:   Sun Nov 24 18:47:45 2013 +0100

    Updating README.Debian.

diff --git a/debian/tryton-server.README.Debian b/debian/tryton-server.README.Debian
index 6db5454..078ba8c 100644
--- a/debian/tryton-server.README.Debian
+++ b/debian/tryton-server.README.Debian
@@ -1,6 +1,9 @@
 tryton-server for Debian
 ------------------------
 
+Setup
+-----
+
 Tryton uses a Relational Database Management System (RDBMS) to store data. The
 preferred RDBMS for Tryton is PostgreSQL.
 
@@ -58,6 +61,20 @@ Client and are not mandatory to be done here.
      Note: Use the database name you chose in step 4 (here as default: tryton).
      You will be asked for the admin password for this database.
 
+Upgrade
+-------
+
+  * Once you have upgraded to a new major version (second number of the
+    version string) you have to update your database(s).
+    After the categorically recommended backup do:
+
+    # /usr/bin/trytond -u all -d tryton
+
+    Remember to replace tryton with the name of your database.
+
+
+Notes
+-----
 
 Now, you're finished. Please be aware of the following things:
 
@@ -72,7 +89,7 @@ Now, you're finished. Please be aware of the following things:
   * trytond must have read access to its configuration file, otherwise it will
     start with internal defaults. The postinst script will (re)set ownership to
     the system user running trytond and correct permissions on the standard
-    configuration file (/etc/tyond.conf).
+    configuration file (/etc/tryond.conf).
 
   * trytond listens by default on port 8000 (jsonrpc). If you need to change
     this, edit /etc/trytond.conf and replace 'jsonrpc = <interface>:8000' with
@@ -94,13 +111,6 @@ Now, you're finished. Please be aware of the following things:
 
     Remember to replace tryton with the name of your database.
 
-  * Once you have upgraded to a new major version you have to update your
-    database(s). After the categorically recommended backup do:
-
-    # /usr/bin/trytond -u all -d tryton
-
-    Remember to replace tryton with the name of your database.
-
   * Only the same major version of Tryton client and Tryton server can connect.
 
- -- Mathias Behrle <mathiasb at m9s.biz>  Fri, 12 Apr 2013 12:00:00 +0200
+ -- Mathias Behrle <mathiasb at m9s.biz>  Sun, 24 Nov 2013 18:45:00 +0100
commit 5019633ff0c2adef58bbf1d8ec577c38a60edec9
Author: Mathias Behrle <mathiasb at m9s.biz>
Date:   Sun Nov 24 18:33:08 2013 +0100

    Adding NEWS for the new major version 3.0.0.

diff --git a/debian/NEWS b/debian/NEWS
index a5d9d8f..4332763 100644
--- a/debian/NEWS
+++ b/debian/NEWS
@@ -1,3 +1,14 @@
+tryton-server (3.0.0-1) unstable; urgency=low
+
+  This is the new major release 3.0.0.
+  As for each major release don't forget to backup your database(s) and
+  then run the update with
+  # trytond -u all -d <your_database_name>
+  and restart the server with
+  # /etc/init.d/tryton-server restart
+
+ -- Mathias Behrle <mathiasb at m9s.biz>  Sun, 24 Nov 2013 18:28:07 +0100
+
 tryton-server (2.8.0-1) experimental; urgency=low
 
   This is the new major release 2.8.0.
commit f0b8cfaa3474d83956b28ebdf4342cffe3c50aaa
Author: Mathias Behrle <mathiasb at m9s.biz>
Date:   Sun Nov 24 18:26:01 2013 +0100

    Refreshing patches.

diff --git a/debian/patches/01-debian-data-dir b/debian/patches/01-debian-data-dir
index 78c9819..7157d33 100644
--- a/debian/patches/01-debian-data-dir
+++ b/debian/patches/01-debian-data-dir
@@ -1,9 +1,9 @@
 Author: Mathias Behrle <mathiasb at m9s.biz>
 Description: Set the data path of the server to the home of the Debian tryton user.
---- tryton-server.orig/etc/trytond.conf	2012-04-25 11:04:03.000000000 +0200
-+++ tryton-server/etc/trytond.conf	2012-04-26 00:50:06.656299435 +0200
-@@ -60,7 +60,7 @@
- #smtp_user = False
+--- tryton-server.orig/etc/trytond.conf	2013-11-24 18:24:26.350839912 +0100
++++ tryton-server/etc/trytond.conf	2013-11-24 18:24:26.346840051 +0100
+@@ -61,7 +61,7 @@
+ #smtp_default_from_email = False
  
  # Configure the path to store attachments and sqlite database
 -#data_path = /var/lib/trytond
commit 848e10aa488a03b924dba87813d86e751f6b365b
Author: Mathias Behrle <mathiasb at m9s.biz>
Date:   Sun Nov 24 18:24:15 2013 +0100

    Updating Depends.

diff --git a/debian/control b/debian/control
index 3c435e1..aa8091b 100644
--- a/debian/control
+++ b/debian/control
@@ -16,7 +16,7 @@ Package: tryton-server
 Architecture: all
 Depends:
  ${misc:Depends}, ${python:Depends}, adduser, python-dateutil, python-genshi,
- python-lxml, python-relatorio, python-simplejson, python-polib,
+ python-lxml, python-relatorio, python-simplejson, python-polib, python-sql,
  python-pkg-resources
 Recommends:
  postgresql, python-psycopg2, postgresql-client, python-levenshtein,
commit 182d6cce169eab1682eeacbad4323efa1136a1a0
Author: Mathias Behrle <mathiasb at m9s.biz>
Date:   Sun Nov 24 17:28:54 2013 +0100

    Merging upstream version 3.0.0.

diff --git a/CHANGELOG b/CHANGELOG
index 5bb11f4..ae9f454 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,11 +1,20 @@
-Version 2.8.3 - 2013-10-01
-* Bug fixes (see mercurial logs for details)
-
-Version 2.8.2 - 2013-07-22
-* Bug fixes (see mercurial logs for details)
-
-Version 2.8.1 - 2013-06-09
+Version 3.0.0 - 2013-10-21
 * Bug fixes (see mercurial logs for details)
+* Allow customization of translation in po files
+* Use python-sql
+* Add convert_domain method on Fields
+* Add sql_format and sql_type methods on Fields
+* Allow to return a full domain for Function.searcher
+* Replace static backend by dynamic get method
+* Replace order_field by order_<field name> method
+* Allow field One2One in check_recursion
+* Remove the default order on MPTT
+* Add grouped attribute to data tag
+* Store selection tree state
+* Add order to Action Window
+* Add factor on number fields
+* Add calendar view
+* Remove request
 
 Version 2.8.0 - 2013-04-22
 * Bug fixes (see mercurial logs for details)
diff --git a/MANIFEST.in b/MANIFEST.in
index cd0aa79..15940c4 100644
--- a/MANIFEST.in
+++ b/MANIFEST.in
@@ -23,8 +23,8 @@ include trytond/res/tryton.cfg
 include trytond/res/*.xml
 include trytond/res/view/*.xml
 include trytond/res/locale/*.po
-include trytond/test/tryton.cfg
-include trytond/test/*.xml
+include trytond/tests/tryton.cfg
+include trytond/tests/*.xml
 include trytond/webdav/tryton.cfg
 include trytond/webdav/*.xml
 include trytond/webdav/view/*.xml
diff --git a/PKG-INFO b/PKG-INFO
index 94492f8..44f1a41 100644
--- a/PKG-INFO
+++ b/PKG-INFO
@@ -1,12 +1,12 @@
 Metadata-Version: 1.1
 Name: trytond
-Version: 2.8.3
+Version: 3.0.0
 Summary: Tryton server
 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
         =======
         
@@ -107,6 +107,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/bin/trytond b/bin/trytond
index ea20af1..a55d02c 100755
--- a/bin/trytond
+++ b/bin/trytond
@@ -43,7 +43,9 @@ def parse_commandline():
 
     parser.epilog = 'The first time a database is initialized with "-i" admin'\
             ' password is read from file defined by TRYTONPASSFILE '\
-            'environment variable or interactively ask user'
+            'environment variable or interactively ask user. '\
+            'The config file can be specified in the TRYTOND_CONFIG '\
+            'environment variable.'
 
     (opt, _) = parser.parse_args()
 
diff --git a/doc/conf.py b/doc/conf.py
index eea3432..a5b9b8d 100644
--- a/doc/conf.py
+++ b/doc/conf.py
@@ -48,9 +48,9 @@ copyright = (u'2008-2011, Bertrand Chenal, Cédric Krier, Ian Wilson, '
 # built documents.
 #
 # The short X.Y version.
-version = '2.8'
+version = '3.0'
 # The full version, including alpha/beta/rc tags.
-release = '2.8'
+release = '3.0'
 
 # The language for content autogenerated by Sphinx. Refer to documentation
 # for a list of supported languages.
diff --git a/doc/ref/models/fields.rst b/doc/ref/models/fields.rst
index e3a4f73..451392f 100644
--- a/doc/ref/models/fields.rst
+++ b/doc/ref/models/fields.rst
@@ -122,15 +122,6 @@ client will also read these fields even if they are not defined on the view.
 :attr:`Field.depends` is used per example to ensure that
 :class:`~trytond.pyson.PYSON` statement could be evaluated.
 
-``order_field``
----------------
-
-.. attribute:: Field.order_field
-
-The name of a substitute field on which the ordering of records must be done
-instead of this one.
-This is often used to allow ordering on :class:`Function` fields.
-
 ``context``
 -----------
 
@@ -153,11 +144,51 @@ Define how the field must be loaded: ``lazy`` or ``eager``.
 
 The name of the field.
 
+Instance methods:
+
+.. method:: Field.convert_domain(domain, tables, Model)
+
+    Convert the simple :ref:`domain <topics-domain>` clause into a SQL
+    expression or a new domain.
+
+Where ``tables`` is a nested dictionary containing the existing joins (and it
+could be updated to add new joins)::
+
+    {
+        None: (<Table invoice>, None),
+        'party': {
+            None: (<Table party>, <join_on sql expression>),
+            'addresses': {
+                None: (<Table address>, <join_on sql expression>),
+                },
+            },
+        }
+
+.. method:: Field.sql_format(value)
+
+    Convert the value to use as parameter of SQL queries.
+
+.. method:: Field.sql_type()
+
+    Return the namedtuple('SQLType', 'base type') which defines the SQL type to
+    use for creation and casting.
+
 Default value
 =============
 
 See :ref:`default value <topics-fields_default_value>`
 
+Ordering
+========
+
+A class method could be defined for each field which must return a list of SQL
+expression on which to order instead of the field.
+The method signature is::
+
+    order_<field name>(tables)
+
+Where ``tables`` is a nested dictionary, see :meth:`~Field.convert_domain`.
+
 Field types
 ===========
 
@@ -289,6 +320,13 @@ A date and time, represented in Python by a ``datetime.datetime`` instance.
     the time part of the field. The default value is `%H:%M:%S`.
     The value can be replaced by a :class:`~trytond.pyson.PYSON` statement.
 
+Timestamp
+---------
+
+.. class:: Timestamp(string[, \**options])
+
+A timestamp, represented in Python by a ``datetime.datetime`` instance.
+
 Time
 ----
 
@@ -307,6 +345,16 @@ Binary
 
 A binary field. It will be represented in Python by a ``str`` instance.
 
+:class:`Binary` has one extra optional argument:
+
+.. attribute:: Binary.filename
+
+    Name of the field that holds the data's filename. Default value
+    is an empty string, which means the data has no filename (in this case, the
+    filename is hidden, and the "Open" button is hidden when the widget is set
+    to "image").
+
+
 Selection
 ---------
 
@@ -625,7 +673,8 @@ A function field can emulate any other given `field`.
 
     where `name` is the name of the field and `clause` is a
     :ref:`domain clause <topics-domain>`.
-    It must return a list of :ref:`domain <topics-domain>` clauses.
+    It must return a list of :ref:`domain <topics-domain>` clauses but the
+    ``operand`` can be a SQL query.
 
 Instance methods:
 
diff --git a/doc/ref/models/models.rst b/doc/ref/models/models.rst
index 1816ce6..54b092c 100644
--- a/doc/ref/models/models.rst
+++ b/doc/ref/models/models.rst
@@ -391,10 +391,19 @@ Class attributes are:
 
 Class methods:
 
+.. classmethod:: ModelSQL.__table__()
+
+    Return a SQL Table instance for the Model.
+
 .. classmethod:: ModelSQL.table_query()
 
     Could be overrided to use a custom SQL query instead of a table of the
-    database. It should return a tuple containing SQL query and arguments.
+    database. It should return a SQL FromItem.
+
+.. classmethod:: ModelStorage.search(domain[, offset[, limit[, order[, count[, query]]]]])
+
+    Return a list of records that match the :ref:`domain <topics-domain>` or
+    the sql query if query is True.
 
 .. classmethod:: ModelSQL.search_domain(domain[, active_test])
 
diff --git a/doc/ref/pool.rst b/doc/ref/pool.rst
index 2881379..911a6fe 100644
--- a/doc/ref/pool.rst
+++ b/doc/ref/pool.rst
@@ -56,3 +56,11 @@ PoolMeta
 
 The PoolMeta is a metaclass helper to setup __name__ on class to be registered
 in the Pool.
+
+========
+PoolBase
+========
+
+.. class:: PoolBase
+
+The base class of registered class that will be setup.
diff --git a/doc/ref/pyson.rst b/doc/ref/pyson.rst
index 782bf5b..5f012b9 100644
--- a/doc/ref/pyson.rst
+++ b/doc/ref/pyson.rst
@@ -74,6 +74,11 @@ value of the statement named by ``value``, if defined in the
 evaluation context, otherwise the ``default`` value (empty
 string by default).  Returns an instance of itself.
 
+.. note::
+
+    The default value determines the type of the statement.
+..
+
 .. class:: Not(value)
 
 A :class:`Not` object represents the PYSON ``Not()``
diff --git a/doc/ref/wizard.rst b/doc/ref/wizard.rst
index f0e3618..6cc0674 100644
--- a/doc/ref/wizard.rst
+++ b/doc/ref/wizard.rst
@@ -65,10 +65,10 @@ Class methods are:
 
     Delete the session.
 
-.. classmethod:: Wizard.execute(session, data, state_name)
+.. classmethod:: Wizard.execute(session_id, data, state_name)
 
     Execute the wizard for the state.
-    `session` can be an instance of :class:`Session` or a session id.
+    `session_id` is a session id.
     `data` is a dictionary with the session data to update.
     `active_id`, `active_ids` and `active_model` must be set in the context
     according to the records on which the wizard is run.
@@ -118,12 +118,11 @@ Instance methods are:
     Returns the view definition like
     :meth:`~trytond.model.ModelView.fields_view_get`.
 
-.. method:: StateView.get_defaults(wizard, session, state_name, fields)
+.. method:: StateView.get_defaults(wizard, state_name, fields)
 
     Return default values for the fields.
 
     * wizard is a :class:`Wizard` instance
-    * session is a :class:`Session` instance
     * state_name is the name of the :class:`State`
     * fields is the list of field names
 
diff --git a/doc/topics/install.rst b/doc/topics/install.rst
index 4e18982..00d91ce 100644
--- a/doc/topics/install.rst
+++ b/doc/topics/install.rst
@@ -12,6 +12,7 @@ Prerequisites
     * relatorio 0.2.0 or later (http://relatorio.openhex.org/)
     * python-dateutil (http://labix.org/python-dateutil)
     * polib (https://bitbucket.org/izi/polib/wiki/Home)
+    * python-sql 0.2 or later (http://code.google.com/p/python-sql/)
     * Optional: psycopg 2 or later (http://www.initd.org/)
     * Optional: MySQL-python (http://sourceforge.net/projects/mysql-python/)
     * Optional: pywebdav 0.9.8 or later (http://code.google.com/p/pywebdav/)
diff --git a/doc/topics/models/fields_default_value.rst b/doc/topics/models/fields_default_value.rst
index 2c7505f..71f5246 100644
--- a/doc/topics/models/fields_default_value.rst
+++ b/doc/topics/models/fields_default_value.rst
@@ -7,7 +7,7 @@ Default value of fields
 When a record is created, each field, which doesn't have a value specified,
 is set with the default value if exists.
 
-The following method::
+The following class method::
 
     Model.default_<field name>()
 
@@ -21,14 +21,11 @@ This example defines an ``Item`` model which has a default ``since``::
 
     class Item(ModelSQL, ModelView):
         "Item"
-        _description = __doc__
-        _name = "item.item"
+        __name__ = 'item'
         since = fields.Date('since')
 
-        def default_since(self):
+        @classmethod
+        def default_since(cls):
             return datetime.date.today()
 
-    Item()
-
 See also method ``Model.default_get``: :attr:`~trytond.model.Model.default_get`
-
diff --git a/doc/topics/modules/index.rst b/doc/topics/modules/index.rst
index a52cde3..fe1a7e4 100644
--- a/doc/topics/modules/index.rst
+++ b/doc/topics/modules/index.rst
@@ -110,8 +110,9 @@ Here is the list of the tags:
     * ``tryton``: The main tag of the xml
 
     * ``data``: Define a set of data inside the file. It can have the
-      attributes ``noupdate`` to prevent the framework to update the records
-      and ``skiptest`` to prevent import of data when running tests.
+      attributes ``noupdate`` to prevent the framework to update the records,
+      ``skiptest`` to prevent import of data when running tests and ``grouped``
+      to create records at the end with a grouped call.
 
     * ``record``: Create a record of the model defined by the attribute
       ``model`` in the database. The ``id`` attribute can be used to refer to
diff --git a/doc/topics/pyson.rst b/doc/topics/pyson.rst
index 120b441..a193caa 100644
--- a/doc/topics/pyson.rst
+++ b/doc/topics/pyson.rst
@@ -13,9 +13,9 @@ A PYSON parser can easily be implemented in other programming languages.
 So third party softwares do not need to depend on Python to be able to
 fully communicate with the Tryton server.
 
-PYSON is a `deterministic algorithm`_ which will always
-succeed to evaluate statements. There is a default behavior for
-unknown values.
+PYSON is a `deterministic algorithm`_ which will always succeed to evaluate
+statements. There is a default behavior for unknown values. It is statically
+typed and checked on instantiation.
 
 There is also a :ref:`reference documentation of the API <ref-pyson>`.
 
diff --git a/doc/topics/views/index.rst b/doc/topics/views/index.rst
index 1a2f765..1b1ff00 100644
--- a/doc/topics/views/index.rst
+++ b/doc/topics/views/index.rst
@@ -133,6 +133,14 @@ List of attributes shared by many form elements:
       :class:`trytond.model.fields.One2Many` to specifiy if the client must
       auto-complete the field. The default value is True.
 
+    .. _common-attributes-factor:
+
+    * ``factor``: A factor to apply on fields
+      :class:`trytond.model.fields.Integer`,
+      :class:`trytond.model.fields.Float` and
+      :class:`trytond.model.fields.Numeric` to display on the widget. The
+      default value is 1.
+
 
 form
 ^^^^
@@ -219,6 +227,9 @@ Display a field of the object with the value of the current record.
     * ``invisible``: The field will not be displayed, but it will fill cells in
       the table.
 
+    * ``filename_visible``: Only for Binary fields, boolean that enables the
+      display of the filename.
+
     * ``yexpand``: see in common-attributes-yexpand_.
 
     * ``yfill``: see in common-attributes-yfill_.
@@ -235,6 +246,8 @@ Display a field of the object with the value of the current record.
 
     * ``completion``: see in common-attributes-completion_.
 
+    * ``factor``: see in common-attributes-factor_.
+
 image
 ^^^^^
 
@@ -349,6 +362,8 @@ Create a sub-table in a cell.
 
     * ``col``: The number of columns for the group contains.
 
+    * ``homogeneous``: If True all the tables cells are the same size.
+
     * ``id``: see in common-attributes-id_.
 
     * ``yexpand``: see in common-attributes-yexpand_.
@@ -491,6 +506,8 @@ field
 
     * ``completion``: see in common-attributes-completion_.
 
+    * ``factor``: see in common-attributes-factor_.
+
 prefix or suffix
 ^^^^^^^^^^^^^^^^
 
@@ -690,3 +707,45 @@ action
     * ``name``: The id of the action window.
 
     * ``colspan``: see in common-attributes-colspan_.
+
+Calendar view
+=============
+
+The RNG that describes the xml for a calendar view is stored in
+trytond/ir/ui/calendar.rng. There is also a RNC in trytond/ir/ui/calendar.rnc.
+
+Calendar view is use to display records as events on a calendar based on a
+`dtstart` and optionally a `dtend`.
+
+XML description
+---------------
+
+calendar
+^^^^^^^^
+
+Each calendar view must start with this tag.
+
+    * ``dtstart``: The name of the field that contains the start date.
+
+    * ``dtend``: The name of the field that contains the end date.
+
+    * ``string``: The text that will be used as default title for the tab or
+      the window.
+
+field
+^^^^^
+
+    * ``name``: The name of the field.
+
+Example
+-------
+
+.. highlight:: xml
+
+::
+
+  <calendar string="Productions" dtstart="planned_date">
+      <field name="code"/>
+      <field name="product"/>
+      <field name="reference"/>
+  </calendar>
diff --git a/etc/trytond.conf b/etc/trytond.conf
index aea2683..6208dd5 100644
--- a/etc/trytond.conf
+++ b/etc/trytond.conf
@@ -58,6 +58,7 @@ jsonrpc = localhost:8000
 #smtp_tls = False
 #smtp_password = False
 #smtp_user = False
+#smtp_default_from_email = False
 
 # Configure the path to store attachments and sqlite database
 #data_path = /var/lib/trytond
diff --git a/setup.py b/setup.py
index 5d4e8c3..d13df20 100644
--- a/setup.py
+++ b/setup.py
@@ -31,7 +31,7 @@ setup(name=PACKAGE,
         'trytond.ir.ui': ['*.xml', '*.rng', '*.rnc'],
         'trytond.res': ['tryton.cfg', '*.xml', 'view/*.xml', 'locale/*.po'],
         'trytond.webdav': ['tryton.cfg', '*.xml', 'view/*.xml', 'locale/*.po'],
-        'trytond.test': ['tryton.cfg', '*.xml'],
+        'trytond.tests': ['tryton.cfg', '*.xml'],
         },
     scripts=['bin/trytond'],
     classifiers=[
@@ -48,6 +48,7 @@ setup(name=PACKAGE,
         'Natural Language :: French',
         'Natural Language :: German',
         'Natural Language :: Russian',
+        'Natural Language :: Slovenian',
         'Natural Language :: Spanish',
         'Operating System :: OS Independent',
         'Programming Language :: Python :: 2.6',
@@ -61,6 +62,7 @@ setup(name=PACKAGE,
         'Genshi',
         'python-dateutil',
         'polib',
+        'python-sql >= 0.2',
         ],
     extras_require={
         'PostgreSQL': ['psycopg2 >= 2.0'],
diff --git a/trytond.egg-info/PKG-INFO b/trytond.egg-info/PKG-INFO
index 94492f8..44f1a41 100644
--- a/trytond.egg-info/PKG-INFO
+++ b/trytond.egg-info/PKG-INFO
@@ -1,12 +1,12 @@
 Metadata-Version: 1.1
 Name: trytond
-Version: 2.8.3
+Version: 3.0.0
 Summary: Tryton server
 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
         =======
         
@@ -107,6 +107,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.egg-info/SOURCES.txt b/trytond.egg-info/SOURCES.txt
index 79ad5cf..6c96d96 100644
--- a/trytond.egg-info/SOURCES.txt
+++ b/trytond.egg-info/SOURCES.txt
@@ -59,21 +59,17 @@ trytond.egg-info/requires.txt
 trytond.egg-info/top_level.txt
 trytond/backend/__init__.py
 trytond/backend/database.py
-trytond/backend/fields.py
 trytond/backend/table.py
 trytond/backend/mysql/__init__.py
 trytond/backend/mysql/database.py
-trytond/backend/mysql/fields.py
 trytond/backend/mysql/init.sql
 trytond/backend/mysql/table.py
 trytond/backend/postgresql/__init__.py
 trytond/backend/postgresql/database.py
-trytond/backend/postgresql/fields.py
 trytond/backend/postgresql/init.sql
 trytond/backend/postgresql/table.py
 trytond/backend/sqlite/__init__.py
 trytond/backend/sqlite/database.py
-trytond/backend/sqlite/fields.py
 trytond/backend/sqlite/init.sql
 trytond/backend/sqlite/table.py
 trytond/ir/__init__.py
@@ -117,12 +113,15 @@ trytond/ir/locale/es_ES.po
 trytond/ir/locale/fr_FR.po
 trytond/ir/locale/nl_NL.po
 trytond/ir/locale/ru_RU.po
+trytond/ir/locale/sl_SI.po
 trytond/ir/module/__init__.py
 trytond/ir/module/module.py
 trytond/ir/module/module.xml
 trytond/ir/ui/__init__.py
 trytond/ir/ui/board.rnc
 trytond/ir/ui/board.rng
+trytond/ir/ui/calendar.rnc
+trytond/ir/ui/calendar.rng
 trytond/ir/ui/form.rnc
 trytond/ir/ui/form.rng
 trytond/ir/ui/graph.rnc
@@ -223,8 +222,8 @@ trytond/ir/view/ui_view_form.xml
 trytond/ir/view/ui_view_list.xml
 trytond/ir/view/ui_view_search_form.xml
 trytond/ir/view/ui_view_search_list.xml
-trytond/ir/view/ui_view_tree_expanded_state_form.xml
-trytond/ir/view/ui_view_tree_expanded_state_list.xml
+trytond/ir/view/ui_view_tree_state_form.xml
+trytond/ir/view/ui_view_tree_state_list.xml
 trytond/ir/view/ui_view_tree_width_form.xml
 trytond/ir/view/ui_view_tree_width_list.xml
 trytond/model/__init__.py
@@ -270,8 +269,6 @@ trytond/res/group.py
 trytond/res/group.xml
 trytond/res/ir.py
 trytond/res/ir.xml
-trytond/res/request.py
-trytond/res/request.xml
 trytond/res/res.xml
 trytond/res/tryton.cfg
 trytond/res/user.py
@@ -286,16 +283,9 @@ trytond/res/locale/es_ES.po
 trytond/res/locale/fr_FR.po
 trytond/res/locale/nl_NL.po
 trytond/res/locale/ru_RU.po
+trytond/res/locale/sl_SI.po
 trytond/res/view/group_form.xml
 trytond/res/view/group_list.xml
-trytond/res/view/request_form.xml
-trytond/res/view/request_history_form.xml
-trytond/res/view/request_history_list.xml
-trytond/res/view/request_link_form.xml
-trytond/res/view/request_link_list.xml
-trytond/res/view/request_list.xml
-trytond/res/view/request_reference_form.xml
-trytond/res/view/request_reference_list.xml
 trytond/res/view/sequence_type_form.xml
 trytond/res/view/user_config_start_form.xml
 trytond/res/view/user_form.xml
@@ -303,23 +293,16 @@ trytond/res/view/user_form_preferences.xml
 trytond/res/view/user_list.xml
 trytond/res/view/user_warning_form.xml
 trytond/res/view/user_warning_tree.xml
-trytond/test/__init__.py
-trytond/test/access.py
-trytond/test/copy.py
-trytond/test/export_data.py
-trytond/test/import_data.py
-trytond/test/import_data.xml
-trytond/test/model.py
-trytond/test/mptt.py
-trytond/test/sequence.xml
-trytond/test/test.py
-trytond/test/trigger.py
-trytond/test/tryton.cfg
-trytond/test/wizard.py
-trytond/test/wizard.xml
-trytond/test/workflow.py
-trytond/test/workflow.xml
 trytond/tests/__init__.py
+trytond/tests/access.py
+trytond/tests/copy_.py
+trytond/tests/export_data.py
+trytond/tests/import_data.py
+trytond/tests/import_data.xml
+trytond/tests/model.py
+trytond/tests/mptt.py
+trytond/tests/sequence.xml
+trytond/tests/test.py
 trytond/tests/test_access.py
 trytond/tests/test_cache.py
 trytond/tests/test_copy.py
@@ -338,6 +321,12 @@ trytond/tests/test_trigger.py
 trytond/tests/test_tryton.py
 trytond/tests/test_wizard.py
 trytond/tests/test_workflow.py
+trytond/tests/trigger.py
+trytond/tests/tryton.cfg
+trytond/tests/wizard.py
+trytond/tests/wizard.xml
+trytond/tests/workflow.py
+trytond/tests/workflow.xml
 trytond/tools/StringMatcher.py
 trytond/tools/__init__.py
 trytond/tools/datetime_strftime.py
@@ -358,6 +347,7 @@ trytond/webdav/locale/es_ES.po
 trytond/webdav/locale/fr_FR.po
 trytond/webdav/locale/nl_NL.po
 trytond/webdav/locale/ru_RU.po
+trytond/webdav/locale/sl_SI.po
 trytond/webdav/view/attachment_form.xml
 trytond/webdav/view/collection_form.xml
 trytond/webdav/view/collection_list.xml
diff --git a/trytond.egg-info/requires.txt b/trytond.egg-info/requires.txt
index 2a2591a..efcab94 100644
--- a/trytond.egg-info/requires.txt
+++ b/trytond.egg-info/requires.txt
@@ -3,6 +3,7 @@ relatorio >= 0.2.0
 Genshi
 python-dateutil
 polib
+python-sql >= 0.2
 
 [cdecimal]
 cdecimal
diff --git a/trytond/__init__.py b/trytond/__init__.py
index f9921ca..6fb585c 100644
--- a/trytond/__init__.py
+++ b/trytond/__init__.py
@@ -1,3 +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 . import server
+
+__all__ = ['server']
diff --git a/trytond/backend/__init__.py b/trytond/backend/__init__.py
index 4bf13a9..5620291 100644
--- a/trytond/backend/__init__.py
+++ b/trytond/backend/__init__.py
@@ -1,10 +1,15 @@
 #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
 
 from trytond.config import CONFIG
-if CONFIG['db_type'] == 'sqlite':
-    from .sqlite import *
-elif CONFIG['db_type'] == 'mysql':
-    from .mysql import *
-else:
-    from .postgresql import *
+
+__all__ = ['get']
+
+
+def get(name):
+    db_type = CONFIG['db_type']
+    modname = 'trytond.backend.%s' % db_type
+    __import__(modname)
+    module = sys.modules[modname]
+    return getattr(module, name)
diff --git a/trytond/backend/database.py b/trytond/backend/database.py
index f0d31bf..c80e370 100644
--- a/trytond/backend/database.py
+++ b/trytond/backend/database.py
@@ -10,6 +10,7 @@ class DatabaseInterface(object):
     '''
     Define generic interface for database connection
     '''
+    flavor = None
 
     def __new__(cls, database_name=''):
         return object.__new__(cls)
@@ -101,7 +102,6 @@ class CursorInterface(object):
     '''
     Define generic interface for database cursor
     '''
-    sql_log = False
     IN_MAX = 1000
 
     def __init__(self):
@@ -210,17 +210,6 @@ class CursorInterface(object):
         '''
         raise NotImplementedError
 
-    def limit_clause(self, select, limit=None, offset=None):
-        '''
-        Return SELECT queries with limit and offset
-
-        :param select: the SELECT query string
-        :param limit: the limit
-        :param offset: the offset
-        :return: a string
-        '''
-        raise NotImplementedError
-
     def update_auto_increment(self, table, value):
         '''
         Update auto_increment value of table
diff --git a/trytond/backend/fields.py b/trytond/backend/fields.py
deleted file mode 100644
index a591310..0000000
--- a/trytond/backend/fields.py
+++ /dev/null
@@ -1,200 +0,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.
-import datetime
-from decimal import Decimal
-import hashlib
-try:
-    import simplejson as json
-except ImportError:
-    import json
-
-
-class Field(object):
-
-    @staticmethod
-    def sql_format(value):
-        return value
-
-    @staticmethod
-    def sql_type(field):
-        raise NotImplementedError
-
-
-class Boolean(Field):
-    pass
-
-
-class Integer(Field):
-    pass
-
-
-class BigInteger(Integer):
-    pass
-
-
-class Char(Field):
-
-    @staticmethod
-    def sql_format(value):
-        if value is None:
-            return None
-        elif isinstance(value, str):
-            return unicode(value, 'utf-8')
-        assert isinstance(value, unicode)
-        return value
-
-
-class Sha(Field):
-
-    @staticmethod
-    def sql_format(value):
-        if value is not None:
-            if isinstance(value, unicode):
-                value = value.encode('utf-8')
-            value = hashlib.sha1(value).hexdigest()
-        return Char.sql_format(value)
-
-
-class Text(Char):
-    pass
-
-
-class Float(Field):
-    pass
-
-
-class Numeric(Float):
-
-    @staticmethod
-    def sql_format(value):
-        if value is None:
-            return value
-        if isinstance(value, (int, long)):
-            value = Decimal(str(value))
-        assert isinstance(value, Decimal)
-        return value
-
-
-class Date(Field):
-
-    @staticmethod
-    def sql_format(value):
-        if not value:
-            return None
-        if isinstance(value, basestring):
-            year, month, day = map(int, value.split("-", 2))
-            return datetime.date(year, month, day)
-
-        assert(isinstance(value, datetime.date))
-        # Allow datetime with min time for XML-RPC
-        # datetime must be tested separately because datetime is a
-        # subclass of date
-        assert(not isinstance(value, datetime.datetime)
-            or value.time() == datetime.time())
-        return value
-
-
-class DateTime(Field):
-
-    @staticmethod
-    def sql_format(value):
-        if not value:
-            return None
-        if isinstance(value, basestring):
-            datepart, timepart = value.split(" ")
-            year, month, day = map(int, datepart.split("-", 2))
-            hours, minutes, seconds = map(int, timepart.split(":"))
-            return datetime.datetime(year, month, day, hours, minutes, seconds)
-        assert(isinstance(value, datetime.datetime))
-        return value.replace(microsecond=0)
-
-
-class Timestamp(Field):
-
-    @staticmethod
-    def sql_format(value):
-        if not value:
-            return None
-        if isinstance(value, basestring):
-            datepart, timepart = value.split(" ")
-            year, month, day = map(int, datepart.split("-", 2))
-            timepart_full = timepart.split(".", 1)
-            hours, minutes, seconds = map(int, timepart_full[0].split(":"))
-            if len(timepart_full) == 2:
-                microseconds = int(timepart_full[1])
-            else:
-                microseconds = 0
-            return datetime.datetime(year, month, day, hours, minutes, seconds,
-                    microseconds)
-        assert(isinstance(value, datetime.datetime))
-        return value
-
-
-class Time(Field):
-
-    @staticmethod
-    def sql_format(value):
-        if not value:
-            return None
-        if isinstance(value, basestring):
-            hours, minutes, seconds = map(int, value.split(":"))
-            return datetime.time(hours, minutes, seconds)
-        assert(isinstance(value, datetime.time))
-        return value.replace(microsecond=0)
-
-
-class Binary(Field):
-    pass
-
-
-class Selection(Char):
-    pass
-
-
-class Reference(Char):
-
-    @staticmethod
-    def sql_format(value):
-        if not isinstance(value, basestring):
-            try:
-                value = '%s,%s' % tuple(value)
-            except TypeError:
-                pass
-        return Char.sql_format(value)
-
-
-class Many2One(Field):
-
-    @staticmethod
-    def sql_format(value):
-        if value is None:
-            return None
-        assert value is not False
-        return int(value)
-
-
-class One2Many(Field):
-    pass
-
-
-class Many2Many(Field):
-    pass
-
-
-class Function(Field):
-    pass
-
-
-class Property(Function):
-    pass
-
-
-class Dict(Field):
-
-    @staticmethod
-    def sql_format(value):
-        from trytond.protocols.jsonrpc import JSONEncoder
-        if value is None:
-            return None
-        assert isinstance(value, dict)
-        return json.dumps(value, cls=JSONEncoder)
diff --git a/trytond/backend/mysql/__init__.py b/trytond/backend/mysql/__init__.py
index 71229c0..7f49e23 100644
--- a/trytond/backend/mysql/__init__.py
+++ b/trytond/backend/mysql/__init__.py
@@ -2,5 +2,4 @@
 #this repository contains the full copyright notices and license terms.
 
 from .database import *
-from .fields import *
 from .table import *
diff --git a/trytond/backend/mysql/database.py b/trytond/backend/mysql/database.py
index 724b668..1be7c0b 100644
--- a/trytond/backend/mysql/database.py
+++ b/trytond/backend/mysql/database.py
@@ -7,34 +7,75 @@ import MySQLdb.cursors
 import MySQLdb.converters
 from MySQLdb import IntegrityError as DatabaseIntegrityError
 from MySQLdb import OperationalError as DatabaseOperationalError
-import logging
 import os
-import re
 import time
 import tempfile
+from sql import Flavor, Expression
+from sql.functions import Extract, Overlay, CharLength
 
-QUOTE_SEPARATION = re.compile(r"(.*?)('.*?')", re.DOTALL)
-EXTRACT_EPOCH_PATTERN = re.compile(r'EXTRACT\s*\(\s*EPOCH\s+FROM',
-        re.I)
-CAST_VARCHAR_PATTERN = re.compile(r' AS VARCHAR\)', re.I)
-CAST_INTEGER_PATTERN = re.compile(r' AS (INTEGER|BIGINT)\)', re.I)
-SPLIT_PART_LEFT_PATTERN = re.compile(r'SPLIT_PART\((.*?),', re.I)
-SPLIT_PART_RIGHT_PATTERN = re.compile(r'^,(\d)', re.I)
+__all__ = ['Database', 'DatabaseIntegrityError', 'DatabaseOperationalError',
+    'Cursor']
 
 
-def _replace_split_part_right(mobj):
-    pos = int(mobj.group(1))
-    if pos not in (1, 2):
-        raise Exception('SPLIT_PART is only partially implemented for MySQL')
-    if pos == 2:
-        return ', -1'
-    return ', 1'
+class MySQLExtract(Extract):
+
+    def is_epoch(self):
+        return self.args[0].upper() == 'EPOCH'
+
+    def __str__(self):
+        if self.is_epoch():
+            return 'UNIX_TIMESTAMP(%s)' % self._format(self.args[1])
+        return super(MySQLExtract, self).__str__()
+
+    @property
+    def params(self):
+        if self.is_epoch():
+            arg = self.args[1]
+            if isinstance(arg, Expression):
+                return arg.params
+            else:
+                return (arg,)
+        return super(MySQLExtract, self).params
+
+
+class MySQLOverlay(Overlay):
+
+    @property
+    def mysql_args(self):
+        if len(self.args) == 3:
+            string, placing, from_ = self.args
+            for_ = CharLength(placing)
+        else:
+            string, placing, from_, for_ = self.args
+        return (string, from_, placing, string, from_, for_)
+
+    def __str__(self):
+        return ('CONCAT(SUBSTRING(%s FROM 1 FOR %s), %s, '
+            'SUBSTRING(%s FROM %s + 1 + %s))'
+            % tuple(map(self._format, self.mysql_args)))
+
+    @property
+    def params(self):
+        p = ()
+        for arg in self.mysql_args:
+            if isinstance(arg, Expression):
+                p += arg.params
+            else:
+                p += (arg,)
+        return p
+
+
+MAPPING = {
+    Extract: MySQLExtract,
+    Overlay: MySQLOverlay,
+    }
 
 
 class Database(DatabaseInterface):
 
     _list_cache = None
     _list_cache_timestamp = None
+    flavor = Flavor(max_limit=18446744073709551610, function_mapping=MAPPING)
 
     def connect(self):
         return self
@@ -234,38 +275,10 @@ class Cursor(CursorInterface):
         return getattr(self.cursor, name)
 
     def execute(self, sql, params=None):
-        buf = ""
-        split_part_found = False
-        for nquote, quote in QUOTE_SEPARATION.findall(sql + "''"):
-            nquote = nquote.replace('ilike', 'like')
-            nquote = re.sub(EXTRACT_EPOCH_PATTERN, r'UNIX_TIMESTAMP(',
-                    nquote)
-            nquote = re.sub(CAST_VARCHAR_PATTERN, r' AS CHAR)',
-                    nquote)
-            nquote = re.sub(CAST_INTEGER_PATTERN, r' AS SIGNED INTEGER)',
-                    nquote)
-            if split_part_found:
-                nquote = re.sub(SPLIT_PART_RIGHT_PATTERN,
-                    _replace_split_part_right, nquote)
-                split_part_found = False
-            nquote, split_part_found = re.subn(SPLIT_PART_LEFT_PATTERN,
-                    r'SUBSTRING_INDEX(\1, ', nquote)
-
-            buf += nquote + quote
-        sql = buf[:-2]
-        try:
-            if params:
-                res = self.cursor.execute(sql, params)
-            else:
-                res = self.cursor.execute(sql)
-        except Exception, exception:
-            logger = logging.getLogger('sql')
-            logger.error('Wrong SQL: ' + sql + ' ' + str(params))
-            if isinstance(exception, MySQLdb.Error):
-                exception.args = exception.args[1:]
-                raise exception
-            raise
-        return res
+        if params:
+            return self.cursor.execute(sql, params)
+        else:
+            return self.cursor.execute(sql)
 
     def close(self, close=False):
         self.cursor.close()
diff --git a/trytond/backend/mysql/fields.py b/trytond/backend/mysql/fields.py
deleted file mode 100644
index 8a536d7..0000000
--- a/trytond/backend/mysql/fields.py
+++ /dev/null
@@ -1,156 +0,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.
-from trytond.backend import fields
-
-
-class Boolean(fields.Boolean):
-
-    @staticmethod
-    def sql_type(field):
-        return ('bool', 'bool')
-
-    @staticmethod
-    def sql_format(value):
-        return value
-
-
-class Integer(fields.Integer):
-
-    @staticmethod
-    def sql_type(field):
-        return ('bigint', 'bigint')
-
-
-class BigInteger(fields.BigInteger):
-
-    @staticmethod
-    def sql_type(field):
-        return ('bigint', 'bigint')
-
-
-class Char(fields.Char):
-
-    @staticmethod
-    def sql_type(field):
-        if isinstance(field.size, int):
-            return ('varchar', 'varchar(%d)' % (field.size,))
-        return ('varchar', 'varchar(255)')
-
-
-class Sha(fields.Sha):
-
-    @staticmethod
-    def sql_type(field):
-        return ('varchar', 'varchar(40)')
-
-
-class Text(fields.Text):
-
-    @staticmethod
-    def sql_type(field):
-        return ('text', 'text')
-
-
-class Float(fields.Float):
-
-    @staticmethod
-    def sql_type(field):
-        return ('double', 'double(255, 15)')
-
-
-class Numeric(fields.Numeric):
-
-    @staticmethod
-    def sql_type(field):
-        return ('decimal', 'decimal(65, 30)')
-
-
-class Date(fields.Date):
-
-    @staticmethod
-    def sql_type(field):
-        return ('date', 'date')
-
-
-class DateTime(fields.DateTime):
-
-    @staticmethod
-    def sql_type(field):
-        return ('timestamp', 'timestamp null')
-
-
-class Timestamp(fields.Timestamp):
-
-    @staticmethod
-    def sql_type(field):
-        return ('timestamp', 'timestamp null')
-
-
-class Time(fields.Time):
-
-    @staticmethod
-    def sql_type(field):
-        return ('time', 'time')
-
-
-class Binary(fields.Binary):
-
-    @staticmethod
-    def sql_format(value):
-        return value or None
-
-    @staticmethod
-    def sql_type(field):
-        return ('longblob', 'longblob')
-
-
-class Selection(fields.Selection):
-
-    @staticmethod
-    def sql_type(field):
-        return ('varchar', 'varchar(255)')
-
-
-class Reference(fields.Reference):
-
-    @staticmethod
-    def sql_type(field):
-        return ('varchar', 'varchar(255)')
-
-
-class Many2One(fields.Many2One):
-
-    @staticmethod
-    def sql_type(field):
-        return ('bigint', 'bigint')
-
-
-class Dict(fields.Dict):
-
-    @staticmethod
-    def sql_type(field):
-        return ('text', 'text')
-
-FIELDS = {
-    'boolean': Boolean,
-    'integer': Integer,
-    'biginteger': BigInteger,
-    'char': Char,
-    'sha': Sha,
-    'text': Text,
-    'float': Float,
-    'numeric': Numeric,
-    'date': Date,
-    'datetime': DateTime,
-    'timestamp': Timestamp,
-    'time': Time,
-    'binary': Binary,
-    'selection': Selection,
-    'reference': Reference,
-    'many2one': Many2One,
-    'one2many': fields.One2Many,
-    'many2many': fields.Many2Many,
-    'function': fields.Function,
-    'property': fields.Property,
-    'dict': Dict,
-}
diff --git a/trytond/backend/mysql/table.py b/trytond/backend/mysql/table.py
index 4a5dc7b..3fc878f 100644
--- a/trytond/backend/mysql/table.py
+++ b/trytond/backend/mysql/table.py
@@ -166,6 +166,11 @@ class TableHandler(TableHandlerInterface):
             if not migrate:
                 return
             base_type = column_type[0].lower()
+            convert = {
+                'char': 'varchar',
+                'signed integer': 'bigint',
+                }
+            base_type = convert.get(base_type, base_type)
             if base_type != self._columns[column_name]['typname']:
                 if (self._columns[column_name]['typname'], base_type) in (
                         ('varchar', 'text'),
diff --git a/trytond/backend/postgresql/__init__.py b/trytond/backend/postgresql/__init__.py
index 71229c0..7f49e23 100644
--- a/trytond/backend/postgresql/__init__.py
+++ b/trytond/backend/postgresql/__init__.py
@@ -2,5 +2,4 @@
 #this repository contains the full copyright notices and license terms.
 
 from .database import *
-from .fields import *
 from .table import *
diff --git a/trytond/backend/postgresql/database.py b/trytond/backend/postgresql/database.py
index 16639e6..761a055 100644
--- a/trytond/backend/postgresql/database.py
+++ b/trytond/backend/postgresql/database.py
@@ -21,11 +21,17 @@ import os
 if os.name == 'posix':
     import pwd
 from decimal import Decimal
+from sql import Flavor
+
+__all__ = ['Database', 'DatabaseIntegrityError', 'DatabaseOperationalError',
+    'Cursor']
 
 RE_FROM = re.compile('.* from "?([a-zA-Z_0-9]+)"?.*$')
 RE_INTO = re.compile('.* into "?([a-zA-Z_0-9]+)"?.*$')
 RE_VERSION = re.compile(r'\S+ (\d+)\.(\d+)')
 
+os.environ['PGTZ'] = os.environ.get('TZ', '')
+
 
 class Database(DatabaseInterface):
 
@@ -34,6 +40,7 @@ class Database(DatabaseInterface):
     _list_cache = None
     _list_cache_timestamp = None
     _version_cache = {}
+    flavor = Flavor(ilike=True)
 
     def __new__(cls, database_name='template1'):
         if database_name in cls._databases:
@@ -298,51 +305,12 @@ class Cursor(CursorInterface):
         return getattr(self.cursor, name)
 
     def execute(self, sql, params=None):
-        if self.sql_log:
-            now = time.time()
-
-        try:
-            if params:
-                res = self.cursor.execute(sql, params)
-            else:
-                res = self.cursor.execute(sql)
-        except Exception:
-            logger = logging.getLogger('sql')
-            logger.error('Wrong SQL: ' + (self.cursor.query or ''))
-            raise
-        if self.sql_log:
-            res_from = RE_FROM.match(sql.lower())
-            if res_from:
-                self.sql_from_log.setdefault(res_from.group(1), [0, 0])
-                self.sql_from_log[res_from.group(1)][0] += 1
-                self.sql_from_log[res_from.group(1)][1] += time.time() - now
-                self.count['from'] += 1
-            res_into = RE_INTO.match(sql.lower())
-            if res_into:
-                self.sql_into_log.setdefault(res_into.group(1), [0, 0])
-                self.sql_into_log[res_into.group(1)][0] += 1
-                self.sql_into_log[res_into.group(1)][1] += time.time() - now
-                self.count['into'] += 1
-        return res
-
-    def _print_log(self, sql_type='from'):
-        logger = logging.getLogger('sql')
-        logger.info("SQL LOG %s:" % (sql_type,))
-        if sql_type == 'from':
-            logs = self.sql_from_log.items()
+        if params:
+            return self.cursor.execute(sql, params)
         else:
-            logs = self.sql_into_log.items()
-        logs.sort(lambda x, y: cmp(x[1][1], y[1][1]))
-        amount = 0
-        for log in logs:
-            logger.info("table:%s:%f/%d" % (log[0], log[1][1], log[1][0]))
-            amount += log[1][1]
-        logger.info("SUM:%s/%d" % (amount, self.count[sql_type]))
+            return self.cursor.execute(sql)
 
     def close(self, close=False):
-        if self.sql_log:
-            self._print_log('from')
-            self._print_log('into')
         self.cursor.close()
         self.rollback()
         self._connpool.putconn(self._conn, close=close)
diff --git a/trytond/backend/postgresql/fields.py b/trytond/backend/postgresql/fields.py
deleted file mode 100644
index c4ba85c..0000000
--- a/trytond/backend/postgresql/fields.py
+++ /dev/null
@@ -1,153 +0,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.
-import psycopg2
-from trytond.backend import fields
-
-
-class Boolean(fields.Boolean):
-
-    @staticmethod
-    def sql_type(field):
-        return ('bool', 'bool')
-
-
-class Integer(fields.Integer):
-
-    @staticmethod
-    def sql_type(field):
-        return ('int4', 'int4')
-
-
-class BigInteger(fields.BigInteger):
-
-    @staticmethod
-    def sql_type(field):
-        return ('int8', 'int8')
-
-
-class Char(fields.Char):
-
-    @staticmethod
-    def sql_type(field):
-        if isinstance(field.size, int):
-            return ('varchar', 'varchar(%d)' % (field.size,))
-        return ('varchar', 'varchar')
-
-
-class Sha(fields.Sha):
-
-    @staticmethod
-    def sql_type(field):
-        return ('varchar', 'varchar(40)')
-
-
-class Text(fields.Text):
-
-    @staticmethod
-    def sql_type(field):
-        return ('text', 'text')
-
-
-class Float(fields.Float):
-
-    @staticmethod
-    def sql_type(field):
-        return ('float8', 'float8')
-
-
-class Numeric(fields.Numeric):
-
-    @staticmethod
-    def sql_type(field):
-        return ('numeric', 'numeric')
-
-
-class Date(fields.Date):
-
-    @staticmethod
-    def sql_type(field):
-        return ('date', 'date')
-
-
-class DateTime(fields.DateTime):
-
-    @staticmethod
-    def sql_type(field):
-        return ('timestamp', 'timestamp(0)')
-
-
-class Timestamp(fields.Timestamp):
-
-    @staticmethod
-    def sql_type(field):
-        return ('timestamp', 'timestamp(6)')
-
-
-class Time(fields.Time):
-
-    @staticmethod
-    def sql_type(field):
-        return ('time', 'time')
-
-
-class Binary(fields.Binary):
-
-    @staticmethod
-    def sql_format(value):
-        return value and psycopg2.Binary(value) or None
-
-    @staticmethod
-    def sql_type(field):
-        return ('bytea', 'bytea')
-
-
-class Selection(fields.Selection):
-
-    @staticmethod
-    def sql_type(field):
-        return ('varchar', 'varchar')
-
-
-class Reference(fields.Reference):
-
-    @staticmethod
-    def sql_type(field):
-        return ('varchar', 'varchar')
-
-
-class Many2One(fields.Many2One):
-
-    @staticmethod
-    def sql_type(field):
-        return ('int4', 'int4')
-
-
-class Dict(fields.Dict):
-
-    @staticmethod
-    def sql_type(field):
-        return ('text', 'text')
-
-FIELDS = {
-    'boolean': Boolean,
-    'integer': Integer,
-    'biginteger': BigInteger,
-    'char': Char,
-    'sha': Sha,
-    'text': Text,
-    'float': Float,
-    'numeric': Numeric,
-    'date': Date,
-    'datetime': DateTime,
-    'timestamp': Timestamp,
-    'time': Time,
-    'binary': Binary,
-    'selection': Selection,
-    'reference': Reference,
-    'many2one': Many2One,
-    'one2many': fields.One2Many,
-    'many2many': fields.Many2Many,
-    'function': fields.Function,
-    'property': fields.Property,
-    'dict': Dict,
-}
diff --git a/trytond/backend/postgresql/table.py b/trytond/backend/postgresql/table.py
index 1c3a2e9..be4478f 100644
--- a/trytond/backend/postgresql/table.py
+++ b/trytond/backend/postgresql/table.py
@@ -4,6 +4,8 @@
 from trytond.backend.table import TableHandlerInterface
 import logging
 
+__all__ = ['TableHandler']
+
 
 class TableHandler(TableHandlerInterface):
 
diff --git a/trytond/backend/sqlite/__init__.py b/trytond/backend/sqlite/__init__.py
index 71229c0..7f49e23 100644
--- a/trytond/backend/sqlite/__init__.py
+++ b/trytond/backend/sqlite/__init__.py
@@ -2,5 +2,4 @@
 #this repository contains the full copyright notices and license terms.
 
 from .database import *
-from .fields import *
 from .table import *
diff --git a/trytond/backend/sqlite/database.py b/trytond/backend/sqlite/database.py
index 0f2123f..d754289 100644
--- a/trytond/backend/sqlite/database.py
+++ b/trytond/backend/sqlite/database.py
@@ -3,7 +3,6 @@
 from trytond.backend.database import DatabaseInterface, CursorInterface
 from trytond.config import CONFIG
 import os
-import re
 from decimal import Decimal
 import datetime
 import time
@@ -21,49 +20,56 @@ except ImportError:
     import sqlite3 as sqlite
     from sqlite3 import IntegrityError as DatabaseIntegrityError
     from sqlite3 import OperationalError as DatabaseOperationalError
-QUOTE_SEPARATION = re.compile(r"(.*?)('.*?')", re.DOTALL)
-EXTRACT_PATTERN = re.compile(r'EXTRACT\s*\(\s*(\S*)\s+FROM', re.I)
-POSITION_PATTERN = re.compile(r'POSITION\s*\(([^\)]*)\s+IN', re.I)
+from sql import Flavor, Table
+from sql.functions import Function, Extract, Position, Now, Substring, Overlay
 
+__all__ = ['Database', 'DatabaseIntegrityError', 'DatabaseOperationalError',
+    'Cursor']
 
-def extract(lookup_type, date):
-    if date is None:
-        return None
-    if len(date) == 10:
-        year, month, day = map(int, date.split('-'))
-        date = datetime.date(year, month, day)
-    else:
-        datepart, timepart = date.split(" ")
-        year, month, day = map(int, datepart.split("-"))
-        timepart_full = timepart.split(".")
-        hours, minutes, seconds = map(int, timepart_full[0].split(":"))
-        if len(timepart_full) == 2:
-            microseconds = int(timepart_full[1])
+
+class SQLiteExtract(Function):
+    __slots__ = ()
+    _function = 'EXTRACT'
+
+    @staticmethod
+    def extract(lookup_type, date):
+        if date is None:
+            return None
+        if len(date) == 10:
+            year, month, day = map(int, date.split('-'))
+            date = datetime.date(year, month, day)
         else:
-            microseconds = 0
-        date = datetime.datetime(year, month, day, hours, minutes, seconds,
-            microseconds)
-    if lookup_type.lower() == 'century':
-        return date.year / 100 + (date.year % 100 and 1 or 0)
-    elif lookup_type.lower() == 'decade':
-        return date.year / 10
-    elif lookup_type.lower() == 'dow':
-        return (date.weekday() + 1) % 7
-    elif lookup_type.lower() == 'doy':
-        return date.timetuple().tm_yday
-    elif lookup_type.lower() == 'epoch':
-        return int(time.mktime(date.timetuple()))
-    elif lookup_type.lower() == 'microseconds':
-        return date.microsecond
-    elif lookup_type.lower() == 'millennium':
-        return date.year / 1000 + (date.year % 1000 and 1 or 0)
-    elif lookup_type.lower() == 'milliseconds':
-        return date.microsecond / 1000
-    elif lookup_type.lower() == 'quarter':
-        return date.month / 4 + 1
-    elif lookup_type.lower() == 'week':
-        return date.isocalendar()[1]
-    return getattr(date, lookup_type.lower())
+            datepart, timepart = date.split(" ")
+            year, month, day = map(int, datepart.split("-"))
+            timepart_full = timepart.split(".")
+            hours, minutes, seconds = map(int, timepart_full[0].split(":"))
+            if len(timepart_full) == 2:
+                microseconds = int(timepart_full[1])
+            else:
+                microseconds = 0
+            date = datetime.datetime(year, month, day, hours, minutes, seconds,
+                microseconds)
+        if lookup_type.lower() == 'century':
+            return date.year / 100 + (date.year % 100 and 1 or 0)
+        elif lookup_type.lower() == 'decade':
+            return date.year / 10
+        elif lookup_type.lower() == 'dow':
+            return (date.weekday() + 1) % 7
+        elif lookup_type.lower() == 'doy':
+            return date.timetuple().tm_yday
+        elif lookup_type.lower() == 'epoch':
+            return int(time.mktime(date.timetuple()))
+        elif lookup_type.lower() == 'microseconds':
+            return date.microsecond
+        elif lookup_type.lower() == 'millennium':
+            return date.year / 1000 + (date.year % 1000 and 1 or 0)
+        elif lookup_type.lower() == 'milliseconds':
+            return date.microsecond / 1000
+        elif lookup_type.lower() == 'quarter':
+            return date.month / 4 + 1
+        elif lookup_type.lower() == 'week':
+            return date.isocalendar()[1]
+        return getattr(date, lookup_type.lower())
 
 
 def date_trunc(_type, date):
@@ -88,23 +94,57 @@ def split_part(text, delimiter, count):
     return (text.split(delimiter) + [''] * (count - 1))[count - 1]
 
 
-def position(substring, string):
-    if string is None:
-        return
-    try:
-        return string.index(substring) + 1
-    except ValueError:
-        return 0
+class SQLitePosition(Function):
+    __slots__ = ()
+    _function = 'POSITION'
+
+    @staticmethod
+    def position(substring, string):
+        if string is None:
+            return
+        try:
+            return string.index(substring) + 1
+        except ValueError:
+            return 0
 
 
 def replace(text, pattern, replacement):
     return str(text).replace(pattern, replacement)
 
 
+def now():
+    return datetime.datetime.now().isoformat(' ')
+
+
+class SQLiteSubstring(Function):
+    __slots__ = ()
+    _function = 'SUBSTR'
+
+
+class SQLiteOverlay(Function):
+    __slots__ = ()
+    _function = 'OVERLAY'
+
+    @staticmethod
+    def overlay(string, placing_string, from_, for_=None):
+        if for_ is None:
+            for_ = len(placing_string)
+        return string[:from_ - 1] + placing_string + string[from_ - 1 + for_:]
+
+
+MAPPING = {
+    Extract: SQLiteExtract,
+    Position: SQLitePosition,
+    Substring: SQLiteSubstring,
+    Overlay: SQLiteOverlay,
+    }
+
+
 class Database(DatabaseInterface):
 
     _local = threading.local()
     _conn = None
+    flavor = Flavor(paramstyle='qmark', function_mapping=MAPPING)
 
     def __new__(cls, database_name=':memory:'):
         if (database_name == ':memory:'
@@ -129,12 +169,16 @@ class Database(DatabaseInterface):
         if self._conn is not None:
             return self
         self._conn = sqlite.connect(path, detect_types=sqlite.PARSE_DECLTYPES)
-        self._conn.create_function('extract', 2, extract)
+        self._conn.create_function('extract', 2, SQLiteExtract.extract)
         self._conn.create_function('date_trunc', 2, date_trunc)
         self._conn.create_function('split_part', 3, split_part)
-        self._conn.create_function('position', 2, position)
+        self._conn.create_function('position', 2, SQLitePosition.position)
+        self._conn.create_function('overlay', 3, SQLiteOverlay.overlay)
+        self._conn.create_function('overlay', 4, SQLiteOverlay.overlay)
         if sqlite.sqlite_version_info < (3, 3, 14):
             self._conn.create_function('replace', 3, replace)
+        self._conn.create_function('now', 0, now)
+        self._conn.execute('PRAGMA foreign_keys = ON')
         return self
 
     def cursor(self, autocommit=False, readonly=False):
@@ -232,22 +276,28 @@ class Database(DatabaseInterface):
                 if (len(line) > 0) and (not line.isspace()):
                     cursor.execute(line)
 
+        ir_module = Table('ir_module_module')
+        ir_module_dependency = Table('ir_module_module_dependency')
         for module in ('ir', 'res', 'webdav'):
             state = 'uninstalled'
             if module in ('ir', 'res'):
                 state = 'to install'
             info = get_module_info(module)
-            cursor.execute('INSERT INTO ir_module_module '
-                '(create_uid, create_date, name, state) '
-                'VALUES (%s, %s, %s, %s)',
-                (0, datetime.datetime.now(), module, state))
+            insert = ir_module.insert(
+                [ir_module.create_uid, ir_module.create_date, ir_module.name,
+                    ir_module.state],
+                [[0, Now(), module, state]])
+            cursor.execute(*insert)
             cursor.execute('SELECT last_insert_rowid()')
             module_id, = cursor.fetchone()
             for dependency in info.get('depends', []):
-                cursor.execute('INSERT INTO ir_module_module_dependency '
-                    '(create_uid, create_date, module, name) '
-                    'VALUES (%s, %s, %s, %s) ',
-                    (0, datetime.datetime.now(), module_id, dependency))
+                insert = ir_module_dependency.insert(
+                    [ir_module_dependency.create_uid,
+                        ir_module_dependency.create_date,
+                        ir_module_dependency.module, ir_module_dependency.name
+                        ],
+                    [[0, Now(), module_id, dependency]])
+                cursor.execute(*insert)
 
 
 class _Cursor(sqlite.Cursor):
@@ -288,23 +338,10 @@ class Cursor(CursorInterface):
         return getattr(self.cursor, name)
 
     def execute(self, sql, params=None):
-        buf = ""
-        sql = re.sub(POSITION_PATTERN, r'POSITION(\1,', sql)
-        for nquote, quote in QUOTE_SEPARATION.findall(sql + "''"):
-            nquote = nquote.replace('?', '??')
-            nquote = nquote.replace('%s', '?')
-            nquote = nquote.replace('ilike', 'like')
-            nquote = re.sub(EXTRACT_PATTERN, r'EXTRACT("\1",', nquote)
-            buf += nquote + quote
-        sql = buf[:-2]
-        try:
-            if params:
-                res = self.cursor.execute(sql, params)
-            else:
-                res = self.cursor.execute(sql)
-        except Exception:
-            raise
-        return res
+        if params:
+            return self.cursor.execute(sql, params)
+        else:
+            return self.cursor.execute(sql)
 
     def close(self, close=False):
         self.cursor.close()
@@ -319,21 +356,23 @@ class Cursor(CursorInterface):
         self._conn.rollback()
 
     def test(self):
+        sqlite_master = Table('sqlite_master')
+        select = sqlite_master.select(sqlite_master.name)
+        select.where = sqlite_master.type == 'table'
+        select.where &= sqlite_master.name.in_([
+                'ir_model',
+                'ir_model_field',
+                'ir_ui_view',
+                'ir_ui_menu',
+                'res_user',
+                'res_group',
+                'ir_module_module',
+                'ir_module_module_dependency',
+                'ir_translation',
+                'ir_lang',
+                ])
         try:
-            self.cursor.execute("SELECT name "
-                "FROM sqlite_master "
-                "WHERE type = 'table' AND name in ("
-                    "'ir_model', "
-                    "'ir_model_field', "
-                    "'ir_ui_view', "
-                    "'ir_ui_menu', "
-                    "'res_user', "
-                    "'res_group', "
-                    "'ir_module_module', "
-                    "'ir_module_module_dependency', "
-                    "'ir_translation', "
-                    "'ir_lang'"
-                    ")")
+            self.cursor.execute(*select)
         except Exception:
             return False
         return len(self.cursor.fetchall()) != 0
@@ -348,15 +387,6 @@ class Cursor(CursorInterface):
     def has_constraint(self):
         return False
 
-    def limit_clause(self, select, limit=None, offset=None):
-        if limit is not None:
-            select += ' LIMIT %d' % limit
-        if offset is not None:
-            if limit is None:
-                select += ' LIMIT -1'
-            select += ' OFFSET %d' % offset
-        return select
-
 sqlite.register_converter('NUMERIC', lambda val: Decimal(val))
 if sys.version_info[0] == 2:
     sqlite.register_adapter(Decimal, lambda val: buffer(str(val)))
diff --git a/trytond/backend/sqlite/fields.py b/trytond/backend/sqlite/fields.py
deleted file mode 100644
index e9a3252..0000000
--- a/trytond/backend/sqlite/fields.py
+++ /dev/null
@@ -1,159 +0,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.
-from trytond.backend import fields
-
-
-class Boolean(fields.Boolean):
-
-    @staticmethod
-    def sql_format(value):
-        return value
-
-    @staticmethod
-    def sql_type(field):
-        return ('BOOLEAN', 'BOOLEAN')
-
-
-class Integer(fields.Integer):
-
-    @staticmethod
-    def sql_format(value):
-        if value is None:
-            return value
-        return int(value)
-
-    @staticmethod
-    def sql_type(field):
-        return ('INTEGER', 'INTEGER')
-
-
-class BigInteger(fields.BigInteger, Integer):
-    pass
-
-
-class Char(fields.Char):
-
-    @staticmethod
-    def sql_type(field):
-        return ('VARCHAR', 'VARCHAR')
-
-
-class Sha(fields.Sha):
-
-    @staticmethod
-    def sql_type(field):
-        return ('VARCHAR', 'VARCHAR(40)')
-
-
-class Text(fields.Text):
-
-    @staticmethod
-    def sql_type(field):
-        return ('TEXT', 'TEXT')
-
-
-class Float(fields.Float):
-
-    @staticmethod
-    def sql_format(value):
-        if value is None:
-            return value
-        return float(value)
-
-    @staticmethod
-    def sql_type(field):
-        return ('FLOAT', 'FLOAT')
-
-
-class Numeric(fields.Numeric):
-
-    @staticmethod
-    def sql_type(field):
-        return ('NUMERIC', 'NUMERIC')
-
-
-class Date(fields.Date):
-
-    @staticmethod
-    def sql_type(field):
-        return ('DATE', 'DATE')
-
-
-class DateTime(fields.DateTime):
-
-    @staticmethod
-    def sql_type(field):
-        return ('TIMESTAMP', 'TIMESTAMP')
-
-
-class Timestamp(fields.Timestamp):
-
-    @staticmethod
-    def sql_type(field):
-        return ('TIMESTAMP', 'TIMESTAMP')
-
-
-class Time(fields.Time):
-
-    @staticmethod
-    def sql_type(field):
-        return ('TIME', 'TIME')
-
-
-class Binary(fields.Binary):
-
-    @staticmethod
-    def sql_type(field):
-        return ('BLOB', 'BLOB')
-
-
-class Selection(fields.Selection):
-
-    @staticmethod
-    def sql_type(field):
-        return ('VARCHAR', 'VARCHAR')
-
-
-class Reference(fields.Reference):
-
-    @staticmethod
-    def sql_type(field):
-        return ('VARCHAR', 'VARCHAR')
-
-
-class Many2One(fields.Many2One):
-
-    @staticmethod
-    def sql_type(field):
-        return ('INTEGER', 'INTEGER')
-
-
-class Dict(fields.Dict):
-
-    @staticmethod
-    def sql_type(field):
-        return ('TEXT', 'TEXT')
-
-FIELDS = {
-    'boolean': Boolean,
-    'integer': Integer,
-    'biginteger': BigInteger,
-    'char': Char,
-    'sha': Sha,
-    'text': Text,
-    'float': Float,
-    'numeric': Numeric,
-    'date': Date,
-    'datetime': DateTime,
-    'timestamp': Timestamp,
-    'time': Time,
-    'binary': Binary,
-    'selection': Selection,
-    'reference': Reference,
-    'many2one': Many2One,
-    'one2many': fields.One2Many,
-    'many2many': fields.Many2Many,
-    'function': fields.Function,
-    'property': fields.Property,
-    'dict': Dict,
-}
diff --git a/trytond/backend/sqlite/table.py b/trytond/backend/sqlite/table.py
index d1e8559..f2fafcb 100644
--- a/trytond/backend/sqlite/table.py
+++ b/trytond/backend/sqlite/table.py
@@ -5,6 +5,8 @@ from trytond.backend.table import TableHandlerInterface
 import logging
 import re
 
+__all__ = ['TableHandler']
+
 
 class TableHandler(TableHandlerInterface):
     def __init__(self, cursor, model, module_name=None, history=False):
@@ -33,7 +35,7 @@ class TableHandler(TableHandlerInterface):
     @staticmethod
     def table_exist(cursor, table_name):
         cursor.execute("SELECT sql FROM sqlite_master "
-            "WHERE type = 'table' AND name = %s",
+            "WHERE type = 'table' AND name = ?",
             (table_name,))
         res = cursor.fetchone()
         if not res:
@@ -151,7 +153,7 @@ class TableHandler(TableHandlerInterface):
             self.cursor.execute('SELECT f.name, f.module '
                 'FROM ir_model_field f '
                 'JOIN ir_model m on (f.model=m.id) '
-                'WHERE m.model = %s',
+                'WHERE m.model = ?',
                 (self.object_name,))
             for line in self.cursor.fetchall():
                 self._field2module[line[0]] = line[1]
@@ -230,7 +232,7 @@ class TableHandler(TableHandlerInterface):
                 if default_fun is not None:
                     default = default_fun()
                 self.cursor.execute('UPDATE "' + self.table_name + '" '
-                    'SET "' + column_name + '" = %s',
+                    'SET "' + column_name + '" = ?',
                     (column_format(default),))
 
         self._update_definitions()
diff --git a/trytond/cache.py b/trytond/cache.py
index d34b124..e7ccbd2 100644
--- a/trytond/cache.py
+++ b/trytond/cache.py
@@ -4,7 +4,7 @@ import datetime
 from threading import Lock
 from trytond.transaction import Transaction
 from trytond.config import CONFIG
-from trytond.backend import Database
+from trytond import backend
 from trytond.tools import OrderedDict
 
 __all__ = ['Cache', 'LRUDict']
@@ -63,6 +63,7 @@ class Cache(object):
                 cache[key] = value
             except TypeError:
                 pass
+        return value
 
     def clear(self):
         cursor = Transaction().cursor
@@ -74,7 +75,7 @@ class Cache(object):
     def clean(dbname):
         if not CONFIG['multi_server']:
             return
-        database = Database(dbname).connect()
+        database = backend.get('Database')(dbname).connect()
         cursor = database.cursor()
         try:
             cursor.execute('SELECT "timestamp", "name" FROM ir_cache')
@@ -104,7 +105,7 @@ class Cache(object):
     def resets(dbname):
         if not CONFIG['multi_server']:
             return
-        database = Database(dbname).connect()
+        database = backend.get('Database')(dbname).connect()
         cursor = database.cursor()
         try:
             with Cache._resets_lock:
diff --git a/trytond/config.py b/trytond/config.py
index 4f4d5a6..417ea58 100644
--- a/trytond/config.py
+++ b/trytond/config.py
@@ -12,6 +12,8 @@ except ImportError:
 import os
 import ConfigParser
 import time
+import getpass
+import socket
 
 
 def get_hostname(netloc):
@@ -69,6 +71,8 @@ class ConfigManager(object):
             'smtp_tls': False,
             'smtp_user': False,
             'smtp_password': False,
+            'smtp_default_from_email': '%s@%s' % (
+                getpass.getuser(), socket.getfqdn()),
             'data_path': '/var/lib/trytond',
             'multi_server': False,
             'session_timeout': 600,
@@ -104,15 +108,17 @@ class ConfigManager(object):
 
     def update_etc(self, configfile=None):
         if configfile is None:
-            prefixdir = os.path.abspath(os.path.normpath(os.path.join(
-                os.path.dirname(sys.prefix), '..')))
-            configfile = os.path.join(prefixdir, 'etc', 'trytond.conf')
-            if not os.path.isfile(configfile):
-                configdir = os.path.abspath(os.path.normpath(os.path.join(
-                    os.path.dirname(__file__), '..')))
-                configfile = os.path.join(configdir, 'etc', 'trytond.conf')
-            if not os.path.isfile(configfile):
-                configfile = None
+            configfile = os.environ.get('TRYTOND_CONFIG')
+            if not configfile:
+                prefixdir = os.path.abspath(os.path.normpath(os.path.join(
+                    os.path.dirname(sys.prefix), '..')))
+                configfile = os.path.join(prefixdir, 'etc', 'trytond.conf')
+                if not os.path.isfile(configfile):
+                    configdir = os.path.abspath(os.path.normpath(os.path.join(
+                        os.path.dirname(__file__), '..')))
+                    configfile = os.path.join(configdir, 'etc', 'trytond.conf')
+                if not os.path.isfile(configfile):
+                    configfile = None
 
         self.configfile = configfile
         if not self.configfile:
diff --git a/trytond/convert.py b/trytond/convert.py
index 852a252..259db7f 100644
--- a/trytond/convert.py
+++ b/trytond/convert.py
@@ -8,9 +8,13 @@ import logging
 import traceback
 import sys
 import re
-from trytond.version import VERSION
-from trytond.tools import safe_eval
-from trytond.transaction import Transaction
+from sql import Table
+from itertools import izip
+from collections import defaultdict
+
+from .version import VERSION
+from .tools import safe_eval
+from .transaction import Transaction
 
 CDATA_START = re.compile('^\s*\<\!\[cdata\[', re.IGNORECASE)
 CDATA_END = re.compile('\]\]\>\s*$', re.IGNORECASE)
@@ -61,26 +65,37 @@ class MenuitemTagHandler:
             action_id = self.mh.get_id(values['action'])
 
             # TODO maybe use a prefetch for this:
-            cursor.execute(cursor.limit_clause(
-                    "SELECT a.name, a.type, v.type, v.field_childs, icon.name "
-                    "FROM ir_action a "
-                        "LEFT JOIN ir_action_report report "
-                            "ON (a.id = report.action) "
-                        "LEFT JOIN ir_action_act_window act "
-                            "ON (a.id = act.action) "
-                        "LEFT JOIN ir_action_wizard wizard "
-                            "ON (a.id = wizard.action) "
-                        "LEFT JOIN ir_action_url url ON (a.id = url.action) "
-                        "LEFT JOIN ir_action_act_window_view wv ON "
-                            "(act.id = wv.act_window) "
-                        "LEFT JOIN ir_ui_view v ON (v.id = wv.view) "
-                        "LEFT JOIN ir_ui_icon icon ON (a.icon = icon.id) "
-                    "WHERE report.id = %s "
-                        "OR act.id = %s "
-                        "OR wizard.id = %s "
-                        "OR url.id = %s "
-                    "ORDER by wv.sequence", 1),
-                (action_id, action_id, action_id, action_id))
+            action = Table('ir_action')
+            report = Table('ir_action_report')
+            act_window = Table('ir_action_act_window')
+            wizard = Table('ir_action_wizard')
+            url = Table('ir_action_url')
+            act_window_view = Table('ir_action_act_window_view')
+            view = Table('ir_ui_view')
+            icon = Table('ir_ui_icon')
+            cursor.execute(*action.join(
+                    report, 'LEFT',
+                    condition=action.id == report.action
+                    ).join(act_window, 'LEFT',
+                    condition=action.id == act_window.action
+                    ).join(wizard, 'LEFT',
+                    condition=action.id == wizard.action
+                    ).join(url, 'LEFT',
+                    condition=action.id == url.action
+                    ).join(act_window_view, 'LEFT',
+                    condition=act_window.id == act_window_view.act_window
+                    ).join(view, 'LEFT',
+                    condition=view.id == act_window_view.view
+                    ).join(icon, 'LEFT',
+                    condition=action.icon == icon.id).select(
+                    action.name, action.type,
+                    view.type, view.field_childs,
+                    icon.name,
+                    where=(report.id == action_id)
+                    | (act_window.id == action_id)
+                    | (wizard.id == action_id)
+                    | (url.id == action_id),
+                    order_by=act_window_view.sequence, limit=1))
             action_name, action_type, view_type, field_childs, icon_name = \
                 cursor.fetchone()
 
@@ -374,7 +389,7 @@ class Fs2bdAccessor:
 
 class TrytondXmlHandler(sax.handler.ContentHandler):
 
-    def __init__(self, pool, module,):
+    def __init__(self, pool, module, module_state):
         "Register known taghandlers, and managed tags."
         sax.handler.ContentHandler.__init__(self)
 
@@ -384,6 +399,9 @@ class TrytondXmlHandler(sax.handler.ContentHandler):
         self.fs2db = Fs2bdAccessor(self.ModelData, pool)
         self.to_delete = self.populate_to_delete()
         self.noupdate = None
+        self.module_state = module_state
+        self.grouped = None
+        self.grouped_creations = defaultdict(dict)
         self.skip_data = False
 
         # Tag handlders are used to delegate the processing
@@ -430,6 +448,7 @@ class TrytondXmlHandler(sax.handler.ContentHandler):
 
             elif name == "data":
                 self.noupdate = bool(int(attributes.get("noupdate", '0')))
+                self.grouped = bool(int(attributes.get('grouped', 0)))
                 if self.pool.test and \
                         bool(int(attributes.get("skiptest", '0'))):
                     self.skip_data = True
@@ -452,10 +471,17 @@ class TrytondXmlHandler(sax.handler.ContentHandler):
 
     def endElement(self, name):
 
+        if name == 'data' and self.grouped:
+            for model, values in self.grouped_creations.iteritems():
+                self.create_records(model, values.values(), values.keys())
+            self.grouped_creations.clear()
+
         # Closing tag found, if we are in a delegation the handler
         # know what to do:
         if self.taghandler and not self.skip_data:
             self.taghandler = self.taghandler.endElement(name)
+        if self.taghandler == self.taghandlerlist.get(name):
+            self.taghandler = None
 
     def current_state(self):
         if self.taghandler:
@@ -545,7 +571,7 @@ class TrytondXmlHandler(sax.handler.ContentHandler):
             if module == self.module and fs_id in self.to_delete:
                 self.to_delete.remove(fs_id)
 
-            if self.noupdate:
+            if self.noupdate and self.module_state != 'to install':
                 return
 
             # this record is already in the db:
@@ -675,30 +701,43 @@ class TrytondXmlHandler(sax.handler.ContentHandler):
             self.fs2db.reset_browsercord(module, Model.__name__, [record.id])
 
         else:
-            # this record is new, create it in the db:
-            with Transaction().set_context(module=module, language='en_US'):
-                record, = Model.create([values])
+            if self.grouped:
+                self.grouped_creations[model][fs_id] = values
+            else:
+                self.create_records(model, [values], [fs_id])
+
+    def create_records(self, model, vlist, fs_ids):
+        Model = self.pool.get(model)
 
-            # re-read it: this ensure that we store the real value
-            # in the model_data table:
-            record = Model(record.id)
+        with Transaction().set_context(module=self.module, language='en_US'):
+            records = Model.create(vlist)
+
+        mdata_values = []
+        for record, values, fs_id in izip(records, vlist, fs_ids):
             for key in values:
                 values[key] = self._clean_value(key, record)
 
-            mdata, = self.ModelData.create([{
-                        'fs_id': fs_id,
-                        'model': model,
-                        'module': module,
-                        'db_id': record.id,
-                        'values': str(values),
-                        'noupdate': self.noupdate,
-                        }])
-
-            # update fs2db:
-            self.fs2db.set(module, fs_id, {
-                    "db_id": record.id, "model": model,
-                    "id": mdata.id, "values": str(values)})
-            self.fs2db.reset_browsercord(module, model, [record.id])
+            mdata_values.append({
+                    'fs_id': fs_id,
+                    'model': model,
+                    'module': self.module,
+                    'db_id': record.id,
+                    'values': str(values),
+                    'noupdate': self.noupdate,
+                    })
+
+        models_data = self.ModelData.create(mdata_values)
+
+        for record, values, fs_id, mdata in izip(
+                records, vlist, fs_ids, models_data):
+            self.fs2db.set(self.module, fs_id, {
+                    'db_id': record.id,
+                    'model': model,
+                    'id': mdata.id,
+                    'values': str(values),
+                    })
+        self.fs2db.reset_browsercord(self.module, model,
+            [r.id for r in records])
 
 
 def post_import(pool, module, to_delete):
diff --git a/trytond/error.py b/trytond/error.py
index 0dc4a60..cb61f70 100644
--- a/trytond/error.py
+++ b/trytond/error.py
@@ -8,6 +8,10 @@ from trytond.exceptions import UserError, UserWarning
 class WarningErrorMixin(object):
 
     @classmethod
+    def _get_error_messages(cls):
+        return cls._error_messages.values()
+
+    @classmethod
     def raise_user_error(cls, error, error_args=None,
             error_description='', error_description_args=None,
             raise_exception=True):
@@ -38,7 +42,7 @@ class WarningErrorMixin(object):
         if res:
             error = res
 
-        if error_args:
+        if error_args is not None:
             try:
                 error = error % error_args
             except TypeError:
diff --git a/trytond/ir/__init__.py b/trytond/ir/__init__.py
index a1fe52e..ef6e0c1 100644
--- a/trytond/ir/__init__.py
+++ b/trytond/ir/__init__.py
@@ -41,7 +41,7 @@ def register():
         View,
         ShowViewStart,
         ViewTreeWidth,
-        ViewTreeExpandedState,
+        ViewTreeState,
         ViewSearch,
         Icon,
         Property,
diff --git a/trytond/ir/action.py b/trytond/ir/action.py
index 84362f5..25a5bfa 100644
--- a/trytond/ir/action.py
+++ b/trytond/ir/action.py
@@ -6,9 +6,12 @@ from operator import itemgetter
 from collections import defaultdict
 from functools import partial
 
+from sql import Table
+from sql.aggregate import Count
+
 from ..model import ModelView, ModelStorage, ModelSQL, fields
 from ..tools import file_open, safe_eval
-from ..backend import TableHandler
+from .. import backend
 from ..pyson import PYSONEncoder, CONTEXT, PYSON
 from ..transaction import Transaction
 from ..pool import Pool
@@ -124,6 +127,7 @@ class ActionKeyword(ModelSQL, ModelView):
 
     @classmethod
     def __register__(cls, module_name):
+        TableHandler = backend.get('TableHandler')
         super(ActionKeyword, cls).__register__(module_name)
 
         table = TableHandler(Transaction().cursor, cls, module_name)
@@ -291,6 +295,7 @@ class ActionMixin(ModelSQL):
     def create(cls, vlist):
         pool = Pool()
         Action = pool.get('ir.action')
+        ir_action = cls.__table__()
         new_records = []
         for values in vlist:
             later = {}
@@ -313,8 +318,9 @@ class ActionMixin(ModelSQL):
             else:
                 action = Action(values['action'])
             record, = super(ActionMixin, cls).create([values])
-            cursor.execute('UPDATE "' + cls._table + '" SET id = %s '
-                'WHERE id = %s', (action.id, record.id))
+            cursor.execute(*ir_action.update(
+                    [ir_action.id], [action.id],
+                    where=ir_action.id == record.id))
             cursor.update_auto_increment(cls._table, action.id)
             record = cls(action.id)
             new_records.append(record)
@@ -457,21 +463,24 @@ class ActionReport(ActionMixin, ModelSQL, ModelView):
 
     @classmethod
     def __register__(cls, module_name):
+        TableHandler = backend.get('TableHandler')
         super(ActionReport, cls).__register__(module_name)
 
         cursor = Transaction().cursor
         table = TableHandler(cursor, cls, module_name)
+        action_report = cls.__table__()
 
         # Migration from 1.0 report_name_uniq has been removed
         table.drop_constraint('report_name_uniq')
 
         # Migration from 1.0 output_format (m2o) is now extension (selection)
         if table.column_exist('output_format'):
-            cursor.execute(
-                'SELECT report.id FROM "' + cls._table + '" report '
-                'JOIN ir_action_report_outputformat of '
-                    'ON (report.output_format = of.id) '
-                'WHERE of.format = \'pdf\'')
+            outputformat = Table('ir_action_report_outputformat')
+            cursor.execute(*action_report.join(
+                    outputformat,
+                    condition=action_report.output_format == outputformat.id)
+                .select(action_report.id,
+                    where=outputformat.format == 'pdf'))
 
             ids = [x[0] for x in cursor.fetchall()]
             with Transaction().set_user(0):
@@ -481,34 +490,35 @@ class ActionReport(ActionMixin, ModelSQL, ModelView):
 
             table.drop_column("output_format")
             TableHandler.dropTable(cursor, 'ir.action.report.outputformat',
-                      'ir_action_report_outputformat')
+                'ir_action_report_outputformat')
 
         # Migrate from 2.0 remove required on extension
         table.not_null_action('extension', action='remove')
-        cursor.execute('UPDATE "' + cls._table + '" '
-            'SET extension = %s '
-            'WHERE extension = %s', ('', 'odt'))
+        cursor.execute(*action_report.update(
+                [action_report.extension],
+                [''],
+                where=action_report.extension == 'odt'))
 
         # Migration from 2.0 report_content_data renamed into
         # report_content_custom to remove base64 encoding
         if (table.column_exist('report_content_data')
                 and table.column_exist('report_content_custom')):
             limit = cursor.IN_MAX
-            cursor.execute('SELECT COUNT(id) '
-                'FROM "' + cls._table + '"')
+            cursor.execute(*action_report.select(
+                    Count(action_report.id)))
             report_count, = cursor.fetchone()
             for offset in range(0, report_count, limit):
-                cursor.execute(cursor.limit_clause(
-                    'SELECT id, report_content_data '
-                    'FROM "' + cls._table + '"'
-                    'ORDER BY id',
-                    limit, offset))
+                cursor.execute(*action_report.select(
+                        action_report.id, action_report.report_content_data,
+                        order_by=action_report.id,
+                        limit=limit, offset=offset))
                 for report_id, report in cursor.fetchall():
                     if report:
                         report = buffer(base64.decodestring(str(report)))
-                        cursor.execute('UPDATE "' + cls._table + '" '
-                            'SET report_content_custom = %s '
-                            'WHERE id = %s', (report, report_id))
+                        cursor.execute(*action_report.update(
+                                [action_report.report_content_custom],
+                                [report],
+                                where=action_report.id == report_id))
             table.drop_column('report_content_data')
 
     @staticmethod
@@ -648,6 +658,7 @@ class ActionActWindow(ActionMixin, ModelSQL, ModelView):
     __name__ = 'ir.action.act_window'
     domain = fields.Char('Domain Value')
     context = fields.Char('Context Value')
+    order = fields.Char('Order Value')
     res_model = fields.Char('Model')
     act_window_views = fields.One2Many('ir.action.act_window.view',
             'act_window', 'Views')
@@ -668,6 +679,7 @@ class ActionActWindow(ActionMixin, ModelSQL, ModelView):
     pyson_domain = fields.Function(fields.Char('PySON Domain'), 'get_pyson')
     pyson_context = fields.Function(fields.Char('PySON Context'),
             'get_pyson')
+    pyson_order = fields.Function(fields.Char('PySON Order'), 'get_pyson')
     pyson_search_value = fields.Function(fields.Char(
         'PySON Search Criteria'), 'get_pyson')
 
@@ -689,13 +701,13 @@ class ActionActWindow(ActionMixin, ModelSQL, ModelView):
     @classmethod
     def __register__(cls, module_name):
         cursor = Transaction().cursor
+        act_window = cls.__table__()
         super(ActionActWindow, cls).__register__(module_name)
 
         # Migration from 2.0: new search_value format
-        cursor.execute('UPDATE "%s" '
-            'SET search_value = %%s '
-            'WHERE search_value = %%s' % cls._table,
-            ('[]', '{}'))
+        cursor.execute(*act_window.update(
+                [act_window.search_value], ['[]'],
+                where=act_window.search_value == '{}'))
 
     @staticmethod
     def default_type():
@@ -880,6 +892,7 @@ class ActionActWindowView(ModelSQL, ModelView):
 
     @classmethod
     def __register__(cls, module_name):
+        TableHandler = backend.get('TableHandler')
         super(ActionActWindowView, cls).__register__(module_name)
         table = TableHandler(Transaction().cursor, cls, module_name)
 
diff --git a/trytond/ir/attachment.py b/trytond/ir/attachment.py
index 09c4d72..09e340e 100644
--- a/trytond/ir/attachment.py
+++ b/trytond/ir/attachment.py
@@ -6,9 +6,11 @@ try:
 except ImportError:
     hashlib = None
     import md5
+from sql.operators import Concat
+
 from ..model import ModelView, ModelSQL, fields
 from ..config import CONFIG
-from ..backend import TableHandler
+from .. import backend
 from ..transaction import Transaction
 from ..pyson import Eval
 from ..pool import Pool
@@ -64,19 +66,23 @@ class Attachment(ModelSQL, ModelView):
 
     @classmethod
     def __register__(cls, module_name):
+        TableHandler = backend.get('TableHandler')
         cursor = Transaction().cursor
 
         super(Attachment, cls).__register__(module_name)
 
         table = TableHandler(cursor, cls, module_name)
+        attachment = cls.__table__()
 
         # Migration from 1.4 res_model and res_id merged into resource
         # Reference
         if table.column_exist('res_model') and \
                 table.column_exist('res_id'):
             table.drop_constraint('res_model_res_id_name')
-            cursor.execute('UPDATE "%s" '
-            'SET "resource" = "res_model"||\',\'||"res_id"' % cls._table)
+            cursor.execute(*attachment.update(
+                    [attachment.resource],
+                    [Concat(Concat(attachment.resource, ','),
+                            attachment.res_id)]))
             table.drop_column('res_model')
             table.drop_column('res_id')
 
@@ -96,10 +102,13 @@ class Attachment(ModelSQL, ModelView):
     def models_get():
         pool = Pool()
         Model = pool.get('ir.model')
+        ModelAccess = pool.get('ir.model.access')
         models = Model.search([])
+        access = ModelAccess.get_access([m.model for m in models])
         res = []
         for model in models:
-            res.append([model.model, model.name])
+            if access[model.model]['read']:
+                res.append([model.model, model.name])
         return res
 
     def get_data(self, name):
@@ -134,6 +143,7 @@ class Attachment(ModelSQL, ModelView):
         if value is None:
             return
         cursor = Transaction().cursor
+        table = cls.__table__()
         db_name = cursor.dbname
         directory = os.path.join(CONFIG['data_path'], db_name)
         if not os.path.isdir(directory):
@@ -151,11 +161,11 @@ class Attachment(ModelSQL, ModelView):
             with open(filename, 'rb') as file_p:
                 data = file_p.read()
             if value != data:
-                cursor.execute('SELECT DISTINCT(collision) '
-                    'FROM ir_attachment '
-                    'WHERE digest = %s '
-                        'AND collision != 0 '
-                    'ORDER BY collision', (digest,))
+                cursor.execute(*table.select(table.collision,
+                        where=(table.digest == digest)
+                        & (table.collision != 0),
+                        group_by=table.collision,
+                        order_by=table.collision))
                 collision2 = 0
                 for row in cursor.fetchall():
                     collision2 = row[0]
diff --git a/trytond/ir/cron.py b/trytond/ir/cron.py
index 320b9c1..3255b82 100644
--- a/trytond/ir/cron.py
+++ b/trytond/ir/cron.py
@@ -6,12 +6,14 @@ from dateutil.relativedelta import relativedelta
 import traceback
 import sys
 import logging
+from email.mime.text import MIMEText
 
 from ..model import ModelView, ModelSQL, fields
-from ..tools import safe_eval
+from ..tools import safe_eval, get_smtp_server
 from ..transaction import Transaction
 from ..pool import Pool
-from ..backend import TableHandler
+from .. import backend
+from ..config import CONFIG
 
 __all__ = [
     'Cron',
@@ -60,14 +62,16 @@ class Cron(ModelSQL, ModelView):
     def __setup__(cls):
         super(Cron, cls).__setup__()
         cls._error_messages.update({
-            'request_title': 'Scheduled action failed',
-            'request_body': "The following action failed to execute "
-                            "properly: \"%s\"\n Traceback: \n\n%s\n"
-            })
+                'request_title': 'Scheduled action failed',
+                'request_body': ("The following action failed to execute "
+                    "properly: \"%s\"\n%s\n Traceback: \n\n%s\n")
+                })
 
     @classmethod
     def __register__(cls, module_name):
+        TableHandler = backend.get('TableHandler')
         cursor = Transaction().cursor
+        cron = cls.__table__()
 
         # Migration from 2.0: rename numbercall, doall and nextcall
         table = TableHandler(cursor, cls, module_name)
@@ -79,10 +83,9 @@ class Cron(ModelSQL, ModelView):
         super(Cron, cls).__register__(module_name)
 
         # Migration from 2.0: work_days removed
-        cursor.execute('UPDATE "%s" '
-            'SET interval_type = %%s '
-            'WHERE interval_type = %%s' % cls._table,
-            ('days', 'work_days'))
+        cursor.execute(*cron.update(
+                [cron.interval_type], ['days'],
+                where=cron.interval_type == 'work_days'))
 
     @staticmethod
     def default_next_call():
@@ -120,29 +123,33 @@ class Cron(ModelSQL, ModelView):
         return _INTERVALTYPES[cron.interval_type](cron.interval_number)
 
     @classmethod
-    def _get_request_values(cls, cron):
+    def send_error_message(cls, cron):
         tb_s = ''.join(traceback.format_exception(*sys.exc_info()))
         tb_s = tb_s.decode('utf-8', 'ignore')
-        name = cls.raise_user_error('request_title',
+        subject = cls.raise_user_error('request_title',
             raise_exception=False)
-        body = cls.raise_user_error('request_body', (cron.name, tb_s),
+        body = cls.raise_user_error('request_body',
+            (cron.name, cron.__url__, tb_s),
             raise_exception=False)
-        values = {
-            'name': name,
-            'priority': '2',
-            'act_from': cron.user.id,
-            'act_to': cron.request_user.id,
-            'body': body,
-            'date_sent': datetime.datetime.now(),
-            'references': [
-                ('create', [{
-                            'reference': '%s,%s' % (cls.__name__, cron.id),
-                            }]),
-            ],
-            'state': 'waiting',
-            'trigger_date': datetime.datetime.now(),
-        }
-        return values
+
+        from_addr = CONFIG['smtp_default_from_email']
+        to_addr = cron.request_user.email
+
+        msg = MIMEText(body)
+        msg['To'] = to_addr
+        msg['From'] = from_addr
+        msg['Subject'] = subject
+        logger = logging.getLogger(__name__)
+        if not to_addr:
+            logger.error(msg.as_string())
+        else:
+            try:
+                server = get_smtp_server()
+                server.sendmail(from_addr, to_addr, msg.as_string())
+                server.quit()
+            except Exception, exception:
+                logger.error('Unable to deliver email (%s):\n %s'
+                    % (exception, msg.as_string()))
 
     @classmethod
     def _callback(cls, cron):
@@ -156,15 +163,12 @@ class Cron(ModelSQL, ModelView):
         except Exception:
             Transaction().cursor.rollback()
 
-            Request = pool.get('res.request')
             req_user = cron.request_user
             language = (req_user.language.code if req_user.language
                     else Config.get_language())
             with contextlib.nested(Transaction().set_user(cron.user.id),
                     Transaction().set_context(language=language)):
-                values = cls._get_request_values(cron)
-                Request.create([values])
-            Transaction().cursor.commit()
+                cls.send_error_message(cron)
 
     @classmethod
     def run(cls, db_name):
diff --git a/trytond/ir/lang.py b/trytond/ir/lang.py
index 9a77288..d2270b9 100644
--- a/trytond/ir/lang.py
+++ b/trytond/ir/lang.py
@@ -62,9 +62,9 @@ class Lang(ModelSQL, ModelView):
 
     @classmethod
     def search_rec_name(cls, name, clause):
-        langs = cls.search([('code',) + clause[1:]], order=[])
+        langs = cls.search([('code',) + tuple(clause[1:])], order=[])
         if langs:
-            langs += cls.search([('name',) + clause[1:]], order=[])
+            langs += cls.search([('name',) + tuple(clause[1:])], order=[])
             return [('id', 'in', [l.id for l in langs])]
         return [('name',) + tuple(clause[1:])]
 
@@ -204,26 +204,35 @@ class Lang(ModelSQL, ModelView):
 
     @classmethod
     def create(cls, vlist):
+        pool = Pool()
+        Translation = pool.get('ir.translation')
         # Clear cache
         cls._lang_cache.clear()
-        return super(Lang, cls).create(vlist)
+        languages = super(Lang, cls).create(vlist)
+        Translation._get_language_cache.clear()
+        return languages
 
     @classmethod
     def write(cls, langs, vals):
+        pool = Pool()
+        Translation = pool.get('ir.translation')
         # Clear cache
         cls._lang_cache.clear()
         super(Lang, cls).write(langs, vals)
+        Translation._get_language_cache.clear()
 
     @classmethod
     def delete(cls, langs):
         pool = Pool()
         Config = pool.get('ir.configuration')
+        Translation = pool.get('ir.translation')
         for lang in langs:
             if lang.code == Config.get_language():
                 cls.raise_user_error('delete_default')
         # Clear cache
         cls._lang_cache.clear()
         super(Lang, cls).delete(langs)
+        Translation._get_language_cache.clear()
 
     @staticmethod
     def _group(lang, s, monetary=None):
diff --git a/trytond/ir/lang.xml b/trytond/ir/lang.xml
index e240557..7be3725 100644
--- a/trytond/ir/lang.xml
+++ b/trytond/ir/lang.xml
@@ -96,6 +96,14 @@ this repository contains the full copyright notices and license terms. -->
             <field name="decimal_point">,</field>
             <field name="thousands_sep"> </field>
         </record>
+        <record model="ir.lang" id="lang_sl">
+            <field name="code">sl_SI</field>
+            <field name="name">Slovenian</field>
+            <field name="date">%d.%m.%Y</field>
+            <field name="grouping">[3, 3, 0]</field>
+            <field name="decimal_point">,</field>
+            <field name="thousands_sep">.</field>
+        </record>
 
         <record model="ir.ui.view" id="lang_view_tree">
             <field name="model">ir.lang</field>
diff --git a/trytond/ir/locale/bg_BG.po b/trytond/ir/locale/bg_BG.po
index 23991bd..8f008d2 100644
--- a/trytond/ir/locale/bg_BG.po
+++ b/trytond/ir/locale/bg_BG.po
@@ -71,14 +71,11 @@ msgstr "Планираното действие неуспяло"
 msgctxt "error:ir.cron:"
 msgid ""
 "The following action failed to execute properly: \"%s\"\n"
+"%s\n"
 " Traceback: \n"
 "\n"
 "%s\n"
 msgstr ""
-"Следното действие не е изпълнено успешно: \"%s\"\n"
-"Информация:\n"
-"\n"
-"%s"
 
 msgctxt "error:ir.lang:"
 msgid "Default language can not be deleted."
@@ -221,6 +218,12 @@ msgctxt "error:ir.translation:"
 msgid "Translation must be unique"
 msgstr "Превода трябва да е уникален"
 
+msgctxt "error:ir.translation:"
+msgid ""
+"You can not export translation %(name)s because it is an overridden "
+"translation by module %(overriding_module)s"
+msgstr ""
+
 msgctxt "error:ir.trigger:"
 msgid "\"On Time\" and others are mutually exclusive!"
 msgstr "\"В даден момент\" и останалите са взаимно изключващи се!"
@@ -450,6 +453,10 @@ msgctxt "field:ir.action.act_window,name:"
 msgid "Name"
 msgstr "Име на прикачен файл"
 
+msgctxt "field:ir.action.act_window,order:"
+msgid "Order Value"
+msgstr ""
+
 msgctxt "field:ir.action.act_window,pyson_context:"
 msgid "PySON Context"
 msgstr "PySON контекст"
@@ -458,6 +465,10 @@ msgctxt "field:ir.action.act_window,pyson_domain:"
 msgid "PySON Domain"
 msgstr "PySON контекст"
 
+msgctxt "field:ir.action.act_window,pyson_order:"
+msgid "PySON Order"
+msgstr ""
+
 msgctxt "field:ir.action.act_window,pyson_search_value:"
 msgid "PySON Search Criteria"
 msgstr "PySON критерии за търсене"
@@ -2102,6 +2113,10 @@ msgctxt "field:ir.translation,name:"
 msgid "Field Name"
 msgstr "Име на поле"
 
+msgctxt "field:ir.translation,overriding_module:"
+msgid "Overriding Module"
+msgstr ""
+
 msgctxt "field:ir.translation,rec_name:"
 msgid "Name"
 msgstr "Име"
@@ -2557,47 +2572,60 @@ msgctxt "field:ir.ui.view_search,write_uid:"
 msgid "Write User"
 msgstr "Променено от"
 
-msgctxt "field:ir.ui.view_tree_expanded_state,child_name:"
+msgctxt "field:ir.ui.view_tree_state,child_name:"
 msgid "Child Name"
-msgstr "Име на подчинен"
+msgstr ""
 
-msgctxt "field:ir.ui.view_tree_expanded_state,create_date:"
+#, fuzzy
+msgctxt "field:ir.ui.view_tree_state,create_date:"
 msgid "Create Date"
 msgstr "Създадено на"
 
-msgctxt "field:ir.ui.view_tree_expanded_state,create_uid:"
+#, fuzzy
+msgctxt "field:ir.ui.view_tree_state,create_uid:"
 msgid "Create User"
 msgstr "Създадено от"
 
-msgctxt "field:ir.ui.view_tree_expanded_state,domain:"
+#, fuzzy
+msgctxt "field:ir.ui.view_tree_state,domain:"
 msgid "Domain"
 msgstr "Домейн"
 
-msgctxt "field:ir.ui.view_tree_expanded_state,id:"
+#, fuzzy
+msgctxt "field:ir.ui.view_tree_state,id:"
 msgid "ID"
 msgstr "ID"
 
-msgctxt "field:ir.ui.view_tree_expanded_state,model:"
+#, fuzzy
+msgctxt "field:ir.ui.view_tree_state,model:"
 msgid "Model"
 msgstr "Модел"
 
-msgctxt "field:ir.ui.view_tree_expanded_state,nodes:"
+msgctxt "field:ir.ui.view_tree_state,nodes:"
 msgid "Expanded Nodes"
-msgstr "Разтворени възли"
+msgstr ""
 
-msgctxt "field:ir.ui.view_tree_expanded_state,rec_name:"
+#, fuzzy
+msgctxt "field:ir.ui.view_tree_state,rec_name:"
 msgid "Name"
 msgstr "Име на прикачен файл"
 
-msgctxt "field:ir.ui.view_tree_expanded_state,user:"
+msgctxt "field:ir.ui.view_tree_state,selected_nodes:"
+msgid "Selected Nodes"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:ir.ui.view_tree_state,user:"
 msgid "User"
 msgstr "Потребител"
 
-msgctxt "field:ir.ui.view_tree_expanded_state,write_date:"
+#, fuzzy
+msgctxt "field:ir.ui.view_tree_state,write_date:"
 msgid "Write Date"
 msgstr "Променено на"
 
-msgctxt "field:ir.ui.view_tree_expanded_state,write_uid:"
+#, fuzzy
+msgctxt "field:ir.ui.view_tree_state,write_uid:"
 msgid "Write User"
 msgstr "Променено от"
 
@@ -2925,9 +2953,9 @@ msgctxt "model:ir.action,name:act_view_show"
 msgid "Show View"
 msgstr "Показване на изглед"
 
-msgctxt "model:ir.action,name:act_view_tree_expanded_state"
-msgid "Tree Expanded State"
-msgstr "Дърво с разтворени възли"
+msgctxt "model:ir.action,name:act_view_tree_state"
+msgid "Tree State"
+msgstr ""
 
 msgctxt "model:ir.action,name:act_view_tree_width_form"
 msgid "View Tree Width"
@@ -3050,6 +3078,10 @@ msgctxt "model:ir.lang,name:lang_ru"
 msgid "Russian"
 msgstr "Руски"
 
+msgctxt "model:ir.lang,name:lang_sl"
+msgid "Slovenian"
+msgstr ""
+
 msgctxt "model:ir.model,name:"
 msgid "Model"
 msgstr "Модел"
@@ -3346,9 +3378,9 @@ msgctxt "model:ir.ui.menu,name:menu_view_search"
 msgid "View Search"
 msgstr ""
 
-msgctxt "model:ir.ui.menu,name:menu_view_tree_expanded_state"
-msgid "Tree Expanded State"
-msgstr "Дърво с разтворени възли"
+msgctxt "model:ir.ui.menu,name:menu_view_tree_state"
+msgid "Tree State"
+msgstr ""
 
 msgctxt "model:ir.ui.menu,name:menu_view_tree_width"
 msgid "View Tree Width"
@@ -3374,10 +3406,9 @@ msgctxt "model:ir.ui.view_search,name:"
 msgid "View Search"
 msgstr ""
 
-#, fuzzy
-msgctxt "model:ir.ui.view_tree_expanded_state,name:"
-msgid "View Tree Expanded State"
-msgstr "Изгледи на дърво с разтворени възли"
+msgctxt "model:ir.ui.view_tree_state,name:"
+msgid "View Tree State"
+msgstr ""
 
 msgctxt "model:ir.ui.view_tree_width,name:"
 msgid "View Tree Width"
@@ -3579,6 +3610,11 @@ msgctxt "selection:ir.ui.view,type:"
 msgid "Board"
 msgstr "Табло"
 
+#, fuzzy
+msgctxt "selection:ir.ui.view,type:"
+msgid "Calendar"
+msgstr "Управление на календари"
+
 msgctxt "selection:ir.ui.view,type:"
 msgid "Form"
 msgstr "Форма"
@@ -3974,13 +4010,13 @@ msgctxt "view:ir.ui.view_search:"
 msgid "View Searches"
 msgstr ""
 
-msgctxt "view:ir.ui.view_tree_expanded_state:"
-msgid "View Tree Expanded State"
-msgstr "Изгледи на дърво с разтворени възли"
+msgctxt "view:ir.ui.view_tree_state:"
+msgid "View Tree State"
+msgstr ""
 
-msgctxt "view:ir.ui.view_tree_expanded_state:"
-msgid "Views Tree Expanded State"
-msgstr "Изгледи на дърво с разтворени възли"
+msgctxt "view:ir.ui.view_tree_state:"
+msgid "Views Tree State"
+msgstr ""
 
 msgctxt "view:ir.ui.view_tree_width:"
 msgid "View Tree Width"
diff --git a/trytond/ir/locale/ca_ES.po b/trytond/ir/locale/ca_ES.po
index 0a18ead..b07b6b7 100644
--- a/trytond/ir/locale/ca_ES.po
+++ b/trytond/ir/locale/ca_ES.po
@@ -56,7 +56,6 @@ msgctxt "error:ir.action.keyword:"
 msgid "Wrong wizard model in keyword action \"%s\"."
 msgstr "Assistent incorrecte en l'acció de teclat \"%s\"."
 
-#, fuzzy
 msgctxt "error:ir.action.report:"
 msgid "Invalid email definition on report \"%s\"."
 msgstr ""
@@ -77,11 +76,13 @@ msgstr "L'acció planificada ha fallat."
 msgctxt "error:ir.cron:"
 msgid ""
 "The following action failed to execute properly: \"%s\"\n"
+"%s\n"
 " Traceback: \n"
 "\n"
 "%s\n"
 msgstr ""
-"El seguiment de l'acció a fallat executant la propietat: \"%s\"\n"
+"Ha fallat l'acció quan s'executava: \"%s\"\n"
+"%s\n"
 " Traceback: \n"
 "\n"
 "%s\n"
@@ -183,22 +184,18 @@ msgctxt "error:ir.rule:"
 msgid "Invalid domain in rule \"%s\"."
 msgstr "La regla del domini \"%s\" no és correcte."
 
-#, fuzzy
 msgctxt "error:ir.sequence.strict:"
 msgid "Invalid prefix \"%(prefix)s\" on sequence \"%(sequence)s\"."
 msgstr "Prefix \"%(prefix)s\" de la seqüència \"%(sequence)s\" no és correcte."
 
-#, fuzzy
 msgctxt "error:ir.sequence.strict:"
 msgid "Invalid suffix \"%(suffix)s\" on sequence \"%(sequence)s\"."
 msgstr "Sufix \"%(sufix)s\" de la seqüència \"%(sequence)s\" no és correcte."
 
-#, fuzzy
 msgctxt "error:ir.sequence.strict:"
 msgid "Last Timestamp cannot be in the future on sequence \"%s\"."
 msgstr "La darrera data-hora no pot ser del futur a la seqüència \"%s\"."
 
-#, fuzzy
 msgctxt "error:ir.sequence.strict:"
 msgid "Missing sequence."
 msgstr "No es troba la seqüència."
@@ -207,22 +204,18 @@ msgctxt "error:ir.sequence.strict:"
 msgid "Timestamp rounding should be greater than 0"
 msgstr "L'arrodiment Timestamp ha de ser mes gran que 0."
 
-#, fuzzy
 msgctxt "error:ir.sequence:"
 msgid "Invalid prefix \"%(prefix)s\" on sequence \"%(sequence)s\"."
 msgstr "Prefix \"%(prefix)s\" de la seqüència \"%(sequence)s\" no és correcte."
 
-#, fuzzy
 msgctxt "error:ir.sequence:"
 msgid "Invalid suffix \"%(suffix)s\" on sequence \"%(sequence)s\"."
 msgstr "Sufix \"%(sufix)s\" de la seqüència \"%(sequence)s\" no és correcte."
 
-#, fuzzy
 msgctxt "error:ir.sequence:"
 msgid "Last Timestamp cannot be in the future on sequence \"%s\"."
 msgstr "La darrera data-hora no pot ser del futur a la seqüència \"%s\"."
 
-#, fuzzy
 msgctxt "error:ir.sequence:"
 msgid "Missing sequence."
 msgstr "No es troba la seqüència."
@@ -235,6 +228,14 @@ msgctxt "error:ir.translation:"
 msgid "Translation must be unique"
 msgstr "La traducció ha de ser únic."
 
+msgctxt "error:ir.translation:"
+msgid ""
+"You can not export translation %(name)s because it is an overridden "
+"translation by module %(overriding_module)s"
+msgstr ""
+"No podeu exportar la traducció %(name)s perquè s'utilitza en el mòdul "
+"%(overriding_module)s"
+
 msgctxt "error:ir.trigger:"
 msgid "\"On Time\" and others are mutually exclusive!"
 msgstr "\"Al moment\" i altres son mutuament exclusius."
@@ -249,7 +250,7 @@ msgstr ""
 
 msgctxt "error:ir.ui.menu:"
 msgid "\"%s\" is not a valid menu name because it is not allowed to contain \" / \"."
-msgstr "\"%s\" no es un menú correcte perque no pot contenir \" /\"."
+msgstr "\"%s\" no és un menú correcte perquè no pot contenir \" /\"."
 
 msgctxt "error:ir.ui.view:"
 msgid "Invalid XML for view \"%s\"."
@@ -467,6 +468,10 @@ msgctxt "field:ir.action.act_window,name:"
 msgid "Name"
 msgstr "Nom"
 
+msgctxt "field:ir.action.act_window,order:"
+msgid "Order Value"
+msgstr "Ordre"
+
 msgctxt "field:ir.action.act_window,pyson_context:"
 msgid "PySON Context"
 msgstr "PySON Context"
@@ -475,6 +480,10 @@ msgctxt "field:ir.action.act_window,pyson_domain:"
 msgid "PySON Domain"
 msgstr "PySON Domain"
 
+msgctxt "field:ir.action.act_window,pyson_order:"
+msgid "PySON Order"
+msgstr "Ordre PySON"
+
 msgctxt "field:ir.action.act_window,pyson_search_value:"
 msgid "PySON Search Criteria"
 msgstr "PySON Search Criteria"
@@ -2075,6 +2084,10 @@ msgctxt "field:ir.translation,name:"
 msgid "Field Name"
 msgstr "Nom del camp"
 
+msgctxt "field:ir.translation,overriding_module:"
+msgid "Overriding Module"
+msgstr "Mòdul anul·lant"
+
 msgctxt "field:ir.translation,rec_name:"
 msgid "Name"
 msgstr "Nom"
@@ -2507,47 +2520,51 @@ msgctxt "field:ir.ui.view_search,write_uid:"
 msgid "Write User"
 msgstr "Usuari modificació"
 
-msgctxt "field:ir.ui.view_tree_expanded_state,child_name:"
+msgctxt "field:ir.ui.view_tree_state,child_name:"
 msgid "Child Name"
 msgstr "Nom del fill"
 
-msgctxt "field:ir.ui.view_tree_expanded_state,create_date:"
+msgctxt "field:ir.ui.view_tree_state,create_date:"
 msgid "Create Date"
 msgstr "Data creació"
 
-msgctxt "field:ir.ui.view_tree_expanded_state,create_uid:"
+msgctxt "field:ir.ui.view_tree_state,create_uid:"
 msgid "Create User"
 msgstr "Usuari creació"
 
-msgctxt "field:ir.ui.view_tree_expanded_state,domain:"
+msgctxt "field:ir.ui.view_tree_state,domain:"
 msgid "Domain"
 msgstr "Domini"
 
-msgctxt "field:ir.ui.view_tree_expanded_state,id:"
+msgctxt "field:ir.ui.view_tree_state,id:"
 msgid "ID"
 msgstr "ID"
 
-msgctxt "field:ir.ui.view_tree_expanded_state,model:"
+msgctxt "field:ir.ui.view_tree_state,model:"
 msgid "Model"
 msgstr "Model"
 
-msgctxt "field:ir.ui.view_tree_expanded_state,nodes:"
+msgctxt "field:ir.ui.view_tree_state,nodes:"
 msgid "Expanded Nodes"
-msgstr "Extendre nodes"
+msgstr "Nodes expandits"
 
-msgctxt "field:ir.ui.view_tree_expanded_state,rec_name:"
+msgctxt "field:ir.ui.view_tree_state,rec_name:"
 msgid "Name"
 msgstr "Nom"
 
-msgctxt "field:ir.ui.view_tree_expanded_state,user:"
+msgctxt "field:ir.ui.view_tree_state,selected_nodes:"
+msgid "Selected Nodes"
+msgstr "Nodes seleccionats"
+
+msgctxt "field:ir.ui.view_tree_state,user:"
 msgid "User"
 msgstr "Usuari"
 
-msgctxt "field:ir.ui.view_tree_expanded_state,write_date:"
+msgctxt "field:ir.ui.view_tree_state,write_date:"
 msgid "Write Date"
 msgstr "Data modificació"
 
-msgctxt "field:ir.ui.view_tree_expanded_state,write_uid:"
+msgctxt "field:ir.ui.view_tree_state,write_uid:"
 msgid "Write User"
 msgstr "Usuari modificació"
 
@@ -2873,9 +2890,9 @@ msgctxt "model:ir.action,name:act_view_show"
 msgid "Show View"
 msgstr "Mostrar vista"
 
-msgctxt "model:ir.action,name:act_view_tree_expanded_state"
-msgid "Tree Expanded State"
-msgstr "Estat arbre estès"
+msgctxt "model:ir.action,name:act_view_tree_state"
+msgid "Tree State"
+msgstr "Estat de l'arbre"
 
 msgctxt "model:ir.action,name:act_view_tree_width_form"
 msgid "View Tree Width"
@@ -2987,7 +3004,7 @@ msgstr "Francès"
 
 msgctxt "model:ir.lang,name:lang_lt"
 msgid "Lithuanian"
-msgstr ""
+msgstr "Lituà"
 
 msgctxt "model:ir.lang,name:lang_nl"
 msgid "Dutch"
@@ -2997,6 +3014,10 @@ msgctxt "model:ir.lang,name:lang_ru"
 msgid "Russian"
 msgstr "Rus"
 
+msgctxt "model:ir.lang,name:lang_sl"
+msgid "Slovenian"
+msgstr "Eslovè"
+
 msgctxt "model:ir.model,name:"
 msgid "Model"
 msgstr "Model"
@@ -3107,11 +3128,11 @@ msgstr "Exporta traducció"
 
 msgctxt "model:ir.translation.set.start,name:"
 msgid "Set Translation"
-msgstr "Defineix traducció"
+msgstr "Estableix traduccions"
 
 msgctxt "model:ir.translation.set.succeed,name:"
 msgid "Set Translation"
-msgstr "Defineix traducció"
+msgstr "Estableix traduccions"
 
 msgctxt "model:ir.translation.update.start,name:"
 msgid "Update translation"
@@ -3271,7 +3292,7 @@ msgstr "Traduccions"
 
 msgctxt "model:ir.ui.menu,name:menu_translation_set"
 msgid "Set Translations"
-msgstr "Defineix traduccions"
+msgstr "Estableix traduccions"
 
 msgctxt "model:ir.ui.menu,name:menu_translation_update"
 msgid "Synchronize Translations"
@@ -3293,9 +3314,9 @@ msgctxt "model:ir.ui.menu,name:menu_view_search"
 msgid "View Search"
 msgstr "Vista de cerca"
 
-msgctxt "model:ir.ui.menu,name:menu_view_tree_expanded_state"
-msgid "Tree Expanded State"
-msgstr "Estat arbre estès"
+msgctxt "model:ir.ui.menu,name:menu_view_tree_state"
+msgid "Tree State"
+msgstr "Estat de l'arbre"
 
 msgctxt "model:ir.ui.menu,name:menu_view_tree_width"
 msgid "View Tree Width"
@@ -3321,9 +3342,9 @@ msgctxt "model:ir.ui.view_search,name:"
 msgid "View Search"
 msgstr "Vista de cerca"
 
-msgctxt "model:ir.ui.view_tree_expanded_state,name:"
-msgid "View Tree Expanded State"
-msgstr "Estat vistes arbre extesses"
+msgctxt "model:ir.ui.view_tree_state,name:"
+msgid "View Tree State"
+msgstr "Estat de la vista arbre"
 
 msgctxt "model:ir.ui.view_tree_width,name:"
 msgid "View Tree Width"
@@ -3499,7 +3520,7 @@ msgstr "Butó del assistent"
 
 msgctxt "selection:ir.ui.menu,action:"
 msgid ""
-msgstr " "
+msgstr ""
 
 msgctxt "selection:ir.ui.menu,action:"
 msgid "ir.action.act_window"
@@ -3519,13 +3540,17 @@ msgstr "ir.action.wizard"
 
 msgctxt "selection:ir.ui.view,type:"
 msgid ""
-msgstr " "
+msgstr ""
 
 msgctxt "selection:ir.ui.view,type:"
 msgid "Board"
 msgstr "Taulell"
 
 msgctxt "selection:ir.ui.view,type:"
+msgid "Calendar"
+msgstr "Calendari"
+
+msgctxt "selection:ir.ui.view,type:"
 msgid "Form"
 msgstr "Formulari"
 
@@ -3854,7 +3879,7 @@ msgstr "Exporta traducció"
 
 msgctxt "view:ir.translation.set.start:"
 msgid "Set Translations"
-msgstr "Defineix traduccions"
+msgstr "Estableix traduccions"
 
 msgctxt "view:ir.translation.set.start:"
 msgid "Synchronize Translations?"
@@ -3866,7 +3891,7 @@ msgstr "Les traduccions s'han realitzat correctament."
 
 msgctxt "view:ir.translation.set.succeed:"
 msgid "Set Translations"
-msgstr "Defineix traduccions"
+msgstr "Estableix traduccions"
 
 msgctxt "view:ir.translation.update.start:"
 msgid "Synchronize Translations"
@@ -3920,13 +3945,13 @@ msgctxt "view:ir.ui.view_search:"
 msgid "View Searches"
 msgstr "Vista de cerques"
 
-msgctxt "view:ir.ui.view_tree_expanded_state:"
-msgid "View Tree Expanded State"
-msgstr "Estat vistes arbre extesses"
+msgctxt "view:ir.ui.view_tree_state:"
+msgid "View Tree State"
+msgstr "Estat de la vista arbre"
 
-msgctxt "view:ir.ui.view_tree_expanded_state:"
-msgid "Views Tree Expanded State"
-msgstr "Estat vistes arbre extesses"
+msgctxt "view:ir.ui.view_tree_state:"
+msgid "Views Tree State"
+msgstr "Estat de les vistes arbre"
 
 msgctxt "view:ir.ui.view_tree_width:"
 msgid "View Tree Width"
@@ -4002,7 +4027,7 @@ msgstr "Cancel·la"
 
 msgctxt "wizard_button:ir.translation.set,start,set_:"
 msgid "Set"
-msgstr "Grup"
+msgstr "Estableix"
 
 msgctxt "wizard_button:ir.translation.set,succeed,end:"
 msgid "Ok"
diff --git a/trytond/ir/locale/cs_CZ.po b/trytond/ir/locale/cs_CZ.po
index 0e5f70a..315e563 100644
--- a/trytond/ir/locale/cs_CZ.po
+++ b/trytond/ir/locale/cs_CZ.po
@@ -69,6 +69,7 @@ msgstr ""
 msgctxt "error:ir.cron:"
 msgid ""
 "The following action failed to execute properly: \"%s\"\n"
+"%s\n"
 " Traceback: \n"
 "\n"
 "%s\n"
@@ -214,6 +215,12 @@ msgctxt "error:ir.translation:"
 msgid "Translation must be unique"
 msgstr ""
 
+msgctxt "error:ir.translation:"
+msgid ""
+"You can not export translation %(name)s because it is an overridden "
+"translation by module %(overriding_module)s"
+msgstr ""
+
 msgctxt "error:ir.trigger:"
 msgid "\"On Time\" and others are mutually exclusive!"
 msgstr ""
@@ -434,6 +441,10 @@ msgctxt "field:ir.action.act_window,name:"
 msgid "Name"
 msgstr ""
 
+msgctxt "field:ir.action.act_window,order:"
+msgid "Order Value"
+msgstr ""
+
 msgctxt "field:ir.action.act_window,pyson_context:"
 msgid "PySON Context"
 msgstr ""
@@ -442,6 +453,10 @@ msgctxt "field:ir.action.act_window,pyson_domain:"
 msgid "PySON Domain"
 msgstr ""
 
+msgctxt "field:ir.action.act_window,pyson_order:"
+msgid "PySON Order"
+msgstr ""
+
 msgctxt "field:ir.action.act_window,pyson_search_value:"
 msgid "PySON Search Criteria"
 msgstr ""
@@ -2042,6 +2057,10 @@ msgctxt "field:ir.translation,name:"
 msgid "Field Name"
 msgstr ""
 
+msgctxt "field:ir.translation,overriding_module:"
+msgid "Overriding Module"
+msgstr ""
+
 msgctxt "field:ir.translation,rec_name:"
 msgid "Name"
 msgstr ""
@@ -2474,47 +2493,51 @@ msgctxt "field:ir.ui.view_search,write_uid:"
 msgid "Write User"
 msgstr ""
 
-msgctxt "field:ir.ui.view_tree_expanded_state,child_name:"
+msgctxt "field:ir.ui.view_tree_state,child_name:"
 msgid "Child Name"
 msgstr ""
 
-msgctxt "field:ir.ui.view_tree_expanded_state,create_date:"
+msgctxt "field:ir.ui.view_tree_state,create_date:"
 msgid "Create Date"
 msgstr ""
 
-msgctxt "field:ir.ui.view_tree_expanded_state,create_uid:"
+msgctxt "field:ir.ui.view_tree_state,create_uid:"
 msgid "Create User"
 msgstr ""
 
-msgctxt "field:ir.ui.view_tree_expanded_state,domain:"
+msgctxt "field:ir.ui.view_tree_state,domain:"
 msgid "Domain"
 msgstr ""
 
-msgctxt "field:ir.ui.view_tree_expanded_state,id:"
+msgctxt "field:ir.ui.view_tree_state,id:"
 msgid "ID"
 msgstr ""
 
-msgctxt "field:ir.ui.view_tree_expanded_state,model:"
+msgctxt "field:ir.ui.view_tree_state,model:"
 msgid "Model"
 msgstr ""
 
-msgctxt "field:ir.ui.view_tree_expanded_state,nodes:"
+msgctxt "field:ir.ui.view_tree_state,nodes:"
 msgid "Expanded Nodes"
 msgstr ""
 
-msgctxt "field:ir.ui.view_tree_expanded_state,rec_name:"
+msgctxt "field:ir.ui.view_tree_state,rec_name:"
 msgid "Name"
 msgstr ""
 
-msgctxt "field:ir.ui.view_tree_expanded_state,user:"
+msgctxt "field:ir.ui.view_tree_state,selected_nodes:"
+msgid "Selected Nodes"
+msgstr ""
+
+msgctxt "field:ir.ui.view_tree_state,user:"
 msgid "User"
 msgstr ""
 
-msgctxt "field:ir.ui.view_tree_expanded_state,write_date:"
+msgctxt "field:ir.ui.view_tree_state,write_date:"
 msgid "Write Date"
 msgstr ""
 
-msgctxt "field:ir.ui.view_tree_expanded_state,write_uid:"
+msgctxt "field:ir.ui.view_tree_state,write_uid:"
 msgid "Write User"
 msgstr ""
 
@@ -2826,8 +2849,8 @@ msgctxt "model:ir.action,name:act_view_show"
 msgid "Show View"
 msgstr ""
 
-msgctxt "model:ir.action,name:act_view_tree_expanded_state"
-msgid "Tree Expanded State"
+msgctxt "model:ir.action,name:act_view_tree_state"
+msgid "Tree State"
 msgstr ""
 
 msgctxt "model:ir.action,name:act_view_tree_width_form"
@@ -2950,6 +2973,10 @@ msgctxt "model:ir.lang,name:lang_ru"
 msgid "Russian"
 msgstr ""
 
+msgctxt "model:ir.lang,name:lang_sl"
+msgid "Slovenian"
+msgstr ""
+
 msgctxt "model:ir.model,name:"
 msgid "Model"
 msgstr ""
@@ -3246,8 +3273,8 @@ msgctxt "model:ir.ui.menu,name:menu_view_search"
 msgid "View Search"
 msgstr ""
 
-msgctxt "model:ir.ui.menu,name:menu_view_tree_expanded_state"
-msgid "Tree Expanded State"
+msgctxt "model:ir.ui.menu,name:menu_view_tree_state"
+msgid "Tree State"
 msgstr ""
 
 msgctxt "model:ir.ui.menu,name:menu_view_tree_width"
@@ -3274,8 +3301,8 @@ msgctxt "model:ir.ui.view_search,name:"
 msgid "View Search"
 msgstr ""
 
-msgctxt "model:ir.ui.view_tree_expanded_state,name:"
-msgid "View Tree Expanded State"
+msgctxt "model:ir.ui.view_tree_state,name:"
+msgid "View Tree State"
 msgstr ""
 
 msgctxt "model:ir.ui.view_tree_width,name:"
@@ -3479,6 +3506,10 @@ msgid "Board"
 msgstr ""
 
 msgctxt "selection:ir.ui.view,type:"
+msgid "Calendar"
+msgstr ""
+
+msgctxt "selection:ir.ui.view,type:"
 msgid "Form"
 msgstr ""
 
@@ -3869,12 +3900,12 @@ msgctxt "view:ir.ui.view_search:"
 msgid "View Searches"
 msgstr ""
 
-msgctxt "view:ir.ui.view_tree_expanded_state:"
-msgid "View Tree Expanded State"
+msgctxt "view:ir.ui.view_tree_state:"
+msgid "View Tree State"
 msgstr ""
 
-msgctxt "view:ir.ui.view_tree_expanded_state:"
-msgid "Views Tree Expanded State"
+msgctxt "view:ir.ui.view_tree_state:"
+msgid "Views Tree State"
 msgstr ""
 
 msgctxt "view:ir.ui.view_tree_width:"
diff --git a/trytond/ir/locale/de_DE.po b/trytond/ir/locale/de_DE.po
index 67a743c..f6a900a 100644
--- a/trytond/ir/locale/de_DE.po
+++ b/trytond/ir/locale/de_DE.po
@@ -86,12 +86,14 @@ msgstr "Geplante Aktion fehlgeschlagen"
 msgctxt "error:ir.cron:"
 msgid ""
 "The following action failed to execute properly: \"%s\"\n"
+"%s\n"
 " Traceback: \n"
 "\n"
 "%s\n"
 msgstr ""
 "Die folgende Aktion konnte nicht erfolgreich durchgeführt werden: \"%s\"\n"
-" Traceback:\n"
+"%s\n"
+" Traceback: \n"
 "\n"
 "%s"
 
@@ -243,6 +245,14 @@ msgctxt "error:ir.translation:"
 msgid "Translation must be unique"
 msgstr "Übersetzung kann nur einmal vergeben werden."
 
+msgctxt "error:ir.translation:"
+msgid ""
+"You can not export translation %(name)s because it is an overridden "
+"translation by module %(overriding_module)s"
+msgstr ""
+"Übersetzung %(name)s kann nicht exportiert werden, weil sie durch Modul "
+"%(overriding_module)s überschrieben wird."
+
 msgctxt "error:ir.trigger:"
 msgid "\"On Time\" and others are mutually exclusive!"
 msgstr ""
@@ -477,6 +487,10 @@ msgctxt "field:ir.action.act_window,name:"
 msgid "Name"
 msgstr "Name"
 
+msgctxt "field:ir.action.act_window,order:"
+msgid "Order Value"
+msgstr "Wert Reihenfolge"
+
 msgctxt "field:ir.action.act_window,pyson_context:"
 msgid "PySON Context"
 msgstr "PySON Kontext"
@@ -485,6 +499,10 @@ msgctxt "field:ir.action.act_window,pyson_domain:"
 msgid "PySON Domain"
 msgstr "PySON Wertebereich (Domain)"
 
+msgctxt "field:ir.action.act_window,pyson_order:"
+msgid "PySON Order"
+msgstr "Reihenfolge PySON"
+
 msgctxt "field:ir.action.act_window,pyson_search_value:"
 msgid "PySON Search Criteria"
 msgstr "PySON Suchkriterien"
@@ -2085,6 +2103,10 @@ msgctxt "field:ir.translation,name:"
 msgid "Field Name"
 msgstr "Feldname"
 
+msgctxt "field:ir.translation,overriding_module:"
+msgid "Overriding Module"
+msgstr "Überschreibendes Modul"
+
 msgctxt "field:ir.translation,rec_name:"
 msgid "Name"
 msgstr "Name"
@@ -2517,47 +2539,51 @@ msgctxt "field:ir.ui.view_search,write_uid:"
 msgid "Write User"
 msgstr "Letzte Änderung durch"
 
-msgctxt "field:ir.ui.view_tree_expanded_state,child_name:"
+msgctxt "field:ir.ui.view_tree_state,child_name:"
 msgid "Child Name"
-msgstr "Name untergeordneter Eintrag"
+msgstr "Name untergeordnetes Element"
 
-msgctxt "field:ir.ui.view_tree_expanded_state,create_date:"
+msgctxt "field:ir.ui.view_tree_state,create_date:"
 msgid "Create Date"
 msgstr "Erstellungsdatum"
 
-msgctxt "field:ir.ui.view_tree_expanded_state,create_uid:"
+msgctxt "field:ir.ui.view_tree_state,create_uid:"
 msgid "Create User"
 msgstr "Erstellt durch"
 
-msgctxt "field:ir.ui.view_tree_expanded_state,domain:"
+msgctxt "field:ir.ui.view_tree_state,domain:"
 msgid "Domain"
 msgstr "Wertebereich (Domain)"
 
-msgctxt "field:ir.ui.view_tree_expanded_state,id:"
+msgctxt "field:ir.ui.view_tree_state,id:"
 msgid "ID"
 msgstr "ID"
 
-msgctxt "field:ir.ui.view_tree_expanded_state,model:"
+msgctxt "field:ir.ui.view_tree_state,model:"
 msgid "Model"
 msgstr "Modell"
 
-msgctxt "field:ir.ui.view_tree_expanded_state,nodes:"
+msgctxt "field:ir.ui.view_tree_state,nodes:"
 msgid "Expanded Nodes"
-msgstr "Aufgeklappte Knoten"
+msgstr "Expandierte Knoten"
 
-msgctxt "field:ir.ui.view_tree_expanded_state,rec_name:"
+msgctxt "field:ir.ui.view_tree_state,rec_name:"
 msgid "Name"
 msgstr "Name"
 
-msgctxt "field:ir.ui.view_tree_expanded_state,user:"
+msgctxt "field:ir.ui.view_tree_state,selected_nodes:"
+msgid "Selected Nodes"
+msgstr "Ausgewählte Knoten"
+
+msgctxt "field:ir.ui.view_tree_state,user:"
 msgid "User"
 msgstr "Benutzer"
 
-msgctxt "field:ir.ui.view_tree_expanded_state,write_date:"
+msgctxt "field:ir.ui.view_tree_state,write_date:"
 msgid "Write Date"
 msgstr "Zuletzt geändert"
 
-msgctxt "field:ir.ui.view_tree_expanded_state,write_uid:"
+msgctxt "field:ir.ui.view_tree_state,write_uid:"
 msgid "Write User"
 msgstr "Letzte Änderung durch"
 
@@ -2888,9 +2914,9 @@ msgctxt "model:ir.action,name:act_view_show"
 msgid "Show View"
 msgstr "Sicht anzeigen"
 
-msgctxt "model:ir.action,name:act_view_tree_expanded_state"
-msgid "Tree Expanded State"
-msgstr "Menüansicht"
+msgctxt "model:ir.action,name:act_view_tree_state"
+msgid "Tree State"
+msgstr "Status Menübaum"
 
 msgctxt "model:ir.action,name:act_view_tree_width_form"
 msgid "View Tree Width"
@@ -3012,6 +3038,10 @@ msgctxt "model:ir.lang,name:lang_ru"
 msgid "Russian"
 msgstr "Russisch"
 
+msgctxt "model:ir.lang,name:lang_sl"
+msgid "Slovenian"
+msgstr "Slowenisch"
+
 msgctxt "model:ir.model,name:"
 msgid "Model"
 msgstr "Modell"
@@ -3308,9 +3338,9 @@ msgctxt "model:ir.ui.menu,name:menu_view_search"
 msgid "View Search"
 msgstr "Suchansicht"
 
-msgctxt "model:ir.ui.menu,name:menu_view_tree_expanded_state"
-msgid "Tree Expanded State"
-msgstr "Menüansicht"
+msgctxt "model:ir.ui.menu,name:menu_view_tree_state"
+msgid "Tree State"
+msgstr "Status Menübaumansicht"
 
 msgctxt "model:ir.ui.menu,name:menu_view_tree_width"
 msgid "View Tree Width"
@@ -3336,9 +3366,9 @@ msgctxt "model:ir.ui.view_search,name:"
 msgid "View Search"
 msgstr "Suchansicht"
 
-msgctxt "model:ir.ui.view_tree_expanded_state,name:"
-msgid "View Tree Expanded State"
-msgstr "Baumansicht aufgeklappt"
+msgctxt "model:ir.ui.view_tree_state,name:"
+msgid "View Tree State"
+msgstr "Sicht Baumansicht"
 
 msgctxt "model:ir.ui.view_tree_width,name:"
 msgid "View Tree Width"
@@ -3541,6 +3571,10 @@ msgid "Board"
 msgstr "Infoseite"
 
 msgctxt "selection:ir.ui.view,type:"
+msgid "Calendar"
+msgstr "Kalender"
+
+msgctxt "selection:ir.ui.view,type:"
 msgid "Form"
 msgstr "Formular"
 
@@ -3967,13 +4001,13 @@ msgctxt "view:ir.ui.view_search:"
 msgid "View Searches"
 msgstr "Suchsichten"
 
-msgctxt "view:ir.ui.view_tree_expanded_state:"
-msgid "View Tree Expanded State"
-msgstr "Baumansicht aufgeklappt"
+msgctxt "view:ir.ui.view_tree_state:"
+msgid "View Tree State"
+msgstr "Sicht Baumansicht"
 
-msgctxt "view:ir.ui.view_tree_expanded_state:"
-msgid "Views Tree Expanded State"
-msgstr "Baumansichten aufgeklappt"
+msgctxt "view:ir.ui.view_tree_state:"
+msgid "Views Tree State"
+msgstr "Sichten Baumansicht"
 
 msgctxt "view:ir.ui.view_tree_width:"
 msgid "View Tree Width"
@@ -4049,7 +4083,7 @@ msgstr "Abbrechen"
 
 msgctxt "wizard_button:ir.translation.set,start,set_:"
 msgid "Set"
-msgstr "Setzen"
+msgstr "Aktualisieren"
 
 msgctxt "wizard_button:ir.translation.set,succeed,end:"
 msgid "Ok"
diff --git a/trytond/ir/locale/es_AR.po b/trytond/ir/locale/es_AR.po
index c7d2dda..3054aad 100644
--- a/trytond/ir/locale/es_AR.po
+++ b/trytond/ir/locale/es_AR.po
@@ -78,12 +78,14 @@ msgstr "La acción programada ha fallado"
 msgctxt "error:ir.cron:"
 msgid ""
 "The following action failed to execute properly: \"%s\"\n"
+"%s\n"
 " Traceback: \n"
 "\n"
 "%s\n"
 msgstr ""
-"La siguiente acción no se ejecutó correctamente: «%s»\n"
-" Traza:\n"
+"Ha fallado la acción cuando se ejecutaba: «%s»\n"
+"%s\n"
+" Traceback: \n"
 "\n"
 "%s\n"
 
@@ -198,8 +200,7 @@ msgstr "El sufijo «%(prefix)s» en secuencia «%(sequence)s» no es correcto."
 msgctxt "error:ir.sequence.strict:"
 msgid "Last Timestamp cannot be in the future on sequence \"%s\"."
 msgstr ""
-"La última marca de tiempo no puede situarse en el futuro para la secuencia "
-"«%s»."
+"La última fecha-hora no puede situarse en el futuro para la secuencia «%s»."
 
 msgctxt "error:ir.sequence.strict:"
 msgid "Missing sequence."
@@ -207,7 +208,7 @@ msgstr "Falta la secuencia."
 
 msgctxt "error:ir.sequence.strict:"
 msgid "Timestamp rounding should be greater than 0"
-msgstr "El redondeo de la marca de tiempo debe ser mayor que 0"
+msgstr "El redondeo de la fecha-hora debe ser mayor que 0"
 
 msgctxt "error:ir.sequence:"
 msgid "Invalid prefix \"%(prefix)s\" on sequence \"%(sequence)s\"."
@@ -220,8 +221,7 @@ msgstr "El sufijo «%(prefix)s» en secuencia «%(sequence)s» no es correcto."
 msgctxt "error:ir.sequence:"
 msgid "Last Timestamp cannot be in the future on sequence \"%s\"."
 msgstr ""
-"La última marca de tiempo no puede situarse en el futuro para la secuencia "
-"«%s»."
+"La última fecha-hora no puede situarse en el futuro para la secuencia «%s»."
 
 msgctxt "error:ir.sequence:"
 msgid "Missing sequence."
@@ -229,12 +229,20 @@ msgstr "Falta la secuencia."
 
 msgctxt "error:ir.sequence:"
 msgid "Timestamp rounding should be greater than 0"
-msgstr "El redondeo de la marca de tiempo debe ser mayor que 0"
+msgstr "El redondeo de la fecha-hora debe ser mayor que 0"
 
 msgctxt "error:ir.translation:"
 msgid "Translation must be unique"
 msgstr "La traducción debe ser única"
 
+msgctxt "error:ir.translation:"
+msgid ""
+"You can not export translation %(name)s because it is an overridden "
+"translation by module %(overriding_module)s"
+msgstr ""
+"No puede exportar la traducción %(name)s porque se usa en el módulo "
+"%(overriding_module)s"
+
 msgctxt "error:ir.trigger:"
 msgid "\"On Time\" and others are mutually exclusive!"
 msgstr "¡\"Al Tiempo\" y otros son mutuamente excluyentes!"
@@ -361,7 +369,7 @@ msgstr "Fecha creación"
 
 msgctxt "field:ir.action,create_uid:"
 msgid "Create User"
-msgstr "Creado por Usuario"
+msgstr "Usuario creación"
 
 msgctxt "field:ir.action,groups:"
 msgid "Groups"
@@ -401,7 +409,7 @@ msgstr "Fecha modificación"
 
 msgctxt "field:ir.action,write_uid:"
 msgid "Write User"
-msgstr "Modificado por Usuario"
+msgstr "Usuario modificación"
 
 msgctxt "field:ir.action.act_window,act_window_domains:"
 msgid "Domains"
@@ -433,7 +441,7 @@ msgstr "Fecha creación"
 
 msgctxt "field:ir.action.act_window,create_uid:"
 msgid "Create User"
-msgstr "Creado por Usuario"
+msgstr "Usuario creación"
 
 msgctxt "field:ir.action.act_window,domain:"
 msgid "Domain Value"
@@ -467,6 +475,10 @@ msgctxt "field:ir.action.act_window,name:"
 msgid "Name"
 msgstr "Nombre campo"
 
+msgctxt "field:ir.action.act_window,order:"
+msgid "Order Value"
+msgstr "Valor ordenación"
+
 msgctxt "field:ir.action.act_window,pyson_context:"
 msgid "PySON Context"
 msgstr "Contexto PySON"
@@ -475,6 +487,10 @@ msgctxt "field:ir.action.act_window,pyson_domain:"
 msgid "PySON Domain"
 msgstr "Dominio de PySON"
 
+msgctxt "field:ir.action.act_window,pyson_order:"
+msgid "PySON Order"
+msgstr "Orden PySON"
+
 msgctxt "field:ir.action.act_window,pyson_search_value:"
 msgid "PySON Search Criteria"
 msgstr "Criterio de Búsqueda de PySON"
@@ -513,7 +529,7 @@ msgstr "Fecha modificación"
 
 msgctxt "field:ir.action.act_window,write_uid:"
 msgid "Write User"
-msgstr "Modificado por Usuario"
+msgstr "Usuario modificación"
 
 msgctxt "field:ir.action.act_window.domain,act_window:"
 msgid "Action"
@@ -529,7 +545,7 @@ msgstr "Fecha creación"
 
 msgctxt "field:ir.action.act_window.domain,create_uid:"
 msgid "Create User"
-msgstr "Creado por Usuario"
+msgstr "Usuario creación"
 
 msgctxt "field:ir.action.act_window.domain,domain:"
 msgid "Domain"
@@ -557,7 +573,7 @@ msgstr "Fecha modificación"
 
 msgctxt "field:ir.action.act_window.domain,write_uid:"
 msgid "Write User"
-msgstr "Modificado por Usuario"
+msgstr "Usuario modificación"
 
 msgctxt "field:ir.action.act_window.view,act_window:"
 msgid "Action"
@@ -569,7 +585,7 @@ msgstr "Fecha creación"
 
 msgctxt "field:ir.action.act_window.view,create_uid:"
 msgid "Create User"
-msgstr "Creado por Usuario"
+msgstr "Usuario creación"
 
 msgctxt "field:ir.action.act_window.view,id:"
 msgid "ID"
@@ -593,7 +609,7 @@ msgstr "Fecha modificación"
 
 msgctxt "field:ir.action.act_window.view,write_uid:"
 msgid "Write User"
-msgstr "Modificado por Usuario"
+msgstr "Usuario modificación"
 
 msgctxt "field:ir.action.keyword,action:"
 msgid "Action"
@@ -605,7 +621,7 @@ msgstr "Fecha creación"
 
 msgctxt "field:ir.action.keyword,create_uid:"
 msgid "Create User"
-msgstr "Creado por Usuario"
+msgstr "Usuario creación"
 
 msgctxt "field:ir.action.keyword,groups:"
 msgid "Groups"
@@ -633,7 +649,7 @@ msgstr "Fecha modificación"
 
 msgctxt "field:ir.action.keyword,write_uid:"
 msgid "Write User"
-msgstr "Modificado por Usuario"
+msgstr "Usuario modificación"
 
 msgctxt "field:ir.action.report,action:"
 msgid "Action"
@@ -649,7 +665,7 @@ msgstr "Fecha creación"
 
 msgctxt "field:ir.action.report,create_uid:"
 msgid "Create User"
-msgstr "Creado por Usuario"
+msgstr "Usuario creación"
 
 msgctxt "field:ir.action.report,direct_print:"
 msgid "Direct Print"
@@ -741,7 +757,7 @@ msgstr "Fecha modificación"
 
 msgctxt "field:ir.action.report,write_uid:"
 msgid "Write User"
-msgstr "Modificado por Usuario"
+msgstr "Usuario modificación"
 
 msgctxt "field:ir.action.url,action:"
 msgid "Action"
@@ -757,7 +773,7 @@ msgstr "Fecha creación"
 
 msgctxt "field:ir.action.url,create_uid:"
 msgid "Create User"
-msgstr "Creado por Usuario"
+msgstr "Usuario creación"
 
 msgctxt "field:ir.action.url,groups:"
 msgid "Groups"
@@ -801,7 +817,7 @@ msgstr "Fecha modificación"
 
 msgctxt "field:ir.action.url,write_uid:"
 msgid "Write User"
-msgstr "Modificado por Usuario"
+msgstr "Usuario modificación"
 
 msgctxt "field:ir.action.wizard,action:"
 msgid "Action"
@@ -817,7 +833,7 @@ msgstr "Fecha creación"
 
 msgctxt "field:ir.action.wizard,create_uid:"
 msgid "Create User"
-msgstr "Creado por Usuario"
+msgstr "Usuario creación"
 
 msgctxt "field:ir.action.wizard,email:"
 msgid "Email"
@@ -873,7 +889,7 @@ msgstr "Fecha modificación"
 
 msgctxt "field:ir.action.wizard,write_uid:"
 msgid "Write User"
-msgstr "Modificado por Usuario"
+msgstr "Usuario modificación"
 
 msgctxt "field:ir.attachment,collision:"
 msgid "Collision"
@@ -885,7 +901,7 @@ msgstr "Fecha creación"
 
 msgctxt "field:ir.attachment,create_uid:"
 msgid "Create User"
-msgstr "Creado por Usuario"
+msgstr "Usuario creación"
 
 msgctxt "field:ir.attachment,data:"
 msgid "Data"
@@ -945,7 +961,7 @@ msgstr "Fecha modificación"
 
 msgctxt "field:ir.attachment,write_uid:"
 msgid "Write User"
-msgstr "Modificado por Usuario"
+msgstr "Usuario modificación"
 
 msgctxt "field:ir.cache,create_date:"
 msgid "Create Date"
@@ -953,7 +969,7 @@ msgstr "Fecha creación"
 
 msgctxt "field:ir.cache,create_uid:"
 msgid "Create User"
-msgstr "Creado por Usuario"
+msgstr "Usuario creación"
 
 msgctxt "field:ir.cache,id:"
 msgid "ID"
@@ -969,7 +985,7 @@ msgstr "Nombre"
 
 msgctxt "field:ir.cache,timestamp:"
 msgid "Timestamp"
-msgstr "Marca de tiempo"
+msgstr "Fecha-hora"
 
 msgctxt "field:ir.cache,write_date:"
 msgid "Write Date"
@@ -977,7 +993,7 @@ msgstr "Fecha modificación"
 
 msgctxt "field:ir.cache,write_uid:"
 msgid "Write User"
-msgstr "Modificado por Usuario"
+msgstr "Usuario modificación"
 
 msgctxt "field:ir.configuration,create_date:"
 msgid "Create Date"
@@ -985,7 +1001,7 @@ msgstr "Fecha creación"
 
 msgctxt "field:ir.configuration,create_uid:"
 msgid "Create User"
-msgstr "Creado por Usuario"
+msgstr "Usuario creación"
 
 msgctxt "field:ir.configuration,id:"
 msgid "ID"
@@ -1005,7 +1021,7 @@ msgstr "Fecha modificación"
 
 msgctxt "field:ir.configuration,write_uid:"
 msgid "Write User"
-msgstr "Modificado por Usuario"
+msgstr "Usuario modificación"
 
 msgctxt "field:ir.cron,active:"
 msgid "Active"
@@ -1021,7 +1037,7 @@ msgstr "Fecha creación"
 
 msgctxt "field:ir.cron,create_uid:"
 msgid "Create User"
-msgstr "Creado por Usuario"
+msgstr "Usuario creación"
 
 msgctxt "field:ir.cron,function:"
 msgid "Function"
@@ -1077,7 +1093,7 @@ msgstr "Fecha modificación"
 
 msgctxt "field:ir.cron,write_uid:"
 msgid "Write User"
-msgstr "Modificado por Usuario"
+msgstr "Usuario modificación"
 
 msgctxt "field:ir.date,id:"
 msgid "ID"
@@ -1089,7 +1105,7 @@ msgstr "Fecha creación"
 
 msgctxt "field:ir.export,create_uid:"
 msgid "Create User"
-msgstr "Creado por Usuario"
+msgstr "Usuario creación"
 
 msgctxt "field:ir.export,export_fields:"
 msgid "Fields"
@@ -1117,7 +1133,7 @@ msgstr "Fecha modificación"
 
 msgctxt "field:ir.export,write_uid:"
 msgid "Write User"
-msgstr "Modificado por Usuario"
+msgstr "Usuario modificación"
 
 msgctxt "field:ir.export.line,create_date:"
 msgid "Create Date"
@@ -1125,7 +1141,7 @@ msgstr "Fecha creación"
 
 msgctxt "field:ir.export.line,create_uid:"
 msgid "Create User"
-msgstr "Creado por Usuario"
+msgstr "Usuario creación"
 
 msgctxt "field:ir.export.line,export:"
 msgid "Export"
@@ -1149,7 +1165,7 @@ msgstr "Fecha modificación"
 
 msgctxt "field:ir.export.line,write_uid:"
 msgid "Write User"
-msgstr "Modificado por Usuario"
+msgstr "Usuario modificación"
 
 msgctxt "field:ir.lang,active:"
 msgid "Active"
@@ -1165,7 +1181,7 @@ msgstr "Fecha creación"
 
 msgctxt "field:ir.lang,create_uid:"
 msgid "Create User"
-msgstr "Creado por Usuario"
+msgstr "Usuario creación"
 
 msgctxt "field:ir.lang,date:"
 msgid "Date"
@@ -1209,7 +1225,7 @@ msgstr "Fecha modificación"
 
 msgctxt "field:ir.lang,write_uid:"
 msgid "Write User"
-msgstr "Modificado por Usuario"
+msgstr "Usuario modificación"
 
 msgctxt "field:ir.model,create_date:"
 msgid "Create Date"
@@ -1217,7 +1233,7 @@ msgstr "Fecha creación"
 
 msgctxt "field:ir.model,create_uid:"
 msgid "Create User"
-msgstr "Creado por Usuario"
+msgstr "Usuario creación"
 
 msgctxt "field:ir.model,fields:"
 msgid "Fields"
@@ -1257,7 +1273,7 @@ msgstr "Fecha modificación"
 
 msgctxt "field:ir.model,write_uid:"
 msgid "Write User"
-msgstr "Modificado por Usuario"
+msgstr "Usuario modificación"
 
 msgctxt "field:ir.model.access,create_date:"
 msgid "Create Date"
@@ -1265,7 +1281,7 @@ msgstr "Fecha creación"
 
 msgctxt "field:ir.model.access,create_uid:"
 msgid "Create User"
-msgstr "Creado por Usuario"
+msgstr "Usuario creación"
 
 msgctxt "field:ir.model.access,description:"
 msgid "Description"
@@ -1309,7 +1325,7 @@ msgstr "Fecha modificación"
 
 msgctxt "field:ir.model.access,write_uid:"
 msgid "Write User"
-msgstr "Modificado por Usuario"
+msgstr "Usuario modificación"
 
 msgctxt "field:ir.model.button,create_date:"
 msgid "Create Date"
@@ -1317,7 +1333,7 @@ msgstr "Fecha creación"
 
 msgctxt "field:ir.model.button,create_uid:"
 msgid "Create User"
-msgstr "Creado por Usuario"
+msgstr "Usuario creación"
 
 msgctxt "field:ir.model.button,groups:"
 msgid "Groups"
@@ -1345,7 +1361,7 @@ msgstr "Fecha modificación"
 
 msgctxt "field:ir.model.button,write_uid:"
 msgid "Write User"
-msgstr "Modificado por Usuario"
+msgstr "Usuario modificación"
 
 msgctxt "field:ir.model.data,create_date:"
 msgid "Create Date"
@@ -1353,7 +1369,7 @@ msgstr "Fecha creación"
 
 msgctxt "field:ir.model.data,create_uid:"
 msgid "Create User"
-msgstr "Creado por Usuario"
+msgstr "Usuario creación"
 
 msgctxt "field:ir.model.data,date_init:"
 msgid "Init Date"
@@ -1401,7 +1417,7 @@ msgstr "Fecha modificación"
 
 msgctxt "field:ir.model.data,write_uid:"
 msgid "Write User"
-msgstr "Modificado por Usuario"
+msgstr "Usuario modificación"
 
 msgctxt "field:ir.model.field,create_date:"
 msgid "Create Date"
@@ -1409,7 +1425,7 @@ msgstr "Fecha creación"
 
 msgctxt "field:ir.model.field,create_uid:"
 msgid "Create User"
-msgstr "Creado por Usuario"
+msgstr "Usuario creación"
 
 msgctxt "field:ir.model.field,field_description:"
 msgid "Field Description"
@@ -1457,7 +1473,7 @@ msgstr "Fecha modificación"
 
 msgctxt "field:ir.model.field,write_uid:"
 msgid "Write User"
-msgstr "Modificado por Usuario"
+msgstr "Usuario modificación"
 
 msgctxt "field:ir.model.field.access,create_date:"
 msgid "Create Date"
@@ -1465,7 +1481,7 @@ msgstr "Fecha creación"
 
 msgctxt "field:ir.model.field.access,create_uid:"
 msgid "Create User"
-msgstr "Creado por Usuario"
+msgstr "Usuario creación"
 
 msgctxt "field:ir.model.field.access,description:"
 msgid "Description"
@@ -1509,7 +1525,7 @@ msgstr "Fecha modificación"
 
 msgctxt "field:ir.model.field.access,write_uid:"
 msgid "Write User"
-msgstr "Modificado por Usuario"
+msgstr "Usuario modificación"
 
 msgctxt "field:ir.model.print_model_graph.start,filter:"
 msgid "Filter"
@@ -1533,7 +1549,7 @@ msgstr "Fecha creación"
 
 msgctxt "field:ir.module.module,create_uid:"
 msgid "Create User"
-msgstr "Creado por Usuario"
+msgstr "Usuario creación"
 
 msgctxt "field:ir.module.module,dependencies:"
 msgid "Dependencies"
@@ -1569,7 +1585,7 @@ msgstr "Fecha modificación"
 
 msgctxt "field:ir.module.module,write_uid:"
 msgid "Write User"
-msgstr "Modificado por Usuario"
+msgstr "Usuario modificación"
 
 msgctxt "field:ir.module.module.config_wizard.first,id:"
 msgid "ID"
@@ -1585,7 +1601,7 @@ msgstr "Fecha creación"
 
 msgctxt "field:ir.module.module.config_wizard.item,create_uid:"
 msgid "Create User"
-msgstr "Creado por Usuario"
+msgstr "Usuario creación"
 
 msgctxt "field:ir.module.module.config_wizard.item,id:"
 msgid "ID"
@@ -1609,7 +1625,7 @@ msgstr "Fecha modificación"
 
 msgctxt "field:ir.module.module.config_wizard.item,write_uid:"
 msgid "Write User"
-msgstr "Modificado por Usuario"
+msgstr "Usuario modificación"
 
 msgctxt "field:ir.module.module.config_wizard.other,id:"
 msgid "ID"
@@ -1625,7 +1641,7 @@ msgstr "Fecha creación"
 
 msgctxt "field:ir.module.module.dependency,create_uid:"
 msgid "Create User"
-msgstr "Creado por Usuario"
+msgstr "Usuario creación"
 
 msgctxt "field:ir.module.module.dependency,id:"
 msgid "ID"
@@ -1653,7 +1669,7 @@ msgstr "Fecha modificación"
 
 msgctxt "field:ir.module.module.dependency,write_uid:"
 msgid "Write User"
-msgstr "Modificado por Usuario"
+msgstr "Usuario modificación"
 
 msgctxt "field:ir.module.module.install_upgrade.done,id:"
 msgid "ID"
@@ -1673,7 +1689,7 @@ msgstr "Fecha creación"
 
 msgctxt "field:ir.property,create_uid:"
 msgid "Create User"
-msgstr "Creado por Usuario"
+msgstr "Usuario creación"
 
 msgctxt "field:ir.property,field:"
 msgid "Field"
@@ -1701,7 +1717,7 @@ msgstr "Fecha modificación"
 
 msgctxt "field:ir.property,write_uid:"
 msgid "Write User"
-msgstr "Modificado por Usuario"
+msgstr "Usuario modificación"
 
 msgctxt "field:ir.rule,create_date:"
 msgid "Create Date"
@@ -1709,7 +1725,7 @@ msgstr "Fecha creación"
 
 msgctxt "field:ir.rule,create_uid:"
 msgid "Create User"
-msgstr "Creado por Usuario"
+msgstr "Usuario creación"
 
 msgctxt "field:ir.rule,domain:"
 msgid "Domain"
@@ -1733,7 +1749,7 @@ msgstr "Fecha modificación"
 
 msgctxt "field:ir.rule,write_uid:"
 msgid "Write User"
-msgstr "Modificado por Usuario"
+msgstr "Usuario modificación"
 
 msgctxt "field:ir.rule.group,create_date:"
 msgid "Create Date"
@@ -1741,7 +1757,7 @@ msgstr "Fecha creación"
 
 msgctxt "field:ir.rule.group,create_uid:"
 msgid "Create User"
-msgstr "Creado por Usuario"
+msgstr "Usuario creación"
 
 msgctxt "field:ir.rule.group,default_p:"
 msgid "Default"
@@ -1801,7 +1817,7 @@ msgstr "Fecha modificación"
 
 msgctxt "field:ir.rule.group,write_uid:"
 msgid "Write User"
-msgstr "Modificado por Usuario"
+msgstr "Usuario modificación"
 
 msgctxt "field:ir.sequence,active:"
 msgid "Active"
@@ -1817,7 +1833,7 @@ msgstr "Fecha creación"
 
 msgctxt "field:ir.sequence,create_uid:"
 msgid "Create User"
-msgstr "Creado por Usuario"
+msgstr "Usuario creación"
 
 msgctxt "field:ir.sequence,id:"
 msgid "ID"
@@ -1825,7 +1841,7 @@ msgstr "ID"
 
 msgctxt "field:ir.sequence,last_timestamp:"
 msgid "Last Timestamp"
-msgstr "Última Marca de Tiempo"
+msgstr "Última fecha-hora"
 
 msgctxt "field:ir.sequence,name:"
 msgid "Sequence Name"
@@ -1861,11 +1877,11 @@ msgstr "Sufijo"
 
 msgctxt "field:ir.sequence,timestamp_offset:"
 msgid "Timestamp Offset"
-msgstr "Compensación de Marca de Tiempo"
+msgstr "Desfase de fecha-hora"
 
 msgctxt "field:ir.sequence,timestamp_rounding:"
 msgid "Timestamp Rounding"
-msgstr "Redondeo de Marca de Tiempo"
+msgstr "Redondeo de fecha-hora"
 
 msgctxt "field:ir.sequence,type:"
 msgid "Type"
@@ -1877,7 +1893,7 @@ msgstr "Fecha modificación"
 
 msgctxt "field:ir.sequence,write_uid:"
 msgid "Write User"
-msgstr "Modificado por Usuario"
+msgstr "Usuario modificación"
 
 msgctxt "field:ir.sequence.strict,active:"
 msgid "Active"
@@ -1893,7 +1909,7 @@ msgstr "Fecha creación"
 
 msgctxt "field:ir.sequence.strict,create_uid:"
 msgid "Create User"
-msgstr "Creado por Usuario"
+msgstr "Usuario creación"
 
 msgctxt "field:ir.sequence.strict,id:"
 msgid "ID"
@@ -1901,7 +1917,7 @@ msgstr "ID"
 
 msgctxt "field:ir.sequence.strict,last_timestamp:"
 msgid "Last Timestamp"
-msgstr "Última Marca de Tiempo"
+msgstr "Última fecha-hora"
 
 msgctxt "field:ir.sequence.strict,name:"
 msgid "Sequence Name"
@@ -1937,11 +1953,11 @@ msgstr "Sufijo"
 
 msgctxt "field:ir.sequence.strict,timestamp_offset:"
 msgid "Timestamp Offset"
-msgstr "Compensación de Marca de Tiempo"
+msgstr "Desfase de fecha-hora"
 
 msgctxt "field:ir.sequence.strict,timestamp_rounding:"
 msgid "Timestamp Rounding"
-msgstr "Redondeo de Marca de Tiempo"
+msgstr "Redondeo de fecha-hora"
 
 msgctxt "field:ir.sequence.strict,type:"
 msgid "Type"
@@ -1953,7 +1969,7 @@ msgstr "Fecha modificación"
 
 msgctxt "field:ir.sequence.strict,write_uid:"
 msgid "Write User"
-msgstr "Modificado por Usuario"
+msgstr "Usuario modificación"
 
 msgctxt "field:ir.sequence.type,code:"
 msgid "Sequence Code"
@@ -1965,7 +1981,7 @@ msgstr "Fecha creación"
 
 msgctxt "field:ir.sequence.type,create_uid:"
 msgid "Create User"
-msgstr "Creado por Usuario"
+msgstr "Usuario creación"
 
 msgctxt "field:ir.sequence.type,id:"
 msgid "ID"
@@ -1985,7 +2001,7 @@ msgstr "Fecha modificación"
 
 msgctxt "field:ir.sequence.type,write_uid:"
 msgid "Write User"
-msgstr "Modificado por Usuario"
+msgstr "Usuario modificación"
 
 msgctxt "field:ir.session,create_date:"
 msgid "Create Date"
@@ -1993,7 +2009,7 @@ msgstr "Fecha creación"
 
 msgctxt "field:ir.session,create_uid:"
 msgid "Create User"
-msgstr "Creado por Usuario"
+msgstr "Usuario creación"
 
 msgctxt "field:ir.session,id:"
 msgid "ID"
@@ -2013,7 +2029,7 @@ msgstr "Fecha modificación"
 
 msgctxt "field:ir.session,write_uid:"
 msgid "Write User"
-msgstr "Modificado por Usuario"
+msgstr "Usuario modificación"
 
 msgctxt "field:ir.session.wizard,create_date:"
 msgid "Create Date"
@@ -2021,7 +2037,7 @@ msgstr "Fecha creación"
 
 msgctxt "field:ir.session.wizard,create_uid:"
 msgid "Create User"
-msgstr "Creado por Usuario"
+msgstr "Usuario creación"
 
 msgctxt "field:ir.session.wizard,data:"
 msgid "Data"
@@ -2041,7 +2057,7 @@ msgstr "Fecha modificación"
 
 msgctxt "field:ir.session.wizard,write_uid:"
 msgid "Write User"
-msgstr "Modificado por Usuario"
+msgstr "Usuario modificación"
 
 msgctxt "field:ir.translation,create_date:"
 msgid "Create Date"
@@ -2049,7 +2065,7 @@ msgstr "Fecha creación"
 
 msgctxt "field:ir.translation,create_uid:"
 msgid "Create User"
-msgstr "Creado por Usuario"
+msgstr "Usuario creación"
 
 msgctxt "field:ir.translation,fuzzy:"
 msgid "Fuzzy"
@@ -2075,6 +2091,10 @@ msgctxt "field:ir.translation,name:"
 msgid "Field Name"
 msgstr "Nombre campo"
 
+msgctxt "field:ir.translation,overriding_module:"
+msgid "Overriding Module"
+msgstr "Módulo principal"
+
 msgctxt "field:ir.translation,rec_name:"
 msgid "Name"
 msgstr "Nombre"
@@ -2105,7 +2125,7 @@ msgstr "Fecha modificación"
 
 msgctxt "field:ir.translation,write_uid:"
 msgid "Write User"
-msgstr "Modificado por Usuario"
+msgstr "Usuario modificación"
 
 msgctxt "field:ir.translation.clean.start,id:"
 msgid "ID"
@@ -2173,7 +2193,7 @@ msgstr "Fecha creación"
 
 msgctxt "field:ir.trigger,create_uid:"
 msgid "Create User"
-msgstr "Creado por Usuario"
+msgstr "Usuario creación"
 
 msgctxt "field:ir.trigger,id:"
 msgid "ID"
@@ -2221,7 +2241,7 @@ msgstr "Fecha modificación"
 
 msgctxt "field:ir.trigger,write_uid:"
 msgid "Write User"
-msgstr "Modificado por Usuario"
+msgstr "Usuario modificación"
 
 msgctxt "field:ir.trigger.log,create_date:"
 msgid "Create Date"
@@ -2229,7 +2249,7 @@ msgstr "Fecha creación"
 
 msgctxt "field:ir.trigger.log,create_uid:"
 msgid "Create User"
-msgstr "Creado por Usuario"
+msgstr "Usuario creación"
 
 msgctxt "field:ir.trigger.log,id:"
 msgid "ID"
@@ -2253,7 +2273,7 @@ msgstr "Fecha modificación"
 
 msgctxt "field:ir.trigger.log,write_uid:"
 msgid "Write User"
-msgstr "Modificado por Usuario"
+msgstr "Usuario modificación"
 
 msgctxt "field:ir.ui.icon,create_date:"
 msgid "Create Date"
@@ -2261,7 +2281,7 @@ msgstr "Fecha creación"
 
 msgctxt "field:ir.ui.icon,create_uid:"
 msgid "Create User"
-msgstr "Creado por Usuario"
+msgstr "Usuario creación"
 
 msgctxt "field:ir.ui.icon,icon:"
 msgid "Icon"
@@ -2297,7 +2317,7 @@ msgstr "Fecha modificación"
 
 msgctxt "field:ir.ui.icon,write_uid:"
 msgid "Write User"
-msgstr "Modificado por Usuario"
+msgstr "Usuario modificación"
 
 msgctxt "field:ir.ui.menu,action:"
 msgid "Action"
@@ -2321,7 +2341,7 @@ msgstr "Fecha creación"
 
 msgctxt "field:ir.ui.menu,create_uid:"
 msgid "Create User"
-msgstr "Creado por Usuario"
+msgstr "Usuario creación"
 
 msgctxt "field:ir.ui.menu,favorite:"
 msgid "Favorite"
@@ -2361,7 +2381,7 @@ msgstr "Fecha modificación"
 
 msgctxt "field:ir.ui.menu,write_uid:"
 msgid "Write User"
-msgstr "Modificado por Usuario"
+msgstr "Usuario modificación"
 
 msgctxt "field:ir.ui.menu.favorite,create_date:"
 msgid "Create Date"
@@ -2369,7 +2389,7 @@ msgstr "Fecha creación"
 
 msgctxt "field:ir.ui.menu.favorite,create_uid:"
 msgid "Create User"
-msgstr "Creado por Usuario"
+msgstr "Usuario creación"
 
 msgctxt "field:ir.ui.menu.favorite,id:"
 msgid "ID"
@@ -2397,7 +2417,7 @@ msgstr "Fecha modificación"
 
 msgctxt "field:ir.ui.menu.favorite,write_uid:"
 msgid "Write User"
-msgstr "Modificado por Usuario"
+msgstr "Usuario modificación"
 
 msgctxt "field:ir.ui.view,arch:"
 msgid "View Architecture"
@@ -2409,7 +2429,7 @@ msgstr "Fecha creación"
 
 msgctxt "field:ir.ui.view,create_uid:"
 msgid "Create User"
-msgstr "Creado por Usuario"
+msgstr "Usuario creación"
 
 msgctxt "field:ir.ui.view,data:"
 msgid "Data"
@@ -2461,7 +2481,7 @@ msgstr "Fecha modificación"
 
 msgctxt "field:ir.ui.view,write_uid:"
 msgid "Write User"
-msgstr "Modificado por Usuario"
+msgstr "Usuario modificación"
 
 msgctxt "field:ir.ui.view.show.start,id:"
 msgid "ID"
@@ -2473,7 +2493,7 @@ msgstr "Fecha creación"
 
 msgctxt "field:ir.ui.view_search,create_uid:"
 msgid "Create User"
-msgstr "Creado por Usuario"
+msgstr "Usuario creación"
 
 msgctxt "field:ir.ui.view_search,domain:"
 msgid "Domain"
@@ -2505,51 +2525,55 @@ msgstr "Fecha modificación"
 
 msgctxt "field:ir.ui.view_search,write_uid:"
 msgid "Write User"
-msgstr "Modificado por Usuario"
+msgstr "Usuario modificación"
 
-msgctxt "field:ir.ui.view_tree_expanded_state,child_name:"
+msgctxt "field:ir.ui.view_tree_state,child_name:"
 msgid "Child Name"
-msgstr "Nombre del hijo"
+msgstr "Nombre hijo"
 
-msgctxt "field:ir.ui.view_tree_expanded_state,create_date:"
+msgctxt "field:ir.ui.view_tree_state,create_date:"
 msgid "Create Date"
 msgstr "Fecha creación"
 
-msgctxt "field:ir.ui.view_tree_expanded_state,create_uid:"
+msgctxt "field:ir.ui.view_tree_state,create_uid:"
 msgid "Create User"
-msgstr "Creado por Usuario"
+msgstr "Usuario creación"
 
-msgctxt "field:ir.ui.view_tree_expanded_state,domain:"
+msgctxt "field:ir.ui.view_tree_state,domain:"
 msgid "Domain"
 msgstr "Dominio"
 
-msgctxt "field:ir.ui.view_tree_expanded_state,id:"
+msgctxt "field:ir.ui.view_tree_state,id:"
 msgid "ID"
 msgstr "ID"
 
-msgctxt "field:ir.ui.view_tree_expanded_state,model:"
+msgctxt "field:ir.ui.view_tree_state,model:"
 msgid "Model"
 msgstr "Modelo"
 
-msgctxt "field:ir.ui.view_tree_expanded_state,nodes:"
+msgctxt "field:ir.ui.view_tree_state,nodes:"
 msgid "Expanded Nodes"
-msgstr "Nodos Expandidos"
+msgstr "Nodos expandidos"
 
-msgctxt "field:ir.ui.view_tree_expanded_state,rec_name:"
+msgctxt "field:ir.ui.view_tree_state,rec_name:"
 msgid "Name"
-msgstr "Nombre campo"
+msgstr "Nombre"
+
+msgctxt "field:ir.ui.view_tree_state,selected_nodes:"
+msgid "Selected Nodes"
+msgstr "Nodos seleccionados"
 
-msgctxt "field:ir.ui.view_tree_expanded_state,user:"
+msgctxt "field:ir.ui.view_tree_state,user:"
 msgid "User"
 msgstr "Usuario"
 
-msgctxt "field:ir.ui.view_tree_expanded_state,write_date:"
+msgctxt "field:ir.ui.view_tree_state,write_date:"
 msgid "Write Date"
 msgstr "Fecha modificación"
 
-msgctxt "field:ir.ui.view_tree_expanded_state,write_uid:"
+msgctxt "field:ir.ui.view_tree_state,write_uid:"
 msgid "Write User"
-msgstr "Modificado por Usuario"
+msgstr "Usuario modificación"
 
 msgctxt "field:ir.ui.view_tree_width,create_date:"
 msgid "Create Date"
@@ -2557,7 +2581,7 @@ msgstr "Fecha creación"
 
 msgctxt "field:ir.ui.view_tree_width,create_uid:"
 msgid "Create User"
-msgstr "Creado por Usuario"
+msgstr "Usuario creación"
 
 msgctxt "field:ir.ui.view_tree_width,field:"
 msgid "Field"
@@ -2589,7 +2613,7 @@ msgstr "Fecha modificación"
 
 msgctxt "field:ir.ui.view_tree_width,write_uid:"
 msgid "Write User"
-msgstr "Modificado por Usuario"
+msgstr "Usuario modificación"
 
 msgctxt "help:ir.action.act_window,auto_refresh:"
 msgid "Add an auto-refresh on the view"
@@ -2875,9 +2899,9 @@ msgctxt "model:ir.action,name:act_view_show"
 msgid "Show View"
 msgstr "Mostrar Vista"
 
-msgctxt "model:ir.action,name:act_view_tree_expanded_state"
-msgid "Tree Expanded State"
-msgstr "Estado del árbol expandido"
+msgctxt "model:ir.action,name:act_view_tree_state"
+msgid "Tree State"
+msgstr "Estado árbol"
 
 msgctxt "model:ir.action,name:act_view_tree_width_form"
 msgid "View Tree Width"
@@ -2989,7 +3013,7 @@ msgstr "Francés"
 
 msgctxt "model:ir.lang,name:lang_lt"
 msgid "Lithuanian"
-msgstr ""
+msgstr "Lituano"
 
 msgctxt "model:ir.lang,name:lang_nl"
 msgid "Dutch"
@@ -2999,6 +3023,10 @@ msgctxt "model:ir.lang,name:lang_ru"
 msgid "Russian"
 msgstr "Ruso"
 
+msgctxt "model:ir.lang,name:lang_sl"
+msgid "Slovenian"
+msgstr "Esloveno"
+
 msgctxt "model:ir.model,name:"
 msgid "Model"
 msgstr "Modelo"
@@ -3033,7 +3061,7 @@ msgstr "Módulo"
 
 msgctxt "model:ir.module.module.config_wizard.first,name:"
 msgid "Module Config Wizard First"
-msgstr "Módulo del primer asistente de configuración"
+msgstr "Asistente de configuración inicial del módulo"
 
 msgctxt "model:ir.module.module.config_wizard.item,name:"
 msgid "Config wizard to run after installing module"
@@ -3042,7 +3070,7 @@ msgstr ""
 
 msgctxt "model:ir.module.module.config_wizard.other,name:"
 msgid "Module Config Wizard Other"
-msgstr "Módulo de Configuración de otro Asistente"
+msgstr "Asistente de configuración adicional del módulo"
 
 msgctxt "model:ir.module.module.dependency,name:"
 msgid "Module dependency"
@@ -3296,9 +3324,9 @@ msgctxt "model:ir.ui.menu,name:menu_view_search"
 msgid "View Search"
 msgstr "Vista de búsqueda"
 
-msgctxt "model:ir.ui.menu,name:menu_view_tree_expanded_state"
-msgid "Tree Expanded State"
-msgstr "Estado del árbol expandido"
+msgctxt "model:ir.ui.menu,name:menu_view_tree_state"
+msgid "Tree State"
+msgstr "Estado árbol"
 
 msgctxt "model:ir.ui.menu,name:menu_view_tree_width"
 msgid "View Tree Width"
@@ -3324,9 +3352,9 @@ msgctxt "model:ir.ui.view_search,name:"
 msgid "View Search"
 msgstr "Vista de búsqueda"
 
-msgctxt "model:ir.ui.view_tree_expanded_state,name:"
-msgid "View Tree Expanded State"
-msgstr "Estado de Vista de Árbol Expandido"
+msgctxt "model:ir.ui.view_tree_state,name:"
+msgid "View Tree State"
+msgstr "Estado vista árbol"
 
 msgctxt "model:ir.ui.view_tree_width,name:"
 msgid "View Tree Width"
@@ -3446,11 +3474,11 @@ msgstr "Desconocido"
 
 msgctxt "selection:ir.sequence,type:"
 msgid "Decimal Timestamp"
-msgstr "Marca de Tiempo Decimal"
+msgstr "Fecha-hora decimal"
 
 msgctxt "selection:ir.sequence,type:"
 msgid "Hexadecimal Timestamp"
-msgstr "Marca de Tiempo Hexadecimal"
+msgstr "Fecha-hora hexadecimal"
 
 msgctxt "selection:ir.sequence,type:"
 msgid "Incremental"
@@ -3458,11 +3486,11 @@ msgstr "Incremental"
 
 msgctxt "selection:ir.sequence.strict,type:"
 msgid "Decimal Timestamp"
-msgstr "Marca de Tiempo Decimal"
+msgstr "Fecha-hora decimal"
 
 msgctxt "selection:ir.sequence.strict,type:"
 msgid "Hexadecimal Timestamp"
-msgstr "Marca de Tiempo Hexadecimal"
+msgstr "Fecha-hora hexadecimal"
 
 msgctxt "selection:ir.sequence.strict,type:"
 msgid "Incremental"
@@ -3529,6 +3557,10 @@ msgid "Board"
 msgstr "Tablón"
 
 msgctxt "selection:ir.ui.view,type:"
+msgid "Calendar"
+msgstr "Calendarios"
+
+msgctxt "selection:ir.ui.view,type:"
 msgid "Form"
 msgstr "Formulario"
 
@@ -3682,7 +3714,7 @@ msgstr "Descripción del modelo"
 
 msgctxt "view:ir.module.module.config_wizard.first:"
 msgid "Welcome to the module configuration wizard!"
-msgstr "¡Bienvenido al asistente de configuración de módulos!"
+msgstr "¡Bienvenido al asistente de configuración del módulo!"
 
 msgctxt "view:ir.module.module.config_wizard.first:"
 msgid ""
@@ -3697,7 +3729,7 @@ msgstr "Asistente de configuración"
 
 msgctxt "view:ir.module.module.config_wizard.other:"
 msgid "Configuration Wizard Next Step!"
-msgstr "¡Asistente de Configuración de los Pasos siguientes!"
+msgstr "¡Asistente de configuración de los próximos pasos!"
 
 msgctxt "view:ir.module.module.dependency:"
 msgid "Dependencies"
@@ -3721,7 +3753,7 @@ msgstr "Tenga en cuenta que esta operación puede tardar unos minutos."
 
 msgctxt "view:ir.module.module.install_upgrade.start:"
 msgid "System Upgrade"
-msgstr "Mejora del sistema"
+msgstr "Actualización del sistema"
 
 msgctxt "view:ir.module.module.install_upgrade.start:"
 msgid "Your system will be upgraded."
@@ -3856,7 +3888,7 @@ msgstr "Secuencias"
 
 msgctxt "view:ir.sequence:"
 msgid "Timestamp"
-msgstr "Marca de tiempo"
+msgstr "Fecha-hora"
 
 msgctxt "view:ir.sequence:"
 msgid "Year:"
@@ -3954,13 +3986,13 @@ msgctxt "view:ir.ui.view_search:"
 msgid "View Searches"
 msgstr "Vista de búsquedas"
 
-msgctxt "view:ir.ui.view_tree_expanded_state:"
-msgid "View Tree Expanded State"
-msgstr "Estado de Vista de Árbol Expandido"
+msgctxt "view:ir.ui.view_tree_state:"
+msgid "View Tree State"
+msgstr "Estado vista árbol"
 
-msgctxt "view:ir.ui.view_tree_expanded_state:"
-msgid "Views Tree Expanded State"
-msgstr "Estado de Vistas de Árbol Expandidas"
+msgctxt "view:ir.ui.view_tree_state:"
+msgid "Views Tree State"
+msgstr "Estado vistas árbol"
 
 msgctxt "view:ir.ui.view_tree_width:"
 msgid "View Tree Width"
@@ -4004,7 +4036,7 @@ msgstr "Cancelar"
 
 msgctxt "wizard_button:ir.module.module.install_upgrade,start,upgrade:"
 msgid "Start Upgrade"
-msgstr "Iniciar mejora"
+msgstr "Iniciar actualización"
 
 msgctxt "wizard_button:ir.translation.clean,start,clean:"
 msgid "Clean"
diff --git a/trytond/ir/locale/es_CO.po b/trytond/ir/locale/es_CO.po
index 039628a..299c7d8 100644
--- a/trytond/ir/locale/es_CO.po
+++ b/trytond/ir/locale/es_CO.po
@@ -75,14 +75,16 @@ msgstr "La acción programada ha fallado"
 msgctxt "error:ir.cron:"
 msgid ""
 "The following action failed to execute properly: \"%s\"\n"
+"%s\n"
 " Traceback: \n"
 "\n"
 "%s\n"
 msgstr ""
-"La siguiente acción no se ejecutó correctamente: «%s»\n"
-" Traza:\n"
-"\n"
+"La siguiente acción falló al ejecutar apropiadamente: \"%s\"\n"
 "%s\n"
+" Traceback:\n"
+"\n"
+"%s"
 
 msgctxt "error:ir.lang:"
 msgid "Default language can not be deleted."
@@ -229,6 +231,14 @@ msgctxt "error:ir.translation:"
 msgid "Translation must be unique"
 msgstr "La traducción debe ser única"
 
+msgctxt "error:ir.translation:"
+msgid ""
+"You can not export translation %(name)s because it is an overridden "
+"translation by module %(overriding_module)s"
+msgstr ""
+"No puede exportar la traduccion %(name)s porque esta es una traducción "
+"sobreescrita por el módulo %(overrinding_module)s"
+
 msgctxt "error:ir.trigger:"
 msgid "\"On Time\" and others are mutually exclusive!"
 msgstr "¡\"Al Tiempo\" y otros son mutuamente excluyentes!"
@@ -457,6 +467,10 @@ msgctxt "field:ir.action.act_window,name:"
 msgid "Name"
 msgstr "Nombre de Campo"
 
+msgctxt "field:ir.action.act_window,order:"
+msgid "Order Value"
+msgstr "Valor Ordenado"
+
 msgctxt "field:ir.action.act_window,pyson_context:"
 msgid "PySON Context"
 msgstr "Contexto PySON"
@@ -465,6 +479,10 @@ msgctxt "field:ir.action.act_window,pyson_domain:"
 msgid "PySON Domain"
 msgstr "Dominio de PySON"
 
+msgctxt "field:ir.action.act_window,pyson_order:"
+msgid "PySON Order"
+msgstr "Orden PySON"
+
 msgctxt "field:ir.action.act_window,pyson_search_value:"
 msgid "PySON Search Criteria"
 msgstr "Criterio de Búsqueda de PySON"
@@ -1947,7 +1965,7 @@ msgstr "Modificado por Usuario"
 
 msgctxt "field:ir.sequence.type,code:"
 msgid "Sequence Code"
-msgstr "Código de la secuencia"
+msgstr "Código de la Secuencia"
 
 msgctxt "field:ir.sequence.type,create_date:"
 msgid "Create Date"
@@ -2065,6 +2083,10 @@ msgctxt "field:ir.translation,name:"
 msgid "Field Name"
 msgstr "Nombre de Campo"
 
+msgctxt "field:ir.translation,overriding_module:"
+msgid "Overriding Module"
+msgstr "Sobreescritura del Módulo"
+
 msgctxt "field:ir.translation,rec_name:"
 msgid "Name"
 msgstr "Nombre"
@@ -2087,7 +2109,7 @@ msgstr "Tipo"
 
 msgctxt "field:ir.translation,value:"
 msgid "Translation Value"
-msgstr "Valor de la traducción"
+msgstr "Valor de la Traducción"
 
 msgctxt "field:ir.translation,write_date:"
 msgid "Write Date"
@@ -2371,7 +2393,7 @@ msgstr "Menú"
 
 msgctxt "field:ir.ui.menu.favorite,rec_name:"
 msgid "Name"
-msgstr "Nombre de Campo"
+msgstr "Nombre"
 
 msgctxt "field:ir.ui.menu.favorite,sequence:"
 msgid "Sequence"
@@ -2497,47 +2519,51 @@ msgctxt "field:ir.ui.view_search,write_uid:"
 msgid "Write User"
 msgstr "Modificado por Usuario"
 
-msgctxt "field:ir.ui.view_tree_expanded_state,child_name:"
+msgctxt "field:ir.ui.view_tree_state,child_name:"
 msgid "Child Name"
 msgstr "Nombre del Hijo"
 
-msgctxt "field:ir.ui.view_tree_expanded_state,create_date:"
+msgctxt "field:ir.ui.view_tree_state,create_date:"
 msgid "Create Date"
 msgstr "Fecha de Creación"
 
-msgctxt "field:ir.ui.view_tree_expanded_state,create_uid:"
+msgctxt "field:ir.ui.view_tree_state,create_uid:"
 msgid "Create User"
 msgstr "Creado por Usuario"
 
-msgctxt "field:ir.ui.view_tree_expanded_state,domain:"
+msgctxt "field:ir.ui.view_tree_state,domain:"
 msgid "Domain"
 msgstr "Dominio"
 
-msgctxt "field:ir.ui.view_tree_expanded_state,id:"
+msgctxt "field:ir.ui.view_tree_state,id:"
 msgid "ID"
 msgstr "ID"
 
-msgctxt "field:ir.ui.view_tree_expanded_state,model:"
+msgctxt "field:ir.ui.view_tree_state,model:"
 msgid "Model"
 msgstr "Modelo"
 
-msgctxt "field:ir.ui.view_tree_expanded_state,nodes:"
+msgctxt "field:ir.ui.view_tree_state,nodes:"
 msgid "Expanded Nodes"
 msgstr "Nodos Expandidos"
 
-msgctxt "field:ir.ui.view_tree_expanded_state,rec_name:"
+msgctxt "field:ir.ui.view_tree_state,rec_name:"
 msgid "Name"
-msgstr "Nombre de Campo"
+msgstr "Nombre"
 
-msgctxt "field:ir.ui.view_tree_expanded_state,user:"
+msgctxt "field:ir.ui.view_tree_state,selected_nodes:"
+msgid "Selected Nodes"
+msgstr "Nodos Seleccionados"
+
+msgctxt "field:ir.ui.view_tree_state,user:"
 msgid "User"
 msgstr "Usuario"
 
-msgctxt "field:ir.ui.view_tree_expanded_state,write_date:"
+msgctxt "field:ir.ui.view_tree_state,write_date:"
 msgid "Write Date"
 msgstr "Fecha de Modificación"
 
-msgctxt "field:ir.ui.view_tree_expanded_state,write_uid:"
+msgctxt "field:ir.ui.view_tree_state,write_uid:"
 msgid "Write User"
 msgstr "Modificado por Usuario"
 
@@ -2811,7 +2837,7 @@ msgstr "Propiedades"
 
 msgctxt "model:ir.action,name:act_property_form_default"
 msgid "Default Properties"
-msgstr "Propiedades predeterminadas"
+msgstr "Propiedades Predeterminadas"
 
 msgctxt "model:ir.action,name:act_rule_group_form"
 msgid "Record Rules"
@@ -2865,9 +2891,9 @@ msgctxt "model:ir.action,name:act_view_show"
 msgid "Show View"
 msgstr "Mostar Vista"
 
-msgctxt "model:ir.action,name:act_view_tree_expanded_state"
-msgid "Tree Expanded State"
-msgstr "Estado del Árbol Expandido"
+msgctxt "model:ir.action,name:act_view_tree_state"
+msgid "Tree State"
+msgstr "Estado de Arbol"
 
 msgctxt "model:ir.action,name:act_view_tree_width_form"
 msgid "View Tree Width"
@@ -2979,7 +3005,7 @@ msgstr "Francés"
 
 msgctxt "model:ir.lang,name:lang_lt"
 msgid "Lithuanian"
-msgstr ""
+msgstr "Lituano"
 
 msgctxt "model:ir.lang,name:lang_nl"
 msgid "Dutch"
@@ -2989,6 +3015,10 @@ msgctxt "model:ir.lang,name:lang_ru"
 msgid "Russian"
 msgstr "Ruso"
 
+msgctxt "model:ir.lang,name:lang_sl"
+msgid "Slovenian"
+msgstr "Eslovaco"
+
 msgctxt "model:ir.model,name:"
 msgid "Model"
 msgstr "Modelo"
@@ -3286,9 +3316,9 @@ msgctxt "model:ir.ui.menu,name:menu_view_search"
 msgid "View Search"
 msgstr "Buscar Vista"
 
-msgctxt "model:ir.ui.menu,name:menu_view_tree_expanded_state"
-msgid "Tree Expanded State"
-msgstr "Estado del Árbol Expandido"
+msgctxt "model:ir.ui.menu,name:menu_view_tree_state"
+msgid "Tree State"
+msgstr "Estado de Arbol"
 
 msgctxt "model:ir.ui.menu,name:menu_view_tree_width"
 msgid "View Tree Width"
@@ -3314,9 +3344,9 @@ msgctxt "model:ir.ui.view_search,name:"
 msgid "View Search"
 msgstr "Buscar Vista"
 
-msgctxt "model:ir.ui.view_tree_expanded_state,name:"
-msgid "View Tree Expanded State"
-msgstr "ir.ui.view_tree_expanded_state"
+msgctxt "model:ir.ui.view_tree_state,name:"
+msgid "View Tree State"
+msgstr "Estado de Vista de Arbol"
 
 msgctxt "model:ir.ui.view_tree_width,name:"
 msgid "View Tree Width"
@@ -3490,10 +3520,9 @@ msgctxt "selection:ir.translation,type:"
 msgid "Wizard Button"
 msgstr "Botón de Asistente"
 
-#, fuzzy
 msgctxt "selection:ir.ui.menu,action:"
 msgid ""
-msgstr "Punto de Orden"
+msgstr ""
 
 msgctxt "selection:ir.ui.menu,action:"
 msgid "ir.action.act_window"
@@ -3511,16 +3540,19 @@ msgctxt "selection:ir.ui.menu,action:"
 msgid "ir.action.wizard"
 msgstr "ir.action.wizard"
 
-#, fuzzy
 msgctxt "selection:ir.ui.view,type:"
 msgid ""
-msgstr "Punto de Orden"
+msgstr ""
 
 msgctxt "selection:ir.ui.view,type:"
 msgid "Board"
 msgstr "Tablero"
 
 msgctxt "selection:ir.ui.view,type:"
+msgid "Calendar"
+msgstr "Calendario"
+
+msgctxt "selection:ir.ui.view,type:"
 msgid "Form"
 msgstr "Formulario"
 
@@ -3532,12 +3564,10 @@ msgctxt "selection:ir.ui.view,type:"
 msgid "Tree"
 msgstr "Árbol"
 
-#, fuzzy
 msgctxt "view:ir.action.act_window.domain:"
 msgid "Domain"
 msgstr "Dominio"
 
-#, fuzzy
 msgctxt "view:ir.action.act_window.domain:"
 msgid "Domains"
 msgstr "Dominios"
@@ -3712,7 +3742,7 @@ msgstr "Los módulos se han actualizado / instalado"
 
 msgctxt "view:ir.module.module.install_upgrade.start:"
 msgid "Note that this operation may take a few minutes."
-msgstr ""
+msgstr "Esta operación puede demorar varios minutos."
 
 msgctxt "view:ir.module.module.install_upgrade.start:"
 msgid "System Upgrade"
@@ -3881,20 +3911,18 @@ msgctxt "view:ir.translation.export.start:"
 msgid "Export Translation"
 msgstr "Exportar Traducción"
 
-#, fuzzy
 msgctxt "view:ir.translation.set.start:"
 msgid "Set Translations"
 msgstr "Establecer Traducción"
 
 msgctxt "view:ir.translation.set.start:"
 msgid "Synchronize Translations?"
-msgstr ""
+msgstr "Sincronizar Traducciones?"
 
 msgctxt "view:ir.translation.set.succeed:"
 msgid "Set Succeed!"
-msgstr ""
+msgstr "Realizado Exitosamente!"
 
-#, fuzzy
 msgctxt "view:ir.translation.set.succeed:"
 msgid "Set Translations"
 msgstr "Establecer Traducción"
@@ -3923,14 +3951,13 @@ msgctxt "view:ir.ui.icon:"
 msgid "Icons"
 msgstr "Iconos"
 
-#, fuzzy
 msgctxt "view:ir.ui.menu.favorite:"
 msgid "Menu Favorite"
 msgstr "Menú Favorito"
 
 msgctxt "view:ir.ui.menu.favorite:"
 msgid "Menu Favorites"
-msgstr ""
+msgstr "Menu Favoritos"
 
 msgctxt "view:ir.ui.menu:"
 msgid "Menu"
@@ -3944,22 +3971,22 @@ msgctxt "view:ir.ui.view:"
 msgid "_Show"
 msgstr "_Mostrar"
 
-#, fuzzy
 msgctxt "view:ir.ui.view_search:"
 msgid "View Search"
 msgstr "Buscar Vista"
 
 msgctxt "view:ir.ui.view_search:"
 msgid "View Searches"
-msgstr ""
+msgstr "Vista Busquedas"
 
-msgctxt "view:ir.ui.view_tree_expanded_state:"
-msgid "View Tree Expanded State"
-msgstr "Estado de Vista de Árbol Expandido"
+#, fuzzy
+msgctxt "view:ir.ui.view_tree_state:"
+msgid "View Tree State"
+msgstr "Estado de Vista de Arbol"
 
-msgctxt "view:ir.ui.view_tree_expanded_state:"
-msgid "Views Tree Expanded State"
-msgstr "Estado de Vista de Árbol Expandido"
+msgctxt "view:ir.ui.view_tree_state:"
+msgid "Views Tree State"
+msgstr ""
 
 msgctxt "view:ir.ui.view_tree_width:"
 msgid "View Tree Width"
diff --git a/trytond/ir/locale/es_ES.po b/trytond/ir/locale/es_ES.po
index 21919df..3592f99 100644
--- a/trytond/ir/locale/es_ES.po
+++ b/trytond/ir/locale/es_ES.po
@@ -32,7 +32,7 @@ msgstr "El valor del campo \"%s\" de \"%s\" no es correcto según su dominio."
 
 msgctxt "error:foreign_model_exist:"
 msgid "Could not delete \"%s\" records because they are used on field \"%s\" of \"%s\"."
-msgstr "No puede eliminar \"%s\" registros porqué se usan en el campo \"%s\" de \"%s\"."
+msgstr "No puede eliminar \"%s\" registros porque se usan en el campo \"%s\" de \"%s\"."
 
 msgctxt "error:foreign_model_missing:"
 msgid "The value of field \"%s\" on \"%s\" doesn't exist."
@@ -56,11 +56,10 @@ msgctxt "error:ir.action.keyword:"
 msgid "Wrong wizard model in keyword action \"%s\"."
 msgstr "Asistente incorrecto en la acción de teclado \"%s\"."
 
-#, fuzzy
 msgctxt "error:ir.action.report:"
 msgid "Invalid email definition on report \"%s\"."
 msgstr ""
-"La definición de correo electrónico sobre el informe \"%s\", no es correcta."
+"La definición de correo electrónico sobre el informe \"%s\" no es correcta."
 
 msgctxt "error:ir.action.report:"
 msgid "The internal name must be unique by module!"
@@ -77,12 +76,14 @@ msgstr "La acción planificada ha fallado."
 msgctxt "error:ir.cron:"
 msgid ""
 "The following action failed to execute properly: \"%s\"\n"
+"%s\n"
 " Traceback: \n"
 "\n"
 "%s\n"
 msgstr ""
-"La siguiente acción no se ha ejecutado correctamente: \"%s\"\n"
-" Traza: \n"
+"Ha fallado la acción cuando se ejecutaba: \"%s\"\n"
+"%s\n"
+" Traza del programa: \n"
 "\n"
 "%s\n"
 
@@ -184,22 +185,18 @@ msgctxt "error:ir.rule:"
 msgid "Invalid domain in rule \"%s\"."
 msgstr "El dominio de la regla \"%s\" no es correcto."
 
-#, fuzzy
 msgctxt "error:ir.sequence.strict:"
 msgid "Invalid prefix \"%(prefix)s\" on sequence \"%(sequence)s\"."
-msgstr "Prefijo \"%(prefix)s\" de la secuencia \"%(sequence)s\" no es correcto."
+msgstr "El prefijo \"%(prefix)s\" de la secuencia \"%(sequence)s\" no es correcto."
 
-#, fuzzy
 msgctxt "error:ir.sequence.strict:"
 msgid "Invalid suffix \"%(suffix)s\" on sequence \"%(sequence)s\"."
-msgstr "Sufijo \"%(sufix)s\" de la secuencia \"%(sequence)s\" no es correcto."
+msgstr "El sufijo \"%(sufix)s\" de la secuencia \"%(sequence)s\" no es correcto."
 
-#, fuzzy
 msgctxt "error:ir.sequence.strict:"
 msgid "Last Timestamp cannot be in the future on sequence \"%s\"."
 msgstr "La última fecha-hora no puede ser del futuro en la secuencia \"%s\"."
 
-#, fuzzy
 msgctxt "error:ir.sequence.strict:"
 msgid "Missing sequence."
 msgstr "Falta la secuencia."
@@ -208,22 +205,18 @@ msgctxt "error:ir.sequence.strict:"
 msgid "Timestamp rounding should be greater than 0"
 msgstr "El redondeo de la fecha-hora debe ser más grande que 0."
 
-#, fuzzy
 msgctxt "error:ir.sequence:"
 msgid "Invalid prefix \"%(prefix)s\" on sequence \"%(sequence)s\"."
-msgstr "Prefijo \"%(prefix)s\" de la secuencia \"%(sequence)s\" no es correcto."
+msgstr "El prefijo \"%(prefix)s\" de la secuencia \"%(sequence)s\" no es correcto."
 
-#, fuzzy
 msgctxt "error:ir.sequence:"
 msgid "Invalid suffix \"%(suffix)s\" on sequence \"%(sequence)s\"."
-msgstr "Sufijo \"%(sufix)s\" de la secuencia \"%(sequence)s\" no es correcto."
+msgstr "El sufijo \"%(sufix)s\" de la secuencia \"%(sequence)s\" no es correcto."
 
-#, fuzzy
 msgctxt "error:ir.sequence:"
 msgid "Last Timestamp cannot be in the future on sequence \"%s\"."
 msgstr "La última fecha-hora no puede ser del futuro en la secuencia \"%s\"."
 
-#, fuzzy
 msgctxt "error:ir.sequence:"
 msgid "Missing sequence."
 msgstr "Falta la secuencia."
@@ -236,6 +229,14 @@ msgctxt "error:ir.translation:"
 msgid "Translation must be unique"
 msgstr "La traducción debe ser única."
 
+msgctxt "error:ir.translation:"
+msgid ""
+"You can not export translation %(name)s because it is an overridden "
+"translation by module %(overriding_module)s"
+msgstr ""
+"No puede exportar la traducción %(name)s porque es una traducción anulada "
+"por el módulo %(overriding_module)s."
+
 msgctxt "error:ir.trigger:"
 msgid "\"On Time\" and others are mutually exclusive!"
 msgstr "\"Por tiempo\" y otros son mutuamente excluyentes."
@@ -250,7 +251,7 @@ msgstr ""
 
 msgctxt "error:ir.ui.menu:"
 msgid "\"%s\" is not a valid menu name because it is not allowed to contain \" / \"."
-msgstr "\"%s\" no es un menú correcto porqué no puede contener \" /\"."
+msgstr "\"%s\" no es un menú correcto porque no puede contener \" /\"."
 
 msgctxt "error:ir.ui.view:"
 msgid "Invalid XML for view \"%s\"."
@@ -286,7 +287,7 @@ msgstr ""
 
 msgctxt "error:reference_syntax_error:"
 msgid "Syntax error for reference %r in %s"
-msgstr "Error de sintaxis para la referencia %r en %s"
+msgstr "Error de sintaxis para la referencia %r en %s."
 
 msgctxt "error:relation_not_found:"
 msgid "Relation not found: %r in %s"
@@ -346,7 +347,7 @@ msgstr "No está autorizado para modificar este registro."
 
 msgctxt "error:xml_id_syntax_error:"
 msgid "Syntax error for XML id %r in %s"
-msgstr "Error de sintaxis para el XML id %r en %s"
+msgstr "Error de sintaxis para el XML id %r en %s."
 
 msgctxt "error:xml_record_desc:"
 msgid "This record is part of the base configuration."
@@ -468,6 +469,10 @@ msgctxt "field:ir.action.act_window,name:"
 msgid "Name"
 msgstr "Nombre"
 
+msgctxt "field:ir.action.act_window,order:"
+msgid "Order Value"
+msgstr "Valor ordenación"
+
 msgctxt "field:ir.action.act_window,pyson_context:"
 msgid "PySON Context"
 msgstr "Contexto PySON"
@@ -476,6 +481,10 @@ msgctxt "field:ir.action.act_window,pyson_domain:"
 msgid "PySON Domain"
 msgstr "Dominio PySON"
 
+msgctxt "field:ir.action.act_window,pyson_order:"
+msgid "PySON Order"
+msgstr "Orden PySON"
+
 msgctxt "field:ir.action.act_window,pyson_search_value:"
 msgid "PySON Search Criteria"
 msgstr "Criterio de búsqueda PySON"
@@ -2076,6 +2085,10 @@ msgctxt "field:ir.translation,name:"
 msgid "Field Name"
 msgstr "Nombre campo"
 
+msgctxt "field:ir.translation,overriding_module:"
+msgid "Overriding Module"
+msgstr "Módulo principal"
+
 msgctxt "field:ir.translation,rec_name:"
 msgid "Name"
 msgstr "Nombre"
@@ -2508,47 +2521,51 @@ msgctxt "field:ir.ui.view_search,write_uid:"
 msgid "Write User"
 msgstr "Usuario modificación"
 
-msgctxt "field:ir.ui.view_tree_expanded_state,child_name:"
+msgctxt "field:ir.ui.view_tree_state,child_name:"
 msgid "Child Name"
-msgstr "Nombre del hijo"
+msgstr "Nombre hijo"
 
-msgctxt "field:ir.ui.view_tree_expanded_state,create_date:"
+msgctxt "field:ir.ui.view_tree_state,create_date:"
 msgid "Create Date"
 msgstr "Fecha creación"
 
-msgctxt "field:ir.ui.view_tree_expanded_state,create_uid:"
+msgctxt "field:ir.ui.view_tree_state,create_uid:"
 msgid "Create User"
 msgstr "Usuario creación"
 
-msgctxt "field:ir.ui.view_tree_expanded_state,domain:"
+msgctxt "field:ir.ui.view_tree_state,domain:"
 msgid "Domain"
 msgstr "Dominio"
 
-msgctxt "field:ir.ui.view_tree_expanded_state,id:"
+msgctxt "field:ir.ui.view_tree_state,id:"
 msgid "ID"
 msgstr "ID"
 
-msgctxt "field:ir.ui.view_tree_expanded_state,model:"
+msgctxt "field:ir.ui.view_tree_state,model:"
 msgid "Model"
 msgstr "Modelo"
 
-msgctxt "field:ir.ui.view_tree_expanded_state,nodes:"
+msgctxt "field:ir.ui.view_tree_state,nodes:"
 msgid "Expanded Nodes"
-msgstr "Nodos expandidos"
+msgstr "Expandir nodos"
 
-msgctxt "field:ir.ui.view_tree_expanded_state,rec_name:"
+msgctxt "field:ir.ui.view_tree_state,rec_name:"
 msgid "Name"
 msgstr "Nombre"
 
-msgctxt "field:ir.ui.view_tree_expanded_state,user:"
+msgctxt "field:ir.ui.view_tree_state,selected_nodes:"
+msgid "Selected Nodes"
+msgstr "Seleccionar nodos"
+
+msgctxt "field:ir.ui.view_tree_state,user:"
 msgid "User"
 msgstr "Usuario"
 
-msgctxt "field:ir.ui.view_tree_expanded_state,write_date:"
+msgctxt "field:ir.ui.view_tree_state,write_date:"
 msgid "Write Date"
 msgstr "Fecha modificación"
 
-msgctxt "field:ir.ui.view_tree_expanded_state,write_uid:"
+msgctxt "field:ir.ui.view_tree_state,write_uid:"
 msgid "Write User"
 msgstr "Usuario modificación"
 
@@ -2876,9 +2893,9 @@ msgctxt "model:ir.action,name:act_view_show"
 msgid "Show View"
 msgstr "Mostrar vista"
 
-msgctxt "model:ir.action,name:act_view_tree_expanded_state"
-msgid "Tree Expanded State"
-msgstr "Estado árbol expandido"
+msgctxt "model:ir.action,name:act_view_tree_state"
+msgid "Tree State"
+msgstr "Estado árbol"
 
 msgctxt "model:ir.action,name:act_view_tree_width_form"
 msgid "View Tree Width"
@@ -2962,7 +2979,7 @@ msgstr "Búlgaro"
 
 msgctxt "model:ir.lang,name:lang_ca"
 msgid "Català"
-msgstr "Català"
+msgstr "Catalán"
 
 msgctxt "model:ir.lang,name:lang_cs"
 msgid "Czech"
@@ -2990,7 +3007,7 @@ msgstr "Francés"
 
 msgctxt "model:ir.lang,name:lang_lt"
 msgid "Lithuanian"
-msgstr ""
+msgstr "Lituano"
 
 msgctxt "model:ir.lang,name:lang_nl"
 msgid "Dutch"
@@ -3000,6 +3017,10 @@ msgctxt "model:ir.lang,name:lang_ru"
 msgid "Russian"
 msgstr "Ruso"
 
+msgctxt "model:ir.lang,name:lang_sl"
+msgid "Slovenian"
+msgstr "Esloveno"
+
 msgctxt "model:ir.model,name:"
 msgid "Model"
 msgstr "Modelo"
@@ -3296,9 +3317,9 @@ msgctxt "model:ir.ui.menu,name:menu_view_search"
 msgid "View Search"
 msgstr "Búsquedas favoritas"
 
-msgctxt "model:ir.ui.menu,name:menu_view_tree_expanded_state"
-msgid "Tree Expanded State"
-msgstr "Estado árbol expandido"
+msgctxt "model:ir.ui.menu,name:menu_view_tree_state"
+msgid "Tree State"
+msgstr "Estado árbol"
 
 msgctxt "model:ir.ui.menu,name:menu_view_tree_width"
 msgid "View Tree Width"
@@ -3324,9 +3345,9 @@ msgctxt "model:ir.ui.view_search,name:"
 msgid "View Search"
 msgstr "Búsqueda favorita"
 
-msgctxt "model:ir.ui.view_tree_expanded_state,name:"
-msgid "View Tree Expanded State"
-msgstr "Estado vistas de árbol expandidas"
+msgctxt "model:ir.ui.view_tree_state,name:"
+msgid "View Tree State"
+msgstr "Estado vista árbol"
 
 msgctxt "model:ir.ui.view_tree_width,name:"
 msgid "View Tree Width"
@@ -3529,6 +3550,10 @@ msgid "Board"
 msgstr "Tablero"
 
 msgctxt "selection:ir.ui.view,type:"
+msgid "Calendar"
+msgstr "Calendario"
+
+msgctxt "selection:ir.ui.view,type:"
 msgid "Form"
 msgstr "Formulario"
 
@@ -3860,7 +3885,7 @@ msgstr "Definir traducciones"
 
 msgctxt "view:ir.translation.set.start:"
 msgid "Synchronize Translations?"
-msgstr "Desea sincronizar las traducciones?"
+msgstr "¿Sincronizar las traducciones?"
 
 msgctxt "view:ir.translation.set.succeed:"
 msgid "Set Succeed!"
@@ -3922,13 +3947,13 @@ msgctxt "view:ir.ui.view_search:"
 msgid "View Searches"
 msgstr "Búsquedas favoritas"
 
-msgctxt "view:ir.ui.view_tree_expanded_state:"
-msgid "View Tree Expanded State"
-msgstr "Estado vistas de árbol expandidas"
+msgctxt "view:ir.ui.view_tree_state:"
+msgid "View Tree State"
+msgstr "Estado vista árbol"
 
-msgctxt "view:ir.ui.view_tree_expanded_state:"
-msgid "Views Tree Expanded State"
-msgstr "Estado vistas de árbol expandidas"
+msgctxt "view:ir.ui.view_tree_state:"
+msgid "Views Tree State"
+msgstr "Estado vistas árbol"
 
 msgctxt "view:ir.ui.view_tree_width:"
 msgid "View Tree Width"
diff --git a/trytond/ir/locale/fr_FR.po b/trytond/ir/locale/fr_FR.po
index 23c0345..989c2ba 100644
--- a/trytond/ir/locale/fr_FR.po
+++ b/trytond/ir/locale/fr_FR.po
@@ -12,14 +12,6 @@ msgstr ""
 
 msgctxt "error:access_error:"
 msgid ""
-"You try to bypass an access rule!\n"
-"(Document type: %s)"
-msgstr ""
-"Vous essayez d'enfreindre une règle d'accès\n"
-"(Type du document: %s)"
-
-msgctxt "error:access_error:"
-msgid ""
 "You try to bypass an access rule.\n"
 "(Document type: %s)"
 msgstr ""
@@ -30,14 +22,6 @@ msgctxt "error:delete_xml_record:"
 msgid "You are not allowed to delete this record."
 msgstr "Vous n'êtes pas authorisé à supprimer cet enregistrement"
 
-msgctxt "error:delete_xml_record:"
-msgid "You are not allowed to delete this record."
-msgstr "Vous n'êtes pas authorisé à supprimer cet enregistrement"
-
-msgctxt "error:digits_validation_record:"
-msgid "The field \"%s\" on \"%s\" has too many decimal digits."
-msgstr "Le champ \"%s\" de \"%s\" à trop de décimales."
-
 msgctxt "error:digits_validation_record:"
 msgid "The field \"%s\" on \"%s\" has too many decimal digits."
 msgstr "Le champ \"%s\" de \"%s\" à trop de décimales."
@@ -46,16 +30,6 @@ msgctxt "error:domain_validation_record:"
 msgid "The value of the field \"%s\" on \"%s\" is not valid according to its domain."
 msgstr "La valeur du champ \"%s\" de \"%s\" n'est pas valide suivant son domaine."
 
-msgctxt "error:domain_validation_record:"
-msgid "The value of the field \"%s\" on \"%s\" is not valid according to its domain."
-msgstr "La valeur du champ \"%s\" de \"%s\" n'est pas valide suivant son domaine."
-
-msgctxt "error:foreign_model_exist:"
-msgid "Could not delete \"%s\" records because they are used on field \"%s\" of \"%s\"."
-msgstr ""
-"Impossible de supprimer les enregistrements \"%s\" car ils sont utilisé dans"
-" le champ \"%s\" de \"%s\"."
-
 msgctxt "error:foreign_model_exist:"
 msgid "Could not delete \"%s\" records because they are used on field \"%s\" of \"%s\"."
 msgstr ""
@@ -66,10 +40,6 @@ msgctxt "error:foreign_model_missing:"
 msgid "The value of field \"%s\" on \"%s\" doesn't exist."
 msgstr "La valeur du champ \"%s\" de \"%s\" est absente."
 
-msgctxt "error:foreign_model_missing:"
-msgid "The value of field \"%s\" on \"%s\" doesn't exist."
-msgstr "La valeur du champ \"%s\" de \"%s\" est absente."
-
 msgctxt "error:ir.action.act_window:"
 msgid "Invalid context \"%(context)s\" on action \"%(action)s\"."
 msgstr "Le contexte \"%(context)s\" de l'action \"%(action)s\" est invalide."
@@ -96,15 +66,6 @@ msgctxt "error:ir.action.report:"
 msgid "The internal name must be unique by module!"
 msgstr "Le nom interne doit être unique par module !"
 
-msgctxt "error:ir.action.report:"
-msgid "The internal name must be unique by module!"
-msgstr "Le nom interne doit être unique par module !"
-
-msgctxt "error:ir.attachment:"
-msgid "The  names of attachments must be unique by resource!"
-msgstr ""
-"Le nom des pièces jointes doivent être unique pour une même ressource !"
-
 msgctxt "error:ir.attachment:"
 msgid "The  names of attachments must be unique by resource!"
 msgstr ""
@@ -115,30 +76,16 @@ msgid "Scheduled action failed"
 msgstr "L'action planifiée a échoué"
 
 msgctxt "error:ir.cron:"
-msgid "Scheduled action failed"
-msgstr "L'action planifiée a échoué"
-
-msgctxt "error:ir.cron:"
 msgid ""
 "The following action failed to execute properly: \"%s\"\n"
-" Traceback: \n"
-"\n"
-"%s\n"
-msgstr ""
-"L'action suivante ne c'est pas exécutée correctement: \"%s\"\n"
-" Traceback: \n"
-"\n"
 "%s\n"
-
-msgctxt "error:ir.cron:"
-msgid ""
-"The following action failed to execute properly: \"%s\"\n"
 " Traceback: \n"
 "\n"
 "%s\n"
 msgstr ""
-"L'action suivante ne c'est pas exécutée correctement: \"%s\"\n"
-" Traceback: \n"
+"L'action suivante n'a pas pu s'exécuter correctement: \"%s\"\n"
+"%s\n"
+" Retraçage:\n"
 "\n"
 "%s\n"
 
@@ -164,16 +111,6 @@ msgstr ""
 "Le séparateur de décimale et le séparateur des centaines doivent être "
 "différents !"
 
-msgctxt "error:ir.lang:"
-msgid "decimal_point and thousands_sep must be different!"
-msgstr ""
-"Le séparateur de décimale et le séparateur des centaines doivent être "
-"différents !"
-
-msgctxt "error:ir.model.access:"
-msgid "You can not create this kind of document! (%s)"
-msgstr "Vous ne pouvez pas créer ce type de document ! (%s)"
-
 msgctxt "error:ir.model.access:"
 msgid "You can not create this kind of document! (%s)"
 msgstr "Vous ne pouvez pas créer ce type de document ! (%s)"
@@ -183,14 +120,6 @@ msgid "You can not delete this document! (%s)"
 msgstr "Vous ne pouvez pas supprimer ce document ! (%s)"
 
 msgctxt "error:ir.model.access:"
-msgid "You can not delete this document! (%s)"
-msgstr "Vous ne pouvez pas supprimer ce document ! (%s)"
-
-msgctxt "error:ir.model.access:"
-msgid "You can not read this document! (%s)"
-msgstr "Vous ne pouvez pas lire ce document ! (%s)"
-
-msgctxt "error:ir.model.access:"
 msgid "You can not read this document! (%s)"
 msgstr "Vous ne pouvez pas lire ce document ! (%s)"
 
@@ -198,10 +127,6 @@ msgctxt "error:ir.model.access:"
 msgid "You can not write in this document! (%s)"
 msgstr "Vous ne pouvez pas écrire dans ce document ! (%s)"
 
-msgctxt "error:ir.model.access:"
-msgid "You can not write in this document! (%s)"
-msgstr "Vous ne pouvez pas écrire dans ce document ! (%s)"
-
 msgctxt "error:ir.model.button:"
 msgid "The button name in model must be unique!"
 msgstr "Le nom du bouton dans le modèle doit être unique"
@@ -210,14 +135,6 @@ msgctxt "error:ir.model.data:"
 msgid "The triple (fs_id, module, model) must be unique!"
 msgstr "Le triplet (fs_id, module, model) doit être unique !"
 
-msgctxt "error:ir.model.data:"
-msgid "The triple (fs_id, module, model) must be unique!"
-msgstr "Le triplet (fs_id, module, model) doit être unique !"
-
-msgctxt "error:ir.model.field.access:"
-msgid "You can not read the field! (%s.%s)"
-msgstr "Vous ne pouvez lire le champs (%s.%s) !"
-
 msgctxt "error:ir.model.field.access:"
 msgid "You can not read the field! (%s.%s)"
 msgstr "Vous ne pouvez lire le champs (%s.%s) !"
@@ -226,17 +143,9 @@ msgctxt "error:ir.model.field.access:"
 msgid "You can not write on the field! (%s.%s)"
 msgstr "Vous ne pouvez écrire sur le champs (%s.%s) !"
 
-msgctxt "error:ir.model.field.access:"
-msgid "You can not write on the field! (%s.%s)"
-msgstr "Vous ne pouvez écrire sur le champs (%s.%s) !"
-
 msgctxt "error:ir.model.field:"
 msgid "Model Field name \"%s\" is not a valid python identifier."
-msgstr "Le nom de champ \"%s\" n'est pas un identifiant Python valide."
-
-msgctxt "error:ir.model.field:"
-msgid "The field name in model must be unique!"
-msgstr "Le nom du champ doit être unique sur le modèle !"
+msgstr "Le nom de champ modèle \"%s\" n'est pas un identifiant Python valide."
 
 msgctxt "error:ir.model.field:"
 msgid "The field name in model must be unique!"
@@ -250,14 +159,6 @@ msgctxt "error:ir.model:"
 msgid "The model must be unique!"
 msgstr "Le modèle doit être unique !"
 
-msgctxt "error:ir.model:"
-msgid "The model must be unique!"
-msgstr "Le modèle doit être unique !"
-
-msgctxt "error:ir.module.module.dependency:"
-msgid "Dependency must be unique by module!"
-msgstr "Une dépendance doit être unique par module !"
-
 msgctxt "error:ir.module.module.dependency:"
 msgid "Dependency must be unique by module!"
 msgstr "Une dépendance doit être unique par module !"
@@ -267,16 +168,6 @@ msgid "Missing dependencies %s for module \"%s\""
 msgstr "Dépendences %s manquante pour le module \"%s\""
 
 msgctxt "error:ir.module.module:"
-msgid "Missing dependencies %s for module \"%s\""
-msgstr "Dépendences %s manquante pour le module \"%s\""
-
-msgctxt "error:ir.module.module:"
-msgid "The modules you are trying to uninstall depends on installed modules:"
-msgstr ""
-"Les modules que vous essayez de dés-installer dépendent de modules installés"
-" :"
-
-msgctxt "error:ir.module.module:"
 msgid "The modules you are trying to uninstall depends on installed modules:"
 msgstr ""
 "Les modules que vous essayez de dés-installer dépendent de modules installés"
@@ -287,15 +178,6 @@ msgid "The name of the module must be unique!"
 msgstr "Le nom du module doit être unique"
 
 msgctxt "error:ir.module.module:"
-msgid "The name of the module must be unique!"
-msgstr "Le nom du module doit être unique"
-
-msgctxt "error:ir.module.module:"
-msgid "You can not remove a module that is installed or will be installed"
-msgstr ""
-"Vous ne pouvez pas supprimer un module qui est installé ou qui le sera"
-
-msgctxt "error:ir.module.module:"
 msgid "You can not remove a module that is installed or will be installed"
 msgstr ""
 "Vous ne pouvez pas supprimer un module qui est installé ou qui le sera"
@@ -304,10 +186,6 @@ msgctxt "error:ir.rule.group:"
 msgid "Global and Default are mutually exclusive!"
 msgstr "Global et Défaut sont exclusifs !"
 
-msgctxt "error:ir.rule.group:"
-msgid "Global and Default are mutually exclusive!"
-msgstr "Global et Défaut sont exclusifs !"
-
 msgctxt "error:ir.rule:"
 msgid "Invalid domain in rule \"%s\"."
 msgstr "Domaine invalide sur la règle \"%s\"."
@@ -361,12 +239,12 @@ msgid "Translation must be unique"
 msgstr "La traduction doit être unique"
 
 msgctxt "error:ir.translation:"
-msgid "Translation must be unique"
-msgstr "La traduction doit être unique"
-
-msgctxt "error:ir.trigger:"
-msgid "\"On Time\" and others are mutually exclusive!"
-msgstr "\"À temps\" exclus les autres type de déclencheurs !"
+msgid ""
+"You can not export translation %(name)s because it is an overridden "
+"translation by module %(overriding_module)s"
+msgstr ""
+"Vous ne pouvez pas exporter la traduction %(name)s car c'est une traduction "
+"surchargée par le module %(overriding_module)s"
 
 msgctxt "error:ir.trigger:"
 msgid "\"On Time\" and others are mutually exclusive!"
@@ -392,18 +270,6 @@ msgctxt "error:not_found_in_selection:"
 msgid "Key %r not found in selection field %r"
 msgstr "Clé %r non trouvée dans la sélection %r"
 
-msgctxt "error:not_found_in_selection:"
-msgid "Key %r not found in selection field %r"
-msgstr "Clé %r non trouvée dans la sélection %r"
-
-msgctxt "error:read_error:"
-msgid ""
-"You try to read records that don't exist anymore!\n"
-"(Document type: %s)"
-msgstr ""
-"Vous essayez de lire un enregistrement qui n'existe plus !\n"
-"(Type du document: %s)"
-
 msgctxt "error:read_error:"
 msgid ""
 "You try to read records that don't exist anymore!\n"
@@ -425,21 +291,13 @@ msgid ""
 "Recursion error: Record \"%(rec_name)s\" with parent \"%(parent_rec_name)s\""
 " was configured as ancestor of itself."
 msgstr ""
-"Erreur récursion : L'enregistrement \"%(rec_name)s\" dont le parent est "
-"\"%(parent_rec_name)s\" est configuré comme son propre ancêtre."
+"Erreur de récursion: L'enregistrement \"%(rec_name)s\" avec le parent "
+"\"%(parent_rec_name)s\" a été configuré comme ancêtre de lui même."
 
 msgctxt "error:reference_syntax_error:"
 msgid "Syntax error for reference %r in %s"
 msgstr "Erreur de syntaxe pour la référence %r de %r"
 
-msgctxt "error:reference_syntax_error:"
-msgid "Syntax error for reference %r in %s"
-msgstr "Erreur de syntaxe pour la référence %r de %r"
-
-msgctxt "error:relation_not_found:"
-msgid "Relation not found: %r in %s"
-msgstr "Relation non trouvée : %r dans %r"
-
 msgctxt "error:relation_not_found:"
 msgid "Relation not found: %r in %s"
 msgstr "Relation non trouvée : %r dans %r"
@@ -448,14 +306,6 @@ msgctxt "error:required_field:"
 msgid "The field \"%s\" on \"%s\" is required."
 msgstr "Le champ \"%s\" de \"%s\" est requis."
 
-msgctxt "error:required_field:"
-msgid "The field \"%s\" on \"%s\" is required."
-msgstr "Le champ \"%s\" de \"%s\" est requis."
-
-msgctxt "error:required_validation_record:"
-msgid "The field \"%s\" on \"%s\" is required."
-msgstr "Le champ \"%s\" de \"%s\" est requis."
-
 msgctxt "error:required_validation_record:"
 msgid "The field \"%s\" on \"%s\" is required."
 msgstr "Le champ \"%s\" de \"%s\" est requis."
@@ -464,13 +314,9 @@ msgctxt "error:search_function_missing:"
 msgid "Missing search function on field \"%s\"."
 msgstr "Fonction de recherche absente pour le champ \"%s\"."
 
-msgctxt "error:search_function_missing:"
-msgid "Missing search function on field \"%s\"."
-msgstr "Fonction de recherche absente pour le champ \"%s\"."
-
 msgctxt "error:selection_validation_record:"
 msgid "The field \"%s\" on \"%s\" is not in the selection."
-msgstr "Le champ \"%s\" de \"%s\" n'est pas dans la sélection."
+msgstr "Le champ \"%s\" sur \"%s\" n'est pas dans la sélection."
 
 msgctxt "error:selection_value_notfound:"
 msgid "Value not in the selection for field \"%s\"."
@@ -480,10 +326,6 @@ msgctxt "error:size_validation_record:"
 msgid "The field \"%s\" on \"%s\" is too long."
 msgstr "Le champ \"%s\" de \"%s\" est trop long"
 
-msgctxt "error:size_validation_record:"
-msgid "The field \"%s\" on \"%s\" is too long."
-msgstr "Le champ \"%s\" de \"%s\" est trop long"
-
 msgctxt "error:time_format_validation_record:"
 msgid "The time value of field \"%s\" on \"%s\" is not valid."
 msgstr "La valeur de type temps du champ \"%s\" de \"%s\" n'est pas valide"
@@ -492,18 +334,6 @@ msgctxt "error:too_many_relations_found:"
 msgid "Too many relations found: %r in %s"
 msgstr "Trop de relations pour : %r dans %s"
 
-msgctxt "error:too_many_relations_found:"
-msgid "Too many relations found: %r in %s"
-msgstr "Trop de relations pour : %r dans %s"
-
-msgctxt "error:write_error:"
-msgid ""
-"You try to write on records that don't exist anymore!\n"
-"(Document type: %s)"
-msgstr ""
-"Vous essayez d'écrire sur un enregistrement qui n'existe plus !\n"
-"(Type du document: %s)"
-
 msgctxt "error:write_error:"
 msgid ""
 "You try to write on records that don't exist anymore!\n"
@@ -524,22 +354,10 @@ msgctxt "error:write_xml_record:"
 msgid "You are not allowed to modify this record."
 msgstr "Vous n'êtes pas autorisé à modifier cet enregistrement."
 
-msgctxt "error:write_xml_record:"
-msgid "You are not allowed to modify this record."
-msgstr "Vous n'êtes pas autorisé à modifier cet enregistrement."
-
 msgctxt "error:xml_id_syntax_error:"
 msgid "Syntax error for XML id %r in %s"
 msgstr "Erreur de syntaxe XML pour l'ID %r de %s"
 
-msgctxt "error:xml_id_syntax_error:"
-msgid "Syntax error for XML id %r in %s"
-msgstr "Erreur de syntaxe XML pour l'ID %r de %s"
-
-msgctxt "error:xml_record_desc:"
-msgid "This record is part of the base configuration."
-msgstr "Cet enregistrement fait partie de la configuration de base."
-
 msgctxt "error:xml_record_desc:"
 msgid "This record is part of the base configuration."
 msgstr "Cet enregistrement fait partie de la configuration de base."
@@ -610,7 +428,7 @@ msgstr "Action"
 
 msgctxt "field:ir.action.act_window,active:"
 msgid "Active"
-msgstr "Active"
+msgstr "Actif"
 
 msgctxt "field:ir.action.act_window,auto_refresh:"
 msgid "Auto-Refresh"
@@ -618,7 +436,7 @@ msgstr "Auto-rafraîchissement"
 
 msgctxt "field:ir.action.act_window,context:"
 msgid "Context Value"
-msgstr "Valeur contextuelle"
+msgstr "Valeur du contexte"
 
 msgctxt "field:ir.action.act_window,create_date:"
 msgid "Create Date"
@@ -660,6 +478,10 @@ msgctxt "field:ir.action.act_window,name:"
 msgid "Name"
 msgstr "Nom"
 
+msgctxt "field:ir.action.act_window,order:"
+msgid "Order Value"
+msgstr "Valeur de l'ordre"
+
 msgctxt "field:ir.action.act_window,pyson_context:"
 msgid "PySON Context"
 msgstr "Contexte PySON"
@@ -668,6 +490,10 @@ msgctxt "field:ir.action.act_window,pyson_domain:"
 msgid "PySON Domain"
 msgstr "Domaine PySON"
 
+msgctxt "field:ir.action.act_window,pyson_order:"
+msgid "PySON Order"
+msgstr "Ordre PySON"
+
 msgctxt "field:ir.action.act_window,pyson_search_value:"
 msgid "PySON Search Criteria"
 msgstr "Critère de recherche PySON"
@@ -942,7 +768,7 @@ msgstr "Action"
 
 msgctxt "field:ir.action.url,active:"
 msgid "Active"
-msgstr "Active"
+msgstr "Actif"
 
 msgctxt "field:ir.action.url,create_date:"
 msgid "Create Date"
@@ -1002,7 +828,7 @@ msgstr "Action"
 
 msgctxt "field:ir.action.wizard,active:"
 msgid "Active"
-msgstr "Active"
+msgstr "Actif"
 
 msgctxt "field:ir.action.wizard,create_date:"
 msgid "Create Date"
@@ -1430,7 +1256,7 @@ msgstr "Information"
 
 msgctxt "field:ir.model,model:"
 msgid "Model Name"
-msgstr "Nom de l'objet"
+msgstr "Nom du modèle"
 
 msgctxt "field:ir.model,module:"
 msgid "Module"
@@ -1438,7 +1264,7 @@ msgstr "Module"
 
 msgctxt "field:ir.model,name:"
 msgid "Model Description"
-msgstr "Nom du modèle"
+msgstr "Description du modèle"
 
 msgctxt "field:ir.model,rec_name:"
 msgid "Name"
@@ -2002,7 +1828,7 @@ msgstr "Actif"
 
 msgctxt "field:ir.sequence,code:"
 msgid "Sequence Code"
-msgstr "Type de séquence"
+msgstr "Code de séquence"
 
 msgctxt "field:ir.sequence,create_date:"
 msgid "Create Date"
@@ -2022,7 +1848,7 @@ msgstr "Dernière estampille"
 
 msgctxt "field:ir.sequence,name:"
 msgid "Sequence Name"
-msgstr "Nom de la séquence"
+msgstr "Nom de séquence"
 
 msgctxt "field:ir.sequence,number_increment:"
 msgid "Increment Number"
@@ -2098,7 +1924,7 @@ msgstr "Dernière estampille"
 
 msgctxt "field:ir.sequence.strict,name:"
 msgid "Sequence Name"
-msgstr "Nom"
+msgstr "Nom de séquence"
 
 msgctxt "field:ir.sequence.strict,number_increment:"
 msgid "Increment Number"
@@ -2150,7 +1976,7 @@ msgstr "Mis à jour par"
 
 msgctxt "field:ir.sequence.type,code:"
 msgid "Sequence Code"
-msgstr "Code de la séquence"
+msgstr "Code de séquence"
 
 msgctxt "field:ir.sequence.type,create_date:"
 msgid "Create Date"
@@ -2166,7 +1992,7 @@ msgstr "ID"
 
 msgctxt "field:ir.sequence.type,name:"
 msgid "Sequence Name"
-msgstr "Nom de la séquence"
+msgstr "Nom de séquence"
 
 msgctxt "field:ir.sequence.type,rec_name:"
 msgid "Name"
@@ -2268,6 +2094,10 @@ msgctxt "field:ir.translation,name:"
 msgid "Field Name"
 msgstr "Nom du champ"
 
+msgctxt "field:ir.translation,overriding_module:"
+msgid "Overriding Module"
+msgstr "Module surchargeant"
+
 msgctxt "field:ir.translation,rec_name:"
 msgid "Name"
 msgstr "Nom"
@@ -2700,47 +2530,51 @@ msgctxt "field:ir.ui.view_search,write_uid:"
 msgid "Write User"
 msgstr "Mis à jour par"
 
-msgctxt "field:ir.ui.view_tree_expanded_state,child_name:"
+msgctxt "field:ir.ui.view_tree_state,child_name:"
 msgid "Child Name"
-msgstr "Nom de l'enfant"
+msgstr "Nom enfant"
 
-msgctxt "field:ir.ui.view_tree_expanded_state,create_date:"
+msgctxt "field:ir.ui.view_tree_state,create_date:"
 msgid "Create Date"
 msgstr "Date de création"
 
-msgctxt "field:ir.ui.view_tree_expanded_state,create_uid:"
+msgctxt "field:ir.ui.view_tree_state,create_uid:"
 msgid "Create User"
 msgstr "Créé par"
 
-msgctxt "field:ir.ui.view_tree_expanded_state,domain:"
+msgctxt "field:ir.ui.view_tree_state,domain:"
 msgid "Domain"
 msgstr "Domaine"
 
-msgctxt "field:ir.ui.view_tree_expanded_state,id:"
+msgctxt "field:ir.ui.view_tree_state,id:"
 msgid "ID"
 msgstr "ID"
 
-msgctxt "field:ir.ui.view_tree_expanded_state,model:"
+msgctxt "field:ir.ui.view_tree_state,model:"
 msgid "Model"
 msgstr "Modèle"
 
-msgctxt "field:ir.ui.view_tree_expanded_state,nodes:"
+msgctxt "field:ir.ui.view_tree_state,nodes:"
 msgid "Expanded Nodes"
 msgstr "Nœuds développés"
 
-msgctxt "field:ir.ui.view_tree_expanded_state,rec_name:"
+msgctxt "field:ir.ui.view_tree_state,rec_name:"
 msgid "Name"
 msgstr "Nom"
 
-msgctxt "field:ir.ui.view_tree_expanded_state,user:"
+msgctxt "field:ir.ui.view_tree_state,selected_nodes:"
+msgid "Selected Nodes"
+msgstr "Nœuds sélectionnés"
+
+msgctxt "field:ir.ui.view_tree_state,user:"
 msgid "User"
 msgstr "Utilisateur"
 
-msgctxt "field:ir.ui.view_tree_expanded_state,write_date:"
+msgctxt "field:ir.ui.view_tree_state,write_date:"
 msgid "Write Date"
 msgstr "Date de mise à jour"
 
-msgctxt "field:ir.ui.view_tree_expanded_state,write_uid:"
+msgctxt "field:ir.ui.view_tree_state,write_uid:"
 msgid "Write User"
 msgstr "Mis à jour par"
 
@@ -3029,7 +2863,7 @@ msgstr "Séquences strictes"
 
 msgctxt "model:ir.action,name:act_sequence_type_form"
 msgid "Sequence Types"
-msgstr "Types de séquences"
+msgstr "Types de séquence"
 
 msgctxt "model:ir.action,name:act_translation_clean"
 msgid "Clean Translations"
@@ -3067,9 +2901,9 @@ msgctxt "model:ir.action,name:act_view_show"
 msgid "Show View"
 msgstr "Montrer la vue"
 
-msgctxt "model:ir.action,name:act_view_tree_expanded_state"
-msgid "Tree Expanded State"
-msgstr "État des arbres développés"
+msgctxt "model:ir.action,name:act_view_tree_state"
+msgid "Tree State"
+msgstr "État d'arbre"
 
 msgctxt "model:ir.action,name:act_view_tree_width_form"
 msgid "View Tree Width"
@@ -3181,7 +3015,7 @@ msgstr "Français"
 
 msgctxt "model:ir.lang,name:lang_lt"
 msgid "Lithuanian"
-msgstr ""
+msgstr "Lituanien"
 
 msgctxt "model:ir.lang,name:lang_nl"
 msgid "Dutch"
@@ -3191,6 +3025,10 @@ msgctxt "model:ir.lang,name:lang_ru"
 msgid "Russian"
 msgstr "Russe"
 
+msgctxt "model:ir.lang,name:lang_sl"
+msgid "Slovenian"
+msgstr "Slovène"
+
 msgctxt "model:ir.model,name:"
 msgid "Model"
 msgstr "Modèle"
@@ -3201,7 +3039,7 @@ msgstr "Accès au modèle"
 
 msgctxt "model:ir.model.button,name:"
 msgid "Model Button"
-msgstr "Modèle bouton"
+msgstr "Bouton de modèle"
 
 msgctxt "model:ir.model.data,name:"
 msgid "Model data"
@@ -3213,11 +3051,11 @@ msgstr "Champ de modèle"
 
 msgctxt "model:ir.model.field.access,name:"
 msgid "Model Field Access"
-msgstr "Droit d'accès aux champs d'un Model"
+msgstr "Droit d'accès au champ de modèle"
 
 msgctxt "model:ir.model.print_model_graph.start,name:"
 msgid "Print Model Graph"
-msgstr "Imprimer le graphe des modèles"
+msgstr "Imprimer le graphe de modèles"
 
 msgctxt "model:ir.module.module,name:"
 msgid "Module"
@@ -3393,7 +3231,7 @@ msgstr "Menu"
 
 msgctxt "model:ir.ui.menu,name:menu_model_access_form"
 msgid "Models Access"
-msgstr "Accès au modèles"
+msgstr "Accès aux modèles"
 
 msgctxt "model:ir.ui.menu,name:menu_model_button_form"
 msgid "Buttons"
@@ -3429,7 +3267,7 @@ msgstr "Propriétés"
 
 msgctxt "model:ir.ui.menu,name:menu_property_form_default"
 msgid "Default Properties"
-msgstr "Propriétés par default"
+msgstr "Propriétés par defaut"
 
 msgctxt "model:ir.ui.menu,name:menu_rule_group_form"
 msgid "Record Rules"
@@ -3487,9 +3325,9 @@ msgctxt "model:ir.ui.menu,name:menu_view_search"
 msgid "View Search"
 msgstr "Recherches des vues"
 
-msgctxt "model:ir.ui.menu,name:menu_view_tree_expanded_state"
-msgid "Tree Expanded State"
-msgstr "État des arbres développés"
+msgctxt "model:ir.ui.menu,name:menu_view_tree_state"
+msgid "Tree State"
+msgstr "État d'arbre"
 
 msgctxt "model:ir.ui.menu,name:menu_view_tree_width"
 msgid "View Tree Width"
@@ -3515,9 +3353,9 @@ msgctxt "model:ir.ui.view_search,name:"
 msgid "View Search"
 msgstr "Recherches des vues"
 
-msgctxt "model:ir.ui.view_tree_expanded_state,name:"
-msgid "View Tree Expanded State"
-msgstr "État des vues arbres développées"
+msgctxt "model:ir.ui.view_tree_state,name:"
+msgid "View Tree State"
+msgstr "État de vue arbre"
 
 msgctxt "model:ir.ui.view_tree_width,name:"
 msgid "View Tree Width"
@@ -3528,14 +3366,6 @@ msgid "Action form"
 msgstr "Formulaire"
 
 msgctxt "selection:ir.action.keyword,keyword:"
-msgid "Action form"
-msgstr "Formulaire"
-
-msgctxt "selection:ir.action.keyword,keyword:"
-msgid "Action tree"
-msgstr "Arbre"
-
-msgctxt "selection:ir.action.keyword,keyword:"
 msgid "Action tree"
 msgstr "Arbre"
 
@@ -3544,14 +3374,6 @@ msgid "Form relate"
 msgstr "Formulaire relié"
 
 msgctxt "selection:ir.action.keyword,keyword:"
-msgid "Form relate"
-msgstr "Formulaire relié"
-
-msgctxt "selection:ir.action.keyword,keyword:"
-msgid "Open Graph"
-msgstr "Ouvrir le graphique"
-
-msgctxt "selection:ir.action.keyword,keyword:"
 msgid "Open Graph"
 msgstr "Ouvrir le graphique"
 
@@ -3560,14 +3382,6 @@ msgid "Open tree"
 msgstr "Ouvrir l'arbre"
 
 msgctxt "selection:ir.action.keyword,keyword:"
-msgid "Open tree"
-msgstr "Ouvrir l'arbre"
-
-msgctxt "selection:ir.action.keyword,keyword:"
-msgid "Print form"
-msgstr "Imprimer le formulaire"
-
-msgctxt "selection:ir.action.keyword,keyword:"
 msgid "Print form"
 msgstr "Imprimer le formulaire"
 
@@ -3576,14 +3390,6 @@ msgid "Data"
 msgstr "Données"
 
 msgctxt "selection:ir.attachment,type:"
-msgid "Data"
-msgstr "Données"
-
-msgctxt "selection:ir.attachment,type:"
-msgid "Link"
-msgstr "Lien"
-
-msgctxt "selection:ir.attachment,type:"
 msgid "Link"
 msgstr "Lien"
 
@@ -3592,14 +3398,6 @@ msgid "Days"
 msgstr "Jours"
 
 msgctxt "selection:ir.cron,interval_type:"
-msgid "Days"
-msgstr "Jours"
-
-msgctxt "selection:ir.cron,interval_type:"
-msgid "Hours"
-msgstr "Heures"
-
-msgctxt "selection:ir.cron,interval_type:"
 msgid "Hours"
 msgstr "Heures"
 
@@ -3608,14 +3406,6 @@ msgid "Minutes"
 msgstr "Minutes"
 
 msgctxt "selection:ir.cron,interval_type:"
-msgid "Minutes"
-msgstr "Minutes"
-
-msgctxt "selection:ir.cron,interval_type:"
-msgid "Months"
-msgstr "Mois"
-
-msgctxt "selection:ir.cron,interval_type:"
 msgid "Months"
 msgstr "Mois"
 
@@ -3623,14 +3413,6 @@ msgctxt "selection:ir.cron,interval_type:"
 msgid "Weeks"
 msgstr "Semaines"
 
-msgctxt "selection:ir.cron,interval_type:"
-msgid "Weeks"
-msgstr "Semaines"
-
-msgctxt "selection:ir.lang,direction:"
-msgid "Left-to-right"
-msgstr "Gauche-à-droite"
-
 msgctxt "selection:ir.lang,direction:"
 msgid "Left-to-right"
 msgstr "Gauche-à-droite"
@@ -3639,14 +3421,6 @@ msgctxt "selection:ir.lang,direction:"
 msgid "Right-to-left"
 msgstr "Droite-à-gauche"
 
-msgctxt "selection:ir.lang,direction:"
-msgid "Right-to-left"
-msgstr "Droite-à-gauche"
-
-msgctxt "selection:ir.module.module,state:"
-msgid "Installed"
-msgstr "Installé"
-
 msgctxt "selection:ir.module.module,state:"
 msgid "Installed"
 msgstr "Installé"
@@ -3656,22 +3430,10 @@ msgid "Not Installed"
 msgstr "Pas installé"
 
 msgctxt "selection:ir.module.module,state:"
-msgid "Not Installed"
-msgstr "Pas installé"
-
-msgctxt "selection:ir.module.module,state:"
 msgid "To be installed"
 msgstr "À être installé"
 
 msgctxt "selection:ir.module.module,state:"
-msgid "To be installed"
-msgstr "À être installé"
-
-msgctxt "selection:ir.module.module,state:"
-msgid "To be removed"
-msgstr "À être enlevé"
-
-msgctxt "selection:ir.module.module,state:"
 msgid "To be removed"
 msgstr "À être enlevé"
 
@@ -3679,14 +3441,6 @@ msgctxt "selection:ir.module.module,state:"
 msgid "To be upgraded"
 msgstr "À être mis à jour"
 
-msgctxt "selection:ir.module.module,state:"
-msgid "To be upgraded"
-msgstr "À être mis à jour"
-
-msgctxt "selection:ir.module.module.config_wizard.item,state:"
-msgid "Done"
-msgstr "Fait"
-
 msgctxt "selection:ir.module.module.config_wizard.item,state:"
 msgid "Done"
 msgstr "Fait"
@@ -3695,23 +3449,11 @@ msgctxt "selection:ir.module.module.config_wizard.item,state:"
 msgid "Open"
 msgstr "Ouvert"
 
-msgctxt "selection:ir.module.module.config_wizard.item,state:"
-msgid "Open"
-msgstr "Ouvert"
-
 msgctxt "selection:ir.module.module.dependency,state:"
 msgid "Installed"
 msgstr "Installé"
 
 msgctxt "selection:ir.module.module.dependency,state:"
-msgid "Installed"
-msgstr "Installé"
-
-msgctxt "selection:ir.module.module.dependency,state:"
-msgid "Not Installed"
-msgstr "Pas installé"
-
-msgctxt "selection:ir.module.module.dependency,state:"
 msgid "Not Installed"
 msgstr "Pas installé"
 
@@ -3720,14 +3462,6 @@ msgid "To be installed"
 msgstr "À être installé"
 
 msgctxt "selection:ir.module.module.dependency,state:"
-msgid "To be installed"
-msgstr "À être installé"
-
-msgctxt "selection:ir.module.module.dependency,state:"
-msgid "To be removed"
-msgstr "À être enlevé"
-
-msgctxt "selection:ir.module.module.dependency,state:"
 msgid "To be removed"
 msgstr "À être enlevé"
 
@@ -3736,14 +3470,6 @@ msgid "To be upgraded"
 msgstr "À être mis à jour"
 
 msgctxt "selection:ir.module.module.dependency,state:"
-msgid "To be upgraded"
-msgstr "À être mis à jour"
-
-msgctxt "selection:ir.module.module.dependency,state:"
-msgid "Unknown"
-msgstr "Inconnu"
-
-msgctxt "selection:ir.module.module.dependency,state:"
 msgid "Unknown"
 msgstr "Inconnu"
 
@@ -3752,14 +3478,6 @@ msgid "Decimal Timestamp"
 msgstr "Estampille décimale"
 
 msgctxt "selection:ir.sequence,type:"
-msgid "Decimal Timestamp"
-msgstr "Estampille décimale"
-
-msgctxt "selection:ir.sequence,type:"
-msgid "Hexadecimal Timestamp"
-msgstr "Estampille hexadécimale"
-
-msgctxt "selection:ir.sequence,type:"
 msgid "Hexadecimal Timestamp"
 msgstr "Estampille hexadécimale"
 
@@ -3767,14 +3485,6 @@ msgctxt "selection:ir.sequence,type:"
 msgid "Incremental"
 msgstr "Incrémental"
 
-msgctxt "selection:ir.sequence,type:"
-msgid "Incremental"
-msgstr "Incrémental"
-
-msgctxt "selection:ir.sequence.strict,type:"
-msgid "Decimal Timestamp"
-msgstr "Estampille décimale"
-
 msgctxt "selection:ir.sequence.strict,type:"
 msgid "Decimal Timestamp"
 msgstr "Estampille décimale"
@@ -3784,14 +3494,6 @@ msgid "Hexadecimal Timestamp"
 msgstr "Estampille hexadécimale"
 
 msgctxt "selection:ir.sequence.strict,type:"
-msgid "Hexadecimal Timestamp"
-msgstr "Estampille hexadécimale"
-
-msgctxt "selection:ir.sequence.strict,type:"
-msgid "Incremental"
-msgstr "Incrémental"
-
-msgctxt "selection:ir.sequence.strict,type:"
 msgid "Incremental"
 msgstr "Incrémental"
 
@@ -3800,14 +3502,6 @@ msgid "Error"
 msgstr "Erreur"
 
 msgctxt "selection:ir.translation,type:"
-msgid "Error"
-msgstr "Erreur"
-
-msgctxt "selection:ir.translation,type:"
-msgid "Field"
-msgstr "Champ"
-
-msgctxt "selection:ir.translation,type:"
 msgid "Field"
 msgstr "Champ"
 
@@ -3816,22 +3510,10 @@ msgid "Help"
 msgstr "Aide"
 
 msgctxt "selection:ir.translation,type:"
-msgid "Help"
-msgstr "Aide"
-
-msgctxt "selection:ir.translation,type:"
 msgid "Model"
 msgstr "Modèle"
 
 msgctxt "selection:ir.translation,type:"
-msgid "Model"
-msgstr "Modèle"
-
-msgctxt "selection:ir.translation,type:"
-msgid "ODT"
-msgstr "ODT"
-
-msgctxt "selection:ir.translation,type:"
 msgid "ODT"
 msgstr "ODT"
 
@@ -3840,14 +3522,6 @@ msgid "Selection"
 msgstr "Sélection"
 
 msgctxt "selection:ir.translation,type:"
-msgid "Selection"
-msgstr "Sélection"
-
-msgctxt "selection:ir.translation,type:"
-msgid "View"
-msgstr "Vue"
-
-msgctxt "selection:ir.translation,type:"
 msgid "View"
 msgstr "Vue"
 
@@ -3855,49 +3529,25 @@ msgctxt "selection:ir.translation,type:"
 msgid "Wizard Button"
 msgstr "Bouton de l'assistant"
 
-msgctxt "selection:ir.translation,type:"
-msgid "Wizard Button"
-msgstr "Bouton de l'assistant"
-
 msgctxt "selection:ir.ui.menu,action:"
 msgid ""
 msgstr ""
 
 msgctxt "selection:ir.ui.menu,action:"
 msgid "ir.action.act_window"
-msgstr ""
-
-msgctxt "selection:ir.ui.menu,action:"
-msgid "ir.action.act_window"
-msgstr ""
+msgstr "ir.action.act_window"
 
 msgctxt "selection:ir.ui.menu,action:"
 msgid "ir.action.report"
-msgstr ""
-
-msgctxt "selection:ir.ui.menu,action:"
-msgid "ir.action.report"
-msgstr ""
-
-msgctxt "selection:ir.ui.menu,action:"
-msgid "ir.action.url"
-msgstr ""
+msgstr "ir.action.report"
 
 msgctxt "selection:ir.ui.menu,action:"
 msgid "ir.action.url"
-msgstr ""
+msgstr "ir.action.url"
 
 msgctxt "selection:ir.ui.menu,action:"
 msgid "ir.action.wizard"
-msgstr ""
-
-msgctxt "selection:ir.ui.menu,action:"
-msgid "ir.action.wizard"
-msgstr ""
-
-msgctxt "selection:ir.ui.view,type:"
-msgid ""
-msgstr ""
+msgstr "ir.action.wizard"
 
 msgctxt "selection:ir.ui.view,type:"
 msgid ""
@@ -3908,12 +3558,8 @@ msgid "Board"
 msgstr "Tableau"
 
 msgctxt "selection:ir.ui.view,type:"
-msgid "Board"
-msgstr "Tableau"
-
-msgctxt "selection:ir.ui.view,type:"
-msgid "Form"
-msgstr "Formulaire"
+msgid "Calendar"
+msgstr "Calendrier"
 
 msgctxt "selection:ir.ui.view,type:"
 msgid "Form"
@@ -3924,14 +3570,6 @@ msgid "Graph"
 msgstr "Graphique"
 
 msgctxt "selection:ir.ui.view,type:"
-msgid "Graph"
-msgstr "Graphique"
-
-msgctxt "selection:ir.ui.view,type:"
-msgid "Tree"
-msgstr "Arbre"
-
-msgctxt "selection:ir.ui.view,type:"
 msgid "Tree"
 msgstr "Arbre"
 
@@ -3956,22 +3594,10 @@ msgid "General"
 msgstr "Général"
 
 msgctxt "view:ir.action.act_window:"
-msgid "General"
-msgstr "Général"
-
-msgctxt "view:ir.action.act_window:"
 msgid "Open Window"
 msgstr "Ouvre la fenêtre"
 
 msgctxt "view:ir.action.act_window:"
-msgid "Open Window"
-msgstr "Ouvre la fenêtre"
-
-msgctxt "view:ir.action.act_window:"
-msgid "Open a Window"
-msgstr "Ouvrir une fenêtre"
-
-msgctxt "view:ir.action.act_window:"
 msgid "Open a Window"
 msgstr "Ouvrir une fenêtre"
 
@@ -3988,22 +3614,10 @@ msgid "General"
 msgstr "Général"
 
 msgctxt "view:ir.action.report:"
-msgid "General"
-msgstr "Général"
-
-msgctxt "view:ir.action.report:"
 msgid "Report"
 msgstr "Rapport"
 
 msgctxt "view:ir.action.report:"
-msgid "Report"
-msgstr "Rapport"
-
-msgctxt "view:ir.action.report:"
-msgid "Report xml"
-msgstr "Rapport xml"
-
-msgctxt "view:ir.action.report:"
 msgid "Report xml"
 msgstr "Rapport xml"
 
@@ -4012,14 +3626,6 @@ msgid "General"
 msgstr "Général"
 
 msgctxt "view:ir.action.url:"
-msgid "General"
-msgstr "Général"
-
-msgctxt "view:ir.action.url:"
-msgid "URL"
-msgstr "URL"
-
-msgctxt "view:ir.action.url:"
 msgid "URL"
 msgstr "URL"
 
@@ -4028,21 +3634,9 @@ msgid "General"
 msgstr "Général"
 
 msgctxt "view:ir.action.wizard:"
-msgid "General"
-msgstr "Général"
-
-msgctxt "view:ir.action.wizard:"
 msgid "Wizard"
 msgstr "Assistant"
 
-msgctxt "view:ir.action.wizard:"
-msgid "Wizard"
-msgstr "Assistant"
-
-msgctxt "view:ir.action:"
-msgid "Action"
-msgstr "Action"
-
 msgctxt "view:ir.action:"
 msgid "Action"
 msgstr "Action"
@@ -4051,22 +3645,10 @@ msgctxt "view:ir.action:"
 msgid "General"
 msgstr "Général"
 
-msgctxt "view:ir.action:"
-msgid "General"
-msgstr "Général"
-
 msgctxt "view:ir.attachment:"
 msgid "Attachments"
 msgstr "Pièces jointes"
 
-msgctxt "view:ir.attachment:"
-msgid "Attachments"
-msgstr "Pièces jointes"
-
-msgctxt "view:ir.cron:"
-msgid "Action to trigger"
-msgstr "Action à déclencher"
-
 msgctxt "view:ir.cron:"
 msgid "Action to trigger"
 msgstr "Action à déclencher"
@@ -4076,14 +3658,6 @@ msgid "Scheduled Action"
 msgstr "Action planifiée"
 
 msgctxt "view:ir.cron:"
-msgid "Scheduled Action"
-msgstr "Action planifiée"
-
-msgctxt "view:ir.cron:"
-msgid "Scheduled Actions"
-msgstr "Actions planifiées"
-
-msgctxt "view:ir.cron:"
 msgid "Scheduled Actions"
 msgstr "Actions planifiées"
 
@@ -4091,14 +3665,6 @@ msgctxt "view:ir.export:"
 msgid "Exports"
 msgstr "Exports"
 
-msgctxt "view:ir.export:"
-msgid "Exports"
-msgstr "Exports"
-
-msgctxt "view:ir.lang:"
-msgid "Date Formatting"
-msgstr "Formatage des dates"
-
 msgctxt "view:ir.lang:"
 msgid "Date Formatting"
 msgstr "Formatage des dates"
@@ -4108,22 +3674,10 @@ msgid "Language"
 msgstr "Langues"
 
 msgctxt "view:ir.lang:"
-msgid "Language"
-msgstr "Langues"
-
-msgctxt "view:ir.lang:"
 msgid "Languages"
 msgstr "Langues"
 
 msgctxt "view:ir.lang:"
-msgid "Languages"
-msgstr "Langues"
-
-msgctxt "view:ir.lang:"
-msgid "Numbers Formatting"
-msgstr "Formatage des nombres"
-
-msgctxt "view:ir.lang:"
 msgid "Numbers Formatting"
 msgstr "Formatage des nombres"
 
@@ -4131,10 +3685,6 @@ msgctxt "view:ir.model.access:"
 msgid "Access controls"
 msgstr "Contrôles d'accès"
 
-msgctxt "view:ir.model.access:"
-msgid "Access controls"
-msgstr "Contrôles d'accès"
-
 msgctxt "view:ir.model.button:"
 msgid "Button"
 msgstr "Bouton"
@@ -4147,10 +3697,6 @@ msgctxt "view:ir.model.field.access:"
 msgid "Field Access"
 msgstr "Droits d'accès au champs"
 
-msgctxt "view:ir.model.field.access:"
-msgid "Field Access"
-msgstr "Droits d'accès au champs"
-
 msgctxt "view:ir.model.field:"
 msgid "Field"
 msgstr "Champ"
@@ -4159,25 +3705,13 @@ msgctxt "view:ir.model.field:"
 msgid "Fields"
 msgstr "Champs"
 
-msgctxt "view:ir.model.field:"
-msgid "Fields"
-msgstr "Champs"
-
 msgctxt "view:ir.model.print_model_graph.start:"
 msgid "Print Model Graph"
-msgstr "Imprimer le graphe des modèles"
+msgstr "Imprimer le graphe de modèles"
 
 msgctxt "view:ir.model:"
 msgid "Model Description"
-msgstr "Description du modèle"
-
-msgctxt "view:ir.model:"
-msgid "Model Description"
-msgstr "Description du modèle"
-
-msgctxt "view:ir.module.module.config_wizard.first:"
-msgid "Welcome to the module configuration wizard!"
-msgstr "Bienvenu dans l'assistant de configuration de module !"
+msgstr "Description de modèle"
 
 msgctxt "view:ir.module.module.config_wizard.first:"
 msgid "Welcome to the module configuration wizard!"
@@ -4191,18 +3725,6 @@ msgstr ""
 "Vous pourrez configurer votre installation en fonction des modules que vous "
 "avez installez."
 
-msgctxt "view:ir.module.module.config_wizard.first:"
-msgid ""
-"You will be able to configure your installation depending on the modules you"
-" have installed."
-msgstr ""
-"Vous pourrez configurer votre installation en fonction des modules que vous "
-"avez installez."
-
-msgctxt "view:ir.module.module.config_wizard.item:"
-msgid "Config Wizard Items"
-msgstr "Élements de l'assistant de configuration"
-
 msgctxt "view:ir.module.module.config_wizard.item:"
 msgid "Config Wizard Items"
 msgstr "Élements de l'assistant de configuration"
@@ -4244,14 +3766,6 @@ msgid "Cancel Installation"
 msgstr "Annuler l'installation"
 
 msgctxt "view:ir.module.module:"
-msgid "Cancel Installation"
-msgstr "Annuler l'installation"
-
-msgctxt "view:ir.module.module:"
-msgid "Cancel Uninstallation"
-msgstr "Annuler la désinstallation"
-
-msgctxt "view:ir.module.module:"
 msgid "Cancel Uninstallation"
 msgstr "Annuler la désinstallation"
 
@@ -4260,22 +3774,10 @@ msgid "Cancel Upgrade"
 msgstr "Annuler la mis-à-jour"
 
 msgctxt "view:ir.module.module:"
-msgid "Cancel Upgrade"
-msgstr "Annuler la mis-à-jour"
-
-msgctxt "view:ir.module.module:"
 msgid "Mark for Installation"
 msgstr "Marquer pour l'installation"
 
 msgctxt "view:ir.module.module:"
-msgid "Mark for Installation"
-msgstr "Marquer pour l'installation"
-
-msgctxt "view:ir.module.module:"
-msgid "Mark for Uninstallation (beta)"
-msgstr "Sélectionner pour la dés-installation"
-
-msgctxt "view:ir.module.module:"
 msgid "Mark for Uninstallation (beta)"
 msgstr "Sélectionner pour la dés-installation"
 
@@ -4284,22 +3786,10 @@ msgid "Mark for Upgrade"
 msgstr "Sélectionner pour la mise à jour"
 
 msgctxt "view:ir.module.module:"
-msgid "Mark for Upgrade"
-msgstr "Sélectionner pour la mise à jour"
-
-msgctxt "view:ir.module.module:"
 msgid "Module"
 msgstr "Module"
 
 msgctxt "view:ir.module.module:"
-msgid "Module"
-msgstr "Module"
-
-msgctxt "view:ir.module.module:"
-msgid "Modules"
-msgstr "Modules"
-
-msgctxt "view:ir.module.module:"
 msgid "Modules"
 msgstr "Modules"
 
@@ -4308,14 +3798,6 @@ msgid "Properties"
 msgstr "Propriétés"
 
 msgctxt "view:ir.property:"
-msgid "Properties"
-msgstr "Propriétés"
-
-msgctxt "view:ir.property:"
-msgid "Property"
-msgstr "Propriété"
-
-msgctxt "view:ir.property:"
 msgid "Property"
 msgstr "Propriété"
 
@@ -4327,25 +3809,10 @@ msgstr ""
 "n'est pas globale"
 
 msgctxt "view:ir.rule.group:"
-msgid ""
-"If there is no test defined, the rule is always satisfied if not global"
-msgstr ""
-"Si il n'y a pas de test défini, la règle est toujours satisfaite s'elle "
-"n'est pas globale"
-
-msgctxt "view:ir.rule.group:"
 msgid "Record rules"
 msgstr "Règles d'enregistrement"
 
 msgctxt "view:ir.rule.group:"
-msgid "Record rules"
-msgstr "Règles d'enregistrement"
-
-msgctxt "view:ir.rule.group:"
-msgid "The rule is satisfied if at least one test is True"
-msgstr "La règle est satisfaite si au moins un test est vrai"
-
-msgctxt "view:ir.rule.group:"
 msgid "The rule is satisfied if at least one test is True"
 msgstr "La règle est satisfaite si au moins un test est vrai"
 
@@ -4353,10 +3820,6 @@ msgctxt "view:ir.rule:"
 msgid "Test"
 msgstr "Test"
 
-msgctxt "view:ir.rule:"
-msgid "Test"
-msgstr "Test"
-
 msgctxt "view:ir.sequence.strict:"
 msgid "${day}"
 msgstr "${day}"
@@ -4393,14 +3856,6 @@ msgctxt "view:ir.sequence.type:"
 msgid "Sequence Type"
 msgstr "Type de séquence"
 
-msgctxt "view:ir.sequence.type:"
-msgid "Sequence Type"
-msgstr "Type de séquence"
-
-msgctxt "view:ir.sequence:"
-msgid "${day}"
-msgstr "${day}"
-
 msgctxt "view:ir.sequence:"
 msgid "${day}"
 msgstr "${day}"
@@ -4410,14 +3865,6 @@ msgid "${month}"
 msgstr "${month}"
 
 msgctxt "view:ir.sequence:"
-msgid "${month}"
-msgstr "${month}"
-
-msgctxt "view:ir.sequence:"
-msgid "${year}"
-msgstr "${year}"
-
-msgctxt "view:ir.sequence:"
 msgid "${year}"
 msgstr "${year}"
 
@@ -4426,14 +3873,6 @@ msgid "Day:"
 msgstr "Jour:"
 
 msgctxt "view:ir.sequence:"
-msgid "Day:"
-msgstr "Jour:"
-
-msgctxt "view:ir.sequence:"
-msgid "Incremental"
-msgstr "Incrémental"
-
-msgctxt "view:ir.sequence:"
 msgid "Incremental"
 msgstr "Incrémental"
 
@@ -4442,14 +3881,6 @@ msgid "Legend (Placeholders for prefix, suffix)"
 msgstr "Légende (charactère pour le préfixe, le suffixe)"
 
 msgctxt "view:ir.sequence:"
-msgid "Legend (Placeholders for prefix, suffix)"
-msgstr "Légende (charactère pour le préfixe, le suffixe)"
-
-msgctxt "view:ir.sequence:"
-msgid "Month:"
-msgstr "Mois :"
-
-msgctxt "view:ir.sequence:"
 msgid "Month:"
 msgstr "Mois :"
 
@@ -4458,14 +3889,6 @@ msgid "Sequences"
 msgstr "Séquences"
 
 msgctxt "view:ir.sequence:"
-msgid "Sequences"
-msgstr "Séquences"
-
-msgctxt "view:ir.sequence:"
-msgid "Timestamp"
-msgstr "Estampille"
-
-msgctxt "view:ir.sequence:"
 msgid "Timestamp"
 msgstr "Estampille"
 
@@ -4473,14 +3896,6 @@ msgctxt "view:ir.sequence:"
 msgid "Year:"
 msgstr "Année :"
 
-msgctxt "view:ir.sequence:"
-msgid "Year:"
-msgstr "Année :"
-
-msgctxt "view:ir.translation.clean.start:"
-msgid "Clean Translations"
-msgstr "Nettoyer les traductions"
-
 msgctxt "view:ir.translation.clean.start:"
 msgid "Clean Translations"
 msgstr "Nettoyer les traductions"
@@ -4505,10 +3920,6 @@ msgctxt "view:ir.translation.export.start:"
 msgid "Export Translation"
 msgstr "Exporter les traductions"
 
-msgctxt "view:ir.translation.export.start:"
-msgid "Export Translation"
-msgstr "Exporter les traductions"
-
 msgctxt "view:ir.translation.set.start:"
 msgid "Set Translations"
 msgstr "Définir les traductions"
@@ -4533,14 +3944,6 @@ msgctxt "view:ir.translation:"
 msgid "Translations"
 msgstr "Traductions"
 
-msgctxt "view:ir.translation:"
-msgid "Translations"
-msgstr "Traductions"
-
-msgctxt "view:ir.trigger:"
-msgid "Trigger"
-msgstr "Déclencheur"
-
 msgctxt "view:ir.trigger:"
 msgid "Trigger"
 msgstr "Déclencheur"
@@ -4549,14 +3952,6 @@ msgctxt "view:ir.trigger:"
 msgid "Triggers"
 msgstr "Déclencheurs"
 
-msgctxt "view:ir.trigger:"
-msgid "Triggers"
-msgstr "Déclencheurs"
-
-msgctxt "view:ir.ui.icon:"
-msgid "Icon"
-msgstr "Icône"
-
 msgctxt "view:ir.ui.icon:"
 msgid "Icon"
 msgstr "Icône"
@@ -4565,10 +3960,6 @@ msgctxt "view:ir.ui.icon:"
 msgid "Icons"
 msgstr "Icônes"
 
-msgctxt "view:ir.ui.icon:"
-msgid "Icons"
-msgstr "Icônes"
-
 msgctxt "view:ir.ui.menu.favorite:"
 msgid "Menu Favorite"
 msgstr "Favori menu"
@@ -4581,14 +3972,6 @@ msgctxt "view:ir.ui.menu:"
 msgid "Menu"
 msgstr "Menu"
 
-msgctxt "view:ir.ui.menu:"
-msgid "Menu"
-msgstr "Menu"
-
-msgctxt "view:ir.ui.view:"
-msgid "View"
-msgstr "Vue"
-
 msgctxt "view:ir.ui.view:"
 msgid "View"
 msgstr "Vue"
@@ -4597,10 +3980,6 @@ msgctxt "view:ir.ui.view:"
 msgid "_Show"
 msgstr "_Montrer"
 
-msgctxt "view:ir.ui.view:"
-msgid "_Show"
-msgstr "_Montrer"
-
 msgctxt "view:ir.ui.view_search:"
 msgid "View Search"
 msgstr "Recherches des vues"
@@ -4609,35 +3988,19 @@ msgctxt "view:ir.ui.view_search:"
 msgid "View Searches"
 msgstr "Recherches des vues"
 
-msgctxt "view:ir.ui.view_tree_expanded_state:"
-msgid "View Tree Expanded State"
-msgstr "État des vues arbres développées"
-
-msgctxt "view:ir.ui.view_tree_expanded_state:"
-msgid "View Tree Expanded State"
-msgstr "État des vues arbres développées"
+msgctxt "view:ir.ui.view_tree_state:"
+msgid "View Tree State"
+msgstr "État de vue arbre"
 
-msgctxt "view:ir.ui.view_tree_expanded_state:"
-msgid "Views Tree Expanded State"
-msgstr "État des vues arbres développées"
-
-msgctxt "view:ir.ui.view_tree_expanded_state:"
-msgid "Views Tree Expanded State"
-msgstr "État des vues arbres développées"
+msgctxt "view:ir.ui.view_tree_state:"
+msgid "Views Tree State"
+msgstr "État des vues arbres"
 
 msgctxt "view:ir.ui.view_tree_width:"
 msgid "View Tree Width"
 msgstr "Largeur de vue arbre"
 
 msgctxt "view:ir.ui.view_tree_width:"
-msgid "View Tree Width"
-msgstr "Largeur de vue arbre"
-
-msgctxt "view:ir.ui.view_tree_width:"
-msgid "Views Tree Width"
-msgstr "Largeurs des vues arbres"
-
-msgctxt "view:ir.ui.view_tree_width:"
 msgid "Views Tree Width"
 msgstr "Largeurs des vues arbres"
 
diff --git a/trytond/ir/locale/nl_NL.po b/trytond/ir/locale/nl_NL.po
index 9a97fd6..c191cfe 100644
--- a/trytond/ir/locale/nl_NL.po
+++ b/trytond/ir/locale/nl_NL.po
@@ -73,14 +73,11 @@ msgstr "Geplande actie mislukt"
 msgctxt "error:ir.cron:"
 msgid ""
 "The following action failed to execute properly: \"%s\"\n"
+"%s\n"
 " Traceback: \n"
 "\n"
 "%s\n"
 msgstr ""
-"Deze aktie is niet goed uitgevoerd: \"%s\"\n"
-"Spoor:\n"
-"\n"
-"%s"
 
 msgctxt "error:ir.lang:"
 msgid "Default language can not be deleted."
@@ -223,6 +220,12 @@ msgctxt "error:ir.translation:"
 msgid "Translation must be unique"
 msgstr "Vertaling moet uniek zijn!"
 
+msgctxt "error:ir.translation:"
+msgid ""
+"You can not export translation %(name)s because it is an overridden "
+"translation by module %(overriding_module)s"
+msgstr ""
+
 msgctxt "error:ir.trigger:"
 msgid "\"On Time\" and others are mutually exclusive!"
 msgstr "\"Op tijd\" en anderen sluiten elkaar uit!"
@@ -453,6 +456,10 @@ msgctxt "field:ir.action.act_window,name:"
 msgid "Name"
 msgstr "Naam bijlage"
 
+msgctxt "field:ir.action.act_window,order:"
+msgid "Order Value"
+msgstr ""
+
 msgctxt "field:ir.action.act_window,pyson_context:"
 msgid "PySON Context"
 msgstr "PySON verband"
@@ -461,6 +468,10 @@ msgctxt "field:ir.action.act_window,pyson_domain:"
 msgid "PySON Domain"
 msgstr "PySON domein"
 
+msgctxt "field:ir.action.act_window,pyson_order:"
+msgid "PySON Order"
+msgstr ""
+
 msgctxt "field:ir.action.act_window,pyson_search_value:"
 msgid "PySON Search Criteria"
 msgstr "PySON zoekargument"
@@ -2114,6 +2125,10 @@ msgctxt "field:ir.translation,name:"
 msgid "Field Name"
 msgstr "Veldnaam"
 
+msgctxt "field:ir.translation,overriding_module:"
+msgid "Overriding Module"
+msgstr ""
+
 msgctxt "field:ir.translation,rec_name:"
 msgid "Name"
 msgstr "Naam"
@@ -2564,51 +2579,55 @@ msgctxt "field:ir.ui.view_search,write_uid:"
 msgid "Write User"
 msgstr ""
 
-msgctxt "field:ir.ui.view_tree_expanded_state,child_name:"
+msgctxt "field:ir.ui.view_tree_state,child_name:"
 msgid "Child Name"
 msgstr ""
 
-msgctxt "field:ir.ui.view_tree_expanded_state,create_date:"
+msgctxt "field:ir.ui.view_tree_state,create_date:"
 msgid "Create Date"
 msgstr ""
 
-msgctxt "field:ir.ui.view_tree_expanded_state,create_uid:"
+msgctxt "field:ir.ui.view_tree_state,create_uid:"
 msgid "Create User"
 msgstr ""
 
 #, fuzzy
-msgctxt "field:ir.ui.view_tree_expanded_state,domain:"
+msgctxt "field:ir.ui.view_tree_state,domain:"
 msgid "Domain"
 msgstr "Domein"
 
-msgctxt "field:ir.ui.view_tree_expanded_state,id:"
+msgctxt "field:ir.ui.view_tree_state,id:"
 msgid "ID"
 msgstr ""
 
 #, fuzzy
-msgctxt "field:ir.ui.view_tree_expanded_state,model:"
+msgctxt "field:ir.ui.view_tree_state,model:"
 msgid "Model"
 msgstr "Model"
 
-msgctxt "field:ir.ui.view_tree_expanded_state,nodes:"
+msgctxt "field:ir.ui.view_tree_state,nodes:"
 msgid "Expanded Nodes"
 msgstr ""
 
 #, fuzzy
-msgctxt "field:ir.ui.view_tree_expanded_state,rec_name:"
+msgctxt "field:ir.ui.view_tree_state,rec_name:"
 msgid "Name"
 msgstr "Naam bijlage"
 
+msgctxt "field:ir.ui.view_tree_state,selected_nodes:"
+msgid "Selected Nodes"
+msgstr ""
+
 #, fuzzy
-msgctxt "field:ir.ui.view_tree_expanded_state,user:"
+msgctxt "field:ir.ui.view_tree_state,user:"
 msgid "User"
 msgstr "Gebruiker"
 
-msgctxt "field:ir.ui.view_tree_expanded_state,write_date:"
+msgctxt "field:ir.ui.view_tree_state,write_date:"
 msgid "Write Date"
 msgstr ""
 
-msgctxt "field:ir.ui.view_tree_expanded_state,write_uid:"
+msgctxt "field:ir.ui.view_tree_state,write_uid:"
 msgid "Write User"
 msgstr ""
 
@@ -2928,8 +2947,8 @@ msgctxt "model:ir.action,name:act_view_show"
 msgid "Show View"
 msgstr ""
 
-msgctxt "model:ir.action,name:act_view_tree_expanded_state"
-msgid "Tree Expanded State"
+msgctxt "model:ir.action,name:act_view_tree_state"
+msgid "Tree State"
 msgstr ""
 
 msgctxt "model:ir.action,name:act_view_tree_width_form"
@@ -3053,6 +3072,10 @@ msgctxt "model:ir.lang,name:lang_ru"
 msgid "Russian"
 msgstr "Russisch"
 
+msgctxt "model:ir.lang,name:lang_sl"
+msgid "Slovenian"
+msgstr ""
+
 msgctxt "model:ir.model,name:"
 msgid "Model"
 msgstr "Model"
@@ -3355,8 +3378,8 @@ msgctxt "model:ir.ui.menu,name:menu_view_search"
 msgid "View Search"
 msgstr ""
 
-msgctxt "model:ir.ui.menu,name:menu_view_tree_expanded_state"
-msgid "Tree Expanded State"
+msgctxt "model:ir.ui.menu,name:menu_view_tree_state"
+msgid "Tree State"
 msgstr ""
 
 msgctxt "model:ir.ui.menu,name:menu_view_tree_width"
@@ -3383,8 +3406,8 @@ msgctxt "model:ir.ui.view_search,name:"
 msgid "View Search"
 msgstr ""
 
-msgctxt "model:ir.ui.view_tree_expanded_state,name:"
-msgid "View Tree Expanded State"
+msgctxt "model:ir.ui.view_tree_state,name:"
+msgid "View Tree State"
 msgstr ""
 
 msgctxt "model:ir.ui.view_tree_width,name:"
@@ -3589,6 +3612,10 @@ msgid "Board"
 msgstr "Bord"
 
 msgctxt "selection:ir.ui.view,type:"
+msgid "Calendar"
+msgstr ""
+
+msgctxt "selection:ir.ui.view,type:"
 msgid "Form"
 msgstr "Formulier"
 
@@ -3993,12 +4020,12 @@ msgctxt "view:ir.ui.view_search:"
 msgid "View Searches"
 msgstr ""
 
-msgctxt "view:ir.ui.view_tree_expanded_state:"
-msgid "View Tree Expanded State"
+msgctxt "view:ir.ui.view_tree_state:"
+msgid "View Tree State"
 msgstr ""
 
-msgctxt "view:ir.ui.view_tree_expanded_state:"
-msgid "Views Tree Expanded State"
+msgctxt "view:ir.ui.view_tree_state:"
+msgid "Views Tree State"
 msgstr ""
 
 msgctxt "view:ir.ui.view_tree_width:"
diff --git a/trytond/ir/locale/ru_RU.po b/trytond/ir/locale/ru_RU.po
index 8a30266..5e5ffb1 100644
--- a/trytond/ir/locale/ru_RU.po
+++ b/trytond/ir/locale/ru_RU.po
@@ -79,14 +79,11 @@ msgstr "Запланированное действие не удалось вы
 msgctxt "error:ir.cron:"
 msgid ""
 "The following action failed to execute properly: \"%s\"\n"
+"%s\n"
 " Traceback: \n"
 "\n"
 "%s\n"
 msgstr ""
-"Следующие действия не возможно выполнить должным образом: \"%s\"\n"
-" Отладочное сообщение:\n"
-"\n"
-"%s\n"
 
 msgctxt "error:ir.lang:"
 msgid "Default language can not be deleted."
@@ -229,6 +226,12 @@ msgctxt "error:ir.translation:"
 msgid "Translation must be unique"
 msgstr "Перевод должен быть уникальным"
 
+msgctxt "error:ir.translation:"
+msgid ""
+"You can not export translation %(name)s because it is an overridden "
+"translation by module %(overriding_module)s"
+msgstr ""
+
 msgctxt "error:ir.trigger:"
 msgid "\"On Time\" and others are mutually exclusive!"
 msgstr "\"На время\" и другие варианты взаимоисключающие"
@@ -459,6 +462,10 @@ msgctxt "field:ir.action.act_window,name:"
 msgid "Name"
 msgstr "Наименование"
 
+msgctxt "field:ir.action.act_window,order:"
+msgid "Order Value"
+msgstr ""
+
 msgctxt "field:ir.action.act_window,pyson_context:"
 msgid "PySON Context"
 msgstr "PySON контекст"
@@ -467,6 +474,10 @@ msgctxt "field:ir.action.act_window,pyson_domain:"
 msgid "PySON Domain"
 msgstr "PySON домен"
 
+msgctxt "field:ir.action.act_window,pyson_order:"
+msgid "PySON Order"
+msgstr ""
+
 msgctxt "field:ir.action.act_window,pyson_search_value:"
 msgid "PySON Search Criteria"
 msgstr "PySON условие поиска"
@@ -2067,6 +2078,10 @@ msgctxt "field:ir.translation,name:"
 msgid "Field Name"
 msgstr "Название поля"
 
+msgctxt "field:ir.translation,overriding_module:"
+msgid "Overriding Module"
+msgstr ""
+
 msgctxt "field:ir.translation,rec_name:"
 msgid "Name"
 msgstr "Наименование"
@@ -2499,47 +2514,60 @@ msgctxt "field:ir.ui.view_search,write_uid:"
 msgid "Write User"
 msgstr "Изменено пользователем"
 
-msgctxt "field:ir.ui.view_tree_expanded_state,child_name:"
+msgctxt "field:ir.ui.view_tree_state,child_name:"
 msgid "Child Name"
-msgstr "Наименование подчиненного"
+msgstr ""
 
-msgctxt "field:ir.ui.view_tree_expanded_state,create_date:"
+#, fuzzy
+msgctxt "field:ir.ui.view_tree_state,create_date:"
 msgid "Create Date"
 msgstr "Дата создания"
 
-msgctxt "field:ir.ui.view_tree_expanded_state,create_uid:"
+#, fuzzy
+msgctxt "field:ir.ui.view_tree_state,create_uid:"
 msgid "Create User"
 msgstr "Создано пользователем"
 
-msgctxt "field:ir.ui.view_tree_expanded_state,domain:"
+#, fuzzy
+msgctxt "field:ir.ui.view_tree_state,domain:"
 msgid "Domain"
-msgstr "Домен"
+msgstr "Область"
 
-msgctxt "field:ir.ui.view_tree_expanded_state,id:"
+#, fuzzy
+msgctxt "field:ir.ui.view_tree_state,id:"
 msgid "ID"
 msgstr "ID"
 
-msgctxt "field:ir.ui.view_tree_expanded_state,model:"
+#, fuzzy
+msgctxt "field:ir.ui.view_tree_state,model:"
 msgid "Model"
 msgstr "Модель"
 
-msgctxt "field:ir.ui.view_tree_expanded_state,nodes:"
+msgctxt "field:ir.ui.view_tree_state,nodes:"
 msgid "Expanded Nodes"
-msgstr "Развернутые узлы"
+msgstr ""
 
-msgctxt "field:ir.ui.view_tree_expanded_state,rec_name:"
+#, fuzzy
+msgctxt "field:ir.ui.view_tree_state,rec_name:"
 msgid "Name"
-msgstr "Наименование"
+msgstr "Полное наименование"
 
-msgctxt "field:ir.ui.view_tree_expanded_state,user:"
+msgctxt "field:ir.ui.view_tree_state,selected_nodes:"
+msgid "Selected Nodes"
+msgstr ""
+
+#, fuzzy
+msgctxt "field:ir.ui.view_tree_state,user:"
 msgid "User"
 msgstr "Пользователь"
 
-msgctxt "field:ir.ui.view_tree_expanded_state,write_date:"
+#, fuzzy
+msgctxt "field:ir.ui.view_tree_state,write_date:"
 msgid "Write Date"
 msgstr "Дата изменения"
 
-msgctxt "field:ir.ui.view_tree_expanded_state,write_uid:"
+#, fuzzy
+msgctxt "field:ir.ui.view_tree_state,write_uid:"
 msgid "Write User"
 msgstr "Изменено пользователем"
 
@@ -2867,9 +2895,9 @@ msgctxt "model:ir.action,name:act_view_show"
 msgid "Show View"
 msgstr "Просмотр"
 
-msgctxt "model:ir.action,name:act_view_tree_expanded_state"
-msgid "Tree Expanded State"
-msgstr "Список в развернутом состоянии"
+msgctxt "model:ir.action,name:act_view_tree_state"
+msgid "Tree State"
+msgstr ""
 
 msgctxt "model:ir.action,name:act_view_tree_width_form"
 msgid "View Tree Width"
@@ -2991,6 +3019,10 @@ msgctxt "model:ir.lang,name:lang_ru"
 msgid "Russian"
 msgstr "Русский"
 
+msgctxt "model:ir.lang,name:lang_sl"
+msgid "Slovenian"
+msgstr ""
+
 msgctxt "model:ir.model,name:"
 msgid "Model"
 msgstr "Модель"
@@ -3287,9 +3319,9 @@ msgctxt "model:ir.ui.menu,name:menu_view_search"
 msgid "View Search"
 msgstr "Просмотр поиска"
 
-msgctxt "model:ir.ui.menu,name:menu_view_tree_expanded_state"
-msgid "Tree Expanded State"
-msgstr "Список в развернутом состоянии"
+msgctxt "model:ir.ui.menu,name:menu_view_tree_state"
+msgid "Tree State"
+msgstr ""
 
 msgctxt "model:ir.ui.menu,name:menu_view_tree_width"
 msgid "View Tree Width"
@@ -3315,9 +3347,9 @@ msgctxt "model:ir.ui.view_search,name:"
 msgid "View Search"
 msgstr "Просмотр поиска"
 
-msgctxt "model:ir.ui.view_tree_expanded_state,name:"
-msgid "View Tree Expanded State"
-msgstr "Просмотр списка в развернутом состоянии"
+msgctxt "model:ir.ui.view_tree_state,name:"
+msgid "View Tree State"
+msgstr ""
 
 msgctxt "model:ir.ui.view_tree_width,name:"
 msgid "View Tree Width"
@@ -3519,6 +3551,11 @@ msgctxt "selection:ir.ui.view,type:"
 msgid "Board"
 msgstr "Доска"
 
+#, fuzzy
+msgctxt "selection:ir.ui.view,type:"
+msgid "Calendar"
+msgstr "Календарь"
+
 msgctxt "selection:ir.ui.view,type:"
 msgid "Form"
 msgstr "Форма"
@@ -3915,13 +3952,13 @@ msgctxt "view:ir.ui.view_search:"
 msgid "View Searches"
 msgstr "Просмотры поиска"
 
-msgctxt "view:ir.ui.view_tree_expanded_state:"
-msgid "View Tree Expanded State"
-msgstr "Просмотр списка в развернутом состоянии"
+msgctxt "view:ir.ui.view_tree_state:"
+msgid "View Tree State"
+msgstr ""
 
-msgctxt "view:ir.ui.view_tree_expanded_state:"
-msgid "Views Tree Expanded State"
-msgstr "Просмотр списка в развернутом состоянии"
+msgctxt "view:ir.ui.view_tree_state:"
+msgid "Views Tree State"
+msgstr ""
 
 msgctxt "view:ir.ui.view_tree_width:"
 msgid "View Tree Width"
diff --git a/trytond/ir/locale/nl_NL.po b/trytond/ir/locale/sl_SI.po
similarity index 72%
copy from trytond/ir/locale/nl_NL.po
copy to trytond/ir/locale/sl_SI.po
index 9a97fd6..ff857f9 100644
--- a/trytond/ir/locale/nl_NL.po
+++ b/trytond/ir/locale/sl_SI.po
@@ -7,467 +7,489 @@ msgid ""
 "You try to bypass an access rule!\n"
 "(Document type: %s)"
 msgstr ""
-"U probeert een toegangsregel te omzeilen!\n"
-"(Document type: %s)"
+"Poskušate zaobiti pravilo dostopa.\n"
+"(Vrsta dokumenta: %s"
 
 msgctxt "error:access_error:"
 msgid ""
 "You try to bypass an access rule.\n"
 "(Document type: %s)"
 msgstr ""
+"Poskus izogiba zaščite dostopa.\n"
+"(Vrsta dokumenta: %s)"
 
 msgctxt "error:delete_xml_record:"
 msgid "You are not allowed to delete this record."
-msgstr "Het is u niet toegestaan dit item te verwijderen."
+msgstr "Nimate dovoljenja za brisanje tega zapisa"
 
 msgctxt "error:digits_validation_record:"
 msgid "The field \"%s\" on \"%s\" has too many decimal digits."
-msgstr "Het veld \"%s\" in \"%s\" heeft te veel decimalen."
+msgstr "Polje \"%s\" pri \"%s\" ima preveč decimalk."
 
 msgctxt "error:domain_validation_record:"
 msgid "The value of the field \"%s\" on \"%s\" is not valid according to its domain."
-msgstr "De waarde van het veld \"%s\" in \"%s\" is niet geldig binnen zijn domein."
+msgstr "Vrednost polja \"%s\" pri \"%s\" ni veljavna glede na svojo domeno."
 
 msgctxt "error:foreign_model_exist:"
 msgid "Could not delete \"%s\" records because they are used on field \"%s\" of \"%s\"."
-msgstr ""
-"Kon items \"%s\" niet verwijderen omdat ze in gebruik waren in veld \"%s\" "
-"van \"%s\"."
+msgstr "\"%s\" zapisov ni možno zbrisati, ker so uporabljeni v polju \"%s\" od \"%s\"."
 
 msgctxt "error:foreign_model_missing:"
 msgid "The value of field \"%s\" on \"%s\" doesn't exist."
-msgstr "De waarde van veld \"%s\" in \"%s\" bestaat niet."
+msgstr "Vrednost polja \"%s\" pri \"%s\" ne obstaja."
 
 msgctxt "error:ir.action.act_window:"
 msgid "Invalid context \"%(context)s\" on action \"%(action)s\"."
-msgstr ""
+msgstr "Neveljaven kontekst \"%(context)s\" pri ukrepu \"%(action)s\"."
 
 msgctxt "error:ir.action.act_window:"
 msgid "Invalid domain or search criteria \"%(domain)s\" on action \"%(action)s\"."
 msgstr ""
+"Neveljavna domena ali iskalni kriterij \"%(domain)s\" pri ukrepu "
+"\"%(action)s\"."
 
 msgctxt "error:ir.action.act_window:"
 msgid "Invalid view \"%(view)s\" for action \"%(action)s\"."
-msgstr ""
+msgstr "Neveljaven pogled \"%(view)s\" za ukrep \"%(action)s\"."
 
 msgctxt "error:ir.action.keyword:"
 msgid "Wrong wizard model in keyword action \"%s\"."
-msgstr ""
+msgstr "Napačen model čarovnika v ukrepu ključne besede \"%s\"."
 
 msgctxt "error:ir.action.report:"
 msgid "Invalid email definition on report \"%s\"."
-msgstr ""
+msgstr "Neveljavna definicija epošte na izpisu \"%s\"."
 
 msgctxt "error:ir.action.report:"
 msgid "The internal name must be unique by module!"
-msgstr "De interne naam moet uniek zijn per module!"
+msgstr "Interni naziv mora biti enoličen med moduli."
 
 msgctxt "error:ir.attachment:"
 msgid "The  names of attachments must be unique by resource!"
-msgstr "De namen van de bijlagen moeten uniek zijn per bron!"
+msgstr "Imena priponk morajo biti unikatna med resursi."
 
 msgctxt "error:ir.cron:"
 msgid "Scheduled action failed"
-msgstr "Geplande actie mislukt"
+msgstr "Načrtovan ukrep se ni uspešno izvedel."
 
 msgctxt "error:ir.cron:"
 msgid ""
 "The following action failed to execute properly: \"%s\"\n"
+"%s\n"
 " Traceback: \n"
 "\n"
 "%s\n"
 msgstr ""
-"Deze aktie is niet goed uitgevoerd: \"%s\"\n"
-"Spoor:\n"
+"Naslednji ukrep se ni pravilno izvedel: \"%s\"\n"
+"%s\n"
+" Traceback: \n"
 "\n"
-"%s"
+"%s\n"
 
 msgctxt "error:ir.lang:"
 msgid "Default language can not be deleted."
-msgstr ""
+msgstr "Privzetega jezika ni možno brisati."
 
 msgctxt "error:ir.lang:"
 msgid "Invalid date format \"%(format)s\" on \"%(language)s\" language."
-msgstr ""
+msgstr "Neveljaven format datuma \"%(format)s\" pri jeziku \"%(language)s\"."
 
 msgctxt "error:ir.lang:"
 msgid "Invalid grouping \"%(grouping)s\" on \"%(language)s\" language."
-msgstr ""
+msgstr "Neveljavno združevanje \"%(grouping)s\" po jeziku \"%(language)s\"."
 
 msgctxt "error:ir.lang:"
 msgid "The default language must be translatable."
-msgstr ""
+msgstr "Privzeti jezik mora biti prevedljiv."
 
 msgctxt "error:ir.lang:"
 msgid "decimal_point and thousands_sep must be different!"
-msgstr "Decimaal teken en duizendtal teken moet verschillend zijn!"
+msgstr "decimal_point in thousands_sep morata biti različna."
 
 msgctxt "error:ir.model.access:"
 msgid "You can not create this kind of document! (%s)"
-msgstr "U kunt dit type document niet aanmaken! (%s)"
+msgstr "Te vrste dokumenta ni možno ustvariti. (%s)"
 
 msgctxt "error:ir.model.access:"
 msgid "You can not delete this document! (%s)"
-msgstr "U kunt dit document niet verwijderen! (%s)"
+msgstr "Tega dokumenta ni možno zbrisati. (%s)"
 
 msgctxt "error:ir.model.access:"
 msgid "You can not read this document! (%s)"
-msgstr "U kunt dit document openen! (%s)"
+msgstr "Tega dokumenta ni možno prebrati. (%s)"
 
 msgctxt "error:ir.model.access:"
 msgid "You can not write in this document! (%s)"
-msgstr "U kunt dit document niet muteren! (%s)"
+msgstr "Tega dokumenta ni možno zapisati. (%s)"
 
 msgctxt "error:ir.model.button:"
 msgid "The button name in model must be unique!"
-msgstr ""
+msgstr "Ime gumba v modelu mora biti edinstveno."
 
 msgctxt "error:ir.model.data:"
 msgid "The triple (fs_id, module, model) must be unique!"
-msgstr "Het drietal (fs_id, module, model) moet uniek zijn!"
+msgstr "Trojček (fs_id, module, model) mora biti unikaten."
 
 msgctxt "error:ir.model.field.access:"
 msgid "You can not read the field! (%s.%s)"
-msgstr ""
+msgstr "Tega polja ni možno brati. (%s.%s)"
 
 msgctxt "error:ir.model.field.access:"
 msgid "You can not write on the field! (%s.%s)"
-msgstr ""
+msgstr "V to polje ni možno pisati. (%s.%s)"
 
 msgctxt "error:ir.model.field:"
 msgid "Model Field name \"%s\" is not a valid python identifier."
-msgstr ""
+msgstr "Naziv polja \"%s\" ni veljaven Python identifikator."
 
 msgctxt "error:ir.model.field:"
 msgid "The field name in model must be unique!"
-msgstr "De veldnaam in het model moet uniek zijn!"
+msgstr "Ime polja v modelu mora biti unikatno."
 
 msgctxt "error:ir.model:"
 msgid "Module name \"%s\" is not a valid python identifier."
-msgstr ""
+msgstr "Ime modula \"%s\" ni veljaven Python identifikator."
 
 msgctxt "error:ir.model:"
 msgid "The model must be unique!"
-msgstr "Het model moet uniek zijn!"
+msgstr "Model mora biti unikaten."
 
 msgctxt "error:ir.module.module.dependency:"
 msgid "Dependency must be unique by module!"
-msgstr "Afhankelijkheid moet uniek zijn per module!"
+msgstr "Odvisnost mora biti unikatno med moduli."
 
 msgctxt "error:ir.module.module:"
 msgid "Missing dependencies %s for module \"%s\""
-msgstr "Afhankelijkheid %s ontbreekt voor module \"%s\""
+msgstr "Manjkajoče odvisnosti %s za modul \"%s\""
 
 msgctxt "error:ir.module.module:"
 msgid "The modules you are trying to uninstall depends on installed modules:"
 msgstr ""
-"De module die u wilt verwijderen is afhankelijk van geïnstalleerde modules:"
+"Moduli, ki jih nameravate odstraniti, so odvisni od nameščenih modulov:"
 
 msgctxt "error:ir.module.module:"
 msgid "The name of the module must be unique!"
-msgstr "De naam van de module moet uniek zijn!"
+msgstr "Ime modula mora biti edinstveno."
 
 msgctxt "error:ir.module.module:"
 msgid "You can not remove a module that is installed or will be installed"
-msgstr "U kunt een module niet verwijderen als die geïnstalleerd is of wordt."
+msgstr "Modula, ki je ali bo nameščen, ne morete odstraniti."
 
 msgctxt "error:ir.rule.group:"
 msgid "Global and Default are mutually exclusive!"
-msgstr "Globaal en standaard sluiten elkaar uit!"
+msgstr "Globalno in Privzeto sta medsebojno izključujoča."
 
 msgctxt "error:ir.rule:"
 msgid "Invalid domain in rule \"%s\"."
-msgstr ""
+msgstr "Neveljavna domena pri pravilu \"%s\""
 
 msgctxt "error:ir.sequence.strict:"
 msgid "Invalid prefix \"%(prefix)s\" on sequence \"%(sequence)s\"."
-msgstr ""
+msgstr "Neveljavna predpona \"%(prefix)s\" pri štetju \"%(sequence)s\"."
 
 msgctxt "error:ir.sequence.strict:"
 msgid "Invalid suffix \"%(suffix)s\" on sequence \"%(sequence)s\"."
-msgstr ""
+msgstr "Neveljavna pripona \"%(suffix)s\" pri štetju \"%(sequence)s\"."
 
 msgctxt "error:ir.sequence.strict:"
 msgid "Last Timestamp cannot be in the future on sequence \"%s\"."
-msgstr ""
+msgstr "Zadnji časovni žig pri štetju \"%s\" ne more biti v prihodnosti."
 
 msgctxt "error:ir.sequence.strict:"
 msgid "Missing sequence."
-msgstr ""
+msgstr "Manjka zaporedna številka."
 
 msgctxt "error:ir.sequence.strict:"
 msgid "Timestamp rounding should be greater than 0"
-msgstr ""
+msgstr "Zaokroževanje časovnega žiga naj bo večje od nič."
 
 msgctxt "error:ir.sequence:"
 msgid "Invalid prefix \"%(prefix)s\" on sequence \"%(sequence)s\"."
-msgstr ""
+msgstr "Neveljavna predpona \"%(prefix)s\" pri štetju \"%(sequence)s\"."
 
 msgctxt "error:ir.sequence:"
 msgid "Invalid suffix \"%(suffix)s\" on sequence \"%(sequence)s\"."
-msgstr ""
+msgstr "Neveljavna pripona \"%(suffix)s\" pri štetju \"%(sequence)s\"."
 
 msgctxt "error:ir.sequence:"
 msgid "Last Timestamp cannot be in the future on sequence \"%s\"."
-msgstr ""
+msgstr "Zadnji časovni žig pri štetju \"%s\" ne more biti v prihodnosti."
 
 msgctxt "error:ir.sequence:"
 msgid "Missing sequence."
-msgstr ""
+msgstr "Manjka zaporedna številka."
 
 msgctxt "error:ir.sequence:"
 msgid "Timestamp rounding should be greater than 0"
-msgstr ""
+msgstr "Zaokroževanje časovnega žiga naj bo večje od nič."
 
 msgctxt "error:ir.translation:"
 msgid "Translation must be unique"
-msgstr "Vertaling moet uniek zijn!"
+msgstr "Prevod mora biti unikaten."
+
+msgctxt "error:ir.translation:"
+msgid ""
+"You can not export translation %(name)s because it is an overridden "
+"translation by module %(overriding_module)s"
+msgstr ""
+"Prevoda %(name)s ni možno izvoziti, ker je prepisan prevod od modula "
+"%(overriding_module)s"
 
 msgctxt "error:ir.trigger:"
 msgid "\"On Time\" and others are mutually exclusive!"
-msgstr "\"Op tijd\" en anderen sluiten elkaar uit!"
+msgstr "\"Točno ob času\" in ostali so med seboj izključujoči."
 
 msgctxt "error:ir.trigger:"
 msgid ""
 "Condition \"%(condition)s\" is not a valid python expression on trigger "
 "\"%(trigger)s\"."
 msgstr ""
+"Pogoj \"%(condition)s\" ni veljaven Python izraz za prožilnik "
+"\"%(trigger)s\"."
 
 msgctxt "error:ir.ui.menu:"
 msgid "\"%s\" is not a valid menu name because it is not allowed to contain \" / \"."
-msgstr ""
+msgstr "\"%s\" ni veljaven naziv menija, ker ne sme vsebovati znaka \" / \"."
 
 msgctxt "error:ir.ui.view:"
 msgid "Invalid XML for view \"%s\"."
-msgstr ""
+msgstr "Neveljaven XML za pogled \"%s\"."
 
 msgctxt "error:not_found_in_selection:"
 msgid "Key %r not found in selection field %r"
-msgstr "Sleutel %r niet gevonden in selectie veld %r"
+msgstr "Ključa %r ni možno najti v izbirnem polju %r"
 
 msgctxt "error:read_error:"
 msgid ""
 "You try to read records that don't exist anymore!\n"
 "(Document type: %s)"
 msgstr ""
-"U probeert items te lezen die niet meer bestaan!\n"
-"(Document type: %s)"
+"Poskušate brati zapise, ki ne obstajajo več.\n"
+"(Vrsta dokumenta: %s)"
 
 msgctxt "error:read_error:"
 msgid ""
 "You try to read records that don't exist anymore.\n"
 "(Document type: %s)"
 msgstr ""
+"Poskus branja neobstoječih zapisov.\n"
+"(Vrsta dokumenta: %s)"
 
 msgctxt "error:recursion_error:"
 msgid ""
 "Recursion error: Record \"%(rec_name)s\" with parent \"%(parent_rec_name)s\""
 " was configured as ancestor of itself."
 msgstr ""
+"Napaka rekurzije: Zapis \"%(rec_name)s\" z matičnim zapisom "
+"\"%(parent_rec_name)s\" je imel predhodnika samega sebe."
 
 msgctxt "error:reference_syntax_error:"
 msgid "Syntax error for reference %r in %s"
-msgstr "Foutieve verwijzing voor %r in %s"
+msgstr "Sintaktična napaka za referenco %r v %s"
 
 msgctxt "error:relation_not_found:"
 msgid "Relation not found: %r in %s"
-msgstr "Relatie niet gevonden: %r in %s"
+msgstr "Veze ni možno najti: %r v %s"
 
 msgctxt "error:required_field:"
 msgid "The field \"%s\" on \"%s\" is required."
-msgstr "Het veld \"%s\" in \"%s\" is vereist."
+msgstr "Polje \"%s\" v \"%s\" je obvezno."
 
 msgctxt "error:required_validation_record:"
 msgid "The field \"%s\" on \"%s\" is required."
-msgstr "Het veld \"%s\" in \"%s\" is vereist."
+msgstr "Polje \"%s\" v \"%s\" je obvezno."
 
 msgctxt "error:search_function_missing:"
 msgid "Missing search function on field \"%s\"."
-msgstr "Zoekfunctie ontbreekt voor veld \" %s\"."
+msgstr "Manjka funkcija iskanja pri polju \"%s\"."
 
 msgctxt "error:selection_validation_record:"
 msgid "The field \"%s\" on \"%s\" is not in the selection."
-msgstr ""
+msgstr "Polje \"%s\" pri \"%s\" ni v izboru."
 
 msgctxt "error:selection_value_notfound:"
 msgid "Value not in the selection for field \"%s\"."
-msgstr ""
+msgstr "Vrednost za polje \"%s\" ni v izboru."
 
 msgctxt "error:size_validation_record:"
 msgid "The field \"%s\" on \"%s\" is too long."
-msgstr "Veld \"%s\" op \"%s\" is te lang."
+msgstr "Polje \"%s\" v \"%s\" je predolgo."
 
 msgctxt "error:time_format_validation_record:"
 msgid "The time value of field \"%s\" on \"%s\" is not valid."
-msgstr ""
+msgstr "Časovna vrednost v polju \"%s\" pri \"%s\" je neveljavna."
 
 msgctxt "error:too_many_relations_found:"
 msgid "Too many relations found: %r in %s"
-msgstr "Te veel relaties gevonden: %r in %s"
+msgstr "Najdenih je preveč vez: %r v %s"
 
 msgctxt "error:write_error:"
 msgid ""
 "You try to write on records that don't exist anymore!\n"
 "(Document type: %s)"
 msgstr ""
-"U probeert items te muteren die niet meer bestaan!\n"
-"(Document type: %s)"
+"Poskušate zapisati zapise, ki ne obstajajo več.\n"
+"(Vrsta dokumenta: %s)"
 
 msgctxt "error:write_error:"
 msgid ""
 "You try to write on records that don't exist anymore.\n"
 "(Document type: %s)"
 msgstr ""
+"Poskus shranjevanja neobstoječih zapisov.\n"
+"(Vrsta dokumenta: %s)"
 
 msgctxt "error:write_xml_record:"
 msgid "You are not allowed to modify this record."
-msgstr "Het is u niet toegestaan dit item te muteren."
+msgstr "Za spreminjanje tega zapisa nimate dovoljenja."
 
 msgctxt "error:xml_id_syntax_error:"
 msgid "Syntax error for XML id %r in %s"
-msgstr "Foutieve verwijzing voor XML id %r in %s"
+msgstr "Sintaktična napaka za XML id %r v %s"
 
 msgctxt "error:xml_record_desc:"
 msgid "This record is part of the base configuration."
-msgstr "Dit item is onderdeel van de basis configuratie."
+msgstr "Ta zapis je del osnovnih nastavitev."
 
 msgctxt "field:ir.action,active:"
 msgid "Active"
-msgstr "Actief"
+msgstr "Aktivno"
 
 msgctxt "field:ir.action,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Ustvarjeno"
 
 msgctxt "field:ir.action,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Ustvaril"
 
 msgctxt "field:ir.action,groups:"
 msgid "Groups"
-msgstr "Groepen"
+msgstr "Skupine"
 
-#, fuzzy
 msgctxt "field:ir.action,icon:"
 msgid "Icon"
-msgstr "Icoon"
+msgstr "Ikona"
 
 msgctxt "field:ir.action,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:ir.action,keywords:"
 msgid "Keywords"
-msgstr "Trefwoorden"
+msgstr "Ključne besede"
 
 msgctxt "field:ir.action,name:"
 msgid "Name"
-msgstr "Naam"
+msgstr "Naziv"
 
 msgctxt "field:ir.action,rec_name:"
 msgid "Name"
-msgstr "Naam"
+msgstr "Ime"
 
 msgctxt "field:ir.action,type:"
 msgid "Type"
-msgstr "Type"
+msgstr "Vrsta"
 
 msgctxt "field:ir.action,usage:"
 msgid "Usage"
-msgstr "Gebruik"
+msgstr "Raba"
 
 msgctxt "field:ir.action,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Zapisano"
 
 msgctxt "field:ir.action,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Zapisal"
 
 msgctxt "field:ir.action.act_window,act_window_domains:"
 msgid "Domains"
-msgstr ""
+msgstr "Domene"
 
 msgctxt "field:ir.action.act_window,act_window_views:"
 msgid "Views"
-msgstr "Aanzichten"
+msgstr "Pogledi"
 
 msgctxt "field:ir.action.act_window,action:"
 msgid "Action"
-msgstr "Actie"
+msgstr "Ukrep"
 
-#, fuzzy
 msgctxt "field:ir.action.act_window,active:"
 msgid "Active"
-msgstr "Actief"
+msgstr "Aktivno"
 
 msgctxt "field:ir.action.act_window,auto_refresh:"
 msgid "Auto-Refresh"
-msgstr "Automatisch verversen"
+msgstr "Samodejna osvežitev"
 
 msgctxt "field:ir.action.act_window,context:"
 msgid "Context Value"
-msgstr "Samenhang waarde"
+msgstr "Vrednost konteksta"
 
 msgctxt "field:ir.action.act_window,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Ustvarjeno"
 
 msgctxt "field:ir.action.act_window,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Ustvaril"
 
 msgctxt "field:ir.action.act_window,domain:"
 msgid "Domain Value"
-msgstr "Domein waarde"
+msgstr "Domena"
 
 msgctxt "field:ir.action.act_window,domains:"
 msgid "Domains"
-msgstr ""
+msgstr "Domene"
 
-#, fuzzy
 msgctxt "field:ir.action.act_window,groups:"
 msgid "Groups"
-msgstr "Groepen"
+msgstr "Skupine"
 
-#, fuzzy
 msgctxt "field:ir.action.act_window,icon:"
 msgid "Icon"
-msgstr "Icoon"
+msgstr "Ikona"
 
 msgctxt "field:ir.action.act_window,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
-#, fuzzy
 msgctxt "field:ir.action.act_window,keywords:"
 msgid "Keywords"
-msgstr "Trefwoorden"
+msgstr "Ključne besede"
 
 msgctxt "field:ir.action.act_window,limit:"
 msgid "Limit"
-msgstr "Begrenzing"
+msgstr "Omejitev"
 
-#, fuzzy
 msgctxt "field:ir.action.act_window,name:"
 msgid "Name"
-msgstr "Naam bijlage"
+msgstr "Naziv"
+
+msgctxt "field:ir.action.act_window,order:"
+msgid "Order Value"
+msgstr "Razvrstitev"
 
 msgctxt "field:ir.action.act_window,pyson_context:"
 msgid "PySON Context"
-msgstr "PySON verband"
+msgstr "PySON kontekst"
 
 msgctxt "field:ir.action.act_window,pyson_domain:"
 msgid "PySON Domain"
-msgstr "PySON domein"
+msgstr "PySON domena"
+
+msgctxt "field:ir.action.act_window,pyson_order:"
+msgid "PySON Order"
+msgstr "PySON razvrstitev"
 
 msgctxt "field:ir.action.act_window,pyson_search_value:"
 msgid "PySON Search Criteria"
-msgstr "PySON zoekargument"
+msgstr "PySON kriterij iskanja"
 
 msgctxt "field:ir.action.act_window,rec_name:"
 msgid "Name"
-msgstr "Naam"
+msgstr "Ime"
 
 msgctxt "field:ir.action.act_window,res_model:"
 msgid "Model"
@@ -475,144 +497,135 @@ msgstr "Model"
 
 msgctxt "field:ir.action.act_window,search_value:"
 msgid "Search Criteria"
-msgstr "Zoekargumenten"
+msgstr "Kriterij iskanja"
 
-#, fuzzy
 msgctxt "field:ir.action.act_window,type:"
 msgid "Type"
-msgstr "Type"
+msgstr "Tip"
 
-#, fuzzy
 msgctxt "field:ir.action.act_window,usage:"
 msgid "Usage"
-msgstr "Gebruik"
+msgstr "Raba"
 
 msgctxt "field:ir.action.act_window,views:"
 msgid "Views"
-msgstr "Aanzichten"
+msgstr "Pogledi"
 
 msgctxt "field:ir.action.act_window,window_name:"
 msgid "Window Name"
-msgstr "Aanzicht naam"
+msgstr "Ime okna"
 
 msgctxt "field:ir.action.act_window,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Zapisano"
 
 msgctxt "field:ir.action.act_window,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Zapisal"
 
-#, fuzzy
 msgctxt "field:ir.action.act_window.domain,act_window:"
 msgid "Action"
-msgstr "Actie"
+msgstr "Ukrep"
 
-#, fuzzy
 msgctxt "field:ir.action.act_window.domain,active:"
 msgid "Active"
-msgstr "Actief"
+msgstr "Aktivno"
 
 msgctxt "field:ir.action.act_window.domain,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Ustvarjeno"
 
 msgctxt "field:ir.action.act_window.domain,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Ustvaril"
 
-#, fuzzy
 msgctxt "field:ir.action.act_window.domain,domain:"
 msgid "Domain"
-msgstr "Domein"
+msgstr "Domena"
 
 msgctxt "field:ir.action.act_window.domain,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
-#, fuzzy
 msgctxt "field:ir.action.act_window.domain,name:"
 msgid "Name"
-msgstr "Naam bijlage"
+msgstr "Naziv"
 
-#, fuzzy
 msgctxt "field:ir.action.act_window.domain,rec_name:"
 msgid "Name"
-msgstr "Naam bijlage"
+msgstr "Ime"
 
-#, fuzzy
 msgctxt "field:ir.action.act_window.domain,sequence:"
 msgid "Sequence"
-msgstr "Reeks"
+msgstr "Zap.št."
 
 msgctxt "field:ir.action.act_window.domain,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Zapisano"
 
 msgctxt "field:ir.action.act_window.domain,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Zapisal"
 
 msgctxt "field:ir.action.act_window.view,act_window:"
 msgid "Action"
-msgstr "Actie"
+msgstr "Ukrep"
 
 msgctxt "field:ir.action.act_window.view,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Ustvarjeno"
 
 msgctxt "field:ir.action.act_window.view,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Ustvaril"
 
 msgctxt "field:ir.action.act_window.view,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:ir.action.act_window.view,rec_name:"
 msgid "Name"
-msgstr "Naam"
+msgstr "Ime"
 
 msgctxt "field:ir.action.act_window.view,sequence:"
 msgid "Sequence"
-msgstr "Reeks"
+msgstr "Zap.št."
 
 msgctxt "field:ir.action.act_window.view,view:"
 msgid "View"
-msgstr "Overzicht"
+msgstr "Pogled"
 
 msgctxt "field:ir.action.act_window.view,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Zapisano"
 
 msgctxt "field:ir.action.act_window.view,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Zapisal"
 
 msgctxt "field:ir.action.keyword,action:"
 msgid "Action"
-msgstr "Actie"
+msgstr "Ukrep"
 
 msgctxt "field:ir.action.keyword,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Ustvarjeno"
 
 msgctxt "field:ir.action.keyword,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Ustvaril"
 
-#, fuzzy
 msgctxt "field:ir.action.keyword,groups:"
 msgid "Groups"
-msgstr "Groepen"
+msgstr "Skupine"
 
 msgctxt "field:ir.action.keyword,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:ir.action.keyword,keyword:"
 msgid "Keyword"
-msgstr "Trefwoord"
+msgstr "Ključna beseda"
 
 msgctxt "field:ir.action.keyword,model:"
 msgid "Model"
@@ -620,63 +633,59 @@ msgstr "Model"
 
 msgctxt "field:ir.action.keyword,rec_name:"
 msgid "Name"
-msgstr "Naam"
+msgstr "Ime"
 
 msgctxt "field:ir.action.keyword,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Zapisano"
 
 msgctxt "field:ir.action.keyword,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Zapisal"
 
 msgctxt "field:ir.action.report,action:"
 msgid "Action"
-msgstr "Actie"
+msgstr "Ukrep"
 
-#, fuzzy
 msgctxt "field:ir.action.report,active:"
 msgid "Active"
-msgstr "Actief"
+msgstr "Aktivno"
 
 msgctxt "field:ir.action.report,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Ustvarjeno"
 
 msgctxt "field:ir.action.report,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Ustvaril"
 
 msgctxt "field:ir.action.report,direct_print:"
 msgid "Direct Print"
-msgstr "Direct afdrukken"
+msgstr "Neposreden tisk"
 
 msgctxt "field:ir.action.report,email:"
 msgid "Email"
-msgstr "E-mail"
+msgstr "E-pošta"
 
 msgctxt "field:ir.action.report,extension:"
 msgid "Extension"
-msgstr "Uitbreiding"
+msgstr "Končnica"
 
-#, fuzzy
 msgctxt "field:ir.action.report,groups:"
 msgid "Groups"
-msgstr "Groepen"
+msgstr "Skupine"
 
-#, fuzzy
 msgctxt "field:ir.action.report,icon:"
 msgid "Icon"
-msgstr "Icoon"
+msgstr "Ikona"
 
 msgctxt "field:ir.action.report,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
-#, fuzzy
 msgctxt "field:ir.action.report,keywords:"
 msgid "Keywords"
-msgstr "Trefwoorden"
+msgstr "Ključne besede"
 
 msgctxt "field:ir.action.report,model:"
 msgid "Model"
@@ -684,380 +693,359 @@ msgstr "Model"
 
 msgctxt "field:ir.action.report,module:"
 msgid "Module"
-msgstr "Module"
+msgstr "Modul"
 
-#, fuzzy
 msgctxt "field:ir.action.report,name:"
 msgid "Name"
-msgstr "Naam bijlage"
+msgstr "Naziv"
 
 msgctxt "field:ir.action.report,pyson_email:"
 msgid "PySON Email"
-msgstr ""
+msgstr "PySON e-pošta"
 
 msgctxt "field:ir.action.report,rec_name:"
 msgid "Name"
-msgstr "Naam"
+msgstr "Ime"
 
 msgctxt "field:ir.action.report,report:"
 msgid "Path"
-msgstr "Pad"
+msgstr "Pot"
 
 msgctxt "field:ir.action.report,report_content:"
 msgid "Content"
-msgstr "Inhoud"
+msgstr "Vsebina"
 
-#, fuzzy
 msgctxt "field:ir.action.report,report_content_custom:"
 msgid "Content"
-msgstr "Inhoud"
+msgstr "Vsebina"
 
 msgctxt "field:ir.action.report,report_name:"
 msgid "Internal Name"
-msgstr "Interne naam"
+msgstr "Interni naziv"
 
 msgctxt "field:ir.action.report,style:"
 msgid "Style"
-msgstr "Stijl"
+msgstr "Slog"
 
 msgctxt "field:ir.action.report,style_content:"
 msgid "Style"
-msgstr "Stijl"
+msgstr "Slog"
 
 msgctxt "field:ir.action.report,template_extension:"
 msgid "Template Extension"
-msgstr ""
+msgstr "Končnica predloge"
 
-#, fuzzy
 msgctxt "field:ir.action.report,type:"
 msgid "Type"
-msgstr "Type"
+msgstr "Tip"
 
-#, fuzzy
 msgctxt "field:ir.action.report,usage:"
 msgid "Usage"
-msgstr "Gebruik"
+msgstr "Raba"
 
 msgctxt "field:ir.action.report,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Zapisano"
 
 msgctxt "field:ir.action.report,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Zapisal"
 
 msgctxt "field:ir.action.url,action:"
 msgid "Action"
-msgstr "Actie"
+msgstr "Ukrep"
 
-#, fuzzy
 msgctxt "field:ir.action.url,active:"
 msgid "Active"
-msgstr "Actief"
+msgstr "Aktivno"
 
 msgctxt "field:ir.action.url,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Ustvarjeno"
 
 msgctxt "field:ir.action.url,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Ustvaril"
 
-#, fuzzy
 msgctxt "field:ir.action.url,groups:"
 msgid "Groups"
-msgstr "Groepen"
+msgstr "Skupine"
 
-#, fuzzy
 msgctxt "field:ir.action.url,icon:"
 msgid "Icon"
-msgstr "Icoon"
+msgstr "Ikona"
 
 msgctxt "field:ir.action.url,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
-#, fuzzy
 msgctxt "field:ir.action.url,keywords:"
 msgid "Keywords"
-msgstr "Trefwoorden"
+msgstr "Ključne besede"
 
-#, fuzzy
 msgctxt "field:ir.action.url,name:"
 msgid "Name"
-msgstr "Naam bijlage"
+msgstr "Naziv"
 
 msgctxt "field:ir.action.url,rec_name:"
 msgid "Name"
-msgstr "Naam"
+msgstr "Ime"
 
-#, fuzzy
 msgctxt "field:ir.action.url,type:"
 msgid "Type"
-msgstr "Type"
+msgstr "Tip"
 
 msgctxt "field:ir.action.url,url:"
 msgid "Action Url"
-msgstr "Actie URL"
+msgstr "URL ukrepa"
 
-#, fuzzy
 msgctxt "field:ir.action.url,usage:"
 msgid "Usage"
-msgstr "Gebruik"
+msgstr "Raba"
 
 msgctxt "field:ir.action.url,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Zapisano"
 
 msgctxt "field:ir.action.url,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Zapisal"
 
 msgctxt "field:ir.action.wizard,action:"
 msgid "Action"
-msgstr "Actie"
+msgstr "Ukrep"
 
-#, fuzzy
 msgctxt "field:ir.action.wizard,active:"
 msgid "Active"
-msgstr "Actief"
+msgstr "Aktivno"
 
 msgctxt "field:ir.action.wizard,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Ustvarjeno"
 
 msgctxt "field:ir.action.wizard,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Ustvaril"
 
 msgctxt "field:ir.action.wizard,email:"
 msgid "Email"
-msgstr "E-mail"
+msgstr "E-pošta"
 
-#, fuzzy
 msgctxt "field:ir.action.wizard,groups:"
 msgid "Groups"
-msgstr "Groepen"
+msgstr "Skupine"
 
-#, fuzzy
 msgctxt "field:ir.action.wizard,icon:"
 msgid "Icon"
-msgstr "Icoon"
+msgstr "Ikona"
 
 msgctxt "field:ir.action.wizard,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
-#, fuzzy
 msgctxt "field:ir.action.wizard,keywords:"
 msgid "Keywords"
-msgstr "Trefwoorden"
+msgstr "Ključne besede"
 
 msgctxt "field:ir.action.wizard,model:"
 msgid "Model"
 msgstr "Model"
 
-#, fuzzy
 msgctxt "field:ir.action.wizard,name:"
 msgid "Name"
-msgstr "Naam bijlage"
+msgstr "Naziv"
 
 msgctxt "field:ir.action.wizard,rec_name:"
 msgid "Name"
-msgstr "Naam"
+msgstr "Ime"
 
-#, fuzzy
 msgctxt "field:ir.action.wizard,type:"
 msgid "Type"
-msgstr "Type"
+msgstr "Tip"
 
-#, fuzzy
 msgctxt "field:ir.action.wizard,usage:"
 msgid "Usage"
-msgstr "Gebruik"
+msgstr "Raba"
 
 msgctxt "field:ir.action.wizard,window:"
 msgid "Window"
-msgstr "Scherm"
+msgstr "Okno"
 
 msgctxt "field:ir.action.wizard,wiz_name:"
 msgid "Wizard name"
-msgstr "Assistent naam"
+msgstr "Ime okna"
 
 msgctxt "field:ir.action.wizard,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Zapisano"
 
 msgctxt "field:ir.action.wizard,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Zapisal"
 
 msgctxt "field:ir.attachment,collision:"
 msgid "Collision"
-msgstr "Botsing"
+msgstr "Prekrivanje"
 
 msgctxt "field:ir.attachment,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Ustvarjeno"
 
 msgctxt "field:ir.attachment,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Ustvaril"
 
 msgctxt "field:ir.attachment,data:"
 msgid "Data"
-msgstr ""
+msgstr "Podatki"
 
 msgctxt "field:ir.attachment,data_size:"
 msgid "Data size"
-msgstr ""
+msgstr "Velikost podatkov"
 
 msgctxt "field:ir.attachment,description:"
 msgid "Description"
-msgstr "Omschrijving"
+msgstr "Opis"
 
 msgctxt "field:ir.attachment,digest:"
 msgid "Digest"
-msgstr "Verwerken"
+msgstr "Izvleček"
 
 msgctxt "field:ir.attachment,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:ir.attachment,last_modification:"
 msgid "Last Modification"
-msgstr ""
+msgstr "Zadnja sprememba"
 
 msgctxt "field:ir.attachment,last_user:"
 msgid "Last User"
-msgstr ""
+msgstr "Zadnji uporabnik"
 
 msgctxt "field:ir.attachment,link:"
 msgid "Link"
-msgstr "Verbinding"
+msgstr "Povezava"
 
-#, fuzzy
 msgctxt "field:ir.attachment,name:"
 msgid "Name"
-msgstr "Naam bijlage"
+msgstr "Naziv"
 
 msgctxt "field:ir.attachment,rec_name:"
 msgid "Name"
-msgstr "Naam"
+msgstr "Ime"
 
 msgctxt "field:ir.attachment,resource:"
 msgid "Resource"
-msgstr "Middel"
+msgstr "Vir"
 
 msgctxt "field:ir.attachment,summary:"
 msgid "Summary"
-msgstr ""
+msgstr "Povzetek"
 
-#, fuzzy
 msgctxt "field:ir.attachment,type:"
 msgid "Type"
-msgstr "Type"
+msgstr "Vrsta"
 
 msgctxt "field:ir.attachment,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Zapisano"
 
 msgctxt "field:ir.attachment,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Zapisal"
 
 msgctxt "field:ir.cache,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Ustvarjeno"
 
 msgctxt "field:ir.cache,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Ustvaril"
 
 msgctxt "field:ir.cache,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:ir.cache,name:"
 msgid "Name"
-msgstr "Naam"
+msgstr "Naziv"
 
 msgctxt "field:ir.cache,rec_name:"
 msgid "Name"
-msgstr "Naam"
+msgstr "Ime"
 
 msgctxt "field:ir.cache,timestamp:"
 msgid "Timestamp"
-msgstr "Tijdmarkering"
+msgstr "Časovni žig"
 
 msgctxt "field:ir.cache,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Zapisano"
 
 msgctxt "field:ir.cache,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Zapisal"
 
 msgctxt "field:ir.configuration,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Ustvarjeno"
 
 msgctxt "field:ir.configuration,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Ustvaril"
 
 msgctxt "field:ir.configuration,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:ir.configuration,language:"
 msgid "language"
-msgstr ""
+msgstr "Jezik"
 
-#, fuzzy
 msgctxt "field:ir.configuration,rec_name:"
 msgid "Name"
-msgstr "Naam bijlage"
+msgstr "Ime"
 
 msgctxt "field:ir.configuration,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Zapisano"
 
 msgctxt "field:ir.configuration,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Zapisal"
 
 msgctxt "field:ir.cron,active:"
 msgid "Active"
-msgstr "Actief"
+msgstr "Aktivno"
 
 msgctxt "field:ir.cron,args:"
 msgid "Arguments"
-msgstr "Argumenten"
+msgstr "Argumenti"
 
 msgctxt "field:ir.cron,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Ustvarjeno"
 
 msgctxt "field:ir.cron,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Ustvaril"
 
 msgctxt "field:ir.cron,function:"
 msgid "Function"
-msgstr "Functie"
+msgstr "Funkcija"
 
 msgctxt "field:ir.cron,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:ir.cron,interval_number:"
 msgid "Interval Number"
-msgstr "Interval nummer"
+msgstr "Število intervalov"
 
 msgctxt "field:ir.cron,interval_type:"
 msgid "Interval Unit"
-msgstr "Interval eenheid"
+msgstr "Enota intervala"
 
 msgctxt "field:ir.cron,model:"
 msgid "Model"
@@ -1065,127 +1053,127 @@ msgstr "Model"
 
 msgctxt "field:ir.cron,name:"
 msgid "Name"
-msgstr "Naam"
+msgstr "Naziv"
 
 msgctxt "field:ir.cron,next_call:"
 msgid "Next Call"
-msgstr ""
+msgstr "Naslednji zagon"
 
 msgctxt "field:ir.cron,number_calls:"
 msgid "Number of Calls"
-msgstr ""
+msgstr "Število zagonov"
 
 msgctxt "field:ir.cron,rec_name:"
 msgid "Name"
-msgstr "Naam"
+msgstr "Ime"
 
 msgctxt "field:ir.cron,repeat_missed:"
 msgid "Repeat Missed"
-msgstr ""
+msgstr "Ponovi zgrešene"
 
 msgctxt "field:ir.cron,request_user:"
 msgid "Request User"
-msgstr "Verzoek gebruiker"
+msgstr "Zahteval"
 
 msgctxt "field:ir.cron,user:"
 msgid "Execution User"
-msgstr "Uitvoerende gebruiker"
+msgstr "Zaganja"
 
 msgctxt "field:ir.cron,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Zapisano"
 
 msgctxt "field:ir.cron,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Zapisal"
 
 msgctxt "field:ir.date,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:ir.export,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Ustvarjeno"
 
 msgctxt "field:ir.export,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Ustvaril"
 
 msgctxt "field:ir.export,export_fields:"
 msgid "Fields"
-msgstr "Velden"
+msgstr "Polja"
 
 msgctxt "field:ir.export,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:ir.export,name:"
 msgid "Name"
-msgstr "Naam"
+msgstr "Naziv"
 
 msgctxt "field:ir.export,rec_name:"
 msgid "Name"
-msgstr "Naam"
+msgstr "Ime"
 
 msgctxt "field:ir.export,resource:"
 msgid "Resource"
-msgstr "Middel"
+msgstr "Vir"
 
 msgctxt "field:ir.export,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Zapisano"
 
 msgctxt "field:ir.export,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Zapisal"
 
 msgctxt "field:ir.export.line,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Ustvarjeno"
 
 msgctxt "field:ir.export.line,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Ustvaril"
 
 msgctxt "field:ir.export.line,export:"
 msgid "Export"
-msgstr "Exporteren"
+msgstr "Izvoz"
 
 msgctxt "field:ir.export.line,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:ir.export.line,name:"
 msgid "Name"
-msgstr "Naam"
+msgstr "Naziv"
 
 msgctxt "field:ir.export.line,rec_name:"
 msgid "Name"
-msgstr "Naam"
+msgstr "Ime"
 
 msgctxt "field:ir.export.line,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Zapisano"
 
 msgctxt "field:ir.export.line,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Zapisal"
 
 msgctxt "field:ir.lang,active:"
 msgid "Active"
-msgstr "Actief"
+msgstr "Aktivno"
 
 msgctxt "field:ir.lang,code:"
 msgid "Code"
-msgstr "Code"
+msgstr "Šifra"
 
 msgctxt "field:ir.lang,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Ustvarjeno"
 
 msgctxt "field:ir.lang,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Ustvaril"
 
 msgctxt "field:ir.lang,date:"
 msgid "Date"
@@ -1193,111 +1181,111 @@ msgstr "Datum"
 
 msgctxt "field:ir.lang,decimal_point:"
 msgid "Decimal Separator"
-msgstr "Decimaalteken"
+msgstr "Decimalna vejica"
 
 msgctxt "field:ir.lang,direction:"
 msgid "Direction"
-msgstr "Richting"
+msgstr "Smer"
 
 msgctxt "field:ir.lang,grouping:"
 msgid "Grouping"
-msgstr "Groeperen"
+msgstr "Združevanje"
 
 msgctxt "field:ir.lang,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:ir.lang,name:"
 msgid "Name"
-msgstr "Naam"
+msgstr "Naziv"
 
 msgctxt "field:ir.lang,rec_name:"
 msgid "Name"
-msgstr "Naam"
+msgstr "Ime"
 
 msgctxt "field:ir.lang,thousands_sep:"
 msgid "Thousands Separator"
-msgstr "Duizendtal teken"
+msgstr "Ločevalec tisočic"
 
 msgctxt "field:ir.lang,translatable:"
 msgid "Translatable"
-msgstr "Vertaalbaar"
+msgstr "Prevedljivo"
 
 msgctxt "field:ir.lang,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Zapisano"
 
 msgctxt "field:ir.lang,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Zapisal"
 
 msgctxt "field:ir.model,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Ustvarjeno"
 
 msgctxt "field:ir.model,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Ustvaril"
 
 msgctxt "field:ir.model,fields:"
 msgid "Fields"
-msgstr "Velden"
+msgstr "Polja"
 
 msgctxt "field:ir.model,global_search_p:"
 msgid "Global Search"
-msgstr ""
+msgstr "Globalno iskanje"
 
 msgctxt "field:ir.model,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:ir.model,info:"
 msgid "Information"
-msgstr "Informatie"
+msgstr "Informacije"
 
 msgctxt "field:ir.model,model:"
 msgid "Model Name"
-msgstr "Naam module"
+msgstr "Ime modela"
 
 msgctxt "field:ir.model,module:"
 msgid "Module"
-msgstr "Module"
+msgstr "Modul"
 
 msgctxt "field:ir.model,name:"
 msgid "Model Description"
-msgstr "Model omschrijving"
+msgstr "Opis modela"
 
 msgctxt "field:ir.model,rec_name:"
 msgid "Name"
-msgstr "Naam"
+msgstr "Ime"
 
 msgctxt "field:ir.model,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Zapisano"
 
 msgctxt "field:ir.model,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Zapisal"
 
 msgctxt "field:ir.model.access,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Ustvarjeno"
 
 msgctxt "field:ir.model.access,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Ustvaril"
 
 msgctxt "field:ir.model.access,description:"
 msgid "Description"
-msgstr "Omschrijving"
+msgstr "Opis"
 
 msgctxt "field:ir.model.access,group:"
 msgid "Group"
-msgstr "Groep"
+msgstr "Skupina"
 
 msgctxt "field:ir.model.access,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:ir.model.access,model:"
 msgid "Model"
@@ -1305,99 +1293,95 @@ msgstr "Model"
 
 msgctxt "field:ir.model.access,perm_create:"
 msgid "Create Access"
-msgstr "Mag aanmaken"
+msgstr "Ustvarjanje"
 
 msgctxt "field:ir.model.access,perm_delete:"
 msgid "Delete Access"
-msgstr "Toegang verwijderen"
+msgstr "Brisanje"
 
 msgctxt "field:ir.model.access,perm_read:"
 msgid "Read Access"
-msgstr "Leesrecht"
+msgstr "Branje"
 
 msgctxt "field:ir.model.access,perm_write:"
 msgid "Write Access"
-msgstr "Schrijfrecht"
+msgstr "Pisanje"
 
 msgctxt "field:ir.model.access,rec_name:"
 msgid "Name"
-msgstr "Naam"
+msgstr "Ime"
 
 msgctxt "field:ir.model.access,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Zapisano"
 
 msgctxt "field:ir.model.access,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Zapisal"
 
 msgctxt "field:ir.model.button,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Ustvarjeno"
 
 msgctxt "field:ir.model.button,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Ustvaril"
 
-#, fuzzy
 msgctxt "field:ir.model.button,groups:"
 msgid "Groups"
-msgstr "Groepen"
+msgstr "Skupine"
 
 msgctxt "field:ir.model.button,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
-#, fuzzy
 msgctxt "field:ir.model.button,model:"
 msgid "Model"
 msgstr "Model"
 
-#, fuzzy
 msgctxt "field:ir.model.button,name:"
 msgid "Name"
-msgstr "Naam bijlage"
+msgstr "Naziv"
 
-#, fuzzy
 msgctxt "field:ir.model.button,rec_name:"
 msgid "Name"
-msgstr "Naam bijlage"
+msgstr "Ime"
 
 msgctxt "field:ir.model.button,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Zapisano"
 
 msgctxt "field:ir.model.button,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Zapisal"
 
 msgctxt "field:ir.model.data,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Ustvarjeno"
 
 msgctxt "field:ir.model.data,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Ustvaril"
 
 msgctxt "field:ir.model.data,date_init:"
 msgid "Init Date"
-msgstr "Datum aanmaken"
+msgstr "Začetni datum"
 
 msgctxt "field:ir.model.data,date_update:"
 msgid "Update Date"
-msgstr "Datum bijgewerkt"
+msgstr "Datum posodobitve"
 
 msgctxt "field:ir.model.data,db_id:"
 msgid "Resource ID"
-msgstr "Middel ID"
+msgstr "ID vira"
 
 msgctxt "field:ir.model.data,fs_id:"
 msgid "Identifier on File System"
-msgstr "Kenmerk voor bestandssysteem"
+msgstr "Identifikator v datotečnem sistemu"
 
 msgctxt "field:ir.model.data,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:ir.model.data,model:"
 msgid "Model"
@@ -1405,51 +1389,51 @@ msgstr "Model"
 
 msgctxt "field:ir.model.data,module:"
 msgid "Module"
-msgstr "Module"
+msgstr "Modul"
 
 msgctxt "field:ir.model.data,noupdate:"
 msgid "No Update"
-msgstr "Niet bij te werken"
+msgstr "Brez posodabljanja"
 
 msgctxt "field:ir.model.data,rec_name:"
 msgid "Name"
-msgstr "Naam"
+msgstr "Ime"
 
 msgctxt "field:ir.model.data,values:"
 msgid "Values"
-msgstr "Waarden"
+msgstr "Vrednosti"
 
 msgctxt "field:ir.model.data,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Zapisano"
 
 msgctxt "field:ir.model.data,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Zapisal"
 
 msgctxt "field:ir.model.field,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Ustvarjeno"
 
 msgctxt "field:ir.model.field,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Ustvaril"
 
 msgctxt "field:ir.model.field,field_description:"
 msgid "Field Description"
-msgstr "Veld omschrijving"
+msgstr "Opis polja"
 
 msgctxt "field:ir.model.field,groups:"
 msgid "Groups"
-msgstr "Groepen"
+msgstr "Skupine"
 
 msgctxt "field:ir.model.field,help:"
 msgid "Help"
-msgstr "Help"
+msgstr "Pomoč"
 
 msgctxt "field:ir.model.field,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:ir.model.field,model:"
 msgid "Model"
@@ -1457,342 +1441,331 @@ msgstr "Model"
 
 msgctxt "field:ir.model.field,module:"
 msgid "Module"
-msgstr "Module"
+msgstr "Modul"
 
 msgctxt "field:ir.model.field,name:"
 msgid "Name"
-msgstr "Naam"
+msgstr "Naziv"
 
 msgctxt "field:ir.model.field,rec_name:"
 msgid "Name"
-msgstr "Naam"
+msgstr "Ime"
 
 msgctxt "field:ir.model.field,relation:"
 msgid "Model Relation"
-msgstr "Model relatie"
+msgstr "Model veze"
 
 msgctxt "field:ir.model.field,ttype:"
 msgid "Field Type"
-msgstr "Veld type"
+msgstr "Vrsta polja"
 
 msgctxt "field:ir.model.field,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Zapisano"
 
 msgctxt "field:ir.model.field,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Zapisal"
 
 msgctxt "field:ir.model.field.access,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Ustvarjeno"
 
 msgctxt "field:ir.model.field.access,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Ustvaril"
 
-#, fuzzy
 msgctxt "field:ir.model.field.access,description:"
 msgid "Description"
-msgstr "Specificatie"
+msgstr "Opis"
 
-#, fuzzy
 msgctxt "field:ir.model.field.access,field:"
 msgid "Field"
-msgstr "Veld"
+msgstr "Polje"
 
-#, fuzzy
 msgctxt "field:ir.model.field.access,group:"
 msgid "Group"
-msgstr "Groep"
+msgstr "Skupina"
 
 msgctxt "field:ir.model.field.access,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
-#, fuzzy
 msgctxt "field:ir.model.field.access,perm_create:"
 msgid "Create Access"
-msgstr "Mag aanmaken"
+msgstr "Ustvarjanje"
 
-#, fuzzy
 msgctxt "field:ir.model.field.access,perm_delete:"
 msgid "Delete Access"
-msgstr "Toegang verwijderen"
+msgstr "Brisanje"
 
-#, fuzzy
 msgctxt "field:ir.model.field.access,perm_read:"
 msgid "Read Access"
-msgstr "Leesrecht"
+msgstr "Branje"
 
-#, fuzzy
 msgctxt "field:ir.model.field.access,perm_write:"
 msgid "Write Access"
-msgstr "Schrijfrecht"
+msgstr "Pisanje"
 
-#, fuzzy
 msgctxt "field:ir.model.field.access,rec_name:"
 msgid "Name"
-msgstr "Naam bijlage"
+msgstr "Ime"
 
 msgctxt "field:ir.model.field.access,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Zapisano"
 
 msgctxt "field:ir.model.field.access,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Zapisal"
 
 msgctxt "field:ir.model.print_model_graph.start,filter:"
 msgid "Filter"
-msgstr ""
+msgstr "Filter"
 
 msgctxt "field:ir.model.print_model_graph.start,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:ir.model.print_model_graph.start,level:"
 msgid "Level"
-msgstr ""
+msgstr "Nivo"
 
 msgctxt "field:ir.module.module,childs:"
 msgid "Childs"
-msgstr ""
+msgstr "Podmoduli"
 
 msgctxt "field:ir.module.module,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Ustvarjeno"
 
 msgctxt "field:ir.module.module,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Ustvaril"
 
 msgctxt "field:ir.module.module,dependencies:"
 msgid "Dependencies"
-msgstr "Afhankelijkheden"
+msgstr "Odvisnosti"
 
 msgctxt "field:ir.module.module,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:ir.module.module,name:"
 msgid "Name"
-msgstr "Naam"
+msgstr "Naziv"
 
 msgctxt "field:ir.module.module,parents:"
 msgid "Parents"
-msgstr ""
+msgstr "Matični moduli"
 
 msgctxt "field:ir.module.module,rec_name:"
 msgid "Name"
-msgstr "Naam"
+msgstr "Ime"
 
 msgctxt "field:ir.module.module,state:"
 msgid "State"
-msgstr "Status"
+msgstr "Stanje"
 
 msgctxt "field:ir.module.module,version:"
 msgid "Version"
-msgstr "Versie"
+msgstr "Verzija"
 
 msgctxt "field:ir.module.module,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Zapisano"
 
 msgctxt "field:ir.module.module,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Zapisal"
 
 msgctxt "field:ir.module.module.config_wizard.first,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
-#, fuzzy
 msgctxt "field:ir.module.module.config_wizard.item,action:"
 msgid "Action"
-msgstr "Actie"
+msgstr "Ukrep"
 
 msgctxt "field:ir.module.module.config_wizard.item,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Ustvarjeno"
 
 msgctxt "field:ir.module.module.config_wizard.item,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Ustvaril"
 
 msgctxt "field:ir.module.module.config_wizard.item,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:ir.module.module.config_wizard.item,rec_name:"
 msgid "Name"
-msgstr "Naam"
+msgstr "Ime"
 
 msgctxt "field:ir.module.module.config_wizard.item,sequence:"
 msgid "Sequence"
-msgstr "Reeks"
+msgstr "Zap.št."
 
 msgctxt "field:ir.module.module.config_wizard.item,state:"
 msgid "State"
-msgstr "Status"
+msgstr "Stanje"
 
 msgctxt "field:ir.module.module.config_wizard.item,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Zapisano"
 
 msgctxt "field:ir.module.module.config_wizard.item,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Zapisal"
 
 msgctxt "field:ir.module.module.config_wizard.other,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
-#, fuzzy
 msgctxt "field:ir.module.module.config_wizard.other,percentage:"
 msgid "Percentage"
-msgstr "Percentage"
+msgstr "Odstotek"
 
 msgctxt "field:ir.module.module.dependency,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Ustvarjeno"
 
 msgctxt "field:ir.module.module.dependency,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Ustvaril"
 
 msgctxt "field:ir.module.module.dependency,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:ir.module.module.dependency,module:"
 msgid "Module"
-msgstr "Module"
+msgstr "Modul"
 
 msgctxt "field:ir.module.module.dependency,name:"
 msgid "Name"
-msgstr "Naam"
+msgstr "Naziv"
 
 msgctxt "field:ir.module.module.dependency,rec_name:"
 msgid "Name"
-msgstr "Naam"
+msgstr "Ime"
 
 msgctxt "field:ir.module.module.dependency,state:"
 msgid "State"
-msgstr "Status"
+msgstr "Stanje"
 
 msgctxt "field:ir.module.module.dependency,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Zapisano"
 
 msgctxt "field:ir.module.module.dependency,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Zapisal"
 
 msgctxt "field:ir.module.module.install_upgrade.done,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:ir.module.module.install_upgrade.start,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:ir.module.module.install_upgrade.start,module_info:"
 msgid "Modules to update"
-msgstr ""
+msgstr "Moduli za posodobitev"
 
 msgctxt "field:ir.property,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Ustvarjeno"
 
 msgctxt "field:ir.property,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Ustvaril"
 
 msgctxt "field:ir.property,field:"
 msgid "Field"
-msgstr "Veld"
+msgstr "Polje"
 
 msgctxt "field:ir.property,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:ir.property,rec_name:"
 msgid "Name"
-msgstr "Naam"
+msgstr "Ime"
 
 msgctxt "field:ir.property,res:"
 msgid "Resource"
-msgstr "Middel"
+msgstr "Vir"
 
 msgctxt "field:ir.property,value:"
 msgid "Value"
-msgstr "Waarde"
+msgstr "Vrednost"
 
 msgctxt "field:ir.property,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Zapisano"
 
 msgctxt "field:ir.property,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Zapisal"
 
 msgctxt "field:ir.rule,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Ustvarjeno"
 
 msgctxt "field:ir.rule,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Ustvaril"
 
-#, fuzzy
 msgctxt "field:ir.rule,domain:"
 msgid "Domain"
-msgstr "Domein"
+msgstr "Domena"
 
 msgctxt "field:ir.rule,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:ir.rule,rec_name:"
 msgid "Name"
-msgstr "Naam"
+msgstr "Ime"
 
 msgctxt "field:ir.rule,rule_group:"
 msgid "Group"
-msgstr "Groep"
+msgstr "Skupina"
 
 msgctxt "field:ir.rule,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Zapisano"
 
 msgctxt "field:ir.rule,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Zapisal"
 
 msgctxt "field:ir.rule.group,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Ustvarjeno"
 
 msgctxt "field:ir.rule.group,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Ustvaril"
 
 msgctxt "field:ir.rule.group,default_p:"
 msgid "Default"
-msgstr "Standaard"
+msgstr "Privzeto"
 
 msgctxt "field:ir.rule.group,global_p:"
 msgid "Global"
-msgstr "Globaal"
+msgstr "Globalno"
 
 msgctxt "field:ir.rule.group,groups:"
 msgid "Groups"
-msgstr "Groepen"
+msgstr "Skupine"
 
 msgctxt "field:ir.rule.group,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:ir.rule.group,model:"
 msgid "Model"
@@ -1800,307 +1773,303 @@ msgstr "Model"
 
 msgctxt "field:ir.rule.group,name:"
 msgid "Name"
-msgstr "Naam"
+msgstr "Naziv"
 
 msgctxt "field:ir.rule.group,perm_create:"
 msgid "Create Access"
-msgstr "Mag aanmaken"
+msgstr "Ustvarjanje"
 
 msgctxt "field:ir.rule.group,perm_delete:"
 msgid "Delete Access"
-msgstr "Toegang verwijderen"
+msgstr " Brisanje"
 
 msgctxt "field:ir.rule.group,perm_read:"
 msgid "Read Access"
-msgstr "Leesrecht"
+msgstr "Branje"
 
 msgctxt "field:ir.rule.group,perm_write:"
 msgid "Write Access"
-msgstr "Schrijfrecht"
+msgstr "Pisanje"
 
 msgctxt "field:ir.rule.group,rec_name:"
 msgid "Name"
-msgstr "Naam"
+msgstr "Ime"
 
 msgctxt "field:ir.rule.group,rules:"
 msgid "Tests"
-msgstr "Testen"
+msgstr "Preizkusi"
 
 msgctxt "field:ir.rule.group,users:"
 msgid "Users"
-msgstr "Gebruikers"
+msgstr "Uporabniki"
 
 msgctxt "field:ir.rule.group,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Zapisano"
 
 msgctxt "field:ir.rule.group,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Zapisal"
 
 msgctxt "field:ir.sequence,active:"
 msgid "Active"
-msgstr "Actief"
+msgstr "Aktivno"
 
 msgctxt "field:ir.sequence,code:"
 msgid "Sequence Code"
-msgstr "Reeks code"
+msgstr "Šifra"
 
 msgctxt "field:ir.sequence,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Ustvarjeno"
 
 msgctxt "field:ir.sequence,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Ustvaril"
 
 msgctxt "field:ir.sequence,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:ir.sequence,last_timestamp:"
 msgid "Last Timestamp"
-msgstr "Laatste tijdmarkering"
+msgstr "Zadnji časovni žig"
 
 msgctxt "field:ir.sequence,name:"
 msgid "Sequence Name"
-msgstr "Reeks naam"
+msgstr "Naziv"
 
 msgctxt "field:ir.sequence,number_increment:"
 msgid "Increment Number"
-msgstr "Oplopende stap"
+msgstr "Prirastek"
 
 msgctxt "field:ir.sequence,number_next:"
 msgid "Next Number"
-msgstr "Volgende nummer"
+msgstr "Naslednja številka"
 
-#, fuzzy
 msgctxt "field:ir.sequence,number_next_internal:"
 msgid "Next Number"
-msgstr "Volgende nummer"
+msgstr "Naslednja številka"
 
 msgctxt "field:ir.sequence,padding:"
 msgid "Number padding"
-msgstr "Voorloopnullen"
+msgstr "Zapolnjevanje"
 
 msgctxt "field:ir.sequence,prefix:"
 msgid "Prefix"
-msgstr "Voorvoegsel"
+msgstr "Predpona"
 
 msgctxt "field:ir.sequence,rec_name:"
 msgid "Name"
-msgstr "Naam"
+msgstr "Ime"
 
 msgctxt "field:ir.sequence,suffix:"
 msgid "Suffix"
-msgstr "Toevoeging"
+msgstr "Pripona"
 
 msgctxt "field:ir.sequence,timestamp_offset:"
 msgid "Timestamp Offset"
-msgstr "Tijdmarkering verschuiving"
+msgstr "Odmik časovnega žiga"
 
 msgctxt "field:ir.sequence,timestamp_rounding:"
 msgid "Timestamp Rounding"
-msgstr "Tijdmarkering afronding"
+msgstr "Zaokroževanje časovnega žiga"
 
 msgctxt "field:ir.sequence,type:"
 msgid "Type"
-msgstr "Type"
+msgstr "Vrsta"
 
 msgctxt "field:ir.sequence,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Zapisano"
 
 msgctxt "field:ir.sequence,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Zapisal"
 
 msgctxt "field:ir.sequence.strict,active:"
 msgid "Active"
-msgstr "Actief"
+msgstr "Aktivno"
 
 msgctxt "field:ir.sequence.strict,code:"
 msgid "Sequence Code"
-msgstr "Reeks code"
+msgstr "Šifra"
 
 msgctxt "field:ir.sequence.strict,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Ustvarjeno"
 
 msgctxt "field:ir.sequence.strict,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Ustvaril"
 
 msgctxt "field:ir.sequence.strict,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:ir.sequence.strict,last_timestamp:"
 msgid "Last Timestamp"
-msgstr "Laatste tijdmarkering"
+msgstr "Zadnji časovni žig"
 
 msgctxt "field:ir.sequence.strict,name:"
 msgid "Sequence Name"
-msgstr "Reeks naam"
+msgstr "Naziv"
 
 msgctxt "field:ir.sequence.strict,number_increment:"
 msgid "Increment Number"
-msgstr "Oplopende stap"
+msgstr "Prirastek"
 
 msgctxt "field:ir.sequence.strict,number_next:"
 msgid "Next Number"
-msgstr "Volgende nummer"
+msgstr "Naslednja številka"
 
-#, fuzzy
 msgctxt "field:ir.sequence.strict,number_next_internal:"
 msgid "Next Number"
-msgstr "Volgende nummer"
+msgstr "Naslednja številka"
 
 msgctxt "field:ir.sequence.strict,padding:"
 msgid "Number padding"
-msgstr "Voorloopnullen"
+msgstr "Zapolnjevanje"
 
 msgctxt "field:ir.sequence.strict,prefix:"
 msgid "Prefix"
-msgstr "Voorvoegsel"
+msgstr "Predpona"
 
 msgctxt "field:ir.sequence.strict,rec_name:"
 msgid "Name"
-msgstr "Naam"
+msgstr "Ime"
 
 msgctxt "field:ir.sequence.strict,suffix:"
 msgid "Suffix"
-msgstr "Toevoeging"
+msgstr "Pripona"
 
 msgctxt "field:ir.sequence.strict,timestamp_offset:"
 msgid "Timestamp Offset"
-msgstr "Tijdmarkering verschuiving"
+msgstr "Odmik časovnega žiga"
 
 msgctxt "field:ir.sequence.strict,timestamp_rounding:"
 msgid "Timestamp Rounding"
-msgstr "Tijdmarkering afronding"
+msgstr "Zaokroževanje časovnega žiga"
 
 msgctxt "field:ir.sequence.strict,type:"
 msgid "Type"
-msgstr "Type"
+msgstr "Vrsta"
 
 msgctxt "field:ir.sequence.strict,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Zapisano"
 
 msgctxt "field:ir.sequence.strict,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Zapisal"
 
 msgctxt "field:ir.sequence.type,code:"
 msgid "Sequence Code"
-msgstr "Reeks code"
+msgstr "Šifra"
 
 msgctxt "field:ir.sequence.type,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Ustvarjeno"
 
 msgctxt "field:ir.sequence.type,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Ustvaril"
 
 msgctxt "field:ir.sequence.type,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:ir.sequence.type,name:"
 msgid "Sequence Name"
-msgstr "Reeks naam"
+msgstr "Naziv"
 
 msgctxt "field:ir.sequence.type,rec_name:"
 msgid "Name"
-msgstr "Naam"
+msgstr "Ime"
 
 msgctxt "field:ir.sequence.type,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Zapisano"
 
 msgctxt "field:ir.sequence.type,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Zapisal"
 
 msgctxt "field:ir.session,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Ustvarjeno"
 
 msgctxt "field:ir.session,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Ustvaril"
 
 msgctxt "field:ir.session,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:ir.session,key:"
 msgid "Key"
-msgstr ""
+msgstr "Ključ"
 
-#, fuzzy
 msgctxt "field:ir.session,rec_name:"
 msgid "Name"
-msgstr "Naam bijlage"
+msgstr "Ime"
 
 msgctxt "field:ir.session,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Zapisano"
 
 msgctxt "field:ir.session,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Zapisal"
 
 msgctxt "field:ir.session.wizard,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Ustvarjeno"
 
 msgctxt "field:ir.session.wizard,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Ustvaril"
 
 msgctxt "field:ir.session.wizard,data:"
 msgid "Data"
-msgstr ""
+msgstr "Podatki"
 
 msgctxt "field:ir.session.wizard,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
-#, fuzzy
 msgctxt "field:ir.session.wizard,rec_name:"
 msgid "Name"
-msgstr "Naam bijlage"
+msgstr "Ime"
 
 msgctxt "field:ir.session.wizard,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Zapisano"
 
 msgctxt "field:ir.session.wizard,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Zapisal"
 
 msgctxt "field:ir.translation,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Ustvarjeno"
 
 msgctxt "field:ir.translation,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Ustvaril"
 
 msgctxt "field:ir.translation,fuzzy:"
 msgid "Fuzzy"
-msgstr "Onzeker"
+msgstr "Nejasno"
 
 msgctxt "field:ir.translation,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:ir.translation,lang:"
 msgid "Language"
-msgstr "Taal"
+msgstr "Jezik"
 
 msgctxt "field:ir.translation,model:"
 msgid "Model"
@@ -2108,126 +2077,127 @@ msgstr "Model"
 
 msgctxt "field:ir.translation,module:"
 msgid "Module"
-msgstr "Module"
+msgstr "Modul"
 
 msgctxt "field:ir.translation,name:"
 msgid "Field Name"
-msgstr "Veldnaam"
+msgstr "Ime polja"
+
+msgctxt "field:ir.translation,overriding_module:"
+msgid "Overriding Module"
+msgstr "Razširjevalni modul"
 
 msgctxt "field:ir.translation,rec_name:"
 msgid "Name"
-msgstr "Naam"
+msgstr "Ime"
 
 msgctxt "field:ir.translation,res_id:"
 msgid "Resource ID"
-msgstr "Middel ID"
+msgstr "ID vira"
 
 msgctxt "field:ir.translation,src:"
 msgid "Source"
-msgstr "Bron"
+msgstr "Original"
 
 msgctxt "field:ir.translation,src_md5:"
 msgid "Source MD5"
-msgstr ""
+msgstr "MD5 izvora"
 
 msgctxt "field:ir.translation,type:"
 msgid "Type"
-msgstr "Type"
+msgstr "Vrsta"
 
 msgctxt "field:ir.translation,value:"
 msgid "Translation Value"
-msgstr "Vertaling"
+msgstr "Prevod"
 
 msgctxt "field:ir.translation,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Zapisano"
 
 msgctxt "field:ir.translation,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Zapisal"
 
 msgctxt "field:ir.translation.clean.start,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:ir.translation.clean.succeed,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:ir.translation.export.result,file:"
 msgid "File"
-msgstr ""
+msgstr "Datoteka"
 
 msgctxt "field:ir.translation.export.result,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:ir.translation.export.start,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
-#, fuzzy
 msgctxt "field:ir.translation.export.start,language:"
 msgid "Language"
-msgstr "Taal"
+msgstr "Jezik"
 
-#, fuzzy
 msgctxt "field:ir.translation.export.start,module:"
 msgid "Module"
-msgstr "Module"
+msgstr "Modul"
 
 msgctxt "field:ir.translation.set.start,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:ir.translation.set.succeed,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:ir.translation.update.start,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
-#, fuzzy
 msgctxt "field:ir.translation.update.start,language:"
 msgid "Language"
-msgstr "Taal"
+msgstr "Jezik"
 
 msgctxt "field:ir.trigger,action_function:"
 msgid "Action Function"
-msgstr "Actiefunctie"
+msgstr "Funkcija ukrepa"
 
 msgctxt "field:ir.trigger,action_model:"
 msgid "Action Model"
-msgstr "Actie model"
+msgstr "Model ukrepa"
 
 msgctxt "field:ir.trigger,active:"
 msgid "Active"
-msgstr "Actief"
+msgstr "Aktivno"
 
 msgctxt "field:ir.trigger,condition:"
 msgid "Condition"
-msgstr "Voorwaarde"
+msgstr "Pogoj"
 
 msgctxt "field:ir.trigger,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Ustvarjeno"
 
 msgctxt "field:ir.trigger,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Ustvaril"
 
 msgctxt "field:ir.trigger,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:ir.trigger,limit_number:"
 msgid "Limit Number"
-msgstr "Begrenzing nummer"
+msgstr "Število klicev"
 
 msgctxt "field:ir.trigger,minimum_delay:"
 msgid "Minimum Delay"
-msgstr "Minimum vertraging"
+msgstr "Minimalna zakasnitev"
 
 msgctxt "field:ir.trigger,model:"
 msgid "Model"
@@ -2235,252 +2205,243 @@ msgstr "Model"
 
 msgctxt "field:ir.trigger,name:"
 msgid "Name"
-msgstr "Naam"
+msgstr "Naziv"
 
 msgctxt "field:ir.trigger,on_create:"
 msgid "On Create"
-msgstr "Bij aanmaken"
+msgstr "Ob ustvarjanju"
 
 msgctxt "field:ir.trigger,on_delete:"
 msgid "On Delete"
-msgstr "Bij verwijderen"
+msgstr "Ob brisanju"
 
 msgctxt "field:ir.trigger,on_time:"
 msgid "On Time"
-msgstr "Op tijd"
+msgstr "Točno ob času"
 
 msgctxt "field:ir.trigger,on_write:"
 msgid "On Write"
-msgstr "Bij muteren"
+msgstr "Ob pisanju"
 
 msgctxt "field:ir.trigger,rec_name:"
 msgid "Name"
-msgstr "Naam"
+msgstr "Ime"
 
 msgctxt "field:ir.trigger,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Zapisano"
 
 msgctxt "field:ir.trigger,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Zapisal"
 
 msgctxt "field:ir.trigger.log,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Ustvarjeno"
 
 msgctxt "field:ir.trigger.log,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Ustvaril"
 
 msgctxt "field:ir.trigger.log,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:ir.trigger.log,rec_name:"
 msgid "Name"
-msgstr "Naam"
+msgstr "Ime"
 
 msgctxt "field:ir.trigger.log,record_id:"
 msgid "Record ID"
-msgstr "Item ID"
+msgstr "ID zapisa"
 
 msgctxt "field:ir.trigger.log,trigger:"
 msgid "Trigger"
-msgstr "Starter"
+msgstr "Prožilnik"
 
 msgctxt "field:ir.trigger.log,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Zapisano"
 
 msgctxt "field:ir.trigger.log,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Zapisal"
 
 msgctxt "field:ir.ui.icon,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Ustvarjeno"
 
 msgctxt "field:ir.ui.icon,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Ustvaril"
 
-#, fuzzy
 msgctxt "field:ir.ui.icon,icon:"
 msgid "Icon"
-msgstr "Icoon"
+msgstr "Ikona"
 
 msgctxt "field:ir.ui.icon,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
-#, fuzzy
 msgctxt "field:ir.ui.icon,module:"
 msgid "Module"
-msgstr "Module"
+msgstr "Modul"
 
-#, fuzzy
 msgctxt "field:ir.ui.icon,name:"
 msgid "Name"
-msgstr "Naam bijlage"
+msgstr "Naziv"
 
 msgctxt "field:ir.ui.icon,path:"
 msgid "SVG Path"
-msgstr ""
+msgstr "SVG pot"
 
-#, fuzzy
 msgctxt "field:ir.ui.icon,rec_name:"
 msgid "Name"
-msgstr "Naam bijlage"
+msgstr "Ime"
 
-#, fuzzy
 msgctxt "field:ir.ui.icon,sequence:"
 msgid "Sequence"
-msgstr "Reeks"
+msgstr "Zap.št."
 
 msgctxt "field:ir.ui.icon,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Zapisano"
 
 msgctxt "field:ir.ui.icon,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Zapisal"
 
 msgctxt "field:ir.ui.menu,action:"
 msgid "Action"
-msgstr "Actie"
+msgstr "Ukrep"
 
 msgctxt "field:ir.ui.menu,active:"
 msgid "Active"
-msgstr "Actief"
+msgstr "Aktivno"
 
 msgctxt "field:ir.ui.menu,childs:"
 msgid "Children"
-msgstr "Onderliggende niveaus"
+msgstr "Podmeniji"
 
 msgctxt "field:ir.ui.menu,complete_name:"
 msgid "Complete Name"
-msgstr "Volledige naam"
+msgstr "Polno ime"
 
 msgctxt "field:ir.ui.menu,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Ustvarjeno"
 
 msgctxt "field:ir.ui.menu,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Ustvaril"
 
 msgctxt "field:ir.ui.menu,favorite:"
 msgid "Favorite"
-msgstr ""
+msgstr "Priljubljen"
 
 msgctxt "field:ir.ui.menu,groups:"
 msgid "Groups"
-msgstr "Groepen"
+msgstr "Skupine"
 
 msgctxt "field:ir.ui.menu,icon:"
 msgid "Icon"
-msgstr "Icoon"
+msgstr "Ikona"
 
 msgctxt "field:ir.ui.menu,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:ir.ui.menu,name:"
 msgid "Menu"
-msgstr "Menu"
+msgstr "Meni"
 
 msgctxt "field:ir.ui.menu,parent:"
 msgid "Parent Menu"
-msgstr "Hoofdmenu"
+msgstr "Matični meni"
 
 msgctxt "field:ir.ui.menu,rec_name:"
 msgid "Name"
-msgstr "Naam"
+msgstr "Ime"
 
 msgctxt "field:ir.ui.menu,sequence:"
 msgid "Sequence"
-msgstr "Reeks"
+msgstr "Zap.št."
 
 msgctxt "field:ir.ui.menu,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Zapisano"
 
 msgctxt "field:ir.ui.menu,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Zapisal"
 
 msgctxt "field:ir.ui.menu.favorite,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Ustvarjeno"
 
 msgctxt "field:ir.ui.menu.favorite,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Ustvaril"
 
 msgctxt "field:ir.ui.menu.favorite,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
-#, fuzzy
 msgctxt "field:ir.ui.menu.favorite,menu:"
 msgid "Menu"
-msgstr "Menu"
+msgstr "Meni"
 
-#, fuzzy
 msgctxt "field:ir.ui.menu.favorite,rec_name:"
 msgid "Name"
-msgstr "Naam bijlage"
+msgstr "Ime"
 
-#, fuzzy
 msgctxt "field:ir.ui.menu.favorite,sequence:"
 msgid "Sequence"
-msgstr "Reeks"
+msgstr "Zap.št."
 
-#, fuzzy
 msgctxt "field:ir.ui.menu.favorite,user:"
 msgid "User"
-msgstr "Gebruiker"
+msgstr "Uporabnik"
 
 msgctxt "field:ir.ui.menu.favorite,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Zapisano"
 
 msgctxt "field:ir.ui.menu.favorite,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Zapisal"
 
 msgctxt "field:ir.ui.view,arch:"
 msgid "View Architecture"
-msgstr "Bekijk opbouw"
+msgstr "Zgradba"
 
 msgctxt "field:ir.ui.view,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Ustvarjeno"
 
 msgctxt "field:ir.ui.view,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Ustvaril"
 
 msgctxt "field:ir.ui.view,data:"
 msgid "Data"
-msgstr ""
+msgstr "Podatki"
 
 msgctxt "field:ir.ui.view,domain:"
 msgid "Domain"
-msgstr "Domein"
+msgstr "Domena"
 
 msgctxt "field:ir.ui.view,field_childs:"
 msgid "Children Field"
-msgstr "Veld onderliggende niveaus"
+msgstr "Podpolja"
 
 msgctxt "field:ir.ui.view,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:ir.ui.view,inherit:"
 msgid "Inherited View"
-msgstr "Aanzicht overnemen"
+msgstr "Izpeljan iz"
 
 msgctxt "field:ir.ui.view,model:"
 msgid "Model"
@@ -2488,145 +2449,139 @@ msgstr "Model"
 
 msgctxt "field:ir.ui.view,module:"
 msgid "Module"
-msgstr "Module"
+msgstr "Modul"
 
-#, fuzzy
 msgctxt "field:ir.ui.view,name:"
 msgid "Name"
-msgstr "Naam bijlage"
+msgstr "Naziv"
 
 msgctxt "field:ir.ui.view,priority:"
 msgid "Priority"
-msgstr "Prioriteit"
+msgstr "Prioriteta"
 
 msgctxt "field:ir.ui.view,rec_name:"
 msgid "Name"
-msgstr "Naam"
+msgstr "Ime"
 
 msgctxt "field:ir.ui.view,type:"
 msgid "View Type"
-msgstr "Aanzicht type"
+msgstr "Vrsta"
 
 msgctxt "field:ir.ui.view,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Zapisano"
 
 msgctxt "field:ir.ui.view,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Zapisal"
 
 msgctxt "field:ir.ui.view.show.start,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:ir.ui.view_search,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Ustvarjeno"
 
 msgctxt "field:ir.ui.view_search,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Ustvaril"
 
-#, fuzzy
 msgctxt "field:ir.ui.view_search,domain:"
 msgid "Domain"
-msgstr "Domein"
+msgstr "Domena"
 
 msgctxt "field:ir.ui.view_search,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
-#, fuzzy
 msgctxt "field:ir.ui.view_search,model:"
 msgid "Model"
 msgstr "Model"
 
-#, fuzzy
 msgctxt "field:ir.ui.view_search,name:"
 msgid "Name"
-msgstr "Naam bijlage"
+msgstr "Naziv"
 
-#, fuzzy
 msgctxt "field:ir.ui.view_search,rec_name:"
 msgid "Name"
-msgstr "Naam bijlage"
+msgstr "Ime"
 
-#, fuzzy
 msgctxt "field:ir.ui.view_search,user:"
 msgid "User"
-msgstr "Gebruiker"
+msgstr "Uporabnik"
 
 msgctxt "field:ir.ui.view_search,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Zapisano"
 
 msgctxt "field:ir.ui.view_search,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Zapisal"
 
-msgctxt "field:ir.ui.view_tree_expanded_state,child_name:"
+msgctxt "field:ir.ui.view_tree_state,child_name:"
 msgid "Child Name"
-msgstr ""
+msgstr "Ime poddrevesa"
 
-msgctxt "field:ir.ui.view_tree_expanded_state,create_date:"
+msgctxt "field:ir.ui.view_tree_state,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Ustvarjeno"
 
-msgctxt "field:ir.ui.view_tree_expanded_state,create_uid:"
+msgctxt "field:ir.ui.view_tree_state,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Ustvaril"
 
-#, fuzzy
-msgctxt "field:ir.ui.view_tree_expanded_state,domain:"
+msgctxt "field:ir.ui.view_tree_state,domain:"
 msgid "Domain"
-msgstr "Domein"
+msgstr "Domena"
 
-msgctxt "field:ir.ui.view_tree_expanded_state,id:"
+msgctxt "field:ir.ui.view_tree_state,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
-#, fuzzy
-msgctxt "field:ir.ui.view_tree_expanded_state,model:"
+msgctxt "field:ir.ui.view_tree_state,model:"
 msgid "Model"
 msgstr "Model"
 
-msgctxt "field:ir.ui.view_tree_expanded_state,nodes:"
+msgctxt "field:ir.ui.view_tree_state,nodes:"
 msgid "Expanded Nodes"
-msgstr ""
+msgstr "Razširjeni vozli"
 
-#, fuzzy
-msgctxt "field:ir.ui.view_tree_expanded_state,rec_name:"
+msgctxt "field:ir.ui.view_tree_state,rec_name:"
 msgid "Name"
-msgstr "Naam bijlage"
+msgstr "Ime"
+
+msgctxt "field:ir.ui.view_tree_state,selected_nodes:"
+msgid "Selected Nodes"
+msgstr "Izbrani vozli"
 
-#, fuzzy
-msgctxt "field:ir.ui.view_tree_expanded_state,user:"
+msgctxt "field:ir.ui.view_tree_state,user:"
 msgid "User"
-msgstr "Gebruiker"
+msgstr "Uporabnik"
 
-msgctxt "field:ir.ui.view_tree_expanded_state,write_date:"
+msgctxt "field:ir.ui.view_tree_state,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Zapisano"
 
-msgctxt "field:ir.ui.view_tree_expanded_state,write_uid:"
+msgctxt "field:ir.ui.view_tree_state,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Zapisal"
 
 msgctxt "field:ir.ui.view_tree_width,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Ustvarjeno"
 
 msgctxt "field:ir.ui.view_tree_width,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Ustvaril"
 
 msgctxt "field:ir.ui.view_tree_width,field:"
 msgid "Field"
-msgstr "Veld"
+msgstr "Polje"
 
 msgctxt "field:ir.ui.view_tree_width,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:ir.ui.view_tree_width,model:"
 msgid "Model"
@@ -2634,360 +2589,365 @@ msgstr "Model"
 
 msgctxt "field:ir.ui.view_tree_width,rec_name:"
 msgid "Name"
-msgstr "Naam"
+msgstr "Ime"
 
 msgctxt "field:ir.ui.view_tree_width,user:"
 msgid "User"
-msgstr "Gebruiker"
+msgstr "Uporabnik"
 
 msgctxt "field:ir.ui.view_tree_width,width:"
 msgid "Width"
-msgstr "Breedte"
+msgstr "Širina"
 
 msgctxt "field:ir.ui.view_tree_width,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Zapisano"
 
 msgctxt "field:ir.ui.view_tree_width,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Zapisal"
 
 msgctxt "help:ir.action.act_window,auto_refresh:"
 msgid "Add an auto-refresh on the view"
-msgstr "Voegt automatisch verversen toe"
+msgstr "Dodaj samoosvežitev na pogledu"
 
 msgctxt "help:ir.action.act_window,limit:"
 msgid "Default limit for the list view"
-msgstr "Standaard begrenzing voor dit aanzicht"
+msgstr "Privzeta meja za naštevni pogled"
 
 msgctxt "help:ir.action.act_window,search_value:"
 msgid "Default search criteria for the list view"
-msgstr "Standaard zoekopdracht voor lijst"
+msgstr "Privzeti iskalni kriterij za naštevni pogled"
 
 msgctxt "help:ir.action.act_window,window_name:"
 msgid "Use the action name as window name"
-msgstr "Gebruik de naam van de actie als schermnaam"
+msgstr "Ime ukrepa uporabi za ime okna"
 
 msgctxt "help:ir.action.report,email:"
 msgid ""
 "Python dictonary where keys define \"to\" \"cc\" \"subject\"\n"
 "Example: {'to': 'test at example.com', 'cc': 'user at example.com'}"
 msgstr ""
+"Python slovar, kjer ključi določajo \"to\" \"cc\" \"subject\"\n"
+"Primer: {'to': 'test at example.com', 'cc': 'uporabnik at example.com'}"
 
 msgctxt "help:ir.action.report,extension:"
 msgid ""
 "Leave empty for the same as template, see unoconv documentation for "
 "compatible format"
 msgstr ""
+"Za enako končnico kot v predlogi pustite prazno. Za združljiv format glejte "
+"navodila za unoconv."
 
 msgctxt "help:ir.action.report,style:"
 msgid "Define the style to apply on the report."
-msgstr "Definieer de toe te passen stijl voor dit verslag."
+msgstr "Določitev sloga za poročilo"
 
 msgctxt "help:ir.action.wizard,window:"
 msgid "Run wizard in a new window"
-msgstr "Start assistent in nieuw venster"
+msgstr "Zaženi čarovnika v novem oknu"
 
 msgctxt "help:ir.cron,number_calls:"
 msgid ""
 "Number of times the function is called, a negative number indicates that the"
 " function will always be called"
 msgstr ""
+"Določa kolikokrat je funkcija klicana. Negativno število pomeni, da bo "
+"funkcija vedno klicana."
 
 msgctxt "help:ir.cron,request_user:"
 msgid "The user who will receive requests in case of failure"
-msgstr "De gebruiker die de verzoeken krijgt in geval van falen"
+msgstr "Prejemnik zahtevkov v primeru napake"
 
 msgctxt "help:ir.cron,user:"
 msgid "The user used to execute this action"
-msgstr "De gebruiker die gebruikt wordt voor deze actie"
+msgstr "Uporabnik, ki je izvedel ta ukrep"
 
 msgctxt "help:ir.lang,code:"
 msgid "RFC 4646 tag: http://tools.ietf.org/html/rfc4646"
-msgstr ""
+msgstr "RFC 4646 značka: http://tools.ietf.org/html/rfc4646"
 
 msgctxt "help:ir.model,module:"
 msgid "Module in which this model is defined"
-msgstr "Module waarin dit veld is gedefinieerd"
+msgstr "Modul, v katerem je ta model določen"
 
 msgctxt "help:ir.model.data,db_id:"
 msgid "The id of the record in the database."
-msgstr "Het ID van het item in de database."
+msgstr "Id zapisa v zbirki podatkov"
 
 msgctxt "help:ir.model.data,fs_id:"
 msgid "The id of the record as known on the file system."
-msgstr "Het ID van het item zoals bekend in het bestandssysteem."
+msgstr "Id zapisa, viden v datotečnem sistemu"
 
 msgctxt "help:ir.model.field,module:"
 msgid "Module in which this field is defined"
-msgstr "Module waarin dit veld is gedefinieerd"
+msgstr "Modul, v katerem je to polje določeno"
 
 msgctxt "help:ir.model.print_model_graph.start,filter:"
 msgid ""
 "Entering a Python Regular Expression will exclude matching models from the "
 "graph."
-msgstr ""
+msgstr "Vpis Python regularnega izraza izloči najdene modele iz grafa."
 
 msgctxt "help:ir.rule,domain:"
 msgid "Domain is evaluated with \"user\" as the current user"
-msgstr ""
+msgstr "Domena ima vrednost \"user\" za trenutnega uporabnika "
 
 msgctxt "help:ir.rule.group,default_p:"
 msgid "Add this rule to all users by default"
-msgstr "Voeg deze regel standaard toe bij alle gebruikers"
+msgstr "Privzeto dodaj to pravilo vsem uporabnikom"
 
 msgctxt "help:ir.rule.group,global_p:"
 msgid ""
 "Make the rule global \n"
 "so every users must follow this rule"
-msgstr "Maak de regel globaal"
+msgstr ""
+"Naredi pravilo globalno,\n"
+"tako da ga mora vsak uporabnik upoštevati"
 
 msgctxt "help:ir.rule.group,rules:"
 msgid "The rule is satisfied if at least one test is True"
-msgstr "De regel is waar als tenminste aan één voorwaarde wordt voldaan"
+msgstr "Pravilu je zadoščeno, če je vsaj en preizkus resničen"
 
 msgctxt "help:ir.trigger,condition:"
 msgid ""
 "A Python statement evaluated with record represented by \"self\"\n"
 "It triggers the action if true."
 msgstr ""
-"Een Python uitdrukking gekoppeld aan item \"self\"\n"
-"Het start de actie als het waar is."
+"Pythonski stavek, ki se preračuna z zapisom, dostopnim preko \"self\".\n"
+"Če je stavek resničen, se sproži ukrep."
 
 msgctxt "help:ir.trigger,limit_number:"
 msgid ""
 "Limit the number of call to \"Action Function\" by records.\n"
 "0 for no limit."
 msgstr ""
-"Beperk het aantal aanroepen van \"Uitvoerende functie\" door items.\n"
-"Gebruik 0 voor geen beperking."
+"Omeji število klicev \"funkcije ukrepa\" po posameznem zapisu.\n"
+"0 za neomejeno število."
 
-#, fuzzy
 msgctxt "help:ir.trigger,minimum_delay:"
 msgid ""
 "Set a minimum delay in minutes between call to \"Action Function\" for the same record.\n"
 "0 for no delay."
 msgstr ""
-"Stelt de minimum vertraging in tussen afzonderlijke aanroepen van \"Uitvoerende functie\" door hetzelfde item.\n"
-"Gebruik 0 voor geen vertraging."
+"Nastavi minimalno zakasnitev v minutah med klicema \"funkcije ukrepa\" istega zapisa.\n"
+"0 za brez zakasnitve."
 
 msgctxt "help:ir.ui.view_search,domain:"
 msgid "The PYSON domain"
-msgstr ""
+msgstr "PYSON domena"
 
 msgctxt "model:ir.action,name:"
 msgid "Action"
-msgstr "Actie"
+msgstr "Ukrep"
 
 msgctxt "model:ir.action,name:act_action_act_window_form"
 msgid "Window Actions"
-msgstr "Schermacties"
+msgstr "Ukrep za okna"
 
 msgctxt "model:ir.action,name:act_action_form"
 msgid "Actions"
-msgstr "Acties"
+msgstr "Ukrepi"
 
 msgctxt "model:ir.action,name:act_action_report_form"
 msgid "Reports"
-msgstr "Rapportage"
+msgstr "Poročila"
 
 msgctxt "model:ir.action,name:act_action_url_form"
 msgid "URLs"
-msgstr "URL's\n"
+msgstr "URLji"
 
 msgctxt "model:ir.action,name:act_action_wizard_form"
 msgid "Wizards"
-msgstr "Assistenten"
+msgstr "Čarovniki"
 
 msgctxt "model:ir.action,name:act_attachment_form"
 msgid "Attachments"
-msgstr "Bijlagen"
+msgstr "Priloge"
 
 msgctxt "model:ir.action,name:act_config_wizard_item_form"
 msgid "Config Wizard Items"
-msgstr "Conf. assistent items"
+msgstr "Nastavitveni čarovniki"
 
 msgctxt "model:ir.action,name:act_cron_form"
 msgid "Scheduled Actions"
-msgstr "Geplande acties"
+msgstr "Načrtovani ukrepi"
 
 msgctxt "model:ir.action,name:act_export_form"
 msgid "Exports"
-msgstr "Export"
+msgstr "Izvozi"
 
 msgctxt "model:ir.action,name:act_icon_form"
 msgid "Icons"
-msgstr ""
+msgstr "Ikone"
 
 msgctxt "model:ir.action,name:act_lang_form"
 msgid "Languages"
-msgstr "Talen"
+msgstr "Jeziki"
 
-#, fuzzy
 msgctxt "model:ir.action,name:act_menu_list"
 msgid "Menu"
-msgstr "Menu"
+msgstr "Meni"
 
 msgctxt "model:ir.action,name:act_menu_tree"
 msgid "Menu"
-msgstr "Menu"
+msgstr "Meni"
 
 msgctxt "model:ir.action,name:act_model_access_form"
 msgid "Models Access"
-msgstr "Toegang tot modellen"
+msgstr "Dostop do modelov"
 
 msgctxt "model:ir.action,name:act_model_button_form"
 msgid "Buttons"
-msgstr ""
+msgstr "Gumbi"
 
 msgctxt "model:ir.action,name:act_model_field_access_form"
 msgid "Fields Access"
-msgstr ""
+msgstr "Dostop do polj"
 
 msgctxt "model:ir.action,name:act_model_fields_form"
 msgid "Fields"
-msgstr "Velden"
+msgstr "Polja"
 
 msgctxt "model:ir.action,name:act_model_form"
 msgid "Models"
-msgstr "Modellen"
+msgstr "Modeli"
 
 msgctxt "model:ir.action,name:act_module_config"
 msgid "Configure Modules"
-msgstr ""
+msgstr "Konfiguracija modulov"
 
 msgctxt "model:ir.action,name:act_module_config_wizard"
 msgid "Module Configuration"
-msgstr "Module configuratie"
+msgstr "Konfiguracija modula"
 
 msgctxt "model:ir.action,name:act_module_form"
 msgid "Modules"
-msgstr "Modulen"
+msgstr "Moduli"
 
 msgctxt "model:ir.action,name:act_module_install_upgrade"
 msgid "Perform Pending Installation/Upgrade"
-msgstr "Voer installatie / bijwerken uit"
+msgstr "Namesti/nadgradi"
 
 msgctxt "model:ir.action,name:act_property_form"
 msgid "Properties"
-msgstr "Eigenschappen"
+msgstr "Lastnosti"
 
 msgctxt "model:ir.action,name:act_property_form_default"
 msgid "Default Properties"
-msgstr "Standaard eigenschappen"
+msgstr "Privzete lastnosti"
 
 msgctxt "model:ir.action,name:act_rule_group_form"
 msgid "Record Rules"
-msgstr "Item regels"
+msgstr "Pravila za zapise"
 
 msgctxt "model:ir.action,name:act_sequence_form"
 msgid "Sequences"
-msgstr "Reeksen"
+msgstr "Štetja"
 
 msgctxt "model:ir.action,name:act_sequence_strict_form"
 msgid "Sequences Strict"
-msgstr "Vaste reeksen"
+msgstr "Stroga štetja"
 
 msgctxt "model:ir.action,name:act_sequence_type_form"
 msgid "Sequence Types"
-msgstr "Reeks typen"
+msgstr "Tipi štetij"
 
 msgctxt "model:ir.action,name:act_translation_clean"
 msgid "Clean Translations"
-msgstr "Vertalingen opschonen"
+msgstr "Počisti prevode"
 
 msgctxt "model:ir.action,name:act_translation_export"
 msgid "Export Translations"
-msgstr "Vertalingen exporteren"
+msgstr "Izvozi prevode"
 
 msgctxt "model:ir.action,name:act_translation_form"
 msgid "Translations"
-msgstr "Vertalingen"
+msgstr "Prevodi"
 
 msgctxt "model:ir.action,name:act_translation_set"
 msgid "Set Report Translations"
-msgstr ""
+msgstr "Nastavitev prevodov v izpisih"
 
 msgctxt "model:ir.action,name:act_translation_update"
 msgid "Synchronize Translations"
-msgstr "Vertaling synchroniseren"
+msgstr "Uskladi prevode"
 
 msgctxt "model:ir.action,name:act_trigger_form"
 msgid "Triggers"
-msgstr "Starters"
+msgstr "Prožilniki"
 
 msgctxt "model:ir.action,name:act_view_form"
 msgid "Views"
-msgstr "Aanzichten"
+msgstr "Pogledi"
 
 msgctxt "model:ir.action,name:act_view_search"
 msgid "View Search"
-msgstr ""
+msgstr "Iskalni zaznamki"
 
 msgctxt "model:ir.action,name:act_view_show"
 msgid "Show View"
-msgstr ""
+msgstr "Prikaži pogled"
 
-msgctxt "model:ir.action,name:act_view_tree_expanded_state"
-msgid "Tree Expanded State"
-msgstr ""
+msgctxt "model:ir.action,name:act_view_tree_state"
+msgid "Tree State"
+msgstr "Stanje drevesa"
 
 msgctxt "model:ir.action,name:act_view_tree_width_form"
 msgid "View Tree Width"
-msgstr "Aanzicht boomstructuurbreedte"
+msgstr "Velikost dreves"
 
 msgctxt "model:ir.action,name:print_model_graph"
 msgid "Graph"
-msgstr "Grafiek"
+msgstr "Diagram"
 
 msgctxt "model:ir.action,name:report_model_graph"
 msgid "Graph"
-msgstr "Grafiek"
+msgstr "Diagram"
 
 msgctxt "model:ir.action.act_window,name:"
 msgid "Action act window"
-msgstr "Actie uitvoerend scherm"
+msgstr "Ukrep za okna"
 
 msgctxt "model:ir.action.act_window.domain,name:"
 msgid "Action act window domain"
-msgstr ""
+msgstr "Domena okna za ukrepe"
 
 msgctxt "model:ir.action.act_window.view,name:"
 msgid "Action act window view"
-msgstr "Actie uitvoerend schermaanzicht"
+msgstr "Pogled ukrepa za okna"
 
 msgctxt "model:ir.action.keyword,name:"
 msgid "Action keyword"
-msgstr "Actietrefwoord"
+msgstr "Ključna beseda ukrepa"
 
 msgctxt "model:ir.action.report,name:"
 msgid "Action report"
-msgstr "Actie rapport"
+msgstr "Ukrep za poročilo"
 
 msgctxt "model:ir.action.url,name:"
 msgid "Action URL"
-msgstr "Actie URL"
+msgstr "Ukrep za URL"
 
 msgctxt "model:ir.action.wizard,name:"
 msgid "Action wizard"
-msgstr "Actie assistent"
+msgstr "Ukrep za čarovnika"
 
 msgctxt "model:ir.attachment,name:"
 msgid "Attachment"
-msgstr "Bijlage"
+msgstr "Priloga"
 
 msgctxt "model:ir.cache,name:"
 msgid "Cache"
-msgstr "Tijdelijk geheugen"
+msgstr "Predpomnilnik"
 
-#, fuzzy
 msgctxt "model:ir.configuration,name:"
 msgid "Configuration"
-msgstr "Instellingen"
+msgstr "Konfiguracija"
 
 msgctxt "model:ir.cron,name:"
 msgid "Cron"
-msgstr "Cyclische opdracht"
+msgstr "Časovni razporejevalnik"
 
 msgctxt "model:ir.date,name:"
 msgid "Date"
@@ -2995,63 +2955,67 @@ msgstr "Datum"
 
 msgctxt "model:ir.export,name:"
 msgid "Export"
-msgstr "Exporteren"
+msgstr "Izvoz"
 
 msgctxt "model:ir.export.line,name:"
 msgid "Export line"
-msgstr "Exporterregel"
+msgstr "Postavka izvoza"
 
 msgctxt "model:ir.lang,name:"
 msgid "Language"
-msgstr "Taal"
+msgstr "Jezik"
 
 msgctxt "model:ir.lang,name:lang_ar"
 msgid "Spanish (Argentina)"
-msgstr ""
+msgstr "Španščina (Argentina)"
 
 msgctxt "model:ir.lang,name:lang_bg"
 msgid "Bulgarian"
-msgstr ""
+msgstr "Bolgarščina"
 
 msgctxt "model:ir.lang,name:lang_ca"
 msgid "Català"
-msgstr ""
+msgstr "Katalonščina"
 
 msgctxt "model:ir.lang,name:lang_cs"
 msgid "Czech"
-msgstr "Tsjechisch"
+msgstr "Češčina"
 
 msgctxt "model:ir.lang,name:lang_de"
 msgid "German"
-msgstr "Duits"
+msgstr "Nemščina"
 
 msgctxt "model:ir.lang,name:lang_en"
 msgid "English"
-msgstr "Engels"
+msgstr "Angleščina"
 
 msgctxt "model:ir.lang,name:lang_es"
 msgid "Spanish (Spain)"
-msgstr "Spaans (Spanje)"
+msgstr "Španščina (Španija)"
 
 msgctxt "model:ir.lang,name:lang_es_CO"
 msgid "Spanish (Colombia)"
-msgstr "Spaans (Colombia)"
+msgstr "Španščina (Kolumbija)"
 
 msgctxt "model:ir.lang,name:lang_fr"
 msgid "French"
-msgstr "Frans"
+msgstr "Francoščina"
 
 msgctxt "model:ir.lang,name:lang_lt"
 msgid "Lithuanian"
-msgstr ""
+msgstr "Litovščina"
 
 msgctxt "model:ir.lang,name:lang_nl"
 msgid "Dutch"
-msgstr ""
+msgstr "Holandščina"
 
 msgctxt "model:ir.lang,name:lang_ru"
 msgid "Russian"
-msgstr "Russisch"
+msgstr "Ruščina"
+
+msgctxt "model:ir.lang,name:lang_sl"
+msgid "Slovenian"
+msgstr "Slovenščina"
 
 msgctxt "model:ir.model,name:"
 msgid "Model"
@@ -3059,486 +3023,479 @@ msgstr "Model"
 
 msgctxt "model:ir.model.access,name:"
 msgid "Model access"
-msgstr "Toegang tot model"
+msgstr "Dostop do modelov"
 
 msgctxt "model:ir.model.button,name:"
 msgid "Model Button"
-msgstr ""
+msgstr "Model gumba"
 
 msgctxt "model:ir.model.data,name:"
 msgid "Model data"
-msgstr "Model gegevens"
+msgstr "Podatki modela"
 
 msgctxt "model:ir.model.field,name:"
 msgid "Model field"
-msgstr "Model veld"
+msgstr "Polje modela"
 
 msgctxt "model:ir.model.field.access,name:"
 msgid "Model Field Access"
-msgstr ""
+msgstr "Dostop do polj"
 
 msgctxt "model:ir.model.print_model_graph.start,name:"
 msgid "Print Model Graph"
-msgstr ""
+msgstr "Izpis grafa modela"
 
 msgctxt "model:ir.module.module,name:"
 msgid "Module"
-msgstr "Module"
+msgstr "Modul"
 
 msgctxt "model:ir.module.module.config_wizard.first,name:"
 msgid "Module Config Wizard First"
-msgstr "Module EHBC"
+msgstr "Nastavitveni čarovnik"
 
 msgctxt "model:ir.module.module.config_wizard.item,name:"
 msgid "Config wizard to run after installing module"
-msgstr "Configuratie assistent die start na installatie van de module"
+msgstr "Nastavitveni čarovnik, ki se zažene po namestitvi modula"
 
 msgctxt "model:ir.module.module.config_wizard.other,name:"
 msgid "Module Config Wizard Other"
-msgstr ""
+msgstr "Dodatna konfiguracija modula"
 
 msgctxt "model:ir.module.module.dependency,name:"
 msgid "Module dependency"
-msgstr "Module afhankelijkheid"
+msgstr "Odvisnost modula"
 
 msgctxt "model:ir.module.module.install_upgrade.done,name:"
 msgid "Module Install Upgrade Done"
-msgstr ""
+msgstr "Namestitev/nadgradnja modula končana."
 
 msgctxt "model:ir.module.module.install_upgrade.start,name:"
 msgid "Module Install Upgrade Start"
-msgstr "Start module gaan bijwerken"
+msgstr "Start za namestitev/nadgradnjo modula"
 
 msgctxt "model:ir.property,name:"
 msgid "Property"
-msgstr "Eigenschap"
+msgstr "Lastnost"
 
 msgctxt "model:ir.rule,name:"
 msgid "Rule"
-msgstr "Regel"
+msgstr "Pravilo"
 
 msgctxt "model:ir.rule.group,name:"
 msgid "Rule group"
-msgstr "Regelgroep"
+msgstr "Skupina pravil"
 
 msgctxt "model:ir.sequence,name:"
 msgid "Sequence"
-msgstr "Reeks"
+msgstr "Štetje"
 
 msgctxt "model:ir.sequence.strict,name:"
 msgid "Sequence Strict"
-msgstr "Vaste reeks"
+msgstr "Strogo štetje"
 
 msgctxt "model:ir.sequence.type,name:"
 msgid "Sequence type"
-msgstr "Reeks type"
+msgstr "Tip štetja"
 
 msgctxt "model:ir.session,name:"
 msgid "Session"
-msgstr ""
+msgstr "Seja"
 
 msgctxt "model:ir.session.wizard,name:"
 msgid "Session Wizard"
-msgstr ""
+msgstr "Čarovnik za sejo"
 
 msgctxt "model:ir.translation,name:"
 msgid "Translation"
-msgstr "Vertaling"
+msgstr "Prevod"
 
-#, fuzzy
 msgctxt "model:ir.translation.clean.start,name:"
 msgid "Clean translation"
-msgstr "Start vertalingen opschonen"
+msgstr "Čiščenje prevodov"
 
-#, fuzzy
 msgctxt "model:ir.translation.clean.succeed,name:"
 msgid "Clean translation"
-msgstr "Start vertalingen opschonen"
+msgstr "Čiščenje prevodov"
 
-#, fuzzy
 msgctxt "model:ir.translation.export.result,name:"
 msgid "Export translation"
-msgstr "Vertaling exporteren - bestand"
+msgstr "Izvozi prevod"
 
-#, fuzzy
 msgctxt "model:ir.translation.export.start,name:"
 msgid "Export translation"
-msgstr "Vertaling exporteren - bestand"
+msgstr "Izvozi prevod"
 
 msgctxt "model:ir.translation.set.start,name:"
 msgid "Set Translation"
-msgstr ""
+msgstr "Nastavi prevod"
 
 msgctxt "model:ir.translation.set.succeed,name:"
 msgid "Set Translation"
-msgstr ""
+msgstr "Nastavi prevod"
 
 msgctxt "model:ir.translation.update.start,name:"
 msgid "Update translation"
-msgstr ""
+msgstr "Posodobitev prevodov"
 
 msgctxt "model:ir.trigger,name:"
 msgid "Trigger"
-msgstr "Starter"
+msgstr "Prožilnik"
 
 msgctxt "model:ir.trigger.log,name:"
 msgid "Trigger Log"
-msgstr "Starter logboek"
+msgstr "Dnevnik prožilnika"
 
-#, fuzzy
 msgctxt "model:ir.ui.icon,name:"
 msgid "Icon"
-msgstr "Icoon"
+msgstr "Ikona"
 
 msgctxt "model:ir.ui.menu,name:"
 msgid "UI menu"
-msgstr "Gebruiker menu"
+msgstr "Meni uporabniškega vmesnika"
 
 msgctxt "model:ir.ui.menu,name:menu_act_action"
 msgid "Actions"
-msgstr "Acties"
+msgstr "Ukrepi"
 
 msgctxt "model:ir.ui.menu,name:menu_action"
 msgid "Actions"
-msgstr "Acties"
+msgstr "Ukrepi"
 
 msgctxt "model:ir.ui.menu,name:menu_action_act_window"
 msgid "Window Actions"
-msgstr "Schermacties"
+msgstr "Ukrepi za okna"
 
 msgctxt "model:ir.ui.menu,name:menu_action_report_form"
 msgid "Reports"
-msgstr "Rapportage"
+msgstr "Poročila"
 
 msgctxt "model:ir.ui.menu,name:menu_action_url"
 msgid "URLs"
-msgstr "URL's"
+msgstr "URLji"
 
 msgctxt "model:ir.ui.menu,name:menu_action_wizard"
 msgid "Wizards"
-msgstr "Assistenten"
+msgstr "Čarovniki"
 
 msgctxt "model:ir.ui.menu,name:menu_administration"
 msgid "Administration"
-msgstr "Systeembeheer"
+msgstr "Skrbništvo"
 
 msgctxt "model:ir.ui.menu,name:menu_attachment_form"
 msgid "Attachments"
-msgstr "Bijlagen"
+msgstr "Priloge"
 
 msgctxt "model:ir.ui.menu,name:menu_config_wizard_item_form"
 msgid "Config Wizard Items"
-msgstr "Conf. assistent items"
+msgstr "Nastavitveni čarovniki"
 
 msgctxt "model:ir.ui.menu,name:menu_cron_form"
 msgid "Scheduled Actions"
-msgstr "Geplande acties"
+msgstr "Načrtovani ukrepi"
 
 msgctxt "model:ir.ui.menu,name:menu_export_form"
 msgid "Exports"
-msgstr "Export"
+msgstr "Izvozi"
 
 msgctxt "model:ir.ui.menu,name:menu_icon_form"
 msgid "Icons"
-msgstr ""
+msgstr "Ikone"
 
 msgctxt "model:ir.ui.menu,name:menu_ir_sequence_type"
 msgid "Sequence Types"
-msgstr "Reeks typen"
+msgstr "Tipi štetij"
 
 msgctxt "model:ir.ui.menu,name:menu_lang_form"
 msgid "Languages"
-msgstr "Talen"
+msgstr "Jeziki"
 
 msgctxt "model:ir.ui.menu,name:menu_localization"
 msgid "Localization"
-msgstr "Lokalisatie"
+msgstr "Lokalizacija"
 
-#, fuzzy
 msgctxt "model:ir.ui.menu,name:menu_menu_list"
 msgid "Menu"
-msgstr "Menu"
+msgstr "Meni"
 
 msgctxt "model:ir.ui.menu,name:menu_model_access_form"
 msgid "Models Access"
-msgstr "Toegang tot modellen"
+msgstr "Dostop do modelov"
 
 msgctxt "model:ir.ui.menu,name:menu_model_button_form"
 msgid "Buttons"
-msgstr ""
+msgstr "Gumbi"
 
 msgctxt "model:ir.ui.menu,name:menu_model_field_access_form"
 msgid "Fields Access"
-msgstr ""
+msgstr "Dostop do polj"
 
 msgctxt "model:ir.ui.menu,name:menu_model_form"
 msgid "Models"
-msgstr "Modellen"
+msgstr "Modeli"
 
 msgctxt "model:ir.ui.menu,name:menu_models"
 msgid "Models"
-msgstr "Modellen"
+msgstr "Modeli"
 
 msgctxt "model:ir.ui.menu,name:menu_module_form"
 msgid "Modules"
-msgstr "Modulen"
+msgstr "Moduli"
 
 msgctxt "model:ir.ui.menu,name:menu_module_install_upgrade"
 msgid "Perform Pending Installation/Upgrade"
-msgstr "Voer installatie / bijwerken uit"
+msgstr "Namesti/nadgradi"
 
 msgctxt "model:ir.ui.menu,name:menu_modules"
 msgid "Modules"
-msgstr "Modulen"
+msgstr "Moduli"
 
 msgctxt "model:ir.ui.menu,name:menu_property_form"
 msgid "Properties"
-msgstr "Eigenschappen"
+msgstr "Lastnosti"
 
 msgctxt "model:ir.ui.menu,name:menu_property_form_default"
 msgid "Default Properties"
-msgstr "Standaard eigenschappen"
+msgstr "Privzete lastnosti"
 
 msgctxt "model:ir.ui.menu,name:menu_rule_group_form"
 msgid "Record Rules"
-msgstr "Item regels"
+msgstr "Pravila za zapise"
 
 msgctxt "model:ir.ui.menu,name:menu_scheduler"
 msgid "Scheduler"
-msgstr "Planner"
+msgstr "Razporejevalnik"
 
 msgctxt "model:ir.ui.menu,name:menu_sequence_form"
 msgid "Sequences"
-msgstr "Reeksen"
+msgstr "Štetja"
 
 msgctxt "model:ir.ui.menu,name:menu_sequence_strict_form"
 msgid "Sequences Strict"
-msgstr "Vaste reeksen"
+msgstr "Stroga štetja"
 
 msgctxt "model:ir.ui.menu,name:menu_sequences"
 msgid "Sequences"
-msgstr "Reeksen"
+msgstr "Štetja"
 
 msgctxt "model:ir.ui.menu,name:menu_translation_clean"
 msgid "Clean Translations"
-msgstr "Vertalingen opschonen"
+msgstr "Počisti prevode"
 
 msgctxt "model:ir.ui.menu,name:menu_translation_export"
 msgid "Export Translations"
-msgstr "Vertalingen exporteren"
+msgstr "Izvozi prevode"
 
 msgctxt "model:ir.ui.menu,name:menu_translation_form"
 msgid "Translations"
-msgstr "Vertalingen"
+msgstr "Prevodi"
 
 msgctxt "model:ir.ui.menu,name:menu_translation_set"
 msgid "Set Translations"
-msgstr ""
+msgstr "Nastavi prevode"
 
 msgctxt "model:ir.ui.menu,name:menu_translation_update"
 msgid "Synchronize Translations"
-msgstr "Vertaling synchroniseren"
+msgstr "Uskladi prevode"
 
 msgctxt "model:ir.ui.menu,name:menu_trigger_form"
 msgid "Triggers"
-msgstr "Starters"
+msgstr "Prožilniki"
 
 msgctxt "model:ir.ui.menu,name:menu_ui"
 msgid "User Interface"
-msgstr "Gebruikers omgeving"
+msgstr "Uporabniški vmesnik"
 
 msgctxt "model:ir.ui.menu,name:menu_view"
 msgid "Views"
-msgstr "Aanzichten"
+msgstr "Pogledi"
 
 msgctxt "model:ir.ui.menu,name:menu_view_search"
 msgid "View Search"
-msgstr ""
+msgstr "Iskalni zaznamki"
 
-msgctxt "model:ir.ui.menu,name:menu_view_tree_expanded_state"
-msgid "Tree Expanded State"
-msgstr ""
+msgctxt "model:ir.ui.menu,name:menu_view_tree_state"
+msgid "Tree State"
+msgstr "Stanje drevesa"
 
 msgctxt "model:ir.ui.menu,name:menu_view_tree_width"
 msgid "View Tree Width"
-msgstr "Aanzicht boomstructuurbreedte"
+msgstr "Velikost dreves"
 
 msgctxt "model:ir.ui.menu,name:model_model_fields_form"
 msgid "Fields"
-msgstr "Velden"
+msgstr "Polja"
 
 msgctxt "model:ir.ui.menu.favorite,name:"
 msgid "Menu Favorite"
-msgstr ""
+msgstr "Priljubljeno"
 
 msgctxt "model:ir.ui.view,name:"
 msgid "View"
-msgstr "Overzicht"
+msgstr "Pogled"
 
 msgctxt "model:ir.ui.view.show.start,name:"
 msgid "Show view"
-msgstr ""
+msgstr "Prikaz pogleda"
 
 msgctxt "model:ir.ui.view_search,name:"
 msgid "View Search"
-msgstr ""
+msgstr "Iskalni zaznamki"
 
-msgctxt "model:ir.ui.view_tree_expanded_state,name:"
-msgid "View Tree Expanded State"
-msgstr ""
+msgctxt "model:ir.ui.view_tree_state,name:"
+msgid "View Tree State"
+msgstr "Stanje drevesnega pogleda"
 
 msgctxt "model:ir.ui.view_tree_width,name:"
 msgid "View Tree Width"
-msgstr "Aanzicht boomstructuurbreedte"
+msgstr "Velikost dreves"
 
 msgctxt "selection:ir.action.keyword,keyword:"
 msgid "Action form"
-msgstr "Actieformulier"
+msgstr "Ukrep za obrazec"
 
 msgctxt "selection:ir.action.keyword,keyword:"
 msgid "Action tree"
-msgstr "Actie boomstructuur"
+msgstr "Ukrep za drevesni prikaz"
 
 msgctxt "selection:ir.action.keyword,keyword:"
 msgid "Form relate"
-msgstr "Formulier relatie"
+msgstr "Relacija"
 
 msgctxt "selection:ir.action.keyword,keyword:"
 msgid "Open Graph"
-msgstr "Open een grafiek"
+msgstr "Diagramski prikaz"
 
 msgctxt "selection:ir.action.keyword,keyword:"
 msgid "Open tree"
-msgstr "Open boomstructuur"
+msgstr "Drevesni prikaz"
 
 msgctxt "selection:ir.action.keyword,keyword:"
 msgid "Print form"
-msgstr "Formulier afdrukken"
+msgstr "Izpis"
 
 msgctxt "selection:ir.attachment,type:"
 msgid "Data"
-msgstr ""
+msgstr "Podatki"
 
-#, fuzzy
 msgctxt "selection:ir.attachment,type:"
 msgid "Link"
-msgstr "Verbinding"
+msgstr "Povezava"
 
 msgctxt "selection:ir.cron,interval_type:"
 msgid "Days"
-msgstr "Dagen"
+msgstr "Dnevi"
 
 msgctxt "selection:ir.cron,interval_type:"
 msgid "Hours"
-msgstr "Uren"
+msgstr "Ure"
 
 msgctxt "selection:ir.cron,interval_type:"
 msgid "Minutes"
-msgstr "Minuten"
+msgstr "Minute"
 
 msgctxt "selection:ir.cron,interval_type:"
 msgid "Months"
-msgstr "Maanden"
+msgstr "Meseci"
 
 msgctxt "selection:ir.cron,interval_type:"
 msgid "Weeks"
-msgstr "Weken"
+msgstr "Tedni"
 
 msgctxt "selection:ir.lang,direction:"
 msgid "Left-to-right"
-msgstr "Van links naar rechts"
+msgstr "Z leve proti desni"
 
 msgctxt "selection:ir.lang,direction:"
 msgid "Right-to-left"
-msgstr "Van rechts naar links"
+msgstr "Z desne proti levi"
 
 msgctxt "selection:ir.module.module,state:"
 msgid "Installed"
-msgstr "Geïnstalleerd"
+msgstr "Nameščeno"
 
 msgctxt "selection:ir.module.module,state:"
 msgid "Not Installed"
-msgstr "Niet geïnstalleerd"
+msgstr "Ni nameščeno"
 
 msgctxt "selection:ir.module.module,state:"
 msgid "To be installed"
-msgstr "Te installeren"
+msgstr "Za namestiti"
 
 msgctxt "selection:ir.module.module,state:"
 msgid "To be removed"
-msgstr "Te verwijderen"
+msgstr "Za odstraniti"
 
 msgctxt "selection:ir.module.module,state:"
 msgid "To be upgraded"
-msgstr "Bij te werken"
+msgstr "Za nadgraditi"
 
 msgctxt "selection:ir.module.module.config_wizard.item,state:"
 msgid "Done"
-msgstr "Klaar"
+msgstr "Zaključeno"
 
 msgctxt "selection:ir.module.module.config_wizard.item,state:"
 msgid "Open"
-msgstr "Open"
+msgstr "Odprto"
 
 msgctxt "selection:ir.module.module.dependency,state:"
 msgid "Installed"
-msgstr "Geïnstalleerd"
+msgstr "Nameščeno"
 
 msgctxt "selection:ir.module.module.dependency,state:"
 msgid "Not Installed"
-msgstr "Niet geïnstalleerd"
+msgstr "Ni nameščeno"
 
 msgctxt "selection:ir.module.module.dependency,state:"
 msgid "To be installed"
-msgstr "Te installeren"
+msgstr "Za namestiti"
 
 msgctxt "selection:ir.module.module.dependency,state:"
 msgid "To be removed"
-msgstr "Te verwijderen"
+msgstr "Za odstraniti"
 
 msgctxt "selection:ir.module.module.dependency,state:"
 msgid "To be upgraded"
-msgstr "Bij te werken"
+msgstr "Za nadgraditi"
 
 msgctxt "selection:ir.module.module.dependency,state:"
 msgid "Unknown"
-msgstr "Onbekend"
+msgstr "Neznano"
 
 msgctxt "selection:ir.sequence,type:"
 msgid "Decimal Timestamp"
-msgstr "Tijdmarkering"
+msgstr "Desetiški časovni žig"
 
 msgctxt "selection:ir.sequence,type:"
 msgid "Hexadecimal Timestamp"
-msgstr "Hexadecimale tijdmarkering"
+msgstr "Šestnajstiški časovni žig"
 
 msgctxt "selection:ir.sequence,type:"
 msgid "Incremental"
-msgstr "Oplopend"
+msgstr "Prirastno"
 
 msgctxt "selection:ir.sequence.strict,type:"
 msgid "Decimal Timestamp"
-msgstr "Tijdmarkering"
+msgstr "Desetiški časovni žig"
 
 msgctxt "selection:ir.sequence.strict,type:"
 msgid "Hexadecimal Timestamp"
-msgstr "Hexadecimale tijdmarkering"
+msgstr "Šestnajstiški časovni žig"
 
 msgctxt "selection:ir.sequence.strict,type:"
 msgid "Incremental"
-msgstr "Oplopend"
+msgstr "Prirastno"
 
 msgctxt "selection:ir.translation,type:"
 msgid "Error"
-msgstr "Fout"
+msgstr "Napaka"
 
 msgctxt "selection:ir.translation,type:"
 msgid "Field"
-msgstr "Veld"
+msgstr "Polje"
 
 msgctxt "selection:ir.translation,type:"
 msgid "Help"
-msgstr "Help"
+msgstr "Pomoč"
 
 msgctxt "selection:ir.translation,type:"
 msgid "Model"
@@ -3550,15 +3507,15 @@ msgstr "ODT"
 
 msgctxt "selection:ir.translation,type:"
 msgid "Selection"
-msgstr "Selectie"
+msgstr "Izbor"
 
 msgctxt "selection:ir.translation,type:"
 msgid "View"
-msgstr "Aanzicht"
+msgstr "Pogled"
 
 msgctxt "selection:ir.translation,type:"
 msgid "Wizard Button"
-msgstr "Assistent knop"
+msgstr "Gumb čarovnika"
 
 msgctxt "selection:ir.ui.menu,action:"
 msgid ""
@@ -3566,19 +3523,19 @@ msgstr ""
 
 msgctxt "selection:ir.ui.menu,action:"
 msgid "ir.action.act_window"
-msgstr ""
+msgstr "ir.action.act_window"
 
 msgctxt "selection:ir.ui.menu,action:"
 msgid "ir.action.report"
-msgstr ""
+msgstr "ir.action.report"
 
 msgctxt "selection:ir.ui.menu,action:"
 msgid "ir.action.url"
-msgstr ""
+msgstr "ir.action.url"
 
 msgctxt "selection:ir.ui.menu,action:"
 msgid "ir.action.wizard"
-msgstr ""
+msgstr "ir.action.wizard"
 
 msgctxt "selection:ir.ui.view,type:"
 msgid ""
@@ -3586,76 +3543,75 @@ msgstr ""
 
 msgctxt "selection:ir.ui.view,type:"
 msgid "Board"
-msgstr "Bord"
+msgstr "Deska"
+
+msgctxt "selection:ir.ui.view,type:"
+msgid "Calendar"
+msgstr "Koledar"
 
 msgctxt "selection:ir.ui.view,type:"
 msgid "Form"
-msgstr "Formulier"
+msgstr "Obrazec"
 
 msgctxt "selection:ir.ui.view,type:"
 msgid "Graph"
-msgstr "Grafiek"
+msgstr "Diagram"
 
 msgctxt "selection:ir.ui.view,type:"
 msgid "Tree"
-msgstr "Boomstructuur"
+msgstr "Drevo"
 
-#, fuzzy
 msgctxt "view:ir.action.act_window.domain:"
 msgid "Domain"
-msgstr "Domein"
+msgstr "Domena"
 
 msgctxt "view:ir.action.act_window.domain:"
 msgid "Domains"
-msgstr ""
+msgstr "Domene"
 
-#, fuzzy
 msgctxt "view:ir.action.act_window.view:"
 msgid "View"
-msgstr "Overzicht"
+msgstr "Pogled"
 
-#, fuzzy
 msgctxt "view:ir.action.act_window.view:"
 msgid "Views"
-msgstr "Aanzichten"
+msgstr "Pogledi"
 
 msgctxt "view:ir.action.act_window:"
 msgid "General"
-msgstr "Algemeen"
+msgstr "Splošno"
 
 msgctxt "view:ir.action.act_window:"
 msgid "Open Window"
-msgstr "Open scherm"
+msgstr "Odpri okno"
 
 msgctxt "view:ir.action.act_window:"
 msgid "Open a Window"
-msgstr "Open een scherm"
+msgstr "Odpri okno"
 
-#, fuzzy
 msgctxt "view:ir.action.keyword:"
 msgid "Keyword"
-msgstr "Trefwoord"
+msgstr "Ključna beseda"
 
-#, fuzzy
 msgctxt "view:ir.action.keyword:"
 msgid "Keywords"
-msgstr "Trefwoorden"
+msgstr "Ključne besede"
 
 msgctxt "view:ir.action.report:"
 msgid "General"
-msgstr "Algemeen"
+msgstr "Splošno"
 
 msgctxt "view:ir.action.report:"
 msgid "Report"
-msgstr "Verslag"
+msgstr "Poročilo"
 
 msgctxt "view:ir.action.report:"
 msgid "Report xml"
-msgstr "Rapportage xml"
+msgstr "XML poročila"
 
 msgctxt "view:ir.action.url:"
 msgid "General"
-msgstr "Algemeen"
+msgstr "Splošno"
 
 msgctxt "view:ir.action.url:"
 msgid "URL"
@@ -3663,446 +3619,423 @@ msgstr "URL"
 
 msgctxt "view:ir.action.wizard:"
 msgid "General"
-msgstr "Algemeen"
+msgstr "Splošno"
 
 msgctxt "view:ir.action.wizard:"
 msgid "Wizard"
-msgstr "Assistent"
+msgstr "Čarovnik"
 
 msgctxt "view:ir.action:"
 msgid "Action"
-msgstr "Actie"
+msgstr "Ukrep"
 
 msgctxt "view:ir.action:"
 msgid "General"
-msgstr "Algemeen"
+msgstr "Splošno"
 
 msgctxt "view:ir.attachment:"
 msgid "Attachments"
-msgstr "Bijlagen"
+msgstr "Priloge"
 
 msgctxt "view:ir.cron:"
 msgid "Action to trigger"
-msgstr "Actie om uit te voeren"
+msgstr "Sprožitev ukrepa"
 
 msgctxt "view:ir.cron:"
 msgid "Scheduled Action"
-msgstr "Geplande actie"
+msgstr "Načrtovan ukrep"
 
 msgctxt "view:ir.cron:"
 msgid "Scheduled Actions"
-msgstr "Geplande acties"
+msgstr "Načrtovani ukrepi"
 
 msgctxt "view:ir.export:"
 msgid "Exports"
-msgstr "Export"
+msgstr "Izvozi"
 
 msgctxt "view:ir.lang:"
 msgid "Date Formatting"
-msgstr "Datum format"
+msgstr "Datumski format"
 
 msgctxt "view:ir.lang:"
 msgid "Language"
-msgstr "Taal"
+msgstr "Jezik"
 
 msgctxt "view:ir.lang:"
 msgid "Languages"
-msgstr "Talen"
+msgstr "Jeziki"
 
 msgctxt "view:ir.lang:"
 msgid "Numbers Formatting"
-msgstr "Getal weergave"
+msgstr "Številčni format"
 
 msgctxt "view:ir.model.access:"
 msgid "Access controls"
-msgstr "Toegangcontrole"
+msgstr "Nadzor dostopa"
 
 msgctxt "view:ir.model.button:"
 msgid "Button"
-msgstr ""
+msgstr "Gumb"
 
 msgctxt "view:ir.model.button:"
 msgid "Buttons"
-msgstr ""
+msgstr "Gumbi"
 
 msgctxt "view:ir.model.field.access:"
 msgid "Field Access"
-msgstr ""
+msgstr "Dostop do polj"
 
-#, fuzzy
 msgctxt "view:ir.model.field:"
 msgid "Field"
-msgstr "Veld"
+msgstr "Polje"
 
 msgctxt "view:ir.model.field:"
 msgid "Fields"
-msgstr "Velden"
+msgstr "Polja"
 
 msgctxt "view:ir.model.print_model_graph.start:"
 msgid "Print Model Graph"
-msgstr ""
+msgstr "Izpis grafa modela"
 
 msgctxt "view:ir.model:"
 msgid "Model Description"
-msgstr "Model omschrijving"
+msgstr "Opis modela"
 
 msgctxt "view:ir.module.module.config_wizard.first:"
 msgid "Welcome to the module configuration wizard!"
-msgstr "Welkom bij de module configuratie assistent!"
+msgstr "Dobrodošli v čarovniku za nastavitev modulov"
 
 msgctxt "view:ir.module.module.config_wizard.first:"
 msgid ""
 "You will be able to configure your installation depending on the modules you"
 " have installed."
-msgstr ""
+msgstr "Vašo namestitev je možno skonfigurirati glede na nameščene module."
 
 msgctxt "view:ir.module.module.config_wizard.item:"
 msgid "Config Wizard Items"
-msgstr "Configuratie assistent items"
+msgstr "Nastavitveni čarovniki"
 
 msgctxt "view:ir.module.module.config_wizard.other:"
 msgid "Configuration Wizard Next Step!"
-msgstr ""
+msgstr "Naslednji korak čarovnika za konfiguracijo."
 
-#, fuzzy
 msgctxt "view:ir.module.module.dependency:"
 msgid "Dependencies"
-msgstr "Afhankelijkheden"
+msgstr "Odvisnosti"
 
 msgctxt "view:ir.module.module.dependency:"
 msgid "Dependency"
-msgstr ""
+msgstr "Odvisnost"
 
 msgctxt "view:ir.module.module.install_upgrade.done:"
 msgid "System Upgrade Done"
-msgstr ""
+msgstr "Nadgradnja sistema končana."
 
-#, fuzzy
 msgctxt "view:ir.module.module.install_upgrade.done:"
 msgid "The modules have been upgraded / installed !"
-msgstr "De modules zijn bijgewerkt / geïnstalleerd!"
+msgstr "Moduli so bili nadgrajeni / nameščeni."
 
 msgctxt "view:ir.module.module.install_upgrade.start:"
 msgid "Note that this operation may take a few minutes."
-msgstr ""
+msgstr "Upoštevajte, da lahko ta operacija traja nekaj minut."
 
 msgctxt "view:ir.module.module.install_upgrade.start:"
 msgid "System Upgrade"
-msgstr ""
+msgstr "Nadgradnja sistema"
 
 msgctxt "view:ir.module.module.install_upgrade.start:"
 msgid "Your system will be upgraded."
-msgstr ""
+msgstr "Vaš sistem bo nadgrajen."
 
 msgctxt "view:ir.module.module:"
 msgid "Cancel Installation"
-msgstr "Installatie annuleren"
+msgstr "Prekliči namestitev"
 
 msgctxt "view:ir.module.module:"
 msgid "Cancel Uninstallation"
-msgstr "Verwijderen ongedaan maken"
+msgstr "Prekliči odstranitev"
 
 msgctxt "view:ir.module.module:"
 msgid "Cancel Upgrade"
-msgstr "Bijwerken annuleren"
+msgstr "Prekliči nadgradnjo"
 
 msgctxt "view:ir.module.module:"
 msgid "Mark for Installation"
-msgstr "Selecteer voor installatie"
+msgstr "Označi za namestitev"
 
 msgctxt "view:ir.module.module:"
 msgid "Mark for Uninstallation (beta)"
-msgstr "Selecteer voor verwijderen (beta)"
+msgstr "Označi za odstranitev (beta)"
 
 msgctxt "view:ir.module.module:"
 msgid "Mark for Upgrade"
-msgstr "Selecteer voor bijwerken"
+msgstr "Označi za nadgradnjo"
 
 msgctxt "view:ir.module.module:"
 msgid "Module"
-msgstr "Module"
+msgstr "Modul"
 
 msgctxt "view:ir.module.module:"
 msgid "Modules"
-msgstr "Modulen"
+msgstr "Moduli"
 
 msgctxt "view:ir.property:"
 msgid "Properties"
-msgstr "Eigenschappen"
+msgstr "Lastnosti"
 
 msgctxt "view:ir.property:"
 msgid "Property"
-msgstr "Eigenschap"
+msgstr "Lastnost"
 
 msgctxt "view:ir.rule.group:"
 msgid ""
 "If there is no test defined, the rule is always satisfied if not global"
-msgstr ""
-"Als er geen test is gedefinieerd is de regel altijd waar mits niet globaal"
+msgstr "Če pogoj ni določen, bo pravilo vedno veljavno, če ni globalno"
 
 msgctxt "view:ir.rule.group:"
 msgid "Record rules"
-msgstr "Item regels"
+msgstr "Pravila zapisovanja"
 
 msgctxt "view:ir.rule.group:"
 msgid "The rule is satisfied if at least one test is True"
-msgstr "De regel is waar als tenminste aan één voorwaarde wordt voldaan"
+msgstr "Pravilo je veljavno, če je vsaj en pogoj pravilen"
 
 msgctxt "view:ir.rule:"
 msgid "Test"
-msgstr "Test"
+msgstr "Preizkus"
 
 msgctxt "view:ir.sequence.type:"
 msgid "Sequence Type"
-msgstr "Reeks type"
+msgstr "Tip štetja"
 
 msgctxt "view:ir.sequence:"
 msgid "${day}"
-msgstr "${dag}"
+msgstr "${day}"
 
 msgctxt "view:ir.sequence:"
 msgid "${month}"
-msgstr "${maand}"
+msgstr "${month}"
 
 msgctxt "view:ir.sequence:"
 msgid "${year}"
-msgstr "${jaar}"
+msgstr "${year}"
 
 msgctxt "view:ir.sequence:"
 msgid "Day:"
-msgstr "Dag:"
+msgstr "Dan:"
 
 msgctxt "view:ir.sequence:"
 msgid "Incremental"
-msgstr "Oplopend"
+msgstr "Prirastno"
 
 msgctxt "view:ir.sequence:"
 msgid "Legend (Placeholders for prefix, suffix)"
-msgstr "Legenda (sjabloon voor voorvoegsel, toevoeging)"
+msgstr "Napotek (prostornik za predpono, pripono)"
 
 msgctxt "view:ir.sequence:"
 msgid "Month:"
-msgstr "Maand:"
+msgstr "Mesec:"
 
 msgctxt "view:ir.sequence:"
 msgid "Sequences"
-msgstr "Reeksen"
+msgstr "Štetja"
 
 msgctxt "view:ir.sequence:"
 msgid "Timestamp"
-msgstr "Tijdmarkering"
+msgstr "Časovni žig"
 
 msgctxt "view:ir.sequence:"
 msgid "Year:"
-msgstr "Jaar:"
+msgstr "Leto:"
 
 msgctxt "view:ir.translation.clean.start:"
 msgid "Clean Translations"
-msgstr "Vertalingen opschonen"
+msgstr "Počisti prevode"
 
 msgctxt "view:ir.translation.clean.start:"
 msgid "Clean Translations?"
-msgstr ""
+msgstr "Počistim prevode?"
 
-#, fuzzy
 msgctxt "view:ir.translation.clean.succeed:"
 msgid "Clean Translations"
-msgstr "Vertalingen opschonen"
+msgstr "Počisti prevode"
 
-#, fuzzy
 msgctxt "view:ir.translation.clean.succeed:"
 msgid "Clean Translations Succeed!"
-msgstr "Vertalingen opschonen gelukt!"
+msgstr "Prevodi uspešno počiščeni!"
 
-#, fuzzy
 msgctxt "view:ir.translation.export.result:"
 msgid "Export Translation"
-msgstr "Vertaling exporteren"
+msgstr "Izvozi prevod"
 
 msgctxt "view:ir.translation.export.start:"
 msgid "Export Translation"
-msgstr "Vertaling exporteren"
+msgstr "Izvozi prevod"
 
 msgctxt "view:ir.translation.set.start:"
 msgid "Set Translations"
-msgstr ""
+msgstr "Nastavitev prevodov"
 
 msgctxt "view:ir.translation.set.start:"
 msgid "Synchronize Translations?"
-msgstr ""
+msgstr "Sinhroniziram prevode?"
 
 msgctxt "view:ir.translation.set.succeed:"
 msgid "Set Succeed!"
-msgstr ""
+msgstr "Nastavitev končana."
 
 msgctxt "view:ir.translation.set.succeed:"
 msgid "Set Translations"
-msgstr ""
+msgstr "Nastavitev prevodov"
 
-#, fuzzy
 msgctxt "view:ir.translation.update.start:"
 msgid "Synchronize Translations"
-msgstr "Vertaling synchroniseren"
+msgstr "Uskladi prevode"
 
 msgctxt "view:ir.translation:"
 msgid "Translations"
-msgstr "Vertalingen"
+msgstr "Prevodi"
 
 msgctxt "view:ir.trigger:"
 msgid "Trigger"
-msgstr "Starter"
+msgstr "Prožilnik"
 
 msgctxt "view:ir.trigger:"
 msgid "Triggers"
-msgstr "Starters"
+msgstr "Prožilniki"
 
-#, fuzzy
 msgctxt "view:ir.ui.icon:"
 msgid "Icon"
-msgstr "Icoon"
+msgstr "Ikona"
 
 msgctxt "view:ir.ui.icon:"
 msgid "Icons"
-msgstr ""
+msgstr "Ikone"
 
 msgctxt "view:ir.ui.menu.favorite:"
 msgid "Menu Favorite"
-msgstr ""
+msgstr "Priljubljeno"
 
 msgctxt "view:ir.ui.menu.favorite:"
 msgid "Menu Favorites"
-msgstr ""
+msgstr "Priljubljeno"
 
 msgctxt "view:ir.ui.menu:"
 msgid "Menu"
-msgstr "Menu"
+msgstr "Meni"
 
 msgctxt "view:ir.ui.view:"
 msgid "View"
-msgstr "Overzicht"
+msgstr "Pogled"
 
 msgctxt "view:ir.ui.view:"
 msgid "_Show"
-msgstr ""
+msgstr "_Prikaz"
 
 msgctxt "view:ir.ui.view_search:"
 msgid "View Search"
-msgstr ""
+msgstr "Iskanje"
 
 msgctxt "view:ir.ui.view_search:"
 msgid "View Searches"
-msgstr ""
+msgstr "Iskalni zaznamki"
 
-msgctxt "view:ir.ui.view_tree_expanded_state:"
-msgid "View Tree Expanded State"
-msgstr ""
+msgctxt "view:ir.ui.view_tree_state:"
+msgid "View Tree State"
+msgstr "Stanje drevesnega pogleda"
 
-msgctxt "view:ir.ui.view_tree_expanded_state:"
-msgid "Views Tree Expanded State"
-msgstr ""
+msgctxt "view:ir.ui.view_tree_state:"
+msgid "Views Tree State"
+msgstr "Stanje drevesnega pogleda"
 
 msgctxt "view:ir.ui.view_tree_width:"
 msgid "View Tree Width"
-msgstr "Aanzicht boomstructuurbreedte"
+msgstr "Velikost dreves"
 
 msgctxt "view:ir.ui.view_tree_width:"
 msgid "Views Tree Width"
-msgstr "Aanzichten boomstructuurbreedte"
+msgstr "Velikost dreves"
 
-#, fuzzy
 msgctxt "wizard_button:ir.model.print_model_graph,start,end:"
 msgid "Cancel"
-msgstr "Annuleren"
+msgstr "Prekliči"
 
 msgctxt "wizard_button:ir.model.print_model_graph,start,print_:"
 msgid "Print"
-msgstr ""
+msgstr "Natisni"
 
-#, fuzzy
 msgctxt "wizard_button:ir.module.module.config_wizard,first,action:"
 msgid "Ok"
-msgstr "Oké"
+msgstr "V redu"
 
 msgctxt "wizard_button:ir.module.module.config_wizard,first,end:"
 msgid "Cancel"
-msgstr "Annuleren"
+msgstr "Prekliči"
 
 msgctxt "wizard_button:ir.module.module.config_wizard,other,action:"
 msgid "Next"
-msgstr ""
+msgstr "Naprej"
 
-#, fuzzy
 msgctxt "wizard_button:ir.module.module.config_wizard,other,end:"
 msgid "Cancel"
-msgstr "Annuleren"
+msgstr "Prekliči"
 
-#, fuzzy
 msgctxt "wizard_button:ir.module.module.install_upgrade,done,config:"
 msgid "Ok"
-msgstr "Oké"
+msgstr "V redu"
 
-#, fuzzy
 msgctxt "wizard_button:ir.module.module.install_upgrade,start,end:"
 msgid "Cancel"
-msgstr "Annuleren"
+msgstr "Prekliči"
 
 msgctxt "wizard_button:ir.module.module.install_upgrade,start,upgrade:"
 msgid "Start Upgrade"
-msgstr ""
+msgstr "Nadgradi"
 
 msgctxt "wizard_button:ir.translation.clean,start,clean:"
 msgid "Clean"
-msgstr ""
+msgstr "Počisti"
 
-#, fuzzy
 msgctxt "wizard_button:ir.translation.clean,start,end:"
 msgid "Cancel"
-msgstr "Annuleren"
+msgstr "Prekliči"
 
-#, fuzzy
 msgctxt "wizard_button:ir.translation.clean,succeed,end:"
 msgid "Ok"
-msgstr "Oké"
+msgstr "V redu"
 
-#, fuzzy
 msgctxt "wizard_button:ir.translation.export,result,end:"
 msgid "Close"
-msgstr "Sluiten"
+msgstr "Zapri"
 
-#, fuzzy
 msgctxt "wizard_button:ir.translation.export,start,end:"
 msgid "Cancel"
-msgstr "Annuleren"
+msgstr "Prekliči"
 
-#, fuzzy
 msgctxt "wizard_button:ir.translation.export,start,export:"
 msgid "Export"
-msgstr "Exporteren"
+msgstr "Izvoz"
 
-#, fuzzy
 msgctxt "wizard_button:ir.translation.set,start,end:"
 msgid "Cancel"
-msgstr "Annuleren"
+msgstr "Prekliči"
 
 msgctxt "wizard_button:ir.translation.set,start,set_:"
 msgid "Set"
-msgstr ""
+msgstr "Nastavi"
 
-#, fuzzy
 msgctxt "wizard_button:ir.translation.set,succeed,end:"
 msgid "Ok"
-msgstr "Oké"
+msgstr "V redu"
 
-#, fuzzy
 msgctxt "wizard_button:ir.translation.update,start,end:"
 msgid "Cancel"
-msgstr "Annuleren"
+msgstr "Prekliči"
 
 msgctxt "wizard_button:ir.translation.update,start,update:"
 msgid "Update"
-msgstr ""
+msgstr "Posodobitev"
 
-#, fuzzy
 msgctxt "wizard_button:ir.ui.view.show,start,end:"
 msgid "Close"
-msgstr "Sluiten"
+msgstr "Zapri"
diff --git a/trytond/ir/model.py b/trytond/ir/model.py
index 8a2600a..72e7a28 100644
--- a/trytond/ir/model.py
+++ b/trytond/ir/model.py
@@ -3,6 +3,9 @@
 import datetime
 import re
 import heapq
+from sql.aggregate import Max
+from sql.conditionals import Case
+from collections import defaultdict
 
 from ..model import ModelView, ModelSQL, fields
 from ..report import Report
@@ -12,7 +15,7 @@ from ..cache import Cache
 from ..pool import Pool
 from ..pyson import Bool, Eval
 from ..rpc import RPC
-from ..backend import TableHandler
+from .. import backend
 try:
     from ..tools.StringMatcher import StringMatcher
 except ImportError:
@@ -29,6 +32,7 @@ IDENTIFIER = re.compile(r'^[a-zA-z_][a-zA-Z0-9_]*$')
 class Model(ModelSQL, ModelView):
     "Model"
     __name__ = 'ir.model'
+    _order_name = 'model'
     name = fields.Char('Model Description', translate=True, loading='lazy',
         states={
             'readonly': Bool(Eval('module')),
@@ -68,6 +72,39 @@ class Model(ModelSQL, ModelView):
                 })
 
     @classmethod
+    def register(cls, model, module_name):
+        pool = Pool()
+        Property = pool.get('ir.property')
+        cursor = Transaction().cursor
+
+        ir_model = cls.__table__()
+        cursor.execute(*ir_model.select(ir_model.id,
+                where=ir_model.model == model.__name__))
+        model_id = None
+        if cursor.rowcount == -1 or cursor.rowcount is None:
+            data = cursor.fetchone()
+            if data:
+                model_id, = data
+        elif cursor.rowcount != 0:
+            model_id, = cursor.fetchone()
+        if not model_id:
+            cursor.execute(*ir_model.insert(
+                    [ir_model.model, ir_model.name, ir_model.info,
+                        ir_model.module],
+                    [[model.__name__, model._get_name(), model.__doc__,
+                            module_name]]))
+            Property._models_get_cache.clear()
+            cursor.execute(*ir_model.select(ir_model.id,
+                    where=ir_model.model == model.__name__))
+            (model_id,) = cursor.fetchone()
+        elif model.__doc__:
+            cursor.execute(*ir_model.update(
+                    [ir_model.name, ir_model.info],
+                    [model._get_name(), model.__doc__],
+                    where=ir_model.id == model_id))
+        return model_id
+
+    @classmethod
     def validate(cls, models):
         super(Model, cls).validate(models)
         cls.check_module(models)
@@ -209,6 +246,65 @@ class ModelField(ModelSQL, ModelView):
                 })
         cls._order.insert(0, ('name', 'ASC'))
 
+    @classmethod
+    def register(cls, model, module_name, model_id):
+        pool = Pool()
+        Model = pool.get('ir.model')
+        cursor = Transaction().cursor
+
+        ir_model_field = cls.__table__()
+        ir_model = Model.__table__()
+
+        cursor.execute(*ir_model_field.join(ir_model,
+                condition=ir_model_field.model == ir_model.id
+                ).select(ir_model_field.id.as_('id'),
+                ir_model_field.name.as_('name'),
+                ir_model_field.field_description.as_('field_description'),
+                ir_model_field.ttype.as_('ttype'),
+                ir_model_field.relation.as_('relation'),
+                ir_model_field.module.as_('module'),
+                ir_model_field.help.as_('help'),
+                where=ir_model.model == model.__name__))
+        model_fields = dict((f['name'], f) for f in cursor.dictfetchall())
+
+        for field_name, field in model._fields.iteritems():
+            if hasattr(field, 'model_name'):
+                relation = field.model_name
+            elif hasattr(field, 'relation_name'):
+                relation = field.relation_name
+            else:
+                relation = None
+
+            if field_name not in model_fields:
+                cursor.execute(*ir_model_field.insert(
+                        [ir_model_field.model, ir_model_field.name,
+                            ir_model_field.field_description,
+                            ir_model_field.ttype, ir_model_field.relation,
+                            ir_model_field.help, ir_model_field.module],
+                        [[model_id, field_name, field.string, field._type,
+                                relation, field.help, module_name]]))
+            elif (model_fields[field_name]['field_description'] != field.string
+                    or model_fields[field_name]['ttype'] != field._type
+                    or model_fields[field_name]['relation'] != relation
+                    or model_fields[field_name]['help'] != field.help):
+                cursor.execute(*ir_model_field.update(
+                        [ir_model_field.field_description,
+                            ir_model_field.ttype, ir_model_field.relation,
+                            ir_model_field.help],
+                        [field.string, field._type, relation, field.help],
+                        where=ir_model_field.id ==
+                        model_fields[field_name]['id']))
+
+        # Clean ir_model_field from field that are no more existing.
+        for field_name in model_fields:
+            if model_fields[field_name]['module'] == module_name \
+                    and field_name not in model._fields:
+                #XXX This delete field even when it is defined later
+                # in the module
+                cursor.execute(*ir_model_field.delete(
+                        where=ir_model_field.id ==
+                        model_fields[field_name]['id']))
+
     @staticmethod
     def default_name():
         return 'No Name'
@@ -235,6 +331,7 @@ class ModelField(ModelSQL, ModelView):
     def read(cls, ids, fields_names=None):
         pool = Pool()
         Translation = pool.get('ir.translation')
+        Model = pool.get('ir.model')
 
         to_delete = []
         if Transaction().context.get('language'):
@@ -263,8 +360,9 @@ class ModelField(ModelSQL, ModelView):
                     model_ids.add(rec['model'])
             model_ids = list(model_ids)
             cursor = Transaction().cursor
-            cursor.execute('SELECT id, model FROM ir_model WHERE id IN '
-                '(' + ','.join(('%s',) * len(model_ids)) + ')', model_ids)
+            model = Model.__table__()
+            cursor.execute(*model.select(model.id, model.model,
+                    where=model.id.in_(model_ids)))
             id2model = dict(cursor.fetchall())
 
             trans_args = []
@@ -335,6 +433,7 @@ class ModelAccess(ModelSQL, ModelView):
 
     @classmethod
     def __register__(cls, module_name):
+        TableHandler = backend.get('TableHandler')
         cursor = Transaction().cursor
 
         super(ModelAccess, cls).__register__(module_name)
@@ -367,11 +466,18 @@ class ModelAccess(ModelSQL, ModelView):
     @classmethod
     def get_access(cls, models):
         'Return access for models'
+        # root user above constraint
+        if Transaction().user == 0:
+            return defaultdict(lambda: defaultdict(lambda: True))
+
         pool = Pool()
         Model = pool.get('ir.model')
         UserGroup = pool.get('res.user-res.group')
         cursor = Transaction().cursor
         user = Transaction().user
+        model_access = cls.__table__()
+        ir_model = Model.__table__()
+        user_group = UserGroup.__table__()
 
         access = {}
         for model in models:
@@ -384,22 +490,19 @@ class ModelAccess(ModelSQL, ModelView):
 
         default = {'read': True, 'write': True, 'create': True, 'delete': True}
         access = dict((m, default) for m in models)
-        cursor.execute(('SELECT '
-                    'm.model, '
-                    'MAX(CASE WHEN a.perm_read THEN 1 ELSE 0 END), '
-                    'MAX(CASE WHEN a.perm_write THEN 1 ELSE 0 END), '
-                    'MAX(CASE WHEN a.perm_create THEN 1 ELSE 0 END), '
-                    'MAX(CASE WHEN a.perm_delete THEN 1 ELSE 0 END) '
-                'FROM "%s" AS a '
-                'JOIN "%s" AS m '
-                    'ON (a.model = m.id) '
-                'LEFT JOIN "%s" AS gu '
-                    'ON (gu."group" = a."group") '
-                'WHERE m.model IN (' + ','.join(('%%s',) * len(models)) + ') '
-                    'AND (gu."user" = %%s OR a."group" IS NULL) '
-                'GROUP BY m.model')
-            % (cls._table, Model._table, UserGroup._table),
-            list(models) + [Transaction().user])
+        cursor.execute(*model_access.join(ir_model, 'LEFT',
+                condition=model_access.model == ir_model.id
+                ).join(user_group, 'LEFT',
+                condition=user_group.group == model_access.group
+                ).select(
+                ir_model.model,
+                Max(Case((model_access.perm_read, 1), else_=0)),
+                Max(Case((model_access.perm_write, 1), else_=0)),
+                Max(Case((model_access.perm_create, 1), else_=0)),
+                Max(Case((model_access.perm_delete, 1), else_=0)),
+                where=ir_model.model.in_(models)
+                & ((user_group.user == user) | (model_access.group == None)),
+                group_by=ir_model.model))
         access.update(dict(
                 (m, {'read': r, 'write': w, 'create': c, 'delete': d})
                 for m, r, w, c, d in cursor.fetchall()))
@@ -470,6 +573,7 @@ class ModelFieldAccess(ModelSQL, ModelView):
 
     @classmethod
     def __register__(cls, module_name):
+        TableHandler = backend.get('TableHandler')
         cursor = Transaction().cursor
 
         super(ModelFieldAccess, cls).__register__(module_name)
@@ -502,11 +606,21 @@ class ModelFieldAccess(ModelSQL, ModelView):
     @classmethod
     def get_access(cls, models):
         'Return fields access for models'
+        # root user above constraint
+        if Transaction().user == 0:
+            return defaultdict(lambda: defaultdict(
+                    lambda: defaultdict(lambda: True)))
+
         pool = Pool()
         Model = pool.get('ir.model')
         ModelField = pool.get('ir.model.field')
+        UserGroup = pool.get('res.user-res.group')
         cursor = Transaction().cursor
         user = Transaction().user
+        field_access = cls.__table__()
+        ir_model = Model.__table__()
+        model_field = ModelField.__table__()
+        user_group = UserGroup.__table__()
 
         accesses = {}
         for model in models:
@@ -519,25 +633,22 @@ class ModelFieldAccess(ModelSQL, ModelView):
 
         default = {}
         accesses = dict((m, default) for m in models)
-        cursor.execute(('SELECT '
-                    'm.model, '
-                    'f.name, '
-                    'MAX(CASE WHEN a.perm_read THEN 1 ELSE 0 END), '
-                    'MAX(CASE WHEN a.perm_write THEN 1 ELSE 0 END), '
-                    'MAX(CASE WHEN a.perm_create THEN 1 ELSE 0 END), '
-                    'MAX(CASE WHEN a.perm_delete THEN 1 ELSE 0 END) '
-                'FROM "%s" AS a '
-                'JOIN "%s" AS f '
-                    'ON (a.field = f.id) '
-                'JOIN "%s" AS m '
-                    'ON (f.model = m.id) '
-                'LEFT JOIN "res_user-res_group" AS gu '
-                    'ON (gu."group" = a."group") '
-                'WHERE m.model IN (' + ','.join(('%%s',) * len(models)) + ') '
-                    'AND (gu."user" = %%s OR a."group" IS NULL) '
-                'GROUP BY m.model, f.name')
-            % (cls._table, ModelField._table, Model._table),
-            list(models) + [Transaction().user])
+        cursor.execute(*field_access.join(model_field,
+                condition=field_access.field == model_field.id
+                ).join(ir_model,
+                condition=model_field.model == ir_model.id
+                ).join(user_group, 'LEFT',
+                condition=user_group.group == field_access.group
+                ).select(
+                ir_model.model,
+                model_field.name,
+                Max(Case((field_access.perm_read, 1), else_=0)),
+                Max(Case((field_access.perm_write, 1), else_=0)),
+                Max(Case((field_access.perm_create, 1), else_=0)),
+                Max(Case((field_access.perm_delete, 1), else_=0)),
+                where=ir_model.model.in_(models)
+                & ((user_group.user == user) | (field_access.group == None)),
+                group_by=[ir_model.model, model_field.name]))
         for m, f, r, w, c, d in cursor.fetchall():
             accesses[m][f] = {'read': r, 'write': w, 'create': c, 'delete': d}
         for model, maccesses in accesses.iteritems():
@@ -679,7 +790,9 @@ class ModelData(ModelSQL, ModelView):
 
     @classmethod
     def __register__(cls, module_name):
+        TableHandler = backend.get('TableHandler')
         cursor = Transaction().cursor
+        model_data = cls.__table__()
 
         super(ModelData, cls).__register__(module_name)
 
@@ -687,8 +800,8 @@ class ModelData(ModelSQL, ModelView):
 
         # Migration from 2.6: remove inherit
         if table.column_exist('inherit'):
-            cursor.execute('DELETE FROM "' + cls._table + '" '
-                'WHERE inherit = %s', (True,))
+            cursor.execute(*model_data.delete(
+                    where=model_data.inherit == True))
             table.drop_column('inherit', True)
 
     @staticmethod
diff --git a/trytond/ir/module/module.py b/trytond/ir/module/module.py
index 62d2e7f..5322ca4 100644
--- a/trytond/ir/module/module.py
+++ b/trytond/ir/module/module.py
@@ -4,7 +4,7 @@ from trytond.model import ModelView, ModelSQL, fields
 from trytond.modules import create_graph, get_module_list, get_module_info
 from trytond.wizard import Wizard, StateView, Button, StateTransition, \
     StateAction
-from trytond.backend import TableHandler
+from trytond import backend
 from trytond.pool import Pool
 from trytond.transaction import Transaction
 from trytond.pyson import Eval
@@ -339,6 +339,7 @@ class ModuleConfigWizardItem(ModelSQL, ModelView):
 
     @classmethod
     def __register__(cls, module_name):
+        TableHandler = backend.get('TableHandler')
         table = TableHandler(Transaction().cursor, cls, module_name)
 
         # Migrate from 2.2 remove name
diff --git a/trytond/ir/module/module.xml b/trytond/ir/module/module.xml
index e93f304..33a716a 100644
--- a/trytond/ir/module/module.xml
+++ b/trytond/ir/module/module.xml
@@ -18,7 +18,7 @@ this repository contains the full copyright notices and license terms. -->
             <field name="name">Modules</field>
             <field name="type">ir.action.act_window</field>
             <field name="res_model">ir.module.module</field>
-            <field name="domain">[('name', '!=', 'test')]</field>
+            <field name="domain">[('name', '!=', 'tests')]</field>
         </record>
         <record model="ir.action.act_window.view"
             id="act_module_form_view1">
diff --git a/trytond/ir/property.py b/trytond/ir/property.py
index 4d82923..9567c45 100644
--- a/trytond/ir/property.py
+++ b/trytond/ir/property.py
@@ -23,11 +23,15 @@ class Property(ModelSQL, ModelView):
 
     @classmethod
     def models_get(cls):
+        pool = Pool()
+        Model = pool.get('ir.model')
         models = cls._models_get_cache.get(None)
         if models:
             return models
         cursor = Transaction().cursor
-        cursor.execute('SELECT model, name FROM ir_model ORDER BY name ASC')
+        model = Model.__table__()
+        cursor.execute(*model.select(model.model, model.name,
+                order_by=model.name.asc))
         models = cursor.fetchall() + [('', '')]
         cls._models_get_cache.set(None, models)
         return models
diff --git a/trytond/ir/property.xml b/trytond/ir/property.xml
index 6ce4815..a7e1718 100644
--- a/trytond/ir/property.xml
+++ b/trytond/ir/property.xml
@@ -17,7 +17,7 @@ this repository contains the full copyright notices and license terms. -->
             <field name="name">Default Properties</field>
             <field name="type">ir.action.act_window</field>
             <field name="res_model">ir.property</field>
-            <field name="domain">[('res','=',False)]</field>
+            <field name="domain">[('res', '=', None)]</field>
         </record>
         <record model="ir.action.act_window.view"
             id="act_property_form_view1_default">
diff --git a/trytond/ir/rule.py b/trytond/ir/rule.py
index 496b1a5..99c0f14 100644
--- a/trytond/ir/rule.py
+++ b/trytond/ir/rule.py
@@ -9,7 +9,7 @@ from ..tools import safe_eval
 from ..transaction import Transaction
 from ..cache import Cache
 from ..pool import Pool
-from ..backend import TableHandler
+from .. import backend
 
 __all__ = [
     'RuleGroup', 'Rule',
@@ -111,6 +111,7 @@ class Rule(ModelSQL, ModelView):
 
     @classmethod
     def __register__(cls, module_name):
+        TableHandler = backend.get('TableHandler')
         super(Rule, cls).__register__(module_name)
         table = TableHandler(Transaction().cursor, cls, module_name)
 
@@ -131,7 +132,7 @@ class Rule(ModelSQL, ModelView):
             try:
                 value = safe_eval(rule.domain, ctx)
             except Exception:
-                return False
+                cls.raise_user_error('invalid_domain', (rule.rec_name,))
             if not isinstance(value, list):
                 cls.raise_user_error('invalid_domain', (rule.rec_name,))
             else:
@@ -161,13 +162,13 @@ class Rule(ModelSQL, ModelView):
         # root user above constraint
         if Transaction().user == 0:
             if not Transaction().context.get('user'):
-                return '', []
+                return
             with Transaction().set_user(Transaction().context['user']):
                 return cls.domain_get(model_name, mode=mode)
 
         key = (model_name, mode)
-        domain = cls._domain_get_cache.get(key)
-        if domain:
+        domain = cls._domain_get_cache.get(key, False)
+        if domain is not False:
             return domain
 
         pool = Pool()
@@ -178,32 +179,40 @@ class Rule(ModelSQL, ModelView):
         User_Group = pool.get('res.user-res.group')
 
         cursor = Transaction().cursor
-        cursor.execute('SELECT r.id FROM "' + cls._table + '" r '
-            'JOIN "' + RuleGroup._table + '" g '
-                "ON (g.id = r.rule_group) "
-            'JOIN "' + Model._table + '" m ON (g.model = m.id) '
-            "WHERE m.model = %s "
-                "AND g.perm_" + mode + " "
-                "AND (g.id IN ("
-                        'SELECT rule_group '
-                        'FROM "' + RuleGroup_User._table + '" '
-                        'WHERE "user" = %s '
-                        "UNION SELECT rule_group "
-                        'FROM "' + RuleGroup_Group._table + '" g_rel '
-                        'JOIN "' + User_Group._table + '" u_rel '
-                            'ON (g_rel."group" = u_rel."group") '
-                        'WHERE u_rel."user" = %s) '
-                    "OR default_p "
-                    "OR g.global_p)",
-                (model_name, Transaction().user, Transaction().user))
+        rule_table = cls.__table__()
+        rule_group = RuleGroup.__table__()
+        rule_group_user = RuleGroup_User.__table__()
+        rule_group_group = RuleGroup_Group.__table__()
+        user_group = User_Group.__table__()
+        model = Model.__table__()
+        user_id = Transaction().user
+        cursor.execute(*rule_table.join(rule_group,
+                condition=rule_group.id == rule_table.rule_group
+                ).join(model,
+                condition=rule_group.model == model.id
+                ).select(rule_table.id,
+                where=(model.model == model_name)
+                & getattr(rule_group, 'perm_%s' % mode)
+                & (rule_group.id.in_(
+                        rule_group_user.select(rule_group_user.rule_group,
+                            where=rule_group_user.user == user_id)
+                        | rule_group_group.join(
+                            user_group,
+                            condition=(rule_group_group.group
+                                == user_group.group)
+                            ).select(rule_group_group.rule_group,
+                            where=user_group.user == user_id)
+                        )
+                    | rule_group.default_p
+                    | rule_group.global_p
+                    )))
         ids = [x[0] for x in cursor.fetchall()]
         if not ids:
-            cls._domain_get_cache.set(key, ('', []))
-            return '', []
+            cls._domain_get_cache.set(key, None)
+            return
         obj = pool.get(model_name)
         clause = {}
         clause_global = {}
-        user_id = Transaction().user
         ctx = cls._get_context()
         # Use root user without context to prevent recursion
         with contextlib.nested(Transaction().set_user(0),
@@ -220,20 +229,18 @@ class Rule(ModelSQL, ModelView):
                     clause[rule.rule_group.id].append(dom)
 
         # Test if there is no rule_group that have no rule
-        cursor.execute('SELECT g.id FROM "' + RuleGroup._table + '" g '
-                'JOIN "' + Model._table + '" m ON (g.model = m.id) '
-            'WHERE m.model = %s '
-                'AND (g.id NOT IN (SELECT rule_group '
-                        'FROM "' + cls._table + '")) '
-                'AND (g.id IN (SELECT rule_group '
-                        'FROM "' + RuleGroup_User._table + '" '
-                        'WHERE "user" = %s '
-                        'UNION SELECT rule_group '
-                        'FROM "' + RuleGroup_Group._table + '" g_rel '
-                            'JOIN "' + User_Group._table + '" u_rel '
-                                'ON g_rel."group" = u_rel."group" '
-                        'WHERE u_rel."user" = %s))',
-            (model_name, user_id, user_id))
+        cursor.execute(*rule_group.join(model,
+                condition=rule_group.model == model.id
+                ).select(rule_group.id,
+                where=(model.model == model_name)
+                & ~rule_group.id.in_(rule_table.select(rule_table.rule_group))
+                & rule_group.id.in_(rule_group_user.select(
+                        rule_group_user.rule_group,
+                        where=rule_group_user.user == user_id)
+                    | rule_group_group.join(user_group,
+                        condition=rule_group_group.group == user_group.group
+                        ).select(rule_group_group.rule_group,
+                        where=user_group.user == user_id))))
         fetchone = cursor.fetchone()
         if fetchone:
             group_id = fetchone[0]
@@ -250,11 +257,10 @@ class Rule(ModelSQL, ModelView):
         # Use root to prevent infinite recursion
         with contextlib.nested(Transaction().set_user(0),
                 Transaction().set_context(active_test=False, user=0)):
-            query, val = obj.search(clause, order=[], query_string=True)
-        query = '("%s".id IN (%s))' % (obj._table, query)
+            query = obj.search(clause, order=[], query=True)
 
-        cls._domain_get_cache.set(key, (query, val))
-        return query, val
+        cls._domain_get_cache.set(key, query)
+        return query
 
     @classmethod
     def delete(cls, rules):
diff --git a/trytond/ir/sequence.py b/trytond/ir/sequence.py
index b0ba873..8637f48 100644
--- a/trytond/ir/sequence.py
+++ b/trytond/ir/sequence.py
@@ -3,13 +3,15 @@
 from string import Template
 import time
 from itertools import izip
+from sql import Flavor
+
 from ..model import ModelView, ModelSQL, fields
 from ..tools import datetime_strftime
 from ..pyson import Eval, And
 from ..transaction import Transaction
 from ..pool import Pool
 from ..config import CONFIG
-from ..backend import TableHandler
+from .. import backend
 
 __all__ = [
     'SequenceType', 'Sequence', 'SequenceStrict',
@@ -99,6 +101,7 @@ class Sequence(ModelSQL, ModelView):
 
     @classmethod
     def __register__(cls, module_name):
+        TableHandler = backend.get('TableHandler')
         cursor = Transaction().cursor
         table = TableHandler(cursor, cls, module_name)
 
@@ -242,17 +245,20 @@ class Sequence(ModelSQL, ModelView):
     def create_sql_sequence(self, number_next=None):
         'Create the SQL sequence'
         cursor = Transaction().cursor
+        param = Flavor.get().param
         if self.type != 'incremental':
             return
         if number_next is None:
             number_next = self.number_next
         cursor.execute('CREATE SEQUENCE "' + self._sql_sequence_name
-            + '" INCREMENT BY %s START WITH %s',
+            + '" INCREMENT BY ' + param + ' START WITH ' + param,
             (self.number_increment, number_next))
 
     def update_sql_sequence(self, number_next=None):
         'Update the SQL sequence'
+        TableHandler = backend.get('TableHandler')
         cursor = Transaction().cursor
+        param = Flavor.get().param
         exist = TableHandler.sequence_exist(cursor, self._sql_sequence_name)
         if self.type != 'incremental':
             if exist:
@@ -264,7 +270,7 @@ class Sequence(ModelSQL, ModelView):
         if number_next is None:
             number_next = self.number_next
         cursor.execute('ALTER SEQUENCE "' + self._sql_sequence_name
-            + '" INCREMENT BY %s RESTART WITH %s',
+            + '" INCREMENT BY ' + param + ' RESTART WITH ' + param,
             (self.number_increment, number_next))
 
     def delete_sql_sequence(self):
diff --git a/trytond/ir/session.py b/trytond/ir/session.py
index 1ebdd79..e6512ae 100644
--- a/trytond/ir/session.py
+++ b/trytond/ir/session.py
@@ -9,7 +9,7 @@ import datetime
 
 from trytond.model import ModelSQL, fields
 from trytond.config import CONFIG
-from ..backend import TableHandler
+from .. import backend
 from ..transaction import Transaction
 
 __all__ = [
@@ -31,6 +31,7 @@ class Session(ModelSQL):
 
     @classmethod
     def __register__(cls, module_name):
+        TableHandler = backend.get('TableHandler')
         super(Session, cls).__register__(module_name)
 
         table = TableHandler(Transaction().cursor, cls, module_name)
diff --git a/trytond/ir/time_locale.py b/trytond/ir/time_locale.py
index f41d1b4..e977b76 100644
--- a/trytond/ir/time_locale.py
+++ b/trytond/ir/time_locale.py
@@ -422,4 +422,39 @@ TIME_LOCALE = \
                   u'\u043e\u043a\u0442.',
                   u'\u043d\u043e\u044f\u0431.',
                   u'\u0434\u0435\u043a.'],
-           '%p': [u'', u'']}}
+           '%p': [u'', u'']},
+  'sl_SI': {'%A':  [u'ponedeljek',
+                    u'torek',
+                    u'sreda',
+                    u'\u010detrtek',
+                    u'petek',
+                    u'sobota',
+                    u'nedelja'],
+             '%B': [None,
+                    u'januar',
+                    u'februar',
+                    u'marec',
+                    u'april',
+                    u'maj',
+                    u'junij',
+                    u'julij',
+                    u'avgust',
+                    u'september',
+                    u'oktober',
+                    u'november',
+                    u'december'],
+             '%a': [u'pon', u'tor', u'sre', u'\u010det', u'pet', u'sob', u'ned'],
+             '%b': [None,
+                    u'jan',
+                    u'feb',
+                    u'mar',
+                    u'apr',
+                    u'maj',
+                    u'jun',
+                    u'jul',
+                    u'avg',
+                    u'sep',
+                    u'okt',
+                    u'nov',
+                    u'dec'],
+             '%p': [u'', u'']}}
diff --git a/trytond/ir/translation.py b/trytond/ir/translation.py
index 5b92df8..3f13f68 100644
--- a/trytond/ir/translation.py
+++ b/trytond/ir/translation.py
@@ -14,18 +14,24 @@ try:
     from hashlib import md5
 except ImportError:
     from md5 import md5
-from functools import reduce
 from lxml import etree
+from itertools import izip
+from sql import Column
+from sql.functions import Substring, Position
+from sql.conditionals import Case
+from sql.operators import Or, And
+from sql.aggregate import Max
 
 from ..model import ModelView, ModelSQL, fields
 from ..wizard import Wizard, StateView, StateTransition, StateAction, \
     Button
 from ..tools import file_open, reduce_ids
-from ..backend import TableHandler, FIELDS
+from .. import backend
 from ..pyson import PYSONEncoder
 from ..transaction import Transaction
 from ..pool import Pool
 from ..cache import Cache
+from ..const import RECORD_CACHE_SIZE
 
 __all__ = ['Translation',
     'TranslationSetStart', 'TranslationSetSucceed', 'TranslationSet',
@@ -58,7 +64,7 @@ class Translation(ModelSQL, ModelView):
     __name__ = "ir.translation"
 
     name = fields.Char('Field Name', required=True)
-    res_id = fields.Integer('Resource ID', select=True)
+    res_id = fields.Integer('Resource ID', select=True, required=True)
     lang = fields.Selection('get_language', string='Language')
     type = fields.Selection(TRANSLATION_TYPE, string='Type',
        required=True)
@@ -69,8 +75,10 @@ class Translation(ModelSQL, ModelView):
     fuzzy = fields.Boolean('Fuzzy')
     model = fields.Function(fields.Char('Model'), 'get_model',
             searcher='search_model')
+    overriding_module = fields.Char('Overriding Module', readonly=True)
     _translation_cache = Cache('ir.translation', size_limit=10240,
         context=False)
+    _get_language_cache = Cache('ir.translation')
 
     @classmethod
     def __setup__(cls):
@@ -80,17 +88,24 @@ class Translation(ModelSQL, ModelView):
                 'UNIQUE (name, res_id, lang, type, src_md5, module)',
                 'Translation must be unique'),
         ]
+        cls._error_messages.update({
+                'translation_overridden': (
+                    "You can not export translation %(name)s because it is an "
+                    "overridden translation by module %(overriding_module)s"),
+                })
 
     @classmethod
     def __register__(cls, module_name):
+        TableHandler = backend.get('TableHandler')
         cursor = Transaction().cursor
+        ir_translation = cls.__table__()
         table = TableHandler(cursor, cls, module_name)
         # Migration from 1.8: new field src_md5
         src_md5_exist = table.column_exist('src_md5')
         if not src_md5_exist:
             table.add_raw_column('src_md5',
-                FIELDS[cls.src_md5._type].sql_type(cls.src_md5),
-                FIELDS[cls.src_md5._type].sql_format, None,
+                cls.src_md5.sql_type(),
+                cls.src_md5.sql_format, None,
                 cls.src_md5.size, string=cls.src_md5.string)
         table.drop_constraint('translation_uniq')
         table.index_action(['lang', 'type', 'name', 'src'], 'remove')
@@ -114,18 +129,214 @@ class Translation(ModelSQL, ModelView):
             table.not_null_action('src_md5', action='add')
 
         # Migration from 2.2
-        cursor.execute("UPDATE " + cls._table + " "
-            "SET res_id = %s "
-            "WHERE res_id = %s",
-            (None, 0))
+        cursor.execute(*ir_translation.update([ir_translation.res_id],
+                [None], where=ir_translation.res_id == 0))
+
+        # Migration from 2.8
+        cursor.execute(*ir_translation.update([ir_translation.res_id],
+                [-1], where=ir_translation.res_id == None))
 
         table = TableHandler(Transaction().cursor, cls, module_name)
         table.index_action(['lang', 'type', 'name'], 'add')
 
+    @classmethod
+    def register_model(cls, model, module_name):
+        cursor = Transaction().cursor
+        ir_translation = cls.__table__()
+
+        if not model.__doc__:
+            return
+
+        name = model.__name__ + ',name'
+        src = model._get_name()
+        cursor.execute(*ir_translation.select(ir_translation.id,
+                where=(ir_translation.lang == 'en_US')
+                & (ir_translation.type == 'model')
+                & (ir_translation.name == name)
+                # Keep searching on all values for migration
+                & ((ir_translation.res_id == -1)
+                    | (ir_translation.res_id == None)
+                    | (ir_translation.res_id == 0))))
+        trans_id = None
+        if cursor.rowcount == -1 or cursor.rowcount is None:
+            data = cursor.fetchone()
+            if data:
+                trans_id, = data
+        elif cursor.rowcount != 0:
+            trans_id, = cursor.fetchone()
+        src_md5 = Translation.get_src_md5(src)
+        if trans_id is None:
+            cursor.execute(*ir_translation.insert(
+                    [Column(ir_translation, c)
+                        for c in ('name', 'lang', 'type', 'src', 'src_md5',
+                            'value', 'module', 'fuzzy', 'res_id')],
+                    [[name, 'en_US', 'model', src, src_md5, '',
+                            module_name, False, -1]]))
+        else:
+            cursor.execute(*ir_translation.update(
+                    [ir_translation.src, ir_translation.src_md5],
+                    [src, src_md5],
+                    where=ir_translation.id == trans_id))
+
+    @classmethod
+    def register_fields(cls, model, module_name):
+        cursor = Transaction().cursor
+        ir_translation = cls.__table__()
+
+        # Prefetch field translations
+        trans_fields = {}
+        trans_help = {}
+        trans_selection = {}
+        if model._fields:
+            names = ['%s,%s' % (model.__name__, f) for f in model._fields]
+            cursor.execute(*ir_translation.select(ir_translation.id,
+                    ir_translation.name, ir_translation.src,
+                    ir_translation.type,
+                    where=((ir_translation.lang == 'en_US')
+                        & ir_translation.type.in_(
+                            ('field', 'help', 'selection'))
+                        & ir_translation.name.in_(names))))
+            for trans in cursor.dictfetchall():
+                if trans['type'] == 'field':
+                    trans_fields[trans['name']] = trans
+                elif trans['type'] == 'help':
+                    trans_help[trans['name']] = trans
+                elif trans['type'] == 'selection':
+                    trans_selection.setdefault(trans['name'], {})
+                    trans_selection[trans['name']][trans['src']] = trans
+
+        def update_insert_field(field, trans_name):
+            string_md5 = cls.get_src_md5(field.string)
+            if trans_name not in trans_fields:
+                cursor.execute(*ir_translation.insert(
+                        [ir_translation.name, ir_translation.lang,
+                            ir_translation.type, ir_translation.src,
+                            ir_translation.src_md5, ir_translation.value,
+                            ir_translation.module, ir_translation.fuzzy,
+                            ir_translation.res_id],
+                        [[trans_name, 'en_US', 'field', field.string,
+                                string_md5, '', module_name, False, -1]]))
+            elif trans_fields[trans_name]['src'] != field.string:
+                cursor.execute(*ir_translation.update(
+                        [ir_translation.src, ir_translation.src_md5],
+                        [field.string, string_md5],
+                        where=ir_translation.id ==
+                        trans_fields[trans_name]['id']))
+
+        def update_insert_help(field, trans_name):
+            help_md5 = cls.get_src_md5(field.help)
+            if trans_name not in trans_help:
+                if field.help:
+                    cursor.execute(*ir_translation.insert(
+                            [ir_translation.name, ir_translation.lang,
+                                ir_translation.type, ir_translation.src,
+                                ir_translation.src_md5, ir_translation.value,
+                                ir_translation.module, ir_translation.fuzzy,
+                                ir_translation.res_id],
+                            [[trans_name, 'en_US', 'help', field.help,
+                                    help_md5, '', module_name, False, -1]]))
+            elif trans_help[trans_name]['src'] != field.help:
+                cursor.execute(*ir_translation.update(
+                        [ir_translation.src, ir_translation.src_md5],
+                        [field.help, help_md5],
+                        where=ir_translation.id ==
+                        trans_help[trans_name]['id']))
+
+        def insert_selection(field, trans_name):
+            for (_, val) in field.selection:
+                if (trans_name not in trans_selection
+                        or val not in trans_selection[trans_name]):
+                    val_md5 = cls.get_src_md5(val)
+                    cursor.execute(*ir_translation.insert(
+                            [ir_translation.name, ir_translation.lang,
+                                ir_translation.type, ir_translation.src,
+                                ir_translation.src_md5, ir_translation.value,
+                                ir_translation.module, ir_translation.fuzzy,
+                                ir_translation.res_id],
+                            [[trans_name, 'en_US', 'selection', val, val_md5,
+                                    '', module_name, False, -1]]))
+
+        for field_name, field in model._fields.iteritems():
+            trans_name = model.__name__ + ',' + field_name
+            update_insert_field(field, trans_name)
+            update_insert_help(field, trans_name)
+            if (hasattr(field, 'selection')
+                    and isinstance(field.selection, (tuple, list))
+                    and getattr(field, 'translate_selection', True)):
+                insert_selection(field, trans_name)
+
+    @classmethod
+    def register_error_messages(cls, model, module_name):
+        cursor = Transaction().cursor
+        ir_translation = cls.__table__()
+
+        cursor.execute(*ir_translation.select(
+                ir_translation.id, ir_translation.src,
+                where=((ir_translation.lang == 'en_US')
+                    & (ir_translation.type == 'error')
+                    & (ir_translation.name == model.__name__))))
+        trans_error = dict((t['src'], t) for t in cursor.dictfetchall())
+
+        errors = model._get_error_messages()
+        for error in set(errors):
+            if error not in trans_error:
+                error_md5 = Translation.get_src_md5(error)
+                cursor.execute(*ir_translation.insert(
+                        [ir_translation.name, ir_translation.lang,
+                            ir_translation.type, ir_translation.src,
+                            ir_translation.src_md5, ir_translation.value,
+                            ir_translation.module, ir_translation.fuzzy,
+                            ir_translation.res_id],
+                        [[model.__name__, 'en_US', 'error', error, error_md5,
+                                '', module_name, False, -1]]))
+
+    @classmethod
+    def register_wizard(cls, wizard, module_name):
+        cursor = Transaction().cursor
+        ir_translation = cls.__table__()
+
+        # Prefetch button translations
+        cursor.execute(*ir_translation.select(
+                ir_translation.id, ir_translation.name, ir_translation.src,
+                where=((ir_translation.lang == 'en_US')
+                    & (ir_translation.type == 'wizard_button')
+                    & (ir_translation.name.like(wizard.__name__ + ',%')))))
+        trans_buttons = dict((t['name'], t) for t in cursor.dictfetchall())
+
+        def update_insert_button(state_name, button):
+            trans_name = '%s,%s,%s' % (
+                wizard.__name__, state_name, button.state)
+            src_md5 = cls.get_src_md5(button.string)
+            if trans_name not in trans_buttons:
+                cursor.execute(*ir_translation.insert(
+                        [ir_translation.name, ir_translation.lang,
+                            ir_translation.type, ir_translation.src,
+                            ir_translation.src_md5, ir_translation.value,
+                            ir_translation.module, ir_translation.fuzzy,
+                            ir_translation.res_id],
+                        [[trans_name, 'en_US', 'wizard_button', button.string,
+                                src_md5, '', module_name, False, -1]]))
+            elif trans_buttons[trans_name] != button.string:
+                cursor.execute(*ir_translation.update(
+                        [ir_translation.src, ir_translation.src_md5],
+                        [button.string, src_md5],
+                        where=ir_translation.id ==
+                        trans_buttons[trans_name]['id']))
+
+        for state_name, state in wizard.states.iteritems():
+            if not isinstance(state, StateView):
+                continue
+            for button in state.buttons:
+                update_insert_button(state_name, button)
+
     @staticmethod
     def default_fuzzy():
         return False
 
+    @staticmethod
+    def default_res_id():
+        return -1
+
     def get_model(self, name):
         return self.name.split(',')[0]
 
@@ -142,22 +353,26 @@ class Translation(ModelSQL, ModelView):
 
     @classmethod
     def search_model(cls, name, clause):
-        cursor = Transaction().cursor
-        cursor.execute('SELECT id FROM "%s" '
-            'WHERE SUBSTR(name, 1, '
-            'CASE WHEN POSITION(\',\' IN name) > 0 '
-                'THEN POSITION(\',\' IN name) - 1 '
-                'ELSE 0 END) %s %%s' %
-            (cls._table, clause[1]), (clause[2],))
-        return [('id', 'in', [x[0] for x in cursor.fetchall()])]
+        table = cls.__table__()
+        _, operator, value = clause
+        Operator = fields.SQL_OPERATORS[operator]
+        return [('id', 'in', table.select(table.id,
+                    where=Operator(Substring(table.name, 1,
+                            Case((Position(',', table.name) > 0,
+                                    Position(',', table.name) - 1),
+                                else_=0)), value)))]
 
     @classmethod
     def get_language(cls):
+        result = cls._get_language_cache.get(None)
+        if result is not None:
+            return result
         pool = Pool()
         Lang = pool.get('ir.lang')
         langs = Lang.search([])
-        res = [(lang.code, lang.name) for lang in langs]
-        return res
+        result = [(lang.code, lang.name) for lang in langs]
+        cls._get_language_cache.set(None, result)
+        return result
 
     @classmethod
     def get_src_md5(cls, src):
@@ -217,24 +432,25 @@ class Translation(ModelSQL, ModelView):
             to_fetch = ids
         if to_fetch:
             cursor = Transaction().cursor
-            fuzzy_sql = 'AND fuzzy = %s '
-            fuzzy = [False]
+            table = cls.__table__()
+            fuzzy_sql = table.fuzzy == False
             if Transaction().context.get('fuzzy_translation', False):
-                fuzzy_sql = ''
-                fuzzy = []
-            for i in range(0, len(to_fetch), cursor.IN_MAX):
-                sub_to_fetch = to_fetch[i:i + cursor.IN_MAX]
-                red_sql, red_ids = reduce_ids('res_id', sub_to_fetch)
-                cursor.execute('SELECT res_id, value '
-                    'FROM ir_translation '
-                    'WHERE lang = %s '
-                        'AND type = %s '
-                        'AND name = %s '
-                        'AND value != \'\' '
-                        'AND value IS NOT NULL '
-                        + fuzzy_sql +
-                        'AND ' + red_sql,
-                    [lang, ttype, name] + fuzzy + red_ids)
+                fuzzy_sql = None
+            in_max = cursor.IN_MAX / 7
+            for i in range(0, len(to_fetch), in_max):
+                sub_to_fetch = to_fetch[i:i + in_max]
+                red_sql = reduce_ids(table.res_id, sub_to_fetch)
+                where = And(((table.lang == lang),
+                        (table.type == ttype),
+                        (table.name == name),
+                        (table.value != ''),
+                        (table.value != None),
+                        red_sql,
+                        ))
+                if fuzzy_sql:
+                    where &= fuzzy_sql
+                cursor.execute(*table.select(table.res_id, table.value,
+                        where=where))
                 for res_id, value in cursor.fetchall():
                     # Don't store fuzzy translation in cache
                     if not Transaction().context.get(
@@ -249,12 +465,21 @@ class Translation(ModelSQL, ModelView):
         return translations
 
     @classmethod
-    def set_ids(cls, name, ttype, lang, ids, value):
+    def set_ids(cls, name, ttype, lang, ids, values):
         "Set translation for each id"
         pool = Pool()
         ModelFields = pool.get('ir.model.field')
         Model = pool.get('ir.model')
         Config = pool.get('ir.configuration')
+        cursor = Transaction().cursor
+        in_max = cursor.IN_MAX
+
+        if len(ids) > in_max:
+            for i in range(0, len(ids), in_max):
+                sub_ids = ids[i:i + in_max]
+                sub_values = values[i:i + in_max]
+                cls.set_ids(name, ttype, lang, sub_ids, sub_values)
+            return
 
         model_name, field_name = name.split(',')
         if model_name in ('ir.model.field', 'ir.model'):
@@ -269,74 +494,99 @@ class Translation(ModelSQL, ModelView):
                 ttype = 'model'
                 with Transaction().set_context(language='en_US'):
                     records = Model.browse(ids)
-            for record in records:
+
+            def get_name(record):
                 if ttype in ('field', 'help'):
-                    name = record.model.model + ',' + record.name
+                    return record.model.model + ',' + record.name
                 else:
-                    name = record.model + ',' + field_name
-                translation2 = cls.search([
-                    ('lang', '=', lang),
-                    ('type', '=', ttype),
-                    ('name', '=', name),
-                    ])
-                with Transaction().set_user(0):
-                    if not translation2:
-                        cls.create([{
-                                    'name': name,
-                                    'lang': lang,
-                                    'type': ttype,
-                                    'src': getattr(record, field_name),
-                                    'value': value,
-                                    'fuzzy': False,
-                                    }])
-                    else:
-                        cls.write(translation2, {
+                    return record.model + ',' + field_name
+
+            translations = {}
+            for translation in cls.search([
+                        ('lang', '=', lang),
+                        ('type', '=', ttype),
+                        ('name', 'in', [get_name(r) for r in records]),
+                        ]):
+                translations[translation.name] = translation
+
+            to_create = []
+            for record, value in izip(records, values):
+                translation = translations.get(get_name(record))
+                if not translation:
+                    to_create.append({
+                            'name': name,
+                            'lang': lang,
+                            'type': ttype,
                             'src': getattr(record, field_name),
                             'value': value,
                             'fuzzy': False,
                             })
-            return len(ids)
+                else:
+                    with Transaction().set_user(0):
+                        cls.write([translation], {
+                            'src': getattr(record, field_name),
+                            'value': value,
+                            'fuzzy': False,
+                            })
+            if to_create:
+                with Transaction().set_user(0):
+                    cls.create(to_create)
+            return
+
         Model = pool.get(model_name)
         with Transaction().set_context(language=Config.get_language()):
             records = Model.browse(ids)
-        for record in records:
-            translation2 = cls.search([
-                ('lang', '=', lang),
-                ('type', '=', ttype),
-                ('name', '=', name),
-                ('res_id', '=', record.id),
-                ])
-            with Transaction().set_user(0):
-                if not translation2:
-                    cls.create([{
-                                'name': name,
-                                'lang': lang,
-                                'type': ttype,
-                                'res_id': record.id,
-                                'value': value,
-                                'src': getattr(record, field_name),
-                                'fuzzy': False,
-                                }])
-                else:
-                    cls.write(translation2, {
+
+        translations = {}
+        for translation in cls.search([
+                    ('lang', '=', lang),
+                    ('type', '=', ttype),
+                    ('name', '=', name),
+                    ('res_id', 'in', ids),
+                    ]):
+            translations[translation.res_id] = translation
+
+        other_translations = {}
+        if (lang == Config.get_language()
+                and Transaction().context.get('fuzzy_translation', True)):
+            for translation in cls.search([
+                        ('lang', '!=', lang),
+                        ('type', '=', ttype),
+                        ('name', '=', name),
+                        ('res_id', 'in', ids),
+                        ]):
+                other_translations.setdefault(translation.res_id, []
+                    ).append(translation)
+
+        to_create = []
+        for record, value in izip(records, values):
+            translation = translations.get(record.id)
+            if not translation:
+                to_create.append({
+                        'name': name,
+                        'lang': lang,
+                        'type': ttype,
+                        'res_id': record.id,
+                        'value': value,
+                        'src': getattr(record, field_name),
+                        'fuzzy': False,
+                        })
+            else:
+                with Transaction().set_user(0):
+                    cls.write([translation], {
                         'value': value,
                         'src': getattr(record, field_name),
                         'fuzzy': False,
                         })
-                    if (lang == Config.get_language()
-                            and Transaction().context.get('fuzzy_translation',
-                                True)):
-                        other_langs = cls.search([
-                                ('lang', '!=', lang),
-                                ('type', '=', ttype),
-                                ('name', '=', name),
-                                ('res_id', '=', record.id),
-                                ])
+                    other_langs = other_translations.get(record.id)
+                    if other_langs:
                         cls.write(other_langs, {
                                 'src': getattr(record, field_name),
                                 'fuzzy': True,
                                 })
-        return len(ids)
+        if to_create:
+            with Transaction().set_user(0):
+                cls.create(to_create)
 
     @classmethod
     def delete_ids(cls, model, ttype, ids):
@@ -366,29 +616,17 @@ class Translation(ModelSQL, ModelView):
             return trans
 
         cursor = Transaction().cursor
+        table = cls.__table__()
+        where = ((table.lang == lang)
+            & (table.type == ttype)
+            & (table.name == name)
+            & (table.value != '')
+            & (table.value != None)
+            & (table.fuzzy == False)
+            & (table.res_id == -1))
         if source is not None:
-            cursor.execute('SELECT value '
-                    'FROM ir_translation '
-                    'WHERE lang = %s '
-                        'AND type = %s '
-                        'AND name = %s '
-                        'AND src = %s '
-                        'AND value != \'\' '
-                        'AND value IS NOT NULL '
-                        'AND fuzzy = %s '
-                        'AND res_id IS NULL',
-                    (lang, ttype, name, source, False))
-        else:
-            cursor.execute('SELECT value '
-                    'FROM ir_translation '
-                    'WHERE lang = %s '
-                        'AND type = %s '
-                        'AND name = %s '
-                        'AND value != \'\' '
-                        'AND value IS NOT NULL '
-                        'AND fuzzy = %s '
-                        'AND res_id IS NULL',
-                    (lang, ttype, name, False))
+            where &= table.src == source
+        cursor.execute(*table.select(table.value, where=where))
         res = cursor.fetchone()
         if res:
             cls._translation_cache.set((lang, ttype, name, source), res[0])
@@ -407,6 +645,7 @@ class Translation(ModelSQL, ModelView):
         res = {}
         clause = []
         cursor = Transaction().cursor
+        table = cls.__table__()
         if len(args) > cursor.IN_MAX:
             for i in range(0, len(args), cursor.IN_MAX):
                 sub_args = args[i:i + cursor.IN_MAX]
@@ -424,32 +663,24 @@ class Translation(ModelSQL, ModelView):
             else:
                 res[(name, ttype, lang, source)] = None
                 cls._translation_cache.set((lang, ttype, name, source), None)
+                where = And(((table.lang == lang),
+                        (table.type == ttype),
+                        (table.name == name),
+                        (table.value != ''),
+                        (table.value != None),
+                        (table.fuzzy == False),
+                        (table.res_id == -1),
+                        ))
                 if source is not None:
-                    clause += [('(lang = %s '
-                            'AND type = %s '
-                            'AND name = %s '
-                            'AND src = %s '
-                            'AND value != \'\' '
-                            'AND value IS NOT NULL '
-                            'AND fuzzy = %s '
-                            'AND res_id IS NULL)',
-                            (lang, ttype, name, source, False))]
-                else:
-                    clause += [('(lang = %s '
-                            'AND type = %s '
-                            'AND name = %s '
-                            'AND value != \'\' '
-                            'AND value IS NOT NULL '
-                            'AND fuzzy = %s '
-                            'AND res_id IS NULL)',
-                            (lang, ttype, name, False))]
+                    where &= table.src == source
+                clause.append(where)
         if clause:
-            for i in range(0, len(clause), cursor.IN_MAX):
-                sub_clause = clause[i:i + cursor.IN_MAX]
-                cursor.execute('SELECT lang, type, name, src, value '
-                    'FROM ir_translation '
-                    'WHERE ' + ' OR '.join(x[0] for x in sub_clause),
-                    reduce(lambda x, y: x + y, [x[1] for x in sub_clause]))
+            in_max = cursor.IN_MAX / 7
+            for i in range(0, len(clause), in_max):
+                cursor.execute(*table.select(
+                        table.lang, table.type, table.name, table.src,
+                        table.value,
+                        where=Or(clause[i:i + in_max])))
                 for lang, ttype, name, source, value in cursor.fetchall():
                     if (name, ttype, lang, source) not in args:
                         source = None
@@ -471,32 +702,28 @@ class Translation(ModelSQL, ModelView):
         vlist = [x.copy() for x in vlist]
 
         cursor = Transaction().cursor
+        table = cls.__table__()
         for vals in vlist:
             if not vals.get('module'):
                 if Transaction().context.get('module'):
                     vals['module'] = Transaction().context['module']
                 elif vals.get('type', '') in ('odt', 'view', 'wizard_button',
                         'selection', 'error'):
-                    cursor.execute('SELECT module FROM ir_translation '
-                        'WHERE name = %s '
-                            'AND res_id = %s '
-                            'AND lang = %s '
-                            'AND type = %s '
-                            'AND src = %s ',
-                        (vals.get('name') or '', vals.get('res_id') or 0,
-                            'en_US', vals.get('type') or '', vals.get('src')
-                            or ''))
+                    cursor.execute(*table.select(table.module,
+                            where=(table.name == vals.get('name') or '')
+                            & (table.res_id == vals.get('res_id') or -1)
+                            & (table.lang == 'en_US')
+                            & (table.type == vals.get('type') or '')
+                            & (table.src == vals.get('src') or '')))
                     fetchone = cursor.fetchone()
                     if fetchone:
                         vals['module'] = fetchone[0]
                 else:
-                    cursor.execute('SELECT module, src FROM ir_translation '
-                        'WHERE name = %s '
-                            'AND res_id = %s '
-                            'AND lang = %s '
-                            'AND type = %s',
-                        (vals.get('name') or '', vals.get('res_id') or 0,
-                            'en_US', vals.get('type') or ''))
+                    cursor.execute(*table.select(table.module, table.src,
+                            where=(table.name == vals.get('name') or '')
+                            & (table.res_id == vals.get('res_id') or -1)
+                            & (table.lang == 'en_US')
+                            & (table.type == vals.get('type') or '')))
                     fetchone = cursor.fetchone()
                     if fetchone:
                         vals['module'], vals['src'] = fetchone
@@ -530,13 +757,15 @@ class Translation(ModelSQL, ModelView):
         models_data = ModelData.search([
                 ('module', '=', module),
                 ])
-        fs_id2model_data = {}
+        fs_id2prop = {}
         for model_data in models_data:
-            fs_id2model_data.setdefault(model_data.model, {})
-            fs_id2model_data[model_data.model][model_data.fs_id] = model_data
+            fs_id2prop.setdefault(model_data.model, {})
+            fs_id2prop[model_data.model][model_data.fs_id] = \
+                (model_data.db_id, model_data.noupdate)
             for extra_model in cls.extra_model_data(model_data):
-                fs_id2model_data.setdefault(extra_model, {})
-                fs_id2model_data[extra_model][model_data.fs_id] = model_data
+                fs_id2prop.setdefault(extra_model, {})
+                fs_id2prop[extra_model][model_data.fs_id] = \
+                    (model_data.db_id, model_data.noupdate)
 
         translations = set()
         to_create = []
@@ -547,11 +776,7 @@ class Translation(ModelSQL, ModelView):
         module_translations = cls.search([
                 ('lang', '=', lang),
                 ('module', '=', module),
-                ],
-            order=[
-                ('type', 'DESC'),
-                ('name', 'DESC'),
-                ])
+                ], order=[])
         for translation in module_translations:
             if translation.type in ('odt', 'view', 'wizard_button',
                     'selection', 'error'):
@@ -563,63 +788,109 @@ class Translation(ModelSQL, ModelView):
                 raise Exception('Unknow translation type: %s'
                     % translation.type)
             key2ids.setdefault(key, []).append(translation.id)
-            id2translation[translation.id] = translation
-
-        for entry in pofile:
-            ttype, name, res_id = entry.msgctxt.split(':')
-            src = entry.msgid
-            value = entry.msgstr
-            fuzzy = 'fuzzy' in entry.flags
-            noupdate = False
-
-            model = name.split(',')[0]
-            if model in fs_id2model_data and res_id in fs_id2model_data[model]:
-                model_data = fs_id2model_data[model][res_id]
-                res_id = model_data.db_id
-                noupdate = model_data.noupdate
+            if len(module_translations) <= RECORD_CACHE_SIZE:
+                id2translation[translation.id] = translation
 
+        def override_translation(ressource_id, new_translation, fuzzy):
+            res_id_module, res_id = ressource_id.split('.')
             if res_id:
-                try:
-                    res_id = int(res_id)
-                except ValueError:
+                model_data, = ModelData.search([
+                        ('module', '=', res_id_module),
+                        ('fs_id', '=', res_id),
+                        ])
+                res_id = model_data.db_id
+            else:
+                res_id = -1
+            with contextlib.nested(Transaction().set_user(0),
+                    Transaction().set_context(module=res_id_module)):
+                translation, = cls.search([
+                        ('name', '=', name),
+                        ('res_id', '=', res_id),
+                        ('lang', '=', lang),
+                        ('type', '=', ttype),
+                        ('module', '=', res_id_module),
+                        ])
+                if translation.value != new_translation:
+                    translation.value = new_translation
+                    translation.overriding_module = module
+                    translation.fuzzy = fuzzy
+                    translation.save()
+
+        # Make a first loop to retreive translation ids in the right order to
+        # get better read locality and a full usage of the cache.
+        translation_ids = []
+        if len(module_translations) <= RECORD_CACHE_SIZE:
+            processes = (True,)
+        else:
+            processes = (False, True)
+        for processing in processes:
+            if processing and len(module_translations) > RECORD_CACHE_SIZE:
+                id2translation = dict((t.id, t)
+                    for t in cls.browse(translation_ids))
+            for entry in pofile:
+                ttype, name, res_id = entry.msgctxt.split(':')
+                src = entry.msgid
+                value = entry.msgstr
+                fuzzy = 'fuzzy' in entry.flags
+                noupdate = False
+
+                if '.' in res_id:
+                    override_translation(res_id, value, fuzzy)
                     continue
-            if not res_id:
-                res_id = None
 
-            if ttype in ('odt', 'view', 'wizard_button', 'selection', 'error'):
-                key = (name, res_id, ttype, src)
-            elif ttype in('field', 'model', 'help'):
-                key = (name, res_id, ttype)
-            else:
-                raise Exception('Unknow translation type: %s' % ttype)
-            ids = key2ids.get(key, [])
+                model = name.split(',')[0]
+                if (model in fs_id2prop
+                        and res_id in fs_id2prop[model]):
+                    res_id, noupdate = fs_id2prop[model][res_id]
 
-            with contextlib.nested(Transaction().set_user(0),
-                    Transaction().set_context(module=module)):
-                if not ids:
-                    to_create.append({
-                        'name': name,
-                        'res_id': res_id,
-                        'lang': lang,
-                        'type': ttype,
-                        'src': src,
-                        'value': value,
-                        'fuzzy': fuzzy,
-                        'module': module,
-                        })
+                if res_id:
+                    try:
+                        res_id = int(res_id)
+                    except ValueError:
+                        continue
+                if not res_id:
+                    res_id = -1
+
+                if ttype in ('odt', 'view', 'wizard_button', 'selection',
+                        'error'):
+                    key = (name, res_id, ttype, src)
+                elif ttype in('field', 'model', 'help'):
+                    key = (name, res_id, ttype)
                 else:
-                    translations2 = []
-                    for translation_id in ids:
-                        translation = id2translation[translation_id]
-                        if translation.value != value \
-                                or translation.fuzzy != fuzzy:
-                            translations2.append(translation)
-                    if translations2 and not noupdate:
-                        cls.write(translations2, {
+                    raise Exception('Unknow translation type: %s' % ttype)
+                ids = key2ids.get(key, [])
+
+                if not processing:
+                    translation_ids.extend(ids)
+                    continue
+
+                with contextlib.nested(Transaction().set_user(0),
+                        Transaction().set_context(module=module)):
+                    if not ids:
+                        to_create.append({
+                            'name': name,
+                            'res_id': res_id,
+                            'lang': lang,
+                            'type': ttype,
+                            'src': src,
                             'value': value,
                             'fuzzy': fuzzy,
+                            'module': module,
+                            'overriding_module': None,
                             })
-                    translations |= set(cls.browse(ids))
+                    else:
+                        translations2 = []
+                        for translation_id in ids:
+                            translation = id2translation[translation_id]
+                            if translation.value != value \
+                                    or translation.fuzzy != fuzzy:
+                                translations2.append(translation)
+                        if translations2 and not noupdate:
+                            cls.write(translations2, {
+                                'value': value,
+                                'fuzzy': fuzzy,
+                                })
+                        translations |= set(cls.browse(ids))
 
         if to_create:
             translations |= set(cls.create(to_create))
@@ -661,13 +932,19 @@ class Translation(ModelSQL, ModelView):
                 ('module', '=', module),
                 ], order=[])
         for translation in translations:
+            if (translation.overriding_module
+                    and translation.overriding_module != module):
+                cls.raise_user_error('translation_overridden', {
+                        'name': translation.name,
+                        'name': translation.overriding_module,
+                        })
             flags = [] if not translation.fuzzy else ['fuzzy']
             trans_ctxt = '%(type)s:%(name)s:' % {
                 'type': translation.type,
                 'name': translation.name,
                 }
             res_id = translation.res_id
-            if res_id:
+            if res_id >= 0:
                 model, _ = translation.name.split(',')
                 if model in db_id2fs_id:
                     res_id = db_id2fs_id[model].get(res_id)
@@ -679,8 +956,11 @@ class Translation(ModelSQL, ModelView):
                 flags=flags)
             pofile.append(entry)
 
-        pofile.sort()
-        return unicode(pofile).encode('utf-8')
+        if pofile:
+            pofile.sort()
+            return unicode(pofile).encode('utf-8')
+        else:
+            return
 
 
 class TranslationSetStart(ModelView):
@@ -738,13 +1018,14 @@ class TranslationSet(Wizard):
             return
 
         cursor = Transaction().cursor
+        translation = Translation.__table__()
         for report in reports:
-            cursor.execute('SELECT id, name, src FROM ir_translation '
-                'WHERE lang = %s '
-                    'AND type = %s '
-                    'AND name = %s '
-                    'AND module = %s',
-                ('en_US', 'odt', report.report_name, report.module or ''))
+            cursor.execute(*translation.select(
+                    translation.id, translation.name, translation.src,
+                    where=(translation.lang == 'en_US')
+                    & (translation.type == 'odt')
+                    & (translation.name == report.report_name)
+                    & (translation.module == report.module or '')))
             trans_reports = {}
             for trans in cursor.dictfetchall():
                 trans_reports[trans['src']] = trans
@@ -799,35 +1080,32 @@ class TranslationSet(Wizard):
                         done = True
                         break
                     if seqmatch.ratio() > 0.6:
-                        cursor.execute('UPDATE ir_translation '
-                            'SET src = %s, '
-                                'fuzzy = %s, '
-                                'src_md5 = %s '
-                            'WHERE name = %s '
-                                'AND type = %s '
-                                'AND src = %s '
-                                'AND module = %s',
-                            (string, True, src_md5, report.report_name,
-                                'odt', string_trans, report.module))
+                        cursor.execute(*translation.update(
+                                [translation.src, translation.fuzzy,
+                                    translation.src_md5],
+                                [string, True, src_md5],
+                                where=(translation.name == report.report_name)
+                                & (translation.type == 'odt')
+                                & (translation.src == string_trans)
+                                & (translation.module == report.module)))
                         del trans_reports[string_trans]
                         done = True
                         break
                 if not done:
-                    cursor.execute('INSERT INTO ir_translation '
-                        '(name, lang, type, src, value, module, fuzzy, '
-                            'src_md5)'
-                        'VALUES (%s, %s, %s, %s, %s, %s, %s, %s)',
-                        (report.report_name, 'en_US', 'odt', string, '',
-                            report.module, False, src_md5))
+                    cursor.execute(*translation.insert(
+                            [translation.name, translation.lang,
+                                translation.type, translation.src,
+                                translation.value, translation.module,
+                                translation.fuzzy, translation.src_md5,
+                                translation.res_id],
+                            [[report.report_name, 'en_US', 'odt', string, '',
+                                    report.module, False, src_md5, -1]]))
             if strings:
-                cursor.execute('DELETE FROM ir_translation '
-                    'WHERE name = %s '
-                        'AND type = %s '
-                        'AND module = %s '
-                        'AND src NOT IN '
-                            '(' + ','.join(('%s',) * len(strings)) + ')',
-                    (report.report_name, 'odt', report.module) +
-                    tuple(strings))
+                cursor.execute(*translation.delete(
+                        where=(translation.name == report.report_name)
+                        & (translation.type == 'odt')
+                        & (translation.module == report.module)
+                        & ~translation.src.in_(strings)))
 
     def _translate_view(self, element):
         strings = []
@@ -843,6 +1121,7 @@ class TranslationSet(Wizard):
     def set_view(self):
         pool = Pool()
         View = pool.get('ir.ui.view')
+        Translation = pool.get('ir.translation')
 
         with Transaction().set_context(active_test=False):
             views = View.search([])
@@ -850,14 +1129,14 @@ class TranslationSet(Wizard):
         if not views:
             return
         cursor = Transaction().cursor
-
+        translation = Translation.__table__()
         for view in views:
-            cursor.execute('SELECT id, name, src FROM ir_translation '
-                'WHERE lang = %s '
-                    'AND type = %s '
-                    'AND name = %s '
-                    'AND module = %s',
-                ('en_US', 'view', view.model, view.module))
+            cursor.execute(*translation.select(
+                    translation.id, translation.name, translation.src,
+                    where=(translation.lang == 'en_US')
+                    & (translation.type == 'view')
+                    & (translation.name == view.model)
+                    & (translation.module == view.module)))
             trans_views = {}
             for trans in cursor.dictfetchall():
                 trans_views[trans['src']] = trans
@@ -899,31 +1178,30 @@ class TranslationSet(Wizard):
                         done = True
                         break
                     if seqmatch.ratio() > 0.6:
-                        cursor.execute('UPDATE ir_translation '
-                            'SET src = %s, '
-                                'src_md5 = %s, '
-                                'fuzzy = %s '
-                            'WHERE id = %s ',
-                            (string, string_md5, True,
-                                trans_views[string_trans]['id']))
+                        cursor.execute(*translation.update(
+                                [translation.src, translation.src_md5,
+                                    translation.fuzzy],
+                                [string, string_md5, True],
+                                where=(translation.id ==
+                                    trans_views[string_trans]['id'])))
                         del trans_views[string_trans]
                         done = True
                         break
                 if not done:
-                    cursor.execute('INSERT INTO ir_translation '
-                        '(name, lang, type, src, src_md5, value, module, '
-                            'fuzzy) '
-                        'VALUES (%s, %s, %s, %s, %s, %s, %s, %s)',
-                        (view.model, 'en_US', 'view', string, string_md5, '',
-                            view.module, False))
+                    cursor.execute(*translation.insert(
+                            [translation.name, translation.lang,
+                                translation.type, translation.src,
+                                translation.src_md5, translation.value,
+                                translation.module, translation.fuzzy,
+                                translation.res_id],
+                            [[view.model, 'en_US', 'view', string, string_md5,
+                                    '', view.module, False, -1]]))
             if strings:
-                cursor.execute('DELETE FROM ir_translation '
-                    'WHERE name = %s '
-                        'AND type = %s '
-                        'AND module = %s '
-                        'AND src NOT IN '
-                        '(' + ','.join(('%s',) * len(strings)) + ')',
-                    (view.model, 'view', view.module) + tuple(strings))
+                cursor.execute(*translation.delete(
+                        where=(translation.name == view.model)
+                        & (translation.type == 'view')
+                        & (translation.module == view.module)
+                        & ~translation.src.in_(strings)))
 
     def transition_set_(self):
         self.set_report()
@@ -978,7 +1256,7 @@ class TranslationClean(Wizard):
             return True
         if model_name not in pool.object_name_list():
             return True
-        if translation.res_id:
+        if translation.res_id >= 0:
             Model = pool.get(model_name)
             if field_name not in Model._fields:
                 return True
@@ -1080,6 +1358,8 @@ class TranslationClean(Wizard):
                 'required_validation_record',
                 'size_validation_record',
                 'digits_validation_record',
+                'selection_validation_record',
+                'time_format_validation_record',
                 'access_error',
                 'read_error',
                 'write_error',
@@ -1087,9 +1367,8 @@ class TranslationClean(Wizard):
                 'foreign_model_missing',
                 'foreign_model_exist',
                 'search_function_missing',
-                'time_format_validation_record',
                 'selection_value_notfound',
-                'model_recusion_error',
+                'recursion_error',
                 ):
             return False
         if model_name in pool.object_name_list():
@@ -1180,18 +1459,18 @@ class TranslationUpdate(Wizard):
         pool = Pool()
         Translation = pool.get('ir.translation')
         cursor = Transaction().cursor
+        translation = Translation.__table__()
         lang = self.start.language.code
-        cursor.execute('SELECT name, res_id, type, src, module '
-            'FROM ir_translation '
-            'WHERE lang=\'en_US\' '
-                'AND type in (\'odt\', \'view\', \'wizard_button\', '
-                ' \'selection\', \'error\') '
-            'EXCEPT SELECT name, res_id, type, src, module '
-            'FROM ir_translation '
-            'WHERE lang=%s '
-                'AND type in (\'odt\', \'view\', \'wizard_button\', '
-                ' \'selection\', \'error\')',
-            (lang,))
+        types = ['odt', 'view', 'wizard_button', 'selection', 'error']
+        columns = [translation.name.as_('name'),
+            translation.res_id.as_('res_id'), translation.type.as_('type'),
+            translation.src.as_('src'), translation.module.as_('module')]
+        cursor.execute(*(translation.select(*columns,
+                    where=(translation.lang == 'en_US')
+                    & translation.type.in_(types))
+                - translation.select(*columns,
+                    where=(translation.lang == lang)
+                    & translation.type.in_(types))))
         to_create = []
         for row in cursor.dictfetchall():
             to_create.append({
@@ -1205,15 +1484,16 @@ class TranslationUpdate(Wizard):
         if to_create:
             with Transaction().set_user(0):
                 Translation.create(to_create)
-        cursor.execute('SELECT name, res_id, type, module '
-            'FROM ir_translation '
-            'WHERE lang=\'en_US\' '
-                'AND type in (\'field\', \'model\', \'help\') '
-            'EXCEPT SELECT name, res_id, type, module '
-            'FROM ir_translation '
-            'WHERE lang=%s '
-                'AND type in (\'field\', \'model\', \'help\')',
-            (lang,))
+        types = ['field', 'model', 'help']
+        columns = [translation.name.as_('name'),
+            translation.res_id.as_('res_id'), translation.type.as_('type'),
+            translation.module.as_('module')]
+        cursor.execute(*(translation.select(*columns,
+                    where=(translation.lang == 'en_US')
+                    & translation.type.in_(types))
+                - translation.select(*columns,
+                    where=(translation.lang == lang)
+                    & translation.type.in_(types))))
         to_create = []
         for row in cursor.dictfetchall():
             to_create.append({
@@ -1226,54 +1506,54 @@ class TranslationUpdate(Wizard):
         if to_create:
             with Transaction().set_user(0):
                 Translation.create(to_create)
-        cursor.execute('SELECT name, res_id, type, src '
-            'FROM ir_translation '
-            'WHERE lang=\'en_US\' '
-                'AND type in (\'field\', \'model\', \'selection\', '
-                    '\'help\') '
-            'EXCEPT SELECT name, res_id, type, src '
-            'FROM ir_translation '
-            'WHERE lang=%s '
-                'AND type in (\'field\', \'model\', \'selection\', '
-                    '\'help\')',
-            (lang,))
+        types = ['field', 'model', 'selection', 'help']
+        columns = [translation.name.as_('name'),
+            translation.res_id.as_('res_id'), translation.type.as_('type'),
+            translation.src.as_('src')]
+        cursor.execute(*(translation.select(*columns,
+                    where=(translation.lang == 'en_US')
+                    & translation.type.in_(types))
+                - translation.select(*columns,
+                    where=(translation.lang == lang)
+                    & translation.type.in_(types))))
         for row in cursor.dictfetchall():
-            cursor.execute('UPDATE ir_translation '
-                'SET fuzzy = %s, '
-                    'src = %s '
-                'WHERE name = %s '
-                    'AND type = %s '
-                    'AND lang = %s '
-                    + ('AND res_id = %s' if row['res_id']
-                    else 'AND res_id is NULL'),
-                (True, row['src'], row['name'], row['type'], lang)
-                + ((row['res_id'],) if row['res_id'] else ()))
-
-        cursor.execute('SELECT src, MAX(value) AS value FROM ir_translation '
-            'WHERE lang = %s '
-                'AND src IN ('
-                    'SELECT src FROM ir_translation '
-                    'WHERE (value = \'\' OR value IS NULL) '
-                        'AND lang = %s) '
-                'AND value != \'\' AND value IS NOT NULL '
-            'GROUP BY src', (lang, lang))
+            cursor.execute(*translation.update(
+                    [translation.fuzzy, translation.src],
+                    [True, row['src']],
+                    where=(translation.name == row['name'])
+                    & (translation.type == row['type'])
+                    & (translation.lang == lang)
+                    & (translation.res_id == (row['res_id'] or -1))))
+
+        cursor.execute(*translation.select(
+                translation.src.as_('src'),
+                Max(translation.value).as_('value'),
+                where=(translation.lang == lang)
+                & translation.src.in_(
+                    translation.select(translation.src,
+                        where=((translation.value == '')
+                            | (translation.value == None))
+                        & (translation.lang == lang)))
+                & (translation.value != '')
+                & (translation.value != None),
+                group_by=translation.src))
 
         for row in cursor.dictfetchall():
-            cursor.execute('UPDATE ir_translation '
-                'SET fuzzy = %s, '
-                    'value = %s '
-                'WHERE src = %s '
-                    'AND (value = \'\' OR value IS NULL) '
-                    'AND lang = %s',
-                (True, row['value'], row['src'], lang))
-
-        cursor.execute('UPDATE ir_translation '
-            'SET fuzzy = %s '
-            'WHERE (value = \'\' OR value IS NULL) '
-                'AND lang = %s', (False, lang,))
+            cursor.execute(*translation.update(
+                    [translation.fuzzy, translation.value],
+                    [True, row['value']],
+                    where=(translation.src == row['src'])
+                    & ((translation.value == '') | (translation.value == None))
+                    & (translation.lang == lang)))
+
+        cursor.execute(*translation.update(
+                [translation.fuzzy],
+                [False],
+                where=((translation.value == '') | (translation.value == None))
+                & (translation.lang == lang)))
 
         action['pyson_domain'] = PYSONEncoder().encode([
-            ('module', '!=', False),
+            ('module', '!=', None),
             ('lang', '=', lang),
         ])
         return action, {}
@@ -1293,15 +1573,13 @@ class TranslationExportStart(ModelView):
             ('state', 'in', ['installed', 'to upgrade', 'to remove']),
             ])
 
-    @staticmethod
-    def default_language():
+    @classmethod
+    def default_language(cls):
         Lang = Pool().get('ir.lang')
         code = Transaction().context.get('language', False)
+        domain = [('code', '=', code)] + cls.language.domain
         try:
-            lang, = Lang.search([
-                    ('code', '=', code),
-                    ('translatable', '=', True),
-                    ], limit=1)
+            lang, = Lang.search(domain, limit=1)
             return lang.id
         except ValueError:
             return None
@@ -1334,7 +1612,7 @@ class TranslationExport(Wizard):
         Translation = pool.get('ir.translation')
         file_data = Translation.translation_export(
             self.start.language.code, self.start.module.name)
-        self.result.file = buffer(file_data)
+        self.result.file = buffer(file_data) if file_data else None
         return 'result'
 
     def default_result(self, fields):
diff --git a/trytond/ir/translation.xml b/trytond/ir/translation.xml
index c02556d..5c57717 100644
--- a/trytond/ir/translation.xml
+++ b/trytond/ir/translation.xml
@@ -16,7 +16,7 @@ this repository contains the full copyright notices and license terms. -->
         <record model="ir.action.act_window" id="act_translation_form">
             <field name="name">Translations</field>
             <field name="res_model">ir.translation</field>
-            <field name="domain">[('module', '!=', False)]</field>
+            <field name="domain">[('module', '!=', None)]</field>
         </record>
         <record model="ir.action.act_window.view"
             id="act_translation_form_view1">
diff --git a/trytond/ir/trigger.py b/trytond/ir/trigger.py
index 7ee4356..a0c78c4 100644
--- a/trytond/ir/trigger.py
+++ b/trytond/ir/trigger.py
@@ -2,10 +2,13 @@
 #this repository contains the full copyright notices and license terms.
 import datetime
 import time
+from sql import Literal
+from sql.aggregate import Count, Max
+
 from ..model import ModelView, ModelSQL, fields
 from ..pyson import Eval
 from ..tools import safe_eval
-from ..backend import TableHandler
+from .. import backend
 from ..tools import reduce_ids
 from ..transaction import Transaction
 from ..cache import Cache
@@ -132,8 +135,8 @@ class Trigger(ModelSQL, ModelView):
         assert mode in ['create', 'write', 'delete', 'time'], \
             'Invalid trigger mode'
 
-        if Transaction().user == 0:
-            return []  # XXX is it want we want?
+        if Transaction().user == 0 and not Transaction().context.get('user'):
+            return []
 
         key = (model_name, mode)
         trigger_ids = cls._get_triggers_cache.get(key)
@@ -169,19 +172,20 @@ class Trigger(ModelSQL, ModelView):
         Model = pool.get(trigger.model.model)
         ActionModel = pool.get(trigger.action_model.model)
         cursor = Transaction().cursor
+        in_max = cursor.IN_MAX
+        trigger_log = TriggerLog.__table__()
         ids = map(int, records)
 
         # Filter on limit_number
         if trigger.limit_number:
             new_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('"record_id"', sub_ids)
-                cursor.execute('SELECT "record_id", COUNT(1) FROM "%s" '
-                        'WHERE %s AND "trigger" = %%s '
-                        'GROUP BY "record_id"'
-                        % (TriggerLog._table, red_sql),
-                        red_ids + [trigger.id])
+            for i in range(0, len(ids), in_max):
+                sub_ids = ids[i:i + in_max]
+                red_sql = reduce_ids(trigger_log.record_id, sub_ids)
+                cursor.execute(*trigger_log.select(
+                        trigger_log.record_id, Count(Literal(1)),
+                        where=red_sql & (trigger_log.trigger == trigger.id),
+                        group_by=trigger_log.record_id))
                 number = dict(cursor.fetchall())
                 for record_id in sub_ids:
                     if record_id not in number:
@@ -194,15 +198,13 @@ class Trigger(ModelSQL, ModelView):
         # Filter on minimum_delay
         if trigger.minimum_delay:
             new_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('"record_id"', sub_ids)
-                cursor.execute('SELECT "record_id", MAX("create_date") '
-                        'FROM "%s" '
-                        'WHERE %s AND "trigger" = %%s '
-                        'GROUP BY "record_id"'
-                        % (TriggerLog._table, red_sql),
-                        red_ids + [trigger.id])
+            for i in range(0, len(ids), in_max):
+                sub_ids = ids[i:i + in_max]
+                red_sql = reduce_ids(trigger_log.record_id, sub_ids)
+                cursor.execute(*trigger_log.select(
+                        trigger_log.record_id, Max(trigger_log.create_date),
+                        where=red_sql & (trigger_log.trigger == trigger.id),
+                        group_by=trigger_log.record_id))
                 delay = dict(cursor.fetchall())
                 for record_id in sub_ids:
                     if record_id not in delay:
@@ -289,6 +291,7 @@ class TriggerLog(ModelSQL):
 
     @classmethod
     def __register__(cls, module_name):
+        TableHandler = backend.get('TableHandler')
         super(TriggerLog, cls).__register__(module_name)
 
         table = TableHandler(Transaction().cursor, cls, module_name)
diff --git a/trytond/ir/ui/calendar.rnc b/trytond/ir/ui/calendar.rnc
new file mode 100644
index 0000000..0d3fcfe
--- /dev/null
+++ b/trytond/ir/ui/calendar.rnc
@@ -0,0 +1,12 @@
+namespace a = "http://relaxng.org/ns/compatibility/annotations/1.0"
+
+calendar = element calendar { attlist.calendar, field* }
+attlist.calendar &=
+  attribute dtstart { text }
+attlist.calendar &=
+  attribute dtend { text }?
+attlist.calendar &=
+  [ a:defaultValue = "Unknown" ] attribute string { text }?
+field = element field { attlist.field, empty }
+attlist.field &= attribute name { text }
+start = calendar
diff --git a/trytond/ir/ui/calendar.rng b/trytond/ir/ui/calendar.rng
new file mode 100644
index 0000000..eee6466
--- /dev/null
+++ b/trytond/ir/ui/calendar.rng
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<grammar xmlns:a="http://relaxng.org/ns/compatibility/annotations/1.0" xmlns="http://relaxng.org/ns/structure/1.0">
+  <define name="calendar">
+    <element name="calendar">
+      <ref name="attlist.calendar"/>
+      <zeroOrMore>
+        <ref name="field"/>
+      </zeroOrMore>
+    </element>
+  </define>
+  <define name="attlist.calendar" combine="interleave">
+    <attribute name="dtstart"/>
+  </define>
+  <define name="attlist.calendar" combine="interleave">
+    <optional>
+      <attribute name="dtend"/>
+    </optional>
+  </define>
+  <define name="attlist.calendar" combine="interleave">
+    <optional>
+      <attribute name="string" a:defaultValue="Unknown"/>
+    </optional>
+  </define>
+  <define name="field">
+    <element name="field">
+      <ref name="attlist.field"/>
+      <empty/>
+    </element>
+  </define>
+  <define name="attlist.field" combine="interleave">
+    <attribute name="name"/>
+  </define>
+  <start>
+    <ref name="calendar"/>
+  </start>
+</grammar>
diff --git a/trytond/ir/ui/form.rnc b/trytond/ir/ui/form.rnc
index b7cd2ce..f696e9e 100644
--- a/trytond/ir/ui/form.rnc
+++ b/trytond/ir/ui/form.rnc
@@ -104,6 +104,7 @@ attlist.field &= [a:defaultValue = "0"] attribute pre_validate { "0" | "1" }?
 attlist.field &= attribute icon { text }?
 attlist.field &= [a:defaultValue = "1"] attribute completion { "0" | "1" }?
 attlist.field &= attribute string { text }?
+attlist.field &= [a:defaultValue = "1"] attribute factor { text }?
 image = element image { attlist.image, empty }
 attlist.image &= attribute name { text }
 attlist.image &= [ a:defaultValue = "1" ] attribute colspan { text }?
@@ -192,6 +193,7 @@ attlist.group &= [ a:defaultValue = "1" ] attribute rowspan { text }?
 attlist.group &= [ a:defaultValue = "4" ] attribute col { text }?
 attlist.group &= ( attribute name { text } | attribute id { text } )
 attlist.group &= attribute states { text }?
+attlist.group &= [ a:defaultValue = "0" ] attribute homogeneous { "0" | "1" }?
 
 hpaned = element hpaned { attlist.paned, child* }
 
diff --git a/trytond/ir/ui/form.rng b/trytond/ir/ui/form.rng
index 35bfe4e..5a68938 100644
--- a/trytond/ir/ui/form.rng
+++ b/trytond/ir/ui/form.rng
@@ -379,6 +379,11 @@
       <attribute name="string"/>
     </optional>
   </define>
+  <define name="attlist.field" combine="interleave">
+    <optional>
+      <attribute name="factor" a:defaultValue="1"/>
+    </optional>
+  </define>
   <define name="image">
     <element name="image">
       <ref name="attlist.image"/>
@@ -721,6 +726,16 @@
       <attribute name="states"/>
     </optional>
   </define>
+  <define name="attlist.group" combine="interleave">
+    <optional>
+      <attribute name="homogeneous" a:defaultValue="0">
+        <choice>
+          <value>0</value>
+          <value>1</value>
+        </choice>
+      </attribute>
+    </optional>
+  </define>
   <define name="hpaned">
     <element name="hpaned">
       <ref name="attlist.paned"/>
diff --git a/trytond/ir/ui/menu.py b/trytond/ir/ui/menu.py
index c3356f6..edb7039 100644
--- a/trytond/ir/ui/menu.py
+++ b/trytond/ir/ui/menu.py
@@ -78,8 +78,8 @@ class UIMenu(ModelSQL, ModelView):
             ondelete='CASCADE')
     groups = fields.Many2Many('ir.ui.menu-res.group',
        'menu', 'group', 'Groups')
-    complete_name = fields.Function(fields.Char('Complete Name',
-        order_field='name'), 'get_rec_name', searcher='search_rec_name')
+    complete_name = fields.Function(fields.Char('Complete Name'),
+        'get_rec_name', searcher='search_rec_name')
     icon = fields.Selection('list_icons', 'Icon', translate=False)
     action = fields.Function(fields.Reference('Action',
             selection=[
@@ -101,6 +101,10 @@ class UIMenu(ModelSQL, ModelView):
                     'not allowed to contain "%s".' % SEPARATOR),
                 })
 
+    @classmethod
+    def order_complet_name(cls, tables):
+        return cls.name.convert_order('name', tables, cls)
+
     @staticmethod
     def default_icon():
         return 'tryton-open'
@@ -163,10 +167,10 @@ class UIMenu(ModelSQL, ModelView):
 
     @classmethod
     def search(cls, domain, offset=0, limit=None, order=None, count=False,
-            query_string=False):
+            query=False):
         menus = super(UIMenu, cls).search(domain, offset=offset, limit=limit,
-                order=order, count=False, query_string=query_string)
-        if query_string:
+                order=order, count=False, query=query)
+        if query:
             return menus
 
         if menus:
@@ -262,9 +266,7 @@ class UIMenuFavorite(ModelSQL, ModelView):
 
     menu = fields.Many2One('ir.ui.menu', 'Menu', required=True,
         ondelete='CASCADE')
-    sequence = fields.Integer('Sequence',
-        order_field='(%(table)s.sequence IS NOT NULL) %(order)s, '
-        '%(table)s.sequence %(order)s')
+    sequence = fields.Integer('Sequence')
     user = fields.Many2One('res.user', 'User', required=True,
         ondelete='CASCADE')
 
@@ -282,6 +284,11 @@ class UIMenuFavorite(ModelSQL, ModelView):
             ]
 
     @staticmethod
+    def order_sequence(tables):
+        table, _ = tables[None]
+        return [table.sequence == None, table.sequence]
+
+    @staticmethod
     def default_user():
         return Transaction().user
 
diff --git a/trytond/ir/ui/menu.xml b/trytond/ir/ui/menu.xml
index 423b4bf..4a0a610 100644
--- a/trytond/ir/ui/menu.xml
+++ b/trytond/ir/ui/menu.xml
@@ -28,7 +28,7 @@ this repository contains the full copyright notices and license terms. -->
             <field name="name">Menu</field>
             <field name="res_model">ir.ui.menu</field>
             <field name="usage">menu</field>
-            <field name="domain" eval="'[(\'parent\', \'=\', False)]'"/>
+            <field name="domain">[('parent', '=', None)]</field>
         </record>
         <record model="ir.action.act_window.view"
             id="act_menu_tree_view1">
diff --git a/trytond/ir/ui/tree.rnc b/trytond/ir/ui/tree.rnc
index e66066d..e422d93 100644
--- a/trytond/ir/ui/tree.rnc
+++ b/trytond/ir/ui/tree.rnc
@@ -52,6 +52,7 @@ attlist.field &=
 attlist.field &= attribute float_time { text }?
 attlist.field &= [a:defaultValue = "0"] attribute pre_validate { "0" | "1" }?
 attlist.field &= [a:defaultValue = "1"] attribute completion { "0" | "1" }?
+attlist.field &= [a:defaultValue = "1"] attribute factor { text }?
 prefix = element prefix { attlist.affix, empty }
 suffix = element suffix { attlist.affix, empty }
 attlist.affix &= attribute string { text }?
diff --git a/trytond/ir/ui/tree.rng b/trytond/ir/ui/tree.rng
index 5d5b1da..12e9ef3 100644
--- a/trytond/ir/ui/tree.rng
+++ b/trytond/ir/ui/tree.rng
@@ -172,6 +172,11 @@
       </attribute>
     </optional>
   </define>
+  <define name="attlist.field" combine="interleave">
+    <optional>
+      <attribute name="factor" a:defaultValue="1"/>
+    </optional>
+  </define>
   <define name="prefix">
     <element name="prefix">
       <ref name="attlist.affix"/>
diff --git a/trytond/ir/ui/view.py b/trytond/ir/ui/view.py
index 6ff2d91..614d48f 100644
--- a/trytond/ir/ui/view.py
+++ b/trytond/ir/ui/view.py
@@ -5,7 +5,7 @@ import sys
 import logging
 from lxml import etree
 from trytond.model import ModelView, ModelSQL, fields
-from trytond.backend import TableHandler
+from trytond import backend
 from trytond.pyson import CONTEXT, Eval, Bool, PYSONDecoder
 from trytond.tools import safe_eval, file_open
 from trytond.transaction import Transaction
@@ -16,7 +16,7 @@ from trytond.rpc import RPC
 
 __all__ = [
     'View', 'ShowViewStart', 'ShowView',
-    'ViewTreeWidth', 'ViewTreeExpandedState', 'ViewSearch',
+    'ViewTreeWidth', 'ViewTreeState', 'ViewSearch',
     ]
 
 
@@ -33,6 +33,7 @@ class View(ModelSQL, ModelView):
             ('tree', 'Tree'),
             ('form', 'Form'),
             ('graph', 'Graph'),
+            ('calendar', 'Calendar'),
             ('board', 'Board'),
             ], 'View Type', select=True)
     data = fields.Text('Data')
@@ -63,11 +64,14 @@ class View(ModelSQL, ModelView):
                 })
         cls._order.insert(0, ('priority', 'ASC'))
         cls._buttons.update({
-                'show': {},
+                'show': {
+                    'readonly': Eval('type') != 'form',
+                    },
                 })
 
     @classmethod
     def __register__(cls, module_name):
+        TableHandler = backend.get('TableHandler')
         cursor = Transaction().cursor
         table = TableHandler(cursor, cls, module_name)
 
@@ -161,8 +165,6 @@ class View(ModelSQL, ModelView):
             if not encode(root_element):
                 cls.raise_user_error('invalid_xml', (view.rec_name,))
 
-        return True
-
     def get_arch(self, name):
         value = None
         if self.name and self.module:
@@ -219,8 +221,6 @@ class ShowView(Wizard):
             View = pool.get('ir.ui.view')
             view = View(Transaction().context.get('active_id'))
             Model = pool.get(view.model)
-            if view.type != 'form':
-                return Model.fields_view_get(view_type='form')
             return Model.fields_view_get(view_id=view.id)
 
         def get_defaults(self, wizard, state_name, fields):
@@ -289,9 +289,9 @@ class ViewTreeWidth(ModelSQL, ModelView):
             cls.create(to_create)
 
 
-class ViewTreeExpandedState(ModelSQL, ModelView):
-    'View Tree Expanded State'
-    __name__ = 'ir.ui.view_tree_expanded_state'
+class ViewTreeState(ModelSQL, ModelView):
+    'View Tree State'
+    __name__ = 'ir.ui.view_tree_state'
     _rec_name = 'model'
     model = fields.Char('Model', required=True)
     domain = fields.Char('Domain', required=True)
@@ -299,29 +299,41 @@ class ViewTreeExpandedState(ModelSQL, ModelView):
             ondelete='CASCADE')
     child_name = fields.Char('Child Name')
     nodes = fields.Text('Expanded Nodes')
+    selected_nodes = fields.Text('Selected Nodes')
 
     @classmethod
     def __setup__(cls):
-        super(ViewTreeExpandedState, cls).__setup__()
+        super(ViewTreeState, cls).__setup__()
         cls.__rpc__.update({
-                'set_expanded': RPC(readonly=False),
-                'get_expanded': RPC(),
+                'set': RPC(readonly=False),
+                'get': RPC(),
                 })
 
     @classmethod
     def __register__(cls, module_name):
-        super(ViewTreeExpandedState, cls).__register__(module_name)
-
+        TableHandler = backend.get('TableHandler')
         cursor = Transaction().cursor
         table = TableHandler(cursor, cls, module_name)
+
+        # Migration from 2.8: table name changed
+        table.table_rename(cursor, 'ir_ui_view_tree_expanded_state',
+            cls._table)
+
+        super(ViewTreeState, cls).__register__(module_name)
+
+        table = TableHandler(cursor, cls, module_name)
         table.index_action(['model', 'domain', 'user', 'child_name'], 'add')
 
     @staticmethod
     def default_nodes():
         return '[]'
 
+    @staticmethod
+    def default_selected_nodes():
+        return '[]'
+
     @classmethod
-    def set_expanded(cls, model, domain, child_name, nodes):
+    def set(cls, model, domain, child_name, nodes, selected_nodes):
         current_user = Transaction().user
         with Transaction().set_user(0):
             records = cls.search([
@@ -337,10 +349,11 @@ class ViewTreeExpandedState(ModelSQL, ModelView):
                         'domain': domain,
                         'child_name': child_name,
                         'nodes': nodes,
+                        'selected_nodes': selected_nodes,
                         }])
 
     @classmethod
-    def get_expanded(cls, model, domain, child_name):
+    def get(cls, model, domain, child_name):
         current_user = Transaction().user
         with Transaction().set_user(0):
             try:
@@ -352,8 +365,10 @@ class ViewTreeExpandedState(ModelSQL, ModelView):
                         ],
                     limit=1)
             except ValueError:
-                return '[]'
-            return cls(expanded_info).nodes
+                return (cls.default_nodes(), cls.default_selected_nodes())
+            state = cls(expanded_info)
+            return (state.nodes or cls.default_nodes(),
+                state.selected_nodes or cls.default_selected_nodes())
 
 
 class ViewSearch(ModelSQL, ModelView):
diff --git a/trytond/ir/ui/view.xml b/trytond/ir/ui/view.xml
index d17b4e9..e3d3f97 100644
--- a/trytond/ir/ui/view.xml
+++ b/trytond/ir/ui/view.xml
@@ -69,35 +69,35 @@ this repository contains the full copyright notices and license terms. -->
         <menuitem parent="menu_ui"
             action="act_view_tree_width_form" id="menu_view_tree_width"/>
 
-        <record model="ir.ui.view" id="view_tree_expanded_state_form">
-            <field name="model">ir.ui.view_tree_expanded_state</field> 
+        <record model="ir.ui.view" id="view_tree_state_form">
+            <field name="model">ir.ui.view_tree_state</field> 
             <field name="type">form</field>
-            <field name="name">ui_view_tree_expanded_state_form</field>
+            <field name="name">ui_view_tree_state_form</field>
         </record>
-        <record model="ir.ui.view" id="view_tree_expanded_state_tree">
-            <field name="model">ir.ui.view_tree_expanded_state</field>
+        <record model="ir.ui.view" id="view_tree_state_tree">
+            <field name="model">ir.ui.view_tree_state</field>
             <field name="type">tree</field>
-            <field name="name">ui_view_tree_expanded_state_list</field>
+            <field name="name">ui_view_tree_state_list</field>
         </record>
-        <record model="ir.action.act_window" id="act_view_tree_expanded_state">
-            <field name="name">Tree Expanded State</field>
+        <record model="ir.action.act_window" id="act_view_tree_state">
+            <field name="name">Tree State</field>
             <field name="type">ir.action.act_window</field>
-            <field name="res_model">ir.ui.view_tree_expanded_state</field>
+            <field name="res_model">ir.ui.view_tree_state</field>
         </record>
         <record model="ir.action.act_window.view"
-            id="act_view_tree_expanded_state_tree">
+            id="act_view_tree_state_tree">
             <field name="sequence" eval="10"/>
-            <field name="view" ref="view_tree_expanded_state_tree"/>
-            <field name="act_window" ref="act_view_tree_expanded_state"/>
+            <field name="view" ref="view_tree_state_tree"/>
+            <field name="act_window" ref="act_view_tree_state"/>
         </record>
         <record model="ir.action.act_window.view"
-            id="act_view_tree_expanded_state_form">
+            id="act_view_tree_state_form">
             <field name="sequence" eval="20"/>
-            <field name="view" ref="view_tree_expanded_state_form"/>
-            <field name="act_window" ref="act_view_tree_expanded_state"/>
+            <field name="view" ref="view_tree_state_form"/>
+            <field name="act_window" ref="act_view_tree_state"/>
         </record>
-        <menuitem parent="menu_ui" action="act_view_tree_expanded_state"
-            id="menu_view_tree_expanded_state"/>
+        <menuitem parent="menu_ui" action="act_view_tree_state"
+            id="menu_view_tree_state"/>
 
         <record model="ir.ui.view" id="view_search_form">
             <field name="model">ir.ui.view_search</field> 
diff --git a/trytond/ir/view/action_act_window_form.xml b/trytond/ir/view/action_act_window_form.xml
index 4ab4277..1b14858 100644
--- a/trytond/ir/view/action_act_window_form.xml
+++ b/trytond/ir/view/action_act_window_form.xml
@@ -22,6 +22,8 @@ this repository contains the full copyright notices and license terms. -->
             <field name="domain" colspan="5"/>
             <label name="context"/>
             <field name="context" colspan="5"/>
+            <label name="order"/>
+            <field name="order" colspan="5"/>
             <label name="search_value"/>
             <field name="search_value" colspan="5"/>
             <label name="limit"/>
diff --git a/trytond/ir/view/model_field_form.xml b/trytond/ir/view/model_field_form.xml
index b9af27c..a296132 100644
--- a/trytond/ir/view/model_field_form.xml
+++ b/trytond/ir/view/model_field_form.xml
@@ -12,7 +12,7 @@ this repository contains the full copyright notices and license terms. -->
     <field name="relation"/>
     <label name="field_description"/>
     <field name="field_description" colspan="3"/>
-    <label name="help" yfill="1" xalign="0.0"/>
+    <label name="help" yfill="1"/>
     <field name="help" colspan="3"/>
     <label name="module"/>
     <field name="module"/>
diff --git a/trytond/ir/view/translation_form.xml b/trytond/ir/view/translation_form.xml
index c891691..38c0f48 100644
--- a/trytond/ir/view/translation_form.xml
+++ b/trytond/ir/view/translation_form.xml
@@ -14,6 +14,8 @@ this repository contains the full copyright notices and license terms. -->
     <field name="lang"/>
     <label name="module"/>
     <field name="module"/>
+    <label name="overriding_module"/>
+    <field name="overriding_module"/>
     <group col="2" colspan="6" yexpand="1" yfill="1" id="src_value">
         <separator name="src"/>
         <separator name="value"/>
diff --git a/trytond/ir/view/ui_menu_list.xml b/trytond/ir/view/ui_menu_list.xml
index 3e09b18..c4b6cb7 100644
--- a/trytond/ir/view/ui_menu_list.xml
+++ b/trytond/ir/view/ui_menu_list.xml
@@ -3,4 +3,5 @@
 this repository contains the full copyright notices and license terms. -->
 <tree string="Menu">
     <field name="complete_name" icon="icon" expand="1"/>
+    <field name="active" tree_invisible="1"/>
 </tree>
diff --git a/trytond/ir/view/ui_view_tree_expanded_state_form.xml b/trytond/ir/view/ui_view_tree_state_form.xml
similarity index 61%
rename from trytond/ir/view/ui_view_tree_expanded_state_form.xml
rename to trytond/ir/view/ui_view_tree_state_form.xml
index d6458fe..a043c7a 100644
--- a/trytond/ir/view/ui_view_tree_expanded_state_form.xml
+++ b/trytond/ir/view/ui_view_tree_state_form.xml
@@ -1,15 +1,17 @@
 <?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="View Tree Expanded State">
+<form string="View Tree State">
     <label name="model"/>
     <field name="model"/>
     <label name="user"/>
     <field name="user"/>
     <label name="domain"/>
     <field name="domain"/>
-    <label name="child_name" />
-    <field name="child_name" />
-    <separator name="nodes" colspan="4" />
+    <label name="child_name"/>
+    <field name="child_name"/>
+    <separator name="nodes" colspan="4"/>
     <field name="nodes" colspan="4"/>
+    <separator name="selected_nodes" colspan="4"/>
+    <field name="selected_nodes" colspan="4"/>
 </form>
diff --git a/trytond/ir/view/ui_view_tree_expanded_state_list.xml b/trytond/ir/view/ui_view_tree_state_list.xml
similarity index 87%
rename from trytond/ir/view/ui_view_tree_expanded_state_list.xml
rename to trytond/ir/view/ui_view_tree_state_list.xml
index 0527765..f349240 100644
--- a/trytond/ir/view/ui_view_tree_expanded_state_list.xml
+++ b/trytond/ir/view/ui_view_tree_state_list.xml
@@ -1,7 +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="Views Tree Expanded State">
+<tree string="Views Tree State">
     <field name="model"/>
     <field name="domain"/>
     <field name="user"/>
diff --git a/trytond/model/fields/binary.py b/trytond/model/fields/binary.py
index 19f0cab..94b278e 100644
--- a/trytond/model/fields/binary.py
+++ b/trytond/model/fields/binary.py
@@ -1,8 +1,10 @@
 #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 sql import Query, Expression
 
-from trytond.model.fields.field import Field
-from trytond.transaction import Transaction
+from .field import Field, SQLType
+from ...transaction import Transaction
+from ...config import CONFIG
 
 
 class Binary(Field):
@@ -13,8 +15,8 @@ class Binary(Field):
 
     def __init__(self, string='', help='', required=False, readonly=False,
             domain=None, states=None, select=False, on_change=None,
-            on_change_with=None, depends=None, filename=None, order_field=None,
-            context=None, loading='lazy'):
+            on_change_with=None, depends=None, filename=None, context=None,
+            loading='lazy'):
         if filename is not None:
             self.filename = filename
             if depends is None:
@@ -24,8 +26,7 @@ class Binary(Field):
         super(Binary, self).__init__(string=string, help=help,
             required=required, readonly=readonly, domain=domain, states=states,
             select=select, on_change=on_change, on_change_with=on_change_with,
-            depends=depends, order_field=order_field, context=context,
-            loading=loading)
+            depends=depends, context=context, loading=loading)
 
     @staticmethod
     def get(ids, model, name, values=None):
@@ -42,7 +43,7 @@ class Binary(Field):
             values = {}
         res = {}
         converter = buffer
-        default = False
+        default = None
         format_ = Transaction().context.pop('%s.%s' % (model.__name__, name),
             '')
         if format_ == 'size':
@@ -53,3 +54,21 @@ class Binary(Field):
         for i in ids:
             res.setdefault(i, default)
         return res
+
+    @staticmethod
+    def sql_format(value):
+        if isinstance(value, (Query, Expression)):
+            return value
+        db_type = CONFIG['db_type']
+        if db_type == 'postgresql' and value is not None:
+            import psycopg2
+            return psycopg2.Binary(value)
+        return value
+
+    def sql_type(self):
+        db_type = CONFIG['db_type']
+        if db_type == 'postgresql':
+            return SQLType('BYTEA', 'BYTEA')
+        elif db_type == 'mysql':
+            return SQLType('LONGBLOB', 'LONGBLOB')
+        return SQLType('BLOB', 'BLOB')
diff --git a/trytond/model/fields/boolean.py b/trytond/model/fields/boolean.py
index 7e785f9..0dc00f4 100644
--- a/trytond/model/fields/boolean.py
+++ b/trytond/model/fields/boolean.py
@@ -1,7 +1,7 @@
 #This file is part of Tryton.  The COPYRIGHT file at the top level of
 #this repository contains the full copyright notices and license terms.
 
-from trytond.model.fields.field import Field
+from .field import Field, SQLType
 
 
 class Boolean(Field):
@@ -12,11 +12,28 @@ class Boolean(Field):
 
     def __init__(self, string='', help='', readonly=False, domain=None,
             states=None, select=False, on_change=None, on_change_with=None,
-            depends=None, order_field=None, context=None, loading='eager'):
+            depends=None, context=None, loading='eager'):
         super(Boolean, self).__init__(string=string, help=help, required=False,
             readonly=readonly, domain=domain, states=states, select=select,
             on_change=on_change, on_change_with=on_change_with,
-            depends=depends, order_field=order_field, context=context,
-            loading=loading)
+            depends=depends, context=context, loading=loading)
 
     __init__.__doc__ = Field.__init__.__doc__
+
+    def sql_type(self):
+        return SQLType('BOOL', 'BOOL')
+
+    def _domain_add_null(self, column, operator, value, expression):
+        expression = super(Boolean, self)._domain_add_null(
+            column, operator, value, expression)
+        if operator in ('=', '!='):
+            conv = {
+                False: None,
+                None: False,
+                }
+            if value is False or value is None:
+                if operator == '=':
+                    expression |= (column == conv[value])
+                else:
+                    expression &= (column != conv[value])
+        return expression
diff --git a/trytond/model/fields/char.py b/trytond/model/fields/char.py
index 5f9f0bd..64f1c1f 100644
--- a/trytond/model/fields/char.py
+++ b/trytond/model/fields/char.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 sql import Query, Expression
 
-from trytond.model.fields.field import Field, size_validate
+from ...config import CONFIG
+from .field import Field, FieldTranslate, size_validate, SQLType
 
 
 def autocomplete_validate(value):
@@ -9,7 +11,7 @@ def autocomplete_validate(value):
         assert isinstance(value, list), 'autocomplete must be a list'
 
 
-class Char(Field):
+class Char(FieldTranslate):
     '''
     Define a char field (``unicode``).
     '''
@@ -18,8 +20,7 @@ class Char(Field):
     def __init__(self, string='', size=None, help='', required=False,
             readonly=False, domain=None, states=None, translate=False,
             select=False, on_change=None, on_change_with=None, depends=None,
-            order_field=None, context=None, loading=None,
-            autocomplete=None):
+            context=None, loading=None, autocomplete=None):
         '''
         :param translate: A boolean. If ``True`` the field is translatable.
         :param size: A integer. If set defines the maximum size of the values.
@@ -29,8 +30,7 @@ class Char(Field):
         super(Char, self).__init__(string=string, help=help, required=required,
             readonly=readonly, domain=domain, states=states, select=select,
             on_change=on_change, on_change_with=on_change_with,
-            depends=depends, order_field=order_field, context=context,
-            loading=loading)
+            depends=depends, context=context, loading=loading)
         self.__autocomplete = None
         self.autocomplete = autocomplete if autocomplete else None
         self.translate = translate
@@ -55,3 +55,22 @@ class Char(Field):
         self.__size = value
 
     size = property(_get_size, _set_size)
+
+    @staticmethod
+    def sql_format(value):
+        if isinstance(value, (Query, Expression)):
+            return value
+        if value is None:
+            return None
+        elif isinstance(value, str):
+            return unicode(value, 'utf-8')
+        assert isinstance(value, unicode)
+        return value
+
+    def sql_type(self):
+        db_type = CONFIG['db_type']
+        if self.size and db_type != 'sqlite':
+            return SQLType('VARCHAR', 'VARCHAR(%s)' % self.size)
+        elif db_type == 'mysql':
+            return SQLType('CHAR', 'VARCHAR(255)')
+        return SQLType('VARCHAR', 'VARCHAR')
diff --git a/trytond/model/fields/date.py b/trytond/model/fields/date.py
index 7102d38..f769e9d 100644
--- a/trytond/model/fields/date.py
+++ b/trytond/model/fields/date.py
@@ -1,7 +1,10 @@
 #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 datetime
+from sql import Query, Expression
 
-from trytond.model.fields.field import Field
+from ...config import CONFIG
+from .field import Field, SQLType
 
 
 class Date(Field):
@@ -10,6 +13,27 @@ class Date(Field):
     '''
     _type = 'date'
 
+    @staticmethod
+    def sql_format(value):
+        if isinstance(value, (Query, Expression)):
+            return value
+        if value is None:
+            return None
+        if isinstance(value, basestring):
+            year, month, day = map(int, value.split("-", 2))
+            return datetime.date(year, month, day)
+
+        assert(isinstance(value, datetime.date))
+        # Allow datetime with min time for XML-RPC
+        # datetime must be tested separately because datetime is a
+        # subclass of date
+        assert(not isinstance(value, datetime.datetime)
+            or value.time() == datetime.time())
+        return value
+
+    def sql_type(self):
+        return SQLType('DATE', 'DATE')
+
 
 class DateTime(Field):
     '''
@@ -20,22 +44,93 @@ class DateTime(Field):
     def __init__(self, string='', format='%H:%M:%S', help='', required=False,
             readonly=False, domain=None, states=None, select=False,
             on_change=None, on_change_with=None, depends=None,
-            order_field=None, context=None, loading='eager'):
+            context=None, loading='eager'):
         '''
         :param format: The validation format as used by strftime.
         '''
         super(DateTime, self).__init__(string=string, help=help,
             required=required, readonly=readonly, domain=domain, states=states,
             select=select, on_change=on_change, on_change_with=on_change_with,
-            depends=depends, order_field=order_field, context=context,
-            loading=loading)
+            depends=depends, context=context, loading=loading)
         self.format = format
 
     __init__.__doc__ += Field.__init__.__doc__
 
+    @staticmethod
+    def sql_format(value):
+        if isinstance(value, (Query, Expression)):
+            return value
+        if not value:
+            return None
+        if isinstance(value, basestring):
+            datepart, timepart = value.split(" ")
+            year, month, day = map(int, datepart.split("-", 2))
+            hours, minutes, seconds = map(int, timepart.split(":"))
+            return datetime.datetime(year, month, day, hours, minutes, seconds)
+        assert(isinstance(value, datetime.datetime))
+        return value.replace(microsecond=0)
+
+    def sql_type(self):
+        db_type = CONFIG['db_type']
+        if db_type == 'sqlite':
+            return SQLType('TIMESTAMP', 'TIMESTAMP')
+        elif db_type == 'mysql':
+            return SQLType('TIMESTAMP', 'TIMESTAMP NULL')
+        return SQLType('TIMESTAMP', 'TIMESTAMP(0)')
+
+
+class Timestamp(Field):
+    '''
+    Define a timestamp field (``datetime``).
+    '''
+    _type = 'timestamp'
+
+    @staticmethod
+    def sql_format(value):
+        if isinstance(value, (Query, Expression)):
+            return value
+        if value is None:
+            return None
+        if isinstance(value, basestring):
+            datepart, timepart = value.split(" ")
+            year, month, day = map(int, datepart.split("-", 2))
+            timepart_full = timepart.split(".", 1)
+            hours, minutes, seconds = map(int, timepart_full[0].split(":"))
+            if len(timepart_full) == 2:
+                microseconds = int(timepart_full[1])
+            else:
+                microseconds = 0
+            return datetime.datetime(year, month, day, hours, minutes, seconds,
+                    microseconds)
+        assert(isinstance(value, datetime.datetime))
+        return value
+
+    def sql_type(self):
+        db_type = CONFIG['db_type']
+        if db_type == 'sqlite':
+            return SQLType('TIMESTAMP', 'TIMESTAMP')
+        elif db_type == 'mysql':
+            return SQLType('TIMESTAMP', 'TIMESTAMP NULL')
+        return SQLType('TIMESTAMP', 'TIMESTAMP(6)')
+
 
 class Time(DateTime):
     '''
     Define a time field (``time``).
     '''
     _type = 'time'
+
+    @staticmethod
+    def sql_format(value):
+        if isinstance(value, (Query, Expression)):
+            return value
+        if value is None:
+            return None
+        if isinstance(value, basestring):
+            hours, minutes, seconds = map(int, value.split(":"))
+            return datetime.time(hours, minutes, seconds)
+        assert(isinstance(value, datetime.time))
+        return value.replace(microsecond=0)
+
+    def sql_type(self):
+        return SQLType('TIME', 'TIME')
diff --git a/trytond/model/fields/dict.py b/trytond/model/fields/dict.py
index 42076d7..a775916 100644
--- a/trytond/model/fields/dict.py
+++ b/trytond/model/fields/dict.py
@@ -4,9 +4,10 @@ try:
     import simplejson as json
 except ImportError:
     import json
+from sql import Query, Expression
 
-from .field import Field
-from trytond.protocols.jsonrpc import object_hook
+from .field import Field, SQLType
+from ...protocols.jsonrpc import object_hook, JSONEncoder
 
 
 class Dict(Field):
@@ -16,10 +17,10 @@ class Dict(Field):
     def __init__(self, schema_model, string='', help='', required=False,
             readonly=False, domain=None, states=None, select=False,
             on_change=None, on_change_with=None, depends=None,
-            order_field=None, context=None, loading='lazy'):
+            context=None, loading='lazy'):
         super(Dict, self).__init__(string, help, required, readonly, domain,
-            states, select, on_change, on_change_with, depends, order_field,
-            context, loading)
+            states, select, on_change, on_change_with, depends, context,
+            loading)
         self.schema_model = schema_model
 
     def get(self, ids, model, name, values=None):
@@ -29,3 +30,15 @@ class Dict(Field):
                 dicts[value['id']] = json.loads(value[name],
                     object_hook=object_hook)
         return dicts
+
+    @staticmethod
+    def sql_format(value):
+        if isinstance(value, (Query, Expression)):
+            return value
+        if value is None:
+            return None
+        assert isinstance(value, dict)
+        return json.dumps(value, cls=JSONEncoder)
+
+    def sql_type(self):
+        return SQLType('TEXT', 'TEXT')
diff --git a/trytond/model/fields/field.py b/trytond/model/fields/field.py
index 3c6bd34..aa64ca2 100644
--- a/trytond/model/fields/field.py
+++ b/trytond/model/fields/field.py
@@ -1,8 +1,14 @@
 #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 collections import namedtuple
+from sql import operators, Column, Literal, Select, CombiningQuery
+from sql.conditionals import Coalesce, NullIf
+from sql.operators import Concat
 
 from trytond.pyson import PYSON
 from trytond.const import OPERATORS
+from trytond.transaction import Transaction
+from trytond.pool import Pool
 
 
 def domain_validate(value):
@@ -64,13 +70,28 @@ def size_validate(value):
             assert value.types() == set([int]), \
                 'size must return integer'
 
+SQL_OPERATORS = {
+    '=': operators.Equal,
+    '!=': operators.NotEqual,
+    'like': operators.Like,
+    'not like': operators.NotLike,
+    'ilike': operators.ILike,
+    'not ilike': operators.NotILike,
+    'in': operators.In,
+    'not in': operators.NotIn,
+    '<=': operators.LessEqual,
+    '>=': operators.GreaterEqual,
+    '<': operators.Less,
+    '>': operators.Greater,
+    }
+
 
 class Field(object):
     _type = None
 
     def __init__(self, string='', help='', required=False, readonly=False,
             domain=None, states=None, select=False, on_change=None,
-            on_change_with=None, depends=None, order_field=None, context=None,
+            on_change_with=None, depends=None, context=None,
             loading='eager'):
         '''
         :param string: A string for label of the field.
@@ -92,8 +113,6 @@ class Field(object):
             defined the other way around. The list contains all the fields that
             must update the current field.
         :param depends: A list of field name on which this one depends.
-        :param order_field: A string. If set it will use the string when
-            ordering records on the field.
         :param context: A dictionary which will be given to open the relation
             fields.
         :param loading: Define how the field must be loaded:
@@ -115,7 +134,6 @@ class Field(object):
         self.on_change_with = on_change_with
         self.__depends = None
         self.depends = depends or []
-        self.order_field = order_field
         self.__context = None
         self.context = context or {}
         assert loading in ('lazy', 'eager'), \
@@ -187,3 +205,136 @@ class Field(object):
         if inst._values is None:
             inst._values = {}
         inst._values[self.name] = value
+
+    @staticmethod
+    def sql_format(value):
+        return value
+
+    def sql_type(self):
+        raise NotImplementedError
+
+    def _domain_value(self, operator, value):
+        if isinstance(value, (Select, CombiningQuery)):
+            return value
+        if operator in ('in', 'not in'):
+            return [self.sql_format(v) for v in value if v is not None]
+        else:
+            return self.sql_format(value)
+
+    def _domain_add_null(self, column, operator, value, expression):
+        if operator in ('in', 'not in'):
+            if (not isinstance(value, (Select, CombiningQuery))
+                    and any(v is None for v in value)):
+                if operator == 'in':
+                    expression |= (column == None)
+                else:
+                    expression &= (column != None)
+        return expression
+
+    def convert_domain(self, domain, tables, Model):
+        "Return a SQL expression for the domain using tables"
+        table, _ = tables[None]
+        name, operator, value = domain
+        Operator = SQL_OPERATORS[operator]
+        column = Column(table, name)
+        expression = Operator(column, self._domain_value(operator, value))
+        if isinstance(expression, operators.In) and not expression.right:
+            expression = Literal(False)
+        elif isinstance(expression, operators.NotIn) and not expression.right:
+            expression = Literal(True)
+        expression = self._domain_add_null(column, operator, value, expression)
+        return expression
+
+    def convert_order(self, name, tables, Model):
+        "Return a SQL expression to order"
+        table, _ = tables[None]
+        method = getattr(Model, 'order_%s' % name, None)
+        if method:
+            return method(tables)
+        else:
+            return [Column(table, name)]
+
+
+class FieldTranslate(Field):
+
+    def __get_translation_join(self, Model, name,
+            translation, model, table):
+        language = Transaction().language
+        if Model.__name__ == 'ir.model':
+            return table.join(translation, 'LEFT',
+                condition=(translation.name == Concat(table.model, name))
+                & (translation.res_id == -1)
+                & (translation.lang == language)
+                & (translation.type == 'model')
+                & (translation.fuzzy == False))
+        elif Model.__name__ == 'ir.model.field':
+            if name == 'field_description':
+                type_ = 'field'
+            else:
+                type_ = 'help'
+            return table.join(model, 'LEFT',
+                condition=model.id == table.model).join(
+                    translation, 'LEFT',
+                    condition=(translation.name == Concat(Concat(
+                                model.model, ','), table.name))
+                    & (translation.res_id == -1)
+                    & (translation.lang == language)
+                    & (translation.type == type_)
+                    & (translation.fuzzy == False))
+        else:
+            return table.join(translation, 'LEFT',
+                condition=(translation.res_id == table.id)
+                & (translation.name == '%s,%s' % (Model.__name__, name))
+                & (translation.lang == language)
+                & (translation.type == 'model')
+                & (translation.fuzzy == False))
+
+    def convert_domain(self, domain, tables, Model):
+        pool = Pool()
+        Translation = pool.get('ir.translation')
+        IrModel = pool.get('ir.model')
+        if not self.translate:
+            return super(FieldTranslate, self).convert_domain(
+                domain, tables, Model)
+
+        table = Model.__table__()
+        translation = Translation.__table__()
+        model = IrModel.__table__()
+        name, operator, value = domain
+        join = self.__get_translation_join(Model, name,
+            translation, model, table)
+        Operator = SQL_OPERATORS[operator]
+        column = Coalesce(NullIf(translation.value, ''),
+            Column(table, name))
+        where = Operator(column, self._domain_value(operator, value))
+        if isinstance(where, operators.In) and not where.right:
+            where = Literal(False)
+        elif isinstance(where, operators.NotIn) and not where.right:
+            where = Literal(True)
+        where = self._domain_add_null(column, operator, value, where)
+        return tables[None][0].id.in_(join.select(table.id, where=where))
+
+    def convert_order(self, name, tables, Model):
+        pool = Pool()
+        Translation = pool.get('ir.translation')
+        IrModel = pool.get('ir.model')
+        if not self.translate:
+            return super(FieldTranslate, self).convert_order(name, tables,
+                Model)
+
+        table, _ = tables[None]
+        key = name + '.translation'
+        if key not in tables:
+            translation = Translation.__table__()
+            model = IrModel.__table__()
+            join = self.__get_translation_join(Model, name,
+                translation, model, table)
+            tables[key] = {
+                None: (join.right, join.condition),
+                }
+        else:
+            translation, _ = tables[key][None]
+
+        return [Coalesce(NullIf(translation.value, ''), Column(table, name))]
+
+SQLType = namedtuple('SQLType', 'base type')
diff --git a/trytond/model/fields/float.py b/trytond/model/fields/float.py
index a5d5c86..1041f0a 100644
--- a/trytond/model/fields/float.py
+++ b/trytond/model/fields/float.py
@@ -1,8 +1,10 @@
 #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 sql import Query, Expression
 
-from trytond.model.fields.field import Field
-from trytond.pyson import PYSON
+from ...config import CONFIG
+from .field import Field, SQLType
+from ...pyson import PYSON
 
 
 def digits_validate(value):
@@ -25,7 +27,7 @@ class Float(Field):
     def __init__(self, string='', digits=None, help='', required=False,
             readonly=False, domain=None, states=None, select=False,
             on_change=None, on_change_with=None, depends=None,
-            order_field=None, context=None, loading='eager'):
+            context=None, loading='eager'):
         '''
         :param digits: a list of two integers defining the total
             of digits and the number of decimals of the float.
@@ -33,8 +35,7 @@ class Float(Field):
         super(Float, self).__init__(string=string, help=help,
             required=required, readonly=readonly, domain=domain, states=states,
             select=select, on_change=on_change, on_change_with=on_change_with,
-            depends=depends, order_field=order_field, context=context,
-            loading=loading)
+            depends=depends, context=context, loading=loading)
         self.__digits = None
         self.digits = digits
 
@@ -48,3 +49,20 @@ class Float(Field):
         self.__digits = value
 
     digits = property(_get_digits, _set_digits)
+
+    @staticmethod
+    def sql_format(value):
+        if isinstance(value, (Query, Expression)):
+            return value
+        if value is None:
+            return None
+        return float(value)
+
+    def sql_type(self):
+        db_type = CONFIG['db_type']
+        if db_type == 'postgresql':
+            return SQLType('FLOAT8', 'FLOAT8')
+        elif db_type == 'mysql':
+            return SQLType('DOUBLE', 'DOUBLE(255, 15)')
+        else:
+            return SQLType('FLOAT', 'FLOAT')
diff --git a/trytond/model/fields/function.py b/trytond/model/fields/function.py
index 1971cad..2ebc511 100644
--- a/trytond/model/fields/function.py
+++ b/trytond/model/fields/function.py
@@ -59,14 +59,11 @@ class Function(Field):
                 return
         setattr(self._field, name, value)
 
-    def search(self, model, name, clause):
-        '''
-        Call the searcher.
-        Return a list of clauses.
-        '''
+    def convert_domain(self, domain, tables, Model):
+        name, operator, value = domain[:3]
         if not self.searcher:
-            model.raise_user_error('search_function_missing', name)
-        return getattr(model, self.searcher)(name, tuple(clause))
+            Model.raise_user_error('search_function_missing', name)
+        return getattr(Model, self.searcher)(name, domain)
 
     def get(self, ids, Model, name, values=None):
         '''
diff --git a/trytond/model/fields/integer.py b/trytond/model/fields/integer.py
index 72f1d08..2ba0694 100644
--- a/trytond/model/fields/integer.py
+++ b/trytond/model/fields/integer.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 sql import Query, Expression
 
-from trytond.model.fields.field import Field
+from ...config import CONFIG
+from .field import Field, SQLType
 
 
 class Integer(Field):
@@ -10,9 +12,32 @@ class Integer(Field):
     '''
     _type = 'integer'
 
+    def sql_type(self):
+        db_type = CONFIG['db_type']
+        if db_type == 'postgresql':
+            return SQLType('INT4', 'INT4')
+        elif db_type == 'mysql':
+            return SQLType('SIGNED INTEGER', 'BIGINT')
+        else:
+            return SQLType('INTEGER', 'INTEGER')
+
+    def sql_format(self, value):
+        db_type = CONFIG['db_type']
+        if (db_type == 'sqlite'
+                and value is not None
+                and not isinstance(value, (Query, Expression))):
+            value = int(value)
+        return super(Integer, self).sql_format(value)
+
 
 class BigInteger(Integer):
     '''
     Define an integer field (``long``).
     '''
     _type = 'biginteger'
+
+    def sql_type(self):
+        db_type = CONFIG['db_type']
+        if db_type == 'postgresql':
+            return SQLType('INT8', 'INT8')
+        return super(BigInteger, self).sql_type()
diff --git a/trytond/model/fields/many2many.py b/trytond/model/fields/many2many.py
index 954af80..8a94044 100644
--- a/trytond/model/fields/many2many.py
+++ b/trytond/model/fields/many2many.py
@@ -1,9 +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 itertools import chain
-from trytond.model.fields.field import Field, size_validate
-from trytond.transaction import Transaction
-from trytond.pool import Pool
+from sql import Cast, Literal, Column
+from sql.functions import Substring, Position
+
+from .field import Field, size_validate
+from ...transaction import Transaction
+from ...pool import Pool
 
 
 class Many2Many(Field):
@@ -15,8 +18,7 @@ class Many2Many(Field):
     def __init__(self, relation_name, origin, target, string='', order=None,
             datetime_field=None, size=None, help='', required=False,
             readonly=False, domain=None, states=None, on_change=None,
-            on_change_with=None, depends=None, order_field=None, context=None,
-            loading='lazy'):
+            on_change_with=None, depends=None, context=None, loading='lazy'):
         '''
         :param relation_name: The name of the relation model
             or the name of the target model for ModelView only.
@@ -36,8 +38,7 @@ class Many2Many(Field):
         super(Many2Many, self).__init__(string=string, help=help,
             required=required, readonly=readonly, domain=domain, states=states,
             on_change=on_change, on_change_with=on_change_with,
-            depends=depends, order_field=order_field, context=context,
-            loading=loading)
+            depends=depends, context=context, loading=loading)
         self.relation_name = relation_name
         self.origin = origin
         self.target = target
@@ -236,3 +237,94 @@ class Many2Many(Field):
                 return Target(data)
         value = [instance(x) for x in (value or [])]
         super(Many2Many, self).__set__(inst, value)
+
+    def convert_domain_child(self, domain, tables):
+        Target = self.get_target()
+        table, _ = tables[None]
+        name, operator, ids = domain
+
+        def get_child(ids):
+            if not ids:
+                return []
+            children = Target.search([
+                    (name, 'in', ids),
+                    (name, '!=', None),
+                    ], order=[])
+            child_ids = get_child([c.id for c in children])
+            return ids + child_ids
+        expression = table.id.in_(ids + get_child(ids))
+        if operator == 'not child_of':
+            return ~expression
+        return expression
+
+    def convert_domain(self, domain, tables, Model):
+        pool = Pool()
+        Target = self.get_target()
+        Relation = pool.get(self.relation_name)
+        relation = Relation.__table__()
+        table, _ = tables[None]
+        name, operator, value = domain[:3]
+
+        origin_field = Relation._fields[self.origin]
+        origin = Column(relation, self.origin)
+        origin_where = None
+        if origin_field._type == 'reference':
+            origin_where = origin.like(Model.__name__ + ',%')
+            origin = Cast(Substring(origin,
+                    Position(',', origin) + Literal(1)),
+                Relation.id.sql_type().base)
+
+        if '.' not in name:
+            if operator in ('child_of', 'not child_of'):
+                if Target != Model:
+                    query = Target.search([(domain[3], 'child_of', value)],
+                        order=[], query=True)
+                    where = (Column(relation, self.target).in_(query)
+                        & (Column(relation, self.origin) != None))
+                    if origin_where:
+                        where &= origin_where
+                    query = relation.select(origin, where=where)
+                    expression = table.id.in_(query)
+                    if operator == 'not child_of':
+                        return ~expression
+                    return expression
+                if isinstance(value, basestring):
+                    targets = Target.search([('rec_name', 'ilike', value)],
+                        order=[])
+                    ids = [t.id for t in targets]
+                elif not isinstance(value, (list, tuple)):
+                    ids = [value]
+                else:
+                    ids = value
+                if not ids:
+                    expression = table.id.in_([None])
+                    if operator == 'not child_of':
+                        return ~expression
+                    return expression
+                else:
+                    return self.convert_domain_child(
+                        (name, operator, ids), tables)
+
+            if value is None:
+                where = origin != value
+                if origin_where:
+                    where &= origin_where
+                query = relation.select(origin, where=where)
+                expression = ~table.id.in_(query)
+                if operator == '!=':
+                    return ~expression
+                return expression
+            else:
+                if isinstance(value, basestring):
+                    target_name = 'rec_name'
+                else:
+                    target_name = 'id'
+        else:
+            _, target_name = name.split('.', 1)
+        target_domain = [(target_name,) + tuple(domain[1:])]
+        query = Target.search(target_domain, order=[], query=True)
+        where = Column(relation, self.target).in_(query)
+        if origin_where:
+            where &= origin_where
+        query = relation.select(origin, where=where)
+        return table.id.in_(query)
diff --git a/trytond/model/fields/many2one.py b/trytond/model/fields/many2one.py
index 5616c44..84f5621 100644
--- a/trytond/model/fields/many2one.py
+++ b/trytond/model/fields/many2one.py
@@ -1,9 +1,14 @@
 #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 types import NoneType
+from sql import Column, Query, Expression
+from sql.operators import Or
 
-from trytond.model.fields.field import Field
-from trytond.pool import Pool
+from .field import Field, SQLType
+from ...pool import Pool
+from ...config import CONFIG
+from ...tools import reduce_ids
+from ...transaction import Transaction
 
 
 class Many2One(Field):
@@ -16,7 +21,7 @@ class Many2One(Field):
             ondelete='SET NULL', datetime_field=None, help='', required=False,
             readonly=False, domain=None, states=None, select=False,
             on_change=None, on_change_with=None, depends=None,
-            order_field=None, context=None, loading='eager'):
+            context=None, loading='eager'):
         '''
         :param model_name: The name of the target model.
         :param left: The name of the field to store the left value for
@@ -41,8 +46,7 @@ class Many2One(Field):
         super(Many2One, self).__init__(string=string, help=help,
             required=required, readonly=readonly, domain=domain, states=states,
             select=select, on_change=on_change, on_change_with=on_change_with,
-            depends=depends, order_field=order_field, context=context,
-            loading=loading)
+            depends=depends, context=context, loading=loading)
         self.model_name = model_name
         self.left = left
         self.right = right
@@ -71,3 +75,127 @@ class Many2One(Field):
             value = Target(value)
         assert isinstance(value, (Target, NoneType))
         super(Many2One, self).__set__(inst, value)
+
+    @staticmethod
+    def sql_format(value):
+        if isinstance(value, (Query, Expression)):
+            return value
+        if value is None:
+            return None
+        assert value is not False
+        return int(value)
+
+    def sql_type(self):
+        db_type = CONFIG['db_type']
+        if db_type == 'postgresql':
+            return SQLType('INT4', 'INT4')
+        elif db_type == 'mysql':
+            return SQLType('SIGNED INTEGER', 'BIGINT')
+        else:
+            return SQLType('INTEGER', 'INTEGER')
+
+    def convert_domain_child_mptt(self, domain, tables):
+        cursor = Transaction().cursor
+        table, _ = tables[None]
+        name, operator, ids = domain
+        red_sql = reduce_ids(table.id, ids)
+        left = Column(table, self.left)
+        right = Column(table, self.right)
+        cursor.execute(*table.select(left, right, where=red_sql))
+        where = Or()
+        for l, r in cursor.fetchall():
+            where.append((left >= l) & (right <= r))
+        expression = table.id.in_(table.select(table.id, where=where))
+        if operator == 'not child_of':
+            return ~expression
+        return expression
+
+    def convert_domain_child(self, domain, tables):
+        Target = self.get_target()
+        table, _ = tables[None]
+        name, operator, ids = domain
+
+        def get_child(ids):
+            if not ids:
+                return []
+            children = Target.search([
+                    (name, 'in', ids),
+                    (name, '!=', None),
+                    ], order=[])
+            child_ids = get_child([c.id for c in children])
+            return ids + child_ids
+        expression = table.id.in_(ids + get_child(ids))
+        if operator == 'not child_of':
+            return ~expression
+        return expression
+
+    def convert_domain(self, domain, tables, Model):
+        Target = self.get_target()
+        table, _ = tables[None]
+        name, operator, value = domain[:3]
+        column = Column(table, name.split('.', 1)[0])
+        if '.' not in name:
+            if operator in ('child_of', 'not child_of'):
+                if Target != Model:
+                    query = Target.search([(domain[3], 'child_of', value)],
+                        order=[], query=True)
+                    expression = column.in_(query)
+                    if operator == 'not child_of':
+                        return ~expression
+                    return expression
+
+                if isinstance(value, basestring):
+                    targets = Target.search([('rec_name', 'ilike', value)],
+                        order=[])
+                    ids = [t.id for t in targets]
+                elif not isinstance(value, (list, tuple)):
+                    ids = [value]
+                else:
+                    ids = value
+                if not ids:
+                    expression = column.in_([None])
+                    if operator == 'not child_of':
+                        return ~expression
+                    return expression
+                elif self.left and self.right:
+                    return self.convert_domain_child_mptt(
+                        (name, operator, ids), tables)
+                else:
+                    return self.convert_domain_child(
+                        (name, operator, ids), tables)
+
+            if not isinstance(value, basestring):
+                return super(Many2One, self).convert_domain(domain, tables,
+                    Model)
+            else:
+                target_name = 'rec_name'
+        else:
+            _, target_name = name.split('.', 1)
+        target_domain = [(target_name,) + tuple(domain[1:])]
+        if 'active' in Target._fields:
+            target_domain.append(('active', 'in', [True, False]))
+        query = Target.search(target_domain, order=[], query=True)
+        return column.in_(query)
+
+    def convert_order(self, name, tables, Model):
+        if getattr(Model, 'order_%s' % name, None):
+            return super(Many2One, self).convert_order(name, tables, Model)
+
+        Target = self.get_target()
+
+        oname = 'id'
+        if Target._rec_name in Target._fields:
+            oname = Target._rec_name
+        if Target._order_name in Target._fields:
+            oname = Target._order_name
+
+        ofield = Target._fields[oname]
+        table, _ = tables[None]
+        target_tables = tables.get(name)
+        if target_tables is None:
+            target = Target.__table__()
+            target_tables = {
+                None: (target, target.id == Column(table, name)),
+                }
+            tables[name] = target_tables
+        return ofield.convert_order(oname, target_tables, Target)
diff --git a/trytond/model/fields/numeric.py b/trytond/model/fields/numeric.py
index f7171aa..38b87d7 100644
--- a/trytond/model/fields/numeric.py
+++ b/trytond/model/fields/numeric.py
@@ -1,7 +1,11 @@
 #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 decimal import Decimal
+from sql import Query, Expression
 
-from trytond.model.fields.float import Float
+from ...config import CONFIG
+from .field import SQLType
+from .float import Float
 
 
 class Numeric(Float):
@@ -9,3 +13,20 @@ class Numeric(Float):
     Define a numeric field (``decimal``).
     '''
     _type = 'numeric'
+
+    @staticmethod
+    def sql_format(value):
+        if isinstance(value, (Query, Expression)):
+            return value
+        if value is None:
+            return None
+        if isinstance(value, (int, long)):
+            value = Decimal(str(value))
+        assert isinstance(value, Decimal)
+        return value
+
+    def sql_type(self):
+        db_type = CONFIG['db_type']
+        if db_type == 'mysql':
+            return SQLType('DECIMAL', 'DECIMAL(65, 30)')
+        return SQLType('NUMERIC', 'NUMERIC')
diff --git a/trytond/model/fields/one2many.py b/trytond/model/fields/one2many.py
index 177001b..bb9f451 100644
--- a/trytond/model/fields/one2many.py
+++ b/trytond/model/fields/one2many.py
@@ -1,9 +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 itertools import chain
-from trytond.model.fields.field import Field, size_validate
-from trytond.transaction import Transaction
-from trytond.pool import Pool
+from sql import Cast, Literal, Column
+from sql.functions import Substring, Position
+
+from .field import Field, size_validate
+from ...transaction import Transaction
+from ...pool import Pool
 
 
 def add_remove_validate(value):
@@ -21,7 +24,7 @@ class One2Many(Field):
             order=None, datetime_field=None, size=None, help='',
             required=False, readonly=False, domain=None, states=None,
             on_change=None, on_change_with=None, depends=None,
-            order_field=None, context=None, loading='lazy'):
+            context=None, loading='lazy'):
         '''
         :param model_name: The name of the target model.
         :param field: The name of the field that handle the reverse many2one or
@@ -42,8 +45,7 @@ class One2Many(Field):
         super(One2Many, self).__init__(string=string, help=help,
             required=required, readonly=readonly, domain=domain, states=states,
             on_change=on_change, on_change_with=on_change_with,
-            depends=depends, order_field=order_field, context=context,
-            loading=loading)
+            depends=depends, context=context, loading=loading)
         self.model_name = model_name
         self.field = field
         self.__add_remove = None
@@ -213,3 +215,43 @@ class One2Many(Field):
                 return Target(data)
         value = [instance(x) for x in (value or [])]
         super(One2Many, self).__set__(inst, value)
+
+    def convert_domain(self, domain, tables, Model):
+        Target = self.get_target()
+        target = Target.__table__()
+        table, _ = tables[None]
+        name, operator, value = domain[:3]
+
+        origin_field = Target._fields[self.field]
+        origin = Column(target, self.field)
+        origin_where = None
+        if origin_field._type == 'reference':
+            origin_where = origin.like(Model.__name__ + ',%')
+            origin = Cast(Substring(origin,
+                    Position(',', origin) + Literal(1)),
+                Target.id.sql_type().base)
+
+        if '.' not in name:
+            if value is None:
+                where = origin != value
+                if origin_where:
+                    where &= origin_where
+                query = target.select(origin, where=where)
+                expression = ~table.id.in_(query)
+                if operator == '!=':
+                    return ~expression
+                return expression
+            else:
+                if isinstance(value, basestring):
+                    target_name = 'rec_name'
+                else:
+                    target_name = 'id'
+        else:
+            _, target_name = name.split('.', 1)
+        target_domain = [(target_name,) + tuple(domain[1:])]
+        query = Target.search(target_domain, order=[], query=True)
+        where = target.id.in_(query)
+        if origin_where:
+            where &= origin_where
+        query = target.select(origin, where=where)
+        return table.id.in_(query)
diff --git a/trytond/model/fields/property.py b/trytond/model/fields/property.py
index 182c3c6..568b845 100644
--- a/trytond/model/fields/property.py
+++ b/trytond/model/fields/property.py
@@ -2,11 +2,15 @@
 #this repository contains the full copyright notices and license terms.
 
 import copy
-from trytond.model.fields.function import Function
-from trytond.model.fields.field import Field
-from trytond import backend
-from trytond.transaction import Transaction
-from trytond.pool import Pool
+from sql import Cast, Literal
+from sql.functions import Substring, Position
+from sql.conditionals import Case
+
+from .function import Function
+from .field import Field, SQL_OPERATORS
+from .numeric import Numeric
+from ...transaction import Transaction
+from ...pool import Pool
 
 
 class Property(Function):
@@ -60,59 +64,41 @@ class Property(Function):
             prop_value = None
         Property.set(name, model.__name__, ids, prop_value)
 
-    def search(self, model, name, clause):
-        '''
-        :param model: The model.
-        :param clause: The search domain clause. See ModelStorage.search
-        :return: New list of domain.
-        '''
+    def convert_domain(self, domain, tables, Model):
         pool = Pool()
         Rule = pool.get('ir.rule')
         Property = pool.get('ir.property')
-        Model = pool.get('ir.model')
+        IrModel = pool.get('ir.model')
         Field = pool.get('ir.model.field')
         cursor = Transaction().cursor
 
-        field_class = backend.FIELDS[self._type]
-        if not field_class:
-            return []
-        sql_type = field_class.sql_type(model._fields[name])
-        if not sql_type:
-            return []
-        sql_type = sql_type[0]
+        name, operator, value = domain
+
+        sql_type = self._field.sql_type().base
 
-        property_query, property_val = Rule.domain_get('ir.property')
+        property_cond = Rule.domain_get('ir.property')
 
-        property_clause = ''
-        if property_query:
-            property_clause = 'AND ' + property_query
+        property_ = Property.__table__()
+        model_field = Field.__table__()
+        model = IrModel.__table__()
 
         #Fetch res ids that comply with the domain
-        cursor.execute(
-            'SELECT CAST('
-                'SUBSTR("' + Property._table + '".res, '
-                    'POSITION(\',\' IN "' + Property._table + '".res) + 1) '
-                    'AS INTEGER), '
-                '"' + Property._table + '".id '
-            'FROM "' + Property._table + '" '
-                'JOIN "' + Field._table + '" ON '
-                    '("' + Field._table + '"' +
-                        '.id = "' + Property._table + '".field) '
-                'JOIN "' + Model._table + '" ON '
-                    '("' + Model._table +
-                        '".id = "' + Field._table + '".model) '
-            'WHERE '
-                'CASE WHEN "' +
-                    Model._table + '".model = %s '
-                    'AND "' + Field._table + '".name = %s '
-                    + property_clause +
-                ' THEN ' +
-                    self.get_condition(sql_type, clause) +
-                ' ELSE '
-                    '%s '
-                'END',
-            [model.__name__, name] + property_val +
-            self.get_condition_args(clause) + [False])
+        join = property_.join(model_field,
+            condition=model_field.id == property_.field)
+        join = join.join(model,
+            condition=model.id == model_field.model)
+        cond = ((model.model == Model.__name__)
+            & (model_field.name == name))
+        if property_cond:
+            cond &= property_.id.in_(property_cond)
+        cursor.execute(*join.select(
+                Cast(Substring(property_.res,
+                        Position(',', property_.res) + Literal(1)),
+                    Model.id.sql_type().base),
+                property_.id,
+                where=Case((cond, self.get_condition(sql_type, domain,
+                            property_)),
+                    else_=False)))
 
         props = cursor.fetchall()
         default = None
@@ -121,25 +107,24 @@ class Property(Function):
                 default = prop[1]
                 break
 
-        if not default \
-                or ((clause[2] is False or clause[2] is None)
-                    and clause[1] in ['=', '!=']) \
-                or (clause[1] in ['not like', 'not ilike', 'not in', '!=']):
-            operator = 'in'  # default operator
-            if (((clause[2] is False or clause[2] is None)
-                        and clause[1] == '=')
-                    or ((clause[2] is not False and clause[2] is not None)
-                        and clause[1] in [
+        if (not default
+                or ((value is False or value is None)
+                    and operator in ['=', '!='])
+                or (operator in ['not like', 'not ilike', 'not in', '!='])):
+            dom_operator = 'in'  # default operator
+            if (((value is False or value is None) and operator == '=')
+                    or ((value is not False and value is not None)
+                        and operator in [
                             'not like', 'not ilike', 'not in', '!='])):
-                operator = 'not in'
-            return [('id', operator, [x[0] for x in props])]
+                dom_operator = 'not in'
+            return [('id', dom_operator, [x[0] for x in props])]
 
         #Fetch the res ids that doesn't use the default value
-        cursor.execute(
-            "SELECT CAST(SUBSTR(res, POSITION(',' IN res) + 1) AS integer) "
-            'FROM "' + Property._table + '"'
-            'WHERE ' + property_query + ' AND res is not null',
-            property_val)
+        cursor.execute(*property_.select(
+                Cast(Substring(property_.res,
+                        Position(',', property_.res) + Literal(1)),
+                    Model.id.sql_type().base),
+                where=property_cond & (property_.res != None)))
 
         fetchall = cursor.fetchall()
         if not fetchall:
@@ -148,7 +133,7 @@ class Property(Function):
         else:
             other_ids = [x[0] for x in cursor.fetchall()]
 
-            res_ids = model.search(['OR',
+            res_ids = Model.search(['OR',
                 ('id', 'in', [x[0] for x in props]),
                 ('id', 'not in', other_ids)
                 ])
@@ -156,36 +141,35 @@ class Property(Function):
             return [('id', 'in', res_ids)]
 
     @staticmethod
-    def get_condition(sql_type, clause):
-        operator = '%s'
-        if sql_type == 'NUMERIC':
-            operator = 'CAST(%s AS NUMERIC)'
+    def get_condition(sql_type, clause, table):
+        operator = clause[1]
+        value = clause[2]
 
-        value = "SUBSTR(value, POSITION(',' IN value) + 1)"
-        # All negative clauses will be negated later
-        if clause[1] in ('in', 'not in'):
-            operator = operator % '%%s'
-            return ("(CAST(" + value + " AS %s) IN ("
-                + ",".join((operator,) * len(clause[2])) + ")) ") % sql_type
-        elif ((clause[2] is False or clause[2] is None)
-                and clause[1] in ['=', '!=']):
-            return "((CAST(" + value + " AS %s) IS NULL) = %%s) " % sql_type
-        elif clause[1] in ['not like', 'not ilike']:
-            return "(CAST(" + value + " AS %s) %s %s) " % \
-                (sql_type, clause[1].split()[1], operator)
-        elif clause[1] == '!=':
-            return "(CAST(" + value + " AS %s) = %s) " % (sql_type, operator)
-        else:
-            return "(CAST(" + value + " AS %s) %s %s) " % \
-                (sql_type, clause[1], operator)
+        numeric = Numeric('numeric')
+        if sql_type == numeric.sql_type().base and value:
+            if isinstance(value, (list, tuple)):
+                value = [Cast(v, sql_type) for v in value]
+            else:
+                value = Cast(value, sql_type)
 
-    @staticmethod
-    def get_condition_args(clause):
-        res = []
-        if clause[1] in ('in', 'not in'):
-            res.extend(clause[2])
-        elif clause[2] is None:
-            res.append(False)
-        else:
-            res.append(clause[2])
-        return res
+        if value is None:
+            value = False
+
+        column = Cast(Substring(table.value,
+                Position(',', table.value) + Literal(1)),
+            sql_type)
+        Operator = SQL_OPERATORS[operator]
+
+        # All negative clauses will be negated later
+        if operator in ('in', 'not in'):
+            return column.in_(value)
+        elif ((value is False or value is None)
+                and operator in ('=', '!=')):
+            return (column == None) == value
+        elif operator == 'not like':
+            return column.like(value)
+        elif operator == 'not ilike':
+            return column.ilike(value)
+        elif operator == '!=':
+            return column == value
+        return Operator(column, value)
diff --git a/trytond/model/fields/reference.py b/trytond/model/fields/reference.py
index 3f07569..62c4bad 100644
--- a/trytond/model/fields/reference.py
+++ b/trytond/model/fields/reference.py
@@ -2,10 +2,14 @@
 #this repository contains the full copyright notices and license terms.
 import contextlib
 from types import NoneType
+from sql import Cast, Literal, Column, Query, Expression
+from sql.functions import Substring, Position
 
-from trytond.model.fields.field import Field
-from trytond.transaction import Transaction
-from trytond.pool import Pool
+from .field import Field, SQLType
+from .char import Char
+from ...transaction import Transaction
+from ...pool import Pool
+from ...config import CONFIG
 
 
 class Reference(Field):
@@ -17,7 +21,7 @@ class Reference(Field):
     def __init__(self, string='', selection=None, selection_change_with=None,
             help='', required=False, readonly=False, domain=None, states=None,
             select=False, on_change=None, on_change_with=None, depends=None,
-            order_field=None, context=None, loading='lazy'):
+            context=None, loading='lazy'):
         '''
         :param selection: A list or a function name that returns a list.
             The list must be a list of tuples. First member is an internal name
@@ -26,8 +30,7 @@ class Reference(Field):
         super(Reference, self).__init__(string=string, help=help,
             required=required, readonly=readonly, domain=domain, states=states,
             select=select, on_change=on_change, on_change_with=on_change_with,
-            depends=depends, order_field=order_field, context=context,
-            loading=loading)
+            depends=depends, context=context, loading=loading)
         self.selection = selection or None
         self.selection_change_with = selection_change_with
 
@@ -93,3 +96,37 @@ class Reference(Field):
             Target = Pool().get(target)
             value = Target(id_)
         super(Reference, self).__set__(inst, value)
+
+    @staticmethod
+    def sql_format(value):
+        if not isinstance(value, (basestring, Query, Expression)):
+            try:
+                value = '%s,%s' % tuple(value)
+            except TypeError:
+                pass
+        return Char.sql_format(value)
+
+    def sql_type(self):
+        db_type = CONFIG['db_type']
+        if db_type == 'mysql':
+            return SQLType('CHAR', 'VARCHAR(255)')
+        return SQLType('VARCHAR', 'VARCHAR')
+
+    def convert_domain(self, domain, tables, Model):
+        if '.' not in domain[0]:
+            return super(Reference, self).convert_domain(domain, tables, Model)
+        pool = Pool()
+        name, operator, value, target = domain[:4]
+        Target = pool.get(target)
+        table, _ = tables[None]
+        name, target_name = name.split('.', 1)
+        column = Column(table, name)
+        target_domain = [(target_name,) + tuple(domain[1:3])
+            + tuple(domain[4:])]
+        if 'active' in Target._fields:
+            target_domain.append(('active', 'in', [True, False]))
+        query = Target.search(target_domain, order=[], query=True)
+        return (Cast(Substring(column,
+                    Position(',', column) + Literal(1)),
+                Model.id.sql_type().base).in_(query)
+            & column.ilike(target + ',%'))
diff --git a/trytond/model/fields/selection.py b/trytond/model/fields/selection.py
index 03e2d1f..ba44c00 100644
--- a/trytond/model/fields/selection.py
+++ b/trytond/model/fields/selection.py
@@ -1,7 +1,10 @@
 #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 sql import Column
+from sql.conditionals import Case
 
-from trytond.model.fields.field import Field
+from ...config import CONFIG
+from .field import Field, SQLType
 
 
 class Selection(Field):
@@ -14,7 +17,7 @@ class Selection(Field):
             selection_change_with=None, translate=True, help='',
             required=False, readonly=False, domain=None, states=None,
             select=False, on_change=None, on_change_with=None, depends=None,
-            order_field=None, context=None, loading='eager'):
+            context=None, loading='eager'):
         '''
         :param selection: A list or a function name that returns a list.
             The list must be a list of tuples. First member is the value
@@ -24,8 +27,7 @@ class Selection(Field):
         super(Selection, self).__init__(string=string, help=help,
             required=required, readonly=readonly, domain=domain, states=states,
             select=select, on_change=on_change, on_change_with=on_change_with,
-            depends=depends, order_field=order_field, context=context,
-            loading=loading)
+            depends=depends, context=context, loading=loading)
         if hasattr(selection, 'copy'):
             self.selection = selection.copy()
         else:
@@ -34,3 +36,23 @@ class Selection(Field):
         self.sort = sort
         self.translate_selection = translate
     __init__.__doc__ += Field.__init__.__doc__
+
+    def sql_type(self):
+        db_type = CONFIG['db_type']
+        if db_type == 'mysql':
+            return SQLType('CHAR', 'VARCHAR(255)')
+        return SQLType('VARCHAR', 'VARCHAR')
+
+    def convert_order(self, name, tables, Model):
+        if getattr(Model, 'order_%s' % name, None):
+            return super(Selection, self).convert_order(name, tables, Model)
+
+        table, _ = tables[None]
+        selections = Model.fields_get([name])[name]['selection']
+        if not isinstance(selections, (tuple, list)):
+            selections = getattr(Model, selections)()
+        column = Column(table, name)
+        whens = []
+        for key, value in selections:
+            whens.append((column == key, value))
+        return [Case(*whens, else_=column)]
diff --git a/trytond/model/fields/sha.py b/trytond/model/fields/sha.py
index ca05de4..0209337 100644
--- a/trytond/model/fields/sha.py
+++ b/trytond/model/fields/sha.py
@@ -1,11 +1,28 @@
 #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 hashlib
+from sql import Query, Expression
 
-from trytond.model.fields.field import Field
+from ...config import CONFIG
+from .field import SQLType
+from .char import Char
 
 
-class Sha(Field):
+class Sha(Char):
     '''
     Define a sha field (``unicode``) of len 40.
     '''
     _type = 'sha'
+
+    def sql_format(self, value):
+        if value is not None and not isinstance(value, (Query, Expression)):
+            if isinstance(value, unicode):
+                value = value.encode('utf-8')
+            value = hashlib.sha1(value).hexdigest()
+        return super(Sha, self).sql_format(value)
+
+    def sql_type(self):
+        db_type = CONFIG['db_type']
+        if db_type == 'mysql':
+            return SQLType('CHAR', 'VARCHAR(40)')
+        return SQLType('VARCHAR', 'VARCHAR(40)')
diff --git a/trytond/model/fields/text.py b/trytond/model/fields/text.py
index db3f4e8..6d2b37e 100644
--- a/trytond/model/fields/text.py
+++ b/trytond/model/fields/text.py
@@ -1,7 +1,8 @@
 #This file is part of Tryton.  The COPYRIGHT file at the top level of
 #this repository contains the full copyright notices and license terms.
 
-from trytond.model.fields.char import Char
+from .field import SQLType
+from .char import Char
 
 
 class Text(Char):
@@ -9,3 +10,6 @@ class Text(Char):
     Define a text field (``unicode``).
     '''
     _type = 'text'
+
+    def sql_type(self):
+        return SQLType('TEXT', 'TEXT')
diff --git a/trytond/model/model.py b/trytond/model/model.py
index 27d0135..d105038 100644
--- a/trytond/model/model.py
+++ b/trytond/model/model.py
@@ -7,7 +7,7 @@ import warnings
 
 from trytond.model import fields
 from trytond.error import WarningErrorMixin
-from trytond.pool import Pool, PoolMeta
+from trytond.pool import Pool, PoolBase
 from trytond.pyson import PYSONEncoder
 from trytond.transaction import Transaction
 from trytond.url import URLMixin
@@ -16,17 +16,17 @@ from trytond.rpc import RPC
 __all__ = ['Model']
 
 
-class Model(WarningErrorMixin, URLMixin):
+class Model(WarningErrorMixin, URLMixin, PoolBase):
     """
     Define a model in Tryton.
     """
-    __metaclass__ = PoolMeta
     _rec_name = 'name'
 
     id = fields.Integer('ID', readonly=True)
 
     @classmethod
     def __setup__(cls):
+        super(Model, cls).__setup__()
         cls.__rpc__ = {
             'default_get': RPC(),
             'fields_get': RPC(),
@@ -44,7 +44,7 @@ class Model(WarningErrorMixin, URLMixin):
 
     @classmethod
     def __post_setup__(cls):
-        pool = Pool()
+        super(Model, cls).__post_setup__()
 
         # Set _fields
         cls._fields = {}
@@ -72,7 +72,9 @@ class Model(WarningErrorMixin, URLMixin):
             if isinstance(field, (fields.Selection, fields.Reference)) \
                     and not isinstance(field.selection, (list, tuple)) \
                     and field.selection not in cls.__rpc__:
-                cls.__rpc__[field.selection] = RPC()
+                instantiate = 0 if field.selection_change_with else None
+                cls.__rpc__.setdefault(field.selection,
+                    RPC(instantiate=instantiate))
 
             for attribute in ('on_change', 'on_change_with', 'autocomplete'):
                 function_name = '%s_%s' % (attribute, field_name)
@@ -104,202 +106,18 @@ class Model(WarningErrorMixin, URLMixin):
         """
         Add model in ir.model and ir.model.field.
         """
+        super(Model, cls).__register__(module_name)
         pool = Pool()
         Translation = pool.get('ir.translation')
-        Property = pool.get('ir.property')
+        Model_ = pool.get('ir.model')
+        ModelField = pool.get('ir.model.field')
 
-        cursor = Transaction().cursor
-        # Add model in ir_model
-        cursor.execute("SELECT id FROM ir_model WHERE model = %s",
-                (cls.__name__,))
-        model_id = None
-        if cursor.rowcount == -1 or cursor.rowcount is None:
-            data = cursor.fetchone()
-            if data:
-                model_id, = data
-        elif cursor.rowcount != 0:
-            model_id, = cursor.fetchone()
-        if not model_id:
-            cursor.execute("INSERT INTO ir_model "
-                "(model, name, info, module) VALUES (%s, %s, %s, %s)",
-                (cls.__name__, cls._get_name(), cls.__doc__,
-                    module_name))
-            Property._models_get_cache.clear()
-            cursor.execute("SELECT id FROM ir_model WHERE model = %s",
-                    (cls.__name__,))
-            (model_id,) = cursor.fetchone()
-        elif cls.__doc__:
-            cursor.execute('UPDATE ir_model '
-                'SET name = %s, '
-                    'info = %s '
-                'WHERE id = %s',
-                (cls._get_name(), cls.__doc__, model_id))
-
-        # Update translation of model
-        if cls.__doc__:
-            name = cls.__name__ + ',name'
-            src = cls._get_name()
-            cursor.execute('SELECT id FROM ir_translation '
-                'WHERE lang = %s '
-                    'AND type = %s '
-                    'AND name = %s '
-                    'AND (res_id IS NULL OR res_id = %s)',
-                ('en_US', 'model', name, 0))
-            trans_id = None
-            if cursor.rowcount == -1 or cursor.rowcount is None:
-                data = cursor.fetchone()
-                if data:
-                    trans_id, = data
-            elif cursor.rowcount != 0:
-                trans_id, = cursor.fetchone()
-            src_md5 = Translation.get_src_md5(src)
-            if trans_id is None:
-                cursor.execute('INSERT INTO ir_translation '
-                    '(name, lang, type, src, src_md5, value, module, fuzzy) '
-                    'VALUES (%s, %s, %s, %s, %s, %s, %s, %s)',
-                    (name, 'en_US', 'model', src, src_md5, '', module_name,
-                        False))
-            else:
-                cursor.execute('UPDATE ir_translation '
-                    'SET src = %s, src_md5 = %s '
-                    'WHERE id = %s',
-                        (src, src_md5, trans_id))
-
-        # Add field in ir_model_field and update translation
-        cursor.execute('SELECT f.id AS id, f.name AS name, '
-                'f.field_description AS field_description, '
-                'f.ttype AS ttype, f.relation AS relation, '
-                'f.module as module, f.help AS help '
-            'FROM ir_model_field AS f, ir_model AS m '
-            'WHERE f.model = m.id '
-                'AND m.model = %s ',
-            (cls.__name__,))
-        model_fields = {}
-        for field in cursor.dictfetchall():
-            model_fields[field['name']] = field
-
-        # Prefetch field translations
-        if cls._fields:
-            cursor.execute('SELECT id, name, src, type FROM ir_translation '
-                'WHERE lang = %s '
-                    'AND type IN (%s, %s, %s) '
-                    'AND name IN '
-                        '(' + ','.join(('%s',) * len(cls._fields)) + ')',
-                ('en_US', 'field', 'help', 'selection')
-                + tuple([cls.__name__ + ',' + x for x in cls._fields]))
-        trans_fields = {}
-        trans_help = {}
-        trans_selection = {}
-        for trans in cursor.dictfetchall():
-            if trans['type'] == 'field':
-                trans_fields[trans['name']] = trans
-            elif trans['type'] == 'help':
-                trans_help[trans['name']] = trans
-            elif trans['type'] == 'selection':
-                trans_selection.setdefault(trans['name'], {})
-                trans_selection[trans['name']][trans['src']] = trans
-
-        for field_name in cls._fields:
-            field = cls._fields[field_name]
-            relation = ''
-            if hasattr(field, 'model_name'):
-                relation = field.model_name
-            elif hasattr(field, 'relation_name'):
-                relation = field.relation_name
-            if field_name not in model_fields:
-                cursor.execute("INSERT INTO ir_model_field "
-                    "(model, name, field_description, ttype, "
-                        "relation, help, module) "
-                    "VALUES (%s, %s, %s, %s, %s, %s, %s)",
-                    (model_id, field_name, field.string, field._type,
-                        relation, field.help, module_name))
-            elif (model_fields[field_name]['field_description'] != field.string
-                    or model_fields[field_name]['ttype'] != field._type
-                    or model_fields[field_name]['relation'] != relation
-                    or model_fields[field_name]['help'] != field.help):
-                cursor.execute('UPDATE ir_model_field '
-                    'SET field_description = %s, '
-                        'ttype = %s, '
-                        'relation = %s, '
-                        'help = %s '
-                    'WHERE id = %s ',
-                    (field.string, field._type, relation,
-                        field.help, model_fields[field_name]['id']))
-            trans_name = cls.__name__ + ',' + field_name
-            string_md5 = Translation.get_src_md5(field.string)
-            if trans_name not in trans_fields:
-                cursor.execute('INSERT INTO ir_translation '
-                    '(name, lang, type, src, src_md5, value, module, fuzzy) '
-                    'VALUES (%s, %s, %s, %s, %s, %s, %s, %s)',
-                    (trans_name, 'en_US', 'field', field.string,
-                        string_md5, '', module_name, False))
-            elif trans_fields[trans_name]['src'] != field.string:
-                cursor.execute('UPDATE ir_translation '
-                    'SET src = %s, src_md5 = %s '
-                    'WHERE id = %s ',
-                    (field.string, string_md5, trans_fields[trans_name]['id']))
-            help_md5 = Translation.get_src_md5(field.help)
-            if trans_name not in trans_help:
-                if field.help:
-                    cursor.execute('INSERT INTO ir_translation '
-                        '(name, lang, type, src, src_md5, value, module, '
-                            'fuzzy) '
-                        'VALUES (%s, %s, %s, %s, %s, %s, %s, %s)',
-                        (trans_name, 'en_US', 'help', field.help, help_md5, '',
-                            module_name, False))
-            elif trans_help[trans_name]['src'] != field.help:
-                cursor.execute('UPDATE ir_translation '
-                    'SET src = %s, src_md5 = %s '
-                    'WHERE id = %s ',
-                    (field.help, help_md5, trans_help[trans_name]['id']))
-            if (hasattr(field, 'selection')
-                    and isinstance(field.selection, (tuple, list))
-                    and ((hasattr(field, 'translate_selection')
-                            and field.translate_selection)
-                        or not hasattr(field, 'translate_selection'))):
-                for (_, val) in field.selection:
-                    if (trans_name not in trans_selection
-                            or val not in trans_selection[trans_name]):
-                        val_md5 = Translation.get_src_md5(val)
-                        cursor.execute('INSERT INTO ir_translation '
-                            '(name, lang, type, src, src_md5, value, module, '
-                                'fuzzy) '
-                            'VALUES (%s, %s, %s, %s, %s, %s, %s, %s)',
-                            (trans_name, 'en_US', 'selection', val, val_md5,
-                                '', module_name, False))
-        # Clean ir_model_field from field that are no more existing.
-        for field_name in model_fields:
-            if model_fields[field_name]['module'] == module_name \
-                    and field_name not in cls._fields:
-                #XXX This delete field even when it is defined later
-                # in the module
-                cursor.execute('DELETE FROM ir_model_field '
-                    'WHERE id = %s',
-                    (model_fields[field_name]['id'],))
-
-        # Add error messages in ir_translation
-        cursor.execute('SELECT id, src FROM ir_translation '
-            'WHERE lang = %s '
-                'AND type = %s '
-                'AND name = %s',
-            ('en_US', 'error', cls.__name__))
-        trans_error = {}
-        for trans in cursor.dictfetchall():
-            trans_error[trans['src']] = trans
-
-        errors = cls._get_error_messages()
-        for error in set(errors):
-            if error not in trans_error:
-                error_md5 = Translation.get_src_md5(error)
-                cursor.execute('INSERT INTO ir_translation '
-                    '(name, lang, type, src, src_md5, value, module, fuzzy) '
-                    'VALUES (%s, %s, %s, %s, %s, %s, %s, %s)',
-                    (cls.__name__, 'en_US', 'error', error, error_md5, '',
-                        module_name, False))
+        model_id = Model_.register(cls, module_name)
+        ModelField.register(cls, module_name, model_id)
 
-    @classmethod
-    def _get_error_messages(cls):
-        return cls._error_messages.values()
+        Translation.register_model(cls, module_name)
+        Translation.register_fields(cls, module_name)
+        Translation.register_error_messages(cls, module_name)
 
     @classmethod
     def default_get(cls, fields_names, with_rec_name=True):
@@ -432,9 +250,9 @@ class Model(WarningErrorMixin, URLMixin):
                         and getattr(cls._fields[field], arg):
                     res[field][arg] = copy.copy(getattr(cls._fields[field],
                         arg))
-            if isinstance(cls._fields[field],
-                    (fields.Function, fields.One2Many)) \
-                    and not cls._fields[field].order_field:
+            if (isinstance(cls._fields[field],
+                        (fields.Function, fields.One2Many))
+                    and not getattr(cls, 'order_%s' % field, None)):
                 res[field]['sortable'] = False
             if ((isinstance(cls._fields[field], fields.Function)
                     and not cls._fields[field].searcher)
@@ -602,6 +420,16 @@ class Model(WarningErrorMixin, URLMixin):
             return False
         return (self.__name__, self.id) == (other.__name__, other.id)
 
+    def __lt__(self, other):
+        if not isinstance(other, Model) or self.__name__ != other.__name__:
+            return NotImplemented
+        return self.id < other.id
+
+    # TODO: replace by total_ordering when 2.6 will be dropped
+    __gt__ = lambda self, other: not (self < other or self == other)
+    __le__ = lambda self, other: self < other or self == other
+    __ge__ = lambda self, other: not self < other
+
     def __ne__(self, other):
         if not isinstance(other, Model):
             return NotImplemented
diff --git a/trytond/model/modelsingleton.py b/trytond/model/modelsingleton.py
index f680832..266e187 100644
--- a/trytond/model/modelsingleton.py
+++ b/trytond/model/modelsingleton.py
@@ -30,12 +30,17 @@ class ModelSingleton(ModelStorage):
     def read(cls, ids, fields_names=None):
         singleton = cls.get_singleton()
         if not singleton:
-            res = cls.default_get(fields_names, with_rec_name=False)
             if not fields_names:
                 fields_names = cls._fields.keys()
+            fname_no_rec_name = [f for f in fields_names if '.' not in f]
+            res = cls.default_get(fname_no_rec_name,
+                with_rec_name=len(fname_no_rec_name) != len(fields_names))
             for field_name in fields_names:
                 if field_name not in res:
                     res[field_name] = None
+            for field_name in res.keys():
+                if field_name not in fields_names:
+                    del res[field_name]
             res['id'] = ids[0]
             return [res]
         res = super(ModelSingleton, cls).read([singleton.id],
diff --git a/trytond/model/modelsql.py b/trytond/model/modelsql.py
index b71333d..b3fbcfa 100644
--- a/trytond/model/modelsql.py
+++ b/trytond/model/modelsql.py
@@ -1,16 +1,19 @@
 #This file is part of Tryton.  The COPYRIGHT file at the top level of
 #this repository contains the full copyright notices and license terms.
 import contextlib
-import datetime
 import re
 from functools import reduce
-from decimal import Decimal
 from itertools import islice, izip
 
+from sql import Table, Column, Literal, Desc, Asc, Expression, Flavor
+from sql.functions import Now, Extract
+from sql.conditionals import Coalesce
+from sql.operators import Or, And, Operator
+from sql.aggregate import Count, Max
+
 from trytond.model import ModelStorage
 from trytond.model import fields
-from trytond.backend import FIELDS, TableHandler
-from trytond.backend import DatabaseIntegrityError
+from trytond import backend
 from trytond.tools import reduce_ids
 from trytond.const import OPERATORS, RECORD_CACHE_SIZE
 from trytond.transaction import Transaction
@@ -44,7 +47,18 @@ class ModelSQL(ModelStorage):
             'Model _table %s cannot end with "__history"' % cls._table
 
     @classmethod
+    def __table__(cls):
+        return cls.table_query() or Table(cls._table)
+
+    @classmethod
+    def __table_history__(cls):
+        if not cls._history:
+            raise ValueError('No history table')
+        return Table(cls._table + '__history')
+
+    @classmethod
     def __register__(cls, module_name):
+        TableHandler = backend.get('TableHandler')
         super(ModelSQL, cls).__register__(module_name)
 
         if cls.table_query():
@@ -57,116 +71,71 @@ class ModelSQL(ModelStorage):
         if cls._history:
             history_table = TableHandler(Transaction().cursor, cls,
                     module_name, history=True)
-        timestamp_field = FIELDS['timestamp']
-        integer_field = FIELDS['integer']
-        logs = (
-            ('create_date', timestamp_field.sql_type(None),
-                timestamp_field.sql_format, lambda *a: datetime.datetime.now(),
-                cls.create_date.string),
-            ('write_date', timestamp_field.sql_type(None),
-                timestamp_field.sql_format, None, cls.write_date.string),
-            ('create_uid', (integer_field.sql_type(None)[0],
-             'INTEGER REFERENCES res_user ON DELETE SET NULL',),
-             integer_field.sql_format, lambda *a: 0, cls.create_uid.string),
-            ('write_uid', (integer_field.sql_type(None)[0],
-             'INTEGER REFERENCES res_user ON DELETE SET NULL'),
-             integer_field.sql_format, None, cls.write_uid.string),
-            )
-        for log in logs:
-            table.add_raw_column(log[0], log[1], log[2],
-                    default_fun=log[3], migrate=False, string=log[4])
-        if cls._history:
-            history_logs = (
-                    ('create_date', timestamp_field.sql_type(None),
-                        timestamp_field.sql_format, cls.create_date.string),
-                    ('write_date', timestamp_field.sql_type(None),
-                        timestamp_field.sql_format, cls.write_date.string),
-                    ('create_uid', (integer_field.sql_type(None)[0],
-                     'INTEGER REFERENCES res_user ON DELETE SET NULL',),
-                     integer_field.sql_format, cls.create_uid.string),
-                    ('write_uid', (integer_field.sql_type(None)[0],
-                     'INTEGER REFERENCES res_user ON DELETE SET NULL'),
-                     integer_field.sql_format, cls.write_uid.string),
-                    )
-            for log in history_logs:
-                history_table.add_raw_column(log[0], log[1], log[2],
-                        migrate=False, string=log[3])
             history_table.index_action('id', action='add')
 
         for field_name, field in cls._fields.iteritems():
+            if field_name == 'id':
+                continue
             default_fun = None
-            if field_name in (
-                    'id',
-                    'write_uid',
-                    'write_date',
-                    'create_uid',
-                    'create_date',
-                    'rec_name',
-                    ):
+            try:
+                sql_type = field.sql_type()
+            except NotImplementedError:
                 continue
+            if field_name in cls._defaults:
+                default_fun = cls._defaults[field_name]
+
+                def unpack_wrapper(fun):
+                    def unpack_result(*a):
+                        try:
+                            # XXX ugly hack: some default fct try
+                            # to access the non-existing table
+                            result = fun(*a)
+                        except Exception:
+                            return None
+                        clean_results = cls._clean_defaults(
+                            {field_name: result})
+                        return clean_results[field_name]
+                    return unpack_result
+                default_fun = unpack_wrapper(default_fun)
+
+            if hasattr(field, 'size') and isinstance(field.size, int):
+                field_size = field.size
+            else:
+                field_size = None
 
-            if not hasattr(field, 'set'):
-                if field_name in cls._defaults:
-                    default_fun = cls._defaults[field_name]
-
-                    def unpack_wrapper(fun):
-                        def unpack_result(*a):
-                            try:
-                                # XXX ugly hack: some default fct try
-                                # to access the non-existing table
-                                result = fun(*a)
-                            except Exception:
-                                return None
-                            clean_results = cls._clean_defaults(
-                                {field_name: result})
-                            return clean_results[field_name]
-                        return unpack_result
-                    default_fun = unpack_wrapper(default_fun)
-
-                if hasattr(field, 'size') and isinstance(field.size, int):
-                    field_size = field.size
-                else:
-                    field_size = None
-                table.add_raw_column(field_name,
-                        FIELDS[field._type].sql_type(field),
-                        FIELDS[field._type].sql_format, default_fun,
-                        field_size, string=field.string)
-                if cls._history:
-                    history_table.add_raw_column(field_name,
-                            FIELDS[field._type].sql_type(field), None,
-                            string=field.string)
-
-                if isinstance(field, (fields.Integer, fields.Float)):
-                    # migration from tryton 2.2
-                    table.db_default(field_name, None)
-
-                if isinstance(field, (fields.Boolean)):
-                    table.db_default(field_name, False)
-
-                if isinstance(field, fields.Many2One):
-                    if field.model_name in ('res.user', 'res.group'):
-                        ref = field.model_name.replace('.', '_')
-                    else:
-                        ref = pool.get(field.model_name)._table
-                    table.add_fk(field_name, ref, field.ondelete)
+            table.add_raw_column(field_name, sql_type, field.sql_format,
+                default_fun, field_size, string=field.string)
+            if cls._history:
+                history_table.add_raw_column(field_name, sql_type, None,
+                    string=field.string)
 
-                table.index_action(
-                        field_name, action=field.select and 'add' or 'remove')
+            if isinstance(field, (fields.Integer, fields.Float)):
+                # migration from tryton 2.2
+                table.db_default(field_name, None)
 
-                required = field.required
-                table.not_null_action(
-                    field_name, action=required and 'add' or 'remove')
+            if isinstance(field, (fields.Boolean)):
+                table.db_default(field_name, False)
 
-            elif not isinstance(field, (fields.One2Many, fields.Function,
-                        fields.Many2Many)):
-                raise Exception('Unknow field type !')
+            if isinstance(field, fields.Many2One):
+                if field.model_name in ('res.user', 'res.group'):
+                    ref = field.model_name.replace('.', '_')
+                else:
+                    ref = pool.get(field.model_name)._table
+                table.add_fk(field_name, ref, field.ondelete)
+
+            table.index_action(
+                field_name, action=field.select and 'add' or 'remove')
+
+            required = field.required
+            table.not_null_action(
+                field_name, action=required and 'add' or 'remove')
 
         for field_name, field in cls._fields.iteritems():
             if isinstance(field, fields.Many2One) \
                     and field.model_name == cls.__name__ \
                     and field.left and field.right:
                 with Transaction().set_user(0):
-                    cls._rebuild_tree(field_name, False, 0)
+                    cls._rebuild_tree(field_name, None, 0)
 
         for ident, constraint, _ in cls._sql_constraints:
             table.add_constraint(ident, constraint)
@@ -174,21 +143,24 @@ class ModelSQL(ModelStorage):
         if cls._history:
             cls._update_history_table()
             cursor = Transaction().cursor
-            cursor.execute('SELECT id FROM "' + cls._table + '"')
+            table = cls.__table__()
+            history_table = cls.__table_history__()
+            cursor.execute(*table.select(table.id))
             if cursor.fetchone():
-                cursor.execute('SELECT id FROM "' + cls._table + '__history"')
+                cursor.execute(*history_table.select(history_table.id))
                 if not cursor.fetchone():
-                    columns = ['"' + str(x) + '"' for x in cls._fields
-                            if not hasattr(cls._fields[x], 'set')]
-                    cursor.execute('INSERT INTO "' + cls._table + '__history" '
-                        '(' + ','.join(columns) + ') '
-                        'SELECT ' + ','.join(columns) +
-                        ' FROM "' + cls._table + '"')
-                    cursor.execute('UPDATE "' + cls._table + '__history" '
-                        'SET write_date = NULL')
+                    columns = [n for n, f in cls._fields.iteritems()
+                        if not hasattr(f, 'set')]
+                    cursor.execute(*history_table.insert(
+                            [Column(history_table, c) for c in columns],
+                            table.select(*(Column(table, c)
+                                    for c in columns))))
+                    cursor.execute(*history_table.update(
+                            [history_table.write_date], [None]))
 
     @classmethod
     def _update_history_table(cls):
+        TableHandler = backend.get('TableHandler')
         if cls._history:
             table = TableHandler(Transaction().cursor, cls)
             history_table = TableHandler(Transaction().cursor, cls,
@@ -219,173 +191,214 @@ class ModelSQL(ModelStorage):
         return None
 
     @classmethod
+    def __raise_integrity_error(cls, exception, values, field_names=None):
+        pool = Pool()
+        if field_names is None:
+            field_names = cls._fields.keys()
+        for field_name in field_names:
+            if field_name not in cls._fields:
+                continue
+            field = cls._fields[field_name]
+            # Check required fields
+            if (field.required
+                    and not hasattr(field, 'set')
+                    and field_name not in ('create_uid', 'create_date')):
+                if values.get(field_name) is None:
+                    cls.raise_user_error('required_field',
+                        error_args=cls._get_error_args(field_name))
+            if isinstance(field, fields.Many2One) and values.get(field_name):
+                Model = pool.get(field.model_name)
+                create_records = Transaction().create_records.get(
+                    field.model_name, set())
+                delete_records = Transaction().delete_records.get(
+                    field.model_name, set())
+                target_records = Model.search([
+                        ('id', '=', values[field_name]),
+                        ], order=[])
+                if not ((target_records
+                            or (values[field_name] in create_records))
+                        and (values[field_name] not in delete_records)):
+                    cls.raise_user_error('foreign_model_missing',
+                        error_args=cls._get_error_args(field_name))
+        for name, _, error in cls._sql_constraints:
+            if name in exception[0]:
+                cls.raise_user_error(error)
+        for name, error in cls._sql_error_messages.iteritems():
+            if name in exception[0]:
+                cls.raise_user_error(error)
+
+    @classmethod
+    def __insert_history(cls, ids, deleted=False):
+        transaction = Transaction()
+        cursor = transaction.cursor
+        in_max = cursor.IN_MAX
+        if not cls._history:
+            return
+        user = transaction.user
+        table = cls.__table__()
+        history = cls.__table_history__()
+        columns = []
+        hcolumns = []
+        if not deleted:
+            fields = cls._fields
+        else:
+            fields = {
+                'id': cls.id,
+                'write_uid': cls.write_uid,
+                'write_date': cls.write_date,
+                }
+        for fname, field in sorted(fields.iteritems()):
+            if hasattr(field, 'set'):
+                continue
+            columns.append(Column(table, fname))
+            hcolumns.append(Column(history, fname))
+        for i in range(0, len(ids), in_max):
+            sub_ids = ids[i:i + in_max]
+            if not deleted:
+                where = reduce_ids(table.id, sub_ids)
+                cursor.execute(*history.insert(hcolumns,
+                        table.select(*columns, where=where)))
+            else:
+                cursor.execute(*history.insert(hcolumns,
+                        [[id_, Now(), user] for id_ in sub_ids]))
+
+    @classmethod
+    def __check_timestamp(cls, ids):
+        transaction = Transaction()
+        cursor = transaction.cursor
+        in_max = cursor.IN_MAX
+        table = cls.__table__()
+        if not transaction.timestamp:
+            return
+        for i in range(0, len(ids), in_max):
+            sub_ids = ids[i:i + in_max]
+            where = Or()
+            for id_ in sub_ids:
+                try:
+                    timestamp = transaction.timestamp.pop(
+                        '%s,%s' % (cls.__name__, id_))
+                except KeyError:
+                    continue
+                sql_type = fields.Numeric('timestamp').sql_type().base
+                where.append((table.id == id_)
+                    & (Extract('EPOCH',
+                            Coalesce(table.write_date, table.create_date)
+                            ).cast(sql_type) > timestamp))
+            if where:
+                cursor.execute(*table.select(table.id, where=where))
+                if cursor.fetchone():
+                    raise ConcurrencyException(
+                        'Records were modified in the meanwhile')
+
+    @classmethod
     def create(cls, vlist):
-        super(ModelSQL, cls).create(vlist)
-        cursor = Transaction().cursor
+        DatabaseIntegrityError = backend.get('DatabaseIntegrityError')
+        transaction = Transaction()
+        cursor = transaction.cursor
         pool = Pool()
+        Translation = pool.get('ir.translation')
+        in_max = cursor.IN_MAX
+
+        super(ModelSQL, cls).create(vlist)
 
         if cls.table_query():
             return False
 
+        table = cls.__table__()
         modified_fields = set()
         new_ids = []
         vlist = [v.copy() for v in vlist]
         for values in vlist:
             # Clean values
-            for key in ('create_uid', 'create_date', 'write_uid', 'write_date',
-                    'id'):
+            for key in ('create_uid', 'create_date',
+                    'write_uid', 'write_date', 'id'):
                 if key in values:
                     del values[key]
             modified_fields |= set(values.keys())
 
             # Get default values
             default = []
-            for i in cls._fields.keys():
-                if not i in values \
-                        and i not in ('create_uid', 'create_date',
-                                'write_uid', 'write_date'):
-                    default.append(i)
+            for f in cls._fields.keys():
+                if (f not in values
+                        and f not in ('create_uid', 'create_date',
+                            'write_uid', 'write_date', 'id')):
+                    default.append(f)
 
-            if len(default):
+            if default:
                 defaults = cls.default_get(default, with_rec_name=False)
-                for field in defaults.keys():
-                    if '.' in field:
-                        del defaults[field]
-                    if field in ('create_uid', 'create_date',
-                            'write_uid', 'write_date'):
-                        del defaults[field]
-                    if field in values:
-                        del defaults[field]
                 values.update(cls._clean_defaults(defaults))
 
-            (upd0, upd1, upd2) = ('', '', [])
+            insert_columns = [table.create_uid, table.create_date]
+            insert_values = [transaction.user, Now()]
 
             # Insert record
             for fname, value in values.iteritems():
                 field = cls._fields[fname]
                 if not hasattr(field, 'set'):
-                    upd0 = upd0 + ',"' + fname + '"'
-                    upd1 = upd1 + ', %s'
-                    upd2.append(FIELDS[field._type].sql_format(value))
-            upd0 += ', create_uid, create_date'
-            upd1 += ', %s, %s'
-            upd2.append(Transaction().user)
-            upd2.append(datetime.datetime.now())
+                    insert_columns.append(Column(table, fname))
+                    insert_values.append(field.sql_format(value))
 
             try:
                 if cursor.has_returning():
-                    cursor.execute('INSERT INTO "' + cls._table + '" '
-                        '(' + upd0[1:] + ') '
-                        'VALUES (' + upd1[1:] + ') RETURNING id',
-                        tuple(upd2))
+                    cursor.execute(*table.insert(insert_columns,
+                            [insert_values], [table.id]))
                     id_new, = cursor.fetchone()
                 else:
                     id_new = cursor.nextid(cls._table)
                     if id_new:
-                        cursor.execute('INSERT INTO "' + cls._table + '" '
-                            '(id' + upd0 + ') '
-                            'VALUES (' + str(id_new) + upd1 + ')',
-                            tuple(upd2))
+                        insert_columns.append(table.id)
+                        insert_values.append(id_new)
+                        cursor.execute(*table.insert(insert_columns,
+                                [insert_values]))
                     else:
-                        cursor.execute('INSERT INTO "' + cls._table + '" '
-                            '(' + upd0[1:] + ') '
-                            'VALUES (' + upd1[1:] + ')',
-                            tuple(upd2))
+                        cursor.execute(*table.insert(insert_columns,
+                                [insert_values]))
                         id_new = cursor.lastid()
                 new_ids.append(id_new)
             except DatabaseIntegrityError, exception:
                 with contextlib.nested(Transaction().new_cursor(),
                         Transaction().set_user(0)):
-                    for field_name in cls._fields:
-                        field = cls._fields[field_name]
-                        # Check required fields
-                        if (field.required
-                                and not hasattr(field, 'set')
-                                and field_name not in (
-                                    'create_uid', 'create_date')):
-                            if values.get(field_name) is None:
-                                cls.raise_user_error('required_field',
-                                        error_args=cls._get_error_args(
-                                            field_name))
-                        if isinstance(field, fields.Many2One) \
-                                and values.get(field_name):
-                            Model = pool.get(field.model_name)
-                            create_records = Transaction().create_records.get(
-                                    field.model_name, set())
-                            delete_records = Transaction().delete_records.get(
-                                    field.model_name, set())
-                            if not ((Model.search([
-                                                ('id', '=',
-                                                    values[field_name]),
-                                                ], order=[])
-                                        or values[field_name] in
-                                        create_records)
-                                    and values[field_name] not in
-                                    delete_records):
-                                cls.raise_user_error('foreign_model_missing',
-                                        error_args=cls._get_error_args(
-                                            field_name))
-                    for name, _, error in cls._sql_constraints:
-                        if name in exception[0]:
-                            cls.raise_user_error(error)
-                    for name, error in cls._sql_error_messages.iteritems():
-                        if name in exception[0]:
-                            cls.raise_user_error(error)
+                    cls.__raise_integrity_error(exception, values)
                 raise
 
-        domain1, domain2 = pool.get('ir.rule').domain_get(cls.__name__,
+        domain = pool.get('ir.rule').domain_get(cls.__name__,
                 mode='create')
-        if domain1:
-            in_max = Transaction().cursor.IN_MAX
+        if domain:
             for i in range(0, len(new_ids), in_max):
                 sub_ids = new_ids[i:i + in_max]
-                red_sql, red_ids = reduce_ids('id', sub_ids)
+                red_sql = reduce_ids(table.id, sub_ids)
 
-                cursor.execute('SELECT id FROM "' + cls._table + '" WHERE ' +
-                        red_sql + ' AND (' + domain1 + ')', red_ids + domain2)
+                cursor.execute(*table.select(table.id,
+                        where=red_sql & table.id.in_(domain)))
                 if len(cursor.fetchall()) != len(sub_ids):
                     cls.raise_user_error('access_error', cls.__name__)
 
-        create_records = Transaction().create_records.setdefault(cls.__name__,
+        transaction.create_records.setdefault(cls.__name__,
             set()).update(new_ids)
 
+        translation_values = {}
         for values, new_id in izip(vlist, new_ids):
             for fname, value in values.iteritems():
                 field = cls._fields[fname]
-                if getattr(field, 'translate', False):
-                        pool.get('ir.translation').set_ids(
-                                cls.__name__ + ',' + fname, 'model',
-                                Transaction().language, [new_id], value)
+                if (getattr(field, 'translate', False)
+                        and not hasattr(field, 'set')):
+                    translation_values.setdefault(
+                        '%s,%s' % (cls.__name__, fname), {})[new_id] = value
                 if hasattr(field, 'set'):
                     field.set([new_id], cls, fname, value)
 
-        if cls._history:
-            columns = ['"' + str(x) + '"' for x in cls._fields
-                if not hasattr(cls._fields[x], 'set')]
-            columns = ','.join(columns)
-            for i in range(0, len(new_ids), cursor.IN_MAX):
-                sub_ids = new_ids[i:i + cursor.IN_MAX]
-                red_sql, red_ids = reduce_ids('id', sub_ids)
-                cursor.execute('INSERT INTO "' + cls._table + '__history" '
-                    '(' + columns + ') '
-                    'SELECT ' + columns + ' '
-                    'FROM "' + cls._table + '" '
-                    'WHERE ' + red_sql, red_ids)
+        if translation_values:
+            for name, translations in translation_values.iteritems():
+                Translation.set_ids(name, 'model', Transaction().language,
+                    translations.keys(), translations.values())
+
+        cls.__insert_history(new_ids)
 
         records = cls.browse(new_ids)
         cls._validate(records)
 
-        # Check for Modified Preorder Tree Traversal
-        for k in cls._fields:
-            field = cls._fields[k]
-            if (isinstance(field, fields.Many2One)
-                    and field.model_name == cls.__name__
-                    and field.left and field.right):
-                if len(new_ids) == 1:
-                    cls._update_tree(new_ids[0], k, field.left, field.right)
-                else:
-                    with Transaction().set_user(0):
-                        cls._rebuild_tree(k, False, 0)
+        field_names = cls._fields.keys()
+        cls._update_mptt(field_names, [new_ids] * len(field_names))
 
         cls.trigger_create(records)
         return records
@@ -405,7 +418,7 @@ class ModelSQL(ModelStorage):
             return []
 
         # construct a clause for the rules :
-        domain1, domain2 = Rule.domain_get(cls.__name__, mode='read')
+        domain = Rule.domain_get(cls.__name__, mode='read')
 
         fields_related = {}
         datetime_fields = []
@@ -421,228 +434,210 @@ class ModelSQL(ModelStorage):
             if hasattr(field, 'datetime_field') and field.datetime_field:
                 datetime_fields.append(field.datetime_field)
 
-        fields_pre = [x
-            for x in fields_names + fields_related.keys() + datetime_fields
-            if (x in cls._fields and not hasattr(cls._fields[x], 'set'))
-            or (x == '_timestamp')]
-
-        res = []
-        table_query = ''
-        table_args = []
-
-        if cls.table_query():
-            table_query, table_args = cls.table_query()
-            table_query = '(' + table_query + ') AS '
+        result = []
+        table = cls.__table__()
+        table_query = cls.table_query()
 
         in_max = cursor.IN_MAX
-        history_order = ''
-        history_clause = ''
-        history_limit = ''
-        history_args = []
+        history_order = None
+        history_clause = None
+        history_limit = None
         if (cls._history
                 and Transaction().context.get('_datetime')
                 and not table_query):
             in_max = 1
-            table_query = '"' + cls._table + '__history" AS '
-            history_clause = ' AND (COALESCE(write_date, create_date) <= %s)'
-            history_order = ' ORDER BY COALESCE(write_date, create_date) DESC'
-            history_limit = cursor.limit_clause('', 1)
-            history_args = [Transaction().context['_datetime']]
-        if len(fields_pre):
-            fields_pre2 = ['"%s"."%s" AS "%s"' % (cls._table, x, x)
-                    for x in fields_pre if x != '_timestamp']
-            if '_timestamp' in fields_pre:
-                if not cls.table_query():
-                    fields_pre2 += ['CAST(EXTRACT(EPOCH FROM '
-                            '(COALESCE("%s".write_date, "%s".create_date))) '
-                            'AS VARCHAR) AS _timestamp' %
-                            (cls._table, cls._table)]
-            if 'id' not in fields_pre:
-                fields_pre2 += ['"%s".id AS id' % cls._table]
+            table = cls.__table_history__()
+            column = Coalesce(table.write_date, table.create_date)
+            history_clause = (column <= Transaction().context['_datetime'])
+            history_order = column.desc
+            history_limit = 1
+
+        columns = []
+        for f in fields_names + fields_related.keys() + datetime_fields:
+            if (f in cls._fields and not hasattr(cls._fields[f], 'set')):
+                columns.append(Column(table, f).as_(f))
+            elif f == '_timestamp' and not table_query:
+                sql_type = fields.Char('timestamp').sql_type().base
+                columns.append(Extract('EPOCH',
+                        Coalesce(table.write_date, table.create_date)
+                        ).cast(sql_type).as_('_timestamp'))
+
+        if len(columns):
+            if 'id' not in fields_names:
+                columns.append(table.id.as_('id'))
 
             for i in range(0, len(ids), in_max):
                 sub_ids = ids[i:i + in_max]
-                red_sql, red_ids = reduce_ids('id', sub_ids)
-                if domain1:
-                    cursor.execute('SELECT ' + ','.join(fields_pre2)
-                        + ' FROM ' + table_query + '\"' + cls._table + '\" '
-                        'WHERE ' + red_sql + history_clause +
-                            ' AND (' + domain1 + ') '
-                        + history_order
-                        + history_limit,
-                        table_args + red_ids + history_args + domain2)
-                else:
-                    cursor.execute('SELECT ' + ','.join(fields_pre2)
-                        + ' FROM ' + table_query + '\"' + cls._table + '\" '
-                        'WHERE ' + red_sql + history_clause
-                        + history_order
-                        + history_limit,
-                        table_args + red_ids + history_args)
+                red_sql = reduce_ids(table.id, sub_ids)
+                where = red_sql
+                if history_clause:
+                    where &= history_clause
+                if domain:
+                    where &= table.id.in_(domain)
+                cursor.execute(*table.select(*columns, where=where,
+                        order_by=history_order, limit=history_limit))
                 dictfetchall = cursor.dictfetchall()
                 if not len(dictfetchall) == len({}.fromkeys(sub_ids)):
-                    if domain1:
-                        cursor.execute('SELECT id '
-                            'FROM ' + table_query + '\"' + cls._table + '\" '
-                            'WHERE ' + red_sql + history_clause
-                            + history_order
-                            + history_limit,
-                            table_args + red_ids + history_args)
+                    if domain:
+                        where = red_sql
+                        if history_clause:
+                            where &= history_clause
+                        where &= table.id.in_(domain)
+                        cursor.execute(*table.select(table.id, where=where,
+                                order_by=history_order, limit=history_limit))
                         rowcount = cursor.rowcount
                         if rowcount == -1 or rowcount is None:
                             rowcount = len(cursor.fetchall())
                         if rowcount == len({}.fromkeys(sub_ids)):
                             cls.raise_user_error('access_error', cls.__name__)
                     cls.raise_user_error('read_error', cls.__name__)
-                res.extend(dictfetchall)
+                result.extend(dictfetchall)
         else:
-            res = [{'id': x} for x in ids]
+            result = [{'id': x} for x in ids]
 
-        for field in fields_pre:
+        for column in columns:
+            field = column.output_name
             if field == '_timestamp':
                 continue
-            if getattr(cls._fields[field], 'translate', False):
-                ids = [x['id'] for x in res]
-                res_trans = Translation.get_ids(cls.__name__ + ',' + field,
+            if (getattr(cls._fields[field], 'translate', False)
+                    and not hasattr(field, 'set')):
+                translations = Translation.get_ids(cls.__name__ + ',' + field,
                     'model', Transaction().language, ids)
-                for i in res:
-                    i[field] = res_trans.get(i['id'], False) or i[field]
-
-        ids = [x['id'] for x in res]
+                for row in result:
+                    row[field] = translations.get(row['id']) or row[field]
 
         # all fields for which there is a get attribute
-        fields_post = [x for x in
+        getter_fields = [f for f in
             fields_names + fields_related.keys() + datetime_fields
-            if x in cls._fields and hasattr(cls._fields[x], 'get')]
+            if f in cls._fields and hasattr(cls._fields[f], 'get')]
         func_fields = {}
-        for field in fields_post:
-            if isinstance(cls._fields[field], fields.Function):
-                key = (cls._fields[field].getter,
-                    getattr(cls._fields[field], 'datetime_field', None))
+        for fname in getter_fields:
+            field = cls._fields[fname]
+            if isinstance(field, fields.Function):
+                key = (field.getter, getattr(field, 'datetime_field', None))
                 func_fields.setdefault(key, [])
-                func_fields[key].append(field)
-                continue
-            if hasattr(cls._fields[field], 'datetime_field') \
-                    and cls._fields[field].datetime_field:
-                for record in res:
-                    with Transaction().set_context(_datetime=record[
-                                cls._fields[field].datetime_field]):
-                        res2 = cls._fields[field].get([record['id']], cls,
-                            field, values=[record])
-                    record[field] = res2[record['id']]
-                continue
-            # get the value of that field for all records/ids
-            res2 = cls._fields[field].get(ids, cls, field, values=res)
-            for record in res:
-                record[field] = res2[record['id']]
+                func_fields[key].append(fname)
+            elif getattr(field, 'datetime_field', None):
+                for row in result:
+                    with Transaction().set_context(
+                            _datetime=row[field.datetime_field]):
+                        date_result = field.get([row['id']], cls, fname,
+                            values=[row])
+                    row[field] = date_result[row['id']]
+            else:
+                # get the value of that field for all records/ids
+                getter_result = field.get(ids, cls, fname, values=result)
+                for row in result:
+                    row[fname] = getter_result[row['id']]
+
         for key in func_fields:
             field_list = func_fields[key]
-            field = field_list[0]
+            fname = field_list[0]
+            field = cls._fields[fname]
             _, datetime_field = key
             if datetime_field:
-                for record in res:
+                for row in result:
                     with Transaction().set_context(
-                            _datetime=record[datetime_field]):
-                        res2 = cls._fields[field].get([record['id']], cls,
-                                field_list, values=[record])
-                    for field in res2:
-                        record[field] = res2[field][record['id']]
-                continue
-            res2 = cls._fields[field].get(ids, cls, field_list, values=res)
-            for field in res2:
-                for record in res:
-                    record[field] = res2[field][record['id']]
+                            _datetime=row[datetime_field]):
+                        date_results = field.get([row['id']], cls, field_list,
+                            values=[row])
+                    for fname, date_result in date_results.iteritems():
+                        row[fname] = date_result[row['id']]
+            else:
+                getter_results = field.get(ids, cls, field_list, values=result)
+                for fname, getter_result in getter_results.iteritems():
+                    for row in result:
+                        row[fname] = getter_result[row['id']]
 
         to_del = set()
         fields_related2values = {}
-        for field in fields_related.keys() + datetime_fields:
-            if field not in fields_names:
-                to_del.add(field)
-            if field not in cls._fields:
+        for fname in fields_related.keys() + datetime_fields:
+            if fname not in fields_names:
+                to_del.add(fname)
+            if fname not in cls._fields:
                 continue
-            if field not in fields_related.keys():
+            if fname not in fields_related:
                 continue
-            fields_related2values.setdefault(field, {})
-            if cls._fields[field]._type in ('many2one', 'one2one'):
-                if hasattr(cls._fields[field], 'model_name'):
-                    obj = pool.get(cls._fields[field].model_name)
+            fields_related2values.setdefault(fname, {})
+            field = cls._fields[fname]
+            if field._type in ('many2one', 'one2one'):
+                if hasattr(field, 'model_name'):
+                    Target = pool.get(field.model_name)
                 else:
-                    obj = cls._fields[field].get_target()
-                if hasattr(cls._fields[field], 'datetime_field') \
-                        and cls._fields[field].datetime_field:
-                    for record in res:
-                        if record[field] is None:
+                    Target = field.get_target()
+                if getattr(field, 'datetime_field', None):
+                    for row in result:
+                        if row[fname] is None:
                             continue
-                        with Transaction().set_context(_datetime=record[
-                                    cls._fields[field].datetime_field]):
-                            record2, = obj.read([record[field]],
-                                    fields_related[field])
-                        record_id = record2['id']
-                        del record2['id']
-                        fields_related2values[field].setdefault(record_id, {})
+                        with Transaction().set_context(
+                                _datetime=row[field.datetime_field]):
+                            date_target, = Target.read([row[fname]],
+                                fields_related[fname])
+                        target_id = date_target.pop('id')
+                        fields_related2values[fname].setdefault(target_id, {})
                         fields_related2values[
-                                field][record_id][record['id']] = record2
+                            fname][target_id][row['id']] = date_target
                 else:
-                    for record in obj.read([x[field] for x in res
-                                if x[field]], fields_related[field]):
-                        record_id = record['id']
-                        del record['id']
-                        fields_related2values[field].setdefault(record_id, {})
-                        for record2 in res:
+                    for target in Target.read(
+                            [r[fname] for r in result if r[fname]],
+                            fields_related[fname]):
+                        target_id = target.pop('id')
+                        fields_related2values[fname].setdefault(target_id, {})
+                        for row in result:
                             fields_related2values[
-                                field][record_id][record2['id']] = record
-            elif cls._fields[field]._type == 'reference':
-                for record in res:
-                    if not record[field]:
+                                fname][target_id][row['id']] = target
+            elif field._type == 'reference':
+                for row in result:
+                    if not row[fname]:
                         continue
-                    model_name, record_id = record[field].split(',', 1)
+                    model_name, record_id = row[fname].split(',', 1)
                     if not model_name:
                         continue
                     record_id = int(record_id)
                     if record_id < 0:
                         continue
-                    obj = pool.get(model_name)
-                    record2, = obj.read([record_id], fields_related[field])
-                    del record2['id']
-                    fields_related2values[field][record[field]] = record2
-
-        if to_del or fields_related.keys() or datetime_fields:
-            for record in res:
-                for field in fields_related.keys():
-                    if field not in cls._fields:
+                    Target = pool.get(model_name)
+                    target, = Target.read([record_id], fields_related[fname])
+                    del target['id']
+                    fields_related2values[fname][row[fname]] = target
+
+        if to_del or fields_related or datetime_fields:
+            for row in result:
+                for fname in fields_related:
+                    if fname not in cls._fields:
                         continue
-                    for related in fields_related[field]:
-                        if cls._fields[field]._type in (
-                                'many2one', 'one2one'):
-                            if record[field]:
-                                record[field + '.' + related] = (
-                                    fields_related2values[field][
-                                        record[field]][record['id']][related])
-                            else:
-                                record[field + '.' + related] = False
-                        elif cls._fields[field]._type == 'reference':
-                            if record[field]:
-                                model_name, record_id = record[field].split(
-                                        ',', 1)
-                                if not model_name:
-                                    continue
-                                record_id = int(record_id)
-                                if record_id < 0:
-                                    continue
-                                record[field + '.' + related] = \
-                                    fields_related2values[field][
-                                        record[field]][related]
+                    field = cls._fields[fname]
+                    for related in fields_related[fname]:
+                        related_name = '%s.%s' % (fname, related)
+                        value = None
+                        if row[fname]:
+                            if field._type in ('many2one', 'one2one'):
+                                value = fields_related2values[fname][
+                                    row[fname]][row['id']][related]
+                            elif field._type == 'reference':
+                                model_name, record_id = row[fname
+                                    ].split(',', 1)
+                                if model_name:
+                                    record_id = int(record_id)
+                                    if record_id >= 0:
+                                        value = fields_related2values[fname][
+                                            row[fname]][related]
+                        row[related_name] = value
                 for field in to_del:
-                    del record[field]
+                    del row[field]
 
-        return res
+        return result
 
     @classmethod
     def write(cls, records, values):
-        cursor = Transaction().cursor
+        DatabaseIntegrityError = backend.get('DatabaseIntegrityError')
+        transaction = Transaction()
+        cursor = transaction.cursor
         pool = Pool()
         Translation = pool.get('ir.translation')
         Config = pool.get('ir.configuration')
         ids = map(int, records)
+        in_max = cursor.IN_MAX
 
         # Call before cursor cache cleaning
         trigger_eligibles = cls.trigger_write_get_eligibles(records)
@@ -650,100 +645,46 @@ class ModelSQL(ModelStorage):
         super(ModelSQL, cls).write(records, values)
 
         if not records:
-            return True
+            return
 
         if cls.table_query():
-            return True
+            return
+        table = cls.__table__()
 
         values = values.copy()
 
-        # _update_tree works if only one record has changed
-        update_tree = False
-        for k in cls._fields:
-            field = cls._fields[k]
-            if isinstance(field, fields.Many2One) \
-                    and field.model_name == cls.__name__ \
-                    and field.left and field.right:
-                update_tree = True
-        if update_tree and len(records) > 1:
-            for record in records:
-                cls.write([record], values)
-            return True
-
-        if Transaction().timestamp:
-            for i in range(0, len(ids), cursor.IN_MAX):
-                sub_ids = ids[i:i + cursor.IN_MAX]
-                clause = ('(id = %s AND '
-                    'CAST(EXTRACT(EPOCH FROM '
-                    'COALESCE(write_date, create_date)) AS ' +
-                    FIELDS['numeric'].sql_type(cls.create_date)[1] +
-                    ') > %s)')
-                args = []
-                for i in sub_ids:
-                    if Transaction().timestamp.get(
-                            cls.__name__ + ',' + str(i)):
-                        args.append(i)
-                        args.append(Decimal(Transaction().timestamp[
-                            cls.__name__ + ',' + str(i)]))
-                if args:
-                    cursor.execute("SELECT id "
-                        'FROM "' + cls._table + '" '
-                        'WHERE ' + ' OR '.join(
-                            (clause,) * (len(args) // 2)), args)
-                    if cursor.fetchone():
-                        raise ConcurrencyException(
-                            'Records were modified in the meanwhile')
-            for i in ids:
-                if Transaction().timestamp.get(cls.__name__ + ',' + str(i)):
-                    del Transaction().timestamp[cls.__name__ + ',' + str(i)]
+        cls.__check_timestamp(ids)
 
         # Clean values
-        for key in ('create_uid', 'create_date', 'write_uid', 'write_date',
-                'id'):
+        for key in ('create_uid', 'create_date',
+                'write_uid', 'write_date', 'id'):
             if key in values:
                 del values[key]
 
-        upd0 = []
-        upd1 = []
-        upd_todo = []
-        direct = []
-        for field in values:
-            if not hasattr(cls._fields[field], 'set'):
-                if ((not getattr(cls._fields[field], 'translate', False))
-                        or (Transaction().language == Config.get_language())):
-                    upd0.append(('"' + field + '"', '%s'))
-                    upd1.append(FIELDS[cls._fields[field]._type]
-                        .sql_format(values[field]))
-                direct.append(field)
-            else:
-                upd_todo.append(field)
-
-        upd0.append(('write_uid', '%s'))
-        upd0.append(('write_date', '%s'))
-        upd1.append(Transaction().user)
-        upd1.append(datetime.datetime.now())
-
-        domain1, domain2 = pool.get('ir.rule').domain_get(cls.__name__,
-                mode='write')
-        if domain1:
-            domain1 = ' AND (' + domain1 + ') '
-        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)
-            if domain1:
-                cursor.execute('SELECT id FROM "' + cls._table + '" '
-                    'WHERE ' + red_sql + ' ' + domain1,
-                    red_ids + domain2)
-            else:
-                cursor.execute('SELECT id FROM "' + cls._table + '" '
-                    'WHERE ' + red_sql, red_ids)
+        columns = [table.write_uid, table.write_date]
+        update_values = [transaction.user, Now()]
+        store_translation = Transaction().language == Config.get_language()
+        for fname, value in values.iteritems():
+            field = cls._fields[fname]
+            if not hasattr(field, 'set'):
+                if not getattr(field, 'translate', False) or store_translation:
+                    columns.append(Column(table, fname))
+                    update_values.append(field.sql_format(value))
+
+        domain = pool.get('ir.rule').domain_get(cls.__name__, mode='write')
+        for i in range(0, len(ids), in_max):
+            sub_ids = ids[i:i + in_max]
+            red_sql = reduce_ids(table.id, sub_ids)
+            where = red_sql
+            if domain:
+                where &= table.id.in_(domain)
+            cursor.execute(*table.select(table.id, where=where))
             rowcount = cursor.rowcount
             if rowcount == -1 or rowcount is None:
                 rowcount = len(cursor.fetchall())
             if not rowcount == len({}.fromkeys(sub_ids)):
-                if domain1:
-                    cursor.execute('SELECT id FROM "' + cls._table + '" '
-                        'WHERE ' + red_sql, red_ids)
+                if domain:
+                    cursor.execute(*table.select(table.id, where=red_sql))
                     rowcount = cursor.rowcount
                     if rowcount == -1 or rowcount is None:
                         rowcount = len(cursor.fetchall())
@@ -751,164 +692,81 @@ class ModelSQL(ModelStorage):
                         cls.raise_user_error('access_error', cls.__name__)
                 cls.raise_user_error('write_error', cls.__name__)
             try:
-                cursor.execute('UPDATE "' + cls._table + '" '
-                    'SET ' + ','.join([x[0] + ' = ' + x[1] for x in upd0])
-                    + ' WHERE ' + red_sql, upd1 + red_ids)
+                cursor.execute(*table.update(columns, update_values,
+                        where=red_sql))
             except DatabaseIntegrityError, exception:
                 with contextlib.nested(Transaction().new_cursor(),
                         Transaction().set_user(0)):
-                    for field_name in values:
-                        if field_name not in cls._fields:
-                            continue
-                        field = cls._fields[field_name]
-                        # Check required fields
-                        if field.required and \
-                                not hasattr(field, 'set') and \
-                                not isinstance(field, (fields.Integer,
-                                    fields.Float)) and \
-                                field_name not in ('create_uid',
-                                    'create_date'):
-                            if not values[field_name]:
-                                cls.raise_user_error('required_field',
-                                        error_args=cls._get_error_args(
-                                            field_name))
-                        if isinstance(field, fields.Many2One) \
-                                and values[field_name]:
-                            Model = pool.get(field.model_name)
-                            create_records = Transaction().create_records.get(
-                                    field.model_name, set())
-                            delete_records = Transaction().delete_records.get(
-                                    field.model_name, set())
-                            if not ((Model.search([
-                                                ('id', '=',
-                                                    values[field_name]),
-                                                ], order=[])
-                                        or (values[field_name]
-                                            in create_records))
-                                    and (values[field_name]
-                                        not in delete_records)):
-                                cls.raise_user_error('foreign_model_missing',
-                                    error_args=cls._get_error_args(
-                                        field_name))
-                    for name, _, error in cls._sql_constraints:
-                        if name in exception[0]:
-                            cls.raise_user_error(error)
-                    for name, error in cls._sql_error_messages.iteritems():
-                        if name in exception[0]:
-                            cls.raise_user_error(error)
+                    cls.__raise_integrity_error(exception, values,
+                        values.keys())
                 raise
 
-        for field in direct:
-            if getattr(cls._fields[field], 'translate', False):
+        for fname, value in values.iteritems():
+            field = cls._fields[fname]
+            if (getattr(field, 'translate', False)
+                    and not hasattr(field, 'set')):
                 Translation.set_ids(
-                        cls.__name__ + ',' + field, 'model',
-                        Transaction().language, ids, values[field])
-
-        # call the 'set' method of fields
-        for field in upd_todo:
-            cls._fields[field].set(ids, cls, field, values[field])
-
-        if cls._history:
-            columns = ['"' + str(x) + '"' for x in cls._fields
-                    if not hasattr(cls._fields[x], 'set')]
-            for obj_id in ids:
-                cursor.execute('INSERT INTO "' + cls._table + '__history" '
-                    '(' + ','.join(columns) + ') '
-                    'SELECT ' + ','.join(columns) + ' ' +
-                    'FROM "' + cls._table + '" '
-                    'WHERE id = %s', (obj_id,))
+                    '%s,%s' % (cls.__name__, fname), 'model',
+                    transaction.language, ids, [value] * len(ids))
+            if hasattr(field, 'set'):
+                field.set(ids, cls, fname, value)
 
+        cls.__insert_history(ids)
         cls._validate(records)
 
-        # Check for Modified Preorder Tree Traversal
-        for k in cls._fields:
-            field = cls._fields[k]
-            if isinstance(field, fields.Many2One) \
-                    and field.model_name == cls.__name__ \
-                    and field.left and field.right:
-                if field.left in values or field.right in values:
-                    raise Exception('ValidateError',
-                            'You can not update fields: "%s", "%s"' %
-                            (field.left, field.right))
-                if len(ids) == 1:
-                    cls._update_tree(ids[0], k, field.left, field.right)
-                else:
-                    with Transaction().set_user(0):
-                        cls._rebuild_tree(k, False, 0)
+        field_names = cls._fields.keys()
+        cls._update_mptt(field_names, [ids] * len(field_names), values)
 
         cls.trigger_write(trigger_eligibles)
 
-        return True
-
     @classmethod
     def delete(cls, records):
-        cursor = Transaction().cursor
+        DatabaseIntegrityError = backend.get('DatabaseIntegrityError')
+        transaction = Transaction()
+        cursor = transaction.cursor
         pool = Pool()
         Translation = pool.get('ir.translation')
         ids = map(int, records)
+        in_max = cursor.IN_MAX
 
         if not ids:
-            return True
+            return
 
         if cls.table_query():
-            return True
+            return
+        table = cls.__table__()
 
-        if Transaction().delete and Transaction().delete.get(cls.__name__):
+        if transaction.delete and transaction.delete.get(cls.__name__):
             ids = ids[:]
-            for del_id in Transaction().delete[cls.__name__]:
+            for del_id in transaction.delete[cls.__name__]:
                 for i in range(ids.count(del_id)):
                     ids.remove(del_id)
 
-        if Transaction().timestamp:
-            for i in range(0, len(ids), cursor.IN_MAX):
-                sub_ids = ids[i:i + cursor.IN_MAX]
-                clause = ('(id = %s AND '
-                    'CAST(EXTRACT(EPOCH FROM '
-                    'COALESCE(write_date, create_date)) AS ' +
-                    FIELDS['numeric'].sql_type(cls.create_date)[1] +
-                    ') > %s)')
-                args = []
-                for i in sub_ids:
-                    if Transaction().timestamp.get(
-                            cls.__name__ + ',' + str(i)):
-                        args.append(i)
-                        args.append(Transaction().timestamp[
-                            cls.__name__ + ',' + str(i)])
-                if args:
-                    cursor.execute("SELECT id "
-                        'FROM "' + cls._table + '" '
-                        'WHERE ' + ' OR '.join(
-                            (clause,) * (len(args) / 2)), args)
-                    if cursor.fetchone():
-                        raise ConcurrencyException(
-                            'Records were modified in the meanwhile')
-            for i in ids:
-                if Transaction().timestamp.get(cls.__name__ + ',' + str(i)):
-                    del Transaction().timestamp[cls.__name__ + ',' + str(i)]
+        cls.__check_timestamp(ids)
 
         tree_ids = {}
-        for k in cls._fields:
-            field = cls._fields[k]
-            if isinstance(field, fields.Many2One) \
-                    and field.model_name == cls.__name__ \
-                    and field.left and field.right:
-                red_sql, red_ids = reduce_ids('"' + k + '"', ids)
-                cursor.execute('SELECT id FROM "' + cls._table + '" '
-                    'WHERE ' + red_sql, red_ids)
-                tree_ids[k] = [x[0] for x in cursor.fetchall()]
+        for fname, field in cls._fields.iteritems():
+            if (isinstance(field, fields.Many2One)
+                    and field.model_name == cls.__name__
+                    and field.left and field.right):
+                tree_ids[fname] = []
+                for i in range(0, len(ids), in_max):
+                    sub_ids = ids[i:i + in_max]
+                    where = reduce_ids(Column(table, fname), sub_ids)
+                    cursor.execute(*table.select(table.id, where=where))
+                    tree_ids[fname] += [x[0] for x in cursor.fetchall()]
 
         foreign_keys_tocheck = []
         foreign_keys_toupdate = []
         foreign_keys_todelete = []
         for _, model in pool.iterobject():
-            if hasattr(model, 'table_query') \
-                    and model.table_query():
+            if hasattr(model, 'table_query') and model.table_query():
                 continue
             if not issubclass(model, ModelStorage):
                 continue
             for field_name, field in model._fields.iteritems():
-                if isinstance(field, fields.Many2One) \
-                        and field.model_name == cls.__name__:
+                if (isinstance(field, fields.Many2One)
+                        and field.model_name == cls.__name__):
                     if field.ondelete == 'CASCADE':
                         foreign_keys_todelete.append((model, field_name))
                     elif field.ondelete == 'SET NULL':
@@ -919,45 +777,41 @@ class ModelSQL(ModelStorage):
                     else:
                         foreign_keys_tocheck.append((model, field_name))
 
-        Transaction().delete.setdefault(cls.__name__, set()).update(ids)
+        transaction.delete.setdefault(cls.__name__, set()).update(ids)
 
-        domain1, domain2 = pool.get('ir.rule').domain_get(cls.__name__,
-                mode='delete')
-        if domain1:
-            domain1 = ' AND (' + domain1 + ') '
+        domain = pool.get('ir.rule').domain_get(cls.__name__, mode='delete')
 
-        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)
-            if domain1:
-                cursor.execute('SELECT id FROM "' + cls._table + '" '
-                    'WHERE ' + red_sql + ' ' + domain1,
-                    red_ids + domain2)
+        if domain:
+            for i in range(0, len(ids), in_max):
+                sub_ids = ids[i:i + in_max]
+                red_sql = reduce_ids(table.id, sub_ids)
+                cursor.execute(*table.select(table.id,
+                        where=red_sql & table.id.in_(domain)))
                 rowcount = cursor.rowcount
                 if rowcount == -1 or rowcount is None:
                     rowcount = len(cursor.fetchall())
                 if not rowcount == len({}.fromkeys(sub_ids)):
-                    cls.raise_user_error('access_error',
-                        cls._get_name())
+                    cls.raise_user_error('access_error', cls._get_name())
 
         cls.trigger_delete(records)
 
-        for i in range(0, len(ids), cursor.IN_MAX):
-            sub_ids = ids[i:i + cursor.IN_MAX]
-            sub_records = records[i:i + cursor.IN_MAX]
-            red_sql, red_ids = reduce_ids('id', sub_ids)
+        for i in range(0, len(ids), in_max):
+            sub_ids = ids[i:i + in_max]
+            sub_records = records[i:i + in_max]
+            red_sql = reduce_ids(table.id, sub_ids)
 
-            Transaction().delete_records.setdefault(cls.__name__,
-                    set()).update(sub_ids)
+            transaction.delete_records.setdefault(cls.__name__,
+                set()).update(sub_ids)
 
             for Model, field_name in foreign_keys_toupdate:
                 if (not hasattr(Model, 'search')
                         or not hasattr(Model, 'write')):
                     continue
-                red_sql2, red_ids2 = reduce_ids('"' + field_name + '"',
-                    sub_ids)
-                cursor.execute('SELECT id FROM "' + Model._table + '" '
-                    'WHERE ' + red_sql2, red_ids2)
+                foreign_table = Model.__table__()
+                foreign_red_sql = reduce_ids(
+                    Column(foreign_table, field_name), sub_ids)
+                cursor.execute(*foreign_table.select(foreign_table.id,
+                        where=foreign_red_sql))
                 models = Model.browse([x[0] for x in cursor.fetchall()])
                 if models:
                     Model.write(models, {
@@ -968,10 +822,11 @@ class ModelSQL(ModelStorage):
                 if (not hasattr(Model, 'search')
                         or not hasattr(Model, 'delete')):
                     continue
-                red_sql2, red_ids2 = reduce_ids('"' + field_name + '"',
-                    sub_ids)
-                cursor.execute('SELECT id FROM "' + Model._table + '" '
-                    'WHERE ' + red_sql2, red_ids2)
+                foreign_table = Model.__table__()
+                foreign_red_sql = reduce_ids(
+                    Column(foreign_table, field_name), sub_ids)
+                cursor.execute(*foreign_table.select(foreign_table.id,
+                        where=foreign_red_sql))
                 models = Model.browse([x[0] for x in cursor.fetchall()])
                 if models:
                     Model.delete(models)
@@ -991,115 +846,105 @@ class ModelSQL(ModelStorage):
             super(ModelSQL, cls).delete(sub_records)
 
             try:
-                cursor.execute('DELETE FROM "' + cls._table + '" '
-                    'WHERE ' + red_sql, red_ids)
+                cursor.execute(*table.delete(where=red_sql))
             except DatabaseIntegrityError, exception:
                 with Transaction().new_cursor():
-                    for name, _, error in cls._sql_constraints:
-                        if name in exception[0]:
-                            cls.raise_user_error(error)
-                    for name, error in cls._sql_error_messages.iteritems():
-                        if name in exception[0]:
-                            cls.raise_user_error(error)
+                    cls.__raise_integrity_error(exception, [])
                 raise
 
         Translation.delete_ids(cls.__name__, 'model', ids)
 
-        if cls._history:
-            for obj_id in ids:
-                cursor.execute('INSERT INTO "' + cls._table + '__history" '
-                    '(id, write_uid, write_date) VALUES (%s, %s, %s)',
-                    (obj_id, Transaction().user, datetime.datetime.now()))
-
-        for k in tree_ids.keys():
-            field = cls._fields[k]
-            if len(tree_ids[k]) == 1:
-                cls._update_tree(tree_ids[k][0], k, field.left, field.right)
-            else:
-                with Transaction().set_user(0):
-                    cls._rebuild_tree(k, False, 0)
+        cls.__insert_history(ids, deleted=True)
+
+        cls._update_mptt(tree_ids.keys(), tree_ids.values())
 
     @classmethod
     def search(cls, domain, offset=0, limit=None, order=None, count=False,
-            query_string=False):
+            query=False):
         pool = Pool()
         Rule = pool.get('ir.rule')
-        cursor = Transaction().cursor
+        transaction = Transaction()
+        cursor = transaction.cursor
+        in_max = cursor.IN_MAX
 
         # Get domain clauses
-        qu1, qu2, tables, tables_args = cls.search_domain(domain)
+        tables, expression = cls.search_domain(domain)
 
         # Get order by
         order_by = []
+        order_types = {
+            'DESC': Desc,
+            'ASC': Asc,
+            }
         if order is None or order is False:
             order = cls._order
-        for field, otype in order:
-            if otype.upper() not in ('DESC', 'ASC'):
-                raise Exception('Error', 'Wrong order type (%s)!' % otype)
-            order_by2, tables2, tables2_args = cls._order_calc(field, otype)
-            order_by += order_by2
-            for table in tables2:
-                if table not in tables:
-                    tables.append(table)
-                    if tables2_args.get(table):
-                        tables_args.extend(tables2_args.get(table))
-
-        order_by = ','.join(order_by)
+        for fname, otype in order:
+            field = cls._fields[fname]
+            Order = order_types[otype.upper()]
+            forder = field.convert_order(fname, tables, cls)
+            order_by.extend((Order(o) for o in forder))
 
         if type(limit) not in (float, int, long, type(None)):
             raise Exception('Error', 'Wrong limit type (%s)!' % type(limit))
         if type(offset) not in (float, int, long, type(None)):
             raise Exception('Error', 'Wrong offset type (%s)!' % type(offset))
 
-        # construct a clause for the rules :
-        domain1, domain2 = Rule.domain_get(cls.__name__, mode='read')
-        if domain1:
-            if qu1:
-                qu1 += ' AND ' + domain1
+        main_table, _ = tables[None]
+
+        def convert_from(table, tables):
+            right, condition = tables[None]
+            if table:
+                table = table.join(right, 'LEFT', condition)
             else:
-                qu1 = domain1
-            qu2 += domain2
+                table = right
+            for k, sub_tables in tables.iteritems():
+                if k is None:
+                    continue
+                table = convert_from(table, sub_tables)
+            return table
+        # Don't nested joins as SQLite doesn't support
+        table = convert_from(None, tables)
+
+        # construct a clause for the rules :
+        domain = Rule.domain_get(cls.__name__, mode='read')
+        if domain:
+            expression &= main_table.id.in_(domain)
 
         if count:
-            cursor.execute(cursor.limit_clause(
-                'SELECT COUNT("%s".id) FROM ' % cls._table +
-                    ' '.join(tables) + (qu1 and ' WHERE ' + qu1 or ''),
-                    limit, offset), tables_args + qu2)
-            res = cursor.fetchall()
-            return res[0][0]
+            cursor.execute(*table.select(Count(Literal(1)),
+                    where=expression, limit=limit, offset=offset))
+            return cursor.fetchone()[0]
         # execute the "main" query to fetch the ids we were searching for
-        select_fields = ['"' + cls._table + '".id AS id']
-        if cls._history and Transaction().context.get('_datetime') \
-                and not query_string:
-            select_fields += ['COALESCE("' + cls._table + '".write_date, "'
-                + cls._table + '".create_date) AS _datetime']
-        if not query_string:
-            select_fields += [
-                '"' + cls._table + '"."' + name + '" AS "' + name + '"'
+        columns = [main_table.id.as_('id')]
+        if (cls._history and transaction.context.get('_datetime')
+                and not query):
+            columns.append(Coalesce(
+                    main_table.write_date,
+                    main_table.create_date).as_('_datetime'))
+        if not query:
+            columns += [Column(main_table, name).as_(name)
                 for name, field in cls._fields.iteritems()
                 if not hasattr(field, 'get')
                 and name != 'id'
                 and not getattr(field, 'translate', False)
                 and field.loading == 'eager']
             if not cls.table_query():
-                select_fields += ['CAST(EXTRACT(EPOCH FROM '
-                        '(COALESCE("' + cls._table + '".write_date, '
-                        '"' + cls._table + '".create_date))) AS VARCHAR'
-                        ') AS _timestamp']
-        query_str = cursor.limit_clause(
-            'SELECT ' + ','.join(select_fields) + ' FROM ' +
-            ' '.join(tables) + (qu1 and ' WHERE ' + qu1 or '') +
-            (order_by and ' ORDER BY ' + order_by or ''), limit, offset)
-        if query_string:
-            return (query_str, tables_args + qu2)
-        cursor.execute(query_str, tables_args + qu2)
+                sql_type = fields.Char('timestamp').sql_type().base
+                columns += [Extract('EPOCH',
+                        Coalesce(main_table.write_date, main_table.create_date)
+                        ).cast(sql_type).as_('_timestamp')]
+        select = table.select(*columns,
+            where=expression, order_by=order_by, limit=limit, offset=offset)
+        if query:
+            return select
+        cursor.execute(*select)
 
         rows = cursor.dictfetchmany(cursor.IN_MAX)
-        cache = cursor.get_cache(Transaction().context)
+        cache = cursor.get_cache(transaction.context)
         if cls.__name__ not in cache:
             cache[cls.__name__] = LRUDict(RECORD_CACHE_SIZE)
-        delete_records = Transaction().delete_records.setdefault(cls.__name__,
-                set())
+        delete_records = transaction.delete_records.setdefault(cls.__name__,
+            set())
         keys = None
         for data in islice(rows, 0, cache.size_limit):
             if data['id'] in delete_records:
@@ -1119,774 +964,113 @@ class ModelSQL(ModelStorage):
             cache[cls.__name__].setdefault(data['id'], {}).update(data)
 
         if len(rows) >= cursor.IN_MAX:
-            select_fields2 = [select_fields[0]]
             if (cls._history
                     and Transaction().context.get('_datetime')
-                    and not query_string):
-                select_fields2 += [select_fields[1]]
-            cursor.execute(
-                'SELECT * FROM (' +
-                cursor.limit_clause(
-                    'SELECT ' + ','.join(select_fields2) + ' FROM ' +
-                    ' '.join(tables) + (qu1 and ' WHERE ' + qu1 or '') +
-                    (order_by and ' ORDER BY ' + order_by or ''),
-                    limit, offset) + ') AS "' + cls._table + '"',
-                tables_args + qu2)
+                    and not query):
+                columns = columns[:2]
+            else:
+                columns = columns[:1]
+            cursor.execute(*table.select(*columns,
+                    where=expression, order_by=order_by,
+                    limit=limit, offset=offset))
             rows = cursor.dictfetchall()
 
-        if cls._history and Transaction().context.get('_datetime'):
-            res = []
+        if cls._history and transaction.context.get('_datetime'):
+            ids = []
             ids_date = {}
             for data in rows:
                 if data['id'] in ids_date:
                     if data['_datetime'] <= ids_date[data['id']]:
                         continue
-                if data['id'] in res:
-                    res.remove(data['id'])
-                res.append(data['id'])
+                if data['id'] in ids:
+                    ids.remove(data['id'])
+                ids.append(data['id'])
                 ids_date[data['id']] = data['_datetime']
             to_delete = set()
-            for i in range(0, len(res), cursor.IN_MAX):
-                sub_ids = res[i:i + cursor.IN_MAX]
-                reduced_sql, reduced_ids = reduce_ids('id', sub_ids)
-                cursor.execute(('SELECT id, write_date '
-                        'FROM "%s__history" WHERE %s'
-                        'AND (write_date IS NOT NULL AND create_date IS NULL)'
-                        ) % (cls._table, reduced_sql),
-                    reduced_ids)
+            history = cls.__table_history__()
+            for i in range(0, len(ids), in_max):
+                sub_ids = ids[i:i + in_max]
+                where = reduce_ids(history.id, sub_ids)
+                cursor.execute(*history.select(history.id, history.write_date,
+                        where=where
+                        & (history.write_date != None)
+                        & (history.create_date == None)))
                 for deleted_id, delete_date in cursor.fetchall():
                     if ids_date[deleted_id] < delete_date:
                         to_delete.add(deleted_id)
-            return cls.browse(filter(lambda x: x not in to_delete, res))
+            return cls.browse(filter(lambda x: x not in to_delete, ids))
 
         return cls.browse([x['id'] for x in rows])
 
     @classmethod
     def search_domain(cls, domain, active_test=True):
         '''
-        Return SQL clause, tables to use and arguments for the domain
+        Return SQL tables and expression
         Set active_test to add it.
         '''
+        transaction = Transaction()
         domain = cls._search_domain_active(domain, active_test=active_test)
 
-        table_query = ''
-        tables_args = []
-        if cls.table_query():
-            table_query, tables_args = cls.table_query()
-            table_query = '(' + table_query + ') AS '
-
-        if cls._history and Transaction().context.get('_datetime'):
-            table_query = '"' + cls._table + '__history" AS '
+        tables = {
+            None: (cls.__table__(), None)
+            }
+        if cls._history and transaction.context.get('_datetime'):
+            tables[None] = (cls.__table_history__(), None)
+
+        def is_leaf(expression):
+            return (isinstance(expression, (list, tuple))
+                and len(expression) > 2
+                and isinstance(expression[1], basestring)
+                and expression[1] in OPERATORS)  # TODO remove OPERATORS test
+
+        def convert(domain):
+            if is_leaf(domain):
+                fname = domain[0].split('.', 1)[0]
+                field = cls._fields[fname]
+                expression = field.convert_domain(domain, tables, cls)
+                if not isinstance(expression, (Operator, Expression)):
+                    return convert(expression)
+                return expression
+            elif not domain or list(domain) in (['OR'], ['AND']):
+                return Literal(True)
+            elif domain[0] == 'OR':
+                return Or((convert(d) for d in domain[1:]))
+            else:
+                return And((convert(d) for d in (
+                            domain[1:] if domain[0] == 'AND' else domain)))
 
-        tables = [table_query + '"' + cls._table + '"']
+        expression = convert(domain)
 
-        qu1, qu2 = cls.__search_domain_oper(domain, tables, tables_args)
-        if cls._history and Transaction().context.get('_datetime'):
-            if qu1:
-                qu1 += ' AND'
-            qu1 += ' (COALESCE("' + cls._table + '".write_date, "' + \
-                cls._table + '".create_date) <= %s)'
-            qu2 += [Transaction().context['_datetime']]
-        return qu1, qu2, tables, tables_args
+        if cls._history and transaction.context.get('_datetime'):
+            table, _ = tables[None]
+            expression &= (Coalesce(table.write_date, table.create_date)
+                <= transaction.context['_datetime'])
+        return tables, expression
 
     @classmethod
-    def __search_domain_oper(cls, domain, tables, tables_args):
-        operator = 'AND'
-        if len(domain) and isinstance(domain[0], basestring):
-            if domain[0] not in ('AND', 'OR'):
-                raise Exception('ValidateError', 'Operator "%s" not supported'
-                    % domain[0])
-            operator = domain[0]
-            domain = domain[1:]
-        tuple_args = []
-        list_args = []
-        for arg in domain:
-            #add test for xmlrpc that doesn't handle tuple
-            if (isinstance(arg, tuple)
-                    or (isinstance(arg, list) and len(arg) > 2
-                        and arg[1] in OPERATORS)):
-                tuple_args.append(tuple(arg))
-            elif isinstance(arg, list):
-                list_args.append(arg)
-
-        qu1, qu2 = cls.__search_domain_calc(tuple_args, tables, tables_args)
-        if len(qu1):
-            qu1 = (' ' + operator + ' ').join(qu1)
-        else:
-            qu1 = ''
-
-        for domain2 in list_args:
-            qu1b, qu2b = cls.__search_domain_oper(domain2, tables,
-                    tables_args)
-            if not qu1b:
-                qu1b = '%s'
-                qu2b = [True]
-            if qu1 and qu1b:
-                qu1 += ' ' + operator + ' ' + qu1b
-            elif qu1b:
-                qu1 = qu1b
-            qu2 += qu2b
-        if qu1:
-            qu1 = '(' + qu1 + ')'
-        return qu1, qu2
-
-    @classmethod
-    def __search_domain_calc(cls, domain, tables, tables_args):
-        pool = Pool()
-        domain = domain[:]
+    def _update_mptt(cls, field_names, list_ids, values=None):
         cursor = Transaction().cursor
-
-        for arg in domain:
-            if arg[1] not in OPERATORS:
-                raise Exception('ValidateError', 'Argument "%s" not supported'
-                    % arg[1])
-        i = 0
-        joins = []
-        while i < len(domain):
-            fargs = domain[i][0].split('.', 1)
-            field = getattr(cls, fargs[0])
-            table = cls
-            if len(fargs) > 1:
-                if field._type in ('many2one', 'reference'):
-                    if field._type == 'many2one':
-                        Target = pool.get(field.model_name)
-                        m2o_search = [(fargs[1],) + tuple(domain[i][1:])]
-                    else:
-                        Target = pool.get(domain[i][3])
-                        m2o_search = [(fargs[1],) + tuple(domain[i][1:3])
-                            + tuple(domain[i][4:])]
-                    if 'active' in Target._fields:
-                        m2o_search += [('active', 'in', (True, False))]
-                    if hasattr(field, 'search'):
-                        conv = int if field._type == 'many2one' else str
-                        domain.extend([(fargs[0], 'in',
-                                    map(conv, Target.search(m2o_search,
-                                            order=[])))])
-                        domain.pop(i)
-                    else:
-                        in_query = Target.search(m2o_search, order=[],
-                            query_string=True)
-                        if field._type == 'many2one':
-                            domain[i] = (fargs[0], 'inselect', in_query, table)
-                        else:
-                            sql_type = FIELDS[
-                                cls.id._type].sql_type(cls.id)[0]
-                            query = ('SELECT id FROM "' + cls._table + '" '
-                                'WHERE CAST(SUBSTR("' + fargs[0] + '", '
-                                        'POSITION(\',\' IN "' + fargs[0] + '")'
-                                        + '+ 1) '
-                                    'AS ' + sql_type + ') '
-                                'IN (' + in_query[0] + ') '
-                                'AND "' + fargs[0] + '" ilike %s')
-                            domain[i] = ('id', 'inselect',
-                                (query, in_query[1] + [domain[i][3] + ',%']))
-                        i += 1
-                    continue
-                elif field._type in ('one2one', 'many2many', 'one2many'):
-                    if hasattr(field, 'model_name'):
-                        Target = pool.get(field.model_name)
-                    else:
-                        Target = field.get_target()
-                    if hasattr(field, 'relation_name'):
-                        Relation = pool.get(field.relation_name)
-                        origin, target = field.origin, field.target
-                    else:
-                        Relation = Target
-                        origin, target = field.field, 'id'
-                    rev_field = Relation._fields[origin]
-                    if rev_field._type == 'reference':
-                        sql_type = FIELDS[
-                            cls.id._type].sql_type(cls.id)[0]
-                        where = ' AND "' + origin + '" LIKE %s'
-                        where_args = [cls.__name__ + ',%']
-                        origin = ('CAST(SUBSTR("%s", '
-                            'POSITION(\',\' IN "%s") + 1) AS %s)'
-                            % (origin, origin, sql_type))
-                    else:
-                        origin = '"%s"' % origin
-                        where = ''
-                        where_args = []
-                    if hasattr(field, 'search'):
-                        domain.extend([(fargs[0], 'in',
-                                    map(int, Target.search([
-                                                (fargs[1], domain[i][1],
-                                                    domain[i][2]),
-                                                ], order=[])))])
-                        domain.pop(i)
-                    else:
-                        query1, query2 = Target.search([
-                            (fargs[1], domain[i][1], domain[i][2]),
-                            ], order=[], query_string=True)
-                        query1 = ('SELECT %s FROM "%s" WHERE "%s" IN (%s)' %
-                                (origin, Relation._table, target, query1))
-                        query1 += where
-                        query2 += where_args
-                        domain[i] = ('id', 'inselect', (query1, query2))
-                        i += 1
-                    continue
-                else:
+        count = None
+        for field_name, ids in zip(field_names, list_ids):
+            field = cls._fields[field_name]
+            if (isinstance(field, fields.Many2One)
+                    and field.model_name == cls.__name__
+                    and field.left and field.right):
+                if (values is not None
+                        and (field.left in values or field.right in values)):
                     raise Exception('ValidateError',
-                        'Clause on field "%s" doesn\'t work on "%s"'
-                        % (domain[i][0], cls.__name__))
-            if hasattr(field, 'search'):
-                clause = domain.pop(i)
-                domain.extend(field.search(table, clause[0], clause))
-            elif field._type == 'one2many':
-                Field = pool.get(field.model_name)
-                table_query = ''
-                table_args = []
-                if Field.table_query():
-                    table_query, table_args = Field.table_query()
-                    table_query = '(' + table_query + ') AS '
-                rev_field = Field._fields[field.field]
-                if rev_field._type == 'reference':
-                    sql_type = FIELDS[cls.id._type].sql_type(cls.id)[0]
-                    select = ('CAST(SUBSTR("%s", '
-                        'POSITION(\',\' IN "%s") + 1) AS %s)'
-                        % (field.field, field.field, sql_type))
-                    where = ' AND "' + field.field + '" LIKE %s'
-                    where_args = [cls.__name__ + ',%']
+                        'You can not update fields: "%s", "%s"' %
+                        (field.left, field.right))
+                if count is None:
+                    cursor.execute(*cls.__table__().select(Count(Literal(1))))
+                    count, = cursor.fetchone()
+                if len(ids) < count / 4:
+                    for id_ in ids:
+                        cls._update_tree(id_, field_name,
+                            field.left, field.right)
                 else:
-                    select = '"' + field.field + '"'
-                    where = ''
-                    where_args = []
-
-                if isinstance(domain[i][2], bool) or domain[i][2] is None:
-                    query1 = ('SELECT ' + select + ' '
-                        'FROM ' + table_query + '"' + Field._table + '" '
-                        'WHERE "' + field.field + '" IS NOT NULL' + where)
-                    query2 = table_args + where_args
-                    clause = 'inselect'
-                    if not domain[i][2]:
-                        clause = 'notinselect'
-                    domain[i] = ('id', clause, (query1, query2))
-                else:
-                    if isinstance(domain[i][2], basestring):
-                        target_field = 'rec_name'
-                    else:
-                        target_field = 'id'
-                    query1, query2 = Field.search([
-                            (target_field, domain[i][1], domain[i][2]),
-                            ], order=[], query_string=True)
-                    query1 = ('SELECT ' + select + ' '
-                        'FROM ' + table_query +
-                            '"' + Field._table + '" '
-                        'WHERE id IN (' + query1 + ')' + where)
-                    query2 = table_args + query2 + where_args
-                    domain[i] = ('id', 'inselect', (query1, query2))
-                i += 1
-            elif field._type in ('many2many', 'one2one'):
-                # XXX must find a solution for long id list
-                if hasattr(field, 'model_name'):
-                    Target = pool.get(field.model_name)
-                else:
-                    Target = field.get_target()
-                if domain[i][1] in ('child_of', 'not child_of'):
-                    if isinstance(domain[i][2], basestring):
-                        ids2 = map(int, Target.search([
-                                    ('rec_name', 'ilike', domain[i][2]),
-                                    ], order=[]))
-                    elif not isinstance(domain[i][2], list):
-                        ids2 = [domain[i][2]]
-                    else:
-                        ids2 = domain[i][2]
-
-                    def _rec_get(ids, table, parent):
-                        if not ids:
-                            return []
-                        ids2 = map(int, table.search([
-                                    (parent, 'in', ids),
-                                    (parent, '!=', None),
-                                    ], order=[]))
-                        return ids + _rec_get(ids2, table, parent)
-
-                    if Target.__name__ != table.__name__:
-                        if len(domain[i]) != 4:
-                            raise Exception('Error', 'Programming error: '
-                                'child_of on field "%s" is not allowed!'
-                                % domain[i][0])
-                        ids2 = map(int, Target.search([
-                                    (domain[i][3], 'child_of', ids2),
-                                    ], order=[]))
-                        Relation = pool.get(field.relation_name)
-                        red_sql, red_ids = reduce_ids('"' + field.target + '"',
-                                ids2)
-                        query1 = ('SELECT "' + field.origin + '" '
-                            'FROM "' + Relation._table + '" '
-                            'WHERE ' + red_sql + ' '
-                                'AND "' + field.origin + '" IS NOT NULL')
-                        query2 = red_ids
-                        if domain[i][1] == 'child_of':
-                            domain[i] = ('id', 'inselect', (query1, query2))
-                        else:
-                            domain[i] = ('id', 'notinselect', (query1, query2))
-                    else:
-                        if domain[i][1] == 'child_of':
-                            domain[i] = ('id', 'in', ids2 + _rec_get(ids2,
-                                table, domain[i][0]))
-                        else:
-                            domain[i] = ('id', 'not in', ids2 + _rec_get(ids2,
-                                table, domain[i][0]))
-                else:
-                    Relation = pool.get(field.relation_name)
-                    table_query = ''
-                    table_args = []
-                    if Relation.table_query():
-                        table_query, table_args = Relation.table_query()
-                        table_query = '(' + table_query + ') AS '
-                    origin_field = Relation._fields[field.origin]
-                    if origin_field._type == 'reference':
-                        sql_type = FIELDS[cls.id._type].sql_type(cls.id)[0]
-                        select = ('CAST(SUBSTR("%s", '
-                            'POSITION(\',\' IN "%s") + 1) AS %s)'
-                            % (field.origin, field.origin, sql_type))
-                        where = ' AND "' + field.origin + '" LIKE %s'
-                        where_args = [cls.__name__ + ',%']
-                    else:
-                        select = '"' + field.origin + '"'
-                        where = ''
-                        where_args = []
-                    if isinstance(domain[i][2], bool) or domain[i][2] is None:
-                        query1 = ('SELECT ' + select + ' '
-                            'FROM ' + table_query + ' '
-                                '"' + Relation._table + '" '
-                            'WHERE "' + field.origin + '" IS NOT NULL' + where)
-                        query2 = table_args + where_args
-                        clause = 'inselect'
-                        if not domain[i][2]:
-                            clause = 'notinselect'
-                        domain[i] = ('id', clause, (query1, query2))
-                    else:
-                        if isinstance(domain[i][2], basestring):
-                            target_field = 'rec_name'
-                        else:
-                            target_field = 'id'
-
-                        query1, query2 = Target.search([
-                                    (target_field, domain[i][1], domain[i][2]),
-                                    ], order=[], query_string=True)
-                        query1 = ('SELECT ' + select + ' '
-                            'FROM ' + table_query +
-                                '"' + Relation._table + '" '
-                            'WHERE "' + field.target + '" IN (' + query1 + ')'
-                            + where)
-                        query2 = table_args + query2 + where_args
-                        domain[i] = ('id', 'inselect', (query1, query2))
-                i += 1
-
-            elif field._type == 'many2one':
-                # XXX must find a solution for long id list
-                if domain[i][1] in ('child_of', 'not child_of'):
-                    if isinstance(domain[i][2], basestring):
-                        Field = pool.get(field.model_name)
-                        ids2 = map(int, Field.search([
-                                    ('rec_name', 'like', domain[i][2]),
-                                    ], order=[]))
-                    elif not isinstance(domain[i][2], list):
-                        ids2 = [domain[i][2]]
-                    else:
-                        ids2 = domain[i][2]
-
-                    def _rec_get(ids, table, parent):
-                        if not ids:
-                            return []
-                        ids2 = map(int, table.search([
-                                    (parent, 'in', ids),
-                                    (parent, '!=', None),
-                                    ]))
-                        return ids + _rec_get(ids2, table, parent)
-
-                    if field.model_name != table.__name__:
-                        if len(domain[i]) != 4:
-                            raise Exception('Error', 'Programming error: '
-                                'child_of on field "%s" is not allowed!'
-                                % domain[i][0])
-                        ids2 = map(int, pool.get(field.model_name).search([
-                                    (domain[i][3], 'child_of', ids2),
-                                    ], order=[]))
-                        if domain[i][1] == 'child_of':
-                            domain[i] = (domain[i][0], 'in', ids2, table)
-                        else:
-                            domain[i] = (domain[i][0], 'not in', ids2, table)
-                    else:
-                        if field.left and field.right and ids2:
-                            red_sql, red_ids = reduce_ids('id', ids2)
-                            cursor.execute('SELECT "' + field.left + '", '
-                                    '"' + field.right + '" ' +
-                                'FROM "' + cls._table + '" ' +
-                                'WHERE ' + red_sql, red_ids)
-                            clause = '(1=0) '
-                            for left, right in cursor.fetchall():
-                                clause += 'OR '
-                                clause += ('( "' + field.left + '" >= ' +
-                                    str(left) + ' ' +
-                                    'AND "' + field.right + '" <= ' +
-                                    str(right) + ')')
-
-                            query = ('SELECT id FROM "' + cls._table + '" ' +
-                                'WHERE ' + clause)
-                            if domain[i][1] == 'child_of':
-                                domain[i] = ('id', 'inselect', (query, []))
-                            else:
-                                domain[i] = ('id', 'notinselect', (query, []))
-                        else:
-                            if domain[i][1] == 'child_of':
-                                domain[i] = ('id', 'in', ids2 + _rec_get(
-                                    ids2, table, domain[i][0]), table)
-                            else:
-                                domain[i] = ('id', 'not in', ids2 + _rec_get(
-                                    ids2, table, domain[i][0]), table)
-                else:
-                    if isinstance(domain[i][2], basestring):
-                        Field = pool.get(field.model_name)
-                        m2o_search = [('rec_name', domain[i][1], domain[i][2])]
-                        if 'active' in Field._fields:
-                            m2o_search += [('active', 'in', (True, False))]
-                        res_ids = map(int, Field.search(m2o_search, order=[]))
-                        domain[i] = (domain[i][0], 'in', res_ids, table)
-                    else:
-                        domain[i] += (table,)
-                i += 1
-            else:
-                if getattr(field, 'translate', False):
-                    if cls.__name__ == 'ir.model':
-                        table_join = ('LEFT JOIN "ir_translation" '
-                            'ON (ir_translation.name = '
-                                    'ir_model.model||\',%s\' '
-                                'AND ir_translation.res_id IS NULL '
-                                'AND ir_translation.lang = %%s '
-                                'AND ir_translation.type = \'model\' '
-                                'AND ir_translation.fuzzy = %%s)'
-                            % domain[i][0])
-                    elif cls.__name__ == 'ir.model.field':
-                        if domain[i][0] == 'field_description':
-                            ttype = 'field'
-                        else:
-                            ttype = 'help'
-                        table_join = ('LEFT JOIN "ir_model" '
-                            'ON ir_model.id = ir_model_field.model '
-                            'LEFT JOIN "ir_translation" '
-                            'ON (ir_translation.name = '
-                                    'ir_model.model||\',\'||%s.name '
-                                'AND ir_translation.res_id IS NULL '
-                                'AND ir_translation.lang = %%s '
-                                'AND ir_translation.type = \'%s\' '
-                                'AND ir_translation.fuzzy = %%s)'
-                            % (table._table, ttype))
-                    else:
-                        table_join = ('LEFT JOIN "ir_translation" '
-                            'ON (ir_translation.res_id = %s.id '
-                                'AND ir_translation.name = \'%s,%s\' '
-                                'AND ir_translation.lang = %%s '
-                                'AND ir_translation.type = \'model\' '
-                                'AND ir_translation.fuzzy = %%s)'
-                            % (table._table, table.__name__, domain[i][0]))
-                    table_join_args = [Transaction().language, False]
-
-                    table_query = ''
-                    table_args = []
-                    if table.table_query():
-                        table_query, table_args = table.table_query()
-                        table_query = '(' + table_query + ') AS '
-
-                    Translation = pool.get('ir.translation')
-
-                    qu1, qu2, tables, table_args = \
-                        Translation.search_domain([
-                                ('value', domain[i][1], domain[i][2]),
-                                ])
-                    qu1 = qu1.replace('"ir_translation"."value"',
-                        'COALESCE(NULLIF("ir_translation"."value", \'\'), '
-                        '"%s"."%s")' % (table._table, domain[i][0]))
-                    query1 = ('SELECT "' + table._table + '".id '
-                        'FROM ' + table_query + '"' + table._table + '" '
-                        + table_join + ' WHERE ' + qu1)
-                    query2 = table_args + table_join_args + qu2
-
-                    domain[i] = ('id', 'inselect', (query1, query2), table)
-                else:
-                    domain[i] += (table,)
-                i += 1
-        domain.extend(joins)
-
-        qu1, qu2 = [], []
-        for arg in domain:
-            table = cls
-            if len(arg) > 3:
-                table = arg[3]
-            column = getattr(table, arg[0])
-            if arg[1] in ('inselect', 'notinselect'):
-                clause = 'IN'
-                if arg[1] == 'notinselect':
-                    clause = 'NOT IN'
-                qu1.append('("%s"."%s" %s (%s))' % (table._table, arg[0],
-                    clause, arg[2][0]))
-                qu2 += arg[2][1]
-            elif arg[1] in ('in', 'not in'):
-                if len(arg[2]) > 0:
-                    todel = []
-                    if column._type != 'boolean':
-                        for xitem in range(len(arg[2])):
-                            if (arg[2][xitem] is False
-                                    or arg[2][xitem] is None):
-                                todel.append(xitem)
-                    arg2 = arg[2][:]
-                    for xitem in todel[::-1]:
-                        del arg2[xitem]
-                    arg2 = [FIELDS[column._type].sql_format(x)
-                            for x in arg2]
-                    if len(arg2):
-                        if reduce(lambda x, y: (x
-                                    and isinstance(y, (int, long))
-                                    and not isinstance(y, bool)),
-                                arg2, True):
-                            red_sql, red_ids = reduce_ids('"%s"."%s"'
-                                % (table._table, arg[0]), arg2)
-                            if arg[1] == 'not in':
-                                red_sql = '(NOT(' + red_sql + '))'
-                            qu1.append(red_sql)
-                            qu2 += red_ids
-                        else:
-                            qu1.append(('("%s"."%s" ' + arg[1] + ' (%s))')
-                                % (table._table, arg[0], ','.join(
-                                        ('%s',) * len(arg2))))
-                            qu2 += arg2
-                        if todel:
-                            if column._type == 'boolean':
-                                if arg[1] == 'in':
-                                    qu1[-1] = ('(' + qu1[-1] + ' OR '
-                                        '"%s"."%s" = %%s)'
-                                        % (table._table, arg[0]))
-                                    qu2.append(False)
-                                else:
-                                    qu1[-1] = ('(' + qu1[-1] + ' AND '
-                                        '"%s"."%s" != %%s)'
-                                        % (table._table, arg[0]))
-                                    qu2.append(False)
-                            else:
-                                if arg[1] == 'in':
-                                    qu1[-1] = ('(' + qu1[-1] + ' OR '
-                                        '"%s"."%s" IS NULL)'
-                                        % (table._table, arg[0]))
-                                else:
-                                    qu1[-1] = ('(' + qu1[-1] + ' AND '
-                                        '"%s"."%s" IS NOT NULL)'
-                                        % (table._table, arg[0]))
-                    elif todel:
-                        if column._type == 'boolean':
-                            if arg[1] == 'in':
-                                qu1.append('("%s"."%s" = %%s)'
-                                    % (table._table, arg[0]))
-                                qu2.append(False)
-                            else:
-                                qu1.append('("%s"."%s" != %%s)'
-                                    % (table._table, arg[0]))
-                                qu2.append(False)
-                        else:
-                            if arg[1] == 'in':
-                                qu1.append('("%s"."%s" IS NULL)'
-                                    % (table._table, arg[0]))
-                            else:
-                                qu1.append('("%s"."%s" IS NOT NULL)'
-                                    % (table._table, arg[0]))
-                else:
-                    if arg[1] == 'in':
-                        qu1.append(' %s')
-                        qu2.append(False)
-                    else:
-                        qu1.append(' %s')
-                        qu2.append(True)
-            else:
-                if (arg[2] is False or arg[2] is None) and (arg[1] == '='):
-                    if column._type == 'boolean':
-                        qu1.append('(("%s"."%s" = %%s) OR ("%s"."%s" IS NULL))'
-                            % (table._table, arg[0], table._table, arg[0]))
-                        qu2.append(False)
-                    else:
-                        qu1.append('("%s"."%s" IS NULL)'
-                            % (table._table, arg[0]))
-                elif (arg[2] is False or arg[2] is None) and (arg[1] == '!='):
-                    if column._type == 'boolean':
-                        qu1.append('(("%s"."%s" != %%s) '
-                            'AND ("%s"."%s" IS NOT NULL))'
-                            % (table._table, arg[0], table._table, arg[0]))
-                        qu2.append(False)
-                    else:
-                        qu1.append('("%s"."%s" IS NOT NULL)'
-                            % (table._table, arg[0]))
-                else:
-                    if arg[0] == 'id':
-                        qu1.append('("%s"."%s" %s %%s)'
-                            % (table._table, arg[0], arg[1]))
-                        qu2.append(FIELDS[column._type]
-                            .sql_format(arg[2]))
-                    else:
-                        add_null = False
-                        if arg[1] in ('like', 'ilike'):
-                            if not arg[2]:
-                                qu2.append('%')
-                                add_null = True
-                            else:
-                                qu2.append(FIELDS[
-                                        column._type
-                                        ].sql_format(arg[2]))
-                        elif arg[1] in ('not like', 'not ilike'):
-                            if not arg[2]:
-                                qu2.append('')
-                            else:
-                                qu2.append(FIELDS[
-                                        column._type
-                                        ].sql_format(arg[2]))
-                                add_null = True
-                        else:
-                            qu2.append(FIELDS[
-                                column._type
-                                ].sql_format(arg[2]))
-                        qu1.append('("%s"."%s" %s %%s)' % (table._table,
-                            arg[0], arg[1]))
-                        if add_null:
-                            qu1[-1] = ('(' + qu1[-1] + ' OR '
-                                '"' + table._table + '"."' + arg[0] + '"'
-                                ' IS NULL)')
-
-        return qu1, qu2
-
-    @classmethod
-    def _order_calc(cls, field, otype):
-        pool = Pool()
-        order_by = []
-        tables = []
-        tables_args = {}
-        field_name = None
-        table_name = None
-        link_field = None
-
-        if field in cls._fields:
-            table_name = cls._table
-
-            if not hasattr(cls._fields[field], 'set'):
-                field_name = field
-
-            if cls._fields[field].order_field:
-                field_name = cls._fields[field].order_field
-
-            if isinstance(cls._fields[field], fields.Many2One):
-                obj = pool.get(cls._fields[field].model_name)
-                table_name = obj._table
-                link_field = field
-                field_name = None
-
-                if obj._rec_name in obj._fields:
-                    field_name = obj._rec_name
-
-                if obj._order_name in obj._fields:
-                    field_name = obj._order_name
-
-                if not field_name:
-                    field_name = 'id'
-
-                order_by, tables, tables_args = obj._order_calc(field_name,
-                        otype)
-                table_join = ('LEFT JOIN "' + table_name + '" AS '
-                    '"' + table_name + '.' + link_field + '" ON '
-                    '"%s.%s".id = "%s"."%s"'
-                    % (table_name, link_field, cls._table, link_field))
-                for i in range(len(order_by)):
-                    if table_name in order_by[i]:
-                        order_by[i] = order_by[i].replace(table_name,
-                                table_name + '.' + link_field)
-                for i in range(len(tables)):
-                    if table_name in tables[i]:
-                        args = tables_args.pop(tables[i], [])
-                        tables[i] = tables[i].replace(table_name,
-                                table_name + '.' + link_field)
-                        tables_args[tables[i]] = args
-                if table_join not in tables:
-                    tables.insert(0, table_join)
-                return order_by, tables, tables_args
-
-            if (field_name in cls._fields
-                    and getattr(cls._fields[field_name], 'translate', False)):
-                translation_table = ('ir_translation_%s_%s'
-                    % (table_name, field_name))
-                if cls.__name__ == 'ir.model':
-                    table_join = ('LEFT JOIN "ir_translation" '
-                        'AS "%s" ON '
-                        '("%s".name = "ir_model".model||\',%s\' '
-                            'AND "%s".res_id IS NULL '
-                            'AND "%s".lang = %%s '
-                            'AND "%s".type = \'model\' '
-                            'AND "%s".fuzzy = %%s)'
-                        % (translation_table, translation_table, field_name,
-                            translation_table, translation_table,
-                            translation_table, translation_table))
-                elif cls.__name__ == 'ir.model.field':
-                    if field_name == 'field_description':
-                        ttype = 'field'
-                    else:
-                        ttype = 'help'
-                    table_join = ('LEFT JOIN "ir_model" ON '
-                        'ir_model.id = ir_model_field.model')
-                    if table_join not in tables:
-                        tables.append(table_join)
-                    table_join = ('LEFT JOIN "ir_translation" '
-                        'AS "%s" ON '
-                        '("%s".name = "ir_model".model||\',\'||%s.name '
-                            'AND "%s".res_id IS NULL '
-                            'AND "%s".lang = %%s '
-                            'AND "%s".type = \'%s\' '
-                            'AND "%s".fuzzy = %%s)'
-                        % (translation_table, translation_table, table_name,
-                            translation_table, translation_table,
-                            translation_table, ttype, translation_table))
-                else:
-                    table_join = ('LEFT JOIN "ir_translation" '
-                        'AS "%s" ON '
-                        '("%s".res_id = "%s".id '
-                            'AND "%s".name = \'%s,%s\' '
-                            'AND "%s".lang = %%s '
-                            'AND "%s".type = \'model\' '
-                            'AND "%s".fuzzy = %%s)'
-                        % (translation_table, translation_table, table_name,
-                            translation_table, cls.__name__, field_name,
-                            translation_table, translation_table,
-                            translation_table))
-                if table_join not in tables:
-                    tables.append(table_join)
-                    tables_args[table_join] = [Transaction().language, False]
-                order_by.append('COALESCE(NULLIF('
-                    + '"' + translation_table + '".value, \'\'), '
-                    + '"' + table_name + '".' + field_name + ') ' + otype)
-                return order_by, tables, tables_args
-
-            if (field_name in cls._fields
-                    and cls._fields[field_name]._type == 'selection'
-                    and cls._fields[field_name].order_field is None):
-                selections = cls.fields_get([field_name]
-                    )[field_name]['selection']
-                if not isinstance(selections, (tuple, list)):
-                    selections = getattr(cls,
-                            cls._fields[field_name].selection)()
-                order = 'CASE ' + table_name + '.' + field_name
-                for selection in selections:
-                    order += ' WHEN \'%s\' THEN \'%s\'' % selection
-                order += ' ELSE ' + table_name + '.' + field_name + ' END'
-                order_by.append(order + ' ' + otype)
-                return order_by, tables, tables_args
-
-            if field_name:
-                if '%(table)s' in field_name or '%(order)s' in field_name:
-                    order_by.append(field_name % {
-                        'table': '"%s"' % table_name,
-                        'order': otype,
-                        })
-                else:
-                    order_by.append('"%s"."%s" %s'
-                        % (table_name, field_name, otype))
-                return order_by, tables, tables_args
-
-        raise Exception('Error', 'Wrong field name (%s) for %s in order!' %
-            (field, cls.__name__))
+                    with Transaction().set_user(0):
+                        cls._rebuild_tree(field_name, None, 0)
 
     @classmethod
     def _rebuild_tree(cls, parent, parent_id, left):
@@ -1894,12 +1078,12 @@ class ModelSQL(ModelStorage):
         Rebuild left, right value for the tree.
         '''
         cursor = Transaction().cursor
+        table = cls.__table__()
         right = left + 1
 
-        with Transaction().set_user(0):
-            childs = cls.search([
-                    (parent, '=', parent_id),
-                    ])
+        childs = cls.search([
+                (parent, '=', parent_id),
+                ], order=[])
 
         for child in childs:
             right = cls._rebuild_tree(parent, child.id, right)
@@ -1907,134 +1091,70 @@ class ModelSQL(ModelStorage):
         field = cls._fields[parent]
 
         if parent_id:
-            cursor.execute('UPDATE "' + cls._table + '" '
-                'SET "' + field.left + '" = %s, '
-                    '"' + field.right + '" = %s '
-                'WHERE id = %s', (left, right, parent_id))
+            cursor.execute(*table.update(
+                    [Column(table, field.left), Column(table, field.right)],
+                    [left, right],
+                    where=table.id == parent_id))
         return right + 1
 
     @classmethod
-    def _update_tree(cls, object_id, field_name, left, right):
+    def _update_tree(cls, record_id, field_name, left, right):
         '''
         Update left, right values for the tree.
         Remarks:
             - the value (right - left - 1) / 2 will not give
                 the number of children node
-            - the order of the tree respects the default _order
         '''
         cursor = Transaction().cursor
-        cursor.execute('SELECT "' + left + '", "' + right + '" '
-            'FROM "' + cls._table + '" '
-            'WHERE id = %s', (object_id,))
+        table = cls.__table__()
+        left = Column(table, left)
+        right = Column(table, right)
+        field = Column(table, field_name)
+        cursor.execute(*table.select(left, right, field,
+                where=table.id == record_id))
         fetchone = cursor.fetchone()
         if not fetchone:
             return
-        old_left, old_right = fetchone
-        if old_left == old_right:
-            cursor.execute('UPDATE "' + cls._table + '" '
-                'SET "' + right + '" = "' + right + '" + 1 '
-                'WHERE id = %s', (object_id,))
-            old_right += 1
+        old_left, old_right, parent_id = fetchone
+        if old_left == old_right == 0:
+            cursor.execute(*table.select(Max(right),
+                    where=field == None))
+            old_left, = cursor.fetchone()
+            old_left += 1
+            old_right = old_left + 1
+            cursor.execute(*table.update([left, right],
+                    [old_left, old_right],
+                    where=table.id == record_id))
+        size = old_right - old_left + 1
 
         parent_right = 1
 
-        cursor.execute('SELECT "' + field_name + '" '
-            'FROM "' + cls._table + '" '
-            'WHERE id = %s', (object_id,))
-        parent_id = cursor.fetchone()[0] or False
-
         if parent_id:
-            cursor.execute('SELECT "' + right + '" '
-                'FROM "' + cls._table + '" '
-                'WHERE id = %s', (parent_id,))
+            cursor.execute(*table.select(right, where=table.id == parent_id))
             parent_right = cursor.fetchone()[0]
         else:
-            cursor.execute('SELECT MAX("' + right + '") '
-                'FROM "' + cls._table + '" '
-                'WHERE "' + field_name + '" IS NULL')
+            cursor.execute(*table.select(Max(right), where=field == None))
             fetchone = cursor.fetchone()
             if fetchone:
                 parent_right = fetchone[0] + 1
 
-        cursor.execute('SELECT id FROM "' + cls._table + '" '
-            'WHERE "' + left + '" >= %s AND "' + right + '" <= %s',
-            (old_left, old_right))
-        child_ids = [x[0] for x in cursor.fetchall()]
-
-        if len(child_ids) > cursor.IN_MAX:
-            with Transaction().set_user(0):
-                return cls._rebuild_tree(field_name, False, 0)
-
-        red_child_sql, red_child_ids = reduce_ids('id', child_ids)
-        # ids for left update
-        cursor.execute('SELECT id FROM "' + cls._table + '" '
-            'WHERE "' + left + '" >= %s '
-                'AND NOT ' + red_child_sql,
-            [parent_right] + red_child_ids)
-        left_ids = [x[0] for x in cursor.fetchall()]
-
-        # ids for right update
-        cursor.execute('SELECT id FROM "' + cls._table + '" '
-            'WHERE "' + right + '" >= %s '
-                'AND NOT ' + red_child_sql,
-            [parent_right] + red_child_ids)
-        right_ids = [x[0] for x in cursor.fetchall()]
-
-        if left_ids:
-            for i in range(0, len(left_ids), cursor.IN_MAX):
-                sub_ids = left_ids[i:i + cursor.IN_MAX]
-                red_sub_sql, red_sub_ids = reduce_ids('id', sub_ids)
-                cursor.execute('UPDATE "' + cls._table + '" '
-                    'SET "' + left + '" = "' + left + '" + '
-                        + str(old_right - old_left + 1) + ' '
-                    'WHERE ' + red_sub_sql, red_sub_ids)
-        if right_ids:
-            for i in range(0, len(right_ids), cursor.IN_MAX):
-                sub_ids = right_ids[i:i + cursor.IN_MAX]
-                red_sub_sql, red_sub_ids = reduce_ids('id', sub_ids)
-                cursor.execute('UPDATE "' + cls._table + '" '
-                    'SET "' + right + '" = "' + right + '" + '
-                        + str(old_right - old_left + 1) + ' '
-                    'WHERE ' + red_sub_sql, red_sub_ids)
-
-        cursor.execute('UPDATE "' + cls._table + '" '
-            'SET "' + left + '" = "' + left + '" + '
-                    + str(parent_right - old_left) + ', '
-                '"' + right + '" = "' + right + '" + '
-                    + str(parent_right - old_left) + ' '
-            'WHERE ' + red_child_sql, red_child_ids)
-
-        # Use root user to by-pass rules
-        with contextlib.nested(Transaction().set_user(0),
-                Transaction().set_context(active_test=False)):
-            brother_ids = map(int, cls.search([
-                        (field_name, '=', parent_id),
-                        ]))
-        if brother_ids[-1] != object_id:
-            next_id = brother_ids[brother_ids.index(object_id) + 1]
-            cursor.execute('SELECT "' + left + '" '
-                'FROM "' + cls._table + '" '
-                'WHERE id = %s', (next_id,))
-            next_left = cursor.fetchone()[0]
-            cursor.execute('SELECT "' + left + '" '
-                'FROM "' + cls._table + '" '
-                'WHERE id = %s', (object_id,))
-            current_left = cursor.fetchone()[0]
-
-            cursor.execute('UPDATE "' + cls._table + '" '
-                'SET "' + left + '" = "' + left + '" + '
-                        + str(old_right - old_left + 1) + ', '
-                    '"' + right + '" = "' + right + '" + '
-                        + str(old_right - old_left + 1) + ' '
-                'WHERE "' + left + '" >= %s AND "' + right + '" <= %s',
-                (next_left, current_left))
-
-            cursor.execute('UPDATE "' + cls._table + '" '
-                'SET "' + left + '" = "' + left + '" - '
-                        + str(current_left - next_left) + ', '
-                    '"' + right + '" = "' + right + '" - '
-                        + str(current_left - next_left) + ' '
-                'WHERE ' + red_child_sql, red_child_ids)
+        cursor.execute(*table.update([left], [left + size],
+                where=left >= parent_right))
+        cursor.execute(*table.update([right], [right + size],
+                where=right >= parent_right))
+        if old_left < parent_right:
+            left_delta = parent_right - old_left
+            right_delta = parent_right - old_left
+            left_cond = old_left
+            right_cond = old_right
+        else:
+            left_delta = parent_right - old_left - size
+            right_delta = parent_right - old_left - size
+            left_cond = old_left + size
+            right_cond = old_right + size
+        cursor.execute(*table.update([left, right],
+                [left + left_delta, right + right_delta],
+                where=(left >= left_cond) & (right <= right_cond)))
 
     @classmethod
     def validate(cls, records):
@@ -2044,23 +1164,25 @@ class ModelSQL(ModelStorage):
             return
         # Works only for a single transaction
         ids = map(int, records)
+        table = cls.__table__()
+        param = Flavor.get().param
         for _, sql, error in cls._sql_constraints:
             match = _RE_UNIQUE.match(sql)
             if match:
                 sql = match.group(1)
                 columns = sql.split(',')
-                sql_clause = ' AND '.join('%s = %%s'
-                    % i for i in columns)
-                sql_clause = '(id != %s AND ' + sql_clause + ')'
+                sql_clause = ' AND '.join('%s = %s'
+                    % (i, param) for i in columns)
+                sql_clause = '(id != ' + param + ' AND ' + sql_clause + ')'
 
                 in_max = cursor.IN_MAX / (len(columns) + 1)
                 for i in range(0, len(ids), in_max):
                     sub_ids = ids[i:i + in_max]
-                    red_sql, red_ids = reduce_ids('id', sub_ids)
+                    red_sql = reduce_ids(table.id, sub_ids)
 
                     cursor.execute('SELECT id,' + sql + ' '
                         'FROM "' + cls._table + '" '
-                        'WHERE ' + red_sql, red_ids)
+                        'WHERE ' + str(red_sql), red_sql.params)
 
                     fetchall = cursor.fetchall()
                     cursor.execute('SELECT id '
@@ -2077,11 +1199,11 @@ class ModelSQL(ModelStorage):
                 sql = match.group(1)
                 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)
+                    red_sql = reduce_ids(table.id, sub_ids)
                     cursor.execute('SELECT id '
                         'FROM "' + cls._table + '" '
                         'WHERE NOT (' + sql + ') '
-                            'AND ' + red_sql, red_ids)
+                            'AND ' + str(red_sql), red_sql.params)
                     if cursor.fetchone():
                         cls.raise_user_error(error)
                     continue
diff --git a/trytond/model/modelstorage.py b/trytond/model/modelstorage.py
index b2e8cc4..806db49 100644
--- a/trytond/model/modelstorage.py
+++ b/trytond/model/modelstorage.py
@@ -39,9 +39,9 @@ class ModelStorage(Model):
     """
 
     create_uid = fields.Many2One('res.user', 'Create User', readonly=True)
-    create_date = fields.DateTime('Create Date', readonly=True)
+    create_date = fields.Timestamp('Create Date', readonly=True)
     write_uid = fields.Many2One('res.user', 'Write User', readonly=True)
-    write_date = fields.DateTime('Write Date', readonly=True)
+    write_date = fields.Timestamp('Write Date', readonly=True)
     rec_name = fields.Function(fields.Char('Name'), 'get_rec_name',
             searcher='search_rec_name')
 
@@ -538,7 +538,7 @@ class ModelStorage(Model):
             def warn(msgname, *args):
                 msg = cls.raise_user_error(msgname, args,
                         raise_exception=False)
-                warnings.warn(msg)
+                logger.warn(msg)
 
             def get_selection(selection, value):
                 res = None
@@ -684,11 +684,13 @@ class ModelStorage(Model):
                     elif field_type == 'numeric':
                         res = Decimal(value) if value else None
                     elif field_type == 'date':
-                        res = value and datetime.date(*time.strptime(value,
-                            '%Y-%m-%d')[:3])
+                        res = (datetime.date(
+                                *time.strptime(value, '%Y-%m-%d')[:3])
+                            if value else None)
                     elif field_type == 'datetime':
-                        res = value and datetime.datetime(*time.strptime(value,
-                            '%Y-%m-%d %H:%M:%S')[:6])
+                        res = (datetime.datetime(
+                                *time.strptime(value, '%Y-%m-%d %H:%M:%S')[:6])
+                            if value else None)
                     elif field_type == 'selection':
                         res = get_selection(this_field_def['selection'], value)
                     elif field_type == 'many2one':
@@ -741,9 +743,9 @@ class ModelStorage(Model):
         ModelData = pool.get('ir.model.data')
 
         # logger for collecting warnings for the client
-        warnings = logging.Logger("import")
+        logger = logging.Logger("import")
         warning_stream = StringIO.StringIO()
-        warnings.addHandler(logging.StreamHandler(warning_stream))
+        logger.addHandler(logging.StreamHandler(warning_stream))
 
         len_fields_names = len(fields_names)
         assert all(len(x) == len_fields_names for x in data)
@@ -822,7 +824,7 @@ class ModelStorage(Model):
         '''
         parent_type = cls._fields[parent]._type
 
-        if parent_type not in ('many2one', 'many2many'):
+        if parent_type not in ('many2one', 'many2many', 'one2one'):
             raise Exception(
                 'Unsupported field type "%s" for field "%s" on "%s"'
                 % (parent_type, parent, cls.__name__))
@@ -891,7 +893,8 @@ class ModelStorage(Model):
             else:
                 return all(method(r) for r in records)
         for field in cls._constraints:
-            warnings.warn('_constraints is deprecated, override validate instead',
+            warnings.warn(
+                '_constraints is deprecated, override validate instead',
                 DeprecationWarning, stacklevel=2)
             if not call(field[0]):
                 cls.raise_user_error(field[1])
@@ -923,6 +926,7 @@ class ModelStorage(Model):
                             return True
             return False
 
+        ctx_pref['active_test'] = False
         with Transaction().set_context(ctx_pref):
             for field_name, field in cls._fields.iteritems():
                 if isinstance(field, fields.Function) and \
@@ -1132,7 +1136,6 @@ class ModelStorage(Model):
 
         cls.validate(records)
 
-
     @classmethod
     def _clean_defaults(cls, defaults):
         pool = Pool()
@@ -1409,6 +1412,8 @@ class EvalEnvironment(dict):
         if item in self._model._fields:
             value = getattr(self._record, item)
             if isinstance(value, Model):
+                if self._model._fields[item]._type == 'reference':
+                    return str(value)
                 return value.id
             elif isinstance(value, (list, tuple)):
                 return [r.id for r in value]
diff --git a/trytond/model/modelview.py b/trytond/model/modelview.py
index 18a5ec4..eec4db9 100644
--- a/trytond/model/modelview.py
+++ b/trytond/model/modelview.py
@@ -229,7 +229,7 @@ class ModelView(Model):
                 xml = ''
             result['type'] = view_type
             result['arch'] = xml
-            result['field_childs'] = False
+            result['field_childs'] = None
             result['view_id'] = 0
 
         # Update arch and compute fields from arch
@@ -301,11 +301,13 @@ class ModelView(Model):
                         raise_exception=False):
                     return False
             if field._type in ('many2many', 'one2one'):
-                if not ModelAccess.check(field.target, mode='read',
-                        raise_exception=False):
+                if (field.target
+                        and not ModelAccess.check(field.target, mode='read',
+                            raise_exception=False)):
                     return False
-                elif not ModelAccess.check(field.relation_name,
-                        mode='read', raise_exception=False):
+                elif (field.relation_name
+                        and not ModelAccess.check(field.relation_name,
+                            mode='read', raise_exception=False)):
                     return False
             if field._type == 'reference':
                 selection = field.selection
@@ -482,6 +484,11 @@ class ModelView(Model):
         if element.tag == 'tree' and element.get('sequence'):
             fields_attrs.setdefault(element.get('sequence'), {})
 
+        if element.tag == 'calendar':
+            for attr in ('dtstart', 'dtend'):
+                if element.get(attr):
+                    fields_attrs.setdefault(element.get(attr), {})
+
         if childs:
             for field in element:
                 fields_attrs = cls.__view_look_dom(field, type,
diff --git a/trytond/modules/__init__.py b/trytond/modules/__init__.py
index 9344bac..6dbebf4 100644
--- a/trytond/modules/__init__.py
+++ b/trytond/modules/__init__.py
@@ -10,7 +10,9 @@ import imp
 import operator
 import ConfigParser
 from glob import iglob
-import datetime
+
+from sql import Table
+from sql.functions import Now
 
 import trytond.tools as tools
 from trytond.config import CONFIG
@@ -18,6 +20,9 @@ from trytond.transaction import Transaction
 from trytond.cache import Cache
 import trytond.convert as convert
 
+ir_module = Table('ir_module_module')
+ir_model_data = Table('ir_model_data')
+
 OPJ = os.path.join
 MODULES_PATH = os.path.abspath(os.path.dirname(__file__))
 
@@ -178,17 +183,20 @@ def create_graph(module_list):
             packages.append((package, deps, xdep, info))
         packages.pop(0)
 
-    for package, deps, xdep, info in packages:
+    missings = set()
+    for package, deps, _, _ in packages:
         if package not in later:
             continue
-        missings = [x for x in deps if x not in graph]
-        raise Exception('%s unmet dependencies: %s' % (package, missings))
+        missings |= set((x for x in deps if x not in graph))
+    if missings:
+        raise Exception('Missing dependencies: %s' % list(missings
+                - set((p[0] for p in packages))))
     return graph, packages, later
 
 
 def is_module_to_install(module):
     for kind in ('init', 'update'):
-        if 'all' in CONFIG[kind] and module != 'test':
+        if 'all' in CONFIG[kind] and module != 'tests':
             return True
         elif module in CONFIG[kind]:
             return True
@@ -204,9 +212,8 @@ def load_module_graph(graph, pool, lang=None):
     cursor = Transaction().cursor
 
     modules = [x.name for x in graph]
-    cursor.execute('SELECT name, state FROM ir_module_module '
-        'WHERE name in (' + ','.join(('%s',) * len(modules)) + ')',
-        modules)
+    cursor.execute(*ir_module.select(ir_module.name, ir_module.state,
+            where=ir_module.name.in_(modules)))
     module2state = dict(cursor.fetchall())
 
     for package in graph:
@@ -214,7 +221,6 @@ def load_module_graph(graph, pool, lang=None):
         if module not in MODULES:
             continue
         logger.info(module)
-        sys.stdout.flush()
         classes = pool.setup(module)
         package_state = module2state.get(module, 'uninstalled')
         if (is_module_to_install(module)
@@ -232,7 +238,8 @@ def load_module_graph(graph, pool, lang=None):
                     models_to_update_history.add(model.__name__)
 
             #Instanciate a new parser for the package:
-            tryton_parser = convert.TrytondXmlHandler(pool=pool, module=module)
+            tryton_parser = convert.TrytondXmlHandler(pool=pool, module=module,
+                module_state=package_state)
 
             for filename in package.info.get('xml', []):
                 filename = filename.replace('/', os.sep)
@@ -254,17 +261,17 @@ def load_module_graph(graph, pool, lang=None):
                 Translation = pool.get('ir.translation')
                 Translation.translation_import(lang2, module, filename)
 
-            cursor.execute('SELECT id FROM ir_module_module '
-                'WHERE name = %s', (package.name,))
+            cursor.execute(*ir_module.select(ir_module.id,
+                    where=(ir_module.name == package.name)))
             try:
                 module_id, = cursor.fetchone()
-                cursor.execute('UPDATE ir_module_module SET state = %s '
-                    'WHERE id = %s', ('installed', module_id))
+                cursor.execute(*ir_module.update([ir_module.state],
+                        ['installed'], where=(ir_module.id == module_id)))
             except TypeError:
-                cursor.execute('INSERT INTO ir_module_module '
-                    '(create_uid, create_date, name, state) '
-                    'VALUES (%s, %s, %s, %s)', (0, datetime.datetime.now(),
-                        package.name, 'installed'))
+                cursor.execute(*ir_module.insert(
+                        [ir_module.create_uid, ir_module.create_date,
+                            ir_module.name, ir_module.state],
+                        [[0, Now(), package.name, 'installed']]))
             module2state[package.name] = 'installed'
 
         cursor.commit()
@@ -296,7 +303,7 @@ def get_module_list():
     module_list.add('ir')
     module_list.add('res')
     module_list.add('webdav')
-    module_list.add('test')
+    module_list.add('tests')
     return list(module_list)
 
 
@@ -310,15 +317,15 @@ def register_classes():
     trytond.res.register()
     import trytond.webdav
     trytond.webdav.register()
-    import trytond.test
-    trytond.test.register()
+    import trytond.tests
+    trytond.tests.register()
     logger = logging.getLogger('modules')
 
     for package in create_graph(get_module_list())[0]:
         module = package.name
         logger.info('%s:registering classes' % module)
 
-        if module in ('ir', 'res', 'webdav', 'test'):
+        if module in ('ir', 'res', 'webdav', 'tests'):
             MODULES.append(module)
             continue
 
@@ -365,18 +372,19 @@ def load_modules(database_name, pool, update=False, lang=None):
         cursor = Transaction().cursor
         if update:
             # Migration from 2.2: workflow module removed
-            cursor.execute('DELETE FROM ir_module_module '
-                'WHERE name = %s', ('workflow',))
+            cursor.execute(*ir_module.delete(
+                    where=(ir_module.name == 'workflow')))
             if 'all' in CONFIG['init']:
-                cursor.execute("SELECT name FROM ir_module_module "
-                    "WHERE name != \'test\'")
+                cursor.execute(*ir_module.select(ir_module.name,
+                        where=(ir_module.name != 'tests')))
             else:
-                cursor.execute("SELECT name FROM ir_module_module "
-                    "WHERE state IN ('installed', 'to install', "
-                    "'to upgrade', 'to remove')")
+                cursor.execute(*ir_module.select(ir_module.name,
+                        where=ir_module.state.in_(('installed', 'to install',
+                                'to upgrade', 'to remove'))))
         else:
-            cursor.execute("SELECT name FROM ir_module_module "
-                "WHERE state IN ('installed', 'to upgrade', 'to remove')")
+            cursor.execute(*ir_module.select(ir_module.name,
+                    where=ir_module.state.in_(('installed', 'to upgrade',
+                            'to remove'))))
         module_list = [name for (name,) in cursor.fetchall()]
         if update:
             for module in CONFIG['init'].keys():
@@ -394,21 +402,23 @@ def load_modules(database_name, pool, update=False, lang=None):
             raise
 
         if update:
-            cursor.execute("SELECT name FROM ir_module_module "
-                "WHERE state IN ('to remove')")
+            cursor.execute(*ir_module.select(ir_module.name,
+                    where=(ir_module.state == 'to remove')))
             fetchall = cursor.fetchall()
             if fetchall:
                 for (mod_name,) in fetchall:
                     #TODO check if ressource not updated by the user
-                    cursor.execute('SELECT model, db_id FROM ir_model_data '
-                        'WHERE module = %s '
-                        'ORDER BY id DESC', (mod_name,))
+                    cursor.execute(*ir_model_data.select(ir_model_data.model,
+                            ir_model_data.db_id,
+                            where=(ir_model_data.module == mod_name),
+                            order_by=ir_model_data.id.desc))
                     for rmod, rid in cursor.fetchall():
                         Model = pool.get(rmod)
                         Model.delete([Model(rid)])
                     cursor.commit()
-                cursor.execute("UPDATE ir_module_module SET state = %s "
-                    "WHERE state IN ('to remove')", ('uninstalled',))
+                cursor.execute(*ir_module.update([ir_module.state],
+                        ['uninstalled'],
+                        where=(ir_module.state == 'to remove')))
                 cursor.commit()
                 res = False
 
diff --git a/trytond/pool.py b/trytond/pool.py
index 0b3fb44..f57f3dc 100644
--- a/trytond/pool.py
+++ b/trytond/pool.py
@@ -6,7 +6,7 @@ from trytond.modules import load_modules, register_classes
 from trytond.transaction import Transaction
 import __builtin__
 
-__all__ = ['Pool', 'PoolMeta']
+__all__ = ['Pool', 'PoolMeta', 'PoolBase']
 
 
 class PoolMeta(type):
@@ -18,6 +18,22 @@ class PoolMeta(type):
         return new
 
 
+class PoolBase(object):
+    __metaclass__ = PoolMeta
+
+    @classmethod
+    def __setup__(cls):
+        pass
+
+    @classmethod
+    def __post_setup__(cls):
+        pass
+
+    @classmethod
+    def __register__(cls, module_name):
+        pass
+
+
 class Pool(object):
 
     classes = {
@@ -62,6 +78,7 @@ class Pool(object):
         for cls in classes:
             mpool = Pool.classes[type_].setdefault(module, [])
             assert cls not in mpool, cls
+            assert issubclass(cls.__class__, PoolMeta), cls
             mpool.append(cls)
 
     @classmethod
@@ -203,15 +220,11 @@ class Pool(object):
                     cls = type(cls.__name__, (cls, previous_cls), {})
                 except KeyError:
                     pass
-                try:
-                    cls.__setup__()
-                except AttributeError:
-                    if issubclass(cls.__class__, PoolMeta):
-                        continue
-                    raise
+                if not issubclass(cls, PoolBase):
+                    continue
+                cls.__setup__()
                 self.add(cls, type=type_)
                 classes[type_].append(cls)
             for cls in classes[type_]:
-                if hasattr(cls, '__post_setup__'):
-                    cls.__post_setup__()
+                cls.__post_setup__()
         return classes
diff --git a/trytond/protocols/dispatcher.py b/trytond/protocols/dispatcher.py
index e00f0b0..61bd7da 100644
--- a/trytond/protocols/dispatcher.py
+++ b/trytond/protocols/dispatcher.py
@@ -5,11 +5,13 @@ import traceback
 import logging
 import time
 import sys
-import hashlib
 import pydoc
+
+from sql import Table
+
 from trytond.pool import Pool
 from trytond import security
-from trytond.backend import Database, DatabaseOperationalError
+from trytond import backend
 from trytond.config import CONFIG
 from trytond.version import VERSION
 from trytond.transaction import Transaction
@@ -19,9 +21,16 @@ from trytond.exceptions import UserError, UserWarning, NotLogged, \
 from trytond.rpc import RPC
 
 
+ir_configuration = Table('ir_configuration')
+ir_lang = Table('ir_lang')
+ir_module = Table('ir_module')
+res_user = Table('res_user')
+
+
 def dispatch(host, port, protocol, database_name, user, session, object_type,
         object_name, method, *args, **kwargs):
-
+    Database = backend.get('Database')
+    DatabaseOperationalError = backend.get('DatabaseOperationalError')
     if object_type == 'common':
         if method == 'login':
             try:
@@ -63,6 +72,7 @@ def dispatch(host, port, protocol, database_name, user, session, object_type,
                 ('lt_LT', 'Lietuvių'),
                 ('nl_NL', 'Nederlands'),
                 ('ru_RU', 'Russian'),
+                ('sl_SI', 'Slovenščina'),
             ]
         elif method == 'db_exist':
             try:
@@ -183,17 +193,16 @@ def dispatch(host, port, protocol, database_name, user, session, object_type,
                             database_name) + tb_s)
                 transaction.cursor.rollback()
                 raise
-        if not (object_name == 'res.request' and method == 'request_get'):
-            with Transaction().start(database_name, 0) as transaction:
-                pool = Pool(database_name)
-                Session = pool.get('ir.session')
-                try:
-                    Session.reset(session)
-                except DatabaseOperationalError:
-                    # Silently fail when reseting session
-                    transaction.cursor.rollback()
-                else:
-                    transaction.cursor.commit()
+        with Transaction().start(database_name, 0) as transaction:
+            pool = Pool(database_name)
+            Session = pool.get('ir.session')
+            try:
+                Session.reset(session)
+            except DatabaseOperationalError:
+                # Silently fail when reseting session
+                transaction.cursor.rollback()
+            else:
+                transaction.cursor.commit()
         Cache.resets(database_name)
         return result
 
@@ -208,6 +217,7 @@ def create(database_name, password, lang, admin_password):
     :param admin_password: the admin password
     :return: True if succeed
     '''
+    Database = backend.get('Database')
     security.check_super(password)
     res = False
     logger = logging.getLogger('database')
@@ -225,32 +235,30 @@ def create(database_name, password, lang, admin_password):
 
         with Transaction().start(database_name, 0) as transaction:
             database.init(transaction.cursor)
-            transaction.cursor.execute('INSERT INTO ir_configuration '
-                '(language) VALUES (%s)', (lang,))
+            transaction.cursor.execute(*ir_configuration.insert(
+                    [ir_configuration.language], [[lang]]))
             transaction.cursor.commit()
 
         pool = Pool(database_name)
         pool.init(update=True, lang=[lang])
         with Transaction().start(database_name, 0) as transaction:
-            cursor = transaction.cursor
-            #XXX replace with model write
-            cursor.execute('UPDATE ir_lang '
-                'SET translatable = %s '
-                'WHERE code = %s', (True, lang))
-            cursor.execute('UPDATE res_user '
-                'SET language = (' +
-                cursor.limit_clause('SELECT id FROM ir_lang '
-                    'WHERE code = %s', 1) + ')'
-                'WHERE login <> \'root\'', (lang,))
-            admin_password = hashlib.sha1(admin_password.encode('utf-8'))\
-                .hexdigest()
-            cursor.execute('UPDATE res_user '
-                'SET password = %s '
-                'WHERE login = \'admin\'', (admin_password,))
+            User = pool.get('res.user')
+            Lang = pool.get('ir.lang')
+            language, = Lang.search([('code', '=', lang)])
+            language.translatable = True
+            language.save()
+            users = User.search([('login', '!=', 'root')])
+            User.write(users, {
+                    'language': language.id,
+                    })
+            admin, = User.search([('login', '=', 'admin')])
+            User.write([admin], {
+                    'password': admin_password,
+                    })
             Module = pool.get('ir.module.module')
             if Module:
                 Module.update_list()
-            cursor.commit()
+            transaction.cursor.commit()
             res = True
     except Exception:
         logger.error('CREATE DB: %s failed' % (database_name,))
@@ -263,6 +271,7 @@ def create(database_name, password, lang, admin_password):
 
 
 def drop(database_name, password):
+    Database = backend.get('Database')
     security.check_super(password)
     Database(database_name).close()
     # Sleep to let connections close
@@ -289,6 +298,7 @@ def drop(database_name, password):
 
 
 def dump(database_name, password):
+    Database = backend.get('Database')
     security.check_super(password)
     Database(database_name).close()
     # Sleep to let connections close
@@ -301,6 +311,7 @@ def dump(database_name, password):
 
 
 def restore(database_name, password, data, update=False):
+    Database = backend.get('Database')
     logger = logging.getLogger('database')
     security.check_super(password)
     try:
@@ -314,12 +325,11 @@ def restore(database_name, password, data, update=False):
     logger.info('RESTORE DB: %s' % (database_name))
     if update:
         cursor = Database(database_name).connect().cursor()
-        cursor.execute('SELECT code FROM ir_lang '
-            'WHERE translatable')
+        cursor.execute(*ir_lang.select(ir_lang.code,
+                where=ir_lang.translatable))
         lang = [x[0] for x in cursor.fetchall()]
-        cursor.execute('UPDATE ir_module_module SET '
-            "state = 'to upgrade' "
-            "WHERE state = 'installed'")
+        cursor.execute(*ir_module.update([ir_module.state], ['to upgrade'],
+                where=(ir_module.state == 'installed')))
         cursor.commit()
         cursor.close()
         Pool(database_name).init(update=update, lang=lang)
diff --git a/trytond/protocols/jsonrpc.py b/trytond/protocols/jsonrpc.py
index 5123615..201ba41 100644
--- a/trytond/protocols/jsonrpc.py
+++ b/trytond/protocols/jsonrpc.py
@@ -251,6 +251,10 @@ class SimpleJSONRPCRequestHandler(GZipRequestHandlerMixin,
         self.copyfile(content, self.wfile)
         content.close()
 
+SimpleJSONRPCRequestHandler.extensions_map.update({
+        '.svg': 'image/svg+xml',
+        })
+
 
 class SecureJSONRPCRequestHandler(SimpleJSONRPCRequestHandler):
 
diff --git a/trytond/protocols/webdav.py b/trytond/protocols/webdav.py
index e7ad11b..98b12ff 100644
--- a/trytond/protocols/webdav.py
+++ b/trytond/protocols/webdav.py
@@ -25,7 +25,7 @@ from trytond.config import CONFIG
 from trytond.security import login
 from trytond.version import PACKAGE, VERSION, WEBSITE
 from trytond.tools.misc import LocalDict
-from trytond.backend import Database
+from trytond import backend
 from trytond.pool import Pool
 from trytond.transaction import Transaction
 from trytond.cache import Cache
@@ -157,7 +157,7 @@ class TrytonDAVInterface(iface.dav_interface):
         res = []
         dbname, dburi = self._get_dburi(uri)
         if not dbname:
-            database = Database().connect()
+            database = backend.get('Database')().connect()
             cursor = database.cursor()
             try:
                 lists = database.list(cursor)
@@ -554,7 +554,7 @@ class WebDAVAuthRequestHandler(WebDAVServer.DAVRequestHandler):
     def get_userinfo(self, user, password, command=''):
         path = urlparse.urlparse(self.path).path
         dbname = urllib.unquote_plus(path.split('/', 2)[1])
-        database = Database().connect()
+        database = backend.get('Database')().connect()
         cursor = database.cursor()
         databases = database.list(cursor)
         cursor.close()
diff --git a/trytond/report/report.py b/trytond/report/report.py
index c6478a8..2536b1e 100644
--- a/trytond/report/report.py
+++ b/trytond/report/report.py
@@ -22,7 +22,7 @@ except ImportError:
 from genshi.filters import Translator
 import lxml.etree
 from trytond.config import CONFIG
-from trytond.pool import Pool, PoolMeta
+from trytond.pool import Pool, PoolBase
 from trytond.transaction import Transaction
 from trytond.url import URLMixin
 from trytond.rpc import RPC
@@ -82,7 +82,7 @@ class TranslateFactory:
                 ('value', '!=', ''),
                 ('value', '!=', None),
                 ('fuzzy', '=', False),
-                ('res_id', '=', None),
+                ('res_id', '=', -1),
                 ])
             for translation in translations:
                 self.cache[self.language][translation.src] = translation.value
@@ -92,20 +92,16 @@ class TranslateFactory:
         self.language = language
 
 
-class Report(URLMixin):
-    __metaclass__ = PoolMeta
+class Report(URLMixin, PoolBase):
 
     @classmethod
     def __setup__(cls):
+        super(Report, cls).__setup__()
         cls.__rpc__ = {
             'execute': RPC(),
             }
 
     @classmethod
-    def __register__(cls, module_name):
-        pass
-
-    @classmethod
     def execute(cls, ids, data):
         '''
         Execute the report on record ids.
@@ -316,29 +312,18 @@ class Report(URLMixin):
         Lang = pool.get('ir.lang')
         Config = pool.get('ir.configuration')
 
-        if date:
+        if date or isinstance(value, datetime.date):
+            if date:
+                warnings.warn('date parameter of format_lang is deprecated, '
+                    'use a datetime.date as value instead', DeprecationWarning,
+                    stacklevel=2)
             if lang:
                 locale_format = lang.date
                 code = lang.code
             else:
                 locale_format = Lang.default_date()
                 code = Config.get_language()
-            if not isinstance(value, time.struct_time):
-                # assume string, parse it
-                if len(str(value)) == 10:
-                    # length of date like 2001-01-01 is ten
-                    # assume format '%Y-%m-%d'
-                    string_pattern = '%Y-%m-%d'
-                else:
-                    # assume format '%Y-%m-%d %H:%M:%S'
-                    value = str(value)[:19]
-                    locale_format = locale_format + ' %H:%M:%S'
-                    string_pattern = '%Y-%m-%d %H:%M:%S'
-                date = datetime.datetime(*time.strptime(str(value),
-                    string_pattern)[:6])
-            else:
-                date = datetime.datetime(*(value.timetuple()[:6]))
-            return Lang.strftime(date, code, locale_format)
+            return Lang.strftime(value, code, locale_format)
         if currency:
             return Lang.currency(lang, value, currency, grouping=grouping,
                 symbol=symbol)
diff --git a/trytond/res/__init__.py b/trytond/res/__init__.py
index 396cd3a..481f45a 100644
--- a/trytond/res/__init__.py
+++ b/trytond/res/__init__.py
@@ -3,7 +3,6 @@
 from ..pool import Pool
 from .group import *
 from .user import *
-from .request import *
 from .ir import *
 
 
@@ -17,10 +16,6 @@ def register():
         UserGroup,
         Warning_,
         UserConfigStart,
-        Request,
-        RequestLink,
-        RequestHistory,
-        RequestReference,
         UIMenuGroup,
         ActionGroup,
         ModelFieldGroup,
diff --git a/trytond/res/ir.py b/trytond/res/ir.py
index 046f9aa..784ca53 100644
--- a/trytond/res/ir.py
+++ b/trytond/res/ir.py
@@ -1,7 +1,7 @@
 #This file is part of Tryton.  The COPYRIGHT file at the top level of
 #this repository contains the full copyright notices and license terms.
 from ..model import ModelSQL, fields
-from ..backend import TableHandler
+from .. import backend
 from ..transaction import Transaction
 from ..pool import Pool, PoolMeta
 
@@ -24,11 +24,12 @@ class UIMenuGroup(ModelSQL):
 
     @classmethod
     def __register__(cls, module_name):
+        TableHandler = backend.get('TableHandler')
         cursor = Transaction().cursor
         # Migration from 1.0 table name change
         TableHandler.table_rename(cursor, 'ir_ui_menu_group_rel', cls._table)
         TableHandler.sequence_rename(cursor, 'ir_ui_menu_group_rel_id_seq',
-                cls._table + '_id_seq')
+            cls._table + '_id_seq')
         # Migration from 2.0 menu_id and gid renamed into menu group
         table = TableHandler(cursor, cls, module_name)
         table.column_rename('menu_id', 'menu')
@@ -65,11 +66,12 @@ class ActionGroup(ModelSQL):
 
     @classmethod
     def __register__(cls, module_name):
+        TableHandler = backend.get('TableHandler')
         cursor = Transaction().cursor
         # Migration from 1.0 table name change
         TableHandler.table_rename(cursor, 'ir_action_group_rel', cls._table)
         TableHandler.sequence_rename(cursor, 'ir_action_group_rel_id_seq',
-                cls._table + '_id_seq')
+            cls._table + '_id_seq')
         # Migration from 2.0 action_id and gid renamed into action and group
         table = TableHandler(cursor, cls, module_name)
         table.column_rename('action_id', 'action')
@@ -115,6 +117,7 @@ class ModelFieldGroup(ModelSQL):
 
     @classmethod
     def __register__(cls, module_name):
+        TableHandler = backend.get('TableHandler')
         cursor = Transaction().cursor
         # Migration from 1.0 table name change
         TableHandler.table_rename(cursor, 'ir_model_field_group_rel',
@@ -174,11 +177,12 @@ class RuleGroupGroup(ModelSQL):
 
     @classmethod
     def __register__(cls, module_name):
+        TableHandler = backend.get('TableHandler')
         cursor = Transaction().cursor
         # Migration from 1.0 table name change
         TableHandler.table_rename(cursor, 'group_rule_group_rel', cls._table)
         TableHandler.sequence_rename(cursor, 'group_rule_group_rel_id_seq',
-                cls._table + '_id_seq')
+            cls._table + '_id_seq')
         # Migration from 2.0 rule_group_id and group_id renamed into rule_group
         # and group
         table = TableHandler(cursor, cls, module_name)
@@ -197,11 +201,12 @@ class RuleGroupUser(ModelSQL):
 
     @classmethod
     def __register__(cls, module_name):
+        TableHandler = backend.get('TableHandler')
         cursor = Transaction().cursor
         # Migration from 1.0 table name change
         TableHandler.table_rename(cursor, 'user_rule_group_rel', cls._table)
         TableHandler.sequence_rename(cursor, 'user_rule_group_rel_id_seq',
-                cls._table + '_id_seq')
+            cls._table + '_id_seq')
         # Migration from 2.0 rule_group_id and user_id renamed into rule_group
         # and user
         table = TableHandler(cursor, cls, module_name)
diff --git a/trytond/res/ir.xml b/trytond/res/ir.xml
index dd99cc2..45c6557 100644
--- a/trytond/res/ir.xml
+++ b/trytond/res/ir.xml
@@ -746,11 +746,6 @@ this repository contains the full copyright notices and license terms. -->
             <field name="group" ref="group_admin"/>
         </record>
 
-        <record model="res.request.link" id="request_link_cron">
-            <field name="name">Scheduler</field>
-            <field name="model">ir.cron</field>
-        </record>
-
         <record model="ir.ui.view" id="sequence_type_view_form">
           <field name="model">ir.sequence.type</field>
           <field name="inherit" ref="ir.sequence_type_view_form"/>
@@ -800,15 +795,15 @@ this repository contains the full copyright notices and license terms. -->
             <field name="function">trigger_time</field>
         </record>
 
-        <record model="ir.model.access" id="rule_default_view_tree_expanded_state">
-            <field name="model" search="[('model', '=', 'ir.ui.view_tree_expanded_state')]" />
+        <record model="ir.model.access" id="rule_default_view_tree_state">
+            <field name="model" search="[('model', '=', 'ir.ui.view_tree_state')]" />
             <field name="perm_read" eval="False" />
             <field name="perm_write" eval="False" />
             <field name="perm_create" eval="False" />
             <field name="perm_delete" eval="False" />
         </record>
-        <record model="ir.model.access" id="rule_group_view_tree_expanded_state">
-            <field name="model" search="[('model', '=', 'ir.ui.view_tree_expanded_state')]" />
+        <record model="ir.model.access" id="rule_group_view_tree_state">
+            <field name="model" search="[('model', '=', 'ir.ui.view_tree_state')]" />
             <field name="group" ref="res.group_admin" />
             <field name="perm_read" eval="True" />
             <field name="perm_write" eval="True" />
diff --git a/trytond/res/locale/bg_BG.po b/trytond/res/locale/bg_BG.po
index b6b12c4..a68b490 100644
--- a/trytond/res/locale/bg_BG.po
+++ b/trytond/res/locale/bg_BG.po
@@ -313,210 +313,6 @@ msgctxt "field:res.group,write_uid:"
 msgid "Write User"
 msgstr "Променено от"
 
-msgctxt "field:res.request,act_from:"
-msgid "From"
-msgstr "От"
-
-msgctxt "field:res.request,act_to:"
-msgid "To"
-msgstr "До"
-
-msgctxt "field:res.request,active:"
-msgid "Active"
-msgstr "Активен"
-
-msgctxt "field:res.request,body:"
-msgid "Body"
-msgstr "Тяло"
-
-msgctxt "field:res.request,create_date:"
-msgid "Create Date"
-msgstr "Създадено на"
-
-msgctxt "field:res.request,create_uid:"
-msgid "Create User"
-msgstr "Създадено от"
-
-msgctxt "field:res.request,date_sent:"
-msgid "Date"
-msgstr "Дата"
-
-msgctxt "field:res.request,history:"
-msgid "History"
-msgstr "Изтория"
-
-msgctxt "field:res.request,id:"
-msgid "ID"
-msgstr "ID"
-
-msgctxt "field:res.request,name:"
-msgid "Subject"
-msgstr "Относно"
-
-msgctxt "field:res.request,number_references:"
-msgid "Number of References"
-msgstr "Брой препратки"
-
-msgctxt "field:res.request,priority:"
-msgid "Priority"
-msgstr "Важност"
-
-msgctxt "field:res.request,rec_name:"
-msgid "Name"
-msgstr "Име"
-
-msgctxt "field:res.request,references:"
-msgid "References"
-msgstr "Отпратки"
-
-msgctxt "field:res.request,state:"
-msgid "State"
-msgstr "Състояние"
-
-msgctxt "field:res.request,trigger_date:"
-msgid "Trigger Date"
-msgstr "Дата на активиране"
-
-msgctxt "field:res.request,write_date:"
-msgid "Write Date"
-msgstr "Променено на"
-
-msgctxt "field:res.request,write_uid:"
-msgid "Write User"
-msgstr "Променено от"
-
-msgctxt "field:res.request.history,act_from:"
-msgid "From"
-msgstr "От"
-
-msgctxt "field:res.request.history,act_to:"
-msgid "To"
-msgstr "До"
-
-msgctxt "field:res.request.history,body:"
-msgid "Body"
-msgstr "Тяло"
-
-msgctxt "field:res.request.history,create_date:"
-msgid "Create Date"
-msgstr "Създадено на"
-
-msgctxt "field:res.request.history,create_uid:"
-msgid "Create User"
-msgstr "Създадено от"
-
-msgctxt "field:res.request.history,date_sent:"
-msgid "Date sent"
-msgstr "Дата на изпращане"
-
-msgctxt "field:res.request.history,id:"
-msgid "ID"
-msgstr "ID"
-
-msgctxt "field:res.request.history,name:"
-msgid "Summary"
-msgstr "Обобщено"
-
-msgctxt "field:res.request.history,number_references:"
-msgid "References"
-msgstr "Отпратки"
-
-msgctxt "field:res.request.history,priority:"
-msgid "Priority"
-msgstr "Важност"
-
-msgctxt "field:res.request.history,rec_name:"
-msgid "Name"
-msgstr "Име"
-
-msgctxt "field:res.request.history,request:"
-msgid "Request"
-msgstr "Заявка"
-
-msgctxt "field:res.request.history,state:"
-msgid "State"
-msgstr "Състояние"
-
-msgctxt "field:res.request.history,subject:"
-msgid "Subject"
-msgstr "Относно"
-
-msgctxt "field:res.request.history,write_date:"
-msgid "Write Date"
-msgstr "Променено на"
-
-msgctxt "field:res.request.history,write_uid:"
-msgid "Write User"
-msgstr "Променено от"
-
-msgctxt "field:res.request.link,create_date:"
-msgid "Create Date"
-msgstr "Създадено на"
-
-msgctxt "field:res.request.link,create_uid:"
-msgid "Create User"
-msgstr "Създадено от"
-
-msgctxt "field:res.request.link,id:"
-msgid "ID"
-msgstr "ID"
-
-msgctxt "field:res.request.link,model:"
-msgid "Model"
-msgstr "Модел"
-
-msgctxt "field:res.request.link,name:"
-msgid "Name"
-msgstr "Име"
-
-msgctxt "field:res.request.link,priority:"
-msgid "Priority"
-msgstr "Важност"
-
-msgctxt "field:res.request.link,rec_name:"
-msgid "Name"
-msgstr "Име"
-
-msgctxt "field:res.request.link,write_date:"
-msgid "Write Date"
-msgstr "Променено на"
-
-msgctxt "field:res.request.link,write_uid:"
-msgid "Write User"
-msgstr "Променено от"
-
-msgctxt "field:res.request.reference,create_date:"
-msgid "Create Date"
-msgstr "Създадено на"
-
-msgctxt "field:res.request.reference,create_uid:"
-msgid "Create User"
-msgstr "Създадено от"
-
-msgctxt "field:res.request.reference,id:"
-msgid "ID"
-msgstr "ID"
-
-msgctxt "field:res.request.reference,rec_name:"
-msgid "Name"
-msgstr "Име"
-
-msgctxt "field:res.request.reference,reference:"
-msgid "Reference"
-msgstr "Отпратка"
-
-msgctxt "field:res.request.reference,request:"
-msgid "Request"
-msgstr "Заявка"
-
-msgctxt "field:res.request.reference,write_date:"
-msgid "Write Date"
-msgstr "Променено на"
-
-msgctxt "field:res.request.reference,write_uid:"
-msgid "Write User"
-msgstr "Променено от"
-
 msgctxt "field:res.user,actions:"
 msgid "Actions"
 msgstr "Действия"
@@ -697,16 +493,16 @@ msgid "ID"
 msgstr "ID"
 
 #, fuzzy
+msgctxt "field:res.user.login.attempt,login:"
+msgid "Login"
+msgstr "Потребителско име"
+
+#, fuzzy
 msgctxt "field:res.user.login.attempt,rec_name:"
 msgid "Name"
 msgstr "Име на прикачен файл"
 
 #, fuzzy
-msgctxt "field:res.user.login.attempt,user:"
-msgid "User"
-msgstr "Потребител"
-
-#, fuzzy
 msgctxt "field:res.user.login.attempt,write_date:"
 msgid "Write Date"
 msgstr "Променено на"
@@ -764,14 +560,6 @@ msgctxt "model:ir.action,name:act_group_form"
 msgid "Groups"
 msgstr "Групи"
 
-msgctxt "model:ir.action,name:act_request_form"
-msgid "Requests"
-msgstr "Заявки"
-
-msgctxt "model:ir.action,name:act_request_link_form"
-msgid "Request Links"
-msgstr "Връзки към заявка"
-
 msgctxt "model:ir.action,name:act_user_config"
 msgid "Configure Users"
 msgstr " Настройки на потребители"
@@ -812,14 +600,6 @@ msgctxt "model:ir.ui.menu,name:menu_group_form"
 msgid "Groups"
 msgstr "Групи"
 
-msgctxt "model:ir.ui.menu,name:menu_request_form"
-msgid "Requests"
-msgstr "Заявки"
-
-msgctxt "model:ir.ui.menu,name:menu_request_link_form"
-msgid "Request Links"
-msgstr "Връзки към заявки"
-
 msgctxt "model:ir.ui.menu,name:menu_res"
 msgid "Users"
 msgstr "Потребители"
@@ -840,26 +620,6 @@ msgctxt "model:res.group,name:group_admin"
 msgid "Administration"
 msgstr "Администрация"
 
-msgctxt "model:res.request,name:"
-msgid "Request"
-msgstr "Заявка"
-
-msgctxt "model:res.request.history,name:"
-msgid "Request history"
-msgstr "Изтория на заявка"
-
-msgctxt "model:res.request.link,name:"
-msgid "Request link"
-msgstr "Връзка към заявка"
-
-msgctxt "model:res.request.link,name:request_link_cron"
-msgid "Scheduler"
-msgstr "Планировщик"
-
-msgctxt "model:res.request.reference,name:"
-msgid "Request Reference"
-msgstr "Отпратка към заявка"
-
 msgctxt "model:res.user,name:"
 msgid "User"
 msgstr "Потребител"
@@ -892,62 +652,6 @@ msgctxt "model:res.user.warning,name:"
 msgid "User Warning"
 msgstr "Потребителско предупреждение"
 
-msgctxt "selection:res.request,priority:"
-msgid "High"
-msgstr "Висок"
-
-msgctxt "selection:res.request,priority:"
-msgid "Low"
-msgstr "Ниска"
-
-msgctxt "selection:res.request,priority:"
-msgid "Normal"
-msgstr "Нормален"
-
-msgctxt "selection:res.request,state:"
-msgid "Chatting"
-msgstr "Преговори"
-
-msgctxt "selection:res.request,state:"
-msgid "Closed"
-msgstr "Приключен"
-
-msgctxt "selection:res.request,state:"
-msgid "Draft"
-msgstr "Проект"
-
-msgctxt "selection:res.request,state:"
-msgid "Waiting"
-msgstr "Изчакващ"
-
-msgctxt "selection:res.request.history,priority:"
-msgid "High"
-msgstr "Висок"
-
-msgctxt "selection:res.request.history,priority:"
-msgid "Low"
-msgstr "Ниска"
-
-msgctxt "selection:res.request.history,priority:"
-msgid "Normal"
-msgstr "Нормален"
-
-msgctxt "selection:res.request.history,state:"
-msgid "Chatting"
-msgstr "Преговори"
-
-msgctxt "selection:res.request.history,state:"
-msgid "Closed"
-msgstr "Приключен"
-
-msgctxt "selection:res.request.history,state:"
-msgid "Draft"
-msgstr "Проект"
-
-msgctxt "selection:res.request.history,state:"
-msgid "Waiting"
-msgstr "Изчакващ"
-
 msgctxt "view:ir.module.module:"
 msgid "Cancel Installation"
 msgstr "Отказ от инсталалиране"
@@ -988,46 +692,6 @@ msgctxt "view:res.group:"
 msgid "Members"
 msgstr "Членове"
 
-msgctxt "view:res.request.history:"
-msgid "Request History"
-msgstr "Истоярия на заявка"
-
-msgctxt "view:res.request.link:"
-msgid "Request Link"
-msgstr "Връзка към заявка"
-
-msgctxt "view:res.request.reference:"
-msgid "Request Reference"
-msgstr "Отпратка към заявка"
-
-msgctxt "view:res.request.reference:"
-msgid "Request References"
-msgstr "Отпратки към заявка"
-
-msgctxt "view:res.request:"
-msgid "Close"
-msgstr "Затваряне"
-
-msgctxt "view:res.request:"
-msgid "References"
-msgstr "Отпратки"
-
-msgctxt "view:res.request:"
-msgid "Reply"
-msgstr "Отговор"
-
-msgctxt "view:res.request:"
-msgid "Request"
-msgstr "Заявка"
-
-msgctxt "view:res.request:"
-msgid "Requests"
-msgstr "Заявки"
-
-msgctxt "view:res.request:"
-msgid "Send"
-msgstr "Изпратен"
-
 msgctxt "view:res.user.config.start:"
 msgid "Add Users"
 msgstr "Добавяне на потребители"
diff --git a/trytond/res/locale/ca_ES.po b/trytond/res/locale/ca_ES.po
index 62a525f..fd2c2f7 100644
--- a/trytond/res/locale/ca_ES.po
+++ b/trytond/res/locale/ca_ES.po
@@ -312,210 +312,6 @@ msgctxt "field:res.group,write_uid:"
 msgid "Write User"
 msgstr "Usuari modificació"
 
-msgctxt "field:res.request,act_from:"
-msgid "From"
-msgstr "Desde"
-
-msgctxt "field:res.request,act_to:"
-msgid "To"
-msgstr "Per a"
-
-msgctxt "field:res.request,active:"
-msgid "Active"
-msgstr "Actiu"
-
-msgctxt "field:res.request,body:"
-msgid "Body"
-msgstr "Cos"
-
-msgctxt "field:res.request,create_date:"
-msgid "Create Date"
-msgstr "Data creació"
-
-msgctxt "field:res.request,create_uid:"
-msgid "Create User"
-msgstr "Usuari creació"
-
-msgctxt "field:res.request,date_sent:"
-msgid "Date"
-msgstr "Data"
-
-msgctxt "field:res.request,history:"
-msgid "History"
-msgstr "Historial"
-
-msgctxt "field:res.request,id:"
-msgid "ID"
-msgstr "ID"
-
-msgctxt "field:res.request,name:"
-msgid "Subject"
-msgstr "Assumpte"
-
-msgctxt "field:res.request,number_references:"
-msgid "Number of References"
-msgstr "Número de referències"
-
-msgctxt "field:res.request,priority:"
-msgid "Priority"
-msgstr "Prioritat"
-
-msgctxt "field:res.request,rec_name:"
-msgid "Name"
-msgstr "Nom"
-
-msgctxt "field:res.request,references:"
-msgid "References"
-msgstr "Referències"
-
-msgctxt "field:res.request,state:"
-msgid "State"
-msgstr "Estat"
-
-msgctxt "field:res.request,trigger_date:"
-msgid "Trigger Date"
-msgstr "Data disparador"
-
-msgctxt "field:res.request,write_date:"
-msgid "Write Date"
-msgstr "Data modificació"
-
-msgctxt "field:res.request,write_uid:"
-msgid "Write User"
-msgstr "Usuari modificació"
-
-msgctxt "field:res.request.history,act_from:"
-msgid "From"
-msgstr "Desde"
-
-msgctxt "field:res.request.history,act_to:"
-msgid "To"
-msgstr "Per a"
-
-msgctxt "field:res.request.history,body:"
-msgid "Body"
-msgstr "Cos"
-
-msgctxt "field:res.request.history,create_date:"
-msgid "Create Date"
-msgstr "Data creació"
-
-msgctxt "field:res.request.history,create_uid:"
-msgid "Create User"
-msgstr "Usuari creació"
-
-msgctxt "field:res.request.history,date_sent:"
-msgid "Date sent"
-msgstr "Data enviat"
-
-msgctxt "field:res.request.history,id:"
-msgid "ID"
-msgstr "ID"
-
-msgctxt "field:res.request.history,name:"
-msgid "Summary"
-msgstr "Sumari"
-
-msgctxt "field:res.request.history,number_references:"
-msgid "References"
-msgstr "Referències"
-
-msgctxt "field:res.request.history,priority:"
-msgid "Priority"
-msgstr "Prioritat"
-
-msgctxt "field:res.request.history,rec_name:"
-msgid "Name"
-msgstr "Nom"
-
-msgctxt "field:res.request.history,request:"
-msgid "Request"
-msgstr "Sol·licitud"
-
-msgctxt "field:res.request.history,state:"
-msgid "State"
-msgstr "Estat"
-
-msgctxt "field:res.request.history,subject:"
-msgid "Subject"
-msgstr "Assumpte"
-
-msgctxt "field:res.request.history,write_date:"
-msgid "Write Date"
-msgstr "Data modificació"
-
-msgctxt "field:res.request.history,write_uid:"
-msgid "Write User"
-msgstr "Usuari modificació"
-
-msgctxt "field:res.request.link,create_date:"
-msgid "Create Date"
-msgstr "Data creació"
-
-msgctxt "field:res.request.link,create_uid:"
-msgid "Create User"
-msgstr "Usuari creació"
-
-msgctxt "field:res.request.link,id:"
-msgid "ID"
-msgstr "ID"
-
-msgctxt "field:res.request.link,model:"
-msgid "Model"
-msgstr "Model"
-
-msgctxt "field:res.request.link,name:"
-msgid "Name"
-msgstr "Nom"
-
-msgctxt "field:res.request.link,priority:"
-msgid "Priority"
-msgstr "Prioritat"
-
-msgctxt "field:res.request.link,rec_name:"
-msgid "Name"
-msgstr "Nom"
-
-msgctxt "field:res.request.link,write_date:"
-msgid "Write Date"
-msgstr "Data modificació"
-
-msgctxt "field:res.request.link,write_uid:"
-msgid "Write User"
-msgstr "Usuari modificació"
-
-msgctxt "field:res.request.reference,create_date:"
-msgid "Create Date"
-msgstr "Data creació"
-
-msgctxt "field:res.request.reference,create_uid:"
-msgid "Create User"
-msgstr "Usuari creació"
-
-msgctxt "field:res.request.reference,id:"
-msgid "ID"
-msgstr "ID"
-
-msgctxt "field:res.request.reference,rec_name:"
-msgid "Name"
-msgstr "Nom"
-
-msgctxt "field:res.request.reference,reference:"
-msgid "Reference"
-msgstr "Referència"
-
-msgctxt "field:res.request.reference,request:"
-msgid "Request"
-msgstr "Sol·licitud"
-
-msgctxt "field:res.request.reference,write_date:"
-msgid "Write Date"
-msgstr "Data modificació"
-
-msgctxt "field:res.request.reference,write_uid:"
-msgid "Write User"
-msgstr "Usuari modificació"
-
 msgctxt "field:res.user,actions:"
 msgid "Actions"
 msgstr "Accions"
@@ -692,14 +488,14 @@ msgctxt "field:res.user.login.attempt,id:"
 msgid "ID"
 msgstr "ID"
 
+msgctxt "field:res.user.login.attempt,login:"
+msgid "Login"
+msgstr "Nom d'usuari"
+
 msgctxt "field:res.user.login.attempt,rec_name:"
 msgid "Name"
 msgstr "Nom"
 
-msgctxt "field:res.user.login.attempt,user:"
-msgid "User"
-msgstr "Usuari"
-
 msgctxt "field:res.user.login.attempt,write_date:"
 msgid "Write Date"
 msgstr "Data modificació"
@@ -756,14 +552,6 @@ msgctxt "model:ir.action,name:act_group_form"
 msgid "Groups"
 msgstr "Grups"
 
-msgctxt "model:ir.action,name:act_request_form"
-msgid "Requests"
-msgstr "Sol·licituds"
-
-msgctxt "model:ir.action,name:act_request_link_form"
-msgid "Request Links"
-msgstr "Vincles sol·licituds"
-
 msgctxt "model:ir.action,name:act_user_config"
 msgid "Configure Users"
 msgstr "Configura usuaris"
@@ -804,14 +592,6 @@ msgctxt "model:ir.ui.menu,name:menu_group_form"
 msgid "Groups"
 msgstr "Grups"
 
-msgctxt "model:ir.ui.menu,name:menu_request_form"
-msgid "Requests"
-msgstr "Sol·licituds"
-
-msgctxt "model:ir.ui.menu,name:menu_request_link_form"
-msgid "Request Links"
-msgstr "Vincles sol·licituds"
-
 msgctxt "model:ir.ui.menu,name:menu_res"
 msgid "Users"
 msgstr "Usuaris"
@@ -832,26 +612,6 @@ msgctxt "model:res.group,name:group_admin"
 msgid "Administration"
 msgstr "Administració"
 
-msgctxt "model:res.request,name:"
-msgid "Request"
-msgstr "Sol·licitud"
-
-msgctxt "model:res.request.history,name:"
-msgid "Request history"
-msgstr "Historial sol·licitud"
-
-msgctxt "model:res.request.link,name:"
-msgid "Request link"
-msgstr "Vincle sol·licitud"
-
-msgctxt "model:res.request.link,name:request_link_cron"
-msgid "Scheduler"
-msgstr "Planificador"
-
-msgctxt "model:res.request.reference,name:"
-msgid "Request Reference"
-msgstr "Referència sol·licitud"
-
 msgctxt "model:res.user,name:"
 msgid "User"
 msgstr "Usuari"
@@ -884,62 +644,6 @@ msgctxt "model:res.user.warning,name:"
 msgid "User Warning"
 msgstr "Alerta usuari"
 
-msgctxt "selection:res.request,priority:"
-msgid "High"
-msgstr "Alta"
-
-msgctxt "selection:res.request,priority:"
-msgid "Low"
-msgstr "Baixa"
-
-msgctxt "selection:res.request,priority:"
-msgid "Normal"
-msgstr "Normal"
-
-msgctxt "selection:res.request,state:"
-msgid "Chatting"
-msgstr "Xatejant"
-
-msgctxt "selection:res.request,state:"
-msgid "Closed"
-msgstr "Tancat"
-
-msgctxt "selection:res.request,state:"
-msgid "Draft"
-msgstr "Borrador"
-
-msgctxt "selection:res.request,state:"
-msgid "Waiting"
-msgstr "Esperant"
-
-msgctxt "selection:res.request.history,priority:"
-msgid "High"
-msgstr "Alta"
-
-msgctxt "selection:res.request.history,priority:"
-msgid "Low"
-msgstr "Baixa"
-
-msgctxt "selection:res.request.history,priority:"
-msgid "Normal"
-msgstr "Normal"
-
-msgctxt "selection:res.request.history,state:"
-msgid "Chatting"
-msgstr "Xatejant"
-
-msgctxt "selection:res.request.history,state:"
-msgid "Closed"
-msgstr "Tancat"
-
-msgctxt "selection:res.request.history,state:"
-msgid "Draft"
-msgstr "Borrador"
-
-msgctxt "selection:res.request.history,state:"
-msgid "Waiting"
-msgstr "Esperant"
-
 msgctxt "view:res.group:"
 msgid "Access Permissions"
 msgstr "Accés permisos"
@@ -956,46 +660,6 @@ msgctxt "view:res.group:"
 msgid "Members"
 msgstr "Membres"
 
-msgctxt "view:res.request.history:"
-msgid "Request History"
-msgstr "Historial sol·licitud"
-
-msgctxt "view:res.request.link:"
-msgid "Request Link"
-msgstr "Vincle sol·licitud"
-
-msgctxt "view:res.request.reference:"
-msgid "Request Reference"
-msgstr "Referència sol·licitud"
-
-msgctxt "view:res.request.reference:"
-msgid "Request References"
-msgstr "Referències sol·licituds"
-
-msgctxt "view:res.request:"
-msgid "Close"
-msgstr "Tanca"
-
-msgctxt "view:res.request:"
-msgid "References"
-msgstr "Referències"
-
-msgctxt "view:res.request:"
-msgid "Reply"
-msgstr "Respondre"
-
-msgctxt "view:res.request:"
-msgid "Request"
-msgstr "Sol·licitud"
-
-msgctxt "view:res.request:"
-msgid "Requests"
-msgstr "Sol·licituds"
-
-msgctxt "view:res.request:"
-msgid "Send"
-msgstr "Envia"
-
 msgctxt "view:res.user.config.start:"
 msgid "Add Users"
 msgstr "Afegir usuaris"
diff --git a/trytond/res/locale/cs_CZ.po b/trytond/res/locale/cs_CZ.po
index e5af6cf..3531d01 100644
--- a/trytond/res/locale/cs_CZ.po
+++ b/trytond/res/locale/cs_CZ.po
@@ -309,210 +309,6 @@ msgctxt "field:res.group,write_uid:"
 msgid "Write User"
 msgstr ""
 
-msgctxt "field:res.request,act_from:"
-msgid "From"
-msgstr ""
-
-msgctxt "field:res.request,act_to:"
-msgid "To"
-msgstr ""
-
-msgctxt "field:res.request,active:"
-msgid "Active"
-msgstr ""
-
-msgctxt "field:res.request,body:"
-msgid "Body"
-msgstr ""
-
-msgctxt "field:res.request,create_date:"
-msgid "Create Date"
-msgstr ""
-
-msgctxt "field:res.request,create_uid:"
-msgid "Create User"
-msgstr ""
-
-msgctxt "field:res.request,date_sent:"
-msgid "Date"
-msgstr ""
-
-msgctxt "field:res.request,history:"
-msgid "History"
-msgstr ""
-
-msgctxt "field:res.request,id:"
-msgid "ID"
-msgstr ""
-
-msgctxt "field:res.request,name:"
-msgid "Subject"
-msgstr ""
-
-msgctxt "field:res.request,number_references:"
-msgid "Number of References"
-msgstr ""
-
-msgctxt "field:res.request,priority:"
-msgid "Priority"
-msgstr ""
-
-msgctxt "field:res.request,rec_name:"
-msgid "Name"
-msgstr ""
-
-msgctxt "field:res.request,references:"
-msgid "References"
-msgstr ""
-
-msgctxt "field:res.request,state:"
-msgid "State"
-msgstr ""
-
-msgctxt "field:res.request,trigger_date:"
-msgid "Trigger Date"
-msgstr ""
-
-msgctxt "field:res.request,write_date:"
-msgid "Write Date"
-msgstr ""
-
-msgctxt "field:res.request,write_uid:"
-msgid "Write User"
-msgstr ""
-
-msgctxt "field:res.request.history,act_from:"
-msgid "From"
-msgstr ""
-
-msgctxt "field:res.request.history,act_to:"
-msgid "To"
-msgstr ""
-
-msgctxt "field:res.request.history,body:"
-msgid "Body"
-msgstr ""
-
-msgctxt "field:res.request.history,create_date:"
-msgid "Create Date"
-msgstr ""
-
-msgctxt "field:res.request.history,create_uid:"
-msgid "Create User"
-msgstr ""
-
-msgctxt "field:res.request.history,date_sent:"
-msgid "Date sent"
-msgstr ""
-
-msgctxt "field:res.request.history,id:"
-msgid "ID"
-msgstr ""
-
-msgctxt "field:res.request.history,name:"
-msgid "Summary"
-msgstr ""
-
-msgctxt "field:res.request.history,number_references:"
-msgid "References"
-msgstr ""
-
-msgctxt "field:res.request.history,priority:"
-msgid "Priority"
-msgstr ""
-
-msgctxt "field:res.request.history,rec_name:"
-msgid "Name"
-msgstr ""
-
-msgctxt "field:res.request.history,request:"
-msgid "Request"
-msgstr ""
-
-msgctxt "field:res.request.history,state:"
-msgid "State"
-msgstr ""
-
-msgctxt "field:res.request.history,subject:"
-msgid "Subject"
-msgstr ""
-
-msgctxt "field:res.request.history,write_date:"
-msgid "Write Date"
-msgstr ""
-
-msgctxt "field:res.request.history,write_uid:"
-msgid "Write User"
-msgstr ""
-
-msgctxt "field:res.request.link,create_date:"
-msgid "Create Date"
-msgstr ""
-
-msgctxt "field:res.request.link,create_uid:"
-msgid "Create User"
-msgstr ""
-
-msgctxt "field:res.request.link,id:"
-msgid "ID"
-msgstr ""
-
-msgctxt "field:res.request.link,model:"
-msgid "Model"
-msgstr ""
-
-msgctxt "field:res.request.link,name:"
-msgid "Name"
-msgstr ""
-
-msgctxt "field:res.request.link,priority:"
-msgid "Priority"
-msgstr ""
-
-msgctxt "field:res.request.link,rec_name:"
-msgid "Name"
-msgstr ""
-
-msgctxt "field:res.request.link,write_date:"
-msgid "Write Date"
-msgstr ""
-
-msgctxt "field:res.request.link,write_uid:"
-msgid "Write User"
-msgstr ""
-
-msgctxt "field:res.request.reference,create_date:"
-msgid "Create Date"
-msgstr ""
-
-msgctxt "field:res.request.reference,create_uid:"
-msgid "Create User"
-msgstr ""
-
-msgctxt "field:res.request.reference,id:"
-msgid "ID"
-msgstr ""
-
-msgctxt "field:res.request.reference,rec_name:"
-msgid "Name"
-msgstr ""
-
-msgctxt "field:res.request.reference,reference:"
-msgid "Reference"
-msgstr ""
-
-msgctxt "field:res.request.reference,request:"
-msgid "Request"
-msgstr ""
-
-msgctxt "field:res.request.reference,write_date:"
-msgid "Write Date"
-msgstr ""
-
-msgctxt "field:res.request.reference,write_uid:"
-msgid "Write User"
-msgstr ""
-
 msgctxt "field:res.user,actions:"
 msgid "Actions"
 msgstr ""
@@ -689,12 +485,12 @@ msgctxt "field:res.user.login.attempt,id:"
 msgid "ID"
 msgstr ""
 
-msgctxt "field:res.user.login.attempt,rec_name:"
-msgid "Name"
+msgctxt "field:res.user.login.attempt,login:"
+msgid "Login"
 msgstr ""
 
-msgctxt "field:res.user.login.attempt,user:"
-msgid "User"
+msgctxt "field:res.user.login.attempt,rec_name:"
+msgid "Name"
 msgstr ""
 
 msgctxt "field:res.user.login.attempt,write_date:"
@@ -753,14 +549,6 @@ msgctxt "model:ir.action,name:act_group_form"
 msgid "Groups"
 msgstr ""
 
-msgctxt "model:ir.action,name:act_request_form"
-msgid "Requests"
-msgstr ""
-
-msgctxt "model:ir.action,name:act_request_link_form"
-msgid "Request Links"
-msgstr ""
-
 msgctxt "model:ir.action,name:act_user_config"
 msgid "Configure Users"
 msgstr ""
@@ -801,14 +589,6 @@ msgctxt "model:ir.ui.menu,name:menu_group_form"
 msgid "Groups"
 msgstr ""
 
-msgctxt "model:ir.ui.menu,name:menu_request_form"
-msgid "Requests"
-msgstr ""
-
-msgctxt "model:ir.ui.menu,name:menu_request_link_form"
-msgid "Request Links"
-msgstr ""
-
 msgctxt "model:ir.ui.menu,name:menu_res"
 msgid "Users"
 msgstr ""
@@ -829,26 +609,6 @@ msgctxt "model:res.group,name:group_admin"
 msgid "Administration"
 msgstr ""
 
-msgctxt "model:res.request,name:"
-msgid "Request"
-msgstr ""
-
-msgctxt "model:res.request.history,name:"
-msgid "Request history"
-msgstr ""
-
-msgctxt "model:res.request.link,name:"
-msgid "Request link"
-msgstr ""
-
-msgctxt "model:res.request.link,name:request_link_cron"
-msgid "Scheduler"
-msgstr ""
-
-msgctxt "model:res.request.reference,name:"
-msgid "Request Reference"
-msgstr ""
-
 msgctxt "model:res.user,name:"
 msgid "User"
 msgstr ""
@@ -881,62 +641,6 @@ msgctxt "model:res.user.warning,name:"
 msgid "User Warning"
 msgstr ""
 
-msgctxt "selection:res.request,priority:"
-msgid "High"
-msgstr ""
-
-msgctxt "selection:res.request,priority:"
-msgid "Low"
-msgstr ""
-
-msgctxt "selection:res.request,priority:"
-msgid "Normal"
-msgstr ""
-
-msgctxt "selection:res.request,state:"
-msgid "Chatting"
-msgstr ""
-
-msgctxt "selection:res.request,state:"
-msgid "Closed"
-msgstr ""
-
-msgctxt "selection:res.request,state:"
-msgid "Draft"
-msgstr ""
-
-msgctxt "selection:res.request,state:"
-msgid "Waiting"
-msgstr ""
-
-msgctxt "selection:res.request.history,priority:"
-msgid "High"
-msgstr ""
-
-msgctxt "selection:res.request.history,priority:"
-msgid "Low"
-msgstr ""
-
-msgctxt "selection:res.request.history,priority:"
-msgid "Normal"
-msgstr ""
-
-msgctxt "selection:res.request.history,state:"
-msgid "Chatting"
-msgstr ""
-
-msgctxt "selection:res.request.history,state:"
-msgid "Closed"
-msgstr ""
-
-msgctxt "selection:res.request.history,state:"
-msgid "Draft"
-msgstr ""
-
-msgctxt "selection:res.request.history,state:"
-msgid "Waiting"
-msgstr ""
-
 msgctxt "view:ir.module.module:"
 msgid "Cancel Installation"
 msgstr ""
@@ -977,46 +681,6 @@ msgctxt "view:res.group:"
 msgid "Members"
 msgstr ""
 
-msgctxt "view:res.request.history:"
-msgid "Request History"
-msgstr ""
-
-msgctxt "view:res.request.link:"
-msgid "Request Link"
-msgstr ""
-
-msgctxt "view:res.request.reference:"
-msgid "Request Reference"
-msgstr ""
-
-msgctxt "view:res.request.reference:"
-msgid "Request References"
-msgstr ""
-
-msgctxt "view:res.request:"
-msgid "Close"
-msgstr ""
-
-msgctxt "view:res.request:"
-msgid "References"
-msgstr ""
-
-msgctxt "view:res.request:"
-msgid "Reply"
-msgstr ""
-
-msgctxt "view:res.request:"
-msgid "Request"
-msgstr ""
-
-msgctxt "view:res.request:"
-msgid "Requests"
-msgstr ""
-
-msgctxt "view:res.request:"
-msgid "Send"
-msgstr ""
-
 msgctxt "view:res.user.config.start:"
 msgid "Add Users"
 msgstr ""
diff --git a/trytond/res/locale/de_DE.po b/trytond/res/locale/de_DE.po
index e541886..6ab5064 100644
--- a/trytond/res/locale/de_DE.po
+++ b/trytond/res/locale/de_DE.po
@@ -311,210 +311,6 @@ msgctxt "field:res.group,write_uid:"
 msgid "Write User"
 msgstr "Letzte Änderung durch"
 
-msgctxt "field:res.request,act_from:"
-msgid "From"
-msgstr "Von"
-
-msgctxt "field:res.request,act_to:"
-msgid "To"
-msgstr "An"
-
-msgctxt "field:res.request,active:"
-msgid "Active"
-msgstr "Aktiv"
-
-msgctxt "field:res.request,body:"
-msgid "Body"
-msgstr "Anfrage"
-
-msgctxt "field:res.request,create_date:"
-msgid "Create Date"
-msgstr "Erstellungsdatum"
-
-msgctxt "field:res.request,create_uid:"
-msgid "Create User"
-msgstr "Erstellt durch"
-
-msgctxt "field:res.request,date_sent:"
-msgid "Date"
-msgstr "Datum"
-
-msgctxt "field:res.request,history:"
-msgid "History"
-msgstr "Bisherige Anfragen"
-
-msgctxt "field:res.request,id:"
-msgid "ID"
-msgstr "ID"
-
-msgctxt "field:res.request,name:"
-msgid "Subject"
-msgstr "Betreff"
-
-msgctxt "field:res.request,number_references:"
-msgid "Number of References"
-msgstr "Anzahl Verweise"
-
-msgctxt "field:res.request,priority:"
-msgid "Priority"
-msgstr "Dringlichkeit"
-
-msgctxt "field:res.request,rec_name:"
-msgid "Name"
-msgstr "Name"
-
-msgctxt "field:res.request,references:"
-msgid "References"
-msgstr "Verweise"
-
-msgctxt "field:res.request,state:"
-msgid "State"
-msgstr "Status"
-
-msgctxt "field:res.request,trigger_date:"
-msgid "Trigger Date"
-msgstr "Gültig ab"
-
-msgctxt "field:res.request,write_date:"
-msgid "Write Date"
-msgstr "Zuletzt geändert"
-
-msgctxt "field:res.request,write_uid:"
-msgid "Write User"
-msgstr "Letzte Änderung durch"
-
-msgctxt "field:res.request.history,act_from:"
-msgid "From"
-msgstr "Von"
-
-msgctxt "field:res.request.history,act_to:"
-msgid "To"
-msgstr "An"
-
-msgctxt "field:res.request.history,body:"
-msgid "Body"
-msgstr "Nachricht"
-
-msgctxt "field:res.request.history,create_date:"
-msgid "Create Date"
-msgstr "Erstellungsdatum"
-
-msgctxt "field:res.request.history,create_uid:"
-msgid "Create User"
-msgstr "Erstellt durch"
-
-msgctxt "field:res.request.history,date_sent:"
-msgid "Date sent"
-msgstr "Gesendet am"
-
-msgctxt "field:res.request.history,id:"
-msgid "ID"
-msgstr "ID"
-
-msgctxt "field:res.request.history,name:"
-msgid "Summary"
-msgstr "Zusammenfassung"
-
-msgctxt "field:res.request.history,number_references:"
-msgid "References"
-msgstr "Verweise"
-
-msgctxt "field:res.request.history,priority:"
-msgid "Priority"
-msgstr "Priorität"
-
-msgctxt "field:res.request.history,rec_name:"
-msgid "Name"
-msgstr "Name"
-
-msgctxt "field:res.request.history,request:"
-msgid "Request"
-msgstr "Anfrage"
-
-msgctxt "field:res.request.history,state:"
-msgid "State"
-msgstr "Status"
-
-msgctxt "field:res.request.history,subject:"
-msgid "Subject"
-msgstr "Betreff"
-
-msgctxt "field:res.request.history,write_date:"
-msgid "Write Date"
-msgstr "Zuletzt geändert"
-
-msgctxt "field:res.request.history,write_uid:"
-msgid "Write User"
-msgstr "Letzte Änderung durch"
-
-msgctxt "field:res.request.link,create_date:"
-msgid "Create Date"
-msgstr "Erstellungsdatum"
-
-msgctxt "field:res.request.link,create_uid:"
-msgid "Create User"
-msgstr "Erstellt durch"
-
-msgctxt "field:res.request.link,id:"
-msgid "ID"
-msgstr "ID"
-
-msgctxt "field:res.request.link,model:"
-msgid "Model"
-msgstr "Modell"
-
-msgctxt "field:res.request.link,name:"
-msgid "Name"
-msgstr "Name"
-
-msgctxt "field:res.request.link,priority:"
-msgid "Priority"
-msgstr "Dringlichkeit"
-
-msgctxt "field:res.request.link,rec_name:"
-msgid "Name"
-msgstr "Name"
-
-msgctxt "field:res.request.link,write_date:"
-msgid "Write Date"
-msgstr "Zuletzt geändert"
-
-msgctxt "field:res.request.link,write_uid:"
-msgid "Write User"
-msgstr "Letzte Änderung durch"
-
-msgctxt "field:res.request.reference,create_date:"
-msgid "Create Date"
-msgstr "Erstellungsdatum"
-
-msgctxt "field:res.request.reference,create_uid:"
-msgid "Create User"
-msgstr "Erstellt durch"
-
-msgctxt "field:res.request.reference,id:"
-msgid "ID"
-msgstr "ID"
-
-msgctxt "field:res.request.reference,rec_name:"
-msgid "Name"
-msgstr "Name"
-
-msgctxt "field:res.request.reference,reference:"
-msgid "Reference"
-msgstr "Verweis"
-
-msgctxt "field:res.request.reference,request:"
-msgid "Request"
-msgstr "Anfrage"
-
-msgctxt "field:res.request.reference,write_date:"
-msgid "Write Date"
-msgstr "Zuletzt geändert"
-
-msgctxt "field:res.request.reference,write_uid:"
-msgid "Write User"
-msgstr "Letzte Änderung durch"
-
 msgctxt "field:res.user,actions:"
 msgid "Actions"
 msgstr "Aktionen"
@@ -691,14 +487,14 @@ msgctxt "field:res.user.login.attempt,id:"
 msgid "ID"
 msgstr "ID"
 
+msgctxt "field:res.user.login.attempt,login:"
+msgid "Login"
+msgstr "Anmeldename"
+
 msgctxt "field:res.user.login.attempt,rec_name:"
 msgid "Name"
 msgstr "Name"
 
-msgctxt "field:res.user.login.attempt,user:"
-msgid "User"
-msgstr "Benutzer"
-
 msgctxt "field:res.user.login.attempt,write_date:"
 msgid "Write Date"
 msgstr "Zuletzt geändert"
@@ -756,14 +552,6 @@ msgctxt "model:ir.action,name:act_group_form"
 msgid "Groups"
 msgstr "Gruppen"
 
-msgctxt "model:ir.action,name:act_request_form"
-msgid "Requests"
-msgstr "Anfragen"
-
-msgctxt "model:ir.action,name:act_request_link_form"
-msgid "Request Links"
-msgstr "Anfrageverknüpfungen"
-
 msgctxt "model:ir.action,name:act_user_config"
 msgid "Configure Users"
 msgstr "Benutzer konfigurieren"
@@ -804,14 +592,6 @@ msgctxt "model:ir.ui.menu,name:menu_group_form"
 msgid "Groups"
 msgstr "Gruppen"
 
-msgctxt "model:ir.ui.menu,name:menu_request_form"
-msgid "Requests"
-msgstr "Anfragen"
-
-msgctxt "model:ir.ui.menu,name:menu_request_link_form"
-msgid "Request Links"
-msgstr "Anfrageverknüpfungen"
-
 msgctxt "model:ir.ui.menu,name:menu_res"
 msgid "Users"
 msgstr "Benutzer"
@@ -832,26 +612,6 @@ msgctxt "model:res.group,name:group_admin"
 msgid "Administration"
 msgstr "Interne Administration"
 
-msgctxt "model:res.request,name:"
-msgid "Request"
-msgstr "Anfrage"
-
-msgctxt "model:res.request.history,name:"
-msgid "Request history"
-msgstr "Bisherige Anfragen"
-
-msgctxt "model:res.request.link,name:"
-msgid "Request link"
-msgstr "Anfrage Verknüpfung"
-
-msgctxt "model:res.request.link,name:request_link_cron"
-msgid "Scheduler"
-msgstr "Zeitplaner"
-
-msgctxt "model:res.request.reference,name:"
-msgid "Request Reference"
-msgstr "Anfrage Verweis"
-
 msgctxt "model:res.user,name:"
 msgid "User"
 msgstr "Benutzer"
@@ -884,62 +644,6 @@ msgctxt "model:res.user.warning,name:"
 msgid "User Warning"
 msgstr "Benutzer Warnung"
 
-msgctxt "selection:res.request,priority:"
-msgid "High"
-msgstr "Hoch"
-
-msgctxt "selection:res.request,priority:"
-msgid "Low"
-msgstr "Niedrig"
-
-msgctxt "selection:res.request,priority:"
-msgid "Normal"
-msgstr "Normal"
-
-msgctxt "selection:res.request,state:"
-msgid "Chatting"
-msgstr "Schreibt gerade..."
-
-msgctxt "selection:res.request,state:"
-msgid "Closed"
-msgstr "Geschlossen"
-
-msgctxt "selection:res.request,state:"
-msgid "Draft"
-msgstr "Entwurf"
-
-msgctxt "selection:res.request,state:"
-msgid "Waiting"
-msgstr "Wartend"
-
-msgctxt "selection:res.request.history,priority:"
-msgid "High"
-msgstr "Hoch"
-
-msgctxt "selection:res.request.history,priority:"
-msgid "Low"
-msgstr "Niedrig"
-
-msgctxt "selection:res.request.history,priority:"
-msgid "Normal"
-msgstr "Normal"
-
-msgctxt "selection:res.request.history,state:"
-msgid "Chatting"
-msgstr "Schreibt gerade..."
-
-msgctxt "selection:res.request.history,state:"
-msgid "Closed"
-msgstr "Geschlossen"
-
-msgctxt "selection:res.request.history,state:"
-msgid "Draft"
-msgstr "Entwurf"
-
-msgctxt "selection:res.request.history,state:"
-msgid "Waiting"
-msgstr "Wartend"
-
 msgctxt "view:ir.module.module:"
 msgid "Cancel Installation"
 msgstr "Vormerkung für Installation aufheben"
@@ -980,46 +684,6 @@ msgctxt "view:res.group:"
 msgid "Members"
 msgstr "Mitglieder"
 
-msgctxt "view:res.request.history:"
-msgid "Request History"
-msgstr "bisherige Anfragen"
-
-msgctxt "view:res.request.link:"
-msgid "Request Link"
-msgstr "Anfrage Verknüpfung"
-
-msgctxt "view:res.request.reference:"
-msgid "Request Reference"
-msgstr "Anfrageverweis"
-
-msgctxt "view:res.request.reference:"
-msgid "Request References"
-msgstr "Verweise"
-
-msgctxt "view:res.request:"
-msgid "Close"
-msgstr "Schließen"
-
-msgctxt "view:res.request:"
-msgid "References"
-msgstr "Verweise"
-
-msgctxt "view:res.request:"
-msgid "Reply"
-msgstr "Antworten"
-
-msgctxt "view:res.request:"
-msgid "Request"
-msgstr "Anfrage"
-
-msgctxt "view:res.request:"
-msgid "Requests"
-msgstr "Anfragen"
-
-msgctxt "view:res.request:"
-msgid "Send"
-msgstr "Senden"
-
 msgctxt "view:res.user.config.start:"
 msgid "Add Users"
 msgstr "Benutzer hinzufügen"
diff --git a/trytond/res/locale/es_AR.po b/trytond/res/locale/es_AR.po
index 458ff8c..55a354e 100644
--- a/trytond/res/locale/es_AR.po
+++ b/trytond/res/locale/es_AR.po
@@ -34,7 +34,7 @@ msgstr "Fecha creación"
 
 msgctxt "field:ir.action-res.group,create_uid:"
 msgid "Create User"
-msgstr "Creado por Usuario"
+msgstr "Usuario creación"
 
 msgctxt "field:ir.action-res.group,group:"
 msgid "Group"
@@ -54,7 +54,7 @@ msgstr "Fecha modificación"
 
 msgctxt "field:ir.action-res.group,write_uid:"
 msgid "Write User"
-msgstr "Modificado por Usuario"
+msgstr "Usuario modificación"
 
 msgctxt "field:ir.model.button-res.group,active:"
 msgid "Active"
@@ -70,7 +70,7 @@ msgstr "Fecha creación"
 
 msgctxt "field:ir.model.button-res.group,create_uid:"
 msgid "Create User"
-msgstr "Creado por Usuario"
+msgstr "Usuario creación"
 
 msgctxt "field:ir.model.button-res.group,group:"
 msgid "Group"
@@ -90,7 +90,7 @@ msgstr "Fecha modificación"
 
 msgctxt "field:ir.model.button-res.group,write_uid:"
 msgid "Write User"
-msgstr "Modificado por Usuario"
+msgstr "Usuario modificación"
 
 msgctxt "field:ir.model.field-res.group,create_date:"
 msgid "Create Date"
@@ -98,7 +98,7 @@ msgstr "Fecha creación"
 
 msgctxt "field:ir.model.field-res.group,create_uid:"
 msgid "Create User"
-msgstr "Creado por Usuario"
+msgstr "Usuario creación"
 
 msgctxt "field:ir.model.field-res.group,field:"
 msgid "Model Field"
@@ -122,7 +122,7 @@ msgstr "Fecha modificación"
 
 msgctxt "field:ir.model.field-res.group,write_uid:"
 msgid "Write User"
-msgstr "Modificado por Usuario"
+msgstr "Usuario modificación"
 
 msgctxt "field:ir.rule.group-res.group,create_date:"
 msgid "Create Date"
@@ -130,7 +130,7 @@ msgstr "Fecha creación"
 
 msgctxt "field:ir.rule.group-res.group,create_uid:"
 msgid "Create User"
-msgstr "Creado por Usuario"
+msgstr "Usuario creación"
 
 msgctxt "field:ir.rule.group-res.group,group:"
 msgid "Group"
@@ -154,7 +154,7 @@ msgstr "Fecha modificación"
 
 msgctxt "field:ir.rule.group-res.group,write_uid:"
 msgid "Write User"
-msgstr "Modificado por Usuario"
+msgstr "Usuario modificación"
 
 msgctxt "field:ir.rule.group-res.user,create_date:"
 msgid "Create Date"
@@ -162,7 +162,7 @@ msgstr "Fecha creación"
 
 msgctxt "field:ir.rule.group-res.user,create_uid:"
 msgid "Create User"
-msgstr "Creado por Usuario"
+msgstr "Usuario creación"
 
 msgctxt "field:ir.rule.group-res.user,id:"
 msgid "ID"
@@ -186,7 +186,7 @@ msgstr "Fecha modificación"
 
 msgctxt "field:ir.rule.group-res.user,write_uid:"
 msgid "Write User"
-msgstr "Modificado por Usuario"
+msgstr "Usuario modificación"
 
 msgctxt "field:ir.sequence,groups:"
 msgid "User Groups"
@@ -206,7 +206,7 @@ msgstr "Fecha creación"
 
 msgctxt "field:ir.sequence.type-res.group,create_uid:"
 msgid "Create User"
-msgstr "Creado por Usuario"
+msgstr "Usuario creación"
 
 msgctxt "field:ir.sequence.type-res.group,group:"
 msgid "User Groups"
@@ -230,7 +230,7 @@ msgstr "Fecha modificación"
 
 msgctxt "field:ir.sequence.type-res.group,write_uid:"
 msgid "Write User"
-msgstr "Modificado por Usuario"
+msgstr "Usuario modificación"
 
 msgctxt "field:ir.ui.menu-res.group,create_date:"
 msgid "Create Date"
@@ -238,7 +238,7 @@ msgstr "Fecha creación"
 
 msgctxt "field:ir.ui.menu-res.group,create_uid:"
 msgid "Create User"
-msgstr "Creado por Usuario"
+msgstr "Usuario creación"
 
 msgctxt "field:ir.ui.menu-res.group,group:"
 msgid "Group"
@@ -262,7 +262,7 @@ msgstr "Fecha modificación"
 
 msgctxt "field:ir.ui.menu-res.group,write_uid:"
 msgid "Write User"
-msgstr "Modificado por Usuario"
+msgstr "Usuario modificación"
 
 msgctxt "field:res.group,create_date:"
 msgid "Create Date"
@@ -270,7 +270,7 @@ msgstr "Fecha creación"
 
 msgctxt "field:res.group,create_uid:"
 msgid "Create User"
-msgstr "Creado por Usuario"
+msgstr "Usuario creación"
 
 msgctxt "field:res.group,field_access:"
 msgid "Access Field"
@@ -310,211 +310,7 @@ msgstr "Fecha modificación"
 
 msgctxt "field:res.group,write_uid:"
 msgid "Write User"
-msgstr "Modificado por Usuario"
-
-msgctxt "field:res.request,act_from:"
-msgid "From"
-msgstr "De"
-
-msgctxt "field:res.request,act_to:"
-msgid "To"
-msgstr "A"
-
-msgctxt "field:res.request,active:"
-msgid "Active"
-msgstr "Activo"
-
-msgctxt "field:res.request,body:"
-msgid "Body"
-msgstr "Cuerpo"
-
-msgctxt "field:res.request,create_date:"
-msgid "Create Date"
-msgstr "Fecha creación"
-
-msgctxt "field:res.request,create_uid:"
-msgid "Create User"
-msgstr "Creado por Usuario"
-
-msgctxt "field:res.request,date_sent:"
-msgid "Date"
-msgstr "Fecha"
-
-msgctxt "field:res.request,history:"
-msgid "History"
-msgstr "Histórico"
-
-msgctxt "field:res.request,id:"
-msgid "ID"
-msgstr "ID"
-
-msgctxt "field:res.request,name:"
-msgid "Subject"
-msgstr "Asunto"
-
-msgctxt "field:res.request,number_references:"
-msgid "Number of References"
-msgstr "Número de referencias"
-
-msgctxt "field:res.request,priority:"
-msgid "Priority"
-msgstr "Prioridad"
-
-msgctxt "field:res.request,rec_name:"
-msgid "Name"
-msgstr "Nombre"
-
-msgctxt "field:res.request,references:"
-msgid "References"
-msgstr "Referencias"
-
-msgctxt "field:res.request,state:"
-msgid "State"
-msgstr "Estado"
-
-msgctxt "field:res.request,trigger_date:"
-msgid "Trigger Date"
-msgstr "Fecha disparo"
-
-msgctxt "field:res.request,write_date:"
-msgid "Write Date"
-msgstr "Fecha modificación"
-
-msgctxt "field:res.request,write_uid:"
-msgid "Write User"
-msgstr "Modificado por Usuario"
-
-msgctxt "field:res.request.history,act_from:"
-msgid "From"
-msgstr "De"
-
-msgctxt "field:res.request.history,act_to:"
-msgid "To"
-msgstr "A"
-
-msgctxt "field:res.request.history,body:"
-msgid "Body"
-msgstr "Cuerpo"
-
-msgctxt "field:res.request.history,create_date:"
-msgid "Create Date"
-msgstr "Fecha creación"
-
-msgctxt "field:res.request.history,create_uid:"
-msgid "Create User"
-msgstr "Creado por Usuario"
-
-msgctxt "field:res.request.history,date_sent:"
-msgid "Date sent"
-msgstr "Fecha de envío"
-
-msgctxt "field:res.request.history,id:"
-msgid "ID"
-msgstr "ID"
-
-msgctxt "field:res.request.history,name:"
-msgid "Summary"
-msgstr "Resumen"
-
-msgctxt "field:res.request.history,number_references:"
-msgid "References"
-msgstr "Referencias"
-
-msgctxt "field:res.request.history,priority:"
-msgid "Priority"
-msgstr "Prioridad"
-
-msgctxt "field:res.request.history,rec_name:"
-msgid "Name"
-msgstr "Nombre"
-
-msgctxt "field:res.request.history,request:"
-msgid "Request"
-msgstr "Solicitud"
-
-msgctxt "field:res.request.history,state:"
-msgid "State"
-msgstr "Estado"
-
-msgctxt "field:res.request.history,subject:"
-msgid "Subject"
-msgstr "Asunto"
-
-msgctxt "field:res.request.history,write_date:"
-msgid "Write Date"
-msgstr "Fecha modificación"
-
-msgctxt "field:res.request.history,write_uid:"
-msgid "Write User"
-msgstr "Modificado por Usuario"
-
-msgctxt "field:res.request.link,create_date:"
-msgid "Create Date"
-msgstr "Fecha creación"
-
-msgctxt "field:res.request.link,create_uid:"
-msgid "Create User"
-msgstr "Creado por Usuario"
-
-msgctxt "field:res.request.link,id:"
-msgid "ID"
-msgstr "ID"
-
-msgctxt "field:res.request.link,model:"
-msgid "Model"
-msgstr "Modelo"
-
-msgctxt "field:res.request.link,name:"
-msgid "Name"
-msgstr "Nombre"
-
-msgctxt "field:res.request.link,priority:"
-msgid "Priority"
-msgstr "Prioridad"
-
-msgctxt "field:res.request.link,rec_name:"
-msgid "Name"
-msgstr "Nombre"
-
-msgctxt "field:res.request.link,write_date:"
-msgid "Write Date"
-msgstr "Fecha modificación"
-
-msgctxt "field:res.request.link,write_uid:"
-msgid "Write User"
-msgstr "Modificado por Usuario"
-
-msgctxt "field:res.request.reference,create_date:"
-msgid "Create Date"
-msgstr "Fecha creación"
-
-msgctxt "field:res.request.reference,create_uid:"
-msgid "Create User"
-msgstr "Creado por Usuario"
-
-msgctxt "field:res.request.reference,id:"
-msgid "ID"
-msgstr "ID"
-
-msgctxt "field:res.request.reference,rec_name:"
-msgid "Name"
-msgstr "Nombre"
-
-msgctxt "field:res.request.reference,reference:"
-msgid "Reference"
-msgstr "Referencia"
-
-msgctxt "field:res.request.reference,request:"
-msgid "Request"
-msgstr "Solicitud"
-
-msgctxt "field:res.request.reference,write_date:"
-msgid "Write Date"
-msgstr "Fecha modificación"
-
-msgctxt "field:res.request.reference,write_uid:"
-msgid "Write User"
-msgstr "Modificado por Usuario"
+msgstr "Usuario modificación"
 
 msgctxt "field:res.user,actions:"
 msgid "Actions"
@@ -530,7 +326,7 @@ msgstr "Fecha creación"
 
 msgctxt "field:res.user,create_uid:"
 msgid "Create User"
-msgstr "Creado por Usuario"
+msgstr "Usuario creación"
 
 msgctxt "field:res.user,email:"
 msgid "Email"
@@ -610,7 +406,7 @@ msgstr "Fecha modificación"
 
 msgctxt "field:res.user,write_uid:"
 msgid "Write User"
-msgstr "Modificado por Usuario"
+msgstr "Usuario modificación"
 
 msgctxt "field:res.user-ir.action,action:"
 msgid "Action"
@@ -622,7 +418,7 @@ msgstr "Fecha creación"
 
 msgctxt "field:res.user-ir.action,create_uid:"
 msgid "Create User"
-msgstr "Creado por Usuario"
+msgstr "Usuario creación"
 
 msgctxt "field:res.user-ir.action,id:"
 msgid "ID"
@@ -642,7 +438,7 @@ msgstr "Fecha modificación"
 
 msgctxt "field:res.user-ir.action,write_uid:"
 msgid "Write User"
-msgstr "Modificado por Usuario"
+msgstr "Usuario modificación"
 
 msgctxt "field:res.user-res.group,create_date:"
 msgid "Create Date"
@@ -650,7 +446,7 @@ msgstr "Fecha creación"
 
 msgctxt "field:res.user-res.group,create_uid:"
 msgid "Create User"
-msgstr "Creado por Usuario"
+msgstr "Usuario creación"
 
 msgctxt "field:res.user-res.group,group:"
 msgid "Group"
@@ -674,7 +470,7 @@ msgstr "Fecha modificación"
 
 msgctxt "field:res.user-res.group,write_uid:"
 msgid "Write User"
-msgstr "Modificado por Usuario"
+msgstr "Usuario modificación"
 
 msgctxt "field:res.user.config.start,id:"
 msgid "ID"
@@ -686,27 +482,27 @@ msgstr "Fecha creación"
 
 msgctxt "field:res.user.login.attempt,create_uid:"
 msgid "Create User"
-msgstr "Creado por Usuario"
+msgstr "Usuario creación"
 
 msgctxt "field:res.user.login.attempt,id:"
 msgid "ID"
 msgstr "ID"
 
+msgctxt "field:res.user.login.attempt,login:"
+msgid "Login"
+msgstr "Nombre de usuario"
+
 msgctxt "field:res.user.login.attempt,rec_name:"
 msgid "Name"
 msgstr "Nombre campo"
 
-msgctxt "field:res.user.login.attempt,user:"
-msgid "User"
-msgstr "Usuario"
-
 msgctxt "field:res.user.login.attempt,write_date:"
 msgid "Write Date"
 msgstr "Fecha modificación"
 
 msgctxt "field:res.user.login.attempt,write_uid:"
 msgid "Write User"
-msgstr "Modificado por Usuario"
+msgstr "Usuario modificación"
 
 msgctxt "field:res.user.warning,always:"
 msgid "Always"
@@ -718,7 +514,7 @@ msgstr "Fecha creación"
 
 msgctxt "field:res.user.warning,create_uid:"
 msgid "Create User"
-msgstr "Creado por Usuario"
+msgstr "Usuario creación"
 
 msgctxt "field:res.user.warning,id:"
 msgid "ID"
@@ -742,7 +538,7 @@ msgstr "Fecha modificación"
 
 msgctxt "field:res.user.warning,write_uid:"
 msgid "Write User"
-msgstr "Modificado por Usuario"
+msgstr "Usuario modificación"
 
 msgctxt "help:ir.sequence.type,groups:"
 msgid "Groups allowed to edit the sequences of this type"
@@ -756,14 +552,6 @@ msgctxt "model:ir.action,name:act_group_form"
 msgid "Groups"
 msgstr "Grupos"
 
-msgctxt "model:ir.action,name:act_request_form"
-msgid "Requests"
-msgstr "Solicitudes"
-
-msgctxt "model:ir.action,name:act_request_link_form"
-msgid "Request Links"
-msgstr "Enlaces a solicitudes"
-
 msgctxt "model:ir.action,name:act_user_config"
 msgid "Configure Users"
 msgstr "Configurar Usuarios"
@@ -804,14 +592,6 @@ msgctxt "model:ir.ui.menu,name:menu_group_form"
 msgid "Groups"
 msgstr "Grupos"
 
-msgctxt "model:ir.ui.menu,name:menu_request_form"
-msgid "Requests"
-msgstr "Solicitudes"
-
-msgctxt "model:ir.ui.menu,name:menu_request_link_form"
-msgid "Request Links"
-msgstr "Enlaces a solicitudes"
-
 msgctxt "model:ir.ui.menu,name:menu_res"
 msgid "Users"
 msgstr "Usuarios"
@@ -832,26 +612,6 @@ msgctxt "model:res.group,name:group_admin"
 msgid "Administration"
 msgstr "Administración"
 
-msgctxt "model:res.request,name:"
-msgid "Request"
-msgstr "Solicitud"
-
-msgctxt "model:res.request.history,name:"
-msgid "Request history"
-msgstr "Histórico de solicitudes"
-
-msgctxt "model:res.request.link,name:"
-msgid "Request link"
-msgstr "Enlace a solicitud"
-
-msgctxt "model:res.request.link,name:request_link_cron"
-msgid "Scheduler"
-msgstr "Programador de tareas"
-
-msgctxt "model:res.request.reference,name:"
-msgid "Request Reference"
-msgstr "Referencia de la solicitud"
-
 msgctxt "model:res.user,name:"
 msgid "User"
 msgstr "Usuario"
@@ -884,62 +644,6 @@ msgctxt "model:res.user.warning,name:"
 msgid "User Warning"
 msgstr "Aviso al usuario"
 
-msgctxt "selection:res.request,priority:"
-msgid "High"
-msgstr "Alta"
-
-msgctxt "selection:res.request,priority:"
-msgid "Low"
-msgstr "Baja"
-
-msgctxt "selection:res.request,priority:"
-msgid "Normal"
-msgstr "Normal"
-
-msgctxt "selection:res.request,state:"
-msgid "Chatting"
-msgstr "En discusión"
-
-msgctxt "selection:res.request,state:"
-msgid "Closed"
-msgstr "Cerrada"
-
-msgctxt "selection:res.request,state:"
-msgid "Draft"
-msgstr "Borrador"
-
-msgctxt "selection:res.request,state:"
-msgid "Waiting"
-msgstr "En espera"
-
-msgctxt "selection:res.request.history,priority:"
-msgid "High"
-msgstr "Alta"
-
-msgctxt "selection:res.request.history,priority:"
-msgid "Low"
-msgstr "Baja"
-
-msgctxt "selection:res.request.history,priority:"
-msgid "Normal"
-msgstr "Normal"
-
-msgctxt "selection:res.request.history,state:"
-msgid "Chatting"
-msgstr "En discusión"
-
-msgctxt "selection:res.request.history,state:"
-msgid "Closed"
-msgstr "Cerrada"
-
-msgctxt "selection:res.request.history,state:"
-msgid "Draft"
-msgstr "Borrador"
-
-msgctxt "selection:res.request.history,state:"
-msgid "Waiting"
-msgstr "En espera"
-
 msgctxt "view:ir.module.module:"
 msgid "Cancel Installation"
 msgstr "Cancelar instalación"
@@ -980,46 +684,6 @@ msgctxt "view:res.group:"
 msgid "Members"
 msgstr "Miembros"
 
-msgctxt "view:res.request.history:"
-msgid "Request History"
-msgstr "Histórico de solicitudes"
-
-msgctxt "view:res.request.link:"
-msgid "Request Link"
-msgstr "Enlace a solicitud"
-
-msgctxt "view:res.request.reference:"
-msgid "Request Reference"
-msgstr "Referencia de la solicitud"
-
-msgctxt "view:res.request.reference:"
-msgid "Request References"
-msgstr "Referencias de la solicitud"
-
-msgctxt "view:res.request:"
-msgid "Close"
-msgstr "Cerrar"
-
-msgctxt "view:res.request:"
-msgid "References"
-msgstr "Referencias"
-
-msgctxt "view:res.request:"
-msgid "Reply"
-msgstr "Responder"
-
-msgctxt "view:res.request:"
-msgid "Request"
-msgstr "Solicitud"
-
-msgctxt "view:res.request:"
-msgid "Requests"
-msgstr "Solicitudes"
-
-msgctxt "view:res.request:"
-msgid "Send"
-msgstr "Enviar"
-
 msgctxt "view:res.user.config.start:"
 msgid "Add Users"
 msgstr "Agregar Usuarios"
diff --git a/trytond/res/locale/es_CO.po b/trytond/res/locale/es_CO.po
index af9f09e..3eb1929 100644
--- a/trytond/res/locale/es_CO.po
+++ b/trytond/res/locale/es_CO.po
@@ -312,210 +312,6 @@ msgctxt "field:res.group,write_uid:"
 msgid "Write User"
 msgstr "Modificado por Usuario"
 
-msgctxt "field:res.request,act_from:"
-msgid "From"
-msgstr "De"
-
-msgctxt "field:res.request,act_to:"
-msgid "To"
-msgstr "A"
-
-msgctxt "field:res.request,active:"
-msgid "Active"
-msgstr "Activo"
-
-msgctxt "field:res.request,body:"
-msgid "Body"
-msgstr "Cuerpo"
-
-msgctxt "field:res.request,create_date:"
-msgid "Create Date"
-msgstr "Fecha de Creación"
-
-msgctxt "field:res.request,create_uid:"
-msgid "Create User"
-msgstr "Creado por Usuario"
-
-msgctxt "field:res.request,date_sent:"
-msgid "Date"
-msgstr "Fecha"
-
-msgctxt "field:res.request,history:"
-msgid "History"
-msgstr "Histórico"
-
-msgctxt "field:res.request,id:"
-msgid "ID"
-msgstr "ID"
-
-msgctxt "field:res.request,name:"
-msgid "Subject"
-msgstr "Asunto"
-
-msgctxt "field:res.request,number_references:"
-msgid "Number of References"
-msgstr "Número de referencias"
-
-msgctxt "field:res.request,priority:"
-msgid "Priority"
-msgstr "Prioridad"
-
-msgctxt "field:res.request,rec_name:"
-msgid "Name"
-msgstr "Nombre"
-
-msgctxt "field:res.request,references:"
-msgid "References"
-msgstr "Referencias"
-
-msgctxt "field:res.request,state:"
-msgid "State"
-msgstr "Estado"
-
-msgctxt "field:res.request,trigger_date:"
-msgid "Trigger Date"
-msgstr "Fecha del Disparador"
-
-msgctxt "field:res.request,write_date:"
-msgid "Write Date"
-msgstr "Fecha de Modificación"
-
-msgctxt "field:res.request,write_uid:"
-msgid "Write User"
-msgstr "Modificado por Usuario"
-
-msgctxt "field:res.request.history,act_from:"
-msgid "From"
-msgstr "De"
-
-msgctxt "field:res.request.history,act_to:"
-msgid "To"
-msgstr "A"
-
-msgctxt "field:res.request.history,body:"
-msgid "Body"
-msgstr "Cuerpo"
-
-msgctxt "field:res.request.history,create_date:"
-msgid "Create Date"
-msgstr "Fecha de Creación"
-
-msgctxt "field:res.request.history,create_uid:"
-msgid "Create User"
-msgstr "Creado por Usuario"
-
-msgctxt "field:res.request.history,date_sent:"
-msgid "Date sent"
-msgstr "Fecha de envío"
-
-msgctxt "field:res.request.history,id:"
-msgid "ID"
-msgstr "ID"
-
-msgctxt "field:res.request.history,name:"
-msgid "Summary"
-msgstr "Resumen"
-
-msgctxt "field:res.request.history,number_references:"
-msgid "References"
-msgstr "Referencias"
-
-msgctxt "field:res.request.history,priority:"
-msgid "Priority"
-msgstr "Prioridad"
-
-msgctxt "field:res.request.history,rec_name:"
-msgid "Name"
-msgstr "Nombre"
-
-msgctxt "field:res.request.history,request:"
-msgid "Request"
-msgstr "Solicitud"
-
-msgctxt "field:res.request.history,state:"
-msgid "State"
-msgstr "Estado"
-
-msgctxt "field:res.request.history,subject:"
-msgid "Subject"
-msgstr "Asunto"
-
-msgctxt "field:res.request.history,write_date:"
-msgid "Write Date"
-msgstr "Fecha de Modificación"
-
-msgctxt "field:res.request.history,write_uid:"
-msgid "Write User"
-msgstr "Modificado por Usuario"
-
-msgctxt "field:res.request.link,create_date:"
-msgid "Create Date"
-msgstr "Fecha de Creación"
-
-msgctxt "field:res.request.link,create_uid:"
-msgid "Create User"
-msgstr "Creado por Usuario"
-
-msgctxt "field:res.request.link,id:"
-msgid "ID"
-msgstr "ID"
-
-msgctxt "field:res.request.link,model:"
-msgid "Model"
-msgstr "Modelo"
-
-msgctxt "field:res.request.link,name:"
-msgid "Name"
-msgstr "Nombre"
-
-msgctxt "field:res.request.link,priority:"
-msgid "Priority"
-msgstr "Prioridad"
-
-msgctxt "field:res.request.link,rec_name:"
-msgid "Name"
-msgstr "Nombre"
-
-msgctxt "field:res.request.link,write_date:"
-msgid "Write Date"
-msgstr "Fecha de Modificación"
-
-msgctxt "field:res.request.link,write_uid:"
-msgid "Write User"
-msgstr "Modificado por Usuario"
-
-msgctxt "field:res.request.reference,create_date:"
-msgid "Create Date"
-msgstr "Fecha de Creación"
-
-msgctxt "field:res.request.reference,create_uid:"
-msgid "Create User"
-msgstr "Creado por Usuario"
-
-msgctxt "field:res.request.reference,id:"
-msgid "ID"
-msgstr "ID"
-
-msgctxt "field:res.request.reference,rec_name:"
-msgid "Name"
-msgstr "Nombre"
-
-msgctxt "field:res.request.reference,reference:"
-msgid "Reference"
-msgstr "Referencia"
-
-msgctxt "field:res.request.reference,request:"
-msgid "Request"
-msgstr "Solicitud"
-
-msgctxt "field:res.request.reference,write_date:"
-msgid "Write Date"
-msgstr "Fecha de Modificación"
-
-msgctxt "field:res.request.reference,write_uid:"
-msgid "Write User"
-msgstr "Modificado por Usuario"
-
 msgctxt "field:res.user,actions:"
 msgid "Actions"
 msgstr "Acciones"
@@ -550,7 +346,7 @@ msgstr "Idioma"
 
 msgctxt "field:res.user,language_direction:"
 msgid "Language Direction"
-msgstr "Dirección del idioma"
+msgstr "Dirección del Idioma"
 
 msgctxt "field:res.user,login:"
 msgid "Login"
@@ -692,14 +488,14 @@ msgctxt "field:res.user.login.attempt,id:"
 msgid "ID"
 msgstr "ID"
 
+msgctxt "field:res.user.login.attempt,login:"
+msgid "Login"
+msgstr "Nombre de usuario"
+
 msgctxt "field:res.user.login.attempt,rec_name:"
 msgid "Name"
 msgstr "Nombre del campo"
 
-msgctxt "field:res.user.login.attempt,user:"
-msgid "User"
-msgstr "Usuario"
-
 msgctxt "field:res.user.login.attempt,write_date:"
 msgid "Write Date"
 msgstr "Fecha de Modificación"
@@ -756,14 +552,6 @@ msgctxt "model:ir.action,name:act_group_form"
 msgid "Groups"
 msgstr "Grupos"
 
-msgctxt "model:ir.action,name:act_request_form"
-msgid "Requests"
-msgstr "Solicitudes"
-
-msgctxt "model:ir.action,name:act_request_link_form"
-msgid "Request Links"
-msgstr "Enlaces de Solicitudes"
-
 msgctxt "model:ir.action,name:act_user_config"
 msgid "Configure Users"
 msgstr "Configurar Usuarios"
@@ -804,14 +592,6 @@ msgctxt "model:ir.ui.menu,name:menu_group_form"
 msgid "Groups"
 msgstr "Grupos"
 
-msgctxt "model:ir.ui.menu,name:menu_request_form"
-msgid "Requests"
-msgstr "Solicitudes"
-
-msgctxt "model:ir.ui.menu,name:menu_request_link_form"
-msgid "Request Links"
-msgstr "Enlaces de Solicitudes"
-
 msgctxt "model:ir.ui.menu,name:menu_res"
 msgid "Users"
 msgstr "Usuarios"
@@ -832,26 +612,6 @@ msgctxt "model:res.group,name:group_admin"
 msgid "Administration"
 msgstr "Administración"
 
-msgctxt "model:res.request,name:"
-msgid "Request"
-msgstr "Solicitud"
-
-msgctxt "model:res.request.history,name:"
-msgid "Request history"
-msgstr "Histórico de solicitudes"
-
-msgctxt "model:res.request.link,name:"
-msgid "Request link"
-msgstr "Enlaces de Solicitud"
-
-msgctxt "model:res.request.link,name:request_link_cron"
-msgid "Scheduler"
-msgstr "Programador de tareas"
-
-msgctxt "model:res.request.reference,name:"
-msgid "Request Reference"
-msgstr "Referencia de la solicitud"
-
 msgctxt "model:res.user,name:"
 msgid "User"
 msgstr "Usuario"
@@ -884,62 +644,6 @@ msgctxt "model:res.user.warning,name:"
 msgid "User Warning"
 msgstr "Aviso al usuario"
 
-msgctxt "selection:res.request,priority:"
-msgid "High"
-msgstr "Alta"
-
-msgctxt "selection:res.request,priority:"
-msgid "Low"
-msgstr "Baja"
-
-msgctxt "selection:res.request,priority:"
-msgid "Normal"
-msgstr "Normal"
-
-msgctxt "selection:res.request,state:"
-msgid "Chatting"
-msgstr "En discusión"
-
-msgctxt "selection:res.request,state:"
-msgid "Closed"
-msgstr "Cerrada"
-
-msgctxt "selection:res.request,state:"
-msgid "Draft"
-msgstr "Borrador"
-
-msgctxt "selection:res.request,state:"
-msgid "Waiting"
-msgstr "En espera"
-
-msgctxt "selection:res.request.history,priority:"
-msgid "High"
-msgstr "Alta"
-
-msgctxt "selection:res.request.history,priority:"
-msgid "Low"
-msgstr "Baja"
-
-msgctxt "selection:res.request.history,priority:"
-msgid "Normal"
-msgstr "Normal"
-
-msgctxt "selection:res.request.history,state:"
-msgid "Chatting"
-msgstr "En discusión"
-
-msgctxt "selection:res.request.history,state:"
-msgid "Closed"
-msgstr "Cerrada"
-
-msgctxt "selection:res.request.history,state:"
-msgid "Draft"
-msgstr "Borrador"
-
-msgctxt "selection:res.request.history,state:"
-msgid "Waiting"
-msgstr "En espera"
-
 msgctxt "view:ir.module.module:"
 msgid "Cancel Installation"
 msgstr "Cancelar instalación"
@@ -980,46 +684,6 @@ msgctxt "view:res.group:"
 msgid "Members"
 msgstr "Miembros"
 
-msgctxt "view:res.request.history:"
-msgid "Request History"
-msgstr "Histórico de solicitudes"
-
-msgctxt "view:res.request.link:"
-msgid "Request Link"
-msgstr "Enlaces de Solicitud"
-
-msgctxt "view:res.request.reference:"
-msgid "Request Reference"
-msgstr "Referencia de la solicitud"
-
-msgctxt "view:res.request.reference:"
-msgid "Request References"
-msgstr "Referencias de la solicitud"
-
-msgctxt "view:res.request:"
-msgid "Close"
-msgstr "Cerrar"
-
-msgctxt "view:res.request:"
-msgid "References"
-msgstr "Referencias"
-
-msgctxt "view:res.request:"
-msgid "Reply"
-msgstr "Responder"
-
-msgctxt "view:res.request:"
-msgid "Request"
-msgstr "Solicitud"
-
-msgctxt "view:res.request:"
-msgid "Requests"
-msgstr "Solicitudes"
-
-msgctxt "view:res.request:"
-msgid "Send"
-msgstr "Enviar"
-
 msgctxt "view:res.user.config.start:"
 msgid "Add Users"
 msgstr "Agregar Usuarios"
diff --git a/trytond/res/locale/es_ES.po b/trytond/res/locale/es_ES.po
index 29594b1..3abb1f4 100644
--- a/trytond/res/locale/es_ES.po
+++ b/trytond/res/locale/es_ES.po
@@ -22,7 +22,7 @@ msgid ""
 msgstr ""
 "No puede eliminar el usuario del sistema\n"
 "que se usa para recursos del sistema\n"
-"(actualizaciones, instalaciones,...)"
+"(actualizaciones, instalaciones, ...)."
 
 msgctxt "field:ir.action-res.group,action:"
 msgid "Action"
@@ -312,210 +312,6 @@ msgctxt "field:res.group,write_uid:"
 msgid "Write User"
 msgstr "Usuario modificación"
 
-msgctxt "field:res.request,act_from:"
-msgid "From"
-msgstr "Desde"
-
-msgctxt "field:res.request,act_to:"
-msgid "To"
-msgstr "Para"
-
-msgctxt "field:res.request,active:"
-msgid "Active"
-msgstr "Activo"
-
-msgctxt "field:res.request,body:"
-msgid "Body"
-msgstr "Mensaje"
-
-msgctxt "field:res.request,create_date:"
-msgid "Create Date"
-msgstr "Fecha creación"
-
-msgctxt "field:res.request,create_uid:"
-msgid "Create User"
-msgstr "Usuario creación"
-
-msgctxt "field:res.request,date_sent:"
-msgid "Date"
-msgstr "Fecha"
-
-msgctxt "field:res.request,history:"
-msgid "History"
-msgstr "Historial"
-
-msgctxt "field:res.request,id:"
-msgid "ID"
-msgstr "ID"
-
-msgctxt "field:res.request,name:"
-msgid "Subject"
-msgstr "Asunto"
-
-msgctxt "field:res.request,number_references:"
-msgid "Number of References"
-msgstr "Número de referencias"
-
-msgctxt "field:res.request,priority:"
-msgid "Priority"
-msgstr "Prioridad"
-
-msgctxt "field:res.request,rec_name:"
-msgid "Name"
-msgstr "Nombre"
-
-msgctxt "field:res.request,references:"
-msgid "References"
-msgstr "Referencias"
-
-msgctxt "field:res.request,state:"
-msgid "State"
-msgstr "Estado"
-
-msgctxt "field:res.request,trigger_date:"
-msgid "Trigger Date"
-msgstr "Fecha disparo"
-
-msgctxt "field:res.request,write_date:"
-msgid "Write Date"
-msgstr "Fecha modificación"
-
-msgctxt "field:res.request,write_uid:"
-msgid "Write User"
-msgstr "Usuario modificación"
-
-msgctxt "field:res.request.history,act_from:"
-msgid "From"
-msgstr "Desde"
-
-msgctxt "field:res.request.history,act_to:"
-msgid "To"
-msgstr "Para"
-
-msgctxt "field:res.request.history,body:"
-msgid "Body"
-msgstr "Mensaje"
-
-msgctxt "field:res.request.history,create_date:"
-msgid "Create Date"
-msgstr "Fecha creación"
-
-msgctxt "field:res.request.history,create_uid:"
-msgid "Create User"
-msgstr "Usuario creación"
-
-msgctxt "field:res.request.history,date_sent:"
-msgid "Date sent"
-msgstr "Fecha de envío"
-
-msgctxt "field:res.request.history,id:"
-msgid "ID"
-msgstr "ID"
-
-msgctxt "field:res.request.history,name:"
-msgid "Summary"
-msgstr "Resumen"
-
-msgctxt "field:res.request.history,number_references:"
-msgid "References"
-msgstr "Referencias"
-
-msgctxt "field:res.request.history,priority:"
-msgid "Priority"
-msgstr "Prioridad"
-
-msgctxt "field:res.request.history,rec_name:"
-msgid "Name"
-msgstr "Nombre"
-
-msgctxt "field:res.request.history,request:"
-msgid "Request"
-msgstr "Solicitud"
-
-msgctxt "field:res.request.history,state:"
-msgid "State"
-msgstr "Estado"
-
-msgctxt "field:res.request.history,subject:"
-msgid "Subject"
-msgstr "Asunto"
-
-msgctxt "field:res.request.history,write_date:"
-msgid "Write Date"
-msgstr "Fecha modificación"
-
-msgctxt "field:res.request.history,write_uid:"
-msgid "Write User"
-msgstr "Usuario modificación"
-
-msgctxt "field:res.request.link,create_date:"
-msgid "Create Date"
-msgstr "Fecha creación"
-
-msgctxt "field:res.request.link,create_uid:"
-msgid "Create User"
-msgstr "Usuario creación"
-
-msgctxt "field:res.request.link,id:"
-msgid "ID"
-msgstr "ID"
-
-msgctxt "field:res.request.link,model:"
-msgid "Model"
-msgstr "Modelo"
-
-msgctxt "field:res.request.link,name:"
-msgid "Name"
-msgstr "Nombre"
-
-msgctxt "field:res.request.link,priority:"
-msgid "Priority"
-msgstr "Prioridad"
-
-msgctxt "field:res.request.link,rec_name:"
-msgid "Name"
-msgstr "Nombre"
-
-msgctxt "field:res.request.link,write_date:"
-msgid "Write Date"
-msgstr "Fecha modificación"
-
-msgctxt "field:res.request.link,write_uid:"
-msgid "Write User"
-msgstr "Usuario modificación"
-
-msgctxt "field:res.request.reference,create_date:"
-msgid "Create Date"
-msgstr "Fecha creación"
-
-msgctxt "field:res.request.reference,create_uid:"
-msgid "Create User"
-msgstr "Usuario creación"
-
-msgctxt "field:res.request.reference,id:"
-msgid "ID"
-msgstr "ID"
-
-msgctxt "field:res.request.reference,rec_name:"
-msgid "Name"
-msgstr "Nombre"
-
-msgctxt "field:res.request.reference,reference:"
-msgid "Reference"
-msgstr "Referencia"
-
-msgctxt "field:res.request.reference,request:"
-msgid "Request"
-msgstr "Solicitud"
-
-msgctxt "field:res.request.reference,write_date:"
-msgid "Write Date"
-msgstr "Fecha modificación"
-
-msgctxt "field:res.request.reference,write_uid:"
-msgid "Write User"
-msgstr "Usuario modificación"
-
 msgctxt "field:res.user,actions:"
 msgid "Actions"
 msgstr "Acciones"
@@ -692,14 +488,14 @@ msgctxt "field:res.user.login.attempt,id:"
 msgid "ID"
 msgstr "ID"
 
+msgctxt "field:res.user.login.attempt,login:"
+msgid "Login"
+msgstr "Nombre de usuario"
+
 msgctxt "field:res.user.login.attempt,rec_name:"
 msgid "Name"
 msgstr "Nombre"
 
-msgctxt "field:res.user.login.attempt,user:"
-msgid "User"
-msgstr "Usuario"
-
 msgctxt "field:res.user.login.attempt,write_date:"
 msgid "Write Date"
 msgstr "Fecha modificación"
@@ -756,14 +552,6 @@ msgctxt "model:ir.action,name:act_group_form"
 msgid "Groups"
 msgstr "Grupos"
 
-msgctxt "model:ir.action,name:act_request_form"
-msgid "Requests"
-msgstr "Solicitudes"
-
-msgctxt "model:ir.action,name:act_request_link_form"
-msgid "Request Links"
-msgstr "Enlaces a modelos"
-
 msgctxt "model:ir.action,name:act_user_config"
 msgid "Configure Users"
 msgstr "Configuración usuarios"
@@ -804,14 +592,6 @@ msgctxt "model:ir.ui.menu,name:menu_group_form"
 msgid "Groups"
 msgstr "Grupos"
 
-msgctxt "model:ir.ui.menu,name:menu_request_form"
-msgid "Requests"
-msgstr "Solicitudes"
-
-msgctxt "model:ir.ui.menu,name:menu_request_link_form"
-msgid "Request Links"
-msgstr "Enlaces a modelos"
-
 msgctxt "model:ir.ui.menu,name:menu_res"
 msgid "Users"
 msgstr "Usuarios"
@@ -832,26 +612,6 @@ msgctxt "model:res.group,name:group_admin"
 msgid "Administration"
 msgstr "Administración"
 
-msgctxt "model:res.request,name:"
-msgid "Request"
-msgstr "Solicitud"
-
-msgctxt "model:res.request.history,name:"
-msgid "Request history"
-msgstr "Historial de solicitudes"
-
-msgctxt "model:res.request.link,name:"
-msgid "Request link"
-msgstr "Enlace a modelos"
-
-msgctxt "model:res.request.link,name:request_link_cron"
-msgid "Scheduler"
-msgstr "Planificador"
-
-msgctxt "model:res.request.reference,name:"
-msgid "Request Reference"
-msgstr "Referencia de la solicitud"
-
 msgctxt "model:res.user,name:"
 msgid "User"
 msgstr "Usuario"
@@ -884,62 +644,6 @@ msgctxt "model:res.user.warning,name:"
 msgid "User Warning"
 msgstr "Aviso usuario"
 
-msgctxt "selection:res.request,priority:"
-msgid "High"
-msgstr "Alta"
-
-msgctxt "selection:res.request,priority:"
-msgid "Low"
-msgstr "Baja"
-
-msgctxt "selection:res.request,priority:"
-msgid "Normal"
-msgstr "Normal"
-
-msgctxt "selection:res.request,state:"
-msgid "Chatting"
-msgstr "En discusión"
-
-msgctxt "selection:res.request,state:"
-msgid "Closed"
-msgstr "Cerrada"
-
-msgctxt "selection:res.request,state:"
-msgid "Draft"
-msgstr "Borrador"
-
-msgctxt "selection:res.request,state:"
-msgid "Waiting"
-msgstr "En espera"
-
-msgctxt "selection:res.request.history,priority:"
-msgid "High"
-msgstr "Alta"
-
-msgctxt "selection:res.request.history,priority:"
-msgid "Low"
-msgstr "Baja"
-
-msgctxt "selection:res.request.history,priority:"
-msgid "Normal"
-msgstr "Normal"
-
-msgctxt "selection:res.request.history,state:"
-msgid "Chatting"
-msgstr "En discusión"
-
-msgctxt "selection:res.request.history,state:"
-msgid "Closed"
-msgstr "Cerrada"
-
-msgctxt "selection:res.request.history,state:"
-msgid "Draft"
-msgstr "Borrador"
-
-msgctxt "selection:res.request.history,state:"
-msgid "Waiting"
-msgstr "En espera"
-
 msgctxt "view:ir.module.module:"
 msgid "Cancel Installation"
 msgstr "Cancelar instalación"
@@ -980,46 +684,6 @@ msgctxt "view:res.group:"
 msgid "Members"
 msgstr "Miembros"
 
-msgctxt "view:res.request.history:"
-msgid "Request History"
-msgstr "Historial de solicitudes"
-
-msgctxt "view:res.request.link:"
-msgid "Request Link"
-msgstr "Enlace a modelos"
-
-msgctxt "view:res.request.reference:"
-msgid "Request Reference"
-msgstr "Referencia de la solicitud"
-
-msgctxt "view:res.request.reference:"
-msgid "Request References"
-msgstr "Referencias de la solicitud"
-
-msgctxt "view:res.request:"
-msgid "Close"
-msgstr "Cerrar"
-
-msgctxt "view:res.request:"
-msgid "References"
-msgstr "Referencias"
-
-msgctxt "view:res.request:"
-msgid "Reply"
-msgstr "Responder"
-
-msgctxt "view:res.request:"
-msgid "Request"
-msgstr "Solicitud"
-
-msgctxt "view:res.request:"
-msgid "Requests"
-msgstr "Solicitudes"
-
-msgctxt "view:res.request:"
-msgid "Send"
-msgstr "Enviar"
-
 msgctxt "view:res.user.config.start:"
 msgid "Add Users"
 msgstr "Añadir usuarios"
diff --git a/trytond/res/locale/fr_FR.po b/trytond/res/locale/fr_FR.po
index 73a1364..31bc64b 100644
--- a/trytond/res/locale/fr_FR.po
+++ b/trytond/res/locale/fr_FR.po
@@ -6,35 +6,13 @@ msgctxt "error:res.group:"
 msgid "The name of the group must be unique!"
 msgstr "Le nom du groupe doit être unique !"
 
-msgctxt "error:res.group:"
-msgid "The name of the group must be unique!"
-msgstr "Le nom du groupe doit être unique !"
-
-msgctxt "error:res.user:"
-msgid "Wrong password!"
-msgstr "Mauvais mot de passe !"
-
 msgctxt "error:res.user:"
 msgid "Wrong password!"
 msgstr "Mauvais mot de passe !"
 
 msgctxt "error:res.user:"
 msgid "You can not have two users with the same login!"
-msgstr "Vous ne pouvez pas créer deux utilisateur avec le même nom !"
-
-msgctxt "error:res.user:"
-msgid "You can not have two users with the same login!"
-msgstr "Vous ne pouvez pas créer deux utilisateur avec le même nom !"
-
-msgctxt "error:res.user:"
-msgid ""
-"You can not remove the root user\n"
-"as it is used internally for resources\n"
-"created by the system (updates, module installation, ...)"
-msgstr ""
-"Vous ne pouvez pas supprimer l'utilisateur racine\n"
-"puisqu'il est utilisé en interne pour créer\n"
-"des ressources par le système (mise-à-jour, installation de module, ...)"
+msgstr "Vous ne pouvez pas créer deux utilisateur avec le même identifiant !"
 
 msgctxt "error:res.user:"
 msgid ""
@@ -124,7 +102,7 @@ msgstr "Créé par"
 
 msgctxt "field:ir.model.field-res.group,field:"
 msgid "Model Field"
-msgstr "Champ du modèle"
+msgstr "Champ de modèle"
 
 msgctxt "field:ir.model.field-res.group,group:"
 msgid "Group"
@@ -308,7 +286,7 @@ msgstr "Accès aux menus"
 
 msgctxt "field:res.group,model_access:"
 msgid "Access Model"
-msgstr "Accès aux modèles"
+msgstr "Accès au modèle"
 
 msgctxt "field:res.group,name:"
 msgid "Name"
@@ -334,210 +312,6 @@ msgctxt "field:res.group,write_uid:"
 msgid "Write User"
 msgstr "Mis à jour par"
 
-msgctxt "field:res.request,act_from:"
-msgid "From"
-msgstr "De"
-
-msgctxt "field:res.request,act_to:"
-msgid "To"
-msgstr "À"
-
-msgctxt "field:res.request,active:"
-msgid "Active"
-msgstr "Actif"
-
-msgctxt "field:res.request,body:"
-msgid "Body"
-msgstr "Demande"
-
-msgctxt "field:res.request,create_date:"
-msgid "Create Date"
-msgstr "Date de création"
-
-msgctxt "field:res.request,create_uid:"
-msgid "Create User"
-msgstr "Créé par"
-
-msgctxt "field:res.request,date_sent:"
-msgid "Date"
-msgstr "Date"
-
-msgctxt "field:res.request,history:"
-msgid "History"
-msgstr "Historique"
-
-msgctxt "field:res.request,id:"
-msgid "ID"
-msgstr "ID"
-
-msgctxt "field:res.request,name:"
-msgid "Subject"
-msgstr "Sujet"
-
-msgctxt "field:res.request,number_references:"
-msgid "Number of References"
-msgstr "Nombre de référence"
-
-msgctxt "field:res.request,priority:"
-msgid "Priority"
-msgstr "Priorité"
-
-msgctxt "field:res.request,rec_name:"
-msgid "Name"
-msgstr "Nom"
-
-msgctxt "field:res.request,references:"
-msgid "References"
-msgstr "Références"
-
-msgctxt "field:res.request,state:"
-msgid "State"
-msgstr "État"
-
-msgctxt "field:res.request,trigger_date:"
-msgid "Trigger Date"
-msgstr "Date de déclenchement"
-
-msgctxt "field:res.request,write_date:"
-msgid "Write Date"
-msgstr "Date de mise à jour"
-
-msgctxt "field:res.request,write_uid:"
-msgid "Write User"
-msgstr "Mis à jour par"
-
-msgctxt "field:res.request.history,act_from:"
-msgid "From"
-msgstr "De"
-
-msgctxt "field:res.request.history,act_to:"
-msgid "To"
-msgstr "À"
-
-msgctxt "field:res.request.history,body:"
-msgid "Body"
-msgstr "Corps"
-
-msgctxt "field:res.request.history,create_date:"
-msgid "Create Date"
-msgstr "Date de création"
-
-msgctxt "field:res.request.history,create_uid:"
-msgid "Create User"
-msgstr "Créé par"
-
-msgctxt "field:res.request.history,date_sent:"
-msgid "Date sent"
-msgstr "Date d'envoi"
-
-msgctxt "field:res.request.history,id:"
-msgid "ID"
-msgstr "ID"
-
-msgctxt "field:res.request.history,name:"
-msgid "Summary"
-msgstr "Résumé"
-
-msgctxt "field:res.request.history,number_references:"
-msgid "References"
-msgstr "Références"
-
-msgctxt "field:res.request.history,priority:"
-msgid "Priority"
-msgstr "Priorité"
-
-msgctxt "field:res.request.history,rec_name:"
-msgid "Name"
-msgstr "Nom"
-
-msgctxt "field:res.request.history,request:"
-msgid "Request"
-msgstr "Demande"
-
-msgctxt "field:res.request.history,state:"
-msgid "State"
-msgstr "État"
-
-msgctxt "field:res.request.history,subject:"
-msgid "Subject"
-msgstr "Sujet"
-
-msgctxt "field:res.request.history,write_date:"
-msgid "Write Date"
-msgstr "Date de mise à jour"
-
-msgctxt "field:res.request.history,write_uid:"
-msgid "Write User"
-msgstr "Mis à jour par"
-
-msgctxt "field:res.request.link,create_date:"
-msgid "Create Date"
-msgstr "Date de création"
-
-msgctxt "field:res.request.link,create_uid:"
-msgid "Create User"
-msgstr "Créé par"
-
-msgctxt "field:res.request.link,id:"
-msgid "ID"
-msgstr "ID"
-
-msgctxt "field:res.request.link,model:"
-msgid "Model"
-msgstr "Modèle"
-
-msgctxt "field:res.request.link,name:"
-msgid "Name"
-msgstr "Nom"
-
-msgctxt "field:res.request.link,priority:"
-msgid "Priority"
-msgstr "Priorité"
-
-msgctxt "field:res.request.link,rec_name:"
-msgid "Name"
-msgstr "Nom"
-
-msgctxt "field:res.request.link,write_date:"
-msgid "Write Date"
-msgstr "Date de mise à jour"
-
-msgctxt "field:res.request.link,write_uid:"
-msgid "Write User"
-msgstr "Mis à jour par"
-
-msgctxt "field:res.request.reference,create_date:"
-msgid "Create Date"
-msgstr "Date de création"
-
-msgctxt "field:res.request.reference,create_uid:"
-msgid "Create User"
-msgstr "Créé par"
-
-msgctxt "field:res.request.reference,id:"
-msgid "ID"
-msgstr "ID"
-
-msgctxt "field:res.request.reference,rec_name:"
-msgid "Name"
-msgstr "Nom"
-
-msgctxt "field:res.request.reference,reference:"
-msgid "Reference"
-msgstr "Référence"
-
-msgctxt "field:res.request.reference,request:"
-msgid "Request"
-msgstr "Demande"
-
-msgctxt "field:res.request.reference,write_date:"
-msgid "Write Date"
-msgstr "Date de mise à jour"
-
-msgctxt "field:res.request.reference,write_uid:"
-msgid "Write User"
-msgstr "Mis à jour par"
-
 msgctxt "field:res.user,actions:"
 msgid "Actions"
 msgstr "Actions"
@@ -576,7 +350,7 @@ msgstr "Direction de la langue"
 
 msgctxt "field:res.user,login:"
 msgid "Login"
-msgstr "Nom d'utilisateur"
+msgstr "Identifiant"
 
 msgctxt "field:res.user,menu:"
 msgid "Menu Action"
@@ -714,14 +488,14 @@ msgctxt "field:res.user.login.attempt,id:"
 msgid "ID"
 msgstr "ID"
 
+msgctxt "field:res.user.login.attempt,login:"
+msgid "Login"
+msgstr "Identifiant"
+
 msgctxt "field:res.user.login.attempt,rec_name:"
 msgid "Name"
 msgstr "Nom"
 
-msgctxt "field:res.user.login.attempt,user:"
-msgid "User"
-msgstr "Utilisateur"
-
 msgctxt "field:res.user.login.attempt,write_date:"
 msgid "Write Date"
 msgstr "Date de mise à jour"
@@ -778,14 +552,6 @@ msgctxt "model:ir.action,name:act_group_form"
 msgid "Groups"
 msgstr "Groupes"
 
-msgctxt "model:ir.action,name:act_request_form"
-msgid "Requests"
-msgstr "Demandes"
-
-msgctxt "model:ir.action,name:act_request_link_form"
-msgid "Request Links"
-msgstr "Liens des demandes"
-
 msgctxt "model:ir.action,name:act_user_config"
 msgid "Configure Users"
 msgstr "Configuration utilisateurs"
@@ -804,11 +570,11 @@ msgstr "Lance les déclencheurs \"À temps\""
 
 msgctxt "model:ir.model.button-res.group,name:"
 msgid "Model Button - Group"
-msgstr "Bouton modèle - groupe"
+msgstr "Bouton de modèle - Groupe"
 
 msgctxt "model:ir.model.field-res.group,name:"
 msgid "Model Field Group Rel"
-msgstr "Champ de modèle - Group"
+msgstr "Champ de modèle - Groupe"
 
 msgctxt "model:ir.rule.group-res.group,name:"
 msgid "Rule Group - Group"
@@ -826,17 +592,9 @@ msgctxt "model:ir.ui.menu,name:menu_group_form"
 msgid "Groups"
 msgstr "Groupes"
 
-msgctxt "model:ir.ui.menu,name:menu_request_form"
-msgid "Requests"
-msgstr "Demandes"
-
-msgctxt "model:ir.ui.menu,name:menu_request_link_form"
-msgid "Request Links"
-msgstr "Liens des demandes"
-
 msgctxt "model:ir.ui.menu,name:menu_res"
 msgid "Users"
-msgstr "Res"
+msgstr "Utilisateurs"
 
 msgctxt "model:ir.ui.menu,name:menu_user_form"
 msgid "Users"
@@ -854,26 +612,6 @@ msgctxt "model:res.group,name:group_admin"
 msgid "Administration"
 msgstr "Administration"
 
-msgctxt "model:res.request,name:"
-msgid "Request"
-msgstr "Demande"
-
-msgctxt "model:res.request.history,name:"
-msgid "Request history"
-msgstr "Historique de demande"
-
-msgctxt "model:res.request.link,name:"
-msgid "Request link"
-msgstr "Lien de demande"
-
-msgctxt "model:res.request.link,name:request_link_cron"
-msgid "Scheduler"
-msgstr "Planificateur"
-
-msgctxt "model:res.request.reference,name:"
-msgid "Request Reference"
-msgstr "Référence de la demande"
-
 msgctxt "model:res.user,name:"
 msgid "User"
 msgstr "Utilisateur"
@@ -900,124 +638,12 @@ msgstr "Configuration utilisateur initiale"
 
 msgctxt "model:res.user.login.attempt,name:"
 msgid "Login Attempt"
-msgstr "Tentative de login"
+msgstr "Tentative d'identification"
 
 msgctxt "model:res.user.warning,name:"
 msgid "User Warning"
 msgstr "Avertissement utilisateur"
 
-msgctxt "selection:res.request,priority:"
-msgid "High"
-msgstr "Élevée"
-
-msgctxt "selection:res.request,priority:"
-msgid "High"
-msgstr "Élevée"
-
-msgctxt "selection:res.request,priority:"
-msgid "Low"
-msgstr "Faible"
-
-msgctxt "selection:res.request,priority:"
-msgid "Low"
-msgstr "Faible"
-
-msgctxt "selection:res.request,priority:"
-msgid "Normal"
-msgstr "Normale"
-
-msgctxt "selection:res.request,priority:"
-msgid "Normal"
-msgstr "Normale"
-
-msgctxt "selection:res.request,state:"
-msgid "Chatting"
-msgstr "En discussion"
-
-msgctxt "selection:res.request,state:"
-msgid "Chatting"
-msgstr "En discussion"
-
-msgctxt "selection:res.request,state:"
-msgid "Closed"
-msgstr "Fermé"
-
-msgctxt "selection:res.request,state:"
-msgid "Closed"
-msgstr "Fermé"
-
-msgctxt "selection:res.request,state:"
-msgid "Draft"
-msgstr "Brouillon"
-
-msgctxt "selection:res.request,state:"
-msgid "Draft"
-msgstr "Brouillon"
-
-msgctxt "selection:res.request,state:"
-msgid "Waiting"
-msgstr "En attente"
-
-msgctxt "selection:res.request,state:"
-msgid "Waiting"
-msgstr "En attente"
-
-msgctxt "selection:res.request.history,priority:"
-msgid "High"
-msgstr "Élevée"
-
-msgctxt "selection:res.request.history,priority:"
-msgid "High"
-msgstr "Élevée"
-
-msgctxt "selection:res.request.history,priority:"
-msgid "Low"
-msgstr "Basse"
-
-msgctxt "selection:res.request.history,priority:"
-msgid "Low"
-msgstr "Basse"
-
-msgctxt "selection:res.request.history,priority:"
-msgid "Normal"
-msgstr "Normale"
-
-msgctxt "selection:res.request.history,priority:"
-msgid "Normal"
-msgstr "Normale"
-
-msgctxt "selection:res.request.history,state:"
-msgid "Chatting"
-msgstr "En discussion"
-
-msgctxt "selection:res.request.history,state:"
-msgid "Chatting"
-msgstr "En discussion"
-
-msgctxt "selection:res.request.history,state:"
-msgid "Closed"
-msgstr "Fermé"
-
-msgctxt "selection:res.request.history,state:"
-msgid "Closed"
-msgstr "Fermé"
-
-msgctxt "selection:res.request.history,state:"
-msgid "Draft"
-msgstr "Brouillon"
-
-msgctxt "selection:res.request.history,state:"
-msgid "Draft"
-msgstr "Brouillon"
-
-msgctxt "selection:res.request.history,state:"
-msgid "Waiting"
-msgstr "En attente"
-
-msgctxt "selection:res.request.history,state:"
-msgid "Waiting"
-msgstr "En attente"
-
 msgctxt "view:ir.module.module:"
 msgid "Cancel Installation"
 msgstr "Annuler l'installation"
@@ -1047,22 +673,10 @@ msgid "Access Permissions"
 msgstr "Permissions d'accès"
 
 msgctxt "view:res.group:"
-msgid "Access Permissions"
-msgstr "Permissions d'accès"
-
-msgctxt "view:res.group:"
 msgid "Group"
 msgstr "Groupe"
 
 msgctxt "view:res.group:"
-msgid "Group"
-msgstr "Groupe"
-
-msgctxt "view:res.group:"
-msgid "Groups"
-msgstr "Groupes"
-
-msgctxt "view:res.group:"
 msgid "Groups"
 msgstr "Groupes"
 
@@ -1070,97 +684,13 @@ msgctxt "view:res.group:"
 msgid "Members"
 msgstr "Membres"
 
-msgctxt "view:res.group:"
-msgid "Members"
-msgstr "Membres"
-
-msgctxt "view:res.request.history:"
-msgid "Request History"
-msgstr "Historique des demandes"
-
-msgctxt "view:res.request.history:"
-msgid "Request History"
-msgstr "Historique des demandes"
-
-msgctxt "view:res.request.link:"
-msgid "Request Link"
-msgstr "Lien des demandes"
-
-msgctxt "view:res.request.link:"
-msgid "Request Link"
-msgstr "Lien des demandes"
-
-msgctxt "view:res.request.reference:"
-msgid "Request Reference"
-msgstr "Référence de la demande"
-
-msgctxt "view:res.request.reference:"
-msgid "Request Reference"
-msgstr "Référence de la demande"
-
-msgctxt "view:res.request.reference:"
-msgid "Request References"
-msgstr "Références de la demande"
-
-msgctxt "view:res.request.reference:"
-msgid "Request References"
-msgstr "Références de la demande"
-
-msgctxt "view:res.request:"
-msgid "Close"
-msgstr "Fermer"
-
-msgctxt "view:res.request:"
-msgid "Close"
-msgstr "Fermer"
-
-msgctxt "view:res.request:"
-msgid "References"
-msgstr "Références"
-
-msgctxt "view:res.request:"
-msgid "References"
-msgstr "Références"
-
-msgctxt "view:res.request:"
-msgid "Reply"
-msgstr "Repondre"
-
-msgctxt "view:res.request:"
-msgid "Reply"
-msgstr "Repondre"
-
-msgctxt "view:res.request:"
-msgid "Request"
-msgstr "Demande"
-
-msgctxt "view:res.request:"
-msgid "Request"
-msgstr "Demande"
-
-msgctxt "view:res.request:"
-msgid "Requests"
-msgstr "Demandes"
-
-msgctxt "view:res.request:"
-msgid "Requests"
-msgstr "Demandes"
-
-msgctxt "view:res.request:"
-msgid "Send"
-msgstr "Envoyer"
-
-msgctxt "view:res.request:"
-msgid "Send"
-msgstr "Envoyer"
-
 msgctxt "view:res.user.config.start:"
 msgid "Add Users"
 msgstr "Ajouter des utilisateurs"
 
 msgctxt "view:res.user.config.start:"
 msgid "Be careful that the login must be unique!"
-msgstr "Le login doit être unique"
+msgstr "L'identifiant doit être unique"
 
 msgctxt "view:res.user.config.start:"
 msgid "You can now add some users into the system."
@@ -1171,14 +701,6 @@ msgid "Warning"
 msgstr "Avertissement"
 
 msgctxt "view:res.user.warning:"
-msgid "Warning"
-msgstr "Avertissement"
-
-msgctxt "view:res.user.warning:"
-msgid "Warnings"
-msgstr "Avertissements"
-
-msgctxt "view:res.user.warning:"
 msgid "Warnings"
 msgstr "Avertissements"
 
@@ -1187,10 +709,6 @@ msgid "Access Permissions"
 msgstr "Permission d'accès"
 
 msgctxt "view:res.user:"
-msgid "Access Permissions"
-msgstr "Permission d'accès"
-
-msgctxt "view:res.user:"
 msgid "Actions"
 msgstr "Actions"
 
@@ -1199,22 +717,10 @@ msgid "Group Membership"
 msgstr "Groupes"
 
 msgctxt "view:res.user:"
-msgid "Group Membership"
-msgstr "Groupes"
-
-msgctxt "view:res.user:"
 msgid "Preferences"
 msgstr "Préférences"
 
 msgctxt "view:res.user:"
-msgid "Preferences"
-msgstr "Préférences"
-
-msgctxt "view:res.user:"
-msgid "User"
-msgstr "Utilisateur"
-
-msgctxt "view:res.user:"
 msgid "User"
 msgstr "Utilisateur"
 
@@ -1222,10 +728,6 @@ msgctxt "view:res.user:"
 msgid "Users"
 msgstr "Utilisateurs"
 
-msgctxt "view:res.user:"
-msgid "Users"
-msgstr "Utilisateurs"
-
 msgctxt "wizard_button:res.user.config,start,end:"
 msgid "Cancel"
 msgstr "Annuler"
diff --git a/trytond/res/locale/nl_NL.po b/trytond/res/locale/nl_NL.po
index bf15048..9d70347 100644
--- a/trytond/res/locale/nl_NL.po
+++ b/trytond/res/locale/nl_NL.po
@@ -329,224 +329,6 @@ msgctxt "field:res.group,write_uid:"
 msgid "Write User"
 msgstr ""
 
-msgctxt "field:res.request,act_from:"
-msgid "From"
-msgstr ""
-
-msgctxt "field:res.request,act_to:"
-msgid "To"
-msgstr ""
-
-#, fuzzy
-msgctxt "field:res.request,active:"
-msgid "Active"
-msgstr "Actief"
-
-msgctxt "field:res.request,body:"
-msgid "Body"
-msgstr ""
-
-msgctxt "field:res.request,create_date:"
-msgid "Create Date"
-msgstr ""
-
-msgctxt "field:res.request,create_uid:"
-msgid "Create User"
-msgstr ""
-
-#, fuzzy
-msgctxt "field:res.request,date_sent:"
-msgid "Date"
-msgstr "Vervaldatum"
-
-msgctxt "field:res.request,history:"
-msgid "History"
-msgstr ""
-
-msgctxt "field:res.request,id:"
-msgid "ID"
-msgstr ""
-
-msgctxt "field:res.request,name:"
-msgid "Subject"
-msgstr ""
-
-msgctxt "field:res.request,number_references:"
-msgid "Number of References"
-msgstr ""
-
-#, fuzzy
-msgctxt "field:res.request,priority:"
-msgid "Priority"
-msgstr "Prioriteit"
-
-#, fuzzy
-msgctxt "field:res.request,rec_name:"
-msgid "Name"
-msgstr "Naam bijlage"
-
-msgctxt "field:res.request,references:"
-msgid "References"
-msgstr ""
-
-#, fuzzy
-msgctxt "field:res.request,state:"
-msgid "State"
-msgstr "Status"
-
-msgctxt "field:res.request,trigger_date:"
-msgid "Trigger Date"
-msgstr ""
-
-msgctxt "field:res.request,write_date:"
-msgid "Write Date"
-msgstr ""
-
-msgctxt "field:res.request,write_uid:"
-msgid "Write User"
-msgstr ""
-
-msgctxt "field:res.request.history,act_from:"
-msgid "From"
-msgstr ""
-
-msgctxt "field:res.request.history,act_to:"
-msgid "To"
-msgstr ""
-
-msgctxt "field:res.request.history,body:"
-msgid "Body"
-msgstr ""
-
-msgctxt "field:res.request.history,create_date:"
-msgid "Create Date"
-msgstr ""
-
-msgctxt "field:res.request.history,create_uid:"
-msgid "Create User"
-msgstr ""
-
-msgctxt "field:res.request.history,date_sent:"
-msgid "Date sent"
-msgstr ""
-
-msgctxt "field:res.request.history,id:"
-msgid "ID"
-msgstr ""
-
-msgctxt "field:res.request.history,name:"
-msgid "Summary"
-msgstr ""
-
-msgctxt "field:res.request.history,number_references:"
-msgid "References"
-msgstr ""
-
-#, fuzzy
-msgctxt "field:res.request.history,priority:"
-msgid "Priority"
-msgstr "Prioriteit"
-
-#, fuzzy
-msgctxt "field:res.request.history,rec_name:"
-msgid "Name"
-msgstr "Naam bijlage"
-
-msgctxt "field:res.request.history,request:"
-msgid "Request"
-msgstr ""
-
-#, fuzzy
-msgctxt "field:res.request.history,state:"
-msgid "State"
-msgstr "Status"
-
-msgctxt "field:res.request.history,subject:"
-msgid "Subject"
-msgstr ""
-
-msgctxt "field:res.request.history,write_date:"
-msgid "Write Date"
-msgstr ""
-
-msgctxt "field:res.request.history,write_uid:"
-msgid "Write User"
-msgstr ""
-
-msgctxt "field:res.request.link,create_date:"
-msgid "Create Date"
-msgstr ""
-
-msgctxt "field:res.request.link,create_uid:"
-msgid "Create User"
-msgstr ""
-
-msgctxt "field:res.request.link,id:"
-msgid "ID"
-msgstr ""
-
-#, fuzzy
-msgctxt "field:res.request.link,model:"
-msgid "Model"
-msgstr "Model"
-
-#, fuzzy
-msgctxt "field:res.request.link,name:"
-msgid "Name"
-msgstr "Naam bijlage"
-
-#, fuzzy
-msgctxt "field:res.request.link,priority:"
-msgid "Priority"
-msgstr "Prioriteit"
-
-#, fuzzy
-msgctxt "field:res.request.link,rec_name:"
-msgid "Name"
-msgstr "Naam bijlage"
-
-msgctxt "field:res.request.link,write_date:"
-msgid "Write Date"
-msgstr ""
-
-msgctxt "field:res.request.link,write_uid:"
-msgid "Write User"
-msgstr ""
-
-msgctxt "field:res.request.reference,create_date:"
-msgid "Create Date"
-msgstr ""
-
-msgctxt "field:res.request.reference,create_uid:"
-msgid "Create User"
-msgstr ""
-
-msgctxt "field:res.request.reference,id:"
-msgid "ID"
-msgstr ""
-
-#, fuzzy
-msgctxt "field:res.request.reference,rec_name:"
-msgid "Name"
-msgstr "Naam bijlage"
-
-#, fuzzy
-msgctxt "field:res.request.reference,reference:"
-msgid "Reference"
-msgstr "Referentie"
-
-msgctxt "field:res.request.reference,request:"
-msgid "Request"
-msgstr ""
-
-msgctxt "field:res.request.reference,write_date:"
-msgid "Write Date"
-msgstr ""
-
-msgctxt "field:res.request.reference,write_uid:"
-msgid "Write User"
-msgstr ""
-
 #, fuzzy
 msgctxt "field:res.user,actions:"
 msgid "Actions"
@@ -736,16 +518,15 @@ msgctxt "field:res.user.login.attempt,id:"
 msgid "ID"
 msgstr ""
 
+msgctxt "field:res.user.login.attempt,login:"
+msgid "Login"
+msgstr ""
+
 #, fuzzy
 msgctxt "field:res.user.login.attempt,rec_name:"
 msgid "Name"
 msgstr "Naam bijlage"
 
-#, fuzzy
-msgctxt "field:res.user.login.attempt,user:"
-msgid "User"
-msgstr "Gebruiker"
-
 msgctxt "field:res.user.login.attempt,write_date:"
 msgid "Write Date"
 msgstr ""
@@ -806,14 +587,6 @@ msgctxt "model:ir.action,name:act_group_form"
 msgid "Groups"
 msgstr "Groepen"
 
-msgctxt "model:ir.action,name:act_request_form"
-msgid "Requests"
-msgstr ""
-
-msgctxt "model:ir.action,name:act_request_link_form"
-msgid "Request Links"
-msgstr ""
-
 msgctxt "model:ir.action,name:act_user_config"
 msgid "Configure Users"
 msgstr ""
@@ -856,14 +629,6 @@ msgctxt "model:ir.ui.menu,name:menu_group_form"
 msgid "Groups"
 msgstr "Groepen"
 
-msgctxt "model:ir.ui.menu,name:menu_request_form"
-msgid "Requests"
-msgstr ""
-
-msgctxt "model:ir.ui.menu,name:menu_request_link_form"
-msgid "Request Links"
-msgstr ""
-
 #, fuzzy
 msgctxt "model:ir.ui.menu,name:menu_res"
 msgid "Users"
@@ -888,27 +653,6 @@ msgctxt "model:res.group,name:group_admin"
 msgid "Administration"
 msgstr "Systeembeheer"
 
-msgctxt "model:res.request,name:"
-msgid "Request"
-msgstr ""
-
-msgctxt "model:res.request.history,name:"
-msgid "Request history"
-msgstr ""
-
-msgctxt "model:res.request.link,name:"
-msgid "Request link"
-msgstr ""
-
-#, fuzzy
-msgctxt "model:res.request.link,name:request_link_cron"
-msgid "Scheduler"
-msgstr "Planner"
-
-msgctxt "model:res.request.reference,name:"
-msgid "Request Reference"
-msgstr ""
-
 #, fuzzy
 msgctxt "model:res.user,name:"
 msgid "User"
@@ -942,66 +686,6 @@ msgctxt "model:res.user.warning,name:"
 msgid "User Warning"
 msgstr ""
 
-msgctxt "selection:res.request,priority:"
-msgid "High"
-msgstr ""
-
-msgctxt "selection:res.request,priority:"
-msgid "Low"
-msgstr ""
-
-msgctxt "selection:res.request,priority:"
-msgid "Normal"
-msgstr ""
-
-msgctxt "selection:res.request,state:"
-msgid "Chatting"
-msgstr ""
-
-msgctxt "selection:res.request,state:"
-msgid "Closed"
-msgstr ""
-
-#, fuzzy
-msgctxt "selection:res.request,state:"
-msgid "Draft"
-msgstr "Concept"
-
-#, fuzzy
-msgctxt "selection:res.request,state:"
-msgid "Waiting"
-msgstr "In afwachting"
-
-msgctxt "selection:res.request.history,priority:"
-msgid "High"
-msgstr ""
-
-msgctxt "selection:res.request.history,priority:"
-msgid "Low"
-msgstr ""
-
-msgctxt "selection:res.request.history,priority:"
-msgid "Normal"
-msgstr ""
-
-msgctxt "selection:res.request.history,state:"
-msgid "Chatting"
-msgstr ""
-
-msgctxt "selection:res.request.history,state:"
-msgid "Closed"
-msgstr ""
-
-#, fuzzy
-msgctxt "selection:res.request.history,state:"
-msgid "Draft"
-msgstr "Concept"
-
-#, fuzzy
-msgctxt "selection:res.request.history,state:"
-msgid "Waiting"
-msgstr "In afwachting"
-
 #, fuzzy
 msgctxt "view:ir.module.module:"
 msgid "Cancel Installation"
@@ -1050,47 +734,6 @@ msgctxt "view:res.group:"
 msgid "Members"
 msgstr ""
 
-msgctxt "view:res.request.history:"
-msgid "Request History"
-msgstr ""
-
-msgctxt "view:res.request.link:"
-msgid "Request Link"
-msgstr ""
-
-msgctxt "view:res.request.reference:"
-msgid "Request Reference"
-msgstr ""
-
-msgctxt "view:res.request.reference:"
-msgid "Request References"
-msgstr ""
-
-#, fuzzy
-msgctxt "view:res.request:"
-msgid "Close"
-msgstr "Sluiten"
-
-msgctxt "view:res.request:"
-msgid "References"
-msgstr ""
-
-msgctxt "view:res.request:"
-msgid "Reply"
-msgstr ""
-
-msgctxt "view:res.request:"
-msgid "Request"
-msgstr ""
-
-msgctxt "view:res.request:"
-msgid "Requests"
-msgstr ""
-
-msgctxt "view:res.request:"
-msgid "Send"
-msgstr ""
-
 msgctxt "view:res.user.config.start:"
 msgid "Add Users"
 msgstr ""
diff --git a/trytond/res/locale/ru_RU.po b/trytond/res/locale/ru_RU.po
index 8aa8d44..b1b4488 100644
--- a/trytond/res/locale/ru_RU.po
+++ b/trytond/res/locale/ru_RU.po
@@ -312,210 +312,6 @@ msgctxt "field:res.group,write_uid:"
 msgid "Write User"
 msgstr "Изменено пользователем"
 
-msgctxt "field:res.request,act_from:"
-msgid "From"
-msgstr "От кого"
-
-msgctxt "field:res.request,act_to:"
-msgid "To"
-msgstr "Кому"
-
-msgctxt "field:res.request,active:"
-msgid "Active"
-msgstr "Действующий"
-
-msgctxt "field:res.request,body:"
-msgid "Body"
-msgstr "Сообщение"
-
-msgctxt "field:res.request,create_date:"
-msgid "Create Date"
-msgstr "Дата создания"
-
-msgctxt "field:res.request,create_uid:"
-msgid "Create User"
-msgstr "Создано пользователем"
-
-msgctxt "field:res.request,date_sent:"
-msgid "Date"
-msgstr "Дата"
-
-msgctxt "field:res.request,history:"
-msgid "History"
-msgstr "Архив"
-
-msgctxt "field:res.request,id:"
-msgid "ID"
-msgstr "ID"
-
-msgctxt "field:res.request,name:"
-msgid "Subject"
-msgstr "Тема"
-
-msgctxt "field:res.request,number_references:"
-msgid "Number of References"
-msgstr "Кол-во ссылок"
-
-msgctxt "field:res.request,priority:"
-msgid "Priority"
-msgstr "Приоритет"
-
-msgctxt "field:res.request,rec_name:"
-msgid "Name"
-msgstr "Наименование"
-
-msgctxt "field:res.request,references:"
-msgid "References"
-msgstr "Ссылки"
-
-msgctxt "field:res.request,state:"
-msgid "State"
-msgstr "Состояние"
-
-msgctxt "field:res.request,trigger_date:"
-msgid "Trigger Date"
-msgstr "Дата сообщения"
-
-msgctxt "field:res.request,write_date:"
-msgid "Write Date"
-msgstr "Дата изменения"
-
-msgctxt "field:res.request,write_uid:"
-msgid "Write User"
-msgstr "Изменено пользователем"
-
-msgctxt "field:res.request.history,act_from:"
-msgid "From"
-msgstr "От кого"
-
-msgctxt "field:res.request.history,act_to:"
-msgid "To"
-msgstr "Кому"
-
-msgctxt "field:res.request.history,body:"
-msgid "Body"
-msgstr "Сообщение"
-
-msgctxt "field:res.request.history,create_date:"
-msgid "Create Date"
-msgstr "Дата создания"
-
-msgctxt "field:res.request.history,create_uid:"
-msgid "Create User"
-msgstr "Создано пользователем"
-
-msgctxt "field:res.request.history,date_sent:"
-msgid "Date sent"
-msgstr "Дата отправки"
-
-msgctxt "field:res.request.history,id:"
-msgid "ID"
-msgstr "ID"
-
-msgctxt "field:res.request.history,name:"
-msgid "Summary"
-msgstr "Сводка"
-
-msgctxt "field:res.request.history,number_references:"
-msgid "References"
-msgstr "Ссылки"
-
-msgctxt "field:res.request.history,priority:"
-msgid "Priority"
-msgstr "Приоретет"
-
-msgctxt "field:res.request.history,rec_name:"
-msgid "Name"
-msgstr "Наименование"
-
-msgctxt "field:res.request.history,request:"
-msgid "Request"
-msgstr "Сообщение"
-
-msgctxt "field:res.request.history,state:"
-msgid "State"
-msgstr "Состояние"
-
-msgctxt "field:res.request.history,subject:"
-msgid "Subject"
-msgstr "Тема"
-
-msgctxt "field:res.request.history,write_date:"
-msgid "Write Date"
-msgstr "Дата изменения"
-
-msgctxt "field:res.request.history,write_uid:"
-msgid "Write User"
-msgstr "Изменено пользователем"
-
-msgctxt "field:res.request.link,create_date:"
-msgid "Create Date"
-msgstr "Дата создания"
-
-msgctxt "field:res.request.link,create_uid:"
-msgid "Create User"
-msgstr "Создано пользователем"
-
-msgctxt "field:res.request.link,id:"
-msgid "ID"
-msgstr "ID"
-
-msgctxt "field:res.request.link,model:"
-msgid "Model"
-msgstr "Модель"
-
-msgctxt "field:res.request.link,name:"
-msgid "Name"
-msgstr "Наименование"
-
-msgctxt "field:res.request.link,priority:"
-msgid "Priority"
-msgstr "Приоритет"
-
-msgctxt "field:res.request.link,rec_name:"
-msgid "Name"
-msgstr "Наименование"
-
-msgctxt "field:res.request.link,write_date:"
-msgid "Write Date"
-msgstr "Дата изменения"
-
-msgctxt "field:res.request.link,write_uid:"
-msgid "Write User"
-msgstr "Изменено пользователем"
-
-msgctxt "field:res.request.reference,create_date:"
-msgid "Create Date"
-msgstr "Дата создания"
-
-msgctxt "field:res.request.reference,create_uid:"
-msgid "Create User"
-msgstr "Создано пользователем"
-
-msgctxt "field:res.request.reference,id:"
-msgid "ID"
-msgstr "ID"
-
-msgctxt "field:res.request.reference,rec_name:"
-msgid "Name"
-msgstr "Наименование"
-
-msgctxt "field:res.request.reference,reference:"
-msgid "Reference"
-msgstr "Ссылка"
-
-msgctxt "field:res.request.reference,request:"
-msgid "Request"
-msgstr "Сообщение"
-
-msgctxt "field:res.request.reference,write_date:"
-msgid "Write Date"
-msgstr "Дата изменения"
-
-msgctxt "field:res.request.reference,write_uid:"
-msgid "Write User"
-msgstr "Изменено пользователем"
-
 msgctxt "field:res.user,actions:"
 msgid "Actions"
 msgstr "Действия"
@@ -692,14 +488,15 @@ msgctxt "field:res.user.login.attempt,id:"
 msgid "ID"
 msgstr "ID"
 
+#, fuzzy
+msgctxt "field:res.user.login.attempt,login:"
+msgid "Login"
+msgstr "Логин"
+
 msgctxt "field:res.user.login.attempt,rec_name:"
 msgid "Name"
 msgstr "Наименование"
 
-msgctxt "field:res.user.login.attempt,user:"
-msgid "User"
-msgstr "Пользователь"
-
 msgctxt "field:res.user.login.attempt,write_date:"
 msgid "Write Date"
 msgstr "Дата изменения"
@@ -756,14 +553,6 @@ msgctxt "model:ir.action,name:act_group_form"
 msgid "Groups"
 msgstr "Группы"
 
-msgctxt "model:ir.action,name:act_request_form"
-msgid "Requests"
-msgstr "Сообщения"
-
-msgctxt "model:ir.action,name:act_request_link_form"
-msgid "Request Links"
-msgstr "Ссылки сообщения"
-
 msgctxt "model:ir.action,name:act_user_config"
 msgid "Configure Users"
 msgstr "Конфигурация пользователей"
@@ -804,14 +593,6 @@ msgctxt "model:ir.ui.menu,name:menu_group_form"
 msgid "Groups"
 msgstr "Группы"
 
-msgctxt "model:ir.ui.menu,name:menu_request_form"
-msgid "Requests"
-msgstr "Сообщения"
-
-msgctxt "model:ir.ui.menu,name:menu_request_link_form"
-msgid "Request Links"
-msgstr "Ссылки сообщения"
-
 msgctxt "model:ir.ui.menu,name:menu_res"
 msgid "Users"
 msgstr "Пользователи"
@@ -832,26 +613,6 @@ msgctxt "model:res.group,name:group_admin"
 msgid "Administration"
 msgstr "группа Управление"
 
-msgctxt "model:res.request,name:"
-msgid "Request"
-msgstr "Сообщение"
-
-msgctxt "model:res.request.history,name:"
-msgid "Request history"
-msgstr "Архив сообщений"
-
-msgctxt "model:res.request.link,name:"
-msgid "Request link"
-msgstr "Ссылка сообщения"
-
-msgctxt "model:res.request.link,name:request_link_cron"
-msgid "Scheduler"
-msgstr "Планировщик"
-
-msgctxt "model:res.request.reference,name:"
-msgid "Request Reference"
-msgstr "Ссылка сообщения"
-
 msgctxt "model:res.user,name:"
 msgid "User"
 msgstr "Пользователь"
@@ -884,62 +645,6 @@ msgctxt "model:res.user.warning,name:"
 msgid "User Warning"
 msgstr "Внимание Пользователь"
 
-msgctxt "selection:res.request,priority:"
-msgid "High"
-msgstr "Высокий"
-
-msgctxt "selection:res.request,priority:"
-msgid "Low"
-msgstr "Низкий"
-
-msgctxt "selection:res.request,priority:"
-msgid "Normal"
-msgstr "Нормально"
-
-msgctxt "selection:res.request,state:"
-msgid "Chatting"
-msgstr "Переписка"
-
-msgctxt "selection:res.request,state:"
-msgid "Closed"
-msgstr "Закрыто"
-
-msgctxt "selection:res.request,state:"
-msgid "Draft"
-msgstr "Черновик"
-
-msgctxt "selection:res.request,state:"
-msgid "Waiting"
-msgstr "Ожидание"
-
-msgctxt "selection:res.request.history,priority:"
-msgid "High"
-msgstr "Высокий"
-
-msgctxt "selection:res.request.history,priority:"
-msgid "Low"
-msgstr "Низкий"
-
-msgctxt "selection:res.request.history,priority:"
-msgid "Normal"
-msgstr "Нормально"
-
-msgctxt "selection:res.request.history,state:"
-msgid "Chatting"
-msgstr "Переписка"
-
-msgctxt "selection:res.request.history,state:"
-msgid "Closed"
-msgstr "Закрыто"
-
-msgctxt "selection:res.request.history,state:"
-msgid "Draft"
-msgstr "Черновик"
-
-msgctxt "selection:res.request.history,state:"
-msgid "Waiting"
-msgstr "Ожидание"
-
 msgctxt "view:ir.module.module:"
 msgid "Cancel Installation"
 msgstr "Отменить установку"
@@ -980,46 +685,6 @@ msgctxt "view:res.group:"
 msgid "Members"
 msgstr "Члены группы"
 
-msgctxt "view:res.request.history:"
-msgid "Request History"
-msgstr "Переписка"
-
-msgctxt "view:res.request.link:"
-msgid "Request Link"
-msgstr "Ссылка сообщения"
-
-msgctxt "view:res.request.reference:"
-msgid "Request Reference"
-msgstr "Ссылка сообщения"
-
-msgctxt "view:res.request.reference:"
-msgid "Request References"
-msgstr "Ссылки сообщения"
-
-msgctxt "view:res.request:"
-msgid "Close"
-msgstr "Закрыть"
-
-msgctxt "view:res.request:"
-msgid "References"
-msgstr "Ссылки"
-
-msgctxt "view:res.request:"
-msgid "Reply"
-msgstr "Ответить"
-
-msgctxt "view:res.request:"
-msgid "Request"
-msgstr "Сообщение"
-
-msgctxt "view:res.request:"
-msgid "Requests"
-msgstr "Сообщения"
-
-msgctxt "view:res.request:"
-msgid "Send"
-msgstr "Послать"
-
 msgctxt "view:res.user.config.start:"
 msgid "Add Users"
 msgstr "Добавить пользователей"
diff --git a/trytond/res/locale/cs_CZ.po b/trytond/res/locale/sl_SI.po
similarity index 59%
copy from trytond/res/locale/cs_CZ.po
copy to trytond/res/locale/sl_SI.po
index e5af6cf..8e8eb0e 100644
--- a/trytond/res/locale/cs_CZ.po
+++ b/trytond/res/locale/sl_SI.po
@@ -4,15 +4,15 @@ msgstr "Content-Type: text/plain; charset=utf-8\n"
 
 msgctxt "error:res.group:"
 msgid "The name of the group must be unique!"
-msgstr ""
+msgstr "Naziv skupine mora biti edinstven."
 
 msgctxt "error:res.user:"
 msgid "Wrong password!"
-msgstr ""
+msgstr "Napačno geslo."
 
 msgctxt "error:res.user:"
 msgid "You can not have two users with the same login!"
-msgstr ""
+msgstr "Dva uporabnika ne moreta imeti isto prijavo."
 
 msgctxt "error:res.user:"
 msgid ""
@@ -20,1059 +20,725 @@ msgid ""
 "as it is used internally for resources\n"
 "created by the system (updates, module installation, ...)"
 msgstr ""
+"Skrbnika ni možno odstraniti, ker se interno uporablja za vire, \n"
+"ki jih ustvarja sistem (posodobitve, nameščanje modulov, ...)"
 
 msgctxt "field:ir.action-res.group,action:"
 msgid "Action"
-msgstr ""
+msgstr "Ukrep"
 
 msgctxt "field:ir.action-res.group,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Ustvarjeno"
 
 msgctxt "field:ir.action-res.group,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Ustvaril"
 
 msgctxt "field:ir.action-res.group,group:"
 msgid "Group"
-msgstr ""
+msgstr "Skupina"
 
 msgctxt "field:ir.action-res.group,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:ir.action-res.group,rec_name:"
 msgid "Name"
-msgstr ""
+msgstr "Ime"
 
 msgctxt "field:ir.action-res.group,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Zapisano"
 
 msgctxt "field:ir.action-res.group,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Zapisal"
 
 msgctxt "field:ir.model.button-res.group,active:"
 msgid "Active"
-msgstr ""
+msgstr "Aktivno"
 
 msgctxt "field:ir.model.button-res.group,button:"
 msgid "Button"
-msgstr ""
+msgstr "Gumb"
 
 msgctxt "field:ir.model.button-res.group,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Ustvarjeno"
 
 msgctxt "field:ir.model.button-res.group,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Ustvaril"
 
 msgctxt "field:ir.model.button-res.group,group:"
 msgid "Group"
-msgstr ""
+msgstr "Skupina"
 
 msgctxt "field:ir.model.button-res.group,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:ir.model.button-res.group,rec_name:"
 msgid "Name"
-msgstr ""
+msgstr "Ime"
 
 msgctxt "field:ir.model.button-res.group,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Zapisano"
 
 msgctxt "field:ir.model.button-res.group,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Zapisal"
 
 msgctxt "field:ir.model.field-res.group,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Ustvarjeno"
 
 msgctxt "field:ir.model.field-res.group,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Ustvaril"
 
 msgctxt "field:ir.model.field-res.group,field:"
 msgid "Model Field"
-msgstr ""
+msgstr "Polje modela"
 
 msgctxt "field:ir.model.field-res.group,group:"
 msgid "Group"
-msgstr ""
+msgstr "Skupina"
 
 msgctxt "field:ir.model.field-res.group,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:ir.model.field-res.group,rec_name:"
 msgid "Name"
-msgstr ""
+msgstr "Ime"
 
 msgctxt "field:ir.model.field-res.group,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Zapisano"
 
 msgctxt "field:ir.model.field-res.group,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Zapisal"
 
 msgctxt "field:ir.rule.group-res.group,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Ustvarjeno"
 
 msgctxt "field:ir.rule.group-res.group,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Ustvaril"
 
 msgctxt "field:ir.rule.group-res.group,group:"
 msgid "Group"
-msgstr ""
+msgstr "Skupina"
 
 msgctxt "field:ir.rule.group-res.group,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:ir.rule.group-res.group,rec_name:"
 msgid "Name"
-msgstr ""
+msgstr "Ime"
 
 msgctxt "field:ir.rule.group-res.group,rule_group:"
 msgid "Rule Group"
-msgstr ""
+msgstr "Skupina pravila"
 
 msgctxt "field:ir.rule.group-res.group,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Zapisano"
 
 msgctxt "field:ir.rule.group-res.group,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Zapisal"
 
 msgctxt "field:ir.rule.group-res.user,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Ustvarjeno"
 
 msgctxt "field:ir.rule.group-res.user,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Ustvaril"
 
 msgctxt "field:ir.rule.group-res.user,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:ir.rule.group-res.user,rec_name:"
 msgid "Name"
-msgstr ""
+msgstr "Ime"
 
 msgctxt "field:ir.rule.group-res.user,rule_group:"
 msgid "Rule Group"
-msgstr ""
+msgstr "Skupina pravila"
 
 msgctxt "field:ir.rule.group-res.user,user:"
 msgid "User"
-msgstr ""
+msgstr "Uporabnik"
 
 msgctxt "field:ir.rule.group-res.user,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Zapisano"
 
 msgctxt "field:ir.rule.group-res.user,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Zapisal"
 
 msgctxt "field:ir.sequence,groups:"
 msgid "User Groups"
-msgstr ""
+msgstr "Uporabniške skupine"
 
 msgctxt "field:ir.sequence.strict,groups:"
 msgid "User Groups"
-msgstr ""
+msgstr "Uporabniške skupine"
 
 msgctxt "field:ir.sequence.type,groups:"
 msgid "User Groups"
-msgstr ""
+msgstr "Uporabniške skupine"
 
 msgctxt "field:ir.sequence.type-res.group,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Ustvarjeno"
 
 msgctxt "field:ir.sequence.type-res.group,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Ustvaril"
 
 msgctxt "field:ir.sequence.type-res.group,group:"
 msgid "User Groups"
-msgstr ""
+msgstr "Uporabniške skupine"
 
 msgctxt "field:ir.sequence.type-res.group,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:ir.sequence.type-res.group,rec_name:"
 msgid "Name"
-msgstr ""
+msgstr "Ime"
 
 msgctxt "field:ir.sequence.type-res.group,sequence_type:"
 msgid "Sequence Type"
-msgstr ""
+msgstr "Tip štetja"
 
 msgctxt "field:ir.sequence.type-res.group,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Zapisano"
 
 msgctxt "field:ir.sequence.type-res.group,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Zapisal"
 
 msgctxt "field:ir.ui.menu-res.group,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Ustvarjeno"
 
 msgctxt "field:ir.ui.menu-res.group,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Ustvaril"
 
 msgctxt "field:ir.ui.menu-res.group,group:"
 msgid "Group"
-msgstr ""
+msgstr "Skupina"
 
 msgctxt "field:ir.ui.menu-res.group,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:ir.ui.menu-res.group,menu:"
 msgid "Menu"
-msgstr ""
+msgstr "Meni"
 
 msgctxt "field:ir.ui.menu-res.group,rec_name:"
 msgid "Name"
-msgstr ""
+msgstr "Ime"
 
 msgctxt "field:ir.ui.menu-res.group,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Zapisano"
 
 msgctxt "field:ir.ui.menu-res.group,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Zapisal"
 
 msgctxt "field:res.group,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Ustvarjeno"
 
 msgctxt "field:res.group,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Ustvaril"
 
 msgctxt "field:res.group,field_access:"
 msgid "Access Field"
-msgstr ""
+msgstr "Dostop do polj"
 
 msgctxt "field:res.group,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:res.group,menu_access:"
 msgid "Access Menu"
-msgstr ""
+msgstr "Dostop do menijev"
 
 msgctxt "field:res.group,model_access:"
 msgid "Access Model"
-msgstr ""
+msgstr "Dostop do modelov"
 
 msgctxt "field:res.group,name:"
 msgid "Name"
-msgstr ""
+msgstr "Naziv"
 
 msgctxt "field:res.group,rec_name:"
 msgid "Name"
-msgstr ""
+msgstr "Ime"
 
 msgctxt "field:res.group,rule_groups:"
 msgid "Rules"
-msgstr ""
+msgstr "Pravila"
 
 msgctxt "field:res.group,users:"
 msgid "Users"
-msgstr ""
+msgstr "Uporabniki"
 
 msgctxt "field:res.group,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Zapisano"
 
 msgctxt "field:res.group,write_uid:"
 msgid "Write User"
-msgstr ""
-
-msgctxt "field:res.request,act_from:"
-msgid "From"
-msgstr ""
-
-msgctxt "field:res.request,act_to:"
-msgid "To"
-msgstr ""
-
-msgctxt "field:res.request,active:"
-msgid "Active"
-msgstr ""
-
-msgctxt "field:res.request,body:"
-msgid "Body"
-msgstr ""
-
-msgctxt "field:res.request,create_date:"
-msgid "Create Date"
-msgstr ""
-
-msgctxt "field:res.request,create_uid:"
-msgid "Create User"
-msgstr ""
-
-msgctxt "field:res.request,date_sent:"
-msgid "Date"
-msgstr ""
-
-msgctxt "field:res.request,history:"
-msgid "History"
-msgstr ""
-
-msgctxt "field:res.request,id:"
-msgid "ID"
-msgstr ""
-
-msgctxt "field:res.request,name:"
-msgid "Subject"
-msgstr ""
-
-msgctxt "field:res.request,number_references:"
-msgid "Number of References"
-msgstr ""
-
-msgctxt "field:res.request,priority:"
-msgid "Priority"
-msgstr ""
-
-msgctxt "field:res.request,rec_name:"
-msgid "Name"
-msgstr ""
-
-msgctxt "field:res.request,references:"
-msgid "References"
-msgstr ""
-
-msgctxt "field:res.request,state:"
-msgid "State"
-msgstr ""
-
-msgctxt "field:res.request,trigger_date:"
-msgid "Trigger Date"
-msgstr ""
-
-msgctxt "field:res.request,write_date:"
-msgid "Write Date"
-msgstr ""
-
-msgctxt "field:res.request,write_uid:"
-msgid "Write User"
-msgstr ""
-
-msgctxt "field:res.request.history,act_from:"
-msgid "From"
-msgstr ""
-
-msgctxt "field:res.request.history,act_to:"
-msgid "To"
-msgstr ""
-
-msgctxt "field:res.request.history,body:"
-msgid "Body"
-msgstr ""
-
-msgctxt "field:res.request.history,create_date:"
-msgid "Create Date"
-msgstr ""
-
-msgctxt "field:res.request.history,create_uid:"
-msgid "Create User"
-msgstr ""
-
-msgctxt "field:res.request.history,date_sent:"
-msgid "Date sent"
-msgstr ""
-
-msgctxt "field:res.request.history,id:"
-msgid "ID"
-msgstr ""
-
-msgctxt "field:res.request.history,name:"
-msgid "Summary"
-msgstr ""
-
-msgctxt "field:res.request.history,number_references:"
-msgid "References"
-msgstr ""
-
-msgctxt "field:res.request.history,priority:"
-msgid "Priority"
-msgstr ""
-
-msgctxt "field:res.request.history,rec_name:"
-msgid "Name"
-msgstr ""
-
-msgctxt "field:res.request.history,request:"
-msgid "Request"
-msgstr ""
-
-msgctxt "field:res.request.history,state:"
-msgid "State"
-msgstr ""
-
-msgctxt "field:res.request.history,subject:"
-msgid "Subject"
-msgstr ""
-
-msgctxt "field:res.request.history,write_date:"
-msgid "Write Date"
-msgstr ""
-
-msgctxt "field:res.request.history,write_uid:"
-msgid "Write User"
-msgstr ""
-
-msgctxt "field:res.request.link,create_date:"
-msgid "Create Date"
-msgstr ""
-
-msgctxt "field:res.request.link,create_uid:"
-msgid "Create User"
-msgstr ""
-
-msgctxt "field:res.request.link,id:"
-msgid "ID"
-msgstr ""
-
-msgctxt "field:res.request.link,model:"
-msgid "Model"
-msgstr ""
-
-msgctxt "field:res.request.link,name:"
-msgid "Name"
-msgstr ""
-
-msgctxt "field:res.request.link,priority:"
-msgid "Priority"
-msgstr ""
-
-msgctxt "field:res.request.link,rec_name:"
-msgid "Name"
-msgstr ""
-
-msgctxt "field:res.request.link,write_date:"
-msgid "Write Date"
-msgstr ""
-
-msgctxt "field:res.request.link,write_uid:"
-msgid "Write User"
-msgstr ""
-
-msgctxt "field:res.request.reference,create_date:"
-msgid "Create Date"
-msgstr ""
-
-msgctxt "field:res.request.reference,create_uid:"
-msgid "Create User"
-msgstr ""
-
-msgctxt "field:res.request.reference,id:"
-msgid "ID"
-msgstr ""
-
-msgctxt "field:res.request.reference,rec_name:"
-msgid "Name"
-msgstr ""
-
-msgctxt "field:res.request.reference,reference:"
-msgid "Reference"
-msgstr ""
-
-msgctxt "field:res.request.reference,request:"
-msgid "Request"
-msgstr ""
-
-msgctxt "field:res.request.reference,write_date:"
-msgid "Write Date"
-msgstr ""
-
-msgctxt "field:res.request.reference,write_uid:"
-msgid "Write User"
-msgstr ""
+msgstr "Zapisal"
 
 msgctxt "field:res.user,actions:"
 msgid "Actions"
-msgstr ""
+msgstr "Ukrepi"
 
 msgctxt "field:res.user,active:"
 msgid "Active"
-msgstr ""
+msgstr "Aktivno"
 
 msgctxt "field:res.user,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Ustvarjeno"
 
 msgctxt "field:res.user,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Ustvaril"
 
 msgctxt "field:res.user,email:"
 msgid "Email"
-msgstr ""
+msgstr "E-pošta"
 
 msgctxt "field:res.user,groups:"
 msgid "Groups"
-msgstr ""
+msgstr "Skupine"
 
 msgctxt "field:res.user,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:res.user,language:"
 msgid "Language"
-msgstr ""
+msgstr "Jezik"
 
 msgctxt "field:res.user,language_direction:"
 msgid "Language Direction"
-msgstr ""
+msgstr "Smer jezika"
 
 msgctxt "field:res.user,login:"
 msgid "Login"
-msgstr ""
+msgstr "Prijava"
 
 msgctxt "field:res.user,menu:"
 msgid "Menu Action"
-msgstr ""
+msgstr "Izhodiščni meni"
 
 msgctxt "field:res.user,name:"
 msgid "Name"
-msgstr ""
+msgstr "Naziv"
 
 msgctxt "field:res.user,password:"
 msgid "Password"
-msgstr ""
+msgstr "Geslo"
 
 msgctxt "field:res.user,pyson_menu:"
 msgid "PySON Menu"
-msgstr ""
+msgstr "PySON meni"
 
 msgctxt "field:res.user,rec_name:"
 msgid "Name"
-msgstr ""
+msgstr "Ime"
 
 msgctxt "field:res.user,rule_groups:"
 msgid "Rules"
-msgstr ""
+msgstr "Pravila"
 
 msgctxt "field:res.user,salt:"
 msgid "Salt"
-msgstr ""
+msgstr "Sol"
 
 msgctxt "field:res.user,sessions:"
 msgid "Sessions"
-msgstr ""
+msgstr "Seje"
 
 msgctxt "field:res.user,signature:"
 msgid "Signature"
-msgstr ""
+msgstr "Podpis"
 
 msgctxt "field:res.user,status_bar:"
 msgid "Status Bar"
-msgstr ""
+msgstr "Statusna vrstica"
 
 msgctxt "field:res.user,timezone:"
 msgid "Timezone"
-msgstr ""
+msgstr "Časovni pas"
 
 msgctxt "field:res.user,warnings:"
 msgid "Warnings"
-msgstr ""
+msgstr "Opozorila"
 
 msgctxt "field:res.user,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Zapisano"
 
 msgctxt "field:res.user,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Zapisal"
 
 msgctxt "field:res.user-ir.action,action:"
 msgid "Action"
-msgstr ""
+msgstr "Ukrep"
 
 msgctxt "field:res.user-ir.action,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Ustvarjeno"
 
 msgctxt "field:res.user-ir.action,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Ustvaril"
 
 msgctxt "field:res.user-ir.action,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:res.user-ir.action,rec_name:"
 msgid "Name"
-msgstr ""
+msgstr "Ime"
 
 msgctxt "field:res.user-ir.action,user:"
 msgid "User"
-msgstr ""
+msgstr "Uporabnik"
 
 msgctxt "field:res.user-ir.action,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Zapisano"
 
 msgctxt "field:res.user-ir.action,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Zapisal"
 
 msgctxt "field:res.user-res.group,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Ustvarjeno"
 
 msgctxt "field:res.user-res.group,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Ustvaril"
 
 msgctxt "field:res.user-res.group,group:"
 msgid "Group"
-msgstr ""
+msgstr "Skupina"
 
 msgctxt "field:res.user-res.group,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:res.user-res.group,rec_name:"
 msgid "Name"
-msgstr ""
+msgstr "Ime"
 
 msgctxt "field:res.user-res.group,user:"
 msgid "User"
-msgstr ""
+msgstr "Uporabnik"
 
 msgctxt "field:res.user-res.group,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Zapisano"
 
 msgctxt "field:res.user-res.group,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Zapisal"
 
 msgctxt "field:res.user.config.start,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:res.user.login.attempt,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Ustvarjeno"
 
 msgctxt "field:res.user.login.attempt,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Ustvaril"
 
 msgctxt "field:res.user.login.attempt,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
+
+msgctxt "field:res.user.login.attempt,login:"
+msgid "Login"
+msgstr "Prijava"
 
 msgctxt "field:res.user.login.attempt,rec_name:"
 msgid "Name"
-msgstr ""
-
-msgctxt "field:res.user.login.attempt,user:"
-msgid "User"
-msgstr ""
+msgstr "Ime"
 
 msgctxt "field:res.user.login.attempt,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Zapisano"
 
 msgctxt "field:res.user.login.attempt,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Zapisal"
 
 msgctxt "field:res.user.warning,always:"
 msgid "Always"
-msgstr ""
+msgstr "Vedno"
 
 msgctxt "field:res.user.warning,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Ustvarjeno"
 
 msgctxt "field:res.user.warning,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Ustvaril"
 
 msgctxt "field:res.user.warning,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:res.user.warning,name:"
 msgid "Name"
-msgstr ""
+msgstr "Naziv"
 
 msgctxt "field:res.user.warning,rec_name:"
 msgid "Name"
-msgstr ""
+msgstr "Ime"
 
 msgctxt "field:res.user.warning,user:"
 msgid "User"
-msgstr ""
+msgstr "Uporabnik"
 
 msgctxt "field:res.user.warning,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Zapisano"
 
 msgctxt "field:res.user.warning,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Zapisal"
 
 msgctxt "help:ir.sequence.type,groups:"
 msgid "Groups allowed to edit the sequences of this type"
-msgstr ""
+msgstr "Skupine, ki omogočajo urejanje ta oštevilčenja"
 
 msgctxt "help:res.user,actions:"
 msgid "Actions that will be run at login"
-msgstr ""
+msgstr "Ukrepi, ki se zaženejo ob prijavi"
 
 msgctxt "model:ir.action,name:act_group_form"
 msgid "Groups"
-msgstr ""
-
-msgctxt "model:ir.action,name:act_request_form"
-msgid "Requests"
-msgstr ""
-
-msgctxt "model:ir.action,name:act_request_link_form"
-msgid "Request Links"
-msgstr ""
+msgstr "Skupine"
 
 msgctxt "model:ir.action,name:act_user_config"
 msgid "Configure Users"
-msgstr ""
+msgstr "Konfiguracija uporabnikov"
 
 msgctxt "model:ir.action,name:act_user_form"
 msgid "Users"
-msgstr ""
+msgstr "Uporabniki"
 
 msgctxt "model:ir.action-res.group,name:"
 msgid "Action - Group"
-msgstr ""
+msgstr "Ukrep - Skupina"
 
 msgctxt "model:ir.cron,name:cron_trigger_time"
 msgid "Run On Time Triggers"
-msgstr ""
+msgstr "Prožilniki za zagon po urniku"
 
 msgctxt "model:ir.model.button-res.group,name:"
 msgid "Model Button - Group"
-msgstr ""
+msgstr "Model Gumb - Skupina"
 
 msgctxt "model:ir.model.field-res.group,name:"
 msgid "Model Field Group Rel"
-msgstr ""
+msgstr "Polje modela - Skupina"
 
 msgctxt "model:ir.rule.group-res.group,name:"
 msgid "Rule Group - Group"
-msgstr ""
+msgstr "Skupina pravila - Skupina"
 
 msgctxt "model:ir.rule.group-res.user,name:"
 msgid "Rule Group - User"
-msgstr ""
+msgstr "Skupina pravila - Uporabnik"
 
 msgctxt "model:ir.sequence.type-res.group,name:"
 msgid "Sequence Type - Group"
-msgstr ""
+msgstr "Tip štetja - Skupina"
 
 msgctxt "model:ir.ui.menu,name:menu_group_form"
 msgid "Groups"
-msgstr ""
-
-msgctxt "model:ir.ui.menu,name:menu_request_form"
-msgid "Requests"
-msgstr ""
-
-msgctxt "model:ir.ui.menu,name:menu_request_link_form"
-msgid "Request Links"
-msgstr ""
+msgstr "Skupine"
 
 msgctxt "model:ir.ui.menu,name:menu_res"
 msgid "Users"
-msgstr ""
+msgstr "Uporabniki"
 
 msgctxt "model:ir.ui.menu,name:menu_user_form"
 msgid "Users"
-msgstr ""
+msgstr "Uporabniki"
 
 msgctxt "model:ir.ui.menu-res.group,name:"
 msgid "UI Menu - Group"
-msgstr ""
+msgstr "UI meni - Skupina"
 
 msgctxt "model:res.group,name:"
 msgid "Group"
-msgstr ""
+msgstr "Skupina"
 
 msgctxt "model:res.group,name:group_admin"
 msgid "Administration"
-msgstr ""
-
-msgctxt "model:res.request,name:"
-msgid "Request"
-msgstr ""
-
-msgctxt "model:res.request.history,name:"
-msgid "Request history"
-msgstr ""
-
-msgctxt "model:res.request.link,name:"
-msgid "Request link"
-msgstr ""
-
-msgctxt "model:res.request.link,name:request_link_cron"
-msgid "Scheduler"
-msgstr ""
-
-msgctxt "model:res.request.reference,name:"
-msgid "Request Reference"
-msgstr ""
+msgstr "Skrbništvo"
 
 msgctxt "model:res.user,name:"
 msgid "User"
-msgstr ""
+msgstr "Uporabnik"
 
 msgctxt "model:res.user,name:user_admin"
 msgid "Administrator"
-msgstr ""
+msgstr "Skrbnik"
 
 msgctxt "model:res.user,name:user_trigger"
 msgid "Cron Trigger"
-msgstr ""
+msgstr "Razporejevalnik za proženje"
 
 msgctxt "model:res.user-ir.action,name:"
 msgid "User - Action"
-msgstr ""
+msgstr "Uporabnik - Ukrep"
 
 msgctxt "model:res.user-res.group,name:"
 msgid "User - Group"
-msgstr ""
+msgstr "Uporabnik - Skupina"
 
 msgctxt "model:res.user.config.start,name:"
 msgid "User Config Init"
-msgstr ""
+msgstr "Začetna nastavitev uporabnika"
 
 msgctxt "model:res.user.login.attempt,name:"
 msgid "Login Attempt"
-msgstr ""
+msgstr "Poskus prijave"
 
 msgctxt "model:res.user.warning,name:"
 msgid "User Warning"
-msgstr ""
-
-msgctxt "selection:res.request,priority:"
-msgid "High"
-msgstr ""
-
-msgctxt "selection:res.request,priority:"
-msgid "Low"
-msgstr ""
-
-msgctxt "selection:res.request,priority:"
-msgid "Normal"
-msgstr ""
-
-msgctxt "selection:res.request,state:"
-msgid "Chatting"
-msgstr ""
-
-msgctxt "selection:res.request,state:"
-msgid "Closed"
-msgstr ""
-
-msgctxt "selection:res.request,state:"
-msgid "Draft"
-msgstr ""
-
-msgctxt "selection:res.request,state:"
-msgid "Waiting"
-msgstr ""
-
-msgctxt "selection:res.request.history,priority:"
-msgid "High"
-msgstr ""
-
-msgctxt "selection:res.request.history,priority:"
-msgid "Low"
-msgstr ""
-
-msgctxt "selection:res.request.history,priority:"
-msgid "Normal"
-msgstr ""
-
-msgctxt "selection:res.request.history,state:"
-msgid "Chatting"
-msgstr ""
-
-msgctxt "selection:res.request.history,state:"
-msgid "Closed"
-msgstr ""
-
-msgctxt "selection:res.request.history,state:"
-msgid "Draft"
-msgstr ""
-
-msgctxt "selection:res.request.history,state:"
-msgid "Waiting"
-msgstr ""
+msgstr "Uporabniško opozorilo"
 
 msgctxt "view:ir.module.module:"
 msgid "Cancel Installation"
-msgstr ""
+msgstr "Prekliči namestitev"
 
 msgctxt "view:ir.module.module:"
 msgid "Cancel Uninstallation"
-msgstr ""
+msgstr "Prekliči odstranitev"
 
 msgctxt "view:ir.module.module:"
 msgid "Cancel Upgrade"
-msgstr ""
+msgstr "Prekliči nadgradnjo"
 
 msgctxt "view:ir.module.module:"
 msgid "Mark for Installation"
-msgstr ""
+msgstr "Označi za namestitev"
 
 msgctxt "view:ir.module.module:"
 msgid "Mark for Uninstallation (beta)"
-msgstr ""
+msgstr "Označi za odstranitev (beta)"
 
 msgctxt "view:ir.module.module:"
 msgid "Mark for Upgrade"
-msgstr ""
+msgstr "Označi za nadgradnjo"
 
 msgctxt "view:res.group:"
 msgid "Access Permissions"
-msgstr ""
+msgstr "Dostop"
 
 msgctxt "view:res.group:"
 msgid "Group"
-msgstr ""
+msgstr "Skupina"
 
 msgctxt "view:res.group:"
 msgid "Groups"
-msgstr ""
+msgstr "Skupine"
 
 msgctxt "view:res.group:"
 msgid "Members"
-msgstr ""
-
-msgctxt "view:res.request.history:"
-msgid "Request History"
-msgstr ""
-
-msgctxt "view:res.request.link:"
-msgid "Request Link"
-msgstr ""
-
-msgctxt "view:res.request.reference:"
-msgid "Request Reference"
-msgstr ""
-
-msgctxt "view:res.request.reference:"
-msgid "Request References"
-msgstr ""
-
-msgctxt "view:res.request:"
-msgid "Close"
-msgstr ""
-
-msgctxt "view:res.request:"
-msgid "References"
-msgstr ""
-
-msgctxt "view:res.request:"
-msgid "Reply"
-msgstr ""
-
-msgctxt "view:res.request:"
-msgid "Request"
-msgstr ""
-
-msgctxt "view:res.request:"
-msgid "Requests"
-msgstr ""
-
-msgctxt "view:res.request:"
-msgid "Send"
-msgstr ""
+msgstr "Člani"
 
 msgctxt "view:res.user.config.start:"
 msgid "Add Users"
-msgstr ""
+msgstr "Dodaj uporabnike"
 
 msgctxt "view:res.user.config.start:"
 msgid "Be careful that the login must be unique!"
-msgstr ""
+msgstr "Upoštevajte, da mora biti prijava edinstvena."
 
 msgctxt "view:res.user.config.start:"
 msgid "You can now add some users into the system."
-msgstr ""
+msgstr "Sedaj lahko v sistem dodajate uporabnike."
 
 msgctxt "view:res.user.warning:"
 msgid "Warning"
-msgstr ""
+msgstr "Opozorilo"
 
 msgctxt "view:res.user.warning:"
 msgid "Warnings"
-msgstr ""
+msgstr "Opozorila"
 
 msgctxt "view:res.user:"
 msgid "Access Permissions"
-msgstr ""
+msgstr "Dostop"
 
 msgctxt "view:res.user:"
 msgid "Actions"
-msgstr ""
+msgstr "Ukrepi"
 
 msgctxt "view:res.user:"
 msgid "Group Membership"
-msgstr ""
+msgstr "Članstvo v skupinah"
 
 msgctxt "view:res.user:"
 msgid "Preferences"
-msgstr ""
+msgstr "Nastavitve"
 
 msgctxt "view:res.user:"
 msgid "User"
-msgstr ""
+msgstr "Uporabnik"
 
 msgctxt "view:res.user:"
 msgid "Users"
-msgstr ""
+msgstr "Uporabniki"
 
 msgctxt "wizard_button:res.user.config,start,end:"
 msgid "Cancel"
-msgstr ""
+msgstr "Prekliči"
 
 msgctxt "wizard_button:res.user.config,start,user:"
 msgid "Ok"
-msgstr ""
+msgstr "V redu"
 
 msgctxt "wizard_button:res.user.config,user,add:"
 msgid "Add"
-msgstr ""
+msgstr "Dodaj"
 
 msgctxt "wizard_button:res.user.config,user,end:"
 msgid "End"
-msgstr ""
+msgstr "Zapri"
diff --git a/trytond/res/request.py b/trytond/res/request.py
deleted file mode 100644
index 4151b50..0000000
--- a/trytond/res/request.py
+++ /dev/null
@@ -1,266 +0,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.
-import datetime
-from ..model import ModelView, ModelSQL, fields
-from ..pyson import Eval, If
-from ..transaction import Transaction
-from ..pool import Pool
-from ..rpc import RPC
-
-__all__ = [
-    'Request', 'RequestLink', 'RequestHistory', 'RequestReference',
-    ]
-
-_STATES = [
-    ('draft', 'Draft'),
-    ('waiting', 'Waiting'),
-    ('chatting', 'Chatting'),
-    ('closed', 'Closed'),
-]
-
-_PRIORITIES = [
-    ('0', 'Low'),
-    ('1', 'Normal'),
-    ('2', 'High'),
-]
-
-_READONLY = If(Eval('state').in_(['waiting', 'closed']),
-    True,
-    If(Eval('state') == 'chatting',
-        Eval('act_from') != Eval('_user'),
-        False))
-_DEPENDS = ['state', 'act_from']
-
-
-class Request(ModelSQL, ModelView):
-    "Request"
-    __name__ = 'res.request'
-    name = fields.Char('Subject', states={
-            'readonly': _READONLY,
-            }, required=True, depends=_DEPENDS)
-    active = fields.Boolean('Active')
-    priority = fields.Selection(_PRIORITIES, 'Priority', states={
-            'readonly': _READONLY,
-            }, required=True, order_field='priority', depends=_DEPENDS)
-    act_from = fields.Many2One('res.user', 'From', required=True,
-       readonly=True)
-    act_to = fields.Many2One('res.user', 'To', required=True,
-            domain=[('active', '=', True)],
-            states={
-                'readonly': _READONLY,
-            }, depends=_DEPENDS)
-    body = fields.Text('Body', states={
-            'readonly': _READONLY,
-            }, depends=_DEPENDS)
-    date_sent = fields.DateTime('Date', readonly=True)
-    trigger_date = fields.DateTime('Trigger Date', states={
-            'readonly': _READONLY,
-            }, depends=_DEPENDS)
-    references = fields.One2Many('res.request.reference', 'request',
-        'References', states={
-            'readonly': If(Eval('state') == 'closed',
-                True,
-                Eval('act_from', 0) != Eval('_user', 0)),
-            }, depends=['state', 'act_from'])
-    number_references = fields.Function(fields.Integer('Number of References',
-        on_change_with=['references']), 'on_change_with_number_references')
-    state = fields.Selection(_STATES, 'State', required=True, readonly=True)
-    history = fields.One2Many('res.request.history', 'request',
-           'History', readonly=True)
-
-    @classmethod
-    def __setup__(cls):
-        super(Request, cls).__setup__()
-        cls.__rpc__.update({
-                'request_get': RPC(),
-                })
-        cls._order.insert(0, ('priority', 'DESC'))
-        cls._order.insert(1, ('trigger_date', 'DESC'))
-        cls._order.insert(2, ('create_date', 'DESC'))
-        cls._buttons.update({
-                'send': {
-                    'invisible': ~Eval('state').in_(['draft', 'chatting']),
-                    'readonly': Eval('act_from') != Eval('_user'),
-                    },
-                'reply': {
-                    'invisible': Eval('state') != 'waiting',
-                    'readonly': Eval('act_to') != Eval('_user'),
-                    },
-                'close': {
-                    'invisible': ~Eval('state').in_(['waiting', 'draft',
-                            'chatting']),
-                    },
-                })
-
-    @staticmethod
-    def default_act_from():
-        return int(Transaction().user)
-
-    @staticmethod
-    def default_state():
-        return 'draft'
-
-    @staticmethod
-    def default_active():
-        return True
-
-    @staticmethod
-    def default_priority():
-        return '1'
-
-    def on_change_with_number_references(self, name=None):
-        return len(self.references or '')
-
-    @classmethod
-    @ModelView.button
-    def send(cls, requests):
-        pool = Pool()
-        RequestHistory = pool.get('res.request.history')
-        to_create = []
-        for request in requests:
-            values = {
-                'request': request.id,
-                'act_from': request.act_from.id,
-                'act_to': request.act_to.id,
-                'body': request.body,
-                'state': request.state,
-                'subject': request.name,
-                'number_references': request.number_references,
-                'priority': request.priority,
-            }
-            if values['body'] and len(values['body']) > 128:
-                values['name'] = values['body'][:125] + '...'
-            else:
-                values['name'] = values['body'] or '/'
-            to_create.append(values)
-        if to_create:
-            RequestHistory.create(to_create)
-        cls.write(requests, {
-            'state': 'waiting',
-            'date_sent': datetime.datetime.now(),
-            })
-
-    @classmethod
-    @ModelView.button
-    def reply(cls, requests):
-        user = Transaction().user
-        for request in requests:
-            cls.write([request], {
-                'state': 'chatting',
-                'act_from': user,
-                'act_to': request.act_from.id,
-                'trigger_date': None,
-                'body': '',
-                })
-
-    @classmethod
-    @ModelView.button
-    def close(cls, requests):
-        cls.write(requests, {'state': 'closed', 'active': False})
-
-    @classmethod
-    def request_get(cls):
-        user = Transaction().user
-        requests = cls.search([
-            ('act_to', '=', user),
-            ['OR',
-                ('trigger_date', '<=', datetime.datetime.now()),
-                ('trigger_date', '=', None),
-            ],
-            ('active', '=', True),
-            ])
-        requests2 = cls.search([
-            ('act_from', '=', user),
-            ('act_to', '!=', user),
-            ('state', '!=', 'draft'),
-            ('active', '=', True),
-            ])
-        return ([r.id for r in requests], [r.id for r in requests2])
-
-
-class RequestLink(ModelSQL, ModelView):
-    "Request link"
-    __name__ = 'res.request.link'
-    name = fields.Char('Name', required=True, translate=True)
-    model = fields.Selection('models_get', 'Model', required=True)
-    priority = fields.Integer('Priority', required=True)
-
-    @classmethod
-    def __setup__(cls):
-        super(RequestLink, cls).__setup__()
-        cls._order.insert(0, ('priority', 'ASC'))
-
-    @staticmethod
-    def default_priority():
-        return 5
-
-    @staticmethod
-    def models_get():
-        pool = Pool()
-        Model = pool.get('ir.model')
-        models = Model.search([])
-        res = []
-        for model in models:
-            res.append((model.model, model.name))
-        return res
-
-
-class RequestHistory(ModelSQL, ModelView):
-    "Request history"
-    __name__ = 'res.request.history'
-    name = fields.Char('Summary', required=True, readonly=True)
-    request = fields.Many2One('res.request', 'Request', required=True,
-       ondelete='CASCADE', select=True, readonly=True)
-    act_from = fields.Many2One('res.user', 'From', required=True,
-       readonly=True)
-    act_to = fields.Many2One('res.user', 'To', required=True, readonly=True)
-    body = fields.Text('Body', readonly=True)
-    date_sent = fields.DateTime('Date sent', required=True, readonly=True)
-    state = fields.Selection(_STATES, 'State', required=True, readonly=True)
-    subject = fields.Char('Subject', required=True, readonly=True)
-    number_references = fields.Integer('References', readonly=True)
-    priority = fields.Selection(_PRIORITIES, 'Priority', required=True,
-            readonly=True)
-
-    @classmethod
-    def __setup__(cls):
-        super(RequestHistory, cls).__setup__()
-        cls._order.insert(0, ('date_sent', 'DESC'))
-
-    @staticmethod
-    def default_name():
-        return 'No Name'
-
-    @staticmethod
-    def default_act_from():
-        return int(Transaction().user)
-
-    @staticmethod
-    def default_act_to():
-        return int(Transaction().user)
-
-    @staticmethod
-    def default_date_sent():
-        return datetime.datetime.now()
-
-    @staticmethod
-    def write(records, vals):
-        pass
-
-
-class RequestReference(ModelSQL, ModelView):
-    "Request Reference"
-    __name__ = 'res.request.reference'
-    _rec_name = 'reference'
-
-    request = fields.Many2One('res.request', 'Request', required=True,
-            ondelete="CASCADE", select=True)
-    reference = fields.Reference('Reference', selection='links_get',
-            required=True)
-
-    @staticmethod
-    def links_get():
-        pool = Pool()
-        RequestLink = pool.get('res.request.link')
-        request_links = RequestLink.search([])
-        return [(x.model, x.name) for x in request_links]
diff --git a/trytond/res/request.xml b/trytond/res/request.xml
deleted file mode 100644
index 649796c..0000000
--- a/trytond/res/request.xml
+++ /dev/null
@@ -1,94 +0,0 @@
-<?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="request_view_tree">
-            <field name="model">res.request</field>
-            <field name="type">tree</field>
-            <field name="name">request_list</field>
-        </record>
-        <record model="ir.ui.view" id="request_view_form">
-            <field name="model">res.request</field>
-            <field name="type">form</field>
-            <field name="name">request_form</field>
-        </record>
-        <record model="ir.action.act_window" id="act_request_form">
-            <field name="name">Requests</field>
-            <field name="res_model">res.request</field>
-        </record>
-        <record model="ir.action.act_window.view"
-            id="act_request_form_view1">
-            <field name="sequence" eval="1"/>
-            <field name="view" ref="request_view_tree"/>
-            <field name="act_window" ref="act_request_form"/>
-        </record>
-        <record model="ir.action.act_window.view"
-            id="act_request_form_view2">
-            <field name="sequence" eval="2"/>
-            <field name="view" ref="request_view_form"/>
-            <field name="act_window" ref="act_request_form"/>
-        </record>
-        <menuitem parent="res.menu_res"
-            action="act_request_form" id="menu_request_form"/>
-        <record model="ir.ui.menu-res.group" id="menu_request_form_group_admin">
-            <field name="menu" ref="menu_request_form"/>
-            <field name="group" ref="group_admin"/>
-        </record>
-
-        <record model="ir.ui.view" id="request_link_view_form">
-            <field name="model">res.request.link</field>
-            <field name="type">form</field>
-            <field name="name">request_link_form</field>
-        </record>
-        <record model="ir.ui.view" id="request_link_view_tree">
-            <field name="model">res.request.link</field>
-            <field name="type">tree</field>
-            <field name="name">request_link_list</field>
-        </record>
-        <record model="ir.action.act_window" id="act_request_link_form">
-            <field name="name">Request Links</field>
-            <field name="res_model">res.request.link</field>
-        </record>
-        <record model="ir.action.act_window.view"
-            id="act_request_link_form_view1">
-            <field name="sequence" eval="10"/>
-            <field name="view" ref="request_link_view_tree"/>
-            <field name="act_window" ref="act_request_link_form"/>
-        </record>
-        <record model="ir.action.act_window.view"
-            id="act_request_link_form_view2">
-            <field name="sequence" eval="20"/>
-            <field name="view" ref="request_link_view_form"/>
-            <field name="act_window" ref="act_request_link_form"/>
-        </record>
-        <menuitem parent="res.menu_res"
-            action="act_request_link_form" id="menu_request_link_form"/>
-        <record model="ir.ui.menu-res.group" id="menu_request_link_form_group_admin">
-            <field name="menu" ref="menu_request_link_form"/>
-            <field name="group" ref="group_admin"/>
-        </record>
-
-        <record model="ir.ui.view" id="request_history_view_tree">
-            <field name="model">res.request.history</field>
-            <field name="type">tree</field>
-            <field name="name">request_history_list</field>
-        </record>
-        <record model="ir.ui.view" id="request_history_view_form">
-            <field name="model">res.request.history</field>
-            <field name="type">form</field>
-            <field name="name">request_history_form</field>
-        </record>
-
-        <record model="ir.ui.view" id="request_reference_view_tree">
-            <field name="model">res.request.reference</field>
-            <field name="type">tree</field>
-            <field name="name">request_reference_list</field>
-        </record>
-        <record model="ir.ui.view" id="request_reference_view_form">
-            <field name="model">res.request.reference</field>
-            <field name="type">form</field>
-            <field name="name">request_reference_form</field>
-        </record>
-    </data>
-</tryton>
diff --git a/trytond/res/tryton.cfg b/trytond/res/tryton.cfg
index d46848b..b59766d 100644
--- a/trytond/res/tryton.cfg
+++ b/trytond/res/tryton.cfg
@@ -5,5 +5,4 @@ xml:
     res.xml
     group.xml
     user.xml
-    request.xml
     ir.xml
diff --git a/trytond/res/user.py b/trytond/res/user.py
index 6c1f08c..2cd6e6d 100644
--- a/trytond/res/user.py
+++ b/trytond/res/user.py
@@ -9,11 +9,13 @@ import time
 import datetime
 from itertools import groupby, ifilter
 from operator import attrgetter
+from sql import Literal
+from sql.aggregate import Count
 
 from ..model import ModelView, ModelSQL, fields
 from ..wizard import Wizard, StateView, Button, StateTransition
 from ..tools import safe_eval
-from ..backend import TableHandler
+from .. import backend
 from ..transaction import Transaction
 from ..cache import Cache
 from ..pool import Pool
@@ -108,6 +110,7 @@ class User(ModelSQL, ModelView):
 
     @classmethod
     def __register__(cls, module_name):
+        TableHandler = backend.get('TableHandler')
         super(User, cls).__register__(module_name)
         table = TableHandler(Transaction().cursor, cls, module_name)
 
@@ -440,9 +443,9 @@ class User(ModelSQL, ModelView):
         if result:
             return result
         cursor = Transaction().cursor
-        cursor.execute('SELECT id, password, salt '
-            'FROM "' + cls._table + '" '
-            'WHERE login = %s AND active', (login,))
+        table = cls.__table__()
+        cursor.execute(*table.select(table.id, table.password, table.salt,
+                where=(table.login == login) & table.active))
         result = cursor.fetchone() or (None, None, None)
         cls._get_login_cache.set(login, result)
         return result
@@ -453,18 +456,17 @@ class User(ModelSQL, ModelView):
         Return user id if password matches
         '''
         LoginAttempt = Pool().get('res.user.login.attempt')
+        time.sleep(2 ** LoginAttempt.count(login) - 1)
         user_id, user_password, salt = cls._get_login(login)
-        if not user_id:
-            return 0
-        password += salt or ''
-        if isinstance(password, unicode):
-            password = password.encode('utf-8')
-        password_sha = hashlib.sha1(password).hexdigest()
-        if password_sha == user_password:
-            LoginAttempt.delete(user_id)
-            return user_id
-        LoginAttempt.add(user_id)
-        time.sleep(2 ** LoginAttempt.count(user_id))
+        if user_id:
+            password += salt or ''
+            if isinstance(password, unicode):
+                password = password.encode('utf-8')
+            password_sha = hashlib.sha1(password).hexdigest()
+            if password_sha == user_password:
+                LoginAttempt.remove(login)
+                return user_id
+        LoginAttempt.add(login)
         return 0
 
 
@@ -475,24 +477,42 @@ class LoginAttempt(ModelSQL):
     the res.user table when in a long running process.
     """
     __name__ = 'res.user.login.attempt'
-    user = fields.Many2One('res.user', 'User', required=True, select=True,
-        ondelete='CASCADE')
+    login = fields.Char('Login')
 
     @classmethod
-    def add(cls, user_id):
-        cls.create([{'user': user_id}])
+    def __register__(cls, module_name):
+        TableHandler = backend.get('TableHandler')
+        super(LoginAttempt, cls).__register__(module_name)
+        table = TableHandler(Transaction().cursor, cls, module_name)
+
+        # Migration from 2.8: remove user
+        table.drop_column('user')
+
+    @staticmethod
+    def delay():
+        return (datetime.datetime.now()
+            - datetime.timedelta(seconds=int(CONFIG['session_timeout'])))
+
+    @classmethod
+    def add(cls, login):
+        cls.delete(cls.search([
+                    ('create_date', '<', cls.delay()),
+                    ]))
+        cls.create([{'login': login}])
 
     @classmethod
-    def delete(cls, user_id):
+    def remove(cls, login):
         cursor = Transaction().cursor
-        cursor.execute('DELETE FROM "' + cls._table + '" WHERE "user" = %s',
-            (user_id,))
+        table = cls.__table__()
+        cursor.execute(*table.delete(where=table.login == login))
 
     @classmethod
-    def count(cls, user_id):
+    def count(cls, login):
         cursor = Transaction().cursor
-        cursor.execute('SELECT count(1) FROM "'
-            + cls._table + '" WHERE "user" = %s', (user_id,))
+        table = cls.__table__()
+        cursor.execute(*table.select(Count(Literal(1)),
+                where=(table.login == login)
+                & (table.create_date >= cls.delay())))
         return cursor.fetchone()[0]
 
 
@@ -534,11 +554,12 @@ class UserGroup(ModelSQL):
 
     @classmethod
     def __register__(cls, module_name):
+        TableHandler = backend.get('TableHandler')
         cursor = Transaction().cursor
         # Migration from 1.0 table name change
         TableHandler.table_rename(cursor, 'res_group_user_rel', cls._table)
         TableHandler.sequence_rename(cursor, 'res_group_user_rel_id_seq',
-                cls._table + '_id_seq')
+            cls._table + '_id_seq')
         # Migration from 2.0 uid and gid rename into user and group
         table = TableHandler(cursor, cls, module_name)
         table.column_rename('uid', 'user')
diff --git a/trytond/res/view/request_form.xml b/trytond/res/view/request_form.xml
deleted file mode 100644
index a422501..0000000
--- a/trytond/res/view/request_form.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?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="Requests" col="6" cursor="act_to">
-    <label name="act_from"/>
-    <field name="act_from"/>
-    <label name="act_to"/>
-    <field name="act_to"/>
-    <group colspan="2" col="4" id="active_ref">
-        <label name="active"/>
-        <field name="active"/>
-        <label name="references"/>
-        <field name="number_references"/>
-    </group>
-    <label name="name"/>
-    <field name="name" colspan="3"/>
-    <label name="priority"/>
-    <field name="priority"/>
-    <notebook colspan="6">
-        <page string="Request" id="request">
-            <separator name="body" colspan="4"/>
-            <field name="body" colspan="4" widget="richtext"/>
-            <field name="history" colspan="4"/>
-            <label name="trigger_date"/>
-            <field name="trigger_date"/>
-            <group col="2" colspan="2" id="buttons">
-                <button name="send" string="Send"/>
-                <button name="reply" string="Reply"/>
-            </group>
-            <label name="state"/>
-            <field name="state"/>
-            <group col="3" colspan="2" id="button">
-                <button name="close" string="Close"/>
-            </group>
-        </page>
-        <page string="References" col="1" id="references">
-            <field name="references"/>
-        </page>
-    </notebook>
-</form>
diff --git a/trytond/res/view/request_history_form.xml b/trytond/res/view/request_history_form.xml
deleted file mode 100644
index 9f1d9a3..0000000
--- a/trytond/res/view/request_history_form.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<?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="Request History" col="6">
-    <label name="act_from"/>
-    <field name="act_from"/>
-    <label name="act_to"/>
-    <field name="act_to"/>
-    <label name="number_references"/>
-    <field name="number_references"/>
-    <label name="subject"/>
-    <field name="subject" colspan="3"/>
-    <label name="priority"/>
-    <field name="priority"/>
-    <field name="body" colspan="6" widget="richtext"/>
-    <label name="date_sent"/>
-    <field name="date_sent" colspan="3"/>
-    <newline/>
-    <label name="state"/>
-    <field name="state" colspan="3"/>
-</form>
diff --git a/trytond/res/view/request_history_list.xml b/trytond/res/view/request_history_list.xml
deleted file mode 100644
index f2362ba..0000000
--- a/trytond/res/view/request_history_list.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-<?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="Request History">
-    <field name="act_from"/>
-    <field name="act_to"/>
-    <field name="name"/>
-    <field name="number_references"/>
-    <field name="date_sent"/>
-    <field name="state"/>
-</tree>
diff --git a/trytond/res/view/request_link_form.xml b/trytond/res/view/request_link_form.xml
deleted file mode 100644
index 5af2853..0000000
--- a/trytond/res/view/request_link_form.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-<?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="Request Link" col="6">
-    <label name="name"/>
-    <field name="name"/>
-    <label name="model"/>
-    <field name="model"/>
-    <label name="priority"/>
-    <field name="priority"/>
-</form>
diff --git a/trytond/res/view/request_link_list.xml b/trytond/res/view/request_link_list.xml
deleted file mode 100644
index ba1f8f5..0000000
--- a/trytond/res/view/request_link_list.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?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="Request Link">
-    <field name="name"/>
-    <field name="model"/>
-</tree>
diff --git a/trytond/res/view/request_list.xml b/trytond/res/view/request_list.xml
deleted file mode 100644
index 2e6eebb..0000000
--- a/trytond/res/view/request_list.xml
+++ /dev/null
@@ -1,15 +0,0 @@
-<?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="Requests">
-    <field name="create_date"/>
-    <field name="act_from"/>
-    <field name="act_to"/>
-    <field name="name"/>
-    <field name="priority"/>
-    <field name="trigger_date"/>
-    <field name="number_references"/>
-    <field name="state"/>
-    <field name="active"/>
-    <field name="body" tree_invisible="1"/>
-</tree>
diff --git a/trytond/res/view/request_reference_form.xml b/trytond/res/view/request_reference_form.xml
deleted file mode 100644
index 9d2f65a..0000000
--- a/trytond/res/view/request_reference_form.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<?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="Request Reference" col="2">
-    <label name="request"/>
-    <field name="request"/>
-    <label name="reference"/>
-    <field name="reference"/>
-</form>
diff --git a/trytond/res/view/request_reference_list.xml b/trytond/res/view/request_reference_list.xml
deleted file mode 100644
index 8a60996..0000000
--- a/trytond/res/view/request_reference_list.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?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="Request References">
-    <field name="request"/>
-    <field name="reference"/>
-</tree>
diff --git a/trytond/server.py b/trytond/server.py
index 2bcafda..23a1989 100644
--- a/trytond/server.py
+++ b/trytond/server.py
@@ -9,12 +9,14 @@ import sys
 import os
 import signal
 import time
-from trytond.config import CONFIG
 from getpass import getpass
-import hashlib
 import threading
-import string
-import random
+
+from trytond.config import CONFIG
+from trytond import backend
+from trytond.pool import Pool
+from trytond.monitor import monitor
+from .transaction import Transaction
 
 
 class TrytonServer(object):
@@ -73,9 +75,6 @@ class TrytonServer(object):
 
     def run(self):
         "Run the server and never return"
-        from trytond.backend import Database
-        from trytond.pool import Pool
-        from trytond.monitor import monitor
         update = bool(CONFIG['init'] or CONFIG['update'])
         init = {}
 
@@ -99,33 +98,27 @@ class TrytonServer(object):
 
         for db_name in CONFIG["db_name"]:
             init[db_name] = False
-            database = Database(db_name).connect()
-            cursor = database.cursor()
-
-            try:
+            with Transaction().start(db_name, 0) as transaction:
+                cursor = transaction.cursor
                 if CONFIG['init']:
                     if not cursor.test():
                         self.logger.info("init db")
-                        Database.init(cursor)
+                        backend.get('Database').init(cursor)
                         init[db_name] = True
                     cursor.commit()
                 elif not cursor.test():
                     raise Exception("'%s' is not a Tryton database!" % db_name)
-            finally:
-                cursor.close()
 
         for db_name in CONFIG["db_name"]:
             if update:
-                cursor = Database(db_name).connect().cursor()
-                try:
+                with Transaction().start(db_name, 0) as transaction:
+                    cursor = transaction.cursor
                     if not cursor.test():
                         raise Exception("'%s' is not a Tryton database!"
                             % db_name)
                     cursor.execute('SELECT code FROM ir_lang '
                         'WHERE translatable')
                     lang = [x[0] for x in cursor.fetchall()]
-                finally:
-                    cursor.close()
             else:
                 lang = None
             Pool(db_name).init(update=update, lang=lang)
@@ -160,19 +153,14 @@ class TrytonServer(object):
                             continue
                         break
 
-                database = Database(db_name).connect()
-                cursor = database.cursor()
-                try:
-                    salt = ''.join(random.sample(
-                        string.letters + string.digits, 8))
-                    password += salt
-                    password = hashlib.sha1(password).hexdigest()
-                    cursor.execute('UPDATE res_user '
-                        'SET password = %s, salt = %s '
-                        'WHERE login = \'admin\'', (password, salt))
-                    cursor.commit()
-                finally:
-                    cursor.close()
+                with Transaction().start(db_name, 0) as transaction:
+                    pool = Pool()
+                    User = pool.get('res.user')
+                    admin, = User.search([('login', '=', 'admin')])
+                    User.write([admin], {
+                            'password': password,
+                            })
+                    transaction.cursor.commit()
 
         if update:
             self.logger.info('Update/Init succeed!')
diff --git a/trytond/test/__init__.py b/trytond/test/__init__.py
deleted file mode 100644
index 8e3d8ab..0000000
--- a/trytond/test/__init__.py
+++ /dev/null
@@ -1,133 +0,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.
-from ..pool import Pool
-from .test import *
-from .model import *
-from .mptt import *
-from .import_data import *
-from .export_data import *
-from .trigger import *
-from .access import *
-from .wizard import *
-from .workflow import *
-from .copy import *
-
-
-def register():
-    Pool.register(
-        Boolean,
-        BooleanDefault,
-        Integer,
-        IntegerDefault,
-        IntegerRequired,
-        Float,
-        FloatDefault,
-        FloatRequired,
-        FloatDigits,
-        Numeric,
-        NumericDefault,
-        NumericRequired,
-        NumericDigits,
-        Char,
-        CharDefault,
-        CharRequired,
-        CharSize,
-        CharTranslate,
-        Text,
-        TextDefault,
-        TextRequired,
-        TextSize,
-        TextTranslate,
-        Sha,
-        ShaDefault,
-        ShaRequired,
-        Date,
-        DateDefault,
-        DateRequired,
-        DateTime,
-        DateTimeDefault,
-        DateTimeRequired,
-        DateTimeFormat,
-        Time,
-        TimeDefault,
-        TimeRequired,
-        TimeFormat,
-        One2One,
-        One2OneTarget,
-        One2OneRelation,
-        One2OneRequired,
-        One2OneRequiredRelation,
-        One2Many,
-        One2ManyTarget,
-        One2ManyRequired,
-        One2ManyRequiredTarget,
-        One2ManyReference,
-        One2ManyReferenceTarget,
-        One2ManySize,
-        One2ManySizeTarget,
-        One2ManySizePYSON,
-        One2ManySizePYSONTarget,
-        Many2Many,
-        Many2ManyTarget,
-        Many2ManyRelation,
-        Many2ManyRequired,
-        Many2ManyRequiredTarget,
-        Many2ManyRequiredRelation,
-        Many2ManyReference,
-        Many2ManyReferenceTarget,
-        Many2ManyReferenceRelation,
-        Many2ManySize,
-        Many2ManySizeTarget,
-        Many2ManySizeRelation,
-        Reference,
-        ReferenceTarget,
-        ReferenceRequired,
-        Property,
-        Selection,
-        SelectionRequired,
-        Dict,
-        DictDefault,
-        DictRequired,
-        Singleton,
-        URLObject,
-        ModelSQLRequiredField,
-        MPTT,
-        ImportDataBoolean,
-        ImportDataInteger,
-        ImportDataIntegerRequired,
-        ImportDataFloat,
-        ImportDataFloatRequired,
-        ImportDataNumeric,
-        ImportDataNumericRequired,
-        ImportDataChar,
-        ImportDataText,
-        ImportDataSha,
-        ImportDataDate,
-        ImportDataDateTime,
-        ImportDataSelection,
-        ImportDataMany2OneTarget,
-        ImportDataMany2One,
-        ImportDataMany2ManyTarget,
-        ImportDataMany2Many,
-        ImportDataMany2ManyRelation,
-        ImportDataOne2Many,
-        ImportDataOne2ManyTarget,
-        ImportDataReferenceSelection,
-        ImportDataReference,
-        ExportDataTarget,
-        ExportData,
-        ExportDataTarget2,
-        ExportDataRelation,
-        Triggered,
-        TriggerAction,
-        TestAccess,
-        TestWizardStart,
-        WorkflowedModel,
-        CopyOne2Many,
-        CopyOne2ManyTarget,
-        CopyOne2ManyReference,
-        CopyOne2ManyReferenceTarget,
-        module='test', type_='model')
-    Pool.register(
-        TestWizard,
-        module='test', type_='wizard')
diff --git a/trytond/tests/__init__.py b/trytond/tests/__init__.py
index e512da1..3ce4543 100644
--- a/trytond/tests/__init__.py
+++ b/trytond/tests/__init__.py
@@ -1,4 +1,147 @@
 #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_tryton import all_suite as suite
+from ..pool import Pool
+from .test import *
+from .model import *
+from .mptt import *
+from .import_data import *
+from .export_data import *
+from .trigger import *
+from .access import *
+from .wizard import *
+from .workflow import *
+from .copy_ import *
+
+
+def register():
+    Pool.register(
+        Boolean,
+        BooleanDefault,
+        Integer,
+        IntegerDefault,
+        IntegerRequired,
+        Float,
+        FloatDefault,
+        FloatRequired,
+        FloatDigits,
+        Numeric,
+        NumericDefault,
+        NumericRequired,
+        NumericDigits,
+        Char,
+        CharDefault,
+        CharRequired,
+        CharSize,
+        CharTranslate,
+        Text,
+        TextDefault,
+        TextRequired,
+        TextSize,
+        TextTranslate,
+        Sha,
+        ShaDefault,
+        ShaRequired,
+        Date,
+        DateDefault,
+        DateRequired,
+        DateTime,
+        DateTimeDefault,
+        DateTimeRequired,
+        DateTimeFormat,
+        Time,
+        TimeDefault,
+        TimeRequired,
+        TimeFormat,
+        One2One,
+        One2OneTarget,
+        One2OneRelation,
+        One2OneRequired,
+        One2OneRequiredRelation,
+        One2OneDomain,
+        One2OneDomainRelation,
+        One2Many,
+        One2ManyTarget,
+        One2ManyRequired,
+        One2ManyRequiredTarget,
+        One2ManyReference,
+        One2ManyReferenceTarget,
+        One2ManySize,
+        One2ManySizeTarget,
+        One2ManySizePYSON,
+        One2ManySizePYSONTarget,
+        Many2Many,
+        Many2ManyTarget,
+        Many2ManyRelation,
+        Many2ManyRequired,
+        Many2ManyRequiredTarget,
+        Many2ManyRequiredRelation,
+        Many2ManyReference,
+        Many2ManyReferenceTarget,
+        Many2ManyReferenceRelation,
+        Many2ManySize,
+        Many2ManySizeTarget,
+        Many2ManySizeRelation,
+        Reference,
+        ReferenceTarget,
+        ReferenceRequired,
+        Property,
+        Selection,
+        SelectionRequired,
+        Dict,
+        DictDefault,
+        DictRequired,
+        Binary,
+        BinaryDefault,
+        BinaryRequired,
+        Singleton,
+        URLObject,
+        ModelSQLRequiredField,
+        ModelSQLTimestamp,
+        MPTT,
+        ImportDataBoolean,
+        ImportDataInteger,
+        ImportDataIntegerRequired,
+        ImportDataFloat,
+        ImportDataFloatRequired,
+        ImportDataNumeric,
+        ImportDataNumericRequired,
+        ImportDataChar,
+        ImportDataText,
+        ImportDataSha,
+        ImportDataDate,
+        ImportDataDateTime,
+        ImportDataSelection,
+        ImportDataMany2OneTarget,
+        ImportDataMany2One,
+        ImportDataMany2ManyTarget,
+        ImportDataMany2Many,
+        ImportDataMany2ManyRelation,
+        ImportDataOne2Many,
+        ImportDataOne2ManyTarget,
+        ImportDataReferenceSelection,
+        ImportDataReference,
+        ExportDataTarget,
+        ExportData,
+        ExportDataTarget2,
+        ExportDataRelation,
+        Triggered,
+        TriggerAction,
+        TestAccess,
+        TestWizardStart,
+        WorkflowedModel,
+        CopyOne2Many,
+        CopyOne2ManyTarget,
+        CopyOne2ManyReference,
+        CopyOne2ManyReferenceTarget,
+        Many2OneTarget,
+        Many2OneDomainValidation,
+        module='tests', type_='model')
+    Pool.register(
+        TestWizard,
+        module='tests', type_='wizard')
+
+
+def suite():
+    from .test_tryton import all_suite
+    return all_suite()
diff --git a/trytond/test/access.py b/trytond/tests/access.py
similarity index 100%
rename from trytond/test/access.py
rename to trytond/tests/access.py
diff --git a/trytond/test/copy.py b/trytond/tests/copy_.py
similarity index 100%
rename from trytond/test/copy.py
rename to trytond/tests/copy_.py
diff --git a/trytond/test/export_data.py b/trytond/tests/export_data.py
similarity index 100%
rename from trytond/test/export_data.py
rename to trytond/tests/export_data.py
diff --git a/trytond/test/import_data.py b/trytond/tests/import_data.py
similarity index 100%
rename from trytond/test/import_data.py
rename to trytond/tests/import_data.py
diff --git a/trytond/test/import_data.xml b/trytond/tests/import_data.xml
similarity index 100%
rename from trytond/test/import_data.xml
rename to trytond/tests/import_data.xml
diff --git a/trytond/test/model.py b/trytond/tests/model.py
similarity index 80%
rename from trytond/test/model.py
rename to trytond/tests/model.py
index 607f6ca..80ed3d4 100644
--- a/trytond/test/model.py
+++ b/trytond/tests/model.py
@@ -3,7 +3,7 @@
 from trytond.model import ModelSingleton, ModelSQL, fields
 
 __all__ = [
-    'Singleton', 'URLObject', 'ModelSQLRequiredField',
+    'Singleton', 'URLObject', 'ModelSQLRequiredField', 'ModelSQLTimestamp',
     ]
 
 
@@ -29,3 +29,8 @@ class ModelSQLRequiredField(ModelSQL):
 
     integer = fields.Integer(string="integer", required=True)
     desc = fields.Char(string="desc", required=True)
+
+
+class ModelSQLTimestamp(ModelSQL):
+    'Model to test timestamp'
+    __name__ = 'test.modelsql.timestamp'
diff --git a/trytond/test/mptt.py b/trytond/tests/mptt.py
similarity index 79%
rename from trytond/test/mptt.py
rename to trytond/tests/mptt.py
index f4b67ba..ee9486d 100644
--- a/trytond/test/mptt.py
+++ b/trytond/tests/mptt.py
@@ -12,9 +12,6 @@ class MPTT(ModelSQL, ModelView):
     'Modified Preorder Tree Traversal'
     __name__ = 'test.mptt'
     name = fields.Char('Name', required=True)
-    sequence = fields.Integer('Sequence',
-        order_field='(%(table)s.sequence IS NULL) %(order)s, '
-        '%(table)s.sequence %(order)s')
     parent = fields.Many2One('test.mptt', "Parent", select=True,
             left="left", right="right")
     left = fields.Integer('Left', required=True, select=True)
@@ -23,16 +20,16 @@ class MPTT(ModelSQL, ModelView):
     active = fields.Boolean('Active')
 
     @classmethod
-    def __setup__(cls):
-        super(MPTT, cls).__setup__()
-        cls._order.insert(0, ('sequence', 'ASC'))
-
-    @classmethod
     def validate(cls, record):
         super(MPTT, cls).validate(record)
         cls.check_recursion(record)
 
     @staticmethod
+    def order_sequence(tables):
+        table, _ = tables[None]
+        return [table.sequence == None, table.sequence]
+
+    @staticmethod
     def default_active():
         return True
 
diff --git a/trytond/test/sequence.xml b/trytond/tests/sequence.xml
similarity index 100%
rename from trytond/test/sequence.xml
rename to trytond/tests/sequence.xml
diff --git a/trytond/test/test.py b/trytond/tests/test.py
similarity index 89%
rename from trytond/test/test.py
rename to trytond/tests/test.py
index 66de829..6efeba4 100644
--- a/trytond/test/test.py
+++ b/trytond/tests/test.py
@@ -18,7 +18,7 @@ __all__ = [
     'DateTime', 'DateTimeDefault', 'DateTimeRequired', 'DateTimeFormat',
     'Time', 'TimeDefault', 'TimeRequired', 'TimeFormat',
     'One2One', 'One2OneTarget', 'One2OneRelation', 'One2OneRequired',
-    'One2OneRequiredRelation',
+    'One2OneRequiredRelation', 'One2OneDomain', 'One2OneDomainRelation',
     'One2Many', 'One2ManyTarget',
     'One2ManyRequired', 'One2ManyRequiredTarget',
     'One2ManyReference', 'One2ManyReferenceTarget',
@@ -34,6 +34,8 @@ __all__ = [
     'Property',
     'Selection', 'SelectionRequired',
     'Dict', 'DictDefault', 'DictRequired',
+    'Binary', 'BinaryDefault', 'BinaryRequired',
+    'Many2OneDomainValidation', 'Many2OneTarget',
     ]
 
 
@@ -389,6 +391,32 @@ class One2OneRequiredRelation(ModelSQL):
             ]
 
 
+class One2OneDomain(ModelSQL):
+    'One2One'
+    __name__ = 'test.one2one_domain'
+    name = fields.Char('Name', required=True)
+    one2one = fields.One2One('test.one2one_domain.relation', 'origin',
+        'target', string='One2One', help='Test one2one',
+        domain=[('name', '=', 'domain')])
+
+
+class One2OneDomainRelation(ModelSQL):
+    'One2One Relation'
+    __name__ = 'test.one2one_domain.relation'
+    origin = fields.Many2One('test.one2one_domain', 'Origin')
+    target = fields.Many2One('test.one2one.target', 'Target')
+
+    @classmethod
+    def __setup__(cls):
+        super(One2OneDomainRelation, cls).__setup__()
+        cls._sql_constraints += [
+            ('origin_unique', 'UNIQUE(origin)',
+                'Origin must be unique'),
+            ('target_unique', 'UNIQUE(target)',
+                'Target must be unique'),
+            ]
+
+
 class One2Many(ModelSQL):
     'One2Many Relation'
     __name__ = 'test.one2many'
@@ -639,3 +667,48 @@ class DictRequired(ModelSQL):
     'Dict Required'
     __name__ = 'test.dict_required'
     dico = fields.Dict(None, 'Test Dict', required=True)
+
+
+class Binary(ModelSQL):
+    'Binary'
+    __name__ = 'test.binary'
+    binary = fields.Binary('Binary')
+
+
+class BinaryDefault(ModelSQL):
+    'Binary Default'
+    __name__ = 'test.binary_default'
+    binary = fields.Binary('Binary Default')
+
+    @staticmethod
+    def default_binary():
+        return buffer('default')
+
+
+class BinaryRequired(ModelSQL):
+    'Binary Required'
+    __name__ = 'test.binary_required'
+    binary = fields.Binary('Binary Required', required=True)
+
+
+class Many2OneTarget(ModelSQL):
+    "Many2One Domain Validation Target"
+    __name__ = 'test.many2one_target'
+
+    active = fields.Boolean('Active')
+    value = fields.Integer('Value')
+
+    @staticmethod
+    def default_active():
+        return True
+
+
+class Many2OneDomainValidation(ModelSQL):
+    "Many2One Domain Validation"
+    __name__ = 'test.many2one_domainvalidation'
+    many2one = fields.Many2One('test.many2one_target',
+        'many2one',
+        domain=[
+            ('value', '>', 5),
+            ])
+    dummy = fields.Char('Dummy')
diff --git a/trytond/tests/test_access.py b/trytond/tests/test_access.py
index 5f77ba3..5efe63f 100644
--- a/trytond/tests/test_access.py
+++ b/trytond/tests/test_access.py
@@ -14,7 +14,7 @@ class ModelAccessTestCase(unittest.TestCase):
     '''
 
     def setUp(self):
-        install_module('test')
+        install_module('tests')
         self.model_access = POOL.get('ir.model.access')
         self.test_access = POOL.get('test.access')
         self.model = POOL.get('ir.model')
@@ -359,7 +359,7 @@ class ModelFieldAccessTestCase(unittest.TestCase):
     '''
 
     def setUp(self):
-        install_module('test')
+        install_module('tests')
         self.field_access = POOL.get('ir.model.field.access')
         self.test_access = POOL.get('test.access')
         self.field = POOL.get('ir.model.field')
diff --git a/trytond/tests/test_copy.py b/trytond/tests/test_copy.py
index e6cc8e9..164d5c6 100644
--- a/trytond/tests/test_copy.py
+++ b/trytond/tests/test_copy.py
@@ -14,7 +14,7 @@ class CopyTestCase(unittest.TestCase):
     '''
 
     def setUp(self):
-        install_module('test')
+        install_module('tests')
         self.one2many = POOL.get('test.copy.one2many')
         self.one2many_target = POOL.get('test.copy.one2many.target')
         self.one2many_reference = POOL.get('test.copy.one2many_reference')
diff --git a/trytond/tests/test_exportdata.py b/trytond/tests/test_exportdata.py
index e88b9df..6b9efbf 100644
--- a/trytond/tests/test_exportdata.py
+++ b/trytond/tests/test_exportdata.py
@@ -24,7 +24,7 @@ class ExportDataTestCase(unittest.TestCase):
     '''
 
     def setUp(self):
-        install_module('test')
+        install_module('tests')
         self.export_data = POOL.get('test.export_data')
         self.export_data_target = POOL.get('test.export_data.target')
         self.export_data_relation = POOL.get('test.export_data.relation')
diff --git a/trytond/tests/test_fields.py b/trytond/tests/test_fields.py
index 8f5b779..0d7ae44 100644
--- a/trytond/tests/test_fields.py
+++ b/trytond/tests/test_fields.py
@@ -16,6 +16,7 @@ from decimal import Decimal
 from trytond.tests.test_tryton import POOL, DB_NAME, USER, CONTEXT, \
         install_module
 from trytond.transaction import Transaction
+from trytond.exceptions import UserError
 
 
 class FieldsTestCase(unittest.TestCase):
@@ -24,7 +25,7 @@ class FieldsTestCase(unittest.TestCase):
     '''
 
     def setUp(self):
-        install_module('test')
+        install_module('tests')
         self.boolean = POOL.get('test.boolean')
         self.boolean_default = POOL.get('test.boolean_default')
 
@@ -75,6 +76,7 @@ class FieldsTestCase(unittest.TestCase):
         self.one2one = POOL.get('test.one2one')
         self.one2one_target = POOL.get('test.one2one.target')
         self.one2one_required = POOL.get('test.one2one_required')
+        self.one2one_domain = POOL.get('test.one2one_domain')
 
         self.one2many = POOL.get('test.one2many')
         self.one2many_target = POOL.get('test.one2many.target')
@@ -109,6 +111,13 @@ class FieldsTestCase(unittest.TestCase):
         self.dict_default = POOL.get('test.dict_default')
         self.dict_required = POOL.get('test.dict_required')
 
+        self.binary = POOL.get('test.binary')
+        self.binary_default = POOL.get('test.binary_default')
+        self.binary_required = POOL.get('test.binary_required')
+
+        self.m2o_domain_validation = POOL.get('test.many2one_domainvalidation')
+        self.m2o_target = POOL.get('test.many2one_target')
+
     def test0010boolean(self):
         '''
         Test Boolean.
@@ -2242,11 +2251,6 @@ class FieldsTestCase(unittest.TestCase):
                         }])
             self.assert_(time7)
 
-            time8, = self.time.create([{
-                        'time': False,
-                        }])
-            self.assert_(time8)
-
             time9, = self.time.create([{
                         'time': evening.replace(microsecond=1),
                         }])
@@ -2372,6 +2376,23 @@ class FieldsTestCase(unittest.TestCase):
                         }])
             self.assert_(one2one3)
 
+            target4, = self.one2one_target.create([{
+                        'name': 'target4',
+                        }])
+            self.assertRaises(Exception, self.one2one_domain.create, [{
+                        'name': 'one2one4',
+                        'one2one': target4.id,
+                        }])
+            transaction.cursor.rollback()
+
+            target5, = self.one2one_target.create([{
+                        'name': 'domain',
+                        }])
+            one2one5, = self.one2one_domain.create([{
+                        'name': 'one2one5',
+                        'one2one': target5.id,
+                        }])
+
             transaction.cursor.rollback()
 
     def test0120one2many(self):
@@ -3142,7 +3163,7 @@ class FieldsTestCase(unittest.TestCase):
 
             transaction.cursor.rollback()
 
-    def test_0160selection(self):
+    def test0160selection(self):
         with Transaction().start(DB_NAME, USER,
                 context=CONTEXT) as transaction:
             selection1, = self.selection.create([{'select': 'arabic'}])
@@ -3217,6 +3238,62 @@ class FieldsTestCase(unittest.TestCase):
                 [{'dico': {}}])
             transaction.cursor.rollback()
 
+    def test0180binary(self):
+        with Transaction().start(DB_NAME, USER,
+                context=CONTEXT) as transaction:
+            bin1, = self.binary.create([{
+                        'binary': buffer('foo'),
+                        }])
+            self.assert_(bin1.binary == buffer('foo'))
+
+            self.binary.write([bin1], {'binary': buffer('bar')})
+            self.assert_(bin1.binary == buffer('bar'))
+
+            with transaction.set_context({'test.binary.binary': 'size'}):
+                bin1_size = self.binary(bin1.id)
+                self.assert_(bin1_size.binary == len('bar'))
+                self.assert_(bin1_size.binary != buffer('bar'))
+
+            bin2, = self.binary.create([{}])
+            self.assert_(bin2.binary is None)
+
+            bin3, = self.binary_default.create([{}])
+            self.assert_(bin3.binary == buffer('default'))
+
+            self.assertRaises(Exception, self.binary_required.create, [{}])
+            transaction.cursor.rollback()
+
+            bin4, = self.binary_required.create([{'binary': buffer('baz')}])
+            self.assert_(bin4.binary == buffer('baz'))
+
+            self.assertRaises(Exception, self.binary_required.create,
+                [{'binary': buffer('')}])
+
+            transaction.cursor.rollback()
+
+    def test0190many2one(self):
+        with Transaction().start(DB_NAME, USER,
+                context=CONTEXT) as transaction:
+
+            # Not respecting the domain raise an Error
+            m2o_1, = self.m2o_target.create([{'value': 1}])
+            self.assertRaises(UserError, self.m2o_domain_validation.create,
+                [{'many2one': m2o_1}])
+
+            # Respecting the domain works
+            m2o_6, = self.m2o_target.create([{'value': 6}])
+            domain, = self.m2o_domain_validation.create([{'many2one': m2o_6}])
+            self.assert_(domain)
+            self.assertEqual(domain.many2one.value, 6)
+
+            # Inactive records are taken into account
+            m2o_6.active = False
+            m2o_6.save()
+            domain.dummy = 'Dummy'
+            domain.save()
+
+            transaction.cursor.rollback()
+
 
 def suite():
     return unittest.TestLoader().loadTestsFromTestCase(FieldsTestCase)
diff --git a/trytond/tests/test_importdata.py b/trytond/tests/test_importdata.py
index 7bf7686..a3dc761 100644
--- a/trytond/tests/test_importdata.py
+++ b/trytond/tests/test_importdata.py
@@ -14,7 +14,7 @@ class ImportDataTestCase(unittest.TestCase):
     '''
 
     def setUp(self):
-        install_module('test')
+        install_module('tests')
         self.boolean = POOL.get('test.import_data.boolean')
         self.integer = POOL.get('test.import_data.integer')
         self.integer_required = POOL.get('test.import_data.integer_required')
@@ -376,7 +376,7 @@ class ImportDataTestCase(unittest.TestCase):
                 [['Test']]), (1, 0, 0, 0))
 
             self.assertEqual(self.many2one.import_data(['many2one:id'],
-                [['test.import_data_many2one_target_test']]), (1, 0, 0, 0))
+                [['tests.import_data_many2one_target_test']]), (1, 0, 0, 0))
 
             self.assertEqual(self.many2one.import_data(['many2one'],
                 [['']]), (1, 0, 0, 0))
@@ -394,7 +394,7 @@ class ImportDataTestCase(unittest.TestCase):
                 [['foo']])[0], -1)
 
             self.assertEqual(self.many2one.import_data(['many2one:id'],
-                [['test.foo']])[0], -1)
+                [['tests.foo']])[0], -1)
 
             transaction.cursor.rollback()
 
@@ -408,14 +408,14 @@ class ImportDataTestCase(unittest.TestCase):
                 [['Test 1']]), (1, 0, 0, 0))
 
             self.assertEqual(self.many2many.import_data(['many2many:id'],
-                [['test.import_data_many2many_target_test1']]), (1, 0, 0, 0))
+                [['tests.import_data_many2many_target_test1']]), (1, 0, 0, 0))
 
             self.assertEqual(self.many2many.import_data(['many2many'],
                 [['Test 1,Test 2']]), (1, 0, 0, 0))
 
             self.assertEqual(self.many2many.import_data(['many2many:id'],
-                [['test.import_data_many2many_target_test1,'
-                    'test.import_data_many2many_target_test2']]),
+                [['tests.import_data_many2many_target_test1,'
+                    'tests.import_data_many2many_target_test2']]),
                 (1, 0, 0, 0))
 
             self.assertEqual(self.many2many.import_data(['many2many'],
@@ -485,7 +485,7 @@ class ImportDataTestCase(unittest.TestCase):
 
             self.assertEqual(self.reference.import_data(['reference:id'],
                 [['test.import_data.reference.selection,'
-                    'test.import_data_reference_selection_test']]),
+                    'tests.import_data_reference_selection_test']]),
                 (1, 0, 0, 0))
             reference, = self.reference.search([])
             self.assertEqual(reference.reference.__name__,
diff --git a/trytond/tests/test_mixins.py b/trytond/tests/test_mixins.py
index 2bae225..be6ecf2 100644
--- a/trytond/tests/test_mixins.py
+++ b/trytond/tests/test_mixins.py
@@ -16,7 +16,7 @@ class UrlTestCase(unittest.TestCase):
     "Test URL generation"
 
     def setUp(self):
-        install_module('test')
+        install_module('tests')
         self.urlmodel = POOL.get('test.urlobject')
         self.urlwizard = POOL.get('test.test_wizard', type='wizard')
         self.hostname = HOSTNAME
diff --git a/trytond/tests/test_modelsingleton.py b/trytond/tests/test_modelsingleton.py
index 915bb37..a066d38 100644
--- a/trytond/tests/test_modelsingleton.py
+++ b/trytond/tests/test_modelsingleton.py
@@ -15,7 +15,7 @@ class ModelSingletonTestCase(unittest.TestCase):
     '''
 
     def setUp(self):
-        install_module('test')
+        install_module('tests')
         self.singleton = POOL.get('test.singleton')
 
     def test0010read(self):
@@ -34,11 +34,13 @@ class ModelSingletonTestCase(unittest.TestCase):
 
             singleton, = self.singleton.read([1], [
                 'create_uid',
+                'create_uid.rec_name',
                 'create_date',
                 'write_uid',
                 'write_date',
                 ])
             self.assertEqual(singleton['create_uid'], USER)
+            self.assertEqual(singleton['create_uid.rec_name'], 'Administrator')
             self.assert_(isinstance(singleton['create_date'], datetime))
             self.assertEqual(singleton['write_uid'], None)
             self.assertEqual(singleton['write_date'], None)
diff --git a/trytond/tests/test_modelsql.py b/trytond/tests/test_modelsql.py
index 2419a60..2bedafc 100644
--- a/trytond/tests/test_modelsql.py
+++ b/trytond/tests/test_modelsql.py
@@ -4,9 +4,10 @@
 # repository contains the full copyright notices and license terms.
 
 import unittest
+import time
 
 from trytond.config import CONFIG
-from trytond.exceptions import UserError
+from trytond.exceptions import UserError, ConcurrencyException
 from trytond.transaction import Transaction
 from trytond.tests.test_tryton import POOL, DB_NAME, USER, CONTEXT, \
     install_module
@@ -18,8 +19,9 @@ class ModelSQLTestCase(unittest.TestCase):
     '''
 
     def setUp(self):
-        install_module('test')
+        install_module('tests')
         self.modelsql = POOL.get('test.modelsql')
+        self.modelsql_timestamp = POOL.get('test.modelsql.timestamp')
 
     def test0010required_field_missing(self):
         '''
@@ -46,6 +48,42 @@ class ModelSQLTestCase(unittest.TestCase):
                     continue
                 self.fail('UserError should be caught')
 
+    def test0020check_timestamp(self):
+        '''
+        Test check timestamp.
+        '''
+        # cursor must be committed between each changes otherwise NOW() returns
+        # always the same timestamp.
+        with Transaction().start(DB_NAME, USER,
+                context=CONTEXT) as transaction:
+            cursor = transaction.cursor
+            record, = self.modelsql_timestamp.create([{}])
+            cursor.commit()
+
+            timestamp = self.modelsql_timestamp.read([record.id],
+                ['_timestamp'])[0]['_timestamp']
+
+            if CONFIG['db_type'] == 'sqlite':
+                # timestamp precision of sqlite is the second
+                time.sleep(1)
+
+            self.modelsql_timestamp.write([record], {})
+            cursor.commit()
+
+            transaction.timestamp[str(record)] = timestamp
+            self.assertRaises(ConcurrencyException,
+                self.modelsql_timestamp.write, [record], {})
+
+            transaction.timestamp[str(record)] = timestamp
+            self.assertRaises(ConcurrencyException,
+                self.modelsql_timestamp.delete, [record])
+
+            transaction.timestamp.pop(str(record), None)
+            self.modelsql_timestamp.write([record], {})
+            cursor.commit()
+            self.modelsql_timestamp.delete([record])
+            cursor.commit()
+
 
 def suite():
     return unittest.TestLoader().loadTestsFromTestCase(ModelSQLTestCase)
diff --git a/trytond/tests/test_mptt.py b/trytond/tests/test_mptt.py
index 62554b6..faff5a3 100644
--- a/trytond/tests/test_mptt.py
+++ b/trytond/tests/test_mptt.py
@@ -2,6 +2,7 @@
 # -*- 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.
+import sys
 import unittest
 from trytond.tests.test_tryton import POOL, DB_NAME, USER, CONTEXT, \
         install_module
@@ -14,15 +15,13 @@ class MPTTTestCase(unittest.TestCase):
     '''
 
     def setUp(self):
-        install_module('test')
+        install_module('tests')
         self.mptt = POOL.get('test.mptt')
 
-    def CheckTree(self, parent_id=False, left=0, right=0):
+    def CheckTree(self, parent_id=None, left=-1, right=sys.maxint):
         childs = self.mptt.search([
                 ('parent', '=', parent_id),
-                ])
-        child_index = dict((x.id, i) for i, x in enumerate(childs))
-        childs.sort(key=lambda x: child_index[x.id])
+                ], order=[('left', 'ASC')])
         for child in childs:
             assert child.left > left, \
                 '%s: left %d <= parent left %d' % \
@@ -30,21 +29,21 @@ class MPTTTestCase(unittest.TestCase):
             assert child.left < child.right, \
                 '%s: left %d >= right %d' % \
                 (child, child.left, child.right)
-            assert right == 0 or child.right < right, \
+            assert child.right < right, \
                 '%s: right %d >= parent right %d' % \
                 (child, child.right, right)
             self.CheckTree(child.id, left=child.left,
                 right=child.right)
-        next_left = 0
+        next_left = -1
         for child in childs:
             assert child.left > next_left, \
                 '%s: left %d <= next left %d' % \
                 (child, child.left, next_left)
             next_left = child.right
         childs.reverse()
-        previous_right = 0
+        previous_right = sys.maxint
         for child in childs:
-            assert previous_right == 0 or child.right < previous_right, \
+            assert child.right < previous_right, \
                 '%s: right %d >= previous right %d' \
                 % (child, child.right, previous_right)
             previous_right = child.left
@@ -65,62 +64,28 @@ class MPTTTestCase(unittest.TestCase):
         for record in records:
             self.ReParent(record)
 
-    def ReOrder(self, parent=None):
-        records = self.mptt.search([
-                ('parent', '=', parent),
-                ])
-        if not records:
-            return
-        i = len(records)
-        for record in records:
-            record.sequence = i
-            record.save()
-            i -= 1
-        i = 0
-        for record in records:
-            record.sequence = i
-            record.save()
-            i += 1
-        for record in records:
-            self.ReOrder(record)
-
-        records = self.mptt.search([])
-        self.mptt.write(records, {
-                'sequence': 0,
-                })
-
     def test0010create(self):
         '''
         Create tree.
         '''
         with Transaction().start(DB_NAME, USER,
                 context=CONTEXT) as transaction:
-            new_records = [None]
+            new_records = [None, None, None]
             for j in range(3):
                 parent_records = new_records
                 new_records = []
                 k = 0
                 for parent_record in parent_records:
-                    for i in range(3):
-                        new_records += self.mptt.create([{
-                                    'name': 'Test %d %d %d' % (j, k, i),
-                                    'parent': (parent_record.id
-                                            if parent_record else None),
-                                    }])
+                    new_records += self.mptt.create([{
+                                'name': 'Test %d %d %d' % (j, k, i),
+                                'parent': (parent_record.id
+                                    if parent_record else None),
+                                } for i in range(3)])
                     k += 1
             self.CheckTree()
 
             transaction.cursor.commit()
 
-    def test0020reorder(self):
-        '''
-        Re-order.
-        '''
-        with Transaction().start(DB_NAME, USER,
-                context=CONTEXT) as transaction:
-            self.ReOrder()
-            transaction.cursor.rollback()
-
     def test0030reparent(self):
         '''
         Re-parent.
@@ -141,8 +106,6 @@ class MPTTTestCase(unittest.TestCase):
             self.CheckTree()
             self.ReParent()
             self.CheckTree()
-            self.ReOrder()
-            self.CheckTree()
 
             transaction.cursor.rollback()
 
@@ -164,8 +127,6 @@ class MPTTTestCase(unittest.TestCase):
                     })
             self.ReParent()
             self.CheckTree()
-            self.ReOrder()
-            self.CheckTree()
 
             transaction.cursor.rollback()
 
diff --git a/trytond/tests/test_pyson.py b/trytond/tests/test_pyson.py
index 2c3e712..8687c32 100644
--- a/trytond/tests/test_pyson.py
+++ b/trytond/tests/test_pyson.py
@@ -532,11 +532,11 @@ class PYSONTestCase(unittest.TestCase):
 
         eval = pyson.PYSONEncoder().encode(['id', pyson.If(pyson.Not(
             pyson.In('company', pyson.Eval('context', {}))), '=', '!='),
-            pyson.Get(pyson.Eval('context', {}), 'company', 0)])
+            pyson.Get(pyson.Eval('context', {}), 'company', -1)])
         self.assert_(pyson.PYSONDecoder({'context': {'company': 1}}
             ).decode(eval) == ['id', '!=', 1])
         self.assert_(pyson.PYSONDecoder({'context': {}}
-            ).decode(eval) == ['id', '=', 0])
+            ).decode(eval) == ['id', '=', -1])
 
 
 def suite():
diff --git a/trytond/tests/test_sequence.py b/trytond/tests/test_sequence.py
index ab0454e..0e3b870 100644
--- a/trytond/tests/test_sequence.py
+++ b/trytond/tests/test_sequence.py
@@ -15,7 +15,7 @@ class SequenceTestCase(unittest.TestCase):
     '''
 
     def setUp(self):
-        install_module('test')
+        install_module('tests')
         self.sequence = POOL.get('ir.sequence')
 
     def test0010incremental(self):
@@ -36,13 +36,13 @@ class SequenceTestCase(unittest.TestCase):
             self.sequence.write([sequence], {
                     'number_increment': 10,
                     })
-            self.assertEqual(self.sequence.get_id([sequence]), '2')
-            self.assertEqual(self.sequence.get_id([sequence]), '12')
+            self.assertEqual(self.sequence.get_id(sequence), '2')
+            self.assertEqual(self.sequence.get_id(sequence), '12')
 
             self.sequence.write([sequence], {
                     'padding': 3,
                     })
-            self.assertEqual(self.sequence.get_id([sequence]), '022')
+            self.assertEqual(self.sequence.get_id(sequence), '022')
 
             transaction.cursor.rollback()
 
diff --git a/trytond/tests/test_tools.py b/trytond/tests/test_tools.py
index 3a04553..86881af 100644
--- a/trytond/tests/test_tools.py
+++ b/trytond/tests/test_tools.py
@@ -5,6 +5,8 @@
 
 import unittest
 import datetime
+import sql
+import sql.operators
 
 from trytond.tools import reduce_ids, safe_eval, datetime_strftime, \
     reduce_domain
@@ -14,62 +16,64 @@ class ToolsTestCase(unittest.TestCase):
     '''
     Test tools.
     '''
+    table = sql.Table('test')
 
     def test0000reduce_ids_empty(self):
         '''
         Test reduce_ids empty list.
         '''
-        self.assert_(('(%s)', [False]) == reduce_ids('id', []))
+        self.assertEqual(reduce_ids(self.table.id, []), sql.Literal(False))
 
     def test0010reduce_ids_continue(self):
         '''
         Test reduce_ids continue list.
         '''
-        self.assert_(('(((id >= %s) AND (id <= %s)))', [0, 9])
-            == reduce_ids('id', range(10)))
+        self.assertEqual(reduce_ids(self.table.id, range(10)),
+            sql.operators.Or(((self.table.id >= 0) & (self.table.id <= 9),)))
 
     def test0020reduce_ids_one_hole(self):
         '''
         Test reduce_ids continue list with one hole.
         '''
-        self.assert_(('(((id >= %s) AND (id <= %s)) OR '
-                '((id >= %s) AND (id <= %s)))', [0, 9, 20, 29])
-            == reduce_ids('id', range(10) + map(lambda x: x + 20, range(10))))
+        self.assertEqual(reduce_ids(self.table.id, range(10) + range(20, 30)),
+            ((self.table.id >= 0) & (self.table.id <= 9))
+            | ((self.table.id >= 20) & (self.table.id <= 29)))
 
     def test0030reduce_ids_short_continue(self):
         '''
         Test reduce_ids short continue list.
         '''
-        self.assert_(('((id IN (%s,%s,%s,%s)))', [0, 1, 2, 3])
-            == reduce_ids('id', range(4)))
+        self.assertEqual(reduce_ids(self.table.id, range(4)),
+            sql.operators.Or((self.table.id.in_(range(4)),)))
 
     def test0040reduce_ids_complex(self):
         '''
         Test reduce_ids complex list.
         '''
-        self.assertEqual(('(((id >= %s) AND (id <= %s)) OR '
-                '(id IN (%s,%s,%s,%s,%s)))', [0, 14, 25, 26, 27, 28, 29]),
-            reduce_ids('id', range(10) + map(lambda x: x + 25, range(5))
-                + map(lambda x: x + 5, range(10))))
+        self.assertEqual(reduce_ids(self.table.id,
+                range(10) + range(25, 30) + range(15, 20)),
+            (((self.table.id >= 0) & (self.table.id <= 14))
+                | (self.table.id.in_(range(25, 30)))))
 
     def test0050reduce_ids_complex_small_continue(self):
         '''
         Test reduce_ids complex list with small continue.
         '''
-        self.assertEqual(('(((id >= %s) AND (id <= %s)) '
-                'OR (id IN (%s,%s,%s,%s)))', [1, 12, 15, 18, 19, 21]),
-            reduce_ids('id', [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 15, 18,
-                    19, 21]))
+        self.assertEqual(reduce_ids(self.table.id,
+                [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 15, 18, 19, 21]),
+            (((self.table.id >= 1) & (self.table.id <= 12))
+                | (self.table.id.in_([15, 18, 19, 21]))))
 
     def test0055reduce_ids_float(self):
         '''
         Test reduce_ids with integer as float.
         '''
-        self.assert_(('(((id >= %s) AND (id <= %s)) OR (id IN (%s,%s,%s,%s)))',
-                [1.0, 12.0, 15.0, 18.0, 19.0, 21.0])
-            == reduce_ids('id', [1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0,
-                    10.0, 11.0, 12.0, 15.0, 18.0, 19.0, 21.0]))
-        self.assertRaises(AssertionError, reduce_ids, 'id', [1.1])
+        self.assertEqual(reduce_ids(self.table.id,
+                [1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0,
+                    15.0, 18.0, 19.0, 21.0]),
+            (((self.table.id >= 1.0) & (self.table.id <= 12.0))
+                | (self.table.id.in_([15.0, 18.0, 19.0, 21.0]))))
+        self.assertRaises(AssertionError, reduce_ids, self.table.id, [1.1])
 
     def test0060safe_eval_builtin(self):
         '''
diff --git a/trytond/tests/test_transaction.py b/trytond/tests/test_transaction.py
index 4d78aff..6928a98 100644
--- a/trytond/tests/test_transaction.py
+++ b/trytond/tests/test_transaction.py
@@ -34,7 +34,7 @@ class TransactionTestCase(unittest.TestCase):
     '''
 
     def setUp(self):
-        install_module('test')
+        install_module('tests')
 
     def test0010nonexistdb(self):
         '''
diff --git a/trytond/tests/test_trigger.py b/trytond/tests/test_trigger.py
index 0b9df95..c54aa4c 100644
--- a/trytond/tests/test_trigger.py
+++ b/trytond/tests/test_trigger.py
@@ -27,7 +27,7 @@ except ImportError:
             yield tuple(pool[i] for i in indices)
 from trytond.tests.test_tryton import POOL, DB_NAME, USER, CONTEXT, \
         install_module
-from trytond.test.trigger import TRIGGER_LOGS
+from trytond.tests.trigger import TRIGGER_LOGS
 from trytond.transaction import Transaction
 
 
@@ -37,7 +37,7 @@ class TriggerTestCase(unittest.TestCase):
     '''
 
     def setUp(self):
-        install_module('test')
+        install_module('tests')
         self.triggered = POOL.get('test.triggered')
         self.trigger = POOL.get('ir.trigger')
         self.trigger_log = POOL.get('ir.trigger.log')
diff --git a/trytond/tests/test_tryton.py b/trytond/tests/test_tryton.py
index 576ed9e..fb35ab2 100644
--- a/trytond/tests/test_tryton.py
+++ b/trytond/tests/test_tryton.py
@@ -38,11 +38,12 @@ if __name__ == '__main__':
 from trytond.config import CONFIG
 CONFIG['db_type'] = 'sqlite'
 CONFIG.update_etc(_CONFIGFILE)
+CONFIG.set_timezone()
 if not CONFIG['admin_passwd']:
     CONFIG['admin_passwd'] = 'admin'
 
 from trytond.pool import Pool
-from trytond.backend import Database
+from trytond import backend
 from trytond.protocols.dispatcher import create
 from trytond.transaction import Transaction
 from trytond.pyson import PYSONEncoder, Eval
@@ -56,7 +57,7 @@ else:
 USER = 1
 USER_PASSWORD = 'admin'
 CONTEXT = {}
-DB = Database(DB_NAME)
+DB = backend.get('Database')(DB_NAME)
 Pool.test = True
 POOL = Pool(DB_NAME)
 
@@ -112,6 +113,7 @@ def install_module(name):
     '''
     Install module for the tested database
     '''
+    Database = backend.get('Database')
     database = Database().connect()
     cursor = database.cursor()
     databases = database.list(cursor)
diff --git a/trytond/tests/test_wizard.py b/trytond/tests/test_wizard.py
index a191698..43207c2 100644
--- a/trytond/tests/test_wizard.py
+++ b/trytond/tests/test_wizard.py
@@ -9,7 +9,7 @@ from trytond.transaction import Transaction
 class WizardTestCase(unittest.TestCase):
 
     def setUp(self):
-        install_module('test')
+        install_module('tests')
         self.wizard = POOL.get('test.test_wizard', type='wizard')
         self.session = POOL.get('ir.session.wizard')
         self.group = POOL.get('res.group')
diff --git a/trytond/tests/test_workflow.py b/trytond/tests/test_workflow.py
index 7d11a23..cf564cb 100644
--- a/trytond/tests/test_workflow.py
+++ b/trytond/tests/test_workflow.py
@@ -11,7 +11,7 @@ from trytond.tests.test_tryton import (POOL, DB_NAME, USER, CONTEXT,
 class WorkflowTestCase(unittest.TestCase):
 
     def setUp(self):
-        install_module('test')
+        install_module('tests')
         self.workflow = POOL.get('test.workflowed')
 
     # TODO add test for Workflow.transition
diff --git a/trytond/test/trigger.py b/trytond/tests/trigger.py
similarity index 100%
rename from trytond/test/trigger.py
rename to trytond/tests/trigger.py
diff --git a/trytond/test/tryton.cfg b/trytond/tests/tryton.cfg
similarity index 100%
rename from trytond/test/tryton.cfg
rename to trytond/tests/tryton.cfg
diff --git a/trytond/test/wizard.py b/trytond/tests/wizard.py
similarity index 96%
rename from trytond/test/wizard.py
rename to trytond/tests/wizard.py
index 929a44f..5ba5485 100644
--- a/trytond/test/wizard.py
+++ b/trytond/tests/wizard.py
@@ -26,7 +26,7 @@ class TestWizard(Wizard):
     'Test Wizard'
     __name__ = 'test.test_wizard'
     start = StateView('test.test_wizard.start',
-        'test.test_wizard_start_view_form', [
+        'tests.test_wizard_start_view_form', [
             Button('Cancel', 'end', 'tryton-cancel'),
             Button('Next', 'next_', 'tryton-next', default=True),
             ])
diff --git a/trytond/test/wizard.xml b/trytond/tests/wizard.xml
similarity index 100%
rename from trytond/test/wizard.xml
rename to trytond/tests/wizard.xml
diff --git a/trytond/test/workflow.py b/trytond/tests/workflow.py
similarity index 100%
rename from trytond/test/workflow.py
rename to trytond/tests/workflow.py
diff --git a/trytond/test/workflow.xml b/trytond/tests/workflow.xml
similarity index 100%
rename from trytond/test/workflow.xml
rename to trytond/tests/workflow.xml
diff --git a/trytond/tools/misc.py b/trytond/tools/misc.py
index a632f7c..f6df849 100644
--- a/trytond/tools/misc.py
+++ b/trytond/tools/misc.py
@@ -11,6 +11,9 @@ from threading import local
 import smtplib
 import dis
 from decimal import Decimal
+from array import array
+from sql import Literal
+from sql.operators import Or
 from trytond.config import CONFIG
 from trytond.const import OPERATORS
 
@@ -108,7 +111,7 @@ def file_open(name, mode="r", subdir='modules'):
                 and (name.startswith('ir' + os.sep)
                     or name.startswith('res' + os.sep)
                     or name.startswith('webdav' + os.sep)
-                    or name.startswith('test' + os.sep))):
+                    or name.startswith('tests' + os.sep))):
             name = os.path.join(root_path, name)
         else:
             name = os.path.join(root_path, subdir, name)
@@ -323,23 +326,18 @@ class LocalDict(local):
 
 def reduce_ids(field, ids):
     '''
-    Return a small SQL clause for ids
-
-    :param field: the field of the clause
-    :param ids: the list of ids
-    :return: sql string and sql param
+    Return a small SQL expression for the list of ids and the sql column
     '''
     if not ids:
-        return '(%s)', [False]
+        return Literal(False)
     assert all(x.is_integer() for x in ids if isinstance(x, float)), \
         'ids must be integer'
     ids = map(int, ids)
     ids.sort()
     prev = ids.pop(0)
     continue_list = [prev, prev]
-    discontinue_list = []
-    sql = []
-    args = []
+    discontinue_list = array('l')
+    sql = Or()
     for i in ids:
         if i == prev:
             continue
@@ -348,9 +346,8 @@ def reduce_ids(field, ids):
                 discontinue_list.extend([continue_list[0] + x for x in
                     range(continue_list[-1] - continue_list[0] + 1)])
             else:
-                sql.append('((' + field + ' >= %s) AND (' + field + ' <= %s))')
-                args.append(continue_list[0])
-                args.append(continue_list[-1])
+                sql.append((field >= continue_list[0])
+                    & (field <= continue_list[-1]))
             continue_list = []
         continue_list.append(i)
         prev = i
@@ -358,14 +355,10 @@ def reduce_ids(field, ids):
         discontinue_list.extend([continue_list[0] + x for x in
             range(continue_list[-1] - continue_list[0] + 1)])
     else:
-        sql.append('((' + field + ' >= %s) AND (' + field + ' <= %s))')
-        args.append(continue_list[0])
-        args.append(continue_list[-1])
+        sql.append((field >= continue_list[0]) & (field <= continue_list[-1]))
     if discontinue_list:
-        sql.append('(' + field + ' IN (' +
-            ','.join(('%s',) * len(discontinue_list)) + '))')
-        args.extend(discontinue_list)
-    return '(' + ' OR '.join(sql) + ')', args
+        sql.append(field.in_(discontinue_list))
+    return sql
 
 _ALLOWED_CODES = set(dis.opmap[x] for x in [
         'POP_TOP', 'ROT_TWO', 'ROT_THREE', 'ROT_FOUR', 'DUP_TOP', 'BUILD_LIST',
diff --git a/trytond/transaction.py b/trytond/transaction.py
index b2c2783..9552b4a 100644
--- a/trytond/transaction.py
+++ b/trytond/transaction.py
@@ -1,8 +1,10 @@
 #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 threading import local
+from sql import Flavor
+
 from trytond.tools.singleton import Singleton
-from trytond.backend import Database
+from trytond import backend
 
 
 class _TransactionManager(object):
@@ -67,10 +69,15 @@ class Transaction(local):
         '''
         Start transaction
         '''
+        Database = backend.get('Database')
         assert self.user is None
         assert self.cursor is None
         assert self.context is None
-        database = Database(database_name).connect()
+        if not database_name:
+            database = Database().connect()
+        else:
+            database = Database(database_name).connect()
+        Flavor.set(Database.flavor)
         self.cursor = database.cursor(readonly=readonly)
         self.user = user
         self.context = context or {}
@@ -124,6 +131,7 @@ class Transaction(local):
         return manager
 
     def new_cursor(self):
+        Database = backend.get('Database')
         manager = _CursorManager(self.cursor)
         database = Database(self.cursor.database_name).connect()
         self.cursor = database.cursor()
diff --git a/trytond/version.py b/trytond/version.py
index 29a1e41..7f33a34 100644
--- a/trytond/version.py
+++ b/trytond/version.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.
 PACKAGE = "trytond"
-VERSION = "2.8.3"
+VERSION = "3.0.0"
 LICENSE = "GPL-3"
 WEBSITE = "http://www.tryton.org/"
diff --git a/trytond/webdav/locale/ca_ES.po b/trytond/webdav/locale/ca_ES.po
index 2047416..a44eb9a 100644
--- a/trytond/webdav/locale/ca_ES.po
+++ b/trytond/webdav/locale/ca_ES.po
@@ -14,7 +14,6 @@ msgctxt "error:webdav.collection:"
 msgid "The collection name must be unique inside a collection!"
 msgstr "El nom del directori ha de ser únic dins del directori."
 
-#, fuzzy
 msgctxt "error:webdav.collection:"
 msgid ""
 "You can not create a collection named \"%(parent)s\" in collection "
diff --git a/trytond/webdav/locale/es_AR.po b/trytond/webdav/locale/es_AR.po
index 6ef1f66..341d49e 100644
--- a/trytond/webdav/locale/es_AR.po
+++ b/trytond/webdav/locale/es_AR.po
@@ -48,7 +48,7 @@ msgstr "Fecha creación"
 
 msgctxt "field:webdav.collection,create_uid:"
 msgid "Create User"
-msgstr "Creado por Usuario"
+msgstr "Usuario creación"
 
 msgctxt "field:webdav.collection,domain:"
 msgid "Domain"
@@ -80,7 +80,7 @@ msgstr "Fecha modificación"
 
 msgctxt "field:webdav.collection,write_uid:"
 msgid "Write User"
-msgstr "Modificado por Usuario"
+msgstr "Usuario modificación"
 
 msgctxt "field:webdav.share,create_date:"
 msgid "Create Date"
@@ -88,7 +88,7 @@ msgstr "Fecha creación"
 
 msgctxt "field:webdav.share,create_uid:"
 msgid "Create User"
-msgstr "Creado por Usuario"
+msgstr "Usuario creación"
 
 msgctxt "field:webdav.share,expiration_date:"
 msgid "Expiration Date"
@@ -128,7 +128,7 @@ msgstr "Fecha modificación"
 
 msgctxt "field:webdav.share,write_uid:"
 msgid "Write User"
-msgstr "Modificado por Usuario"
+msgstr "Usuario modificación"
 
 msgctxt "model:ir.action,name:act_collection_list"
 msgid "Collections"
diff --git a/trytond/webdav/locale/es_CO.po b/trytond/webdav/locale/es_CO.po
index aa828de..37ad2d4 100644
--- a/trytond/webdav/locale/es_CO.po
+++ b/trytond/webdav/locale/es_CO.po
@@ -7,6 +7,8 @@ msgid ""
 "You can not create an attachment named \"%(attachment)s in collection "
 "\"%(collection)s\" because there is already a collection with that name."
 msgstr ""
+"No puede crear un adjunto llamado \"%(attachment)s\" porque existe una "
+"colección con el mismo nombre."
 
 msgctxt "error:webdav.collection:"
 msgid "The collection name must be unique inside a collection!"
@@ -17,6 +19,8 @@ msgid ""
 "You can not create a collection named \"%(parent)s\" in collection "
 "\"%(child)s\" because there is already a file with that name."
 msgstr ""
+"No puede crear una colección llamada \"%(parent)s\" en la colección "
+"\"%(child)s\" porque existe un archivo con el mismo nombre."
 
 msgctxt "field:ir.attachment,path:"
 msgid "Path"
diff --git a/trytond/webdav/locale/es_ES.po b/trytond/webdav/locale/es_ES.po
index be6da77..70f0f69 100644
--- a/trytond/webdav/locale/es_ES.po
+++ b/trytond/webdav/locale/es_ES.po
@@ -14,7 +14,6 @@ msgctxt "error:webdav.collection:"
 msgid "The collection name must be unique inside a collection!"
 msgstr "El nombre del directorio debe ser único dentro del directorio."
 
-#, fuzzy
 msgctxt "error:webdav.collection:"
 msgid ""
 "You can not create a collection named \"%(parent)s\" in collection "
diff --git a/trytond/webdav/locale/fr_FR.po b/trytond/webdav/locale/fr_FR.po
index 72975ee..c94374f 100644
--- a/trytond/webdav/locale/fr_FR.po
+++ b/trytond/webdav/locale/fr_FR.po
@@ -15,10 +15,6 @@ msgid "The collection name must be unique inside a collection!"
 msgstr "Le nom de collection doit être unique au sein d'une collection !"
 
 msgctxt "error:webdav.collection:"
-msgid "The collection name must be unique inside a collection!"
-msgstr "Le nom de collection doit être unique au sein d'une collection !"
-
-msgctxt "error:webdav.collection:"
 msgid ""
 "You can not create a collection named \"%(parent)s\" in collection "
 "\"%(child)s\" because there is already a file with that name."
@@ -179,14 +175,6 @@ msgid "Collection"
 msgstr "Collection"
 
 msgctxt "view:webdav.collection:"
-msgid "Collection"
-msgstr "Collection"
-
-msgctxt "view:webdav.collection:"
-msgid "Collections"
-msgstr "Collections"
-
-msgctxt "view:webdav.collection:"
 msgid "Collections"
 msgstr "Collections"
 
diff --git a/trytond/webdav/locale/es_CO.po b/trytond/webdav/locale/sl_SI.po
similarity index 76%
copy from trytond/webdav/locale/es_CO.po
copy to trytond/webdav/locale/sl_SI.po
index aa828de..c9550c2 100644
--- a/trytond/webdav/locale/es_CO.po
+++ b/trytond/webdav/locale/sl_SI.po
@@ -7,24 +7,28 @@ msgid ""
 "You can not create an attachment named \"%(attachment)s in collection "
 "\"%(collection)s\" because there is already a collection with that name."
 msgstr ""
+"Priloge z imenom \"%(attachment)s\" v zbirki \"%(collection)s\" ni možno "
+"ustvariti, ker že obstaja zbirka z istim imenom."
 
 msgctxt "error:webdav.collection:"
 msgid "The collection name must be unique inside a collection!"
-msgstr "¡El nombre de la colección debe ser único dentro de dicha colección!"
+msgstr "Ime zbirke mora biti edinstveno znotraj zbirke."
 
 msgctxt "error:webdav.collection:"
 msgid ""
 "You can not create a collection named \"%(parent)s\" in collection "
 "\"%(child)s\" because there is already a file with that name."
 msgstr ""
+"Zbirke z imenom \"%(parent)s\" v zbirki \"%(child)s\" ni možno ustvariti, "
+"ker že obstaja datoteka z istim imenom."
 
 msgctxt "field:ir.attachment,path:"
 msgid "Path"
-msgstr "Ruta"
+msgstr "Pot"
 
 msgctxt "field:ir.attachment,shares:"
 msgid "Shares"
-msgstr "Recuros Compartidos"
+msgstr "Skupne rabe"
 
 msgctxt "field:ir.attachment,url:"
 msgid "URL"
@@ -32,23 +36,23 @@ msgstr "URL"
 
 msgctxt "field:webdav.collection,childs:"
 msgid "Children"
-msgstr "Hijos"
+msgstr "Podzbirke"
 
 msgctxt "field:webdav.collection,complete_name:"
 msgid "Complete Name"
-msgstr "Nombre completo"
+msgstr "Polno ime"
 
 msgctxt "field:webdav.collection,create_date:"
 msgid "Create Date"
-msgstr "Fecha de Creación"
+msgstr "Ustvarjeno"
 
 msgctxt "field:webdav.collection,create_uid:"
 msgid "Create User"
-msgstr "Creado por Usuario"
+msgstr "Ustvaril"
 
 msgctxt "field:webdav.collection,domain:"
 msgid "Domain"
-msgstr "Dominio"
+msgstr "Domena"
 
 msgctxt "field:webdav.collection,id:"
 msgid "ID"
@@ -56,39 +60,39 @@ msgstr "ID"
 
 msgctxt "field:webdav.collection,model:"
 msgid "Model"
-msgstr "Modelo"
+msgstr "Model"
 
 msgctxt "field:webdav.collection,name:"
 msgid "Name"
-msgstr "Nombre"
+msgstr "Naziv"
 
 msgctxt "field:webdav.collection,parent:"
 msgid "Parent"
-msgstr "Padre"
+msgstr "Prednik"
 
 msgctxt "field:webdav.collection,rec_name:"
 msgid "Name"
-msgstr "Nombre"
+msgstr "Ime"
 
 msgctxt "field:webdav.collection,write_date:"
 msgid "Write Date"
-msgstr "Fecha de Modificación"
+msgstr "Zapisano"
 
 msgctxt "field:webdav.collection,write_uid:"
 msgid "Write User"
-msgstr "Modificado por Usuario"
+msgstr "Zapisal"
 
 msgctxt "field:webdav.share,create_date:"
 msgid "Create Date"
-msgstr "Fecha de Creación"
+msgstr "Ustvarjeno"
 
 msgctxt "field:webdav.share,create_uid:"
 msgid "Create User"
-msgstr "Creado por Usuario"
+msgstr "Ustvaril"
 
 msgctxt "field:webdav.share,expiration_date:"
 msgid "Expiration Date"
-msgstr "Fecha de Expiración"
+msgstr "Datum veljavnosti"
 
 msgctxt "field:webdav.share,id:"
 msgid "ID"
@@ -96,19 +100,19 @@ msgstr "ID"
 
 msgctxt "field:webdav.share,key:"
 msgid "Key"
-msgstr "Clave"
+msgstr "Ključ"
 
 msgctxt "field:webdav.share,note:"
 msgid "Note"
-msgstr "Nota"
+msgstr "Opomba"
 
 msgctxt "field:webdav.share,path:"
 msgid "Path"
-msgstr "Ruta"
+msgstr "Pot"
 
 msgctxt "field:webdav.share,rec_name:"
 msgid "Name"
-msgstr "Nombre del campo"
+msgstr "Ime"
 
 msgctxt "field:webdav.share,url:"
 msgid "URL"
@@ -116,39 +120,39 @@ msgstr "URL"
 
 msgctxt "field:webdav.share,user:"
 msgid "User"
-msgstr "Usuario"
+msgstr "Uporabnik"
 
 msgctxt "field:webdav.share,write_date:"
 msgid "Write Date"
-msgstr "Fecha de Modificación"
+msgstr "Zapisano"
 
 msgctxt "field:webdav.share,write_uid:"
 msgid "Write User"
-msgstr "Modificado por Usuario"
+msgstr "Zapisal"
 
 msgctxt "model:ir.action,name:act_collection_list"
 msgid "Collections"
-msgstr "Colecciones"
+msgstr "Zbirke"
 
 msgctxt "model:ir.action,name:act_collection_tree"
 msgid "Collections"
-msgstr "Colecciones"
+msgstr "Zbirke"
 
 msgctxt "model:ir.action,name:act_share_list"
 msgid "Shares"
-msgstr "Recuros Compartidos"
+msgstr "Skupne rabe"
 
 msgctxt "model:ir.ui.menu,name:menu_collection_list"
 msgid "Collections"
-msgstr "Colecciones"
+msgstr "Zbirke"
 
 msgctxt "model:ir.ui.menu,name:menu_collection_tree"
 msgid "Collections"
-msgstr "Colecciones"
+msgstr "Zbirke"
 
 msgctxt "model:ir.ui.menu,name:menu_share_list"
 msgid "Shares"
-msgstr "Recuros Compartidos"
+msgstr "Skupne rabe"
 
 msgctxt "model:ir.ui.menu,name:menu_webdav"
 msgid "WebDAV"
@@ -156,11 +160,11 @@ msgstr "WebDAV"
 
 msgctxt "model:webdav.collection,name:"
 msgid "Collection"
-msgstr "Colección"
+msgstr "Zbirka"
 
 msgctxt "model:webdav.share,name:"
 msgid "Share"
-msgstr "Recurso compartido"
+msgstr "Skupna raba"
 
 msgctxt "view:ir.attachment:"
 msgid "WebDAV"
@@ -168,16 +172,16 @@ msgstr "WebDAV"
 
 msgctxt "view:webdav.collection:"
 msgid "Collection"
-msgstr "Colección"
+msgstr "Zbirka"
 
 msgctxt "view:webdav.collection:"
 msgid "Collections"
-msgstr "Colecciones"
+msgstr "Zbirke"
 
 msgctxt "view:webdav.share:"
 msgid "Share"
-msgstr "Recurso compartido"
+msgstr "Skupna raba"
 
 msgctxt "view:webdav.share:"
 msgid "Shares"
-msgstr "Recuros Compartidos"
+msgstr "Skupne rabe"
diff --git a/trytond/webdav/webdav.py b/trytond/webdav/webdav.py
index 258955a..d62179d 100644
--- a/trytond/webdav/webdav.py
+++ b/trytond/webdav/webdav.py
@@ -9,6 +9,9 @@ import encodings
 import uuid
 import datetime
 from dateutil.relativedelta import relativedelta
+from sql.functions import Extract
+from sql.conditionals import Coalesce
+
 from trytond.model import ModelView, ModelSQL, fields
 from trytond.tools import reduce_ids, safe_eval
 from trytond.transaction import Transaction
@@ -45,8 +48,8 @@ class Collection(ModelSQL, ModelView):
     childs = fields.One2Many('webdav.collection', 'parent', 'Children')
     model = fields.Many2One('ir.model', 'Model')
     domain = fields.Char('Domain')
-    complete_name = fields.Function(fields.Char('Complete Name',
-            order_field='name'), 'get_rec_name')
+    complete_name = fields.Function(fields.Char('Complete Name'),
+        'get_rec_name')
 
     @classmethod
     def __setup__(cls):
@@ -66,6 +69,10 @@ class Collection(ModelSQL, ModelView):
             '.pdf': 'application/pdf',
         }
 
+    @classmethod
+    def order_complet_name(cls, tables):
+        return cls.name.convert_order('name', tables, cls)
+
     @staticmethod
     def default_domain():
         return '[]'
@@ -424,13 +431,13 @@ class Collection(ModelSQL, ModelView):
                     ids = [object_id]
                 res = None
                 cursor = Transaction().cursor
+                table = Model.__table__()
                 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 "' + Model._table + '" '
-                        'WHERE ' + red_sql, red_ids)
+                    red_sql = reduce_ids(table.id, sub_ids)
+                    cursor.execute(*table.select(table.id,
+                            Extract('EPOCH', table.create_date),
+                            where=red_sql))
                     for object_id2, date in cursor.fetchall():
                         if object_id2 == object_id:
                             res = date
@@ -461,14 +468,14 @@ class Collection(ModelSQL, ModelView):
                     ids = [object_id]
                 res = None
                 cursor = Transaction().cursor
+                table = Model.__table__()
                 for i in range(0, len(ids), cursor.IN_MAX):
                     sub_ids = ids[i:i + cursor.IN_MAX]
-                    red_sql, red_ids = reduce_ids('id', sub_ids)
-                    cursor.execute('SELECT id, '
-                        'EXTRACT(epoch FROM '
-                            'COALESCE(write_date, create_date)) '
-                        'FROM "' + Model._table + '" '
-                        'WHERE ' + red_sql, red_ids)
+                    red_sql = reduce_ids(table.id, sub_ids)
+                    cursor.execute(*table.select(table.id,
+                            Extract('EPOCH',
+                                Coalesce(table.write_date, table.create_date)),
+                            where=red_sql))
                     for object_id2, date in cursor.fetchall():
                         if object_id2 == object_id:
                             res = date
diff --git a/trytond/webdav/webdav.xml b/trytond/webdav/webdav.xml
index ff92f68..2a6ab87 100644
--- a/trytond/webdav/webdav.xml
+++ b/trytond/webdav/webdav.xml
@@ -32,7 +32,7 @@ this repository contains the full copyright notices and license terms. -->
             <field name="name">Collections</field>
             <field name="type">ir.action.act_window</field>
             <field name="res_model">webdav.collection</field>
-            <field name="domain">[('parent', '=', False)]</field>
+            <field name="domain">[('parent', '=', None)]</field>
         </record>
         <record model="ir.action.act_window.view"
             id="act_collection_tree_view1">
diff --git a/trytond/wizard/wizard.py b/trytond/wizard/wizard.py
index 1cb98cb..a4b2cc7 100644
--- a/trytond/wizard/wizard.py
+++ b/trytond/wizard/wizard.py
@@ -9,7 +9,7 @@ except ImportError:
     import json
 import copy
 
-from trytond.pool import Pool, PoolMeta
+from trytond.pool import Pool, PoolBase
 from trytond.transaction import Transaction
 from trytond.error import WarningErrorMixin
 from trytond.url import URLMixin
@@ -142,13 +142,13 @@ class StateAction(StateTransition):
         return Action.get_action_values(action.type, [action.id])[0]
 
 
-class Wizard(WarningErrorMixin, URLMixin):
-    __metaclass__ = PoolMeta
+class Wizard(WarningErrorMixin, URLMixin, PoolBase):
     start_state = 'start'
     end_state = 'end'
 
     @classmethod
     def __setup__(cls):
+        super(Wizard, cls).__setup__()
         cls.__rpc__ = {
             'create': RPC(readonly=False),
             'delete': RPC(readonly=False),
@@ -163,6 +163,7 @@ class Wizard(WarningErrorMixin, URLMixin):
 
     @classmethod
     def __post_setup__(cls):
+        super(Wizard, cls).__post_setup__()
         # Set states
         cls.states = {}
         for attr in dir(cls):
@@ -173,55 +174,11 @@ class Wizard(WarningErrorMixin, URLMixin):
 
     @classmethod
     def __register__(cls, module_name):
+        super(Wizard, cls).__register__(module_name)
         pool = Pool()
         Translation = pool.get('ir.translation')
-        cursor = Transaction().cursor
-        for state_name, state in cls.states.iteritems():
-            if isinstance(state, StateView):
-                for button in state.buttons:
-                    cursor.execute('SELECT id, name, src '
-                        'FROM ir_translation '
-                        'WHERE module = %s '
-                            'AND lang = %s '
-                            'AND type = %s '
-                            'AND name = %s',
-                        (module_name, 'en_US', 'wizard_button',
-                            cls.__name__ + ',' + state_name + ',' +
-                            button.state))
-                    res = cursor.dictfetchall()
-                    src_md5 = Translation.get_src_md5(button.string)
-                    if not res:
-                        cursor.execute('INSERT INTO ir_translation '
-                            '(name, lang, type, src, src_md5, value, module, '
-                                'fuzzy) '
-                            'VALUES (%s, %s, %s, %s, %s, %s, %s, %s)',
-                            (cls.__name__ + ',' + state_name + ',' +
-                                button.state,
-                                'en_US', 'wizard_button', button.string,
-                                src_md5, '', module_name, False))
-                    elif res[0]['src'] != button.string:
-                        cursor.execute('UPDATE ir_translation '
-                            'SET src = %s, src_md5 = %s '
-                            'WHERE id = %s',
-                            (button.string, src_md5, res[0]['id']))
-
-        cursor.execute('SELECT id, src FROM ir_translation '
-            'WHERE lang = %s '
-                'AND type = %s '
-                'AND name = %s',
-            ('en_US', 'error', cls.__name__))
-        trans_error = {}
-        for trans in cursor.dictfetchall():
-            trans_error[trans['src']] = trans
-
-        for error in cls._error_messages.values():
-            if error not in trans_error:
-                error_md5 = Translation.get_src_md5(error)
-                cursor.execute('INSERT INTO ir_translation '
-                    '(name, lang, type, src, src_md5,  value, module, fuzzy) '
-                    'VALUES (%s, %s, %s, %s, %s, %s, %s, %s)',
-                    (cls.__name__, 'en_US', 'error', error, error_md5, '',
-                        module_name, False))
+        Translation.register_wizard(cls, module_name)
+        Translation.register_error_messages(cls, module_name)
 
     @classmethod
     def create(cls):
@@ -236,11 +193,11 @@ class Wizard(WarningErrorMixin, URLMixin):
         Session.delete([Session(session_id)])
 
     @classmethod
-    def execute(cls, session, data, state_name):
+    def execute(cls, session_id, data, state_name):
         '''
         Execute the wizard state.
 
-        session is a Session or a Session id
+        session_id is a Session id
         data is a dictionary with the session data to update
         state_name is the name of state to execute
 
@@ -251,7 +208,7 @@ class Wizard(WarningErrorMixin, URLMixin):
                 - ``defaults``: a dictionary with default values
                 - ``buttons``: a list of buttons
         '''
-        wizard = cls(session)
+        wizard = cls(session_id)
         for key, values in data.iteritems():
             record = getattr(wizard, key)
             for field, value in values.iteritems():
-- 
tryton-server



More information about the tryton-debian-vcs mailing list