diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index 168470e2ed745631aefb772a4a864cf1de76d3cb..c575299fc05d609e25260193f2b663be50d0fd31 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -16,7 +16,7 @@ exclude: |
   (LICENSE.*|COPYING.*)
 default_language_version:
   python: python3
-  node: "14.18.0"
+  node: "16.17.0"
 repos:
   - repo: local
     hooks:
@@ -27,15 +27,20 @@ repos:
         entry: found forbidden files; remove them
         language: fail
         files: "\\.rej$"
+      - id: en-po-files
+        name: en.po files cannot exist
+        entry: found a en.po file
+        language: fail
+        files: '[a-zA-Z0-9_]*/i18n/en\.po$'
   - repo: https://github.com/oca/maintainer-tools
-    rev: dfba427ba03900b69e0a7f2c65890dc48921d36a
+    rev: 4cd2b852214dead80822e93e6749b16f2785b2fe
     hooks:
       # update the NOT INSTALLABLE ADDONS section above
       - id: oca-update-pre-commit-excluded-addons
       - id: oca-fix-manifest-website
         args: ["https://le-filament.com"]
   - repo: https://github.com/myint/autoflake
-    rev: v1.4
+    rev: v1.6.1
     hooks:
       - id: autoflake
         args:
@@ -46,22 +51,22 @@ repos:
           - --remove-duplicate-keys
           - --remove-unused-variables
   - repo: https://github.com/psf/black
-    rev: 22.3.0
+    rev: 22.8.0
     hooks:
       - id: black
   - repo: https://github.com/pre-commit/mirrors-prettier
-    rev: v2.4.1
+    rev: v2.7.1
     hooks:
       - id: prettier
         name: prettier (with plugin-xml)
         additional_dependencies:
-          - "prettier@2.4.1"
-          - "@prettier/plugin-xml@1.1.0"
+          - "prettier@2.7.1"
+          - "@prettier/plugin-xml@2.2.0"
         args:
           - --plugin=@prettier/plugin-xml
         files: \.(css|htm|html|js|json|jsx|less|md|scss|toml|ts|xml|yaml|yml)$
   - repo: https://github.com/pre-commit/mirrors-eslint
-    rev: v7.32.0
+    rev: v8.24.0
     hooks:
       - id: eslint
         verbose: true
@@ -69,7 +74,7 @@ repos:
           - --color
           - --fix
   - repo: https://github.com/pre-commit/pre-commit-hooks
-    rev: v4.0.1
+    rev: v4.3.0
     hooks:
       - id: trailing-whitespace
         # exclude autogenerated files
@@ -91,12 +96,12 @@ repos:
       - id: mixed-line-ending
         args: ["--fix=lf"]
   - repo: https://github.com/asottile/pyupgrade
-    rev: v2.29.0
+    rev: v2.38.2
     hooks:
       - id: pyupgrade
         args: ["--keep-percent-format"]
   - repo: https://github.com/PyCQA/isort
-    rev: 5.9.3
+    rev: 5.10.1
     hooks:
       - id: isort
         name: isort except __init__.py
diff --git a/.pylintrc b/.pylintrc
index d431ca78d44080ba32c20c6991c2655f2ab6423b..71c476d4f10ac08a7333729b93705c9573d240d5 100644
--- a/.pylintrc
+++ b/.pylintrc
@@ -1,3 +1,5 @@
+
+
 [MASTER]
 load-plugins=pylint_odoo
 score=n
@@ -8,7 +10,7 @@ manifest_required_authors=Le Filament
 manifest_required_keys=license
 manifest_deprecated_keys=description,active
 license_allowed=AGPL-3,GPL-2,GPL-2 or any later version,GPL-3,GPL-3 or any later version,LGPL-3
-valid_odoo_versions=15.0
+valid_odoo_versions=16.0
 
 [MESSAGES CONTROL]
 disable=all
@@ -96,6 +98,7 @@ enable=anomalous-backslash-in-string,
     xml-attribute-translatable,
     xml-deprecated-qweb-directive,
     xml-deprecated-tree-attribute,
+    external-request-timeout,
     # messages that do not cause the lint step to fail
     consider-merging-classes-inherited,
     create-user-wo-reset-password,
diff --git a/.pylintrc-mandatory b/.pylintrc-mandatory
index 189c548631665bef116fc4d0df3b986f9727df31..ed2c2171ffe63ac191e30ed0759c4b6211ad5f15 100644
--- a/.pylintrc-mandatory
+++ b/.pylintrc-mandatory
@@ -1,3 +1,4 @@
+
 [MASTER]
 load-plugins=pylint_odoo
 score=n
@@ -8,7 +9,7 @@ manifest_required_authors=Le Filament
 manifest_required_keys=license
 manifest_deprecated_keys=description,active
 license_allowed=AGPL-3,GPL-2,GPL-2 or any later version,GPL-3,GPL-3 or any later version,LGPL-3
-valid_odoo_versions=15.0
+valid_odoo_versions=16.0
 
 [MESSAGES CONTROL]
 disable=all
@@ -88,7 +89,8 @@ enable=anomalous-backslash-in-string,
     website-manifest-key-not-valid-uri,
     xml-attribute-translatable,
     xml-deprecated-qweb-directive,
-    xml-deprecated-tree-attribute
+    xml-deprecated-tree-attribute,
+    external-request-timeout
 
 [REPORTS]
 msg-template={path}:{line}: [{msg_id}({symbol}), {obj}] {msg}
diff --git a/__manifest__.py b/__manifest__.py
index d34ebcf3cef083f35d2d6ec86327859764a6af86..dc5d2510c2a20e63c4376a81a0998387e0c45ada 100644
--- a/__manifest__.py
+++ b/__manifest__.py
@@ -3,7 +3,7 @@
     "summary": "Gestion des mise en production logicielles",
     "author": "Le Filament",
     "website": "https://le-filament.com",
-    "version": "15.0.1.0.1",
+    "version": "16.0.1.0.0",
     "license": "AGPL-3",
     "depends": [
         "web",
diff --git a/controllers/banner_release.py b/controllers/banner_release.py
index 948ff54ae8d3c96d2efca4e1af8e47ea1005ed09..b0f0b400f45a095dfed48a39e5cfe4390ef92f9f 100644
--- a/controllers/banner_release.py
+++ b/controllers/banner_release.py
@@ -9,5 +9,7 @@ class BannerController(http.Controller):
     @http.route(["/lefilament_release/header"], type="json", auth="user")
     def release_header(self):
         return {
-            "html": request.env.ref("lefilament_release.header_template")._render({})
+            "html": request.env["ir.qweb"]._render(
+                "lefilament_release.header_template", {}
+            )
         }
diff --git a/models/res_partner_release.py b/models/res_partner_release.py
index 8bc36940433ce619f92e95f9343e9965b58b1cd9..7aec7433e0fef4d49b9e28494bc9785746d4e86a 100644
--- a/models/res_partner_release.py
+++ b/models/res_partner_release.py
@@ -105,10 +105,12 @@ class PartnerRelease(models.Model):
     # ------------------------------------------------------
     # CRUD methods (ORM overrides)
     # ------------------------------------------------------
-    @api.model
-    def create(self, vals):
-        vals["access_token"] = str(uuid.uuid4())
-        return super().create(vals)
+    @api.model_create_multi
+    @api.returns("self", lambda value: value.id)
+    def create(self, vals_list):
+        for vals in vals_list:
+            vals["access_token"] = str(uuid.uuid4())
+        return super().create(vals_list)
 
     # ------------------------------------------------------
     # Actions
diff --git a/wizard/multi_partner_release_wizard.py b/wizard/multi_partner_release_wizard.py
index 74a69d89d40484c1087aab37063e4ef84f176edc..5f1def120eb865084c61a8434e46b886bc2eeaa3 100644
--- a/wizard/multi_partner_release_wizard.py
+++ b/wizard/multi_partner_release_wizard.py
@@ -26,7 +26,7 @@ class MultiPartnerReleaseWizard(models.TransientModel):
     )
     release_date = fields.Datetime(
         string="Date de mise en production",
-        default=fields.Datetime.now(),
+        default=lambda self: fields.Date.today(),
     )
     release_module_ids = fields.One2many(
         comodel_name="multi.partner.release.line.wizard",