diff --git a/__manifest__.py b/__manifest__.py
index 5c0f04929ac360305fcb317d11fda6a349b42ebc..dbf4624d3e4d8f5f534db9ddb3b22c05efa05fa9 100644
--- a/__manifest__.py
+++ b/__manifest__.py
@@ -6,7 +6,7 @@
     "summary": "Gestion des mise en production logicielles",
     "author": "Le Filament",
     "website": "https://le-filament.com",
-    "version": "14.0.1.1s.2",
+    "version": "14.0.2.0.0",
     "license": "AGPL-3",
     "depends": [
         "web",
@@ -25,6 +25,7 @@
         # views
         "views/res_partner.xml",
         "views/res_partner_module.xml",
+        "views/res_partner_module_version.xml",
         "views/res_partner_release.xml",
         "views/res_partner_release_module.xml",
         # views menu
diff --git a/models/__init__.py b/models/__init__.py
index 14713b01b588a4c44cc4f259decb2d314b4c7924..f5ecd4341bd38f10c32a8ef241f9e196d7ba48c7 100644
--- a/models/__init__.py
+++ b/models/__init__.py
@@ -3,5 +3,6 @@
 
 from . import res_partner
 from . import res_partner_module
+from . import res_partner_module_version
 from . import res_partner_release
 from . import res_partner_release_module
diff --git a/models/res_partner.py b/models/res_partner.py
index 541acee01ebc07d9638f1b6f011fa5674c0cb6f1..15ea9b5b401bcae1b757916a01e6939f534b530f 100644
--- a/models/res_partner.py
+++ b/models/res_partner.py
@@ -1,7 +1,6 @@
 # © 2022 Le Filament (<http://www.le-filament.com>)
 # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
 
-
 from odoo import fields, models
 
 
@@ -15,10 +14,9 @@ class ResPartner(models.Model):
     release_ids = fields.One2many(
         comodel_name="res.partner.release", inverse_name="partner_id", string="Releases"
     )
-    module_ids = fields.Many2many(
-        comodel_name="res.partner.module",
-        column1="partner_id",
-        column2="module_id",
+    module_version_ids = fields.One2many(
+        comodel_name="res.partner.module.version",
+        inverse_name="partner_id",
         string="Modules",
     )
     release_share_link = fields.Char(
@@ -53,27 +51,41 @@ class ResPartner(models.Model):
 
     def retrieve_modules(self, modules):
         existing_modules = self.env["res.partner.module"].search([])
+        ModuleVersion = self.env["res.partner.module.version"]
         for partner in self:
             for module in modules:
                 if module.get("author_type") != "odoo":
-                    # Mise à jour du module
-                    if module.get("name") in existing_modules.mapped("name"):
-                        existing_modules.filtered(
+                    # Création du module
+                    if not module.get("name") in existing_modules.mapped("name"):
+                        new_module = module
+                        new_module.pop("latest_version", False)
+                        module_id = existing_modules.create(new_module)
+                    # Mise à jour des versions
+                    else:
+                        module_id = existing_modules.filtered(
                             lambda m: m.name == module.get("name")
-                        ).update(
+                        )
+                    module_update = ModuleVersion.search(
+                        [
+                            ("partner_id", "=", partner.id),
+                            ("module_id", "=", module_id.id),
+                        ]
+                    )
+                    if module_update:
+                        module_update.update(
+                            {"latest_version": module.get("latest_version")}
+                        )
+                    else:
+                        module_update.create(
                             {
-                                "author": module.get("author"),
-                                "author_type": module.get("author_type"),
+                                "partner_id": partner.id,
+                                "module_id": module_id.id,
                                 "latest_version": module.get("latest_version"),
-                                "partner_ids": [(4, partner.id, 0)],
                             }
                         )
-                    else:
-                        # Création du module
-                        partner.update({"module_ids": [(0, 0, module)]})
             # Check modules désinstallés
             module_uninstalled = list(
-                set(partner.module_ids.mapped("name"))
+                set(partner.module_version_ids.mapped("module_id.name"))
                 - set(
                     map(
                         lambda m: m.get("name")
@@ -84,11 +96,10 @@ class ResPartner(models.Model):
                 )
             )
             if module_uninstalled:
-                module_ids = partner.module_ids.filtered(
-                    lambda m: m.name in module_uninstalled
+                module_ids = partner.module_version_ids.filtered(
+                    lambda m: m.module_id.name in module_uninstalled
                 )
-                for module in module_ids:
-                    partner.update({"module_ids": [(3, module.id, 0)]})
+                module_ids.unlink()
 
     # ------------------------------------------------------
     # Common function
diff --git a/models/res_partner_module.py b/models/res_partner_module.py
index 471b6cf8a9d03e2b686507a17ce452efc56e53a5..3fbf8f7f5f4a9c2c22646e4c9fb18b5e014914a5 100644
--- a/models/res_partner_module.py
+++ b/models/res_partner_module.py
@@ -6,20 +6,18 @@ from odoo import fields, models
 
 class PartnerModule(models.Model):
     _name = "res.partner.module"
-    _description = "Modules client"
+    _description = "Modules Odoo"
+    _order = "name"
 
     # ------------------------------------------------------
     # Fields declaration
     # ------------------------------------------------------
     name = fields.Char("Nom du module", required=True)
-    partner_ids = fields.Many2many(
-        comodel_name="res.partner",
-        column1="module_id",
-        column2="partner_id",
+    partner_version_ids = fields.One2many(
+        comodel_name="res.partner.module.version",
+        inverse_name="module_id",
         string="Clients",
-        domain=[("is_company", "=", True)],
     )
-    latest_version = fields.Char("Version installée")
     author = fields.Char("Auteur")
     author_type = fields.Selection(
         [
@@ -29,7 +27,6 @@ class PartnerModule(models.Model):
         ],
         string="Type",
     )
-    active = fields.Boolean("Actif", default=True)
 
     # ------------------------------------------------------
     # SQL Constraints
diff --git a/models/res_partner_module_version.py b/models/res_partner_module_version.py
new file mode 100644
index 0000000000000000000000000000000000000000..a7b9ee429ce891f988a54418355cc1a2a391c62f
--- /dev/null
+++ b/models/res_partner_module_version.py
@@ -0,0 +1,59 @@
+# Copyright 2022 Le Filament (https://le-filament.com)
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html)
+
+from odoo import fields, models
+
+
+class PartnerModuleVersion(models.Model):
+    _name = "res.partner.module.version"
+    _description = "Modules par client"
+
+    # ------------------------------------------------------
+    # Fields declaration
+    # ------------------------------------------------------
+    partner_id = fields.Many2one(
+        comodel_name="res.partner",
+        string="Client",
+        domain=[("is_company", "=", True)],
+        required=True,
+    )
+    module_id = fields.Many2one(
+        comodel_name="res.partner.module",
+        string="Module Odoo",
+        required=True,
+    )
+    latest_version = fields.Char("Version installée")
+
+    # ------------------------------------------------------
+    # SQL Constraints
+    # ------------------------------------------------------
+    _sql_constraints = [
+        (
+            "uniq_module_partner",
+            "unique(partner_id, module_id)",
+            "Ce module existe déjà pour ce client",
+        ),
+    ]
+    # ------------------------------------------------------
+    # Default methods
+    # ------------------------------------------------------
+
+    # ------------------------------------------------------
+    # Computed fields / Search Fields
+    # ------------------------------------------------------
+
+    # ------------------------------------------------------
+    # Onchange / Constraints
+    # ------------------------------------------------------
+
+    # ------------------------------------------------------
+    # CRUD methods (ORM overrides)
+    # ------------------------------------------------------
+
+    # ------------------------------------------------------
+    # Actions
+    # ------------------------------------------------------
+
+    # ------------------------------------------------------
+    # Business methods
+    # ------------------------------------------------------
diff --git a/models/res_partner_release_module.py b/models/res_partner_release_module.py
index 7d1585e2c785ff70d4279b86e56a638dcb60c1f7..4fbbbb42e3b4c8f6be0ed1b0584f3bf86ea96dbb 100644
--- a/models/res_partner_release_module.py
+++ b/models/res_partner_release_module.py
@@ -2,7 +2,7 @@
 # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html)
 
 
-from odoo import fields, models
+from odoo import api, fields, models
 
 
 class PartnerReleaseModule(models.Model):
@@ -59,6 +59,10 @@ class PartnerReleaseModule(models.Model):
     # ------------------------------------------------------
     # Onchange / Constraints
     # ------------------------------------------------------
+    @api.onchange("partner_id")
+    def _onchange_partner_id(self):
+        module_ids = self.partner_id.module_version_ids.mapped("module_id")
+        return {"domain": {"module_id": [("id", "in", module_ids.ids)]}}
 
     # ------------------------------------------------------
     # CRUD methods (ORM overrides)
diff --git a/security/ir.model.access.csv b/security/ir.model.access.csv
index 745fb47e50606468072985db9f3450c1855f8af9..fcb2ce2a7f4b724c507c8d8490a6dc9230561ef9 100644
--- a/security/ir.model.access.csv
+++ b/security/ir.model.access.csv
@@ -1,6 +1,7 @@
 id,name,model_id/id,group_id/id,perm_read,perm_write,perm_create,perm_unlink
 access_res_partner_release,access_res_partner_release,model_res_partner_release,base.group_user,1,1,1,1
 access_res_partner_module,access_res_partner_module,model_res_partner_module,base.group_user,1,1,1,1
+access_res_partner_module_version,access_res_partner_module_version,model_res_partner_module_version,base.group_user,1,1,1,1
 access_res_partner_release_module,access_res_partner_release_module,model_res_partner_release_module,base.group_user,1,1,1,1
 access_multi_partner_release_wizard,access_multi_partner_release_wizard,model_multi_partner_release_wizard,base.group_user,1,1,1,1
 access_multi_partner_release_line_wizard,access_multi_partner_release_line_wizard,model_multi_partner_release_line_wizard,base.group_user,1,1,1,1
diff --git a/views/menus.xml b/views/menus.xml
index cb0bcbd4400d3538fefef45c5437fbbd5a637a54..72955708b72c4f56613575b5516f57e714e69f25 100644
--- a/views/menus.xml
+++ b/views/menus.xml
@@ -32,6 +32,13 @@
             parent="res_partner_release_menu"
             sequence="30"
         />
+        <menuitem
+            name="Modules par client et version"
+            id="res_partner_module_version_menu"
+            action="res_partner_module_version_act_window"
+            parent="res_partner_release_menu"
+            sequence="30"
+        />
 
     </data>
 </odoo>
diff --git a/views/res_partner.xml b/views/res_partner.xml
index 064148de46fdb516d8a05bb27bb444b6b63166dc..31cf4c0dac161cae7ac927fe05ab940ac9aaf11f 100644
--- a/views/res_partner.xml
+++ b/views/res_partner.xml
@@ -23,11 +23,9 @@
                             <group>
                             </group>
                         </group>
-                        <field name="module_ids">
-                            <tree editable="top">
-                                <field name="name" />
-                                <field name="author_type" />
-                                <field name="author" />
+                        <field name="module_version_ids">
+                            <tree editable="top" default_order="module_id">
+                                <field name="module_id" />
                                 <field name="latest_version" />
                             </tree>
                         </field>
diff --git a/views/res_partner_module.xml b/views/res_partner_module.xml
index f793eb065ad03a25b2304305860bd7a49064d6be..edbaae61533b22385d259611b22760540e736c9d 100644
--- a/views/res_partner_module.xml
+++ b/views/res_partner_module.xml
@@ -10,11 +10,43 @@
                     <field name="name" />
                     <field name="author_type" />
                     <field name="author" />
-                    <field name="partner_ids" />
                 </search>
             </field>
         </record>
 
+        <!-- Form View -->
+        <record id="res_partner_module_form_view" model="ir.ui.view">
+            <field name="name">res.partner.module.form</field>
+            <field name="model">res.partner.module</field>
+            <field name="arch" type="xml">
+                <form string="Modules">
+                    <sheet>
+                        <div class="oe_title">
+                            <h1>
+                                <field name="name" />
+                            </h1>
+                        </div>
+                        <group>
+                            <group>
+                                <field name="author_type" />
+                                <field name="author" />
+                            </group>
+                        </group>
+                        <field
+                            name="partner_version_ids"
+                            readonly="1"
+                            default_order="partner_id"
+                        >
+                            <tree>
+                                <field name="partner_id" />
+                                <field name="latest_version" />
+                            </tree>
+                        </field>
+                    </sheet>
+                </form>
+            </field>
+        </record>
+
         <!-- Tree View -->
         <record id="res_partner_module_tree_view" model="ir.ui.view">
             <field name="name">res.partner.module.tree</field>
@@ -24,13 +56,11 @@
                     <field name="name" />
                     <field name="author_type" />
                     <field name="author" />
-                    <field name="latest_version" />
                     <field
-                        name="partner_ids"
+                        name="partner_version_ids"
                         options="{'no_create': 1,}"
                         widget="many2many_tags"
                     />
-                    <field name="active" />
                 </tree>
             </field>
         </record>
@@ -40,7 +70,7 @@
             <field name="name">Liste Modules</field>
             <field name="type">ir.actions.act_window</field>
             <field name="res_model">res.partner.module</field>
-            <field name="view_mode">tree</field>
+            <field name="view_mode">tree,form</field>
         </record>
 
     </data>
diff --git a/views/res_partner_module_version.xml b/views/res_partner_module_version.xml
new file mode 100644
index 0000000000000000000000000000000000000000..3bfe0686a3436daa26bc1f17d763182a8223cf00
--- /dev/null
+++ b/views/res_partner_module_version.xml
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<odoo>
+    <data>
+        <!-- Search View -->
+        <record id="res_partner_module_version_search_view" model="ir.ui.view">
+            <field name="name">res.partner.module.version.search</field>
+            <field name="model">res.partner.module.version</field>
+            <field name="arch" type="xml">
+                <search string="Modules">
+                    <field name="partner_id" />
+                    <field name="module_id" />
+                    <field name="latest_version" />
+                </search>
+            </field>
+        </record>
+
+        <!-- Tree View -->
+        <record id="res_partner_module_version_tree_view" model="ir.ui.view">
+            <field name="name">res.partner.module.version.tree</field>
+            <field name="model">res.partner.module.version</field>
+            <field name="arch" type="xml">
+                <tree string="Modules" editable="top">
+                    <field name="partner_id" options="{'no_create': 1, 'no_edit': 1}" />
+                    <field name="module_id" options="{'no_create': 1, 'no_edit': 1}" />
+                    <field name="latest_version" />
+                </tree>
+            </field>
+        </record>
+
+        <!-- Action Window -->
+        <record
+            id="res_partner_module_version_act_window"
+            model="ir.actions.act_window"
+        >
+            <field name="name">Modules par client et version</field>
+            <field name="type">ir.actions.act_window</field>
+            <field name="res_model">res.partner.module.version</field>
+            <field name="view_mode">tree</field>
+        </record>
+
+    </data>
+</odoo>