diff --git a/addons/account/models/account_reconcile_model.py b/addons/account/models/account_reconcile_model.py
index ce60fab0f87ed783247afd7907354496e7afb798..6ac0ad9986c9c9a1f2904acb1648046805e6cc68 100644
--- a/addons/account/models/account_reconcile_model.py
+++ b/addons/account/models/account_reconcile_model.py
@@ -4,6 +4,8 @@ from odoo import api, fields, models, _
 from odoo.tools import float_compare, float_is_zero
 from odoo.exceptions import UserError
 
+import re
+
 
 class AccountReconcileModel(models.Model):
     _name = 'account.reconcile.model'
@@ -92,12 +94,15 @@ class AccountReconcileModel(models.Model):
     label = fields.Char(string='Journal Item Label')
     amount_type = fields.Selection([
         ('fixed', 'Fixed'),
-        ('percentage', 'Percentage of balance')
+        ('percentage', 'Percentage of balance'),
+        ('regex', 'From label'),
         ], required=True, default='percentage')
     show_force_tax_included = fields.Boolean(store=False, help='Technical field used to show the force tax included button')
     force_tax_included = fields.Boolean(string='Tax Included in Price',
         help='Force the tax to be managed as a price included tax.')
     amount = fields.Float(string='Write-off Amount', digits=0, required=True, default=100.0, help="Fixed amount will count as a debit if it is negative, as a credit if it is positive.")
+    amount_from_label_regex = fields.Char(string="Amount from Label (regex)", default=r"([\d\.,]+)", help="There is no need for regex delimiter, only the regex is needed. For instance if you want to extract the amount from\nR:9672938 10/07 AX 9415126318 T:5L:NA BRT: 3358,07 C:\nYou could enter\nBRT: ([\d,]+)")
+    decimal_separator = fields.Char(default=lambda self: self.env['res.lang']._lang_get(self.env.user.lang).decimal_point, help="Every character that is nor a digit nor this separator will be removed from the matching string")
     tax_ids = fields.Many2many('account.tax', string='Taxes', ondelete='restrict')
     analytic_account_id = fields.Many2one('account.analytic.account', string='Analytic Account', ondelete='set null')
     analytic_tag_ids = fields.Many2many('account.analytic.tag', string='Analytic Tags',
@@ -110,12 +115,14 @@ class AccountReconcileModel(models.Model):
     second_label = fields.Char(string='Second Journal Item Label')
     second_amount_type = fields.Selection([
         ('fixed', 'Fixed'),
-        ('percentage', 'Percentage of amount')
+        ('percentage', 'Percentage of balance'),
+        ('regex', 'From label'),
         ], string="Second Amount type",required=True, default='percentage')
     show_second_force_tax_included = fields.Boolean(store=False, help='Technical field used to show the force tax included button')
     force_second_tax_included = fields.Boolean(string='Second Tax Included in Price',
         help='Force the second tax to be managed as a price included tax.')
     second_amount = fields.Float(string='Second Write-off Amount', digits=0, required=True, default=100.0, help="Fixed amount will count as a debit if it is negative, as a credit if it is positive.")
+    second_amount_from_label_regex = fields.Char(string="Second Amount from Label (regex)", default=r"([\d\.,]+)")
     second_tax_ids = fields.Many2many('account.tax', relation='account_reconcile_model_account_tax_bis_rel', string='Second Taxes', ondelete='restrict')
     second_analytic_account_id = fields.Many2one('account.analytic.account', string='Second Analytic Account', ondelete='set null')
     second_analytic_tag_ids = fields.Many2many('account.analytic.tag', string='Second Analytic Tags',
@@ -231,6 +238,12 @@ class AccountReconcileModel(models.Model):
 
         if self.amount_type == 'percentage':
             line_balance = balance * (self.amount / 100.0)
+        elif self.amount_type == "regex":
+            match = re.search(self.amount_from_label_regex, st_line.name)
+            if match:
+                line_balance = float(re.sub(r'\D' + self.decimal_separator, '', match.group(1)).replace(self.decimal_separator, '.')) * (1 if balance > 0.0 else -1)
+            else:
+                line_balance = 0
         else:
             line_balance = self.amount * (1 if balance > 0.0 else -1)
 
@@ -258,7 +271,18 @@ class AccountReconcileModel(models.Model):
 
         # Second write-off line.
         if self.has_second_line and self.second_account_id:
-            line_balance = balance - sum(aml['debit'] - aml['credit'] for aml in new_aml_dicts)
+            remaining_balance = balance - sum(aml['debit'] - aml['credit'] for aml in new_aml_dicts)
+            if self.second_amount_type == 'percentage':
+                line_balance = remaining_balance * (self.second_amount / 100.0)
+            elif self.second_amount_type == "regex":
+                match = re.search(self.second_amount_from_label_regex, st_line.name)
+                if match:
+                    line_balance = float(re.sub(r'\D' + self.decimal_separator, '', match.group(1)).replace(self.decimal_separator, '.'))
+                else:
+                    line_balance = 0
+            else:
+                line_balance = self.second_amount * (1 if remaining_balance > 0.0 else -1)
+
             second_writeoff_line = {
                 'name': self.second_label or st_line.name,
                 'account_id': self.second_account_id.id,
diff --git a/addons/account/models/chart_template.py b/addons/account/models/chart_template.py
index 055be7edf3bb1698ae9c289cb5e0f40e59c96ecc..86a3ca5822e2a9f1d09130e9432d5c6f8a2b5a5b 100644
--- a/addons/account/models/chart_template.py
+++ b/addons/account/models/chart_template.py
@@ -1154,9 +1154,12 @@ class AccountReconcileModelTemplate(models.Model):
     label = fields.Char(string='Journal Item Label')
     amount_type = fields.Selection([
         ('fixed', 'Fixed'),
-        ('percentage', 'Percentage of balance')
+        ('percentage', 'Percentage of balance'),
+        ('regex', 'From label'),
         ], required=True, default='percentage')
     amount = fields.Float(string='Write-off Amount', digits=0, required=True, default=100.0, help="Fixed amount will count as a debit if it is negative, as a credit if it is positive.")
+    amount_from_label_regex = fields.Char(string="Amount from Label (regex)", default=r"([\d\.,]+)")
+    decimal_separator = fields.Char(help="Every character that is nor a digit nor this separator will be removed from the matching string")
     force_tax_included = fields.Boolean(string='Tax Included in Price',
         help='Force the tax to be managed as a price included tax.')
     # Second part fields.
@@ -1166,9 +1169,11 @@ class AccountReconcileModelTemplate(models.Model):
     second_label = fields.Char(string='Second Journal Item Label')
     second_amount_type = fields.Selection([
         ('fixed', 'Fixed'),
-        ('percentage', 'Percentage of amount')
+        ('percentage', 'Percentage of amount'),
+        ('regex', 'From label'),
         ], string="Second Amount type",required=True, default='percentage')
     second_amount = fields.Float(string='Second Write-off Amount', digits=0, required=True, default=100.0, help="Fixed amount will count as a debit if it is negative, as a credit if it is positive.")
+    second_amount_from_label_regex = fields.Char(string="Second Amount from Label (regex)", default=r"([\d\.,]+)")
     force_second_tax_included = fields.Boolean(string='Second Tax Included in Price',
         help='Force the second tax to be managed as a price included tax.')
     number_entries = fields.Integer(string='Number of entries related to this model', compute='_compute_number_entries')
diff --git a/addons/account/static/src/js/reconciliation/reconciliation_model.js b/addons/account/static/src/js/reconciliation/reconciliation_model.js
index 0387c0cf13fab6568c2edb7e72d25db64bf01c92..f202533c567f9ff456b0d007ad76c9deb80318ff 100644
--- a/addons/account/static/src/js/reconciliation/reconciliation_model.js
+++ b/addons/account/static/src/js/reconciliation/reconciliation_model.js
@@ -550,7 +550,7 @@ var StatementModel = BasicModel.extend({
         var self = this;
         var line = this.getLine(handle);
         var reconcileModel = _.find(this.reconcileModels, function (r) {return r.id === reconcileModelId;});
-        var fields = ['account_id', 'amount', 'amount_type', 'analytic_account_id', 'journal_id', 'label', 'force_tax_included', 'tax_ids', 'analytic_tag_ids', 'to_check'];
+        var fields = ['account_id', 'amount', 'amount_type', 'analytic_account_id', 'journal_id', 'label', 'force_tax_included', 'tax_ids', 'analytic_tag_ids', 'to_check', 'amount_from_label_regex', 'decimal_separator'];
         this._blurProposition(handle);
         var focus = this._formatQuickCreate(line, _.pick(reconcileModel, fields));
         focus.reconcileModelId = reconcileModelId;
@@ -1234,7 +1234,28 @@ var StatementModel = BasicModel.extend({
         var formatOptions = {
             currency_id: line.st_line.currency_id,
         };
-        var amount = values.amount !== undefined ? values.amount : line.balance.amount;
+        var amount;
+        switch(values.amount_type) {
+            case 'percentage':
+                amount = line.balance.amount * values.amount / 100;
+                break;
+            case 'regex':
+                var matching = line.st_line.name.match(new RegExp(values.amount_from_label_regex))
+                amount = null;
+                if (matching && matching.length == 2) {
+                    matching = matching[1].replace(new RegExp('\\D' + values.decimal_separator, 'g'), '');
+                    matching = matching.replace(values.decimal_separator, '.');
+                    amount = parseFloat(matching);
+                }
+                break;
+            case 'fixed':
+                amount = values.amount;
+                break;
+            default:
+                amount = values.amount !== undefined ? values.amount : line.balance.amount;
+        }
+
+
         var prop = {
             'id': _.uniqueId('createLine'),
             'label': values.label || line.st_line.name,
@@ -1248,8 +1269,7 @@ var StatementModel = BasicModel.extend({
             'credit': 0,
             'date': values.date ? values.date : field_utils.parse.date(today, {}, {isUTC: true}),
             'force_tax_included': values.force_tax_included || false,
-            'base_amount': values.amount_type !== "percentage" ?
-                (amount) : line.balance.amount * values.amount / 100,
+            'base_amount': amount,
             'percent': values.amount_type === "percentage" ? values.amount : null,
             'link': values.link,
             'display': true,
diff --git a/addons/account/static/tests/tours/reconciliation.js b/addons/account/static/tests/tours/reconciliation.js
index c7a1e054fe7706ca8c3573592c80ca9e5d5c7883..f9a764444aed65f0b8b5555529bf6a8fc7bbe7ad 100644
--- a/addons/account/static/tests/tours/reconciliation.js
+++ b/addons/account/static/tests/tours/reconciliation.js
@@ -21,31 +21,31 @@ Tour.register('bank_statement_reconciliation', {
         // Make a partial reconciliation
 
         {
-            content: "open the last line in match_rp mode to test the partial reconciliation",
+            content: "open the 4th line in match_rp mode to test the partial reconciliation",
             extra_trigger: '.o_reconciliation_line:first[data-mode="match_rp"]',
-            trigger: '.o_reconciliation_line:last .cell_label:contains("First")'
+            trigger: '.o_reconciliation_line:nth-child(4) .cell_label:contains("First")'
         },
         {
             content: "click on partial reconcile",
-            trigger: '.o_reconciliation_line:last .accounting_view .edit_amount',
+            trigger: '.o_reconciliation_line:nth-child(4) .accounting_view .edit_amount',
         },
         {
             content: "Edit amount",
-            trigger: '.o_reconciliation_line:last .accounting_view .edit_amount_input:not(.d-none)',
+            trigger: '.o_reconciliation_line:nth-child(4) .accounting_view .edit_amount_input:not(.d-none)',
             run: 'text 2000'
         },
         {
             content: "Press enter to validate amount",
-            trigger: '.o_reconciliation_line:last .accounting_view .edit_amount_input:not(.d-none)',
+            trigger: '.o_reconciliation_line:nth-child(4) .accounting_view .edit_amount_input:not(.d-none)',
             run: 'keydown 13'
         },
         {
             content: "Check that amount has changed",
-            trigger: '.o_reconciliation_line:last .accounting_view .line_amount:contains("2,000.00")'
+            trigger: '.o_reconciliation_line:nth-child(4) .accounting_view .line_amount:contains("2,000.00")'
         },
         {
             content: "reconcile the line",
-            trigger: '.o_reconciliation_line:last .o_reconcile:visible',
+            trigger: '.o_reconciliation_line:nth-child(4) .o_reconcile:visible',
         },
 
         // Reconciliation of 'Prepayment'
@@ -99,7 +99,7 @@ Tour.register('bank_statement_reconciliation', {
         // Be done
         {
             content: "check the number off validate lines",
-            trigger: '.o_control_panel .progress-reconciliation:contains(3 / 5)'
+            trigger: '.o_control_panel .progress-reconciliation:contains(3 / 6)'
         },
     ]
 );
diff --git a/addons/account/tests/test_reconciliation_matching_rules.py b/addons/account/tests/test_reconciliation_matching_rules.py
index 6c860e42ea70179076fafb7f8d3027fd9029fd82..bcae241be678423f8d5d9c61bc9bd6fc87d2035d 100644
--- a/addons/account/tests/test_reconciliation_matching_rules.py
+++ b/addons/account/tests/test_reconciliation_matching_rules.py
@@ -47,7 +47,7 @@ class TestReconciliationMatchingRules(AccountingTestCase):
         current_assets_account = self.env['account.account'].search(
             [('user_type_id', '=', self.env.ref('account.data_account_type_current_assets').id)], limit=1)
 
-        self.rule_0 = self.env['account.reconcile.model'].search([('company_id', '=', self.env.company.id)])
+        self.rule_0 = self.env['account.reconcile.model'].search([('company_id', '=', self.env.company.id), ('rule_type', '=', 'invoice_matching')])
         self.rule_1 = self.rule_0.copy()
         self.rule_1.account_id = current_assets_account
         self.rule_1.match_partner = True
diff --git a/addons/account/views/account_view.xml b/addons/account/views/account_view.xml
index 14adbd55c43680cae4beda12fe02b0a0aeb7d851..c5f7657c623a3524c19de893aa1283fe53dd3c79 100644
--- a/addons/account/views/account_view.xml
+++ b/addons/account/views/account_view.xml
@@ -951,11 +951,13 @@ action = model.setting_init_bank_account_action()
                             </group>
                             <group>
                                 <field name="label"/>
-                                <label for="amount"/>
-                                <div>
+                                <label for="amount" attrs="{'invisible': [('amount_type','=','regex')]}"/>
+                                <div attrs="{'invisible': [('amount_type','=','regex')]}">
                                     <field name="amount" class="oe_inline"/>
                                     <span class="o_form_label oe_inline" attrs="{'invisible':[('amount_type','!=','percentage')]}">%</span>
                                 </div>
+                                <field name="amount_from_label_regex" attrs="{'invisible': [('amount_type','!=','regex')]}"/>
+                                <field name="decimal_separator" attrs="{'invisible': [('amount_type','!=','regex')]}"/>
                                 <field name="journal_id" domain="[('type', '!=', 'general'), ('company_id', '=', company_id)]" widget="selection"
                                        attrs="{'invisible': [('rule_type', '!=', 'writeoff_button')]}"/>
                             </group>
@@ -983,11 +985,12 @@ action = model.setting_init_bank_account_action()
                             </group>
                             <group>
                                 <field name="second_label" string="Journal Item Label"/>
-                                <label for="second_amount" string="Amount"/>
-                                <div>
+                                <label for="second_amount" string="Amount" attrs="{'invisible': [('second_amount_type', '=', 'regex')]}"/>
+                                <div attrs="{'invisible': [('second_amount_type', '=', 'regex')]}">
                                     <field name="second_amount" class="oe_inline"/>
-                                    <span class="o_form_label oe_inline" attrs="{'invisible':[('amount_type','!=','percentage')]}">%</span>
+                                    <span class="o_form_label oe_inline" attrs="{'invisible':[('second_amount_type','!=','percentage')]}">%</span>
                                 </div>
+                                <field name="second_amount_from_label_regex" attrs="{'invisible': [('second_amount_type','!=','regex')]}"/>
                                 <field name="second_journal_id" string="Journal" domain="[('type', '!=', 'general'), ('company_id', '=', company_id)]" widget="selection"
                                        attrs="{'invisible': [('rule_type', '!=', 'writeoff_button')]}"/>
                             </group>
diff --git a/addons/l10n_generic_coa/__manifest__.py b/addons/l10n_generic_coa/__manifest__.py
index aea7f2e13024e1c5610fbbcd69967e703d9a064c..a2f8237d375a3fe80aa330d12045522bfe491a4c 100644
--- a/addons/l10n_generic_coa/__manifest__.py
+++ b/addons/l10n_generic_coa/__manifest__.py
@@ -23,8 +23,9 @@ Install some generic chart of accounts.
         'data/account_chart_template_data.xml',
     ],
     'demo': [
-        'data/account_bank_statement_demo.xml',
-        'data/account_invoice_demo.xml',
+        'demo/account_bank_statement_demo.xml',
+        'demo/account_invoice_demo.xml',
+        'demo/account_reconcile_model.xml',
     ],
     'uninstall_hook': 'uninstall_hook',
 }
diff --git a/addons/l10n_generic_coa/data/account_bank_statement_demo.xml b/addons/l10n_generic_coa/demo/account_bank_statement_demo.xml
similarity index 87%
rename from addons/l10n_generic_coa/data/account_bank_statement_demo.xml
rename to addons/l10n_generic_coa/demo/account_bank_statement_demo.xml
index 7a6b85df6fa3ab5e1e0e322b5443df9939ede793..abd4efc2d00f186d97fe66262217a5d6ca7d6fa8 100644
--- a/addons/l10n_generic_coa/data/account_bank_statement_demo.xml
+++ b/addons/l10n_generic_coa/demo/account_bank_statement_demo.xml
@@ -91,6 +91,19 @@
             <field name="partner_id" ref="base.res_partner_2"/>
         </record>
 
+        <record id="demo_bank_statement_line_7" model="account.bank.statement.line">
+            <field name="ref"></field>
+            <field name="statement_id" ref="l10n_generic_coa.demo_bank_statement_1"/>
+            <field name="sequence">7</field>
+            <field name="name">R:9772938  10/07 AX 9415116318 T:5 BRT: 100,00€ C/ croip</field>
+            <field name="journal_id" model="account.journal" search="[
+                ('type', '=', 'bank'),
+                ('company_id', '=', obj().env.company.id)]"/>
+            <field name="amount">96.67</field>
+            <field name="date" eval="time.strftime('%Y')+'-01-01'"/>
+            <field name="partner_id" ref="base.res_partner_2"/>
+        </record>
+
         <function model="account.bank.statement.line" name="fast_counterpart_creation">
             <value eval="[ref('demo_bank_statement_line_5')]"/>
         </function>
diff --git a/addons/l10n_generic_coa/data/account_invoice_demo.xml b/addons/l10n_generic_coa/demo/account_invoice_demo.xml
similarity index 100%
rename from addons/l10n_generic_coa/data/account_invoice_demo.xml
rename to addons/l10n_generic_coa/demo/account_invoice_demo.xml
diff --git a/addons/l10n_generic_coa/demo/account_reconcile_model.xml b/addons/l10n_generic_coa/demo/account_reconcile_model.xml
new file mode 100644
index 0000000000000000000000000000000000000000..3be9c3a1bdea0fec1a0b0b67ac5b638eb8f2a2a5
--- /dev/null
+++ b/addons/l10n_generic_coa/demo/account_reconcile_model.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<odoo>
+    <data noupdate="0">
+        <record id="reconcile_from_label" model="account.reconcile.model">
+            <field name="name">Line with Bank Fees</field>
+            <field name="rule_type">writeoff_suggestion</field>
+            <field name="match_label">contains</field>
+            <field name="match_label_param">BRT</field>
+            <field name="label">Due amount</field>
+            <field name="account_id" model="account.account"
+                search="[('user_type_id', '=', ref('account.data_account_type_revenue')),
+                         ('company_id', '=', obj().env.company.id)]"/>
+            <field name="amount_type">regex</field>
+            <field name="amount_from_label_regex">BRT: ([\d,]+)</field>
+            <field name="decimal_separator">,</field>
+            <field name="has_second_line" eval="True"/>
+            <field name="second_label">Bank Fees</field>
+            <field name="second_account_id" model="account.account"
+                search="[('user_type_id', '=', ref('account.data_account_type_direct_costs')),
+                         ('company_id', '=', obj().env.company.id)]"/>
+            <field name="second_amount_type">percentage</field>
+            <field name="second_amount">100</field>
+        </record>
+    </data>
+</odoo>