diff --git a/issue9004.diff b/issue9004.diff
new file mode 100644
index 0000000..28178fd
--- /dev/null
+++ b/issue9004.diff
@@ -0,0 +1,48 @@
+diff --git a/trytond/trytond/modules/product/message.xml b/trytond/trytond/modules/product/message.xml
+index d77bc0e..d8b1f2f 100644
+--- a/trytond/trytond/modules/product/message.xml
++++ b/trytond/trytond/modules/product/message.xml
+@@ -24,5 +24,8 @@ this repository contains the full copyright notices and license terms. -->
+
+ The %(type)s "%(code)s" for product "%(product)s" is not valid.
+
++
++ Code of active product must be unique.
++
+
+
+diff --git a/trytond/trytond/modules/product/product.py b/trytond/trytond/modules/product/product.py
+index 7207c02..559329e 100644
+--- a/trytond/trytond/modules/product/product.py
++++ b/trytond/trytond/modules/product/product.py
+@@ -7,12 +7,13 @@ from importlib import import_module
+
+ import stdnum
+ import stdnum.exceptions
+-from sql import Null, Column
++from sql import Null, Column, Literal
++from sql.operators import Equal
+
+ from trytond.i18n import gettext
+ from trytond.model import (
+ ModelView, ModelSQL, Model, UnionMixin, DeactivableMixin, sequence_ordered,
+- fields)
++ Exclude, fields)
+ from trytond.pyson import Eval
+ from trytond.transaction import Transaction
+ from trytond.pool import Pool
+@@ -238,6 +239,14 @@ class Product(
+
+ super(Product, cls).__setup__()
+
++ t = cls.__table__()
++ cls._sql_constraints = [
++ ('code_exclude', Exclude(t, (t.code, Equal),
++ where=(t.active == Literal(True))
++ & (t.code != '')),
++ 'product.msg_product_code_unique'),
++ ]
++
+ for attr in dir(Template):
+ tfield = getattr(Template, attr)
+ if not isinstance(tfield, fields.Field):
diff --git a/series b/series
index 2536f36..1b5dbf8 100644
--- a/series
+++ b/series
@@ -111,4 +111,6 @@ issue10845.diff # [commission] Do not reverse commission when canceling invoice
project_work_company_rule.diff # [project] Add company rule at project level [#048280]
-# worker_logger.diff #[trytond] Move exception handling into transaction to keep the database name
\ No newline at end of file
+issue9004.diff # [product] Make product code unique
+
+# worker_logger.diff #[trytond] Move exception handling into transaction to keep the database name