[tryton-debian-vcs] tryton-server branch upstream updated. upstream/4.2.3-2-ge5d6aeb

Mathias Behrle tryton-debian-vcs at alioth.debian.org
Wed Jun 7 13:38:00 UTC 2017


The following commit has been merged in the upstream branch:
https://alioth.debian.org/plugins/scmgit/cgi-bin/gitweb.cgi/?p=tryton/tryton-server.git;a=commitdiff;h=upstream/4.2.3-2-ge5d6aeb

commit e5d6aebd71c9af471abf79fede4e384d2904b329
Author: Mathias Behrle <mathiasb at m9s.biz>
Date:   Wed Jun 7 15:27:37 2017 +0200

    Adding upstream version 4.4.1.
    
    Signed-off-by: Mathias Behrle <mathiasb at m9s.biz>

diff --git a/CHANGELOG b/CHANGELOG
index 6dc55a9..9653a96 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,3 +1,6 @@
+Version 4.4.1 - 2017-05-19
+* Bug fixes (see mercurial logs for details)
+
 Version 4.4.0 - 2017-05-01
 * Bug fixes (see mercurial logs for details)
 * Sanitize path in file_open against suffix (CVE-2017-0360)
diff --git a/PKG-INFO b/PKG-INFO
index 348f8a4..c2cdd26 100644
--- a/PKG-INFO
+++ b/PKG-INFO
@@ -1,6 +1,6 @@
 Metadata-Version: 1.1
 Name: trytond
-Version: 4.4.0
+Version: 4.4.1
 Summary: Tryton server
 Home-page: http://www.tryton.org/
 Author: Tryton
diff --git a/trytond.egg-info/PKG-INFO b/trytond.egg-info/PKG-INFO
index 348f8a4..c2cdd26 100644
--- a/trytond.egg-info/PKG-INFO
+++ b/trytond.egg-info/PKG-INFO
@@ -1,6 +1,6 @@
 Metadata-Version: 1.1
 Name: trytond
-Version: 4.4.0
+Version: 4.4.1
 Summary: Tryton server
 Home-page: http://www.tryton.org/
 Author: Tryton
diff --git a/trytond/__init__.py b/trytond/__init__.py
index 40f6c94..846cedb 100644
--- a/trytond/__init__.py
+++ b/trytond/__init__.py
@@ -5,7 +5,7 @@ import time
 import warnings
 from email import charset
 
-__version__ = "4.4.0"
+__version__ = "4.4.1"
 
 os.environ['TZ'] = 'UTC'
 if hasattr(time, 'tzset'):
diff --git a/trytond/backend/mysql/table.py b/trytond/backend/mysql/table.py
index a16f409..b0f81fa 100644
--- a/trytond/backend/mysql/table.py
+++ b/trytond/backend/mysql/table.py
@@ -11,6 +11,7 @@ VARCHAR_SIZE_RE = re.compile('VARCHAR\(([0-9]+)\)')
 
 
 class TableHandler(TableHandlerInterface):
+    namedatalen = 64
 
     def __init__(self, model, module_name=None, history=False):
         super(TableHandler, self).__init__(model,
@@ -247,7 +248,8 @@ class TableHandler(TableHandlerInterface):
     def add_fk(self, column_name, reference, on_delete=None):
         if on_delete is None:
             on_delete = 'SET NULL'
-        conname = '%s_%s_fkey' % (self.table_name, column_name)
+        conname = self.convert_name(
+            '%s_%s_fkey' % (self.table_name, column_name))
         if conname in self._fkeys:
             self.drop_fk(column_name)
         cursor = Transaction().connection.cursor()
@@ -259,7 +261,8 @@ class TableHandler(TableHandlerInterface):
         self._update_definitions(constraints=True)
 
     def drop_fk(self, column_name, table=None):
-        conname = '%s_%s_fkey' % (self.table_name, column_name)
+        conname = self.convert_name(
+            '%s_%s_fkey' % (self.table_name, column_name))
         if conname not in self._fkeys:
             return
         cursor = Transaction().connection.cursor()
@@ -270,10 +273,9 @@ class TableHandler(TableHandlerInterface):
     def index_action(self, column_name, action='add', table=None):
         if isinstance(column_name, basestring):
             column_name = [column_name]
-        index_name = ((table or self.table_name) + "_" + '_'.join(column_name)
-            + "_index")
-        # Index name length is limited to 64
-        index_name = index_name[:64]
+        index_name = self.convert_name(
+            ((table or self.table_name) + "_" + '_'.join(column_name) +
+                "_index"))
 
         for k in column_name:
             if k in self._columns:
@@ -348,7 +350,7 @@ class TableHandler(TableHandlerInterface):
                 raise Exception('Not null action not supported!')
 
     def add_constraint(self, ident, constraint, exception=False):
-        ident = self.table_name + "_" + ident
+        ident = self.convert_name(self.table_name + "_" + ident)
         if ident in self._constraints:
             # This constrain already exists
             return
@@ -371,7 +373,7 @@ class TableHandler(TableHandlerInterface):
         self._update_definitions(constraints=True)
 
     def drop_constraint(self, ident, exception=False, table=None):
-        ident = (table or self.table_name) + "_" + ident
+        ident = self.convert_name((table or self.table_name) + "_" + ident)
         if ident not in self._constraints:
             return
 
diff --git a/trytond/backend/postgresql/table.py b/trytond/backend/postgresql/table.py
index f2cacb8..f09172d 100644
--- a/trytond/backend/postgresql/table.py
+++ b/trytond/backend/postgresql/table.py
@@ -13,6 +13,7 @@ VARCHAR_SIZE_RE = re.compile('VARCHAR\(([0-9]+)\)')
 
 
 class TableHandler(TableHandlerInterface):
+    namedatalen = 64
 
     def __init__(self, model, module_name=None, history=False):
         super(TableHandler, self).__init__(model,
@@ -314,17 +315,14 @@ class TableHandler(TableHandlerInterface):
             on_delete = 'SET NULL'
 
         cursor = Transaction().connection.cursor()
-        name = self.table_name + '_' + column_name + '_fkey'
-        cursor.execute('SELECT 1 '
-            'FROM information_schema.key_column_usage '
-            'WHERE table_name = %s AND table_schema = %s '
-            'AND constraint_name = %s',
-            (self.table_name, self.table_schema, name))
-        add = False
-        if not cursor.rowcount:
-            add = True
-        elif self._fk_deltypes.get(column_name) != on_delete:
-            self.drop_fk(column_name)
+        name = self.convert_name(self.table_name + '_' + column_name + '_fkey')
+        if name in self._constraints:
+            if self._fk_deltypes.get(column_name) != on_delete:
+                self.drop_fk(column_name)
+                add = True
+            else:
+                add = False
+        else:
             add = True
         if add:
             cursor.execute('ALTER TABLE "' + self.table_name + '" '
@@ -340,16 +338,13 @@ class TableHandler(TableHandlerInterface):
     def index_action(self, column_name, action='add', table=None):
         if isinstance(column_name, basestring):
             column_name = [column_name]
-        index_name = ((table or self.table_name) + "_" + '_'.join(column_name)
-            + "_index")
-        if self._indexes:
-            test_index_name = index_name[:max(map(len, self._indexes))]
-        else:
-            test_index_name = index_name
+        index_name = self.convert_name(
+            ((table or self.table_name) + "_" + '_'.join(column_name) +
+                "_index"))
 
         with Transaction().connection.cursor() as cursor:
             if action == 'add':
-                if test_index_name in self._indexes:
+                if index_name in self._indexes:
                     return
                 cursor.execute('CREATE INDEX "' + index_name + '" '
                     'ON "' + self.table_name + '" ( '
@@ -361,7 +356,7 @@ class TableHandler(TableHandlerInterface):
                                 self.module_name) != self.module_name):
                         return
 
-                if test_index_name in self._indexes:
+                if index_name in self._indexes:
                     cursor.execute('DROP INDEX "%s" ' % (index_name,))
                     self._update_definitions(indexes=True)
             else:
@@ -407,7 +402,7 @@ class TableHandler(TableHandlerInterface):
                 raise Exception('Not null action not supported!')
 
     def add_constraint(self, ident, constraint, exception=False):
-        ident = self.table_name + "_" + ident
+        ident = self.convert_name(self.table_name + "_" + ident)
         if ident in self._constraints:
             # This constrain already exist
             return
@@ -429,7 +424,7 @@ class TableHandler(TableHandlerInterface):
         self._update_definitions(constraints=True)
 
     def drop_constraint(self, ident, exception=False, table=None):
-        ident = (table or self.table_name) + "_" + ident
+        ident = self.convert_name((table or self.table_name) + "_" + ident)
         if ident not in self._constraints:
             return
         cursor = Transaction().connection.cursor()
diff --git a/trytond/backend/sqlite/table.py b/trytond/backend/sqlite/table.py
index c45502c..a419037 100644
--- a/trytond/backend/sqlite/table.py
+++ b/trytond/backend/sqlite/table.py
@@ -248,7 +248,8 @@ class TableHandler(TableHandlerInterface):
     def index_action(self, column_name, action='add', table=None):
         if isinstance(column_name, basestring):
             column_name = [column_name]
-        index_name = self.table_name + "_" + '_'.join(column_name) + "_index"
+        index_name = self.convert_name(
+            self.table_name + "_" + '_'.join(column_name) + "_index")
 
         cursor = Transaction().connection.cursor()
         if action == 'add':
diff --git a/trytond/backend/table.py b/trytond/backend/table.py
index 53261f6..7344841 100644
--- a/trytond/backend/table.py
+++ b/trytond/backend/table.py
@@ -1,11 +1,13 @@
 # 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
 
 
 class TableHandlerInterface(object):
     '''
     Define generic interface to handle database table
     '''
+    namedatalen = None
 
     def __init__(self, model, module_name=None, history=False):
         '''
@@ -204,3 +206,16 @@ class TableHandlerInterface(object):
         :param cascade: a boolean to add "CASCADE" to the delete query
         '''
         raise NotImplementedError
+
+    @classmethod
+    def convert_name(cls, name):
+        '''
+        Convert data name in respect of namedatalen.
+
+        :param name: the data name
+        '''
+        if cls.namedatalen and len(name) >= cls.namedatalen:
+            if isinstance(name, unicode):
+                name = name.encode('utf-8')
+            name = hashlib.sha256(name).hexdigest()[:cls.namedatalen - 1]
+        return name
diff --git a/trytond/model/modelsql.py b/trytond/model/modelsql.py
index 0cc3723..9bb8c33 100644
--- a/trytond/model/modelsql.py
+++ b/trytond/model/modelsql.py
@@ -175,7 +175,7 @@ class ModelSQL(ModelStorage):
                     ref = field.model_name.replace('.', '_')
                 else:
                     ref_model = pool.get(field.model_name)
-                    if (isinstance(ref_model, ModelSQL)
+                    if (issubclass(ref_model, ModelSQL)
                             and not ref_model.table_query()):
                         ref = ref_model._table
                         # Create foreign key table if missing
@@ -261,6 +261,7 @@ class ModelSQL(ModelStorage):
     def __raise_integrity_error(
             cls, exception, values, field_names=None, transaction=None):
         pool = Pool()
+        TableHandler = backend.get('TableHandler')
         if field_names is None:
             field_names = cls._fields.keys()
         if transaction is None:
@@ -293,10 +294,10 @@ class ModelSQL(ModelStorage):
                     cls.raise_user_error('foreign_model_missing',
                         error_args=error_args)
         for name, _, error in cls._sql_constraints:
-            if name in str(exception):
+            if TableHandler.convert_name(name) in str(exception):
                 cls.raise_user_error(error)
         for name, error in cls._sql_error_messages.iteritems():
-            if name in str(exception):
+            if TableHandler.convert_name(name) in str(exception):
                 cls.raise_user_error(error)
 
     @classmethod
diff --git a/trytond/tests/test.py b/trytond/tests/test.py
index bdbc81f..e90c171 100644
--- a/trytond/tests/test.py
+++ b/trytond/tests/test.py
@@ -537,7 +537,7 @@ class One2ManyFilterDomain(ModelSQL):
 class One2ManyFilterDomainTarget(ModelSQL):
     'One2Many Filter Domain Target'
     __name__ = 'test.one2many_filter_domain.target'
-    origin = fields.Many2One('test.one2many_filter', 'Origin')
+    origin = fields.Many2One('test.one2many_filter_domain', 'Origin')
     value = fields.Integer('Value')
 
 
commit c7da51842bb693d16f1c6d036cfcd3516e317a4a
Author: Mathias Behrle <mathiasb at m9s.biz>
Date:   Wed Jun 7 15:27:11 2017 +0200

    Adding upstream version 4.4.0.
    
    Signed-off-by: Mathias Behrle <mathiasb at m9s.biz>

diff --git a/CHANGELOG b/CHANGELOG
index 1d39cc9..6dc55a9 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,12 +1,29 @@
-Version 4.2.3 - 2017-04-03
+Version 4.4.0 - 2017-05-01
 * Bug fixes (see mercurial logs for details)
 * Sanitize path in file_open against suffix (CVE-2017-0360)
-
-Version 4.2.2 - 2017-03-10
-* Bug fixes (see mercurial logs for details)
-
-Version 4.2.1 - 2017-01-03
-* Bug fixes (see mercurial logs for details)
+* Add constraint on user password
+* Remove Property field
+* Add MultiValueMixin and ValueMixin
+* Use sql type in column creation
+* Use generic SQL type in field and let backend determine the SQLType
+* Add filter to xxx2Many fields
+* Add NULLS ordering
+* Add context domain on ir.action.act_window
+* Allow None limit in action window
+* Add has_window_functions on Database
+* Allow Many2One on ModelSQL to target ModelStorage
+* Manage Cache in Transaction
+* Allow to register multiple exit functions on Transaction
+* Return 429 status when too many login attempts
+* Add set_rpc on Field
+* Add has_select_for on Database
+* Store custom report translation in separate module
+* Add form action keyword for set/synchronize translation on report and view
+* Add negative value for col attribute
+* Allow to use domain_<field name> method with Function fields
+* Validate wizard definition on module tests
+* Remove order constraint on register ModelSQL
+* Add relate from report to translations
 
 Version 4.2.0 - 2016-11-28
 * Bug fixes (see mercurial logs for details)
diff --git a/MANIFEST.in b/MANIFEST.in
index 04504c8..873dc75 100644
--- a/MANIFEST.in
+++ b/MANIFEST.in
@@ -22,3 +22,4 @@ include trytond/res/view/*.xml
 include trytond/res/locale/*.po
 include trytond/tests/tryton.cfg
 include trytond/tests/*.xml
+include trytond/tests/forbidden.txt
diff --git a/PKG-INFO b/PKG-INFO
index cfd1c8f..348f8a4 100644
--- a/PKG-INFO
+++ b/PKG-INFO
@@ -1,12 +1,12 @@
 Metadata-Version: 1.1
 Name: trytond
-Version: 4.2.3
+Version: 4.4.0
 Summary: Tryton server
 Home-page: http://www.tryton.org/
 Author: Tryton
 Author-email: issue_tracker at tryton.org
 License: GPL-3
-Download-URL: http://downloads.tryton.org/4.2/
+Download-URL: http://downloads.tryton.org/4.4/
 Description: trytond
         =======
         
@@ -103,7 +103,7 @@ Classifier: Development Status :: 5 - Production/Stable
 Classifier: Environment :: No Input/Output (Daemon)
 Classifier: Framework :: Tryton
 Classifier: Intended Audience :: Developers
-Classifier: License :: OSI Approved :: GNU General Public License (GPL)
+Classifier: License :: OSI Approved :: GNU General Public License v3 or later (GPLv3+)
 Classifier: Natural Language :: Bulgarian
 Classifier: Natural Language :: Catalan
 Classifier: Natural Language :: Chinese (Simplified)
diff --git a/doc/conf.py b/doc/conf.py
index 78c8593..245b621 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 = '4.2'
+version = '4.4'
 # The full version, including alpha/beta/rc tags.
-release = '4.2'
+release = '4.4'
 
 # The language for content autogenerated by Sphinx. Refer to documentation
 # for a list of supported languages.
diff --git a/doc/ref/cache.rst b/doc/ref/cache.rst
index e151d68..3cfeab1 100644
--- a/doc/ref/cache.rst
+++ b/doc/ref/cache.rst
@@ -13,6 +13,13 @@ be unique and it's used to identify the cache. We usually use
 be used to limit the number of values cached and the `context` parameter
 is used to indicate if the cache depends on the user context and is true
 by default.
+The cache is cleaned on :class:`Transaction` starts and resets on
+:class:`Transaction` commit or rollback.
+
+.. warning::
+    As there is no deepcopy of the values cached, they must never be mutated
+    after being set in or retrieved from the cache.
+..
 
 .. method:: get(key[, default])
 
diff --git a/doc/ref/models/fields.rst b/doc/ref/models/fields.rst
index 1c6046f..7b3ceca 100644
--- a/doc/ref/models/fields.rst
+++ b/doc/ref/models/fields.rst
@@ -174,10 +174,20 @@ Instance methods:
     use for creation and casting. Or `None` if the field is not stored in the
     database.
 
+    sql_type is using the `_sql_type` attribute to compute its return value.
+    The backend is responsible for the computation.
+
+    For the list of supported types by Tryton see 
+    :ref:`backend types <topics-backend_types>`.
+
 .. method:: Field.sql_column(table)
 
     Return the Column instance based on table.
 
+.. method:: Field.set_rpc(model)
+
+    Adds to `model` the default RPC instances required by the field.
+
 Default value
 =============
 
@@ -303,6 +313,8 @@ instance.
     the integer part. The second integer defines the total of numbers in the
     decimal part.
     Integers can be replaced by a :class:`~trytond.pyson.PYSON` statement.
+    If digits is None or any values of the tuple is `None`, no validation on
+    the numbers will be done.
 
 Numeric
 -------
@@ -617,6 +629,11 @@ This field accepts as written value a list of tuples like this:
     client will allow to add/remove existing records instead of only
     create/delete.
 
+.. attribute:: One2Many.filter
+
+    A :ref:`domain <topics-domain>` that is not a constraint but only a
+    filter on the records.
+
 .. attribute:: One2Many.order
 
     A list of tuple defining the default order of the records like for
@@ -685,6 +702,10 @@ This field accepts as written value a list of tuples like the :class:`One2Many`.
 
     An alias to the :attr:`domain` for compatibility with the :class:`One2Many`.
 
+.. attribute:: Many2Many.filter
+
+    Same as :attr:`One2Many.filter`
+
 Instance methods:
 
 .. method:: Many2Many.get_target()
@@ -707,6 +728,10 @@ A one-to-one relation field.
 
     Same as :attr:`Many2One.datetime_field`
 
+.. attribute:: One2MOne.filter
+
+    Same as :attr:`One2Many.filter`
+
 Instance methods:
 
 .. method:: One2One.get_target()
@@ -794,29 +819,25 @@ Instance methods:
     :class:`~trytond.model.Model` instance of the field, `name` is the name of
     the field, `clause` is a clause of :ref:`domain <topics-domain>`.
 
-Property
---------
-
-.. class:: Property(field)
-
-A property field that is like a :class:`Function` field but with predifined
-:attr:`~Function.getter`, :attr:`~Function.setter` and
-:attr:`~Function.searcher` that use the :class:`~trytond.model.ModelSQL`
-`ir.property` to store values.
-
-Instance methods:
-
-.. method:: Property.get(ids, model, name[, values])
-
-    Same as :meth:`Function.get`.
+MultiValue
+----------
 
-.. method:: Property.set(ids, model, name, value)
+.. class:: MultiValue(field)
 
-    Same as :meth:`Function.set`.
+A multivalue field that is like a :class:`Function` field but with predefined
+:attr:`~Function.getter` and :attr:`~Function.setter` that use the
+:class:`~trytond.model.MultiValueMixin` for stored values.
 
-.. method:: Property.search(model, name, clause)
+.. warning::
+    The :meth:`~trytond.model.MultiValueMixin.get_multivalue` and
+    :meth:`~trytond.model.MultiValueMixin.set_multivalue` should be prefered
+    over the descriptors of the field.
+..
 
-    Same as :meth:`Function.search`.
+.. warning::
+    The :ref:`default <topics-fields_default_value>` method of the field must
+    accept pattern as keyword argument.
+..
 
 Dict
 ----
diff --git a/doc/ref/models/models.rst b/doc/ref/models/models.rst
index 556bb2b..5f59d16 100644
--- a/doc/ref/models/models.rst
+++ b/doc/ref/models/models.rst
@@ -378,7 +378,9 @@ Class attributes are:
 
     where the first element of the tuple is a field name of the model and the
     second is the sort ordering as `ASC` for ascending or `DESC` for
-    descending.
+    descending. This second element may contain 'NULLS FIRST' or 'NULLS LAST'
+    to sort null values before or after non-null values. If neither is
+    specified the default behavior of the backend is used.
 
     In case the field used for the first element is a :class:`fields.Many2One`,
     it is also possible to use the dotted notation to sort on a specific field
@@ -645,9 +647,10 @@ record is equal or not defined.
 
 Instance methods:
 
-.. method:: MatchMixin.match(pattern)
+.. method:: MatchMixin.match(pattern[, match_none])
 
-    Return if the instance match the pattern
+    Return if the instance match the pattern. If `match_none` is set `None`
+    value of the instance will be compared.
 
 ==========
 UnionMixin
@@ -687,15 +690,68 @@ Class methods:
 sequence_ordered
 ================
 
-.. method:: sequence_ordered([field_name, [field_label, [order, [null_first]]]])
+.. method:: sequence_ordered([field_name, [field_label, [order]]])
 
 Retuns a mixin_ class which defines the order of a :class:`ModelSQL` with an
 :class:`trytond.model.fields.Integer` field. field_name indicates the name of
 the field to be created and its default values is `sequence`. field_label
 defines the label which will be used by the field and defaults to `Sequence`.
-Order specifies the order direction and defaults to `ASC` and null first
-if the null values should be ordered first and defaults to `True`.
+Order specifies the order direction and defaults to `ASC NULLS FIRST`.
 
+===============
+MultiValueMixin
+===============
+
+.. class:: MultiValueMixin
+
+A mixin_ for :class:`Model` to help having
+:class:`trytond.model.fields.MultiValue` fields with multi-values on a
+:class:`ValueMixin`. The values are stored by creating one record per pattern.
+The patterns are the same as those on :class:`MatchMixin`.
+
+Class methods:
+
+.. classmethod:: MultiValueMixin.multivalue_model(field)
+
+    Return the :class:`ValueMixin` on which the values are stored for the
+    field name. The default is class name suffixed by the field name.
+
+.. classmethod:: MultiValueMixin.setter_multivalue(records, name, value, \*\*pattern)
+
+    The setter method for the :class:`trytond.model.fields.Function` fields.
+
+Instance methods:
+
+.. method:: MultiValueMixin.multivalue_records(field)
+
+    Return the list of all :class:`ValueMixin` records linked to the instance.
+    By default, it returns the value of the first found
+    :class:`trytond.model.fields.One2Many` linked to the multivalue model or
+    all the records of this one.
+
+.. method:: MultiValueMixin.multivalue_record(field, \*\*pattern)
+
+    Return a new record of :class:`ValueMixin` linked to the instance.
+
+.. method:: MultiValueMixin.get_multivalue(name, \*\*pattern)
+
+    Return the value of the field `name` for the pattern.
+
+.. method:: MultiValueMixin.set_multivalue(name, value, \*\*pattern)
+
+    Store the value of the field `name` for the pattern.
+
+.. warning::
+    To customize the pattern, both methods must be override the same way.
+..
+
+==========
+ValueMixin
+==========
+
+.. class:: ValueMixin
+
+A mixin_ to store the values of :class:`MultiValueMixin`.
 
 .. _mixin: http://en.wikipedia.org/wiki/Mixin
 .. _JSON: http://en.wikipedia.org/wiki/Json
diff --git a/doc/ref/transaction.rst b/doc/ref/transaction.rst
index 282c3f5..6ce67ee 100644
--- a/doc/ref/transaction.rst
+++ b/doc/ref/transaction.rst
@@ -96,6 +96,12 @@ commited.
     equivalent (in term of python equality) datamanager than the one passed to the
     method.
 
+.. method:: Transaction.atexit(func, \*args, \*\*kwargs)
+
+    Register a function to be executed upon normal transaction termination.
+    The function can not use the current transaction because it will be already
+    committed or rollbacked.
+
 .. _`context manager`: http://docs.python.org/reference/datamodel.html#context-managers
 .. _`PEP-0249`: https://www.python.org/dev/peps/pep-0249/
 .. _`Two-Phase Commit protocol`: https://en.wikipedia.org/wiki/Two-phase_commit_protocol
diff --git a/doc/topics/backend_types.rst b/doc/topics/backend_types.rst
new file mode 100644
index 0000000..00d73e4
--- /dev/null
+++ b/doc/topics/backend_types.rst
@@ -0,0 +1,68 @@
+.. _topics-backend_types:
+
+Backend Types supported
+=======================
+
+This table give a comprehensive list of the SQL Types that are expected to be
+supported by the database backends. If the type is not supported then the
+backend will have to emulate the behavior described here.
+
+The columns are in the following order:
+
+* The SQL type [#]_ representing the field
+* The python type expected on input
+* The python type received on output
+
+.. [#] Corresponding to the `SQL 92`_ standard or to a `PostgreSQL type`_.
+.. _`SQL 92`: http://www.contrib.andrew.cmu.edu/~shadow/sql/sql1992.txt
+.. _`PostgreSQL type`: https://www.postgresql.org/docs/current/static/datatype.html
+
+`None` will represent the `NULL` value and vice versa, it can be used as input
+or output for any SQL type.
+
++--------------------+----------------------+----------------------+
+| SQL Type           | Python input type    | Python output type   |
++====================+======================+======================+
+| `BOOL`             | bool                 | bool                 |
++--------------------+----------------------+----------------------+
+| `INTEGER`          | int                  | int                  |
++--------------------+----------------------+----------------------+
+| `BIGINT`           | int / long           | int / long           |
+|                    | [#pyver_int]_        | [#pyver_int]_        |
++--------------------+----------------------+----------------------+
+| `FLOAT`            | float / int / long   | float                |
+|                    | [#pyver_int]_        |                      |
++--------------------+----------------------+----------------------+
+| `NUMERIC`          | decimal.Decimal_     | decimal.Decimal_     |
++--------------------+----------------------+----------------------+
+| `VARCHAR` /        | str / unicode        | str / unicode        |
+| `VARCHAR(length)`  | [#pyver_str]_        | [#pyver_str]_        |
++--------------------+----------------------+----------------------+
+| `TEXT`             | str / unicode        | str / unicode        |
+|                    | [#pyver_str]_        | [#pyver_str]_        |
++--------------------+----------------------+----------------------+
+| `TIMESTAMP`        | datetime.datetime_   | datetime.datetime_   |
++--------------------+----------------------+----------------------+
+| `DATETIME`         | datetime.datetime_   | datetime.datetime_   |
+|                    | without microseconds | without microseconds |
+|                    | [#utc_tz]_           | [#utc_tz]_           |
++--------------------+----------------------+----------------------+
+| `DATE`             | datetime.date_       | datetime.date_       |
++--------------------+----------------------+----------------------+
+| `TIME`             | datetime.time_       | datetime.time_       |
++--------------------+----------------------+----------------------+
+| `INTERVAL`         | datetime.timedelta_  | datetime.timedelta_  |
++--------------------+----------------------+----------------------+
+| `BLOB`             | bytes                | bytes                |
++--------------------+----------------------+----------------------+
+
+.. [#pyver_int] in python 2 integers over *sys.maxint* are represented by the
+                `long` type
+.. [#pyver_str] str when using python 3 ; unicode when using python 2
+.. [#utc_tz] Datetime objects are not localized to any timezone
+
+.. _datetime.date: https://docs.python.org/library/datetime.html#date-objects
+.. _datetime.datetime: https://docs.python.org/library/datetime.html#datetime-objects
+.. _datetime.time: https://docs.python.org/library/datetime.html#time-objects
+.. _datetime.timedelta: https://docs.python.org/library/datetime.html#timedelta-objects
+.. _decimal.Decimal: https://docs.python.org/library/decimal.html#decimal-objects
diff --git a/doc/topics/configuration.rst b/doc/topics/configuration.rst
index 9740640..1ed05e6 100644
--- a/doc/topics/configuration.rst
+++ b/doc/topics/configuration.rst
@@ -95,7 +95,7 @@ path
 The directory where Tryton stores files and so the user running `trytond`
 must have write access on this directory.
 
-Default: The db folder under the user home directory running `trytond`.
+Default: The `db` folder under the user home directory running `trytond`.
 
 list
 ~~~~
@@ -219,6 +219,37 @@ The time in seconds until a session expires.
 
 Default: `600`
 
+max_attempt
+~~~~~~~~~~~
+
+The maximum authentication attempt before the server answers unconditionally
+`Too Many Requests` for any other attempts. The counting is done on all
+attempts over a period of `timeout`.
+
+Default: `5`
+
+password
+--------
+
+length
+~~~~~~
+
+The minimal length required for the user password.
+
+Default: `8`
+
+forbidden
+~~~~~~~~~
+
+The path to a file containing one forbidden password per line.
+
+entropy
+~~~~~~~
+
+The ratio of non repeated characters for the user password.
+
+Default: `0.75`
+
 report
 ------
 
diff --git a/doc/topics/index.rst b/doc/topics/index.rst
index 6084d42..f05bf19 100644
--- a/doc/topics/index.rst
+++ b/doc/topics/index.rst
@@ -15,6 +15,7 @@ Introduction to all the key parts of trytond:
     logs
     start_server
     models/index
+    backend-types
     models/fields_default_value
     models/fields_on_change
     domain
diff --git a/doc/topics/logs.rst b/doc/topics/logs.rst
index ea90b17..6c970e7 100644
--- a/doc/topics/logs.rst
+++ b/doc/topics/logs.rst
@@ -24,28 +24,28 @@ file rotated every day.
 ::
 
     [formatters]
-    keys: simple
+    keys=simple
 
     [handlers]
-    keys: rotate, console
+    keys=rotate,console
 
     [loggers]
-    keys: root
+    keys=root
 
     [formatter_simple]
-    format: %(asctime)s] %(levelname)s:%(name)s:%(message)s
-    datefmt: %a %b %d %H:%M:%S %Y
+    format=%(asctime)s] %(levelname)s:%(name)s:%(message)s
+    datefmt=%a %b %d %H:%M:%S %Y
 
     [handler_rotate]
-    class: handlers.TimedRotatingFileHandler
-    args: ('/tmp/tryton.log', 'D', 1, 30)
-    formatter: simple
+    class=handlers.TimedRotatingFileHandler
+    args=('/tmp/tryton.log', 'D', 1, 30)
+    formatter=simple
 
     [handler_console]
-    class: StreamHandler
-    formatter: simple
-    args: (sys.stdout,)
+    class=StreamHandler
+    formatter=simple
+    args=(sys.stdout,)
 
     [logger_root]
-    level: INFO
-    handlers: rotate, console
+    level=INFO
+    handlers=rotate,console
diff --git a/doc/topics/reports/index.rst b/doc/topics/reports/index.rst
index 01128c2..ab7bbf8 100644
--- a/doc/topics/reports/index.rst
+++ b/doc/topics/reports/index.rst
@@ -23,20 +23,6 @@ document, ``*.odt``, that displays the full name and the address lines of the
 first address of each party. The genshi code is placed in the template using
 ``Functions->Placeholder->Text`` Fields. These are specific to ODT files.
 
-.. highlight:: genshi
-
-::
-
-  <for each="party in objects">
-    <party.full_name>
-    <if test="party.addresses">
-      <for each="line in party.addresses[0].full_address.split('\n')">
-        <line>
-      </for>
-    </if>
-  </for>
-
-
 Report API
 ==========
 
@@ -101,10 +87,8 @@ steps:
 
     * Set the zoom to 100% (View>Zoom)
 
-    * Set the document in read-only mode
-
- (``Tools>Options>OpenOffice.org>Security``) (Decreases the time it takes to
- open the document.)
+    * Set the document in read-only mode (``File>Properties>Security``)
+      (Decreases the time it takes to open the document.)
 
  - Usage
 
@@ -247,8 +231,8 @@ employee object.
 
 .. _Genshi XML Templates: http://genshi.edgewall.org/wiki/Documentation/0.5.x/xml-templates.html
 
-.. _Quick Example: http://code.google.com/p/python-relatorio/wiki/QuickExample
+.. _Quick Example: https://relatorio.readthedocs.io/en/latest/quickexample.html
 
-.. _In Depth Introduction: http://code.google.com/p/python-relatorio/wiki/IndepthIntroduction
+.. _In Depth Introduction: https://relatorio.readthedocs.io/en/latest/indepthexample.html
 
-.. _Example Documents: http://code.google.com/p/python-relatorio/source/browse/#hg%2Fexamples
+.. _Example Documents: http://hg.tryton.org/relatorio/file/default/examples
diff --git a/doc/topics/setup_database.rst b/doc/topics/setup_database.rst
index 977602d..c6101ad 100644
--- a/doc/topics/setup_database.rst
+++ b/doc/topics/setup_database.rst
@@ -24,3 +24,22 @@ A database can be initialized using this command line::
 
 At the end of the process, `trytond-admin` will ask to set the password for the
 `admin` user.
+
+Update a database
+=================
+
+To upgrade to a new series, the command line is::
+
+    trytond-admin -c <config file> -d <database name> --all
+
+.. warning::
+    Prior to upgrade see if there is no manual action to take on the `migration
+    topic`_.
+
+.. _`migration topic`: https://discuss.tryton.org/c/migration
+
+To activate a new language on an existing database, the command line is::
+
+    trytond-admin -c <config file> -d <database name> --all -l <language code>
+
+Once activated, the language appears in the user preferences.
diff --git a/doc/topics/triggers.rst b/doc/topics/triggers.rst
index 60fc288..50775d4 100644
--- a/doc/topics/triggers.rst
+++ b/doc/topics/triggers.rst
@@ -4,8 +4,8 @@
 Triggers
 ========
 
-Triggers allow to define methods of :ref:`Model` that are called when one of
-those events happen to a record:
+Triggers allow to define methods of :class:`trytond.model.model.Model` that are
+called when one of those events happen to a record:
 
 * On Creation
 * On Modification
@@ -20,8 +20,8 @@ Where `records` is the list of records that triggered the event and `trigger`
 is the `ir.trigger` instance which is triggered.
 
 Triggers are defined by records of `ir.trigger`. Each record must define a
-pyson condition which will be evaluaten when the event occurs. Only those
+pyson condition which will be evaluated when the event occurs. Only those
 records for which the condition is evaluated to true will be processed by the
-trigger with the exception of modification triggers which will ony process the
+trigger with the exception of modification triggers which will only process the
 records for which the condition is evaluated to false before and evaluated to
 true after the modification.
diff --git a/doc/topics/views/index.rst b/doc/topics/views/index.rst
index 21f5673..74d9eda 100644
--- a/doc/topics/views/index.rst
+++ b/doc/topics/views/index.rst
@@ -101,6 +101,15 @@ List of attributes shared by many form elements:
 
     * ``colspan``: The number of columns the widget must take in the table.
 
+    .. _common-attributes-col:
+
+    * ``col``: The number of columns the container must have.
+
+      A negative value (or zero) will remove the constraint on the number of
+      columns.
+
+      The default value is 4.
+
     .. _common-attributes-states:
 
     * ``states``: A string of :ref:`PYSON statement <topics-pyson>` that will
@@ -167,7 +176,7 @@ Each form view must start with this tag.
         The method must be registered in :attr:`trytond.model.Model.__rpc__`.
       ..
 
-    * ``col``: The number of columns for the view.
+    * ``col``: see in common-attributes-col_.
 
     * ``cursor``: The name of the field that must have the cursor by default.
 
@@ -374,7 +383,7 @@ Define a new tab inside a notebook.
     * ``angle``: The angle in degrees between the baseline of the label and the
       horizontal, measured counterclockwise.
 
-    * ``col``: The number of columns for the page view.
+    * ``col``: see in common-attributes-col_.
 
     * ``id``: see in common-attributes-id_.
 
@@ -392,7 +401,7 @@ Create a sub-table in a cell.
 
     * ``rowspan``: The number of rows the group spans in the table.
 
-    * ``col``: The number of columns for the group contains.
+    * ``col``: see in common-attributes-col_.
 
     * ``homogeneous``: If True all the tables cells are the same size.
 
@@ -696,7 +705,7 @@ board
 
 Each board view must start with this tag.
 
-    * ``col``: The number of columns for the view.
+    * ``col``: see in common-attributes-col_.
 
 image
 ^^^^^
diff --git a/setup.py b/setup.py
index 9c593a0..0bd9241 100644
--- a/setup.py
+++ b/setup.py
@@ -57,7 +57,7 @@ setup(name=name,
         'trytond.ir.module': ['*.xml'],
         'trytond.ir.ui': ['*.xml', '*.rng', '*.rnc'],
         'trytond.res': ['tryton.cfg', '*.xml', 'view/*.xml', 'locale/*.po'],
-        'trytond.tests': ['tryton.cfg', '*.xml'],
+        'trytond.tests': ['tryton.cfg', '*.xml', 'forbidden.txt'],
         },
     scripts=['bin/trytond', 'bin/trytond-admin', 'bin/trytond-cron'],
     classifiers=[
@@ -65,7 +65,7 @@ setup(name=name,
         'Environment :: No Input/Output (Daemon)',
         'Framework :: Tryton',
         'Intended Audience :: Developers',
-        'License :: OSI Approved :: GNU General Public License (GPL)',
+        'License :: OSI Approved :: GNU General Public License v3 or later (GPLv3+)',
         'Natural Language :: Bulgarian',
         'Natural Language :: Catalan',
         'Natural Language :: Chinese (Simplified)',
diff --git a/trytond.egg-info/PKG-INFO b/trytond.egg-info/PKG-INFO
index cfd1c8f..348f8a4 100644
--- a/trytond.egg-info/PKG-INFO
+++ b/trytond.egg-info/PKG-INFO
@@ -1,12 +1,12 @@
 Metadata-Version: 1.1
 Name: trytond
-Version: 4.2.3
+Version: 4.4.0
 Summary: Tryton server
 Home-page: http://www.tryton.org/
 Author: Tryton
 Author-email: issue_tracker at tryton.org
 License: GPL-3
-Download-URL: http://downloads.tryton.org/4.2/
+Download-URL: http://downloads.tryton.org/4.4/
 Description: trytond
         =======
         
@@ -103,7 +103,7 @@ Classifier: Development Status :: 5 - Production/Stable
 Classifier: Environment :: No Input/Output (Daemon)
 Classifier: Framework :: Tryton
 Classifier: Intended Audience :: Developers
-Classifier: License :: OSI Approved :: GNU General Public License (GPL)
+Classifier: License :: OSI Approved :: GNU General Public License v3 or later (GPLv3+)
 Classifier: Natural Language :: Bulgarian
 Classifier: Natural Language :: Catalan
 Classifier: Natural Language :: Chinese (Simplified)
diff --git a/trytond.egg-info/SOURCES.txt b/trytond.egg-info/SOURCES.txt
index 0882628..3e6a977 100644
--- a/trytond.egg-info/SOURCES.txt
+++ b/trytond.egg-info/SOURCES.txt
@@ -29,6 +29,7 @@ doc/ref/tools/misc.rst
 doc/ref/tools/singleton.rst
 doc/topics/access_rights.rst
 doc/topics/actions.rst
+doc/topics/backend_types.rst
 doc/topics/configuration.rst
 doc/topics/domain.rst
 doc/topics/index.rst
@@ -113,8 +114,6 @@ trytond/ir/module.py
 trytond/ir/module.xml
 trytond/ir/note.py
 trytond/ir/note.xml
-trytond/ir/property.py
-trytond/ir/property.xml
 trytond/ir/resource.py
 trytond/ir/rule.py
 trytond/ir/rule.xml
@@ -229,8 +228,6 @@ trytond/ir/view/module_form.xml
 trytond/ir/view/module_list.xml
 trytond/ir/view/note_form.xml
 trytond/ir/view/note_list.xml
-trytond/ir/view/property_form.xml
-trytond/ir/view/property_list.xml
 trytond/ir/view/rule_form.xml
 trytond/ir/view/rule_group_form.xml
 trytond/ir/view/rule_group_list.xml
@@ -272,6 +269,7 @@ trytond/model/modelsingleton.py
 trytond/model/modelsql.py
 trytond/model/modelstorage.py
 trytond/model/modelview.py
+trytond/model/multivalue.py
 trytond/model/order.py
 trytond/model/union.py
 trytond/model/workflow.py
@@ -290,7 +288,6 @@ trytond/model/fields/many2one.py
 trytond/model/fields/numeric.py
 trytond/model/fields/one2many.py
 trytond/model/fields/one2one.py
-trytond/model/fields/property.py
 trytond/model/fields/reference.py
 trytond/model/fields/selection.py
 trytond/model/fields/text.py
@@ -346,12 +343,14 @@ trytond/tests/access.py
 trytond/tests/copy_.py
 trytond/tests/export_data.py
 trytond/tests/field_context.py
+trytond/tests/forbidden.txt
 trytond/tests/history.py
 trytond/tests/import_data.py
 trytond/tests/import_data.xml
 trytond/tests/model.py
 trytond/tests/modelview.py
 trytond/tests/mptt.py
+trytond/tests/multivalue.py
 trytond/tests/run-tests.py
 trytond/tests/sequence.xml
 trytond/tests/test.py
@@ -361,6 +360,7 @@ trytond/tests/test_copy.py
 trytond/tests/test_descriptors.py
 trytond/tests/test_exportdata.py
 trytond/tests/test_field_context.py
+trytond/tests/test_field_depends.py
 trytond/tests/test_fields.py
 trytond/tests/test_filestore.py
 trytond/tests/test_history.py
@@ -373,6 +373,7 @@ trytond/tests/test_modelsql.py
 trytond/tests/test_modelstorage.py
 trytond/tests/test_modelview.py
 trytond/tests/test_mptt.py
+trytond/tests/test_multivalue.py
 trytond/tests/test_order.py
 trytond/tests/test_protocols.py
 trytond/tests/test_pyson.py
@@ -400,6 +401,7 @@ trytond/tools/__init__.py
 trytond/tools/datetime_strftime.py
 trytond/tools/decimal_.py
 trytond/tools/misc.py
+trytond/tools/multivalue.py
 trytond/tools/singleton.py
 trytond/wizard/__init__.py
 trytond/wizard/wizard.py
\ No newline at end of file
diff --git a/trytond/__init__.py b/trytond/__init__.py
index 7a81fd1..40f6c94 100644
--- a/trytond/__init__.py
+++ b/trytond/__init__.py
@@ -2,18 +2,17 @@
 # this repository contains the full copyright notices and license terms.
 import os
 import time
-import logging
+import warnings
 from email import charset
 
-__version__ = "4.2.3"
-logger = logging.getLogger(__name__)
+__version__ = "4.4.0"
 
 os.environ['TZ'] = 'UTC'
 if hasattr(time, 'tzset'):
     time.tzset()
 
 if time.tzname[0] != 'UTC':
-    logger.error('Timezone must be set to UTC instead of %s', time.tzname[0])
+    warnings.warn('Timezone must be set to UTC instead of %s', time.tzname[0])
 
 # set email encoding for utf-8 to 'quoted-printable'
 charset.add_charset('utf-8', charset.QP, charset.QP)
diff --git a/trytond/admin.py b/trytond/admin.py
index 96e4232..fb09aea 100644
--- a/trytond/admin.py
+++ b/trytond/admin.py
@@ -21,7 +21,7 @@ def run(options):
     init = {}
     for db_name in options.database_names:
         init[db_name] = False
-        with Transaction().start(db_name, 0):
+        with Transaction().start(db_name, 0, _nocache=True):
             database = Database(db_name)
             database.connect()
             if options.update:
diff --git a/trytond/backend/database.py b/trytond/backend/database.py
index d825c6b..fe92d04 100644
--- a/trytond/backend/database.py
+++ b/trytond/backend/database.py
@@ -1,8 +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 collections import namedtuple
+
 DatabaseIntegrityError = None
 DatabaseOperationalError = None
 
+SQLType = namedtuple('SQLType', 'base type')
+
 
 class DatabaseInterface(object):
     '''
@@ -151,3 +155,19 @@ class DatabaseInterface(object):
     def has_multirow_insert(self):
         'Return True if database supports multirow insert'
         return False
+
+    def has_select_for(self):
+        "Return if database supports FOR UPDATE/SHARE clause in SELECT."
+        return False
+
+    def has_window_functions(self):
+        "Return if database supports window functions."
+        return False
+
+    def sql_type(self, type_):
+        'Return the SQLType tuple corresponding to the SQL type'
+        pass
+
+    def sql_format(self, type_, value):
+        'Return value correctly casted into type_'
+        pass
diff --git a/trytond/backend/mysql/database.py b/trytond/backend/mysql/database.py
index ab73120..73b7fec 100644
--- a/trytond/backend/mysql/database.py
+++ b/trytond/backend/mysql/database.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.
-from trytond.backend.database import DatabaseInterface
+from trytond.backend.database import DatabaseInterface, SQLType
 from trytond.config import config, parse_uri
 import MySQLdb
 import MySQLdb.cursors
@@ -75,7 +75,19 @@ class Database(DatabaseInterface):
 
     _list_cache = None
     _list_cache_timestamp = None
-    flavor = Flavor(max_limit=18446744073709551610, function_mapping=MAPPING)
+    flavor = Flavor(
+        max_limit=18446744073709551610, function_mapping=MAPPING,
+        null_ordering=False)
+
+    TYPES_MAPPING = {
+        'BLOB': SQLType('LONGBLOB', 'LONGBLOB'),
+        'DATETIME': SQLType('TIMESTAMP', 'TIMESTAMP NULL'),
+        'TIMESTAMP': SQLType('TIMESTAMP', 'TIMESTAMP NULL'),
+        'FLOAT': SQLType('DOUBLE', 'DOUBLE(255, 15)'),
+        'INTEGER': SQLType('SIGNED INTEGER', 'BIGINT'),
+        'BIGINTEGER': SQLType('SIGNED INTEGER', 'BIGINT'),
+        'NUMERIC': SQLType('DECIMAL', 'DECIMAL(65, 30)'),
+        }
 
     def connect(self):
         return self
@@ -92,7 +104,6 @@ class Database(DatabaseInterface):
             'conv': conv,
         }
         uri = parse_uri(config.get('database', 'uri'))
-        assert uri.scheme == 'mysql'
         if uri.hostname:
             args['host'] = uri.hostname
         if uri.port:
@@ -223,3 +234,15 @@ class Database(DatabaseInterface):
         cursor = connection.cursor()
         cursor.execute('ALTER TABLE `%s` AUTO_INCREMENT = %%s' % table,
                 (value,))
+
+    def sql_type(self, type_):
+        if type_ in self.TYPES_MAPPING:
+            return self.TYPES_MAPPING[type_]
+        if type_.startswith('VARCHAR'):
+            return SQLType('CHAR', 'VARCHAR(255)')
+        return SQLType(type_, type_)
+
+    def sql_format(self, type_, value):
+        if type_ == 'INTERVAL':
+            return value.total_seconds()
+        return value
diff --git a/trytond/backend/mysql/init.sql b/trytond/backend/mysql/init.sql
index 0f78e4f..cb91ae6 100644
--- a/trytond/backend/mysql/init.sql
+++ b/trytond/backend/mysql/init.sql
@@ -125,3 +125,9 @@ CREATE TABLE ir_module_dependency (
     CONSTRAINT ir_module_dependency_write_uid_fkey FOREIGN KEY (write_uid) REFERENCES res_user (id) ON DELETE SET NULL,
     CONSTRAINT ir_module_dependency_module_fkey FOREIGN KEY (module) REFERENCES ir_module (id) ON DELETE CASCADE
 ) ENGINE=InnoDB;
+
+CREATE TABLE ir_cache (
+    id BIGINT AUTO_INCREMENT NOT NULL,
+    name VARCHAR(255),
+    "timestamp" TIMESTAMP
+) ENGINE=InnoDB;
diff --git a/trytond/backend/mysql/table.py b/trytond/backend/mysql/table.py
index bfe6031..a16f409 100644
--- a/trytond/backend/mysql/table.py
+++ b/trytond/backend/mysql/table.py
@@ -1,11 +1,13 @@
 # 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 re
+import logging
 
 from trytond.transaction import Transaction
 from trytond.backend.table import TableHandlerInterface
-import logging
 
 logger = logging.getLogger(__name__)
+VARCHAR_SIZE_RE = re.compile('VARCHAR\(([0-9]+)\)')
 
 
 class TableHandler(TableHandlerInterface):
@@ -178,11 +180,15 @@ class TableHandler(TableHandlerInterface):
                 self._column_definition(column_name, default=value)))
         self._update_definitions(columns=True)
 
-    def add_raw_column(self, column_name, column_type, column_format,
-            default_fun=None, field_size=None, migrate=True, string=''):
+    def add_column(self, column_name, sql_type, default=None, comment=''):
+        cursor = Transaction().connection.cursor()
+        database = Transaction().database
+
+        column_type = database.sql_type(sql_type)
+        match = VARCHAR_SIZE_RE.match(sql_type)
+        field_size = int(match.group(1)) if match else None
+
         if self.column_exist(column_name):
-            if not migrate:
-                return
             base_type = column_type[0].lower()
             convert = {
                 'char': 'varchar',
@@ -224,22 +230,17 @@ class TableHandler(TableHandlerInterface):
                         field_size)
             return
 
-        cursor = Transaction().connection.cursor()
         column_type = column_type[1]
         cursor.execute('ALTER TABLE `%s` ADD COLUMN `%s` %s' %
                 (self.table_name, column_name, column_type))
 
-        if column_format:
+        if default:
             # check if table is non-empty:
             cursor.execute('SELECT 1 FROM `%s` limit 1' % self.table_name)
             if cursor.rowcount:
                 # Populate column with default values:
-                default = None
-                if default_fun is not None:
-                    default = default_fun()
                 cursor.execute('UPDATE `' + self.table_name + '` '
-                    'SET `' + column_name + '` = %s',
-                    (column_format(default),))
+                    'SET `' + column_name + '` = %s', (default(),))
 
         self._update_definitions(columns=True)
 
diff --git a/trytond/backend/postgresql/database.py b/trytond/backend/postgresql/database.py
index 2cb8d35..d45026c 100644
--- a/trytond/backend/postgresql/database.py
+++ b/trytond/backend/postgresql/database.py
@@ -6,14 +6,16 @@ import re
 import os
 import urllib
 from decimal import Decimal
+from threading import RLock
 
 try:
     from psycopg2cffi import compat
     compat.register()
 except ImportError:
     pass
-from psycopg2 import connect
+from psycopg2 import connect, Binary
 from psycopg2.pool import ThreadedConnectionPool, PoolError
+from psycopg2.extensions import cursor
 from psycopg2.extensions import ISOLATION_LEVEL_REPEATABLE_READ
 from psycopg2.extensions import ISOLATION_LEVEL_AUTOCOMMIT
 from psycopg2.extensions import register_type, register_adapter
@@ -27,7 +29,7 @@ from psycopg2 import OperationalError as DatabaseOperationalError
 
 from sql import Flavor
 
-from trytond.backend.database import DatabaseInterface
+from trytond.backend.database import DatabaseInterface, SQLType
 from trytond.config import config, parse_uri
 
 __all__ = ['Database', 'DatabaseIntegrityError', 'DatabaseOperationalError']
@@ -51,31 +53,54 @@ def replace_special_values(s, **mapping):
     return s
 
 
+class LoggingCursor(cursor):
+    def execute(self, sql, args=None):
+        if logger.isEnabledFor(logging.DEBUG):
+            logger.debug(self.mogrify(sql, args))
+        cursor.execute(self, sql, args)
+
+
 class Database(DatabaseInterface):
 
+    _lock = RLock()
     _databases = {}
     _connpool = None
     _list_cache = None
     _list_cache_timestamp = None
     _version_cache = {}
+    _search_path = None
+    _current_user = None
+    _has_returning = None
     flavor = Flavor(ilike=True)
 
+    TYPES_MAPPING = {
+        'INTEGER': SQLType('INT4', 'INT4'),
+        'BIGINT': SQLType('INT8', 'INT8'),
+        'FLOAT': SQLType('FLOAT8', 'FLOAT8'),
+        'BLOB': SQLType('BYTEA', 'BYTEA'),
+        'DATETIME': SQLType('TIMESTAMP', 'TIMESTAMP(0)'),
+        'TIMESTAMP': SQLType('TIMESTAMP', 'TIMESTAMP(6)'),
+        }
+
     def __new__(cls, name='template1'):
-        if name in cls._databases:
-            return cls._databases[name]
-        return DatabaseInterface.__new__(cls, name=name)
+        with cls._lock:
+            if name in cls._databases:
+                return cls._databases[name]
+            inst = DatabaseInterface.__new__(cls, name=name)
+            cls._databases[name] = inst
 
-    def __init__(self, name='template1'):
-        super(Database, self).__init__(name=name)
-        self._databases.setdefault(name, self)
-        self._search_path = None
-        self._current_user = None
-        self._has_returning = None
+            logger.info('connect to "%s"', name)
+            minconn = config.getint('database', 'minconn', default=1)
+            maxconn = config.getint('database', 'maxconn', default=64)
+            inst._connpool = ThreadedConnectionPool(
+                minconn, maxconn, cls.dsn(name),
+                cursor_factory=LoggingCursor)
+
+            return inst
 
     @classmethod
     def dsn(cls, name):
         uri = parse_uri(config.get('database', 'uri'))
-        assert uri.scheme == 'postgresql'
         host = uri.hostname and "host=%s" % uri.hostname or ''
         port = uri.port and "port=%s" % uri.port or ''
         name = "dbname=%s" % name
@@ -85,18 +110,9 @@ class Database(DatabaseInterface):
         return '%s %s %s %s %s' % (host, port, name, user, password)
 
     def connect(self):
-        if self._connpool is not None:
-            return self
-        logger.info('connect to "%s"', self.name)
-        minconn = config.getint('database', 'minconn', default=1)
-        maxconn = config.getint('database', 'maxconn', default=64)
-        self._connpool = ThreadedConnectionPool(
-            minconn, maxconn, self.dsn(self.name))
         return self
 
     def get_connection(self, autocommit=False, readonly=False):
-        if self._connpool is None:
-            self.connect()
         for count in range(config.getint('database', 'retry'), -1, -1):
             try:
                 conn = self._connpool.getconn()
@@ -120,10 +136,9 @@ class Database(DatabaseInterface):
         self._connpool.putconn(connection, close=close)
 
     def close(self):
-        if self._connpool is None:
-            return
-        self._connpool.closeall()
-        self._connpool = None
+        with self._lock:
+            self._connpool.closeall()
+            self._databases.pop(self.name)
 
     @classmethod
     def create(cls, connection, database_name):
@@ -136,7 +151,7 @@ class Database(DatabaseInterface):
     def drop(self, connection, database_name):
         cursor = connection.cursor()
         cursor.execute('DROP DATABASE "' + database_name + '"')
-        Database._list_cache = None
+        self.__class__._list_cache = None
 
     def get_version(self, connection):
         if self.name not in self._version_cache:
@@ -150,8 +165,8 @@ class Database(DatabaseInterface):
     def list(self):
         now = time.time()
         timeout = config.getint('session', 'timeout')
-        res = Database._list_cache
-        if res and abs(Database._list_cache_timestamp - now) < timeout:
+        res = self.__class__._list_cache
+        if res and abs(self.__class__._list_cache_timestamp - now) < timeout:
             return res
 
         connection = self.get_connection()
@@ -168,8 +183,8 @@ class Database(DatabaseInterface):
                 continue
         self.put_connection(connection)
 
-        Database._list_cache = res
-        Database._list_cache_timestamp = now
+        self.__class__._list_cache = res
+        self.__class__._list_cache_timestamp = now
         return res
 
     def init(self):
@@ -295,6 +310,25 @@ class Database(DatabaseInterface):
                 self.put_connection(connection)
         return self._has_returning
 
+    def has_select_for(self):
+        return True
+
+    def has_window_functions(self):
+        return True
+
+    def sql_type(self, type_):
+        if type_ in self.TYPES_MAPPING:
+            return self.TYPES_MAPPING[type_]
+        if type_.startswith('VARCHAR'):
+            return SQLType('VARCHAR', type_)
+        return SQLType(type_, type_)
+
+    def sql_format(self, type_, value):
+        if type_ == 'BLOB':
+            if value is not None:
+                return Binary(value)
+        return value
+
 register_type(UNICODE)
 if PYDATE:
     register_type(PYDATE)
diff --git a/trytond/backend/postgresql/init.sql b/trytond/backend/postgresql/init.sql
index 0872bc6..e4da192 100644
--- a/trytond/backend/postgresql/init.sql
+++ b/trytond/backend/postgresql/init.sql
@@ -149,3 +149,11 @@ CREATE TABLE ir_module_dependency (
     FOREIGN KEY (write_uid) REFERENCES res_user ON DELETE SET NULL,
     FOREIGN KEY (module) REFERENCES ir_module ON DELETE CASCADE
 );
+
+CREATE SEQUENCE ir_cache_id_seq;
+
+CREATE TABLE ir_cache (
+    id INTEGER DEFAULT NEXTVAL('ir_cache_id_seq') NOT NULL,
+    name VARCHAR NOT NULL,
+    "timestamp" TIMESTAMP WITHOUT TIME ZONE
+);
diff --git a/trytond/backend/postgresql/table.py b/trytond/backend/postgresql/table.py
index a332304..f2cacb8 100644
--- a/trytond/backend/postgresql/table.py
+++ b/trytond/backend/postgresql/table.py
@@ -1,12 +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 re
+import logging
+
 from trytond.transaction import Transaction
 from trytond.backend.table import TableHandlerInterface
-import logging
 
 __all__ = ['TableHandler']
 
 logger = logging.getLogger(__name__)
+VARCHAR_SIZE_RE = re.compile('VARCHAR\(([0-9]+)\)')
 
 
 class TableHandler(TableHandlerInterface):
@@ -234,23 +237,25 @@ class TableHandler(TableHandlerInterface):
                 'ALTER COLUMN "' + column_name + '" SET DEFAULT %s',
                 (value,))
 
-    def add_raw_column(self, column_name, column_type, column_format,
-            default_fun=None, field_size=None, migrate=True, string=''):
+    def add_column(self, column_name, sql_type, default=None, comment=''):
         cursor = Transaction().connection.cursor()
+        database = Transaction().database
+
+        column_type = database.sql_type(sql_type)
+        match = VARCHAR_SIZE_RE.match(sql_type)
+        field_size = int(match.group(1)) if match else None
 
-        def comment():
-            if self.is_owner:
+        def add_comment():
+            if comment and self.is_owner:
                 cursor.execute('COMMENT ON COLUMN "%s"."%s" IS \'%s\'' %
-                    (self.table_name, column_name, string.replace("'", "''")))
+                    (self.table_name, column_name, comment.replace("'", "''")))
         if self.column_exist(column_name):
             if (column_name in ('create_date', 'write_date')
                     and column_type[1].lower() != 'timestamp(6)'):
                 # Migrate dates from timestamp(0) to timestamp
                 cursor.execute('ALTER TABLE "' + self.table_name + '" '
                     'ALTER COLUMN "' + column_name + '" TYPE timestamp')
-            comment()
-            if not migrate:
-                return
+            add_comment()
             base_type = column_type[0].lower()
             if base_type != self._columns[column_name]['typname']:
                 if (self._columns[column_name]['typname'], base_type) in [
@@ -290,19 +295,15 @@ class TableHandler(TableHandlerInterface):
         column_type = column_type[1]
         cursor.execute('ALTER TABLE "%s" ADD COLUMN "%s" %s'
             % (self.table_name, column_name, column_type))
-        comment()
+        add_comment()
 
-        if column_format:
+        if default:
             # check if table is non-empty:
             cursor.execute('SELECT 1 FROM "%s" limit 1' % self.table_name)
             if cursor.rowcount:
                 # Populate column with default values:
-                default = None
-                if default_fun is not None:
-                    default = default_fun()
                 cursor.execute('UPDATE "' + self.table_name + '" '
-                    'SET "' + column_name + '" = %s',
-                    (column_format(default),))
+                    'SET "' + column_name + '" = %s', (default(),))
 
         self._update_definitions(columns=True)
 
diff --git a/trytond/backend/sqlite/database.py b/trytond/backend/sqlite/database.py
index 7f45a47..809d280 100644
--- a/trytond/backend/sqlite/database.py
+++ b/trytond/backend/sqlite/database.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.
-from trytond.backend.database import DatabaseInterface
+from trytond.backend.database import DatabaseInterface, SQLType
 from trytond.config import config
 import os
 from decimal import Decimal
@@ -8,6 +8,7 @@ import datetime
 import time
 import sys
 import threading
+import logging
 
 _FIX_ROWCOUNT = False
 try:
@@ -20,11 +21,12 @@ except ImportError:
     import sqlite3 as sqlite
     from sqlite3 import IntegrityError as DatabaseIntegrityError
     from sqlite3 import OperationalError as DatabaseOperationalError
-from sql import Flavor, Table
+from sql import Flavor, Table, Query, Expression
 from sql.functions import (Function, Extract, Position, Substring,
-    Overlay, CharLength, CurrentTimestamp)
+    Overlay, CharLength, CurrentTimestamp, Trim)
 
 __all__ = ['Database', 'DatabaseIntegrityError', 'DatabaseOperationalError']
+logger = logging.getLogger(__name__)
 
 
 class SQLiteExtract(Function):
@@ -142,6 +144,27 @@ class SQLiteCurrentTimestamp(Function):
     _function = 'NOW'  # More precise
 
 
+class SQLiteTrim(Trim):
+
+    def __str__(self):
+        flavor = Flavor.get()
+        param = flavor.param
+
+        function = {
+            'BOTH': 'TRIM',
+            'LEADING': 'LTRIM',
+            'TRAILING': 'RTRIM',
+            }[self.position]
+
+        def format(arg):
+            if isinstance(arg, basestring):
+                return param
+            else:
+                return str(arg)
+        return function + '(%s, %s)' % (
+            format(self.string), format(self.characters))
+
+
 def sign(value):
     if value > 0:
         return 1
@@ -174,6 +197,7 @@ MAPPING = {
     Overlay: SQLiteOverlay,
     CharLength: SQLiteCharLength,
     CurrentTimestamp: SQLiteCurrentTimestamp,
+    Trim: SQLiteTrim,
     }
 
 
@@ -196,9 +220,15 @@ class Database(DatabaseInterface):
 
     _local = threading.local()
     _conn = None
-    flavor = Flavor(paramstyle='qmark', function_mapping=MAPPING)
+    flavor = Flavor(
+        paramstyle='qmark', function_mapping=MAPPING, null_ordering=False)
     IN_MAX = 200
 
+    TYPES_MAPPING = {
+        'DATETIME': SQLType('TIMESTAMP', 'TIMESTAMP'),
+        'BIGINT': SQLType('INTEGER', 'INTEGER'),
+        }
+
     def __new__(cls, name=':memory:'):
         if (name == ':memory:'
                 and getattr(cls._local, 'memory_database', None)):
@@ -235,6 +265,9 @@ class Database(DatabaseInterface):
         self._conn.create_function('sign', 1, sign)
         self._conn.create_function('greatest', -1, greatest)
         self._conn.create_function('least', -1, least)
+        if (hasattr(self._conn, 'set_trace_callback')
+                and logger.isEnabledFor(logging.DEBUG)):
+            self._conn.set_trace_callback(logger.debug)
         self._conn.execute('PRAGMA foreign_keys = ON')
         return self
 
@@ -373,6 +406,20 @@ class Database(DatabaseInterface):
     def has_multirow_insert(self):
         return True
 
+    def sql_type(self, type_):
+        if type_ in self.TYPES_MAPPING:
+            return self.TYPES_MAPPING[type_]
+        if type_.startswith('VARCHAR'):
+            return SQLType('VARCHAR', 'VARCHAR')
+        return SQLType(type_, type_)
+
+    def sql_format(self, type_, value):
+        if type_ in ('INTEGER', 'BIGINT'):
+            if (value is not None
+                    and not isinstance(value, (Query, Expression))):
+                value = int(value)
+        return value
+
 sqlite.register_converter('NUMERIC', lambda val: Decimal(val.decode('utf-8')))
 if sys.version_info[0] == 2:
     sqlite.register_adapter(Decimal, lambda val: buffer(str(val)))
diff --git a/trytond/backend/sqlite/init.sql b/trytond/backend/sqlite/init.sql
index c969747..6b5c0a4 100644
--- a/trytond/backend/sqlite/init.sql
+++ b/trytond/backend/sqlite/init.sql
@@ -101,3 +101,9 @@ CREATE TABLE ir_module_dependency (
     name VARCHAR,
     module INTEGER
 );
+
+CREATE TABLE ir_cache (
+    id INTEGER PRIMARY KEY AUTOINCREMENT,
+    name VARCHAR,
+    "timestamp" TIMESTAMP
+);
diff --git a/trytond/backend/sqlite/table.py b/trytond/backend/sqlite/table.py
index 044217e..c45502c 100644
--- a/trytond/backend/sqlite/table.py
+++ b/trytond/backend/sqlite/table.py
@@ -10,6 +10,7 @@ import warnings
 __all__ = ['TableHandler']
 
 logger = logging.getLogger(__name__)
+VARCHAR_SIZE_RE = re.compile('VARCHAR\(([0-9]+)\)')
 
 
 class TableHandler(TableHandlerInterface):
@@ -107,8 +108,7 @@ class TableHandler(TableHandlerInterface):
                     in self._columns.iteritems():
                 if column == old_name:
                     column = new_name
-                new_table.add_raw_column(column, typname, False,
-                    field_size=size)
+                new_table._add_raw_column(column, typname, field_size=size)
             new_columns = new_table._columns.keys()
             old_columns = [x if x != old_name else new_name
                 for x in new_columns]
@@ -176,11 +176,18 @@ class TableHandler(TableHandlerInterface):
     def db_default(self, column_name, value):
         warnings.warn('Unable to set default on column with SQLite backend')
 
-    def add_raw_column(self, column_name, column_type, column_format,
-            default_fun=None, field_size=None, migrate=True, string=''):
+    def add_column(self, column_name, sql_type, default=None, comment=''):
+        database = Transaction().database
+        column_type = database.sql_type(sql_type)
+        match = VARCHAR_SIZE_RE.match(sql_type)
+        field_size = int(match.group(1)) if match else None
+
+        self._add_raw_column(column_name, column_type, default, field_size,
+            comment)
+
+    def _add_raw_column(self, column_name, column_type, default=None,
+            field_size=None, string=''):
         if self.column_exist(column_name):
-            if not migrate:
-                return
             base_type = column_type[0].upper()
             if base_type != self._columns[column_name]['typname']:
                 if (self._columns[column_name]['typname'], base_type) in [
@@ -219,21 +226,16 @@ class TableHandler(TableHandlerInterface):
 
         cursor = Transaction().connection.cursor()
         column_type = column_type[1]
-        default = ''
-        cursor.execute(('ALTER TABLE "%s" ADD COLUMN "%s" %s' + default) %
+        cursor.execute(('ALTER TABLE "%s" ADD COLUMN "%s" %s') %
                        (self.table_name, column_name, column_type))
 
-        if column_format:
+        if default:
             # check if table is non-empty:
             cursor.execute('SELECT 1 FROM "%s" limit 1' % self.table_name)
             if cursor.fetchone():
                 # Populate column with default values:
-                default = None
-                if default_fun is not None:
-                    default = default_fun()
                 cursor.execute('UPDATE "' + self.table_name + '" '
-                    'SET "' + column_name + '" = ?',
-                    (column_format(default),))
+                    'SET "' + column_name + '" = ?', (default(),))
 
         self._update_definitions(columns=True)
 
@@ -302,8 +304,7 @@ class TableHandler(TableHandlerInterface):
         for name, (notnull, hasdef, size, typname) \
                 in self._columns.iteritems():
             if name != column_name:
-                new_table.add_raw_column(name, typname, True,
-                    field_size=size)
+                new_table._add_raw_column(name, typname, field_size=size)
         columns_name = [x for x in new_table._columns.keys()]
         cursor.execute(('INSERT INTO "%s" (' +
                         ','.join('"%s"' % c for c in columns_name) +
diff --git a/trytond/backend/table.py b/trytond/backend/table.py
index 887d415..53261f6 100644
--- a/trytond/backend/table.py
+++ b/trytond/backend/table.py
@@ -113,19 +113,14 @@ class TableHandlerInterface(object):
         '''
         raise NotImplementedError
 
-    def add_raw_column(self, column_name, column_type, column_format,
-            default_fun=None, field_size=None, migrate=True,
-            string=''):
+    def add_column(self, column_name, abstract_type, default=None, comment=''):
         '''
         Add a column
 
         :param column_name: the column name
-        :param column_type: the column definition
-        :param column_format: the function to format default value
-        :param default_fun: the function that return the default value
-        :param field_size: the size of the column if there is one
-        :param migrate: boolean to try to migrate the column if exists
-        :param string: the label of the column
+        :param abstract_type: the abstract type that will represent this column
+        :param default: the method that return default value to use
+        :param comment: An optional comment on the column
         '''
         raise NotImplementedError
 
diff --git a/trytond/cache.py b/trytond/cache.py
index a784548..e760e8d 100644
--- a/trytond/cache.py
+++ b/trytond/cache.py
@@ -105,7 +105,7 @@ class MemoryCache(BaseCache):
 
     @staticmethod
     def clean(dbname):
-        with Transaction().new_transaction() as transaction,\
+        with Transaction().new_transaction(_nocache=True) as transaction,\
                 transaction.connection.cursor() as cursor:
             table = Table('ir_cache')
             cursor.execute(*table.select(table.timestamp, table.name))
@@ -129,7 +129,7 @@ class MemoryCache(BaseCache):
     @staticmethod
     def resets(dbname):
         table = Table('ir_cache')
-        with Transaction().new_transaction() as transaction,\
+        with Transaction().new_transaction(_nocache=True) as transaction,\
                 transaction.connection.cursor() as cursor,\
                 Cache._resets_lock:
             Cache._resets.setdefault(dbname, set())
diff --git a/trytond/config.py b/trytond/config.py
index 0ee5eec..bfdc2e4 100644
--- a/trytond/config.py
+++ b/trytond/config.py
@@ -62,6 +62,10 @@ class TrytonConfigParser(ConfigParser.RawConfigParser):
         self.add_section('session')
         self.set('session', 'authentications', 'password')
         self.set('session', 'timeout', 600)
+        self.set('session', 'max_attempt', 5)
+        self.add_section('password')
+        self.set('password', 'length', 8)
+        self.set('password', 'entropy', 0.75)
         self.add_section('report')
         self.set('report', 'unoconv',
             'pipe,name=trytond;urp;StarOffice.ComponentContext')
diff --git a/trytond/exceptions.py b/trytond/exceptions.py
index 86cb32e..acb3765 100644
--- a/trytond/exceptions.py
+++ b/trytond/exceptions.py
@@ -14,6 +14,9 @@ class UserError(TrytonException):
         self.description = description
         self.code = 1
 
+    def __str__(self):
+        return '%s - %s' % (self.message, self.description)
+
 
 class UserWarning(TrytonException):
 
@@ -25,6 +28,9 @@ class UserWarning(TrytonException):
         self.description = description
         self.code = 2
 
+    def __str__(self):
+        return '%s - %s' % (self.message, self.description)
+
 
 class LoginException(TrytonException):
     """Request the named parameter for the login process.
@@ -47,3 +53,10 @@ class ConcurrencyException(TrytonException):
             message)
         self.message = message
         self.code = 4
+
+    def __str__(self):
+        return self.message
+
+
+class RateLimitException(TrytonException):
+    """User has sent too many requests in a given amount of time."""
diff --git a/trytond/ir/__init__.py b/trytond/ir/__init__.py
index 4d6cedb..1e0a5ae 100644
--- a/trytond/ir/__init__.py
+++ b/trytond/ir/__init__.py
@@ -7,7 +7,6 @@ from .sequence import *
 from .ui.menu import *
 from .ui.view import *
 from .ui.icon import *
-from .property import *
 from .action import *
 from .model import *
 from .attachment import *
@@ -45,7 +44,6 @@ def register():
         ViewTreeState,
         ViewSearch,
         Icon,
-        Property,
         Action,
         ActionKeyword,
         ActionReport,
@@ -93,6 +91,7 @@ def register():
         TranslationClean,
         TranslationUpdate,
         TranslationExport,
+        TranslationReport,
         ShowView,
         PrintModelGraph,
         ModuleConfigWizard,
diff --git a/trytond/ir/action.py b/trytond/ir/action.py
index 8fdb78f..1f3b6d1 100644
--- a/trytond/ir/action.py
+++ b/trytond/ir/action.py
@@ -6,13 +6,13 @@ from operator import itemgetter
 from collections import defaultdict
 from functools import partial
 
-from sql import Table
+from sql import Table, Null
 from sql.aggregate import Count
 
 from ..model import ModelView, ModelStorage, ModelSQL, fields
 from ..tools import file_open
 from .. import backend
-from ..pyson import PYSONDecoder, PYSON
+from ..pyson import PYSONDecoder, PYSON, Eval
 from ..transaction import Transaction
 from ..pool import Pool
 from ..cache import Cache
@@ -154,7 +154,8 @@ class ActionKeyword(ModelSQL, ModelView):
             if action_wizards:
                 action_wizard, = action_wizards
                 if action_wizard.model:
-                    if self.model.__name__ != action_wizard.model:
+                    if not str(self.model).startswith(
+                            '%s,' % action_wizard.model):
                         self.raise_user_error('wrong_wizard_model', (
                                 action_wizard.rec_name,))
 
@@ -392,8 +393,14 @@ class ActionReport(ActionMixin, ModelSQL, ModelView):
     _action_name = 'report_name'
     model = fields.Char('Model')
     report_name = fields.Char('Internal Name', required=True)
-    report = fields.Char('Path')
+    report = fields.Char(
+        "Path",
+        states={
+            'invisible': Eval('is_custom', False),
+            },
+        depends=['is_custom'])
     report_content_custom = fields.Binary('Content')
+    is_custom = fields.Function(fields.Boolean("Is Custom"), 'get_is_custom')
     report_content = fields.Function(fields.Binary('Content',
             filename='report_content_name'),
         'get_report_content', setter='set_report_content')
@@ -603,6 +610,9 @@ class ActionReport(ActionMixin, ModelSQL, ModelView):
                 else:
                     cls.raise_user_error('invalid_email', (report.rec_name,))
 
+    def get_is_custom(self, name):
+        return bool(self.report_content_custom)
+
     @classmethod
     def get_report_content(cls, reports, name):
         contents = {}
@@ -687,14 +697,16 @@ class ActionActWindow(ActionMixin, ModelSQL, ModelView):
     order = fields.Char('Order Value')
     res_model = fields.Char('Model')
     context_model = fields.Char('Context Model')
+    context_domain = fields.Char(
+        "Context Domain",
+        help="Part of the domain that will be evaluated on each refresh")
     act_window_views = fields.One2Many('ir.action.act_window.view',
             'act_window', 'Views')
     views = fields.Function(fields.Binary('Views'), 'get_views')
     act_window_domains = fields.One2Many('ir.action.act_window.domain',
         'act_window', 'Domains')
     domains = fields.Function(fields.Binary('Domains'), 'get_domains')
-    limit = fields.Integer('Limit', required=True,
-            help='Default limit for the list view')
+    limit = fields.Integer('Limit', help='Default limit for the list view')
     action = fields.Many2One('ir.action', 'Action', required=True,
             ondelete='CASCADE')
     search_value = fields.Char('Search Criteria',
@@ -741,6 +753,12 @@ class ActionActWindow(ActionMixin, ModelSQL, ModelView):
         # Migration from 4.0: window_name removed
         table.drop_column('window_name')
 
+        # Migration from 4.2: remove required on limit
+        table.not_null_action('limit', 'remove')
+        cursor.execute(*act_window.update(
+                [act_window.limit], [Null],
+                where=act_window.limit == 0))
+
     @staticmethod
     def default_type():
         return 'ir.action.act_window'
@@ -750,10 +768,6 @@ class ActionActWindow(ActionMixin, ModelSQL, ModelView):
         return '{}'
 
     @staticmethod
-    def default_limit():
-        return 0
-
-    @staticmethod
     def default_search_value():
         return '[]'
 
diff --git a/trytond/ir/cron.py b/trytond/ir/cron.py
index 0dfa2f5..3872d9f 100644
--- a/trytond/ir/cron.py
+++ b/trytond/ir/cron.py
@@ -14,7 +14,6 @@ from ..transaction import Transaction
 from ..pool import Pool
 from .. import backend
 from ..config import config
-from ..cache import Cache
 from ..sendmail import sendmail
 
 __all__ = [
@@ -181,7 +180,6 @@ class Cron(ModelSQL, ModelView):
     def run(cls, db_name):
         now = datetime.datetime.now()
         with Transaction().start(db_name, 0) as transaction:
-            Cache.clean(db_name)
             transaction.database.lock(transaction.connection, cls._table)
             crons = cls.search([
                     ('number_calls', '!=', 0),
@@ -214,4 +212,3 @@ class Cron(ModelSQL, ModelView):
                 except Exception:
                     transaction.rollback()
                     logger.error('Running cron %s', cron.id, exc_info=True)
-            Cache.resets(db_name)
diff --git a/trytond/ir/locale/bg.po b/trytond/ir/locale/bg.po
index b4fdb49..95fdcc7 100644
--- a/trytond/ir/locale/bg.po
+++ b/trytond/ir/locale/bg.po
@@ -395,6 +395,10 @@ msgctxt "field:ir.action.act_window,context:"
 msgid "Context Value"
 msgstr "Стойност на котекст"
 
+msgctxt "field:ir.action.act_window,context_domain:"
+msgid "Context Domain"
+msgstr ""
+
 msgctxt "field:ir.action.act_window,context_model:"
 msgid "Context Model"
 msgstr ""
@@ -682,6 +686,10 @@ msgctxt "field:ir.action.report,id:"
 msgid "ID"
 msgstr "ID"
 
+msgctxt "field:ir.action.report,is_custom:"
+msgid "Is Custom"
+msgstr ""
+
 #, fuzzy
 msgctxt "field:ir.action.report,keywords:"
 msgid "Keywords"
@@ -1948,42 +1956,6 @@ msgctxt "field:ir.note.read,write_uid:"
 msgid "Write User"
 msgstr "Променено от"
 
-msgctxt "field:ir.property,create_date:"
-msgid "Create Date"
-msgstr "Създадено на"
-
-msgctxt "field:ir.property,create_uid:"
-msgid "Create User"
-msgstr "Създадено от"
-
-msgctxt "field:ir.property,field:"
-msgid "Field"
-msgstr "Поле"
-
-msgctxt "field:ir.property,id:"
-msgid "ID"
-msgstr "ID"
-
-msgctxt "field:ir.property,rec_name:"
-msgid "Name"
-msgstr "Име"
-
-msgctxt "field:ir.property,res:"
-msgid "Resource"
-msgstr "Ресурс"
-
-msgctxt "field:ir.property,value:"
-msgid "Value"
-msgstr "Стойност"
-
-msgctxt "field:ir.property,write_date:"
-msgid "Write Date"
-msgstr "Променено на"
-
-msgctxt "field:ir.property,write_uid:"
-msgid "Write User"
-msgstr "Променено от"
-
 msgctxt "field:ir.rule,create_date:"
 msgid "Create Date"
 msgstr "Създадено на"
@@ -2918,6 +2890,10 @@ msgctxt "field:ir.ui.view_tree_width,write_uid:"
 msgid "Write User"
 msgstr "Променено от"
 
+msgctxt "help:ir.action.act_window,context_domain:"
+msgid "Part of the domain that will be evaluated on each refresh"
+msgstr ""
+
 msgctxt "help:ir.action.act_window,limit:"
 msgid "Default limit for the list view"
 msgstr "Ограничение по подразбиране за изглед със списък"
@@ -3167,14 +3143,6 @@ msgctxt "model:ir.action,name:act_note_form"
 msgid "Notes"
 msgstr "Бележки"
 
-msgctxt "model:ir.action,name:act_property_form"
-msgid "Properties"
-msgstr "Свойства"
-
-msgctxt "model:ir.action,name:act_property_form_default"
-msgid "Default Properties"
-msgstr "Свойства по подразбиране"
-
 msgctxt "model:ir.action,name:act_rule_group_form"
 msgid "Record Rules"
 msgstr "Правила на запис"
@@ -3204,6 +3172,11 @@ msgid "Translations"
 msgstr "Преводи"
 
 #, fuzzy
+msgctxt "model:ir.action,name:act_translation_report"
+msgid "Translations"
+msgstr "Преводи"
+
+#, fuzzy
 msgctxt "model:ir.action,name:act_translation_set"
 msgid "Set Translations"
 msgstr "Изчистване на преводи"
@@ -3248,6 +3221,11 @@ msgctxt "model:ir.action,name:report_model_workflow_graph"
 msgid "Workflow Graph"
 msgstr ""
 
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_translation_report"
+msgid "Translations"
+msgstr "Преводи"
+
 msgctxt "model:ir.action.act_window,name:"
 msgid "Action act window"
 msgstr "Действие на активния прозорец"
@@ -3267,6 +3245,17 @@ msgctxt ""
 msgid "Out of Sync"
 msgstr ""
 
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_translation_form_domain_local"
+msgid "Local"
+msgstr ""
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_translation_form_domain_module"
+msgid "Modules"
+msgstr "Модули"
+
 msgctxt "model:ir.action.act_window.view,name:"
 msgid "Action act window view"
 msgstr "Изглед на действие на активния на прозорец"
@@ -3363,7 +3352,7 @@ msgid "Italian"
 msgstr ""
 
 msgctxt "model:ir.lang,name:lang_lo"
-msgid "ລາວ"
+msgid "Lao"
 msgstr ""
 
 msgctxt "model:ir.lang,name:lang_lt"
@@ -3374,6 +3363,10 @@ msgctxt "model:ir.lang,name:lang_nl"
 msgid "Dutch"
 msgstr "Холандски"
 
+msgctxt "model:ir.lang,name:lang_pl"
+msgid "Polish"
+msgstr ""
+
 msgctxt "model:ir.lang,name:lang_pt_BR"
 msgid "Portuguese (Brazil)"
 msgstr ""
@@ -3387,7 +3380,7 @@ msgid "Slovenian"
 msgstr ""
 
 msgctxt "model:ir.lang,name:lang_zh_CN"
-msgid "中国(简体)"
+msgid "Chinese Simplified"
 msgstr ""
 
 msgctxt "model:ir.model,name:"
@@ -3475,10 +3468,6 @@ msgctxt "model:ir.note.read,name:"
 msgid "Note Read"
 msgstr ""
 
-msgctxt "model:ir.property,name:"
-msgid "Property"
-msgstr "Свойство"
-
 msgctxt "model:ir.rule,name:"
 msgid "Rule"
 msgstr "Правило"
@@ -3664,14 +3653,6 @@ msgctxt "model:ir.ui.menu,name:menu_note_form"
 msgid "Notes"
 msgstr "Бележки"
 
-msgctxt "model:ir.ui.menu,name:menu_property_form"
-msgid "Properties"
-msgstr "Свойства"
-
-msgctxt "model:ir.ui.menu,name:menu_property_form_default"
-msgid "Default Properties"
-msgstr "Свойства по подразбиране"
-
 msgctxt "model:ir.ui.menu,name:menu_rule_group_form"
 msgid "Record Rules"
 msgstr "Правила на запис"
diff --git a/trytond/ir/locale/ca.po b/trytond/ir/locale/ca.po
index b3721d0..3bf5ba3 100644
--- a/trytond/ir/locale/ca.po
+++ b/trytond/ir/locale/ca.po
@@ -417,6 +417,10 @@ msgctxt "field:ir.action.act_window,context:"
 msgid "Context Value"
 msgstr "Context"
 
+msgctxt "field:ir.action.act_window,context_domain:"
+msgid "Context Domain"
+msgstr "Domini del context"
+
 msgctxt "field:ir.action.act_window,context_model:"
 msgid "Context Model"
 msgstr "Model del context"
@@ -681,6 +685,10 @@ msgctxt "field:ir.action.report,id:"
 msgid "ID"
 msgstr "ID"
 
+msgctxt "field:ir.action.report,is_custom:"
+msgid "Is Custom"
+msgstr "Es personalitzat"
+
 msgctxt "field:ir.action.report,keywords:"
 msgid "Keywords"
 msgstr "Accions de teclat"
@@ -1873,42 +1881,6 @@ msgctxt "field:ir.note.read,write_uid:"
 msgid "Write User"
 msgstr "Usuari de modificació"
 
-msgctxt "field:ir.property,create_date:"
-msgid "Create Date"
-msgstr "Data de creació"
-
-msgctxt "field:ir.property,create_uid:"
-msgid "Create User"
-msgstr "Usuari de creació"
-
-msgctxt "field:ir.property,field:"
-msgid "Field"
-msgstr "Camp"
-
-msgctxt "field:ir.property,id:"
-msgid "ID"
-msgstr "ID"
-
-msgctxt "field:ir.property,rec_name:"
-msgid "Name"
-msgstr "Nom"
-
-msgctxt "field:ir.property,res:"
-msgid "Resource"
-msgstr "Recurs"
-
-msgctxt "field:ir.property,value:"
-msgid "Value"
-msgstr "Valor"
-
-msgctxt "field:ir.property,write_date:"
-msgid "Write Date"
-msgstr "Data de modificació"
-
-msgctxt "field:ir.property,write_uid:"
-msgid "Write User"
-msgstr "Usuari de modificació"
-
 msgctxt "field:ir.rule,create_date:"
 msgid "Create Date"
 msgstr "Data de creació"
@@ -2809,6 +2781,10 @@ msgctxt "field:ir.ui.view_tree_width,write_uid:"
 msgid "Write User"
 msgstr "Usuari de modificació"
 
+msgctxt "help:ir.action.act_window,context_domain:"
+msgid "Part of the domain that will be evaluated on each refresh"
+msgstr "La part del domini que s'avaluarà cada vegada que es refresqui"
+
 msgctxt "help:ir.action.act_window,limit:"
 msgid "Default limit for the list view"
 msgstr "Límit per defecte en les vistes de llista."
@@ -3055,14 +3031,6 @@ msgctxt "model:ir.action,name:act_note_form"
 msgid "Notes"
 msgstr "Notes"
 
-msgctxt "model:ir.action,name:act_property_form"
-msgid "Properties"
-msgstr "Propietats"
-
-msgctxt "model:ir.action,name:act_property_form_default"
-msgid "Default Properties"
-msgstr "Propietats per defecte"
-
 msgctxt "model:ir.action,name:act_rule_group_form"
 msgid "Record Rules"
 msgstr "Regles dels registres"
@@ -3091,6 +3059,10 @@ msgctxt "model:ir.action,name:act_translation_form"
 msgid "Translations"
 msgstr "Traduccions"
 
+msgctxt "model:ir.action,name:act_translation_report"
+msgid "Translations"
+msgstr "Traduccions"
+
 msgctxt "model:ir.action,name:act_translation_set"
 msgid "Set Translations"
 msgstr "Defineix traduccions"
@@ -3135,6 +3107,10 @@ msgctxt "model:ir.action,name:report_model_workflow_graph"
 msgid "Workflow Graph"
 msgstr "Graf dels estats"
 
+msgctxt "model:ir.action,name:wizard_translation_report"
+msgid "Translations"
+msgstr "Traduccions"
+
 msgctxt "model:ir.action.act_window,name:"
 msgid "Action act window"
 msgstr "Accions de finestra"
@@ -3153,6 +3129,16 @@ msgctxt ""
 msgid "Out of Sync"
 msgstr "Sense sincronitzar"
 
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_translation_form_domain_local"
+msgid "Local"
+msgstr "Local"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_translation_form_domain_module"
+msgid "Modules"
+msgstr "Mòduls"
+
 msgctxt "model:ir.action.act_window.view,name:"
 msgid "Action act window view"
 msgstr "Vista acció de finestra"
@@ -3246,8 +3232,8 @@ msgid "Italian"
 msgstr "Italià"
 
 msgctxt "model:ir.lang,name:lang_lo"
-msgid "ລາວ"
-msgstr "ລາວ"
+msgid "Lao"
+msgstr "Laosià"
 
 msgctxt "model:ir.lang,name:lang_lt"
 msgid "Lithuanian"
@@ -3257,6 +3243,10 @@ msgctxt "model:ir.lang,name:lang_nl"
 msgid "Dutch"
 msgstr "Holandès"
 
+msgctxt "model:ir.lang,name:lang_pl"
+msgid "Polish"
+msgstr "Polonès"
+
 msgctxt "model:ir.lang,name:lang_pt_BR"
 msgid "Portuguese (Brazil)"
 msgstr "Portuguès (Brasil)"
@@ -3270,8 +3260,8 @@ msgid "Slovenian"
 msgstr "Eslovè"
 
 msgctxt "model:ir.lang,name:lang_zh_CN"
-msgid "中国(简体)"
-msgstr "中国(简体)"
+msgid "Chinese Simplified"
+msgstr "Xinès simplificat"
 
 msgctxt "model:ir.model,name:"
 msgid "Model"
@@ -3353,10 +3343,6 @@ msgctxt "model:ir.note.read,name:"
 msgid "Note Read"
 msgstr "Nota llegida"
 
-msgctxt "model:ir.property,name:"
-msgid "Property"
-msgstr "Propietat"
-
 msgctxt "model:ir.rule,name:"
 msgid "Rule"
 msgstr "Regla"
@@ -3537,14 +3523,6 @@ msgctxt "model:ir.ui.menu,name:menu_note_form"
 msgid "Notes"
 msgstr "Notes"
 
-msgctxt "model:ir.ui.menu,name:menu_property_form"
-msgid "Properties"
-msgstr "Propietats"
-
-msgctxt "model:ir.ui.menu,name:menu_property_form_default"
-msgid "Default Properties"
-msgstr "Propietats per defecte"
-
 msgctxt "model:ir.ui.menu,name:menu_rule_group_form"
 msgid "Record Rules"
 msgstr "Regles dels registres"
diff --git a/trytond/ir/locale/cs.po b/trytond/ir/locale/cs.po
index f5dc919..231d454 100644
--- a/trytond/ir/locale/cs.po
+++ b/trytond/ir/locale/cs.po
@@ -384,6 +384,10 @@ msgctxt "field:ir.action.act_window,context:"
 msgid "Context Value"
 msgstr ""
 
+msgctxt "field:ir.action.act_window,context_domain:"
+msgid "Context Domain"
+msgstr ""
+
 msgctxt "field:ir.action.act_window,context_model:"
 msgid "Context Model"
 msgstr ""
@@ -654,6 +658,10 @@ msgctxt "field:ir.action.report,id:"
 msgid "ID"
 msgstr ""
 
+msgctxt "field:ir.action.report,is_custom:"
+msgid "Is Custom"
+msgstr ""
+
 msgctxt "field:ir.action.report,keywords:"
 msgid "Keywords"
 msgstr ""
@@ -1883,43 +1891,6 @@ msgctxt "field:ir.note.read,write_uid:"
 msgid "Write User"
 msgstr ""
 
-msgctxt "field:ir.property,create_date:"
-msgid "Create Date"
-msgstr ""
-
-msgctxt "field:ir.property,create_uid:"
-msgid "Create User"
-msgstr ""
-
-msgctxt "field:ir.property,field:"
-msgid "Field"
-msgstr ""
-
-msgctxt "field:ir.property,id:"
-msgid "ID"
-msgstr ""
-
-#, fuzzy
-msgctxt "field:ir.property,rec_name:"
-msgid "Name"
-msgstr "Namu"
-
-msgctxt "field:ir.property,res:"
-msgid "Resource"
-msgstr ""
-
-msgctxt "field:ir.property,value:"
-msgid "Value"
-msgstr ""
-
-msgctxt "field:ir.property,write_date:"
-msgid "Write Date"
-msgstr ""
-
-msgctxt "field:ir.property,write_uid:"
-msgid "Write User"
-msgstr ""
-
 msgctxt "field:ir.rule,create_date:"
 msgid "Create Date"
 msgstr ""
@@ -2842,6 +2813,10 @@ msgctxt "field:ir.ui.view_tree_width,write_uid:"
 msgid "Write User"
 msgstr ""
 
+msgctxt "help:ir.action.act_window,context_domain:"
+msgid "Part of the domain that will be evaluated on each refresh"
+msgstr ""
+
 msgctxt "help:ir.action.act_window,limit:"
 msgid "Default limit for the list view"
 msgstr ""
@@ -3070,14 +3045,6 @@ msgctxt "model:ir.action,name:act_note_form"
 msgid "Notes"
 msgstr ""
 
-msgctxt "model:ir.action,name:act_property_form"
-msgid "Properties"
-msgstr ""
-
-msgctxt "model:ir.action,name:act_property_form_default"
-msgid "Default Properties"
-msgstr ""
-
 msgctxt "model:ir.action,name:act_rule_group_form"
 msgid "Record Rules"
 msgstr ""
@@ -3106,6 +3073,10 @@ msgctxt "model:ir.action,name:act_translation_form"
 msgid "Translations"
 msgstr ""
 
+msgctxt "model:ir.action,name:act_translation_report"
+msgid "Translations"
+msgstr ""
+
 msgctxt "model:ir.action,name:act_translation_set"
 msgid "Set Translations"
 msgstr ""
@@ -3150,6 +3121,10 @@ msgctxt "model:ir.action,name:report_model_workflow_graph"
 msgid "Workflow Graph"
 msgstr ""
 
+msgctxt "model:ir.action,name:wizard_translation_report"
+msgid "Translations"
+msgstr ""
+
 msgctxt "model:ir.action.act_window,name:"
 msgid "Action act window"
 msgstr ""
@@ -3168,6 +3143,16 @@ msgctxt ""
 msgid "Out of Sync"
 msgstr ""
 
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_translation_form_domain_local"
+msgid "Local"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_translation_form_domain_module"
+msgid "Modules"
+msgstr ""
+
 msgctxt "model:ir.action.act_window.view,name:"
 msgid "Action act window view"
 msgstr ""
@@ -3261,7 +3246,7 @@ msgid "Italian"
 msgstr ""
 
 msgctxt "model:ir.lang,name:lang_lo"
-msgid "ລາວ"
+msgid "Lao"
 msgstr ""
 
 msgctxt "model:ir.lang,name:lang_lt"
@@ -3272,6 +3257,10 @@ msgctxt "model:ir.lang,name:lang_nl"
 msgid "Dutch"
 msgstr ""
 
+msgctxt "model:ir.lang,name:lang_pl"
+msgid "Polish"
+msgstr ""
+
 msgctxt "model:ir.lang,name:lang_pt_BR"
 msgid "Portuguese (Brazil)"
 msgstr ""
@@ -3285,7 +3274,7 @@ msgid "Slovenian"
 msgstr ""
 
 msgctxt "model:ir.lang,name:lang_zh_CN"
-msgid "中国(简体)"
+msgid "Chinese Simplified"
 msgstr ""
 
 msgctxt "model:ir.model,name:"
@@ -3368,10 +3357,6 @@ msgctxt "model:ir.note.read,name:"
 msgid "Note Read"
 msgstr ""
 
-msgctxt "model:ir.property,name:"
-msgid "Property"
-msgstr ""
-
 msgctxt "model:ir.rule,name:"
 msgid "Rule"
 msgstr ""
@@ -3552,14 +3537,6 @@ msgctxt "model:ir.ui.menu,name:menu_note_form"
 msgid "Notes"
 msgstr ""
 
-msgctxt "model:ir.ui.menu,name:menu_property_form"
-msgid "Properties"
-msgstr ""
-
-msgctxt "model:ir.ui.menu,name:menu_property_form_default"
-msgid "Default Properties"
-msgstr ""
-
 msgctxt "model:ir.ui.menu,name:menu_rule_group_form"
 msgid "Record Rules"
 msgstr ""
diff --git a/trytond/ir/locale/de.po b/trytond/ir/locale/de.po
index 790ee84..bb3ea18 100644
--- a/trytond/ir/locale/de.po
+++ b/trytond/ir/locale/de.po
@@ -427,6 +427,10 @@ msgctxt "field:ir.action.act_window,context:"
 msgid "Context Value"
 msgstr "Kontext"
 
+msgctxt "field:ir.action.act_window,context_domain:"
+msgid "Context Domain"
+msgstr "Kontext des Wertebereichs"
+
 msgctxt "field:ir.action.act_window,context_model:"
 msgid "Context Model"
 msgstr "Kontextmodell"
@@ -691,6 +695,10 @@ msgctxt "field:ir.action.report,id:"
 msgid "ID"
 msgstr "ID"
 
+msgctxt "field:ir.action.report,is_custom:"
+msgid "Is Custom"
+msgstr "Ist personalisiert"
+
 msgctxt "field:ir.action.report,keywords:"
 msgid "Keywords"
 msgstr "Schlüsselwörter"
@@ -1883,42 +1891,6 @@ msgctxt "field:ir.note.read,write_uid:"
 msgid "Write User"
 msgstr "Letzte Änderung durch"
 
-msgctxt "field:ir.property,create_date:"
-msgid "Create Date"
-msgstr "Erstellungsdatum"
-
-msgctxt "field:ir.property,create_uid:"
-msgid "Create User"
-msgstr "Erstellt durch"
-
-msgctxt "field:ir.property,field:"
-msgid "Field"
-msgstr "Feld"
-
-msgctxt "field:ir.property,id:"
-msgid "ID"
-msgstr "ID"
-
-msgctxt "field:ir.property,rec_name:"
-msgid "Name"
-msgstr "Name"
-
-msgctxt "field:ir.property,res:"
-msgid "Resource"
-msgstr "Ressource"
-
-msgctxt "field:ir.property,value:"
-msgid "Value"
-msgstr "Wert"
-
-msgctxt "field:ir.property,write_date:"
-msgid "Write Date"
-msgstr "Zuletzt geändert"
-
-msgctxt "field:ir.property,write_uid:"
-msgid "Write User"
-msgstr "Letzte Änderung durch"
-
 msgctxt "field:ir.rule,create_date:"
 msgid "Create Date"
 msgstr "Erstellungsdatum"
@@ -2819,6 +2791,10 @@ msgctxt "field:ir.ui.view_tree_width,write_uid:"
 msgid "Write User"
 msgstr "Letzte Änderung durch"
 
+msgctxt "help:ir.action.act_window,context_domain:"
+msgid "Part of the domain that will be evaluated on each refresh"
+msgstr "Teil des Wertebereichs der bei jeder Aktualisierung ausgewertet wird"
+
 msgctxt "help:ir.action.act_window,limit:"
 msgid "Default limit for the list view"
 msgstr "Standardobergrenze für die Listenanscht"
@@ -3069,14 +3045,6 @@ msgctxt "model:ir.action,name:act_note_form"
 msgid "Notes"
 msgstr "Notizen"
 
-msgctxt "model:ir.action,name:act_property_form"
-msgid "Properties"
-msgstr "Eigenschaften"
-
-msgctxt "model:ir.action,name:act_property_form_default"
-msgid "Default Properties"
-msgstr "Standardeigenschaften"
-
 msgctxt "model:ir.action,name:act_rule_group_form"
 msgid "Record Rules"
 msgstr "Datensatzregeln"
@@ -3105,6 +3073,10 @@ msgctxt "model:ir.action,name:act_translation_form"
 msgid "Translations"
 msgstr "Übersetzungen"
 
+msgctxt "model:ir.action,name:act_translation_report"
+msgid "Translations"
+msgstr "Übersetzungen"
+
 msgctxt "model:ir.action,name:act_translation_set"
 msgid "Set Translations"
 msgstr "Übersetzungen aktualisieren"
@@ -3149,6 +3121,10 @@ msgctxt "model:ir.action,name:report_model_workflow_graph"
 msgid "Workflow Graph"
 msgstr "Workflow Graph"
 
+msgctxt "model:ir.action,name:wizard_translation_report"
+msgid "Translations"
+msgstr "Übersetzungen"
+
 msgctxt "model:ir.action.act_window,name:"
 msgid "Action act window"
 msgstr "Aktion aktives Fenster"
@@ -3167,6 +3143,16 @@ msgctxt ""
 msgid "Out of Sync"
 msgstr "Nicht synchronisiert"
 
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_translation_form_domain_local"
+msgid "Local"
+msgstr "Lokal"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_translation_form_domain_module"
+msgid "Modules"
+msgstr "Module"
+
 msgctxt "model:ir.action.act_window.view,name:"
 msgid "Action act window view"
 msgstr "Aktion aktives Fenster Sicht"
@@ -3260,7 +3246,7 @@ msgid "Italian"
 msgstr "Italienisch"
 
 msgctxt "model:ir.lang,name:lang_lo"
-msgid "ລາວ"
+msgid "Lao"
 msgstr "Laotisch"
 
 msgctxt "model:ir.lang,name:lang_lt"
@@ -3271,6 +3257,10 @@ msgctxt "model:ir.lang,name:lang_nl"
 msgid "Dutch"
 msgstr "Niederländisch"
 
+msgctxt "model:ir.lang,name:lang_pl"
+msgid "Polish"
+msgstr "Polnisch"
+
 msgctxt "model:ir.lang,name:lang_pt_BR"
 msgid "Portuguese (Brazil)"
 msgstr "Portugiesisch (Brasilien)"
@@ -3284,8 +3274,8 @@ msgid "Slovenian"
 msgstr "Slowenisch"
 
 msgctxt "model:ir.lang,name:lang_zh_CN"
-msgid "中国(简体)"
-msgstr "Chinesisch (vereinfacht)"
+msgid "Chinese Simplified"
+msgstr "Chinesisch (Vereinfacht)"
 
 msgctxt "model:ir.model,name:"
 msgid "Model"
@@ -3367,10 +3357,6 @@ msgctxt "model:ir.note.read,name:"
 msgid "Note Read"
 msgstr "Notiz gelesen"
 
-msgctxt "model:ir.property,name:"
-msgid "Property"
-msgstr "Eigenschaft"
-
 msgctxt "model:ir.rule,name:"
 msgid "Rule"
 msgstr "Regel"
@@ -3551,14 +3537,6 @@ msgctxt "model:ir.ui.menu,name:menu_note_form"
 msgid "Notes"
 msgstr "Notizen"
 
-msgctxt "model:ir.ui.menu,name:menu_property_form"
-msgid "Properties"
-msgstr "Eigenschaften"
-
-msgctxt "model:ir.ui.menu,name:menu_property_form_default"
-msgid "Default Properties"
-msgstr "Standardeigenschaften"
-
 msgctxt "model:ir.ui.menu,name:menu_rule_group_form"
 msgid "Record Rules"
 msgstr "Datensatzregeln"
@@ -3717,7 +3695,7 @@ msgstr "Nicht aktiviert"
 
 msgctxt "selection:ir.module,state:"
 msgid "To be activated"
-msgstr "Zu ak"
+msgstr "Zu aktivieren"
 
 msgctxt "selection:ir.module,state:"
 msgid "To be removed"
@@ -4117,35 +4095,3 @@ msgstr "Eingeben"
 msgctxt "wizard_button:ir.ui.view.show,start,end:"
 msgid "Close"
 msgstr "Schließen"
-
-msgctxt "model:ir.action,name:"
-msgid "Perform Pending Installation/Upgrade"
-msgstr "Vorgemerkte Installationen / Aktualisierungen durchführen"
-
-msgctxt "model:ir.lang,name:"
-msgid "Spanish (Argentina)"
-msgstr "Spanisch (Argentinien)"
-
-msgctxt "model:ir.lang,name:"
-msgid "Spanish (Colombia)"
-msgstr "Spanisch (Kolumbien)"
-
-msgctxt "model:ir.lang,name:"
-msgid "Spanish (Ecuador)"
-msgstr "Spanisch (Ecuador)"
-
-msgctxt "model:ir.lang,name:"
-msgid "Spanish (Mexico)"
-msgstr "Spanisch (Mexiko)"
-
-msgctxt "model:ir.lang,name:lang_lo"
-msgid "Lao"
-msgstr "Laotisch"
-
-msgctxt "model:ir.lang,name:lang_zh_CN"
-msgid "Chinese Simplified"
-msgstr "Chinesisch (Vereinfacht)"
-
-msgctxt "model:ir.ui.menu,name:"
-msgid "Perform Pending Installation/Upgrade"
-msgstr "Vorgemerkte Installationen / Aktualisierungen durchführen"
diff --git a/trytond/ir/locale/es.po b/trytond/ir/locale/es.po
index dfa6273..2b9b23d 100644
--- a/trytond/ir/locale/es.po
+++ b/trytond/ir/locale/es.po
@@ -420,6 +420,10 @@ msgctxt "field:ir.action.act_window,context:"
 msgid "Context Value"
 msgstr "Valor del contexto"
 
+msgctxt "field:ir.action.act_window,context_domain:"
+msgid "Context Domain"
+msgstr "Dominio del contexto"
+
 msgctxt "field:ir.action.act_window,context_model:"
 msgid "Context Model"
 msgstr "Modelo del contexto"
@@ -684,6 +688,10 @@ msgctxt "field:ir.action.report,id:"
 msgid "ID"
 msgstr "ID"
 
+msgctxt "field:ir.action.report,is_custom:"
+msgid "Is Custom"
+msgstr "Es personalizado"
+
 msgctxt "field:ir.action.report,keywords:"
 msgid "Keywords"
 msgstr "Acciones de teclado"
@@ -1876,42 +1884,6 @@ msgctxt "field:ir.note.read,write_uid:"
 msgid "Write User"
 msgstr "Usuario de modificación"
 
-msgctxt "field:ir.property,create_date:"
-msgid "Create Date"
-msgstr "Fecha de creación"
-
-msgctxt "field:ir.property,create_uid:"
-msgid "Create User"
-msgstr "Usuario de creación"
-
-msgctxt "field:ir.property,field:"
-msgid "Field"
-msgstr "Campo"
-
-msgctxt "field:ir.property,id:"
-msgid "ID"
-msgstr "ID"
-
-msgctxt "field:ir.property,rec_name:"
-msgid "Name"
-msgstr "Nombre"
-
-msgctxt "field:ir.property,res:"
-msgid "Resource"
-msgstr "Recurso"
-
-msgctxt "field:ir.property,value:"
-msgid "Value"
-msgstr "Valor"
-
-msgctxt "field:ir.property,write_date:"
-msgid "Write Date"
-msgstr "Fecha de modificación"
-
-msgctxt "field:ir.property,write_uid:"
-msgid "Write User"
-msgstr "Usuario de modificación"
-
 msgctxt "field:ir.rule,create_date:"
 msgid "Create Date"
 msgstr "Fecha de creación"
@@ -2812,6 +2784,10 @@ msgctxt "field:ir.ui.view_tree_width,write_uid:"
 msgid "Write User"
 msgstr "Usuario de modificación"
 
+msgctxt "help:ir.action.act_window,context_domain:"
+msgid "Part of the domain that will be evaluated on each refresh"
+msgstr "La parte del dominio que se va a evaluar cada vez que se refresque"
+
 msgctxt "help:ir.action.act_window,limit:"
 msgid "Default limit for the list view"
 msgstr "Límite por defecto en las vistas de lista."
@@ -3060,14 +3036,6 @@ msgctxt "model:ir.action,name:act_note_form"
 msgid "Notes"
 msgstr "Notas"
 
-msgctxt "model:ir.action,name:act_property_form"
-msgid "Properties"
-msgstr "Propiedades"
-
-msgctxt "model:ir.action,name:act_property_form_default"
-msgid "Default Properties"
-msgstr "Propiedades por defecto"
-
 msgctxt "model:ir.action,name:act_rule_group_form"
 msgid "Record Rules"
 msgstr "Reglas de registros"
@@ -3096,6 +3064,10 @@ msgctxt "model:ir.action,name:act_translation_form"
 msgid "Translations"
 msgstr "Traducciones"
 
+msgctxt "model:ir.action,name:act_translation_report"
+msgid "Translations"
+msgstr "Traducciones"
+
 msgctxt "model:ir.action,name:act_translation_set"
 msgid "Set Translations"
 msgstr "Definir traducciones"
@@ -3140,6 +3112,10 @@ msgctxt "model:ir.action,name:report_model_workflow_graph"
 msgid "Workflow Graph"
 msgstr "Grafo de los estados"
 
+msgctxt "model:ir.action,name:wizard_translation_report"
+msgid "Translations"
+msgstr "Traducciones"
+
 msgctxt "model:ir.action.act_window,name:"
 msgid "Action act window"
 msgstr "Acción de ventana"
@@ -3158,6 +3134,16 @@ msgctxt ""
 msgid "Out of Sync"
 msgstr "Sin sincronizar"
 
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_translation_form_domain_local"
+msgid "Local"
+msgstr "Local"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_translation_form_domain_module"
+msgid "Modules"
+msgstr "Módulos"
+
 msgctxt "model:ir.action.act_window.view,name:"
 msgid "Action act window view"
 msgstr "Acción vista de ventana"
@@ -3251,8 +3237,8 @@ msgid "Italian"
 msgstr "Italiano"
 
 msgctxt "model:ir.lang,name:lang_lo"
-msgid "ລາວ"
-msgstr "Lao"
+msgid "Lao"
+msgstr "Laosiano"
 
 msgctxt "model:ir.lang,name:lang_lt"
 msgid "Lithuanian"
@@ -3262,6 +3248,10 @@ msgctxt "model:ir.lang,name:lang_nl"
 msgid "Dutch"
 msgstr "Holandés"
 
+msgctxt "model:ir.lang,name:lang_pl"
+msgid "Polish"
+msgstr "Polaco"
+
 msgctxt "model:ir.lang,name:lang_pt_BR"
 msgid "Portuguese (Brazil)"
 msgstr "Portugués (Brasil)"
@@ -3275,8 +3265,8 @@ msgid "Slovenian"
 msgstr "Esloveno"
 
 msgctxt "model:ir.lang,name:lang_zh_CN"
-msgid "中国(简体)"
-msgstr "Chino (Simplificado)"
+msgid "Chinese Simplified"
+msgstr "Chino simplificado"
 
 msgctxt "model:ir.model,name:"
 msgid "Model"
@@ -3358,10 +3348,6 @@ msgctxt "model:ir.note.read,name:"
 msgid "Note Read"
 msgstr "Nota leída"
 
-msgctxt "model:ir.property,name:"
-msgid "Property"
-msgstr "Propiedades"
-
 msgctxt "model:ir.rule,name:"
 msgid "Rule"
 msgstr "Regla"
@@ -3542,14 +3528,6 @@ msgctxt "model:ir.ui.menu,name:menu_note_form"
 msgid "Notes"
 msgstr "Notas"
 
-msgctxt "model:ir.ui.menu,name:menu_property_form"
-msgid "Properties"
-msgstr "Propiedades"
-
-msgctxt "model:ir.ui.menu,name:menu_property_form_default"
-msgid "Default Properties"
-msgstr "Propiedades por defecto"
-
 msgctxt "model:ir.ui.menu,name:menu_rule_group_form"
 msgid "Record Rules"
 msgstr "Reglas de registros"
diff --git a/trytond/ir/locale/es_419.po b/trytond/ir/locale/es_419.po
index 2f0a980..ca3522a 100644
--- a/trytond/ir/locale/es_419.po
+++ b/trytond/ir/locale/es_419.po
@@ -7,40 +7,32 @@ msgid ""
 "You try to bypass an access rule.\n"
 "(Document type: %s)"
 msgstr ""
-"You try to bypass an access rule.\n"
-"(Document type: %s)"
 
 msgctxt "error:delete_xml_record:"
 msgid "You are not allowed to delete this record."
-msgstr "You are not allowed to delete this record."
+msgstr ""
 
 msgctxt "error:digits_validation_record:"
 msgid ""
 "The number of digits \"%(digits)s\" of field \"%(field)s\" on \"%(value)s\" "
 "exceeds its limit."
 msgstr ""
-"The number of digits \"%(digits)s\" of field \"%(field)s\" on \"%(value)s\" "
-"exceeds its limit."
 
 msgctxt "error:domain_validation_record:"
 msgid ""
 "The value of the field \"%(field)s\" on \"%(model)s\" is not valid according"
 " to its domain."
 msgstr ""
-"The value of the field \"%(field)s\" on \"%(model)s\" is not valid according"
-" to its domain."
 
 msgctxt "error:foreign_model_exist:"
 msgid ""
 "Could not delete the records because they are used on field \"%(field)s\" of"
 " \"%(model)s\"."
 msgstr ""
-"Could not delete the records because they are used on field \"%(field)s\" of"
-" \"%(model)s\"."
 
 msgctxt "error:foreign_model_missing:"
 msgid "The value \"%(value)s\" of field \"%(field)s\" on \"%(model)s\" doesn't exist."
-msgstr "The value \"%(value)s\" of field \"%(field)s\" on \"%(model)s\" doesn't exist."
+msgstr ""
 
 msgctxt "error:ir.action.act_window.domain:"
 msgid "Invalid domain or search criteria \"%(domain)s\" on action \"%(action)s\"."
@@ -251,82 +243,72 @@ msgid ""
 "You try to read records that don't exist anymore.\n"
 "(Document type: %s)"
 msgstr ""
-"You try to read records that don't exist anymore.\n"
-"(Document type: %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 ""
-"Recursion error: Record \"%(rec_name)s\" with parent \"%(parent_rec_name)s\""
-" was configured as ancestor of itself."
 
 msgctxt "error:reference_syntax_error:"
 msgid "Syntax error for reference %r in %s"
-msgstr "Syntax error for reference %r in %s"
+msgstr ""
 
 msgctxt "error:relation_not_found:"
 msgid "Relation not found: %r in %s"
-msgstr "Relation not found: %r in %s"
+msgstr ""
 
 msgctxt "error:required_field:"
 msgid "The field \"%(field)s\" on \"%(model)s\" is required."
-msgstr "The field \"%(field)s\" on \"%(model)s\" is required."
+msgstr ""
 
 msgctxt "error:required_validation_record:"
 msgid "The field \"%(field)s\" on \"%(model)s\" is required."
-msgstr "The field \"%(field)s\" on \"%(model)s\" is required."
+msgstr ""
 
 msgctxt "error:search_function_missing:"
 msgid "Missing search function on field \"%s\"."
-msgstr "Missing search function on field \"%s\"."
+msgstr ""
 
 msgctxt "error:selection_validation_record:"
 msgid ""
 "The value \"%(value)s\" of field \"%(field)s\" on \"%(model)s\" is not in "
 "the selection."
 msgstr ""
-"The value \"%(value)s\" of field \"%(field)s\" on \"%(model)s\" is not in "
-"the selection."
 
 msgctxt "error:selection_value_notfound:"
 msgid "Value not in the selection for field \"%s\"."
-msgstr "Value not in the selection for field \"%s\"."
+msgstr ""
 
 msgctxt "error:size_validation_record:"
 msgid "The size \"%(size)s\" of the field \"%(field)s\" on \"%(model)s\" is too long."
-msgstr "The size \"%(size)s\" of the field \"%(field)s\" on \"(model)%s\" is too long."
+msgstr ""
 
 msgctxt "error:time_format_validation_record:"
 msgid "The time value \"%(value)s\" of field \"%(field)s\" on \"%(model)s\" is not valid."
 msgstr ""
-"The time value \"%(value)s\" of field \"%(field)s\" on \"%(model)s\" is not "
-"valid."
 
 msgctxt "error:too_many_relations_found:"
 msgid "Too many relations found: %r in %s"
-msgstr "Too many relations found: %r in %s"
+msgstr ""
 
 msgctxt "error:write_error:"
 msgid ""
 "You try to write on records that don't exist anymore.\n"
 "(Document type: %s)"
 msgstr ""
-"You try to write on records that don't exist anymore.\n"
-"(Document type: %s)"
 
 msgctxt "error:write_xml_record:"
 msgid "You are not allowed to modify this record."
-msgstr "You are not allowed to modify this record."
+msgstr ""
 
 msgctxt "error:xml_id_syntax_error:"
 msgid "Syntax error for XML id %r in %s"
-msgstr "Syntax error for XML id %r in %s"
+msgstr ""
 
 msgctxt "error:xml_record_desc:"
 msgid "This record is part of the base configuration."
-msgstr "This record is part of the base configuration."
+msgstr ""
 
 msgctxt "field:ir.action,active:"
 msgid "Active"
@@ -338,7 +320,7 @@ msgstr ""
 
 msgctxt "field:ir.action,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Creado por usuario"
 
 msgctxt "field:ir.action,groups:"
 msgid "Groups"
@@ -379,7 +361,7 @@ msgstr ""
 
 msgctxt "field:ir.action,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Modificado por usuario"
 
 msgctxt "field:ir.action.act_window,act_window_domains:"
 msgid "Domains"
@@ -403,6 +385,10 @@ msgctxt "field:ir.action.act_window,context:"
 msgid "Context Value"
 msgstr ""
 
+msgctxt "field:ir.action.act_window,context_domain:"
+msgid "Context Domain"
+msgstr ""
+
 msgctxt "field:ir.action.act_window,context_model:"
 msgid "Context Model"
 msgstr ""
@@ -413,7 +399,7 @@ msgstr ""
 
 msgctxt "field:ir.action.act_window,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Creado por usuario"
 
 msgctxt "field:ir.action.act_window,domain:"
 msgid "Domain Value"
@@ -500,7 +486,7 @@ msgstr ""
 
 msgctxt "field:ir.action.act_window,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Modificado por usuario"
 
 #, fuzzy
 msgctxt "field:ir.action.act_window.domain,act_window:"
@@ -521,7 +507,7 @@ msgstr ""
 
 msgctxt "field:ir.action.act_window.domain,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Creado por usuario"
 
 msgctxt "field:ir.action.act_window.domain,domain:"
 msgid "Domain"
@@ -550,7 +536,7 @@ msgstr ""
 
 msgctxt "field:ir.action.act_window.domain,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Modificado por usuario"
 
 #, fuzzy
 msgctxt "field:ir.action.act_window.view,act_window:"
@@ -567,7 +553,7 @@ msgstr ""
 
 msgctxt "field:ir.action.act_window.view,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Creado por usuario"
 
 msgctxt "field:ir.action.act_window.view,id:"
 msgid "ID"
@@ -593,7 +579,7 @@ msgstr ""
 
 msgctxt "field:ir.action.act_window.view,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Modificado por usuario"
 
 #, fuzzy
 msgctxt "field:ir.action.keyword,action:"
@@ -606,7 +592,7 @@ msgstr ""
 
 msgctxt "field:ir.action.keyword,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Creado por usuario"
 
 msgctxt "field:ir.action.keyword,groups:"
 msgid "Groups"
@@ -635,7 +621,7 @@ msgstr ""
 
 msgctxt "field:ir.action.keyword,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Modificado por usuario"
 
 #, fuzzy
 msgctxt "field:ir.action.report,action:"
@@ -652,7 +638,7 @@ msgstr ""
 
 msgctxt "field:ir.action.report,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Creado por usuario"
 
 msgctxt "field:ir.action.report,direct_print:"
 msgid "Direct Print"
@@ -679,6 +665,10 @@ msgctxt "field:ir.action.report,id:"
 msgid "ID"
 msgstr ""
 
+msgctxt "field:ir.action.report,is_custom:"
+msgid "Is Custom"
+msgstr ""
+
 msgctxt "field:ir.action.report,keywords:"
 msgid "Keywords"
 msgstr ""
@@ -743,7 +733,7 @@ msgstr ""
 
 msgctxt "field:ir.action.report,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Modificado por usuario"
 
 #, fuzzy
 msgctxt "field:ir.action.url,action:"
@@ -760,7 +750,7 @@ msgstr ""
 
 msgctxt "field:ir.action.url,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Creado por usuario"
 
 msgctxt "field:ir.action.url,groups:"
 msgid "Groups"
@@ -805,7 +795,7 @@ msgstr ""
 
 msgctxt "field:ir.action.url,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Modificado por usuario"
 
 #, fuzzy
 msgctxt "field:ir.action.wizard,action:"
@@ -822,7 +812,7 @@ msgstr ""
 
 msgctxt "field:ir.action.wizard,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Creado por usuario"
 
 msgctxt "field:ir.action.wizard,email:"
 msgid "Email"
@@ -880,7 +870,7 @@ msgstr ""
 
 msgctxt "field:ir.action.wizard,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Modificado por usuario"
 
 msgctxt "field:ir.attachment,create_date:"
 msgid "Create Date"
@@ -888,7 +878,7 @@ msgstr ""
 
 msgctxt "field:ir.attachment,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Creado por usuario"
 
 #, fuzzy
 msgctxt "field:ir.attachment,data:"
@@ -949,7 +939,7 @@ msgstr ""
 
 msgctxt "field:ir.attachment,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Modificado por usuario"
 
 msgctxt "field:ir.cache,create_date:"
 msgid "Create Date"
@@ -957,7 +947,7 @@ msgstr ""
 
 msgctxt "field:ir.cache,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Creado por usuario"
 
 msgctxt "field:ir.cache,id:"
 msgid "ID"
@@ -981,7 +971,7 @@ msgstr ""
 
 msgctxt "field:ir.cache,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Modificado por usuario"
 
 msgctxt "field:ir.configuration,create_date:"
 msgid "Create Date"
@@ -989,7 +979,7 @@ msgstr ""
 
 msgctxt "field:ir.configuration,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Creado por usuario"
 
 msgctxt "field:ir.configuration,id:"
 msgid "ID"
@@ -1010,7 +1000,7 @@ msgstr ""
 
 msgctxt "field:ir.configuration,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Modificado por usuario"
 
 msgctxt "field:ir.cron,active:"
 msgid "Active"
@@ -1026,7 +1016,7 @@ msgstr ""
 
 msgctxt "field:ir.cron,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Creado por usuario"
 
 msgctxt "field:ir.cron,function:"
 msgid "Function"
@@ -1083,7 +1073,7 @@ msgstr ""
 
 msgctxt "field:ir.cron,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Modificado por usuario"
 
 msgctxt "field:ir.date,id:"
 msgid "ID"
@@ -1095,7 +1085,7 @@ msgstr ""
 
 msgctxt "field:ir.export,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Creado por usuario"
 
 #, fuzzy
 msgctxt "field:ir.export,export_fields:"
@@ -1124,7 +1114,7 @@ msgstr ""
 
 msgctxt "field:ir.export,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Modificado por usuario"
 
 msgctxt "field:ir.export.line,create_date:"
 msgid "Create Date"
@@ -1132,7 +1122,7 @@ msgstr ""
 
 msgctxt "field:ir.export.line,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Creado por usuario"
 
 #, fuzzy
 msgctxt "field:ir.export.line,export:"
@@ -1157,7 +1147,7 @@ msgstr ""
 
 msgctxt "field:ir.export.line,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Modificado por usuario"
 
 msgctxt "field:ir.lang,active:"
 msgid "Active"
@@ -1173,7 +1163,7 @@ msgstr ""
 
 msgctxt "field:ir.lang,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Creado por usuario"
 
 #, fuzzy
 msgctxt "field:ir.lang,date:"
@@ -1218,7 +1208,7 @@ msgstr ""
 
 msgctxt "field:ir.lang,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Modificado por usuario"
 
 msgctxt "field:ir.model,create_date:"
 msgid "Create Date"
@@ -1226,7 +1216,7 @@ msgstr ""
 
 msgctxt "field:ir.model,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Creado por usuario"
 
 #, fuzzy
 msgctxt "field:ir.model,fields:"
@@ -1268,7 +1258,7 @@ msgstr ""
 
 msgctxt "field:ir.model,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Modificado por usuario"
 
 msgctxt "field:ir.model.access,create_date:"
 msgid "Create Date"
@@ -1276,7 +1266,7 @@ msgstr ""
 
 msgctxt "field:ir.model.access,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Creado por usuario"
 
 msgctxt "field:ir.model.access,description:"
 msgid "Description"
@@ -1321,7 +1311,7 @@ msgstr ""
 
 msgctxt "field:ir.model.access,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Modificado por usuario"
 
 msgctxt "field:ir.model.button,clicks:"
 msgid "Clicks"
@@ -1333,7 +1323,7 @@ msgstr ""
 
 msgctxt "field:ir.model.button,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Creado por usuario"
 
 msgctxt "field:ir.model.button,groups:"
 msgid "Groups"
@@ -1374,7 +1364,7 @@ msgstr ""
 
 msgctxt "field:ir.model.button,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Modificado por usuario"
 
 #, fuzzy
 msgctxt "field:ir.model.button-button.reset,button:"
@@ -1391,7 +1381,7 @@ msgstr ""
 
 msgctxt "field:ir.model.button-button.reset,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Creado por usuario"
 
 msgctxt "field:ir.model.button-button.reset,id:"
 msgid "ID"
@@ -1407,7 +1397,7 @@ msgstr ""
 
 msgctxt "field:ir.model.button-button.reset,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Modificado por usuario"
 
 msgctxt "field:ir.model.button.click,active:"
 msgid "Active"
@@ -1424,7 +1414,7 @@ msgstr ""
 
 msgctxt "field:ir.model.button.click,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Creado por usuario"
 
 msgctxt "field:ir.model.button.click,id:"
 msgid "ID"
@@ -1444,7 +1434,7 @@ msgstr ""
 
 msgctxt "field:ir.model.button.click,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Modificado por usuario"
 
 #, fuzzy
 msgctxt "field:ir.model.button.rule,button:"
@@ -1461,7 +1451,7 @@ msgstr ""
 
 msgctxt "field:ir.model.button.rule,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Creado por usuario"
 
 msgctxt "field:ir.model.button.rule,description:"
 msgid "Description"
@@ -1485,7 +1475,7 @@ msgstr ""
 
 msgctxt "field:ir.model.button.rule,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Modificado por usuario"
 
 msgctxt "field:ir.model.data,create_date:"
 msgid "Create Date"
@@ -1493,7 +1483,7 @@ msgstr ""
 
 msgctxt "field:ir.model.data,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Creado por usuario"
 
 msgctxt "field:ir.model.data,db_id:"
 msgid "Resource ID"
@@ -1544,7 +1534,7 @@ msgstr ""
 
 msgctxt "field:ir.model.data,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Modificado por usuario"
 
 msgctxt "field:ir.model.field,create_date:"
 msgid "Create Date"
@@ -1552,7 +1542,7 @@ msgstr ""
 
 msgctxt "field:ir.model.field,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Creado por usuario"
 
 msgctxt "field:ir.model.field,field_description:"
 msgid "Field Description"
@@ -1602,7 +1592,7 @@ msgstr ""
 
 msgctxt "field:ir.model.field,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Modificado por usuario"
 
 msgctxt "field:ir.model.field.access,create_date:"
 msgid "Create Date"
@@ -1610,7 +1600,7 @@ msgstr ""
 
 msgctxt "field:ir.model.field.access,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Creado por usuario"
 
 msgctxt "field:ir.model.field.access,description:"
 msgid "Description"
@@ -1655,7 +1645,7 @@ msgstr ""
 
 msgctxt "field:ir.model.field.access,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Modificado por usuario"
 
 msgctxt "field:ir.model.print_model_graph.start,filter:"
 msgid "Filter"
@@ -1679,7 +1669,7 @@ msgstr ""
 
 msgctxt "field:ir.module,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Creado por usuario"
 
 msgctxt "field:ir.module,dependencies:"
 msgid "Dependencies"
@@ -1715,7 +1705,7 @@ msgstr ""
 
 msgctxt "field:ir.module,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Modificado por usuario"
 
 msgctxt "field:ir.module.activate_upgrade.done,id:"
 msgid "ID"
@@ -1748,7 +1738,7 @@ msgstr ""
 
 msgctxt "field:ir.module.config_wizard.item,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Creado por usuario"
 
 msgctxt "field:ir.module.config_wizard.item,id:"
 msgid "ID"
@@ -1773,7 +1763,7 @@ msgstr ""
 
 msgctxt "field:ir.module.config_wizard.item,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Modificado por usuario"
 
 msgctxt "field:ir.module.config_wizard.other,id:"
 msgid "ID"
@@ -1789,7 +1779,7 @@ msgstr ""
 
 msgctxt "field:ir.module.dependency,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Creado por usuario"
 
 msgctxt "field:ir.module.dependency,id:"
 msgid "ID"
@@ -1818,7 +1808,7 @@ msgstr ""
 
 msgctxt "field:ir.module.dependency,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Modificado por usuario"
 
 msgctxt "field:ir.note,create_date:"
 msgid "Create Date"
@@ -1826,7 +1816,7 @@ msgstr ""
 
 msgctxt "field:ir.note,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Creado por usuario"
 
 msgctxt "field:ir.note,id:"
 msgid "ID"
@@ -1866,7 +1856,7 @@ msgstr ""
 
 msgctxt "field:ir.note,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Modificado por usuario"
 
 msgctxt "field:ir.note.read,create_date:"
 msgid "Create Date"
@@ -1874,7 +1864,7 @@ msgstr ""
 
 msgctxt "field:ir.note.read,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Creado por usuario"
 
 msgctxt "field:ir.note.read,id:"
 msgid "ID"
@@ -1899,44 +1889,7 @@ msgstr ""
 
 msgctxt "field:ir.note.read,write_uid:"
 msgid "Write User"
-msgstr ""
-
-msgctxt "field:ir.property,create_date:"
-msgid "Create Date"
-msgstr ""
-
-msgctxt "field:ir.property,create_uid:"
-msgid "Create User"
-msgstr ""
-
-#, fuzzy
-msgctxt "field:ir.property,field:"
-msgid "Field"
-msgstr "Fields"
-
-msgctxt "field:ir.property,id:"
-msgid "ID"
-msgstr ""
-
-msgctxt "field:ir.property,rec_name:"
-msgid "Name"
-msgstr ""
-
-msgctxt "field:ir.property,res:"
-msgid "Resource"
-msgstr ""
-
-msgctxt "field:ir.property,value:"
-msgid "Value"
-msgstr ""
-
-msgctxt "field:ir.property,write_date:"
-msgid "Write Date"
-msgstr ""
-
-msgctxt "field:ir.property,write_uid:"
-msgid "Write User"
-msgstr ""
+msgstr "Modificado por usuario"
 
 msgctxt "field:ir.rule,create_date:"
 msgid "Create Date"
@@ -1944,7 +1897,7 @@ msgstr ""
 
 msgctxt "field:ir.rule,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Creado por usuario"
 
 msgctxt "field:ir.rule,domain:"
 msgid "Domain"
@@ -1968,7 +1921,7 @@ msgstr ""
 
 msgctxt "field:ir.rule,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Modificado por usuario"
 
 msgctxt "field:ir.rule.group,create_date:"
 msgid "Create Date"
@@ -1976,7 +1929,7 @@ msgstr ""
 
 msgctxt "field:ir.rule.group,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Creado por usuario"
 
 msgctxt "field:ir.rule.group,default_p:"
 msgid "Default"
@@ -2037,7 +1990,7 @@ msgstr ""
 
 msgctxt "field:ir.rule.group,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Modificado por usuario"
 
 msgctxt "field:ir.sequence,active:"
 msgid "Active"
@@ -2054,7 +2007,7 @@ msgstr ""
 
 msgctxt "field:ir.sequence,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Creado por usuario"
 
 msgctxt "field:ir.sequence,id:"
 msgid "ID"
@@ -2115,7 +2068,7 @@ msgstr ""
 
 msgctxt "field:ir.sequence,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Modificado por usuario"
 
 msgctxt "field:ir.sequence.strict,active:"
 msgid "Active"
@@ -2132,7 +2085,7 @@ msgstr ""
 
 msgctxt "field:ir.sequence.strict,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Creado por usuario"
 
 msgctxt "field:ir.sequence.strict,id:"
 msgid "ID"
@@ -2193,7 +2146,7 @@ msgstr ""
 
 msgctxt "field:ir.sequence.strict,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Modificado por usuario"
 
 #, fuzzy
 msgctxt "field:ir.sequence.type,code:"
@@ -2206,7 +2159,7 @@ msgstr ""
 
 msgctxt "field:ir.sequence.type,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Creado por usuario"
 
 msgctxt "field:ir.sequence.type,id:"
 msgid "ID"
@@ -2227,7 +2180,7 @@ msgstr ""
 
 msgctxt "field:ir.sequence.type,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Modificado por usuario"
 
 msgctxt "field:ir.session,create_date:"
 msgid "Create Date"
@@ -2235,7 +2188,7 @@ msgstr ""
 
 msgctxt "field:ir.session,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Creado por usuario"
 
 msgctxt "field:ir.session,id:"
 msgid "ID"
@@ -2255,7 +2208,7 @@ msgstr ""
 
 msgctxt "field:ir.session,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Modificado por usuario"
 
 msgctxt "field:ir.session.wizard,create_date:"
 msgid "Create Date"
@@ -2263,7 +2216,7 @@ msgstr ""
 
 msgctxt "field:ir.session.wizard,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Creado por usuario"
 
 #, fuzzy
 msgctxt "field:ir.session.wizard,data:"
@@ -2284,7 +2237,7 @@ msgstr ""
 
 msgctxt "field:ir.session.wizard,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Modificado por usuario"
 
 msgctxt "field:ir.translation,create_date:"
 msgid "Create Date"
@@ -2292,7 +2245,7 @@ msgstr ""
 
 msgctxt "field:ir.translation,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Creado por usuario"
 
 msgctxt "field:ir.translation,fuzzy:"
 msgid "Fuzzy"
@@ -2355,7 +2308,7 @@ msgstr ""
 
 msgctxt "field:ir.translation,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Modificado por usuario"
 
 msgctxt "field:ir.translation.clean.start,id:"
 msgid "ID"
@@ -2426,7 +2379,7 @@ msgstr ""
 
 msgctxt "field:ir.trigger,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Creado por usuario"
 
 msgctxt "field:ir.trigger,id:"
 msgid "ID"
@@ -2475,7 +2428,7 @@ msgstr ""
 
 msgctxt "field:ir.trigger,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Modificado por usuario"
 
 msgctxt "field:ir.trigger.log,create_date:"
 msgid "Create Date"
@@ -2483,7 +2436,7 @@ msgstr ""
 
 msgctxt "field:ir.trigger.log,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Creado por usuario"
 
 msgctxt "field:ir.trigger.log,id:"
 msgid "ID"
@@ -2508,7 +2461,7 @@ msgstr ""
 
 msgctxt "field:ir.trigger.log,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Modificado por usuario"
 
 msgctxt "field:ir.ui.icon,create_date:"
 msgid "Create Date"
@@ -2516,7 +2469,7 @@ msgstr ""
 
 msgctxt "field:ir.ui.icon,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Creado por usuario"
 
 #, fuzzy
 msgctxt "field:ir.ui.icon,icon:"
@@ -2555,7 +2508,7 @@ msgstr ""
 
 msgctxt "field:ir.ui.icon,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Modificado por usuario"
 
 #, fuzzy
 msgctxt "field:ir.ui.menu,action:"
@@ -2584,7 +2537,7 @@ msgstr ""
 
 msgctxt "field:ir.ui.menu,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Creado por usuario"
 
 msgctxt "field:ir.ui.menu,favorite:"
 msgid "Favorite"
@@ -2627,7 +2580,7 @@ msgstr ""
 
 msgctxt "field:ir.ui.menu,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Modificado por usuario"
 
 msgctxt "field:ir.ui.menu.favorite,create_date:"
 msgid "Create Date"
@@ -2635,7 +2588,7 @@ msgstr ""
 
 msgctxt "field:ir.ui.menu.favorite,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Creado por usuario"
 
 msgctxt "field:ir.ui.menu.favorite,id:"
 msgid "ID"
@@ -2665,7 +2618,7 @@ msgstr ""
 
 msgctxt "field:ir.ui.menu.favorite,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Modificado por usuario"
 
 msgctxt "field:ir.ui.view,arch:"
 msgid "View Architecture"
@@ -2677,7 +2630,7 @@ msgstr ""
 
 msgctxt "field:ir.ui.view,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Creado por usuario"
 
 #, fuzzy
 msgctxt "field:ir.ui.view,data:"
@@ -2732,7 +2685,7 @@ msgstr ""
 
 msgctxt "field:ir.ui.view,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Modificado por usuario"
 
 msgctxt "field:ir.ui.view.show.start,id:"
 msgid "ID"
@@ -2744,7 +2697,7 @@ msgstr ""
 
 msgctxt "field:ir.ui.view_search,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Creado por usuario"
 
 msgctxt "field:ir.ui.view_search,domain:"
 msgid "Domain"
@@ -2777,7 +2730,7 @@ msgstr ""
 
 msgctxt "field:ir.ui.view_search,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Modificado por usuario"
 
 msgctxt "field:ir.ui.view_tree_state,child_name:"
 msgid "Child Name"
@@ -2789,7 +2742,7 @@ msgstr ""
 
 msgctxt "field:ir.ui.view_tree_state,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Creado por usuario"
 
 msgctxt "field:ir.ui.view_tree_state,domain:"
 msgid "Domain"
@@ -2826,7 +2779,7 @@ msgstr ""
 
 msgctxt "field:ir.ui.view_tree_state,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Modificado por usuario"
 
 msgctxt "field:ir.ui.view_tree_width,create_date:"
 msgid "Create Date"
@@ -2834,7 +2787,7 @@ msgstr ""
 
 msgctxt "field:ir.ui.view_tree_width,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Creado por usuario"
 
 #, fuzzy
 msgctxt "field:ir.ui.view_tree_width,field:"
@@ -2868,6 +2821,10 @@ msgstr ""
 
 msgctxt "field:ir.ui.view_tree_width,write_uid:"
 msgid "Write User"
+msgstr "Modificado por usuario"
+
+msgctxt "help:ir.action.act_window,context_domain:"
+msgid "Part of the domain that will be evaluated on each refresh"
 msgstr ""
 
 msgctxt "help:ir.action.act_window,limit:"
@@ -2991,90 +2948,106 @@ msgctxt "model:ir.action,name:"
 msgid "Action"
 msgstr "Actions"
 
+#, fuzzy
 msgctxt "model:ir.action,name:act_action_act_window_form"
 msgid "Window Actions"
-msgstr "Window Actions"
+msgstr "Acciones de ventana"
 
+#, fuzzy
 msgctxt "model:ir.action,name:act_action_form"
 msgid "Actions"
 msgstr "Actions"
 
+#, fuzzy
 msgctxt "model:ir.action,name:act_action_report_form"
 msgid "Reports"
 msgstr "Reports"
 
 msgctxt "model:ir.action,name:act_action_url_form"
 msgid "URLs"
-msgstr "URLs"
+msgstr ""
 
 msgctxt "model:ir.action,name:act_action_wizard_form"
 msgid "Wizards"
-msgstr "Wizards"
+msgstr ""
 
+#, fuzzy
 msgctxt "model:ir.action,name:act_attachment_form"
 msgid "Attachments"
 msgstr "Attachments"
 
+#, fuzzy
 msgctxt "model:ir.action,name:act_config_wizard_item_form"
 msgid "Config Wizard Items"
-msgstr "Config Wizard Items"
+msgstr "Elementos del asistente de configuración"
 
 msgctxt "model:ir.action,name:act_cron_form"
 msgid "Scheduled Actions"
-msgstr "Scheduled Actions"
+msgstr ""
 
+#, fuzzy
 msgctxt "model:ir.action,name:act_export_form"
 msgid "Exports"
 msgstr "Exports"
 
+#, fuzzy
 msgctxt "model:ir.action,name:act_icon_form"
 msgid "Icons"
 msgstr "Icons"
 
+#, fuzzy
 msgctxt "model:ir.action,name:act_lang_form"
 msgid "Languages"
 msgstr "Languages"
 
+#, fuzzy
 msgctxt "model:ir.action,name:act_menu_list"
 msgid "Menu"
 msgstr "Menu"
 
+#, fuzzy
 msgctxt "model:ir.action,name:act_menu_tree"
 msgid "Menu"
 msgstr "Menu"
 
+#, fuzzy
 msgctxt "model:ir.action,name:act_model_access_form"
 msgid "Models Access"
-msgstr "Models Access"
+msgstr "Acceso a modelos"
 
 msgctxt "model:ir.action,name:act_model_access_form_relate_model"
 msgid "Access"
-msgstr "Access"
+msgstr ""
 
 msgctxt "model:ir.action,name:act_model_button_click_form_relate_model_button"
 msgid "Clicks"
 msgstr ""
 
+#, fuzzy
 msgctxt "model:ir.action,name:act_model_button_form"
 msgid "Buttons"
 msgstr "Buttons"
 
+#, fuzzy
 msgctxt "model:ir.action,name:act_model_data_form"
 msgid "Data"
 msgstr "Data"
 
+#, fuzzy
 msgctxt "model:ir.action,name:act_model_field_access_form"
 msgid "Fields Access"
-msgstr "Fields Access"
+msgstr "Permisos de acceso a campos"
 
 msgctxt "model:ir.action,name:act_model_field_access_form_relate_field"
 msgid "Access"
-msgstr "Access"
+msgstr ""
 
+#, fuzzy
 msgctxt "model:ir.action,name:act_model_fields_form"
 msgid "Fields"
 msgstr "Fields"
 
+#, fuzzy
 msgctxt "model:ir.action,name:act_model_form"
 msgid "Models"
 msgstr "Models"
@@ -3086,100 +3059,118 @@ msgstr "Perform Pending Installation/Upgrade"
 
 msgctxt "model:ir.action,name:act_module_config"
 msgid "Configure Modules"
-msgstr "Configure Modules"
+msgstr ""
 
 msgctxt "model:ir.action,name:act_module_config_wizard"
 msgid "Module Configuration"
-msgstr "Module Configuration"
+msgstr ""
 
+#, fuzzy
 msgctxt "model:ir.action,name:act_module_form"
 msgid "Modules"
 msgstr "Modules"
 
+#, fuzzy
 msgctxt "model:ir.action,name:act_note_form"
 msgid "Notes"
 msgstr "Notes"
 
-msgctxt "model:ir.action,name:act_property_form"
-msgid "Properties"
-msgstr "Properties"
-
-msgctxt "model:ir.action,name:act_property_form_default"
-msgid "Default Properties"
-msgstr "Default Properties"
-
 msgctxt "model:ir.action,name:act_rule_group_form"
 msgid "Record Rules"
-msgstr "Record Rules"
+msgstr ""
 
+#, fuzzy
 msgctxt "model:ir.action,name:act_sequence_form"
 msgid "Sequences"
 msgstr "Sequences"
 
+#, fuzzy
 msgctxt "model:ir.action,name:act_sequence_strict_form"
 msgid "Sequences Strict"
 msgstr "Sequences Strict"
 
+#, fuzzy
 msgctxt "model:ir.action,name:act_sequence_type_form"
 msgid "Sequence Types"
 msgstr "Sequence Types"
 
+#, fuzzy
 msgctxt "model:ir.action,name:act_translation_clean"
 msgid "Clean Translations"
 msgstr "Clean Translations"
 
+#, fuzzy
 msgctxt "model:ir.action,name:act_translation_export"
 msgid "Export Translations"
 msgstr "Export Translations"
 
+#, fuzzy
 msgctxt "model:ir.action,name:act_translation_form"
 msgid "Translations"
 msgstr "Translations"
 
 #, fuzzy
+msgctxt "model:ir.action,name:act_translation_report"
+msgid "Translations"
+msgstr "Translations"
+
+#, fuzzy
 msgctxt "model:ir.action,name:act_translation_set"
 msgid "Set Translations"
 msgstr "Set Translations"
 
+#, fuzzy
 msgctxt "model:ir.action,name:act_translation_update"
 msgid "Synchronize Translations"
 msgstr "Synchronize Translations"
 
+#, fuzzy
 msgctxt "model:ir.action,name:act_trigger_form"
 msgid "Triggers"
 msgstr "Triggers"
 
+#, fuzzy
 msgctxt "model:ir.action,name:act_view_form"
 msgid "Views"
 msgstr "Views"
 
+#, fuzzy
 msgctxt "model:ir.action,name:act_view_search"
 msgid "View Search"
 msgstr "View Search"
 
+#, fuzzy
 msgctxt "model:ir.action,name:act_view_show"
 msgid "Show View"
 msgstr "Show View"
 
 msgctxt "model:ir.action,name:act_view_tree_state"
 msgid "Tree State"
-msgstr "Tree State"
+msgstr "Estado de árbol"
 
+#, fuzzy
 msgctxt "model:ir.action,name:act_view_tree_width_form"
 msgid "View Tree Width"
-msgstr "View Tree Width"
+msgstr "Ancho de la vista de árbol"
 
+#, fuzzy
 msgctxt "model:ir.action,name:print_model_graph"
 msgid "Graph"
 msgstr "Graph"
 
+#, fuzzy
 msgctxt "model:ir.action,name:report_model_graph"
 msgid "Graph"
 msgstr "Graph"
 
 msgctxt "model:ir.action,name:report_model_workflow_graph"
 msgid "Workflow Graph"
-msgstr "Workflow Graph"
+msgstr "Gráfico de estados"
+
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_translation_report"
+msgid "Translations"
+msgstr "Translations"
 
 msgctxt "model:ir.action.act_window,name:"
 msgid "Action act window"
@@ -3192,13 +3183,25 @@ msgstr ""
 msgctxt ""
 "model:ir.action.act_window.domain,name:act_model_data_form_domain_all"
 msgid "All"
-msgstr "All"
+msgstr ""
 
+#, fuzzy
 msgctxt ""
 "model:ir.action.act_window.domain,name:act_model_data_form_domain_out_of_sync"
 msgid "Out of Sync"
 msgstr "Out of Sync"
 
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_translation_form_domain_local"
+msgid "Local"
+msgstr ""
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_translation_form_domain_module"
+msgid "Modules"
+msgstr "Modules"
+
 msgctxt "model:ir.action.act_window.view,name:"
 msgid "Action act window view"
 msgstr ""
@@ -3257,27 +3260,27 @@ msgstr "Languages"
 
 msgctxt "model:ir.lang,name:lang_bg"
 msgid "Bulgarian"
-msgstr "Bulgarian"
+msgstr ""
 
 msgctxt "model:ir.lang,name:lang_ca"
 msgid "Català"
-msgstr "Català"
+msgstr ""
 
 msgctxt "model:ir.lang,name:lang_cs"
 msgid "Czech"
-msgstr "Czech"
+msgstr ""
 
 msgctxt "model:ir.lang,name:lang_de"
 msgid "German"
-msgstr "German"
+msgstr ""
 
 msgctxt "model:ir.lang,name:lang_en"
 msgid "English"
-msgstr "English"
+msgstr ""
 
 msgctxt "model:ir.lang,name:lang_es"
 msgid "Spanish"
-msgstr "Spanish"
+msgstr ""
 
 msgctxt "model:ir.lang,name:lang_es_419"
 msgid "Spanish (Latin American)"
@@ -3285,43 +3288,47 @@ msgstr ""
 
 msgctxt "model:ir.lang,name:lang_fr"
 msgid "French"
-msgstr "French"
+msgstr ""
 
 msgctxt "model:ir.lang,name:lang_hu_HU"
 msgid "Hungarian"
-msgstr "Hungarian"
+msgstr ""
 
 msgctxt "model:ir.lang,name:lang_it_IT"
 msgid "Italian"
-msgstr "Italian"
+msgstr ""
 
 msgctxt "model:ir.lang,name:lang_lo"
-msgid "ລາວ"
-msgstr "ລາວ"
+msgid "Lao"
+msgstr ""
 
 msgctxt "model:ir.lang,name:lang_lt"
 msgid "Lithuanian"
-msgstr "Lithuanian"
+msgstr ""
 
 msgctxt "model:ir.lang,name:lang_nl"
 msgid "Dutch"
-msgstr "Dutch"
+msgstr ""
+
+msgctxt "model:ir.lang,name:lang_pl"
+msgid "Polish"
+msgstr ""
 
 msgctxt "model:ir.lang,name:lang_pt_BR"
 msgid "Portuguese (Brazil)"
-msgstr "Portuguese (Brazil)"
+msgstr ""
 
 msgctxt "model:ir.lang,name:lang_ru"
 msgid "Russian"
-msgstr "Russian"
+msgstr ""
 
 msgctxt "model:ir.lang,name:lang_sl"
 msgid "Slovenian"
-msgstr "Slovenian"
+msgstr ""
 
 msgctxt "model:ir.lang,name:lang_zh_CN"
-msgid "中国(简体)"
-msgstr "中国(简体)"
+msgid "Chinese Simplified"
+msgstr ""
 
 #, fuzzy
 msgctxt "model:ir.model,name:"
@@ -3407,10 +3414,6 @@ msgctxt "model:ir.note.read,name:"
 msgid "Note Read"
 msgstr ""
 
-msgctxt "model:ir.property,name:"
-msgid "Property"
-msgstr ""
-
 msgctxt "model:ir.rule,name:"
 msgid "Rule"
 msgstr ""
@@ -3499,90 +3502,103 @@ msgctxt "model:ir.ui.menu,name:"
 msgid "UI menu"
 msgstr ""
 
+#, fuzzy
 msgctxt "model:ir.ui.menu,name:menu_act_action"
 msgid "Actions"
 msgstr "Actions"
 
+#, fuzzy
 msgctxt "model:ir.ui.menu,name:menu_action"
 msgid "Actions"
 msgstr "Actions"
 
 msgctxt "model:ir.ui.menu,name:menu_action_act_window"
 msgid "Window Actions"
-msgstr "Window Actions"
+msgstr "Acciones de ventana"
 
+#, fuzzy
 msgctxt "model:ir.ui.menu,name:menu_action_report_form"
 msgid "Reports"
 msgstr "Reports"
 
 msgctxt "model:ir.ui.menu,name:menu_action_url"
 msgid "URLs"
-msgstr "URLs"
+msgstr ""
 
 msgctxt "model:ir.ui.menu,name:menu_action_wizard"
 msgid "Wizards"
-msgstr "Wizards"
+msgstr ""
 
 msgctxt "model:ir.ui.menu,name:menu_administration"
 msgid "Administration"
-msgstr "Administration"
+msgstr ""
 
+#, fuzzy
 msgctxt "model:ir.ui.menu,name:menu_attachment_form"
 msgid "Attachments"
 msgstr "Attachments"
 
 msgctxt "model:ir.ui.menu,name:menu_config_wizard_item_form"
 msgid "Config Wizard Items"
-msgstr "Config Wizard Items"
+msgstr "Elementos del asistente de configuración"
 
 msgctxt "model:ir.ui.menu,name:menu_cron_form"
 msgid "Scheduled Actions"
-msgstr "Scheduled Actions"
+msgstr ""
 
+#, fuzzy
 msgctxt "model:ir.ui.menu,name:menu_export_form"
 msgid "Exports"
 msgstr "Exports"
 
+#, fuzzy
 msgctxt "model:ir.ui.menu,name:menu_icon_form"
 msgid "Icons"
 msgstr "Icons"
 
+#, fuzzy
 msgctxt "model:ir.ui.menu,name:menu_ir_sequence_type"
 msgid "Sequence Types"
 msgstr "Sequence Types"
 
+#, fuzzy
 msgctxt "model:ir.ui.menu,name:menu_lang_form"
 msgid "Languages"
 msgstr "Languages"
 
 msgctxt "model:ir.ui.menu,name:menu_localization"
 msgid "Localization"
-msgstr "Localization"
+msgstr ""
 
+#, fuzzy
 msgctxt "model:ir.ui.menu,name:menu_menu_list"
 msgid "Menu"
 msgstr "Menu"
 
 msgctxt "model:ir.ui.menu,name:menu_model_access_form"
 msgid "Models Access"
-msgstr "Models Access"
+msgstr "Acceso a modelos"
 
+#, fuzzy
 msgctxt "model:ir.ui.menu,name:menu_model_button_form"
 msgid "Buttons"
 msgstr "Buttons"
 
+#, fuzzy
 msgctxt "model:ir.ui.menu,name:menu_model_data_form"
 msgid "Data"
 msgstr "Data"
 
 msgctxt "model:ir.ui.menu,name:menu_model_field_access_form"
 msgid "Fields Access"
-msgstr "Fields Access"
+msgstr "Permisos de acceso a campos"
 
+#, fuzzy
 msgctxt "model:ir.ui.menu,name:menu_model_form"
 msgid "Models"
 msgstr "Models"
 
+#, fuzzy
 msgctxt "model:ir.ui.menu,name:menu_models"
 msgid "Models"
 msgstr "Models"
@@ -3592,90 +3608,97 @@ msgctxt "model:ir.ui.menu,name:menu_module_activate_upgrade"
 msgid "Perform Pending Activation/Upgrade"
 msgstr "Perform Pending Installation/Upgrade"
 
+#, fuzzy
 msgctxt "model:ir.ui.menu,name:menu_module_form"
 msgid "Modules"
 msgstr "Modules"
 
+#, fuzzy
 msgctxt "model:ir.ui.menu,name:menu_modules"
 msgid "Modules"
 msgstr "Modules"
 
+#, fuzzy
 msgctxt "model:ir.ui.menu,name:menu_note_form"
 msgid "Notes"
 msgstr "Notes"
 
-msgctxt "model:ir.ui.menu,name:menu_property_form"
-msgid "Properties"
-msgstr "Properties"
-
-msgctxt "model:ir.ui.menu,name:menu_property_form_default"
-msgid "Default Properties"
-msgstr "Default Properties"
-
 msgctxt "model:ir.ui.menu,name:menu_rule_group_form"
 msgid "Record Rules"
-msgstr "Record Rules"
+msgstr ""
 
 msgctxt "model:ir.ui.menu,name:menu_scheduler"
 msgid "Scheduler"
-msgstr "Scheduler"
+msgstr "Programador de tareas"
 
+#, fuzzy
 msgctxt "model:ir.ui.menu,name:menu_sequence_form"
 msgid "Sequences"
 msgstr "Sequences"
 
+#, fuzzy
 msgctxt "model:ir.ui.menu,name:menu_sequence_strict_form"
 msgid "Sequences Strict"
 msgstr "Sequences Strict"
 
+#, fuzzy
 msgctxt "model:ir.ui.menu,name:menu_sequences"
 msgid "Sequences"
 msgstr "Sequences"
 
+#, fuzzy
 msgctxt "model:ir.ui.menu,name:menu_translation_clean"
 msgid "Clean Translations"
 msgstr "Clean Translations"
 
+#, fuzzy
 msgctxt "model:ir.ui.menu,name:menu_translation_export"
 msgid "Export Translations"
 msgstr "Export Translations"
 
+#, fuzzy
 msgctxt "model:ir.ui.menu,name:menu_translation_form"
 msgid "Translations"
 msgstr "Translations"
 
+#, fuzzy
 msgctxt "model:ir.ui.menu,name:menu_translation_set"
 msgid "Set Translations"
 msgstr "Set Translations"
 
+#, fuzzy
 msgctxt "model:ir.ui.menu,name:menu_translation_update"
 msgid "Synchronize Translations"
 msgstr "Synchronize Translations"
 
+#, fuzzy
 msgctxt "model:ir.ui.menu,name:menu_trigger_form"
 msgid "Triggers"
 msgstr "Triggers"
 
 msgctxt "model:ir.ui.menu,name:menu_ui"
 msgid "User Interface"
-msgstr "User Interface"
+msgstr ""
 
+#, fuzzy
 msgctxt "model:ir.ui.menu,name:menu_view"
 msgid "Views"
 msgstr "Views"
 
+#, fuzzy
 msgctxt "model:ir.ui.menu,name:menu_view_search"
 msgid "View Search"
 msgstr "View Search"
 
 msgctxt "model:ir.ui.menu,name:menu_view_tree_state"
 msgid "Tree State"
-msgstr "Tree State"
+msgstr "Estado de árbol"
 
 msgctxt "model:ir.ui.menu,name:menu_view_tree_width"
 msgid "View Tree Width"
-msgstr "View Tree Width"
+msgstr "Ancho de la vista de árbol"
 
+#, fuzzy
 msgctxt "model:ir.ui.menu,name:model_model_fields_form"
 msgid "Fields"
 msgstr "Fields"
diff --git a/trytond/ir/locale/fr.po b/trytond/ir/locale/fr.po
index 03f7d73..99f6ee5 100644
--- a/trytond/ir/locale/fr.po
+++ b/trytond/ir/locale/fr.po
@@ -432,6 +432,10 @@ msgctxt "field:ir.action.act_window,context:"
 msgid "Context Value"
 msgstr "Valeur du contexte"
 
+msgctxt "field:ir.action.act_window,context_domain:"
+msgid "Context Domain"
+msgstr "Contexte du domaine"
+
 msgctxt "field:ir.action.act_window,context_model:"
 msgid "Context Model"
 msgstr "Modèle de context"
@@ -696,6 +700,10 @@ msgctxt "field:ir.action.report,id:"
 msgid "ID"
 msgstr "ID"
 
+msgctxt "field:ir.action.report,is_custom:"
+msgid "Is Custom"
+msgstr "Est personnalisé"
+
 msgctxt "field:ir.action.report,keywords:"
 msgid "Keywords"
 msgstr "Mots-clés"
@@ -1888,42 +1896,6 @@ msgctxt "field:ir.note.read,write_uid:"
 msgid "Write User"
 msgstr "Mis à jour par"
 
-msgctxt "field:ir.property,create_date:"
-msgid "Create Date"
-msgstr "Date de création"
-
-msgctxt "field:ir.property,create_uid:"
-msgid "Create User"
-msgstr "Créé par"
-
-msgctxt "field:ir.property,field:"
-msgid "Field"
-msgstr "Champ"
-
-msgctxt "field:ir.property,id:"
-msgid "ID"
-msgstr "ID"
-
-msgctxt "field:ir.property,rec_name:"
-msgid "Name"
-msgstr "Nom"
-
-msgctxt "field:ir.property,res:"
-msgid "Resource"
-msgstr "Ressource"
-
-msgctxt "field:ir.property,value:"
-msgid "Value"
-msgstr "Valeur"
-
-msgctxt "field:ir.property,write_date:"
-msgid "Write Date"
-msgstr "Date de mise à jour"
-
-msgctxt "field:ir.property,write_uid:"
-msgid "Write User"
-msgstr "Mis à jour par"
-
 msgctxt "field:ir.rule,create_date:"
 msgid "Create Date"
 msgstr "Date de création"
@@ -2824,6 +2796,10 @@ msgctxt "field:ir.ui.view_tree_width,write_uid:"
 msgid "Write User"
 msgstr "Mis à jour par"
 
+msgctxt "help:ir.action.act_window,context_domain:"
+msgid "Part of the domain that will be evaluated on each refresh"
+msgstr "La partie du domaine qui sera évaluée à chaque rafraîchissement"
+
 msgctxt "help:ir.action.act_window,limit:"
 msgid "Default limit for the list view"
 msgstr "Limite par défaut pour la vue liste"
@@ -3072,14 +3048,6 @@ msgctxt "model:ir.action,name:act_note_form"
 msgid "Notes"
 msgstr "Notes"
 
-msgctxt "model:ir.action,name:act_property_form"
-msgid "Properties"
-msgstr "Propriétés"
-
-msgctxt "model:ir.action,name:act_property_form_default"
-msgid "Default Properties"
-msgstr "Propriétés par défaut"
-
 msgctxt "model:ir.action,name:act_rule_group_form"
 msgid "Record Rules"
 msgstr "Règles des enregistrements"
@@ -3108,6 +3076,10 @@ msgctxt "model:ir.action,name:act_translation_form"
 msgid "Translations"
 msgstr "Traductions"
 
+msgctxt "model:ir.action,name:act_translation_report"
+msgid "Translations"
+msgstr "Traductions"
+
 msgctxt "model:ir.action,name:act_translation_set"
 msgid "Set Translations"
 msgstr "Définir les traductions"
@@ -3152,6 +3124,10 @@ msgctxt "model:ir.action,name:report_model_workflow_graph"
 msgid "Workflow Graph"
 msgstr "Graphique de flux de travail"
 
+msgctxt "model:ir.action,name:wizard_translation_report"
+msgid "Translations"
+msgstr "Traductions"
+
 msgctxt "model:ir.action.act_window,name:"
 msgid "Action act window"
 msgstr "Action ouvrir fenêtre"
@@ -3170,6 +3146,16 @@ msgctxt ""
 msgid "Out of Sync"
 msgstr "Désynchronisé"
 
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_translation_form_domain_local"
+msgid "Local"
+msgstr "Locale"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_translation_form_domain_module"
+msgid "Modules"
+msgstr "Modules"
+
 msgctxt "model:ir.action.act_window.view,name:"
 msgid "Action act window view"
 msgstr "Action ouvrir fenêtre vue"
@@ -3263,7 +3249,7 @@ msgid "Italian"
 msgstr "Italien"
 
 msgctxt "model:ir.lang,name:lang_lo"
-msgid "ລາວ"
+msgid "Lao"
 msgstr "Lao"
 
 msgctxt "model:ir.lang,name:lang_lt"
@@ -3274,6 +3260,10 @@ msgctxt "model:ir.lang,name:lang_nl"
 msgid "Dutch"
 msgstr "Néerlandais"
 
+msgctxt "model:ir.lang,name:lang_pl"
+msgid "Polish"
+msgstr "Polonais"
+
 msgctxt "model:ir.lang,name:lang_pt_BR"
 msgid "Portuguese (Brazil)"
 msgstr "Portugais (Brésil)"
@@ -3287,8 +3277,8 @@ msgid "Slovenian"
 msgstr "Slovène"
 
 msgctxt "model:ir.lang,name:lang_zh_CN"
-msgid "中国(简体)"
-msgstr "Chinois simplifié"
+msgid "Chinese Simplified"
+msgstr "Chinois Simplifié"
 
 msgctxt "model:ir.model,name:"
 msgid "Model"
@@ -3370,10 +3360,6 @@ msgctxt "model:ir.note.read,name:"
 msgid "Note Read"
 msgstr "Note lue"
 
-msgctxt "model:ir.property,name:"
-msgid "Property"
-msgstr "Propriété"
-
 msgctxt "model:ir.rule,name:"
 msgid "Rule"
 msgstr "Règle"
@@ -3554,14 +3540,6 @@ msgctxt "model:ir.ui.menu,name:menu_note_form"
 msgid "Notes"
 msgstr "Notes"
 
-msgctxt "model:ir.ui.menu,name:menu_property_form"
-msgid "Properties"
-msgstr "Propriétés"
-
-msgctxt "model:ir.ui.menu,name:menu_property_form_default"
-msgid "Default Properties"
-msgstr "Propriétés par defaut"
-
 msgctxt "model:ir.ui.menu,name:menu_rule_group_form"
 msgid "Record Rules"
 msgstr "Règles d'enregistrement"
diff --git a/trytond/ir/locale/hu_HU.po b/trytond/ir/locale/hu_HU.po
index 87c2a8a..2f22ee5 100644
--- a/trytond/ir/locale/hu_HU.po
+++ b/trytond/ir/locale/hu_HU.po
@@ -419,6 +419,10 @@ msgctxt "field:ir.action.act_window,context:"
 msgid "Context Value"
 msgstr "Összefüggés"
 
+msgctxt "field:ir.action.act_window,context_domain:"
+msgid "Context Domain"
+msgstr ""
+
 msgctxt "field:ir.action.act_window,context_model:"
 msgid "Context Model"
 msgstr ""
@@ -683,6 +687,10 @@ msgctxt "field:ir.action.report,id:"
 msgid "ID"
 msgstr "ID"
 
+msgctxt "field:ir.action.report,is_custom:"
+msgid "Is Custom"
+msgstr ""
+
 msgctxt "field:ir.action.report,keywords:"
 msgid "Keywords"
 msgstr "Kulcsszavak"
@@ -1920,42 +1928,6 @@ msgctxt "field:ir.note.read,write_uid:"
 msgid "Write User"
 msgstr "Által módosítva"
 
-msgctxt "field:ir.property,create_date:"
-msgid "Create Date"
-msgstr "Létrehozás dátuma"
-
-msgctxt "field:ir.property,create_uid:"
-msgid "Create User"
-msgstr "Által létrehozva\n"
-
-msgctxt "field:ir.property,field:"
-msgid "Field"
-msgstr "Mező"
-
-msgctxt "field:ir.property,id:"
-msgid "ID"
-msgstr "ID"
-
-msgctxt "field:ir.property,rec_name:"
-msgid "Name"
-msgstr "Név"
-
-msgctxt "field:ir.property,res:"
-msgid "Resource"
-msgstr "Forrás"
-
-msgctxt "field:ir.property,value:"
-msgid "Value"
-msgstr "Érték"
-
-msgctxt "field:ir.property,write_date:"
-msgid "Write Date"
-msgstr "Utolsó módosítás dátuma"
-
-msgctxt "field:ir.property,write_uid:"
-msgid "Write User"
-msgstr "Által módosítva"
-
 msgctxt "field:ir.rule,create_date:"
 msgid "Create Date"
 msgstr "Létrehozás dátuma"
@@ -2856,6 +2828,10 @@ msgctxt "field:ir.ui.view_tree_width,write_uid:"
 msgid "Write User"
 msgstr "Által módosítva"
 
+msgctxt "help:ir.action.act_window,context_domain:"
+msgid "Part of the domain that will be evaluated on each refresh"
+msgstr ""
+
 msgctxt "help:ir.action.act_window,limit:"
 msgid "Default limit for the list view"
 msgstr "Alap felső határ a lista nézethez"
@@ -3103,14 +3079,6 @@ msgctxt "model:ir.action,name:act_note_form"
 msgid "Notes"
 msgstr ""
 
-msgctxt "model:ir.action,name:act_property_form"
-msgid "Properties"
-msgstr "Tulajdonságok"
-
-msgctxt "model:ir.action,name:act_property_form_default"
-msgid "Default Properties"
-msgstr "Alapértelmezett tulajdonságok"
-
 msgctxt "model:ir.action,name:act_rule_group_form"
 msgid "Record Rules"
 msgstr "Adatszabályok"
@@ -3140,6 +3108,11 @@ msgid "Translations"
 msgstr "Fordítások"
 
 #, fuzzy
+msgctxt "model:ir.action,name:act_translation_report"
+msgid "Translations"
+msgstr "Fordítások"
+
+#, fuzzy
 msgctxt "model:ir.action,name:act_translation_set"
 msgid "Set Translations"
 msgstr "Fordítás aktualizálása"
@@ -3184,6 +3157,11 @@ msgctxt "model:ir.action,name:report_model_workflow_graph"
 msgid "Workflow Graph"
 msgstr ""
 
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_translation_report"
+msgid "Translations"
+msgstr "Fordítások"
+
 msgctxt "model:ir.action.act_window,name:"
 msgid "Action act window"
 msgstr "Művelet aktív ablak"
@@ -3203,6 +3181,17 @@ msgctxt ""
 msgid "Out of Sync"
 msgstr "Szinkronizálatlan"
 
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_translation_form_domain_local"
+msgid "Local"
+msgstr ""
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_translation_form_domain_module"
+msgid "Modules"
+msgstr "Modulok"
+
 msgctxt "model:ir.action.act_window.view,name:"
 msgid "Action act window view"
 msgstr "Aktív ablak nézet"
@@ -3298,7 +3287,7 @@ msgid "Italian"
 msgstr ""
 
 msgctxt "model:ir.lang,name:lang_lo"
-msgid "ລາວ"
+msgid "Lao"
 msgstr ""
 
 msgctxt "model:ir.lang,name:lang_lt"
@@ -3309,6 +3298,10 @@ msgctxt "model:ir.lang,name:lang_nl"
 msgid "Dutch"
 msgstr "Holland"
 
+msgctxt "model:ir.lang,name:lang_pl"
+msgid "Polish"
+msgstr ""
+
 msgctxt "model:ir.lang,name:lang_pt_BR"
 msgid "Portuguese (Brazil)"
 msgstr ""
@@ -3322,7 +3315,7 @@ msgid "Slovenian"
 msgstr "Szlovén"
 
 msgctxt "model:ir.lang,name:lang_zh_CN"
-msgid "中国(简体)"
+msgid "Chinese Simplified"
 msgstr ""
 
 msgctxt "model:ir.model,name:"
@@ -3408,10 +3401,6 @@ msgctxt "model:ir.note.read,name:"
 msgid "Note Read"
 msgstr ""
 
-msgctxt "model:ir.property,name:"
-msgid "Property"
-msgstr "Tulajdonság"
-
 msgctxt "model:ir.rule,name:"
 msgid "Rule"
 msgstr "Szabály"
@@ -3593,14 +3582,6 @@ msgctxt "model:ir.ui.menu,name:menu_note_form"
 msgid "Notes"
 msgstr ""
 
-msgctxt "model:ir.ui.menu,name:menu_property_form"
-msgid "Properties"
-msgstr "Tulajdonságok"
-
-msgctxt "model:ir.ui.menu,name:menu_property_form_default"
-msgid "Default Properties"
-msgstr "Alapértelmezett tulajdonságok"
-
 msgctxt "model:ir.ui.menu,name:menu_rule_group_form"
 msgid "Record Rules"
 msgstr "Adat szabály"
diff --git a/trytond/ir/locale/it_IT.po b/trytond/ir/locale/it_IT.po
index a042afa..d346b54 100644
--- a/trytond/ir/locale/it_IT.po
+++ b/trytond/ir/locale/it_IT.po
@@ -429,6 +429,10 @@ msgctxt "field:ir.action.act_window,context:"
 msgid "Context Value"
 msgstr "Valore Contenuto"
 
+msgctxt "field:ir.action.act_window,context_domain:"
+msgid "Context Domain"
+msgstr ""
+
 msgctxt "field:ir.action.act_window,context_model:"
 msgid "Context Model"
 msgstr "modello context"
@@ -693,6 +697,10 @@ msgctxt "field:ir.action.report,id:"
 msgid "ID"
 msgstr "ID"
 
+msgctxt "field:ir.action.report,is_custom:"
+msgid "Is Custom"
+msgstr ""
+
 msgctxt "field:ir.action.report,keywords:"
 msgid "Keywords"
 msgstr "Keywords"
@@ -1885,42 +1893,6 @@ msgctxt "field:ir.note.read,write_uid:"
 msgid "Write User"
 msgstr "modificato da"
 
-msgctxt "field:ir.property,create_date:"
-msgid "Create Date"
-msgstr "Creazione Data"
-
-msgctxt "field:ir.property,create_uid:"
-msgid "Create User"
-msgstr "Creazione Utente"
-
-msgctxt "field:ir.property,field:"
-msgid "Field"
-msgstr "Campo"
-
-msgctxt "field:ir.property,id:"
-msgid "ID"
-msgstr "ID"
-
-msgctxt "field:ir.property,rec_name:"
-msgid "Name"
-msgstr "Nome"
-
-msgctxt "field:ir.property,res:"
-msgid "Resource"
-msgstr "Risorsa"
-
-msgctxt "field:ir.property,value:"
-msgid "Value"
-msgstr "Valore"
-
-msgctxt "field:ir.property,write_date:"
-msgid "Write Date"
-msgstr "modificato il"
-
-msgctxt "field:ir.property,write_uid:"
-msgid "Write User"
-msgstr "modificato da"
-
 msgctxt "field:ir.rule,create_date:"
 msgid "Create Date"
 msgstr "Creazione Data"
@@ -2821,6 +2793,10 @@ msgctxt "field:ir.ui.view_tree_width,write_uid:"
 msgid "Write User"
 msgstr "modificato da"
 
+msgctxt "help:ir.action.act_window,context_domain:"
+msgid "Part of the domain that will be evaluated on each refresh"
+msgstr ""
+
 msgctxt "help:ir.action.act_window,limit:"
 msgid "Default limit for the list view"
 msgstr "Limite predefinito per la vista della lista"
@@ -3068,14 +3044,6 @@ msgctxt "model:ir.action,name:act_note_form"
 msgid "Notes"
 msgstr "Note"
 
-msgctxt "model:ir.action,name:act_property_form"
-msgid "Properties"
-msgstr "Proprietà"
-
-msgctxt "model:ir.action,name:act_property_form_default"
-msgid "Default Properties"
-msgstr "Proprietà Predefinite"
-
 msgctxt "model:ir.action,name:act_rule_group_form"
 msgid "Record Rules"
 msgstr "Regole Record"
@@ -3104,6 +3072,11 @@ msgctxt "model:ir.action,name:act_translation_form"
 msgid "Translations"
 msgstr "Traduzioni"
 
+#, fuzzy
+msgctxt "model:ir.action,name:act_translation_report"
+msgid "Translations"
+msgstr "Traduzioni"
+
 msgctxt "model:ir.action,name:act_translation_set"
 msgid "Set Translations"
 msgstr "Impostazione Traduzioni"
@@ -3148,6 +3121,11 @@ msgctxt "model:ir.action,name:report_model_workflow_graph"
 msgid "Workflow Graph"
 msgstr "grafo Workflow"
 
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_translation_report"
+msgid "Translations"
+msgstr "Traduzioni"
+
 msgctxt "model:ir.action.act_window,name:"
 msgid "Action act window"
 msgstr "Finestra Action act"
@@ -3166,6 +3144,17 @@ msgctxt ""
 msgid "Out of Sync"
 msgstr "Out of Sync"
 
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_translation_form_domain_local"
+msgid "Local"
+msgstr ""
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_translation_form_domain_module"
+msgid "Modules"
+msgstr "Moduli"
+
 msgctxt "model:ir.action.act_window.view,name:"
 msgid "Action act window view"
 msgstr "Vista finestra Action act"
@@ -3259,7 +3248,7 @@ msgid "Italian"
 msgstr "Italiano"
 
 msgctxt "model:ir.lang,name:lang_lo"
-msgid "ລາວ"
+msgid "Lao"
 msgstr ""
 
 msgctxt "model:ir.lang,name:lang_lt"
@@ -3270,6 +3259,10 @@ msgctxt "model:ir.lang,name:lang_nl"
 msgid "Dutch"
 msgstr "Olandese"
 
+msgctxt "model:ir.lang,name:lang_pl"
+msgid "Polish"
+msgstr ""
+
 msgctxt "model:ir.lang,name:lang_pt_BR"
 msgid "Portuguese (Brazil)"
 msgstr "portoghese (Brasile)"
@@ -3282,10 +3275,9 @@ msgctxt "model:ir.lang,name:lang_sl"
 msgid "Slovenian"
 msgstr "Sloveno"
 
-#, fuzzy
 msgctxt "model:ir.lang,name:lang_zh_CN"
-msgid "中国(简体)"
-msgstr " "
+msgid "Chinese Simplified"
+msgstr ""
 
 msgctxt "model:ir.model,name:"
 msgid "Model"
@@ -3367,10 +3359,6 @@ msgctxt "model:ir.note.read,name:"
 msgid "Note Read"
 msgstr "leggere la nota"
 
-msgctxt "model:ir.property,name:"
-msgid "Property"
-msgstr "Proprietà"
-
 msgctxt "model:ir.rule,name:"
 msgid "Rule"
 msgstr "Regola"
@@ -3551,14 +3539,6 @@ msgctxt "model:ir.ui.menu,name:menu_note_form"
 msgid "Notes"
 msgstr "Note"
 
-msgctxt "model:ir.ui.menu,name:menu_property_form"
-msgid "Properties"
-msgstr "Proprietà"
-
-msgctxt "model:ir.ui.menu,name:menu_property_form_default"
-msgid "Default Properties"
-msgstr "Proprietà Predefinite"
-
 msgctxt "model:ir.ui.menu,name:menu_rule_group_form"
 msgid "Record Rules"
 msgstr "Regole Record"
diff --git a/trytond/ir/locale/ja_JP.po b/trytond/ir/locale/ja_JP.po
index 2f0a980..4093430 100644
--- a/trytond/ir/locale/ja_JP.po
+++ b/trytond/ir/locale/ja_JP.po
@@ -403,6 +403,10 @@ msgctxt "field:ir.action.act_window,context:"
 msgid "Context Value"
 msgstr ""
 
+msgctxt "field:ir.action.act_window,context_domain:"
+msgid "Context Domain"
+msgstr ""
+
 msgctxt "field:ir.action.act_window,context_model:"
 msgid "Context Model"
 msgstr ""
@@ -679,6 +683,10 @@ msgctxt "field:ir.action.report,id:"
 msgid "ID"
 msgstr ""
 
+msgctxt "field:ir.action.report,is_custom:"
+msgid "Is Custom"
+msgstr ""
+
 msgctxt "field:ir.action.report,keywords:"
 msgid "Keywords"
 msgstr ""
@@ -1901,43 +1909,6 @@ msgctxt "field:ir.note.read,write_uid:"
 msgid "Write User"
 msgstr ""
 
-msgctxt "field:ir.property,create_date:"
-msgid "Create Date"
-msgstr ""
-
-msgctxt "field:ir.property,create_uid:"
-msgid "Create User"
-msgstr ""
-
-#, fuzzy
-msgctxt "field:ir.property,field:"
-msgid "Field"
-msgstr "Fields"
-
-msgctxt "field:ir.property,id:"
-msgid "ID"
-msgstr ""
-
-msgctxt "field:ir.property,rec_name:"
-msgid "Name"
-msgstr ""
-
-msgctxt "field:ir.property,res:"
-msgid "Resource"
-msgstr ""
-
-msgctxt "field:ir.property,value:"
-msgid "Value"
-msgstr ""
-
-msgctxt "field:ir.property,write_date:"
-msgid "Write Date"
-msgstr ""
-
-msgctxt "field:ir.property,write_uid:"
-msgid "Write User"
-msgstr ""
-
 msgctxt "field:ir.rule,create_date:"
 msgid "Create Date"
 msgstr ""
@@ -2870,6 +2841,10 @@ msgctxt "field:ir.ui.view_tree_width,write_uid:"
 msgid "Write User"
 msgstr ""
 
+msgctxt "help:ir.action.act_window,context_domain:"
+msgid "Part of the domain that will be evaluated on each refresh"
+msgstr ""
+
 msgctxt "help:ir.action.act_window,limit:"
 msgid "Default limit for the list view"
 msgstr ""
@@ -3100,14 +3075,6 @@ msgctxt "model:ir.action,name:act_note_form"
 msgid "Notes"
 msgstr "Notes"
 
-msgctxt "model:ir.action,name:act_property_form"
-msgid "Properties"
-msgstr "Properties"
-
-msgctxt "model:ir.action,name:act_property_form_default"
-msgid "Default Properties"
-msgstr "Default Properties"
-
 msgctxt "model:ir.action,name:act_rule_group_form"
 msgid "Record Rules"
 msgstr "Record Rules"
@@ -3137,6 +3104,11 @@ msgid "Translations"
 msgstr "Translations"
 
 #, fuzzy
+msgctxt "model:ir.action,name:act_translation_report"
+msgid "Translations"
+msgstr "Translations"
+
+#, fuzzy
 msgctxt "model:ir.action,name:act_translation_set"
 msgid "Set Translations"
 msgstr "Set Translations"
@@ -3181,6 +3153,11 @@ msgctxt "model:ir.action,name:report_model_workflow_graph"
 msgid "Workflow Graph"
 msgstr "Workflow Graph"
 
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_translation_report"
+msgid "Translations"
+msgstr "Translations"
+
 msgctxt "model:ir.action.act_window,name:"
 msgid "Action act window"
 msgstr ""
@@ -3199,6 +3176,17 @@ msgctxt ""
 msgid "Out of Sync"
 msgstr "Out of Sync"
 
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_translation_form_domain_local"
+msgid "Local"
+msgstr ""
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_translation_form_domain_module"
+msgid "Modules"
+msgstr "Modules"
+
 msgctxt "model:ir.action.act_window.view,name:"
 msgid "Action act window view"
 msgstr ""
@@ -3296,8 +3284,8 @@ msgid "Italian"
 msgstr "Italian"
 
 msgctxt "model:ir.lang,name:lang_lo"
-msgid "ລາວ"
-msgstr "ລາວ"
+msgid "Lao"
+msgstr ""
 
 msgctxt "model:ir.lang,name:lang_lt"
 msgid "Lithuanian"
@@ -3307,6 +3295,10 @@ msgctxt "model:ir.lang,name:lang_nl"
 msgid "Dutch"
 msgstr "Dutch"
 
+msgctxt "model:ir.lang,name:lang_pl"
+msgid "Polish"
+msgstr ""
+
 msgctxt "model:ir.lang,name:lang_pt_BR"
 msgid "Portuguese (Brazil)"
 msgstr "Portuguese (Brazil)"
@@ -3320,8 +3312,8 @@ msgid "Slovenian"
 msgstr "Slovenian"
 
 msgctxt "model:ir.lang,name:lang_zh_CN"
-msgid "中国(简体)"
-msgstr "中国(简体)"
+msgid "Chinese Simplified"
+msgstr ""
 
 #, fuzzy
 msgctxt "model:ir.model,name:"
@@ -3407,10 +3399,6 @@ msgctxt "model:ir.note.read,name:"
 msgid "Note Read"
 msgstr ""
 
-msgctxt "model:ir.property,name:"
-msgid "Property"
-msgstr ""
-
 msgctxt "model:ir.rule,name:"
 msgid "Rule"
 msgstr ""
@@ -3604,14 +3592,6 @@ msgctxt "model:ir.ui.menu,name:menu_note_form"
 msgid "Notes"
 msgstr "Notes"
 
-msgctxt "model:ir.ui.menu,name:menu_property_form"
-msgid "Properties"
-msgstr "Properties"
-
-msgctxt "model:ir.ui.menu,name:menu_property_form_default"
-msgid "Default Properties"
-msgstr "Default Properties"
-
 msgctxt "model:ir.ui.menu,name:menu_rule_group_form"
 msgid "Record Rules"
 msgstr "Record Rules"
diff --git a/trytond/ir/locale/lo.po b/trytond/ir/locale/lo.po
index f763465..cc5b8c8 100644
--- a/trytond/ir/locale/lo.po
+++ b/trytond/ir/locale/lo.po
@@ -396,6 +396,10 @@ msgctxt "field:ir.action.act_window,context:"
 msgid "Context Value"
 msgstr ""
 
+msgctxt "field:ir.action.act_window,context_domain:"
+msgid "Context Domain"
+msgstr ""
+
 msgctxt "field:ir.action.act_window,context_model:"
 msgid "Context Model"
 msgstr ""
@@ -708,6 +712,10 @@ msgctxt "field:ir.action.report,id:"
 msgid "ID"
 msgstr "ເລດລຳດັບ"
 
+msgctxt "field:ir.action.report,is_custom:"
+msgid "Is Custom"
+msgstr ""
+
 #, fuzzy
 msgctxt "field:ir.action.report,keywords:"
 msgid "Keywords"
@@ -2112,50 +2120,6 @@ msgid "Write User"
 msgstr "ສ້າງຜູ້ໃຊ້"
 
 #, fuzzy
-msgctxt "field:ir.property,create_date:"
-msgid "Create Date"
-msgstr "ສ້າງວັນທີ"
-
-#, fuzzy
-msgctxt "field:ir.property,create_uid:"
-msgid "Create User"
-msgstr "ສ້າງຜູ້ໃຊ້ງານ"
-
-#, fuzzy
-msgctxt "field:ir.property,field:"
-msgid "Field"
-msgstr "ຟິນລ໌"
-
-#, fuzzy
-msgctxt "field:ir.property,id:"
-msgid "ID"
-msgstr "ເລດລຳດັບ"
-
-#, fuzzy
-msgctxt "field:ir.property,rec_name:"
-msgid "Name"
-msgstr "ຊື່"
-
-msgctxt "field:ir.property,res:"
-msgid "Resource"
-msgstr ""
-
-#, fuzzy
-msgctxt "field:ir.property,value:"
-msgid "Value"
-msgstr "ໝາຍເລກ"
-
-#, fuzzy
-msgctxt "field:ir.property,write_date:"
-msgid "Write Date"
-msgstr "ວັນທີບັນທຶກ"
-
-#, fuzzy
-msgctxt "field:ir.property,write_uid:"
-msgid "Write User"
-msgstr "ສ້າງຜູ້ໃຊ້"
-
-#, fuzzy
 msgctxt "field:ir.rule,create_date:"
 msgid "Create Date"
 msgstr "ສ້າງວັນທີ"
@@ -3200,6 +3164,10 @@ msgctxt "field:ir.ui.view_tree_width,write_uid:"
 msgid "Write User"
 msgstr "ສ້າງຜູ້ໃຊ້"
 
+msgctxt "help:ir.action.act_window,context_domain:"
+msgid "Part of the domain that will be evaluated on each refresh"
+msgstr ""
+
 msgctxt "help:ir.action.act_window,limit:"
 msgid "Default limit for the list view"
 msgstr ""
@@ -3440,14 +3408,6 @@ msgctxt "model:ir.action,name:act_note_form"
 msgid "Notes"
 msgstr "ໝາຍເຫດ"
 
-msgctxt "model:ir.action,name:act_property_form"
-msgid "Properties"
-msgstr ""
-
-msgctxt "model:ir.action,name:act_property_form_default"
-msgid "Default Properties"
-msgstr ""
-
 msgctxt "model:ir.action,name:act_rule_group_form"
 msgid "Record Rules"
 msgstr ""
@@ -3480,6 +3440,11 @@ msgid "Translations"
 msgstr "ລ້າງການແປ"
 
 #, fuzzy
+msgctxt "model:ir.action,name:act_translation_report"
+msgid "Translations"
+msgstr "ລ້າງການແປ"
+
+#, fuzzy
 msgctxt "model:ir.action,name:act_translation_set"
 msgid "Set Translations"
 msgstr "ລ້າງການແປ"
@@ -3525,6 +3490,11 @@ msgctxt "model:ir.action,name:report_model_workflow_graph"
 msgid "Workflow Graph"
 msgstr ""
 
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_translation_report"
+msgid "Translations"
+msgstr "ລ້າງການແປ"
+
 msgctxt "model:ir.action.act_window,name:"
 msgid "Action act window"
 msgstr ""
@@ -3544,6 +3514,16 @@ msgctxt ""
 msgid "Out of Sync"
 msgstr ""
 
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_translation_form_domain_local"
+msgid "Local"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_translation_form_domain_module"
+msgid "Modules"
+msgstr ""
+
 msgctxt "model:ir.action.act_window.view,name:"
 msgid "Action act window view"
 msgstr ""
@@ -3641,7 +3621,7 @@ msgid "Italian"
 msgstr ""
 
 msgctxt "model:ir.lang,name:lang_lo"
-msgid "ລາວ"
+msgid "Lao"
 msgstr ""
 
 msgctxt "model:ir.lang,name:lang_lt"
@@ -3652,6 +3632,10 @@ msgctxt "model:ir.lang,name:lang_nl"
 msgid "Dutch"
 msgstr ""
 
+msgctxt "model:ir.lang,name:lang_pl"
+msgid "Polish"
+msgstr ""
+
 msgctxt "model:ir.lang,name:lang_pt_BR"
 msgid "Portuguese (Brazil)"
 msgstr ""
@@ -3665,7 +3649,7 @@ msgid "Slovenian"
 msgstr ""
 
 msgctxt "model:ir.lang,name:lang_zh_CN"
-msgid "中国(简体)"
+msgid "Chinese Simplified"
 msgstr ""
 
 msgctxt "model:ir.model,name:"
@@ -3749,10 +3733,6 @@ msgctxt "model:ir.note.read,name:"
 msgid "Note Read"
 msgstr ""
 
-msgctxt "model:ir.property,name:"
-msgid "Property"
-msgstr ""
-
 #, fuzzy
 msgctxt "model:ir.rule,name:"
 msgid "Rule"
@@ -3954,14 +3934,6 @@ msgctxt "model:ir.ui.menu,name:menu_note_form"
 msgid "Notes"
 msgstr "ໝາຍເຫດ"
 
-msgctxt "model:ir.ui.menu,name:menu_property_form"
-msgid "Properties"
-msgstr ""
-
-msgctxt "model:ir.ui.menu,name:menu_property_form_default"
-msgid "Default Properties"
-msgstr ""
-
 msgctxt "model:ir.ui.menu,name:menu_rule_group_form"
 msgid "Record Rules"
 msgstr ""
diff --git a/trytond/ir/locale/lt.po b/trytond/ir/locale/lt.po
index f5dc919..231d454 100644
--- a/trytond/ir/locale/lt.po
+++ b/trytond/ir/locale/lt.po
@@ -384,6 +384,10 @@ msgctxt "field:ir.action.act_window,context:"
 msgid "Context Value"
 msgstr ""
 
+msgctxt "field:ir.action.act_window,context_domain:"
+msgid "Context Domain"
+msgstr ""
+
 msgctxt "field:ir.action.act_window,context_model:"
 msgid "Context Model"
 msgstr ""
@@ -654,6 +658,10 @@ msgctxt "field:ir.action.report,id:"
 msgid "ID"
 msgstr ""
 
+msgctxt "field:ir.action.report,is_custom:"
+msgid "Is Custom"
+msgstr ""
+
 msgctxt "field:ir.action.report,keywords:"
 msgid "Keywords"
 msgstr ""
@@ -1883,43 +1891,6 @@ msgctxt "field:ir.note.read,write_uid:"
 msgid "Write User"
 msgstr ""
 
-msgctxt "field:ir.property,create_date:"
-msgid "Create Date"
-msgstr ""
-
-msgctxt "field:ir.property,create_uid:"
-msgid "Create User"
-msgstr ""
-
-msgctxt "field:ir.property,field:"
-msgid "Field"
-msgstr ""
-
-msgctxt "field:ir.property,id:"
-msgid "ID"
-msgstr ""
-
-#, fuzzy
-msgctxt "field:ir.property,rec_name:"
-msgid "Name"
-msgstr "Namu"
-
-msgctxt "field:ir.property,res:"
-msgid "Resource"
-msgstr ""
-
-msgctxt "field:ir.property,value:"
-msgid "Value"
-msgstr ""
-
-msgctxt "field:ir.property,write_date:"
-msgid "Write Date"
-msgstr ""
-
-msgctxt "field:ir.property,write_uid:"
-msgid "Write User"
-msgstr ""
-
 msgctxt "field:ir.rule,create_date:"
 msgid "Create Date"
 msgstr ""
@@ -2842,6 +2813,10 @@ msgctxt "field:ir.ui.view_tree_width,write_uid:"
 msgid "Write User"
 msgstr ""
 
+msgctxt "help:ir.action.act_window,context_domain:"
+msgid "Part of the domain that will be evaluated on each refresh"
+msgstr ""
+
 msgctxt "help:ir.action.act_window,limit:"
 msgid "Default limit for the list view"
 msgstr ""
@@ -3070,14 +3045,6 @@ msgctxt "model:ir.action,name:act_note_form"
 msgid "Notes"
 msgstr ""
 
-msgctxt "model:ir.action,name:act_property_form"
-msgid "Properties"
-msgstr ""
-
-msgctxt "model:ir.action,name:act_property_form_default"
-msgid "Default Properties"
-msgstr ""
-
 msgctxt "model:ir.action,name:act_rule_group_form"
 msgid "Record Rules"
 msgstr ""
@@ -3106,6 +3073,10 @@ msgctxt "model:ir.action,name:act_translation_form"
 msgid "Translations"
 msgstr ""
 
+msgctxt "model:ir.action,name:act_translation_report"
+msgid "Translations"
+msgstr ""
+
 msgctxt "model:ir.action,name:act_translation_set"
 msgid "Set Translations"
 msgstr ""
@@ -3150,6 +3121,10 @@ msgctxt "model:ir.action,name:report_model_workflow_graph"
 msgid "Workflow Graph"
 msgstr ""
 
+msgctxt "model:ir.action,name:wizard_translation_report"
+msgid "Translations"
+msgstr ""
+
 msgctxt "model:ir.action.act_window,name:"
 msgid "Action act window"
 msgstr ""
@@ -3168,6 +3143,16 @@ msgctxt ""
 msgid "Out of Sync"
 msgstr ""
 
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_translation_form_domain_local"
+msgid "Local"
+msgstr ""
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_translation_form_domain_module"
+msgid "Modules"
+msgstr ""
+
 msgctxt "model:ir.action.act_window.view,name:"
 msgid "Action act window view"
 msgstr ""
@@ -3261,7 +3246,7 @@ msgid "Italian"
 msgstr ""
 
 msgctxt "model:ir.lang,name:lang_lo"
-msgid "ລາວ"
+msgid "Lao"
 msgstr ""
 
 msgctxt "model:ir.lang,name:lang_lt"
@@ -3272,6 +3257,10 @@ msgctxt "model:ir.lang,name:lang_nl"
 msgid "Dutch"
 msgstr ""
 
+msgctxt "model:ir.lang,name:lang_pl"
+msgid "Polish"
+msgstr ""
+
 msgctxt "model:ir.lang,name:lang_pt_BR"
 msgid "Portuguese (Brazil)"
 msgstr ""
@@ -3285,7 +3274,7 @@ msgid "Slovenian"
 msgstr ""
 
 msgctxt "model:ir.lang,name:lang_zh_CN"
-msgid "中国(简体)"
+msgid "Chinese Simplified"
 msgstr ""
 
 msgctxt "model:ir.model,name:"
@@ -3368,10 +3357,6 @@ msgctxt "model:ir.note.read,name:"
 msgid "Note Read"
 msgstr ""
 
-msgctxt "model:ir.property,name:"
-msgid "Property"
-msgstr ""
-
 msgctxt "model:ir.rule,name:"
 msgid "Rule"
 msgstr ""
@@ -3552,14 +3537,6 @@ msgctxt "model:ir.ui.menu,name:menu_note_form"
 msgid "Notes"
 msgstr ""
 
-msgctxt "model:ir.ui.menu,name:menu_property_form"
-msgid "Properties"
-msgstr ""
-
-msgctxt "model:ir.ui.menu,name:menu_property_form_default"
-msgid "Default Properties"
-msgstr ""
-
 msgctxt "model:ir.ui.menu,name:menu_rule_group_form"
 msgid "Record Rules"
 msgstr ""
diff --git a/trytond/ir/locale/nl.po b/trytond/ir/locale/nl.po
index 7f955f9..deac84f 100644
--- a/trytond/ir/locale/nl.po
+++ b/trytond/ir/locale/nl.po
@@ -402,6 +402,10 @@ msgctxt "field:ir.action.act_window,context:"
 msgid "Context Value"
 msgstr "Samenhang waarde"
 
+msgctxt "field:ir.action.act_window,context_domain:"
+msgid "Context Domain"
+msgstr ""
+
 msgctxt "field:ir.action.act_window,context_model:"
 msgid "Context Model"
 msgstr ""
@@ -707,6 +711,10 @@ msgctxt "field:ir.action.report,id:"
 msgid "ID"
 msgstr "ID"
 
+msgctxt "field:ir.action.report,is_custom:"
+msgid "Is Custom"
+msgstr ""
+
 #, fuzzy
 msgctxt "field:ir.action.report,keywords:"
 msgid "Keywords"
@@ -2076,47 +2084,6 @@ msgid "Write User"
 msgstr "Gebruiker"
 
 #, fuzzy
-msgctxt "field:ir.property,create_date:"
-msgid "Create Date"
-msgstr "Datum"
-
-#, fuzzy
-msgctxt "field:ir.property,create_uid:"
-msgid "Create User"
-msgstr "Gebruiker"
-
-msgctxt "field:ir.property,field:"
-msgid "Field"
-msgstr "Veld"
-
-#, fuzzy
-msgctxt "field:ir.property,id:"
-msgid "ID"
-msgstr "ID"
-
-msgctxt "field:ir.property,rec_name:"
-msgid "Name"
-msgstr "Naam"
-
-msgctxt "field:ir.property,res:"
-msgid "Resource"
-msgstr "Middel"
-
-msgctxt "field:ir.property,value:"
-msgid "Value"
-msgstr "Waarde"
-
-#, fuzzy
-msgctxt "field:ir.property,write_date:"
-msgid "Write Date"
-msgstr "Schrijfdatum"
-
-#, fuzzy
-msgctxt "field:ir.property,write_uid:"
-msgid "Write User"
-msgstr "Gebruiker"
-
-#, fuzzy
 msgctxt "field:ir.rule,create_date:"
 msgid "Create Date"
 msgstr "Datum"
@@ -3139,6 +3106,10 @@ msgctxt "field:ir.ui.view_tree_width,write_uid:"
 msgid "Write User"
 msgstr "Gebruiker"
 
+msgctxt "help:ir.action.act_window,context_domain:"
+msgid "Part of the domain that will be evaluated on each refresh"
+msgstr ""
+
 msgctxt "help:ir.action.act_window,limit:"
 msgid "Default limit for the list view"
 msgstr "Standaard begrenzing voor dit aanzicht"
@@ -3381,14 +3352,6 @@ msgctxt "model:ir.action,name:act_note_form"
 msgid "Notes"
 msgstr "Aantekeningen"
 
-msgctxt "model:ir.action,name:act_property_form"
-msgid "Properties"
-msgstr "Eigenschappen"
-
-msgctxt "model:ir.action,name:act_property_form_default"
-msgid "Default Properties"
-msgstr "Standaard eigenschappen"
-
 msgctxt "model:ir.action,name:act_rule_group_form"
 msgid "Record Rules"
 msgstr "Item regels"
@@ -3418,6 +3381,11 @@ msgid "Translations"
 msgstr "Vertalingen"
 
 #, fuzzy
+msgctxt "model:ir.action,name:act_translation_report"
+msgid "Translations"
+msgstr "Vertalingen"
+
+#, fuzzy
 msgctxt "model:ir.action,name:act_translation_set"
 msgid "Set Translations"
 msgstr "Vertalingen opschonen"
@@ -3462,6 +3430,11 @@ msgctxt "model:ir.action,name:report_model_workflow_graph"
 msgid "Workflow Graph"
 msgstr ""
 
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_translation_report"
+msgid "Translations"
+msgstr "Vertalingen"
+
 msgctxt "model:ir.action.act_window,name:"
 msgid "Action act window"
 msgstr "Actie uitvoerend scherm"
@@ -3481,6 +3454,17 @@ msgctxt ""
 msgid "Out of Sync"
 msgstr ""
 
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_translation_form_domain_local"
+msgid "Local"
+msgstr ""
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_translation_form_domain_module"
+msgid "Modules"
+msgstr "Modulen"
+
 msgctxt "model:ir.action.act_window.view,name:"
 msgid "Action act window view"
 msgstr "Actie uitvoerend schermaanzicht"
@@ -3576,7 +3560,7 @@ msgid "Italian"
 msgstr ""
 
 msgctxt "model:ir.lang,name:lang_lo"
-msgid "ລາວ"
+msgid "Lao"
 msgstr ""
 
 msgctxt "model:ir.lang,name:lang_lt"
@@ -3587,6 +3571,10 @@ msgctxt "model:ir.lang,name:lang_nl"
 msgid "Dutch"
 msgstr ""
 
+msgctxt "model:ir.lang,name:lang_pl"
+msgid "Polish"
+msgstr ""
+
 msgctxt "model:ir.lang,name:lang_pt_BR"
 msgid "Portuguese (Brazil)"
 msgstr ""
@@ -3600,7 +3588,7 @@ msgid "Slovenian"
 msgstr ""
 
 msgctxt "model:ir.lang,name:lang_zh_CN"
-msgid "中国(简体)"
+msgid "Chinese Simplified"
 msgstr ""
 
 msgctxt "model:ir.model,name:"
@@ -3689,10 +3677,6 @@ msgctxt "model:ir.note.read,name:"
 msgid "Note Read"
 msgstr ""
 
-msgctxt "model:ir.property,name:"
-msgid "Property"
-msgstr "Eigenschap"
-
 msgctxt "model:ir.rule,name:"
 msgid "Rule"
 msgstr "Regel"
@@ -3886,14 +3870,6 @@ msgctxt "model:ir.ui.menu,name:menu_note_form"
 msgid "Notes"
 msgstr "Aantekeningen"
 
-msgctxt "model:ir.ui.menu,name:menu_property_form"
-msgid "Properties"
-msgstr "Eigenschappen"
-
-msgctxt "model:ir.ui.menu,name:menu_property_form_default"
-msgid "Default Properties"
-msgstr "Standaard eigenschappen"
-
 msgctxt "model:ir.ui.menu,name:menu_rule_group_form"
 msgid "Record Rules"
 msgstr "Item regels"
diff --git a/trytond/ir/locale/pl.po b/trytond/ir/locale/pl.po
index 4057cd7..5c97662 100644
--- a/trytond/ir/locale/pl.po
+++ b/trytond/ir/locale/pl.po
@@ -7,72 +7,76 @@ msgid ""
 "You try to bypass an access rule.\n"
 "(Document type: %s)"
 msgstr ""
-"You try to bypass an access rule.\n"
-"(Document type: %s)"
+"Próbujesz ominąć regułę dostępu.\n"
+"(Typ dokumentu: %s)"
 
 msgctxt "error:delete_xml_record:"
 msgid "You are not allowed to delete this record."
-msgstr "You are not allowed to delete this record."
+msgstr "Nie masz uprawnień do usunięcia tego rekordu."
 
 msgctxt "error:digits_validation_record:"
 msgid ""
 "The number of digits \"%(digits)s\" of field \"%(field)s\" on \"%(value)s\" "
 "exceeds its limit."
 msgstr ""
-"The number of digits \"%(digits)s\" of field \"%(field)s\" on \"%(value)s\" "
-"exceeds its limit."
+"Wartość \"%(value)s\" w polu \"%(field)s\" przekracza dopuszczalną liczbę "
+"cyfr \"%(digits)s\"."
 
 msgctxt "error:domain_validation_record:"
 msgid ""
 "The value of the field \"%(field)s\" on \"%(model)s\" is not valid according"
 " to its domain."
 msgstr ""
-"The value of the field \"%(field)s\" on \"%(model)s\" is not valid according"
-" to its domain."
+"Wartość w polu \"%(field)s\" dla \"%(model)s\" jest nieprawidłowa względem "
+"swojej domeny."
 
 msgctxt "error:foreign_model_exist:"
 msgid ""
 "Could not delete the records because they are used on field \"%(field)s\" of"
 " \"%(model)s\"."
 msgstr ""
-"Could not delete the records because they are used on field \"%(field)s\" of"
-" \"%(model)s\"."
+"Nie możesz usunąć tych rekordów ponieważ użyte są w polu \"%(field)s\" "
+"modelu \"%(model)s\"."
 
 msgctxt "error:foreign_model_missing:"
 msgid "The value \"%(value)s\" of field \"%(field)s\" on \"%(model)s\" doesn't exist."
-msgstr "The value \"%(value)s\" of field \"%(field)s\" on \"%(model)s\" doesn't exist."
+msgstr "Wartość \"%(value)s\" pola \"%(field)s\" w modelu \"%(model)s\" nie istnieje."
 
 msgctxt "error:ir.action.act_window.domain:"
 msgid "Invalid domain or search criteria \"%(domain)s\" on action \"%(action)s\"."
 msgstr ""
+"Nieprawidłowa domena lub kryteria wyszukiwania \"%(domain)s\" dla akcji "
+"\"%(action)s\"."
 
 msgctxt "error:ir.action.act_window:"
 msgid "Invalid context \"%(context)s\" on action \"%(action)s\"."
-msgstr ""
+msgstr "Nieprawidłowy kontekst \"%(context)s\" dla akcji \"%(action)s\"."
 
 msgctxt "error:ir.action.act_window:"
 msgid "Invalid domain or search criteria \"%(domain)s\" on action \"%(action)s\"."
 msgstr ""
+"Nieprawidłowa domena lub kryteria wyszukiwania \"%(domain)s\" dla akcji "
+"\"%(action)s\"."
 
 msgctxt "error:ir.action.act_window:"
 msgid "Invalid view \"%(view)s\" for action \"%(action)s\"."
-msgstr ""
+msgstr "Nieprawidłowy widok \"%(view)s\" dla akcji \"%(action)s\"."
 
 msgctxt "error:ir.action.keyword:"
 msgid "Wrong wizard model in keyword action \"%s\"."
-msgstr ""
+msgstr "Nieprawidłowy model kreatora w akcji \"%s\" dot. słów kluczowych."
 
 msgctxt "error:ir.action.report:"
 msgid "Invalid email definition on report \"%s\"."
-msgstr ""
+msgstr "Nieprawidłowe określenie emaila w raporcie \"%s\"."
 
 msgctxt "error:ir.attachment:"
 msgid "The names of attachments must be unique by resource."
-msgstr ""
+msgstr "Nazwy załączników muszą być unikatowe względem zasobu."
 
 msgctxt "error:ir.cron:"
 msgid "Scheduled action failed"
-msgstr ""
+msgstr "Zaplanowana akcja nie powiodła się"
 
 msgctxt "error:ir.cron:"
 msgid ""
@@ -82,6 +86,11 @@ msgid ""
 "\n"
 "%s\n"
 msgstr ""
+"Następujące działanie nie można wykonać poprawnie: \"%s\"\n"
+"%s\n"
+" Traceback: \n"
+"\n"
+"%s\n"
 
 msgctxt "error:ir.lang:"
 msgid "Default language can not be deleted."
@@ -93,19 +102,19 @@ msgstr "Niewłaściwy format daty \"%(format)s\" w języku \"%(language)s\"."
 
 msgctxt "error:ir.lang:"
 msgid "Invalid grouping \"%(grouping)s\" on \"%(language)s\" language."
-msgstr ""
+msgstr "Niewłaściwe grupowanie \"%(grouping)s\" w języku \"%(language)s\"."
 
 msgctxt "error:ir.lang:"
 msgid "The default language must be translatable."
-msgstr ""
+msgstr "Domyślny język musi być przetłumaczalny."
 
 msgctxt "error:ir.lang:"
 msgid "decimal_point and thousands_sep must be different!"
-msgstr ""
+msgstr "decimal_point i thousands_sep muszą się różnić!"
 
 msgctxt "error:ir.model.access:"
 msgid "You can not create this kind of document! (%s)"
-msgstr "Nie możesz tworzyć dokumentu tego rodzaju! (%s)"
+msgstr "Nie możesz tworzyć tego rodzaju dokumentu! (%s)"
 
 msgctxt "error:ir.model.access:"
 msgid "You can not delete this document! (%s)"
@@ -124,14 +133,16 @@ msgid ""
 "Condition \"%(condition)s\" is not a valid PYSON expression on button rule "
 "\"%(rule)s\"."
 msgstr ""
+"Warunek \"%(condition)s\" nie jest poprawnym wyrażeniem PYSON dla przycisku "
+"w regule \"%s(rule)s\"."
 
 msgctxt "error:ir.model.button:"
 msgid "The button name in model must be unique!"
-msgstr ""
+msgstr "Nazwa przycisku w modelu musi być unikatowa!"
 
 msgctxt "error:ir.model.data:"
 msgid "The triple (fs_id, module, model) must be unique!"
-msgstr ""
+msgstr "Zbiór (fs_id, module, model) musi być unikatowy!"
 
 msgctxt "error:ir.model.field.access:"
 msgid "You can not read the field! (%s.%s)"
@@ -151,16 +162,17 @@ msgstr "Model musi być unikalny!"
 
 msgctxt "error:ir.module.dependency:"
 msgid "Dependency must be unique by module!"
-msgstr ""
+msgstr "Zależność musi być unikatowa odnośnie modułów!"
 
 msgctxt "error:ir.module:"
 msgid "Missing dependencies %s for module \"%s\""
-msgstr ""
+msgstr "Brak zależności %s dla modułu \"%s\""
 
 msgctxt "error:ir.module:"
 msgid ""
 "Some activated modules depend on the ones you are trying to deactivate:"
 msgstr ""
+"Niektóre aktywne moduły zależą od modułów, które próbujesz dezaktywować:"
 
 msgctxt "error:ir.module:"
 msgid "The name of the module must be unique!"
@@ -172,51 +184,51 @@ msgstr "Nie możesz usunąć modułu, który jest aktywny lub będzie aktywny"
 
 msgctxt "error:ir.rule.group:"
 msgid "Global and Default are mutually exclusive!"
-msgstr "Globalny i domyślny wzajemnie wykluczają się!"
+msgstr "Globalny i domyślny wzajemnie się wykluczają!"
 
 msgctxt "error:ir.rule:"
 msgid "Invalid domain in rule \"%s\"."
-msgstr ""
+msgstr "Nieprawidłowa domena w regule \"%s\"."
 
 msgctxt "error:ir.sequence.strict:"
 msgid "Invalid prefix \"%(prefix)s\" on sequence \"%(sequence)s\"."
-msgstr "Niewłaściwy prefiks \"%(prefix)s\" w kolejności \"%(sequence)s\"."
+msgstr "Niewłaściwy prefiks \"%(prefix)s\" w sekwencji \"%(sequence)s\"."
 
 msgctxt "error:ir.sequence.strict:"
 msgid "Invalid suffix \"%(suffix)s\" on sequence \"%(sequence)s\"."
-msgstr "Niewłaściwy sufiks \"%(suffix)s\" w kolejności \"%(sequence)s\"."
+msgstr "Niewłaściwy sufiks \"%(suffix)s\" w sekwencji \"%(sequence)s\"."
 
 msgctxt "error:ir.sequence.strict:"
 msgid "Last Timestamp cannot be in the future on sequence \"%s\"."
-msgstr ""
+msgstr "Ostatni znak czasu nie może wystąpić w przyszłości w sekwencji \"%s\"."
 
 msgctxt "error:ir.sequence.strict:"
 msgid "Missing sequence."
-msgstr "Brakująca kolejność."
+msgstr "Brakująca sekwencja."
 
 msgctxt "error:ir.sequence.strict:"
 msgid "Timestamp rounding should be greater than 0"
-msgstr ""
+msgstr "Zaokrąglenie znaku czasu musi być większe od 0"
 
 msgctxt "error:ir.sequence:"
 msgid "Invalid prefix \"%(prefix)s\" on sequence \"%(sequence)s\"."
-msgstr "Niewłaściwy prefiks \"%(prefix)s\" w kolejności \"%(sequence)s\"."
+msgstr "Niewłaściwy prefiks \"%(prefix)s\" w sekwencji \"%(sequence)s\"."
 
 msgctxt "error:ir.sequence:"
 msgid "Invalid suffix \"%(suffix)s\" on sequence \"%(sequence)s\"."
-msgstr "Niewłaściwy sufix \"%(suffix)s\" w kolejności \"%(sequence)s\"."
+msgstr "Niewłaściwy sufiks \"%(suffix)s\" w sekwencji \"%(sequence)s\"."
 
 msgctxt "error:ir.sequence:"
 msgid "Last Timestamp cannot be in the future on sequence \"%s\"."
-msgstr ""
+msgstr "Ostatni znak czasu nie może wystąpić w przyszłości w sekwencji \"%s\"."
 
 msgctxt "error:ir.sequence:"
 msgid "Missing sequence."
-msgstr "Brakująca kolejność."
+msgstr "Brakująca sekwencja."
 
 msgctxt "error:ir.sequence:"
 msgid "Timestamp rounding should be greater than 0"
-msgstr ""
+msgstr "Zaokrąglenie znaku czasu musi być większe od 0"
 
 msgctxt "error:ir.translation:"
 msgid "Translation must be unique"
@@ -227,20 +239,26 @@ msgid ""
 "You can not export translation %(name)s because it is an overridden "
 "translation by module %(overriding_module)s"
 msgstr ""
+"Nie możesz wyeksportować tłumaczenia %(name)s ponieważ jest ono nadpisane "
+"przez moduł %(overriding_module)s"
 
 msgctxt "error:ir.trigger:"
 msgid "\"On Time\" and others are mutually exclusive!"
-msgstr ""
+msgstr "\"Na czas\" i pozostałe wzajemnie wykluczają się!"
 
 msgctxt "error:ir.trigger:"
 msgid ""
 "Condition \"%(condition)s\" is not a valid PYSON expression on trigger "
 "\"%(trigger)s\"."
 msgstr ""
+"Warunek \"%(condition)s\" nie jest poprawnym wyrażeniem PYSON dla wyzwalacza"
+" \"%(trigger)s\"."
 
 msgctxt "error:ir.ui.menu:"
 msgid "\"%s\" is not a valid menu name because it is not allowed to contain \" / \"."
 msgstr ""
+"\"%s\" nie jest prawidłową nazwą menu ponieważ zawiera niedozwolony znak "
+"\"/\"."
 
 msgctxt "error:ir.ui.view:"
 msgid "Invalid XML for view \"%s\"."
@@ -251,58 +269,59 @@ msgid ""
 "You try to read records that don't exist anymore.\n"
 "(Document type: %s)"
 msgstr ""
-"You try to read records that don't exist anymore.\n"
-"(Document type: %s)"
+"Próbujesz czytać rekordy, które nie istnieją.\n"
+"(Typ dokumentu: %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 ""
-"Recursion error: Record \"%(rec_name)s\" with parent \"%(parent_rec_name)s\""
-" was configured as ancestor of itself."
+"Błąd rekurencji: Rekord \"%(rec_name)s\" z elementem nadrzędnym "
+"\"%(parent_rec_name)s\" został skonfigurowany jako element nadrzędny siebie "
+"samego."
 
 msgctxt "error:reference_syntax_error:"
 msgid "Syntax error for reference %r in %s"
-msgstr "Syntax error for reference %r in %s"
+msgstr "Błąd składni dla referencji %r w %s"
 
 msgctxt "error:relation_not_found:"
 msgid "Relation not found: %r in %s"
-msgstr "Relation not found: %r in %s"
+msgstr "Nie znaleziono relacji: %r w %s"
 
 msgctxt "error:required_field:"
 msgid "The field \"%(field)s\" on \"%(model)s\" is required."
-msgstr "The field \"%(field)s\" on \"%(model)s\" is required."
+msgstr "Pole \"%(field)s\" w modelu \"%(model)s\" jest wymagane."
 
 msgctxt "error:required_validation_record:"
 msgid "The field \"%(field)s\" on \"%(model)s\" is required."
-msgstr "The field \"%(field)s\" on \"%(model)s\" is required."
+msgstr "Pole \"%(field)s\" w modelu \"%(model)s\" jest wymagane."
 
 msgctxt "error:search_function_missing:"
 msgid "Missing search function on field \"%s\"."
-msgstr "Missing search function on field \"%s\"."
+msgstr "Brak funkcji wyszukiwania w polu \"%s\"."
 
 msgctxt "error:selection_validation_record:"
 msgid ""
 "The value \"%(value)s\" of field \"%(field)s\" on \"%(model)s\" is not in "
 "the selection."
 msgstr ""
-"The value \"%(value)s\" of field \"%(field)s\" on \"%(model)s\" is not in "
-"the selection."
+"Brak w elementach wyboru wartości \"%(value)s\" pola \"%(field)s\" dla "
+"modelu \"%(model)s\"."
 
 msgctxt "error:selection_value_notfound:"
 msgid "Value not in the selection for field \"%s\"."
-msgstr "Value not in the selection for field \"%s\"."
+msgstr "Brak wartości w elementach wyboru dla pola \"%s\"."
 
 msgctxt "error:size_validation_record:"
 msgid "The size \"%(size)s\" of the field \"%(field)s\" on \"%(model)s\" is too long."
-msgstr "The size \"%(size)s\" of the field \"%(field)s\" on \"(model)%s\" is too long."
+msgstr "Za duży rozmiar \"%(size)s\" pola \"%(field)s\" w modelu \"%(model)s\"."
 
 msgctxt "error:time_format_validation_record:"
 msgid "The time value \"%(value)s\" of field \"%(field)s\" on \"%(model)s\" is not valid."
 msgstr ""
-"The time value \"%(value)s\" of field \"%(field)s\" on \"%(model)s\" is not "
-"valid."
+"Niepoprawna wartość czasu \"%(value)s\" pola \"%(field)s\" w modelu "
+"\"%(model)s\". "
 
 msgctxt "error:too_many_relations_found:"
 msgid "Too many relations found: %r in %s"
@@ -313,2727 +332,2645 @@ msgid ""
 "You try to write on records that don't exist anymore.\n"
 "(Document type: %s)"
 msgstr ""
-"You try to write on records that don't exist anymore.\n"
-"(Document type: %s)"
+"Próbujesz zapisywać do rekordów, które już nie istnieją.\n"
+"(Typ dokumentu: %s)"
 
 msgctxt "error:write_xml_record:"
 msgid "You are not allowed to modify this record."
-msgstr "You are not allowed to modify this record."
+msgstr "Nie masz uprawnień do modyfikacji tego rekordu."
 
 msgctxt "error:xml_id_syntax_error:"
 msgid "Syntax error for XML id %r in %s"
-msgstr "Syntax error for XML id %r in %s"
+msgstr "Błąd składni dla XML id %r w %s"
 
 msgctxt "error:xml_record_desc:"
 msgid "This record is part of the base configuration."
-msgstr "This record is part of the base configuration."
+msgstr "Ten rekord jest częścią podstawowej konfiguracji."
 
 msgctxt "field:ir.action,active:"
 msgid "Active"
-msgstr ""
+msgstr "Aktywny"
 
 msgctxt "field:ir.action,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Data utworzenia"
 
 msgctxt "field:ir.action,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Utworzył"
 
 msgctxt "field:ir.action,groups:"
 msgid "Groups"
-msgstr ""
+msgstr "Grupy"
 
-#, fuzzy
 msgctxt "field:ir.action,icon:"
 msgid "Icon"
-msgstr "Icons"
+msgstr "Ikona"
 
 msgctxt "field:ir.action,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:ir.action,keywords:"
 msgid "Keywords"
-msgstr ""
+msgstr "Słowa kluczowe"
 
 msgctxt "field:ir.action,name:"
 msgid "Name"
-msgstr ""
+msgstr "Nazwa"
 
 msgctxt "field:ir.action,rec_name:"
 msgid "Name"
-msgstr ""
+msgstr "Nazwa"
 
 msgctxt "field:ir.action,type:"
 msgid "Type"
-msgstr ""
+msgstr "Typ"
 
 msgctxt "field:ir.action,usage:"
 msgid "Usage"
-msgstr ""
+msgstr "Użycie"
 
 msgctxt "field:ir.action,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Data zapisu"
 
 msgctxt "field:ir.action,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Zapisał"
 
 msgctxt "field:ir.action.act_window,act_window_domains:"
 msgid "Domains"
-msgstr ""
+msgstr "Domeny"
 
-#, fuzzy
 msgctxt "field:ir.action.act_window,act_window_views:"
 msgid "Views"
-msgstr "Views"
+msgstr "Widoki"
 
-#, fuzzy
 msgctxt "field:ir.action.act_window,action:"
 msgid "Action"
-msgstr "Actions"
+msgstr "Akcja"
 
 msgctxt "field:ir.action.act_window,active:"
 msgid "Active"
-msgstr ""
+msgstr "Aktywny"
 
 msgctxt "field:ir.action.act_window,context:"
 msgid "Context Value"
-msgstr ""
+msgstr "Wartość kontekstu"
+
+msgctxt "field:ir.action.act_window,context_domain:"
+msgid "Context Domain"
+msgstr "Domena kontekstu"
 
 msgctxt "field:ir.action.act_window,context_model:"
 msgid "Context Model"
-msgstr ""
+msgstr "Model kontekstu"
 
 msgctxt "field:ir.action.act_window,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Data utworzenia"
 
 msgctxt "field:ir.action.act_window,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Utworzył"
 
 msgctxt "field:ir.action.act_window,domain:"
 msgid "Domain Value"
-msgstr ""
+msgstr "Wartość domeny"
 
 msgctxt "field:ir.action.act_window,domains:"
 msgid "Domains"
-msgstr ""
+msgstr "Domeny"
 
 msgctxt "field:ir.action.act_window,groups:"
 msgid "Groups"
-msgstr ""
+msgstr "Grupy"
 
-#, fuzzy
 msgctxt "field:ir.action.act_window,icon:"
 msgid "Icon"
-msgstr "Icons"
+msgstr "Ikona"
 
 msgctxt "field:ir.action.act_window,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:ir.action.act_window,keywords:"
 msgid "Keywords"
-msgstr ""
+msgstr "Słowa kluczowe"
 
 msgctxt "field:ir.action.act_window,limit:"
 msgid "Limit"
-msgstr ""
+msgstr "Limit"
 
 msgctxt "field:ir.action.act_window,name:"
 msgid "Name"
-msgstr ""
+msgstr "Nazwa"
 
 msgctxt "field:ir.action.act_window,order:"
 msgid "Order Value"
-msgstr ""
+msgstr "Wartość porządkowa"
 
 msgctxt "field:ir.action.act_window,pyson_context:"
 msgid "PySON Context"
-msgstr ""
+msgstr "Kontekst PySON"
 
 msgctxt "field:ir.action.act_window,pyson_domain:"
 msgid "PySON Domain"
-msgstr ""
+msgstr "Domena PySON"
 
 msgctxt "field:ir.action.act_window,pyson_order:"
 msgid "PySON Order"
-msgstr ""
+msgstr "Porządek PySON"
 
 msgctxt "field:ir.action.act_window,pyson_search_value:"
 msgid "PySON Search Criteria"
-msgstr ""
+msgstr "Kryteria wyszukiwania PySON"
 
 msgctxt "field:ir.action.act_window,rec_name:"
 msgid "Name"
-msgstr ""
+msgstr "Nazwa"
 
-#, fuzzy
 msgctxt "field:ir.action.act_window,res_model:"
 msgid "Model"
-msgstr "Models"
+msgstr "Model"
 
 msgctxt "field:ir.action.act_window,search_value:"
 msgid "Search Criteria"
-msgstr ""
+msgstr "Kryteria wyszukiwania"
 
 msgctxt "field:ir.action.act_window,type:"
 msgid "Type"
-msgstr ""
+msgstr "Typ"
 
 msgctxt "field:ir.action.act_window,usage:"
 msgid "Usage"
-msgstr ""
+msgstr "Użycie"
 
-#, fuzzy
 msgctxt "field:ir.action.act_window,views:"
 msgid "Views"
-msgstr "Views"
+msgstr "Widoki"
 
 msgctxt "field:ir.action.act_window,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Data zapisu"
 
 msgctxt "field:ir.action.act_window,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Zapisał"
 
-#, fuzzy
 msgctxt "field:ir.action.act_window.domain,act_window:"
 msgid "Action"
-msgstr "Actions"
+msgstr "Akcja"
 
 msgctxt "field:ir.action.act_window.domain,active:"
 msgid "Active"
-msgstr ""
+msgstr "Aktywny"
 
 msgctxt "field:ir.action.act_window.domain,count:"
 msgid "Count"
-msgstr ""
+msgstr "Licznik"
 
 msgctxt "field:ir.action.act_window.domain,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Data utworzenia"
 
 msgctxt "field:ir.action.act_window.domain,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Utworzył"
 
 msgctxt "field:ir.action.act_window.domain,domain:"
 msgid "Domain"
-msgstr ""
+msgstr "Domena"
 
 msgctxt "field:ir.action.act_window.domain,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:ir.action.act_window.domain,name:"
 msgid "Name"
-msgstr ""
+msgstr "Nazwa"
 
 msgctxt "field:ir.action.act_window.domain,rec_name:"
 msgid "Name"
-msgstr ""
+msgstr "Nazwa"
 
-#, fuzzy
 msgctxt "field:ir.action.act_window.domain,sequence:"
 msgid "Sequence"
-msgstr "Sequences"
+msgstr "Sekwencja"
 
 msgctxt "field:ir.action.act_window.domain,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Data zapisu"
 
 msgctxt "field:ir.action.act_window.domain,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Zapisał"
 
-#, fuzzy
 msgctxt "field:ir.action.act_window.view,act_window:"
 msgid "Action"
-msgstr "Actions"
+msgstr "Akcja"
 
 msgctxt "field:ir.action.act_window.view,active:"
 msgid "Active"
-msgstr ""
+msgstr "Aktywny"
 
 msgctxt "field:ir.action.act_window.view,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Data utworzenia"
 
 msgctxt "field:ir.action.act_window.view,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Utworzył"
 
 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 ""
+msgstr "Nazwa"
 
-#, fuzzy
 msgctxt "field:ir.action.act_window.view,sequence:"
 msgid "Sequence"
-msgstr "Sequences"
+msgstr "Sekwencja"
 
-#, fuzzy
 msgctxt "field:ir.action.act_window.view,view:"
 msgid "View"
-msgstr "Views"
+msgstr "Widok"
 
 msgctxt "field:ir.action.act_window.view,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Data zapisu"
 
 msgctxt "field:ir.action.act_window.view,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Zapisał"
 
-#, fuzzy
 msgctxt "field:ir.action.keyword,action:"
 msgid "Action"
-msgstr "Actions"
+msgstr "Akcja"
 
 msgctxt "field:ir.action.keyword,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Data utworzenia"
 
 msgctxt "field:ir.action.keyword,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Utworzył"
 
 msgctxt "field:ir.action.keyword,groups:"
 msgid "Groups"
-msgstr ""
+msgstr "Grupy"
 
 msgctxt "field:ir.action.keyword,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:ir.action.keyword,keyword:"
 msgid "Keyword"
-msgstr ""
+msgstr "Słowo kluczowe"
 
-#, fuzzy
 msgctxt "field:ir.action.keyword,model:"
 msgid "Model"
-msgstr "Models"
+msgstr "Model"
 
 msgctxt "field:ir.action.keyword,rec_name:"
 msgid "Name"
-msgstr ""
+msgstr "Nazwa"
 
 msgctxt "field:ir.action.keyword,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Data zapisu"
 
 msgctxt "field:ir.action.keyword,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Zapisał"
 
-#, fuzzy
 msgctxt "field:ir.action.report,action:"
 msgid "Action"
-msgstr "Actions"
+msgstr "Akcja"
 
 msgctxt "field:ir.action.report,active:"
 msgid "Active"
-msgstr ""
+msgstr "Aktywny"
 
 msgctxt "field:ir.action.report,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Data utworzenia"
 
 msgctxt "field:ir.action.report,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Utworzył"
 
 msgctxt "field:ir.action.report,direct_print:"
 msgid "Direct Print"
-msgstr ""
+msgstr "Druk bezpośredni"
 
 msgctxt "field:ir.action.report,email:"
 msgid "Email"
-msgstr ""
+msgstr "E-mail"
 
 msgctxt "field:ir.action.report,extension:"
 msgid "Extension"
-msgstr ""
+msgstr "Rozszerzenie"
 
 msgctxt "field:ir.action.report,groups:"
 msgid "Groups"
-msgstr ""
+msgstr "Grupy"
 
-#, fuzzy
 msgctxt "field:ir.action.report,icon:"
 msgid "Icon"
-msgstr "Icons"
+msgstr "Ikona"
 
 msgctxt "field:ir.action.report,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
+
+msgctxt "field:ir.action.report,is_custom:"
+msgid "Is Custom"
+msgstr "Jest typowy"
 
 msgctxt "field:ir.action.report,keywords:"
 msgid "Keywords"
-msgstr ""
+msgstr "Słowa kluczowe"
 
-#, fuzzy
 msgctxt "field:ir.action.report,model:"
 msgid "Model"
-msgstr "Models"
+msgstr "Model"
 
-#, fuzzy
 msgctxt "field:ir.action.report,module:"
 msgid "Module"
-msgstr "Modules"
+msgstr "Moduł"
 
 msgctxt "field:ir.action.report,name:"
 msgid "Name"
-msgstr ""
+msgstr "Nazwa"
 
 msgctxt "field:ir.action.report,pyson_email:"
 msgid "PySON Email"
-msgstr ""
+msgstr "E-mail PySON"
 
 msgctxt "field:ir.action.report,rec_name:"
 msgid "Name"
-msgstr ""
+msgstr "Nazwa"
 
 msgctxt "field:ir.action.report,report:"
 msgid "Path"
-msgstr ""
+msgstr "Ścieżka"
 
 msgctxt "field:ir.action.report,report_content:"
 msgid "Content"
-msgstr ""
+msgstr "Treść"
 
 msgctxt "field:ir.action.report,report_content_custom:"
 msgid "Content"
-msgstr ""
+msgstr "Treść"
 
 msgctxt "field:ir.action.report,report_content_name:"
 msgid "Content Name"
-msgstr ""
+msgstr "Nazwa kontentu"
 
 msgctxt "field:ir.action.report,report_name:"
 msgid "Internal Name"
-msgstr ""
+msgstr "Nazwa wewnętrzna"
 
 msgctxt "field:ir.action.report,template_extension:"
 msgid "Template Extension"
-msgstr ""
+msgstr "Rozszerzenie szablonu"
 
 msgctxt "field:ir.action.report,type:"
 msgid "Type"
-msgstr ""
+msgstr "Typ"
 
 msgctxt "field:ir.action.report,usage:"
 msgid "Usage"
-msgstr ""
+msgstr "Użycie"
 
 msgctxt "field:ir.action.report,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Data zapisu"
 
 msgctxt "field:ir.action.report,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Zapisał"
 
-#, fuzzy
 msgctxt "field:ir.action.url,action:"
 msgid "Action"
-msgstr "Actions"
+msgstr "Akcja"
 
 msgctxt "field:ir.action.url,active:"
 msgid "Active"
-msgstr ""
+msgstr "Aktywny"
 
 msgctxt "field:ir.action.url,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Data utworzenia"
 
 msgctxt "field:ir.action.url,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Utworzył"
 
 msgctxt "field:ir.action.url,groups:"
 msgid "Groups"
-msgstr ""
+msgstr "Grupy"
 
-#, fuzzy
 msgctxt "field:ir.action.url,icon:"
 msgid "Icon"
-msgstr "Icons"
+msgstr "Ikona"
 
 msgctxt "field:ir.action.url,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:ir.action.url,keywords:"
 msgid "Keywords"
-msgstr ""
+msgstr "Słowa kluczowe"
 
 msgctxt "field:ir.action.url,name:"
 msgid "Name"
-msgstr ""
+msgstr "Nazwa"
 
 msgctxt "field:ir.action.url,rec_name:"
 msgid "Name"
-msgstr ""
+msgstr "Nazwa"
 
 msgctxt "field:ir.action.url,type:"
 msgid "Type"
-msgstr ""
+msgstr "Typ"
 
 msgctxt "field:ir.action.url,url:"
 msgid "Action Url"
-msgstr ""
+msgstr "Url akcji"
 
 msgctxt "field:ir.action.url,usage:"
 msgid "Usage"
-msgstr ""
+msgstr "Użycie"
 
 msgctxt "field:ir.action.url,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Data zapisu"
 
 msgctxt "field:ir.action.url,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Zapisał"
 
-#, fuzzy
 msgctxt "field:ir.action.wizard,action:"
 msgid "Action"
-msgstr "Actions"
+msgstr "Akcja"
 
 msgctxt "field:ir.action.wizard,active:"
 msgid "Active"
-msgstr ""
+msgstr "Aktywny"
 
 msgctxt "field:ir.action.wizard,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Data utworzenia"
 
 msgctxt "field:ir.action.wizard,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Utworzył"
 
 msgctxt "field:ir.action.wizard,email:"
 msgid "Email"
-msgstr ""
+msgstr "E-mail"
 
 msgctxt "field:ir.action.wizard,groups:"
 msgid "Groups"
-msgstr ""
+msgstr "Grupy"
 
-#, fuzzy
 msgctxt "field:ir.action.wizard,icon:"
 msgid "Icon"
-msgstr "Icons"
+msgstr "Ikona"
 
 msgctxt "field:ir.action.wizard,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:ir.action.wizard,keywords:"
 msgid "Keywords"
-msgstr ""
+msgstr "Słowa kluczowe"
 
-#, fuzzy
 msgctxt "field:ir.action.wizard,model:"
 msgid "Model"
-msgstr "Models"
+msgstr "Model"
 
 msgctxt "field:ir.action.wizard,name:"
 msgid "Name"
-msgstr ""
+msgstr "Nazwa"
 
 msgctxt "field:ir.action.wizard,rec_name:"
 msgid "Name"
-msgstr ""
+msgstr "Nazwa"
 
 msgctxt "field:ir.action.wizard,type:"
 msgid "Type"
-msgstr ""
+msgstr "Typ"
 
 msgctxt "field:ir.action.wizard,usage:"
 msgid "Usage"
-msgstr ""
+msgstr "Użycie"
 
 msgctxt "field:ir.action.wizard,window:"
 msgid "Window"
-msgstr ""
+msgstr "Okno"
 
 msgctxt "field:ir.action.wizard,wiz_name:"
 msgid "Wizard name"
-msgstr ""
+msgstr "Nazwa kreatora"
 
 msgctxt "field:ir.action.wizard,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Data zapisu"
 
 msgctxt "field:ir.action.wizard,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Zapisał"
 
 msgctxt "field:ir.attachment,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Data utworzenia"
 
 msgctxt "field:ir.attachment,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Utworzył"
 
-#, fuzzy
 msgctxt "field:ir.attachment,data:"
 msgid "Data"
-msgstr "Data"
+msgstr "Dane"
 
 msgctxt "field:ir.attachment,data_size:"
 msgid "Data size"
-msgstr ""
+msgstr "Rozmiar danych"
 
 msgctxt "field:ir.attachment,description:"
 msgid "Description"
-msgstr ""
+msgstr "Opis"
 
 msgctxt "field:ir.attachment,file_id:"
 msgid "File ID"
-msgstr ""
+msgstr "ID pliku"
 
 msgctxt "field:ir.attachment,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:ir.attachment,last_modification:"
 msgid "Last Modification"
-msgstr ""
+msgstr "Ostatnia modyfikacja"
 
 msgctxt "field:ir.attachment,last_user:"
 msgid "Last User"
-msgstr ""
+msgstr "Ostatnio używał"
 
 msgctxt "field:ir.attachment,link:"
 msgid "Link"
-msgstr ""
+msgstr "Odnośnik"
 
 msgctxt "field:ir.attachment,name:"
 msgid "Name"
-msgstr ""
+msgstr "Nazwa"
 
 msgctxt "field:ir.attachment,rec_name:"
 msgid "Name"
-msgstr ""
+msgstr "Nazwa"
 
 msgctxt "field:ir.attachment,resource:"
 msgid "Resource"
-msgstr ""
+msgstr "Zasób"
 
 msgctxt "field:ir.attachment,summary:"
 msgid "Summary"
-msgstr ""
+msgstr "Podsumowanie"
 
 msgctxt "field:ir.attachment,type:"
 msgid "Type"
-msgstr ""
+msgstr "Typ"
 
 msgctxt "field:ir.attachment,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Data zapisu"
 
 msgctxt "field:ir.attachment,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Zapisał"
 
 msgctxt "field:ir.cache,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Data utworzenia"
 
 msgctxt "field:ir.cache,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Utworzył"
 
 msgctxt "field:ir.cache,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:ir.cache,name:"
 msgid "Name"
-msgstr ""
+msgstr "Nazwa"
 
 msgctxt "field:ir.cache,rec_name:"
 msgid "Name"
-msgstr ""
+msgstr "Nazwa"
 
 msgctxt "field:ir.cache,timestamp:"
 msgid "Timestamp"
-msgstr ""
+msgstr "Znak czasu"
 
 msgctxt "field:ir.cache,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Data zapisu"
 
 msgctxt "field:ir.cache,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Zapisał"
 
 msgctxt "field:ir.configuration,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Data utworzenia"
 
 msgctxt "field:ir.configuration,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Utworzył"
 
 msgctxt "field:ir.configuration,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
-#, fuzzy
 msgctxt "field:ir.configuration,language:"
 msgid "language"
-msgstr "Languages"
+msgstr "język"
 
 msgctxt "field:ir.configuration,rec_name:"
 msgid "Name"
-msgstr ""
+msgstr "Nazwa"
 
 msgctxt "field:ir.configuration,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Data zapisu"
 
 msgctxt "field:ir.configuration,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Zapisał"
 
 msgctxt "field:ir.cron,active:"
 msgid "Active"
-msgstr ""
+msgstr "Aktywny"
 
 msgctxt "field:ir.cron,args:"
 msgid "Arguments"
-msgstr ""
+msgstr "Parametry"
 
 msgctxt "field:ir.cron,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Data utworzenia"
 
 msgctxt "field:ir.cron,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Utworzył"
 
 msgctxt "field:ir.cron,function:"
 msgid "Function"
-msgstr ""
+msgstr "Funkcja"
 
 msgctxt "field:ir.cron,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:ir.cron,interval_number:"
 msgid "Interval Number"
-msgstr ""
+msgstr "Interwał"
 
 msgctxt "field:ir.cron,interval_type:"
 msgid "Interval Unit"
-msgstr ""
+msgstr "Jednostka"
 
-#, fuzzy
 msgctxt "field:ir.cron,model:"
 msgid "Model"
-msgstr "Models"
+msgstr "Model"
 
 msgctxt "field:ir.cron,name:"
 msgid "Name"
-msgstr ""
+msgstr "Nazwa"
 
 msgctxt "field:ir.cron,next_call:"
 msgid "Next Call"
-msgstr ""
+msgstr "Kolejne wywołanie"
 
 msgctxt "field:ir.cron,number_calls:"
 msgid "Number of Calls"
-msgstr ""
+msgstr "Liczba wywołań"
 
 msgctxt "field:ir.cron,rec_name:"
 msgid "Name"
-msgstr ""
+msgstr "Nazwa"
 
 msgctxt "field:ir.cron,repeat_missed:"
 msgid "Repeat Missed"
-msgstr ""
+msgstr "Brak powtórzenia"
 
 msgctxt "field:ir.cron,request_user:"
 msgid "Request User"
-msgstr ""
+msgstr "Żądający"
 
 msgctxt "field:ir.cron,user:"
 msgid "Execution User"
-msgstr ""
+msgstr "Wykonujący"
 
 msgctxt "field:ir.cron,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Data zapisu"
 
 msgctxt "field:ir.cron,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Zapisał"
 
 msgctxt "field:ir.date,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:ir.export,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Data utworzenia"
 
 msgctxt "field:ir.export,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Utworzył"
 
-#, fuzzy
 msgctxt "field:ir.export,export_fields:"
 msgid "Fields"
-msgstr "Fields"
+msgstr "Pola"
 
 msgctxt "field:ir.export,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:ir.export,name:"
 msgid "Name"
-msgstr ""
+msgstr "Nazwa"
 
 msgctxt "field:ir.export,rec_name:"
 msgid "Name"
-msgstr ""
+msgstr "Nazwa"
 
 msgctxt "field:ir.export,resource:"
 msgid "Resource"
-msgstr ""
+msgstr "Zasób"
 
 msgctxt "field:ir.export,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Data zapisu"
 
 msgctxt "field:ir.export,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Zapisał"
 
 msgctxt "field:ir.export.line,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Data utworzenia"
 
 msgctxt "field:ir.export.line,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Utworzył"
 
-#, fuzzy
 msgctxt "field:ir.export.line,export:"
 msgid "Export"
-msgstr "Exports"
+msgstr "Wyeksportuj"
 
 msgctxt "field:ir.export.line,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:ir.export.line,name:"
 msgid "Name"
-msgstr ""
+msgstr "Nazwa"
 
 msgctxt "field:ir.export.line,rec_name:"
 msgid "Name"
-msgstr ""
+msgstr "Nazwa"
 
 msgctxt "field:ir.export.line,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Data zapisu"
 
 msgctxt "field:ir.export.line,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Zapisał"
 
 msgctxt "field:ir.lang,active:"
 msgid "Active"
-msgstr ""
+msgstr "Aktywny"
 
 msgctxt "field:ir.lang,code:"
 msgid "Code"
-msgstr ""
+msgstr "Kod"
 
 msgctxt "field:ir.lang,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Data utworzenia"
 
 msgctxt "field:ir.lang,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Utworzył"
 
-#, fuzzy
 msgctxt "field:ir.lang,date:"
 msgid "Date"
 msgstr "Data"
 
 msgctxt "field:ir.lang,decimal_point:"
 msgid "Decimal Separator"
-msgstr ""
+msgstr "Separator dziesiętny"
 
 msgctxt "field:ir.lang,direction:"
 msgid "Direction"
-msgstr ""
+msgstr "Kierunek"
 
 msgctxt "field:ir.lang,grouping:"
 msgid "Grouping"
-msgstr ""
+msgstr "Grupowanie"
 
 msgctxt "field:ir.lang,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:ir.lang,name:"
 msgid "Name"
-msgstr ""
+msgstr "Nazwa"
 
 msgctxt "field:ir.lang,rec_name:"
 msgid "Name"
-msgstr ""
+msgstr "Nazwa"
 
 msgctxt "field:ir.lang,thousands_sep:"
 msgid "Thousands Separator"
-msgstr ""
+msgstr "Separator tysięcy"
 
 msgctxt "field:ir.lang,translatable:"
 msgid "Translatable"
-msgstr ""
+msgstr "Przetłumaczalny"
 
 msgctxt "field:ir.lang,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Data zapisu"
 
 msgctxt "field:ir.lang,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Zapisał"
 
 msgctxt "field:ir.model,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Data utworzenia"
 
 msgctxt "field:ir.model,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Utworzył"
 
-#, fuzzy
 msgctxt "field:ir.model,fields:"
 msgid "Fields"
-msgstr "Fields"
+msgstr "Pola"
 
 msgctxt "field:ir.model,global_search_p:"
 msgid "Global Search"
-msgstr ""
+msgstr "Globalne przeszukiwanie"
 
 msgctxt "field:ir.model,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:ir.model,info:"
 msgid "Information"
-msgstr ""
+msgstr "Informacje"
 
 msgctxt "field:ir.model,model:"
 msgid "Model Name"
-msgstr ""
+msgstr "Nazwa modelu"
 
-#, fuzzy
 msgctxt "field:ir.model,module:"
 msgid "Module"
-msgstr "Modules"
+msgstr "Moduł"
 
 msgctxt "field:ir.model,name:"
 msgid "Model Description"
-msgstr ""
+msgstr "Opis modelu"
 
 msgctxt "field:ir.model,rec_name:"
 msgid "Name"
-msgstr ""
+msgstr "Nazwa"
 
 msgctxt "field:ir.model,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Data zapisu"
 
 msgctxt "field:ir.model,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Zapisał"
 
 msgctxt "field:ir.model.access,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Data utworzenia"
 
 msgctxt "field:ir.model.access,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Utworzył"
 
 msgctxt "field:ir.model.access,description:"
 msgid "Description"
-msgstr ""
+msgstr "Opis"
 
 msgctxt "field:ir.model.access,group:"
 msgid "Group"
-msgstr ""
+msgstr "Grupa"
 
 msgctxt "field:ir.model.access,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
-#, fuzzy
 msgctxt "field:ir.model.access,model:"
 msgid "Model"
-msgstr "Models"
+msgstr "Model"
 
 msgctxt "field:ir.model.access,perm_create:"
 msgid "Create Access"
-msgstr ""
+msgstr "Tworzenie"
 
 msgctxt "field:ir.model.access,perm_delete:"
 msgid "Delete Access"
-msgstr ""
+msgstr "Usuwanie"
 
 msgctxt "field:ir.model.access,perm_read:"
 msgid "Read Access"
-msgstr ""
+msgstr "Odczyt"
 
 msgctxt "field:ir.model.access,perm_write:"
 msgid "Write Access"
-msgstr ""
+msgstr "Zapis"
 
 msgctxt "field:ir.model.access,rec_name:"
 msgid "Name"
-msgstr ""
+msgstr "Nazwa"
 
 msgctxt "field:ir.model.access,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Data zapisu"
 
 msgctxt "field:ir.model.access,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Zapisał"
 
 msgctxt "field:ir.model.button,clicks:"
 msgid "Clicks"
-msgstr ""
+msgstr "Kliknięcia"
 
 msgctxt "field:ir.model.button,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Data utworzenia"
 
 msgctxt "field:ir.model.button,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Utworzył"
 
 msgctxt "field:ir.model.button,groups:"
 msgid "Groups"
-msgstr ""
+msgstr "Grupy"
 
 msgctxt "field:ir.model.button,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
-#, fuzzy
 msgctxt "field:ir.model.button,model:"
 msgid "Model"
-msgstr "Models"
+msgstr "Model"
 
 msgctxt "field:ir.model.button,name:"
 msgid "Name"
-msgstr ""
+msgstr "Nazwa"
 
 msgctxt "field:ir.model.button,rec_name:"
 msgid "Name"
-msgstr ""
+msgstr "Nazwa"
 
 msgctxt "field:ir.model.button,reset:"
 msgid "Reset"
-msgstr ""
+msgstr "Przywróć"
 
 msgctxt "field:ir.model.button,reset_by:"
 msgid "Reset by"
-msgstr ""
+msgstr "Przywróć według"
 
 msgctxt "field:ir.model.button,rules:"
 msgid "Rules"
-msgstr ""
+msgstr "Reguły"
 
 msgctxt "field:ir.model.button,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Data zapisu"
 
 msgctxt "field:ir.model.button,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Zapisał"
 
-#, fuzzy
 msgctxt "field:ir.model.button-button.reset,button:"
 msgid "Button"
-msgstr "Buttons"
+msgstr "Przyciski"
 
 msgctxt "field:ir.model.button-button.reset,button_ruled:"
 msgid "Button Ruled"
-msgstr ""
+msgstr "Przycisk z regułą"
 
 msgctxt "field:ir.model.button-button.reset,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Data utworzenia"
 
 msgctxt "field:ir.model.button-button.reset,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Utworzył"
 
 msgctxt "field:ir.model.button-button.reset,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:ir.model.button-button.reset,rec_name:"
 msgid "Name"
-msgstr ""
+msgstr "Nazwa"
 
 msgctxt "field:ir.model.button-button.reset,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Data zapisu"
 
 msgctxt "field:ir.model.button-button.reset,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Zapisał"
 
 msgctxt "field:ir.model.button.click,active:"
 msgid "Active"
-msgstr ""
+msgstr "Aktywny"
 
-#, fuzzy
 msgctxt "field:ir.model.button.click,button:"
 msgid "Button"
-msgstr "Buttons"
+msgstr "Przycisk"
 
 msgctxt "field:ir.model.button.click,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Data utworzenia"
 
 msgctxt "field:ir.model.button.click,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Utworzył"
 
 msgctxt "field:ir.model.button.click,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:ir.model.button.click,rec_name:"
 msgid "Name"
-msgstr ""
+msgstr "Nazwa"
 
 msgctxt "field:ir.model.button.click,record_id:"
 msgid "Record ID"
-msgstr ""
+msgstr "ID rekordu"
 
 msgctxt "field:ir.model.button.click,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Data zapisu"
 
 msgctxt "field:ir.model.button.click,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Zapisał"
 
-#, fuzzy
 msgctxt "field:ir.model.button.rule,button:"
 msgid "Button"
-msgstr "Buttons"
+msgstr "Przycisk"
 
 msgctxt "field:ir.model.button.rule,condition:"
 msgid "Condition"
-msgstr ""
+msgstr "Warunek"
 
 msgctxt "field:ir.model.button.rule,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Data utworzenia"
 
 msgctxt "field:ir.model.button.rule,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Utworzył"
 
 msgctxt "field:ir.model.button.rule,description:"
 msgid "Description"
-msgstr ""
+msgstr "Opis"
 
 msgctxt "field:ir.model.button.rule,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:ir.model.button.rule,number_user:"
 msgid "Number of User"
-msgstr ""
+msgstr "Liczba użytkownika"
 
 msgctxt "field:ir.model.button.rule,rec_name:"
 msgid "Name"
-msgstr ""
+msgstr "Nazwa"
 
 msgctxt "field:ir.model.button.rule,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Data zapisu"
 
 msgctxt "field:ir.model.button.rule,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Zapisał"
 
 msgctxt "field:ir.model.data,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Data utworzenia"
 
 msgctxt "field:ir.model.data,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Utworzył"
 
 msgctxt "field:ir.model.data,db_id:"
 msgid "Resource ID"
-msgstr ""
+msgstr "ID zasobu"
 
 msgctxt "field:ir.model.data,fs_id:"
 msgid "Identifier on File System"
-msgstr ""
+msgstr "Identyfikator w systemie plików"
 
 msgctxt "field:ir.model.data,fs_values:"
 msgid "Values on File System"
-msgstr ""
+msgstr "Wartości w systemie plików"
 
 msgctxt "field:ir.model.data,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
-#, fuzzy
 msgctxt "field:ir.model.data,model:"
 msgid "Model"
-msgstr "Models"
+msgstr "Model"
 
-#, fuzzy
 msgctxt "field:ir.model.data,module:"
 msgid "Module"
-msgstr "Modules"
+msgstr "Moduł"
 
 msgctxt "field:ir.model.data,noupdate:"
 msgid "No Update"
-msgstr ""
+msgstr "Brak aktualizacji"
 
-#, fuzzy
 msgctxt "field:ir.model.data,out_of_sync:"
 msgid "Out of Sync"
-msgstr "Out of Sync"
+msgstr "Niezsynchronizowany"
 
 msgctxt "field:ir.model.data,rec_name:"
 msgid "Name"
-msgstr ""
+msgstr "Nazwa"
 
 msgctxt "field:ir.model.data,values:"
 msgid "Values"
-msgstr ""
+msgstr "Wartości"
 
 msgctxt "field:ir.model.data,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Data zapisu"
 
 msgctxt "field:ir.model.data,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Zapisał"
 
 msgctxt "field:ir.model.field,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Data utworzenia"
 
 msgctxt "field:ir.model.field,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Utworzył"
 
 msgctxt "field:ir.model.field,field_description:"
 msgid "Field Description"
-msgstr ""
+msgstr "Opis pola"
 
 msgctxt "field:ir.model.field,groups:"
 msgid "Groups"
-msgstr ""
+msgstr "Grupy"
 
 msgctxt "field:ir.model.field,help:"
 msgid "Help"
-msgstr ""
+msgstr "Pomoc"
 
 msgctxt "field:ir.model.field,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
-#, fuzzy
 msgctxt "field:ir.model.field,model:"
 msgid "Model"
-msgstr "Models"
+msgstr "Model"
 
-#, fuzzy
 msgctxt "field:ir.model.field,module:"
 msgid "Module"
-msgstr "Modules"
+msgstr "Moduł"
 
 msgctxt "field:ir.model.field,name:"
 msgid "Name"
-msgstr ""
+msgstr "Nazwa"
 
 msgctxt "field:ir.model.field,rec_name:"
 msgid "Name"
-msgstr ""
+msgstr "Nazwa"
 
 msgctxt "field:ir.model.field,relation:"
 msgid "Model Relation"
-msgstr ""
+msgstr "Relacja modelu"
 
 msgctxt "field:ir.model.field,ttype:"
 msgid "Field Type"
-msgstr ""
+msgstr "Typ pola"
 
 msgctxt "field:ir.model.field,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Data zapisu"
 
 msgctxt "field:ir.model.field,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Zapisał"
 
 msgctxt "field:ir.model.field.access,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Data utworzenia"
 
 msgctxt "field:ir.model.field.access,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Utworzył"
 
 msgctxt "field:ir.model.field.access,description:"
 msgid "Description"
-msgstr ""
+msgstr "Opis"
 
-#, fuzzy
 msgctxt "field:ir.model.field.access,field:"
 msgid "Field"
-msgstr "Fields"
+msgstr "Pole"
 
 msgctxt "field:ir.model.field.access,group:"
 msgid "Group"
-msgstr ""
+msgstr "Grupa"
 
 msgctxt "field:ir.model.field.access,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:ir.model.field.access,perm_create:"
 msgid "Create Access"
-msgstr ""
+msgstr "Utworzenie"
 
 msgctxt "field:ir.model.field.access,perm_delete:"
 msgid "Delete Access"
-msgstr ""
+msgstr "Usunięcie"
 
 msgctxt "field:ir.model.field.access,perm_read:"
 msgid "Read Access"
-msgstr ""
+msgstr "Odczyt"
 
 msgctxt "field:ir.model.field.access,perm_write:"
 msgid "Write Access"
-msgstr ""
+msgstr "Zapis"
 
 msgctxt "field:ir.model.field.access,rec_name:"
 msgid "Name"
-msgstr ""
+msgstr "Nazwa"
 
 msgctxt "field:ir.model.field.access,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Data zapisu"
 
 msgctxt "field:ir.model.field.access,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Zapisał"
 
 msgctxt "field:ir.model.print_model_graph.start,filter:"
 msgid "Filter"
-msgstr ""
+msgstr "Filtr"
 
 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 "Poziom"
 
 msgctxt "field:ir.module,childs:"
 msgid "Childs"
-msgstr ""
+msgstr "Elementy potomne"
 
 msgctxt "field:ir.module,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Data utworzenia"
 
 msgctxt "field:ir.module,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Utworzył"
 
 msgctxt "field:ir.module,dependencies:"
 msgid "Dependencies"
-msgstr ""
+msgstr "Zależności"
 
 msgctxt "field:ir.module,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:ir.module,name:"
 msgid "Name"
-msgstr ""
+msgstr "Nazwa"
 
 msgctxt "field:ir.module,parents:"
 msgid "Parents"
-msgstr ""
+msgstr "Elementy nadrzędne"
 
 msgctxt "field:ir.module,rec_name:"
 msgid "Name"
-msgstr ""
+msgstr "Nazwa"
 
 msgctxt "field:ir.module,state:"
 msgid "State"
-msgstr ""
+msgstr "Stan"
 
 msgctxt "field:ir.module,version:"
 msgid "Version"
-msgstr ""
+msgstr "Wersja"
 
 msgctxt "field:ir.module,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Data zapisu"
 
 msgctxt "field:ir.module,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Zapisał"
 
 msgctxt "field:ir.module.activate_upgrade.done,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:ir.module.activate_upgrade.start,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:ir.module.activate_upgrade.start,module_info:"
 msgid "Modules to update"
-msgstr ""
+msgstr "Moduły przeznaczone do aktualizacji"
 
 msgctxt "field:ir.module.config_wizard.done,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:ir.module.config_wizard.first,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
-#, fuzzy
 msgctxt "field:ir.module.config_wizard.item,action:"
 msgid "Action"
-msgstr "Actions"
+msgstr "Akcja"
 
 msgctxt "field:ir.module.config_wizard.item,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Data utworzenia"
 
 msgctxt "field:ir.module.config_wizard.item,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Utworzył"
 
 msgctxt "field:ir.module.config_wizard.item,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:ir.module.config_wizard.item,rec_name:"
 msgid "Name"
-msgstr ""
+msgstr "Nazwa"
 
-#, fuzzy
 msgctxt "field:ir.module.config_wizard.item,sequence:"
 msgid "Sequence"
-msgstr "Sequences"
+msgstr "Sekwencja"
 
 msgctxt "field:ir.module.config_wizard.item,state:"
 msgid "State"
-msgstr ""
+msgstr "Stan"
 
 msgctxt "field:ir.module.config_wizard.item,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Data zapisu"
 
 msgctxt "field:ir.module.config_wizard.item,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Zapisał"
 
 msgctxt "field:ir.module.config_wizard.other,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:ir.module.config_wizard.other,percentage:"
 msgid "Percentage"
-msgstr ""
+msgstr "Odsetek"
 
 msgctxt "field:ir.module.dependency,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Data utworzenia"
 
 msgctxt "field:ir.module.dependency,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Utworzył"
 
 msgctxt "field:ir.module.dependency,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
-#, fuzzy
 msgctxt "field:ir.module.dependency,module:"
 msgid "Module"
-msgstr "Modules"
+msgstr "Moduł"
 
 msgctxt "field:ir.module.dependency,name:"
 msgid "Name"
-msgstr ""
+msgstr "Nazwa"
 
 msgctxt "field:ir.module.dependency,rec_name:"
 msgid "Name"
-msgstr ""
+msgstr "Nazwa"
 
 msgctxt "field:ir.module.dependency,state:"
 msgid "State"
-msgstr ""
+msgstr "Stan"
 
 msgctxt "field:ir.module.dependency,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Data zapisu"
 
 msgctxt "field:ir.module.dependency,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Zapisał"
 
 msgctxt "field:ir.note,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Data utworzenia"
 
 msgctxt "field:ir.note,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Utworzył"
 
 msgctxt "field:ir.note,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:ir.note,last_modification:"
 msgid "Last Modification"
-msgstr ""
+msgstr "Ostatnia modyfikacja"
 
 msgctxt "field:ir.note,last_user:"
 msgid "Last User"
-msgstr ""
+msgstr "Ostatnio używał"
 
 msgctxt "field:ir.note,message:"
 msgid "Message"
-msgstr ""
+msgstr "Wiadomość"
 
 msgctxt "field:ir.note,message_wrapped:"
 msgid "Message"
-msgstr ""
+msgstr "Wiadomość"
 
 msgctxt "field:ir.note,rec_name:"
 msgid "Name"
-msgstr ""
+msgstr "Nazwa"
 
 msgctxt "field:ir.note,resource:"
 msgid "Resource"
-msgstr ""
+msgstr "Zasób"
 
 msgctxt "field:ir.note,unread:"
 msgid "Unread"
-msgstr ""
+msgstr "Nieprzeczytane"
 
 msgctxt "field:ir.note,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Data zapisu"
 
 msgctxt "field:ir.note,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Zapisał"
 
 msgctxt "field:ir.note.read,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Data utworzenia"
 
 msgctxt "field:ir.note.read,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Utworzył"
 
 msgctxt "field:ir.note.read,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
-#, fuzzy
 msgctxt "field:ir.note.read,note:"
 msgid "Note"
-msgstr "Notes"
+msgstr "Notatka"
 
 msgctxt "field:ir.note.read,rec_name:"
 msgid "Name"
-msgstr ""
+msgstr "Nazwa"
 
 msgctxt "field:ir.note.read,user:"
 msgid "User"
-msgstr ""
+msgstr "Użytkownik"
 
 msgctxt "field:ir.note.read,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Data zapisu"
 
 msgctxt "field:ir.note.read,write_uid:"
 msgid "Write User"
-msgstr ""
-
-msgctxt "field:ir.property,create_date:"
-msgid "Create Date"
-msgstr ""
-
-msgctxt "field:ir.property,create_uid:"
-msgid "Create User"
-msgstr ""
-
-#, fuzzy
-msgctxt "field:ir.property,field:"
-msgid "Field"
-msgstr "Fields"
-
-msgctxt "field:ir.property,id:"
-msgid "ID"
-msgstr ""
-
-msgctxt "field:ir.property,rec_name:"
-msgid "Name"
-msgstr ""
-
-msgctxt "field:ir.property,res:"
-msgid "Resource"
-msgstr ""
-
-msgctxt "field:ir.property,value:"
-msgid "Value"
-msgstr ""
-
-msgctxt "field:ir.property,write_date:"
-msgid "Write Date"
-msgstr ""
-
-msgctxt "field:ir.property,write_uid:"
-msgid "Write User"
-msgstr ""
+msgstr "Zapisał"
 
 msgctxt "field:ir.rule,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Data utworzenia"
 
 msgctxt "field:ir.rule,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Utworzył"
 
 msgctxt "field:ir.rule,domain:"
 msgid "Domain"
-msgstr ""
+msgstr "Domena"
 
 msgctxt "field:ir.rule,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:ir.rule,rec_name:"
 msgid "Name"
-msgstr ""
+msgstr "Nazwa"
 
 msgctxt "field:ir.rule,rule_group:"
 msgid "Group"
-msgstr ""
+msgstr "Grupa"
 
 msgctxt "field:ir.rule,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Data zapisu"
 
 msgctxt "field:ir.rule,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Zapisał"
 
 msgctxt "field:ir.rule.group,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Data utworzenia"
 
 msgctxt "field:ir.rule.group,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Utworzył"
 
 msgctxt "field:ir.rule.group,default_p:"
 msgid "Default"
-msgstr ""
+msgstr "Domyślne"
 
 msgctxt "field:ir.rule.group,global_p:"
 msgid "Global"
-msgstr ""
+msgstr "Globalne"
 
 msgctxt "field:ir.rule.group,groups:"
 msgid "Groups"
-msgstr ""
+msgstr "Grupy"
 
 msgctxt "field:ir.rule.group,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
-#, fuzzy
 msgctxt "field:ir.rule.group,model:"
 msgid "Model"
-msgstr "Models"
+msgstr "Model"
 
 msgctxt "field:ir.rule.group,name:"
 msgid "Name"
-msgstr ""
+msgstr "Nazwa"
 
 msgctxt "field:ir.rule.group,perm_create:"
 msgid "Create Access"
-msgstr ""
+msgstr "Utworzenie"
 
 msgctxt "field:ir.rule.group,perm_delete:"
 msgid "Delete Access"
-msgstr ""
+msgstr "Usunięcie"
 
 msgctxt "field:ir.rule.group,perm_read:"
 msgid "Read Access"
-msgstr ""
+msgstr "Odczyt"
 
 msgctxt "field:ir.rule.group,perm_write:"
 msgid "Write Access"
-msgstr ""
+msgstr "Zapis"
 
 msgctxt "field:ir.rule.group,rec_name:"
 msgid "Name"
-msgstr ""
+msgstr "Nazwa"
 
 msgctxt "field:ir.rule.group,rules:"
 msgid "Tests"
-msgstr ""
+msgstr "Testy"
 
 msgctxt "field:ir.rule.group,users:"
 msgid "Users"
-msgstr ""
+msgstr "Użytkownicy"
 
 msgctxt "field:ir.rule.group,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Data zapisu"
 
 msgctxt "field:ir.rule.group,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Zapisał"
 
 msgctxt "field:ir.sequence,active:"
 msgid "Active"
-msgstr ""
+msgstr "Aktywna"
 
-#, fuzzy
 msgctxt "field:ir.sequence,code:"
 msgid "Sequence Code"
-msgstr "Sequence Types"
+msgstr "Kod sekwencji"
 
 msgctxt "field:ir.sequence,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Data utworzenia"
 
 msgctxt "field:ir.sequence,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Utworzył"
 
 msgctxt "field:ir.sequence,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:ir.sequence,last_timestamp:"
 msgid "Last Timestamp"
-msgstr ""
+msgstr "Ostatni znak czasu"
 
-#, fuzzy
 msgctxt "field:ir.sequence,name:"
 msgid "Sequence Name"
-msgstr "Sequence Types"
+msgstr "Nazwa sekwencji"
 
 msgctxt "field:ir.sequence,number_increment:"
 msgid "Increment Number"
-msgstr ""
+msgstr "Numer przyrostu"
 
 msgctxt "field:ir.sequence,number_next:"
 msgid "Next Number"
-msgstr ""
+msgstr "Kolejny numer"
 
 msgctxt "field:ir.sequence,number_next_internal:"
 msgid "Next Number"
-msgstr ""
+msgstr "Kolejny numer"
 
 msgctxt "field:ir.sequence,padding:"
 msgid "Number padding"
-msgstr ""
+msgstr "Dopełnienie numeru"
 
 msgctxt "field:ir.sequence,prefix:"
 msgid "Prefix"
-msgstr ""
+msgstr "Prefiks"
 
 msgctxt "field:ir.sequence,rec_name:"
 msgid "Name"
-msgstr ""
+msgstr "Nazwa"
 
 msgctxt "field:ir.sequence,suffix:"
 msgid "Suffix"
-msgstr ""
+msgstr "Sufiks"
 
 msgctxt "field:ir.sequence,timestamp_offset:"
 msgid "Timestamp Offset"
-msgstr ""
+msgstr "Offset znaku czasu"
 
 msgctxt "field:ir.sequence,timestamp_rounding:"
 msgid "Timestamp Rounding"
-msgstr ""
+msgstr "Zaokrąglenie znaku czasu"
 
 msgctxt "field:ir.sequence,type:"
 msgid "Type"
-msgstr ""
+msgstr "Typ"
 
 msgctxt "field:ir.sequence,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Data zapisu"
 
 msgctxt "field:ir.sequence,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Zapisał"
 
 msgctxt "field:ir.sequence.strict,active:"
 msgid "Active"
-msgstr ""
+msgstr "Aktywny"
 
-#, fuzzy
 msgctxt "field:ir.sequence.strict,code:"
 msgid "Sequence Code"
-msgstr "Sequence Types"
+msgstr "Kod sekwencji"
 
 msgctxt "field:ir.sequence.strict,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Data utworzenia"
 
 msgctxt "field:ir.sequence.strict,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Utworzył"
 
 msgctxt "field:ir.sequence.strict,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:ir.sequence.strict,last_timestamp:"
 msgid "Last Timestamp"
-msgstr ""
+msgstr "Ostatni znak czasu"
 
-#, fuzzy
 msgctxt "field:ir.sequence.strict,name:"
 msgid "Sequence Name"
-msgstr "Sequence Types"
+msgstr "Nazwa sekwencji"
 
 msgctxt "field:ir.sequence.strict,number_increment:"
 msgid "Increment Number"
-msgstr ""
+msgstr "Numer przyrostu"
 
 msgctxt "field:ir.sequence.strict,number_next:"
 msgid "Next Number"
-msgstr ""
+msgstr "Kolejny numer"
 
 msgctxt "field:ir.sequence.strict,number_next_internal:"
 msgid "Next Number"
-msgstr ""
+msgstr "Kolejny numer"
 
 msgctxt "field:ir.sequence.strict,padding:"
 msgid "Number padding"
-msgstr ""
+msgstr "Dopełnienie numeru"
 
 msgctxt "field:ir.sequence.strict,prefix:"
 msgid "Prefix"
-msgstr ""
+msgstr "Prefiks"
 
 msgctxt "field:ir.sequence.strict,rec_name:"
 msgid "Name"
-msgstr ""
+msgstr "Nazwa"
 
 msgctxt "field:ir.sequence.strict,suffix:"
 msgid "Suffix"
-msgstr ""
+msgstr "Sufiks"
 
 msgctxt "field:ir.sequence.strict,timestamp_offset:"
 msgid "Timestamp Offset"
-msgstr ""
+msgstr "Offset znaku czasu"
 
 msgctxt "field:ir.sequence.strict,timestamp_rounding:"
 msgid "Timestamp Rounding"
-msgstr ""
+msgstr "Zaokrąglenie znaku czasu"
 
 msgctxt "field:ir.sequence.strict,type:"
 msgid "Type"
-msgstr ""
+msgstr "Typ"
 
 msgctxt "field:ir.sequence.strict,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Data zapisu"
 
 msgctxt "field:ir.sequence.strict,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Zapisał"
 
-#, fuzzy
 msgctxt "field:ir.sequence.type,code:"
 msgid "Sequence Code"
-msgstr "Sequence Types"
+msgstr "Kod sekwencji"
 
 msgctxt "field:ir.sequence.type,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Data utworzenia"
 
 msgctxt "field:ir.sequence.type,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Utworzył"
 
 msgctxt "field:ir.sequence.type,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
-#, fuzzy
 msgctxt "field:ir.sequence.type,name:"
 msgid "Sequence Name"
-msgstr "Sequence Types"
+msgstr "Nazwa sekwencji"
 
 msgctxt "field:ir.sequence.type,rec_name:"
 msgid "Name"
-msgstr ""
+msgstr "Nazwa"
 
 msgctxt "field:ir.sequence.type,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Data zapisu"
 
 msgctxt "field:ir.sequence.type,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Zapisał"
 
 msgctxt "field:ir.session,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Data utworzenia"
 
 msgctxt "field:ir.session,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Utworzył"
 
 msgctxt "field:ir.session,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:ir.session,key:"
 msgid "Key"
-msgstr ""
+msgstr "Klucz"
 
 msgctxt "field:ir.session,rec_name:"
 msgid "Name"
-msgstr ""
+msgstr "Nazwa"
 
 msgctxt "field:ir.session,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Data zapisu"
 
 msgctxt "field:ir.session,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Zapisał"
 
 msgctxt "field:ir.session.wizard,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Data utworzenia"
 
 msgctxt "field:ir.session.wizard,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Utworzył"
 
-#, fuzzy
 msgctxt "field:ir.session.wizard,data:"
 msgid "Data"
-msgstr "Data"
+msgstr "Dane"
 
 msgctxt "field:ir.session.wizard,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:ir.session.wizard,rec_name:"
 msgid "Name"
-msgstr ""
+msgstr "Nazwa"
 
 msgctxt "field:ir.session.wizard,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Data zapisu"
 
 msgctxt "field:ir.session.wizard,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Zapisał"
 
 msgctxt "field:ir.translation,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Data utworzenia"
 
 msgctxt "field:ir.translation,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Utworzył"
 
 msgctxt "field:ir.translation,fuzzy:"
 msgid "Fuzzy"
-msgstr ""
+msgstr "Niepewne"
 
 msgctxt "field:ir.translation,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
-#, fuzzy
 msgctxt "field:ir.translation,lang:"
 msgid "Language"
-msgstr "Languages"
+msgstr "Język"
 
-#, fuzzy
 msgctxt "field:ir.translation,model:"
 msgid "Model"
-msgstr "Models"
+msgstr "Model"
 
-#, fuzzy
 msgctxt "field:ir.translation,module:"
 msgid "Module"
-msgstr "Modules"
+msgstr "Moduł"
 
 msgctxt "field:ir.translation,name:"
 msgid "Field Name"
-msgstr ""
+msgstr "Nazwa pola"
 
 msgctxt "field:ir.translation,overriding_module:"
 msgid "Overriding Module"
-msgstr ""
+msgstr "Nadpisany moduł"
 
 msgctxt "field:ir.translation,rec_name:"
 msgid "Name"
-msgstr ""
+msgstr "Nazwa"
 
 msgctxt "field:ir.translation,res_id:"
 msgid "Resource ID"
-msgstr ""
+msgstr "ID zasobu"
 
 msgctxt "field:ir.translation,src:"
 msgid "Source"
-msgstr ""
+msgstr "Źródło"
 
 msgctxt "field:ir.translation,src_md5:"
 msgid "Source MD5"
-msgstr ""
+msgstr "Źródło MD5"
 
 msgctxt "field:ir.translation,type:"
 msgid "Type"
-msgstr ""
+msgstr "Typ"
 
 msgctxt "field:ir.translation,value:"
 msgid "Translation Value"
-msgstr ""
+msgstr "Wartość tłumaczenia"
 
 msgctxt "field:ir.translation,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Data zapisu"
 
 msgctxt "field:ir.translation,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Zapisał"
 
 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 "Plik"
 
 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 "Languages"
+msgstr "Język"
 
-#, fuzzy
 msgctxt "field:ir.translation.export.start,module:"
 msgid "Module"
-msgstr "Modules"
+msgstr "Moduł"
 
 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 "Languages"
+msgstr "Język"
 
 msgctxt "field:ir.trigger,action_function:"
 msgid "Action Function"
-msgstr ""
+msgstr "Funkcja akcji"
 
 msgctxt "field:ir.trigger,action_model:"
 msgid "Action Model"
-msgstr ""
+msgstr "Model akcji"
 
 msgctxt "field:ir.trigger,active:"
 msgid "Active"
-msgstr ""
+msgstr "Aktywny"
 
 msgctxt "field:ir.trigger,condition:"
 msgid "Condition"
-msgstr ""
+msgstr "Warunek"
 
 msgctxt "field:ir.trigger,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Data utworzenia"
 
 msgctxt "field:ir.trigger,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Utworzył"
 
 msgctxt "field:ir.trigger,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:ir.trigger,limit_number:"
 msgid "Limit Number"
-msgstr ""
+msgstr "Wartość limitu"
 
 msgctxt "field:ir.trigger,minimum_time_delay:"
 msgid "Minimum Delay"
-msgstr ""
+msgstr "Minimalne opóźnienie"
 
-#, fuzzy
 msgctxt "field:ir.trigger,model:"
 msgid "Model"
-msgstr "Models"
+msgstr "Model"
 
 msgctxt "field:ir.trigger,name:"
 msgid "Name"
-msgstr ""
+msgstr "Nazwa"
 
 msgctxt "field:ir.trigger,on_create:"
 msgid "On Create"
-msgstr ""
+msgstr "Przy utworzeniu"
 
 msgctxt "field:ir.trigger,on_delete:"
 msgid "On Delete"
-msgstr ""
+msgstr "Przy usunięciu"
 
 msgctxt "field:ir.trigger,on_time:"
 msgid "On Time"
-msgstr ""
+msgstr "O czasie"
 
 msgctxt "field:ir.trigger,on_write:"
 msgid "On Write"
-msgstr ""
+msgstr "Przy zapisie"
 
 msgctxt "field:ir.trigger,rec_name:"
 msgid "Name"
-msgstr ""
+msgstr "Nazwa"
 
 msgctxt "field:ir.trigger,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Data zapisu"
 
 msgctxt "field:ir.trigger,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Zapisał"
 
 msgctxt "field:ir.trigger.log,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Data utworzenia"
 
 msgctxt "field:ir.trigger.log,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Utworzył"
 
 msgctxt "field:ir.trigger.log,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:ir.trigger.log,rec_name:"
 msgid "Name"
-msgstr ""
+msgstr "Nazwa"
 
 msgctxt "field:ir.trigger.log,record_id:"
 msgid "Record ID"
-msgstr ""
+msgstr "ID rekordu"
 
-#, fuzzy
 msgctxt "field:ir.trigger.log,trigger:"
 msgid "Trigger"
-msgstr "Triggers"
+msgstr "Wyzwalacz"
 
 msgctxt "field:ir.trigger.log,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Data zapisu"
 
 msgctxt "field:ir.trigger.log,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Zapisał"
 
 msgctxt "field:ir.ui.icon,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Data utworzenia"
 
 msgctxt "field:ir.ui.icon,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Utworzył"
 
-#, fuzzy
 msgctxt "field:ir.ui.icon,icon:"
 msgid "Icon"
-msgstr "Icons"
+msgstr "Ikona"
 
 msgctxt "field:ir.ui.icon,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
-#, fuzzy
 msgctxt "field:ir.ui.icon,module:"
 msgid "Module"
-msgstr "Modules"
+msgstr "Moduł"
 
 msgctxt "field:ir.ui.icon,name:"
 msgid "Name"
-msgstr ""
+msgstr "Nazwa"
 
 msgctxt "field:ir.ui.icon,path:"
 msgid "SVG Path"
-msgstr ""
+msgstr "Ścieżka SVG"
 
 msgctxt "field:ir.ui.icon,rec_name:"
 msgid "Name"
-msgstr ""
+msgstr "Nazwa"
 
-#, fuzzy
 msgctxt "field:ir.ui.icon,sequence:"
 msgid "Sequence"
-msgstr "Sequences"
+msgstr "Sekwencja"
 
 msgctxt "field:ir.ui.icon,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Data zapisu"
 
 msgctxt "field:ir.ui.icon,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Zapisał"
 
-#, fuzzy
 msgctxt "field:ir.ui.menu,action:"
 msgid "Action"
-msgstr "Actions"
+msgstr "Akcja"
 
 msgctxt "field:ir.ui.menu,action_keywords:"
 msgid "Action Keywords"
-msgstr ""
+msgstr "Słowa kluczowe akcji"
 
 msgctxt "field:ir.ui.menu,active:"
 msgid "Active"
-msgstr ""
+msgstr "Aktywny"
 
 msgctxt "field:ir.ui.menu,childs:"
 msgid "Children"
-msgstr ""
+msgstr "Elementy potomne"
 
 msgctxt "field:ir.ui.menu,complete_name:"
 msgid "Complete Name"
-msgstr ""
+msgstr "Pełna nazwa"
 
 msgctxt "field:ir.ui.menu,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Data utworzenia"
 
 msgctxt "field:ir.ui.menu,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Utworzył"
 
 msgctxt "field:ir.ui.menu,favorite:"
 msgid "Favorite"
-msgstr ""
+msgstr "Ulubione"
 
 msgctxt "field:ir.ui.menu,groups:"
 msgid "Groups"
-msgstr ""
+msgstr "Grupy"
 
-#, fuzzy
 msgctxt "field:ir.ui.menu,icon:"
 msgid "Icon"
-msgstr "Icons"
+msgstr "Ikona"
 
 msgctxt "field:ir.ui.menu,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
-#, fuzzy
 msgctxt "field:ir.ui.menu,name:"
 msgid "Menu"
 msgstr "Menu"
 
 msgctxt "field:ir.ui.menu,parent:"
 msgid "Parent Menu"
-msgstr ""
+msgstr "Menu nadrzędne"
 
 msgctxt "field:ir.ui.menu,rec_name:"
 msgid "Name"
-msgstr ""
+msgstr "Nazwa"
 
-#, fuzzy
 msgctxt "field:ir.ui.menu,sequence:"
 msgid "Sequence"
-msgstr "Sequences"
+msgstr "Sekwencja"
 
 msgctxt "field:ir.ui.menu,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Data zapisu"
 
 msgctxt "field:ir.ui.menu,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Zapisał"
 
 msgctxt "field:ir.ui.menu.favorite,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Data utworzenia"
 
 msgctxt "field:ir.ui.menu.favorite,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Utworzył"
 
 msgctxt "field:ir.ui.menu.favorite,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
-#, fuzzy
 msgctxt "field:ir.ui.menu.favorite,menu:"
 msgid "Menu"
 msgstr "Menu"
 
 msgctxt "field:ir.ui.menu.favorite,rec_name:"
 msgid "Name"
-msgstr ""
+msgstr "Nazwa"
 
-#, fuzzy
 msgctxt "field:ir.ui.menu.favorite,sequence:"
 msgid "Sequence"
-msgstr "Sequences"
+msgstr "Sekwencja"
 
 msgctxt "field:ir.ui.menu.favorite,user:"
 msgid "User"
-msgstr ""
+msgstr "Użytkownik"
 
 msgctxt "field:ir.ui.menu.favorite,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Data zapisu"
 
 msgctxt "field:ir.ui.menu.favorite,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Zapisał"
 
 msgctxt "field:ir.ui.view,arch:"
 msgid "View Architecture"
-msgstr ""
+msgstr "Architektura widoku"
 
 msgctxt "field:ir.ui.view,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Data utworzenia"
 
 msgctxt "field:ir.ui.view,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Utworzył"
 
-#, fuzzy
 msgctxt "field:ir.ui.view,data:"
 msgid "Data"
-msgstr "Data"
+msgstr "Dane"
 
 msgctxt "field:ir.ui.view,domain:"
 msgid "Domain"
-msgstr ""
+msgstr "Domena"
 
 msgctxt "field:ir.ui.view,field_childs:"
 msgid "Children Field"
-msgstr ""
+msgstr "Pole elementów potomnych"
 
 msgctxt "field:ir.ui.view,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 msgctxt "field:ir.ui.view,inherit:"
 msgid "Inherited View"
-msgstr ""
+msgstr "Widok odziedziczony"
 
-#, fuzzy
 msgctxt "field:ir.ui.view,model:"
 msgid "Model"
-msgstr "Models"
+msgstr "Model"
 
-#, fuzzy
 msgctxt "field:ir.ui.view,module:"
 msgid "Module"
-msgstr "Modules"
+msgstr "Moduł"
 
 msgctxt "field:ir.ui.view,name:"
 msgid "Name"
-msgstr ""
+msgstr "Nazwa"
 
 msgctxt "field:ir.ui.view,priority:"
 msgid "Priority"
-msgstr ""
+msgstr "Priorytet"
 
 msgctxt "field:ir.ui.view,rec_name:"
 msgid "Name"
-msgstr ""
+msgstr "Nazwa"
 
 msgctxt "field:ir.ui.view,type:"
 msgid "View Type"
-msgstr ""
+msgstr "Typ widoku"
 
 msgctxt "field:ir.ui.view,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Data zapisu"
 
 msgctxt "field:ir.ui.view,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Zapisał"
 
 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 "Data utworzenia"
 
 msgctxt "field:ir.ui.view_search,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Utworzył"
 
 msgctxt "field:ir.ui.view_search,domain:"
 msgid "Domain"
-msgstr ""
+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 "Models"
+msgstr "Model"
 
 msgctxt "field:ir.ui.view_search,name:"
 msgid "Name"
-msgstr ""
+msgstr "Nazwa"
 
 msgctxt "field:ir.ui.view_search,rec_name:"
 msgid "Name"
-msgstr ""
+msgstr "Nazwa"
 
 msgctxt "field:ir.ui.view_search,user:"
 msgid "User"
-msgstr ""
+msgstr "Użytkownik"
 
 msgctxt "field:ir.ui.view_search,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Data zapisu"
 
 msgctxt "field:ir.ui.view_search,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Zapisał"
 
 msgctxt "field:ir.ui.view_tree_state,child_name:"
 msgid "Child Name"
-msgstr ""
+msgstr "Nazwa elementu potomnego"
 
 msgctxt "field:ir.ui.view_tree_state,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Data utworzenia"
 
 msgctxt "field:ir.ui.view_tree_state,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Utworzył"
 
 msgctxt "field:ir.ui.view_tree_state,domain:"
 msgid "Domain"
-msgstr ""
+msgstr "Domena"
 
 msgctxt "field:ir.ui.view_tree_state,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
-#, fuzzy
 msgctxt "field:ir.ui.view_tree_state,model:"
 msgid "Model"
-msgstr "Models"
+msgstr "Model"
 
 msgctxt "field:ir.ui.view_tree_state,nodes:"
 msgid "Expanded Nodes"
-msgstr ""
+msgstr "Rozszerzone węzły"
 
 msgctxt "field:ir.ui.view_tree_state,rec_name:"
 msgid "Name"
-msgstr ""
+msgstr "Nazwa"
 
 msgctxt "field:ir.ui.view_tree_state,selected_nodes:"
 msgid "Selected Nodes"
-msgstr ""
+msgstr "Zaznaczone węzły"
 
 msgctxt "field:ir.ui.view_tree_state,user:"
 msgid "User"
-msgstr ""
+msgstr "Użytkownik"
 
 msgctxt "field:ir.ui.view_tree_state,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Data zapisu"
 
 msgctxt "field:ir.ui.view_tree_state,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Zapisał"
 
 msgctxt "field:ir.ui.view_tree_width,create_date:"
 msgid "Create Date"
-msgstr ""
+msgstr "Data utworzenia"
 
 msgctxt "field:ir.ui.view_tree_width,create_uid:"
 msgid "Create User"
-msgstr ""
+msgstr "Utworzył"
 
-#, fuzzy
 msgctxt "field:ir.ui.view_tree_width,field:"
 msgid "Field"
-msgstr "Fields"
+msgstr "Pole"
 
 msgctxt "field:ir.ui.view_tree_width,id:"
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
-#, fuzzy
 msgctxt "field:ir.ui.view_tree_width,model:"
 msgid "Model"
-msgstr "Models"
+msgstr "Model"
 
 msgctxt "field:ir.ui.view_tree_width,rec_name:"
 msgid "Name"
-msgstr ""
+msgstr "Nazwa"
 
 msgctxt "field:ir.ui.view_tree_width,user:"
 msgid "User"
-msgstr ""
+msgstr "Użytkownik"
 
 msgctxt "field:ir.ui.view_tree_width,width:"
 msgid "Width"
-msgstr ""
+msgstr "Szerokość"
 
 msgctxt "field:ir.ui.view_tree_width,write_date:"
 msgid "Write Date"
-msgstr ""
+msgstr "Data zapisu"
 
 msgctxt "field:ir.ui.view_tree_width,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Zapisał"
+
+msgctxt "help:ir.action.act_window,context_domain:"
+msgid "Part of the domain that will be evaluated on each refresh"
+msgstr "Część domany, która będzie ewaluowana przy każdym oświeżeniu"
 
 msgctxt "help:ir.action.act_window,limit:"
 msgid "Default limit for the list view"
-msgstr ""
+msgstr "Domyślny limit dla widoku listy"
 
 msgctxt "help:ir.action.act_window,search_value:"
 msgid "Default search criteria for the list view"
-msgstr ""
+msgstr "Domyślne kryteria wyszukiwania dla widoku listy"
 
 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 ""
+"Słownik pythonowy z kluczami \"to\" \"cc\" \"subject\"\n"
+"Przykład: {'to': 'test at example.com', 'cc': 'user at example.com'}"
 
 msgctxt "help:ir.action.report,extension:"
 msgid ""
 "Leave empty for the same as template, see unoconv documentation for "
 "compatible format"
 msgstr ""
+"Pozostaw puste jako szablon. Sprawdź dokumentację unoconv dla właściwego "
+"formatu."
 
 msgctxt "help:ir.action.wizard,window:"
 msgid "Run wizard in a new window"
-msgstr ""
+msgstr "Uruchom kreatora w nowym oknie"
 
 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 ""
+"Liczba dopuszczalnych wywołań funkcji. Ujemna wartość wskazuje, że funkcja "
+"będzie zawsze wywoływana."
 
 msgctxt "help:ir.cron,request_user:"
 msgid "The user who will receive requests in case of failure"
-msgstr ""
+msgstr "Użytkownik, który otrzyma żądania w przypadku niepowodzenia"
 
 msgctxt "help:ir.cron,user:"
 msgid "The user used to execute this action"
-msgstr ""
+msgstr "Użytkownik uruchamiający tę akcję"
 
 msgctxt "help:ir.lang,code:"
 msgid "RFC 4646 tag: http://tools.ietf.org/html/rfc4646"
-msgstr ""
+msgstr "RFC 4646 tag: http://tools.ietf.org/html/rfc4646"
 
 msgctxt "help:ir.model,module:"
 msgid "Module in which this model is defined"
-msgstr ""
+msgstr "Moduł, w którym ten model jest zdefiniowany"
 
 msgctxt "help:ir.model.button,reset_by:"
 msgid "Button that should reset the rules"
-msgstr ""
+msgstr "Przycisk resetujący reguły"
 
 msgctxt "help:ir.model.button.rule,condition:"
 msgid ""
 "A PYSON statement evaluated with the record represented by \"self\"\n"
 "It activate the rule if true."
 msgstr ""
+"Wyrażenie PYSON odnoszące się do rekordu reprezentowanego przez \"self\"\n"
+"Jeśli wyrażenie jest prawdziwe to prowadzi do uaktywnienia reguły."
 
 msgctxt "help:ir.model.data,db_id:"
 msgid "The id of the record in the database."
-msgstr ""
+msgstr "Identyfikator rekordu w bazie danych."
 
 msgctxt "help:ir.model.data,fs_id:"
 msgid "The id of the record as known on the file system."
-msgstr ""
+msgstr "Identyfikator rekordu znany w systemie plików."
 
 msgctxt "help:ir.model.field,module:"
 msgid "Module in which this field is defined"
-msgstr ""
+msgstr "Moduł, w którym to pole jest zdefiniowane"
 
 msgctxt "help:ir.model.print_model_graph.start,filter:"
 msgid ""
 "Entering a Python Regular Expression will exclude matching models from the "
 "graph."
 msgstr ""
+"Podanie regularnego wyrażenia w Pythonie spowoduje usunięcie pasujących "
+"modeli z grafu."
 
 msgctxt "help:ir.rule,domain:"
 msgid ""
 "Domain is evaluated with a PYSON context containing:\n"
 "- \"user\" as the current user"
 msgstr ""
+"Domena jest ewaluowana przez kontekst PYSON zawierający:\n"
+"- \"user\" jako aktualny użytkownik"
 
 msgctxt "help:ir.rule.group,default_p:"
 msgid "Add this rule to all users by default"
-msgstr ""
+msgstr "Dodaj domyślnie tę regułę do wszystkich użytkowników"
 
 msgctxt "help:ir.rule.group,global_p:"
 msgid ""
 "Make the rule global \n"
 "so every users must follow this rule"
 msgstr ""
+"Określ regułę jako globalną,\n"
+"aby wpływała na każdego użytkownika"
 
 msgctxt "help:ir.rule.group,rules:"
 msgid "The rule is satisfied if at least one test is True"
 msgstr ""
+"Reguła spełnia wymagania jeśli wynik przynajmniej jednego testu jest True"
 
 msgctxt "help:ir.trigger,condition:"
 msgid ""
 "A PYSON statement evaluated with record represented by \"self\"\n"
 "It triggers the action if true."
 msgstr ""
+"Wyrażenie PYSON odnoszące się do rekordu reprezentowanego przez \"self\"\n"
+"Jeśli wyrażenie jest prawdziwe to nastąpi wywołanie akcji."
 
 msgctxt "help:ir.trigger,limit_number:"
 msgid ""
 "Limit the number of call to \"Action Function\" by records.\n"
 "0 for no limit."
 msgstr ""
+"Limit wywołań \"Funkcji akcji\" przez rekordy.\n"
+"0 oznacza bez limitu."
 
 msgctxt "help:ir.trigger,minimum_time_delay:"
 msgid ""
 "Set a minimum time delay between call to \"Action Function\" for the same record.\n"
 "empty for no delay."
 msgstr ""
+"Ustaw minimalny czas opóźnienia pomiędzy wywołaniami \"Funkcji akcji\" dla tego samego rekordu.\n"
+"Puste oznacza brak opóźnień."
 
 msgctxt "help:ir.ui.view_search,domain:"
 msgid "The PYSON domain"
-msgstr ""
+msgstr "Domena PYSON"
 
-#, fuzzy
 msgctxt "model:ir.action,name:"
 msgid "Action"
-msgstr "Actions"
+msgstr "Akcja"
 
 msgctxt "model:ir.action,name:act_action_act_window_form"
 msgid "Window Actions"
-msgstr "Window Actions"
+msgstr "Akcje dla okna"
 
 msgctxt "model:ir.action,name:act_action_form"
 msgid "Actions"
-msgstr "Actions"
+msgstr "Akcje"
 
 msgctxt "model:ir.action,name:act_action_report_form"
 msgid "Reports"
-msgstr "Reports"
+msgstr "Raporty"
 
 msgctxt "model:ir.action,name:act_action_url_form"
 msgid "URLs"
-msgstr "URLs"
+msgstr "Adresy URL"
 
 msgctxt "model:ir.action,name:act_action_wizard_form"
 msgid "Wizards"
-msgstr "Wizards"
+msgstr "Kreatory"
 
 msgctxt "model:ir.action,name:act_attachment_form"
 msgid "Attachments"
-msgstr "Attachments"
+msgstr "Załączniki"
 
 msgctxt "model:ir.action,name:act_config_wizard_item_form"
 msgid "Config Wizard Items"
-msgstr "Config Wizard Items"
+msgstr "Elementy kreatora konfiguracji"
 
 msgctxt "model:ir.action,name:act_cron_form"
 msgid "Scheduled Actions"
-msgstr "Scheduled Actions"
+msgstr "Zaplanowane akcje"
 
 msgctxt "model:ir.action,name:act_export_form"
 msgid "Exports"
-msgstr "Exports"
+msgstr "Wyeksportowania"
 
 msgctxt "model:ir.action,name:act_icon_form"
 msgid "Icons"
-msgstr "Icons"
+msgstr "Ikony"
 
 msgctxt "model:ir.action,name:act_lang_form"
 msgid "Languages"
-msgstr "Languages"
+msgstr "Języki"
 
 msgctxt "model:ir.action,name:act_menu_list"
 msgid "Menu"
@@ -3045,519 +2982,507 @@ msgstr "Menu"
 
 msgctxt "model:ir.action,name:act_model_access_form"
 msgid "Models Access"
-msgstr "Models Access"
+msgstr "Dostęp do modeli"
 
 msgctxt "model:ir.action,name:act_model_access_form_relate_model"
 msgid "Access"
-msgstr "Access"
+msgstr "Dostęp"
 
 msgctxt "model:ir.action,name:act_model_button_click_form_relate_model_button"
 msgid "Clicks"
-msgstr ""
+msgstr "Kliknięcia"
 
 msgctxt "model:ir.action,name:act_model_button_form"
 msgid "Buttons"
-msgstr "Buttons"
+msgstr "Przyciski"
 
 msgctxt "model:ir.action,name:act_model_data_form"
 msgid "Data"
-msgstr "Data"
+msgstr "Dane"
 
 msgctxt "model:ir.action,name:act_model_field_access_form"
 msgid "Fields Access"
-msgstr "Fields Access"
+msgstr "Dostęp do pól"
 
 msgctxt "model:ir.action,name:act_model_field_access_form_relate_field"
 msgid "Access"
-msgstr "Access"
+msgstr "Dostęp"
 
 msgctxt "model:ir.action,name:act_model_fields_form"
 msgid "Fields"
-msgstr "Fields"
+msgstr "Pola"
 
 msgctxt "model:ir.action,name:act_model_form"
 msgid "Models"
-msgstr "Models"
+msgstr "Modele"
 
-#, fuzzy
 msgctxt "model:ir.action,name:act_module_activate_upgrade"
 msgid "Perform Pending Activation/Upgrade"
-msgstr "Perform Pending Installation/Upgrade"
+msgstr "Wykonaj aktywację/aktualizację"
 
 msgctxt "model:ir.action,name:act_module_config"
 msgid "Configure Modules"
-msgstr "Configure Modules"
+msgstr "Skonfiguruj moduły"
 
 msgctxt "model:ir.action,name:act_module_config_wizard"
 msgid "Module Configuration"
-msgstr "Module Configuration"
+msgstr "Konfiguracja modułu"
 
 msgctxt "model:ir.action,name:act_module_form"
 msgid "Modules"
-msgstr "Modules"
+msgstr "Moduły"
 
 msgctxt "model:ir.action,name:act_note_form"
 msgid "Notes"
-msgstr "Notes"
-
-msgctxt "model:ir.action,name:act_property_form"
-msgid "Properties"
-msgstr "Properties"
-
-msgctxt "model:ir.action,name:act_property_form_default"
-msgid "Default Properties"
-msgstr "Default Properties"
+msgstr "Notatki"
 
 msgctxt "model:ir.action,name:act_rule_group_form"
 msgid "Record Rules"
-msgstr "Record Rules"
+msgstr "Reguły rekordu"
 
 msgctxt "model:ir.action,name:act_sequence_form"
 msgid "Sequences"
-msgstr "Sequences"
+msgstr "Sekwencje"
 
 msgctxt "model:ir.action,name:act_sequence_strict_form"
 msgid "Sequences Strict"
-msgstr "Sequences Strict"
+msgstr "Sekwencje ścisłe"
 
 msgctxt "model:ir.action,name:act_sequence_type_form"
 msgid "Sequence Types"
-msgstr "Sequence Types"
+msgstr "Typy sekwencji"
 
 msgctxt "model:ir.action,name:act_translation_clean"
 msgid "Clean Translations"
-msgstr "Clean Translations"
+msgstr "Oczyść tłumaczenia"
 
 msgctxt "model:ir.action,name:act_translation_export"
 msgid "Export Translations"
-msgstr "Export Translations"
+msgstr "Wyeksportuj tłumaczenia"
 
 msgctxt "model:ir.action,name:act_translation_form"
 msgid "Translations"
-msgstr "Translations"
+msgstr "Tłumaczenia"
+
+msgctxt "model:ir.action,name:act_translation_report"
+msgid "Translations"
+msgstr "Tłumaczenia"
 
-#, fuzzy
 msgctxt "model:ir.action,name:act_translation_set"
 msgid "Set Translations"
-msgstr "Set Translations"
+msgstr "Dodaj tłumaczenia"
 
 msgctxt "model:ir.action,name:act_translation_update"
 msgid "Synchronize Translations"
-msgstr "Synchronize Translations"
+msgstr "Synchronizuj tłumaczenia"
 
 msgctxt "model:ir.action,name:act_trigger_form"
 msgid "Triggers"
-msgstr "Triggers"
+msgstr "Wyzwalacze"
 
 msgctxt "model:ir.action,name:act_view_form"
 msgid "Views"
-msgstr "Views"
+msgstr "Widoki"
 
 msgctxt "model:ir.action,name:act_view_search"
 msgid "View Search"
-msgstr "View Search"
+msgstr "Szukaj widoku"
 
 msgctxt "model:ir.action,name:act_view_show"
 msgid "Show View"
-msgstr "Show View"
+msgstr "Pokaż widok"
 
 msgctxt "model:ir.action,name:act_view_tree_state"
 msgid "Tree State"
-msgstr "Tree State"
+msgstr "Stan drzewa"
 
 msgctxt "model:ir.action,name:act_view_tree_width_form"
 msgid "View Tree Width"
-msgstr "View Tree Width"
+msgstr "Szerokość drzewa widoków"
 
 msgctxt "model:ir.action,name:print_model_graph"
 msgid "Graph"
-msgstr "Graph"
+msgstr "Wykres"
 
 msgctxt "model:ir.action,name:report_model_graph"
 msgid "Graph"
-msgstr "Graph"
+msgstr "Wykres"
 
 msgctxt "model:ir.action,name:report_model_workflow_graph"
 msgid "Workflow Graph"
-msgstr "Workflow Graph"
+msgstr "Wykres przepływu pracy"
+
+msgctxt "model:ir.action,name:wizard_translation_report"
+msgid "Translations"
+msgstr "Tłumaczenia"
 
 msgctxt "model:ir.action.act_window,name:"
 msgid "Action act window"
-msgstr ""
+msgstr "Okno działania akcji"
 
 msgctxt "model:ir.action.act_window.domain,name:"
 msgid "Action act window domain"
-msgstr ""
+msgstr "Domena okna działania akcji"
 
 msgctxt ""
 "model:ir.action.act_window.domain,name:act_model_data_form_domain_all"
 msgid "All"
-msgstr "All"
+msgstr "Wszystko"
 
 msgctxt ""
 "model:ir.action.act_window.domain,name:act_model_data_form_domain_out_of_sync"
 msgid "Out of Sync"
-msgstr "Out of Sync"
+msgstr "Niezsynchronizowany"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_translation_form_domain_local"
+msgid "Local"
+msgstr "Lokalny"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_translation_form_domain_module"
+msgid "Modules"
+msgstr "Moduły"
 
 msgctxt "model:ir.action.act_window.view,name:"
 msgid "Action act window view"
-msgstr ""
+msgstr "Widok okna działania akcji"
 
 msgctxt "model:ir.action.keyword,name:"
 msgid "Action keyword"
-msgstr ""
+msgstr "Słowo kluczowe akcji"
 
 msgctxt "model:ir.action.report,name:"
 msgid "Action report"
-msgstr ""
+msgstr "Raport akcji"
 
 msgctxt "model:ir.action.url,name:"
 msgid "Action URL"
-msgstr ""
+msgstr "Adres URL akcji"
 
 msgctxt "model:ir.action.wizard,name:"
 msgid "Action wizard"
-msgstr ""
+msgstr "Kreator akcji"
 
-#, fuzzy
 msgctxt "model:ir.attachment,name:"
 msgid "Attachment"
-msgstr "Attachments"
+msgstr "Załącznik"
 
 msgctxt "model:ir.cache,name:"
 msgid "Cache"
-msgstr ""
+msgstr "Pamięć podręczna"
 
 msgctxt "model:ir.configuration,name:"
 msgid "Configuration"
-msgstr ""
+msgstr "Konfiguracja"
 
 msgctxt "model:ir.cron,name:"
 msgid "Cron"
-msgstr ""
+msgstr "Cron"
 
-#, fuzzy
 msgctxt "model:ir.date,name:"
 msgid "Date"
 msgstr "Data"
 
-#, fuzzy
 msgctxt "model:ir.export,name:"
 msgid "Export"
-msgstr "Exports"
+msgstr "Eksport"
 
 msgctxt "model:ir.export.line,name:"
 msgid "Export line"
-msgstr ""
+msgstr "Wiersz eksportu"
 
-#, fuzzy
 msgctxt "model:ir.lang,name:"
 msgid "Language"
-msgstr "Languages"
+msgstr "Język"
 
 msgctxt "model:ir.lang,name:lang_bg"
 msgid "Bulgarian"
-msgstr "Bulgarian"
+msgstr "Bułgarski"
 
 msgctxt "model:ir.lang,name:lang_ca"
 msgid "Català"
-msgstr "Català"
+msgstr "Kataloński"
 
 msgctxt "model:ir.lang,name:lang_cs"
 msgid "Czech"
-msgstr "Czech"
+msgstr "Czeski"
 
 msgctxt "model:ir.lang,name:lang_de"
 msgid "German"
-msgstr "German"
+msgstr "Niemiecki"
 
 msgctxt "model:ir.lang,name:lang_en"
 msgid "English"
-msgstr "English"
+msgstr "Angielski"
 
 msgctxt "model:ir.lang,name:lang_es"
 msgid "Spanish"
-msgstr "Spanish"
+msgstr "Hiszpański"
 
 msgctxt "model:ir.lang,name:lang_es_419"
 msgid "Spanish (Latin American)"
-msgstr ""
+msgstr "Hiszpański (Ameryka Łacińska)"
 
 msgctxt "model:ir.lang,name:lang_fr"
 msgid "French"
-msgstr "French"
+msgstr "Francuski"
 
 msgctxt "model:ir.lang,name:lang_hu_HU"
 msgid "Hungarian"
-msgstr "Hungarian"
+msgstr "Węgierski"
 
 msgctxt "model:ir.lang,name:lang_it_IT"
 msgid "Italian"
-msgstr "Italian"
+msgstr "Włoski"
 
 msgctxt "model:ir.lang,name:lang_lo"
-msgid "ລາວ"
-msgstr "ລາວ"
+msgid "Lao"
+msgstr "Laotański"
 
 msgctxt "model:ir.lang,name:lang_lt"
 msgid "Lithuanian"
-msgstr "Lithuanian"
+msgstr "Litewski"
 
 msgctxt "model:ir.lang,name:lang_nl"
 msgid "Dutch"
-msgstr "Dutch"
+msgstr "Holenderski"
+
+msgctxt "model:ir.lang,name:lang_pl"
+msgid "Polish"
+msgstr "Polski"
 
 msgctxt "model:ir.lang,name:lang_pt_BR"
 msgid "Portuguese (Brazil)"
-msgstr "Portuguese (Brazil)"
+msgstr "Portugalski (Brazylia)"
 
 msgctxt "model:ir.lang,name:lang_ru"
 msgid "Russian"
-msgstr "Russian"
+msgstr "Rosyjski"
 
 msgctxt "model:ir.lang,name:lang_sl"
 msgid "Slovenian"
-msgstr "Slovenian"
+msgstr "Słoweński"
 
 msgctxt "model:ir.lang,name:lang_zh_CN"
-msgid "中国(简体)"
-msgstr "中国(简体)"
+msgid "Chinese Simplified"
+msgstr "Chiński uproszczony"
 
-#, fuzzy
 msgctxt "model:ir.model,name:"
 msgid "Model"
-msgstr "Models"
+msgstr "Model"
 
-#, fuzzy
 msgctxt "model:ir.model.access,name:"
 msgid "Model access"
-msgstr "Models Access"
+msgstr "Dostęp do modelu"
 
 msgctxt "model:ir.model.button,name:"
 msgid "Model Button"
-msgstr ""
+msgstr "Przycisk modelu"
 
 msgctxt "model:ir.model.button-button.reset,name:"
 msgid "Model Button Reset"
-msgstr ""
+msgstr "Reset przycisku modelu"
 
 msgctxt "model:ir.model.button.click,name:"
 msgid "Model Button Click"
-msgstr ""
+msgstr "Kliknięcie przycisku modelu"
 
 msgctxt "model:ir.model.button.rule,name:"
 msgid "Model Button Rule"
-msgstr ""
+msgstr "Reguła przycisku modelu"
 
 msgctxt "model:ir.model.data,name:"
 msgid "Model data"
-msgstr ""
+msgstr "Dane modelu"
 
 msgctxt "model:ir.model.field,name:"
 msgid "Model field"
-msgstr ""
+msgstr "Pole modelu"
 
 msgctxt "model:ir.model.field.access,name:"
 msgid "Model Field Access"
-msgstr ""
+msgstr "Dostęp do pola modelu"
 
 msgctxt "model:ir.model.print_model_graph.start,name:"
 msgid "Print Model Graph"
-msgstr ""
+msgstr "Wykres modelu druku"
 
-#, fuzzy
 msgctxt "model:ir.module,name:"
 msgid "Module"
-msgstr "Modules"
+msgstr "Moduł"
 
 msgctxt "model:ir.module.activate_upgrade.done,name:"
 msgid "Module Activate Upgrade Done"
-msgstr ""
+msgstr "Uruchomiono aktywację/aktualizację modułu"
 
 msgctxt "model:ir.module.activate_upgrade.start,name:"
 msgid "Module Activate Upgrade Start"
-msgstr ""
+msgstr "Rozpoczęcie aktywacji/aktualizacji modułu"
 
 msgctxt "model:ir.module.config_wizard.done,name:"
 msgid "Module Config Wizard Done"
-msgstr ""
+msgstr "Uruchomiono kreatora konfiguracji modułu"
 
 msgctxt "model:ir.module.config_wizard.first,name:"
 msgid "Module Config Wizard First"
-msgstr ""
+msgstr "Pierwszy kreator konfiguracji modułu"
 
 msgctxt "model:ir.module.config_wizard.item,name:"
 msgid "Config wizard to run after activating a module"
-msgstr ""
+msgstr "Kreator konfiguracji do uruchomienia po aktywacji modułu"
 
 msgctxt "model:ir.module.config_wizard.other,name:"
 msgid "Module Config Wizard Other"
-msgstr ""
+msgstr "Inny kreator konfiguracji modułu"
 
 msgctxt "model:ir.module.dependency,name:"
 msgid "Module dependency"
-msgstr ""
+msgstr "Zależność modułu"
 
-#, fuzzy
 msgctxt "model:ir.note,name:"
 msgid "Note"
-msgstr "Notes"
+msgstr "Notatka"
 
 msgctxt "model:ir.note.read,name:"
 msgid "Note Read"
-msgstr ""
-
-msgctxt "model:ir.property,name:"
-msgid "Property"
-msgstr ""
+msgstr "Notatka przeczytana"
 
 msgctxt "model:ir.rule,name:"
 msgid "Rule"
-msgstr ""
+msgstr "Reguła"
 
 msgctxt "model:ir.rule.group,name:"
 msgid "Rule group"
-msgstr ""
+msgstr "Grupa reguł"
 
-#, fuzzy
 msgctxt "model:ir.sequence,name:"
 msgid "Sequence"
-msgstr "Sequences"
+msgstr "Sekwencja"
 
-#, fuzzy
 msgctxt "model:ir.sequence.strict,name:"
 msgid "Sequence Strict"
-msgstr "Sequences Strict"
+msgstr "Sekwencja ścisła"
 
-#, fuzzy
 msgctxt "model:ir.sequence.type,name:"
 msgid "Sequence type"
-msgstr "Sequence Types"
+msgstr "Typ sekwencji"
 
 msgctxt "model:ir.session,name:"
 msgid "Session"
-msgstr ""
+msgstr "Sesja"
 
 msgctxt "model:ir.session.wizard,name:"
 msgid "Session Wizard"
-msgstr ""
+msgstr "Kreator sesji"
 
-#, fuzzy
 msgctxt "model:ir.translation,name:"
 msgid "Translation"
-msgstr "Translations"
+msgstr "Tłumaczenie"
 
-#, fuzzy
 msgctxt "model:ir.translation.clean.start,name:"
 msgid "Clean translation"
-msgstr "Clean Translations"
+msgstr "Oczyść tłumaczenie"
 
-#, fuzzy
 msgctxt "model:ir.translation.clean.succeed,name:"
 msgid "Clean translation"
-msgstr "Clean Translations"
+msgstr "Oczyść tłumaczenie"
 
-#, fuzzy
 msgctxt "model:ir.translation.export.result,name:"
 msgid "Export translation"
-msgstr "Export Translations"
+msgstr "Wyeksportuj tłumaczenie"
 
-#, fuzzy
 msgctxt "model:ir.translation.export.start,name:"
 msgid "Export translation"
-msgstr "Export Translations"
+msgstr "Wyeksportuj tłumaczenie"
 
-#, fuzzy
 msgctxt "model:ir.translation.set.start,name:"
 msgid "Set Translation"
-msgstr "Set Translations"
+msgstr "Dodaj tłumaczenie"
 
-#, fuzzy
 msgctxt "model:ir.translation.set.succeed,name:"
 msgid "Set Translation"
-msgstr "Set Translations"
+msgstr "Dodaj tłumaczenie"
 
 msgctxt "model:ir.translation.update.start,name:"
 msgid "Update translation"
-msgstr ""
+msgstr "Aktualizuj tłumaczenie"
 
-#, fuzzy
 msgctxt "model:ir.trigger,name:"
 msgid "Trigger"
-msgstr "Triggers"
+msgstr "Wyzwalacz"
 
 msgctxt "model:ir.trigger.log,name:"
 msgid "Trigger Log"
-msgstr ""
+msgstr "Dziennik wyzwalaczy"
 
-#, fuzzy
 msgctxt "model:ir.ui.icon,name:"
 msgid "Icon"
-msgstr "Icons"
+msgstr "Ikona"
 
 msgctxt "model:ir.ui.menu,name:"
 msgid "UI menu"
-msgstr ""
+msgstr "UI menu"
 
 msgctxt "model:ir.ui.menu,name:menu_act_action"
 msgid "Actions"
-msgstr "Actions"
+msgstr "Akcje"
 
 msgctxt "model:ir.ui.menu,name:menu_action"
 msgid "Actions"
-msgstr "Actions"
+msgstr "Akcje"
 
 msgctxt "model:ir.ui.menu,name:menu_action_act_window"
 msgid "Window Actions"
-msgstr "Window Actions"
+msgstr "Okno akcji"
 
 msgctxt "model:ir.ui.menu,name:menu_action_report_form"
 msgid "Reports"
-msgstr "Reports"
+msgstr "Raporty"
 
 msgctxt "model:ir.ui.menu,name:menu_action_url"
 msgid "URLs"
-msgstr "URLs"
+msgstr "Adresy URL"
 
 msgctxt "model:ir.ui.menu,name:menu_action_wizard"
 msgid "Wizards"
-msgstr "Wizards"
+msgstr "Kreatory"
 
 msgctxt "model:ir.ui.menu,name:menu_administration"
 msgid "Administration"
-msgstr "Administration"
+msgstr "Administracja"
 
 msgctxt "model:ir.ui.menu,name:menu_attachment_form"
 msgid "Attachments"
-msgstr "Attachments"
+msgstr "Załączniki"
 
 msgctxt "model:ir.ui.menu,name:menu_config_wizard_item_form"
 msgid "Config Wizard Items"
-msgstr "Config Wizard Items"
+msgstr "Elementy kreatora konfiguracji"
 
 msgctxt "model:ir.ui.menu,name:menu_cron_form"
 msgid "Scheduled Actions"
-msgstr "Scheduled Actions"
+msgstr "Zaplanowane akcje"
 
 msgctxt "model:ir.ui.menu,name:menu_export_form"
 msgid "Exports"
-msgstr "Exports"
+msgstr "Wyeksportowania"
 
 msgctxt "model:ir.ui.menu,name:menu_icon_form"
 msgid "Icons"
-msgstr "Icons"
+msgstr "Ikony"
 
 msgctxt "model:ir.ui.menu,name:menu_ir_sequence_type"
 msgid "Sequence Types"
-msgstr "Sequence Types"
+msgstr "Typy sekwencji"
 
 msgctxt "model:ir.ui.menu,name:menu_lang_form"
 msgid "Languages"
-msgstr "Languages"
+msgstr "Języki"
 
 msgctxt "model:ir.ui.menu,name:menu_localization"
 msgid "Localization"
-msgstr "Localization"
+msgstr "Lokalizacja"
 
 msgctxt "model:ir.ui.menu,name:menu_menu_list"
 msgid "Menu"
@@ -3565,317 +3490,299 @@ msgstr "Menu"
 
 msgctxt "model:ir.ui.menu,name:menu_model_access_form"
 msgid "Models Access"
-msgstr "Models Access"
+msgstr "Dostęp do modeli"
 
 msgctxt "model:ir.ui.menu,name:menu_model_button_form"
 msgid "Buttons"
-msgstr "Buttons"
+msgstr "Przyciski"
 
 msgctxt "model:ir.ui.menu,name:menu_model_data_form"
 msgid "Data"
-msgstr "Data"
+msgstr "Dane"
 
 msgctxt "model:ir.ui.menu,name:menu_model_field_access_form"
 msgid "Fields Access"
-msgstr "Fields Access"
+msgstr "Dostęp do pól"
 
 msgctxt "model:ir.ui.menu,name:menu_model_form"
 msgid "Models"
-msgstr "Models"
+msgstr "Modele"
 
 msgctxt "model:ir.ui.menu,name:menu_models"
 msgid "Models"
-msgstr "Models"
+msgstr "Modele"
 
-#, fuzzy
 msgctxt "model:ir.ui.menu,name:menu_module_activate_upgrade"
 msgid "Perform Pending Activation/Upgrade"
-msgstr "Perform Pending Installation/Upgrade"
+msgstr "Wykonaj aktywację/aktualizację"
 
 msgctxt "model:ir.ui.menu,name:menu_module_form"
 msgid "Modules"
-msgstr "Modules"
+msgstr "Moduły"
 
 msgctxt "model:ir.ui.menu,name:menu_modules"
 msgid "Modules"
-msgstr "Modules"
+msgstr "Moduły"
 
 msgctxt "model:ir.ui.menu,name:menu_note_form"
 msgid "Notes"
-msgstr "Notes"
-
-msgctxt "model:ir.ui.menu,name:menu_property_form"
-msgid "Properties"
-msgstr "Properties"
-
-msgctxt "model:ir.ui.menu,name:menu_property_form_default"
-msgid "Default Properties"
-msgstr "Default Properties"
+msgstr "Notatki"
 
 msgctxt "model:ir.ui.menu,name:menu_rule_group_form"
 msgid "Record Rules"
-msgstr "Record Rules"
+msgstr "Reguły rekordu"
 
 msgctxt "model:ir.ui.menu,name:menu_scheduler"
 msgid "Scheduler"
-msgstr "Scheduler"
+msgstr "Harmonogram"
 
 msgctxt "model:ir.ui.menu,name:menu_sequence_form"
 msgid "Sequences"
-msgstr "Sequences"
+msgstr "Sekwencje"
 
 msgctxt "model:ir.ui.menu,name:menu_sequence_strict_form"
 msgid "Sequences Strict"
-msgstr "Sequences Strict"
+msgstr "Sekwencje ścisłe"
 
 msgctxt "model:ir.ui.menu,name:menu_sequences"
 msgid "Sequences"
-msgstr "Sequences"
+msgstr "Sekwencje"
 
 msgctxt "model:ir.ui.menu,name:menu_translation_clean"
 msgid "Clean Translations"
-msgstr "Clean Translations"
+msgstr "Oczyść tłumaczenia"
 
 msgctxt "model:ir.ui.menu,name:menu_translation_export"
 msgid "Export Translations"
-msgstr "Export Translations"
+msgstr "Wyeksportuj tłumaczenia"
 
 msgctxt "model:ir.ui.menu,name:menu_translation_form"
 msgid "Translations"
-msgstr "Translations"
+msgstr "Tłumaczenia"
 
 msgctxt "model:ir.ui.menu,name:menu_translation_set"
 msgid "Set Translations"
-msgstr "Set Translations"
+msgstr "Dodaj tłumaczenia"
 
 msgctxt "model:ir.ui.menu,name:menu_translation_update"
 msgid "Synchronize Translations"
-msgstr "Synchronize Translations"
+msgstr "Synchronizuj tłumaczenia"
 
 msgctxt "model:ir.ui.menu,name:menu_trigger_form"
 msgid "Triggers"
-msgstr "Triggers"
+msgstr "Wyzwalacze"
 
 msgctxt "model:ir.ui.menu,name:menu_ui"
 msgid "User Interface"
-msgstr "User Interface"
+msgstr "Interfejs użytkownika"
 
 msgctxt "model:ir.ui.menu,name:menu_view"
 msgid "Views"
-msgstr "Views"
+msgstr "Widoki"
 
 msgctxt "model:ir.ui.menu,name:menu_view_search"
 msgid "View Search"
-msgstr "View Search"
+msgstr "Wyszukiwanie widoku"
 
 msgctxt "model:ir.ui.menu,name:menu_view_tree_state"
 msgid "Tree State"
-msgstr "Tree State"
+msgstr "Stan drzewa"
 
 msgctxt "model:ir.ui.menu,name:menu_view_tree_width"
 msgid "View Tree Width"
-msgstr "View Tree Width"
+msgstr "Szerokość drzewa widoku"
 
 msgctxt "model:ir.ui.menu,name:model_model_fields_form"
 msgid "Fields"
-msgstr "Fields"
+msgstr "Pola"
 
 msgctxt "model:ir.ui.menu.favorite,name:"
 msgid "Menu Favorite"
-msgstr ""
+msgstr "Menu ulubionych"
 
-#, fuzzy
 msgctxt "model:ir.ui.view,name:"
 msgid "View"
-msgstr "Views"
+msgstr "Widok"
 
-#, fuzzy
 msgctxt "model:ir.ui.view.show.start,name:"
 msgid "Show view"
-msgstr "Show View"
+msgstr "Pokaż widok"
 
-#, fuzzy
 msgctxt "model:ir.ui.view_search,name:"
 msgid "View Search"
-msgstr "View Search"
+msgstr "Wyszukiwanie widoku"
 
 msgctxt "model:ir.ui.view_tree_state,name:"
 msgid "View Tree State"
-msgstr ""
+msgstr "Stan drzewa widoku"
 
-#, fuzzy
 msgctxt "model:ir.ui.view_tree_width,name:"
 msgid "View Tree Width"
-msgstr "View Tree Width"
+msgstr "Szerokość drzewa widoku"
 
 msgctxt "selection:ir.action.keyword,keyword:"
 msgid "Action form"
-msgstr ""
+msgstr "Formularz akcji"
 
 msgctxt "selection:ir.action.keyword,keyword:"
 msgid "Form relate"
-msgstr ""
+msgstr "Relacja formularza"
 
 msgctxt "selection:ir.action.keyword,keyword:"
 msgid "Open Graph"
-msgstr ""
+msgstr "Otwórz wykres"
 
 msgctxt "selection:ir.action.keyword,keyword:"
 msgid "Open tree"
-msgstr ""
+msgstr "Otwórz drzewo"
 
 msgctxt "selection:ir.action.keyword,keyword:"
 msgid "Print form"
-msgstr ""
+msgstr "Drukuj formularz"
 
-#, fuzzy
 msgctxt "selection:ir.attachment,type:"
 msgid "Data"
-msgstr "Data"
+msgstr "Dane"
 
 msgctxt "selection:ir.attachment,type:"
 msgid "Link"
-msgstr ""
+msgstr "Odnośnik"
 
 msgctxt "selection:ir.cron,interval_type:"
 msgid "Days"
-msgstr ""
+msgstr "Dni"
 
 msgctxt "selection:ir.cron,interval_type:"
 msgid "Hours"
-msgstr ""
+msgstr "Godziny"
 
 msgctxt "selection:ir.cron,interval_type:"
 msgid "Minutes"
-msgstr ""
+msgstr "Minuty"
 
 msgctxt "selection:ir.cron,interval_type:"
 msgid "Months"
-msgstr ""
+msgstr "Miesiące"
 
 msgctxt "selection:ir.cron,interval_type:"
 msgid "Weeks"
-msgstr ""
+msgstr "Tygodnie"
 
 msgctxt "selection:ir.lang,direction:"
 msgid "Left-to-right"
-msgstr ""
+msgstr "Od lewej do prawej"
 
 msgctxt "selection:ir.lang,direction:"
 msgid "Right-to-left"
-msgstr ""
+msgstr "Od prawej do lewej"
 
 msgctxt "selection:ir.module,state:"
 msgid "Activated"
-msgstr ""
+msgstr "Aktywny"
 
 msgctxt "selection:ir.module,state:"
 msgid "Not Activated"
-msgstr ""
+msgstr "Nieaktywny"
 
 msgctxt "selection:ir.module,state:"
 msgid "To be activated"
-msgstr ""
+msgstr "Do aktywacji"
 
 msgctxt "selection:ir.module,state:"
 msgid "To be removed"
-msgstr ""
+msgstr "Do usunięcia"
 
 msgctxt "selection:ir.module,state:"
 msgid "To be upgraded"
-msgstr ""
+msgstr "Do aktualizacji"
 
 msgctxt "selection:ir.module.config_wizard.item,state:"
 msgid "Done"
-msgstr ""
+msgstr "Ukończono"
 
 msgctxt "selection:ir.module.config_wizard.item,state:"
 msgid "Open"
-msgstr ""
+msgstr "Otwórz"
 
 msgctxt "selection:ir.module.dependency,state:"
 msgid "Activated"
-msgstr ""
+msgstr "Aktywny"
 
 msgctxt "selection:ir.module.dependency,state:"
 msgid "Not Activated"
-msgstr ""
+msgstr "Nieaktywny"
 
 msgctxt "selection:ir.module.dependency,state:"
 msgid "To be activated"
-msgstr ""
+msgstr "Do aktywacji"
 
 msgctxt "selection:ir.module.dependency,state:"
 msgid "To be removed"
-msgstr ""
+msgstr "Do usunięcia"
 
 msgctxt "selection:ir.module.dependency,state:"
 msgid "To be upgraded"
-msgstr ""
+msgstr "Do aktualizacji"
 
 msgctxt "selection:ir.module.dependency,state:"
 msgid "Unknown"
-msgstr ""
+msgstr "Nieznany"
 
 msgctxt "selection:ir.sequence,type:"
 msgid "Decimal Timestamp"
-msgstr ""
+msgstr "Dziesiętny znak czasu"
 
 msgctxt "selection:ir.sequence,type:"
 msgid "Hexadecimal Timestamp"
-msgstr ""
+msgstr "Szesnastkowy znak czasu"
 
 msgctxt "selection:ir.sequence,type:"
 msgid "Incremental"
-msgstr ""
+msgstr "Przyrostowo"
 
 msgctxt "selection:ir.sequence.strict,type:"
 msgid "Decimal Timestamp"
-msgstr ""
+msgstr "Dziesiętny znak czasu"
 
 msgctxt "selection:ir.sequence.strict,type:"
 msgid "Hexadecimal Timestamp"
-msgstr ""
+msgstr "Szesnastkowy znak czasu"
 
 msgctxt "selection:ir.sequence.strict,type:"
 msgid "Incremental"
-msgstr ""
+msgstr "Przyrostowo"
 
 msgctxt "selection:ir.translation,type:"
 msgid "Error"
-msgstr ""
+msgstr "Błąd"
 
-#, fuzzy
 msgctxt "selection:ir.translation,type:"
 msgid "Field"
-msgstr "Fields"
+msgstr "Pole"
 
 msgctxt "selection:ir.translation,type:"
 msgid "Help"
-msgstr ""
+msgstr "Pomoc"
 
-#, fuzzy
 msgctxt "selection:ir.translation,type:"
 msgid "Model"
-msgstr "Models"
+msgstr "Model"
 
-#, fuzzy
 msgctxt "selection:ir.translation,type:"
 msgid "Report"
-msgstr "Reports"
+msgstr "Raport"
 
 msgctxt "selection:ir.translation,type:"
 msgid "Selection"
-msgstr ""
+msgstr "Zaznaczenie"
 
-#, fuzzy
 msgctxt "selection:ir.translation,type:"
 msgid "View"
-msgstr "Views"
+msgstr "Widok"
 
 msgctxt "selection:ir.translation,type:"
 msgid "Wizard Button"
-msgstr ""
+msgstr "Przycisk kreatora"
 
 msgctxt "selection:ir.ui.menu,action:"
 msgid ""
@@ -3883,19 +3790,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 ""
@@ -3903,280 +3810,280 @@ msgstr ""
 
 msgctxt "selection:ir.ui.view,type:"
 msgid "Board"
-msgstr ""
+msgstr "Tablica"
 
 msgctxt "selection:ir.ui.view,type:"
 msgid "Calendar"
-msgstr ""
+msgstr "Kalendarz"
 
 msgctxt "selection:ir.ui.view,type:"
 msgid "Form"
-msgstr ""
+msgstr "Formularz"
 
-#, fuzzy
 msgctxt "selection:ir.ui.view,type:"
 msgid "Graph"
-msgstr "Graph"
+msgstr "Wykres"
 
 msgctxt "selection:ir.ui.view,type:"
 msgid "Tree"
-msgstr ""
+msgstr "Drzewo"
 
 msgctxt "view:ir.action.act_window:"
 msgid "General"
-msgstr ""
+msgstr "Ogólne"
 
 msgctxt "view:ir.action.report:"
 msgid "General"
-msgstr ""
+msgstr "Ogólne"
 
 msgctxt "view:ir.action.url:"
 msgid "General"
-msgstr ""
+msgstr "Ogólne"
 
 msgctxt "view:ir.action.wizard:"
 msgid "General"
-msgstr ""
+msgstr "Ogólne"
 
 msgctxt "view:ir.action:"
 msgid "General"
-msgstr ""
+msgstr "Ogólne"
 
 msgctxt "view:ir.attachment:"
 msgid "Last Modification Time"
-msgstr ""
+msgstr "Czas ostatniej modyfikacji"
 
 msgctxt "view:ir.cron:"
 msgid "Action to trigger"
-msgstr ""
+msgstr "Akcja do wywołania"
 
 msgctxt "view:ir.cron:"
 msgid "Run Once"
-msgstr ""
+msgstr "Uruchom jednorazowo"
 
 msgctxt "view:ir.lang:"
 msgid "Date Formatting"
-msgstr ""
+msgstr "Formatowanie daty"
 
 msgctxt "view:ir.lang:"
 msgid "Numbers Formatting"
-msgstr ""
+msgstr "Formatowanie liczb"
 
 msgctxt "view:ir.model.data:"
 msgid "Sync"
-msgstr ""
+msgstr "Synchronizacja"
 
 msgctxt "view:ir.module.activate_upgrade.done:"
 msgid "The modules have been upgraded / activated."
-msgstr ""
+msgstr "Moduły zostały zaktualizowane / aktywowane."
 
 msgctxt "view:ir.module.activate_upgrade.start:"
 msgid "Note that this operation may take a few minutes."
-msgstr ""
+msgstr "Wykonanie operacji może zająć kilka minut."
 
 msgctxt "view:ir.module.activate_upgrade.start:"
 msgid "Your system will be upgraded."
-msgstr ""
+msgstr "System zostanie zaktualizowany."
 
 msgctxt "view:ir.module.config_wizard.done:"
 msgid "The configuration is done."
-msgstr ""
+msgstr "Konfiguracja została ukończona."
 
 msgctxt "view:ir.module.config_wizard.first:"
 msgid ""
 "You will be able to configure your installation depending on the modules you"
 " have installed."
 msgstr ""
+"Będziesz mógł skonfigurować swoją instalację w zależności od modułów, które "
+"zainstalowałeś."
 
 msgctxt "view:ir.module:"
 msgid "Cancel Activation"
-msgstr ""
+msgstr "Anuluj aktywację"
 
 msgctxt "view:ir.module:"
 msgid "Cancel Deactivation"
-msgstr ""
+msgstr "Anuluj deaktywację"
 
 msgctxt "view:ir.module:"
 msgid "Cancel Upgrade"
-msgstr ""
+msgstr "Anuluj aktualizację"
 
 msgctxt "view:ir.module:"
 msgid "Mark for Activation"
-msgstr ""
+msgstr "Oznacz do aktywacji"
 
 msgctxt "view:ir.module:"
 msgid "Mark for Deactivation (beta)"
-msgstr ""
+msgstr "Oznacz do dezaktywacji (beta)"
 
 msgctxt "view:ir.module:"
 msgid "Mark for Upgrade"
-msgstr ""
+msgstr "Oznacz do uaktualnienia"
 
-#, fuzzy
 msgctxt "view:ir.note:"
 msgid "Date"
 msgstr "Data"
 
 msgctxt "view:ir.note:"
 msgid "Time"
-msgstr ""
+msgstr "Czas"
 
 msgctxt "view:ir.note:"
 msgid "User"
-msgstr ""
+msgstr "Użytkownik"
 
 msgctxt "view:ir.rule.group:"
 msgid ""
 "If there is no test defined, the rule is always satisfied if not global"
 msgstr ""
+"Jeśli brak jest zdefiniowanego testu, reguła jeśli nie jest globalna zawsze "
+"spełnia wymagania"
 
 msgctxt "view:ir.rule.group:"
 msgid "The rule is satisfied if at least one test is True"
 msgstr ""
+"Reguła spełnia wymagania jeśli wynik przynajmniej jednego testu jest True"
 
 msgctxt "view:ir.sequence:"
 msgid "${day}"
-msgstr ""
+msgstr "${day}"
 
 msgctxt "view:ir.sequence:"
 msgid "${month}"
-msgstr ""
+msgstr "${month}"
 
 msgctxt "view:ir.sequence:"
 msgid "${year}"
-msgstr ""
+msgstr "${year}"
 
 msgctxt "view:ir.sequence:"
 msgid "Day:"
-msgstr ""
+msgstr "Dzień:"
 
 msgctxt "view:ir.sequence:"
 msgid "Incremental"
-msgstr ""
+msgstr "Przyrostowo"
 
 msgctxt "view:ir.sequence:"
 msgid "Legend (Placeholders for prefix, suffix)"
-msgstr ""
+msgstr "Legenda (Placeholders dla prefiksu, sufiksu)"
 
 msgctxt "view:ir.sequence:"
 msgid "Month:"
-msgstr ""
+msgstr "Miesiąc:"
 
 msgctxt "view:ir.sequence:"
 msgid "Timestamp"
-msgstr ""
+msgstr "Znak czasu"
 
 msgctxt "view:ir.sequence:"
 msgid "Year:"
-msgstr ""
+msgstr "Rok:"
 
-#, fuzzy
 msgctxt "view:ir.translation.clean.start:"
 msgid "Clean Translations?"
-msgstr "Clean Translations"
+msgstr "Oczyścić tłumaczenia?"
 
 msgctxt "view:ir.translation.clean.succeed:"
 msgid "Clean Translations Succeed!"
-msgstr ""
+msgstr "Oczyszczenie tłumaczeń udane!"
 
-#, fuzzy
 msgctxt "view:ir.translation.set.start:"
 msgid "Synchronize Translations?"
-msgstr "Synchronize Translations"
+msgstr "Zsynchronizować tłumaczenia?"
 
 msgctxt "view:ir.translation.set.succeed:"
 msgid "Set Succeed!"
-msgstr ""
+msgstr "Ustawienie udane!"
 
 msgctxt "view:ir.ui.view:"
 msgid "Show"
-msgstr ""
+msgstr "Wyświetl"
 
 msgctxt "wizard_button:ir.model.print_model_graph,start,end:"
 msgid "Cancel"
-msgstr ""
+msgstr "Anuluj"
 
 msgctxt "wizard_button:ir.model.print_model_graph,start,print_:"
 msgid "Print"
-msgstr ""
+msgstr "Wydruk"
 
 msgctxt "wizard_button:ir.module.activate_upgrade,done,config:"
 msgid "OK"
-msgstr ""
+msgstr "OK"
 
 msgctxt "wizard_button:ir.module.activate_upgrade,start,end:"
 msgid "Cancel"
-msgstr ""
+msgstr "Anuluj"
 
 msgctxt "wizard_button:ir.module.activate_upgrade,start,upgrade:"
 msgid "Start Upgrade"
-msgstr ""
+msgstr "Rozpocznij aktualizację"
 
 msgctxt "wizard_button:ir.module.config_wizard,done,end:"
 msgid "OK"
-msgstr ""
+msgstr "OK"
 
 msgctxt "wizard_button:ir.module.config_wizard,first,action:"
 msgid "OK"
-msgstr ""
+msgstr "OK"
 
 msgctxt "wizard_button:ir.module.config_wizard,first,end:"
 msgid "Cancel"
-msgstr ""
+msgstr "Anuluj"
 
 msgctxt "wizard_button:ir.module.config_wizard,other,action:"
 msgid "Next"
-msgstr ""
+msgstr "Następne"
 
 msgctxt "wizard_button:ir.module.config_wizard,other,end:"
 msgid "Cancel"
-msgstr ""
+msgstr "Anuluj"
 
 msgctxt "wizard_button:ir.translation.clean,start,clean:"
 msgid "Clean"
-msgstr ""
+msgstr "Wyczyść"
 
 msgctxt "wizard_button:ir.translation.clean,start,end:"
 msgid "Cancel"
-msgstr ""
+msgstr "Anuluj"
 
 msgctxt "wizard_button:ir.translation.clean,succeed,end:"
 msgid "OK"
-msgstr ""
+msgstr "OK"
 
 msgctxt "wizard_button:ir.translation.export,result,end:"
 msgid "Close"
-msgstr ""
+msgstr "Zamknij"
 
 msgctxt "wizard_button:ir.translation.export,start,end:"
 msgid "Cancel"
-msgstr ""
+msgstr "Anuluj"
 
-#, fuzzy
 msgctxt "wizard_button:ir.translation.export,start,export:"
 msgid "Export"
-msgstr "Exports"
+msgstr "Eksportuj"
 
 msgctxt "wizard_button:ir.translation.set,start,end:"
 msgid "Cancel"
-msgstr ""
+msgstr "Anuluj"
 
 msgctxt "wizard_button:ir.translation.set,start,set_:"
 msgid "Set"
-msgstr ""
+msgstr "Ustaw"
 
 msgctxt "wizard_button:ir.translation.set,succeed,end:"
 msgid "OK"
-msgstr ""
+msgstr "OK"
 
 msgctxt "wizard_button:ir.translation.update,start,end:"
 msgid "Cancel"
-msgstr ""
+msgstr "Anuluj"
 
 msgctxt "wizard_button:ir.translation.update,start,update:"
 msgid "Update"
-msgstr ""
+msgstr "Zaktualizuj"
 
 msgctxt "wizard_button:ir.ui.view.show,start,end:"
 msgid "Close"
-msgstr ""
+msgstr "Zamknij"
diff --git a/trytond/ir/locale/pt_BR.po b/trytond/ir/locale/pt_BR.po
index 4b29589..8906098 100644
--- a/trytond/ir/locale/pt_BR.po
+++ b/trytond/ir/locale/pt_BR.po
@@ -68,10 +68,9 @@ msgctxt "error:ir.action.report:"
 msgid "Invalid email definition on report \"%s\"."
 msgstr "E-mail inválido na definição do relatório\"%s\"."
 
-#, fuzzy
 msgctxt "error:ir.attachment:"
 msgid "The names of attachments must be unique by resource."
-msgstr "Os nomes dos anexos devem ser únicos por reurso!"
+msgstr "Os nomes dos anexos devem ser únicos por recurso!"
 
 msgctxt "error:ir.cron:"
 msgid "Scheduled action failed"
@@ -127,14 +126,13 @@ msgctxt "error:ir.model.access:"
 msgid "You can not write in this document! (%s)"
 msgstr "Você não pode editar este documento!(%s)"
 
-#, fuzzy
 msgctxt "error:ir.model.button.rule:"
 msgid ""
 "Condition \"%(condition)s\" is not a valid PYSON expression on button rule "
 "\"%(rule)s\"."
 msgstr ""
-"A condição \"%(condition)s\" não é uma expressão PYSON válida sobre o "
-"trigger \"%(trigger)s\"."
+"A condição \"%(condition)s\" não é uma expressão PYSON válida sobre a regra "
+"\"%(rule)s\" do botão."
 
 msgctxt "error:ir.model.button:"
 msgid "The button name in model must be unique!"
@@ -172,15 +170,15 @@ msgctxt "error:ir.module:"
 msgid ""
 "Some activated modules depend on the ones you are trying to deactivate:"
 msgstr ""
+"Alguns módulos ativados dependem nos que você está tentando desativar:"
 
 msgctxt "error:ir.module:"
 msgid "The name of the module must be unique!"
 msgstr "O nome do módulo deve ser único!"
 
-#, fuzzy
 msgctxt "error:ir.module:"
 msgid "You can not remove a module that is activated or will be activated"
-msgstr "Você não pode remover um módulo que está instalado ou será instalado."
+msgstr "Você não pode remover um módulo que está ativado ou que será ativado"
 
 msgctxt "error:ir.rule.group:"
 msgid "Global and Default are mutually exclusive!"
@@ -252,7 +250,7 @@ msgid ""
 "\"%(trigger)s\"."
 msgstr ""
 "A condição \"%(condition)s\" não é uma expressão PYSON válida sobre o "
-"trigger \"%(trigger)s\"."
+"gatilho \"%(trigger)s\"."
 
 msgctxt "error:ir.ui.menu:"
 msgid "\"%s\" is not a valid menu name because it is not allowed to contain \" / \"."
@@ -418,9 +416,13 @@ msgctxt "field:ir.action.act_window,context:"
 msgid "Context Value"
 msgstr "Valor do contexto"
 
+msgctxt "field:ir.action.act_window,context_domain:"
+msgid "Context Domain"
+msgstr "Contexto do Domínio"
+
 msgctxt "field:ir.action.act_window,context_model:"
 msgid "Context Model"
-msgstr ""
+msgstr "Contexto do Modelo"
 
 msgctxt "field:ir.action.act_window,create_date:"
 msgid "Create Date"
@@ -522,10 +524,9 @@ msgctxt "field:ir.action.act_window.domain,active:"
 msgid "Active"
 msgstr "Ativo"
 
-#, fuzzy
 msgctxt "field:ir.action.act_window.domain,count:"
 msgid "Count"
-msgstr "Contagem"
+msgstr "Quantidade"
 
 msgctxt "field:ir.action.act_window.domain,create_date:"
 msgid "Create Date"
@@ -683,6 +684,10 @@ msgctxt "field:ir.action.report,id:"
 msgid "ID"
 msgstr "ID"
 
+msgctxt "field:ir.action.report,is_custom:"
+msgid "Is Custom"
+msgstr "É personalizado"
+
 msgctxt "field:ir.action.report,keywords:"
 msgid "Keywords"
 msgstr "Palavras-chave"
@@ -901,7 +906,7 @@ msgstr "Descrição"
 
 msgctxt "field:ir.attachment,file_id:"
 msgid "File ID"
-msgstr ""
+msgstr "ID do Arquivo"
 
 msgctxt "field:ir.attachment,id:"
 msgid "ID"
@@ -1065,7 +1070,7 @@ msgstr "Repetir faltantes"
 
 msgctxt "field:ir.cron,request_user:"
 msgid "Request User"
-msgstr "Usuário da requisição"
+msgstr "Solicitar Usuário"
 
 msgctxt "field:ir.cron,user:"
 msgid "Execution User"
@@ -1313,7 +1318,7 @@ msgstr "Gravado pelo usuário"
 
 msgctxt "field:ir.model.button,clicks:"
 msgid "Clicks"
-msgstr ""
+msgstr "Cliques"
 
 msgctxt "field:ir.model.button,create_date:"
 msgid "Create Date"
@@ -1345,16 +1350,15 @@ msgstr "Nome"
 
 msgctxt "field:ir.model.button,reset:"
 msgid "Reset"
-msgstr ""
+msgstr "Reiniciar"
 
 msgctxt "field:ir.model.button,reset_by:"
 msgid "Reset by"
-msgstr ""
+msgstr "Reiniciado por"
 
-#, fuzzy
 msgctxt "field:ir.model.button,rules:"
 msgid "Rules"
-msgstr "Regra"
+msgstr "Regras"
 
 msgctxt "field:ir.model.button,write_date:"
 msgid "Write Date"
@@ -1364,138 +1368,113 @@ msgctxt "field:ir.model.button,write_uid:"
 msgid "Write User"
 msgstr "Gravado pelo usuário"
 
-#, fuzzy
 msgctxt "field:ir.model.button-button.reset,button:"
 msgid "Button"
 msgstr "Botão"
 
 msgctxt "field:ir.model.button-button.reset,button_ruled:"
 msgid "Button Ruled"
-msgstr ""
+msgstr "Regra do Botão (Button Ruled)"
 
-#, fuzzy
 msgctxt "field:ir.model.button-button.reset,create_date:"
 msgid "Create Date"
 msgstr "Data de criação"
 
-#, fuzzy
 msgctxt "field:ir.model.button-button.reset,create_uid:"
 msgid "Create User"
 msgstr "Criado por"
 
-#, fuzzy
 msgctxt "field:ir.model.button-button.reset,id:"
 msgid "ID"
 msgstr "ID"
 
-#, fuzzy
 msgctxt "field:ir.model.button-button.reset,rec_name:"
 msgid "Name"
 msgstr "Nome"
 
-#, fuzzy
 msgctxt "field:ir.model.button-button.reset,write_date:"
 msgid "Write Date"
 msgstr "Data de edição"
 
-#, fuzzy
 msgctxt "field:ir.model.button-button.reset,write_uid:"
 msgid "Write User"
-msgstr "Gravado pelo usuário"
+msgstr "Editado por"
 
-#, fuzzy
 msgctxt "field:ir.model.button.click,active:"
 msgid "Active"
 msgstr "Ativo"
 
-#, fuzzy
 msgctxt "field:ir.model.button.click,button:"
 msgid "Button"
 msgstr "Botão"
 
-#, fuzzy
 msgctxt "field:ir.model.button.click,create_date:"
 msgid "Create Date"
 msgstr "Data de criação"
 
-#, fuzzy
 msgctxt "field:ir.model.button.click,create_uid:"
 msgid "Create User"
 msgstr "Criado por"
 
-#, fuzzy
 msgctxt "field:ir.model.button.click,id:"
 msgid "ID"
 msgstr "ID"
 
-#, fuzzy
 msgctxt "field:ir.model.button.click,rec_name:"
 msgid "Name"
 msgstr "Nome"
 
-#, fuzzy
 msgctxt "field:ir.model.button.click,record_id:"
 msgid "Record ID"
 msgstr "ID do registro"
 
-#, fuzzy
 msgctxt "field:ir.model.button.click,write_date:"
 msgid "Write Date"
 msgstr "Data de edição"
 
-#, fuzzy
 msgctxt "field:ir.model.button.click,write_uid:"
 msgid "Write User"
-msgstr "Gravado pelo usuário"
+msgstr "Editado por"
 
-#, fuzzy
 msgctxt "field:ir.model.button.rule,button:"
 msgid "Button"
 msgstr "Botão"
 
-#, fuzzy
 msgctxt "field:ir.model.button.rule,condition:"
 msgid "Condition"
 msgstr "Condição"
 
-#, fuzzy
 msgctxt "field:ir.model.button.rule,create_date:"
 msgid "Create Date"
 msgstr "Data de criação"
 
-#, fuzzy
 msgctxt "field:ir.model.button.rule,create_uid:"
 msgid "Create User"
 msgstr "Criado por"
 
-#, fuzzy
 msgctxt "field:ir.model.button.rule,description:"
 msgid "Description"
 msgstr "Descrição"
 
-#, fuzzy
 msgctxt "field:ir.model.button.rule,id:"
 msgid "ID"
 msgstr "ID"
 
 msgctxt "field:ir.model.button.rule,number_user:"
 msgid "Number of User"
-msgstr ""
+msgstr "Número do Usuário"
 
-#, fuzzy
 msgctxt "field:ir.model.button.rule,rec_name:"
 msgid "Name"
 msgstr "Nome"
 
-#, fuzzy
 msgctxt "field:ir.model.button.rule,write_date:"
 msgid "Write Date"
 msgstr "Data de edição"
 
-#, fuzzy
 msgctxt "field:ir.model.button.rule,write_uid:"
 msgid "Write User"
-msgstr "Gravado pelo usuário"
+msgstr "Editado por"
 
 msgctxt "field:ir.model.data,create_date:"
 msgid "Create Date"
@@ -1721,17 +1700,14 @@ msgctxt "field:ir.module,write_uid:"
 msgid "Write User"
 msgstr "Gravado pelo usuário"
 
-#, fuzzy
 msgctxt "field:ir.module.activate_upgrade.done,id:"
 msgid "ID"
 msgstr "ID"
 
-#, fuzzy
 msgctxt "field:ir.module.activate_upgrade.start,id:"
 msgid "ID"
 msgstr "ID"
 
-#, fuzzy
 msgctxt "field:ir.module.activate_upgrade.start,module_info:"
 msgid "Modules to update"
 msgstr "Módulos a atualizar"
@@ -1824,140 +1800,85 @@ msgctxt "field:ir.module.dependency,write_uid:"
 msgid "Write User"
 msgstr "Gravado pelo usuário"
 
-#, fuzzy
 msgctxt "field:ir.note,create_date:"
 msgid "Create Date"
-msgstr "Data de criação"
+msgstr "Data de Criação"
 
-#, fuzzy
 msgctxt "field:ir.note,create_uid:"
 msgid "Create User"
 msgstr "Criado por"
 
-#, fuzzy
 msgctxt "field:ir.note,id:"
 msgid "ID"
 msgstr "ID"
 
-#, fuzzy
 msgctxt "field:ir.note,last_modification:"
 msgid "Last Modification"
 msgstr "Última modificação"
 
-#, fuzzy
 msgctxt "field:ir.note,last_user:"
 msgid "Last User"
 msgstr "Último usuário"
 
-#, fuzzy
 msgctxt "field:ir.note,message:"
 msgid "Message"
 msgstr "Mensagem"
 
-#, fuzzy
 msgctxt "field:ir.note,message_wrapped:"
 msgid "Message"
 msgstr "Mensagem"
 
-#, fuzzy
 msgctxt "field:ir.note,rec_name:"
 msgid "Name"
 msgstr "Nome"
 
-#, fuzzy
 msgctxt "field:ir.note,resource:"
 msgid "Resource"
 msgstr "Recurso"
 
 msgctxt "field:ir.note,unread:"
 msgid "Unread"
-msgstr ""
+msgstr "Não lida"
 
-#, fuzzy
 msgctxt "field:ir.note,write_date:"
 msgid "Write Date"
 msgstr "Data de edição"
 
-#, fuzzy
 msgctxt "field:ir.note,write_uid:"
 msgid "Write User"
-msgstr "Gravado pelo usuário"
+msgstr "Editado por"
 
-#, fuzzy
 msgctxt "field:ir.note.read,create_date:"
 msgid "Create Date"
 msgstr "Data de criação"
 
-#, fuzzy
 msgctxt "field:ir.note.read,create_uid:"
 msgid "Create User"
 msgstr "Criado por"
 
-#, fuzzy
 msgctxt "field:ir.note.read,id:"
 msgid "ID"
 msgstr "ID"
 
-#, fuzzy
 msgctxt "field:ir.note.read,note:"
 msgid "Note"
-msgstr "Observação"
+msgstr "Nota"
 
-#, fuzzy
 msgctxt "field:ir.note.read,rec_name:"
 msgid "Name"
 msgstr "Nome"
 
-#, fuzzy
 msgctxt "field:ir.note.read,user:"
 msgid "User"
 msgstr "Usuário"
 
-#, fuzzy
 msgctxt "field:ir.note.read,write_date:"
 msgid "Write Date"
 msgstr "Data de edição"
 
-#, fuzzy
 msgctxt "field:ir.note.read,write_uid:"
 msgid "Write User"
-msgstr "Gravado pelo usuário"
-
-msgctxt "field:ir.property,create_date:"
-msgid "Create Date"
-msgstr "Data de criação"
-
-msgctxt "field:ir.property,create_uid:"
-msgid "Create User"
-msgstr "Criado por"
-
-msgctxt "field:ir.property,field:"
-msgid "Field"
-msgstr "Campo"
-
-msgctxt "field:ir.property,id:"
-msgid "ID"
-msgstr "ID"
-
-msgctxt "field:ir.property,rec_name:"
-msgid "Name"
-msgstr "Nome"
-
-msgctxt "field:ir.property,res:"
-msgid "Resource"
-msgstr "Recurso"
-
-msgctxt "field:ir.property,value:"
-msgid "Value"
-msgstr "Avaliar"
-
-msgctxt "field:ir.property,write_date:"
-msgid "Write Date"
-msgstr "Data de edição"
-
-msgctxt "field:ir.property,write_uid:"
-msgid "Write User"
-msgstr "Gravado pelo usuário"
+msgstr "Editado por"
 
 msgctxt "field:ir.rule,create_date:"
 msgid "Create Date"
@@ -2309,7 +2230,7 @@ msgstr "Criado por"
 
 msgctxt "field:ir.translation,fuzzy:"
 msgid "Fuzzy"
-msgstr "Aproximado (fuzzy)"
+msgstr "Vago"
 
 msgctxt "field:ir.translation,id:"
 msgid "ID"
@@ -2505,7 +2426,7 @@ msgstr "ID do registro"
 
 msgctxt "field:ir.trigger.log,trigger:"
 msgid "Trigger"
-msgstr "Trigger"
+msgstr "Gatilho"
 
 msgctxt "field:ir.trigger.log,write_date:"
 msgid "Write Date"
@@ -2859,6 +2780,10 @@ msgctxt "field:ir.ui.view_tree_width,write_uid:"
 msgid "Write User"
 msgstr "Gravado pelo usuário"
 
+msgctxt "help:ir.action.act_window,context_domain:"
+msgid "Part of the domain that will be evaluated on each refresh"
+msgstr "Parte do domínio que será avaliado em cada atualização"
+
 msgctxt "help:ir.action.act_window,limit:"
 msgid "Default limit for the list view"
 msgstr "Limit padrão para a listagem"
@@ -2897,7 +2822,7 @@ msgstr ""
 
 msgctxt "help:ir.cron,request_user:"
 msgid "The user who will receive requests in case of failure"
-msgstr "O usuário que irá receber a requisição em caso de falha."
+msgstr "O usuário que receberá a solicitação em caso de falha."
 
 msgctxt "help:ir.cron,user:"
 msgid "The user used to execute this action"
@@ -2913,9 +2838,8 @@ msgstr "Módulo no qual este modelo está definido"
 
 msgctxt "help:ir.model.button,reset_by:"
 msgid "Button that should reset the rules"
-msgstr ""
+msgstr "Botão que reiniciará as regras"
 
-#, fuzzy
 msgctxt "help:ir.model.button.rule,condition:"
 msgid ""
 "A PYSON statement evaluated with the record represented by \"self\"\n"
@@ -3058,11 +2982,11 @@ msgstr "Acesso a modelos"
 
 msgctxt "model:ir.action,name:act_model_access_form_relate_model"
 msgid "Access"
-msgstr ""
+msgstr "Acesso"
 
 msgctxt "model:ir.action,name:act_model_button_click_form_relate_model_button"
 msgid "Clicks"
-msgstr ""
+msgstr "Cliques"
 
 msgctxt "model:ir.action,name:act_model_button_form"
 msgid "Buttons"
@@ -3078,7 +3002,7 @@ msgstr "Acesso a campos"
 
 msgctxt "model:ir.action,name:act_model_field_access_form_relate_field"
 msgid "Access"
-msgstr ""
+msgstr "Acesso"
 
 msgctxt "model:ir.action,name:act_model_fields_form"
 msgid "Fields"
@@ -3088,10 +3012,9 @@ msgctxt "model:ir.action,name:act_model_form"
 msgid "Models"
 msgstr "Modelos"
 
-#, fuzzy
 msgctxt "model:ir.action,name:act_module_activate_upgrade"
 msgid "Perform Pending Activation/Upgrade"
-msgstr "Realizar instalações/atualizações pendentes"
+msgstr "Realizar Ativações/Atualizações Pendentes"
 
 msgctxt "model:ir.action,name:act_module_config"
 msgid "Configure Modules"
@@ -3105,18 +3028,9 @@ msgctxt "model:ir.action,name:act_module_form"
 msgid "Modules"
 msgstr "Módulos"
 
-#, fuzzy
 msgctxt "model:ir.action,name:act_note_form"
 msgid "Notes"
-msgstr "Observações"
-
-msgctxt "model:ir.action,name:act_property_form"
-msgid "Properties"
-msgstr "Propriedades"
-
-msgctxt "model:ir.action,name:act_property_form_default"
-msgid "Default Properties"
-msgstr "Propriedades Padrão"
+msgstr "Notas"
 
 msgctxt "model:ir.action,name:act_rule_group_form"
 msgid "Record Rules"
@@ -3146,7 +3060,10 @@ msgctxt "model:ir.action,name:act_translation_form"
 msgid "Translations"
 msgstr "Traduções"
 
-#, fuzzy
+msgctxt "model:ir.action,name:act_translation_report"
+msgid "Translations"
+msgstr "Traduções"
+
 msgctxt "model:ir.action,name:act_translation_set"
 msgid "Set Translations"
 msgstr "Definir traduções"
@@ -3157,7 +3074,7 @@ msgstr "Sincronizar traduções"
 
 msgctxt "model:ir.action,name:act_trigger_form"
 msgid "Triggers"
-msgstr "Triggers"
+msgstr "Gatilhos"
 
 msgctxt "model:ir.action,name:act_view_form"
 msgid "Views"
@@ -3189,7 +3106,11 @@ msgstr "Grafo"
 
 msgctxt "model:ir.action,name:report_model_workflow_graph"
 msgid "Workflow Graph"
-msgstr ""
+msgstr "Grafo do Fluxo de Trabalho (Workflow)"
+
+msgctxt "model:ir.action,name:wizard_translation_report"
+msgid "Translations"
+msgstr "Traduções"
 
 msgctxt "model:ir.action.act_window,name:"
 msgid "Action act window"
@@ -3209,6 +3130,16 @@ msgctxt ""
 msgid "Out of Sync"
 msgstr "Fora de Sincronia"
 
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_translation_form_domain_local"
+msgid "Local"
+msgstr "Local"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_translation_form_domain_module"
+msgid "Modules"
+msgstr "Módulos"
+
 msgctxt "model:ir.action.act_window.view,name:"
 msgid "Action act window view"
 msgstr "Tela de janela de ato de ação"
@@ -3281,14 +3212,13 @@ msgctxt "model:ir.lang,name:lang_en"
 msgid "English"
 msgstr "Inglês"
 
-#, fuzzy
 msgctxt "model:ir.lang,name:lang_es"
 msgid "Spanish"
 msgstr "Espanhol (Espanha)"
 
 msgctxt "model:ir.lang,name:lang_es_419"
 msgid "Spanish (Latin American)"
-msgstr ""
+msgstr "Espanhol (América Latina)"
 
 msgctxt "model:ir.lang,name:lang_fr"
 msgid "French"
@@ -3303,8 +3233,8 @@ msgid "Italian"
 msgstr "Italiano"
 
 msgctxt "model:ir.lang,name:lang_lo"
-msgid "ລາວ"
-msgstr ""
+msgid "Lao"
+msgstr "Lao"
 
 msgctxt "model:ir.lang,name:lang_lt"
 msgid "Lithuanian"
@@ -3314,6 +3244,10 @@ msgctxt "model:ir.lang,name:lang_nl"
 msgid "Dutch"
 msgstr "Holandês"
 
+msgctxt "model:ir.lang,name:lang_pl"
+msgid "Polish"
+msgstr "Polonês"
+
 msgctxt "model:ir.lang,name:lang_pt_BR"
 msgid "Portuguese (Brazil)"
 msgstr "Português (Brasil)"
@@ -3327,8 +3261,8 @@ msgid "Slovenian"
 msgstr "Esloveno"
 
 msgctxt "model:ir.lang,name:lang_zh_CN"
-msgid "中国(简体)"
-msgstr ""
+msgid "Chinese Simplified"
+msgstr "Chinês Simplificado"
 
 msgctxt "model:ir.model,name:"
 msgid "Model"
@@ -3344,15 +3278,15 @@ msgstr "Botão do modelo"
 
 msgctxt "model:ir.model.button-button.reset,name:"
 msgid "Model Button Reset"
-msgstr ""
+msgstr "Reiniciar Botão do Modelo"
 
 msgctxt "model:ir.model.button.click,name:"
 msgid "Model Button Click"
-msgstr ""
+msgstr "Clique no Botão do Modelo"
 
 msgctxt "model:ir.model.button.rule,name:"
 msgid "Model Button Rule"
-msgstr ""
+msgstr "Regra do Botão do Modelo"
 
 msgctxt "model:ir.model.data,name:"
 msgid "Model data"
@@ -3374,15 +3308,13 @@ msgctxt "model:ir.module,name:"
 msgid "Module"
 msgstr "Módulo"
 
-#, fuzzy
 msgctxt "model:ir.module.activate_upgrade.done,name:"
 msgid "Module Activate Upgrade Done"
-msgstr "Atualização / Instalação do módulo terminada"
+msgstr "Ativação do Módulo Concluída"
 
-#, fuzzy
 msgctxt "model:ir.module.activate_upgrade.start,name:"
 msgid "Module Activate Upgrade Start"
-msgstr "Iniciar a Atualização / Instalação do módulo"
+msgstr "Iniciar a Atualização do Módulo"
 
 msgctxt "model:ir.module.config_wizard.done,name:"
 msgid "Module Config Wizard Done"
@@ -3392,11 +3324,9 @@ msgctxt "model:ir.module.config_wizard.first,name:"
 msgid "Module Config Wizard First"
 msgstr "Primeiro assistente de configuração do módulo"
 
-#, fuzzy
 msgctxt "model:ir.module.config_wizard.item,name:"
 msgid "Config wizard to run after activating a module"
-msgstr ""
-"Assistente de configuração a ser executado após a instalação do módulo"
+msgstr "Assistente de configuração a ser executado após ativar um módulo"
 
 msgctxt "model:ir.module.config_wizard.other,name:"
 msgid "Module Config Wizard Other"
@@ -3406,18 +3336,13 @@ msgctxt "model:ir.module.dependency,name:"
 msgid "Module dependency"
 msgstr "Dependência do módulo"
 
-#, fuzzy
 msgctxt "model:ir.note,name:"
 msgid "Note"
-msgstr "Observação"
+msgstr "Nota"
 
 msgctxt "model:ir.note.read,name:"
 msgid "Note Read"
-msgstr ""
-
-msgctxt "model:ir.property,name:"
-msgid "Property"
-msgstr "Propriedade"
+msgstr "Nota Lida"
 
 msgctxt "model:ir.rule,name:"
 msgid "Rule"
@@ -3481,11 +3406,11 @@ msgstr "Atualizar tradução"
 
 msgctxt "model:ir.trigger,name:"
 msgid "Trigger"
-msgstr "Trigger"
+msgstr "Gatilhos"
 
 msgctxt "model:ir.trigger.log,name:"
 msgid "Trigger Log"
-msgstr "Registro do trigger"
+msgstr "Registro de Gatilhos"
 
 msgctxt "model:ir.ui.icon,name:"
 msgid "Icon"
@@ -3583,10 +3508,9 @@ msgctxt "model:ir.ui.menu,name:menu_models"
 msgid "Models"
 msgstr "Modelos"
 
-#, fuzzy
 msgctxt "model:ir.ui.menu,name:menu_module_activate_upgrade"
 msgid "Perform Pending Activation/Upgrade"
-msgstr "Realizar instalações/atualizações pendentes"
+msgstr "Realizar Ativações/Atualizações Pendentes"
 
 msgctxt "model:ir.ui.menu,name:menu_module_form"
 msgid "Modules"
@@ -3596,18 +3520,9 @@ msgctxt "model:ir.ui.menu,name:menu_modules"
 msgid "Modules"
 msgstr "Módulos"
 
-#, fuzzy
 msgctxt "model:ir.ui.menu,name:menu_note_form"
 msgid "Notes"
-msgstr "Observações"
-
-msgctxt "model:ir.ui.menu,name:menu_property_form"
-msgid "Properties"
-msgstr "Propriedades"
-
-msgctxt "model:ir.ui.menu,name:menu_property_form_default"
-msgid "Default Properties"
-msgstr "Propriedades padrão"
+msgstr "Notas"
 
 msgctxt "model:ir.ui.menu,name:menu_rule_group_form"
 msgid "Record Rules"
@@ -3651,7 +3566,7 @@ msgstr "Sincronizar traduções"
 
 msgctxt "model:ir.ui.menu,name:menu_trigger_form"
 msgid "Triggers"
-msgstr "Triggers"
+msgstr "Gatilhos"
 
 msgctxt "model:ir.ui.menu,name:menu_ui"
 msgid "User Interface"
@@ -3759,15 +3674,15 @@ msgstr "Direta para a esquerda"
 
 msgctxt "selection:ir.module,state:"
 msgid "Activated"
-msgstr ""
+msgstr "Ativo"
 
 msgctxt "selection:ir.module,state:"
 msgid "Not Activated"
-msgstr ""
+msgstr "Inativo"
 
 msgctxt "selection:ir.module,state:"
 msgid "To be activated"
-msgstr ""
+msgstr "A ser ativado"
 
 msgctxt "selection:ir.module,state:"
 msgid "To be removed"
@@ -3787,15 +3702,15 @@ msgstr "Abrir"
 
 msgctxt "selection:ir.module.dependency,state:"
 msgid "Activated"
-msgstr ""
+msgstr "Ativo"
 
 msgctxt "selection:ir.module.dependency,state:"
 msgid "Not Activated"
-msgstr ""
+msgstr "Inativo"
 
 msgctxt "selection:ir.module.dependency,state:"
 msgid "To be activated"
-msgstr ""
+msgstr "A ser ativado"
 
 msgctxt "selection:ir.module.dependency,state:"
 msgid "To be removed"
@@ -3849,7 +3764,6 @@ msgctxt "selection:ir.translation,type:"
 msgid "Model"
 msgstr "Modelo"
 
-#, fuzzy
 msgctxt "selection:ir.translation,type:"
 msgid "Report"
 msgstr "Relatório"
@@ -3866,10 +3780,9 @@ msgctxt "selection:ir.translation,type:"
 msgid "Wizard Button"
 msgstr "Botão do Assistente"
 
-#, fuzzy
 msgctxt "selection:ir.ui.menu,action:"
 msgid ""
-msgstr "Português (Brasil)"
+msgstr ""
 
 msgctxt "selection:ir.ui.menu,action:"
 msgid "ir.action.act_window"
@@ -3937,11 +3850,11 @@ msgstr "Hora da última modificação"
 
 msgctxt "view:ir.cron:"
 msgid "Action to trigger"
-msgstr "Ação a disparar"
+msgstr "Ação a Disparar"
 
 msgctxt "view:ir.cron:"
 msgid "Run Once"
-msgstr ""
+msgstr "Executar uma vez"
 
 msgctxt "view:ir.lang:"
 msgid "Date Formatting"
@@ -3955,17 +3868,14 @@ msgctxt "view:ir.model.data:"
 msgid "Sync"
 msgstr "Sincronizar"
 
-#, fuzzy
 msgctxt "view:ir.module.activate_upgrade.done:"
 msgid "The modules have been upgraded / activated."
-msgstr "Os módulos foram atualizados/instalados!"
+msgstr "Os módulos foram atualizados / ativados."
 
-#, fuzzy
 msgctxt "view:ir.module.activate_upgrade.start:"
 msgid "Note that this operation may take a few minutes."
-msgstr "Esta operação pode levar alguns minutos."
+msgstr "Observação: Esta operação pode levar alguns minutos."
 
-#, fuzzy
 msgctxt "view:ir.module.activate_upgrade.start:"
 msgid "Your system will be upgraded."
 msgstr "Seu sistema será atualizado."
@@ -3983,11 +3893,11 @@ msgstr ""
 
 msgctxt "view:ir.module:"
 msgid "Cancel Activation"
-msgstr ""
+msgstr "Cancelar Ativação"
 
 msgctxt "view:ir.module:"
 msgid "Cancel Deactivation"
-msgstr ""
+msgstr "Cancelar Desativação"
 
 msgctxt "view:ir.module:"
 msgid "Cancel Upgrade"
@@ -3995,27 +3905,24 @@ msgstr "Cancelar atualização"
 
 msgctxt "view:ir.module:"
 msgid "Mark for Activation"
-msgstr ""
+msgstr "Marcar para Ativação"
 
 msgctxt "view:ir.module:"
 msgid "Mark for Deactivation (beta)"
-msgstr ""
+msgstr "Marcar para Desativação (beta)"
 
 msgctxt "view:ir.module:"
 msgid "Mark for Upgrade"
 msgstr "Marcar para desinstação (beta)"
 
-#, fuzzy
 msgctxt "view:ir.note:"
 msgid "Date"
 msgstr "Data"
 
-#, fuzzy
 msgctxt "view:ir.note:"
 msgid "Time"
 msgstr "Tempo"
 
-#, fuzzy
 msgctxt "view:ir.note:"
 msgid "User"
 msgstr "Usuário"
@@ -4095,17 +4002,14 @@ msgctxt "wizard_button:ir.model.print_model_graph,start,print_:"
 msgid "Print"
 msgstr "Imprimir"
 
-#, fuzzy
 msgctxt "wizard_button:ir.module.activate_upgrade,done,config:"
 msgid "OK"
 msgstr "OK"
 
-#, fuzzy
 msgctxt "wizard_button:ir.module.activate_upgrade,start,end:"
 msgid "Cancel"
 msgstr "Cancelar"
 
-#, fuzzy
 msgctxt "wizard_button:ir.module.activate_upgrade,start,upgrade:"
 msgid "Start Upgrade"
 msgstr "Iniciar Atualização"
diff --git a/trytond/ir/locale/ru.po b/trytond/ir/locale/ru.po
index 9e781bc..d86155b 100644
--- a/trytond/ir/locale/ru.po
+++ b/trytond/ir/locale/ru.po
@@ -401,6 +401,10 @@ msgctxt "field:ir.action.act_window,context:"
 msgid "Context Value"
 msgstr "Значение контекста"
 
+msgctxt "field:ir.action.act_window,context_domain:"
+msgid "Context Domain"
+msgstr ""
+
 msgctxt "field:ir.action.act_window,context_model:"
 msgid "Context Model"
 msgstr ""
@@ -667,6 +671,10 @@ msgctxt "field:ir.action.report,id:"
 msgid "ID"
 msgstr "ID"
 
+msgctxt "field:ir.action.report,is_custom:"
+msgid "Is Custom"
+msgstr ""
+
 msgctxt "field:ir.action.report,keywords:"
 msgid "Keywords"
 msgstr "Ключевые слова"
@@ -1905,42 +1913,6 @@ msgctxt "field:ir.note.read,write_uid:"
 msgid "Write User"
 msgstr "Изменено пользователем"
 
-msgctxt "field:ir.property,create_date:"
-msgid "Create Date"
-msgstr "Дата создания"
-
-msgctxt "field:ir.property,create_uid:"
-msgid "Create User"
-msgstr "Создано пользователем"
-
-msgctxt "field:ir.property,field:"
-msgid "Field"
-msgstr "Поле"
-
-msgctxt "field:ir.property,id:"
-msgid "ID"
-msgstr "ID"
-
-msgctxt "field:ir.property,rec_name:"
-msgid "Name"
-msgstr "Наименование"
-
-msgctxt "field:ir.property,res:"
-msgid "Resource"
-msgstr "Ресурс"
-
-msgctxt "field:ir.property,value:"
-msgid "Value"
-msgstr "Значение"
-
-msgctxt "field:ir.property,write_date:"
-msgid "Write Date"
-msgstr "Дата изменения"
-
-msgctxt "field:ir.property,write_uid:"
-msgid "Write User"
-msgstr "Изменено пользователем"
-
 msgctxt "field:ir.rule,create_date:"
 msgid "Create Date"
 msgstr "Дата создания"
@@ -2851,6 +2823,10 @@ msgctxt "field:ir.ui.view_tree_width,write_uid:"
 msgid "Write User"
 msgstr "Изменено пользователем"
 
+msgctxt "help:ir.action.act_window,context_domain:"
+msgid "Part of the domain that will be evaluated on each refresh"
+msgstr ""
+
 msgctxt "help:ir.action.act_window,limit:"
 msgid "Default limit for the list view"
 msgstr "По умолчанию кол-во записей в списке"
@@ -3101,14 +3077,6 @@ msgctxt "model:ir.action,name:act_note_form"
 msgid "Notes"
 msgstr "Комментарии"
 
-msgctxt "model:ir.action,name:act_property_form"
-msgid "Properties"
-msgstr "Свойства"
-
-msgctxt "model:ir.action,name:act_property_form_default"
-msgid "Default Properties"
-msgstr "Свойства по умолчанию"
-
 msgctxt "model:ir.action,name:act_rule_group_form"
 msgid "Record Rules"
 msgstr "Запись правил"
@@ -3138,6 +3106,11 @@ msgid "Translations"
 msgstr "Переводы"
 
 #, fuzzy
+msgctxt "model:ir.action,name:act_translation_report"
+msgid "Translations"
+msgstr "Переводы"
+
+#, fuzzy
 msgctxt "model:ir.action,name:act_translation_set"
 msgid "Set Translations"
 msgstr "Применить переводы"
@@ -3182,6 +3155,11 @@ msgctxt "model:ir.action,name:report_model_workflow_graph"
 msgid "Workflow Graph"
 msgstr ""
 
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_translation_report"
+msgid "Translations"
+msgstr "Переводы"
+
 msgctxt "model:ir.action.act_window,name:"
 msgid "Action act window"
 msgstr "Действие окна"
@@ -3201,6 +3179,17 @@ msgctxt ""
 msgid "Out of Sync"
 msgstr ""
 
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_translation_form_domain_local"
+msgid "Local"
+msgstr ""
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_translation_form_domain_module"
+msgid "Modules"
+msgstr "Модули"
+
 msgctxt "model:ir.action.act_window.view,name:"
 msgid "Action act window view"
 msgstr "Действие окна вида"
@@ -3296,7 +3285,7 @@ msgid "Italian"
 msgstr ""
 
 msgctxt "model:ir.lang,name:lang_lo"
-msgid "ລາວ"
+msgid "Lao"
 msgstr ""
 
 msgctxt "model:ir.lang,name:lang_lt"
@@ -3307,6 +3296,10 @@ msgctxt "model:ir.lang,name:lang_nl"
 msgid "Dutch"
 msgstr "Голландский"
 
+msgctxt "model:ir.lang,name:lang_pl"
+msgid "Polish"
+msgstr ""
+
 msgctxt "model:ir.lang,name:lang_pt_BR"
 msgid "Portuguese (Brazil)"
 msgstr ""
@@ -3320,7 +3313,7 @@ msgid "Slovenian"
 msgstr ""
 
 msgctxt "model:ir.lang,name:lang_zh_CN"
-msgid "中国(简体)"
+msgid "Chinese Simplified"
 msgstr ""
 
 msgctxt "model:ir.model,name:"
@@ -3408,10 +3401,6 @@ msgctxt "model:ir.note.read,name:"
 msgid "Note Read"
 msgstr ""
 
-msgctxt "model:ir.property,name:"
-msgid "Property"
-msgstr "Свойства"
-
 msgctxt "model:ir.rule,name:"
 msgid "Rule"
 msgstr "Правило"
@@ -3595,14 +3584,6 @@ msgctxt "model:ir.ui.menu,name:menu_note_form"
 msgid "Notes"
 msgstr "Комментарии"
 
-msgctxt "model:ir.ui.menu,name:menu_property_form"
-msgid "Properties"
-msgstr "Свойства"
-
-msgctxt "model:ir.ui.menu,name:menu_property_form_default"
-msgid "Default Properties"
-msgstr "Свойства по умолчанию"
-
 msgctxt "model:ir.ui.menu,name:menu_rule_group_form"
 msgid "Record Rules"
 msgstr "Запись правил"
diff --git a/trytond/ir/locale/sl.po b/trytond/ir/locale/sl.po
index 45e910b..a4c12f2 100644
--- a/trytond/ir/locale/sl.po
+++ b/trytond/ir/locale/sl.po
@@ -414,6 +414,10 @@ msgctxt "field:ir.action.act_window,context:"
 msgid "Context Value"
 msgstr "Vrednost konteksta"
 
+msgctxt "field:ir.action.act_window,context_domain:"
+msgid "Context Domain"
+msgstr "Kontekstna domena"
+
 msgctxt "field:ir.action.act_window,context_model:"
 msgid "Context Model"
 msgstr "Kontekstni model"
@@ -518,7 +522,6 @@ msgctxt "field:ir.action.act_window.domain,active:"
 msgid "Active"
 msgstr "Aktivno"
 
-#, fuzzy
 msgctxt "field:ir.action.act_window.domain,count:"
 msgid "Count"
 msgstr "Število"
@@ -679,6 +682,10 @@ msgctxt "field:ir.action.report,id:"
 msgid "ID"
 msgstr "ID"
 
+msgctxt "field:ir.action.report,is_custom:"
+msgid "Is Custom"
+msgstr "Po meri"
+
 msgctxt "field:ir.action.report,keywords:"
 msgid "Keywords"
 msgstr "Ključne besede"
@@ -1359,7 +1366,6 @@ msgctxt "field:ir.model.button,write_uid:"
 msgid "Write User"
 msgstr "Zapisal"
 
-#, fuzzy
 msgctxt "field:ir.model.button-button.reset,button:"
 msgid "Button"
 msgstr "Gumb"
@@ -1368,17 +1374,14 @@ msgctxt "field:ir.model.button-button.reset,button_ruled:"
 msgid "Button Ruled"
 msgstr "Gumbi s pravili"
 
-#, fuzzy
 msgctxt "field:ir.model.button-button.reset,create_date:"
 msgid "Create Date"
 msgstr "Izdelano"
 
-#, fuzzy
 msgctxt "field:ir.model.button-button.reset,create_uid:"
 msgid "Create User"
 msgstr "Izdelal"
 
-#, fuzzy
 msgctxt "field:ir.model.button-button.reset,id:"
 msgid "ID"
 msgstr "ID"
@@ -1387,37 +1390,30 @@ msgctxt "field:ir.model.button-button.reset,rec_name:"
 msgid "Name"
 msgstr "Ime"
 
-#, fuzzy
 msgctxt "field:ir.model.button-button.reset,write_date:"
 msgid "Write Date"
 msgstr "Zapisano"
 
-#, fuzzy
 msgctxt "field:ir.model.button-button.reset,write_uid:"
 msgid "Write User"
 msgstr "Zapisal"
 
-#, fuzzy
 msgctxt "field:ir.model.button.click,active:"
 msgid "Active"
 msgstr "Aktivno"
 
-#, fuzzy
 msgctxt "field:ir.model.button.click,button:"
 msgid "Button"
 msgstr "Gumb"
 
-#, fuzzy
 msgctxt "field:ir.model.button.click,create_date:"
 msgid "Create Date"
 msgstr "Izdelano"
 
-#, fuzzy
 msgctxt "field:ir.model.button.click,create_uid:"
 msgid "Create User"
 msgstr "Izdelal"
 
-#, fuzzy
 msgctxt "field:ir.model.button.click,id:"
 msgid "ID"
 msgstr "ID"
@@ -1426,47 +1422,38 @@ msgctxt "field:ir.model.button.click,rec_name:"
 msgid "Name"
 msgstr "Ime"
 
-#, fuzzy
 msgctxt "field:ir.model.button.click,record_id:"
 msgid "Record ID"
 msgstr "ID zapisa"
 
-#, fuzzy
 msgctxt "field:ir.model.button.click,write_date:"
 msgid "Write Date"
 msgstr "Zapisano"
 
-#, fuzzy
 msgctxt "field:ir.model.button.click,write_uid:"
 msgid "Write User"
 msgstr "Zapisal"
 
-#, fuzzy
 msgctxt "field:ir.model.button.rule,button:"
 msgid "Button"
 msgstr "Gumb"
 
-#, fuzzy
 msgctxt "field:ir.model.button.rule,condition:"
 msgid "Condition"
 msgstr "Pogoj"
 
-#, fuzzy
 msgctxt "field:ir.model.button.rule,create_date:"
 msgid "Create Date"
 msgstr "Izdelano"
 
-#, fuzzy
 msgctxt "field:ir.model.button.rule,create_uid:"
 msgid "Create User"
 msgstr "Izdelal"
 
-#, fuzzy
 msgctxt "field:ir.model.button.rule,description:"
 msgid "Description"
 msgstr "Opis"
 
-#, fuzzy
 msgctxt "field:ir.model.button.rule,id:"
 msgid "ID"
 msgstr "ID"
@@ -1479,12 +1466,10 @@ msgctxt "field:ir.model.button.rule,rec_name:"
 msgid "Name"
 msgstr "Ime"
 
-#, fuzzy
 msgctxt "field:ir.model.button.rule,write_date:"
 msgid "Write Date"
 msgstr "Zapisano"
 
-#, fuzzy
 msgctxt "field:ir.model.button.rule,write_uid:"
 msgid "Write User"
 msgstr "Zapisal"
@@ -1713,17 +1698,14 @@ msgctxt "field:ir.module,write_uid:"
 msgid "Write User"
 msgstr "Zapisal"
 
-#, fuzzy
 msgctxt "field:ir.module.activate_upgrade.done,id:"
 msgid "ID"
 msgstr "ID"
 
-#, fuzzy
 msgctxt "field:ir.module.activate_upgrade.start,id:"
 msgid "ID"
 msgstr "ID"
 
-#, fuzzy
 msgctxt "field:ir.module.activate_upgrade.start,module_info:"
 msgid "Modules to update"
 msgstr "Moduli za posodobitev"
@@ -1896,42 +1878,6 @@ msgctxt "field:ir.note.read,write_uid:"
 msgid "Write User"
 msgstr "Zapisal"
 
-msgctxt "field:ir.property,create_date:"
-msgid "Create Date"
-msgstr "Izdelano"
-
-msgctxt "field:ir.property,create_uid:"
-msgid "Create User"
-msgstr "Izdelal"
-
-msgctxt "field:ir.property,field:"
-msgid "Field"
-msgstr "Polje"
-
-msgctxt "field:ir.property,id:"
-msgid "ID"
-msgstr "ID"
-
-msgctxt "field:ir.property,rec_name:"
-msgid "Name"
-msgstr "Ime"
-
-msgctxt "field:ir.property,res:"
-msgid "Resource"
-msgstr "Vir"
-
-msgctxt "field:ir.property,value:"
-msgid "Value"
-msgstr "Vrednost"
-
-msgctxt "field:ir.property,write_date:"
-msgid "Write Date"
-msgstr "Zapisano"
-
-msgctxt "field:ir.property,write_uid:"
-msgid "Write User"
-msgstr "Zapisal"
-
 msgctxt "field:ir.rule,create_date:"
 msgid "Create Date"
 msgstr "Izdelano"
@@ -2832,6 +2778,10 @@ msgctxt "field:ir.ui.view_tree_width,write_uid:"
 msgid "Write User"
 msgstr "Zapisal"
 
+msgctxt "help:ir.action.act_window,context_domain:"
+msgid "Part of the domain that will be evaluated on each refresh"
+msgstr "Del domene, ki se ovrednoti ob vsaki osvežitvi"
+
 msgctxt "help:ir.action.act_window,limit:"
 msgid "Default limit for the list view"
 msgstr "Privzeta meja za naštevni pogled"
@@ -2912,7 +2862,7 @@ msgctxt "help:ir.model.print_model_graph.start,filter:"
 msgid ""
 "Entering a Python Regular Expression will exclude matching models from the "
 "graph."
-msgstr "Vpis Python regularnega izraza izloči najdene modele iz grafa."
+msgstr "Vpis Pythonskega regularnega izraza izloči najdene modele iz grafa."
 
 msgctxt "help:ir.rule,domain:"
 msgid ""
@@ -3078,14 +3028,6 @@ msgctxt "model:ir.action,name:act_note_form"
 msgid "Notes"
 msgstr "Zabeležke"
 
-msgctxt "model:ir.action,name:act_property_form"
-msgid "Properties"
-msgstr "Lastnosti"
-
-msgctxt "model:ir.action,name:act_property_form_default"
-msgid "Default Properties"
-msgstr "Privzete lastnosti"
-
 msgctxt "model:ir.action,name:act_rule_group_form"
 msgid "Record Rules"
 msgstr "Pravila za zapise"
@@ -3114,6 +3056,10 @@ msgctxt "model:ir.action,name:act_translation_form"
 msgid "Translations"
 msgstr "Prevodi"
 
+msgctxt "model:ir.action,name:act_translation_report"
+msgid "Translations"
+msgstr "Prevodi"
+
 msgctxt "model:ir.action,name:act_translation_set"
 msgid "Set Translations"
 msgstr "Nastavitev prevodov v izpisih"
@@ -3158,6 +3104,10 @@ msgctxt "model:ir.action,name:report_model_workflow_graph"
 msgid "Workflow Graph"
 msgstr "Grafa delovnega toka"
 
+msgctxt "model:ir.action,name:wizard_translation_report"
+msgid "Translations"
+msgstr "Prevodi"
+
 msgctxt "model:ir.action.act_window,name:"
 msgid "Action act window"
 msgstr "Ukrep za okna"
@@ -3176,6 +3126,16 @@ msgctxt ""
 msgid "Out of Sync"
 msgstr "Nesinhronizirano"
 
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_translation_form_domain_local"
+msgid "Local"
+msgstr "Lokalno"
+
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_translation_form_domain_module"
+msgid "Modules"
+msgstr "Moduli"
+
 msgctxt "model:ir.action.act_window.view,name:"
 msgid "Action act window view"
 msgstr "Pogled ukrepa za okna"
@@ -3269,8 +3229,8 @@ msgid "Italian"
 msgstr "Italijanščina"
 
 msgctxt "model:ir.lang,name:lang_lo"
-msgid "ລາວ"
-msgstr "Laoščina"
+msgid "Lao"
+msgstr "laoščina"
 
 msgctxt "model:ir.lang,name:lang_lt"
 msgid "Lithuanian"
@@ -3280,6 +3240,10 @@ msgctxt "model:ir.lang,name:lang_nl"
 msgid "Dutch"
 msgstr "Holandščina"
 
+msgctxt "model:ir.lang,name:lang_pl"
+msgid "Polish"
+msgstr "poljščina"
+
 msgctxt "model:ir.lang,name:lang_pt_BR"
 msgid "Portuguese (Brazil)"
 msgstr "Portugalščina (Brazilija)"
@@ -3293,8 +3257,8 @@ msgid "Slovenian"
 msgstr "Slovenščina"
 
 msgctxt "model:ir.lang,name:lang_zh_CN"
-msgid "中国(简体)"
-msgstr "Kitajščina"
+msgid "Chinese Simplified"
+msgstr "Poenostavljena kitajščina"
 
 msgctxt "model:ir.model,name:"
 msgid "Model"
@@ -3356,10 +3320,9 @@ msgctxt "model:ir.module.config_wizard.first,name:"
 msgid "Module Config Wizard First"
 msgstr "Začetek konfiguracije modula"
 
-#, fuzzy
 msgctxt "model:ir.module.config_wizard.item,name:"
 msgid "Config wizard to run after activating a module"
-msgstr "Nastavitveni čarovnik po namestitvi modula"
+msgstr "Nastavitveni čarovnik po aktivaciji modula"
 
 msgctxt "model:ir.module.config_wizard.other,name:"
 msgid "Module Config Wizard Other"
@@ -3377,10 +3340,6 @@ msgctxt "model:ir.note.read,name:"
 msgid "Note Read"
 msgstr "Prebrana zabeležka"
 
-msgctxt "model:ir.property,name:"
-msgid "Property"
-msgstr "Lastnost"
-
 msgctxt "model:ir.rule,name:"
 msgid "Rule"
 msgstr "Pravilo"
@@ -3561,14 +3520,6 @@ msgctxt "model:ir.ui.menu,name:menu_note_form"
 msgid "Notes"
 msgstr "Zabeležke"
 
-msgctxt "model:ir.ui.menu,name:menu_property_form"
-msgid "Properties"
-msgstr "Lastnosti"
-
-msgctxt "model:ir.ui.menu,name:menu_property_form_default"
-msgid "Default Properties"
-msgstr "Privzete lastnosti"
-
 msgctxt "model:ir.ui.menu,name:menu_rule_group_form"
 msgid "Record Rules"
 msgstr "Pravila za zapise"
@@ -3917,7 +3868,6 @@ msgctxt "view:ir.module.activate_upgrade.done:"
 msgid "The modules have been upgraded / activated."
 msgstr "Moduli nadgrajeni oziroma aktivirani."
 
-#, fuzzy
 msgctxt "view:ir.module.activate_upgrade.start:"
 msgid "Note that this operation may take a few minutes."
 msgstr "Ta operacija lahko traja nekaj minut."
@@ -4045,17 +3995,14 @@ msgctxt "wizard_button:ir.model.print_model_graph,start,print_:"
 msgid "Print"
 msgstr "Natisni"
 
-#, fuzzy
 msgctxt "wizard_button:ir.module.activate_upgrade,done,config:"
 msgid "OK"
 msgstr "V redu"
 
-#, fuzzy
 msgctxt "wizard_button:ir.module.activate_upgrade,start,end:"
 msgid "Cancel"
 msgstr "Prekliči"
 
-#, fuzzy
 msgctxt "wizard_button:ir.module.activate_upgrade,start,upgrade:"
 msgid "Start Upgrade"
 msgstr "Nadgradi"
@@ -4127,11 +4074,3 @@ msgstr "Posodobi"
 msgctxt "wizard_button:ir.ui.view.show,start,end:"
 msgid "Close"
 msgstr "Zapri"
-
-msgctxt "error:access_error:"
-msgid ""
-"You try to ypass an access rule.\n"
-"(Document type: %s)"
-msgstr ""
-"Poskus izogiba zaščite dostopa.\n"
-"(Vrsta dokumenta: %s)"
diff --git a/trytond/ir/locale/zh_CN.po b/trytond/ir/locale/zh_CN.po
index 489d652..96304bb 100644
--- a/trytond/ir/locale/zh_CN.po
+++ b/trytond/ir/locale/zh_CN.po
@@ -396,6 +396,10 @@ msgctxt "field:ir.action.act_window,context:"
 msgid "Context Value"
 msgstr "场景值"
 
+msgctxt "field:ir.action.act_window,context_domain:"
+msgid "Context Domain"
+msgstr ""
+
 msgctxt "field:ir.action.act_window,context_model:"
 msgid "Context Model"
 msgstr ""
@@ -660,6 +664,10 @@ msgctxt "field:ir.action.report,id:"
 msgid "ID"
 msgstr "标识"
 
+msgctxt "field:ir.action.report,is_custom:"
+msgid "Is Custom"
+msgstr ""
+
 msgctxt "field:ir.action.report,keywords:"
 msgid "Keywords"
 msgstr "关键词"
@@ -1898,42 +1906,6 @@ msgctxt "field:ir.note.read,write_uid:"
 msgid "Write User"
 msgstr "写入帐号"
 
-msgctxt "field:ir.property,create_date:"
-msgid "Create Date"
-msgstr "创建日期"
-
-msgctxt "field:ir.property,create_uid:"
-msgid "Create User"
-msgstr "添加用户"
-
-msgctxt "field:ir.property,field:"
-msgid "Field"
-msgstr "数据"
-
-msgctxt "field:ir.property,id:"
-msgid "ID"
-msgstr "标识"
-
-msgctxt "field:ir.property,rec_name:"
-msgid "Name"
-msgstr "名称"
-
-msgctxt "field:ir.property,res:"
-msgid "Resource"
-msgstr "资源"
-
-msgctxt "field:ir.property,value:"
-msgid "Value"
-msgstr "值"
-
-msgctxt "field:ir.property,write_date:"
-msgid "Write Date"
-msgstr "写入日期"
-
-msgctxt "field:ir.property,write_uid:"
-msgid "Write User"
-msgstr "写入帐号"
-
 msgctxt "field:ir.rule,create_date:"
 msgid "Create Date"
 msgstr "创建日期"
@@ -2834,6 +2806,10 @@ msgctxt "field:ir.ui.view_tree_width,write_uid:"
 msgid "Write User"
 msgstr "写入帐号"
 
+msgctxt "help:ir.action.act_window,context_domain:"
+msgid "Part of the domain that will be evaluated on each refresh"
+msgstr ""
+
 msgctxt "help:ir.action.act_window,limit:"
 msgid "Default limit for the list view"
 msgstr "列表视图默认限制"
@@ -3077,14 +3053,6 @@ msgctxt "model:ir.action,name:act_note_form"
 msgid "Notes"
 msgstr "注释"
 
-msgctxt "model:ir.action,name:act_property_form"
-msgid "Properties"
-msgstr "属性"
-
-msgctxt "model:ir.action,name:act_property_form_default"
-msgid "Default Properties"
-msgstr "默认属性"
-
 msgctxt "model:ir.action,name:act_rule_group_form"
 msgid "Record Rules"
 msgstr "数据规则"
@@ -3114,6 +3082,11 @@ msgid "Translations"
 msgstr "翻译"
 
 #, fuzzy
+msgctxt "model:ir.action,name:act_translation_report"
+msgid "Translations"
+msgstr "翻译"
+
+#, fuzzy
 msgctxt "model:ir.action,name:act_translation_set"
 msgid "Set Translations"
 msgstr "保存翻译"
@@ -3158,6 +3131,11 @@ msgctxt "model:ir.action,name:report_model_workflow_graph"
 msgid "Workflow Graph"
 msgstr ""
 
+#, fuzzy
+msgctxt "model:ir.action,name:wizard_translation_report"
+msgid "Translations"
+msgstr "翻译"
+
 msgctxt "model:ir.action.act_window,name:"
 msgid "Action act window"
 msgstr "动作窗体"
@@ -3176,6 +3154,17 @@ msgctxt ""
 msgid "Out of Sync"
 msgstr "未同步"
 
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_translation_form_domain_local"
+msgid "Local"
+msgstr ""
+
+#, fuzzy
+msgctxt ""
+"model:ir.action.act_window.domain,name:act_translation_form_domain_module"
+msgid "Modules"
+msgstr "模块"
+
 msgctxt "model:ir.action.act_window.view,name:"
 msgid "Action act window view"
 msgstr "动作窗体视图"
@@ -3270,7 +3259,7 @@ msgid "Italian"
 msgstr "意大利语"
 
 msgctxt "model:ir.lang,name:lang_lo"
-msgid "ລາວ"
+msgid "Lao"
 msgstr ""
 
 msgctxt "model:ir.lang,name:lang_lt"
@@ -3281,6 +3270,10 @@ msgctxt "model:ir.lang,name:lang_nl"
 msgid "Dutch"
 msgstr "荷兰语"
 
+msgctxt "model:ir.lang,name:lang_pl"
+msgid "Polish"
+msgstr ""
+
 msgctxt "model:ir.lang,name:lang_pt_BR"
 msgid "Portuguese (Brazil)"
 msgstr "葡萄牙语"
@@ -3294,7 +3287,7 @@ msgid "Slovenian"
 msgstr "斯洛维尼亚语"
 
 msgctxt "model:ir.lang,name:lang_zh_CN"
-msgid "中国(简体)"
+msgid "Chinese Simplified"
 msgstr ""
 
 msgctxt "model:ir.model,name:"
@@ -3381,10 +3374,6 @@ msgctxt "model:ir.note.read,name:"
 msgid "Note Read"
 msgstr ""
 
-msgctxt "model:ir.property,name:"
-msgid "Property"
-msgstr "属性"
-
 msgctxt "model:ir.rule,name:"
 msgid "Rule"
 msgstr "规则"
@@ -3567,14 +3556,6 @@ msgctxt "model:ir.ui.menu,name:menu_note_form"
 msgid "Notes"
 msgstr "注释"
 
-msgctxt "model:ir.ui.menu,name:menu_property_form"
-msgid "Properties"
-msgstr "属性"
-
-msgctxt "model:ir.ui.menu,name:menu_property_form_default"
-msgid "Default Properties"
-msgstr "默认属性"
-
 msgctxt "model:ir.ui.menu,name:menu_rule_group_form"
 msgid "Record Rules"
 msgstr "数据规则"
diff --git a/trytond/ir/model.py b/trytond/ir/model.py
index 778becb..7627ecd 100644
--- a/trytond/ir/model.py
+++ b/trytond/ir/model.py
@@ -77,8 +77,6 @@ class Model(ModelSQL, ModelView):
 
     @classmethod
     def register(cls, model, module_name):
-        pool = Pool()
-        Property = pool.get('ir.property')
         cursor = Transaction().connection.cursor()
 
         ir_model = cls.__table__()
@@ -97,7 +95,6 @@ class Model(ModelSQL, ModelView):
                         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()
@@ -125,31 +122,6 @@ class Model(ModelSQL, ModelView):
             if getattr(model, '_history', False)]
 
     @classmethod
-    def create(cls, vlist):
-        pool = Pool()
-        Property = pool.get('ir.property')
-        res = super(Model, cls).create(vlist)
-        # Restart the cache of models_get
-        Property._models_get_cache.clear()
-        return res
-
-    @classmethod
-    def write(cls, models, values, *args):
-        pool = Pool()
-        Property = pool.get('ir.property')
-        super(Model, cls).write(models, values, *args)
-        # Restart the cache of models_get
-        Property._models_get_cache.clear()
-
-    @classmethod
-    def delete(cls, models):
-        pool = Pool()
-        Property = pool.get('ir.property')
-        super(Model, cls).delete(models)
-        # Restart the cache of models_get
-        Property._models_get_cache.clear()
-
-    @classmethod
     def global_search(cls, text, limit, menu='ir.ui.menu'):
         """
         Search on models for text including menu
@@ -785,6 +757,15 @@ class ModelButton(ModelSQL, ModelView):
         cls._reset_cache.clear()
 
     @classmethod
+    def copy(cls, buttons, default=None):
+        if default is None:
+            default = {}
+        else:
+            default = default.copy()
+        default.setdefault('clicks')
+        return super(ModelButton, cls).copy(buttons, default=default)
+
+    @classmethod
     def get_groups(cls, model, name):
         '''
         Return a set of group ids for the named button on the model.
@@ -1098,7 +1079,7 @@ class ModelData(ModelSQL, ModelView):
             ('fs_id', '=', fs_id),
             ], limit=1)
         if not data:
-            raise Exception("Reference to %s not found"
+            raise KeyError("Reference to %s not found"
                 % ".".join([module, fs_id]))
         id_ = cls.read([d.id for d in data], ['db_id'])[0]['db_id']
         cls._get_id_cache.set(key, id_)
@@ -1106,7 +1087,8 @@ class ModelData(ModelSQL, ModelView):
 
     @classmethod
     def dump_values(cls, values):
-        return json.dumps(sorted(values.iteritems()), cls=JSONEncoder)
+        return json.dumps(
+            sorted(values.iteritems()), cls=JSONEncoder, separators=(',', ':'))
 
     @classmethod
     def load_values(cls, values):
diff --git a/trytond/ir/model.xml b/trytond/ir/model.xml
index 0c5d788..bb03999 100644
--- a/trytond/ir/model.xml
+++ b/trytond/ir/model.xml
@@ -93,7 +93,8 @@ this repository contains the full copyright notices and license terms. -->
             <field name="name">Access</field>
             <field name="res_model">ir.model.access</field>
             <field name="domain"
-                eval="[('model', 'in', Eval('active_ids'))]" pyson="1"/>
+                eval="[If(Eval('active_ids', []) == [Eval('active_id')], ('model', '=', Eval('active_id')), ('model', 'in', Eval('active_ids')))]"
+                pyson="1"/>
         </record>
         <record model="ir.action.keyword"
             id="act_model_access_form_relate_model_keyword1">
@@ -137,7 +138,8 @@ this repository contains the full copyright notices and license terms. -->
             <field name="name">Access</field>
             <field name="res_model">ir.model.field.access</field>
             <field name="domain"
-                eval="[('field', 'in', Eval('active_ids'))]" pyson="1"/>
+                eval="[If(Eval('active_ids', []) == [Eval('active_id')], ('field', '=', Eval('active_id')), ('field', 'in', Eval('active_ids')))]"
+                pyson="1"/>
         </record>
         <record model="ir.action.keyword"
             id="act_modelfield__access_form_relate_field_keyword1">
@@ -240,7 +242,8 @@ this repository contains the full copyright notices and license terms. -->
             <field name="name">Clicks</field>
             <field name="res_model">ir.model.button.click</field>
             <field name="domain"
-                eval="[('button', 'in', Eval('active_ids'))]" pyson="1"/>
+                eval="[If(Eval('active_ids', []) == [Eval('active_id')], ('button', '=', Eval('active_id')), ('button', 'in', Eval('active_ids')))]"
+                pyson="1"/>
         </record>
         <record model="ir.action.keyword"
             id="act_model_button_click_form_relate_model_button_keyword1">
diff --git a/trytond/ir/property.py b/trytond/ir/property.py
deleted file mode 100644
index ead53e9..0000000
--- a/trytond/ir/property.py
+++ /dev/null
@@ -1,173 +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 decimal import Decimal
-from ..model import ModelView, ModelSQL, fields
-from ..transaction import Transaction
-from ..cache import Cache
-from ..pool import Pool
-
-__all__ = [
-    'Property',
-    ]
-
-_CAST = {
-    'numeric': Decimal,
-    'integer': int,
-    'float': float,
-    }
-
-
-class Property(ModelSQL, ModelView):
-    "Property"
-    __name__ = 'ir.property'
-    _rec_name = 'field'
-    value = fields.Reference('Value', selection='models_get')
-    res = fields.Reference('Resource', selection='models_get', select=True)
-    field = fields.Many2One('ir.model.field', 'Field',
-        ondelete='CASCADE', required=True, select=True)
-    _models_get_cache = Cache('ir_property.models_get', context=False)
-
-    @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().connection.cursor()
-        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
-
-    @classmethod
-    def get(cls, names, model, res_ids=None):
-        """
-        Return named property values for each res_ids of model
-        """
-        pool = Pool()
-        ModelAccess = pool.get('ir.model.access')
-        res = {}
-
-        ModelAccess.check(model, 'read')
-
-        names_list = True
-        if not isinstance(names, list):
-            names_list = False
-            names = [names]
-        if res_ids is None:
-            res_ids = []
-
-        properties = cls.search([
-            ('field.name', 'in', names),
-            ['OR',
-                ('res', '=', None),
-                ('res', 'in', ['%s,%s' % (model, x) for x in res_ids]),
-                ],
-            ], order=[])
-
-        default_vals = dict((x, None) for x in names)
-        for property_ in (x for x in properties if not x.res):
-            value = property_.value
-            val = None
-            if value is not None:
-                if not isinstance(value, basestring):
-                    val = int(value)
-                else:
-                    if property_.field.ttype in _CAST:
-                        cast = _CAST[property_.field.ttype]
-                        val = cast(value.split(',')[1])
-                    elif property_.field.ttype in ('char', 'selection'):
-                        val = value.split(',')[1]
-                    else:
-                        raise Exception('Not implemented')
-            default_vals[property_.field.name] = val
-
-        if not res_ids:
-            if not names_list:
-                return default_vals[names[0]]
-            return default_vals
-
-        for name in names:
-            res[name] = dict((x, default_vals[name]) for x in res_ids)
-
-        for property_ in (x for x in properties if x.res):
-            val = None
-            if property_.value is not None:
-                if not isinstance(property_.value, basestring):
-                    val = int(property_.value)
-                else:
-                    if property_.field.ttype in _CAST:
-                        cast = _CAST[property_.field.ttype]
-                        val = cast(property_.value.split(',')[1])
-                    elif property_.field.ttype in ('char', 'selection'):
-                        val = property_.value.split(',')[1]
-                    else:
-                        raise Exception('Not implemented')
-            res[property_.field.name][int(property_.res)] = val
-
-        if not names_list:
-            return res[names[0]]
-        return res
-
-    @staticmethod
-    def _set_values(model, res_id, val, field_id):
-        return {
-            'value': val,
-            'res': model + ',' + str(res_id),
-            'field': field_id,
-        }
-
-    @classmethod
-    def set(cls, name, model, ids, val):
-        """
-        Set named property value for ids of model
-        Return the id of the record created
-        """
-        pool = Pool()
-        ModelField = pool.get('ir.model.field')
-        ModelAccess = pool.get('ir.model.access')
-
-        ModelAccess.check(model, 'write')
-
-        model_field, = ModelField.search([
-            ('name', '=', name),
-            ('model.model', '=', model),
-            ], order=[], limit=1)
-        Model = pool.get(model)
-        field = Model._fields[name]
-
-        properties = cls.search([
-            ('field', '=', model_field.id),
-            ('res', 'in', [model + ',' + str(res_id) for res_id in ids]),
-            ], order=[])
-        cls.delete(properties)
-
-        defaults = cls.search([
-            ('field', '=', model_field.id),
-            ('res', '=', None),
-            ], order=[], limit=1)
-        default_val = None
-        if defaults:
-            value = cls(defaults[0].id).value
-            default_val = None
-            if value is not None:
-                if not isinstance(value, basestring):
-                    default_val = int(value)
-                else:
-                    if field._type in _CAST:
-                        cast = _CAST[field._type]
-                        default_val = cast(value.split(',')[1])
-                    elif field._type in ('char', 'selection'):
-                        default_val = value.split(',')[1]
-                    else:
-                        raise Exception('Not implemented')
-
-        if (val != default_val):
-            to_create = []
-            for res_id in ids:
-                vals = cls._set_values(model, res_id, val, model_field.id)
-                to_create.append(vals)
-            cls.create(to_create)
diff --git a/trytond/ir/property.xml b/trytond/ir/property.xml
deleted file mode 100644
index 2ea792e..0000000
--- a/trytond/ir/property.xml
+++ /dev/null
@@ -1,56 +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="property_view_form">
-            <field name="model">ir.property</field>
-            <field name="type">form</field>
-            <field name="name">property_form</field>
-        </record>
-        <record model="ir.ui.view" id="property_view_tree">
-            <field name="model">ir.property</field>
-            <field name="type">tree</field>
-            <field name="name">property_list</field>
-        </record>
-        <record model="ir.action.act_window" id="act_property_form_default">
-            <field name="name">Default Properties</field>
-            <field name="type">ir.action.act_window</field>
-            <field name="res_model">ir.property</field>
-            <field name="domain" eval="[('res', '=', None)]" pyson="1"/>
-        </record>
-        <record model="ir.action.act_window.view"
-            id="act_property_form_view1_default">
-            <field name="sequence" eval="1"/>
-            <field name="view" ref="property_view_tree"/>
-            <field name="act_window" ref="act_property_form_default"/>
-        </record>
-        <record model="ir.action.act_window.view"
-            id="act_property_form_view2_default">
-            <field name="sequence" eval="2"/>
-            <field name="view" ref="property_view_form"/>
-            <field name="act_window" ref="act_property_form_default"/>
-        </record>
-        <menuitem parent="ir.menu_models"
-            action="act_property_form_default" id="menu_property_form_default"/>
-        <record model="ir.action.act_window" id="act_property_form">
-            <field name="name">Properties</field>
-            <field name="type">ir.action.act_window</field>
-            <field name="res_model">ir.property</field>
-        </record>
-        <record model="ir.action.act_window.view"
-            id="act_property_form_view1">
-            <field name="sequence" eval="1"/>
-            <field name="view" ref="property_view_tree"/>
-            <field name="act_window" ref="act_property_form"/>
-        </record>
-        <record model="ir.action.act_window.view"
-            id="act_property_form_view2">
-            <field name="sequence" eval="2"/>
-            <field name="view" ref="property_view_form"/>
-            <field name="act_window" ref="act_property_form"/>
-        </record>
-        <menuitem parent="ir.menu_models"
-            action="act_property_form" id="menu_property_form"/>
-    </data>
-</tryton>
diff --git a/trytond/ir/resource.py b/trytond/ir/resource.py
index 1979629..413f11b 100644
--- a/trytond/ir/resource.py
+++ b/trytond/ir/resource.py
@@ -67,7 +67,7 @@ class ResourceMixin(ModelSQL, ModelView):
         with Transaction().set_context(_check_access=False):
             for record in cls.browse(ids):
                 if record.resource:
-                    model_names.add(record.resource.__name__)
+                    model_names.add(str(record.resource).split(',')[0])
         for model_name in model_names:
             ModelAccess.check(model_name, mode=mode)
 
diff --git a/trytond/ir/sequence.py b/trytond/ir/sequence.py
index 261f13f..ca56adf 100644
--- a/trytond/ir/sequence.py
+++ b/trytond/ir/sequence.py
@@ -3,7 +3,7 @@
 from string import Template
 import time
 from itertools import izip
-from sql import Flavor
+from sql import Flavor, Literal, For
 
 from ..model import ModelView, ModelSQL, fields, Check
 from ..tools import datetime_strftime
@@ -354,7 +354,7 @@ class Sequence(ModelSQL, ModelView):
         return ''
 
     @classmethod
-    def get_id(cls, domain):
+    def get_id(cls, domain, _lock=False):
         '''
         Return sequence value for the domain
         '''
@@ -370,6 +370,19 @@ class Sequence(ModelSQL, ModelView):
                     sequence, = cls.search(domain, limit=1)
                 except TypeError:
                     cls.raise_user_error('missing')
+                if _lock:
+                    transaction = Transaction()
+                    database = transaction.database
+                    connection = transaction.connection
+                    if not database.has_select_for():
+                        database.lock(connection, cls._table)
+                    else:
+                        table = cls.__table__()
+                        query = table.select(Literal(1),
+                            where=table.id == sequence.id,
+                            for_=For('UPDATE', nowait=True))
+                        cursor = connection.cursor()
+                        cursor.execute(*query)
                 date = Transaction().context.get('date')
                 return '%s%s%s' % (
                     cls._process(sequence.prefix, date=date),
@@ -390,6 +403,4 @@ class SequenceStrict(Sequence):
 
     @classmethod
     def get_id(cls, clause):
-        transaction = Transaction()
-        transaction.database.lock(transaction.connection, cls._table)
-        return super(SequenceStrict, cls).get_id(clause)
+        return super(SequenceStrict, cls).get_id(clause, _lock=True)
diff --git a/trytond/ir/translation.py b/trytond/ir/translation.py
index 952bdaf..b3d21a9 100644
--- a/trytond/ir/translation.py
+++ b/trytond/ir/translation.py
@@ -10,7 +10,7 @@ from lxml import etree
 from itertools import izip
 from io import BytesIO
 
-from sql import Column, Null
+from sql import Column, Null, Literal
 from sql.functions import Substring, Position
 from sql.conditionals import Case
 from sql.operators import Or, And
@@ -36,6 +36,7 @@ __all__ = ['Translation',
     'TranslationCleanStart', 'TranslationCleanSucceed', 'TranslationClean',
     'TranslationUpdateStart', 'TranslationUpdate',
     'TranslationExportStart', 'TranslationExportResult', 'TranslationExport',
+    'TranslationReport',
     ]
 
 TRANSLATION_TYPE = [
@@ -104,10 +105,7 @@ class Translation(ModelSQL, ModelView):
         # 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',
-                cls.src_md5.sql_type(),
-                cls.src_md5.sql_format, None,
-                cls.src_md5.size, string=cls.src_md5.string)
+            table.add_column('src_md5', cls.src_md5._sql_type)
         table.drop_constraint('translation_uniq')
         table.index_action(['lang', 'type', 'name', 'src'], 'remove')
 
@@ -433,7 +431,7 @@ class Translation(ModelSQL, ModelView):
         if not Transaction().context.get(
                 'fuzzy_translation', False):
             for obj_id in ids:
-                trans = cls._translation_cache.get((lang, ttype, name, obj_id),
+                trans = cls._translation_cache.get((name, ttype, lang, obj_id),
                     -1)
                 if trans != -1:
                     translations[obj_id] = trans
@@ -474,7 +472,7 @@ class Translation(ModelSQL, ModelView):
             value = translations.setdefault(res_id)
             # Don't store fuzzy translation in cache
             if not Transaction().context.get('fuzzy_translation', False):
-                cls._translation_cache.set((lang, ttype, name, res_id), value)
+                cls._translation_cache.set((name, ttype, lang, res_id), value)
         return translations
 
     @classmethod
@@ -636,7 +634,7 @@ class Translation(ModelSQL, ModelView):
             lang = unicode(lang)
             if source is not None:
                 source = unicode(source)
-            trans = cls._translation_cache.get((lang, ttype, name, source), -1)
+            trans = cls._translation_cache.get((name, ttype, lang, source), -1)
             if trans != -1:
                 res[(name, ttype, lang, source)] = trans
             else:
@@ -1059,78 +1057,85 @@ class TranslationSet(Wizard):
         pool = Pool()
         Report = pool.get('ir.action.report')
         Translation = pool.get('ir.translation')
+        context = Transaction().context
 
-        with Transaction().set_context(active_test=False):
-            reports = Report.search([])
-
-        if not reports:
+        if context.get('active_model') == Report.__name__:
+            reports = Report.browse(context.get('active_ids', []))
+        elif context.get('active_model', 'ir.ui.menu') == 'ir.ui.menu':
+            with Transaction().set_context(active_test=False):
+                reports = Report.search([])
+        else:
             return
 
         cursor = Transaction().connection.cursor()
         translation = Translation.__table__()
         for report in reports:
-            cursor.execute(*translation.select(
-                    translation.id, translation.name, translation.src,
-                    where=(translation.lang == 'en')
-                    & (translation.type == 'report')
-                    & (translation.name == report.report_name)
-                    & (translation.module == report.module or '')))
-            trans_reports = {t['src']: t for t in cursor_dict(cursor)}
-
             content = None
             if report.report:
                 with file_open(report.report.replace('/', os.sep),
                         mode='rb') as fp:
                     content = fp.read()
-            strings = []
-            for content in [report.report_content_custom, content]:
+            for content, module in [
+                    (report.report_content_custom, None),
+                    (content, report.module)]:
                 if not content:
                     continue
+
+                cursor.execute(*translation.select(
+                        translation.id, translation.name, translation.src,
+                        where=(translation.lang == 'en')
+                        & (translation.type == 'report')
+                        & (translation.name == report.report_name)
+                        & (translation.module == module)))
+                trans_reports = {t['src']: t for t in cursor_dict(cursor)}
+
+                strings = set()
                 func_name = 'extract_report_%s' % report.template_extension
-                strings.extend(getattr(self, func_name)(content))
+                strings.update(getattr(self, func_name)(content))
 
-            for string in {}.fromkeys(strings).keys():
-                src_md5 = Translation.get_src_md5(string)
-                done = False
-                if string in trans_reports:
-                    del trans_reports[string]
-                    continue
-                for string_trans in trans_reports:
-                    if string_trans in strings:
+                for string in strings:
+                    src_md5 = Translation.get_src_md5(string)
+                    done = False
+                    if string in trans_reports:
+                        del trans_reports[string]
                         continue
-                    seqmatch = SequenceMatcher(lambda x: x == ' ',
-                            string, string_trans)
-                    if seqmatch.ratio() == 1.0:
-                        del trans_reports[report.report_name][string_trans]
-                        done = True
-                        break
-                    if seqmatch.ratio() > 0.6:
-                        cursor.execute(*translation.update(
-                                [translation.src, translation.fuzzy,
-                                    translation.src_md5],
-                                [string, True, src_md5],
-                                where=(translation.name == report.report_name)
-                                & (translation.type == 'report')
-                                & (translation.src == string_trans)
-                                & (translation.module == report.module)))
-                        del trans_reports[string_trans]
-                        done = True
-                        break
-                if not done:
-                    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', 'report', string,
-                                    '', report.module, False, src_md5, -1]]))
-            if strings:
-                cursor.execute(*translation.delete(
-                        where=(translation.name == report.report_name)
-                        & (translation.type == 'report')
-                        & (translation.module == report.module)
-                        & ~translation.src.in_(strings)))
+                    for string_trans in trans_reports:
+                        if string_trans in strings:
+                            continue
+                        seqmatch = SequenceMatcher(lambda x: x == ' ',
+                                string, string_trans)
+                        if seqmatch.ratio() == 1.0:
+                            del trans_reports[report.report_name][string_trans]
+                            done = True
+                            break
+                        if seqmatch.ratio() > 0.6:
+                            cursor.execute(*translation.update(
+                                    [translation.src, translation.fuzzy,
+                                        translation.src_md5],
+                                    [string, True, src_md5],
+                                    where=(
+                                        translation.name == report.report_name)
+                                    & (translation.type == 'report')
+                                    & (translation.src == string_trans)
+                                    & (translation.module == module)))
+                            del trans_reports[string_trans]
+                            done = True
+                            break
+                    if not done:
+                        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', 'report', string,
+                                        '', module, False, src_md5, -1]]))
+                if strings:
+                    cursor.execute(*translation.delete(
+                            where=(translation.name == report.report_name)
+                            & (translation.type == 'report')
+                            & (translation.module == module)
+                            & ~translation.src.in_(list(strings))))
 
     def _translate_view(self, element):
         strings = []
@@ -1147,12 +1152,16 @@ class TranslationSet(Wizard):
         pool = Pool()
         View = pool.get('ir.ui.view')
         Translation = pool.get('ir.translation')
+        context = Transaction().context
 
-        with Transaction().set_context(active_test=False):
-            views = View.search([])
-
-        if not views:
+        if context.get('active_model') == View.__name__:
+            views = View.browse(context.get('active_ids', []))
+        elif context.get('active_model', 'ir.ui.menu') == 'ir.ui.menu':
+            with Transaction().set_context(active_test=False):
+                views = View.search([])
+        else:
             return
+
         cursor = Transaction().connection.cursor()
         translation = Translation.__table__()
         for view in views:
@@ -1497,20 +1506,36 @@ class TranslationUpdate(Wizard):
     def do_update(self, action):
         pool = Pool()
         Translation = pool.get('ir.translation')
+        Report = pool.get('ir.action.report')
+        View = pool.get('ir.ui.view')
+        context = Transaction().context
         cursor = Transaction().connection.cursor()
         cursor_update = Transaction().connection.cursor()
         translation = Translation.__table__()
         lang = self.start.language.code
         parent_lang = get_parent(lang)
 
+        if context.get('active_model') == Report.__name__:
+            reports = Report.browse(context.get('active_ids', []))
+            source_clause = ((translation.type == 'report')
+                & translation.name.in_([r.report_name for r in reports]))
+        elif context.get('active_model') == View.__name__:
+            views = View.browse(context.get('active_ids', []))
+            source_clause = ((translation.type == 'view')
+                & translation.name.in_([v.model for v in views]))
+        else:
+            source_clause = Literal(True)
+
         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')
+                    & source_clause
                     & translation.type.in_(self._source_types))
                 - translation.select(*columns,
                     where=(translation.lang == lang)
+                    & source_clause
                     & translation.type.in_(self._source_types))))
         to_create = []
         for row in cursor_dict(cursor):
@@ -1529,9 +1554,11 @@ class TranslationUpdate(Wizard):
             columns.append(translation.value)
             cursor.execute(*(translation.select(*columns,
                         where=(translation.lang == parent_lang)
+                        & source_clause
                         & translation.type.in_(self._source_types))
                     & translation.select(*columns,
                         where=(translation.lang == lang)
+                        & source_clause
                         & translation.type.in_(self._source_types))))
             for row in cursor_dict(cursor):
                 cursor_update.execute(*translation.update(
@@ -1544,6 +1571,9 @@ class TranslationUpdate(Wizard):
                         & (translation.module == row['module'])
                         & (translation.lang == lang)))
 
+        if context.get('active_model') in {Report.__name__, View.__name__}:
+            return
+
         columns = [translation.name.as_('name'),
             translation.res_id.as_('res_id'), translation.type.as_('type'),
             translation.module.as_('module')]
@@ -1698,3 +1728,28 @@ class TranslationExport(Wizard):
         return {
             'file': cast(file_) if file_ else None,
             }
+
+
+class TranslationReport(Wizard):
+    "Open translations of report"
+    __name__ = 'ir.translation.report'
+    start_state = 'open_'
+    open_ = StateAction('ir.act_translation_report')
+
+    def do_open_(self, action):
+        pool = Pool()
+        Report = pool.get('ir.action.report')
+        context = Transaction().context
+        assert context['active_model'] == Report.__name__
+        reports = Report.browse(context['active_ids'])
+        action['pyson_domain'] = PYSONEncoder().encode([
+                ('type', '=', 'report'),
+                ('name', 'in', [r.report_name for r in reports]),
+                ])
+        # Behaves like a relate to have name suffix
+        action['keyword'] = 'form_relate'
+        return action, {
+            'model': context['active_model'],
+            'ids': context['active_ids'],
+            'id': context['active_id'],
+            }
diff --git a/trytond/ir/translation.xml b/trytond/ir/translation.xml
index 2d285f7..72f08a0 100644
--- a/trytond/ir/translation.xml
+++ b/trytond/ir/translation.xml
@@ -16,7 +16,21 @@ 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" eval="None"/>
+        </record>
+        <record model="ir.action.act_window.domain"
+            id="act_translation_form_domain_module">
+            <field name="name">Modules</field>
+            <field name="sequence" eval="10"/>
             <field name="domain" eval="[('module', '!=', None)]" pyson="1"/>
+            <field name="act_window" ref="act_translation_form"/>
+        </record>
+        <record model="ir.action.act_window.domain"
+            id="act_translation_form_domain_local">
+            <field name="name">Local</field>
+            <field name="sequence" eval="20"/>
+            <field name="domain" eval="[('module', '=', None)]" pyson="1"/>
+            <field name="act_window" ref="act_translation_form"/>
         </record>
         <record model="ir.action.act_window.view"
             id="act_translation_form_view1">
@@ -33,6 +47,21 @@ this repository contains the full copyright notices and license terms. -->
         <menuitem name="Translations" parent="menu_localization"
             action="act_translation_form" id="menu_translation_form"/>
 
+        <record model="ir.action.wizard" id="wizard_translation_report">
+            <field name="name">Translations</field>
+            <field name="wiz_name">ir.translation.report</field>
+            <field name="model">ir.action.report</field>
+        </record>
+        <record model="ir.action.keyword" id="wizard_translation_report_keyword1">
+            <field name="keyword">form_relate</field>
+            <field name="model">ir.action.report,-1</field>
+            <field name="action" ref="wizard_translation_report"/>
+        </record>
+        <record model="ir.action.act_window" id="act_translation_report">
+            <field name="name">Translations</field>
+            <field name="res_model">ir.translation</field>
+        </record>
+
         <record model="ir.translation" id="translation_delete_xml_record">
             <field name="name">delete_xml_record</field>
             <field name="lang">en</field>
@@ -256,6 +285,18 @@ this repository contains the full copyright notices and license terms. -->
             <field name="name">Set Translations</field>
             <field name="wiz_name">ir.translation.set</field>
         </record>
+        <record model="ir.action.keyword"
+            id="act_translation_set_keyword_report">
+            <field name="keyword">form_action</field>
+            <field name="model">ir.action.report,-1</field>
+            <field name="action" ref="act_translation_set"/>
+        </record>
+        <record model="ir.action.keyword"
+            id="act_translation_set_keyword_view">
+            <field name="keyword">form_action</field>
+            <field name="model">ir.ui.view,-1</field>
+            <field name="action" ref="act_translation_set"/>
+        </record>
         <menuitem name="Set Translations"
             parent="menu_localization"
             action="act_translation_set"
@@ -294,6 +335,18 @@ this repository contains the full copyright notices and license terms. -->
             <field name="name">Synchronize Translations</field>
             <field name="wiz_name">ir.translation.update</field>
         </record>
+        <record model="ir.action.keyword"
+            id="act_translation_update_keyword_report">
+            <field name="keyword">form_action</field>
+            <field name="model">ir.action.report,-1</field>
+            <field name="action" ref="act_translation_update"/>
+        </record>
+        <record model="ir.action.keyword"
+            id="act_translation_update_keyword_view">
+            <field name="keyword">form_action</field>
+            <field name="model">ir.ui.view,-1</field>
+            <field name="action" ref="act_translation_update"/>
+        </record>
         <menuitem name="Synchronize Translations"
             parent="menu_localization"
             action="act_translation_update"
diff --git a/trytond/ir/tryton.cfg b/trytond/ir/tryton.cfg
index 152b3e1..446f50c 100644
--- a/trytond/ir/tryton.cfg
+++ b/trytond/ir/tryton.cfg
@@ -15,6 +15,5 @@ xml:
     translation.xml
     export.xml
     rule.xml
-    property.xml
     module.xml
     trigger.xml
diff --git a/trytond/ir/ui/view.py b/trytond/ir/ui/view.py
index 395bca5..23324ca 100644
--- a/trytond/ir/ui/view.py
+++ b/trytond/ir/ui/view.py
@@ -240,7 +240,10 @@ class ShowView(Wizard):
         def get_view(self, wizard, state_name):
             pool = Pool()
             View = pool.get('ir.ui.view')
-            view = View(Transaction().context.get('active_id'))
+            view_id = Transaction().context.get('active_id')
+            if not view_id:
+                return {}
+            view = View(view_id)
             Model = pool.get(view.model)
             return Model.fields_view_get(view_id=view.id)
 
@@ -354,7 +357,7 @@ class ViewTreeState(ModelSQL, ModelView):
     @classmethod
     def set(cls, model, domain, child_name, nodes, selected_nodes):
         # Normalize the json domain
-        domain = json.dumps(json.loads(domain))
+        domain = json.dumps(json.loads(domain), separators=(',', ':'))
         current_user = Transaction().user
         records = cls.search([
                 ('user', '=', current_user),
@@ -375,7 +378,7 @@ class ViewTreeState(ModelSQL, ModelView):
     @classmethod
     def get(cls, model, domain, child_name):
         # Normalize the json domain
-        domain = json.dumps(json.loads(domain))
+        domain = json.dumps(json.loads(domain), separators=(',', ':'))
         current_user = Transaction().user
         try:
             expanded_info, = cls.search([
diff --git a/trytond/ir/view/action_act_window_form.xml b/trytond/ir/view/action_act_window_form.xml
index 4c9947c..e53ba73 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. -->
                 view_ids="ir.act_window_domain_view_list2"/>
             <label name="domain"/>
             <field name="domain" colspan="3" widget="pyson"/>
+            <label name="context_domain"/>
+            <field name="context_domain" colspan="3" widget="pyson"/>
             <label name="context"/>
             <field name="context" colspan="3" widget="pyson"/>
             <label name="order"/>
diff --git a/trytond/ir/view/action_report_form.xml b/trytond/ir/view/action_report_form.xml
index e83b053..ac77fd5 100644
--- a/trytond/ir/view/action_report_form.xml
+++ b/trytond/ir/view/action_report_form.xml
@@ -15,10 +15,10 @@ this repository contains the full copyright notices and license terms. -->
             <label name="icon"/>
             <field name="icon"/>
             <newline/>
-            <label name="report"/>
-            <field name="report"/>
             <label name="report_content"/>
             <field name="report_content"/>
+            <label name="report"/>
+            <field name="report"/>
             <label name="template_extension"/>
             <field name="template_extension"/>
             <label name="extension"/>
@@ -27,7 +27,7 @@ this repository contains the full copyright notices and license terms. -->
             <field name="direct_print"/>
             <newline/>
             <label name="email"/>
-            <field name="email" colspan="3"/>
+            <field name="email" colspan="3" widget="pyson"/>
         </page>
         <page name="keywords">
             <field name="keywords" colspan="4"/>
diff --git a/trytond/ir/view/module_form.xml b/trytond/ir/view/module_form.xml
index 3954d2a..55a68c9 100644
--- a/trytond/ir/view/module_form.xml
+++ b/trytond/ir/view/module_form.xml
@@ -9,7 +9,7 @@ this repository contains the full copyright notices and license terms. -->
     <field name="dependencies" colspan="4"/>
     <label name="state"/>
     <field name="state" readonly="1"/>
-    <group col="2" colspan="2" id="button">
+    <group col="-1" colspan="2" id="button">
         <button string="Mark for Upgrade" name="upgrade"/>
         <button string="Mark for Deactivation (beta)" name="deactivate"/>
         <button string="Mark for Activation" name="activate"/>
diff --git a/trytond/ir/view/property_form.xml b/trytond/ir/view/property_form.xml
deleted file mode 100644
index 5a760c3..0000000
--- a/trytond/ir/view/property_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>
-    <label name="field"/>
-    <field name="field" colspan="3"/>
-    <label name="value"/>
-    <field name="value" colspan="3"/>
-    <label name="res"/>
-    <field name="res" colspan="3"/>
-</form>
diff --git a/trytond/ir/view/property_list.xml b/trytond/ir/view/property_list.xml
deleted file mode 100644
index 770d34e..0000000
--- a/trytond/ir/view/property_list.xml
+++ /dev/null
@@ -1,8 +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>
-    <field name="field"/>
-    <field name="value"/>
-    <field name="res"/>
-</tree>
diff --git a/trytond/model/__init__.py b/trytond/model/__init__.py
index a551e51..ed74195 100644
--- a/trytond/model/__init__.py
+++ b/trytond/model/__init__.py
@@ -9,10 +9,12 @@ from .workflow import Workflow
 from .dictschema import DictSchemaMixin
 from .match import MatchMixin
 from .union import UnionMixin
+from .multivalue import MultiValueMixin, ValueMixin
 from .descriptors import dualmethod
 from .order import sequence_ordered
 
 __all__ = ['Model', 'ModelView', 'ModelStorage', 'ModelSingleton', 'ModelSQL',
     'Check', 'Unique',
     'Workflow', 'DictSchemaMixin', 'MatchMixin', 'UnionMixin', 'dualmethod',
+    'MultiValueMixin', 'ValueMixin',
     'EvalEnvironment', 'sequence_ordered']
diff --git a/trytond/model/dictschema.py b/trytond/model/dictschema.py
index 38ed0f5..16fc34f 100644
--- a/trytond/model/dictschema.py
+++ b/trytond/model/dictschema.py
@@ -60,7 +60,7 @@ class DictSchemaMixin(object):
         db_selection = self.selection or ''
         selection = [[w.strip() for w in v.split(':', 1)]
             for v in db_selection.splitlines() if v]
-        return json.dumps(selection)
+        return json.dumps(selection, separators=(',', ':'))
 
     @classmethod
     def get_keys(cls, records):
diff --git a/trytond/model/fields/__init__.py b/trytond/model/fields/__init__.py
index bbb52c3..a1a4ca4 100644
--- a/trytond/model/fields/__init__.py
+++ b/trytond/model/fields/__init__.py
@@ -16,6 +16,5 @@ from .many2one import *
 from .one2many import *
 from .many2many import *
 from .function import *
-from .property import *
 from .one2one import *
 from .dict import *
diff --git a/trytond/model/fields/binary.py b/trytond/model/fields/binary.py
index 4dba060..55f5249 100644
--- a/trytond/model/fields/binary.py
+++ b/trytond/model/fields/binary.py
@@ -1,10 +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, Column, Null
+from sql import Column, Null
 
-from .field import Field, SQLType
+from .field import Field
 from ...transaction import Transaction
-from ... import backend
 from ...tools import grouped_slice, reduce_ids
 from ...filestore import filestore
 
@@ -14,6 +13,7 @@ class Binary(Field):
     Define a binary field (``bytes``).
     '''
     _type = 'binary'
+    _sql_type = 'BLOB'
     cast = bytearray if bytes == str else bytes
 
     def __init__(self, string='', help='', required=False, readonly=False,
@@ -116,21 +116,3 @@ class Binary(Field):
                 values = [self.sql_format(value)]
             cursor.execute(*table.update(columns, values,
                     where=reduce_ids(table.id, ids)))
-
-    @staticmethod
-    def sql_format(value):
-        if isinstance(value, (Query, Expression)):
-            return value
-        db_type = backend.name()
-        if db_type == 'postgresql' and value is not None:
-            import psycopg2
-            return psycopg2.Binary(value)
-        return value
-
-    def sql_type(self):
-        db_type = backend.name()
-        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 dad5b63..40c0029 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 .field import Field, SQLType
+from .field import Field
 
 
 class Boolean(Field):
@@ -9,6 +9,7 @@ class Boolean(Field):
     Define a boolean field (``True`` or ``False``).
     '''
     _type = 'boolean'
+    _sql_type = 'BOOL'
 
     def __init__(self, string='', help='', readonly=False, domain=None,
             states=None, select=False, on_change=None, on_change_with=None,
@@ -20,9 +21,6 @@ class Boolean(Field):
 
     __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)
diff --git a/trytond/model/fields/char.py b/trytond/model/fields/char.py
index 83ba323..1ea74ac 100644
--- a/trytond/model/fields/char.py
+++ b/trytond/model/fields/char.py
@@ -3,10 +3,8 @@
 import sys
 import warnings
 
-from sql import Query, Expression
-
-from ... import backend
-from .field import Field, FieldTranslate, size_validate, SQLType
+from .field import Field, FieldTranslate, size_validate
+from ...rpc import RPC
 
 
 class Char(FieldTranslate):
@@ -48,10 +46,7 @@ class Char(FieldTranslate):
 
     size = property(_get_size, _set_size)
 
-    @staticmethod
-    def sql_format(value):
-        if isinstance(value, (Query, Expression)):
-            return value
+    def sql_format(self, value):
         if value is None:
             return None
         elif isinstance(value, str) and sys.version_info < (3,):
@@ -59,10 +54,14 @@ class Char(FieldTranslate):
         assert isinstance(value, unicode)
         return value
 
-    def sql_type(self):
-        db_type = backend.name()
-        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')
+    @property
+    def _sql_type(self):
+        return 'VARCHAR(%s)' % self.size if self.size else 'VARCHAR'
+
+    def set_rpc(self, model):
+        super(Char, self).set_rpc(model)
+        if self.autocomplete:
+            func_name = 'autocomplete_%s' % self.name
+            assert hasattr(model, func_name), \
+                'Missing %s on model %s' % (func_name, model.__name__)
+            model.__rpc__.setdefault(func_name, RPC(instantiate=0))
diff --git a/trytond/model/fields/date.py b/trytond/model/fields/date.py
index e2b8445..0e67af1 100644
--- a/trytond/model/fields/date.py
+++ b/trytond/model/fields/date.py
@@ -1,10 +1,8 @@
 # This file is part of Tryton.  The COPYRIGHT file at the top level of
 # this repository contains the full copyright notices and license terms.
 import datetime
-from sql import Query, Expression
 
-from ... import backend
-from .field import Field, SQLType
+from .field import Field
 
 
 class Date(Field):
@@ -12,11 +10,9 @@ class Date(Field):
     Define a date field (``date``).
     '''
     _type = 'date'
+    _sql_type = 'DATE'
 
-    @staticmethod
-    def sql_format(value):
-        if isinstance(value, (Query, Expression)):
-            return value
+    def sql_format(self, value):
         if value is None:
             return None
         if isinstance(value, basestring):
@@ -31,15 +27,13 @@ class Date(Field):
             or value.time() == datetime.time())
         return value
 
-    def sql_type(self):
-        return SQLType('DATE', 'DATE')
-
 
 class DateTime(Field):
     '''
     Define a datetime field (``datetime``).
     '''
     _type = 'datetime'
+    _sql_type = 'DATETIME'
 
     def __init__(self, string='', format='%H:%M:%S', help='', required=False,
             readonly=False, domain=None, states=None, select=False,
@@ -56,10 +50,7 @@ class DateTime(Field):
 
     __init__.__doc__ += Field.__init__.__doc__
 
-    @staticmethod
-    def sql_format(value):
-        if isinstance(value, (Query, Expression)):
-            return value
+    def sql_format(self, value):
         if not value:
             return None
         if isinstance(value, basestring):
@@ -70,25 +61,15 @@ class DateTime(Field):
         assert(isinstance(value, datetime.datetime))
         return value.replace(microsecond=0)
 
-    def sql_type(self):
-        db_type = backend.name()
-        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'
+    _sql_type = 'TIMESTAMP'
 
-    @staticmethod
-    def sql_format(value):
-        if isinstance(value, (Query, Expression)):
-            return value
+    def sql_format(self, value):
         if value is None:
             return None
         if isinstance(value, basestring):
@@ -105,25 +86,15 @@ class Timestamp(Field):
         assert(isinstance(value, datetime.datetime))
         return value
 
-    def sql_type(self):
-        db_type = backend.name()
-        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'
+    _sql_type = 'TIME'
 
-    @staticmethod
-    def sql_format(value):
-        if isinstance(value, (Query, Expression)):
-            return value
+    def sql_format(self, value):
         if value is None:
             return None
         if isinstance(value, basestring):
@@ -132,15 +103,13 @@ class Time(DateTime):
         assert(isinstance(value, datetime.time))
         return value.replace(microsecond=0)
 
-    def sql_type(self):
-        return SQLType('TIME', 'TIME')
-
 
 class TimeDelta(Field):
     '''
     Define a timedelta field (``timedelta``).
     '''
     _type = 'timedelta'
+    _sql_type = 'INTERVAL'
 
     def __init__(self, string='', converter=None, help='', required=False,
             readonly=False, domain=None, states=None, select=False,
@@ -156,23 +125,11 @@ class TimeDelta(Field):
             depends=depends, context=context, loading=loading)
         self.converter = converter
 
-    @staticmethod
-    def sql_format(value):
-        if isinstance(value, (Query, Expression)):
-            return value
+    def sql_format(self, value):
         if value is None:
             return None
         assert(isinstance(value, datetime.timedelta))
-        db_type = backend.name()
-        if db_type == 'mysql':
-            return value.total_seconds()
-        return value
-
-    def sql_type(self):
-        db_type = backend.name()
-        if db_type == 'mysql':
-            return SQLType('DOUBLE', 'DOUBLE(255, 6)')
-        return SQLType('INTERVAL', 'INTERVAL')
+        return super(TimeDelta, self).sql_format(value)
 
     @classmethod
     def get(cls, ids, model, name, values=None):
diff --git a/trytond/model/fields/dict.py b/trytond/model/fields/dict.py
index 1f21807..5b24dbe 100644
--- a/trytond/model/fields/dict.py
+++ b/trytond/model/fields/dict.py
@@ -1,9 +1,8 @@
 # This file is part of Tryton.  The COPYRIGHT file at the toplevel of this
 # repository contains the full copyright notices and license terms.
 import json
-from sql import Query, Expression
 
-from .field import Field, SQLType
+from .field import Field
 from ...protocols.jsonrpc import JSONDecoder, JSONEncoder
 from ...pool import Pool
 from ...tools import grouped_slice
@@ -12,6 +11,7 @@ from ...tools import grouped_slice
 class Dict(Field):
     'Define dict field.'
     _type = 'dict'
+    _sql_type = 'TEXT'
 
     def __init__(self, schema_model, string='', help='', required=False,
             readonly=False, domain=None, states=None, select=False,
@@ -30,17 +30,11 @@ class Dict(Field):
                     object_hook=JSONDecoder())
         return dicts
 
-    @staticmethod
-    def sql_format(value):
-        if isinstance(value, (Query, Expression)):
-            return value
+    def sql_format(self, 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')
+        return json.dumps(value, cls=JSONEncoder, separators=(',', ':'))
 
     def translated(self, name=None, type_='values'):
         "Return a descriptor for the translated value of the field"
diff --git a/trytond/model/fields/field.py b/trytond/model/fields/field.py
index 0f07729..139d0f5 100644
--- a/trytond/model/fields/field.py
+++ b/trytond/model/fields/field.py
@@ -1,19 +1,24 @@
 # 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
 import warnings
 from functools import wraps
 
-from sql import operators, Column, Literal, Select, CombiningQuery, Null
+from sql import (operators, Column, Literal, Select, CombiningQuery, Null,
+    Query, Expression)
 from sql.conditionals import Coalesce, NullIf
 from sql.operators import Concat
 
+from trytond import backend
 from trytond.pyson import PYSON, PYSONEncoder, Eval
 from trytond.const import OPERATORS
 from trytond.transaction import Transaction
 from trytond.pool import Pool
 from trytond.cache import LRUDictTransaction
 
+from ...rpc import RPC
+
+Database = backend.get('Database')
+
 
 def domain_validate(value):
     assert isinstance(value, list), 'domain must be a list'
@@ -65,6 +70,21 @@ def size_validate(value):
                 'size must return integer'
 
 
+def _set_value(record, field):
+    try:
+        field, nested = field.split('.', 1)
+    except ValueError:
+        nested = None
+    if field.startswith('_parent_'):
+        field = field[8:]  # Strip '_parent_'
+    if not hasattr(record, field):
+        setattr(record, field, None)
+    elif nested:
+        parent = getattr(record, field)
+        if parent:
+            _set_value(parent, nested)
+
+
 def depends(*fields, **kwargs):
     methods = kwargs.pop('methods', None)
     assert not kwargs
@@ -82,11 +102,7 @@ def depends(*fields, **kwargs):
         @wraps(func)
         def wrapper(self, *args, **kwargs):
             for field in fields:
-                field = field.split('.')[0]
-                if field.startswith('_parent_'):
-                    field = field[8:]  # Strip '_parent_'
-                if not hasattr(self, field):
-                    setattr(self, field, None)
+                _set_value(self, field)
             return func(self, *args, **kwargs)
         return wrapper
     return decorator
@@ -137,6 +153,10 @@ def instanciate_values(Target, value):
     return tuple(instance(x) for x in (value or []))
 
 
+def on_change_result(record):
+    return record._changed_values
+
+
 SQL_OPERATORS = {
     '=': operators.Equal,
     '!=': operators.NotEqual,
@@ -155,6 +175,7 @@ SQL_OPERATORS = {
 
 class Field(object):
     _type = None
+    _sql_type = None
 
     def __init__(self, string='', help='', required=False, readonly=False,
             domain=None, states=None, select=False, on_change=None,
@@ -266,12 +287,17 @@ class Field(object):
             inst._values = {}
         inst._values[self.name] = value
 
-    @staticmethod
-    def sql_format(value):
-        return value
+    def sql_format(self, value):
+        if isinstance(value, (Query, Expression)):
+            return value
+
+        assert self._sql_type is not None
+        database = Transaction().database
+        return database.sql_format(self._sql_type, value)
 
     def sql_type(self):
-        return None
+        database = Transaction().database
+        return database.sql_type(self._sql_type)
 
     def sql_column(self, table):
         return Column(table, self.name)
@@ -322,6 +348,19 @@ class Field(object):
         else:
             return [self.sql_column(table)]
 
+    def set_rpc(self, model):
+        for attribute, result in (
+                ('on_change', on_change_result),
+                ('on_change_with', None),
+                ):
+            if not getattr(self, attribute):
+                continue
+            func_name = '%s_%s' % (attribute, self.name)
+            assert hasattr(model, func_name), \
+                'Missing %s on model %s' % (func_name, model.__name__)
+            model.__rpc__.setdefault(
+                func_name, RPC(instantiate=0, result=result))
+
 
 class FieldTranslate(Field):
 
@@ -419,5 +458,3 @@ class FieldTranslate(Field):
 
         return [Coalesce(NullIf(translation.value, ''),
                 self.sql_column(table))]
-
-SQLType = namedtuple('SQLType', 'base type')
diff --git a/trytond/model/fields/float.py b/trytond/model/fields/float.py
index be716af..0fb1039 100644
--- a/trytond/model/fields/float.py
+++ b/trytond/model/fields/float.py
@@ -1,9 +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.
-from sql import Query, Expression
-
-from ... import backend
-from .field import Field, SQLType
+from .field import Field
 from ...pyson import PYSON
 
 
@@ -23,6 +20,7 @@ class Float(Field):
     Define a float field (``float``).
     '''
     _type = 'float'
+    _sql_type = 'FLOAT'
 
     def __init__(self, string='', digits=None, help='', required=False,
             readonly=False, domain=None, states=None, select=False,
@@ -50,19 +48,7 @@ class Float(Field):
 
     digits = property(_get_digits, _set_digits)
 
-    @staticmethod
-    def sql_format(value):
-        if isinstance(value, (Query, Expression)):
-            return value
+    def sql_format(self, value):
         if value is None:
             return None
         return float(value)
-
-    def sql_type(self):
-        db_type = backend.name()
-        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 08a08e4..4748080 100644
--- a/trytond/model/fields/function.py
+++ b/trytond/model/fields/function.py
@@ -3,6 +3,7 @@
 
 import inspect
 import copy
+
 from trytond.model.fields.field import Field
 from trytond.tools import is_instance_method
 from trytond.transaction import Transaction
@@ -58,14 +59,24 @@ class Function(Field):
                 return
         setattr(self._field, name, value)
 
+    def set_rpc(self, model):
+        self._field.set_rpc(model)
+
+    def sql_format(self, value):
+        return self._field.sql_format(value)
+
     def sql_type(self):
         return None
 
     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, domain)
+        assert name.startswith(self.name)
+        method = getattr(Model, 'domain_%s' % name, None)
+        if method:
+            return method(domain, tables)
+        if self.searcher:
+            return getattr(Model, self.searcher)(name, domain)
+        Model.raise_user_error('search_function_missing', name)
 
     def get(self, ids, Model, name, values=None):
         '''
@@ -109,3 +120,18 @@ class Function(Field):
 
     def __set__(self, inst, value):
         self._field.__set__(inst, value)
+
+
+class MultiValue(Function):
+
+    def __init__(self, field, loading='lazy'):
+        super(MultiValue, self).__init__(
+            field, '_multivalue_getter', setter='_multivalue_setter',
+            loading=loading)
+
+    def __copy__(self):
+        return MultiValue(copy.copy(self._field), loading=self.loading)
+
+    def __deepcopy__(self, memo):
+        return MultiValue(
+            copy.deepcopy(self._field, memo), loading=self.loading)
diff --git a/trytond/model/fields/integer.py b/trytond/model/fields/integer.py
index 720fa4a..cd18477 100644
--- a/trytond/model/fields/integer.py
+++ b/trytond/model/fields/integer.py
@@ -1,9 +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.
-from sql import Query, Expression
-
-from ... import backend
-from .field import Field, SQLType
+from .field import Field
 
 
 class Integer(Field):
@@ -11,23 +8,7 @@ class Integer(Field):
     Define an integer field (``int``).
     '''
     _type = 'integer'
-
-    def sql_type(self):
-        db_type = backend.name()
-        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 = backend.name()
-        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)
+    _sql_type = 'INTEGER'
 
 
 class BigInteger(Integer):
@@ -35,9 +16,4 @@ class BigInteger(Integer):
     Define an integer field (``long``).
     '''
     _type = 'biginteger'
-
-    def sql_type(self):
-        db_type = backend.name()
-        if db_type == 'postgresql':
-            return SQLType('INT8', 'INT8')
-        return super(BigInteger, self).sql_type()
+    _sql_type = 'BIGINT'
diff --git a/trytond/model/fields/many2many.py b/trytond/model/fields/many2many.py
index 2d24772..09195c6 100644
--- a/trytond/model/fields/many2many.py
+++ b/trytond/model/fields/many2many.py
@@ -6,7 +6,7 @@ from sql import Cast, Literal, Null
 from sql.functions import Substring, Position
 from sql.conditionals import Coalesce
 
-from .field import Field, size_validate, instanciate_values
+from .field import Field, size_validate, instanciate_values, domain_validate
 from ...pool import Pool
 from ...tools import grouped_slice
 from ...transaction import Transaction
@@ -20,8 +20,9 @@ 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, context=None, loading='lazy'):
+            readonly=False, domain=None, filter=None, states=None,
+            on_change=None, 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.
@@ -32,6 +33,7 @@ class Many2Many(Field):
             allowing to specify the order of result
         :param datetime_field: The name of the field that contains the datetime
             value to read the target records.
+        :param filter: A domain to filter target records.
         '''
         if datetime_field:
             if depends:
@@ -49,6 +51,8 @@ class Many2Many(Field):
         self.datetime_field = datetime_field
         self.__size = None
         self.size = size
+        self.__filter = None
+        self.filter = filter
 
     __init__.__doc__ += Field.__init__.__doc__
 
@@ -62,9 +66,22 @@ class Many2Many(Field):
     size = property(_get_size, _set_size)
 
     @property
+    def filter(self):
+        return self.__filter
+
+    @filter.setter
+    def filter(self, value):
+        if value is not None:
+            domain_validate(value)
+        self.__filter = value
+
+    @property
     def add_remove(self):
         return self.domain
 
+    def sql_type(self):
+        return None
+
     def get(self, ids, model, name, values=None):
         '''
         Return target records ordered.
@@ -93,6 +110,8 @@ class Many2Many(Field):
             else:
                 clause = [(self.origin, 'in', list(sub_ids))]
             clause += [(self.target, '!=', None)]
+            if self.filter:
+                clause.append((self.target, 'where', self.filter))
             relations.append(Relation.search(clause, order=order))
         relations = list(chain(*relations))
 
@@ -362,11 +381,7 @@ class Many2Many(Field):
                 relation_domain.append(
                     (self.origin, 'like', Model.__name__ + ',%'))
         else:
-            relation_domain = []
-            for clause in value:
-                relation_domain.append(
-                        ('%s.%s' % (self.target, clause[0]),)
-                        + tuple(clause[1:]))
+            relation_domain = [self.target, operator, value]
         rule_domain = Rule.domain_get(Relation.__name__, mode='read')
         if rule_domain:
             relation_domain = [relation_domain, rule_domain]
@@ -377,8 +392,4 @@ class Many2Many(Field):
             relation_domain, tables=relation_tables)
         query_table = convert_from(None, relation_tables)
         query = query_table.select(origin, where=expression)
-        expression = table.id.in_(query)
-
-        if operator == 'not where':
-            expression = ~expression
-        return expression
+        return table.id.in_(query)
diff --git a/trytond/model/fields/many2one.py b/trytond/model/fields/many2one.py
index f5bfaed..568e3c7 100644
--- a/trytond/model/fields/many2one.py
+++ b/trytond/model/fields/many2one.py
@@ -1,11 +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 sql import Query, Expression, Literal
+from sql import Literal, Column
+from sql.aggregate import Max
+from sql.conditionals import Coalesce
 from sql.operators import Or
 
-from .field import Field, SQLType
+from .field import Field
 from ...pool import Pool
-from ... import backend
 from ...tools import reduce_ids
 from ...transaction import Transaction
 
@@ -15,6 +16,7 @@ class Many2One(Field):
     Define many2one field (``int``).
     '''
     _type = 'many2one'
+    _sql_type = 'INTEGER'
 
     def __init__(self, model_name, string='', left=None, right=None,
             ondelete='SET NULL', datetime_field=None, target_search='join',
@@ -78,24 +80,12 @@ class Many2One(Field):
         assert isinstance(value, (Target, type(None)))
         super(Many2One, self).__set__(inst, value)
 
-    @staticmethod
-    def sql_format(value):
-        if isinstance(value, (Query, Expression)):
-            return value
+    def sql_format(self, value):
         if value is None:
             return None
         assert value is not False
         return int(value)
 
-    def sql_type(self):
-        db_type = backend.name()
-        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_mptt(self, domain, tables):
         cursor = Transaction().connection.cursor()
         table, _ = tables[None]
@@ -195,6 +185,14 @@ class Many2One(Field):
                     return self.convert_domain_tree(
                         (name, operator, ids), tables)
 
+            # Used for Many2Many where clause
+            if operator.endswith('where'):
+                query = Target.search(value, order=[], query=True)
+                expression = column.in_(query)
+                if operator.startswith('not'):
+                    return ~expression
+                return expression
+
             if not isinstance(value, basestring):
                 return super(Many2One, self).convert_domain(domain, tables,
                     Model)
@@ -248,13 +246,27 @@ class Many2One(Field):
         Target = self.get_target()
         table, _ = tables[None]
         target_tables = tables.get(self.name)
+        context = Transaction().context
         if target_tables is None:
-            if Target._history and Transaction().context.get('_datetime'):
+            if Target._history and context.get('_datetime'):
                 target = Target.__table_history__()
+                target_history = Target.__table_history__()
+                history_condition = Column(target, '__id').in_(
+                    target_history.select(
+                        Max(Column(target_history, '__id')),
+                        where=Coalesce(
+                            target_history.write_date,
+                            target_history.create_date)
+                        <= context['_datetime'],
+                        group_by=target_history.id))
             else:
                 target = Target.__table__()
+                history_condition = None
+            condition = target.id == self.sql_column(table)
+            if history_condition:
+                condition &= history_condition
             target_tables = {
-                None: (target, target.id == self.sql_column(table)),
+                None: (target, condition),
                 }
             tables[self.name] = target_tables
         return target_tables
diff --git a/trytond/model/fields/numeric.py b/trytond/model/fields/numeric.py
index ce9abdc..ff2610a 100644
--- a/trytond/model/fields/numeric.py
+++ b/trytond/model/fields/numeric.py
@@ -1,10 +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 decimal import Decimal
-from sql import Query, Expression, Cast, Literal, Select, CombiningQuery, As
+from sql import Cast, Literal, Select, CombiningQuery, As
 
 from ... import backend
-from .field import SQLType
 from .float import Float
 
 
@@ -20,11 +19,9 @@ class Numeric(Float):
     Define a numeric field (``decimal``).
     '''
     _type = 'numeric'
+    _sql_type = 'NUMERIC'
 
-    @staticmethod
-    def sql_format(value):
-        if isinstance(value, (Query, Expression)):
-            return value
+    def sql_format(self, value):
         if value is None:
             return None
         if isinstance(value, (int, long)):
@@ -32,12 +29,6 @@ class Numeric(Float):
         assert isinstance(value, Decimal)
         return value
 
-    def sql_type(self):
-        db_type = backend.name()
-        if db_type == 'mysql':
-            return SQLType('DECIMAL', 'DECIMAL(65, 30)')
-        return SQLType('NUMERIC', 'NUMERIC')
-
     def sql_column(self, table):
         column = super(Numeric, self).sql_column(table)
         db_type = backend.name()
diff --git a/trytond/model/fields/one2many.py b/trytond/model/fields/one2many.py
index c5d8dbb..39ac0e8 100644
--- a/trytond/model/fields/one2many.py
+++ b/trytond/model/fields/one2many.py
@@ -5,17 +5,12 @@ from sql import Cast, Literal
 from sql.functions import Substring, Position
 from sql.conditionals import Coalesce
 
-from .field import Field, size_validate, instanciate_values
+from .field import Field, size_validate, instanciate_values, domain_validate
 from ...pool import Pool
 from ...tools import grouped_slice
 from ...transaction import Transaction
 
 
-def add_remove_validate(value):
-    if value:
-        assert isinstance(value, list), 'add_remove must be a list'
-
-
 class One2Many(Field):
     '''
     Define one2many field (``list``).
@@ -24,8 +19,8 @@ class One2Many(Field):
 
     def __init__(self, model_name, field, string='', add_remove=None,
             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,
+            required=False, readonly=False, domain=None, filter=None,
+            states=None, on_change=None, on_change_with=None, depends=None,
             context=None, loading='lazy'):
         '''
         :param model_name: The name of the target model.
@@ -38,6 +33,7 @@ class One2Many(Field):
             allowing to specify the order of result.
         :param datetime_field: The name of the field that contains the datetime
             value to read the target records.
+        :param filter: A domain to filter target records.
         '''
         if datetime_field:
             if depends:
@@ -56,6 +52,8 @@ class One2Many(Field):
         self.datetime_field = datetime_field
         self.__size = None
         self.size = size
+        self.__filter = None
+        self.filter = filter
 
     __init__.__doc__ += Field.__init__.__doc__
 
@@ -63,7 +61,8 @@ class One2Many(Field):
         return self.__add_remove
 
     def _set_add_remove(self, value):
-        add_remove_validate(value)
+        if value is not None:
+            domain_validate(value)
         self.__add_remove = value
 
     add_remove = property(_get_add_remove, _set_add_remove)
@@ -77,6 +76,19 @@ class One2Many(Field):
 
     size = property(_get_size, _set_size)
 
+    def sql_type(self):
+        return None
+
+    @property
+    def filter(self):
+        return self.__filter
+
+    @filter.setter
+    def filter(self, value):
+        if value is not None:
+            domain_validate(value)
+        self.__filter = value
+
     def get(self, ids, model, name, values=None):
         '''
         Return target records ordered.
@@ -95,6 +107,8 @@ class One2Many(Field):
                 clause = [(self.field, 'in', references)]
             else:
                 clause = [(self.field, 'in', list(sub_ids))]
+            if self.filter:
+                clause.append(self.filter)
             targets.append(Relation.search(clause, order=self.order))
         targets = list(chain(*targets))
 
diff --git a/trytond/model/fields/property.py b/trytond/model/fields/property.py
deleted file mode 100644
index e04da69..0000000
--- a/trytond/model/fields/property.py
+++ /dev/null
@@ -1,183 +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 copy
-
-from sql import Cast, Literal, Null
-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 .integer import Integer
-from .float import Float
-from ...transaction import Transaction
-from ...pool import Pool
-
-
-class Property(Function):
-    '''
-    Define a property field that is stored in ir.property (any).
-    '''
-
-    def __init__(self, field):
-        '''
-        :param field: The field of the function.
-        '''
-        super(Property, self).__init__(field, True, True, True)
-
-    __init__.__doc__ += Field.__init__.__doc__
-
-    def __copy__(self):
-        return Property(copy.copy(self._field))
-
-    def __deepcopy__(self, memo):
-        return Property(copy.deepcopy(self._field))
-
-    def get(self, ids, model, name, values=None):
-        '''
-        Retreive the property.
-
-        :param ids: A list of ids.
-        :param model: The model.
-        :param name: The name of the field or a list of name field.
-        :param values:
-        :return: a dictionary with ids as key and values as value
-        '''
-        with Transaction().set_context(_check_access=False):
-            pool = Pool()
-            Property = pool.get('ir.property')
-            return Property.get(name, model.__name__, ids)
-
-    def set(self, Model, name, ids, value, *args):
-        '''
-        Set the property.
-        '''
-        with Transaction().set_context(_check_access=False):
-            pool = Pool()
-            Property = pool.get('ir.property')
-            args = iter((ids, value) + args)
-            for ids, value in zip(args, args):
-                if value is not None:
-                    prop_value = '%s,%s' % (getattr(self, 'model_name', ''),
-                        str(value))
-                else:
-                    prop_value = None
-                # TODO change set API to use sequence of records, value
-                Property.set(name, Model.__name__, ids, prop_value)
-
-    def convert_domain(self, domain, tables, Model):
-        pool = Pool()
-        Rule = pool.get('ir.rule')
-        Property = pool.get('ir.property')
-        IrModel = pool.get('ir.model')
-        Field = pool.get('ir.model.field')
-        cursor = Transaction().connection.cursor()
-
-        name, operator, value = domain
-
-        sql_type = self._field.sql_type().base
-
-        property_cond = Rule.query_get('ir.property')
-
-        property_ = Property.__table__()
-        model_field = Field.__table__()
-        model = IrModel.__table__()
-
-        # Fetch res ids that comply with the domain
-        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,
-                # Use a Case because the condition created by get_condition
-                # could result in an invalid Cast
-                where=Case(
-                    (cond, self.get_condition(sql_type, domain, property_)),
-                    else_=(Literal(1) == Literal(0)))))
-
-        props = cursor.fetchall()
-        default = None
-        for prop in props:
-            if not prop[0]:
-                default = prop[1]
-                break
-
-        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', '!='])):
-                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(*property_.select(
-                Cast(Substring(property_.res,
-                        Position(',', property_.res) + Literal(1)),
-                    Model.id.sql_type().base),
-                where=property_cond & (property_.res != Null)))
-
-        fetchall = cursor.fetchall()
-        if not fetchall:
-            return [('id', 'in', [x[0] for x in props])]
-
-        else:
-            other_ids = [x[0] for x in fetchall]
-
-            res_ids = Model.search(['OR',
-                ('id', 'in', [x[0] for x in props]),
-                ('id', 'not in', other_ids)
-                ])
-
-            return [('id', 'in', res_ids)]
-
-    @staticmethod
-    def get_condition(sql_type, clause, table):
-        operator = clause[1]
-        value = clause[2]
-
-        sql_types = [
-            Numeric('numeric').sql_type().base,
-            Integer('integer').sql_type().base,
-            Float('float').sql_type().base,
-            ]
-        if sql_type in sql_types and value:
-            if isinstance(value, (list, tuple)):
-                value = [Cast(v, sql_type) for v in value]
-            else:
-                value = Cast(value, sql_type)
-
-        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 != Null
-        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 76433c4..0e56cd6 100644
--- a/trytond/model/fields/reference.py
+++ b/trytond/model/fields/reference.py
@@ -5,11 +5,10 @@ import warnings
 from sql import Cast, Literal, Query, Expression
 from sql.functions import Substring, Position
 
-from .field import Field, SQLType
-from .char import Char
+from .field import Field
 from ...transaction import Transaction
 from ...pool import Pool
-from ... import backend
+from ...rpc import RPC
 
 
 class Reference(Field):
@@ -17,6 +16,7 @@ class Reference(Field):
     Define a reference field (``str``).
     '''
     _type = 'reference'
+    _sql_type = 'VARCHAR'
 
     def __init__(self, string='', selection=None, selection_change_with=None,
             help='', required=False, readonly=False, domain=None, states=None,
@@ -48,6 +48,15 @@ class Reference(Field):
             self.selection_change_with |= set(selection_change_with)
     __init__.__doc__ += Field.__init__.__doc__
 
+    def set_rpc(self, model):
+        super(Reference, self).set_rpc(model)
+        if not isinstance(self.selection, (list, tuple)):
+            assert hasattr(model, self.selection), \
+                'Missing %s on model %s' % (self.selection, model.__name__)
+            instantiate = 0 if self.selection_change_with else None
+            model.__rpc__.setdefault(
+                self.selection, RPC(instantiate=instantiate))
+
     def get(self, ids, model, name, values=None):
         '''
         Replace removed reference id by None.
@@ -112,20 +121,13 @@ class Reference(Field):
                 value = Target(value)
         super(Reference, self).__set__(inst, value)
 
-    @staticmethod
-    def sql_format(value):
+    def sql_format(self, 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 = backend.name()
-        if db_type == 'mysql':
-            return SQLType('CHAR', 'VARCHAR(255)')
-        return SQLType('VARCHAR', 'VARCHAR')
+        return super(Reference, self).sql_format(value)
 
     def convert_domain(self, domain, tables, Model):
         if '.' not in domain[0]:
diff --git a/trytond/model/fields/selection.py b/trytond/model/fields/selection.py
index 976dbf2..e7fddb0 100644
--- a/trytond/model/fields/selection.py
+++ b/trytond/model/fields/selection.py
@@ -4,10 +4,10 @@ import warnings
 
 from sql.conditionals import Case
 
-from ... import backend
 from ...transaction import Transaction
 from ...tools import is_instance_method
-from .field import Field, SQLType
+from .field import Field
+from ...rpc import RPC
 
 
 class Selection(Field):
@@ -15,6 +15,7 @@ class Selection(Field):
     Define a selection field (``str``).
     '''
     _type = 'selection'
+    _sql_type = 'VARCHAR'
 
     def __init__(self, selection, string='', sort=True,
             selection_change_with=None, translate=True, help='',
@@ -45,11 +46,14 @@ class Selection(Field):
         self.translate_selection = translate
     __init__.__doc__ += Field.__init__.__doc__
 
-    def sql_type(self):
-        db_type = backend.name()
-        if db_type == 'mysql':
-            return SQLType('CHAR', 'VARCHAR(255)')
-        return SQLType('VARCHAR', 'VARCHAR')
+    def set_rpc(self, model):
+        super(Selection, self).set_rpc(model)
+        if not isinstance(self.selection, (list, tuple)):
+            assert hasattr(model, self.selection), \
+                'Missing %s on model %s' % (self.selection, model.__name__)
+            instantiate = 0 if self.selection_change_with else None
+            model.__rpc__.setdefault(
+                self.selection, RPC(instantiate=instantiate))
 
     def convert_order(self, name, tables, Model):
         if getattr(Model, 'order_%s' % name, None):
diff --git a/trytond/model/fields/text.py b/trytond/model/fields/text.py
index f97a805..49ee595 100644
--- a/trytond/model/fields/text.py
+++ b/trytond/model/fields/text.py
@@ -1,7 +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 .field import SQLType
 from .char import Char
 
 
@@ -10,6 +8,4 @@ class Text(Char):
     Define a text field (``unicode``).
     '''
     _type = 'text'
-
-    def sql_type(self):
-        return SQLType('TEXT', 'TEXT')
+    _sql_type = 'TEXT'
diff --git a/trytond/model/match.py b/trytond/model/match.py
index cb82f19..f4e7f89 100644
--- a/trytond/model/match.py
+++ b/trytond/model/match.py
@@ -4,16 +4,16 @@
 
 class MatchMixin(object):
 
-    def match(self, pattern):
+    def match(self, pattern, match_none=False):
         '''Match on pattern
         pattern is a dictionary with model field as key
         and matching value as value'''
         for field, pattern_value in pattern.iteritems():
             value = getattr(self, field)
-            if value is None:
+            if not match_none and value is None:
                 continue
             if self._fields[field]._type == 'many2one':
-                value = value.id
+                value = value.id if value else value
             if value != pattern_value:
                 return False
         return True
diff --git a/trytond/model/model.py b/trytond/model/model.py
index 02ef5d6..cb6ff90 100644
--- a/trytond/model/model.py
+++ b/trytond/model/model.py
@@ -123,7 +123,6 @@ class Model(WarningErrorMixin, URLMixin, PoolBase):
         If with_rec_name is True, rec_name will be added.
         '''
         pool = Pool()
-        Property = pool.get('ir.property')
         value = {}
 
         default_rec_name = Transaction().context.get('default_rec_name')
@@ -140,8 +139,6 @@ class Model(WarningErrorMixin, URLMixin, PoolBase):
             if (field._type == 'boolean'
                     and field_name not in value):
                 value[field_name] = False
-            if isinstance(field, fields.Property):
-                value[field_name] = Property.get(field_name, cls.__name__)
             if (with_rec_name
                     and field._type in ('many2one',)
                     and value.get(field_name)):
@@ -241,11 +238,9 @@ class Model(WarningErrorMixin, URLMixin, PoolBase):
                     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)
-                    or (cls._fields[field]._type in ('binary', 'sha'))
-                    or (isinstance(cls._fields[field], fields.Property)
-                        and isinstance(cls._fields[field]._field,
-                            fields.Many2One))):
+                        and not (cls._fields[field].searcher
+                            or getattr(cls, 'domain_%s' % field, None)))
+                    or (cls._fields[field]._type in ('binary', 'sha'))):
                 res[field]['searchable'] = False
             else:
                 res[field]['searchable'] = True
@@ -329,6 +324,9 @@ class Model(WarningErrorMixin, URLMixin, PoolBase):
                     True)
                 res[field]['delete'] = accesses.get(field, {}).get('delete',
                     True)
+            filter_ = getattr(cls._fields[field], 'filter', None)
+            if filter_:
+                res[field]['domain'] = ['AND', res[field]['domain'], filter_]
 
             # convert attributes into pyson
             for attr in ('states', 'domain', 'context', 'digits', 'size',
@@ -361,14 +359,21 @@ class Model(WarningErrorMixin, URLMixin, PoolBase):
                     setattr(self, name, value)
                 else:
                     parent_values[name] = value
-            for name, value in parent_values.iteritems():
+
+            def set_parent_value(record, name, value):
                 parent_name, field = name.split('.', 1)
                 parent_name = parent_name[8:]  # Strip '_parent_'
-                parent = getattr(self, parent_name, None)
+                parent = getattr(record, parent_name, None)
                 if parent is not None:
-                    setattr(parent, field, value)
+                    if not field.startswith('_parent_'):
+                        setattr(parent, field, value)
+                    else:
+                        set_parent_value(parent, field, value)
                 else:
-                    setattr(self, parent_name, {field: value})
+                    setattr(record, parent_name, {field: value})
+
+            for name, value in parent_values.iteritems():
+                set_parent_value(self, name, value)
             self._init_values = self._values.copy()
         else:
             self._values = None
diff --git a/trytond/model/modelsql.py b/trytond/model/modelsql.py
index 3d5d164..0cc3723 100644
--- a/trytond/model/modelsql.py
+++ b/trytond/model/modelsql.py
@@ -4,7 +4,8 @@ import datetime
 from itertools import islice, izip, chain, ifilter
 from collections import OrderedDict
 
-from sql import Table, Column, Literal, Desc, Asc, Expression, Null
+from sql import (Table, Column, Literal, Desc, Asc, Expression, Null,
+    NullsFirst, NullsLast)
 from sql.functions import CurrentTimestamp, Extract
 from sql.conditionals import Coalesce
 from sql.operators import Or, And, Operator
@@ -148,34 +149,18 @@ class ModelSQL(ModelStorage):
             sql_type = field.sql_type()
             if not sql_type:
                 continue
-            default_fun = None
+
+            default = None
             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
+                def default():
+                    default_ = cls._clean_defaults({
+                            field_name: cls._defaults[field_name](),
+                            })[field_name]
+                    return field.sql_format(default_)
 
-            table.add_raw_column(field_name, sql_type, field.sql_format,
-                default_fun, field_size, string=field.string)
+            table.add_column(field_name, field._sql_type, default=default)
             if cls._history:
-                history_table.add_raw_column(field_name, sql_type, None,
-                    string=field.string)
+                history_table.add_column(field_name, field._sql_type)
 
             if isinstance(field, (fields.Integer, fields.Float)):
                 # migration from tryton 2.2
@@ -186,13 +171,22 @@ class ModelSQL(ModelStorage):
 
             if isinstance(field, fields.Many2One):
                 if field.model_name in ('res.user', 'res.group'):
+                    # XXX need to merge ir and res
                     ref = field.model_name.replace('.', '_')
                 else:
-                    ref = pool.get(field.model_name)._table
+                    ref_model = pool.get(field.model_name)
+                    if (isinstance(ref_model, ModelSQL)
+                            and not ref_model.table_query()):
+                        ref = ref_model._table
+                        # Create foreign key table if missing
+                        if not TableHandler.table_exist(ref):
+                            TableHandler(ref_model)
+                    else:
+                        ref = None
                 if field_name in ['create_uid', 'write_uid']:
                     # migration from 3.6
                     table.drop_fk(field_name)
-                else:
+                elif ref:
                     table.add_fk(field_name, ref, field.ondelete)
 
             table.index_action(
@@ -245,16 +239,11 @@ class ModelSQL(ModelStorage):
     def _update_history_table(cls):
         TableHandler = backend.get('TableHandler')
         if cls._history:
-            table = TableHandler(cls)
             history_table = TableHandler(cls, history=True)
-            for column_name in table._columns:
-                string = ''
-                if column_name in cls._fields:
-                    string = cls._fields[column_name].string
-                history_table.add_raw_column(column_name,
-                    (table._columns[column_name]['typname'],
-                        table._columns[column_name]['typname']),
-                    None, string=string)
+            for field_name, field in cls._fields.iteritems():
+                if not field.sql_type():
+                    continue
+                history_table.add_column(field_name, field._sql_type)
 
     @classmethod
     def _get_error_messages(cls):
@@ -719,22 +708,37 @@ class ModelSQL(ModelStorage):
         else:
             result = [{'id': x} for x in ids]
 
+        cachable_fields = []
         for column in columns:
             # Split the output name to remove SQLite type detection
-            field = column.output_name.split()[0]
-            if field == '_timestamp':
+            fname = column.output_name.split()[0]
+            if fname == '_timestamp':
                 continue
-            if (getattr(cls._fields[field], 'translate', False)
-                    and not hasattr(field, 'get')):
-                translations = Translation.get_ids(cls.__name__ + ',' + field,
-                    'model', Transaction().language, ids)
-                for row in result:
-                    row[field] = translations.get(row['id']) or row[field]
+            field = cls._fields[fname]
+            if not hasattr(field, 'get'):
+                if getattr(field, 'translate', False):
+                    translations = Translation.get_ids(
+                        cls.__name__ + ',' + fname, 'model',
+                        Transaction().language, ids)
+                    for row in result:
+                        row[fname] = translations.get(row['id']) or row[fname]
+                if fname != 'id':
+                    cachable_fields.append(fname)
 
         # all fields for which there is a get attribute
         getter_fields = [f for f in
             fields_names + fields_related.keys() + datetime_fields
             if f in cls._fields and hasattr(cls._fields[f], 'get')]
+
+        if getter_fields and cachable_fields:
+            cache = transaction.get_cache().setdefault(
+                cls.__name__, LRUDict(cache_size()))
+            for row in result:
+                if row['id'] not in cache:
+                    cache[row['id']] = {}
+                for fname in cachable_fields:
+                    cache[row['id']][fname] = row[fname]
+
         func_fields = {}
         for fname in getter_fields:
             field = cls._fields[fname]
@@ -1125,14 +1129,25 @@ class ModelSQL(ModelStorage):
             'DESC': Desc,
             'ASC': Asc,
             }
+        null_ordering_types = {
+            'NULLS FIRST': NullsFirst,
+            'NULLS LAST': NullsLast,
+            None: lambda _: _
+            }
         if order is None or order is False:
             order = cls._order
         for oexpr, otype in order:
             fname, _, extra_expr = oexpr.partition('.')
             field = cls._fields[fname]
-            Order = order_types[otype.upper()]
+            otype = otype.upper()
+            try:
+                otype, null_ordering = otype.split(' ', 1)
+            except ValueError:
+                null_ordering = None
+            Order = order_types[otype]
+            NullOrdering = null_ordering_types[null_ordering]
             forder = field.convert_order(oexpr, tables, cls)
-            order_by.extend((Order(o) for o in forder))
+            order_by.extend((NullOrdering(Order(o)) for o in forder))
 
         # construct a clause for the rules :
         domain = Rule.domain_get(cls.__name__, mode='read')
diff --git a/trytond/model/modelstorage.py b/trytond/model/modelstorage.py
index 9a5fd5d..e1bcc7d 100644
--- a/trytond/model/modelstorage.py
+++ b/trytond/model/modelstorage.py
@@ -286,8 +286,8 @@ class ModelStorage(Model):
                 if field_name in default:
                     data[field_name] = default[field_name]
                 elif (isinstance(cls._fields[field_name], fields.Function)
-                        and not isinstance(cls._fields[field_name],
-                            fields.Property)):
+                        and not isinstance(
+                            cls._fields[field_name], fields.MultiValue)):
                     del data[field_name]
                 elif ftype in ('many2one', 'one2one'):
                     try:
@@ -315,7 +315,7 @@ class ModelStorage(Model):
                 mptt.add(field.right)
         fields_names = [n for n, f in cls._fields.iteritems()
             if (not isinstance(f, fields.Function)
-                or isinstance(f, fields.Property))
+                or isinstance(f, fields.MultiValue))
             and n not in mptt]
         ids = map(int, records)
         datas = cls.read(ids, fields_names=fields_names)
@@ -1050,7 +1050,9 @@ class ModelStorage(Model):
                         error_args['value'] = repr(value)
                         cls.raise_user_error('digits_validation_record',
                             error_args=error_args)
-                    if value is None:
+                    if (value is None
+                            or not digits
+                            or any(d is None for d in digits)):
                         return
                     if isinstance(value, Decimal):
                         if (value.quantize(Decimal(str(10.0 ** -digits[1])))
@@ -1060,7 +1062,7 @@ class ModelStorage(Model):
                         if not (round(value, digits[1]) == float(value)):
                             raise_user_error(value)
                 # validate digits
-                if hasattr(field, 'digits') and field.digits:
+                if getattr(field, 'digits', None):
                     if is_pyson(field.digits):
                         pyson_digits = PYSONEncoder().encode(field.digits)
                         for record in records:
@@ -1312,9 +1314,12 @@ class ModelStorage(Model):
                     model_name, record_id = value.split(',')
                     Model = Pool().get(model_name)
                     try:
-                        value = int(record_id)
+                        record_id = int(record_id)
                     except ValueError:
                         return value
+                    if record_id < 0:
+                        return value
+                    value = record_id
                 else:
                     Model = field.get_target()
             except KeyError:
diff --git a/trytond/model/modelview.py b/trytond/model/modelview.py
index 8a2c2b4..3c8be21 100644
--- a/trytond/model/modelview.py
+++ b/trytond/model/modelview.py
@@ -14,6 +14,8 @@ from trytond.pool import Pool
 from trytond.exceptions import UserError
 from trytond.rpc import RPC
 
+from .fields import on_change_result
+
 __all__ = ['ModelView']
 
 
@@ -86,10 +88,6 @@ def on_change(func):
     return wrapper
 
 
-def on_change_result(record):
-    return record._changed_values
-
-
 class ModelView(Model):
     """
     Define a model with views in Tryton.
@@ -179,24 +177,7 @@ class ModelView(Model):
 
         # Update __rpc__
         for field_name, field in cls._fields.iteritems():
-            if (isinstance(field, (fields.Selection, fields.Reference))
-                    or (isinstance(field, fields.Function)
-                        and isinstance(field._field,
-                            (fields.Selection, fields.Reference)))) \
-                    and not isinstance(field.selection, (list, tuple)) \
-                    and field.selection not in cls.__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)
-                if getattr(cls, function_name, None):
-                    result = None
-                    if attribute == 'on_change':
-                        result = on_change_result
-                    cls.__rpc__.setdefault(function_name,
-                        RPC(instantiate=0, result=result))
+            field.set_rpc(cls)
 
         for button in cls._buttons:
             if not is_instance_method(cls, button):
diff --git a/trytond/model/multivalue.py b/trytond/model/multivalue.py
new file mode 100644
index 0000000..f3d7e60
--- /dev/null
+++ b/trytond/model/multivalue.py
@@ -0,0 +1,87 @@
+# This file is part of Tryton.  The COPYRIGHT file at the toplevel of this
+# repository contains the full copyright notices and license terms.
+from ..pool import Pool
+from .model import Model
+from .match import MatchMixin
+
+
+class MultiValueMixin(object):
+
+    @classmethod
+    def multivalue_model(cls, field):
+        pool = Pool()
+        Value = pool.get('%s.%s' % (cls.__name__, field))
+        assert issubclass(Value, ValueMixin), (
+            "%s is not a subclass of ValueMixin" % Value)
+        return Value
+
+    def multivalue_records(self, field):
+        Value = self.multivalue_model(field)
+        for fname, field in self._fields.iteritems():
+            if (field._type == 'one2many'
+                    and field.model_name == Value.__name__):
+                return getattr(self, fname)
+        return Value.search([])
+
+    def multivalue_record(self, field, **pattern):
+        Value = self.multivalue_model(field)
+        for fname, field in Value._fields.iteritems():
+            if (field._type == 'many2one'
+                    and field.model_name == self.__name__):
+                pattern = pattern.copy()
+                pattern[fname] = self
+                break
+        return Value(**pattern)
+
+    def __values(self, field, pattern, match_none=True):
+        return [v for v in self.multivalue_records(field)
+            if v.match(pattern, match_none=match_none)]
+
+    def get_multivalue(self, name, **pattern):
+        values = self.__values(name, pattern, match_none=False)
+        if not values:
+            Value = self.multivalue_model(name)
+            value = Value(**pattern)
+            func = getattr(self, 'default_%s' % name, lambda **kw: None)
+            setattr(value, name, func(**pattern))
+        else:
+            value = values[0]
+        return getattr(value, name)
+
+    def _multivalue_getter(self, name):
+        Value = self.multivalue_model(name)
+        value = self.get_multivalue(name)
+        if isinstance(value, Model):
+            if Value._fields[name]._type == 'reference':
+                return str(value)
+            return value.id
+        elif isinstance(value, (list, tuple)):
+            return [r.id for r in value]
+        else:
+            return value
+
+    def set_multivalue(self, name, value, _save=True, **pattern):
+        Value = self.multivalue_model(name)
+        values = self.__values(name, pattern, match_none=True)
+        if not values:
+            values = [self.multivalue_record(name, **pattern)]
+        for record in values:
+            setattr(record, name, value)
+        if _save:
+            Value.save(values)
+        else:
+            return values
+
+    @classmethod
+    def _multivalue_setter(cls, records, name, val):
+        Value = cls.multivalue_model(name)
+        to_save = []
+        for record in records:
+            to_save.extend(record.set_multivalue(name, val, _save=False))
+        Value.save(to_save)
+
+
+class ValueMixin(MatchMixin):
+
+    def match(self, pattern, match_none=True):
+        return super(ValueMixin, self).match(pattern, match_none=match_none)
diff --git a/trytond/model/order.py b/trytond/model/order.py
index d5a59b2..0a99ec8 100644
--- a/trytond/model/order.py
+++ b/trytond/model/order.py
@@ -1,14 +1,10 @@
 # This file is part of Tryton.  The COPYRIGHT file at the toplevel of this
 # repository contains the full copyright notices and license terms.
-from sql import Null, Column
-from sql.operators import Equal, NotEqual
-from sql.conditionals import Case
-
 from trytond.model import fields
 
 
 def sequence_ordered(field_name='sequence', field_label='Sequence',
-        order='ASC', null_first=True):
+        order='ASC NULLS FIRST'):
     "Returns a mixin to order the model by order fields"
 
     class SequenceOrderedMixin(object):
@@ -20,14 +16,4 @@ def sequence_ordered(field_name='sequence', field_label='Sequence',
             cls._order = [(field_name, order)] + cls._order
 
     setattr(SequenceOrderedMixin, field_name, fields.Integer(field_label))
-
-    @classmethod
-    def order_function(cls, tables):
-        table, _ = tables[None]
-        operator = Equal
-        if not null_first:
-            operator = NotEqual
-        field = Column(table, field_name)
-        return [Case((operator(field, Null), 0), else_=1), field]
-    setattr(SequenceOrderedMixin, 'order_%s' % field_name, order_function)
     return SequenceOrderedMixin
diff --git a/trytond/modules/__init__.py b/trytond/modules/__init__.py
index 2a06a7c..b25506f 100644
--- a/trytond/modules/__init__.py
+++ b/trytond/modules/__init__.py
@@ -17,7 +17,6 @@ from sql.functions import CurrentTimestamp
 import trytond.tools as tools
 from trytond.config import config
 from trytond.transaction import Transaction
-from trytond.cache import Cache
 from trytond import backend
 import trytond.convert as convert
 
@@ -446,7 +445,6 @@ def load_modules(database_name, pool, update=None, lang=None):
                 Module.update_list()
         # Need to commit to unlock SQLite database
         transaction.commit()
-        Cache.resets(database_name)
 
     if not Transaction().connection:
         with Transaction().start(database_name, 0):
diff --git a/trytond/protocols/dispatcher.py b/trytond/protocols/dispatcher.py
index fe81f6a..055f84c 100644
--- a/trytond/protocols/dispatcher.py
+++ b/trytond/protocols/dispatcher.py
@@ -13,9 +13,9 @@ from trytond import backend
 from trytond.config import config
 from trytond import __version__
 from trytond.transaction import Transaction
-from trytond.cache import Cache
 from trytond.exceptions import (
-    UserError, UserWarning, ConcurrencyException, LoginException)
+    UserError, UserWarning, ConcurrencyException, LoginException,
+    RateLimitException)
 from trytond.tools import is_instance_method
 from trytond.wsgi import app
 from .wrappers import with_pool
@@ -49,16 +49,18 @@ def login(request, database_name, user, parameters, language=None):
     except DatabaseOperationalError:
         logger.error('fail to connect to %s', database_name, exc_info=True)
         abort(404)
-    session = security.login(
-        database_name, user, parameters, language=language)
-    with Transaction().start(database_name, 0):
-        Cache.clean(database_name)
-        Cache.resets(database_name)
+    try:
+        session = security.login(
+            database_name, user, parameters, language=language)
+        code = 403
+    except RateLimitException:
+        session = None
+        code = 429
     msg = 'successful login' if session else 'bad login or password'
     logger.info('%s \'%s\' from %s using %s on database \'%s\'',
         msg, user, request.remote_addr, request.scheme, database_name)
     if not session:
-        abort(403)
+        abort(code)
     return session
 
 
@@ -98,7 +100,8 @@ def db_exist(request, database_name):
 def db_list(*args):
     if not config.getboolean('database', 'list'):
         raise Exception('AccessDenied')
-    with Transaction().start(None, 0, close=True) as transaction:
+    with Transaction().start(
+            None, 0, close=True, _nocache=True) as transaction:
         return transaction.database.list()
 
 
@@ -150,7 +153,6 @@ def _dispatch(request, pool, *args, **kwargs):
     for count in range(config.getint('database', 'retry'), -1, -1):
         with Transaction().start(pool.database_name, user,
                 readonly=rpc.readonly) as transaction:
-            Cache.clean(pool.database_name)
             try:
                 c_args, c_kwargs, transaction.context, transaction.timestamp \
                     = rpc.convert(obj, *args, **kwargs)
@@ -181,7 +183,6 @@ def _dispatch(request, pool, *args, **kwargs):
                 raise
             # Need to commit to unlock SQLite database
             transaction.commit()
-            Cache.resets(pool.database_name)
         if request.authorization.type == 'session':
             try:
                 with Transaction().start(pool.database_name, 0) as transaction:
diff --git a/trytond/protocols/jsonrpc.py b/trytond/protocols/jsonrpc.py
index d415da9..fd166fa 100644
--- a/trytond/protocols/jsonrpc.py
+++ b/trytond/protocols/jsonrpc.py
@@ -156,5 +156,6 @@ class JSONProtocol:
             if isinstance(data, Exception):
                 return InternalServerError(data)
             response = data
-        return Response(json.dumps(response, cls=JSONEncoder),
+        return Response(json.dumps(
+                response, cls=JSONEncoder, separators=(',', ':')),
             content_type='application/json')
diff --git a/trytond/protocols/wrappers.py b/trytond/protocols/wrappers.py
index ae20fe3..e0f1b11 100644
--- a/trytond/protocols/wrappers.py
+++ b/trytond/protocols/wrappers.py
@@ -16,7 +16,6 @@ from trytond import security, backend
 from trytond.pool import Pool
 from trytond.transaction import Transaction
 from trytond.config import config
-from trytond.cache import Cache
 
 logger = logging.getLogger(__name__)
 
@@ -123,7 +122,6 @@ def with_transaction(readonly=None):
                         pool.database_name, 0, readonly=readonly_
                         ) as transaction:
                     try:
-                        Cache.clean(pool.database_name)
                         result = func(request, pool, *args, **kwargs)
                     except DatabaseOperationalError:
                         if count and not readonly_:
@@ -136,7 +134,6 @@ def with_transaction(readonly=None):
                         raise
                     # Need to commit to unlock SQLite database
                     transaction.commit()
-                    Cache.resets(pool.database_name)
                 return result
         return wrapper
     return decorator
@@ -173,7 +170,7 @@ def user_application(name, json=True):
                     if isinstance(e, HTTPException):
                         raise
                     logger.error('%s', request, exc_info=True)
-                    abort(500)
+                    abort(500, e)
             if not isinstance(response, Response) and json:
                 response = Response(json_.dumps(response, cls=JSONEncoder),
                     content_type='application/json')
diff --git a/trytond/report/report.py b/trytond/report/report.py
index 8ce19bc..5ed1f74 100644
--- a/trytond/report/report.py
+++ b/trytond/report/report.py
@@ -76,6 +76,7 @@ class TranslateFactory:
             cache = self.cache[self.language] = {}
             code = self.language
             while code:
+                # Order to get empty module/custom report first
                 translations = self.translation.search([
                     ('lang', '=', code),
                     ('type', '=', 'report'),
@@ -84,7 +85,7 @@ class TranslateFactory:
                     ('value', '!=', None),
                     ('fuzzy', '=', False),
                     ('res_id', '=', -1),
-                    ])
+                    ], order=[('module', 'DESC')])
                 for translation in translations:
                     cache.setdefault(translation.src, translation.value)
                 code = get_parent_language(code)
diff --git a/trytond/res/__init__.py b/trytond/res/__init__.py
index d80ac99..582d34c 100644
--- a/trytond/res/__init__.py
+++ b/trytond/res/__init__.py
@@ -15,7 +15,6 @@ def register():
         Group,
         User,
         LoginAttempt,
-        Group2,
         UserAction,
         UserGroup,
         Warning_,
diff --git a/trytond/res/group.py b/trytond/res/group.py
index 528e5fc..fd6f881 100644
--- a/trytond/res/group.py
+++ b/trytond/res/group.py
@@ -3,12 +3,10 @@
 "Group"
 from itertools import chain
 from ..model import ModelView, ModelSQL, fields, Unique
-from ..pool import Pool, PoolMeta
+from ..pool import Pool
 from ..tools import grouped_slice
 
-__all__ = [
-    'Group', 'Group2',
-    ]
+__all__ = ['Group']
 
 
 class MenuMany2Many(fields.Many2Many):
@@ -33,10 +31,13 @@ class Group(ModelSQL, ModelView):
     "Group"
     __name__ = "res.group"
     name = fields.Char('Name', required=True, select=True, translate=True)
+    users = fields.Many2Many('res.user-res.group', 'group', 'user', 'Users')
     model_access = fields.One2Many('ir.model.access', 'group',
        'Access Model')
     field_access = fields.One2Many('ir.model.field.access', 'group',
         'Access Field')
+    buttons = fields.Many2Many(
+        'ir.model.button-res.group', 'group', 'button', "Buttons")
     rule_groups = fields.Many2Many('ir.rule.group-res.group',
        'group', 'rule_group', 'Rules',
        domain=[('global_p', '!=', True), ('default_p', '!=', True)])
@@ -115,9 +116,3 @@ class Group(ModelSQL, ModelView):
         pool.get('ir.model.access')._get_access_cache.clear()
         pool.get('ir.model.field.access')._get_access_cache.clear()
         ModelView._fields_view_get_cache.clear()
-
-
-class Group2:
-    __metaclass__ = PoolMeta
-    __name__ = "res.group"
-    users = fields.Many2Many('res.user-res.group', 'group', 'user', 'Users')
diff --git a/trytond/res/ir.xml b/trytond/res/ir.xml
index f71002b..dabe6bd 100644
--- a/trytond/res/ir.xml
+++ b/trytond/res/ir.xml
@@ -371,21 +371,6 @@ this repository contains the full copyright notices and license terms. -->
             <field name="perm_create" eval="True"/>
             <field name="perm_delete" eval="True"/>
         </record>
-        <record model="ir.model.access" id="access_ir_property">
-            <field name="model" search="[('model', '=', 'ir.property')]"/>
-            <field name="perm_read" eval="True"/>
-            <field name="perm_write" eval="False"/>
-            <field name="perm_create" eval="False"/>
-            <field name="perm_delete" eval="False"/>
-        </record>
-        <record model="ir.model.access" id="access_ir_property_admin">
-            <field name="model" search="[('model', '=', 'ir.property')]"/>
-            <field name="group" ref="group_admin"/>
-            <field name="perm_read" eval="True"/>
-            <field name="perm_write" eval="True"/>
-            <field name="perm_create" eval="True"/>
-            <field name="perm_delete" eval="True"/>
-        </record>
         <record model="ir.model.access" id="access_ir_module">
             <field name="model" search="[('model', '=', 'ir.module')]"/>
             <field name="perm_read" eval="True"/>
@@ -694,14 +679,6 @@ this repository contains the full copyright notices and license terms. -->
             <field name="menu" ref="ir.menu_rule_group_form"/>
             <field name="group" ref="group_admin"/>
         </record>
-        <record model="ir.ui.menu-res.group" id="menu_property_form_default_group_admin">
-            <field name="menu" ref="ir.menu_property_form_default"/>
-            <field name="group" ref="group_admin"/>
-        </record>
-        <record model="ir.ui.menu-res.group" id="menu_property_form_group_admin">
-            <field name="menu" ref="ir.menu_property_form"/>
-            <field name="group" ref="group_admin"/>
-        </record>
         <record model="ir.ui.menu-res.group" id="menu_modules_group_admin">
             <field name="menu" ref="ir.menu_modules"/>
             <field name="group" ref="group_admin"/>
diff --git a/trytond/res/locale/bg.po b/trytond/res/locale/bg.po
index 711312e..dec04b3 100644
--- a/trytond/res/locale/bg.po
+++ b/trytond/res/locale/bg.po
@@ -7,6 +7,30 @@ msgid "The name of the group must be unique!"
 msgstr "Името на групата трябва да е уникално!"
 
 msgctxt "error:res.user:"
+msgid "The password can not be the same as user email."
+msgstr ""
+
+msgctxt "error:res.user:"
+msgid "The password can not be the same as user login."
+msgstr ""
+
+msgctxt "error:res.user:"
+msgid "The password can not be the same as user name."
+msgstr ""
+
+msgctxt "error:res.user:"
+msgid "The password contains too much times the same characters."
+msgstr ""
+
+msgctxt "error:res.user:"
+msgid "The password is forbidden."
+msgstr ""
+
+msgctxt "error:res.user:"
+msgid "The password is too short."
+msgstr ""
+
+msgctxt "error:res.user:"
 msgid ""
 "Users can not be deleted for logging purpose.\n"
 "Instead you must inactivate them."
@@ -271,6 +295,11 @@ msgctxt "field:ir.ui.menu-res.group,write_uid:"
 msgid "Write User"
 msgstr "Променено от"
 
+#, fuzzy
+msgctxt "field:res.group,buttons:"
+msgid "Buttons"
+msgstr "Бутон"
+
 msgctxt "field:res.group,create_date:"
 msgid "Create Date"
 msgstr "Създадено на"
diff --git a/trytond/res/locale/ca.po b/trytond/res/locale/ca.po
index e989e58..8beca43 100644
--- a/trytond/res/locale/ca.po
+++ b/trytond/res/locale/ca.po
@@ -7,6 +7,31 @@ msgid "The name of the group must be unique!"
 msgstr "El nom del grup ha de ser únic."
 
 msgctxt "error:res.user:"
+msgid "The password can not be the same as user email."
+msgstr ""
+"La contrasenya no pot ser la mateixa que el correu electrònic de l'usuari."
+
+msgctxt "error:res.user:"
+msgid "The password can not be the same as user login."
+msgstr "La contrasenya no pot ser la mateixa que el nom d'usuari de l'usuari."
+
+msgctxt "error:res.user:"
+msgid "The password can not be the same as user name."
+msgstr "La contrasenya no pot ser la mateixa que el nom de l'usuari."
+
+msgctxt "error:res.user:"
+msgid "The password contains too much times the same characters."
+msgstr "La contrasenya té massa vegades els mateixos caràcters."
+
+msgctxt "error:res.user:"
+msgid "The password is forbidden."
+msgstr "La contrasenya està prohibida."
+
+msgctxt "error:res.user:"
+msgid "The password is too short."
+msgstr "La contrasenya es massa curta."
+
+msgctxt "error:res.user:"
 msgid ""
 "Users can not be deleted for logging purpose.\n"
 "Instead you must inactivate them."
@@ -270,6 +295,10 @@ msgctxt "field:ir.ui.menu-res.group,write_uid:"
 msgid "Write User"
 msgstr "Usuari de modificació"
 
+msgctxt "field:res.group,buttons:"
+msgid "Buttons"
+msgstr "Botons"
+
 msgctxt "field:res.group,create_date:"
 msgid "Create Date"
 msgstr "Data de creació"
diff --git a/trytond/res/locale/cs.po b/trytond/res/locale/cs.po
index 01a356e..66f0afb 100644
--- a/trytond/res/locale/cs.po
+++ b/trytond/res/locale/cs.po
@@ -7,6 +7,30 @@ msgid "The name of the group must be unique!"
 msgstr ""
 
 msgctxt "error:res.user:"
+msgid "The password can not be the same as user email."
+msgstr ""
+
+msgctxt "error:res.user:"
+msgid "The password can not be the same as user login."
+msgstr ""
+
+msgctxt "error:res.user:"
+msgid "The password can not be the same as user name."
+msgstr ""
+
+msgctxt "error:res.user:"
+msgid "The password contains too much times the same characters."
+msgstr ""
+
+msgctxt "error:res.user:"
+msgid "The password is forbidden."
+msgstr ""
+
+msgctxt "error:res.user:"
+msgid "The password is too short."
+msgstr ""
+
+msgctxt "error:res.user:"
 msgid ""
 "Users can not be deleted for logging purpose.\n"
 "Instead you must inactivate them."
@@ -275,6 +299,10 @@ msgctxt "field:ir.ui.menu-res.group,write_uid:"
 msgid "Write User"
 msgstr ""
 
+msgctxt "field:res.group,buttons:"
+msgid "Buttons"
+msgstr ""
+
 msgctxt "field:res.group,create_date:"
 msgid "Create Date"
 msgstr ""
diff --git a/trytond/res/locale/de.po b/trytond/res/locale/de.po
index fd2c4d4..eec8302 100644
--- a/trytond/res/locale/de.po
+++ b/trytond/res/locale/de.po
@@ -7,6 +7,30 @@ msgid "The name of the group must be unique!"
 msgstr "Der Name einer Gruppe kann nur einmal vergeben werden."
 
 msgctxt "error:res.user:"
+msgid "The password can not be the same as user email."
+msgstr "Das Passwort und die E-Mail-Adresse müssen unterschiedlich sein."
+
+msgctxt "error:res.user:"
+msgid "The password can not be the same as user login."
+msgstr "Das Passwort und der Benutzername müssen unterschiedlich sein."
+
+msgctxt "error:res.user:"
+msgid "The password can not be the same as user name."
+msgstr "Das Passwort und der Name des Benutzers müssen unterschiedlich sein."
+
+msgctxt "error:res.user:"
+msgid "The password contains too much times the same characters."
+msgstr "Das Passwort enthält zu oft das gleiche Zeichen."
+
+msgctxt "error:res.user:"
+msgid "The password is forbidden."
+msgstr "Dieses Passwort ist nicht erlaubt."
+
+msgctxt "error:res.user:"
+msgid "The password is too short."
+msgstr "Das Passwort ist zu kurz."
+
+msgctxt "error:res.user:"
 msgid ""
 "Users can not be deleted for logging purpose.\n"
 "Instead you must inactivate them."
@@ -270,6 +294,10 @@ msgctxt "field:ir.ui.menu-res.group,write_uid:"
 msgid "Write User"
 msgstr "Letzte Änderung durch"
 
+msgctxt "field:res.group,buttons:"
+msgid "Buttons"
+msgstr "Knopf"
+
 msgctxt "field:res.group,create_date:"
 msgid "Create Date"
 msgstr "Erstellungsdatum"
@@ -480,7 +508,7 @@ msgstr "Letzte Änderung durch"
 
 msgctxt "field:res.user.application,application:"
 msgid "Application"
-msgstr "Application"
+msgstr "Anwendung"
 
 msgctxt "field:res.user.application,create_date:"
 msgid "Create Date"
@@ -709,7 +737,7 @@ msgstr "Mitglieder"
 
 msgctxt "view:res.user.application:"
 msgid "Cancel"
-msgstr "Abbrechen"
+msgstr "Annullieren"
 
 msgctxt "view:res.user.application:"
 msgid "Validate"
diff --git a/trytond/res/locale/es.po b/trytond/res/locale/es.po
index 4f67ac3..ea6e71d 100644
--- a/trytond/res/locale/es.po
+++ b/trytond/res/locale/es.po
@@ -7,6 +7,31 @@ msgid "The name of the group must be unique!"
 msgstr "El nombre del grupo debe ser único."
 
 msgctxt "error:res.user:"
+msgid "The password can not be the same as user email."
+msgstr "La contraseña no puede ser la misma que el correo del usuario."
+
+msgctxt "error:res.user:"
+msgid "The password can not be the same as user login."
+msgstr ""
+"La contraseña no puede ser la misma que el nombre de usuario del usuario."
+
+msgctxt "error:res.user:"
+msgid "The password can not be the same as user name."
+msgstr "La contraseña no puede ser la misma que el nombre del usuario."
+
+msgctxt "error:res.user:"
+msgid "The password contains too much times the same characters."
+msgstr "La contraseña contiene demasiadas veces los mismos caracteres."
+
+msgctxt "error:res.user:"
+msgid "The password is forbidden."
+msgstr "La contraseña esta prohibida."
+
+msgctxt "error:res.user:"
+msgid "The password is too short."
+msgstr "La contraseña es demasiado corta."
+
+msgctxt "error:res.user:"
 msgid ""
 "Users can not be deleted for logging purpose.\n"
 "Instead you must inactivate them."
@@ -270,6 +295,10 @@ msgctxt "field:ir.ui.menu-res.group,write_uid:"
 msgid "Write User"
 msgstr "Usuario de modificación"
 
+msgctxt "field:res.group,buttons:"
+msgid "Buttons"
+msgstr "Botones"
+
 msgctxt "field:res.group,create_date:"
 msgid "Create Date"
 msgstr "Fecha de creación"
diff --git a/trytond/res/locale/es_419.po b/trytond/res/locale/es_419.po
index a07b69f..e6d89b8 100644
--- a/trytond/res/locale/es_419.po
+++ b/trytond/res/locale/es_419.po
@@ -7,10 +7,36 @@ msgid "The name of the group must be unique!"
 msgstr ""
 
 msgctxt "error:res.user:"
+msgid "The password can not be the same as user email."
+msgstr ""
+
+msgctxt "error:res.user:"
+msgid "The password can not be the same as user login."
+msgstr ""
+
+msgctxt "error:res.user:"
+msgid "The password can not be the same as user name."
+msgstr ""
+
+msgctxt "error:res.user:"
+msgid "The password contains too much times the same characters."
+msgstr ""
+
+msgctxt "error:res.user:"
+msgid "The password is forbidden."
+msgstr ""
+
+msgctxt "error:res.user:"
+msgid "The password is too short."
+msgstr ""
+
+msgctxt "error:res.user:"
 msgid ""
 "Users can not be deleted for logging purpose.\n"
 "Instead you must inactivate them."
 msgstr ""
+"Por motivos de registro, los usuarios no pueden ser eliminados.\n"
+"En vez de eso, debe desactivarlos."
 
 msgctxt "error:res.user:"
 msgid "Wrong password!"
@@ -32,10 +58,9 @@ msgctxt "field:ir.action-res.group,create_uid:"
 msgid "Create User"
 msgstr ""
 
-#, fuzzy
 msgctxt "field:ir.action-res.group,group:"
 msgid "Group"
-msgstr "Groups"
+msgstr ""
 
 msgctxt "field:ir.action-res.group,id:"
 msgid "ID"
@@ -49,9 +74,10 @@ msgctxt "field:ir.action-res.group,write_date:"
 msgid "Write Date"
 msgstr ""
 
+#, fuzzy
 msgctxt "field:ir.action-res.group,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Modi"
 
 msgctxt "field:ir.model.button-res.group,active:"
 msgid "Active"
@@ -69,10 +95,9 @@ msgctxt "field:ir.model.button-res.group,create_uid:"
 msgid "Create User"
 msgstr ""
 
-#, fuzzy
 msgctxt "field:ir.model.button-res.group,group:"
 msgid "Group"
-msgstr "Groups"
+msgstr ""
 
 msgctxt "field:ir.model.button-res.group,id:"
 msgid "ID"
@@ -86,19 +111,19 @@ msgctxt "field:ir.model.button-res.group,write_date:"
 msgid "Write Date"
 msgstr ""
 
+#, fuzzy
 msgctxt "field:ir.model.button-res.group,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Modi"
 
 #, fuzzy
 msgctxt "field:ir.model.button.click,user:"
 msgid "User"
-msgstr "Users"
+msgstr "Usuario"
 
-#, fuzzy
 msgctxt "field:ir.model.button.rule,group:"
 msgid "Group"
-msgstr "Groups"
+msgstr ""
 
 msgctxt "field:ir.model.field-res.group,create_date:"
 msgid "Create Date"
@@ -112,10 +137,9 @@ msgctxt "field:ir.model.field-res.group,field:"
 msgid "Model Field"
 msgstr ""
 
-#, fuzzy
 msgctxt "field:ir.model.field-res.group,group:"
 msgid "Group"
-msgstr "Groups"
+msgstr ""
 
 msgctxt "field:ir.model.field-res.group,id:"
 msgid "ID"
@@ -129,9 +153,10 @@ msgctxt "field:ir.model.field-res.group,write_date:"
 msgid "Write Date"
 msgstr ""
 
+#, fuzzy
 msgctxt "field:ir.model.field-res.group,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Modi"
 
 msgctxt "field:ir.rule.group-res.group,create_date:"
 msgid "Create Date"
@@ -141,10 +166,9 @@ msgctxt "field:ir.rule.group-res.group,create_uid:"
 msgid "Create User"
 msgstr ""
 
-#, fuzzy
 msgctxt "field:ir.rule.group-res.group,group:"
 msgid "Group"
-msgstr "Groups"
+msgstr ""
 
 msgctxt "field:ir.rule.group-res.group,id:"
 msgid "ID"
@@ -162,9 +186,10 @@ msgctxt "field:ir.rule.group-res.group,write_date:"
 msgid "Write Date"
 msgstr ""
 
+#, fuzzy
 msgctxt "field:ir.rule.group-res.group,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Modi"
 
 msgctxt "field:ir.rule.group-res.user,create_date:"
 msgid "Create Date"
@@ -189,15 +214,16 @@ msgstr ""
 #, fuzzy
 msgctxt "field:ir.rule.group-res.user,user:"
 msgid "User"
-msgstr "Users"
+msgstr "Usuario"
 
 msgctxt "field:ir.rule.group-res.user,write_date:"
 msgid "Write Date"
 msgstr ""
 
+#, fuzzy
 msgctxt "field:ir.rule.group-res.user,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Modi"
 
 msgctxt "field:ir.sequence,groups:"
 msgid "User Groups"
@@ -239,9 +265,10 @@ msgctxt "field:ir.sequence.type-res.group,write_date:"
 msgid "Write Date"
 msgstr ""
 
+#, fuzzy
 msgctxt "field:ir.sequence.type-res.group,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Modi"
 
 msgctxt "field:ir.ui.menu-res.group,create_date:"
 msgid "Create Date"
@@ -251,10 +278,9 @@ msgctxt "field:ir.ui.menu-res.group,create_uid:"
 msgid "Create User"
 msgstr ""
 
-#, fuzzy
 msgctxt "field:ir.ui.menu-res.group,group:"
 msgid "Group"
-msgstr "Groups"
+msgstr ""
 
 msgctxt "field:ir.ui.menu-res.group,id:"
 msgid "ID"
@@ -272,8 +298,13 @@ msgctxt "field:ir.ui.menu-res.group,write_date:"
 msgid "Write Date"
 msgstr ""
 
+#, fuzzy
 msgctxt "field:ir.ui.menu-res.group,write_uid:"
 msgid "Write User"
+msgstr "Modi"
+
+msgctxt "field:res.group,buttons:"
+msgid "Buttons"
 msgstr ""
 
 msgctxt "field:res.group,create_date:"
@@ -315,15 +346,16 @@ msgstr ""
 #, fuzzy
 msgctxt "field:res.group,users:"
 msgid "Users"
-msgstr "Users"
+msgstr "Usuario"
 
 msgctxt "field:res.group,write_date:"
 msgid "Write Date"
 msgstr ""
 
+#, fuzzy
 msgctxt "field:res.group,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Modi"
 
 msgctxt "field:res.user,actions:"
 msgid "Actions"
@@ -349,10 +381,9 @@ msgctxt "field:res.user,email:"
 msgid "Email"
 msgstr ""
 
-#, fuzzy
 msgctxt "field:res.user,groups:"
 msgid "Groups"
-msgstr "Groups"
+msgstr ""
 
 msgctxt "field:res.user,id:"
 msgid "ID"
@@ -420,7 +451,7 @@ msgstr ""
 
 msgctxt "field:res.user,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Modi"
 
 msgctxt "field:res.user-ir.action,action:"
 msgid "Action"
@@ -445,15 +476,16 @@ msgstr ""
 #, fuzzy
 msgctxt "field:res.user-ir.action,user:"
 msgid "User"
-msgstr "Users"
+msgstr "Usuario"
 
 msgctxt "field:res.user-ir.action,write_date:"
 msgid "Write Date"
 msgstr ""
 
+#, fuzzy
 msgctxt "field:res.user-ir.action,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Modi"
 
 msgctxt "field:res.user-res.group,create_date:"
 msgid "Create Date"
@@ -463,10 +495,9 @@ msgctxt "field:res.user-res.group,create_uid:"
 msgid "Create User"
 msgstr ""
 
-#, fuzzy
 msgctxt "field:res.user-res.group,group:"
 msgid "Group"
-msgstr "Groups"
+msgstr ""
 
 msgctxt "field:res.user-res.group,id:"
 msgid "ID"
@@ -479,15 +510,16 @@ msgstr ""
 #, fuzzy
 msgctxt "field:res.user-res.group,user:"
 msgid "User"
-msgstr "Users"
+msgstr "Usuario"
 
 msgctxt "field:res.user-res.group,write_date:"
 msgid "Write Date"
 msgstr ""
 
+#, fuzzy
 msgctxt "field:res.user-res.group,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Modi"
 
 msgctxt "field:res.user.application,application:"
 msgid "Application"
@@ -520,15 +552,16 @@ msgstr ""
 #, fuzzy
 msgctxt "field:res.user.application,user:"
 msgid "User"
-msgstr "Users"
+msgstr "Usuario"
 
 msgctxt "field:res.user.application,write_date:"
 msgid "Write Date"
 msgstr ""
 
+#, fuzzy
 msgctxt "field:res.user.application,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Modi"
 
 msgctxt "field:res.user.config.start,id:"
 msgid "ID"
@@ -558,9 +591,10 @@ msgctxt "field:res.user.login.attempt,write_date:"
 msgid "Write Date"
 msgstr ""
 
+#, fuzzy
 msgctxt "field:res.user.login.attempt,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Modi"
 
 msgctxt "field:res.user.warning,always:"
 msgid "Always"
@@ -589,15 +623,16 @@ msgstr ""
 #, fuzzy
 msgctxt "field:res.user.warning,user:"
 msgid "User"
-msgstr "Users"
+msgstr "Usuario"
 
 msgctxt "field:res.user.warning,write_date:"
 msgid "Write Date"
 msgstr ""
 
+#, fuzzy
 msgctxt "field:res.user.warning,write_uid:"
 msgid "Write User"
-msgstr ""
+msgstr "Modi"
 
 msgctxt "help:ir.sequence.type,groups:"
 msgid "Groups allowed to edit the sequences of this type"
@@ -605,19 +640,20 @@ msgstr ""
 
 msgctxt "help:res.user,actions:"
 msgid "Actions that will be run at login"
-msgstr ""
+msgstr "Las acciones que se ejecutarán al iniciar sesión"
 
 msgctxt "model:ir.action,name:act_group_form"
 msgid "Groups"
-msgstr "Groups"
+msgstr ""
 
 msgctxt "model:ir.action,name:act_user_config"
 msgid "Configure Users"
-msgstr "Configure Users"
+msgstr ""
 
+#, fuzzy
 msgctxt "model:ir.action,name:act_user_form"
 msgid "Users"
-msgstr "Users"
+msgstr "Usuario"
 
 msgctxt "model:ir.action-res.group,name:"
 msgid "Action - Group"
@@ -625,7 +661,7 @@ msgstr ""
 
 msgctxt "model:ir.cron,name:cron_trigger_time"
 msgid "Run On Time Triggers"
-msgstr "Run On Time Triggers"
+msgstr ""
 
 msgctxt "model:ir.model.button-res.group,name:"
 msgid "Model Button - Group"
@@ -649,33 +685,34 @@ msgstr ""
 
 msgctxt "model:ir.ui.menu,name:menu_group_form"
 msgid "Groups"
-msgstr "Groups"
+msgstr ""
 
+#, fuzzy
 msgctxt "model:ir.ui.menu,name:menu_res"
 msgid "Users"
-msgstr "Users"
+msgstr "Usuario"
 
+#, fuzzy
 msgctxt "model:ir.ui.menu,name:menu_user_form"
 msgid "Users"
-msgstr "Users"
+msgstr "Usuario"
 
 msgctxt "model:ir.ui.menu-res.group,name:"
 msgid "UI Menu - Group"
 msgstr ""
 
-#, fuzzy
 msgctxt "model:res.group,name:"
 msgid "Group"
-msgstr "Groups"
+msgstr ""
 
 msgctxt "model:res.group,name:group_admin"
 msgid "Administration"
-msgstr "Administration"
+msgstr ""
 
 #, fuzzy
 msgctxt "model:res.user,name:"
 msgid "User"
-msgstr "Users"
+msgstr "Usuario"
 
 msgctxt "model:res.user-ir.action,name:"
 msgid "User - Action"
@@ -735,7 +772,7 @@ msgstr ""
 
 msgctxt "view:res.user.config.start:"
 msgid "You can now add some users into the system."
-msgstr ""
+msgstr "Si lo desea, ahora puede agregar más usuarios en el sistema."
 
 msgctxt "view:res.user:"
 msgid "Access Permissions"
@@ -753,10 +790,9 @@ msgctxt "view:res.user:"
 msgid "Preferences"
 msgstr ""
 
-#, fuzzy
 msgctxt "view:res.user:"
 msgid "User"
-msgstr "Users"
+msgstr "Usuario"
 
 msgctxt "wizard_button:res.user.config,start,end:"
 msgid "Cancel"
diff --git a/trytond/res/locale/fr.po b/trytond/res/locale/fr.po
index 20e6cfa..bbd7829 100644
--- a/trytond/res/locale/fr.po
+++ b/trytond/res/locale/fr.po
@@ -7,6 +7,32 @@ msgid "The name of the group must be unique!"
 msgstr "Le nom du groupe doit être unique !"
 
 msgctxt "error:res.user:"
+msgid "The password can not be the same as user email."
+msgstr ""
+"Le mot de passe ne peut pas être le même que l'e-mail de l'utilisateur."
+
+msgctxt "error:res.user:"
+msgid "The password can not be the same as user login."
+msgstr ""
+"Le mot de passe ne peut pas être le même que le login de l'utilisateur."
+
+msgctxt "error:res.user:"
+msgid "The password can not be the same as user name."
+msgstr "Le mot de passe ne peut pas être le même que le nom de l'utilisateur."
+
+msgctxt "error:res.user:"
+msgid "The password contains too much times the same characters."
+msgstr "Le mot de passe contient trop de fois les même caractères."
+
+msgctxt "error:res.user:"
+msgid "The password is forbidden."
+msgstr "Le mot de passe est interdit."
+
+msgctxt "error:res.user:"
+msgid "The password is too short."
+msgstr "Le mot de passe est trop court."
+
+msgctxt "error:res.user:"
 msgid ""
 "Users can not be deleted for logging purpose.\n"
 "Instead you must inactivate them."
@@ -270,6 +296,10 @@ msgctxt "field:ir.ui.menu-res.group,write_uid:"
 msgid "Write User"
 msgstr "Mis à jour par"
 
+msgctxt "field:res.group,buttons:"
+msgid "Buttons"
+msgstr "Boutons"
+
 msgctxt "field:res.group,create_date:"
 msgid "Create Date"
 msgstr "Date de création"
diff --git a/trytond/res/locale/hu_HU.po b/trytond/res/locale/hu_HU.po
index ff9f17a..2e6f1d1 100644
--- a/trytond/res/locale/hu_HU.po
+++ b/trytond/res/locale/hu_HU.po
@@ -7,6 +7,30 @@ msgid "The name of the group must be unique!"
 msgstr "Egy csoport neve csak egyszer adható ki"
 
 msgctxt "error:res.user:"
+msgid "The password can not be the same as user email."
+msgstr ""
+
+msgctxt "error:res.user:"
+msgid "The password can not be the same as user login."
+msgstr ""
+
+msgctxt "error:res.user:"
+msgid "The password can not be the same as user name."
+msgstr ""
+
+msgctxt "error:res.user:"
+msgid "The password contains too much times the same characters."
+msgstr ""
+
+msgctxt "error:res.user:"
+msgid "The password is forbidden."
+msgstr ""
+
+msgctxt "error:res.user:"
+msgid "The password is too short."
+msgstr ""
+
+msgctxt "error:res.user:"
 msgid ""
 "Users can not be deleted for logging purpose.\n"
 "Instead you must inactivate them."
@@ -270,6 +294,11 @@ msgctxt "field:ir.ui.menu-res.group,write_uid:"
 msgid "Write User"
 msgstr "Által módosítva"
 
+#, fuzzy
+msgctxt "field:res.group,buttons:"
+msgid "Buttons"
+msgstr "Gomb"
+
 msgctxt "field:res.group,create_date:"
 msgid "Create Date"
 msgstr "Létrehozás dátuma"
diff --git a/trytond/res/locale/it_IT.po b/trytond/res/locale/it_IT.po
index bc7d415..d9f264c 100644
--- a/trytond/res/locale/it_IT.po
+++ b/trytond/res/locale/it_IT.po
@@ -7,6 +7,30 @@ msgid "The name of the group must be unique!"
 msgstr "Il nome del gruppo dev'essere unico!"
 
 msgctxt "error:res.user:"
+msgid "The password can not be the same as user email."
+msgstr ""
+
+msgctxt "error:res.user:"
+msgid "The password can not be the same as user login."
+msgstr ""
+
+msgctxt "error:res.user:"
+msgid "The password can not be the same as user name."
+msgstr ""
+
+msgctxt "error:res.user:"
+msgid "The password contains too much times the same characters."
+msgstr ""
+
+msgctxt "error:res.user:"
+msgid "The password is forbidden."
+msgstr ""
+
+msgctxt "error:res.user:"
+msgid "The password is too short."
+msgstr ""
+
+msgctxt "error:res.user:"
 msgid ""
 "Users can not be deleted for logging purpose.\n"
 "Instead you must inactivate them."
@@ -270,6 +294,11 @@ msgctxt "field:ir.ui.menu-res.group,write_uid:"
 msgid "Write User"
 msgstr "Scrivente"
 
+#, fuzzy
+msgctxt "field:res.group,buttons:"
+msgid "Buttons"
+msgstr "Bottone"
+
 msgctxt "field:res.group,create_date:"
 msgid "Create Date"
 msgstr "Creazione Data"
diff --git a/trytond/res/locale/ja_JP.po b/trytond/res/locale/ja_JP.po
index a07b69f..b3ae2b0 100644
--- a/trytond/res/locale/ja_JP.po
+++ b/trytond/res/locale/ja_JP.po
@@ -7,6 +7,30 @@ msgid "The name of the group must be unique!"
 msgstr ""
 
 msgctxt "error:res.user:"
+msgid "The password can not be the same as user email."
+msgstr ""
+
+msgctxt "error:res.user:"
+msgid "The password can not be the same as user login."
+msgstr ""
+
+msgctxt "error:res.user:"
+msgid "The password can not be the same as user name."
+msgstr ""
+
+msgctxt "error:res.user:"
+msgid "The password contains too much times the same characters."
+msgstr ""
+
+msgctxt "error:res.user:"
+msgid "The password is forbidden."
+msgstr ""
+
+msgctxt "error:res.user:"
+msgid "The password is too short."
+msgstr ""
+
+msgctxt "error:res.user:"
 msgid ""
 "Users can not be deleted for logging purpose.\n"
 "Instead you must inactivate them."
@@ -276,6 +300,10 @@ msgctxt "field:ir.ui.menu-res.group,write_uid:"
 msgid "Write User"
 msgstr ""
 
+msgctxt "field:res.group,buttons:"
+msgid "Buttons"
+msgstr ""
+
 msgctxt "field:res.group,create_date:"
 msgid "Create Date"
 msgstr ""
diff --git a/trytond/res/locale/lo.po b/trytond/res/locale/lo.po
index 9c12d76..081a247 100644
--- a/trytond/res/locale/lo.po
+++ b/trytond/res/locale/lo.po
@@ -4,6 +4,30 @@ msgstr "Content-Type: text/plain; charset=utf-8\n"
 
 msgctxt "error:res.group:"
 msgid "The name of the group must be unique!"
+msgstr "ຊື່ຂອງກຸ່ມຕ້ອງບໍ່ຊໍ້າກັນ"
+
+msgctxt "error:res.user:"
+msgid "The password can not be the same as user email."
+msgstr ""
+
+msgctxt "error:res.user:"
+msgid "The password can not be the same as user login."
+msgstr ""
+
+msgctxt "error:res.user:"
+msgid "The password can not be the same as user name."
+msgstr ""
+
+msgctxt "error:res.user:"
+msgid "The password contains too much times the same characters."
+msgstr ""
+
+msgctxt "error:res.user:"
+msgid "The password is forbidden."
+msgstr ""
+
+msgctxt "error:res.user:"
+msgid "The password is too short."
 msgstr ""
 
 msgctxt "error:res.user:"
@@ -11,158 +35,131 @@ msgid ""
 "Users can not be deleted for logging purpose.\n"
 "Instead you must inactivate them."
 msgstr ""
+"ບໍ່ສາມາດລຶບຜູ້ໃຊ້ງານສຳລັບການເຊື່ອມຕໍ່ເຂົ້າໃຊ້ງານຕ່າງໆ.ທ່ານຕ້ອງປົດການໃຊ້ງານໄວ້ແທນ."
 
 msgctxt "error:res.user:"
 msgid "Wrong password!"
-msgstr ""
+msgstr "ລະຫັດຜ່ານຜິດ!"
 
 msgctxt "error:res.user:"
 msgid "You can not have two users with the same login!"
-msgstr ""
+msgstr "ທ່ານບໍ່ສາມາດມີສອງຜູ້ໃຊ້ງານໃນຊື່ເຊື່ອມຕໍ່ດຽວກັນ!"
 
-#, fuzzy
 msgctxt "field:ir.action-res.group,action:"
 msgid "Action"
-msgstr "ການປະຕິບັດ"
+msgstr "ການດຳເນີນການ"
 
-#, fuzzy
 msgctxt "field:ir.action-res.group,create_date:"
 msgid "Create Date"
-msgstr "ສ້າງວັນທີ"
+msgstr "ວັນທີສ້າງ"
 
-#, fuzzy
 msgctxt "field:ir.action-res.group,create_uid:"
 msgid "Create User"
-msgstr "ສ້າງຜູ້ໃຊ້ງານ"
+msgstr "ຜູ້ສ້າງ"
 
-#, fuzzy
 msgctxt "field:ir.action-res.group,group:"
 msgid "Group"
 msgstr "ກຸ່ມ"
 
-#, fuzzy
 msgctxt "field:ir.action-res.group,id:"
 msgid "ID"
-msgstr "ເລກປະຈຳໂຕ"
+msgstr "ເລກລຳດັບ"
 
-#, fuzzy
 msgctxt "field:ir.action-res.group,rec_name:"
 msgid "Name"
 msgstr "ຊື່"
 
-#, fuzzy
 msgctxt "field:ir.action-res.group,write_date:"
 msgid "Write Date"
-msgstr "ຂຽນວັນທີ"
+msgstr "ວັນທີບັນທຶກ"
 
-#, fuzzy
 msgctxt "field:ir.action-res.group,write_uid:"
 msgid "Write User"
-msgstr "ຂຽນຜູ້ໃຊ້ງານ"
+msgstr "ຜູ້ບັນທຶກ"
 
-#, fuzzy
 msgctxt "field:ir.model.button-res.group,active:"
 msgid "Active"
 msgstr "ໃຊ້ຢູ່"
 
-#, fuzzy
 msgctxt "field:ir.model.button-res.group,button:"
 msgid "Button"
 msgstr "ປຸ່ມ"
 
-#, fuzzy
 msgctxt "field:ir.model.button-res.group,create_date:"
 msgid "Create Date"
-msgstr "ສ້າງວັນທີ"
+msgstr "ວັນທີສ້າງ"
 
-#, fuzzy
 msgctxt "field:ir.model.button-res.group,create_uid:"
 msgid "Create User"
-msgstr "ສ້າງຜູ້ໃຊ້ງານ"
+msgstr "ຜູ້ສ້າງ"
 
-#, fuzzy
 msgctxt "field:ir.model.button-res.group,group:"
 msgid "Group"
 msgstr "ກຸ່ມ"
 
-#, fuzzy
 msgctxt "field:ir.model.button-res.group,id:"
 msgid "ID"
-msgstr "ເລກປະຈຳໂຕ"
+msgstr "ເລກລຳດັບ"
 
-#, fuzzy
 msgctxt "field:ir.model.button-res.group,rec_name:"
 msgid "Name"
 msgstr "ຊື່"
 
-#, fuzzy
 msgctxt "field:ir.model.button-res.group,write_date:"
 msgid "Write Date"
-msgstr "ຂຽນວັນທີ"
+msgstr "ວັນທີບັນທຶກ"
 
-#, fuzzy
 msgctxt "field:ir.model.button-res.group,write_uid:"
 msgid "Write User"
-msgstr "ຂຽນຜູ້ໃຊ້ງານ"
+msgstr "ຜູ້ບັນທຶກ"
 
-#, fuzzy
 msgctxt "field:ir.model.button.click,user:"
 msgid "User"
 msgstr "ຜູ້ໃຊ້"
 
-#, fuzzy
 msgctxt "field:ir.model.button.rule,group:"
 msgid "Group"
 msgstr "ກຸ່ມ"
 
-#, fuzzy
 msgctxt "field:ir.model.field-res.group,create_date:"
 msgid "Create Date"
-msgstr "ສ້າງວັນທີ"
+msgstr "ວັນທີສ້າງ"
 
-#, fuzzy
 msgctxt "field:ir.model.field-res.group,create_uid:"
 msgid "Create User"
-msgstr "ສ້າງຜູ້ໃຊ້ງານ"
+msgstr "ຜູ້ສ້າງ"
 
 msgctxt "field:ir.model.field-res.group,field:"
 msgid "Model Field"
-msgstr ""
+msgstr "ຊ່ອງຂໍ້ມູນແບບ"
 
-#, fuzzy
 msgctxt "field:ir.model.field-res.group,group:"
 msgid "Group"
 msgstr "ກຸ່ມ"
 
-#, fuzzy
 msgctxt "field:ir.model.field-res.group,id:"
 msgid "ID"
-msgstr "ເລກປະຈຳໂຕ"
+msgstr "ເລກລຳດັບ"
 
-#, fuzzy
 msgctxt "field:ir.model.field-res.group,rec_name:"
 msgid "Name"
 msgstr "ຊື່"
 
-#, fuzzy
 msgctxt "field:ir.model.field-res.group,write_date:"
 msgid "Write Date"
-msgstr "ຂຽນວັນທີ"
+msgstr "ວັນທີບັນທຶກ"
 
-#, fuzzy
 msgctxt "field:ir.model.field-res.group,write_uid:"
 msgid "Write User"
-msgstr "ຂຽນຜູ້ໃຊ້ງານ"
+msgstr "ຜູ້ບັນທຶກ"
 
-#, fuzzy
 msgctxt "field:ir.rule.group-res.group,create_date:"
 msgid "Create Date"
-msgstr "ສ້າງວັນທີ"
+msgstr "ວັນທີສ້າງ"
 
-#, fuzzy
 msgctxt "field:ir.rule.group-res.group,create_uid:"
 msgid "Create User"
-msgstr "ສ້າງຜູ້ໃຊ້ງານ"
+msgstr "ຜູ້ສ້າງ"
 
 msgctxt "field:ir.rule.group-res.group,group:"
 msgid "Group"
@@ -178,7 +175,7 @@ msgstr "ຊື່"
 
 msgctxt "field:ir.rule.group-res.group,rule_group:"
 msgid "Rule Group"
-msgstr ""
+msgstr "ກຸ່ມກົດລະບຽບ"
 
 msgctxt "field:ir.rule.group-res.group,write_date:"
 msgid "Write Date"
@@ -188,20 +185,17 @@ msgctxt "field:ir.rule.group-res.group,write_uid:"
 msgid "Write User"
 msgstr "ຂຽນຜູ້ໃຊ້ງານ"
 
-#, fuzzy
 msgctxt "field:ir.rule.group-res.user,create_date:"
 msgid "Create Date"
-msgstr "ສ້າງວັນທີ"
+msgstr "ວັນທີສ້າງ"
 
-#, fuzzy
 msgctxt "field:ir.rule.group-res.user,create_uid:"
 msgid "Create User"
-msgstr "ສ້າງຜູ້ໃຊ້ງານ"
+msgstr "ຜູ້ສ້າງ"
 
-#, fuzzy
 msgctxt "field:ir.rule.group-res.user,id:"
 msgid "ID"
-msgstr "ເລກປະຈຳໂຕ"
+msgstr "ເລກລຳດັບ"
 
 msgctxt "field:ir.rule.group-res.user,rec_name:"
 msgid "Name"
@@ -209,7 +203,7 @@ msgstr "ຊື່"
 
 msgctxt "field:ir.rule.group-res.user,rule_group:"
 msgid "Rule Group"
-msgstr ""
+msgstr "ກຸ່ມກົດລະບຽບ"
 
 msgctxt "field:ir.rule.group-res.user,user:"
 msgid "User"
@@ -231,20 +225,17 @@ msgctxt "field:ir.sequence.strict,groups:"
 msgid "User Groups"
 msgstr "ກຸ່ມຜູ້ໃຊ້ງານ"
 
-#, fuzzy
 msgctxt "field:ir.sequence.type,groups:"
 msgid "User Groups"
 msgstr "ກຸ່ມຜູ້ໃຊ້ງານ"
 
-#, fuzzy
 msgctxt "field:ir.sequence.type-res.group,create_date:"
 msgid "Create Date"
-msgstr "ສ້າງວັນທີ"
+msgstr "ວັນທີສ້າງ"
 
-#, fuzzy
 msgctxt "field:ir.sequence.type-res.group,create_uid:"
 msgid "Create User"
-msgstr "ສ້າງຜູ້ໃຊ້ງານ"
+msgstr "ຜູ້ສ້າງ"
 
 msgctxt "field:ir.sequence.type-res.group,group:"
 msgid "User Groups"
@@ -254,14 +245,13 @@ msgctxt "field:ir.sequence.type-res.group,id:"
 msgid "ID"
 msgstr "ເລກປະຈຳໂຕ"
 
-#, fuzzy
 msgctxt "field:ir.sequence.type-res.group,rec_name:"
 msgid "Name"
 msgstr "ຊື່"
 
 msgctxt "field:ir.sequence.type-res.group,sequence_type:"
 msgid "Sequence Type"
-msgstr ""
+msgstr "ປະເພດລຳດັບ"
 
 msgctxt "field:ir.sequence.type-res.group,write_date:"
 msgid "Write Date"
@@ -271,581 +261,510 @@ msgctxt "field:ir.sequence.type-res.group,write_uid:"
 msgid "Write User"
 msgstr "ຂຽນຜູ້ໃຊ້ງານ"
 
-#, fuzzy
 msgctxt "field:ir.ui.menu-res.group,create_date:"
 msgid "Create Date"
-msgstr "ສ້າງວັນທີ"
+msgstr "ວັນທີສ້າງ"
 
-#, fuzzy
 msgctxt "field:ir.ui.menu-res.group,create_uid:"
 msgid "Create User"
-msgstr "ສ້າງຜູ້ໃຊ້ງານ"
+msgstr "ຜູ້ສ້າງ"
 
-#, fuzzy
 msgctxt "field:ir.ui.menu-res.group,group:"
 msgid "Group"
 msgstr "ກຸ່ມ"
 
-#, fuzzy
 msgctxt "field:ir.ui.menu-res.group,id:"
 msgid "ID"
-msgstr "ເລກປະຈຳໂຕ"
+msgstr "ເລກລຳດັບ"
 
-#, fuzzy
 msgctxt "field:ir.ui.menu-res.group,menu:"
 msgid "Menu"
-msgstr "ລາຍການ"
+msgstr "ລາຍການຄຳສັ່ງ"
 
-#, fuzzy
 msgctxt "field:ir.ui.menu-res.group,rec_name:"
 msgid "Name"
 msgstr "ຊື່"
 
-#, fuzzy
 msgctxt "field:ir.ui.menu-res.group,write_date:"
 msgid "Write Date"
-msgstr "ຂຽນວັນທີ"
+msgstr "ວັນທີບັນທຶກ"
 
-#, fuzzy
 msgctxt "field:ir.ui.menu-res.group,write_uid:"
 msgid "Write User"
-msgstr "ຂຽນຜູ້ໃຊ້ງານ"
+msgstr "ຜູ້ບັນທຶກ"
 
 #, fuzzy
+msgctxt "field:res.group,buttons:"
+msgid "Buttons"
+msgstr "ປຸ່ມ"
+
 msgctxt "field:res.group,create_date:"
 msgid "Create Date"
-msgstr "ສ້າງວັນທີ"
+msgstr "ວັນທີສ້າງ"
 
-#, fuzzy
 msgctxt "field:res.group,create_uid:"
 msgid "Create User"
-msgstr "ສ້າງຜູ້ໃຊ້ງານ"
+msgstr "ຜູ້ສ້າງ"
 
 msgctxt "field:res.group,field_access:"
 msgid "Access Field"
-msgstr ""
+msgstr "ຊ່ອງຂໍ້ມູນທີ່ເຂົ້າເຖິງ"
 
-#, fuzzy
 msgctxt "field:res.group,id:"
 msgid "ID"
-msgstr "ເລກປະຈຳໂຕ"
+msgstr "ເລກລຳດັບ"
 
 msgctxt "field:res.group,menu_access:"
 msgid "Access Menu"
-msgstr ""
+msgstr "ລາຍການຄຳສັ່ງທີ່ເຂົ້າເຖິງ"
 
 msgctxt "field:res.group,model_access:"
 msgid "Access Model"
-msgstr ""
+msgstr "ຮ່າງແບບທີ່ເຂົ້າເຖິງ"
 
-#, fuzzy
 msgctxt "field:res.group,name:"
 msgid "Name"
 msgstr "ຊື່"
 
-#, fuzzy
 msgctxt "field:res.group,rec_name:"
 msgid "Name"
 msgstr "ຊື່"
 
 msgctxt "field:res.group,rule_groups:"
 msgid "Rules"
-msgstr ""
+msgstr "ກົດລະບຽບ"
 
-#, fuzzy
 msgctxt "field:res.group,users:"
 msgid "Users"
 msgstr "ຜູ້ໃຊ້"
 
-#, fuzzy
 msgctxt "field:res.group,write_date:"
 msgid "Write Date"
-msgstr "ຂຽນວັນທີ"
+msgstr "ວັນທີບັນທຶກ"
 
-#, fuzzy
 msgctxt "field:res.group,write_uid:"
 msgid "Write User"
-msgstr "ຂຽນຜູ້ໃຊ້ງານ"
+msgstr "ຜູ້ບັນທຶກ"
 
-#, fuzzy
 msgctxt "field:res.user,actions:"
 msgid "Actions"
-msgstr "ການປະຕິບັດ"
+msgstr "ດຳເນີນການ"
 
-#, fuzzy
 msgctxt "field:res.user,active:"
 msgid "Active"
 msgstr "ໃຊ້ຢູ່"
 
 msgctxt "field:res.user,applications:"
 msgid "Applications"
-msgstr ""
+msgstr "ແອັບພຼີເຄເຊິນ"
 
-#, fuzzy
 msgctxt "field:res.user,create_date:"
 msgid "Create Date"
-msgstr "ສ້າງວັນທີ"
+msgstr "ວັນທີສ້າງ"
 
-#, fuzzy
 msgctxt "field:res.user,create_uid:"
 msgid "Create User"
-msgstr "ສ້າງຜູ້ໃຊ້ງານ"
+msgstr "ຜູ້ສ້າງ"
 
 msgctxt "field:res.user,email:"
 msgid "Email"
-msgstr ""
+msgstr "ອີເມວລ໌"
 
-#, fuzzy
 msgctxt "field:res.user,groups:"
 msgid "Groups"
-msgstr "ໝວດ"
+msgstr "ກຸ່ມ"
 
-#, fuzzy
 msgctxt "field:res.user,id:"
 msgid "ID"
 msgstr "ເລກປະຈຳໂຕ"
 
-#, fuzzy
 msgctxt "field:res.user,language:"
 msgid "Language"
 msgstr "ພາສາ"
 
 msgctxt "field:res.user,language_direction:"
 msgid "Language Direction"
-msgstr ""
+msgstr "ທິດທາງພາສາ"
 
 msgctxt "field:res.user,login:"
 msgid "Login"
-msgstr ""
+msgstr "ເຂົ້າສູ່ລະບົບ"
 
 msgctxt "field:res.user,menu:"
 msgid "Menu Action"
-msgstr ""
+msgstr "ລາຍການຄຳສັ່ງດຳເນີນການ"
 
-#, fuzzy
 msgctxt "field:res.user,name:"
 msgid "Name"
 msgstr "ຊື່"
 
 msgctxt "field:res.user,password:"
 msgid "Password"
-msgstr ""
+msgstr "ລະຫັດຜ່ານ"
 
 msgctxt "field:res.user,password_hash:"
 msgid "Password Hash"
-msgstr ""
+msgstr "ສັນຍະລັກລະຫັດຜ່ານ"
 
 msgctxt "field:res.user,pyson_menu:"
 msgid "PySON Menu"
-msgstr ""
+msgstr "ລາຍການຄຳສັ່ງ PySON"
 
-#, fuzzy
 msgctxt "field:res.user,rec_name:"
 msgid "Name"
 msgstr "ຊື່"
 
 msgctxt "field:res.user,rule_groups:"
 msgid "Rules"
-msgstr ""
+msgstr "ກົດລະບຽບ"
 
 msgctxt "field:res.user,sessions:"
 msgid "Sessions"
-msgstr ""
+msgstr "ຄັ້ງ"
 
 msgctxt "field:res.user,signature:"
 msgid "Signature"
-msgstr ""
+msgstr "ລາຍເຊັນ"
 
 msgctxt "field:res.user,status_bar:"
 msgid "Status Bar"
-msgstr ""
+msgstr "ແຖບສະຖານະ"
 
 msgctxt "field:res.user,warnings:"
 msgid "Warnings"
-msgstr ""
+msgstr "ຄຳເຕືອນ"
 
-#, fuzzy
 msgctxt "field:res.user,write_date:"
 msgid "Write Date"
-msgstr "ຂຽນວັນທີ"
+msgstr "ວັນທີບັນທຶກ"
 
-#, fuzzy
 msgctxt "field:res.user,write_uid:"
 msgid "Write User"
-msgstr "ຂຽນຜູ້ໃຊ້ງານ"
+msgstr "ຜູ້ບັນທຶກ"
 
-#, fuzzy
 msgctxt "field:res.user-ir.action,action:"
 msgid "Action"
-msgstr "ການປະຕິບັດ"
+msgstr "ດຳເນີນການ"
 
-#, fuzzy
 msgctxt "field:res.user-ir.action,create_date:"
 msgid "Create Date"
-msgstr "ສ້າງວັນທີ"
+msgstr "ວັນທີສ້າງ"
 
-#, fuzzy
 msgctxt "field:res.user-ir.action,create_uid:"
 msgid "Create User"
-msgstr "ສ້າງຜູ້ໃຊ້ງານ"
+msgstr "ຜູ້ສ້າງ"
 
-#, fuzzy
 msgctxt "field:res.user-ir.action,id:"
 msgid "ID"
-msgstr "ເລກປະຈຳໂຕ"
+msgstr "ເລກລຳດັບ"
 
-#, fuzzy
 msgctxt "field:res.user-ir.action,rec_name:"
 msgid "Name"
 msgstr "ຊື່"
 
-#, fuzzy
 msgctxt "field:res.user-ir.action,user:"
 msgid "User"
 msgstr "ຜູ້ໃຊ້"
 
-#, fuzzy
 msgctxt "field:res.user-ir.action,write_date:"
 msgid "Write Date"
-msgstr "ຂຽນວັນທີ"
+msgstr "ວັນທີບັນທຶກ"
 
-#, fuzzy
 msgctxt "field:res.user-ir.action,write_uid:"
 msgid "Write User"
-msgstr "ຂຽນຜູ້ໃຊ້ງານ"
+msgstr "ຜູ້ບັນທຶກ"
 
-#, fuzzy
 msgctxt "field:res.user-res.group,create_date:"
 msgid "Create Date"
-msgstr "ສ້າງວັນທີ"
+msgstr "ວັນທີສ້າງ"
 
-#, fuzzy
 msgctxt "field:res.user-res.group,create_uid:"
 msgid "Create User"
-msgstr "ສ້າງຜູ້ໃຊ້ງານ"
+msgstr "ຜູ້ສ້າງ"
 
-#, fuzzy
 msgctxt "field:res.user-res.group,group:"
 msgid "Group"
 msgstr "ກຸ່ມ"
 
-#, fuzzy
 msgctxt "field:res.user-res.group,id:"
 msgid "ID"
-msgstr "ເລກປະຈຳໂຕ"
+msgstr "ເລກລຳດັບ"
 
-#, fuzzy
 msgctxt "field:res.user-res.group,rec_name:"
 msgid "Name"
 msgstr "ຊື່"
 
-#, fuzzy
 msgctxt "field:res.user-res.group,user:"
 msgid "User"
 msgstr "ຜູ້ໃຊ້"
 
-#, fuzzy
 msgctxt "field:res.user-res.group,write_date:"
 msgid "Write Date"
-msgstr "ຂຽນວັນທີ"
+msgstr "ວັນທີບັນທຶກ"
 
-#, fuzzy
 msgctxt "field:res.user-res.group,write_uid:"
 msgid "Write User"
-msgstr "ຂຽນຜູ້ໃຊ້ງານ"
+msgstr "ຜູ້ບັນທຶກ"
 
 msgctxt "field:res.user.application,application:"
 msgid "Application"
-msgstr ""
+msgstr "ໂປຣແກຣມນຳໃຊ້"
 
-#, fuzzy
 msgctxt "field:res.user.application,create_date:"
 msgid "Create Date"
-msgstr "ສ້າງວັນທີ"
+msgstr "ວັນທີສ້າງ"
 
-#, fuzzy
 msgctxt "field:res.user.application,create_uid:"
 msgid "Create User"
-msgstr "ສ້າງຜູ້ໃຊ້ງານ"
+msgstr "ຜູ້ສ້າງ"
 
-#, fuzzy
 msgctxt "field:res.user.application,id:"
 msgid "ID"
-msgstr "ເລກປະຈຳໂຕ"
+msgstr "ເລກລຳດັບ"
 
 msgctxt "field:res.user.application,key:"
 msgid "Key"
-msgstr ""
+msgstr "ຄຳທີ່ເປັນກຸນແຈ"
 
-#, fuzzy
 msgctxt "field:res.user.application,rec_name:"
 msgid "Name"
 msgstr "ຊື່"
 
 msgctxt "field:res.user.application,state:"
 msgid "State"
-msgstr ""
+msgstr "ສະຖານະ"
 
-#, fuzzy
 msgctxt "field:res.user.application,user:"
 msgid "User"
 msgstr "ຜູ້ໃຊ້"
 
-#, fuzzy
 msgctxt "field:res.user.application,write_date:"
 msgid "Write Date"
-msgstr "ຂຽນວັນທີ"
+msgstr "ວັນທີບັນທຶກ"
 
-#, fuzzy
 msgctxt "field:res.user.application,write_uid:"
 msgid "Write User"
-msgstr "ຂຽນຜູ້ໃຊ້ງານ"
+msgstr "ຜູ້ບັນທຶກ"
 
-#, fuzzy
 msgctxt "field:res.user.config.start,id:"
 msgid "ID"
-msgstr "ເລກປະຈຳໂຕ"
+msgstr "ເລກລຳດັບ"
 
-#, fuzzy
 msgctxt "field:res.user.login.attempt,create_date:"
 msgid "Create Date"
-msgstr "ສ້າງວັນທີ"
+msgstr "ວັນທີສ້າງ"
 
-#, fuzzy
 msgctxt "field:res.user.login.attempt,create_uid:"
 msgid "Create User"
-msgstr "ສ້າງຜູ້ໃຊ້ງານ"
+msgstr "ຜູ້ສ້າງ"
 
-#, fuzzy
 msgctxt "field:res.user.login.attempt,id:"
 msgid "ID"
-msgstr "ເລກປະຈຳໂຕ"
+msgstr "ເລກລຳດັບ"
 
 msgctxt "field:res.user.login.attempt,login:"
 msgid "Login"
-msgstr ""
+msgstr "ເຂົ້າສູ່ລະບົບ"
 
-#, fuzzy
 msgctxt "field:res.user.login.attempt,rec_name:"
 msgid "Name"
 msgstr "ຊື່"
 
-#, fuzzy
 msgctxt "field:res.user.login.attempt,write_date:"
 msgid "Write Date"
-msgstr "ຂຽນວັນທີ"
+msgstr "ວັນທີບັນທຶກ"
 
-#, fuzzy
 msgctxt "field:res.user.login.attempt,write_uid:"
 msgid "Write User"
-msgstr "ຂຽນຜູ້ໃຊ້ງານ"
+msgstr "ຜູ້ບັນທຶກ"
 
 msgctxt "field:res.user.warning,always:"
 msgid "Always"
-msgstr ""
+msgstr "ເລື້ອຍໆ"
 
-#, fuzzy
 msgctxt "field:res.user.warning,create_date:"
 msgid "Create Date"
-msgstr "ສ້າງວັນທີ"
+msgstr "ວັນທີສ້າງ"
 
-#, fuzzy
 msgctxt "field:res.user.warning,create_uid:"
 msgid "Create User"
-msgstr "ສ້າງຜູ້ໃຊ້ງານ"
+msgstr "ຜູ້ສ້າງ"
 
-#, fuzzy
 msgctxt "field:res.user.warning,id:"
 msgid "ID"
-msgstr "ເລກປະຈຳໂຕ"
+msgstr "ເລກລຳດັບ"
 
-#, fuzzy
 msgctxt "field:res.user.warning,name:"
 msgid "Name"
 msgstr "ຊື່"
 
-#, fuzzy
 msgctxt "field:res.user.warning,rec_name:"
 msgid "Name"
 msgstr "ຊື່"
 
-#, fuzzy
 msgctxt "field:res.user.warning,user:"
 msgid "User"
 msgstr "ຜູ້ໃຊ້"
 
-#, fuzzy
 msgctxt "field:res.user.warning,write_date:"
 msgid "Write Date"
-msgstr "ຂຽນວັນທີ"
+msgstr "ວັນທີບັນທຶກ"
 
-#, fuzzy
 msgctxt "field:res.user.warning,write_uid:"
 msgid "Write User"
-msgstr "ຂຽນຜູ້ໃຊ້ງານ"
+msgstr "ຜູ້ບັນທຶກ"
 
 msgctxt "help:ir.sequence.type,groups:"
 msgid "Groups allowed to edit the sequences of this type"
-msgstr ""
+msgstr "ກຸ່ມອະນຸຍາດໃຫ້ແກ້ໄຂລຳດັບຂອງປະເພດນີ້"
 
 msgctxt "help:res.user,actions:"
 msgid "Actions that will be run at login"
-msgstr ""
+msgstr "ດຳເນີນການ ທີ່ຈະແລ່ນຂຶ້ນ ໃນເວລາ ເຂົ້າສູ່ລະບົບ"
 
-#, fuzzy
 msgctxt "model:ir.action,name:act_group_form"
 msgid "Groups"
-msgstr "ໝວດ"
+msgstr "ກຸ່ມ"
 
 msgctxt "model:ir.action,name:act_user_config"
 msgid "Configure Users"
-msgstr ""
+msgstr "ກຳນົດຄ່າຜູ້ໃຊ້ງານ"
 
-#, fuzzy
 msgctxt "model:ir.action,name:act_user_form"
 msgid "Users"
 msgstr "ຜູ້ໃຊ້"
 
 msgctxt "model:ir.action-res.group,name:"
 msgid "Action - Group"
-msgstr ""
+msgstr "ດຳເນີນການ - ກຸ່ມ"
 
 msgctxt "model:ir.cron,name:cron_trigger_time"
 msgid "Run On Time Triggers"
-msgstr ""
+msgstr "ແລ່ນໃນທັນທີທີ່ລັ່ນໄກ"
 
 msgctxt "model:ir.model.button-res.group,name:"
 msgid "Model Button - Group"
-msgstr ""
+msgstr "ແບບປຸ່ມ - ກຸ່ມ"
 
 msgctxt "model:ir.model.field-res.group,name:"
 msgid "Model Field Group Rel"
-msgstr ""
+msgstr "Rel ແບບກຸ່ມຊ່ອງຂໍ້ມູນ"
 
 msgctxt "model:ir.rule.group-res.group,name:"
 msgid "Rule Group - Group"
-msgstr ""
+msgstr "ກຸ່ມກົດລະບຽບ - ກຸ່ມ"
 
 msgctxt "model:ir.rule.group-res.user,name:"
 msgid "Rule Group - User"
-msgstr ""
+msgstr "ກຸ້ມກົດລະບຽບ - ຜູ້ໃຊ້ງານ"
 
 msgctxt "model:ir.sequence.type-res.group,name:"
 msgid "Sequence Type - Group"
-msgstr ""
+msgstr "ປະເພດລຳດັບ - ກຸ່ມ"
 
-#, fuzzy
 msgctxt "model:ir.ui.menu,name:menu_group_form"
 msgid "Groups"
-msgstr "ໝວດ"
+msgstr "ກຸ່ມ"
 
-#, fuzzy
 msgctxt "model:ir.ui.menu,name:menu_res"
 msgid "Users"
 msgstr "ຜູ້ໃຊ້"
 
-#, fuzzy
 msgctxt "model:ir.ui.menu,name:menu_user_form"
 msgid "Users"
 msgstr "ຜູ້ໃຊ້"
 
 msgctxt "model:ir.ui.menu-res.group,name:"
 msgid "UI Menu - Group"
-msgstr ""
+msgstr "ລາຍການຄຳສັ່ງ UI - ກຸ່ມ"
 
-#, fuzzy
 msgctxt "model:res.group,name:"
 msgid "Group"
 msgstr "ກຸ່ມ"
 
-#, fuzzy
 msgctxt "model:res.group,name:group_admin"
 msgid "Administration"
-msgstr "ຜູ້ບໍລິຫານ"
+msgstr "ການບໍລິຫານ"
 
-#, fuzzy
 msgctxt "model:res.user,name:"
 msgid "User"
 msgstr "ຜູ້ໃຊ້"
 
 msgctxt "model:res.user-ir.action,name:"
 msgid "User - Action"
-msgstr ""
+msgstr "ຜູ້ໃຊ້ - ການດຳເນີນການ"
 
-#, fuzzy
 msgctxt "model:res.user-res.group,name:"
 msgid "User - Group"
-msgstr "ກຸ່ມຜູ້ໃຊ້ງານ"
+msgstr "ຜູ້ໃຊ້ - ກຸ່ມ"
 
 msgctxt "model:res.user.application,name:"
 msgid "User Application"
-msgstr ""
+msgstr "ໂປຣແກຣມໃຊ້ງານຂອງຜູ້ໃຊ້"
 
 msgctxt "model:res.user.config.start,name:"
 msgid "User Config Init"
-msgstr ""
+msgstr "ກຳນົດຄ່າຜູ້ໃຊ້ງານຂັ້ນພື້ນຖານ"
 
 msgctxt "model:res.user.login.attempt,name:"
 msgid "Login Attempt"
-msgstr ""
+msgstr "ການພະຍາຍາມເຂົ້າສູ່ລະບົບ"
 
 msgctxt "model:res.user.warning,name:"
 msgid "User Warning"
-msgstr ""
+msgstr "ຄຳເຕືອນຜູ້ໃຊ້ງານ"
 
 msgctxt "selection:res.user.application,state:"
 msgid "Cancelled"
-msgstr ""
+msgstr "ຍົກເລີກແລ້ວ"
 
 msgctxt "selection:res.user.application,state:"
 msgid "Requested"
-msgstr ""
+msgstr "ຮ້ອງຂໍແລ້ວ"
 
 msgctxt "selection:res.user.application,state:"
 msgid "Validated"
-msgstr ""
+msgstr "ກວດສອບຄວາມຖືກຕ້ອງແລ້ວ"
 
 msgctxt "view:res.group:"
 msgid "Access Permissions"
-msgstr ""
+msgstr "ການອະນຸຍາດເຂົ້າເຖິງ"
 
 msgctxt "view:res.group:"
 msgid "Members"
-msgstr ""
+msgstr "ສະມາຊິກ"
 
-#, fuzzy
 msgctxt "view:res.user.application:"
 msgid "Cancel"
 msgstr "ຍົກເລີກ"
 
 msgctxt "view:res.user.application:"
 msgid "Validate"
-msgstr ""
+msgstr "ກວດສອບຄວາມຖືກຕ້ອງ"
 
 msgctxt "view:res.user.config.start:"
 msgid "Be careful that the login must be unique!"
-msgstr ""
+msgstr "ລະວັງ ການເຂົ້າສູ່ລະບົບຕ້ອງບໍ່ຊໍ້າກັນ"
 
 msgctxt "view:res.user.config.start:"
 msgid "You can now add some users into the system."
-msgstr ""
+msgstr "ບັດນີ້ທ່ານສາມາດເພີ່ມຜູ້ໃຊ້ງານເຂົ້າໃນລະບົບໄດ້ແລ້ວ"
 
 msgctxt "view:res.user:"
 msgid "Access Permissions"
-msgstr ""
+msgstr "ການອະນຸຍາດໃຫ້ເຂົ້າເຖິງ"
 
-#, fuzzy
 msgctxt "view:res.user:"
 msgid "Actions"
-msgstr "ການປະຕິບັດ"
+msgstr "ການດຳເນີນການ"
 
 msgctxt "view:res.user:"
 msgid "Group Membership"
-msgstr ""
+msgstr "ສະມາຊິກກຸ່ມ"
 
 msgctxt "view:res.user:"
 msgid "Preferences"
-msgstr ""
+msgstr "ການປັບແຕ່ງຄ່າ"
 
 msgctxt "view:res.user:"
 msgid "User"
@@ -855,12 +774,10 @@ msgctxt "wizard_button:res.user.config,start,end:"
 msgid "Cancel"
 msgstr "ຍົກເລີກ"
 
-#, fuzzy
 msgctxt "wizard_button:res.user.config,start,user:"
 msgid "OK"
 msgstr "ຕົກລົງ"
 
-#, fuzzy
 msgctxt "wizard_button:res.user.config,user,add:"
 msgid "Add"
 msgstr "ເພີ່ມ"
diff --git a/trytond/res/locale/lt.po b/trytond/res/locale/lt.po
index 01a356e..66f0afb 100644
--- a/trytond/res/locale/lt.po
+++ b/trytond/res/locale/lt.po
@@ -7,6 +7,30 @@ msgid "The name of the group must be unique!"
 msgstr ""
 
 msgctxt "error:res.user:"
+msgid "The password can not be the same as user email."
+msgstr ""
+
+msgctxt "error:res.user:"
+msgid "The password can not be the same as user login."
+msgstr ""
+
+msgctxt "error:res.user:"
+msgid "The password can not be the same as user name."
+msgstr ""
+
+msgctxt "error:res.user:"
+msgid "The password contains too much times the same characters."
+msgstr ""
+
+msgctxt "error:res.user:"
+msgid "The password is forbidden."
+msgstr ""
+
+msgctxt "error:res.user:"
+msgid "The password is too short."
+msgstr ""
+
+msgctxt "error:res.user:"
 msgid ""
 "Users can not be deleted for logging purpose.\n"
 "Instead you must inactivate them."
@@ -275,6 +299,10 @@ msgctxt "field:ir.ui.menu-res.group,write_uid:"
 msgid "Write User"
 msgstr ""
 
+msgctxt "field:res.group,buttons:"
+msgid "Buttons"
+msgstr ""
+
 msgctxt "field:res.group,create_date:"
 msgid "Create Date"
 msgstr ""
diff --git a/trytond/res/locale/nl.po b/trytond/res/locale/nl.po
index debde5d..5fa996e 100644
--- a/trytond/res/locale/nl.po
+++ b/trytond/res/locale/nl.po
@@ -7,6 +7,30 @@ msgid "The name of the group must be unique!"
 msgstr ""
 
 msgctxt "error:res.user:"
+msgid "The password can not be the same as user email."
+msgstr ""
+
+msgctxt "error:res.user:"
+msgid "The password can not be the same as user login."
+msgstr ""
+
+msgctxt "error:res.user:"
+msgid "The password can not be the same as user name."
+msgstr ""
+
+msgctxt "error:res.user:"
+msgid "The password contains too much times the same characters."
+msgstr ""
+
+msgctxt "error:res.user:"
+msgid "The password is forbidden."
+msgstr ""
+
+msgctxt "error:res.user:"
+msgid "The password is too short."
+msgstr ""
+
+msgctxt "error:res.user:"
 msgid ""
 "Users can not be deleted for logging purpose.\n"
 "Instead you must inactivate them."
@@ -322,6 +346,10 @@ msgctxt "field:ir.ui.menu-res.group,write_uid:"
 msgid "Write User"
 msgstr "Gebruiker"
 
+msgctxt "field:res.group,buttons:"
+msgid "Buttons"
+msgstr ""
+
 #, fuzzy
 msgctxt "field:res.group,create_date:"
 msgid "Create Date"
diff --git a/trytond/res/locale/pl.po b/trytond/res/locale/pl.po
index a792692..ff6c683 100644
--- a/trytond/res/locale/pl.po
+++ b/trytond/res/locale/pl.po
@@ -7,6 +7,30 @@ msgid "The name of the group must be unique!"
 msgstr "Nazwa grupy musi być unikatowa!"
 
 msgctxt "error:res.user:"
+msgid "The password can not be the same as user email."
+msgstr "Hasło nie może być takie samo jak e-mail użytkownika."
+
+msgctxt "error:res.user:"
+msgid "The password can not be the same as user login."
+msgstr "Hasło nie może być takie samo jak login użytkownika."
+
+msgctxt "error:res.user:"
+msgid "The password can not be the same as user name."
+msgstr "Hasło nie może być takie samo jak nazwa użytkownika."
+
+msgctxt "error:res.user:"
+msgid "The password contains too much times the same characters."
+msgstr "Hasło zawiera często pojawiające się te same znaki."
+
+msgctxt "error:res.user:"
+msgid "The password is forbidden."
+msgstr "Takie hasło jest niedozwolone."
+
+msgctxt "error:res.user:"
+msgid "The password is too short."
+msgstr "Hasło jest za krótkie."
+
+msgctxt "error:res.user:"
 msgid ""
 "Users can not be deleted for logging purpose.\n"
 "Instead you must inactivate them."
@@ -16,7 +40,7 @@ msgstr ""
 
 msgctxt "error:res.user:"
 msgid "Wrong password!"
-msgstr "Błędne hasło."
+msgstr "Błędne hasło!"
 
 msgctxt "error:res.user:"
 msgid "You can not have two users with the same login!"
@@ -196,15 +220,15 @@ msgstr "Zapisał"
 
 msgctxt "field:ir.sequence,groups:"
 msgid "User Groups"
-msgstr "Grupy użytkowników"
+msgstr "Grupy użytkownika"
 
 msgctxt "field:ir.sequence.strict,groups:"
 msgid "User Groups"
-msgstr "Grupy użytkowników"
+msgstr "Grupy użytkownika"
 
 msgctxt "field:ir.sequence.type,groups:"
 msgid "User Groups"
-msgstr "Grupy użytkowników"
+msgstr "Grupy użytkownika"
 
 msgctxt "field:ir.sequence.type-res.group,create_date:"
 msgid "Create Date"
@@ -216,7 +240,7 @@ msgstr "Utworzył"
 
 msgctxt "field:ir.sequence.type-res.group,group:"
 msgid "User Groups"
-msgstr "Grupy użytkowników"
+msgstr "Grupy użytkownika"
 
 msgctxt "field:ir.sequence.type-res.group,id:"
 msgid "ID"
@@ -228,7 +252,7 @@ msgstr "Nazwa"
 
 msgctxt "field:ir.sequence.type-res.group,sequence_type:"
 msgid "Sequence Type"
-msgstr "Typ kolejności"
+msgstr "Typ sekwencji"
 
 msgctxt "field:ir.sequence.type-res.group,write_date:"
 msgid "Write Date"
@@ -270,6 +294,10 @@ msgctxt "field:ir.ui.menu-res.group,write_uid:"
 msgid "Write User"
 msgstr "Zapisał"
 
+msgctxt "field:res.group,buttons:"
+msgid "Buttons"
+msgstr "Przyciski"
+
 msgctxt "field:res.group,create_date:"
 msgid "Create Date"
 msgstr "Data utworzenia"
@@ -356,7 +384,7 @@ msgstr "Język"
 
 msgctxt "field:res.user,language_direction:"
 msgid "Language Direction"
-msgstr ""
+msgstr "Kierunek pisania"
 
 msgctxt "field:res.user,login:"
 msgid "Login"
@@ -364,7 +392,7 @@ msgstr "Login"
 
 msgctxt "field:res.user,menu:"
 msgid "Menu Action"
-msgstr ""
+msgstr "Menu akcji"
 
 msgctxt "field:res.user,name:"
 msgid "Name"
@@ -376,11 +404,11 @@ msgstr "Hasło"
 
 msgctxt "field:res.user,password_hash:"
 msgid "Password Hash"
-msgstr ""
+msgstr "Hasło zakodowane"
 
 msgctxt "field:res.user,pyson_menu:"
 msgid "PySON Menu"
-msgstr ""
+msgstr "Menu PySON"
 
 msgctxt "field:res.user,rec_name:"
 msgid "Name"
@@ -400,7 +428,7 @@ msgstr "Podpis"
 
 msgctxt "field:res.user,status_bar:"
 msgid "Status Bar"
-msgstr ""
+msgstr "Pasek stanu"
 
 msgctxt "field:res.user,warnings:"
 msgid "Warnings"
@@ -588,7 +616,7 @@ msgstr "Zapisał"
 
 msgctxt "help:ir.sequence.type,groups:"
 msgid "Groups allowed to edit the sequences of this type"
-msgstr ""
+msgstr "Grupy uprawnione do edycji tego typu sekwencji"
 
 msgctxt "help:res.user,actions:"
 msgid "Actions that will be run at login"
@@ -612,7 +640,7 @@ msgstr "Akcja - Grupa"
 
 msgctxt "model:ir.cron,name:cron_trigger_time"
 msgid "Run On Time Triggers"
-msgstr "Run On Time Triggers"
+msgstr "Uruchom zgodnie z harmonogramem"
 
 msgctxt "model:ir.model.button-res.group,name:"
 msgid "Model Button - Group"
@@ -620,7 +648,7 @@ msgstr "Przycisk modelu - Grupa"
 
 msgctxt "model:ir.model.field-res.group,name:"
 msgid "Model Field Group Rel"
-msgstr ""
+msgstr "Pole modelu - Grupa"
 
 msgctxt "model:ir.rule.group-res.group,name:"
 msgid "Rule Group - Group"
@@ -632,7 +660,7 @@ msgstr "Grupa reguł - Użytkownik"
 
 msgctxt "model:ir.sequence.type-res.group,name:"
 msgid "Sequence Type - Group"
-msgstr "Typ kolejności - Grupa"
+msgstr "Typ sekwencji - Grupa"
 
 msgctxt "model:ir.ui.menu,name:menu_group_form"
 msgid "Groups"
@@ -676,7 +704,7 @@ msgstr "Aplikacja użytkownika"
 
 msgctxt "model:res.user.config.start,name:"
 msgid "User Config Init"
-msgstr ""
+msgstr "Wstępne ustawienia użytkownika"
 
 msgctxt "model:res.user.login.attempt,name:"
 msgid "Login Attempt"
@@ -720,7 +748,7 @@ msgstr "Pamiętaj, że login musi być unikatowy!"
 
 msgctxt "view:res.user.config.start:"
 msgid "You can now add some users into the system."
-msgstr "Teraz możesz dodać kilku użytkowników do systemu."
+msgstr "Teraz możesz dodać do systemu kilku użytkowników."
 
 msgctxt "view:res.user:"
 msgid "Access Permissions"
diff --git a/trytond/res/locale/pt_BR.po b/trytond/res/locale/pt_BR.po
index f4e7cf0..94ff352 100644
--- a/trytond/res/locale/pt_BR.po
+++ b/trytond/res/locale/pt_BR.po
@@ -7,6 +7,30 @@ msgid "The name of the group must be unique!"
 msgstr "O nome do grupo deve ser único!"
 
 msgctxt "error:res.user:"
+msgid "The password can not be the same as user email."
+msgstr "A sena não pode ser a mesma que o email."
+
+msgctxt "error:res.user:"
+msgid "The password can not be the same as user login."
+msgstr "A senha não pode ser sa mesma que o usuário."
+
+msgctxt "error:res.user:"
+msgid "The password can not be the same as user name."
+msgstr "A senha não pode ser a mesma que o nome do usuário."
+
+msgctxt "error:res.user:"
+msgid "The password contains too much times the same characters."
+msgstr "A senha contém muitas vezes o mesmo caracter."
+
+msgctxt "error:res.user:"
+msgid "The password is forbidden."
+msgstr "A senha é proibida."
+
+msgctxt "error:res.user:"
+msgid "The password is too short."
+msgstr "A senha é muito curta."
+
+msgctxt "error:res.user:"
 msgid ""
 "Users can not be deleted for logging purpose.\n"
 "Instead you must inactivate them."
@@ -90,12 +114,10 @@ msgctxt "field:ir.model.button-res.group,write_uid:"
 msgid "Write User"
 msgstr "Gravado pelo usuário"
 
-#, fuzzy
 msgctxt "field:ir.model.button.click,user:"
 msgid "User"
 msgstr "Usuário"
 
-#, fuzzy
 msgctxt "field:ir.model.button.rule,group:"
 msgid "Group"
 msgstr "Grupo"
@@ -272,6 +294,10 @@ msgctxt "field:ir.ui.menu-res.group,write_uid:"
 msgid "Write User"
 msgstr "Gravado pelo usuário"
 
+msgctxt "field:res.group,buttons:"
+msgid "Buttons"
+msgstr "Botões"
+
 msgctxt "field:res.group,create_date:"
 msgid "Create Date"
 msgstr "Data de criação"
@@ -330,7 +356,7 @@ msgstr "Ativo"
 
 msgctxt "field:res.user,applications:"
 msgid "Applications"
-msgstr ""
+msgstr "Aplicações"
 
 msgctxt "field:res.user,create_date:"
 msgid "Create Date"
@@ -482,50 +508,43 @@ msgstr "Gravado pelo usuário"
 
 msgctxt "field:res.user.application,application:"
 msgid "Application"
-msgstr ""
+msgstr "Aplicação"
 
-#, fuzzy
 msgctxt "field:res.user.application,create_date:"
 msgid "Create Date"
 msgstr "Data de criação"
 
-#, fuzzy
 msgctxt "field:res.user.application,create_uid:"
 msgid "Create User"
 msgstr "Criado pelo usuário"
 
-#, fuzzy
 msgctxt "field:res.user.application,id:"
 msgid "ID"
 msgstr "ID"
 
 msgctxt "field:res.user.application,key:"
 msgid "Key"
-msgstr ""
+msgstr "Chave"
 
-#, fuzzy
 msgctxt "field:res.user.application,rec_name:"
 msgid "Name"
 msgstr "Nome"
 
 msgctxt "field:res.user.application,state:"
 msgid "State"
-msgstr ""
+msgstr "Estado"
 
-#, fuzzy
 msgctxt "field:res.user.application,user:"
 msgid "User"
 msgstr "Usuário"
 
-#, fuzzy
 msgctxt "field:res.user.application,write_date:"
 msgid "Write Date"
-msgstr "Data de gravação"
+msgstr "Data de edição"
 
-#, fuzzy
 msgctxt "field:res.user.application,write_uid:"
 msgid "Write User"
-msgstr "Gravado pelo usuário"
+msgstr "Editado por"
 
 msgctxt "field:res.user.config.start,id:"
 msgid "ID"
@@ -681,7 +700,7 @@ msgstr "Usuário - Grupo"
 
 msgctxt "model:res.user.application,name:"
 msgid "User Application"
-msgstr ""
+msgstr "Aplicação do Usuário"
 
 msgctxt "model:res.user.config.start,name:"
 msgid "User Config Init"
@@ -697,15 +716,15 @@ msgstr "Alerta de Usuário"
 
 msgctxt "selection:res.user.application,state:"
 msgid "Cancelled"
-msgstr ""
+msgstr "Cancelado"
 
 msgctxt "selection:res.user.application,state:"
 msgid "Requested"
-msgstr ""
+msgstr "Solicitado"
 
 msgctxt "selection:res.user.application,state:"
 msgid "Validated"
-msgstr ""
+msgstr "Validado"
 
 msgctxt "view:res.group:"
 msgid "Access Permissions"
@@ -715,14 +734,13 @@ msgctxt "view:res.group:"
 msgid "Members"
 msgstr "Membros"
 
-#, fuzzy
 msgctxt "view:res.user.application:"
 msgid "Cancel"
 msgstr "Cancelar"
 
 msgctxt "view:res.user.application:"
 msgid "Validate"
-msgstr ""
+msgstr "Validar"
 
 msgctxt "view:res.user.config.start:"
 msgid "Be careful that the login must be unique!"
diff --git a/trytond/res/locale/ru.po b/trytond/res/locale/ru.po
index e6d0f05..3f21691 100644
--- a/trytond/res/locale/ru.po
+++ b/trytond/res/locale/ru.po
@@ -7,6 +7,30 @@ msgid "The name of the group must be unique!"
 msgstr "Наименование группы должно быть уникальным!"
 
 msgctxt "error:res.user:"
+msgid "The password can not be the same as user email."
+msgstr ""
+
+msgctxt "error:res.user:"
+msgid "The password can not be the same as user login."
+msgstr ""
+
+msgctxt "error:res.user:"
+msgid "The password can not be the same as user name."
+msgstr ""
+
+msgctxt "error:res.user:"
+msgid "The password contains too much times the same characters."
+msgstr ""
+
+msgctxt "error:res.user:"
+msgid "The password is forbidden."
+msgstr ""
+
+msgctxt "error:res.user:"
+msgid "The password is too short."
+msgstr ""
+
+msgctxt "error:res.user:"
 msgid ""
 "Users can not be deleted for logging purpose.\n"
 "Instead you must inactivate them."
@@ -270,6 +294,11 @@ msgctxt "field:ir.ui.menu-res.group,write_uid:"
 msgid "Write User"
 msgstr "Изменено пользователем"
 
+#, fuzzy
+msgctxt "field:res.group,buttons:"
+msgid "Buttons"
+msgstr "Кнопка"
+
 msgctxt "field:res.group,create_date:"
 msgid "Create Date"
 msgstr "Дата создания"
diff --git a/trytond/res/locale/sl.po b/trytond/res/locale/sl.po
index 3282bc9..9a4e01e 100644
--- a/trytond/res/locale/sl.po
+++ b/trytond/res/locale/sl.po
@@ -7,6 +7,30 @@ msgid "The name of the group must be unique!"
 msgstr "Naziv skupine mora biti edinstven."
 
 msgctxt "error:res.user:"
+msgid "The password can not be the same as user email."
+msgstr "Geslo mora biti različno od elektronskega naslova uporabnika."
+
+msgctxt "error:res.user:"
+msgid "The password can not be the same as user login."
+msgstr "Geslo mora biti različno od uporabnikove prijave."
+
+msgctxt "error:res.user:"
+msgid "The password can not be the same as user name."
+msgstr "Geslo mora biti različno od uporabniškega imena."
+
+msgctxt "error:res.user:"
+msgid "The password contains too much times the same characters."
+msgstr "Geslo vsebuje preveč istih znakov."
+
+msgctxt "error:res.user:"
+msgid "The password is forbidden."
+msgstr "Geslo je prepovedano."
+
+msgctxt "error:res.user:"
+msgid "The password is too short."
+msgstr "Geslo je prekratko."
+
+msgctxt "error:res.user:"
 msgid ""
 "Users can not be deleted for logging purpose.\n"
 "Instead you must inactivate them."
@@ -90,12 +114,10 @@ msgctxt "field:ir.model.button-res.group,write_uid:"
 msgid "Write User"
 msgstr "Zapisal"
 
-#, fuzzy
 msgctxt "field:ir.model.button.click,user:"
 msgid "User"
 msgstr "Uporabnik"
 
-#, fuzzy
 msgctxt "field:ir.model.button.rule,group:"
 msgid "Group"
 msgstr "Skupina"
@@ -272,6 +294,10 @@ msgctxt "field:ir.ui.menu-res.group,write_uid:"
 msgid "Write User"
 msgstr "Zapisal"
 
+msgctxt "field:res.group,buttons:"
+msgid "Buttons"
+msgstr "Gumbi"
+
 msgctxt "field:res.group,create_date:"
 msgid "Create Date"
 msgstr "Izdelano"
@@ -330,7 +356,7 @@ msgstr "Aktivno"
 
 msgctxt "field:res.user,applications:"
 msgid "Applications"
-msgstr ""
+msgstr "Aplikacije"
 
 msgctxt "field:res.user,create_date:"
 msgid "Create Date"
@@ -482,19 +508,16 @@ msgstr "Zapisal"
 
 msgctxt "field:res.user.application,application:"
 msgid "Application"
-msgstr ""
+msgstr "Aplikacija"
 
-#, fuzzy
 msgctxt "field:res.user.application,create_date:"
 msgid "Create Date"
 msgstr "Izdelano"
 
-#, fuzzy
 msgctxt "field:res.user.application,create_uid:"
 msgid "Create User"
 msgstr "Izdelal"
 
-#, fuzzy
 msgctxt "field:res.user.application,id:"
 msgid "ID"
 msgstr "ID"
@@ -503,7 +526,6 @@ msgctxt "field:res.user.application,key:"
 msgid "Key"
 msgstr "Ključ"
 
-#, fuzzy
 msgctxt "field:res.user.application,rec_name:"
 msgid "Name"
 msgstr "Ime"
@@ -512,17 +534,14 @@ msgctxt "field:res.user.application,state:"
 msgid "State"
 msgstr "Stanje"
 
-#, fuzzy
 msgctxt "field:res.user.application,user:"
 msgid "User"
 msgstr "Uporabnik"
 
-#, fuzzy
 msgctxt "field:res.user.application,write_date:"
 msgid "Write Date"
 msgstr "Zapisano"
 
-#, fuzzy
 msgctxt "field:res.user.application,write_uid:"
 msgid "Write User"
 msgstr "Zapisal"
@@ -681,7 +700,7 @@ msgstr "Uporabnik - Skupina"
 
 msgctxt "model:res.user.application,name:"
 msgid "User Application"
-msgstr ""
+msgstr "Uporabniška aplikacija"
 
 msgctxt "model:res.user.config.start,name:"
 msgid "User Config Init"
@@ -715,7 +734,6 @@ msgctxt "view:res.group:"
 msgid "Members"
 msgstr "Člani"
 
-#, fuzzy
 msgctxt "view:res.user.application:"
 msgid "Cancel"
 msgstr "Prekliči"
diff --git a/trytond/res/locale/zh_CN.po b/trytond/res/locale/zh_CN.po
index 81db228..92954c8 100644
--- a/trytond/res/locale/zh_CN.po
+++ b/trytond/res/locale/zh_CN.po
@@ -7,6 +7,30 @@ msgid "The name of the group must be unique!"
 msgstr "用户组标识必须唯一!"
 
 msgctxt "error:res.user:"
+msgid "The password can not be the same as user email."
+msgstr ""
+
+msgctxt "error:res.user:"
+msgid "The password can not be the same as user login."
+msgstr ""
+
+msgctxt "error:res.user:"
+msgid "The password can not be the same as user name."
+msgstr ""
+
+msgctxt "error:res.user:"
+msgid "The password contains too much times the same characters."
+msgstr ""
+
+msgctxt "error:res.user:"
+msgid "The password is forbidden."
+msgstr ""
+
+msgctxt "error:res.user:"
+msgid "The password is too short."
+msgstr ""
+
+msgctxt "error:res.user:"
 msgid ""
 "Users can not be deleted for logging purpose.\n"
 "Instead you must inactivate them."
@@ -270,6 +294,11 @@ msgctxt "field:ir.ui.menu-res.group,write_uid:"
 msgid "Write User"
 msgstr "写入帐号"
 
+#, fuzzy
+msgctxt "field:res.group,buttons:"
+msgid "Buttons"
+msgstr "按钮"
+
 msgctxt "field:res.group,create_date:"
 msgid "Create Date"
 msgstr "创建日期"
diff --git a/trytond/res/routes.py b/trytond/res/routes.py
index db6dd3a..6a4615f 100644
--- a/trytond/res/routes.py
+++ b/trytond/res/routes.py
@@ -4,8 +4,12 @@ import logging
 import time
 import random
 
+from werkzeug.exceptions import abort
+
+from trytond.config import config
 from trytond.wsgi import app
 from trytond.protocols.wrappers import with_pool, with_transaction
+from trytond.transaction import Transaction
 
 logger = logging.getLogger(__name__)
 
@@ -23,7 +27,7 @@ def user_application(request, pool):
     if request.method == 'POST':
         # Make time random to process and try to use the same path as much as
         # possible to prevent guessing between valid and invalid requests.
-        time.sleep(random.random())
+        Transaction().atexit(time.sleep, random.random())
         users = User.search([
                 ('login', '=', login),
                 ])
@@ -46,7 +50,11 @@ def user_application(request, pool):
                     ]))
         return key
     elif request.method == 'DELETE':
-        time.sleep(2 ** LoginAttempt.count(login) - 1)
+        count = LoginAttempt.count(login)
+        if count > config.get('session', 'max_attempt', default=5):
+            LoginAttempt.add(login)
+            abort(429)
+        Transaction().atexit(time.sleep, 2 ** count - 1)
         applications = UserApplication.search([
                 ('user.login', '=', login),
                 ('key', '=', data.get('key')),
diff --git a/trytond/res/user.py b/trytond/res/user.py
index b022399..8db9048 100644
--- a/trytond/res/user.py
+++ b/trytond/res/user.py
@@ -1,6 +1,7 @@
 # This file is part of Tryton.  The COPYRIGHT file at the top level of
 # this repository contains the full copyright notices and license terms.
 "User"
+from __future__ import division
 import copy
 import string
 import random
@@ -9,6 +10,7 @@ import time
 import datetime
 import logging
 import uuid
+import mmap
 from functools import wraps
 from itertools import groupby, ifilter
 from operator import attrgetter
@@ -34,7 +36,7 @@ from ..pool import Pool
 from ..config import config
 from ..pyson import PYSONEncoder, Eval
 from ..rpc import RPC
-from ..exceptions import LoginException
+from ..exceptions import LoginException, RateLimitException
 
 __all__ = [
     'User', 'LoginAttempt', 'UserAction', 'UserGroup', 'Warning_',
@@ -116,6 +118,17 @@ class User(ModelSQL, ModelView):
                     'for logging purpose.\n'
                     'Instead you must inactivate them.'),
                 'wrong_password': 'Wrong password!',
+                'password_length': "The password is too short.",
+                'password_forbidden': "The password is forbidden.",
+                'password_name': (
+                    "The password can not be the same as user name."),
+                'password_login': (
+                    "The password can not be the same as user login."),
+                'password_email': (
+                    "The password can not be the same as user email."),
+                'password_entropy': (
+                    "The password contains too much times "
+                    "the same characters."),
                 })
 
     @classmethod
@@ -200,6 +213,10 @@ class User(ModelSQL, ModelView):
     def set_password(cls, users, name, value):
         if value == 'x' * 10:
             return
+
+        if Transaction().user and value:
+            cls.validate_password(value, users)
+
         to_write = []
         for user in users:
             to_write.extend([[user], {
@@ -207,6 +224,36 @@ class User(ModelSQL, ModelView):
                         }])
         cls.write(*to_write)
 
+    @classmethod
+    def validate_password(cls, password, users):
+        password_b = password
+        if isinstance(password, unicode):
+            password_b = password.encode('utf-8')
+        length = config.getint('password', 'length', default=0)
+        if length > 0:
+            if len(password_b) < length:
+                cls.raise_user_error('password_length')
+        path = config.get('password', 'forbidden', default=None)
+        if path:
+            with open(path, 'r') as f:
+                forbidden = mmap.mmap(
+                    f.fileno(), 0, access=mmap.ACCESS_READ)
+                if forbidden.find(password_b) >= 0:
+                    cls.raise_user_error('password_forbidden')
+        entropy = config.getfloat('password', 'entropy', default=0)
+        if entropy:
+            if len(set(password)) / len(password) < entropy:
+                cls.raise_user_error('password_entropy')
+        for user in users:
+            # Use getattr to allow to use non User instances
+            for test, error in [
+                    (getattr(user, 'name', ''), 'password_name'),
+                    (getattr(user, 'login', ''), 'password_login'),
+                    (getattr(user, 'email', ''), 'password_email'),
+                    ]:
+                if test and password.lower() == test.lower():
+                    cls.raise_user_error(error)
+
     @staticmethod
     def get_sessions(users, name):
         Session = Pool().get('ir.session')
@@ -324,6 +371,7 @@ class User(ModelSQL, ModelView):
         pool = Pool()
         ModelData = pool.get('ir.model.data')
         Action = pool.get('ir.action')
+        Config = pool.get('ir.configuration')
         ConfigItem = pool.get('ir.module.config_wizard.item')
 
         res = {}
@@ -337,7 +385,7 @@ class User(ModelSQL, ModelView):
                     if user.language:
                         res['language'] = user.language.code
                     else:
-                        res['language'] = None
+                        res['language'] = Config.get_language()
                 else:
                     res[field] = None
                     if getattr(user, field):
@@ -495,7 +543,11 @@ class User(ModelSQL, ModelView):
         Return user id if password matches
         '''
         LoginAttempt = Pool().get('res.user.login.attempt')
-        time.sleep(2 ** LoginAttempt.count(login) - 1)
+        count = LoginAttempt.count(login)
+        if count > config.get('session', 'max_attempt', default=5):
+            LoginAttempt.add(login)
+            raise RateLimitException()
+        Transaction().atexit(time.sleep, 2 ** count - 1)
         for method in config.get(
                 'session', 'authentications', default='password').split(','):
             try:
diff --git a/trytond/res/view/group_form.xml b/trytond/res/view/group_form.xml
index 67f4357..2e86f58 100644
--- a/trytond/res/view/group_form.xml
+++ b/trytond/res/view/group_form.xml
@@ -8,11 +8,22 @@ this repository contains the full copyright notices and license terms. -->
         <page string="Members" col="2" id="members">
             <field name="users" colspan="2"/>
         </page>
-        <page string="Access Permissions" col="2" id="permissions">
-            <field name="model_access"/>
-            <field name="field_access"/>
-            <field name="menu_access" colspan="2"/>
-            <field name="rule_groups" colspan="2"/>
+        <page string="Access Permissions" col="1" id="permissions">
+            <notebook>
+                <page name="model_access" col="2">
+                    <field name="model_access"/>
+                    <field name="field_access"/>
+                </page>
+                <page name="rule_groups" col="1">
+                    <field name="rule_groups"/>
+                </page>
+                <page name="buttons" col="1">
+                    <field name="buttons"/>
+                </page>
+                <page name="menu_access" col="1">
+                    <field name="menu_access"/>
+                </page>
+            </notebook>
         </page>
     </notebook>
 </form>
diff --git a/trytond/res/view/user_application_form.xml b/trytond/res/view/user_application_form.xml
index b708a06..f28b163 100644
--- a/trytond/res/view/user_application_form.xml
+++ b/trytond/res/view/user_application_form.xml
@@ -11,7 +11,7 @@ this repository contains the full copyright notices and license terms. -->
     <field name="application"/>
     <label name="state"/>
     <field name="state"/>
-    <group id="buttons" colspan="2" col="2">
+    <group id="buttons" colspan="2" col="-1">
         <button name="cancel" string="Cancel" icon="tryton-cancel"/>
         <button name="validate_" string="Validate" icon="tryton-ok"/>
     </group>
diff --git a/trytond/security.py b/trytond/security.py
index b9adc45..d911f87 100644
--- a/trytond/security.py
+++ b/trytond/security.py
@@ -4,7 +4,7 @@ from trytond.pool import Pool
 from trytond.config import config
 from trytond.transaction import Transaction
 from trytond import backend
-from trytond.exceptions import LoginException
+from trytond.exceptions import LoginException, RateLimitException
 
 
 def _get_pool(dbname):
@@ -28,7 +28,7 @@ def login(dbname, loginname, parameters, cache=True, language=None):
                 if count:
                     continue
                 raise
-            except LoginException:
+            except (LoginException, RateLimitException):
                 # Let's store any changes done
                 transaction.commit()
                 raise
diff --git a/trytond/tests/__init__.py b/trytond/tests/__init__.py
index cf8e2f8..ca7cfc5 100644
--- a/trytond/tests/__init__.py
+++ b/trytond/tests/__init__.py
@@ -15,6 +15,7 @@ from .workflow import *
 from .copy_ import *
 from history import *
 from .field_context import *
+from . import multivalue
 
 
 def register():
@@ -74,6 +75,10 @@ def register():
         One2ManySizeTarget,
         One2ManySizePYSON,
         One2ManySizePYSONTarget,
+        One2ManyFilter,
+        One2ManyFilterTarget,
+        One2ManyFilterDomain,
+        One2ManyFilterDomainTarget,
         Many2Many,
         Many2ManyTarget,
         Many2ManyRelation,
@@ -88,10 +93,15 @@ def register():
         Many2ManySizeRelation,
         Many2ManyTree,
         Many2ManyTreeRelation,
+        Many2ManyFilter,
+        Many2ManyFilterTarget,
+        Many2ManyFilterRelation,
+        Many2ManyFilterDomain,
+        Many2ManyFilterDomainTarget,
+        Many2ManyFilterDomainRelation,
         Reference,
         ReferenceTarget,
         ReferenceRequired,
-        Property,
         Selection,
         SelectionRequired,
         DictSchema,
@@ -103,6 +113,9 @@ def register():
         BinaryRequired,
         BinaryFileStorage,
         Model,
+        ModelParent,
+        ModelChild,
+        ModelChildChild,
         Singleton,
         URLObject,
         ModelStorage,
@@ -124,6 +137,7 @@ def register():
         ModelViewChangedValues,
         ModelViewChangedValuesTarget,
         ModelViewButton,
+        ModelViewRPC,
         MPTT,
         ImportDataBoolean,
         ImportDataInteger,
@@ -171,15 +185,20 @@ def register():
         Many2OneSearch,
         Many2OneTree,
         Many2OneMPTT,
+        Many2OneNoForeignKey,
+        Many2OneTargetStorage,
         TestHistory,
         TestHistoryLine,
         FieldContextChild,
         FieldContextParent,
+        NullOrder,
         module='tests', type_='model')
     Pool.register(
         TestWizard,
         module='tests', type_='wizard')
 
+    multivalue.register('tests')
+
 
 def suite():
     from .test_tryton import all_suite
diff --git a/trytond/tests/forbidden.txt b/trytond/tests/forbidden.txt
new file mode 100644
index 0000000..f3097ab
--- /dev/null
+++ b/trytond/tests/forbidden.txt
@@ -0,0 +1 @@
+password
diff --git a/trytond/tests/model.py b/trytond/tests/model.py
index 69174e6..8ce2038 100644
--- a/trytond/tests/model.py
+++ b/trytond/tests/model.py
@@ -6,6 +6,7 @@ from trytond.transaction import Transaction
 
 __all__ = [
     'Model',
+    'ModelParent', 'ModelChild', 'ModelChildChild',
     'Singleton', 'URLObject',
     'ModelStorage', 'ModelStorageRequired', 'ModelStorageContext',
     'ModelSQLRequiredField', 'ModelSQLTimestamp', 'ModelSQLFieldSet',
@@ -13,6 +14,7 @@ __all__ = [
     'Union', 'UnionUnion',
     'Model4UnionTree1', 'Model4UnionTree2', 'UnionTree',
     'SequenceOrderedModel',
+    'NullOrder',
     ]
 
 
@@ -22,6 +24,26 @@ class Model(ModelSQL):
     name = fields.Char('Name')
 
 
+class ModelParent(Model):
+    "Model Parent"
+    __name__ = 'test.model_parent'
+    name = fields.Char("Name")
+
+
+class ModelChild(Model):
+    "Model Child"
+    __name__ = 'test.model_child'
+    name = fields.Char("Name")
+    parent = fields.Many2One('test.model_parent', "Parent")
+
+
+class ModelChildChild(Model):
+    "Model Child Child"
+    __name__ = 'test.model_child_child'
+    name = fields.Char("Name")
+    parent = fields.Many2One('test.model_child', "Parent")
+
+
 class Singleton(ModelSingleton, ModelSQL):
     'Singleton'
     __name__ = 'test.singleton'
@@ -161,3 +183,9 @@ class UnionTree(UnionMixin, ModelSQL):
 class SequenceOrderedModel(sequence_ordered(), ModelSQL):
     'Sequence Ordered Model'
     __name__ = 'test.order.sequence'
+
+
+class NullOrder(ModelSQL):
+    "Null Order"
+    __name__ = 'test.null_order'
+    integer = fields.Integer('Integer')
diff --git a/trytond/tests/modelview.py b/trytond/tests/modelview.py
index 86e02fd..b7c53d7 100644
--- a/trytond/tests/modelview.py
+++ b/trytond/tests/modelview.py
@@ -9,6 +9,7 @@ __all__ = [
     'ModelViewChangedValues',
     'ModelViewChangedValuesTarget',
     'ModelViewButton',
+    'ModelViewRPC',
     ]
 
 
@@ -53,3 +54,55 @@ class ModelViewButton(ModelView):
     @classmethod
     def test_non_decorated(cls, records):
         pass
+
+
+class ModelViewRPC(ModelView):
+    'ModelView RPC'
+    __name__ = 'test.modelview.rpc'
+
+    selection = fields.Selection([('a', 'A')], 'Selection')
+    computed_selection = fields.Selection(
+        'get_selection', 'Computed Selection')
+    function_selection = fields.Function(
+        fields.Selection('get_function_selection', 'Function Selection'),
+        'function_selection_getter')
+
+    reference = fields.Reference('Reference', selection=[('a', 'A')])
+    computed_reference = fields.Reference(
+        'Computed reference', selection='get_reference')
+    function_reference = fields.Function(
+        fields.Reference('Function Reference',
+            selection='get_function_reference'),
+        'function_reference_getter')
+
+    integer = fields.Integer('Integer')
+    float = fields.Float('Float')
+    char = fields.Char('Char')
+
+    @fields.depends('selection')
+    def on_change_with_integer(self):
+        pass
+
+    @fields.depends('reference')
+    def on_change_float(self):
+        pass
+
+    @fields.depends('integer')
+    def autocomplete_char(self):
+        pass
+
+    @classmethod
+    def get_selection(cls):
+        pass
+
+    @classmethod
+    def get_function_selection(cls):
+        pass
+
+    @classmethod
+    def get_reference(cls):
+        pass
+
+    @classmethod
+    def get_function_reference(cls):
+        pass
diff --git a/trytond/tests/multivalue.py b/trytond/tests/multivalue.py
new file mode 100644
index 0000000..45fb386
--- /dev/null
+++ b/trytond/tests/multivalue.py
@@ -0,0 +1,32 @@
+# This file is part of Tryton.  The COPYRIGHT file at the top level of
+# this repository contains the full copyright notices and license terms.
+from trytond.model import ModelSQL, MultiValueMixin, ValueMixin, fields
+from trytond.pool import Pool
+
+
+class ModelMultiValue(ModelSQL, MultiValueMixin):
+    "Model MultiValue"
+    __name__ = 'test.model_multivalue'
+    value = fields.MultiValue(fields.Char("Value"))
+    values = fields.One2Many(
+        'test.model_multivalue.value', 'record', "Values")
+
+    @classmethod
+    def default_value(cls, **pattern):
+        return "default"
+
+
+class ModelValue(ModelSQL, ValueMixin):
+    "Model Value"
+    __name__ = 'test.model_multivalue.value'
+    record = fields.Many2One(
+        'test.model_multivalue', "Record")
+    condition = fields.Char("Condition")
+    value = fields.Char("Value")
+
+
+def register(module):
+    Pool.register(
+        ModelMultiValue,
+        ModelValue,
+        module=module, type_='model')
diff --git a/trytond/tests/test.py b/trytond/tests/test.py
index 68c8b9e..bdbc81f 100644
--- a/trytond/tests/test.py
+++ b/trytond/tests/test.py
@@ -3,7 +3,8 @@
 
 import datetime
 from decimal import Decimal
-from trytond.model import ModelSQL, DictSchemaMixin, fields, Unique
+from trytond.model import (
+    ModelSQL, ModelStorage, DictSchemaMixin, fields, Unique)
 from trytond.pyson import Eval
 
 __all__ = [
@@ -24,6 +25,8 @@ __all__ = [
     'One2ManyReference', 'One2ManyReferenceTarget',
     'One2ManySize', 'One2ManySizeTarget',
     'One2ManySizePYSON', 'One2ManySizePYSONTarget',
+    'One2ManyFilter', 'One2ManyFilterTarget',
+    'One2ManyFilterDomain', 'One2ManyFilterDomainTarget',
     'Many2Many', 'Many2ManyTarget', 'Many2ManyRelation',
     'Many2ManyRequired', 'Many2ManyRequiredTarget',
     'Many2ManyRequiredRelation',
@@ -31,13 +34,16 @@ __all__ = [
     'Many2ManyReferenceRelation',
     'Many2ManySize', 'Many2ManySizeTarget', 'Many2ManySizeRelation',
     'Many2ManyTree', 'Many2ManyTreeRelation',
+    'Many2ManyFilter', 'Many2ManyFilterTarget', 'Many2ManyFilterRelation',
+    'Many2ManyFilterDomain', 'Many2ManyFilterDomainTarget',
+    'Many2ManyFilterDomainRelation',
     'Reference', 'ReferenceTarget', 'ReferenceRequired',
-    'Property',
     'Selection', 'SelectionRequired',
     'DictSchema', 'Dict', 'DictDefault', 'DictRequired',
     'Binary', 'BinaryDefault', 'BinaryRequired', 'BinaryFileStorage',
     'Many2OneDomainValidation', 'Many2OneTarget', 'Many2OneOrderBy',
-    'Many2OneSearch', 'Many2OneTree', 'Many2OneMPTT',
+    'Many2OneSearch', 'Many2OneTree', 'Many2OneMPTT', 'Many2OneNoForeignKey',
+    'Many2OneTargetStorage'
     ]
 
 
@@ -502,6 +508,39 @@ class One2ManySizePYSONTarget(ModelSQL):
     origin = fields.Many2One('test.one2many_size_pyson', 'Origin')
 
 
+class One2ManyFilter(ModelSQL):
+    'One2Many Filter Relation'
+    __name__ = 'test.one2many_filter'
+    targets = fields.One2Many('test.one2many_filter.target', 'origin',
+        'Targets')
+    filtered_targets = fields.One2Many('test.one2many_filter.target', 'origin',
+        'Filtered Targets', filter=[('value', '>', 2)])
+
+
+class One2ManyFilterTarget(ModelSQL):
+    'One2Many Filter Target'
+    __name__ = 'test.one2many_filter.target'
+    origin = fields.Many2One('test.one2many_filter', 'Origin')
+    value = fields.Integer('Value')
+
+
+class One2ManyFilterDomain(ModelSQL):
+    'One2Many Filter Relation'
+    __name__ = 'test.one2many_filter_domain'
+    targets = fields.One2Many('test.one2many_filter_domain.target', 'origin',
+        'Targets', domain=[('value', '<', 10)])
+    filtered_targets = fields.One2Many('test.one2many_filter_domain.target',
+        'origin', 'Filtered Targets', domain=[('value', '<', 10)],
+        filter=[('value', '>', 2)])
+
+
+class One2ManyFilterDomainTarget(ModelSQL):
+    'One2Many Filter Domain Target'
+    __name__ = 'test.one2many_filter_domain.target'
+    origin = fields.Many2One('test.one2many_filter', 'Origin')
+    value = fields.Integer('Value')
+
+
 class Many2Many(ModelSQL):
     'Many2Many'
     __name__ = 'test.many2many'
@@ -605,6 +644,55 @@ class Many2ManyTreeRelation(ModelSQL):
     child = fields.Many2One('test.many2many_tree', 'Child')
 
 
+class Many2ManyFilter(ModelSQL):
+    'Many2Many Filter Relation'
+    __name__ = 'test.many2many_filter'
+    targets = fields.Many2Many('test.many2many_filter.relation', 'origin',
+        'target', 'Targets')
+    filtered_targets = fields.Many2Many('test.many2many_filter.relation',
+        'origin', 'target', 'Targets',
+        filter=[('value', '>', 2)])
+    or_filtered_targets = fields.Many2Many('test.many2many_filter.relation',
+        'origin', 'target', 'Targets',
+        filter=['OR', ('value', '>', 2), ('value', '<', 0)])
+
+
+class Many2ManyFilterTarget(ModelSQL):
+    'Many2Many Filter Target'
+    __name__ = 'test.many2many_filter.target'
+    value = fields.Integer('Value')
+
+
+class Many2ManyFilterRelation(ModelSQL):
+    'Many2Many Filter Relation'
+    __name__ = 'test.many2many_filter.relation'
+    origin = fields.Many2One('test.many2many_filter', 'Origin')
+    target = fields.Many2One('test.many2many_filter.target', 'Target')
+
+
+class Many2ManyFilterDomain(ModelSQL):
+    'Many2Many Filter Domain Relation'
+    __name__ = 'test.many2many_filter_domain'
+    targets = fields.Many2Many('test.many2many_filter_domain.relation',
+        'origin', 'target', 'Targets', domain=[('value', '<', 10)])
+    filtered_targets = fields.Many2Many(
+        'test.many2many_filter_domain.relation', 'origin', 'target', 'Targets',
+        domain=[('value', '<', 10)], filter=[('value', '>', 2)])
+
+
+class Many2ManyFilterDomainTarget(ModelSQL):
+    'Many2Many Filter Domain Target'
+    __name__ = 'test.many2many_filter_domain.target'
+    value = fields.Integer('Value')
+
+
+class Many2ManyFilterDomainRelation(ModelSQL):
+    'Many2Many Filter Domain Relation'
+    __name__ = 'test.many2many_filter_domain.relation'
+    origin = fields.Many2One('test.many2many_filter_domain', 'Origin')
+    target = fields.Many2One('test.many2many_filter.target', 'Target')
+
+
 class Reference(ModelSQL):
     'Reference'
     __name__ = 'test.reference'
@@ -631,20 +719,6 @@ class ReferenceRequired(ModelSQL):
             ], required=True)
 
 
-class Property(ModelSQL):
-    'Property'
-    __name__ = 'test.property'
-    char = fields.Property(fields.Char('Test Char'))
-    many2one = fields.Property(fields.Many2One('test.char',
-            'Test Many2One'))
-    numeric = fields.Property(fields.Numeric('Test Numeric'))
-    selection = fields.Property(fields.Selection([
-                (None, ''),
-                ('option_a', 'Option A'),
-                ('option_b', 'Option B')
-            ], 'Test Selection'))
-
-
 class Selection(ModelSQL):
     'Selection'
     __name__ = 'test.selection'
@@ -794,3 +868,14 @@ class Many2OneMPTT(ModelSQL):
     @classmethod
     def default_right(cls):
         return 0
+
+
+class Many2OneNoForeignKey(ModelSQL):
+    "Many2One No Foreign Key"
+    __name__ = 'test.many2one_no_foreign_key'
+    many2one = fields.Many2One('test.many2one_target_storage', 'many2one')
+
+
+class Many2OneTargetStorage(ModelStorage):
+    "Many2One Target Storage"
+    __name__ = 'test.many2one_target_storage'
diff --git a/trytond/tests/test_field_depends.py b/trytond/tests/test_field_depends.py
new file mode 100644
index 0000000..42f608a
--- /dev/null
+++ b/trytond/tests/test_field_depends.py
@@ -0,0 +1,82 @@
+# 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 unittest
+
+from trytond.model import fields
+
+
+class FieldDependsTestCase(unittest.TestCase):
+    'Test Field Depends'
+
+    def test_empty_depends(self):
+        'Test depends are set if empty'
+
+        class Model(object):
+            @fields.depends('name')
+            def dependant(self):
+                pass
+        record = Model()
+
+        record.dependant()
+
+        self.assertIsNone(record.name)
+
+    def test_set_depends(self):
+        'Test depends are not modified if set'
+
+        class Model(object):
+            @fields.depends('name')
+            def dependant(self):
+                pass
+        record = Model()
+        record.name = "Name"
+
+        record.dependant()
+
+        self.assertEqual(record.name, "Name")
+
+    def test_parent(self):
+        'Test _parent_ depends are set'
+
+        class Model(object):
+            @fields.depends('_parent_parent.name',
+                '_parent_parent.description')
+            def dependant(self):
+                pass
+        parent = Model()
+        parent.description = "Description"
+        record = Model()
+        record.parent = parent
+
+        record.dependant()
+
+        self.assertIsNone(record.parent.name)
+        self.assertEqual(record.parent.description, "Description")
+
+    def test_nested_parent(self):
+        'Test nested _parent_ depends are set'
+
+        class Model(object):
+            @fields.depends('_parent_parent.name',
+                '_parent_parent.description',
+                '_parent_parent._parent_parent.name',
+                '_parent_parent._parent_parent.description',)
+            def dependant(self):
+                pass
+        grantparent = Model()
+        grantparent.description = "Description"
+        parent = Model()
+        parent.parent = grantparent
+        record = Model()
+        record.parent = parent
+
+        record.dependant()
+
+        self.assertIsNone(record.parent.name)
+        self.assertIsNone(record.parent.description)
+        self.assertIsNone(record.parent.parent.name)
+        self.assertEqual(record.parent.parent.description, "Description")
+
+
+def suite():
+    return unittest.TestLoader().loadTestsFromTestCase(FieldDependsTestCase)
diff --git a/trytond/tests/test_fields.py b/trytond/tests/test_fields.py
index a9e291c..8ac755b 100644
--- a/trytond/tests/test_fields.py
+++ b/trytond/tests/test_fields.py
@@ -541,6 +541,16 @@ class FieldsTestCase(unittest.TestCase):
         self.assertEqual(float7.float, 0.123456789012345)
 
     @with_transaction()
+    def test_float_digits_none(self):
+        pool = Pool()
+        FloatDigits = pool.get('test.float_digits')
+        record, = FloatDigits.create([{
+                    'float': 0.123456789012345,
+                    'digits': None,
+                    }])
+        self.assertEqual(record.float, 0.123456789012345)
+
+    @with_transaction()
     def test_float_search_none(self):
         'Test float search with None'
         pool = Pool()
@@ -2478,6 +2488,34 @@ class FieldsTestCase(unittest.TestCase):
                     }])
 
     @with_transaction()
+    def test_one2many_filter(self):
+        'Test one2many with filter'
+        pool = Pool()
+        One2ManyFilter = pool.get('test.one2many_filter')
+
+        filtered, = One2ManyFilter.create([{
+                    'targets': [('create', [
+                                {'value': x} for x in range(4)])],
+                    }])
+        self.assertEqual(len(filtered.targets), 4)
+        filtered_target, = filtered.filtered_targets
+        self.assertEqual(filtered_target.value, 3)
+
+    @with_transaction()
+    def test_one2many_filter_fomain(self):
+        'Test one2many with filter and domain'
+        pool = Pool()
+        One2ManyFilterDomain = pool.get('test.one2many_filter_domain')
+
+        filtered, = One2ManyFilterDomain.create([{
+                    'targets': [('create', [
+                                {'value': x} for x in range(4)])],
+                    }])
+        self.assertEqual(len(filtered.targets), 4)
+        filtered_target, = filtered.filtered_targets
+        self.assertEqual(filtered_target.value, 3)
+
+    @with_transaction()
     def test_many2many(self):
         'Test Many2Many'
         pool = Pool()
@@ -2677,6 +2715,59 @@ class FieldsTestCase(unittest.TestCase):
         transaction.rollback()
 
     @with_transaction()
+    def test_many2many_search_where_nested_value(self):
+        "Test Many2Many search where nested value"
+        pool = Pool()
+        Many2Many = pool.get('test.many2many')
+
+        record, = Many2Many.create([{
+                    'name': 'origin',
+                    'targets': [
+                        ('create', [{
+                                    'name': 'target',
+                                    }]),
+                        ],
+                    }])
+
+        result = Many2Many.search([
+                ('targets', 'where', ['OR',
+                        ('name', '=', 'target'),
+                        ('name', '=', 'other'),
+                        ]),
+                ])
+        self.assertEqual(result, [record])
+
+    @with_transaction()
+    def test_many2many_filter(self):
+        'Test many2many with filter'
+        pool = Pool()
+        Many2ManyFilter = pool.get('test.many2many_filter')
+
+        filtered, = Many2ManyFilter.create([{
+                    'targets': [('create', [
+                                {'value': x} for x in range(4)])],
+                    }])
+        self.assertEqual(len(filtered.targets), 4)
+        filtered_target, = filtered.filtered_targets
+        self.assertEqual(filtered_target.value, 3)
+        or_filtered_target, = filtered.or_filtered_targets
+        self.assertEqual(or_filtered_target.value, 3)
+
+    @with_transaction()
+    def test_many2many_filter_domain(self):
+        'Test many2many with filter and domain'
+        pool = Pool()
+        Many2ManyFilterDomain = pool.get('test.many2many_filter_domain')
+
+        filtered, = Many2ManyFilterDomain.create([{
+                    'targets': [('create', [
+                                {'value': x} for x in range(4)])],
+                    }])
+        self.assertEqual(len(filtered.targets), 4)
+        filtered_target, = filtered.filtered_targets
+        self.assertEqual(filtered_target.value, 3)
+
+    @with_transaction()
     def test_many2many_add_to_list(self):
         "Test Many2Many add to list of records"
         pool = Pool()
@@ -2871,6 +2962,18 @@ class FieldsTestCase(unittest.TestCase):
         self.assertEqual(reference2.reference, None)
 
         Reference.write([reference2], {
+                'reference': 'test.reference.target,',
+                })
+        self.assertEqual(reference2.reference, 'test.reference.target,')
+        self.assertFalse(isinstance(reference2.reference, ReferenceTarget))
+
+        Reference.write([reference2], {
+                'reference': 'test.reference.target,-1',
+                })
+        self.assertEqual(reference2.reference, 'test.reference.target,-1')
+        self.assertFalse(isinstance(reference2.reference, ReferenceTarget))
+
+        Reference.write([reference2], {
                 'reference': ('test.reference.target', target2.id),
                 })
         self.assertEqual(reference2.reference, target2)
@@ -2897,276 +3000,6 @@ class FieldsTestCase(unittest.TestCase):
         self.assert_(reference4)
 
     @with_transaction()
-    def test_property(self):
-        'Test Property with supported field types'
-        pool = Pool()
-        Property = pool.get('test.property')
-        IrProperty = pool.get('ir.property')
-        ModelField = pool.get('ir.model.field')
-        Char = pool.get('test.char')
-        transaction = Transaction()
-
-        # Test Char
-        prop_a, = Property.create([{'char': 'Test'}])
-        self.assert_(prop_a)
-        self.assertEqual(prop_a.char, 'Test')
-
-        prop_b, = Property.create([{}])
-        self.assert_(prop_b)
-        self.assertEqual(prop_b.char, None)
-
-        prop_c, = Property.create([{'char': 'FooBar'}])
-        self.assert_(prop_c)
-        self.assertEqual(prop_c.char, 'FooBar')
-
-        props = Property.search([('char', '=', 'Test')])
-        self.assertEqual(props, [prop_a])
-
-        props = Property.search([('char', '=', None)])
-        self.assertEqual(props, [prop_b])
-
-        props = Property.search([('char', '!=', None)])
-        self.assertEqual(props, [prop_a, prop_c])
-
-        props = Property.search([('char', 'like', 'Tes%')])
-        self.assertEqual(props, [prop_a])
-
-        props = Property.search([('char', 'like', '%Bar')])
-        self.assertEqual(props, [prop_c])
-
-        props = Property.search([('char', 'not like', 'Tes%')])
-        self.assertEqual(props, [prop_b, prop_c])
-
-        props = Property.search([('char', 'ilike', 'tes%')])
-        self.assert_(props, [prop_a])
-
-        props = Property.search([('char', 'ilike', '%bar')])
-        self.assertEqual(props, [prop_c])
-
-        props = Property.search([('char', 'not ilike', 'tes%')])
-        self.assertEqual(props, [prop_b, prop_c])
-
-        props = Property.search([('char', 'in', ['Test'])])
-        self.assertEqual(props, [prop_a])
-
-        props = Property.search([
-                ('char', 'in', ['Test', 'FooBar'])])
-        self.assertEqual(props, [prop_a, prop_c])
-
-        props = Property.search([
-                ('char', 'not in', ['Test', 'FooBar'])])
-        self.assertEqual(props, [prop_b])
-
-        # Test default value
-        property_field, = ModelField.search([
-                ('model.model', '=', 'test.property'),
-                ('name', '=', 'char'),
-                ], limit=1)
-        IrProperty.create([{
-                    'field': property_field.id,
-                    'value': ',DEFAULT_VALUE',
-                    }])
-
-        prop_d, = Property.create([{}])
-        self.assert_(prop_d)
-        self.assertEqual(prop_d.char, 'DEFAULT_VALUE')
-
-        props = Property.search([('char', '!=', None)])
-        self.assertEqual(props, [prop_a, prop_c, prop_d])
-
-        Property.write([prop_a], {'char': None})
-        self.assertEqual(prop_a.char, None)
-
-        Property.write([prop_b], {'char': 'Test'})
-        self.assertEqual(prop_b.char, 'Test')
-
-        transaction.rollback()
-
-        # Test Many2One
-        char_a, = Char.create([{'char': 'Test'}])
-        self.assert_(char_a)
-
-        char_b, = Char.create([{'char': 'FooBar'}])
-        self.assert_(char_b)
-
-        prop_a, = Property.create([{'many2one': char_a.id}])
-        self.assert_(prop_a)
-        self.assertEqual(prop_a.many2one, char_a)
-
-        prop_b, = Property.create([{'many2one': char_b.id}])
-        self.assert_(prop_b)
-        self.assertEqual(prop_b.many2one, char_b)
-
-        prop_c, = Property.create([{}])
-        self.assert_(prop_c)
-        self.assertEqual(prop_c.many2one, None)
-
-        props = Property.search([('many2one', '=', char_a.id)])
-        self.assertEqual(props, [prop_a])
-
-        props = Property.search([('many2one', '!=', None)])
-        self.assertEqual(props, [prop_a, prop_b])
-
-        props = Property.search([('many2one', '=', None)])
-        self.assertEqual(props, [prop_c])
-
-        self.assertEqual(prop_a.many2one, char_a)
-
-        props = Property.search([
-                ('many2one', 'in', [char_a.id, char_b.id])])
-        self.assertEqual(props, [prop_a, prop_b])
-
-        props = Property.search([
-                ('many2one', 'not in', [char_a.id, char_b.id])])
-        self.assertEqual(props, [prop_c])
-
-        Property.write([prop_b], {'many2one': char_a.id})
-        self.assertEqual(prop_b.many2one, char_a)
-
-        transaction.rollback()
-
-        # Test Numeric
-        prop_a, = Property.create([{'numeric': Decimal('1.1')}])
-        self.assert_(prop_a)
-        self.assertEqual(prop_a.numeric, Decimal('1.1'))
-
-        prop_b, = Property.create([{'numeric': Decimal('2.6')}])
-        self.assert_(prop_b)
-        self.assertEqual(prop_b.numeric, Decimal('2.6'))
-
-        prop_c, = Property.create([{}])
-        self.assert_(prop_c)
-        self.assertEqual(prop_c.numeric, None)
-
-        props = Property.search([('numeric', '!=', None)])
-        self.assertEqual(props, [prop_a, prop_b])
-
-        props = Property.search([('numeric', '=', None)])
-        self.assertEqual(props, [prop_c])
-
-        props = Property.search([
-                ('numeric', '=', Decimal('1.1')),
-                ])
-        self.assertEqual(props, [prop_a])
-
-        props = Property.search([
-                ('numeric', '!=', Decimal('1.1'))])
-        self.assertEqual(props, [prop_b, prop_c])
-
-        props = Property.search([
-                ('numeric', '<', Decimal('2.6')),
-                ])
-        self.assertEqual(props, [prop_a])
-
-        props = Property.search([
-                ('numeric', '<=', Decimal('2.6'))])
-        self.assertEqual(props, [prop_a, prop_b])
-
-        props = Property.search([
-                ('numeric', '>', Decimal('1.1')),
-                ])
-        self.assertEqual(props, [prop_b])
-
-        props = Property.search([
-                ('numeric', '>=', Decimal('1.1'))])
-        self.assertEqual(props, [prop_a, prop_b])
-
-        props = Property.search([
-                ('numeric', 'in', [Decimal('1.1')])])
-        self.assertEqual(props, [prop_a])
-
-        props = Property.search([
-                ('numeric', 'in', [Decimal('1.1'), Decimal('2.6')])])
-        self.assertEqual(props, [prop_a, prop_b])
-
-        props = Property.search([
-                ('numeric', 'not in', [Decimal('1.1')])])
-        self.assertEqual(props, [prop_b, prop_c])
-
-        props = Property.search([
-                ('numeric', 'not in', [Decimal('1.1'), Decimal('2.6')])])
-        self.assertEqual(props, [prop_c])
-
-        # Test default value
-        property_field, = ModelField.search([
-                ('model.model', '=', 'test.property'),
-                ('name', '=', 'numeric'),
-                ], limit=1)
-        IrProperty.create([{
-                    'field': property_field.id,
-                    'value': ',3.7',
-                    }])
-
-        prop_d, = Property.create([{}])
-        self.assert_(prop_d)
-        self.assertEqual(prop_d.numeric, Decimal('3.7'))
-
-        Property.write([prop_a], {'numeric': None})
-        self.assertEqual(prop_a.numeric, None)
-
-        Property.write([prop_b], {'numeric': Decimal('3.11')})
-        self.assertEqual(prop_b.numeric, Decimal('3.11'))
-
-        transaction.rollback()
-
-        # Test Selection
-        prop_a, = Property.create([{'selection': 'option_a'}])
-        self.assert_(prop_a)
-        self.assertEqual(prop_a.selection, 'option_a')
-
-        prop_b, = Property.create([{'selection': 'option_b'}])
-        self.assert_(prop_b)
-        self.assertEqual(prop_b.selection, 'option_b')
-
-        prop_c, = Property.create([{}])
-        self.assert_(prop_c)
-        self.assertEqual(prop_c.selection, None)
-
-        props = Property.search([('selection', '=', 'option_a')])
-        self.assertEqual(props, [prop_a])
-
-        props = Property.search([('selection', '!=', None)])
-        self.assertEqual(props, [prop_a, prop_b])
-
-        props = Property.search([('selection', '=', None)])
-        self.assertEqual(props, [prop_c])
-
-        props = Property.search([('selection', '!=', 'option_a')])
-        self.assertEqual(props, [prop_b, prop_c])
-
-        props = Property.search([
-                ('selection', 'in', ['option_a'])])
-        self.assertEqual(props, [prop_a])
-
-        props = Property.search([
-                ('selection', 'in', ['option_a', 'option_b'])])
-        self.assertEqual(props, [prop_a, prop_b])
-
-        props = Property.search([
-                ('selection', 'not in', ['option_a'])])
-        self.assertEqual(props, [prop_b, prop_c])
-
-        # Test default value
-        property_field, = ModelField.search([
-                ('model.model', '=', 'test.property'),
-                ('name', '=', 'selection'),
-                ], limit=1)
-        IrProperty.create([{
-                    'field': property_field.id,
-                    'value': ',option_a',
-                    }])
-
-        prop_d, = Property.create([{}])
-        self.assert_(prop_d)
-        self.assertEqual(prop_d.selection, 'option_a')
-
-        Property.write([prop_a], {'selection': None})
-        self.assertEqual(prop_a.selection, None)
-
-        Property.write([prop_c], {'selection': 'option_b'})
-        self.assertEqual(prop_c.selection, 'option_b')
-
-    @with_transaction()
     def test_selection(self):
         'Test Selection'
         pool = Pool()
@@ -3485,6 +3318,18 @@ class FieldsTestCase(unittest.TestCase):
             transaction.rollback()
 
     @with_transaction()
+    def test_many2one_no_foreign_key(self):
+        "Test Many2One without Foreign Key"
+        pool = Pool()
+        Many2OneNoForeignKey = pool.get('test.many2one_no_foreign_key')
+        Many2OneTargetStorage = pool.get('test.many2one_target_storage')
+
+        record = Many2OneNoForeignKey(many2one=1)
+        record.save()
+
+        self.assertIsInstance(record.many2one, Many2OneTargetStorage)
+
+    @with_transaction()
     def test_timedelta(self):
         'Test timedelta'
         pool = Pool()
diff --git a/trytond/tests/test_history.py b/trytond/tests/test_history.py
index 2970f77..7b3c013 100644
--- a/trytond/tests/test_history.py
+++ b/trytond/tests/test_history.py
@@ -21,12 +21,14 @@ class HistoryTestCase(unittest.TestCase):
     def tearDown(self):
         pool = Pool()
         History = pool.get('test.history')
+        HistoryLine = pool.get('test.history.line')
         transaction = Transaction()
         cursor = transaction.connection.cursor()
-        table = History.__table__()
-        history_table = History.__table_history__()
-        cursor.execute(*table.delete())
-        cursor.execute(*history_table.delete())
+        for Model in [History, HistoryLine]:
+            table = Model.__table__()
+            history_table = Model.__table_history__()
+            cursor.execute(*table.delete())
+            cursor.execute(*history_table.delete())
         transaction.commit()
 
     @with_transaction()
@@ -344,6 +346,40 @@ class HistoryTestCase(unittest.TestCase):
             transaction.rollback()
 
     @with_transaction()
+    def test_ordered_search_nested(self):
+        "Test ordered search nested"
+        pool = Pool()
+        History = pool.get('test.history')
+        HistoryLine = pool.get('test.history.line')
+        transaction = Transaction()
+        order = [('history.value', 'ASC')]
+
+        history = History(value=1)
+        history.save()
+        history2 = History(value=2)
+        history2.save()
+        line = HistoryLine(history=history)
+        line.save()
+        line2 = HistoryLine(history=history2)
+        line2.save()
+        first_stamp = line2.create_date
+        transaction.commit()
+
+        history.value = 3
+        history.save()
+        second_stamp = history.write_date
+        transaction.commit()
+
+        results = [
+            (first_stamp, [line, line2]),
+            (second_stamp, [line2, line]),
+            ]
+        for timestamp, instances in results:
+            with Transaction().set_context(_datetime=timestamp):
+                records = HistoryLine.search([], order=order)
+                self.assertListEqual(records, instances)
+
+    @with_transaction()
     def test_browse(self):
         'Test browsing history'
         pool = Pool()
diff --git a/trytond/tests/test_model.py b/trytond/tests/test_model.py
index e5cabd4..cb14698 100644
--- a/trytond/tests/test_model.py
+++ b/trytond/tests/test_model.py
@@ -28,6 +28,34 @@ class ModelTestCase(unittest.TestCase):
         self.assertEqual(
             repr(record), "Pool().get('test.model')(%s)" % record.id)
 
+    @with_transaction()
+    def test_init_parent(self):
+        "Test __init__ with _parent_"
+        pool = Pool()
+        Model = pool.get('test.model_child')
+
+        values = {
+            '_parent_parent.name': "Test",
+            }
+        record = Model(**values)
+
+        self.assertEqual(record.parent.name, "Test")
+
+    @with_transaction()
+    def test_init_parent_parent(self):
+        "Test __init__ with _parent_._parent_"
+        pool = Pool()
+        Model = pool.get('test.model_child_child')
+
+        values = {
+            '_parent_parent.name': "Test 1",
+            '_parent_parent._parent_parent.name': "Test 2",
+            }
+        record = Model(**values)
+
+        self.assertEqual(record.parent.name, "Test 1")
+        self.assertEqual(record.parent.parent.name, "Test 2")
+
 
 def suite():
     return unittest.TestLoader().loadTestsFromTestCase(ModelTestCase)
diff --git a/trytond/tests/test_modelsql.py b/trytond/tests/test_modelsql.py
index 22337f2..cf19a20 100644
--- a/trytond/tests/test_modelsql.py
+++ b/trytond/tests/test_modelsql.py
@@ -133,6 +133,32 @@ class ModelSQLTestCase(unittest.TestCase):
             TargetModel.name.string, TargetModel.__doc__)
         self.assertEqual(err.message, msg)
 
+    @with_transaction()
+    def test_null_ordering(self):
+        'Test NULL ordering'
+        pool = Pool()
+        NullOrder = pool.get('test.null_order')
+
+        NullOrder.create([{
+                    'integer': 1,
+                    }, {
+                    'integer': 3,
+                    }, {
+                    'integer': None,
+                    }])
+        integers = NullOrder.search([], order=[('integer', 'ASC NULLS FIRST')])
+        self.assertListEqual([i.integer for i in integers], [None, 1, 3])
+
+        integers = NullOrder.search(
+            [], order=[('integer', 'DESC NULLS FIRST')])
+        self.assertListEqual([i.integer for i in integers], [None, 3, 1])
+
+        integers = NullOrder.search([], order=[('integer', 'ASC NULLS LAST')])
+        self.assertListEqual([i.integer for i in integers], [1, 3, None])
+
+        integers = NullOrder.search([], order=[('integer', 'DESC NULLS LAST')])
+        self.assertListEqual([i.integer for i in integers], [3, 1, None])
+
 
 def suite():
     return unittest.TestLoader().loadTestsFromTestCase(ModelSQLTestCase)
diff --git a/trytond/tests/test_modelstorage.py b/trytond/tests/test_modelstorage.py
index cb147ea..d5516f0 100644
--- a/trytond/tests/test_modelstorage.py
+++ b/trytond/tests/test_modelstorage.py
@@ -95,6 +95,34 @@ class ModelStorageTestCase(unittest.TestCase):
         self.assertEqual(foo.name, 'foo')
         self.assertIsNone(bar.name)
 
+    @with_transaction(context={'_check_access': True})
+    def test_model_translations(self):
+        'Test any user can translate fields and duplicate its records'
+        pool = Pool()
+        Transalatable = pool.get('test.char_translate')
+        Lang = pool.get('ir.lang')
+        User = pool.get('res.user')
+        lang, = Lang.search([
+                ('translatable', '=', False),
+                ('code', '!=', 'en'),
+                ], limit=1)
+        lang.translatable = True
+        lang.save()
+
+        user = User(login='test')
+        user.save()
+        with Transaction().set_user(user.id):
+            record = Transalatable(char='foo')
+            record.save()
+            with Transaction().set_context(lang=lang.code):
+                record = Transalatable(record.id)
+                record.char = 'bar'
+                record.save()
+                # Test we can copy and translations are copied
+                copied_record, = Transalatable.copy([record])
+                copied_record = Transalatable(copied_record.id)
+                self.assertEqual(copied_record.char, 'bar')
+
 
 def suite():
     return unittest.TestLoader().loadTestsFromTestCase(ModelStorageTestCase)
diff --git a/trytond/tests/test_modelview.py b/trytond/tests/test_modelview.py
index 91e224a..4a7ac0a 100644
--- a/trytond/tests/test_modelview.py
+++ b/trytond/tests/test_modelview.py
@@ -269,6 +269,34 @@ class ModelView(unittest.TestCase):
         clicks = [ButtonClick(user=user1), ButtonClick(user=user2)]
         self.assertTrue(rule.test(record, clicks))
 
+    @with_transaction()
+    def test_rpc_setup(self):
+        "Testing the computation of the RPC methods"
+        pool = Pool()
+        TestModel = pool.get('test.modelview.rpc')
+
+        def check_rpc(rpc, attributes):
+            for key, value in attributes.items():
+                self.assertEqual(getattr(rpc, key), value)
+
+        NO_INSTANTIATION = {
+            'instantiate': None,
+            }
+        INSTANTIATE_FIRST = {
+            'instantiate': 0,
+            }
+        for rpc_name, rpc_attrs in [
+                ('get_selection', NO_INSTANTIATION),
+                ('get_function_selection', NO_INSTANTIATION),
+                ('get_reference', NO_INSTANTIATION),
+                ('get_function_reference', NO_INSTANTIATION),
+                ('on_change_with_integer', INSTANTIATE_FIRST),
+                ('on_change_float', INSTANTIATE_FIRST),
+                ('autocomplete_char', INSTANTIATE_FIRST),
+                ]:
+            self.assertIn(rpc_name, TestModel.__rpc__)
+            check_rpc(TestModel.__rpc__[rpc_name], rpc_attrs)
+
 
 def suite():
     func = unittest.TestLoader().loadTestsFromTestCase
diff --git a/trytond/tests/test_multivalue.py b/trytond/tests/test_multivalue.py
new file mode 100644
index 0000000..8893f1a
--- /dev/null
+++ b/trytond/tests/test_multivalue.py
@@ -0,0 +1,115 @@
+# 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 unittest
+
+from trytond.tests.test_tryton import activate_module, with_transaction
+from trytond.pool import Pool
+
+
+class MultiValueTestCase(unittest.TestCase):
+    "Test MultiValue"
+
+    @classmethod
+    def setUpClass(cls):
+        activate_module('tests')
+
+    @with_transaction()
+    def test_get_multivalue(self):
+        "Test get_multivalue"
+        pool = Pool()
+        ModelMultiValue = pool.get('test.model_multivalue')
+        ModelValue = pool.get('test.model_multivalue.value')
+
+        record = ModelMultiValue()
+        record.save()
+        value, = ModelValue.search([])
+        value.condition = "foo"
+        value.value = "bar"
+        value.save()
+
+        self.assertEqual(
+            record.get_multivalue('value', condition="foo"),
+            "bar")
+
+    @with_transaction()
+    def test_get_multivalue_default(self):
+        "Test get_multivalue default value"
+        pool = Pool()
+        ModelMultiValue = pool.get('test.model_multivalue')
+
+        record = ModelMultiValue()
+        record.save()
+
+        self.assertEqual(record.get_multivalue('value'), "default")
+
+    @with_transaction()
+    def test_get_multivalue_match_none(self):
+        "Test get_multivalue does not match None"
+        pool = Pool()
+        ModelMultiValue = pool.get('test.model_multivalue')
+        ModelValue = pool.get('test.model_multivalue.value')
+
+        record = ModelMultiValue()
+        record.save()
+        value = ModelValue(record=record, condition="foo", value="bar")
+        value.save()
+
+        self.assertEqual(
+            record.get_multivalue('value', condition="test"),
+            "default")
+
+    @with_transaction()
+    def test_set_multivalue(self):
+        "Test set_multivalue"
+        pool = Pool()
+        ModelMultiValue = pool.get('test.model_multivalue')
+        ModelValue = pool.get('test.model_multivalue.value')
+
+        record = ModelMultiValue()
+        record.save()
+        record.set_multivalue('value', "set", condition="test")
+
+        value, = ModelValue.search([('condition', '=', "test")])
+        self.assertEqual(value.record, record)
+        self.assertEqual(value.value, "set")
+
+    @with_transaction()
+    def test_set_multivalue_match_none(self):
+        "Test set_multivalue matches None"
+        pool = Pool()
+        ModelMultiValue = pool.get('test.model_multivalue')
+        ModelValue = pool.get('test.model_multivalue.value')
+
+        record = ModelMultiValue()
+        record.save()
+        record.set_multivalue('value', "set", condition="test")
+
+        self.assertEqual(len(ModelValue.search([])), 2)
+
+    @with_transaction()
+    def test_mutlivalue_setter(self):
+        "Test multivalue setter"
+        pool = Pool()
+        ModelMultiValue = pool.get('test.model_multivalue')
+
+        record, = ModelMultiValue.create([{
+                    'value': "setter",
+                    }])
+
+        self.assertEqual(record.get_multivalue('value'), "setter")
+
+    @with_transaction()
+    def test_mutlivalue_getter(self):
+        "Test multivalue getter"
+        pool = Pool()
+        ModelMultiValue = pool.get('test.model_multivalue')
+
+        record = ModelMultiValue(value="getter")
+        record.save()
+
+        read, = ModelMultiValue.read([record.id], ['value'])
+        self.assertEqual(read['value'], "getter")
+
+
+def suite():
+    return unittest.TestLoader().loadTestsFromTestCase(MultiValueTestCase)
diff --git a/trytond/tests/test_sequence.py b/trytond/tests/test_sequence.py
index e73aef7..9091cd1 100644
--- a/trytond/tests/test_sequence.py
+++ b/trytond/tests/test_sequence.py
@@ -16,11 +16,15 @@ class SequenceTestCase(unittest.TestCase):
     def setUpClass(cls):
         activate_module('tests')
 
+    @staticmethod
+    def get_model():
+        pool = Pool()
+        return pool.get('ir.sequence')
+
     @with_transaction()
     def test_incremental(self):
         'Test incremental'
-        pool = Pool()
-        Sequence = pool.get('ir.sequence')
+        Sequence = self.get_model()
 
         sequence, = Sequence.create([{
                     'name': 'Test incremental',
@@ -48,8 +52,7 @@ class SequenceTestCase(unittest.TestCase):
     @with_transaction()
     def test_decimal_timestamp(self):
         'Test Decimal Timestamp'
-        pool = Pool()
-        Sequence = pool.get('ir.sequence')
+        Sequence = self.get_model()
 
         sequence, = Sequence.create([{
                     'name': 'Test decimal timestamp',
@@ -73,8 +76,7 @@ class SequenceTestCase(unittest.TestCase):
     @with_transaction()
     def test_hexadecimal_timestamp(self):
         'Test Hexadecimal Timestamp'
-        pool = Pool()
-        Sequence = pool.get('ir.sequence')
+        Sequence = self.get_model()
 
         sequence, = Sequence.create([{
                     'name': 'Test hexadecimal timestamp',
@@ -99,8 +101,7 @@ class SequenceTestCase(unittest.TestCase):
     @with_transaction()
     def test_prefix_suffix(self):
         'Test prefix/suffix'
-        pool = Pool()
-        Sequence = pool.get('ir.sequence')
+        Sequence = self.get_model()
 
         sequence, = Sequence.create([{
                     'name': 'Test incremental',
@@ -121,5 +122,19 @@ class SequenceTestCase(unittest.TestCase):
                 '2010-08-15/2/15.08.2010')
 
 
+class SequenceStrictTestCase(SequenceTestCase):
+    "Test Sequence Strict"
+
+    @staticmethod
+    def get_model():
+        pool = Pool()
+        return pool.get('ir.sequence.strict')
+
+
 def suite():
-    return unittest.TestLoader().loadTestsFromTestCase(SequenceTestCase)
+    suite_ = unittest.TestSuite()
+    suite_.addTests(unittest.TestLoader().loadTestsFromTestCase(
+            SequenceTestCase))
+    suite_.addTests(unittest.TestLoader().loadTestsFromTestCase(
+            SequenceStrictTestCase))
+    return suite_
diff --git a/trytond/tests/test_tools.py b/trytond/tests/test_tools.py
index d1f574f..4271c0b 100644
--- a/trytond/tests/test_tools.py
+++ b/trytond/tests/test_tools.py
@@ -65,6 +65,12 @@ class ToolsTestCase(unittest.TestCase):
             '%Y-%m-%d'), '2005-03-02')
         self.assert_(datetime_strftime(datetime.date(1805, 3, 2),
             '%Y-%m-%d'), '1805-03-02')
+        self.assert_(datetime_strftime(datetime.datetime(2005, 3, 2, 0, 0, 0),
+            '%Y-%m-%d'), '2005-03-02')
+        with self.assertRaises(TypeError):
+            datetime_strftime(None, '%Y-%m-%d')
+        with self.assertRaises(TypeError):
+            datetime_strftime(2, '%Y-%m-%d')
 
     def test_reduce_domain(self):
         'Test reduce_domain'
diff --git a/trytond/tests/test_tryton.py b/trytond/tests/test_tryton.py
index fa11f22..ff6f90b 100644
--- a/trytond/tests/test_tryton.py
+++ b/trytond/tests/test_tryton.py
@@ -22,8 +22,10 @@ from trytond.tools import is_instance_method
 from trytond.transaction import Transaction
 from trytond.cache import Cache
 from trytond.config import config, parse_uri
+from trytond.wizard import StateView, StateAction
+from trytond.pyson import PYSONDecoder
 
-__all__ = ['POOL', 'DB_NAME', 'USER', 'CONTEXT',
+__all__ = ['DB_NAME', 'USER', 'CONTEXT',
     'activate_module', 'ModuleTestCase', 'with_transaction',
     'doctest_setup', 'doctest_teardown', 'doctest_checker',
     'suite', 'all_suite', 'modules_suite']
@@ -33,9 +35,7 @@ USER = 1
 CONTEXT = {}
 DB_NAME = os.environ['DB_NAME']
 DB_CACHE = os.environ.get('DB_CACHE')
-DB = backend.get('Database')(DB_NAME)
 Pool.test = True
-POOL = Pool(DB_NAME)
 
 
 def activate_module(name):
@@ -46,7 +46,8 @@ def activate_module(name):
         return
     create_db()
     with Transaction().start(DB_NAME, 1) as transaction:
-        Module = POOL.get('ir.module')
+        pool = Pool()
+        Module = pool.get('ir.module')
 
         modules = Module.search([
                 ('name', '=', name),
@@ -62,7 +63,7 @@ def activate_module(name):
             Module.activate(modules)
             transaction.commit()
 
-            ActivateUpgrade = POOL.get('ir.module.activate_upgrade',
+            ActivateUpgrade = pool.get('ir.module.activate_upgrade',
                 type='wizard')
             instance_id, _, _ = ActivateUpgrade.create()
             transaction.commit()
@@ -83,7 +84,7 @@ def restore_db_cache(name):
             elif backend_name == 'postgresql':
                 result = _pg_restore(cache_file)
     if result:
-        POOL.init()
+        Pool(DB_NAME).init()
     return result
 
 
@@ -111,7 +112,7 @@ def _sqlite_copy(file_, restore=False):
         return False
     import sqlite3 as sqlite
 
-    with Transaction().start(DB_NAME, 0) as transaction, \
+    with Transaction().start(DB_NAME, 0, _nocache=True) as transaction, \
             sqlite.connect(file_) as conn2:
         conn1 = transaction.connection
         # sqlitebck does not work with pysqlite2
@@ -139,7 +140,8 @@ def _pg_options():
 
 
 def _pg_restore(cache_file):
-    with Transaction().start(None, 0, close=True, autocommit=True) \
+    with Transaction().start(
+            None, 0, close=True, autocommit=True, _nocache=True) \
             as transaction:
         transaction.database.create(transaction.connection, DB_NAME)
     cmd = ['pg_restore', '-d', DB_NAME]
@@ -203,7 +205,8 @@ class ModuleTestCase(unittest.TestCase):
     @with_transaction()
     def test_view(self):
         'Test validity of all views of the module'
-        View = POOL.get('ir.ui.view')
+        pool = Pool()
+        View = pool.get('ir.ui.view')
         views = View.search([
                 ('module', '=', self.module),
                 ('model', '!=', ''),
@@ -214,7 +217,7 @@ class ModuleTestCase(unittest.TestCase):
             else:
                 view_id = view.id
             model = view.model
-            Model = POOL.get(model)
+            Model = pool.get(model)
             res = Model.fields_view_get(view_id)
             assert res['model'] == model
             tree = etree.fromstring(res['arch'])
@@ -260,6 +263,8 @@ class ModuleTestCase(unittest.TestCase):
                     fields |= get_eval_fields(field.digits)
                 if hasattr(field, 'add_remove'):
                     fields |= get_eval_fields(field.add_remove)
+                if hasattr(field, 'size'):
+                    fields |= get_eval_fields(field.size)
                 fields.discard(fname)
                 fields.discard('context')
                 fields.discard('_user')
@@ -383,6 +388,82 @@ class ModuleTestCase(unittest.TestCase):
                     'model': model.__name__,
                     })
 
+    @with_transaction()
+    def test_wizards(self):
+        'Test wizards are correctly defined'
+        for wizard_name, wizard in Pool().iterobject(type='wizard'):
+            if not isregisteredby(wizard, self.module, type_='wizard'):
+                continue
+            session_id, start_state, _ = wizard.create()
+            assert start_state in wizard.states, ('Unknown start state '
+                '"%(state)s" on wizard "%(wizard)s"' % {
+                    'state': start_state,
+                    'wizard': wizard_name,
+                    })
+            wizard_instance = wizard(session_id)
+            for state_name, state in wizard_instance.states.iteritems():
+                if isinstance(state, StateView):
+                    # Don't test defaults as they may depend on context
+                    state.get_view(wizard_instance, state_name)
+                    state.get_buttons(wizard_instance, state_name)
+                if isinstance(state, StateAction):
+                    state.get_action()
+
+    @with_transaction()
+    def test_selection_fields(self):
+        'Test selection values'
+        for mname, model in Pool().iterobject():
+            if not isregisteredby(model, self.module):
+                continue
+            for field_name, field in model._fields.iteritems():
+                selection = getattr(field, 'selection', None)
+                if selection is None:
+                    continue
+                selection_values = field.selection
+                if not isinstance(selection_values, (tuple, list)):
+                    sel_func = getattr(model, field.selection)
+                    if not is_instance_method(model, field.selection):
+                        selection_values = sel_func()
+                    else:
+                        record = model()
+                        selection_values = sel_func(record)
+                assert all(len(v) == 2 for v in selection_values), (
+                    'Invalid selection values "%(values)s" on field '
+                    '"%(field)s" of model "%(model)s"' % {
+                        'values': selection_values,
+                        'field': field_name,
+                        'model': model.__name__,
+                        })
+
+    @with_transaction()
+    def test_ir_action_window(self):
+        'Test action windows are correctly defined'
+        pool = Pool()
+        ModelData = pool.get('ir.model.data')
+        ActionWindow = pool.get('ir.action.act_window')
+        for model_data in ModelData.search([
+                    ('module', '=', self.module),
+                    ('model', '=', 'ir.action.act_window'),
+                    ]):
+            action_window = ActionWindow(model_data.db_id)
+            if not action_window.res_model:
+                continue
+            Model = pool.get(action_window.res_model)
+            decoder = PYSONDecoder({
+                    'active_id': None,
+                    'active_ids': [],
+                    'active_model': action_window.res_model,
+                    })
+            domain = decoder.decode(action_window.pyson_domain)
+            order = decoder.decode(action_window.pyson_order)
+            context = decoder.decode(action_window.pyson_context)
+            with Transaction().set_context(context):
+                Model.search(domain, order=order, limit=action_window.limit)
+            for action_domain in action_window.act_window_domains:
+                if not action_domain.domain:
+                    continue
+                Model.search(decoder.decode(action_domain.domain))
+
 
 def db_exist(name=DB_NAME):
     Database = backend.get('Database')
@@ -393,11 +474,12 @@ def db_exist(name=DB_NAME):
 def create_db(name=DB_NAME, lang='en'):
     Database = backend.get('Database')
     if not db_exist(name):
-        with Transaction().start(None, 0, close=True, autocommit=True) \
+        with Transaction().start(
+                None, 0, close=True, autocommit=True, _nocache=True) \
                 as transaction:
             transaction.database.create(transaction.connection, name)
 
-        with Transaction().start(name, 0) as transaction,\
+        with Transaction().start(name, 0, _nocache=True) as transaction,\
                 transaction.connection.cursor() as cursor:
             Database(name).init()
             ir_configuration = Table('ir_configuration')
@@ -426,7 +508,8 @@ def drop_db(name=DB_NAME):
         database = Database(name)
         database.close()
 
-        with Transaction().start(None, 0, close=True, autocommit=True) \
+        with Transaction().start(
+                None, 0, close=True, autocommit=True, _nocache=True) \
                 as transaction:
             database.drop(transaction.connection, name)
             Pool.stop(name)
diff --git a/trytond/tests/test_user.py b/trytond/tests/test_user.py
index 110f622..2a76ac7 100644
--- a/trytond/tests/test_user.py
+++ b/trytond/tests/test_user.py
@@ -1,11 +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.
-
+import os
 import unittest
 from trytond.tests.test_tryton import activate_module, with_transaction
 from trytond.pool import Pool
 from trytond.res.user import bcrypt
 from trytond.config import config
+from trytond.error import UserError
 
 
 class UserTestCase(unittest.TestCase):
@@ -20,6 +21,20 @@ class UserTestCase(unittest.TestCase):
         config.set('session', 'authentications', 'password')
         self.addCleanup(config.set, 'session', 'authentications', methods)
 
+        length = config.get('password', 'length')
+        config.set('password', 'length', 4)
+        self.addCleanup(config.set, 'password', 'length', length)
+
+        forbidden = config.get('password', 'forbidden', default='')
+        config.set(
+            'password', 'forbidden',
+            os.path.join(os.path.dirname(__file__), 'forbidden.txt'))
+        self.addCleanup(config.set, 'password', 'forbidden', forbidden)
+
+        entropy = config.get('password', 'entropy')
+        config.set('password', 'entropy', 0.9)
+        self.addCleanup(config.set, 'password', 'entropy', entropy)
+
     def create_user(self, login, password, hash_method=None):
         pool = Pool()
         User = pool.get('res.user')
@@ -79,6 +94,64 @@ class UserTestCase(unittest.TestCase):
         user = self.create_user('user', '12345')
         self.assertIsNone(user.password_hash)
 
+    @with_transaction()
+    def test_validate_password_length(self):
+        "Test validate password length"
+        pool = Pool()
+        User = pool.get('res.user')
+
+        with self.assertRaises(UserError):
+            User.validate_password(u'123', [])
+        User.validate_password(u'1234', [])
+
+    @with_transaction()
+    def test_validate_password_forbidden(self):
+        "Test validate password forbidden"
+        pool = Pool()
+        User = pool.get('res.user')
+
+        with self.assertRaises(UserError):
+            User.validate_password(u'password', [])
+
+    @with_transaction()
+    def test_validate_password_entropy(self):
+        "Test validate password entropy"
+        pool = Pool()
+        User = pool.get('res.user')
+
+        with self.assertRaises(UserError):
+            User.validate_password('aaaaaa', [])
+
+    @with_transaction()
+    def test_validate_password_name(self):
+        "Test validate password name"
+        pool = Pool()
+        User = pool.get('res.user')
+        user = User(name='name')
+
+        with self.assertRaises(UserError):
+            User.validate_password('name', [user])
+
+    @with_transaction()
+    def test_validate_password_login(self):
+        "Test validate password login"
+        pool = Pool()
+        User = pool.get('res.user')
+        user = User(login='login')
+
+        with self.assertRaises(UserError):
+            User.validate_password('login', [user])
+
+    @with_transaction()
+    def test_validate_password_email(self):
+        "Test validate password email"
+        pool = Pool()
+        User = pool.get('res.user')
+        user = User(email='email')
+
+        with self.assertRaises(UserError):
+            User.validate_password('email', [user])
+
 
 def suite():
     return unittest.TestLoader().loadTestsFromTestCase(UserTestCase)
diff --git a/trytond/tools/datetime_strftime.py b/trytond/tools/datetime_strftime.py
index 9bd01fc..4d34774 100644
--- a/trytond/tools/datetime_strftime.py
+++ b/trytond/tools/datetime_strftime.py
@@ -1,6 +1,7 @@
 # This file is part of Tryton.  The COPYRIGHT file at the top level of
 # this repository contains the full copyright notices and license terms.
 # Copyright (c) 2002-2007 John D. Hunter; All Rights Reserved
+import datetime
 import time
 
 
@@ -9,6 +10,9 @@ def datetime_strftime(date, fmt):
     Allow datetime strftime formatting for years before 1900.
     See http://bugs.python.org/issue1777412
     '''
+    if not isinstance(date, datetime.date):
+        raise TypeError('datetime_strftime requires a ''datetime.date'' object'
+            'but received a ''%s''' % type(date))
     if date.year > 1900:
         return date.strftime(fmt)
 
diff --git a/trytond/tools/multivalue.py b/trytond/tools/multivalue.py
new file mode 100644
index 0000000..e0e12db
--- /dev/null
+++ b/trytond/tools/multivalue.py
@@ -0,0 +1,111 @@
+# 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 Table, Column, Literal, Union, Null
+from sql.aggregate import Max
+
+from trytond import backend
+from trytond.pool import Pool
+from trytond.transaction import Transaction
+
+
+def migrate_property(
+        model_name, field_names, ValueModel, value_names,
+        parent=None, fields=None):
+    "Migrate property from model_name.field_name to ValueModel.value_name"
+    pool = Pool()
+    Field = pool.get('ir.model.field')
+    Model = pool.get('ir.model')
+    TableHandler = backend.get('TableHandler')
+    if not TableHandler.table_exist('ir_property'):
+        return
+    cursor = Transaction().connection.cursor()
+    field = Field.__table__()
+    model = Model.__table__()
+    table = ValueModel.__table__()
+
+    if fields is None:
+        fields = []
+    if isinstance(field_names, basestring):
+        field_names = [field_names]
+    if isinstance(value_names, basestring):
+        value_names = [value_names]
+
+    def split_value(value):
+        return value.split(',')[1]
+    cast_funcs = {
+        'numeric': lambda v: Decimal(split_value(v)) if v else None,
+        'integer': lambda v: int(split_value(v)) if v else None,
+        'float': lambda v: float(split_value(v)) if v else None,
+        'char': lambda v: split_value(v) if v else None,
+        'selection': lambda v: split_value(v) if v else None,
+        'many2one': lambda v: int(split_value(v)) if v else None,
+        'reference': lambda v: v,
+        }
+
+    casts = []
+    queries = []
+    for field_name, value_name in zip(field_names, value_names):
+        value_field = getattr(ValueModel, value_name)
+        casts.append(cast_funcs[value_field._type])
+
+        property_ = Table('ir_property')
+        columns = [
+            Literal(None).as_(f) if f != value_name
+            else property_.value.as_(value_name)
+            for f in value_names]
+        if parent:
+            columns.append(property_.res.as_(parent))
+            where = property_.res.like(model_name + ',%')
+        else:
+            where = property_.res == Null
+        columns.extend([Column(property_, f).as_(f) for f in fields])
+        query = property_.join(field,
+            condition=property_.field == field.id
+            ).join(model,
+                condition=field.model == model.id
+                ).select(*columns,
+                    where=where
+                    & (field.name == field_name)
+                    & (model.model == model_name))
+        queries.append(query)
+
+    union = Union(*queries)
+    columns = [Max(Column(union, f)).as_(f) for f in value_names]
+    if parent:
+        columns.append(Column(union, parent).as_(parent))
+        pcolumns = [Column(union, parent)]
+    else:
+        pcolumns = []
+    vcolumns = [Column(union, f).as_(f) for f in fields]
+    cursor.execute(
+        *union.select(*(columns + vcolumns), group_by=pcolumns + vcolumns))
+
+    columns = [Column(table, f) for f in value_names]
+    if parent:
+        pcolumns = [Column(table, parent)]
+    else:
+        pcolumns = []
+    vcolumns = [Column(table, f) for f in fields]
+    values = []
+    l = len(value_names)
+    for row in cursor.fetchall():
+        value = [c(v) for v, c in zip(row, casts)]
+        if parent:
+            value.append(int(row[l].split(',')[1]) if row[l] else None)
+            i = 1
+        else:
+            i = 0
+        value.extend(row[l + i:])
+        values.append(value)
+    if (values and not (
+                # No property defined
+                len(values) == 1
+                and all(x is None for x in values[0][:len(columns)]))):
+
+        # Delete previous migrated values
+        cursor.execute(*table.delete())
+
+        cursor.execute(*table.insert(
+                columns + pcolumns + vcolumns, values=values))
diff --git a/trytond/transaction.py b/trytond/transaction.py
index 754b90f..1e7e321 100644
--- a/trytond/transaction.py
+++ b/trytond/transaction.py
@@ -58,6 +58,7 @@ class Transaction(object):
         if new or not transactions:
             instance = super(Transaction, cls).__new__(cls)
             instance.cache = {}
+            instance._atexit = []
             transactions.append(instance)
         else:
             instance = transactions[-1]
@@ -72,7 +73,7 @@ class Transaction(object):
             LRUDict(config.getint('cache', 'model')))
 
     def start(self, database_name, user, readonly=False, context=None,
-            close=False, autocommit=False):
+            close=False, autocommit=False, _nocache=False):
         '''
         Start transaction
         '''
@@ -99,6 +100,10 @@ class Transaction(object):
         self.timestamp = {}
         self.counter = 0
         self._datamanagers = []
+        self._nocache = _nocache
+        if not _nocache:
+            from trytond.cache import Cache
+            Cache.clean(database.name)
         return self
 
     def __enter__(self):
@@ -129,6 +134,9 @@ class Transaction(object):
                     self.delete = None
                     self.timestamp = None
                     self._datamanagers = []
+
+                for func, args, kwargs in self._atexit:
+                    func(*args, **kwargs)
         finally:
             current_instance = transactions.pop()
         assert current_instance is self, transactions
@@ -166,11 +174,12 @@ class Transaction(object):
         self._local.transactions.append(transaction)
         return transaction
 
-    def new_transaction(self, autocommit=False, readonly=False):
+    def new_transaction(self, autocommit=False, readonly=False,
+            _nocache=False):
         transaction = Transaction(new=True)
         return transaction.start(self.database.name, self.user,
             context=self.context, close=self.close, readonly=readonly,
-            autocommit=autocommit)
+            autocommit=autocommit, _nocache=_nocache)
 
     def commit(self):
         try:
@@ -193,6 +202,9 @@ class Transaction(object):
                 logger.critical('A datamanager raised an exception in'
                     ' tpc_finish, the data might be inconsistant',
                     exc_info=True)
+        if not self._nocache:
+            from trytond.cache import Cache
+            Cache.resets(self.database.name)
 
     def rollback(self):
         for cache in self.cache.itervalues():
@@ -200,6 +212,9 @@ class Transaction(object):
         for datamanager in self._datamanagers:
             datamanager.tpc_abort(self)
         self.connection.rollback()
+        if not self._nocache:
+            from trytond.cache import Cache
+            Cache.resets(self.database.name)
 
     def join(self, datamanager):
         try:
@@ -209,6 +224,9 @@ class Transaction(object):
             self._datamanagers.append(datamanager)
             return datamanager
 
+    def atexit(self, func, *args, **kwargs):
+        self._atexit.append((func, args, kwargs))
+
     @property
     def language(self):
         def get_language():
diff --git a/trytond/url.py b/trytond/url.py
index 80f445e..a7eccd9 100644
--- a/trytond/url.py
+++ b/trytond/url.py
@@ -8,7 +8,7 @@ import socket
 from trytond.config import config
 from trytond.transaction import Transaction
 
-__all__ = ['URLMixin']
+__all__ = ['URLMixin', 'HOSTNAME']
 
 HOSTNAME = (config.get('web', 'hostname')
     or socket.getfqdn())
diff --git a/trytond/wizard/wizard.py b/trytond/wizard/wizard.py
index f1d2abe..48e1b6a 100644
--- a/trytond/wizard/wizard.py
+++ b/trytond/wizard/wizard.py
@@ -341,7 +341,7 @@ class Wizard(WarningErrorMixin, URLMixin, PoolBase):
             if isinstance(state, StateView):
                 data[state_name] = getattr(self, state_name)._default_values
         session = Session(self._session_id)
-        data = json.dumps(data, cls=JSONEncoder)
+        data = json.dumps(data, cls=JSONEncoder, separators=(',', ':'))
         if data != session.data.encode('utf-8'):
             Session.write([session], {
                     'data': data,
-- 
tryton-server



More information about the tryton-debian-vcs mailing list