diff --git a/addons/account/tests/__init__.py b/addons/account/tests/__init__.py
index 7bf7eabf15167f509533ea574f73614a421e2abc..004d914db65ef6eb2dfecc02d8dbe5901b60e549 100644
--- a/addons/account/tests/__init__.py
+++ b/addons/account/tests/__init__.py
@@ -1,6 +1,5 @@
 # -*- coding: utf-8 -*-
 
-from . import account_minimal_test
 from . import test_account_move_out_invoice
 from . import test_account_move_out_refund
 from . import test_account_move_in_invoice
diff --git a/addons/account/tests/account_minimal_test.py b/addons/account/tests/account_minimal_test.py
deleted file mode 100644
index daaaaa35652a710bdfce7523aa8166278da362b2..0000000000000000000000000000000000000000
--- a/addons/account/tests/account_minimal_test.py
+++ /dev/null
@@ -1,294 +0,0 @@
-# -*- coding: utf-8 -*-
-# Part of Odoo. See LICENSE file for full copyright and licensing details.
-
-from odoo.tests.common import SavepointCase
-
-
-class AccountMinimalTest(SavepointCase):
-    """ This should be loaded for non python tests in other modules that require
-    accounting test data but that don't depend on any localization"""
-
-    @classmethod
-    def setUpClass(cls):
-        super(AccountMinimalTest, cls).setUpClass()
-        cls.create_accounting_minimal_data()
-
-    @classmethod
-    def create_accounting_minimal_data(cls):
-        cls.company = cls.env.company
-        cls.company.bank_account_code_prefix = 'X1100'
-
-        # Chart of Accounts
-
-        # Account Tags
-        cls.demo_capital_account = cls.env['account.account.tag'].create({'name': 'Demo Capital Account'})
-        cls.demo_stock_account = cls.env['account.account.tag'].create({'name': 'Demo Stock Account'})
-        cls.demo_sale_of_land_account = cls.env['account.account.tag'].create({'name': 'Demo Sale of Land Account'})
-        cls.demo_ceo_wages_account = cls.env['account.account.tag'].create({'name': 'Demo CEO Wages Account'})
-        cls.demo_office_furniture_account = cls.env['account.account.tag'].create({'name': 'Office Furniture'})
-
-        # Balance Sheet
-        cls.xfa = cls.env['account.account'].create({
-            'code': 'X1000',
-            'name': 'Fixed Assets - (test)',
-            'user_type_id': cls.env.ref('account.data_account_type_fixed_assets').id,
-        })
-        cls.cas = cls.env['account.account'].create({
-            'code': 'X1010',
-            'name': 'Current Assets - (test)',
-            'user_type_id': cls.env.ref('account.data_account_type_current_assets').id,
-        })
-        cls.stk = cls.env['account.account'].create({
-            'code': 'X1011',
-            'name': 'Purchased Stocks - (test)',
-            'user_type_id': cls.env.ref('account.data_account_type_current_assets').id,
-            'tag_ids': [(6, 0, [cls.demo_stock_account.id])]
-        })
-        cls.a_recv = cls.env['account.account'].create({
-            'code': 'X1012',
-            'name': 'Debtors - (test)',
-            'reconcile': True,
-            'user_type_id': cls.env.ref('account.data_account_type_receivable').id,
-        })
-        cls.ova = cls.env['account.account'].create({
-            'code': 'X1013',
-            'name': 'VAT Paid- (test)',
-            'user_type_id': cls.env.ref('account.data_account_type_current_assets').id,
-        })
-        cls.bnk = cls.env['account.account'].create({
-            'code': 'X1014',
-            'name': 'Bank Current Account - (test)',
-            'user_type_id': cls.env.ref('account.data_account_type_liquidity').id,
-        })
-        cls.cash = cls.env['account.account'].create({
-            'code': 'X1015',
-            'name': 'Cash - (test)',
-            'user_type_id': cls.env.ref('account.data_account_type_liquidity').id,
-        })
-        cls.o_income = cls.env['account.account'].create({
-            'code': 'X1016',
-            'name': 'Opening Income - (test)',
-            'user_type_id': cls.env.ref('account.data_account_type_other_income').id,
-        })
-        cls.usd_bnk = cls.env['account.account'].create({
-            'code': 'X1017',
-            'name': 'USD Bank Account - (test)',
-            'user_type_id': cls.env.ref('account.data_account_type_liquidity').id,
-            'currency_id': cls.env.ref('base.USD').id,
-        })
-        cls.transfer_account = cls.env['account.account'].create({
-            'code': 'X1019',
-            'name': 'Internal Transfert Account - (test)',
-            'user_type_id': cls.env.ref('account.data_account_type_current_assets').id,
-            'reconcile': True,
-        })
-        cls.ncas = cls.env['account.account'].create({
-            'code': 'X1020',
-            'name': 'Non-current Assets - (test)',
-            'user_type_id': cls.env.ref('account.data_account_type_non_current_assets').id,
-        })
-        cls.prepayements = cls.env['account.account'].create({
-            'code': 'X1030',
-            'name': 'Prepayments - (test)',
-            'user_type_id': cls.env.ref('account.data_account_type_prepayments').id,
-        })
-        cls.current_liabilities = cls.env['account.account'].create({
-            'code': 'X1110',
-            'name': 'Current Liabilities - (test)',
-            'user_type_id': cls.env.ref('account.data_account_type_current_liabilities').id,
-        })
-        cls.a_pay = cls.env['account.account'].create({
-            'code': 'X1111',
-            'name': 'Creditors - (test)',
-            'user_type_id': cls.env.ref('account.data_account_type_payable').id,
-            'reconcile': True,
-        })
-        cls.iva = cls.env['account.account'].create({
-            'code': 'X1112',
-            'name': 'VAT Received - (test)',
-            'user_type_id': cls.env.ref('account.data_account_type_current_liabilities').id,
-        })
-        cls.rsa = cls.env['account.account'].create({
-            'code': 'X1113',
-            'name': 'Reserve and Profit/Loss - (test)',
-            'user_type_id': cls.env.ref('account.data_account_type_current_liabilities').id,
-        })
-        cls.cas = cls.env['account.account'].create({
-            'code': 'X1120',
-            'name': 'Non-current Liabilities - (test)',
-            'user_type_id': cls.env.ref('account.data_account_type_non_current_liabilities').id,
-        })
-        cls.o_expense = cls.env['account.account'].create({
-            'code': 'X1114',
-            'name': 'Opening Expense - (test)',
-            'user_type_id': cls.env.ref('account.data_account_type_expenses').id,
-        })
-
-        # Profit and Loss
-        cls.income_fx_income = cls.env['account.account'].create({
-            'code': 'X2010',
-            'name': 'Foreign Exchange Gain - (test)',
-            'user_type_id': cls.env.ref('account.data_account_type_revenue').id,
-            'reconcile': False,
-        })
-        cls.a_sale = cls.env['account.account'].create({
-            'code': 'X2020',
-            'name': 'Product Sales - (test)',
-            'user_type_id': cls.env.ref('account.data_account_type_revenue').id,
-            'tag_ids': [(6, 0, [cls.env.ref('account.account_tag_operating').id])],
-        })
-        cls.a_sale_invest = cls.env['account.account'].create({
-            'code': 'X2021',
-            'name': 'Sale of Lands - (test)',
-            'user_type_id': cls.env.ref('account.data_account_type_revenue').id,
-            'tag_ids': [(6, 0, [cls.env.ref('account.account_tag_investing').id])],
-        })
-        cls.a_sale_finance = cls.env['account.account'].create({
-            'code': 'X2022',
-            'name': 'Bank Accounts Interests - (test)',
-            'user_type_id': cls.env.ref('account.data_account_type_revenue').id,
-            'tag_ids': [(6, 0, [cls.env.ref('account.account_tag_financing').id])],
-        })
-        cls.a_sale_finance = cls.env['account.account'].create({
-            'code': 'X2030',
-            'name': 'Cost of Goods Sold - (test)',
-            'user_type_id': cls.env.ref('account.data_account_type_direct_costs').id,
-        })
-        cls.income_fx_expense = cls.env['account.account'].create({
-            'code': 'X2110',
-            'name': 'Foreign Exchange Loss - (test)',
-            'user_type_id': cls.env.ref('account.data_account_type_expenses').id,
-            'reconcile': False,
-        })
-        cls.a_expense = cls.env['account.account'].create({
-            'code': 'X2120',
-            'name': 'Expenses - (test)',
-            'user_type_id': cls.env.ref('account.data_account_type_expenses').id,
-            'tag_ids': [(6, 0, [cls.env.ref('account.account_tag_operating').id])],
-        })
-        cls.a_salary_expense = cls.env['account.account'].create({
-            'code': 'X2121',
-            'name': 'Salary Expenses - (test)',
-            'user_type_id': cls.env.ref('account.data_account_type_expenses').id,
-            'tag_ids': [(6, 0, [cls.env.ref('account.account_tag_operating').id])],
-        })
-        cls.a_expense_invest = cls.env['account.account'].create({
-            'code': 'X2122',
-            'name': 'Purchase of Equipments - (test)',
-            'user_type_id': cls.env.ref('account.data_account_type_fixed_assets').id,
-            'tag_ids': [(6, 0, [cls.env.ref('account.account_tag_investing').id])],
-        })
-        cls.a_expense_finance = cls.env['account.account'].create({
-            'code': 'X2123',
-            'name': 'Bank Fees - (test)',
-            'user_type_id': cls.env.ref('account.data_account_type_expenses').id,
-            'tag_ids': [(6, 0, [cls.env.ref('account.account_tag_financing').id])],
-        })
-        cls.a_capital = cls.env['account.account'].create({
-            'code': 'X3001',
-            'name': 'Capital',
-            'user_type_id': cls.env.ref('account.data_account_type_equity').id,
-        })
-        cls.a_dividends = cls.env['account.account'].create({
-            'code': 'X3002',
-            'name': 'Dividends',
-            'user_type_id': cls.env.ref('account.data_account_type_equity').id,
-        })
-
-        # Properties: Product income and expense accounts, default parameters
-        cls.env['ir.property'].create([{
-            'name': 'property_account_receivable_id',
-            'fields_id': cls.env['ir.model.fields'].search([('model', '=', 'res.partner'), ('name', '=', 'property_account_receivable_id')], limit=1).id,
-            'value': 'account.account,%s' % (cls.a_recv.id),
-            'company_id': cls.company.id,
-        }, {
-            'name': 'property_account_payable_id',
-            'fields_id': cls.env['ir.model.fields'].search([('model', '=', 'res.partner'), ('name', '=', 'property_account_payable_id')], limit=1).id,
-            'value': 'account.account,%s' % (cls.a_pay.id),
-            'company_id': cls.company.id,
-        }, {
-            'name': 'property_account_position_id',
-            'fields_id': cls.env['ir.model.fields'].search([('model', '=', 'res.partner'), ('name', '=', 'property_account_position_id')], limit=1).id,
-            'value': False,
-            'company_id': cls.company.id,
-        }, {
-            'name': 'property_account_expense_categ_id',
-            'fields_id': cls.env['ir.model.fields'].search([('model', '=', 'product.category'), ('name', '=', 'property_account_expense_categ_id')], limit=1).id,
-            'value': 'account.account,%s' % (cls.a_expense.id),
-            'company_id': cls.company.id,
-        }, {
-            'name': 'property_account_income_categ_id',
-            'fields_id': cls.env['ir.model.fields'].search([('model', '=', 'product.category'), ('name', '=', 'property_account_income_categ_id')], limit=1).id,
-            'value': 'account.account,%s' % (cls.a_sale.id),
-            'company_id': cls.company.id,
-        }])
-
-        # Bank Accounts
-        cls.bank_account = cls.env['res.partner.bank'].create({
-            'acc_number': '987654321',
-            'bank_name': 'Bank',
-            'partner_id': cls.company.partner_id.id,
-        })
-        cls.bank_account_usd = cls.env['res.partner.bank'].create({
-            'acc_number': '123456789',
-            'bank_name': 'Bank US',
-            'partner_id': cls.company.partner_id.id,
-        })
-
-        # Account Journal
-        cls.sales_journal = cls.env['account.journal'].create({
-            'name': 'Customer Invoices - Test',
-            'code': 'TINV',
-            'type': 'sale',
-            'default_credit_account_id': cls.a_sale.id,
-            'default_debit_account_id': cls.a_sale.id,
-            'refund_sequence': True,
-        })
-        cls.expenses_journal = cls.env['account.journal'].create({
-            'name': 'Vendor Bills - Test',
-            'code': 'TEXJ',
-            'type': 'purchase',
-            'default_credit_account_id': cls.a_expense.id,
-            'default_debit_account_id': cls.a_expense.id,
-            'refund_sequence': True,
-        })
-        cls.bank_journal = cls.env['account.journal'].create({
-            'name': 'Bank - Test',
-            'code': 'TBNK',
-            'type': 'bank',
-            'default_credit_account_id': cls.bnk.id,
-            'default_debit_account_id': cls.bnk.id,
-        })
-        cls.cash_journal = cls.env['account.journal'].create({
-            'name': 'Cash - Test',
-            'code': 'TCSH',
-            'type': 'cash',
-            'profit_account_id': cls.rsa.id,
-            'loss_account_id': cls.rsa.id,
-            'default_credit_account_id': cls.cash.id,
-            'default_debit_account_id': cls.cash.id,
-        })
-        cls.miscellaneous_journal = cls.env['account.journal'].create({
-            'name': 'Miscellaneous - Test',
-            'code': 'TMIS',
-            'type': 'general',
-            'show_on_dashboard': False,
-        })
-        cls.currency_diff_journal = cls.env['account.journal'].create({
-            'name': 'Currency Difference - Test',
-            'code': 'CUR',
-            'type': 'general',
-            'default_credit_account_id': cls.income_fx_expense.id,
-            'default_debit_account_id': cls.income_fx_income.id,
-            'show_on_dashboard': False,
-        })
-        cls.bank_journal_usd = cls.env['account.journal'].create({
-            'name': 'USD Bank - Test',
-            'code': 'TUBK',
-            'type': 'bank',
-            'default_credit_account_id': cls.usd_bnk.id,
-            'default_debit_account_id': cls.usd_bnk.id,
-            'bank_account_id': cls.bank_account_usd.id,
-        })
-
-        cls.company.currency_exchange_journal_id = cls.currency_diff_journal.id
diff --git a/addons/account/tests/account_test_classes.py b/addons/account/tests/account_test_classes.py
deleted file mode 100644
index 8db3804321f2cf26803c9b3aff8cc2b8ef461117..0000000000000000000000000000000000000000
--- a/addons/account/tests/account_test_classes.py
+++ /dev/null
@@ -1,49 +0,0 @@
-# -*- coding: utf-8 -*-
-
-import logging
-_logger = logging.getLogger(__name__)
-
-from odoo.tests.common import HttpCase, tagged
-from odoo.addons.account.tests.account_minimal_test import AccountMinimalTest
-
-class AccountingTestCase(AccountMinimalTest):
-    """ This class extends the base SavePoint Case, in order to test the
-    accounting with localization setups. It is configured to run the tests after
-    the installation of all modules, and will SKIP TESTS if it  cannot find an already
-    configured accounting (which means no localization module has been installed).
-    """
-
-    @classmethod
-    def setUpClass(cls):
-        super(AccountingTestCase, cls).setUpClass()
-        domain = [('company_id', '=', cls.env.company.id)]
-        if not cls.env['account.account'].search_count(domain):
-            _logger.warning('Test skipped because there is no chart of account defined ...')
-            cls.skipTest(cls, "No Chart of account found")
-
-    def ensure_account_property(self, property_name):
-        '''Ensure the ir.property targeting an account.account passed as parameter exists.
-        In case it's not: create it with a random account. This is useful when testing with
-        partially defined localization (missing stock properties for example)
-
-        :param property_name: The name of the property.
-        '''
-        company_id = self.env.company
-        field_id = self.env['ir.model.fields'].search(
-            [('model', '=', 'product.template'), ('name', '=', property_name)], limit=1)
-        property_id = self.env['ir.property'].search([
-            ('company_id', '=', company_id.id),
-            ('name', '=', property_name),
-            ('res_id', '=', None),
-            ('fields_id', '=', field_id.id)], limit=1)
-        account_id = self.env['account.account'].search([('company_id', '=', company_id.id)], limit=1)
-        value_reference = 'account.account,%d' % account_id.id
-        if property_id and not property_id.value_reference:
-            property_id.value_reference = value_reference
-        else:
-            self.env['ir.property'].create({
-                'name': property_name,
-                'company_id': company_id.id,
-                'fields_id': field_id.id,
-                'value_reference': value_reference,
-            })
diff --git a/addons/account/tests/account_test_no_chart.py b/addons/account/tests/account_test_no_chart.py
deleted file mode 100644
index a42bc2755dbed70910a2fd09248b675ab1625980..0000000000000000000000000000000000000000
--- a/addons/account/tests/account_test_no_chart.py
+++ /dev/null
@@ -1,130 +0,0 @@
-# -*- coding: utf-8 -*-
-# Part of Odoo. See LICENSE file for full copyright and licensing details.
-
-from odoo.tests.common import SavepointCase, HttpCase, tagged
-from odoo.addons.base.tests.common import SavepointCaseWithUserDemo
-
-class TestAccountNoChartCommon(SavepointCaseWithUserDemo):
-    """ Some tests required to be executed at module installation, and not 'post install', like moslty
-        of accounting tests, since a chart of account is required
-        This test setup class provides data for test suite to make business flow working without a chart
-        of account installed. The class provide some helpers methods to create particular document types. Each
-        test suite extending this method can call thoses method to set up their testing environment in their
-        own `setUpClass` method.
-    """
-
-    @classmethod
-    def setUpClass(cls):
-        """ This method set up the minimal requried part of chart of account """
-        super(TestAccountNoChartCommon, cls).setUpClass()
-        # To speed up test, create object without mail tracking
-        context_no_mail = {'no_reset_password': True, 'mail_create_nosubscribe': True, 'mail_create_nolog': True}
-
-        # Create base account to simulate a chart of account
-        user_type_payable = cls.env.ref('account.data_account_type_payable')
-        cls.account_payable = cls.env['account.account'].create({
-            'code': 'NC1110',
-            'name': 'Test Payable Account',
-            'user_type_id': user_type_payable.id,
-            'reconcile': True
-        })
-        user_type_receivable = cls.env.ref('account.data_account_type_receivable')
-        cls.account_receivable = cls.env['account.account'].create({
-            'code': 'NC1111',
-            'name': 'Test Receivable Account',
-            'user_type_id': user_type_receivable.id,
-            'reconcile': True
-        })
-
-        # Create a customer
-        Partner = cls.env['res.partner'].with_context(context_no_mail)
-        cls.partner_customer_usd = Partner.create({
-            'name': 'Customer from the North',
-            'email': 'customer.usd@north.com',
-            'property_account_payable_id': cls.account_payable.id,
-            'property_account_receivable_id': cls.account_receivable.id,
-            'company_id': cls.env.ref('base.main_company').id
-        })
-
-        cls.sale_journal0 = cls.env['account.journal'].create({
-            'name': 'Sale Journal',
-            'type': 'sale',
-            'code': 'SJT0',
-        })
-
-    @classmethod
-    def setUpAdditionalAccounts(cls):
-        """ Set up some addionnal accounts: expenses, revenue, ... """
-        user_type_income = cls.env.ref('account.data_account_type_direct_costs')
-        cls.account_income = cls.env['account.account'].create({
-            'code': 'NC1112', 'name':
-            'Sale - Test Account',
-            'user_type_id': user_type_income.id
-        })
-        user_type_expense = cls.env.ref('account.data_account_type_expenses')
-        cls.account_expense = cls.env['account.account'].create({
-            'code': 'NC1113',
-            'name': 'HR Expense - Test Purchase Account',
-            'user_type_id': user_type_expense.id
-        })
-        user_type_revenue = cls.env.ref('account.data_account_type_revenue')
-        cls.account_revenue = cls.env['account.account'].create({
-            'code': 'NC1114',
-            'name': 'Sales - Test Sales Account',
-            'user_type_id': user_type_revenue.id,
-            'reconcile': True
-        })
-
-    @classmethod
-    def setUpAccountJournal(cls):
-        """ Set up some journals: sale, purchase, ... """
-        cls.journal_purchase = cls.env['account.journal'].create({
-            'name': 'Purchase Journal - Test',
-            'code': 'AJ-PURC',
-            'type': 'purchase',
-            'company_id': cls.env.user.company_id.id,
-            'default_debit_account_id': cls.account_expense.id,
-            'default_credit_account_id': cls.account_expense.id,
-        })
-        cls.journal_sale = cls.env['account.journal'].create({
-            'name': 'Sale Journal - Test',
-            'code': 'AJ-SALE',
-            'type': 'sale',
-            'company_id': cls.env.user.company_id.id,
-            'default_debit_account_id': cls.account_income.id,
-            'default_credit_account_id': cls.account_income.id,
-        })
-        cls.journal_general = cls.env['account.journal'].create({
-            'name': 'General Journal - Test',
-            'code': 'AJ-GENERAL',
-            'type': 'general',
-            'company_id': cls.env.user.company_id.id,
-        })
-
-    @classmethod
-    def setUpUsers(cls):
-        """ Create 2 users: an employee and a manager. Both will have correct account configured
-            on their partner. Others access rigths should be given in extending test suites set up.
-        """
-        group_employee = cls.env.ref('base.group_user')
-        Users = cls.env['res.users'].with_context({'no_reset_password': True, 'mail_create_nosubscribe': True, 'mail_create_nolog': True})
-        cls.user_employee = Users.create({
-            'name': 'Tyrion Lannister Employee',
-            'login': 'tyrion',
-            'email': 'tyrion@example.com',
-            'notification_type': 'email',
-            'groups_id': [(6, 0, [group_employee.id])],
-        })
-        cls.user_manager = Users.create({
-            'name': 'Daenerys Targaryen Manager',
-            'login': 'daenerys',
-            'email': 'daenerys@example.com',
-            'notification_type': 'email',
-            'groups_id': [(6, 0, [group_employee.id])],
-        })
-        account_values = {
-            'property_account_payable_id': cls.account_payable.id,
-            'property_account_receivable_id': cls.account_receivable.id,
-        }
-        cls.user_manager.partner_id.write(account_values)
-        cls.user_employee.partner_id.write(account_values)
diff --git a/addons/account/tests/account_test_savepoint.py b/addons/account/tests/account_test_savepoint.py
deleted file mode 100644
index 180b7a868c42e5506315f8e24a9380830f79388f..0000000000000000000000000000000000000000
--- a/addons/account/tests/account_test_savepoint.py
+++ /dev/null
@@ -1,209 +0,0 @@
-# -*- coding: utf-8 -*-
-
-import unittest
-
-from odoo import fields
-from odoo.tests.common import Form, SavepointCase
-from odoo.tests import tagged
-
-
-@tagged('post_install', '-at_install')
-class AccountingSavepointCase(SavepointCase):
-
-    # -------------------------------------------------------------------------
-    # DATA GENERATION
-    # -------------------------------------------------------------------------
-
-    @classmethod
-    def setUpClass(cls):
-        super(AccountingSavepointCase, cls).setUpClass()
-
-        chart_template = cls.env.user.company_id.chart_template_id
-        if not chart_template:
-            chart_template = cls.env.ref('l10n_generic_coa.configurable_chart_template', raise_if_not_found=False)
-        if not chart_template:
-            cls.skipTest(cls, "Accounting Tests skipped because the user's company has no chart of accounts.")
-
-        # Create user.
-        user = cls.env['res.users'].create({
-            'name': 'Because I am accountman!',
-            'login': 'accountman',
-            'groups_id': [(6, 0, cls.env.user.groups_id.ids)],
-        })
-        user.partner_id.email = 'accountman@test.com'
-
-        # Shadow the current environment/cursor with one having the report user.
-        # This is mandatory to test access rights.
-        cls.env = cls.env(user=user)
-        cls.cr = cls.env.cr
-
-        cls.company_data = cls.setup_company_data('company_1_data')
-        cls.currency_data = cls.setup_multi_currency_data()
-
-    @classmethod
-    def setup_company_data(cls, company_name, **kwargs):
-        ''' Create a new company having the name passed as parameter.
-        A chart of accounts will be installed to this company: the same as the current company one.
-        The current user will get access to this company.
-
-        :param company_name: The name of the company.
-        :return: A dictionary will be returned containing all relevant accounting data for testing.
-        '''
-        chart_template = cls.env.user.company_id.chart_template_id
-        company = cls.env['res.company'].create({
-            'name': company_name,
-            'currency_id': cls.env.user.company_id.currency_id.id,
-            **kwargs,
-        })
-        cls.env.user.company_ids |= company
-        cls.env.user.company_id = company
-
-        chart_template = cls.env['account.chart.template'].browse(chart_template.id)
-        chart_template.try_loading()
-
-        # The currency could be different after the installation of the chart template.
-        company.write({'currency_id': kwargs.get('currency_id', cls.env.user.company_id.currency_id.id)})
-
-        return {
-            'company': company,
-            'currency': company.currency_id,
-            'default_account_revenue': cls.env['account.account'].search([
-                    ('company_id', '=', company.id),
-                    ('user_type_id', '=', cls.env.ref('account.data_account_type_revenue').id)
-                ], limit=1),
-            'default_account_expense': cls.env['account.account'].search([
-                    ('company_id', '=', company.id),
-                    ('user_type_id', '=', cls.env.ref('account.data_account_type_expenses').id)
-                ], limit=1),
-            'default_account_receivable': cls.env['account.account'].search([
-                    ('company_id', '=', company.id),
-                    ('user_type_id.type', '=', 'receivable')
-                ], limit=1),
-            'default_account_payable': cls.env['account.account'].search([
-                    ('company_id', '=', company.id),
-                    ('user_type_id.type', '=', 'payable')
-                ], limit=1),
-            'default_account_tax_sale': company.account_sale_tax_id.mapped('invoice_repartition_line_ids.account_id'),
-            'default_account_tax_purchase': company.account_purchase_tax_id.mapped('invoice_repartition_line_ids.account_id'),
-            'default_journal_misc': cls.env['account.journal'].search([
-                    ('company_id', '=', company.id),
-                    ('type', '=', 'general')
-                ], limit=1),
-            'default_journal_sale': cls.env['account.journal'].search([
-                    ('company_id', '=', company.id),
-                    ('type', '=', 'sale')
-                ], limit=1),
-            'default_journal_purchase': cls.env['account.journal'].search([
-                    ('company_id', '=', company.id),
-                    ('type', '=', 'purchase')
-                ], limit=1),
-            'default_tax_sale': company.account_sale_tax_id,
-            'default_tax_purchase': company.account_purchase_tax_id,
-        }
-
-    @classmethod
-    def setup_multi_currency_data(cls):
-        gold_currency = cls.env['res.currency'].create({
-            'name': 'Gold Coin',
-            'symbol': '☺',
-            'rounding': 0.001,
-            'position': 'after',
-            'currency_unit_label': 'Gold',
-            'currency_subunit_label': 'Silver',
-        })
-        rate1 = cls.env['res.currency.rate'].create({
-            'name': '2016-01-01',
-            'rate': 3.0,
-            'currency_id': gold_currency.id,
-            'company_id': cls.env.company.id,
-        })
-        rate2 = cls.env['res.currency.rate'].create({
-            'name': '2017-01-01',
-            'rate': 2.0,
-            'currency_id': gold_currency.id,
-            'company_id': cls.env.company.id,
-        })
-        return {
-            'currency': gold_currency,
-            'rates': rate1 + rate2,
-        }
-
-    @classmethod
-    def setup_armageddon_tax(cls, tax_name, company_data):
-        return cls.env['account.tax'].create({
-            'name': '%s (group)' % tax_name,
-            'amount_type': 'group',
-            'amount': 0.0,
-            'children_tax_ids': [
-                (0, 0, {
-                    'name': '%s (child 1)' % tax_name,
-                    'amount_type': 'percent',
-                    'amount': 20.0,
-                    'price_include': True,
-                    'include_base_amount': True,
-                    'tax_exigibility': 'on_invoice',
-                    'invoice_repartition_line_ids': [
-                        (0, 0, {
-                            'factor_percent': 100,
-                            'repartition_type': 'base',
-                        }),
-                        (0, 0, {
-                            'factor_percent': 40,
-                            'repartition_type': 'tax',
-                            'account_id': company_data['default_account_tax_sale'].id,
-                        }),
-                        (0, 0, {
-                            'factor_percent': 60,
-                            'repartition_type': 'tax',
-                            # /!\ No account set.
-                        }),
-                    ],
-                    'refund_repartition_line_ids': [
-                        (0, 0, {
-                            'factor_percent': 100,
-                            'repartition_type': 'base',
-                        }),
-                        (0, 0, {
-                            'factor_percent': 40,
-                            'repartition_type': 'tax',
-                            'account_id': company_data['default_account_tax_sale'].id,
-                        }),
-                        (0, 0, {
-                            'factor_percent': 60,
-                            'repartition_type': 'tax',
-                            # /!\ No account set.
-                        }),
-                    ],
-                }),
-                (0, 0, {
-                    'name': '%s (child 2)' % tax_name,
-                    'amount_type': 'percent',
-                    'amount': 10.0,
-                    'tax_exigibility': 'on_payment',
-                    'cash_basis_transition_account_id': company_data['default_account_tax_sale'].copy().id,
-                    'invoice_repartition_line_ids': [
-                        (0, 0, {
-                            'factor_percent': 100,
-                            'repartition_type': 'base',
-                        }),
-                        (0, 0, {
-                            'factor_percent': 100,
-                            'repartition_type': 'tax',
-                            'account_id': company_data['default_account_tax_sale'].id,
-                        }),
-                    ],
-                    'refund_repartition_line_ids': [
-                        (0, 0, {
-                            'factor_percent': 100,
-                            'repartition_type': 'base',
-                        }),
-
-                        (0, 0, {
-                            'factor_percent': 100,
-                            'repartition_type': 'tax',
-                            'account_id': company_data['default_account_tax_sale'].id,
-                        }),
-                    ],
-                }),
-            ],
-        })
diff --git a/addons/account/tests/account_test_users.py b/addons/account/tests/account_test_users.py
deleted file mode 100644
index a9b7b30545dd4499b228d66ab1c5b657cd9db59d..0000000000000000000000000000000000000000
--- a/addons/account/tests/account_test_users.py
+++ /dev/null
@@ -1,36 +0,0 @@
-from odoo.addons.account.tests.account_test_classes import AccountingTestCase
-
-
-class AccountTestUsers(AccountingTestCase):
-
-    """Tests for diffrent type of user 'Accountant/Adviser' and added groups"""
-
-    @classmethod
-    def setUpClass(cls):
-        super(AccountTestUsers, cls).setUpClass()
-        cls.res_user_model = cls.env['res.users']
-        cls.main_company = cls.env.ref('base.main_company')
-        cls.main_partner = cls.env.ref('base.main_partner')
-        cls.main_bank = cls.env.ref('base.res_bank_1')
-        res_users_account_user = cls.env.ref('account.group_account_invoice')
-        res_users_account_manager = cls.env.ref('account.group_account_manager')
-        partner_manager = cls.env.ref('base.group_partner_manager')
-        cls.tax_model = cls.env['account.tax']
-        cls.account_model = cls.env['account.account']
-        cls.account_type_model = cls.env['account.account.type']
-        cls.currency_euro = cls.env.ref('base.EUR')
-
-        cls.account_user = cls.res_user_model.with_context({'no_reset_password': True}).create(dict(
-            name="Accountant",
-            company_id=cls.main_company.id,
-            login="acc",
-            email="accountuser@yourcompany.com",
-            groups_id=[(6, 0, [res_users_account_user.id, partner_manager.id])]
-        ))
-        cls.account_manager = cls.res_user_model.with_context({'no_reset_password': True}).create(dict(
-            name="Adviser",
-            company_id=cls.main_company.id,
-            login="fm",
-            email="accountmanager@yourcompany.com",
-            groups_id=[(6, 0, [res_users_account_manager.id, partner_manager.id])]
-        ))
diff --git a/addons/account/tests/common.py b/addons/account/tests/common.py
new file mode 100644
index 0000000000000000000000000000000000000000..b02d5cfab18b5ae91186d8c5f16579712ea521b9
--- /dev/null
+++ b/addons/account/tests/common.py
@@ -0,0 +1,1031 @@
+# -*- coding: utf-8 -*-
+# Part of Odoo. See LICENSE file for full copyright and licensing details.
+
+import logging
+import time
+
+from odoo import fields
+from odoo.addons.base.tests.common import SavepointCaseWithUserDemo
+from odoo.exceptions import ValidationError
+from odoo.tests.common import SavepointCase, HttpCase, tagged, Form
+
+import logging
+
+_logger = logging.getLogger(__name__)
+
+
+class AccountTestCommon(SavepointCase):
+    """ This should be loaded for non python tests in other modules that require
+    accounting test data but that don't depend on any localization"""
+
+    @classmethod
+    def setUpClass(cls):
+        super(AccountTestCommon, cls).setUpClass()
+        cls.create_accounting_minimal_data()
+
+    @classmethod
+    def create_accounting_minimal_data(cls):
+        cls.company = cls.env.company
+        cls.company.bank_account_code_prefix = 'X1100'
+
+        # Chart of Accounts
+
+        # Account Tags
+        cls.demo_capital_account = cls.env['account.account.tag'].create({'name': 'Demo Capital Account'})
+        cls.demo_stock_account = cls.env['account.account.tag'].create({'name': 'Demo Stock Account'})
+        cls.demo_sale_of_land_account = cls.env['account.account.tag'].create({'name': 'Demo Sale of Land Account'})
+        cls.demo_ceo_wages_account = cls.env['account.account.tag'].create({'name': 'Demo CEO Wages Account'})
+        cls.demo_office_furniture_account = cls.env['account.account.tag'].create({'name': 'Office Furniture'})
+
+        # Balance Sheet
+        cls.xfa = cls.env['account.account'].create({
+            'code': 'X1000',
+            'name': 'Fixed Assets - (test)',
+            'user_type_id': cls.env.ref('account.data_account_type_fixed_assets').id,
+        })
+        cls.cas = cls.env['account.account'].create({
+            'code': 'X1010',
+            'name': 'Current Assets - (test)',
+            'user_type_id': cls.env.ref('account.data_account_type_current_assets').id,
+        })
+        cls.stk = cls.env['account.account'].create({
+            'code': 'X1011',
+            'name': 'Purchased Stocks - (test)',
+            'user_type_id': cls.env.ref('account.data_account_type_current_assets').id,
+            'tag_ids': [(6, 0, [cls.demo_stock_account.id])]
+        })
+        cls.a_recv = cls.env['account.account'].create({
+            'code': 'X1012',
+            'name': 'Debtors - (test)',
+            'reconcile': True,
+            'user_type_id': cls.env.ref('account.data_account_type_receivable').id,
+        })
+        cls.ova = cls.env['account.account'].create({
+            'code': 'X1013',
+            'name': 'VAT Paid- (test)',
+            'user_type_id': cls.env.ref('account.data_account_type_current_assets').id,
+        })
+        cls.bnk = cls.env['account.account'].create({
+            'code': 'X1014',
+            'name': 'Bank Current Account - (test)',
+            'user_type_id': cls.env.ref('account.data_account_type_liquidity').id,
+        })
+        cls.cash = cls.env['account.account'].create({
+            'code': 'X1015',
+            'name': 'Cash - (test)',
+            'user_type_id': cls.env.ref('account.data_account_type_liquidity').id,
+        })
+        cls.o_income = cls.env['account.account'].create({
+            'code': 'X1016',
+            'name': 'Opening Income - (test)',
+            'user_type_id': cls.env.ref('account.data_account_type_other_income').id,
+        })
+        cls.usd_bnk = cls.env['account.account'].create({
+            'code': 'X1017',
+            'name': 'USD Bank Account - (test)',
+            'user_type_id': cls.env.ref('account.data_account_type_liquidity').id,
+            'currency_id': cls.env.ref('base.USD').id,
+        })
+        cls.transfer_account = cls.env['account.account'].create({
+            'code': 'X1019',
+            'name': 'Internal Transfert Account - (test)',
+            'user_type_id': cls.env.ref('account.data_account_type_current_assets').id,
+            'reconcile': True,
+        })
+        cls.ncas = cls.env['account.account'].create({
+            'code': 'X1020',
+            'name': 'Non-current Assets - (test)',
+            'user_type_id': cls.env.ref('account.data_account_type_non_current_assets').id,
+        })
+        cls.prepayements = cls.env['account.account'].create({
+            'code': 'X1030',
+            'name': 'Prepayments - (test)',
+            'user_type_id': cls.env.ref('account.data_account_type_prepayments').id,
+        })
+        cls.current_liabilities = cls.env['account.account'].create({
+            'code': 'X1110',
+            'name': 'Current Liabilities - (test)',
+            'user_type_id': cls.env.ref('account.data_account_type_current_liabilities').id,
+        })
+        cls.a_pay = cls.env['account.account'].create({
+            'code': 'X1111',
+            'name': 'Creditors - (test)',
+            'user_type_id': cls.env.ref('account.data_account_type_payable').id,
+            'reconcile': True,
+        })
+        cls.iva = cls.env['account.account'].create({
+            'code': 'X1112',
+            'name': 'VAT Received - (test)',
+            'user_type_id': cls.env.ref('account.data_account_type_current_liabilities').id,
+        })
+        cls.rsa = cls.env['account.account'].create({
+            'code': 'X1113',
+            'name': 'Reserve and Profit/Loss - (test)',
+            'user_type_id': cls.env.ref('account.data_account_type_current_liabilities').id,
+        })
+        cls.cas = cls.env['account.account'].create({
+            'code': 'X1120',
+            'name': 'Non-current Liabilities - (test)',
+            'user_type_id': cls.env.ref('account.data_account_type_non_current_liabilities').id,
+        })
+        cls.o_expense = cls.env['account.account'].create({
+            'code': 'X1114',
+            'name': 'Opening Expense - (test)',
+            'user_type_id': cls.env.ref('account.data_account_type_expenses').id,
+        })
+
+        # Profit and Loss
+        cls.income_fx_income = cls.env['account.account'].create({
+            'code': 'X2010',
+            'name': 'Foreign Exchange Gain - (test)',
+            'user_type_id': cls.env.ref('account.data_account_type_revenue').id,
+            'reconcile': False,
+        })
+        cls.a_sale = cls.env['account.account'].create({
+            'code': 'X2020',
+            'name': 'Product Sales - (test)',
+            'user_type_id': cls.env.ref('account.data_account_type_revenue').id,
+            'tag_ids': [(6, 0, [cls.env.ref('account.account_tag_operating').id])],
+        })
+        cls.a_sale_invest = cls.env['account.account'].create({
+            'code': 'X2021',
+            'name': 'Sale of Lands - (test)',
+            'user_type_id': cls.env.ref('account.data_account_type_revenue').id,
+            'tag_ids': [(6, 0, [cls.env.ref('account.account_tag_investing').id])],
+        })
+        cls.a_sale_finance = cls.env['account.account'].create({
+            'code': 'X2022',
+            'name': 'Bank Accounts Interests - (test)',
+            'user_type_id': cls.env.ref('account.data_account_type_revenue').id,
+            'tag_ids': [(6, 0, [cls.env.ref('account.account_tag_financing').id])],
+        })
+        cls.a_sale_finance = cls.env['account.account'].create({
+            'code': 'X2030',
+            'name': 'Cost of Goods Sold - (test)',
+            'user_type_id': cls.env.ref('account.data_account_type_direct_costs').id,
+        })
+        cls.income_fx_expense = cls.env['account.account'].create({
+            'code': 'X2110',
+            'name': 'Foreign Exchange Loss - (test)',
+            'user_type_id': cls.env.ref('account.data_account_type_expenses').id,
+            'reconcile': False,
+        })
+        cls.a_expense = cls.env['account.account'].create({
+            'code': 'X2120',
+            'name': 'Expenses - (test)',
+            'user_type_id': cls.env.ref('account.data_account_type_expenses').id,
+            'tag_ids': [(6, 0, [cls.env.ref('account.account_tag_operating').id])],
+        })
+        cls.a_salary_expense = cls.env['account.account'].create({
+            'code': 'X2121',
+            'name': 'Salary Expenses - (test)',
+            'user_type_id': cls.env.ref('account.data_account_type_expenses').id,
+            'tag_ids': [(6, 0, [cls.env.ref('account.account_tag_operating').id])],
+        })
+        cls.a_expense_invest = cls.env['account.account'].create({
+            'code': 'X2122',
+            'name': 'Purchase of Equipments - (test)',
+            'user_type_id': cls.env.ref('account.data_account_type_fixed_assets').id,
+            'tag_ids': [(6, 0, [cls.env.ref('account.account_tag_investing').id])],
+        })
+        cls.a_expense_finance = cls.env['account.account'].create({
+            'code': 'X2123',
+            'name': 'Bank Fees - (test)',
+            'user_type_id': cls.env.ref('account.data_account_type_expenses').id,
+            'tag_ids': [(6, 0, [cls.env.ref('account.account_tag_financing').id])],
+        })
+        cls.a_capital = cls.env['account.account'].create({
+            'code': 'X3001',
+            'name': 'Capital',
+            'user_type_id': cls.env.ref('account.data_account_type_equity').id,
+        })
+        cls.a_dividends = cls.env['account.account'].create({
+            'code': 'X3002',
+            'name': 'Dividends',
+            'user_type_id': cls.env.ref('account.data_account_type_equity').id,
+        })
+
+        # Properties: Product income and expense accounts, default parameters
+        cls.env['ir.property'].create([{
+            'name': 'property_account_receivable_id',
+            'fields_id': cls.env['ir.model.fields'].search([('model', '=', 'res.partner'), ('name', '=', 'property_account_receivable_id')], limit=1).id,
+            'value': 'account.account,%s' % (cls.a_recv.id),
+            'company_id': cls.company.id,
+        }, {
+            'name': 'property_account_payable_id',
+            'fields_id': cls.env['ir.model.fields'].search([('model', '=', 'res.partner'), ('name', '=', 'property_account_payable_id')], limit=1).id,
+            'value': 'account.account,%s' % (cls.a_pay.id),
+            'company_id': cls.company.id,
+        }, {
+            'name': 'property_account_position_id',
+            'fields_id': cls.env['ir.model.fields'].search([('model', '=', 'res.partner'), ('name', '=', 'property_account_position_id')], limit=1).id,
+            'value': False,
+            'company_id': cls.company.id,
+        }, {
+            'name': 'property_account_expense_categ_id',
+            'fields_id': cls.env['ir.model.fields'].search([('model', '=', 'product.category'), ('name', '=', 'property_account_expense_categ_id')], limit=1).id,
+            'value': 'account.account,%s' % (cls.a_expense.id),
+            'company_id': cls.company.id,
+        }, {
+            'name': 'property_account_income_categ_id',
+            'fields_id': cls.env['ir.model.fields'].search([('model', '=', 'product.category'), ('name', '=', 'property_account_income_categ_id')], limit=1).id,
+            'value': 'account.account,%s' % (cls.a_sale.id),
+            'company_id': cls.company.id,
+        }])
+
+        # Bank Accounts
+        cls.bank_account = cls.env['res.partner.bank'].create({
+            'acc_number': '987654321',
+            'bank_name': 'Bank',
+            'partner_id': cls.company.partner_id.id,
+        })
+        cls.bank_account_usd = cls.env['res.partner.bank'].create({
+            'acc_number': '123456789',
+            'bank_name': 'Bank US',
+            'partner_id': cls.company.partner_id.id,
+        })
+
+        # Account Journal
+        cls.sales_journal = cls.env['account.journal'].create({
+            'name': 'Customer Invoices - Test',
+            'code': 'TINV',
+            'type': 'sale',
+            'default_credit_account_id': cls.a_sale.id,
+            'default_debit_account_id': cls.a_sale.id,
+            'refund_sequence': True,
+        })
+        cls.expenses_journal = cls.env['account.journal'].create({
+            'name': 'Vendor Bills - Test',
+            'code': 'TEXJ',
+            'type': 'purchase',
+            'default_credit_account_id': cls.a_expense.id,
+            'default_debit_account_id': cls.a_expense.id,
+            'refund_sequence': True,
+        })
+        cls.bank_journal = cls.env['account.journal'].create({
+            'name': 'Bank - Test',
+            'code': 'TBNK',
+            'type': 'bank',
+            'default_credit_account_id': cls.bnk.id,
+            'default_debit_account_id': cls.bnk.id,
+        })
+        cls.cash_journal = cls.env['account.journal'].create({
+            'name': 'Cash - Test',
+            'code': 'TCSH',
+            'type': 'cash',
+            'profit_account_id': cls.rsa.id,
+            'loss_account_id': cls.rsa.id,
+            'default_credit_account_id': cls.cash.id,
+            'default_debit_account_id': cls.cash.id,
+        })
+        cls.miscellaneous_journal = cls.env['account.journal'].create({
+            'name': 'Miscellaneous - Test',
+            'code': 'TMIS',
+            'type': 'general',
+            'show_on_dashboard': False,
+        })
+        cls.currency_diff_journal = cls.env['account.journal'].create({
+            'name': 'Currency Difference - Test',
+            'code': 'CUR',
+            'type': 'general',
+            'default_credit_account_id': cls.income_fx_expense.id,
+            'default_debit_account_id': cls.income_fx_income.id,
+            'show_on_dashboard': False,
+        })
+        cls.bank_journal_usd = cls.env['account.journal'].create({
+            'name': 'USD Bank - Test',
+            'code': 'TUBK',
+            'type': 'bank',
+            'default_credit_account_id': cls.usd_bnk.id,
+            'default_debit_account_id': cls.usd_bnk.id,
+            'bank_account_id': cls.bank_account_usd.id,
+        })
+
+        cls.company.currency_exchange_journal_id = cls.currency_diff_journal.id
+
+
+class AccountTestUsersCommon(AccountTestCommon):
+
+    """Tests for diffrent type of user 'Accountant/Adviser' and added groups"""
+
+    @classmethod
+    def setUpClass(cls):
+        super(AccountTestUsersCommon, cls).setUpClass()
+        cls.res_user_model = cls.env['res.users']
+        cls.main_company = cls.env.ref('base.main_company')
+        cls.main_partner = cls.env.ref('base.main_partner')
+        cls.main_bank = cls.env.ref('base.res_bank_1')
+        res_users_account_user = cls.env.ref('account.group_account_invoice')
+        res_users_account_manager = cls.env.ref('account.group_account_manager')
+        partner_manager = cls.env.ref('base.group_partner_manager')
+        cls.tax_model = cls.env['account.tax']
+        cls.account_model = cls.env['account.account']
+        cls.account_type_model = cls.env['account.account.type']
+        cls.currency_euro = cls.env.ref('base.EUR')
+
+        cls.account_user = cls.res_user_model.with_context({'no_reset_password': True}).create(dict(
+            name="Accountant",
+            company_id=cls.main_company.id,
+            login="acc",
+            email="accountuser@yourcompany.com",
+            groups_id=[(6, 0, [res_users_account_user.id, partner_manager.id])]
+        ))
+        cls.account_manager = cls.res_user_model.with_context({'no_reset_password': True}).create(dict(
+            name="Adviser",
+            company_id=cls.main_company.id,
+            login="fm",
+            email="accountmanager@yourcompany.com",
+            groups_id=[(6, 0, [res_users_account_manager.id, partner_manager.id])]
+        ))
+
+
+class AccountTestNoChartCommon(SavepointCaseWithUserDemo):
+    """ Some tests required to be executed at module installation, and not 'post install', like moslty
+        of accounting tests, since a chart of account is required
+        This test setup class provides data for test suite to make business flow working without a chart
+        of account installed. The class provide some helpers methods to create particular document types. Each
+        test suite extending this method can call thoses method to set up their testing environment in their
+        own `setUpClass` method.
+    """
+
+    @classmethod
+    def setUpClass(cls):
+        """ This method set up the minimal requried part of chart of account """
+        super(AccountTestNoChartCommon, cls).setUpClass()
+        # To speed up test, create object without mail tracking
+        context_no_mail = {'no_reset_password': True, 'mail_create_nosubscribe': True, 'mail_create_nolog': True}
+
+        # Create base account to simulate a chart of account
+        user_type_payable = cls.env.ref('account.data_account_type_payable')
+        cls.account_payable = cls.env['account.account'].create({
+            'code': 'NC1110',
+            'name': 'Test Payable Account',
+            'user_type_id': user_type_payable.id,
+            'reconcile': True
+        })
+        user_type_receivable = cls.env.ref('account.data_account_type_receivable')
+        cls.account_receivable = cls.env['account.account'].create({
+            'code': 'NC1111',
+            'name': 'Test Receivable Account',
+            'user_type_id': user_type_receivable.id,
+            'reconcile': True
+        })
+
+        # Create a customer
+        Partner = cls.env['res.partner'].with_context(context_no_mail)
+        cls.partner_customer_usd = Partner.create({
+            'name': 'Customer from the North',
+            'email': 'customer.usd@north.com',
+            'property_account_payable_id': cls.account_payable.id,
+            'property_account_receivable_id': cls.account_receivable.id,
+            'company_id': cls.env.ref('base.main_company').id
+        })
+
+        cls.sale_journal0 = cls.env['account.journal'].create({
+            'name': 'Sale Journal',
+            'type': 'sale',
+            'code': 'SJT0',
+        })
+
+    @classmethod
+    def setUpAdditionalAccounts(cls):
+        """ Set up some addionnal accounts: expenses, revenue, ... """
+        user_type_income = cls.env.ref('account.data_account_type_direct_costs')
+        cls.account_income = cls.env['account.account'].create({
+            'code': 'NC1112', 'name':
+            'Sale - Test Account',
+            'user_type_id': user_type_income.id
+        })
+        user_type_expense = cls.env.ref('account.data_account_type_expenses')
+        cls.account_expense = cls.env['account.account'].create({
+            'code': 'NC1113',
+            'name': 'HR Expense - Test Purchase Account',
+            'user_type_id': user_type_expense.id
+        })
+        user_type_revenue = cls.env.ref('account.data_account_type_revenue')
+        cls.account_revenue = cls.env['account.account'].create({
+            'code': 'NC1114',
+            'name': 'Sales - Test Sales Account',
+            'user_type_id': user_type_revenue.id,
+            'reconcile': True
+        })
+
+    @classmethod
+    def setUpAccountJournal(cls):
+        """ Set up some journals: sale, purchase, ... """
+        cls.journal_purchase = cls.env['account.journal'].create({
+            'name': 'Purchase Journal - Test',
+            'code': 'AJ-PURC',
+            'type': 'purchase',
+            'company_id': cls.env.user.company_id.id,
+            'default_debit_account_id': cls.account_expense.id,
+            'default_credit_account_id': cls.account_expense.id,
+        })
+        cls.journal_sale = cls.env['account.journal'].create({
+            'name': 'Sale Journal - Test',
+            'code': 'AJ-SALE',
+            'type': 'sale',
+            'company_id': cls.env.user.company_id.id,
+            'default_debit_account_id': cls.account_income.id,
+            'default_credit_account_id': cls.account_income.id,
+        })
+        cls.journal_general = cls.env['account.journal'].create({
+            'name': 'General Journal - Test',
+            'code': 'AJ-GENERAL',
+            'type': 'general',
+            'company_id': cls.env.user.company_id.id,
+        })
+
+    @classmethod
+    def setUpUsers(cls):
+        """ Create 2 users: an employee and a manager. Both will have correct account configured
+            on their partner. Others access rigths should be given in extending test suites set up.
+        """
+        group_employee = cls.env.ref('base.group_user')
+        Users = cls.env['res.users'].with_context({'no_reset_password': True, 'mail_create_nosubscribe': True, 'mail_create_nolog': True})
+        cls.user_employee = Users.create({
+            'name': 'Tyrion Lannister Employee',
+            'login': 'tyrion',
+            'email': 'tyrion@example.com',
+            'notification_type': 'email',
+            'groups_id': [(6, 0, [group_employee.id])],
+        })
+        cls.user_manager = Users.create({
+            'name': 'Daenerys Targaryen Manager',
+            'login': 'daenerys',
+            'email': 'daenerys@example.com',
+            'notification_type': 'email',
+            'groups_id': [(6, 0, [group_employee.id])],
+        })
+        account_values = {
+            'property_account_payable_id': cls.account_payable.id,
+            'property_account_receivable_id': cls.account_receivable.id,
+        }
+        cls.user_manager.partner_id.write(account_values)
+        cls.user_employee.partner_id.write(account_values)
+
+
+@tagged('post_install', '-at_install')
+class AccountTestInvoicingCommon(SavepointCase):
+
+    @classmethod
+    def setUpClass(cls):
+        super(AccountTestInvoicingCommon, cls).setUpClass()
+
+        chart_template = cls.env.user.company_id.chart_template_id
+        if not chart_template:
+            chart_template = cls.env.ref('l10n_generic_coa.configurable_chart_template', raise_if_not_found=False)
+        if not chart_template:
+            cls.skipTest(cls, "Accounting Tests skipped because the user's company has no chart of accounts.")
+
+        # Create user.
+        user = cls.env['res.users'].create({
+            'name': 'Because I am accountman!',
+            'login': 'accountman',
+            'groups_id': [(6, 0, cls.env.user.groups_id.ids)],
+        })
+        user.partner_id.email = 'accountman@test.com'
+
+        # Shadow the current environment/cursor with one having the report user.
+        # This is mandatory to test access rights.
+        cls.env = cls.env(user=user)
+        cls.cr = cls.env.cr
+
+        cls.company_data = cls.setup_company_data('company_1_data')
+        cls.currency_data = cls.setup_multi_currency_data()
+
+        # ==== Taxes ====
+        cls.tax_sale_a = cls.company_data['default_tax_sale']
+        cls.tax_sale_b = cls.company_data['default_tax_sale'].copy()
+        cls.tax_purchase_a = cls.company_data['default_tax_purchase']
+        cls.tax_purchase_b = cls.company_data['default_tax_purchase'].copy()
+        cls.tax_armageddon = cls.setup_armageddon_tax('complex_tax', cls.company_data)
+
+        # ==== Products ====
+        cls.product_a = cls.env['product.product'].create({
+            'name': 'product_a',
+            'uom_id': cls.env.ref('uom.product_uom_unit').id,
+            'lst_price': 1000.0,
+            'standard_price': 800.0,
+            'property_account_income_id': cls.company_data['default_account_revenue'].id,
+            'property_account_expense_id': cls.company_data['default_account_expense'].id,
+            'taxes_id': [(6, 0, cls.tax_sale_a.ids)],
+            'supplier_taxes_id': [(6, 0, cls.tax_purchase_a.ids)],
+        })
+        cls.product_b = cls.env['product.product'].create({
+            'name': 'product_b',
+            'uom_id': cls.env.ref('uom.product_uom_dozen').id,
+            'lst_price': 200.0,
+            'standard_price': 160.0,
+            'property_account_income_id': cls.company_data['default_account_revenue'].copy().id,
+            'property_account_expense_id': cls.company_data['default_account_expense'].copy().id,
+            'taxes_id': [(6, 0, (cls.tax_sale_a + cls.tax_sale_b).ids)],
+            'supplier_taxes_id': [(6, 0, (cls.tax_purchase_a + cls.tax_purchase_b).ids)],
+        })
+
+        # ==== Fiscal positions ====
+        cls.fiscal_pos_a = cls.env['account.fiscal.position'].create({
+            'name': 'fiscal_pos_a',
+            'tax_ids': [
+                (0, None, {
+                    'tax_src_id': cls.tax_sale_a.id,
+                    'tax_dest_id': cls.tax_sale_b.id,
+                }),
+                (0, None, {
+                    'tax_src_id': cls.tax_purchase_a.id,
+                    'tax_dest_id': cls.tax_purchase_b.id,
+                }),
+            ],
+            'account_ids': [
+                (0, None, {
+                    'account_src_id': cls.product_a.property_account_income_id.id,
+                    'account_dest_id': cls.product_b.property_account_income_id.id,
+                }),
+                (0, None, {
+                    'account_src_id': cls.product_a.property_account_expense_id.id,
+                    'account_dest_id': cls.product_b.property_account_expense_id.id,
+                }),
+            ],
+        })
+
+        # ==== Payment terms ====
+        cls.pay_terms_a = cls.env.ref('account.account_payment_term_immediate')
+        cls.pay_terms_b = cls.env['account.payment.term'].create({
+            'name': '30% Advance End of Following Month',
+            'note': 'Payment terms: 30% Advance End of Following Month',
+            'line_ids': [
+                (0, 0, {
+                    'value': 'percent',
+                    'value_amount': 30.0,
+                    'sequence': 400,
+                    'days': 0,
+                    'option': 'day_after_invoice_date',
+                }),
+                (0, 0, {
+                    'value': 'balance',
+                    'value_amount': 0.0,
+                    'sequence': 500,
+                    'days': 31,
+                    'option': 'day_following_month',
+                }),
+            ],
+        })
+
+        # ==== Partners ====
+        cls.partner_a = cls.env['res.partner'].create({
+            'name': 'partner_a',
+            'property_payment_term_id': cls.pay_terms_a.id,
+            'property_supplier_payment_term_id': cls.pay_terms_a.id,
+            'property_account_receivable_id': cls.company_data['default_account_receivable'].id,
+            'property_account_payable_id': cls.company_data['default_account_payable'].id,
+            'company_id': False,
+        })
+        cls.partner_b = cls.env['res.partner'].create({
+            'name': 'partner_b',
+            'property_payment_term_id': cls.pay_terms_b.id,
+            'property_supplier_payment_term_id': cls.pay_terms_b.id,
+            'property_account_position_id': cls.fiscal_pos_a.id,
+            'property_account_receivable_id': cls.company_data['default_account_receivable'].copy().id,
+            'property_account_payable_id': cls.company_data['default_account_payable'].copy().id,
+            'company_id': False,
+        })
+
+        # ==== Cash rounding ====
+        cls.cash_rounding_a = cls.env['account.cash.rounding'].create({
+            'name': 'add_invoice_line',
+            'rounding': 0.05,
+            'strategy': 'add_invoice_line',
+            'account_id': cls.company_data['default_account_revenue'].copy().id,
+            'rounding_method': 'UP',
+        })
+        cls.cash_rounding_b = cls.env['account.cash.rounding'].create({
+            'name': 'biggest_tax',
+            'rounding': 0.05,
+            'strategy': 'biggest_tax',
+            'rounding_method': 'DOWN',
+        })
+
+
+    @classmethod
+    def setup_company_data(cls, company_name, **kwargs):
+        ''' Create a new company having the name passed as parameter.
+        A chart of accounts will be installed to this company: the same as the current company one.
+        The current user will get access to this company.
+
+        :param company_name: The name of the company.
+        :return: A dictionary will be returned containing all relevant accounting data for testing.
+        '''
+        chart_template = cls.env.user.company_id.chart_template_id
+        company = cls.env['res.company'].create({
+            'name': company_name,
+            'currency_id': cls.env.user.company_id.currency_id.id,
+            **kwargs,
+        })
+        cls.env.user.company_ids |= company
+        cls.env.user.company_id = company
+
+        chart_template = cls.env['account.chart.template'].browse(chart_template.id)
+        chart_template.try_loading()
+
+        # The currency could be different after the installation of the chart template.
+        company.write({'currency_id': kwargs.get('currency_id', cls.env.user.company_id.currency_id.id)})
+
+        return {
+            'company': company,
+            'currency': company.currency_id,
+            'default_account_revenue': cls.env['account.account'].search([
+                    ('company_id', '=', company.id),
+                    ('user_type_id', '=', cls.env.ref('account.data_account_type_revenue').id)
+                ], limit=1),
+            'default_account_expense': cls.env['account.account'].search([
+                    ('company_id', '=', company.id),
+                    ('user_type_id', '=', cls.env.ref('account.data_account_type_expenses').id)
+                ], limit=1),
+            'default_account_receivable': cls.env['account.account'].search([
+                    ('company_id', '=', company.id),
+                    ('user_type_id.type', '=', 'receivable')
+                ], limit=1),
+            'default_account_payable': cls.env['account.account'].search([
+                    ('company_id', '=', company.id),
+                    ('user_type_id.type', '=', 'payable')
+                ], limit=1),
+            'default_account_tax_sale': company.account_sale_tax_id.mapped('invoice_repartition_line_ids.account_id'),
+            'default_account_tax_purchase': company.account_purchase_tax_id.mapped('invoice_repartition_line_ids.account_id'),
+            'default_journal_misc': cls.env['account.journal'].search([
+                    ('company_id', '=', company.id),
+                    ('type', '=', 'general')
+                ], limit=1),
+            'default_journal_sale': cls.env['account.journal'].search([
+                    ('company_id', '=', company.id),
+                    ('type', '=', 'sale')
+                ], limit=1),
+            'default_journal_purchase': cls.env['account.journal'].search([
+                    ('company_id', '=', company.id),
+                    ('type', '=', 'purchase')
+                ], limit=1),
+            'default_tax_sale': company.account_sale_tax_id,
+            'default_tax_purchase': company.account_purchase_tax_id,
+        }
+
+    @classmethod
+    def setup_multi_currency_data(cls):
+        gold_currency = cls.env['res.currency'].create({
+            'name': 'Gold Coin',
+            'symbol': '☺',
+            'rounding': 0.001,
+            'position': 'after',
+            'currency_unit_label': 'Gold',
+            'currency_subunit_label': 'Silver',
+        })
+        rate1 = cls.env['res.currency.rate'].create({
+            'name': '2016-01-01',
+            'rate': 3.0,
+            'currency_id': gold_currency.id,
+            'company_id': cls.env.company.id,
+        })
+        rate2 = cls.env['res.currency.rate'].create({
+            'name': '2017-01-01',
+            'rate': 2.0,
+            'currency_id': gold_currency.id,
+            'company_id': cls.env.company.id,
+        })
+        return {
+            'currency': gold_currency,
+            'rates': rate1 + rate2,
+        }
+
+    @classmethod
+    def setup_armageddon_tax(cls, tax_name, company_data):
+        return cls.env['account.tax'].create({
+            'name': '%s (group)' % tax_name,
+            'amount_type': 'group',
+            'amount': 0.0,
+            'children_tax_ids': [
+                (0, 0, {
+                    'name': '%s (child 1)' % tax_name,
+                    'amount_type': 'percent',
+                    'amount': 20.0,
+                    'price_include': True,
+                    'include_base_amount': True,
+                    'tax_exigibility': 'on_invoice',
+                    'invoice_repartition_line_ids': [
+                        (0, 0, {
+                            'factor_percent': 100,
+                            'repartition_type': 'base',
+                        }),
+                        (0, 0, {
+                            'factor_percent': 40,
+                            'repartition_type': 'tax',
+                            'account_id': company_data['default_account_tax_sale'].id,
+                        }),
+                        (0, 0, {
+                            'factor_percent': 60,
+                            'repartition_type': 'tax',
+                            # /!\ No account set.
+                        }),
+                    ],
+                    'refund_repartition_line_ids': [
+                        (0, 0, {
+                            'factor_percent': 100,
+                            'repartition_type': 'base',
+                        }),
+                        (0, 0, {
+                            'factor_percent': 40,
+                            'repartition_type': 'tax',
+                            'account_id': company_data['default_account_tax_sale'].id,
+                        }),
+                        (0, 0, {
+                            'factor_percent': 60,
+                            'repartition_type': 'tax',
+                            # /!\ No account set.
+                        }),
+                    ],
+                }),
+                (0, 0, {
+                    'name': '%s (child 2)' % tax_name,
+                    'amount_type': 'percent',
+                    'amount': 10.0,
+                    'tax_exigibility': 'on_payment',
+                    'cash_basis_transition_account_id': company_data['default_account_tax_sale'].copy().id,
+                    'invoice_repartition_line_ids': [
+                        (0, 0, {
+                            'factor_percent': 100,
+                            'repartition_type': 'base',
+                        }),
+                        (0, 0, {
+                            'factor_percent': 100,
+                            'repartition_type': 'tax',
+                            'account_id': company_data['default_account_tax_sale'].id,
+                        }),
+                    ],
+                    'refund_repartition_line_ids': [
+                        (0, 0, {
+                            'factor_percent': 100,
+                            'repartition_type': 'base',
+                        }),
+
+                        (0, 0, {
+                            'factor_percent': 100,
+                            'repartition_type': 'tax',
+                            'account_id': company_data['default_account_tax_sale'].id,
+                        }),
+                    ],
+                }),
+            ],
+        })
+
+    @classmethod
+    def init_invoice(cls, move_type):
+        move_form = Form(cls.env['account.move'].with_context(default_type=move_type))
+        move_form.invoice_date = fields.Date.from_string('2019-01-01')
+        move_form.partner_id = cls.partner_a
+        with move_form.invoice_line_ids.new() as line_form:
+            line_form.product_id = cls.product_a
+        with move_form.invoice_line_ids.new() as line_form:
+            line_form.product_id = cls.product_b
+        return move_form.save()
+
+    def assertInvoiceValues(self, move, expected_lines_values, expected_move_values):
+        def sort_lines(lines):
+            return lines.sorted(lambda line: (line.exclude_from_invoice_tab, not bool(line.tax_line_id), line.name or '', line.balance))
+        self.assertRecordValues(sort_lines(move.line_ids.sorted()), expected_lines_values)
+        self.assertRecordValues(sort_lines(move.invoice_line_ids.sorted()), expected_lines_values[:len(move.invoice_line_ids)])
+        self.assertRecordValues(move, [expected_move_values])
+
+
+class TestAccountReconciliationCommon(AccountTestCommon):
+
+    """Tests for reconciliation (account.tax)
+
+    Test used to check that when doing a sale or purchase invoice in a different currency,
+    the result will be balanced.
+    """
+
+    @classmethod
+    def setUpClass(cls):
+        super(TestAccountReconciliationCommon, cls).setUpClass()
+        cls.company = cls.env['res.company'].create({
+            'name': 'A test company',
+            'currency_id': cls.env.ref('base.EUR').id
+        })
+        cls.env.user.company_id = cls.company
+        # Generate minimal data for my new company
+        cls.create_accounting_minimal_data()
+
+        cls.acc_bank_stmt_model = cls.env['account.bank.statement']
+        cls.acc_bank_stmt_line_model = cls.env['account.bank.statement.line']
+        cls.res_currency_model = cls.registry('res.currency')
+        cls.res_currency_rate_model = cls.registry('res.currency.rate')
+
+        cls.partner_agrolait = cls.env['res.partner'].create({
+            'name': 'Deco Addict',
+            'is_company': True,
+            'country_id': cls.env.ref('base.us').id,
+        })
+        cls.partner_agrolait_id = cls.partner_agrolait.id
+        cls.currency_swiss_id = cls.env.ref("base.CHF").id
+        cls.currency_usd_id = cls.env.ref("base.USD").id
+        cls.currency_euro_id = cls.env.ref("base.EUR").id
+        # YTI FIXME Some of those lines should be useless now
+        cls.cr.execute("UPDATE res_company SET currency_id = %s WHERE id = %s", [cls.currency_euro_id, cls.company.id])
+        cls.account_rcv = cls.partner_agrolait.property_account_receivable_id or cls.env['account.account'].search([('user_type_id', '=', cls.env.ref('account.data_account_type_receivable').id)], limit=1)
+        cls.account_rsa = cls.partner_agrolait.property_account_payable_id or cls.env['account.account'].search([('user_type_id', '=', cls.env.ref('account.data_account_type_payable').id)], limit=1)
+        cls.product = cls.env['product.product'].create({
+            'name': 'Product Product 4',
+            'standard_price': 500.0,
+            'list_price': 750.0,
+            'type': 'consu',
+            'categ_id': cls.env.ref('product.product_category_all').id,
+        })
+
+        cls.bank_journal_euro = cls.env['account.journal'].create({'name': 'Bank', 'type': 'bank', 'code': 'BNK67'})
+        cls.account_euro = cls.bank_journal_euro.default_debit_account_id
+
+        cls.bank_journal_usd = cls.env['account.journal'].create({'name': 'Bank US', 'type': 'bank', 'code': 'BNK68', 'currency_id': cls.currency_usd_id})
+        cls.account_usd = cls.bank_journal_usd.default_debit_account_id
+
+        cls.fx_journal = cls.env['res.users'].browse(cls.env.uid).company_id.currency_exchange_journal_id
+        cls.diff_income_account = cls.env['res.users'].browse(cls.env.uid).company_id.income_currency_exchange_account_id
+        cls.diff_expense_account = cls.env['res.users'].browse(cls.env.uid).company_id.expense_currency_exchange_account_id
+
+        cls.inbound_payment_method = cls.env['account.payment.method'].create({
+            'name': 'inbound',
+            'code': 'IN',
+            'payment_type': 'inbound',
+        })
+
+        cls.expense_account = cls.env['account.account'].create({
+            'name': 'EXP',
+            'code': 'EXP',
+            'user_type_id': cls.env.ref('account.data_account_type_expenses').id,
+            'company_id': cls.company.id,
+        })
+        # cash basis intermediary account
+        cls.tax_waiting_account = cls.env['account.account'].create({
+            'name': 'TAX_WAIT',
+            'code': 'TWAIT',
+            'user_type_id': cls.env.ref('account.data_account_type_current_liabilities').id,
+            'reconcile': True,
+            'company_id': cls.company.id,
+        })
+        # cash basis final account
+        cls.tax_final_account = cls.env['account.account'].create({
+            'name': 'TAX_TO_DEDUCT',
+            'code': 'TDEDUCT',
+            'user_type_id': cls.env.ref('account.data_account_type_current_assets').id,
+            'company_id': cls.company.id,
+        })
+        cls.tax_base_amount_account = cls.env['account.account'].create({
+            'name': 'TAX_BASE',
+            'code': 'TBASE',
+            'user_type_id': cls.env.ref('account.data_account_type_current_assets').id,
+            'company_id': cls.company.id,
+        })
+
+        # Journals
+        cls.purchase_journal = cls.env['account.journal'].create({
+            'name': 'purchase',
+            'code': 'PURCH',
+            'type': 'purchase',
+            'default_credit_account_id': cls.a_expense.id,
+            'default_debit_account_id': cls.a_expense.id,
+        })
+        cls.cash_basis_journal = cls.env['account.journal'].create({
+            'name': 'CABA',
+            'code': 'CABA',
+            'type': 'general',
+        })
+        cls.general_journal = cls.env['account.journal'].create({
+            'name': 'general',
+            'code': 'GENE',
+            'type': 'general',
+        })
+
+        # Tax Cash Basis
+        cls.tax_cash_basis = cls.env['account.tax'].create({
+            'name': 'cash basis 20%',
+            'type_tax_use': 'purchase',
+            'company_id': cls.company.id,
+            'amount': 20,
+            'tax_exigibility': 'on_payment',
+            'cash_basis_transition_account_id': cls.tax_waiting_account.id,
+            'cash_basis_base_account_id': cls.tax_base_amount_account.id,
+            'invoice_repartition_line_ids': [
+                    (0,0, {
+                        'factor_percent': 100,
+                        'repartition_type': 'base',
+                    }),
+
+                    (0,0, {
+                        'factor_percent': 100,
+                        'repartition_type': 'tax',
+                        'account_id': cls.tax_final_account.id,
+                    }),
+                ],
+            'refund_repartition_line_ids': [
+                    (0,0, {
+                        'factor_percent': 100,
+                        'repartition_type': 'base',
+                    }),
+
+                    (0,0, {
+                        'factor_percent': 100,
+                        'repartition_type': 'tax',
+                        'account_id': cls.tax_final_account.id,
+                    }),
+                ],
+        })
+        cls.env['res.currency.rate'].create([
+            {
+                'currency_id': cls.env.ref('base.EUR').id,
+                'name': '2010-01-02',
+                'rate': 1.0,
+            }, {
+                'currency_id': cls.env.ref('base.USD').id,
+                'name': '2010-01-02',
+                'rate': 1.2834,
+            }, {
+                'currency_id': cls.env.ref('base.USD').id,
+                'name': time.strftime('%Y-06-05'),
+                'rate': 1.5289,
+            }
+        ])
+
+    def _create_invoice(self, type='out_invoice', invoice_amount=50, currency_id=None, partner_id=None, date_invoice=None, payment_term_id=False, auto_validate=False):
+        date_invoice = date_invoice or time.strftime('%Y') + '-07-01'
+
+        invoice_vals = {
+            'type': type,
+            'partner_id': partner_id or self.partner_agrolait_id,
+            'invoice_date': date_invoice,
+            'date': date_invoice,
+            'invoice_line_ids': [(0, 0, {
+                'name': 'product that cost %s' % invoice_amount,
+                'quantity': 1,
+                'price_unit': invoice_amount,
+                'tax_ids': [(6, 0, [])],
+            })]
+        }
+
+        if payment_term_id:
+            invoice_vals['invoice_payment_term_id'] = payment_term_id
+
+        if currency_id:
+            invoice_vals['currency_id'] = currency_id
+
+        invoice = self.env['account.move'].with_context(default_type=type).create(invoice_vals)
+        if auto_validate:
+            invoice.post()
+        return invoice
+
+    def create_invoice(self, type='out_invoice', invoice_amount=50, currency_id=None):
+        return self._create_invoice(type=type, invoice_amount=invoice_amount, currency_id=currency_id, auto_validate=True)
+
+    def create_invoice_partner(self, type='out_invoice', invoice_amount=50, currency_id=None, partner_id=False, payment_term_id=False):
+        return self._create_invoice(
+            type=type,
+            invoice_amount=invoice_amount,
+            currency_id=currency_id,
+            partner_id=partner_id,
+            payment_term_id=payment_term_id,
+            auto_validate=True
+        )
+
+    def make_payment(self, invoice_record, bank_journal, amount=0.0, amount_currency=0.0, currency_id=None):
+        bank_stmt = self.acc_bank_stmt_model.create({
+            'journal_id': bank_journal.id,
+            'date': time.strftime('%Y') + '-07-15',
+            'name': 'payment' + invoice_record.name
+        })
+
+        bank_stmt_line = self.acc_bank_stmt_line_model.create({'name': 'payment',
+            'statement_id': bank_stmt.id,
+            'partner_id': self.partner_agrolait_id,
+            'amount': amount,
+            'amount_currency': amount_currency,
+            'currency_id': currency_id,
+            'date': time.strftime('%Y') + '-07-15',
+        })
+        line_id = invoice_record.line_ids.filtered(lambda line: line.account_id.user_type_id.type in ('receivable', 'payable'))
+        amount_in_widget = currency_id and amount_currency or amount
+        bank_stmt_line.process_reconciliation(counterpart_aml_dicts=[{
+            'move_line': line_id,
+            'debit': amount_in_widget < 0 and -amount_in_widget or 0.0,
+            'credit': amount_in_widget > 0 and amount_in_widget or 0.0,
+            'name': line_id.name,
+            }])
+        return bank_stmt
+
+    def make_customer_and_supplier_flows(self, invoice_currency_id, invoice_amount, bank_journal, amount, amount_currency, transaction_currency_id):
+        #we create an invoice in given invoice_currency
+        invoice_record = self.create_invoice(type='out_invoice', invoice_amount=invoice_amount, currency_id=invoice_currency_id)
+        #we encode a payment on it, on the given bank_journal with amount, amount_currency and transaction_currency given
+        bank_stmt = self.make_payment(invoice_record, bank_journal, amount=amount, amount_currency=amount_currency, currency_id=transaction_currency_id)
+        customer_move_lines = bank_stmt.move_line_ids
+
+        #we create a supplier bill in given invoice_currency
+        invoice_record = self.create_invoice(type='in_invoice', invoice_amount=invoice_amount, currency_id=invoice_currency_id)
+        #we encode a payment on it, on the given bank_journal with amount, amount_currency and transaction_currency given
+        bank_stmt = self.make_payment(invoice_record, bank_journal, amount=-amount, amount_currency=-amount_currency, currency_id=transaction_currency_id)
+        supplier_move_lines = bank_stmt.move_line_ids
+        return customer_move_lines, supplier_move_lines
diff --git a/addons/account/tests/invoice_test_common.py b/addons/account/tests/invoice_test_common.py
deleted file mode 100644
index 16dcd0dabd89f54f0709e5ee1255e22423448296..0000000000000000000000000000000000000000
--- a/addons/account/tests/invoice_test_common.py
+++ /dev/null
@@ -1,147 +0,0 @@
-# -*- coding: utf-8 -*-
-from odoo.addons.account.tests.account_test_savepoint import AccountingSavepointCase
-from odoo.tests.common import Form
-from odoo.tests import tagged
-from odoo.exceptions import ValidationError
-from odoo import fields
-
-import logging
-
-_logger = logging.getLogger(__name__)
-
-
-@tagged('post_install', '-at_install')
-class InvoiceTestCommon(AccountingSavepointCase):
-
-    @classmethod
-    def setUpClass(cls):
-        super(InvoiceTestCommon, cls).setUpClass()
-
-        # ==== Taxes ====
-        cls.tax_sale_a = cls.company_data['default_tax_sale']
-        cls.tax_sale_b = cls.company_data['default_tax_sale'].copy()
-        cls.tax_purchase_a = cls.company_data['default_tax_purchase']
-        cls.tax_purchase_b = cls.company_data['default_tax_purchase'].copy()
-        cls.tax_armageddon = cls.setup_armageddon_tax('complex_tax', cls.company_data)
-
-        # ==== Products ====
-        cls.product_a = cls.env['product.product'].create({
-            'name': 'product_a',
-            'uom_id': cls.env.ref('uom.product_uom_unit').id,
-            'lst_price': 1000.0,
-            'standard_price': 800.0,
-            'property_account_income_id': cls.company_data['default_account_revenue'].id,
-            'property_account_expense_id': cls.company_data['default_account_expense'].id,
-            'taxes_id': [(6, 0, cls.tax_sale_a.ids)],
-            'supplier_taxes_id': [(6, 0, cls.tax_purchase_a.ids)],
-        })
-        cls.product_b = cls.env['product.product'].create({
-            'name': 'product_b',
-            'uom_id': cls.env.ref('uom.product_uom_dozen').id,
-            'lst_price': 200.0,
-            'standard_price': 160.0,
-            'property_account_income_id': cls.company_data['default_account_revenue'].copy().id,
-            'property_account_expense_id': cls.company_data['default_account_expense'].copy().id,
-            'taxes_id': [(6, 0, (cls.tax_sale_a + cls.tax_sale_b).ids)],
-            'supplier_taxes_id': [(6, 0, (cls.tax_purchase_a + cls.tax_purchase_b).ids)],
-        })
-
-        # ==== Fiscal positions ====
-        cls.fiscal_pos_a = cls.env['account.fiscal.position'].create({
-            'name': 'fiscal_pos_a',
-            'tax_ids': [
-                (0, None, {
-                    'tax_src_id': cls.tax_sale_a.id,
-                    'tax_dest_id': cls.tax_sale_b.id,
-                }),
-                (0, None, {
-                    'tax_src_id': cls.tax_purchase_a.id,
-                    'tax_dest_id': cls.tax_purchase_b.id,
-                }),
-            ],
-            'account_ids': [
-                (0, None, {
-                    'account_src_id': cls.product_a.property_account_income_id.id,
-                    'account_dest_id': cls.product_b.property_account_income_id.id,
-                }),
-                (0, None, {
-                    'account_src_id': cls.product_a.property_account_expense_id.id,
-                    'account_dest_id': cls.product_b.property_account_expense_id.id,
-                }),
-            ],
-        })
-
-        # ==== Payment terms ====
-        cls.pay_terms_a = cls.env.ref('account.account_payment_term_immediate')
-        cls.pay_terms_b = cls.env['account.payment.term'].create({
-            'name': '30% Advance End of Following Month',
-            'note': 'Payment terms: 30% Advance End of Following Month',
-            'line_ids': [
-                (0, 0, {
-                    'value': 'percent',
-                    'value_amount': 30.0,
-                    'sequence': 400,
-                    'days': 0,
-                    'option': 'day_after_invoice_date',
-                }),
-                (0, 0, {
-                    'value': 'balance',
-                    'value_amount': 0.0,
-                    'sequence': 500,
-                    'days': 31,
-                    'option': 'day_following_month',
-                }),
-            ],
-        })
-
-        # ==== Partners ====
-        cls.partner_a = cls.env['res.partner'].create({
-            'name': 'partner_a',
-            'property_payment_term_id': cls.pay_terms_a.id,
-            'property_supplier_payment_term_id': cls.pay_terms_a.id,
-            'property_account_receivable_id': cls.company_data['default_account_receivable'].id,
-            'property_account_payable_id': cls.company_data['default_account_payable'].id,
-            'company_id': False,
-        })
-        cls.partner_b = cls.env['res.partner'].create({
-            'name': 'partner_b',
-            'property_payment_term_id': cls.pay_terms_b.id,
-            'property_supplier_payment_term_id': cls.pay_terms_b.id,
-            'property_account_position_id': cls.fiscal_pos_a.id,
-            'property_account_receivable_id': cls.company_data['default_account_receivable'].copy().id,
-            'property_account_payable_id': cls.company_data['default_account_payable'].copy().id,
-            'company_id': False,
-        })
-
-        # ==== Cash rounding ====
-        cls.cash_rounding_a = cls.env['account.cash.rounding'].create({
-            'name': 'add_invoice_line',
-            'rounding': 0.05,
-            'strategy': 'add_invoice_line',
-            'account_id': cls.company_data['default_account_revenue'].copy().id,
-            'rounding_method': 'UP',
-        })
-        cls.cash_rounding_b = cls.env['account.cash.rounding'].create({
-            'name': 'biggest_tax',
-            'rounding': 0.05,
-            'strategy': 'biggest_tax',
-            'rounding_method': 'DOWN',
-        })
-
-    @classmethod
-    def init_invoice(cls, move_type):
-        move_form = Form(cls.env['account.move'].with_context(default_type=move_type))
-        move_form.invoice_date = fields.Date.from_string('2019-01-01')
-        move_form.partner_id = cls.partner_a
-        with move_form.invoice_line_ids.new() as line_form:
-            line_form.product_id = cls.product_a
-        with move_form.invoice_line_ids.new() as line_form:
-            line_form.product_id = cls.product_b
-        return move_form.save()
-
-    def assertInvoiceValues(self, move, expected_lines_values, expected_move_values):
-        def sort_lines(lines):
-            return lines.sorted(lambda line: (line.exclude_from_invoice_tab, not bool(line.tax_line_id), line.name or '', line.balance))
-        self.assertRecordValues(sort_lines(move.line_ids.sorted()), expected_lines_values)
-        self.assertRecordValues(sort_lines(move.invoice_line_ids.sorted()), expected_lines_values[:len(move.invoice_line_ids)])
-        self.assertRecordValues(move, [expected_move_values])
diff --git a/addons/account/tests/test_account_bank_statement.py b/addons/account/tests/test_account_bank_statement.py
index 5b479387f3f013f3c166a72df06f0c3d7af6e24b..6cd7b9820d72e7abd8ae648d2f3474042d47bbca 100644
--- a/addons/account/tests/test_account_bank_statement.py
+++ b/addons/account/tests/test_account_bank_statement.py
@@ -1,9 +1,9 @@
-from odoo.addons.account.tests.account_test_classes import AccountingTestCase
+from odoo.addons.account.tests.common import AccountTestCommon
 from odoo.tests import tagged
 
 
 @tagged('post_install', '-at_install')
-class TestBankStatement(AccountingTestCase):
+class TestBankStatement(AccountTestCommon):
 
     def setUp(self):
         super(TestBankStatement, self).setUp()
diff --git a/addons/account/tests/test_account_fiscal_year.py b/addons/account/tests/test_account_fiscal_year.py
index 0bbf73249aafeb317f4b406d8d1a89aa8399e4f4..8ab006bbf6d23c9f3a51429f30557f6dc14029e2 100644
--- a/addons/account/tests/test_account_fiscal_year.py
+++ b/addons/account/tests/test_account_fiscal_year.py
@@ -1,5 +1,5 @@
 # -*- coding: utf-8 -*-
-from odoo.addons.account.tests.account_test_classes import AccountingTestCase
+from odoo.addons.account.tests.common import AccountTestCommon
 
 import odoo.tests
 from odoo import fields
@@ -8,7 +8,7 @@ from datetime import datetime
 
 
 @odoo.tests.tagged('post_install', '-at_install')
-class TestFiscalPosition(AccountingTestCase):
+class TestFiscalPosition(AccountTestCommon):
 
     def check_compute_fiscal_year(self, company, date, expected_date_from, expected_date_to):
         '''Compute the fiscal year at a certain date for the company passed as parameter.
diff --git a/addons/account/tests/test_account_invoice_report.py b/addons/account/tests/test_account_invoice_report.py
index d54f4e944d853ba3221b11408699c3273be2c454..bc4d6e2e27ba0f5245f3967d3950017dc7b7a85c 100644
--- a/addons/account/tests/test_account_invoice_report.py
+++ b/addons/account/tests/test_account_invoice_report.py
@@ -1,5 +1,5 @@
 # -*- coding: utf-8 -*-
-from odoo.addons.account.tests.invoice_test_common import InvoiceTestCommon
+from odoo.addons.account.tests.common import AccountTestInvoicingCommon
 from odoo.tests.common import Form
 from odoo.tests import tagged
 from odoo import fields
@@ -8,7 +8,7 @@ from unittest.mock import patch
 
 
 @tagged('post_install', '-at_install')
-class TestAccountInvoiceReport(InvoiceTestCommon):
+class TestAccountInvoiceReport(AccountTestInvoicingCommon):
 
     @classmethod
     def setUpClass(cls):
diff --git a/addons/account/tests/test_account_journal_dashboard.py b/addons/account/tests/test_account_journal_dashboard.py
index 19a7bbdab5976eeceac4d3ee97bd5d26ce5ab79f..cb9ffb9537518c780166ee085c038e710b62fa61 100644
--- a/addons/account/tests/test_account_journal_dashboard.py
+++ b/addons/account/tests/test_account_journal_dashboard.py
@@ -1,11 +1,11 @@
 from unittest.mock import patch
 
-from odoo.addons.account.tests.account_test_users import AccountTestUsers
+from odoo.addons.account.tests.common import AccountTestUsersCommon
 from odoo.tests import tagged
 
 
 @tagged('post_install', '-at_install')
-class TestAccountJournalDashboard(AccountTestUsers):
+class TestAccountJournalDashboard(AccountTestUsersCommon):
     def test_customer_invoice_dashboard(self):
         def patched_today(*args, **kwargs):
             return '2019-01-22'
diff --git a/addons/account/tests/test_account_move_entry.py b/addons/account/tests/test_account_move_entry.py
index d10bbab526de3953794b3d27cc7e8879808376eb..bd14ff00dc5220920e5e406c002b53f62a8eb226 100644
--- a/addons/account/tests/test_account_move_entry.py
+++ b/addons/account/tests/test_account_move_entry.py
@@ -1,5 +1,5 @@
 # -*- coding: utf-8 -*-
-from odoo.addons.account.tests.invoice_test_common import InvoiceTestCommon
+from odoo.addons.account.tests.common import AccountTestInvoicingCommon
 from odoo.tests import tagged, new_test_user
 from odoo import fields
 from odoo.exceptions import ValidationError, UserError
@@ -8,7 +8,7 @@ from dateutil.relativedelta import relativedelta
 
 
 @tagged('post_install', '-at_install')
-class TestAccountMove(InvoiceTestCommon):
+class TestAccountMove(AccountTestInvoicingCommon):
 
     @classmethod
     def setUpClass(cls):
diff --git a/addons/account/tests/test_account_move_in_invoice.py b/addons/account/tests/test_account_move_in_invoice.py
index fe6692d99d8e38467a0b3f0b0d72fb234cc6f6f3..9dd2a87a36fd720027d7e387aaefdf05154a9fbd 100644
--- a/addons/account/tests/test_account_move_in_invoice.py
+++ b/addons/account/tests/test_account_move_in_invoice.py
@@ -1,5 +1,5 @@
 # -*- coding: utf-8 -*-
-from odoo.addons.account.tests.invoice_test_common import InvoiceTestCommon
+from odoo.addons.account.tests.common import AccountTestInvoicingCommon
 from odoo.tests.common import Form
 from odoo.tests import tagged
 from odoo import fields
@@ -7,7 +7,7 @@ from odoo.exceptions import ValidationError
 
 
 @tagged('post_install', '-at_install')
-class TestAccountMoveInInvoiceOnchanges(InvoiceTestCommon):
+class TestAccountMoveInInvoiceOnchanges(AccountTestInvoicingCommon):
 
     @classmethod
     def setUpClass(cls):
diff --git a/addons/account/tests/test_account_move_in_refund.py b/addons/account/tests/test_account_move_in_refund.py
index e89b81c98a7c101084134258309bbced2bbbe1aa..2b883297f598264cf67c27f74d05d36f589699b8 100644
--- a/addons/account/tests/test_account_move_in_refund.py
+++ b/addons/account/tests/test_account_move_in_refund.py
@@ -1,12 +1,12 @@
 # -*- coding: utf-8 -*-
-from odoo.addons.account.tests.invoice_test_common import InvoiceTestCommon
+from odoo.addons.account.tests.common import AccountTestInvoicingCommon
 from odoo.tests.common import Form
 from odoo.tests import tagged
 from odoo import fields
 
 
 @tagged('post_install', '-at_install')
-class TestAccountMoveInRefundOnchanges(InvoiceTestCommon):
+class TestAccountMoveInRefundOnchanges(AccountTestInvoicingCommon):
 
     @classmethod
     def setUpClass(cls):
diff --git a/addons/account/tests/test_account_move_out_invoice.py b/addons/account/tests/test_account_move_out_invoice.py
index 38a54508910e283d5c12a7bd08deaee84e631eaf..2556fbcc9cd126b9dce2259c50f86658d1d89836 100644
--- a/addons/account/tests/test_account_move_out_invoice.py
+++ b/addons/account/tests/test_account_move_out_invoice.py
@@ -1,5 +1,5 @@
 # -*- coding: utf-8 -*-
-from odoo.addons.account.tests.invoice_test_common import InvoiceTestCommon
+from odoo.addons.account.tests.common import AccountTestInvoicingCommon
 from odoo.tests.common import Form
 from odoo.tests import tagged
 from odoo import fields
@@ -9,7 +9,7 @@ from unittest.mock import patch
 
 
 @tagged('post_install', '-at_install')
-class TestAccountMoveOutInvoiceOnchanges(InvoiceTestCommon):
+class TestAccountMoveOutInvoiceOnchanges(AccountTestInvoicingCommon):
 
     @classmethod
     def setUpClass(cls):
diff --git a/addons/account/tests/test_account_move_out_refund.py b/addons/account/tests/test_account_move_out_refund.py
index 5d446553d61982c72d7ec6ea8573869e7b1105c1..8f87ec6563f85ef05c8a97bcb138bfe68f1006cb 100644
--- a/addons/account/tests/test_account_move_out_refund.py
+++ b/addons/account/tests/test_account_move_out_refund.py
@@ -1,12 +1,12 @@
 # -*- coding: utf-8 -*-
-from odoo.addons.account.tests.invoice_test_common import InvoiceTestCommon
+from odoo.addons.account.tests.common import AccountTestInvoicingCommon
 from odoo.tests.common import Form
 from odoo.tests import tagged
 from odoo import fields
 
 
 @tagged('post_install', '-at_install')
-class TestAccountMoveOutRefundOnchanges(InvoiceTestCommon):
+class TestAccountMoveOutRefundOnchanges(AccountTestInvoicingCommon):
 
     @classmethod
     def setUpClass(cls):
diff --git a/addons/account/tests/test_account_move_rounding.py b/addons/account/tests/test_account_move_rounding.py
index 9ea27cb74bb196c2c5a4550dec98bb2183663991..5514ec05c576faf58b535e1369a4dab84948c155 100644
--- a/addons/account/tests/test_account_move_rounding.py
+++ b/addons/account/tests/test_account_move_rounding.py
@@ -1,11 +1,11 @@
 # -*- coding: utf-8 -*-
 
-from odoo.addons.account.tests.account_test_classes import AccountingTestCase
+from odoo.addons.account.tests.common import AccountTestCommon
 from odoo.tests import tagged
 
 
 @tagged('post_install', '-at_install')
-class TestAccountMoveRounding(AccountingTestCase):
+class TestAccountMoveRounding(AccountTestCommon):
 
     @classmethod
     def setUpClass(cls):
diff --git a/addons/account/tests/test_bank_statement_reconciliation.py b/addons/account/tests/test_bank_statement_reconciliation.py
index 6061f553644104fcf2761cc10288b09d9e359017..37590f446469c0d9f5864456e903448bf9cbf1d1 100644
--- a/addons/account/tests/test_bank_statement_reconciliation.py
+++ b/addons/account/tests/test_bank_statement_reconciliation.py
@@ -1,9 +1,9 @@
-from odoo.addons.account.tests.account_test_classes import AccountingTestCase
+from odoo.addons.account.tests.common import AccountTestCommon
 from odoo.tests import tagged
 
 
 @tagged('post_install', '-at_install')
-class TestBankStatementReconciliation(AccountingTestCase):
+class TestBankStatementReconciliation(AccountTestCommon):
 
     @classmethod
     def setUpClass(cls):
diff --git a/addons/account/tests/test_control_journal_account.py b/addons/account/tests/test_control_journal_account.py
index f558a96521aba372c1218f51fe7f1be38357040a..099ad7a80823f80a22406159ee7ba5e47ac9081c 100644
--- a/addons/account/tests/test_control_journal_account.py
+++ b/addons/account/tests/test_control_journal_account.py
@@ -1,10 +1,10 @@
-from odoo.addons.account.tests.account_test_no_chart import TestAccountNoChartCommon
+from odoo.addons.account.tests.common import AccountTestNoChartCommon
 from odoo.tests.common import tagged
 from odoo.exceptions import UserError, ValidationError
 
 
 @tagged('post_install', '-at_install')
-class TestControlJournalAccount(TestAccountNoChartCommon):
+class TestControlJournalAccount(AccountTestNoChartCommon):
     @classmethod
     def setUpClass(cls):
         super(TestControlJournalAccount, cls).setUpClass()
diff --git a/addons/account/tests/test_invoice_taxes.py b/addons/account/tests/test_invoice_taxes.py
index 0d4df086eba4dd11ff164b5ffc80e00ac16183d6..a297d7914f55e8cb3472490bdcf1c9a6385178fd 100644
--- a/addons/account/tests/test_invoice_taxes.py
+++ b/addons/account/tests/test_invoice_taxes.py
@@ -2,13 +2,13 @@
 # Part of Odoo. See LICENSE file for full copyright and licensing details.
 
 from odoo.addons.base.tests.common import SavepointCaseWithUserDemo
-from odoo.addons.account.tests.account_test_classes import AccountingTestCase
+from odoo.addons.account.tests.common import AccountTestCommon
 from odoo.tests.common import Form
 from odoo.tests import tagged
 
 
 @tagged('post_install', '-at_install')
-class TestInvoiceTaxes(AccountingTestCase, SavepointCaseWithUserDemo):
+class TestInvoiceTaxes(AccountTestCommon, SavepointCaseWithUserDemo):
 
     @classmethod
     def setUpClass(cls):
diff --git a/addons/account/tests/test_payment.py b/addons/account/tests/test_payment.py
index 8f560635e606c2a320c8a18767155a2f6546b3eb..f155dccaff5b238916e9dff6428cb28144b5f416 100644
--- a/addons/account/tests/test_payment.py
+++ b/addons/account/tests/test_payment.py
@@ -1,14 +1,14 @@
 # -*- coding: utf-8 -*-
 # Part of Odoo. See LICENSE file for full copyright and licensing details.
 
-from odoo.addons.account.tests.account_test_classes import AccountingTestCase
+from odoo.addons.account.tests.common import AccountTestCommon
 from odoo.tests import tagged
 from odoo.tests.common import Form
 import time
 
 
 @tagged('post_install', '-at_install')
-class TestPayment(AccountingTestCase):
+class TestPayment(AccountTestCommon):
 
     def setUp(self):
         self.env.ref('base.main_company').currency_id = self.env.ref('base.USD')
diff --git a/addons/account/tests/test_reconciliation.py b/addons/account/tests/test_reconciliation.py
index 0877d1368bcdb1792505b5cbea545c23f324087a..bb56e66e8265c456281dde1f803444824ed7aa23 100644
--- a/addons/account/tests/test_reconciliation.py
+++ b/addons/account/tests/test_reconciliation.py
@@ -1,256 +1,18 @@
 # -*- coding: utf-8 -*-
 # Part of Odoo. See LICENSE file for full copyright and licensing details.
 
-from odoo import api, fields, tools
-from odoo.addons.account.tests.account_test_classes import AccountingTestCase
-from odoo.exceptions import UserError
-from odoo.tests import Form, tagged
 import time
-from datetime import timedelta
 import unittest
+from datetime import timedelta
 
-# TODO in master
-# The name of this class should be TestReconciliationHelpers
-class TestReconciliation(AccountingTestCase):
-
-    """Tests for reconciliation (account.tax)
-
-    Test used to check that when doing a sale or purchase invoice in a different currency,
-    the result will be balanced.
-    """
-
-    @classmethod
-    def setUpClass(cls):
-        super(TestReconciliation, cls).setUpClass()
-        cls.company = cls.env['res.company'].create({
-            'name': 'A test company',
-            'currency_id': cls.env.ref('base.EUR').id
-        })
-        cls.env.user.company_id = cls.company
-        # Generate minimal data for my new company
-        cls.create_accounting_minimal_data()
-
-        cls.acc_bank_stmt_model = cls.env['account.bank.statement']
-        cls.acc_bank_stmt_line_model = cls.env['account.bank.statement.line']
-        cls.res_currency_model = cls.registry('res.currency')
-        cls.res_currency_rate_model = cls.registry('res.currency.rate')
-
-        cls.partner_agrolait = cls.env['res.partner'].create({
-            'name': 'Deco Addict',
-            'is_company': True,
-            'country_id': cls.env.ref('base.us').id,
-        })
-        cls.partner_agrolait_id = cls.partner_agrolait.id
-        cls.currency_swiss_id = cls.env.ref("base.CHF").id
-        cls.currency_usd_id = cls.env.ref("base.USD").id
-        cls.currency_euro_id = cls.env.ref("base.EUR").id
-        # YTI FIXME Some of those lines should be useless now
-        cls.cr.execute("UPDATE res_company SET currency_id = %s WHERE id = %s", [cls.currency_euro_id, cls.company.id])
-        cls.account_rcv = cls.partner_agrolait.property_account_receivable_id or cls.env['account.account'].search([('user_type_id', '=', cls.env.ref('account.data_account_type_receivable').id)], limit=1)
-        cls.account_rsa = cls.partner_agrolait.property_account_payable_id or cls.env['account.account'].search([('user_type_id', '=', cls.env.ref('account.data_account_type_payable').id)], limit=1)
-        cls.product = cls.env['product.product'].create({
-            'name': 'Product Product 4',
-            'standard_price': 500.0,
-            'list_price': 750.0,
-            'type': 'consu',
-            'categ_id': cls.env.ref('product.product_category_all').id,
-        })
-
-        cls.bank_journal_euro = cls.env['account.journal'].create({'name': 'Bank', 'type': 'bank', 'code': 'BNK67'})
-        cls.account_euro = cls.bank_journal_euro.default_debit_account_id
-
-        cls.bank_journal_usd = cls.env['account.journal'].create({'name': 'Bank US', 'type': 'bank', 'code': 'BNK68', 'currency_id': cls.currency_usd_id})
-        cls.account_usd = cls.bank_journal_usd.default_debit_account_id
-
-        cls.fx_journal = cls.env['res.users'].browse(cls.env.uid).company_id.currency_exchange_journal_id
-        cls.diff_income_account = cls.env['res.users'].browse(cls.env.uid).company_id.income_currency_exchange_account_id
-        cls.diff_expense_account = cls.env['res.users'].browse(cls.env.uid).company_id.expense_currency_exchange_account_id
-
-        cls.inbound_payment_method = cls.env['account.payment.method'].create({
-            'name': 'inbound',
-            'code': 'IN',
-            'payment_type': 'inbound',
-        })
-
-        cls.expense_account = cls.env['account.account'].create({
-            'name': 'EXP',
-            'code': 'EXP',
-            'user_type_id': cls.env.ref('account.data_account_type_expenses').id,
-            'company_id': cls.company.id,
-        })
-        # cash basis intermediary account
-        cls.tax_waiting_account = cls.env['account.account'].create({
-            'name': 'TAX_WAIT',
-            'code': 'TWAIT',
-            'user_type_id': cls.env.ref('account.data_account_type_current_liabilities').id,
-            'reconcile': True,
-            'company_id': cls.company.id,
-        })
-        # cash basis final account
-        cls.tax_final_account = cls.env['account.account'].create({
-            'name': 'TAX_TO_DEDUCT',
-            'code': 'TDEDUCT',
-            'user_type_id': cls.env.ref('account.data_account_type_current_assets').id,
-            'company_id': cls.company.id,
-        })
-        cls.tax_base_amount_account = cls.env['account.account'].create({
-            'name': 'TAX_BASE',
-            'code': 'TBASE',
-            'user_type_id': cls.env.ref('account.data_account_type_current_assets').id,
-            'company_id': cls.company.id,
-        })
-
-        # Journals
-        cls.purchase_journal = cls.env['account.journal'].create({
-            'name': 'purchase',
-            'code': 'PURCH',
-            'type': 'purchase',
-            'default_credit_account_id': cls.a_expense.id,
-            'default_debit_account_id': cls.a_expense.id,
-        })
-        cls.cash_basis_journal = cls.env['account.journal'].create({
-            'name': 'CABA',
-            'code': 'CABA',
-            'type': 'general',
-        })
-        cls.general_journal = cls.env['account.journal'].create({
-            'name': 'general',
-            'code': 'GENE',
-            'type': 'general',
-        })
-
-        # Tax Cash Basis
-        cls.tax_cash_basis = cls.env['account.tax'].create({
-            'name': 'cash basis 20%',
-            'type_tax_use': 'purchase',
-            'company_id': cls.company.id,
-            'amount': 20,
-            'tax_exigibility': 'on_payment',
-            'cash_basis_transition_account_id': cls.tax_waiting_account.id,
-            'cash_basis_base_account_id': cls.tax_base_amount_account.id,
-            'invoice_repartition_line_ids': [
-                    (0,0, {
-                        'factor_percent': 100,
-                        'repartition_type': 'base',
-                    }),
-
-                    (0,0, {
-                        'factor_percent': 100,
-                        'repartition_type': 'tax',
-                        'account_id': cls.tax_final_account.id,
-                    }),
-                ],
-            'refund_repartition_line_ids': [
-                    (0,0, {
-                        'factor_percent': 100,
-                        'repartition_type': 'base',
-                    }),
-
-                    (0,0, {
-                        'factor_percent': 100,
-                        'repartition_type': 'tax',
-                        'account_id': cls.tax_final_account.id,
-                    }),
-                ],
-        })
-        cls.env['res.currency.rate'].create([
-            {
-                'currency_id': cls.env.ref('base.EUR').id,
-                'name': '2010-01-02',
-                'rate': 1.0,
-            }, {
-                'currency_id': cls.env.ref('base.USD').id,
-                'name': '2010-01-02',
-                'rate': 1.2834,
-            }, {
-                'currency_id': cls.env.ref('base.USD').id,
-                'name': time.strftime('%Y-06-05'),
-                'rate': 1.5289,
-            }
-        ])
-
-    def _create_invoice(self, type='out_invoice', invoice_amount=50, currency_id=None, partner_id=None, date_invoice=None, payment_term_id=False, auto_validate=False):
-        date_invoice = date_invoice or time.strftime('%Y') + '-07-01'
-
-        invoice_vals = {
-            'type': type,
-            'partner_id': partner_id or self.partner_agrolait_id,
-            'invoice_date': date_invoice,
-            'date': date_invoice,
-            'invoice_line_ids': [(0, 0, {
-                'name': 'product that cost %s' % invoice_amount,
-                'quantity': 1,
-                'price_unit': invoice_amount,
-                'tax_ids': [(6, 0, [])],
-            })]
-        }
-
-        if payment_term_id:
-            invoice_vals['invoice_payment_term_id'] = payment_term_id
-
-        if currency_id:
-            invoice_vals['currency_id'] = currency_id
-
-        invoice = self.env['account.move'].with_context(default_type=type).create(invoice_vals)
-        if auto_validate:
-            invoice.post()
-        return invoice
-
-    def create_invoice(self, type='out_invoice', invoice_amount=50, currency_id=None):
-        return self._create_invoice(type=type, invoice_amount=invoice_amount, currency_id=currency_id, auto_validate=True)
-
-    def create_invoice_partner(self, type='out_invoice', invoice_amount=50, currency_id=None, partner_id=False, payment_term_id=False):
-        return self._create_invoice(
-            type=type,
-            invoice_amount=invoice_amount,
-            currency_id=currency_id,
-            partner_id=partner_id,
-            payment_term_id=payment_term_id,
-            auto_validate=True
-        )
-
-    def make_payment(self, invoice_record, bank_journal, amount=0.0, amount_currency=0.0, currency_id=None):
-        bank_stmt = self.acc_bank_stmt_model.create({
-            'journal_id': bank_journal.id,
-            'date': time.strftime('%Y') + '-07-15',
-            'name': 'payment' + invoice_record.name
-        })
-
-        bank_stmt_line = self.acc_bank_stmt_line_model.create({'name': 'payment',
-            'statement_id': bank_stmt.id,
-            'partner_id': self.partner_agrolait_id,
-            'amount': amount,
-            'amount_currency': amount_currency,
-            'currency_id': currency_id,
-            'date': time.strftime('%Y') + '-07-15',
-        })
-        line_id = invoice_record.line_ids.filtered(lambda line: line.account_id.user_type_id.type in ('receivable', 'payable'))
-        amount_in_widget = currency_id and amount_currency or amount
-        bank_stmt_line.process_reconciliation(counterpart_aml_dicts=[{
-            'move_line': line_id,
-            'debit': amount_in_widget < 0 and -amount_in_widget or 0.0,
-            'credit': amount_in_widget > 0 and amount_in_widget or 0.0,
-            'name': line_id.name,
-            }])
-        return bank_stmt
-
-    def make_customer_and_supplier_flows(self, invoice_currency_id, invoice_amount, bank_journal, amount, amount_currency, transaction_currency_id):
-        #we create an invoice in given invoice_currency
-        invoice_record = self.create_invoice(type='out_invoice', invoice_amount=invoice_amount, currency_id=invoice_currency_id)
-        #we encode a payment on it, on the given bank_journal with amount, amount_currency and transaction_currency given
-        bank_stmt = self.make_payment(invoice_record, bank_journal, amount=amount, amount_currency=amount_currency, currency_id=transaction_currency_id)
-        customer_move_lines = bank_stmt.move_line_ids
-
-        #we create a supplier bill in given invoice_currency
-        invoice_record = self.create_invoice(type='in_invoice', invoice_amount=invoice_amount, currency_id=invoice_currency_id)
-        #we encode a payment on it, on the given bank_journal with amount, amount_currency and transaction_currency given
-        bank_stmt = self.make_payment(invoice_record, bank_journal, amount=-amount, amount_currency=-amount_currency, currency_id=transaction_currency_id)
-        supplier_move_lines = bank_stmt.move_line_ids
-        return customer_move_lines, supplier_move_lines
+from odoo import api, fields
+from odoo.addons.account.tests.common import TestAccountReconciliationCommon
+from odoo.exceptions import UserError
+from odoo.tests import Form, tagged
 
 
 @tagged('post_install', '-at_install')
-class TestReconciliationExec(TestReconciliation):
+class TestReconciliationExec(TestAccountReconciliationCommon):
 
     def test_statement_usd_invoice_eur_transaction_eur(self):
         customer_move_lines, supplier_move_lines = self.make_customer_and_supplier_flows(self.currency_euro_id, 30, self.bank_journal_usd, 42, 30, self.currency_euro_id)
diff --git a/addons/account/tests/test_reconciliation_matching_rules.py b/addons/account/tests/test_reconciliation_matching_rules.py
index 466f60c4131c5d7150c510cb218882aa6841eeef..7ef983ae4d13013c4f3693a9383a167a2466e5bf 100644
--- a/addons/account/tests/test_reconciliation_matching_rules.py
+++ b/addons/account/tests/test_reconciliation_matching_rules.py
@@ -1,12 +1,12 @@
 # -*- coding: utf-8 -*-
 from odoo import fields, tools
-from odoo.addons.account.tests.account_test_classes import AccountingTestCase
+from odoo.addons.account.tests.common import AccountTestCommon
 from odoo.tests.common import Form
 from odoo.tests import tagged
 
 
 @tagged('post_install', '-at_install')
-class TestReconciliationMatchingRules(AccountingTestCase):
+class TestReconciliationMatchingRules(AccountTestCommon):
 
     @classmethod
     def setUpClass(cls):
diff --git a/addons/account/tests/test_search.py b/addons/account/tests/test_search.py
index 5a80665558cfcd430eba0445885a698b944460b4..b37e7e011f0eec5ee48abe8a1e7cb78789576270 100644
--- a/addons/account/tests/test_search.py
+++ b/addons/account/tests/test_search.py
@@ -1,9 +1,9 @@
-from odoo.addons.account.tests.account_test_users import AccountTestUsers
+from odoo.addons.account.tests.common import AccountTestUsersCommon
 from odoo.tests import tagged
 
 
 @tagged('post_install', '-at_install')
-class TestSearch(AccountTestUsers):
+class TestSearch(AccountTestUsersCommon):
 
     """Tests for search on name_search (account.account)
 
diff --git a/addons/account/tests/test_settings.py b/addons/account/tests/test_settings.py
index e96b98349ac396a65a34ed8a5ddf6716539d33ae..793cf71fe5a2fbe4e9a077d8e71e60bfed760cbd 100644
--- a/addons/account/tests/test_settings.py
+++ b/addons/account/tests/test_settings.py
@@ -1,9 +1,9 @@
-from odoo.addons.account.tests.account_test_classes import AccountingTestCase
+from odoo.addons.account.tests.common import AccountTestCommon
 from odoo.tests import tagged
 
 
 @tagged('post_install', '-at_install')
-class TestSettings(AccountingTestCase):
+class TestSettings(AccountTestCommon):
 
     def test_switch_taxB2B_taxB2C(self):
         """
diff --git a/addons/account/tests/test_tax.py b/addons/account/tests/test_tax.py
index a9adc25cf7e84454b12187539c83e539bb8269da..9a0c51742c8ec88c56f56138e164bf7427c5b93d 100644
--- a/addons/account/tests/test_tax.py
+++ b/addons/account/tests/test_tax.py
@@ -1,10 +1,10 @@
 # -*- coding: utf-8 -*-
-from odoo.addons.account.tests.account_test_users import AccountTestUsers
+from odoo.addons.account.tests.common import AccountTestUsersCommon
 from odoo.tests import tagged
 
 
 @tagged('post_install', '-at_install')
-class TestTax(AccountTestUsers):
+class TestTax(AccountTestUsersCommon):
 
     @classmethod
     def setUpClass(cls):
diff --git a/addons/account_check_printing/tests/test_print_check.py b/addons/account_check_printing/tests/test_print_check.py
index 1b96aeab236a2125315e74c3d939966b98dde20e..3a47340a0c652423c3793f25576fa69e6dfbf794 100644
--- a/addons/account_check_printing/tests/test_print_check.py
+++ b/addons/account_check_printing/tests/test_print_check.py
@@ -1,7 +1,7 @@
 # Make sure / performs a floating point division even if environment is python 2
 from __future__ import division
 
-from odoo.addons.account.tests.account_test_classes import AccountingTestCase
+from odoo.addons.account.tests.common import AccountTestCommon
 from odoo.addons.account_check_printing.models.account_payment import INV_LINES_PER_STUB
 from odoo.tests import tagged
 from odoo.tests.common import Form
@@ -11,7 +11,7 @@ import math
 
 
 @tagged('post_install', '-at_install')
-class TestPrintCheck(AccountingTestCase):
+class TestPrintCheck(AccountTestCommon):
 
     @classmethod
     def setUpClass(cls):
diff --git a/addons/delivery/tests/test_delivery_stock_move.py b/addons/delivery/tests/test_delivery_stock_move.py
index 73738a46fec9b52295d1e82ed90b42e48597be9c..a5fc9d91dfaaa3a2de0d116c8ed5f7ec5d315e36 100644
--- a/addons/delivery/tests/test_delivery_stock_move.py
+++ b/addons/delivery/tests/test_delivery_stock_move.py
@@ -1,11 +1,11 @@
 # -*- coding: utf-8 -*-
 
-from odoo.addons.account.tests.account_test_classes import AccountingTestCase
+from odoo.addons.account.tests.common import AccountTestCommon
 from odoo.tests import tagged, Form
 
 
 @tagged('post_install', '-at_install')
-class StockMoveInvoice(AccountingTestCase):
+class StockMoveInvoice(AccountTestCommon):
 
     def setUp(self):
         super(StockMoveInvoice, self).setUp()
diff --git a/addons/hr_expense/tests/common.py b/addons/hr_expense/tests/common.py
index b045a539a1a182288557697bf48039f6cd37a5ac..df35c8d3e75fbd880ff42ea57353f4fa42cbe15f 100644
--- a/addons/hr_expense/tests/common.py
+++ b/addons/hr_expense/tests/common.py
@@ -1,10 +1,10 @@
 # -*- coding: utf-8 -*-
 # Part of Odoo. See LICENSE file for full copyright and licensing details.
 
-from odoo.addons.account.tests.account_test_no_chart import TestAccountNoChartCommon
+from odoo.addons.account.tests.common import AccountTestNoChartCommon
 
 
-class TestExpenseCommon(TestAccountNoChartCommon):
+class TestExpenseCommon(AccountTestNoChartCommon):
 
     @classmethod
     def setUpClass(cls):
diff --git a/addons/l10n_ch/tests/test_l10n_ch_isr.py b/addons/l10n_ch/tests/test_l10n_ch_isr.py
index 2a089dccd1dee2c925572f0d51e1e7a5f5c18ab8..dbd73bac1a03375e090d2f9d4f51743dd57fd518 100644
--- a/addons/l10n_ch/tests/test_l10n_ch_isr.py
+++ b/addons/l10n_ch/tests/test_l10n_ch_isr.py
@@ -3,13 +3,13 @@
 
 import time
 
-from odoo.addons.account.tests.account_test_classes import AccountingTestCase
+from odoo.addons.account.tests.common import AccountTestCommon
 from odoo.exceptions import ValidationError
 from odoo.tests import tagged
 
 
 @tagged('post_install', '-at_install')
-class ISRTest(AccountingTestCase):
+class ISRTest(AccountTestCommon):
 
     def create_invoice(self, currency_to_use='base.CHF'):
         """ Generates a test invoice """
diff --git a/addons/membership/tests/common.py b/addons/membership/tests/common.py
index 2e8d889e58c29d5d15d324b79855e5a2bf642a73..77499230de70552528c3a850605992876d260a95 100644
--- a/addons/membership/tests/common.py
+++ b/addons/membership/tests/common.py
@@ -3,10 +3,10 @@
 import datetime
 from dateutil.relativedelta import relativedelta
 
-from odoo.addons.account.tests.account_test_classes import AccountingTestCase
+from odoo.addons.account.tests.common import AccountTestCommon
 
 
-class TestMembershipCommon(AccountingTestCase):
+class TestMembershipCommon(AccountTestCommon):
 
     def setUp(self):
         super(TestMembershipCommon, self).setUp()
diff --git a/addons/payment/tests/common.py b/addons/payment/tests/common.py
index 096c8e0eab36f88868e104d85899f0d2fb204e4e..58e12439cfb8e1dafc7010be9876b7e77d2b9dfe 100644
--- a/addons/payment/tests/common.py
+++ b/addons/payment/tests/common.py
@@ -1,9 +1,9 @@
 # -*- coding: utf-8 -*-
 
-from odoo.addons.account.tests.account_test_classes import AccountingTestCase
+from odoo.addons.account.tests.common import AccountTestCommon
 
 
-class PaymentAcquirerCommon(AccountingTestCase):
+class PaymentAcquirerCommon(AccountTestCommon):
 
     def setUp(self):
         super(PaymentAcquirerCommon, self).setUp()
diff --git a/addons/point_of_sale/tests/common.py b/addons/point_of_sale/tests/common.py
index d9db5cf5620802033b8b6732dc83d640d018961f..cef2b387cdf90acf2427f6d4d6ea654fc29cad0d 100644
--- a/addons/point_of_sale/tests/common.py
+++ b/addons/point_of_sale/tests/common.py
@@ -2,12 +2,12 @@
 from random import randint
 
 from odoo import fields, tools
-from odoo.addons.stock_account.tests.stock_account_minimal_test import StockAccountMinimalTest
+from odoo.addons.stock_account.tests.common import StockAccountTestCommon
 from odoo.tests.common import SavepointCase, Form
 from odoo.tools import float_is_zero
 
 
-class TestPointOfSaleCommon(StockAccountMinimalTest):
+class TestPointOfSaleCommon(StockAccountTestCommon):
 
     @classmethod
     def setUpClass(cls):
@@ -146,7 +146,7 @@ class TestPointOfSaleCommon(StockAccountMinimalTest):
         (invoice_rep_lines | refund_rep_lines).write({'account_id': cls.a_expense.id})
 
 
-class TestPoSCommon(StockAccountMinimalTest):
+class TestPoSCommon(StockAccountTestCommon):
     """ Set common values for different special test cases.
 
     The idea is to set up common values here for the tests
diff --git a/addons/point_of_sale/tests/test_pos_products_with_tax.py b/addons/point_of_sale/tests/test_pos_products_with_tax.py
index a2f27b2b10a11595da55d5cde6de766211abf60d..b0ef8ac873cd3bb21a0791027bcba3248c397d04 100644
--- a/addons/point_of_sale/tests/test_pos_products_with_tax.py
+++ b/addons/point_of_sale/tests/test_pos_products_with_tax.py
@@ -190,7 +190,7 @@ class TestPoSProductsWithTax(TestPoSCommon):
         # check receivable line
         # should be equivalent to receivable in the invoice
         # should also be fully-reconciled
-        receivable_line = session_move.line_ids.filtered(lambda line: line.account_id in self.receivable_account + self.env['account.account'].search([('name', '=', 'Account Receivable (PoS)')]) and line.name == 'From invoiced orders')
+        receivable_line = session_move.line_ids.filtered(lambda line: line.account_id in self.receivable_account + self.env['account.account'].search([('name', '=', 'Account Receivable')]) and line.name == 'From invoiced orders')
         self.assertAlmostEqual(receivable_line.balance, -426.09)
         self.assertTrue(receivable_line.full_reconcile_id, msg='Receivable line for invoices should be fully reconciled.')
 
diff --git a/addons/product_margin/tests/test_product_margin.py b/addons/product_margin/tests/test_product_margin.py
index dc3f8a32bd9c58c44bef70b2cf749612e7a91898..6bcca596b4a4628ecce29ba55737cff8bc5940cd 100644
--- a/addons/product_margin/tests/test_product_margin.py
+++ b/addons/product_margin/tests/test_product_margin.py
@@ -2,12 +2,12 @@
 # Part of Odoo. See LICENSE file for full copyright and licensing details.
 
 from odoo import tools
-from odoo.addons.account.tests.account_minimal_test import AccountMinimalTest
+from odoo.addons.account.tests.common import AccountTestCommon
 from odoo.tests import Form
 from odoo.modules.module import get_resource_path
 
 
-class TestProductMargin(AccountMinimalTest):
+class TestProductMargin(AccountTestCommon):
 
     def create_account_invoice(self, invoice_type, partner, product, quantity=0.0, price_unit=0.0):
         """ Create an invoice as in a view by triggering its onchange methods"""
diff --git a/addons/purchase/tests/test_purchase_order_report.py b/addons/purchase/tests/test_purchase_order_report.py
index 8d157f3ace1f29908686ec779f05b74c0c96d68c..82fe92cefdae5891f564491a80ee02460d8db83c 100644
--- a/addons/purchase/tests/test_purchase_order_report.py
+++ b/addons/purchase/tests/test_purchase_order_report.py
@@ -3,10 +3,10 @@
 
 from datetime import datetime
 from odoo.tests import Form, tagged
-from odoo.addons.account.tests.account_minimal_test import AccountMinimalTest
+from odoo.addons.account.tests.common import AccountTestCommon
 
 @tagged('post_install', '-at_install')
-class TestPurchaseOrderReport(AccountMinimalTest):
+class TestPurchaseOrderReport(AccountTestCommon):
 
     @classmethod
     def setUpClass(cls):
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 c65721fa8f15504e99225555a0a51d2353767fec..01554c6290568ed6d878e405989eddef10f59fae 100644
--- a/addons/purchase_stock/tests/test_anglo_saxon_valuation_reconciliation.py
+++ b/addons/purchase_stock/tests/test_anglo_saxon_valuation_reconciliation.py
@@ -5,12 +5,12 @@ from datetime import datetime
 
 import time
 
-from odoo.addons.stock_account.tests.test_anglo_saxon_valuation_reconciliation_common import ValuationReconciliationTestCase
+from odoo.addons.stock_account.tests.test_anglo_saxon_valuation_reconciliation_common import ValuationReconciliationTestCommon
 from odoo.tests.common import Form, tagged
 
 
 @tagged('post_install', '-at_install')
-class TestValuationReconciliation(ValuationReconciliationTestCase):
+class TestValuationReconciliation(ValuationReconciliationTestCommon):
 
     def setUp(self):
         super(TestValuationReconciliation, self).setUp()
diff --git a/addons/purchase_stock/tests/test_average_price.py b/addons/purchase_stock/tests/test_average_price.py
index 07f0a27dd6dfa15b2b12685196e33ba14323422a..099f8616bd915c4bd68a08d96d82437383e86ef9 100644
--- a/addons/purchase_stock/tests/test_average_price.py
+++ b/addons/purchase_stock/tests/test_average_price.py
@@ -4,9 +4,9 @@
 import time
 
 from .common import TestPurchase
-from odoo.addons.stock_account.tests.stock_account_minimal_test import StockAccountMinimalTest
+from odoo.addons.stock_account.tests.common import StockAccountTestCommon
 
-class TestAveragePrice(TestPurchase, StockAccountMinimalTest):
+class TestAveragePrice(TestPurchase, StockAccountTestCommon):
 
     def test_00_average_price(self):
         """ Testcase for average price computation"""
diff --git a/addons/purchase_stock/tests/test_fifo_price.py b/addons/purchase_stock/tests/test_fifo_price.py
index bea7347575ed6d1047dfcce4282ccd67fd69b596..c683394f650fe5bb9d835da8150693f9bc36994b 100644
--- a/addons/purchase_stock/tests/test_fifo_price.py
+++ b/addons/purchase_stock/tests/test_fifo_price.py
@@ -3,9 +3,9 @@
 import time
 
 from .common import TestPurchase
-from odoo.addons.stock_account.tests.stock_account_minimal_test import StockAccountMinimalTest
+from odoo.addons.stock_account.tests.common import StockAccountTestCommon
 
-class TestFifoPrice(TestPurchase, StockAccountMinimalTest):
+class TestFifoPrice(TestPurchase, StockAccountTestCommon):
 
     def test_00_test_fifo(self):
         """ Test product cost price with fifo removal strategy."""
diff --git a/addons/purchase_stock/tests/test_fifo_returns.py b/addons/purchase_stock/tests/test_fifo_returns.py
index d20835111cb75db289ed0b8a2e4989626bcb734f..c90e18b35c5d66b6e4ad5a39f4defa71ec2e506f 100644
--- a/addons/purchase_stock/tests/test_fifo_returns.py
+++ b/addons/purchase_stock/tests/test_fifo_returns.py
@@ -4,10 +4,10 @@ import time
 
 from .common import TestPurchase
 from odoo.tests.common import Form
-from odoo.addons.stock_account.tests.stock_account_minimal_test import StockAccountMinimalTest
+from odoo.addons.stock_account.tests.common import StockAccountTestCommon
 
 
-class TestFifoReturns(TestPurchase, StockAccountMinimalTest):
+class TestFifoReturns(TestPurchase, StockAccountTestCommon):
 
     def test_fifo_returns(self):
         """Test to create product and purchase order to test the FIFO returns of the product"""
diff --git a/addons/purchase_stock/tests/test_purchase_order.py b/addons/purchase_stock/tests/test_purchase_order.py
index 9358da80959b905ed6180aba07e2b3d66d3c956c..09b0c934714eff38759812a85de523711cfbc1e7 100644
--- a/addons/purchase_stock/tests/test_purchase_order.py
+++ b/addons/purchase_stock/tests/test_purchase_order.py
@@ -4,12 +4,12 @@
 from datetime import datetime
 
 from odoo.tools import DEFAULT_SERVER_DATETIME_FORMAT
-from odoo.addons.account.tests.account_test_classes import AccountingTestCase
+from odoo.addons.account.tests.common import AccountTestCommon
 from odoo.tests import Form, tagged
 
 
 @tagged('post_install', '-at_install')
-class TestPurchaseOrder(AccountingTestCase):
+class TestPurchaseOrder(AccountTestCommon):
 
     def setUp(self):
         super(TestPurchaseOrder, self).setUp()
diff --git a/addons/purchase_stock/tests/test_stockvaluation.py b/addons/purchase_stock/tests/test_stockvaluation.py
index a8622746f931a7e3ff951caaa3613e19c54a37a4..61f21aed73d3e13a23de6c9b57149ba84f50eacc 100644
--- a/addons/purchase_stock/tests/test_stockvaluation.py
+++ b/addons/purchase_stock/tests/test_stockvaluation.py
@@ -8,7 +8,7 @@ from unittest.mock import patch
 from odoo import fields
 from odoo.tests import Form
 from odoo.tests.common import TransactionCase, tagged
-from odoo.addons.account.tests.account_test_classes import AccountingTestCase
+from odoo.addons.account.tests.common import AccountTestCommon
 from odoo.tools import DEFAULT_SERVER_DATETIME_FORMAT
 
 
@@ -290,7 +290,7 @@ class TestStockValuation(TransactionCase):
 
 
 @tagged('post_install', '-at_install')
-class TestStockValuationWithCOA(AccountingTestCase):
+class TestStockValuationWithCOA(AccountTestCommon):
     def setUp(self):
         super(TestStockValuationWithCOA, self).setUp()
         self.supplier_location = self.env.ref('stock.stock_location_suppliers')
diff --git a/addons/repair/tests/test_repair.py b/addons/repair/tests/test_repair.py
index a144de3797254a0d5bcec8c8a848b3d4814db7b4..7102828412010b4453d6a8f385a551fde4272699 100644
--- a/addons/repair/tests/test_repair.py
+++ b/addons/repair/tests/test_repair.py
@@ -3,12 +3,12 @@
 
 from datetime import datetime
 
-from odoo.addons.account.tests.account_test_classes import AccountingTestCase
+from odoo.addons.account.tests.common import AccountTestCommon
 from odoo.tests import tagged
 
 
 @tagged('post_install', '-at_install')
-class TestRepair(AccountingTestCase):
+class TestRepair(AccountTestCommon):
 
     @classmethod
     def setUpClass(cls):
diff --git a/addons/sale/tests/test_sale_common.py b/addons/sale/tests/test_sale_common.py
index 2973f3b74ebc52d3cb0e1f7a21cdcde302e28cbc..3d3520683c95b8e37f1b1c05c3039221343bf42d 100644
--- a/addons/sale/tests/test_sale_common.py
+++ b/addons/sale/tests/test_sale_common.py
@@ -2,11 +2,11 @@
 # Part of Odoo. See LICENSE file for full copyright and licensing details.
 
 from collections import OrderedDict
-from odoo.addons.account.tests.account_test_classes import AccountingTestCase
-from odoo.addons.account.tests.account_test_no_chart import TestAccountNoChartCommon
+from odoo.addons.account.tests.common import AccountTestCommon
+from odoo.addons.account.tests.common import AccountTestNoChartCommon
 
 
-class TestSale(AccountingTestCase):
+class TestSale(AccountTestCommon):
 
     @classmethod
     def setUpClass(cls):
@@ -89,11 +89,11 @@ class TestSale(AccountingTestCase):
         cls.partner = cls.env['res.partner'].create({'name': 'A test Partner'})
 
 
-class TestCommonSaleNoChart(TestAccountNoChartCommon):
+class TestCommonSaleNoChart(AccountTestNoChartCommon):
     """ This class should be extended for test suite of sale flows with a minimal chart of accounting
         installed. This test suite should be executed at module installation.
         This class provides some method to generate testing data well configured, according to the minimal
-        chart of account, defined in `TestAccountNoChartCommon` class.
+        chart of account, defined in `AccountTestNoChartCommon` class.
     """
 
     @classmethod
diff --git a/addons/sale/tests/test_sale_transaction.py b/addons/sale/tests/test_sale_transaction.py
index 3e33b2ea5bacf5d18b4f8732dfc40ea0344aa62b..400bffec5c816c3af00dac1fcc721d12ff3a6896 100644
--- a/addons/sale/tests/test_sale_transaction.py
+++ b/addons/sale/tests/test_sale_transaction.py
@@ -1,10 +1,10 @@
 # -*- coding: utf-8 -*-
 from odoo import tests
-from odoo.addons.account.tests.account_test_classes import AccountingTestCase
+from odoo.addons.account.tests.common import AccountTestCommon
 
 
 @tests.tagged('post_install', '-at_install')
-class TestSaleTransaction(AccountingTestCase):
+class TestSaleTransaction(AccountTestCommon):
     def test_sale_invoicing_from_transaction(self):
         ''' Test the following scenario:
         - Create a sale order
diff --git a/addons/sale_mrp/tests/test_sale_mrp_flow.py b/addons/sale_mrp/tests/test_sale_mrp_flow.py
index 18c7073dcf9ac210dc3ffff4531c502dafadde65..0cfcaf379de1296bd974bfe8177d176669a7d2a9 100644
--- a/addons/sale_mrp/tests/test_sale_mrp_flow.py
+++ b/addons/sale_mrp/tests/test_sale_mrp_flow.py
@@ -1,7 +1,7 @@
 # -*- coding: utf-8 -*-
 # Part of Odoo. See LICENSE file for full copyright and licensing details.
 
-from odoo.addons.account.tests.account_minimal_test import AccountMinimalTest
+from odoo.addons.account.tests.common import AccountTestCommon
 from odoo.tests import common, Form
 from odoo.exceptions import UserError
 from odoo.tools import mute_logger, float_compare
@@ -9,7 +9,7 @@ from odoo.tools import mute_logger, float_compare
 
 # these tests create accounting entries, and therefore need a chart of accounts
 @common.tagged('post_install', '-at_install')
-class TestSaleMrpFlow(AccountMinimalTest):
+class TestSaleMrpFlow(AccountTestCommon):
 
     @classmethod
     def setUpClass(cls):
diff --git a/addons/sale_stock/tests/test_anglo_saxon_valuation_reconciliation.py b/addons/sale_stock/tests/test_anglo_saxon_valuation_reconciliation.py
index 372cb0c72b146155fe1b558bca916a71ef8eadf3..038990def81897fed0cb8c001805c6e9506d90fa 100644
--- a/addons/sale_stock/tests/test_anglo_saxon_valuation_reconciliation.py
+++ b/addons/sale_stock/tests/test_anglo_saxon_valuation_reconciliation.py
@@ -3,12 +3,12 @@
 
 import time
 
-from odoo.addons.stock_account.tests.test_anglo_saxon_valuation_reconciliation_common import ValuationReconciliationTestCase
+from odoo.addons.stock_account.tests.test_anglo_saxon_valuation_reconciliation_common import ValuationReconciliationTestCommon
 from odoo.tests import Form, tagged
 
 
 @tagged('post_install', '-at_install')
-class TestValuationReconciliation(ValuationReconciliationTestCase):
+class TestValuationReconciliation(ValuationReconciliationTestCommon):
 
     def setUp(self):
         super(TestValuationReconciliation, self).setUp()
diff --git a/addons/snailmail_account/tests/test_pingen_send.py b/addons/snailmail_account/tests/test_pingen_send.py
index ea4cd973487b6388679ac709da82231eca185bb1..19d0738a89f755996aa39cbd96a03485e73f28d2 100644
--- a/addons/snailmail_account/tests/test_pingen_send.py
+++ b/addons/snailmail_account/tests/test_pingen_send.py
@@ -4,13 +4,13 @@ import json
 import base64
 import logging
 
-from odoo.addons.account.tests.account_test_classes import AccountingTestCase
+from odoo.addons.account.tests.common import AccountTestCommon
 from odoo.tests import tagged
 
 _logger = logging.getLogger(__name__)
 
 @tagged('post_install', '-at_install', '-standard', 'external')
-class TestPingenSend(AccountingTestCase):
+class TestPingenSend(AccountTestCommon):
 
     def setUp(self):
         super(TestPingenSend, self).setUp()
diff --git a/addons/stock_account/tests/stock_account_minimal_test.py b/addons/stock_account/tests/common.py
similarity index 83%
rename from addons/stock_account/tests/stock_account_minimal_test.py
rename to addons/stock_account/tests/common.py
index a93d6f14c1456908d0619cebc0e39b6fc9ac8b01..ae153a77cb1c5886c44c18aa1104ece939f8d352 100644
--- a/addons/stock_account/tests/stock_account_minimal_test.py
+++ b/addons/stock_account/tests/common.py
@@ -1,14 +1,14 @@
 # -*- coding: utf-8 -*-
 # Part of Odoo. See LICENSE file for full copyright and licensing details.
 
-from odoo.addons.account.tests.account_test_classes import AccountingTestCase
+from odoo.addons.account.tests.common import AccountTestCommon
 
 
-class StockAccountMinimalTest(AccountingTestCase):
+class StockAccountTestCommon(AccountTestCommon):
 
     @classmethod
     def setUpClass(cls):
-        super(StockAccountMinimalTest, cls).setUpClass()
+        super(StockAccountTestCommon, cls).setUpClass()
 
         # Properties: Stock valuation account and journal
         cls.env['ir.property'].create([{
diff --git a/addons/stock_account/tests/test_anglo_saxon_valuation_reconciliation_common.py b/addons/stock_account/tests/test_anglo_saxon_valuation_reconciliation_common.py
index 3fbe09aa9d60b845afda77e6ddefb6f436dfc228..87109bece0418f7f82b5eb283e2a4f32bb5c7238 100644
--- a/addons/stock_account/tests/test_anglo_saxon_valuation_reconciliation_common.py
+++ b/addons/stock_account/tests/test_anglo_saxon_valuation_reconciliation_common.py
@@ -2,10 +2,10 @@
 # Part of Odoo. See LICENSE file for full copyright and licensing details.
 
 
-from odoo.addons.stock_account.tests.stock_account_minimal_test import StockAccountMinimalTest
+from odoo.addons.stock_account.tests.common import StockAccountTestCommon
 from odoo import fields
 
-class ValuationReconciliationTestCase(StockAccountMinimalTest):
+class ValuationReconciliationTestCommon(StockAccountTestCommon):
     """ Base class for tests checking interim accounts reconciliation works
     in anglosaxon accounting. It sets up everything we need in the tests, and is
     extended in both sale_stock and purchase modules to run the 'true' tests.
@@ -60,7 +60,7 @@ class ValuationReconciliationTestCase(StockAccountMinimalTest):
         })
 
     def setUp(self):
-        super(ValuationReconciliationTestCase, self).setUp()
+        super(ValuationReconciliationTestCommon, self).setUp()
 
         self.company = self.env.company
         self.company.anglo_saxon_accounting = True
diff --git a/addons/stock_dropshipping/tests/test_lifo_price.py b/addons/stock_dropshipping/tests/test_lifo_price.py
index 5edf4059bb8c64d221eb3077d049ffe2f1ca3f8b..5dd28152a465146d1ce9ee7e06dcdfc76064122c 100644
--- a/addons/stock_dropshipping/tests/test_lifo_price.py
+++ b/addons/stock_dropshipping/tests/test_lifo_price.py
@@ -2,12 +2,12 @@
 # Part of Odoo. See LICENSE file for full copyright and licensing details.
 
 from odoo import fields, tools
-from odoo.addons.stock_account.tests.stock_account_minimal_test import StockAccountMinimalTest
+from odoo.addons.stock_account.tests.common import StockAccountTestCommon
 from odoo.modules.module import get_module_resource
 from odoo.tests import common, Form
 
 
-class TestLifoPrice(StockAccountMinimalTest):
+class TestLifoPrice(StockAccountTestCommon):
 
     def test_lifoprice(self):
 
diff --git a/addons/stock_dropshipping/tests/test_stockvaluation.py b/addons/stock_dropshipping/tests/test_stockvaluation.py
index d4805cca50b61beab6a9eb3b0bf179b7ebc053c3..59c834a89628cdbf0692fe3c996c316a48c74716 100644
--- a/addons/stock_dropshipping/tests/test_stockvaluation.py
+++ b/addons/stock_dropshipping/tests/test_stockvaluation.py
@@ -1,11 +1,11 @@
 # -*- coding: utf-8 -*-
 # Part of Odoo. See LICENSE file for full copyright and licensing details.
 
-from odoo.addons.stock_account.tests.stock_account_minimal_test import StockAccountMinimalTest
+from odoo.addons.stock_account.tests.common import StockAccountTestCommon
 from odoo.tests import Form, tagged
 
 @tagged('post_install', '-at_install')
-class TestStockValuation(StockAccountMinimalTest):
+class TestStockValuation(StockAccountTestCommon):
 
     @classmethod
     def setUpClass(cls):
diff --git a/addons/stock_landed_costs/tests/common.py b/addons/stock_landed_costs/tests/common.py
index 273d1a246fd40e3b6d0b3d7b011869fb7f1da720..52b540fe64c03f8e10eadba28fe8b89bed874249 100644
--- a/addons/stock_landed_costs/tests/common.py
+++ b/addons/stock_landed_costs/tests/common.py
@@ -1,11 +1,11 @@
 # -*- coding: utf-8 -*-
 
 from odoo import tools
-from odoo.addons.account.tests.account_test_classes import AccountingTestCase
+from odoo.addons.account.tests.common import AccountTestCommon
 from odoo.modules.module import get_module_resource
 
 
-class TestStockLandedCostsCommon(AccountingTestCase):
+class TestStockLandedCostsCommon(AccountTestCommon):
 
     def setUp(self):
         super(TestStockLandedCostsCommon, self).setUp()
diff --git a/addons/stock_landed_costs/tests/test_stock_landed_costs.py b/addons/stock_landed_costs/tests/test_stock_landed_costs.py
index fd366173e4b485702352d214de439a3877a0e328..708f0aaedbc657830529b234c7ede8c5b86cf3a3 100644
--- a/addons/stock_landed_costs/tests/test_stock_landed_costs.py
+++ b/addons/stock_landed_costs/tests/test_stock_landed_costs.py
@@ -2,13 +2,13 @@
 # Part of Odoo. See LICENSE file for full copyright and licensing details.
 
 from odoo.addons.stock_landed_costs.tests.common import TestStockLandedCostsCommon
-from odoo.addons.stock_account.tests.stock_account_minimal_test import StockAccountMinimalTest
+from odoo.addons.stock_account.tests.common import StockAccountTestCommon
 from odoo.exceptions import ValidationError
 from odoo.tests import tagged
 
 
 @tagged('post_install', '-at_install')
-class TestStockLandedCosts(TestStockLandedCostsCommon, StockAccountMinimalTest):
+class TestStockLandedCosts(TestStockLandedCostsCommon, StockAccountTestCommon):
 
     def test_stock_landed_costs(self):
         # In order to test the landed costs feature of stock,
diff --git a/addons/stock_landed_costs/tests/test_stock_landed_costs_rounding.py b/addons/stock_landed_costs/tests/test_stock_landed_costs_rounding.py
index 458a9791e68d6981264318aabd363f00aad12d49..9f4a6af49bc1e71eb36bc650d973b07ca9d4cb13 100644
--- a/addons/stock_landed_costs/tests/test_stock_landed_costs_rounding.py
+++ b/addons/stock_landed_costs/tests/test_stock_landed_costs_rounding.py
@@ -2,12 +2,12 @@
 # Part of Odoo. See LICENSE file for full copyright and licensing details.
 
 from odoo.addons.stock_landed_costs.tests.common import TestStockLandedCostsCommon
-from odoo.addons.stock_account.tests.stock_account_minimal_test import StockAccountMinimalTest
+from odoo.addons.stock_account.tests.common import StockAccountTestCommon
 from odoo.tests import tagged
 
 
 @tagged('post_install', '-at_install')
-class TestStockLandedCostsRounding(TestStockLandedCostsCommon, StockAccountMinimalTest):
+class TestStockLandedCostsRounding(TestStockLandedCostsCommon, StockAccountTestCommon):
 
     def test_stock_landed_costs_rounding(self):
         # In order to test the rounding in landed costs feature of stock, I create 2 landed cost
diff --git a/addons/stock_landed_costs/tests/test_stockvaluationlayer.py b/addons/stock_landed_costs/tests/test_stockvaluationlayer.py
index 66c075858d734602cdd122b12f8e93d79e5965c8..96d9763608b747cb11d27f27a183b34ce0d850de 100644
--- a/addons/stock_landed_costs/tests/test_stockvaluationlayer.py
+++ b/addons/stock_landed_costs/tests/test_stockvaluationlayer.py
@@ -6,10 +6,10 @@
 from odoo.tests import Form, tagged
 from odoo.addons.stock_account.tests.test_stockvaluationlayer import TestStockValuationCommon
 from odoo.addons.stock_account.tests.test_stockvaluation import _create_accounting_data
-from odoo.addons.stock_account.tests.stock_account_minimal_test import StockAccountMinimalTest
+from odoo.addons.stock_account.tests.common import StockAccountTestCommon
 
 
-class TestStockValuationLC(TestStockValuationCommon, StockAccountMinimalTest):
+class TestStockValuationLC(TestStockValuationCommon, StockAccountTestCommon):
     @classmethod
     def setUpClass(cls):
         super(TestStockValuationLC, cls).setUpClass()