diff --git a/__init__.py b/__init__.py
index 87ab696d072a1a3c288d3bb30946dcb96cae1228..e0e3732f51f7a29dcbf1f51f3a6edb926e723bac 100644
--- a/__init__.py
+++ b/__init__.py
@@ -1,4 +1,4 @@
 # Copyright 2021 Le Filament (https://le-filament.com)
 # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html)
 
-from . import controllers
+from . import models
diff --git a/__manifest__.py b/__manifest__.py
index 8cafdbdcef2ed7c05979bb41463c26dffe51f3ae..a1a762d796f394aa4bf6fda154fd1edebe78d2e1 100644
--- a/__manifest__.py
+++ b/__manifest__.py
@@ -11,7 +11,7 @@
     "depends": [
         "base",
     ],
-    "data": [],
+    "data": ["views/base_config_view.xml"],
     "qweb": [],
     "installable": True,
     "auto_install": False,
diff --git a/controllers/main.py b/controllers/main.py
deleted file mode 100644
index 3b56d44a6d73e33f13c115eb3b0fd7732aa07a8d..0000000000000000000000000000000000000000
--- a/controllers/main.py
+++ /dev/null
@@ -1,55 +0,0 @@
-# Copyright 2022 Le Filament (https://le-filament.com)
-# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html)
-
-import json
-
-from odoo import exceptions, http
-from odoo.http import request
-
-
-class ReleaseAgent(http.Controller):
-    # ------------------------------------------------------
-    # Routes
-    # ------------------------------------------------------
-    @http.route(
-        ["/get-modules"],
-        type="http",
-        auth="none",
-        method=["GET"],
-        csrf=False,
-    )
-    def get_modules(self):
-        db_header = request.httprequest.headers.get("DbName", False)
-        if db_header and db_header == request.db:
-            modules = (
-                request.env["ir.module.module"]
-                .sudo()
-                .search([("state", "=", "installed")])
-            )
-            res = modules.mapped(
-                lambda m: {
-                    "name": m.name,
-                    "author": m.author,
-                    "latest_version": m.latest_version,
-                    "author_type": self.get_author_type(m),
-                }
-            )
-            return http.Response(
-                response=json.dumps(res),
-                headers=[("Content-Type", "application/json")],
-            )
-        else:
-            return exceptions.AccessDenied()
-
-    # ------------------------------------------------------
-    # Common functions
-    # ------------------------------------------------------
-    def get_author_type(self, module):
-        if "OCA" in module.author:
-            return "oca"
-        elif "FILAMENT" in module.author.upper():
-            return "lefilament"
-        elif "Odoo S.A." in module.author:
-            return "odoo"
-        else:
-            return "other"
diff --git a/controllers/__init__.py b/models/__init__.py
similarity index 65%
rename from controllers/__init__.py
rename to models/__init__.py
index a69de12172fe457e2dbd62da3f827a265f22d223..3f1e2249df406505e67e994719e066410bea0e67 100644
--- a/controllers/__init__.py
+++ b/models/__init__.py
@@ -1,4 +1,5 @@
 # Copyright 2022 Le Filament (https://le-filament.com)
 # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html)
 
-from . import main
+from . import base_config_settings
+from . import ir_module_module
diff --git a/models/base_config_settings.py b/models/base_config_settings.py
new file mode 100644
index 0000000000000000000000000000000000000000..a4b090e3eddbfdf0fab1a4c1bbe8c2b5783b8088
--- /dev/null
+++ b/models/base_config_settings.py
@@ -0,0 +1,11 @@
+# Copyright 2022 Le Filament (https://le-filament.com)
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html)
+
+from odoo import models
+
+
+class ResConfigSettings(models.TransientModel):
+    _inherit = "res.config.settings"
+
+    def action_sync_modules(self):
+        self.env["ir.module.module"].sudo().post_modules()
diff --git a/models/ir_module_module.py b/models/ir_module_module.py
new file mode 100644
index 0000000000000000000000000000000000000000..ae6fdf3d8e12997addf8a09322faed246c5b3fee
--- /dev/null
+++ b/models/ir_module_module.py
@@ -0,0 +1,47 @@
+# © 2022 Le Filament (<http://www.le-filament.com>)
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
+
+import requests
+
+from odoo import exceptions, models
+
+
+class IrModule(models.Model):
+    _inherit = "ir.module.module"
+
+    # ------------------------------------------------------
+    # Common function
+    # ------------------------------------------------------
+    def _get_modules(self):
+        modules = self.sudo().search([("state", "=", "installed")])
+        res = modules.mapped(
+            lambda m: {
+                "name": m.name,
+                "author": m.author,
+                "latest_version": m.latest_version,
+                "author_type": m._get_author_type(),
+            }
+        )
+        return res
+
+    def _get_author_type(self):
+        self.ensure_one()
+        if "OCA" in self.author:
+            return "oca"
+        elif "FILAMENT" in self.author.upper():
+            return "lefilament"
+        elif "Odoo S.A." in self.author:
+            return "odoo"
+        else:
+            return "other"
+
+    def post_modules(self):
+        try:
+            requests.post(
+                url="https://monfil.le-filament.com/post-modules",
+                json=self._get_modules(),
+                verify=True,
+                timeout=10,
+            )
+        except Exception as e:
+            raise exceptions.UserError(e.__str__())
diff --git a/views/base_config_view.xml b/views/base_config_view.xml
new file mode 100644
index 0000000000000000000000000000000000000000..21b18b7c27405d6cf83382800e73942eecf4d695
--- /dev/null
+++ b/views/base_config_view.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<!-- Copyright 2015 Antiun Ingenieria S.L. - Antonio Espinosa
+     License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). -->
+<odoo>
+    <record id="res_config_lefilament_agent_view_form" model="ir.ui.view">
+        <field name="name">Add module synchro config parameter</field>
+        <field name="model">res.config.settings</field>
+        <field name="inherit_id" ref="base_setup.res_config_settings_view_form" />
+        <field name="arch" type="xml">
+            <xpath expr="//div[@id='companies']" position='after'>
+                <h2>Synchronisation des modules</h2>
+                <div class="row mt16 o_settings_container" name="partner_names_order">
+                    <div class="col-xs-12 col-md-6 o_setting_box">
+                        <div class="o_setting_right_pane">
+                            <p class="text-muted">
+                                Synchronisation des modules vers le serveur du Filament pour la gestion des releases
+                            </p>
+                            <button
+                                name="action_sync_modules"
+                                string="Synchroniser les modules"
+                                class="btn-info"
+                                type="object"
+                                help="Synchronise les modules vers le serveur du Filament"
+                            />
+                        </div>
+                    </div>
+                </div>
+            </xpath>
+        </field>
+    </record>
+</odoo>