diff --git a/fusion-plating/fusion_plating_certificates/__init__.py b/fusion-plating/fusion_plating_certificates/__init__.py
new file mode 100644
index 00000000..3c90fa80
--- /dev/null
+++ b/fusion-plating/fusion_plating_certificates/__init__.py
@@ -0,0 +1,6 @@
+# -*- coding: utf-8 -*-
+# Copyright 2026 Nexa Systems Inc.
+# License OPL-1 (Odoo Proprietary License v1.0)
+# Part of the Fusion Plating product family.
+
+from . import models
diff --git a/fusion-plating/fusion_plating_certificates/__manifest__.py b/fusion-plating/fusion_plating_certificates/__manifest__.py
new file mode 100644
index 00000000..7244aa4a
--- /dev/null
+++ b/fusion-plating/fusion_plating_certificates/__manifest__.py
@@ -0,0 +1,40 @@
+# -*- coding: utf-8 -*-
+# Copyright 2026 Nexa Systems Inc.
+# License OPL-1 (Odoo Proprietary License v1.0)
+# Part of the Fusion Plating product family.
+
+{
+ 'name': 'Fusion Plating — Certificates',
+ 'version': '19.0.1.0.0',
+ 'category': 'Manufacturing/Plating',
+ 'summary': 'Certificate registry for CoC, thickness reports, and quality documents.',
+ 'description': """
+Fusion Plating — Certificates
+===============================
+
+Unified certificate registry tracking all quality documents issued to customers.
+Includes Fischerscope thickness measurement data capture.
+""",
+ 'author': 'Nexa Systems Inc.',
+ 'website': 'https://www.nexasystems.ca',
+ 'maintainer': 'Nexa Systems Inc.',
+ 'support': 'support@nexasystems.ca',
+ 'license': 'OPL-1',
+ 'price': 0.00,
+ 'currency': 'CAD',
+ 'depends': [
+ 'fusion_plating',
+ 'fusion_plating_portal',
+ 'mrp',
+ 'sale_management',
+ ],
+ 'data': [
+ 'security/ir.model.access.csv',
+ 'data/fp_certificate_sequence_data.xml',
+ 'views/fp_certificate_views.xml',
+ 'views/fp_certificates_menu.xml',
+ ],
+ 'installable': True,
+ 'application': False,
+ 'auto_install': False,
+}
diff --git a/fusion-plating/fusion_plating_certificates/data/fp_certificate_sequence_data.xml b/fusion-plating/fusion_plating_certificates/data/fp_certificate_sequence_data.xml
new file mode 100644
index 00000000..4e4c4211
--- /dev/null
+++ b/fusion-plating/fusion_plating_certificates/data/fp_certificate_sequence_data.xml
@@ -0,0 +1,10 @@
+
+
+
+ Fusion Plating: Certificate
+ fp.certificate
+ CERT-
+ 5
+
+
+
diff --git a/fusion-plating/fusion_plating_certificates/models/__init__.py b/fusion-plating/fusion_plating_certificates/models/__init__.py
new file mode 100644
index 00000000..0881ff43
--- /dev/null
+++ b/fusion-plating/fusion_plating_certificates/models/__init__.py
@@ -0,0 +1,7 @@
+# -*- coding: utf-8 -*-
+# Copyright 2026 Nexa Systems Inc.
+# License OPL-1 (Odoo Proprietary License v1.0)
+# Part of the Fusion Plating product family.
+
+from . import fp_thickness_reading
+from . import fp_certificate
diff --git a/fusion-plating/fusion_plating_certificates/models/fp_certificate.py b/fusion-plating/fusion_plating_certificates/models/fp_certificate.py
new file mode 100644
index 00000000..8c2367be
--- /dev/null
+++ b/fusion-plating/fusion_plating_certificates/models/fp_certificate.py
@@ -0,0 +1,6 @@
+# -*- coding: utf-8 -*-
+# Copyright 2026 Nexa Systems Inc.
+# License OPL-1 (Odoo Proprietary License v1.0)
+# Part of the Fusion Plating product family.
+
+# Placeholder — fp.certificate model will be implemented in a subsequent task.
diff --git a/fusion-plating/fusion_plating_certificates/models/fp_thickness_reading.py b/fusion-plating/fusion_plating_certificates/models/fp_thickness_reading.py
new file mode 100644
index 00000000..ee43b393
--- /dev/null
+++ b/fusion-plating/fusion_plating_certificates/models/fp_thickness_reading.py
@@ -0,0 +1,61 @@
+# -*- coding: utf-8 -*-
+# Copyright 2026 Nexa Systems Inc.
+# License OPL-1 (Odoo Proprietary License v1.0)
+# Part of the Fusion Plating product family.
+
+from odoo import fields, models
+
+
+class FpThicknessReading(models.Model):
+ """Fischerscope thickness measurement data.
+
+ Captures individual XRF readings from equipment like the
+ Fischerscope XDAL 600. Linked to certificates and/or MOs.
+ Data is manually entered for now; future: CSV import from equipment.
+ """
+ _name = 'fp.thickness.reading'
+ _description = 'Fusion Plating — Thickness Reading'
+ _order = 'reading_number'
+
+ certificate_id = fields.Many2one(
+ 'fp.certificate', string='Certificate', ondelete='cascade',
+ )
+ production_id = fields.Many2one(
+ 'mrp.production', string='Manufacturing Order',
+ )
+ reading_number = fields.Integer(
+ string='Reading #', default=1, help='Sequence number (n=1, n=2, n=3).',
+ )
+ nip_mils = fields.Float(
+ string='NiP (mils)', digits=(10, 4), help='NiP thickness in mils.',
+ )
+ ni_percent = fields.Float(
+ string='Ni %', digits=(6, 3), help='Nickel content percentage.',
+ )
+ p_percent = fields.Float(
+ string='P %', digits=(6, 4), help='Phosphorus content percentage.',
+ )
+ position_label = fields.Char(
+ string='Position', help='Where on the part this reading was taken.',
+ )
+ equipment_model = fields.Char(
+ string='Equipment', default='Fischerscope XDAL 600',
+ )
+ product_ref = fields.Char(
+ string='Product Ref', help='e.g. "2805031 / NiP/Al-alloys 2805030"',
+ )
+ calibration_std_ref = fields.Char(
+ string='Calibration Std', help='e.g. "NiP/Al STD SET SN 100174568"',
+ )
+ microscope_image_id = fields.Many2one(
+ 'ir.attachment', string='Microscope Image',
+ )
+ operator_id = fields.Many2one(
+ 'res.users', string='Operator', default=lambda self: self.env.user,
+ )
+ reading_datetime = fields.Datetime(
+ string='Reading Date/Time', default=fields.Datetime.now,
+ )
+ measuring_time_seconds = fields.Integer(
+ string='Measuring Time (sec)', default=120,
+ )
diff --git a/fusion-plating/fusion_plating_certificates/security/ir.model.access.csv b/fusion-plating/fusion_plating_certificates/security/ir.model.access.csv
new file mode 100644
index 00000000..0ebe99ce
--- /dev/null
+++ b/fusion-plating/fusion_plating_certificates/security/ir.model.access.csv
@@ -0,0 +1,7 @@
+id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
+access_fp_certificate_operator,fp.certificate.operator,model_fp_certificate,fusion_plating.group_fusion_plating_operator,1,0,0,0
+access_fp_certificate_supervisor,fp.certificate.supervisor,model_fp_certificate,fusion_plating.group_fusion_plating_supervisor,1,1,1,0
+access_fp_certificate_manager,fp.certificate.manager,model_fp_certificate,fusion_plating.group_fusion_plating_manager,1,1,1,1
+access_fp_thickness_reading_operator,fp.thickness.reading.operator,model_fp_thickness_reading,fusion_plating.group_fusion_plating_operator,1,0,0,0
+access_fp_thickness_reading_supervisor,fp.thickness.reading.supervisor,model_fp_thickness_reading,fusion_plating.group_fusion_plating_supervisor,1,1,1,0
+access_fp_thickness_reading_manager,fp.thickness.reading.manager,model_fp_thickness_reading,fusion_plating.group_fusion_plating_manager,1,1,1,1
diff --git a/fusion-plating/fusion_plating_certificates/static/description/icon.png b/fusion-plating/fusion_plating_certificates/static/description/icon.png
new file mode 100644
index 00000000..a61b43b7
Binary files /dev/null and b/fusion-plating/fusion_plating_certificates/static/description/icon.png differ
diff --git a/fusion-plating/fusion_plating_certificates/views/fp_certificate_views.xml b/fusion-plating/fusion_plating_certificates/views/fp_certificate_views.xml
new file mode 100644
index 00000000..85d8c23e
--- /dev/null
+++ b/fusion-plating/fusion_plating_certificates/views/fp_certificate_views.xml
@@ -0,0 +1,2 @@
+
+
diff --git a/fusion-plating/fusion_plating_certificates/views/fp_certificates_menu.xml b/fusion-plating/fusion_plating_certificates/views/fp_certificates_menu.xml
new file mode 100644
index 00000000..85d8c23e
--- /dev/null
+++ b/fusion-plating/fusion_plating_certificates/views/fp_certificates_menu.xml
@@ -0,0 +1,2 @@
+
+