diff --git a/__manifest__.py b/__manifest__.py
index cc6fe917deae052c890026fee7e849d6b571c24f..660bce89e31262ab04d0f5eeff2d3fe3b3daf8b2 100644
--- a/__manifest__.py
+++ b/__manifest__.py
@@ -42,6 +42,7 @@
         "wizard/export_journal_wizard_view.xml",
         "wizard/mandate_change_bordereau_wizard.xml",
         "wizard/scop_cotisation_cg_regul_wizard.xml",
+        "wizard/scop_bordereau_deadline_wizard.xml",
         "wizard/scop_bordereau_update_liasse_wizard.xml",
         "wizard/scop_bordereau_payment_mode_wizard.xml",
         "wizard/scop_bordereau_refund_wizard.xml",
diff --git a/report/scop_contribution_report.py b/report/scop_contribution_report.py
index 00ac36988b4e25402004cb2303509266ebb10dcd..89a69e48f704470111a9da2d89cdcf6f20c10d14 100644
--- a/report/scop_contribution_report.py
+++ b/report/scop_contribution_report.py
@@ -89,7 +89,9 @@ class ScopContributionReport(models.Model):
                 return base64.b64encode(bordereau_pdf)
             else:
                 raise UserError(
-                    _("Impossible de télécharger le bordereau associé à cette cotisation.")
+                    _(
+                        "Impossible de télécharger le bordereau associé à cette cotisation."
+                    )
                 )
         else:
             raise UserError(_("Pas de bordereau rattaché à cette cotisation."))
diff --git a/security/ir.model.access.csv b/security/ir.model.access.csv
index 3bb8d51ffc2096b266943238ae39c8b0885ead9c..4fc53d6cc353850813d728d5e3c08d4b7c6b4568 100644
--- a/security/ir.model.access.csv
+++ b/security/ir.model.access.csv
@@ -5,6 +5,8 @@ access_scop_cotisation_cg,access_scop_cotisation_cg,model_scop_cotisation_cg,cgs
 admin_access_scop_cotisation_cg,admin_access_scop_cotisation_cg,model_scop_cotisation_cg,cgscop_partner.group_cg_administrator,1,1,1,1
 access_scop_bordereau,access_scop_bordereau,model_scop_bordereau,cgscop_cotisation_cg.group_cotisation_cg_administrative,1,1,1,1
 admin_access_scop_bordereau,admin_access_scop_bordereau,model_scop_bordereau,cgscop_partner.group_cg_administrator,1,1,1,1
+access_scop_bordereau_deadline_wizard,access_scop_bordereau_deadline_wizard,model_scop_bordereau_deadline_wizard,cgscop_cotisation_cg.group_cotisation_cg_administrative,1,1,1,1
+access_scop_bordereau_deadline_invoice_wizard,access_scop_bordereau_deadline_invoice_wizard,model_scop_bordereau_deadline_invoice_wizard,cgscop_cotisation_cg.group_cotisation_cg_administrative,1,1,1,1
 access_scop_bordereau_version,access_scop_bordereau_version,model_scop_bordereau_version,cgscop_cotisation_cg.group_cotisation_cg_administrative,1,1,1,1
 admin_access_scop_bordereau_version,admin_access_scop_bordereau_version,model_scop_bordereau_version,cgscop_partner.group_cg_administrator,1,1,1,1
 access_scop_bordereau_refund_wizard_quarter,access_scop_bordereau_refund_wizard_quarter,model_scop_bordereau_refund_wizard_quarter,cgscop_cotisation_cg.group_cotisation_cg_administrative,1,1,1,1
diff --git a/views/scop_bordereau_cg.xml b/views/scop_bordereau_cg.xml
index 8538c4f2582d573fa71552cd9f897970a3d81f51..d8de854b29c3651033f2abe3a692a820efe8b7b8 100644
--- a/views/scop_bordereau_cg.xml
+++ b/views/scop_bordereau_cg.xml
@@ -71,6 +71,12 @@
                             type="action"
                             states="ongoing,validated,paid"
                         />
+                        <button
+                            name="%(cgscop_cotisation_cg.scop_bordereau_deadline_wizard_act_window)d"
+                            string="Modifier les échéances"
+                            type="action"
+                            states="new,validated"
+                        />
                     </header>
                     <sheet>
                         <div class="oe_button_box" name="button_box">
diff --git a/wizard/__init__.py b/wizard/__init__.py
index 3a73f47ed5008002ac4e2e962d6238174a96d06c..5abd851dbbac6f124566fe12009a9ae7bf0ab059 100644
--- a/wizard/__init__.py
+++ b/wizard/__init__.py
@@ -4,6 +4,7 @@
 from . import account_move_reversal
 from . import export_journal_wizard
 from . import mandate_change_bordereau_wizard
+from . import scop_bordereau_deadline_wizard
 from . import scop_bordereau_update_liasse_wizard
 from . import scop_bordereau_payment_mode_wizard
 from . import scop_bordereau_refund_wizard
diff --git a/wizard/scop_bordereau_deadline_wizard.py b/wizard/scop_bordereau_deadline_wizard.py
new file mode 100644
index 0000000000000000000000000000000000000000..e93747d3a0df6247ca1a751329586f36a1ce24db
--- /dev/null
+++ b/wizard/scop_bordereau_deadline_wizard.py
@@ -0,0 +1,106 @@
+# Copyright 2021 Le Filament
+# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
+
+from odoo import fields, models
+
+
+class ScopBordereauDeadlineWizard(models.TransientModel):
+    _name = "scop.bordereau.deadline.wizard"
+    _description = "Modification des dates d'échéance"
+
+    # ------------------------------------------------------
+    # Default functions
+    # ------------------------------------------------------
+    def _default_bordereau_id(self):
+        bordereau_id = self.env["scop.bordereau"].browse(
+            self.env.context.get("active_id")
+        )
+        return bordereau_id.id
+
+    def _default_invoice_ids(self):
+        bordereau_id = self.env["scop.bordereau"].browse(
+            self.env.context.get("active_id")
+        )
+        invoice_ids = bordereau_id.invoice_ids.filtered(
+            lambda i: i.payment_state in ["not_paid", "partial"]
+        )
+        default_invoices = invoice_ids.mapped(lambda i: (0, 0, {"invoice_id": i.id}))
+        return default_invoices
+
+    # ------------------------------------------------------
+    # Fields declaration
+    # ------------------------------------------------------
+    bordereau_id = fields.Many2one(
+        comodel_name="scop.bordereau",
+        string="Bordereau",
+        readonly=True,
+        default=_default_bordereau_id,
+    )
+    partner_id = fields.Many2one(
+        comodel_name="res.partner",
+        string="Adhérent",
+        related="bordereau_id.partner_id",
+    )
+    invoice_ids = fields.One2many(
+        comodel_name="scop.bordereau.deadline.invoice.wizard",
+        inverse_name="wizard_id",
+        string="Appels de cotisation",
+        default=_default_invoice_ids,
+    )
+
+    # ------------------------------------------------------
+    # Constrains
+    # ------------------------------------------------------
+
+    # ------------------------------------------------------
+    # Override ORM
+    # ------------------------------------------------------
+
+    # ------------------------------------------------------
+    # Action
+    # ------------------------------------------------------
+    def change_deadline(self):
+        self.ensure_one()
+        self.invoice_ids.change_deadline()
+        return {"type": "ir.actions.act_window_close"}
+
+
+class ScopBordereauDeadlineInvoiceWizard(models.TransientModel):
+    _name = "scop.bordereau.deadline.invoice.wizard"
+    _description = "Appels de cotisation"
+
+    wizard_id = fields.Many2one(
+        comodel_name="scop.bordereau.deadline.wizard",
+        string="Wizard",
+        required=True,
+        ondelete="cascade",
+    )
+    invoice_id = fields.Many2one(
+        comodel_name="account.move",
+        string="Appel de cotisation",
+        required=True,
+        readonly=True,
+        ondelete="cascade",
+    )
+    old_deadline = fields.Date("Date d'échéance", related="invoice_id.invoice_date_due")
+    quarter = fields.Selection(related="invoice_id.cotiz_quarter")
+    type_contribution_id = fields.Many2one(
+        comodel_name="scop.contribution.type",
+        string="Type de cotisation",
+        related="invoice_id.type_contribution_id",
+    )
+    new_deadline = fields.Date(
+        "Nouvelle date d'échéance",
+    )
+
+    # ------------------------------------------------------
+    # Action
+    # ------------------------------------------------------
+    def change_deadline(self):
+        for line in self:
+            if line.new_deadline:
+                line.invoice_id.invoice_date_due = line.new_deadline
+                aml_ids = line.invoice_id.line_ids.filtered(
+                    lambda l: l.date_maturity == line.old_deadline
+                )
+                aml_ids.update({"date_maturity": line.new_deadline})
diff --git a/wizard/scop_bordereau_deadline_wizard.xml b/wizard/scop_bordereau_deadline_wizard.xml
new file mode 100644
index 0000000000000000000000000000000000000000..eecc1a2d631d11c772e98c86c0fc314eea7c2d47
--- /dev/null
+++ b/wizard/scop_bordereau_deadline_wizard.xml
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<odoo>
+    <!--  Copyright 2021 Le Filament
+          License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).  -->
+    <data>
+
+        <record id="scop_bordereau_deadline_wizard_form_view" model="ir.ui.view">
+            <field name="name">scop.bordereau.deadline.wizard.form</field>
+            <field name="model">scop.bordereau.deadline.wizard</field>
+            <field name="arch" type="xml">
+                <form string="Modification des echeances">
+                    <sheet>
+                        <group>
+                            <field name="bordereau_id" />
+                            <field name="partner_id" />
+                        </group>
+                        <separator string="Appels de cotisation" />
+                        <field name="invoice_ids">
+                            <tree create="0" delete="0" editable="top">
+                                <field name="invoice_id" readonly="1" force_save="1" />
+                                <field name="type_contribution_id" />
+                                <field name="quarter" />
+                                <field name="old_deadline" />
+                                <field name="new_deadline" />
+                            </tree>
+                        </field>
+                    </sheet>
+                    <footer>
+                        <button
+                            name="change_deadline"
+                            type="object"
+                            string="Modifier les dates d'échéance"
+                            class="oe_highlight"
+                        />
+                        <button string="Annuler" special="cancel" class="oe_link" />
+                    </footer>
+                </form>
+            </field>
+        </record>
+
+        <record
+            id="scop_bordereau_deadline_wizard_act_window"
+            model="ir.actions.act_window"
+        >
+            <field name="name">Modifier les dates d'échéance</field>
+            <field name="type">ir.actions.act_window</field>
+            <field name="res_model">scop.bordereau.deadline.wizard</field>
+            <field name="view_mode">form</field>
+            <field name="target">new</field>
+        </record>
+
+    </data>
+</odoo>
diff --git a/wizard/scop_bordereau_payment_mode_wizard.py b/wizard/scop_bordereau_payment_mode_wizard.py
index 17d74902fcd6bd497978325b1c95372caa82c72d..24553be47ffb7f2468a4c7bdcb916f4779cae2b5 100644
--- a/wizard/scop_bordereau_payment_mode_wizard.py
+++ b/wizard/scop_bordereau_payment_mode_wizard.py
@@ -44,22 +44,28 @@ class ScopBordereauChangePaymentMode(models.TransientModel):
                 }
             )
             # Recherche les bordereaux non payés
-            bordereau_ids = self.env["scop.bordereau"].search([
-                ("partner_id", "=", bordereau_id.partner_id.id),
-                ("state", "not in", ["paid", "cancel"]),
-            ])
+            bordereau_ids = self.env["scop.bordereau"].search(
+                [
+                    ("partner_id", "=", bordereau_id.partner_id.id),
+                    ("state", "not in", ["paid", "cancel"]),
+                ]
+            )
             # Recherche les factures liées aux bordereaux non payées
             invoice_ids = bordereau_ids.mapped("invoice_ids").filtered(
-                lambda i: i.payment_state not in ["paid", "reversed"])
+                lambda i: i.payment_state not in ["paid", "reversed"]
+            )
         else:
             bordereau_ids = bordereau_id
             invoice_ids = bordereau_id.invoice_ids.filtered(
-                lambda i: i.payment_state not in ["paid", "reversed"])
+                lambda i: i.payment_state not in ["paid", "reversed"]
+            )
             if not invoice_ids:
-                raise UserError(_(
-                    "Tous les appels liés à ce bordereau sont payés, il n'est pas possible "
-                    "de modifier le mode de paiement"
-                ))
+                raise UserError(
+                    _(
+                        "Tous les appels liés à ce bordereau sont payés, il n'est pas possible "
+                        "de modifier le mode de paiement"
+                    )
+                )
 
         # Met à jour le mode de paiement sur les bordereaux
         bordereau_ids.update({"payment_mode_id": self.payment_mode_id.id})
diff --git a/wizard/scop_bordereau_refund_wizard.py b/wizard/scop_bordereau_refund_wizard.py
index 47b935f8892f12f79d498a988150805c00b93c31..5945af5d6c3e9915eb6db9abe9d603e208b5999e 100644
--- a/wizard/scop_bordereau_refund_wizard.py
+++ b/wizard/scop_bordereau_refund_wizard.py
@@ -77,7 +77,7 @@ class ScopBordereauRefundWizard(models.TransientModel):
             ["type_contribution_id", "amount_total_signed"],
             ["type_contribution_id"],
         )
-        
+
         ur_hdf = self.env.ref("cgscop_partner.riga_14232").id
         if bordereau_id.partner_id.ur_id.id == ur_hdf:
             product_ur = self.env.company.contribution_hdf_id