diff --git a/addons/account/__init__.py b/addons/account/__init__.py
index 866c39de02ecd8e8d5792b19794b2089834276ab..86d81923e02a3022f43fb83021e0535a791b3b55 100644
--- a/addons/account/__init__.py
+++ b/addons/account/__init__.py
@@ -45,6 +45,8 @@ def _auto_install_l10n(cr, registry):
             'PL', 'PT', 'RO', 'SI', 'TR', 'UK', 'VE', 'VN'
             ]:
             module_list.append('base_vat')
+        if country_code == 'MX':
+            module_list.append('l10n_mx_edi')
 
         # European countries will be using SEPA
         europe = env.ref('base.europe', raise_if_not_found=False)
diff --git a/addons/account/models/account_invoice.py b/addons/account/models/account_invoice.py
index 2974c2119c9d094acbd7e237b62e85b0eff7e7a5..9a8887ebeb025129a256f2d716dfdba2740629c9 100644
--- a/addons/account/models/account_invoice.py
+++ b/addons/account/models/account_invoice.py
@@ -743,7 +743,7 @@ class AccountInvoice(models.Model):
         # Subscribe internal users on the newly created bill
         partners = self.env['res.partner'].browse(seen_partner_ids)
         is_internal = lambda p: (p.user_ids and
-                                 all(p.user_ids.mapped(lambda u: u.user_has_groups('base.group_user'))))
+                                 all(p.user_ids.mapped(lambda u: u.has_group('base.group_user'))))
         partners_to_subscribe = partners.filtered(is_internal)
         if partners_to_subscribe:
             invoice.message_subscribe([p.id for p in partners_to_subscribe])
diff --git a/addons/account/models/account_payment.py b/addons/account/models/account_payment.py
index dfc2b605790b81a8089ad820f6801798e3e86583..034cdab484d94440655ce46b556c33f3b914d57a 100644
--- a/addons/account/models/account_payment.py
+++ b/addons/account/models/account_payment.py
@@ -87,6 +87,16 @@ class account_abstract_payment(models.AbstractModel):
         # Check all invoices have the same currency
         if any(inv.currency_id != invoices[0].currency_id for inv in invoices):
             raise UserError(_("In order to pay multiple invoices at once, they must use the same currency."))
+        # Check if, in batch payments, there are not negative invoices and positive invoices
+        dtype = invoices[0].type
+        for inv in invoices[1:]:
+            if inv.type != dtype:
+                if ((dtype == 'in_refund' and inv.type == 'in_invoice') or
+                        (dtype == 'in_invoice' and inv.type == 'in_refund')):
+                    raise UserError(_("You cannot register payments for vendor bills and supplier refunds at the same time."))
+                if ((dtype == 'out_refund' and inv.type == 'out_invoice') or
+                        (dtype == 'out_invoice' and inv.type == 'out_refund')):
+                    raise UserError(_("You cannot register payments for customer invoices and credit notes at the same time."))
 
         # Look if we are mixin multiple commercial_partner or customer invoices with vendor bills
         multi = any(inv.commercial_partner_id != invoices[0].commercial_partner_id
diff --git a/addons/account/models/res_users.py b/addons/account/models/res_users.py
index ab85e359d22e14c31e94197e9ac91ff0cd8feaa4..8030423e74d3be5ec200db0d06529702fd7c30a8 100644
--- a/addons/account/models/res_users.py
+++ b/addons/account/models/res_users.py
@@ -14,8 +14,8 @@ class Users(models.Model):
         super(Users, self)._check_one_user_type()
 
         users_with_both_groups = self.filtered(lambda user:
-            user.user_has_groups('account.group_show_line_subtotals_tax_included') and
-            user.user_has_groups('account.group_show_line_subtotals_tax_excluded')
+            user.has_group('account.group_show_line_subtotals_tax_included') and
+            user.has_group('account.group_show_line_subtotals_tax_excluded')
         )
         if users_with_both_groups:
             names = ", ".join(users_with_both_groups.mapped('name'))
diff --git a/addons/account/security/account_security.xml b/addons/account/security/account_security.xml
index b7ec99e56c0b8acc8b89577b556cc0d669c6a2ed..648dc59f1c3b03c2647be0d14caecfc9d97997ee 100644
--- a/addons/account/security/account_security.xml
+++ b/addons/account/security/account_security.xml
@@ -59,6 +59,17 @@
         <field name="category_id" ref="base.module_category_hidden"/>
     </record>
 
+    <record id="account_analytic_line_rule_billing_user" model="ir.rule">
+        <field name="name">account.analytic.line.billing.user</field>
+        <field name="model_id" ref="analytic.model_account_analytic_line"/>
+        <field name="domain_force">[(1, '=', 1)]</field>
+        <field name="groups" eval="[(4, ref('account.group_account_invoice'))]"/>
+        <field name="perm_create" eval="1"/>
+        <field name="perm_write" eval="1"/>
+        <field name="perm_unlink" eval="1"/>
+        <field name="perm_read" eval="0"/>
+    </record>
+
 </data>
 
 
diff --git a/addons/account/static/src/scss/account_journal_dashboard.scss b/addons/account/static/src/scss/account_journal_dashboard.scss
index 1bff7ba9057d05a24b20630e9784cbe5ffc6e27e..12826641bcff7f67f028821148c04776b301bac6 100644
--- a/addons/account/static/src/scss/account_journal_dashboard.scss
+++ b/addons/account/static/src/scss/account_journal_dashboard.scss
@@ -36,6 +36,15 @@
             width: 450px;
         }
     }
+    .o_kanban_group {
+        &:not(.o_column_folded) {
+            width: 450px + 2*$o-kanban-group-padding;
+
+            @include media-breakpoint-down(sm) {
+                width: 100%;
+            }
+        }
+    }
 }
 
 // Style for the widget "dashboard_graph"
diff --git a/addons/account/views/account_portal_templates.xml b/addons/account/views/account_portal_templates.xml
index 858a7cf58df6e3d9ccc1b174b7e5369b515bc247..30303fdb6eef4a7336f98d65b7e94017c36e050a 100644
--- a/addons/account/views/account_portal_templates.xml
+++ b/addons/account/views/account_portal_templates.xml
@@ -83,7 +83,7 @@
             <div class="row mt16 o_portal_invoice_sidebar">
                 <!-- Sidebar -->
                 <t t-call="portal.portal_record_sidebar">
-                    <t t-set="classes" t-value="'col-12 col-lg flex-lg-grow-0 d-print-none'"/>
+                    <t t-set="classes" t-value="'col-lg-auto d-print-none'"/>
                     <t t-set="title">
                         <h2 class="mb-0">
                             <b t-if="invoice.residual > 0" t-field="invoice.residual"/>
diff --git a/addons/auth_signup/controllers/main.py b/addons/auth_signup/controllers/main.py
index cffc8f00fd5fc1446d567dece668f1071a67deb6..dbf6c2fec533b6a76abb9c4a50a4bd68a3e5eb0e 100644
--- a/addons/auth_signup/controllers/main.py
+++ b/addons/auth_signup/controllers/main.py
@@ -44,7 +44,7 @@ class AuthSignupHome(Home):
                             lang=user_sudo.lang,
                             auth_login=werkzeug.url_encode({'auth_login': user_sudo.email}),
                         ).send_mail(user_sudo.id, force_send=True)
-                return super(AuthSignupHome, self).web_login(*args, **kw)
+                return self.web_login(*args, **kw)
             except UserError as e:
                 qcontext['error'] = e.name or e.value
             except (SignupError, AssertionError) as e:
@@ -69,7 +69,7 @@ class AuthSignupHome(Home):
             try:
                 if qcontext.get('token'):
                     self.do_signup(qcontext)
-                    return super(AuthSignupHome, self).web_login(*args, **kw)
+                    return self.web_login(*args, **kw)
                 else:
                     login = qcontext.get('login')
                     assert login, _("No login provided.")
diff --git a/addons/base_import_module/models/ir_module.py b/addons/base_import_module/models/ir_module.py
index 128594cc8243672f006cb48aecba5bb395c74936..9d650a4b6fbb12dd34ad4ad82f75e1848f94fb06 100644
--- a/addons/base_import_module/models/ir_module.py
+++ b/addons/base_import_module/models/ir_module.py
@@ -38,6 +38,8 @@ class IrModule(models.Model):
         installed_mods = [m.name for m in known_mods if m.state == 'installed']
 
         terp = load_information_from_description_file(module, mod_path=path)
+        if not terp:
+            return False
         values = self.get_values_from_terp(terp)
         if 'version' in terp:
             values['latest_version'] = terp['version']
@@ -133,8 +135,8 @@ class IrModule(models.Model):
                         try:
                             # assert mod_name.startswith('theme_')
                             path = opj(module_dir, mod_name)
-                            self._import_module(mod_name, path, force=force)
-                            success.append(mod_name)
+                            if self._import_module(mod_name, path, force=force):
+                                success.append(mod_name)
                         except Exception as e:
                             _logger.exception('Error while importing module')
                             errors[mod_name] = exception_to_unicode(e)
diff --git a/addons/base_setup/data/base_setup_data.xml b/addons/base_setup/data/base_setup_data.xml
index 6499d00add477114406b384e5f637da606dec249..e0d02590384d7e6a23dd6287b227ffb13358fbac 100644
--- a/addons/base_setup/data/base_setup_data.xml
+++ b/addons/base_setup/data/base_setup_data.xml
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
 <odoo>
     <data noupdate="1">
-        <record model="ir.config_parameter" id="show_effect">
+        <record model="ir.config_parameter" id="show_effect" forcecreate="False">
             <field name="key">base_setup.show_effect</field>
             <field name="value">True</field>
         </record>
diff --git a/addons/board/static/src/js/add_to_board_menu.js b/addons/board/static/src/js/add_to_board_menu.js
index fb6b469d5ab2b0650740a695f5932797372b38fe..ab56287b752faaddc6c835808df1bc46d0961a39 100644
--- a/addons/board/static/src/js/add_to_board_menu.js
+++ b/addons/board/static/src/js/add_to_board_menu.js
@@ -86,12 +86,18 @@ var AddToBoardMenu = Widget.extend({
         var context = new Context(this.action.context);
         context.add(searchQuery.context);
         context.add({
-            group_by: pyUtils.eval('groupbys', searchQuery.groupBys || [])
+            group_by: searchQuery.groupBy,
+            orderedBy: searchQuery.orderedBy,
         });
 
         this.trigger_up('get_controller_query_params', {
-            callback: function (controllerContext) {
-                context.add(controllerContext);
+            callback: function (controllerQueryParams) {
+                var queryContext = controllerQueryParams.context;
+                var allContext = _.extend(
+                    _.omit(controllerQueryParams, ['context']),
+                    queryContext
+                );
+                context.add(allContext);
             }
         });
 
diff --git a/addons/board/static/src/js/board_view.js b/addons/board/static/src/js/board_view.js
index bcfc892213d5e8bbe36cd5ebe61ab095442eb627..9a4970c709268ec7ba66f9c52f45006b4505d324 100644
--- a/addons/board/static/src/js/board_view.js
+++ b/addons/board/static/src/js/board_view.js
@@ -272,7 +272,8 @@ var BoardRenderer = FormRenderer.extend({
                         searchQuery: {
                             context: context,
                             domain: domain,
-                            groupBy: context.group_by || [],
+                            groupBy: typeof context.group_by === 'string' && context.group_by ? [context.group_by] : context.group_by || [],
+                            orderedBy: context.orderedBy || [],
                         },
                         withControlPanel: false,
                     });
diff --git a/addons/board/static/tests/dashboard_tests.js b/addons/board/static/tests/dashboard_tests.js
index 62dcb1f851cc24192fdaed0669887290d94f62a0..bb0663e14680876b538ae44f2f59d2485b09a97b 100644
--- a/addons/board/static/tests/dashboard_tests.js
+++ b/addons/board/static/tests/dashboard_tests.js
@@ -109,7 +109,7 @@ QUnit.test('display the no content helper', function (assert) {
 });
 
 QUnit.test('basic functionality, with one sub action', function (assert) {
-    assert.expect(25);
+    assert.expect(26);
 
     var form = createView({
         View: BoardView,
@@ -118,7 +118,7 @@ QUnit.test('basic functionality, with one sub action', function (assert) {
         arch: '<form string="My Dashboard">' +
                 '<board style="2-1">' +
                     '<column>' +
-                        '<action context="{}" view_mode="list" string="ABC" name="51" domain="[[\'foo\', \'!=\', \'False\']]"></action>' +
+                        '<action context="{&quot;orderedBy&quot;: [{&quot;name&quot;: &quot;foo&quot;, &quot;asc&quot;: True}]}" view_mode="list" string="ABC" name="51" domain="[[\'foo\', \'!=\', \'False\']]"></action>' +
                     '</column>' +
                 '</board>' +
             '</form>',
@@ -132,6 +132,12 @@ QUnit.test('basic functionality, with one sub action', function (assert) {
             }
             if (route === '/web/dataset/search_read') {
                 assert.deepEqual(args.domain, [['foo', '!=', 'False']], "the domain should be passed");
+                assert.deepEqual(args.context.orderedBy, [{
+                        'name': 'foo',
+                        'asc': true,
+                    }],
+                    'orderedBy is present in the search read when specified on the custom action'
+                );
             }
             if (route === '/web/view/edit_custom') {
                 assert.step('edit custom');
@@ -686,7 +692,19 @@ QUnit.test('dashboard intercepts custom events triggered by sub controllers', fu
 });
 
 QUnit.test('save actions to dashboard', function (assert) {
-    assert.expect(3);
+    assert.expect(6);
+
+    testUtils.patch(ListController, {
+        getOwnedQueryParams: function () {
+            var result = this._super.apply(this, arguments);
+            result.context = {
+                'fire': 'on the bayou',
+            }
+            return result;
+        }
+    });
+
+    this.data['partner'].fields.foo.sortable = true;
 
     var actionManager = createActionManager({
         data: this.data,
@@ -696,6 +714,16 @@ QUnit.test('save actions to dashboard', function (assert) {
         },
         mockRPC: function (route, args) {
             if (route === '/board/add_to_dashboard') {
+                assert.deepEqual(args.context_to_save.group_by, ['foo'],
+                    'The group_by should have been saved');
+                assert.deepEqual(args.context_to_save.orderedBy,
+                    [{
+                        name: 'foo',
+                        asc: true,
+                    }],
+                    'The orderedBy should have been saved');
+                assert.strictEqual(args.context_to_save.fire, 'on the bayou',
+                    'The context of a controller should be passed and flattened');
                 assert.strictEqual(args.action_id, 1,
                     "should save the correct action");
                 assert.strictEqual(args.view_mode, 'list',
@@ -716,12 +744,22 @@ QUnit.test('save actions to dashboard', function (assert) {
     assert.containsOnce(actionManager, '.o_list_view',
         "should display the list view");
 
+    // Sort the list
+    testUtils.dom.click($('.o_column_sortable'));
+
+    // Group It
+    testUtils.dom.click($('.o_search_options .o_dropdown button:contains(Group By)'));
+    testUtils.dom.click($('.o_search_options .o_group_by_menu button'));
+    testUtils.dom.click($('.o_search_options .o_group_by_menu button.o_apply_group'));
+
     // add this action to dashboard
     testUtils.dom.click($('.o_search_options .o_dropdown button:contains(Favorites)'));
     testUtils.dom.click($('.o_add_to_board.o_menu_header'));
     testUtils.fields.editInput($('input.o_add_to_board_input'), 'a name');
     testUtils.dom.click($('.o_add_to_board_confirm_button'));
 
+    testUtils.unpatch(ListController);
+
     actionManager.destroy();
 });
 
@@ -911,6 +949,44 @@ QUnit.test("Dashboard should use correct groupby", function (assert) {
     form.destroy();
 });
 
+QUnit.test("Dashboard should use correct groupby when defined as a string of one field", function (assert) {
+    assert.expect(1);
+    var form = createView({
+        View: BoardView,
+        model: 'board',
+        data: this.data,
+        arch: '<form string="My Dashboard">' +
+                '<board style="2-1">' +
+                    '<column>' +
+                        '<action context="{\'group_by\': \'bar\'}" string="ABC" name="51"></action>' +
+                    '</column>' +
+                '</board>' +
+            '</form>',
+        mockRPC: function (route, args) {
+            if (args.method === 'read_group') {
+                assert.deepEqual(args.kwargs.groupby, ['bar'],
+                    'user defined groupby should have precedence on action groupby');
+            }
+            if (route === '/web/action/load') {
+                return $.when({
+                    res_model: 'partner',
+                    context: {
+                        group_by: 'some_field',
+                    },
+                    views: [[4, 'list']],
+                });
+            }
+            return this._super.apply(this, arguments);
+        },
+        archs: {
+            'partner,4,list':
+                '<list string="Partner"><field name="foo"/></list>',
+        },
+    });
+
+    form.destroy();
+});
+
 QUnit.test('click on a cell of pivot view inside dashboard', function (assert) {
     assert.expect(3);
 
diff --git a/addons/calendar/data/mail_data.xml b/addons/calendar/data/mail_data.xml
index a4e2fa4690755f5bfc2a46733707c30ece12f88e..bd44813d08fdd8282c663dd0e874b47fb54c4e00 100644
--- a/addons/calendar/data/mail_data.xml
+++ b/addons/calendar/data/mail_data.xml
@@ -8,6 +8,7 @@
             <field name="email_from">${object.event_id.user_id.email or ''}</field>
             <field name="email_to" >${('' if object.partner_id and object.partner_id.email and object.partner_id.email==object.email else object.email|safe)}</field>
             <field name="partner_to">${object.partner_id and object.partner_id.email and object.partner_id.email==object.email and object.partner_id.id or False }</field>
+            <field name="lang">${object.partner_id.lang}</field>
             <field name="body_html" type="html">
 <div>
     % set colors = {'needsAction': 'grey', 'accepted': 'green', 'tentative': '#FFFF00',  'declined': 'red'}
@@ -91,6 +92,7 @@
             <field name="email_from">${object.event_id.user_id.email or ''}</field>
             <field name="email_to" >${('' if object.partner_id and object.partner_id.email and object.partner_id.email==object.email else object.email|safe)}</field>
             <field name="partner_to">${object.partner_id and object.partner_id.email and object.partner_id.email==object.email and object.partner_id.id or False }</field>
+            <field name="lang">${object.partner_id.lang}</field>
             <field name="body_html" type="html">
 <div>
     % set colors = {'needsAction': 'grey', 'accepted': 'green', 'tentative': '#FFFF00',  'declined': 'red'}
@@ -174,6 +176,7 @@
             <field name="email_from">${object.event_id.user_id.email or ''}</field>
             <field name="email_to" >${('' if object.partner_id and object.partner_id.email and object.partner_id.email==object.email else object.email|safe)}</field>
             <field name="partner_to">${object.partner_id and object.partner_id.email and object.partner_id.email==object.email and object.partner_id.id or False }</field>
+            <field name="lang">${object.partner_id.lang}</field>
             <field name="body_html" type="html">
 <div>
     % set colors = {'needsAction': 'grey', 'accepted': 'green', 'tentative': '#FFFF00',  'declined': 'red'}
diff --git a/addons/calendar/models/mail_message.py b/addons/calendar/models/mail_message.py
index cd8ed5d89ae43d33afa11f7b20b4c13d8374aa94..143bea2d1358e52f26be24dcbb5e060a4df5e797 100644
--- a/addons/calendar/models/mail_message.py
+++ b/addons/calendar/models/mail_message.py
@@ -26,6 +26,7 @@ class Message(models.Model):
     def _find_allowed_model_wise(self, doc_model, doc_dict):
         if doc_model == 'calendar.event':
             order = self._context.get('order', self.env[doc_model]._order)
-            for virtual_id in self.env[doc_model].browse(doc_dict).get_recurrent_ids([], order=order):
+            records = self.env[doc_model].search([('id', 'in', list(doc_dict))])
+            for virtual_id in records.get_recurrent_ids([], order=order):
                 doc_dict.setdefault(virtual_id, doc_dict[get_real_ids(virtual_id)])
         return super(Message, self)._find_allowed_model_wise(doc_model, doc_dict)
diff --git a/addons/crm/data/crm_data.xml b/addons/crm/data/crm_data.xml
index 006c982c03d64cabfe7da3bfd10b525961302c65..0ee888fea90de9f8cc715ea28d17aa3dd7bb3527 100644
--- a/addons/crm/data/crm_data.xml
+++ b/addons/crm/data/crm_data.xml
@@ -1,15 +1,15 @@
 <?xml version="1.0" encoding="utf-8"?>
 <odoo>
     <data noupdate="1">
-        <record id="sales_team.salesteam_website_sales" model="crm.team">
+        <record id="sales_team.salesteam_website_sales" model="crm.team" forcecreate="False">
             <field name="use_opportunities" eval="False"/>
         </record>
 
-        <record id="sales_team.pos_sales_team" model="crm.team">
+        <record id="sales_team.pos_sales_team" model="crm.team" forcecreate="False">
             <field name="use_opportunities" eval="False"/>
         </record>
 
-        <record id="sales_team.ebay_sales_team" model="crm.team">
+        <record id="sales_team.ebay_sales_team" model="crm.team" forcecreate="False">
             <field name="use_opportunities" eval="False"/>
         </record>
 
diff --git a/addons/crm/data/crm_demo.xml b/addons/crm/data/crm_demo.xml
index d57758c91068d3712eaf767a1362586eae33b5f7..de433c3afeb3f289c3807fa0fa3e9c50bf09c99f 100644
--- a/addons/crm/data/crm_demo.xml
+++ b/addons/crm/data/crm_demo.xml
@@ -5,7 +5,7 @@
             <field name="groups_id" eval="[(4,ref('sales_team.group_sale_salesman'))]"/>
         </record>
 
-        <record id="sales_team.team_sales_department" model="crm.team">
+        <record id="sales_team.team_sales_department" model="crm.team" forcecreate="False">
             <field name="alias_name">sales</field>
             <field name="alias_user_id" ref="base.user_admin"/>
             <field name="company_id" eval="False"/>
diff --git a/addons/delivery/models/sale_order.py b/addons/delivery/models/sale_order.py
index 8eb988d8447b43ee48a89314449820761c7ab4da..0b8c849b5b1b0c6f0ec6cd01526b41483c5cb075 100644
--- a/addons/delivery/models/sale_order.py
+++ b/addons/delivery/models/sale_order.py
@@ -102,9 +102,15 @@ class SaleOrder(models.Model):
             taxes_ids = self.fiscal_position_id.map_tax(taxes, carrier.product_id, self.partner_id).ids
 
         # Create the sales order line
+        carrier_with_partner_lang = carrier.with_context(lang=self.partner_id.lang)
+        if carrier_with_partner_lang.product_id.description_sale:
+            so_description = '%s: %s' % (carrier_with_partner_lang.name,
+                                        carrier_with_partner_lang.product_id.description_sale)
+        else:
+            so_description = carrier_with_partner_lang.name
         values = {
             'order_id': self.id,
-            'name': carrier.with_context(lang=self.partner_id.lang).name,
+            'name': so_description,
             'product_uom_qty': 1,
             'product_uom': carrier.product_id.uom_id.id,
             'product_id': carrier.product_id.id,
diff --git a/addons/delivery/views/delivery_view.xml b/addons/delivery/views/delivery_view.xml
index 28702c4eb54cd75d5e061629bea238b0f466456f..bb0c0db852e7ccaa7d97ed9d9e81053d8ba2858c 100644
--- a/addons/delivery/views/delivery_view.xml
+++ b/addons/delivery/views/delivery_view.xml
@@ -94,7 +94,7 @@
                                     <label for="free_over"/>
                                 </div>
                                 <field nolabel="1" name="amount" attrs="{'required':[('free_over','!=', False)], 'invisible':[('free_over','=', False)]}"/>
-                                <field name="product_id" context="{'default_type': 'service', 'sale_ok': False, 'purchase_ok': False}" />
+                                <field name="product_id" context="{'default_type': 'service', 'default_sale_ok': False, 'default_purchase_ok': False}" />
                                 <field name="company_id" groups="base.group_multi_company"/>
                             </group>
                         </group>
diff --git a/addons/delivery/wizard/choose_delivery_carrier.py b/addons/delivery/wizard/choose_delivery_carrier.py
index 454190a101e786bfa574edcbf7470dda1ec36e4f..c7bac396c614f7bf1d105faaa91eaeea1a428ff8 100644
--- a/addons/delivery/wizard/choose_delivery_carrier.py
+++ b/addons/delivery/wizard/choose_delivery_carrier.py
@@ -53,7 +53,7 @@ class ChooseDeliveryCarrier(models.TransientModel):
     def _compute_available_carrier(self):
         carriers = self.env['delivery.carrier'].search([])
         for rec in self:
-            rec.available_carrier_ids = carriers.available_carriers(rec.partner_id) if rec.partner_id else carriers
+            rec.available_carrier_ids = carriers.available_carriers(rec.order_id.partner_shipping_id) if rec.partner_id else carriers
 
     def update_price(self):
         vals = self.carrier_id.rate_shipment(self.order_id)
diff --git a/addons/event_sale/models/sale_order.py b/addons/event_sale/models/sale_order.py
index fac1730bead2d49ebeeefa2da4f41f1b8446edad..52017208adcc398b37d9ba9855b1dd896bda7f82 100644
--- a/addons/event_sale/models/sale_order.py
+++ b/addons/event_sale/models/sale_order.py
@@ -42,11 +42,11 @@ class SaleOrderLine(models.Model):
         registrations linked to this line. This method update existing registrations
         and create new one for missing one. """
         Registration = self.env['event.registration'].sudo()
-        registrations = Registration.search([('sale_order_line_id', 'in', self.ids), ('state', '!=', 'cancel')])
+        registrations = Registration.search([('sale_order_line_id', 'in', self.ids)])
         for so_line in self.filtered('event_id'):
             existing_registrations = registrations.filtered(lambda self: self.sale_order_line_id.id == so_line.id)
             if confirm:
-                existing_registrations.filtered(lambda self: self.state != 'open').confirm_registration()
+                existing_registrations.filtered(lambda self: self.state not in ['open', 'cancel']).confirm_registration()
             if cancel_to_draft:
                 existing_registrations.filtered(lambda self: self.state == 'cancel').do_draft()
 
diff --git a/addons/hr/views/hr_views.xml b/addons/hr/views/hr_views.xml
index 9f71be2a9c4920506b55ab4a48ff429bf35a1b53..50f34fed24ee30a3b22ed3580bb3efeb72eb78df 100644
--- a/addons/hr/views/hr_views.xml
+++ b/addons/hr/views/hr_views.xml
@@ -304,6 +304,13 @@
                     <filter string="Archived" name="inactive" domain="[('active','=',False)]"/>
                     <separator/>
                     <filter string="Unread Messages" name="message_needaction" domain="[('message_needaction', '=', True)]"/>
+                    <separator/>
+                    <filter string="Late Activities" name="activities_overdue"
+                        domain="[('activity_ids.date_deadline', '&lt;', context_today().strftime('%Y-%m-%d'))]"/>
+                    <filter string="Today Activities" name="activities_today"
+                        domain="[('activity_ids.date_deadline', '=', context_today().strftime('%Y-%m-%d'))]"/>
+                    <filter string="Future Activities" name="activities_upcoming_all"
+                        domain="[('activity_ids.date_deadline', '&gt;', context_today().strftime('%Y-%m-%d'))]"/>
                     <group expand="0" string="Group By">
                         <filter name="group_manager" string="Manager" domain="[]" context="{'group_by':'parent_id'}"/>
                         <filter name="group_coach" string="Coach" domain="[]" context="{'group_by':'coach_id'}"/>
diff --git a/addons/hr_expense/models/hr_expense.py b/addons/hr_expense/models/hr_expense.py
index 2666a9d01ad00f1cb5599663989852a8e8c71a94..13a35b10f5a34a84be5ade67c450cca37f0f7481 100644
--- a/addons/hr_expense/models/hr_expense.py
+++ b/addons/hr_expense/models/hr_expense.py
@@ -369,7 +369,7 @@ class HrExpense(models.Model):
             # get move line values
             move_line_values = move_line_values_by_expense.get(expense.id)
             move_line_dst = move_line_values[-1]
-            total_amount = abs(move_line_dst['debit'])
+            total_amount = move_line_dst['debit'] or -move_line_dst['credit']
             total_amount_currency = move_line_dst['amount_currency']
 
             # create one more move line, a counterline for the total on payable account
diff --git a/addons/hr_holidays/models/hr_leave.py b/addons/hr_holidays/models/hr_leave.py
index 70ec1a7ed7c4c8ead05068f60f50b967a2264c0e..14f5ba17901df7985757cda78757de590ed3af02 100644
--- a/addons/hr_holidays/models/hr_leave.py
+++ b/addons/hr_holidays/models/hr_leave.py
@@ -335,19 +335,22 @@ class HolidaysRequest(models.Model):
 
     @api.onchange('holiday_type')
     def _onchange_type(self):
-        if self.holiday_type == 'employee' and not self.employee_id:
-            self.employee_id = self.env.user.employee_ids[:1].id
+        if self.holiday_type == 'employee':
+            if not self.employee_id:
+                self.employee_id = self.env.user.employee_ids[:1].id
             self.mode_company_id = False
             self.category_id = False
-        elif self.holiday_type == 'company' and not self.mode_company_id:
+        elif self.holiday_type == 'company':
             self.employee_id = False
-            self.mode_company_id = self.env.user.company_id.id
+            if not self.mode_company_id:
+                self.mode_company_id = self.env.user.company_id.id
             self.category_id = False
-        elif self.holiday_type == 'department' and not self.department_id:
+        elif self.holiday_type == 'department':
             self.employee_id = False
             self.mode_company_id = False
-            self.department_id = self.env.user.employee_ids[:1].department_id.id
             self.category_id = False
+            if not self.department_id:
+                self.department_id = self.env.user.employee_ids[:1].department_id.id
         elif self.holiday_type == 'category':
             self.employee_id = False
             self.mode_company_id = False
@@ -800,8 +803,9 @@ class HolidaysRequest(models.Model):
         responsible = self.env.user
 
         if self.validation_type == 'hr' or (self.validation_type == 'both' and self.state == 'validate1'):
+            company = self.department_id.company_id if self.holiday_type == 'department' else self.employee_id.company_id
             responsible = self.env['res.users'].search([
-                ('company_id', '=', self.employee_id.company_id.id),
+                ('company_id', '=', company.id),
                 ('groups_id', 'in', self.env.ref('hr_holidays.group_hr_holidays_user').id)
             ], limit=1)
         elif self.state == 'confirm' or (self.state == 'validate' and self.validation_type == 'no_validation'):
diff --git a/addons/hr_holidays/models/hr_leave_allocation.py b/addons/hr_holidays/models/hr_leave_allocation.py
index 62b33e5c83efc5cd81717c3539544c6abada64e4..6fe2d32bc2e424466e4841284088a16760229f9c 100644
--- a/addons/hr_holidays/models/hr_leave_allocation.py
+++ b/addons/hr_holidays/models/hr_leave_allocation.py
@@ -244,16 +244,26 @@ class HolidaysAllocation(models.Model):
 
     @api.onchange('holiday_type')
     def _onchange_type(self):
-        if self.holiday_type == 'employee' and not self.employee_id:
-            if self.env.user.employee_ids:
-                self.employee_id = self.env.user.employee_ids[0]
+        if self.holiday_type == 'employee':
+            if not self.employee_id:
+                self.employee_id = self.env.user.employee_ids[:1].id
+            self.mode_company_id = False
+            self.category_id = False
+        elif self.holiday_type == 'company':
+            self.employee_id = False
+            if not self.mode_company_id:
+                self.mode_company_id = self.env.user.company_id.id
+            self.category_id = False
         elif self.holiday_type == 'department':
-            if self.env.user.employee_ids:
-                self.department_id = self.department_id or self.env.user.employee_ids[0].department_id
-            self.employee_id = None
-        else:
-            self.employee_id = None
-            self.department_id = None
+            self.employee_id = False
+            self.mode_company_id = False
+            self.category_id = False
+            if not self.department_id:
+                self.department_id = self.env.user.employee_ids[:1].department_id.id
+        elif self.holiday_type == 'category':
+            self.employee_id = False
+            self.mode_company_id = False
+            self.department_id = False
 
     @api.onchange('employee_id')
     def _onchange_employee(self):
diff --git a/addons/hr_holidays/tests/test_leave_requests.py b/addons/hr_holidays/tests/test_leave_requests.py
index 67d468b0a442e616d984c3671177b537e620f4a9..9f32d96e6c6c9be90b63e98dba90ec6cc7ed2983 100644
--- a/addons/hr_holidays/tests/test_leave_requests.py
+++ b/addons/hr_holidays/tests/test_leave_requests.py
@@ -6,6 +6,7 @@ from dateutil.relativedelta import relativedelta
 from odoo import fields
 from odoo.exceptions import ValidationError
 from odoo.tools import mute_logger
+from odoo.tests.common import Form
 
 from odoo.addons.hr_holidays.tests.common import TestHrHolidaysBase
 
@@ -150,3 +151,25 @@ class TestLeaveRequests(TestHrHolidaysBase):
                 'date_to': fields.Datetime.from_string('2017-07-11 19:00:00'),
                 'number_of_days': 1,
             })
+
+    @mute_logger('odoo.models.unlink', 'odoo.addons.mail.models.mail_mail')
+    def test_department_leave(self):
+        """ Create a department leave """
+        self.employee_hrmanager.write({'department_id': self.hr_dept.id})
+        self.assertFalse(self.env['hr.leave'].search([('employee_id', 'in', self.hr_dept.member_ids.ids)]))
+        leave_form = Form(self.env['hr.leave'].sudo(self.user_hrmanager))
+        leave_form.holiday_status_id = self.holidays_type_1
+        leave_form.holiday_type = 'department'
+        leave_form.department_id = self.hr_dept
+        leave = leave_form.save()
+        leave.action_approve()
+        member_ids = self.hr_dept.member_ids.ids
+        self.assertEqual(self.env['hr.leave'].search_count([('employee_id', 'in', member_ids)]), len(member_ids), "Leave should be created for members of department")
+
+    @mute_logger('odoo.models.unlink', 'odoo.addons.mail.models.mail_mail')
+    def test_allocation_request(self):
+        """ Create an allocation request """
+        # employee should be set to current user
+        allocation_form = Form(self.env['hr.leave.allocation'].sudo(self.user_employee))
+        allocation_form.holiday_status_id = self.holidays_type_1
+        allocation = allocation_form.save()
diff --git a/addons/hw_screen/static/src/js/worker.js b/addons/hw_screen/static/src/js/worker.js
index 4031e85cf5228f26f1ef430a81b879994e751169..5949ab39cef65a04c504a28c33f9c0e1abd96203 100644
--- a/addons/hw_screen/static/src/js/worker.js
+++ b/addons/hw_screen/static/src/js/worker.js
@@ -9,7 +9,7 @@
         function longpolling() {
             $.ajax({
                 type: 'POST',
-                url: 'http://'+window.location.host+'/point_of_sale/get_serialized_order',
+                url: window.location.origin+'/point_of_sale/get_serialized_order',
                 dataType: 'json',
                 beforeSend: function(xhr){xhr.setRequestHeader('Content-Type', 'application/json');},
                 data: JSON.stringify({jsonrpc: '2.0'}),
@@ -47,11 +47,14 @@
                             foreign_js();
                         }
                     }
+                    if (!stop_longpolling) {
+                        longpolling();
+                    }
                 },
 
-                complete: function(jqXHR,err) {
+                error: function (jqXHR, status, err) {
                     if (!stop_longpolling) {
-                        longpolling();
+                        setTimeout(longpolling, 5000);
                     }
                 },
 
diff --git a/addons/l10n_be_hr_payroll/data/l10n_be_hr_payroll_data.xml b/addons/l10n_be_hr_payroll/data/l10n_be_hr_payroll_data.xml
index 9a6e0fbd1802b05ea2ea211917c887fae444e361..3b5aa088694a697d8e6999a7f33a7c357d3ebaf5 100644
--- a/addons/l10n_be_hr_payroll/data/l10n_be_hr_payroll_data.xml
+++ b/addons/l10n_be_hr_payroll/data/l10n_be_hr_payroll_data.xml
@@ -188,7 +188,7 @@ result = bool(contract.ip)
         </field>
         <field name="amount_select">code</field>
         <field name="amount_python_compute">
-result = - categories.GROSSIP * contract.ip_wage_rate / 100.0
+result = - categories.BASIC * contract.ip_wage_rate / 100.0
         </field>
     </record>
 
@@ -530,7 +530,7 @@ result = -contract.car_atn
         <field name="sequence">172</field>
         <field name="condition_select">python</field>
         <field name="condition_python">result = bool(contract.ip)</field>
-        <field name="amount_python_compute">result = categories.GROSSIP * contract.ip_wage_rate / 100.0</field>
+        <field name="amount_python_compute">result = categories.BASIC * contract.ip_wage_rate / 100.0</field>
     </record>
     <record id="hr_salary_rule_ip_deduction" model="hr.salary.rule">
         <field name="category_id" ref="l10n_be_hr_payroll.hr_payroll_head_div_net"/>
@@ -542,7 +542,7 @@ result = -contract.car_atn
         <field name="condition_python">result = bool(contract.ip)</field>
         <field name="amount_python_compute">
 tax_rate = 0.15
-ip_amount = categories.GROSSIP * contract.ip_wage_rate / 100.0
+ip_amount = categories.BASIC * contract.ip_wage_rate / 100.0
 if ip_amount &gt;= 0.0 and ip_amount &lt;= 15660:
     tax_rate = tax_rate / 2.0
 elif ip_amount &gt; 15660 and ip_amount &lt;=31320:
diff --git a/addons/l10n_be_hr_payroll/views/res_config_settings_views.xml b/addons/l10n_be_hr_payroll/views/res_config_settings_views.xml
index fc3c38f8c34a4abce7a12b929edafd94912f8cf7..166b85499b27b7156d0e90dd764028936e2120af 100644
--- a/addons/l10n_be_hr_payroll/views/res_config_settings_views.xml
+++ b/addons/l10n_be_hr_payroll/views/res_config_settings_views.xml
@@ -16,7 +16,7 @@
                             <div class="text-muted">
                                 Configure Default Values for Belgian Advantages
                             </div>
-                            <group class="mt16" name="default_advantages">>
+                            <group class="mt16" name="default_advantages">
                                 <label for="default_holidays"/>
                                 <div>
                                     <field name="default_holidays" nolabel="1"/>
diff --git a/addons/l10n_ca/data/account_tax_data.xml b/addons/l10n_ca/data/account_tax_data.xml
index 803e63c0435533ed45b2237255dde3116076e9e0..174c30ef36015cbe4805decdc7c932c06865cfa7 100644
--- a/addons/l10n_ca/data/account_tax_data.xml
+++ b/addons/l10n_ca/data/account_tax_data.xml
@@ -112,7 +112,7 @@
         <field name="type_tax_use">sale</field>
         <field name="amount">100</field>
         <field name="amount_type">group</field>
-        <field name="children_tax_ids" eval="[(6,0,[ref('pst_bc_sale_en')])]"/>
+        <field name="children_tax_ids" eval="[(6,0,[ref('pst_bc_sale_en'), ref('gstpst_sale_bc_gst_en')])]"/>
         <field name="tag_ids" eval="[(6,0,[ref('tag_gstpst_bc_sale')])]"/>
         <field name="tax_group_id" ref="tax_group_fix"/>
     </record>
diff --git a/addons/l10n_de_skr03/data/account.account.template.csv b/addons/l10n_de_skr03/data/account.account.template.csv
index 092915add9a5ed967694309cf29ec016e13ba2df..4ef26cb8bb52a272294f7877f6211850bd157975 100644
--- a/addons/l10n_de_skr03/data/account.account.template.csv
+++ b/addons/l10n_de_skr03/data/account.account.template.csv
@@ -510,7 +510,7 @@
 "account_1784","1784","USt EG-Erwerb Neufahrzeuge ohne UStID","l10n_de.tag_de_asset_bs_B_II_4","account.data_account_type_current_liabilities","l10n_de_skr03.l10n_de_chart_template","False"
 "account_1785","1785","Umsatzsteuer nach § 13b UStG","l10n_de.tag_de_asset_bs_B_II_4","account.data_account_type_current_liabilities","l10n_de_skr03.l10n_de_chart_template","False"
 "account_1787","1787","Umsatzsteuer nach § 13b UStG 19%","l10n_de.tag_de_asset_bs_B_II_4","account.data_account_type_current_liabilities","l10n_de_skr03.l10n_de_chart_template","False"
-"account_1788","1788","Aufgeschobene Einfuhr-Umsatzsteuer","l10n_de.tag_de_liabilities_bs_D_8","account.data_account_type_current_liabilities","l10n_de_skr03.l10n_de_chart_template","False"
+"account_1788","1788","Aufgeschobene Einfuhr-Umsatzsteuer","l10n_de.tag_de_liabilities_bs_D_8","account.data_account_type_current_liabilities","l10n_de_skr03.l10n_de_chart_template","True"
 "account_1789","1789","Umsatzsteuer laufendes Jahr","l10n_de.tag_de_liabilities_bs_D_8","account.data_account_type_current_liabilities","l10n_de_skr03.l10n_de_chart_template","False"
 "account_1790","1790","Umsatzsteuer Vorjahr","l10n_de.tag_de_liabilities_bs_D_8","account.data_account_type_current_liabilities","l10n_de_skr03.l10n_de_chart_template","False"
 "account_1791","1791","Umsatzsteuer frühere Jahre","l10n_de.tag_de_liabilities_bs_D_8","account.data_account_type_current_liabilities","l10n_de_skr03.l10n_de_chart_template","False"
@@ -845,9 +845,10 @@
 "account_3505","3505","Wareneingang 5,5% Vorsteuer","l10n_de.tag_de_pl_05","account.data_account_type_expenses","l10n_de_skr03.l10n_de_chart_template","False"
 "account_3540","3540","Wareneingang 10,7% Vorsteuer","l10n_de.tag_de_pl_05","account.data_account_type_expenses","l10n_de_skr03.l10n_de_chart_template","False"
 "account_3550","3550","Steuerfreier EG-Erwerb","l10n_de.tag_de_pl_05","account.data_account_type_expenses","l10n_de_skr03.l10n_de_chart_template","False"
-"account_3551","3551","Wareneingang, im Drittland steuerbar","l10n_de.tag_de_pl_05","account.data_account_type_expenses","l10n_de_skr03.l10n_de_chart_template","False"
+"account_3551","3551","Wareneingang, im Drittland steuerbar (19%)","l10n_de.tag_de_pl_05","account.data_account_type_expenses","l10n_de_skr03.l10n_de_chart_template","False"
 "account_3552","3552","Erwerb 1. Abnehmer im Dreiecksgeschäft","l10n_de.tag_de_pl_05","account.data_account_type_expenses","l10n_de_skr03.l10n_de_chart_template","False"
 "account_3553","3553","Erwerb Waren als letzter Abnehmer innerhalb Dreiecksgeschäft 19% Vorsteuer und 19% Umsatzsteuer","l10n_de.tag_de_pl_05","account.data_account_type_expenses","l10n_de_skr03.l10n_de_chart_template","False"
+"account_3557","3557","Wareneingang, im Drittland steuerbar (7%)","l10n_de.tag_de_pl_05","account.data_account_type_expenses","l10n_de_skr03.l10n_de_chart_template","False"
 "account_3558","3558","Wareneingang, im anderen EG-Land stb.","l10n_de.tag_de_pl_05","account.data_account_type_expenses","l10n_de_skr03.l10n_de_chart_template","False"
 "account_3559","3559","Steuerfreie Einfuhren","l10n_de.tag_de_pl_05","account.data_account_type_expenses","l10n_de_skr03.l10n_de_chart_template","False"
 "account_3560","3560","Waren aus USt-Lager 7% Vorsteuer, 7% USt","l10n_de.tag_de_pl_05","account.data_account_type_expenses","l10n_de_skr03.l10n_de_chart_template","False"
@@ -1214,7 +1215,7 @@
 "account_8730","8730","Gewährte Skonti","l10n_de.tag_de_pl_01","account.data_account_type_revenue","l10n_de_skr03.l10n_de_chart_template","False"
 "account_8731","8731","Gewährte Skonti 7% USt","l10n_de.tag_de_pl_01","account.data_account_type_revenue","l10n_de_skr03.l10n_de_chart_template","False"
 "account_8736","8736","Gewährte Skonti 19% USt","l10n_de.tag_de_pl_01","account.data_account_type_revenue","l10n_de_skr03.l10n_de_chart_template","False"
-"account_8738","8738","Gewährte Skonti aus Lieferungen von Mobilfunkgeräten/Schaltkreisen, für die der Leistungsempfänger die Umsatzsteuer nach § 13b UStG schuldet","l10n_de.tag_de_pl_01","account.data_account_type_revenue","l10n_de_skr03.l10n_de_chart_template","False"
+"account_8738","8738","Gewährte Skonti aus Lieferungen von Mobilfunkgeräten/Schaltkreisen, für die der Leistungsempfänger die Umsatzsteuer nach § 13b Abs. 2 Nr. 10 UStG schuldet","l10n_de.tag_de_pl_01","account.data_account_type_revenue","l10n_de_skr03.l10n_de_chart_template","False"
 "account_8741","8741","Gewährte Skonti Leistungen §13b UStG","l10n_de.tag_de_pl_01","account.data_account_type_revenue","l10n_de_skr03.l10n_de_chart_template","False"
 "account_8742","8742","Gewährte Skonti aus Erlöse aus im anderen EU-Land steuerpflichtigen sonstigen Leistungen, für die der Leistungsempfänger die Umsatzsteuer schuldet","l10n_de.tag_de_pl_01","account.data_account_type_revenue","l10n_de_skr03.l10n_de_chart_template","False"
 "account_8743","8743","Gewährte Skonti stfr. EG-Lieferung","l10n_de.tag_de_pl_01","account.data_account_type_revenue","l10n_de_skr03.l10n_de_chart_template","False"
@@ -1280,4 +1281,5 @@
 "account_9001","9001","Saldenvorträge","","account.data_account_type_other_income","l10n_de_skr03.l10n_de_chart_template","False"
 "account_9008","9008","Saldenvorträge Debitoren","","account.data_account_type_other_income","l10n_de_skr03.l10n_de_chart_template","False"
 "account_9009","9009","Saldenvorträge Kreditoren","","account.data_account_type_other_income","l10n_de_skr03.l10n_de_chart_template","False"
-"account_9090","9090","Summenvortragskonto","","account.data_account_type_other_income","l10n_de_skr03.l10n_de_chart_template","False"
\ No newline at end of file
+"account_9089","9089","Offene Posten aus 2019","","account.data_account_type_other_income","l10n_de_skr03.l10n_de_chart_template","False"
+"account_9090","9090","Summenvortragskonto","","account.data_account_type_other_income","l10n_de_skr03.l10n_de_chart_template","False"
diff --git a/addons/l10n_de_skr03/data/account_tax_fiscal_position_data.xml b/addons/l10n_de_skr03/data/account_tax_fiscal_position_data.xml
index 41d065d79c9b054f4a61e178f5e8ffd9a5e27b0c..4d172b2999c3562d2559df84d24b956195b3ecc4 100644
--- a/addons/l10n_de_skr03/data/account_tax_fiscal_position_data.xml
+++ b/addons/l10n_de_skr03/data/account_tax_fiscal_position_data.xml
@@ -77,7 +77,74 @@
             <field name="tag_ids" eval="[(6,0,[ref('l10n_de.tag_de_93')])]"/>
             <field name="tax_group_id" ref="tax_group_0"/>
         </record>
-
+        <record id="tax_eu_19_purchase_ust_no_vst_skr03" model="account.tax.template">
+            <field name="sequence">97</field>
+            <field name="chart_template_id" ref="l10n_de_chart_template"/>
+            <field name="name">19% Umsatzsteuer aus innergem. Erwerb (kein Vorsteuerabzug)</field>
+            <field name="description">19% USt innerg. Erw. - 0% Vorsteuer</field>
+            <field name="amount_type">percent</field>
+            <field name="amount">-19</field>
+            <field name="refund_account_id" ref="account_1779"/>
+            <field name="account_id" ref="account_1779"/>
+            <field name="type_tax_use">none</field>
+            <field name="tag_ids" eval="[(6,0,[ref('l10n_de.tag_de_89')])]"/>
+            <field name="tax_group_id" ref="tax_group_19"/>
+        </record>
+        <record id="tax_eu_19_purchase_vst_no_vst_skr03" model="account.tax.template">
+            <field name="sequence">97</field>
+            <field name="chart_template_id" ref="l10n_de_chart_template"/>
+            <field name="name">19% Vorsteuer aus innergem. Erwerb (kein Vorsteuerabzug)</field>
+            <field name="description">19% VSt innerg. Erw. - 0% Vorsteuer</field>
+            <field name="amount_type">percent</field>
+            <field name="amount">19</field>
+            <field name="type_tax_use">none</field>
+            <field name="tax_group_id" ref="tax_group_19"/>
+        </record>
+        <record id="tax_eu_19_purchase_no_vst_skr03" model="account.tax.template">
+            <field name="sequence">20</field>
+            <field name="chart_template_id" ref="l10n_de_chart_template"/>
+            <field name="name">Innergem. Erwerb 19%USt/0%VSt</field>
+            <field name="description">innergem. Erwerb 19% - 0% Vorsteuer</field>
+            <field name="amount_type">group</field>
+            <field name="amount">0</field>
+            <field name="type_tax_use">purchase</field>
+            <field name="children_tax_ids" eval="[(6,0,[ref('tax_eu_19_purchase_ust_no_vst_skr03'), ref('tax_eu_19_purchase_vst_no_vst_skr03')])]"/>
+            <field name="tax_group_id" ref="tax_group_19"/>
+        </record>
+        <record id="tax_eu_7_purchase_ust_no_vst_skr03" model="account.tax.template">
+            <field name="sequence">97</field>
+            <field name="chart_template_id" ref="l10n_de_chart_template"/>
+            <field name="name">7% Umsatzsteuer aus innergem. Erwerb (kein Vorsteuerabzug)</field>
+            <field name="description">7% USt innerg. Erw. - 0% Vorsteuer</field>
+            <field name="amount_type">percent</field>
+            <field name="amount">-7</field>
+            <field name="refund_account_id" ref="account_1779"/>
+            <field name="account_id" ref="account_1779"/>
+            <field name="type_tax_use">none</field>
+            <field name="tag_ids" eval="[(6,0,[ref('l10n_de.tag_de_93')])]"/>
+            <field name="tax_group_id" ref="tax_group_7"/>
+        </record>
+        <record id="tax_eu_7_purchase_vst_no_vst_skr03" model="account.tax.template">
+            <field name="sequence">97</field>
+            <field name="chart_template_id" ref="l10n_de_chart_template"/>
+            <field name="name">7% Vorsteuer aus innergem. Erwerb (kein Vorsteuerabzug)</field>
+            <field name="description">7% VSt innerg. Erw. - 0% Vorsteuer</field>
+            <field name="amount_type">percent</field>
+            <field name="amount">7</field>
+            <field name="type_tax_use">none</field>
+            <field name="tax_group_id" ref="tax_group_7"/>
+        </record>
+        <record id="tax_eu_7_purchase_no_vst_skr03" model="account.tax.template">
+            <field name="sequence">20</field>
+            <field name="chart_template_id" ref="l10n_de_chart_template"/>
+            <field name="name">Innergem. Erwerb 7%USt/0%VSt</field>
+            <field name="description">innergem. Erwerb 7% - 0% Vorsteuer</field>
+            <field name="amount_type">group</field>
+            <field name="amount">0</field>
+            <field name="type_tax_use">purchase</field>
+            <field name="children_tax_ids" eval="[(6,0,[ref('tax_eu_7_purchase_ust_no_vst_skr03'), ref('tax_eu_7_purchase_vst_no_vst_skr03')])]"/>
+            <field name="tax_group_id" ref="tax_group_7"/>
+        </record>
         <record id="tax_eu_car_purchase_ust_skr03" model="account.tax.template">
             <field name="sequence">99</field>
             <field name="chart_template_id" ref="l10n_de_chart_template"/>
@@ -163,29 +230,75 @@
         <record id="tax_import_19_skr03" model="account.tax.template">
             <field name="sequence">20</field>
             <field name="chart_template_id" ref="l10n_de_chart_template"/>
-            <field name="name">19% Einfuhrumsatzsteuer</field>
+            <field name="name">19% Einfuhrumsatzsteuer (abzugsf. Vorsteuer)</field>
             <field name="description">19% EUSt</field>
             <field name="amount_type">percent</field>
             <field name="amount">19</field>
             <field name="refund_account_id" ref="account_1588"/>
             <field name="account_id" ref="account_1588"/>
-            <field name="type_tax_use">purchase</field>
+            <field name="type_tax_use">none</field>
             <field name="tag_ids" eval="[(6,0,[ref('l10n_de.tag_de_62')])]"/>
             <field name="tax_group_id" ref="tax_group_19"/>
         </record>
-        <record id="tax_import_7_skr03" model="account.tax.template">
+        <record id="tax_import_19_payable_skr03" model="account.tax.template">
+            <field name="sequence">98</field>
+            <field name="chart_template_id" ref="l10n_de_chart_template"/>
+            <field name="name">19% Einfuhrumsatzsteuer (zu bezahlender Aufschub)</field>
+            <field name="description">19% EUSt (zu bezahlender Aufschub)</field>
+            <field name="amount_type">percent</field>
+            <field name="amount">-19</field>
+            <field name="refund_account_id" ref="account_1788"/>
+            <field name="account_id" ref="account_1788"/>
+            <field name="type_tax_use">none</field>
+            <field name="tax_group_id" ref="tax_group_19"/>
+        </record>
+        <record id="tax_import_19_and_payable_skr03" model="account.tax.template">
             <field name="sequence">21</field>
             <field name="chart_template_id" ref="l10n_de_chart_template"/>
-            <field name="name">7% Einfuhrumsatzsteuer</field>
-            <field name="description">7% EUSt</field>
+            <field name="name">19% Einfuhrumsatzsteuer (§21 Abs.3 UstG)</field>
+            <field name="description">Einfuhrumsatzsteuer 19%</field>
+            <field name="amount_type">group</field>
+            <field name="amount">0</field>
+            <field name="type_tax_use">purchase</field>
+            <field name="children_tax_ids" eval="[(6,0,[ref('tax_import_19_skr03'), ref('tax_import_19_payable_skr03')])]"/>
+            <field name="tax_group_id" ref="tax_group_19"/>
+        </record>
+        <record id="tax_import_7_skr03" model="account.tax.template">
+            <field name="sequence">98</field>
+            <field name="chart_template_id" ref="l10n_de_chart_template"/>
+            <field name="name">7% Einfuhrumsatzsteuer (abzugsf. Vorsteuer)</field>
+            <field name="description">7% EUSt (abzugsf. Vorsteuer)</field>
             <field name="amount_type">percent</field>
             <field name="amount">7</field>
             <field name="refund_account_id" ref="account_1588"/>
             <field name="account_id" ref="account_1588"/>
-            <field name="type_tax_use">purchase</field>
+            <field name="type_tax_use">none</field>
             <field name="tag_ids" eval="[(6,0,[ref('l10n_de.tag_de_62')])]"/>
             <field name="tax_group_id" ref="tax_group_7"/>
         </record>
+        <record id="tax_import_7_payable_skr03" model="account.tax.template">
+            <field name="sequence">98</field>
+            <field name="chart_template_id" ref="l10n_de_chart_template"/>
+            <field name="name">7% Einfuhrumsatzsteuer (zu bezahlender Aufschub)</field>
+            <field name="description">7% EUSt (zu bezahlender Aufschub)</field>
+            <field name="amount_type">percent</field>
+            <field name="amount">-7</field>
+            <field name="refund_account_id" ref="account_1788"/>
+            <field name="account_id" ref="account_1788"/>
+            <field name="type_tax_use">none</field>
+            <field name="tax_group_id" ref="tax_group_7"/>
+        </record>
+        <record id="tax_import_7_and_payable_skr03" model="account.tax.template">
+            <field name="sequence">21</field>
+            <field name="chart_template_id" ref="l10n_de_chart_template"/>
+            <field name="name">7% Einfuhrumsatzsteuer (§21 Abs.3 UstG)</field>
+            <field name="description">Einfuhrumsatzsteuer 7%</field>
+            <field name="amount_type">group</field>
+            <field name="amount">0</field>
+            <field name="type_tax_use">purchase</field>
+            <field name="children_tax_ids" eval="[(6,0,[ref('tax_import_7_skr03'), ref('tax_import_7_payable_skr03')])]"/>
+            <field name="tax_group_id" ref="tax_group_7"/>
+        </record>
         <record id="tax_eu_purchase_tax_free_skr03" model="account.tax.template">
             <field name="sequence">22</field>
             <field name="chart_template_id" ref="l10n_de_chart_template"/>
@@ -816,7 +929,6 @@
             <field name="children_tax_ids" eval="[(6,0,[ref('tax_ust_19_purchase_3eck_last_skr03'), ref('tax_vst_19_purchase_3eck_last_skr03')])]"/>
             <field name="tax_group_id" ref="tax_group_0"/>
         </record>
-
         <record id="tax_ust_19_purchase_13b_werk_ausland_skr03" model="account.tax.template">
             <field name="sequence">105</field>
             <field name="chart_template_id" ref="l10n_de_chart_template"/>
@@ -969,23 +1081,38 @@
             <field name="children_tax_ids" eval="[(6,0,[ref('tax_ust_7_purchase_13a_auslagerung_skr03'), ref('tax_vst_7_purchase_13a_auslagerung_skr03')])]"/>
             <field name="tax_group_id" ref="tax_group_0"/>
         </record>
+        <record id="fiscal_position_domestic_skr03" model="account.fiscal.position.template">
+            <field name="sequence">1</field>
+            <field name="name">Geschäftspartner Inland</field>
+            <field name="chart_template_id" ref="l10n_de_chart_template"/>
+            <field name="auto_apply" eval="True" />
+            <field name="country_id" ref="base.de"></field>
+        </record>
         <record id="fiscal_position_non_eu_partner_service_skr03" model="account.fiscal.position.template">
+            <field name="sequence">6</field>
             <field name="chart_template_id" ref="l10n_de_chart_template"/>
-            <field name="name">Dienstleister Ausland</field>
+            <field name="name">Dienstleister Ausland (Nicht-EU)</field>
         </record>
         <record id="fiscal_position_non_eu_partner_skr03" model="account.fiscal.position.template">
+            <field name="sequence">5</field>
             <field name="chart_template_id" ref="l10n_de_chart_template"/>
-            <field name="name">Geschäftspartner Ausland</field>
+            <field name="name">Geschäftspartner Ausland (Nicht-EU)</field>
         </record>
         <record id="fiscal_position_eu_vat_id_partner_skr03" model="account.fiscal.position.template">
+            <field name="sequence">2</field>
             <field name="chart_template_id" ref="l10n_de_chart_template"/>
             <field name="name">Geschäftspartner EU (mit USt-ID)</field>
+            <field name="auto_apply" eval="True" />
+            <field name="country_group_id" ref="base.europe"></field>
         </record>
         <record id="fiscal_position_eu_vat_id_partner_service_skr03" model="account.fiscal.position.template">
+            <field name="sequence">3</field>
             <field name="chart_template_id" ref="l10n_de_chart_template"/>
             <field name="name">Dienstleister EU (mit USt-ID)</field>
+            <field name="vat_required" eval="True" />
         </record>
         <record id="fiscal_position_eu_no_id_partner_skr03" model="account.fiscal.position.template">
+            <field name="sequence">4</field>
             <field name="chart_template_id" ref="l10n_de_chart_template"/>
             <field name="name">Geschäftspartner EU (ohne USt-ID)</field>
         </record>
@@ -1021,12 +1148,12 @@
         </record>
         <record id="account_fiscal_position_tax_eu_no_id_purchase_19_skr03" model="account.fiscal.position.tax.template">
             <field name="position_id" ref="fiscal_position_eu_no_id_partner_skr03"/>
-            <field name="tax_dest_id" ref="tax_import_19_skr03"/>
+            <field name="tax_dest_id" ref="tax_eu_19_purchase_no_vst_skr03"/>
             <field name="tax_src_id" ref="tax_vst_19_skr03"/>
         </record>
         <record id="account_fiscal_position_tax_eu_no_id_purchase_7_skr03" model="account.fiscal.position.tax.template">
             <field name="position_id" ref="fiscal_position_eu_no_id_partner_skr03"/>
-            <field name="tax_dest_id" ref="tax_import_7_skr03"/>
+            <field name="tax_dest_id" ref="tax_eu_7_purchase_no_vst_skr03"/>
             <field name="tax_src_id" ref="tax_vst_7_skr03"/>
         </record>
         <record id="account_fiscal_position_tax_eu_no_id_sale_19_skr03" model="account.fiscal.position.tax.template">
@@ -1056,7 +1183,7 @@
         </record>
         <record id="account_fiscal_position_tax_non_eu_purchase_19_skr03" model="account.fiscal.position.tax.template">
             <field name="position_id" ref="fiscal_position_non_eu_partner_skr03"/>
-            <field name="tax_dest_id" ref="tax_import_19_skr03"/>
+            <field name="tax_dest_id" ref="tax_import_19_and_payable_skr03"/>
             <field name="tax_src_id" ref="tax_vst_19_skr03"/>
         </record>
         <record id="account_fiscal_position_tax_non_eu_purchase_services_19_skr03" model="account.fiscal.position.tax.template">
@@ -1066,7 +1193,7 @@
         </record>
         <record id="account_fiscal_position_tax_non_eu_purchase_7_skr03" model="account.fiscal.position.tax.template">
             <field name="position_id" ref="fiscal_position_non_eu_partner_skr03"/>
-            <field name="tax_dest_id" ref="tax_import_7_skr03"/>
+            <field name="tax_dest_id" ref="tax_import_7_and_payable_skr03"/>
             <field name="tax_src_id" ref="tax_vst_7_skr03"/>
         </record>
 
@@ -1138,7 +1265,7 @@
         <record id="account_fiscal_position_account_non_eu_purchase_19_skr03" model="account.fiscal.position.account.template">
             <field name="position_id" ref="fiscal_position_non_eu_partner_skr03"/>
             <field name="account_src_id" ref="account_3400" />
-            <field name="account_dest_id" ref="account_3435" />
+            <field name="account_dest_id" ref="account_3551" />
         </record>
         <record id="account_fiscal_position_acc_non_eu_purchase_services_19_skr03" model="account.fiscal.position.account.template">
             <field name="position_id" ref="fiscal_position_non_eu_partner_service_skr03"/>
@@ -1148,7 +1275,7 @@
         <record id="account_fiscal_position_account_non_eu_purchase_7_skr03" model="account.fiscal.position.account.template">
             <field name="position_id" ref="fiscal_position_non_eu_partner_skr03"/>
             <field name="account_src_id" ref="account_3300" />
-            <field name="account_dest_id" ref="account_3430" />
+            <field name="account_dest_id" ref="account_3557" />
         </record>
         <record id="account_fiscal_position_account_eu_no_id_sale_19_skr03" model="account.fiscal.position.account.template">
             <field name="position_id" ref="fiscal_position_eu_no_id_partner_skr03"/>
@@ -1239,11 +1366,11 @@
             <field name="chart_template_id" ref="l10n_de_chart_template"/>
         </record>
         <record id="account_3066" model="account.account.template">
-            <field name="tax_ids" eval="[(6, 0, [ref('tax_ust_eu_skr03')])]"/>
+            <field name="tax_ids" eval="[(6, 0, [ref('tax_eu_7_purchase_no_vst_skr03')])]"/>
             <field name="chart_template_id" ref="l10n_de_chart_template"/>
         </record>
         <record id="account_3067" model="account.account.template">
-            <field name="tax_ids" eval="[(6, 0, [ref('tax_ust_19_eu_skr03')])]"/>
+            <field name="tax_ids" eval="[(6, 0, [ref('tax_eu_19_purchase_no_vst_skr03')])]"/>
             <field name="chart_template_id" ref="l10n_de_chart_template"/>
         </record>
         <record id="account_3070" model="account.account.template">
@@ -1359,11 +1486,11 @@
             <field name="chart_template_id" ref="l10n_de_chart_template"/>
         </record>
         <record id="account_3430" model="account.account.template">
-            <field name="tax_ids" eval="[(6, 0, [ref('tax_ust_7_skr03')])]"/>
+            <field name="tax_ids" eval="[(6, 0, [ref('tax_eu_7_purchase_no_vst_skr03')])]"/>
             <field name="chart_template_id" ref="l10n_de_chart_template"/>
         </record>
         <record id="account_3435" model="account.account.template">
-            <field name="tax_ids" eval="[(6, 0, [ref('tax_ust_19_skr03')])]"/>
+            <field name="tax_ids" eval="[(6, 0, [ref('tax_eu_19_purchase_no_vst_skr03')])]"/>
             <field name="chart_template_id" ref="l10n_de_chart_template"/>
         </record>
         <record id="account_3440" model="account.account.template">
@@ -1379,17 +1506,21 @@
             <field name="chart_template_id" ref="l10n_de_chart_template"/>
         </record>
         <record id="account_3550" model="account.account.template">
-            <field name="tax_ids" eval="[(6, 0, [ref('tax_free_eu_skr03')])]"/>
+            <field name="tax_ids" eval="[(6, 0, [ref('tax_eu_purchase_tax_free_skr03')])]"/>
             <field name="chart_template_id" ref="l10n_de_chart_template"/>
         </record>
         <record id="account_3551" model="account.account.template">
-            <field name="tax_ids" eval="[(6, 0, [ref('tax_free_eu_skr03')])]"/>
+            <field name="tax_ids" eval="[(6, 0, [ref('tax_import_19_and_payable_skr03')])]"/>
             <field name="chart_template_id" ref="l10n_de_chart_template"/>
         </record>
         <record id="account_3553" model="account.account.template">
             <field name="tax_ids" eval="[(6, 0, [ref('tax_vst_ust_19_purchase_3eck_last_skr03')])]"/>
             <field name="chart_template_id" ref="l10n_de_chart_template"/>
         </record>
+        <record id="account_3557" model="account.account.template">
+            <field name="tax_ids" eval="[(6, 0, [ref('tax_import_7_and_payable_skr03')])]"/>
+            <field name="chart_template_id" ref="l10n_de_chart_template"/>
+        </record>
         <record id="account_3560" model="account.account.template">
             <field name="tax_ids" eval="[(6, 0, [ref('tax_vst_ust_7_purchase_13a_auslagerung_skr03')])]"/>
             <field name="chart_template_id" ref="l10n_de_chart_template"/>
@@ -1546,12 +1677,16 @@
             <field name="tax_ids" eval="[(6, 0, [ref('tax_eu_sale_skr03')])]"/>
             <field name="chart_template_id" ref="l10n_de_chart_template"/>
         </record>
+        <record id="account_8130" model="account.account.template">
+            <field name="tax_ids" eval="[(6, 0, [ref('tax_ust_19_3eck_first_skr03')])]"/>
+            <field name="chart_template_id" ref="l10n_de_chart_template"/>
+        </record>
         <record id="account_8135" model="account.account.template">
             <field name="tax_ids" eval="[(6, 0, [ref('tax_free_newcar_skr03')])]"/>
             <field name="chart_template_id" ref="l10n_de_chart_template"/>
         </record>
         <record id="account_8140" model="account.account.template">
-            <field name="tax_ids" eval="[(6, 0, [ref('tax_free_skr03_ohne_vst')])]"/>
+            <field name="tax_ids" eval="[(6, 0, [ref('tax_free_skr03_mit_vst')])]"/>
             <field name="chart_template_id" ref="l10n_de_chart_template"/>
         </record>
         <record id="account_8150" model="account.account.template">
@@ -1567,7 +1702,7 @@
             <field name="chart_template_id" ref="l10n_de_chart_template"/>
         </record>
         <record id="account_8194" model="account.account.template">
-            <field name="tax_ids" eval="[(6, 0, [ref('tax_free_eu_skr03')])]"/>
+            <field name="tax_ids" eval="[(6, 0, [ref('tax_free_skr03_mit_vst')])]"/>
             <field name="chart_template_id" ref="l10n_de_chart_template"/>
         </record>
         <record id="account_8195" model="account.account.template">
@@ -1583,23 +1718,27 @@
             <field name="chart_template_id" ref="l10n_de_chart_template"/>
         </record>
         <record id="account_8310" model="account.account.template">
-            <field name="tax_ids" eval="[(6, 0, [ref('tax_eu_7_purchase_ust_skr03')])]"/>
+            <field name="tax_ids" eval="[(6, 0, [ref('tax_ust_eu_skr03')])]"/>
             <field name="chart_template_id" ref="l10n_de_chart_template"/>
         </record>
         <record id="account_8315" model="account.account.template">
-            <field name="tax_ids" eval="[(6, 0, [ref('tax_eu_19_purchase_ust_skr03')])]"/>
+            <field name="tax_ids" eval="[(6, 0, [ref('tax_ust_19_eu_skr03')])]"/>
             <field name="chart_template_id" ref="l10n_de_chart_template"/>
         </record>
         <record id="account_8331" model="account.account.template">
-            <field name="tax_ids" eval="[(6, 0, [ref('tax_eu_19_purchase_ust_goods_skr03')])]"/>
+            <field name="tax_ids" eval="[(6, 0, [ref('tax_free_eu_skr03')])]"/>
+            <field name="chart_template_id" ref="l10n_de_chart_template"/>
+        </record>
+        <record id="account_8335" model="account.account.template">
+            <field name="tax_ids" eval="[(6, 0, [ref('tax_ust_free_mobil_skr03')])]"/>
             <field name="chart_template_id" ref="l10n_de_chart_template"/>
         </record>
         <record id="account_8336" model="account.account.template">
-            <field name="tax_ids" eval="[(6, 0, [ref('tax_not_taxable_skr03')])]"/>
+            <field name="tax_ids" eval="[(6, 0, [ref('tax_free_eu_skr03')])]"/>
             <field name="chart_template_id" ref="l10n_de_chart_template"/>
         </record>
         <record id="account_8337" model="account.account.template">
-            <field name="tax_ids" eval="[(6, 0, [ref('tax_eu_19_purchase_ust_goods_skr03')])]"/>
+            <field name="tax_ids" eval="[(6, 0, [ref('tax_ust_free_bau_skr03')])]"/>
             <field name="chart_template_id" ref="l10n_de_chart_template"/>
         </record>
         <record id="account_8338" model="account.account.template">
@@ -1619,11 +1758,11 @@
             <field name="chart_template_id" ref="l10n_de_chart_template"/>
         </record>
         <record id="account_8514" model="account.account.template">
-            <field name="tax_ids" eval="[(6, 0, [ref('tax_free_eu_skr03')])]"/>
+            <field name="tax_ids" eval="[(6, 0, [ref('tax_free_skr03_ohne_vst')])]"/>
             <field name="chart_template_id" ref="l10n_de_chart_template"/>
         </record>
         <record id="account_8515" model="account.account.template">
-            <field name="tax_ids" eval="[(6, 0, [ref('tax_free_eu_skr03')])]"/>
+            <field name="tax_ids" eval="[(6, 0, [ref('tax_free_skr03_mit_vst')])]"/>
             <field name="chart_template_id" ref="l10n_de_chart_template"/>
         </record>
         <record id="account_8516" model="account.account.template">
@@ -1635,11 +1774,11 @@
             <field name="chart_template_id" ref="l10n_de_chart_template"/>
         </record>
         <record id="account_8574" model="account.account.template">
-            <field name="tax_ids" eval="[(6, 0, [ref('tax_free_eu_skr03')])]"/>
+            <field name="tax_ids" eval="[(6, 0, [ref('tax_free_skr03_ohne_vst')])]"/>
             <field name="chart_template_id" ref="l10n_de_chart_template"/>
         </record>
         <record id="account_8575" model="account.account.template">
-            <field name="tax_ids" eval="[(6, 0, [ref('tax_free_eu_skr03')])]"/>
+            <field name="tax_ids" eval="[(6, 0, [ref('tax_free_skr03_mit_vst')])]"/>
             <field name="chart_template_id" ref="l10n_de_chart_template"/>
         </record>
         <record id="account_8576" model="account.account.template">
@@ -1658,6 +1797,10 @@
             <field name="tax_ids" eval="[(6, 0, [ref('tax_ust_19_skr03')])]"/>
             <field name="chart_template_id" ref="l10n_de_chart_template"/>
         </record>
+        <record id="account_8609" model="account.account.template">
+            <field name="tax_ids" eval="[(6, 0, [ref('tax_free_skr03_ohne_vst')])]"/>
+            <field name="chart_template_id" ref="l10n_de_chart_template"/>
+        </record>
         <record id="account_8611" model="account.account.template">
             <field name="tax_ids" eval="[(6, 0, [ref('tax_ust_19_skr03')])]"/>
             <field name="chart_template_id" ref="l10n_de_chart_template"/>
@@ -1674,6 +1817,22 @@
             <field name="tax_ids" eval="[(6, 0, [ref('tax_ust_19_skr03')])]"/>
             <field name="chart_template_id" ref="l10n_de_chart_template"/>
         </record>
+        <record id="account_8701" model="account.account.template">
+            <field name="tax_ids" eval="[(6, 0, [ref('tax_free_skr03_ohne_vst')])]"/>
+            <field name="chart_template_id" ref="l10n_de_chart_template"/>
+        </record>
+        <record id="account_8702" model="account.account.template">
+            <field name="tax_ids" eval="[(6, 0, [ref('tax_free_skr03_mit_vst')])]"/>
+            <field name="chart_template_id" ref="l10n_de_chart_template"/>
+        </record>
+        <record id="account_8703" model="account.account.template">
+            <field name="tax_ids" eval="[(6, 0, [ref('tax_free_skr03_ohne_vst')])]"/>
+            <field name="chart_template_id" ref="l10n_de_chart_template"/>
+        </record>
+        <record id="account_8704" model="account.account.template">
+            <field name="tax_ids" eval="[(6, 0, [ref('tax_free_skr03_mit_vst')])]"/>
+            <field name="chart_template_id" ref="l10n_de_chart_template"/>
+        </record>
         <record id="account_8705" model="account.account.template">
             <field name="tax_ids" eval="[(6, 0, [ref('tax_export_skr03')])]"/>
             <field name="chart_template_id" ref="l10n_de_chart_template"/>
@@ -1691,11 +1850,11 @@
             <field name="chart_template_id" ref="l10n_de_chart_template"/>
         </record>
         <record id="account_8725" model="account.account.template">
-            <field name="tax_ids" eval="[(6, 0, [ref('tax_eu_7_purchase_ust_skr03')])]"/>
+            <field name="tax_ids" eval="[(6, 0, [ref('tax_ust_eu_skr03')])]"/>
             <field name="chart_template_id" ref="l10n_de_chart_template"/>
         </record>
         <record id="account_8726" model="account.account.template">
-            <field name="tax_ids" eval="[(6, 0, [ref('tax_eu_19_purchase_ust_skr03')])]"/>
+            <field name="tax_ids" eval="[(6, 0, [ref('tax_ust_19_eu_skr03')])]"/>
             <field name="chart_template_id" ref="l10n_de_chart_template"/>
         </record>
         <record id="account_8731" model="account.account.template">
@@ -1706,8 +1865,12 @@
             <field name="tax_ids" eval="[(6, 0, [ref('tax_ust_19_skr03')])]"/>
             <field name="chart_template_id" ref="l10n_de_chart_template"/>
         </record>
+        <record id="account_8738" model="account.account.template">
+            <field name="tax_ids" eval="[(6, 0, [ref('tax_vst_ust_19_purchase_13b_mobil_skr03')])]"/>
+            <field name="chart_template_id" ref="l10n_de_chart_template"/>
+        </record>
         <record id="account_8741" model="account.account.template">
-            <field name="tax_ids" eval="[(6, 0, [ref('tax_eu_19_purchase_ust_goods_skr03')])]"/>
+            <field name="tax_ids" eval="[(6, 0, [ref('tax_ust_free_mobil_skr03')])]"/>
             <field name="chart_template_id" ref="l10n_de_chart_template"/>
         </record>
         <record id="account_8742" model="account.account.template">
@@ -1715,11 +1878,11 @@
             <field name="chart_template_id" ref="l10n_de_chart_template"/>
         </record>
         <record id="account_8746" model="account.account.template">
-            <field name="tax_ids" eval="[(6, 0, [ref('tax_eu_7_purchase_ust_skr03')])]"/>
+            <field name="tax_ids" eval="[(6, 0, [ref('tax_ust_eu_skr03')])]"/>
             <field name="chart_template_id" ref="l10n_de_chart_template"/>
         </record>
         <record id="account_8748" model="account.account.template">
-            <field name="tax_ids" eval="[(6, 0, [ref('tax_eu_19_purchase_ust_skr03')])]"/>
+            <field name="tax_ids" eval="[(6, 0, [ref('tax_ust_19_eu_skr03')])]"/>
             <field name="chart_template_id" ref="l10n_de_chart_template"/>
         </record>
         <record id="account_8750" model="account.account.template">
@@ -1747,7 +1910,7 @@
             <field name="chart_template_id" ref="l10n_de_chart_template"/>
         </record>
         <record id="account_8808" model="account.account.template">
-            <field name="tax_ids" eval="[(6, 0, [ref('tax_free_eu_skr03')])]"/>
+            <field name="tax_ids" eval="[(6, 0, [ref('tax_eu_sale_skr03')])]"/>
             <field name="chart_template_id" ref="l10n_de_chart_template"/>
         </record>
         <record id="account_8819" model="account.account.template">
@@ -1759,11 +1922,11 @@
             <field name="chart_template_id" ref="l10n_de_chart_template"/>
         </record>
         <record id="account_8827" model="account.account.template">
-            <field name="tax_ids" eval="[(6, 0, [ref('tax_free_third_country_skr03')])]"/>
+            <field name="tax_ids" eval="[(6, 0, [ref('tax_export_skr03')])]"/>
             <field name="chart_template_id" ref="l10n_de_chart_template"/>
         </record>
         <record id="account_8828" model="account.account.template">
-            <field name="tax_ids" eval="[(6, 0, [ref('tax_free_eu_skr03')])]"/>
+            <field name="tax_ids" eval="[(6, 0, [ref('tax_eu_sale_skr03')])]"/>
             <field name="chart_template_id" ref="l10n_de_chart_template"/>
         </record>
         <record id="account_8850" model="account.account.template">
@@ -1799,7 +1962,7 @@
             <field name="chart_template_id" ref="l10n_de_chart_template"/>
         </record>
         <record id="account_8919" model="account.account.template">
-            <field name="tax_ids" eval="[(6, 0, [ref('tax_free_eu_skr03')])]"/>
+            <field name="tax_ids" eval="[(6, 0, [ref('tax_not_taxable_skr03')])]"/>
             <field name="chart_template_id" ref="l10n_de_chart_template"/>
         </record>
         <record id="account_8920" model="account.account.template">
diff --git a/addons/l10n_de_skr04/data/account.account.template.csv b/addons/l10n_de_skr04/data/account.account.template.csv
index 77734af22050909ed4d58bff6fc5b3e61fbd6d2c..e105eb7e8315b019c6f22c406df1e86072c453c4 100644
--- a/addons/l10n_de_skr04/data/account.account.template.csv
+++ b/addons/l10n_de_skr04/data/account.account.template.csv
@@ -548,7 +548,7 @@
 "chart_skr04_3840","3840","USt laufendes Jahr","l10n_de.tag_de_liabilities_bs_D_8","account.data_account_type_current_liabilities","l10n_de_skr04.l10n_chart_de_skr04",""
 "chart_skr04_3841","3841","USt Vorjahr","l10n_de.tag_de_liabilities_bs_D_8","account.data_account_type_non_current_liabilities","l10n_de_skr04.l10n_chart_de_skr04",""
 "chart_skr04_3845","3845","USt frühere Jahre","l10n_de.tag_de_liabilities_bs_D_8","account.data_account_type_non_current_liabilities","l10n_de_skr04.l10n_chart_de_skr04",""
-"chart_skr04_3850","3850","Aufgeschobene Einfuhrumsatzsteuer","l10n_de.tag_de_liabilities_bs_D_8","account.data_account_type_current_liabilities","l10n_de_skr04.l10n_chart_de_skr04",""
+"chart_skr04_3850","3850","Aufgeschobene Einfuhrumsatzsteuer","l10n_de.tag_de_liabilities_bs_D_8","account.data_account_type_current_liabilities","l10n_de_skr04.l10n_chart_de_skr04","True"
 "chart_skr04_3851","3851","Unrichtig oder unberechtigt ausgewiesene Umsatzsteuer","l10n_de.tag_de_asset_bs_B_II_4","account.data_account_type_current_liabilities","l10n_de_skr04.l10n_chart_de_skr04",""
 "chart_skr04_3854","3854","Steuerzahlungen an andere Länder ","l10n_de.tag_de_liabilities_bs_D_8","account.data_account_type_current_liabilities","l10n_de_skr04.l10n_chart_de_skr04",""
 "chart_skr04_3860","3860","Verbindlichkeiten aus Umsatzsteuer","l10n_de.tag_de_liabilities_bs_D_8","account.data_account_type_current_liabilities","l10n_de_skr04.l10n_chart_de_skr04",""
@@ -588,6 +588,7 @@
 "chart_skr04_4510","4510","Erlöse Abfallverwertung","l10n_de.tag_de_pl_01","account.data_account_type_revenue","l10n_de_skr04.l10n_chart_de_skr04",""
 "chart_skr04_4520","4520","Erlöse Leergut","l10n_de.tag_de_pl_01","account.data_account_type_revenue","l10n_de_skr04.l10n_chart_de_skr04",""
 "chart_skr04_4560","4560","Provisionsumsätze","l10n_de.tag_de_pl_01","account.data_account_type_revenue","l10n_de_skr04.l10n_chart_de_skr04",""
+"chart_skr04_4564","4564","Provisionsumsätze (§4Nr.8ff.UStG)","l10n_de.tag_de_pl_01","account.data_account_type_revenue","l10n_de_skr04.l10n_chart_de_skr04",""
 "chart_skr04_4566","4566","Provisionsumsätze 7 % USt","l10n_de.tag_de_pl_01","account.data_account_type_revenue","l10n_de_skr04.l10n_chart_de_skr04",""
 "chart_skr04_4569","4569","Provisionsumsätze 19 % USt","l10n_de.tag_de_pl_01","account.data_account_type_revenue","l10n_de_skr04.l10n_chart_de_skr04",""
 "chart_skr04_4570","4570","Sonstige Erträge aus Provisionen, Lizenzen und Patenten","l10n_de.tag_de_pl_04","account.data_account_type_revenue","l10n_de_skr04.l10n_chart_de_skr04",""
@@ -726,6 +727,8 @@
 "chart_skr04_5130","5130","Einkauf - Roh-, Hilfs- und Betriebsstoffe 19% Vorsteuer","l10n_de.tag_de_pl_05","account.data_account_type_expenses","l10n_de_skr04.l10n_chart_de_skr04",""
 "chart_skr04_5160","5160","Einkauf - Roh-, Hilfs- und Betriebsstoffe, innergem. Erwerb 7% VSt und 7% USt","l10n_de.tag_de_pl_05","account.data_account_type_expenses","l10n_de_skr04.l10n_chart_de_skr04",""
 "chart_skr04_5162","5162","Einkauf - Roh-, Hilfs- und Betriebsstoffe, innergem. Erwerb 19% VSt und 19% USt","l10n_de.tag_de_pl_05","account.data_account_type_expenses","l10n_de_skr04.l10n_chart_de_skr04",""
+"chart_skr04_5166","5166","Einkauf Roh-, Hilfs- und Betriebsstoffe, innergemeinschaftlicher Erwerb ohne Vorsteuer und 7 % Umsatzsteuer","l10n_de.tag_de_pl_05","account.data_account_type_expenses","l10n_de_skr04.l10n_chart_de_skr04",""
+"chart_skr04_5167","5167","Einkauf Roh-, Hilfs- und Betriebsstoffe, innergemeinschaftlicher Erwerb ohne Vorsteuer und 19 % Umsatzsteuer","l10n_de.tag_de_pl_05","account.data_account_type_expenses","l10n_de_skr04.l10n_chart_de_skr04",""
 "chart_skr04_5189","5189","Erwerb Roh-, Hilfs- und Betriebsstoffe letzter Abnehmer Dreiecksgeschäft","l10n_de.tag_de_pl_05","account.data_account_type_expenses","l10n_de_skr04.l10n_chart_de_skr04",""
 "chart_skr04_5190","5190","Energiestoffe ( Fertigung )","l10n_de.tag_de_pl_05","account.data_account_type_expenses","l10n_de_skr04.l10n_chart_de_skr04",""
 "chart_skr04_5191","5191","Energiestoffe (Fertigung) 7% Vorsteuer","l10n_de.tag_de_pl_05","account.data_account_type_expenses","l10n_de_skr04.l10n_chart_de_skr04",""
@@ -739,7 +742,11 @@
 "chart_skr04_5430","5430","Innergemeinschaftlicher Erwerb ohne Vorsteuerabzug und 7% Umsatzsteuer","","account.data_account_type_expenses","l10n_de_skr04.l10n_chart_de_skr04",""
 "chart_skr04_5435","5435","Innergemeinschaftlicher Erwerb ohne Vorsteuerabzug und 19% Umsatzsteuer","","account.data_account_type_expenses","l10n_de_skr04.l10n_chart_de_skr04",""
 "chart_skr04_5440","5440","innergem. Erwerb Neufahrz. o. UStID 19 % VSt und 19 % USt","l10n_de.tag_de_pl_05","account.data_account_type_expenses","l10n_de_skr04.l10n_chart_de_skr04",""
+"chart_skr04_5550","5550","Steuerfreier EG-Erwerb","l10n_de.tag_de_pl_05","account.data_account_type_expenses","l10n_de_skr04.l10n_chart_de_skr04",""
+"chart_skr04_5551","5551","Wareneingang, im Drittland steuerbar (19%)","l10n_de.tag_de_pl_05","account.data_account_type_expenses","l10n_de_skr04.l10n_chart_de_skr04",""
+"chart_skr04_5552","5552","Erwerb 1. Abnehmer im Dreiecksgeschäft","l10n_de.tag_de_pl_05","account.data_account_type_expenses","l10n_de_skr04.l10n_chart_de_skr04",""
 "chart_skr04_5553","5553","Erwerb Waren als letzter Abnehmer innerhalb Dreiecksgeschäft","l10n_de.tag_de_pl_05","account.data_account_type_expenses","l10n_de_skr04.l10n_chart_de_skr04",""
+"chart_skr04_5557","5557","Wareneingang, im Drittland steuerbar (7%)","l10n_de.tag_de_pl_05","account.data_account_type_expenses","l10n_de_skr04.l10n_chart_de_skr04",""
 "chart_skr04_5559","5559","Steuerfreie Einfuhren","l10n_de.tag_de_pl_05","account.data_account_type_expenses","l10n_de_skr04.l10n_chart_de_skr04",""
 "chart_skr04_5600","5600","Nicht abziehbare Vorsteuer","l10n_de.tag_de_pl_05","account.data_account_type_expenses","l10n_de_skr04.l10n_chart_de_skr04",""
 "chart_skr04_5610","5610","Nicht abziehbare Vorsteuer 7 %","l10n_de.tag_de_pl_05","account.data_account_type_expenses","l10n_de_skr04.l10n_chart_de_skr04",""
diff --git a/addons/l10n_de_skr04/data/account_tax_fiscal_position_data.xml b/addons/l10n_de_skr04/data/account_tax_fiscal_position_data.xml
index 83668698edfe6df3d087b04319ca41cdfeb14f1f..408719aa2dba88cd44f8c11d0c144b47b2214a69 100644
--- a/addons/l10n_de_skr04/data/account_tax_fiscal_position_data.xml
+++ b/addons/l10n_de_skr04/data/account_tax_fiscal_position_data.xml
@@ -77,7 +77,74 @@
             <field name="tag_ids" eval="[(6,0,[ref('l10n_de.tag_de_93')])]"/>
             <field name="tax_group_id" ref="tax_group_0"/>
         </record>
-
+        <record id="tax_eu_19_purchase_ust_no_vst_skr04" model="account.tax.template">
+            <field name="sequence">97</field>
+            <field name="chart_template_id" ref="l10n_chart_de_skr04"/>
+            <field name="name">19% Umsatzsteuer aus innergem. Erwerb (kein Vorsteuerabzug)</field>
+            <field name="description">19% USt innerg. Erw. - 0% Vorsteuer</field>
+            <field name="amount_type">percent</field>
+            <field name="amount">-19</field>
+            <field name="refund_account_id" ref="chart_skr04_3809"/>
+            <field name="account_id" ref="chart_skr04_3809"/>
+            <field name="type_tax_use">none</field>
+            <field name="tag_ids" eval="[(6,0,[ref('l10n_de.tag_de_89')])]"/>
+            <field name="tax_group_id" ref="tax_group_19"/>
+        </record>
+        <record id="tax_eu_19_purchase_vst_no_vst_skr04" model="account.tax.template">
+            <field name="sequence">97</field>
+            <field name="chart_template_id" ref="l10n_chart_de_skr04"/>
+            <field name="name">19% Vorsteuer aus innergem. Erwerb (kein Vorsteuerabzug)</field>
+            <field name="description">19% VSt innerg. Erw. - 0% Vorsteuer</field>
+            <field name="amount_type">percent</field>
+            <field name="amount">19</field>
+            <field name="type_tax_use">none</field>
+            <field name="tax_group_id" ref="tax_group_19"/>
+        </record>
+        <record id="tax_eu_19_purchase_no_vst_skr04" model="account.tax.template">
+            <field name="sequence">20</field>
+            <field name="chart_template_id" ref="l10n_chart_de_skr04"/>
+            <field name="name">Innergem. Erwerb 19%USt/0%VSt</field>
+            <field name="description">innergem. Erwerb 19% - 0% Vorsteuer</field>
+            <field name="amount_type">group</field>
+            <field name="amount">0</field>
+            <field name="type_tax_use">purchase</field>
+            <field name="children_tax_ids" eval="[(6,0,[ref('tax_eu_19_purchase_ust_no_vst_skr04'), ref('tax_eu_19_purchase_vst_no_vst_skr04')])]"/>
+            <field name="tax_group_id" ref="tax_group_19"/>
+        </record>
+        <record id="tax_eu_7_purchase_ust_no_vst_skr04" model="account.tax.template">
+            <field name="sequence">97</field>
+            <field name="chart_template_id" ref="l10n_chart_de_skr04"/>
+            <field name="name">7% Umsatzsteuer aus innergem. Erwerb (kein Vorsteuerabzug)</field>
+            <field name="description">7% USt innerg. Erw. - 0% Vorsteuer</field>
+            <field name="amount_type">percent</field>
+            <field name="amount">-7</field>
+            <field name="refund_account_id" ref="chart_skr04_3809"/>
+            <field name="account_id" ref="chart_skr04_3809"/>
+            <field name="type_tax_use">none</field>
+            <field name="tag_ids" eval="[(6,0,[ref('l10n_de.tag_de_93')])]"/>
+            <field name="tax_group_id" ref="tax_group_7"/>
+        </record>
+        <record id="tax_eu_7_purchase_vst_no_vst_skr04" model="account.tax.template">
+            <field name="sequence">97</field>
+            <field name="chart_template_id" ref="l10n_chart_de_skr04"/>
+            <field name="name">7% Vorsteuer aus innergem. Erwerb (kein Vorsteuerabzug)</field>
+            <field name="description">7% VSt innerg. Erw. - 0% Vorsteuer</field>
+            <field name="amount_type">percent</field>
+            <field name="amount">7</field>
+            <field name="type_tax_use">none</field>
+            <field name="tax_group_id" ref="tax_group_7"/>
+        </record>
+        <record id="tax_eu_7_purchase_no_vst_skr04" model="account.tax.template">
+            <field name="sequence">20</field>
+            <field name="chart_template_id" ref="l10n_chart_de_skr04"/>
+            <field name="name">Innergem. Erwerb 7%USt/0%VSt</field>
+            <field name="description">innergem. Erwerb 7% - 0% Vorsteuer</field>
+            <field name="amount_type">group</field>
+            <field name="amount">0</field>
+            <field name="type_tax_use">purchase</field>
+            <field name="children_tax_ids" eval="[(6,0,[ref('tax_eu_7_purchase_ust_no_vst_skr04'), ref('tax_eu_7_purchase_vst_no_vst_skr04')])]"/>
+            <field name="tax_group_id" ref="tax_group_7"/>
+        </record>
         <record id="tax_eu_car_purchase_ust_skr04" model="account.tax.template">
             <field name="sequence">99</field>
             <field name="chart_template_id" ref="l10n_chart_de_skr04"/>
@@ -161,31 +228,77 @@
             <field name="tax_group_id" ref="tax_group_0"/>
         </record>
         <record id="tax_import_19_skr04" model="account.tax.template">
-            <field name="sequence">20</field>
+            <field name="sequence">98</field>
             <field name="chart_template_id" ref="l10n_chart_de_skr04"/>
-            <field name="name">19% Einfuhrumsatzsteuer</field>
-            <field name="description">19% EUSt</field>
+            <field name="name">19% Einfuhrumsatzsteuer (abzugsf. Vorsteuer)</field>
+            <field name="description">19% EUSt (abzugsf. Vorsteuer)</field>
             <field name="amount_type">percent</field>
             <field name="amount">19</field>
             <field name="refund_account_id" ref="chart_skr04_1433"/>
             <field name="account_id" ref="chart_skr04_1433"/>
-            <field name="type_tax_use">purchase</field>
+            <field name="type_tax_use">none</field>
             <field name="tag_ids" eval="[(6,0,[ref('l10n_de.tag_de_62')])]"/>
             <field name="tax_group_id" ref="tax_group_19"/>
         </record>
-        <record id="tax_import_7_skr04" model="account.tax.template">
+        <record id="tax_import_19_payable_skr04" model="account.tax.template">
+            <field name="sequence">98</field>
+            <field name="chart_template_id" ref="l10n_chart_de_skr04"/>
+            <field name="name">19% Einfuhrumsatzsteuer (zu bezahlender Aufschub)</field>
+            <field name="description">19% EUSt (zu bezahlender Aufschub)</field>
+            <field name="amount_type">percent</field>
+            <field name="amount">-19</field>
+            <field name="refund_account_id" ref="chart_skr04_3850"/>
+            <field name="account_id" ref="chart_skr04_3850"/>
+            <field name="type_tax_use">none</field>
+            <field name="tax_group_id" ref="tax_group_19"/>
+        </record>
+        <record id="tax_import_19_and_payable_skr04" model="account.tax.template">
             <field name="sequence">21</field>
             <field name="chart_template_id" ref="l10n_chart_de_skr04"/>
-            <field name="name">7% Einfuhrumsatzsteuer</field>
-            <field name="description">7% EUSt</field>
+            <field name="name">19% Einfuhrumsatzsteuer (§21 Abs.3 UstG)</field>
+            <field name="description">Einfuhrumsatzsteuer 19%</field>
+            <field name="amount_type">group</field>
+            <field name="amount">0</field>
+            <field name="type_tax_use">purchase</field>
+            <field name="children_tax_ids" eval="[(6,0,[ref('tax_import_19_skr04'), ref('tax_import_19_payable_skr04')])]"/>
+            <field name="tax_group_id" ref="tax_group_19"/>
+        </record>
+        <record id="tax_import_7_skr04" model="account.tax.template">
+            <field name="sequence">98</field>
+            <field name="chart_template_id" ref="l10n_chart_de_skr04"/>
+            <field name="name">7% Einfuhrumsatzsteuer (abzugsf. Vorsteuer)</field>
+            <field name="description">7% EUSt (abzugsf. Vorsteuer)</field>
             <field name="amount_type">percent</field>
             <field name="amount">7</field>
             <field name="refund_account_id" ref="chart_skr04_1433"/>
             <field name="account_id" ref="chart_skr04_1433"/>
-            <field name="type_tax_use">purchase</field>
+            <field name="type_tax_use">none</field>
             <field name="tag_ids" eval="[(6,0,[ref('l10n_de.tag_de_62')])]"/>
             <field name="tax_group_id" ref="tax_group_7"/>
         </record>
+        <record id="tax_import_7_payable_skr04" model="account.tax.template">
+            <field name="sequence">98</field>
+            <field name="chart_template_id" ref="l10n_chart_de_skr04"/>
+            <field name="name">7% Einfuhrumsatzsteuer (zu bezahlender Aufschub)</field>
+            <field name="description">7% EUSt (zu bezahlender Aufschub)</field>
+            <field name="amount_type">percent</field>
+            <field name="amount">-7</field>
+            <field name="refund_account_id" ref="chart_skr04_3850"/>
+            <field name="account_id" ref="chart_skr04_3850"/>
+            <field name="type_tax_use">none</field>
+            <field name="tax_group_id" ref="tax_group_7"/>
+        </record>
+        <record id="tax_import_7_and_payable_skr04" model="account.tax.template">
+            <field name="sequence">21</field>
+            <field name="chart_template_id" ref="l10n_chart_de_skr04"/>
+            <field name="name">7% Einfuhrumsatzsteuer (§21 Abs.3 UstG)</field>
+            <field name="description">Einfuhrumsatzsteuer 7%</field>
+            <field name="amount_type">group</field>
+            <field name="amount">0</field>
+            <field name="type_tax_use">purchase</field>
+            <field name="children_tax_ids" eval="[(6,0,[ref('tax_import_7_skr04'), ref('tax_import_7_payable_skr04')])]"/>
+            <field name="tax_group_id" ref="tax_group_7"/>
+        </record>
         <record id="tax_eu_purchase_tax_free_skr04" model="account.tax.template">
             <field name="sequence">22</field>
             <field name="chart_template_id" ref="l10n_chart_de_skr04"/>
@@ -348,7 +461,7 @@
             <field name="account_id" ref="chart_skr04_1401"/>
             <field name="type_tax_use">purchase</field>
             <field name="tag_ids" eval="[(6,0,[ref('l10n_de.tag_de_66')])]"/>
-            <field name="tax_group_id" ref="tax_group_7"/>            
+            <field name="tax_group_id" ref="tax_group_7"/>
         </record>
         <record id="tax_vst_no_ustpflicht_skr04" model="account.tax.template">
             <field name="sequence">16</field>
@@ -386,7 +499,7 @@
             <field name="type_tax_use">purchase</field>
             <field name="tag_ids" eval="[(6,0,[ref('l10n_de.tag_de_66')])]"/>
             <field name="tax_group_id" ref="tax_group_7"/>
-            <field name="price_include" eval="True"/>            
+            <field name="price_include" eval="True"/>
         </record>
         <record id="tax_vst_55_farmer_skr04" model="account.tax.template">
             <field name="sequence">26</field>
@@ -399,7 +512,7 @@
             <field name="account_id" ref="chart_skr04_1400"/>
             <field name="type_tax_use">purchase</field>
             <field name="tag_ids" eval="[(6,0,[ref('l10n_de.tag_de_66')])]"/>
-            <field name="tax_group_id" ref="tax_group_55"/>            
+            <field name="tax_group_id" ref="tax_group_55"/>
         </record>
         <record id="tax_vst_107_farmer_skr04" model="account.tax.template">
             <field name="sequence">27</field>
@@ -412,7 +525,7 @@
             <field name="account_id" ref="chart_skr04_1400"/>
             <field name="type_tax_use">purchase</field>
             <field name="tag_ids" eval="[(6,0,[ref('l10n_de.tag_de_66')])]"/>
-            <field name="tax_group_id" ref="tax_group_107"/>            
+            <field name="tax_group_id" ref="tax_group_107"/>
         </record>
         <record id="tax_ust_19_eu_skr04" model="account.tax.template">
             <field name="sequence">21</field>
@@ -965,23 +1078,37 @@
             <field name="children_tax_ids" eval="[(6,0,[ref('tax_ust_7_purchase_13a_auslagerung_skr04'), ref('tax_vst_7_purchase_13a_auslagerung_skr04')])]"/>
             <field name="tax_group_id" ref="tax_group_0"/>
         </record>
+        <record id="fiscal_position_domestic_skr04" model="account.fiscal.position.template">
+            <field name="sequence">1</field>
+            <field name="name">Geschäftspartner Inland</field>
+            <field name="chart_template_id" ref="l10n_chart_de_skr04"/>
+            <field name="auto_apply" eval="True" />
+            <field name="country_id" ref="base.de"></field>
+        </record>
         <record id="fiscal_position_non_eu_partner_service_skr04" model="account.fiscal.position.template">
+            <field name="sequence">6</field>
             <field name="chart_template_id" ref="l10n_chart_de_skr04"/>
-            <field name="name">Dienstleister Ausland</field>
+            <field name="name">Dienstleister Ausland (Nicht-EU)</field>
         </record>
         <record id="fiscal_position_non_eu_partner_skr04" model="account.fiscal.position.template">
+            <field name="sequence">5</field>
             <field name="chart_template_id" ref="l10n_chart_de_skr04"/>
-            <field name="name">Geschäftspartner Ausland</field>
+            <field name="name">Geschäftspartner Ausland (Nicht-EU)</field>
         </record>
         <record id="fiscal_position_eu_vat_id_partner_skr04" model="account.fiscal.position.template">
+            <field name="sequence">2</field>
             <field name="chart_template_id" ref="l10n_chart_de_skr04"/>
             <field name="name">Geschäftspartner EU (mit USt-ID)</field>
+            <field name="auto_apply" eval="True" />
+            <field name="country_group_id" ref="base.europe"></field>
         </record>
         <record id="fiscal_position_eu_vat_id_partner_service_skr04" model="account.fiscal.position.template">
+            <field name="sequence">3</field>
             <field name="chart_template_id" ref="l10n_chart_de_skr04"/>
             <field name="name">Dienstleister EU (mit USt-ID)</field>
         </record>
         <record id="fiscal_position_eu_no_id_partner_skr04" model="account.fiscal.position.template">
+            <field name="sequence">4</field>
             <field name="chart_template_id" ref="l10n_chart_de_skr04"/>
             <field name="name">Geschäftspartner EU (ohne USt-ID)</field>
         </record>
@@ -1017,12 +1144,12 @@
         </record>
         <record id="chart_skr04_fiscal_position_tax_eu_no_id_purchase_19_skr04" model="account.fiscal.position.tax.template">
             <field name="position_id" ref="fiscal_position_eu_no_id_partner_skr04"/>
-            <field name="tax_dest_id" ref="tax_import_19_skr04"/>
+            <field name="tax_dest_id" ref="tax_eu_19_purchase_no_vst_skr04"/>
             <field name="tax_src_id" ref="tax_vst_19_skr04"/>
         </record>
         <record id="chart_skr04_fiscal_position_tax_eu_no_id_purchase_7_skr04" model="account.fiscal.position.tax.template">
             <field name="position_id" ref="fiscal_position_eu_no_id_partner_skr04"/>
-            <field name="tax_dest_id" ref="tax_import_7_skr04"/>
+            <field name="tax_dest_id" ref="tax_eu_7_purchase_no_vst_skr04"/>
             <field name="tax_src_id" ref="tax_vst_7_skr04"/>
         </record>
         <record id="chart_skr04_fiscal_position_tax_eu_no_id_sale_19_skr04" model="account.fiscal.position.tax.template">
@@ -1052,7 +1179,7 @@
         </record>
         <record id="chart_skr04_fiscal_position_tax_non_eu_purchase_19_skr04" model="account.fiscal.position.tax.template">
             <field name="position_id" ref="fiscal_position_non_eu_partner_skr04"/>
-            <field name="tax_dest_id" ref="tax_import_19_skr04"/>
+            <field name="tax_dest_id" ref="tax_import_19_and_payable_skr04"/>
             <field name="tax_src_id" ref="tax_vst_19_skr04"/>
         </record>
         <record id="chart_skr04_fiscal_position_tax_non_eu_purchase_services_19_skr04" model="account.fiscal.position.tax.template">
@@ -1062,7 +1189,7 @@
         </record>
         <record id="chart_skr04_fiscal_position_tax_non_eu_purchase_7_skr04" model="account.fiscal.position.tax.template">
             <field name="position_id" ref="fiscal_position_non_eu_partner_skr04"/>
-            <field name="tax_dest_id" ref="tax_import_7_skr04"/>
+            <field name="tax_dest_id" ref="tax_import_7_and_payable_skr04"/>
             <field name="tax_src_id" ref="tax_vst_7_skr04"/>
         </record>
 
@@ -1134,7 +1261,7 @@
         <record id="chart_skr04_fiscal_position_account_non_eu_purchase_19_skr04" model="account.fiscal.position.account.template">
             <field name="position_id" ref="fiscal_position_non_eu_partner_skr04"/>
             <field name="account_src_id" ref="chart_skr04_5400" />
-            <field name="account_dest_id" ref="chart_skr04_5435" />
+            <field name="account_dest_id" ref="chart_skr04_5551" />
         </record>
         <record id="chart_skr04_fiscal_position_acc_non_eu_purchase_services_19_skr04" model="account.fiscal.position.account.template">
             <field name="position_id" ref="fiscal_position_non_eu_partner_service_skr04"/>
@@ -1144,7 +1271,7 @@
         <record id="chart_skr04_fiscal_position_account_non_eu_purchase_7_skr04" model="account.fiscal.position.account.template">
             <field name="position_id" ref="fiscal_position_non_eu_partner_skr04"/>
             <field name="account_src_id" ref="chart_skr04_5300" />
-            <field name="account_dest_id" ref="chart_skr04_5430" />
+            <field name="account_dest_id" ref="chart_skr04_5557" />
         </record>
         <record id="chart_skr04_fiscal_position_account_eu_no_id_sale_19_skr04" model="account.fiscal.position.account.template">
             <field name="position_id" ref="fiscal_position_eu_no_id_partner_skr04"/>
@@ -1201,17 +1328,21 @@
         <record id="chart_skr04_4125" model="account.account.template">
             <field name="tax_ids" eval="[(6, 0, [ref('tax_eu_sale_skr04')])]"/>
             <field name="chart_template_id" ref="l10n_chart_de_skr04"/>
-        </record>   
+        </record>
+        <record id="chart_skr04_4130" model="account.account.template">
+            <field name="tax_ids" eval="[(6, 0, [ref('tax_ust_19_3eck_first_skr04')])]"/>
+            <field name="chart_template_id" ref="l10n_chart_de_skr04"/>
+        </record>
         <record id="chart_skr04_4135" model="account.account.template">
             <field name="tax_ids" eval="[(6, 0, [ref('tax_free_newcar_skr04')])]"/>
             <field name="chart_template_id" ref="l10n_chart_de_skr04"/>
-        </record>   
+        </record>
         <record id="chart_skr04_4139" model="account.account.template">
-            <field name="tax_ids" eval="[(6, 0, [ref('tax_free_eu_skr04')])]"/>
+            <field name="tax_ids" eval="[(6, 0, [ref('tax_free_skr04_mit_vst')])]"/>
             <field name="chart_template_id" ref="l10n_chart_de_skr04"/>
         </record>
         <record id="chart_skr04_4140" model="account.account.template">
-            <field name="tax_ids" eval="[(6, 0, [ref('tax_free_skr04_ohne_vst')])]"/>
+            <field name="tax_ids" eval="[(6, 0, [ref('tax_free_skr04_mit_vst')])]"/>
             <field name="chart_template_id" ref="l10n_chart_de_skr04"/>
         </record>
         <record id="chart_skr04_4150" model="account.account.template">
@@ -1225,7 +1356,7 @@
         <record id="chart_skr04_4165" model="account.account.template">
             <field name="tax_ids" eval="[(6, 0, [ref('tax_free_skr04_ohne_vst')])]"/>
             <field name="chart_template_id" ref="l10n_chart_de_skr04"/>
-        </record>   
+        </record>
         <record id="chart_skr04_4185" model="account.account.template">
             <field name="tax_ids" eval="[(6, 0, [ref('tax_free_eu_skr04')])]"/>
             <field name="chart_template_id" ref="l10n_chart_de_skr04"/>
@@ -1243,11 +1374,15 @@
             <field name="chart_template_id" ref="l10n_chart_de_skr04"/>
         </record>
         <record id="chart_skr04_4310" model="account.account.template">
-            <field name="tax_ids" eval="[(6, 0, [ref('tax_eu_7_purchase_ust_skr04')])]"/>
+            <field name="tax_ids" eval="[(6, 0, [ref('tax_ust_eu_skr04')])]"/>
             <field name="chart_template_id" ref="l10n_chart_de_skr04"/>
         </record>
         <record id="chart_skr04_4315" model="account.account.template">
-            <field name="tax_ids" eval="[(6, 0, [ref('tax_eu_19_purchase_skr04')])]"/>
+            <field name="tax_ids" eval="[(6, 0, [ref('tax_ust_19_eu_skr04')])]"/>
+            <field name="chart_template_id" ref="l10n_chart_de_skr04"/>
+        </record>
+        <record id="chart_skr04_4331" model="account.account.template">
+            <field name="tax_ids" eval="[(6, 0, [ref('tax_free_eu_skr04')])]"/>
             <field name="chart_template_id" ref="l10n_chart_de_skr04"/>
         </record>
         <record id="chart_skr04_4336" model="account.account.template">
@@ -1255,7 +1390,7 @@
             <field name="chart_template_id" ref="l10n_chart_de_skr04"/>
         </record>
         <record id="chart_skr04_4337" model="account.account.template">
-            <field name="tax_ids" eval="[(6, 0, [ref('tax_eu_19_purchase_ust_goods_skr04')])]"/>
+            <field name="tax_ids" eval="[(6, 0, [ref('tax_ust_free_bau_skr04')])]"/>
             <field name="chart_template_id" ref="l10n_chart_de_skr04"/>
         </record>
         <record id="chart_skr04_4338" model="account.account.template">
@@ -1278,6 +1413,10 @@
             <field name="tax_ids" eval="[(6, 0, [ref('tax_ust_19_skr04')])]"/>
             <field name="chart_template_id" ref="l10n_chart_de_skr04"/>
         </record>
+        <record id="chart_skr04_4564" model="account.account.template">
+            <field name="tax_ids" eval="[(6, 0, [ref('tax_free_skr04_ohne_vst')])]"/>
+            <field name="chart_template_id" ref="l10n_chart_de_skr04"/>
+        </record>
         <record id="chart_skr04_4566" model="account.account.template">
             <field name="tax_ids" eval="[(6, 0, [ref('tax_ust_7_skr04')])]"/>
             <field name="chart_template_id" ref="l10n_chart_de_skr04"/>
@@ -1291,11 +1430,11 @@
             <field name="chart_template_id" ref="l10n_chart_de_skr04"/>
         </record>
         <record id="chart_skr04_4574" model="account.account.template">
-            <field name="tax_ids" eval="[(6, 0, [ref('tax_free_eu_skr04')])]"/>
+            <field name="tax_ids" eval="[(6, 0, [ref('tax_free_skr04_ohne_vst')])]"/>
             <field name="chart_template_id" ref="l10n_chart_de_skr04"/>
         </record>
         <record id="chart_skr04_4575" model="account.account.template">
-            <field name="tax_ids" eval="[(6, 0, [ref('tax_free_eu_skr04')])]"/>
+            <field name="tax_ids" eval="[(6, 0, [ref('tax_free_skr04_mit_vst')])]"/>
             <field name="chart_template_id" ref="l10n_chart_de_skr04"/>
         </record>
         <record id="chart_skr04_4576" model="account.account.template">
@@ -1323,7 +1462,7 @@
             <field name="chart_template_id" ref="l10n_chart_de_skr04"/>
         </record>
         <record id="chart_skr04_4630" model="account.account.template">
-            <field name="tax_ids" eval="[(6, 0, [ref('tax_ust_7_skr04')])]"/>
+            <field name="tax_ids" eval="[(6, 0, [ref('tax_not_taxable_skr04')])]"/>
             <field name="chart_template_id" ref="l10n_chart_de_skr04"/>
         </record>
         <record id="chart_skr04_4639" model="account.account.template">
@@ -1378,6 +1517,14 @@
             <field name="tax_ids" eval="[(6, 0, [ref('tax_not_taxable_skr04')])]"/>
             <field name="chart_template_id" ref="l10n_chart_de_skr04"/>
         </record>
+        <record id="chart_skr04_4702" model="account.account.template">
+            <field name="tax_ids" eval="[(6, 0, [ref('tax_free_skr04_mit_vst')])]"/>
+            <field name="chart_template_id" ref="l10n_chart_de_skr04"/>
+        </record>
+        <record id="chart_skr04_4704" model="account.account.template">
+            <field name="tax_ids" eval="[(6, 0, [ref('tax_free_skr04_mit_vst')])]"/>
+            <field name="chart_template_id" ref="l10n_chart_de_skr04"/>
+        </record>
         <record id="chart_skr04_4705" model="account.account.template">
             <field name="tax_ids" eval="[(6, 0, [ref('tax_export_skr04')])]"/>
             <field name="chart_template_id" ref="l10n_chart_de_skr04"/>
@@ -1395,11 +1542,11 @@
             <field name="chart_template_id" ref="l10n_chart_de_skr04"/>
         </record>
         <record id="chart_skr04_4725" model="account.account.template">
-            <field name="tax_ids" eval="[(6, 0, [ref('tax_eu_7_purchase_ust_skr04')])]"/>
+            <field name="tax_ids" eval="[(6, 0, [ref('tax_ust_eu_skr04')])]"/>
             <field name="chart_template_id" ref="l10n_chart_de_skr04"/>
         </record>
         <record id="chart_skr04_4726" model="account.account.template">
-            <field name="tax_ids" eval="[(6, 0, [ref('tax_eu_19_purchase_skr04')])]"/>
+            <field name="tax_ids" eval="[(6, 0, [ref('tax_ust_19_eu_skr04')])]"/>
             <field name="chart_template_id" ref="l10n_chart_de_skr04"/>
         </record>
         <record id="chart_skr04_4731" model="account.account.template">
@@ -1411,7 +1558,7 @@
             <field name="chart_template_id" ref="l10n_chart_de_skr04"/>
         </record>
         <record id="chart_skr04_4741" model="account.account.template">
-            <field name="tax_ids" eval="[(6, 0, [ref('tax_eu_19_purchase_ust_goods_skr04')])]"/>
+            <field name="tax_ids" eval="[(6, 0, [ref('tax_ust_free_mobil_skr04')])]"/>
             <field name="chart_template_id" ref="l10n_chart_de_skr04"/>
         </record>
         <record id="chart_skr04_4742" model="account.account.template">
@@ -1419,11 +1566,11 @@
             <field name="chart_template_id" ref="l10n_chart_de_skr04"/>
         </record>
         <record id="chart_skr04_4746" model="account.account.template">
-            <field name="tax_ids" eval="[(6, 0, [ref('tax_eu_7_purchase_ust_skr04')])]"/>
+            <field name="tax_ids" eval="[(6, 0, [ref('tax_ust_eu_skr04')])]"/>
             <field name="chart_template_id" ref="l10n_chart_de_skr04"/>
         </record>
         <record id="chart_skr04_4748" model="account.account.template">
-            <field name="tax_ids" eval="[(6, 0, [ref('tax_eu_19_purchase_skr04')])]"/>
+            <field name="tax_ids" eval="[(6, 0, [ref('tax_ust_19_eu_skr04')])]"/>
             <field name="chart_template_id" ref="l10n_chart_de_skr04"/>
         </record>
         <record id="chart_skr04_4750" model="account.account.template">
@@ -1433,7 +1580,7 @@
         <record id="chart_skr04_4760" model="account.account.template">
             <field name="tax_ids" eval="[(6, 0, [ref('tax_ust_19_skr04')])]"/>
             <field name="chart_template_id" ref="l10n_chart_de_skr04"/>
-        </record>   
+        </record>
         <record id="chart_skr04_4780" model="account.account.template">
             <field name="tax_ids" eval="[(6, 0, [ref('tax_ust_7_skr04')])]"/>
             <field name="chart_template_id" ref="l10n_chart_de_skr04"/>
@@ -1441,7 +1588,7 @@
         <record id="chart_skr04_4790" model="account.account.template">
             <field name="tax_ids" eval="[(6, 0, [ref('tax_ust_19_skr04')])]"/>
             <field name="chart_template_id" ref="l10n_chart_de_skr04"/>
-        </record>   
+        </record>
         <record id="chart_skr04_4836" model="account.account.template">
             <field name="tax_ids" eval="[(6, 0, [ref('tax_ust_19_skr04')])]"/>
             <field name="chart_template_id" ref="l10n_chart_de_skr04"/>
@@ -1455,7 +1602,7 @@
             <field name="chart_template_id" ref="l10n_chart_de_skr04"/>
         </record>
         <record id="chart_skr04_4844" model="account.account.template">
-            <field name="tax_ids" eval="[(6, 0, [ref('tax_free_third_country_skr04')])]"/>
+            <field name="tax_ids" eval="[(6, 0, [ref('tax_export_skr04')])]"/>
             <field name="chart_template_id" ref="l10n_chart_de_skr04"/>
         </record>
         <record id="chart_skr04_4845" model="account.account.template">
@@ -1463,7 +1610,7 @@
             <field name="chart_template_id" ref="l10n_chart_de_skr04"/>
         </record>
         <record id="chart_skr04_4848" model="account.account.template">
-            <field name="tax_ids" eval="[(6, 0, [ref('tax_free_eu_skr04')])]"/>
+            <field name="tax_ids" eval="[(6, 0, [ref('tax_eu_sale_skr04')])]"/>
             <field name="chart_template_id" ref="l10n_chart_de_skr04"/>
         </record>
         <record id="chart_skr04_4852" model="account.account.template">
@@ -1510,10 +1657,18 @@
             <field name="tax_ids" eval="[(6, 0, [ref('tax_eu_19_purchase_skr04')])]"/>
             <field name="chart_template_id" ref="l10n_chart_de_skr04"/>
         </record>
+        <record id="chart_skr04_5166" model="account.account.template">
+            <field name="tax_ids" eval="[(6, 0, [ref('tax_eu_7_purchase_no_vst_skr04')])]"/>
+            <field name="chart_template_id" ref="l10n_chart_de_skr04"/>
+        </record>
+        <record id="chart_skr04_5167" model="account.account.template">
+            <field name="tax_ids" eval="[(6, 0, [ref('tax_eu_19_purchase_no_vst_skr04')])]"/>
+            <field name="chart_template_id" ref="l10n_chart_de_skr04"/>
+        </record>
         <record id="chart_skr04_5189" model="account.account.template">
             <field name="tax_ids" eval="[(6, 0, [ref('tax_vst_ust_19_purchase_3eck_last_skr04')])]"/>
             <field name="chart_template_id" ref="l10n_chart_de_skr04"/>
-        </record>       
+        </record>
         <record id="chart_skr04_5191" model="account.account.template">
             <field name="tax_ids" eval="[(6, 0, [ref('tax_vst_7_skr04')])]"/>
             <field name="chart_template_id" ref="l10n_chart_de_skr04"/>
@@ -1521,11 +1676,11 @@
         <record id="chart_skr04_5192" model="account.account.template">
             <field name="tax_ids" eval="[(6, 0, [ref('tax_vst_19_skr04')])]"/>
             <field name="chart_template_id" ref="l10n_chart_de_skr04"/>
-        </record>       
+        </record>
         <record id="chart_skr04_5300" model="account.account.template">
             <field name="tax_ids" eval="[(6, 0, [ref('tax_vst_7_skr04')])]"/>
             <field name="chart_template_id" ref="l10n_chart_de_skr04"/>
-        </record>       
+        </record>
         <record id="chart_skr04_5400" model="account.account.template">
             <field name="tax_ids" eval="[(6, 0, [ref('tax_vst_19_skr04')])]"/>
             <field name="chart_template_id" ref="l10n_chart_de_skr04"/>
@@ -1539,17 +1694,25 @@
             <field name="chart_template_id" ref="l10n_chart_de_skr04"/>
         </record>
         <record id="chart_skr04_5430" model="account.account.template">
-            <field name="tax_ids" eval="[(6, 0, [ref('tax_ust_7_skr04')])]"/>
+            <field name="tax_ids" eval="[(6, 0, [ref('tax_eu_7_purchase_no_vst_skr04')])]"/>
             <field name="chart_template_id" ref="l10n_chart_de_skr04"/>
         </record>
         <record id="chart_skr04_5435" model="account.account.template">
-            <field name="tax_ids" eval="[(6, 0, [ref('tax_ust_19_skr04')])]"/>
+            <field name="tax_ids" eval="[(6, 0, [ref('tax_eu_19_purchase_no_vst_skr04')])]"/>
             <field name="chart_template_id" ref="l10n_chart_de_skr04"/>
         </record>
         <record id="chart_skr04_5440" model="account.account.template">
             <field name="tax_ids" eval="[(6, 0, [ref('tax_eu_car_purchase_skr04')])]"/>
             <field name="chart_template_id" ref="l10n_chart_de_skr04"/>
         </record>
+        <record id="chart_skr04_5550" model="account.account.template">
+            <field name="tax_ids" eval="[(6, 0, [ref('tax_eu_purchase_tax_free_skr04')])]"/>
+            <field name="chart_template_id" ref="l10n_chart_de_skr04"/>
+        </record>
+        <record id="chart_skr04_5551" model="account.account.template">
+            <field name="tax_ids" eval="[(6, 0, [ref('tax_import_19_and_payable_skr04')])]"/>
+            <field name="chart_template_id" ref="l10n_chart_de_skr04"/>
+        </record>
         <record id="chart_skr04_5553" model="account.account.template">
             <field name="tax_ids" eval="[(6, 0, [ref('tax_vst_ust_19_purchase_3eck_last_skr04')])]"/>
             <field name="chart_template_id" ref="l10n_chart_de_skr04"/>
@@ -1585,11 +1748,11 @@
         <record id="chart_skr04_5725" model="account.account.template">
             <field name="tax_ids" eval="[(6, 0, [ref('tax_eu_19_purchase_skr04')])]"/>
             <field name="chart_template_id" ref="l10n_chart_de_skr04"/>
-        </record>       
+        </record>
         <record id="chart_skr04_5731" model="account.account.template">
             <field name="tax_ids" eval="[(6, 0, [ref('tax_vst_7_skr04')])]"/>
             <field name="chart_template_id" ref="l10n_chart_de_skr04"/>
-        </record>       
+        </record>
         <record id="chart_skr04_5734" model="account.account.template">
             <field name="tax_ids" eval="[(6, 0, [ref('tax_vst_7_skr04')])]"/>
             <field name="chart_template_id" ref="l10n_chart_de_skr04"/>
@@ -1609,11 +1772,11 @@
         <record id="chart_skr04_5743" model="account.account.template">
             <field name="tax_ids" eval="[(6, 0, [ref('tax_eu_7_purchase_skr04')])]"/>
             <field name="chart_template_id" ref="l10n_chart_de_skr04"/>
-        </record>       
+        </record>
         <record id="chart_skr04_5750" model="account.account.template">
             <field name="tax_ids" eval="[(6, 0, [ref('tax_vst_7_skr04')])]"/>
             <field name="chart_template_id" ref="l10n_chart_de_skr04"/>
-        </record>       
+        </record>
         <record id="chart_skr04_5754" model="account.account.template">
             <field name="tax_ids" eval="[(6, 0, [ref('tax_vst_7_skr04')])]"/>
             <field name="chart_template_id" ref="l10n_chart_de_skr04"/>
@@ -1625,11 +1788,11 @@
         <record id="chart_skr04_5760" model="account.account.template">
             <field name="tax_ids" eval="[(6, 0, [ref('tax_vst_19_skr04')])]"/>
             <field name="chart_template_id" ref="l10n_chart_de_skr04"/>
-        </record>       
+        </record>
         <record id="chart_skr04_5780" model="account.account.template">
             <field name="tax_ids" eval="[(6, 0, [ref('tax_vst_7_skr04')])]"/>
             <field name="chart_template_id" ref="l10n_chart_de_skr04"/>
-        </record>       
+        </record>
         <record id="chart_skr04_5784" model="account.account.template">
             <field name="tax_ids" eval="[(6, 0, [ref('tax_vst_7_skr04')])]"/>
             <field name="chart_template_id" ref="l10n_chart_de_skr04"/>
@@ -1649,7 +1812,7 @@
         <record id="chart_skr04_5792" model="account.account.template">
             <field name="tax_ids" eval="[(6, 0, [ref('tax_vst_ust_19_purchase_3eck_last_skr04')])]"/>
             <field name="chart_template_id" ref="l10n_chart_de_skr04"/>
-        </record>       
+        </record>
         <record id="chart_skr04_5794" model="account.account.template">
             <field name="tax_ids" eval="[(6, 0, [ref('tax_vst_55_farmer_skr04')])]"/>
             <field name="chart_template_id" ref="l10n_chart_de_skr04"/>
@@ -1669,7 +1832,7 @@
         <record id="chart_skr04_5908" model="account.account.template">
             <field name="tax_ids" eval="[(6, 0, [ref('tax_vst_7_skr04')])]"/>
             <field name="chart_template_id" ref="l10n_chart_de_skr04"/>
-        </record>       
+        </record>
         <record id="chart_skr04_5910" model="account.account.template">
             <field name="tax_ids" eval="[(6, 0, [ref('tax_ust_vst_7_purchase_13b_bau_skr04')])]"/>
             <field name="chart_template_id" ref="l10n_chart_de_skr04"/>
@@ -1693,7 +1856,7 @@
         <record id="chart_skr04_5925" model="account.account.template">
             <field name="tax_ids" eval="[(6, 0, [ref('tax_vst_ust_19_purchase_13b_werk_ausland_skr04')])]"/>
             <field name="chart_template_id" ref="l10n_chart_de_skr04"/>
-        </record>       
+        </record>
         <record id="chart_skr04_5951" model="account.account.template">
             <field name="tax_ids" eval="[(6, 0, [ref('tax_vst_ust_19_purchase_13b_werk_ausland_skr04')])]"/>
             <field name="chart_template_id" ref="l10n_chart_de_skr04"/>
@@ -1721,13 +1884,13 @@
             <field name="chart_template_id" ref="l10n_chart_de_skr04"/>
         </record>
         <record id="chart_skr04_6888" model="account.account.template">
-            <field name="tax_ids" eval="[(6, 0, [ref('tax_free_eu_skr04')])]"/>
+            <field name="tax_ids" eval="[(6, 0, [ref('tax_eu_sale_skr04')])]"/>
             <field name="chart_template_id" ref="l10n_chart_de_skr04"/>
         </record>
         <record id="chart_skr04_6892" model="account.account.template">
             <field name="tax_ids" eval="[(6, 0, [ref('tax_free_skr04_ohne_vst')])]"/>
             <field name="chart_template_id" ref="l10n_chart_de_skr04"/>
-        </record>   
+        </record>
         <record id="chart_skr04_6931" model="account.account.template">
             <field name="tax_ids" eval="[(6, 0, [ref('tax_ust_7_skr04')])]"/>
             <field name="chart_template_id" ref="l10n_chart_de_skr04"/>
@@ -1747,5 +1910,5 @@
         <record id="chart_skr04_6938" model="account.account.template">
             <field name="tax_ids" eval="[(6, 0, [ref('tax_ust_19_eu_skr04')])]"/>
             <field name="chart_template_id" ref="l10n_chart_de_skr04"/>
-        </record>       
+        </record>
 </odoo>
diff --git a/addons/l10n_fr_pos_cert/models/__init__.py b/addons/l10n_fr_pos_cert/models/__init__.py
index 76de40a9e62a2eab30bbb61f86649cb4e6e39dec..33657992e1c62b19f686d591bee29cc05a0c41b5 100644
--- a/addons/l10n_fr_pos_cert/models/__init__.py
+++ b/addons/l10n_fr_pos_cert/models/__init__.py
@@ -1,5 +1,6 @@
 # -*- coding: utf-8 -*-
 # Part of Odoo. See LICENSE file for full copyright and licensing details.
 from . import account_bank_statement
+from . import account_fiscal_position
 from . import res_company
 from . import pos
diff --git a/addons/l10n_fr_pos_cert/models/account_fiscal_position.py b/addons/l10n_fr_pos_cert/models/account_fiscal_position.py
new file mode 100644
index 0000000000000000000000000000000000000000..71b4b12155a08a912ad9d4864ec99965160dd9a5
--- /dev/null
+++ b/addons/l10n_fr_pos_cert/models/account_fiscal_position.py
@@ -0,0 +1,19 @@
+# -*- coding: utf-8 -*-
+
+from odoo import _, models
+from odoo.exceptions import UserError
+
+
+class AccountFiscalPosition(models.Model):
+    _inherit = "account.fiscal.position"
+
+    def write(self, vals):
+        if "tax_ids" in vals:
+            if self.env["pos.order"].sudo().search_count([("fiscal_position_id", "in", self.ids)]):
+                raise UserError(
+                    _(
+                        "You cannot modify a fiscal position used in a POS order. "
+                        + "You should archive it and create a new one."
+                    )
+                )
+        return super(AccountFiscalPosition, self).write(vals)
diff --git a/addons/l10n_ua/__init__.py b/addons/l10n_ua/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..cacb7c956973b41ece51e6aaf4c1c07dd3d5382e
--- /dev/null
+++ b/addons/l10n_ua/__init__.py
@@ -0,0 +1,3 @@
+# -*- coding: utf-8 -*-
+# Part of Odoo. See LICENSE file for full copyright and licensing details.
+# Copyright (C) 2019 Bohdan Lisnenko <bohdan.lisnenko@erp.co.ua>, ERP Ukraine
diff --git a/addons/l10n_ua/__manifest__.py b/addons/l10n_ua/__manifest__.py
new file mode 100644
index 0000000000000000000000000000000000000000..b2f451de461bba2a6c57ce796bafa1a458b3cd48
--- /dev/null
+++ b/addons/l10n_ua/__manifest__.py
@@ -0,0 +1,25 @@
+# -*- coding: utf-8 -*-
+# Part of Odoo. See LICENSE file for full copyright and licensing details.
+# Copyright (C) 2019 Bohdan Lisnenko <bohdan.lisnenko@erp.co.ua>, ERP Ukraine
+
+{
+    'name': 'Ukraine - Accounting',
+    'author': 'ERP Ukraine',
+    'website': 'https://erp.co.ua',
+    'version': '1.3',
+    'description': """
+Ukraine - Chart of accounts.
+============================
+    """,
+    'category': 'Localization',
+    'depends': ['account'],
+    'data': [
+        'data/account_chart_template.xml',
+        'data/account.account.template.csv',
+        'data/account_account_tag_data.xml',
+        'data/account_tax_tag_data.xml',
+        'data/account_tax_group_data.xml',
+        'data/account_tax_template.xml',
+        'data/account_chart_template_config.xml',
+    ],
+}
diff --git a/addons/l10n_ua/data/account.account.template.csv b/addons/l10n_ua/data/account.account.template.csv
new file mode 100644
index 0000000000000000000000000000000000000000..14471cfa3201315cf5bf06150eff51c2948e9260
--- /dev/null
+++ b/addons/l10n_ua/data/account.account.template.csv
@@ -0,0 +1,406 @@
+"id","code","name","user_type_id:id","reconcile","chart_template_id:id"
+"ua_psbp_100",100,"Інвестиційна нерухомість","account.data_account_type_fixed_assets",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_101",101,"Земельні ділянки","account.data_account_type_fixed_assets",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_102",102,"Капітальні витрати на поліпшення  земель","account.data_account_type_fixed_assets",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_103",103,"Будинки та споруди","account.data_account_type_fixed_assets",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_104",104,"Машини та обладнання","account.data_account_type_fixed_assets",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_105",105,"Транспортні засоби","account.data_account_type_fixed_assets",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_106",106,"Інструменти, прилади та інвентар","account.data_account_type_fixed_assets",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_107",107,"Тварини","account.data_account_type_fixed_assets",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_108",108,"Багаторічні насадження","account.data_account_type_fixed_assets",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_1091",1091,"Інші основні засоби","account.data_account_type_fixed_assets",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_1092",1092,"Основні засоби призначені для продажу","account.data_account_type_fixed_assets",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_111",111,"Бібліотечні фонди","account.data_account_type_fixed_assets",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_112",112,"Малоцінні необоротні матеріальні активи","account.data_account_type_fixed_assets",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_113",113,"Тимчасові (нетитульні) споруди","account.data_account_type_fixed_assets",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_114",114,"Природні ресурси","account.data_account_type_fixed_assets",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_115",115,"Інвентарна тара","account.data_account_type_fixed_assets",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_116",116,"Предмети прокату","account.data_account_type_fixed_assets",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_1171",1171,"Інші необоротні матеріальні активи","account.data_account_type_fixed_assets",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_1172",1172,"Необоротні матеріальні активи призначені для продажу","account.data_account_type_fixed_assets",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_121",121,"Права користування природними ресурсами","account.data_account_type_fixed_assets",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_122",122,"Права користування майном","account.data_account_type_fixed_assets",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_123",123,"Права на комерційні позначення","account.data_account_type_fixed_assets",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_124",124,"Права на об’єкти промислової власності","account.data_account_type_fixed_assets",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_125",125,"Авторське право та суміжні з ним права","account.data_account_type_fixed_assets",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_127",127,"Інші нематеріальні активи","account.data_account_type_fixed_assets",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_131",131,"Знос основних засобів","account.data_account_type_depreciation",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_132",132,"Знос інших необоротних матеріальних активів","account.data_account_type_depreciation",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_133",133,"Накопичена амортизацiя нематеріальних активів","account.data_account_type_depreciation",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_134",134,"Накопичена амортизація довгострокових біологічних активів","account.data_account_type_depreciation",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_135",135,"Знос інвестиційної нерухомості","account.data_account_type_depreciation",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_141",141,"Інвестиції пов’язаним сторонам за методом обліку участі в капіталі","account.data_account_type_fixed_assets",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_142",142,"Інші інвестиції пов’язаним сторонам","account.data_account_type_fixed_assets",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_143",143,"Інвестиції непов’язаним сторонам","account.data_account_type_fixed_assets",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_151",151,"Капітальне будівництво","account.data_account_type_fixed_assets",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_1521",1521,"Придбання основних засобів","account.data_account_type_fixed_assets",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_1522",1522,"Виготовлення та модернізація основних засобів","account.data_account_type_fixed_assets",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_1531",1531,"Придбання  інших необоротних матеріальних активів","account.data_account_type_fixed_assets",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_1532",1532,"Виготовлення та модернізація інших необоротних матеріальних активів","account.data_account_type_fixed_assets",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_1541",1541,"Придбання нематеріальних активів","account.data_account_type_fixed_assets",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_1542",1542,"Виготовлення нематеріальних активів","account.data_account_type_fixed_assets",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_155",155,"Придбання (вирощування) довгострокових біологічних активів","account.data_account_type_fixed_assets",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_161",161,"Довгострокові біологічні активи рослинництва, які оцінені за справедливою вартістю","account.data_account_type_fixed_assets",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_162",162,"Довгострокові біологічні активи рослинництва, які оцінені за первісною вартістю","account.data_account_type_fixed_assets",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_163",163,"Довгострокові біологічні активи тваринництва, які оцінені за справедливою вартістю","account.data_account_type_fixed_assets",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_164",164,"Довгострокові біологічні активи тваринництва, які оцінені за первісною вартістю","account.data_account_type_fixed_assets",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_165",165,"Незрілі довгострокові біологічні активи, які оцінюються за справедливою вартістю","account.data_account_type_fixed_assets",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_166",166,"Незрілі довгострокові біологічні активи, які оцінюються за первісною вартістю","account.data_account_type_fixed_assets",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_17",17,"Відстрочені податкові активи","account.data_account_type_fixed_assets",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_181",181,"Заборгованість за майно, що передано у фінансову оренду","account.data_account_type_fixed_assets",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_182",182,"Довгострокові векселі одержані","account.data_account_type_fixed_assets",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_183",183,"Інша дебіторська заборгованість","account.data_account_type_fixed_assets",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_184",184,"Інші необоротні активи","account.data_account_type_fixed_assets",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_191",191,"Гудвіл при придбаннi","account.data_account_type_fixed_assets",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_192",192,"Негативный гудвил","account.data_account_type_fixed_assets",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_193",193,"Гудвіл при приватизації (корпоратизації)","account.data_account_type_fixed_assets",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_200",200,"Транспортно-заготівельні витрати (матеріали)","account.data_account_type_current_assets",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_201",201,"Сировина й матеріали","account.data_account_type_current_assets",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_202",202,"Купівельні напівфабрикати та комплектуючі вироби","account.data_account_type_current_assets",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_203",203,"Паливо","account.data_account_type_current_assets",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_204",204,"Тара й тарні матеріали","account.data_account_type_current_assets",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_205",205,"Будівельні матеріали","account.data_account_type_current_assets",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_206",206,"Матеріали, передані в переробку","account.data_account_type_current_assets",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_207",207,"Запасні частини","account.data_account_type_current_assets",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_208",208,"Матеріали сільськогосподарського призначення","account.data_account_type_current_assets",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_209",209,"Інші матеріали","account.data_account_type_current_assets",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_211",211,"Поточні біологічні активи рослинництва, які оцінені за справедливою вартістю","account.data_account_type_current_assets",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_212",212,"Поточні біологічні активи тваринництва, які оцінені за справедливою вартістю","account.data_account_type_current_assets",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_213",213,"Поточні біологічні активи тваринництва, які оцінені за первісною вартістю","account.data_account_type_current_assets",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_22",22,"Малоцінні та швидкозношувані предмети","account.data_account_type_current_assets",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_231",231,"Основне виробництво","account.data_account_type_current_assets",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_232",232,"Допоміжні виробництва","account.data_account_type_current_assets",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_233",233,"Обслуговуючі виробництва","account.data_account_type_current_assets",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_234",234,"Давальницьке виробництво","account.data_account_type_current_assets",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_235",235,"Обслуговування і ремонт необоротних активів","account.data_account_type_current_assets",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_238",238,"Незавершені будівельні контракти","account.data_account_type_current_assets",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_239",239,"Проміжні рахунки","account.data_account_type_current_assets",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_24",24,"Брак у виробництві","account.data_account_type_current_assets",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_25",25,"Напівфабрикати","account.data_account_type_current_assets",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_26",26,"Готова продукція","account.data_account_type_current_assets",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_27",27,"Продукція сільськогосподарського виробництва","account.data_account_type_current_assets",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_280",280,"Транспортно-заготівельні витрати","account.data_account_type_current_assets",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_281",281,"Товари на складі","account.data_account_type_current_assets",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_2811",2811,"Товари відвантажені зі складу","account.data_account_type_current_assets",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_2812",2812,"Товари отримані на склад","account.data_account_type_current_liabilities",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_282",282,"Товари в торгівлі (за продажною вартістю)","account.data_account_type_current_assets",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_283",283,"Товари на комісії","account.data_account_type_current_assets",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_284",284,"Тара під товарами","account.data_account_type_current_assets",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_285",285,"Торгова націнка","account.data_account_type_current_assets",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_286",286,"Необоротні активи та групи вибуття, утримувані для продажу","account.data_account_type_current_assets",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_289",289,"Товари в торгівлі (за покупною вартістю)","account.data_account_type_current_assets",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_311",311,"Поточні рахунки в національній валюті","account.data_account_type_liquidity",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_312",312,"Поточні рахунки в іноземній валюті","account.data_account_type_liquidity",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_313",313,"Інші рахунки в банку в національній валюті","account.data_account_type_liquidity",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_314",314,"Інші рахунки в банку в іноземній валюті","account.data_account_type_liquidity",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_315",315,"Спеціальні рахунки в національній валюті","account.data_account_type_liquidity",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_316",316,"Спеціальні рахунки в іноземній валюті","account.data_account_type_liquidity",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_331",331,"Грошові документи в національній валюті","account.data_account_type_liquidity",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_332",332,"Грошові документи в іноземній валюті","account.data_account_type_liquidity",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_333",333,"Грошові кошти в дорозі в національній валюті","account.data_account_type_liquidity",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_334",334,"Грошові кошти в дорозі в іноземній валюті","account.data_account_type_liquidity",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_335",335,"Електронні гроші, номіновані в національній валюті","account.data_account_type_liquidity",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_341",341,"Короткострокові векселі, одержані в національній валюті","account.data_account_type_liquidity",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_342",342,"Короткострокові векселі, одержані в іноземній валюті","account.data_account_type_liquidity",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_3511",3511,"Еквіваленти грошових коштів (у національній валюті)","account.data_account_type_liquidity",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_3512",3512,"Еквіваленти грошових коштів (в іноземній валюті)","account.data_account_type_liquidity",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_352",352,"Інші поточні фінансові інвестиції","account.data_account_type_liquidity",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_361",361,"Розрахунки з вітчизняними покупцями","account.data_account_type_receivable",TRUE,"l10n_ua_psbo_chart_template"
+"ua_psbp_362",362,"Розрахунки з іноземними покупцями","account.data_account_type_receivable",TRUE,"l10n_ua_psbo_chart_template"
+"ua_psbp_363",363,"Розрахунки з учасниками ПФГ","account.data_account_type_receivable",TRUE,"l10n_ua_psbo_chart_template"
+"ua_psbp_364",364,"Розрахунки по гарантійному забезпеченню","account.data_account_type_receivable",TRUE,"l10n_ua_psbo_chart_template"
+"ua_psbp_365",365,"Розрахунки з роздрібними покупцями","account.data_account_type_receivable",TRUE,"l10n_ua_psbo_chart_template"
+"ua_psbp_3711",3711,"Розрахунки за виданими авансами (в національній валюті)","account.data_account_type_receivable",TRUE,"l10n_ua_psbo_chart_template"
+"ua_psbp_3712",3712,"Розрахунки за виданими авансами (в іноземній валюті)","account.data_account_type_receivable",TRUE,"l10n_ua_psbo_chart_template"
+"ua_psbp_3721",3721,"Розрахунки з підзвітними особами в національній валюті","account.data_account_type_receivable",TRUE,"l10n_ua_psbo_chart_template"
+"ua_psbp_3722",3722,"Розрахунки з підзвітними особами в іноземній валюті","account.data_account_type_receivable",TRUE,"l10n_ua_psbo_chart_template"
+"ua_psbp_373",373,"Розрахунки за нарахованими доходами","account.data_account_type_receivable",TRUE,"l10n_ua_psbo_chart_template"
+"ua_psbp_374",374,"Розрахунки за претензіями","account.data_account_type_receivable",TRUE,"l10n_ua_psbo_chart_template"
+"ua_psbp_375",375,"Розрахунки за відшкодуванням завданих збитків","account.data_account_type_receivable",TRUE,"l10n_ua_psbo_chart_template"
+"ua_psbp_376",376,"Розрахунки за позиками членам кредитних спілок","account.data_account_type_receivable",TRUE,"l10n_ua_psbo_chart_template"
+"ua_psbp_3771",3771,"Розрахунки з іншими дебіторами (в національній валюті)","account.data_account_type_receivable",TRUE,"l10n_ua_psbo_chart_template"
+"ua_psbp_3772",3772,"Розрахунки з іншими дебіторами (в іноземній валюті)","account.data_account_type_receivable",TRUE,"l10n_ua_psbo_chart_template"
+"ua_psbp_3773",3773,"Розрахунки з робітниками та службовцями по інших операціях","account.data_account_type_payable",TRUE,"l10n_ua_psbo_chart_template"
+"ua_psbp_378",378,"Розрахунки з державними цільовими фондами","account.data_account_type_receivable",TRUE,"l10n_ua_psbo_chart_template"
+"ua_psbp_379",379,"Розрахунки по операціям з дериватимами","account.data_account_type_receivable",TRUE,"l10n_ua_psbo_chart_template"
+"ua_psbp_381",381,"По заборгованості за товари, роботи, послуги","account.data_account_type_receivable",TRUE,"l10n_ua_psbo_chart_template"
+"ua_psbp_382",382,"По заборгованості за розрахунки з бюджетом","account.data_account_type_receivable",TRUE,"l10n_ua_psbo_chart_template"
+"ua_psbp_383",383,"По заборгованості за розрахунки за виданими авансами","account.data_account_type_receivable",TRUE,"l10n_ua_psbo_chart_template"
+"ua_psbp_384",384,"По заборгованості за розрахунки за нарахованими доходами","account.data_account_type_receivable",TRUE,"l10n_ua_psbo_chart_template"
+"ua_psbp_385",385,"По заборгованості за внутрішні розрахунки","account.data_account_type_receivable",TRUE,"l10n_ua_psbo_chart_template"
+"ua_psbp_386",386,"По іншій дебіторській заборгованості","account.data_account_type_receivable",TRUE,"l10n_ua_psbo_chart_template"
+"ua_psbp_39",39,"Витрати майбутніх періодів","account.data_account_type_non_current_liabilities",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_401",401,"Статутний капітал","account.data_account_type_equity",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_402",402,"Пайовий капітал","account.data_account_type_equity",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_403",403,"Інший зареєстрований капітал","account.data_account_type_equity",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_404",404,"Внески до незареєстрованого статутного капіталу","account.data_account_type_equity",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_411",411,"Дооцінка (уцінка) основних засобів","account.data_account_type_equity",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_412",412,"Дооцінка (уцінка) нематеріальних активів","account.data_account_type_equity",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_413",413,"Дооцінка (уцінка) фінансових інструментів","account.data_account_type_equity",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_414",414,"Інший капітал у дооцінках","account.data_account_type_equity",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_421",421,"Емісійний дохід","account.data_account_type_equity",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_422",422,"Інший  вкладений капітал","account.data_account_type_equity",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_423",423,"Накопичені курсові різниці","account.data_account_type_equity",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_424",424,"Безоплатно одержані необоротні активи","account.data_account_type_equity",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_425",425,"Інший додатковий капітал","account.data_account_type_equity",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_43",43,"Резервний капітал","account.data_account_type_equity",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_441",441,"Прибуток нерозподілений","account.data_account_type_equity",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_442",442,"Непокриті збитки","account.data_account_type_equity",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_443",443,"Прибуток, використаний у звітному періоді","account.data_account_type_equity",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_451",451,"Вилучені акції","account.data_account_type_equity",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_452",452,"Вилучені вклади й паї","account.data_account_type_equity",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_453",453,"Інший вилучений капітал","account.data_account_type_equity",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_46",46,"Неоплачений капітал","account.data_account_type_equity",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_471",471,"Забезпечення виплат відпусток","account.data_account_type_equity",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_472",472,"Додаткове пенсійне забезпечення","account.data_account_type_equity",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_473",473,"Забезпечення гарантійних зобов’язань","account.data_account_type_equity",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_474",474,"Забезпечення інших витрат і платежів","account.data_account_type_equity",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_475",475,"Забезпечення, пов'язане з інвестиційною діяльністю","account.data_account_type_equity",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_476",476,"Забезпечення, пов'язане з фінансовою діяльністю","account.data_account_type_equity",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_477",477,"Забезпечення матеріального заохочення","account.data_account_type_equity",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_478",478,"Забезпечення відновлення земельних ділянок","account.data_account_type_equity",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_481",481,"Кошти, що вилучено з під оподаткування","account.data_account_type_equity",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_482",482,"Кошти з бюджету та державних цільових фондів","account.data_account_type_equity",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_483",483,"Бланодійна допомога","account.data_account_type_equity",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_484",484,"Інші кошти цільового фінансування","account.data_account_type_equity",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_491",491,"Технічні резерви","account.data_account_type_equity",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_492",492,"Резерви із страхування життя","account.data_account_type_equity",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_493",493,"Частка перестраховиків у технічних резервах","account.data_account_type_equity",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_494",494,"Частка перестраховиків у резервах із страхування життя","account.data_account_type_equity",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_495",495,"Результат зміни технічних резервів","account.data_account_type_equity",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_496",496,"Результат зміни резервів із страхування життя","account.data_account_type_equity",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_501",501,"Довгострокові кредити банків у національній валюті","account.data_account_type_non_current_liabilities",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_502",502,"Довгострокові кредити банків в іноземній валюті","account.data_account_type_non_current_liabilities",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_503",503,"Відстрочені довгострокові кредити банків у національній валюті","account.data_account_type_non_current_liabilities",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_504",504,"Відстрочені довгострокові кредити банків в іноземній валюті","account.data_account_type_non_current_liabilities",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_505",505,"Інші довгострокові позики в національній валюті","account.data_account_type_non_current_liabilities",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_506",506,"Інші довгострокові позики в іноземній валюті","account.data_account_type_non_current_liabilities",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_511",511,"Довгострокові векселі, видані в національній валюті","account.data_account_type_non_current_liabilities",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_512",512,"Довгострокові векселі, видані в іноземній валюті","account.data_account_type_non_current_liabilities",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_521",521,"Зобов’язання за облігаціями","account.data_account_type_non_current_liabilities",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_522",522,"Премія за випущеними облігаціями","account.data_account_type_non_current_liabilities",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_523",523,"Дисконт за випущеними облігаціями","account.data_account_type_non_current_liabilities",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_531",531,"Зобов’язання з фінансової оренди","account.data_account_type_non_current_liabilities",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_532",532,"Зобов’язання з оренди цілісних майнових комплексів","account.data_account_type_non_current_liabilities",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_54",54,"Відстрочені податкові зобов’язання","account.data_account_type_non_current_liabilities",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_55",55,"Інші довгострокові зобов’язання","account.data_account_type_non_current_liabilities",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_601",601,"Короткострокові кредити банків у національній валюті","account.data_account_type_current_liabilities",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_602",602,"Короткострокові кредити банків в іноземній валюті","account.data_account_type_current_liabilities",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_603",603,"Відстрочені короткострокові кредити банків у національній валюті","account.data_account_type_current_liabilities",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_604",604,"Відстрочені короткострокові кредити банків в іноземній валюті","account.data_account_type_current_liabilities",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_605",605,"Прострочені позики в національній валюті","account.data_account_type_current_liabilities",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_606",606,"Прострочені позики в іноземній валюті","account.data_account_type_current_liabilities",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_611",611,"Поточна заборгованість за довгостроковими зобов’язаннями в національній валюті","account.data_account_type_current_liabilities",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_612",612,"Поточна заборгованість за довгостроковими зобов’язаннями в іноземній валюті","account.data_account_type_current_liabilities",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_621",621,"Короткострокові векселі, видані в національній валюті","account.data_account_type_current_liabilities",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_622",622,"Короткострокові векселі, видані в іноземній валюті","account.data_account_type_current_liabilities",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_631",631,"Розрахунки з вітчизняними постачальниками","account.data_account_type_payable",TRUE,"l10n_ua_psbo_chart_template"
+"ua_psbp_632",632,"Розрахунки з іноземними постачальниками","account.data_account_type_payable",TRUE,"l10n_ua_psbo_chart_template"
+"ua_psbp_633",633,"Розрахунки з учасниками ПФГ","account.data_account_type_payable",TRUE,"l10n_ua_psbo_chart_template"
+"ua_psbp_6411",6411,"Розрахунки за ПДФО","account.data_account_type_payable",TRUE,"l10n_ua_psbo_chart_template"
+"ua_psbp_6412",6412,"Розрахунки за ПДВ","account.data_account_type_payable",TRUE,"l10n_ua_psbo_chart_template"
+"ua_psbp_64121",64121,"Розрахунки за ПДВ в системі ЕА ПДВ","account.data_account_type_payable",TRUE,"l10n_ua_psbo_chart_template"
+"ua_psbp_64122",64122,"Залишок на лицьовомцу рахунку з ПДВ після 01.02.2015 року","account.data_account_type_payable",TRUE,"l10n_ua_psbo_chart_template"
+"ua_psbp_64123",64123,"Від’ємний залишок з ПДВ до 01.02.2015 року","account.data_account_type_payable",TRUE,"l10n_ua_psbo_chart_template"
+"ua_psbp_6413",6413,"Розрахунки за податком на прибуток","account.data_account_type_payable",TRUE,"l10n_ua_psbo_chart_template"
+"ua_psbp_6414",6414,"Розрахунки по єдиному податку","account.data_account_type_payable",TRUE,"l10n_ua_psbo_chart_template"
+"ua_psbp_6415",6415,"Розрахунки по військовому збору","account.data_account_type_payable",TRUE,"l10n_ua_psbo_chart_template"
+"ua_psbp_6416",6416,"Розрахунки за акцизом","account.data_account_type_payable",TRUE,"l10n_ua_psbo_chart_template"
+"ua_psbp_642",642,"Розрахунки по обов’язкових платежах","account.data_account_type_payable",TRUE,"l10n_ua_psbo_chart_template"
+"ua_psbp_6431",6431,"Податкові зобов’язання","account.data_account_type_current_liabilities",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_6432",6432,"Податкові зобов’язання непідтверджені","account.data_account_type_current_liabilities",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_6433",6433,"Коригування податкових зобов’язань","account.data_account_type_current_liabilities",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_6434",6434,"Податкові зобов’язання (роздріб)","account.data_account_type_current_liabilities",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_6435",6435,"Умовний продаж","account.data_account_type_current_liabilities",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_6441",6441,"Податковий кредит","account.data_account_type_current_liabilities",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_6442",6442,"Податковий кредит непідтверджений","account.data_account_type_current_liabilities",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_6443",6443,"Коригування податкового кредиту","account.data_account_type_current_liabilities",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_651",651,"За розрахунками із загальнообов'язкового державного соціального страхування","account.data_account_type_payable",TRUE,"l10n_ua_psbo_chart_template"
+"ua_psbp_652",652,"За соціальним страхуванням","account.data_account_type_payable",TRUE,"l10n_ua_psbo_chart_template"
+"ua_psbp_653",653,"За страхуванням на випадок безробіття (не використовується)","account.data_account_type_payable",TRUE,"l10n_ua_psbo_chart_template"
+"ua_psbp_654",654,"За індивідуальним страхуванням","account.data_account_type_payable",TRUE,"l10n_ua_psbo_chart_template"
+"ua_psbp_655",655,"За страхуванням майна","account.data_account_type_payable",TRUE,"l10n_ua_psbo_chart_template"
+"ua_psbp_656",656,"За страхуванням від нещасних випадків","account.data_account_type_payable",TRUE,"l10n_ua_psbo_chart_template"
+"ua_psbp_661",661,"Розрахунки за заробітною платою","account.data_account_type_payable",TRUE,"l10n_ua_psbo_chart_template"
+"ua_psbp_662",662,"Розрахунки з депонентами","account.data_account_type_payable",TRUE,"l10n_ua_psbo_chart_template"
+"ua_psbp_663",663,"Розрахунки за іншими виплатами","account.data_account_type_payable",TRUE,"l10n_ua_psbo_chart_template"
+"ua_psbp_671",671,"Розрахунки за нарахованими дивідендами","account.data_account_type_payable",TRUE,"l10n_ua_psbo_chart_template"
+"ua_psbp_672",672,"Розрахунки за іншими виплатами","account.data_account_type_payable",TRUE,"l10n_ua_psbo_chart_template"
+"ua_psbp_680",680,"Розрахунки, пов'язані з необоротними активами та групами вибуття, утримуваними для продажу","account.data_account_type_payable",TRUE,"l10n_ua_psbo_chart_template"
+"ua_psbp_6811",6811,"Розрахунки за авансами одержаними в національній валюті","account.data_account_type_payable",TRUE,"l10n_ua_psbo_chart_template"
+"ua_psbp_6812",6812,"Розрахунки за авансами одержаними в іноземній валюті","account.data_account_type_payable",TRUE,"l10n_ua_psbo_chart_template"
+"ua_psbp_682",682,"Внутрішні розрахунки","account.data_account_type_payable",TRUE,"l10n_ua_psbo_chart_template"
+"ua_psbp_683",683,"Внутрішньогосподарські розрахунки","account.data_account_type_payable",TRUE,"l10n_ua_psbo_chart_template"
+"ua_psbp_684",684,"Розрахунки за нарахованими відсотками","account.data_account_type_payable",TRUE,"l10n_ua_psbo_chart_template"
+"ua_psbp_6851",6851,"Розрахунки з іншими кредиторами (в національній валюті)","account.data_account_type_payable",TRUE,"l10n_ua_psbo_chart_template"
+"ua_psbp_6852",6852,"Розрахунки з іншими кредиторами (в іноземній валюті)","account.data_account_type_payable",TRUE,"l10n_ua_psbo_chart_template"
+"ua_psbp_6853",6853,"Розрахунки по виконавчих листах","account.data_account_type_payable",TRUE,"l10n_ua_psbo_chart_template"
+"ua_psbp_69",69,"Доходи майбутніх періодів","account.data_account_type_revenue",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_701",701,"Дохід від реалізації готової продукції","account.data_account_type_revenue",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_702",702,"Дохід від реалізації товарів","account.data_account_type_revenue",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_703",703,"Дохід від реалізації робіт і послуг","account.data_account_type_revenue",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_704",704,"Вирахування з доходу","account.data_account_type_revenue",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_705",705,"Перестрахування","account.data_account_type_revenue",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_7091",7091,"Дохід від роздрібного продажу","account.data_account_type_revenue",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_7092",7092,"Вирахування з доходу від роздрібного продажу","account.data_account_type_revenue",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_710",710,"Дохід від первісного визнання та від зміни вартості активів, які обліковуються за справедливою вартістю","account.data_account_type_revenue",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_711",711,"Дохід від купівлі-продажу іноземної валюти","account.data_account_type_revenue",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_712",712,"Дохід від реалізації інших оборотних активів","account.data_account_type_revenue",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_713",713,"Дохід від операційної оренди активів","account.data_account_type_revenue",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_714",714,"Дохід від операційної курсової різниці","account.data_account_type_revenue",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_715",715,"Одержані штрафи, пені, неустойки","account.data_account_type_revenue",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_716",716,"Відшкодування раніше списаних активів","account.data_account_type_revenue",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_717",717,"Дохід від списання кредиторської заборгованості","account.data_account_type_revenue",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_718",718,"Дохiд вiд безоплатно одержаних оборотних активiв","account.data_account_type_revenue",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_719",719,"Інші доходи від операційної діяльності","account.data_account_type_revenue",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_721",721,"Дохід від інвестицій в асоційовані підприємства","account.data_account_type_revenue",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_722",722,"Дохід від спільної діяльності","account.data_account_type_revenue",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_723",723,"Дохід від інвестицій в дочірні підприємства","account.data_account_type_revenue",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_731",731,"Дивіденди одержані","account.data_account_type_revenue",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_732",732,"Відсотки одержані","account.data_account_type_revenue",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_733",733,"Інші доходи від фінансових операцій","account.data_account_type_revenue",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_740",740,"Дохід від зміни вартості фінансових інструментів","account.data_account_type_revenue",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_741",741,"Дохід від реалізації фінансових інвестицій","account.data_account_type_revenue",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_742",742,"Дохід від відновлення корисності активів","account.data_account_type_revenue",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_743",743,"Доход от реализации имущественных комплексов","account.data_account_type_revenue",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_744",744,"Дохід від неопераційної курсової різниці","account.data_account_type_revenue",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_745",745,"Дохід від безоплатно одержаних активів","account.data_account_type_revenue",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_746",746,"Інші доходи","account.data_account_type_revenue",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_751",751,"Відшкодування збитків від надзвичайних подій","account.data_account_type_revenue",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_752",752,"Інші надзвичайні доходи","account.data_account_type_revenue",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_76",76,"Страхові платежі","account.data_account_type_revenue",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_791",791,"Результат операцiйної діяльності","account.data_account_type_revenue",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_792",792,"Результат фінансових операцій","account.data_account_type_revenue",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_793",793,"Результат іншої звичайної діяльності","account.data_account_type_revenue",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_794",794,"(не використовується) Результат надзвичайних подій","account.data_account_type_revenue",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_801",801,"Витрати сировини й матеріалів","account.data_account_type_expenses",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_802",802,"Витрати купівельних напівфабрикатів та комплектуючих виробів","account.data_account_type_expenses",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_803",803,"Витрати палива й енергії","account.data_account_type_expenses",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_804",804,"Витрати тари й тарних матеріалів","account.data_account_type_expenses",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_805",805,"Витрати будівельних матеріалів","account.data_account_type_expenses",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_806",806,"Витрати запасних частин","account.data_account_type_expenses",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_807",807,"Витрати матеріалів сільськогосподарського призначення","account.data_account_type_expenses",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_808",808,"Витрати товарів","account.data_account_type_expenses",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_809",809,"Інші матеріальні витрати","account.data_account_type_expenses",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_811",811,"Виплати за окладами й тарифами","account.data_account_type_expenses",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_812",812,"Премії та заохочення","account.data_account_type_expenses",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_813",813,"Компенсаційні виплати","account.data_account_type_expenses",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_814",814,"Оплата відпусток","account.data_account_type_expenses",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_815",815,"Оплата іншого невідпрацьованого часу","account.data_account_type_expenses",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_816",816,"Інші витрати на оплату праці","account.data_account_type_expenses",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_821",821,"Відрахування на загальнообов'язкове державне соціальне страхування","account.data_account_type_expenses",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_822",822,"Відрахування на соціальне страхування (не використовується)","account.data_account_type_expenses",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_823",823,"Страхування на випадок безробіття (не використовується)","account.data_account_type_expenses",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_824",824,"Відрахування на індивідуальне страхування","account.data_account_type_expenses",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_831",831,"Амортизація основних засобів","account.data_account_type_expenses",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_832",832,"Амортизація інших необоротних матеріальних активів","account.data_account_type_expenses",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_833",833,"Амортизація нематеріальних активів","account.data_account_type_expenses",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_84",84,"Інші операційні витрати","account.data_account_type_expenses",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_851",851,"Інші затрати за елементами, податок на прибуток","account.data_account_type_expenses",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_852",852,"(не використовується) Інші затрати за елементами, надзвичайні затрати","account.data_account_type_expenses",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_901",901,"Собівартість реалізованої  готової продукції","account.data_account_type_direct_costs",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_902",902,"Собівартість реалізованих товарів","account.data_account_type_direct_costs",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_903",903,"Собівартість реалізованих робіт і послуг","account.data_account_type_direct_costs",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_904",904,"Страховi виплати","account.data_account_type_direct_costs",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_91",91,"Загальновиробничі витрати","account.data_account_type_expenses",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_92",92,"Адміністративні витрати","account.data_account_type_expenses",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_93",93,"Витрати на збут","account.data_account_type_expenses",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_940",940,"Витрати від первісного визнання та від зміни вартості активів, які обліковуються за справедливою вартістю","account.data_account_type_expenses",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_941",941,"Витрати на дослідження і розробки","account.data_account_type_expenses",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_942",942,"Витрати на купівлю-продаж іноземної валюти","account.data_account_type_expenses",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_943",943,"Собівартість реалізованих виробничих запасів","account.data_account_type_expenses",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_944",944,"Сумнівні та безнадійні борги","account.data_account_type_expenses",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_945",945,"Втрати від операційної курсової різниці","account.data_account_type_expenses",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_946",946,"Втрати від знецінення запасів","account.data_account_type_expenses",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_947",947,"Нестачі і втрати від псування цінностей","account.data_account_type_expenses",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_948",948,"Визнані штрафи, пені, неустойки","account.data_account_type_expenses",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_949",949,"Інші витрати операційної діяльності","account.data_account_type_expenses",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_951",951,"Відсотки за кредит","account.data_account_type_expenses",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_952",952,"Інші фінансові витрати","account.data_account_type_expenses",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_961",961,"Втрати від інвестицій в асоційовані підприємства","account.data_account_type_expenses",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_962",962,"Втрати від спільної діяльності","account.data_account_type_expenses",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_963",963,"Втрати від інвестицій в дочірні підприємства","account.data_account_type_expenses",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_970",970,"Витрати від зміни вартості фінансових інструментів","account.data_account_type_expenses",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_971",971,"Собівартість реалізованих фінансових інвестицій","account.data_account_type_expenses",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_972",972,"Втрати від зменшення корисності активів","account.data_account_type_expenses",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_973",973,"Себестоимость реализованных имущественных комплексов","account.data_account_type_expenses",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_974",974,"Втрати від неопераційних курсових різниць","account.data_account_type_expenses",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_975",975,"Уцінка необоротних активів і фінансових інвестицій","account.data_account_type_expenses",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_976",976,"Списання необоротних активів","account.data_account_type_expenses",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_977",977,"Інші витрати діяльності","account.data_account_type_expenses",FALSE,"l10n_ua_psbo_chart_template"
+"ua_psbp_981",981,"Податок на прибуток від усіх видів діяльності","account.data_account_type_expenses",FALSE,"l10n_ua_psbo_chart_template"
+"ua_ias_1000",1000,"Назви брендів","account.data_account_type_fixed_assets",FALSE,"l10n_ua_ias_chart_template"
+"ua_ias_1001",1001,"Заголовки та назви видань","account.data_account_type_fixed_assets",FALSE,"l10n_ua_ias_chart_template"
+"ua_ias_1002",1002,"Комп’ютерне програмне забезпечення","account.data_account_type_fixed_assets",FALSE,"l10n_ua_ias_chart_template"
+"ua_ias_1003",1003,"Ліцензії та привілеї","account.data_account_type_fixed_assets",FALSE,"l10n_ua_ias_chart_template"
+"ua_ias_1004",1004,"Авторські права, патенти, та інші права","account.data_account_type_fixed_assets",FALSE,"l10n_ua_ias_chart_template"
+"ua_ias_1005",1005,"Нематеріальні активи на етапі розробки","account.data_account_type_fixed_assets",FALSE,"l10n_ua_ias_chart_template"
+"ua_ias_1009",1009,"Амортизація нематеріальних активів","account.data_account_type_depreciation",FALSE,"l10n_ua_ias_chart_template"
+"ua_ias_1010",1010,"Земля","account.data_account_type_fixed_assets",FALSE,"l10n_ua_ias_chart_template"
+"ua_ias_1011",1011,"Будівлі","account.data_account_type_fixed_assets",FALSE,"l10n_ua_ias_chart_template"
+"ua_ias_1012",1012,"Машини та обладнання","account.data_account_type_fixed_assets",FALSE,"l10n_ua_ias_chart_template"
+"ua_ias_1013",1013,"Автомобілі","account.data_account_type_fixed_assets",FALSE,"l10n_ua_ias_chart_template"
+"ua_ias_1014",1014,"Меблі та приладдя","account.data_account_type_fixed_assets",FALSE,"l10n_ua_ias_chart_template"
+"ua_ias_1015",1015,"Офісне обладнання","account.data_account_type_fixed_assets",FALSE,"l10n_ua_ias_chart_template"
+"ua_ias_1019",1019,"Амортизація основних засобів","account.data_account_type_depreciation",FALSE,"l10n_ua_ias_chart_template"
+"ua_ias_1020",1020,"Гудвіл","account.data_account_type_fixed_assets",FALSE,"l10n_ua_ias_chart_template"
+"ua_ias_1030",1030,"Біологічні активи","account.data_account_type_fixed_assets",FALSE,"l10n_ua_ias_chart_template"
+"ua_ias_1040",1040,"Інвестиції","account.data_account_type_fixed_assets",FALSE,"l10n_ua_ias_chart_template"
+"ua_ias_1100",1100,"Запаси (Склад)","account.data_account_type_current_assets",FALSE,"l10n_ua_ias_chart_template"
+"ua_ias_1101",1101,"Незавершене виробництво","account.data_account_type_current_assets",FALSE,"l10n_ua_ias_chart_template"
+"ua_ias_1102",1102,"Готова продукція","account.data_account_type_current_assets",FALSE,"l10n_ua_ias_chart_template"
+"ua_ias_1120",1120,"Дебіторська заборгованість за товари та послуги","account.data_account_type_receivable",TRUE,"l10n_ua_ias_chart_template"
+"ua_ias_1121",1121,"Відвантажено зі складу без рахунку-фактури","account.data_account_type_current_assets",FALSE,"l10n_ua_ias_chart_template"
+"ua_ias_1130",1130,"Аванси партнерам","account.data_account_type_payable",TRUE,"l10n_ua_ias_chart_template"
+"ua_ias_1131",1131,"Інші оборотні активи","account.data_account_type_payable",TRUE,"l10n_ua_ias_chart_template"
+"ua_ias_1140",1140,"Податковий кредит по ПДВ","account.data_account_type_current_assets",FALSE,"l10n_ua_ias_chart_template"
+"ua_ias_1141",1141,"Аванс по податку на прибуток","account.data_account_type_payable",TRUE,"l10n_ua_ias_chart_template"
+"ua_ias_1142",1142,"Кошти на СЕА ПДВ","account.data_account_type_payable",TRUE,"l10n_ua_ias_chart_template"
+"ua_ias_1143",1143,"Переплата по лицьовому рахунку з ПДВ","account.data_account_type_current_assets",FALSE,"l10n_ua_ias_chart_template"
+"ua_ias_1144",1144,"Аванс по ЄСВ","account.data_account_type_payable",TRUE,"l10n_ua_ias_chart_template"
+"ua_ias_1150",1150,"Короткострокові фінансові інвестиції","account.data_account_type_current_assets",FALSE,"l10n_ua_ias_chart_template"
+"ua_ias_1160",1160,"Довгострокові інвестиції","account.data_account_type_non_current_assets",FALSE,"l10n_ua_ias_chart_template"
+"ua_ias_1170",1170,"Довгострокова дебіторська заборгованість","account.data_account_type_non_current_assets",FALSE,"l10n_ua_ias_chart_template"
+"ua_ias_1180",1180,"Відстрочені податкові активи","account.data_account_type_non_current_assets",FALSE,"l10n_ua_ias_chart_template"
+"ua_ias_1200",1200,"Кредиторська заборгованість за товари та послуги","account.data_account_type_payable",TRUE,"l10n_ua_ias_chart_template"
+"ua_ias_1201",1201,"Отримано на склад без рахунку-фактури","account.data_account_type_current_liabilities",FALSE,"l10n_ua_ias_chart_template"
+"ua_ias_1202",1202,"Податок на прибуток","account.data_account_type_payable",TRUE,"l10n_ua_ias_chart_template"
+"ua_ias_1203",1203,"ПДВ","account.data_account_type_payable",TRUE,"l10n_ua_ias_chart_template"
+"ua_ias_1204",1204,"Податкові зобов’язання по ПДВ","account.data_account_type_current_liabilities",FALSE,"l10n_ua_ias_chart_template"
+"ua_ias_1205",1205,"ПДФО","account.data_account_type_payable",TRUE,"l10n_ua_ias_chart_template"
+"ua_ias_12051",12051,"Військовий збір","account.data_account_type_payable",TRUE,"l10n_ua_ias_chart_template"
+"ua_ias_1206",1206,"ЄСВ","account.data_account_type_payable",TRUE,"l10n_ua_ias_chart_template"
+"ua_ias_1207",1207,"Інші податки","account.data_account_type_payable",TRUE,"l10n_ua_ias_chart_template"
+"ua_ias_1208",1208,"Заробітна плата та винагороди","account.data_account_type_payable",TRUE,"l10n_ua_ias_chart_template"
+"ua_ias_1210",1210,"Аванси одержані від покупців та замовників","account.data_account_type_receivable",TRUE,"l10n_ua_ias_chart_template"
+"ua_ias_1220",1220,"Інші короткострокові зобов’язання","account.data_account_type_current_liabilities",FALSE,"l10n_ua_ias_chart_template"
+"ua_ias_1230",1230,"Короткострокові позики","account.data_account_type_current_liabilities",FALSE,"l10n_ua_ias_chart_template"
+"ua_ias_1240",1240,"Короткострокова частка за довгострокові позики","account.data_account_type_current_liabilities",FALSE,"l10n_ua_ias_chart_template"
+"ua_ias_1300",1300,"Довгострокові позики","account.data_account_type_non_current_liabilities",FALSE,"l10n_ua_ias_chart_template"
+"ua_ias_1301",1301,"Довгострокові кредити","account.data_account_type_non_current_liabilities",FALSE,"l10n_ua_ias_chart_template"
+"ua_ias_1302",1302,"Іпотека","account.data_account_type_non_current_liabilities",FALSE,"l10n_ua_ias_chart_template"
+"ua_ias_1310",1310,"Відстрочені податкові зобов’язання","account.data_account_type_non_current_liabilities",FALSE,"l10n_ua_ias_chart_template"
+"ua_ias_1320",1320,"Витрати майбутніх періодів","account.data_account_type_non_current_liabilities",FALSE,"l10n_ua_ias_chart_template"
+"ua_ias_1330",1330,"Інші довгострокові зобов’язання","account.data_account_type_non_current_liabilities",FALSE,"l10n_ua_ias_chart_template"
+"ua_ias_1400",1400,"Статутний капітал","account.data_account_type_equity",FALSE,"l10n_ua_ias_chart_template"
+"ua_ias_1401",1401,"Емісійний фонд","account.data_account_type_equity",FALSE,"l10n_ua_ias_chart_template"
+"ua_ias_1402",1402,"Вилучений капітал","account.data_account_type_equity",FALSE,"l10n_ua_ias_chart_template"
+"ua_ias_1403",1403,"Додатковий оплачений капітал","account.data_account_type_equity",FALSE,"l10n_ua_ias_chart_template"
+"ua_ias_1404",1404,"Резерв переоцінки","account.data_account_type_equity",FALSE,"l10n_ua_ias_chart_template"
+"ua_ias_1405",1405,"Неоплачений капітал","account.data_account_type_equity",FALSE,"l10n_ua_ias_chart_template"
+"ua_ias_1406",1406,"Нерозподілений прибуток (непокритий збиток)","account.data_account_type_equity",FALSE,"l10n_ua_ias_chart_template"
+"ua_ias_1407",1407,"Частка меншості","account.data_account_type_equity",FALSE,"l10n_ua_ias_chart_template"
+"ua_ias_1408",1408,"Ефект курсових різниць","account.data_account_type_equity",FALSE,"l10n_ua_ias_chart_template"
+"ua_ias_2000",2000,"Дохід від продажу (категорія № 1)","account.data_account_type_revenue",FALSE,"l10n_ua_ias_chart_template"
+"ua_ias_2001",2001,"Дохід від продажу (категорія № 2)","account.data_account_type_revenue",FALSE,"l10n_ua_ias_chart_template"
+"ua_ias_2002",2002,"Дохід від продажу (категорія № 3)","account.data_account_type_revenue",FALSE,"l10n_ua_ias_chart_template"
+"ua_ias_2003",2003,"Дохід від продажу (категорія № 4)","account.data_account_type_revenue",FALSE,"l10n_ua_ias_chart_template"
+"ua_ias_2100",2100,"Фінансовий результат","account.data_unaffected_earnings",FALSE,"l10n_ua_ias_chart_template"
+"ua_ias_2200",2200,"Собівартість продажу (категорія № 1)","account.data_account_type_direct_costs",FALSE,"l10n_ua_ias_chart_template"
+"ua_ias_2201",2201,"Собівартість продажу (категорія № 2)","account.data_account_type_direct_costs",FALSE,"l10n_ua_ias_chart_template"
+"ua_ias_2202",2202,"Собівартість продажу (категорія № 3)","account.data_account_type_direct_costs",FALSE,"l10n_ua_ias_chart_template"
+"ua_ias_2203",2203,"Собівартість продажу (категорія № 4)","account.data_account_type_direct_costs",FALSE,"l10n_ua_ias_chart_template"
+"ua_ias_2300",2300,"Адміністративні витрати","account.data_account_type_expenses",FALSE,"l10n_ua_ias_chart_template"
+"ua_ias_2400",2400,"Витрати на збут","account.data_account_type_expenses",FALSE,"l10n_ua_ias_chart_template"
+"ua_ias_2500",2500,"Інші витрати","account.data_account_type_expenses",FALSE,"l10n_ua_ias_chart_template"
+"ua_ias_2600",2600,"Податок на прибуток","account.data_account_type_expenses",FALSE,"l10n_ua_ias_chart_template"
diff --git a/addons/l10n_ua/data/account_account_tag_data.xml b/addons/l10n_ua/data/account_account_tag_data.xml
new file mode 100644
index 0000000000000000000000000000000000000000..9cb77da24e24fd0a5ccff07f9d6db0344cf08c0b
--- /dev/null
+++ b/addons/l10n_ua/data/account_account_tag_data.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>
+<odoo>
+    <data noupdate="1">
+        <record id="acc_tag_vat" model="account.account.tag">
+            <field name="name">ПДВ</field>
+            <field name="applicability">accounts</field>
+        </record>
+    </data>
+</odoo>
diff --git a/addons/l10n_ua/data/account_chart_template.xml b/addons/l10n_ua/data/account_chart_template.xml
new file mode 100644
index 0000000000000000000000000000000000000000..f84159b9d01ec8c5e4eacbf6ec44e65eb6343048
--- /dev/null
+++ b/addons/l10n_ua/data/account_chart_template.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<odoo>
+
+    <record id="l10n_ua_psbo_chart_template" model="account.chart.template">
+        <field name="name">План рахунків ПСБО</field>
+        <field name="cash_account_code_prefix">301</field>
+        <field name="bank_account_code_prefix">311</field>
+        <field name="transfer_account_code_prefix">333</field>
+        <field name="code_digits">6</field>
+        <field name="currency_id" ref="base.UAH"/>
+    </record>
+
+    <record id="l10n_ua_ias_chart_template" model="account.chart.template">
+        <field name="name">План рахунків МСФЗ</field>
+        <field name="bank_account_code_prefix">1112</field>
+        <field name="cash_account_code_prefix">1111</field>
+        <field name="transfer_account_code_prefix">1119</field>
+        <field name="code_digits">6</field>
+        <field name="currency_id" ref="base.UAH"/>
+    </record>
+</odoo>
diff --git a/addons/l10n_ua/data/account_chart_template_config.xml b/addons/l10n_ua/data/account_chart_template_config.xml
new file mode 100644
index 0000000000000000000000000000000000000000..b8901fd547ff0bd884127ffbfd0982530b50dc8a
--- /dev/null
+++ b/addons/l10n_ua/data/account_chart_template_config.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<odoo>
+    <data noupdate="1">
+        <record id="l10n_ua_psbo_chart_template" model="account.chart.template">
+            <field name="property_account_receivable_id" ref="ua_psbp_361"/>
+            <field name="property_account_payable_id" ref="ua_psbp_631"/>
+            <field name="property_account_expense_categ_id" ref="ua_psbp_901"/>
+            <field name="property_account_income_categ_id" ref="ua_psbp_701"/>
+            <field name="complete_tax_set" eval="True"/>
+            <field name="use_anglo_saxon" eval="True"/>
+            <field name="property_stock_account_input_categ_id" ref="ua_psbp_2812"/>
+            <field name="property_stock_account_output_categ_id" ref="ua_psbp_2811"/>
+            <field name="property_stock_valuation_account_id" ref="ua_psbp_281"/>
+            <field name="income_currency_exchange_account_id" ref="ua_psbp_711"/>
+            <field name="expense_currency_exchange_account_id" ref="ua_psbp_942"/>
+        </record>
+
+        <record id="l10n_ua_ias_chart_template" model="account.chart.template">
+            <field name="property_account_receivable_id" ref="ua_ias_1120"/>
+            <field name="property_account_payable_id" ref="ua_ias_1200"/>
+            <field name="property_account_expense_categ_id" ref="ua_ias_2200"/>
+            <field name="property_account_income_categ_id" ref="ua_ias_2000"/>
+            <field name="complete_tax_set" eval="True"/>
+            <field name="use_anglo_saxon" eval="True"/>
+            <field name="property_stock_account_input_categ_id" ref="ua_ias_1201"/>
+            <field name="property_stock_account_output_categ_id" ref="ua_ias_1121"/>
+            <field name="property_stock_valuation_account_id" ref="ua_ias_1100"/>
+            <field name="income_currency_exchange_account_id" ref="ua_ias_2100"/>
+            <field name="expense_currency_exchange_account_id" ref="ua_ias_2500"/>
+        </record>
+
+        <function model="account.chart.template" name="try_loading_for_current_company">
+            <value eval="[ref('l10n_ua.l10n_ua_psbo_chart_template')]"/>
+        </function>
+    </data>
+</odoo>
diff --git a/addons/l10n_ua/data/account_tax_group_data.xml b/addons/l10n_ua/data/account_tax_group_data.xml
new file mode 100644
index 0000000000000000000000000000000000000000..62ad56578964037c1ccced9c1052afe21e7e92c8
--- /dev/null
+++ b/addons/l10n_ua/data/account_tax_group_data.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<odoo>
+    <data noupdate="1">
+        <record id="tax_group_vat20" model="account.tax.group">
+            <field name="name">ПДВ 20%</field>
+        </record>
+        <record id="tax_group_vat7" model="account.tax.group">
+            <field name="name">ПДВ 7%</field>
+        </record>
+        <record id="tax_group_vat0" model="account.tax.group">
+            <field name="name">ПДВ 0%</field>
+        </record>
+        <record id="tax_group_vat_free" model="account.tax.group">
+            <field name="name">Звільнено від ПДВ</field>
+        </record>
+        <record id="tax_group_not_vat" model="account.tax.group">
+            <field name="name">Не є ПДВ</field>
+        </record>
+    </data>
+</odoo>
diff --git a/addons/l10n_ua/data/account_tax_tag_data.xml b/addons/l10n_ua/data/account_tax_tag_data.xml
new file mode 100644
index 0000000000000000000000000000000000000000..ce86c0f17b025d8328bad73d5090022dc0931a0a
--- /dev/null
+++ b/addons/l10n_ua/data/account_tax_tag_data.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<odoo>
+    <data noupdate="1">
+        <record id="tax_tag_vat20" model="account.account.tag">
+            <field name="name">ПДВ 20%</field>
+            <field name="applicability">taxes</field>
+        </record>
+        <record id="tax_tag_vat7" model="account.account.tag">
+            <field name="name">ПДВ 7%</field>
+            <field name="applicability">taxes</field>
+        </record>
+        <record id="tax_tag_vat0" model="account.account.tag">
+            <field name="name">ПДВ 0%</field>
+            <field name="applicability">taxes</field>
+        </record>
+        <record id="tax_tag_vat_free" model="account.account.tag">
+            <field name="name">Звільнено від ПДВ</field>
+            <field name="applicability">taxes</field>
+        </record>
+        <record id="tax_tag_vat_not" model="account.account.tag">
+            <field name="name">Не є об'єктом ПДВ</field>
+            <field name="applicability">taxes</field>
+        </record>
+    </data>
+</odoo>
diff --git a/addons/l10n_ua/data/account_tax_template.xml b/addons/l10n_ua/data/account_tax_template.xml
new file mode 100644
index 0000000000000000000000000000000000000000..e165b0440020a43cff090753b22b8d75e2b0ea3e
--- /dev/null
+++ b/addons/l10n_ua/data/account_tax_template.xml
@@ -0,0 +1,485 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<odoo>
+    <data noupdate="0">
+        <record id="ua_psbp_6412" model="account.account.template">
+            <field name="tag_ids" eval="[(6,0,[ref('l10n_ua.acc_tag_vat')])]"/>
+        </record>
+
+        <!-- Tax template for VAT -->
+        <record id="sale_tax_template_vat20_psbo" model="account.tax.template">
+            <field name="chart_template_id" ref="l10n_ua_psbo_chart_template"/>
+            <field name="sequence">10</field>
+            <field name="name">Реалізація ПДВ 20%</field>
+            <field name="description">+ ПДВ 20%</field>
+            <field name="amount">20</field>
+            <field name="type_tax_use">sale</field>
+            <field name="account_id" ref="ua_psbp_6431"/>
+            <field name="refund_account_id" ref="ua_psbp_6431"/>
+            <field name="tag_ids" eval="[(6,0,[ref('l10n_ua.tax_tag_vat20')])]"/>
+            <field name="tax_group_id" ref="l10n_ua.tax_group_vat20"/>
+        </record>
+        <record id="sale_tax_template_vat20incl_psbo" model="account.tax.template">
+            <field name="chart_template_id" ref="l10n_ua_psbo_chart_template"/>
+            <field name="sequence">10</field>
+            <field name="name">Реалізація в т. ч. ПДВ 20%</field>
+            <field name="description">в т. ч. ПДВ 20%</field>
+            <field name="amount">20</field>
+            <field name="type_tax_use">sale</field>
+            <field name="price_include" eval="1"/>
+            <field name="account_id" ref="ua_psbp_6431"/>
+            <field name="refund_account_id" ref="ua_psbp_6431"/>
+            <field name="tag_ids" eval="[(6,0,[ref('l10n_ua.tax_tag_vat20')])]"/>
+            <field name="tax_group_id" ref="l10n_ua.tax_group_vat20"/>
+        </record>
+        <record id="sale_tax_template_vat7_psbo" model="account.tax.template">
+            <field name="chart_template_id" ref="l10n_ua_psbo_chart_template"/>
+            <field name="sequence">11</field>
+            <field name="name">Реалізація ПДВ 7%</field>
+            <field name="description">+ ПДВ 7%</field>
+            <field name="amount">7</field>
+            <field name="type_tax_use">sale</field>
+            <field name="account_id" ref="ua_psbp_6431"/>
+            <field name="refund_account_id" ref="ua_psbp_6431"/>
+            <field name="tag_ids" eval="[(6,0,[ref('l10n_ua.tax_tag_vat7')])]"/>
+            <field name="tax_group_id" ref="l10n_ua.tax_group_vat7"/>
+        </record>
+        <record id="sale_tax_template_vat7incl_psbo" model="account.tax.template">
+            <field name="chart_template_id" ref="l10n_ua_psbo_chart_template"/>
+            <field name="sequence">11</field>
+            <field name="name">Реалізація в т. ч. ПДВ 7%</field>
+            <field name="description">в т .ч. ПДВ 7%</field>
+            <field name="amount">7</field>
+            <field name="type_tax_use">sale</field>
+            <field name="price_include" eval="1"/>
+            <field name="account_id" ref="ua_psbp_6431"/>
+            <field name="refund_account_id" ref="ua_psbp_6431"/>
+            <field name="tag_ids" eval="[(6,0,[ref('l10n_ua.tax_tag_vat7')])]"/>
+            <field name="tax_group_id" ref="l10n_ua.tax_group_vat7"/>
+        </record>
+        <record id="sale_tax_template_vat0_psbo" model="account.tax.template">
+            <field name="chart_template_id" ref="l10n_ua_psbo_chart_template"/>
+            <field name="sequence">12</field>
+            <field name="name">Реалізація ПДВ 0%</field>
+            <field name="description">ПДВ 0%</field>
+            <field name="amount">0</field>
+            <field name="type_tax_use">sale</field>
+            <field name="account_id" ref="ua_psbp_6431"/>
+            <field name="refund_account_id" ref="ua_psbp_6431"/>
+            <field name="tag_ids" eval="[(6,0,[ref('l10n_ua.tax_tag_vat0')])]"/>
+        </record>
+        <record id="sale_tax_template_vat_free_psbo" model="account.tax.template">
+            <field name="chart_template_id" ref="l10n_ua_psbo_chart_template"/>
+            <field name="sequence">13</field>
+            <field name="name">Реалізація звільнена від  ПДВ</field>
+            <field name="description">Звільнено від ПДВ</field>
+            <field name="amount">0</field>
+            <field name="type_tax_use">sale</field>
+            <field name="account_id" ref="ua_psbp_6431"/>
+            <field name="refund_account_id" ref="ua_psbp_6431"/>
+            <field name="tag_ids" eval="[(6,0,[ref('l10n_ua.tax_tag_vat_free')])]"/>
+        </record>
+        <record id="sale_tax_template_vat_not_psbo" model="account.tax.template">
+            <field name="chart_template_id" ref="l10n_ua_psbo_chart_template"/>
+            <field name="sequence">14</field>
+            <field name="name">Реалізація Не є об'єктом ПДВ</field>
+            <field name="description">Не є об'єктом ПДВ</field>
+            <field name="amount">0</field>
+            <field name="type_tax_use">sale</field>
+            <field name="account_id" ref="ua_psbp_6431"/>
+            <field name="refund_account_id" ref="ua_psbp_6431"/>
+            <field name="tag_ids" eval="[(6,0,[ref('l10n_ua.tax_tag_vat_not')])]"/>
+        </record>
+
+        <record id="purchase_tax_template_vat20_psbo" model="account.tax.template">
+            <field name="chart_template_id" ref="l10n_ua_psbo_chart_template"/>
+            <field name="sequence">20</field>
+            <field name="name">Придбання ПДВ 20%</field>
+            <field name="description">+ ПДВ 20%</field>
+            <field name="amount">20</field>
+            <field name="type_tax_use">purchase</field>
+            <field name="account_id" ref="ua_psbp_6441"/>
+            <field name="refund_account_id" ref="ua_psbp_6441"/>
+            <field name="tag_ids" eval="[(6,0,[ref('l10n_ua.tax_tag_vat20')])]"/>
+            <field name="tax_group_id" ref="l10n_ua.tax_group_vat20"/>
+        </record>
+        <record id="purchase_tax_template_vat20incl_psbo" model="account.tax.template">
+            <field name="chart_template_id" ref="l10n_ua_psbo_chart_template"/>
+            <field name="sequence">20</field>
+            <field name="name">Придбання в т. ч. ПДВ 20%</field>
+            <field name="description">в т. ч. ПДВ 20%</field>
+            <field name="amount">20</field>
+            <field name="type_tax_use">purchase</field>
+            <field name="price_include" eval="1"/>
+            <field name="account_id" ref="ua_psbp_6441"/>
+            <field name="refund_account_id" ref="ua_psbp_6441"/>
+            <field name="tag_ids" eval="[(6,0,[ref('l10n_ua.tax_tag_vat20')])]"/>
+            <field name="tax_group_id" ref="l10n_ua.tax_group_vat20"/>
+        </record>
+        <record id="purchase_tax_template_vat7_psbo" model="account.tax.template">
+            <field name="chart_template_id" ref="l10n_ua_psbo_chart_template"/>
+            <field name="sequence">21</field>
+            <field name="name">Придбання ПДВ 7%</field>
+            <field name="description">+ ПДВ 7%</field>
+            <field name="amount">7</field>
+            <field name="type_tax_use">purchase</field>
+            <field name="account_id" ref="ua_psbp_6441"/>
+            <field name="refund_account_id" ref="ua_psbp_6441"/>
+            <field name="tag_ids" eval="[(6,0,[ref('l10n_ua.tax_tag_vat7')])]"/>
+            <field name="tax_group_id" ref="l10n_ua.tax_group_vat7"/>
+        </record>
+        <record id="purchase_tax_template_vat7incl_psbo" model="account.tax.template">
+            <field name="chart_template_id" ref="l10n_ua_psbo_chart_template"/>
+            <field name="sequence">21</field>
+            <field name="name">Придбання в т. ч. ПДВ 7%</field>
+            <field name="description">в т. ч. ПДВ 7%</field>
+            <field name="amount">7</field>
+            <field name="type_tax_use">purchase</field>
+            <field name="price_include" eval="1"/>
+            <field name="account_id" ref="ua_psbp_6441"/>
+            <field name="refund_account_id" ref="ua_psbp_6441"/>
+            <field name="tag_ids" eval="[(6,0,[ref('l10n_ua.tax_tag_vat7')])]"/>
+            <field name="tax_group_id" ref="l10n_ua.tax_group_vat7"/>
+        </record>
+        <record id="purchase_tax_template_vat0_psbo" model="account.tax.template">
+            <field name="chart_template_id" ref="l10n_ua_psbo_chart_template"/>
+            <field name="sequence">22</field>
+            <field name="name">Придбання ПДВ 0%</field>
+            <field name="description">ПДВ 0%</field>
+            <field name="amount">0</field>
+            <field name="type_tax_use">purchase</field>
+            <field name="account_id" ref="ua_psbp_6441"/>
+            <field name="refund_account_id" ref="ua_psbp_6441"/>
+            <field name="tag_ids" eval="[(6,0,[ref('l10n_ua.tax_tag_vat0')])]"/>
+        </record>
+        <record id="purchase_tax_template_vat_free_psbo" model="account.tax.template">
+            <field name="chart_template_id" ref="l10n_ua_psbo_chart_template"/>
+            <field name="sequence">23</field>
+            <field name="name">Придбання звільнене від  ПДВ</field>
+            <field name="description">Звільнено від ПДВ</field>
+            <field name="amount">0</field>
+            <field name="type_tax_use">purchase</field>
+            <field name="account_id" ref="ua_psbp_6441"/>
+            <field name="refund_account_id" ref="ua_psbp_6441"/>
+            <field name="tag_ids" eval="[(6,0,[ref('l10n_ua.tax_tag_vat_free')])]"/>
+        </record>
+        <record id="purchase_tax_template_vat_not_psbo" model="account.tax.template">
+            <field name="chart_template_id" ref="l10n_ua_psbo_chart_template"/>
+            <field name="sequence">24</field>
+            <field name="name">Придбання Не є об'єктом ПДВ</field>
+            <field name="description">Не є об'єктом ПДВ</field>
+            <field name="amount">0</field>
+            <field name="type_tax_use">purchase</field>
+            <field name="account_id" ref="ua_psbp_6441"/>
+            <field name="refund_account_id" ref="ua_psbp_6441"/>
+            <field name="tag_ids" eval="[(6,0,[ref('l10n_ua.tax_tag_vat_not')])]"/>
+        </record>
+        <!-- Simplified tax system -->
+        <!-- Sale taxes -->
+        <record id="simple_tax_sale_product_psbo" model="account.tax.template">
+            <field name="chart_template_id" ref="l10n_ua_psbo_chart_template"/>
+            <field name="sequence">30</field>
+            <field name="name">Дохід від продажу  товарів</field>
+            <field name="description">Дохід від продажу товарів</field>
+            <field name="amount">0</field>
+            <field name="type_tax_use">sale</field>
+        </record>
+        <record id="simple_tax_sale_gift_psbo" model="account.tax.template">
+            <field name="chart_template_id" ref="l10n_ua_psbo_chart_template"/>
+            <field name="sequence">31</field>
+            <field name="name">Дохід від безоплатно отриманих  товарів</field>
+            <field name="description">Дохід від безоплатно отриманих товарів</field>
+            <field name="amount">0</field>
+            <field name="type_tax_use">sale</field>
+        </record>
+        <record id="simple_tax_sale_old_psbo" model="account.tax.template">
+            <field name="chart_template_id" ref="l10n_ua_psbo_chart_template"/>
+            <field name="sequence">32</field>
+            <field name="name">Дохід від заборгованності за якою минув строк позивної давності</field>
+            <field name="description">Дохід від заборгованності, за якою минув строк позивної давності</field>
+            <field name="amount">0</field>
+            <field name="type_tax_use">sale</field>
+        </record>
+        <record id="simple_tax_sale_15_psbo" model="account.tax.template">
+            <field name="chart_template_id" ref="l10n_ua_psbo_chart_template"/>
+            <field name="sequence">33</field>
+            <field name="name">Дохід, за ставкою 15%</field>
+            <field name="description">Дохід за ставкою 15%</field>
+            <field name="amount">0</field>
+            <field name="type_tax_use">sale</field>
+        </record>
+        <!-- Purchase taxes -->
+        <record id="simple_tax_purchase_product_psbo" model="account.tax.template">
+            <field name="chart_template_id" ref="l10n_ua_psbo_chart_template"/>
+            <field name="sequence">40</field>
+            <field name="name">Витрати від продажу  товарів</field>
+            <field name="description">Витрати від продажу товарів</field>
+            <field name="amount">0</field>
+            <field name="type_tax_use">purchase</field>
+        </record>
+        <record id="simple_tax_purchase_salary_psbo" model="account.tax.template">
+            <field name="chart_template_id" ref="l10n_ua_psbo_chart_template"/>
+            <field name="sequence">41</field>
+            <field name="name">Витрати на оплату праці</field>
+            <field name="description">Витрати на оплату праці найманих працівників</field>
+            <field name="amount">0</field>
+            <field name="type_tax_use">purchase</field>
+        </record>
+        <record id="simple_tax_purchase_esv_psbo" model="account.tax.template">
+            <field name="chart_template_id" ref="l10n_ua_psbo_chart_template"/>
+            <field name="sequence">42</field>
+            <field name="name">Витрати ЄСВ</field>
+            <field name="description">Витрати на ЄСВ</field>
+            <field name="amount">0</field>
+            <field name="type_tax_use">purchase</field>
+        </record>
+        <record id="simple_tax_purchase_other_psbo" model="account.tax.template">
+            <field name="chart_template_id" ref="l10n_ua_psbo_chart_template"/>
+            <field name="sequence">43</field>
+            <field name="name">Витрати  інші</field>
+            <field name="description">Витрати інші</field>
+            <field name="amount">0</field>
+            <field name="type_tax_use">purchase</field>
+        </record>
+
+        <!-- IAS -->
+        <record id="ua_ias_1203" model="account.account.template">
+            <field name="tag_ids" eval="[(6,0,[ref('l10n_ua.acc_tag_vat')])]"/>
+        </record>
+
+        <!-- Tax template for VAT -->
+        <record id="sale_tax_template_vat20" model="account.tax.template">
+            <field name="chart_template_id" ref="l10n_ua_ias_chart_template"/>
+            <field name="sequence">10</field>
+            <field name="name">Реалізація з ПДВ 20%</field>
+            <field name="description">+ ПДВ 20%</field>
+            <field name="amount">20</field>
+            <field name="type_tax_use">sale</field>
+            <field name="account_id" ref="ua_ias_1204"/>
+            <field name="refund_account_id" ref="ua_ias_1204"/>
+            <field name="tag_ids" eval="[(6,0,[ref('l10n_ua.tax_tag_vat20')])]"/>
+            <field name="tax_group_id" ref="l10n_ua.tax_group_vat20"/>
+        </record>
+        <record id="sale_tax_template_vat20incl" model="account.tax.template">
+            <field name="chart_template_id" ref="l10n_ua_ias_chart_template"/>
+            <field name="sequence">10</field>
+            <field name="name">Реалізація в т. ч. ПДВ 20%</field>
+            <field name="description">в т. ч. ПДВ 20%</field>
+            <field name="amount">20</field>
+            <field name="type_tax_use">sale</field>
+            <field name="price_include" eval="1"/>
+            <field name="account_id" ref="ua_ias_1204"/>
+            <field name="refund_account_id" ref="ua_ias_1204"/>
+            <field name="tag_ids" eval="[(6,0,[ref('l10n_ua.tax_tag_vat20')])]"/>
+            <field name="tax_group_id" ref="l10n_ua.tax_group_vat20"/>
+        </record>
+        <record id="sale_tax_template_vat7" model="account.tax.template">
+            <field name="chart_template_id" ref="l10n_ua_ias_chart_template"/>
+            <field name="sequence">11</field>
+            <field name="name">Реалізація з ПДВ 7%</field>
+            <field name="description">+ ПДВ 7%</field>
+            <field name="amount">7</field>
+            <field name="type_tax_use">sale</field>
+            <field name="account_id" ref="ua_ias_1204"/>
+            <field name="refund_account_id" ref="ua_ias_1204"/>
+            <field name="tag_ids" eval="[(6,0,[ref('l10n_ua.tax_tag_vat7')])]"/>
+            <field name="tax_group_id" ref="l10n_ua.tax_group_vat7"/>
+        </record>
+        <record id="sale_tax_template_vat7incl" model="account.tax.template">
+            <field name="chart_template_id" ref="l10n_ua_ias_chart_template"/>
+            <field name="sequence">11</field>
+            <field name="name">Реалізація в т. ч. ПДВ 7%</field>
+            <field name="description">в т .ч. ПДВ 7%</field>
+            <field name="amount">7</field>
+            <field name="type_tax_use">sale</field>
+            <field name="price_include" eval="1"/>
+            <field name="account_id" ref="ua_ias_1204"/>
+            <field name="refund_account_id" ref="ua_ias_1204"/>
+            <field name="tag_ids" eval="[(6,0,[ref('l10n_ua.tax_tag_vat7')])]"/>
+            <field name="tax_group_id" ref="l10n_ua.tax_group_vat7"/>
+        </record>
+        <record id="sale_tax_template_vat0" model="account.tax.template">
+            <field name="chart_template_id" ref="l10n_ua_ias_chart_template"/>
+            <field name="sequence">12</field>
+            <field name="name">Реалізація з ПДВ 0%</field>
+            <field name="description">ПДВ 0%</field>
+            <field name="amount">0</field>
+            <field name="type_tax_use">sale</field>
+            <field name="account_id" ref="ua_ias_1204"/>
+            <field name="refund_account_id" ref="ua_ias_1204"/>
+            <field name="tag_ids" eval="[(6,0,[ref('l10n_ua.tax_tag_vat0')])]"/>
+        </record>
+        <record id="sale_tax_template_vat_free" model="account.tax.template">
+            <field name="chart_template_id" ref="l10n_ua_ias_chart_template"/>
+            <field name="sequence">13</field>
+            <field name="name">Реалізація звільнена від ПДВ</field>
+            <field name="description">Звільнено від ПДВ</field>
+            <field name="amount">0</field>
+            <field name="type_tax_use">sale</field>
+            <field name="account_id" ref="ua_ias_1204"/>
+            <field name="refund_account_id" ref="ua_ias_1204"/>
+            <field name="tag_ids" eval="[(6,0,[ref('l10n_ua.tax_tag_vat_free')])]"/>
+        </record>
+        <record id="sale_tax_template_vat_not" model="account.tax.template">
+            <field name="chart_template_id" ref="l10n_ua_ias_chart_template"/>
+            <field name="sequence">14</field>
+            <field name="name">Реалізація не є об'єктом ПДВ</field>
+            <field name="description">Не є об'єктом ПДВ</field>
+            <field name="amount">0</field>
+            <field name="type_tax_use">sale</field>
+            <field name="account_id" ref="ua_ias_1204"/>
+            <field name="refund_account_id" ref="ua_ias_1204"/>
+            <field name="tag_ids" eval="[(6,0,[ref('l10n_ua.tax_tag_vat_not')])]"/>
+        </record>
+
+        <record id="purchase_tax_template_vat20" model="account.tax.template">
+            <field name="chart_template_id" ref="l10n_ua_ias_chart_template"/>
+            <field name="sequence">20</field>
+            <field name="name">Придбання з ПДВ 20%</field>
+            <field name="description">+ ПДВ 20%</field>
+            <field name="amount">20</field>
+            <field name="type_tax_use">purchase</field>
+            <field name="account_id" ref="ua_ias_1140"/>
+            <field name="refund_account_id" ref="ua_ias_1140"/>
+            <field name="tag_ids" eval="[(6,0,[ref('l10n_ua.tax_tag_vat20')])]"/>
+            <field name="tax_group_id" ref="l10n_ua.tax_group_vat20"/>
+        </record>
+        <record id="purchase_tax_template_vat20incl" model="account.tax.template">
+            <field name="chart_template_id" ref="l10n_ua_ias_chart_template"/>
+            <field name="sequence">20</field>
+            <field name="name">Придбання в т. ч. ПДВ 20%</field>
+            <field name="description">в т. ч. ПДВ 20%</field>
+            <field name="amount">20</field>
+            <field name="type_tax_use">purchase</field>
+            <field name="price_include" eval="1"/>
+            <field name="account_id" ref="ua_ias_1140"/>
+            <field name="refund_account_id" ref="ua_ias_1140"/>
+            <field name="tag_ids" eval="[(6,0,[ref('l10n_ua.tax_tag_vat20')])]"/>
+            <field name="tax_group_id" ref="l10n_ua.tax_group_vat20"/>
+        </record>
+        <record id="purchase_tax_template_vat7" model="account.tax.template">
+            <field name="chart_template_id" ref="l10n_ua_ias_chart_template"/>
+            <field name="sequence">21</field>
+            <field name="name">Придбання з ПДВ 7%</field>
+            <field name="description">+ ПДВ 7%</field>
+            <field name="amount">7</field>
+            <field name="type_tax_use">purchase</field>
+            <field name="account_id" ref="ua_ias_1140"/>
+            <field name="refund_account_id" ref="ua_ias_1140"/>
+            <field name="tag_ids" eval="[(6,0,[ref('l10n_ua.tax_tag_vat7')])]"/>
+            <field name="tax_group_id" ref="l10n_ua.tax_group_vat7"/>
+        </record>
+        <record id="purchase_tax_template_vat7incl" model="account.tax.template">
+            <field name="chart_template_id" ref="l10n_ua_ias_chart_template"/>
+            <field name="sequence">21</field>
+            <field name="name">Придбання в т. ч. ПДВ 7%</field>
+            <field name="description">в т. ч. ПДВ 7%</field>
+            <field name="amount">7</field>
+            <field name="type_tax_use">purchase</field>
+            <field name="price_include" eval="1"/>
+            <field name="account_id" ref="ua_ias_1140"/>
+            <field name="refund_account_id" ref="ua_ias_1140"/>
+            <field name="tag_ids" eval="[(6,0,[ref('l10n_ua.tax_tag_vat7')])]"/>
+            <field name="tax_group_id" ref="l10n_ua.tax_group_vat7"/>
+        </record>
+        <record id="purchase_tax_template_vat0" model="account.tax.template">
+            <field name="chart_template_id" ref="l10n_ua_ias_chart_template"/>
+            <field name="sequence">22</field>
+            <field name="name">Придбання з ПДВ 0%</field>
+            <field name="description">ПДВ 0%</field>
+            <field name="amount">0</field>
+            <field name="type_tax_use">purchase</field>
+            <field name="account_id" ref="ua_ias_1140"/>
+            <field name="refund_account_id" ref="ua_ias_1140"/>
+            <field name="tag_ids" eval="[(6,0,[ref('l10n_ua.tax_tag_vat0')])]"/>
+        </record>
+        <record id="purchase_tax_template_vat_free" model="account.tax.template">
+            <field name="chart_template_id" ref="l10n_ua_ias_chart_template"/>
+            <field name="sequence">23</field>
+            <field name="name">Придбання звільнене від ПДВ</field>
+            <field name="description">Звільнено від ПДВ</field>
+            <field name="amount">0</field>
+            <field name="type_tax_use">purchase</field>
+            <field name="account_id" ref="ua_ias_1140"/>
+            <field name="refund_account_id" ref="ua_ias_1140"/>
+            <field name="tag_ids" eval="[(6,0,[ref('l10n_ua.tax_tag_vat_free')])]"/>
+        </record>
+        <record id="purchase_tax_template_vat_not" model="account.tax.template">
+            <field name="chart_template_id" ref="l10n_ua_ias_chart_template"/>
+            <field name="sequence">24</field>
+            <field name="name">Придбання не є об'єктом ПДВ</field>
+            <field name="description">Не є об'єктом ПДВ</field>
+            <field name="amount">0</field>
+            <field name="type_tax_use">purchase</field>
+            <field name="account_id" ref="ua_ias_1140"/>
+            <field name="refund_account_id" ref="ua_ias_1140"/>
+            <field name="tag_ids" eval="[(6,0,[ref('l10n_ua.tax_tag_vat_not')])]"/>
+        </record>
+        <!-- Simplified tax system -->
+        <!-- Sale taxes -->
+        <record id="simple_tax_sale_product" model="account.tax.template">
+            <field name="chart_template_id" ref="l10n_ua_ias_chart_template"/>
+            <field name="sequence">30</field>
+            <field name="name">Дохід від продажу товарів</field>
+            <field name="description">Дохід від продажу товарів</field>
+            <field name="amount">0</field>
+            <field name="type_tax_use">sale</field>
+        </record>
+        <record id="simple_tax_sale_gift" model="account.tax.template">
+            <field name="chart_template_id" ref="l10n_ua_ias_chart_template"/>
+            <field name="sequence">31</field>
+            <field name="name">Дохід від безоплатно отриманих товарів</field>
+            <field name="description">Дохід від безоплатно отриманих товарів</field>
+            <field name="amount">0</field>
+            <field name="type_tax_use">sale</field>
+        </record>
+        <record id="simple_tax_sale_old" model="account.tax.template">
+            <field name="chart_template_id" ref="l10n_ua_ias_chart_template"/>
+            <field name="sequence">32</field>
+            <field name="name">Дохід від заборгованності, за якою минув строк позивної давності</field>
+            <field name="description">Дохід від заборгованності, за якою минув строк позивної давності</field>
+            <field name="amount">0</field>
+            <field name="type_tax_use">sale</field>
+        </record>
+        <record id="simple_tax_sale_15" model="account.tax.template">
+            <field name="chart_template_id" ref="l10n_ua_ias_chart_template"/>
+            <field name="sequence">33</field>
+            <field name="name">Дохід, що оподатковується за ставкою 15%</field>
+            <field name="description">Дохід за ставкою 15%</field>
+            <field name="amount">0</field>
+            <field name="type_tax_use">sale</field>
+        </record>
+        <!-- Purchase taxes -->
+        <record id="simple_tax_purchase_product" model="account.tax.template">
+            <field name="chart_template_id" ref="l10n_ua_ias_chart_template"/>
+            <field name="sequence">40</field>
+            <field name="name">Витрати від продажу товарів</field>
+            <field name="description">Витрати від продажу товарів</field>
+            <field name="amount">0</field>
+            <field name="type_tax_use">purchase</field>
+        </record>
+        <record id="simple_tax_purchase_salary" model="account.tax.template">
+            <field name="chart_template_id" ref="l10n_ua_ias_chart_template"/>
+            <field name="sequence">41</field>
+            <field name="name">Витрати на оплату праці найманих працівників</field>
+            <field name="description">Витрати на оплату праці найманих працівників</field>
+            <field name="amount">0</field>
+            <field name="type_tax_use">purchase</field>
+        </record>
+        <record id="simple_tax_purchase_esv" model="account.tax.template">
+            <field name="chart_template_id" ref="l10n_ua_ias_chart_template"/>
+            <field name="sequence">42</field>
+            <field name="name">Витрати на ЄСВ</field>
+            <field name="description">Витрати на ЄСВ</field>
+            <field name="amount">0</field>
+            <field name="type_tax_use">purchase</field>
+        </record>
+        <record id="simple_tax_purchase_other" model="account.tax.template">
+            <field name="chart_template_id" ref="l10n_ua_ias_chart_template"/>
+            <field name="sequence">43</field>
+            <field name="name">Витрати інші</field>
+            <field name="description">Витрати інші</field>
+            <field name="amount">0</field>
+            <field name="type_tax_use">purchase</field>
+        </record>
+    </data>
+</odoo>
diff --git a/addons/l10n_ua/static/description/icon.png b/addons/l10n_ua/static/description/icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..57cf957010db1116d9e69f4ec742e7772bd9103f
Binary files /dev/null and b/addons/l10n_ua/static/description/icon.png differ
diff --git a/addons/mail/models/ir_attachment.py b/addons/mail/models/ir_attachment.py
index ee51ed8382eff4127d36fdadb5e4b21ec471c3df..975d2de0f60f127fe93a5e482e67f975893fdab4 100644
--- a/addons/mail/models/ir_attachment.py
+++ b/addons/mail/models/ir_attachment.py
@@ -20,6 +20,8 @@ class IrAttachment(models.Model):
         attached to.
         """
         self.ensure_one()
+        if not self.res_model:
+            return
         related_record = self.env[self.res_model].browse(self.res_id)
         # message_main_attachment_id field can be empty, that's why we compare to False;
         # we are just checking that it exists on the model before writing it
diff --git a/addons/mail/models/ir_model.py b/addons/mail/models/ir_model.py
index 52efe400df9f547457aae21302eef775f5f76273..f0b873730b0590bb514a9494aa629156d058f3dc 100644
--- a/addons/mail/models/ir_model.py
+++ b/addons/mail/models/ir_model.py
@@ -28,13 +28,23 @@ class IrModel(models.Model):
         query = "DELETE FROM mail_message WHERE model in %s"
         self.env.cr.execute(query, [models])
 
+        # Get files attached solely by the models
         query = """
-            DELETE FROM ir_attachment
-            WHERE res_model in %s
-            RETURNING store_fname
+            SELECT DISTINCT store_fname
+            FROM ir_attachment
+            WHERE res_model IN %s
+            EXCEPT
+            SELECT store_fname
+            FROM ir_attachment
+            WHERE res_model not IN %s;
         """
+        self.env.cr.execute(query, [models, models])
+        fnames = self.env.cr.fetchall()
+
+        query = """DELETE FROM ir_attachment WHERE res_model in %s"""
         self.env.cr.execute(query, [models])
-        for (fname,) in self.env.cr.fetchall():
+
+        for (fname,) in fnames:
             self.env['ir.attachment']._file_delete(fname)
 
         return super(IrModel, self).unlink()
diff --git a/addons/mail/models/mail_template.py b/addons/mail/models/mail_template.py
index 3b8732d86acaaa20c5b7716dae46cbdbf4470e7e..44cea49b102473242ebea80e7138b4dbad51e859 100644
--- a/addons/mail/models/mail_template.py
+++ b/addons/mail/models/mail_template.py
@@ -476,9 +476,13 @@ class MailTemplate(models.Model):
                     report = template.report_template
                     report_service = report.report_name
 
-                    if report.report_type not in ['qweb-html', 'qweb-pdf']:
-                        raise UserError(_('Unsupported report type %s found.') % report.report_type)
-                    result, format = report.render_qweb_pdf([res_id])
+                    if report.report_type in ['qweb-html', 'qweb-pdf']:
+                        result, format = report.render_qweb_pdf([res_id])
+                    else:
+                        res = report.render([res_id])
+                        if not res:
+                            raise UserError(_('Unsupported report type %s found.') % report.report_type)
+                        result, format = res
 
                     # TODO in trunk, change return format to binary to match message_post expected format
                     result = base64.b64encode(result)
diff --git a/addons/mrp/models/mrp_workorder.py b/addons/mrp/models/mrp_workorder.py
index 75a9ec61c518c5948f1d7e40ca725667cc529efa..861faf383be7253ac7210558f6327e17fdf298ee 100644
--- a/addons/mrp/models/mrp_workorder.py
+++ b/addons/mrp/models/mrp_workorder.py
@@ -256,6 +256,9 @@ class MrpWorkorder(models.Model):
             self.button_finish()
         return True
 
+    def _get_byproduct_move_to_update(self):
+        return self.production_id.move_finished_ids.filtered(lambda x: (x.product_id.id != self.production_id.product_id.id) and (x.state not in ('done', 'cancel')))
+
     @api.multi
     def _start_nextworkorder(self):
         rounding = self.product_id.uom_id.rounding
diff --git a/addons/mrp/models/res_config_settings.py b/addons/mrp/models/res_config_settings.py
index 5e47515b1f3a82aa81995b9a7c1cd0acc27d2697..dcda06cb4c2f2d465b1f68760c38a594c0054678 100644
--- a/addons/mrp/models/res_config_settings.py
+++ b/addons/mrp/models/res_config_settings.py
@@ -24,4 +24,13 @@ class ResConfigSettings(models.TransientModel):
 
     @api.onchange('group_mrp_routings')
     def _onchange_group_mrp_routings(self):
-        self.module_mrp_workorder = self.group_mrp_routings
+        # If we activate 'MRP Work Orders', it means that we need to install 'mrp_workorder'.
+        # The opposite is not always true: other modules (such as 'quality_mrp_workorder') may
+        # depend on 'mrp_workorder', so we should not automatically uninstall the module if 'MRP
+        # Work Orders' is deactivated.
+        # Long story short: if 'mrp_workorder' is already installed, we don't uninstall it based on
+        # group_mrp_routings
+        if self.group_mrp_routings:
+            self.module_mrp_workorder = True
+        elif not self.env['ir.module.module'].search([('name', '=', 'mrp_workorder'), ('state', '=', 'installed')]):
+            self.module_mrp_workorder = False
diff --git a/addons/mrp/models/stock_rule.py b/addons/mrp/models/stock_rule.py
index 8f72e133c2466065f149b68c2ec664c313579244..322746a327d45a5469790994f92882c3b227c48b 100644
--- a/addons/mrp/models/stock_rule.py
+++ b/addons/mrp/models/stock_rule.py
@@ -6,6 +6,7 @@ from dateutil.relativedelta import relativedelta
 
 from odoo import api, fields, models, _
 from odoo.exceptions import UserError
+from odoo.osv import expression
 
 
 class StockRule(models.Model):
@@ -132,3 +133,8 @@ class ProcurementGroup(models.Model):
             else:
                 procurements_without_kit.append(procurement)
         return super(ProcurementGroup, self).run(procurements_without_kit)
+
+    def _get_moves_to_assign_domain(self):
+        domain = super(ProcurementGroup, self)._get_moves_to_assign_domain()
+        domain = expression.AND([domain, [('production_id', '=', False)]])
+        return domain
diff --git a/addons/mrp/models/stock_warehouse.py b/addons/mrp/models/stock_warehouse.py
index 59fa4f39e36c7bfc02be2d05f18888eccdd470a4..bd4de62bdb4aa55dd8cf7951b5b6d3f37736a65e 100644
--- a/addons/mrp/models/stock_warehouse.py
+++ b/addons/mrp/models/stock_warehouse.py
@@ -170,18 +170,19 @@ class StockWarehouse(models.Model):
         manufacture_steps = vals.get('manufacture_steps', def_values['manufacture_steps'])
         code = vals.get('code') or self.code
         code = code.replace(' ', '').upper()
+        company_id = vals.get('company_id', self.company_id.id)
         values.update({
             'pbm_loc_id': {
                 'name': _('Pre-Production'),
                 'active': manufacture_steps in ('pbm', 'pbm_sam'),
                 'usage': 'internal',
-                'barcode': code + '-PREPRODUCTION'
+                'barcode': self._valid_barcode(code + '-PREPRODUCTION', company_id)
             },
             'sam_loc_id': {
                 'name': _('Post-Production'),
                 'active': manufacture_steps == 'pbm_sam',
                 'usage': 'internal',
-                'barcode': code + '-POSTPRODUCTION'
+                'barcode': self._valid_barcode(code + '-POSTPRODUCTION', company_id)
             },
         })
         return values
diff --git a/addons/point_of_sale/data/point_of_sale_data.xml b/addons/point_of_sale/data/point_of_sale_data.xml
index 8fcb592f8f37738bba17e58fd0ec0178158af0ab..810925e61e36bb5c0c1d887652f9f307a8cf9310 100644
--- a/addons/point_of_sale/data/point_of_sale_data.xml
+++ b/addons/point_of_sale/data/point_of_sale_data.xml
@@ -1,13 +1,14 @@
 <?xml version="1.0" encoding="utf-8"?>
 <odoo>
-    <data noupdate="0">
+    <data noupdate="1">
         <record id="seq_picking_type_posout" model="ir.sequence">
             <field name="name">Picking POS</field>
             <field name="prefix">POS</field>
             <field name="padding">5</field>
             <field name="company_id" eval="False"/>
         </record>
-        
+    </data>
+    <data noupdate="0">
         <record id="picking_type_posout" model="stock.picking.type">
             <field name="name">PoS Orders</field>
             <field name="sequence_id" ref="seq_picking_type_posout"/>
diff --git a/addons/point_of_sale/models/pos_order.py b/addons/point_of_sale/models/pos_order.py
index 548126af64282cbfacdd9a7224f78d97f4cfd4ee..cdad087eba2667c8e9b97362469bcb291b86cf10 100644
--- a/addons/point_of_sale/models/pos_order.py
+++ b/addons/point_of_sale/models/pos_order.py
@@ -362,7 +362,7 @@ class PosOrder(models.Model):
                             account_analytic=account_analytic)
                     if res:
                         line1, line2 = res
-                        line1 = Product._convert_prepared_anglosaxon_line(line1, order.partner_id)
+                        line1 = Product._convert_prepared_anglosaxon_line(line1, line['partner_id'])
                         insert_data('counter_part', {
                             'name': line1['name'],
                             'account_id': line1['account_id'],
@@ -372,7 +372,7 @@ class PosOrder(models.Model):
 
                         })
 
-                        line2 = Product._convert_prepared_anglosaxon_line(line2, order.partner_id)
+                        line2 = Product._convert_prepared_anglosaxon_line(line2, line['partner_id'])
                         insert_data('counter_part', {
                             'name': line2['name'],
                             'account_id': line2['account_id'],
@@ -394,7 +394,6 @@ class PosOrder(models.Model):
             def insert_data(data_type, values):
                 # if have_to_group_by:
                 values.update({
-                    'partner_id': partner_id,
                     'move_id': move.id,
                 })
 
@@ -749,7 +748,7 @@ class PosOrder(models.Model):
 
             try:
                 pos_order.action_pos_order_paid()
-            except psycopg2.OperationalError:
+            except psycopg2.DatabaseError:
                 # do not hide transactional errors, the order(s) won't be saved!
                 raise
             except Exception as e:
diff --git a/addons/point_of_sale/static/src/js/models.js b/addons/point_of_sale/static/src/js/models.js
index eb4c30701fa75061de4c04bc0131c95df7ce0cfc..aa0c89f3c552cf2e8dff19436615aadefd39b916 100644
--- a/addons/point_of_sale/static/src/js/models.js
+++ b/addons/point_of_sale/static/src/js/models.js
@@ -2704,7 +2704,7 @@ exports.NumpadState = Backbone.Model.extend({
             this.set({
                 buffer: "-" + newChar
             });
-        } else {
+        } else if (!(newChar === '.') || oldBuffer.indexOf('.') === -1) {
             this.set({
                 buffer: (this.get('buffer')) + newChar
             });
diff --git a/addons/point_of_sale/static/src/xml/pos.xml b/addons/point_of_sale/static/src/xml/pos.xml
index b094c035b4d42869418acd73d94f87f68b247d3b..4827706756ce94e1a65355f54af2b7c27ae76d1a 100644
--- a/addons/point_of_sale/static/src/xml/pos.xml
+++ b/addons/point_of_sale/static/src/xml/pos.xml
@@ -805,7 +805,7 @@
                                 </left>
                             </line>
                         </t>
-                        <t t-else='line.discount !== 0'>
+                        <t t-elif='line.discount !== 0'>
                             <line indent='1'>
                                 <left>
                                     <value t-att-value-decimals='pos.dp["Product Price"]'>
diff --git a/addons/point_of_sale/views/account_journal_view.xml b/addons/point_of_sale/views/account_journal_view.xml
index 94c80cbacef10deec2ff18417be2e07e8f9d07ac..99e0403306eb7acffe6ffdc1f17479f830f5076e 100644
--- a/addons/point_of_sale/views/account_journal_view.xml
+++ b/addons/point_of_sale/views/account_journal_view.xml
@@ -5,8 +5,7 @@
         <field name="res_model">account.journal</field>
         <field name="view_type">form</field>
         <field name="view_mode">tree,kanban,form</field>
-        <field name="context" eval="{'default_journal_user': 1, 'default_type': 'cash'}"/>
-        <field name="domain">[('journal_user','=', 1)]</field>
+        <field name="context" eval="{'search_default_available_in_pos': True, 'default_journal_user': True, 'default_type': 'cash'}"/>
         <field name="help" type="html">
             <p class="o_view_nocontent_smiling_face">
                 Add a new payment method
diff --git a/addons/portal/views/portal_templates.xml b/addons/portal/views/portal_templates.xml
index 79430121c4561b56bd6057dfca008c7c9e41943b..f4f88c5dfb27c1ff19e74b96c69350299bc51393 100644
--- a/addons/portal/views/portal_templates.xml
+++ b/addons/portal/views/portal_templates.xml
@@ -174,7 +174,7 @@
     </template>
 
     <template id="portal_record_sidebar" name="My Portal Record Sidebar">
-        <div t-attf-class="col-12 col-lg flex-lg-grow-0 #{classes}">
+        <div t-attf-class="#{classes}">
             <div class="card bg-white mb-4" id="sidebar_content">
                 <div t-if="title" class="card-body text-center pb-2 pt-3">
                     <t t-raw="title"/>
diff --git a/addons/purchase/models/account_invoice.py b/addons/purchase/models/account_invoice.py
index 6c7b1b9293d88ef58a65745ba00bd1656930197e..a6b0513bd202ad05ae69f4fa3c138a7386f4e8a7 100644
--- a/addons/purchase/models/account_invoice.py
+++ b/addons/purchase/models/account_invoice.py
@@ -25,10 +25,6 @@ class AccountInvoice(models.Model):
             return {}
         self.purchase_id = self.vendor_bill_purchase_id.purchase_order_id
         self.vendor_bill_id = self.vendor_bill_purchase_id.vendor_bill_id
-        vendor_ref = self.vendor_bill_purchase_id.purchase_order_id.partner_ref
-        if vendor_ref:
-            self.reference = ", ".join([self.reference, vendor_ref]) if (
-                    self.reference and vendor_ref not in self.reference) else vendor_ref
         self.vendor_bill_purchase_id = False
         return {}
 
@@ -98,9 +94,20 @@ class AccountInvoice(models.Model):
         if not self.partner_id:
             self.partner_id = self.purchase_id.partner_id.id
 
+        vendor_ref = self.purchase_id.partner_ref
+        if vendor_ref:
+            self.reference = ", ".join([self.reference, vendor_ref]) if (
+                    self.reference and vendor_ref not in self.reference) else vendor_ref
+
         if not self.invoice_line_ids:
             #as there's no invoice line yet, we keep the currency of the PO
             self.currency_id = self.purchase_id.currency_id
+
+        vendor_ref = self.purchase_id.partner_ref
+        if vendor_ref:
+            self.reference = ", ".join([self.reference, vendor_ref]) if (
+                    self.reference and vendor_ref not in self.reference) else vendor_ref
+
         new_lines = self.env['account.invoice.line']
         for line in self.purchase_id.order_line - self.invoice_line_ids.mapped('purchase_line_id'):
             data = self._prepare_invoice_line_from_po_line(line)
diff --git a/addons/purchase/report/purchase_bill.py b/addons/purchase/report/purchase_bill.py
index 036309e8e2931d9271d5e51a416c16aab68b5d68..009ce1f6ac848cf6a94e043c747bdc520f09e049 100644
--- a/addons/purchase/report/purchase_bill.py
+++ b/addons/purchase/report/purchase_bill.py
@@ -37,7 +37,7 @@ class PurchaseBillUnion(models.Model):
                     NULL as vendor_bill_id, id as purchase_order_id
                 FROM purchase_order
                 WHERE
-                    state = 'purchase' AND
+                    state in ('purchase', 'done') AND
                     invoice_status in ('to invoice', 'no')
             )""")
 
diff --git a/addons/purchase/views/purchase_views.xml b/addons/purchase/views/purchase_views.xml
index 8513f4827f078d58f2cf581e068b736a407c5c22..0eb69a8cdefdab07152b20b412f9602b35e1ef9c 100644
--- a/addons/purchase/views/purchase_views.xml
+++ b/addons/purchase/views/purchase_views.xml
@@ -135,12 +135,12 @@
                     <button name="print_quotation" string="Print RFQ" type="object" states="draft" class="oe_highlight" groups="base.group_user"/>
                     <button name="button_confirm" type="object" states="sent" string="Confirm Order" class="oe_highlight" id="bid_confirm"/>
                     <button name="button_approve" type="object" states='to approve' string="Approve Order" class="oe_highlight" groups="purchase.group_purchase_manager"/>
-                    <button name="action_view_invoice" string="Create Bill" type="object" class="oe_highlight" context="{'create_bill':True}" attrs="{'invisible': ['|', ('state', 'not in', ('purchase')), ('invoice_status', 'in', ('no', 'invoiced'))]}"/>
+                    <button name="action_view_invoice" string="Create Bill" type="object" class="oe_highlight" context="{'create_bill':True}" attrs="{'invisible': ['|', ('state', 'not in', ('purchase', 'done')), ('invoice_status', 'in', ('no', 'invoiced'))]}"/>
                     <button name="action_rfq_send" states="sent" string="Re-Send by Email" type="object" context="{'send_rfq':True}"/>
                     <button name="print_quotation" string="Print RFQ" type="object" states="sent" groups="base.group_user"/>
                     <button name="button_confirm" type="object" states="draft" string="Confirm Order" id="draft_confirm"/>
                     <button name="action_rfq_send" states="purchase" string="Send PO by Email" type="object" context="{'send_rfq':False}"/>
-                    <button name="action_view_invoice" string="Create Bill" type="object" context="{'create_bill':True}" attrs="{'invisible': ['|', '|', ('state', 'not in', ('purchase')), ('invoice_status', 'not in', ('no', 'invoiced')), ('order_line', '=', [])]}"/>
+                    <button name="action_view_invoice" string="Create Bill" type="object" context="{'create_bill':True}" attrs="{'invisible': ['|', '|', ('state', 'not in', ('purchase', 'done')), ('invoice_status', 'not in', ('no', 'invoiced')), ('order_line', '=', [])]}"/>
                     <button name="button_draft" states="cancel" string="Set to Draft" type="object" />
                     <button name="button_cancel" states="draft,to approve,sent,purchase" string="Cancel" type="object" />
                     <button name="button_done" type="object" string="Lock" states="purchase"/>
diff --git a/addons/purchase_stock/models/account_invoice.py b/addons/purchase_stock/models/account_invoice.py
index efb494777cda64f0a32a9ac777e3d5f334b1ba7d..048853d4c64144513356d4a6409df7d930dbb5e2 100644
--- a/addons/purchase_stock/models/account_invoice.py
+++ b/addons/purchase_stock/models/account_invoice.py
@@ -75,13 +75,15 @@ class AccountInvoice(models.Model):
                             for val_stock_move in valuation_stock_move:
                                 # In case val_stock_move is a return move, its valuation entries have been made with the
                                 # currency rate corresponding to the original stock move
-                                valuation_date = val_stock_move.origin_returned_move_id.date or val_stock_move.date_expected
+                                valuation_date = val_stock_move.origin_returned_move_id.date or val_stock_move.date
                                 valuation_price_unit_total += company_currency._convert(
                                     abs(val_stock_move.price_unit) * val_stock_move.product_qty,
                                     inv.currency_id,
                                     company=inv.company_id, date=valuation_date, round=False,
                                 )
                                 valuation_total_qty += val_stock_move.product_qty
+
+                            # in Stock Move, price unit is in company_currency
                             valuation_price_unit = valuation_price_unit_total / valuation_total_qty
                             valuation_price_unit = i_line.product_id.uom_id._compute_price(valuation_price_unit, i_line.uom_id)
                             line_quantity = valuation_total_qty
diff --git a/addons/purchase_stock/models/stock.py b/addons/purchase_stock/models/stock.py
index 6994e1d38440b00b0285694b8be458659e2811d5..61e285db2004e77d37750c9525a7c0ae1ca5b9d0 100644
--- a/addons/purchase_stock/models/stock.py
+++ b/addons/purchase_stock/models/stock.py
@@ -59,7 +59,13 @@ class StockMove(models.Model):
         if self.purchase_line_id:
             purchase_currency = self.purchase_line_id.currency_id
             if purchase_currency != self.company_id.currency_id:
-                purchase_price_unit = self.purchase_line_id.price_unit
+                # Do not use price_unit since we want the price tax excluded. And by the way, qty
+                # is in the UOM of the product, not the UOM of the PO line.
+                purchase_price_unit = (
+                    self.purchase_line_id.price_subtotal / self.purchase_line_id.product_uom_qty
+                    if self.purchase_line_id.product_uom_qty
+                    else self.purchase_line_id.price_unit
+                )
                 currency_move_valuation = purchase_currency.round(purchase_price_unit * abs(qty))
                 rslt['credit_line_vals']['amount_currency'] = rslt['credit_line_vals']['credit'] and -currency_move_valuation or currency_move_valuation
                 rslt['credit_line_vals']['currency_id'] = purchase_currency.id
diff --git a/addons/purchase_stock/tests/test_anglo_saxon_valuation_reconciliation.py b/addons/purchase_stock/tests/test_anglo_saxon_valuation_reconciliation.py
index 5b466f750789e1325ed91cf9420f136ab033b4e0..a15190cddfba84e5bd3f13f91815b2dd0fca7ad3 100644
--- a/addons/purchase_stock/tests/test_anglo_saxon_valuation_reconciliation.py
+++ b/addons/purchase_stock/tests/test_anglo_saxon_valuation_reconciliation.py
@@ -62,8 +62,10 @@ class TestValuationReconciliation(ValuationReconciliationTestCase):
         """ Tests the case into which we receive the goods first, and then make the invoice.
         """
         test_product = self.test_product_delivery
-        purchase_order = self._create_purchase(test_product, '2018-01-01')
-        self._process_pickings(purchase_order.picking_ids)
+        date_po_and_delivery = '2018-01-01'
+
+        purchase_order = self._create_purchase(test_product, date_po_and_delivery)
+        self._process_pickings(purchase_order.picking_ids, date=date_po_and_delivery)
 
         invoice = self._create_invoice_for_po(purchase_order, '2018-02-02')
         self.env['res.currency.rate'].create({
@@ -149,8 +151,9 @@ class TestValuationReconciliation(ValuationReconciliationTestCase):
         """ Tests the case into which we receive part of the goods first, then 2 invoices at different rates, and finally the remaining quantities
         """
         test_product = self.test_product_delivery
-        purchase_order = self._create_purchase(test_product, '2017-01-01', quantity=5.0)
-        self._process_pickings(purchase_order.picking_ids, quantity=2.0)
+        date_po_and_delivery0 = '2017-01-01'
+        purchase_order = self._create_purchase(test_product, date_po_and_delivery0, quantity=5.0)
+        self._process_pickings(purchase_order.picking_ids, quantity=2.0, date=date_po_and_delivery0)
         picking = self.env['stock.picking'].search([('purchase_id', '=', purchase_order.id)], order="id asc", limit=1)
 
         invoice = self._create_invoice_for_po(purchase_order, '2017-01-15')
@@ -183,6 +186,8 @@ class TestValuationReconciliation(ValuationReconciliationTestCase):
             'rate': 12.195747002,
             'name': '2017-04-01',
         })
+        # We don't need to make the date of processing explicit since the very last rate
+        # will be taken
         self._process_pickings(purchase_order.picking_ids.filtered(lambda x: x.state != 'done'), quantity=3.0)
         picking = self.env['stock.picking'].search([('purchase_id', '=', purchase_order.id)], order='id desc', limit=1)
         self.check_reconciliation(invoice2, picking)
diff --git a/addons/purchase_stock/tests/test_stockvaluation.py b/addons/purchase_stock/tests/test_stockvaluation.py
index 920d6e4872a14cdbaf20cc0a4866bd9be4f71ccf..118f54b63a29e655f8ea86810df7d2e73df2c8d7 100644
--- a/addons/purchase_stock/tests/test_stockvaluation.py
+++ b/addons/purchase_stock/tests/test_stockvaluation.py
@@ -3,6 +3,7 @@
 
 import time
 from datetime import datetime
+from unittest.mock import patch
 
 from odoo import fields
 from odoo.tests import Form
@@ -144,6 +145,7 @@ class TestStockValuation(TransactionCase):
         the currency rate, validate the receipt and then check that the value of the received goods
         is set according to the last currency rate.
         """
+        self.env['res.currency.rate'].search([]).unlink()
         usd_currency = self.env.ref('base.USD')
         self.env.user.company_id.currency_id = usd_currency.id
 
@@ -290,6 +292,9 @@ class TestStockValuationWithCOA(AccountingTestCase):
         self.partner_id = self.env.ref('base.res_partner_1')
         self.product1 = self.env.ref('product.product_product_8')
         Account = self.env['account.account']
+        self.usd_currency = self.env.ref('base.USD')
+        self.eur_currency = self.env.ref('base.EUR')
+
         self.stock_input_account = Account.create({
             'name': 'Stock Input',
             'code': 'StockIn',
@@ -307,6 +312,11 @@ class TestStockValuationWithCOA(AccountingTestCase):
             'code': 'Stock Valuation',
             'user_type_id': self.env.ref('account.data_account_type_current_assets').id,
         })
+        self.price_diff_account = Account.create({
+            'name': 'price diff account',
+            'code': 'price diff account',
+            'user_type_id': self.env.ref('account.data_account_type_current_assets').id,
+        })
         self.stock_journal = self.env['account.journal'].create({
             'name': 'Stock Journal',
             'code': 'STJTEST',
@@ -324,12 +334,7 @@ class TestStockValuationWithCOA(AccountingTestCase):
         self.product1.product_tmpl_id.categ_id.property_cost_method = 'fifo'
         self.product1.product_tmpl_id.categ_id.property_valuation = 'real_time'
         self.product1.product_tmpl_id.invoice_policy = 'delivery'
-        price_diff_account = self.env['account.account'].create({
-            'name': 'price diff account',
-            'code': 'price diff account',
-            'user_type_id': self.env.ref('account.data_account_type_current_assets').id,
-        })
-        self.product1.property_account_creditor_price_difference = price_diff_account
+        self.product1.property_account_creditor_price_difference = self.price_diff_account
 
         # Receive 10@10 ; create the vendor bill
         po1 = self.env['purchase.order'].create({
@@ -416,7 +421,7 @@ class TestStockValuationWithCOA(AccountingTestCase):
         creditnote_po2.action_invoice_open()
 
         # check the anglo saxon entries
-        price_diff_entry = self.env['account.move.line'].search([('account_id', '=', price_diff_account.id)])
+        price_diff_entry = self.env['account.move.line'].search([('account_id', '=', self.price_diff_account.id)])
         self.assertEqual(price_diff_entry.credit, 100)
 
     def test_anglosaxon_valuation(self):
@@ -424,12 +429,7 @@ class TestStockValuationWithCOA(AccountingTestCase):
         self.product1.product_tmpl_id.categ_id.property_cost_method = 'fifo'
         self.product1.product_tmpl_id.categ_id.property_valuation = 'real_time'
         self.product1.product_tmpl_id.invoice_policy = 'delivery'
-        price_diff_account = self.env['account.account'].create({
-            'name': 'price diff account',
-            'code': 'price diff account',
-            'user_type_id': self.env.ref('account.data_account_type_current_assets').id,
-        })
-        self.product1.property_account_creditor_price_difference = price_diff_account
+        self.product1.property_account_creditor_price_difference = self.price_diff_account
 
         # Create PO
         po_form = Form(self.env['purchase.order'])
@@ -458,12 +458,12 @@ class TestStockValuationWithCOA(AccountingTestCase):
         invoice.action_invoice_open()
 
         # Check what was posted in the price difference account
-        price_diff_aml = self.env['account.move.line'].search([('account_id','=',price_diff_account.id)])
+        price_diff_aml = self.env['account.move.line'].search([('account_id','=', self.price_diff_account.id)])
         self.assertEquals(len(price_diff_aml), 1, "Only one line should have been generated in the price difference account.")
         self.assertAlmostEquals(price_diff_aml.debit, 5, "Price difference should be equal to 5 (15-10)")
 
         # Check what was posted in stock input account
-        input_aml = self.env['account.move.line'].search([('account_id','=',self.stock_input_account.id)])
+        input_aml = self.env['account.move.line'].search([('account_id','=', self.stock_input_account.id)])
         self.assertEquals(len(input_aml), 2, "Only two lines should have been generated in stock input account: one when receiving the product, one when making the invoice.")
         self.assertAlmostEquals(sum(input_aml.mapped('debit')), 10, "Total debit value on stock input account should be equal to the original PO price of the product.")
         self.assertAlmostEquals(sum(input_aml.mapped('credit')), 10, "Total credit value on stock input account should be equal to the original PO price of the product.")
@@ -506,3 +506,419 @@ class TestStockValuationWithCOA(AccountingTestCase):
         # valuation of product1 should be 15 as the tax with no account set
         # has gone to the stock account, and must be reflected in inventory valuation
         self.assertEqual(self.product1.stock_value, 150)
+    def test_average_realtime_anglo_saxon_valuation_multicurrency_same_date(self):
+        """
+        The PO and invoice are in the same foreign currency.
+        The PO is invoiced on the same date as its creation.
+        This shouldn't create a price difference entry.
+        """
+        company = self.env.user.company_id
+        company.anglo_saxon_accounting = True
+
+        date_po = '2019-01-01'
+
+        # SetUp product
+        self.product1.product_tmpl_id.cost_method = 'average'
+        self.product1.product_tmpl_id.valuation = 'real_time'
+        self.product1.product_tmpl_id.invoice_policy = 'order'
+        self.product1.product_tmpl_id.purchase_method = 'purchase'
+
+        self.product1.property_account_creditor_price_difference = self.price_diff_account
+
+        # SetUp currency and rates
+        self.cr.execute("UPDATE res_company SET currency_id = %s WHERE id = %s", (self.usd_currency.id, company.id))
+        self.env['res.currency.rate'].search([]).unlink()
+        self.env['res.currency.rate'].create({
+            'name': date_po,
+            'rate': 1.0,
+            'currency_id': self.usd_currency.id,
+            'company_id': company.id,
+        })
+
+        self.env['res.currency.rate'].create({
+            'name': date_po,
+            'rate': 1.5,
+            'currency_id': self.eur_currency.id,
+            'company_id': company.id,
+        })
+
+        # Proceed
+        po = self.env['purchase.order'].create({
+            'currency_id': self.eur_currency.id,
+            'partner_id': self.partner_id.id,
+            'order_line': [
+                (0, 0, {
+                    'name': self.product1.name,
+                    'product_id': self.product1.id,
+                    'product_qty': 1.0,
+                    'product_uom': self.product1.uom_po_id.id,
+                    'price_unit': 100.0,
+                    'date_planned': date_po,
+                }),
+            ],
+        })
+        po.button_confirm()
+
+        inv = self.env['account.invoice'].create({
+            'type': 'in_invoice',
+            'date_invoice': date_po,
+            'currency_id': self.eur_currency.id,
+            'purchase_id': po.id,
+            'partner_id': self.partner_id.id,
+            'invoice_line_ids': [(0, 0, {
+                'name': 'Test',
+                'price_subtotal': 100.0,
+                'price_unit': 100.0,
+                'product_id': self.product1.id,
+                'purchase_id': po.id,
+                'purchase_line_id': po.order_line.id,
+                'quantity': 1.0,
+                'account_id': self.stock_input_account.id,
+            })]
+        })
+
+        inv.action_invoice_open()
+
+        move_lines = inv.move_id.line_ids
+        self.assertEqual(len(move_lines), 2)
+
+        payable_line = move_lines.filtered(lambda l: l.account_id.internal_type == 'payable')
+        self.assertEqual(payable_line.amount_currency, -100.0)
+        self.assertAlmostEqual(payable_line.balance, -66.67)
+
+        stock_line = move_lines.filtered(lambda l: l.account_id == self.stock_input_account)
+        self.assertEqual(stock_line.amount_currency, 100.0)
+        self.assertAlmostEqual(stock_line.balance, 66.67)
+
+    def test_realtime_anglo_saxon_valuation_multicurrency_different_dates(self):
+        """
+        The PO and invoice are in the same foreign currency.
+        The PO is invoiced at a later date than its creation.
+        This should create a price difference entry for standard cost method
+        Not for average cost method though, since the PO and invoice have the same currency
+        """
+        company = self.env.user.company_id
+        company.anglo_saxon_accounting = True
+        self.product1.product_tmpl_id.categ_id.property_cost_method = 'average'
+        self.product1.product_tmpl_id.categ_id.property_valuation = 'real_time'
+
+        date_po = '2019-01-01'
+        date_invoice = '2019-01-16'
+
+        # SetUp product Average
+        self.product1.product_tmpl_id.write({
+            'purchase_method': 'purchase',
+            'property_account_creditor_price_difference': self.price_diff_account.id,
+        })
+        self.product1.invoice_policy = 'order'
+
+        # SetUp product Standard
+        # should have bought at 60 USD
+        # actually invoiced at 70 EUR > 35 USD
+        product_categ_standard = self.product1.product_tmpl_id.categ_id.copy({
+            'property_cost_method': 'standard',
+            'property_stock_account_input_categ_id': self.stock_input_account.id,
+            'property_stock_account_output_categ_id': self.stock_output_account.id,
+            'property_stock_valuation_account_id': self.stock_valuation_account.id,
+            'property_stock_journal': self.stock_journal.id,
+        })
+        product_standard = self.product1.product_tmpl_id.copy({
+            'categ_id': product_categ_standard.id,
+            'name': 'Standard Val',
+            'standard_price': 60,
+            'property_account_creditor_price_difference': self.price_diff_account.id
+        }).product_variant_id
+
+        # SetUp currency and rates
+        self.cr.execute("UPDATE res_company SET currency_id = %s WHERE id = %s", (self.usd_currency.id, company.id))
+        self.env['res.currency.rate'].search([]).unlink()
+        self.env['res.currency.rate'].create({
+            'name': date_po,
+            'rate': 1.0,
+            'currency_id': self.usd_currency.id,
+            'company_id': company.id,
+        })
+
+        self.env['res.currency.rate'].create({
+            'name': date_po,
+            'rate': 1.5,
+            'currency_id': self.eur_currency.id,
+            'company_id': company.id,
+        })
+
+        self.env['res.currency.rate'].create({
+            'name': date_invoice,
+            'rate': 2,
+            'currency_id': self.eur_currency.id,
+            'company_id': company.id,
+        })
+
+        # To allow testing validation of PO
+        def _today(*args, **kwargs):
+            return date_po
+        patchers = [
+            patch('odoo.fields.Date.context_today', _today),
+        ]
+
+        for p in patchers:
+            p.start()
+
+        # Proceed
+        po = self.env['purchase.order'].create({
+            'currency_id': self.eur_currency.id,
+            'partner_id': self.partner_id.id,
+            'order_line': [
+                (0, 0, {
+                    'name': self.product1.name,
+                    'product_id': self.product1.id,
+                    'product_qty': 1.0,
+                    'product_uom': self.product1.uom_po_id.id,
+                    'price_unit': 100.0,
+                    'date_planned': date_po,
+                }),
+                (0, 0, {
+                    'name': product_standard.name,
+                    'product_id': product_standard.id,
+                    'product_qty': 1.0,
+                    'product_uom': product_standard.uom_po_id.id,
+                    'price_unit': 40.0,
+                    'date_planned': date_po,
+                }),
+            ],
+        })
+        po.button_confirm()
+
+        line_product_average = po.order_line.filtered(lambda l: l.product_id == self.product1)
+        line_product_standard = po.order_line.filtered(lambda l: l.product_id == product_standard)
+
+        inv = self.env['account.invoice'].create({
+            'type': 'in_invoice',
+            'date_invoice': date_invoice,
+            'currency_id': self.eur_currency.id,
+            'purchase_id': po.id,
+            'partner_id': self.partner_id.id,
+            'invoice_line_ids': [
+                (0, 0, {
+                    'name': self.product1.name,
+                    'price_subtotal': 100.0,
+                    'price_unit': 100.0,
+                    'product_id': self.product1.id,
+                    'purchase_id': po.id,
+                    'purchase_line_id': line_product_average.id,
+                    'quantity': 1.0,
+                    'account_id': self.stock_input_account.id,
+                }),
+                (0, 0, {
+                    'name': product_standard.name,
+                    'price_subtotal': 70.0,
+                    'price_unit': 70.0,
+                    'product_id': product_standard.id,
+                    'purchase_id': po.id,
+                    'purchase_line_id': line_product_standard.id,
+                    'quantity': 1.0,
+                    'account_id': self.stock_input_account.id,
+                })
+            ]
+        })
+
+        inv.action_invoice_open()
+
+        for p in patchers:
+            p.stop()
+
+        move_lines = inv.move_id.line_ids
+        self.assertEqual(len(move_lines), 4)
+
+        # Ensure no exchange difference move has been created
+        self.assertTrue(all([not l.reconciled for l in move_lines]))
+
+        # PAYABLE CHECK
+        payable_line = move_lines.filtered(lambda l: l.account_id.internal_type == 'payable')
+        self.assertEqual(payable_line.amount_currency, -170.0)
+        self.assertAlmostEqual(payable_line.balance, -85.00)
+
+        # PRODUCTS CHECKS
+
+        # NO EXCHANGE DIFFERENCE (average)
+        # We ordered for a value of 100 EUR
+        # But by the time we are invoiced for it
+        # the foreign currency appreciated from 1.5 to 2.0
+        # We still have to pay 100 EUR, which now values at 50 USD
+        product_lines = move_lines.filtered(lambda l: l.product_id == self.product1)
+
+        # Stock-wise, we have been invoiced 100 EUR, and we ordered 100 EUR
+        # there is no price difference
+        # However, 100 EUR should be converted at the time of the invoice
+        stock_line = product_lines.filtered(lambda l: l.account_id == self.stock_input_account)
+        self.assertEqual(stock_line.amount_currency, 100.00)
+        self.assertAlmostEqual(stock_line.balance, 50.00)
+
+        # PRICE DIFFERENCE (STANDARD)
+        # We ordered a product that should have cost 60 USD (120 EUR)
+        # However, we effectively got invoiced 70 EUR (35 USD)
+        product_lines = move_lines.filtered(lambda l: l.product_id == product_standard)
+
+        stock_line = product_lines.filtered(lambda l: l.account_id == self.stock_input_account)
+        self.assertEqual(stock_line.amount_currency, 120.00)
+        self.assertAlmostEqual(stock_line.balance, 60.00)
+
+        price_diff_line = product_lines.filtered(lambda l: l.account_id == self.price_diff_account)
+        self.assertEqual(price_diff_line.amount_currency, -50.00)
+        self.assertAlmostEqual(price_diff_line.balance, -25.00)
+
+    def test_average_realtime_with_delivery_anglo_saxon_valuation_multicurrency_different_dates(self):
+        """
+        The PO and invoice are in the same foreign currency.
+        The delivery occurs in between PO validation and invoicing
+        The invoice is created at an even different date
+        This should create a price difference entry.
+        """
+        company = self.env.user.company_id
+        company.anglo_saxon_accounting = True
+        self.product1.product_tmpl_id.categ_id.property_cost_method = 'average'
+        self.product1.product_tmpl_id.categ_id.property_valuation = 'real_time'
+
+        date_po = '2019-01-01'
+        date_delivery = '2019-01-08'
+        date_invoice = '2019-01-16'
+
+        product_avg = self.product1.product_tmpl_id.copy({
+            'purchase_method': 'purchase',
+            'name': 'AVG',
+            'standard_price': 60,
+            'property_account_creditor_price_difference': self.price_diff_account.id
+        }).product_variant_id
+        product_avg.invoice_policy = 'order'
+
+        # SetUp currency and rates
+        self.cr.execute("UPDATE res_company SET currency_id = %s WHERE id = %s", (self.usd_currency.id, company.id))
+        self.env['res.currency.rate'].search([]).unlink()
+        self.env['res.currency.rate'].create({
+            'name': date_po,
+            'rate': 1.0,
+            'currency_id': self.usd_currency.id,
+            'company_id': company.id,
+        })
+
+        self.env['res.currency.rate'].create({
+            'name': date_po,
+            'rate': 1.5,
+            'currency_id': self.eur_currency.id,
+            'company_id': company.id,
+        })
+
+        self.env['res.currency.rate'].create({
+            'name': date_delivery,
+            'rate': 0.7,
+            'currency_id': self.eur_currency.id,
+            'company_id': company.id,
+        })
+
+        self.env['res.currency.rate'].create({
+            'name': date_invoice,
+            'rate': 2,
+            'currency_id': self.eur_currency.id,
+            'company_id': company.id,
+        })
+
+        # To allow testing validation of PO
+        def _today(*args, **kwargs):
+            return date_po
+        # To allow testing validation of Delivery
+        def _now(*args, **kwargs):
+            return date_delivery + ' 01:00:00'
+
+        patchers = [
+            patch('odoo.fields.Date.context_today', _today),
+            patch('odoo.fields.Datetime.now', _now),
+        ]
+
+        for p in patchers:
+            p.start()
+
+        # Proceed
+        po = self.env['purchase.order'].create({
+            'currency_id': self.eur_currency.id,
+            'partner_id': self.partner_id.id,
+            'order_line': [
+                (0, 0, {
+                    'name': product_avg.name,
+                    'product_id': product_avg.id,
+                    'product_qty': 1.0,
+                    'product_uom': product_avg.uom_po_id.id,
+                    'price_unit': 30.0,
+                    'date_planned': date_po,
+                })
+            ],
+        })
+        po.button_confirm()
+
+        line_product_avg = po.order_line.filtered(lambda l: l.product_id == product_avg)
+
+        picking = po.picking_ids
+        (picking.move_lines
+            .filtered(lambda l: l.purchase_line_id == line_product_avg)
+            .write({'quantity_done': 1.0}))
+
+        picking.button_validate()
+
+        inv = self.env['account.invoice'].create({
+            'type': 'in_invoice',
+            'date_invoice': date_invoice,
+            'currency_id': self.eur_currency.id,
+            'purchase_id': po.id,
+            'partner_id': self.partner_id.id,
+            'invoice_line_ids': [
+                (0, 0, {
+                    'name': product_avg.name,
+                    'price_subtotal': 30.0,
+                    'price_unit': 30.0,
+                    'product_id': product_avg.id,
+                    'purchase_id': po.id,
+                    'purchase_line_id': line_product_avg.id,
+                    'quantity': 1.0,
+                    'account_id': self.stock_input_account.id,
+                })
+            ]
+        })
+
+        inv.action_invoice_open()
+
+        for p in patchers:
+            p.stop()
+
+        move_lines = inv.move_id.line_ids
+        self.assertEqual(len(move_lines), 2)
+
+        # PAYABLE CHECK
+        payable_line = move_lines.filtered(lambda l: l.account_id.internal_type == 'payable')
+        self.assertEqual(payable_line.amount_currency, -30.0)
+        self.assertAlmostEqual(payable_line.balance, -15.00)
+
+        # PRODUCTS CHECKS
+
+        # DELIVERY DIFFERENCE (AVERAGE)
+        # We ordered a product at 30 EUR valued at 20 USD
+        # We received it when the exchange rate has appreciated
+        # So, the actualized 20 USD are now 20*1.5/0.7 = 42.86 USD
+        product_lines = move_lines.filtered(lambda l: l.product_id == product_avg)
+
+        # Although those 42.86 USD are just due to the exchange difference
+        stock_line = product_lines.filtered(lambda l: l.account_id == self.stock_input_account)
+        self.assertEqual(stock_line.journal_id, inv.journal_id)
+        self.assertEqual(stock_line.amount_currency, 30.00)
+        self.assertAlmostEqual(stock_line.balance, 15.00)
+        full_reconcile = stock_line.full_reconcile_id
+        self.assertTrue(full_reconcile.exists())
+
+        reconciled_lines = full_reconcile.reconciled_line_ids - stock_line
+        self.assertEqual(len(reconciled_lines), 2)
+
+        stock_journal_line = reconciled_lines.filtered(lambda l: l.journal_id == self.stock_journal)
+        self.assertEqual(stock_journal_line.amount_currency, -30.00)
+        self.assertAlmostEqual(stock_journal_line.balance, -42.86)
+
+        exhange_diff_journal = company.currency_exchange_journal_id.exists()
+        exchange_stock_line = reconciled_lines.filtered(lambda l: l.journal_id == exhange_diff_journal)
+        self.assertEqual(exchange_stock_line.amount_currency, 0.00)
+        self.assertAlmostEqual(exchange_stock_line.balance, 27.86)
diff --git a/addons/resource/security/resource_security.xml b/addons/resource/security/resource_security.xml
index e26ed21379ab1df1566efc64198becdd819fb918..85c628faa47dcaf3fab27e8a28f1d3e6f8cb45dd 100644
--- a/addons/resource/security/resource_security.xml
+++ b/addons/resource/security/resource_security.xml
@@ -19,5 +19,13 @@
         <field name="domain_force">[('resource_id.user_id', '=', user.id)]</field>
 		<field name="perm_read" eval="False"/>
     </record>
+
+    <record model="ir.rule" id="resource_calendar_leaves_rule_group_admin_modify">
+        <field name="name">resource.calendar.leaves: admin modifies global</field>
+        <field name="model_id" ref="model_resource_calendar_leaves"/>
+        <field name="groups" eval="[(4, ref('base.group_erp_manager'))]"/>
+        <field name="domain_force">[('resource_id', '=', False)]</field>
+        <field name="perm_read" eval="False"/>
+    </record>
 </data>
 </odoo>
diff --git a/addons/sale/__manifest__.py b/addons/sale/__manifest__.py
index 3c316a4ccea01921333a0831e0c578cdbdf2f25e..c358d656d9bb7316e94cfff05e3ccfa7755cf398 100644
--- a/addons/sale/__manifest__.py
+++ b/addons/sale/__manifest__.py
@@ -42,7 +42,6 @@ This module contains all the common features of Sales Management and eCommerce.
     'qweb': [
         "static/src/xml/account_reconciliation.xml",
     ],
-    'uninstall_hook': "uninstall_hook",
     'installable': True,
     'auto_install': False
 }
diff --git a/addons/sale/models/sale.py b/addons/sale/models/sale.py
index 79456e26d28d84eb3057cd55006135a9cfe8003b..a46f7ffebb835a23bd065a5e4acce2885d8db696 100644
--- a/addons/sale/models/sale.py
+++ b/addons/sale/models/sale.py
@@ -571,7 +571,9 @@ class SaleOrder(models.Model):
             invoice.compute_taxes()
             # Idem for partner
             so_payment_term_id = invoice.payment_term_id.id
+            fp_invoice = invoice.fiscal_position_id
             invoice._onchange_partner_id()
+            invoice.fiscal_position_id = fp_invoice
             # To keep the payment terms set on the SO
             invoice.payment_term_id = so_payment_term_id
             invoice.message_post_with_view('mail.message_origin_link',
@@ -650,10 +652,11 @@ class SaleOrder(models.Model):
 
     @api.multi
     def action_done(self):
-        tx = self.sudo().transaction_ids.get_last_transaction()
-        if tx and tx.state == 'pending' and tx.acquirer_id.provider == 'transfer':
-            tx._set_transaction_done()
-            tx.write({'is_processed': True})
+        for order in self:
+            tx = order.sudo().transaction_ids.get_last_transaction()
+            if tx and tx.state == 'pending' and tx.acquirer_id.provider == 'transfer':
+                tx._set_transaction_done()
+                tx.write({'is_processed': True})
         return self.write({'state': 'done'})
 
     @api.multi
@@ -1560,7 +1563,7 @@ class SaleOrderLine(models.Model):
             if currency_id.id == product_currency.id:
                 cur_factor = 1.0
             else:
-                cur_factor = currency_id._get_conversion_rate(product_currency, currency_id, self.company_id, self.order_id.date_order)
+                cur_factor = currency_id._get_conversion_rate(product_currency, currency_id, self.company_id or self.env.user.company_id, self.order_id.date_order or fields.Date.today())
 
         product_uom = self.env.context.get('uom') or product.uom_id.id
         if uom and uom.id != product_uom:
diff --git a/addons/sale/views/sale_portal_templates.xml b/addons/sale/views/sale_portal_templates.xml
index 1f85b2e7e32333ba9328682efcc972f688efd501..95e863c3a204d88461ae6d59d772b4ec2a65a2f9 100644
--- a/addons/sale/views/sale_portal_templates.xml
+++ b/addons/sale/views/sale_portal_templates.xml
@@ -124,7 +124,7 @@
             <div class="row mt16 o_portal_sale_sidebar">
                 <!-- Sidebar -->
                 <t t-call="portal.portal_record_sidebar">
-                    <t t-set="classes" t-value="'col-12 col-lg flex-lg-grow-0 d-print-none'"/>
+                    <t t-set="classes" t-value="'col-lg-auto d-print-none'"/>
 
                     <t t-set="title">
                         <h2 class="mb-0"><b t-field="sale_order.amount_total"/> </h2>
@@ -479,8 +479,8 @@
                                         <span t-esc="', '.join(map(lambda x: (x.description or x.name), line.tax_id))"/>
                                     </td>
                                     <td class="text-right">
-                                        <span t-field="line.price_subtotal" groups="account.group_show_line_subtotals_tax_excluded"/>
-                                        <span t-field="line.price_total" groups="account.group_show_line_subtotals_tax_included"/>
+                                        <span class="oe_order_line_price_subtotal" t-field="line.price_subtotal" groups="account.group_show_line_subtotals_tax_excluded"/>
+                                        <span class="oe_order_line_price_total" t-field="line.price_total" groups="account.group_show_line_subtotals_tax_included"/>
                                     </td>
                                 </t>
                                 <t t-if="line.display_type == 'line_section'">
@@ -519,7 +519,7 @@
                                 <td><strong>Subtotal</strong></td>
                                 <td class="text-right">
                                     <span
-                                        data-id="total_amount"
+                                        data-id="total_untaxed"
                                         t-field="sale_order.amount_untaxed"
                                         t-options='{"widget": "monetary","display_currency": sale_order.pricelist_id.currency_id}'
                                     />
diff --git a/addons/sale_management/controllers/portal.py b/addons/sale_management/controllers/portal.py
index 9547d8e182ba2a71c612653b41617e46a051dbc2..1796beb7223dea9007e9dc0ab4c91b4a737e2e6b 100644
--- a/addons/sale_management/controllers/portal.py
+++ b/addons/sale_management/controllers/portal.py
@@ -1,7 +1,10 @@
 # -*- coding: utf-8 -*-
 # Part of Odoo. See LICENSE file for full copyright and licensing details.
 
+from functools import partial
+
 from odoo import http
+from odoo.tools import formatLang
 from odoo.exceptions import AccessError, MissingError
 from odoo.http import request
 from odoo.addons.sale.controllers.portal import CustomerPortal
@@ -11,6 +14,13 @@ class CustomerPortal(CustomerPortal):
 
     @http.route(['/my/orders/<int:order_id>/update_line'], type='json', auth="public", website=True)
     def update(self, line_id, remove=False, unlink=False, order_id=None, access_token=None, **post):
+        values = self.update_line_dict(line_id, remove, unlink, order_id, access_token, **post)
+        if values:
+            return [values['order_line_product_uom_qty'], values['order_amount_total']]
+        return values
+
+    @http.route(['/my/orders/<int:order_id>/update_line_dict'], type='json', auth="public", website=True)
+    def update_line_dict(self, line_id, remove=False, unlink=False, order_id=None, access_token=None, input_quantity=False, **kwargs):
         try:
             order_sudo = self._document_check_access('sale.order', order_id, access_token=access_token)
         except (AccessError, MissingError):
@@ -24,10 +34,27 @@ class CustomerPortal(CustomerPortal):
         if unlink:
             order_line.unlink()
             return False  # return False to reload the page, the line must move back to options and the JS doesn't handle it
-        number = -1 if remove else 1
-        quantity = order_line.product_uom_qty + number
+
+        if input_quantity is not False:
+            quantity = input_quantity
+        else:
+            number = -1 if remove else 1
+            quantity = order_line.product_uom_qty + number
+
+        if quantity < 0:
+            quantity = 0.0
         order_line.write({'product_uom_qty': quantity})
-        return [str(quantity), str(order_sudo.amount_total)]
+        currency = order_sudo.currency_id
+        format_price = partial(formatLang, request.env, digits=currency.decimal_places)
+
+        return {
+            'order_line_product_uom_qty': str(quantity),
+            'order_line_price_total': format_price(order_line.price_total),
+            'order_line_price_subtotal': format_price(order_line.price_subtotal),
+            'order_amount_total': format_price(order_sudo.amount_total),
+            'order_amount_untaxed': format_price(order_sudo.amount_untaxed),
+            'order_amount_tax': format_price(order_sudo.amount_tax),
+        }
 
     @http.route(["/my/orders/<int:order_id>/add_option/<int:option_id>"], type='http', auth="public", website=True)
     def add(self, order_id, option_id, access_token=None, **post):
diff --git a/addons/sale_management/static/src/js/sale_management.js b/addons/sale_management/static/src/js/sale_management.js
index 7780663016623558c447385f0e663207838fa7fa..88b956e0e6e35884244fff1b1c96184df40b4f05 100644
--- a/addons/sale_management/static/src/js/sale_management.js
+++ b/addons/sale_management/static/src/js/sale_management.js
@@ -14,31 +14,155 @@ if (!$('.o_portal_sale_sidebar').length) {
         events: {
             'click' : 'onClick',
         },
-        onClick: function (ev) {
-            ev.preventDefault();
+        /**
+         * @override
+         */
+        start: function () {
             var self = this;
+            return this._super.apply(this, arguments).then(function () {
+                self.elems = self._getUpdatableElements();
+                self.elems.$lineQuantity.change(function (ev) {
+                    var quantity = parseInt(this.value);
+                    self._onChangeQuantity(quantity);
+                });
+            });
+        },
+        /**
+         * Process the change in line quantity
+         *
+         * @private
+         * @param {Int} quantity, the new quantity of the line
+         *    If not present it will increment/decrement the existing quantity
+         */
+        _onChangeQuantity: function (quantity) {
             var href = this.$el.attr("href");
             var order_id = href.match(/my\/orders\/([0-9]+)/);
             var line_id = href.match(/update_line\/([0-9]+)/);
             var params = {
                 'line_id': line_id[1],
-                'remove': self.$el.is('[href*="remove"]'),
-                'unlink': self.$el.is('[href*="unlink"]'),
+                'remove': this.$el.is('[href*="remove"]'),
+                'unlink': this.$el.is('[href*="unlink"]'),
+                'input_quantity': quantity >= 0 ? quantity : false,
             };
-            var token = href.match(/token=(.*)/);
+            var token = href.match(/token=([\w\d-]*)/)[1];
             if (token) {
                 params.access_token = token;
             }
-            var url = "/my/orders/" + parseInt(order_id[1]) + "/update_line";
-            ajax.jsonRpc(url, 'call', params).then(function (data) {
-                if (!data) {
-                    window.location.reload();
-                }
-                self.$el.parents('.input-group:first').find('.js_quantity').val(data[0]);
-                $('[data-id="total_amount"]>span').html(data[1]);
-            });
+
+            this._callUpdateLineRoute(order_id, params).then(this._updateOrderValues.bind(this));
             return false;
         },
+        /**
+         * Reacts to the click on the -/+ buttons
+         *
+         * @param {Event} ev
+         */
+        onClick: function (ev) {
+            ev.preventDefault();
+            return this._onChangeQuantity();
+        },
+        /**
+         * Calls the route to get updated values of the line and order
+         * when the quantity of a product has changed
+         *
+         * @private
+         * @param {Object} params
+         * @return {Deferred}
+         */
+        _callUpdateLineRoute: function (order_id, params) {
+            var def = new $.Deferred();
+            var url = "/my/orders/" + parseInt(order_id[1]) + "/update_line_dict";
+            ajax.jsonRpc(url, 'call', params)
+                .then(def.resolve.bind(def))
+                .fail(function () {
+                    // Compatibility: the server may not have been restarted
+                    // So the real route may not exist
+                    delete params.input_quantity;
+                    ajax.jsonRpc("/quote/update_line", 'call', params)
+                        .fail(def.reject.bind(def))
+                        .then(function (data) {
+                            // Data is an array, convert it to a dict
+                            var actualData = data;
+                            if (data) {
+                                actualData = {
+                                    order_amount_total: data[1],
+                                    order_line_product_uom_qty: data[0],
+                                };
+                            }
+                            def.resolve(actualData);
+                        });
+                });
+            return def;
+        },
+        /**
+         * Processes data from the server to update the UI
+         *
+         * @private
+         * @param {Object} data: contains order and line updated values
+         */
+        _updateOrderValues: function (data) {
+            if (!data) {
+                window.location.reload();
+            }
+
+            var orderAmountTotal = data.order_amount_total;
+            var orderAmountUntaxed = data.order_amount_untaxed;
+            var orderAmountTax = data.order_amount_tax;
+
+            var lineProductUomQty = data.order_line_product_uom_qty;
+            var linePriceTotal = data.order_line_price_total;
+            var linePriceSubTotal = data.order_line_price_subtotal;
+
+            this.elems.$lineQuantity.val(lineProductUomQty)
+
+            if (this.elems.$linePriceTotal.length && linePriceTotal !== undefined) {
+                this.elems.$linePriceTotal.text(linePriceTotal);
+            }
+            if (this.elems.$linePriceSubTotal.length && linePriceSubTotal !== undefined) {
+                this.elems.$linePriceSubTotal.text(linePriceSubTotal);
+            }
+
+            if (orderAmountUntaxed !== undefined) {
+                this.elems.$orderAmountUntaxed.text(orderAmountUntaxed);
+            }
+
+            if (orderAmountTotal !== undefined) {
+                this.elems.$orderAmountTotal.text(orderAmountTotal);
+            }
+        },
+        /**
+         * Locate in the DOM the elements to update
+         * Mostly for compatibility, when the module has not been upgraded
+         * In that case, we need to fall back to some other elements
+         *
+         * @private
+         * @return {Object}: Jquery elements to update
+         */
+        _getUpdatableElements: function () {
+            var $parentTr = this.$el.parents('tr:first');
+            var $linePriceTotal = $parentTr.find('.oe_order_line_price_total .oe_currency_value');
+            var $linePriceSubTotal = $parentTr.find('.oe_order_line_price_subtotal .oe_currency_value');
+
+            if (!$linePriceTotal.length && !$linePriceSubTotal.length) {
+                $linePriceTotal = $linePriceSubTotal = $parentTr.find('.oe_currency_value').last();
+            }
+
+            var $orderAmountUntaxed = $('[data-id="total_untaxed"]>span');
+            var $orderAmountTotal = $('[data-id="total_amount"]>span');
+
+            if (!$orderAmountUntaxed.length) {
+                $orderAmountUntaxed = $orderAmountTotal.eq(1);
+                $orderAmountTotal = $orderAmountTotal.eq(0).add($orderAmountTotal.eq(3));
+            }
+
+            return {
+                $lineQuantity: this.$el.parents('.input-group:first').find('.js_quantity'),
+                $linePriceSubTotal: $linePriceSubTotal,
+                $linePriceTotal: $linePriceTotal,
+                $orderAmountUntaxed: $orderAmountUntaxed,
+                $orderAmountTotal: $orderAmountTotal,
+            }
+        }
     });
 
     var update_button_list = [];
diff --git a/addons/sale_management/tests/test_sale_ui.py b/addons/sale_management/tests/test_sale_ui.py
index 6ec2f4167c1361e96ebbd74302c65101b565563a..5343aafe7b4458b41e5030cef75cb0c8b0dd04fb 100644
--- a/addons/sale_management/tests/test_sale_ui.py
+++ b/addons/sale_management/tests/test_sale_ui.py
@@ -93,8 +93,8 @@ class TestUi(odoo.tests.HttpCase):
         admin = self.env.ref('base.user_admin')
 
         # Activate B2C
-        self.env.ref('account.group_show_line_subtotals_tax_included').users |= admin
         self.env.ref('account.group_show_line_subtotals_tax_excluded').users -= admin
+        self.env.ref('account.group_show_line_subtotals_tax_included').users |= admin
 
         # Active pricelist on SO
         self.env.ref('product.group_sale_pricelist').users |= admin
diff --git a/addons/sale_quotation_builder/views/sale_order_views.xml b/addons/sale_quotation_builder/views/sale_order_views.xml
index e46a0cdd68bf340461d5fb551ecc4fb43cd12d37..ff2eb495f4945fc7b4e4f4051a95fb21838a2af1 100644
--- a/addons/sale_quotation_builder/views/sale_order_views.xml
+++ b/addons/sale_quotation_builder/views/sale_order_views.xml
@@ -7,6 +7,13 @@
         <field name="inherit_id" ref="sale_management.sale_order_form_quote"/>
         <field name="arch" type="xml">
 
+            <xpath expr="//page/field[@name='order_line']/tree/field[@name='name']" position="after">
+                <field name="website_description" invisible="1" readonly="1"/>
+            </xpath>
+            <xpath expr="//page/field[@name='order_line']/form/field[@name='name']" position="after">
+                <field name="website_description" invisible="1" readonly="1"/>
+            </xpath>
+
             <xpath expr="//button[@name='button_add_to_order']" position="after">
             	<field name="website_description" invisible="1"/>
             </xpath>
diff --git a/addons/sale_timesheet/security/sale_timesheet_security.xml b/addons/sale_timesheet/security/sale_timesheet_security.xml
index f0f1f070edaabe21d5d8e997ad96e1efc6ddbb85..3f108758e605e2f9906a8a865be1f52149d0914e 100644
--- a/addons/sale_timesheet/security/sale_timesheet_security.xml
+++ b/addons/sale_timesheet/security/sale_timesheet_security.xml
@@ -3,17 +3,6 @@
 
     <data noupdate="1">
 
-        <record id="account_analytic_line_rule_billing_user" model="ir.rule">
-            <field name="name">account.analytic.line.billing.user</field>
-            <field name="model_id" ref="analytic.model_account_analytic_line"/>
-            <field name="domain_force">[(1, '=', 1)]</field>
-            <field name="groups" eval="[(4, ref('account.group_account_invoice'))]"/>
-            <field name="perm_create" eval="1"/>
-            <field name="perm_write" eval="1"/>
-            <field name="perm_unlink" eval="1"/>
-            <field name="perm_read" eval="0"/>
-        </record>
-
         <record id="sale_order_line_rule_project_manager" model="ir.rule">
             <field name="name">Project Manager Sales Orders Line</field>
             <field name="model_id" ref="sale.model_sale_order_line"/>
diff --git a/addons/stock/models/stock_move.py b/addons/stock/models/stock_move.py
index c0d255c93519da0ced342a7639698f08a41b6c2d..1224a5f63b53ef6c247a4eeb0b45e928a66b0ac1 100644
--- a/addons/stock/models/stock_move.py
+++ b/addons/stock/models/stock_move.py
@@ -907,8 +907,13 @@ class StockMove(models.Model):
         """
         assigned_moves = self.env['stock.move']
         partially_available_moves = self.env['stock.move']
+        # Read the `reserved_availability` field of the moves out of the loop to prevent unwanted
+        # cache invalidation when actually reserving the move.
+        reserved_availability = {move: move.reserved_availability for move in self}
+        roundings = {move: move.product_id.uom_id.rounding for move in self}
         for move in self.filtered(lambda m: m.state in ['confirmed', 'waiting', 'partially_available']):
-            missing_reserved_uom_quantity = move.product_uom_qty - move.reserved_availability
+            rounding = roundings[move]
+            missing_reserved_uom_quantity = move.product_uom_qty - reserved_availability[move]
             missing_reserved_quantity = move.product_uom._compute_quantity(missing_reserved_uom_quantity, move.product_id.uom_id, rounding_method='HALF-UP')
             if move.location_id.should_bypass_reservation()\
                     or move.product_id.type == 'consu':
@@ -935,7 +940,7 @@ class StockMove(models.Model):
                         continue
                     # If we don't need any quantity, consider the move assigned.
                     need = missing_reserved_quantity
-                    if float_is_zero(need, precision_rounding=move.product_id.uom_id.rounding):
+                    if float_is_zero(need, precision_rounding=rounding):
                         assigned_moves |= move
                         continue
                     # Reserve new quants and create move lines accordingly.
@@ -944,9 +949,9 @@ class StockMove(models.Model):
                     if available_quantity <= 0:
                         continue
                     taken_quantity = move._update_reserved_quantity(need, available_quantity, move.location_id, package_id=forced_package_id, strict=False)
-                    if float_is_zero(taken_quantity, precision_rounding=move.product_id.uom_id.rounding):
+                    if float_is_zero(taken_quantity, precision_rounding=rounding):
                         continue
-                    if need == taken_quantity:
+                    if float_compare(need, taken_quantity, precision_rounding=rounding) == 0:
                         assigned_moves |= move
                     else:
                         partially_available_moves |= move
@@ -1009,12 +1014,12 @@ class StockMove(models.Model):
                         # this case `quantity` is directly the quantity on the quants themselves.
                         available_quantity = self.env['stock.quant']._get_available_quantity(
                             move.product_id, location_id, lot_id=lot_id, package_id=package_id, owner_id=owner_id, strict=True)
-                        if float_is_zero(available_quantity, precision_rounding=move.product_id.uom_id.rounding):
+                        if float_is_zero(available_quantity, precision_rounding=rounding):
                             continue
                         taken_quantity = move._update_reserved_quantity(need, min(quantity, available_quantity), location_id, lot_id, package_id, owner_id)
-                        if float_is_zero(taken_quantity, precision_rounding=move.product_id.uom_id.rounding):
+                        if float_is_zero(taken_quantity, precision_rounding=rounding):
                             continue
-                        if need - taken_quantity == 0.0:
+                        if float_is_zero(need - taken_quantity, precision_rounding=rounding):
                             assigned_moves |= move
                             break
                         partially_available_moves |= move
diff --git a/addons/stock/models/stock_move_line.py b/addons/stock/models/stock_move_line.py
index 84118a583cca318227c99a1fbfc87022b39a3d48..9a12cc30b4a2f1157d46d39b570d49ac61b6215a 100644
--- a/addons/stock/models/stock_move_line.py
+++ b/addons/stock/models/stock_move_line.py
@@ -16,12 +16,12 @@ class StockMoveLine(models.Model):
     _order = "result_package_id desc, id"
 
     picking_id = fields.Many2one(
-        'stock.picking', 'Stock Picking',
+        'stock.picking', 'Stock Picking', auto_join=True,
         help='The stock operation where the packing has been made')
     move_id = fields.Many2one(
         'stock.move', 'Stock Move',
         help="Change to a better name", index=True)
-    company_id = fields.Many2one('res.company', string='Company', default=lambda self: self.env['res.users']._get_company(), readonly=True)
+    company_id = fields.Many2one('res.company', string='Company', related='move_id.company_id', store=True, readonly=True)
     product_id = fields.Many2one('product.product', 'Product', ondelete="cascade")
     product_uom_id = fields.Many2one('uom.uom', 'Unit of Measure', required=True)
     product_qty = fields.Float(
@@ -75,12 +75,6 @@ class StockMoveLine(models.Model):
             if line.lot_id and line.product_id != line.lot_id.product_id:
                 raise ValidationError(_('This lot %s is incompatible with this product %s' % (line.lot_id.name, line.product_id.display_name)))
 
-    @api.constrains('company_id', 'move_id')
-    def _check_same_company_id(self):
-        for line in self:
-            if line.move_id and line.move_id.company_id != line.company_id:
-                raise ValidationError(_('The move line a a different company than its move'))
-
     @api.one
     def _set_product_qty(self):
         """ The meaning of product_qty field changed lately and is now a functional field computing the quantity
diff --git a/addons/stock/models/stock_rule.py b/addons/stock/models/stock_rule.py
index 0571cc88ef420287814ac16951375089612184d6..8cb6557d68413e4117c594447eb6b7a71ca6a6a3 100644
--- a/addons/stock/models/stock_rule.py
+++ b/addons/stock/models/stock_rule.py
@@ -378,15 +378,22 @@ class ProcurementGroup(models.Model):
             ('picking_id.backorder_id', '=', False),
             ('product_id', '=', values['product_id'].id)]
 
+    @api.model
+    def _get_moves_to_assign_domain(self):
+        return expression.AND([
+            [('state', 'in', ['confirmed', 'partially_available'])],
+            [('product_uom_qty', '!=', 0.0)]
+        ])
+
     @api.model
     def _run_scheduler_tasks(self, use_new_cursor=False, company_id=False):
         # Minimum stock rules
         self.sudo()._procure_orderpoint_confirm(use_new_cursor=use_new_cursor, company_id=company_id)
 
         # Search all confirmed stock_moves and try to assign them
-        moves_to_assign = self.env['stock.move'].search([
-            ('state', 'in', ['confirmed', 'partially_available']), ('product_uom_qty', '!=', 0.0)
-        ], limit=None, order='priority desc, date_expected asc')
+        domain = self._get_moves_to_assign_domain()
+        moves_to_assign = self.env['stock.move'].search(domain, limit=None,
+            order='priority desc, date_expected asc')
         for moves_chunk in split_every(100, moves_to_assign.ids):
             self.env['stock.move'].browse(moves_chunk)._action_assign()
             if use_new_cursor:
diff --git a/addons/stock/models/stock_traceability.py b/addons/stock/models/stock_traceability.py
index b1345bed60fba1cdcd355a65a6d66dd7343ab73c..29e8ac22450cf18dc548970256ddaac8ec1d646d 100644
--- a/addons/stock/models/stock_traceability.py
+++ b/addons/stock/models/stock_traceability.py
@@ -21,7 +21,7 @@ class MrpStockReport(models.TransientModel):
     _description = 'Traceability Report'
 
     @api.model
-    def _get_move_lines(self, move_lines):
+    def _get_move_lines(self, move_lines, line_id=None):
         lines_seen = move_lines
         lines_todo = list(move_lines)
         while lines_todo:
@@ -43,7 +43,8 @@ class MrpStockReport(models.TransientModel):
                 ])
             else:
                 continue
-            lines_todo += list(lines)
+            if line_id is None or line_id in lines.ids:
+                lines_todo += list(lines)
             lines_seen |= lines
         return lines_seen - move_lines
 
@@ -178,7 +179,7 @@ class MrpStockReport(models.TransientModel):
                 lines = move_lines
             else:
                 # Traceability in case of consumed in.
-                lines = self._get_move_lines(move_line)
+                lines = self._get_move_lines(move_line, line_id=line_id)
         for line in lines:
             unfoldable = False
             if line.consume_line_ids or ( line.lot_id and self._get_move_lines(line) and model != "stock.production.lot"):
diff --git a/addons/stock/models/stock_warehouse.py b/addons/stock/models/stock_warehouse.py
index 010e4495c7a1b235c5819a969582dc7deea6db34..cf1dd8e031e92104512d9025383a24ec55e199fd 100644
--- a/addons/stock/models/stock_warehouse.py
+++ b/addons/stock/models/stock_warehouse.py
@@ -497,40 +497,48 @@ class Warehouse(models.Model):
         delivery_steps = vals.get('delivery_steps', def_values['delivery_steps'])
         code = vals.get('code') or self.code
         code = code.replace(' ', '').upper()
+        company_id = vals.get('company_id', self.company_id.id)
         sub_locations = {
             'lot_stock_id': {
                 'name': _('Stock'),
                 'active': True,
                 'usage': 'internal',
-                'barcode': code + '-STOCK'
+                'barcode': self._valid_barcode(code + '-STOCK', company_id)
             },
             'wh_input_stock_loc_id': {
                 'name': _('Input'),
                 'active': reception_steps != 'one_step',
                 'usage': 'internal',
-                'barcode': code + '-INPUT'
+                'barcode': self._valid_barcode(code + '-INPUT', company_id)
             },
             'wh_qc_stock_loc_id': {
                 'name': _('Quality Control'),
                 'active': reception_steps == 'three_steps',
                 'usage': 'internal',
-                'barcode': code + '-QUALITY'
+                'barcode': self._valid_barcode(code + '-QUALITY', company_id)
             },
             'wh_output_stock_loc_id': {
                 'name': _('Output'),
                 'active': delivery_steps != 'ship_only',
                 'usage': 'internal',
-                'barcode': code + '-OUTPUT'
+                'barcode': self._valid_barcode(code + '-OUTPUT', company_id)
             },
             'wh_pack_stock_loc_id': {
                 'name': _('Packing Zone'),
                 'active': delivery_steps == 'pick_pack_ship',
                 'usage': 'internal',
-                'barcode': code + '-PACKING'
+                'barcode': self._valid_barcode(code + '-PACKING', company_id)
             },
         }
         return sub_locations
 
+    def _valid_barcode(self, barcode, company_id):
+        location = self.env['stock.location'].with_context(active_test=False).search([
+            ('barcode', '=', barcode),
+            ('company_id', '=', company_id)
+        ])
+        return not location and barcode
+
     def _create_missing_locations(self, vals):
         """ It could happen that the user delete a mandatory location or a
         module with new locations was installed after some warehouses creation.
diff --git a/addons/stock/security/stock_security.xml b/addons/stock/security/stock_security.xml
index e33e665842a8d31520638ad57d3d63652adde6d6..87c63386ca7670253614cd0a3afbead9c1d84fc4 100644
--- a/addons/stock/security/stock_security.xml
+++ b/addons/stock/security/stock_security.xml
@@ -101,7 +101,7 @@
         <field name="name">stock_move_line multi-company</field>
         <field name="model_id" search="[('model','=','stock.move.line')]" model="ir.model"/>
         <field name="global" eval="True"/>
-        <field name="domain_force">[('company_id','child_of',[user.company_id.id])]</field>
+        <field name="domain_force">['|',('company_id','=',False),('company_id','child_of',[user.company_id.id])]</field>
      </record>
 
     <record model="ir.rule" id="stock_quant_rule">
diff --git a/addons/stock/static/src/xml/stock_traceability_report_backend.xml b/addons/stock/static/src/xml/stock_traceability_report_backend.xml
index e2aa016b5e6df329a4f03dce1a0fa9c9d32c4d0e..84e9552d507981fbb0a297495fb9f38b013e1c00 100644
--- a/addons/stock/static/src/xml/stock_traceability_report_backend.xml
+++ b/addons/stock/static/src/xml/stock_traceability_report_backend.xml
@@ -3,7 +3,7 @@
 <templates>
 
     <t t-name="stockReports.buttons">
-        <button type="button" class='btn btn-primary o_stock-widget-pdf'>PRINT</button>
+        <button type="button" class='btn btn-primary o_stock-widget-pdf d-none'>PRINT</button>
     </t>
 
     <div role="dialog" t-name='stockReports.errorModal' class="modal" id="editable_error" tabindex="-1" data-backdrop="static" style="z-index:9999;">
diff --git a/addons/stock/views/stock_move_views.xml b/addons/stock/views/stock_move_views.xml
index a89b280ddbcceff938093cfb2e480528be4baf79..adb5c50923b76c0bf1e84d6ff4a13f4579bb8800 100644
--- a/addons/stock/views/stock_move_views.xml
+++ b/addons/stock/views/stock_move_views.xml
@@ -71,7 +71,7 @@
             <field name="model">stock.move</field>
             <field name="priority">10</field>
             <field name="arch" type="xml">
-                <kanban class="o_kanban_mobile" create="0">
+                <kanban class="o_kanban_mobile">
                     <field name="product_id"/>
                     <field name="show_details_visible"/>
                     <field name="product_uom_qty"/>
diff --git a/addons/stock_account/models/product.py b/addons/stock_account/models/product.py
index 3ba8f85bf262acf9a6cf3da84e914495c106d64a..9d1eb3192860214314151804e4d315629c02f260 100644
--- a/addons/stock_account/models/product.py
+++ b/addons/stock_account/models/product.py
@@ -115,8 +115,11 @@ class ProductProduct(models.Model):
     def _get_fifo_candidates_in_move(self):
         """ Find IN moves that can be used to value OUT moves.
         """
+        return self._get_fifo_candidates_in_move_with_company()
+
+    def _get_fifo_candidates_in_move_with_company(self, move_company_id=False):
         self.ensure_one()
-        domain = [('product_id', '=', self.id), ('remaining_qty', '>', 0.0)] + self.env['stock.move']._get_in_base_domain()
+        domain = [('product_id', '=', self.id), ('remaining_qty', '>', 0.0)] + self.env['stock.move']._get_in_base_domain(move_company_id)
         candidates = self.env['stock.move'].search(domain, order='date, id')
         return candidates
 
@@ -158,18 +161,30 @@ class ProductProduct(models.Model):
             for row in res:
                 fifo_automated_values[(row[0], row[1])] = (row[2], row[3], list(row[4]))
 
-        product_values = {product: 0 for product in self}
-        product_move_ids = {product: [] for product in self}
+        product_values = {product.id: 0 for product in self}
+        product_move_ids = {product.id: [] for product in self}
+
         if to_date:
             domain = [('product_id', 'in', self.ids), ('date', '<=', to_date)] + StockMove._get_all_base_domain()
-            for move in StockMove.search(domain).with_context(prefetch_fields=False):
-                product_values[move.product_id] += move.value
-                product_move_ids[move.product_id].append(move.id)
+            value_field_name = 'value'
         else:
             domain = [('product_id', 'in', self.ids)] + StockMove._get_all_base_domain()
-            for move in StockMove.search(domain).with_context(prefetch_fields=False):
-                product_values[move.product_id] += move.remaining_value
-                product_move_ids[move.product_id].append(move.id)
+            value_field_name = 'remaining_value'
+
+        StockMove.check_access_rights('read')
+        query = StockMove._where_calc(domain)
+        StockMove._apply_ir_rules(query, 'read')
+        from_clause, where_clause, params = query.get_sql()
+        query_str = """
+            SELECT stock_move.product_id, SUM(COALESCE(stock_move.{}, 0.0)), ARRAY_AGG(stock_move.id)
+            FROM {}
+            WHERE {}
+            GROUP BY stock_move.product_id
+        """.format(value_field_name, from_clause, where_clause)
+        self.env.cr.execute(query_str, params)
+        for product_id, value, move_ids in self.env.cr.fetchall():
+            product_values[product_id] = value
+            product_move_ids[product_id] = move_ids
 
         for product in self:
             if product.cost_method in ['standard', 'average']:
@@ -185,9 +200,9 @@ class ProductProduct(models.Model):
             elif product.cost_method == 'fifo':
                 if to_date:
                     if product.product_tmpl_id.valuation == 'manual_periodic':
-                        product.stock_value = product_values[product]
+                        product.stock_value = product_values[product.id]
                         product.qty_at_date = product.with_context(company_owned=True, owner_id=False).qty_available
-                        product.stock_fifo_manual_move_ids = StockMove.browse(product_move_ids[product])
+                        product.stock_fifo_manual_move_ids = StockMove.browse(product_move_ids[product.id])
                     elif product.product_tmpl_id.valuation == 'real_time':
                         valuation_account_id = product.categ_id.property_stock_valuation_account_id.id
                         value, quantity, aml_ids = fifo_automated_values.get((product.id, valuation_account_id)) or (0, 0, [])
@@ -195,10 +210,10 @@ class ProductProduct(models.Model):
                         product.qty_at_date = quantity
                         product.stock_fifo_real_time_aml_ids = self.env['account.move.line'].browse(aml_ids)
                 else:
-                    product.stock_value, moves = product_values[product], StockMove.browse(product_move_ids[product])
+                    product.stock_value = product_values[product.id]
                     product.qty_at_date = product.with_context(company_owned=True, owner_id=False).qty_available
                     if product.product_tmpl_id.valuation == 'manual_periodic':
-                        product.stock_fifo_manual_move_ids = moves
+                        product.stock_fifo_manual_move_ids = StockMove.browse(product_move_ids[product.id])
                     elif product.product_tmpl_id.valuation == 'real_time':
                         valuation_account_id = product.categ_id.property_stock_valuation_account_id.id
                         value, quantity, aml_ids = fifo_automated_values.get((product.id, valuation_account_id)) or (0, 0, [])
diff --git a/addons/stock_account/models/stock.py b/addons/stock_account/models/stock.py
index 398b7d6d672cfce748497cb93bd6c68729633ce7..f8c2cf09b321acab6f1d300c401a698c35970a13 100644
--- a/addons/stock_account/models/stock.py
+++ b/addons/stock_account/models/stock.py
@@ -267,7 +267,7 @@ class StockMove(models.Model):
 
         # Find back incoming stock moves (called candidates here) to value this move.
         qty_to_take_on_candidates = quantity or valued_quantity
-        candidates = move.product_id._get_fifo_candidates_in_move()
+        candidates = move.product_id._get_fifo_candidates_in_move_with_company(move.company_id.id)
         new_standard_price = 0
         tmp_value = 0  # to accumulate the value taken on the candidates
         for candidate in candidates:
@@ -321,6 +321,7 @@ class StockMove(models.Model):
 
     def _run_valuation(self, quantity=None):
         self.ensure_one()
+        value_to_return = 0
         if self._is_in():
             valued_move_lines = self.move_line_ids.filtered(lambda ml: not ml.location_id._should_be_valued() and ml.location_dest_id._should_be_valued() and not ml.owner_id)
             valued_quantity = 0
@@ -378,7 +379,7 @@ class StockMove(models.Model):
                 'value': value_to_return,
                 'price_unit': price_unit if self._is_dropshipped() else -price_unit,
             })
-            return value_to_return
+        return value_to_return
 
     def _action_done(self, cancel_backorder=False):
         self.product_price_update_before_done()
diff --git a/addons/stock_dropshipping/models/purchase.py b/addons/stock_dropshipping/models/purchase.py
index 39196cd20bf45bf119912525d8e7545563a82b69..7fee03bc250ef687ff9860f66c6e3db5135047a6 100644
--- a/addons/stock_dropshipping/models/purchase.py
+++ b/addons/stock_dropshipping/models/purchase.py
@@ -14,12 +14,12 @@ class PurchaseOrderLine(models.Model):
             re['sale_line_id'] = self.sale_line_id.id
         return res
 
-    def _merge_in_existing_line(self, product_id, product_qty, product_uom, location_id, name, origin, values):
-        if values.get('route_ids') and values['route_ids'] == self.env.ref('stock_dropshipping.route_drop_shipping'):
-            return False
-        return super(PurchaseOrderLine, self)._merge_in_existing_line(
-            product_id=product_id, product_qty=product_qty, product_uom=product_uom,
-            location_id=location_id, name=name, origin=origin, values=values)
+    def _find_candidate(self, product_id, product_qty, product_uom, location_id, name, origin, company_id, values):
+        # if this is defined, this is a dropshipping line, so no
+        # this is to correctly map delivered quantities to the so lines
+        lines = self.filtered(lambda po_line: po_line.sale_line_id.id == values['sale_line_id']) if values.get('sale_line_id') else self
+        return super(PurchaseOrderLine, lines)._find_candidate(product_id, product_qty, product_uom, location_id, name, origin, company_id, values)
+
 
 class StockRule(models.Model):
     _inherit = 'stock.rule'
diff --git a/addons/stock_dropshipping/tests/test_dropship.py b/addons/stock_dropshipping/tests/test_dropship.py
index 9837d93f0af0a214d16d6f8e083bbdce95bcfe94..f70897f9eb8aeca2cd474fecd27ec7d2df2c1157 100644
--- a/addons/stock_dropshipping/tests/test_dropship.py
+++ b/addons/stock_dropshipping/tests/test_dropship.py
@@ -48,8 +48,21 @@ class TestDropship(common.TransactionCase):
         so.order_line.product_uom_qty = 2.00
         self.assertAlmostEqual(po_line.product_qty, 2.00)
 
-
-class TestDropship(common.TransactionCase):
+        # Create a new so line
+        sol2 = self.env['sale.order.line'].create({
+            'order_id': so.id,
+            'name': prod.name,
+            'product_id': prod.id,
+            'product_uom_qty': 3.00,
+            'product_uom': prod.uom_id.id,
+            'price_unit': 12,
+        })
+        # there is a new line
+        pol2 = po.order_line - po_line
+        # the first line is unchanged
+        self.assertAlmostEqual(po_line.product_qty, 2.00)
+        # the new line matches the new line on the so
+        self.assertAlmostEqual(pol2.product_qty, sol2.product_uom_qty)
 
     def test_00_dropship(self):
 
diff --git a/addons/theme_bootswatch/static/lib/bootswatch/cyborg/_variables.scss b/addons/theme_bootswatch/static/lib/bootswatch/cyborg/_variables.scss
index fda2a4bcc74e08b37a293486fe7b0a948fbf9d5b..dc354a087acb9ed416357fc229fe4ca63c65bf99 100644
--- a/addons/theme_bootswatch/static/lib/bootswatch/cyborg/_variables.scss
+++ b/addons/theme_bootswatch/static/lib/bootswatch/cyborg/_variables.scss
@@ -45,7 +45,7 @@ $body-color:    $gray-500 !default;
 
 // Fonts
 
-$font-family-sans-serif: "Roboto", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif !default;
+$font-family-sans-serif: "Roboto", "Noto", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif !default;
 
 $font-size-base: .875rem !default;
 
diff --git a/addons/web/doc/module.rst b/addons/web/doc/module.rst
index ffbe90d09337e67eb1cab922dffc9d8f6ef7a913..ca808254567e86165eb4db34ab7bf053fa79307d 100644
--- a/addons/web/doc/module.rst
+++ b/addons/web/doc/module.rst
@@ -412,7 +412,7 @@ responses":
 
 .. note::
 
-    By defaut, tests cases don't load templates either. We had not
+    By default, tests cases don't load templates either. We had not
     needed to perform any template rendering before here, so we must
     now enable templates loading via :js:attr:`the corresponding
     option <TestOptions.templates>`.
diff --git a/addons/web/static/lib/tempusdominus/tempusdominus.js b/addons/web/static/lib/tempusdominus/tempusdominus.js
index ffca0c8e632596056a63373984b49c57d337a973..4eaf0df2a6008d86112a514b3f76abe78179aa03 100644
--- a/addons/web/static/lib/tempusdominus/tempusdominus.js
+++ b/addons/web/static/lib/tempusdominus/tempusdominus.js
@@ -2754,7 +2754,8 @@ var TempusDominusBootstrap4 = function ($) {
         if ($target.length === 0) {
             return;
         }
-        if (config._options.debug || window.debug) {
+        // /!\ ODOO FIX: check on 'config' existence added by odoo
+        if (config && config._options.debug || window.debug) {
             return;
         }
         TempusDominusBootstrap4._jQueryInterface.call($target, 'hide', event);
diff --git a/addons/web/static/src/js/fields/basic_fields.js b/addons/web/static/src/js/fields/basic_fields.js
index fa2b904eeb9d153e399fdb90845a27c73f49f1fb..ad818146a21606296537c794d5ac95050896f9e6 100644
--- a/addons/web/static/src/js/fields/basic_fields.js
+++ b/addons/web/static/src/js/fields/basic_fields.js
@@ -805,7 +805,7 @@ var FieldBoolean = AbstractField.extend({
      * @returns {jQuery} the focusable checkbox input
      */
     getFocusableElement: function () {
-        return this.$input || $();
+        return this.mode === 'readonly' ? $() : this.$input;
     },
     /**
      * A boolean field is always set since false is a valid value.
@@ -1035,7 +1035,13 @@ var FieldFloatToggle = AbstractField.extend({
      * @returns {float} The current formatted value
      */
     _getDisplayedValue: function () {
-        return parseFloat(this._formatValue(this.value));
+        // this.value is a plain float
+        // Matches what is in Database
+        var usrFormatValue = this._formatValue(this.value);
+        // usrFormatValue is string
+        // contains a float represented in a user specific format
+        // the float is the fraction by [this.factor] of this.value
+        return field_utils.parse['float'](usrFormatValue);
     },
     /**
      * Formats the HTML input tag for edit mode and stores selection status.
@@ -1062,7 +1068,7 @@ var FieldFloatToggle = AbstractField.extend({
      * one is not in the range, the next value of the closest one will be chosen.
      *
      * @private
-     * @returns {number} The next formatted value in the range
+     * @returns {number} The next value in the range
      */
     _nextValue: function () {
         var range = this.nodeOptions.range;
@@ -1091,7 +1097,8 @@ var FieldFloatToggle = AbstractField.extend({
         if (this.mode === 'edit') {
             ev.stopPropagation(); // only stop propagation in edit mode
             var next_val = this._nextValue();
-            this._setValue(next_val.toString()); // will be parsed in _setValue
+            next_val = field_utils.format['float'](next_val);
+            this._setValue(next_val); // will be parsed in _setValue
         }
     },
 
diff --git a/addons/web/static/src/js/widgets/date_picker.js b/addons/web/static/src/js/widgets/date_picker.js
index 367ab23178d78075016e5526865183197f6ede50..57c935905e5e589329d9048f54496960e5dc7e5c 100644
--- a/addons/web/static/src/js/widgets/date_picker.js
+++ b/addons/web/static/src/js/widgets/date_picker.js
@@ -15,6 +15,7 @@ var DateWidget = Widget.extend({
         'change.datetimepicker': 'changeDatetime',
         'change .o_datepicker_input': 'changeDatetime',
         'input input': '_onInput',
+        'keydown': '_onKeydown',
         'show.datetimepicker': '_onDateTimePickerShow',
     },
     /**
@@ -239,6 +240,17 @@ var DateWidget = Widget.extend({
             this.$input.select();
         }
     },
+    /**
+     * @private
+     * @param {KeyEvent} ev
+     */
+    _onKeydown: function (ev) {
+        if (ev.which === $.ui.keyCode.ESCAPE) {
+            this.__libInput++;
+            this.$el.datetimepicker('hide');
+            this.__libInput--;
+        }
+    },
     /**
      * Prevents 'input' events triggered by the library to bubble up, as they
      * might have unwanted effects (like triggering 'field_changed' events in
diff --git a/addons/web/static/src/scss/bootstrap_overridden.scss b/addons/web/static/src/scss/bootstrap_overridden.scss
index c1f8cbb44d3a441aa9639e8083e8c7aa758507f0..50fde1fa6c2884e55a2a1ac984cb7a514b54fb28 100644
--- a/addons/web/static/src/scss/bootstrap_overridden.scss
+++ b/addons/web/static/src/scss/bootstrap_overridden.scss
@@ -61,7 +61,7 @@ $component-active-bg: $gray-200 !default;
 //
 // Font, line-height, and color for body text, headings, and more.
 
-$font-family-sans-serif: "Lucida Grande", Helvetica, Verdana, Arial, sans-serif !default;
+$font-family-sans-serif: "Noto", "Lucida Grande", Helvetica, Verdana, Arial, sans-serif !default;
 
 $font-size-base: $o-font-size-base !default;
 $line-height-base: $o-line-height-base !default;
diff --git a/addons/web/static/src/scss/fonts.scss b/addons/web/static/src/scss/fonts.scss
index bfabf4fe6fc012316ab79278725f15edd57aa8e4..0a8793c9a18cbdb9b583a5083f95290481747138 100644
--- a/addons/web/static/src/scss/fonts.scss
+++ b/addons/web/static/src/scss/fonts.scss
@@ -4,6 +4,36 @@
 $lato-font-path: '../fonts/lato';
 
 @mixin lato-font($type, $weight, $style) {
+    // Cyrillic: U+0400-04FF, U+0500-052F
+    @font-face {
+        font-family: 'Noto';
+        src: url('https://fonts.odoocdn.com/fonts/noto/NotoSans-#{$type}.woff2') format('woff2'),
+             url('https://fonts.odoocdn.com/fonts/noto/NotoSans-#{$type}.woff') format('woff'),
+             url('https://fonts.odoocdn.com/fonts/noto/NotoSans-#{$type}.ttf') format('truetype');
+        font-weight: $weight;
+        font-style: $style;
+        unicode-range: U+0400-04FF, U+0500-052F;
+    }
+    // Hebrew: U+0590-05FF, U+FB1D-FB4F
+    @font-face {
+        font-family: 'Noto';
+        src: url('https://fonts.odoocdn.com/fonts/noto/NotoSansHebrew-#{$type}.woff2') format('woff2'),
+             url('https://fonts.odoocdn.com/fonts/noto/NotoSansHebrew-#{$type}.woff') format('woff'),
+             url('https://fonts.odoocdn.com/fonts/noto/NotoSansHebrew-#{$type}.ttf') format('truetype');
+        font-weight: $weight;
+        font-style: $style;
+        unicode-range: U+0590-05FF, U+FB1D-FB4F;
+    }
+    // Arabic: U+0600-06FF, U+0750-077F
+    @font-face {
+        font-family: 'Noto';
+        src: url('https://fonts.odoocdn.com/fonts/noto/NotoSansArabic-#{$type}.woff2') format('woff2'),
+             url('https://fonts.odoocdn.com/fonts/noto/NotoSansArabic-#{$type}.woff') format('woff'),
+             url('https://fonts.odoocdn.com/fonts/noto/NotoSansArabic-#{$type}.ttf') format('truetype');
+        font-weight: $weight;
+        font-style: $style;
+        unicode-range: U+0600-06FF, U+0750-077F, U+08A0-08FF;
+    }
     @font-face {
         font-family: 'Lato';
         src: url('#{$lato-font-path}/Lato-#{$type}-webfont.eot');
diff --git a/addons/web/static/src/scss/layout_clean.scss b/addons/web/static/src/scss/layout_clean.scss
index 910abc763a40992852f5840842359da94a58cdbc..0a8f4b065af9a64037872b5a5aad38fea9c3f1a2 100644
--- a/addons/web/static/src/scss/layout_clean.scss
+++ b/addons/web/static/src/scss/layout_clean.scss
@@ -1,5 +1,5 @@
 .o_clean_footer, .o_clean_header, .o_report_layout_clean {
-    font-family: 'Lato';
+    font-family: 'Lato', 'Noto';
     color: #000;
 }
 .o_clean_header {
diff --git a/addons/web/static/tests/views/list_tests.js b/addons/web/static/tests/views/list_tests.js
index 9be3e427d9881241c64d1afec306aaaea3eadd8c..18dd10c52a6dcfd45a0341c65badd3a42afb3275 100644
--- a/addons/web/static/tests/views/list_tests.js
+++ b/addons/web/static/tests/views/list_tests.js
@@ -278,7 +278,40 @@ QUnit.module('Views', {
         list.destroy();
     });
 
-    QUnit.test('editable list datetimepicker destroy widget', function (assert) {
+    QUnit.test('editable list datetimepicker destroy widget (edition)', function (assert) {
+        assert.expect(6);
+        var done = assert.async();
+
+        var list = createView({
+            View: ListView,
+            model: 'foo',
+            data: this.data,
+            arch: '<tree editable="top">' +
+                    '<field name="date"/>' +
+                '</tree>',
+        });
+        list.$el.on({
+            'show.datetimepicker': function () {
+                assert.containsOnce(list, '.o_selected_row');
+                assert.containsOnce($('body'), '.bootstrap-datetimepicker-widget');
+
+                list.$('input.o_datepicker_input').trigger($.Event('keydown', {which: $.ui.keyCode.ESCAPE}));
+
+                assert.containsNone(list, '.o_selected_row');
+                assert.containsNone($('body'), '.bootstrap-datetimepicker-widget');
+
+                done();
+                list.destroy();
+            }
+        });
+
+        assert.containsN(list, '.o_data_row', 4);
+        assert.containsNone(list, '.o_selected_row');
+
+        testUtilsDom.click(list.$('.o_data_cell:first'));
+    });
+
+    QUnit.test('editable list datetimepicker destroy widget (new line)', function (assert) {
         assert.expect(7);
         var done = assert.async();
 
@@ -4219,6 +4252,50 @@ QUnit.module('Views', {
 
         list.destroy();
     });
+
+    QUnit.test('readonly boolean in editable list is readonly', function (assert) {
+        assert.expect(6);
+
+        var list = createView({
+            View: ListView,
+            model: 'foo',
+            data: this.data,
+            arch: '<tree editable="bottom">' +
+                      '<field name="foo"/>' +
+                      '<field name="bar" attrs="{\'readonly\': [(\'foo\', \'!=\', \'yop\')]}"/>' +
+                  '</tree>',
+        });
+
+        // clicking on disabled checkbox with active row does not work
+        var $disabledCell = list.$('.o_data_row:eq(1) .o_data_cell:last-child');
+        testUtils.dom.click($disabledCell.prev());
+        assert.containsOnce($disabledCell, ':disabled:checked');
+        var $disabledLabel = $disabledCell.find('.custom-control-label');
+        testUtils.dom.click($disabledLabel);
+        assert.containsOnce($disabledCell, ':checked',
+            "clicking disabled checkbox did not work"
+        );
+        assert.ok(
+            $(document.activeElement).is('input[type="text"]'),
+            "disabled checkbox is not focused after click"
+        );
+
+        // clicking on enabled checkbox with active row toggles check mark
+        var $enabledCell = list.$('.o_data_row:eq(0) .o_data_cell:last-child');
+        testUtils.dom.click($enabledCell.prev());
+        assert.containsOnce($enabledCell, ':checked:not(:disabled)');
+        var $enabledLabel = $enabledCell.find('.custom-control-label');
+        testUtils.dom.click($enabledLabel);
+        assert.containsNone($enabledCell, ':checked',
+            "clicking enabled checkbox worked and unchecked it"
+        );
+        assert.ok(
+            $(document.activeElement).is('input[type="checkbox"]'),
+            "enabled checkbox is focused after click"
+        );
+
+        list.destroy();
+    });
 });
 
 });
diff --git a/addons/web/static/tests/views/search_view_tests.js b/addons/web/static/tests/views/search_view_tests.js
index bb6fa17d8e6dd1b373930a0415e90f459ff5f2c5..30304e63fe3b59626304ae95decc6767dcc5b9a6 100644
--- a/addons/web/static/tests/views/search_view_tests.js
+++ b/addons/web/static/tests/views/search_view_tests.js
@@ -737,6 +737,37 @@ QUnit.module('Search View', {
         actionManager.destroy();
     });
 
+    QUnit.test('Filter with JSON-parsable domain works', function (assert) {
+        assert.expect(1);
+
+        var domain = [['foo' ,'=', 'Gently Weeps']];
+        var xml_domain = JSON.stringify(domain);
+
+        var actionManager = createActionManager({
+            actions: this.actions,
+            archs: this.archs,
+            data: this.data,
+            mockRPC: function (route, args) {
+                if (route === '/web/dataset/search_read') {
+                    assert.deepEqual(args.domain, domain,
+                        'A JSON parsable xml domain should be handled just like any other');
+                }
+                return this._super.apply(this, arguments);
+            }
+        });
+
+        this.archs['partner,5,search'] =
+            '<search>'+
+                '<filter string="Foo" name="gently_weeps" domain="' + _.escape(xml_domain) + '" />' +
+            '</search>';
+        this.actions[0].search_view_id = [5, 'search'];
+        this.actions[0].context = {search_default_gently_weeps: true};
+
+        actionManager.doAction(1);
+
+        actionManager.destroy();
+    });
+
     QUnit.module('Favorites Menu');
 
     QUnit.test('dynamic filters are saved dynamic', function (assert) {
diff --git a/addons/web_editor/static/src/scss/bootstrap_overridden.scss b/addons/web_editor/static/src/scss/bootstrap_overridden.scss
index d1644a1174eda2ec02f477bf07e0537eeabfade7..4517852076f7a18ea77141dccf0706b7391ab41a 100644
--- a/addons/web_editor/static/src/scss/bootstrap_overridden.scss
+++ b/addons/web_editor/static/src/scss/bootstrap_overridden.scss
@@ -55,3 +55,5 @@ $gray-700: gray('700') !default;
 $gray-800: gray('800') !default;
 $gray-900: gray('900') !default;
 $black: gray('black') !default;
+
+$font-family-sans-serif: "Noto", "Lucida Grande", Helvetica, Verdana, Arial, sans-serif;
diff --git a/addons/website/models/res_users.py b/addons/website/models/res_users.py
index 6338a656d2c7624b309413f263764eb3c02f20c4..a84eaaeb3c6782d82498f5567e33c5fa2c5c5013 100644
--- a/addons/website/models/res_users.py
+++ b/addons/website/models/res_users.py
@@ -35,10 +35,12 @@ class ResUsers(models.Model):
 
     @api.model
     def _signup_create_user(self, values):
-        new_user = super(ResUsers, self)._signup_create_user(values)
         current_website = self.env['website'].get_current_website()
         if request and current_website.specific_user_account:
-            new_user.website_id = current_website
+            values['company_id'] = current_website.company_id.id
+            values['company_ids'] = [(4, current_website.company_id.id)]
+            values['website_id'] = current_website.id
+        new_user = super(ResUsers, self)._signup_create_user(values)
         return new_user
 
     @api.model
diff --git a/addons/website/static/src/js/content/website_root.js b/addons/website/static/src/js/content/website_root.js
index a665d4eba99f92b0cdc0e2adbbbe7c8831a8369c..f0d6b5c2c52dcd4bba75c9e395c56f6d5e34a2cb 100644
--- a/addons/website/static/src/js/content/website_root.js
+++ b/addons/website/static/src/js/content/website_root.js
@@ -364,8 +364,8 @@ var WebsiteRoot = rootWidget.RootWidget.extend(ServiceProviderMixin, {
         var $buttons = $(ev.currentTarget).find('button[type="submit"], a.a-submit');
         _.each($buttons, function (btn) {
             var $btn = $(btn);
-            $btn.attr('data-loading-text', '<i class="fa fa-spinner fa-spin"></i> ' + $(btn).text());
-            $btn.button('loading');
+            $btn.html('<i class="fa fa-spinner fa-spin"></i> ' + $btn.text());
+            $btn.prop('disabled', true);
         });
     },
     /**
diff --git a/addons/website/static/src/scss/primary_variables.scss b/addons/website/static/src/scss/primary_variables.scss
index 72bb93ba8e64bb9cf33a4cb56e4f2221d0219d6f..f008f655bdf4257b1dff6626262c68bed1df5ad3 100644
--- a/addons/website/static/src/scss/primary_variables.scss
+++ b/addons/website/static/src/scss/primary_variables.scss
@@ -61,7 +61,7 @@ $o-user-website-values: () !default;
 //------------------------------------------------------------------------------
 
 $o-theme-fonts: (
-    (-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"), // This is BS default
+    (-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Noto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"), // This is BS default
     ('Open Sans', sans-serif),
     ('Source Sans Pro', sans-serif),
     ('Raleway', sans-serif),
diff --git a/addons/website_event_sale/models/sale_order.py b/addons/website_event_sale/models/sale_order.py
index 097ce0adbafbdaf506e7fe718aacffd711a75731..cd25e6e19438b529bc8475b4dafdae3728656525 100644
--- a/addons/website_event_sale/models/sale_order.py
+++ b/addons/website_event_sale/models/sale_order.py
@@ -41,7 +41,7 @@ class SaleOrder(models.Model):
             values['product_id'] = ticket.product_id.id
             values['event_id'] = ticket.event_id.id
             values['event_ticket_id'] = ticket.id
-            values['price_unit'] = ticket.price_reduce or ticket.price
+            values['price_unit'] = ticket.price_reduce
             values['name'] = ticket.get_ticket_multiline_description_sale()
 
         # avoid writing related values that end up locking the product record
diff --git a/addons/website_forum/views/website_forum.xml b/addons/website_forum/views/website_forum.xml
index 6aa3040e453d2e95713860f991474f7e2301783c..b5ec5a82f3e9e3d711f962e76d47ae094bbc6b5f 100644
--- a/addons/website_forum/views/website_forum.xml
+++ b/addons/website_forum/views/website_forum.xml
@@ -66,9 +66,9 @@
                         <div class="card bg-secondary" t-if="question">
                             <h6 class="card-header"><b>Writer</b></h6>
                             <div class="card-body o_card_people">
-                                <img class="o_wforum_people_photo_container float-left mr-3" t-attf-src="/web/image/res.users/#{question.create_uid.id}/image_medium"/>
-                                <b><i class="fa fa-diamond text-secondary"/> <t t-esc="question.create_uid.sudo().karma"/></b>
-                                <h6>
+                                <img class="o_wforum_people_photo_container d-block mx-auto mb-3" t-attf-src="/web/image/res.users/#{question.create_uid.id}/image_medium"/>
+                                <h6 class="text-center">
+                                    <b><i class="fa fa-diamond text-secondary"/> <t t-esc="question.create_uid.sudo().karma"/></b>
                                     <b><a t-attf-href="/forum/#{slug(forum)}/user/#{question.create_uid.sudo().id}" t-field="question.create_uid" t-options='{"widget": "contact", "fields": ["name", "country_id"]}'/></b>
                                 </h6>
                             </div>
diff --git a/addons/website_livechat/models/__init__.py b/addons/website_livechat/models/__init__.py
index 13835e02e090e199ba725112a9615bd880b267de..18f7d71a23d492c33484f17223a281c24899a169 100644
--- a/addons/website_livechat/models/__init__.py
+++ b/addons/website_livechat/models/__init__.py
@@ -2,4 +2,5 @@
 
 from . import im_livechat
 from . import website
-from . import res_config_settings
\ No newline at end of file
+from . import res_config_settings
+from . import ir_http
diff --git a/addons/website_livechat/models/ir_http.py b/addons/website_livechat/models/ir_http.py
new file mode 100644
index 0000000000000000000000000000000000000000..baeab9ea57ed11ef7793aca7f63c7411d221b412
--- /dev/null
+++ b/addons/website_livechat/models/ir_http.py
@@ -0,0 +1,15 @@
+# -*- coding: utf-8 -*-
+# Part of Odoo. See LICENSE file for full copyright and licensing details.
+
+from odoo import api, fields, models
+from odoo.osv import expression
+
+
+class IrHttp(models.AbstractModel):
+    _inherit = 'ir.http'
+
+    @classmethod
+    def _get_translation_frontend_modules_domain(cls):
+        domain = super(IrHttp, cls)._get_translation_frontend_modules_domain()
+        return expression.OR([domain, [('name', '=', 'im_livechat')]])
+
diff --git a/addons/website_livechat/views/website_livechat.xml b/addons/website_livechat/views/website_livechat.xml
index e5f429fc8062832ba74fc09367a52315c53f4285..493de2d9cdb9e594842f92c5c71851873c20a4f1 100644
--- a/addons/website_livechat/views/website_livechat.xml
+++ b/addons/website_livechat/views/website_livechat.xml
@@ -167,19 +167,21 @@
                                         </h5>
                                         <div class="col-lg-12">
                                             <div class="row">
-                                                <div class="col-lg-4 pl-0 pr-0">
-                                                    <img t-attf-src='/rating/static/src/img/rating_10.png' alt="Great" width="16px" height="16px"/>
-                                                    <span class="align-middle"><t t-esc="ratings_per_user[user.partner_id.id]['great']"/>%</span>
-                                                </div>
-                                                <div class="col-lg-4 pl-0 pr-0">
-                                                    <img t-attf-src='/rating/static/src/img/rating_5.png' alt="Okay" width="16px" height="16px"/>
-                                                    <span class="align-middle"><t t-esc="ratings_per_user[user.partner_id.id]['okay']"/>%</span>
-                                                </div>
-                                                <div class="col-lg-4 pl-0 pr-0">
-                                                    <img t-attf-src='/rating/static/src/img/rating_1.png' alt="Bad" width="16px" height="16px"/>
-                                                    <span class="align-middle"><t t-esc="ratings_per_user[user.partner_id.id]['bad']"/>%</span>
-                                                </div>
-                                                <t t-if="user.partner_id.id not in ratings_per_user">
+                                                <t t-if="user.partner_id.id in ratings_per_user">
+                                                    <div class="col-lg-4 pl-0 pr-0">
+                                                        <img t-attf-src='/rating/static/src/img/rating_10.png' alt="Great" width="16px" height="16px"/>
+                                                        <span class="align-middle"><t t-esc="ratings_per_user[user.partner_id.id]['great']"/>%</span>
+                                                    </div>
+                                                    <div class="col-lg-4 pl-0 pr-0">
+                                                        <img t-attf-src='/rating/static/src/img/rating_5.png' alt="Okay" width="16px" height="16px"/>
+                                                        <span class="align-middle"><t t-esc="ratings_per_user[user.partner_id.id]['okay']"/>%</span>
+                                                    </div>
+                                                    <div class="col-lg-4 pl-0 pr-0">
+                                                        <img t-attf-src='/rating/static/src/img/rating_1.png' alt="Bad" width="16px" height="16px"/>
+                                                        <span class="align-middle"><t t-esc="ratings_per_user[user.partner_id.id]['bad']"/>%</span>
+                                                    </div>
+                                                </t>
+                                                <t t-else="">
                                                     <div class="col-lg-12 pl-0 pr-0 o_livechat_no_rating">Not rated yet</div>
                                                 </t>
                                             </div>
diff --git a/addons/website_sale/controllers/main.py b/addons/website_sale/controllers/main.py
index d33bada3ec984969e126ab7d09fab2179102197d..9d6275f1d7389fa525078181b5e537eef0835885 100644
--- a/addons/website_sale/controllers/main.py
+++ b/addons/website_sale/controllers/main.py
@@ -234,8 +234,9 @@ class WebsiteSale(ProductConfiguratorController):
 
         Category = request.env['product.public.category']
         search_categories = False
+        search_product = Product.search(domain)
         if search:
-            categories = Product.search(domain).mapped('public_categ_ids')
+            categories = search_product.mapped('public_categ_ids')
             search_categories = Category.search([('id', 'parent_of', categories.ids)] + request.website.website_domain())
             categs = search_categories.filtered(lambda c: not c.parent_id)
         else:
@@ -250,15 +251,14 @@ class WebsiteSale(ProductConfiguratorController):
                 parent_category_ids.append(current_category.parent_id.id)
                 current_category = current_category.parent_id
 
-        product_count = Product.search_count(domain)
+        product_count = len(search_product)
         pager = request.website.pager(url=url, total=product_count, page=page, step=ppg, scope=7, url_args=post)
         products = Product.search(domain, limit=ppg, offset=pager['offset'], order=self._get_search_order(post))
 
         ProductAttribute = request.env['product.attribute']
         if products:
             # get all products without limit
-            selected_products = Product.search(domain, limit=False)
-            attributes = ProductAttribute.search([('attribute_line_ids.value_ids', '!=', False), ('attribute_line_ids.product_tmpl_id', 'in', selected_products.ids)])
+            attributes = ProductAttribute.search([('attribute_line_ids.value_ids', '!=', False), ('attribute_line_ids.product_tmpl_id', 'in', search_product.ids)])        
         else:
             attributes = ProductAttribute.browse(attributes_ids)
 
@@ -609,6 +609,7 @@ class WebsiteSale(ProductConfiguratorController):
         new_values['customer'] = True
         new_values['team_id'] = request.website.salesteam_id and request.website.salesteam_id.id
         new_values['user_id'] = request.website.salesperson_id and request.website.salesperson_id.id
+        new_values['company_id'] = request.website.company_id.id
         new_values['website_id'] = request.website.id
 
         lang = request.lang if request.lang in request.website.mapped('language_ids.code') else None
diff --git a/addons/website_sale/models/sale_order.py b/addons/website_sale/models/sale_order.py
index ac325e501c5c8767fb0ace3a4576dc6322c4c878..562d6803b9ca4f31738c4ab778aaf41dff7e847b 100644
--- a/addons/website_sale/models/sale_order.py
+++ b/addons/website_sale/models/sale_order.py
@@ -133,7 +133,10 @@ class SaleOrder(models.Model):
                     pu = currency._convert(pu, order.pricelist_id.currency_id, order.company_id, date)
                 discount = (pu - price) / pu * 100
                 if discount < 0:
+                    # In case the discount is negative, we don't want to show it to the customer,
+                    # but we still want to use the price defined on the pricelist
                     discount = 0
+                    pu = price
         else:
             pu = product.price
             if order.pricelist_id and order.partner_id:
diff --git a/addons/website_sale/tests/test_website_sale_product_attribute_value_config.py b/addons/website_sale/tests/test_website_sale_product_attribute_value_config.py
index 6bd1f72ddc7c570ec945bfd2c14093bec2f7f5f9..89fc591b8e570c6a0a823a4066991330287ca954 100644
--- a/addons/website_sale/tests/test_website_sale_product_attribute_value_config.py
+++ b/addons/website_sale/tests/test_website_sale_product_attribute_value_config.py
@@ -34,8 +34,8 @@ class TestWebsiteSaleProductAttributeValueConfig(TestSaleProductAttributeValueSe
         pricelist.discount_policy = 'with_discount'
 
         # CASE: B2B setting
-        self.env.ref('account.group_show_line_subtotals_tax_excluded').users |= self.env.user
         self.env.ref('account.group_show_line_subtotals_tax_included').users -= self.env.user
+        self.env.ref('account.group_show_line_subtotals_tax_excluded').users |= self.env.user
 
         combination_info = self.computer._get_combination_info()
         self.assertEqual(combination_info['price'], 2222 * discount_rate * currency_ratio)
@@ -43,8 +43,8 @@ class TestWebsiteSaleProductAttributeValueConfig(TestSaleProductAttributeValueSe
         self.assertEqual(combination_info['has_discounted_price'], False)
 
         # CASE: B2C setting
-        self.env.ref('account.group_show_line_subtotals_tax_included').users |= self.env.user
         self.env.ref('account.group_show_line_subtotals_tax_excluded').users -= self.env.user
+        self.env.ref('account.group_show_line_subtotals_tax_included').users |= self.env.user
 
         combination_info = self.computer._get_combination_info()
         self.assertEqual(combination_info['price'], 2222 * discount_rate * currency_ratio * tax_ratio)
diff --git a/addons/website_sale_comparison/static/src/js/website_sale_tour_comparison.js b/addons/website_sale_comparison/static/src/js/website_sale_tour_comparison.js
new file mode 100644
index 0000000000000000000000000000000000000000..8c115eba011349d1f59b068b1c1092b9c0befe29
--- /dev/null
+++ b/addons/website_sale_comparison/static/src/js/website_sale_tour_comparison.js
@@ -0,0 +1,246 @@
+odoo.define('website_sale_comparison.tour_comparison', function (require) {
+    'use strict';
+
+    var tour = require('web_tour.tour');
+    var rpc = require('web.rpc');
+
+    tour.register('product_comparison', {
+        test: true,
+        url: "/shop",
+    }, [
+    // test from shop page
+    {
+        content: "add first product 'Three-Seat Sofa' in a comparison list",
+        trigger: '.oe_product_cart:contains("Three-Seat Sofa") .o_add_compare',
+    },
+    {
+        content: "check compare button contains one product",
+        trigger: '.o_product_circle:contains(1)',
+        run: function () {},
+    },
+    {
+        content: "check popover is closed when only one product",
+        trigger: 'body:not(:has(.comparator-popover))',
+        run: function () {},
+    },
+    {
+        content: "add second product 'Conference Chair' in a comparison list",
+        trigger: '.oe_product_cart:contains("Conference Chair") .o_add_compare',
+    },
+    {
+        content: "check popover is now open and compare button contains two products",
+        extra_trigger: '.comparator-popover',
+        trigger: ' .o_product_circle:contains(2)',
+        run: function () {},
+    },
+    {
+        content: "check products name are correct in the comparelist",
+        extra_trigger: '.o_product_row:contains("Three-Seat Sofa")',
+        trigger: '.o_product_row:contains("Conference Chair")',
+        run: function () {},
+    },
+    // test form product page
+    {
+        content: "go to product page of customizable desk(with variants)",
+        trigger: '.oe_product_cart a:contains("Customizable Desk")',
+    },
+    {
+        content: "check compare button is still there and contains 2 products",
+        extra_trigger: '#product_details',
+        trigger: '.o_product_circle:contains(2)',
+        run: function () {},
+    },
+    {
+        content: "check popover is closed after changing page",
+        trigger: 'body:not(:has(.comparator-popover))',
+        run: function () {},
+    },
+    {
+        content: "add first variant to comparelist",
+        trigger: '.o_add_compare_dyn',
+    },
+    {
+        content: "check the comparelist is now open and contains 3rd product with correct variant",
+        extra_trigger: '.comparator-popover',
+        trigger: '.o_product_row:contains("Customizable Desk (Steel, White)")',
+        run: function () {},
+    },
+    {
+        content: "select 2nd variant(Black Color)",
+        trigger: '.variant_attribute[data-attribute_name="Color"] input[data-value_name="Black"]',
+        run: function (actions) {
+          $('img[class*="product_detail_img"]').attr('data-image-to-change', 1);
+          actions.click();
+        },
+    },
+    {
+        content: "click on compare button to add in comparison list when variant changed",
+        extra_trigger: 'img[class*="product_detail_img"]:not([data-image-to-change])',
+        trigger: '.o_add_compare_dyn',
+    },
+    {
+        content: "comparelist contains 4th product with correct variant",
+        extra_trigger: '.o_product_circle:contains(4)',
+        trigger: '.o_product_row:contains("Customizable Desk (Steel, Black)")',
+        run: function () {},
+    },
+    {
+        content: "check limit is not reached",
+        trigger: ':not(.o_comparelist_limit_warning)',
+        run: function () {},
+    },
+    {
+        content: "select 3nd variant(Custom)",
+        trigger: '.variant_attribute[data-attribute_name="Legs"] input[data-value_name="Custom"]',
+    },
+    {
+        content: "click on compare button to add in comparison list when variant changed",
+        extra_trigger: 'body:not(:has(.carousel-indicators))', // there is 1 image on the custom variant
+        trigger: '.o_add_compare_dyn',
+    },
+    {
+        content: "check limit is reached",
+        trigger: '.o_comparelist_limit_warning',
+        run: function () {},
+    },
+    {
+        content: "click on compare button",
+        trigger: '.o_comparelist_button a',
+    },
+    // test on compare page
+    {
+        content: "check 1st product contains correct variant",
+        trigger: '.o_product_comparison_table:contains("Conference Chair (Steel)")',
+        run: function () {},
+    },
+    {
+        content: "check 2nd product contains correct variant",
+        trigger: '.o_product_comparison_table:contains("Customizable Desk (Steel, White)")',
+        run: function () {},
+    },
+    {
+        content: "check 3rd product is correctly added",
+        trigger: '.o_product_comparison_table:contains("Customizable Desk (Steel, Black)")',
+        run: function () {},
+    },
+    {
+        content: "check 4th product is correctly added",
+        trigger: '.o_product_comparison_table:contains("Three-Seat Sofa")',
+        run: function () {},
+    },
+    {
+        content: "remove one product from compare table",
+        trigger: '#o_comparelist_table',
+        run: function () {
+            // the content of the link is just a float, and the tour manager considers it invisible
+            $('#o_comparelist_table td:contains("Customizable Desk (Steel, Black)") .o_comparelist_remove').click();
+        },
+    },
+    {
+        content: "check customizable table with black variant is removed",
+        trigger: '#o_comparelist_table:not(:contains("Customizable Desk (Steel, Black)"))',
+        run: function () {},
+    },
+    {
+        content: "open compare menu",
+        extra_trigger: 'body:has(.o_product_row:contains("Three-Seat Sofa") .o_remove)',
+        trigger: '.o_product_panel_header',
+    },
+    {
+        content: "remove product",
+        trigger: '.o_product_row:contains("Three-Seat Sofa") .o_remove',
+    },
+    {
+        content: "click on compare button to reload",
+        trigger: '.o_comparelist_button a',
+    },
+    {
+        content: "check product 'Three-Seat Sofa' is removed",
+        trigger: '#o_comparelist_table:not(:contains("Three-Seat Sofa"))',
+        run: function () {},
+    },
+    {
+        content: "add product 'Conference Chair' to cart",
+        trigger: '.product_summary:contains("Conference Chair") .a-submit:contains("Add to Cart")',
+    },
+    {
+        content: "check product correctly added to cart",
+        trigger: '#cart_products:contains("Conference Chair") .js_quantity[value="1"]',
+        run: function () {},
+    },
+    // test advanced configuration and alternative product
+    {
+        content: "create product with newly created attribute and its values and set alternative product",
+        trigger: 'body',
+        run: function () {
+            rpc.query({
+                model: 'product.attribute',
+                method: 'create',
+                args: [{
+                    'name': 'color',
+                    'type': 'color',
+                    'create_variant': 'dynamic',
+                }],
+            }).then(function (attributeId) {
+                rpc.query({
+                    model: 'product.template',
+                    method: 'create',
+                    args: [{
+                        'name': 'Basic Chair',
+                        'is_published': true,
+                        'attribute_line_ids': [[0, 0, {
+                            'attribute_id': attributeId,
+                            'value_ids': [
+                                [0, 0, {'name': 'red', 'attribute_id': attributeId, 'sequence': 1}],
+                                [0, 0, {'name': 'blue', 'attribute_id': attributeId, 'sequence': 2}],
+                            ],
+                        }]],
+                    }],
+                }).then(function (productId) {
+                    rpc.query({
+                        model: 'product.template',
+                        method: 'create',
+                        args: [{
+                            'name': 'Classic Chair',
+                            'is_published': true,
+                            'attribute_line_ids': [[0, 0, {
+                                'attribute_id': attributeId,
+                                'value_ids': [
+                                    [0, 0, {'name': 'green', 'attribute_id': attributeId, 'sequence': 3}],
+                                    [0, 0, {'name': 'yellow', 'attribute_id': attributeId, 'sequence': 4}],
+                                ],
+                            }]],
+                            'alternative_product_ids': [[6, 0, [productId]]],
+                        }],
+                    }).then(function () {
+                        window.location.href = '/shop?search=Classic Chair';
+                    });
+                });
+            });
+        },
+    },
+    {
+        content: "click on product",
+        trigger: '.oe_product_cart a:contains("Classic Chair")',
+    },
+    {
+        content: "click on compare button",
+        trigger: '.btn.btn-primary:not(.btn-block):contains("Compare")',
+    },
+    {
+        content: "check product 'Classic Chair' with first variant (green) is on compare page",
+        trigger: '.o_product_comparison_table:contains("Classic Chair (green)")',
+        run: function () {},
+    },
+    {
+        content: "check alternative product 'Basic Chair' with first variant (red) is on compare page",
+        trigger: '.o_product_comparison_table:contains("Basic Chair (red)")',
+        run: function () {},
+    },
+    {
+        content: "check there is the correct attribute",
+        trigger: '.Uncategorized:contains("color"):contains("red")',
+        run: function () {},
+    },
+    ]);
+});
diff --git a/addons/website_sale_comparison/tests/test_website_sale_comparison.py b/addons/website_sale_comparison/tests/test_website_sale_comparison.py
index 91c68c7508a988840cda420ba8080d806292752c..1a17da59ab236b61186417485349206242dae9bf 100644
--- a/addons/website_sale_comparison/tests/test_website_sale_comparison.py
+++ b/addons/website_sale_comparison/tests/test_website_sale_comparison.py
@@ -55,3 +55,10 @@ class TestWebsiteSaleComparison(odoo.tests.TransactionCase):
         self.assertFalse(Website0.viewref(test_view_key, raise_if_not_found=False))
         # Check that the specific inherited view is correctly removed
         self.assertFalse(Website1.viewref(test_view_key, raise_if_not_found=False))
+
+
+@odoo.tests.tagged('post_install', '-at_install')
+class TestUi(odoo.tests.HttpCase):
+
+    def test_01_admin_tour_product_comparison(self):
+        self.phantom_js("/", "odoo.__DEBUG__.services['web_tour.tour'].run('product_comparison')", "odoo.__DEBUG__.services['web_tour.tour'].tours.product_comparison.ready", login='admin')
diff --git a/addons/website_sale_comparison/views/website_sale_comparison_template.xml b/addons/website_sale_comparison/views/website_sale_comparison_template.xml
index 26468eb57fafa45a7b283bccf15d7e8b22498b83..0f7a3627e0aaae2f8a2f81d1cdae11a39dc3cd7b 100644
--- a/addons/website_sale_comparison/views/website_sale_comparison_template.xml
+++ b/addons/website_sale_comparison/views/website_sale_comparison_template.xml
@@ -5,6 +5,7 @@
         <xpath expr="." position="inside">
             <link rel="stylesheet" type="text/scss" href="/website_sale_comparison/static/src/scss/website_sale_comparison.scss"/>
             <script type="text/javascript" src="/website_sale_comparison/static/src/js/website_sale_comparison.js"></script>
+            <script type="text/javascript" src="/website_sale_comparison/static/src/js/website_sale_tour_comparison.js"></script>
         </xpath>
     </template>
 
diff --git a/odoo/addons/base/data/res.lang.csv b/odoo/addons/base/data/res.lang.csv
index 30b7951c6f9ffe9dcc92af0917fe78b81c45e1f7..c12dd6e8cd27cebf05e3ee2b3815300c66e04e35 100644
--- a/odoo/addons/base/data/res.lang.csv
+++ b/odoo/addons/base/data/res.lang.csv
@@ -21,7 +21,7 @@
 "base.lang_en_GB","English (UK)","en_GB","en_GB","Left-to-Right","[3,0]",".",",","%d/%m/%Y","%H:%M:%S","True","7"
 "base.lang_et_EE","Estonian / Eesti keel","et_EE","et","Left-to-Right","[3,0]",","," ","%d.%m.%Y","%H:%M:%S","True","1"
 "base.lang_fi","Finnish / Suomi","fi_FI","fi","Left-to-Right","[3,0]",","," ","%d.%m.%Y","%H.%M.%S","True","1"
-"base.lang_fil","Filipino","fil_PH","fil","Left-to-Right","[3,0]",".",",","%m/%d/%y","%H:%M:%S","True","1"
+"base.lang_fil","Filipino","fil","fil","Left-to-Right","[3,0]",".",",","%m/%d/%y","%H:%M:%S","True","1"
 "base.lang_fr_BE","French (BE) / Français (BE)","fr_BE","fr_BE","Left-to-Right","[3,0]",",",".","%d/%m/%Y","%H:%M:%S","True","1"
 "base.lang_fr_CA","French (CA) / Français (CA)","fr_CA","fr_CA","Left-to-Right","[3,0]",","," ","%Y-%m-%d","%H:%M:%S","True","7"
 "base.lang_fr_CH","French (CH) / Français (CH)","fr_CH","fr_CH","Left-to-Right","[3,0]",".","'","%d. %m. %Y","%H:%M:%S","True","1"
diff --git a/odoo/addons/base/data/res_currency_data.xml b/odoo/addons/base/data/res_currency_data.xml
index 1c67808c8a21557204f3647a0f31cf0f0168a11a..02e933c3f40694a2550f6be9f556fecd7a0c268e 100644
--- a/odoo/addons/base/data/res_currency_data.xml
+++ b/odoo/addons/base/data/res_currency_data.xml
@@ -165,6 +165,7 @@
             <field name="name">ARS</field>
             <field name="symbol">$</field>
             <field name="rounding">0.01</field>
+            <field name="position">before</field>
             <field name="active" eval="False"/>
             <field name="currency_unit_label">Peso</field>
             <field name="currency_subunit_label">Centavos</field>
diff --git a/odoo/addons/base/models/ir_qweb_fields.py b/odoo/addons/base/models/ir_qweb_fields.py
index dcc03f0b36e467e2741f74daf8bc969555da0ef4..83d39e15891f832d1ccdcfcf770257d76203cff4 100644
--- a/odoo/addons/base/models/ir_qweb_fields.py
+++ b/odoo/addons/base/models/ir_qweb_fields.py
@@ -637,7 +637,7 @@ class Contact(models.AbstractModel):
 
     @api.model
     def value_to_html(self, value, options):
-        if not value.exists():
+        if not value:
             return False
 
         opf = options and options.get('fields') or ["name", "address", "phone", "mobile", "email"]
diff --git a/requirements.txt b/requirements.txt
index 96cd5c7852b409d7f1fcea443e1b7a5e3b67acc3..723b96efae55a831a34a2dd887e4d1ab9a1e15f1 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -9,7 +9,7 @@ gevent==1.3.4 ; sys_platform != 'win32' and python_version >= '3.7'
 greenlet==0.4.10 ; python_version < '3.7'
 greenlet==0.4.13 ; python_version >= '3.7'
 html2text==2016.9.19
-Jinja2==2.8.1
+Jinja2==2.10.1
 libsass==0.12.3
 lxml==3.7.1 ; sys_platform != 'win32' and python_version < '3.7'
 lxml==4.2.3 ; sys_platform != 'win32' and python_version >= '3.7'
diff --git a/setup/win32/winpy_requirements.txt b/setup/win32/winpy_requirements.txt
index c086ad3d823f0e075fc76d6616a60d7583c96985..41d3fd5adff6995ec932e0f0f77c2a80cbf4441d 100644
--- a/setup/win32/winpy_requirements.txt
+++ b/setup/win32/winpy_requirements.txt
@@ -6,7 +6,7 @@ feedparser==5.2.1
 gevent>=1.1.2
 greenlet>=0.4.10
 html2text==2016.9.19
-Jinja2==2.8
+Jinja2==2.10.1
 lxml>=3.5.0
 Mako==1.0.4
 MarkupSafe==0.23