diff --git a/stock_picking_product_kit_helper/README.rst b/stock_picking_product_kit_helper/README.rst
new file mode 100644
index 000000000..89dd3ece7
--- /dev/null
+++ b/stock_picking_product_kit_helper/README.rst
@@ -0,0 +1,115 @@
+================================
+Stock Picking Product Kit Helper
+================================
+
+.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+ !! This file is generated by oca-gen-addon-readme !!
+ !! changes will be overwritten. !!
+ !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png
+ :target: https://odoo-community.org/page/development-status
+ :alt: Beta
+.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png
+ :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html
+ :alt: License: AGPL-3
+.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fmanufacture-lightgray.png?logo=github
+ :target: https://github.com/OCA/manufacture/tree/13.0/stock_picking_product_kit_helper
+ :alt: OCA/manufacture
+.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png
+ :target: https://translation.odoo-community.org/projects/manufacture-13-0/manufacture-13-0-stock_picking_product_kit_helper
+ :alt: Translate me on Weblate
+.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png
+ :target: https://runbot.odoo-community.org/runbot/129/13.0
+ :alt: Try me on Runbot
+
+|badge1| |badge2| |badge3| |badge4| |badge5|
+
+When sales order contain product kits (product with BOM of type kit),
+the delivery order (stock.move) created by it will be exploded to multiple product lines.
+
+Normally, to partially deliver, user will calculate manually the quantity of each product lines to delivery.
+
+This module add new tab "Product Kit Help" to help in calculate quantity in product line with ease.
+
+**Table of contents**
+
+.. contents::
+ :local:
+
+Usage
+=====
+
+When origin sales order of the underlining delivery order contains at least 1 product kit,
+the tab "Product Kit Helper" will appear.
+
+To use the helper, go to the "Product Kit Helper" tab,
+
+#. Click => Show Product Kit
+#. Edit and fill in required quantity
+#. Click Assign Operation Quantity
+#. Check result in Operations tab
+
+Changelog
+=========
+
+13.0.1.0.0 (2020-01-09)
+~~~~~~~~~~~~~~~~~~~~~~~
+
+Migrated to odoo 13.
+
+12.0.1.0.0 (2019-06-17)
+~~~~~~~~~~~~~~~~~~~~~~~
+
+First version.
+
+Bug Tracker
+===========
+
+Bugs are tracked on `GitHub Issues `_.
+In case of trouble, please check there if your issue has already been reported.
+If you spotted it first, help us smashing it by providing a detailed and welcomed
+`feedback `_.
+
+Do not contact contributors directly about support or help with technical issues.
+
+Credits
+=======
+
+Authors
+~~~~~~~
+
+* Ecosoft
+
+Contributors
+~~~~~~~~~~~~
+
+* `Ecosoft `__:
+
+ * Kitti Upariphutthiphong
+ * Pimolnat Suntian
+
+Maintainers
+~~~~~~~~~~~
+
+This module is maintained by the OCA.
+
+.. image:: https://odoo-community.org/logo.png
+ :alt: Odoo Community Association
+ :target: https://odoo-community.org
+
+OCA, or the Odoo Community Association, is a nonprofit organization whose
+mission is to support the collaborative development of Odoo features and
+promote its widespread use.
+
+.. |maintainer-kittiu| image:: https://github.com/kittiu.png?size=40px
+ :target: https://github.com/kittiu
+ :alt: kittiu
+
+Current `maintainer `__:
+
+|maintainer-kittiu|
+
+This module is part of the `OCA/manufacture `_ project on GitHub.
+
+You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.
diff --git a/stock_picking_product_kit_helper/__init__.py b/stock_picking_product_kit_helper/__init__.py
new file mode 100644
index 000000000..9c982a787
--- /dev/null
+++ b/stock_picking_product_kit_helper/__init__.py
@@ -0,0 +1,4 @@
+# Copyright 2019 Kitti U. - Ecosoft
+# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
+
+from . import models
diff --git a/stock_picking_product_kit_helper/__manifest__.py b/stock_picking_product_kit_helper/__manifest__.py
new file mode 100644
index 000000000..b8ebefed3
--- /dev/null
+++ b/stock_picking_product_kit_helper/__manifest__.py
@@ -0,0 +1,15 @@
+# Copyright 2019 Kitti U. - Ecosoft
+# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
+{
+ "name": "Stock Picking Product Kit Helper",
+ "summary": "Set quanity in picking line based on product kit quantity",
+ "version": "13.0.1.0.0",
+ "category": "Stock",
+ "website": "https://github.com/OCA/manufacture",
+ "author": "Ecosoft, Odoo Community Association (OCA)",
+ "license": "AGPL-3",
+ "installable": True,
+ "depends": ["sale_mrp"],
+ "data": ["security/ir.model.access.csv", "views/stock_view.xml"],
+ "maintainers": ["kittiu"],
+}
diff --git a/stock_picking_product_kit_helper/i18n/stock_picking_product_kit_helper.pot b/stock_picking_product_kit_helper/i18n/stock_picking_product_kit_helper.pot
new file mode 100644
index 000000000..bcf32111e
--- /dev/null
+++ b/stock_picking_product_kit_helper/i18n/stock_picking_product_kit_helper.pot
@@ -0,0 +1,156 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * stock_picking_product_kit_helper
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 12.0\n"
+"Report-Msgid-Bugs-To: \n"
+"Last-Translator: <>\n"
+"Language-Team: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Plural-Forms: \n"
+
+#. module: stock_picking_product_kit_helper
+#: model:ir.model,name:stock_picking_product_kit_helper.model_stock_picking_product_kit_helper
+msgid "\n"
+" Product Kit Helper, allow user to specify quantity of product kit,\n"
+" to explode as product quantity in operations tab\n"
+" "
+msgstr ""
+
+#. module: stock_picking_product_kit_helper
+#: model_terms:ir.ui.view,arch_db:stock_picking_product_kit_helper.view_picking_form
+msgid "Assign Operation Quantity"
+msgstr ""
+
+#. module: stock_picking_product_kit_helper
+#: model_terms:ir.ui.view,arch_db:stock_picking_product_kit_helper.view_picking_form
+msgid "Check result in Operations tab"
+msgstr ""
+
+#. module: stock_picking_product_kit_helper
+#: model_terms:ir.ui.view,arch_db:stock_picking_product_kit_helper.view_picking_form
+msgid "Click => Show Product Kit"
+msgstr ""
+
+#. module: stock_picking_product_kit_helper
+#: model_terms:ir.ui.view,arch_db:stock_picking_product_kit_helper.view_picking_form
+msgid "Click Assign Operation Quantity"
+msgstr ""
+
+#. module: stock_picking_product_kit_helper
+#: model:ir.model.fields,field_description:stock_picking_product_kit_helper.field_stock_picking_product_kit_helper__create_uid
+msgid "Created by"
+msgstr ""
+
+#. module: stock_picking_product_kit_helper
+#: model:ir.model.fields,field_description:stock_picking_product_kit_helper.field_stock_picking_product_kit_helper__create_date
+msgid "Created on"
+msgstr ""
+
+#. module: stock_picking_product_kit_helper
+#: model:ir.model.fields,field_description:stock_picking_product_kit_helper.field_stock_picking_product_kit_helper__display_name
+msgid "Display Name"
+msgstr ""
+
+#. module: stock_picking_product_kit_helper
+#: model_terms:ir.ui.view,arch_db:stock_picking_product_kit_helper.view_picking_form
+msgid "Edit and fill in required quantity"
+msgstr ""
+
+#. module: stock_picking_product_kit_helper
+#: model:ir.model.fields,field_description:stock_picking_product_kit_helper.field_stock_picking__has_product_kit
+msgid "Has Product Kit"
+msgstr ""
+
+#. module: stock_picking_product_kit_helper
+#: model:ir.model.fields,field_description:stock_picking_product_kit_helper.field_stock_picking_product_kit_helper__id
+msgid "ID"
+msgstr ""
+
+#. module: stock_picking_product_kit_helper
+#: model_terms:ir.ui.view,arch_db:stock_picking_product_kit_helper.view_picking_form
+msgid "Kit Helper"
+msgstr ""
+
+#. module: stock_picking_product_kit_helper
+#: model:ir.model.fields,field_description:stock_picking_product_kit_helper.field_stock_picking_product_kit_helper____last_update
+msgid "Last Modified on"
+msgstr ""
+
+#. module: stock_picking_product_kit_helper
+#: model:ir.model.fields,field_description:stock_picking_product_kit_helper.field_stock_picking_product_kit_helper__write_uid
+msgid "Last Updated by"
+msgstr ""
+
+#. module: stock_picking_product_kit_helper
+#: model:ir.model.fields,field_description:stock_picking_product_kit_helper.field_stock_picking_product_kit_helper__write_date
+msgid "Last Updated on"
+msgstr ""
+
+#. module: stock_picking_product_kit_helper
+#: code:addons/stock_picking_product_kit_helper/models/stock_picking.py:129
+#, python-format
+msgid "No matching detailed product %s for product kit %s"
+msgstr ""
+
+#. module: stock_picking_product_kit_helper
+#: model:ir.model.fields,field_description:stock_picking_product_kit_helper.field_stock_picking_product_kit_helper__picking_id
+msgid "Picking"
+msgstr ""
+
+#. module: stock_picking_product_kit_helper
+#: model:ir.model.fields,field_description:stock_picking_product_kit_helper.field_stock_picking_product_kit_helper__product_id
+msgid "Product"
+msgstr ""
+
+#. module: stock_picking_product_kit_helper
+#: model:ir.model.fields,field_description:stock_picking_product_kit_helper.field_stock_picking__product_kit_helper_ids
+msgid "Product Kit Helper Lines"
+msgstr ""
+
+#. module: stock_picking_product_kit_helper
+#: code:addons/stock_picking_product_kit_helper/models/stock_picking.py:61
+#, python-format
+msgid "Product Kit Helper is not allowed on current state"
+msgstr ""
+
+#. module: stock_picking_product_kit_helper
+#: model:ir.model.fields,field_description:stock_picking_product_kit_helper.field_stock_picking_product_kit_helper__product_uom_qty
+msgid "Quantity"
+msgstr ""
+
+#. module: stock_picking_product_kit_helper
+#: model:ir.model.fields,field_description:stock_picking_product_kit_helper.field_stock_picking_product_kit_helper__sale_line_id
+msgid "Sales Order Line"
+msgstr ""
+
+#. module: stock_picking_product_kit_helper
+#: model_terms:ir.ui.view,arch_db:stock_picking_product_kit_helper.view_picking_form
+msgid "To deliver partial product kits, you can use this tab to help calculate\n"
+" quantity and auto fill in \"Done\" column in Operations tab. "
+msgstr ""
+
+#. module: stock_picking_product_kit_helper
+#: model:ir.model,name:stock_picking_product_kit_helper.model_stock_picking
+msgid "Transfer"
+msgstr ""
+
+#. module: stock_picking_product_kit_helper
+#: model:ir.model.fields,help:stock_picking_product_kit_helper.field_stock_picking__has_product_kit
+msgid "True if there is at least 1 product kit in the sales order"
+msgstr ""
+
+#. module: stock_picking_product_kit_helper
+#: model:ir.model.fields,field_description:stock_picking_product_kit_helper.field_stock_picking_product_kit_helper__product_uom
+msgid "Unit of Measure"
+msgstr ""
+
+#. module: stock_picking_product_kit_helper
+#: model_terms:ir.ui.view,arch_db:stock_picking_product_kit_helper.view_picking_form
+msgid "⇒ Show Product Kit"
+msgstr ""
+
diff --git a/stock_picking_product_kit_helper/models/__init__.py b/stock_picking_product_kit_helper/models/__init__.py
new file mode 100644
index 000000000..7945596c7
--- /dev/null
+++ b/stock_picking_product_kit_helper/models/__init__.py
@@ -0,0 +1,4 @@
+# Copyright 2019 Kitti U. - Ecosoft
+# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
+
+from . import stock_picking
diff --git a/stock_picking_product_kit_helper/models/stock_picking.py b/stock_picking_product_kit_helper/models/stock_picking.py
new file mode 100644
index 000000000..2ac8b30fd
--- /dev/null
+++ b/stock_picking_product_kit_helper/models/stock_picking.py
@@ -0,0 +1,137 @@
+# Copyright 2019 Kitti U. - Ecosoft
+# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
+
+from odoo import _, api, fields, models
+from odoo.exceptions import ValidationError
+
+
+class StockPicking(models.Model):
+ _inherit = "stock.picking"
+
+ product_kit_helper_ids = fields.One2many(
+ comodel_name="stock.picking.product.kit.helper",
+ string="Product Kit Helper Lines",
+ inverse_name="picking_id",
+ readonly=False,
+ states={"done": [("readonly", True)], "cancel": [("readonly", True)]},
+ )
+ has_product_kit = fields.Boolean(
+ string="Has Product Kit",
+ compute="_compute_has_product_kit",
+ help="True if there is at least 1 product kit in the sales order",
+ )
+
+ @api.model
+ def _is_product_kit(self, product, company):
+ BOM = self.env["mrp.bom"].sudo()
+ bom = BOM._bom_find(product=product, company_id=company.id)
+ return bom and bom.type == "phantom"
+
+ def _compute_has_product_kit(self):
+ for picking in self:
+ if any(
+ self._is_product_kit(line.product_id, line.company_id)
+ for line in picking.move_lines.mapped("sale_line_id")
+ ):
+ picking.has_product_kit = True
+
+ def show_product_kit(self):
+ """Find move_lines with product kit to create helper line."""
+ self.ensure_one()
+ BOM = self.env["mrp.bom"].sudo()
+ helpers = []
+ for sale_line in self.move_lines.mapped("sale_line_id"):
+ bom = BOM._bom_find(
+ product=sale_line.product_id, company_id=sale_line.company_id.id
+ )
+ if bom and bom.type == "phantom": # Create product kit line
+ helpers.append(
+ (
+ 0,
+ 0,
+ {
+ "sale_line_id": sale_line.id,
+ "product_id": sale_line.product_id.id,
+ "product_uom_qty": 0.0,
+ },
+ )
+ )
+ self.product_kit_helper_ids.unlink()
+ self.write({"product_kit_helper_ids": helpers})
+
+ def action_product_kit_helper(self):
+ """Assign product kit's quantity to stock move."""
+ self.ensure_one()
+ if self.state in ("done", "cancel"):
+ raise ValidationError(
+ _("Product Kit Helper is not allowed on current state")
+ )
+ for helper in self.product_kit_helper_ids:
+ helper.action_explode_helper()
+
+
+class StockPickingProductKitHelper(models.Model):
+ _name = "stock.picking.product.kit.helper"
+ _description = """
+ Product Kit Helper, allow user to specify quantity of product kit,
+ to explode as product quantity in operations tab
+ """
+
+ picking_id = fields.Many2one(
+ comodel_name="stock.picking",
+ string="Picking",
+ required=True,
+ index=True,
+ ondelete="cascade",
+ )
+ sale_line_id = fields.Many2one(
+ comodel_name="sale.order.line", string="Sales Order Line", required=True
+ )
+ product_id = fields.Many2one(
+ comodel_name="product.product", string="Product", required=True, readonly=True
+ )
+ product_uom_qty = fields.Float(string="Quantity")
+ product_uom = fields.Many2one(
+ comodel_name="uom.uom",
+ string="Unit of Measure",
+ related="sale_line_id.product_uom",
+ readonly=True,
+ )
+
+ def action_explode_helper(self):
+ """Explodes product kit quantity to detailed product in stock move."""
+ self.ensure_one()
+ # Mock stock.move, in order to resue stock.move's action_explode
+ StockMove = self.env["stock.move"]
+ mock_loc = self.env["stock.location"].sudo().search([], limit=1)
+ mock_pt = self.env["stock.picking.type"].sudo().search([], limit=1)
+ mock_stock_move = StockMove.sudo().create(
+ {
+ "name": "/",
+ "product_id": self.product_id.id,
+ "product_uom": self.product_uom.id,
+ "product_uom_qty": self.product_uom_qty,
+ "picking_type_id": mock_pt.id,
+ "location_id": mock_loc.id,
+ "location_dest_id": mock_loc.id,
+ }
+ )
+ # Reuse explode function and assign quantity_done in stock.move
+ mock_processed_moves = mock_stock_move.action_explode()
+ for mock_move in mock_processed_moves:
+ stock_move = StockMove.search(
+ [
+ ("picking_id", "=", self.picking_id.id),
+ ("sale_line_id", "=", self.sale_line_id.id),
+ ("product_id", "=", mock_move.product_id.id),
+ ]
+ )
+ if not stock_move:
+ continue
+ if len(stock_move) != 1:
+ raise ValidationError(
+ _("No matching detailed product %s for product kit %s")
+ % (mock_move.product_id.display_name, self.product_id.display_name)
+ )
+ stock_move.write({"quantity_done": mock_move.product_uom_qty})
+ mock_processed_moves.sudo().unlink()
diff --git a/stock_picking_product_kit_helper/readme/CONTRIBUTORS.rst b/stock_picking_product_kit_helper/readme/CONTRIBUTORS.rst
new file mode 100644
index 000000000..00cf217c1
--- /dev/null
+++ b/stock_picking_product_kit_helper/readme/CONTRIBUTORS.rst
@@ -0,0 +1,4 @@
+* `Ecosoft `__:
+
+ * Kitti Upariphutthiphong
+ * Pimolnat Suntian
diff --git a/stock_picking_product_kit_helper/readme/DESCRIPTION.rst b/stock_picking_product_kit_helper/readme/DESCRIPTION.rst
new file mode 100644
index 000000000..2dfff1bdd
--- /dev/null
+++ b/stock_picking_product_kit_helper/readme/DESCRIPTION.rst
@@ -0,0 +1,6 @@
+When sales order contain product kits (product with BOM of type kit),
+the delivery order (stock.move) created by it will be exploded to multiple product lines.
+
+Normally, to partially deliver, user will calculate manually the quantity of each product lines to delivery.
+
+This module add new tab "Product Kit Help" to help in calculate quantity in product line with ease.
diff --git a/stock_picking_product_kit_helper/readme/HISTORY.rst b/stock_picking_product_kit_helper/readme/HISTORY.rst
new file mode 100644
index 000000000..11e654b98
--- /dev/null
+++ b/stock_picking_product_kit_helper/readme/HISTORY.rst
@@ -0,0 +1,9 @@
+13.0.1.0.0 (2020-01-09)
+~~~~~~~~~~~~~~~~~~~~~~~
+
+Migrated to odoo 13.
+
+12.0.1.0.0 (2019-06-17)
+~~~~~~~~~~~~~~~~~~~~~~~
+
+First version.
diff --git a/stock_picking_product_kit_helper/readme/USAGE.rst b/stock_picking_product_kit_helper/readme/USAGE.rst
new file mode 100644
index 000000000..843e025c6
--- /dev/null
+++ b/stock_picking_product_kit_helper/readme/USAGE.rst
@@ -0,0 +1,9 @@
+When origin sales order of the underlining delivery order contains at least 1 product kit,
+the tab "Product Kit Helper" will appear.
+
+To use the helper, go to the "Product Kit Helper" tab,
+
+#. Click => Show Product Kit
+#. Edit and fill in required quantity
+#. Click Assign Operation Quantity
+#. Check result in Operations tab
diff --git a/stock_picking_product_kit_helper/security/ir.model.access.csv b/stock_picking_product_kit_helper/security/ir.model.access.csv
new file mode 100644
index 000000000..3fb613bd4
--- /dev/null
+++ b/stock_picking_product_kit_helper/security/ir.model.access.csv
@@ -0,0 +1,2 @@
+id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
+access_stock_picking_product_kit_helper_user,stock.picking.product.kit.helper user,model_stock_picking_product_kit_helper,stock.group_stock_user,1,1,1,1
diff --git a/stock_picking_product_kit_helper/static/description/icon.png b/stock_picking_product_kit_helper/static/description/icon.png
new file mode 100644
index 000000000..3a0328b51
Binary files /dev/null and b/stock_picking_product_kit_helper/static/description/icon.png differ
diff --git a/stock_picking_product_kit_helper/static/description/icon.svg b/stock_picking_product_kit_helper/static/description/icon.svg
new file mode 100644
index 000000000..a7a26d093
--- /dev/null
+++ b/stock_picking_product_kit_helper/static/description/icon.svg
@@ -0,0 +1,79 @@
+
+
+
+
diff --git a/stock_picking_product_kit_helper/static/description/index.html b/stock_picking_product_kit_helper/static/description/index.html
new file mode 100644
index 000000000..b7d862f1a
--- /dev/null
+++ b/stock_picking_product_kit_helper/static/description/index.html
@@ -0,0 +1,457 @@
+
+
+
+
+
+
+Stock Picking Product Kit Helper
+
+
+
+
+
Stock Picking Product Kit Helper
+
+
+
+
When sales order contain product kits (product with BOM of type kit),
+the delivery order (stock.move) created by it will be exploded to multiple product lines.
+
Normally, to partially deliver, user will calculate manually the quantity of each product lines to delivery.
+
This module add new tab “Product Kit Help” to help in calculate quantity in product line with ease.
Bugs are tracked on GitHub Issues.
+In case of trouble, please check there if your issue has already been reported.
+If you spotted it first, help us smashing it by providing a detailed and welcomed
+feedback.
+
Do not contact contributors directly about support or help with technical issues.
OCA, or the Odoo Community Association, is a nonprofit organization whose
+mission is to support the collaborative development of Odoo features and
+promote its widespread use.