From 9deec91ec2f0742c933d0eacc7a8d8695b6414bb Mon Sep 17 00:00:00 2001
From: Oliver <oliver.henry.walters@gmail.com>
Date: Fri, 15 Sep 2023 10:41:07 +1000
Subject: [PATCH] New Crowdin updates (#5535)

* updated translation base

* Fix: New translations django.po from Crowdin

* Fix: New translations messages.po from Crowdin

* Fix: New translations django.po from Crowdin

* Fix: New translations messages.po from Crowdin

* Fix: New translations django.po from Crowdin

* Fix: New translations messages.po from Crowdin

* Fix: New translations django.po from Crowdin

* Fix: New translations messages.po from Crowdin

* Fix: New translations django.po from Crowdin

* Fix: New translations messages.po from Crowdin

* Fix: New translations django.po from Crowdin

* Fix: New translations messages.po from Crowdin

* Fix: New translations django.po from Crowdin

* Fix: New translations messages.po from Crowdin

* Fix: New translations django.po from Crowdin

* Fix: New translations messages.po from Crowdin

* Fix: New translations django.po from Crowdin

* Fix: New translations messages.po from Crowdin

* Fix: New translations django.po from Crowdin

* Fix: New translations messages.po from Crowdin

* Fix: New translations django.po from Crowdin

* Fix: New translations messages.po from Crowdin

* Fix: New translations django.po from Crowdin

* Fix: New translations messages.po from Crowdin

* Fix: New translations django.po from Crowdin

* Fix: New translations messages.po from Crowdin

* Fix: New translations django.po from Crowdin

* Fix: New translations messages.po from Crowdin

* Fix: New translations django.po from Crowdin

* Fix: New translations messages.po from Crowdin

* Fix: New translations django.po from Crowdin

* Fix: New translations messages.po from Crowdin

* Fix: New translations django.po from Crowdin

* Fix: New translations messages.po from Crowdin

* Fix: New translations django.po from Crowdin

* Fix: New translations messages.po from Crowdin

* Fix: New translations django.po from Crowdin

* Fix: New translations messages.po from Crowdin

* Fix: New translations django.po from Crowdin

* Fix: New translations messages.po from Crowdin

* Fix: New translations django.po from Crowdin

* Fix: New translations messages.po from Crowdin

* Fix: New translations django.po from Crowdin

* Fix: New translations messages.po from Crowdin

* Fix: New translations django.po from Crowdin

* Fix: New translations messages.po from Crowdin

* Fix: New translations django.po from Crowdin

* Fix: New translations messages.po from Crowdin

* Fix: New translations django.po from Crowdin

* Fix: New translations messages.po from Crowdin

* Fix: New translations django.po from Crowdin

* Fix: New translations messages.po from Crowdin

* Fix: New translations django.po from Crowdin

* Fix: New translations messages.po from Crowdin

* Fix: New translations django.po from Crowdin

* Fix: New translations messages.po from Crowdin

* Fix: New translations django.po from Crowdin

* Fix: New translations messages.po from Crowdin

---------

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
---
 InvenTree/locale/cs/LC_MESSAGES/django.po     |  28 +-
 InvenTree/locale/da/LC_MESSAGES/django.po     |  28 +-
 InvenTree/locale/de/LC_MESSAGES/django.po     |  28 +-
 InvenTree/locale/el/LC_MESSAGES/django.po     |  28 +-
 InvenTree/locale/en/LC_MESSAGES/django.po     |  96 ++--
 InvenTree/locale/es/LC_MESSAGES/django.po     |  28 +-
 InvenTree/locale/es_MX/LC_MESSAGES/django.po  |  96 ++--
 InvenTree/locale/fa/LC_MESSAGES/django.po     |  28 +-
 InvenTree/locale/fi/LC_MESSAGES/django.po     |  28 +-
 InvenTree/locale/fr/LC_MESSAGES/django.po     |  28 +-
 InvenTree/locale/he/LC_MESSAGES/django.po     |  28 +-
 InvenTree/locale/hi/LC_MESSAGES/django.po     |  28 +-
 InvenTree/locale/hu/LC_MESSAGES/django.po     |  28 +-
 InvenTree/locale/id/LC_MESSAGES/django.po     |  28 +-
 InvenTree/locale/it/LC_MESSAGES/django.po     |  28 +-
 InvenTree/locale/ja/LC_MESSAGES/django.po     |  28 +-
 InvenTree/locale/ko/LC_MESSAGES/django.po     |  28 +-
 InvenTree/locale/nl/LC_MESSAGES/django.po     |  28 +-
 InvenTree/locale/no/LC_MESSAGES/django.po     |  28 +-
 InvenTree/locale/pl/LC_MESSAGES/django.po     |  28 +-
 InvenTree/locale/pt/LC_MESSAGES/django.po     |  28 +-
 InvenTree/locale/pt_br/LC_MESSAGES/django.po  |  96 ++--
 InvenTree/locale/ru/LC_MESSAGES/django.po     |  28 +-
 InvenTree/locale/sl/LC_MESSAGES/django.po     |  28 +-
 InvenTree/locale/sv/LC_MESSAGES/django.po     |  28 +-
 InvenTree/locale/th/LC_MESSAGES/django.po     |  28 +-
 InvenTree/locale/tr/LC_MESSAGES/django.po     |  28 +-
 InvenTree/locale/vi/LC_MESSAGES/django.po     |  28 +-
 InvenTree/locale/zh/LC_MESSAGES/django.po     |  28 +-
 .../locale/zh_Hans/LC_MESSAGES/django.po      |  98 ++--
 .../locale/zh_hant/LC_MESSAGES/django.po      |  96 ++--
 src/frontend/src/locales/cs/messages.po       | 204 +++++--
 src/frontend/src/locales/da/messages.po       | 204 +++++--
 src/frontend/src/locales/de/messages.po       | 204 +++++--
 src/frontend/src/locales/el/messages.po       | 204 +++++--
 src/frontend/src/locales/en/messages.po       | 514 ++++++++++++++----
 src/frontend/src/locales/es/messages.po       | 204 +++++--
 src/frontend/src/locales/fa/messages.po       | 204 +++++--
 src/frontend/src/locales/fi/messages.po       | 204 +++++--
 src/frontend/src/locales/fr/messages.po       | 204 +++++--
 src/frontend/src/locales/he/messages.po       | 204 +++++--
 src/frontend/src/locales/hi/messages.po       | 204 +++++--
 src/frontend/src/locales/hu/messages.po       | 204 +++++--
 src/frontend/src/locales/id/messages.po       | 204 +++++--
 src/frontend/src/locales/it/messages.po       | 204 +++++--
 src/frontend/src/locales/ja/messages.po       | 204 +++++--
 src/frontend/src/locales/ko/messages.po       | 204 +++++--
 src/frontend/src/locales/nl/messages.po       | 204 +++++--
 src/frontend/src/locales/no/messages.po       | 204 +++++--
 src/frontend/src/locales/pl/messages.po       | 204 +++++--
 .../src/locales/pseudo-LOCALE/messages.po     | 512 +++++++++++++----
 src/frontend/src/locales/pt/messages.po       | 206 +++++--
 src/frontend/src/locales/ru/messages.po       | 204 +++++--
 src/frontend/src/locales/sl/messages.po       | 204 +++++--
 src/frontend/src/locales/sv/messages.po       | 206 +++++--
 src/frontend/src/locales/th/messages.po       | 204 +++++--
 src/frontend/src/locales/tr/messages.po       | 204 +++++--
 src/frontend/src/locales/vi/messages.po       | 204 +++++--
 src/frontend/src/locales/zh/messages.po       | 204 +++++--
 59 files changed, 5840 insertions(+), 1704 deletions(-)

diff --git a/InvenTree/locale/cs/LC_MESSAGES/django.po b/InvenTree/locale/cs/LC_MESSAGES/django.po
index 91365ba5e8..ca06792ab9 100644
--- a/InvenTree/locale/cs/LC_MESSAGES/django.po
+++ b/InvenTree/locale/cs/LC_MESSAGES/django.po
@@ -2,8 +2,8 @@ msgid ""
 msgstr ""
 "Project-Id-Version: inventree\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2023-09-10 11:39+0000\n"
-"PO-Revision-Date: 2023-09-10 23:39\n"
+"POT-Creation-Date: 2023-09-12 01:47+0000\n"
+"PO-Revision-Date: 2023-09-14 01:14\n"
 "Last-Translator: \n"
 "Language-Team: Czech\n"
 "Language: cs_CZ\n"
@@ -21,7 +21,7 @@ msgstr ""
 msgid "API endpoint not found"
 msgstr "API endpoint nebyl nalezen"
 
-#: InvenTree/api.py:329
+#: InvenTree/api.py:335
 msgid "User does not have permission to view this model"
 msgstr "Uživatel nemá právo zobrazit tento model"
 
@@ -1771,7 +1771,7 @@ msgid "Completed Outputs"
 msgstr ""
 
 #: build/templates/build/build_base.html:191
-#: build/templates/build/detail.html:101 order/api.py:1454 order/models.py:1317
+#: build/templates/build/detail.html:101 order/api.py:1442 order/models.py:1317
 #: order/models.py:1416 order/models.py:1564
 #: order/templates/order/sales_order_base.html:9
 #: order/templates/order/sales_order_base.html:28
@@ -4469,7 +4469,7 @@ msgstr ""
 msgid "No matching purchase order found"
 msgstr ""
 
-#: order/api.py:1452 order/models.py:1191 order/models.py:1275
+#: order/api.py:1440 order/models.py:1191 order/models.py:1275
 #: order/templates/order/order_base.html:9
 #: order/templates/order/order_base.html:18
 #: report/templates/report/inventree_po_report_base.html:14
@@ -4483,7 +4483,7 @@ msgstr ""
 msgid "Purchase Order"
 msgstr ""
 
-#: order/api.py:1456 order/models.py:1922 order/models.py:1968
+#: order/api.py:1444 order/models.py:1922 order/models.py:1968
 #: order/templates/order/return_order_base.html:9
 #: order/templates/order/return_order_base.html:28
 #: report/templates/report/inventree_return_order_report_base.html:13
@@ -4492,7 +4492,7 @@ msgstr ""
 msgid "Return Order"
 msgstr ""
 
-#: order/api.py:1458 templates/js/translated/sales_order.js:1039
+#: order/api.py:1446 templates/js/translated/sales_order.js:1039
 msgid "Unknown"
 msgstr ""
 
@@ -5545,31 +5545,31 @@ msgstr ""
 msgid "Maximum Price"
 msgstr ""
 
-#: part/api.py:501
+#: part/api.py:497
 msgid "Incoming Purchase Order"
 msgstr ""
 
-#: part/api.py:521
+#: part/api.py:517
 msgid "Outgoing Sales Order"
 msgstr ""
 
-#: part/api.py:539
+#: part/api.py:535
 msgid "Stock produced by Build Order"
 msgstr ""
 
-#: part/api.py:625
+#: part/api.py:621
 msgid "Stock required for Build Order"
 msgstr ""
 
-#: part/api.py:773
+#: part/api.py:769
 msgid "Valid"
 msgstr ""
 
-#: part/api.py:774
+#: part/api.py:770
 msgid "Validate entire Bill of Materials"
 msgstr ""
 
-#: part/api.py:780
+#: part/api.py:776
 msgid "This option must be selected"
 msgstr ""
 
diff --git a/InvenTree/locale/da/LC_MESSAGES/django.po b/InvenTree/locale/da/LC_MESSAGES/django.po
index 9928f66cc5..89525bffcd 100644
--- a/InvenTree/locale/da/LC_MESSAGES/django.po
+++ b/InvenTree/locale/da/LC_MESSAGES/django.po
@@ -2,8 +2,8 @@ msgid ""
 msgstr ""
 "Project-Id-Version: inventree\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2023-09-10 11:39+0000\n"
-"PO-Revision-Date: 2023-09-10 23:40\n"
+"POT-Creation-Date: 2023-09-12 01:47+0000\n"
+"PO-Revision-Date: 2023-09-14 01:14\n"
 "Last-Translator: \n"
 "Language-Team: Danish\n"
 "Language: da_DK\n"
@@ -21,7 +21,7 @@ msgstr ""
 msgid "API endpoint not found"
 msgstr "API endpoint ikke fundet"
 
-#: InvenTree/api.py:329
+#: InvenTree/api.py:335
 msgid "User does not have permission to view this model"
 msgstr ""
 
@@ -1771,7 +1771,7 @@ msgid "Completed Outputs"
 msgstr ""
 
 #: build/templates/build/build_base.html:191
-#: build/templates/build/detail.html:101 order/api.py:1454 order/models.py:1317
+#: build/templates/build/detail.html:101 order/api.py:1442 order/models.py:1317
 #: order/models.py:1416 order/models.py:1564
 #: order/templates/order/sales_order_base.html:9
 #: order/templates/order/sales_order_base.html:28
@@ -4469,7 +4469,7 @@ msgstr ""
 msgid "No matching purchase order found"
 msgstr ""
 
-#: order/api.py:1452 order/models.py:1191 order/models.py:1275
+#: order/api.py:1440 order/models.py:1191 order/models.py:1275
 #: order/templates/order/order_base.html:9
 #: order/templates/order/order_base.html:18
 #: report/templates/report/inventree_po_report_base.html:14
@@ -4483,7 +4483,7 @@ msgstr ""
 msgid "Purchase Order"
 msgstr ""
 
-#: order/api.py:1456 order/models.py:1922 order/models.py:1968
+#: order/api.py:1444 order/models.py:1922 order/models.py:1968
 #: order/templates/order/return_order_base.html:9
 #: order/templates/order/return_order_base.html:28
 #: report/templates/report/inventree_return_order_report_base.html:13
@@ -4492,7 +4492,7 @@ msgstr ""
 msgid "Return Order"
 msgstr ""
 
-#: order/api.py:1458 templates/js/translated/sales_order.js:1039
+#: order/api.py:1446 templates/js/translated/sales_order.js:1039
 msgid "Unknown"
 msgstr ""
 
@@ -5545,31 +5545,31 @@ msgstr ""
 msgid "Maximum Price"
 msgstr ""
 
-#: part/api.py:501
+#: part/api.py:497
 msgid "Incoming Purchase Order"
 msgstr ""
 
-#: part/api.py:521
+#: part/api.py:517
 msgid "Outgoing Sales Order"
 msgstr ""
 
-#: part/api.py:539
+#: part/api.py:535
 msgid "Stock produced by Build Order"
 msgstr ""
 
-#: part/api.py:625
+#: part/api.py:621
 msgid "Stock required for Build Order"
 msgstr ""
 
-#: part/api.py:773
+#: part/api.py:769
 msgid "Valid"
 msgstr ""
 
-#: part/api.py:774
+#: part/api.py:770
 msgid "Validate entire Bill of Materials"
 msgstr ""
 
-#: part/api.py:780
+#: part/api.py:776
 msgid "This option must be selected"
 msgstr ""
 
diff --git a/InvenTree/locale/de/LC_MESSAGES/django.po b/InvenTree/locale/de/LC_MESSAGES/django.po
index 157b2f9461..6a958118b2 100644
--- a/InvenTree/locale/de/LC_MESSAGES/django.po
+++ b/InvenTree/locale/de/LC_MESSAGES/django.po
@@ -2,8 +2,8 @@ msgid ""
 msgstr ""
 "Project-Id-Version: inventree\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2023-09-10 11:39+0000\n"
-"PO-Revision-Date: 2023-09-10 23:40\n"
+"POT-Creation-Date: 2023-09-12 01:47+0000\n"
+"PO-Revision-Date: 2023-09-14 01:14\n"
 "Last-Translator: \n"
 "Language-Team: German\n"
 "Language: de_DE\n"
@@ -21,7 +21,7 @@ msgstr ""
 msgid "API endpoint not found"
 msgstr "API-Endpunkt nicht gefunden"
 
-#: InvenTree/api.py:329
+#: InvenTree/api.py:335
 msgid "User does not have permission to view this model"
 msgstr "Benutzer hat keine Berechtigung, dieses Modell anzuzeigen"
 
@@ -1771,7 +1771,7 @@ msgid "Completed Outputs"
 msgstr "Fertiggestellte Endprodukte"
 
 #: build/templates/build/build_base.html:191
-#: build/templates/build/detail.html:101 order/api.py:1454 order/models.py:1317
+#: build/templates/build/detail.html:101 order/api.py:1442 order/models.py:1317
 #: order/models.py:1416 order/models.py:1564
 #: order/templates/order/sales_order_base.html:9
 #: order/templates/order/sales_order_base.html:28
@@ -4469,7 +4469,7 @@ msgstr "Gesamtpreis"
 msgid "No matching purchase order found"
 msgstr "Keine passende Bestellung gefunden"
 
-#: order/api.py:1452 order/models.py:1191 order/models.py:1275
+#: order/api.py:1440 order/models.py:1191 order/models.py:1275
 #: order/templates/order/order_base.html:9
 #: order/templates/order/order_base.html:18
 #: report/templates/report/inventree_po_report_base.html:14
@@ -4483,7 +4483,7 @@ msgstr "Keine passende Bestellung gefunden"
 msgid "Purchase Order"
 msgstr "Bestellung"
 
-#: order/api.py:1456 order/models.py:1922 order/models.py:1968
+#: order/api.py:1444 order/models.py:1922 order/models.py:1968
 #: order/templates/order/return_order_base.html:9
 #: order/templates/order/return_order_base.html:28
 #: report/templates/report/inventree_return_order_report_base.html:13
@@ -4492,7 +4492,7 @@ msgstr "Bestellung"
 msgid "Return Order"
 msgstr "Rücksendeauftrag"
 
-#: order/api.py:1458 templates/js/translated/sales_order.js:1039
+#: order/api.py:1446 templates/js/translated/sales_order.js:1039
 msgid "Unknown"
 msgstr "Unbekannt"
 
@@ -5545,31 +5545,31 @@ msgstr "Niedrigster Preis"
 msgid "Maximum Price"
 msgstr "Höchster Preis"
 
-#: part/api.py:501
+#: part/api.py:497
 msgid "Incoming Purchase Order"
 msgstr "Eingehende Bestellung"
 
-#: part/api.py:521
+#: part/api.py:517
 msgid "Outgoing Sales Order"
 msgstr "Ausgehender Auftrag"
 
-#: part/api.py:539
+#: part/api.py:535
 msgid "Stock produced by Build Order"
 msgstr "Lagerartikel produziert von Bauauftrag"
 
-#: part/api.py:625
+#: part/api.py:621
 msgid "Stock required for Build Order"
 msgstr "Lagerartikel für Bauauftrag benötigt"
 
-#: part/api.py:773
+#: part/api.py:769
 msgid "Valid"
 msgstr "Gültig"
 
-#: part/api.py:774
+#: part/api.py:770
 msgid "Validate entire Bill of Materials"
 msgstr "Gesamte Stückliste validieren"
 
-#: part/api.py:780
+#: part/api.py:776
 msgid "This option must be selected"
 msgstr "Diese Option muss ausgewählt werden"
 
diff --git a/InvenTree/locale/el/LC_MESSAGES/django.po b/InvenTree/locale/el/LC_MESSAGES/django.po
index 519cab6113..457ed1d845 100644
--- a/InvenTree/locale/el/LC_MESSAGES/django.po
+++ b/InvenTree/locale/el/LC_MESSAGES/django.po
@@ -2,8 +2,8 @@ msgid ""
 msgstr ""
 "Project-Id-Version: inventree\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2023-09-10 11:39+0000\n"
-"PO-Revision-Date: 2023-09-10 23:40\n"
+"POT-Creation-Date: 2023-09-12 01:47+0000\n"
+"PO-Revision-Date: 2023-09-14 01:14\n"
 "Last-Translator: \n"
 "Language-Team: Greek\n"
 "Language: el_GR\n"
@@ -21,7 +21,7 @@ msgstr ""
 msgid "API endpoint not found"
 msgstr "Το API endpoint δε βρέθηκε"
 
-#: InvenTree/api.py:329
+#: InvenTree/api.py:335
 msgid "User does not have permission to view this model"
 msgstr "Δεν έχετε δικαιώματα να το δείτε αυτό"
 
@@ -1771,7 +1771,7 @@ msgid "Completed Outputs"
 msgstr ""
 
 #: build/templates/build/build_base.html:191
-#: build/templates/build/detail.html:101 order/api.py:1454 order/models.py:1317
+#: build/templates/build/detail.html:101 order/api.py:1442 order/models.py:1317
 #: order/models.py:1416 order/models.py:1564
 #: order/templates/order/sales_order_base.html:9
 #: order/templates/order/sales_order_base.html:28
@@ -4469,7 +4469,7 @@ msgstr ""
 msgid "No matching purchase order found"
 msgstr ""
 
-#: order/api.py:1452 order/models.py:1191 order/models.py:1275
+#: order/api.py:1440 order/models.py:1191 order/models.py:1275
 #: order/templates/order/order_base.html:9
 #: order/templates/order/order_base.html:18
 #: report/templates/report/inventree_po_report_base.html:14
@@ -4483,7 +4483,7 @@ msgstr ""
 msgid "Purchase Order"
 msgstr ""
 
-#: order/api.py:1456 order/models.py:1922 order/models.py:1968
+#: order/api.py:1444 order/models.py:1922 order/models.py:1968
 #: order/templates/order/return_order_base.html:9
 #: order/templates/order/return_order_base.html:28
 #: report/templates/report/inventree_return_order_report_base.html:13
@@ -4492,7 +4492,7 @@ msgstr ""
 msgid "Return Order"
 msgstr ""
 
-#: order/api.py:1458 templates/js/translated/sales_order.js:1039
+#: order/api.py:1446 templates/js/translated/sales_order.js:1039
 msgid "Unknown"
 msgstr ""
 
@@ -5545,31 +5545,31 @@ msgstr ""
 msgid "Maximum Price"
 msgstr ""
 
-#: part/api.py:501
+#: part/api.py:497
 msgid "Incoming Purchase Order"
 msgstr ""
 
-#: part/api.py:521
+#: part/api.py:517
 msgid "Outgoing Sales Order"
 msgstr ""
 
-#: part/api.py:539
+#: part/api.py:535
 msgid "Stock produced by Build Order"
 msgstr ""
 
-#: part/api.py:625
+#: part/api.py:621
 msgid "Stock required for Build Order"
 msgstr ""
 
-#: part/api.py:773
+#: part/api.py:769
 msgid "Valid"
 msgstr ""
 
-#: part/api.py:774
+#: part/api.py:770
 msgid "Validate entire Bill of Materials"
 msgstr ""
 
-#: part/api.py:780
+#: part/api.py:776
 msgid "This option must be selected"
 msgstr ""
 
diff --git a/InvenTree/locale/en/LC_MESSAGES/django.po b/InvenTree/locale/en/LC_MESSAGES/django.po
index 48475ef310..8d66a438c0 100644
--- a/InvenTree/locale/en/LC_MESSAGES/django.po
+++ b/InvenTree/locale/en/LC_MESSAGES/django.po
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2023-09-07 23:12+0000\n"
+"POT-Creation-Date: 2023-09-12 06:37+0000\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -22,7 +22,7 @@ msgstr ""
 msgid "API endpoint not found"
 msgstr ""
 
-#: InvenTree/api.py:329
+#: InvenTree/api.py:335
 msgid "User does not have permission to view this model"
 msgstr ""
 
@@ -62,10 +62,10 @@ msgstr ""
 #: order/templates/order/so_sidebar.html:17 part/admin.py:41
 #: part/models.py:3042 part/templates/part/part_sidebar.html:63
 #: report/templates/report/inventree_build_order_base.html:172
-#: stock/admin.py:121 stock/models.py:2160 stock/models.py:2268
+#: stock/admin.py:121 stock/models.py:2191 stock/models.py:2299
 #: stock/serializers.py:408 stock/serializers.py:542 stock/serializers.py:623
 #: stock/serializers.py:681 stock/serializers.py:956 stock/serializers.py:1055
-#: stock/serializers.py:1187 stock/templates/stock/stock_sidebar.html:25
+#: stock/serializers.py:1216 stock/templates/stock/stock_sidebar.html:25
 #: templates/js/translated/barcode.js:143 templates/js/translated/bom.js:1254
 #: templates/js/translated/company.js:1715 templates/js/translated/order.js:347
 #: templates/js/translated/part.js:1057
@@ -258,7 +258,7 @@ msgstr ""
 msgid "Missing external link"
 msgstr ""
 
-#: InvenTree/models.py:486 stock/models.py:2262
+#: InvenTree/models.py:486 stock/models.py:2293
 #: templates/js/translated/attachment.js:119
 #: templates/js/translated/attachment.js:326
 msgid "Attachment"
@@ -1099,7 +1099,8 @@ msgid "Build status code"
 msgstr ""
 
 #: build/models.py:250 build/serializers.py:277 order/serializers.py:512
-#: stock/models.py:739 templates/js/translated/purchase_order.js:1114
+#: stock/models.py:739 stock/serializers.py:1180
+#: templates/js/translated/purchase_order.js:1114
 msgid "Batch Code"
 msgstr ""
 
@@ -1399,7 +1400,7 @@ msgstr ""
 #: build/serializers.py:423 build/serializers.py:496 order/serializers.py:493
 #: order/serializers.py:612 order/serializers.py:1616 part/serializers.py:933
 #: stock/serializers.py:401 stock/serializers.py:537 stock/serializers.py:618
-#: stock/serializers.py:1048 stock/serializers.py:1290
+#: stock/serializers.py:1048 stock/serializers.py:1319
 #: stock/templates/stock/item_base.html:395
 #: templates/js/translated/barcode.js:530
 #: templates/js/translated/barcode.js:778 templates/js/translated/build.js:980
@@ -1439,7 +1440,8 @@ msgstr ""
 #: build/serializers.py:503 build/templates/build/build_base.html:152
 #: build/templates/build/detail.html:62 order/models.py:804
 #: order/models.py:1763 order/serializers.py:530 stock/admin.py:106
-#: stock/serializers.py:677 stock/templates/stock/item_base.html:428
+#: stock/serializers.py:677 stock/serializers.py:1187
+#: stock/templates/stock/item_base.html:428
 #: templates/js/translated/barcode.js:252 templates/js/translated/build.js:2161
 #: templates/js/translated/purchase_order.js:1293
 #: templates/js/translated/purchase_order.js:1697
@@ -1770,7 +1772,7 @@ msgid "Completed Outputs"
 msgstr ""
 
 #: build/templates/build/build_base.html:191
-#: build/templates/build/detail.html:101 order/api.py:1454 order/models.py:1317
+#: build/templates/build/detail.html:101 order/api.py:1442 order/models.py:1317
 #: order/models.py:1416 order/models.py:1564
 #: order/templates/order/sales_order_base.html:9
 #: order/templates/order/sales_order_base.html:28
@@ -3788,7 +3790,7 @@ msgstr ""
 
 #: company/models.py:546
 #: report/templates/report/inventree_test_report_base.html:104
-#: stock/models.py:2255 templates/js/translated/company.js:1197
+#: stock/models.py:2286 templates/js/translated/company.js:1197
 #: templates/js/translated/company.js:1450 templates/js/translated/part.js:1469
 #: templates/js/translated/stock.js:1464
 msgid "Value"
@@ -3885,7 +3887,7 @@ msgid "Minimum charge (e.g. stocking fee)"
 msgstr ""
 
 #: company/models.py:752 company/templates/company/supplier_part.html:161
-#: stock/admin.py:119 stock/models.py:701
+#: stock/admin.py:119 stock/models.py:701 stock/serializers.py:1195
 #: stock/templates/stock/item_base.html:241
 #: templates/js/translated/company.js:1677
 #: templates/js/translated/stock.js:2356
@@ -4468,7 +4470,7 @@ msgstr ""
 msgid "No matching purchase order found"
 msgstr ""
 
-#: order/api.py:1452 order/models.py:1191 order/models.py:1275
+#: order/api.py:1440 order/models.py:1191 order/models.py:1275
 #: order/templates/order/order_base.html:9
 #: order/templates/order/order_base.html:18
 #: report/templates/report/inventree_po_report_base.html:14
@@ -4482,7 +4484,7 @@ msgstr ""
 msgid "Purchase Order"
 msgstr ""
 
-#: order/api.py:1456 order/models.py:1922 order/models.py:1968
+#: order/api.py:1444 order/models.py:1922 order/models.py:1968
 #: order/templates/order/return_order_base.html:9
 #: order/templates/order/return_order_base.html:28
 #: report/templates/report/inventree_return_order_report_base.html:13
@@ -4491,7 +4493,7 @@ msgstr ""
 msgid "Return Order"
 msgstr ""
 
-#: order/api.py:1458 templates/js/translated/sales_order.js:1039
+#: order/api.py:1446 templates/js/translated/sales_order.js:1039
 msgid "Unknown"
 msgstr ""
 
@@ -5544,31 +5546,31 @@ msgstr ""
 msgid "Maximum Price"
 msgstr ""
 
-#: part/api.py:501
+#: part/api.py:497
 msgid "Incoming Purchase Order"
 msgstr ""
 
-#: part/api.py:521
+#: part/api.py:517
 msgid "Outgoing Sales Order"
 msgstr ""
 
-#: part/api.py:539
+#: part/api.py:535
 msgid "Stock produced by Build Order"
 msgstr ""
 
-#: part/api.py:625
+#: part/api.py:621
 msgid "Stock required for Build Order"
 msgstr ""
 
-#: part/api.py:773
+#: part/api.py:769
 msgid "Valid"
 msgstr ""
 
-#: part/api.py:774
+#: part/api.py:770
 msgid "Validate entire Bill of Materials"
 msgstr ""
 
-#: part/api.py:780
+#: part/api.py:776
 msgid "This option must be selected"
 msgstr ""
 
@@ -7378,35 +7380,35 @@ msgstr ""
 msgid "Plugin requires at most version {v}"
 msgstr ""
 
-#: plugin/samples/integration/sample.py:39
+#: plugin/samples/integration/sample.py:50
 msgid "Enable PO"
 msgstr ""
 
-#: plugin/samples/integration/sample.py:40
+#: plugin/samples/integration/sample.py:51
 msgid "Enable PO functionality in InvenTree interface"
 msgstr ""
 
-#: plugin/samples/integration/sample.py:45
+#: plugin/samples/integration/sample.py:56
 msgid "API Key"
 msgstr ""
 
-#: plugin/samples/integration/sample.py:46
+#: plugin/samples/integration/sample.py:57
 msgid "Key required for accessing external API"
 msgstr ""
 
-#: plugin/samples/integration/sample.py:50
+#: plugin/samples/integration/sample.py:61
 msgid "Numerical"
 msgstr ""
 
-#: plugin/samples/integration/sample.py:51
+#: plugin/samples/integration/sample.py:62
 msgid "A numerical setting"
 msgstr ""
 
-#: plugin/samples/integration/sample.py:56
+#: plugin/samples/integration/sample.py:67
 msgid "Choice Setting"
 msgstr ""
 
-#: plugin/samples/integration/sample.py:57
+#: plugin/samples/integration/sample.py:68
 msgid "A setting with multiple choices"
 msgstr ""
 
@@ -7618,12 +7620,12 @@ msgid "Test Results"
 msgstr ""
 
 #: report/templates/report/inventree_test_report_base.html:102
-#: stock/models.py:2243 templates/js/translated/stock.js:1437
+#: stock/models.py:2274 templates/js/translated/stock.js:1437
 msgid "Test"
 msgstr ""
 
 #: report/templates/report/inventree_test_report_base.html:103
-#: stock/models.py:2249
+#: stock/models.py:2280
 msgid "Result"
 msgstr ""
 
@@ -7833,7 +7835,7 @@ msgstr ""
 msgid "Where is this stock item located?"
 msgstr ""
 
-#: stock/models.py:702
+#: stock/models.py:702 stock/serializers.py:1196
 msgid "Packaging this stock item is stored in"
 msgstr ""
 
@@ -7845,7 +7847,7 @@ msgstr ""
 msgid "Serial number for this item"
 msgstr ""
 
-#: stock/models.py:741
+#: stock/models.py:741 stock/serializers.py:1181
 msgid "Batch code for this stock item"
 msgstr ""
 
@@ -7966,39 +7968,39 @@ msgstr ""
 msgid "Stock status codes must match"
 msgstr ""
 
-#: stock/models.py:1679
+#: stock/models.py:1702
 msgid "StockItem cannot be moved as it is not in stock"
 msgstr ""
 
-#: stock/models.py:2161
+#: stock/models.py:2192
 msgid "Entry notes"
 msgstr ""
 
-#: stock/models.py:2219
+#: stock/models.py:2250
 msgid "Value must be provided for this test"
 msgstr ""
 
-#: stock/models.py:2225
+#: stock/models.py:2256
 msgid "Attachment must be uploaded for this test"
 msgstr ""
 
-#: stock/models.py:2244
+#: stock/models.py:2275
 msgid "Test name"
 msgstr ""
 
-#: stock/models.py:2250
+#: stock/models.py:2281
 msgid "Test result"
 msgstr ""
 
-#: stock/models.py:2256
+#: stock/models.py:2287
 msgid "Test output value"
 msgstr ""
 
-#: stock/models.py:2263
+#: stock/models.py:2294
 msgid "Test result attachment"
 msgstr ""
 
-#: stock/models.py:2269
+#: stock/models.py:2300
 msgid "Test notes"
 msgstr ""
 
@@ -8027,7 +8029,7 @@ msgstr ""
 msgid "Enter serial numbers for new items"
 msgstr ""
 
-#: stock/serializers.py:402 stock/serializers.py:1049 stock/serializers.py:1291
+#: stock/serializers.py:402 stock/serializers.py:1049 stock/serializers.py:1320
 msgid "Destination stock location"
 msgstr ""
 
@@ -8104,7 +8106,7 @@ msgstr ""
 msgid "Stock assignment notes"
 msgstr ""
 
-#: stock/serializers.py:967 stock/serializers.py:1198
+#: stock/serializers.py:967 stock/serializers.py:1227
 msgid "A list of stock items must be provided"
 msgstr ""
 
@@ -8132,11 +8134,15 @@ msgstr ""
 msgid "At least two stock items must be provided"
 msgstr ""
 
-#: stock/serializers.py:1160
+#: stock/serializers.py:1167
 msgid "StockItem primary key value"
 msgstr ""
 
 #: stock/serializers.py:1188
+msgid "Stock item status code"
+msgstr ""
+
+#: stock/serializers.py:1217
 msgid "Stock transaction notes"
 msgstr ""
 
diff --git a/InvenTree/locale/es/LC_MESSAGES/django.po b/InvenTree/locale/es/LC_MESSAGES/django.po
index 2873ef8815..772e270d1c 100644
--- a/InvenTree/locale/es/LC_MESSAGES/django.po
+++ b/InvenTree/locale/es/LC_MESSAGES/django.po
@@ -2,8 +2,8 @@ msgid ""
 msgstr ""
 "Project-Id-Version: inventree\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2023-09-10 11:39+0000\n"
-"PO-Revision-Date: 2023-09-12 00:11\n"
+"POT-Creation-Date: 2023-09-12 01:47+0000\n"
+"PO-Revision-Date: 2023-09-14 01:15\n"
 "Last-Translator: \n"
 "Language-Team: Spanish, Mexico\n"
 "Language: es_MX\n"
@@ -21,7 +21,7 @@ msgstr ""
 msgid "API endpoint not found"
 msgstr "endpoint API no encontrado"
 
-#: InvenTree/api.py:329
+#: InvenTree/api.py:335
 msgid "User does not have permission to view this model"
 msgstr "El usuario no tiene permiso para ver este modelo"
 
@@ -1771,7 +1771,7 @@ msgid "Completed Outputs"
 msgstr "Salidas completadas"
 
 #: build/templates/build/build_base.html:191
-#: build/templates/build/detail.html:101 order/api.py:1454 order/models.py:1317
+#: build/templates/build/detail.html:101 order/api.py:1442 order/models.py:1317
 #: order/models.py:1416 order/models.py:1564
 #: order/templates/order/sales_order_base.html:9
 #: order/templates/order/sales_order_base.html:28
@@ -4469,7 +4469,7 @@ msgstr "Precio Total"
 msgid "No matching purchase order found"
 msgstr "No se encontró ninguna orden de compra coincidente"
 
-#: order/api.py:1452 order/models.py:1191 order/models.py:1275
+#: order/api.py:1440 order/models.py:1191 order/models.py:1275
 #: order/templates/order/order_base.html:9
 #: order/templates/order/order_base.html:18
 #: report/templates/report/inventree_po_report_base.html:14
@@ -4483,7 +4483,7 @@ msgstr "No se encontró ninguna orden de compra coincidente"
 msgid "Purchase Order"
 msgstr "Orden de compra"
 
-#: order/api.py:1456 order/models.py:1922 order/models.py:1968
+#: order/api.py:1444 order/models.py:1922 order/models.py:1968
 #: order/templates/order/return_order_base.html:9
 #: order/templates/order/return_order_base.html:28
 #: report/templates/report/inventree_return_order_report_base.html:13
@@ -4492,7 +4492,7 @@ msgstr "Orden de compra"
 msgid "Return Order"
 msgstr "Orden de devolución"
 
-#: order/api.py:1458 templates/js/translated/sales_order.js:1039
+#: order/api.py:1446 templates/js/translated/sales_order.js:1039
 msgid "Unknown"
 msgstr "Desconocido"
 
@@ -5545,31 +5545,31 @@ msgstr "Precio mínimo"
 msgid "Maximum Price"
 msgstr "Precio máximo"
 
-#: part/api.py:501
+#: part/api.py:497
 msgid "Incoming Purchase Order"
 msgstr "Orden de compra entrante"
 
-#: part/api.py:521
+#: part/api.py:517
 msgid "Outgoing Sales Order"
 msgstr "Orden de venta saliente"
 
-#: part/api.py:539
+#: part/api.py:535
 msgid "Stock produced by Build Order"
 msgstr ""
 
-#: part/api.py:625
+#: part/api.py:621
 msgid "Stock required for Build Order"
 msgstr ""
 
-#: part/api.py:773
+#: part/api.py:769
 msgid "Valid"
 msgstr "Válido"
 
-#: part/api.py:774
+#: part/api.py:770
 msgid "Validate entire Bill of Materials"
 msgstr "Validación de Lista de Materiales"
 
-#: part/api.py:780
+#: part/api.py:776
 msgid "This option must be selected"
 msgstr "Esta opción debe ser seleccionada"
 
diff --git a/InvenTree/locale/es_MX/LC_MESSAGES/django.po b/InvenTree/locale/es_MX/LC_MESSAGES/django.po
index 48475ef310..8d66a438c0 100644
--- a/InvenTree/locale/es_MX/LC_MESSAGES/django.po
+++ b/InvenTree/locale/es_MX/LC_MESSAGES/django.po
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2023-09-07 23:12+0000\n"
+"POT-Creation-Date: 2023-09-12 06:37+0000\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -22,7 +22,7 @@ msgstr ""
 msgid "API endpoint not found"
 msgstr ""
 
-#: InvenTree/api.py:329
+#: InvenTree/api.py:335
 msgid "User does not have permission to view this model"
 msgstr ""
 
@@ -62,10 +62,10 @@ msgstr ""
 #: order/templates/order/so_sidebar.html:17 part/admin.py:41
 #: part/models.py:3042 part/templates/part/part_sidebar.html:63
 #: report/templates/report/inventree_build_order_base.html:172
-#: stock/admin.py:121 stock/models.py:2160 stock/models.py:2268
+#: stock/admin.py:121 stock/models.py:2191 stock/models.py:2299
 #: stock/serializers.py:408 stock/serializers.py:542 stock/serializers.py:623
 #: stock/serializers.py:681 stock/serializers.py:956 stock/serializers.py:1055
-#: stock/serializers.py:1187 stock/templates/stock/stock_sidebar.html:25
+#: stock/serializers.py:1216 stock/templates/stock/stock_sidebar.html:25
 #: templates/js/translated/barcode.js:143 templates/js/translated/bom.js:1254
 #: templates/js/translated/company.js:1715 templates/js/translated/order.js:347
 #: templates/js/translated/part.js:1057
@@ -258,7 +258,7 @@ msgstr ""
 msgid "Missing external link"
 msgstr ""
 
-#: InvenTree/models.py:486 stock/models.py:2262
+#: InvenTree/models.py:486 stock/models.py:2293
 #: templates/js/translated/attachment.js:119
 #: templates/js/translated/attachment.js:326
 msgid "Attachment"
@@ -1099,7 +1099,8 @@ msgid "Build status code"
 msgstr ""
 
 #: build/models.py:250 build/serializers.py:277 order/serializers.py:512
-#: stock/models.py:739 templates/js/translated/purchase_order.js:1114
+#: stock/models.py:739 stock/serializers.py:1180
+#: templates/js/translated/purchase_order.js:1114
 msgid "Batch Code"
 msgstr ""
 
@@ -1399,7 +1400,7 @@ msgstr ""
 #: build/serializers.py:423 build/serializers.py:496 order/serializers.py:493
 #: order/serializers.py:612 order/serializers.py:1616 part/serializers.py:933
 #: stock/serializers.py:401 stock/serializers.py:537 stock/serializers.py:618
-#: stock/serializers.py:1048 stock/serializers.py:1290
+#: stock/serializers.py:1048 stock/serializers.py:1319
 #: stock/templates/stock/item_base.html:395
 #: templates/js/translated/barcode.js:530
 #: templates/js/translated/barcode.js:778 templates/js/translated/build.js:980
@@ -1439,7 +1440,8 @@ msgstr ""
 #: build/serializers.py:503 build/templates/build/build_base.html:152
 #: build/templates/build/detail.html:62 order/models.py:804
 #: order/models.py:1763 order/serializers.py:530 stock/admin.py:106
-#: stock/serializers.py:677 stock/templates/stock/item_base.html:428
+#: stock/serializers.py:677 stock/serializers.py:1187
+#: stock/templates/stock/item_base.html:428
 #: templates/js/translated/barcode.js:252 templates/js/translated/build.js:2161
 #: templates/js/translated/purchase_order.js:1293
 #: templates/js/translated/purchase_order.js:1697
@@ -1770,7 +1772,7 @@ msgid "Completed Outputs"
 msgstr ""
 
 #: build/templates/build/build_base.html:191
-#: build/templates/build/detail.html:101 order/api.py:1454 order/models.py:1317
+#: build/templates/build/detail.html:101 order/api.py:1442 order/models.py:1317
 #: order/models.py:1416 order/models.py:1564
 #: order/templates/order/sales_order_base.html:9
 #: order/templates/order/sales_order_base.html:28
@@ -3788,7 +3790,7 @@ msgstr ""
 
 #: company/models.py:546
 #: report/templates/report/inventree_test_report_base.html:104
-#: stock/models.py:2255 templates/js/translated/company.js:1197
+#: stock/models.py:2286 templates/js/translated/company.js:1197
 #: templates/js/translated/company.js:1450 templates/js/translated/part.js:1469
 #: templates/js/translated/stock.js:1464
 msgid "Value"
@@ -3885,7 +3887,7 @@ msgid "Minimum charge (e.g. stocking fee)"
 msgstr ""
 
 #: company/models.py:752 company/templates/company/supplier_part.html:161
-#: stock/admin.py:119 stock/models.py:701
+#: stock/admin.py:119 stock/models.py:701 stock/serializers.py:1195
 #: stock/templates/stock/item_base.html:241
 #: templates/js/translated/company.js:1677
 #: templates/js/translated/stock.js:2356
@@ -4468,7 +4470,7 @@ msgstr ""
 msgid "No matching purchase order found"
 msgstr ""
 
-#: order/api.py:1452 order/models.py:1191 order/models.py:1275
+#: order/api.py:1440 order/models.py:1191 order/models.py:1275
 #: order/templates/order/order_base.html:9
 #: order/templates/order/order_base.html:18
 #: report/templates/report/inventree_po_report_base.html:14
@@ -4482,7 +4484,7 @@ msgstr ""
 msgid "Purchase Order"
 msgstr ""
 
-#: order/api.py:1456 order/models.py:1922 order/models.py:1968
+#: order/api.py:1444 order/models.py:1922 order/models.py:1968
 #: order/templates/order/return_order_base.html:9
 #: order/templates/order/return_order_base.html:28
 #: report/templates/report/inventree_return_order_report_base.html:13
@@ -4491,7 +4493,7 @@ msgstr ""
 msgid "Return Order"
 msgstr ""
 
-#: order/api.py:1458 templates/js/translated/sales_order.js:1039
+#: order/api.py:1446 templates/js/translated/sales_order.js:1039
 msgid "Unknown"
 msgstr ""
 
@@ -5544,31 +5546,31 @@ msgstr ""
 msgid "Maximum Price"
 msgstr ""
 
-#: part/api.py:501
+#: part/api.py:497
 msgid "Incoming Purchase Order"
 msgstr ""
 
-#: part/api.py:521
+#: part/api.py:517
 msgid "Outgoing Sales Order"
 msgstr ""
 
-#: part/api.py:539
+#: part/api.py:535
 msgid "Stock produced by Build Order"
 msgstr ""
 
-#: part/api.py:625
+#: part/api.py:621
 msgid "Stock required for Build Order"
 msgstr ""
 
-#: part/api.py:773
+#: part/api.py:769
 msgid "Valid"
 msgstr ""
 
-#: part/api.py:774
+#: part/api.py:770
 msgid "Validate entire Bill of Materials"
 msgstr ""
 
-#: part/api.py:780
+#: part/api.py:776
 msgid "This option must be selected"
 msgstr ""
 
@@ -7378,35 +7380,35 @@ msgstr ""
 msgid "Plugin requires at most version {v}"
 msgstr ""
 
-#: plugin/samples/integration/sample.py:39
+#: plugin/samples/integration/sample.py:50
 msgid "Enable PO"
 msgstr ""
 
-#: plugin/samples/integration/sample.py:40
+#: plugin/samples/integration/sample.py:51
 msgid "Enable PO functionality in InvenTree interface"
 msgstr ""
 
-#: plugin/samples/integration/sample.py:45
+#: plugin/samples/integration/sample.py:56
 msgid "API Key"
 msgstr ""
 
-#: plugin/samples/integration/sample.py:46
+#: plugin/samples/integration/sample.py:57
 msgid "Key required for accessing external API"
 msgstr ""
 
-#: plugin/samples/integration/sample.py:50
+#: plugin/samples/integration/sample.py:61
 msgid "Numerical"
 msgstr ""
 
-#: plugin/samples/integration/sample.py:51
+#: plugin/samples/integration/sample.py:62
 msgid "A numerical setting"
 msgstr ""
 
-#: plugin/samples/integration/sample.py:56
+#: plugin/samples/integration/sample.py:67
 msgid "Choice Setting"
 msgstr ""
 
-#: plugin/samples/integration/sample.py:57
+#: plugin/samples/integration/sample.py:68
 msgid "A setting with multiple choices"
 msgstr ""
 
@@ -7618,12 +7620,12 @@ msgid "Test Results"
 msgstr ""
 
 #: report/templates/report/inventree_test_report_base.html:102
-#: stock/models.py:2243 templates/js/translated/stock.js:1437
+#: stock/models.py:2274 templates/js/translated/stock.js:1437
 msgid "Test"
 msgstr ""
 
 #: report/templates/report/inventree_test_report_base.html:103
-#: stock/models.py:2249
+#: stock/models.py:2280
 msgid "Result"
 msgstr ""
 
@@ -7833,7 +7835,7 @@ msgstr ""
 msgid "Where is this stock item located?"
 msgstr ""
 
-#: stock/models.py:702
+#: stock/models.py:702 stock/serializers.py:1196
 msgid "Packaging this stock item is stored in"
 msgstr ""
 
@@ -7845,7 +7847,7 @@ msgstr ""
 msgid "Serial number for this item"
 msgstr ""
 
-#: stock/models.py:741
+#: stock/models.py:741 stock/serializers.py:1181
 msgid "Batch code for this stock item"
 msgstr ""
 
@@ -7966,39 +7968,39 @@ msgstr ""
 msgid "Stock status codes must match"
 msgstr ""
 
-#: stock/models.py:1679
+#: stock/models.py:1702
 msgid "StockItem cannot be moved as it is not in stock"
 msgstr ""
 
-#: stock/models.py:2161
+#: stock/models.py:2192
 msgid "Entry notes"
 msgstr ""
 
-#: stock/models.py:2219
+#: stock/models.py:2250
 msgid "Value must be provided for this test"
 msgstr ""
 
-#: stock/models.py:2225
+#: stock/models.py:2256
 msgid "Attachment must be uploaded for this test"
 msgstr ""
 
-#: stock/models.py:2244
+#: stock/models.py:2275
 msgid "Test name"
 msgstr ""
 
-#: stock/models.py:2250
+#: stock/models.py:2281
 msgid "Test result"
 msgstr ""
 
-#: stock/models.py:2256
+#: stock/models.py:2287
 msgid "Test output value"
 msgstr ""
 
-#: stock/models.py:2263
+#: stock/models.py:2294
 msgid "Test result attachment"
 msgstr ""
 
-#: stock/models.py:2269
+#: stock/models.py:2300
 msgid "Test notes"
 msgstr ""
 
@@ -8027,7 +8029,7 @@ msgstr ""
 msgid "Enter serial numbers for new items"
 msgstr ""
 
-#: stock/serializers.py:402 stock/serializers.py:1049 stock/serializers.py:1291
+#: stock/serializers.py:402 stock/serializers.py:1049 stock/serializers.py:1320
 msgid "Destination stock location"
 msgstr ""
 
@@ -8104,7 +8106,7 @@ msgstr ""
 msgid "Stock assignment notes"
 msgstr ""
 
-#: stock/serializers.py:967 stock/serializers.py:1198
+#: stock/serializers.py:967 stock/serializers.py:1227
 msgid "A list of stock items must be provided"
 msgstr ""
 
@@ -8132,11 +8134,15 @@ msgstr ""
 msgid "At least two stock items must be provided"
 msgstr ""
 
-#: stock/serializers.py:1160
+#: stock/serializers.py:1167
 msgid "StockItem primary key value"
 msgstr ""
 
 #: stock/serializers.py:1188
+msgid "Stock item status code"
+msgstr ""
+
+#: stock/serializers.py:1217
 msgid "Stock transaction notes"
 msgstr ""
 
diff --git a/InvenTree/locale/fa/LC_MESSAGES/django.po b/InvenTree/locale/fa/LC_MESSAGES/django.po
index 4b63735e51..61f4d7a14d 100644
--- a/InvenTree/locale/fa/LC_MESSAGES/django.po
+++ b/InvenTree/locale/fa/LC_MESSAGES/django.po
@@ -2,8 +2,8 @@ msgid ""
 msgstr ""
 "Project-Id-Version: inventree\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2023-09-10 11:39+0000\n"
-"PO-Revision-Date: 2023-09-10 23:40\n"
+"POT-Creation-Date: 2023-09-12 01:47+0000\n"
+"PO-Revision-Date: 2023-09-14 01:15\n"
 "Last-Translator: \n"
 "Language-Team: Persian\n"
 "Language: fa_IR\n"
@@ -21,7 +21,7 @@ msgstr ""
 msgid "API endpoint not found"
 msgstr "Address e API peida nashod"
 
-#: InvenTree/api.py:329
+#: InvenTree/api.py:335
 msgid "User does not have permission to view this model"
 msgstr ""
 
@@ -1771,7 +1771,7 @@ msgid "Completed Outputs"
 msgstr ""
 
 #: build/templates/build/build_base.html:191
-#: build/templates/build/detail.html:101 order/api.py:1454 order/models.py:1317
+#: build/templates/build/detail.html:101 order/api.py:1442 order/models.py:1317
 #: order/models.py:1416 order/models.py:1564
 #: order/templates/order/sales_order_base.html:9
 #: order/templates/order/sales_order_base.html:28
@@ -4469,7 +4469,7 @@ msgstr ""
 msgid "No matching purchase order found"
 msgstr ""
 
-#: order/api.py:1452 order/models.py:1191 order/models.py:1275
+#: order/api.py:1440 order/models.py:1191 order/models.py:1275
 #: order/templates/order/order_base.html:9
 #: order/templates/order/order_base.html:18
 #: report/templates/report/inventree_po_report_base.html:14
@@ -4483,7 +4483,7 @@ msgstr ""
 msgid "Purchase Order"
 msgstr ""
 
-#: order/api.py:1456 order/models.py:1922 order/models.py:1968
+#: order/api.py:1444 order/models.py:1922 order/models.py:1968
 #: order/templates/order/return_order_base.html:9
 #: order/templates/order/return_order_base.html:28
 #: report/templates/report/inventree_return_order_report_base.html:13
@@ -4492,7 +4492,7 @@ msgstr ""
 msgid "Return Order"
 msgstr ""
 
-#: order/api.py:1458 templates/js/translated/sales_order.js:1039
+#: order/api.py:1446 templates/js/translated/sales_order.js:1039
 msgid "Unknown"
 msgstr ""
 
@@ -5545,31 +5545,31 @@ msgstr ""
 msgid "Maximum Price"
 msgstr ""
 
-#: part/api.py:501
+#: part/api.py:497
 msgid "Incoming Purchase Order"
 msgstr ""
 
-#: part/api.py:521
+#: part/api.py:517
 msgid "Outgoing Sales Order"
 msgstr ""
 
-#: part/api.py:539
+#: part/api.py:535
 msgid "Stock produced by Build Order"
 msgstr ""
 
-#: part/api.py:625
+#: part/api.py:621
 msgid "Stock required for Build Order"
 msgstr ""
 
-#: part/api.py:773
+#: part/api.py:769
 msgid "Valid"
 msgstr ""
 
-#: part/api.py:774
+#: part/api.py:770
 msgid "Validate entire Bill of Materials"
 msgstr ""
 
-#: part/api.py:780
+#: part/api.py:776
 msgid "This option must be selected"
 msgstr ""
 
diff --git a/InvenTree/locale/fi/LC_MESSAGES/django.po b/InvenTree/locale/fi/LC_MESSAGES/django.po
index 3cd23c60da..30d20fc529 100644
--- a/InvenTree/locale/fi/LC_MESSAGES/django.po
+++ b/InvenTree/locale/fi/LC_MESSAGES/django.po
@@ -2,8 +2,8 @@ msgid ""
 msgstr ""
 "Project-Id-Version: inventree\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2023-09-10 11:39+0000\n"
-"PO-Revision-Date: 2023-09-10 23:40\n"
+"POT-Creation-Date: 2023-09-12 01:47+0000\n"
+"PO-Revision-Date: 2023-09-14 01:14\n"
 "Last-Translator: \n"
 "Language-Team: Finnish\n"
 "Language: fi_FI\n"
@@ -21,7 +21,7 @@ msgstr ""
 msgid "API endpoint not found"
 msgstr "API-rajapintaa ei löydy"
 
-#: InvenTree/api.py:329
+#: InvenTree/api.py:335
 msgid "User does not have permission to view this model"
 msgstr "Käyttäjän oikeudet eivät riitä kohteen tarkastelemiseen"
 
@@ -1771,7 +1771,7 @@ msgid "Completed Outputs"
 msgstr ""
 
 #: build/templates/build/build_base.html:191
-#: build/templates/build/detail.html:101 order/api.py:1454 order/models.py:1317
+#: build/templates/build/detail.html:101 order/api.py:1442 order/models.py:1317
 #: order/models.py:1416 order/models.py:1564
 #: order/templates/order/sales_order_base.html:9
 #: order/templates/order/sales_order_base.html:28
@@ -4469,7 +4469,7 @@ msgstr "Hinta yhteensä"
 msgid "No matching purchase order found"
 msgstr ""
 
-#: order/api.py:1452 order/models.py:1191 order/models.py:1275
+#: order/api.py:1440 order/models.py:1191 order/models.py:1275
 #: order/templates/order/order_base.html:9
 #: order/templates/order/order_base.html:18
 #: report/templates/report/inventree_po_report_base.html:14
@@ -4483,7 +4483,7 @@ msgstr ""
 msgid "Purchase Order"
 msgstr ""
 
-#: order/api.py:1456 order/models.py:1922 order/models.py:1968
+#: order/api.py:1444 order/models.py:1922 order/models.py:1968
 #: order/templates/order/return_order_base.html:9
 #: order/templates/order/return_order_base.html:28
 #: report/templates/report/inventree_return_order_report_base.html:13
@@ -4492,7 +4492,7 @@ msgstr ""
 msgid "Return Order"
 msgstr ""
 
-#: order/api.py:1458 templates/js/translated/sales_order.js:1039
+#: order/api.py:1446 templates/js/translated/sales_order.js:1039
 msgid "Unknown"
 msgstr ""
 
@@ -5545,31 +5545,31 @@ msgstr ""
 msgid "Maximum Price"
 msgstr ""
 
-#: part/api.py:501
+#: part/api.py:497
 msgid "Incoming Purchase Order"
 msgstr ""
 
-#: part/api.py:521
+#: part/api.py:517
 msgid "Outgoing Sales Order"
 msgstr ""
 
-#: part/api.py:539
+#: part/api.py:535
 msgid "Stock produced by Build Order"
 msgstr ""
 
-#: part/api.py:625
+#: part/api.py:621
 msgid "Stock required for Build Order"
 msgstr ""
 
-#: part/api.py:773
+#: part/api.py:769
 msgid "Valid"
 msgstr ""
 
-#: part/api.py:774
+#: part/api.py:770
 msgid "Validate entire Bill of Materials"
 msgstr ""
 
-#: part/api.py:780
+#: part/api.py:776
 msgid "This option must be selected"
 msgstr ""
 
diff --git a/InvenTree/locale/fr/LC_MESSAGES/django.po b/InvenTree/locale/fr/LC_MESSAGES/django.po
index bf46282047..2246a3fa07 100644
--- a/InvenTree/locale/fr/LC_MESSAGES/django.po
+++ b/InvenTree/locale/fr/LC_MESSAGES/django.po
@@ -2,8 +2,8 @@ msgid ""
 msgstr ""
 "Project-Id-Version: inventree\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2023-09-10 11:39+0000\n"
-"PO-Revision-Date: 2023-09-10 23:39\n"
+"POT-Creation-Date: 2023-09-12 01:47+0000\n"
+"PO-Revision-Date: 2023-09-14 01:14\n"
 "Last-Translator: \n"
 "Language-Team: French\n"
 "Language: fr_FR\n"
@@ -21,7 +21,7 @@ msgstr ""
 msgid "API endpoint not found"
 msgstr "Point de terminaison de l'API introuvable"
 
-#: InvenTree/api.py:329
+#: InvenTree/api.py:335
 msgid "User does not have permission to view this model"
 msgstr "L'utilisateur n'a pas la permission de voir ce modèle"
 
@@ -1771,7 +1771,7 @@ msgid "Completed Outputs"
 msgstr "Sorties de Construction terminées"
 
 #: build/templates/build/build_base.html:191
-#: build/templates/build/detail.html:101 order/api.py:1454 order/models.py:1317
+#: build/templates/build/detail.html:101 order/api.py:1442 order/models.py:1317
 #: order/models.py:1416 order/models.py:1564
 #: order/templates/order/sales_order_base.html:9
 #: order/templates/order/sales_order_base.html:28
@@ -4469,7 +4469,7 @@ msgstr ""
 msgid "No matching purchase order found"
 msgstr "Aucun bon de commande correspondant n'a été trouvé"
 
-#: order/api.py:1452 order/models.py:1191 order/models.py:1275
+#: order/api.py:1440 order/models.py:1191 order/models.py:1275
 #: order/templates/order/order_base.html:9
 #: order/templates/order/order_base.html:18
 #: report/templates/report/inventree_po_report_base.html:14
@@ -4483,7 +4483,7 @@ msgstr "Aucun bon de commande correspondant n'a été trouvé"
 msgid "Purchase Order"
 msgstr "Commande d’achat"
 
-#: order/api.py:1456 order/models.py:1922 order/models.py:1968
+#: order/api.py:1444 order/models.py:1922 order/models.py:1968
 #: order/templates/order/return_order_base.html:9
 #: order/templates/order/return_order_base.html:28
 #: report/templates/report/inventree_return_order_report_base.html:13
@@ -4492,7 +4492,7 @@ msgstr "Commande d’achat"
 msgid "Return Order"
 msgstr ""
 
-#: order/api.py:1458 templates/js/translated/sales_order.js:1039
+#: order/api.py:1446 templates/js/translated/sales_order.js:1039
 msgid "Unknown"
 msgstr "Inconnu"
 
@@ -5545,31 +5545,31 @@ msgstr "Prix Minimum"
 msgid "Maximum Price"
 msgstr "Prix Maximum"
 
-#: part/api.py:501
+#: part/api.py:497
 msgid "Incoming Purchase Order"
 msgstr ""
 
-#: part/api.py:521
+#: part/api.py:517
 msgid "Outgoing Sales Order"
 msgstr ""
 
-#: part/api.py:539
+#: part/api.py:535
 msgid "Stock produced by Build Order"
 msgstr ""
 
-#: part/api.py:625
+#: part/api.py:621
 msgid "Stock required for Build Order"
 msgstr ""
 
-#: part/api.py:773
+#: part/api.py:769
 msgid "Valid"
 msgstr ""
 
-#: part/api.py:774
+#: part/api.py:770
 msgid "Validate entire Bill of Materials"
 msgstr ""
 
-#: part/api.py:780
+#: part/api.py:776
 msgid "This option must be selected"
 msgstr ""
 
diff --git a/InvenTree/locale/he/LC_MESSAGES/django.po b/InvenTree/locale/he/LC_MESSAGES/django.po
index 9db66bdfb9..a2dca76610 100644
--- a/InvenTree/locale/he/LC_MESSAGES/django.po
+++ b/InvenTree/locale/he/LC_MESSAGES/django.po
@@ -2,8 +2,8 @@ msgid ""
 msgstr ""
 "Project-Id-Version: inventree\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2023-09-10 11:39+0000\n"
-"PO-Revision-Date: 2023-09-10 23:40\n"
+"POT-Creation-Date: 2023-09-12 01:47+0000\n"
+"PO-Revision-Date: 2023-09-14 01:14\n"
 "Last-Translator: \n"
 "Language-Team: Hebrew\n"
 "Language: he_IL\n"
@@ -21,7 +21,7 @@ msgstr ""
 msgid "API endpoint not found"
 msgstr ""
 
-#: InvenTree/api.py:329
+#: InvenTree/api.py:335
 msgid "User does not have permission to view this model"
 msgstr ""
 
@@ -1771,7 +1771,7 @@ msgid "Completed Outputs"
 msgstr ""
 
 #: build/templates/build/build_base.html:191
-#: build/templates/build/detail.html:101 order/api.py:1454 order/models.py:1317
+#: build/templates/build/detail.html:101 order/api.py:1442 order/models.py:1317
 #: order/models.py:1416 order/models.py:1564
 #: order/templates/order/sales_order_base.html:9
 #: order/templates/order/sales_order_base.html:28
@@ -4469,7 +4469,7 @@ msgstr ""
 msgid "No matching purchase order found"
 msgstr ""
 
-#: order/api.py:1452 order/models.py:1191 order/models.py:1275
+#: order/api.py:1440 order/models.py:1191 order/models.py:1275
 #: order/templates/order/order_base.html:9
 #: order/templates/order/order_base.html:18
 #: report/templates/report/inventree_po_report_base.html:14
@@ -4483,7 +4483,7 @@ msgstr ""
 msgid "Purchase Order"
 msgstr ""
 
-#: order/api.py:1456 order/models.py:1922 order/models.py:1968
+#: order/api.py:1444 order/models.py:1922 order/models.py:1968
 #: order/templates/order/return_order_base.html:9
 #: order/templates/order/return_order_base.html:28
 #: report/templates/report/inventree_return_order_report_base.html:13
@@ -4492,7 +4492,7 @@ msgstr ""
 msgid "Return Order"
 msgstr ""
 
-#: order/api.py:1458 templates/js/translated/sales_order.js:1039
+#: order/api.py:1446 templates/js/translated/sales_order.js:1039
 msgid "Unknown"
 msgstr ""
 
@@ -5545,31 +5545,31 @@ msgstr ""
 msgid "Maximum Price"
 msgstr ""
 
-#: part/api.py:501
+#: part/api.py:497
 msgid "Incoming Purchase Order"
 msgstr ""
 
-#: part/api.py:521
+#: part/api.py:517
 msgid "Outgoing Sales Order"
 msgstr ""
 
-#: part/api.py:539
+#: part/api.py:535
 msgid "Stock produced by Build Order"
 msgstr ""
 
-#: part/api.py:625
+#: part/api.py:621
 msgid "Stock required for Build Order"
 msgstr ""
 
-#: part/api.py:773
+#: part/api.py:769
 msgid "Valid"
 msgstr ""
 
-#: part/api.py:774
+#: part/api.py:770
 msgid "Validate entire Bill of Materials"
 msgstr ""
 
-#: part/api.py:780
+#: part/api.py:776
 msgid "This option must be selected"
 msgstr ""
 
diff --git a/InvenTree/locale/hi/LC_MESSAGES/django.po b/InvenTree/locale/hi/LC_MESSAGES/django.po
index 6d36469875..39439f719b 100644
--- a/InvenTree/locale/hi/LC_MESSAGES/django.po
+++ b/InvenTree/locale/hi/LC_MESSAGES/django.po
@@ -2,8 +2,8 @@ msgid ""
 msgstr ""
 "Project-Id-Version: inventree\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2023-09-10 11:39+0000\n"
-"PO-Revision-Date: 2023-09-12 00:11\n"
+"POT-Creation-Date: 2023-09-12 01:47+0000\n"
+"PO-Revision-Date: 2023-09-14 01:15\n"
 "Last-Translator: \n"
 "Language-Team: Hindi\n"
 "Language: hi_IN\n"
@@ -21,7 +21,7 @@ msgstr ""
 msgid "API endpoint not found"
 msgstr ""
 
-#: InvenTree/api.py:329
+#: InvenTree/api.py:335
 msgid "User does not have permission to view this model"
 msgstr ""
 
@@ -1771,7 +1771,7 @@ msgid "Completed Outputs"
 msgstr ""
 
 #: build/templates/build/build_base.html:191
-#: build/templates/build/detail.html:101 order/api.py:1454 order/models.py:1317
+#: build/templates/build/detail.html:101 order/api.py:1442 order/models.py:1317
 #: order/models.py:1416 order/models.py:1564
 #: order/templates/order/sales_order_base.html:9
 #: order/templates/order/sales_order_base.html:28
@@ -4469,7 +4469,7 @@ msgstr ""
 msgid "No matching purchase order found"
 msgstr ""
 
-#: order/api.py:1452 order/models.py:1191 order/models.py:1275
+#: order/api.py:1440 order/models.py:1191 order/models.py:1275
 #: order/templates/order/order_base.html:9
 #: order/templates/order/order_base.html:18
 #: report/templates/report/inventree_po_report_base.html:14
@@ -4483,7 +4483,7 @@ msgstr ""
 msgid "Purchase Order"
 msgstr ""
 
-#: order/api.py:1456 order/models.py:1922 order/models.py:1968
+#: order/api.py:1444 order/models.py:1922 order/models.py:1968
 #: order/templates/order/return_order_base.html:9
 #: order/templates/order/return_order_base.html:28
 #: report/templates/report/inventree_return_order_report_base.html:13
@@ -4492,7 +4492,7 @@ msgstr ""
 msgid "Return Order"
 msgstr ""
 
-#: order/api.py:1458 templates/js/translated/sales_order.js:1039
+#: order/api.py:1446 templates/js/translated/sales_order.js:1039
 msgid "Unknown"
 msgstr ""
 
@@ -5545,31 +5545,31 @@ msgstr ""
 msgid "Maximum Price"
 msgstr ""
 
-#: part/api.py:501
+#: part/api.py:497
 msgid "Incoming Purchase Order"
 msgstr ""
 
-#: part/api.py:521
+#: part/api.py:517
 msgid "Outgoing Sales Order"
 msgstr ""
 
-#: part/api.py:539
+#: part/api.py:535
 msgid "Stock produced by Build Order"
 msgstr ""
 
-#: part/api.py:625
+#: part/api.py:621
 msgid "Stock required for Build Order"
 msgstr ""
 
-#: part/api.py:773
+#: part/api.py:769
 msgid "Valid"
 msgstr ""
 
-#: part/api.py:774
+#: part/api.py:770
 msgid "Validate entire Bill of Materials"
 msgstr ""
 
-#: part/api.py:780
+#: part/api.py:776
 msgid "This option must be selected"
 msgstr ""
 
diff --git a/InvenTree/locale/hu/LC_MESSAGES/django.po b/InvenTree/locale/hu/LC_MESSAGES/django.po
index 099fb65ef9..f9da9f9fbe 100644
--- a/InvenTree/locale/hu/LC_MESSAGES/django.po
+++ b/InvenTree/locale/hu/LC_MESSAGES/django.po
@@ -2,8 +2,8 @@ msgid ""
 msgstr ""
 "Project-Id-Version: inventree\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2023-09-10 11:39+0000\n"
-"PO-Revision-Date: 2023-09-10 23:40\n"
+"POT-Creation-Date: 2023-09-12 01:47+0000\n"
+"PO-Revision-Date: 2023-09-14 01:14\n"
 "Last-Translator: \n"
 "Language-Team: Hungarian\n"
 "Language: hu_HU\n"
@@ -21,7 +21,7 @@ msgstr ""
 msgid "API endpoint not found"
 msgstr "API funkciót nem találom"
 
-#: InvenTree/api.py:329
+#: InvenTree/api.py:335
 msgid "User does not have permission to view this model"
 msgstr "Nincs jogosultságod az adatok megtekintéséhez"
 
@@ -1772,7 +1772,7 @@ msgid "Completed Outputs"
 msgstr "Befejezett kimenetek"
 
 #: build/templates/build/build_base.html:191
-#: build/templates/build/detail.html:101 order/api.py:1454 order/models.py:1317
+#: build/templates/build/detail.html:101 order/api.py:1442 order/models.py:1317
 #: order/models.py:1416 order/models.py:1564
 #: order/templates/order/sales_order_base.html:9
 #: order/templates/order/sales_order_base.html:28
@@ -4470,7 +4470,7 @@ msgstr "Teljes ár"
 msgid "No matching purchase order found"
 msgstr "Nincs egyező beszerzési rendelés"
 
-#: order/api.py:1452 order/models.py:1191 order/models.py:1275
+#: order/api.py:1440 order/models.py:1191 order/models.py:1275
 #: order/templates/order/order_base.html:9
 #: order/templates/order/order_base.html:18
 #: report/templates/report/inventree_po_report_base.html:14
@@ -4484,7 +4484,7 @@ msgstr "Nincs egyező beszerzési rendelés"
 msgid "Purchase Order"
 msgstr "Beszerzési rendelés"
 
-#: order/api.py:1456 order/models.py:1922 order/models.py:1968
+#: order/api.py:1444 order/models.py:1922 order/models.py:1968
 #: order/templates/order/return_order_base.html:9
 #: order/templates/order/return_order_base.html:28
 #: report/templates/report/inventree_return_order_report_base.html:13
@@ -4493,7 +4493,7 @@ msgstr "Beszerzési rendelés"
 msgid "Return Order"
 msgstr "Visszavétel"
 
-#: order/api.py:1458 templates/js/translated/sales_order.js:1039
+#: order/api.py:1446 templates/js/translated/sales_order.js:1039
 msgid "Unknown"
 msgstr "Ismeretlen"
 
@@ -5546,31 +5546,31 @@ msgstr "Minimum ár"
 msgid "Maximum Price"
 msgstr "Maximum ár"
 
-#: part/api.py:501
+#: part/api.py:497
 msgid "Incoming Purchase Order"
 msgstr "Beérkező beszerzési rendelés"
 
-#: part/api.py:521
+#: part/api.py:517
 msgid "Outgoing Sales Order"
 msgstr "Kimenő vevői rendelés"
 
-#: part/api.py:539
+#: part/api.py:535
 msgid "Stock produced by Build Order"
 msgstr "Gyártással előállított készlet"
 
-#: part/api.py:625
+#: part/api.py:621
 msgid "Stock required for Build Order"
 msgstr "A gyártási utasításhoz szükséges készlet"
 
-#: part/api.py:773
+#: part/api.py:769
 msgid "Valid"
 msgstr "Érvényes"
 
-#: part/api.py:774
+#: part/api.py:770
 msgid "Validate entire Bill of Materials"
 msgstr "Teljes alkatrészjegyzék jóváhagyása"
 
-#: part/api.py:780
+#: part/api.py:776
 msgid "This option must be selected"
 msgstr "Ennek az opciónak ki kll lennie választva"
 
diff --git a/InvenTree/locale/id/LC_MESSAGES/django.po b/InvenTree/locale/id/LC_MESSAGES/django.po
index 6e630e212c..de8446621e 100644
--- a/InvenTree/locale/id/LC_MESSAGES/django.po
+++ b/InvenTree/locale/id/LC_MESSAGES/django.po
@@ -2,8 +2,8 @@ msgid ""
 msgstr ""
 "Project-Id-Version: inventree\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2023-09-10 11:39+0000\n"
-"PO-Revision-Date: 2023-09-10 23:40\n"
+"POT-Creation-Date: 2023-09-12 01:47+0000\n"
+"PO-Revision-Date: 2023-09-14 01:15\n"
 "Last-Translator: \n"
 "Language-Team: Indonesian\n"
 "Language: id_ID\n"
@@ -21,7 +21,7 @@ msgstr ""
 msgid "API endpoint not found"
 msgstr "API endpoint tidak ditemukan"
 
-#: InvenTree/api.py:329
+#: InvenTree/api.py:335
 msgid "User does not have permission to view this model"
 msgstr "Pengguna tidak memiliki izin untuk melihat model ini"
 
@@ -1771,7 +1771,7 @@ msgid "Completed Outputs"
 msgstr ""
 
 #: build/templates/build/build_base.html:191
-#: build/templates/build/detail.html:101 order/api.py:1454 order/models.py:1317
+#: build/templates/build/detail.html:101 order/api.py:1442 order/models.py:1317
 #: order/models.py:1416 order/models.py:1564
 #: order/templates/order/sales_order_base.html:9
 #: order/templates/order/sales_order_base.html:28
@@ -4469,7 +4469,7 @@ msgstr ""
 msgid "No matching purchase order found"
 msgstr ""
 
-#: order/api.py:1452 order/models.py:1191 order/models.py:1275
+#: order/api.py:1440 order/models.py:1191 order/models.py:1275
 #: order/templates/order/order_base.html:9
 #: order/templates/order/order_base.html:18
 #: report/templates/report/inventree_po_report_base.html:14
@@ -4483,7 +4483,7 @@ msgstr ""
 msgid "Purchase Order"
 msgstr ""
 
-#: order/api.py:1456 order/models.py:1922 order/models.py:1968
+#: order/api.py:1444 order/models.py:1922 order/models.py:1968
 #: order/templates/order/return_order_base.html:9
 #: order/templates/order/return_order_base.html:28
 #: report/templates/report/inventree_return_order_report_base.html:13
@@ -4492,7 +4492,7 @@ msgstr ""
 msgid "Return Order"
 msgstr ""
 
-#: order/api.py:1458 templates/js/translated/sales_order.js:1039
+#: order/api.py:1446 templates/js/translated/sales_order.js:1039
 msgid "Unknown"
 msgstr ""
 
@@ -5545,31 +5545,31 @@ msgstr ""
 msgid "Maximum Price"
 msgstr ""
 
-#: part/api.py:501
+#: part/api.py:497
 msgid "Incoming Purchase Order"
 msgstr ""
 
-#: part/api.py:521
+#: part/api.py:517
 msgid "Outgoing Sales Order"
 msgstr ""
 
-#: part/api.py:539
+#: part/api.py:535
 msgid "Stock produced by Build Order"
 msgstr ""
 
-#: part/api.py:625
+#: part/api.py:621
 msgid "Stock required for Build Order"
 msgstr ""
 
-#: part/api.py:773
+#: part/api.py:769
 msgid "Valid"
 msgstr ""
 
-#: part/api.py:774
+#: part/api.py:770
 msgid "Validate entire Bill of Materials"
 msgstr ""
 
-#: part/api.py:780
+#: part/api.py:776
 msgid "This option must be selected"
 msgstr ""
 
diff --git a/InvenTree/locale/it/LC_MESSAGES/django.po b/InvenTree/locale/it/LC_MESSAGES/django.po
index 2702c4a552..8132106512 100644
--- a/InvenTree/locale/it/LC_MESSAGES/django.po
+++ b/InvenTree/locale/it/LC_MESSAGES/django.po
@@ -2,8 +2,8 @@ msgid ""
 msgstr ""
 "Project-Id-Version: inventree\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2023-09-10 11:39+0000\n"
-"PO-Revision-Date: 2023-09-10 23:40\n"
+"POT-Creation-Date: 2023-09-12 01:47+0000\n"
+"PO-Revision-Date: 2023-09-14 01:14\n"
 "Last-Translator: \n"
 "Language-Team: Italian\n"
 "Language: it_IT\n"
@@ -21,7 +21,7 @@ msgstr ""
 msgid "API endpoint not found"
 msgstr "Endpoint API non trovato"
 
-#: InvenTree/api.py:329
+#: InvenTree/api.py:335
 msgid "User does not have permission to view this model"
 msgstr "L'utente non ha i permessi per vedere questo modello"
 
@@ -1771,7 +1771,7 @@ msgid "Completed Outputs"
 msgstr "Outputs Completati"
 
 #: build/templates/build/build_base.html:191
-#: build/templates/build/detail.html:101 order/api.py:1454 order/models.py:1317
+#: build/templates/build/detail.html:101 order/api.py:1442 order/models.py:1317
 #: order/models.py:1416 order/models.py:1564
 #: order/templates/order/sales_order_base.html:9
 #: order/templates/order/sales_order_base.html:28
@@ -4469,7 +4469,7 @@ msgstr "Prezzo Totale"
 msgid "No matching purchase order found"
 msgstr "Nessun ordine di acquisto corrispondente trovato"
 
-#: order/api.py:1452 order/models.py:1191 order/models.py:1275
+#: order/api.py:1440 order/models.py:1191 order/models.py:1275
 #: order/templates/order/order_base.html:9
 #: order/templates/order/order_base.html:18
 #: report/templates/report/inventree_po_report_base.html:14
@@ -4483,7 +4483,7 @@ msgstr "Nessun ordine di acquisto corrispondente trovato"
 msgid "Purchase Order"
 msgstr "Ordine D'Acquisto"
 
-#: order/api.py:1456 order/models.py:1922 order/models.py:1968
+#: order/api.py:1444 order/models.py:1922 order/models.py:1968
 #: order/templates/order/return_order_base.html:9
 #: order/templates/order/return_order_base.html:28
 #: report/templates/report/inventree_return_order_report_base.html:13
@@ -4492,7 +4492,7 @@ msgstr "Ordine D'Acquisto"
 msgid "Return Order"
 msgstr "Restituisci ordine"
 
-#: order/api.py:1458 templates/js/translated/sales_order.js:1039
+#: order/api.py:1446 templates/js/translated/sales_order.js:1039
 msgid "Unknown"
 msgstr "Sconosciuto"
 
@@ -5545,31 +5545,31 @@ msgstr "Prezzo Minimo"
 msgid "Maximum Price"
 msgstr "Prezzo Massimo"
 
-#: part/api.py:501
+#: part/api.py:497
 msgid "Incoming Purchase Order"
 msgstr "Ordine D'Acquisto In Arrivo"
 
-#: part/api.py:521
+#: part/api.py:517
 msgid "Outgoing Sales Order"
 msgstr "Ordine di Vendita in Uscita"
 
-#: part/api.py:539
+#: part/api.py:535
 msgid "Stock produced by Build Order"
 msgstr "Giacenza prodotta dall'Ordine di Costruzione"
 
-#: part/api.py:625
+#: part/api.py:621
 msgid "Stock required for Build Order"
 msgstr "Giacenza richiesta per l'Ordine di Produzione"
 
-#: part/api.py:773
+#: part/api.py:769
 msgid "Valid"
 msgstr "Valido"
 
-#: part/api.py:774
+#: part/api.py:770
 msgid "Validate entire Bill of Materials"
 msgstr "Convalida l'intera Fattura dei Materiali"
 
-#: part/api.py:780
+#: part/api.py:776
 msgid "This option must be selected"
 msgstr "Questa opzione deve essere selezionata"
 
diff --git a/InvenTree/locale/ja/LC_MESSAGES/django.po b/InvenTree/locale/ja/LC_MESSAGES/django.po
index 9955faf073..86cc07da9b 100644
--- a/InvenTree/locale/ja/LC_MESSAGES/django.po
+++ b/InvenTree/locale/ja/LC_MESSAGES/django.po
@@ -2,8 +2,8 @@ msgid ""
 msgstr ""
 "Project-Id-Version: inventree\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2023-09-10 11:39+0000\n"
-"PO-Revision-Date: 2023-09-10 23:40\n"
+"POT-Creation-Date: 2023-09-12 01:47+0000\n"
+"PO-Revision-Date: 2023-09-14 01:14\n"
 "Last-Translator: \n"
 "Language-Team: Japanese\n"
 "Language: ja_JP\n"
@@ -21,7 +21,7 @@ msgstr ""
 msgid "API endpoint not found"
 msgstr "APIエンドポイントが見つかりません"
 
-#: InvenTree/api.py:329
+#: InvenTree/api.py:335
 msgid "User does not have permission to view this model"
 msgstr "ユーザーにこのモデルを表示する権限がありません"
 
@@ -1771,7 +1771,7 @@ msgid "Completed Outputs"
 msgstr ""
 
 #: build/templates/build/build_base.html:191
-#: build/templates/build/detail.html:101 order/api.py:1454 order/models.py:1317
+#: build/templates/build/detail.html:101 order/api.py:1442 order/models.py:1317
 #: order/models.py:1416 order/models.py:1564
 #: order/templates/order/sales_order_base.html:9
 #: order/templates/order/sales_order_base.html:28
@@ -4469,7 +4469,7 @@ msgstr ""
 msgid "No matching purchase order found"
 msgstr ""
 
-#: order/api.py:1452 order/models.py:1191 order/models.py:1275
+#: order/api.py:1440 order/models.py:1191 order/models.py:1275
 #: order/templates/order/order_base.html:9
 #: order/templates/order/order_base.html:18
 #: report/templates/report/inventree_po_report_base.html:14
@@ -4483,7 +4483,7 @@ msgstr ""
 msgid "Purchase Order"
 msgstr ""
 
-#: order/api.py:1456 order/models.py:1922 order/models.py:1968
+#: order/api.py:1444 order/models.py:1922 order/models.py:1968
 #: order/templates/order/return_order_base.html:9
 #: order/templates/order/return_order_base.html:28
 #: report/templates/report/inventree_return_order_report_base.html:13
@@ -4492,7 +4492,7 @@ msgstr ""
 msgid "Return Order"
 msgstr ""
 
-#: order/api.py:1458 templates/js/translated/sales_order.js:1039
+#: order/api.py:1446 templates/js/translated/sales_order.js:1039
 msgid "Unknown"
 msgstr ""
 
@@ -5545,31 +5545,31 @@ msgstr ""
 msgid "Maximum Price"
 msgstr ""
 
-#: part/api.py:501
+#: part/api.py:497
 msgid "Incoming Purchase Order"
 msgstr ""
 
-#: part/api.py:521
+#: part/api.py:517
 msgid "Outgoing Sales Order"
 msgstr ""
 
-#: part/api.py:539
+#: part/api.py:535
 msgid "Stock produced by Build Order"
 msgstr ""
 
-#: part/api.py:625
+#: part/api.py:621
 msgid "Stock required for Build Order"
 msgstr ""
 
-#: part/api.py:773
+#: part/api.py:769
 msgid "Valid"
 msgstr ""
 
-#: part/api.py:774
+#: part/api.py:770
 msgid "Validate entire Bill of Materials"
 msgstr ""
 
-#: part/api.py:780
+#: part/api.py:776
 msgid "This option must be selected"
 msgstr ""
 
diff --git a/InvenTree/locale/ko/LC_MESSAGES/django.po b/InvenTree/locale/ko/LC_MESSAGES/django.po
index f93e8cd54a..170b2d134c 100644
--- a/InvenTree/locale/ko/LC_MESSAGES/django.po
+++ b/InvenTree/locale/ko/LC_MESSAGES/django.po
@@ -2,8 +2,8 @@ msgid ""
 msgstr ""
 "Project-Id-Version: inventree\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2023-09-10 11:39+0000\n"
-"PO-Revision-Date: 2023-09-10 23:40\n"
+"POT-Creation-Date: 2023-09-12 01:47+0000\n"
+"PO-Revision-Date: 2023-09-14 01:14\n"
 "Last-Translator: \n"
 "Language-Team: Korean\n"
 "Language: ko_KR\n"
@@ -21,7 +21,7 @@ msgstr ""
 msgid "API endpoint not found"
 msgstr "API endpoint 없음"
 
-#: InvenTree/api.py:329
+#: InvenTree/api.py:335
 msgid "User does not have permission to view this model"
 msgstr "이 모델을 볼 수 있는 권한이 없습니다."
 
@@ -1771,7 +1771,7 @@ msgid "Completed Outputs"
 msgstr ""
 
 #: build/templates/build/build_base.html:191
-#: build/templates/build/detail.html:101 order/api.py:1454 order/models.py:1317
+#: build/templates/build/detail.html:101 order/api.py:1442 order/models.py:1317
 #: order/models.py:1416 order/models.py:1564
 #: order/templates/order/sales_order_base.html:9
 #: order/templates/order/sales_order_base.html:28
@@ -4469,7 +4469,7 @@ msgstr ""
 msgid "No matching purchase order found"
 msgstr ""
 
-#: order/api.py:1452 order/models.py:1191 order/models.py:1275
+#: order/api.py:1440 order/models.py:1191 order/models.py:1275
 #: order/templates/order/order_base.html:9
 #: order/templates/order/order_base.html:18
 #: report/templates/report/inventree_po_report_base.html:14
@@ -4483,7 +4483,7 @@ msgstr ""
 msgid "Purchase Order"
 msgstr ""
 
-#: order/api.py:1456 order/models.py:1922 order/models.py:1968
+#: order/api.py:1444 order/models.py:1922 order/models.py:1968
 #: order/templates/order/return_order_base.html:9
 #: order/templates/order/return_order_base.html:28
 #: report/templates/report/inventree_return_order_report_base.html:13
@@ -4492,7 +4492,7 @@ msgstr ""
 msgid "Return Order"
 msgstr ""
 
-#: order/api.py:1458 templates/js/translated/sales_order.js:1039
+#: order/api.py:1446 templates/js/translated/sales_order.js:1039
 msgid "Unknown"
 msgstr ""
 
@@ -5545,31 +5545,31 @@ msgstr ""
 msgid "Maximum Price"
 msgstr ""
 
-#: part/api.py:501
+#: part/api.py:497
 msgid "Incoming Purchase Order"
 msgstr ""
 
-#: part/api.py:521
+#: part/api.py:517
 msgid "Outgoing Sales Order"
 msgstr ""
 
-#: part/api.py:539
+#: part/api.py:535
 msgid "Stock produced by Build Order"
 msgstr ""
 
-#: part/api.py:625
+#: part/api.py:621
 msgid "Stock required for Build Order"
 msgstr ""
 
-#: part/api.py:773
+#: part/api.py:769
 msgid "Valid"
 msgstr ""
 
-#: part/api.py:774
+#: part/api.py:770
 msgid "Validate entire Bill of Materials"
 msgstr ""
 
-#: part/api.py:780
+#: part/api.py:776
 msgid "This option must be selected"
 msgstr ""
 
diff --git a/InvenTree/locale/nl/LC_MESSAGES/django.po b/InvenTree/locale/nl/LC_MESSAGES/django.po
index 42d1a6a6e6..e452734b49 100644
--- a/InvenTree/locale/nl/LC_MESSAGES/django.po
+++ b/InvenTree/locale/nl/LC_MESSAGES/django.po
@@ -2,8 +2,8 @@ msgid ""
 msgstr ""
 "Project-Id-Version: inventree\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2023-09-10 11:39+0000\n"
-"PO-Revision-Date: 2023-09-10 23:40\n"
+"POT-Creation-Date: 2023-09-12 01:47+0000\n"
+"PO-Revision-Date: 2023-09-14 01:14\n"
 "Last-Translator: \n"
 "Language-Team: Dutch\n"
 "Language: nl_NL\n"
@@ -21,7 +21,7 @@ msgstr ""
 msgid "API endpoint not found"
 msgstr "API eindpunt niet gevonden"
 
-#: InvenTree/api.py:329
+#: InvenTree/api.py:335
 msgid "User does not have permission to view this model"
 msgstr "Gebruiker heeft geen rechten om dit model te bekijken"
 
@@ -1771,7 +1771,7 @@ msgid "Completed Outputs"
 msgstr "Voltooide Uitvoeren"
 
 #: build/templates/build/build_base.html:191
-#: build/templates/build/detail.html:101 order/api.py:1454 order/models.py:1317
+#: build/templates/build/detail.html:101 order/api.py:1442 order/models.py:1317
 #: order/models.py:1416 order/models.py:1564
 #: order/templates/order/sales_order_base.html:9
 #: order/templates/order/sales_order_base.html:28
@@ -4469,7 +4469,7 @@ msgstr "Totaalprijs"
 msgid "No matching purchase order found"
 msgstr ""
 
-#: order/api.py:1452 order/models.py:1191 order/models.py:1275
+#: order/api.py:1440 order/models.py:1191 order/models.py:1275
 #: order/templates/order/order_base.html:9
 #: order/templates/order/order_base.html:18
 #: report/templates/report/inventree_po_report_base.html:14
@@ -4483,7 +4483,7 @@ msgstr ""
 msgid "Purchase Order"
 msgstr "Inkooporder"
 
-#: order/api.py:1456 order/models.py:1922 order/models.py:1968
+#: order/api.py:1444 order/models.py:1922 order/models.py:1968
 #: order/templates/order/return_order_base.html:9
 #: order/templates/order/return_order_base.html:28
 #: report/templates/report/inventree_return_order_report_base.html:13
@@ -4492,7 +4492,7 @@ msgstr "Inkooporder"
 msgid "Return Order"
 msgstr ""
 
-#: order/api.py:1458 templates/js/translated/sales_order.js:1039
+#: order/api.py:1446 templates/js/translated/sales_order.js:1039
 msgid "Unknown"
 msgstr ""
 
@@ -5545,31 +5545,31 @@ msgstr ""
 msgid "Maximum Price"
 msgstr ""
 
-#: part/api.py:501
+#: part/api.py:497
 msgid "Incoming Purchase Order"
 msgstr "Binnenkomende Inkooporder"
 
-#: part/api.py:521
+#: part/api.py:517
 msgid "Outgoing Sales Order"
 msgstr "Uitgaande Verkooporder"
 
-#: part/api.py:539
+#: part/api.py:535
 msgid "Stock produced by Build Order"
 msgstr "Geproduceerde voorraad door Productieorder"
 
-#: part/api.py:625
+#: part/api.py:621
 msgid "Stock required for Build Order"
 msgstr "Voorraad vereist voor Productieorder"
 
-#: part/api.py:773
+#: part/api.py:769
 msgid "Valid"
 msgstr ""
 
-#: part/api.py:774
+#: part/api.py:770
 msgid "Validate entire Bill of Materials"
 msgstr ""
 
-#: part/api.py:780
+#: part/api.py:776
 msgid "This option must be selected"
 msgstr ""
 
diff --git a/InvenTree/locale/no/LC_MESSAGES/django.po b/InvenTree/locale/no/LC_MESSAGES/django.po
index 193d1b392d..311966770f 100644
--- a/InvenTree/locale/no/LC_MESSAGES/django.po
+++ b/InvenTree/locale/no/LC_MESSAGES/django.po
@@ -2,8 +2,8 @@ msgid ""
 msgstr ""
 "Project-Id-Version: inventree\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2023-09-10 11:39+0000\n"
-"PO-Revision-Date: 2023-09-10 23:40\n"
+"POT-Creation-Date: 2023-09-12 01:47+0000\n"
+"PO-Revision-Date: 2023-09-14 01:15\n"
 "Last-Translator: \n"
 "Language-Team: Norwegian\n"
 "Language: no_NO\n"
@@ -21,7 +21,7 @@ msgstr ""
 msgid "API endpoint not found"
 msgstr "API-endepunkt ikke funnet"
 
-#: InvenTree/api.py:329
+#: InvenTree/api.py:335
 msgid "User does not have permission to view this model"
 msgstr "Brukeren har ikke rettigheter til å se denne modellen"
 
@@ -1771,7 +1771,7 @@ msgid "Completed Outputs"
 msgstr "Fullførte byggeresultater"
 
 #: build/templates/build/build_base.html:191
-#: build/templates/build/detail.html:101 order/api.py:1454 order/models.py:1317
+#: build/templates/build/detail.html:101 order/api.py:1442 order/models.py:1317
 #: order/models.py:1416 order/models.py:1564
 #: order/templates/order/sales_order_base.html:9
 #: order/templates/order/sales_order_base.html:28
@@ -4469,7 +4469,7 @@ msgstr "Total pris"
 msgid "No matching purchase order found"
 msgstr "Ingen samsvarende innkjøpsordre funnet"
 
-#: order/api.py:1452 order/models.py:1191 order/models.py:1275
+#: order/api.py:1440 order/models.py:1191 order/models.py:1275
 #: order/templates/order/order_base.html:9
 #: order/templates/order/order_base.html:18
 #: report/templates/report/inventree_po_report_base.html:14
@@ -4483,7 +4483,7 @@ msgstr "Ingen samsvarende innkjøpsordre funnet"
 msgid "Purchase Order"
 msgstr "Innkjøpsordre"
 
-#: order/api.py:1456 order/models.py:1922 order/models.py:1968
+#: order/api.py:1444 order/models.py:1922 order/models.py:1968
 #: order/templates/order/return_order_base.html:9
 #: order/templates/order/return_order_base.html:28
 #: report/templates/report/inventree_return_order_report_base.html:13
@@ -4492,7 +4492,7 @@ msgstr "Innkjøpsordre"
 msgid "Return Order"
 msgstr "Returordre"
 
-#: order/api.py:1458 templates/js/translated/sales_order.js:1039
+#: order/api.py:1446 templates/js/translated/sales_order.js:1039
 msgid "Unknown"
 msgstr "Ukjent"
 
@@ -5545,31 +5545,31 @@ msgstr "Minstepris"
 msgid "Maximum Price"
 msgstr "Makspris"
 
-#: part/api.py:501
+#: part/api.py:497
 msgid "Incoming Purchase Order"
 msgstr "Innkommende innkjøpsordre"
 
-#: part/api.py:521
+#: part/api.py:517
 msgid "Outgoing Sales Order"
 msgstr "Utgående salgsordre"
 
-#: part/api.py:539
+#: part/api.py:535
 msgid "Stock produced by Build Order"
 msgstr "Lagervarer produsert av bygg order"
 
-#: part/api.py:625
+#: part/api.py:621
 msgid "Stock required for Build Order"
 msgstr "Lagervarer som kreves for Bygg Order"
 
-#: part/api.py:773
+#: part/api.py:769
 msgid "Valid"
 msgstr "Gyldig"
 
-#: part/api.py:774
+#: part/api.py:770
 msgid "Validate entire Bill of Materials"
 msgstr "Godkjenn hele Stykklisten"
 
-#: part/api.py:780
+#: part/api.py:776
 msgid "This option must be selected"
 msgstr "Dette alternativet må være valgt"
 
diff --git a/InvenTree/locale/pl/LC_MESSAGES/django.po b/InvenTree/locale/pl/LC_MESSAGES/django.po
index e147d3a385..083a2413af 100644
--- a/InvenTree/locale/pl/LC_MESSAGES/django.po
+++ b/InvenTree/locale/pl/LC_MESSAGES/django.po
@@ -2,8 +2,8 @@ msgid ""
 msgstr ""
 "Project-Id-Version: inventree\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2023-09-10 11:39+0000\n"
-"PO-Revision-Date: 2023-09-10 23:40\n"
+"POT-Creation-Date: 2023-09-12 01:47+0000\n"
+"PO-Revision-Date: 2023-09-14 01:15\n"
 "Last-Translator: \n"
 "Language-Team: Polish\n"
 "Language: pl_PL\n"
@@ -21,7 +21,7 @@ msgstr ""
 msgid "API endpoint not found"
 msgstr "Nie znaleziono punktu końcowego API"
 
-#: InvenTree/api.py:329
+#: InvenTree/api.py:335
 msgid "User does not have permission to view this model"
 msgstr ""
 
@@ -1771,7 +1771,7 @@ msgid "Completed Outputs"
 msgstr ""
 
 #: build/templates/build/build_base.html:191
-#: build/templates/build/detail.html:101 order/api.py:1454 order/models.py:1317
+#: build/templates/build/detail.html:101 order/api.py:1442 order/models.py:1317
 #: order/models.py:1416 order/models.py:1564
 #: order/templates/order/sales_order_base.html:9
 #: order/templates/order/sales_order_base.html:28
@@ -4469,7 +4469,7 @@ msgstr "Cena całkowita"
 msgid "No matching purchase order found"
 msgstr ""
 
-#: order/api.py:1452 order/models.py:1191 order/models.py:1275
+#: order/api.py:1440 order/models.py:1191 order/models.py:1275
 #: order/templates/order/order_base.html:9
 #: order/templates/order/order_base.html:18
 #: report/templates/report/inventree_po_report_base.html:14
@@ -4483,7 +4483,7 @@ msgstr ""
 msgid "Purchase Order"
 msgstr "Zlecenie zakupu"
 
-#: order/api.py:1456 order/models.py:1922 order/models.py:1968
+#: order/api.py:1444 order/models.py:1922 order/models.py:1968
 #: order/templates/order/return_order_base.html:9
 #: order/templates/order/return_order_base.html:28
 #: report/templates/report/inventree_return_order_report_base.html:13
@@ -4492,7 +4492,7 @@ msgstr "Zlecenie zakupu"
 msgid "Return Order"
 msgstr ""
 
-#: order/api.py:1458 templates/js/translated/sales_order.js:1039
+#: order/api.py:1446 templates/js/translated/sales_order.js:1039
 msgid "Unknown"
 msgstr ""
 
@@ -5545,31 +5545,31 @@ msgstr ""
 msgid "Maximum Price"
 msgstr ""
 
-#: part/api.py:501
+#: part/api.py:497
 msgid "Incoming Purchase Order"
 msgstr ""
 
-#: part/api.py:521
+#: part/api.py:517
 msgid "Outgoing Sales Order"
 msgstr ""
 
-#: part/api.py:539
+#: part/api.py:535
 msgid "Stock produced by Build Order"
 msgstr ""
 
-#: part/api.py:625
+#: part/api.py:621
 msgid "Stock required for Build Order"
 msgstr ""
 
-#: part/api.py:773
+#: part/api.py:769
 msgid "Valid"
 msgstr "Ważny"
 
-#: part/api.py:774
+#: part/api.py:770
 msgid "Validate entire Bill of Materials"
 msgstr ""
 
-#: part/api.py:780
+#: part/api.py:776
 msgid "This option must be selected"
 msgstr "Ta opcja musi być zaznaczona"
 
diff --git a/InvenTree/locale/pt/LC_MESSAGES/django.po b/InvenTree/locale/pt/LC_MESSAGES/django.po
index 0df4b3ab29..5a83dd07b1 100644
--- a/InvenTree/locale/pt/LC_MESSAGES/django.po
+++ b/InvenTree/locale/pt/LC_MESSAGES/django.po
@@ -2,8 +2,8 @@ msgid ""
 msgstr ""
 "Project-Id-Version: inventree\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2023-09-10 11:39+0000\n"
-"PO-Revision-Date: 2023-09-12 00:11\n"
+"POT-Creation-Date: 2023-09-12 01:47+0000\n"
+"PO-Revision-Date: 2023-09-14 01:15\n"
 "Last-Translator: \n"
 "Language-Team: Portuguese, Brazilian\n"
 "Language: pt_BR\n"
@@ -21,7 +21,7 @@ msgstr ""
 msgid "API endpoint not found"
 msgstr "API endpoint não encontrado"
 
-#: InvenTree/api.py:329
+#: InvenTree/api.py:335
 msgid "User does not have permission to view this model"
 msgstr "Usuário não tem permissão para ver este modelo"
 
@@ -1771,7 +1771,7 @@ msgid "Completed Outputs"
 msgstr "Saídas Concluídas"
 
 #: build/templates/build/build_base.html:191
-#: build/templates/build/detail.html:101 order/api.py:1454 order/models.py:1317
+#: build/templates/build/detail.html:101 order/api.py:1442 order/models.py:1317
 #: order/models.py:1416 order/models.py:1564
 #: order/templates/order/sales_order_base.html:9
 #: order/templates/order/sales_order_base.html:28
@@ -4469,7 +4469,7 @@ msgstr "Preço Total"
 msgid "No matching purchase order found"
 msgstr "Nenhum pedido de compra correspondente encontrado"
 
-#: order/api.py:1452 order/models.py:1191 order/models.py:1275
+#: order/api.py:1440 order/models.py:1191 order/models.py:1275
 #: order/templates/order/order_base.html:9
 #: order/templates/order/order_base.html:18
 #: report/templates/report/inventree_po_report_base.html:14
@@ -4483,7 +4483,7 @@ msgstr "Nenhum pedido de compra correspondente encontrado"
 msgid "Purchase Order"
 msgstr "Pedido de Compra"
 
-#: order/api.py:1456 order/models.py:1922 order/models.py:1968
+#: order/api.py:1444 order/models.py:1922 order/models.py:1968
 #: order/templates/order/return_order_base.html:9
 #: order/templates/order/return_order_base.html:28
 #: report/templates/report/inventree_return_order_report_base.html:13
@@ -4492,7 +4492,7 @@ msgstr "Pedido de Compra"
 msgid "Return Order"
 msgstr "Devolver pedido"
 
-#: order/api.py:1458 templates/js/translated/sales_order.js:1039
+#: order/api.py:1446 templates/js/translated/sales_order.js:1039
 msgid "Unknown"
 msgstr "Desconhecido"
 
@@ -5545,31 +5545,31 @@ msgstr "Preço Mínimo"
 msgid "Maximum Price"
 msgstr "Preço Máximo"
 
-#: part/api.py:501
+#: part/api.py:497
 msgid "Incoming Purchase Order"
 msgstr "Pedido de compra recebido"
 
-#: part/api.py:521
+#: part/api.py:517
 msgid "Outgoing Sales Order"
 msgstr "Pedidos de Venda Feitos"
 
-#: part/api.py:539
+#: part/api.py:535
 msgid "Stock produced by Build Order"
 msgstr "Estoque produzido pelo Pedido de Produção"
 
-#: part/api.py:625
+#: part/api.py:621
 msgid "Stock required for Build Order"
 msgstr "Estoque obrigatório para Pedido de Produção"
 
-#: part/api.py:773
+#: part/api.py:769
 msgid "Valid"
 msgstr "Válido"
 
-#: part/api.py:774
+#: part/api.py:770
 msgid "Validate entire Bill of Materials"
 msgstr "Validar a Lista de Materiais completa"
 
-#: part/api.py:780
+#: part/api.py:776
 msgid "This option must be selected"
 msgstr "Esta opção deve ser selecionada"
 
diff --git a/InvenTree/locale/pt_br/LC_MESSAGES/django.po b/InvenTree/locale/pt_br/LC_MESSAGES/django.po
index 6a10ae7509..3355ad7f0d 100644
--- a/InvenTree/locale/pt_br/LC_MESSAGES/django.po
+++ b/InvenTree/locale/pt_br/LC_MESSAGES/django.po
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2023-09-07 23:12+0000\n"
+"POT-Creation-Date: 2023-09-12 06:37+0000\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -22,7 +22,7 @@ msgstr ""
 msgid "API endpoint not found"
 msgstr ""
 
-#: InvenTree/api.py:329
+#: InvenTree/api.py:335
 msgid "User does not have permission to view this model"
 msgstr ""
 
@@ -62,10 +62,10 @@ msgstr ""
 #: order/templates/order/so_sidebar.html:17 part/admin.py:41
 #: part/models.py:3042 part/templates/part/part_sidebar.html:63
 #: report/templates/report/inventree_build_order_base.html:172
-#: stock/admin.py:121 stock/models.py:2160 stock/models.py:2268
+#: stock/admin.py:121 stock/models.py:2191 stock/models.py:2299
 #: stock/serializers.py:408 stock/serializers.py:542 stock/serializers.py:623
 #: stock/serializers.py:681 stock/serializers.py:956 stock/serializers.py:1055
-#: stock/serializers.py:1187 stock/templates/stock/stock_sidebar.html:25
+#: stock/serializers.py:1216 stock/templates/stock/stock_sidebar.html:25
 #: templates/js/translated/barcode.js:143 templates/js/translated/bom.js:1254
 #: templates/js/translated/company.js:1715 templates/js/translated/order.js:347
 #: templates/js/translated/part.js:1057
@@ -258,7 +258,7 @@ msgstr ""
 msgid "Missing external link"
 msgstr ""
 
-#: InvenTree/models.py:486 stock/models.py:2262
+#: InvenTree/models.py:486 stock/models.py:2293
 #: templates/js/translated/attachment.js:119
 #: templates/js/translated/attachment.js:326
 msgid "Attachment"
@@ -1099,7 +1099,8 @@ msgid "Build status code"
 msgstr ""
 
 #: build/models.py:250 build/serializers.py:277 order/serializers.py:512
-#: stock/models.py:739 templates/js/translated/purchase_order.js:1114
+#: stock/models.py:739 stock/serializers.py:1180
+#: templates/js/translated/purchase_order.js:1114
 msgid "Batch Code"
 msgstr ""
 
@@ -1399,7 +1400,7 @@ msgstr ""
 #: build/serializers.py:423 build/serializers.py:496 order/serializers.py:493
 #: order/serializers.py:612 order/serializers.py:1616 part/serializers.py:933
 #: stock/serializers.py:401 stock/serializers.py:537 stock/serializers.py:618
-#: stock/serializers.py:1048 stock/serializers.py:1290
+#: stock/serializers.py:1048 stock/serializers.py:1319
 #: stock/templates/stock/item_base.html:395
 #: templates/js/translated/barcode.js:530
 #: templates/js/translated/barcode.js:778 templates/js/translated/build.js:980
@@ -1439,7 +1440,8 @@ msgstr ""
 #: build/serializers.py:503 build/templates/build/build_base.html:152
 #: build/templates/build/detail.html:62 order/models.py:804
 #: order/models.py:1763 order/serializers.py:530 stock/admin.py:106
-#: stock/serializers.py:677 stock/templates/stock/item_base.html:428
+#: stock/serializers.py:677 stock/serializers.py:1187
+#: stock/templates/stock/item_base.html:428
 #: templates/js/translated/barcode.js:252 templates/js/translated/build.js:2161
 #: templates/js/translated/purchase_order.js:1293
 #: templates/js/translated/purchase_order.js:1697
@@ -1770,7 +1772,7 @@ msgid "Completed Outputs"
 msgstr ""
 
 #: build/templates/build/build_base.html:191
-#: build/templates/build/detail.html:101 order/api.py:1454 order/models.py:1317
+#: build/templates/build/detail.html:101 order/api.py:1442 order/models.py:1317
 #: order/models.py:1416 order/models.py:1564
 #: order/templates/order/sales_order_base.html:9
 #: order/templates/order/sales_order_base.html:28
@@ -3788,7 +3790,7 @@ msgstr ""
 
 #: company/models.py:546
 #: report/templates/report/inventree_test_report_base.html:104
-#: stock/models.py:2255 templates/js/translated/company.js:1197
+#: stock/models.py:2286 templates/js/translated/company.js:1197
 #: templates/js/translated/company.js:1450 templates/js/translated/part.js:1469
 #: templates/js/translated/stock.js:1464
 msgid "Value"
@@ -3885,7 +3887,7 @@ msgid "Minimum charge (e.g. stocking fee)"
 msgstr ""
 
 #: company/models.py:752 company/templates/company/supplier_part.html:161
-#: stock/admin.py:119 stock/models.py:701
+#: stock/admin.py:119 stock/models.py:701 stock/serializers.py:1195
 #: stock/templates/stock/item_base.html:241
 #: templates/js/translated/company.js:1677
 #: templates/js/translated/stock.js:2356
@@ -4468,7 +4470,7 @@ msgstr ""
 msgid "No matching purchase order found"
 msgstr ""
 
-#: order/api.py:1452 order/models.py:1191 order/models.py:1275
+#: order/api.py:1440 order/models.py:1191 order/models.py:1275
 #: order/templates/order/order_base.html:9
 #: order/templates/order/order_base.html:18
 #: report/templates/report/inventree_po_report_base.html:14
@@ -4482,7 +4484,7 @@ msgstr ""
 msgid "Purchase Order"
 msgstr ""
 
-#: order/api.py:1456 order/models.py:1922 order/models.py:1968
+#: order/api.py:1444 order/models.py:1922 order/models.py:1968
 #: order/templates/order/return_order_base.html:9
 #: order/templates/order/return_order_base.html:28
 #: report/templates/report/inventree_return_order_report_base.html:13
@@ -4491,7 +4493,7 @@ msgstr ""
 msgid "Return Order"
 msgstr ""
 
-#: order/api.py:1458 templates/js/translated/sales_order.js:1039
+#: order/api.py:1446 templates/js/translated/sales_order.js:1039
 msgid "Unknown"
 msgstr ""
 
@@ -5544,31 +5546,31 @@ msgstr ""
 msgid "Maximum Price"
 msgstr ""
 
-#: part/api.py:501
+#: part/api.py:497
 msgid "Incoming Purchase Order"
 msgstr ""
 
-#: part/api.py:521
+#: part/api.py:517
 msgid "Outgoing Sales Order"
 msgstr ""
 
-#: part/api.py:539
+#: part/api.py:535
 msgid "Stock produced by Build Order"
 msgstr ""
 
-#: part/api.py:625
+#: part/api.py:621
 msgid "Stock required for Build Order"
 msgstr ""
 
-#: part/api.py:773
+#: part/api.py:769
 msgid "Valid"
 msgstr ""
 
-#: part/api.py:774
+#: part/api.py:770
 msgid "Validate entire Bill of Materials"
 msgstr ""
 
-#: part/api.py:780
+#: part/api.py:776
 msgid "This option must be selected"
 msgstr ""
 
@@ -7378,35 +7380,35 @@ msgstr ""
 msgid "Plugin requires at most version {v}"
 msgstr ""
 
-#: plugin/samples/integration/sample.py:39
+#: plugin/samples/integration/sample.py:50
 msgid "Enable PO"
 msgstr ""
 
-#: plugin/samples/integration/sample.py:40
+#: plugin/samples/integration/sample.py:51
 msgid "Enable PO functionality in InvenTree interface"
 msgstr ""
 
-#: plugin/samples/integration/sample.py:45
+#: plugin/samples/integration/sample.py:56
 msgid "API Key"
 msgstr ""
 
-#: plugin/samples/integration/sample.py:46
+#: plugin/samples/integration/sample.py:57
 msgid "Key required for accessing external API"
 msgstr ""
 
-#: plugin/samples/integration/sample.py:50
+#: plugin/samples/integration/sample.py:61
 msgid "Numerical"
 msgstr ""
 
-#: plugin/samples/integration/sample.py:51
+#: plugin/samples/integration/sample.py:62
 msgid "A numerical setting"
 msgstr ""
 
-#: plugin/samples/integration/sample.py:56
+#: plugin/samples/integration/sample.py:67
 msgid "Choice Setting"
 msgstr ""
 
-#: plugin/samples/integration/sample.py:57
+#: plugin/samples/integration/sample.py:68
 msgid "A setting with multiple choices"
 msgstr ""
 
@@ -7618,12 +7620,12 @@ msgid "Test Results"
 msgstr ""
 
 #: report/templates/report/inventree_test_report_base.html:102
-#: stock/models.py:2243 templates/js/translated/stock.js:1437
+#: stock/models.py:2274 templates/js/translated/stock.js:1437
 msgid "Test"
 msgstr ""
 
 #: report/templates/report/inventree_test_report_base.html:103
-#: stock/models.py:2249
+#: stock/models.py:2280
 msgid "Result"
 msgstr ""
 
@@ -7833,7 +7835,7 @@ msgstr ""
 msgid "Where is this stock item located?"
 msgstr ""
 
-#: stock/models.py:702
+#: stock/models.py:702 stock/serializers.py:1196
 msgid "Packaging this stock item is stored in"
 msgstr ""
 
@@ -7845,7 +7847,7 @@ msgstr ""
 msgid "Serial number for this item"
 msgstr ""
 
-#: stock/models.py:741
+#: stock/models.py:741 stock/serializers.py:1181
 msgid "Batch code for this stock item"
 msgstr ""
 
@@ -7966,39 +7968,39 @@ msgstr ""
 msgid "Stock status codes must match"
 msgstr ""
 
-#: stock/models.py:1679
+#: stock/models.py:1702
 msgid "StockItem cannot be moved as it is not in stock"
 msgstr ""
 
-#: stock/models.py:2161
+#: stock/models.py:2192
 msgid "Entry notes"
 msgstr ""
 
-#: stock/models.py:2219
+#: stock/models.py:2250
 msgid "Value must be provided for this test"
 msgstr ""
 
-#: stock/models.py:2225
+#: stock/models.py:2256
 msgid "Attachment must be uploaded for this test"
 msgstr ""
 
-#: stock/models.py:2244
+#: stock/models.py:2275
 msgid "Test name"
 msgstr ""
 
-#: stock/models.py:2250
+#: stock/models.py:2281
 msgid "Test result"
 msgstr ""
 
-#: stock/models.py:2256
+#: stock/models.py:2287
 msgid "Test output value"
 msgstr ""
 
-#: stock/models.py:2263
+#: stock/models.py:2294
 msgid "Test result attachment"
 msgstr ""
 
-#: stock/models.py:2269
+#: stock/models.py:2300
 msgid "Test notes"
 msgstr ""
 
@@ -8027,7 +8029,7 @@ msgstr ""
 msgid "Enter serial numbers for new items"
 msgstr ""
 
-#: stock/serializers.py:402 stock/serializers.py:1049 stock/serializers.py:1291
+#: stock/serializers.py:402 stock/serializers.py:1049 stock/serializers.py:1320
 msgid "Destination stock location"
 msgstr ""
 
@@ -8104,7 +8106,7 @@ msgstr ""
 msgid "Stock assignment notes"
 msgstr ""
 
-#: stock/serializers.py:967 stock/serializers.py:1198
+#: stock/serializers.py:967 stock/serializers.py:1227
 msgid "A list of stock items must be provided"
 msgstr ""
 
@@ -8132,11 +8134,15 @@ msgstr ""
 msgid "At least two stock items must be provided"
 msgstr ""
 
-#: stock/serializers.py:1160
+#: stock/serializers.py:1167
 msgid "StockItem primary key value"
 msgstr ""
 
 #: stock/serializers.py:1188
+msgid "Stock item status code"
+msgstr ""
+
+#: stock/serializers.py:1217
 msgid "Stock transaction notes"
 msgstr ""
 
diff --git a/InvenTree/locale/ru/LC_MESSAGES/django.po b/InvenTree/locale/ru/LC_MESSAGES/django.po
index 773d858432..ab7b60b7a2 100644
--- a/InvenTree/locale/ru/LC_MESSAGES/django.po
+++ b/InvenTree/locale/ru/LC_MESSAGES/django.po
@@ -2,8 +2,8 @@ msgid ""
 msgstr ""
 "Project-Id-Version: inventree\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2023-09-10 11:39+0000\n"
-"PO-Revision-Date: 2023-09-10 23:40\n"
+"POT-Creation-Date: 2023-09-12 01:47+0000\n"
+"PO-Revision-Date: 2023-09-14 01:15\n"
 "Last-Translator: \n"
 "Language-Team: Russian\n"
 "Language: ru_RU\n"
@@ -21,7 +21,7 @@ msgstr ""
 msgid "API endpoint not found"
 msgstr "Конечная точка API не обнаружена"
 
-#: InvenTree/api.py:329
+#: InvenTree/api.py:335
 msgid "User does not have permission to view this model"
 msgstr "У пользователя недостаточно прав для просмотра этой модели!"
 
@@ -1771,7 +1771,7 @@ msgid "Completed Outputs"
 msgstr ""
 
 #: build/templates/build/build_base.html:191
-#: build/templates/build/detail.html:101 order/api.py:1454 order/models.py:1317
+#: build/templates/build/detail.html:101 order/api.py:1442 order/models.py:1317
 #: order/models.py:1416 order/models.py:1564
 #: order/templates/order/sales_order_base.html:9
 #: order/templates/order/sales_order_base.html:28
@@ -4469,7 +4469,7 @@ msgstr "Общая стоимость"
 msgid "No matching purchase order found"
 msgstr ""
 
-#: order/api.py:1452 order/models.py:1191 order/models.py:1275
+#: order/api.py:1440 order/models.py:1191 order/models.py:1275
 #: order/templates/order/order_base.html:9
 #: order/templates/order/order_base.html:18
 #: report/templates/report/inventree_po_report_base.html:14
@@ -4483,7 +4483,7 @@ msgstr ""
 msgid "Purchase Order"
 msgstr "Заказ на закупку"
 
-#: order/api.py:1456 order/models.py:1922 order/models.py:1968
+#: order/api.py:1444 order/models.py:1922 order/models.py:1968
 #: order/templates/order/return_order_base.html:9
 #: order/templates/order/return_order_base.html:28
 #: report/templates/report/inventree_return_order_report_base.html:13
@@ -4492,7 +4492,7 @@ msgstr "Заказ на закупку"
 msgid "Return Order"
 msgstr ""
 
-#: order/api.py:1458 templates/js/translated/sales_order.js:1039
+#: order/api.py:1446 templates/js/translated/sales_order.js:1039
 msgid "Unknown"
 msgstr ""
 
@@ -5545,31 +5545,31 @@ msgstr ""
 msgid "Maximum Price"
 msgstr ""
 
-#: part/api.py:501
+#: part/api.py:497
 msgid "Incoming Purchase Order"
 msgstr ""
 
-#: part/api.py:521
+#: part/api.py:517
 msgid "Outgoing Sales Order"
 msgstr ""
 
-#: part/api.py:539
+#: part/api.py:535
 msgid "Stock produced by Build Order"
 msgstr ""
 
-#: part/api.py:625
+#: part/api.py:621
 msgid "Stock required for Build Order"
 msgstr ""
 
-#: part/api.py:773
+#: part/api.py:769
 msgid "Valid"
 msgstr ""
 
-#: part/api.py:774
+#: part/api.py:770
 msgid "Validate entire Bill of Materials"
 msgstr ""
 
-#: part/api.py:780
+#: part/api.py:776
 msgid "This option must be selected"
 msgstr "Необходимо выбрать эту опцию"
 
diff --git a/InvenTree/locale/sl/LC_MESSAGES/django.po b/InvenTree/locale/sl/LC_MESSAGES/django.po
index 59029a4993..46519663cc 100644
--- a/InvenTree/locale/sl/LC_MESSAGES/django.po
+++ b/InvenTree/locale/sl/LC_MESSAGES/django.po
@@ -2,8 +2,8 @@ msgid ""
 msgstr ""
 "Project-Id-Version: inventree\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2023-09-10 11:39+0000\n"
-"PO-Revision-Date: 2023-09-10 23:40\n"
+"POT-Creation-Date: 2023-09-12 01:47+0000\n"
+"PO-Revision-Date: 2023-09-14 01:15\n"
 "Last-Translator: \n"
 "Language-Team: Slovenian\n"
 "Language: sl_SI\n"
@@ -21,7 +21,7 @@ msgstr ""
 msgid "API endpoint not found"
 msgstr "API vmesnik ni najden"
 
-#: InvenTree/api.py:329
+#: InvenTree/api.py:335
 msgid "User does not have permission to view this model"
 msgstr ""
 
@@ -1771,7 +1771,7 @@ msgid "Completed Outputs"
 msgstr ""
 
 #: build/templates/build/build_base.html:191
-#: build/templates/build/detail.html:101 order/api.py:1454 order/models.py:1317
+#: build/templates/build/detail.html:101 order/api.py:1442 order/models.py:1317
 #: order/models.py:1416 order/models.py:1564
 #: order/templates/order/sales_order_base.html:9
 #: order/templates/order/sales_order_base.html:28
@@ -4469,7 +4469,7 @@ msgstr ""
 msgid "No matching purchase order found"
 msgstr ""
 
-#: order/api.py:1452 order/models.py:1191 order/models.py:1275
+#: order/api.py:1440 order/models.py:1191 order/models.py:1275
 #: order/templates/order/order_base.html:9
 #: order/templates/order/order_base.html:18
 #: report/templates/report/inventree_po_report_base.html:14
@@ -4483,7 +4483,7 @@ msgstr ""
 msgid "Purchase Order"
 msgstr ""
 
-#: order/api.py:1456 order/models.py:1922 order/models.py:1968
+#: order/api.py:1444 order/models.py:1922 order/models.py:1968
 #: order/templates/order/return_order_base.html:9
 #: order/templates/order/return_order_base.html:28
 #: report/templates/report/inventree_return_order_report_base.html:13
@@ -4492,7 +4492,7 @@ msgstr ""
 msgid "Return Order"
 msgstr ""
 
-#: order/api.py:1458 templates/js/translated/sales_order.js:1039
+#: order/api.py:1446 templates/js/translated/sales_order.js:1039
 msgid "Unknown"
 msgstr ""
 
@@ -5545,31 +5545,31 @@ msgstr ""
 msgid "Maximum Price"
 msgstr ""
 
-#: part/api.py:501
+#: part/api.py:497
 msgid "Incoming Purchase Order"
 msgstr ""
 
-#: part/api.py:521
+#: part/api.py:517
 msgid "Outgoing Sales Order"
 msgstr ""
 
-#: part/api.py:539
+#: part/api.py:535
 msgid "Stock produced by Build Order"
 msgstr ""
 
-#: part/api.py:625
+#: part/api.py:621
 msgid "Stock required for Build Order"
 msgstr ""
 
-#: part/api.py:773
+#: part/api.py:769
 msgid "Valid"
 msgstr ""
 
-#: part/api.py:774
+#: part/api.py:770
 msgid "Validate entire Bill of Materials"
 msgstr ""
 
-#: part/api.py:780
+#: part/api.py:776
 msgid "This option must be selected"
 msgstr ""
 
diff --git a/InvenTree/locale/sv/LC_MESSAGES/django.po b/InvenTree/locale/sv/LC_MESSAGES/django.po
index e21ab08b3f..0500387e99 100644
--- a/InvenTree/locale/sv/LC_MESSAGES/django.po
+++ b/InvenTree/locale/sv/LC_MESSAGES/django.po
@@ -2,8 +2,8 @@ msgid ""
 msgstr ""
 "Project-Id-Version: inventree\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2023-09-10 11:39+0000\n"
-"PO-Revision-Date: 2023-09-10 23:40\n"
+"POT-Creation-Date: 2023-09-12 01:47+0000\n"
+"PO-Revision-Date: 2023-09-14 01:15\n"
 "Last-Translator: \n"
 "Language-Team: Swedish\n"
 "Language: sv_SE\n"
@@ -21,7 +21,7 @@ msgstr ""
 msgid "API endpoint not found"
 msgstr "API-slutpunkt hittades inte"
 
-#: InvenTree/api.py:329
+#: InvenTree/api.py:335
 msgid "User does not have permission to view this model"
 msgstr "Användaren har inte behörighet att se denna modell"
 
@@ -1771,7 +1771,7 @@ msgid "Completed Outputs"
 msgstr ""
 
 #: build/templates/build/build_base.html:191
-#: build/templates/build/detail.html:101 order/api.py:1454 order/models.py:1317
+#: build/templates/build/detail.html:101 order/api.py:1442 order/models.py:1317
 #: order/models.py:1416 order/models.py:1564
 #: order/templates/order/sales_order_base.html:9
 #: order/templates/order/sales_order_base.html:28
@@ -4469,7 +4469,7 @@ msgstr ""
 msgid "No matching purchase order found"
 msgstr ""
 
-#: order/api.py:1452 order/models.py:1191 order/models.py:1275
+#: order/api.py:1440 order/models.py:1191 order/models.py:1275
 #: order/templates/order/order_base.html:9
 #: order/templates/order/order_base.html:18
 #: report/templates/report/inventree_po_report_base.html:14
@@ -4483,7 +4483,7 @@ msgstr ""
 msgid "Purchase Order"
 msgstr ""
 
-#: order/api.py:1456 order/models.py:1922 order/models.py:1968
+#: order/api.py:1444 order/models.py:1922 order/models.py:1968
 #: order/templates/order/return_order_base.html:9
 #: order/templates/order/return_order_base.html:28
 #: report/templates/report/inventree_return_order_report_base.html:13
@@ -4492,7 +4492,7 @@ msgstr ""
 msgid "Return Order"
 msgstr ""
 
-#: order/api.py:1458 templates/js/translated/sales_order.js:1039
+#: order/api.py:1446 templates/js/translated/sales_order.js:1039
 msgid "Unknown"
 msgstr ""
 
@@ -5545,31 +5545,31 @@ msgstr ""
 msgid "Maximum Price"
 msgstr ""
 
-#: part/api.py:501
+#: part/api.py:497
 msgid "Incoming Purchase Order"
 msgstr ""
 
-#: part/api.py:521
+#: part/api.py:517
 msgid "Outgoing Sales Order"
 msgstr ""
 
-#: part/api.py:539
+#: part/api.py:535
 msgid "Stock produced by Build Order"
 msgstr ""
 
-#: part/api.py:625
+#: part/api.py:621
 msgid "Stock required for Build Order"
 msgstr ""
 
-#: part/api.py:773
+#: part/api.py:769
 msgid "Valid"
 msgstr ""
 
-#: part/api.py:774
+#: part/api.py:770
 msgid "Validate entire Bill of Materials"
 msgstr ""
 
-#: part/api.py:780
+#: part/api.py:776
 msgid "This option must be selected"
 msgstr ""
 
diff --git a/InvenTree/locale/th/LC_MESSAGES/django.po b/InvenTree/locale/th/LC_MESSAGES/django.po
index 6e5bbadc87..26faf18c34 100644
--- a/InvenTree/locale/th/LC_MESSAGES/django.po
+++ b/InvenTree/locale/th/LC_MESSAGES/django.po
@@ -2,8 +2,8 @@ msgid ""
 msgstr ""
 "Project-Id-Version: inventree\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2023-09-10 11:39+0000\n"
-"PO-Revision-Date: 2023-09-10 23:40\n"
+"POT-Creation-Date: 2023-09-12 01:47+0000\n"
+"PO-Revision-Date: 2023-09-14 01:15\n"
 "Last-Translator: \n"
 "Language-Team: Thai\n"
 "Language: th_TH\n"
@@ -21,7 +21,7 @@ msgstr ""
 msgid "API endpoint not found"
 msgstr ""
 
-#: InvenTree/api.py:329
+#: InvenTree/api.py:335
 msgid "User does not have permission to view this model"
 msgstr ""
 
@@ -1771,7 +1771,7 @@ msgid "Completed Outputs"
 msgstr ""
 
 #: build/templates/build/build_base.html:191
-#: build/templates/build/detail.html:101 order/api.py:1454 order/models.py:1317
+#: build/templates/build/detail.html:101 order/api.py:1442 order/models.py:1317
 #: order/models.py:1416 order/models.py:1564
 #: order/templates/order/sales_order_base.html:9
 #: order/templates/order/sales_order_base.html:28
@@ -4469,7 +4469,7 @@ msgstr ""
 msgid "No matching purchase order found"
 msgstr ""
 
-#: order/api.py:1452 order/models.py:1191 order/models.py:1275
+#: order/api.py:1440 order/models.py:1191 order/models.py:1275
 #: order/templates/order/order_base.html:9
 #: order/templates/order/order_base.html:18
 #: report/templates/report/inventree_po_report_base.html:14
@@ -4483,7 +4483,7 @@ msgstr ""
 msgid "Purchase Order"
 msgstr ""
 
-#: order/api.py:1456 order/models.py:1922 order/models.py:1968
+#: order/api.py:1444 order/models.py:1922 order/models.py:1968
 #: order/templates/order/return_order_base.html:9
 #: order/templates/order/return_order_base.html:28
 #: report/templates/report/inventree_return_order_report_base.html:13
@@ -4492,7 +4492,7 @@ msgstr ""
 msgid "Return Order"
 msgstr ""
 
-#: order/api.py:1458 templates/js/translated/sales_order.js:1039
+#: order/api.py:1446 templates/js/translated/sales_order.js:1039
 msgid "Unknown"
 msgstr ""
 
@@ -5545,31 +5545,31 @@ msgstr ""
 msgid "Maximum Price"
 msgstr ""
 
-#: part/api.py:501
+#: part/api.py:497
 msgid "Incoming Purchase Order"
 msgstr ""
 
-#: part/api.py:521
+#: part/api.py:517
 msgid "Outgoing Sales Order"
 msgstr ""
 
-#: part/api.py:539
+#: part/api.py:535
 msgid "Stock produced by Build Order"
 msgstr ""
 
-#: part/api.py:625
+#: part/api.py:621
 msgid "Stock required for Build Order"
 msgstr ""
 
-#: part/api.py:773
+#: part/api.py:769
 msgid "Valid"
 msgstr ""
 
-#: part/api.py:774
+#: part/api.py:770
 msgid "Validate entire Bill of Materials"
 msgstr ""
 
-#: part/api.py:780
+#: part/api.py:776
 msgid "This option must be selected"
 msgstr ""
 
diff --git a/InvenTree/locale/tr/LC_MESSAGES/django.po b/InvenTree/locale/tr/LC_MESSAGES/django.po
index 253b39042a..46b9e3d2a9 100644
--- a/InvenTree/locale/tr/LC_MESSAGES/django.po
+++ b/InvenTree/locale/tr/LC_MESSAGES/django.po
@@ -2,8 +2,8 @@ msgid ""
 msgstr ""
 "Project-Id-Version: inventree\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2023-09-10 11:39+0000\n"
-"PO-Revision-Date: 2023-09-10 23:40\n"
+"POT-Creation-Date: 2023-09-12 01:47+0000\n"
+"PO-Revision-Date: 2023-09-14 01:15\n"
 "Last-Translator: \n"
 "Language-Team: Turkish\n"
 "Language: tr_TR\n"
@@ -21,7 +21,7 @@ msgstr ""
 msgid "API endpoint not found"
 msgstr "API uç noktası bulunamadı"
 
-#: InvenTree/api.py:329
+#: InvenTree/api.py:335
 msgid "User does not have permission to view this model"
 msgstr "Kullanıcının bu modeli görüntüleme izni yok"
 
@@ -1771,7 +1771,7 @@ msgid "Completed Outputs"
 msgstr ""
 
 #: build/templates/build/build_base.html:191
-#: build/templates/build/detail.html:101 order/api.py:1454 order/models.py:1317
+#: build/templates/build/detail.html:101 order/api.py:1442 order/models.py:1317
 #: order/models.py:1416 order/models.py:1564
 #: order/templates/order/sales_order_base.html:9
 #: order/templates/order/sales_order_base.html:28
@@ -4469,7 +4469,7 @@ msgstr ""
 msgid "No matching purchase order found"
 msgstr ""
 
-#: order/api.py:1452 order/models.py:1191 order/models.py:1275
+#: order/api.py:1440 order/models.py:1191 order/models.py:1275
 #: order/templates/order/order_base.html:9
 #: order/templates/order/order_base.html:18
 #: report/templates/report/inventree_po_report_base.html:14
@@ -4483,7 +4483,7 @@ msgstr ""
 msgid "Purchase Order"
 msgstr ""
 
-#: order/api.py:1456 order/models.py:1922 order/models.py:1968
+#: order/api.py:1444 order/models.py:1922 order/models.py:1968
 #: order/templates/order/return_order_base.html:9
 #: order/templates/order/return_order_base.html:28
 #: report/templates/report/inventree_return_order_report_base.html:13
@@ -4492,7 +4492,7 @@ msgstr ""
 msgid "Return Order"
 msgstr ""
 
-#: order/api.py:1458 templates/js/translated/sales_order.js:1039
+#: order/api.py:1446 templates/js/translated/sales_order.js:1039
 msgid "Unknown"
 msgstr ""
 
@@ -5545,31 +5545,31 @@ msgstr ""
 msgid "Maximum Price"
 msgstr ""
 
-#: part/api.py:501
+#: part/api.py:497
 msgid "Incoming Purchase Order"
 msgstr ""
 
-#: part/api.py:521
+#: part/api.py:517
 msgid "Outgoing Sales Order"
 msgstr ""
 
-#: part/api.py:539
+#: part/api.py:535
 msgid "Stock produced by Build Order"
 msgstr ""
 
-#: part/api.py:625
+#: part/api.py:621
 msgid "Stock required for Build Order"
 msgstr ""
 
-#: part/api.py:773
+#: part/api.py:769
 msgid "Valid"
 msgstr ""
 
-#: part/api.py:774
+#: part/api.py:770
 msgid "Validate entire Bill of Materials"
 msgstr ""
 
-#: part/api.py:780
+#: part/api.py:776
 msgid "This option must be selected"
 msgstr ""
 
diff --git a/InvenTree/locale/vi/LC_MESSAGES/django.po b/InvenTree/locale/vi/LC_MESSAGES/django.po
index e59ebc7c2a..c59679248a 100644
--- a/InvenTree/locale/vi/LC_MESSAGES/django.po
+++ b/InvenTree/locale/vi/LC_MESSAGES/django.po
@@ -2,8 +2,8 @@ msgid ""
 msgstr ""
 "Project-Id-Version: inventree\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2023-09-10 11:39+0000\n"
-"PO-Revision-Date: 2023-09-10 23:40\n"
+"POT-Creation-Date: 2023-09-12 01:47+0000\n"
+"PO-Revision-Date: 2023-09-14 01:15\n"
 "Last-Translator: \n"
 "Language-Team: Vietnamese\n"
 "Language: vi_VN\n"
@@ -21,7 +21,7 @@ msgstr ""
 msgid "API endpoint not found"
 msgstr "API endpoint không tồn tại"
 
-#: InvenTree/api.py:329
+#: InvenTree/api.py:335
 msgid "User does not have permission to view this model"
 msgstr "Người dùng không được phân quyền xem mẫu này"
 
@@ -1771,7 +1771,7 @@ msgid "Completed Outputs"
 msgstr "Đầu ra hoàn thiện"
 
 #: build/templates/build/build_base.html:191
-#: build/templates/build/detail.html:101 order/api.py:1454 order/models.py:1317
+#: build/templates/build/detail.html:101 order/api.py:1442 order/models.py:1317
 #: order/models.py:1416 order/models.py:1564
 #: order/templates/order/sales_order_base.html:9
 #: order/templates/order/sales_order_base.html:28
@@ -4469,7 +4469,7 @@ msgstr ""
 msgid "No matching purchase order found"
 msgstr ""
 
-#: order/api.py:1452 order/models.py:1191 order/models.py:1275
+#: order/api.py:1440 order/models.py:1191 order/models.py:1275
 #: order/templates/order/order_base.html:9
 #: order/templates/order/order_base.html:18
 #: report/templates/report/inventree_po_report_base.html:14
@@ -4483,7 +4483,7 @@ msgstr ""
 msgid "Purchase Order"
 msgstr "Đơn hàng"
 
-#: order/api.py:1456 order/models.py:1922 order/models.py:1968
+#: order/api.py:1444 order/models.py:1922 order/models.py:1968
 #: order/templates/order/return_order_base.html:9
 #: order/templates/order/return_order_base.html:28
 #: report/templates/report/inventree_return_order_report_base.html:13
@@ -4492,7 +4492,7 @@ msgstr "Đơn hàng"
 msgid "Return Order"
 msgstr ""
 
-#: order/api.py:1458 templates/js/translated/sales_order.js:1039
+#: order/api.py:1446 templates/js/translated/sales_order.js:1039
 msgid "Unknown"
 msgstr ""
 
@@ -5545,31 +5545,31 @@ msgstr ""
 msgid "Maximum Price"
 msgstr ""
 
-#: part/api.py:501
+#: part/api.py:497
 msgid "Incoming Purchase Order"
 msgstr ""
 
-#: part/api.py:521
+#: part/api.py:517
 msgid "Outgoing Sales Order"
 msgstr ""
 
-#: part/api.py:539
+#: part/api.py:535
 msgid "Stock produced by Build Order"
 msgstr ""
 
-#: part/api.py:625
+#: part/api.py:621
 msgid "Stock required for Build Order"
 msgstr ""
 
-#: part/api.py:773
+#: part/api.py:769
 msgid "Valid"
 msgstr ""
 
-#: part/api.py:774
+#: part/api.py:770
 msgid "Validate entire Bill of Materials"
 msgstr ""
 
-#: part/api.py:780
+#: part/api.py:776
 msgid "This option must be selected"
 msgstr ""
 
diff --git a/InvenTree/locale/zh/LC_MESSAGES/django.po b/InvenTree/locale/zh/LC_MESSAGES/django.po
index 5c0b56e0d0..6c32249879 100644
--- a/InvenTree/locale/zh/LC_MESSAGES/django.po
+++ b/InvenTree/locale/zh/LC_MESSAGES/django.po
@@ -2,8 +2,8 @@ msgid ""
 msgstr ""
 "Project-Id-Version: inventree\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2023-09-10 11:39+0000\n"
-"PO-Revision-Date: 2023-09-12 00:10\n"
+"POT-Creation-Date: 2023-09-12 01:47+0000\n"
+"PO-Revision-Date: 2023-09-14 01:15\n"
 "Last-Translator: \n"
 "Language-Team: Chinese Traditional\n"
 "Language: zh_TW\n"
@@ -21,7 +21,7 @@ msgstr ""
 msgid "API endpoint not found"
 msgstr "找不到 API 端點"
 
-#: InvenTree/api.py:329
+#: InvenTree/api.py:335
 msgid "User does not have permission to view this model"
 msgstr "使用者沒有檢視此模型的權限"
 
@@ -1771,7 +1771,7 @@ msgid "Completed Outputs"
 msgstr ""
 
 #: build/templates/build/build_base.html:191
-#: build/templates/build/detail.html:101 order/api.py:1454 order/models.py:1317
+#: build/templates/build/detail.html:101 order/api.py:1442 order/models.py:1317
 #: order/models.py:1416 order/models.py:1564
 #: order/templates/order/sales_order_base.html:9
 #: order/templates/order/sales_order_base.html:28
@@ -4469,7 +4469,7 @@ msgstr ""
 msgid "No matching purchase order found"
 msgstr ""
 
-#: order/api.py:1452 order/models.py:1191 order/models.py:1275
+#: order/api.py:1440 order/models.py:1191 order/models.py:1275
 #: order/templates/order/order_base.html:9
 #: order/templates/order/order_base.html:18
 #: report/templates/report/inventree_po_report_base.html:14
@@ -4483,7 +4483,7 @@ msgstr ""
 msgid "Purchase Order"
 msgstr ""
 
-#: order/api.py:1456 order/models.py:1922 order/models.py:1968
+#: order/api.py:1444 order/models.py:1922 order/models.py:1968
 #: order/templates/order/return_order_base.html:9
 #: order/templates/order/return_order_base.html:28
 #: report/templates/report/inventree_return_order_report_base.html:13
@@ -4492,7 +4492,7 @@ msgstr ""
 msgid "Return Order"
 msgstr ""
 
-#: order/api.py:1458 templates/js/translated/sales_order.js:1039
+#: order/api.py:1446 templates/js/translated/sales_order.js:1039
 msgid "Unknown"
 msgstr ""
 
@@ -5545,31 +5545,31 @@ msgstr ""
 msgid "Maximum Price"
 msgstr ""
 
-#: part/api.py:501
+#: part/api.py:497
 msgid "Incoming Purchase Order"
 msgstr ""
 
-#: part/api.py:521
+#: part/api.py:517
 msgid "Outgoing Sales Order"
 msgstr ""
 
-#: part/api.py:539
+#: part/api.py:535
 msgid "Stock produced by Build Order"
 msgstr ""
 
-#: part/api.py:625
+#: part/api.py:621
 msgid "Stock required for Build Order"
 msgstr ""
 
-#: part/api.py:773
+#: part/api.py:769
 msgid "Valid"
 msgstr ""
 
-#: part/api.py:774
+#: part/api.py:770
 msgid "Validate entire Bill of Materials"
 msgstr ""
 
-#: part/api.py:780
+#: part/api.py:776
 msgid "This option must be selected"
 msgstr ""
 
diff --git a/InvenTree/locale/zh_Hans/LC_MESSAGES/django.po b/InvenTree/locale/zh_Hans/LC_MESSAGES/django.po
index aa2c6fb050..9bc78201a7 100644
--- a/InvenTree/locale/zh_Hans/LC_MESSAGES/django.po
+++ b/InvenTree/locale/zh_Hans/LC_MESSAGES/django.po
@@ -2,7 +2,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: inventree\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2023-09-07 23:12+0000\n"
+"POT-Creation-Date: 2023-09-12 06:37+0000\n"
 "PO-Revision-Date: 2023-02-28 22:38\n"
 "Last-Translator: \n"
 "Language-Team: Chinese Simplified\n"
@@ -21,7 +21,7 @@ msgstr ""
 msgid "API endpoint not found"
 msgstr "未找到 API 端点"
 
-#: InvenTree/api.py:329
+#: InvenTree/api.py:335
 msgid "User does not have permission to view this model"
 msgstr ""
 
@@ -65,10 +65,10 @@ msgstr "输入日期"
 #: order/templates/order/so_sidebar.html:17 part/admin.py:41
 #: part/models.py:3042 part/templates/part/part_sidebar.html:63
 #: report/templates/report/inventree_build_order_base.html:172
-#: stock/admin.py:121 stock/models.py:2160 stock/models.py:2268
+#: stock/admin.py:121 stock/models.py:2191 stock/models.py:2299
 #: stock/serializers.py:408 stock/serializers.py:542 stock/serializers.py:623
 #: stock/serializers.py:681 stock/serializers.py:956 stock/serializers.py:1055
-#: stock/serializers.py:1187 stock/templates/stock/stock_sidebar.html:25
+#: stock/serializers.py:1216 stock/templates/stock/stock_sidebar.html:25
 #: templates/js/translated/barcode.js:143 templates/js/translated/bom.js:1254
 #: templates/js/translated/company.js:1715 templates/js/translated/order.js:347
 #: templates/js/translated/part.js:1057
@@ -261,7 +261,7 @@ msgstr "缺少文件"
 msgid "Missing external link"
 msgstr "缺少外部链接"
 
-#: InvenTree/models.py:486 stock/models.py:2262
+#: InvenTree/models.py:486 stock/models.py:2293
 #: templates/js/translated/attachment.js:119
 #: templates/js/translated/attachment.js:326
 msgid "Attachment"
@@ -1126,7 +1126,8 @@ msgid "Build status code"
 msgstr "生产状态代码"
 
 #: build/models.py:250 build/serializers.py:277 order/serializers.py:512
-#: stock/models.py:739 templates/js/translated/purchase_order.js:1114
+#: stock/models.py:739 stock/serializers.py:1180
+#: templates/js/translated/purchase_order.js:1114
 msgid "Batch Code"
 msgstr "批量代码"
 
@@ -1438,7 +1439,7 @@ msgstr "必须提供生产产出列表"
 #: build/serializers.py:423 build/serializers.py:496 order/serializers.py:493
 #: order/serializers.py:612 order/serializers.py:1616 part/serializers.py:933
 #: stock/serializers.py:401 stock/serializers.py:537 stock/serializers.py:618
-#: stock/serializers.py:1048 stock/serializers.py:1290
+#: stock/serializers.py:1048 stock/serializers.py:1319
 #: stock/templates/stock/item_base.html:395
 #: templates/js/translated/barcode.js:530
 #: templates/js/translated/barcode.js:778 templates/js/translated/build.js:980
@@ -1484,7 +1485,8 @@ msgstr "已完成生产产出的仓储地点"
 #: build/serializers.py:503 build/templates/build/build_base.html:152
 #: build/templates/build/detail.html:62 order/models.py:804
 #: order/models.py:1763 order/serializers.py:530 stock/admin.py:106
-#: stock/serializers.py:677 stock/templates/stock/item_base.html:428
+#: stock/serializers.py:677 stock/serializers.py:1187
+#: stock/templates/stock/item_base.html:428
 #: templates/js/translated/barcode.js:252 templates/js/translated/build.js:2161
 #: templates/js/translated/purchase_order.js:1293
 #: templates/js/translated/purchase_order.js:1697
@@ -1821,7 +1823,7 @@ msgid "Completed Outputs"
 msgstr "已完成输出"
 
 #: build/templates/build/build_base.html:191
-#: build/templates/build/detail.html:101 order/api.py:1454 order/models.py:1317
+#: build/templates/build/detail.html:101 order/api.py:1442 order/models.py:1317
 #: order/models.py:1416 order/models.py:1564
 #: order/templates/order/sales_order_base.html:9
 #: order/templates/order/sales_order_base.html:28
@@ -3918,7 +3920,7 @@ msgstr "参数名称"
 
 #: company/models.py:546
 #: report/templates/report/inventree_test_report_base.html:104
-#: stock/models.py:2255 templates/js/translated/company.js:1197
+#: stock/models.py:2286 templates/js/translated/company.js:1197
 #: templates/js/translated/company.js:1450 templates/js/translated/part.js:1469
 #: templates/js/translated/stock.js:1464
 msgid "Value"
@@ -4017,7 +4019,7 @@ msgid "Minimum charge (e.g. stocking fee)"
 msgstr "最低收费(例如库存费)"
 
 #: company/models.py:752 company/templates/company/supplier_part.html:161
-#: stock/admin.py:119 stock/models.py:701
+#: stock/admin.py:119 stock/models.py:701 stock/serializers.py:1195
 #: stock/templates/stock/item_base.html:241
 #: templates/js/translated/company.js:1677
 #: templates/js/translated/stock.js:2356
@@ -4624,7 +4626,7 @@ msgstr ""
 msgid "No matching purchase order found"
 msgstr ""
 
-#: order/api.py:1452 order/models.py:1191 order/models.py:1275
+#: order/api.py:1440 order/models.py:1191 order/models.py:1275
 #: order/templates/order/order_base.html:9
 #: order/templates/order/order_base.html:18
 #: report/templates/report/inventree_po_report_base.html:14
@@ -4638,7 +4640,7 @@ msgstr ""
 msgid "Purchase Order"
 msgstr ""
 
-#: order/api.py:1456 order/models.py:1922 order/models.py:1968
+#: order/api.py:1444 order/models.py:1922 order/models.py:1968
 #: order/templates/order/return_order_base.html:9
 #: order/templates/order/return_order_base.html:28
 #: report/templates/report/inventree_return_order_report_base.html:13
@@ -4649,7 +4651,7 @@ msgstr ""
 msgid "Return Order"
 msgstr "已退回"
 
-#: order/api.py:1458 templates/js/translated/sales_order.js:1039
+#: order/api.py:1446 templates/js/translated/sales_order.js:1039
 msgid "Unknown"
 msgstr ""
 
@@ -5756,31 +5758,31 @@ msgstr ""
 msgid "Maximum Price"
 msgstr ""
 
-#: part/api.py:501
+#: part/api.py:497
 msgid "Incoming Purchase Order"
 msgstr ""
 
-#: part/api.py:521
+#: part/api.py:517
 msgid "Outgoing Sales Order"
 msgstr ""
 
-#: part/api.py:539
+#: part/api.py:535
 msgid "Stock produced by Build Order"
 msgstr ""
 
-#: part/api.py:625
+#: part/api.py:621
 msgid "Stock required for Build Order"
 msgstr ""
 
-#: part/api.py:773
+#: part/api.py:769
 msgid "Valid"
 msgstr ""
 
-#: part/api.py:774
+#: part/api.py:770
 msgid "Validate entire Bill of Materials"
 msgstr ""
 
-#: part/api.py:780
+#: part/api.py:776
 msgid "This option must be selected"
 msgstr ""
 
@@ -7614,35 +7616,35 @@ msgstr ""
 msgid "Plugin requires at most version {v}"
 msgstr ""
 
-#: plugin/samples/integration/sample.py:39
+#: plugin/samples/integration/sample.py:50
 msgid "Enable PO"
 msgstr ""
 
-#: plugin/samples/integration/sample.py:40
+#: plugin/samples/integration/sample.py:51
 msgid "Enable PO functionality in InvenTree interface"
 msgstr ""
 
-#: plugin/samples/integration/sample.py:45
+#: plugin/samples/integration/sample.py:56
 msgid "API Key"
 msgstr ""
 
-#: plugin/samples/integration/sample.py:46
+#: plugin/samples/integration/sample.py:57
 msgid "Key required for accessing external API"
 msgstr ""
 
-#: plugin/samples/integration/sample.py:50
+#: plugin/samples/integration/sample.py:61
 msgid "Numerical"
 msgstr ""
 
-#: plugin/samples/integration/sample.py:51
+#: plugin/samples/integration/sample.py:62
 msgid "A numerical setting"
 msgstr ""
 
-#: plugin/samples/integration/sample.py:56
+#: plugin/samples/integration/sample.py:67
 msgid "Choice Setting"
 msgstr ""
 
-#: plugin/samples/integration/sample.py:57
+#: plugin/samples/integration/sample.py:68
 msgid "A setting with multiple choices"
 msgstr ""
 
@@ -7860,12 +7862,12 @@ msgid "Test Results"
 msgstr ""
 
 #: report/templates/report/inventree_test_report_base.html:102
-#: stock/models.py:2243 templates/js/translated/stock.js:1437
+#: stock/models.py:2274 templates/js/translated/stock.js:1437
 msgid "Test"
 msgstr ""
 
 #: report/templates/report/inventree_test_report_base.html:103
-#: stock/models.py:2249
+#: stock/models.py:2280
 msgid "Result"
 msgstr ""
 
@@ -8081,7 +8083,7 @@ msgstr ""
 msgid "Where is this stock item located?"
 msgstr ""
 
-#: stock/models.py:702
+#: stock/models.py:702 stock/serializers.py:1196
 msgid "Packaging this stock item is stored in"
 msgstr ""
 
@@ -8093,7 +8095,7 @@ msgstr ""
 msgid "Serial number for this item"
 msgstr ""
 
-#: stock/models.py:741
+#: stock/models.py:741 stock/serializers.py:1181
 msgid "Batch code for this stock item"
 msgstr ""
 
@@ -8218,39 +8220,39 @@ msgstr ""
 msgid "Stock status codes must match"
 msgstr ""
 
-#: stock/models.py:1679
+#: stock/models.py:1702
 msgid "StockItem cannot be moved as it is not in stock"
 msgstr ""
 
-#: stock/models.py:2161
+#: stock/models.py:2192
 msgid "Entry notes"
 msgstr ""
 
-#: stock/models.py:2219
+#: stock/models.py:2250
 msgid "Value must be provided for this test"
 msgstr ""
 
-#: stock/models.py:2225
+#: stock/models.py:2256
 msgid "Attachment must be uploaded for this test"
 msgstr ""
 
-#: stock/models.py:2244
+#: stock/models.py:2275
 msgid "Test name"
 msgstr ""
 
-#: stock/models.py:2250
+#: stock/models.py:2281
 msgid "Test result"
 msgstr ""
 
-#: stock/models.py:2256
+#: stock/models.py:2287
 msgid "Test output value"
 msgstr ""
 
-#: stock/models.py:2263
+#: stock/models.py:2294
 msgid "Test result attachment"
 msgstr ""
 
-#: stock/models.py:2269
+#: stock/models.py:2300
 msgid "Test notes"
 msgstr ""
 
@@ -8279,7 +8281,7 @@ msgstr ""
 msgid "Enter serial numbers for new items"
 msgstr "输入新项目的序列号"
 
-#: stock/serializers.py:402 stock/serializers.py:1049 stock/serializers.py:1291
+#: stock/serializers.py:402 stock/serializers.py:1049 stock/serializers.py:1320
 msgid "Destination stock location"
 msgstr "目标库存位置"
 
@@ -8360,7 +8362,7 @@ msgstr ""
 msgid "Stock assignment notes"
 msgstr ""
 
-#: stock/serializers.py:967 stock/serializers.py:1198
+#: stock/serializers.py:967 stock/serializers.py:1227
 msgid "A list of stock items must be provided"
 msgstr ""
 
@@ -8388,11 +8390,17 @@ msgstr ""
 msgid "At least two stock items must be provided"
 msgstr ""
 
-#: stock/serializers.py:1160
+#: stock/serializers.py:1167
 msgid "StockItem primary key value"
 msgstr ""
 
 #: stock/serializers.py:1188
+#, fuzzy
+#| msgid "Stock item created"
+msgid "Stock item status code"
+msgstr "库存项已创建"
+
+#: stock/serializers.py:1217
 msgid "Stock transaction notes"
 msgstr ""
 
diff --git a/InvenTree/locale/zh_hant/LC_MESSAGES/django.po b/InvenTree/locale/zh_hant/LC_MESSAGES/django.po
index 847d7f4eaa..f7b1067dd6 100644
--- a/InvenTree/locale/zh_hant/LC_MESSAGES/django.po
+++ b/InvenTree/locale/zh_hant/LC_MESSAGES/django.po
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2023-09-07 23:12+0000\n"
+"POT-Creation-Date: 2023-09-12 06:37+0000\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -22,7 +22,7 @@ msgstr ""
 msgid "API endpoint not found"
 msgstr ""
 
-#: InvenTree/api.py:329
+#: InvenTree/api.py:335
 msgid "User does not have permission to view this model"
 msgstr ""
 
@@ -62,10 +62,10 @@ msgstr ""
 #: order/templates/order/so_sidebar.html:17 part/admin.py:41
 #: part/models.py:3042 part/templates/part/part_sidebar.html:63
 #: report/templates/report/inventree_build_order_base.html:172
-#: stock/admin.py:121 stock/models.py:2160 stock/models.py:2268
+#: stock/admin.py:121 stock/models.py:2191 stock/models.py:2299
 #: stock/serializers.py:408 stock/serializers.py:542 stock/serializers.py:623
 #: stock/serializers.py:681 stock/serializers.py:956 stock/serializers.py:1055
-#: stock/serializers.py:1187 stock/templates/stock/stock_sidebar.html:25
+#: stock/serializers.py:1216 stock/templates/stock/stock_sidebar.html:25
 #: templates/js/translated/barcode.js:143 templates/js/translated/bom.js:1254
 #: templates/js/translated/company.js:1715 templates/js/translated/order.js:347
 #: templates/js/translated/part.js:1057
@@ -258,7 +258,7 @@ msgstr ""
 msgid "Missing external link"
 msgstr ""
 
-#: InvenTree/models.py:486 stock/models.py:2262
+#: InvenTree/models.py:486 stock/models.py:2293
 #: templates/js/translated/attachment.js:119
 #: templates/js/translated/attachment.js:326
 msgid "Attachment"
@@ -1099,7 +1099,8 @@ msgid "Build status code"
 msgstr ""
 
 #: build/models.py:250 build/serializers.py:277 order/serializers.py:512
-#: stock/models.py:739 templates/js/translated/purchase_order.js:1114
+#: stock/models.py:739 stock/serializers.py:1180
+#: templates/js/translated/purchase_order.js:1114
 msgid "Batch Code"
 msgstr ""
 
@@ -1399,7 +1400,7 @@ msgstr ""
 #: build/serializers.py:423 build/serializers.py:496 order/serializers.py:493
 #: order/serializers.py:612 order/serializers.py:1616 part/serializers.py:933
 #: stock/serializers.py:401 stock/serializers.py:537 stock/serializers.py:618
-#: stock/serializers.py:1048 stock/serializers.py:1290
+#: stock/serializers.py:1048 stock/serializers.py:1319
 #: stock/templates/stock/item_base.html:395
 #: templates/js/translated/barcode.js:530
 #: templates/js/translated/barcode.js:778 templates/js/translated/build.js:980
@@ -1439,7 +1440,8 @@ msgstr ""
 #: build/serializers.py:503 build/templates/build/build_base.html:152
 #: build/templates/build/detail.html:62 order/models.py:804
 #: order/models.py:1763 order/serializers.py:530 stock/admin.py:106
-#: stock/serializers.py:677 stock/templates/stock/item_base.html:428
+#: stock/serializers.py:677 stock/serializers.py:1187
+#: stock/templates/stock/item_base.html:428
 #: templates/js/translated/barcode.js:252 templates/js/translated/build.js:2161
 #: templates/js/translated/purchase_order.js:1293
 #: templates/js/translated/purchase_order.js:1697
@@ -1770,7 +1772,7 @@ msgid "Completed Outputs"
 msgstr ""
 
 #: build/templates/build/build_base.html:191
-#: build/templates/build/detail.html:101 order/api.py:1454 order/models.py:1317
+#: build/templates/build/detail.html:101 order/api.py:1442 order/models.py:1317
 #: order/models.py:1416 order/models.py:1564
 #: order/templates/order/sales_order_base.html:9
 #: order/templates/order/sales_order_base.html:28
@@ -3788,7 +3790,7 @@ msgstr ""
 
 #: company/models.py:546
 #: report/templates/report/inventree_test_report_base.html:104
-#: stock/models.py:2255 templates/js/translated/company.js:1197
+#: stock/models.py:2286 templates/js/translated/company.js:1197
 #: templates/js/translated/company.js:1450 templates/js/translated/part.js:1469
 #: templates/js/translated/stock.js:1464
 msgid "Value"
@@ -3885,7 +3887,7 @@ msgid "Minimum charge (e.g. stocking fee)"
 msgstr ""
 
 #: company/models.py:752 company/templates/company/supplier_part.html:161
-#: stock/admin.py:119 stock/models.py:701
+#: stock/admin.py:119 stock/models.py:701 stock/serializers.py:1195
 #: stock/templates/stock/item_base.html:241
 #: templates/js/translated/company.js:1677
 #: templates/js/translated/stock.js:2356
@@ -4468,7 +4470,7 @@ msgstr ""
 msgid "No matching purchase order found"
 msgstr ""
 
-#: order/api.py:1452 order/models.py:1191 order/models.py:1275
+#: order/api.py:1440 order/models.py:1191 order/models.py:1275
 #: order/templates/order/order_base.html:9
 #: order/templates/order/order_base.html:18
 #: report/templates/report/inventree_po_report_base.html:14
@@ -4482,7 +4484,7 @@ msgstr ""
 msgid "Purchase Order"
 msgstr ""
 
-#: order/api.py:1456 order/models.py:1922 order/models.py:1968
+#: order/api.py:1444 order/models.py:1922 order/models.py:1968
 #: order/templates/order/return_order_base.html:9
 #: order/templates/order/return_order_base.html:28
 #: report/templates/report/inventree_return_order_report_base.html:13
@@ -4491,7 +4493,7 @@ msgstr ""
 msgid "Return Order"
 msgstr ""
 
-#: order/api.py:1458 templates/js/translated/sales_order.js:1039
+#: order/api.py:1446 templates/js/translated/sales_order.js:1039
 msgid "Unknown"
 msgstr ""
 
@@ -5544,31 +5546,31 @@ msgstr ""
 msgid "Maximum Price"
 msgstr ""
 
-#: part/api.py:501
+#: part/api.py:497
 msgid "Incoming Purchase Order"
 msgstr ""
 
-#: part/api.py:521
+#: part/api.py:517
 msgid "Outgoing Sales Order"
 msgstr ""
 
-#: part/api.py:539
+#: part/api.py:535
 msgid "Stock produced by Build Order"
 msgstr ""
 
-#: part/api.py:625
+#: part/api.py:621
 msgid "Stock required for Build Order"
 msgstr ""
 
-#: part/api.py:773
+#: part/api.py:769
 msgid "Valid"
 msgstr ""
 
-#: part/api.py:774
+#: part/api.py:770
 msgid "Validate entire Bill of Materials"
 msgstr ""
 
-#: part/api.py:780
+#: part/api.py:776
 msgid "This option must be selected"
 msgstr ""
 
@@ -7378,35 +7380,35 @@ msgstr ""
 msgid "Plugin requires at most version {v}"
 msgstr ""
 
-#: plugin/samples/integration/sample.py:39
+#: plugin/samples/integration/sample.py:50
 msgid "Enable PO"
 msgstr ""
 
-#: plugin/samples/integration/sample.py:40
+#: plugin/samples/integration/sample.py:51
 msgid "Enable PO functionality in InvenTree interface"
 msgstr ""
 
-#: plugin/samples/integration/sample.py:45
+#: plugin/samples/integration/sample.py:56
 msgid "API Key"
 msgstr ""
 
-#: plugin/samples/integration/sample.py:46
+#: plugin/samples/integration/sample.py:57
 msgid "Key required for accessing external API"
 msgstr ""
 
-#: plugin/samples/integration/sample.py:50
+#: plugin/samples/integration/sample.py:61
 msgid "Numerical"
 msgstr ""
 
-#: plugin/samples/integration/sample.py:51
+#: plugin/samples/integration/sample.py:62
 msgid "A numerical setting"
 msgstr ""
 
-#: plugin/samples/integration/sample.py:56
+#: plugin/samples/integration/sample.py:67
 msgid "Choice Setting"
 msgstr ""
 
-#: plugin/samples/integration/sample.py:57
+#: plugin/samples/integration/sample.py:68
 msgid "A setting with multiple choices"
 msgstr ""
 
@@ -7618,12 +7620,12 @@ msgid "Test Results"
 msgstr ""
 
 #: report/templates/report/inventree_test_report_base.html:102
-#: stock/models.py:2243 templates/js/translated/stock.js:1437
+#: stock/models.py:2274 templates/js/translated/stock.js:1437
 msgid "Test"
 msgstr ""
 
 #: report/templates/report/inventree_test_report_base.html:103
-#: stock/models.py:2249
+#: stock/models.py:2280
 msgid "Result"
 msgstr ""
 
@@ -7833,7 +7835,7 @@ msgstr ""
 msgid "Where is this stock item located?"
 msgstr ""
 
-#: stock/models.py:702
+#: stock/models.py:702 stock/serializers.py:1196
 msgid "Packaging this stock item is stored in"
 msgstr ""
 
@@ -7845,7 +7847,7 @@ msgstr ""
 msgid "Serial number for this item"
 msgstr ""
 
-#: stock/models.py:741
+#: stock/models.py:741 stock/serializers.py:1181
 msgid "Batch code for this stock item"
 msgstr ""
 
@@ -7966,39 +7968,39 @@ msgstr ""
 msgid "Stock status codes must match"
 msgstr ""
 
-#: stock/models.py:1679
+#: stock/models.py:1702
 msgid "StockItem cannot be moved as it is not in stock"
 msgstr ""
 
-#: stock/models.py:2161
+#: stock/models.py:2192
 msgid "Entry notes"
 msgstr ""
 
-#: stock/models.py:2219
+#: stock/models.py:2250
 msgid "Value must be provided for this test"
 msgstr ""
 
-#: stock/models.py:2225
+#: stock/models.py:2256
 msgid "Attachment must be uploaded for this test"
 msgstr ""
 
-#: stock/models.py:2244
+#: stock/models.py:2275
 msgid "Test name"
 msgstr ""
 
-#: stock/models.py:2250
+#: stock/models.py:2281
 msgid "Test result"
 msgstr ""
 
-#: stock/models.py:2256
+#: stock/models.py:2287
 msgid "Test output value"
 msgstr ""
 
-#: stock/models.py:2263
+#: stock/models.py:2294
 msgid "Test result attachment"
 msgstr ""
 
-#: stock/models.py:2269
+#: stock/models.py:2300
 msgid "Test notes"
 msgstr ""
 
@@ -8027,7 +8029,7 @@ msgstr ""
 msgid "Enter serial numbers for new items"
 msgstr ""
 
-#: stock/serializers.py:402 stock/serializers.py:1049 stock/serializers.py:1291
+#: stock/serializers.py:402 stock/serializers.py:1049 stock/serializers.py:1320
 msgid "Destination stock location"
 msgstr ""
 
@@ -8104,7 +8106,7 @@ msgstr ""
 msgid "Stock assignment notes"
 msgstr ""
 
-#: stock/serializers.py:967 stock/serializers.py:1198
+#: stock/serializers.py:967 stock/serializers.py:1227
 msgid "A list of stock items must be provided"
 msgstr ""
 
@@ -8132,11 +8134,15 @@ msgstr ""
 msgid "At least two stock items must be provided"
 msgstr ""
 
-#: stock/serializers.py:1160
+#: stock/serializers.py:1167
 msgid "StockItem primary key value"
 msgstr ""
 
 #: stock/serializers.py:1188
+msgid "Stock item status code"
+msgstr ""
+
+#: stock/serializers.py:1217
 msgid "Stock transaction notes"
 msgstr ""
 
diff --git a/src/frontend/src/locales/cs/messages.po b/src/frontend/src/locales/cs/messages.po
index 4bc9ea37cc..6cdf48a646 100644
--- a/src/frontend/src/locales/cs/messages.po
+++ b/src/frontend/src/locales/cs/messages.po
@@ -8,7 +8,7 @@ msgstr ""
 "Language: cs\n"
 "Project-Id-Version: inventree\n"
 "Report-Msgid-Bugs-To: \n"
-"PO-Revision-Date: 2023-09-12 00:10\n"
+"PO-Revision-Date: 2023-09-14 01:14\n"
 "Last-Translator: \n"
 "Language-Team: Czech\n"
 "Plural-Forms: nplurals=4; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 3;\n"
@@ -23,6 +23,7 @@ msgid "Title"
 msgstr ""
 
 #: src/components/forms/ApiForm.tsx:189
+#: src/components/widgets/MarkdownEditor.tsx:146
 msgid "Success"
 msgstr ""
 
@@ -158,6 +159,7 @@ msgid "Add Host"
 msgstr ""
 
 #: src/components/forms/HostOptionsForm.tsx:89
+#: src/components/widgets/MarkdownEditor.tsx:73
 msgid "Save"
 msgstr ""
 
@@ -187,7 +189,9 @@ msgstr ""
 
 #: src/components/forms/fields/ApiFormField.tsx:286
 #: src/components/nav/SearchDrawer.tsx:425
-#: src/components/tables/InvenTreeTable.tsx:368
+#: src/components/tables/InvenTreeTable.tsx:378
+#: src/components/widgets/MarkdownEditor.tsx:108
+#: src/components/widgets/MarkdownEditor.tsx:154
 #: src/pages/ErrorPage.tsx:12
 #: src/pages/ErrorPage.tsx:25
 msgid "Error"
@@ -211,7 +215,7 @@ msgid "Read More"
 msgstr ""
 
 #: src/components/items/ErrorItem.tsx:5
-#: src/components/tables/InvenTreeTable.tsx:360
+#: src/components/tables/InvenTreeTable.tsx:370
 msgid "Unknown error"
 msgstr ""
 
@@ -384,7 +388,7 @@ msgstr ""
 
 #: src/components/nav/SearchDrawer.tsx:121
 #: src/pages/Index/Build.tsx:13
-#: src/pages/part/PartDetail.tsx:76
+#: src/pages/part/PartDetail.tsx:79
 msgid "Build Orders"
 msgstr ""
 
@@ -393,12 +397,12 @@ msgid "Companies"
 msgstr ""
 
 #: src/components/nav/SearchDrawer.tsx:140
-#: src/pages/part/PartDetail.tsx:103
+#: src/pages/part/PartDetail.tsx:106
 msgid "Purchase Orders"
 msgstr ""
 
 #: src/components/nav/SearchDrawer.tsx:150
-#: src/pages/part/PartDetail.tsx:110
+#: src/pages/part/PartDetail.tsx:113
 msgid "Sales Orders"
 msgstr ""
 
@@ -446,6 +450,58 @@ msgstr ""
 msgid "Shipment"
 msgstr ""
 
+#: src/components/tables/AttachmentTable.tsx:29
+msgid "Attachment"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:46
+msgid "Comment"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:55
+msgid "Uploaded"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:115
+#: src/components/tables/part/PartTable.tsx:203
+#: src/components/tables/stock/StockItemTable.tsx:124
+msgid "Edit"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:130
+#: src/components/tables/part/RelatedPartTable.tsx:97
+#: src/functions/forms.tsx:177
+msgid "Delete"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:156
+msgid "File uploaded"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:157
+msgid "File {0} uploaded successfully"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:168
+msgid "Upload Error"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:169
+msgid "File could not be uploaded"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:182
+msgid "Add attachment"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:201
+msgid "Add external link"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:241
+msgid "Upload attachment"
+msgstr ""
+
 #: src/components/tables/ColumnSelect.tsx:17
 #: src/components/tables/ColumnSelect.tsx:24
 msgid "Select Columns"
@@ -523,41 +579,42 @@ msgstr ""
 msgid "No records found"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:347
+#: src/components/tables/InvenTreeTable.tsx:357
 msgid "Bad request"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:350
+#: src/components/tables/InvenTreeTable.tsx:360
 msgid "Unauthorized"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:353
+#: src/components/tables/InvenTreeTable.tsx:363
 msgid "Forbidden"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:356
+#: src/components/tables/InvenTreeTable.tsx:366
 msgid "Not found"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:405
-#: src/components/tables/InvenTreeTable.tsx:406
+#: src/components/tables/InvenTreeTable.tsx:427
+#: src/components/tables/InvenTreeTable.tsx:428
 msgid "Barcode actions"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:413
-#: src/components/tables/InvenTreeTable.tsx:414
+#: src/components/tables/InvenTreeTable.tsx:435
+#: src/components/tables/InvenTreeTable.tsx:436
 msgid "Print actions"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:431
+#: src/components/tables/InvenTreeTable.tsx:453
 msgid "Refresh data"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:449
+#: src/components/tables/InvenTreeTable.tsx:471
 msgid "Table filters"
 msgstr ""
 
-#: src/components/tables/RowActions.tsx:35
+#: src/components/tables/RowActions.tsx:33
+#: src/components/tables/RowActions.tsx:40
 msgid "Actions"
 msgstr ""
 
@@ -567,12 +624,14 @@ msgstr ""
 
 #: src/components/tables/build/BuildOrderTable.tsx:24
 #: src/components/tables/part/PartTable.tsx:25
+#: src/components/tables/part/RelatedPartTable.tsx:31
 #: src/components/tables/stock/StockItemTable.tsx:22
 msgid "Part"
 msgstr ""
 
 #: src/components/tables/build/BuildOrderTable.tsx:41
 #: src/components/tables/part/PartTable.tsx:51
+#: src/components/tables/part/RelatedPartTable.tsx:49
 #: src/components/tables/stock/StockItemTable.tsx:38
 msgid "Description"
 msgstr ""
@@ -617,7 +676,7 @@ msgstr ""
 #: src/components/tables/part/PartTable.tsx:68
 #: src/components/tables/stock/StockItemTable.tsx:43
 #: src/defaults/links.tsx:27
-#: src/pages/part/PartDetail.tsx:56
+#: src/pages/part/PartDetail.tsx:59
 msgid "Stock"
 msgstr ""
 
@@ -731,15 +790,38 @@ msgstr ""
 msgid "Not Virtual"
 msgstr ""
 
-#: src/components/tables/part/PartTable.tsx:203
-#: src/components/tables/stock/StockItemTable.tsx:124
-msgid "Edit"
-msgstr ""
-
 #: src/components/tables/part/PartTable.tsx:216
 msgid "Detail"
 msgstr ""
 
+#: src/components/tables/part/RelatedPartTable.tsx:61
+msgid "Add Related Part"
+msgstr ""
+
+#: src/components/tables/part/RelatedPartTable.tsx:69
+msgid "Related Part"
+msgstr ""
+
+#: src/components/tables/part/RelatedPartTable.tsx:72
+msgid "Related part added"
+msgstr ""
+
+#: src/components/tables/part/RelatedPartTable.tsx:82
+msgid "Add related part"
+msgstr ""
+
+#: src/components/tables/part/RelatedPartTable.tsx:104
+msgid "Delete Related Part"
+msgstr ""
+
+#: src/components/tables/part/RelatedPartTable.tsx:105
+msgid "Related part deleted"
+msgstr ""
+
+#: src/components/tables/part/RelatedPartTable.tsx:107
+msgid "Are you sure you want to remove this relationship?"
+msgstr ""
+
 #: src/components/tables/stock/StockItemTable.tsx:58
 msgid "Batch"
 msgstr ""
@@ -787,6 +869,18 @@ msgstr ""
 msgid "Getting started"
 msgstr ""
 
+#: src/components/widgets/MarkdownEditor.tsx:109
+msgid "Failed to upload image"
+msgstr ""
+
+#: src/components/widgets/MarkdownEditor.tsx:147
+msgid "Notes saved"
+msgstr ""
+
+#: src/components/widgets/MarkdownEditor.tsx:155
+msgid "Failed to save notes"
+msgstr ""
+
 #: src/components/widgets/WidgetLayout.tsx:180
 msgid "Layout"
 msgstr ""
@@ -1098,8 +1192,48 @@ msgstr ""
 msgid "method parameter not supplied"
 msgstr ""
 
-#: src/functions/forms.tsx:177
-msgid "Delete"
+#: src/functions/forms/AttachmentForms.tsx:57
+msgid "Add File"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:57
+msgid "Add Link"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:58
+msgid "File added"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:58
+msgid "Link added"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:100
+msgid "Edit File"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:100
+msgid "Edit Link"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:101
+msgid "File updated"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:101
+msgid "Link updated"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:127
+msgid "Delete Attachment"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:128
+msgid "Attachment deleted"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:132
+msgid "Are you sure you want to delete this attachment?"
 msgstr ""
 
 #: src/functions/forms/PartForms.tsx:76
@@ -1445,43 +1579,43 @@ msgstr ""
 msgid "Go to the start page"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:50
+#: src/pages/part/PartDetail.tsx:53
 msgid "Details"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:62
+#: src/pages/part/PartDetail.tsx:65
 msgid "Variants"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:69
+#: src/pages/part/PartDetail.tsx:72
 msgid "Bill of Materials"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:83
+#: src/pages/part/PartDetail.tsx:86
 msgid "Used In"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:90
+#: src/pages/part/PartDetail.tsx:93
 msgid "Pricing"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:96
+#: src/pages/part/PartDetail.tsx:99
 msgid "Suppliers"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:117
+#: src/pages/part/PartDetail.tsx:120
 msgid "Test Templates"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:124
+#: src/pages/part/PartDetail.tsx:127
 msgid "Related Parts"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:130
+#: src/pages/part/PartDetail.tsx:133
 msgid "Attachments"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:136
+#: src/pages/part/PartDetail.tsx:139
 msgid "Notes"
 msgstr ""
 
diff --git a/src/frontend/src/locales/da/messages.po b/src/frontend/src/locales/da/messages.po
index beba47df35..e34d6c4feb 100644
--- a/src/frontend/src/locales/da/messages.po
+++ b/src/frontend/src/locales/da/messages.po
@@ -8,7 +8,7 @@ msgstr ""
 "Language: da\n"
 "Project-Id-Version: inventree\n"
 "Report-Msgid-Bugs-To: \n"
-"PO-Revision-Date: 2023-09-12 00:10\n"
+"PO-Revision-Date: 2023-09-14 01:14\n"
 "Last-Translator: \n"
 "Language-Team: Danish\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
@@ -23,6 +23,7 @@ msgid "Title"
 msgstr ""
 
 #: src/components/forms/ApiForm.tsx:189
+#: src/components/widgets/MarkdownEditor.tsx:146
 msgid "Success"
 msgstr ""
 
@@ -158,6 +159,7 @@ msgid "Add Host"
 msgstr ""
 
 #: src/components/forms/HostOptionsForm.tsx:89
+#: src/components/widgets/MarkdownEditor.tsx:73
 msgid "Save"
 msgstr ""
 
@@ -187,7 +189,9 @@ msgstr ""
 
 #: src/components/forms/fields/ApiFormField.tsx:286
 #: src/components/nav/SearchDrawer.tsx:425
-#: src/components/tables/InvenTreeTable.tsx:368
+#: src/components/tables/InvenTreeTable.tsx:378
+#: src/components/widgets/MarkdownEditor.tsx:108
+#: src/components/widgets/MarkdownEditor.tsx:154
 #: src/pages/ErrorPage.tsx:12
 #: src/pages/ErrorPage.tsx:25
 msgid "Error"
@@ -211,7 +215,7 @@ msgid "Read More"
 msgstr ""
 
 #: src/components/items/ErrorItem.tsx:5
-#: src/components/tables/InvenTreeTable.tsx:360
+#: src/components/tables/InvenTreeTable.tsx:370
 msgid "Unknown error"
 msgstr ""
 
@@ -384,7 +388,7 @@ msgstr ""
 
 #: src/components/nav/SearchDrawer.tsx:121
 #: src/pages/Index/Build.tsx:13
-#: src/pages/part/PartDetail.tsx:76
+#: src/pages/part/PartDetail.tsx:79
 msgid "Build Orders"
 msgstr ""
 
@@ -393,12 +397,12 @@ msgid "Companies"
 msgstr ""
 
 #: src/components/nav/SearchDrawer.tsx:140
-#: src/pages/part/PartDetail.tsx:103
+#: src/pages/part/PartDetail.tsx:106
 msgid "Purchase Orders"
 msgstr ""
 
 #: src/components/nav/SearchDrawer.tsx:150
-#: src/pages/part/PartDetail.tsx:110
+#: src/pages/part/PartDetail.tsx:113
 msgid "Sales Orders"
 msgstr ""
 
@@ -446,6 +450,58 @@ msgstr ""
 msgid "Shipment"
 msgstr ""
 
+#: src/components/tables/AttachmentTable.tsx:29
+msgid "Attachment"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:46
+msgid "Comment"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:55
+msgid "Uploaded"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:115
+#: src/components/tables/part/PartTable.tsx:203
+#: src/components/tables/stock/StockItemTable.tsx:124
+msgid "Edit"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:130
+#: src/components/tables/part/RelatedPartTable.tsx:97
+#: src/functions/forms.tsx:177
+msgid "Delete"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:156
+msgid "File uploaded"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:157
+msgid "File {0} uploaded successfully"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:168
+msgid "Upload Error"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:169
+msgid "File could not be uploaded"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:182
+msgid "Add attachment"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:201
+msgid "Add external link"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:241
+msgid "Upload attachment"
+msgstr ""
+
 #: src/components/tables/ColumnSelect.tsx:17
 #: src/components/tables/ColumnSelect.tsx:24
 msgid "Select Columns"
@@ -523,41 +579,42 @@ msgstr ""
 msgid "No records found"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:347
+#: src/components/tables/InvenTreeTable.tsx:357
 msgid "Bad request"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:350
+#: src/components/tables/InvenTreeTable.tsx:360
 msgid "Unauthorized"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:353
+#: src/components/tables/InvenTreeTable.tsx:363
 msgid "Forbidden"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:356
+#: src/components/tables/InvenTreeTable.tsx:366
 msgid "Not found"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:405
-#: src/components/tables/InvenTreeTable.tsx:406
+#: src/components/tables/InvenTreeTable.tsx:427
+#: src/components/tables/InvenTreeTable.tsx:428
 msgid "Barcode actions"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:413
-#: src/components/tables/InvenTreeTable.tsx:414
+#: src/components/tables/InvenTreeTable.tsx:435
+#: src/components/tables/InvenTreeTable.tsx:436
 msgid "Print actions"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:431
+#: src/components/tables/InvenTreeTable.tsx:453
 msgid "Refresh data"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:449
+#: src/components/tables/InvenTreeTable.tsx:471
 msgid "Table filters"
 msgstr ""
 
-#: src/components/tables/RowActions.tsx:35
+#: src/components/tables/RowActions.tsx:33
+#: src/components/tables/RowActions.tsx:40
 msgid "Actions"
 msgstr ""
 
@@ -567,12 +624,14 @@ msgstr ""
 
 #: src/components/tables/build/BuildOrderTable.tsx:24
 #: src/components/tables/part/PartTable.tsx:25
+#: src/components/tables/part/RelatedPartTable.tsx:31
 #: src/components/tables/stock/StockItemTable.tsx:22
 msgid "Part"
 msgstr ""
 
 #: src/components/tables/build/BuildOrderTable.tsx:41
 #: src/components/tables/part/PartTable.tsx:51
+#: src/components/tables/part/RelatedPartTable.tsx:49
 #: src/components/tables/stock/StockItemTable.tsx:38
 msgid "Description"
 msgstr ""
@@ -617,7 +676,7 @@ msgstr ""
 #: src/components/tables/part/PartTable.tsx:68
 #: src/components/tables/stock/StockItemTable.tsx:43
 #: src/defaults/links.tsx:27
-#: src/pages/part/PartDetail.tsx:56
+#: src/pages/part/PartDetail.tsx:59
 msgid "Stock"
 msgstr ""
 
@@ -731,15 +790,38 @@ msgstr ""
 msgid "Not Virtual"
 msgstr ""
 
-#: src/components/tables/part/PartTable.tsx:203
-#: src/components/tables/stock/StockItemTable.tsx:124
-msgid "Edit"
-msgstr ""
-
 #: src/components/tables/part/PartTable.tsx:216
 msgid "Detail"
 msgstr ""
 
+#: src/components/tables/part/RelatedPartTable.tsx:61
+msgid "Add Related Part"
+msgstr ""
+
+#: src/components/tables/part/RelatedPartTable.tsx:69
+msgid "Related Part"
+msgstr ""
+
+#: src/components/tables/part/RelatedPartTable.tsx:72
+msgid "Related part added"
+msgstr ""
+
+#: src/components/tables/part/RelatedPartTable.tsx:82
+msgid "Add related part"
+msgstr ""
+
+#: src/components/tables/part/RelatedPartTable.tsx:104
+msgid "Delete Related Part"
+msgstr ""
+
+#: src/components/tables/part/RelatedPartTable.tsx:105
+msgid "Related part deleted"
+msgstr ""
+
+#: src/components/tables/part/RelatedPartTable.tsx:107
+msgid "Are you sure you want to remove this relationship?"
+msgstr ""
+
 #: src/components/tables/stock/StockItemTable.tsx:58
 msgid "Batch"
 msgstr ""
@@ -787,6 +869,18 @@ msgstr ""
 msgid "Getting started"
 msgstr ""
 
+#: src/components/widgets/MarkdownEditor.tsx:109
+msgid "Failed to upload image"
+msgstr ""
+
+#: src/components/widgets/MarkdownEditor.tsx:147
+msgid "Notes saved"
+msgstr ""
+
+#: src/components/widgets/MarkdownEditor.tsx:155
+msgid "Failed to save notes"
+msgstr ""
+
 #: src/components/widgets/WidgetLayout.tsx:180
 msgid "Layout"
 msgstr ""
@@ -1098,8 +1192,48 @@ msgstr ""
 msgid "method parameter not supplied"
 msgstr ""
 
-#: src/functions/forms.tsx:177
-msgid "Delete"
+#: src/functions/forms/AttachmentForms.tsx:57
+msgid "Add File"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:57
+msgid "Add Link"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:58
+msgid "File added"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:58
+msgid "Link added"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:100
+msgid "Edit File"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:100
+msgid "Edit Link"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:101
+msgid "File updated"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:101
+msgid "Link updated"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:127
+msgid "Delete Attachment"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:128
+msgid "Attachment deleted"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:132
+msgid "Are you sure you want to delete this attachment?"
 msgstr ""
 
 #: src/functions/forms/PartForms.tsx:76
@@ -1445,43 +1579,43 @@ msgstr ""
 msgid "Go to the start page"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:50
+#: src/pages/part/PartDetail.tsx:53
 msgid "Details"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:62
+#: src/pages/part/PartDetail.tsx:65
 msgid "Variants"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:69
+#: src/pages/part/PartDetail.tsx:72
 msgid "Bill of Materials"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:83
+#: src/pages/part/PartDetail.tsx:86
 msgid "Used In"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:90
+#: src/pages/part/PartDetail.tsx:93
 msgid "Pricing"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:96
+#: src/pages/part/PartDetail.tsx:99
 msgid "Suppliers"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:117
+#: src/pages/part/PartDetail.tsx:120
 msgid "Test Templates"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:124
+#: src/pages/part/PartDetail.tsx:127
 msgid "Related Parts"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:130
+#: src/pages/part/PartDetail.tsx:133
 msgid "Attachments"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:136
+#: src/pages/part/PartDetail.tsx:139
 msgid "Notes"
 msgstr ""
 
diff --git a/src/frontend/src/locales/de/messages.po b/src/frontend/src/locales/de/messages.po
index 0ff0cb99ac..141b9c8bfe 100644
--- a/src/frontend/src/locales/de/messages.po
+++ b/src/frontend/src/locales/de/messages.po
@@ -8,7 +8,7 @@ msgstr ""
 "Language: de\n"
 "Project-Id-Version: inventree\n"
 "Report-Msgid-Bugs-To: \n"
-"PO-Revision-Date: 2023-09-12 00:10\n"
+"PO-Revision-Date: 2023-09-14 01:14\n"
 "Last-Translator: \n"
 "Language-Team: German\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
@@ -23,6 +23,7 @@ msgid "Title"
 msgstr ""
 
 #: src/components/forms/ApiForm.tsx:189
+#: src/components/widgets/MarkdownEditor.tsx:146
 msgid "Success"
 msgstr ""
 
@@ -158,6 +159,7 @@ msgid "Add Host"
 msgstr "Adresse hinzufügen"
 
 #: src/components/forms/HostOptionsForm.tsx:89
+#: src/components/widgets/MarkdownEditor.tsx:73
 msgid "Save"
 msgstr "Speichern"
 
@@ -187,7 +189,9 @@ msgstr ""
 
 #: src/components/forms/fields/ApiFormField.tsx:286
 #: src/components/nav/SearchDrawer.tsx:425
-#: src/components/tables/InvenTreeTable.tsx:368
+#: src/components/tables/InvenTreeTable.tsx:378
+#: src/components/widgets/MarkdownEditor.tsx:108
+#: src/components/widgets/MarkdownEditor.tsx:154
 #: src/pages/ErrorPage.tsx:12
 #: src/pages/ErrorPage.tsx:25
 msgid "Error"
@@ -211,7 +215,7 @@ msgid "Read More"
 msgstr "Mehr lesen"
 
 #: src/components/items/ErrorItem.tsx:5
-#: src/components/tables/InvenTreeTable.tsx:360
+#: src/components/tables/InvenTreeTable.tsx:370
 msgid "Unknown error"
 msgstr "Unbekannter Fehler"
 
@@ -384,7 +388,7 @@ msgstr ""
 
 #: src/components/nav/SearchDrawer.tsx:121
 #: src/pages/Index/Build.tsx:13
-#: src/pages/part/PartDetail.tsx:76
+#: src/pages/part/PartDetail.tsx:79
 msgid "Build Orders"
 msgstr ""
 
@@ -393,12 +397,12 @@ msgid "Companies"
 msgstr ""
 
 #: src/components/nav/SearchDrawer.tsx:140
-#: src/pages/part/PartDetail.tsx:103
+#: src/pages/part/PartDetail.tsx:106
 msgid "Purchase Orders"
 msgstr ""
 
 #: src/components/nav/SearchDrawer.tsx:150
-#: src/pages/part/PartDetail.tsx:110
+#: src/pages/part/PartDetail.tsx:113
 msgid "Sales Orders"
 msgstr ""
 
@@ -446,6 +450,58 @@ msgstr ""
 msgid "Shipment"
 msgstr ""
 
+#: src/components/tables/AttachmentTable.tsx:29
+msgid "Attachment"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:46
+msgid "Comment"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:55
+msgid "Uploaded"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:115
+#: src/components/tables/part/PartTable.tsx:203
+#: src/components/tables/stock/StockItemTable.tsx:124
+msgid "Edit"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:130
+#: src/components/tables/part/RelatedPartTable.tsx:97
+#: src/functions/forms.tsx:177
+msgid "Delete"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:156
+msgid "File uploaded"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:157
+msgid "File {0} uploaded successfully"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:168
+msgid "Upload Error"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:169
+msgid "File could not be uploaded"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:182
+msgid "Add attachment"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:201
+msgid "Add external link"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:241
+msgid "Upload attachment"
+msgstr ""
+
 #: src/components/tables/ColumnSelect.tsx:17
 #: src/components/tables/ColumnSelect.tsx:24
 msgid "Select Columns"
@@ -523,41 +579,42 @@ msgstr ""
 msgid "No records found"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:347
+#: src/components/tables/InvenTreeTable.tsx:357
 msgid "Bad request"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:350
+#: src/components/tables/InvenTreeTable.tsx:360
 msgid "Unauthorized"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:353
+#: src/components/tables/InvenTreeTable.tsx:363
 msgid "Forbidden"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:356
+#: src/components/tables/InvenTreeTable.tsx:366
 msgid "Not found"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:405
-#: src/components/tables/InvenTreeTable.tsx:406
+#: src/components/tables/InvenTreeTable.tsx:427
+#: src/components/tables/InvenTreeTable.tsx:428
 msgid "Barcode actions"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:413
-#: src/components/tables/InvenTreeTable.tsx:414
+#: src/components/tables/InvenTreeTable.tsx:435
+#: src/components/tables/InvenTreeTable.tsx:436
 msgid "Print actions"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:431
+#: src/components/tables/InvenTreeTable.tsx:453
 msgid "Refresh data"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:449
+#: src/components/tables/InvenTreeTable.tsx:471
 msgid "Table filters"
 msgstr ""
 
-#: src/components/tables/RowActions.tsx:35
+#: src/components/tables/RowActions.tsx:33
+#: src/components/tables/RowActions.tsx:40
 msgid "Actions"
 msgstr ""
 
@@ -567,12 +624,14 @@ msgstr ""
 
 #: src/components/tables/build/BuildOrderTable.tsx:24
 #: src/components/tables/part/PartTable.tsx:25
+#: src/components/tables/part/RelatedPartTable.tsx:31
 #: src/components/tables/stock/StockItemTable.tsx:22
 msgid "Part"
 msgstr ""
 
 #: src/components/tables/build/BuildOrderTable.tsx:41
 #: src/components/tables/part/PartTable.tsx:51
+#: src/components/tables/part/RelatedPartTable.tsx:49
 #: src/components/tables/stock/StockItemTable.tsx:38
 msgid "Description"
 msgstr ""
@@ -617,7 +676,7 @@ msgstr ""
 #: src/components/tables/part/PartTable.tsx:68
 #: src/components/tables/stock/StockItemTable.tsx:43
 #: src/defaults/links.tsx:27
-#: src/pages/part/PartDetail.tsx:56
+#: src/pages/part/PartDetail.tsx:59
 msgid "Stock"
 msgstr ""
 
@@ -731,15 +790,38 @@ msgstr ""
 msgid "Not Virtual"
 msgstr ""
 
-#: src/components/tables/part/PartTable.tsx:203
-#: src/components/tables/stock/StockItemTable.tsx:124
-msgid "Edit"
-msgstr ""
-
 #: src/components/tables/part/PartTable.tsx:216
 msgid "Detail"
 msgstr ""
 
+#: src/components/tables/part/RelatedPartTable.tsx:61
+msgid "Add Related Part"
+msgstr ""
+
+#: src/components/tables/part/RelatedPartTable.tsx:69
+msgid "Related Part"
+msgstr ""
+
+#: src/components/tables/part/RelatedPartTable.tsx:72
+msgid "Related part added"
+msgstr ""
+
+#: src/components/tables/part/RelatedPartTable.tsx:82
+msgid "Add related part"
+msgstr ""
+
+#: src/components/tables/part/RelatedPartTable.tsx:104
+msgid "Delete Related Part"
+msgstr ""
+
+#: src/components/tables/part/RelatedPartTable.tsx:105
+msgid "Related part deleted"
+msgstr ""
+
+#: src/components/tables/part/RelatedPartTable.tsx:107
+msgid "Are you sure you want to remove this relationship?"
+msgstr ""
+
 #: src/components/tables/stock/StockItemTable.tsx:58
 msgid "Batch"
 msgstr ""
@@ -787,6 +869,18 @@ msgstr ""
 msgid "Getting started"
 msgstr ""
 
+#: src/components/widgets/MarkdownEditor.tsx:109
+msgid "Failed to upload image"
+msgstr ""
+
+#: src/components/widgets/MarkdownEditor.tsx:147
+msgid "Notes saved"
+msgstr ""
+
+#: src/components/widgets/MarkdownEditor.tsx:155
+msgid "Failed to save notes"
+msgstr ""
+
 #: src/components/widgets/WidgetLayout.tsx:180
 msgid "Layout"
 msgstr ""
@@ -1098,8 +1192,48 @@ msgstr ""
 msgid "method parameter not supplied"
 msgstr ""
 
-#: src/functions/forms.tsx:177
-msgid "Delete"
+#: src/functions/forms/AttachmentForms.tsx:57
+msgid "Add File"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:57
+msgid "Add Link"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:58
+msgid "File added"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:58
+msgid "Link added"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:100
+msgid "Edit File"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:100
+msgid "Edit Link"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:101
+msgid "File updated"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:101
+msgid "Link updated"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:127
+msgid "Delete Attachment"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:128
+msgid "Attachment deleted"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:132
+msgid "Are you sure you want to delete this attachment?"
 msgstr ""
 
 #: src/functions/forms/PartForms.tsx:76
@@ -1445,43 +1579,43 @@ msgstr "Diese Seite ist nicht bekannt oder wurde verschoben."
 msgid "Go to the start page"
 msgstr "Zur Startseite"
 
-#: src/pages/part/PartDetail.tsx:50
+#: src/pages/part/PartDetail.tsx:53
 msgid "Details"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:62
+#: src/pages/part/PartDetail.tsx:65
 msgid "Variants"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:69
+#: src/pages/part/PartDetail.tsx:72
 msgid "Bill of Materials"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:83
+#: src/pages/part/PartDetail.tsx:86
 msgid "Used In"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:90
+#: src/pages/part/PartDetail.tsx:93
 msgid "Pricing"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:96
+#: src/pages/part/PartDetail.tsx:99
 msgid "Suppliers"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:117
+#: src/pages/part/PartDetail.tsx:120
 msgid "Test Templates"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:124
+#: src/pages/part/PartDetail.tsx:127
 msgid "Related Parts"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:130
+#: src/pages/part/PartDetail.tsx:133
 msgid "Attachments"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:136
+#: src/pages/part/PartDetail.tsx:139
 msgid "Notes"
 msgstr ""
 
diff --git a/src/frontend/src/locales/el/messages.po b/src/frontend/src/locales/el/messages.po
index 0852710b4c..f45da2cdb8 100644
--- a/src/frontend/src/locales/el/messages.po
+++ b/src/frontend/src/locales/el/messages.po
@@ -8,7 +8,7 @@ msgstr ""
 "Language: el\n"
 "Project-Id-Version: inventree\n"
 "Report-Msgid-Bugs-To: \n"
-"PO-Revision-Date: 2023-09-12 00:10\n"
+"PO-Revision-Date: 2023-09-14 01:14\n"
 "Last-Translator: \n"
 "Language-Team: Greek\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
@@ -23,6 +23,7 @@ msgid "Title"
 msgstr ""
 
 #: src/components/forms/ApiForm.tsx:189
+#: src/components/widgets/MarkdownEditor.tsx:146
 msgid "Success"
 msgstr ""
 
@@ -158,6 +159,7 @@ msgid "Add Host"
 msgstr ""
 
 #: src/components/forms/HostOptionsForm.tsx:89
+#: src/components/widgets/MarkdownEditor.tsx:73
 msgid "Save"
 msgstr ""
 
@@ -187,7 +189,9 @@ msgstr ""
 
 #: src/components/forms/fields/ApiFormField.tsx:286
 #: src/components/nav/SearchDrawer.tsx:425
-#: src/components/tables/InvenTreeTable.tsx:368
+#: src/components/tables/InvenTreeTable.tsx:378
+#: src/components/widgets/MarkdownEditor.tsx:108
+#: src/components/widgets/MarkdownEditor.tsx:154
 #: src/pages/ErrorPage.tsx:12
 #: src/pages/ErrorPage.tsx:25
 msgid "Error"
@@ -211,7 +215,7 @@ msgid "Read More"
 msgstr ""
 
 #: src/components/items/ErrorItem.tsx:5
-#: src/components/tables/InvenTreeTable.tsx:360
+#: src/components/tables/InvenTreeTable.tsx:370
 msgid "Unknown error"
 msgstr ""
 
@@ -384,7 +388,7 @@ msgstr ""
 
 #: src/components/nav/SearchDrawer.tsx:121
 #: src/pages/Index/Build.tsx:13
-#: src/pages/part/PartDetail.tsx:76
+#: src/pages/part/PartDetail.tsx:79
 msgid "Build Orders"
 msgstr ""
 
@@ -393,12 +397,12 @@ msgid "Companies"
 msgstr ""
 
 #: src/components/nav/SearchDrawer.tsx:140
-#: src/pages/part/PartDetail.tsx:103
+#: src/pages/part/PartDetail.tsx:106
 msgid "Purchase Orders"
 msgstr ""
 
 #: src/components/nav/SearchDrawer.tsx:150
-#: src/pages/part/PartDetail.tsx:110
+#: src/pages/part/PartDetail.tsx:113
 msgid "Sales Orders"
 msgstr ""
 
@@ -446,6 +450,58 @@ msgstr ""
 msgid "Shipment"
 msgstr ""
 
+#: src/components/tables/AttachmentTable.tsx:29
+msgid "Attachment"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:46
+msgid "Comment"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:55
+msgid "Uploaded"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:115
+#: src/components/tables/part/PartTable.tsx:203
+#: src/components/tables/stock/StockItemTable.tsx:124
+msgid "Edit"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:130
+#: src/components/tables/part/RelatedPartTable.tsx:97
+#: src/functions/forms.tsx:177
+msgid "Delete"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:156
+msgid "File uploaded"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:157
+msgid "File {0} uploaded successfully"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:168
+msgid "Upload Error"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:169
+msgid "File could not be uploaded"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:182
+msgid "Add attachment"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:201
+msgid "Add external link"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:241
+msgid "Upload attachment"
+msgstr ""
+
 #: src/components/tables/ColumnSelect.tsx:17
 #: src/components/tables/ColumnSelect.tsx:24
 msgid "Select Columns"
@@ -523,41 +579,42 @@ msgstr ""
 msgid "No records found"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:347
+#: src/components/tables/InvenTreeTable.tsx:357
 msgid "Bad request"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:350
+#: src/components/tables/InvenTreeTable.tsx:360
 msgid "Unauthorized"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:353
+#: src/components/tables/InvenTreeTable.tsx:363
 msgid "Forbidden"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:356
+#: src/components/tables/InvenTreeTable.tsx:366
 msgid "Not found"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:405
-#: src/components/tables/InvenTreeTable.tsx:406
+#: src/components/tables/InvenTreeTable.tsx:427
+#: src/components/tables/InvenTreeTable.tsx:428
 msgid "Barcode actions"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:413
-#: src/components/tables/InvenTreeTable.tsx:414
+#: src/components/tables/InvenTreeTable.tsx:435
+#: src/components/tables/InvenTreeTable.tsx:436
 msgid "Print actions"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:431
+#: src/components/tables/InvenTreeTable.tsx:453
 msgid "Refresh data"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:449
+#: src/components/tables/InvenTreeTable.tsx:471
 msgid "Table filters"
 msgstr ""
 
-#: src/components/tables/RowActions.tsx:35
+#: src/components/tables/RowActions.tsx:33
+#: src/components/tables/RowActions.tsx:40
 msgid "Actions"
 msgstr ""
 
@@ -567,12 +624,14 @@ msgstr ""
 
 #: src/components/tables/build/BuildOrderTable.tsx:24
 #: src/components/tables/part/PartTable.tsx:25
+#: src/components/tables/part/RelatedPartTable.tsx:31
 #: src/components/tables/stock/StockItemTable.tsx:22
 msgid "Part"
 msgstr ""
 
 #: src/components/tables/build/BuildOrderTable.tsx:41
 #: src/components/tables/part/PartTable.tsx:51
+#: src/components/tables/part/RelatedPartTable.tsx:49
 #: src/components/tables/stock/StockItemTable.tsx:38
 msgid "Description"
 msgstr ""
@@ -617,7 +676,7 @@ msgstr ""
 #: src/components/tables/part/PartTable.tsx:68
 #: src/components/tables/stock/StockItemTable.tsx:43
 #: src/defaults/links.tsx:27
-#: src/pages/part/PartDetail.tsx:56
+#: src/pages/part/PartDetail.tsx:59
 msgid "Stock"
 msgstr ""
 
@@ -731,15 +790,38 @@ msgstr ""
 msgid "Not Virtual"
 msgstr ""
 
-#: src/components/tables/part/PartTable.tsx:203
-#: src/components/tables/stock/StockItemTable.tsx:124
-msgid "Edit"
-msgstr ""
-
 #: src/components/tables/part/PartTable.tsx:216
 msgid "Detail"
 msgstr ""
 
+#: src/components/tables/part/RelatedPartTable.tsx:61
+msgid "Add Related Part"
+msgstr ""
+
+#: src/components/tables/part/RelatedPartTable.tsx:69
+msgid "Related Part"
+msgstr ""
+
+#: src/components/tables/part/RelatedPartTable.tsx:72
+msgid "Related part added"
+msgstr ""
+
+#: src/components/tables/part/RelatedPartTable.tsx:82
+msgid "Add related part"
+msgstr ""
+
+#: src/components/tables/part/RelatedPartTable.tsx:104
+msgid "Delete Related Part"
+msgstr ""
+
+#: src/components/tables/part/RelatedPartTable.tsx:105
+msgid "Related part deleted"
+msgstr ""
+
+#: src/components/tables/part/RelatedPartTable.tsx:107
+msgid "Are you sure you want to remove this relationship?"
+msgstr ""
+
 #: src/components/tables/stock/StockItemTable.tsx:58
 msgid "Batch"
 msgstr ""
@@ -787,6 +869,18 @@ msgstr ""
 msgid "Getting started"
 msgstr ""
 
+#: src/components/widgets/MarkdownEditor.tsx:109
+msgid "Failed to upload image"
+msgstr ""
+
+#: src/components/widgets/MarkdownEditor.tsx:147
+msgid "Notes saved"
+msgstr ""
+
+#: src/components/widgets/MarkdownEditor.tsx:155
+msgid "Failed to save notes"
+msgstr ""
+
 #: src/components/widgets/WidgetLayout.tsx:180
 msgid "Layout"
 msgstr ""
@@ -1098,8 +1192,48 @@ msgstr ""
 msgid "method parameter not supplied"
 msgstr ""
 
-#: src/functions/forms.tsx:177
-msgid "Delete"
+#: src/functions/forms/AttachmentForms.tsx:57
+msgid "Add File"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:57
+msgid "Add Link"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:58
+msgid "File added"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:58
+msgid "Link added"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:100
+msgid "Edit File"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:100
+msgid "Edit Link"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:101
+msgid "File updated"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:101
+msgid "Link updated"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:127
+msgid "Delete Attachment"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:128
+msgid "Attachment deleted"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:132
+msgid "Are you sure you want to delete this attachment?"
 msgstr ""
 
 #: src/functions/forms/PartForms.tsx:76
@@ -1445,43 +1579,43 @@ msgstr ""
 msgid "Go to the start page"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:50
+#: src/pages/part/PartDetail.tsx:53
 msgid "Details"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:62
+#: src/pages/part/PartDetail.tsx:65
 msgid "Variants"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:69
+#: src/pages/part/PartDetail.tsx:72
 msgid "Bill of Materials"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:83
+#: src/pages/part/PartDetail.tsx:86
 msgid "Used In"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:90
+#: src/pages/part/PartDetail.tsx:93
 msgid "Pricing"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:96
+#: src/pages/part/PartDetail.tsx:99
 msgid "Suppliers"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:117
+#: src/pages/part/PartDetail.tsx:120
 msgid "Test Templates"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:124
+#: src/pages/part/PartDetail.tsx:127
 msgid "Related Parts"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:130
+#: src/pages/part/PartDetail.tsx:133
 msgid "Attachments"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:136
+#: src/pages/part/PartDetail.tsx:139
 msgid "Notes"
 msgstr ""
 
diff --git a/src/frontend/src/locales/en/messages.po b/src/frontend/src/locales/en/messages.po
index 0f8da46d64..83392cccba 100644
--- a/src/frontend/src/locales/en/messages.po
+++ b/src/frontend/src/locales/en/messages.po
@@ -17,6 +17,27 @@ msgstr ""
 msgid "Title"
 msgstr "Title"
 
+#: src/components/forms/ApiForm.tsx:189
+#: src/components/widgets/MarkdownEditor.tsx:146
+msgid "Success"
+msgstr "Success"
+
+#: src/components/forms/ApiForm.tsx:262
+msgid "Form Errors Exist"
+msgstr "Form Errors Exist"
+
+#: src/components/forms/ApiForm.tsx:301
+#: src/components/tables/FilterSelectModal.tsx:166
+#: src/contexts/ThemeContext.tsx:65
+msgid "Cancel"
+msgstr "Cancel"
+
+#: src/components/forms/ApiForm.tsx:310
+#: src/contexts/ThemeContext.tsx:65
+#: src/pages/Index/Profile/UserPanel.tsx:107
+msgid "Submit"
+msgstr "Submit"
+
 #: src/components/forms/AuthenticationForm.tsx:36
 msgid "Login failed"
 msgstr "Login failed"
@@ -133,6 +154,7 @@ msgid "Add Host"
 msgstr "Add Host"
 
 #: src/components/forms/HostOptionsForm.tsx:89
+#: src/components/widgets/MarkdownEditor.tsx:73
 msgid "Save"
 msgstr "Save"
 
@@ -160,12 +182,35 @@ msgstr "Name: {0}"
 msgid "State: <0>worker</0> ({0}), <1>plugins</1>{1}"
 msgstr "State: <0>worker</0> ({0}), <1>plugins</1>{1}"
 
+#: src/components/forms/fields/ApiFormField.tsx:286
+#: src/components/nav/SearchDrawer.tsx:425
+#: src/components/tables/InvenTreeTable.tsx:373
+#: src/components/widgets/MarkdownEditor.tsx:108
+#: src/components/widgets/MarkdownEditor.tsx:154
+#: src/pages/ErrorPage.tsx:12
+#: src/pages/ErrorPage.tsx:25
+msgid "Error"
+msgstr "Error"
+
+#: src/components/forms/fields/RelatedModelField.tsx:194
+msgid "Search"
+msgstr "Search"
+
+#: src/components/forms/fields/RelatedModelField.tsx:195
+#: src/components/widgets/WidgetLayout.tsx:134
+msgid "Loading"
+msgstr "Loading"
+
+#: src/components/forms/fields/RelatedModelField.tsx:197
+msgid "No results found"
+msgstr "No results found"
+
 #: src/components/items/DocTooltip.tsx:89
 msgid "Read More"
 msgstr "Read More"
 
 #: src/components/items/ErrorItem.tsx:5
-#: src/components/tables/InvenTreeTable.tsx:336
+#: src/components/tables/InvenTreeTable.tsx:365
 msgid "Unknown error"
 msgstr "Unknown error"
 
@@ -193,8 +238,8 @@ msgstr "PLH"
 msgid "Scan QR code"
 msgstr "Scan QR code"
 
-#: src/components/items/Thumbnail.tsx:8
-#: src/components/items/Thumbnail.tsx:41
+#: src/components/items/Thumbnail.tsx:10
+#: src/components/items/Thumbnail.tsx:43
 msgid "Thumbnail"
 msgstr "Thumbnail"
 
@@ -308,93 +353,150 @@ msgstr "Documentation"
 msgid "About"
 msgstr "About"
 
-#: src/components/nav/SearchDrawer.tsx:65
+#: src/components/nav/SearchDrawer.tsx:60
 #: src/defaults/links.tsx:26
-#: src/pages/Index/Part.tsx:13
+#: src/pages/part/PartIndex.tsx:23
+#: src/pages/part/PartIndex.tsx:46
 msgid "Parts"
 msgstr "Parts"
 
-#: src/components/nav/SearchDrawer.tsx:74
+#: src/components/nav/SearchDrawer.tsx:68
 msgid "Supplier Parts"
 msgstr "Supplier Parts"
 
-#: src/components/nav/SearchDrawer.tsx:88
+#: src/components/nav/SearchDrawer.tsx:81
 msgid "Manufacturer Parts"
 msgstr "Manufacturer Parts"
 
-#: src/components/nav/SearchDrawer.tsx:102
+#: src/components/nav/SearchDrawer.tsx:94
 msgid "Part Categories"
 msgstr "Part Categories"
 
-#: src/components/nav/SearchDrawer.tsx:111
+#: src/components/nav/SearchDrawer.tsx:102
 #: src/pages/Index/Stock.tsx:13
 msgid "Stock Items"
 msgstr "Stock Items"
 
-#: src/components/nav/SearchDrawer.tsx:123
+#: src/components/nav/SearchDrawer.tsx:113
 msgid "Stock Locations"
 msgstr "Stock Locations"
 
-#: src/components/nav/SearchDrawer.tsx:132
+#: src/components/nav/SearchDrawer.tsx:121
 #: src/pages/Index/Build.tsx:13
+#: src/pages/part/PartDetail.tsx:79
 msgid "Build Orders"
 msgstr "Build Orders"
 
-#: src/components/nav/SearchDrawer.tsx:143
+#: src/components/nav/SearchDrawer.tsx:131
 msgid "Companies"
 msgstr "Companies"
 
-#: src/components/nav/SearchDrawer.tsx:153
+#: src/components/nav/SearchDrawer.tsx:140
+#: src/pages/part/PartDetail.tsx:106
 msgid "Purchase Orders"
 msgstr "Purchase Orders"
 
-#: src/components/nav/SearchDrawer.tsx:164
+#: src/components/nav/SearchDrawer.tsx:150
+#: src/pages/part/PartDetail.tsx:113
 msgid "Sales Orders"
 msgstr "Sales Orders"
 
-#: src/components/nav/SearchDrawer.tsx:175
+#: src/components/nav/SearchDrawer.tsx:160
 msgid "Return Orders"
 msgstr "Return Orders"
 
-#: src/components/nav/SearchDrawer.tsx:209
+#: src/components/nav/SearchDrawer.tsx:195
 msgid "results"
 msgstr "results"
 
-#: src/components/nav/SearchDrawer.tsx:346
+#: src/components/nav/SearchDrawer.tsx:351
 msgid "Enter search text"
 msgstr "Enter search text"
 
-#: src/components/nav/SearchDrawer.tsx:373
+#: src/components/nav/SearchDrawer.tsx:378
 msgid "Search Options"
 msgstr "Search Options"
 
-#: src/components/nav/SearchDrawer.tsx:376
+#: src/components/nav/SearchDrawer.tsx:381
 msgid "Regex search"
 msgstr "Regex search"
 
-#: src/components/nav/SearchDrawer.tsx:386
+#: src/components/nav/SearchDrawer.tsx:391
 msgid "Whole word search"
 msgstr "Whole word search"
 
-#: src/components/nav/SearchDrawer.tsx:419
-#: src/components/tables/InvenTreeTable.tsx:344
-#: src/pages/ErrorPage.tsx:12
-#: src/pages/ErrorPage.tsx:25
-msgid "Error"
-msgstr "Error"
-
-#: src/components/nav/SearchDrawer.tsx:422
+#: src/components/nav/SearchDrawer.tsx:428
 msgid "An error occurred during search query"
 msgstr "An error occurred during search query"
 
-#: src/components/nav/SearchDrawer.tsx:430
+#: src/components/nav/SearchDrawer.tsx:439
 msgid "No results"
 msgstr "No results"
 
-#: src/components/nav/SearchDrawer.tsx:433
+#: src/components/nav/SearchDrawer.tsx:442
 msgid "No results available for search query"
 msgstr "No results available for search query"
 
+#: src/components/render/Instance.tsx:65
+msgid "Unknown model: {model}"
+msgstr "Unknown model: {model}"
+
+#: src/components/render/Order.tsx:67
+msgid "Shipment"
+msgstr "Shipment"
+
+#: src/components/tables/AttachmentTable.tsx:29
+msgid "Attachment"
+msgstr "Attachment"
+
+#: src/components/tables/AttachmentTable.tsx:46
+msgid "Comment"
+msgstr "Comment"
+
+#: src/components/tables/AttachmentTable.tsx:55
+msgid "Uploaded"
+msgstr "Uploaded"
+
+#: src/components/tables/AttachmentTable.tsx:115
+#: src/components/tables/part/PartTable.tsx:203
+#: src/components/tables/stock/StockItemTable.tsx:124
+msgid "Edit"
+msgstr "Edit"
+
+#: src/components/tables/AttachmentTable.tsx:130
+#: src/components/tables/part/RelatedPartTable.tsx:97
+#: src/functions/forms.tsx:177
+msgid "Delete"
+msgstr "Delete"
+
+#: src/components/tables/AttachmentTable.tsx:156
+msgid "File uploaded"
+msgstr "File uploaded"
+
+#: src/components/tables/AttachmentTable.tsx:157
+msgid "File {0} uploaded successfully"
+msgstr "File {0} uploaded successfully"
+
+#: src/components/tables/AttachmentTable.tsx:168
+msgid "Upload Error"
+msgstr "Upload Error"
+
+#: src/components/tables/AttachmentTable.tsx:169
+msgid "File could not be uploaded"
+msgstr "File could not be uploaded"
+
+#: src/components/tables/AttachmentTable.tsx:182
+msgid "Add attachment"
+msgstr "Add attachment"
+
+#: src/components/tables/AttachmentTable.tsx:201
+msgid "Add external link"
+msgstr "Add external link"
+
+#: src/components/tables/AttachmentTable.tsx:241
+msgid "Upload attachment"
+msgstr "Upload attachment"
+
 #: src/components/tables/ColumnSelect.tsx:17
 #: src/components/tables/ColumnSelect.tsx:24
 msgid "Select Columns"
@@ -464,66 +566,68 @@ msgstr "Value"
 msgid "Select filter value"
 msgstr "Select filter value"
 
-#: src/components/tables/FilterSelectModal.tsx:166
-#: src/contexts/ThemeContext.tsx:62
-msgid "Cancel"
-msgstr "Cancel"
-
 #: src/components/tables/FilterSelectModal.tsx:172
 msgid "Add Filter"
 msgstr "Add Filter"
 
-#: src/components/tables/InvenTreeTable.tsx:95
+#: src/components/tables/InvenTreeTable.tsx:96
 msgid "No records found"
 msgstr "No records found"
 
-#: src/components/tables/InvenTreeTable.tsx:323
+#: src/components/tables/InvenTreeTable.tsx:352
 msgid "Bad request"
 msgstr "Bad request"
 
-#: src/components/tables/InvenTreeTable.tsx:326
+#: src/components/tables/InvenTreeTable.tsx:355
 msgid "Unauthorized"
 msgstr "Unauthorized"
 
-#: src/components/tables/InvenTreeTable.tsx:329
+#: src/components/tables/InvenTreeTable.tsx:358
 msgid "Forbidden"
 msgstr "Forbidden"
 
-#: src/components/tables/InvenTreeTable.tsx:332
+#: src/components/tables/InvenTreeTable.tsx:361
 msgid "Not found"
 msgstr "Not found"
 
-#: src/components/tables/InvenTreeTable.tsx:381
-#: src/components/tables/InvenTreeTable.tsx:382
+#: src/components/tables/InvenTreeTable.tsx:422
+#: src/components/tables/InvenTreeTable.tsx:423
 msgid "Barcode actions"
 msgstr "Barcode actions"
 
-#: src/components/tables/InvenTreeTable.tsx:389
-#: src/components/tables/InvenTreeTable.tsx:390
+#: src/components/tables/InvenTreeTable.tsx:430
+#: src/components/tables/InvenTreeTable.tsx:431
 msgid "Print actions"
 msgstr "Print actions"
 
-#: src/components/tables/InvenTreeTable.tsx:407
+#: src/components/tables/InvenTreeTable.tsx:448
 msgid "Refresh data"
 msgstr "Refresh data"
 
-#: src/components/tables/InvenTreeTable.tsx:425
+#: src/components/tables/InvenTreeTable.tsx:466
 msgid "Table filters"
 msgstr "Table filters"
 
+#: src/components/tables/RowActions.tsx:33
+#: src/components/tables/RowActions.tsx:40
+msgid "Actions"
+msgstr "Actions"
+
 #: src/components/tables/build/BuildOrderTable.tsx:18
 msgid "Reference"
 msgstr "Reference"
 
 #: src/components/tables/build/BuildOrderTable.tsx:24
-#: src/components/tables/part/PartTable.tsx:20
-#: src/components/tables/stock/StockItemTable.tsx:21
+#: src/components/tables/part/PartTable.tsx:25
+#: src/components/tables/part/RelatedPartTable.tsx:31
+#: src/components/tables/stock/StockItemTable.tsx:22
 msgid "Part"
 msgstr "Part"
 
 #: src/components/tables/build/BuildOrderTable.tsx:41
-#: src/components/tables/part/PartTable.tsx:46
-#: src/components/tables/stock/StockItemTable.tsx:37
+#: src/components/tables/part/PartTable.tsx:51
+#: src/components/tables/part/RelatedPartTable.tsx:49
+#: src/components/tables/stock/StockItemTable.tsx:38
 msgid "Description"
 msgstr "Description"
 
@@ -544,7 +648,7 @@ msgid "Completed"
 msgstr "Completed"
 
 #: src/components/tables/build/BuildOrderTable.tsx:86
-#: src/components/tables/stock/StockItemTable.tsx:50
+#: src/components/tables/stock/StockItemTable.tsx:51
 msgid "Status"
 msgstr "Status"
 
@@ -552,151 +656,180 @@ msgstr "Status"
 msgid "Created"
 msgstr "Created"
 
-#: src/components/tables/part/PartTable.tsx:34
+#: src/components/tables/part/PartTable.tsx:39
 msgid "IPN"
 msgstr "IPN"
 
-#: src/components/tables/part/PartTable.tsx:41
+#: src/components/tables/part/PartTable.tsx:46
 msgid "Units"
 msgstr "Units"
 
-#: src/components/tables/part/PartTable.tsx:52
+#: src/components/tables/part/PartTable.tsx:57
 msgid "Category"
 msgstr "Category"
 
-#: src/components/tables/part/PartTable.tsx:63
-#: src/components/tables/stock/StockItemTable.tsx:42
+#: src/components/tables/part/PartTable.tsx:68
+#: src/components/tables/stock/StockItemTable.tsx:43
 #: src/defaults/links.tsx:27
+#: src/pages/part/PartDetail.tsx:59
 msgid "Stock"
 msgstr "Stock"
 
-#: src/components/tables/part/PartTable.tsx:69
+#: src/components/tables/part/PartTable.tsx:74
 msgid "Price Range"
 msgstr "Price Range"
 
-#: src/components/tables/part/PartTable.tsx:79
+#: src/components/tables/part/PartTable.tsx:84
 msgid "Link"
 msgstr "Link"
 
-#: src/components/tables/part/PartTable.tsx:92
+#: src/components/tables/part/PartTable.tsx:97
 msgid "Active"
 msgstr "Active"
 
-#: src/components/tables/part/PartTable.tsx:93
+#: src/components/tables/part/PartTable.tsx:98
 msgid "Filter by part active status"
 msgstr "Filter by part active status"
 
-#: src/components/tables/part/PartTable.tsx:98
+#: src/components/tables/part/PartTable.tsx:103
 msgid "Assembly"
 msgstr "Assembly"
 
-#: src/components/tables/part/PartTable.tsx:99
+#: src/components/tables/part/PartTable.tsx:104
 msgid "Filter by assembly attribute"
 msgstr "Filter by assembly attribute"
 
-#: src/components/tables/part/PartTable.tsx:104
+#: src/components/tables/part/PartTable.tsx:109
 msgid "Include Subcategories"
 msgstr "Include Subcategories"
 
-#: src/components/tables/part/PartTable.tsx:105
+#: src/components/tables/part/PartTable.tsx:110
 msgid "Include parts in subcategories"
 msgstr "Include parts in subcategories"
 
-#: src/components/tables/part/PartTable.tsx:110
+#: src/components/tables/part/PartTable.tsx:115
 msgid "Component"
 msgstr "Component"
 
-#: src/components/tables/part/PartTable.tsx:111
+#: src/components/tables/part/PartTable.tsx:116
 msgid "Filter by component attribute"
 msgstr "Filter by component attribute"
 
-#: src/components/tables/part/PartTable.tsx:116
+#: src/components/tables/part/PartTable.tsx:121
 msgid "Trackable"
 msgstr "Trackable"
 
-#: src/components/tables/part/PartTable.tsx:117
+#: src/components/tables/part/PartTable.tsx:122
 msgid "Filter by trackable attribute"
 msgstr "Filter by trackable attribute"
 
-#: src/components/tables/part/PartTable.tsx:122
+#: src/components/tables/part/PartTable.tsx:127
 msgid "Has Units"
 msgstr "Has Units"
 
-#: src/components/tables/part/PartTable.tsx:123
+#: src/components/tables/part/PartTable.tsx:128
 msgid "Filter by parts which have units"
 msgstr "Filter by parts which have units"
 
-#: src/components/tables/part/PartTable.tsx:128
+#: src/components/tables/part/PartTable.tsx:133
 msgid "Has IPN"
 msgstr "Has IPN"
 
-#: src/components/tables/part/PartTable.tsx:129
+#: src/components/tables/part/PartTable.tsx:134
 msgid "Filter by parts which have an internal part number"
 msgstr "Filter by parts which have an internal part number"
 
-#: src/components/tables/part/PartTable.tsx:134
+#: src/components/tables/part/PartTable.tsx:139
 msgid "Has Stock"
 msgstr "Has Stock"
 
-#: src/components/tables/part/PartTable.tsx:135
+#: src/components/tables/part/PartTable.tsx:140
 msgid "Filter by parts which have stock"
 msgstr "Filter by parts which have stock"
 
-#: src/components/tables/part/PartTable.tsx:140
+#: src/components/tables/part/PartTable.tsx:145
 #: src/defaults/dashboardItems.tsx:41
 msgid "Low Stock"
 msgstr "Low Stock"
 
-#: src/components/tables/part/PartTable.tsx:141
+#: src/components/tables/part/PartTable.tsx:146
 msgid "Filter by parts which have low stock"
 msgstr "Filter by parts which have low stock"
 
-#: src/components/tables/part/PartTable.tsx:146
+#: src/components/tables/part/PartTable.tsx:151
 msgid "Purchaseable"
 msgstr "Purchaseable"
 
-#: src/components/tables/part/PartTable.tsx:147
+#: src/components/tables/part/PartTable.tsx:152
 msgid "Filter by parts which are purchaseable"
 msgstr "Filter by parts which are purchaseable"
 
-#: src/components/tables/part/PartTable.tsx:152
+#: src/components/tables/part/PartTable.tsx:157
 msgid "Salable"
 msgstr "Salable"
 
-#: src/components/tables/part/PartTable.tsx:153
+#: src/components/tables/part/PartTable.tsx:158
 msgid "Filter by parts which are salable"
 msgstr "Filter by parts which are salable"
 
-#: src/components/tables/part/PartTable.tsx:158
-#: src/components/tables/part/PartTable.tsx:162
+#: src/components/tables/part/PartTable.tsx:163
+#: src/components/tables/part/PartTable.tsx:167
 msgid "Virtual"
 msgstr "Virtual"
 
-#: src/components/tables/part/PartTable.tsx:159
+#: src/components/tables/part/PartTable.tsx:164
 msgid "Filter by parts which are virtual"
 msgstr "Filter by parts which are virtual"
 
-#: src/components/tables/part/PartTable.tsx:163
+#: src/components/tables/part/PartTable.tsx:168
 msgid "Not Virtual"
 msgstr "Not Virtual"
 
-#: src/components/tables/stock/StockItemTable.tsx:57
+#: src/components/tables/part/PartTable.tsx:216
+msgid "Detail"
+msgstr "Detail"
+
+#: src/components/tables/part/RelatedPartTable.tsx:61
+msgid "Add Related Part"
+msgstr "Add Related Part"
+
+#: src/components/tables/part/RelatedPartTable.tsx:69
+msgid "Related Part"
+msgstr "Related Part"
+
+#: src/components/tables/part/RelatedPartTable.tsx:72
+msgid "Related part added"
+msgstr "Related part added"
+
+#: src/components/tables/part/RelatedPartTable.tsx:82
+msgid "Add related part"
+msgstr "Add related part"
+
+#: src/components/tables/part/RelatedPartTable.tsx:104
+msgid "Delete Related Part"
+msgstr "Delete Related Part"
+
+#: src/components/tables/part/RelatedPartTable.tsx:105
+msgid "Related part deleted"
+msgstr "Related part deleted"
+
+#: src/components/tables/part/RelatedPartTable.tsx:107
+msgid "Are you sure you want to remove this relationship?"
+msgstr "Are you sure you want to remove this relationship?"
+
+#: src/components/tables/stock/StockItemTable.tsx:58
 msgid "Batch"
 msgstr "Batch"
 
-#: src/components/tables/stock/StockItemTable.tsx:63
+#: src/components/tables/stock/StockItemTable.tsx:64
 msgid "Location"
 msgstr "Location"
 
-#: src/components/tables/stock/StockItemTable.tsx:80
-msgid "Actions"
-msgstr "Actions"
-
-#: src/components/tables/stock/StockItemTable.tsx:124
+#: src/components/tables/stock/StockItemTable.tsx:100
 msgid "Test Filter"
 msgstr "Test Filter"
 
-#: src/components/tables/stock/StockItemTable.tsx:125
+#: src/components/tables/stock/StockItemTable.tsx:101
 msgid "This is a test filter"
 msgstr "This is a test filter"
 
@@ -731,9 +864,17 @@ msgstr "Provide Feedback"
 msgid "Getting started"
 msgstr "Getting started"
 
-#: src/components/widgets/WidgetLayout.tsx:134
-msgid "Loading"
-msgstr "Loading"
+#: src/components/widgets/MarkdownEditor.tsx:109
+msgid "Failed to upload image"
+msgstr "Failed to upload image"
+
+#: src/components/widgets/MarkdownEditor.tsx:147
+msgid "Notes saved"
+msgstr "Notes saved"
+
+#: src/components/widgets/MarkdownEditor.tsx:155
+msgid "Failed to save notes"
+msgstr "Failed to save notes"
 
 #: src/components/widgets/WidgetLayout.tsx:180
 msgid "Layout"
@@ -759,11 +900,6 @@ msgstr "Appearance"
 msgid "Show Boxes"
 msgstr "Show Boxes"
 
-#: src/contexts/ThemeContext.tsx:62
-#: src/pages/Index/Profile/UserPanel.tsx:107
-msgid "Submit"
-msgstr "Submit"
-
 #: src/defaults/dashboardItems.tsx:6
 msgid "Subscribed Parts"
 msgstr "Subscribed Parts"
@@ -864,7 +1000,7 @@ msgstr "Build"
 
 #: src/defaults/links.tsx:31
 #: src/defaults/menuItems.tsx:25
-#: src/pages/Index/Playground.tsx:12
+#: src/pages/Index/Playground.tsx:87
 msgid "Playground"
 msgstr "Playground"
 
@@ -1029,6 +1165,116 @@ msgstr "Already logged in"
 msgid "Found an existing login - using it to log you in."
 msgstr "Found an existing login - using it to log you in."
 
+#: src/functions/forms.tsx:48
+#: src/functions/forms.tsx:57
+#: src/functions/forms.tsx:137
+msgid "Form Error"
+msgstr "Form Error"
+
+#: src/functions/forms.tsx:49
+msgid "Form method not provided"
+msgstr "Form method not provided"
+
+#: src/functions/forms.tsx:58
+msgid "Response did not contain action data"
+msgstr "Response did not contain action data"
+
+#: src/functions/forms.tsx:96
+msgid "Invalid Form"
+msgstr "Invalid Form"
+
+#: src/functions/forms.tsx:97
+msgid "method parameter not supplied"
+msgstr "method parameter not supplied"
+
+#: src/functions/forms/AttachmentForms.tsx:57
+msgid "Add File"
+msgstr "Add File"
+
+#: src/functions/forms/AttachmentForms.tsx:57
+msgid "Add Link"
+msgstr "Add Link"
+
+#: src/functions/forms/AttachmentForms.tsx:58
+msgid "File added"
+msgstr "File added"
+
+#: src/functions/forms/AttachmentForms.tsx:58
+msgid "Link added"
+msgstr "Link added"
+
+#: src/functions/forms/AttachmentForms.tsx:100
+msgid "Edit File"
+msgstr "Edit File"
+
+#: src/functions/forms/AttachmentForms.tsx:100
+msgid "Edit Link"
+msgstr "Edit Link"
+
+#: src/functions/forms/AttachmentForms.tsx:101
+msgid "File updated"
+msgstr "File updated"
+
+#: src/functions/forms/AttachmentForms.tsx:101
+msgid "Link updated"
+msgstr "Link updated"
+
+#: src/functions/forms/AttachmentForms.tsx:127
+msgid "Delete Attachment"
+msgstr "Delete Attachment"
+
+#: src/functions/forms/AttachmentForms.tsx:128
+msgid "Attachment deleted"
+msgstr "Attachment deleted"
+
+#: src/functions/forms/AttachmentForms.tsx:132
+msgid "Are you sure you want to delete this attachment?"
+msgstr "Are you sure you want to delete this attachment?"
+
+#: src/functions/forms/PartForms.tsx:76
+msgid "Create Part"
+msgstr "Create Part"
+
+#: src/functions/forms/PartForms.tsx:78
+msgid "Part created"
+msgstr "Part created"
+
+#: src/functions/forms/PartForms.tsx:96
+msgid "Edit Part"
+msgstr "Edit Part"
+
+#: src/functions/forms/PartForms.tsx:99
+msgid "Part updated"
+msgstr "Part updated"
+
+#: src/functions/forms/PartForms.tsx:111
+msgid "Parent part category"
+msgstr "Parent part category"
+
+#: src/functions/forms/StockForms.tsx:30
+msgid "Add given quantity as packs instead of individual items"
+msgstr "Add given quantity as packs instead of individual items"
+
+#: src/functions/forms/StockForms.tsx:39
+msgid "Enter initial quantity for this stock item"
+msgstr "Enter initial quantity for this stock item"
+
+#: src/functions/forms/StockForms.tsx:44
+msgid "Serial Numbers"
+msgstr "Serial Numbers"
+
+#: src/functions/forms/StockForms.tsx:45
+msgid "Enter serial numbers for new stock (or leave blank)"
+msgstr "Enter serial numbers for new stock (or leave blank)"
+
+#: src/functions/forms/StockForms.tsx:90
+msgid "Create Stock Item"
+msgstr "Create Stock Item"
+
+#: src/functions/forms/StockForms.tsx:104
+msgid "Edit Stock Item"
+msgstr "Edit Stock Item"
+
 #: src/functions/notifications.tsx:9
 msgid "Not implemented"
 msgstr "Not implemented"
@@ -1037,6 +1283,22 @@ msgstr "Not implemented"
 msgid "This feature is not yet implemented"
 msgstr "This feature is not yet implemented"
 
+#: src/functions/notifications.tsx:20
+msgid "Permission denied"
+msgstr "Permission denied"
+
+#: src/functions/notifications.tsx:21
+msgid "You do not have permission to perform this action"
+msgstr "You do not have permission to perform this action"
+
+#: src/functions/notifications.tsx:32
+msgid "Invalid Return Code"
+msgstr "Invalid Return Code"
+
+#: src/functions/notifications.tsx:33
+msgid "Server returned status {returnCode}"
+msgstr "Server returned status {returnCode}"
+
 #: src/pages/Auth/Logged-In.tsx:18
 msgid "Checking if you are already logged in"
 msgstr "Checking if you are already logged in"
@@ -1097,7 +1359,7 @@ msgstr "This page is a replacement for the old start page with the same informat
 msgid "Welcome to your Dashboard{0}"
 msgstr "Welcome to your Dashboard{0}"
 
-#: src/pages/Index/Playground.tsx:17
+#: src/pages/Index/Playground.tsx:92
 msgid "This page is a showcase for the possibilities of Platform UI."
 msgstr "This page is a showcase for the possibilities of Platform UI."
 
@@ -1312,6 +1574,54 @@ msgstr "Sorry, this page is not known or was moved."
 msgid "Go to the start page"
 msgstr "Go to the start page"
 
+#: src/pages/part/PartDetail.tsx:53
+msgid "Details"
+msgstr "Details"
+
+#: src/pages/part/PartDetail.tsx:65
+msgid "Variants"
+msgstr "Variants"
+
+#: src/pages/part/PartDetail.tsx:72
+msgid "Bill of Materials"
+msgstr "Bill of Materials"
+
+#: src/pages/part/PartDetail.tsx:86
+msgid "Used In"
+msgstr "Used In"
+
+#: src/pages/part/PartDetail.tsx:93
+msgid "Pricing"
+msgstr "Pricing"
+
+#: src/pages/part/PartDetail.tsx:99
+msgid "Suppliers"
+msgstr "Suppliers"
+
+#: src/pages/part/PartDetail.tsx:120
+msgid "Test Templates"
+msgstr "Test Templates"
+
+#: src/pages/part/PartDetail.tsx:127
+msgid "Related Parts"
+msgstr "Related Parts"
+
+#: src/pages/part/PartDetail.tsx:133
+msgid "Attachments"
+msgstr "Attachments"
+
+#: src/pages/part/PartDetail.tsx:139
+msgid "Notes"
+msgstr "Notes"
+
+#: src/pages/part/PartIndex.tsx:29
+msgid "Categories"
+msgstr "Categories"
+
+#: src/pages/part/PartIndex.tsx:35
+msgid "Parameters"
+msgstr "Parameters"
+
 #: src/views/MobileAppView.tsx:14
 msgid "Mobile viewport detected"
 msgstr "Mobile viewport detected"
diff --git a/src/frontend/src/locales/es/messages.po b/src/frontend/src/locales/es/messages.po
index c846c70fa0..31e2878b2d 100644
--- a/src/frontend/src/locales/es/messages.po
+++ b/src/frontend/src/locales/es/messages.po
@@ -8,7 +8,7 @@ msgstr ""
 "Language: es_MX\n"
 "Project-Id-Version: inventree\n"
 "Report-Msgid-Bugs-To: \n"
-"PO-Revision-Date: 2023-09-12 00:11\n"
+"PO-Revision-Date: 2023-09-14 01:15\n"
 "Last-Translator: \n"
 "Language-Team: Spanish, Mexico\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
@@ -23,6 +23,7 @@ msgid "Title"
 msgstr ""
 
 #: src/components/forms/ApiForm.tsx:189
+#: src/components/widgets/MarkdownEditor.tsx:146
 msgid "Success"
 msgstr ""
 
@@ -158,6 +159,7 @@ msgid "Add Host"
 msgstr ""
 
 #: src/components/forms/HostOptionsForm.tsx:89
+#: src/components/widgets/MarkdownEditor.tsx:73
 msgid "Save"
 msgstr "Guardar"
 
@@ -187,7 +189,9 @@ msgstr ""
 
 #: src/components/forms/fields/ApiFormField.tsx:286
 #: src/components/nav/SearchDrawer.tsx:425
-#: src/components/tables/InvenTreeTable.tsx:368
+#: src/components/tables/InvenTreeTable.tsx:378
+#: src/components/widgets/MarkdownEditor.tsx:108
+#: src/components/widgets/MarkdownEditor.tsx:154
 #: src/pages/ErrorPage.tsx:12
 #: src/pages/ErrorPage.tsx:25
 msgid "Error"
@@ -211,7 +215,7 @@ msgid "Read More"
 msgstr ""
 
 #: src/components/items/ErrorItem.tsx:5
-#: src/components/tables/InvenTreeTable.tsx:360
+#: src/components/tables/InvenTreeTable.tsx:370
 msgid "Unknown error"
 msgstr ""
 
@@ -384,7 +388,7 @@ msgstr ""
 
 #: src/components/nav/SearchDrawer.tsx:121
 #: src/pages/Index/Build.tsx:13
-#: src/pages/part/PartDetail.tsx:76
+#: src/pages/part/PartDetail.tsx:79
 msgid "Build Orders"
 msgstr ""
 
@@ -393,12 +397,12 @@ msgid "Companies"
 msgstr ""
 
 #: src/components/nav/SearchDrawer.tsx:140
-#: src/pages/part/PartDetail.tsx:103
+#: src/pages/part/PartDetail.tsx:106
 msgid "Purchase Orders"
 msgstr "Órdenes de compra"
 
 #: src/components/nav/SearchDrawer.tsx:150
-#: src/pages/part/PartDetail.tsx:110
+#: src/pages/part/PartDetail.tsx:113
 msgid "Sales Orders"
 msgstr ""
 
@@ -446,6 +450,58 @@ msgstr ""
 msgid "Shipment"
 msgstr ""
 
+#: src/components/tables/AttachmentTable.tsx:29
+msgid "Attachment"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:46
+msgid "Comment"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:55
+msgid "Uploaded"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:115
+#: src/components/tables/part/PartTable.tsx:203
+#: src/components/tables/stock/StockItemTable.tsx:124
+msgid "Edit"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:130
+#: src/components/tables/part/RelatedPartTable.tsx:97
+#: src/functions/forms.tsx:177
+msgid "Delete"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:156
+msgid "File uploaded"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:157
+msgid "File {0} uploaded successfully"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:168
+msgid "Upload Error"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:169
+msgid "File could not be uploaded"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:182
+msgid "Add attachment"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:201
+msgid "Add external link"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:241
+msgid "Upload attachment"
+msgstr ""
+
 #: src/components/tables/ColumnSelect.tsx:17
 #: src/components/tables/ColumnSelect.tsx:24
 msgid "Select Columns"
@@ -523,41 +579,42 @@ msgstr ""
 msgid "No records found"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:347
+#: src/components/tables/InvenTreeTable.tsx:357
 msgid "Bad request"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:350
+#: src/components/tables/InvenTreeTable.tsx:360
 msgid "Unauthorized"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:353
+#: src/components/tables/InvenTreeTable.tsx:363
 msgid "Forbidden"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:356
+#: src/components/tables/InvenTreeTable.tsx:366
 msgid "Not found"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:405
-#: src/components/tables/InvenTreeTable.tsx:406
+#: src/components/tables/InvenTreeTable.tsx:427
+#: src/components/tables/InvenTreeTable.tsx:428
 msgid "Barcode actions"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:413
-#: src/components/tables/InvenTreeTable.tsx:414
+#: src/components/tables/InvenTreeTable.tsx:435
+#: src/components/tables/InvenTreeTable.tsx:436
 msgid "Print actions"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:431
+#: src/components/tables/InvenTreeTable.tsx:453
 msgid "Refresh data"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:449
+#: src/components/tables/InvenTreeTable.tsx:471
 msgid "Table filters"
 msgstr ""
 
-#: src/components/tables/RowActions.tsx:35
+#: src/components/tables/RowActions.tsx:33
+#: src/components/tables/RowActions.tsx:40
 msgid "Actions"
 msgstr ""
 
@@ -567,12 +624,14 @@ msgstr ""
 
 #: src/components/tables/build/BuildOrderTable.tsx:24
 #: src/components/tables/part/PartTable.tsx:25
+#: src/components/tables/part/RelatedPartTable.tsx:31
 #: src/components/tables/stock/StockItemTable.tsx:22
 msgid "Part"
 msgstr ""
 
 #: src/components/tables/build/BuildOrderTable.tsx:41
 #: src/components/tables/part/PartTable.tsx:51
+#: src/components/tables/part/RelatedPartTable.tsx:49
 #: src/components/tables/stock/StockItemTable.tsx:38
 msgid "Description"
 msgstr ""
@@ -617,7 +676,7 @@ msgstr ""
 #: src/components/tables/part/PartTable.tsx:68
 #: src/components/tables/stock/StockItemTable.tsx:43
 #: src/defaults/links.tsx:27
-#: src/pages/part/PartDetail.tsx:56
+#: src/pages/part/PartDetail.tsx:59
 msgid "Stock"
 msgstr ""
 
@@ -731,15 +790,38 @@ msgstr ""
 msgid "Not Virtual"
 msgstr ""
 
-#: src/components/tables/part/PartTable.tsx:203
-#: src/components/tables/stock/StockItemTable.tsx:124
-msgid "Edit"
-msgstr ""
-
 #: src/components/tables/part/PartTable.tsx:216
 msgid "Detail"
 msgstr ""
 
+#: src/components/tables/part/RelatedPartTable.tsx:61
+msgid "Add Related Part"
+msgstr ""
+
+#: src/components/tables/part/RelatedPartTable.tsx:69
+msgid "Related Part"
+msgstr ""
+
+#: src/components/tables/part/RelatedPartTable.tsx:72
+msgid "Related part added"
+msgstr ""
+
+#: src/components/tables/part/RelatedPartTable.tsx:82
+msgid "Add related part"
+msgstr ""
+
+#: src/components/tables/part/RelatedPartTable.tsx:104
+msgid "Delete Related Part"
+msgstr ""
+
+#: src/components/tables/part/RelatedPartTable.tsx:105
+msgid "Related part deleted"
+msgstr ""
+
+#: src/components/tables/part/RelatedPartTable.tsx:107
+msgid "Are you sure you want to remove this relationship?"
+msgstr ""
+
 #: src/components/tables/stock/StockItemTable.tsx:58
 msgid "Batch"
 msgstr ""
@@ -787,6 +869,18 @@ msgstr ""
 msgid "Getting started"
 msgstr ""
 
+#: src/components/widgets/MarkdownEditor.tsx:109
+msgid "Failed to upload image"
+msgstr ""
+
+#: src/components/widgets/MarkdownEditor.tsx:147
+msgid "Notes saved"
+msgstr ""
+
+#: src/components/widgets/MarkdownEditor.tsx:155
+msgid "Failed to save notes"
+msgstr ""
+
 #: src/components/widgets/WidgetLayout.tsx:180
 msgid "Layout"
 msgstr ""
@@ -1098,8 +1192,48 @@ msgstr ""
 msgid "method parameter not supplied"
 msgstr ""
 
-#: src/functions/forms.tsx:177
-msgid "Delete"
+#: src/functions/forms/AttachmentForms.tsx:57
+msgid "Add File"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:57
+msgid "Add Link"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:58
+msgid "File added"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:58
+msgid "Link added"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:100
+msgid "Edit File"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:100
+msgid "Edit Link"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:101
+msgid "File updated"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:101
+msgid "Link updated"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:127
+msgid "Delete Attachment"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:128
+msgid "Attachment deleted"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:132
+msgid "Are you sure you want to delete this attachment?"
 msgstr ""
 
 #: src/functions/forms/PartForms.tsx:76
@@ -1445,43 +1579,43 @@ msgstr ""
 msgid "Go to the start page"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:50
+#: src/pages/part/PartDetail.tsx:53
 msgid "Details"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:62
+#: src/pages/part/PartDetail.tsx:65
 msgid "Variants"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:69
+#: src/pages/part/PartDetail.tsx:72
 msgid "Bill of Materials"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:83
+#: src/pages/part/PartDetail.tsx:86
 msgid "Used In"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:90
+#: src/pages/part/PartDetail.tsx:93
 msgid "Pricing"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:96
+#: src/pages/part/PartDetail.tsx:99
 msgid "Suppliers"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:117
+#: src/pages/part/PartDetail.tsx:120
 msgid "Test Templates"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:124
+#: src/pages/part/PartDetail.tsx:127
 msgid "Related Parts"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:130
+#: src/pages/part/PartDetail.tsx:133
 msgid "Attachments"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:136
+#: src/pages/part/PartDetail.tsx:139
 msgid "Notes"
 msgstr ""
 
diff --git a/src/frontend/src/locales/fa/messages.po b/src/frontend/src/locales/fa/messages.po
index 16583cb865..1b64202e10 100644
--- a/src/frontend/src/locales/fa/messages.po
+++ b/src/frontend/src/locales/fa/messages.po
@@ -8,7 +8,7 @@ msgstr ""
 "Language: fa\n"
 "Project-Id-Version: inventree\n"
 "Report-Msgid-Bugs-To: \n"
-"PO-Revision-Date: 2023-09-12 00:11\n"
+"PO-Revision-Date: 2023-09-14 01:15\n"
 "Last-Translator: \n"
 "Language-Team: Persian\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
@@ -23,6 +23,7 @@ msgid "Title"
 msgstr ""
 
 #: src/components/forms/ApiForm.tsx:189
+#: src/components/widgets/MarkdownEditor.tsx:146
 msgid "Success"
 msgstr ""
 
@@ -158,6 +159,7 @@ msgid "Add Host"
 msgstr ""
 
 #: src/components/forms/HostOptionsForm.tsx:89
+#: src/components/widgets/MarkdownEditor.tsx:73
 msgid "Save"
 msgstr ""
 
@@ -187,7 +189,9 @@ msgstr ""
 
 #: src/components/forms/fields/ApiFormField.tsx:286
 #: src/components/nav/SearchDrawer.tsx:425
-#: src/components/tables/InvenTreeTable.tsx:368
+#: src/components/tables/InvenTreeTable.tsx:378
+#: src/components/widgets/MarkdownEditor.tsx:108
+#: src/components/widgets/MarkdownEditor.tsx:154
 #: src/pages/ErrorPage.tsx:12
 #: src/pages/ErrorPage.tsx:25
 msgid "Error"
@@ -211,7 +215,7 @@ msgid "Read More"
 msgstr ""
 
 #: src/components/items/ErrorItem.tsx:5
-#: src/components/tables/InvenTreeTable.tsx:360
+#: src/components/tables/InvenTreeTable.tsx:370
 msgid "Unknown error"
 msgstr ""
 
@@ -384,7 +388,7 @@ msgstr ""
 
 #: src/components/nav/SearchDrawer.tsx:121
 #: src/pages/Index/Build.tsx:13
-#: src/pages/part/PartDetail.tsx:76
+#: src/pages/part/PartDetail.tsx:79
 msgid "Build Orders"
 msgstr ""
 
@@ -393,12 +397,12 @@ msgid "Companies"
 msgstr ""
 
 #: src/components/nav/SearchDrawer.tsx:140
-#: src/pages/part/PartDetail.tsx:103
+#: src/pages/part/PartDetail.tsx:106
 msgid "Purchase Orders"
 msgstr ""
 
 #: src/components/nav/SearchDrawer.tsx:150
-#: src/pages/part/PartDetail.tsx:110
+#: src/pages/part/PartDetail.tsx:113
 msgid "Sales Orders"
 msgstr ""
 
@@ -446,6 +450,58 @@ msgstr ""
 msgid "Shipment"
 msgstr ""
 
+#: src/components/tables/AttachmentTable.tsx:29
+msgid "Attachment"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:46
+msgid "Comment"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:55
+msgid "Uploaded"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:115
+#: src/components/tables/part/PartTable.tsx:203
+#: src/components/tables/stock/StockItemTable.tsx:124
+msgid "Edit"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:130
+#: src/components/tables/part/RelatedPartTable.tsx:97
+#: src/functions/forms.tsx:177
+msgid "Delete"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:156
+msgid "File uploaded"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:157
+msgid "File {0} uploaded successfully"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:168
+msgid "Upload Error"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:169
+msgid "File could not be uploaded"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:182
+msgid "Add attachment"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:201
+msgid "Add external link"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:241
+msgid "Upload attachment"
+msgstr ""
+
 #: src/components/tables/ColumnSelect.tsx:17
 #: src/components/tables/ColumnSelect.tsx:24
 msgid "Select Columns"
@@ -523,41 +579,42 @@ msgstr ""
 msgid "No records found"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:347
+#: src/components/tables/InvenTreeTable.tsx:357
 msgid "Bad request"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:350
+#: src/components/tables/InvenTreeTable.tsx:360
 msgid "Unauthorized"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:353
+#: src/components/tables/InvenTreeTable.tsx:363
 msgid "Forbidden"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:356
+#: src/components/tables/InvenTreeTable.tsx:366
 msgid "Not found"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:405
-#: src/components/tables/InvenTreeTable.tsx:406
+#: src/components/tables/InvenTreeTable.tsx:427
+#: src/components/tables/InvenTreeTable.tsx:428
 msgid "Barcode actions"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:413
-#: src/components/tables/InvenTreeTable.tsx:414
+#: src/components/tables/InvenTreeTable.tsx:435
+#: src/components/tables/InvenTreeTable.tsx:436
 msgid "Print actions"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:431
+#: src/components/tables/InvenTreeTable.tsx:453
 msgid "Refresh data"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:449
+#: src/components/tables/InvenTreeTable.tsx:471
 msgid "Table filters"
 msgstr ""
 
-#: src/components/tables/RowActions.tsx:35
+#: src/components/tables/RowActions.tsx:33
+#: src/components/tables/RowActions.tsx:40
 msgid "Actions"
 msgstr ""
 
@@ -567,12 +624,14 @@ msgstr ""
 
 #: src/components/tables/build/BuildOrderTable.tsx:24
 #: src/components/tables/part/PartTable.tsx:25
+#: src/components/tables/part/RelatedPartTable.tsx:31
 #: src/components/tables/stock/StockItemTable.tsx:22
 msgid "Part"
 msgstr ""
 
 #: src/components/tables/build/BuildOrderTable.tsx:41
 #: src/components/tables/part/PartTable.tsx:51
+#: src/components/tables/part/RelatedPartTable.tsx:49
 #: src/components/tables/stock/StockItemTable.tsx:38
 msgid "Description"
 msgstr ""
@@ -617,7 +676,7 @@ msgstr ""
 #: src/components/tables/part/PartTable.tsx:68
 #: src/components/tables/stock/StockItemTable.tsx:43
 #: src/defaults/links.tsx:27
-#: src/pages/part/PartDetail.tsx:56
+#: src/pages/part/PartDetail.tsx:59
 msgid "Stock"
 msgstr ""
 
@@ -731,15 +790,38 @@ msgstr ""
 msgid "Not Virtual"
 msgstr ""
 
-#: src/components/tables/part/PartTable.tsx:203
-#: src/components/tables/stock/StockItemTable.tsx:124
-msgid "Edit"
-msgstr ""
-
 #: src/components/tables/part/PartTable.tsx:216
 msgid "Detail"
 msgstr ""
 
+#: src/components/tables/part/RelatedPartTable.tsx:61
+msgid "Add Related Part"
+msgstr ""
+
+#: src/components/tables/part/RelatedPartTable.tsx:69
+msgid "Related Part"
+msgstr ""
+
+#: src/components/tables/part/RelatedPartTable.tsx:72
+msgid "Related part added"
+msgstr ""
+
+#: src/components/tables/part/RelatedPartTable.tsx:82
+msgid "Add related part"
+msgstr ""
+
+#: src/components/tables/part/RelatedPartTable.tsx:104
+msgid "Delete Related Part"
+msgstr ""
+
+#: src/components/tables/part/RelatedPartTable.tsx:105
+msgid "Related part deleted"
+msgstr ""
+
+#: src/components/tables/part/RelatedPartTable.tsx:107
+msgid "Are you sure you want to remove this relationship?"
+msgstr ""
+
 #: src/components/tables/stock/StockItemTable.tsx:58
 msgid "Batch"
 msgstr ""
@@ -787,6 +869,18 @@ msgstr ""
 msgid "Getting started"
 msgstr ""
 
+#: src/components/widgets/MarkdownEditor.tsx:109
+msgid "Failed to upload image"
+msgstr ""
+
+#: src/components/widgets/MarkdownEditor.tsx:147
+msgid "Notes saved"
+msgstr ""
+
+#: src/components/widgets/MarkdownEditor.tsx:155
+msgid "Failed to save notes"
+msgstr ""
+
 #: src/components/widgets/WidgetLayout.tsx:180
 msgid "Layout"
 msgstr ""
@@ -1098,8 +1192,48 @@ msgstr ""
 msgid "method parameter not supplied"
 msgstr ""
 
-#: src/functions/forms.tsx:177
-msgid "Delete"
+#: src/functions/forms/AttachmentForms.tsx:57
+msgid "Add File"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:57
+msgid "Add Link"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:58
+msgid "File added"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:58
+msgid "Link added"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:100
+msgid "Edit File"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:100
+msgid "Edit Link"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:101
+msgid "File updated"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:101
+msgid "Link updated"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:127
+msgid "Delete Attachment"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:128
+msgid "Attachment deleted"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:132
+msgid "Are you sure you want to delete this attachment?"
 msgstr ""
 
 #: src/functions/forms/PartForms.tsx:76
@@ -1445,43 +1579,43 @@ msgstr ""
 msgid "Go to the start page"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:50
+#: src/pages/part/PartDetail.tsx:53
 msgid "Details"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:62
+#: src/pages/part/PartDetail.tsx:65
 msgid "Variants"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:69
+#: src/pages/part/PartDetail.tsx:72
 msgid "Bill of Materials"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:83
+#: src/pages/part/PartDetail.tsx:86
 msgid "Used In"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:90
+#: src/pages/part/PartDetail.tsx:93
 msgid "Pricing"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:96
+#: src/pages/part/PartDetail.tsx:99
 msgid "Suppliers"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:117
+#: src/pages/part/PartDetail.tsx:120
 msgid "Test Templates"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:124
+#: src/pages/part/PartDetail.tsx:127
 msgid "Related Parts"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:130
+#: src/pages/part/PartDetail.tsx:133
 msgid "Attachments"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:136
+#: src/pages/part/PartDetail.tsx:139
 msgid "Notes"
 msgstr ""
 
diff --git a/src/frontend/src/locales/fi/messages.po b/src/frontend/src/locales/fi/messages.po
index 98c0a1e938..3f60da9bfd 100644
--- a/src/frontend/src/locales/fi/messages.po
+++ b/src/frontend/src/locales/fi/messages.po
@@ -8,7 +8,7 @@ msgstr ""
 "Language: fi\n"
 "Project-Id-Version: inventree\n"
 "Report-Msgid-Bugs-To: \n"
-"PO-Revision-Date: 2023-09-12 00:10\n"
+"PO-Revision-Date: 2023-09-14 01:14\n"
 "Last-Translator: \n"
 "Language-Team: Finnish\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
@@ -23,6 +23,7 @@ msgid "Title"
 msgstr ""
 
 #: src/components/forms/ApiForm.tsx:189
+#: src/components/widgets/MarkdownEditor.tsx:146
 msgid "Success"
 msgstr ""
 
@@ -158,6 +159,7 @@ msgid "Add Host"
 msgstr ""
 
 #: src/components/forms/HostOptionsForm.tsx:89
+#: src/components/widgets/MarkdownEditor.tsx:73
 msgid "Save"
 msgstr ""
 
@@ -187,7 +189,9 @@ msgstr ""
 
 #: src/components/forms/fields/ApiFormField.tsx:286
 #: src/components/nav/SearchDrawer.tsx:425
-#: src/components/tables/InvenTreeTable.tsx:368
+#: src/components/tables/InvenTreeTable.tsx:378
+#: src/components/widgets/MarkdownEditor.tsx:108
+#: src/components/widgets/MarkdownEditor.tsx:154
 #: src/pages/ErrorPage.tsx:12
 #: src/pages/ErrorPage.tsx:25
 msgid "Error"
@@ -211,7 +215,7 @@ msgid "Read More"
 msgstr ""
 
 #: src/components/items/ErrorItem.tsx:5
-#: src/components/tables/InvenTreeTable.tsx:360
+#: src/components/tables/InvenTreeTable.tsx:370
 msgid "Unknown error"
 msgstr ""
 
@@ -384,7 +388,7 @@ msgstr ""
 
 #: src/components/nav/SearchDrawer.tsx:121
 #: src/pages/Index/Build.tsx:13
-#: src/pages/part/PartDetail.tsx:76
+#: src/pages/part/PartDetail.tsx:79
 msgid "Build Orders"
 msgstr ""
 
@@ -393,12 +397,12 @@ msgid "Companies"
 msgstr ""
 
 #: src/components/nav/SearchDrawer.tsx:140
-#: src/pages/part/PartDetail.tsx:103
+#: src/pages/part/PartDetail.tsx:106
 msgid "Purchase Orders"
 msgstr ""
 
 #: src/components/nav/SearchDrawer.tsx:150
-#: src/pages/part/PartDetail.tsx:110
+#: src/pages/part/PartDetail.tsx:113
 msgid "Sales Orders"
 msgstr ""
 
@@ -446,6 +450,58 @@ msgstr ""
 msgid "Shipment"
 msgstr ""
 
+#: src/components/tables/AttachmentTable.tsx:29
+msgid "Attachment"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:46
+msgid "Comment"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:55
+msgid "Uploaded"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:115
+#: src/components/tables/part/PartTable.tsx:203
+#: src/components/tables/stock/StockItemTable.tsx:124
+msgid "Edit"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:130
+#: src/components/tables/part/RelatedPartTable.tsx:97
+#: src/functions/forms.tsx:177
+msgid "Delete"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:156
+msgid "File uploaded"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:157
+msgid "File {0} uploaded successfully"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:168
+msgid "Upload Error"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:169
+msgid "File could not be uploaded"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:182
+msgid "Add attachment"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:201
+msgid "Add external link"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:241
+msgid "Upload attachment"
+msgstr ""
+
 #: src/components/tables/ColumnSelect.tsx:17
 #: src/components/tables/ColumnSelect.tsx:24
 msgid "Select Columns"
@@ -523,41 +579,42 @@ msgstr ""
 msgid "No records found"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:347
+#: src/components/tables/InvenTreeTable.tsx:357
 msgid "Bad request"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:350
+#: src/components/tables/InvenTreeTable.tsx:360
 msgid "Unauthorized"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:353
+#: src/components/tables/InvenTreeTable.tsx:363
 msgid "Forbidden"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:356
+#: src/components/tables/InvenTreeTable.tsx:366
 msgid "Not found"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:405
-#: src/components/tables/InvenTreeTable.tsx:406
+#: src/components/tables/InvenTreeTable.tsx:427
+#: src/components/tables/InvenTreeTable.tsx:428
 msgid "Barcode actions"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:413
-#: src/components/tables/InvenTreeTable.tsx:414
+#: src/components/tables/InvenTreeTable.tsx:435
+#: src/components/tables/InvenTreeTable.tsx:436
 msgid "Print actions"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:431
+#: src/components/tables/InvenTreeTable.tsx:453
 msgid "Refresh data"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:449
+#: src/components/tables/InvenTreeTable.tsx:471
 msgid "Table filters"
 msgstr ""
 
-#: src/components/tables/RowActions.tsx:35
+#: src/components/tables/RowActions.tsx:33
+#: src/components/tables/RowActions.tsx:40
 msgid "Actions"
 msgstr ""
 
@@ -567,12 +624,14 @@ msgstr ""
 
 #: src/components/tables/build/BuildOrderTable.tsx:24
 #: src/components/tables/part/PartTable.tsx:25
+#: src/components/tables/part/RelatedPartTable.tsx:31
 #: src/components/tables/stock/StockItemTable.tsx:22
 msgid "Part"
 msgstr ""
 
 #: src/components/tables/build/BuildOrderTable.tsx:41
 #: src/components/tables/part/PartTable.tsx:51
+#: src/components/tables/part/RelatedPartTable.tsx:49
 #: src/components/tables/stock/StockItemTable.tsx:38
 msgid "Description"
 msgstr ""
@@ -617,7 +676,7 @@ msgstr ""
 #: src/components/tables/part/PartTable.tsx:68
 #: src/components/tables/stock/StockItemTable.tsx:43
 #: src/defaults/links.tsx:27
-#: src/pages/part/PartDetail.tsx:56
+#: src/pages/part/PartDetail.tsx:59
 msgid "Stock"
 msgstr ""
 
@@ -731,15 +790,38 @@ msgstr ""
 msgid "Not Virtual"
 msgstr ""
 
-#: src/components/tables/part/PartTable.tsx:203
-#: src/components/tables/stock/StockItemTable.tsx:124
-msgid "Edit"
-msgstr ""
-
 #: src/components/tables/part/PartTable.tsx:216
 msgid "Detail"
 msgstr ""
 
+#: src/components/tables/part/RelatedPartTable.tsx:61
+msgid "Add Related Part"
+msgstr ""
+
+#: src/components/tables/part/RelatedPartTable.tsx:69
+msgid "Related Part"
+msgstr ""
+
+#: src/components/tables/part/RelatedPartTable.tsx:72
+msgid "Related part added"
+msgstr ""
+
+#: src/components/tables/part/RelatedPartTable.tsx:82
+msgid "Add related part"
+msgstr ""
+
+#: src/components/tables/part/RelatedPartTable.tsx:104
+msgid "Delete Related Part"
+msgstr ""
+
+#: src/components/tables/part/RelatedPartTable.tsx:105
+msgid "Related part deleted"
+msgstr ""
+
+#: src/components/tables/part/RelatedPartTable.tsx:107
+msgid "Are you sure you want to remove this relationship?"
+msgstr ""
+
 #: src/components/tables/stock/StockItemTable.tsx:58
 msgid "Batch"
 msgstr ""
@@ -787,6 +869,18 @@ msgstr ""
 msgid "Getting started"
 msgstr ""
 
+#: src/components/widgets/MarkdownEditor.tsx:109
+msgid "Failed to upload image"
+msgstr ""
+
+#: src/components/widgets/MarkdownEditor.tsx:147
+msgid "Notes saved"
+msgstr ""
+
+#: src/components/widgets/MarkdownEditor.tsx:155
+msgid "Failed to save notes"
+msgstr ""
+
 #: src/components/widgets/WidgetLayout.tsx:180
 msgid "Layout"
 msgstr ""
@@ -1098,8 +1192,48 @@ msgstr ""
 msgid "method parameter not supplied"
 msgstr ""
 
-#: src/functions/forms.tsx:177
-msgid "Delete"
+#: src/functions/forms/AttachmentForms.tsx:57
+msgid "Add File"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:57
+msgid "Add Link"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:58
+msgid "File added"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:58
+msgid "Link added"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:100
+msgid "Edit File"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:100
+msgid "Edit Link"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:101
+msgid "File updated"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:101
+msgid "Link updated"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:127
+msgid "Delete Attachment"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:128
+msgid "Attachment deleted"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:132
+msgid "Are you sure you want to delete this attachment?"
 msgstr ""
 
 #: src/functions/forms/PartForms.tsx:76
@@ -1445,43 +1579,43 @@ msgstr ""
 msgid "Go to the start page"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:50
+#: src/pages/part/PartDetail.tsx:53
 msgid "Details"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:62
+#: src/pages/part/PartDetail.tsx:65
 msgid "Variants"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:69
+#: src/pages/part/PartDetail.tsx:72
 msgid "Bill of Materials"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:83
+#: src/pages/part/PartDetail.tsx:86
 msgid "Used In"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:90
+#: src/pages/part/PartDetail.tsx:93
 msgid "Pricing"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:96
+#: src/pages/part/PartDetail.tsx:99
 msgid "Suppliers"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:117
+#: src/pages/part/PartDetail.tsx:120
 msgid "Test Templates"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:124
+#: src/pages/part/PartDetail.tsx:127
 msgid "Related Parts"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:130
+#: src/pages/part/PartDetail.tsx:133
 msgid "Attachments"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:136
+#: src/pages/part/PartDetail.tsx:139
 msgid "Notes"
 msgstr ""
 
diff --git a/src/frontend/src/locales/fr/messages.po b/src/frontend/src/locales/fr/messages.po
index bd35f06879..5c7c14e4ee 100644
--- a/src/frontend/src/locales/fr/messages.po
+++ b/src/frontend/src/locales/fr/messages.po
@@ -8,7 +8,7 @@ msgstr ""
 "Language: fr\n"
 "Project-Id-Version: inventree\n"
 "Report-Msgid-Bugs-To: \n"
-"PO-Revision-Date: 2023-09-12 00:10\n"
+"PO-Revision-Date: 2023-09-14 01:14\n"
 "Last-Translator: \n"
 "Language-Team: French\n"
 "Plural-Forms: nplurals=2; plural=(n > 1);\n"
@@ -23,6 +23,7 @@ msgid "Title"
 msgstr "Titre"
 
 #: src/components/forms/ApiForm.tsx:189
+#: src/components/widgets/MarkdownEditor.tsx:146
 msgid "Success"
 msgstr ""
 
@@ -158,6 +159,7 @@ msgid "Add Host"
 msgstr "Ajouter un hôte"
 
 #: src/components/forms/HostOptionsForm.tsx:89
+#: src/components/widgets/MarkdownEditor.tsx:73
 msgid "Save"
 msgstr "Enregistrer"
 
@@ -187,7 +189,9 @@ msgstr ""
 
 #: src/components/forms/fields/ApiFormField.tsx:286
 #: src/components/nav/SearchDrawer.tsx:425
-#: src/components/tables/InvenTreeTable.tsx:368
+#: src/components/tables/InvenTreeTable.tsx:378
+#: src/components/widgets/MarkdownEditor.tsx:108
+#: src/components/widgets/MarkdownEditor.tsx:154
 #: src/pages/ErrorPage.tsx:12
 #: src/pages/ErrorPage.tsx:25
 msgid "Error"
@@ -211,7 +215,7 @@ msgid "Read More"
 msgstr "En Savoir Plus"
 
 #: src/components/items/ErrorItem.tsx:5
-#: src/components/tables/InvenTreeTable.tsx:360
+#: src/components/tables/InvenTreeTable.tsx:370
 msgid "Unknown error"
 msgstr "Erreur inconnue"
 
@@ -384,7 +388,7 @@ msgstr "Emplacements de stock"
 
 #: src/components/nav/SearchDrawer.tsx:121
 #: src/pages/Index/Build.tsx:13
-#: src/pages/part/PartDetail.tsx:76
+#: src/pages/part/PartDetail.tsx:79
 msgid "Build Orders"
 msgstr "Ordres de fabrication"
 
@@ -393,12 +397,12 @@ msgid "Companies"
 msgstr "Sociétés"
 
 #: src/components/nav/SearchDrawer.tsx:140
-#: src/pages/part/PartDetail.tsx:103
+#: src/pages/part/PartDetail.tsx:106
 msgid "Purchase Orders"
 msgstr "Ordres d'achat"
 
 #: src/components/nav/SearchDrawer.tsx:150
-#: src/pages/part/PartDetail.tsx:110
+#: src/pages/part/PartDetail.tsx:113
 msgid "Sales Orders"
 msgstr "Ordres de vente"
 
@@ -446,6 +450,58 @@ msgstr ""
 msgid "Shipment"
 msgstr ""
 
+#: src/components/tables/AttachmentTable.tsx:29
+msgid "Attachment"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:46
+msgid "Comment"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:55
+msgid "Uploaded"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:115
+#: src/components/tables/part/PartTable.tsx:203
+#: src/components/tables/stock/StockItemTable.tsx:124
+msgid "Edit"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:130
+#: src/components/tables/part/RelatedPartTable.tsx:97
+#: src/functions/forms.tsx:177
+msgid "Delete"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:156
+msgid "File uploaded"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:157
+msgid "File {0} uploaded successfully"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:168
+msgid "Upload Error"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:169
+msgid "File could not be uploaded"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:182
+msgid "Add attachment"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:201
+msgid "Add external link"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:241
+msgid "Upload attachment"
+msgstr ""
+
 #: src/components/tables/ColumnSelect.tsx:17
 #: src/components/tables/ColumnSelect.tsx:24
 msgid "Select Columns"
@@ -523,41 +579,42 @@ msgstr ""
 msgid "No records found"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:347
+#: src/components/tables/InvenTreeTable.tsx:357
 msgid "Bad request"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:350
+#: src/components/tables/InvenTreeTable.tsx:360
 msgid "Unauthorized"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:353
+#: src/components/tables/InvenTreeTable.tsx:363
 msgid "Forbidden"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:356
+#: src/components/tables/InvenTreeTable.tsx:366
 msgid "Not found"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:405
-#: src/components/tables/InvenTreeTable.tsx:406
+#: src/components/tables/InvenTreeTable.tsx:427
+#: src/components/tables/InvenTreeTable.tsx:428
 msgid "Barcode actions"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:413
-#: src/components/tables/InvenTreeTable.tsx:414
+#: src/components/tables/InvenTreeTable.tsx:435
+#: src/components/tables/InvenTreeTable.tsx:436
 msgid "Print actions"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:431
+#: src/components/tables/InvenTreeTable.tsx:453
 msgid "Refresh data"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:449
+#: src/components/tables/InvenTreeTable.tsx:471
 msgid "Table filters"
 msgstr ""
 
-#: src/components/tables/RowActions.tsx:35
+#: src/components/tables/RowActions.tsx:33
+#: src/components/tables/RowActions.tsx:40
 msgid "Actions"
 msgstr ""
 
@@ -567,12 +624,14 @@ msgstr ""
 
 #: src/components/tables/build/BuildOrderTable.tsx:24
 #: src/components/tables/part/PartTable.tsx:25
+#: src/components/tables/part/RelatedPartTable.tsx:31
 #: src/components/tables/stock/StockItemTable.tsx:22
 msgid "Part"
 msgstr ""
 
 #: src/components/tables/build/BuildOrderTable.tsx:41
 #: src/components/tables/part/PartTable.tsx:51
+#: src/components/tables/part/RelatedPartTable.tsx:49
 #: src/components/tables/stock/StockItemTable.tsx:38
 msgid "Description"
 msgstr ""
@@ -617,7 +676,7 @@ msgstr ""
 #: src/components/tables/part/PartTable.tsx:68
 #: src/components/tables/stock/StockItemTable.tsx:43
 #: src/defaults/links.tsx:27
-#: src/pages/part/PartDetail.tsx:56
+#: src/pages/part/PartDetail.tsx:59
 msgid "Stock"
 msgstr ""
 
@@ -731,15 +790,38 @@ msgstr ""
 msgid "Not Virtual"
 msgstr ""
 
-#: src/components/tables/part/PartTable.tsx:203
-#: src/components/tables/stock/StockItemTable.tsx:124
-msgid "Edit"
-msgstr ""
-
 #: src/components/tables/part/PartTable.tsx:216
 msgid "Detail"
 msgstr ""
 
+#: src/components/tables/part/RelatedPartTable.tsx:61
+msgid "Add Related Part"
+msgstr ""
+
+#: src/components/tables/part/RelatedPartTable.tsx:69
+msgid "Related Part"
+msgstr ""
+
+#: src/components/tables/part/RelatedPartTable.tsx:72
+msgid "Related part added"
+msgstr ""
+
+#: src/components/tables/part/RelatedPartTable.tsx:82
+msgid "Add related part"
+msgstr ""
+
+#: src/components/tables/part/RelatedPartTable.tsx:104
+msgid "Delete Related Part"
+msgstr ""
+
+#: src/components/tables/part/RelatedPartTable.tsx:105
+msgid "Related part deleted"
+msgstr ""
+
+#: src/components/tables/part/RelatedPartTable.tsx:107
+msgid "Are you sure you want to remove this relationship?"
+msgstr ""
+
 #: src/components/tables/stock/StockItemTable.tsx:58
 msgid "Batch"
 msgstr ""
@@ -787,6 +869,18 @@ msgstr ""
 msgid "Getting started"
 msgstr ""
 
+#: src/components/widgets/MarkdownEditor.tsx:109
+msgid "Failed to upload image"
+msgstr ""
+
+#: src/components/widgets/MarkdownEditor.tsx:147
+msgid "Notes saved"
+msgstr ""
+
+#: src/components/widgets/MarkdownEditor.tsx:155
+msgid "Failed to save notes"
+msgstr ""
+
 #: src/components/widgets/WidgetLayout.tsx:180
 msgid "Layout"
 msgstr ""
@@ -1098,8 +1192,48 @@ msgstr ""
 msgid "method parameter not supplied"
 msgstr ""
 
-#: src/functions/forms.tsx:177
-msgid "Delete"
+#: src/functions/forms/AttachmentForms.tsx:57
+msgid "Add File"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:57
+msgid "Add Link"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:58
+msgid "File added"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:58
+msgid "Link added"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:100
+msgid "Edit File"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:100
+msgid "Edit Link"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:101
+msgid "File updated"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:101
+msgid "Link updated"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:127
+msgid "Delete Attachment"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:128
+msgid "Attachment deleted"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:132
+msgid "Are you sure you want to delete this attachment?"
 msgstr ""
 
 #: src/functions/forms/PartForms.tsx:76
@@ -1445,43 +1579,43 @@ msgstr "Désolé, cette page est inconnue ou a été déplacée."
 msgid "Go to the start page"
 msgstr "Aller à la page d'accueil"
 
-#: src/pages/part/PartDetail.tsx:50
+#: src/pages/part/PartDetail.tsx:53
 msgid "Details"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:62
+#: src/pages/part/PartDetail.tsx:65
 msgid "Variants"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:69
+#: src/pages/part/PartDetail.tsx:72
 msgid "Bill of Materials"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:83
+#: src/pages/part/PartDetail.tsx:86
 msgid "Used In"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:90
+#: src/pages/part/PartDetail.tsx:93
 msgid "Pricing"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:96
+#: src/pages/part/PartDetail.tsx:99
 msgid "Suppliers"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:117
+#: src/pages/part/PartDetail.tsx:120
 msgid "Test Templates"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:124
+#: src/pages/part/PartDetail.tsx:127
 msgid "Related Parts"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:130
+#: src/pages/part/PartDetail.tsx:133
 msgid "Attachments"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:136
+#: src/pages/part/PartDetail.tsx:139
 msgid "Notes"
 msgstr ""
 
diff --git a/src/frontend/src/locales/he/messages.po b/src/frontend/src/locales/he/messages.po
index 9bf197fe2e..7d275fea80 100644
--- a/src/frontend/src/locales/he/messages.po
+++ b/src/frontend/src/locales/he/messages.po
@@ -8,7 +8,7 @@ msgstr ""
 "Language: he\n"
 "Project-Id-Version: inventree\n"
 "Report-Msgid-Bugs-To: \n"
-"PO-Revision-Date: 2023-09-12 00:10\n"
+"PO-Revision-Date: 2023-09-14 01:14\n"
 "Last-Translator: \n"
 "Language-Team: Hebrew\n"
 "Plural-Forms: nplurals=4; plural=n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3;\n"
@@ -23,6 +23,7 @@ msgid "Title"
 msgstr ""
 
 #: src/components/forms/ApiForm.tsx:189
+#: src/components/widgets/MarkdownEditor.tsx:146
 msgid "Success"
 msgstr ""
 
@@ -158,6 +159,7 @@ msgid "Add Host"
 msgstr ""
 
 #: src/components/forms/HostOptionsForm.tsx:89
+#: src/components/widgets/MarkdownEditor.tsx:73
 msgid "Save"
 msgstr ""
 
@@ -187,7 +189,9 @@ msgstr ""
 
 #: src/components/forms/fields/ApiFormField.tsx:286
 #: src/components/nav/SearchDrawer.tsx:425
-#: src/components/tables/InvenTreeTable.tsx:368
+#: src/components/tables/InvenTreeTable.tsx:378
+#: src/components/widgets/MarkdownEditor.tsx:108
+#: src/components/widgets/MarkdownEditor.tsx:154
 #: src/pages/ErrorPage.tsx:12
 #: src/pages/ErrorPage.tsx:25
 msgid "Error"
@@ -211,7 +215,7 @@ msgid "Read More"
 msgstr ""
 
 #: src/components/items/ErrorItem.tsx:5
-#: src/components/tables/InvenTreeTable.tsx:360
+#: src/components/tables/InvenTreeTable.tsx:370
 msgid "Unknown error"
 msgstr ""
 
@@ -384,7 +388,7 @@ msgstr ""
 
 #: src/components/nav/SearchDrawer.tsx:121
 #: src/pages/Index/Build.tsx:13
-#: src/pages/part/PartDetail.tsx:76
+#: src/pages/part/PartDetail.tsx:79
 msgid "Build Orders"
 msgstr ""
 
@@ -393,12 +397,12 @@ msgid "Companies"
 msgstr ""
 
 #: src/components/nav/SearchDrawer.tsx:140
-#: src/pages/part/PartDetail.tsx:103
+#: src/pages/part/PartDetail.tsx:106
 msgid "Purchase Orders"
 msgstr ""
 
 #: src/components/nav/SearchDrawer.tsx:150
-#: src/pages/part/PartDetail.tsx:110
+#: src/pages/part/PartDetail.tsx:113
 msgid "Sales Orders"
 msgstr ""
 
@@ -446,6 +450,58 @@ msgstr ""
 msgid "Shipment"
 msgstr ""
 
+#: src/components/tables/AttachmentTable.tsx:29
+msgid "Attachment"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:46
+msgid "Comment"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:55
+msgid "Uploaded"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:115
+#: src/components/tables/part/PartTable.tsx:203
+#: src/components/tables/stock/StockItemTable.tsx:124
+msgid "Edit"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:130
+#: src/components/tables/part/RelatedPartTable.tsx:97
+#: src/functions/forms.tsx:177
+msgid "Delete"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:156
+msgid "File uploaded"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:157
+msgid "File {0} uploaded successfully"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:168
+msgid "Upload Error"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:169
+msgid "File could not be uploaded"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:182
+msgid "Add attachment"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:201
+msgid "Add external link"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:241
+msgid "Upload attachment"
+msgstr ""
+
 #: src/components/tables/ColumnSelect.tsx:17
 #: src/components/tables/ColumnSelect.tsx:24
 msgid "Select Columns"
@@ -523,41 +579,42 @@ msgstr ""
 msgid "No records found"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:347
+#: src/components/tables/InvenTreeTable.tsx:357
 msgid "Bad request"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:350
+#: src/components/tables/InvenTreeTable.tsx:360
 msgid "Unauthorized"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:353
+#: src/components/tables/InvenTreeTable.tsx:363
 msgid "Forbidden"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:356
+#: src/components/tables/InvenTreeTable.tsx:366
 msgid "Not found"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:405
-#: src/components/tables/InvenTreeTable.tsx:406
+#: src/components/tables/InvenTreeTable.tsx:427
+#: src/components/tables/InvenTreeTable.tsx:428
 msgid "Barcode actions"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:413
-#: src/components/tables/InvenTreeTable.tsx:414
+#: src/components/tables/InvenTreeTable.tsx:435
+#: src/components/tables/InvenTreeTable.tsx:436
 msgid "Print actions"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:431
+#: src/components/tables/InvenTreeTable.tsx:453
 msgid "Refresh data"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:449
+#: src/components/tables/InvenTreeTable.tsx:471
 msgid "Table filters"
 msgstr ""
 
-#: src/components/tables/RowActions.tsx:35
+#: src/components/tables/RowActions.tsx:33
+#: src/components/tables/RowActions.tsx:40
 msgid "Actions"
 msgstr ""
 
@@ -567,12 +624,14 @@ msgstr ""
 
 #: src/components/tables/build/BuildOrderTable.tsx:24
 #: src/components/tables/part/PartTable.tsx:25
+#: src/components/tables/part/RelatedPartTable.tsx:31
 #: src/components/tables/stock/StockItemTable.tsx:22
 msgid "Part"
 msgstr ""
 
 #: src/components/tables/build/BuildOrderTable.tsx:41
 #: src/components/tables/part/PartTable.tsx:51
+#: src/components/tables/part/RelatedPartTable.tsx:49
 #: src/components/tables/stock/StockItemTable.tsx:38
 msgid "Description"
 msgstr ""
@@ -617,7 +676,7 @@ msgstr ""
 #: src/components/tables/part/PartTable.tsx:68
 #: src/components/tables/stock/StockItemTable.tsx:43
 #: src/defaults/links.tsx:27
-#: src/pages/part/PartDetail.tsx:56
+#: src/pages/part/PartDetail.tsx:59
 msgid "Stock"
 msgstr ""
 
@@ -731,15 +790,38 @@ msgstr ""
 msgid "Not Virtual"
 msgstr ""
 
-#: src/components/tables/part/PartTable.tsx:203
-#: src/components/tables/stock/StockItemTable.tsx:124
-msgid "Edit"
-msgstr ""
-
 #: src/components/tables/part/PartTable.tsx:216
 msgid "Detail"
 msgstr ""
 
+#: src/components/tables/part/RelatedPartTable.tsx:61
+msgid "Add Related Part"
+msgstr ""
+
+#: src/components/tables/part/RelatedPartTable.tsx:69
+msgid "Related Part"
+msgstr ""
+
+#: src/components/tables/part/RelatedPartTable.tsx:72
+msgid "Related part added"
+msgstr ""
+
+#: src/components/tables/part/RelatedPartTable.tsx:82
+msgid "Add related part"
+msgstr ""
+
+#: src/components/tables/part/RelatedPartTable.tsx:104
+msgid "Delete Related Part"
+msgstr ""
+
+#: src/components/tables/part/RelatedPartTable.tsx:105
+msgid "Related part deleted"
+msgstr ""
+
+#: src/components/tables/part/RelatedPartTable.tsx:107
+msgid "Are you sure you want to remove this relationship?"
+msgstr ""
+
 #: src/components/tables/stock/StockItemTable.tsx:58
 msgid "Batch"
 msgstr ""
@@ -787,6 +869,18 @@ msgstr ""
 msgid "Getting started"
 msgstr ""
 
+#: src/components/widgets/MarkdownEditor.tsx:109
+msgid "Failed to upload image"
+msgstr ""
+
+#: src/components/widgets/MarkdownEditor.tsx:147
+msgid "Notes saved"
+msgstr ""
+
+#: src/components/widgets/MarkdownEditor.tsx:155
+msgid "Failed to save notes"
+msgstr ""
+
 #: src/components/widgets/WidgetLayout.tsx:180
 msgid "Layout"
 msgstr ""
@@ -1098,8 +1192,48 @@ msgstr ""
 msgid "method parameter not supplied"
 msgstr ""
 
-#: src/functions/forms.tsx:177
-msgid "Delete"
+#: src/functions/forms/AttachmentForms.tsx:57
+msgid "Add File"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:57
+msgid "Add Link"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:58
+msgid "File added"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:58
+msgid "Link added"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:100
+msgid "Edit File"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:100
+msgid "Edit Link"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:101
+msgid "File updated"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:101
+msgid "Link updated"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:127
+msgid "Delete Attachment"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:128
+msgid "Attachment deleted"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:132
+msgid "Are you sure you want to delete this attachment?"
 msgstr ""
 
 #: src/functions/forms/PartForms.tsx:76
@@ -1445,43 +1579,43 @@ msgstr ""
 msgid "Go to the start page"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:50
+#: src/pages/part/PartDetail.tsx:53
 msgid "Details"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:62
+#: src/pages/part/PartDetail.tsx:65
 msgid "Variants"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:69
+#: src/pages/part/PartDetail.tsx:72
 msgid "Bill of Materials"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:83
+#: src/pages/part/PartDetail.tsx:86
 msgid "Used In"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:90
+#: src/pages/part/PartDetail.tsx:93
 msgid "Pricing"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:96
+#: src/pages/part/PartDetail.tsx:99
 msgid "Suppliers"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:117
+#: src/pages/part/PartDetail.tsx:120
 msgid "Test Templates"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:124
+#: src/pages/part/PartDetail.tsx:127
 msgid "Related Parts"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:130
+#: src/pages/part/PartDetail.tsx:133
 msgid "Attachments"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:136
+#: src/pages/part/PartDetail.tsx:139
 msgid "Notes"
 msgstr ""
 
diff --git a/src/frontend/src/locales/hi/messages.po b/src/frontend/src/locales/hi/messages.po
index 6cb8dda08f..f7fe148d78 100644
--- a/src/frontend/src/locales/hi/messages.po
+++ b/src/frontend/src/locales/hi/messages.po
@@ -8,7 +8,7 @@ msgstr ""
 "Language: hi\n"
 "Project-Id-Version: inventree\n"
 "Report-Msgid-Bugs-To: \n"
-"PO-Revision-Date: 2023-09-12 00:11\n"
+"PO-Revision-Date: 2023-09-14 01:15\n"
 "Last-Translator: \n"
 "Language-Team: Hindi\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
@@ -23,6 +23,7 @@ msgid "Title"
 msgstr "शीर्षक"
 
 #: src/components/forms/ApiForm.tsx:189
+#: src/components/widgets/MarkdownEditor.tsx:146
 msgid "Success"
 msgstr ""
 
@@ -158,6 +159,7 @@ msgid "Add Host"
 msgstr ""
 
 #: src/components/forms/HostOptionsForm.tsx:89
+#: src/components/widgets/MarkdownEditor.tsx:73
 msgid "Save"
 msgstr "सुरक्षित करें"
 
@@ -187,7 +189,9 @@ msgstr ""
 
 #: src/components/forms/fields/ApiFormField.tsx:286
 #: src/components/nav/SearchDrawer.tsx:425
-#: src/components/tables/InvenTreeTable.tsx:368
+#: src/components/tables/InvenTreeTable.tsx:378
+#: src/components/widgets/MarkdownEditor.tsx:108
+#: src/components/widgets/MarkdownEditor.tsx:154
 #: src/pages/ErrorPage.tsx:12
 #: src/pages/ErrorPage.tsx:25
 msgid "Error"
@@ -211,7 +215,7 @@ msgid "Read More"
 msgstr ""
 
 #: src/components/items/ErrorItem.tsx:5
-#: src/components/tables/InvenTreeTable.tsx:360
+#: src/components/tables/InvenTreeTable.tsx:370
 msgid "Unknown error"
 msgstr ""
 
@@ -384,7 +388,7 @@ msgstr ""
 
 #: src/components/nav/SearchDrawer.tsx:121
 #: src/pages/Index/Build.tsx:13
-#: src/pages/part/PartDetail.tsx:76
+#: src/pages/part/PartDetail.tsx:79
 msgid "Build Orders"
 msgstr ""
 
@@ -393,12 +397,12 @@ msgid "Companies"
 msgstr ""
 
 #: src/components/nav/SearchDrawer.tsx:140
-#: src/pages/part/PartDetail.tsx:103
+#: src/pages/part/PartDetail.tsx:106
 msgid "Purchase Orders"
 msgstr ""
 
 #: src/components/nav/SearchDrawer.tsx:150
-#: src/pages/part/PartDetail.tsx:110
+#: src/pages/part/PartDetail.tsx:113
 msgid "Sales Orders"
 msgstr ""
 
@@ -446,6 +450,58 @@ msgstr ""
 msgid "Shipment"
 msgstr ""
 
+#: src/components/tables/AttachmentTable.tsx:29
+msgid "Attachment"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:46
+msgid "Comment"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:55
+msgid "Uploaded"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:115
+#: src/components/tables/part/PartTable.tsx:203
+#: src/components/tables/stock/StockItemTable.tsx:124
+msgid "Edit"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:130
+#: src/components/tables/part/RelatedPartTable.tsx:97
+#: src/functions/forms.tsx:177
+msgid "Delete"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:156
+msgid "File uploaded"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:157
+msgid "File {0} uploaded successfully"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:168
+msgid "Upload Error"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:169
+msgid "File could not be uploaded"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:182
+msgid "Add attachment"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:201
+msgid "Add external link"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:241
+msgid "Upload attachment"
+msgstr ""
+
 #: src/components/tables/ColumnSelect.tsx:17
 #: src/components/tables/ColumnSelect.tsx:24
 msgid "Select Columns"
@@ -523,41 +579,42 @@ msgstr ""
 msgid "No records found"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:347
+#: src/components/tables/InvenTreeTable.tsx:357
 msgid "Bad request"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:350
+#: src/components/tables/InvenTreeTable.tsx:360
 msgid "Unauthorized"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:353
+#: src/components/tables/InvenTreeTable.tsx:363
 msgid "Forbidden"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:356
+#: src/components/tables/InvenTreeTable.tsx:366
 msgid "Not found"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:405
-#: src/components/tables/InvenTreeTable.tsx:406
+#: src/components/tables/InvenTreeTable.tsx:427
+#: src/components/tables/InvenTreeTable.tsx:428
 msgid "Barcode actions"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:413
-#: src/components/tables/InvenTreeTable.tsx:414
+#: src/components/tables/InvenTreeTable.tsx:435
+#: src/components/tables/InvenTreeTable.tsx:436
 msgid "Print actions"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:431
+#: src/components/tables/InvenTreeTable.tsx:453
 msgid "Refresh data"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:449
+#: src/components/tables/InvenTreeTable.tsx:471
 msgid "Table filters"
 msgstr ""
 
-#: src/components/tables/RowActions.tsx:35
+#: src/components/tables/RowActions.tsx:33
+#: src/components/tables/RowActions.tsx:40
 msgid "Actions"
 msgstr ""
 
@@ -567,12 +624,14 @@ msgstr ""
 
 #: src/components/tables/build/BuildOrderTable.tsx:24
 #: src/components/tables/part/PartTable.tsx:25
+#: src/components/tables/part/RelatedPartTable.tsx:31
 #: src/components/tables/stock/StockItemTable.tsx:22
 msgid "Part"
 msgstr ""
 
 #: src/components/tables/build/BuildOrderTable.tsx:41
 #: src/components/tables/part/PartTable.tsx:51
+#: src/components/tables/part/RelatedPartTable.tsx:49
 #: src/components/tables/stock/StockItemTable.tsx:38
 msgid "Description"
 msgstr ""
@@ -617,7 +676,7 @@ msgstr ""
 #: src/components/tables/part/PartTable.tsx:68
 #: src/components/tables/stock/StockItemTable.tsx:43
 #: src/defaults/links.tsx:27
-#: src/pages/part/PartDetail.tsx:56
+#: src/pages/part/PartDetail.tsx:59
 msgid "Stock"
 msgstr ""
 
@@ -731,15 +790,38 @@ msgstr ""
 msgid "Not Virtual"
 msgstr ""
 
-#: src/components/tables/part/PartTable.tsx:203
-#: src/components/tables/stock/StockItemTable.tsx:124
-msgid "Edit"
-msgstr ""
-
 #: src/components/tables/part/PartTable.tsx:216
 msgid "Detail"
 msgstr ""
 
+#: src/components/tables/part/RelatedPartTable.tsx:61
+msgid "Add Related Part"
+msgstr ""
+
+#: src/components/tables/part/RelatedPartTable.tsx:69
+msgid "Related Part"
+msgstr ""
+
+#: src/components/tables/part/RelatedPartTable.tsx:72
+msgid "Related part added"
+msgstr ""
+
+#: src/components/tables/part/RelatedPartTable.tsx:82
+msgid "Add related part"
+msgstr ""
+
+#: src/components/tables/part/RelatedPartTable.tsx:104
+msgid "Delete Related Part"
+msgstr ""
+
+#: src/components/tables/part/RelatedPartTable.tsx:105
+msgid "Related part deleted"
+msgstr ""
+
+#: src/components/tables/part/RelatedPartTable.tsx:107
+msgid "Are you sure you want to remove this relationship?"
+msgstr ""
+
 #: src/components/tables/stock/StockItemTable.tsx:58
 msgid "Batch"
 msgstr ""
@@ -787,6 +869,18 @@ msgstr ""
 msgid "Getting started"
 msgstr ""
 
+#: src/components/widgets/MarkdownEditor.tsx:109
+msgid "Failed to upload image"
+msgstr ""
+
+#: src/components/widgets/MarkdownEditor.tsx:147
+msgid "Notes saved"
+msgstr ""
+
+#: src/components/widgets/MarkdownEditor.tsx:155
+msgid "Failed to save notes"
+msgstr ""
+
 #: src/components/widgets/WidgetLayout.tsx:180
 msgid "Layout"
 msgstr ""
@@ -1098,8 +1192,48 @@ msgstr ""
 msgid "method parameter not supplied"
 msgstr ""
 
-#: src/functions/forms.tsx:177
-msgid "Delete"
+#: src/functions/forms/AttachmentForms.tsx:57
+msgid "Add File"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:57
+msgid "Add Link"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:58
+msgid "File added"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:58
+msgid "Link added"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:100
+msgid "Edit File"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:100
+msgid "Edit Link"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:101
+msgid "File updated"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:101
+msgid "Link updated"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:127
+msgid "Delete Attachment"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:128
+msgid "Attachment deleted"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:132
+msgid "Are you sure you want to delete this attachment?"
 msgstr ""
 
 #: src/functions/forms/PartForms.tsx:76
@@ -1445,43 +1579,43 @@ msgstr ""
 msgid "Go to the start page"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:50
+#: src/pages/part/PartDetail.tsx:53
 msgid "Details"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:62
+#: src/pages/part/PartDetail.tsx:65
 msgid "Variants"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:69
+#: src/pages/part/PartDetail.tsx:72
 msgid "Bill of Materials"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:83
+#: src/pages/part/PartDetail.tsx:86
 msgid "Used In"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:90
+#: src/pages/part/PartDetail.tsx:93
 msgid "Pricing"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:96
+#: src/pages/part/PartDetail.tsx:99
 msgid "Suppliers"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:117
+#: src/pages/part/PartDetail.tsx:120
 msgid "Test Templates"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:124
+#: src/pages/part/PartDetail.tsx:127
 msgid "Related Parts"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:130
+#: src/pages/part/PartDetail.tsx:133
 msgid "Attachments"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:136
+#: src/pages/part/PartDetail.tsx:139
 msgid "Notes"
 msgstr ""
 
diff --git a/src/frontend/src/locales/hu/messages.po b/src/frontend/src/locales/hu/messages.po
index ab92b29d92..7e7d997a4f 100644
--- a/src/frontend/src/locales/hu/messages.po
+++ b/src/frontend/src/locales/hu/messages.po
@@ -8,7 +8,7 @@ msgstr ""
 "Language: hu\n"
 "Project-Id-Version: inventree\n"
 "Report-Msgid-Bugs-To: \n"
-"PO-Revision-Date: 2023-09-12 00:10\n"
+"PO-Revision-Date: 2023-09-14 01:14\n"
 "Last-Translator: \n"
 "Language-Team: Hungarian\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
@@ -23,6 +23,7 @@ msgid "Title"
 msgstr "Cím"
 
 #: src/components/forms/ApiForm.tsx:189
+#: src/components/widgets/MarkdownEditor.tsx:146
 msgid "Success"
 msgstr ""
 
@@ -158,6 +159,7 @@ msgid "Add Host"
 msgstr "Kiszolgáló hozzáadása"
 
 #: src/components/forms/HostOptionsForm.tsx:89
+#: src/components/widgets/MarkdownEditor.tsx:73
 msgid "Save"
 msgstr "Mentés"
 
@@ -187,7 +189,9 @@ msgstr "Státusz: <0>worker</0> ({0}), <1>plugins</1>{1}"
 
 #: src/components/forms/fields/ApiFormField.tsx:286
 #: src/components/nav/SearchDrawer.tsx:425
-#: src/components/tables/InvenTreeTable.tsx:368
+#: src/components/tables/InvenTreeTable.tsx:378
+#: src/components/widgets/MarkdownEditor.tsx:108
+#: src/components/widgets/MarkdownEditor.tsx:154
 #: src/pages/ErrorPage.tsx:12
 #: src/pages/ErrorPage.tsx:25
 msgid "Error"
@@ -211,7 +215,7 @@ msgid "Read More"
 msgstr "Tudj meg többet"
 
 #: src/components/items/ErrorItem.tsx:5
-#: src/components/tables/InvenTreeTable.tsx:360
+#: src/components/tables/InvenTreeTable.tsx:370
 msgid "Unknown error"
 msgstr "Ismeretlen hiba"
 
@@ -384,7 +388,7 @@ msgstr "Készlethelyek"
 
 #: src/components/nav/SearchDrawer.tsx:121
 #: src/pages/Index/Build.tsx:13
-#: src/pages/part/PartDetail.tsx:76
+#: src/pages/part/PartDetail.tsx:79
 msgid "Build Orders"
 msgstr "Gyártási utasítások"
 
@@ -393,12 +397,12 @@ msgid "Companies"
 msgstr "Cégek"
 
 #: src/components/nav/SearchDrawer.tsx:140
-#: src/pages/part/PartDetail.tsx:103
+#: src/pages/part/PartDetail.tsx:106
 msgid "Purchase Orders"
 msgstr "Beszerzési rendelések"
 
 #: src/components/nav/SearchDrawer.tsx:150
-#: src/pages/part/PartDetail.tsx:110
+#: src/pages/part/PartDetail.tsx:113
 msgid "Sales Orders"
 msgstr "Vevői rendelések"
 
@@ -446,6 +450,58 @@ msgstr ""
 msgid "Shipment"
 msgstr ""
 
+#: src/components/tables/AttachmentTable.tsx:29
+msgid "Attachment"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:46
+msgid "Comment"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:55
+msgid "Uploaded"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:115
+#: src/components/tables/part/PartTable.tsx:203
+#: src/components/tables/stock/StockItemTable.tsx:124
+msgid "Edit"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:130
+#: src/components/tables/part/RelatedPartTable.tsx:97
+#: src/functions/forms.tsx:177
+msgid "Delete"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:156
+msgid "File uploaded"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:157
+msgid "File {0} uploaded successfully"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:168
+msgid "Upload Error"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:169
+msgid "File could not be uploaded"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:182
+msgid "Add attachment"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:201
+msgid "Add external link"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:241
+msgid "Upload attachment"
+msgstr ""
+
 #: src/components/tables/ColumnSelect.tsx:17
 #: src/components/tables/ColumnSelect.tsx:24
 msgid "Select Columns"
@@ -523,41 +579,42 @@ msgstr "Szűrő hozzáadása"
 msgid "No records found"
 msgstr "Nincs találat"
 
-#: src/components/tables/InvenTreeTable.tsx:347
+#: src/components/tables/InvenTreeTable.tsx:357
 msgid "Bad request"
 msgstr "Hibás kérés"
 
-#: src/components/tables/InvenTreeTable.tsx:350
+#: src/components/tables/InvenTreeTable.tsx:360
 msgid "Unauthorized"
 msgstr "Jogosulatlan"
 
-#: src/components/tables/InvenTreeTable.tsx:353
+#: src/components/tables/InvenTreeTable.tsx:363
 msgid "Forbidden"
 msgstr "Tiltott"
 
-#: src/components/tables/InvenTreeTable.tsx:356
+#: src/components/tables/InvenTreeTable.tsx:366
 msgid "Not found"
 msgstr "Nem található"
 
-#: src/components/tables/InvenTreeTable.tsx:405
-#: src/components/tables/InvenTreeTable.tsx:406
+#: src/components/tables/InvenTreeTable.tsx:427
+#: src/components/tables/InvenTreeTable.tsx:428
 msgid "Barcode actions"
 msgstr "Vonalkód műveletek"
 
-#: src/components/tables/InvenTreeTable.tsx:413
-#: src/components/tables/InvenTreeTable.tsx:414
+#: src/components/tables/InvenTreeTable.tsx:435
+#: src/components/tables/InvenTreeTable.tsx:436
 msgid "Print actions"
 msgstr "Nyomtatási műveletek"
 
-#: src/components/tables/InvenTreeTable.tsx:431
+#: src/components/tables/InvenTreeTable.tsx:453
 msgid "Refresh data"
 msgstr "Adatok frissítése"
 
-#: src/components/tables/InvenTreeTable.tsx:449
+#: src/components/tables/InvenTreeTable.tsx:471
 msgid "Table filters"
 msgstr "Táblaszűrők"
 
-#: src/components/tables/RowActions.tsx:35
+#: src/components/tables/RowActions.tsx:33
+#: src/components/tables/RowActions.tsx:40
 msgid "Actions"
 msgstr "Műveletek"
 
@@ -567,12 +624,14 @@ msgstr "Azonosító"
 
 #: src/components/tables/build/BuildOrderTable.tsx:24
 #: src/components/tables/part/PartTable.tsx:25
+#: src/components/tables/part/RelatedPartTable.tsx:31
 #: src/components/tables/stock/StockItemTable.tsx:22
 msgid "Part"
 msgstr "Alkatrész"
 
 #: src/components/tables/build/BuildOrderTable.tsx:41
 #: src/components/tables/part/PartTable.tsx:51
+#: src/components/tables/part/RelatedPartTable.tsx:49
 #: src/components/tables/stock/StockItemTable.tsx:38
 msgid "Description"
 msgstr "Leírás"
@@ -617,7 +676,7 @@ msgstr "Kategória"
 #: src/components/tables/part/PartTable.tsx:68
 #: src/components/tables/stock/StockItemTable.tsx:43
 #: src/defaults/links.tsx:27
-#: src/pages/part/PartDetail.tsx:56
+#: src/pages/part/PartDetail.tsx:59
 msgid "Stock"
 msgstr "Készlet"
 
@@ -731,15 +790,38 @@ msgstr "Szűrés virtuális alkatrészek szerint"
 msgid "Not Virtual"
 msgstr "Nem virtuális"
 
-#: src/components/tables/part/PartTable.tsx:203
-#: src/components/tables/stock/StockItemTable.tsx:124
-msgid "Edit"
-msgstr ""
-
 #: src/components/tables/part/PartTable.tsx:216
 msgid "Detail"
 msgstr ""
 
+#: src/components/tables/part/RelatedPartTable.tsx:61
+msgid "Add Related Part"
+msgstr ""
+
+#: src/components/tables/part/RelatedPartTable.tsx:69
+msgid "Related Part"
+msgstr ""
+
+#: src/components/tables/part/RelatedPartTable.tsx:72
+msgid "Related part added"
+msgstr ""
+
+#: src/components/tables/part/RelatedPartTable.tsx:82
+msgid "Add related part"
+msgstr ""
+
+#: src/components/tables/part/RelatedPartTable.tsx:104
+msgid "Delete Related Part"
+msgstr ""
+
+#: src/components/tables/part/RelatedPartTable.tsx:105
+msgid "Related part deleted"
+msgstr ""
+
+#: src/components/tables/part/RelatedPartTable.tsx:107
+msgid "Are you sure you want to remove this relationship?"
+msgstr ""
+
 #: src/components/tables/stock/StockItemTable.tsx:58
 msgid "Batch"
 msgstr "Batch"
@@ -787,6 +869,18 @@ msgstr "Visszajelzés küldése"
 msgid "Getting started"
 msgstr "Első lépések"
 
+#: src/components/widgets/MarkdownEditor.tsx:109
+msgid "Failed to upload image"
+msgstr ""
+
+#: src/components/widgets/MarkdownEditor.tsx:147
+msgid "Notes saved"
+msgstr ""
+
+#: src/components/widgets/MarkdownEditor.tsx:155
+msgid "Failed to save notes"
+msgstr ""
+
 #: src/components/widgets/WidgetLayout.tsx:180
 msgid "Layout"
 msgstr "Elrendezés"
@@ -1098,8 +1192,48 @@ msgstr ""
 msgid "method parameter not supplied"
 msgstr ""
 
-#: src/functions/forms.tsx:177
-msgid "Delete"
+#: src/functions/forms/AttachmentForms.tsx:57
+msgid "Add File"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:57
+msgid "Add Link"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:58
+msgid "File added"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:58
+msgid "Link added"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:100
+msgid "Edit File"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:100
+msgid "Edit Link"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:101
+msgid "File updated"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:101
+msgid "Link updated"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:127
+msgid "Delete Attachment"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:128
+msgid "Attachment deleted"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:132
+msgid "Are you sure you want to delete this attachment?"
 msgstr ""
 
 #: src/functions/forms/PartForms.tsx:76
@@ -1445,43 +1579,43 @@ msgstr "Elnézést, ez az oldal ismeretlen vagy el lett mozgatva."
 msgid "Go to the start page"
 msgstr "Ugrás a kezdőlapra"
 
-#: src/pages/part/PartDetail.tsx:50
+#: src/pages/part/PartDetail.tsx:53
 msgid "Details"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:62
+#: src/pages/part/PartDetail.tsx:65
 msgid "Variants"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:69
+#: src/pages/part/PartDetail.tsx:72
 msgid "Bill of Materials"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:83
+#: src/pages/part/PartDetail.tsx:86
 msgid "Used In"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:90
+#: src/pages/part/PartDetail.tsx:93
 msgid "Pricing"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:96
+#: src/pages/part/PartDetail.tsx:99
 msgid "Suppliers"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:117
+#: src/pages/part/PartDetail.tsx:120
 msgid "Test Templates"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:124
+#: src/pages/part/PartDetail.tsx:127
 msgid "Related Parts"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:130
+#: src/pages/part/PartDetail.tsx:133
 msgid "Attachments"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:136
+#: src/pages/part/PartDetail.tsx:139
 msgid "Notes"
 msgstr ""
 
diff --git a/src/frontend/src/locales/id/messages.po b/src/frontend/src/locales/id/messages.po
index 6e0a229377..bde8811bc0 100644
--- a/src/frontend/src/locales/id/messages.po
+++ b/src/frontend/src/locales/id/messages.po
@@ -8,7 +8,7 @@ msgstr ""
 "Language: id\n"
 "Project-Id-Version: inventree\n"
 "Report-Msgid-Bugs-To: \n"
-"PO-Revision-Date: 2023-09-12 00:11\n"
+"PO-Revision-Date: 2023-09-14 01:15\n"
 "Last-Translator: \n"
 "Language-Team: Indonesian\n"
 "Plural-Forms: nplurals=1; plural=0;\n"
@@ -23,6 +23,7 @@ msgid "Title"
 msgstr ""
 
 #: src/components/forms/ApiForm.tsx:189
+#: src/components/widgets/MarkdownEditor.tsx:146
 msgid "Success"
 msgstr ""
 
@@ -158,6 +159,7 @@ msgid "Add Host"
 msgstr ""
 
 #: src/components/forms/HostOptionsForm.tsx:89
+#: src/components/widgets/MarkdownEditor.tsx:73
 msgid "Save"
 msgstr ""
 
@@ -187,7 +189,9 @@ msgstr ""
 
 #: src/components/forms/fields/ApiFormField.tsx:286
 #: src/components/nav/SearchDrawer.tsx:425
-#: src/components/tables/InvenTreeTable.tsx:368
+#: src/components/tables/InvenTreeTable.tsx:378
+#: src/components/widgets/MarkdownEditor.tsx:108
+#: src/components/widgets/MarkdownEditor.tsx:154
 #: src/pages/ErrorPage.tsx:12
 #: src/pages/ErrorPage.tsx:25
 msgid "Error"
@@ -211,7 +215,7 @@ msgid "Read More"
 msgstr ""
 
 #: src/components/items/ErrorItem.tsx:5
-#: src/components/tables/InvenTreeTable.tsx:360
+#: src/components/tables/InvenTreeTable.tsx:370
 msgid "Unknown error"
 msgstr ""
 
@@ -384,7 +388,7 @@ msgstr ""
 
 #: src/components/nav/SearchDrawer.tsx:121
 #: src/pages/Index/Build.tsx:13
-#: src/pages/part/PartDetail.tsx:76
+#: src/pages/part/PartDetail.tsx:79
 msgid "Build Orders"
 msgstr ""
 
@@ -393,12 +397,12 @@ msgid "Companies"
 msgstr ""
 
 #: src/components/nav/SearchDrawer.tsx:140
-#: src/pages/part/PartDetail.tsx:103
+#: src/pages/part/PartDetail.tsx:106
 msgid "Purchase Orders"
 msgstr ""
 
 #: src/components/nav/SearchDrawer.tsx:150
-#: src/pages/part/PartDetail.tsx:110
+#: src/pages/part/PartDetail.tsx:113
 msgid "Sales Orders"
 msgstr ""
 
@@ -446,6 +450,58 @@ msgstr ""
 msgid "Shipment"
 msgstr ""
 
+#: src/components/tables/AttachmentTable.tsx:29
+msgid "Attachment"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:46
+msgid "Comment"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:55
+msgid "Uploaded"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:115
+#: src/components/tables/part/PartTable.tsx:203
+#: src/components/tables/stock/StockItemTable.tsx:124
+msgid "Edit"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:130
+#: src/components/tables/part/RelatedPartTable.tsx:97
+#: src/functions/forms.tsx:177
+msgid "Delete"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:156
+msgid "File uploaded"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:157
+msgid "File {0} uploaded successfully"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:168
+msgid "Upload Error"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:169
+msgid "File could not be uploaded"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:182
+msgid "Add attachment"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:201
+msgid "Add external link"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:241
+msgid "Upload attachment"
+msgstr ""
+
 #: src/components/tables/ColumnSelect.tsx:17
 #: src/components/tables/ColumnSelect.tsx:24
 msgid "Select Columns"
@@ -523,41 +579,42 @@ msgstr ""
 msgid "No records found"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:347
+#: src/components/tables/InvenTreeTable.tsx:357
 msgid "Bad request"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:350
+#: src/components/tables/InvenTreeTable.tsx:360
 msgid "Unauthorized"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:353
+#: src/components/tables/InvenTreeTable.tsx:363
 msgid "Forbidden"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:356
+#: src/components/tables/InvenTreeTable.tsx:366
 msgid "Not found"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:405
-#: src/components/tables/InvenTreeTable.tsx:406
+#: src/components/tables/InvenTreeTable.tsx:427
+#: src/components/tables/InvenTreeTable.tsx:428
 msgid "Barcode actions"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:413
-#: src/components/tables/InvenTreeTable.tsx:414
+#: src/components/tables/InvenTreeTable.tsx:435
+#: src/components/tables/InvenTreeTable.tsx:436
 msgid "Print actions"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:431
+#: src/components/tables/InvenTreeTable.tsx:453
 msgid "Refresh data"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:449
+#: src/components/tables/InvenTreeTable.tsx:471
 msgid "Table filters"
 msgstr ""
 
-#: src/components/tables/RowActions.tsx:35
+#: src/components/tables/RowActions.tsx:33
+#: src/components/tables/RowActions.tsx:40
 msgid "Actions"
 msgstr ""
 
@@ -567,12 +624,14 @@ msgstr ""
 
 #: src/components/tables/build/BuildOrderTable.tsx:24
 #: src/components/tables/part/PartTable.tsx:25
+#: src/components/tables/part/RelatedPartTable.tsx:31
 #: src/components/tables/stock/StockItemTable.tsx:22
 msgid "Part"
 msgstr ""
 
 #: src/components/tables/build/BuildOrderTable.tsx:41
 #: src/components/tables/part/PartTable.tsx:51
+#: src/components/tables/part/RelatedPartTable.tsx:49
 #: src/components/tables/stock/StockItemTable.tsx:38
 msgid "Description"
 msgstr ""
@@ -617,7 +676,7 @@ msgstr ""
 #: src/components/tables/part/PartTable.tsx:68
 #: src/components/tables/stock/StockItemTable.tsx:43
 #: src/defaults/links.tsx:27
-#: src/pages/part/PartDetail.tsx:56
+#: src/pages/part/PartDetail.tsx:59
 msgid "Stock"
 msgstr ""
 
@@ -731,15 +790,38 @@ msgstr ""
 msgid "Not Virtual"
 msgstr ""
 
-#: src/components/tables/part/PartTable.tsx:203
-#: src/components/tables/stock/StockItemTable.tsx:124
-msgid "Edit"
-msgstr ""
-
 #: src/components/tables/part/PartTable.tsx:216
 msgid "Detail"
 msgstr ""
 
+#: src/components/tables/part/RelatedPartTable.tsx:61
+msgid "Add Related Part"
+msgstr ""
+
+#: src/components/tables/part/RelatedPartTable.tsx:69
+msgid "Related Part"
+msgstr ""
+
+#: src/components/tables/part/RelatedPartTable.tsx:72
+msgid "Related part added"
+msgstr ""
+
+#: src/components/tables/part/RelatedPartTable.tsx:82
+msgid "Add related part"
+msgstr ""
+
+#: src/components/tables/part/RelatedPartTable.tsx:104
+msgid "Delete Related Part"
+msgstr ""
+
+#: src/components/tables/part/RelatedPartTable.tsx:105
+msgid "Related part deleted"
+msgstr ""
+
+#: src/components/tables/part/RelatedPartTable.tsx:107
+msgid "Are you sure you want to remove this relationship?"
+msgstr ""
+
 #: src/components/tables/stock/StockItemTable.tsx:58
 msgid "Batch"
 msgstr ""
@@ -787,6 +869,18 @@ msgstr ""
 msgid "Getting started"
 msgstr ""
 
+#: src/components/widgets/MarkdownEditor.tsx:109
+msgid "Failed to upload image"
+msgstr ""
+
+#: src/components/widgets/MarkdownEditor.tsx:147
+msgid "Notes saved"
+msgstr ""
+
+#: src/components/widgets/MarkdownEditor.tsx:155
+msgid "Failed to save notes"
+msgstr ""
+
 #: src/components/widgets/WidgetLayout.tsx:180
 msgid "Layout"
 msgstr ""
@@ -1098,8 +1192,48 @@ msgstr ""
 msgid "method parameter not supplied"
 msgstr ""
 
-#: src/functions/forms.tsx:177
-msgid "Delete"
+#: src/functions/forms/AttachmentForms.tsx:57
+msgid "Add File"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:57
+msgid "Add Link"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:58
+msgid "File added"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:58
+msgid "Link added"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:100
+msgid "Edit File"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:100
+msgid "Edit Link"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:101
+msgid "File updated"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:101
+msgid "Link updated"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:127
+msgid "Delete Attachment"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:128
+msgid "Attachment deleted"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:132
+msgid "Are you sure you want to delete this attachment?"
 msgstr ""
 
 #: src/functions/forms/PartForms.tsx:76
@@ -1445,43 +1579,43 @@ msgstr ""
 msgid "Go to the start page"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:50
+#: src/pages/part/PartDetail.tsx:53
 msgid "Details"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:62
+#: src/pages/part/PartDetail.tsx:65
 msgid "Variants"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:69
+#: src/pages/part/PartDetail.tsx:72
 msgid "Bill of Materials"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:83
+#: src/pages/part/PartDetail.tsx:86
 msgid "Used In"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:90
+#: src/pages/part/PartDetail.tsx:93
 msgid "Pricing"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:96
+#: src/pages/part/PartDetail.tsx:99
 msgid "Suppliers"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:117
+#: src/pages/part/PartDetail.tsx:120
 msgid "Test Templates"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:124
+#: src/pages/part/PartDetail.tsx:127
 msgid "Related Parts"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:130
+#: src/pages/part/PartDetail.tsx:133
 msgid "Attachments"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:136
+#: src/pages/part/PartDetail.tsx:139
 msgid "Notes"
 msgstr ""
 
diff --git a/src/frontend/src/locales/it/messages.po b/src/frontend/src/locales/it/messages.po
index 2cfdff40a1..e97a495bc5 100644
--- a/src/frontend/src/locales/it/messages.po
+++ b/src/frontend/src/locales/it/messages.po
@@ -8,7 +8,7 @@ msgstr ""
 "Language: it\n"
 "Project-Id-Version: inventree\n"
 "Report-Msgid-Bugs-To: \n"
-"PO-Revision-Date: 2023-09-12 00:10\n"
+"PO-Revision-Date: 2023-09-14 01:14\n"
 "Last-Translator: \n"
 "Language-Team: Italian\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
@@ -23,6 +23,7 @@ msgid "Title"
 msgstr ""
 
 #: src/components/forms/ApiForm.tsx:189
+#: src/components/widgets/MarkdownEditor.tsx:146
 msgid "Success"
 msgstr ""
 
@@ -158,6 +159,7 @@ msgid "Add Host"
 msgstr ""
 
 #: src/components/forms/HostOptionsForm.tsx:89
+#: src/components/widgets/MarkdownEditor.tsx:73
 msgid "Save"
 msgstr ""
 
@@ -187,7 +189,9 @@ msgstr ""
 
 #: src/components/forms/fields/ApiFormField.tsx:286
 #: src/components/nav/SearchDrawer.tsx:425
-#: src/components/tables/InvenTreeTable.tsx:368
+#: src/components/tables/InvenTreeTable.tsx:378
+#: src/components/widgets/MarkdownEditor.tsx:108
+#: src/components/widgets/MarkdownEditor.tsx:154
 #: src/pages/ErrorPage.tsx:12
 #: src/pages/ErrorPage.tsx:25
 msgid "Error"
@@ -211,7 +215,7 @@ msgid "Read More"
 msgstr ""
 
 #: src/components/items/ErrorItem.tsx:5
-#: src/components/tables/InvenTreeTable.tsx:360
+#: src/components/tables/InvenTreeTable.tsx:370
 msgid "Unknown error"
 msgstr ""
 
@@ -384,7 +388,7 @@ msgstr ""
 
 #: src/components/nav/SearchDrawer.tsx:121
 #: src/pages/Index/Build.tsx:13
-#: src/pages/part/PartDetail.tsx:76
+#: src/pages/part/PartDetail.tsx:79
 msgid "Build Orders"
 msgstr ""
 
@@ -393,12 +397,12 @@ msgid "Companies"
 msgstr ""
 
 #: src/components/nav/SearchDrawer.tsx:140
-#: src/pages/part/PartDetail.tsx:103
+#: src/pages/part/PartDetail.tsx:106
 msgid "Purchase Orders"
 msgstr ""
 
 #: src/components/nav/SearchDrawer.tsx:150
-#: src/pages/part/PartDetail.tsx:110
+#: src/pages/part/PartDetail.tsx:113
 msgid "Sales Orders"
 msgstr ""
 
@@ -446,6 +450,58 @@ msgstr ""
 msgid "Shipment"
 msgstr ""
 
+#: src/components/tables/AttachmentTable.tsx:29
+msgid "Attachment"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:46
+msgid "Comment"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:55
+msgid "Uploaded"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:115
+#: src/components/tables/part/PartTable.tsx:203
+#: src/components/tables/stock/StockItemTable.tsx:124
+msgid "Edit"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:130
+#: src/components/tables/part/RelatedPartTable.tsx:97
+#: src/functions/forms.tsx:177
+msgid "Delete"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:156
+msgid "File uploaded"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:157
+msgid "File {0} uploaded successfully"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:168
+msgid "Upload Error"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:169
+msgid "File could not be uploaded"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:182
+msgid "Add attachment"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:201
+msgid "Add external link"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:241
+msgid "Upload attachment"
+msgstr ""
+
 #: src/components/tables/ColumnSelect.tsx:17
 #: src/components/tables/ColumnSelect.tsx:24
 msgid "Select Columns"
@@ -523,41 +579,42 @@ msgstr ""
 msgid "No records found"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:347
+#: src/components/tables/InvenTreeTable.tsx:357
 msgid "Bad request"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:350
+#: src/components/tables/InvenTreeTable.tsx:360
 msgid "Unauthorized"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:353
+#: src/components/tables/InvenTreeTable.tsx:363
 msgid "Forbidden"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:356
+#: src/components/tables/InvenTreeTable.tsx:366
 msgid "Not found"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:405
-#: src/components/tables/InvenTreeTable.tsx:406
+#: src/components/tables/InvenTreeTable.tsx:427
+#: src/components/tables/InvenTreeTable.tsx:428
 msgid "Barcode actions"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:413
-#: src/components/tables/InvenTreeTable.tsx:414
+#: src/components/tables/InvenTreeTable.tsx:435
+#: src/components/tables/InvenTreeTable.tsx:436
 msgid "Print actions"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:431
+#: src/components/tables/InvenTreeTable.tsx:453
 msgid "Refresh data"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:449
+#: src/components/tables/InvenTreeTable.tsx:471
 msgid "Table filters"
 msgstr ""
 
-#: src/components/tables/RowActions.tsx:35
+#: src/components/tables/RowActions.tsx:33
+#: src/components/tables/RowActions.tsx:40
 msgid "Actions"
 msgstr ""
 
@@ -567,12 +624,14 @@ msgstr ""
 
 #: src/components/tables/build/BuildOrderTable.tsx:24
 #: src/components/tables/part/PartTable.tsx:25
+#: src/components/tables/part/RelatedPartTable.tsx:31
 #: src/components/tables/stock/StockItemTable.tsx:22
 msgid "Part"
 msgstr ""
 
 #: src/components/tables/build/BuildOrderTable.tsx:41
 #: src/components/tables/part/PartTable.tsx:51
+#: src/components/tables/part/RelatedPartTable.tsx:49
 #: src/components/tables/stock/StockItemTable.tsx:38
 msgid "Description"
 msgstr ""
@@ -617,7 +676,7 @@ msgstr ""
 #: src/components/tables/part/PartTable.tsx:68
 #: src/components/tables/stock/StockItemTable.tsx:43
 #: src/defaults/links.tsx:27
-#: src/pages/part/PartDetail.tsx:56
+#: src/pages/part/PartDetail.tsx:59
 msgid "Stock"
 msgstr ""
 
@@ -731,15 +790,38 @@ msgstr ""
 msgid "Not Virtual"
 msgstr ""
 
-#: src/components/tables/part/PartTable.tsx:203
-#: src/components/tables/stock/StockItemTable.tsx:124
-msgid "Edit"
-msgstr ""
-
 #: src/components/tables/part/PartTable.tsx:216
 msgid "Detail"
 msgstr ""
 
+#: src/components/tables/part/RelatedPartTable.tsx:61
+msgid "Add Related Part"
+msgstr ""
+
+#: src/components/tables/part/RelatedPartTable.tsx:69
+msgid "Related Part"
+msgstr ""
+
+#: src/components/tables/part/RelatedPartTable.tsx:72
+msgid "Related part added"
+msgstr ""
+
+#: src/components/tables/part/RelatedPartTable.tsx:82
+msgid "Add related part"
+msgstr ""
+
+#: src/components/tables/part/RelatedPartTable.tsx:104
+msgid "Delete Related Part"
+msgstr ""
+
+#: src/components/tables/part/RelatedPartTable.tsx:105
+msgid "Related part deleted"
+msgstr ""
+
+#: src/components/tables/part/RelatedPartTable.tsx:107
+msgid "Are you sure you want to remove this relationship?"
+msgstr ""
+
 #: src/components/tables/stock/StockItemTable.tsx:58
 msgid "Batch"
 msgstr ""
@@ -787,6 +869,18 @@ msgstr ""
 msgid "Getting started"
 msgstr ""
 
+#: src/components/widgets/MarkdownEditor.tsx:109
+msgid "Failed to upload image"
+msgstr ""
+
+#: src/components/widgets/MarkdownEditor.tsx:147
+msgid "Notes saved"
+msgstr ""
+
+#: src/components/widgets/MarkdownEditor.tsx:155
+msgid "Failed to save notes"
+msgstr ""
+
 #: src/components/widgets/WidgetLayout.tsx:180
 msgid "Layout"
 msgstr ""
@@ -1098,8 +1192,48 @@ msgstr ""
 msgid "method parameter not supplied"
 msgstr ""
 
-#: src/functions/forms.tsx:177
-msgid "Delete"
+#: src/functions/forms/AttachmentForms.tsx:57
+msgid "Add File"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:57
+msgid "Add Link"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:58
+msgid "File added"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:58
+msgid "Link added"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:100
+msgid "Edit File"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:100
+msgid "Edit Link"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:101
+msgid "File updated"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:101
+msgid "Link updated"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:127
+msgid "Delete Attachment"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:128
+msgid "Attachment deleted"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:132
+msgid "Are you sure you want to delete this attachment?"
 msgstr ""
 
 #: src/functions/forms/PartForms.tsx:76
@@ -1445,43 +1579,43 @@ msgstr ""
 msgid "Go to the start page"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:50
+#: src/pages/part/PartDetail.tsx:53
 msgid "Details"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:62
+#: src/pages/part/PartDetail.tsx:65
 msgid "Variants"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:69
+#: src/pages/part/PartDetail.tsx:72
 msgid "Bill of Materials"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:83
+#: src/pages/part/PartDetail.tsx:86
 msgid "Used In"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:90
+#: src/pages/part/PartDetail.tsx:93
 msgid "Pricing"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:96
+#: src/pages/part/PartDetail.tsx:99
 msgid "Suppliers"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:117
+#: src/pages/part/PartDetail.tsx:120
 msgid "Test Templates"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:124
+#: src/pages/part/PartDetail.tsx:127
 msgid "Related Parts"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:130
+#: src/pages/part/PartDetail.tsx:133
 msgid "Attachments"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:136
+#: src/pages/part/PartDetail.tsx:139
 msgid "Notes"
 msgstr ""
 
diff --git a/src/frontend/src/locales/ja/messages.po b/src/frontend/src/locales/ja/messages.po
index a5dc825489..a91f19d4e3 100644
--- a/src/frontend/src/locales/ja/messages.po
+++ b/src/frontend/src/locales/ja/messages.po
@@ -8,7 +8,7 @@ msgstr ""
 "Language: ja\n"
 "Project-Id-Version: inventree\n"
 "Report-Msgid-Bugs-To: \n"
-"PO-Revision-Date: 2023-09-12 00:10\n"
+"PO-Revision-Date: 2023-09-14 01:14\n"
 "Last-Translator: \n"
 "Language-Team: Japanese\n"
 "Plural-Forms: nplurals=1; plural=0;\n"
@@ -23,6 +23,7 @@ msgid "Title"
 msgstr ""
 
 #: src/components/forms/ApiForm.tsx:189
+#: src/components/widgets/MarkdownEditor.tsx:146
 msgid "Success"
 msgstr ""
 
@@ -158,6 +159,7 @@ msgid "Add Host"
 msgstr ""
 
 #: src/components/forms/HostOptionsForm.tsx:89
+#: src/components/widgets/MarkdownEditor.tsx:73
 msgid "Save"
 msgstr ""
 
@@ -187,7 +189,9 @@ msgstr ""
 
 #: src/components/forms/fields/ApiFormField.tsx:286
 #: src/components/nav/SearchDrawer.tsx:425
-#: src/components/tables/InvenTreeTable.tsx:368
+#: src/components/tables/InvenTreeTable.tsx:378
+#: src/components/widgets/MarkdownEditor.tsx:108
+#: src/components/widgets/MarkdownEditor.tsx:154
 #: src/pages/ErrorPage.tsx:12
 #: src/pages/ErrorPage.tsx:25
 msgid "Error"
@@ -211,7 +215,7 @@ msgid "Read More"
 msgstr ""
 
 #: src/components/items/ErrorItem.tsx:5
-#: src/components/tables/InvenTreeTable.tsx:360
+#: src/components/tables/InvenTreeTable.tsx:370
 msgid "Unknown error"
 msgstr ""
 
@@ -384,7 +388,7 @@ msgstr ""
 
 #: src/components/nav/SearchDrawer.tsx:121
 #: src/pages/Index/Build.tsx:13
-#: src/pages/part/PartDetail.tsx:76
+#: src/pages/part/PartDetail.tsx:79
 msgid "Build Orders"
 msgstr ""
 
@@ -393,12 +397,12 @@ msgid "Companies"
 msgstr ""
 
 #: src/components/nav/SearchDrawer.tsx:140
-#: src/pages/part/PartDetail.tsx:103
+#: src/pages/part/PartDetail.tsx:106
 msgid "Purchase Orders"
 msgstr ""
 
 #: src/components/nav/SearchDrawer.tsx:150
-#: src/pages/part/PartDetail.tsx:110
+#: src/pages/part/PartDetail.tsx:113
 msgid "Sales Orders"
 msgstr ""
 
@@ -446,6 +450,58 @@ msgstr ""
 msgid "Shipment"
 msgstr ""
 
+#: src/components/tables/AttachmentTable.tsx:29
+msgid "Attachment"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:46
+msgid "Comment"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:55
+msgid "Uploaded"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:115
+#: src/components/tables/part/PartTable.tsx:203
+#: src/components/tables/stock/StockItemTable.tsx:124
+msgid "Edit"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:130
+#: src/components/tables/part/RelatedPartTable.tsx:97
+#: src/functions/forms.tsx:177
+msgid "Delete"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:156
+msgid "File uploaded"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:157
+msgid "File {0} uploaded successfully"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:168
+msgid "Upload Error"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:169
+msgid "File could not be uploaded"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:182
+msgid "Add attachment"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:201
+msgid "Add external link"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:241
+msgid "Upload attachment"
+msgstr ""
+
 #: src/components/tables/ColumnSelect.tsx:17
 #: src/components/tables/ColumnSelect.tsx:24
 msgid "Select Columns"
@@ -523,41 +579,42 @@ msgstr ""
 msgid "No records found"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:347
+#: src/components/tables/InvenTreeTable.tsx:357
 msgid "Bad request"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:350
+#: src/components/tables/InvenTreeTable.tsx:360
 msgid "Unauthorized"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:353
+#: src/components/tables/InvenTreeTable.tsx:363
 msgid "Forbidden"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:356
+#: src/components/tables/InvenTreeTable.tsx:366
 msgid "Not found"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:405
-#: src/components/tables/InvenTreeTable.tsx:406
+#: src/components/tables/InvenTreeTable.tsx:427
+#: src/components/tables/InvenTreeTable.tsx:428
 msgid "Barcode actions"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:413
-#: src/components/tables/InvenTreeTable.tsx:414
+#: src/components/tables/InvenTreeTable.tsx:435
+#: src/components/tables/InvenTreeTable.tsx:436
 msgid "Print actions"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:431
+#: src/components/tables/InvenTreeTable.tsx:453
 msgid "Refresh data"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:449
+#: src/components/tables/InvenTreeTable.tsx:471
 msgid "Table filters"
 msgstr ""
 
-#: src/components/tables/RowActions.tsx:35
+#: src/components/tables/RowActions.tsx:33
+#: src/components/tables/RowActions.tsx:40
 msgid "Actions"
 msgstr ""
 
@@ -567,12 +624,14 @@ msgstr ""
 
 #: src/components/tables/build/BuildOrderTable.tsx:24
 #: src/components/tables/part/PartTable.tsx:25
+#: src/components/tables/part/RelatedPartTable.tsx:31
 #: src/components/tables/stock/StockItemTable.tsx:22
 msgid "Part"
 msgstr ""
 
 #: src/components/tables/build/BuildOrderTable.tsx:41
 #: src/components/tables/part/PartTable.tsx:51
+#: src/components/tables/part/RelatedPartTable.tsx:49
 #: src/components/tables/stock/StockItemTable.tsx:38
 msgid "Description"
 msgstr ""
@@ -617,7 +676,7 @@ msgstr ""
 #: src/components/tables/part/PartTable.tsx:68
 #: src/components/tables/stock/StockItemTable.tsx:43
 #: src/defaults/links.tsx:27
-#: src/pages/part/PartDetail.tsx:56
+#: src/pages/part/PartDetail.tsx:59
 msgid "Stock"
 msgstr ""
 
@@ -731,15 +790,38 @@ msgstr ""
 msgid "Not Virtual"
 msgstr ""
 
-#: src/components/tables/part/PartTable.tsx:203
-#: src/components/tables/stock/StockItemTable.tsx:124
-msgid "Edit"
-msgstr ""
-
 #: src/components/tables/part/PartTable.tsx:216
 msgid "Detail"
 msgstr ""
 
+#: src/components/tables/part/RelatedPartTable.tsx:61
+msgid "Add Related Part"
+msgstr ""
+
+#: src/components/tables/part/RelatedPartTable.tsx:69
+msgid "Related Part"
+msgstr ""
+
+#: src/components/tables/part/RelatedPartTable.tsx:72
+msgid "Related part added"
+msgstr ""
+
+#: src/components/tables/part/RelatedPartTable.tsx:82
+msgid "Add related part"
+msgstr ""
+
+#: src/components/tables/part/RelatedPartTable.tsx:104
+msgid "Delete Related Part"
+msgstr ""
+
+#: src/components/tables/part/RelatedPartTable.tsx:105
+msgid "Related part deleted"
+msgstr ""
+
+#: src/components/tables/part/RelatedPartTable.tsx:107
+msgid "Are you sure you want to remove this relationship?"
+msgstr ""
+
 #: src/components/tables/stock/StockItemTable.tsx:58
 msgid "Batch"
 msgstr ""
@@ -787,6 +869,18 @@ msgstr ""
 msgid "Getting started"
 msgstr ""
 
+#: src/components/widgets/MarkdownEditor.tsx:109
+msgid "Failed to upload image"
+msgstr ""
+
+#: src/components/widgets/MarkdownEditor.tsx:147
+msgid "Notes saved"
+msgstr ""
+
+#: src/components/widgets/MarkdownEditor.tsx:155
+msgid "Failed to save notes"
+msgstr ""
+
 #: src/components/widgets/WidgetLayout.tsx:180
 msgid "Layout"
 msgstr ""
@@ -1098,8 +1192,48 @@ msgstr ""
 msgid "method parameter not supplied"
 msgstr ""
 
-#: src/functions/forms.tsx:177
-msgid "Delete"
+#: src/functions/forms/AttachmentForms.tsx:57
+msgid "Add File"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:57
+msgid "Add Link"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:58
+msgid "File added"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:58
+msgid "Link added"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:100
+msgid "Edit File"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:100
+msgid "Edit Link"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:101
+msgid "File updated"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:101
+msgid "Link updated"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:127
+msgid "Delete Attachment"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:128
+msgid "Attachment deleted"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:132
+msgid "Are you sure you want to delete this attachment?"
 msgstr ""
 
 #: src/functions/forms/PartForms.tsx:76
@@ -1445,43 +1579,43 @@ msgstr ""
 msgid "Go to the start page"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:50
+#: src/pages/part/PartDetail.tsx:53
 msgid "Details"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:62
+#: src/pages/part/PartDetail.tsx:65
 msgid "Variants"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:69
+#: src/pages/part/PartDetail.tsx:72
 msgid "Bill of Materials"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:83
+#: src/pages/part/PartDetail.tsx:86
 msgid "Used In"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:90
+#: src/pages/part/PartDetail.tsx:93
 msgid "Pricing"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:96
+#: src/pages/part/PartDetail.tsx:99
 msgid "Suppliers"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:117
+#: src/pages/part/PartDetail.tsx:120
 msgid "Test Templates"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:124
+#: src/pages/part/PartDetail.tsx:127
 msgid "Related Parts"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:130
+#: src/pages/part/PartDetail.tsx:133
 msgid "Attachments"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:136
+#: src/pages/part/PartDetail.tsx:139
 msgid "Notes"
 msgstr ""
 
diff --git a/src/frontend/src/locales/ko/messages.po b/src/frontend/src/locales/ko/messages.po
index 37b7e967b1..0d66fa7367 100644
--- a/src/frontend/src/locales/ko/messages.po
+++ b/src/frontend/src/locales/ko/messages.po
@@ -8,7 +8,7 @@ msgstr ""
 "Language: ko\n"
 "Project-Id-Version: inventree\n"
 "Report-Msgid-Bugs-To: \n"
-"PO-Revision-Date: 2023-09-12 00:10\n"
+"PO-Revision-Date: 2023-09-14 01:14\n"
 "Last-Translator: \n"
 "Language-Team: Korean\n"
 "Plural-Forms: nplurals=1; plural=0;\n"
@@ -23,6 +23,7 @@ msgid "Title"
 msgstr ""
 
 #: src/components/forms/ApiForm.tsx:189
+#: src/components/widgets/MarkdownEditor.tsx:146
 msgid "Success"
 msgstr ""
 
@@ -158,6 +159,7 @@ msgid "Add Host"
 msgstr ""
 
 #: src/components/forms/HostOptionsForm.tsx:89
+#: src/components/widgets/MarkdownEditor.tsx:73
 msgid "Save"
 msgstr ""
 
@@ -187,7 +189,9 @@ msgstr ""
 
 #: src/components/forms/fields/ApiFormField.tsx:286
 #: src/components/nav/SearchDrawer.tsx:425
-#: src/components/tables/InvenTreeTable.tsx:368
+#: src/components/tables/InvenTreeTable.tsx:378
+#: src/components/widgets/MarkdownEditor.tsx:108
+#: src/components/widgets/MarkdownEditor.tsx:154
 #: src/pages/ErrorPage.tsx:12
 #: src/pages/ErrorPage.tsx:25
 msgid "Error"
@@ -211,7 +215,7 @@ msgid "Read More"
 msgstr ""
 
 #: src/components/items/ErrorItem.tsx:5
-#: src/components/tables/InvenTreeTable.tsx:360
+#: src/components/tables/InvenTreeTable.tsx:370
 msgid "Unknown error"
 msgstr ""
 
@@ -384,7 +388,7 @@ msgstr ""
 
 #: src/components/nav/SearchDrawer.tsx:121
 #: src/pages/Index/Build.tsx:13
-#: src/pages/part/PartDetail.tsx:76
+#: src/pages/part/PartDetail.tsx:79
 msgid "Build Orders"
 msgstr ""
 
@@ -393,12 +397,12 @@ msgid "Companies"
 msgstr ""
 
 #: src/components/nav/SearchDrawer.tsx:140
-#: src/pages/part/PartDetail.tsx:103
+#: src/pages/part/PartDetail.tsx:106
 msgid "Purchase Orders"
 msgstr ""
 
 #: src/components/nav/SearchDrawer.tsx:150
-#: src/pages/part/PartDetail.tsx:110
+#: src/pages/part/PartDetail.tsx:113
 msgid "Sales Orders"
 msgstr ""
 
@@ -446,6 +450,58 @@ msgstr ""
 msgid "Shipment"
 msgstr ""
 
+#: src/components/tables/AttachmentTable.tsx:29
+msgid "Attachment"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:46
+msgid "Comment"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:55
+msgid "Uploaded"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:115
+#: src/components/tables/part/PartTable.tsx:203
+#: src/components/tables/stock/StockItemTable.tsx:124
+msgid "Edit"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:130
+#: src/components/tables/part/RelatedPartTable.tsx:97
+#: src/functions/forms.tsx:177
+msgid "Delete"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:156
+msgid "File uploaded"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:157
+msgid "File {0} uploaded successfully"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:168
+msgid "Upload Error"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:169
+msgid "File could not be uploaded"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:182
+msgid "Add attachment"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:201
+msgid "Add external link"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:241
+msgid "Upload attachment"
+msgstr ""
+
 #: src/components/tables/ColumnSelect.tsx:17
 #: src/components/tables/ColumnSelect.tsx:24
 msgid "Select Columns"
@@ -523,41 +579,42 @@ msgstr ""
 msgid "No records found"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:347
+#: src/components/tables/InvenTreeTable.tsx:357
 msgid "Bad request"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:350
+#: src/components/tables/InvenTreeTable.tsx:360
 msgid "Unauthorized"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:353
+#: src/components/tables/InvenTreeTable.tsx:363
 msgid "Forbidden"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:356
+#: src/components/tables/InvenTreeTable.tsx:366
 msgid "Not found"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:405
-#: src/components/tables/InvenTreeTable.tsx:406
+#: src/components/tables/InvenTreeTable.tsx:427
+#: src/components/tables/InvenTreeTable.tsx:428
 msgid "Barcode actions"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:413
-#: src/components/tables/InvenTreeTable.tsx:414
+#: src/components/tables/InvenTreeTable.tsx:435
+#: src/components/tables/InvenTreeTable.tsx:436
 msgid "Print actions"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:431
+#: src/components/tables/InvenTreeTable.tsx:453
 msgid "Refresh data"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:449
+#: src/components/tables/InvenTreeTable.tsx:471
 msgid "Table filters"
 msgstr ""
 
-#: src/components/tables/RowActions.tsx:35
+#: src/components/tables/RowActions.tsx:33
+#: src/components/tables/RowActions.tsx:40
 msgid "Actions"
 msgstr ""
 
@@ -567,12 +624,14 @@ msgstr ""
 
 #: src/components/tables/build/BuildOrderTable.tsx:24
 #: src/components/tables/part/PartTable.tsx:25
+#: src/components/tables/part/RelatedPartTable.tsx:31
 #: src/components/tables/stock/StockItemTable.tsx:22
 msgid "Part"
 msgstr ""
 
 #: src/components/tables/build/BuildOrderTable.tsx:41
 #: src/components/tables/part/PartTable.tsx:51
+#: src/components/tables/part/RelatedPartTable.tsx:49
 #: src/components/tables/stock/StockItemTable.tsx:38
 msgid "Description"
 msgstr ""
@@ -617,7 +676,7 @@ msgstr ""
 #: src/components/tables/part/PartTable.tsx:68
 #: src/components/tables/stock/StockItemTable.tsx:43
 #: src/defaults/links.tsx:27
-#: src/pages/part/PartDetail.tsx:56
+#: src/pages/part/PartDetail.tsx:59
 msgid "Stock"
 msgstr ""
 
@@ -731,15 +790,38 @@ msgstr ""
 msgid "Not Virtual"
 msgstr ""
 
-#: src/components/tables/part/PartTable.tsx:203
-#: src/components/tables/stock/StockItemTable.tsx:124
-msgid "Edit"
-msgstr ""
-
 #: src/components/tables/part/PartTable.tsx:216
 msgid "Detail"
 msgstr ""
 
+#: src/components/tables/part/RelatedPartTable.tsx:61
+msgid "Add Related Part"
+msgstr ""
+
+#: src/components/tables/part/RelatedPartTable.tsx:69
+msgid "Related Part"
+msgstr ""
+
+#: src/components/tables/part/RelatedPartTable.tsx:72
+msgid "Related part added"
+msgstr ""
+
+#: src/components/tables/part/RelatedPartTable.tsx:82
+msgid "Add related part"
+msgstr ""
+
+#: src/components/tables/part/RelatedPartTable.tsx:104
+msgid "Delete Related Part"
+msgstr ""
+
+#: src/components/tables/part/RelatedPartTable.tsx:105
+msgid "Related part deleted"
+msgstr ""
+
+#: src/components/tables/part/RelatedPartTable.tsx:107
+msgid "Are you sure you want to remove this relationship?"
+msgstr ""
+
 #: src/components/tables/stock/StockItemTable.tsx:58
 msgid "Batch"
 msgstr ""
@@ -787,6 +869,18 @@ msgstr ""
 msgid "Getting started"
 msgstr ""
 
+#: src/components/widgets/MarkdownEditor.tsx:109
+msgid "Failed to upload image"
+msgstr ""
+
+#: src/components/widgets/MarkdownEditor.tsx:147
+msgid "Notes saved"
+msgstr ""
+
+#: src/components/widgets/MarkdownEditor.tsx:155
+msgid "Failed to save notes"
+msgstr ""
+
 #: src/components/widgets/WidgetLayout.tsx:180
 msgid "Layout"
 msgstr ""
@@ -1098,8 +1192,48 @@ msgstr ""
 msgid "method parameter not supplied"
 msgstr ""
 
-#: src/functions/forms.tsx:177
-msgid "Delete"
+#: src/functions/forms/AttachmentForms.tsx:57
+msgid "Add File"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:57
+msgid "Add Link"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:58
+msgid "File added"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:58
+msgid "Link added"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:100
+msgid "Edit File"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:100
+msgid "Edit Link"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:101
+msgid "File updated"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:101
+msgid "Link updated"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:127
+msgid "Delete Attachment"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:128
+msgid "Attachment deleted"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:132
+msgid "Are you sure you want to delete this attachment?"
 msgstr ""
 
 #: src/functions/forms/PartForms.tsx:76
@@ -1445,43 +1579,43 @@ msgstr ""
 msgid "Go to the start page"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:50
+#: src/pages/part/PartDetail.tsx:53
 msgid "Details"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:62
+#: src/pages/part/PartDetail.tsx:65
 msgid "Variants"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:69
+#: src/pages/part/PartDetail.tsx:72
 msgid "Bill of Materials"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:83
+#: src/pages/part/PartDetail.tsx:86
 msgid "Used In"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:90
+#: src/pages/part/PartDetail.tsx:93
 msgid "Pricing"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:96
+#: src/pages/part/PartDetail.tsx:99
 msgid "Suppliers"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:117
+#: src/pages/part/PartDetail.tsx:120
 msgid "Test Templates"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:124
+#: src/pages/part/PartDetail.tsx:127
 msgid "Related Parts"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:130
+#: src/pages/part/PartDetail.tsx:133
 msgid "Attachments"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:136
+#: src/pages/part/PartDetail.tsx:139
 msgid "Notes"
 msgstr ""
 
diff --git a/src/frontend/src/locales/nl/messages.po b/src/frontend/src/locales/nl/messages.po
index a2ac89b943..0e806beed7 100644
--- a/src/frontend/src/locales/nl/messages.po
+++ b/src/frontend/src/locales/nl/messages.po
@@ -8,7 +8,7 @@ msgstr ""
 "Language: nl\n"
 "Project-Id-Version: inventree\n"
 "Report-Msgid-Bugs-To: \n"
-"PO-Revision-Date: 2023-09-12 00:10\n"
+"PO-Revision-Date: 2023-09-14 01:14\n"
 "Last-Translator: \n"
 "Language-Team: Dutch\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
@@ -23,6 +23,7 @@ msgid "Title"
 msgstr ""
 
 #: src/components/forms/ApiForm.tsx:189
+#: src/components/widgets/MarkdownEditor.tsx:146
 msgid "Success"
 msgstr ""
 
@@ -158,6 +159,7 @@ msgid "Add Host"
 msgstr ""
 
 #: src/components/forms/HostOptionsForm.tsx:89
+#: src/components/widgets/MarkdownEditor.tsx:73
 msgid "Save"
 msgstr ""
 
@@ -187,7 +189,9 @@ msgstr ""
 
 #: src/components/forms/fields/ApiFormField.tsx:286
 #: src/components/nav/SearchDrawer.tsx:425
-#: src/components/tables/InvenTreeTable.tsx:368
+#: src/components/tables/InvenTreeTable.tsx:378
+#: src/components/widgets/MarkdownEditor.tsx:108
+#: src/components/widgets/MarkdownEditor.tsx:154
 #: src/pages/ErrorPage.tsx:12
 #: src/pages/ErrorPage.tsx:25
 msgid "Error"
@@ -211,7 +215,7 @@ msgid "Read More"
 msgstr ""
 
 #: src/components/items/ErrorItem.tsx:5
-#: src/components/tables/InvenTreeTable.tsx:360
+#: src/components/tables/InvenTreeTable.tsx:370
 msgid "Unknown error"
 msgstr ""
 
@@ -384,7 +388,7 @@ msgstr ""
 
 #: src/components/nav/SearchDrawer.tsx:121
 #: src/pages/Index/Build.tsx:13
-#: src/pages/part/PartDetail.tsx:76
+#: src/pages/part/PartDetail.tsx:79
 msgid "Build Orders"
 msgstr ""
 
@@ -393,12 +397,12 @@ msgid "Companies"
 msgstr ""
 
 #: src/components/nav/SearchDrawer.tsx:140
-#: src/pages/part/PartDetail.tsx:103
+#: src/pages/part/PartDetail.tsx:106
 msgid "Purchase Orders"
 msgstr ""
 
 #: src/components/nav/SearchDrawer.tsx:150
-#: src/pages/part/PartDetail.tsx:110
+#: src/pages/part/PartDetail.tsx:113
 msgid "Sales Orders"
 msgstr ""
 
@@ -446,6 +450,58 @@ msgstr ""
 msgid "Shipment"
 msgstr ""
 
+#: src/components/tables/AttachmentTable.tsx:29
+msgid "Attachment"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:46
+msgid "Comment"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:55
+msgid "Uploaded"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:115
+#: src/components/tables/part/PartTable.tsx:203
+#: src/components/tables/stock/StockItemTable.tsx:124
+msgid "Edit"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:130
+#: src/components/tables/part/RelatedPartTable.tsx:97
+#: src/functions/forms.tsx:177
+msgid "Delete"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:156
+msgid "File uploaded"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:157
+msgid "File {0} uploaded successfully"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:168
+msgid "Upload Error"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:169
+msgid "File could not be uploaded"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:182
+msgid "Add attachment"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:201
+msgid "Add external link"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:241
+msgid "Upload attachment"
+msgstr ""
+
 #: src/components/tables/ColumnSelect.tsx:17
 #: src/components/tables/ColumnSelect.tsx:24
 msgid "Select Columns"
@@ -523,41 +579,42 @@ msgstr ""
 msgid "No records found"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:347
+#: src/components/tables/InvenTreeTable.tsx:357
 msgid "Bad request"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:350
+#: src/components/tables/InvenTreeTable.tsx:360
 msgid "Unauthorized"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:353
+#: src/components/tables/InvenTreeTable.tsx:363
 msgid "Forbidden"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:356
+#: src/components/tables/InvenTreeTable.tsx:366
 msgid "Not found"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:405
-#: src/components/tables/InvenTreeTable.tsx:406
+#: src/components/tables/InvenTreeTable.tsx:427
+#: src/components/tables/InvenTreeTable.tsx:428
 msgid "Barcode actions"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:413
-#: src/components/tables/InvenTreeTable.tsx:414
+#: src/components/tables/InvenTreeTable.tsx:435
+#: src/components/tables/InvenTreeTable.tsx:436
 msgid "Print actions"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:431
+#: src/components/tables/InvenTreeTable.tsx:453
 msgid "Refresh data"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:449
+#: src/components/tables/InvenTreeTable.tsx:471
 msgid "Table filters"
 msgstr ""
 
-#: src/components/tables/RowActions.tsx:35
+#: src/components/tables/RowActions.tsx:33
+#: src/components/tables/RowActions.tsx:40
 msgid "Actions"
 msgstr ""
 
@@ -567,12 +624,14 @@ msgstr ""
 
 #: src/components/tables/build/BuildOrderTable.tsx:24
 #: src/components/tables/part/PartTable.tsx:25
+#: src/components/tables/part/RelatedPartTable.tsx:31
 #: src/components/tables/stock/StockItemTable.tsx:22
 msgid "Part"
 msgstr ""
 
 #: src/components/tables/build/BuildOrderTable.tsx:41
 #: src/components/tables/part/PartTable.tsx:51
+#: src/components/tables/part/RelatedPartTable.tsx:49
 #: src/components/tables/stock/StockItemTable.tsx:38
 msgid "Description"
 msgstr ""
@@ -617,7 +676,7 @@ msgstr ""
 #: src/components/tables/part/PartTable.tsx:68
 #: src/components/tables/stock/StockItemTable.tsx:43
 #: src/defaults/links.tsx:27
-#: src/pages/part/PartDetail.tsx:56
+#: src/pages/part/PartDetail.tsx:59
 msgid "Stock"
 msgstr ""
 
@@ -731,15 +790,38 @@ msgstr ""
 msgid "Not Virtual"
 msgstr ""
 
-#: src/components/tables/part/PartTable.tsx:203
-#: src/components/tables/stock/StockItemTable.tsx:124
-msgid "Edit"
-msgstr ""
-
 #: src/components/tables/part/PartTable.tsx:216
 msgid "Detail"
 msgstr ""
 
+#: src/components/tables/part/RelatedPartTable.tsx:61
+msgid "Add Related Part"
+msgstr ""
+
+#: src/components/tables/part/RelatedPartTable.tsx:69
+msgid "Related Part"
+msgstr ""
+
+#: src/components/tables/part/RelatedPartTable.tsx:72
+msgid "Related part added"
+msgstr ""
+
+#: src/components/tables/part/RelatedPartTable.tsx:82
+msgid "Add related part"
+msgstr ""
+
+#: src/components/tables/part/RelatedPartTable.tsx:104
+msgid "Delete Related Part"
+msgstr ""
+
+#: src/components/tables/part/RelatedPartTable.tsx:105
+msgid "Related part deleted"
+msgstr ""
+
+#: src/components/tables/part/RelatedPartTable.tsx:107
+msgid "Are you sure you want to remove this relationship?"
+msgstr ""
+
 #: src/components/tables/stock/StockItemTable.tsx:58
 msgid "Batch"
 msgstr ""
@@ -787,6 +869,18 @@ msgstr ""
 msgid "Getting started"
 msgstr ""
 
+#: src/components/widgets/MarkdownEditor.tsx:109
+msgid "Failed to upload image"
+msgstr ""
+
+#: src/components/widgets/MarkdownEditor.tsx:147
+msgid "Notes saved"
+msgstr ""
+
+#: src/components/widgets/MarkdownEditor.tsx:155
+msgid "Failed to save notes"
+msgstr ""
+
 #: src/components/widgets/WidgetLayout.tsx:180
 msgid "Layout"
 msgstr ""
@@ -1098,8 +1192,48 @@ msgstr ""
 msgid "method parameter not supplied"
 msgstr ""
 
-#: src/functions/forms.tsx:177
-msgid "Delete"
+#: src/functions/forms/AttachmentForms.tsx:57
+msgid "Add File"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:57
+msgid "Add Link"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:58
+msgid "File added"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:58
+msgid "Link added"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:100
+msgid "Edit File"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:100
+msgid "Edit Link"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:101
+msgid "File updated"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:101
+msgid "Link updated"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:127
+msgid "Delete Attachment"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:128
+msgid "Attachment deleted"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:132
+msgid "Are you sure you want to delete this attachment?"
 msgstr ""
 
 #: src/functions/forms/PartForms.tsx:76
@@ -1445,43 +1579,43 @@ msgstr ""
 msgid "Go to the start page"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:50
+#: src/pages/part/PartDetail.tsx:53
 msgid "Details"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:62
+#: src/pages/part/PartDetail.tsx:65
 msgid "Variants"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:69
+#: src/pages/part/PartDetail.tsx:72
 msgid "Bill of Materials"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:83
+#: src/pages/part/PartDetail.tsx:86
 msgid "Used In"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:90
+#: src/pages/part/PartDetail.tsx:93
 msgid "Pricing"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:96
+#: src/pages/part/PartDetail.tsx:99
 msgid "Suppliers"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:117
+#: src/pages/part/PartDetail.tsx:120
 msgid "Test Templates"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:124
+#: src/pages/part/PartDetail.tsx:127
 msgid "Related Parts"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:130
+#: src/pages/part/PartDetail.tsx:133
 msgid "Attachments"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:136
+#: src/pages/part/PartDetail.tsx:139
 msgid "Notes"
 msgstr ""
 
diff --git a/src/frontend/src/locales/no/messages.po b/src/frontend/src/locales/no/messages.po
index 45c7ad0948..8c6e6dce90 100644
--- a/src/frontend/src/locales/no/messages.po
+++ b/src/frontend/src/locales/no/messages.po
@@ -8,7 +8,7 @@ msgstr ""
 "Language: no\n"
 "Project-Id-Version: inventree\n"
 "Report-Msgid-Bugs-To: \n"
-"PO-Revision-Date: 2023-09-12 00:10\n"
+"PO-Revision-Date: 2023-09-14 01:15\n"
 "Last-Translator: \n"
 "Language-Team: Norwegian\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
@@ -23,6 +23,7 @@ msgid "Title"
 msgstr ""
 
 #: src/components/forms/ApiForm.tsx:189
+#: src/components/widgets/MarkdownEditor.tsx:146
 msgid "Success"
 msgstr ""
 
@@ -158,6 +159,7 @@ msgid "Add Host"
 msgstr ""
 
 #: src/components/forms/HostOptionsForm.tsx:89
+#: src/components/widgets/MarkdownEditor.tsx:73
 msgid "Save"
 msgstr ""
 
@@ -187,7 +189,9 @@ msgstr ""
 
 #: src/components/forms/fields/ApiFormField.tsx:286
 #: src/components/nav/SearchDrawer.tsx:425
-#: src/components/tables/InvenTreeTable.tsx:368
+#: src/components/tables/InvenTreeTable.tsx:378
+#: src/components/widgets/MarkdownEditor.tsx:108
+#: src/components/widgets/MarkdownEditor.tsx:154
 #: src/pages/ErrorPage.tsx:12
 #: src/pages/ErrorPage.tsx:25
 msgid "Error"
@@ -211,7 +215,7 @@ msgid "Read More"
 msgstr ""
 
 #: src/components/items/ErrorItem.tsx:5
-#: src/components/tables/InvenTreeTable.tsx:360
+#: src/components/tables/InvenTreeTable.tsx:370
 msgid "Unknown error"
 msgstr ""
 
@@ -384,7 +388,7 @@ msgstr ""
 
 #: src/components/nav/SearchDrawer.tsx:121
 #: src/pages/Index/Build.tsx:13
-#: src/pages/part/PartDetail.tsx:76
+#: src/pages/part/PartDetail.tsx:79
 msgid "Build Orders"
 msgstr ""
 
@@ -393,12 +397,12 @@ msgid "Companies"
 msgstr ""
 
 #: src/components/nav/SearchDrawer.tsx:140
-#: src/pages/part/PartDetail.tsx:103
+#: src/pages/part/PartDetail.tsx:106
 msgid "Purchase Orders"
 msgstr ""
 
 #: src/components/nav/SearchDrawer.tsx:150
-#: src/pages/part/PartDetail.tsx:110
+#: src/pages/part/PartDetail.tsx:113
 msgid "Sales Orders"
 msgstr ""
 
@@ -446,6 +450,58 @@ msgstr ""
 msgid "Shipment"
 msgstr ""
 
+#: src/components/tables/AttachmentTable.tsx:29
+msgid "Attachment"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:46
+msgid "Comment"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:55
+msgid "Uploaded"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:115
+#: src/components/tables/part/PartTable.tsx:203
+#: src/components/tables/stock/StockItemTable.tsx:124
+msgid "Edit"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:130
+#: src/components/tables/part/RelatedPartTable.tsx:97
+#: src/functions/forms.tsx:177
+msgid "Delete"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:156
+msgid "File uploaded"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:157
+msgid "File {0} uploaded successfully"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:168
+msgid "Upload Error"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:169
+msgid "File could not be uploaded"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:182
+msgid "Add attachment"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:201
+msgid "Add external link"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:241
+msgid "Upload attachment"
+msgstr ""
+
 #: src/components/tables/ColumnSelect.tsx:17
 #: src/components/tables/ColumnSelect.tsx:24
 msgid "Select Columns"
@@ -523,41 +579,42 @@ msgstr ""
 msgid "No records found"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:347
+#: src/components/tables/InvenTreeTable.tsx:357
 msgid "Bad request"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:350
+#: src/components/tables/InvenTreeTable.tsx:360
 msgid "Unauthorized"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:353
+#: src/components/tables/InvenTreeTable.tsx:363
 msgid "Forbidden"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:356
+#: src/components/tables/InvenTreeTable.tsx:366
 msgid "Not found"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:405
-#: src/components/tables/InvenTreeTable.tsx:406
+#: src/components/tables/InvenTreeTable.tsx:427
+#: src/components/tables/InvenTreeTable.tsx:428
 msgid "Barcode actions"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:413
-#: src/components/tables/InvenTreeTable.tsx:414
+#: src/components/tables/InvenTreeTable.tsx:435
+#: src/components/tables/InvenTreeTable.tsx:436
 msgid "Print actions"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:431
+#: src/components/tables/InvenTreeTable.tsx:453
 msgid "Refresh data"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:449
+#: src/components/tables/InvenTreeTable.tsx:471
 msgid "Table filters"
 msgstr ""
 
-#: src/components/tables/RowActions.tsx:35
+#: src/components/tables/RowActions.tsx:33
+#: src/components/tables/RowActions.tsx:40
 msgid "Actions"
 msgstr ""
 
@@ -567,12 +624,14 @@ msgstr ""
 
 #: src/components/tables/build/BuildOrderTable.tsx:24
 #: src/components/tables/part/PartTable.tsx:25
+#: src/components/tables/part/RelatedPartTable.tsx:31
 #: src/components/tables/stock/StockItemTable.tsx:22
 msgid "Part"
 msgstr ""
 
 #: src/components/tables/build/BuildOrderTable.tsx:41
 #: src/components/tables/part/PartTable.tsx:51
+#: src/components/tables/part/RelatedPartTable.tsx:49
 #: src/components/tables/stock/StockItemTable.tsx:38
 msgid "Description"
 msgstr ""
@@ -617,7 +676,7 @@ msgstr ""
 #: src/components/tables/part/PartTable.tsx:68
 #: src/components/tables/stock/StockItemTable.tsx:43
 #: src/defaults/links.tsx:27
-#: src/pages/part/PartDetail.tsx:56
+#: src/pages/part/PartDetail.tsx:59
 msgid "Stock"
 msgstr ""
 
@@ -731,15 +790,38 @@ msgstr ""
 msgid "Not Virtual"
 msgstr ""
 
-#: src/components/tables/part/PartTable.tsx:203
-#: src/components/tables/stock/StockItemTable.tsx:124
-msgid "Edit"
-msgstr ""
-
 #: src/components/tables/part/PartTable.tsx:216
 msgid "Detail"
 msgstr ""
 
+#: src/components/tables/part/RelatedPartTable.tsx:61
+msgid "Add Related Part"
+msgstr ""
+
+#: src/components/tables/part/RelatedPartTable.tsx:69
+msgid "Related Part"
+msgstr ""
+
+#: src/components/tables/part/RelatedPartTable.tsx:72
+msgid "Related part added"
+msgstr ""
+
+#: src/components/tables/part/RelatedPartTable.tsx:82
+msgid "Add related part"
+msgstr ""
+
+#: src/components/tables/part/RelatedPartTable.tsx:104
+msgid "Delete Related Part"
+msgstr ""
+
+#: src/components/tables/part/RelatedPartTable.tsx:105
+msgid "Related part deleted"
+msgstr ""
+
+#: src/components/tables/part/RelatedPartTable.tsx:107
+msgid "Are you sure you want to remove this relationship?"
+msgstr ""
+
 #: src/components/tables/stock/StockItemTable.tsx:58
 msgid "Batch"
 msgstr ""
@@ -787,6 +869,18 @@ msgstr ""
 msgid "Getting started"
 msgstr ""
 
+#: src/components/widgets/MarkdownEditor.tsx:109
+msgid "Failed to upload image"
+msgstr ""
+
+#: src/components/widgets/MarkdownEditor.tsx:147
+msgid "Notes saved"
+msgstr ""
+
+#: src/components/widgets/MarkdownEditor.tsx:155
+msgid "Failed to save notes"
+msgstr ""
+
 #: src/components/widgets/WidgetLayout.tsx:180
 msgid "Layout"
 msgstr ""
@@ -1098,8 +1192,48 @@ msgstr ""
 msgid "method parameter not supplied"
 msgstr ""
 
-#: src/functions/forms.tsx:177
-msgid "Delete"
+#: src/functions/forms/AttachmentForms.tsx:57
+msgid "Add File"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:57
+msgid "Add Link"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:58
+msgid "File added"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:58
+msgid "Link added"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:100
+msgid "Edit File"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:100
+msgid "Edit Link"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:101
+msgid "File updated"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:101
+msgid "Link updated"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:127
+msgid "Delete Attachment"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:128
+msgid "Attachment deleted"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:132
+msgid "Are you sure you want to delete this attachment?"
 msgstr ""
 
 #: src/functions/forms/PartForms.tsx:76
@@ -1445,43 +1579,43 @@ msgstr ""
 msgid "Go to the start page"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:50
+#: src/pages/part/PartDetail.tsx:53
 msgid "Details"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:62
+#: src/pages/part/PartDetail.tsx:65
 msgid "Variants"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:69
+#: src/pages/part/PartDetail.tsx:72
 msgid "Bill of Materials"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:83
+#: src/pages/part/PartDetail.tsx:86
 msgid "Used In"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:90
+#: src/pages/part/PartDetail.tsx:93
 msgid "Pricing"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:96
+#: src/pages/part/PartDetail.tsx:99
 msgid "Suppliers"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:117
+#: src/pages/part/PartDetail.tsx:120
 msgid "Test Templates"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:124
+#: src/pages/part/PartDetail.tsx:127
 msgid "Related Parts"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:130
+#: src/pages/part/PartDetail.tsx:133
 msgid "Attachments"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:136
+#: src/pages/part/PartDetail.tsx:139
 msgid "Notes"
 msgstr ""
 
diff --git a/src/frontend/src/locales/pl/messages.po b/src/frontend/src/locales/pl/messages.po
index 924f606662..6356b58d98 100644
--- a/src/frontend/src/locales/pl/messages.po
+++ b/src/frontend/src/locales/pl/messages.po
@@ -8,7 +8,7 @@ msgstr ""
 "Language: pl\n"
 "Project-Id-Version: inventree\n"
 "Report-Msgid-Bugs-To: \n"
-"PO-Revision-Date: 2023-09-12 00:10\n"
+"PO-Revision-Date: 2023-09-14 01:15\n"
 "Last-Translator: \n"
 "Language-Team: Polish\n"
 "Plural-Forms: nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && (n%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && n%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);\n"
@@ -23,6 +23,7 @@ msgid "Title"
 msgstr ""
 
 #: src/components/forms/ApiForm.tsx:189
+#: src/components/widgets/MarkdownEditor.tsx:146
 msgid "Success"
 msgstr ""
 
@@ -158,6 +159,7 @@ msgid "Add Host"
 msgstr ""
 
 #: src/components/forms/HostOptionsForm.tsx:89
+#: src/components/widgets/MarkdownEditor.tsx:73
 msgid "Save"
 msgstr ""
 
@@ -187,7 +189,9 @@ msgstr ""
 
 #: src/components/forms/fields/ApiFormField.tsx:286
 #: src/components/nav/SearchDrawer.tsx:425
-#: src/components/tables/InvenTreeTable.tsx:368
+#: src/components/tables/InvenTreeTable.tsx:378
+#: src/components/widgets/MarkdownEditor.tsx:108
+#: src/components/widgets/MarkdownEditor.tsx:154
 #: src/pages/ErrorPage.tsx:12
 #: src/pages/ErrorPage.tsx:25
 msgid "Error"
@@ -211,7 +215,7 @@ msgid "Read More"
 msgstr ""
 
 #: src/components/items/ErrorItem.tsx:5
-#: src/components/tables/InvenTreeTable.tsx:360
+#: src/components/tables/InvenTreeTable.tsx:370
 msgid "Unknown error"
 msgstr ""
 
@@ -384,7 +388,7 @@ msgstr ""
 
 #: src/components/nav/SearchDrawer.tsx:121
 #: src/pages/Index/Build.tsx:13
-#: src/pages/part/PartDetail.tsx:76
+#: src/pages/part/PartDetail.tsx:79
 msgid "Build Orders"
 msgstr ""
 
@@ -393,12 +397,12 @@ msgid "Companies"
 msgstr ""
 
 #: src/components/nav/SearchDrawer.tsx:140
-#: src/pages/part/PartDetail.tsx:103
+#: src/pages/part/PartDetail.tsx:106
 msgid "Purchase Orders"
 msgstr ""
 
 #: src/components/nav/SearchDrawer.tsx:150
-#: src/pages/part/PartDetail.tsx:110
+#: src/pages/part/PartDetail.tsx:113
 msgid "Sales Orders"
 msgstr ""
 
@@ -446,6 +450,58 @@ msgstr ""
 msgid "Shipment"
 msgstr ""
 
+#: src/components/tables/AttachmentTable.tsx:29
+msgid "Attachment"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:46
+msgid "Comment"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:55
+msgid "Uploaded"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:115
+#: src/components/tables/part/PartTable.tsx:203
+#: src/components/tables/stock/StockItemTable.tsx:124
+msgid "Edit"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:130
+#: src/components/tables/part/RelatedPartTable.tsx:97
+#: src/functions/forms.tsx:177
+msgid "Delete"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:156
+msgid "File uploaded"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:157
+msgid "File {0} uploaded successfully"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:168
+msgid "Upload Error"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:169
+msgid "File could not be uploaded"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:182
+msgid "Add attachment"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:201
+msgid "Add external link"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:241
+msgid "Upload attachment"
+msgstr ""
+
 #: src/components/tables/ColumnSelect.tsx:17
 #: src/components/tables/ColumnSelect.tsx:24
 msgid "Select Columns"
@@ -523,41 +579,42 @@ msgstr ""
 msgid "No records found"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:347
+#: src/components/tables/InvenTreeTable.tsx:357
 msgid "Bad request"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:350
+#: src/components/tables/InvenTreeTable.tsx:360
 msgid "Unauthorized"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:353
+#: src/components/tables/InvenTreeTable.tsx:363
 msgid "Forbidden"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:356
+#: src/components/tables/InvenTreeTable.tsx:366
 msgid "Not found"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:405
-#: src/components/tables/InvenTreeTable.tsx:406
+#: src/components/tables/InvenTreeTable.tsx:427
+#: src/components/tables/InvenTreeTable.tsx:428
 msgid "Barcode actions"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:413
-#: src/components/tables/InvenTreeTable.tsx:414
+#: src/components/tables/InvenTreeTable.tsx:435
+#: src/components/tables/InvenTreeTable.tsx:436
 msgid "Print actions"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:431
+#: src/components/tables/InvenTreeTable.tsx:453
 msgid "Refresh data"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:449
+#: src/components/tables/InvenTreeTable.tsx:471
 msgid "Table filters"
 msgstr ""
 
-#: src/components/tables/RowActions.tsx:35
+#: src/components/tables/RowActions.tsx:33
+#: src/components/tables/RowActions.tsx:40
 msgid "Actions"
 msgstr ""
 
@@ -567,12 +624,14 @@ msgstr ""
 
 #: src/components/tables/build/BuildOrderTable.tsx:24
 #: src/components/tables/part/PartTable.tsx:25
+#: src/components/tables/part/RelatedPartTable.tsx:31
 #: src/components/tables/stock/StockItemTable.tsx:22
 msgid "Part"
 msgstr ""
 
 #: src/components/tables/build/BuildOrderTable.tsx:41
 #: src/components/tables/part/PartTable.tsx:51
+#: src/components/tables/part/RelatedPartTable.tsx:49
 #: src/components/tables/stock/StockItemTable.tsx:38
 msgid "Description"
 msgstr ""
@@ -617,7 +676,7 @@ msgstr ""
 #: src/components/tables/part/PartTable.tsx:68
 #: src/components/tables/stock/StockItemTable.tsx:43
 #: src/defaults/links.tsx:27
-#: src/pages/part/PartDetail.tsx:56
+#: src/pages/part/PartDetail.tsx:59
 msgid "Stock"
 msgstr ""
 
@@ -731,15 +790,38 @@ msgstr ""
 msgid "Not Virtual"
 msgstr ""
 
-#: src/components/tables/part/PartTable.tsx:203
-#: src/components/tables/stock/StockItemTable.tsx:124
-msgid "Edit"
-msgstr ""
-
 #: src/components/tables/part/PartTable.tsx:216
 msgid "Detail"
 msgstr ""
 
+#: src/components/tables/part/RelatedPartTable.tsx:61
+msgid "Add Related Part"
+msgstr ""
+
+#: src/components/tables/part/RelatedPartTable.tsx:69
+msgid "Related Part"
+msgstr ""
+
+#: src/components/tables/part/RelatedPartTable.tsx:72
+msgid "Related part added"
+msgstr ""
+
+#: src/components/tables/part/RelatedPartTable.tsx:82
+msgid "Add related part"
+msgstr ""
+
+#: src/components/tables/part/RelatedPartTable.tsx:104
+msgid "Delete Related Part"
+msgstr ""
+
+#: src/components/tables/part/RelatedPartTable.tsx:105
+msgid "Related part deleted"
+msgstr ""
+
+#: src/components/tables/part/RelatedPartTable.tsx:107
+msgid "Are you sure you want to remove this relationship?"
+msgstr ""
+
 #: src/components/tables/stock/StockItemTable.tsx:58
 msgid "Batch"
 msgstr ""
@@ -787,6 +869,18 @@ msgstr ""
 msgid "Getting started"
 msgstr ""
 
+#: src/components/widgets/MarkdownEditor.tsx:109
+msgid "Failed to upload image"
+msgstr ""
+
+#: src/components/widgets/MarkdownEditor.tsx:147
+msgid "Notes saved"
+msgstr ""
+
+#: src/components/widgets/MarkdownEditor.tsx:155
+msgid "Failed to save notes"
+msgstr ""
+
 #: src/components/widgets/WidgetLayout.tsx:180
 msgid "Layout"
 msgstr ""
@@ -1098,8 +1192,48 @@ msgstr ""
 msgid "method parameter not supplied"
 msgstr ""
 
-#: src/functions/forms.tsx:177
-msgid "Delete"
+#: src/functions/forms/AttachmentForms.tsx:57
+msgid "Add File"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:57
+msgid "Add Link"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:58
+msgid "File added"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:58
+msgid "Link added"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:100
+msgid "Edit File"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:100
+msgid "Edit Link"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:101
+msgid "File updated"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:101
+msgid "Link updated"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:127
+msgid "Delete Attachment"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:128
+msgid "Attachment deleted"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:132
+msgid "Are you sure you want to delete this attachment?"
 msgstr ""
 
 #: src/functions/forms/PartForms.tsx:76
@@ -1445,43 +1579,43 @@ msgstr ""
 msgid "Go to the start page"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:50
+#: src/pages/part/PartDetail.tsx:53
 msgid "Details"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:62
+#: src/pages/part/PartDetail.tsx:65
 msgid "Variants"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:69
+#: src/pages/part/PartDetail.tsx:72
 msgid "Bill of Materials"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:83
+#: src/pages/part/PartDetail.tsx:86
 msgid "Used In"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:90
+#: src/pages/part/PartDetail.tsx:93
 msgid "Pricing"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:96
+#: src/pages/part/PartDetail.tsx:99
 msgid "Suppliers"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:117
+#: src/pages/part/PartDetail.tsx:120
 msgid "Test Templates"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:124
+#: src/pages/part/PartDetail.tsx:127
 msgid "Related Parts"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:130
+#: src/pages/part/PartDetail.tsx:133
 msgid "Attachments"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:136
+#: src/pages/part/PartDetail.tsx:139
 msgid "Notes"
 msgstr ""
 
diff --git a/src/frontend/src/locales/pseudo-LOCALE/messages.po b/src/frontend/src/locales/pseudo-LOCALE/messages.po
index db8a68d778..eb215f7bcd 100644
--- a/src/frontend/src/locales/pseudo-LOCALE/messages.po
+++ b/src/frontend/src/locales/pseudo-LOCALE/messages.po
@@ -57,6 +57,27 @@ msgstr ""
 msgid "Title"
 msgstr ""
 
+#: src/components/forms/ApiForm.tsx:189
+#: src/components/widgets/MarkdownEditor.tsx:146
+msgid "Success"
+msgstr ""
+
+#: src/components/forms/ApiForm.tsx:262
+msgid "Form Errors Exist"
+msgstr ""
+
+#: src/components/forms/ApiForm.tsx:301
+#: src/components/tables/FilterSelectModal.tsx:166
+#: src/contexts/ThemeContext.tsx:65
+msgid "Cancel"
+msgstr ""
+
+#: src/components/forms/ApiForm.tsx:310
+#: src/contexts/ThemeContext.tsx:65
+#: src/pages/Index/Profile/UserPanel.tsx:107
+msgid "Submit"
+msgstr ""
+
 #: src/components/forms/AuthenticationForm.tsx:36
 msgid "Login failed"
 msgstr ""
@@ -173,6 +194,7 @@ msgid "Add Host"
 msgstr ""
 
 #: src/components/forms/HostOptionsForm.tsx:89
+#: src/components/widgets/MarkdownEditor.tsx:73
 msgid "Save"
 msgstr ""
 
@@ -200,12 +222,35 @@ msgstr ""
 msgid "State: <0>worker</0> ({0}), <1>plugins</1>{1}"
 msgstr ""
 
+#: src/components/forms/fields/ApiFormField.tsx:286
+#: src/components/nav/SearchDrawer.tsx:425
+#: src/components/tables/InvenTreeTable.tsx:373
+#: src/components/widgets/MarkdownEditor.tsx:108
+#: src/components/widgets/MarkdownEditor.tsx:154
+#: src/pages/ErrorPage.tsx:12
+#: src/pages/ErrorPage.tsx:25
+msgid "Error"
+msgstr ""
+
+#: src/components/forms/fields/RelatedModelField.tsx:194
+msgid "Search"
+msgstr ""
+
+#: src/components/forms/fields/RelatedModelField.tsx:195
+#: src/components/widgets/WidgetLayout.tsx:134
+msgid "Loading"
+msgstr ""
+
+#: src/components/forms/fields/RelatedModelField.tsx:197
+msgid "No results found"
+msgstr ""
+
 #: src/components/items/DocTooltip.tsx:89
 msgid "Read More"
 msgstr ""
 
 #: src/components/items/ErrorItem.tsx:5
-#: src/components/tables/InvenTreeTable.tsx:336
+#: src/components/tables/InvenTreeTable.tsx:365
 msgid "Unknown error"
 msgstr ""
 
@@ -237,8 +282,8 @@ msgstr ""
 msgid "Scan QR code"
 msgstr ""
 
-#: src/components/items/Thumbnail.tsx:8
-#: src/components/items/Thumbnail.tsx:41
+#: src/components/items/Thumbnail.tsx:10
+#: src/components/items/Thumbnail.tsx:43
 msgid "Thumbnail"
 msgstr ""
 
@@ -352,93 +397,150 @@ msgstr ""
 msgid "About"
 msgstr ""
 
-#: src/components/nav/SearchDrawer.tsx:65
+#: src/components/nav/SearchDrawer.tsx:60
 #: src/defaults/links.tsx:26
-#: src/pages/Index/Part.tsx:13
+#: src/pages/part/PartIndex.tsx:23
+#: src/pages/part/PartIndex.tsx:46
 msgid "Parts"
 msgstr ""
 
-#: src/components/nav/SearchDrawer.tsx:74
+#: src/components/nav/SearchDrawer.tsx:68
 msgid "Supplier Parts"
 msgstr ""
 
-#: src/components/nav/SearchDrawer.tsx:88
+#: src/components/nav/SearchDrawer.tsx:81
 msgid "Manufacturer Parts"
 msgstr ""
 
-#: src/components/nav/SearchDrawer.tsx:102
+#: src/components/nav/SearchDrawer.tsx:94
 msgid "Part Categories"
 msgstr ""
 
-#: src/components/nav/SearchDrawer.tsx:111
+#: src/components/nav/SearchDrawer.tsx:102
 #: src/pages/Index/Stock.tsx:13
 msgid "Stock Items"
 msgstr ""
 
-#: src/components/nav/SearchDrawer.tsx:123
+#: src/components/nav/SearchDrawer.tsx:113
 msgid "Stock Locations"
 msgstr ""
 
-#: src/components/nav/SearchDrawer.tsx:132
+#: src/components/nav/SearchDrawer.tsx:121
 #: src/pages/Index/Build.tsx:13
+#: src/pages/part/PartDetail.tsx:79
 msgid "Build Orders"
 msgstr ""
 
-#: src/components/nav/SearchDrawer.tsx:143
+#: src/components/nav/SearchDrawer.tsx:131
 msgid "Companies"
 msgstr ""
 
-#: src/components/nav/SearchDrawer.tsx:153
+#: src/components/nav/SearchDrawer.tsx:140
+#: src/pages/part/PartDetail.tsx:106
 msgid "Purchase Orders"
 msgstr ""
 
-#: src/components/nav/SearchDrawer.tsx:164
+#: src/components/nav/SearchDrawer.tsx:150
+#: src/pages/part/PartDetail.tsx:113
 msgid "Sales Orders"
 msgstr ""
 
-#: src/components/nav/SearchDrawer.tsx:175
+#: src/components/nav/SearchDrawer.tsx:160
 msgid "Return Orders"
 msgstr ""
 
-#: src/components/nav/SearchDrawer.tsx:209
+#: src/components/nav/SearchDrawer.tsx:195
 msgid "results"
 msgstr ""
 
-#: src/components/nav/SearchDrawer.tsx:346
+#: src/components/nav/SearchDrawer.tsx:351
 msgid "Enter search text"
 msgstr ""
 
-#: src/components/nav/SearchDrawer.tsx:373
+#: src/components/nav/SearchDrawer.tsx:378
 msgid "Search Options"
 msgstr ""
 
-#: src/components/nav/SearchDrawer.tsx:376
+#: src/components/nav/SearchDrawer.tsx:381
 msgid "Regex search"
 msgstr ""
 
-#: src/components/nav/SearchDrawer.tsx:386
+#: src/components/nav/SearchDrawer.tsx:391
 msgid "Whole word search"
 msgstr ""
 
-#: src/components/nav/SearchDrawer.tsx:419
-#: src/components/tables/InvenTreeTable.tsx:344
-#: src/pages/ErrorPage.tsx:12
-#: src/pages/ErrorPage.tsx:25
-msgid "Error"
-msgstr ""
-
-#: src/components/nav/SearchDrawer.tsx:422
+#: src/components/nav/SearchDrawer.tsx:428
 msgid "An error occurred during search query"
 msgstr ""
 
-#: src/components/nav/SearchDrawer.tsx:430
+#: src/components/nav/SearchDrawer.tsx:439
 msgid "No results"
 msgstr ""
 
-#: src/components/nav/SearchDrawer.tsx:433
+#: src/components/nav/SearchDrawer.tsx:442
 msgid "No results available for search query"
 msgstr ""
 
+#: src/components/render/Instance.tsx:65
+msgid "Unknown model: {model}"
+msgstr ""
+
+#: src/components/render/Order.tsx:67
+msgid "Shipment"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:29
+msgid "Attachment"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:46
+msgid "Comment"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:55
+msgid "Uploaded"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:115
+#: src/components/tables/part/PartTable.tsx:203
+#: src/components/tables/stock/StockItemTable.tsx:124
+msgid "Edit"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:130
+#: src/components/tables/part/RelatedPartTable.tsx:97
+#: src/functions/forms.tsx:177
+msgid "Delete"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:156
+msgid "File uploaded"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:157
+msgid "File {0} uploaded successfully"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:168
+msgid "Upload Error"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:169
+msgid "File could not be uploaded"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:182
+msgid "Add attachment"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:201
+msgid "Add external link"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:241
+msgid "Upload attachment"
+msgstr ""
+
 #: src/components/tables/ColumnSelect.tsx:17
 #: src/components/tables/ColumnSelect.tsx:24
 msgid "Select Columns"
@@ -508,66 +610,68 @@ msgstr ""
 msgid "Select filter value"
 msgstr ""
 
-#: src/components/tables/FilterSelectModal.tsx:166
-#: src/contexts/ThemeContext.tsx:62
-msgid "Cancel"
-msgstr ""
-
 #: src/components/tables/FilterSelectModal.tsx:172
 msgid "Add Filter"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:95
+#: src/components/tables/InvenTreeTable.tsx:96
 msgid "No records found"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:323
+#: src/components/tables/InvenTreeTable.tsx:352
 msgid "Bad request"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:326
+#: src/components/tables/InvenTreeTable.tsx:355
 msgid "Unauthorized"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:329
+#: src/components/tables/InvenTreeTable.tsx:358
 msgid "Forbidden"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:332
+#: src/components/tables/InvenTreeTable.tsx:361
 msgid "Not found"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:381
-#: src/components/tables/InvenTreeTable.tsx:382
+#: src/components/tables/InvenTreeTable.tsx:422
+#: src/components/tables/InvenTreeTable.tsx:423
 msgid "Barcode actions"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:389
-#: src/components/tables/InvenTreeTable.tsx:390
+#: src/components/tables/InvenTreeTable.tsx:430
+#: src/components/tables/InvenTreeTable.tsx:431
 msgid "Print actions"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:407
+#: src/components/tables/InvenTreeTable.tsx:448
 msgid "Refresh data"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:425
+#: src/components/tables/InvenTreeTable.tsx:466
 msgid "Table filters"
 msgstr ""
 
+#: src/components/tables/RowActions.tsx:33
+#: src/components/tables/RowActions.tsx:40
+msgid "Actions"
+msgstr ""
+
 #: src/components/tables/build/BuildOrderTable.tsx:18
 msgid "Reference"
 msgstr ""
 
 #: src/components/tables/build/BuildOrderTable.tsx:24
-#: src/components/tables/part/PartTable.tsx:20
-#: src/components/tables/stock/StockItemTable.tsx:21
+#: src/components/tables/part/PartTable.tsx:25
+#: src/components/tables/part/RelatedPartTable.tsx:31
+#: src/components/tables/stock/StockItemTable.tsx:22
 msgid "Part"
 msgstr ""
 
 #: src/components/tables/build/BuildOrderTable.tsx:41
-#: src/components/tables/part/PartTable.tsx:46
-#: src/components/tables/stock/StockItemTable.tsx:37
+#: src/components/tables/part/PartTable.tsx:51
+#: src/components/tables/part/RelatedPartTable.tsx:49
+#: src/components/tables/stock/StockItemTable.tsx:38
 msgid "Description"
 msgstr ""
 
@@ -588,7 +692,7 @@ msgid "Completed"
 msgstr ""
 
 #: src/components/tables/build/BuildOrderTable.tsx:86
-#: src/components/tables/stock/StockItemTable.tsx:50
+#: src/components/tables/stock/StockItemTable.tsx:51
 msgid "Status"
 msgstr ""
 
@@ -596,151 +700,180 @@ msgstr ""
 msgid "Created"
 msgstr ""
 
-#: src/components/tables/part/PartTable.tsx:34
+#: src/components/tables/part/PartTable.tsx:39
 msgid "IPN"
 msgstr ""
 
-#: src/components/tables/part/PartTable.tsx:41
+#: src/components/tables/part/PartTable.tsx:46
 msgid "Units"
 msgstr ""
 
-#: src/components/tables/part/PartTable.tsx:52
+#: src/components/tables/part/PartTable.tsx:57
 msgid "Category"
 msgstr ""
 
-#: src/components/tables/part/PartTable.tsx:63
-#: src/components/tables/stock/StockItemTable.tsx:42
+#: src/components/tables/part/PartTable.tsx:68
+#: src/components/tables/stock/StockItemTable.tsx:43
 #: src/defaults/links.tsx:27
+#: src/pages/part/PartDetail.tsx:59
 msgid "Stock"
 msgstr ""
 
-#: src/components/tables/part/PartTable.tsx:69
+#: src/components/tables/part/PartTable.tsx:74
 msgid "Price Range"
 msgstr ""
 
-#: src/components/tables/part/PartTable.tsx:79
+#: src/components/tables/part/PartTable.tsx:84
 msgid "Link"
 msgstr ""
 
-#: src/components/tables/part/PartTable.tsx:92
+#: src/components/tables/part/PartTable.tsx:97
 msgid "Active"
 msgstr ""
 
-#: src/components/tables/part/PartTable.tsx:93
+#: src/components/tables/part/PartTable.tsx:98
 msgid "Filter by part active status"
 msgstr ""
 
-#: src/components/tables/part/PartTable.tsx:98
+#: src/components/tables/part/PartTable.tsx:103
 msgid "Assembly"
 msgstr ""
 
-#: src/components/tables/part/PartTable.tsx:99
+#: src/components/tables/part/PartTable.tsx:104
 msgid "Filter by assembly attribute"
 msgstr ""
 
-#: src/components/tables/part/PartTable.tsx:104
+#: src/components/tables/part/PartTable.tsx:109
 msgid "Include Subcategories"
 msgstr ""
 
-#: src/components/tables/part/PartTable.tsx:105
+#: src/components/tables/part/PartTable.tsx:110
 msgid "Include parts in subcategories"
 msgstr ""
 
-#: src/components/tables/part/PartTable.tsx:110
+#: src/components/tables/part/PartTable.tsx:115
 msgid "Component"
 msgstr ""
 
-#: src/components/tables/part/PartTable.tsx:111
+#: src/components/tables/part/PartTable.tsx:116
 msgid "Filter by component attribute"
 msgstr ""
 
-#: src/components/tables/part/PartTable.tsx:116
+#: src/components/tables/part/PartTable.tsx:121
 msgid "Trackable"
 msgstr ""
 
-#: src/components/tables/part/PartTable.tsx:117
+#: src/components/tables/part/PartTable.tsx:122
 msgid "Filter by trackable attribute"
 msgstr ""
 
-#: src/components/tables/part/PartTable.tsx:122
+#: src/components/tables/part/PartTable.tsx:127
 msgid "Has Units"
 msgstr ""
 
-#: src/components/tables/part/PartTable.tsx:123
+#: src/components/tables/part/PartTable.tsx:128
 msgid "Filter by parts which have units"
 msgstr ""
 
-#: src/components/tables/part/PartTable.tsx:128
+#: src/components/tables/part/PartTable.tsx:133
 msgid "Has IPN"
 msgstr ""
 
-#: src/components/tables/part/PartTable.tsx:129
+#: src/components/tables/part/PartTable.tsx:134
 msgid "Filter by parts which have an internal part number"
 msgstr ""
 
-#: src/components/tables/part/PartTable.tsx:134
+#: src/components/tables/part/PartTable.tsx:139
 msgid "Has Stock"
 msgstr ""
 
-#: src/components/tables/part/PartTable.tsx:135
+#: src/components/tables/part/PartTable.tsx:140
 msgid "Filter by parts which have stock"
 msgstr ""
 
-#: src/components/tables/part/PartTable.tsx:140
+#: src/components/tables/part/PartTable.tsx:145
 #: src/defaults/dashboardItems.tsx:41
 msgid "Low Stock"
 msgstr ""
 
-#: src/components/tables/part/PartTable.tsx:141
+#: src/components/tables/part/PartTable.tsx:146
 msgid "Filter by parts which have low stock"
 msgstr ""
 
-#: src/components/tables/part/PartTable.tsx:146
+#: src/components/tables/part/PartTable.tsx:151
 msgid "Purchaseable"
 msgstr ""
 
-#: src/components/tables/part/PartTable.tsx:147
+#: src/components/tables/part/PartTable.tsx:152
 msgid "Filter by parts which are purchaseable"
 msgstr ""
 
-#: src/components/tables/part/PartTable.tsx:152
+#: src/components/tables/part/PartTable.tsx:157
 msgid "Salable"
 msgstr ""
 
-#: src/components/tables/part/PartTable.tsx:153
+#: src/components/tables/part/PartTable.tsx:158
 msgid "Filter by parts which are salable"
 msgstr ""
 
-#: src/components/tables/part/PartTable.tsx:158
-#: src/components/tables/part/PartTable.tsx:162
+#: src/components/tables/part/PartTable.tsx:163
+#: src/components/tables/part/PartTable.tsx:167
 msgid "Virtual"
 msgstr ""
 
-#: src/components/tables/part/PartTable.tsx:159
+#: src/components/tables/part/PartTable.tsx:164
 msgid "Filter by parts which are virtual"
 msgstr ""
 
-#: src/components/tables/part/PartTable.tsx:163
+#: src/components/tables/part/PartTable.tsx:168
 msgid "Not Virtual"
 msgstr ""
 
-#: src/components/tables/stock/StockItemTable.tsx:57
+#: src/components/tables/part/PartTable.tsx:216
+msgid "Detail"
+msgstr ""
+
+#: src/components/tables/part/RelatedPartTable.tsx:61
+msgid "Add Related Part"
+msgstr ""
+
+#: src/components/tables/part/RelatedPartTable.tsx:69
+msgid "Related Part"
+msgstr ""
+
+#: src/components/tables/part/RelatedPartTable.tsx:72
+msgid "Related part added"
+msgstr ""
+
+#: src/components/tables/part/RelatedPartTable.tsx:82
+msgid "Add related part"
+msgstr ""
+
+#: src/components/tables/part/RelatedPartTable.tsx:104
+msgid "Delete Related Part"
+msgstr ""
+
+#: src/components/tables/part/RelatedPartTable.tsx:105
+msgid "Related part deleted"
+msgstr ""
+
+#: src/components/tables/part/RelatedPartTable.tsx:107
+msgid "Are you sure you want to remove this relationship?"
+msgstr ""
+
+#: src/components/tables/stock/StockItemTable.tsx:58
 msgid "Batch"
 msgstr ""
 
-#: src/components/tables/stock/StockItemTable.tsx:63
+#: src/components/tables/stock/StockItemTable.tsx:64
 msgid "Location"
 msgstr ""
 
-#: src/components/tables/stock/StockItemTable.tsx:80
-msgid "Actions"
-msgstr ""
-
-#: src/components/tables/stock/StockItemTable.tsx:124
+#: src/components/tables/stock/StockItemTable.tsx:100
 msgid "Test Filter"
 msgstr ""
 
-#: src/components/tables/stock/StockItemTable.tsx:125
+#: src/components/tables/stock/StockItemTable.tsx:101
 msgid "This is a test filter"
 msgstr ""
 
@@ -775,8 +908,16 @@ msgstr ""
 msgid "Getting started"
 msgstr ""
 
-#: src/components/widgets/WidgetLayout.tsx:134
-msgid "Loading"
+#: src/components/widgets/MarkdownEditor.tsx:109
+msgid "Failed to upload image"
+msgstr ""
+
+#: src/components/widgets/MarkdownEditor.tsx:147
+msgid "Notes saved"
+msgstr ""
+
+#: src/components/widgets/MarkdownEditor.tsx:155
+msgid "Failed to save notes"
 msgstr ""
 
 #: src/components/widgets/WidgetLayout.tsx:180
@@ -803,11 +944,6 @@ msgstr ""
 msgid "Show Boxes"
 msgstr ""
 
-#: src/contexts/ThemeContext.tsx:62
-#: src/pages/Index/Profile/UserPanel.tsx:107
-msgid "Submit"
-msgstr ""
-
 #: src/defaults/dashboardItems.tsx:6
 msgid "Subscribed Parts"
 msgstr ""
@@ -908,7 +1044,7 @@ msgstr ""
 
 #: src/defaults/links.tsx:31
 #: src/defaults/menuItems.tsx:25
-#: src/pages/Index/Playground.tsx:12
+#: src/pages/Index/Playground.tsx:87
 msgid "Playground"
 msgstr ""
 
@@ -1073,6 +1209,116 @@ msgstr ""
 msgid "Found an existing login - using it to log you in."
 msgstr ""
 
+#: src/functions/forms.tsx:48
+#: src/functions/forms.tsx:57
+#: src/functions/forms.tsx:137
+msgid "Form Error"
+msgstr ""
+
+#: src/functions/forms.tsx:49
+msgid "Form method not provided"
+msgstr ""
+
+#: src/functions/forms.tsx:58
+msgid "Response did not contain action data"
+msgstr ""
+
+#: src/functions/forms.tsx:96
+msgid "Invalid Form"
+msgstr ""
+
+#: src/functions/forms.tsx:97
+msgid "method parameter not supplied"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:57
+msgid "Add File"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:57
+msgid "Add Link"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:58
+msgid "File added"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:58
+msgid "Link added"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:100
+msgid "Edit File"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:100
+msgid "Edit Link"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:101
+msgid "File updated"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:101
+msgid "Link updated"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:127
+msgid "Delete Attachment"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:128
+msgid "Attachment deleted"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:132
+msgid "Are you sure you want to delete this attachment?"
+msgstr ""
+
+#: src/functions/forms/PartForms.tsx:76
+msgid "Create Part"
+msgstr ""
+
+#: src/functions/forms/PartForms.tsx:78
+msgid "Part created"
+msgstr ""
+
+#: src/functions/forms/PartForms.tsx:96
+msgid "Edit Part"
+msgstr ""
+
+#: src/functions/forms/PartForms.tsx:99
+msgid "Part updated"
+msgstr ""
+
+#: src/functions/forms/PartForms.tsx:111
+msgid "Parent part category"
+msgstr ""
+
+#: src/functions/forms/StockForms.tsx:30
+msgid "Add given quantity as packs instead of individual items"
+msgstr ""
+
+#: src/functions/forms/StockForms.tsx:39
+msgid "Enter initial quantity for this stock item"
+msgstr ""
+
+#: src/functions/forms/StockForms.tsx:44
+msgid "Serial Numbers"
+msgstr ""
+
+#: src/functions/forms/StockForms.tsx:45
+msgid "Enter serial numbers for new stock (or leave blank)"
+msgstr ""
+
+#: src/functions/forms/StockForms.tsx:90
+msgid "Create Stock Item"
+msgstr ""
+
+#: src/functions/forms/StockForms.tsx:104
+msgid "Edit Stock Item"
+msgstr ""
+
 #: src/functions/notifications.tsx:9
 msgid "Not implemented"
 msgstr ""
@@ -1081,6 +1327,22 @@ msgstr ""
 msgid "This feature is not yet implemented"
 msgstr ""
 
+#: src/functions/notifications.tsx:20
+msgid "Permission denied"
+msgstr ""
+
+#: src/functions/notifications.tsx:21
+msgid "You do not have permission to perform this action"
+msgstr ""
+
+#: src/functions/notifications.tsx:32
+msgid "Invalid Return Code"
+msgstr ""
+
+#: src/functions/notifications.tsx:33
+msgid "Server returned status {returnCode}"
+msgstr ""
+
 #: src/pages/Auth/Logged-In.tsx:18
 msgid "Checking if you are already logged in"
 msgstr ""
@@ -1141,7 +1403,7 @@ msgstr ""
 msgid "Welcome to your Dashboard{0}"
 msgstr ""
 
-#: src/pages/Index/Playground.tsx:17
+#: src/pages/Index/Playground.tsx:92
 msgid "This page is a showcase for the possibilities of Platform UI."
 msgstr ""
 
@@ -1356,6 +1618,54 @@ msgstr ""
 msgid "Go to the start page"
 msgstr ""
 
+#: src/pages/part/PartDetail.tsx:53
+msgid "Details"
+msgstr ""
+
+#: src/pages/part/PartDetail.tsx:65
+msgid "Variants"
+msgstr ""
+
+#: src/pages/part/PartDetail.tsx:72
+msgid "Bill of Materials"
+msgstr ""
+
+#: src/pages/part/PartDetail.tsx:86
+msgid "Used In"
+msgstr ""
+
+#: src/pages/part/PartDetail.tsx:93
+msgid "Pricing"
+msgstr ""
+
+#: src/pages/part/PartDetail.tsx:99
+msgid "Suppliers"
+msgstr ""
+
+#: src/pages/part/PartDetail.tsx:120
+msgid "Test Templates"
+msgstr ""
+
+#: src/pages/part/PartDetail.tsx:127
+msgid "Related Parts"
+msgstr ""
+
+#: src/pages/part/PartDetail.tsx:133
+msgid "Attachments"
+msgstr ""
+
+#: src/pages/part/PartDetail.tsx:139
+msgid "Notes"
+msgstr ""
+
+#: src/pages/part/PartIndex.tsx:29
+msgid "Categories"
+msgstr ""
+
+#: src/pages/part/PartIndex.tsx:35
+msgid "Parameters"
+msgstr ""
+
 #: src/views/MobileAppView.tsx:14
 msgid "Mobile viewport detected"
 msgstr ""
diff --git a/src/frontend/src/locales/pt/messages.po b/src/frontend/src/locales/pt/messages.po
index 2667e47ff3..e81145394f 100644
--- a/src/frontend/src/locales/pt/messages.po
+++ b/src/frontend/src/locales/pt/messages.po
@@ -8,7 +8,7 @@ msgstr ""
 "Language: pt\n"
 "Project-Id-Version: inventree\n"
 "Report-Msgid-Bugs-To: \n"
-"PO-Revision-Date: 2023-09-12 00:11\n"
+"PO-Revision-Date: 2023-09-14 01:15\n"
 "Last-Translator: \n"
 "Language-Team: Portuguese, Brazilian\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
@@ -23,6 +23,7 @@ msgid "Title"
 msgstr "Título"
 
 #: src/components/forms/ApiForm.tsx:189
+#: src/components/widgets/MarkdownEditor.tsx:146
 msgid "Success"
 msgstr "Sucesso"
 
@@ -158,6 +159,7 @@ msgid "Add Host"
 msgstr "Adicionar Host"
 
 #: src/components/forms/HostOptionsForm.tsx:89
+#: src/components/widgets/MarkdownEditor.tsx:73
 msgid "Save"
 msgstr "Salvar"
 
@@ -187,7 +189,9 @@ msgstr "Estado: <0>funcionário</0> ({0}), <1>extensões</1>{1}"
 
 #: src/components/forms/fields/ApiFormField.tsx:286
 #: src/components/nav/SearchDrawer.tsx:425
-#: src/components/tables/InvenTreeTable.tsx:368
+#: src/components/tables/InvenTreeTable.tsx:378
+#: src/components/widgets/MarkdownEditor.tsx:108
+#: src/components/widgets/MarkdownEditor.tsx:154
 #: src/pages/ErrorPage.tsx:12
 #: src/pages/ErrorPage.tsx:25
 msgid "Error"
@@ -211,7 +215,7 @@ msgid "Read More"
 msgstr "Leia Mais"
 
 #: src/components/items/ErrorItem.tsx:5
-#: src/components/tables/InvenTreeTable.tsx:360
+#: src/components/tables/InvenTreeTable.tsx:370
 msgid "Unknown error"
 msgstr "Erro desconhecido"
 
@@ -384,7 +388,7 @@ msgstr "Locais de estoque"
 
 #: src/components/nav/SearchDrawer.tsx:121
 #: src/pages/Index/Build.tsx:13
-#: src/pages/part/PartDetail.tsx:76
+#: src/pages/part/PartDetail.tsx:79
 msgid "Build Orders"
 msgstr "Ordens de Produções"
 
@@ -393,12 +397,12 @@ msgid "Companies"
 msgstr "Empresas"
 
 #: src/components/nav/SearchDrawer.tsx:140
-#: src/pages/part/PartDetail.tsx:103
+#: src/pages/part/PartDetail.tsx:106
 msgid "Purchase Orders"
 msgstr "Pedidos de compra"
 
 #: src/components/nav/SearchDrawer.tsx:150
-#: src/pages/part/PartDetail.tsx:110
+#: src/pages/part/PartDetail.tsx:113
 msgid "Sales Orders"
 msgstr "Pedidos de vendas"
 
@@ -446,6 +450,58 @@ msgstr "Modelo desconhecido: {model}"
 msgid "Shipment"
 msgstr "Remessa"
 
+#: src/components/tables/AttachmentTable.tsx:29
+msgid "Attachment"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:46
+msgid "Comment"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:55
+msgid "Uploaded"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:115
+#: src/components/tables/part/PartTable.tsx:203
+#: src/components/tables/stock/StockItemTable.tsx:124
+msgid "Edit"
+msgstr "Editar"
+
+#: src/components/tables/AttachmentTable.tsx:130
+#: src/components/tables/part/RelatedPartTable.tsx:97
+#: src/functions/forms.tsx:177
+msgid "Delete"
+msgstr "Excluir"
+
+#: src/components/tables/AttachmentTable.tsx:156
+msgid "File uploaded"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:157
+msgid "File {0} uploaded successfully"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:168
+msgid "Upload Error"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:169
+msgid "File could not be uploaded"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:182
+msgid "Add attachment"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:201
+msgid "Add external link"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:241
+msgid "Upload attachment"
+msgstr ""
+
 #: src/components/tables/ColumnSelect.tsx:17
 #: src/components/tables/ColumnSelect.tsx:24
 msgid "Select Columns"
@@ -523,41 +579,42 @@ msgstr "Adicionar Filtro"
 msgid "No records found"
 msgstr "Nenhum registro encontrado"
 
-#: src/components/tables/InvenTreeTable.tsx:347
+#: src/components/tables/InvenTreeTable.tsx:357
 msgid "Bad request"
 msgstr "Requisição inválida"
 
-#: src/components/tables/InvenTreeTable.tsx:350
+#: src/components/tables/InvenTreeTable.tsx:360
 msgid "Unauthorized"
 msgstr "Não autorizado"
 
-#: src/components/tables/InvenTreeTable.tsx:353
+#: src/components/tables/InvenTreeTable.tsx:363
 msgid "Forbidden"
 msgstr "Proibido"
 
-#: src/components/tables/InvenTreeTable.tsx:356
+#: src/components/tables/InvenTreeTable.tsx:366
 msgid "Not found"
 msgstr "Não encontrado"
 
-#: src/components/tables/InvenTreeTable.tsx:405
-#: src/components/tables/InvenTreeTable.tsx:406
+#: src/components/tables/InvenTreeTable.tsx:427
+#: src/components/tables/InvenTreeTable.tsx:428
 msgid "Barcode actions"
 msgstr "Ações de código de barras"
 
-#: src/components/tables/InvenTreeTable.tsx:413
-#: src/components/tables/InvenTreeTable.tsx:414
+#: src/components/tables/InvenTreeTable.tsx:435
+#: src/components/tables/InvenTreeTable.tsx:436
 msgid "Print actions"
 msgstr "Ações de impressão"
 
-#: src/components/tables/InvenTreeTable.tsx:431
+#: src/components/tables/InvenTreeTable.tsx:453
 msgid "Refresh data"
 msgstr "Atualizar dados"
 
-#: src/components/tables/InvenTreeTable.tsx:449
+#: src/components/tables/InvenTreeTable.tsx:471
 msgid "Table filters"
 msgstr "Filtros da Tabela"
 
-#: src/components/tables/RowActions.tsx:35
+#: src/components/tables/RowActions.tsx:33
+#: src/components/tables/RowActions.tsx:40
 msgid "Actions"
 msgstr "Ações"
 
@@ -567,12 +624,14 @@ msgstr "Referência"
 
 #: src/components/tables/build/BuildOrderTable.tsx:24
 #: src/components/tables/part/PartTable.tsx:25
+#: src/components/tables/part/RelatedPartTable.tsx:31
 #: src/components/tables/stock/StockItemTable.tsx:22
 msgid "Part"
 msgstr "Peça"
 
 #: src/components/tables/build/BuildOrderTable.tsx:41
 #: src/components/tables/part/PartTable.tsx:51
+#: src/components/tables/part/RelatedPartTable.tsx:49
 #: src/components/tables/stock/StockItemTable.tsx:38
 msgid "Description"
 msgstr "Descrição"
@@ -617,7 +676,7 @@ msgstr "Categoria"
 #: src/components/tables/part/PartTable.tsx:68
 #: src/components/tables/stock/StockItemTable.tsx:43
 #: src/defaults/links.tsx:27
-#: src/pages/part/PartDetail.tsx:56
+#: src/pages/part/PartDetail.tsx:59
 msgid "Stock"
 msgstr "Estoque"
 
@@ -731,15 +790,38 @@ msgstr "Filtrar por peças que são virtuais"
 msgid "Not Virtual"
 msgstr "Não é Virtual"
 
-#: src/components/tables/part/PartTable.tsx:203
-#: src/components/tables/stock/StockItemTable.tsx:124
-msgid "Edit"
-msgstr "Editar"
-
 #: src/components/tables/part/PartTable.tsx:216
 msgid "Detail"
 msgstr "Detalhe"
 
+#: src/components/tables/part/RelatedPartTable.tsx:61
+msgid "Add Related Part"
+msgstr ""
+
+#: src/components/tables/part/RelatedPartTable.tsx:69
+msgid "Related Part"
+msgstr ""
+
+#: src/components/tables/part/RelatedPartTable.tsx:72
+msgid "Related part added"
+msgstr ""
+
+#: src/components/tables/part/RelatedPartTable.tsx:82
+msgid "Add related part"
+msgstr ""
+
+#: src/components/tables/part/RelatedPartTable.tsx:104
+msgid "Delete Related Part"
+msgstr ""
+
+#: src/components/tables/part/RelatedPartTable.tsx:105
+msgid "Related part deleted"
+msgstr ""
+
+#: src/components/tables/part/RelatedPartTable.tsx:107
+msgid "Are you sure you want to remove this relationship?"
+msgstr ""
+
 #: src/components/tables/stock/StockItemTable.tsx:58
 msgid "Batch"
 msgstr "Lote"
@@ -787,6 +869,18 @@ msgstr "Forneça Avaliação"
 msgid "Getting started"
 msgstr "Iniciando"
 
+#: src/components/widgets/MarkdownEditor.tsx:109
+msgid "Failed to upload image"
+msgstr ""
+
+#: src/components/widgets/MarkdownEditor.tsx:147
+msgid "Notes saved"
+msgstr ""
+
+#: src/components/widgets/MarkdownEditor.tsx:155
+msgid "Failed to save notes"
+msgstr ""
+
 #: src/components/widgets/WidgetLayout.tsx:180
 msgid "Layout"
 msgstr "Disposição"
@@ -1098,9 +1192,49 @@ msgstr "Formulário inválido"
 msgid "method parameter not supplied"
 msgstr "parâmetro do método não fornecido"
 
-#: src/functions/forms.tsx:177
-msgid "Delete"
-msgstr "Excluir"
+#: src/functions/forms/AttachmentForms.tsx:57
+msgid "Add File"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:57
+msgid "Add Link"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:58
+msgid "File added"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:58
+msgid "Link added"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:100
+msgid "Edit File"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:100
+msgid "Edit Link"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:101
+msgid "File updated"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:101
+msgid "Link updated"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:127
+msgid "Delete Attachment"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:128
+msgid "Attachment deleted"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:132
+msgid "Are you sure you want to delete this attachment?"
+msgstr ""
 
 #: src/functions/forms/PartForms.tsx:76
 msgid "Create Part"
@@ -1445,43 +1579,43 @@ msgstr "Desculpe, esta página não é conhecida ou foi movida."
 msgid "Go to the start page"
 msgstr "Ir para a página inicial"
 
-#: src/pages/part/PartDetail.tsx:50
+#: src/pages/part/PartDetail.tsx:53
 msgid "Details"
 msgstr "Detalhes"
 
-#: src/pages/part/PartDetail.tsx:62
+#: src/pages/part/PartDetail.tsx:65
 msgid "Variants"
 msgstr "Variantes"
 
-#: src/pages/part/PartDetail.tsx:69
+#: src/pages/part/PartDetail.tsx:72
 msgid "Bill of Materials"
 msgstr "Lista de Materiais"
 
-#: src/pages/part/PartDetail.tsx:83
+#: src/pages/part/PartDetail.tsx:86
 msgid "Used In"
 msgstr "Usado em"
 
-#: src/pages/part/PartDetail.tsx:90
+#: src/pages/part/PartDetail.tsx:93
 msgid "Pricing"
 msgstr "Preços"
 
-#: src/pages/part/PartDetail.tsx:96
+#: src/pages/part/PartDetail.tsx:99
 msgid "Suppliers"
 msgstr "Fornecedores"
 
-#: src/pages/part/PartDetail.tsx:117
+#: src/pages/part/PartDetail.tsx:120
 msgid "Test Templates"
 msgstr "Testar Modelos"
 
-#: src/pages/part/PartDetail.tsx:124
+#: src/pages/part/PartDetail.tsx:127
 msgid "Related Parts"
 msgstr "Peças Relacionadas"
 
-#: src/pages/part/PartDetail.tsx:130
+#: src/pages/part/PartDetail.tsx:133
 msgid "Attachments"
 msgstr "Anexos"
 
-#: src/pages/part/PartDetail.tsx:136
+#: src/pages/part/PartDetail.tsx:139
 msgid "Notes"
 msgstr "Anotações"
 
diff --git a/src/frontend/src/locales/ru/messages.po b/src/frontend/src/locales/ru/messages.po
index ce2a73a2ee..47cce84341 100644
--- a/src/frontend/src/locales/ru/messages.po
+++ b/src/frontend/src/locales/ru/messages.po
@@ -8,7 +8,7 @@ msgstr ""
 "Language: ru\n"
 "Project-Id-Version: inventree\n"
 "Report-Msgid-Bugs-To: \n"
-"PO-Revision-Date: 2023-09-12 00:10\n"
+"PO-Revision-Date: 2023-09-14 01:15\n"
 "Last-Translator: \n"
 "Language-Team: Russian\n"
 "Plural-Forms: nplurals=4; plural=((n%10==1 && n%100!=11) ? 0 : ((n%10 >= 2 && n%10 <=4 && (n%100 < 12 || n%100 > 14)) ? 1 : ((n%10 == 0 || (n%10 >= 5 && n%10 <=9)) || (n%100 >= 11 && n%100 <= 14)) ? 2 : 3));\n"
@@ -23,6 +23,7 @@ msgid "Title"
 msgstr "Заголовок"
 
 #: src/components/forms/ApiForm.tsx:189
+#: src/components/widgets/MarkdownEditor.tsx:146
 msgid "Success"
 msgstr ""
 
@@ -158,6 +159,7 @@ msgid "Add Host"
 msgstr ""
 
 #: src/components/forms/HostOptionsForm.tsx:89
+#: src/components/widgets/MarkdownEditor.tsx:73
 msgid "Save"
 msgstr ""
 
@@ -187,7 +189,9 @@ msgstr ""
 
 #: src/components/forms/fields/ApiFormField.tsx:286
 #: src/components/nav/SearchDrawer.tsx:425
-#: src/components/tables/InvenTreeTable.tsx:368
+#: src/components/tables/InvenTreeTable.tsx:378
+#: src/components/widgets/MarkdownEditor.tsx:108
+#: src/components/widgets/MarkdownEditor.tsx:154
 #: src/pages/ErrorPage.tsx:12
 #: src/pages/ErrorPage.tsx:25
 msgid "Error"
@@ -211,7 +215,7 @@ msgid "Read More"
 msgstr ""
 
 #: src/components/items/ErrorItem.tsx:5
-#: src/components/tables/InvenTreeTable.tsx:360
+#: src/components/tables/InvenTreeTable.tsx:370
 msgid "Unknown error"
 msgstr ""
 
@@ -384,7 +388,7 @@ msgstr ""
 
 #: src/components/nav/SearchDrawer.tsx:121
 #: src/pages/Index/Build.tsx:13
-#: src/pages/part/PartDetail.tsx:76
+#: src/pages/part/PartDetail.tsx:79
 msgid "Build Orders"
 msgstr "Заказы на сборку"
 
@@ -393,12 +397,12 @@ msgid "Companies"
 msgstr ""
 
 #: src/components/nav/SearchDrawer.tsx:140
-#: src/pages/part/PartDetail.tsx:103
+#: src/pages/part/PartDetail.tsx:106
 msgid "Purchase Orders"
 msgstr ""
 
 #: src/components/nav/SearchDrawer.tsx:150
-#: src/pages/part/PartDetail.tsx:110
+#: src/pages/part/PartDetail.tsx:113
 msgid "Sales Orders"
 msgstr ""
 
@@ -446,6 +450,58 @@ msgstr ""
 msgid "Shipment"
 msgstr ""
 
+#: src/components/tables/AttachmentTable.tsx:29
+msgid "Attachment"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:46
+msgid "Comment"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:55
+msgid "Uploaded"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:115
+#: src/components/tables/part/PartTable.tsx:203
+#: src/components/tables/stock/StockItemTable.tsx:124
+msgid "Edit"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:130
+#: src/components/tables/part/RelatedPartTable.tsx:97
+#: src/functions/forms.tsx:177
+msgid "Delete"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:156
+msgid "File uploaded"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:157
+msgid "File {0} uploaded successfully"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:168
+msgid "Upload Error"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:169
+msgid "File could not be uploaded"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:182
+msgid "Add attachment"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:201
+msgid "Add external link"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:241
+msgid "Upload attachment"
+msgstr ""
+
 #: src/components/tables/ColumnSelect.tsx:17
 #: src/components/tables/ColumnSelect.tsx:24
 msgid "Select Columns"
@@ -523,41 +579,42 @@ msgstr ""
 msgid "No records found"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:347
+#: src/components/tables/InvenTreeTable.tsx:357
 msgid "Bad request"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:350
+#: src/components/tables/InvenTreeTable.tsx:360
 msgid "Unauthorized"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:353
+#: src/components/tables/InvenTreeTable.tsx:363
 msgid "Forbidden"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:356
+#: src/components/tables/InvenTreeTable.tsx:366
 msgid "Not found"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:405
-#: src/components/tables/InvenTreeTable.tsx:406
+#: src/components/tables/InvenTreeTable.tsx:427
+#: src/components/tables/InvenTreeTable.tsx:428
 msgid "Barcode actions"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:413
-#: src/components/tables/InvenTreeTable.tsx:414
+#: src/components/tables/InvenTreeTable.tsx:435
+#: src/components/tables/InvenTreeTable.tsx:436
 msgid "Print actions"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:431
+#: src/components/tables/InvenTreeTable.tsx:453
 msgid "Refresh data"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:449
+#: src/components/tables/InvenTreeTable.tsx:471
 msgid "Table filters"
 msgstr ""
 
-#: src/components/tables/RowActions.tsx:35
+#: src/components/tables/RowActions.tsx:33
+#: src/components/tables/RowActions.tsx:40
 msgid "Actions"
 msgstr ""
 
@@ -567,12 +624,14 @@ msgstr ""
 
 #: src/components/tables/build/BuildOrderTable.tsx:24
 #: src/components/tables/part/PartTable.tsx:25
+#: src/components/tables/part/RelatedPartTable.tsx:31
 #: src/components/tables/stock/StockItemTable.tsx:22
 msgid "Part"
 msgstr ""
 
 #: src/components/tables/build/BuildOrderTable.tsx:41
 #: src/components/tables/part/PartTable.tsx:51
+#: src/components/tables/part/RelatedPartTable.tsx:49
 #: src/components/tables/stock/StockItemTable.tsx:38
 msgid "Description"
 msgstr ""
@@ -617,7 +676,7 @@ msgstr ""
 #: src/components/tables/part/PartTable.tsx:68
 #: src/components/tables/stock/StockItemTable.tsx:43
 #: src/defaults/links.tsx:27
-#: src/pages/part/PartDetail.tsx:56
+#: src/pages/part/PartDetail.tsx:59
 msgid "Stock"
 msgstr ""
 
@@ -731,15 +790,38 @@ msgstr ""
 msgid "Not Virtual"
 msgstr ""
 
-#: src/components/tables/part/PartTable.tsx:203
-#: src/components/tables/stock/StockItemTable.tsx:124
-msgid "Edit"
-msgstr ""
-
 #: src/components/tables/part/PartTable.tsx:216
 msgid "Detail"
 msgstr ""
 
+#: src/components/tables/part/RelatedPartTable.tsx:61
+msgid "Add Related Part"
+msgstr ""
+
+#: src/components/tables/part/RelatedPartTable.tsx:69
+msgid "Related Part"
+msgstr ""
+
+#: src/components/tables/part/RelatedPartTable.tsx:72
+msgid "Related part added"
+msgstr ""
+
+#: src/components/tables/part/RelatedPartTable.tsx:82
+msgid "Add related part"
+msgstr ""
+
+#: src/components/tables/part/RelatedPartTable.tsx:104
+msgid "Delete Related Part"
+msgstr ""
+
+#: src/components/tables/part/RelatedPartTable.tsx:105
+msgid "Related part deleted"
+msgstr ""
+
+#: src/components/tables/part/RelatedPartTable.tsx:107
+msgid "Are you sure you want to remove this relationship?"
+msgstr ""
+
 #: src/components/tables/stock/StockItemTable.tsx:58
 msgid "Batch"
 msgstr ""
@@ -787,6 +869,18 @@ msgstr ""
 msgid "Getting started"
 msgstr ""
 
+#: src/components/widgets/MarkdownEditor.tsx:109
+msgid "Failed to upload image"
+msgstr ""
+
+#: src/components/widgets/MarkdownEditor.tsx:147
+msgid "Notes saved"
+msgstr ""
+
+#: src/components/widgets/MarkdownEditor.tsx:155
+msgid "Failed to save notes"
+msgstr ""
+
 #: src/components/widgets/WidgetLayout.tsx:180
 msgid "Layout"
 msgstr ""
@@ -1098,8 +1192,48 @@ msgstr ""
 msgid "method parameter not supplied"
 msgstr ""
 
-#: src/functions/forms.tsx:177
-msgid "Delete"
+#: src/functions/forms/AttachmentForms.tsx:57
+msgid "Add File"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:57
+msgid "Add Link"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:58
+msgid "File added"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:58
+msgid "Link added"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:100
+msgid "Edit File"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:100
+msgid "Edit Link"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:101
+msgid "File updated"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:101
+msgid "Link updated"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:127
+msgid "Delete Attachment"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:128
+msgid "Attachment deleted"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:132
+msgid "Are you sure you want to delete this attachment?"
 msgstr ""
 
 #: src/functions/forms/PartForms.tsx:76
@@ -1445,43 +1579,43 @@ msgstr ""
 msgid "Go to the start page"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:50
+#: src/pages/part/PartDetail.tsx:53
 msgid "Details"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:62
+#: src/pages/part/PartDetail.tsx:65
 msgid "Variants"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:69
+#: src/pages/part/PartDetail.tsx:72
 msgid "Bill of Materials"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:83
+#: src/pages/part/PartDetail.tsx:86
 msgid "Used In"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:90
+#: src/pages/part/PartDetail.tsx:93
 msgid "Pricing"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:96
+#: src/pages/part/PartDetail.tsx:99
 msgid "Suppliers"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:117
+#: src/pages/part/PartDetail.tsx:120
 msgid "Test Templates"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:124
+#: src/pages/part/PartDetail.tsx:127
 msgid "Related Parts"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:130
+#: src/pages/part/PartDetail.tsx:133
 msgid "Attachments"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:136
+#: src/pages/part/PartDetail.tsx:139
 msgid "Notes"
 msgstr ""
 
diff --git a/src/frontend/src/locales/sl/messages.po b/src/frontend/src/locales/sl/messages.po
index e245956dea..40c221f187 100644
--- a/src/frontend/src/locales/sl/messages.po
+++ b/src/frontend/src/locales/sl/messages.po
@@ -8,7 +8,7 @@ msgstr ""
 "Language: sl\n"
 "Project-Id-Version: inventree\n"
 "Report-Msgid-Bugs-To: \n"
-"PO-Revision-Date: 2023-09-12 00:10\n"
+"PO-Revision-Date: 2023-09-14 01:15\n"
 "Last-Translator: \n"
 "Language-Team: Slovenian\n"
 "Plural-Forms: nplurals=4; plural=(n%100==1 ? 1 : n%100==2 ? 2 : n%100==3 || n%100==4 ? 3 : 0);\n"
@@ -23,6 +23,7 @@ msgid "Title"
 msgstr ""
 
 #: src/components/forms/ApiForm.tsx:189
+#: src/components/widgets/MarkdownEditor.tsx:146
 msgid "Success"
 msgstr ""
 
@@ -158,6 +159,7 @@ msgid "Add Host"
 msgstr ""
 
 #: src/components/forms/HostOptionsForm.tsx:89
+#: src/components/widgets/MarkdownEditor.tsx:73
 msgid "Save"
 msgstr ""
 
@@ -187,7 +189,9 @@ msgstr ""
 
 #: src/components/forms/fields/ApiFormField.tsx:286
 #: src/components/nav/SearchDrawer.tsx:425
-#: src/components/tables/InvenTreeTable.tsx:368
+#: src/components/tables/InvenTreeTable.tsx:378
+#: src/components/widgets/MarkdownEditor.tsx:108
+#: src/components/widgets/MarkdownEditor.tsx:154
 #: src/pages/ErrorPage.tsx:12
 #: src/pages/ErrorPage.tsx:25
 msgid "Error"
@@ -211,7 +215,7 @@ msgid "Read More"
 msgstr ""
 
 #: src/components/items/ErrorItem.tsx:5
-#: src/components/tables/InvenTreeTable.tsx:360
+#: src/components/tables/InvenTreeTable.tsx:370
 msgid "Unknown error"
 msgstr ""
 
@@ -384,7 +388,7 @@ msgstr ""
 
 #: src/components/nav/SearchDrawer.tsx:121
 #: src/pages/Index/Build.tsx:13
-#: src/pages/part/PartDetail.tsx:76
+#: src/pages/part/PartDetail.tsx:79
 msgid "Build Orders"
 msgstr ""
 
@@ -393,12 +397,12 @@ msgid "Companies"
 msgstr ""
 
 #: src/components/nav/SearchDrawer.tsx:140
-#: src/pages/part/PartDetail.tsx:103
+#: src/pages/part/PartDetail.tsx:106
 msgid "Purchase Orders"
 msgstr ""
 
 #: src/components/nav/SearchDrawer.tsx:150
-#: src/pages/part/PartDetail.tsx:110
+#: src/pages/part/PartDetail.tsx:113
 msgid "Sales Orders"
 msgstr ""
 
@@ -446,6 +450,58 @@ msgstr ""
 msgid "Shipment"
 msgstr ""
 
+#: src/components/tables/AttachmentTable.tsx:29
+msgid "Attachment"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:46
+msgid "Comment"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:55
+msgid "Uploaded"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:115
+#: src/components/tables/part/PartTable.tsx:203
+#: src/components/tables/stock/StockItemTable.tsx:124
+msgid "Edit"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:130
+#: src/components/tables/part/RelatedPartTable.tsx:97
+#: src/functions/forms.tsx:177
+msgid "Delete"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:156
+msgid "File uploaded"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:157
+msgid "File {0} uploaded successfully"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:168
+msgid "Upload Error"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:169
+msgid "File could not be uploaded"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:182
+msgid "Add attachment"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:201
+msgid "Add external link"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:241
+msgid "Upload attachment"
+msgstr ""
+
 #: src/components/tables/ColumnSelect.tsx:17
 #: src/components/tables/ColumnSelect.tsx:24
 msgid "Select Columns"
@@ -523,41 +579,42 @@ msgstr ""
 msgid "No records found"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:347
+#: src/components/tables/InvenTreeTable.tsx:357
 msgid "Bad request"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:350
+#: src/components/tables/InvenTreeTable.tsx:360
 msgid "Unauthorized"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:353
+#: src/components/tables/InvenTreeTable.tsx:363
 msgid "Forbidden"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:356
+#: src/components/tables/InvenTreeTable.tsx:366
 msgid "Not found"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:405
-#: src/components/tables/InvenTreeTable.tsx:406
+#: src/components/tables/InvenTreeTable.tsx:427
+#: src/components/tables/InvenTreeTable.tsx:428
 msgid "Barcode actions"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:413
-#: src/components/tables/InvenTreeTable.tsx:414
+#: src/components/tables/InvenTreeTable.tsx:435
+#: src/components/tables/InvenTreeTable.tsx:436
 msgid "Print actions"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:431
+#: src/components/tables/InvenTreeTable.tsx:453
 msgid "Refresh data"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:449
+#: src/components/tables/InvenTreeTable.tsx:471
 msgid "Table filters"
 msgstr ""
 
-#: src/components/tables/RowActions.tsx:35
+#: src/components/tables/RowActions.tsx:33
+#: src/components/tables/RowActions.tsx:40
 msgid "Actions"
 msgstr ""
 
@@ -567,12 +624,14 @@ msgstr ""
 
 #: src/components/tables/build/BuildOrderTable.tsx:24
 #: src/components/tables/part/PartTable.tsx:25
+#: src/components/tables/part/RelatedPartTable.tsx:31
 #: src/components/tables/stock/StockItemTable.tsx:22
 msgid "Part"
 msgstr ""
 
 #: src/components/tables/build/BuildOrderTable.tsx:41
 #: src/components/tables/part/PartTable.tsx:51
+#: src/components/tables/part/RelatedPartTable.tsx:49
 #: src/components/tables/stock/StockItemTable.tsx:38
 msgid "Description"
 msgstr ""
@@ -617,7 +676,7 @@ msgstr ""
 #: src/components/tables/part/PartTable.tsx:68
 #: src/components/tables/stock/StockItemTable.tsx:43
 #: src/defaults/links.tsx:27
-#: src/pages/part/PartDetail.tsx:56
+#: src/pages/part/PartDetail.tsx:59
 msgid "Stock"
 msgstr ""
 
@@ -731,15 +790,38 @@ msgstr ""
 msgid "Not Virtual"
 msgstr ""
 
-#: src/components/tables/part/PartTable.tsx:203
-#: src/components/tables/stock/StockItemTable.tsx:124
-msgid "Edit"
-msgstr ""
-
 #: src/components/tables/part/PartTable.tsx:216
 msgid "Detail"
 msgstr ""
 
+#: src/components/tables/part/RelatedPartTable.tsx:61
+msgid "Add Related Part"
+msgstr ""
+
+#: src/components/tables/part/RelatedPartTable.tsx:69
+msgid "Related Part"
+msgstr ""
+
+#: src/components/tables/part/RelatedPartTable.tsx:72
+msgid "Related part added"
+msgstr ""
+
+#: src/components/tables/part/RelatedPartTable.tsx:82
+msgid "Add related part"
+msgstr ""
+
+#: src/components/tables/part/RelatedPartTable.tsx:104
+msgid "Delete Related Part"
+msgstr ""
+
+#: src/components/tables/part/RelatedPartTable.tsx:105
+msgid "Related part deleted"
+msgstr ""
+
+#: src/components/tables/part/RelatedPartTable.tsx:107
+msgid "Are you sure you want to remove this relationship?"
+msgstr ""
+
 #: src/components/tables/stock/StockItemTable.tsx:58
 msgid "Batch"
 msgstr ""
@@ -787,6 +869,18 @@ msgstr ""
 msgid "Getting started"
 msgstr ""
 
+#: src/components/widgets/MarkdownEditor.tsx:109
+msgid "Failed to upload image"
+msgstr ""
+
+#: src/components/widgets/MarkdownEditor.tsx:147
+msgid "Notes saved"
+msgstr ""
+
+#: src/components/widgets/MarkdownEditor.tsx:155
+msgid "Failed to save notes"
+msgstr ""
+
 #: src/components/widgets/WidgetLayout.tsx:180
 msgid "Layout"
 msgstr ""
@@ -1098,8 +1192,48 @@ msgstr ""
 msgid "method parameter not supplied"
 msgstr ""
 
-#: src/functions/forms.tsx:177
-msgid "Delete"
+#: src/functions/forms/AttachmentForms.tsx:57
+msgid "Add File"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:57
+msgid "Add Link"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:58
+msgid "File added"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:58
+msgid "Link added"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:100
+msgid "Edit File"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:100
+msgid "Edit Link"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:101
+msgid "File updated"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:101
+msgid "Link updated"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:127
+msgid "Delete Attachment"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:128
+msgid "Attachment deleted"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:132
+msgid "Are you sure you want to delete this attachment?"
 msgstr ""
 
 #: src/functions/forms/PartForms.tsx:76
@@ -1445,43 +1579,43 @@ msgstr ""
 msgid "Go to the start page"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:50
+#: src/pages/part/PartDetail.tsx:53
 msgid "Details"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:62
+#: src/pages/part/PartDetail.tsx:65
 msgid "Variants"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:69
+#: src/pages/part/PartDetail.tsx:72
 msgid "Bill of Materials"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:83
+#: src/pages/part/PartDetail.tsx:86
 msgid "Used In"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:90
+#: src/pages/part/PartDetail.tsx:93
 msgid "Pricing"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:96
+#: src/pages/part/PartDetail.tsx:99
 msgid "Suppliers"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:117
+#: src/pages/part/PartDetail.tsx:120
 msgid "Test Templates"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:124
+#: src/pages/part/PartDetail.tsx:127
 msgid "Related Parts"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:130
+#: src/pages/part/PartDetail.tsx:133
 msgid "Attachments"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:136
+#: src/pages/part/PartDetail.tsx:139
 msgid "Notes"
 msgstr ""
 
diff --git a/src/frontend/src/locales/sv/messages.po b/src/frontend/src/locales/sv/messages.po
index 4f34b12d11..246a2f226a 100644
--- a/src/frontend/src/locales/sv/messages.po
+++ b/src/frontend/src/locales/sv/messages.po
@@ -8,7 +8,7 @@ msgstr ""
 "Language: sv\n"
 "Project-Id-Version: inventree\n"
 "Report-Msgid-Bugs-To: \n"
-"PO-Revision-Date: 2023-09-12 00:10\n"
+"PO-Revision-Date: 2023-09-14 01:15\n"
 "Last-Translator: \n"
 "Language-Team: Swedish\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
@@ -23,6 +23,7 @@ msgid "Title"
 msgstr "Titel"
 
 #: src/components/forms/ApiForm.tsx:189
+#: src/components/widgets/MarkdownEditor.tsx:146
 msgid "Success"
 msgstr ""
 
@@ -158,6 +159,7 @@ msgid "Add Host"
 msgstr "Lägg till värd"
 
 #: src/components/forms/HostOptionsForm.tsx:89
+#: src/components/widgets/MarkdownEditor.tsx:73
 msgid "Save"
 msgstr "Spara"
 
@@ -187,7 +189,9 @@ msgstr ""
 
 #: src/components/forms/fields/ApiFormField.tsx:286
 #: src/components/nav/SearchDrawer.tsx:425
-#: src/components/tables/InvenTreeTable.tsx:368
+#: src/components/tables/InvenTreeTable.tsx:378
+#: src/components/widgets/MarkdownEditor.tsx:108
+#: src/components/widgets/MarkdownEditor.tsx:154
 #: src/pages/ErrorPage.tsx:12
 #: src/pages/ErrorPage.tsx:25
 msgid "Error"
@@ -211,7 +215,7 @@ msgid "Read More"
 msgstr "Läs mer"
 
 #: src/components/items/ErrorItem.tsx:5
-#: src/components/tables/InvenTreeTable.tsx:360
+#: src/components/tables/InvenTreeTable.tsx:370
 msgid "Unknown error"
 msgstr "Okänt fel"
 
@@ -384,7 +388,7 @@ msgstr "Lagerplats"
 
 #: src/components/nav/SearchDrawer.tsx:121
 #: src/pages/Index/Build.tsx:13
-#: src/pages/part/PartDetail.tsx:76
+#: src/pages/part/PartDetail.tsx:79
 msgid "Build Orders"
 msgstr "Byggordrar"
 
@@ -393,12 +397,12 @@ msgid "Companies"
 msgstr "Företag"
 
 #: src/components/nav/SearchDrawer.tsx:140
-#: src/pages/part/PartDetail.tsx:103
+#: src/pages/part/PartDetail.tsx:106
 msgid "Purchase Orders"
 msgstr "Inköpsorder"
 
 #: src/components/nav/SearchDrawer.tsx:150
-#: src/pages/part/PartDetail.tsx:110
+#: src/pages/part/PartDetail.tsx:113
 msgid "Sales Orders"
 msgstr "Försäljningsorder"
 
@@ -446,6 +450,58 @@ msgstr ""
 msgid "Shipment"
 msgstr ""
 
+#: src/components/tables/AttachmentTable.tsx:29
+msgid "Attachment"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:46
+msgid "Comment"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:55
+msgid "Uploaded"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:115
+#: src/components/tables/part/PartTable.tsx:203
+#: src/components/tables/stock/StockItemTable.tsx:124
+msgid "Edit"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:130
+#: src/components/tables/part/RelatedPartTable.tsx:97
+#: src/functions/forms.tsx:177
+msgid "Delete"
+msgstr "Radera"
+
+#: src/components/tables/AttachmentTable.tsx:156
+msgid "File uploaded"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:157
+msgid "File {0} uploaded successfully"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:168
+msgid "Upload Error"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:169
+msgid "File could not be uploaded"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:182
+msgid "Add attachment"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:201
+msgid "Add external link"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:241
+msgid "Upload attachment"
+msgstr ""
+
 #: src/components/tables/ColumnSelect.tsx:17
 #: src/components/tables/ColumnSelect.tsx:24
 msgid "Select Columns"
@@ -523,41 +579,42 @@ msgstr "Lägg till filter"
 msgid "No records found"
 msgstr "Inga resultat hittades"
 
-#: src/components/tables/InvenTreeTable.tsx:347
+#: src/components/tables/InvenTreeTable.tsx:357
 msgid "Bad request"
 msgstr "Felaktig begäran"
 
-#: src/components/tables/InvenTreeTable.tsx:350
+#: src/components/tables/InvenTreeTable.tsx:360
 msgid "Unauthorized"
 msgstr "Ej behörig"
 
-#: src/components/tables/InvenTreeTable.tsx:353
+#: src/components/tables/InvenTreeTable.tsx:363
 msgid "Forbidden"
 msgstr "Otillåten"
 
-#: src/components/tables/InvenTreeTable.tsx:356
+#: src/components/tables/InvenTreeTable.tsx:366
 msgid "Not found"
 msgstr "Hittades inte"
 
-#: src/components/tables/InvenTreeTable.tsx:405
-#: src/components/tables/InvenTreeTable.tsx:406
+#: src/components/tables/InvenTreeTable.tsx:427
+#: src/components/tables/InvenTreeTable.tsx:428
 msgid "Barcode actions"
 msgstr "Streckkods åtgärder"
 
-#: src/components/tables/InvenTreeTable.tsx:413
-#: src/components/tables/InvenTreeTable.tsx:414
+#: src/components/tables/InvenTreeTable.tsx:435
+#: src/components/tables/InvenTreeTable.tsx:436
 msgid "Print actions"
 msgstr "Skriv ut åtgärder"
 
-#: src/components/tables/InvenTreeTable.tsx:431
+#: src/components/tables/InvenTreeTable.tsx:453
 msgid "Refresh data"
 msgstr "Uppdatera data"
 
-#: src/components/tables/InvenTreeTable.tsx:449
+#: src/components/tables/InvenTreeTable.tsx:471
 msgid "Table filters"
 msgstr "Tabellfilter"
 
-#: src/components/tables/RowActions.tsx:35
+#: src/components/tables/RowActions.tsx:33
+#: src/components/tables/RowActions.tsx:40
 msgid "Actions"
 msgstr "Åtgärder"
 
@@ -567,12 +624,14 @@ msgstr "Referens"
 
 #: src/components/tables/build/BuildOrderTable.tsx:24
 #: src/components/tables/part/PartTable.tsx:25
+#: src/components/tables/part/RelatedPartTable.tsx:31
 #: src/components/tables/stock/StockItemTable.tsx:22
 msgid "Part"
 msgstr "Artkel"
 
 #: src/components/tables/build/BuildOrderTable.tsx:41
 #: src/components/tables/part/PartTable.tsx:51
+#: src/components/tables/part/RelatedPartTable.tsx:49
 #: src/components/tables/stock/StockItemTable.tsx:38
 msgid "Description"
 msgstr "Beskrivning"
@@ -617,7 +676,7 @@ msgstr "Kategori"
 #: src/components/tables/part/PartTable.tsx:68
 #: src/components/tables/stock/StockItemTable.tsx:43
 #: src/defaults/links.tsx:27
-#: src/pages/part/PartDetail.tsx:56
+#: src/pages/part/PartDetail.tsx:59
 msgid "Stock"
 msgstr "Lagersaldo"
 
@@ -731,15 +790,38 @@ msgstr "Filtrera efter artiklar som är virtuella"
 msgid "Not Virtual"
 msgstr "Inte virtuell"
 
-#: src/components/tables/part/PartTable.tsx:203
-#: src/components/tables/stock/StockItemTable.tsx:124
-msgid "Edit"
-msgstr ""
-
 #: src/components/tables/part/PartTable.tsx:216
 msgid "Detail"
 msgstr ""
 
+#: src/components/tables/part/RelatedPartTable.tsx:61
+msgid "Add Related Part"
+msgstr ""
+
+#: src/components/tables/part/RelatedPartTable.tsx:69
+msgid "Related Part"
+msgstr ""
+
+#: src/components/tables/part/RelatedPartTable.tsx:72
+msgid "Related part added"
+msgstr ""
+
+#: src/components/tables/part/RelatedPartTable.tsx:82
+msgid "Add related part"
+msgstr ""
+
+#: src/components/tables/part/RelatedPartTable.tsx:104
+msgid "Delete Related Part"
+msgstr ""
+
+#: src/components/tables/part/RelatedPartTable.tsx:105
+msgid "Related part deleted"
+msgstr ""
+
+#: src/components/tables/part/RelatedPartTable.tsx:107
+msgid "Are you sure you want to remove this relationship?"
+msgstr ""
+
 #: src/components/tables/stock/StockItemTable.tsx:58
 msgid "Batch"
 msgstr "Batch"
@@ -787,6 +869,18 @@ msgstr ""
 msgid "Getting started"
 msgstr ""
 
+#: src/components/widgets/MarkdownEditor.tsx:109
+msgid "Failed to upload image"
+msgstr ""
+
+#: src/components/widgets/MarkdownEditor.tsx:147
+msgid "Notes saved"
+msgstr ""
+
+#: src/components/widgets/MarkdownEditor.tsx:155
+msgid "Failed to save notes"
+msgstr ""
+
 #: src/components/widgets/WidgetLayout.tsx:180
 msgid "Layout"
 msgstr ""
@@ -1098,9 +1192,49 @@ msgstr ""
 msgid "method parameter not supplied"
 msgstr ""
 
-#: src/functions/forms.tsx:177
-msgid "Delete"
-msgstr "Radera"
+#: src/functions/forms/AttachmentForms.tsx:57
+msgid "Add File"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:57
+msgid "Add Link"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:58
+msgid "File added"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:58
+msgid "Link added"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:100
+msgid "Edit File"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:100
+msgid "Edit Link"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:101
+msgid "File updated"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:101
+msgid "Link updated"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:127
+msgid "Delete Attachment"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:128
+msgid "Attachment deleted"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:132
+msgid "Are you sure you want to delete this attachment?"
+msgstr ""
 
 #: src/functions/forms/PartForms.tsx:76
 msgid "Create Part"
@@ -1445,43 +1579,43 @@ msgstr "Tyvärr, denna sida hittades inte eller flyttad."
 msgid "Go to the start page"
 msgstr "Gå till startsidan"
 
-#: src/pages/part/PartDetail.tsx:50
+#: src/pages/part/PartDetail.tsx:53
 msgid "Details"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:62
+#: src/pages/part/PartDetail.tsx:65
 msgid "Variants"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:69
+#: src/pages/part/PartDetail.tsx:72
 msgid "Bill of Materials"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:83
+#: src/pages/part/PartDetail.tsx:86
 msgid "Used In"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:90
+#: src/pages/part/PartDetail.tsx:93
 msgid "Pricing"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:96
+#: src/pages/part/PartDetail.tsx:99
 msgid "Suppliers"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:117
+#: src/pages/part/PartDetail.tsx:120
 msgid "Test Templates"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:124
+#: src/pages/part/PartDetail.tsx:127
 msgid "Related Parts"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:130
+#: src/pages/part/PartDetail.tsx:133
 msgid "Attachments"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:136
+#: src/pages/part/PartDetail.tsx:139
 msgid "Notes"
 msgstr ""
 
diff --git a/src/frontend/src/locales/th/messages.po b/src/frontend/src/locales/th/messages.po
index cbc2d0b5d7..b878d013e2 100644
--- a/src/frontend/src/locales/th/messages.po
+++ b/src/frontend/src/locales/th/messages.po
@@ -8,7 +8,7 @@ msgstr ""
 "Language: th\n"
 "Project-Id-Version: inventree\n"
 "Report-Msgid-Bugs-To: \n"
-"PO-Revision-Date: 2023-09-12 00:11\n"
+"PO-Revision-Date: 2023-09-14 01:15\n"
 "Last-Translator: \n"
 "Language-Team: Thai\n"
 "Plural-Forms: nplurals=1; plural=0;\n"
@@ -23,6 +23,7 @@ msgid "Title"
 msgstr ""
 
 #: src/components/forms/ApiForm.tsx:189
+#: src/components/widgets/MarkdownEditor.tsx:146
 msgid "Success"
 msgstr ""
 
@@ -158,6 +159,7 @@ msgid "Add Host"
 msgstr ""
 
 #: src/components/forms/HostOptionsForm.tsx:89
+#: src/components/widgets/MarkdownEditor.tsx:73
 msgid "Save"
 msgstr ""
 
@@ -187,7 +189,9 @@ msgstr ""
 
 #: src/components/forms/fields/ApiFormField.tsx:286
 #: src/components/nav/SearchDrawer.tsx:425
-#: src/components/tables/InvenTreeTable.tsx:368
+#: src/components/tables/InvenTreeTable.tsx:378
+#: src/components/widgets/MarkdownEditor.tsx:108
+#: src/components/widgets/MarkdownEditor.tsx:154
 #: src/pages/ErrorPage.tsx:12
 #: src/pages/ErrorPage.tsx:25
 msgid "Error"
@@ -211,7 +215,7 @@ msgid "Read More"
 msgstr ""
 
 #: src/components/items/ErrorItem.tsx:5
-#: src/components/tables/InvenTreeTable.tsx:360
+#: src/components/tables/InvenTreeTable.tsx:370
 msgid "Unknown error"
 msgstr ""
 
@@ -384,7 +388,7 @@ msgstr ""
 
 #: src/components/nav/SearchDrawer.tsx:121
 #: src/pages/Index/Build.tsx:13
-#: src/pages/part/PartDetail.tsx:76
+#: src/pages/part/PartDetail.tsx:79
 msgid "Build Orders"
 msgstr ""
 
@@ -393,12 +397,12 @@ msgid "Companies"
 msgstr ""
 
 #: src/components/nav/SearchDrawer.tsx:140
-#: src/pages/part/PartDetail.tsx:103
+#: src/pages/part/PartDetail.tsx:106
 msgid "Purchase Orders"
 msgstr ""
 
 #: src/components/nav/SearchDrawer.tsx:150
-#: src/pages/part/PartDetail.tsx:110
+#: src/pages/part/PartDetail.tsx:113
 msgid "Sales Orders"
 msgstr ""
 
@@ -446,6 +450,58 @@ msgstr ""
 msgid "Shipment"
 msgstr ""
 
+#: src/components/tables/AttachmentTable.tsx:29
+msgid "Attachment"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:46
+msgid "Comment"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:55
+msgid "Uploaded"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:115
+#: src/components/tables/part/PartTable.tsx:203
+#: src/components/tables/stock/StockItemTable.tsx:124
+msgid "Edit"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:130
+#: src/components/tables/part/RelatedPartTable.tsx:97
+#: src/functions/forms.tsx:177
+msgid "Delete"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:156
+msgid "File uploaded"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:157
+msgid "File {0} uploaded successfully"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:168
+msgid "Upload Error"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:169
+msgid "File could not be uploaded"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:182
+msgid "Add attachment"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:201
+msgid "Add external link"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:241
+msgid "Upload attachment"
+msgstr ""
+
 #: src/components/tables/ColumnSelect.tsx:17
 #: src/components/tables/ColumnSelect.tsx:24
 msgid "Select Columns"
@@ -523,41 +579,42 @@ msgstr ""
 msgid "No records found"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:347
+#: src/components/tables/InvenTreeTable.tsx:357
 msgid "Bad request"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:350
+#: src/components/tables/InvenTreeTable.tsx:360
 msgid "Unauthorized"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:353
+#: src/components/tables/InvenTreeTable.tsx:363
 msgid "Forbidden"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:356
+#: src/components/tables/InvenTreeTable.tsx:366
 msgid "Not found"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:405
-#: src/components/tables/InvenTreeTable.tsx:406
+#: src/components/tables/InvenTreeTable.tsx:427
+#: src/components/tables/InvenTreeTable.tsx:428
 msgid "Barcode actions"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:413
-#: src/components/tables/InvenTreeTable.tsx:414
+#: src/components/tables/InvenTreeTable.tsx:435
+#: src/components/tables/InvenTreeTable.tsx:436
 msgid "Print actions"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:431
+#: src/components/tables/InvenTreeTable.tsx:453
 msgid "Refresh data"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:449
+#: src/components/tables/InvenTreeTable.tsx:471
 msgid "Table filters"
 msgstr ""
 
-#: src/components/tables/RowActions.tsx:35
+#: src/components/tables/RowActions.tsx:33
+#: src/components/tables/RowActions.tsx:40
 msgid "Actions"
 msgstr ""
 
@@ -567,12 +624,14 @@ msgstr ""
 
 #: src/components/tables/build/BuildOrderTable.tsx:24
 #: src/components/tables/part/PartTable.tsx:25
+#: src/components/tables/part/RelatedPartTable.tsx:31
 #: src/components/tables/stock/StockItemTable.tsx:22
 msgid "Part"
 msgstr ""
 
 #: src/components/tables/build/BuildOrderTable.tsx:41
 #: src/components/tables/part/PartTable.tsx:51
+#: src/components/tables/part/RelatedPartTable.tsx:49
 #: src/components/tables/stock/StockItemTable.tsx:38
 msgid "Description"
 msgstr ""
@@ -617,7 +676,7 @@ msgstr ""
 #: src/components/tables/part/PartTable.tsx:68
 #: src/components/tables/stock/StockItemTable.tsx:43
 #: src/defaults/links.tsx:27
-#: src/pages/part/PartDetail.tsx:56
+#: src/pages/part/PartDetail.tsx:59
 msgid "Stock"
 msgstr ""
 
@@ -731,15 +790,38 @@ msgstr ""
 msgid "Not Virtual"
 msgstr ""
 
-#: src/components/tables/part/PartTable.tsx:203
-#: src/components/tables/stock/StockItemTable.tsx:124
-msgid "Edit"
-msgstr ""
-
 #: src/components/tables/part/PartTable.tsx:216
 msgid "Detail"
 msgstr ""
 
+#: src/components/tables/part/RelatedPartTable.tsx:61
+msgid "Add Related Part"
+msgstr ""
+
+#: src/components/tables/part/RelatedPartTable.tsx:69
+msgid "Related Part"
+msgstr ""
+
+#: src/components/tables/part/RelatedPartTable.tsx:72
+msgid "Related part added"
+msgstr ""
+
+#: src/components/tables/part/RelatedPartTable.tsx:82
+msgid "Add related part"
+msgstr ""
+
+#: src/components/tables/part/RelatedPartTable.tsx:104
+msgid "Delete Related Part"
+msgstr ""
+
+#: src/components/tables/part/RelatedPartTable.tsx:105
+msgid "Related part deleted"
+msgstr ""
+
+#: src/components/tables/part/RelatedPartTable.tsx:107
+msgid "Are you sure you want to remove this relationship?"
+msgstr ""
+
 #: src/components/tables/stock/StockItemTable.tsx:58
 msgid "Batch"
 msgstr ""
@@ -787,6 +869,18 @@ msgstr ""
 msgid "Getting started"
 msgstr ""
 
+#: src/components/widgets/MarkdownEditor.tsx:109
+msgid "Failed to upload image"
+msgstr ""
+
+#: src/components/widgets/MarkdownEditor.tsx:147
+msgid "Notes saved"
+msgstr ""
+
+#: src/components/widgets/MarkdownEditor.tsx:155
+msgid "Failed to save notes"
+msgstr ""
+
 #: src/components/widgets/WidgetLayout.tsx:180
 msgid "Layout"
 msgstr ""
@@ -1098,8 +1192,48 @@ msgstr ""
 msgid "method parameter not supplied"
 msgstr ""
 
-#: src/functions/forms.tsx:177
-msgid "Delete"
+#: src/functions/forms/AttachmentForms.tsx:57
+msgid "Add File"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:57
+msgid "Add Link"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:58
+msgid "File added"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:58
+msgid "Link added"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:100
+msgid "Edit File"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:100
+msgid "Edit Link"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:101
+msgid "File updated"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:101
+msgid "Link updated"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:127
+msgid "Delete Attachment"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:128
+msgid "Attachment deleted"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:132
+msgid "Are you sure you want to delete this attachment?"
 msgstr ""
 
 #: src/functions/forms/PartForms.tsx:76
@@ -1445,43 +1579,43 @@ msgstr ""
 msgid "Go to the start page"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:50
+#: src/pages/part/PartDetail.tsx:53
 msgid "Details"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:62
+#: src/pages/part/PartDetail.tsx:65
 msgid "Variants"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:69
+#: src/pages/part/PartDetail.tsx:72
 msgid "Bill of Materials"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:83
+#: src/pages/part/PartDetail.tsx:86
 msgid "Used In"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:90
+#: src/pages/part/PartDetail.tsx:93
 msgid "Pricing"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:96
+#: src/pages/part/PartDetail.tsx:99
 msgid "Suppliers"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:117
+#: src/pages/part/PartDetail.tsx:120
 msgid "Test Templates"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:124
+#: src/pages/part/PartDetail.tsx:127
 msgid "Related Parts"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:130
+#: src/pages/part/PartDetail.tsx:133
 msgid "Attachments"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:136
+#: src/pages/part/PartDetail.tsx:139
 msgid "Notes"
 msgstr ""
 
diff --git a/src/frontend/src/locales/tr/messages.po b/src/frontend/src/locales/tr/messages.po
index 6e2b3c5393..f9b214559b 100644
--- a/src/frontend/src/locales/tr/messages.po
+++ b/src/frontend/src/locales/tr/messages.po
@@ -8,7 +8,7 @@ msgstr ""
 "Language: tr\n"
 "Project-Id-Version: inventree\n"
 "Report-Msgid-Bugs-To: \n"
-"PO-Revision-Date: 2023-09-12 00:10\n"
+"PO-Revision-Date: 2023-09-14 01:15\n"
 "Last-Translator: \n"
 "Language-Team: Turkish\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
@@ -23,6 +23,7 @@ msgid "Title"
 msgstr "Başlık"
 
 #: src/components/forms/ApiForm.tsx:189
+#: src/components/widgets/MarkdownEditor.tsx:146
 msgid "Success"
 msgstr ""
 
@@ -158,6 +159,7 @@ msgid "Add Host"
 msgstr "Sunucu Ekle"
 
 #: src/components/forms/HostOptionsForm.tsx:89
+#: src/components/widgets/MarkdownEditor.tsx:73
 msgid "Save"
 msgstr "Kaydet"
 
@@ -187,7 +189,9 @@ msgstr "Durum: <0>worker</0> ({0}), <1>eklenti</1>{1}"
 
 #: src/components/forms/fields/ApiFormField.tsx:286
 #: src/components/nav/SearchDrawer.tsx:425
-#: src/components/tables/InvenTreeTable.tsx:368
+#: src/components/tables/InvenTreeTable.tsx:378
+#: src/components/widgets/MarkdownEditor.tsx:108
+#: src/components/widgets/MarkdownEditor.tsx:154
 #: src/pages/ErrorPage.tsx:12
 #: src/pages/ErrorPage.tsx:25
 msgid "Error"
@@ -211,7 +215,7 @@ msgid "Read More"
 msgstr "Devamını Oku"
 
 #: src/components/items/ErrorItem.tsx:5
-#: src/components/tables/InvenTreeTable.tsx:360
+#: src/components/tables/InvenTreeTable.tsx:370
 msgid "Unknown error"
 msgstr "Bilinmeyen hata"
 
@@ -384,7 +388,7 @@ msgstr "Stok Konumları"
 
 #: src/components/nav/SearchDrawer.tsx:121
 #: src/pages/Index/Build.tsx:13
-#: src/pages/part/PartDetail.tsx:76
+#: src/pages/part/PartDetail.tsx:79
 msgid "Build Orders"
 msgstr "Yapım İşi Emirleri"
 
@@ -393,12 +397,12 @@ msgid "Companies"
 msgstr "Şirketler"
 
 #: src/components/nav/SearchDrawer.tsx:140
-#: src/pages/part/PartDetail.tsx:103
+#: src/pages/part/PartDetail.tsx:106
 msgid "Purchase Orders"
 msgstr "Satın Alma Emirleri"
 
 #: src/components/nav/SearchDrawer.tsx:150
-#: src/pages/part/PartDetail.tsx:110
+#: src/pages/part/PartDetail.tsx:113
 msgid "Sales Orders"
 msgstr "Satış Emirleri"
 
@@ -446,6 +450,58 @@ msgstr ""
 msgid "Shipment"
 msgstr ""
 
+#: src/components/tables/AttachmentTable.tsx:29
+msgid "Attachment"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:46
+msgid "Comment"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:55
+msgid "Uploaded"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:115
+#: src/components/tables/part/PartTable.tsx:203
+#: src/components/tables/stock/StockItemTable.tsx:124
+msgid "Edit"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:130
+#: src/components/tables/part/RelatedPartTable.tsx:97
+#: src/functions/forms.tsx:177
+msgid "Delete"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:156
+msgid "File uploaded"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:157
+msgid "File {0} uploaded successfully"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:168
+msgid "Upload Error"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:169
+msgid "File could not be uploaded"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:182
+msgid "Add attachment"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:201
+msgid "Add external link"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:241
+msgid "Upload attachment"
+msgstr ""
+
 #: src/components/tables/ColumnSelect.tsx:17
 #: src/components/tables/ColumnSelect.tsx:24
 msgid "Select Columns"
@@ -523,41 +579,42 @@ msgstr "Filtre Ekle"
 msgid "No records found"
 msgstr "Hiç kayıt bulunamadı"
 
-#: src/components/tables/InvenTreeTable.tsx:347
+#: src/components/tables/InvenTreeTable.tsx:357
 msgid "Bad request"
 msgstr "Hatalı istek"
 
-#: src/components/tables/InvenTreeTable.tsx:350
+#: src/components/tables/InvenTreeTable.tsx:360
 msgid "Unauthorized"
 msgstr "Yetkisiz"
 
-#: src/components/tables/InvenTreeTable.tsx:353
+#: src/components/tables/InvenTreeTable.tsx:363
 msgid "Forbidden"
 msgstr "Yasaklı"
 
-#: src/components/tables/InvenTreeTable.tsx:356
+#: src/components/tables/InvenTreeTable.tsx:366
 msgid "Not found"
 msgstr "Bulunamadı"
 
-#: src/components/tables/InvenTreeTable.tsx:405
-#: src/components/tables/InvenTreeTable.tsx:406
+#: src/components/tables/InvenTreeTable.tsx:427
+#: src/components/tables/InvenTreeTable.tsx:428
 msgid "Barcode actions"
 msgstr "Barkod işlemleri"
 
-#: src/components/tables/InvenTreeTable.tsx:413
-#: src/components/tables/InvenTreeTable.tsx:414
+#: src/components/tables/InvenTreeTable.tsx:435
+#: src/components/tables/InvenTreeTable.tsx:436
 msgid "Print actions"
 msgstr "Yazdırma işlemleri"
 
-#: src/components/tables/InvenTreeTable.tsx:431
+#: src/components/tables/InvenTreeTable.tsx:453
 msgid "Refresh data"
 msgstr "Veriyi yenile"
 
-#: src/components/tables/InvenTreeTable.tsx:449
+#: src/components/tables/InvenTreeTable.tsx:471
 msgid "Table filters"
 msgstr "Tablo filtreleri"
 
-#: src/components/tables/RowActions.tsx:35
+#: src/components/tables/RowActions.tsx:33
+#: src/components/tables/RowActions.tsx:40
 msgid "Actions"
 msgstr "Eylemler"
 
@@ -567,12 +624,14 @@ msgstr "Referans"
 
 #: src/components/tables/build/BuildOrderTable.tsx:24
 #: src/components/tables/part/PartTable.tsx:25
+#: src/components/tables/part/RelatedPartTable.tsx:31
 #: src/components/tables/stock/StockItemTable.tsx:22
 msgid "Part"
 msgstr "Parça"
 
 #: src/components/tables/build/BuildOrderTable.tsx:41
 #: src/components/tables/part/PartTable.tsx:51
+#: src/components/tables/part/RelatedPartTable.tsx:49
 #: src/components/tables/stock/StockItemTable.tsx:38
 msgid "Description"
 msgstr "Açıklama"
@@ -617,7 +676,7 @@ msgstr "Kategori"
 #: src/components/tables/part/PartTable.tsx:68
 #: src/components/tables/stock/StockItemTable.tsx:43
 #: src/defaults/links.tsx:27
-#: src/pages/part/PartDetail.tsx:56
+#: src/pages/part/PartDetail.tsx:59
 msgid "Stock"
 msgstr "Stok"
 
@@ -731,15 +790,38 @@ msgstr "Sanal parçaları filtrele"
 msgid "Not Virtual"
 msgstr "Sanal Değil"
 
-#: src/components/tables/part/PartTable.tsx:203
-#: src/components/tables/stock/StockItemTable.tsx:124
-msgid "Edit"
-msgstr ""
-
 #: src/components/tables/part/PartTable.tsx:216
 msgid "Detail"
 msgstr ""
 
+#: src/components/tables/part/RelatedPartTable.tsx:61
+msgid "Add Related Part"
+msgstr ""
+
+#: src/components/tables/part/RelatedPartTable.tsx:69
+msgid "Related Part"
+msgstr ""
+
+#: src/components/tables/part/RelatedPartTable.tsx:72
+msgid "Related part added"
+msgstr ""
+
+#: src/components/tables/part/RelatedPartTable.tsx:82
+msgid "Add related part"
+msgstr ""
+
+#: src/components/tables/part/RelatedPartTable.tsx:104
+msgid "Delete Related Part"
+msgstr ""
+
+#: src/components/tables/part/RelatedPartTable.tsx:105
+msgid "Related part deleted"
+msgstr ""
+
+#: src/components/tables/part/RelatedPartTable.tsx:107
+msgid "Are you sure you want to remove this relationship?"
+msgstr ""
+
 #: src/components/tables/stock/StockItemTable.tsx:58
 msgid "Batch"
 msgstr "Toplu"
@@ -787,6 +869,18 @@ msgstr "Geri Bildirim Gönder"
 msgid "Getting started"
 msgstr "Başlarken"
 
+#: src/components/widgets/MarkdownEditor.tsx:109
+msgid "Failed to upload image"
+msgstr ""
+
+#: src/components/widgets/MarkdownEditor.tsx:147
+msgid "Notes saved"
+msgstr ""
+
+#: src/components/widgets/MarkdownEditor.tsx:155
+msgid "Failed to save notes"
+msgstr ""
+
 #: src/components/widgets/WidgetLayout.tsx:180
 msgid "Layout"
 msgstr "Yerleşim"
@@ -1098,8 +1192,48 @@ msgstr ""
 msgid "method parameter not supplied"
 msgstr ""
 
-#: src/functions/forms.tsx:177
-msgid "Delete"
+#: src/functions/forms/AttachmentForms.tsx:57
+msgid "Add File"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:57
+msgid "Add Link"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:58
+msgid "File added"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:58
+msgid "Link added"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:100
+msgid "Edit File"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:100
+msgid "Edit Link"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:101
+msgid "File updated"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:101
+msgid "Link updated"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:127
+msgid "Delete Attachment"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:128
+msgid "Attachment deleted"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:132
+msgid "Are you sure you want to delete this attachment?"
 msgstr ""
 
 #: src/functions/forms/PartForms.tsx:76
@@ -1445,43 +1579,43 @@ msgstr "Üzgünüz, böyle bir sayfa yok veya taşınmış."
 msgid "Go to the start page"
 msgstr "Başlangıç ​​sayfasına git"
 
-#: src/pages/part/PartDetail.tsx:50
+#: src/pages/part/PartDetail.tsx:53
 msgid "Details"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:62
+#: src/pages/part/PartDetail.tsx:65
 msgid "Variants"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:69
+#: src/pages/part/PartDetail.tsx:72
 msgid "Bill of Materials"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:83
+#: src/pages/part/PartDetail.tsx:86
 msgid "Used In"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:90
+#: src/pages/part/PartDetail.tsx:93
 msgid "Pricing"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:96
+#: src/pages/part/PartDetail.tsx:99
 msgid "Suppliers"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:117
+#: src/pages/part/PartDetail.tsx:120
 msgid "Test Templates"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:124
+#: src/pages/part/PartDetail.tsx:127
 msgid "Related Parts"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:130
+#: src/pages/part/PartDetail.tsx:133
 msgid "Attachments"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:136
+#: src/pages/part/PartDetail.tsx:139
 msgid "Notes"
 msgstr ""
 
diff --git a/src/frontend/src/locales/vi/messages.po b/src/frontend/src/locales/vi/messages.po
index 7b03f4d034..8bf91b9b29 100644
--- a/src/frontend/src/locales/vi/messages.po
+++ b/src/frontend/src/locales/vi/messages.po
@@ -8,7 +8,7 @@ msgstr ""
 "Language: vi\n"
 "Project-Id-Version: inventree\n"
 "Report-Msgid-Bugs-To: \n"
-"PO-Revision-Date: 2023-09-12 00:11\n"
+"PO-Revision-Date: 2023-09-14 01:15\n"
 "Last-Translator: \n"
 "Language-Team: Vietnamese\n"
 "Plural-Forms: nplurals=1; plural=0;\n"
@@ -23,6 +23,7 @@ msgid "Title"
 msgstr "Tiêu đề"
 
 #: src/components/forms/ApiForm.tsx:189
+#: src/components/widgets/MarkdownEditor.tsx:146
 msgid "Success"
 msgstr ""
 
@@ -158,6 +159,7 @@ msgid "Add Host"
 msgstr "Thêm host"
 
 #: src/components/forms/HostOptionsForm.tsx:89
+#: src/components/widgets/MarkdownEditor.tsx:73
 msgid "Save"
 msgstr "Lưu lại"
 
@@ -187,7 +189,9 @@ msgstr ""
 
 #: src/components/forms/fields/ApiFormField.tsx:286
 #: src/components/nav/SearchDrawer.tsx:425
-#: src/components/tables/InvenTreeTable.tsx:368
+#: src/components/tables/InvenTreeTable.tsx:378
+#: src/components/widgets/MarkdownEditor.tsx:108
+#: src/components/widgets/MarkdownEditor.tsx:154
 #: src/pages/ErrorPage.tsx:12
 #: src/pages/ErrorPage.tsx:25
 msgid "Error"
@@ -211,7 +215,7 @@ msgid "Read More"
 msgstr "Xem thêm"
 
 #: src/components/items/ErrorItem.tsx:5
-#: src/components/tables/InvenTreeTable.tsx:360
+#: src/components/tables/InvenTreeTable.tsx:370
 msgid "Unknown error"
 msgstr "Lỗi không xác định"
 
@@ -384,7 +388,7 @@ msgstr ""
 
 #: src/components/nav/SearchDrawer.tsx:121
 #: src/pages/Index/Build.tsx:13
-#: src/pages/part/PartDetail.tsx:76
+#: src/pages/part/PartDetail.tsx:79
 msgid "Build Orders"
 msgstr ""
 
@@ -393,12 +397,12 @@ msgid "Companies"
 msgstr ""
 
 #: src/components/nav/SearchDrawer.tsx:140
-#: src/pages/part/PartDetail.tsx:103
+#: src/pages/part/PartDetail.tsx:106
 msgid "Purchase Orders"
 msgstr ""
 
 #: src/components/nav/SearchDrawer.tsx:150
-#: src/pages/part/PartDetail.tsx:110
+#: src/pages/part/PartDetail.tsx:113
 msgid "Sales Orders"
 msgstr ""
 
@@ -446,6 +450,58 @@ msgstr ""
 msgid "Shipment"
 msgstr ""
 
+#: src/components/tables/AttachmentTable.tsx:29
+msgid "Attachment"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:46
+msgid "Comment"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:55
+msgid "Uploaded"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:115
+#: src/components/tables/part/PartTable.tsx:203
+#: src/components/tables/stock/StockItemTable.tsx:124
+msgid "Edit"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:130
+#: src/components/tables/part/RelatedPartTable.tsx:97
+#: src/functions/forms.tsx:177
+msgid "Delete"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:156
+msgid "File uploaded"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:157
+msgid "File {0} uploaded successfully"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:168
+msgid "Upload Error"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:169
+msgid "File could not be uploaded"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:182
+msgid "Add attachment"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:201
+msgid "Add external link"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:241
+msgid "Upload attachment"
+msgstr ""
+
 #: src/components/tables/ColumnSelect.tsx:17
 #: src/components/tables/ColumnSelect.tsx:24
 msgid "Select Columns"
@@ -523,41 +579,42 @@ msgstr "Thêm bộ lọc"
 msgid "No records found"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:347
+#: src/components/tables/InvenTreeTable.tsx:357
 msgid "Bad request"
 msgstr "Yêu cầu không hợp lệ"
 
-#: src/components/tables/InvenTreeTable.tsx:350
+#: src/components/tables/InvenTreeTable.tsx:360
 msgid "Unauthorized"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:353
+#: src/components/tables/InvenTreeTable.tsx:363
 msgid "Forbidden"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:356
+#: src/components/tables/InvenTreeTable.tsx:366
 msgid "Not found"
 msgstr "Không tìm thấy"
 
-#: src/components/tables/InvenTreeTable.tsx:405
-#: src/components/tables/InvenTreeTable.tsx:406
+#: src/components/tables/InvenTreeTable.tsx:427
+#: src/components/tables/InvenTreeTable.tsx:428
 msgid "Barcode actions"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:413
-#: src/components/tables/InvenTreeTable.tsx:414
+#: src/components/tables/InvenTreeTable.tsx:435
+#: src/components/tables/InvenTreeTable.tsx:436
 msgid "Print actions"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:431
+#: src/components/tables/InvenTreeTable.tsx:453
 msgid "Refresh data"
 msgstr "Làm mới dữ liệu"
 
-#: src/components/tables/InvenTreeTable.tsx:449
+#: src/components/tables/InvenTreeTable.tsx:471
 msgid "Table filters"
 msgstr ""
 
-#: src/components/tables/RowActions.tsx:35
+#: src/components/tables/RowActions.tsx:33
+#: src/components/tables/RowActions.tsx:40
 msgid "Actions"
 msgstr "Chức năng"
 
@@ -567,12 +624,14 @@ msgstr "Tham chiếu"
 
 #: src/components/tables/build/BuildOrderTable.tsx:24
 #: src/components/tables/part/PartTable.tsx:25
+#: src/components/tables/part/RelatedPartTable.tsx:31
 #: src/components/tables/stock/StockItemTable.tsx:22
 msgid "Part"
 msgstr "Phụ kiện"
 
 #: src/components/tables/build/BuildOrderTable.tsx:41
 #: src/components/tables/part/PartTable.tsx:51
+#: src/components/tables/part/RelatedPartTable.tsx:49
 #: src/components/tables/stock/StockItemTable.tsx:38
 msgid "Description"
 msgstr "Mô tả"
@@ -617,7 +676,7 @@ msgstr "Danh mục"
 #: src/components/tables/part/PartTable.tsx:68
 #: src/components/tables/stock/StockItemTable.tsx:43
 #: src/defaults/links.tsx:27
-#: src/pages/part/PartDetail.tsx:56
+#: src/pages/part/PartDetail.tsx:59
 msgid "Stock"
 msgstr "Kho hàng"
 
@@ -731,15 +790,38 @@ msgstr ""
 msgid "Not Virtual"
 msgstr ""
 
-#: src/components/tables/part/PartTable.tsx:203
-#: src/components/tables/stock/StockItemTable.tsx:124
-msgid "Edit"
-msgstr ""
-
 #: src/components/tables/part/PartTable.tsx:216
 msgid "Detail"
 msgstr ""
 
+#: src/components/tables/part/RelatedPartTable.tsx:61
+msgid "Add Related Part"
+msgstr ""
+
+#: src/components/tables/part/RelatedPartTable.tsx:69
+msgid "Related Part"
+msgstr ""
+
+#: src/components/tables/part/RelatedPartTable.tsx:72
+msgid "Related part added"
+msgstr ""
+
+#: src/components/tables/part/RelatedPartTable.tsx:82
+msgid "Add related part"
+msgstr ""
+
+#: src/components/tables/part/RelatedPartTable.tsx:104
+msgid "Delete Related Part"
+msgstr ""
+
+#: src/components/tables/part/RelatedPartTable.tsx:105
+msgid "Related part deleted"
+msgstr ""
+
+#: src/components/tables/part/RelatedPartTable.tsx:107
+msgid "Are you sure you want to remove this relationship?"
+msgstr ""
+
 #: src/components/tables/stock/StockItemTable.tsx:58
 msgid "Batch"
 msgstr ""
@@ -787,6 +869,18 @@ msgstr ""
 msgid "Getting started"
 msgstr "Bắt đầu"
 
+#: src/components/widgets/MarkdownEditor.tsx:109
+msgid "Failed to upload image"
+msgstr ""
+
+#: src/components/widgets/MarkdownEditor.tsx:147
+msgid "Notes saved"
+msgstr ""
+
+#: src/components/widgets/MarkdownEditor.tsx:155
+msgid "Failed to save notes"
+msgstr ""
+
 #: src/components/widgets/WidgetLayout.tsx:180
 msgid "Layout"
 msgstr "Bố cục"
@@ -1098,8 +1192,48 @@ msgstr ""
 msgid "method parameter not supplied"
 msgstr ""
 
-#: src/functions/forms.tsx:177
-msgid "Delete"
+#: src/functions/forms/AttachmentForms.tsx:57
+msgid "Add File"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:57
+msgid "Add Link"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:58
+msgid "File added"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:58
+msgid "Link added"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:100
+msgid "Edit File"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:100
+msgid "Edit Link"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:101
+msgid "File updated"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:101
+msgid "Link updated"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:127
+msgid "Delete Attachment"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:128
+msgid "Attachment deleted"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:132
+msgid "Are you sure you want to delete this attachment?"
 msgstr ""
 
 #: src/functions/forms/PartForms.tsx:76
@@ -1445,43 +1579,43 @@ msgstr ""
 msgid "Go to the start page"
 msgstr "Chuyển đến trang đầu"
 
-#: src/pages/part/PartDetail.tsx:50
+#: src/pages/part/PartDetail.tsx:53
 msgid "Details"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:62
+#: src/pages/part/PartDetail.tsx:65
 msgid "Variants"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:69
+#: src/pages/part/PartDetail.tsx:72
 msgid "Bill of Materials"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:83
+#: src/pages/part/PartDetail.tsx:86
 msgid "Used In"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:90
+#: src/pages/part/PartDetail.tsx:93
 msgid "Pricing"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:96
+#: src/pages/part/PartDetail.tsx:99
 msgid "Suppliers"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:117
+#: src/pages/part/PartDetail.tsx:120
 msgid "Test Templates"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:124
+#: src/pages/part/PartDetail.tsx:127
 msgid "Related Parts"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:130
+#: src/pages/part/PartDetail.tsx:133
 msgid "Attachments"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:136
+#: src/pages/part/PartDetail.tsx:139
 msgid "Notes"
 msgstr ""
 
diff --git a/src/frontend/src/locales/zh/messages.po b/src/frontend/src/locales/zh/messages.po
index 164c4724aa..6e686d33ab 100644
--- a/src/frontend/src/locales/zh/messages.po
+++ b/src/frontend/src/locales/zh/messages.po
@@ -8,7 +8,7 @@ msgstr ""
 "Language: zh\n"
 "Project-Id-Version: inventree\n"
 "Report-Msgid-Bugs-To: \n"
-"PO-Revision-Date: 2023-09-12 00:11\n"
+"PO-Revision-Date: 2023-09-14 01:15\n"
 "Last-Translator: \n"
 "Language-Team: Chinese Traditional\n"
 "Plural-Forms: nplurals=1; plural=0;\n"
@@ -23,6 +23,7 @@ msgid "Title"
 msgstr ""
 
 #: src/components/forms/ApiForm.tsx:189
+#: src/components/widgets/MarkdownEditor.tsx:146
 msgid "Success"
 msgstr ""
 
@@ -158,6 +159,7 @@ msgid "Add Host"
 msgstr ""
 
 #: src/components/forms/HostOptionsForm.tsx:89
+#: src/components/widgets/MarkdownEditor.tsx:73
 msgid "Save"
 msgstr ""
 
@@ -187,7 +189,9 @@ msgstr ""
 
 #: src/components/forms/fields/ApiFormField.tsx:286
 #: src/components/nav/SearchDrawer.tsx:425
-#: src/components/tables/InvenTreeTable.tsx:368
+#: src/components/tables/InvenTreeTable.tsx:378
+#: src/components/widgets/MarkdownEditor.tsx:108
+#: src/components/widgets/MarkdownEditor.tsx:154
 #: src/pages/ErrorPage.tsx:12
 #: src/pages/ErrorPage.tsx:25
 msgid "Error"
@@ -211,7 +215,7 @@ msgid "Read More"
 msgstr ""
 
 #: src/components/items/ErrorItem.tsx:5
-#: src/components/tables/InvenTreeTable.tsx:360
+#: src/components/tables/InvenTreeTable.tsx:370
 msgid "Unknown error"
 msgstr ""
 
@@ -384,7 +388,7 @@ msgstr ""
 
 #: src/components/nav/SearchDrawer.tsx:121
 #: src/pages/Index/Build.tsx:13
-#: src/pages/part/PartDetail.tsx:76
+#: src/pages/part/PartDetail.tsx:79
 msgid "Build Orders"
 msgstr ""
 
@@ -393,12 +397,12 @@ msgid "Companies"
 msgstr ""
 
 #: src/components/nav/SearchDrawer.tsx:140
-#: src/pages/part/PartDetail.tsx:103
+#: src/pages/part/PartDetail.tsx:106
 msgid "Purchase Orders"
 msgstr ""
 
 #: src/components/nav/SearchDrawer.tsx:150
-#: src/pages/part/PartDetail.tsx:110
+#: src/pages/part/PartDetail.tsx:113
 msgid "Sales Orders"
 msgstr ""
 
@@ -446,6 +450,58 @@ msgstr ""
 msgid "Shipment"
 msgstr ""
 
+#: src/components/tables/AttachmentTable.tsx:29
+msgid "Attachment"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:46
+msgid "Comment"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:55
+msgid "Uploaded"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:115
+#: src/components/tables/part/PartTable.tsx:203
+#: src/components/tables/stock/StockItemTable.tsx:124
+msgid "Edit"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:130
+#: src/components/tables/part/RelatedPartTable.tsx:97
+#: src/functions/forms.tsx:177
+msgid "Delete"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:156
+msgid "File uploaded"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:157
+msgid "File {0} uploaded successfully"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:168
+msgid "Upload Error"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:169
+msgid "File could not be uploaded"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:182
+msgid "Add attachment"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:201
+msgid "Add external link"
+msgstr ""
+
+#: src/components/tables/AttachmentTable.tsx:241
+msgid "Upload attachment"
+msgstr ""
+
 #: src/components/tables/ColumnSelect.tsx:17
 #: src/components/tables/ColumnSelect.tsx:24
 msgid "Select Columns"
@@ -523,41 +579,42 @@ msgstr ""
 msgid "No records found"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:347
+#: src/components/tables/InvenTreeTable.tsx:357
 msgid "Bad request"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:350
+#: src/components/tables/InvenTreeTable.tsx:360
 msgid "Unauthorized"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:353
+#: src/components/tables/InvenTreeTable.tsx:363
 msgid "Forbidden"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:356
+#: src/components/tables/InvenTreeTable.tsx:366
 msgid "Not found"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:405
-#: src/components/tables/InvenTreeTable.tsx:406
+#: src/components/tables/InvenTreeTable.tsx:427
+#: src/components/tables/InvenTreeTable.tsx:428
 msgid "Barcode actions"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:413
-#: src/components/tables/InvenTreeTable.tsx:414
+#: src/components/tables/InvenTreeTable.tsx:435
+#: src/components/tables/InvenTreeTable.tsx:436
 msgid "Print actions"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:431
+#: src/components/tables/InvenTreeTable.tsx:453
 msgid "Refresh data"
 msgstr ""
 
-#: src/components/tables/InvenTreeTable.tsx:449
+#: src/components/tables/InvenTreeTable.tsx:471
 msgid "Table filters"
 msgstr ""
 
-#: src/components/tables/RowActions.tsx:35
+#: src/components/tables/RowActions.tsx:33
+#: src/components/tables/RowActions.tsx:40
 msgid "Actions"
 msgstr ""
 
@@ -567,12 +624,14 @@ msgstr ""
 
 #: src/components/tables/build/BuildOrderTable.tsx:24
 #: src/components/tables/part/PartTable.tsx:25
+#: src/components/tables/part/RelatedPartTable.tsx:31
 #: src/components/tables/stock/StockItemTable.tsx:22
 msgid "Part"
 msgstr ""
 
 #: src/components/tables/build/BuildOrderTable.tsx:41
 #: src/components/tables/part/PartTable.tsx:51
+#: src/components/tables/part/RelatedPartTable.tsx:49
 #: src/components/tables/stock/StockItemTable.tsx:38
 msgid "Description"
 msgstr ""
@@ -617,7 +676,7 @@ msgstr ""
 #: src/components/tables/part/PartTable.tsx:68
 #: src/components/tables/stock/StockItemTable.tsx:43
 #: src/defaults/links.tsx:27
-#: src/pages/part/PartDetail.tsx:56
+#: src/pages/part/PartDetail.tsx:59
 msgid "Stock"
 msgstr ""
 
@@ -731,15 +790,38 @@ msgstr ""
 msgid "Not Virtual"
 msgstr ""
 
-#: src/components/tables/part/PartTable.tsx:203
-#: src/components/tables/stock/StockItemTable.tsx:124
-msgid "Edit"
-msgstr ""
-
 #: src/components/tables/part/PartTable.tsx:216
 msgid "Detail"
 msgstr ""
 
+#: src/components/tables/part/RelatedPartTable.tsx:61
+msgid "Add Related Part"
+msgstr ""
+
+#: src/components/tables/part/RelatedPartTable.tsx:69
+msgid "Related Part"
+msgstr ""
+
+#: src/components/tables/part/RelatedPartTable.tsx:72
+msgid "Related part added"
+msgstr ""
+
+#: src/components/tables/part/RelatedPartTable.tsx:82
+msgid "Add related part"
+msgstr ""
+
+#: src/components/tables/part/RelatedPartTable.tsx:104
+msgid "Delete Related Part"
+msgstr ""
+
+#: src/components/tables/part/RelatedPartTable.tsx:105
+msgid "Related part deleted"
+msgstr ""
+
+#: src/components/tables/part/RelatedPartTable.tsx:107
+msgid "Are you sure you want to remove this relationship?"
+msgstr ""
+
 #: src/components/tables/stock/StockItemTable.tsx:58
 msgid "Batch"
 msgstr ""
@@ -787,6 +869,18 @@ msgstr ""
 msgid "Getting started"
 msgstr ""
 
+#: src/components/widgets/MarkdownEditor.tsx:109
+msgid "Failed to upload image"
+msgstr ""
+
+#: src/components/widgets/MarkdownEditor.tsx:147
+msgid "Notes saved"
+msgstr ""
+
+#: src/components/widgets/MarkdownEditor.tsx:155
+msgid "Failed to save notes"
+msgstr ""
+
 #: src/components/widgets/WidgetLayout.tsx:180
 msgid "Layout"
 msgstr ""
@@ -1098,8 +1192,48 @@ msgstr ""
 msgid "method parameter not supplied"
 msgstr ""
 
-#: src/functions/forms.tsx:177
-msgid "Delete"
+#: src/functions/forms/AttachmentForms.tsx:57
+msgid "Add File"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:57
+msgid "Add Link"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:58
+msgid "File added"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:58
+msgid "Link added"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:100
+msgid "Edit File"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:100
+msgid "Edit Link"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:101
+msgid "File updated"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:101
+msgid "Link updated"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:127
+msgid "Delete Attachment"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:128
+msgid "Attachment deleted"
+msgstr ""
+
+#: src/functions/forms/AttachmentForms.tsx:132
+msgid "Are you sure you want to delete this attachment?"
 msgstr ""
 
 #: src/functions/forms/PartForms.tsx:76
@@ -1445,43 +1579,43 @@ msgstr ""
 msgid "Go to the start page"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:50
+#: src/pages/part/PartDetail.tsx:53
 msgid "Details"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:62
+#: src/pages/part/PartDetail.tsx:65
 msgid "Variants"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:69
+#: src/pages/part/PartDetail.tsx:72
 msgid "Bill of Materials"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:83
+#: src/pages/part/PartDetail.tsx:86
 msgid "Used In"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:90
+#: src/pages/part/PartDetail.tsx:93
 msgid "Pricing"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:96
+#: src/pages/part/PartDetail.tsx:99
 msgid "Suppliers"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:117
+#: src/pages/part/PartDetail.tsx:120
 msgid "Test Templates"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:124
+#: src/pages/part/PartDetail.tsx:127
 msgid "Related Parts"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:130
+#: src/pages/part/PartDetail.tsx:133
 msgid "Attachments"
 msgstr ""
 
-#: src/pages/part/PartDetail.tsx:136
+#: src/pages/part/PartDetail.tsx:139
 msgid "Notes"
 msgstr ""