From 698b94640380ae4546e8bb84bbc64017fd1ec99a Mon Sep 17 00:00:00 2001
From: Matthias <matmair@live.de>
Date: Fri, 2 Apr 2021 23:03:24 +0200
Subject: [PATCH 01/16] activated translations for settings

---
 InvenTree/templates/InvenTree/settings/setting.html | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/InvenTree/templates/InvenTree/settings/setting.html b/InvenTree/templates/InvenTree/settings/setting.html
index b7932fc30a..7376adf8d9 100644
--- a/InvenTree/templates/InvenTree/settings/setting.html
+++ b/InvenTree/templates/InvenTree/settings/setting.html
@@ -8,7 +8,7 @@
         <span class='fas {{ icon }}'></span>
         {% endif %}
     </td>
-    <td><b>{{ setting.name }}</b></td>
+    <td><b>{% trans setting.name %}</b></td>
     <td>
         {% if setting.is_bool %}
         <div>
@@ -24,7 +24,7 @@
         {% endif %}
         {% endif %}
     <td>
-        {{ setting.description }}
+        {% trans setting.description %}
     </td>
     <td>
         <div class='btn-group float-right'>

From 2de6fcbfa422d91727523edad7d94a3a2a45d887 Mon Sep 17 00:00:00 2001
From: Matthias <matmair@live.de>
Date: Sat, 3 Apr 2021 03:59:09 +0200
Subject: [PATCH 02/16] added missing translation fields #753

---
 InvenTree/InvenTree/models.py | 10 +++++++---
 InvenTree/build/forms.py      |  4 +++-
 InvenTree/build/models.py     |  5 ++++-
 InvenTree/company/forms.py    |  1 +
 InvenTree/company/models.py   | 12 ++++++------
 InvenTree/part/models.py      | 21 +++++++++++----------
 InvenTree/stock/forms.py      |  2 +-
 InvenTree/stock/models.py     |  6 +++---
 8 files changed, 36 insertions(+), 25 deletions(-)

diff --git a/InvenTree/InvenTree/models.py b/InvenTree/InvenTree/models.py
index cffe48cc0b..8494b52a10 100644
--- a/InvenTree/InvenTree/models.py
+++ b/InvenTree/InvenTree/models.py
@@ -56,19 +56,20 @@ class InvenTreeAttachment(models.Model):
     def __str__(self):
         return os.path.basename(self.attachment.name)
 
-    attachment = models.FileField(upload_to=rename_attachment,
+    attachment = models.FileField(upload_to=rename_attachment, verbose_name=_('Attachment'),
                                   help_text=_('Select file to attach'))
 
-    comment = models.CharField(blank=True, max_length=100, help_text=_('File comment'))
+    comment = models.CharField(blank=True, max_length=100, verbose_name=_('Comment'), help_text=_('File comment'))
 
     user = models.ForeignKey(
         User,
         on_delete=models.SET_NULL,
         blank=True, null=True,
+        verbose_name=_('User'),
         help_text=_('User'),
     )
 
-    upload_date = models.DateField(auto_now_add=True, null=True, blank=True)
+    upload_date = models.DateField(auto_now_add=True, null=True, blank=True, verbose_name=_('upload date'))
 
     @property
     def basename(self):
@@ -103,12 +104,14 @@ class InvenTreeTree(MPTTModel):
         blank=False,
         max_length=100,
         validators=[validate_tree_name],
+        verbose_name=_("Name"),
         help_text=_("Name"),
     )
 
     description = models.CharField(
         blank=True,
         max_length=250,
+        verbose_name=_("Description"),
         help_text=_("Description (optional)")
     )
 
@@ -117,6 +120,7 @@ class InvenTreeTree(MPTTModel):
                             on_delete=models.DO_NOTHING,
                             blank=True,
                             null=True,
+                            verbose_name=_("parent"),
                             related_name='children')
 
     @property
diff --git a/InvenTree/build/forms.py b/InvenTree/build/forms.py
index 4892fa631f..380c72f50d 100644
--- a/InvenTree/build/forms.py
+++ b/InvenTree/build/forms.py
@@ -36,11 +36,13 @@ class EditBuildForm(HelperForm):
     }
 
     target_date = DatePickerFormField(
+        label=_('Target Date'),
         help_text=_('Target date for build completion. Build will be overdue after this date.')
     )
 
     quantity = RoundingDecimalFormField(
         max_digits=10, decimal_places=5,
+        label=_('Quantity'),
         help_text=_('Number of items to build')
     )
 
@@ -87,7 +89,7 @@ class BuildOutputCreateForm(HelperForm):
     )
 
     serial_numbers = forms.CharField(
-        label=_('Serial numbers'),
+        label=_('Serial Numbers'),
         required=False,
         help_text=_('Enter serial numbers for build outputs'),
     )
diff --git a/InvenTree/build/models.py b/InvenTree/build/models.py
index ada9db1e08..1c668324a5 100644
--- a/InvenTree/build/models.py
+++ b/InvenTree/build/models.py
@@ -224,12 +224,13 @@ class Build(MPTTModel):
         help_text=_('Target date for build completion. Build will be overdue after this date.')
     )
 
-    completion_date = models.DateField(null=True, blank=True)
+    completion_date = models.DateField(null=True, blank=True, verbose_name=_('Completion Date'))
 
     completed_by = models.ForeignKey(
         User,
         on_delete=models.SET_NULL,
         blank=True, null=True,
+        verbose_name=_('completed by'),
         related_name='builds_completed'
     )
 
@@ -237,6 +238,7 @@ class Build(MPTTModel):
         User,
         on_delete=models.SET_NULL,
         blank=True, null=True,
+        verbose_name=_('Issued by'),
         help_text=_('User who issued this build order'),
         related_name='builds_issued',
     )
@@ -245,6 +247,7 @@ class Build(MPTTModel):
         UserModels.Owner,
         on_delete=models.SET_NULL,
         blank=True, null=True,
+        verbose_name=_('Responsible'),
         help_text=_('User responsible for this build order'),
         related_name='builds_responsible',
     )
diff --git a/InvenTree/company/forms.py b/InvenTree/company/forms.py
index 67ac402ba7..3d2826fdec 100644
--- a/InvenTree/company/forms.py
+++ b/InvenTree/company/forms.py
@@ -34,6 +34,7 @@ class EditCompanyForm(HelperForm):
 
     currency = django.forms.ChoiceField(
         required=False,
+        label=_('Currency'),
         help_text=_('Default currency used for this company'),
         choices=[('', '----------')] + djmoney.settings.CURRENCY_CHOICES,
         initial=common.settings.currency_code_default,
diff --git a/InvenTree/company/models.py b/InvenTree/company/models.py
index e4386712c8..c1b0594aac 100644
--- a/InvenTree/company/models.py
+++ b/InvenTree/company/models.py
@@ -126,11 +126,11 @@ class Company(models.Model):
 
     notes = MarkdownxField(blank=True)
 
-    is_customer = models.BooleanField(default=False, help_text=_('Do you sell items to this company?'))
+    is_customer = models.BooleanField(default=False, verbose_name=_('is customer'), help_text=_('Do you sell items to this company?'))
 
-    is_supplier = models.BooleanField(default=True, help_text=_('Do you purchase items from this company?'))
+    is_supplier = models.BooleanField(default=True, verbose_name=_('is supplier'), help_text=_('Do you purchase items from this company?'))
 
-    is_manufacturer = models.BooleanField(default=False, help_text=_('Does this company manufacture parts?'))
+    is_manufacturer = models.BooleanField(default=False, verbose_name=_('is manufacturer'), help_text=_('Does this company manufacture parts?'))
 
     currency = models.CharField(
         max_length=3,
@@ -366,11 +366,11 @@ class SupplierPart(models.Model):
         help_text=_('Notes')
     )
 
-    base_cost = models.DecimalField(max_digits=10, decimal_places=3, default=0, validators=[MinValueValidator(0)], help_text=_('Minimum charge (e.g. stocking fee)'))
+    base_cost = models.DecimalField(max_digits=10, decimal_places=3, default=0, validators=[MinValueValidator(0)], verbose_name=('base cost'), help_text=_('Minimum charge (e.g. stocking fee)'))
 
-    packaging = models.CharField(max_length=50, blank=True, null=True, help_text=_('Part packaging'))
+    packaging = models.CharField(max_length=50, blank=True, null=True, verbose_name=_('Packaging'), help_text=_('Part packaging'))
     
-    multiple = models.PositiveIntegerField(default=1, validators=[MinValueValidator(1)], help_text=('Order multiple'))
+    multiple = models.PositiveIntegerField(default=1, validators=[MinValueValidator(1)], verbose_name=_('multiple'), help_text=('Order multiple'))
 
     # TODO - Reimplement lead-time as a charfield with special validation (pattern matching).
     # lead_time = models.DurationField(blank=True, null=True)
diff --git a/InvenTree/part/models.py b/InvenTree/part/models.py
index 2824a89e75..9003e800d8 100644
--- a/InvenTree/part/models.py
+++ b/InvenTree/part/models.py
@@ -69,10 +69,11 @@ class PartCategory(InvenTreeTree):
         'stock.StockLocation', related_name="default_categories",
         null=True, blank=True,
         on_delete=models.SET_NULL,
+        verbose_name=_('Default Location'),
         help_text=_('Default location for parts in this category')
     )
 
-    default_keywords = models.CharField(null=True, blank=True, max_length=250, help_text=_('Default keywords for parts in this category'))
+    default_keywords = models.CharField(null=True, blank=True, max_length=250, verbose_name=_('Default keywords'), help_text=_('Default keywords for parts in this category'))
 
     def get_absolute_url(self):
         return reverse('category-detail', kwargs={'pk': self.id})
@@ -870,18 +871,18 @@ class Part(MPTTModel):
         help_text=_('Part notes - supports Markdown formatting')
     )
 
-    bom_checksum = models.CharField(max_length=128, blank=True, help_text=_('Stored BOM checksum'))
+    bom_checksum = models.CharField(max_length=128, blank=True, verbose_name=_('BOM checksum'), help_text=_('Stored BOM checksum'))
 
     bom_checked_by = models.ForeignKey(User, on_delete=models.SET_NULL, blank=True, null=True,
-                                       related_name='boms_checked')
+                                       verbose_name=_('BOM checked by'), related_name='boms_checked')
 
-    bom_checked_date = models.DateField(blank=True, null=True)
+    bom_checked_date = models.DateField(blank=True, null=True, verbose_name=_('BOM checked date'))
 
-    creation_date = models.DateField(auto_now_add=True, editable=False, blank=True, null=True)
+    creation_date = models.DateField(auto_now_add=True, editable=False, blank=True, null=True, verbose_name=_('Creation Date'))
 
-    creation_user = models.ForeignKey(User, on_delete=models.SET_NULL, blank=True, null=True, related_name='parts_created')
+    creation_user = models.ForeignKey(User, on_delete=models.SET_NULL, blank=True, null=True, verbose_name=_('Creation User'), related_name='parts_created')
 
-    responsible = models.ForeignKey(User, on_delete=models.SET_NULL, blank=True, null=True, related_name='parts_responible')
+    responsible = models.ForeignKey(User, on_delete=models.SET_NULL, blank=True, null=True, verbose_name=_('Responsible'), related_name='parts_responible')
 
     def format_barcode(self, **kwargs):
         """ Return a JSON string for formatting a barcode for this Part object """
@@ -2050,11 +2051,11 @@ class PartParameter(models.Model):
         # Prevent multiple instances of a parameter for a single part
         unique_together = ('part', 'template')
 
-    part = models.ForeignKey(Part, on_delete=models.CASCADE, related_name='parameters', help_text=_('Parent Part'))
+    part = models.ForeignKey(Part, on_delete=models.CASCADE, related_name='parameters', verbose_name=_('Part'), help_text=_('Parent Part'))
 
-    template = models.ForeignKey(PartParameterTemplate, on_delete=models.CASCADE, related_name='instances', help_text=_('Parameter Template'))
+    template = models.ForeignKey(PartParameterTemplate, on_delete=models.CASCADE, related_name='instances', verbose_name=_('Template'), help_text=_('Parameter Template'))
 
-    data = models.CharField(max_length=500, help_text=_('Parameter Value'))
+    data = models.CharField(max_length=500, verbose_name=_('Data'), help_text=_('Parameter Value'))
 
     @classmethod
     def create(cls, part, template, data, save=False):
diff --git a/InvenTree/stock/forms.py b/InvenTree/stock/forms.py
index 0bec20a3e8..9bc5063925 100644
--- a/InvenTree/stock/forms.py
+++ b/InvenTree/stock/forms.py
@@ -114,7 +114,7 @@ class CreateStockItemForm(HelperForm):
         help_text=('Expiration date for this stock item'),
     )
 
-    serial_numbers = forms.CharField(label=_('Serial numbers'), required=False, help_text=_('Enter unique serial numbers (or leave blank)'))
+    serial_numbers = forms.CharField(label=_('Serial Numbers'), required=False, help_text=_('Enter unique serial numbers (or leave blank)'))
 
     def __init__(self, *args, **kwargs):
         
diff --git a/InvenTree/stock/models.py b/InvenTree/stock/models.py
index 1be988fed0..df767a3a70 100644
--- a/InvenTree/stock/models.py
+++ b/InvenTree/stock/models.py
@@ -1548,11 +1548,11 @@ class StockItemTracking(models.Model):
 
     date = models.DateTimeField(auto_now_add=True, editable=False)
 
-    title = models.CharField(blank=False, max_length=250, help_text=_('Tracking entry title'))
+    title = models.CharField(blank=False, max_length=250, verbose_name=_('Title'), help_text=_('Tracking entry title'))
 
-    notes = models.CharField(blank=True, max_length=512, help_text=_('Entry notes'))
+    notes = models.CharField(blank=True, max_length=512, verbose_name=_('Notes'), help_text=_('Entry notes'))
 
-    link = InvenTreeURLField(blank=True, help_text=_('Link to external page for further information'))
+    link = InvenTreeURLField(blank=True, verbose_name=_('Link'), help_text=_('Link to external page for further information'))
 
     user = models.ForeignKey(User, on_delete=models.SET_NULL, blank=True, null=True)
 

From 446bc06c1bf172d0b806a5b9f5b2e79ad5bf6c5f Mon Sep 17 00:00:00 2001
From: Matthias <matmair@live.de>
Date: Sat, 3 Apr 2021 04:01:40 +0200
Subject: [PATCH 03/16] switched translation methode to lazy

---
 InvenTree/InvenTree/forms.py | 2 +-
 InvenTree/build/forms.py     | 2 +-
 InvenTree/build/models.py    | 2 +-
 InvenTree/build/views.py     | 2 +-
 InvenTree/common/models.py   | 2 +-
 InvenTree/company/forms.py   | 2 +-
 InvenTree/company/models.py  | 2 +-
 InvenTree/order/forms.py     | 2 +-
 InvenTree/order/models.py    | 2 +-
 InvenTree/part/forms.py      | 2 +-
 InvenTree/stock/forms.py     | 2 +-
 InvenTree/stock/views.py     | 2 +-
 12 files changed, 12 insertions(+), 12 deletions(-)

diff --git a/InvenTree/InvenTree/forms.py b/InvenTree/InvenTree/forms.py
index 56a1a116da..79cdf49c3d 100644
--- a/InvenTree/InvenTree/forms.py
+++ b/InvenTree/InvenTree/forms.py
@@ -5,7 +5,7 @@ Helper forms which subclass Django forms to provide additional functionality
 # -*- coding: utf-8 -*-
 from __future__ import unicode_literals
 
-from django.utils.translation import ugettext as _
+from django.utils.translation import ugettext_lazy as _
 from django import forms
 from crispy_forms.helper import FormHelper
 from crispy_forms.layout import Layout, Field
diff --git a/InvenTree/build/forms.py b/InvenTree/build/forms.py
index 380c72f50d..48be9a0ffa 100644
--- a/InvenTree/build/forms.py
+++ b/InvenTree/build/forms.py
@@ -5,7 +5,7 @@ Django Forms for interacting with Build objects
 # -*- coding: utf-8 -*-
 from __future__ import unicode_literals
 
-from django.utils.translation import ugettext as _
+from django.utils.translation import ugettext_lazy as _
 from django import forms
 
 from InvenTree.forms import HelperForm
diff --git a/InvenTree/build/models.py b/InvenTree/build/models.py
index 1c668324a5..ad0149ed48 100644
--- a/InvenTree/build/models.py
+++ b/InvenTree/build/models.py
@@ -9,7 +9,7 @@ import os
 from datetime import datetime
 
 from django.contrib.auth.models import User
-from django.utils.translation import ugettext as _
+from django.utils.translation import ugettext_lazy as _
 from django.core.exceptions import ValidationError
 
 from django.urls import reverse
diff --git a/InvenTree/build/views.py b/InvenTree/build/views.py
index e8a1d33ddc..15ced77130 100644
--- a/InvenTree/build/views.py
+++ b/InvenTree/build/views.py
@@ -5,7 +5,7 @@ Django views for interacting with Build objects
 # -*- coding: utf-8 -*-
 from __future__ import unicode_literals
 
-from django.utils.translation import ugettext as _
+from django.utils.translation import ugettext_lazy as _
 from django.core.exceptions import ValidationError
 from django.views.generic import DetailView, ListView, UpdateView
 from django.forms import HiddenInput
diff --git a/InvenTree/common/models.py b/InvenTree/common/models.py
index df8e3b2d37..12b51438cb 100644
--- a/InvenTree/common/models.py
+++ b/InvenTree/common/models.py
@@ -17,7 +17,7 @@ from djmoney.models.fields import MoneyField
 from djmoney.contrib.exchange.models import convert_money
 from djmoney.contrib.exchange.exceptions import MissingRate
 
-from django.utils.translation import ugettext as _
+from django.utils.translation import ugettext_lazy as _
 from django.core.validators import MinValueValidator, URLValidator
 from django.core.exceptions import ValidationError
 
diff --git a/InvenTree/company/forms.py b/InvenTree/company/forms.py
index 3d2826fdec..2677402334 100644
--- a/InvenTree/company/forms.py
+++ b/InvenTree/company/forms.py
@@ -8,7 +8,7 @@ from __future__ import unicode_literals
 from InvenTree.forms import HelperForm
 from InvenTree.fields import RoundingDecimalFormField
 
-from django.utils.translation import ugettext as _
+from django.utils.translation import ugettext_lazy as _
 import django.forms
 
 import djmoney.settings
diff --git a/InvenTree/company/models.py b/InvenTree/company/models.py
index c1b0594aac..e05d81a16a 100644
--- a/InvenTree/company/models.py
+++ b/InvenTree/company/models.py
@@ -9,7 +9,7 @@ import os
 
 import math
 
-from django.utils.translation import gettext_lazy as _
+from django.utils.translation import ugettext_lazy as _
 from django.core.validators import MinValueValidator
 from django.db import models
 from django.db.models import Sum, Q, UniqueConstraint
diff --git a/InvenTree/order/forms.py b/InvenTree/order/forms.py
index bb6cb40889..c8501d68b2 100644
--- a/InvenTree/order/forms.py
+++ b/InvenTree/order/forms.py
@@ -6,7 +6,7 @@ Django Forms for interacting with Order objects
 from __future__ import unicode_literals
 
 from django import forms
-from django.utils.translation import ugettext as _
+from django.utils.translation import ugettext_lazy as _
 
 from mptt.fields import TreeNodeChoiceField
 
diff --git a/InvenTree/order/models.py b/InvenTree/order/models.py
index cb78eabc6a..b1ee7f7c74 100644
--- a/InvenTree/order/models.py
+++ b/InvenTree/order/models.py
@@ -15,7 +15,7 @@ from django.core.validators import MinValueValidator
 from django.core.exceptions import ValidationError
 from django.contrib.auth.models import User
 from django.urls import reverse
-from django.utils.translation import ugettext as _
+from django.utils.translation import ugettext_lazy as _
 
 from markdownx.models import MarkdownxField
 
diff --git a/InvenTree/part/forms.py b/InvenTree/part/forms.py
index 7962ec3252..42970ccfb1 100644
--- a/InvenTree/part/forms.py
+++ b/InvenTree/part/forms.py
@@ -11,7 +11,7 @@ from InvenTree.fields import RoundingDecimalFormField
 
 from mptt.fields import TreeNodeChoiceField
 from django import forms
-from django.utils.translation import ugettext as _
+from django.utils.translation import ugettext_lazy as _
 
 import common.models
 
diff --git a/InvenTree/stock/forms.py b/InvenTree/stock/forms.py
index 9bc5063925..3560f205cc 100644
--- a/InvenTree/stock/forms.py
+++ b/InvenTree/stock/forms.py
@@ -7,7 +7,7 @@ from __future__ import unicode_literals
 
 from django import forms
 from django.forms.utils import ErrorDict
-from django.utils.translation import ugettext as _
+from django.utils.translation import ugettext_lazy as _
 from django.core.validators import MinValueValidator
 from django.core.exceptions import ValidationError
 
diff --git a/InvenTree/stock/views.py b/InvenTree/stock/views.py
index 6edcb8cf70..eeee13ad3a 100644
--- a/InvenTree/stock/views.py
+++ b/InvenTree/stock/views.py
@@ -14,7 +14,7 @@ from django.urls import reverse
 from django.contrib.auth import get_user_model
 from django.contrib.auth.models import Group
 
-from django.utils.translation import ugettext as _
+from django.utils.translation import ugettext_lazy as _
 
 from moneyed import CURRENCIES
 

From 0547e1c03bf1d9b82a914555b7272c545552c0fa Mon Sep 17 00:00:00 2001
From: Matthias <matmair@live.de>
Date: Sat, 3 Apr 2021 04:05:59 +0200
Subject: [PATCH 04/16] added more translations in html / js

---
 .../build/templates/build/build_base.html     |  4 +--
 .../templates/company/company_base.html       |  6 ++--
 .../company/supplier_part_orders.html         |  2 +-
 .../order/order_wizard/select_parts.html      |  2 +-
 .../order/order_wizard/select_pos.html        |  2 +-
 .../order/templates/order/receive_parts.html  |  2 +-
 .../templates/order/sales_order_base.html     |  2 +-
 .../part/bom_upload/select_fields.html        |  4 +--
 InvenTree/part/templates/part/params.html     |  4 +--
 InvenTree/part/templates/part/part_base.html  |  2 +-
 .../part/templates/part/part_pricing.html     | 30 ++++++++++---------
 .../stock/templates/stock/item_base.html      |  2 +-
 InvenTree/stock/templates/stock/location.html |  6 ++--
 .../stock/templates/stock/stock_adjust.html   |  2 +-
 InvenTree/templates/InvenTree/search.html     |  8 ++---
 InvenTree/templates/js/modals.js              |  2 +-
 InvenTree/templates/js/stock.js               |  4 +--
 InvenTree/templates/qr_button.html            |  2 +-
 18 files changed, 44 insertions(+), 42 deletions(-)

diff --git a/InvenTree/build/templates/build/build_base.html b/InvenTree/build/templates/build/build_base.html
index 83cef5bd44..a8e5e53377 100644
--- a/InvenTree/build/templates/build/build_base.html
+++ b/InvenTree/build/templates/build/build_base.html
@@ -164,7 +164,7 @@ src="{% static 'img/blank_image.png' %}"
         launchModalForm("{% url 'build-cancel' build.id %}",
                         {
                             reload: true,
-                            submit_text: "Cancel Build",
+                            submit_text: '{% trans "Cancel Build" %}',
                         });
     });
 
@@ -173,7 +173,7 @@ src="{% static 'img/blank_image.png' %}"
             "{% url 'build-complete' build.id %}",
             {
                 reload: true,
-                submit_text: "Complete Build",
+                submit_text: '{% trans "Complete Build" %}',
             }
         );
     });
diff --git a/InvenTree/company/templates/company/company_base.html b/InvenTree/company/templates/company/company_base.html
index 9331e5d895..236cc58981 100644
--- a/InvenTree/company/templates/company/company_base.html
+++ b/InvenTree/company/templates/company/company_base.html
@@ -43,17 +43,17 @@ InvenTree | {% trans "Company" %} - {{ company.name }}
 <p>{{ company.description }}</p>
 <div class='btn-group action-buttons'>
     {% if company.is_supplier and roles.purchase_order.add %}
-    <button type='button' class='btn btn-default' id='company-order-2' title='Create purchase order'>
+    <button type='button' class='btn btn-default' id='company-order-2' title='{% trans "Create Purchase Order" %}'>
         <span class='fas fa-shopping-cart'/>
     </button>
     {% endif %}
     {% if perms.company.change_company %}
-    <button type='button' class='btn btn-default' id='company-edit' title='Edit company information'>
+    <button type='button' class='btn btn-default' id='company-edit' title='{% trans "Edit company information" %}'>
         <span class='fas fa-edit icon-green'/>
     </button>
     {% endif %}
     {% if perms.company.delete_company %}
-    <button type='button' class='btn btn-default' id='company-delete' title='Delete company'>
+    <button type='button' class='btn btn-default' id='company-delete' title='{% trans "Delete Company" %}'>
         <span class='fas fa-trash-alt icon-red'/>
     </button>
     {% endif %}
diff --git a/InvenTree/company/templates/company/supplier_part_orders.html b/InvenTree/company/templates/company/supplier_part_orders.html
index ae4b025b11..f01bfa68d1 100644
--- a/InvenTree/company/templates/company/supplier_part_orders.html
+++ b/InvenTree/company/templates/company/supplier_part_orders.html
@@ -14,7 +14,7 @@
 {% if roles.purchase_order.add %}
 <div id='button-bar'>
     <div class='btn-group'>
-        <button class='btn btn-primary' type='button' id='order-part2' title='Order part'>
+        <button class='btn btn-primary' type='button' id='order-part2' title='{% trans "Order part" %}'>
             <span class='fas fa-shopping-cart'></span> {% trans "Order Part" %}</button>
     </div>
 </div>
diff --git a/InvenTree/order/templates/order/order_wizard/select_parts.html b/InvenTree/order/templates/order/order_wizard/select_parts.html
index c93e26e363..21e23266bb 100644
--- a/InvenTree/order/templates/order/order_wizard/select_parts.html
+++ b/InvenTree/order/templates/order/order_wizard/select_parts.html
@@ -66,7 +66,7 @@
                 </div>
             </td>
             <td>
-                <button class='btn btn-default btn-remove' onclick='removeOrderRowFromOrderWizard()' id='del_item_{{ part.id }}' title='Remove part' type='button'>
+                <button class='btn btn-default btn-remove' onclick='removeOrderRowFromOrderWizard()' id='del_item_{{ part.id }}' title='{% trans "Remove part" %}' type='button'>
                     <span row='part_row_{{ part.id }}' class='fas fa-trash-alt icon-red'></span>
                 </button>
             </td>
diff --git a/InvenTree/order/templates/order/order_wizard/select_pos.html b/InvenTree/order/templates/order/order_wizard/select_pos.html
index 3c322410ca..616e618deb 100644
--- a/InvenTree/order/templates/order/order_wizard/select_pos.html
+++ b/InvenTree/order/templates/order/order_wizard/select_pos.html
@@ -42,7 +42,7 @@
                 <button 
                     class='btn btn-default btn-create'
                     id='new_po_{{ supplier.id }}'
-                    title='Create new purchase order for {{ supplier.name }}'
+                    title='{% trans "Create new purchase order for {{ supplier.name }}" %}'
                     type='button'
                     supplierid='{{ supplier.id }}' 
                     onclick='newPurchaseOrderFromOrderWizard()'>
diff --git a/InvenTree/order/templates/order/receive_parts.html b/InvenTree/order/templates/order/receive_parts.html
index 082fe083b9..3daa9119d8 100644
--- a/InvenTree/order/templates/order/receive_parts.html
+++ b/InvenTree/order/templates/order/receive_parts.html
@@ -54,7 +54,7 @@
                 </div>
             </td>
             <td>
-                <button class='btn btn-default btn-remove' onClick="removeOrderRowFromOrderWizard()" id='del_item_{{ line.id }}' title='Remove line' type='button'>
+                <button class='btn btn-default btn-remove' onClick="removeOrderRowFromOrderWizard()" id='del_item_{{ line.id }}' title='{% trans "Remove line" %}' type='button'>
                     <span row='line_row_{{ line.id }}' class='fas fa-times-circle icon-red'></span>
                 </button>
             </td>
diff --git a/InvenTree/order/templates/order/sales_order_base.html b/InvenTree/order/templates/order/sales_order_base.html
index ac4ebcf2bc..dfab8d1ae7 100644
--- a/InvenTree/order/templates/order/sales_order_base.html
+++ b/InvenTree/order/templates/order/sales_order_base.html
@@ -49,7 +49,7 @@ src="{% static 'img/blank_image.png' %}"
             <span class='fas fa-print'></span> 
         </button>
         {% if roles.sales_order.change %}
-        <button type='button' class='btn btn-default' id='edit-order' title='Edit order information'>
+        <button type='button' class='btn btn-default' id='edit-order' title='{% trans "Edit order information" %}'>
             <span class='fas fa-edit icon-green'></span>
         </button>
         {% if order.status == SalesOrderStatus.PENDING %}
diff --git a/InvenTree/part/templates/part/bom_upload/select_fields.html b/InvenTree/part/templates/part/bom_upload/select_fields.html
index 5e44cee2b9..e82223da88 100644
--- a/InvenTree/part/templates/part/bom_upload/select_fields.html
+++ b/InvenTree/part/templates/part/bom_upload/select_fields.html
@@ -44,7 +44,7 @@
                     <div>
                         <input type='hidden' name='col_name_{{ forloop.counter0 }}' value='{{ col.name }}'/>
                         {{ col.name }}
-                        <button class='btn btn-default btn-remove' onClick='removeColFromBomWizard()' id='del_col_{{ forloop.counter0 }}' style='display: inline; float: right;' title='Remove column'>
+                        <button class='btn btn-default btn-remove' onClick='removeColFromBomWizard()' id='del_col_{{ forloop.counter0 }}' style='display: inline; float: right;' title='{% trans "Remove column" %}'>
                             <span col_id='{{ forloop.counter0 }}' class='fas fa-trash-alt icon-red'></span>
                         </button>
                     </div>
@@ -73,7 +73,7 @@
             {% for row in bom_rows %}
             <tr>
                 <td>
-                    <button class='btn btn-default btn-remove' onClick='removeRowFromBomWizard()' id='del_row_{{ forloop.counter }}' style='display: inline; float: right;' title='Remove row'>
+                    <button class='btn btn-default btn-remove' onClick='removeRowFromBomWizard()' id='del_row_{{ forloop.counter }}' style='display: inline; float: right;' title='{% trans "Remove row" %}'>
                         <span row_id='{{ forloop.counter }}' class='fas fa-trash-alt icon-red'></span>
                     </button>
                 </td>
diff --git a/InvenTree/part/templates/part/params.html b/InvenTree/part/templates/part/params.html
index 52b32d0643..b8cb1ae563 100644
--- a/InvenTree/part/templates/part/params.html
+++ b/InvenTree/part/templates/part/params.html
@@ -65,8 +65,8 @@
             reload: true,
             secondary: [{
                 field: 'template',
-                label: 'New Template',
-                title: 'Create New Parameter Template',
+                label: '{% trans "New Template" %}',
+                title: '{% trans "Create New Parameter Template" %}',
                 url: "{% url 'part-param-template-create' %}"
             }],
         });
diff --git a/InvenTree/part/templates/part/part_base.html b/InvenTree/part/templates/part/part_base.html
index 96c9636c88..f11fe879ce 100644
--- a/InvenTree/part/templates/part/part_base.html
+++ b/InvenTree/part/templates/part/part_base.html
@@ -246,7 +246,7 @@
         launchModalForm(
             "{% url 'part-pricing' part.id %}",
             {
-                submit_text: 'Calculate',
+                submit_text: '{% trans "Calculate" %}',
                 hideErrorMessage: true,
             }
         );
diff --git a/InvenTree/part/templates/part/part_pricing.html b/InvenTree/part/templates/part/part_pricing.html
index c0b23ffbd7..7865bb2fbe 100644
--- a/InvenTree/part/templates/part/part_pricing.html
+++ b/InvenTree/part/templates/part/part_pricing.html
@@ -1,35 +1,37 @@
 {% extends "modal_form.html" %}
 
+{% load i18n %}
+
 {% block pre_form_content %}
 
 <div class='alert alert-info alert-block'>
-Pricing information for:<br>
+{% trans 'Pricing information for:' %}<br>
 {{ part }}.
 </div>
 
-<h4>Quantity</h4>
+<h4>{% trans 'Quantity' %}</h4>
 <table class='table table-striped table-condensed'>
     <tr>
-        <td><b>Part</b></td>
+        <td><b>{% trans 'Part' %}</b></td>
         <td colspan='2'>{{ part  }}</td>
     </tr>
     <tr>
-        <td><b>Quantity</b></td>
+        <td><b>{% trans 'Quantity' %}</b></td>
         <td colspan='2'>{{ quantity }}</td>
     </tr>
 </table>
     {% if part.supplier_count > 0 %}
-    <h4>Supplier Pricing</h4>
+    <h4>{% trans 'Supplier Pricing' %}</h4>
 <table class='table table-striped table-condensed'>
     {% if min_total_buy_price %}
     <tr>
-        <td><b>Unit Cost</b></td>
+        <td><b>{% trans 'Unit Cost' %}</b></td>
         <td>Min: {% include "price.html" with price=min_unit_buy_price %}</td>
         <td>Max: {% include "price.html" with price=max_unit_buy_price %}</td>
     </tr>
     {% if quantity > 1 %}
     <tr>
-        <td><b>Total Cost</b></td>
+        <td><b>{% trans 'Total Cost' %}</b></td>
         <td>Min: {% include "price.html" with price=min_total_buy_price %}</td>
         <td>Max: {% include "price.html" with price=max_total_buy_price %}</td>
     </tr>
@@ -37,7 +39,7 @@ Pricing information for:<br>
     {% else %}
     <tr>
         <td colspan='3'>
-            <span class='warning-msg'><i>No supplier pricing available</i></span>
+            <span class='warning-msg'><i>{% trans 'No supplier pricing available' %}</i></span>
         </td>
     </tr>
     {% endif %}
@@ -45,17 +47,17 @@ Pricing information for:<br>
     {% endif %}
 
     {% if part.bom_count > 0 %}
-    <h4>BOM Pricing</h4>
+    <h4>{% trans 'BOM Pricing' %}</h4>
 <table class='table table-striped table-condensed'>
     {% if min_total_bom_price %}
     <tr>
-        <td><b>Unit Cost</b></td>
+        <td><b>{% trans 'Unit Cost' %}</b></td>
         <td>Min: {% include "price.html" with price=min_unit_bom_price %}</td>
         <td>Max: {% include "price.html" with price=max_unit_bom_price %}</td>
     </tr>
     {% if quantity > 1 %}
     <tr>
-        <td><b>Total Cost</b></td>
+        <td><b>{% trans 'Total Cost' %}</b></td>
         <td>Min: {% include "price.html" with price=min_total_bom_price %}</td>
         <td>Max: {% include "price.html" with price=max_total_bom_price %}</td>
     </tr>
@@ -63,14 +65,14 @@ Pricing information for:<br>
     {% if part.has_complete_bom_pricing == False %}
     <tr>
         <td colspan='3'>
-            <span class='warning-msg'><i>Note: BOM pricing is incomplete for this part</i></span>
+            <span class='warning-msg'><i>{% trans 'Note: BOM pricing is incomplete for this part' %}</i></span>
         </td>
     </tr>
     {% endif %}
     {% else %}
     <tr>
         <td colspan='3'>
-            <span class='warning-msg'><i>No BOM pricing available</i></span>
+            <span class='warning-msg'><i>{% trans 'No BOM pricing available' %}</i></span>
         </td>
     </tr>
     {% endif %}
@@ -80,7 +82,7 @@ Pricing information for:<br>
 {% if min_unit_buy_price or min_unit_bom_price %}
 {% else %}
 <div class='alert alert-danger alert-block'>
-    No pricing information is available for this part.
+    {% trans 'No pricing information is available for this part.' %}
 </div>
 {% endif %}
 
diff --git a/InvenTree/stock/templates/stock/item_base.html b/InvenTree/stock/templates/stock/item_base.html
index f5459dac27..a72b727f69 100644
--- a/InvenTree/stock/templates/stock/item_base.html
+++ b/InvenTree/stock/templates/stock/item_base.html
@@ -451,7 +451,7 @@ $("#stock-edit").click(function () {
         "{% url 'stock-item-edit' item.id %}",
         {
             reload: true,
-            submit_text: "Save",
+            submit_text: '{% trans "Save" %}',
         }
     );
 });
diff --git a/InvenTree/stock/templates/stock/location.html b/InvenTree/stock/templates/stock/location.html
index 5c2b4e04db..74e43f88bb 100644
--- a/InvenTree/stock/templates/stock/location.html
+++ b/InvenTree/stock/templates/stock/location.html
@@ -160,7 +160,7 @@
 
     $("#stock-export").click(function() {
         launchModalForm("{% url 'stock-export-options' %}", {
-            submit_text: "Export",
+            submit_text: '{% trans "Export" %}',
             success: function(response) {
                 var url = "{% url 'stock-export' %}";
                 
@@ -188,8 +188,8 @@
                             secondary: [
                                 {
                                     field: 'parent',
-                                    label: 'New Location',
-                                    title: 'Create new location',
+                                    label: '{% trans "New Location" %}',
+                                    title: '{% trans "Create new location" %}',
                                     url: "{% url 'stock-location-create' %}",
                                 },
                             ]
diff --git a/InvenTree/stock/templates/stock/stock_adjust.html b/InvenTree/stock/templates/stock/stock_adjust.html
index a72407f735..5ba98231b0 100644
--- a/InvenTree/stock/templates/stock/stock_adjust.html
+++ b/InvenTree/stock/templates/stock/stock_adjust.html
@@ -40,7 +40,7 @@
             <input type='hidden' name='stock-id-{{ item.id }}' value='{{ item.new_quantity }}'/>
             {% endif %}  
           </td>
-          <td><button class='btn btn-default btn-remove' onclick='removeStockRow()' id='del-{{ item.id }}' title='Remove item' type='button'><span row='stock-row-{{ item.id }}' class='fas fa-trash-alt icon-red'></span></button></td>
+          <td><button class='btn btn-default btn-remove' onclick='removeStockRow()' id='del-{{ item.id }}' title='{% trans "Remove item" %}' type='button'><span row='stock-row-{{ item.id }}' class='fas fa-trash-alt icon-red'></span></button></td>
       </tr>
       {% endfor %}
     </table>
diff --git a/InvenTree/templates/InvenTree/search.html b/InvenTree/templates/InvenTree/search.html
index 5eb755dcb2..b65ec00c00 100644
--- a/InvenTree/templates/InvenTree/search.html
+++ b/InvenTree/templates/InvenTree/search.html
@@ -133,14 +133,14 @@ InvenTree | {% trans "Search Results" %}
         columns: [
             {
                 field: 'name',
-                title: 'Name',
+                title: '{% trans "Name" %}',
                 formatter: function(value, row, index, field) {
                     return renderLink(value, '/part/category/' + row.pk + '/');
                 },
             },
             {
                 field: 'description',
-                title: 'Description',
+                title: '{% trans "Description" %}',
             },
         ],
     });
@@ -270,14 +270,14 @@ InvenTree | {% trans "Search Results" %}
         columns: [
             {
                 field: 'name',
-                title: 'Name',
+                title: '{% trans "Name" %}',
                 formatter: function(value, row, index, field) {
                     return renderLink(row.pathstring, '/stock/location/' + row.pk + '/');
                 },
             },
             {
                 field: 'description',
-                title: 'Description',
+                title: '{% trans "Description" %}',
             },
         ],
     });
diff --git a/InvenTree/templates/js/modals.js b/InvenTree/templates/js/modals.js
index 2c246d2a36..004e81c000 100644
--- a/InvenTree/templates/js/modals.js
+++ b/InvenTree/templates/js/modals.js
@@ -253,7 +253,7 @@ function loadingMessageContent() {
      */
 
     // TODO - This can be made a lot better
-    return "<span class='glyphicon glyphicon-refresh glyphicon-refresh-animate'></span> Waiting for server...";
+    return "<span class='glyphicon glyphicon-refresh glyphicon-refresh-animate'></span> {% trans 'Waiting for server...' %}";
 }
 
 
diff --git a/InvenTree/templates/js/stock.js b/InvenTree/templates/js/stock.js
index bfb539c3c5..02714810e3 100644
--- a/InvenTree/templates/js/stock.js
+++ b/InvenTree/templates/js/stock.js
@@ -976,8 +976,8 @@ function loadStockTrackingTable(table, options) {
         formatter: function(value, row, index, field) {
             // Manually created entries can be edited or deleted
             if (!row.system) {
-                var bEdit = "<button title='Edit tracking entry' class='btn btn-entry-edit btn-default btn-glyph' type='button' url='/stock/track/" + row.pk + "/edit/'><span class='fas fa-edit'/></button>";
-                var bDel = "<button title='Delete tracking entry' class='btn btn-entry-delete btn-default btn-glyph' type='button' url='/stock/track/" + row.pk + "/delete/'><span class='fas fa-trash-alt icon-red'/></button>";
+                var bEdit = "<button title='{% trans 'Edit tracking entry' %}' class='btn btn-entry-edit btn-default btn-glyph' type='button' url='/stock/track/" + row.pk + "/edit/'><span class='fas fa-edit'/></button>";
+                var bDel = "<button title='{% trans 'Delete tracking entry' %}' class='btn btn-entry-delete btn-default btn-glyph' type='button' url='/stock/track/" + row.pk + "/delete/'><span class='fas fa-trash-alt icon-red'/></button>";
 
                 return "<div class='btn-group' role='group'>" + bEdit + bDel + "</div>";
             } else {
diff --git a/InvenTree/templates/qr_button.html b/InvenTree/templates/qr_button.html
index cc10e0cd26..5ed65d32ab 100644
--- a/InvenTree/templates/qr_button.html
+++ b/InvenTree/templates/qr_button.html
@@ -1 +1 @@
-<button type='button' class='btn btn-default' id='show-qr-code' title='Show QR code'><span class='fas fa-qrcode'></span></button>
\ No newline at end of file
+<button type='button' class='btn btn-default' id='show-qr-code' title='{% trans "Show QR Code" %}'><span class='fas fa-qrcode'></span></button>
\ No newline at end of file

From 1854da380b7e758501261d9731ea86adef338a68 Mon Sep 17 00:00:00 2001
From: Matthias <matmair@live.de>
Date: Sat, 3 Apr 2021 04:07:27 +0200
Subject: [PATCH 05/16] made filters.js dynamic for translation

---
 InvenTree/InvenTree/urls.py                            |  1 +
 InvenTree/templates/base.html                          |  2 +-
 .../script/inventree => templates/js}/filters.js       | 10 ++++++----
 3 files changed, 8 insertions(+), 5 deletions(-)
 rename InvenTree/{InvenTree/static/script/inventree => templates/js}/filters.js (94%)

diff --git a/InvenTree/InvenTree/urls.py b/InvenTree/InvenTree/urls.py
index a9f53a7014..7c22639e65 100644
--- a/InvenTree/InvenTree/urls.py
+++ b/InvenTree/InvenTree/urls.py
@@ -110,6 +110,7 @@ dynamic_javascript_urls = [
     url(r'^stock.js', DynamicJsView.as_view(template_name='js/stock.js'), name='stock.js'),
     url(r'^tables.js', DynamicJsView.as_view(template_name='js/tables.js'), name='tables.js'),
     url(r'^table_filters.js', DynamicJsView.as_view(template_name='js/table_filters.js'), name='table_filters.js'),
+    url(r'^filters.js', DynamicJsView.as_view(template_name='js/filters.js'), name='filters.js'),
 ]
 
 urlpatterns = [
diff --git a/InvenTree/templates/base.html b/InvenTree/templates/base.html
index 2120d0ccfb..aa571ef19a 100644
--- a/InvenTree/templates/base.html
+++ b/InvenTree/templates/base.html
@@ -139,7 +139,6 @@ InvenTree
 
 <script type='text/javascript' src="{% static 'script/inventree/inventree.js' %}"></script>
 <script type='text/javascript' src="{% static 'script/inventree/api.js' %}"></script>
-<script type='text/javascript' src="{% static 'script/inventree/filters.js' %}"></script>
 <script type='text/javascript' src="{% static 'script/inventree/notification.js' %}"></script>
 <script type='text/javascript' src="{% static 'script/inventree/sidenav.js' %}"></script>
 
@@ -156,6 +155,7 @@ InvenTree
 <script type='text/javascript' src="{% url 'calendar.js' %}"></script>
 <script type='text/javascript' src="{% url 'tables.js' %}"></script>
 <script type='text/javascript' src="{% url 'table_filters.js' %}"></script>
+<script type='text/javascript' src="{% url 'filters.js' %}"></script>
 
 <script type='text/javascript' src="{% static 'fontawesome/js/solid.js' %}"></script>
 <script type='text/javascript' src="{% static 'fontawesome/js/brands.js' %}"></script>
diff --git a/InvenTree/InvenTree/static/script/inventree/filters.js b/InvenTree/templates/js/filters.js
similarity index 94%
rename from InvenTree/InvenTree/static/script/inventree/filters.js
rename to InvenTree/templates/js/filters.js
index df767441d4..01b74763e0 100644
--- a/InvenTree/InvenTree/static/script/inventree/filters.js
+++ b/InvenTree/templates/js/filters.js
@@ -1,3 +1,5 @@
+{% load i18n %}
+
 /**
  * Code for managing query filters / table options.
  * 
@@ -188,7 +190,7 @@ function generateAvailableFilterList(tableKey) {
 
     var html = `<select class='form-control filter-input' id='${id}' name='tag'>`;
     
-    html += `<option value=''>Select filter</option>`;
+    html += "<option value=''>{% trans 'Select filter' %}</option>";
 
     for (var opt in remaining) {
         var title = getFilterTitle(tableKey, opt);
@@ -263,10 +265,10 @@ function setupFilterList(tableKey, table, target) {
     // One blank slate, please
     element.empty();
 
-    element.append(`<button id='${add}' title='Add new filter' class='btn btn-default filter-tag'><span class='fas fa-filter'></span></button>`);
+    element.append(`<button id='${add}' title='{% trans "Add new filter" %}' class='btn btn-default filter-tag'><span class='fas fa-filter'></span></button>`);
 
     if (Object.keys(filters).length > 0) {
-        element.append(`<button id='${clear}' title='Clear all filters' class='btn btn-default filter-tag'><span class='fas fa-trash-alt'></span></button>`);
+        element.append(`<button id='${clear}' title='{% trans "Clear all filters" %}' class='btn btn-default filter-tag'><span class='fas fa-trash-alt'></span></button>`);
     }
 
     for (var key in filters) {
@@ -291,7 +293,7 @@ function setupFilterList(tableKey, table, target) {
             html += generateAvailableFilterList(tableKey);
             html += generateFilterInput(tableKey);
 
-            html += `<button title='Create filter' class='btn btn-default filter-tag' id='${make}'><span class='fas fa-plus'></span></button>`;
+            html += `<button title='{% trans "Create filter" %}' class='btn btn-default filter-tag' id='${make}'><span class='fas fa-plus'></span></button>`;
 
             //html += '</div>';
 

From f67210b20f027efcdce3a77aad08315ca0ea38cf Mon Sep 17 00:00:00 2001
From: Matthias <matmair@live.de>
Date: Sat, 3 Apr 2021 04:11:40 +0200
Subject: [PATCH 06/16] added translation files for changes

---
 InvenTree/locale/de/LC_MESSAGES/django.po | 1110 +++++++++++++--------
 InvenTree/locale/en/LC_MESSAGES/django.po |  894 ++++++++++-------
 InvenTree/locale/es/LC_MESSAGES/django.po |  894 ++++++++++-------
 3 files changed, 1812 insertions(+), 1086 deletions(-)

diff --git a/InvenTree/locale/de/LC_MESSAGES/django.po b/InvenTree/locale/de/LC_MESSAGES/django.po
index d3ad0b4a69..75d6d455e2 100644
--- a/InvenTree/locale/de/LC_MESSAGES/django.po
+++ b/InvenTree/locale/de/LC_MESSAGES/django.po
@@ -6,7 +6,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-03-28 15:13+0000\n"
+"POT-Creation-Date: 2021-04-03 02:10+0000\n"
 "PO-Revision-Date: 2021-03-28 17:47+0200\n"
 "Last-Translator: Andreas Kaiser <kaiser.vocote@gmail.com>, Matthias MAIR<matmair@live.de>\n"
 "Language-Team: C <kde-i18n-doc@kde.org>\n"
@@ -33,7 +33,7 @@ msgstr "Keine passende Aktion gefunden"
 msgid "Enter date"
 msgstr "Datum eingeben"
 
-#: InvenTree/forms.py:110 build/forms.py:97 build/forms.py:185
+#: InvenTree/forms.py:110 build/forms.py:99 build/forms.py:187
 msgid "Confirm"
 msgstr "Bestätigen"
 
@@ -92,47 +92,86 @@ msgstr ""
 "Anzahl der eindeutigen Seriennummern ({s}) muss mit der Anzahl ({q}) "
 "übereinstimmen"
 
+#: InvenTree/models.py:59 stock/models.py:1657
+msgid "Attachment"
+msgstr "Anhang"
+
 #: InvenTree/models.py:60
 msgid "Select file to attach"
 msgstr "Datei zum Anhängen auswählen"
 
+#: InvenTree/models.py:62 templates/attachment_table.html:16
+msgid "Comment"
+msgstr "Kommentar"
+
 #: InvenTree/models.py:62
 msgid "File comment"
 msgstr "Datei-Kommentar"
 
-#: InvenTree/models.py:68
+#: InvenTree/models.py:68 InvenTree/models.py:69
 #: report/templates/report/inventree_test_report_base.html:91
 #: templates/js/stock.js:960
 msgid "User"
 msgstr "Benutzer"
 
-#: InvenTree/models.py:106 label/models.py:101 part/models.py:685
-#: part/templates/part/params.html:27 report/models.py:179
+#: InvenTree/models.py:72
+#, fuzzy
+#| msgid "Upload Part Image"
+msgid "upload date"
+msgstr "Teilbild hochladen"
+
+#: InvenTree/models.py:107 InvenTree/models.py:108 label/models.py:101
+#: part/models.py:686 part/templates/part/params.html:27 report/models.py:179
+#: templates/InvenTree/search.html:136 templates/InvenTree/search.html:273
 #: templates/js/part.js:109
 msgid "Name"
 msgstr "Name"
 
-#: InvenTree/models.py:112
+#: InvenTree/models.py:114 build/models.py:134
+#: build/templates/build/detail.html:21 company/models.py:359
+#: company/templates/company/detail.html:26
+#: company/templates/company/supplier_part_base.html:70
+#: company/templates/company/supplier_part_detail.html:31 label/models.py:108
+#: order/templates/order/purchase_order_detail.html:168 part/models.py:710
+#: part/templates/part/detail.html:54 part/templates/part/set_category.html:14
+#: report/models.py:192
+#: report/templates/report/inventree_build_order_base.html:118
+#: templates/InvenTree/search.html:143 templates/InvenTree/search.html:208
+#: templates/InvenTree/search.html:280
+#: templates/InvenTree/settings/header.html:9 templates/js/bom.js:190
+#: templates/js/build.js:677 templates/js/build.js:944
+#: templates/js/company.js:56 templates/js/order.js:183
+#: templates/js/order.js:280 templates/js/part.js:168 templates/js/part.js:251
+#: templates/js/part.js:370 templates/js/part.js:566 templates/js/stock.js:552
+#: templates/js/stock.js:934
+msgid "Description"
+msgstr "Beschreibung"
+
+#: InvenTree/models.py:115
 msgid "Description (optional)"
 msgstr "Beschreibung (optional)"
 
-#: InvenTree/settings.py:445
+#: InvenTree/models.py:123
+msgid "parent"
+msgstr ""
+
+#: InvenTree/settings.py:430
 msgid "English"
 msgstr "Englisch"
 
-#: InvenTree/settings.py:446
+#: InvenTree/settings.py:431
 msgid "French"
 msgstr "Französisch"
 
-#: InvenTree/settings.py:447
+#: InvenTree/settings.py:432
 msgid "German"
 msgstr "Deutsch"
 
-#: InvenTree/settings.py:448
+#: InvenTree/settings.py:433
 msgid "Polish"
 msgstr "Polnisch"
 
-#: InvenTree/settings.py:449
+#: InvenTree/settings.py:434
 msgid "Turkish"
 msgstr "Türkisch"
 
@@ -307,25 +346,34 @@ msgstr "Bauauftrags-Referenz"
 msgid "Order target date"
 msgstr "geplantes Bestelldatum"
 
-#: build/forms.py:39 build/models.py:224
+#: build/forms.py:39 build/templates/build/build_base.html:104
+#: build/templates/build/detail.html:121
+#: order/templates/order/order_base.html:124
+#: order/templates/order/sales_order_base.html:117
+#: report/templates/report/inventree_build_order_base.html:126
+#: templates/js/build.js:723 templates/js/order.js:200
+#: templates/js/order.js:298
+msgid "Target Date"
+msgstr "Zieldatum"
+
+#: build/forms.py:40 build/models.py:224
 msgid ""
 "Target date for build completion. Build will be overdue after this date."
 msgstr "Zieldatum für Bauauftrag-Fertigstellung."
 
-#: build/forms.py:44
-msgid "Number of items to build"
-msgstr "Anzahl der zu bauenden Teile"
-
-#: build/forms.py:85 build/templates/build/auto_allocate.html:17
+#: build/forms.py:45 build/forms.py:87
+#: build/templates/build/auto_allocate.html:17
 #: build/templates/build/build_base.html:91
 #: build/templates/build/detail.html:31 common/models.py:696
-#: company/forms.py:130 company/templates/company/supplier_part_pricing.html:77
-#: order/templates/order/order_wizard/select_parts.html:32
+#: company/forms.py:131 company/templates/company/supplier_part_pricing.html:77
+#: order/forms.py:237 order/templates/order/order_wizard/select_parts.html:32
 #: order/templates/order/purchase_order_detail.html:193
 #: order/templates/order/sales_order_detail.html:77
 #: order/templates/order/sales_order_detail.html:159
 #: part/templates/part/allocation.html:19
 #: part/templates/part/allocation.html:53
+#: part/templates/part/part_pricing.html:12
+#: part/templates/part/part_pricing.html:19
 #: part/templates/part/sale_prices.html:85
 #: report/templates/report/inventree_build_order_base.html:114
 #: report/templates/report/inventree_po_report.html:91
@@ -333,62 +381,68 @@ msgstr "Anzahl der zu bauenden Teile"
 #: report/templates/report/inventree_test_report_base.html:77
 #: stock/forms.py:307 stock/templates/stock/item_base.html:51
 #: stock/templates/stock/item_base.html:57
-#: stock/templates/stock/item_base.html:234
+#: stock/templates/stock/item_base.html:240
 #: stock/templates/stock/stock_adjust.html:18 templates/js/barcode.js:364
 #: templates/js/bom.js:205 templates/js/build.js:420 templates/js/build.js:954
 #: templates/js/stock.js:952 templates/js/stock.js:1190
 msgid "Quantity"
 msgstr "Anzahl"
 
-#: build/forms.py:86
+#: build/forms.py:46
+msgid "Number of items to build"
+msgstr "Anzahl der zu bauenden Teile"
+
+#: build/forms.py:88
 msgid "Enter quantity for build output"
 msgstr "Menge für den Bau-Ausgabe angeben"
 
-#: build/forms.py:90 stock/forms.py:117
-msgid "Serial numbers"
-msgstr "Seriennummern"
+#: build/forms.py:92 order/forms.py:231 stock/forms.py:117
+#, fuzzy
+#| msgid "Serial Number"
+msgid "Serial Numbers"
+msgstr "Seriennummer"
 
-#: build/forms.py:92
+#: build/forms.py:94
 msgid "Enter serial numbers for build outputs"
 msgstr "Seriennummer für dieses hergestelltes Teil eingeben"
 
-#: build/forms.py:98
+#: build/forms.py:100
 msgid "Confirm creation of build output"
 msgstr "Anlage Baufertigstellung bestätigen"
 
-#: build/forms.py:118
+#: build/forms.py:120
 msgid "Confirm deletion of build output"
 msgstr "Löschen des Endprodukt bestätigen"
 
-#: build/forms.py:139
+#: build/forms.py:141
 msgid "Confirm unallocation of stock"
 msgstr "Aufhebung der BestandsZuordnung bestätigen"
 
-#: build/forms.py:163
+#: build/forms.py:165
 msgid "Confirm stock allocation"
 msgstr "Bestandszuordnung bestätigen"
 
-#: build/forms.py:186
+#: build/forms.py:188
 msgid "Mark build as complete"
 msgstr "Bau als vollständig markieren"
 
-#: build/forms.py:210
+#: build/forms.py:212
 msgid "Location of completed parts"
 msgstr "Lagerort der fertigen Teile"
 
-#: build/forms.py:215
+#: build/forms.py:217
 msgid "Confirm completion with incomplete stock allocation"
 msgstr "Fertigstellung mit nicht kompletter Bestandszuordnung bestätigen"
 
-#: build/forms.py:218
+#: build/forms.py:220
 msgid "Confirm build completion"
 msgstr "Bau-Fertigstellung bestätigen"
 
-#: build/forms.py:238 build/views.py:66
+#: build/forms.py:240 build/views.py:66
 msgid "Confirm build cancellation"
 msgstr "Bauabbruch bestätigen"
 
-#: build/forms.py:252
+#: build/forms.py:254
 msgid "Select quantity of stock to allocate"
 msgstr "Menge der BestandsObjekt für Zuordnung auswählen"
 
@@ -405,7 +459,7 @@ msgstr "Bauauftrag"
 #: order/templates/order/so_navbar.html:22 part/templates/part/navbar.html:55
 #: part/templates/part/navbar.html:58 templates/InvenTree/index.html:181
 #: templates/InvenTree/search.html:169
-#: templates/InvenTree/settings/tabs.html:31 users/models.py:36
+#: templates/InvenTree/settings/tabs.html:31 users/models.py:41
 msgid "Build Orders"
 msgstr "Bauaufträge"
 
@@ -420,24 +474,6 @@ msgstr "Bauauftragsreferenz"
 msgid "Reference"
 msgstr "Referenz"
 
-#: build/models.py:134 build/templates/build/detail.html:21
-#: company/models.py:359 company/templates/company/detail.html:26
-#: company/templates/company/supplier_part_base.html:70
-#: company/templates/company/supplier_part_detail.html:31 label/models.py:108
-#: order/templates/order/purchase_order_detail.html:168 part/models.py:709
-#: part/templates/part/detail.html:54 part/templates/part/set_category.html:14
-#: report/models.py:192
-#: report/templates/report/inventree_build_order_base.html:118
-#: templates/InvenTree/search.html:208
-#: templates/InvenTree/settings/header.html:9 templates/js/bom.js:190
-#: templates/js/build.js:677 templates/js/build.js:944
-#: templates/js/company.js:56 templates/js/order.js:183
-#: templates/js/order.js:280 templates/js/part.js:168 templates/js/part.js:251
-#: templates/js/part.js:370 templates/js/part.js:566 templates/js/stock.js:552
-#: templates/js/stock.js:934
-msgid "Description"
-msgstr "Beschreibung"
-
 #: build/models.py:137
 msgid "Brief description of the build"
 msgstr "Kurze Beschreibung des Baus"
@@ -456,8 +492,9 @@ msgstr "Bauauftrag, zu dem dieser Bau zugwiesen ist"
 #: build/templates/build/detail.html:26 order/models.py:662
 #: order/templates/order/order_wizard/select_parts.html:30
 #: order/templates/order/purchase_order_detail.html:156
-#: order/templates/order/receive_parts.html:19 part/models.py:320
-#: part/templates/part/part_app_base.html:7 part/templates/part/related.html:29
+#: order/templates/order/receive_parts.html:19 part/models.py:321
+#: part/models.py:2054 part/templates/part/part_app_base.html:7
+#: part/templates/part/part_pricing.html:15 part/templates/part/related.html:29
 #: part/templates/part/set_category.html:13
 #: part/templates/part/subcategories.html:17
 #: report/templates/report/inventree_build_order_base.html:110
@@ -540,110 +577,134 @@ msgstr "Losnummer für dieses Endprodukt"
 msgid "Target completion date"
 msgstr "geplantes Fertigstellungsdatum"
 
-#: build/models.py:240
+#: build/models.py:227 order/models.py:215
+msgid "Completion Date"
+msgstr "Fertigstellungsdatum"
+
+#: build/models.py:233
+#, fuzzy
+#| msgid "Completed"
+msgid "completed by"
+msgstr "Fertig"
+
+#: build/models.py:241
+#, fuzzy
+#| msgid "Issued By"
+msgid "Issued by"
+msgstr "Aufgegeben von"
+
+#: build/models.py:242
 msgid "User who issued this build order"
 msgstr "Nutzer der diesen Bauauftrag erstellt hat"
 
-#: build/models.py:248
+#: build/models.py:250 build/templates/build/build_base.html:142
+#: build/templates/build/detail.html:105 order/models.py:118
+#: order/templates/order/order_base.html:138
+#: order/templates/order/sales_order_base.html:138 part/models.py:885
+#: report/templates/report/inventree_build_order_base.html:159
+msgid "Responsible"
+msgstr "Verantwortlicher Benutzer"
+
+#: build/models.py:251
 msgid "User responsible for this build order"
 msgstr "Nutzer der für diesen Bauauftrag zuständig ist"
 
-#: build/models.py:253 build/templates/build/detail.html:91
+#: build/models.py:256 build/templates/build/detail.html:91
 #: company/templates/company/supplier_part_base.html:77
 #: company/templates/company/supplier_part_detail.html:28
 #: part/templates/part/detail.html:83 part/templates/part/part_base.html:100
-#: stock/models.py:423 stock/templates/stock/item_base.html:324
+#: stock/models.py:423 stock/templates/stock/item_base.html:330
 msgid "External Link"
 msgstr "Externer Link"
 
-#: build/models.py:254 part/models.py:743 stock/models.py:425
+#: build/models.py:257 part/models.py:744 stock/models.py:425
 msgid "Link to external URL"
 msgstr "Link zu einer externen URL"
 
-#: build/models.py:258 build/templates/build/navbar.html:59
+#: build/models.py:261 build/templates/build/navbar.html:59
 #: company/models.py:366 company/templates/company/navbar.html:59
 #: company/templates/company/navbar.html:62
 #: order/templates/order/po_navbar.html:29
 #: order/templates/order/po_navbar.html:32
 #: order/templates/order/purchase_order_detail.html:227
 #: order/templates/order/so_navbar.html:33
-#: order/templates/order/so_navbar.html:36 part/models.py:869
+#: order/templates/order/so_navbar.html:36 part/models.py:870
 #: part/templates/part/navbar.html:122
 #: report/templates/report/inventree_build_order_base.html:173
 #: stock/forms.py:316 stock/forms.py:348 stock/forms.py:376 stock/models.py:495
-#: stock/models.py:1663 stock/templates/stock/navbar.html:57
-#: templates/js/barcode.js:37 templates/js/bom.js:329 templates/js/stock.js:128
-#: templates/js/stock.js:667
+#: stock/models.py:1553 stock/models.py:1663
+#: stock/templates/stock/navbar.html:57 templates/js/barcode.js:37
+#: templates/js/bom.js:329 templates/js/stock.js:128 templates/js/stock.js:667
 msgid "Notes"
 msgstr "Notizen"
 
-#: build/models.py:259
+#: build/models.py:262
 msgid "Extra build notes"
 msgstr "Extranotizen für den Bau"
 
-#: build/models.py:670
+#: build/models.py:673
 msgid "No build output specified"
 msgstr "kein Endprodukt angegeben"
 
-#: build/models.py:673
+#: build/models.py:676
 msgid "Build output is already completed"
 msgstr "Endprodukt bereits hergstellt"
 
-#: build/models.py:676
+#: build/models.py:679
 msgid "Build output does not match Build Order"
 msgstr "Endprodukt stimmt nicht mit dem Bauauftrag überein"
 
-#: build/models.py:751
+#: build/models.py:754
 msgid "Completed build output"
 msgstr "Endprodukt fertigstellen"
 
-#: build/models.py:993
+#: build/models.py:996
 msgid "BuildItem must be unique for build, stock_item and install_into"
 msgstr ""
 "Bauauftrags-Objekt muss für Bauauftrag, Lager-Objekt und installiert_in "
 "eindeutig sein"
 
-#: build/models.py:1015
+#: build/models.py:1018
 msgid "Build item must specify a build output"
 msgstr "Bauauftrags-Objekt muss einem Endprodukt zugewiesen sein"
 
-#: build/models.py:1020
+#: build/models.py:1023
 #, python-brace-format
 msgid "Selected stock item not found in BOM for part '{p}'"
 msgstr "Ausgewähltes BestandsObjekt nicht Stückliste für Teil '{p}' gefunden"
 
-#: build/models.py:1024
+#: build/models.py:1027
 #, python-brace-format
 msgid "Allocated quantity ({n}) must not exceed available quantity ({q})"
 msgstr ""
 "Reserviermenge ({n}) muss kleiner Bestandsmenge ({q}) sein. Zugewiesene "
 "Anzahl ({n}) darf nicht die verfügbare ({q}) Anzahl überschreiten"
 
-#: build/models.py:1031 order/models.py:746
+#: build/models.py:1034 order/models.py:751
 msgid "StockItem is over-allocated"
 msgstr "Zu viele BestandsObjekt zugewiesen"
 
-#: build/models.py:1035 order/models.py:749
+#: build/models.py:1038 order/models.py:754
 msgid "Allocation quantity must be greater than zero"
 msgstr "Reserviermenge muss größer null sein"
 
-#: build/models.py:1039
+#: build/models.py:1042
 msgid "Quantity must be 1 for serialized stock"
 msgstr "Anzahl muss 1 für Objekte mit Seriennummer sein"
 
-#: build/models.py:1079
+#: build/models.py:1082
 msgid "Build to allocate parts"
 msgstr "Bau starten um Teile zuzuweisen"
 
-#: build/models.py:1086
+#: build/models.py:1089
 msgid "Source stock item"
 msgstr "Quell-BestandsObjekt"
 
-#: build/models.py:1098
+#: build/models.py:1101
 msgid "Stock quantity to allocate to build"
 msgstr "BestandsObjekt-Anzahl dem Bau zuweisen"
 
-#: build/models.py:1106
+#: build/models.py:1109
 msgid "Destination stock item"
 msgstr "Ziel-BestandsObjekt"
 
@@ -668,7 +729,7 @@ msgid "Order required parts"
 msgstr "benötigte Teile bestellen"
 
 #: build/templates/build/allocate.html:31
-#: company/templates/company/detail_part.html:31 order/views.py:791
+#: company/templates/company/detail_part.html:31 order/views.py:794
 #: part/templates/part/category.html:127
 msgid "Order Parts"
 msgstr "Teile bestellen"
@@ -713,7 +774,7 @@ msgstr ""
 "Die folgenden BestandsObjekte werden den ausgewählten Endprodukten zugeordnet"
 
 #: build/templates/build/auto_allocate.html:18 stock/forms.py:346
-#: stock/templates/stock/item_base.html:264
+#: stock/templates/stock/item_base.html:270
 #: stock/templates/stock/stock_adjust.html:17
 #: templates/InvenTree/search.html:244 templates/js/barcode.js:363
 #: templates/js/barcode.js:531 templates/js/build.js:434
@@ -778,10 +839,12 @@ msgid "Edit Build"
 msgstr "Bau bearbeiten"
 
 #: build/templates/build/build_base.html:68
+#: build/templates/build/build_base.html:176
 msgid "Complete Build"
 msgstr "Bau fertigstellen"
 
-#: build/templates/build/build_base.html:69 build/views.py:57
+#: build/templates/build/build_base.html:69
+#: build/templates/build/build_base.html:167 build/views.py:57
 msgid "Cancel Build"
 msgstr "Bau abbrechen"
 
@@ -793,23 +856,13 @@ msgstr "Bau-Status"
 #: build/templates/build/build_base.html:96
 #: build/templates/build/detail.html:59
 #: order/templates/order/receive_parts.html:24
-#: stock/templates/stock/item_base.html:370 templates/InvenTree/search.html:236
+#: stock/templates/stock/item_base.html:376 templates/InvenTree/search.html:236
 #: templates/js/barcode.js:119 templates/js/build.js:710
 #: templates/js/order.js:187 templates/js/order.js:285
 #: templates/js/stock.js:624 templates/js/stock.js:1198
 msgid "Status"
 msgstr "Status"
 
-#: build/templates/build/build_base.html:104
-#: build/templates/build/detail.html:121
-#: order/templates/order/order_base.html:124
-#: order/templates/order/sales_order_base.html:117
-#: report/templates/report/inventree_build_order_base.html:126
-#: templates/js/build.js:723 templates/js/order.js:200
-#: templates/js/order.js:298
-msgid "Target Date"
-msgstr "Zieldatum"
-
 #: build/templates/build/build_base.html:108
 msgid "This build was due on"
 msgstr "Fertigung überfällig seit"
@@ -827,7 +880,7 @@ msgstr "Fortschritt"
 #: part/templates/part/allocation.html:30
 #: report/templates/report/inventree_build_order_base.html:136
 #: report/templates/report/inventree_so_report.html:77
-#: stock/templates/stock/item_base.html:258 templates/js/order.js:245
+#: stock/templates/stock/item_base.html:264 templates/js/order.js:245
 msgid "Sales Order"
 msgstr "Auftrag"
 
@@ -837,14 +890,6 @@ msgstr "Auftrag"
 msgid "Issued By"
 msgstr "Aufgegeben von"
 
-#: build/templates/build/build_base.html:142
-#: build/templates/build/detail.html:105 order/models.py:118
-#: order/templates/order/order_base.html:138
-#: order/templates/order/sales_order_base.html:138
-#: report/templates/report/inventree_build_order_base.html:159
-msgid "Responsible"
-msgstr "Verantwortlicher Benutzer"
-
 #: build/templates/build/build_children.html:10
 #: build/templates/build/navbar.html:42
 msgid "Child Build Orders"
@@ -951,7 +996,7 @@ msgid "Destination location not specified"
 msgstr "Ziel-Lagerort nicht angegeben"
 
 #: build/templates/build/detail.html:70
-#: stock/templates/stock/item_base.html:282 templates/js/stock.js:632
+#: stock/templates/stock/item_base.html:288 templates/js/stock.js:632
 #: templates/js/stock.js:1205 templates/js/table_filters.js:85
 #: templates/js/table_filters.js:179
 msgid "Batch"
@@ -1032,20 +1077,21 @@ msgstr "Bauauftrag-Notizen"
 msgid "Build Notes"
 msgstr "Bau-Bemerkungen"
 
-#: build/templates/build/notes.html:23 company/templates/company/notes.html:21
-#: order/templates/order/order_notes.html:24
-#: order/templates/order/sales_order_notes.html:26
-#: part/templates/part/notes.html:25 stock/templates/stock/item_notes.html:23
-msgid "Save"
-msgstr "Speichern"
-
-#: build/templates/build/notes.html:30 company/templates/company/notes.html:29
-#: order/templates/order/order_notes.html:31
-#: order/templates/order/sales_order_notes.html:32
-#: part/templates/part/notes.html:33 stock/templates/stock/item_notes.html:29
+#: build/templates/build/notes.html:14 company/templates/company/notes.html:13
+#: order/templates/order/order_notes.html:15
+#: order/templates/order/sales_order_notes.html:16
+#: part/templates/part/notes.html:14 stock/templates/stock/item_notes.html:15
 msgid "Edit notes"
 msgstr "Bermerkungen bearbeiten"
 
+#: build/templates/build/notes.html:26 company/templates/company/notes.html:24
+#: order/templates/order/order_notes.html:27
+#: order/templates/order/sales_order_notes.html:29
+#: part/templates/part/notes.html:27 stock/templates/stock/item_base.html:454
+#: stock/templates/stock/item_notes.html:26
+msgid "Save"
+msgstr "Speichern"
+
 #: build/templates/build/unallocate.html:10
 msgid "Are you sure you wish to unallocate all stock for this build?"
 msgstr ""
@@ -1188,24 +1234,24 @@ msgstr "Bauobjekt aktualisiert"
 msgid "Add Build Order Attachment"
 msgstr "Bauauftrags-Anhang hinzufügen"
 
-#: build/views.py:1062 order/views.py:107 order/views.py:159 part/views.py:172
+#: build/views.py:1062 order/views.py:110 order/views.py:162 part/views.py:172
 #: stock/views.py:277
 msgid "Added attachment"
 msgstr "Anhang hinzugefügt"
 
-#: build/views.py:1098 order/views.py:186 order/views.py:207
+#: build/views.py:1098 order/views.py:189 order/views.py:210
 msgid "Edit Attachment"
 msgstr "Anhang bearbeiten"
 
-#: build/views.py:1108 order/views.py:190 order/views.py:211
+#: build/views.py:1108 order/views.py:193 order/views.py:214
 msgid "Attachment updated"
 msgstr "Anhang aktualisiert"
 
-#: build/views.py:1118 order/views.py:226 order/views.py:240
+#: build/views.py:1118 order/views.py:229 order/views.py:243
 msgid "Delete Attachment"
 msgstr "Anhang löschen"
 
-#: build/views.py:1123 order/views.py:232 order/views.py:246 stock/views.py:333
+#: build/views.py:1123 order/views.py:235 order/views.py:249 stock/views.py:333
 msgid "Deleted attachment"
 msgstr "Anhang gelöscht"
 
@@ -1321,7 +1367,7 @@ msgstr "Aktuelle Teile-Stände"
 msgid "Number of recent parts to display on index page"
 msgstr "Anzahl der neusten Teile auf der Startseite"
 
-#: common/models.py:150 part/templates/part/detail.html:160
+#: common/models.py:150 part/models.py:2056 part/templates/part/detail.html:160
 #: report/models.py:185 stock/forms.py:258 templates/js/table_filters.js:24
 #: templates/js/table_filters.js:288
 msgid "Template"
@@ -1331,7 +1377,7 @@ msgstr "Vorlage"
 msgid "Parts are templates by default"
 msgstr "Teile sind standardmäßig Vorlagen"
 
-#: common/models.py:157 part/models.py:832 part/templates/part/detail.html:170
+#: common/models.py:157 part/models.py:833 part/templates/part/detail.html:170
 #: templates/js/table_filters.js:101 templates/js/table_filters.js:300
 msgid "Assembly"
 msgstr "Baugruppe"
@@ -1340,7 +1386,7 @@ msgstr "Baugruppe"
 msgid "Parts can be assembled from other components by default"
 msgstr "Teile können standardmäßig aus anderen Teilen angefertigt werden"
 
-#: common/models.py:164 part/models.py:838 part/templates/part/detail.html:180
+#: common/models.py:164 part/models.py:839 part/templates/part/detail.html:180
 #: templates/js/table_filters.js:304
 msgid "Component"
 msgstr "Komponente"
@@ -1349,7 +1395,7 @@ msgstr "Komponente"
 msgid "Parts can be used as sub-components by default"
 msgstr "Teile können standardmäßig in Baugruppen benutzt werden"
 
-#: common/models.py:171 part/models.py:849 part/templates/part/detail.html:200
+#: common/models.py:171 part/models.py:850 part/templates/part/detail.html:200
 msgid "Purchaseable"
 msgstr "Kaufbar"
 
@@ -1357,7 +1403,7 @@ msgstr "Kaufbar"
 msgid "Parts are purchaseable by default"
 msgstr "Artikel kaufbar als Standard"
 
-#: common/models.py:178 part/models.py:854 part/templates/part/detail.html:210
+#: common/models.py:178 part/models.py:855 part/templates/part/detail.html:210
 #: templates/js/table_filters.js:312
 msgid "Salable"
 msgstr "Verkäuflich"
@@ -1366,7 +1412,7 @@ msgstr "Verkäuflich"
 msgid "Parts are salable by default"
 msgstr "Artikel verkaufbar als Standard"
 
-#: common/models.py:185 part/models.py:844 part/templates/part/detail.html:190
+#: common/models.py:185 part/models.py:845 part/templates/part/detail.html:190
 #: templates/js/table_filters.js:32 templates/js/table_filters.js:316
 msgid "Trackable"
 msgstr "nachverfolgbar"
@@ -1375,7 +1421,7 @@ msgstr "nachverfolgbar"
 msgid "Parts are trackable by default"
 msgstr "Artikel verfolgbar als Standard"
 
-#: common/models.py:192 part/models.py:864 part/templates/part/detail.html:150
+#: common/models.py:192 part/models.py:865 part/templates/part/detail.html:150
 #: templates/js/table_filters.js:28
 msgid "Virtual"
 msgstr "Virtuell"
@@ -1536,7 +1582,7 @@ msgstr "Nur Ganzzahl eingeben"
 msgid "Key string must be unique"
 msgstr "Schlüsseltext muss eindeutig sein"
 
-#: common/models.py:697 company/forms.py:131
+#: common/models.py:697 company/forms.py:132
 msgid "Price break quantity"
 msgstr "Preisstaffelungs Anzahl"
 
@@ -1569,23 +1615,28 @@ msgstr "Angegebener Wert nicht erlaubt"
 msgid "Supplied value must be a boolean"
 msgstr "Angegebener Wert muss ein Wahrheitswert sein"
 
-#: company/forms.py:37 company/models.py:139
+#: company/forms.py:37 company/models.py:137
+#: company/templates/company/detail.html:40
+msgid "Currency"
+msgstr "Währung"
+
+#: company/forms.py:38 company/models.py:139
 msgid "Default currency used for this company"
 msgstr "Standard-Währung für diese Firma"
 
-#: company/forms.py:75 part/forms.py:46
+#: company/forms.py:76 part/forms.py:46
 msgid "URL"
 msgstr "URL"
 
-#: company/forms.py:76 part/forms.py:47
+#: company/forms.py:77 part/forms.py:47
 msgid "Image URL"
 msgstr "Bild-URL"
 
-#: company/forms.py:98
+#: company/forms.py:99
 msgid "Single Price"
 msgstr "Einzelpreis"
 
-#: company/forms.py:100
+#: company/forms.py:101
 msgid "Single quantity price"
 msgstr "Einzelpreis"
 
@@ -1642,28 +1693,42 @@ msgstr "Anlaufstelle"
 msgid "Link to external company information"
 msgstr "Link auf externe Firmeninformation"
 
+#: company/models.py:129
+#, fuzzy
+#| msgid "Customer"
+msgid "is customer"
+msgstr "Kunde"
+
 #: company/models.py:129
 msgid "Do you sell items to this company?"
 msgstr "Verkaufen Sie Teile an diese Firma?"
 
+#: company/models.py:131
+#, fuzzy
+#| msgid "Supplier"
+msgid "is supplier"
+msgstr "Zulieferer"
+
 #: company/models.py:131
 msgid "Do you purchase items from this company?"
 msgstr "Kaufen Sie Teile von dieser Firma?"
 
+#: company/models.py:133
+#, fuzzy
+#| msgid "Manufacturer"
+msgid "is manufacturer"
+msgstr "Hersteller"
+
 #: company/models.py:133
 msgid "Does this company manufacture parts?"
 msgstr "Produziert diese Firma Teile?"
 
-#: company/models.py:137 company/templates/company/detail.html:40
-msgid "Currency"
-msgstr "Währung"
-
 #: company/models.py:313 stock/models.py:370
-#: stock/templates/stock/item_base.html:214
+#: stock/templates/stock/item_base.html:220
 msgid "Base Part"
 msgstr "Basisteil"
 
-#: company/models.py:317
+#: company/models.py:317 order/views.py:1372
 msgid "Select part"
 msgstr "Teil auswählen"
 
@@ -1672,7 +1737,7 @@ msgstr "Teil auswählen"
 #: company/templates/company/supplier_part_detail.html:25
 #: order/templates/order/order_base.html:92
 #: order/templates/order/order_wizard/select_pos.html:30 part/bom.py:170
-#: stock/templates/stock/item_base.html:331 templates/js/company.js:48
+#: stock/templates/stock/item_base.html:337 templates/js/company.js:48
 #: templates/js/company.js:164 templates/js/order.js:170
 msgid "Supplier"
 msgstr "Zulieferer"
@@ -1713,9 +1778,9 @@ msgstr "MPN"
 msgid "Manufacturer part number"
 msgstr "Hersteller-Teilenummer"
 
-#: company/models.py:353 part/models.py:742
+#: company/models.py:353 part/models.py:743
 #: report/templates/report/inventree_build_order_base.html:165
-#: templates/js/company.js:208 templates/js/part.js:430
+#: stock/models.py:1555 templates/js/company.js:208 templates/js/part.js:430
 msgid "Link"
 msgstr "Link"
 
@@ -1738,10 +1803,22 @@ msgstr "Notiz"
 msgid "Minimum charge (e.g. stocking fee)"
 msgstr "Mindestpreis"
 
+#: company/models.py:371 company/templates/company/supplier_part_base.html:106
+#: stock/models.py:394 stock/templates/stock/item_base.html:295
+#: templates/js/stock.js:663
+msgid "Packaging"
+msgstr "Verpackungen"
+
 #: company/models.py:371
 msgid "Part packaging"
 msgstr "Teile-Packaging"
 
+#: company/models.py:373
+#, fuzzy
+#| msgid "Order Multiple"
+msgid "multiple"
+msgstr "Bestellvielfaches"
+
 #: company/templates/company/assigned_stock.html:10
 #: company/templates/company/navbar.html:51
 #: company/templates/company/navbar.html:54 templates/js/build.js:411
@@ -1764,6 +1841,20 @@ msgstr "Neues Bild hochladen"
 msgid "Download image from URL"
 msgstr "Bild von URL herunterladen"
 
+#: company/templates/company/company_base.html:46 order/views.py:306
+msgid "Create Purchase Order"
+msgstr "Bestellung anlegen"
+
+#: company/templates/company/company_base.html:51
+#, fuzzy
+#| msgid "Edited company information"
+msgid "Edit company information"
+msgstr "Firmeninformation bearbeitet"
+
+#: company/templates/company/company_base.html:56 company/views.py:324
+msgid "Delete Company"
+msgstr "Firma löschen"
+
 #: company/templates/company/company_base.html:64
 #: company/templates/company/detail.html:10
 #: company/templates/company/navbar.html:12
@@ -1788,7 +1879,7 @@ msgstr "verwendet Standard-Währung"
 
 #: company/templates/company/detail.html:65
 #: order/templates/order/sales_order_base.html:92 stock/models.py:412
-#: stock/models.py:413 stock/templates/stock/item_base.html:241
+#: stock/models.py:413 stock/templates/stock/item_base.html:247
 #: templates/js/company.js:40 templates/js/order.js:267
 msgid "Customer"
 msgstr "Kunde"
@@ -1864,7 +1955,7 @@ msgstr "Zulieferer-Bestand"
 #: company/templates/company/detail_stock.html:37
 #: company/templates/company/supplier_part_stock.html:34
 #: part/templates/part/category.html:114 part/templates/part/category.html:128
-#: part/templates/part/stock.html:54
+#: part/templates/part/stock.html:54 stock/templates/stock/location.html:163
 msgid "Export"
 msgstr "Exportieren"
 
@@ -1877,21 +1968,21 @@ msgid "Supplied Parts"
 msgstr "Zulieferer-Teile"
 
 #: company/templates/company/navbar.html:23
-#: order/templates/order/receive_parts.html:14 part/models.py:321
+#: order/templates/order/receive_parts.html:14 part/models.py:322
 #: part/templates/part/cat_link.html:7 part/templates/part/category.html:95
 #: part/templates/part/category_navbar.html:11
 #: part/templates/part/category_navbar.html:14
 #: part/templates/part/category_partlist.html:10
 #: templates/InvenTree/index.html:96 templates/InvenTree/search.html:113
 #: templates/InvenTree/settings/tabs.html:25 templates/navbar.html:23
-#: templates/stats.html:35 templates/stats.html:44 users/models.py:33
+#: templates/stats.html:35 templates/stats.html:44 users/models.py:38
 msgid "Parts"
 msgstr "Teile"
 
 #: company/templates/company/navbar.html:27 part/templates/part/navbar.html:33
 #: stock/templates/stock/location.html:100
 #: stock/templates/stock/location.html:115 templates/InvenTree/search.html:182
-#: templates/stats.html:48 templates/stats.html:57 users/models.py:35
+#: templates/stats.html:48 templates/stats.html:57 users/models.py:40
 msgid "Stock Items"
 msgstr "BestandsObjekte"
 
@@ -1917,7 +2008,7 @@ msgstr "Lagerbestand"
 #: part/templates/part/sales_orders.html:10 templates/InvenTree/index.html:226
 #: templates/InvenTree/search.html:330
 #: templates/InvenTree/settings/tabs.html:37 templates/navbar.html:46
-#: users/models.py:38
+#: users/models.py:43
 msgid "Sales Orders"
 msgstr "Aufträge"
 
@@ -1929,7 +2020,7 @@ msgstr "Aufträge"
 #: part/templates/part/orders.html:10 templates/InvenTree/index.html:203
 #: templates/InvenTree/search.html:300
 #: templates/InvenTree/settings/tabs.html:34 templates/navbar.html:37
-#: users/models.py:37
+#: users/models.py:42
 msgid "Purchase Orders"
 msgstr "Bestellungen"
 
@@ -1986,11 +2077,12 @@ msgstr "Neuer Auftrag"
 
 #: company/templates/company/supplier_part_base.html:6
 #: company/templates/company/supplier_part_base.html:19 stock/models.py:379
-#: stock/templates/stock/item_base.html:336 templates/js/company.js:180
+#: stock/templates/stock/item_base.html:342 templates/js/company.js:180
 msgid "Supplier Part"
 msgstr "Zulieferer-Teil"
 
 #: company/templates/company/supplier_part_base.html:35
+#: company/templates/company/supplier_part_orders.html:17
 #: part/templates/part/orders.html:17 part/templates/part/part_base.html:64
 msgid "Order part"
 msgstr "Teil bestellen"
@@ -2013,11 +2105,6 @@ msgstr "Zulieferer-Teildetails"
 msgid "Internal Part"
 msgstr "Internes Teil"
 
-#: company/templates/company/supplier_part_base.html:106 stock/models.py:394
-#: stock/templates/stock/item_base.html:289 templates/js/stock.js:663
-msgid "Packaging"
-msgstr "Verpackungen"
-
 #: company/templates/company/supplier_part_orders.html:18
 #: part/templates/part/orders.html:18
 msgid "Order Part"
@@ -2115,10 +2202,6 @@ msgstr "Neue Firma anlegen"
 msgid "Created new company"
 msgstr "Neue Firma angelegt"
 
-#: company/views.py:324
-msgid "Delete Company"
-msgstr "Firma löschen"
-
 #: company/views.py:330
 msgid "Company was deleted"
 msgstr "Firma gelöscht"
@@ -2196,44 +2279,56 @@ msgstr "Abfragefilter (kommagetrennte Liste mit Schlüssel=Wert-Paaren)"
 msgid "Filters"
 msgstr "Filter"
 
-#: order/forms.py:25 order/templates/order/order_base.html:47
+#: order/forms.py:27 order/templates/order/order_base.html:47
 msgid "Place order"
 msgstr "Bestellung aufgeben"
 
-#: order/forms.py:36 order/templates/order/order_base.html:54
+#: order/forms.py:38 order/templates/order/order_base.html:54
 msgid "Mark order as complete"
 msgstr "Bestellung als vollständig markieren"
 
-#: order/forms.py:47 order/forms.py:58 order/templates/order/order_base.html:59
+#: order/forms.py:49 order/forms.py:60 order/templates/order/order_base.html:59
 #: order/templates/order/sales_order_base.html:59
 msgid "Cancel order"
 msgstr "Bestellung stornieren"
 
-#: order/forms.py:69 order/templates/order/sales_order_base.html:56
+#: order/forms.py:71 order/templates/order/sales_order_base.html:56
 msgid "Ship order"
 msgstr "Bestellung versenden"
 
-#: order/forms.py:80
+#: order/forms.py:82
 msgid "Receive parts to this location"
 msgstr "Teile in diesen Lagerort empfangen"
 
-#: order/forms.py:101
+#: order/forms.py:103
 msgid "Purchase Order reference"
 msgstr "Bestellungs-Referenz"
 
-#: order/forms.py:107
+#: order/forms.py:109
 msgid "Target date for order delivery. Order will be overdue after this date."
 msgstr "Zieldatum für Auftrags-Lieferung."
 
-#: order/forms.py:135
+#: order/forms.py:137
 msgid "Enter sales order number"
 msgstr "Auftrag-Nummer eingeben"
 
-#: order/forms.py:141 order/models.py:448
+#: order/forms.py:143 order/models.py:448
 msgid ""
 "Target date for order completion. Order will be overdue after this date."
 msgstr "Zieldatum für Auftrags-Fertigstellung."
 
+#: order/forms.py:233
+#, fuzzy
+#| msgid "Part stock is tracked by serial number"
+msgid "Enter stock item serial numbers"
+msgstr "Teilebestand wird per Seriennummer verfolgt"
+
+#: order/forms.py:239
+#, fuzzy
+#| msgid "Select quantity of stock to allocate"
+msgid "Enter quantity of stock items"
+msgstr "Menge der BestandsObjekt für Zuordnung auswählen"
+
 #: order/models.py:99
 msgid "Order reference"
 msgstr "Bestell-Referenz"
@@ -2283,10 +2378,6 @@ msgid ""
 "Expected date for order delivery. Order will be overdue after this date."
 msgstr "Geplantes Lieferdatum für Auftrag."
 
-#: order/models.py:215
-msgid "Completion Date"
-msgstr "Fertigstellungsdatum"
-
 #: order/models.py:216
 msgid "Date order was completed"
 msgstr "Datum an dem der Auftrag fertigstellt wurde"
@@ -2335,7 +2426,7 @@ msgstr "Position - Notizen"
 #: order/models.py:618 order/templates/order/order_base.html:9
 #: order/templates/order/order_base.html:24
 #: report/templates/report/inventree_po_report.html:77
-#: stock/templates/stock/item_base.html:303 templates/js/order.js:148
+#: stock/templates/stock/item_base.html:309 templates/js/order.js:148
 msgid "Purchase Order"
 msgstr "Bestellung"
 
@@ -2348,7 +2439,7 @@ msgid "Number of items received"
 msgstr "Empfangene Objekt-Anzahl"
 
 #: order/models.py:641 stock/models.py:505
-#: stock/templates/stock/item_base.html:310
+#: stock/templates/stock/item_base.html:316
 msgid "Purchase Price"
 msgstr "EK-Preis"
 
@@ -2356,27 +2447,33 @@ msgstr "EK-Preis"
 msgid "Unit purchase price"
 msgstr "EK-Preis pro Einheit"
 
-#: order/models.py:737
+#: order/models.py:736 order/models.py:738
+#, fuzzy
+#| msgid "Stock item has been allocated"
+msgid "Stock item has not been assigned"
+msgstr "BestandsObjekt zugewiesen"
+
+#: order/models.py:742
 msgid "Cannot allocate stock item to a line with a different part"
 msgstr "Kann BestandsObjekt keiner Zeile mit einem anderen Teil hinzufügen"
 
-#: order/models.py:739
+#: order/models.py:744
 msgid "Cannot allocate stock to a line without a part"
 msgstr "Kann BestandsObjekt keiner Zeile ohne Teil hinzufügen"
 
-#: order/models.py:742
+#: order/models.py:747
 msgid "Allocation quantity cannot exceed stock quantity"
 msgstr "Die zugeordnete Anzahl darf nicht die verfügbare Anzahl überschreiten"
 
-#: order/models.py:752
+#: order/models.py:757
 msgid "Quantity must be 1 for serialized stock item"
 msgstr "Anzahl für BestandsObjekt mit Seriennummer muss 1 sein"
 
-#: order/models.py:768
+#: order/models.py:773
 msgid "Select stock item to allocate"
 msgstr "BestandsObjekt für Zuordnung auswählen"
 
-#: order/models.py:771
+#: order/models.py:776
 msgid "Enter stock allocation quantity"
 msgstr "Anzahl für Bestandszuordnung eingeben"
 
@@ -2392,6 +2489,7 @@ msgid "Print"
 msgstr "Drucken"
 
 #: order/templates/order/order_base.html:43
+#: order/templates/order/sales_order_base.html:52
 msgid "Edit order information"
 msgstr "Bestellinfos bearbeiten"
 
@@ -2464,6 +2562,11 @@ msgstr "Zulieferer auswählen"
 msgid "Select a supplier for"
 msgstr "Zulieferer auswählen für"
 
+#: order/templates/order/order_wizard/select_parts.html:69
+#: part/templates/part/set_category.html:32
+msgid "Remove part"
+msgstr "Teil entfernen"
+
 #: order/templates/order/order_wizard/select_pos.html:8
 msgid "Step 2 of 2 - Select Purchase Orders"
 msgstr "Schritt 2 von 2 - Bestellung auswählen"
@@ -2481,6 +2584,12 @@ msgstr "Positionen"
 msgid "Select Purchase Order"
 msgstr "Bestellung auswählen"
 
+#: order/templates/order/order_wizard/select_pos.html:45
+#, fuzzy
+#| msgid "Create new purchase order"
+msgid "Create new purchase order for {{ supplier.name }}"
+msgstr "Neue Bestellung anlegen"
+
 #: order/templates/order/order_wizard/select_pos.html:68
 msgid "Select a purchase order for"
 msgstr "Bestellung auswählen für"
@@ -2504,15 +2613,16 @@ msgid "Purchase Order Items"
 msgstr "Bestellungs-Positionen"
 
 #: order/templates/order/purchase_order_detail.html:24
-#: order/templates/order/sales_order_detail.html:22 order/views.py:1105
-#: order/views.py:1188
+#: order/templates/order/sales_order_detail.html:22 order/views.py:1108
+#: order/views.py:1191
 msgid "Add Line Item"
 msgstr "Position hinzufügen"
 
 #: order/templates/order/purchase_order_detail.html:45
 #: order/templates/order/purchase_order_detail.html:125
 #: part/templates/part/category.html:197 part/templates/part/category.html:239
-#: templates/js/stock.js:704 templates/js/stock.js:1088
+#: stock/templates/stock/location.html:191 templates/js/stock.js:704
+#: templates/js/stock.js:1088
 msgid "New Location"
 msgstr "Neuer Lagerort"
 
@@ -2531,7 +2641,7 @@ msgid "Unit Price"
 msgstr "Stück-Preis"
 
 #: order/templates/order/purchase_order_detail.html:239
-#: order/templates/order/sales_order_detail.html:289
+#: order/templates/order/sales_order_detail.html:294
 msgid "Edit line item"
 msgstr "Position bearbeiten"
 
@@ -2573,6 +2683,12 @@ msgstr "Empfangen"
 msgid "Error: Referenced part has been removed"
 msgstr "Fehler: verknüpftes Teil wurde gelöscht"
 
+#: order/templates/order/receive_parts.html:57
+#, fuzzy
+#| msgid "Remove allocation"
+msgid "Remove line"
+msgstr "Zuordnung entfernen"
+
 #: order/templates/order/sales_order_base.html:15
 msgid "This SalesOrder has not been fully allocated"
 msgstr "Dieser Auftrag ist nicht vollständig zugeordnet"
@@ -2604,7 +2720,7 @@ msgstr "Auftrags-Positionen"
 #: order/templates/order/sales_order_detail.html:75
 #: order/templates/order/sales_order_detail.html:157
 #: report/templates/report/inventree_test_report_base.html:75
-#: stock/models.py:417 stock/templates/stock/item_base.html:228
+#: stock/models.py:417 stock/templates/stock/item_base.html:234
 #: templates/js/build.js:418
 msgid "Serial Number"
 msgstr "Seriennummer"
@@ -2619,8 +2735,8 @@ msgstr "Bestands-Zuordnung bearbeiten"
 msgid "Delete stock allocation"
 msgstr "Bestands-Zuordnung löschen"
 
-#: order/templates/order/sales_order_detail.html:229 templates/js/build.js:523
-#: templates/js/build.js:785
+#: order/templates/order/sales_order_detail.html:229 order/views.py:1351
+#: templates/js/build.js:523 templates/js/build.js:785
 msgid "Allocated"
 msgstr "Zugeordnet"
 
@@ -2629,18 +2745,27 @@ msgid "Fulfilled"
 msgstr "Erledigt"
 
 #: order/templates/order/sales_order_detail.html:279
-msgid "Buy parts"
-msgstr "Teile kaufen"
+#, fuzzy
+#| msgid "Add serial number"
+msgid "Allocate serial numbers"
+msgstr "Seriennummer hinzufügen"
 
-#: order/templates/order/sales_order_detail.html:283
-msgid "Build parts"
-msgstr "Bauteile"
+#: order/templates/order/sales_order_detail.html:282 templates/js/build.js:585
+msgid "Allocate stock"
+msgstr "Lagerbestand zuweisen"
 
-#: order/templates/order/sales_order_detail.html:286
-msgid "Allocate parts"
-msgstr "Teile zuordnen"
+#: order/templates/order/sales_order_detail.html:285
+#, fuzzy
+#| msgid "Purchase Price"
+msgid "Purchase stock"
+msgstr "EK-Preis"
 
-#: order/templates/order/sales_order_detail.html:290
+#: order/templates/order/sales_order_detail.html:289 templates/js/build.js:578
+#: templates/js/build.js:992
+msgid "Build stock"
+msgstr "Baue Bestand"
+
+#: order/templates/order/sales_order_detail.html:295
 msgid "Delete line item "
 msgstr "Position löschen "
 
@@ -2674,6 +2799,12 @@ msgstr ""
 "Versenden dieses Auftrags bedeutet, dass der Auftrag nicht mehr bearbeitbar "
 "ist."
 
+#: order/templates/order/so_allocate_by_serial.html:9
+#, fuzzy
+#| msgid "Part stock is tracked by serial number"
+msgid "Allocate stock items by serial number"
+msgstr "Teilebestand wird per Seriennummer verfolgt"
+
 #: order/templates/order/so_allocation_delete.html:7
 msgid "This action will unallocate the following stock from the Sales Order"
 msgstr "Diese Aktion wird die folgenden BestandsObjekt vom Auftrag entfernen"
@@ -2687,140 +2818,172 @@ msgstr "Auftrags-Anhänge"
 msgid "Are you sure you wish to delete this line item?"
 msgstr "Sind Sie sicher, dass Sie diese Position löschen möchten?"
 
-#: order/views.py:96
+#: order/views.py:99
 msgid "Add Purchase Order Attachment"
 msgstr "Bestellungs-Anhang hinzufügen"
 
-#: order/views.py:146
+#: order/views.py:149
 msgid "Add Sales Order Attachment"
 msgstr "Auftrags-Anhang hinzufügen"
 
-#: order/views.py:303
-msgid "Create Purchase Order"
-msgstr "Bestellung anlegen"
-
-#: order/views.py:338
+#: order/views.py:341
 msgid "Create Sales Order"
 msgstr "Auftrag anlegen"
 
-#: order/views.py:373
+#: order/views.py:376
 msgid "Edit Purchase Order"
 msgstr "Bestellung bearbeiten"
 
-#: order/views.py:393
+#: order/views.py:396
 msgid "Edit Sales Order"
 msgstr "Auftrag bearbeiten"
 
-#: order/views.py:409
+#: order/views.py:412
 msgid "Cancel Order"
 msgstr "Bestellung stornieren"
 
-#: order/views.py:418 order/views.py:444
+#: order/views.py:421 order/views.py:447
 msgid "Confirm order cancellation"
 msgstr "Bestellstornierung bestätigen"
 
-#: order/views.py:421 order/views.py:447
+#: order/views.py:424 order/views.py:450
 msgid "Order cannot be cancelled"
 msgstr "Bestellung kann nicht verworfen werden"
 
-#: order/views.py:435
+#: order/views.py:438
 msgid "Cancel sales order"
 msgstr "Auftrag stornieren"
 
-#: order/views.py:461
+#: order/views.py:464
 msgid "Issue Order"
 msgstr "Bestellung aufgeben"
 
-#: order/views.py:470
+#: order/views.py:473
 msgid "Confirm order placement"
 msgstr "Bestellungstätigung bestätigen"
 
-#: order/views.py:480
+#: order/views.py:483
 msgid "Purchase order issued"
 msgstr "Bestellung erstellt"
 
-#: order/views.py:491
+#: order/views.py:494
 msgid "Complete Order"
 msgstr "Auftrag fertigstellen"
 
-#: order/views.py:507
+#: order/views.py:510
 msgid "Confirm order completion"
 msgstr "Fertigstellung bestätigen"
 
-#: order/views.py:518
+#: order/views.py:521
 msgid "Purchase order completed"
 msgstr "Bestellung als vollständig markieren"
 
-#: order/views.py:528
+#: order/views.py:531
 msgid "Ship Order"
 msgstr "Versenden"
 
-#: order/views.py:544
+#: order/views.py:547
 msgid "Confirm order shipment"
 msgstr "Versand bestätigen"
 
-#: order/views.py:550
+#: order/views.py:553
 msgid "Could not ship order"
 msgstr "Versand fehlgeschlagen"
 
-#: order/views.py:604
+#: order/views.py:607
 msgid "Receive Parts"
 msgstr "Teile empfangen"
 
-#: order/views.py:674
+#: order/views.py:677
 msgid "Items received"
 msgstr "Anzahl empfangener Positionen"
 
-#: order/views.py:688
+#: order/views.py:691
 msgid "No destination set"
 msgstr "Kein Ziel gesetzt"
 
-#: order/views.py:733
+#: order/views.py:736
 msgid "Error converting quantity to number"
 msgstr "Fehler beim Konvertieren zu Zahl"
 
-#: order/views.py:739
+#: order/views.py:742
 msgid "Receive quantity less than zero"
 msgstr "Anzahl kleiner null empfangen"
 
-#: order/views.py:745
+#: order/views.py:748
 msgid "No lines specified"
 msgstr "Keine Zeilen angegeben"
 
-#: order/views.py:1114
+#: order/views.py:1117
 msgid "Supplier part must be specified"
 msgstr "Zulieferer-Teil muss ausgewählt werden"
 
-#: order/views.py:1120
+#: order/views.py:1123
 msgid "Supplier must match for Part and Order"
 msgstr "Zulieferer muss zu Teil und Bestellung passen"
 
-#: order/views.py:1239 order/views.py:1257
+#: order/views.py:1242 order/views.py:1260
 msgid "Edit Line Item"
 msgstr "Position bearbeiten"
 
-#: order/views.py:1273 order/views.py:1285
+#: order/views.py:1276 order/views.py:1288
 msgid "Delete Line Item"
 msgstr "Position löschen"
 
-#: order/views.py:1278 order/views.py:1290
+#: order/views.py:1281 order/views.py:1293
 msgid "Deleted line item"
 msgstr "Position gelöscht"
 
-#: order/views.py:1299
+#: order/views.py:1306
+#, fuzzy
+#| msgid "Latest Serial Number"
+msgid "Allocate Serial Numbers"
+msgstr "letzte Seriennummer"
+
+#: order/views.py:1351
+#, fuzzy
+#| msgid "Items"
+msgid "items"
+msgstr "Positionen"
+
+#: order/views.py:1367
+#, fuzzy
+#| msgid "Delete line item"
+msgid "Select line item"
+msgstr "Position löschen"
+
+#: order/views.py:1398
+#, fuzzy
+#| msgid "No matching stock item found"
+msgid "No matching item for serial"
+msgstr "Keine passende BestandsObjekt gefunden"
+
+#: order/views.py:1408
+#, fuzzy
+#| msgid "Count stock"
+msgid "is not in stock"
+msgstr "Bestand zählen"
+
+#: order/views.py:1416
+#, fuzzy
+#| msgid "Allocated to Orders"
+msgid "already allocated to an order"
+msgstr "zu Bauaufträgen zugeordnet"
+
+#: order/views.py:1470
 msgid "Allocate Stock to Order"
 msgstr "Lagerbestand dem Auftrag zuweisen"
 
-#: order/views.py:1373
+#: order/views.py:1544
 msgid "Edit Allocation Quantity"
 msgstr "Zuordnung bearbeiten"
 
-#: order/views.py:1388
+#: order/views.py:1559
 msgid "Remove allocation"
 msgstr "Zuordnung entfernen"
 
-#: part/bom.py:138 part/models.py:760 part/templates/part/category.html:62
-#: part/templates/part/detail.html:90
+#: part/bom.py:138 part/models.py:72 part/models.py:761
+#: part/templates/part/category.html:62 part/templates/part/detail.html:90
 msgid "Default Location"
 msgstr "Standard-Lagerort"
 
@@ -2890,7 +3053,7 @@ msgstr "Zulieferer einschließen"
 msgid "Include part supplier data in exported BOM"
 msgstr "Zulieferer-Daten in Stückliste-Export einschließen"
 
-#: part/forms.py:120 part/models.py:2053
+#: part/forms.py:120 part/models.py:2054
 msgid "Parent Part"
 msgstr "Ausgangsteil"
 
@@ -2962,326 +3125,363 @@ msgstr "Parameter-Vorlage zu allen Kategorien hinzufügen"
 msgid "Input quantity for price calculation"
 msgstr "Eintragsmenge zur Preisberechnung"
 
-#: part/models.py:72
+#: part/models.py:73
 msgid "Default location for parts in this category"
 msgstr "Standard-Lagerort für Teile dieser Kategorie"
 
-#: part/models.py:75
+#: part/models.py:76
+#, fuzzy
+#| msgid "Default Currency"
+msgid "Default keywords"
+msgstr "Standard-Währung"
+
+#: part/models.py:76
 msgid "Default keywords for parts in this category"
 msgstr "Standard-Stichworte für Teile dieser Kategorie"
 
-#: part/models.py:81 part/models.py:2098
+#: part/models.py:82 part/models.py:2099
 #: part/templates/part/part_app_base.html:9
 msgid "Part Category"
 msgstr "Teilkategorie"
 
-#: part/models.py:82 part/templates/part/category.html:19
+#: part/models.py:83 part/templates/part/category.html:19
 #: part/templates/part/category.html:90 part/templates/part/category.html:141
 #: templates/InvenTree/search.html:126 templates/stats.html:39
-#: users/models.py:32
+#: users/models.py:37
 msgid "Part Categories"
 msgstr "Teile-Kategorien"
 
-#: part/models.py:445 part/models.py:457
+#: part/models.py:446 part/models.py:458
 #, python-brace-format
 msgid "Part '{p1}' is  used in BOM for '{p2}' (recursive)"
 msgstr "Teil '{p1}' wird in Stückliste für Teil '{p2}' benutzt (rekursiv)"
 
-#: part/models.py:554
+#: part/models.py:555
 msgid "Next available serial numbers are"
 msgstr "Nächste verfügbare Seriennummern wären"
 
-#: part/models.py:558
+#: part/models.py:559
 msgid "Next available serial number is"
 msgstr "Nächste verfügbare Seriennummer ist"
 
-#: part/models.py:563
+#: part/models.py:564
 msgid "Most recent serial number is"
 msgstr "Die neuste Seriennummer ist"
 
-#: part/models.py:642
+#: part/models.py:643
 msgid "Duplicate IPN not allowed in part settings"
 msgstr "Doppelte IPN in den Teil-Einstellungen nicht erlaubt"
 
-#: part/models.py:653
+#: part/models.py:654
 msgid "Part must be unique for name, IPN and revision"
 msgstr "Namen, Teile- und Revisionsnummern müssen eindeutig sein"
 
-#: part/models.py:684 part/templates/part/detail.html:22
+#: part/models.py:685 part/templates/part/detail.html:22
 msgid "Part name"
 msgstr "Name des Teils"
 
-#: part/models.py:691
+#: part/models.py:692
 msgid "Is Template"
 msgstr "Ist eine Vorlage"
 
-#: part/models.py:692
+#: part/models.py:693
 msgid "Is this part a template part?"
 msgstr "Ist dieses Teil eine Vorlage?"
 
-#: part/models.py:703
+#: part/models.py:704
 msgid "Is this part a variant of another part?"
 msgstr "Ist dieses Teil eine Variante eines anderen Teils?"
 
-#: part/models.py:704 part/templates/part/detail.html:60
+#: part/models.py:705 part/templates/part/detail.html:60
 msgid "Variant Of"
 msgstr "Variante von"
 
-#: part/models.py:710
+#: part/models.py:711
 msgid "Part description"
 msgstr "Beschreibung des Teils"
 
-#: part/models.py:715 part/templates/part/category.html:69
+#: part/models.py:716 part/templates/part/category.html:69
 #: part/templates/part/detail.html:67
 msgid "Keywords"
 msgstr "Schlüsselwörter"
 
-#: part/models.py:716
+#: part/models.py:717
 msgid "Part keywords to improve visibility in search results"
 msgstr "Schlüsselworte um die Sichtbarkeit in Suchergebnissen zu verbessern"
 
-#: part/models.py:723 part/templates/part/detail.html:73
+#: part/models.py:724 part/templates/part/detail.html:73
 #: part/templates/part/set_category.html:15 templates/js/part.js:384
 msgid "Category"
 msgstr "Kategorie"
 
-#: part/models.py:724
+#: part/models.py:725
 msgid "Part category"
 msgstr "Teile-Kategorie"
 
-#: part/models.py:729 part/templates/part/detail.html:28
+#: part/models.py:730 part/templates/part/detail.html:28
 #: part/templates/part/part_base.html:93 templates/js/part.js:160
 msgid "IPN"
 msgstr "IPN (Interne Produktnummer)"
 
-#: part/models.py:730
+#: part/models.py:731
 msgid "Internal Part Number"
 msgstr "Interne Teilenummer"
 
-#: part/models.py:736
+#: part/models.py:737
 msgid "Part revision or version number"
 msgstr "Revisions- oder Versionsnummer"
 
-#: part/models.py:737 part/templates/part/detail.html:35 report/models.py:198
+#: part/models.py:738 part/templates/part/detail.html:35 report/models.py:198
 #: templates/js/part.js:164
 msgid "Revision"
 msgstr "Revision"
 
-#: part/models.py:758
+#: part/models.py:759
 msgid "Where is this item normally stored?"
 msgstr "Wo wird dieses Teil normalerweise gelagert?"
 
-#: part/models.py:805 part/templates/part/detail.html:97
+#: part/models.py:806 part/templates/part/detail.html:97
 msgid "Default Supplier"
 msgstr "Standard Zulieferer"
 
-#: part/models.py:806
+#: part/models.py:807
 msgid "Default supplier part"
 msgstr "Standard Zulieferer-Teil"
 
-#: part/models.py:813
+#: part/models.py:814
 msgid "Default Expiry"
 msgstr "Standard Ablaufzeit"
 
-#: part/models.py:814
+#: part/models.py:815
 msgid "Expiry time (in days) for stock items of this part"
 msgstr "Ablauf-Zeit (in Tagen) für Lagerbestand dieses Teils"
 
-#: part/models.py:819 part/templates/part/detail.html:113
+#: part/models.py:820 part/templates/part/detail.html:113
 msgid "Minimum Stock"
 msgstr "Minimaler Lagerbestand"
 
-#: part/models.py:820
+#: part/models.py:821
 msgid "Minimum allowed stock level"
 msgstr "Minimal zulässiger Lagerbestand"
 
-#: part/models.py:826 part/templates/part/detail.html:106
+#: part/models.py:827 part/templates/part/detail.html:106
 #: part/templates/part/params.html:29
 msgid "Units"
 msgstr "Einheiten"
 
-#: part/models.py:827
+#: part/models.py:828
 msgid "Stock keeping units for this part"
 msgstr "Stock Keeping Units (SKU) für dieses Teil"
 
-#: part/models.py:833
+#: part/models.py:834
 msgid "Can this part be built from other parts?"
 msgstr "Kann dieses Teil aus anderen Teilen angefertigt werden?"
 
-#: part/models.py:839
+#: part/models.py:840
 msgid "Can this part be used to build other parts?"
 msgstr "Kann dieses Teil zum Bau von anderen genutzt werden?"
 
-#: part/models.py:845
+#: part/models.py:846
 msgid "Does this part have tracking for unique items?"
 msgstr "Hat dieses Teil Tracking für einzelne Objekte?"
 
-#: part/models.py:850
+#: part/models.py:851
 msgid "Can this part be purchased from external suppliers?"
 msgstr "Kann dieses Teil von externen Zulieferern gekauft werden?"
 
-#: part/models.py:855
+#: part/models.py:856
 msgid "Can this part be sold to customers?"
 msgstr "Kann dieses Teil an Kunden verkauft werden?"
 
-#: part/models.py:859 part/templates/part/detail.html:227
+#: part/models.py:860 part/templates/part/detail.html:227
 #: templates/js/table_filters.js:20 templates/js/table_filters.js:60
 #: templates/js/table_filters.js:214 templates/js/table_filters.js:283
 msgid "Active"
 msgstr "Aktiv"
 
-#: part/models.py:860
+#: part/models.py:861
 msgid "Is this part active?"
 msgstr "Ist dieses Teil aktiv?"
 
-#: part/models.py:865
+#: part/models.py:866
 msgid "Is this a virtual part, such as a software product or license?"
 msgstr "Ist dieses Teil virtuell, wie zum Beispiel eine Software oder Lizenz?"
 
-#: part/models.py:870
+#: part/models.py:871
 msgid "Part notes - supports Markdown formatting"
 msgstr "Bemerkungen - unterstüzt Markdown-Formatierung"
 
-#: part/models.py:873
+#: part/models.py:874
+#, fuzzy
+#| msgid "BOM line checksum"
+msgid "BOM checksum"
+msgstr "Prüfsumme der Stückliste"
+
+#: part/models.py:874
 msgid "Stored BOM checksum"
 msgstr "Prüfsumme der Stückliste gespeichert"
 
-#: part/models.py:1926
+#: part/models.py:877
+msgid "BOM checked by"
+msgstr ""
+
+#: part/models.py:879
+msgid "BOM checked date"
+msgstr ""
+
+#: part/models.py:881 part/templates/part/detail.html:126
+#: templates/js/order.js:293
+msgid "Creation Date"
+msgstr "Erstelldatum"
+
+#: part/models.py:883
+#, fuzzy
+#| msgid "Creation Date"
+msgid "Creation User"
+msgstr "Erstelldatum"
+
+#: part/models.py:1927
 msgid "Test templates can only be created for trackable parts"
 msgstr "Test-Vorlagen können nur für verfolgbare Teile angelegt werden"
 
-#: part/models.py:1943
+#: part/models.py:1944
 msgid "Test with this name already exists for this part"
 msgstr "Ein Test mit diesem Namen besteht bereits für dieses Teil"
 
-#: part/models.py:1962 templates/js/part.js:561 templates/js/stock.js:104
+#: part/models.py:1963 templates/js/part.js:561 templates/js/stock.js:104
 msgid "Test Name"
 msgstr "Test-Name"
 
-#: part/models.py:1963
+#: part/models.py:1964
 msgid "Enter a name for the test"
 msgstr "Namen für diesen Test eingeben"
 
-#: part/models.py:1968
+#: part/models.py:1969
 msgid "Test Description"
 msgstr "Test-Beschreibung"
 
-#: part/models.py:1969
+#: part/models.py:1970
 msgid "Enter description for this test"
 msgstr "Beschreibung für diesen Test eingeben"
 
-#: part/models.py:1974 templates/js/part.js:570
+#: part/models.py:1975 templates/js/part.js:570
 #: templates/js/table_filters.js:200
 msgid "Required"
 msgstr "benötigt"
 
-#: part/models.py:1975
+#: part/models.py:1976
 msgid "Is this test required to pass?"
 msgstr "Muss dieser Test erfolgreich sein?"
 
-#: part/models.py:1980 templates/js/part.js:578
+#: part/models.py:1981 templates/js/part.js:578
 msgid "Requires Value"
 msgstr "verpflichtender Wert"
 
-#: part/models.py:1981
+#: part/models.py:1982
 msgid "Does this test require a value when adding a test result?"
 msgstr ""
 "Muss für diesen Test ein Wert für das Test-Ergebnis eingetragen werden?"
 
-#: part/models.py:1986 templates/js/part.js:585
+#: part/models.py:1987 templates/js/part.js:585
 msgid "Requires Attachment"
 msgstr "Anhang muss eingegeben werden"
 
-#: part/models.py:1987
+#: part/models.py:1988
 msgid "Does this test require a file attachment when adding a test result?"
 msgstr ""
 "Muss für diesen Test ein Anhang für das Test-Ergebnis hinzugefügt werden?"
 
-#: part/models.py:2020
+#: part/models.py:2021
 msgid "Parameter template name must be unique"
 msgstr "Vorlagen-Name des Parameters muss eindeutig sein"
 
-#: part/models.py:2025
+#: part/models.py:2026
 msgid "Parameter Name"
 msgstr "Name des Parameters"
 
-#: part/models.py:2027
+#: part/models.py:2028
 msgid "Parameter Units"
 msgstr "Parameter Einheit"
 
-#: part/models.py:2055 part/models.py:2103
+#: part/models.py:2056 part/models.py:2104
 #: templates/InvenTree/settings/category.html:62
 msgid "Parameter Template"
 msgstr "Parameter Vorlage"
 
-#: part/models.py:2057
+#: part/models.py:2058
+#, fuzzy
+#| msgid "Test Data"
+msgid "Data"
+msgstr "Testdaten"
+
+#: part/models.py:2058
 msgid "Parameter Value"
 msgstr "Parameter Wert"
 
-#: part/models.py:2107
+#: part/models.py:2108
 msgid "Default Parameter Value"
 msgstr "Standard Parameter Wert"
 
-#: part/models.py:2135
+#: part/models.py:2136
 msgid "Select parent part"
 msgstr "Ausgangsteil auswählen"
 
-#: part/models.py:2143
+#: part/models.py:2144
 msgid "Select part to be used in BOM"
 msgstr "Teil für die Nutzung in der Stückliste auswählen"
 
-#: part/models.py:2149
+#: part/models.py:2150
 msgid "BOM quantity for this BOM item"
 msgstr "Stücklisten-Anzahl für dieses Stücklisten-Teil"
 
-#: part/models.py:2151
+#: part/models.py:2152
 msgid "This BOM item is optional"
 msgstr "Diese Stücklisten-Position ist optional"
 
-#: part/models.py:2154
+#: part/models.py:2155
 msgid "Estimated build wastage quantity (absolute or percentage)"
 msgstr "Geschätzter Ausschuss (absolut oder prozentual)"
 
-#: part/models.py:2157
+#: part/models.py:2158
 msgid "BOM item reference"
 msgstr "Referenz der Postion auf der Stückliste"
 
-#: part/models.py:2160
+#: part/models.py:2161
 msgid "BOM item notes"
 msgstr "Notizen zur Stücklisten-Position"
 
-#: part/models.py:2162
+#: part/models.py:2163
 msgid "BOM line checksum"
 msgstr "Prüfsumme der Stückliste"
 
-#: part/models.py:2166 templates/js/bom.js:275 templates/js/bom.js:282
+#: part/models.py:2167 templates/js/bom.js:275 templates/js/bom.js:282
 #: templates/js/table_filters.js:50
 msgid "Inherited"
 msgstr "Geerbt"
 
-#: part/models.py:2167
+#: part/models.py:2168
 msgid "This BOM item is inherited by BOMs for variant parts"
 msgstr ""
 "Diese Stücklisten-Position wird in dei Stücklisten von Teil-Varianten vererbt"
 
-#: part/models.py:2243 part/views.py:1592 part/views.py:1644
+#: part/models.py:2244 part/views.py:1592 part/views.py:1644
 #: stock/models.py:259
 msgid "Quantity must be integer value for trackable parts"
 msgstr "Menge muss eine Ganzzahl sein"
 
-#: part/models.py:2252 part/models.py:2254
+#: part/models.py:2253 part/models.py:2255
 msgid "Sub part must be specified"
 msgstr "Zulieferer-Teil muss festgelegt sein"
 
-#: part/models.py:2257
+#: part/models.py:2258
 msgid "BOM Item"
 msgstr "Stücklisten-Position"
 
-#: part/models.py:2378
+#: part/models.py:2379
 msgid "Select Related Part"
 msgstr "verknüpftes Teil auswählen"
 
-#: part/models.py:2410
+#: part/models.py:2411
 msgid ""
 "Error creating relationship: check that the part is not related to itself "
 "and that the relationship is unique"
@@ -3304,7 +3504,7 @@ msgstr "Bestellung"
 #: part/templates/part/allocation.html:49
 #: stock/templates/stock/item_base.html:8
 #: stock/templates/stock/item_base.html:89
-#: stock/templates/stock/item_base.html:318
+#: stock/templates/stock/item_base.html:324
 #: stock/templates/stock/stock_adjust.html:16 templates/js/build.js:771
 #: templates/js/stock.js:923 templates/js/stock.js:1181
 msgid "Stock Item"
@@ -3404,6 +3604,12 @@ msgstr "Auswahl übertragen"
 msgid "File Fields"
 msgstr "Datei-Felder"
 
+#: part/templates/part/bom_upload/select_fields.html:47
+#, fuzzy
+#| msgid "Remove row"
+msgid "Remove column"
+msgstr "Zeile entfernen"
+
 #: part/templates/part/bom_upload/select_fields.html:58
 msgid "Match Fields"
 msgstr "Übereinstimmende Felder"
@@ -3412,6 +3618,11 @@ msgstr "Übereinstimmende Felder"
 msgid "Duplicate column selection"
 msgstr "Spalte doppelt ausgewählt"
 
+#: part/templates/part/bom_upload/select_fields.html:76
+#: part/templates/part/bom_upload/select_parts.html:58
+msgid "Remove row"
+msgstr "Zeile entfernen"
+
 #: part/templates/part/bom_upload/select_parts.html:16
 msgid "Step 3 - Select Parts"
 msgstr "Schritt 3 - Teile auswählen"
@@ -3433,10 +3644,6 @@ msgstr "Zeile"
 msgid "Select Part"
 msgstr "Teil auswählen"
 
-#: part/templates/part/bom_upload/select_parts.html:58
-msgid "Remove row"
-msgstr "Zeile entfernen"
-
 #: part/templates/part/bom_upload/select_parts.html:65
 #: part/templates/part/category.html:117
 msgid "Create new part"
@@ -3523,7 +3730,8 @@ msgstr "Teilkategorie auswählen"
 msgid "Export Data"
 msgstr "Exportieren"
 
-#: part/templates/part/category.html:198 templates/js/stock.js:705
+#: part/templates/part/category.html:198
+#: stock/templates/stock/location.html:192 templates/js/stock.js:705
 msgid "Create new location"
 msgstr "Neuen Lagerort anlegen"
 
@@ -3638,10 +3846,6 @@ msgstr "Keine Seriennummern gefunden"
 msgid "Stock Expiry Time"
 msgstr "Bestands-Ablauf Zeit"
 
-#: part/templates/part/detail.html:126 templates/js/order.js:293
-msgid "Creation Date"
-msgstr "Erstelldatum"
-
 #: part/templates/part/detail.html:132
 msgid "Created By"
 msgstr "Erstellt von"
@@ -3742,7 +3946,7 @@ msgstr "VK-Preis"
 msgid "Part Test Templates"
 msgstr "Teil Test-Vorlagen"
 
-#: part/templates/part/navbar.html:103 stock/templates/stock/item_base.html:376
+#: part/templates/part/navbar.html:103 stock/templates/stock/item_base.html:382
 msgid "Tests"
 msgstr "Tests"
 
@@ -3777,10 +3981,22 @@ msgid "Edit"
 msgstr "Bearbeiten"
 
 #: part/templates/part/params.html:44 part/templates/part/related.html:44
-#: part/templates/part/supplier.html:22 users/models.py:170
+#: part/templates/part/supplier.html:22 users/models.py:175
 msgid "Delete"
 msgstr "Löschen"
 
+#: part/templates/part/params.html:68
+#, fuzzy
+#| msgid "Template"
+msgid "New Template"
+msgstr "Vorlage"
+
+#: part/templates/part/params.html:69
+#, fuzzy
+#| msgid "Create Part Parameter Template"
+msgid "Create New Parameter Template"
+msgstr "Teilparametervorlage anlegen"
+
 #: part/templates/part/part_app_base.html:11
 msgid "Part List"
 msgstr "Teileliste"
@@ -3806,7 +4022,7 @@ msgstr "Barcode Aktionen"
 
 #: part/templates/part/part_base.html:48
 #: stock/templates/stock/item_base.html:129
-#: stock/templates/stock/location.html:46
+#: stock/templates/stock/location.html:46 templates/qr_button.html:1
 msgid "Show QR Code"
 msgstr "QR-Code anzeigen"
 
@@ -3864,6 +4080,64 @@ msgstr "Herstellbar"
 msgid "Building"
 msgstr "Im Bau"
 
+#: part/templates/part/part_base.html:249
+msgid "Calculate"
+msgstr ""
+
+#: part/templates/part/part_pricing.html:8
+#, fuzzy
+#| msgid "Pricing Information"
+msgid "Pricing information for:"
+msgstr "Preisinformationen ansehen"
+
+#: part/templates/part/part_pricing.html:24
+#, fuzzy
+#| msgid "Supplier Part Pricing"
+msgid "Supplier Pricing"
+msgstr "Zulieferer-Teil Bepreisung"
+
+#: part/templates/part/part_pricing.html:28
+#: part/templates/part/part_pricing.html:54
+#, fuzzy
+#| msgid "Units"
+msgid "Unit Cost"
+msgstr "Einheiten"
+
+#: part/templates/part/part_pricing.html:34
+#: part/templates/part/part_pricing.html:60
+msgid "Total Cost"
+msgstr ""
+
+#: part/templates/part/part_pricing.html:42
+#, fuzzy
+#| msgid "No pricing available"
+msgid "No supplier pricing available"
+msgstr "Keine Preisinformation verfügbar"
+
+#: part/templates/part/part_pricing.html:50
+#, fuzzy
+#| msgid "BOM Price"
+msgid "BOM Pricing"
+msgstr "Stücklistenpreis"
+
+#: part/templates/part/part_pricing.html:68
+#, fuzzy
+#| msgid "BOM pricing is incomplete"
+msgid "Note: BOM pricing is incomplete for this part"
+msgstr "Stücklistenbepreisung ist unvollständig"
+
+#: part/templates/part/part_pricing.html:75
+#, fuzzy
+#| msgid "No pricing available"
+msgid "No BOM pricing available"
+msgstr "Keine Preisinformation verfügbar"
+
+#: part/templates/part/part_pricing.html:85
+#, fuzzy
+#| msgid "No price breaks have been added for this part"
+msgid "No pricing information is available for this part."
+msgstr "Keine Preisstaffelung für dieses Teil"
+
 #: part/templates/part/part_tests.html:17
 msgid "Add Test Template"
 msgstr "Test Vorlage hinzufügen"
@@ -3892,10 +4166,6 @@ msgstr "Neue Bestellung"
 msgid "Set category for the following parts"
 msgstr "Kategorie für Teile setzen"
 
-#: part/templates/part/set_category.html:32
-msgid "Remove part"
-msgstr "Teil entfernen"
-
 #: part/templates/part/stock.html:10
 msgid "Part Stock"
 msgstr "Teilbestand"
@@ -4188,7 +4458,9 @@ msgstr "Report Vorlage ist ein"
 
 #: report/models.py:295
 msgid "StockItem query filters (comma-separated list of key=value pairs)"
-msgstr "BestandsObjekte-Abfragefilter (kommagetrennte Liste mit Schlüssel=Wert-Paaren)"
+msgstr ""
+"BestandsObjekte-Abfragefilter (kommagetrennte Liste mit Schlüssel=Wert-"
+"Paaren)"
 
 #: report/models.py:303
 msgid "Include Installed Tests"
@@ -4400,7 +4672,7 @@ msgstr "Wo wird dieses Teil normalerweise gelagert?"
 msgid "Packaging this stock item is stored in"
 msgstr "Die Verpackung dieses BestandsObjekt ist gelagert in"
 
-#: stock/models.py:400 stock/templates/stock/item_base.html:249
+#: stock/models.py:400 stock/templates/stock/item_base.html:255
 msgid "Installed In"
 msgstr "verbaut in"
 
@@ -4440,7 +4712,7 @@ msgstr "Bestellung für dieses BestandsObjekt"
 msgid "Destination Sales Order"
 msgstr "Ziel-Auftrag"
 
-#: stock/models.py:472 stock/templates/stock/item_base.html:343
+#: stock/models.py:472 stock/templates/stock/item_base.html:349
 #: templates/js/stock.js:652
 msgid "Expiry Date"
 msgstr "Ablaufdatum"
@@ -4535,6 +4807,10 @@ msgstr "aufteilen vom vorhandenen Bestand"
 msgid "StockItem cannot be moved as it is not in stock"
 msgstr "BestandsObjekt kann nicht bewegt werden, da kein Bestand vorhanden ist"
 
+#: stock/models.py:1551
+msgid "Title"
+msgstr "Titel"
+
 #: stock/models.py:1551
 msgid "Tracking entry title"
 msgstr "Objektverfolgung - Name des Eintrags"
@@ -4567,10 +4843,6 @@ msgstr "Testergebnis"
 msgid "Test output value"
 msgstr "Test Ausgabe Wert"
 
-#: stock/models.py:1657
-msgid "Attachment"
-msgstr "Anhang"
-
 #: stock/models.py:1658
 msgid "Test result attachment"
 msgstr "Test Ergebnis Anhang"
@@ -4640,12 +4912,12 @@ msgstr ""
 "aufgebraucht ist."
 
 #: stock/templates/stock/item_base.html:91
-#: stock/templates/stock/item_base.html:347 templates/js/table_filters.js:123
+#: stock/templates/stock/item_base.html:353 templates/js/table_filters.js:123
 msgid "Expired"
 msgstr "abgelaufen"
 
 #: stock/templates/stock/item_base.html:95
-#: stock/templates/stock/item_base.html:349 templates/js/table_filters.js:128
+#: stock/templates/stock/item_base.html:355 templates/js/table_filters.js:128
 msgid "Stale"
 msgstr "überfällig"
 
@@ -4680,97 +4952,97 @@ msgstr "Bestands-Anpassungs Aktionen"
 msgid "Count stock"
 msgstr "Bestand zählen"
 
-#: stock/templates/stock/item_base.html:161 templates/stock_table.html:53
+#: stock/templates/stock/item_base.html:163 templates/stock_table.html:53
 msgid "Add stock"
 msgstr "Bestand hinzufügen"
 
-#: stock/templates/stock/item_base.html:162 templates/stock_table.html:54
+#: stock/templates/stock/item_base.html:166 templates/stock_table.html:54
 msgid "Remove stock"
 msgstr "Bestand entfernen"
 
-#: stock/templates/stock/item_base.html:164
+#: stock/templates/stock/item_base.html:169
 msgid "Transfer stock"
 msgstr "Bestand verschieben"
 
-#: stock/templates/stock/item_base.html:166
+#: stock/templates/stock/item_base.html:172
 msgid "Serialize stock"
 msgstr "Lagerbestand serialisieren"
 
-#: stock/templates/stock/item_base.html:170
+#: stock/templates/stock/item_base.html:176
 msgid "Assign to customer"
 msgstr "zu Kunden zuordnen"
 
-#: stock/templates/stock/item_base.html:173
+#: stock/templates/stock/item_base.html:179
 msgid "Return to stock"
 msgstr "zu Bestand zurückgeben"
 
-#: stock/templates/stock/item_base.html:177 templates/js/stock.js:1218
+#: stock/templates/stock/item_base.html:183 templates/js/stock.js:1218
 msgid "Uninstall stock item"
 msgstr "BestandsObjekt deinstallieren"
 
-#: stock/templates/stock/item_base.html:177
+#: stock/templates/stock/item_base.html:183
 msgid "Uninstall"
 msgstr "Deinstallieren"
 
-#: stock/templates/stock/item_base.html:186
+#: stock/templates/stock/item_base.html:192
 #: stock/templates/stock/location.html:55
 msgid "Stock actions"
 msgstr "Bestands-Aktionen"
 
-#: stock/templates/stock/item_base.html:189
+#: stock/templates/stock/item_base.html:195
 msgid "Convert to variant"
 msgstr "in Variante ändern"
 
-#: stock/templates/stock/item_base.html:192
+#: stock/templates/stock/item_base.html:198
 msgid "Duplicate stock item"
 msgstr "BestandsObjekt duplizieren"
 
-#: stock/templates/stock/item_base.html:194
+#: stock/templates/stock/item_base.html:200
 msgid "Edit stock item"
 msgstr "BestandsObjekt bearbeiten"
 
-#: stock/templates/stock/item_base.html:197
+#: stock/templates/stock/item_base.html:203
 msgid "Delete stock item"
 msgstr "BestandsObjekt löschen"
 
-#: stock/templates/stock/item_base.html:209
+#: stock/templates/stock/item_base.html:215
 msgid "Stock Item Details"
 msgstr "BestandsObjekt-Details"
 
-#: stock/templates/stock/item_base.html:268 templates/js/build.js:442
+#: stock/templates/stock/item_base.html:274 templates/js/build.js:442
 msgid "No location set"
 msgstr "Kein Lagerort gesetzt"
 
-#: stock/templates/stock/item_base.html:275
+#: stock/templates/stock/item_base.html:281
 msgid "Barcode Identifier"
 msgstr "Barcode-Bezeichner"
 
-#: stock/templates/stock/item_base.html:296 templates/InvenTree/search.html:167
+#: stock/templates/stock/item_base.html:302 templates/InvenTree/search.html:167
 #: templates/js/build.js:655 templates/navbar.html:29
 msgid "Build"
 msgstr "Bau"
 
-#: stock/templates/stock/item_base.html:317
+#: stock/templates/stock/item_base.html:323
 msgid "Parent Item"
 msgstr "Elternposition"
 
-#: stock/templates/stock/item_base.html:347
+#: stock/templates/stock/item_base.html:353
 msgid "This StockItem expired on"
 msgstr "Dieses BestandsObjekt lief ab am"
 
-#: stock/templates/stock/item_base.html:349
+#: stock/templates/stock/item_base.html:355
 msgid "This StockItem expires on"
 msgstr "Dieses BestandsObjekt läuft ab am"
 
-#: stock/templates/stock/item_base.html:356 templates/js/stock.js:658
+#: stock/templates/stock/item_base.html:362 templates/js/stock.js:658
 msgid "Last Updated"
 msgstr "Zuletzt aktualisiert"
 
-#: stock/templates/stock/item_base.html:361
+#: stock/templates/stock/item_base.html:367
 msgid "Last Stocktake"
 msgstr "Letzte Inventur"
 
-#: stock/templates/stock/item_base.html:365
+#: stock/templates/stock/item_base.html:371
 msgid "No stocktake performed"
 msgstr "Keine Inventur ausgeführt"
 
@@ -4881,7 +5153,7 @@ msgid "Stock Details"
 msgstr "Objekt-Details"
 
 #: stock/templates/stock/location.html:110 templates/InvenTree/search.html:263
-#: templates/stats.html:52 users/models.py:34
+#: templates/stats.html:52 users/models.py:39
 msgid "Stock Locations"
 msgstr "Bestand-Lagerorte"
 
@@ -4921,6 +5193,12 @@ msgstr "Kindobjekte"
 msgid "Children"
 msgstr "Kinder"
 
+#: stock/templates/stock/stock_adjust.html:43
+#, fuzzy
+#| msgid "Remove stock item"
+msgid "Remove item"
+msgstr "BestandsObjekt entfernen"
+
 #: stock/templates/stock/stock_app_base.html:15
 msgid "Loading..."
 msgstr "Lade..."
@@ -5426,10 +5704,6 @@ msgstr "Anhang hinzufügen"
 msgid "File"
 msgstr "Datei"
 
-#: templates/attachment_table.html:16
-msgid "Comment"
-msgstr "Kommentar"
-
 #: templates/attachment_table.html:17
 msgid "Uploaded"
 msgstr "Hochgeladen"
@@ -5617,19 +5891,11 @@ msgstr "benötigter Teil"
 msgid "Quantity Per"
 msgstr "Anzahl pro"
 
-#: templates/js/build.js:578 templates/js/build.js:992
-msgid "Build stock"
-msgstr "Baue Bestand"
-
 #: templates/js/build.js:582 templates/js/build.js:996
 #: templates/stock_table.html:57
 msgid "Order stock"
 msgstr "Bestand bestellen"
 
-#: templates/js/build.js:585
-msgid "Allocate stock"
-msgstr "Lagerbestand zuweisen"
-
 #: templates/js/build.js:632
 msgid "No builds matching query"
 msgstr "Keine Baue passen zur Anfrage"
@@ -5671,6 +5937,30 @@ msgstr "Vorlagenteil"
 msgid "Assembled part"
 msgstr "Baugruppe"
 
+#: templates/js/filters.js:193
+#, fuzzy
+#| msgid "Select Category"
+msgid "Select filter"
+msgstr "Kategorie auswählen"
+
+#: templates/js/filters.js:268
+#, fuzzy
+#| msgid "Add new parameter"
+msgid "Add new filter"
+msgstr "Parameter hinzufügen"
+
+#: templates/js/filters.js:271
+#, fuzzy
+#| msgid "Part Filters"
+msgid "Clear all filters"
+msgstr "Teil Filter"
+
+#: templates/js/filters.js:296
+#, fuzzy
+#| msgid "Create Variant"
+msgid "Create filter"
+msgstr "Variante anlegen"
+
 #: templates/js/label.js:10 templates/js/report.js:98
 msgid "Select Stock Items"
 msgstr "BestandsObjekte auswählen"
@@ -5712,6 +6002,10 @@ msgstr "Label auswählen"
 msgid "Select Label Template"
 msgstr "Label-Vorlage auswählen"
 
+#: templates/js/modals.js:256
+msgid "Waiting for server..."
+msgstr ""
+
 #: templates/js/modals.js:406
 msgid "Show Error Information"
 msgstr "Fehler-Informationen anzeigen"
@@ -6060,6 +6354,18 @@ msgstr "Status Code muss ausgewählt werden"
 msgid "No user information"
 msgstr "Keine Benutzerinformation"
 
+#: templates/js/stock.js:979
+#, fuzzy
+#| msgid "Edit Stock Tracking Entry"
+msgid "Edit tracking entry"
+msgstr "Lagerbestands-Tracking-Eintrag bearbeiten"
+
+#: templates/js/stock.js:980
+#, fuzzy
+#| msgid "Delete Stock Tracking Entry"
+msgid "Delete tracking entry"
+msgstr "Lagerbestands-Tracking-Eintrag löschen"
+
 #: templates/js/stock.js:1089
 msgid "Create New Location"
 msgstr "Neuen Lagerort anlegen"
@@ -6306,7 +6612,7 @@ msgstr "Barcode scannen"
 msgid "InvenTree server issues detected"
 msgstr "InvenTree Server Fehler aufgetreten"
 
-#: templates/navbar.html:69 users/models.py:31
+#: templates/navbar.html:69 users/models.py:36
 msgid "Admin"
 msgstr "Admin"
 
@@ -6458,42 +6764,54 @@ msgstr "Berechtigungen"
 msgid "Important dates"
 msgstr "wichtige Daten"
 
-#: users/models.py:153
+#: users/models.py:158
 msgid "Permission set"
 msgstr "Berechtigung geändert"
 
-#: users/models.py:161
+#: users/models.py:166
 msgid "Group"
 msgstr "Gruppe"
 
-#: users/models.py:164
+#: users/models.py:169
 msgid "View"
 msgstr "Ansicht"
 
-#: users/models.py:164
+#: users/models.py:169
 msgid "Permission to view items"
 msgstr "Berechtigung Einträge anzuzeigen"
 
-#: users/models.py:166
+#: users/models.py:171
 msgid "Add"
 msgstr "Hinzufügen"
 
-#: users/models.py:166
+#: users/models.py:171
 msgid "Permission to add items"
 msgstr "Berechtigung Einträge zu erstellen"
 
-#: users/models.py:168
+#: users/models.py:173
 msgid "Change"
 msgstr "Ändern"
 
-#: users/models.py:168
+#: users/models.py:173
 msgid "Permissions to edit items"
 msgstr "Berechtigungen Einträge zu ändern"
 
-#: users/models.py:170
+#: users/models.py:175
 msgid "Permission to delete items"
 msgstr "Berechtigung Einträge zu löschen"
 
+#~ msgid "Serial numbers"
+#~ msgstr "Seriennummern"
+
+#~ msgid "Buy parts"
+#~ msgstr "Teile kaufen"
+
+#~ msgid "Build parts"
+#~ msgstr "Bauteile"
+
+#~ msgid "Allocate parts"
+#~ msgstr "Teile zuordnen"
+
 #, fuzzy
 #~| msgid "Part is not a virtual part"
 #~ msgid "This part is a virtual part"
@@ -6607,12 +6925,6 @@ msgstr "Berechtigung Einträge zu löschen"
 #~ msgid "Database Statistics"
 #~ msgstr "Datenbankstatistiken"
 
-#~ msgid "BOM Price"
-#~ msgstr "Stücklistenpreis"
-
-#~ msgid "BOM pricing is incomplete"
-#~ msgstr "Stücklistenbepreisung ist unvollständig"
-
 #~ msgid "No pricing information"
 #~ msgstr "Keine Preisinformation"
 
@@ -6673,11 +6985,6 @@ msgstr "Berechtigung Einträge zu löschen"
 #~ msgid "New Currency"
 #~ msgstr "Währung entfernen"
 
-#, fuzzy
-#~| msgid "Serial Number"
-#~ msgid "Serial Numbers"
-#~ msgstr "Seriennummer"
-
 #~ msgid "Automatically allocate stock"
 #~ msgstr "Lagerbestand automatisch zuweisen"
 
@@ -6776,9 +7083,6 @@ msgstr "Berechtigung Einträge zu löschen"
 #~ "Teile werden automatisch zugewiesen, wenn nur ein BestandsObjekt "
 #~ "verfügbar ist"
 
-#~ msgid "Title"
-#~ msgstr "Titel"
-
 #~ msgid "Allocate new Part"
 #~ msgstr "Neues Teil zuordnen"
 
@@ -6841,18 +7145,12 @@ msgstr "Berechtigung Einträge zu löschen"
 #~ msgid "Uninstall selected stock items"
 #~ msgstr "Vorrat zu {n} BestandsObjekten hinzugefügt"
 
-#~ msgid "Order Multiple"
-#~ msgstr "Bestellvielfaches"
-
 #~ msgid "Base Price (Flat Fee)"
 #~ msgstr "Grundpreis"
 
 #~ msgid "New Price Break"
 #~ msgstr "Neue Preisstaffelung"
 
-#~ msgid "No price breaks have been added for this part"
-#~ msgstr "Keine Preisstaffelung für dieses Teil"
-
 #~ msgid "Part cannot be added to its own Bill of Materials"
 #~ msgstr "Teil kann nicht zu seiner eigenen Stückliste hinzugefügt werden"
 
diff --git a/InvenTree/locale/en/LC_MESSAGES/django.po b/InvenTree/locale/en/LC_MESSAGES/django.po
index d229c67b45..7fe67bf929 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: 2021-03-28 16:04+0000\n"
+"POT-Creation-Date: 2021-04-03 02:10+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"
@@ -34,7 +34,7 @@ msgstr ""
 msgid "Enter date"
 msgstr ""
 
-#: InvenTree/forms.py:110 build/forms.py:97 build/forms.py:185
+#: InvenTree/forms.py:110 build/forms.py:99 build/forms.py:187
 msgid "Confirm"
 msgstr ""
 
@@ -91,47 +91,84 @@ msgstr ""
 msgid "Number of unique serial number ({s}) must match quantity ({q})"
 msgstr ""
 
+#: InvenTree/models.py:59 stock/models.py:1657
+msgid "Attachment"
+msgstr ""
+
 #: InvenTree/models.py:60
 msgid "Select file to attach"
 msgstr ""
 
+#: InvenTree/models.py:62 templates/attachment_table.html:16
+msgid "Comment"
+msgstr ""
+
 #: InvenTree/models.py:62
 msgid "File comment"
 msgstr ""
 
-#: InvenTree/models.py:68
+#: InvenTree/models.py:68 InvenTree/models.py:69
 #: report/templates/report/inventree_test_report_base.html:91
 #: templates/js/stock.js:960
 msgid "User"
 msgstr ""
 
-#: InvenTree/models.py:106 label/models.py:101 part/models.py:685
-#: part/templates/part/params.html:27 report/models.py:179
+#: InvenTree/models.py:72
+msgid "upload date"
+msgstr ""
+
+#: InvenTree/models.py:107 InvenTree/models.py:108 label/models.py:101
+#: part/models.py:686 part/templates/part/params.html:27 report/models.py:179
+#: templates/InvenTree/search.html:136 templates/InvenTree/search.html:273
 #: templates/js/part.js:109
 msgid "Name"
 msgstr ""
 
-#: InvenTree/models.py:112
+#: InvenTree/models.py:114 build/models.py:134
+#: build/templates/build/detail.html:21 company/models.py:359
+#: company/templates/company/detail.html:26
+#: company/templates/company/supplier_part_base.html:70
+#: company/templates/company/supplier_part_detail.html:31 label/models.py:108
+#: order/templates/order/purchase_order_detail.html:168 part/models.py:710
+#: part/templates/part/detail.html:54 part/templates/part/set_category.html:14
+#: report/models.py:192
+#: report/templates/report/inventree_build_order_base.html:118
+#: templates/InvenTree/search.html:143 templates/InvenTree/search.html:208
+#: templates/InvenTree/search.html:280
+#: templates/InvenTree/settings/header.html:9 templates/js/bom.js:190
+#: templates/js/build.js:677 templates/js/build.js:944
+#: templates/js/company.js:56 templates/js/order.js:183
+#: templates/js/order.js:280 templates/js/part.js:168 templates/js/part.js:251
+#: templates/js/part.js:370 templates/js/part.js:566 templates/js/stock.js:552
+#: templates/js/stock.js:934
+msgid "Description"
+msgstr ""
+
+#: InvenTree/models.py:115
 msgid "Description (optional)"
 msgstr ""
 
-#: InvenTree/settings.py:445
+#: InvenTree/models.py:123
+msgid "parent"
+msgstr ""
+
+#: InvenTree/settings.py:430
 msgid "English"
 msgstr ""
 
-#: InvenTree/settings.py:446
+#: InvenTree/settings.py:431
 msgid "French"
 msgstr ""
 
-#: InvenTree/settings.py:447
+#: InvenTree/settings.py:432
 msgid "German"
 msgstr ""
 
-#: InvenTree/settings.py:448
+#: InvenTree/settings.py:433
 msgid "Polish"
 msgstr ""
 
-#: InvenTree/settings.py:449
+#: InvenTree/settings.py:434
 msgid "Turkish"
 msgstr ""
 
@@ -306,25 +343,34 @@ msgstr ""
 msgid "Order target date"
 msgstr ""
 
-#: build/forms.py:39 build/models.py:224
+#: build/forms.py:39 build/templates/build/build_base.html:104
+#: build/templates/build/detail.html:121
+#: order/templates/order/order_base.html:124
+#: order/templates/order/sales_order_base.html:117
+#: report/templates/report/inventree_build_order_base.html:126
+#: templates/js/build.js:723 templates/js/order.js:200
+#: templates/js/order.js:298
+msgid "Target Date"
+msgstr ""
+
+#: build/forms.py:40 build/models.py:224
 msgid ""
 "Target date for build completion. Build will be overdue after this date."
 msgstr ""
 
-#: build/forms.py:44
-msgid "Number of items to build"
-msgstr ""
-
-#: build/forms.py:85 build/templates/build/auto_allocate.html:17
+#: build/forms.py:45 build/forms.py:87
+#: build/templates/build/auto_allocate.html:17
 #: build/templates/build/build_base.html:91
 #: build/templates/build/detail.html:31 common/models.py:696
-#: company/forms.py:130 company/templates/company/supplier_part_pricing.html:77
-#: order/templates/order/order_wizard/select_parts.html:32
+#: company/forms.py:131 company/templates/company/supplier_part_pricing.html:77
+#: order/forms.py:237 order/templates/order/order_wizard/select_parts.html:32
 #: order/templates/order/purchase_order_detail.html:193
 #: order/templates/order/sales_order_detail.html:77
 #: order/templates/order/sales_order_detail.html:159
 #: part/templates/part/allocation.html:19
 #: part/templates/part/allocation.html:53
+#: part/templates/part/part_pricing.html:12
+#: part/templates/part/part_pricing.html:19
 #: part/templates/part/sale_prices.html:85
 #: report/templates/report/inventree_build_order_base.html:114
 #: report/templates/report/inventree_po_report.html:91
@@ -339,55 +385,59 @@ msgstr ""
 msgid "Quantity"
 msgstr ""
 
-#: build/forms.py:86
+#: build/forms.py:46
+msgid "Number of items to build"
+msgstr ""
+
+#: build/forms.py:88
 msgid "Enter quantity for build output"
 msgstr ""
 
-#: build/forms.py:90 stock/forms.py:117
-msgid "Serial numbers"
+#: build/forms.py:92 order/forms.py:231 stock/forms.py:117
+msgid "Serial Numbers"
 msgstr ""
 
-#: build/forms.py:92
+#: build/forms.py:94
 msgid "Enter serial numbers for build outputs"
 msgstr ""
 
-#: build/forms.py:98
+#: build/forms.py:100
 msgid "Confirm creation of build output"
 msgstr ""
 
-#: build/forms.py:118
+#: build/forms.py:120
 msgid "Confirm deletion of build output"
 msgstr ""
 
-#: build/forms.py:139
+#: build/forms.py:141
 msgid "Confirm unallocation of stock"
 msgstr ""
 
-#: build/forms.py:163
+#: build/forms.py:165
 msgid "Confirm stock allocation"
 msgstr ""
 
-#: build/forms.py:186
+#: build/forms.py:188
 msgid "Mark build as complete"
 msgstr ""
 
-#: build/forms.py:210
+#: build/forms.py:212
 msgid "Location of completed parts"
 msgstr ""
 
-#: build/forms.py:215
+#: build/forms.py:217
 msgid "Confirm completion with incomplete stock allocation"
 msgstr ""
 
-#: build/forms.py:218
+#: build/forms.py:220
 msgid "Confirm build completion"
 msgstr ""
 
-#: build/forms.py:238 build/views.py:66
+#: build/forms.py:240 build/views.py:66
 msgid "Confirm build cancellation"
 msgstr ""
 
-#: build/forms.py:252
+#: build/forms.py:254
 msgid "Select quantity of stock to allocate"
 msgstr ""
 
@@ -404,7 +454,7 @@ msgstr ""
 #: order/templates/order/so_navbar.html:22 part/templates/part/navbar.html:55
 #: part/templates/part/navbar.html:58 templates/InvenTree/index.html:181
 #: templates/InvenTree/search.html:169
-#: templates/InvenTree/settings/tabs.html:31 users/models.py:36
+#: templates/InvenTree/settings/tabs.html:31 users/models.py:41
 msgid "Build Orders"
 msgstr ""
 
@@ -419,24 +469,6 @@ msgstr ""
 msgid "Reference"
 msgstr ""
 
-#: build/models.py:134 build/templates/build/detail.html:21
-#: company/models.py:359 company/templates/company/detail.html:26
-#: company/templates/company/supplier_part_base.html:70
-#: company/templates/company/supplier_part_detail.html:31 label/models.py:108
-#: order/templates/order/purchase_order_detail.html:168 part/models.py:709
-#: part/templates/part/detail.html:54 part/templates/part/set_category.html:14
-#: report/models.py:192
-#: report/templates/report/inventree_build_order_base.html:118
-#: templates/InvenTree/search.html:208
-#: templates/InvenTree/settings/header.html:9 templates/js/bom.js:190
-#: templates/js/build.js:677 templates/js/build.js:944
-#: templates/js/company.js:56 templates/js/order.js:183
-#: templates/js/order.js:280 templates/js/part.js:168 templates/js/part.js:251
-#: templates/js/part.js:370 templates/js/part.js:566 templates/js/stock.js:552
-#: templates/js/stock.js:934
-msgid "Description"
-msgstr ""
-
 #: build/models.py:137
 msgid "Brief description of the build"
 msgstr ""
@@ -455,8 +487,9 @@ msgstr ""
 #: build/templates/build/detail.html:26 order/models.py:662
 #: order/templates/order/order_wizard/select_parts.html:30
 #: order/templates/order/purchase_order_detail.html:156
-#: order/templates/order/receive_parts.html:19 part/models.py:320
-#: part/templates/part/part_app_base.html:7 part/templates/part/related.html:29
+#: order/templates/order/receive_parts.html:19 part/models.py:321
+#: part/models.py:2054 part/templates/part/part_app_base.html:7
+#: part/templates/part/part_pricing.html:15 part/templates/part/related.html:29
 #: part/templates/part/set_category.html:13
 #: part/templates/part/subcategories.html:17
 #: report/templates/report/inventree_build_order_base.html:110
@@ -537,15 +570,35 @@ msgstr ""
 msgid "Target completion date"
 msgstr ""
 
-#: build/models.py:240
+#: build/models.py:227 order/models.py:215
+msgid "Completion Date"
+msgstr ""
+
+#: build/models.py:233
+msgid "completed by"
+msgstr ""
+
+#: build/models.py:241
+msgid "Issued by"
+msgstr ""
+
+#: build/models.py:242
 msgid "User who issued this build order"
 msgstr ""
 
-#: build/models.py:248
+#: build/models.py:250 build/templates/build/build_base.html:142
+#: build/templates/build/detail.html:105 order/models.py:118
+#: order/templates/order/order_base.html:138
+#: order/templates/order/sales_order_base.html:138 part/models.py:885
+#: report/templates/report/inventree_build_order_base.html:159
+msgid "Responsible"
+msgstr ""
+
+#: build/models.py:251
 msgid "User responsible for this build order"
 msgstr ""
 
-#: build/models.py:253 build/templates/build/detail.html:91
+#: build/models.py:256 build/templates/build/detail.html:91
 #: company/templates/company/supplier_part_base.html:77
 #: company/templates/company/supplier_part_detail.html:28
 #: part/templates/part/detail.html:83 part/templates/part/part_base.html:100
@@ -553,90 +606,90 @@ msgstr ""
 msgid "External Link"
 msgstr ""
 
-#: build/models.py:254 part/models.py:743 stock/models.py:425
+#: build/models.py:257 part/models.py:744 stock/models.py:425
 msgid "Link to external URL"
 msgstr ""
 
-#: build/models.py:258 build/templates/build/navbar.html:59
+#: build/models.py:261 build/templates/build/navbar.html:59
 #: company/models.py:366 company/templates/company/navbar.html:59
 #: company/templates/company/navbar.html:62
 #: order/templates/order/po_navbar.html:29
 #: order/templates/order/po_navbar.html:32
 #: order/templates/order/purchase_order_detail.html:227
 #: order/templates/order/so_navbar.html:33
-#: order/templates/order/so_navbar.html:36 part/models.py:869
+#: order/templates/order/so_navbar.html:36 part/models.py:870
 #: part/templates/part/navbar.html:122
 #: report/templates/report/inventree_build_order_base.html:173
 #: stock/forms.py:316 stock/forms.py:348 stock/forms.py:376 stock/models.py:495
-#: stock/models.py:1663 stock/templates/stock/navbar.html:57
-#: templates/js/barcode.js:37 templates/js/bom.js:329 templates/js/stock.js:128
-#: templates/js/stock.js:667
+#: stock/models.py:1553 stock/models.py:1663
+#: stock/templates/stock/navbar.html:57 templates/js/barcode.js:37
+#: templates/js/bom.js:329 templates/js/stock.js:128 templates/js/stock.js:667
 msgid "Notes"
 msgstr ""
 
-#: build/models.py:259
+#: build/models.py:262
 msgid "Extra build notes"
 msgstr ""
 
-#: build/models.py:670
+#: build/models.py:673
 msgid "No build output specified"
 msgstr ""
 
-#: build/models.py:673
+#: build/models.py:676
 msgid "Build output is already completed"
 msgstr ""
 
-#: build/models.py:676
+#: build/models.py:679
 msgid "Build output does not match Build Order"
 msgstr ""
 
-#: build/models.py:751
+#: build/models.py:754
 msgid "Completed build output"
 msgstr ""
 
-#: build/models.py:993
+#: build/models.py:996
 msgid "BuildItem must be unique for build, stock_item and install_into"
 msgstr ""
 
-#: build/models.py:1015
+#: build/models.py:1018
 msgid "Build item must specify a build output"
 msgstr ""
 
-#: build/models.py:1020
+#: build/models.py:1023
 #, python-brace-format
 msgid "Selected stock item not found in BOM for part '{p}'"
 msgstr ""
 
-#: build/models.py:1024
+#: build/models.py:1027
 #, python-brace-format
 msgid "Allocated quantity ({n}) must not exceed available quantity ({q})"
 msgstr ""
 
-#: build/models.py:1031 order/models.py:746
+#: build/models.py:1034 order/models.py:751
 msgid "StockItem is over-allocated"
 msgstr ""
 
-#: build/models.py:1035 order/models.py:749
+#: build/models.py:1038 order/models.py:754
 msgid "Allocation quantity must be greater than zero"
 msgstr ""
 
-#: build/models.py:1039
+#: build/models.py:1042
 msgid "Quantity must be 1 for serialized stock"
 msgstr ""
 
-#: build/models.py:1079
+#: build/models.py:1082
 msgid "Build to allocate parts"
 msgstr ""
 
-#: build/models.py:1086
+#: build/models.py:1089
 msgid "Source stock item"
 msgstr ""
 
-#: build/models.py:1098
+#: build/models.py:1101
 msgid "Stock quantity to allocate to build"
 msgstr ""
 
-#: build/models.py:1106
+#: build/models.py:1109
 msgid "Destination stock item"
 msgstr ""
 
@@ -661,7 +714,7 @@ msgid "Order required parts"
 msgstr ""
 
 #: build/templates/build/allocate.html:31
-#: company/templates/company/detail_part.html:31 order/views.py:791
+#: company/templates/company/detail_part.html:31 order/views.py:794
 #: part/templates/part/category.html:127
 msgid "Order Parts"
 msgstr ""
@@ -768,10 +821,12 @@ msgid "Edit Build"
 msgstr ""
 
 #: build/templates/build/build_base.html:68
+#: build/templates/build/build_base.html:176
 msgid "Complete Build"
 msgstr ""
 
-#: build/templates/build/build_base.html:69 build/views.py:57
+#: build/templates/build/build_base.html:69
+#: build/templates/build/build_base.html:167 build/views.py:57
 msgid "Cancel Build"
 msgstr ""
 
@@ -790,16 +845,6 @@ msgstr ""
 msgid "Status"
 msgstr ""
 
-#: build/templates/build/build_base.html:104
-#: build/templates/build/detail.html:121
-#: order/templates/order/order_base.html:124
-#: order/templates/order/sales_order_base.html:117
-#: report/templates/report/inventree_build_order_base.html:126
-#: templates/js/build.js:723 templates/js/order.js:200
-#: templates/js/order.js:298
-msgid "Target Date"
-msgstr ""
-
 #: build/templates/build/build_base.html:108
 msgid "This build was due on"
 msgstr ""
@@ -827,14 +872,6 @@ msgstr ""
 msgid "Issued By"
 msgstr ""
 
-#: build/templates/build/build_base.html:142
-#: build/templates/build/detail.html:105 order/models.py:118
-#: order/templates/order/order_base.html:138
-#: order/templates/order/sales_order_base.html:138
-#: report/templates/report/inventree_build_order_base.html:159
-msgid "Responsible"
-msgstr ""
-
 #: build/templates/build/build_children.html:10
 #: build/templates/build/navbar.html:42
 msgid "Child Build Orders"
@@ -1019,18 +1056,19 @@ msgstr ""
 msgid "Build Notes"
 msgstr ""
 
-#: build/templates/build/notes.html:23 company/templates/company/notes.html:21
-#: order/templates/order/order_notes.html:24
-#: order/templates/order/sales_order_notes.html:26
-#: part/templates/part/notes.html:25 stock/templates/stock/item_notes.html:23
-msgid "Save"
+#: build/templates/build/notes.html:14 company/templates/company/notes.html:13
+#: order/templates/order/order_notes.html:15
+#: order/templates/order/sales_order_notes.html:16
+#: part/templates/part/notes.html:14 stock/templates/stock/item_notes.html:15
+msgid "Edit notes"
 msgstr ""
 
-#: build/templates/build/notes.html:30 company/templates/company/notes.html:29
-#: order/templates/order/order_notes.html:31
-#: order/templates/order/sales_order_notes.html:32
-#: part/templates/part/notes.html:33 stock/templates/stock/item_notes.html:29
-msgid "Edit notes"
+#: build/templates/build/notes.html:26 company/templates/company/notes.html:24
+#: order/templates/order/order_notes.html:27
+#: order/templates/order/sales_order_notes.html:29
+#: part/templates/part/notes.html:27 stock/templates/stock/item_base.html:454
+#: stock/templates/stock/item_notes.html:26
+msgid "Save"
 msgstr ""
 
 #: build/templates/build/unallocate.html:10
@@ -1170,24 +1208,24 @@ msgstr ""
 msgid "Add Build Order Attachment"
 msgstr ""
 
-#: build/views.py:1062 order/views.py:107 order/views.py:159 part/views.py:172
+#: build/views.py:1062 order/views.py:110 order/views.py:162 part/views.py:172
 #: stock/views.py:277
 msgid "Added attachment"
 msgstr ""
 
-#: build/views.py:1098 order/views.py:186 order/views.py:207
+#: build/views.py:1098 order/views.py:189 order/views.py:210
 msgid "Edit Attachment"
 msgstr ""
 
-#: build/views.py:1108 order/views.py:190 order/views.py:211
+#: build/views.py:1108 order/views.py:193 order/views.py:214
 msgid "Attachment updated"
 msgstr ""
 
-#: build/views.py:1118 order/views.py:226 order/views.py:240
+#: build/views.py:1118 order/views.py:229 order/views.py:243
 msgid "Delete Attachment"
 msgstr ""
 
-#: build/views.py:1123 order/views.py:232 order/views.py:246 stock/views.py:333
+#: build/views.py:1123 order/views.py:235 order/views.py:249 stock/views.py:333
 msgid "Deleted attachment"
 msgstr ""
 
@@ -1303,7 +1341,7 @@ msgstr ""
 msgid "Number of recent parts to display on index page"
 msgstr ""
 
-#: common/models.py:150 part/templates/part/detail.html:160
+#: common/models.py:150 part/models.py:2056 part/templates/part/detail.html:160
 #: report/models.py:185 stock/forms.py:258 templates/js/table_filters.js:24
 #: templates/js/table_filters.js:288
 msgid "Template"
@@ -1313,7 +1351,7 @@ msgstr ""
 msgid "Parts are templates by default"
 msgstr ""
 
-#: common/models.py:157 part/models.py:832 part/templates/part/detail.html:170
+#: common/models.py:157 part/models.py:833 part/templates/part/detail.html:170
 #: templates/js/table_filters.js:101 templates/js/table_filters.js:300
 msgid "Assembly"
 msgstr ""
@@ -1322,7 +1360,7 @@ msgstr ""
 msgid "Parts can be assembled from other components by default"
 msgstr ""
 
-#: common/models.py:164 part/models.py:838 part/templates/part/detail.html:180
+#: common/models.py:164 part/models.py:839 part/templates/part/detail.html:180
 #: templates/js/table_filters.js:304
 msgid "Component"
 msgstr ""
@@ -1331,7 +1369,7 @@ msgstr ""
 msgid "Parts can be used as sub-components by default"
 msgstr ""
 
-#: common/models.py:171 part/models.py:849 part/templates/part/detail.html:200
+#: common/models.py:171 part/models.py:850 part/templates/part/detail.html:200
 msgid "Purchaseable"
 msgstr ""
 
@@ -1339,7 +1377,7 @@ msgstr ""
 msgid "Parts are purchaseable by default"
 msgstr ""
 
-#: common/models.py:178 part/models.py:854 part/templates/part/detail.html:210
+#: common/models.py:178 part/models.py:855 part/templates/part/detail.html:210
 #: templates/js/table_filters.js:312
 msgid "Salable"
 msgstr ""
@@ -1348,7 +1386,7 @@ msgstr ""
 msgid "Parts are salable by default"
 msgstr ""
 
-#: common/models.py:185 part/models.py:844 part/templates/part/detail.html:190
+#: common/models.py:185 part/models.py:845 part/templates/part/detail.html:190
 #: templates/js/table_filters.js:32 templates/js/table_filters.js:316
 msgid "Trackable"
 msgstr ""
@@ -1357,7 +1395,7 @@ msgstr ""
 msgid "Parts are trackable by default"
 msgstr ""
 
-#: common/models.py:192 part/models.py:864 part/templates/part/detail.html:150
+#: common/models.py:192 part/models.py:865 part/templates/part/detail.html:150
 #: templates/js/table_filters.js:28
 msgid "Virtual"
 msgstr ""
@@ -1514,7 +1552,7 @@ msgstr ""
 msgid "Key string must be unique"
 msgstr ""
 
-#: common/models.py:697 company/forms.py:131
+#: common/models.py:697 company/forms.py:132
 msgid "Price break quantity"
 msgstr ""
 
@@ -1547,23 +1585,28 @@ msgstr ""
 msgid "Supplied value must be a boolean"
 msgstr ""
 
-#: company/forms.py:37 company/models.py:139
+#: company/forms.py:37 company/models.py:137
+#: company/templates/company/detail.html:40
+msgid "Currency"
+msgstr ""
+
+#: company/forms.py:38 company/models.py:139
 msgid "Default currency used for this company"
 msgstr ""
 
-#: company/forms.py:75 part/forms.py:46
+#: company/forms.py:76 part/forms.py:46
 msgid "URL"
 msgstr ""
 
-#: company/forms.py:76 part/forms.py:47
+#: company/forms.py:77 part/forms.py:47
 msgid "Image URL"
 msgstr ""
 
-#: company/forms.py:98
+#: company/forms.py:99
 msgid "Single Price"
 msgstr ""
 
-#: company/forms.py:100
+#: company/forms.py:101
 msgid "Single quantity price"
 msgstr ""
 
@@ -1620,20 +1663,28 @@ msgstr ""
 msgid "Link to external company information"
 msgstr ""
 
+#: company/models.py:129
+msgid "is customer"
+msgstr ""
+
 #: company/models.py:129
 msgid "Do you sell items to this company?"
 msgstr ""
 
+#: company/models.py:131
+msgid "is supplier"
+msgstr ""
+
 #: company/models.py:131
 msgid "Do you purchase items from this company?"
 msgstr ""
 
 #: company/models.py:133
-msgid "Does this company manufacture parts?"
+msgid "is manufacturer"
 msgstr ""
 
-#: company/models.py:137 company/templates/company/detail.html:40
-msgid "Currency"
+#: company/models.py:133
+msgid "Does this company manufacture parts?"
 msgstr ""
 
 #: company/models.py:313 stock/models.py:370
@@ -1641,7 +1692,7 @@ msgstr ""
 msgid "Base Part"
 msgstr ""
 
-#: company/models.py:317
+#: company/models.py:317 order/views.py:1372
 msgid "Select part"
 msgstr ""
 
@@ -1691,9 +1742,9 @@ msgstr ""
 msgid "Manufacturer part number"
 msgstr ""
 
-#: company/models.py:353 part/models.py:742
+#: company/models.py:353 part/models.py:743
 #: report/templates/report/inventree_build_order_base.html:165
-#: templates/js/company.js:208 templates/js/part.js:430
+#: stock/models.py:1555 templates/js/company.js:208 templates/js/part.js:430
 msgid "Link"
 msgstr ""
 
@@ -1716,10 +1767,20 @@ msgstr ""
 msgid "Minimum charge (e.g. stocking fee)"
 msgstr ""
 
+#: company/models.py:371 company/templates/company/supplier_part_base.html:106
+#: stock/models.py:394 stock/templates/stock/item_base.html:295
+#: templates/js/stock.js:663
+msgid "Packaging"
+msgstr ""
+
 #: company/models.py:371
 msgid "Part packaging"
 msgstr ""
 
+#: company/models.py:373
+msgid "multiple"
+msgstr ""
+
 #: company/templates/company/assigned_stock.html:10
 #: company/templates/company/navbar.html:51
 #: company/templates/company/navbar.html:54 templates/js/build.js:411
@@ -1742,6 +1803,18 @@ msgstr ""
 msgid "Download image from URL"
 msgstr ""
 
+#: company/templates/company/company_base.html:46 order/views.py:306
+msgid "Create Purchase Order"
+msgstr ""
+
+#: company/templates/company/company_base.html:51
+msgid "Edit company information"
+msgstr ""
+
+#: company/templates/company/company_base.html:56 company/views.py:324
+msgid "Delete Company"
+msgstr ""
+
 #: company/templates/company/company_base.html:64
 #: company/templates/company/detail.html:10
 #: company/templates/company/navbar.html:12
@@ -1842,7 +1915,7 @@ msgstr ""
 #: company/templates/company/detail_stock.html:37
 #: company/templates/company/supplier_part_stock.html:34
 #: part/templates/part/category.html:114 part/templates/part/category.html:128
-#: part/templates/part/stock.html:54
+#: part/templates/part/stock.html:54 stock/templates/stock/location.html:163
 msgid "Export"
 msgstr ""
 
@@ -1855,21 +1928,21 @@ msgid "Supplied Parts"
 msgstr ""
 
 #: company/templates/company/navbar.html:23
-#: order/templates/order/receive_parts.html:14 part/models.py:321
+#: order/templates/order/receive_parts.html:14 part/models.py:322
 #: part/templates/part/cat_link.html:7 part/templates/part/category.html:95
 #: part/templates/part/category_navbar.html:11
 #: part/templates/part/category_navbar.html:14
 #: part/templates/part/category_partlist.html:10
 #: templates/InvenTree/index.html:96 templates/InvenTree/search.html:113
 #: templates/InvenTree/settings/tabs.html:25 templates/navbar.html:23
-#: templates/stats.html:35 templates/stats.html:44 users/models.py:33
+#: templates/stats.html:35 templates/stats.html:44 users/models.py:38
 msgid "Parts"
 msgstr ""
 
 #: company/templates/company/navbar.html:27 part/templates/part/navbar.html:33
 #: stock/templates/stock/location.html:100
 #: stock/templates/stock/location.html:115 templates/InvenTree/search.html:182
-#: templates/stats.html:48 templates/stats.html:57 users/models.py:35
+#: templates/stats.html:48 templates/stats.html:57 users/models.py:40
 msgid "Stock Items"
 msgstr ""
 
@@ -1895,7 +1968,7 @@ msgstr ""
 #: part/templates/part/sales_orders.html:10 templates/InvenTree/index.html:226
 #: templates/InvenTree/search.html:330
 #: templates/InvenTree/settings/tabs.html:37 templates/navbar.html:46
-#: users/models.py:38
+#: users/models.py:43
 msgid "Sales Orders"
 msgstr ""
 
@@ -1907,7 +1980,7 @@ msgstr ""
 #: part/templates/part/orders.html:10 templates/InvenTree/index.html:203
 #: templates/InvenTree/search.html:300
 #: templates/InvenTree/settings/tabs.html:34 templates/navbar.html:37
-#: users/models.py:37
+#: users/models.py:42
 msgid "Purchase Orders"
 msgstr ""
 
@@ -1968,6 +2041,7 @@ msgid "Supplier Part"
 msgstr ""
 
 #: company/templates/company/supplier_part_base.html:35
+#: company/templates/company/supplier_part_orders.html:17
 #: part/templates/part/orders.html:17 part/templates/part/part_base.html:64
 msgid "Order part"
 msgstr ""
@@ -1990,11 +2064,6 @@ msgstr ""
 msgid "Internal Part"
 msgstr ""
 
-#: company/templates/company/supplier_part_base.html:106 stock/models.py:394
-#: stock/templates/stock/item_base.html:295 templates/js/stock.js:663
-msgid "Packaging"
-msgstr ""
-
 #: company/templates/company/supplier_part_orders.html:18
 #: part/templates/part/orders.html:18
 msgid "Order Part"
@@ -2092,10 +2161,6 @@ msgstr ""
 msgid "Created new company"
 msgstr ""
 
-#: company/views.py:324
-msgid "Delete Company"
-msgstr ""
-
 #: company/views.py:330
 msgid "Company was deleted"
 msgstr ""
@@ -2173,44 +2238,52 @@ msgstr ""
 msgid "Filters"
 msgstr ""
 
-#: order/forms.py:25 order/templates/order/order_base.html:47
+#: order/forms.py:27 order/templates/order/order_base.html:47
 msgid "Place order"
 msgstr ""
 
-#: order/forms.py:36 order/templates/order/order_base.html:54
+#: order/forms.py:38 order/templates/order/order_base.html:54
 msgid "Mark order as complete"
 msgstr ""
 
-#: order/forms.py:47 order/forms.py:58 order/templates/order/order_base.html:59
+#: order/forms.py:49 order/forms.py:60 order/templates/order/order_base.html:59
 #: order/templates/order/sales_order_base.html:59
 msgid "Cancel order"
 msgstr ""
 
-#: order/forms.py:69 order/templates/order/sales_order_base.html:56
+#: order/forms.py:71 order/templates/order/sales_order_base.html:56
 msgid "Ship order"
 msgstr ""
 
-#: order/forms.py:80
+#: order/forms.py:82
 msgid "Receive parts to this location"
 msgstr ""
 
-#: order/forms.py:101
+#: order/forms.py:103
 msgid "Purchase Order reference"
 msgstr ""
 
-#: order/forms.py:107
+#: order/forms.py:109
 msgid "Target date for order delivery. Order will be overdue after this date."
 msgstr ""
 
-#: order/forms.py:135
+#: order/forms.py:137
 msgid "Enter sales order number"
 msgstr ""
 
-#: order/forms.py:141 order/models.py:448
+#: order/forms.py:143 order/models.py:448
 msgid ""
 "Target date for order completion. Order will be overdue after this date."
 msgstr ""
 
+#: order/forms.py:233
+msgid "Enter stock item serial numbers"
+msgstr ""
+
+#: order/forms.py:239
+msgid "Enter quantity of stock items"
+msgstr ""
+
 #: order/models.py:99
 msgid "Order reference"
 msgstr ""
@@ -2260,10 +2333,6 @@ msgid ""
 "Expected date for order delivery. Order will be overdue after this date."
 msgstr ""
 
-#: order/models.py:215
-msgid "Completion Date"
-msgstr ""
-
 #: order/models.py:216
 msgid "Date order was completed"
 msgstr ""
@@ -2333,27 +2402,31 @@ msgstr ""
 msgid "Unit purchase price"
 msgstr ""
 
-#: order/models.py:737
-msgid "Cannot allocate stock item to a line with a different part"
-msgstr ""
-
-#: order/models.py:739
-msgid "Cannot allocate stock to a line without a part"
+#: order/models.py:736 order/models.py:738
+msgid "Stock item has not been assigned"
 msgstr ""
 
 #: order/models.py:742
+msgid "Cannot allocate stock item to a line with a different part"
+msgstr ""
+
+#: order/models.py:744
+msgid "Cannot allocate stock to a line without a part"
+msgstr ""
+
+#: order/models.py:747
 msgid "Allocation quantity cannot exceed stock quantity"
 msgstr ""
 
-#: order/models.py:752
+#: order/models.py:757
 msgid "Quantity must be 1 for serialized stock item"
 msgstr ""
 
-#: order/models.py:768
+#: order/models.py:773
 msgid "Select stock item to allocate"
 msgstr ""
 
-#: order/models.py:771
+#: order/models.py:776
 msgid "Enter stock allocation quantity"
 msgstr ""
 
@@ -2369,6 +2442,7 @@ msgid "Print"
 msgstr ""
 
 #: order/templates/order/order_base.html:43
+#: order/templates/order/sales_order_base.html:52
 msgid "Edit order information"
 msgstr ""
 
@@ -2440,6 +2514,11 @@ msgstr ""
 msgid "Select a supplier for"
 msgstr ""
 
+#: order/templates/order/order_wizard/select_parts.html:69
+#: part/templates/part/set_category.html:32
+msgid "Remove part"
+msgstr ""
+
 #: order/templates/order/order_wizard/select_pos.html:8
 msgid "Step 2 of 2 - Select Purchase Orders"
 msgstr ""
@@ -2457,6 +2536,10 @@ msgstr ""
 msgid "Select Purchase Order"
 msgstr ""
 
+#: order/templates/order/order_wizard/select_pos.html:45
+msgid "Create new purchase order for {{ supplier.name }}"
+msgstr ""
+
 #: order/templates/order/order_wizard/select_pos.html:68
 msgid "Select a purchase order for"
 msgstr ""
@@ -2480,15 +2563,16 @@ msgid "Purchase Order Items"
 msgstr ""
 
 #: order/templates/order/purchase_order_detail.html:24
-#: order/templates/order/sales_order_detail.html:22 order/views.py:1105
-#: order/views.py:1188
+#: order/templates/order/sales_order_detail.html:22 order/views.py:1108
+#: order/views.py:1191
 msgid "Add Line Item"
 msgstr ""
 
 #: order/templates/order/purchase_order_detail.html:45
 #: order/templates/order/purchase_order_detail.html:125
 #: part/templates/part/category.html:197 part/templates/part/category.html:239
-#: templates/js/stock.js:704 templates/js/stock.js:1088
+#: stock/templates/stock/location.html:191 templates/js/stock.js:704
+#: templates/js/stock.js:1088
 msgid "New Location"
 msgstr ""
 
@@ -2507,7 +2591,7 @@ msgid "Unit Price"
 msgstr ""
 
 #: order/templates/order/purchase_order_detail.html:239
-#: order/templates/order/sales_order_detail.html:289
+#: order/templates/order/sales_order_detail.html:294
 msgid "Edit line item"
 msgstr ""
 
@@ -2549,6 +2633,10 @@ msgstr ""
 msgid "Error: Referenced part has been removed"
 msgstr ""
 
+#: order/templates/order/receive_parts.html:57
+msgid "Remove line"
+msgstr ""
+
 #: order/templates/order/sales_order_base.html:15
 msgid "This SalesOrder has not been fully allocated"
 msgstr ""
@@ -2595,8 +2683,8 @@ msgstr ""
 msgid "Delete stock allocation"
 msgstr ""
 
-#: order/templates/order/sales_order_detail.html:229 templates/js/build.js:523
-#: templates/js/build.js:785
+#: order/templates/order/sales_order_detail.html:229 order/views.py:1351
+#: templates/js/build.js:523 templates/js/build.js:785
 msgid "Allocated"
 msgstr ""
 
@@ -2605,18 +2693,23 @@ msgid "Fulfilled"
 msgstr ""
 
 #: order/templates/order/sales_order_detail.html:279
-msgid "Buy parts"
+msgid "Allocate serial numbers"
 msgstr ""
 
-#: order/templates/order/sales_order_detail.html:283
-msgid "Build parts"
+#: order/templates/order/sales_order_detail.html:282 templates/js/build.js:585
+msgid "Allocate stock"
 msgstr ""
 
-#: order/templates/order/sales_order_detail.html:286
-msgid "Allocate parts"
+#: order/templates/order/sales_order_detail.html:285
+msgid "Purchase stock"
 msgstr ""
 
-#: order/templates/order/sales_order_detail.html:290
+#: order/templates/order/sales_order_detail.html:289 templates/js/build.js:578
+#: templates/js/build.js:992
+msgid "Build stock"
+msgstr ""
+
+#: order/templates/order/sales_order_detail.html:295
 msgid "Delete line item "
 msgstr ""
 
@@ -2646,6 +2739,10 @@ msgstr ""
 msgid "Shipping this order means that the order will no longer be editable."
 msgstr ""
 
+#: order/templates/order/so_allocate_by_serial.html:9
+msgid "Allocate stock items by serial number"
+msgstr ""
+
 #: order/templates/order/so_allocation_delete.html:7
 msgid "This action will unallocate the following stock from the Sales Order"
 msgstr ""
@@ -2659,140 +2756,160 @@ msgstr ""
 msgid "Are you sure you wish to delete this line item?"
 msgstr ""
 
-#: order/views.py:96
+#: order/views.py:99
 msgid "Add Purchase Order Attachment"
 msgstr ""
 
-#: order/views.py:146
+#: order/views.py:149
 msgid "Add Sales Order Attachment"
 msgstr ""
 
-#: order/views.py:303
-msgid "Create Purchase Order"
-msgstr ""
-
-#: order/views.py:338
+#: order/views.py:341
 msgid "Create Sales Order"
 msgstr ""
 
-#: order/views.py:373
+#: order/views.py:376
 msgid "Edit Purchase Order"
 msgstr ""
 
-#: order/views.py:393
+#: order/views.py:396
 msgid "Edit Sales Order"
 msgstr ""
 
-#: order/views.py:409
+#: order/views.py:412
 msgid "Cancel Order"
 msgstr ""
 
-#: order/views.py:418 order/views.py:444
+#: order/views.py:421 order/views.py:447
 msgid "Confirm order cancellation"
 msgstr ""
 
-#: order/views.py:421 order/views.py:447
+#: order/views.py:424 order/views.py:450
 msgid "Order cannot be cancelled"
 msgstr ""
 
-#: order/views.py:435
+#: order/views.py:438
 msgid "Cancel sales order"
 msgstr ""
 
-#: order/views.py:461
+#: order/views.py:464
 msgid "Issue Order"
 msgstr ""
 
-#: order/views.py:470
+#: order/views.py:473
 msgid "Confirm order placement"
 msgstr ""
 
-#: order/views.py:480
+#: order/views.py:483
 msgid "Purchase order issued"
 msgstr ""
 
-#: order/views.py:491
+#: order/views.py:494
 msgid "Complete Order"
 msgstr ""
 
-#: order/views.py:507
+#: order/views.py:510
 msgid "Confirm order completion"
 msgstr ""
 
-#: order/views.py:518
+#: order/views.py:521
 msgid "Purchase order completed"
 msgstr ""
 
-#: order/views.py:528
+#: order/views.py:531
 msgid "Ship Order"
 msgstr ""
 
-#: order/views.py:544
+#: order/views.py:547
 msgid "Confirm order shipment"
 msgstr ""
 
-#: order/views.py:550
+#: order/views.py:553
 msgid "Could not ship order"
 msgstr ""
 
-#: order/views.py:604
+#: order/views.py:607
 msgid "Receive Parts"
 msgstr ""
 
-#: order/views.py:674
+#: order/views.py:677
 msgid "Items received"
 msgstr ""
 
-#: order/views.py:688
+#: order/views.py:691
 msgid "No destination set"
 msgstr ""
 
-#: order/views.py:733
+#: order/views.py:736
 msgid "Error converting quantity to number"
 msgstr ""
 
-#: order/views.py:739
+#: order/views.py:742
 msgid "Receive quantity less than zero"
 msgstr ""
 
-#: order/views.py:745
+#: order/views.py:748
 msgid "No lines specified"
 msgstr ""
 
-#: order/views.py:1114
+#: order/views.py:1117
 msgid "Supplier part must be specified"
 msgstr ""
 
-#: order/views.py:1120
+#: order/views.py:1123
 msgid "Supplier must match for Part and Order"
 msgstr ""
 
-#: order/views.py:1239 order/views.py:1257
+#: order/views.py:1242 order/views.py:1260
 msgid "Edit Line Item"
 msgstr ""
 
-#: order/views.py:1273 order/views.py:1285
+#: order/views.py:1276 order/views.py:1288
 msgid "Delete Line Item"
 msgstr ""
 
-#: order/views.py:1278 order/views.py:1290
+#: order/views.py:1281 order/views.py:1293
 msgid "Deleted line item"
 msgstr ""
 
-#: order/views.py:1299
+#: order/views.py:1306
+msgid "Allocate Serial Numbers"
+msgstr ""
+
+#: order/views.py:1351
+msgid "items"
+msgstr ""
+
+#: order/views.py:1367
+msgid "Select line item"
+msgstr ""
+
+#: order/views.py:1398
+msgid "No matching item for serial"
+msgstr ""
+
+#: order/views.py:1408
+msgid "is not in stock"
+msgstr ""
+
+#: order/views.py:1416
+msgid "already allocated to an order"
+msgstr ""
+
+#: order/views.py:1470
 msgid "Allocate Stock to Order"
 msgstr ""
 
-#: order/views.py:1373
+#: order/views.py:1544
 msgid "Edit Allocation Quantity"
 msgstr ""
 
-#: order/views.py:1388
+#: order/views.py:1559
 msgid "Remove allocation"
 msgstr ""
 
-#: part/bom.py:138 part/models.py:760 part/templates/part/category.html:62
-#: part/templates/part/detail.html:90
+#: part/bom.py:138 part/models.py:72 part/models.py:761
+#: part/templates/part/category.html:62 part/templates/part/detail.html:90
 msgid "Default Location"
 msgstr ""
 
@@ -2861,7 +2978,7 @@ msgstr ""
 msgid "Include part supplier data in exported BOM"
 msgstr ""
 
-#: part/forms.py:120 part/models.py:2053
+#: part/forms.py:120 part/models.py:2054
 msgid "Parent Part"
 msgstr ""
 
@@ -2933,323 +3050,352 @@ msgstr ""
 msgid "Input quantity for price calculation"
 msgstr ""
 
-#: part/models.py:72
+#: part/models.py:73
 msgid "Default location for parts in this category"
 msgstr ""
 
-#: part/models.py:75
+#: part/models.py:76
+msgid "Default keywords"
+msgstr ""
+
+#: part/models.py:76
 msgid "Default keywords for parts in this category"
 msgstr ""
 
-#: part/models.py:81 part/models.py:2098
+#: part/models.py:82 part/models.py:2099
 #: part/templates/part/part_app_base.html:9
 msgid "Part Category"
 msgstr ""
 
-#: part/models.py:82 part/templates/part/category.html:19
+#: part/models.py:83 part/templates/part/category.html:19
 #: part/templates/part/category.html:90 part/templates/part/category.html:141
 #: templates/InvenTree/search.html:126 templates/stats.html:39
-#: users/models.py:32
+#: users/models.py:37
 msgid "Part Categories"
 msgstr ""
 
-#: part/models.py:445 part/models.py:457
+#: part/models.py:446 part/models.py:458
 #, python-brace-format
 msgid "Part '{p1}' is  used in BOM for '{p2}' (recursive)"
 msgstr ""
 
-#: part/models.py:554
+#: part/models.py:555
 msgid "Next available serial numbers are"
 msgstr ""
 
-#: part/models.py:558
+#: part/models.py:559
 msgid "Next available serial number is"
 msgstr ""
 
-#: part/models.py:563
+#: part/models.py:564
 msgid "Most recent serial number is"
 msgstr ""
 
-#: part/models.py:642
+#: part/models.py:643
 msgid "Duplicate IPN not allowed in part settings"
 msgstr ""
 
-#: part/models.py:653
+#: part/models.py:654
 msgid "Part must be unique for name, IPN and revision"
 msgstr ""
 
-#: part/models.py:684 part/templates/part/detail.html:22
+#: part/models.py:685 part/templates/part/detail.html:22
 msgid "Part name"
 msgstr ""
 
-#: part/models.py:691
+#: part/models.py:692
 msgid "Is Template"
 msgstr ""
 
-#: part/models.py:692
+#: part/models.py:693
 msgid "Is this part a template part?"
 msgstr ""
 
-#: part/models.py:703
+#: part/models.py:704
 msgid "Is this part a variant of another part?"
 msgstr ""
 
-#: part/models.py:704 part/templates/part/detail.html:60
+#: part/models.py:705 part/templates/part/detail.html:60
 msgid "Variant Of"
 msgstr ""
 
-#: part/models.py:710
+#: part/models.py:711
 msgid "Part description"
 msgstr ""
 
-#: part/models.py:715 part/templates/part/category.html:69
+#: part/models.py:716 part/templates/part/category.html:69
 #: part/templates/part/detail.html:67
 msgid "Keywords"
 msgstr ""
 
-#: part/models.py:716
+#: part/models.py:717
 msgid "Part keywords to improve visibility in search results"
 msgstr ""
 
-#: part/models.py:723 part/templates/part/detail.html:73
+#: part/models.py:724 part/templates/part/detail.html:73
 #: part/templates/part/set_category.html:15 templates/js/part.js:384
 msgid "Category"
 msgstr ""
 
-#: part/models.py:724
+#: part/models.py:725
 msgid "Part category"
 msgstr ""
 
-#: part/models.py:729 part/templates/part/detail.html:28
+#: part/models.py:730 part/templates/part/detail.html:28
 #: part/templates/part/part_base.html:93 templates/js/part.js:160
 msgid "IPN"
 msgstr ""
 
-#: part/models.py:730
+#: part/models.py:731
 msgid "Internal Part Number"
 msgstr ""
 
-#: part/models.py:736
+#: part/models.py:737
 msgid "Part revision or version number"
 msgstr ""
 
-#: part/models.py:737 part/templates/part/detail.html:35 report/models.py:198
+#: part/models.py:738 part/templates/part/detail.html:35 report/models.py:198
 #: templates/js/part.js:164
 msgid "Revision"
 msgstr ""
 
-#: part/models.py:758
+#: part/models.py:759
 msgid "Where is this item normally stored?"
 msgstr ""
 
-#: part/models.py:805 part/templates/part/detail.html:97
+#: part/models.py:806 part/templates/part/detail.html:97
 msgid "Default Supplier"
 msgstr ""
 
-#: part/models.py:806
+#: part/models.py:807
 msgid "Default supplier part"
 msgstr ""
 
-#: part/models.py:813
+#: part/models.py:814
 msgid "Default Expiry"
 msgstr ""
 
-#: part/models.py:814
+#: part/models.py:815
 msgid "Expiry time (in days) for stock items of this part"
 msgstr ""
 
-#: part/models.py:819 part/templates/part/detail.html:113
+#: part/models.py:820 part/templates/part/detail.html:113
 msgid "Minimum Stock"
 msgstr ""
 
-#: part/models.py:820
+#: part/models.py:821
 msgid "Minimum allowed stock level"
 msgstr ""
 
-#: part/models.py:826 part/templates/part/detail.html:106
+#: part/models.py:827 part/templates/part/detail.html:106
 #: part/templates/part/params.html:29
 msgid "Units"
 msgstr ""
 
-#: part/models.py:827
+#: part/models.py:828
 msgid "Stock keeping units for this part"
 msgstr ""
 
-#: part/models.py:833
+#: part/models.py:834
 msgid "Can this part be built from other parts?"
 msgstr ""
 
-#: part/models.py:839
+#: part/models.py:840
 msgid "Can this part be used to build other parts?"
 msgstr ""
 
-#: part/models.py:845
+#: part/models.py:846
 msgid "Does this part have tracking for unique items?"
 msgstr ""
 
-#: part/models.py:850
+#: part/models.py:851
 msgid "Can this part be purchased from external suppliers?"
 msgstr ""
 
-#: part/models.py:855
+#: part/models.py:856
 msgid "Can this part be sold to customers?"
 msgstr ""
 
-#: part/models.py:859 part/templates/part/detail.html:227
+#: part/models.py:860 part/templates/part/detail.html:227
 #: templates/js/table_filters.js:20 templates/js/table_filters.js:60
 #: templates/js/table_filters.js:214 templates/js/table_filters.js:283
 msgid "Active"
 msgstr ""
 
-#: part/models.py:860
+#: part/models.py:861
 msgid "Is this part active?"
 msgstr ""
 
-#: part/models.py:865
+#: part/models.py:866
 msgid "Is this a virtual part, such as a software product or license?"
 msgstr ""
 
-#: part/models.py:870
+#: part/models.py:871
 msgid "Part notes - supports Markdown formatting"
 msgstr ""
 
-#: part/models.py:873
+#: part/models.py:874
+msgid "BOM checksum"
+msgstr ""
+
+#: part/models.py:874
 msgid "Stored BOM checksum"
 msgstr ""
 
-#: part/models.py:1926
+#: part/models.py:877
+msgid "BOM checked by"
+msgstr ""
+
+#: part/models.py:879
+msgid "BOM checked date"
+msgstr ""
+
+#: part/models.py:881 part/templates/part/detail.html:126
+#: templates/js/order.js:293
+msgid "Creation Date"
+msgstr ""
+
+#: part/models.py:883
+msgid "Creation User"
+msgstr ""
+
+#: part/models.py:1927
 msgid "Test templates can only be created for trackable parts"
 msgstr ""
 
-#: part/models.py:1943
+#: part/models.py:1944
 msgid "Test with this name already exists for this part"
 msgstr ""
 
-#: part/models.py:1962 templates/js/part.js:561 templates/js/stock.js:104
+#: part/models.py:1963 templates/js/part.js:561 templates/js/stock.js:104
 msgid "Test Name"
 msgstr ""
 
-#: part/models.py:1963
+#: part/models.py:1964
 msgid "Enter a name for the test"
 msgstr ""
 
-#: part/models.py:1968
+#: part/models.py:1969
 msgid "Test Description"
 msgstr ""
 
-#: part/models.py:1969
+#: part/models.py:1970
 msgid "Enter description for this test"
 msgstr ""
 
-#: part/models.py:1974 templates/js/part.js:570
+#: part/models.py:1975 templates/js/part.js:570
 #: templates/js/table_filters.js:200
 msgid "Required"
 msgstr ""
 
-#: part/models.py:1975
+#: part/models.py:1976
 msgid "Is this test required to pass?"
 msgstr ""
 
-#: part/models.py:1980 templates/js/part.js:578
+#: part/models.py:1981 templates/js/part.js:578
 msgid "Requires Value"
 msgstr ""
 
-#: part/models.py:1981
+#: part/models.py:1982
 msgid "Does this test require a value when adding a test result?"
 msgstr ""
 
-#: part/models.py:1986 templates/js/part.js:585
+#: part/models.py:1987 templates/js/part.js:585
 msgid "Requires Attachment"
 msgstr ""
 
-#: part/models.py:1987
+#: part/models.py:1988
 msgid "Does this test require a file attachment when adding a test result?"
 msgstr ""
 
-#: part/models.py:2020
+#: part/models.py:2021
 msgid "Parameter template name must be unique"
 msgstr ""
 
-#: part/models.py:2025
+#: part/models.py:2026
 msgid "Parameter Name"
 msgstr ""
 
-#: part/models.py:2027
+#: part/models.py:2028
 msgid "Parameter Units"
 msgstr ""
 
-#: part/models.py:2055 part/models.py:2103
+#: part/models.py:2056 part/models.py:2104
 #: templates/InvenTree/settings/category.html:62
 msgid "Parameter Template"
 msgstr ""
 
-#: part/models.py:2057
+#: part/models.py:2058
+msgid "Data"
+msgstr ""
+
+#: part/models.py:2058
 msgid "Parameter Value"
 msgstr ""
 
-#: part/models.py:2107
+#: part/models.py:2108
 msgid "Default Parameter Value"
 msgstr ""
 
-#: part/models.py:2135
+#: part/models.py:2136
 msgid "Select parent part"
 msgstr ""
 
-#: part/models.py:2143
+#: part/models.py:2144
 msgid "Select part to be used in BOM"
 msgstr ""
 
-#: part/models.py:2149
+#: part/models.py:2150
 msgid "BOM quantity for this BOM item"
 msgstr ""
 
-#: part/models.py:2151
+#: part/models.py:2152
 msgid "This BOM item is optional"
 msgstr ""
 
-#: part/models.py:2154
+#: part/models.py:2155
 msgid "Estimated build wastage quantity (absolute or percentage)"
 msgstr ""
 
-#: part/models.py:2157
+#: part/models.py:2158
 msgid "BOM item reference"
 msgstr ""
 
-#: part/models.py:2160
+#: part/models.py:2161
 msgid "BOM item notes"
 msgstr ""
 
-#: part/models.py:2162
+#: part/models.py:2163
 msgid "BOM line checksum"
 msgstr ""
 
-#: part/models.py:2166 templates/js/bom.js:275 templates/js/bom.js:282
+#: part/models.py:2167 templates/js/bom.js:275 templates/js/bom.js:282
 #: templates/js/table_filters.js:50
 msgid "Inherited"
 msgstr ""
 
-#: part/models.py:2167
+#: part/models.py:2168
 msgid "This BOM item is inherited by BOMs for variant parts"
 msgstr ""
 
-#: part/models.py:2243 part/views.py:1592 part/views.py:1644
+#: part/models.py:2244 part/views.py:1592 part/views.py:1644
 #: stock/models.py:259
 msgid "Quantity must be integer value for trackable parts"
 msgstr ""
 
-#: part/models.py:2252 part/models.py:2254
+#: part/models.py:2253 part/models.py:2255
 msgid "Sub part must be specified"
 msgstr ""
 
-#: part/models.py:2257
+#: part/models.py:2258
 msgid "BOM Item"
 msgstr ""
 
-#: part/models.py:2378
+#: part/models.py:2379
 msgid "Select Related Part"
 msgstr ""
 
-#: part/models.py:2410
+#: part/models.py:2411
 msgid ""
 "Error creating relationship: check that the part is not related to itself "
 "and that the relationship is unique"
@@ -3368,6 +3514,10 @@ msgstr ""
 msgid "File Fields"
 msgstr ""
 
+#: part/templates/part/bom_upload/select_fields.html:47
+msgid "Remove column"
+msgstr ""
+
 #: part/templates/part/bom_upload/select_fields.html:58
 msgid "Match Fields"
 msgstr ""
@@ -3376,6 +3526,11 @@ msgstr ""
 msgid "Duplicate column selection"
 msgstr ""
 
+#: part/templates/part/bom_upload/select_fields.html:76
+#: part/templates/part/bom_upload/select_parts.html:58
+msgid "Remove row"
+msgstr ""
+
 #: part/templates/part/bom_upload/select_parts.html:16
 msgid "Step 3 - Select Parts"
 msgstr ""
@@ -3397,10 +3552,6 @@ msgstr ""
 msgid "Select Part"
 msgstr ""
 
-#: part/templates/part/bom_upload/select_parts.html:58
-msgid "Remove row"
-msgstr ""
-
 #: part/templates/part/bom_upload/select_parts.html:65
 #: part/templates/part/category.html:117
 msgid "Create new part"
@@ -3487,7 +3638,8 @@ msgstr ""
 msgid "Export Data"
 msgstr ""
 
-#: part/templates/part/category.html:198 templates/js/stock.js:705
+#: part/templates/part/category.html:198
+#: stock/templates/stock/location.html:192 templates/js/stock.js:705
 msgid "Create new location"
 msgstr ""
 
@@ -3597,10 +3749,6 @@ msgstr ""
 msgid "Stock Expiry Time"
 msgstr ""
 
-#: part/templates/part/detail.html:126 templates/js/order.js:293
-msgid "Creation Date"
-msgstr ""
-
 #: part/templates/part/detail.html:132
 msgid "Created By"
 msgstr ""
@@ -3736,10 +3884,18 @@ msgid "Edit"
 msgstr ""
 
 #: part/templates/part/params.html:44 part/templates/part/related.html:44
-#: part/templates/part/supplier.html:22 users/models.py:170
+#: part/templates/part/supplier.html:22 users/models.py:175
 msgid "Delete"
 msgstr ""
 
+#: part/templates/part/params.html:68
+msgid "New Template"
+msgstr ""
+
+#: part/templates/part/params.html:69
+msgid "Create New Parameter Template"
+msgstr ""
+
 #: part/templates/part/part_app_base.html:11
 msgid "Part List"
 msgstr ""
@@ -3765,7 +3921,7 @@ msgstr ""
 
 #: part/templates/part/part_base.html:48
 #: stock/templates/stock/item_base.html:129
-#: stock/templates/stock/location.html:46
+#: stock/templates/stock/location.html:46 templates/qr_button.html:1
 msgid "Show QR Code"
 msgstr ""
 
@@ -3823,6 +3979,48 @@ msgstr ""
 msgid "Building"
 msgstr ""
 
+#: part/templates/part/part_base.html:249
+msgid "Calculate"
+msgstr ""
+
+#: part/templates/part/part_pricing.html:8
+msgid "Pricing information for:"
+msgstr ""
+
+#: part/templates/part/part_pricing.html:24
+msgid "Supplier Pricing"
+msgstr ""
+
+#: part/templates/part/part_pricing.html:28
+#: part/templates/part/part_pricing.html:54
+msgid "Unit Cost"
+msgstr ""
+
+#: part/templates/part/part_pricing.html:34
+#: part/templates/part/part_pricing.html:60
+msgid "Total Cost"
+msgstr ""
+
+#: part/templates/part/part_pricing.html:42
+msgid "No supplier pricing available"
+msgstr ""
+
+#: part/templates/part/part_pricing.html:50
+msgid "BOM Pricing"
+msgstr ""
+
+#: part/templates/part/part_pricing.html:68
+msgid "Note: BOM pricing is incomplete for this part"
+msgstr ""
+
+#: part/templates/part/part_pricing.html:75
+msgid "No BOM pricing available"
+msgstr ""
+
+#: part/templates/part/part_pricing.html:85
+msgid "No pricing information is available for this part."
+msgstr ""
+
 #: part/templates/part/part_tests.html:17
 msgid "Add Test Template"
 msgstr ""
@@ -3851,10 +4049,6 @@ msgstr ""
 msgid "Set category for the following parts"
 msgstr ""
 
-#: part/templates/part/set_category.html:32
-msgid "Remove part"
-msgstr ""
-
 #: part/templates/part/stock.html:10
 msgid "Part Stock"
 msgstr ""
@@ -4491,6 +4685,10 @@ msgstr ""
 msgid "StockItem cannot be moved as it is not in stock"
 msgstr ""
 
+#: stock/models.py:1551
+msgid "Title"
+msgstr ""
+
 #: stock/models.py:1551
 msgid "Tracking entry title"
 msgstr ""
@@ -4523,10 +4721,6 @@ msgstr ""
 msgid "Test output value"
 msgstr ""
 
-#: stock/models.py:1657
-msgid "Attachment"
-msgstr ""
-
 #: stock/models.py:1658
 msgid "Test result attachment"
 msgstr ""
@@ -4824,7 +5018,7 @@ msgid "Stock Details"
 msgstr ""
 
 #: stock/templates/stock/location.html:110 templates/InvenTree/search.html:263
-#: templates/stats.html:52 users/models.py:34
+#: templates/stats.html:52 users/models.py:39
 msgid "Stock Locations"
 msgstr ""
 
@@ -4864,6 +5058,10 @@ msgstr ""
 msgid "Children"
 msgstr ""
 
+#: stock/templates/stock/stock_adjust.html:43
+msgid "Remove item"
+msgstr ""
+
 #: stock/templates/stock/stock_app_base.html:15
 msgid "Loading..."
 msgstr ""
@@ -5364,10 +5562,6 @@ msgstr ""
 msgid "File"
 msgstr ""
 
-#: templates/attachment_table.html:16
-msgid "Comment"
-msgstr ""
-
 #: templates/attachment_table.html:17
 msgid "Uploaded"
 msgstr ""
@@ -5553,19 +5747,11 @@ msgstr ""
 msgid "Quantity Per"
 msgstr ""
 
-#: templates/js/build.js:578 templates/js/build.js:992
-msgid "Build stock"
-msgstr ""
-
 #: templates/js/build.js:582 templates/js/build.js:996
 #: templates/stock_table.html:57
 msgid "Order stock"
 msgstr ""
 
-#: templates/js/build.js:585
-msgid "Allocate stock"
-msgstr ""
-
 #: templates/js/build.js:632
 msgid "No builds matching query"
 msgstr ""
@@ -5607,6 +5793,22 @@ msgstr ""
 msgid "Assembled part"
 msgstr ""
 
+#: templates/js/filters.js:193
+msgid "Select filter"
+msgstr ""
+
+#: templates/js/filters.js:268
+msgid "Add new filter"
+msgstr ""
+
+#: templates/js/filters.js:271
+msgid "Clear all filters"
+msgstr ""
+
+#: templates/js/filters.js:296
+msgid "Create filter"
+msgstr ""
+
 #: templates/js/label.js:10 templates/js/report.js:98
 msgid "Select Stock Items"
 msgstr ""
@@ -5647,6 +5849,10 @@ msgstr ""
 msgid "Select Label Template"
 msgstr ""
 
+#: templates/js/modals.js:256
+msgid "Waiting for server..."
+msgstr ""
+
 #: templates/js/modals.js:406
 msgid "Show Error Information"
 msgstr ""
@@ -5995,6 +6201,14 @@ msgstr ""
 msgid "No user information"
 msgstr ""
 
+#: templates/js/stock.js:979
+msgid "Edit tracking entry"
+msgstr ""
+
+#: templates/js/stock.js:980
+msgid "Delete tracking entry"
+msgstr ""
+
 #: templates/js/stock.js:1089
 msgid "Create New Location"
 msgstr ""
@@ -6241,7 +6455,7 @@ msgstr ""
 msgid "InvenTree server issues detected"
 msgstr ""
 
-#: templates/navbar.html:69 users/models.py:31
+#: templates/navbar.html:69 users/models.py:36
 msgid "Admin"
 msgstr ""
 
@@ -6393,38 +6607,38 @@ msgstr ""
 msgid "Important dates"
 msgstr ""
 
-#: users/models.py:153
+#: users/models.py:158
 msgid "Permission set"
 msgstr ""
 
-#: users/models.py:161
+#: users/models.py:166
 msgid "Group"
 msgstr ""
 
-#: users/models.py:164
+#: users/models.py:169
 msgid "View"
 msgstr ""
 
-#: users/models.py:164
+#: users/models.py:169
 msgid "Permission to view items"
 msgstr ""
 
-#: users/models.py:166
+#: users/models.py:171
 msgid "Add"
 msgstr ""
 
-#: users/models.py:166
+#: users/models.py:171
 msgid "Permission to add items"
 msgstr ""
 
-#: users/models.py:168
+#: users/models.py:173
 msgid "Change"
 msgstr ""
 
-#: users/models.py:168
+#: users/models.py:173
 msgid "Permissions to edit items"
 msgstr ""
 
-#: users/models.py:170
+#: users/models.py:175
 msgid "Permission to delete items"
 msgstr ""
diff --git a/InvenTree/locale/es/LC_MESSAGES/django.po b/InvenTree/locale/es/LC_MESSAGES/django.po
index d229c67b45..7fe67bf929 100644
--- a/InvenTree/locale/es/LC_MESSAGES/django.po
+++ b/InvenTree/locale/es/LC_MESSAGES/django.po
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-03-28 16:04+0000\n"
+"POT-Creation-Date: 2021-04-03 02:10+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"
@@ -34,7 +34,7 @@ msgstr ""
 msgid "Enter date"
 msgstr ""
 
-#: InvenTree/forms.py:110 build/forms.py:97 build/forms.py:185
+#: InvenTree/forms.py:110 build/forms.py:99 build/forms.py:187
 msgid "Confirm"
 msgstr ""
 
@@ -91,47 +91,84 @@ msgstr ""
 msgid "Number of unique serial number ({s}) must match quantity ({q})"
 msgstr ""
 
+#: InvenTree/models.py:59 stock/models.py:1657
+msgid "Attachment"
+msgstr ""
+
 #: InvenTree/models.py:60
 msgid "Select file to attach"
 msgstr ""
 
+#: InvenTree/models.py:62 templates/attachment_table.html:16
+msgid "Comment"
+msgstr ""
+
 #: InvenTree/models.py:62
 msgid "File comment"
 msgstr ""
 
-#: InvenTree/models.py:68
+#: InvenTree/models.py:68 InvenTree/models.py:69
 #: report/templates/report/inventree_test_report_base.html:91
 #: templates/js/stock.js:960
 msgid "User"
 msgstr ""
 
-#: InvenTree/models.py:106 label/models.py:101 part/models.py:685
-#: part/templates/part/params.html:27 report/models.py:179
+#: InvenTree/models.py:72
+msgid "upload date"
+msgstr ""
+
+#: InvenTree/models.py:107 InvenTree/models.py:108 label/models.py:101
+#: part/models.py:686 part/templates/part/params.html:27 report/models.py:179
+#: templates/InvenTree/search.html:136 templates/InvenTree/search.html:273
 #: templates/js/part.js:109
 msgid "Name"
 msgstr ""
 
-#: InvenTree/models.py:112
+#: InvenTree/models.py:114 build/models.py:134
+#: build/templates/build/detail.html:21 company/models.py:359
+#: company/templates/company/detail.html:26
+#: company/templates/company/supplier_part_base.html:70
+#: company/templates/company/supplier_part_detail.html:31 label/models.py:108
+#: order/templates/order/purchase_order_detail.html:168 part/models.py:710
+#: part/templates/part/detail.html:54 part/templates/part/set_category.html:14
+#: report/models.py:192
+#: report/templates/report/inventree_build_order_base.html:118
+#: templates/InvenTree/search.html:143 templates/InvenTree/search.html:208
+#: templates/InvenTree/search.html:280
+#: templates/InvenTree/settings/header.html:9 templates/js/bom.js:190
+#: templates/js/build.js:677 templates/js/build.js:944
+#: templates/js/company.js:56 templates/js/order.js:183
+#: templates/js/order.js:280 templates/js/part.js:168 templates/js/part.js:251
+#: templates/js/part.js:370 templates/js/part.js:566 templates/js/stock.js:552
+#: templates/js/stock.js:934
+msgid "Description"
+msgstr ""
+
+#: InvenTree/models.py:115
 msgid "Description (optional)"
 msgstr ""
 
-#: InvenTree/settings.py:445
+#: InvenTree/models.py:123
+msgid "parent"
+msgstr ""
+
+#: InvenTree/settings.py:430
 msgid "English"
 msgstr ""
 
-#: InvenTree/settings.py:446
+#: InvenTree/settings.py:431
 msgid "French"
 msgstr ""
 
-#: InvenTree/settings.py:447
+#: InvenTree/settings.py:432
 msgid "German"
 msgstr ""
 
-#: InvenTree/settings.py:448
+#: InvenTree/settings.py:433
 msgid "Polish"
 msgstr ""
 
-#: InvenTree/settings.py:449
+#: InvenTree/settings.py:434
 msgid "Turkish"
 msgstr ""
 
@@ -306,25 +343,34 @@ msgstr ""
 msgid "Order target date"
 msgstr ""
 
-#: build/forms.py:39 build/models.py:224
+#: build/forms.py:39 build/templates/build/build_base.html:104
+#: build/templates/build/detail.html:121
+#: order/templates/order/order_base.html:124
+#: order/templates/order/sales_order_base.html:117
+#: report/templates/report/inventree_build_order_base.html:126
+#: templates/js/build.js:723 templates/js/order.js:200
+#: templates/js/order.js:298
+msgid "Target Date"
+msgstr ""
+
+#: build/forms.py:40 build/models.py:224
 msgid ""
 "Target date for build completion. Build will be overdue after this date."
 msgstr ""
 
-#: build/forms.py:44
-msgid "Number of items to build"
-msgstr ""
-
-#: build/forms.py:85 build/templates/build/auto_allocate.html:17
+#: build/forms.py:45 build/forms.py:87
+#: build/templates/build/auto_allocate.html:17
 #: build/templates/build/build_base.html:91
 #: build/templates/build/detail.html:31 common/models.py:696
-#: company/forms.py:130 company/templates/company/supplier_part_pricing.html:77
-#: order/templates/order/order_wizard/select_parts.html:32
+#: company/forms.py:131 company/templates/company/supplier_part_pricing.html:77
+#: order/forms.py:237 order/templates/order/order_wizard/select_parts.html:32
 #: order/templates/order/purchase_order_detail.html:193
 #: order/templates/order/sales_order_detail.html:77
 #: order/templates/order/sales_order_detail.html:159
 #: part/templates/part/allocation.html:19
 #: part/templates/part/allocation.html:53
+#: part/templates/part/part_pricing.html:12
+#: part/templates/part/part_pricing.html:19
 #: part/templates/part/sale_prices.html:85
 #: report/templates/report/inventree_build_order_base.html:114
 #: report/templates/report/inventree_po_report.html:91
@@ -339,55 +385,59 @@ msgstr ""
 msgid "Quantity"
 msgstr ""
 
-#: build/forms.py:86
+#: build/forms.py:46
+msgid "Number of items to build"
+msgstr ""
+
+#: build/forms.py:88
 msgid "Enter quantity for build output"
 msgstr ""
 
-#: build/forms.py:90 stock/forms.py:117
-msgid "Serial numbers"
+#: build/forms.py:92 order/forms.py:231 stock/forms.py:117
+msgid "Serial Numbers"
 msgstr ""
 
-#: build/forms.py:92
+#: build/forms.py:94
 msgid "Enter serial numbers for build outputs"
 msgstr ""
 
-#: build/forms.py:98
+#: build/forms.py:100
 msgid "Confirm creation of build output"
 msgstr ""
 
-#: build/forms.py:118
+#: build/forms.py:120
 msgid "Confirm deletion of build output"
 msgstr ""
 
-#: build/forms.py:139
+#: build/forms.py:141
 msgid "Confirm unallocation of stock"
 msgstr ""
 
-#: build/forms.py:163
+#: build/forms.py:165
 msgid "Confirm stock allocation"
 msgstr ""
 
-#: build/forms.py:186
+#: build/forms.py:188
 msgid "Mark build as complete"
 msgstr ""
 
-#: build/forms.py:210
+#: build/forms.py:212
 msgid "Location of completed parts"
 msgstr ""
 
-#: build/forms.py:215
+#: build/forms.py:217
 msgid "Confirm completion with incomplete stock allocation"
 msgstr ""
 
-#: build/forms.py:218
+#: build/forms.py:220
 msgid "Confirm build completion"
 msgstr ""
 
-#: build/forms.py:238 build/views.py:66
+#: build/forms.py:240 build/views.py:66
 msgid "Confirm build cancellation"
 msgstr ""
 
-#: build/forms.py:252
+#: build/forms.py:254
 msgid "Select quantity of stock to allocate"
 msgstr ""
 
@@ -404,7 +454,7 @@ msgstr ""
 #: order/templates/order/so_navbar.html:22 part/templates/part/navbar.html:55
 #: part/templates/part/navbar.html:58 templates/InvenTree/index.html:181
 #: templates/InvenTree/search.html:169
-#: templates/InvenTree/settings/tabs.html:31 users/models.py:36
+#: templates/InvenTree/settings/tabs.html:31 users/models.py:41
 msgid "Build Orders"
 msgstr ""
 
@@ -419,24 +469,6 @@ msgstr ""
 msgid "Reference"
 msgstr ""
 
-#: build/models.py:134 build/templates/build/detail.html:21
-#: company/models.py:359 company/templates/company/detail.html:26
-#: company/templates/company/supplier_part_base.html:70
-#: company/templates/company/supplier_part_detail.html:31 label/models.py:108
-#: order/templates/order/purchase_order_detail.html:168 part/models.py:709
-#: part/templates/part/detail.html:54 part/templates/part/set_category.html:14
-#: report/models.py:192
-#: report/templates/report/inventree_build_order_base.html:118
-#: templates/InvenTree/search.html:208
-#: templates/InvenTree/settings/header.html:9 templates/js/bom.js:190
-#: templates/js/build.js:677 templates/js/build.js:944
-#: templates/js/company.js:56 templates/js/order.js:183
-#: templates/js/order.js:280 templates/js/part.js:168 templates/js/part.js:251
-#: templates/js/part.js:370 templates/js/part.js:566 templates/js/stock.js:552
-#: templates/js/stock.js:934
-msgid "Description"
-msgstr ""
-
 #: build/models.py:137
 msgid "Brief description of the build"
 msgstr ""
@@ -455,8 +487,9 @@ msgstr ""
 #: build/templates/build/detail.html:26 order/models.py:662
 #: order/templates/order/order_wizard/select_parts.html:30
 #: order/templates/order/purchase_order_detail.html:156
-#: order/templates/order/receive_parts.html:19 part/models.py:320
-#: part/templates/part/part_app_base.html:7 part/templates/part/related.html:29
+#: order/templates/order/receive_parts.html:19 part/models.py:321
+#: part/models.py:2054 part/templates/part/part_app_base.html:7
+#: part/templates/part/part_pricing.html:15 part/templates/part/related.html:29
 #: part/templates/part/set_category.html:13
 #: part/templates/part/subcategories.html:17
 #: report/templates/report/inventree_build_order_base.html:110
@@ -537,15 +570,35 @@ msgstr ""
 msgid "Target completion date"
 msgstr ""
 
-#: build/models.py:240
+#: build/models.py:227 order/models.py:215
+msgid "Completion Date"
+msgstr ""
+
+#: build/models.py:233
+msgid "completed by"
+msgstr ""
+
+#: build/models.py:241
+msgid "Issued by"
+msgstr ""
+
+#: build/models.py:242
 msgid "User who issued this build order"
 msgstr ""
 
-#: build/models.py:248
+#: build/models.py:250 build/templates/build/build_base.html:142
+#: build/templates/build/detail.html:105 order/models.py:118
+#: order/templates/order/order_base.html:138
+#: order/templates/order/sales_order_base.html:138 part/models.py:885
+#: report/templates/report/inventree_build_order_base.html:159
+msgid "Responsible"
+msgstr ""
+
+#: build/models.py:251
 msgid "User responsible for this build order"
 msgstr ""
 
-#: build/models.py:253 build/templates/build/detail.html:91
+#: build/models.py:256 build/templates/build/detail.html:91
 #: company/templates/company/supplier_part_base.html:77
 #: company/templates/company/supplier_part_detail.html:28
 #: part/templates/part/detail.html:83 part/templates/part/part_base.html:100
@@ -553,90 +606,90 @@ msgstr ""
 msgid "External Link"
 msgstr ""
 
-#: build/models.py:254 part/models.py:743 stock/models.py:425
+#: build/models.py:257 part/models.py:744 stock/models.py:425
 msgid "Link to external URL"
 msgstr ""
 
-#: build/models.py:258 build/templates/build/navbar.html:59
+#: build/models.py:261 build/templates/build/navbar.html:59
 #: company/models.py:366 company/templates/company/navbar.html:59
 #: company/templates/company/navbar.html:62
 #: order/templates/order/po_navbar.html:29
 #: order/templates/order/po_navbar.html:32
 #: order/templates/order/purchase_order_detail.html:227
 #: order/templates/order/so_navbar.html:33
-#: order/templates/order/so_navbar.html:36 part/models.py:869
+#: order/templates/order/so_navbar.html:36 part/models.py:870
 #: part/templates/part/navbar.html:122
 #: report/templates/report/inventree_build_order_base.html:173
 #: stock/forms.py:316 stock/forms.py:348 stock/forms.py:376 stock/models.py:495
-#: stock/models.py:1663 stock/templates/stock/navbar.html:57
-#: templates/js/barcode.js:37 templates/js/bom.js:329 templates/js/stock.js:128
-#: templates/js/stock.js:667
+#: stock/models.py:1553 stock/models.py:1663
+#: stock/templates/stock/navbar.html:57 templates/js/barcode.js:37
+#: templates/js/bom.js:329 templates/js/stock.js:128 templates/js/stock.js:667
 msgid "Notes"
 msgstr ""
 
-#: build/models.py:259
+#: build/models.py:262
 msgid "Extra build notes"
 msgstr ""
 
-#: build/models.py:670
+#: build/models.py:673
 msgid "No build output specified"
 msgstr ""
 
-#: build/models.py:673
+#: build/models.py:676
 msgid "Build output is already completed"
 msgstr ""
 
-#: build/models.py:676
+#: build/models.py:679
 msgid "Build output does not match Build Order"
 msgstr ""
 
-#: build/models.py:751
+#: build/models.py:754
 msgid "Completed build output"
 msgstr ""
 
-#: build/models.py:993
+#: build/models.py:996
 msgid "BuildItem must be unique for build, stock_item and install_into"
 msgstr ""
 
-#: build/models.py:1015
+#: build/models.py:1018
 msgid "Build item must specify a build output"
 msgstr ""
 
-#: build/models.py:1020
+#: build/models.py:1023
 #, python-brace-format
 msgid "Selected stock item not found in BOM for part '{p}'"
 msgstr ""
 
-#: build/models.py:1024
+#: build/models.py:1027
 #, python-brace-format
 msgid "Allocated quantity ({n}) must not exceed available quantity ({q})"
 msgstr ""
 
-#: build/models.py:1031 order/models.py:746
+#: build/models.py:1034 order/models.py:751
 msgid "StockItem is over-allocated"
 msgstr ""
 
-#: build/models.py:1035 order/models.py:749
+#: build/models.py:1038 order/models.py:754
 msgid "Allocation quantity must be greater than zero"
 msgstr ""
 
-#: build/models.py:1039
+#: build/models.py:1042
 msgid "Quantity must be 1 for serialized stock"
 msgstr ""
 
-#: build/models.py:1079
+#: build/models.py:1082
 msgid "Build to allocate parts"
 msgstr ""
 
-#: build/models.py:1086
+#: build/models.py:1089
 msgid "Source stock item"
 msgstr ""
 
-#: build/models.py:1098
+#: build/models.py:1101
 msgid "Stock quantity to allocate to build"
 msgstr ""
 
-#: build/models.py:1106
+#: build/models.py:1109
 msgid "Destination stock item"
 msgstr ""
 
@@ -661,7 +714,7 @@ msgid "Order required parts"
 msgstr ""
 
 #: build/templates/build/allocate.html:31
-#: company/templates/company/detail_part.html:31 order/views.py:791
+#: company/templates/company/detail_part.html:31 order/views.py:794
 #: part/templates/part/category.html:127
 msgid "Order Parts"
 msgstr ""
@@ -768,10 +821,12 @@ msgid "Edit Build"
 msgstr ""
 
 #: build/templates/build/build_base.html:68
+#: build/templates/build/build_base.html:176
 msgid "Complete Build"
 msgstr ""
 
-#: build/templates/build/build_base.html:69 build/views.py:57
+#: build/templates/build/build_base.html:69
+#: build/templates/build/build_base.html:167 build/views.py:57
 msgid "Cancel Build"
 msgstr ""
 
@@ -790,16 +845,6 @@ msgstr ""
 msgid "Status"
 msgstr ""
 
-#: build/templates/build/build_base.html:104
-#: build/templates/build/detail.html:121
-#: order/templates/order/order_base.html:124
-#: order/templates/order/sales_order_base.html:117
-#: report/templates/report/inventree_build_order_base.html:126
-#: templates/js/build.js:723 templates/js/order.js:200
-#: templates/js/order.js:298
-msgid "Target Date"
-msgstr ""
-
 #: build/templates/build/build_base.html:108
 msgid "This build was due on"
 msgstr ""
@@ -827,14 +872,6 @@ msgstr ""
 msgid "Issued By"
 msgstr ""
 
-#: build/templates/build/build_base.html:142
-#: build/templates/build/detail.html:105 order/models.py:118
-#: order/templates/order/order_base.html:138
-#: order/templates/order/sales_order_base.html:138
-#: report/templates/report/inventree_build_order_base.html:159
-msgid "Responsible"
-msgstr ""
-
 #: build/templates/build/build_children.html:10
 #: build/templates/build/navbar.html:42
 msgid "Child Build Orders"
@@ -1019,18 +1056,19 @@ msgstr ""
 msgid "Build Notes"
 msgstr ""
 
-#: build/templates/build/notes.html:23 company/templates/company/notes.html:21
-#: order/templates/order/order_notes.html:24
-#: order/templates/order/sales_order_notes.html:26
-#: part/templates/part/notes.html:25 stock/templates/stock/item_notes.html:23
-msgid "Save"
+#: build/templates/build/notes.html:14 company/templates/company/notes.html:13
+#: order/templates/order/order_notes.html:15
+#: order/templates/order/sales_order_notes.html:16
+#: part/templates/part/notes.html:14 stock/templates/stock/item_notes.html:15
+msgid "Edit notes"
 msgstr ""
 
-#: build/templates/build/notes.html:30 company/templates/company/notes.html:29
-#: order/templates/order/order_notes.html:31
-#: order/templates/order/sales_order_notes.html:32
-#: part/templates/part/notes.html:33 stock/templates/stock/item_notes.html:29
-msgid "Edit notes"
+#: build/templates/build/notes.html:26 company/templates/company/notes.html:24
+#: order/templates/order/order_notes.html:27
+#: order/templates/order/sales_order_notes.html:29
+#: part/templates/part/notes.html:27 stock/templates/stock/item_base.html:454
+#: stock/templates/stock/item_notes.html:26
+msgid "Save"
 msgstr ""
 
 #: build/templates/build/unallocate.html:10
@@ -1170,24 +1208,24 @@ msgstr ""
 msgid "Add Build Order Attachment"
 msgstr ""
 
-#: build/views.py:1062 order/views.py:107 order/views.py:159 part/views.py:172
+#: build/views.py:1062 order/views.py:110 order/views.py:162 part/views.py:172
 #: stock/views.py:277
 msgid "Added attachment"
 msgstr ""
 
-#: build/views.py:1098 order/views.py:186 order/views.py:207
+#: build/views.py:1098 order/views.py:189 order/views.py:210
 msgid "Edit Attachment"
 msgstr ""
 
-#: build/views.py:1108 order/views.py:190 order/views.py:211
+#: build/views.py:1108 order/views.py:193 order/views.py:214
 msgid "Attachment updated"
 msgstr ""
 
-#: build/views.py:1118 order/views.py:226 order/views.py:240
+#: build/views.py:1118 order/views.py:229 order/views.py:243
 msgid "Delete Attachment"
 msgstr ""
 
-#: build/views.py:1123 order/views.py:232 order/views.py:246 stock/views.py:333
+#: build/views.py:1123 order/views.py:235 order/views.py:249 stock/views.py:333
 msgid "Deleted attachment"
 msgstr ""
 
@@ -1303,7 +1341,7 @@ msgstr ""
 msgid "Number of recent parts to display on index page"
 msgstr ""
 
-#: common/models.py:150 part/templates/part/detail.html:160
+#: common/models.py:150 part/models.py:2056 part/templates/part/detail.html:160
 #: report/models.py:185 stock/forms.py:258 templates/js/table_filters.js:24
 #: templates/js/table_filters.js:288
 msgid "Template"
@@ -1313,7 +1351,7 @@ msgstr ""
 msgid "Parts are templates by default"
 msgstr ""
 
-#: common/models.py:157 part/models.py:832 part/templates/part/detail.html:170
+#: common/models.py:157 part/models.py:833 part/templates/part/detail.html:170
 #: templates/js/table_filters.js:101 templates/js/table_filters.js:300
 msgid "Assembly"
 msgstr ""
@@ -1322,7 +1360,7 @@ msgstr ""
 msgid "Parts can be assembled from other components by default"
 msgstr ""
 
-#: common/models.py:164 part/models.py:838 part/templates/part/detail.html:180
+#: common/models.py:164 part/models.py:839 part/templates/part/detail.html:180
 #: templates/js/table_filters.js:304
 msgid "Component"
 msgstr ""
@@ -1331,7 +1369,7 @@ msgstr ""
 msgid "Parts can be used as sub-components by default"
 msgstr ""
 
-#: common/models.py:171 part/models.py:849 part/templates/part/detail.html:200
+#: common/models.py:171 part/models.py:850 part/templates/part/detail.html:200
 msgid "Purchaseable"
 msgstr ""
 
@@ -1339,7 +1377,7 @@ msgstr ""
 msgid "Parts are purchaseable by default"
 msgstr ""
 
-#: common/models.py:178 part/models.py:854 part/templates/part/detail.html:210
+#: common/models.py:178 part/models.py:855 part/templates/part/detail.html:210
 #: templates/js/table_filters.js:312
 msgid "Salable"
 msgstr ""
@@ -1348,7 +1386,7 @@ msgstr ""
 msgid "Parts are salable by default"
 msgstr ""
 
-#: common/models.py:185 part/models.py:844 part/templates/part/detail.html:190
+#: common/models.py:185 part/models.py:845 part/templates/part/detail.html:190
 #: templates/js/table_filters.js:32 templates/js/table_filters.js:316
 msgid "Trackable"
 msgstr ""
@@ -1357,7 +1395,7 @@ msgstr ""
 msgid "Parts are trackable by default"
 msgstr ""
 
-#: common/models.py:192 part/models.py:864 part/templates/part/detail.html:150
+#: common/models.py:192 part/models.py:865 part/templates/part/detail.html:150
 #: templates/js/table_filters.js:28
 msgid "Virtual"
 msgstr ""
@@ -1514,7 +1552,7 @@ msgstr ""
 msgid "Key string must be unique"
 msgstr ""
 
-#: common/models.py:697 company/forms.py:131
+#: common/models.py:697 company/forms.py:132
 msgid "Price break quantity"
 msgstr ""
 
@@ -1547,23 +1585,28 @@ msgstr ""
 msgid "Supplied value must be a boolean"
 msgstr ""
 
-#: company/forms.py:37 company/models.py:139
+#: company/forms.py:37 company/models.py:137
+#: company/templates/company/detail.html:40
+msgid "Currency"
+msgstr ""
+
+#: company/forms.py:38 company/models.py:139
 msgid "Default currency used for this company"
 msgstr ""
 
-#: company/forms.py:75 part/forms.py:46
+#: company/forms.py:76 part/forms.py:46
 msgid "URL"
 msgstr ""
 
-#: company/forms.py:76 part/forms.py:47
+#: company/forms.py:77 part/forms.py:47
 msgid "Image URL"
 msgstr ""
 
-#: company/forms.py:98
+#: company/forms.py:99
 msgid "Single Price"
 msgstr ""
 
-#: company/forms.py:100
+#: company/forms.py:101
 msgid "Single quantity price"
 msgstr ""
 
@@ -1620,20 +1663,28 @@ msgstr ""
 msgid "Link to external company information"
 msgstr ""
 
+#: company/models.py:129
+msgid "is customer"
+msgstr ""
+
 #: company/models.py:129
 msgid "Do you sell items to this company?"
 msgstr ""
 
+#: company/models.py:131
+msgid "is supplier"
+msgstr ""
+
 #: company/models.py:131
 msgid "Do you purchase items from this company?"
 msgstr ""
 
 #: company/models.py:133
-msgid "Does this company manufacture parts?"
+msgid "is manufacturer"
 msgstr ""
 
-#: company/models.py:137 company/templates/company/detail.html:40
-msgid "Currency"
+#: company/models.py:133
+msgid "Does this company manufacture parts?"
 msgstr ""
 
 #: company/models.py:313 stock/models.py:370
@@ -1641,7 +1692,7 @@ msgstr ""
 msgid "Base Part"
 msgstr ""
 
-#: company/models.py:317
+#: company/models.py:317 order/views.py:1372
 msgid "Select part"
 msgstr ""
 
@@ -1691,9 +1742,9 @@ msgstr ""
 msgid "Manufacturer part number"
 msgstr ""
 
-#: company/models.py:353 part/models.py:742
+#: company/models.py:353 part/models.py:743
 #: report/templates/report/inventree_build_order_base.html:165
-#: templates/js/company.js:208 templates/js/part.js:430
+#: stock/models.py:1555 templates/js/company.js:208 templates/js/part.js:430
 msgid "Link"
 msgstr ""
 
@@ -1716,10 +1767,20 @@ msgstr ""
 msgid "Minimum charge (e.g. stocking fee)"
 msgstr ""
 
+#: company/models.py:371 company/templates/company/supplier_part_base.html:106
+#: stock/models.py:394 stock/templates/stock/item_base.html:295
+#: templates/js/stock.js:663
+msgid "Packaging"
+msgstr ""
+
 #: company/models.py:371
 msgid "Part packaging"
 msgstr ""
 
+#: company/models.py:373
+msgid "multiple"
+msgstr ""
+
 #: company/templates/company/assigned_stock.html:10
 #: company/templates/company/navbar.html:51
 #: company/templates/company/navbar.html:54 templates/js/build.js:411
@@ -1742,6 +1803,18 @@ msgstr ""
 msgid "Download image from URL"
 msgstr ""
 
+#: company/templates/company/company_base.html:46 order/views.py:306
+msgid "Create Purchase Order"
+msgstr ""
+
+#: company/templates/company/company_base.html:51
+msgid "Edit company information"
+msgstr ""
+
+#: company/templates/company/company_base.html:56 company/views.py:324
+msgid "Delete Company"
+msgstr ""
+
 #: company/templates/company/company_base.html:64
 #: company/templates/company/detail.html:10
 #: company/templates/company/navbar.html:12
@@ -1842,7 +1915,7 @@ msgstr ""
 #: company/templates/company/detail_stock.html:37
 #: company/templates/company/supplier_part_stock.html:34
 #: part/templates/part/category.html:114 part/templates/part/category.html:128
-#: part/templates/part/stock.html:54
+#: part/templates/part/stock.html:54 stock/templates/stock/location.html:163
 msgid "Export"
 msgstr ""
 
@@ -1855,21 +1928,21 @@ msgid "Supplied Parts"
 msgstr ""
 
 #: company/templates/company/navbar.html:23
-#: order/templates/order/receive_parts.html:14 part/models.py:321
+#: order/templates/order/receive_parts.html:14 part/models.py:322
 #: part/templates/part/cat_link.html:7 part/templates/part/category.html:95
 #: part/templates/part/category_navbar.html:11
 #: part/templates/part/category_navbar.html:14
 #: part/templates/part/category_partlist.html:10
 #: templates/InvenTree/index.html:96 templates/InvenTree/search.html:113
 #: templates/InvenTree/settings/tabs.html:25 templates/navbar.html:23
-#: templates/stats.html:35 templates/stats.html:44 users/models.py:33
+#: templates/stats.html:35 templates/stats.html:44 users/models.py:38
 msgid "Parts"
 msgstr ""
 
 #: company/templates/company/navbar.html:27 part/templates/part/navbar.html:33
 #: stock/templates/stock/location.html:100
 #: stock/templates/stock/location.html:115 templates/InvenTree/search.html:182
-#: templates/stats.html:48 templates/stats.html:57 users/models.py:35
+#: templates/stats.html:48 templates/stats.html:57 users/models.py:40
 msgid "Stock Items"
 msgstr ""
 
@@ -1895,7 +1968,7 @@ msgstr ""
 #: part/templates/part/sales_orders.html:10 templates/InvenTree/index.html:226
 #: templates/InvenTree/search.html:330
 #: templates/InvenTree/settings/tabs.html:37 templates/navbar.html:46
-#: users/models.py:38
+#: users/models.py:43
 msgid "Sales Orders"
 msgstr ""
 
@@ -1907,7 +1980,7 @@ msgstr ""
 #: part/templates/part/orders.html:10 templates/InvenTree/index.html:203
 #: templates/InvenTree/search.html:300
 #: templates/InvenTree/settings/tabs.html:34 templates/navbar.html:37
-#: users/models.py:37
+#: users/models.py:42
 msgid "Purchase Orders"
 msgstr ""
 
@@ -1968,6 +2041,7 @@ msgid "Supplier Part"
 msgstr ""
 
 #: company/templates/company/supplier_part_base.html:35
+#: company/templates/company/supplier_part_orders.html:17
 #: part/templates/part/orders.html:17 part/templates/part/part_base.html:64
 msgid "Order part"
 msgstr ""
@@ -1990,11 +2064,6 @@ msgstr ""
 msgid "Internal Part"
 msgstr ""
 
-#: company/templates/company/supplier_part_base.html:106 stock/models.py:394
-#: stock/templates/stock/item_base.html:295 templates/js/stock.js:663
-msgid "Packaging"
-msgstr ""
-
 #: company/templates/company/supplier_part_orders.html:18
 #: part/templates/part/orders.html:18
 msgid "Order Part"
@@ -2092,10 +2161,6 @@ msgstr ""
 msgid "Created new company"
 msgstr ""
 
-#: company/views.py:324
-msgid "Delete Company"
-msgstr ""
-
 #: company/views.py:330
 msgid "Company was deleted"
 msgstr ""
@@ -2173,44 +2238,52 @@ msgstr ""
 msgid "Filters"
 msgstr ""
 
-#: order/forms.py:25 order/templates/order/order_base.html:47
+#: order/forms.py:27 order/templates/order/order_base.html:47
 msgid "Place order"
 msgstr ""
 
-#: order/forms.py:36 order/templates/order/order_base.html:54
+#: order/forms.py:38 order/templates/order/order_base.html:54
 msgid "Mark order as complete"
 msgstr ""
 
-#: order/forms.py:47 order/forms.py:58 order/templates/order/order_base.html:59
+#: order/forms.py:49 order/forms.py:60 order/templates/order/order_base.html:59
 #: order/templates/order/sales_order_base.html:59
 msgid "Cancel order"
 msgstr ""
 
-#: order/forms.py:69 order/templates/order/sales_order_base.html:56
+#: order/forms.py:71 order/templates/order/sales_order_base.html:56
 msgid "Ship order"
 msgstr ""
 
-#: order/forms.py:80
+#: order/forms.py:82
 msgid "Receive parts to this location"
 msgstr ""
 
-#: order/forms.py:101
+#: order/forms.py:103
 msgid "Purchase Order reference"
 msgstr ""
 
-#: order/forms.py:107
+#: order/forms.py:109
 msgid "Target date for order delivery. Order will be overdue after this date."
 msgstr ""
 
-#: order/forms.py:135
+#: order/forms.py:137
 msgid "Enter sales order number"
 msgstr ""
 
-#: order/forms.py:141 order/models.py:448
+#: order/forms.py:143 order/models.py:448
 msgid ""
 "Target date for order completion. Order will be overdue after this date."
 msgstr ""
 
+#: order/forms.py:233
+msgid "Enter stock item serial numbers"
+msgstr ""
+
+#: order/forms.py:239
+msgid "Enter quantity of stock items"
+msgstr ""
+
 #: order/models.py:99
 msgid "Order reference"
 msgstr ""
@@ -2260,10 +2333,6 @@ msgid ""
 "Expected date for order delivery. Order will be overdue after this date."
 msgstr ""
 
-#: order/models.py:215
-msgid "Completion Date"
-msgstr ""
-
 #: order/models.py:216
 msgid "Date order was completed"
 msgstr ""
@@ -2333,27 +2402,31 @@ msgstr ""
 msgid "Unit purchase price"
 msgstr ""
 
-#: order/models.py:737
-msgid "Cannot allocate stock item to a line with a different part"
-msgstr ""
-
-#: order/models.py:739
-msgid "Cannot allocate stock to a line without a part"
+#: order/models.py:736 order/models.py:738
+msgid "Stock item has not been assigned"
 msgstr ""
 
 #: order/models.py:742
+msgid "Cannot allocate stock item to a line with a different part"
+msgstr ""
+
+#: order/models.py:744
+msgid "Cannot allocate stock to a line without a part"
+msgstr ""
+
+#: order/models.py:747
 msgid "Allocation quantity cannot exceed stock quantity"
 msgstr ""
 
-#: order/models.py:752
+#: order/models.py:757
 msgid "Quantity must be 1 for serialized stock item"
 msgstr ""
 
-#: order/models.py:768
+#: order/models.py:773
 msgid "Select stock item to allocate"
 msgstr ""
 
-#: order/models.py:771
+#: order/models.py:776
 msgid "Enter stock allocation quantity"
 msgstr ""
 
@@ -2369,6 +2442,7 @@ msgid "Print"
 msgstr ""
 
 #: order/templates/order/order_base.html:43
+#: order/templates/order/sales_order_base.html:52
 msgid "Edit order information"
 msgstr ""
 
@@ -2440,6 +2514,11 @@ msgstr ""
 msgid "Select a supplier for"
 msgstr ""
 
+#: order/templates/order/order_wizard/select_parts.html:69
+#: part/templates/part/set_category.html:32
+msgid "Remove part"
+msgstr ""
+
 #: order/templates/order/order_wizard/select_pos.html:8
 msgid "Step 2 of 2 - Select Purchase Orders"
 msgstr ""
@@ -2457,6 +2536,10 @@ msgstr ""
 msgid "Select Purchase Order"
 msgstr ""
 
+#: order/templates/order/order_wizard/select_pos.html:45
+msgid "Create new purchase order for {{ supplier.name }}"
+msgstr ""
+
 #: order/templates/order/order_wizard/select_pos.html:68
 msgid "Select a purchase order for"
 msgstr ""
@@ -2480,15 +2563,16 @@ msgid "Purchase Order Items"
 msgstr ""
 
 #: order/templates/order/purchase_order_detail.html:24
-#: order/templates/order/sales_order_detail.html:22 order/views.py:1105
-#: order/views.py:1188
+#: order/templates/order/sales_order_detail.html:22 order/views.py:1108
+#: order/views.py:1191
 msgid "Add Line Item"
 msgstr ""
 
 #: order/templates/order/purchase_order_detail.html:45
 #: order/templates/order/purchase_order_detail.html:125
 #: part/templates/part/category.html:197 part/templates/part/category.html:239
-#: templates/js/stock.js:704 templates/js/stock.js:1088
+#: stock/templates/stock/location.html:191 templates/js/stock.js:704
+#: templates/js/stock.js:1088
 msgid "New Location"
 msgstr ""
 
@@ -2507,7 +2591,7 @@ msgid "Unit Price"
 msgstr ""
 
 #: order/templates/order/purchase_order_detail.html:239
-#: order/templates/order/sales_order_detail.html:289
+#: order/templates/order/sales_order_detail.html:294
 msgid "Edit line item"
 msgstr ""
 
@@ -2549,6 +2633,10 @@ msgstr ""
 msgid "Error: Referenced part has been removed"
 msgstr ""
 
+#: order/templates/order/receive_parts.html:57
+msgid "Remove line"
+msgstr ""
+
 #: order/templates/order/sales_order_base.html:15
 msgid "This SalesOrder has not been fully allocated"
 msgstr ""
@@ -2595,8 +2683,8 @@ msgstr ""
 msgid "Delete stock allocation"
 msgstr ""
 
-#: order/templates/order/sales_order_detail.html:229 templates/js/build.js:523
-#: templates/js/build.js:785
+#: order/templates/order/sales_order_detail.html:229 order/views.py:1351
+#: templates/js/build.js:523 templates/js/build.js:785
 msgid "Allocated"
 msgstr ""
 
@@ -2605,18 +2693,23 @@ msgid "Fulfilled"
 msgstr ""
 
 #: order/templates/order/sales_order_detail.html:279
-msgid "Buy parts"
+msgid "Allocate serial numbers"
 msgstr ""
 
-#: order/templates/order/sales_order_detail.html:283
-msgid "Build parts"
+#: order/templates/order/sales_order_detail.html:282 templates/js/build.js:585
+msgid "Allocate stock"
 msgstr ""
 
-#: order/templates/order/sales_order_detail.html:286
-msgid "Allocate parts"
+#: order/templates/order/sales_order_detail.html:285
+msgid "Purchase stock"
 msgstr ""
 
-#: order/templates/order/sales_order_detail.html:290
+#: order/templates/order/sales_order_detail.html:289 templates/js/build.js:578
+#: templates/js/build.js:992
+msgid "Build stock"
+msgstr ""
+
+#: order/templates/order/sales_order_detail.html:295
 msgid "Delete line item "
 msgstr ""
 
@@ -2646,6 +2739,10 @@ msgstr ""
 msgid "Shipping this order means that the order will no longer be editable."
 msgstr ""
 
+#: order/templates/order/so_allocate_by_serial.html:9
+msgid "Allocate stock items by serial number"
+msgstr ""
+
 #: order/templates/order/so_allocation_delete.html:7
 msgid "This action will unallocate the following stock from the Sales Order"
 msgstr ""
@@ -2659,140 +2756,160 @@ msgstr ""
 msgid "Are you sure you wish to delete this line item?"
 msgstr ""
 
-#: order/views.py:96
+#: order/views.py:99
 msgid "Add Purchase Order Attachment"
 msgstr ""
 
-#: order/views.py:146
+#: order/views.py:149
 msgid "Add Sales Order Attachment"
 msgstr ""
 
-#: order/views.py:303
-msgid "Create Purchase Order"
-msgstr ""
-
-#: order/views.py:338
+#: order/views.py:341
 msgid "Create Sales Order"
 msgstr ""
 
-#: order/views.py:373
+#: order/views.py:376
 msgid "Edit Purchase Order"
 msgstr ""
 
-#: order/views.py:393
+#: order/views.py:396
 msgid "Edit Sales Order"
 msgstr ""
 
-#: order/views.py:409
+#: order/views.py:412
 msgid "Cancel Order"
 msgstr ""
 
-#: order/views.py:418 order/views.py:444
+#: order/views.py:421 order/views.py:447
 msgid "Confirm order cancellation"
 msgstr ""
 
-#: order/views.py:421 order/views.py:447
+#: order/views.py:424 order/views.py:450
 msgid "Order cannot be cancelled"
 msgstr ""
 
-#: order/views.py:435
+#: order/views.py:438
 msgid "Cancel sales order"
 msgstr ""
 
-#: order/views.py:461
+#: order/views.py:464
 msgid "Issue Order"
 msgstr ""
 
-#: order/views.py:470
+#: order/views.py:473
 msgid "Confirm order placement"
 msgstr ""
 
-#: order/views.py:480
+#: order/views.py:483
 msgid "Purchase order issued"
 msgstr ""
 
-#: order/views.py:491
+#: order/views.py:494
 msgid "Complete Order"
 msgstr ""
 
-#: order/views.py:507
+#: order/views.py:510
 msgid "Confirm order completion"
 msgstr ""
 
-#: order/views.py:518
+#: order/views.py:521
 msgid "Purchase order completed"
 msgstr ""
 
-#: order/views.py:528
+#: order/views.py:531
 msgid "Ship Order"
 msgstr ""
 
-#: order/views.py:544
+#: order/views.py:547
 msgid "Confirm order shipment"
 msgstr ""
 
-#: order/views.py:550
+#: order/views.py:553
 msgid "Could not ship order"
 msgstr ""
 
-#: order/views.py:604
+#: order/views.py:607
 msgid "Receive Parts"
 msgstr ""
 
-#: order/views.py:674
+#: order/views.py:677
 msgid "Items received"
 msgstr ""
 
-#: order/views.py:688
+#: order/views.py:691
 msgid "No destination set"
 msgstr ""
 
-#: order/views.py:733
+#: order/views.py:736
 msgid "Error converting quantity to number"
 msgstr ""
 
-#: order/views.py:739
+#: order/views.py:742
 msgid "Receive quantity less than zero"
 msgstr ""
 
-#: order/views.py:745
+#: order/views.py:748
 msgid "No lines specified"
 msgstr ""
 
-#: order/views.py:1114
+#: order/views.py:1117
 msgid "Supplier part must be specified"
 msgstr ""
 
-#: order/views.py:1120
+#: order/views.py:1123
 msgid "Supplier must match for Part and Order"
 msgstr ""
 
-#: order/views.py:1239 order/views.py:1257
+#: order/views.py:1242 order/views.py:1260
 msgid "Edit Line Item"
 msgstr ""
 
-#: order/views.py:1273 order/views.py:1285
+#: order/views.py:1276 order/views.py:1288
 msgid "Delete Line Item"
 msgstr ""
 
-#: order/views.py:1278 order/views.py:1290
+#: order/views.py:1281 order/views.py:1293
 msgid "Deleted line item"
 msgstr ""
 
-#: order/views.py:1299
+#: order/views.py:1306
+msgid "Allocate Serial Numbers"
+msgstr ""
+
+#: order/views.py:1351
+msgid "items"
+msgstr ""
+
+#: order/views.py:1367
+msgid "Select line item"
+msgstr ""
+
+#: order/views.py:1398
+msgid "No matching item for serial"
+msgstr ""
+
+#: order/views.py:1408
+msgid "is not in stock"
+msgstr ""
+
+#: order/views.py:1416
+msgid "already allocated to an order"
+msgstr ""
+
+#: order/views.py:1470
 msgid "Allocate Stock to Order"
 msgstr ""
 
-#: order/views.py:1373
+#: order/views.py:1544
 msgid "Edit Allocation Quantity"
 msgstr ""
 
-#: order/views.py:1388
+#: order/views.py:1559
 msgid "Remove allocation"
 msgstr ""
 
-#: part/bom.py:138 part/models.py:760 part/templates/part/category.html:62
-#: part/templates/part/detail.html:90
+#: part/bom.py:138 part/models.py:72 part/models.py:761
+#: part/templates/part/category.html:62 part/templates/part/detail.html:90
 msgid "Default Location"
 msgstr ""
 
@@ -2861,7 +2978,7 @@ msgstr ""
 msgid "Include part supplier data in exported BOM"
 msgstr ""
 
-#: part/forms.py:120 part/models.py:2053
+#: part/forms.py:120 part/models.py:2054
 msgid "Parent Part"
 msgstr ""
 
@@ -2933,323 +3050,352 @@ msgstr ""
 msgid "Input quantity for price calculation"
 msgstr ""
 
-#: part/models.py:72
+#: part/models.py:73
 msgid "Default location for parts in this category"
 msgstr ""
 
-#: part/models.py:75
+#: part/models.py:76
+msgid "Default keywords"
+msgstr ""
+
+#: part/models.py:76
 msgid "Default keywords for parts in this category"
 msgstr ""
 
-#: part/models.py:81 part/models.py:2098
+#: part/models.py:82 part/models.py:2099
 #: part/templates/part/part_app_base.html:9
 msgid "Part Category"
 msgstr ""
 
-#: part/models.py:82 part/templates/part/category.html:19
+#: part/models.py:83 part/templates/part/category.html:19
 #: part/templates/part/category.html:90 part/templates/part/category.html:141
 #: templates/InvenTree/search.html:126 templates/stats.html:39
-#: users/models.py:32
+#: users/models.py:37
 msgid "Part Categories"
 msgstr ""
 
-#: part/models.py:445 part/models.py:457
+#: part/models.py:446 part/models.py:458
 #, python-brace-format
 msgid "Part '{p1}' is  used in BOM for '{p2}' (recursive)"
 msgstr ""
 
-#: part/models.py:554
+#: part/models.py:555
 msgid "Next available serial numbers are"
 msgstr ""
 
-#: part/models.py:558
+#: part/models.py:559
 msgid "Next available serial number is"
 msgstr ""
 
-#: part/models.py:563
+#: part/models.py:564
 msgid "Most recent serial number is"
 msgstr ""
 
-#: part/models.py:642
+#: part/models.py:643
 msgid "Duplicate IPN not allowed in part settings"
 msgstr ""
 
-#: part/models.py:653
+#: part/models.py:654
 msgid "Part must be unique for name, IPN and revision"
 msgstr ""
 
-#: part/models.py:684 part/templates/part/detail.html:22
+#: part/models.py:685 part/templates/part/detail.html:22
 msgid "Part name"
 msgstr ""
 
-#: part/models.py:691
+#: part/models.py:692
 msgid "Is Template"
 msgstr ""
 
-#: part/models.py:692
+#: part/models.py:693
 msgid "Is this part a template part?"
 msgstr ""
 
-#: part/models.py:703
+#: part/models.py:704
 msgid "Is this part a variant of another part?"
 msgstr ""
 
-#: part/models.py:704 part/templates/part/detail.html:60
+#: part/models.py:705 part/templates/part/detail.html:60
 msgid "Variant Of"
 msgstr ""
 
-#: part/models.py:710
+#: part/models.py:711
 msgid "Part description"
 msgstr ""
 
-#: part/models.py:715 part/templates/part/category.html:69
+#: part/models.py:716 part/templates/part/category.html:69
 #: part/templates/part/detail.html:67
 msgid "Keywords"
 msgstr ""
 
-#: part/models.py:716
+#: part/models.py:717
 msgid "Part keywords to improve visibility in search results"
 msgstr ""
 
-#: part/models.py:723 part/templates/part/detail.html:73
+#: part/models.py:724 part/templates/part/detail.html:73
 #: part/templates/part/set_category.html:15 templates/js/part.js:384
 msgid "Category"
 msgstr ""
 
-#: part/models.py:724
+#: part/models.py:725
 msgid "Part category"
 msgstr ""
 
-#: part/models.py:729 part/templates/part/detail.html:28
+#: part/models.py:730 part/templates/part/detail.html:28
 #: part/templates/part/part_base.html:93 templates/js/part.js:160
 msgid "IPN"
 msgstr ""
 
-#: part/models.py:730
+#: part/models.py:731
 msgid "Internal Part Number"
 msgstr ""
 
-#: part/models.py:736
+#: part/models.py:737
 msgid "Part revision or version number"
 msgstr ""
 
-#: part/models.py:737 part/templates/part/detail.html:35 report/models.py:198
+#: part/models.py:738 part/templates/part/detail.html:35 report/models.py:198
 #: templates/js/part.js:164
 msgid "Revision"
 msgstr ""
 
-#: part/models.py:758
+#: part/models.py:759
 msgid "Where is this item normally stored?"
 msgstr ""
 
-#: part/models.py:805 part/templates/part/detail.html:97
+#: part/models.py:806 part/templates/part/detail.html:97
 msgid "Default Supplier"
 msgstr ""
 
-#: part/models.py:806
+#: part/models.py:807
 msgid "Default supplier part"
 msgstr ""
 
-#: part/models.py:813
+#: part/models.py:814
 msgid "Default Expiry"
 msgstr ""
 
-#: part/models.py:814
+#: part/models.py:815
 msgid "Expiry time (in days) for stock items of this part"
 msgstr ""
 
-#: part/models.py:819 part/templates/part/detail.html:113
+#: part/models.py:820 part/templates/part/detail.html:113
 msgid "Minimum Stock"
 msgstr ""
 
-#: part/models.py:820
+#: part/models.py:821
 msgid "Minimum allowed stock level"
 msgstr ""
 
-#: part/models.py:826 part/templates/part/detail.html:106
+#: part/models.py:827 part/templates/part/detail.html:106
 #: part/templates/part/params.html:29
 msgid "Units"
 msgstr ""
 
-#: part/models.py:827
+#: part/models.py:828
 msgid "Stock keeping units for this part"
 msgstr ""
 
-#: part/models.py:833
+#: part/models.py:834
 msgid "Can this part be built from other parts?"
 msgstr ""
 
-#: part/models.py:839
+#: part/models.py:840
 msgid "Can this part be used to build other parts?"
 msgstr ""
 
-#: part/models.py:845
+#: part/models.py:846
 msgid "Does this part have tracking for unique items?"
 msgstr ""
 
-#: part/models.py:850
+#: part/models.py:851
 msgid "Can this part be purchased from external suppliers?"
 msgstr ""
 
-#: part/models.py:855
+#: part/models.py:856
 msgid "Can this part be sold to customers?"
 msgstr ""
 
-#: part/models.py:859 part/templates/part/detail.html:227
+#: part/models.py:860 part/templates/part/detail.html:227
 #: templates/js/table_filters.js:20 templates/js/table_filters.js:60
 #: templates/js/table_filters.js:214 templates/js/table_filters.js:283
 msgid "Active"
 msgstr ""
 
-#: part/models.py:860
+#: part/models.py:861
 msgid "Is this part active?"
 msgstr ""
 
-#: part/models.py:865
+#: part/models.py:866
 msgid "Is this a virtual part, such as a software product or license?"
 msgstr ""
 
-#: part/models.py:870
+#: part/models.py:871
 msgid "Part notes - supports Markdown formatting"
 msgstr ""
 
-#: part/models.py:873
+#: part/models.py:874
+msgid "BOM checksum"
+msgstr ""
+
+#: part/models.py:874
 msgid "Stored BOM checksum"
 msgstr ""
 
-#: part/models.py:1926
+#: part/models.py:877
+msgid "BOM checked by"
+msgstr ""
+
+#: part/models.py:879
+msgid "BOM checked date"
+msgstr ""
+
+#: part/models.py:881 part/templates/part/detail.html:126
+#: templates/js/order.js:293
+msgid "Creation Date"
+msgstr ""
+
+#: part/models.py:883
+msgid "Creation User"
+msgstr ""
+
+#: part/models.py:1927
 msgid "Test templates can only be created for trackable parts"
 msgstr ""
 
-#: part/models.py:1943
+#: part/models.py:1944
 msgid "Test with this name already exists for this part"
 msgstr ""
 
-#: part/models.py:1962 templates/js/part.js:561 templates/js/stock.js:104
+#: part/models.py:1963 templates/js/part.js:561 templates/js/stock.js:104
 msgid "Test Name"
 msgstr ""
 
-#: part/models.py:1963
+#: part/models.py:1964
 msgid "Enter a name for the test"
 msgstr ""
 
-#: part/models.py:1968
+#: part/models.py:1969
 msgid "Test Description"
 msgstr ""
 
-#: part/models.py:1969
+#: part/models.py:1970
 msgid "Enter description for this test"
 msgstr ""
 
-#: part/models.py:1974 templates/js/part.js:570
+#: part/models.py:1975 templates/js/part.js:570
 #: templates/js/table_filters.js:200
 msgid "Required"
 msgstr ""
 
-#: part/models.py:1975
+#: part/models.py:1976
 msgid "Is this test required to pass?"
 msgstr ""
 
-#: part/models.py:1980 templates/js/part.js:578
+#: part/models.py:1981 templates/js/part.js:578
 msgid "Requires Value"
 msgstr ""
 
-#: part/models.py:1981
+#: part/models.py:1982
 msgid "Does this test require a value when adding a test result?"
 msgstr ""
 
-#: part/models.py:1986 templates/js/part.js:585
+#: part/models.py:1987 templates/js/part.js:585
 msgid "Requires Attachment"
 msgstr ""
 
-#: part/models.py:1987
+#: part/models.py:1988
 msgid "Does this test require a file attachment when adding a test result?"
 msgstr ""
 
-#: part/models.py:2020
+#: part/models.py:2021
 msgid "Parameter template name must be unique"
 msgstr ""
 
-#: part/models.py:2025
+#: part/models.py:2026
 msgid "Parameter Name"
 msgstr ""
 
-#: part/models.py:2027
+#: part/models.py:2028
 msgid "Parameter Units"
 msgstr ""
 
-#: part/models.py:2055 part/models.py:2103
+#: part/models.py:2056 part/models.py:2104
 #: templates/InvenTree/settings/category.html:62
 msgid "Parameter Template"
 msgstr ""
 
-#: part/models.py:2057
+#: part/models.py:2058
+msgid "Data"
+msgstr ""
+
+#: part/models.py:2058
 msgid "Parameter Value"
 msgstr ""
 
-#: part/models.py:2107
+#: part/models.py:2108
 msgid "Default Parameter Value"
 msgstr ""
 
-#: part/models.py:2135
+#: part/models.py:2136
 msgid "Select parent part"
 msgstr ""
 
-#: part/models.py:2143
+#: part/models.py:2144
 msgid "Select part to be used in BOM"
 msgstr ""
 
-#: part/models.py:2149
+#: part/models.py:2150
 msgid "BOM quantity for this BOM item"
 msgstr ""
 
-#: part/models.py:2151
+#: part/models.py:2152
 msgid "This BOM item is optional"
 msgstr ""
 
-#: part/models.py:2154
+#: part/models.py:2155
 msgid "Estimated build wastage quantity (absolute or percentage)"
 msgstr ""
 
-#: part/models.py:2157
+#: part/models.py:2158
 msgid "BOM item reference"
 msgstr ""
 
-#: part/models.py:2160
+#: part/models.py:2161
 msgid "BOM item notes"
 msgstr ""
 
-#: part/models.py:2162
+#: part/models.py:2163
 msgid "BOM line checksum"
 msgstr ""
 
-#: part/models.py:2166 templates/js/bom.js:275 templates/js/bom.js:282
+#: part/models.py:2167 templates/js/bom.js:275 templates/js/bom.js:282
 #: templates/js/table_filters.js:50
 msgid "Inherited"
 msgstr ""
 
-#: part/models.py:2167
+#: part/models.py:2168
 msgid "This BOM item is inherited by BOMs for variant parts"
 msgstr ""
 
-#: part/models.py:2243 part/views.py:1592 part/views.py:1644
+#: part/models.py:2244 part/views.py:1592 part/views.py:1644
 #: stock/models.py:259
 msgid "Quantity must be integer value for trackable parts"
 msgstr ""
 
-#: part/models.py:2252 part/models.py:2254
+#: part/models.py:2253 part/models.py:2255
 msgid "Sub part must be specified"
 msgstr ""
 
-#: part/models.py:2257
+#: part/models.py:2258
 msgid "BOM Item"
 msgstr ""
 
-#: part/models.py:2378
+#: part/models.py:2379
 msgid "Select Related Part"
 msgstr ""
 
-#: part/models.py:2410
+#: part/models.py:2411
 msgid ""
 "Error creating relationship: check that the part is not related to itself "
 "and that the relationship is unique"
@@ -3368,6 +3514,10 @@ msgstr ""
 msgid "File Fields"
 msgstr ""
 
+#: part/templates/part/bom_upload/select_fields.html:47
+msgid "Remove column"
+msgstr ""
+
 #: part/templates/part/bom_upload/select_fields.html:58
 msgid "Match Fields"
 msgstr ""
@@ -3376,6 +3526,11 @@ msgstr ""
 msgid "Duplicate column selection"
 msgstr ""
 
+#: part/templates/part/bom_upload/select_fields.html:76
+#: part/templates/part/bom_upload/select_parts.html:58
+msgid "Remove row"
+msgstr ""
+
 #: part/templates/part/bom_upload/select_parts.html:16
 msgid "Step 3 - Select Parts"
 msgstr ""
@@ -3397,10 +3552,6 @@ msgstr ""
 msgid "Select Part"
 msgstr ""
 
-#: part/templates/part/bom_upload/select_parts.html:58
-msgid "Remove row"
-msgstr ""
-
 #: part/templates/part/bom_upload/select_parts.html:65
 #: part/templates/part/category.html:117
 msgid "Create new part"
@@ -3487,7 +3638,8 @@ msgstr ""
 msgid "Export Data"
 msgstr ""
 
-#: part/templates/part/category.html:198 templates/js/stock.js:705
+#: part/templates/part/category.html:198
+#: stock/templates/stock/location.html:192 templates/js/stock.js:705
 msgid "Create new location"
 msgstr ""
 
@@ -3597,10 +3749,6 @@ msgstr ""
 msgid "Stock Expiry Time"
 msgstr ""
 
-#: part/templates/part/detail.html:126 templates/js/order.js:293
-msgid "Creation Date"
-msgstr ""
-
 #: part/templates/part/detail.html:132
 msgid "Created By"
 msgstr ""
@@ -3736,10 +3884,18 @@ msgid "Edit"
 msgstr ""
 
 #: part/templates/part/params.html:44 part/templates/part/related.html:44
-#: part/templates/part/supplier.html:22 users/models.py:170
+#: part/templates/part/supplier.html:22 users/models.py:175
 msgid "Delete"
 msgstr ""
 
+#: part/templates/part/params.html:68
+msgid "New Template"
+msgstr ""
+
+#: part/templates/part/params.html:69
+msgid "Create New Parameter Template"
+msgstr ""
+
 #: part/templates/part/part_app_base.html:11
 msgid "Part List"
 msgstr ""
@@ -3765,7 +3921,7 @@ msgstr ""
 
 #: part/templates/part/part_base.html:48
 #: stock/templates/stock/item_base.html:129
-#: stock/templates/stock/location.html:46
+#: stock/templates/stock/location.html:46 templates/qr_button.html:1
 msgid "Show QR Code"
 msgstr ""
 
@@ -3823,6 +3979,48 @@ msgstr ""
 msgid "Building"
 msgstr ""
 
+#: part/templates/part/part_base.html:249
+msgid "Calculate"
+msgstr ""
+
+#: part/templates/part/part_pricing.html:8
+msgid "Pricing information for:"
+msgstr ""
+
+#: part/templates/part/part_pricing.html:24
+msgid "Supplier Pricing"
+msgstr ""
+
+#: part/templates/part/part_pricing.html:28
+#: part/templates/part/part_pricing.html:54
+msgid "Unit Cost"
+msgstr ""
+
+#: part/templates/part/part_pricing.html:34
+#: part/templates/part/part_pricing.html:60
+msgid "Total Cost"
+msgstr ""
+
+#: part/templates/part/part_pricing.html:42
+msgid "No supplier pricing available"
+msgstr ""
+
+#: part/templates/part/part_pricing.html:50
+msgid "BOM Pricing"
+msgstr ""
+
+#: part/templates/part/part_pricing.html:68
+msgid "Note: BOM pricing is incomplete for this part"
+msgstr ""
+
+#: part/templates/part/part_pricing.html:75
+msgid "No BOM pricing available"
+msgstr ""
+
+#: part/templates/part/part_pricing.html:85
+msgid "No pricing information is available for this part."
+msgstr ""
+
 #: part/templates/part/part_tests.html:17
 msgid "Add Test Template"
 msgstr ""
@@ -3851,10 +4049,6 @@ msgstr ""
 msgid "Set category for the following parts"
 msgstr ""
 
-#: part/templates/part/set_category.html:32
-msgid "Remove part"
-msgstr ""
-
 #: part/templates/part/stock.html:10
 msgid "Part Stock"
 msgstr ""
@@ -4491,6 +4685,10 @@ msgstr ""
 msgid "StockItem cannot be moved as it is not in stock"
 msgstr ""
 
+#: stock/models.py:1551
+msgid "Title"
+msgstr ""
+
 #: stock/models.py:1551
 msgid "Tracking entry title"
 msgstr ""
@@ -4523,10 +4721,6 @@ msgstr ""
 msgid "Test output value"
 msgstr ""
 
-#: stock/models.py:1657
-msgid "Attachment"
-msgstr ""
-
 #: stock/models.py:1658
 msgid "Test result attachment"
 msgstr ""
@@ -4824,7 +5018,7 @@ msgid "Stock Details"
 msgstr ""
 
 #: stock/templates/stock/location.html:110 templates/InvenTree/search.html:263
-#: templates/stats.html:52 users/models.py:34
+#: templates/stats.html:52 users/models.py:39
 msgid "Stock Locations"
 msgstr ""
 
@@ -4864,6 +5058,10 @@ msgstr ""
 msgid "Children"
 msgstr ""
 
+#: stock/templates/stock/stock_adjust.html:43
+msgid "Remove item"
+msgstr ""
+
 #: stock/templates/stock/stock_app_base.html:15
 msgid "Loading..."
 msgstr ""
@@ -5364,10 +5562,6 @@ msgstr ""
 msgid "File"
 msgstr ""
 
-#: templates/attachment_table.html:16
-msgid "Comment"
-msgstr ""
-
 #: templates/attachment_table.html:17
 msgid "Uploaded"
 msgstr ""
@@ -5553,19 +5747,11 @@ msgstr ""
 msgid "Quantity Per"
 msgstr ""
 
-#: templates/js/build.js:578 templates/js/build.js:992
-msgid "Build stock"
-msgstr ""
-
 #: templates/js/build.js:582 templates/js/build.js:996
 #: templates/stock_table.html:57
 msgid "Order stock"
 msgstr ""
 
-#: templates/js/build.js:585
-msgid "Allocate stock"
-msgstr ""
-
 #: templates/js/build.js:632
 msgid "No builds matching query"
 msgstr ""
@@ -5607,6 +5793,22 @@ msgstr ""
 msgid "Assembled part"
 msgstr ""
 
+#: templates/js/filters.js:193
+msgid "Select filter"
+msgstr ""
+
+#: templates/js/filters.js:268
+msgid "Add new filter"
+msgstr ""
+
+#: templates/js/filters.js:271
+msgid "Clear all filters"
+msgstr ""
+
+#: templates/js/filters.js:296
+msgid "Create filter"
+msgstr ""
+
 #: templates/js/label.js:10 templates/js/report.js:98
 msgid "Select Stock Items"
 msgstr ""
@@ -5647,6 +5849,10 @@ msgstr ""
 msgid "Select Label Template"
 msgstr ""
 
+#: templates/js/modals.js:256
+msgid "Waiting for server..."
+msgstr ""
+
 #: templates/js/modals.js:406
 msgid "Show Error Information"
 msgstr ""
@@ -5995,6 +6201,14 @@ msgstr ""
 msgid "No user information"
 msgstr ""
 
+#: templates/js/stock.js:979
+msgid "Edit tracking entry"
+msgstr ""
+
+#: templates/js/stock.js:980
+msgid "Delete tracking entry"
+msgstr ""
+
 #: templates/js/stock.js:1089
 msgid "Create New Location"
 msgstr ""
@@ -6241,7 +6455,7 @@ msgstr ""
 msgid "InvenTree server issues detected"
 msgstr ""
 
-#: templates/navbar.html:69 users/models.py:31
+#: templates/navbar.html:69 users/models.py:36
 msgid "Admin"
 msgstr ""
 
@@ -6393,38 +6607,38 @@ msgstr ""
 msgid "Important dates"
 msgstr ""
 
-#: users/models.py:153
+#: users/models.py:158
 msgid "Permission set"
 msgstr ""
 
-#: users/models.py:161
+#: users/models.py:166
 msgid "Group"
 msgstr ""
 
-#: users/models.py:164
+#: users/models.py:169
 msgid "View"
 msgstr ""
 
-#: users/models.py:164
+#: users/models.py:169
 msgid "Permission to view items"
 msgstr ""
 
-#: users/models.py:166
+#: users/models.py:171
 msgid "Add"
 msgstr ""
 
-#: users/models.py:166
+#: users/models.py:171
 msgid "Permission to add items"
 msgstr ""
 
-#: users/models.py:168
+#: users/models.py:173
 msgid "Change"
 msgstr ""
 
-#: users/models.py:168
+#: users/models.py:173
 msgid "Permissions to edit items"
 msgstr ""
 
-#: users/models.py:170
+#: users/models.py:175
 msgid "Permission to delete items"
 msgstr ""

From cd7724d49020c345babb91fe9496a04d3b4fcd1f Mon Sep 17 00:00:00 2001
From: Matthias <matmair@live.de>
Date: Sat, 3 Apr 2021 13:48:02 +0200
Subject: [PATCH 07/16] added german(de) translations for the new stuff

---
 InvenTree/locale/de/LC_MESSAGES/django.po | 323 +++++++++++-----------
 1 file changed, 159 insertions(+), 164 deletions(-)

diff --git a/InvenTree/locale/de/LC_MESSAGES/django.po b/InvenTree/locale/de/LC_MESSAGES/django.po
index 75d6d455e2..ced6299586 100644
--- a/InvenTree/locale/de/LC_MESSAGES/django.po
+++ b/InvenTree/locale/de/LC_MESSAGES/django.po
@@ -115,10 +115,8 @@ msgid "User"
 msgstr "Benutzer"
 
 #: InvenTree/models.py:72
-#, fuzzy
-#| msgid "Upload Part Image"
 msgid "upload date"
-msgstr "Teilbild hochladen"
+msgstr "Hochladedatum"
 
 #: InvenTree/models.py:107 InvenTree/models.py:108 label/models.py:101
 #: part/models.py:686 part/templates/part/params.html:27 report/models.py:179
@@ -153,7 +151,7 @@ msgstr "Beschreibung (optional)"
 
 #: InvenTree/models.py:123
 msgid "parent"
-msgstr ""
+msgstr "Eltern"
 
 #: InvenTree/settings.py:430
 msgid "English"
@@ -296,7 +294,7 @@ msgstr "Passwörter stimmen nicht überein"
 
 #: InvenTree/views.py:887 templates/navbar.html:83
 msgid "System Information"
-msgstr "Systeminformation"
+msgstr "Systeminformationen"
 
 #: barcodes/api.py:53 barcodes/api.py:150
 msgid "Must provide barcode_data parameter"
@@ -397,8 +395,6 @@ msgid "Enter quantity for build output"
 msgstr "Menge für den Bau-Ausgabe angeben"
 
 #: build/forms.py:92 order/forms.py:231 stock/forms.py:117
-#, fuzzy
-#| msgid "Serial Number"
 msgid "Serial Numbers"
 msgstr "Seriennummer"
 
@@ -481,7 +477,7 @@ msgstr "Kurze Beschreibung des Baus"
 #: build/models.py:146 build/templates/build/build_base.html:121
 #: build/templates/build/detail.html:77
 msgid "Parent Build"
-msgstr "Eltern-Bau"
+msgstr "Eltern-Bauauftrag"
 
 #: build/models.py:147
 msgid "BuildOrder to which this build is allocated"
@@ -582,14 +578,10 @@ msgid "Completion Date"
 msgstr "Fertigstellungsdatum"
 
 #: build/models.py:233
-#, fuzzy
-#| msgid "Completed"
 msgid "completed by"
-msgstr "Fertig"
+msgstr "Fertiggestellt von"
 
 #: build/models.py:241
-#, fuzzy
-#| msgid "Issued By"
 msgid "Issued by"
 msgstr "Aufgegeben von"
 
@@ -640,7 +632,7 @@ msgstr "Notizen"
 
 #: build/models.py:262
 msgid "Extra build notes"
-msgstr "Extranotizen für den Bau"
+msgstr "Extranotizen für den Bauauftrag"
 
 #: build/models.py:673
 msgid "No build output specified"
@@ -1401,7 +1393,7 @@ msgstr "Kaufbar"
 
 #: common/models.py:172
 msgid "Parts are purchaseable by default"
-msgstr "Artikel kaufbar als Standard"
+msgstr "Artikel sind grundsätzlich kaufbar"
 
 #: common/models.py:178 part/models.py:855 part/templates/part/detail.html:210
 #: templates/js/table_filters.js:312
@@ -1410,7 +1402,7 @@ msgstr "Verkäuflich"
 
 #: common/models.py:179
 msgid "Parts are salable by default"
-msgstr "Artikel verkaufbar als Standard"
+msgstr "Artikel sind grundsätzlich verkaufbar"
 
 #: common/models.py:185 part/models.py:845 part/templates/part/detail.html:190
 #: templates/js/table_filters.js:32 templates/js/table_filters.js:316
@@ -1419,7 +1411,7 @@ msgstr "nachverfolgbar"
 
 #: common/models.py:186
 msgid "Parts are trackable by default"
-msgstr "Artikel verfolgbar als Standard"
+msgstr "Artikel sind grundsätzlich verfolgbar"
 
 #: common/models.py:192 part/models.py:865 part/templates/part/detail.html:150
 #: templates/js/table_filters.js:28
@@ -1436,7 +1428,7 @@ msgstr "zeige Bestand in Eingabemasken"
 
 #: common/models.py:200
 msgid "Display available part quantity in some forms"
-msgstr "zeige den verfügbaren Bestand in einigen Eingabemasken"
+msgstr "Zeige den verfügbaren Bestand in einigen Eingabemasken"
 
 #: common/models.py:206
 msgid "Debug Mode"
@@ -1444,7 +1436,7 @@ msgstr "Entwickler-Modus"
 
 #: common/models.py:207
 msgid "Generate reports in debug mode (HTML output)"
-msgstr "Bercihte ich Entwickler-Modus generieren (als HTML)"
+msgstr "Berichte im Entwickler-Modus generieren (als HTML)"
 
 #: common/models.py:213
 msgid "Page Size"
@@ -1468,7 +1460,7 @@ msgstr "Bestands-Ablauf"
 
 #: common/models.py:232
 msgid "Enable stock expiry functionality"
-msgstr "Bestands-Ablauf ermöglichen"
+msgstr "Ablaufen von Bestand ermöglichen"
 
 #: common/models.py:238
 msgid "Sell Expired Stock"
@@ -1485,8 +1477,8 @@ msgstr "Bestands-Stehzeit"
 #: common/models.py:246
 msgid "Number of days stock items are considered stale before expiring"
 msgstr ""
-"Anzahl an Tagen an denen Bestandsobjekte als abgestanden markiert werden "
-"bevor sie ablaufen"
+"Anzahl an Tagen, an denen Bestand als abgestanden markiert wird, bevor sie "
+"ablaufen"
 
 #: common/models.py:248 part/templates/part/detail.html:121
 msgid "days"
@@ -1514,7 +1506,7 @@ msgstr "Gruppieren nach Teil"
 
 #: common/models.py:268
 msgid "Group stock items by part reference in table views"
-msgstr "BestandsObjekte in Tabellen anhand von Teil-Referenz gruppieren"
+msgstr "Bestand in Tabellen anhand von Teil-Referenz gruppieren"
 
 #: common/models.py:274
 msgid "Recent Stock Count"
@@ -1522,7 +1514,7 @@ msgstr "aktueller Bestand"
 
 #: common/models.py:275
 msgid "Number of recent stock items to display on index page"
-msgstr "Anzahl der aktuellen BestandsObjekte auf der Startseite"
+msgstr "Anzahl des geänderten Bestands auf der Startseite"
 
 #: common/models.py:281
 msgid "Build Order Reference Prefix"
@@ -1694,30 +1686,24 @@ msgid "Link to external company information"
 msgstr "Link auf externe Firmeninformation"
 
 #: company/models.py:129
-#, fuzzy
-#| msgid "Customer"
 msgid "is customer"
-msgstr "Kunde"
+msgstr "ist Kunde"
 
 #: company/models.py:129
 msgid "Do you sell items to this company?"
 msgstr "Verkaufen Sie Teile an diese Firma?"
 
 #: company/models.py:131
-#, fuzzy
-#| msgid "Supplier"
 msgid "is supplier"
-msgstr "Zulieferer"
+msgstr "ist Zulieferer"
 
 #: company/models.py:131
 msgid "Do you purchase items from this company?"
 msgstr "Kaufen Sie Teile von dieser Firma?"
 
 #: company/models.py:133
-#, fuzzy
-#| msgid "Manufacturer"
 msgid "is manufacturer"
-msgstr "Hersteller"
+msgstr "ist Hersteller"
 
 #: company/models.py:133
 msgid "Does this company manufacture parts?"
@@ -1811,13 +1797,11 @@ msgstr "Verpackungen"
 
 #: company/models.py:371
 msgid "Part packaging"
-msgstr "Teile-Packaging"
+msgstr "Teile-Verpackungen"
 
 #: company/models.py:373
-#, fuzzy
-#| msgid "Order Multiple"
 msgid "multiple"
-msgstr "Bestellvielfaches"
+msgstr "Vielfache"
 
 #: company/templates/company/assigned_stock.html:10
 #: company/templates/company/navbar.html:51
@@ -1846,10 +1830,8 @@ msgid "Create Purchase Order"
 msgstr "Bestellung anlegen"
 
 #: company/templates/company/company_base.html:51
-#, fuzzy
-#| msgid "Edited company information"
 msgid "Edit company information"
-msgstr "Firmeninformation bearbeitet"
+msgstr "Firmeninformation bearbeiten"
 
 #: company/templates/company/company_base.html:56 company/views.py:324
 msgid "Delete Company"
@@ -2318,16 +2300,12 @@ msgid ""
 msgstr "Zieldatum für Auftrags-Fertigstellung."
 
 #: order/forms.py:233
-#, fuzzy
-#| msgid "Part stock is tracked by serial number"
 msgid "Enter stock item serial numbers"
-msgstr "Teilebestand wird per Seriennummer verfolgt"
+msgstr "Seriennummern für BestandsObjekt eingeben"
 
 #: order/forms.py:239
-#, fuzzy
-#| msgid "Select quantity of stock to allocate"
 msgid "Enter quantity of stock items"
-msgstr "Menge der BestandsObjekt für Zuordnung auswählen"
+msgstr "Menge der BestandsObjekt eingeben"
 
 #: order/models.py:99
 msgid "Order reference"
@@ -2448,10 +2426,8 @@ msgid "Unit purchase price"
 msgstr "EK-Preis pro Einheit"
 
 #: order/models.py:736 order/models.py:738
-#, fuzzy
-#| msgid "Stock item has been allocated"
 msgid "Stock item has not been assigned"
-msgstr "BestandsObjekt zugewiesen"
+msgstr "BestandsObjekt wurde nicht zugewiesen"
 
 #: order/models.py:742
 msgid "Cannot allocate stock item to a line with a different part"
@@ -2585,10 +2561,8 @@ msgid "Select Purchase Order"
 msgstr "Bestellung auswählen"
 
 #: order/templates/order/order_wizard/select_pos.html:45
-#, fuzzy
-#| msgid "Create new purchase order"
 msgid "Create new purchase order for {{ supplier.name }}"
-msgstr "Neue Bestellung anlegen"
+msgstr "Neue Bestellung für {{ supplier.name }} anlegen"
 
 #: order/templates/order/order_wizard/select_pos.html:68
 msgid "Select a purchase order for"
@@ -2684,10 +2658,8 @@ msgid "Error: Referenced part has been removed"
 msgstr "Fehler: verknüpftes Teil wurde gelöscht"
 
 #: order/templates/order/receive_parts.html:57
-#, fuzzy
-#| msgid "Remove allocation"
 msgid "Remove line"
-msgstr "Zuordnung entfernen"
+msgstr "Position entfernen"
 
 #: order/templates/order/sales_order_base.html:15
 msgid "This SalesOrder has not been fully allocated"
@@ -2745,20 +2717,16 @@ msgid "Fulfilled"
 msgstr "Erledigt"
 
 #: order/templates/order/sales_order_detail.html:279
-#, fuzzy
-#| msgid "Add serial number"
 msgid "Allocate serial numbers"
-msgstr "Seriennummer hinzufügen"
+msgstr "Seriennummern zuweisen"
 
 #: order/templates/order/sales_order_detail.html:282 templates/js/build.js:585
 msgid "Allocate stock"
 msgstr "Lagerbestand zuweisen"
 
 #: order/templates/order/sales_order_detail.html:285
-#, fuzzy
-#| msgid "Purchase Price"
 msgid "Purchase stock"
-msgstr "EK-Preis"
+msgstr "Einkaufs-Bestand"
 
 #: order/templates/order/sales_order_detail.html:289 templates/js/build.js:578
 #: templates/js/build.js:992
@@ -2800,10 +2768,8 @@ msgstr ""
 "ist."
 
 #: order/templates/order/so_allocate_by_serial.html:9
-#, fuzzy
-#| msgid "Part stock is tracked by serial number"
 msgid "Allocate stock items by serial number"
-msgstr "Teilebestand wird per Seriennummer verfolgt"
+msgstr "Teilebestand per Seriennummer zuweisen"
 
 #: order/templates/order/so_allocation_delete.html:7
 msgid "This action will unallocate the following stock from the Sales Order"
@@ -2935,40 +2901,28 @@ msgid "Deleted line item"
 msgstr "Position gelöscht"
 
 #: order/views.py:1306
-#, fuzzy
-#| msgid "Latest Serial Number"
 msgid "Allocate Serial Numbers"
-msgstr "letzte Seriennummer"
+msgstr "Seriennummern zuweisen"
 
 #: order/views.py:1351
-#, fuzzy
-#| msgid "Items"
 msgid "items"
-msgstr "Positionen"
+msgstr "Teile"
 
 #: order/views.py:1367
-#, fuzzy
-#| msgid "Delete line item"
 msgid "Select line item"
-msgstr "Position löschen"
+msgstr "Position auswählen"
 
 #: order/views.py:1398
-#, fuzzy
-#| msgid "No matching stock item found"
 msgid "No matching item for serial"
-msgstr "Keine passende BestandsObjekt gefunden"
+msgstr "Kein passends Teil für Seriennummer gefunden"
 
 #: order/views.py:1408
-#, fuzzy
-#| msgid "Count stock"
 msgid "is not in stock"
-msgstr "Bestand zählen"
+msgstr "ist nicht auf Lager"
 
 #: order/views.py:1416
-#, fuzzy
-#| msgid "Allocated to Orders"
 msgid "already allocated to an order"
-msgstr "zu Bauaufträgen zugeordnet"
+msgstr "bereits einem Auftrag zugeordnet"
 
 #: order/views.py:1470
 msgid "Allocate Stock to Order"
@@ -3130,10 +3084,8 @@ msgid "Default location for parts in this category"
 msgstr "Standard-Lagerort für Teile dieser Kategorie"
 
 #: part/models.py:76
-#, fuzzy
-#| msgid "Default Currency"
 msgid "Default keywords"
-msgstr "Standard-Währung"
+msgstr "Standard Stichwörter"
 
 #: part/models.py:76
 msgid "Default keywords for parts in this category"
@@ -3312,8 +3264,6 @@ msgid "Part notes - supports Markdown formatting"
 msgstr "Bemerkungen - unterstüzt Markdown-Formatierung"
 
 #: part/models.py:874
-#, fuzzy
-#| msgid "BOM line checksum"
 msgid "BOM checksum"
 msgstr "Prüfsumme der Stückliste"
 
@@ -3323,11 +3273,11 @@ msgstr "Prüfsumme der Stückliste gespeichert"
 
 #: part/models.py:877
 msgid "BOM checked by"
-msgstr ""
+msgstr "Stückliste kontrolliert von"
 
 #: part/models.py:879
 msgid "BOM checked date"
-msgstr ""
+msgstr "BOM Kontrolldatum"
 
 #: part/models.py:881 part/templates/part/detail.html:126
 #: templates/js/order.js:293
@@ -3335,10 +3285,8 @@ msgid "Creation Date"
 msgstr "Erstelldatum"
 
 #: part/models.py:883
-#, fuzzy
-#| msgid "Creation Date"
 msgid "Creation User"
-msgstr "Erstelldatum"
+msgstr "Erstellungs-Nutzer"
 
 #: part/models.py:1927
 msgid "Test templates can only be created for trackable parts"
@@ -3409,10 +3357,8 @@ msgid "Parameter Template"
 msgstr "Parameter Vorlage"
 
 #: part/models.py:2058
-#, fuzzy
-#| msgid "Test Data"
 msgid "Data"
-msgstr "Testdaten"
+msgstr "Wert"
 
 #: part/models.py:2058
 msgid "Parameter Value"
@@ -3605,10 +3551,8 @@ msgid "File Fields"
 msgstr "Datei-Felder"
 
 #: part/templates/part/bom_upload/select_fields.html:47
-#, fuzzy
-#| msgid "Remove row"
 msgid "Remove column"
-msgstr "Zeile entfernen"
+msgstr "Spalte entfernen"
 
 #: part/templates/part/bom_upload/select_fields.html:58
 msgid "Match Fields"
@@ -3888,11 +3832,11 @@ msgstr "Teil kann nicht in Baugruppen benutzt werden"
 
 #: part/templates/part/detail.html:193
 msgid "Part stock is tracked by serial number"
-msgstr "Teilebestand wird per Seriennummer verfolgt"
+msgstr "Teil wird per Seriennummer verfolgt"
 
 #: part/templates/part/detail.html:195
 msgid "Part stock is not tracked by serial number"
-msgstr "Teilebestand wird nicht per Seriennummer verfolgt"
+msgstr "Teil wird nicht per Seriennummer verfolgt"
 
 #: part/templates/part/detail.html:203 part/templates/part/detail.html:205
 msgid "Part can be purchased from external suppliers"
@@ -3986,16 +3930,12 @@ msgid "Delete"
 msgstr "Löschen"
 
 #: part/templates/part/params.html:68
-#, fuzzy
-#| msgid "Template"
 msgid "New Template"
-msgstr "Vorlage"
+msgstr "Neue Vorlage"
 
 #: part/templates/part/params.html:69
-#, fuzzy
-#| msgid "Create Part Parameter Template"
 msgid "Create New Parameter Template"
-msgstr "Teilparametervorlage anlegen"
+msgstr "Neue Teilparametervorlage anlegen"
 
 #: part/templates/part/part_app_base.html:11
 msgid "Part List"
@@ -4082,61 +4022,45 @@ msgstr "Im Bau"
 
 #: part/templates/part/part_base.html:249
 msgid "Calculate"
-msgstr ""
+msgstr "Berechnen"
 
 #: part/templates/part/part_pricing.html:8
-#, fuzzy
-#| msgid "Pricing Information"
 msgid "Pricing information for:"
-msgstr "Preisinformationen ansehen"
+msgstr "Preisinformationen für:"
 
 #: part/templates/part/part_pricing.html:24
-#, fuzzy
-#| msgid "Supplier Part Pricing"
 msgid "Supplier Pricing"
-msgstr "Zulieferer-Teil Bepreisung"
+msgstr "Zulieferer-Preise"
 
 #: part/templates/part/part_pricing.html:28
 #: part/templates/part/part_pricing.html:54
-#, fuzzy
-#| msgid "Units"
 msgid "Unit Cost"
-msgstr "Einheiten"
+msgstr "Stückpreis"
 
 #: part/templates/part/part_pricing.html:34
 #: part/templates/part/part_pricing.html:60
 msgid "Total Cost"
-msgstr ""
+msgstr "Gesamtkosten"
 
 #: part/templates/part/part_pricing.html:42
-#, fuzzy
-#| msgid "No pricing available"
 msgid "No supplier pricing available"
-msgstr "Keine Preisinformation verfügbar"
+msgstr "Keine Zulieferer-Preise verfügbar"
 
 #: part/templates/part/part_pricing.html:50
-#, fuzzy
-#| msgid "BOM Price"
 msgid "BOM Pricing"
-msgstr "Stücklistenpreis"
+msgstr "Stücklistenpreise"
 
 #: part/templates/part/part_pricing.html:68
-#, fuzzy
-#| msgid "BOM pricing is incomplete"
 msgid "Note: BOM pricing is incomplete for this part"
-msgstr "Stücklistenbepreisung ist unvollständig"
+msgstr "Anmerkung: Stücklistenbepreisung für dieses Teil ist unvollständig"
 
 #: part/templates/part/part_pricing.html:75
-#, fuzzy
-#| msgid "No pricing available"
 msgid "No BOM pricing available"
-msgstr "Keine Preisinformation verfügbar"
+msgstr "Keine Stücklisten-Preise verfügbar"
 
 #: part/templates/part/part_pricing.html:85
-#, fuzzy
-#| msgid "No price breaks have been added for this part"
 msgid "No pricing information is available for this part."
-msgstr "Keine Preisstaffelung für dieses Teil"
+msgstr "Keine Preise für dieses Teil verfügbar"
 
 #: part/templates/part/part_tests.html:17
 msgid "Add Test Template"
@@ -4181,7 +4105,7 @@ msgstr "Kein Bestand"
 
 #: part/templates/part/stock_count.html:9 templates/InvenTree/index.html:129
 msgid "Low Stock"
-msgstr "Niedriger Bestand"
+msgstr "niedriger Bestand"
 
 #: part/templates/part/subcategories.html:5
 msgid "Child Categories"
@@ -5020,7 +4944,7 @@ msgstr "Barcode-Bezeichner"
 #: stock/templates/stock/item_base.html:302 templates/InvenTree/search.html:167
 #: templates/js/build.js:655 templates/navbar.html:29
 msgid "Build"
-msgstr "Bau"
+msgstr "Bauauftrag"
 
 #: stock/templates/stock/item_base.html:323
 msgid "Parent Item"
@@ -5194,10 +5118,8 @@ msgid "Children"
 msgstr "Kinder"
 
 #: stock/templates/stock/stock_adjust.html:43
-#, fuzzy
-#| msgid "Remove stock item"
 msgid "Remove item"
-msgstr "BestandsObjekt entfernen"
+msgstr "Teil entfernen"
 
 #: stock/templates/stock/stock_app_base.html:15
 msgid "Loading..."
@@ -5438,7 +5360,7 @@ msgstr "neueste Teile"
 
 #: templates/InvenTree/index.html:99
 msgid "BOM Waiting Validation"
-msgstr "Stücklisten erwartet Validierung"
+msgstr "Stücklisten erwarten Validierung"
 
 #: templates/InvenTree/index.html:128
 msgid "Recently Updated"
@@ -5482,7 +5404,7 @@ msgstr "Suchergebnisse"
 
 #: templates/InvenTree/search.html:23
 msgid "Enter a search query"
-msgstr "eine Suche angeben"
+msgstr "Eine Sucheanfrage eingeben"
 
 #: templates/InvenTree/search.html:252 templates/js/stock.js:301
 msgid "Shipped to customer"
@@ -5602,7 +5524,7 @@ msgstr "InvenTree-Einstellungen"
 
 #: templates/InvenTree/settings/tabs.html:16
 msgid "Global"
-msgstr "Global"
+msgstr "Systemweit"
 
 #: templates/InvenTree/settings/tabs.html:19
 msgid "Report"
@@ -5898,7 +5820,7 @@ msgstr "Bestand bestellen"
 
 #: templates/js/build.js:632
 msgid "No builds matching query"
-msgstr "Keine Baue passen zur Anfrage"
+msgstr "Keine Bauaufträge passen zur Anfrage"
 
 #: templates/js/build.js:649 templates/js/part.js:323 templates/js/stock.js:512
 #: templates/js/stock.js:1250
@@ -5938,28 +5860,20 @@ msgid "Assembled part"
 msgstr "Baugruppe"
 
 #: templates/js/filters.js:193
-#, fuzzy
-#| msgid "Select Category"
 msgid "Select filter"
-msgstr "Kategorie auswählen"
+msgstr "Filter auswählen"
 
 #: templates/js/filters.js:268
-#, fuzzy
-#| msgid "Add new parameter"
 msgid "Add new filter"
-msgstr "Parameter hinzufügen"
+msgstr "Filter hinzufügen"
 
 #: templates/js/filters.js:271
-#, fuzzy
-#| msgid "Part Filters"
 msgid "Clear all filters"
-msgstr "Teil Filter"
+msgstr "Filter entfernen"
 
 #: templates/js/filters.js:296
-#, fuzzy
-#| msgid "Create Variant"
 msgid "Create filter"
-msgstr "Variante anlegen"
+msgstr "Filter anlegen"
 
 #: templates/js/label.js:10 templates/js/report.js:98
 msgid "Select Stock Items"
@@ -6004,7 +5918,7 @@ msgstr "Label-Vorlage auswählen"
 
 #: templates/js/modals.js:256
 msgid "Waiting for server..."
-msgstr ""
+msgstr "Warte auf Server..."
 
 #: templates/js/modals.js:406
 msgid "Show Error Information"
@@ -6025,7 +5939,7 @@ msgstr "Lade Daten"
 #: templates/js/modals.js:549 templates/js/modals.js:808
 #: templates/modals.html:29 templates/modals.html:53
 msgid "Submit"
-msgstr "abschicken"
+msgstr "Abschicken"
 
 #: templates/js/modals.js:550 templates/js/modals.js:809
 #: templates/modals.html:28 templates/modals.html:52 templates/modals.html:93
@@ -6192,7 +6106,7 @@ msgstr "BestandsObjekt(e) müssen vor dem Reportdruck ausgewählt werden"
 #: templates/js/report.js:223 templates/js/report.js:277
 #: templates/js/report.js:331
 msgid "No Reports Found"
-msgstr "Keine Reports gefunden"
+msgstr "Keine Berichte gefunden"
 
 #: templates/js/report.js:117
 msgid "No report templates found which match selected stock item(s)"
@@ -6355,16 +6269,12 @@ msgid "No user information"
 msgstr "Keine Benutzerinformation"
 
 #: templates/js/stock.js:979
-#, fuzzy
-#| msgid "Edit Stock Tracking Entry"
 msgid "Edit tracking entry"
-msgstr "Lagerbestands-Tracking-Eintrag bearbeiten"
+msgstr "Tracking-Eintrag bearbeiten"
 
 #: templates/js/stock.js:980
-#, fuzzy
-#| msgid "Delete Stock Tracking Entry"
 msgid "Delete tracking entry"
-msgstr "Lagerbestands-Tracking-Eintrag löschen"
+msgstr "Tracking-Eintrag löschen"
 
 #: templates/js/stock.js:1089
 msgid "Create New Location"
@@ -6674,7 +6584,7 @@ msgstr "Serverstatus"
 
 #: templates/stats.html:21
 msgid "Healthy"
-msgstr "Gesundheit"
+msgstr "Gesund"
 
 #: templates/stats.html:23
 msgid "Issues detected"
@@ -6698,7 +6608,7 @@ msgstr "Label drucken"
 
 #: templates/stock_table.html:42
 msgid "Print test reports"
-msgstr "Test Reports drucken"
+msgstr "Test-Berichte drucken"
 
 #: templates/stock_table.html:53
 msgid "Add to selected stock items"
@@ -6800,9 +6710,94 @@ msgstr "Berechtigungen Einträge zu ändern"
 msgid "Permission to delete items"
 msgstr "Berechtigung Einträge zu löschen"
 
+#~ msgid "Create purchase order"
+#~ msgstr "Neue Bestellung anlegen"
+
+#~ msgid "Delete company"
+#~ msgstr "Firma löschen"
+
+#, fuzzy
+#~| msgid "Show QR Code"
+#~ msgid "Show QR code"
+#~ msgstr "QR-Code anzeigen"
+
 #~ msgid "Serial numbers"
 #~ msgstr "Seriennummern"
 
+#~ msgid "name"
+#~ msgstr "Name"
+
+#~ msgid "description"
+#~ msgstr "Beschreibung"
+
+#~ msgid "target date"
+#~ msgstr "Zieldatum"
+
+#~ msgid "data"
+#~ msgstr "Wert"
+
+#~ msgid "attachment"
+#~ msgstr "Anhang"
+
+#~ msgid "comment"
+#~ msgstr "Kommentar"
+
+#~ msgid "user"
+#~ msgstr "Benutzer"
+
+#, fuzzy
+#~| msgid "Completion Date"
+#~ msgid "completion date"
+#~ msgstr "Fertigstellungsdatum"
+
+#, fuzzy
+#~| msgid "Responsible"
+#~ msgid "responsible"
+#~ msgstr "Verantwortlicher Benutzer"
+
+#, fuzzy
+#~| msgid "Currency"
+#~ msgid "currency"
+#~ msgstr "Währung"
+
+#, fuzzy
+#~| msgid "Packaging"
+#~ msgid "packaging"
+#~ msgstr "Verpackungen"
+
+#, fuzzy
+#~| msgid "Default Location"
+#~ msgid "Default location"
+#~ msgstr "Standard-Lagerort"
+
+#~ msgid "creation date"
+#~ msgstr "Erstelldatum"
+
+#, fuzzy
+#~| msgid "parts"
+#~ msgid "part"
+#~ msgstr "Teile"
+
+#, fuzzy
+#~| msgid "Template"
+#~ msgid "template"
+#~ msgstr "Vorlage"
+
+#, fuzzy
+#~| msgid "Notes"
+#~ msgid "notes"
+#~ msgstr "Notizen"
+
+#, fuzzy
+#~| msgid "Unlink"
+#~ msgid "link"
+#~ msgstr "Entfernen"
+
+#, fuzzy
+#~| msgid "Default Location"
+#~ msgid "Default_location"
+#~ msgstr "Standard-Lagerort"
+
 #~ msgid "Buy parts"
 #~ msgstr "Teile kaufen"
 

From c68220a597f33aa17157cde49885198e7cab314f Mon Sep 17 00:00:00 2001
From: Matthias <matmair@live.de>
Date: Sat, 3 Apr 2021 14:11:28 +0200
Subject: [PATCH 08/16] migrations for all the translated models, totally
 forgot that

---
 .../migrations/0027_auto_20210403_1210.py     |  58 +++++++++
 .../migrations/0032_auto_20210403_1210.py     |  44 +++++++
 .../migrations/0044_auto_20210403_1210.py     |  57 +++++++++
 .../migrations/0064_auto_20210403_1210.py     | 110 ++++++++++++++++++
 .../migrations/0059_auto_20210403_1210.py     |  70 +++++++++++
 5 files changed, 339 insertions(+)
 create mode 100644 InvenTree/build/migrations/0027_auto_20210403_1210.py
 create mode 100644 InvenTree/company/migrations/0032_auto_20210403_1210.py
 create mode 100644 InvenTree/order/migrations/0044_auto_20210403_1210.py
 create mode 100644 InvenTree/part/migrations/0064_auto_20210403_1210.py
 create mode 100644 InvenTree/stock/migrations/0059_auto_20210403_1210.py

diff --git a/InvenTree/build/migrations/0027_auto_20210403_1210.py b/InvenTree/build/migrations/0027_auto_20210403_1210.py
new file mode 100644
index 0000000000..4f5947f70e
--- /dev/null
+++ b/InvenTree/build/migrations/0027_auto_20210403_1210.py
@@ -0,0 +1,58 @@
+# Generated by Django 3.0.7 on 2021-04-03 12:10
+
+import InvenTree.models
+from django.conf import settings
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        migrations.swappable_dependency(settings.AUTH_USER_MODEL),
+        ('users', '0005_owner_model'),
+        ('build', '0026_auto_20210216_1539'),
+    ]
+
+    operations = [
+        migrations.AlterField(
+            model_name='build',
+            name='completed_by',
+            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='builds_completed', to=settings.AUTH_USER_MODEL, verbose_name='completed by'),
+        ),
+        migrations.AlterField(
+            model_name='build',
+            name='completion_date',
+            field=models.DateField(blank=True, null=True, verbose_name='Completion Date'),
+        ),
+        migrations.AlterField(
+            model_name='build',
+            name='issued_by',
+            field=models.ForeignKey(blank=True, help_text='User who issued this build order', null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='builds_issued', to=settings.AUTH_USER_MODEL, verbose_name='Issued by'),
+        ),
+        migrations.AlterField(
+            model_name='build',
+            name='responsible',
+            field=models.ForeignKey(blank=True, help_text='User responsible for this build order', null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='builds_responsible', to='users.Owner', verbose_name='Responsible'),
+        ),
+        migrations.AlterField(
+            model_name='buildorderattachment',
+            name='attachment',
+            field=models.FileField(help_text='Select file to attach', upload_to=InvenTree.models.rename_attachment, verbose_name='Attachment'),
+        ),
+        migrations.AlterField(
+            model_name='buildorderattachment',
+            name='comment',
+            field=models.CharField(blank=True, help_text='File comment', max_length=100, verbose_name='Comment'),
+        ),
+        migrations.AlterField(
+            model_name='buildorderattachment',
+            name='upload_date',
+            field=models.DateField(auto_now_add=True, null=True, verbose_name='upload date'),
+        ),
+        migrations.AlterField(
+            model_name='buildorderattachment',
+            name='user',
+            field=models.ForeignKey(blank=True, help_text='User', null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL, verbose_name='User'),
+        ),
+    ]
diff --git a/InvenTree/company/migrations/0032_auto_20210403_1210.py b/InvenTree/company/migrations/0032_auto_20210403_1210.py
new file mode 100644
index 0000000000..e3572eb3b6
--- /dev/null
+++ b/InvenTree/company/migrations/0032_auto_20210403_1210.py
@@ -0,0 +1,44 @@
+# Generated by Django 3.0.7 on 2021-04-03 12:10
+
+import django.core.validators
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('company', '0031_auto_20210103_2215'),
+    ]
+
+    operations = [
+        migrations.AlterField(
+            model_name='company',
+            name='is_customer',
+            field=models.BooleanField(default=False, help_text='Do you sell items to this company?', verbose_name='is customer'),
+        ),
+        migrations.AlterField(
+            model_name='company',
+            name='is_manufacturer',
+            field=models.BooleanField(default=False, help_text='Does this company manufacture parts?', verbose_name='is manufacturer'),
+        ),
+        migrations.AlterField(
+            model_name='company',
+            name='is_supplier',
+            field=models.BooleanField(default=True, help_text='Do you purchase items from this company?', verbose_name='is supplier'),
+        ),
+        migrations.AlterField(
+            model_name='supplierpart',
+            name='base_cost',
+            field=models.DecimalField(decimal_places=3, default=0, help_text='Minimum charge (e.g. stocking fee)', max_digits=10, validators=[django.core.validators.MinValueValidator(0)], verbose_name='base cost'),
+        ),
+        migrations.AlterField(
+            model_name='supplierpart',
+            name='multiple',
+            field=models.PositiveIntegerField(default=1, help_text='Order multiple', validators=[django.core.validators.MinValueValidator(1)], verbose_name='multiple'),
+        ),
+        migrations.AlterField(
+            model_name='supplierpart',
+            name='packaging',
+            field=models.CharField(blank=True, help_text='Part packaging', max_length=50, null=True, verbose_name='Packaging'),
+        ),
+    ]
diff --git a/InvenTree/order/migrations/0044_auto_20210403_1210.py b/InvenTree/order/migrations/0044_auto_20210403_1210.py
new file mode 100644
index 0000000000..e0fa3692fe
--- /dev/null
+++ b/InvenTree/order/migrations/0044_auto_20210403_1210.py
@@ -0,0 +1,57 @@
+# Generated by Django 3.0.7 on 2021-04-03 12:10
+
+import InvenTree.models
+from django.conf import settings
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        migrations.swappable_dependency(settings.AUTH_USER_MODEL),
+        ('order', '0043_auto_20210330_0013'),
+    ]
+
+    operations = [
+        migrations.AlterField(
+            model_name='purchaseorderattachment',
+            name='attachment',
+            field=models.FileField(help_text='Select file to attach', upload_to=InvenTree.models.rename_attachment, verbose_name='Attachment'),
+        ),
+        migrations.AlterField(
+            model_name='purchaseorderattachment',
+            name='comment',
+            field=models.CharField(blank=True, help_text='File comment', max_length=100, verbose_name='Comment'),
+        ),
+        migrations.AlterField(
+            model_name='purchaseorderattachment',
+            name='upload_date',
+            field=models.DateField(auto_now_add=True, null=True, verbose_name='upload date'),
+        ),
+        migrations.AlterField(
+            model_name='purchaseorderattachment',
+            name='user',
+            field=models.ForeignKey(blank=True, help_text='User', null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL, verbose_name='User'),
+        ),
+        migrations.AlterField(
+            model_name='salesorderattachment',
+            name='attachment',
+            field=models.FileField(help_text='Select file to attach', upload_to=InvenTree.models.rename_attachment, verbose_name='Attachment'),
+        ),
+        migrations.AlterField(
+            model_name='salesorderattachment',
+            name='comment',
+            field=models.CharField(blank=True, help_text='File comment', max_length=100, verbose_name='Comment'),
+        ),
+        migrations.AlterField(
+            model_name='salesorderattachment',
+            name='upload_date',
+            field=models.DateField(auto_now_add=True, null=True, verbose_name='upload date'),
+        ),
+        migrations.AlterField(
+            model_name='salesorderattachment',
+            name='user',
+            field=models.ForeignKey(blank=True, help_text='User', null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL, verbose_name='User'),
+        ),
+    ]
diff --git a/InvenTree/part/migrations/0064_auto_20210403_1210.py b/InvenTree/part/migrations/0064_auto_20210403_1210.py
new file mode 100644
index 0000000000..d3f4b2b75f
--- /dev/null
+++ b/InvenTree/part/migrations/0064_auto_20210403_1210.py
@@ -0,0 +1,110 @@
+# Generated by Django 3.0.7 on 2021-04-03 12:10
+
+import InvenTree.models
+import InvenTree.validators
+from django.conf import settings
+from django.db import migrations, models
+import django.db.models.deletion
+import mptt.fields
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('stock', '0059_auto_20210403_1210'),
+        migrations.swappable_dependency(settings.AUTH_USER_MODEL),
+        ('part', '0063_bomitem_inherited'),
+    ]
+
+    operations = [
+        migrations.AlterField(
+            model_name='part',
+            name='bom_checked_by',
+            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='boms_checked', to=settings.AUTH_USER_MODEL, verbose_name='BOM checked by'),
+        ),
+        migrations.AlterField(
+            model_name='part',
+            name='bom_checked_date',
+            field=models.DateField(blank=True, null=True, verbose_name='BOM checked date'),
+        ),
+        migrations.AlterField(
+            model_name='part',
+            name='bom_checksum',
+            field=models.CharField(blank=True, help_text='Stored BOM checksum', max_length=128, verbose_name='BOM checksum'),
+        ),
+        migrations.AlterField(
+            model_name='part',
+            name='creation_date',
+            field=models.DateField(auto_now_add=True, null=True, verbose_name='Creation Date'),
+        ),
+        migrations.AlterField(
+            model_name='part',
+            name='creation_user',
+            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='parts_created', to=settings.AUTH_USER_MODEL, verbose_name='Creation User'),
+        ),
+        migrations.AlterField(
+            model_name='part',
+            name='responsible',
+            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='parts_responible', to=settings.AUTH_USER_MODEL, verbose_name='Responsible'),
+        ),
+        migrations.AlterField(
+            model_name='partattachment',
+            name='attachment',
+            field=models.FileField(help_text='Select file to attach', upload_to=InvenTree.models.rename_attachment, verbose_name='Attachment'),
+        ),
+        migrations.AlterField(
+            model_name='partattachment',
+            name='comment',
+            field=models.CharField(blank=True, help_text='File comment', max_length=100, verbose_name='Comment'),
+        ),
+        migrations.AlterField(
+            model_name='partattachment',
+            name='upload_date',
+            field=models.DateField(auto_now_add=True, null=True, verbose_name='upload date'),
+        ),
+        migrations.AlterField(
+            model_name='partattachment',
+            name='user',
+            field=models.ForeignKey(blank=True, help_text='User', null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL, verbose_name='User'),
+        ),
+        migrations.AlterField(
+            model_name='partcategory',
+            name='default_keywords',
+            field=models.CharField(blank=True, help_text='Default keywords for parts in this category', max_length=250, null=True, verbose_name='Default keywords'),
+        ),
+        migrations.AlterField(
+            model_name='partcategory',
+            name='default_location',
+            field=mptt.fields.TreeForeignKey(blank=True, help_text='Default location for parts in this category', null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='default_categories', to='stock.StockLocation', verbose_name='Default Location'),
+        ),
+        migrations.AlterField(
+            model_name='partcategory',
+            name='description',
+            field=models.CharField(blank=True, help_text='Description (optional)', max_length=250, verbose_name='Description'),
+        ),
+        migrations.AlterField(
+            model_name='partcategory',
+            name='name',
+            field=models.CharField(help_text='Name', max_length=100, validators=[InvenTree.validators.validate_tree_name], verbose_name='Name'),
+        ),
+        migrations.AlterField(
+            model_name='partcategory',
+            name='parent',
+            field=mptt.fields.TreeForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='children', to='part.PartCategory', verbose_name='parent'),
+        ),
+        migrations.AlterField(
+            model_name='partparameter',
+            name='data',
+            field=models.CharField(help_text='Parameter Value', max_length=500, verbose_name='Data'),
+        ),
+        migrations.AlterField(
+            model_name='partparameter',
+            name='part',
+            field=models.ForeignKey(help_text='Parent Part', on_delete=django.db.models.deletion.CASCADE, related_name='parameters', to='part.Part', verbose_name='Part'),
+        ),
+        migrations.AlterField(
+            model_name='partparameter',
+            name='template',
+            field=models.ForeignKey(help_text='Parameter Template', on_delete=django.db.models.deletion.CASCADE, related_name='instances', to='part.PartParameterTemplate', verbose_name='Template'),
+        ),
+    ]
diff --git a/InvenTree/stock/migrations/0059_auto_20210403_1210.py b/InvenTree/stock/migrations/0059_auto_20210403_1210.py
new file mode 100644
index 0000000000..ae11eb7536
--- /dev/null
+++ b/InvenTree/stock/migrations/0059_auto_20210403_1210.py
@@ -0,0 +1,70 @@
+# Generated by Django 3.0.7 on 2021-04-03 12:10
+
+import InvenTree.fields
+import InvenTree.models
+import InvenTree.validators
+from django.conf import settings
+from django.db import migrations, models
+import django.db.models.deletion
+import mptt.fields
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        migrations.swappable_dependency(settings.AUTH_USER_MODEL),
+        ('stock', '0058_stockitem_packaging'),
+    ]
+
+    operations = [
+        migrations.AlterField(
+            model_name='stockitemattachment',
+            name='attachment',
+            field=models.FileField(help_text='Select file to attach', upload_to=InvenTree.models.rename_attachment, verbose_name='Attachment'),
+        ),
+        migrations.AlterField(
+            model_name='stockitemattachment',
+            name='comment',
+            field=models.CharField(blank=True, help_text='File comment', max_length=100, verbose_name='Comment'),
+        ),
+        migrations.AlterField(
+            model_name='stockitemattachment',
+            name='upload_date',
+            field=models.DateField(auto_now_add=True, null=True, verbose_name='upload date'),
+        ),
+        migrations.AlterField(
+            model_name='stockitemattachment',
+            name='user',
+            field=models.ForeignKey(blank=True, help_text='User', null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL, verbose_name='User'),
+        ),
+        migrations.AlterField(
+            model_name='stockitemtracking',
+            name='link',
+            field=InvenTree.fields.InvenTreeURLField(blank=True, help_text='Link to external page for further information', verbose_name='Link'),
+        ),
+        migrations.AlterField(
+            model_name='stockitemtracking',
+            name='notes',
+            field=models.CharField(blank=True, help_text='Entry notes', max_length=512, verbose_name='Notes'),
+        ),
+        migrations.AlterField(
+            model_name='stockitemtracking',
+            name='title',
+            field=models.CharField(help_text='Tracking entry title', max_length=250, verbose_name='Title'),
+        ),
+        migrations.AlterField(
+            model_name='stocklocation',
+            name='description',
+            field=models.CharField(blank=True, help_text='Description (optional)', max_length=250, verbose_name='Description'),
+        ),
+        migrations.AlterField(
+            model_name='stocklocation',
+            name='name',
+            field=models.CharField(help_text='Name', max_length=100, validators=[InvenTree.validators.validate_tree_name], verbose_name='Name'),
+        ),
+        migrations.AlterField(
+            model_name='stocklocation',
+            name='parent',
+            field=mptt.fields.TreeForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='children', to='stock.StockLocation', verbose_name='parent'),
+        ),
+    ]

From 20c455384eedb0be2ce1bd42393026bccb3d9f94 Mon Sep 17 00:00:00 2001
From: Matthias <matmair@live.de>
Date: Sun, 4 Apr 2021 22:44:14 +0200
Subject: [PATCH 09/16] added more translation-strings

---
 InvenTree/InvenTree/api.py                    |    2 +-
 InvenTree/InvenTree/forms.py                  |    3 +
 InvenTree/InvenTree/helpers.py                |   10 +-
 InvenTree/InvenTree/validators.py             |    2 +-
 InvenTree/build/forms.py                      |   13 +-
 ...403_1210.py => 0027_auto_20210404_2016.py} |   31 +-
 InvenTree/build/models.py                     |   12 +-
 ...403_1210.py => 0032_auto_20210403_1837.py} |   27 +-
 InvenTree/company/models.py                   |   11 +-
 .../company/templates/company/delete.html     |    8 +-
 .../templates/company/detail_part.html        |    2 +-
 InvenTree/label/models.py                     |    2 +-
 InvenTree/locale/de/LC_MESSAGES/django.po     | 1235 ++++++++++-------
 InvenTree/locale/en/LC_MESSAGES/django.po     | 1130 +++++++++------
 InvenTree/locale/es/LC_MESSAGES/django.po     | 1130 +++++++++------
 InvenTree/order/forms.py                      |   22 +-
 .../migrations/0044_auto_20210403_1210.py     |   57 -
 .../migrations/0044_auto_20210404_2016.py     |  233 ++++
 InvenTree/order/models.py                     |   48 +-
 .../order/templates/order/order_complete.html |    8 +-
 .../order/templates/order/order_issue.html    |    4 +-
 .../order/order_wizard/select_parts.html      |    2 +-
 .../templates/order/sales_order_detail.html   |   16 +-
 InvenTree/part/bom.py                         |    2 +-
 InvenTree/part/forms.py                       |   12 +-
 .../migrations/0064_auto_20210403_1210.py     |  110 --
 .../migrations/0064_auto_20210404_2016.py     |  218 +++
 InvenTree/part/models.py                      |   43 +-
 InvenTree/part/templates/part/bom.html        |    6 +-
 .../part/bom_upload/upload_file.html          |    2 +-
 .../part/templates/part/bom_validate.html     |    6 +-
 InvenTree/part/views.py                       |    2 +-
 .../migrations/0015_auto_20210403_1837.py     |   35 +
 InvenTree/report/models.py                    |    6 +-
 InvenTree/stock/api.py                        |    4 +-
 InvenTree/stock/forms.py                      |   16 +-
 ...403_1210.py => 0059_auto_20210404_2016.py} |   24 +-
 InvenTree/stock/models.py                     |   14 +-
 InvenTree/stock/views.py                      |   31 +-
 39 files changed, 2886 insertions(+), 1653 deletions(-)
 rename InvenTree/build/migrations/{0027_auto_20210403_1210.py => 0027_auto_20210404_2016.py} (60%)
 rename InvenTree/company/migrations/{0032_auto_20210403_1210.py => 0032_auto_20210403_1837.py} (61%)
 delete mode 100644 InvenTree/order/migrations/0044_auto_20210403_1210.py
 create mode 100644 InvenTree/order/migrations/0044_auto_20210404_2016.py
 delete mode 100644 InvenTree/part/migrations/0064_auto_20210403_1210.py
 create mode 100644 InvenTree/part/migrations/0064_auto_20210404_2016.py
 create mode 100644 InvenTree/report/migrations/0015_auto_20210403_1837.py
 rename InvenTree/stock/migrations/{0059_auto_20210403_1210.py => 0059_auto_20210404_2016.py} (69%)

diff --git a/InvenTree/InvenTree/api.py b/InvenTree/InvenTree/api.py
index 2fc85ef653..2d04195d42 100644
--- a/InvenTree/InvenTree/api.py
+++ b/InvenTree/InvenTree/api.py
@@ -7,7 +7,7 @@ from __future__ import unicode_literals
 
 import logging
 
-from django.utils.translation import ugettext as _
+from django.utils.translation import ugettext_lazy as _
 from django.http import JsonResponse
 
 from django_filters.rest_framework import DjangoFilterBackend
diff --git a/InvenTree/InvenTree/forms.py b/InvenTree/InvenTree/forms.py
index 79cdf49c3d..52d1c8758f 100644
--- a/InvenTree/InvenTree/forms.py
+++ b/InvenTree/InvenTree/forms.py
@@ -123,6 +123,7 @@ class DeleteForm(forms.Form):
     confirm_delete = forms.BooleanField(
         required=False,
         initial=False,
+        label=_('Confirm delete'),
         help_text=_('Confirm item deletion')
     )
 
@@ -155,6 +156,7 @@ class SetPasswordForm(HelperForm):
                                      required=True,
                                      initial='',
                                      widget=forms.PasswordInput(attrs={'autocomplete': 'off'}),
+                                     label=_('Enter password'),
                                      help_text=_('Enter new password'))
 
     confirm_password = forms.CharField(max_length=100,
@@ -162,6 +164,7 @@ class SetPasswordForm(HelperForm):
                                        required=True,
                                        initial='',
                                        widget=forms.PasswordInput(attrs={'autocomplete': 'off'}),
+                                       label=_('Confirm password'),
                                        help_text=_('Confirm new password'))
 
     class Meta:
diff --git a/InvenTree/InvenTree/helpers.py b/InvenTree/InvenTree/helpers.py
index 62e50bd52f..930204c58c 100644
--- a/InvenTree/InvenTree/helpers.py
+++ b/InvenTree/InvenTree/helpers.py
@@ -382,17 +382,17 @@ def extract_serial_numbers(serials, expected_quantity):
                     if a < b:
                         for n in range(a, b + 1):
                             if n in numbers:
-                                errors.append(_('Duplicate serial: {n}'.format(n=n)))
+                                errors.append(_('Duplicate serial: {n}').format(n=n))
                             else:
                                 numbers.append(n)
                     else:
-                        errors.append(_("Invalid group: {g}".format(g=group)))
+                        errors.append(_("Invalid group: {g}").format(g=group))
 
                 except ValueError:
-                    errors.append(_("Invalid group: {g}".format(g=group)))
+                    errors.append(_("Invalid group: {g}").format(g=group))
                     continue
             else:
-                errors.append(_("Invalid group: {g}".format(g=group)))
+                errors.append(_("Invalid group: {g}").format(g=group))
                 continue
 
         else:
@@ -409,7 +409,7 @@ def extract_serial_numbers(serials, expected_quantity):
 
     # The number of extracted serial numbers must match the expected quantity
     if not expected_quantity == len(numbers):
-        raise ValidationError([_("Number of unique serial number ({s}) must match quantity ({q})".format(s=len(numbers), q=expected_quantity))])
+        raise ValidationError([_("Number of unique serial number ({s}) must match quantity ({q})").format(s=len(numbers), q=expected_quantity)])
 
     return numbers
 
diff --git a/InvenTree/InvenTree/validators.py b/InvenTree/InvenTree/validators.py
index 70322df062..f8199ef20b 100644
--- a/InvenTree/InvenTree/validators.py
+++ b/InvenTree/InvenTree/validators.py
@@ -60,7 +60,7 @@ def validate_part_ipn(value):
         match = re.search(pattern, value)
 
         if match is None:
-            raise ValidationError(_('IPN must match regex pattern') + " '{pat}'".format(pat=pattern))
+            raise ValidationError(_('IPN must match regex pattern {pat}').format(pat=pattern))
 
 
 def validate_build_order_reference(value):
diff --git a/InvenTree/build/forms.py b/InvenTree/build/forms.py
index 48be9a0ffa..b947e02887 100644
--- a/InvenTree/build/forms.py
+++ b/InvenTree/build/forms.py
@@ -117,6 +117,7 @@ class BuildOutputDeleteForm(HelperForm):
 
     confirm = forms.BooleanField(
         required=False,
+        label=_('Confirm'),
         help_text=_('Confirm deletion of build output')
     )
 
@@ -138,7 +139,7 @@ class UnallocateBuildForm(HelperForm):
     Form for auto-de-allocation of stock from a build
     """
 
-    confirm = forms.BooleanField(required=False, help_text=_('Confirm unallocation of stock'))
+    confirm = forms.BooleanField(required=False, label=_('Confirm'), help_text=_('Confirm unallocation of stock'))
 
     output_id = forms.IntegerField(
         required=False,
@@ -162,7 +163,7 @@ class UnallocateBuildForm(HelperForm):
 class AutoAllocateForm(HelperForm):
     """ Form for auto-allocation of stock to a build """
 
-    confirm = forms.BooleanField(required=True, help_text=_('Confirm stock allocation'))
+    confirm = forms.BooleanField(required=True, label=_('Confirm'), help_text=_('Confirm stock allocation'))
 
     # Keep track of which build output we are interested in
     output = forms.ModelChoiceField(
@@ -209,15 +210,17 @@ class CompleteBuildOutputForm(HelperForm):
 
     location = forms.ModelChoiceField(
         queryset=StockLocation.objects.all(),
+        label = _('Location'),
         help_text=_('Location of completed parts'),
     )
 
     confirm_incomplete = forms.BooleanField(
         required=False,
+        label=_('Confirm incomplete'),
         help_text=_("Confirm completion with incomplete stock allocation")
     )
 
-    confirm = forms.BooleanField(required=True, help_text=_('Confirm build completion'))
+    confirm = forms.BooleanField(required=True, label=_('Confirm'), help_text=_('Confirm build completion'))
 
     output = forms.ModelChoiceField(
         queryset=StockItem.objects.all(),  # Queryset is narrowed in the view
@@ -237,7 +240,7 @@ class CompleteBuildOutputForm(HelperForm):
 class CancelBuildForm(HelperForm):
     """ Form for cancelling a build """
 
-    confirm_cancel = forms.BooleanField(required=False, help_text=_('Confirm build cancellation'))
+    confirm_cancel = forms.BooleanField(required=False, label=_('Confirm cancel'), help_text=_('Confirm build cancellation'))
 
     class Meta:
         model = Build
@@ -251,7 +254,7 @@ class EditBuildItemForm(HelperForm):
     Form for creating (or editing) a BuildItem object.
     """
 
-    quantity = RoundingDecimalFormField(max_digits=10, decimal_places=5, help_text=_('Select quantity of stock to allocate'))
+    quantity = RoundingDecimalFormField(max_digits=10, decimal_places=5, label=_('Quantity'), help_text=_('Select quantity of stock to allocate'))
 
     part_id = forms.IntegerField(required=False, widget=forms.HiddenInput())
 
diff --git a/InvenTree/build/migrations/0027_auto_20210403_1210.py b/InvenTree/build/migrations/0027_auto_20210404_2016.py
similarity index 60%
rename from InvenTree/build/migrations/0027_auto_20210403_1210.py
rename to InvenTree/build/migrations/0027_auto_20210404_2016.py
index 4f5947f70e..f4a2c1afde 100644
--- a/InvenTree/build/migrations/0027_auto_20210403_1210.py
+++ b/InvenTree/build/migrations/0027_auto_20210404_2016.py
@@ -1,7 +1,8 @@
-# Generated by Django 3.0.7 on 2021-04-03 12:10
+# Generated by Django 3.0.7 on 2021-04-04 20:16
 
 import InvenTree.models
 from django.conf import settings
+import django.core.validators
 from django.db import migrations, models
 import django.db.models.deletion
 
@@ -9,8 +10,9 @@ import django.db.models.deletion
 class Migration(migrations.Migration):
 
     dependencies = [
-        migrations.swappable_dependency(settings.AUTH_USER_MODEL),
+        ('stock', '0058_stockitem_packaging'),
         ('users', '0005_owner_model'),
+        migrations.swappable_dependency(settings.AUTH_USER_MODEL),
         ('build', '0026_auto_20210216_1539'),
     ]
 
@@ -25,6 +27,11 @@ class Migration(migrations.Migration):
             name='completion_date',
             field=models.DateField(blank=True, null=True, verbose_name='Completion Date'),
         ),
+        migrations.AlterField(
+            model_name='build',
+            name='creation_date',
+            field=models.DateField(auto_now_add=True, verbose_name='Creation Date'),
+        ),
         migrations.AlterField(
             model_name='build',
             name='issued_by',
@@ -35,6 +42,26 @@ class Migration(migrations.Migration):
             name='responsible',
             field=models.ForeignKey(blank=True, help_text='User responsible for this build order', null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='builds_responsible', to='users.Owner', verbose_name='Responsible'),
         ),
+        migrations.AlterField(
+            model_name='builditem',
+            name='build',
+            field=models.ForeignKey(help_text='Build to allocate parts', on_delete=django.db.models.deletion.CASCADE, related_name='allocated_stock', to='build.Build', verbose_name='Build'),
+        ),
+        migrations.AlterField(
+            model_name='builditem',
+            name='install_into',
+            field=models.ForeignKey(blank=True, help_text='Destination stock item', limit_choices_to={'is_building': True}, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='items_to_install', to='stock.StockItem', verbose_name='Install into'),
+        ),
+        migrations.AlterField(
+            model_name='builditem',
+            name='quantity',
+            field=models.DecimalField(decimal_places=5, default=1, help_text='Stock quantity to allocate to build', max_digits=15, validators=[django.core.validators.MinValueValidator(0)], verbose_name='Quantity'),
+        ),
+        migrations.AlterField(
+            model_name='builditem',
+            name='stock_item',
+            field=models.ForeignKey(help_text='Source stock item', limit_choices_to={'belongs_to': None, 'sales_order': None}, on_delete=django.db.models.deletion.CASCADE, related_name='allocations', to='stock.StockItem', verbose_name='Stock Item'),
+        ),
         migrations.AlterField(
             model_name='buildorderattachment',
             name='attachment',
diff --git a/InvenTree/build/models.py b/InvenTree/build/models.py
index ad0149ed48..4ee8de0d73 100644
--- a/InvenTree/build/models.py
+++ b/InvenTree/build/models.py
@@ -216,7 +216,7 @@ class Build(MPTTModel):
         help_text=_('Batch code for this build output')
     )
     
-    creation_date = models.DateField(auto_now_add=True, editable=False)
+    creation_date = models.DateField(auto_now_add=True, editable=False, verbose_name=_('Creation Date'))
     
     target_date = models.DateField(
         null=True, blank=True,
@@ -1020,14 +1020,14 @@ class BuildItem(models.Model):
         try:
             # Allocated part must be in the BOM for the master part
             if self.stock_item.part not in self.build.part.getRequiredParts(recursive=False):
-                errors['stock_item'] = [_("Selected stock item not found in BOM for part '{p}'".format(p=self.build.part.full_name))]
+                errors['stock_item'] = [_("Selected stock item not found in BOM for part '{p}'").format(p=self.build.part.full_name)]
             
             # Allocated quantity cannot exceed available stock quantity
             if self.quantity > self.stock_item.quantity:
-                errors['quantity'] = [_("Allocated quantity ({n}) must not exceed available quantity ({q})".format(
+                errors['quantity'] = [_("Allocated quantity ({n}) must not exceed available quantity ({q})").format(
                     n=normalize(self.quantity),
                     q=normalize(self.stock_item.quantity)
-                ))]
+                )]
 
             # Allocated quantity cannot cause the stock item to be over-allocated
             if self.stock_item.quantity - self.stock_item.allocation_count() + self.quantity < self.quantity:
@@ -1079,6 +1079,7 @@ class BuildItem(models.Model):
         Build,
         on_delete=models.CASCADE,
         related_name='allocated_stock',
+        verbose_name=_('Build'),
         help_text=_('Build to allocate parts')
     )
 
@@ -1086,6 +1087,7 @@ class BuildItem(models.Model):
         'stock.StockItem',
         on_delete=models.CASCADE,
         related_name='allocations',
+        verbose_name=_('Stock Item'),
         help_text=_('Source stock item'),
         limit_choices_to={
             'sales_order': None,
@@ -1098,6 +1100,7 @@ class BuildItem(models.Model):
         max_digits=15,
         default=1,
         validators=[MinValueValidator(0)],
+        verbose_name=_('Quantity'),
         help_text=_('Stock quantity to allocate to build')
     )
 
@@ -1106,6 +1109,7 @@ class BuildItem(models.Model):
         on_delete=models.SET_NULL,
         blank=True, null=True,
         related_name='items_to_install',
+        verbose_name=_('Install into'),
         help_text=_('Destination stock item'),
         limit_choices_to={
             'is_building': True,
diff --git a/InvenTree/company/migrations/0032_auto_20210403_1210.py b/InvenTree/company/migrations/0032_auto_20210403_1837.py
similarity index 61%
rename from InvenTree/company/migrations/0032_auto_20210403_1210.py
rename to InvenTree/company/migrations/0032_auto_20210403_1837.py
index e3572eb3b6..41b6977d31 100644
--- a/InvenTree/company/migrations/0032_auto_20210403_1210.py
+++ b/InvenTree/company/migrations/0032_auto_20210403_1837.py
@@ -1,7 +1,12 @@
-# Generated by Django 3.0.7 on 2021-04-03 12:10
+# Generated by Django 3.0.7 on 2021-04-03 18:37
 
+import InvenTree.fields
+import company.models
 import django.core.validators
 from django.db import migrations, models
+import django.db.models.deletion
+import markdownx.models
+import stdimage.models
 
 
 class Migration(migrations.Migration):
@@ -11,6 +16,11 @@ class Migration(migrations.Migration):
     ]
 
     operations = [
+        migrations.AlterField(
+            model_name='company',
+            name='image',
+            field=stdimage.models.StdImageField(blank=True, null=True, upload_to=company.models.rename_company_image, verbose_name='Image'),
+        ),
         migrations.AlterField(
             model_name='company',
             name='is_customer',
@@ -26,6 +36,16 @@ class Migration(migrations.Migration):
             name='is_supplier',
             field=models.BooleanField(default=True, help_text='Do you purchase items from this company?', verbose_name='is supplier'),
         ),
+        migrations.AlterField(
+            model_name='company',
+            name='link',
+            field=InvenTree.fields.InvenTreeURLField(blank=True, help_text='Link to external company information', verbose_name='Link'),
+        ),
+        migrations.AlterField(
+            model_name='company',
+            name='notes',
+            field=markdownx.models.MarkdownxField(blank=True, verbose_name='Notes'),
+        ),
         migrations.AlterField(
             model_name='supplierpart',
             name='base_cost',
@@ -41,4 +61,9 @@ class Migration(migrations.Migration):
             name='packaging',
             field=models.CharField(blank=True, help_text='Part packaging', max_length=50, null=True, verbose_name='Packaging'),
         ),
+        migrations.AlterField(
+            model_name='supplierpricebreak',
+            name='part',
+            field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='pricebreaks', to='company.SupplierPart', verbose_name='Part'),
+        ),
     ]
diff --git a/InvenTree/company/models.py b/InvenTree/company/models.py
index e05d81a16a..17091dcbc3 100644
--- a/InvenTree/company/models.py
+++ b/InvenTree/company/models.py
@@ -114,7 +114,7 @@ class Company(models.Model):
                                verbose_name=_('Contact'),
                                blank=True, help_text=_('Point of contact'))
 
-    link = InvenTreeURLField(blank=True, help_text=_('Link to external company information'))
+    link = InvenTreeURLField(blank=True, verbose_name=_('Link'), help_text=_('Link to external company information'))
 
     image = StdImageField(
         upload_to=rename_company_image,
@@ -122,9 +122,10 @@ class Company(models.Model):
         blank=True,
         variations={'thumbnail': (128, 128)},
         delete_orphans=True,
+        verbose_name=_('Image'),
     )
 
-    notes = MarkdownxField(blank=True)
+    notes = MarkdownxField(blank=True, verbose_name=_('Notes'))
 
     is_customer = models.BooleanField(default=False, verbose_name=_('is customer'), help_text=_('Do you sell items to this company?'))
 
@@ -366,11 +367,11 @@ class SupplierPart(models.Model):
         help_text=_('Notes')
     )
 
-    base_cost = models.DecimalField(max_digits=10, decimal_places=3, default=0, validators=[MinValueValidator(0)], verbose_name=('base cost'), help_text=_('Minimum charge (e.g. stocking fee)'))
+    base_cost = models.DecimalField(max_digits=10, decimal_places=3, default=0, validators=[MinValueValidator(0)], verbose_name=_('base cost'), help_text=_('Minimum charge (e.g. stocking fee)'))
 
     packaging = models.CharField(max_length=50, blank=True, null=True, verbose_name=_('Packaging'), help_text=_('Part packaging'))
     
-    multiple = models.PositiveIntegerField(default=1, validators=[MinValueValidator(1)], verbose_name=_('multiple'), help_text=('Order multiple'))
+    multiple = models.PositiveIntegerField(default=1, validators=[MinValueValidator(1)], verbose_name=_('multiple'), help_text=_('Order multiple'))
 
     # TODO - Reimplement lead-time as a charfield with special validation (pattern matching).
     # lead_time = models.DurationField(blank=True, null=True)
@@ -530,7 +531,7 @@ class SupplierPriceBreak(common.models.PriceBreak):
         currency: Reference to the currency of this pricebreak (leave empty for base currency)
     """
 
-    part = models.ForeignKey(SupplierPart, on_delete=models.CASCADE, related_name='pricebreaks')
+    part = models.ForeignKey(SupplierPart, on_delete=models.CASCADE, related_name='pricebreaks', verbose_name=_('Part'),)
 
     class Meta:
         unique_together = ("part", "quantity")
diff --git a/InvenTree/company/templates/company/delete.html b/InvenTree/company/templates/company/delete.html
index 191e07c2f3..3236a7a58d 100644
--- a/InvenTree/company/templates/company/delete.html
+++ b/InvenTree/company/templates/company/delete.html
@@ -1,14 +1,16 @@
 {% extends "modal_delete_form.html" %}
 
+{% load i18n %}
+
 {% block pre_form_content %}
 
-Are you sure you want to delete company '{{ company.name }}'?
+{% blocktrans with company.name as name %}Are you sure you want to delete company '{{ name }}'?{% endblocktrans %}
 
 <br>
 
 {% if company.supplied_part_count > 0 %}
-<p>There are {{ company.supplied_part_count }} parts sourced from this company.<br>
-If this supplier is deleted, these supplier part entries will also be deleted.</p>
+<p>{% blocktrans with company.supplied_part_count as count %}There are {{ count }} parts sourced from this company.<br>
+If this supplier is deleted, these supplier part entries will also be deleted.{% endblocktrans %}</p>
 <ul class='list-group'>
 {% for part in company.parts.all %}
 <li class='list-group-item'><b>{{ part.SKU }}</b> - <i>{{ part.part.full_name }}</i></li>
diff --git a/InvenTree/company/templates/company/detail_part.html b/InvenTree/company/templates/company/detail_part.html
index b12322353a..05aaf78955 100644
--- a/InvenTree/company/templates/company/detail_part.html
+++ b/InvenTree/company/templates/company/detail_part.html
@@ -15,7 +15,7 @@
 {% if roles.purchase_order.change %}
 <div id='button-toolbar'>
     <div class='button-toolbar container-fluid'>
-        <div class='btn-group role='group'>
+        <div class='btn-group' role='group'>
             {% if roles.purchase_order.add %}
             <button class="btn btn-success" id='part-create' title='{% trans "Create new supplier part" %}'>
                 <span class='fas fa-plus-circle'></span> {% trans "New Supplier Part" %}
diff --git a/InvenTree/label/models.py b/InvenTree/label/models.py
index 0c6a108f31..c76b3f80c8 100644
--- a/InvenTree/label/models.py
+++ b/InvenTree/label/models.py
@@ -126,7 +126,7 @@ class LabelTemplate(models.Model):
 
     width = models.FloatField(
         default=50,
-        verbose_name=('Width [mm]'),
+        verbose_name=_('Width [mm]'),
         help_text=_('Label width, specified in mm'),
         validators=[MinValueValidator(2)]
     )
diff --git a/InvenTree/locale/de/LC_MESSAGES/django.po b/InvenTree/locale/de/LC_MESSAGES/django.po
index ced6299586..fef729ffa5 100644
--- a/InvenTree/locale/de/LC_MESSAGES/django.po
+++ b/InvenTree/locale/de/LC_MESSAGES/django.po
@@ -6,9 +6,10 @@ msgid ""
 msgstr ""
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-04-03 02:10+0000\n"
+"POT-Creation-Date: 2021-04-04 20:22+0000\n"
 "PO-Revision-Date: 2021-03-28 17:47+0200\n"
-"Last-Translator: Andreas Kaiser <kaiser.vocote@gmail.com>, Matthias MAIR<matmair@live.de>\n"
+"Last-Translator: Andreas Kaiser <kaiser.vocote@gmail.com>, Matthias "
+"MAIR<matmair@live.de>\n"
 "Language-Team: C <kde-i18n-doc@kde.org>\n"
 "Language: de\n"
 "MIME-Version: 1.0\n"
@@ -33,32 +34,51 @@ msgstr "Keine passende Aktion gefunden"
 msgid "Enter date"
 msgstr "Datum eingeben"
 
-#: InvenTree/forms.py:110 build/forms.py:99 build/forms.py:187
+#: InvenTree/forms.py:110 build/forms.py:99 build/forms.py:120
+#: build/forms.py:142 build/forms.py:166 build/forms.py:188 build/forms.py:223
+#: order/forms.py:27 order/forms.py:38 order/forms.py:49 order/forms.py:60
+#: order/forms.py:71 part/forms.py:132
 msgid "Confirm"
 msgstr "Bestätigen"
 
 #: InvenTree/forms.py:126
+#, fuzzy
+#| msgid "Confirm item deletion"
+msgid "Confirm delete"
+msgstr "Löschung von Position bestätigen"
+
+#: InvenTree/forms.py:127
 msgid "Confirm item deletion"
 msgstr "Löschung von Position bestätigen"
 
-#: InvenTree/forms.py:158
+#: InvenTree/forms.py:159 templates/registration/login.html:76
+msgid "Enter password"
+msgstr "Passwort eingeben"
+
+#: InvenTree/forms.py:160
 msgid "Enter new password"
 msgstr "Neues Passwort eingeben"
 
-#: InvenTree/forms.py:165
+#: InvenTree/forms.py:167
+#, fuzzy
+#| msgid "Confirm new password"
+msgid "Confirm password"
+msgstr "Neues Passwort bestätigen"
+
+#: InvenTree/forms.py:168
 msgid "Confirm new password"
 msgstr "Neues Passwort bestätigen"
 
-#: InvenTree/forms.py:200
+#: InvenTree/forms.py:203
 msgid "Apply Theme"
 msgstr "Thema anwenden"
 
-#: InvenTree/forms.py:230
+#: InvenTree/forms.py:233
 msgid "Select Category"
 msgstr "Kategorie auswählen"
 
-#: InvenTree/helpers.py:361 order/models.py:242 order/models.py:341
-#: stock/views.py:1762
+#: InvenTree/helpers.py:361 order/models.py:245 order/models.py:344
+#: stock/views.py:1763
 msgid "Invalid quantity provided"
 msgstr "Keine gültige Menge"
 
@@ -92,7 +112,7 @@ msgstr ""
 "Anzahl der eindeutigen Seriennummern ({s}) muss mit der Anzahl ({q}) "
 "übereinstimmen"
 
-#: InvenTree/models.py:59 stock/models.py:1657
+#: InvenTree/models.py:59 stock/models.py:1659
 msgid "Attachment"
 msgstr "Anhang"
 
@@ -108,7 +128,7 @@ msgstr "Kommentar"
 msgid "File comment"
 msgstr "Datei-Kommentar"
 
-#: InvenTree/models.py:68 InvenTree/models.py:69
+#: InvenTree/models.py:68 InvenTree/models.py:69 part/models.py:1888
 #: report/templates/report/inventree_test_report_base.html:91
 #: templates/js/stock.js:960
 msgid "User"
@@ -119,20 +139,21 @@ msgid "upload date"
 msgstr "Hochladedatum"
 
 #: InvenTree/models.py:107 InvenTree/models.py:108 label/models.py:101
-#: part/models.py:686 part/templates/part/params.html:27 report/models.py:179
-#: templates/InvenTree/search.html:136 templates/InvenTree/search.html:273
-#: templates/js/part.js:109
+#: part/models.py:686 part/models.py:2029 part/templates/part/params.html:27
+#: report/models.py:179 templates/InvenTree/search.html:136
+#: templates/InvenTree/search.html:273 templates/js/part.js:109
 msgid "Name"
 msgstr "Name"
 
 #: InvenTree/models.py:114 build/models.py:134
-#: build/templates/build/detail.html:21 company/models.py:359
+#: build/templates/build/detail.html:21 company/models.py:361
 #: company/templates/company/detail.html:26
 #: company/templates/company/supplier_part_base.html:70
 #: company/templates/company/supplier_part_detail.html:31 label/models.py:108
-#: order/templates/order/purchase_order_detail.html:168 part/models.py:710
-#: part/templates/part/detail.html:54 part/templates/part/set_category.html:14
-#: report/models.py:192
+#: order/models.py:101 order/templates/order/purchase_order_detail.html:168
+#: part/models.py:710 part/templates/part/detail.html:54
+#: part/templates/part/set_category.html:14 report/models.py:192
+#: report/models.py:505 report/models.py:544
 #: report/templates/report/inventree_build_order_base.html:118
 #: templates/InvenTree/search.html:143 templates/InvenTree/search.html:208
 #: templates/InvenTree/search.html:280
@@ -247,7 +268,9 @@ msgid "Invalid character in part name"
 msgstr "Ungültiger Buchstabe im Teilenamen"
 
 #: InvenTree/validators.py:63
-msgid "IPN must match regex pattern"
+#, fuzzy, python-brace-format
+#| msgid "IPN must match regex pattern"
+msgid "IPN must match regex pattern {pat}"
 msgstr "IPN muss zu Regex-Muster passen"
 
 #: InvenTree/validators.py:77 InvenTree/validators.py:91
@@ -345,7 +368,7 @@ msgid "Order target date"
 msgstr "geplantes Bestelldatum"
 
 #: build/forms.py:39 build/templates/build/build_base.html:104
-#: build/templates/build/detail.html:121
+#: build/templates/build/detail.html:121 order/forms.py:109 order/forms.py:144
 #: order/templates/order/order_base.html:124
 #: order/templates/order/sales_order_base.html:117
 #: report/templates/report/inventree_build_order_base.html:126
@@ -359,15 +382,20 @@ msgid ""
 "Target date for build completion. Build will be overdue after this date."
 msgstr "Zieldatum für Bauauftrag-Fertigstellung."
 
-#: build/forms.py:45 build/forms.py:87
+#: build/forms.py:45 build/forms.py:87 build/forms.py:257 build/models.py:1103
 #: build/templates/build/auto_allocate.html:17
 #: build/templates/build/build_base.html:91
 #: build/templates/build/detail.html:31 common/models.py:696
 #: company/forms.py:131 company/templates/company/supplier_part_pricing.html:77
-#: order/forms.py:237 order/templates/order/order_wizard/select_parts.html:32
+#: order/forms.py:188 order/forms.py:205 order/forms.py:239 order/forms.py:261
+#: order/forms.py:278 order/models.py:593 order/models.py:784
+#: order/templates/order/order_wizard/select_parts.html:32
 #: order/templates/order/purchase_order_detail.html:193
+#: order/templates/order/sales_order_detail.html:70
 #: order/templates/order/sales_order_detail.html:77
 #: order/templates/order/sales_order_detail.html:159
+#: order/templates/order/sales_order_detail.html:224 part/forms.py:340
+#: part/forms.py:369 part/forms.py:385 part/models.py:2158
 #: part/templates/part/allocation.html:19
 #: part/templates/part/allocation.html:53
 #: part/templates/part/part_pricing.html:12
@@ -377,7 +405,8 @@ msgstr "Zieldatum für Bauauftrag-Fertigstellung."
 #: report/templates/report/inventree_po_report.html:91
 #: report/templates/report/inventree_so_report.html:91
 #: report/templates/report/inventree_test_report_base.html:77
-#: stock/forms.py:307 stock/templates/stock/item_base.html:51
+#: stock/forms.py:175 stock/forms.py:308 stock/models.py:1563
+#: stock/templates/stock/item_base.html:51
 #: stock/templates/stock/item_base.html:57
 #: stock/templates/stock/item_base.html:240
 #: stock/templates/stock/stock_adjust.html:18 templates/js/barcode.js:364
@@ -394,7 +423,7 @@ msgstr "Anzahl der zu bauenden Teile"
 msgid "Enter quantity for build output"
 msgstr "Menge für den Bau-Ausgabe angeben"
 
-#: build/forms.py:92 order/forms.py:231 stock/forms.py:117
+#: build/forms.py:92 order/forms.py:233 stock/forms.py:118
 msgid "Serial Numbers"
 msgstr "Seriennummer"
 
@@ -406,39 +435,61 @@ msgstr "Seriennummer für dieses hergestelltes Teil eingeben"
 msgid "Confirm creation of build output"
 msgstr "Anlage Baufertigstellung bestätigen"
 
-#: build/forms.py:120
+#: build/forms.py:121
 msgid "Confirm deletion of build output"
 msgstr "Löschen des Endprodukt bestätigen"
 
-#: build/forms.py:141
+#: build/forms.py:142
 msgid "Confirm unallocation of stock"
 msgstr "Aufhebung der BestandsZuordnung bestätigen"
 
-#: build/forms.py:165
+#: build/forms.py:166
 msgid "Confirm stock allocation"
 msgstr "Bestandszuordnung bestätigen"
 
-#: build/forms.py:188
+#: build/forms.py:189
 msgid "Mark build as complete"
 msgstr "Bau als vollständig markieren"
 
-#: build/forms.py:212
+#: build/forms.py:213 build/templates/build/auto_allocate.html:18
+#: order/forms.py:82 stock/forms.py:347
+#: stock/templates/stock/item_base.html:270
+#: stock/templates/stock/stock_adjust.html:17
+#: templates/InvenTree/search.html:244 templates/js/barcode.js:363
+#: templates/js/barcode.js:531 templates/js/build.js:434
+#: templates/js/stock.js:637
+msgid "Location"
+msgstr "Lagerort"
+
+#: build/forms.py:214
 msgid "Location of completed parts"
 msgstr "Lagerort der fertigen Teile"
 
-#: build/forms.py:217
+#: build/forms.py:219
+#, fuzzy
+#| msgid "Confirm build completion"
+msgid "Confirm incomplete"
+msgstr "Bau-Fertigstellung bestätigen"
+
+#: build/forms.py:220
 msgid "Confirm completion with incomplete stock allocation"
 msgstr "Fertigstellung mit nicht kompletter Bestandszuordnung bestätigen"
 
-#: build/forms.py:220
+#: build/forms.py:223
 msgid "Confirm build completion"
 msgstr "Bau-Fertigstellung bestätigen"
 
-#: build/forms.py:240 build/views.py:66
+#: build/forms.py:243
+#, fuzzy
+#| msgid "Confirm build cancellation"
+msgid "Confirm cancel"
+msgstr "Bauabbruch bestätigen"
+
+#: build/forms.py:243 build/views.py:66
 msgid "Confirm build cancellation"
 msgstr "Bauabbruch bestätigen"
 
-#: build/forms.py:254
+#: build/forms.py:257
 msgid "Select quantity of stock to allocate"
 msgstr "Menge der BestandsObjekt für Zuordnung auswählen"
 
@@ -463,7 +514,9 @@ msgstr "Bauaufträge"
 msgid "Build Order Reference"
 msgstr "Bauauftragsreferenz"
 
-#: build/models.py:127 order/templates/order/purchase_order_detail.html:188
+#: build/models.py:127 order/models.py:99 order/models.py:595
+#: order/templates/order/purchase_order_detail.html:188
+#: order/templates/order/sales_order_detail.html:219 part/models.py:2167
 #: report/templates/report/inventree_po_report.html:92
 #: report/templates/report/inventree_so_report.html:92 templates/js/bom.js:197
 #: templates/js/build.js:509 templates/js/build.js:948
@@ -485,11 +538,15 @@ msgstr "Bauauftrag, zu dem dieser Bau zugwiesen ist"
 
 #: build/models.py:152 build/templates/build/auto_allocate.html:16
 #: build/templates/build/build_base.html:86
-#: build/templates/build/detail.html:26 order/models.py:662
+#: build/templates/build/detail.html:26 company/models.py:535
+#: order/models.py:637 order/models.py:669
 #: order/templates/order/order_wizard/select_parts.html:30
 #: order/templates/order/purchase_order_detail.html:156
-#: order/templates/order/receive_parts.html:19 part/models.py:321
-#: part/models.py:2054 part/templates/part/part_app_base.html:7
+#: order/templates/order/receive_parts.html:19
+#: order/templates/order/sales_order_detail.html:207 part/models.py:321
+#: part/models.py:1856 part/models.py:1868 part/models.py:1886
+#: part/models.py:1961 part/models.py:2057 part/models.py:2142
+#: part/templates/part/part_app_base.html:7
 #: part/templates/part/part_pricing.html:15 part/templates/part/related.html:29
 #: part/templates/part/set_category.html:13
 #: part/templates/part/subcategories.html:17
@@ -561,7 +618,7 @@ msgstr "Bau-Status"
 msgid "Build status code"
 msgstr "Bau-Statuscode"
 
-#: build/models.py:212 stock/models.py:429
+#: build/models.py:212 stock/models.py:430
 msgid "Batch Code"
 msgstr "Losnummer"
 
@@ -569,11 +626,16 @@ msgstr "Losnummer"
 msgid "Batch code for this build output"
 msgstr "Losnummer für dieses Endprodukt"
 
-#: build/models.py:223 order/models.py:447
+#: build/models.py:219 order/models.py:105 part/models.py:882
+#: part/templates/part/detail.html:126 templates/js/order.js:293
+msgid "Creation Date"
+msgstr "Erstelldatum"
+
+#: build/models.py:223 order/models.py:451
 msgid "Target completion date"
 msgstr "geplantes Fertigstellungsdatum"
 
-#: build/models.py:227 order/models.py:215
+#: build/models.py:227 order/models.py:218
 msgid "Completion Date"
 msgstr "Fertigstellungsdatum"
 
@@ -590,9 +652,9 @@ msgid "User who issued this build order"
 msgstr "Nutzer der diesen Bauauftrag erstellt hat"
 
 #: build/models.py:250 build/templates/build/build_base.html:142
-#: build/templates/build/detail.html:105 order/models.py:118
+#: build/templates/build/detail.html:105 order/models.py:119
 #: order/templates/order/order_base.html:138
-#: order/templates/order/sales_order_base.html:138 part/models.py:885
+#: order/templates/order/sales_order_base.html:138 part/models.py:886
 #: report/templates/report/inventree_build_order_base.html:159
 msgid "Responsible"
 msgstr "Verantwortlicher Benutzer"
@@ -605,26 +667,28 @@ msgstr "Nutzer der für diesen Bauauftrag zuständig ist"
 #: company/templates/company/supplier_part_base.html:77
 #: company/templates/company/supplier_part_detail.html:28
 #: part/templates/part/detail.html:83 part/templates/part/part_base.html:100
-#: stock/models.py:423 stock/templates/stock/item_base.html:330
+#: stock/models.py:424 stock/templates/stock/item_base.html:330
 msgid "External Link"
 msgstr "Externer Link"
 
-#: build/models.py:257 part/models.py:744 stock/models.py:425
+#: build/models.py:257 part/models.py:744 stock/models.py:426
 msgid "Link to external URL"
 msgstr "Link zu einer externen URL"
 
 #: build/models.py:261 build/templates/build/navbar.html:59
-#: company/models.py:366 company/templates/company/navbar.html:59
-#: company/templates/company/navbar.html:62
-#: order/templates/order/po_navbar.html:29
+#: company/models.py:129 company/models.py:368
+#: company/templates/company/navbar.html:59
+#: company/templates/company/navbar.html:62 order/models.py:123
+#: order/models.py:597 order/templates/order/po_navbar.html:29
 #: order/templates/order/po_navbar.html:32
 #: order/templates/order/purchase_order_detail.html:227
+#: order/templates/order/sales_order_detail.html:264
 #: order/templates/order/so_navbar.html:33
-#: order/templates/order/so_navbar.html:36 part/models.py:870
+#: order/templates/order/so_navbar.html:36 part/models.py:871
 #: part/templates/part/navbar.html:122
 #: report/templates/report/inventree_build_order_base.html:173
-#: stock/forms.py:316 stock/forms.py:348 stock/forms.py:376 stock/models.py:495
-#: stock/models.py:1553 stock/models.py:1663
+#: stock/forms.py:173 stock/forms.py:317 stock/forms.py:349 stock/forms.py:377
+#: stock/models.py:496 stock/models.py:1555 stock/models.py:1665
 #: stock/templates/stock/navbar.html:57 templates/js/barcode.js:37
 #: templates/js/bom.js:329 templates/js/stock.js:128 templates/js/stock.js:667
 msgid "Notes"
@@ -672,11 +736,11 @@ msgstr ""
 "Reserviermenge ({n}) muss kleiner Bestandsmenge ({q}) sein. Zugewiesene "
 "Anzahl ({n}) darf nicht die verfügbare ({q}) Anzahl überschreiten"
 
-#: build/models.py:1034 order/models.py:751
+#: build/models.py:1034 order/models.py:758
 msgid "StockItem is over-allocated"
 msgstr "Zu viele BestandsObjekt zugewiesen"
 
-#: build/models.py:1038 order/models.py:754
+#: build/models.py:1038 order/models.py:761
 msgid "Allocation quantity must be greater than zero"
 msgstr "Reserviermenge muss größer null sein"
 
@@ -684,19 +748,43 @@ msgstr "Reserviermenge muss größer null sein"
 msgid "Quantity must be 1 for serialized stock"
 msgstr "Anzahl muss 1 für Objekte mit Seriennummer sein"
 
-#: build/models.py:1082
+#: build/models.py:1082 stock/templates/stock/item_base.html:302
+#: templates/InvenTree/search.html:167 templates/js/build.js:655
+#: templates/navbar.html:29
+msgid "Build"
+msgstr "Bauauftrag"
+
+#: build/models.py:1083
 msgid "Build to allocate parts"
 msgstr "Bau starten um Teile zuzuweisen"
 
-#: build/models.py:1089
+#: build/models.py:1090 part/templates/part/allocation.html:18
+#: part/templates/part/allocation.html:24
+#: part/templates/part/allocation.html:31
+#: part/templates/part/allocation.html:49
+#: stock/templates/stock/item_base.html:8
+#: stock/templates/stock/item_base.html:89
+#: stock/templates/stock/item_base.html:324
+#: stock/templates/stock/stock_adjust.html:16 templates/js/build.js:771
+#: templates/js/stock.js:923 templates/js/stock.js:1181
+msgid "Stock Item"
+msgstr "BestandsObjekt"
+
+#: build/models.py:1091
 msgid "Source stock item"
 msgstr "Quell-BestandsObjekt"
 
-#: build/models.py:1101
+#: build/models.py:1104
 msgid "Stock quantity to allocate to build"
 msgstr "BestandsObjekt-Anzahl dem Bau zuweisen"
 
-#: build/models.py:1109
+#: build/models.py:1112
+#, fuzzy
+#| msgid "Install item"
+msgid "Install into"
+msgstr "Installiere Objekt"
+
+#: build/models.py:1113
 msgid "Destination stock item"
 msgstr "Ziel-BestandsObjekt"
 
@@ -765,15 +853,6 @@ msgid ""
 msgstr ""
 "Die folgenden BestandsObjekte werden den ausgewählten Endprodukten zugeordnet"
 
-#: build/templates/build/auto_allocate.html:18 stock/forms.py:346
-#: stock/templates/stock/item_base.html:270
-#: stock/templates/stock/stock_adjust.html:17
-#: templates/InvenTree/search.html:244 templates/js/barcode.js:363
-#: templates/js/barcode.js:531 templates/js/build.js:434
-#: templates/js/stock.js:637
-msgid "Location"
-msgstr "Lagerort"
-
 #: build/templates/build/auto_allocate.html:37
 msgid "No stock items found that can be automatically allocated to this build"
 msgstr ""
@@ -846,7 +925,7 @@ msgid "Build Details"
 msgstr "Bau-Status"
 
 #: build/templates/build/build_base.html:96
-#: build/templates/build/detail.html:59
+#: build/templates/build/detail.html:59 order/models.py:445
 #: order/templates/order/receive_parts.html:24
 #: stock/templates/stock/item_base.html:376 templates/InvenTree/search.html:236
 #: templates/js/barcode.js:119 templates/js/build.js:710
@@ -865,7 +944,7 @@ msgid "Progress"
 msgstr "Fortschritt"
 
 #: build/templates/build/build_base.html:128
-#: build/templates/build/detail.html:84 order/models.py:660
+#: build/templates/build/detail.html:84 order/models.py:667
 #: order/templates/order/sales_order_base.html:9
 #: order/templates/order/sales_order_base.html:33
 #: order/templates/order/sales_order_ship.html:25
@@ -979,7 +1058,7 @@ msgstr "Ausgangs-Lager"
 msgid "Stock can be taken from any available location."
 msgstr "Bestand kann jedem verfügbaren Lagerort entnommen werden."
 
-#: build/templates/build/detail.html:46 stock/forms.py:374
+#: build/templates/build/detail.html:46 stock/forms.py:169 stock/forms.py:375
 msgid "Destination"
 msgstr "Ziel"
 
@@ -1115,7 +1194,7 @@ msgstr "Bestand dem Endprodukt zuweisen"
 msgid "Create Build Output"
 msgstr "Endprodukt anlegen"
 
-#: build/views.py:203 stock/models.py:964 stock/views.py:1788
+#: build/views.py:203 stock/models.py:966 stock/views.py:1789
 msgid "Serial numbers already exist"
 msgstr "Seriennummern existieren bereits"
 
@@ -1255,7 +1334,7 @@ msgstr "InvenTree Instanzname"
 msgid "String descriptor for the server instance"
 msgstr "Kurze Beschreibung der Instanz"
 
-#: common/models.py:62 company/models.py:95 company/models.py:96
+#: common/models.py:62 company/models.py:96 company/models.py:97
 msgid "Company name"
 msgstr "Firmenname"
 
@@ -1359,8 +1438,8 @@ msgstr "Aktuelle Teile-Stände"
 msgid "Number of recent parts to display on index page"
 msgstr "Anzahl der neusten Teile auf der Startseite"
 
-#: common/models.py:150 part/models.py:2056 part/templates/part/detail.html:160
-#: report/models.py:185 stock/forms.py:258 templates/js/table_filters.js:24
+#: common/models.py:150 part/models.py:2059 part/templates/part/detail.html:160
+#: report/models.py:185 stock/forms.py:259 templates/js/table_filters.js:24
 #: templates/js/table_filters.js:288
 msgid "Template"
 msgstr "Vorlage"
@@ -1369,7 +1448,7 @@ msgstr "Vorlage"
 msgid "Parts are templates by default"
 msgstr "Teile sind standardmäßig Vorlagen"
 
-#: common/models.py:157 part/models.py:833 part/templates/part/detail.html:170
+#: common/models.py:157 part/models.py:834 part/templates/part/detail.html:170
 #: templates/js/table_filters.js:101 templates/js/table_filters.js:300
 msgid "Assembly"
 msgstr "Baugruppe"
@@ -1378,7 +1457,7 @@ msgstr "Baugruppe"
 msgid "Parts can be assembled from other components by default"
 msgstr "Teile können standardmäßig aus anderen Teilen angefertigt werden"
 
-#: common/models.py:164 part/models.py:839 part/templates/part/detail.html:180
+#: common/models.py:164 part/models.py:840 part/templates/part/detail.html:180
 #: templates/js/table_filters.js:304
 msgid "Component"
 msgstr "Komponente"
@@ -1387,7 +1466,7 @@ msgstr "Komponente"
 msgid "Parts can be used as sub-components by default"
 msgstr "Teile können standardmäßig in Baugruppen benutzt werden"
 
-#: common/models.py:171 part/models.py:850 part/templates/part/detail.html:200
+#: common/models.py:171 part/models.py:851 part/templates/part/detail.html:200
 msgid "Purchaseable"
 msgstr "Kaufbar"
 
@@ -1395,7 +1474,7 @@ msgstr "Kaufbar"
 msgid "Parts are purchaseable by default"
 msgstr "Artikel sind grundsätzlich kaufbar"
 
-#: common/models.py:178 part/models.py:855 part/templates/part/detail.html:210
+#: common/models.py:178 part/models.py:856 part/templates/part/detail.html:210
 #: templates/js/table_filters.js:312
 msgid "Salable"
 msgstr "Verkäuflich"
@@ -1404,7 +1483,7 @@ msgstr "Verkäuflich"
 msgid "Parts are salable by default"
 msgstr "Artikel sind grundsätzlich verkaufbar"
 
-#: common/models.py:185 part/models.py:845 part/templates/part/detail.html:190
+#: common/models.py:185 part/models.py:846 part/templates/part/detail.html:190
 #: templates/js/table_filters.js:32 templates/js/table_filters.js:316
 msgid "Trackable"
 msgstr "nachverfolgbar"
@@ -1413,7 +1492,7 @@ msgstr "nachverfolgbar"
 msgid "Parts are trackable by default"
 msgstr "Artikel sind grundsätzlich verfolgbar"
 
-#: common/models.py:192 part/models.py:865 part/templates/part/detail.html:150
+#: common/models.py:192 part/models.py:866 part/templates/part/detail.html:150
 #: templates/js/table_filters.js:28
 msgid "Virtual"
 msgstr "Virtuell"
@@ -1607,12 +1686,12 @@ msgstr "Angegebener Wert nicht erlaubt"
 msgid "Supplied value must be a boolean"
 msgstr "Angegebener Wert muss ein Wahrheitswert sein"
 
-#: company/forms.py:37 company/models.py:137
+#: company/forms.py:37 company/models.py:139
 #: company/templates/company/detail.html:40
 msgid "Currency"
 msgstr "Währung"
 
-#: company/forms.py:38 company/models.py:139
+#: company/forms.py:38 company/models.py:141
 msgid "Default currency used for this company"
 msgstr "Standard-Währung für diese Firma"
 
@@ -1632,95 +1711,108 @@ msgstr "Einzelpreis"
 msgid "Single quantity price"
 msgstr "Einzelpreis"
 
-#: company/models.py:98
+#: company/models.py:99
 msgid "Company description"
 msgstr "Firmenbeschreibung"
 
-#: company/models.py:98
+#: company/models.py:99
 msgid "Description of the company"
 msgstr "Firmenbeschreibung"
 
-#: company/models.py:100 company/templates/company/company_base.html:70
+#: company/models.py:101 company/templates/company/company_base.html:70
 #: company/templates/company/detail.html:31 templates/js/company.js:60
 msgid "Website"
 msgstr "Website"
 
-#: company/models.py:100
+#: company/models.py:101
 msgid "Company website URL"
 msgstr "Firmenwebsite Adresse/URL"
 
-#: company/models.py:103 company/templates/company/company_base.html:77
+#: company/models.py:104 company/templates/company/company_base.html:77
 msgid "Address"
 msgstr "Adresse"
 
-#: company/models.py:104
+#: company/models.py:105
 msgid "Company address"
 msgstr "Firmenadresse"
 
-#: company/models.py:107
+#: company/models.py:108
 msgid "Phone number"
 msgstr "Kontakt-Tel."
 
-#: company/models.py:108
+#: company/models.py:109
 msgid "Contact phone number"
 msgstr "Kontakt-Telefon"
 
-#: company/models.py:111 company/templates/company/company_base.html:91
+#: company/models.py:112 company/templates/company/company_base.html:91
 msgid "Email"
 msgstr "Email"
 
-#: company/models.py:111
+#: company/models.py:112
 msgid "Contact email address"
 msgstr "Kontakt-Email"
 
-#: company/models.py:114 company/templates/company/company_base.html:98
+#: company/models.py:115 company/templates/company/company_base.html:98
 msgid "Contact"
 msgstr "Kontakt"
 
-#: company/models.py:115
+#: company/models.py:116
 msgid "Point of contact"
 msgstr "Anlaufstelle"
 
-#: company/models.py:117
+#: company/models.py:118 company/models.py:355 order/models.py:103
+#: part/models.py:743
+#: report/templates/report/inventree_build_order_base.html:165
+#: stock/models.py:1557 templates/js/company.js:208 templates/js/part.js:430
+msgid "Link"
+msgstr "Link"
+
+#: company/models.py:118
 msgid "Link to external company information"
 msgstr "Link auf externe Firmeninformation"
 
-#: company/models.py:129
+#: company/models.py:126 part/models.py:753
+#, fuzzy
+#| msgid "Image URL"
+msgid "Image"
+msgstr "Bild-URL"
+
+#: company/models.py:131
 msgid "is customer"
 msgstr "ist Kunde"
 
-#: company/models.py:129
+#: company/models.py:131
 msgid "Do you sell items to this company?"
 msgstr "Verkaufen Sie Teile an diese Firma?"
 
-#: company/models.py:131
+#: company/models.py:133
 msgid "is supplier"
 msgstr "ist Zulieferer"
 
-#: company/models.py:131
+#: company/models.py:133
 msgid "Do you purchase items from this company?"
 msgstr "Kaufen Sie Teile von dieser Firma?"
 
-#: company/models.py:133
+#: company/models.py:135
 msgid "is manufacturer"
 msgstr "ist Hersteller"
 
-#: company/models.py:133
+#: company/models.py:135
 msgid "Does this company manufacture parts?"
 msgstr "Produziert diese Firma Teile?"
 
-#: company/models.py:313 stock/models.py:370
+#: company/models.py:315 stock/models.py:371
 #: stock/templates/stock/item_base.html:220
 msgid "Base Part"
 msgstr "Basisteil"
 
-#: company/models.py:317 order/views.py:1372
+#: company/models.py:319 order/views.py:1372
 msgid "Select part"
 msgstr "Teil auswählen"
 
-#: company/models.py:323 company/templates/company/detail.html:60
+#: company/models.py:325 company/templates/company/detail.html:60
 #: company/templates/company/supplier_part_base.html:83
-#: company/templates/company/supplier_part_detail.html:25
+#: company/templates/company/supplier_part_detail.html:25 order/models.py:190
 #: order/templates/order/order_base.html:92
 #: order/templates/order/order_wizard/select_pos.html:30 part/bom.py:170
 #: stock/templates/stock/item_base.html:337 templates/js/company.js:48
@@ -1728,81 +1820,85 @@ msgstr "Teil auswählen"
 msgid "Supplier"
 msgstr "Zulieferer"
 
-#: company/models.py:324
+#: company/models.py:326
 msgid "Select supplier"
 msgstr "Zulieferer auswählen"
 
-#: company/models.py:329 company/templates/company/supplier_part_base.html:87
+#: company/models.py:331 company/templates/company/supplier_part_base.html:87
 #: company/templates/company/supplier_part_detail.html:26
 #: order/templates/order/purchase_order_detail.html:174 part/bom.py:171
 msgid "SKU"
 msgstr "SKU (Lagerbestandseinheit)"
 
-#: company/models.py:330
+#: company/models.py:332
 msgid "Supplier stock keeping unit"
 msgstr "Lagerbestandseinheit (SKU) des Zulieferers"
 
-#: company/models.py:340 company/templates/company/detail.html:55
+#: company/models.py:342 company/templates/company/detail.html:55
 #: company/templates/company/supplier_part_base.html:93
 #: company/templates/company/supplier_part_detail.html:34 part/bom.py:172
 #: templates/js/company.js:44 templates/js/company.js:188
 msgid "Manufacturer"
 msgstr "Hersteller"
 
-#: company/models.py:341
+#: company/models.py:343
 msgid "Select manufacturer"
 msgstr "Hersteller auswählen"
 
-#: company/models.py:347 company/templates/company/supplier_part_base.html:99
+#: company/models.py:349 company/templates/company/supplier_part_base.html:99
 #: company/templates/company/supplier_part_detail.html:35
 #: order/templates/order/purchase_order_detail.html:183 part/bom.py:173
 #: templates/js/company.js:204
 msgid "MPN"
 msgstr "MPN"
 
-#: company/models.py:348
+#: company/models.py:350
 msgid "Manufacturer part number"
 msgstr "Hersteller-Teilenummer"
 
-#: company/models.py:353 part/models.py:743
-#: report/templates/report/inventree_build_order_base.html:165
-#: stock/models.py:1555 templates/js/company.js:208 templates/js/part.js:430
-msgid "Link"
-msgstr "Link"
-
-#: company/models.py:354
+#: company/models.py:356
 msgid "URL for external supplier part link"
 msgstr "Teil-URL des Zulieferers"
 
-#: company/models.py:360
+#: company/models.py:362
 msgid "Supplier part description"
 msgstr "Zuliefererbeschreibung des Teils"
 
-#: company/models.py:365 company/templates/company/supplier_part_base.html:113
-#: company/templates/company/supplier_part_detail.html:38
+#: company/models.py:367 company/templates/company/supplier_part_base.html:113
+#: company/templates/company/supplier_part_detail.html:38 part/models.py:2170
 #: report/templates/report/inventree_po_report.html:93
 #: report/templates/report/inventree_so_report.html:93
 msgid "Note"
 msgstr "Notiz"
 
-#: company/models.py:369
+#: company/models.py:371
+msgid "base cost"
+msgstr ""
+
+#: company/models.py:371
 msgid "Minimum charge (e.g. stocking fee)"
 msgstr "Mindestpreis"
 
-#: company/models.py:371 company/templates/company/supplier_part_base.html:106
-#: stock/models.py:394 stock/templates/stock/item_base.html:295
+#: company/models.py:373 company/templates/company/supplier_part_base.html:106
+#: stock/models.py:395 stock/templates/stock/item_base.html:295
 #: templates/js/stock.js:663
 msgid "Packaging"
 msgstr "Verpackungen"
 
-#: company/models.py:371
+#: company/models.py:373
 msgid "Part packaging"
 msgstr "Teile-Verpackungen"
 
-#: company/models.py:373
+#: company/models.py:375
 msgid "multiple"
 msgstr "Vielfache"
 
+#: company/models.py:375
+#, fuzzy
+#| msgid "multiple"
+msgid "Order multiple"
+msgstr "Vielfache"
+
 #: company/templates/company/assigned_stock.html:10
 #: company/templates/company/navbar.html:51
 #: company/templates/company/navbar.html:54 templates/js/build.js:411
@@ -1847,6 +1943,20 @@ msgstr "Firmendetails"
 msgid "Phone"
 msgstr "Telefon"
 
+#: company/templates/company/delete.html:7
+#, fuzzy, python-format
+#| msgid "Are you sure you want to delete category"
+msgid "Are you sure you want to delete company '%(name)s'?"
+msgstr "Sind Sie sicher, dass Sie diese Kategorie löschen wollen"
+
+#: company/templates/company/delete.html:12
+#, python-format
+msgid ""
+"There are %(count)s parts sourced from this company.<br>\n"
+"If this supplier is deleted, these supplier part entries will also be "
+"deleted."
+msgstr ""
+
 #: company/templates/company/detail.html:21
 msgid "Company Name"
 msgstr "Firmenname"
@@ -1859,9 +1969,9 @@ msgstr "Keine Website angegeben"
 msgid "Uses default currency"
 msgstr "verwendet Standard-Währung"
 
-#: company/templates/company/detail.html:65
-#: order/templates/order/sales_order_base.html:92 stock/models.py:412
-#: stock/models.py:413 stock/templates/stock/item_base.html:247
+#: company/templates/company/detail.html:65 order/models.py:440
+#: order/templates/order/sales_order_base.html:92 stock/models.py:413
+#: stock/models.py:414 stock/templates/stock/item_base.html:247
 #: templates/js/company.js:40 templates/js/order.js:267
 msgid "Customer"
 msgstr "Kunde"
@@ -1872,6 +1982,7 @@ msgid "Supplier Parts"
 msgstr "Zulieferer-Teile"
 
 #: company/templates/company/detail_part.html:20
+#: order/templates/order/order_wizard/select_parts.html:42
 #: order/templates/order/purchase_order_detail.html:75
 msgid "Create new supplier part"
 msgstr "Neues Zulieferer-Teil anlegen"
@@ -1911,13 +2022,13 @@ msgid "Create new Part"
 msgstr "Neues Teil hinzufügen"
 
 #: company/templates/company/detail_part.html:72 company/views.py:62
-#: order/templates/order/purchase_orders.html:182
+#: order/templates/order/purchase_orders.html:183
 #: part/templates/part/supplier.html:50
 msgid "New Supplier"
 msgstr "Neuer Zulieferer"
 
 #: company/templates/company/detail_part.html:73 company/views.py:279
-#: order/templates/order/purchase_orders.html:183
+#: order/templates/order/purchase_orders.html:184
 msgid "Create new Supplier"
 msgstr "Neuen Zulieferer anlegen"
 
@@ -2058,7 +2169,7 @@ msgid "New Sales Order"
 msgstr "Neuer Auftrag"
 
 #: company/templates/company/supplier_part_base.html:6
-#: company/templates/company/supplier_part_base.html:19 stock/models.py:379
+#: company/templates/company/supplier_part_base.html:19 stock/models.py:380
 #: stock/templates/stock/item_base.html:342 templates/js/company.js:180
 msgid "Supplier Part"
 msgstr "Zulieferer-Teil"
@@ -2132,7 +2243,7 @@ msgstr "Hersteller"
 msgid "Customers"
 msgstr "Kunden"
 
-#: company/views.py:76 order/templates/order/sales_orders.html:184
+#: company/views.py:76 order/templates/order/sales_orders.html:185
 msgid "New Customer"
 msgstr "Neuer Kunde"
 
@@ -2172,7 +2283,7 @@ msgstr "Firma bearbeiten"
 msgid "Edited company information"
 msgstr "Firmeninformation bearbeitet"
 
-#: company/views.py:285 order/templates/order/sales_orders.html:185
+#: company/views.py:285 order/templates/order/sales_orders.html:186
 msgid "Create new Customer"
 msgstr "Neuen Kunden anlegen"
 
@@ -2224,7 +2335,7 @@ msgstr "Label Name"
 msgid "Label description"
 msgstr "Label Beschreibung"
 
-#: label/models.py:116 stock/forms.py:201
+#: label/models.py:116 stock/forms.py:202
 msgid "Label"
 msgstr "Label"
 
@@ -2240,6 +2351,12 @@ msgstr "Aktiviert"
 msgid "Label template is enabled"
 msgstr "Label-Vorlage ist aktiviert"
 
+#: label/models.py:129
+#, fuzzy
+#| msgid "Height [mm]"
+msgid "Width [mm]"
+msgstr "Höhe [mm]"
+
 #: label/models.py:130
 msgid "Label width, specified in mm"
 msgstr "Label-Breite in mm"
@@ -2286,24 +2403,24 @@ msgstr "Teile in diesen Lagerort empfangen"
 msgid "Purchase Order reference"
 msgstr "Bestellungs-Referenz"
 
-#: order/forms.py:109
+#: order/forms.py:110
 msgid "Target date for order delivery. Order will be overdue after this date."
 msgstr "Zieldatum für Auftrags-Lieferung."
 
-#: order/forms.py:137
+#: order/forms.py:138
 msgid "Enter sales order number"
 msgstr "Auftrag-Nummer eingeben"
 
-#: order/forms.py:143 order/models.py:448
+#: order/forms.py:145 order/models.py:452
 msgid ""
 "Target date for order completion. Order will be overdue after this date."
 msgstr "Zieldatum für Auftrags-Fertigstellung."
 
-#: order/forms.py:233
+#: order/forms.py:235
 msgid "Enter stock item serial numbers"
 msgstr "Seriennummern für BestandsObjekt eingeben"
 
-#: order/forms.py:239
+#: order/forms.py:241
 msgid "Enter quantity of stock items"
 msgstr "Menge der BestandsObjekt eingeben"
 
@@ -2319,137 +2436,191 @@ msgstr "Bestellungs-Beschreibung"
 msgid "Link to external page"
 msgstr "Link auf externe Seite"
 
-#: order/models.py:117
+#: order/models.py:111 part/templates/part/detail.html:132
+msgid "Created By"
+msgstr "Erstellt von"
+
+#: order/models.py:118
 msgid "User or group responsible for this order"
 msgstr "Nutzer oder Gruppe der/die für diesen Auftrag zuständig ist/sind"
 
-#: order/models.py:122
+#: order/models.py:123
 msgid "Order notes"
 msgstr "Bestell-Notizen"
 
-#: order/models.py:181 order/models.py:441
+#: order/models.py:182 order/models.py:445
 msgid "Purchase order status"
 msgstr "Bestellungs-Status"
 
-#: order/models.py:189
+#: order/models.py:191
 msgid "Company from which the items are being ordered"
 msgstr "Firma bei der die Teile bestellt werden"
 
-#: order/models.py:192
+#: order/models.py:194 order/templates/order/order_base.html:98
+#: templates/js/order.js:179
+msgid "Supplier Reference"
+msgstr "Zulieferer-Referenz"
+
+#: order/models.py:194
 msgid "Supplier order reference code"
 msgstr "Zulieferer Bestellreferenz"
 
-#: order/models.py:203
+#: order/models.py:201
+#, fuzzy
+#| msgid "Received"
+msgid "received by"
+msgstr "Empfangen"
+
+#: order/models.py:206
 msgid "Issue Date"
 msgstr "Aufgabedatum"
 
-#: order/models.py:204
+#: order/models.py:207
 msgid "Date order was issued"
 msgstr "Datum an dem die Bestellung aufgegeben wurde"
 
-#: order/models.py:209
+#: order/models.py:212
 msgid "Target Delivery Date"
 msgstr "Ziel-Versanddatum"
 
-#: order/models.py:210
+#: order/models.py:213
 msgid ""
 "Expected date for order delivery. Order will be overdue after this date."
 msgstr "Geplantes Lieferdatum für Auftrag."
 
-#: order/models.py:216
+#: order/models.py:219
 msgid "Date order was completed"
 msgstr "Datum an dem der Auftrag fertigstellt wurde"
 
-#: order/models.py:240 order/models.py:339 part/views.py:1586
-#: stock/models.py:269 stock/models.py:948
+#: order/models.py:243 order/models.py:342 part/views.py:1586
+#: stock/models.py:270 stock/models.py:950
 msgid "Quantity must be greater than zero"
 msgstr "Anzahl muss größer Null sein"
 
-#: order/models.py:245
+#: order/models.py:248
 msgid "Part supplier must match PO supplier"
 msgstr "Teile-Zulieferer muss dem Zulieferer der Bestellung entsprechen"
 
-#: order/models.py:334
+#: order/models.py:337
 msgid "Lines can only be received against an order marked as 'Placed'"
 msgstr "Nur Teile aufgegebener Bestllungen können empfangen werden"
 
-#: order/models.py:356
+#: order/models.py:359
 msgid "Received items"
 msgstr "Elemente empfangen"
 
-#: order/models.py:437
+#: order/models.py:441
 msgid "Company to which the items are being sold"
 msgstr "Firma an die die Teile verkauft werden"
 
-#: order/models.py:443
+#: order/models.py:447
+#, fuzzy
+#| msgid "Customer Reference"
+msgid "Customer Reference "
+msgstr "Kundenreferenz"
+
+#: order/models.py:447
 msgid "Customer order reference code"
 msgstr "Bestellreferenz"
 
-#: order/models.py:501
+#: order/models.py:455 templates/js/order.js:303
+msgid "Shipment Date"
+msgstr "Versanddatum"
+
+#: order/models.py:462
+#, fuzzy
+#| msgid "Shipped"
+msgid "shipped by"
+msgstr "Versendet"
+
+#: order/models.py:506
 msgid "SalesOrder cannot be shipped as it is not currently pending"
 msgstr "Bestellung kann nicht versendet werden weil er nicht anhängig ist"
 
-#: order/models.py:588
+#: order/models.py:593
 msgid "Item quantity"
 msgstr "Anzahl"
 
-#: order/models.py:590
+#: order/models.py:595
 msgid "Line item reference"
 msgstr "Position - Referenz"
 
-#: order/models.py:592
+#: order/models.py:597
 msgid "Line item notes"
 msgstr "Position - Notizen"
 
-#: order/models.py:618 order/templates/order/order_base.html:9
+#: order/models.py:623 order/models.py:667
+#: part/templates/part/allocation.html:17
+#: part/templates/part/allocation.html:45
+msgid "Order"
+msgstr "Bestellung"
+
+#: order/models.py:624 order/templates/order/order_base.html:9
 #: order/templates/order/order_base.html:24
 #: report/templates/report/inventree_po_report.html:77
 #: stock/templates/stock/item_base.html:309 templates/js/order.js:148
 msgid "Purchase Order"
 msgstr "Bestellung"
 
-#: order/models.py:631
+#: order/models.py:638
 msgid "Supplier part"
 msgstr "Zulieferer-Teil"
 
-#: order/models.py:634
+#: order/models.py:641 order/templates/order/order_base.html:131
+#: order/templates/order/purchase_order_detail.html:207
+#: order/templates/order/receive_parts.html:22
+#: order/templates/order/sales_order_base.html:131
+msgid "Received"
+msgstr "Empfangen"
+
+#: order/models.py:641
 msgid "Number of items received"
 msgstr "Empfangene Objekt-Anzahl"
 
-#: order/models.py:641 stock/models.py:505
+#: order/models.py:648 stock/models.py:506
 #: stock/templates/stock/item_base.html:316
 msgid "Purchase Price"
 msgstr "EK-Preis"
 
-#: order/models.py:642
+#: order/models.py:649
 msgid "Unit purchase price"
 msgstr "EK-Preis pro Einheit"
 
-#: order/models.py:736 order/models.py:738
+#: order/models.py:743 order/models.py:745
 msgid "Stock item has not been assigned"
 msgstr "BestandsObjekt wurde nicht zugewiesen"
 
-#: order/models.py:742
+#: order/models.py:749
 msgid "Cannot allocate stock item to a line with a different part"
 msgstr "Kann BestandsObjekt keiner Zeile mit einem anderen Teil hinzufügen"
 
-#: order/models.py:744
+#: order/models.py:751
 msgid "Cannot allocate stock to a line without a part"
 msgstr "Kann BestandsObjekt keiner Zeile ohne Teil hinzufügen"
 
-#: order/models.py:747
+#: order/models.py:754
 msgid "Allocation quantity cannot exceed stock quantity"
 msgstr "Die zugeordnete Anzahl darf nicht die verfügbare Anzahl überschreiten"
 
-#: order/models.py:757
+#: order/models.py:764
 msgid "Quantity must be 1 for serialized stock item"
 msgstr "Anzahl für BestandsObjekt mit Seriennummer muss 1 sein"
 
-#: order/models.py:773
+#: order/models.py:769
+msgid "Line"
+msgstr "Position"
+
+#: order/models.py:780
+#, fuzzy
+#| msgid "Items"
+msgid "Item"
+msgstr "Positionen"
+
+#: order/models.py:781
 msgid "Select stock item to allocate"
 msgstr "BestandsObjekt für Zuordnung auswählen"
 
-#: order/models.py:776
+#: order/models.py:784
 msgid "Enter stock allocation quantity"
 msgstr "Anzahl für Bestandszuordnung eingeben"
 
@@ -2492,28 +2663,32 @@ msgstr "Bestellreferenz"
 msgid "Order Status"
 msgstr "Bestellstatus"
 
-#: order/templates/order/order_base.html:98 templates/js/order.js:179
-msgid "Supplier Reference"
-msgstr "Zulieferer-Referenz"
-
 #: order/templates/order/order_base.html:117
 #: report/templates/report/inventree_build_order_base.html:122
 msgid "Issued"
 msgstr "Aufgegeben"
 
-#: order/templates/order/order_base.html:131
-#: order/templates/order/purchase_order_detail.html:207
-#: order/templates/order/receive_parts.html:22
-#: order/templates/order/sales_order_base.html:131
-msgid "Received"
-msgstr "Empfangen"
-
 #: order/templates/order/order_cancel.html:7
 #: order/templates/order/sales_order_cancel.html:9
 msgid "Cancelling this order means that the order will no longer be editable."
 msgstr ""
 "Abbruch dieser Bestellung bedeutet, dass sie nicht länger bearbeitbar ist."
 
+#: order/templates/order/order_complete.html:7
+#, fuzzy
+#| msgid "Mark order as complete"
+msgid "Mark this order as complete?"
+msgstr "Bestellung als vollständig markieren"
+
+#: order/templates/order/order_issue.html:7
+#, fuzzy
+#| msgid ""
+#| "Cancelling this order means that the order will no longer be editable."
+msgid ""
+"After placing this purchase order, line items will no longer be editable."
+msgstr ""
+"Abbruch dieser Bestellung bedeutet, dass sie nicht länger bearbeitbar ist."
+
 #: order/templates/order/order_notes.html:13
 msgid "Order Notes"
 msgstr "Notizen zur Bestellung"
@@ -2692,11 +2867,16 @@ msgstr "Auftrags-Positionen"
 #: order/templates/order/sales_order_detail.html:75
 #: order/templates/order/sales_order_detail.html:157
 #: report/templates/report/inventree_test_report_base.html:75
-#: stock/models.py:417 stock/templates/stock/item_base.html:234
+#: stock/models.py:418 stock/templates/stock/item_base.html:234
 #: templates/js/build.js:418
 msgid "Serial Number"
 msgstr "Seriennummer"
 
+#: order/templates/order/sales_order_detail.html:92 templates/js/bom.js:338
+#: templates/js/build.js:571 templates/js/build.js:984
+msgid "Actions"
+msgstr "Aktionen"
+
 #: order/templates/order/sales_order_detail.html:99 templates/js/build.js:459
 #: templates/js/build.js:789
 msgid "Edit stock allocation"
@@ -2707,8 +2887,18 @@ msgstr "Bestands-Zuordnung bearbeiten"
 msgid "Delete stock allocation"
 msgstr "Bestands-Zuordnung löschen"
 
-#: order/templates/order/sales_order_detail.html:229 order/views.py:1351
-#: templates/js/build.js:523 templates/js/build.js:785
+#: order/templates/order/sales_order_detail.html:170
+#, fuzzy
+#| msgid "No matching results"
+msgid "No matching line items"
+msgstr "Keine passenden Ergebnisse gefunden"
+
+#: order/templates/order/sales_order_detail.html:199
+msgid "ID"
+msgstr ""
+
+#: order/templates/order/sales_order_detail.html:229 templates/js/build.js:523
+#: templates/js/build.js:785
 msgid "Allocated"
 msgstr "Zugeordnet"
 
@@ -2880,6 +3070,12 @@ msgstr "Anzahl kleiner null empfangen"
 msgid "No lines specified"
 msgstr "Keine Zeilen angegeben"
 
+#: order/views.py:1060
+#, fuzzy, python-brace-format
+#| msgid "Order parts"
+msgid "Ordered {n} parts"
+msgstr "Teile bestellen"
+
 #: order/views.py:1117
 msgid "Supplier part must be specified"
 msgstr "Zulieferer-Teil muss ausgewählt werden"
@@ -2905,8 +3101,10 @@ msgid "Allocate Serial Numbers"
 msgstr "Seriennummern zuweisen"
 
 #: order/views.py:1351
-msgid "items"
-msgstr "Teile"
+#, fuzzy, python-brace-format
+#| msgid "Allocated to Orders"
+msgid "Allocated {n} items"
+msgstr "zu Bauaufträgen zugeordnet"
 
 #: order/views.py:1367
 msgid "Select line item"
@@ -2936,7 +3134,7 @@ msgstr "Zuordnung bearbeiten"
 msgid "Remove allocation"
 msgstr "Zuordnung entfernen"
 
-#: part/bom.py:138 part/models.py:72 part/models.py:761
+#: part/bom.py:138 part/models.py:72 part/models.py:762
 #: part/templates/part/category.html:62 part/templates/part/detail.html:90
 msgid "Default Location"
 msgstr "Standard-Lagerort"
@@ -2958,11 +3156,11 @@ msgstr "Fehler beim Lesen der Stückliste (ungültige Daten)"
 msgid "Error reading BOM file (incorrect row size)"
 msgstr "Fehler beim Lesen der Stückliste (ungültige Zeilengröße)"
 
-#: part/forms.py:89 stock/forms.py:264
+#: part/forms.py:89 stock/forms.py:265
 msgid "File Format"
 msgstr "Dateiformat"
 
-#: part/forms.py:89 stock/forms.py:264
+#: part/forms.py:89 stock/forms.py:265
 msgid "Select output file format"
 msgstr "Ausgabe-Dateiformat auswählen"
 
@@ -3007,7 +3205,7 @@ msgstr "Zulieferer einschließen"
 msgid "Include part supplier data in exported BOM"
 msgstr "Zulieferer-Daten in Stückliste-Export einschließen"
 
-#: part/forms.py:120 part/models.py:2054
+#: part/forms.py:120 part/models.py:2057
 msgid "Parent Part"
 msgstr "Ausgangsteil"
 
@@ -3019,63 +3217,81 @@ msgstr "Teil für Stücklisten-Kopie auswählen"
 msgid "Clear existing BOM items"
 msgstr "Stücklisten-Position(en) löschen"
 
-#: part/forms.py:132
+#: part/forms.py:133
 msgid "Confirm BOM duplication"
 msgstr "Kopie von Stückliste bestätigen"
 
-#: part/forms.py:150
+#: part/forms.py:151
+#, fuzzy
+#| msgid "Validate BOM"
+msgid "validate"
+msgstr "BOM validieren"
+
+#: part/forms.py:151
 msgid "Confirm that the BOM is correct"
 msgstr "Bestätigen, dass die Stückliste korrekt ist"
 
-#: part/forms.py:162
+#: part/forms.py:163
+#, fuzzy
+#| msgid "BOM Item"
+msgid "BOM file"
+msgstr "Stücklisten-Position"
+
+#: part/forms.py:163
 msgid "Select BOM file to upload"
 msgstr "Stücklisten-Datei zum Upload auswählen"
 
-#: part/forms.py:181
+#: part/forms.py:182
 msgid "Related Part"
 msgstr "verknüpftes Teil"
 
-#: part/forms.py:200
+#: part/forms.py:201
 msgid "Select part category"
 msgstr "Teilekategorie wählen"
 
-#: part/forms.py:217
+#: part/forms.py:218
 msgid "Duplicate all BOM data for this part"
 msgstr "Stückliste für dieses Teil kopieren"
 
-#: part/forms.py:218
+#: part/forms.py:219
 msgid "Copy BOM"
 msgstr "Stückliste kopieren"
 
-#: part/forms.py:223
+#: part/forms.py:224
 msgid "Duplicate all parameter data for this part"
 msgstr "Alle Parameter-Daten für dieses Teil kopieren"
 
-#: part/forms.py:224
+#: part/forms.py:225
 msgid "Copy Parameters"
 msgstr "Parameter kopieren"
 
-#: part/forms.py:229
+#: part/forms.py:230
 msgid "Confirm part creation"
 msgstr "Erstellen des Teils bestätigen"
 
-#: part/forms.py:234
+#: part/forms.py:235
 msgid "Include category parameter templates"
 msgstr "Kategorie Parameter-Vorlage einschließen"
 
-#: part/forms.py:239
+#: part/forms.py:240
 msgid "Include parent categories parameter templates"
 msgstr "Über-Kategorie Parameter-Vorlage einschließen"
 
-#: part/forms.py:319
+#: part/forms.py:320
 msgid "Add parameter template to same level categories"
 msgstr "Parameter-Vorlage zu Kategorien dieser Ebene hinzufügen"
 
-#: part/forms.py:323
+#: part/forms.py:324
 msgid "Add parameter template to all categories"
 msgstr "Parameter-Vorlage zu allen Kategorien hinzufügen"
 
-#: part/forms.py:368
+#: part/forms.py:342 part/models.py:2151
+#, fuzzy
+#| msgid "Buy parts"
+msgid "Sub part"
+msgstr "Teile kaufen"
+
+#: part/forms.py:370
 msgid "Input quantity for price calculation"
 msgstr "Eintragsmenge zur Preisberechnung"
 
@@ -3091,7 +3307,7 @@ msgstr "Standard Stichwörter"
 msgid "Default keywords for parts in this category"
 msgstr "Standard-Stichworte für Teile dieser Kategorie"
 
-#: part/models.py:82 part/models.py:2099
+#: part/models.py:82 part/models.py:2103
 #: part/templates/part/part_app_base.html:9
 msgid "Part Category"
 msgstr "Teilkategorie"
@@ -3161,7 +3377,7 @@ msgstr "Schlüsselwörter"
 msgid "Part keywords to improve visibility in search results"
 msgstr "Schlüsselworte um die Sichtbarkeit in Suchergebnissen zu verbessern"
 
-#: part/models.py:724 part/templates/part/detail.html:73
+#: part/models.py:724 part/models.py:2102 part/templates/part/detail.html:73
 #: part/templates/part/set_category.html:15 templates/js/part.js:384
 msgid "Category"
 msgstr "Kategorie"
@@ -3188,246 +3404,273 @@ msgstr "Revisions- oder Versionsnummer"
 msgid "Revision"
 msgstr "Revision"
 
-#: part/models.py:759
+#: part/models.py:760
 msgid "Where is this item normally stored?"
 msgstr "Wo wird dieses Teil normalerweise gelagert?"
 
-#: part/models.py:806 part/templates/part/detail.html:97
+#: part/models.py:807 part/templates/part/detail.html:97
 msgid "Default Supplier"
 msgstr "Standard Zulieferer"
 
-#: part/models.py:807
+#: part/models.py:808
 msgid "Default supplier part"
 msgstr "Standard Zulieferer-Teil"
 
-#: part/models.py:814
+#: part/models.py:815
 msgid "Default Expiry"
 msgstr "Standard Ablaufzeit"
 
-#: part/models.py:815
+#: part/models.py:816
 msgid "Expiry time (in days) for stock items of this part"
 msgstr "Ablauf-Zeit (in Tagen) für Lagerbestand dieses Teils"
 
-#: part/models.py:820 part/templates/part/detail.html:113
+#: part/models.py:821 part/templates/part/detail.html:113
 msgid "Minimum Stock"
 msgstr "Minimaler Lagerbestand"
 
-#: part/models.py:821
+#: part/models.py:822
 msgid "Minimum allowed stock level"
 msgstr "Minimal zulässiger Lagerbestand"
 
-#: part/models.py:827 part/templates/part/detail.html:106
+#: part/models.py:828 part/models.py:2031 part/templates/part/detail.html:106
 #: part/templates/part/params.html:29
 msgid "Units"
 msgstr "Einheiten"
 
-#: part/models.py:828
+#: part/models.py:829
 msgid "Stock keeping units for this part"
 msgstr "Stock Keeping Units (SKU) für dieses Teil"
 
-#: part/models.py:834
+#: part/models.py:835
 msgid "Can this part be built from other parts?"
 msgstr "Kann dieses Teil aus anderen Teilen angefertigt werden?"
 
-#: part/models.py:840
+#: part/models.py:841
 msgid "Can this part be used to build other parts?"
 msgstr "Kann dieses Teil zum Bau von anderen genutzt werden?"
 
-#: part/models.py:846
+#: part/models.py:847
 msgid "Does this part have tracking for unique items?"
 msgstr "Hat dieses Teil Tracking für einzelne Objekte?"
 
-#: part/models.py:851
+#: part/models.py:852
 msgid "Can this part be purchased from external suppliers?"
 msgstr "Kann dieses Teil von externen Zulieferern gekauft werden?"
 
-#: part/models.py:856
+#: part/models.py:857
 msgid "Can this part be sold to customers?"
 msgstr "Kann dieses Teil an Kunden verkauft werden?"
 
-#: part/models.py:860 part/templates/part/detail.html:227
+#: part/models.py:861 part/templates/part/detail.html:227
 #: templates/js/table_filters.js:20 templates/js/table_filters.js:60
 #: templates/js/table_filters.js:214 templates/js/table_filters.js:283
 msgid "Active"
 msgstr "Aktiv"
 
-#: part/models.py:861
+#: part/models.py:862
 msgid "Is this part active?"
 msgstr "Ist dieses Teil aktiv?"
 
-#: part/models.py:866
+#: part/models.py:867
 msgid "Is this a virtual part, such as a software product or license?"
 msgstr "Ist dieses Teil virtuell, wie zum Beispiel eine Software oder Lizenz?"
 
-#: part/models.py:871
+#: part/models.py:872
 msgid "Part notes - supports Markdown formatting"
 msgstr "Bemerkungen - unterstüzt Markdown-Formatierung"
 
-#: part/models.py:874
+#: part/models.py:875
 msgid "BOM checksum"
 msgstr "Prüfsumme der Stückliste"
 
-#: part/models.py:874
+#: part/models.py:875
 msgid "Stored BOM checksum"
 msgstr "Prüfsumme der Stückliste gespeichert"
 
-#: part/models.py:877
+#: part/models.py:878
 msgid "BOM checked by"
 msgstr "Stückliste kontrolliert von"
 
-#: part/models.py:879
+#: part/models.py:880
 msgid "BOM checked date"
 msgstr "BOM Kontrolldatum"
 
-#: part/models.py:881 part/templates/part/detail.html:126
-#: templates/js/order.js:293
-msgid "Creation Date"
-msgstr "Erstelldatum"
-
-#: part/models.py:883
+#: part/models.py:884
 msgid "Creation User"
 msgstr "Erstellungs-Nutzer"
 
-#: part/models.py:1927
+#: part/models.py:1929
 msgid "Test templates can only be created for trackable parts"
 msgstr "Test-Vorlagen können nur für verfolgbare Teile angelegt werden"
 
-#: part/models.py:1944
+#: part/models.py:1946
 msgid "Test with this name already exists for this part"
 msgstr "Ein Test mit diesem Namen besteht bereits für dieses Teil"
 
-#: part/models.py:1963 templates/js/part.js:561 templates/js/stock.js:104
+#: part/models.py:1966 templates/js/part.js:561 templates/js/stock.js:104
 msgid "Test Name"
 msgstr "Test-Name"
 
-#: part/models.py:1964
+#: part/models.py:1967
 msgid "Enter a name for the test"
 msgstr "Namen für diesen Test eingeben"
 
-#: part/models.py:1969
+#: part/models.py:1972
 msgid "Test Description"
 msgstr "Test-Beschreibung"
 
-#: part/models.py:1970
+#: part/models.py:1973
 msgid "Enter description for this test"
 msgstr "Beschreibung für diesen Test eingeben"
 
-#: part/models.py:1975 templates/js/part.js:570
+#: part/models.py:1978 templates/js/part.js:570
 #: templates/js/table_filters.js:200
 msgid "Required"
 msgstr "benötigt"
 
-#: part/models.py:1976
+#: part/models.py:1979
 msgid "Is this test required to pass?"
 msgstr "Muss dieser Test erfolgreich sein?"
 
-#: part/models.py:1981 templates/js/part.js:578
+#: part/models.py:1984 templates/js/part.js:578
 msgid "Requires Value"
 msgstr "verpflichtender Wert"
 
-#: part/models.py:1982
+#: part/models.py:1985
 msgid "Does this test require a value when adding a test result?"
 msgstr ""
 "Muss für diesen Test ein Wert für das Test-Ergebnis eingetragen werden?"
 
-#: part/models.py:1987 templates/js/part.js:585
+#: part/models.py:1990 templates/js/part.js:585
 msgid "Requires Attachment"
 msgstr "Anhang muss eingegeben werden"
 
-#: part/models.py:1988
+#: part/models.py:1991
 msgid "Does this test require a file attachment when adding a test result?"
 msgstr ""
 "Muss für diesen Test ein Anhang für das Test-Ergebnis hinzugefügt werden?"
 
-#: part/models.py:2021
+#: part/models.py:2024
 msgid "Parameter template name must be unique"
 msgstr "Vorlagen-Name des Parameters muss eindeutig sein"
 
-#: part/models.py:2026
+#: part/models.py:2029
 msgid "Parameter Name"
 msgstr "Name des Parameters"
 
-#: part/models.py:2028
+#: part/models.py:2031
 msgid "Parameter Units"
 msgstr "Parameter Einheit"
 
-#: part/models.py:2056 part/models.py:2104
+#: part/models.py:2059 part/models.py:2108 part/models.py:2109
 #: templates/InvenTree/settings/category.html:62
 msgid "Parameter Template"
 msgstr "Parameter Vorlage"
 
-#: part/models.py:2058
+#: part/models.py:2061
 msgid "Data"
 msgstr "Wert"
 
-#: part/models.py:2058
+#: part/models.py:2061
 msgid "Parameter Value"
 msgstr "Parameter Wert"
 
-#: part/models.py:2108
+#: part/models.py:2113 templates/InvenTree/settings/category.html:67
+msgid "Default Value"
+msgstr "Standard-Wert"
+
+#: part/models.py:2114
 msgid "Default Parameter Value"
 msgstr "Standard Parameter Wert"
 
-#: part/models.py:2136
+#: part/models.py:2143
 msgid "Select parent part"
 msgstr "Ausgangsteil auswählen"
 
-#: part/models.py:2144
+#: part/models.py:2152
 msgid "Select part to be used in BOM"
 msgstr "Teil für die Nutzung in der Stückliste auswählen"
 
-#: part/models.py:2150
+#: part/models.py:2158
 msgid "BOM quantity for this BOM item"
 msgstr "Stücklisten-Anzahl für dieses Stücklisten-Teil"
 
-#: part/models.py:2152
+#: part/models.py:2160 templates/js/bom.js:216 templates/js/bom.js:269
+msgid "Optional"
+msgstr "Optional"
+
+#: part/models.py:2160
 msgid "This BOM item is optional"
 msgstr "Diese Stücklisten-Position ist optional"
 
-#: part/models.py:2155
+#: part/models.py:2163
+#, fuzzy
+#| msgid "Overdue"
+msgid "Overage"
+msgstr "Überfällig"
+
+#: part/models.py:2164
 msgid "Estimated build wastage quantity (absolute or percentage)"
 msgstr "Geschätzter Ausschuss (absolut oder prozentual)"
 
-#: part/models.py:2158
+#: part/models.py:2167
 msgid "BOM item reference"
 msgstr "Referenz der Postion auf der Stückliste"
 
-#: part/models.py:2161
+#: part/models.py:2170
 msgid "BOM item notes"
 msgstr "Notizen zur Stücklisten-Position"
 
-#: part/models.py:2163
+#: part/models.py:2172
+#, fuzzy
+#| msgid "BOM checksum"
+msgid "Checksum"
+msgstr "Prüfsumme der Stückliste"
+
+#: part/models.py:2172
 msgid "BOM line checksum"
 msgstr "Prüfsumme der Stückliste"
 
-#: part/models.py:2167 templates/js/bom.js:275 templates/js/bom.js:282
+#: part/models.py:2176 templates/js/bom.js:275 templates/js/bom.js:282
 #: templates/js/table_filters.js:50
 msgid "Inherited"
 msgstr "Geerbt"
 
-#: part/models.py:2168
+#: part/models.py:2177
 msgid "This BOM item is inherited by BOMs for variant parts"
 msgstr ""
 "Diese Stücklisten-Position wird in dei Stücklisten von Teil-Varianten vererbt"
 
-#: part/models.py:2244 part/views.py:1592 part/views.py:1644
-#: stock/models.py:259
+#: part/models.py:2253 part/views.py:1592 part/views.py:1644
+#: stock/models.py:260
 msgid "Quantity must be integer value for trackable parts"
 msgstr "Menge muss eine Ganzzahl sein"
 
-#: part/models.py:2253 part/models.py:2255
+#: part/models.py:2262 part/models.py:2264
 msgid "Sub part must be specified"
 msgstr "Zulieferer-Teil muss festgelegt sein"
 
-#: part/models.py:2258
+#: part/models.py:2267
 msgid "BOM Item"
 msgstr "Stücklisten-Position"
 
-#: part/models.py:2379
+#: part/models.py:2384
+#, fuzzy
+#| msgid "Part"
+msgid "Part 1"
+msgstr "Teil"
+
+#: part/models.py:2388
+#, fuzzy
+#| msgid "Part"
+msgid "Part 2"
+msgstr "Teil"
+
+#: part/models.py:2388
 msgid "Select Related Part"
 msgstr "verknüpftes Teil auswählen"
 
-#: part/models.py:2411
+#: part/models.py:2420
 msgid ""
 "Error creating relationship: check that the part is not related to itself "
 "and that the relationship is unique"
@@ -3439,23 +3682,6 @@ msgstr ""
 msgid "Part Stock Allocations"
 msgstr "Teil-Bestandszuordnungen"
 
-#: part/templates/part/allocation.html:17
-#: part/templates/part/allocation.html:45
-msgid "Order"
-msgstr "Bestellung"
-
-#: part/templates/part/allocation.html:18
-#: part/templates/part/allocation.html:24
-#: part/templates/part/allocation.html:31
-#: part/templates/part/allocation.html:49
-#: stock/templates/stock/item_base.html:8
-#: stock/templates/stock/item_base.html:89
-#: stock/templates/stock/item_base.html:324
-#: stock/templates/stock/stock_adjust.html:16 templates/js/build.js:771
-#: templates/js/stock.js:923 templates/js/stock.js:1181
-msgid "Stock Item"
-msgstr "BestandsObjekt"
-
 #: part/templates/part/attachments.html:10
 msgid "Part Attachments"
 msgstr "Anhänge"
@@ -3475,6 +3701,23 @@ msgstr ""
 msgid "Bill of Materials"
 msgstr "Stückliste"
 
+#: part/templates/part/bom.html:19
+#, python-format
+msgid "The BOM for <i>%(part)s</i> has changed, and must be validated.<br>"
+msgstr ""
+
+#: part/templates/part/bom.html:21
+#, python-format
+msgid ""
+"The BOM for <i>%(part)s</i> was last checked by %(checker)s on %(check_date)s"
+msgstr ""
+
+#: part/templates/part/bom.html:25
+#, fuzzy, python-format
+#| msgid "This line has been validated"
+msgid "The BOM for <i>%(part)s</i> has not been validated."
+msgstr "Diese Position wurde validiert"
+
 #: part/templates/part/bom.html:32
 msgid "Remove selected BOM items"
 msgstr "Ausgewählte Stücklistenpositionen entfernen"
@@ -3614,6 +3857,22 @@ msgstr "Vorlage für Stückliste"
 msgid "Each part must already exist in the database"
 msgstr "Jedes Teil muss bereits in der Datenbank bestehen"
 
+#: part/templates/part/bom_upload/upload_file.html:27
+#, fuzzy
+#| msgid "Uploaded"
+msgid "Upload File"
+msgstr "Hochgeladen"
+
+#: part/templates/part/bom_validate.html:6
+#, python-format
+msgid ""
+"Confirm that the Bill of Materials (BOM) is valid for:<br><i>%(part)s</i>"
+msgstr ""
+
+#: part/templates/part/bom_validate.html:9
+msgid "This will validate each line in the BOM."
+msgstr ""
+
 #: part/templates/part/build.html:10
 msgid "Part Builds"
 msgstr "gefertigte Teile"
@@ -3691,7 +3950,7 @@ msgstr "Teil-Kategorie anlegen"
 msgid "Create new Part Category"
 msgstr "Neue Teil-Kategorie anlegen"
 
-#: part/templates/part/category.html:240 stock/views.py:1358
+#: part/templates/part/category.html:240 stock/views.py:1359
 msgid "Create new Stock Location"
 msgstr "Neuen Lagerort erstellen"
 
@@ -3790,10 +4049,6 @@ msgstr "Keine Seriennummern gefunden"
 msgid "Stock Expiry Time"
 msgstr "Bestands-Ablauf Zeit"
 
-#: part/templates/part/detail.html:132
-msgid "Created By"
-msgstr "Erstellt von"
-
 #: part/templates/part/detail.html:139
 msgid "Responsible User"
 msgstr "Verantwortlicher Benutzer"
@@ -3915,7 +4170,7 @@ msgstr "Neuer Parameter"
 
 #: part/templates/part/params.html:28
 #: report/templates/report/inventree_test_report_base.html:90
-#: stock/models.py:1650 templates/InvenTree/settings/header.html:8
+#: stock/models.py:1652 templates/InvenTree/settings/header.html:8
 #: templates/js/stock.js:124
 msgid "Value"
 msgstr "Wert"
@@ -3925,7 +4180,7 @@ msgid "Edit"
 msgstr "Bearbeiten"
 
 #: part/templates/part/params.html:44 part/templates/part/related.html:44
-#: part/templates/part/supplier.html:22 users/models.py:175
+#: part/templates/part/supplier.html:22 stock/views.py:1002 users/models.py:175
 msgid "Delete"
 msgstr "Löschen"
 
@@ -4419,18 +4674,30 @@ msgid "Sales order query filters"
 msgstr "Auftrags-Abfragefilter"
 
 #: report/models.py:500
+#, fuzzy
+#| msgid "Shipped"
+msgid "Snippet"
+msgstr "Versendet"
+
+#: report/models.py:501
 msgid "Report snippet file"
 msgstr "Berichts-Snippet"
 
-#: report/models.py:504
+#: report/models.py:505
 msgid "Snippet file description"
 msgstr "Snippet-Beschreibung"
 
-#: report/models.py:539
+#: report/models.py:540
+#, fuzzy
+#| msgid "Assembly"
+msgid "Asset"
+msgstr "Baugruppe"
+
+#: report/models.py:541
 msgid "Report asset file"
 msgstr "Berichts-Ressource"
 
-#: report/models.py:542
+#: report/models.py:544
 msgid "Asset file description"
 msgstr "Ressource-Beschreibung"
 
@@ -4452,12 +4719,12 @@ msgid "Test Results"
 msgstr "Testergebnisse"
 
 #: report/templates/report/inventree_test_report_base.html:88
-#: stock/models.py:1638
+#: stock/models.py:1640
 msgid "Test"
 msgstr "Test"
 
 #: report/templates/report/inventree_test_report_base.html:89
-#: stock/models.py:1644
+#: stock/models.py:1646
 msgid "Result"
 msgstr "Ergebnis"
 
@@ -4474,304 +4741,360 @@ msgstr "bestanden"
 msgid "Fail"
 msgstr "fehlgeschlagen"
 
-#: stock/forms.py:117
+#: stock/api.py:199
+#, fuzzy, python-brace-format
+#| msgid "Counted stock for {n} items"
+msgid "Updated stock for {n} items"
+msgstr "Bestand für {n} Objekte erfasst"
+
+#: stock/api.py:268
+#, fuzzy, python-brace-format
+#| msgid "Moved {n} items to {dest}"
+msgid "Moved {n} parts to {loc}"
+msgstr "{n} Teile nach {dest} bewegt"
+
+#: stock/forms.py:114 stock/forms.py:406 stock/models.py:473
+#: stock/templates/stock/item_base.html:349 templates/js/stock.js:652
+msgid "Expiry Date"
+msgstr "Ablaufdatum"
+
+#: stock/forms.py:115 stock/forms.py:407
+#, fuzzy
+#| msgid "Batch code for this stock item"
+msgid "Expiration date for this stock item"
+msgstr "Losnummer für dieses BestandsObjekt"
+
+#: stock/forms.py:118
 msgid "Enter unique serial numbers (or leave blank)"
 msgstr "Eindeutige Seriennummern eingeben (oder leer lassen)"
 
-#: stock/forms.py:202 stock/forms.py:258
-msgid "Select test report template"
-msgstr "Test Bericht Vorlage auswählen"
+#: stock/forms.py:169
+msgid ""
+"Destination for serialized stock (by default, will remain in current "
+"location)"
+msgstr ""
 
-#: stock/forms.py:266
-msgid "Include stock items in sub locations"
-msgstr "BestandsObjekt in untergeordneten Lagerorten einschließen"
+#: stock/forms.py:171
+msgid "Serial numbers"
+msgstr "Seriennummern"
 
-#: stock/forms.py:301
-msgid "Stock item to install"
-msgstr "BestandsObjekt zum verbauen"
+#: stock/forms.py:171
+#, fuzzy
+#| msgid "Number of unique serial number ({s}) must match quantity ({q})"
+msgid "Unique serial numbers (must match quantity)"
+msgstr ""
+"Anzahl der eindeutigen Seriennummern ({s}) muss mit der Anzahl ({q}) "
+"übereinstimmen"
 
-#: stock/forms.py:308
-msgid "Stock quantity to assign"
-msgstr "Bestandmenge zum Zuweisen"
-
-#: stock/forms.py:336
-msgid "Must not exceed available quantity"
-msgstr "Anzahl darf die verfügbare Anzahl nicht überschreiten"
-
-#: stock/forms.py:346
-msgid "Destination location for uninstalled items"
-msgstr "Ziel Lagerort für unverbaute Objekte"
-
-#: stock/forms.py:348
+#: stock/forms.py:173 stock/forms.py:349
 msgid "Add transaction note (optional)"
 msgstr "hinzufügen Transaktionsnotizen (optional)"
 
-#: stock/forms.py:350
+#: stock/forms.py:203 stock/forms.py:259
+msgid "Select test report template"
+msgstr "Test Bericht Vorlage auswählen"
+
+#: stock/forms.py:267 templates/js/table_filters.js:111
+msgid "Include sublocations"
+msgstr "Unter-Lagerorte einschließen"
+
+#: stock/forms.py:267
+msgid "Include stock items in sub locations"
+msgstr "BestandsObjekt in untergeordneten Lagerorten einschließen"
+
+#: stock/forms.py:302
+msgid "Stock item to install"
+msgstr "BestandsObjekt zum verbauen"
+
+#: stock/forms.py:309
+msgid "Stock quantity to assign"
+msgstr "Bestandmenge zum Zuweisen"
+
+#: stock/forms.py:337
+msgid "Must not exceed available quantity"
+msgstr "Anzahl darf die verfügbare Anzahl nicht überschreiten"
+
+#: stock/forms.py:347
+msgid "Destination location for uninstalled items"
+msgstr "Ziel Lagerort für unverbaute Objekte"
+
+#: stock/forms.py:351
 msgid "Confirm uninstall"
 msgstr "nicht mehr verbauen bestätigen"
 
-#: stock/forms.py:350
+#: stock/forms.py:351
 msgid "Confirm removal of installed stock items"
 msgstr "Entfernen der verbauten BestandsObjekt bestätigen"
 
-#: stock/forms.py:374
+#: stock/forms.py:375
 msgid "Destination stock location"
 msgstr "Ziel-Lagerbestand"
 
-#: stock/forms.py:376
+#: stock/forms.py:377
 msgid "Add note (required)"
 msgstr "Notiz hinzufügen (erforderlich)"
 
-#: stock/forms.py:380 stock/views.py:852 stock/views.py:1050
+#: stock/forms.py:381 stock/views.py:852 stock/views.py:1051
 msgid "Confirm stock adjustment"
 msgstr "Bestands-Anpassung bestätigen"
 
-#: stock/forms.py:380
+#: stock/forms.py:381
 msgid "Confirm movement of stock items"
 msgstr "Verschieben der BestandsObjekt bestätigen"
 
-#: stock/forms.py:382
+#: stock/forms.py:383
 msgid "Set Default Location"
 msgstr "Standard-Lagerort ändern"
 
-#: stock/forms.py:382
+#: stock/forms.py:383
 msgid "Set the destination as the default location for selected parts"
 msgstr "Setze das Ziel als Standard-Lagerort für ausgewählte Teile"
 
-#: stock/models.py:204
+#: stock/models.py:54 stock/models.py:511
+msgid "Owner"
+msgstr ""
+
+#: stock/models.py:55 stock/models.py:512
+#, fuzzy
+#| msgid "Select filter"
+msgid "Select Owner"
+msgstr "Filter auswählen"
+
+#: stock/models.py:205
 msgid "Created stock item"
 msgstr "Neues BestandsObjekt erstellt"
 
-#: stock/models.py:240
+#: stock/models.py:241
 msgid "StockItem with this serial number already exists"
 msgstr "Ein BestandsObjekt mit dieser Seriennummer existiert bereits"
 
-#: stock/models.py:276
+#: stock/models.py:277
 #, python-brace-format
 msgid "Part type ('{pf}') must be {pe}"
 msgstr "Teile-Typ ('{pf}') muss {pe} sein"
 
-#: stock/models.py:286 stock/models.py:295
+#: stock/models.py:287 stock/models.py:296
 msgid "Quantity must be 1 for item with a serial number"
 msgstr "Anzahl muss für Objekte mit Seriennummer 1 sein"
 
-#: stock/models.py:287
+#: stock/models.py:288
 msgid "Serial number cannot be set if quantity greater than 1"
 msgstr ""
 "Seriennummer kann nicht gesetzt werden wenn die Anzahl größer als 1 ist"
 
-#: stock/models.py:309
+#: stock/models.py:310
 msgid "Item cannot belong to itself"
 msgstr "Teil kann nicht zu sich selbst gehören"
 
-#: stock/models.py:315
+#: stock/models.py:316
 msgid "Item must have a build reference if is_building=True"
 msgstr "Teil muss eine Referenz haben wenn is_building wahr ist"
 
-#: stock/models.py:322
+#: stock/models.py:323
 msgid "Build reference does not point to the same part object"
 msgstr "Referenz verweist nicht auf das gleiche Teil"
 
-#: stock/models.py:362
+#: stock/models.py:363
 msgid "Parent Stock Item"
 msgstr "Eltern-BestandsObjekt"
 
-#: stock/models.py:371
+#: stock/models.py:372
 msgid "Base part"
 msgstr "Basis-Teil"
 
-#: stock/models.py:380
+#: stock/models.py:381
 msgid "Select a matching supplier part for this stock item"
 msgstr "Passendes Zulieferer-Teil für dieses BestandsObjekt auswählen"
 
-#: stock/models.py:385 stock/templates/stock/stock_app_base.html:7
+#: stock/models.py:386 stock/templates/stock/stock_app_base.html:7
 msgid "Stock Location"
 msgstr "Bestand-Lagerort"
 
-#: stock/models.py:388
+#: stock/models.py:389
 msgid "Where is this stock item located?"
 msgstr "Wo wird dieses Teil normalerweise gelagert?"
 
-#: stock/models.py:395
+#: stock/models.py:396
 msgid "Packaging this stock item is stored in"
 msgstr "Die Verpackung dieses BestandsObjekt ist gelagert in"
 
-#: stock/models.py:400 stock/templates/stock/item_base.html:255
+#: stock/models.py:401 stock/templates/stock/item_base.html:255
 msgid "Installed In"
 msgstr "verbaut in"
 
-#: stock/models.py:403
+#: stock/models.py:404
 msgid "Is this item installed in another item?"
 msgstr "Ist dieses Teil in einem anderen verbaut?"
 
-#: stock/models.py:419
+#: stock/models.py:420
 msgid "Serial number for this item"
 msgstr "Seriennummer für dieses Teil"
 
-#: stock/models.py:431
+#: stock/models.py:432
 msgid "Batch code for this stock item"
 msgstr "Losnummer für dieses BestandsObjekt"
 
-#: stock/models.py:435
+#: stock/models.py:436
 msgid "Stock Quantity"
 msgstr "Bestand"
 
-#: stock/models.py:444
+#: stock/models.py:445
 msgid "Source Build"
 msgstr "Quellbau"
 
-#: stock/models.py:446
+#: stock/models.py:447
 msgid "Build for this stock item"
 msgstr "Bau für dieses BestandsObjekt"
 
-#: stock/models.py:457
+#: stock/models.py:458
 msgid "Source Purchase Order"
 msgstr "Quelle Bestellung"
 
-#: stock/models.py:460
+#: stock/models.py:461
 msgid "Purchase order for this stock item"
 msgstr "Bestellung für dieses BestandsObjekt"
 
-#: stock/models.py:466
+#: stock/models.py:467
 msgid "Destination Sales Order"
 msgstr "Ziel-Auftrag"
 
-#: stock/models.py:472 stock/templates/stock/item_base.html:349
-#: templates/js/stock.js:652
-msgid "Expiry Date"
-msgstr "Ablaufdatum"
-
-#: stock/models.py:473
+#: stock/models.py:474
 msgid ""
 "Expiry date for stock item. Stock will be considered expired after this date"
 msgstr ""
 "Ablaufdatum für BestandsObjekt. Bestand wird danach als abgelaufen "
 "gekennzeichnet"
 
-#: stock/models.py:486
+#: stock/models.py:487
+#, fuzzy
+#| msgid "Delete Template"
+msgid "Delete on deplete"
+msgstr "Vorlage löschen"
+
+#: stock/models.py:487
 msgid "Delete this Stock Item when stock is depleted"
 msgstr "Dieses BestandsObjekt löschen wenn Bestand aufgebraucht"
 
-#: stock/models.py:496 stock/templates/stock/item_notes.html:13
+#: stock/models.py:497 stock/templates/stock/item_notes.html:13
 #: stock/templates/stock/navbar.html:54
 msgid "Stock Item Notes"
 msgstr "BestandsObjekt-Notizen"
 
-#: stock/models.py:506
+#: stock/models.py:507
 msgid "Single unit purchase price at time of purchase"
 msgstr "EK-Preis für eine Einheit bei EK-Datum"
 
-#: stock/models.py:610
+#: stock/models.py:612
 msgid "Assigned to Customer"
 msgstr "zugewiesen zum Kunden"
 
-#: stock/models.py:612
+#: stock/models.py:614
 msgid "Manually assigned to customer"
 msgstr "manuell zugewiesen zum Kunden"
 
-#: stock/models.py:625
+#: stock/models.py:627
 msgid "Returned from customer"
 msgstr "zurück vom Kunden"
 
-#: stock/models.py:627
+#: stock/models.py:629
 msgid "Returned to location"
 msgstr "zurück ins Lager"
 
-#: stock/models.py:787
+#: stock/models.py:789
 msgid "Installed into stock item"
 msgstr "In BestandsObjekt verbaut"
 
-#: stock/models.py:795
+#: stock/models.py:797
 msgid "Installed stock item"
 msgstr "verbautes BestandsObjekt"
 
-#: stock/models.py:819
+#: stock/models.py:821
 msgid "Uninstalled stock item"
 msgstr "BestandsObjekt ausgebaut"
 
-#: stock/models.py:838
+#: stock/models.py:840
 msgid "Uninstalled into location"
 msgstr "ausgebaut nach Lagerort"
 
-#: stock/models.py:939
+#: stock/models.py:941
 msgid "Part is not set as trackable"
 msgstr "Teil ist nicht verfolgbar"
 
-#: stock/models.py:945
+#: stock/models.py:947
 msgid "Quantity must be integer"
 msgstr "Anzahl muss eine Ganzzahl sein"
 
-#: stock/models.py:951
+#: stock/models.py:953
 #, python-brace-format
 msgid "Quantity must not exceed available stock quantity ({n})"
 msgstr "Anzahl darf nicht die verfügbare Anzahl überschreiten ({n})"
 
-#: stock/models.py:954
+#: stock/models.py:956
 msgid "Serial numbers must be a list of integers"
 msgstr "Seriennummern muss eine Liste von Ganzzahlen sein"
 
-#: stock/models.py:957
+#: stock/models.py:959
 msgid "Quantity does not match serial numbers"
 msgstr "Anzahl stimmt nicht mit den Seriennummern überein"
 
-#: stock/models.py:989
+#: stock/models.py:991
 msgid "Add serial number"
 msgstr "Seriennummer hinzufügen"
 
-#: stock/models.py:992
+#: stock/models.py:994
 #, python-brace-format
 msgid "Serialized {n} items"
 msgstr "{n} Teile serialisiert"
 
-#: stock/models.py:1070
+#: stock/models.py:1072
 msgid "Split from existing stock"
 msgstr "aufteilen vom vorhandenen Bestand"
 
-#: stock/models.py:1108
+#: stock/models.py:1110
 msgid "StockItem cannot be moved as it is not in stock"
 msgstr "BestandsObjekt kann nicht bewegt werden, da kein Bestand vorhanden ist"
 
-#: stock/models.py:1551
+#: stock/models.py:1553
 msgid "Title"
 msgstr "Titel"
 
-#: stock/models.py:1551
+#: stock/models.py:1553
 msgid "Tracking entry title"
 msgstr "Objektverfolgung - Name des Eintrags"
 
-#: stock/models.py:1553
+#: stock/models.py:1555
 msgid "Entry notes"
 msgstr "Eintrags-Notizen"
 
-#: stock/models.py:1555
+#: stock/models.py:1557
 msgid "Link to external page for further information"
 msgstr "Link auf externe Seite für weitere Informationen"
 
-#: stock/models.py:1615
+#: stock/models.py:1617
 msgid "Value must be provided for this test"
 msgstr "Wert muss für diesen Test angegeben werden"
 
-#: stock/models.py:1621
+#: stock/models.py:1623
 msgid "Attachment must be uploaded for this test"
 msgstr "Anhang muss für diesen Test hochgeladen werden"
 
-#: stock/models.py:1639
+#: stock/models.py:1641
 msgid "Test name"
 msgstr "Name des Tests"
 
-#: stock/models.py:1645 templates/js/table_filters.js:190
+#: stock/models.py:1647 templates/js/table_filters.js:190
 msgid "Test result"
 msgstr "Testergebnis"
 
-#: stock/models.py:1651
+#: stock/models.py:1653
 msgid "Test output value"
 msgstr "Test Ausgabe Wert"
 
-#: stock/models.py:1658
+#: stock/models.py:1660
 msgid "Test result attachment"
 msgstr "Test Ergebnis Anhang"
 
-#: stock/models.py:1664
+#: stock/models.py:1666
 msgid "Test notes"
 msgstr "Test Notizen"
 
@@ -4941,11 +5264,6 @@ msgstr "Kein Lagerort gesetzt"
 msgid "Barcode Identifier"
 msgstr "Barcode-Bezeichner"
 
-#: stock/templates/stock/item_base.html:302 templates/InvenTree/search.html:167
-#: templates/js/build.js:655 templates/navbar.html:29
-msgid "Build"
-msgstr "Bauauftrag"
-
 #: stock/templates/stock/item_base.html:323
 msgid "Parent Item"
 msgstr "Elternposition"
@@ -5129,7 +5447,7 @@ msgstr "Lade..."
 msgid "The following stock items will be uninstalled"
 msgstr "Die folgenden BestandsObjekte werden nicht mehr verbaut"
 
-#: stock/templates/stock/stockitem_convert.html:7 stock/views.py:1331
+#: stock/templates/stock/stockitem_convert.html:7 stock/views.py:1332
 msgid "Convert Stock Item"
 msgstr "BestandsObjekt umwandeln"
 
@@ -5149,8 +5467,8 @@ msgstr "Diese Aktion kann nicht einfach rückgängig gemacht werden"
 msgid "Edit Stock Location"
 msgstr "BestandsObjekt-Lagerort bearbeiten"
 
-#: stock/views.py:230 stock/views.py:1321 stock/views.py:1432
-#: stock/views.py:1797
+#: stock/views.py:230 stock/views.py:1322 stock/views.py:1433
+#: stock/views.py:1798
 msgid "Owner is required (ownership control is enabled)"
 msgstr "Eigentümer notwendig (Eigentümerkontrolle aktiv)"
 
@@ -5238,95 +5556,123 @@ msgstr "Lagerbestand anpassen"
 msgid "Move Stock Items"
 msgstr "BestandsObjekte bewegen"
 
+#: stock/views.py:998
+msgid "Move"
+msgstr ""
+
 #: stock/views.py:999
 msgid "Count Stock Items"
 msgstr "BestandsObjekte zählen"
 
+#: stock/views.py:999
+#, fuzzy
+#| msgid "Account"
+msgid "Count"
+msgstr "Konto"
+
 #: stock/views.py:1000
 msgid "Remove From Stock"
 msgstr "Aus Lagerbestand entfernen"
 
+#: stock/views.py:1000
+msgid "Take"
+msgstr ""
+
 #: stock/views.py:1001
 msgid "Add Stock Items"
 msgstr "BestandsObjekte hinzufügen"
 
+#: stock/views.py:1001 users/models.py:171
+msgid "Add"
+msgstr "Hinzufügen"
+
 #: stock/views.py:1002
 msgid "Delete Stock Items"
 msgstr "BestandsObjekte löschen"
 
-#: stock/views.py:1030
+#: stock/views.py:1031
 msgid "Must enter integer value"
 msgstr "Nur Ganzzahl eingeben"
 
-#: stock/views.py:1035
+#: stock/views.py:1036
 msgid "Quantity must be positive"
 msgstr "Anzahl muss positiv sein"
 
-#: stock/views.py:1042
+#: stock/views.py:1043
 #, python-brace-format
 msgid "Quantity must not exceed {x}"
 msgstr "Anzahl darf {x} nicht überschreiten"
 
-#: stock/views.py:1106
+#: stock/views.py:1107
 msgid "No action performed"
 msgstr "Keine Aktion durchgeführt"
 
-#: stock/views.py:1149
+#: stock/views.py:1122
+#, python-brace-format
+msgid "Added stock to {n} items"
+msgstr "Vorrat zu {n} BestandsObjekten hinzugefügt"
+
+#: stock/views.py:1137
+#, python-brace-format
+msgid "Removed stock from {n} items"
+msgstr "Vorrat von {n} BestandsObjekten entfernt"
+
+#: stock/views.py:1150
 #, python-brace-format
 msgid "Counted stock for {n} items"
 msgstr "Bestand für {n} Objekte erfasst"
 
-#: stock/views.py:1189
+#: stock/views.py:1190
 msgid "No items were moved"
 msgstr "Keine BestandsObjekt wurden bewegt"
 
-#: stock/views.py:1192
+#: stock/views.py:1193
 #, python-brace-format
 msgid "Moved {n} items to {dest}"
 msgstr "{n} Teile nach {dest} bewegt"
 
-#: stock/views.py:1211
+#: stock/views.py:1212
 #, python-brace-format
 msgid "Deleted {n} stock items"
 msgstr "{n} BestandsObjekte gelöscht"
 
-#: stock/views.py:1223
+#: stock/views.py:1224
 msgid "Edit Stock Item"
 msgstr "BestandsObjekt bearbeiten"
 
-#: stock/views.py:1449
+#: stock/views.py:1450
 msgid "Serialize Stock"
 msgstr "Lagerbestand erfassen"
 
-#: stock/views.py:1542 templates/js/build.js:210
+#: stock/views.py:1543 templates/js/build.js:210
 msgid "Create new Stock Item"
 msgstr "Neues BestandsObjekt hinzufügen"
 
-#: stock/views.py:1684
+#: stock/views.py:1685
 msgid "Duplicate Stock Item"
 msgstr "Bestand duplizieren"
 
-#: stock/views.py:1766
+#: stock/views.py:1767
 msgid "Quantity cannot be negative"
 msgstr "Anzahl kann nicht negativ sein"
 
-#: stock/views.py:1866
+#: stock/views.py:1867
 msgid "Delete Stock Location"
 msgstr "Bestand-Lagerort löschen"
 
-#: stock/views.py:1879
+#: stock/views.py:1880
 msgid "Delete Stock Item"
 msgstr "BestandsObjekt löschen"
 
-#: stock/views.py:1890
+#: stock/views.py:1891
 msgid "Delete Stock Tracking Entry"
 msgstr "Lagerbestands-Tracking-Eintrag löschen"
 
-#: stock/views.py:1897
+#: stock/views.py:1898
 msgid "Edit Stock Tracking Entry"
 msgstr "Lagerbestands-Tracking-Eintrag bearbeiten"
 
-#: stock/views.py:1906
+#: stock/views.py:1907
 msgid "Add Stock Tracking Entry"
 msgstr "Lagerbestands-Tracking-Eintrag hinzufügen"
 
@@ -5430,10 +5776,6 @@ msgstr "Kategorie-Parametervorlagen"
 msgid "No category parameter templates found"
 msgstr "Keine Kategorie-Parametervorlagen gefunden"
 
-#: templates/InvenTree/settings/category.html:67
-msgid "Default Value"
-msgstr "Standard-Wert"
-
 #: templates/InvenTree/settings/category.html:70
 #: templates/InvenTree/settings/part.html:81
 msgid "Edit Template"
@@ -5749,10 +6091,6 @@ msgstr "Barcode entspricht keinem Lagerort"
 msgid "Open subassembly"
 msgstr "Unterbaugruppe öffnen"
 
-#: templates/js/bom.js:216 templates/js/bom.js:269
-msgid "Optional"
-msgstr "Optional"
-
 #: templates/js/bom.js:261
 msgid "No pricing available"
 msgstr "Keine Preisinformation verfügbar"
@@ -5761,10 +6099,6 @@ msgstr "Keine Preisinformation verfügbar"
 msgid "View BOM"
 msgstr "Stückliste anzeigen"
 
-#: templates/js/bom.js:338 templates/js/build.js:571 templates/js/build.js:984
-msgid "Actions"
-msgstr "Aktionen"
-
 #: templates/js/bom.js:346
 msgid "Validate BOM Item"
 msgstr "Stücklisten-Position validieren"
@@ -6026,10 +6360,6 @@ msgstr "Bestellung überfällig"
 msgid "No sales orders found"
 msgstr "Keine Aufträge gefunden"
 
-#: templates/js/order.js:303
-msgid "Shipment Date"
-msgstr "Versanddatum"
-
 #: templates/js/part.js:51 templates/js/part.js:136
 msgid "Trackable part"
 msgstr "nachverfolgbares Teil"
@@ -6349,10 +6679,6 @@ msgstr "Ist zugeordnet"
 msgid "Item has been allocated"
 msgstr "Teil wurde zugeordnet"
 
-#: templates/js/table_filters.js:111
-msgid "Include sublocations"
-msgstr "Unter-Lagerorte einschließen"
-
 #: templates/js/table_filters.js:112
 msgid "Include stock in sublocations"
 msgstr "Bestand in Unter-Lagerorten einschließen"
@@ -6550,10 +6876,6 @@ msgstr "Benutzername eingeben"
 msgid "Password"
 msgstr "Passwort"
 
-#: templates/registration/login.html:76
-msgid "Enter password"
-msgstr "Passwort eingeben"
-
 #: templates/registration/login.html:83
 msgid "Username / password combination is incorrect"
 msgstr "Benutzername / Passwort Kombination ist falsch"
@@ -6690,10 +7012,6 @@ msgstr "Ansicht"
 msgid "Permission to view items"
 msgstr "Berechtigung Einträge anzuzeigen"
 
-#: users/models.py:171
-msgid "Add"
-msgstr "Hinzufügen"
-
 #: users/models.py:171
 msgid "Permission to add items"
 msgstr "Berechtigung Einträge zu erstellen"
@@ -6710,6 +7028,9 @@ msgstr "Berechtigungen Einträge zu ändern"
 msgid "Permission to delete items"
 msgstr "Berechtigung Einträge zu löschen"
 
+#~ msgid "items"
+#~ msgstr "Teile"
+
 #~ msgid "Create purchase order"
 #~ msgstr "Neue Bestellung anlegen"
 
@@ -6721,9 +7042,6 @@ msgstr "Berechtigung Einträge zu löschen"
 #~ msgid "Show QR code"
 #~ msgstr "QR-Code anzeigen"
 
-#~ msgid "Serial numbers"
-#~ msgstr "Seriennummern"
-
 #~ msgid "name"
 #~ msgstr "Name"
 
@@ -6798,9 +7116,6 @@ msgstr "Berechtigung Einträge zu löschen"
 #~ msgid "Default_location"
 #~ msgstr "Standard-Lagerort"
 
-#~ msgid "Buy parts"
-#~ msgstr "Teile kaufen"
-
 #~ msgid "Build parts"
 #~ msgstr "Bauteile"
 
@@ -6896,17 +7211,6 @@ msgstr "Berechtigung Einträge zu löschen"
 #~ msgid "Finished"
 #~ msgstr "Bearbeitung beenden"
 
-#, fuzzy
-#~| msgid "Validate BOM"
-#~ msgid "Validate"
-#~ msgstr "BOM validieren"
-
-#~ msgid "Added stock to {n} items"
-#~ msgstr "Vorrat zu {n} BestandsObjekten hinzugefügt"
-
-#~ msgid "Removed stock from {n} items"
-#~ msgstr "Vorrat von {n} BestandsObjekten entfernt"
-
 #, fuzzy
 #~| msgid "Confirm stock adjustment"
 #~ msgid "Document actions"
@@ -7201,6 +7505,3 @@ msgstr "Berechtigung Einträge zu löschen"
 
 #~ msgid "Allocate"
 #~ msgstr "zuweisen"
-
-#~ msgid "Line"
-#~ msgstr "Position"
diff --git a/InvenTree/locale/en/LC_MESSAGES/django.po b/InvenTree/locale/en/LC_MESSAGES/django.po
index 7fe67bf929..bb954c049d 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: 2021-04-03 02:10+0000\n"
+"POT-Creation-Date: 2021-04-04 20:22+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"
@@ -34,32 +34,47 @@ msgstr ""
 msgid "Enter date"
 msgstr ""
 
-#: InvenTree/forms.py:110 build/forms.py:99 build/forms.py:187
+#: InvenTree/forms.py:110 build/forms.py:99 build/forms.py:120
+#: build/forms.py:142 build/forms.py:166 build/forms.py:188 build/forms.py:223
+#: order/forms.py:27 order/forms.py:38 order/forms.py:49 order/forms.py:60
+#: order/forms.py:71 part/forms.py:132
 msgid "Confirm"
 msgstr ""
 
 #: InvenTree/forms.py:126
+msgid "Confirm delete"
+msgstr ""
+
+#: InvenTree/forms.py:127
 msgid "Confirm item deletion"
 msgstr ""
 
-#: InvenTree/forms.py:158
+#: InvenTree/forms.py:159 templates/registration/login.html:76
+msgid "Enter password"
+msgstr ""
+
+#: InvenTree/forms.py:160
 msgid "Enter new password"
 msgstr ""
 
-#: InvenTree/forms.py:165
+#: InvenTree/forms.py:167
+msgid "Confirm password"
+msgstr ""
+
+#: InvenTree/forms.py:168
 msgid "Confirm new password"
 msgstr ""
 
-#: InvenTree/forms.py:200
+#: InvenTree/forms.py:203
 msgid "Apply Theme"
 msgstr ""
 
-#: InvenTree/forms.py:230
+#: InvenTree/forms.py:233
 msgid "Select Category"
 msgstr ""
 
-#: InvenTree/helpers.py:361 order/models.py:242 order/models.py:341
-#: stock/views.py:1762
+#: InvenTree/helpers.py:361 order/models.py:245 order/models.py:344
+#: stock/views.py:1763
 msgid "Invalid quantity provided"
 msgstr ""
 
@@ -91,7 +106,7 @@ msgstr ""
 msgid "Number of unique serial number ({s}) must match quantity ({q})"
 msgstr ""
 
-#: InvenTree/models.py:59 stock/models.py:1657
+#: InvenTree/models.py:59 stock/models.py:1659
 msgid "Attachment"
 msgstr ""
 
@@ -107,7 +122,7 @@ msgstr ""
 msgid "File comment"
 msgstr ""
 
-#: InvenTree/models.py:68 InvenTree/models.py:69
+#: InvenTree/models.py:68 InvenTree/models.py:69 part/models.py:1888
 #: report/templates/report/inventree_test_report_base.html:91
 #: templates/js/stock.js:960
 msgid "User"
@@ -118,20 +133,21 @@ msgid "upload date"
 msgstr ""
 
 #: InvenTree/models.py:107 InvenTree/models.py:108 label/models.py:101
-#: part/models.py:686 part/templates/part/params.html:27 report/models.py:179
-#: templates/InvenTree/search.html:136 templates/InvenTree/search.html:273
-#: templates/js/part.js:109
+#: part/models.py:686 part/models.py:2029 part/templates/part/params.html:27
+#: report/models.py:179 templates/InvenTree/search.html:136
+#: templates/InvenTree/search.html:273 templates/js/part.js:109
 msgid "Name"
 msgstr ""
 
 #: InvenTree/models.py:114 build/models.py:134
-#: build/templates/build/detail.html:21 company/models.py:359
+#: build/templates/build/detail.html:21 company/models.py:361
 #: company/templates/company/detail.html:26
 #: company/templates/company/supplier_part_base.html:70
 #: company/templates/company/supplier_part_detail.html:31 label/models.py:108
-#: order/templates/order/purchase_order_detail.html:168 part/models.py:710
-#: part/templates/part/detail.html:54 part/templates/part/set_category.html:14
-#: report/models.py:192
+#: order/models.py:101 order/templates/order/purchase_order_detail.html:168
+#: part/models.py:710 part/templates/part/detail.html:54
+#: part/templates/part/set_category.html:14 report/models.py:192
+#: report/models.py:505 report/models.py:544
 #: report/templates/report/inventree_build_order_base.html:118
 #: templates/InvenTree/search.html:143 templates/InvenTree/search.html:208
 #: templates/InvenTree/search.html:280
@@ -246,7 +262,8 @@ msgid "Invalid character in part name"
 msgstr ""
 
 #: InvenTree/validators.py:63
-msgid "IPN must match regex pattern"
+#, python-brace-format
+msgid "IPN must match regex pattern {pat}"
 msgstr ""
 
 #: InvenTree/validators.py:77 InvenTree/validators.py:91
@@ -344,7 +361,7 @@ msgid "Order target date"
 msgstr ""
 
 #: build/forms.py:39 build/templates/build/build_base.html:104
-#: build/templates/build/detail.html:121
+#: build/templates/build/detail.html:121 order/forms.py:109 order/forms.py:144
 #: order/templates/order/order_base.html:124
 #: order/templates/order/sales_order_base.html:117
 #: report/templates/report/inventree_build_order_base.html:126
@@ -358,15 +375,20 @@ msgid ""
 "Target date for build completion. Build will be overdue after this date."
 msgstr ""
 
-#: build/forms.py:45 build/forms.py:87
+#: build/forms.py:45 build/forms.py:87 build/forms.py:257 build/models.py:1103
 #: build/templates/build/auto_allocate.html:17
 #: build/templates/build/build_base.html:91
 #: build/templates/build/detail.html:31 common/models.py:696
 #: company/forms.py:131 company/templates/company/supplier_part_pricing.html:77
-#: order/forms.py:237 order/templates/order/order_wizard/select_parts.html:32
+#: order/forms.py:188 order/forms.py:205 order/forms.py:239 order/forms.py:261
+#: order/forms.py:278 order/models.py:593 order/models.py:784
+#: order/templates/order/order_wizard/select_parts.html:32
 #: order/templates/order/purchase_order_detail.html:193
+#: order/templates/order/sales_order_detail.html:70
 #: order/templates/order/sales_order_detail.html:77
 #: order/templates/order/sales_order_detail.html:159
+#: order/templates/order/sales_order_detail.html:224 part/forms.py:340
+#: part/forms.py:369 part/forms.py:385 part/models.py:2158
 #: part/templates/part/allocation.html:19
 #: part/templates/part/allocation.html:53
 #: part/templates/part/part_pricing.html:12
@@ -376,7 +398,8 @@ msgstr ""
 #: report/templates/report/inventree_po_report.html:91
 #: report/templates/report/inventree_so_report.html:91
 #: report/templates/report/inventree_test_report_base.html:77
-#: stock/forms.py:307 stock/templates/stock/item_base.html:51
+#: stock/forms.py:175 stock/forms.py:308 stock/models.py:1563
+#: stock/templates/stock/item_base.html:51
 #: stock/templates/stock/item_base.html:57
 #: stock/templates/stock/item_base.html:240
 #: stock/templates/stock/stock_adjust.html:18 templates/js/barcode.js:364
@@ -393,7 +416,7 @@ msgstr ""
 msgid "Enter quantity for build output"
 msgstr ""
 
-#: build/forms.py:92 order/forms.py:231 stock/forms.py:117
+#: build/forms.py:92 order/forms.py:233 stock/forms.py:118
 msgid "Serial Numbers"
 msgstr ""
 
@@ -405,39 +428,57 @@ msgstr ""
 msgid "Confirm creation of build output"
 msgstr ""
 
-#: build/forms.py:120
+#: build/forms.py:121
 msgid "Confirm deletion of build output"
 msgstr ""
 
-#: build/forms.py:141
+#: build/forms.py:142
 msgid "Confirm unallocation of stock"
 msgstr ""
 
-#: build/forms.py:165
+#: build/forms.py:166
 msgid "Confirm stock allocation"
 msgstr ""
 
-#: build/forms.py:188
+#: build/forms.py:189
 msgid "Mark build as complete"
 msgstr ""
 
-#: build/forms.py:212
+#: build/forms.py:213 build/templates/build/auto_allocate.html:18
+#: order/forms.py:82 stock/forms.py:347
+#: stock/templates/stock/item_base.html:270
+#: stock/templates/stock/stock_adjust.html:17
+#: templates/InvenTree/search.html:244 templates/js/barcode.js:363
+#: templates/js/barcode.js:531 templates/js/build.js:434
+#: templates/js/stock.js:637
+msgid "Location"
+msgstr ""
+
+#: build/forms.py:214
 msgid "Location of completed parts"
 msgstr ""
 
-#: build/forms.py:217
-msgid "Confirm completion with incomplete stock allocation"
+#: build/forms.py:219
+msgid "Confirm incomplete"
 msgstr ""
 
 #: build/forms.py:220
+msgid "Confirm completion with incomplete stock allocation"
+msgstr ""
+
+#: build/forms.py:223
 msgid "Confirm build completion"
 msgstr ""
 
-#: build/forms.py:240 build/views.py:66
+#: build/forms.py:243
+msgid "Confirm cancel"
+msgstr ""
+
+#: build/forms.py:243 build/views.py:66
 msgid "Confirm build cancellation"
 msgstr ""
 
-#: build/forms.py:254
+#: build/forms.py:257
 msgid "Select quantity of stock to allocate"
 msgstr ""
 
@@ -462,7 +503,9 @@ msgstr ""
 msgid "Build Order Reference"
 msgstr ""
 
-#: build/models.py:127 order/templates/order/purchase_order_detail.html:188
+#: build/models.py:127 order/models.py:99 order/models.py:595
+#: order/templates/order/purchase_order_detail.html:188
+#: order/templates/order/sales_order_detail.html:219 part/models.py:2167
 #: report/templates/report/inventree_po_report.html:92
 #: report/templates/report/inventree_so_report.html:92 templates/js/bom.js:197
 #: templates/js/build.js:509 templates/js/build.js:948
@@ -484,11 +527,15 @@ msgstr ""
 
 #: build/models.py:152 build/templates/build/auto_allocate.html:16
 #: build/templates/build/build_base.html:86
-#: build/templates/build/detail.html:26 order/models.py:662
+#: build/templates/build/detail.html:26 company/models.py:535
+#: order/models.py:637 order/models.py:669
 #: order/templates/order/order_wizard/select_parts.html:30
 #: order/templates/order/purchase_order_detail.html:156
-#: order/templates/order/receive_parts.html:19 part/models.py:321
-#: part/models.py:2054 part/templates/part/part_app_base.html:7
+#: order/templates/order/receive_parts.html:19
+#: order/templates/order/sales_order_detail.html:207 part/models.py:321
+#: part/models.py:1856 part/models.py:1868 part/models.py:1886
+#: part/models.py:1961 part/models.py:2057 part/models.py:2142
+#: part/templates/part/part_app_base.html:7
 #: part/templates/part/part_pricing.html:15 part/templates/part/related.html:29
 #: part/templates/part/set_category.html:13
 #: part/templates/part/subcategories.html:17
@@ -558,7 +605,7 @@ msgstr ""
 msgid "Build status code"
 msgstr ""
 
-#: build/models.py:212 stock/models.py:429
+#: build/models.py:212 stock/models.py:430
 msgid "Batch Code"
 msgstr ""
 
@@ -566,11 +613,16 @@ msgstr ""
 msgid "Batch code for this build output"
 msgstr ""
 
-#: build/models.py:223 order/models.py:447
+#: build/models.py:219 order/models.py:105 part/models.py:882
+#: part/templates/part/detail.html:126 templates/js/order.js:293
+msgid "Creation Date"
+msgstr ""
+
+#: build/models.py:223 order/models.py:451
 msgid "Target completion date"
 msgstr ""
 
-#: build/models.py:227 order/models.py:215
+#: build/models.py:227 order/models.py:218
 msgid "Completion Date"
 msgstr ""
 
@@ -587,9 +639,9 @@ msgid "User who issued this build order"
 msgstr ""
 
 #: build/models.py:250 build/templates/build/build_base.html:142
-#: build/templates/build/detail.html:105 order/models.py:118
+#: build/templates/build/detail.html:105 order/models.py:119
 #: order/templates/order/order_base.html:138
-#: order/templates/order/sales_order_base.html:138 part/models.py:885
+#: order/templates/order/sales_order_base.html:138 part/models.py:886
 #: report/templates/report/inventree_build_order_base.html:159
 msgid "Responsible"
 msgstr ""
@@ -602,26 +654,28 @@ msgstr ""
 #: company/templates/company/supplier_part_base.html:77
 #: company/templates/company/supplier_part_detail.html:28
 #: part/templates/part/detail.html:83 part/templates/part/part_base.html:100
-#: stock/models.py:423 stock/templates/stock/item_base.html:330
+#: stock/models.py:424 stock/templates/stock/item_base.html:330
 msgid "External Link"
 msgstr ""
 
-#: build/models.py:257 part/models.py:744 stock/models.py:425
+#: build/models.py:257 part/models.py:744 stock/models.py:426
 msgid "Link to external URL"
 msgstr ""
 
 #: build/models.py:261 build/templates/build/navbar.html:59
-#: company/models.py:366 company/templates/company/navbar.html:59
-#: company/templates/company/navbar.html:62
-#: order/templates/order/po_navbar.html:29
+#: company/models.py:129 company/models.py:368
+#: company/templates/company/navbar.html:59
+#: company/templates/company/navbar.html:62 order/models.py:123
+#: order/models.py:597 order/templates/order/po_navbar.html:29
 #: order/templates/order/po_navbar.html:32
 #: order/templates/order/purchase_order_detail.html:227
+#: order/templates/order/sales_order_detail.html:264
 #: order/templates/order/so_navbar.html:33
-#: order/templates/order/so_navbar.html:36 part/models.py:870
+#: order/templates/order/so_navbar.html:36 part/models.py:871
 #: part/templates/part/navbar.html:122
 #: report/templates/report/inventree_build_order_base.html:173
-#: stock/forms.py:316 stock/forms.py:348 stock/forms.py:376 stock/models.py:495
-#: stock/models.py:1553 stock/models.py:1663
+#: stock/forms.py:173 stock/forms.py:317 stock/forms.py:349 stock/forms.py:377
+#: stock/models.py:496 stock/models.py:1555 stock/models.py:1665
 #: stock/templates/stock/navbar.html:57 templates/js/barcode.js:37
 #: templates/js/bom.js:329 templates/js/stock.js:128 templates/js/stock.js:667
 msgid "Notes"
@@ -665,11 +719,11 @@ msgstr ""
 msgid "Allocated quantity ({n}) must not exceed available quantity ({q})"
 msgstr ""
 
-#: build/models.py:1034 order/models.py:751
+#: build/models.py:1034 order/models.py:758
 msgid "StockItem is over-allocated"
 msgstr ""
 
-#: build/models.py:1038 order/models.py:754
+#: build/models.py:1038 order/models.py:761
 msgid "Allocation quantity must be greater than zero"
 msgstr ""
 
@@ -677,19 +731,41 @@ msgstr ""
 msgid "Quantity must be 1 for serialized stock"
 msgstr ""
 
-#: build/models.py:1082
+#: build/models.py:1082 stock/templates/stock/item_base.html:302
+#: templates/InvenTree/search.html:167 templates/js/build.js:655
+#: templates/navbar.html:29
+msgid "Build"
+msgstr ""
+
+#: build/models.py:1083
 msgid "Build to allocate parts"
 msgstr ""
 
-#: build/models.py:1089
+#: build/models.py:1090 part/templates/part/allocation.html:18
+#: part/templates/part/allocation.html:24
+#: part/templates/part/allocation.html:31
+#: part/templates/part/allocation.html:49
+#: stock/templates/stock/item_base.html:8
+#: stock/templates/stock/item_base.html:89
+#: stock/templates/stock/item_base.html:324
+#: stock/templates/stock/stock_adjust.html:16 templates/js/build.js:771
+#: templates/js/stock.js:923 templates/js/stock.js:1181
+msgid "Stock Item"
+msgstr ""
+
+#: build/models.py:1091
 msgid "Source stock item"
 msgstr ""
 
-#: build/models.py:1101
+#: build/models.py:1104
 msgid "Stock quantity to allocate to build"
 msgstr ""
 
-#: build/models.py:1109
+#: build/models.py:1112
+msgid "Install into"
+msgstr ""
+
+#: build/models.py:1113
 msgid "Destination stock item"
 msgstr ""
 
@@ -757,15 +833,6 @@ msgid ""
 "The following stock items will be allocated to the specified build output"
 msgstr ""
 
-#: build/templates/build/auto_allocate.html:18 stock/forms.py:346
-#: stock/templates/stock/item_base.html:270
-#: stock/templates/stock/stock_adjust.html:17
-#: templates/InvenTree/search.html:244 templates/js/barcode.js:363
-#: templates/js/barcode.js:531 templates/js/build.js:434
-#: templates/js/stock.js:637
-msgid "Location"
-msgstr ""
-
 #: build/templates/build/auto_allocate.html:37
 msgid "No stock items found that can be automatically allocated to this build"
 msgstr ""
@@ -836,7 +903,7 @@ msgid "Build Details"
 msgstr ""
 
 #: build/templates/build/build_base.html:96
-#: build/templates/build/detail.html:59
+#: build/templates/build/detail.html:59 order/models.py:445
 #: order/templates/order/receive_parts.html:24
 #: stock/templates/stock/item_base.html:376 templates/InvenTree/search.html:236
 #: templates/js/barcode.js:119 templates/js/build.js:710
@@ -855,7 +922,7 @@ msgid "Progress"
 msgstr ""
 
 #: build/templates/build/build_base.html:128
-#: build/templates/build/detail.html:84 order/models.py:660
+#: build/templates/build/detail.html:84 order/models.py:667
 #: order/templates/order/sales_order_base.html:9
 #: order/templates/order/sales_order_base.html:33
 #: order/templates/order/sales_order_ship.html:25
@@ -966,7 +1033,7 @@ msgstr ""
 msgid "Stock can be taken from any available location."
 msgstr ""
 
-#: build/templates/build/detail.html:46 stock/forms.py:374
+#: build/templates/build/detail.html:46 stock/forms.py:169 stock/forms.py:375
 msgid "Destination"
 msgstr ""
 
@@ -1099,7 +1166,7 @@ msgstr ""
 msgid "Create Build Output"
 msgstr ""
 
-#: build/views.py:203 stock/models.py:964 stock/views.py:1788
+#: build/views.py:203 stock/models.py:966 stock/views.py:1789
 msgid "Serial numbers already exist"
 msgstr ""
 
@@ -1237,7 +1304,7 @@ msgstr ""
 msgid "String descriptor for the server instance"
 msgstr ""
 
-#: common/models.py:62 company/models.py:95 company/models.py:96
+#: common/models.py:62 company/models.py:96 company/models.py:97
 msgid "Company name"
 msgstr ""
 
@@ -1341,8 +1408,8 @@ msgstr ""
 msgid "Number of recent parts to display on index page"
 msgstr ""
 
-#: common/models.py:150 part/models.py:2056 part/templates/part/detail.html:160
-#: report/models.py:185 stock/forms.py:258 templates/js/table_filters.js:24
+#: common/models.py:150 part/models.py:2059 part/templates/part/detail.html:160
+#: report/models.py:185 stock/forms.py:259 templates/js/table_filters.js:24
 #: templates/js/table_filters.js:288
 msgid "Template"
 msgstr ""
@@ -1351,7 +1418,7 @@ msgstr ""
 msgid "Parts are templates by default"
 msgstr ""
 
-#: common/models.py:157 part/models.py:833 part/templates/part/detail.html:170
+#: common/models.py:157 part/models.py:834 part/templates/part/detail.html:170
 #: templates/js/table_filters.js:101 templates/js/table_filters.js:300
 msgid "Assembly"
 msgstr ""
@@ -1360,7 +1427,7 @@ msgstr ""
 msgid "Parts can be assembled from other components by default"
 msgstr ""
 
-#: common/models.py:164 part/models.py:839 part/templates/part/detail.html:180
+#: common/models.py:164 part/models.py:840 part/templates/part/detail.html:180
 #: templates/js/table_filters.js:304
 msgid "Component"
 msgstr ""
@@ -1369,7 +1436,7 @@ msgstr ""
 msgid "Parts can be used as sub-components by default"
 msgstr ""
 
-#: common/models.py:171 part/models.py:850 part/templates/part/detail.html:200
+#: common/models.py:171 part/models.py:851 part/templates/part/detail.html:200
 msgid "Purchaseable"
 msgstr ""
 
@@ -1377,7 +1444,7 @@ msgstr ""
 msgid "Parts are purchaseable by default"
 msgstr ""
 
-#: common/models.py:178 part/models.py:855 part/templates/part/detail.html:210
+#: common/models.py:178 part/models.py:856 part/templates/part/detail.html:210
 #: templates/js/table_filters.js:312
 msgid "Salable"
 msgstr ""
@@ -1386,7 +1453,7 @@ msgstr ""
 msgid "Parts are salable by default"
 msgstr ""
 
-#: common/models.py:185 part/models.py:845 part/templates/part/detail.html:190
+#: common/models.py:185 part/models.py:846 part/templates/part/detail.html:190
 #: templates/js/table_filters.js:32 templates/js/table_filters.js:316
 msgid "Trackable"
 msgstr ""
@@ -1395,7 +1462,7 @@ msgstr ""
 msgid "Parts are trackable by default"
 msgstr ""
 
-#: common/models.py:192 part/models.py:865 part/templates/part/detail.html:150
+#: common/models.py:192 part/models.py:866 part/templates/part/detail.html:150
 #: templates/js/table_filters.js:28
 msgid "Virtual"
 msgstr ""
@@ -1585,12 +1652,12 @@ msgstr ""
 msgid "Supplied value must be a boolean"
 msgstr ""
 
-#: company/forms.py:37 company/models.py:137
+#: company/forms.py:37 company/models.py:139
 #: company/templates/company/detail.html:40
 msgid "Currency"
 msgstr ""
 
-#: company/forms.py:38 company/models.py:139
+#: company/forms.py:38 company/models.py:141
 msgid "Default currency used for this company"
 msgstr ""
 
@@ -1610,95 +1677,106 @@ msgstr ""
 msgid "Single quantity price"
 msgstr ""
 
-#: company/models.py:98
+#: company/models.py:99
 msgid "Company description"
 msgstr ""
 
-#: company/models.py:98
+#: company/models.py:99
 msgid "Description of the company"
 msgstr ""
 
-#: company/models.py:100 company/templates/company/company_base.html:70
+#: company/models.py:101 company/templates/company/company_base.html:70
 #: company/templates/company/detail.html:31 templates/js/company.js:60
 msgid "Website"
 msgstr ""
 
-#: company/models.py:100
+#: company/models.py:101
 msgid "Company website URL"
 msgstr ""
 
-#: company/models.py:103 company/templates/company/company_base.html:77
+#: company/models.py:104 company/templates/company/company_base.html:77
 msgid "Address"
 msgstr ""
 
-#: company/models.py:104
+#: company/models.py:105
 msgid "Company address"
 msgstr ""
 
-#: company/models.py:107
+#: company/models.py:108
 msgid "Phone number"
 msgstr ""
 
-#: company/models.py:108
+#: company/models.py:109
 msgid "Contact phone number"
 msgstr ""
 
-#: company/models.py:111 company/templates/company/company_base.html:91
+#: company/models.py:112 company/templates/company/company_base.html:91
 msgid "Email"
 msgstr ""
 
-#: company/models.py:111
+#: company/models.py:112
 msgid "Contact email address"
 msgstr ""
 
-#: company/models.py:114 company/templates/company/company_base.html:98
+#: company/models.py:115 company/templates/company/company_base.html:98
 msgid "Contact"
 msgstr ""
 
-#: company/models.py:115
+#: company/models.py:116
 msgid "Point of contact"
 msgstr ""
 
-#: company/models.py:117
+#: company/models.py:118 company/models.py:355 order/models.py:103
+#: part/models.py:743
+#: report/templates/report/inventree_build_order_base.html:165
+#: stock/models.py:1557 templates/js/company.js:208 templates/js/part.js:430
+msgid "Link"
+msgstr ""
+
+#: company/models.py:118
 msgid "Link to external company information"
 msgstr ""
 
-#: company/models.py:129
+#: company/models.py:126 part/models.py:753
+msgid "Image"
+msgstr ""
+
+#: company/models.py:131
 msgid "is customer"
 msgstr ""
 
-#: company/models.py:129
+#: company/models.py:131
 msgid "Do you sell items to this company?"
 msgstr ""
 
-#: company/models.py:131
+#: company/models.py:133
 msgid "is supplier"
 msgstr ""
 
-#: company/models.py:131
+#: company/models.py:133
 msgid "Do you purchase items from this company?"
 msgstr ""
 
-#: company/models.py:133
+#: company/models.py:135
 msgid "is manufacturer"
 msgstr ""
 
-#: company/models.py:133
+#: company/models.py:135
 msgid "Does this company manufacture parts?"
 msgstr ""
 
-#: company/models.py:313 stock/models.py:370
+#: company/models.py:315 stock/models.py:371
 #: stock/templates/stock/item_base.html:220
 msgid "Base Part"
 msgstr ""
 
-#: company/models.py:317 order/views.py:1372
+#: company/models.py:319 order/views.py:1372
 msgid "Select part"
 msgstr ""
 
-#: company/models.py:323 company/templates/company/detail.html:60
+#: company/models.py:325 company/templates/company/detail.html:60
 #: company/templates/company/supplier_part_base.html:83
-#: company/templates/company/supplier_part_detail.html:25
+#: company/templates/company/supplier_part_detail.html:25 order/models.py:190
 #: order/templates/order/order_base.html:92
 #: order/templates/order/order_wizard/select_pos.html:30 part/bom.py:170
 #: stock/templates/stock/item_base.html:337 templates/js/company.js:48
@@ -1706,81 +1784,83 @@ msgstr ""
 msgid "Supplier"
 msgstr ""
 
-#: company/models.py:324
+#: company/models.py:326
 msgid "Select supplier"
 msgstr ""
 
-#: company/models.py:329 company/templates/company/supplier_part_base.html:87
+#: company/models.py:331 company/templates/company/supplier_part_base.html:87
 #: company/templates/company/supplier_part_detail.html:26
 #: order/templates/order/purchase_order_detail.html:174 part/bom.py:171
 msgid "SKU"
 msgstr ""
 
-#: company/models.py:330
+#: company/models.py:332
 msgid "Supplier stock keeping unit"
 msgstr ""
 
-#: company/models.py:340 company/templates/company/detail.html:55
+#: company/models.py:342 company/templates/company/detail.html:55
 #: company/templates/company/supplier_part_base.html:93
 #: company/templates/company/supplier_part_detail.html:34 part/bom.py:172
 #: templates/js/company.js:44 templates/js/company.js:188
 msgid "Manufacturer"
 msgstr ""
 
-#: company/models.py:341
+#: company/models.py:343
 msgid "Select manufacturer"
 msgstr ""
 
-#: company/models.py:347 company/templates/company/supplier_part_base.html:99
+#: company/models.py:349 company/templates/company/supplier_part_base.html:99
 #: company/templates/company/supplier_part_detail.html:35
 #: order/templates/order/purchase_order_detail.html:183 part/bom.py:173
 #: templates/js/company.js:204
 msgid "MPN"
 msgstr ""
 
-#: company/models.py:348
+#: company/models.py:350
 msgid "Manufacturer part number"
 msgstr ""
 
-#: company/models.py:353 part/models.py:743
-#: report/templates/report/inventree_build_order_base.html:165
-#: stock/models.py:1555 templates/js/company.js:208 templates/js/part.js:430
-msgid "Link"
-msgstr ""
-
-#: company/models.py:354
+#: company/models.py:356
 msgid "URL for external supplier part link"
 msgstr ""
 
-#: company/models.py:360
+#: company/models.py:362
 msgid "Supplier part description"
 msgstr ""
 
-#: company/models.py:365 company/templates/company/supplier_part_base.html:113
-#: company/templates/company/supplier_part_detail.html:38
+#: company/models.py:367 company/templates/company/supplier_part_base.html:113
+#: company/templates/company/supplier_part_detail.html:38 part/models.py:2170
 #: report/templates/report/inventree_po_report.html:93
 #: report/templates/report/inventree_so_report.html:93
 msgid "Note"
 msgstr ""
 
-#: company/models.py:369
+#: company/models.py:371
+msgid "base cost"
+msgstr ""
+
+#: company/models.py:371
 msgid "Minimum charge (e.g. stocking fee)"
 msgstr ""
 
-#: company/models.py:371 company/templates/company/supplier_part_base.html:106
-#: stock/models.py:394 stock/templates/stock/item_base.html:295
+#: company/models.py:373 company/templates/company/supplier_part_base.html:106
+#: stock/models.py:395 stock/templates/stock/item_base.html:295
 #: templates/js/stock.js:663
 msgid "Packaging"
 msgstr ""
 
-#: company/models.py:371
+#: company/models.py:373
 msgid "Part packaging"
 msgstr ""
 
-#: company/models.py:373
+#: company/models.py:375
 msgid "multiple"
 msgstr ""
 
+#: company/models.py:375
+msgid "Order multiple"
+msgstr ""
+
 #: company/templates/company/assigned_stock.html:10
 #: company/templates/company/navbar.html:51
 #: company/templates/company/navbar.html:54 templates/js/build.js:411
@@ -1825,6 +1905,19 @@ msgstr ""
 msgid "Phone"
 msgstr ""
 
+#: company/templates/company/delete.html:7
+#, python-format
+msgid "Are you sure you want to delete company '%(name)s'?"
+msgstr ""
+
+#: company/templates/company/delete.html:12
+#, python-format
+msgid ""
+"There are %(count)s parts sourced from this company.<br>\n"
+"If this supplier is deleted, these supplier part entries will also be "
+"deleted."
+msgstr ""
+
 #: company/templates/company/detail.html:21
 msgid "Company Name"
 msgstr ""
@@ -1837,9 +1930,9 @@ msgstr ""
 msgid "Uses default currency"
 msgstr ""
 
-#: company/templates/company/detail.html:65
-#: order/templates/order/sales_order_base.html:92 stock/models.py:412
-#: stock/models.py:413 stock/templates/stock/item_base.html:247
+#: company/templates/company/detail.html:65 order/models.py:440
+#: order/templates/order/sales_order_base.html:92 stock/models.py:413
+#: stock/models.py:414 stock/templates/stock/item_base.html:247
 #: templates/js/company.js:40 templates/js/order.js:267
 msgid "Customer"
 msgstr ""
@@ -1850,6 +1943,7 @@ msgid "Supplier Parts"
 msgstr ""
 
 #: company/templates/company/detail_part.html:20
+#: order/templates/order/order_wizard/select_parts.html:42
 #: order/templates/order/purchase_order_detail.html:75
 msgid "Create new supplier part"
 msgstr ""
@@ -1889,13 +1983,13 @@ msgid "Create new Part"
 msgstr ""
 
 #: company/templates/company/detail_part.html:72 company/views.py:62
-#: order/templates/order/purchase_orders.html:182
+#: order/templates/order/purchase_orders.html:183
 #: part/templates/part/supplier.html:50
 msgid "New Supplier"
 msgstr ""
 
 #: company/templates/company/detail_part.html:73 company/views.py:279
-#: order/templates/order/purchase_orders.html:183
+#: order/templates/order/purchase_orders.html:184
 msgid "Create new Supplier"
 msgstr ""
 
@@ -2035,7 +2129,7 @@ msgid "New Sales Order"
 msgstr ""
 
 #: company/templates/company/supplier_part_base.html:6
-#: company/templates/company/supplier_part_base.html:19 stock/models.py:379
+#: company/templates/company/supplier_part_base.html:19 stock/models.py:380
 #: stock/templates/stock/item_base.html:342 templates/js/company.js:180
 msgid "Supplier Part"
 msgstr ""
@@ -2109,7 +2203,7 @@ msgstr ""
 msgid "Customers"
 msgstr ""
 
-#: company/views.py:76 order/templates/order/sales_orders.html:184
+#: company/views.py:76 order/templates/order/sales_orders.html:185
 msgid "New Customer"
 msgstr ""
 
@@ -2149,7 +2243,7 @@ msgstr ""
 msgid "Edited company information"
 msgstr ""
 
-#: company/views.py:285 order/templates/order/sales_orders.html:185
+#: company/views.py:285 order/templates/order/sales_orders.html:186
 msgid "Create new Customer"
 msgstr ""
 
@@ -2201,7 +2295,7 @@ msgstr ""
 msgid "Label description"
 msgstr ""
 
-#: label/models.py:116 stock/forms.py:201
+#: label/models.py:116 stock/forms.py:202
 msgid "Label"
 msgstr ""
 
@@ -2217,6 +2311,10 @@ msgstr ""
 msgid "Label template is enabled"
 msgstr ""
 
+#: label/models.py:129
+msgid "Width [mm]"
+msgstr ""
+
 #: label/models.py:130
 msgid "Label width, specified in mm"
 msgstr ""
@@ -2263,24 +2361,24 @@ msgstr ""
 msgid "Purchase Order reference"
 msgstr ""
 
-#: order/forms.py:109
+#: order/forms.py:110
 msgid "Target date for order delivery. Order will be overdue after this date."
 msgstr ""
 
-#: order/forms.py:137
+#: order/forms.py:138
 msgid "Enter sales order number"
 msgstr ""
 
-#: order/forms.py:143 order/models.py:448
+#: order/forms.py:145 order/models.py:452
 msgid ""
 "Target date for order completion. Order will be overdue after this date."
 msgstr ""
 
-#: order/forms.py:233
+#: order/forms.py:235
 msgid "Enter stock item serial numbers"
 msgstr ""
 
-#: order/forms.py:239
+#: order/forms.py:241
 msgid "Enter quantity of stock items"
 msgstr ""
 
@@ -2296,137 +2394,183 @@ msgstr ""
 msgid "Link to external page"
 msgstr ""
 
-#: order/models.py:117
+#: order/models.py:111 part/templates/part/detail.html:132
+msgid "Created By"
+msgstr ""
+
+#: order/models.py:118
 msgid "User or group responsible for this order"
 msgstr ""
 
-#: order/models.py:122
+#: order/models.py:123
 msgid "Order notes"
 msgstr ""
 
-#: order/models.py:181 order/models.py:441
+#: order/models.py:182 order/models.py:445
 msgid "Purchase order status"
 msgstr ""
 
-#: order/models.py:189
+#: order/models.py:191
 msgid "Company from which the items are being ordered"
 msgstr ""
 
-#: order/models.py:192
+#: order/models.py:194 order/templates/order/order_base.html:98
+#: templates/js/order.js:179
+msgid "Supplier Reference"
+msgstr ""
+
+#: order/models.py:194
 msgid "Supplier order reference code"
 msgstr ""
 
-#: order/models.py:203
+#: order/models.py:201
+msgid "received by"
+msgstr ""
+
+#: order/models.py:206
 msgid "Issue Date"
 msgstr ""
 
-#: order/models.py:204
+#: order/models.py:207
 msgid "Date order was issued"
 msgstr ""
 
-#: order/models.py:209
+#: order/models.py:212
 msgid "Target Delivery Date"
 msgstr ""
 
-#: order/models.py:210
+#: order/models.py:213
 msgid ""
 "Expected date for order delivery. Order will be overdue after this date."
 msgstr ""
 
-#: order/models.py:216
+#: order/models.py:219
 msgid "Date order was completed"
 msgstr ""
 
-#: order/models.py:240 order/models.py:339 part/views.py:1586
-#: stock/models.py:269 stock/models.py:948
+#: order/models.py:243 order/models.py:342 part/views.py:1586
+#: stock/models.py:270 stock/models.py:950
 msgid "Quantity must be greater than zero"
 msgstr ""
 
-#: order/models.py:245
+#: order/models.py:248
 msgid "Part supplier must match PO supplier"
 msgstr ""
 
-#: order/models.py:334
+#: order/models.py:337
 msgid "Lines can only be received against an order marked as 'Placed'"
 msgstr ""
 
-#: order/models.py:356
+#: order/models.py:359
 msgid "Received items"
 msgstr ""
 
-#: order/models.py:437
+#: order/models.py:441
 msgid "Company to which the items are being sold"
 msgstr ""
 
-#: order/models.py:443
+#: order/models.py:447
+msgid "Customer Reference "
+msgstr ""
+
+#: order/models.py:447
 msgid "Customer order reference code"
 msgstr ""
 
-#: order/models.py:501
+#: order/models.py:455 templates/js/order.js:303
+msgid "Shipment Date"
+msgstr ""
+
+#: order/models.py:462
+msgid "shipped by"
+msgstr ""
+
+#: order/models.py:506
 msgid "SalesOrder cannot be shipped as it is not currently pending"
 msgstr ""
 
-#: order/models.py:588
+#: order/models.py:593
 msgid "Item quantity"
 msgstr ""
 
-#: order/models.py:590
+#: order/models.py:595
 msgid "Line item reference"
 msgstr ""
 
-#: order/models.py:592
+#: order/models.py:597
 msgid "Line item notes"
 msgstr ""
 
-#: order/models.py:618 order/templates/order/order_base.html:9
+#: order/models.py:623 order/models.py:667
+#: part/templates/part/allocation.html:17
+#: part/templates/part/allocation.html:45
+msgid "Order"
+msgstr ""
+
+#: order/models.py:624 order/templates/order/order_base.html:9
 #: order/templates/order/order_base.html:24
 #: report/templates/report/inventree_po_report.html:77
 #: stock/templates/stock/item_base.html:309 templates/js/order.js:148
 msgid "Purchase Order"
 msgstr ""
 
-#: order/models.py:631
+#: order/models.py:638
 msgid "Supplier part"
 msgstr ""
 
-#: order/models.py:634
+#: order/models.py:641 order/templates/order/order_base.html:131
+#: order/templates/order/purchase_order_detail.html:207
+#: order/templates/order/receive_parts.html:22
+#: order/templates/order/sales_order_base.html:131
+msgid "Received"
+msgstr ""
+
+#: order/models.py:641
 msgid "Number of items received"
 msgstr ""
 
-#: order/models.py:641 stock/models.py:505
+#: order/models.py:648 stock/models.py:506
 #: stock/templates/stock/item_base.html:316
 msgid "Purchase Price"
 msgstr ""
 
-#: order/models.py:642
+#: order/models.py:649
 msgid "Unit purchase price"
 msgstr ""
 
-#: order/models.py:736 order/models.py:738
+#: order/models.py:743 order/models.py:745
 msgid "Stock item has not been assigned"
 msgstr ""
 
-#: order/models.py:742
+#: order/models.py:749
 msgid "Cannot allocate stock item to a line with a different part"
 msgstr ""
 
-#: order/models.py:744
+#: order/models.py:751
 msgid "Cannot allocate stock to a line without a part"
 msgstr ""
 
-#: order/models.py:747
+#: order/models.py:754
 msgid "Allocation quantity cannot exceed stock quantity"
 msgstr ""
 
-#: order/models.py:757
+#: order/models.py:764
 msgid "Quantity must be 1 for serialized stock item"
 msgstr ""
 
-#: order/models.py:773
+#: order/models.py:769
+msgid "Line"
+msgstr ""
+
+#: order/models.py:780
+msgid "Item"
+msgstr ""
+
+#: order/models.py:781
 msgid "Select stock item to allocate"
 msgstr ""
 
-#: order/models.py:776
+#: order/models.py:784
 msgid "Enter stock allocation quantity"
 msgstr ""
 
@@ -2469,27 +2613,25 @@ msgstr ""
 msgid "Order Status"
 msgstr ""
 
-#: order/templates/order/order_base.html:98 templates/js/order.js:179
-msgid "Supplier Reference"
-msgstr ""
-
 #: order/templates/order/order_base.html:117
 #: report/templates/report/inventree_build_order_base.html:122
 msgid "Issued"
 msgstr ""
 
-#: order/templates/order/order_base.html:131
-#: order/templates/order/purchase_order_detail.html:207
-#: order/templates/order/receive_parts.html:22
-#: order/templates/order/sales_order_base.html:131
-msgid "Received"
-msgstr ""
-
 #: order/templates/order/order_cancel.html:7
 #: order/templates/order/sales_order_cancel.html:9
 msgid "Cancelling this order means that the order will no longer be editable."
 msgstr ""
 
+#: order/templates/order/order_complete.html:7
+msgid "Mark this order as complete?"
+msgstr ""
+
+#: order/templates/order/order_issue.html:7
+msgid ""
+"After placing this purchase order, line items will no longer be editable."
+msgstr ""
+
 #: order/templates/order/order_notes.html:13
 msgid "Order Notes"
 msgstr ""
@@ -2668,11 +2810,16 @@ msgstr ""
 #: order/templates/order/sales_order_detail.html:75
 #: order/templates/order/sales_order_detail.html:157
 #: report/templates/report/inventree_test_report_base.html:75
-#: stock/models.py:417 stock/templates/stock/item_base.html:234
+#: stock/models.py:418 stock/templates/stock/item_base.html:234
 #: templates/js/build.js:418
 msgid "Serial Number"
 msgstr ""
 
+#: order/templates/order/sales_order_detail.html:92 templates/js/bom.js:338
+#: templates/js/build.js:571 templates/js/build.js:984
+msgid "Actions"
+msgstr ""
+
 #: order/templates/order/sales_order_detail.html:99 templates/js/build.js:459
 #: templates/js/build.js:789
 msgid "Edit stock allocation"
@@ -2683,8 +2830,16 @@ msgstr ""
 msgid "Delete stock allocation"
 msgstr ""
 
-#: order/templates/order/sales_order_detail.html:229 order/views.py:1351
-#: templates/js/build.js:523 templates/js/build.js:785
+#: order/templates/order/sales_order_detail.html:170
+msgid "No matching line items"
+msgstr ""
+
+#: order/templates/order/sales_order_detail.html:199
+msgid "ID"
+msgstr ""
+
+#: order/templates/order/sales_order_detail.html:229 templates/js/build.js:523
+#: templates/js/build.js:785
 msgid "Allocated"
 msgstr ""
 
@@ -2852,6 +3007,11 @@ msgstr ""
 msgid "No lines specified"
 msgstr ""
 
+#: order/views.py:1060
+#, python-brace-format
+msgid "Ordered {n} parts"
+msgstr ""
+
 #: order/views.py:1117
 msgid "Supplier part must be specified"
 msgstr ""
@@ -2877,7 +3037,8 @@ msgid "Allocate Serial Numbers"
 msgstr ""
 
 #: order/views.py:1351
-msgid "items"
+#, python-brace-format
+msgid "Allocated {n} items"
 msgstr ""
 
 #: order/views.py:1367
@@ -2908,7 +3069,7 @@ msgstr ""
 msgid "Remove allocation"
 msgstr ""
 
-#: part/bom.py:138 part/models.py:72 part/models.py:761
+#: part/bom.py:138 part/models.py:72 part/models.py:762
 #: part/templates/part/category.html:62 part/templates/part/detail.html:90
 msgid "Default Location"
 msgstr ""
@@ -2930,11 +3091,11 @@ msgstr ""
 msgid "Error reading BOM file (incorrect row size)"
 msgstr ""
 
-#: part/forms.py:89 stock/forms.py:264
+#: part/forms.py:89 stock/forms.py:265
 msgid "File Format"
 msgstr ""
 
-#: part/forms.py:89 stock/forms.py:264
+#: part/forms.py:89 stock/forms.py:265
 msgid "Select output file format"
 msgstr ""
 
@@ -2978,7 +3139,7 @@ msgstr ""
 msgid "Include part supplier data in exported BOM"
 msgstr ""
 
-#: part/forms.py:120 part/models.py:2054
+#: part/forms.py:120 part/models.py:2057
 msgid "Parent Part"
 msgstr ""
 
@@ -2990,63 +3151,75 @@ msgstr ""
 msgid "Clear existing BOM items"
 msgstr ""
 
-#: part/forms.py:132
+#: part/forms.py:133
 msgid "Confirm BOM duplication"
 msgstr ""
 
-#: part/forms.py:150
+#: part/forms.py:151
+msgid "validate"
+msgstr ""
+
+#: part/forms.py:151
 msgid "Confirm that the BOM is correct"
 msgstr ""
 
-#: part/forms.py:162
+#: part/forms.py:163
+msgid "BOM file"
+msgstr ""
+
+#: part/forms.py:163
 msgid "Select BOM file to upload"
 msgstr ""
 
-#: part/forms.py:181
+#: part/forms.py:182
 msgid "Related Part"
 msgstr ""
 
-#: part/forms.py:200
+#: part/forms.py:201
 msgid "Select part category"
 msgstr ""
 
-#: part/forms.py:217
+#: part/forms.py:218
 msgid "Duplicate all BOM data for this part"
 msgstr ""
 
-#: part/forms.py:218
+#: part/forms.py:219
 msgid "Copy BOM"
 msgstr ""
 
-#: part/forms.py:223
+#: part/forms.py:224
 msgid "Duplicate all parameter data for this part"
 msgstr ""
 
-#: part/forms.py:224
+#: part/forms.py:225
 msgid "Copy Parameters"
 msgstr ""
 
-#: part/forms.py:229
+#: part/forms.py:230
 msgid "Confirm part creation"
 msgstr ""
 
-#: part/forms.py:234
+#: part/forms.py:235
 msgid "Include category parameter templates"
 msgstr ""
 
-#: part/forms.py:239
+#: part/forms.py:240
 msgid "Include parent categories parameter templates"
 msgstr ""
 
-#: part/forms.py:319
+#: part/forms.py:320
 msgid "Add parameter template to same level categories"
 msgstr ""
 
-#: part/forms.py:323
+#: part/forms.py:324
 msgid "Add parameter template to all categories"
 msgstr ""
 
-#: part/forms.py:368
+#: part/forms.py:342 part/models.py:2151
+msgid "Sub part"
+msgstr ""
+
+#: part/forms.py:370
 msgid "Input quantity for price calculation"
 msgstr ""
 
@@ -3062,7 +3235,7 @@ msgstr ""
 msgid "Default keywords for parts in this category"
 msgstr ""
 
-#: part/models.py:82 part/models.py:2099
+#: part/models.py:82 part/models.py:2103
 #: part/templates/part/part_app_base.html:9
 msgid "Part Category"
 msgstr ""
@@ -3132,7 +3305,7 @@ msgstr ""
 msgid "Part keywords to improve visibility in search results"
 msgstr ""
 
-#: part/models.py:724 part/templates/part/detail.html:73
+#: part/models.py:724 part/models.py:2102 part/templates/part/detail.html:73
 #: part/templates/part/set_category.html:15 templates/js/part.js:384
 msgid "Category"
 msgstr ""
@@ -3159,243 +3332,262 @@ msgstr ""
 msgid "Revision"
 msgstr ""
 
-#: part/models.py:759
+#: part/models.py:760
 msgid "Where is this item normally stored?"
 msgstr ""
 
-#: part/models.py:806 part/templates/part/detail.html:97
+#: part/models.py:807 part/templates/part/detail.html:97
 msgid "Default Supplier"
 msgstr ""
 
-#: part/models.py:807
+#: part/models.py:808
 msgid "Default supplier part"
 msgstr ""
 
-#: part/models.py:814
+#: part/models.py:815
 msgid "Default Expiry"
 msgstr ""
 
-#: part/models.py:815
+#: part/models.py:816
 msgid "Expiry time (in days) for stock items of this part"
 msgstr ""
 
-#: part/models.py:820 part/templates/part/detail.html:113
+#: part/models.py:821 part/templates/part/detail.html:113
 msgid "Minimum Stock"
 msgstr ""
 
-#: part/models.py:821
+#: part/models.py:822
 msgid "Minimum allowed stock level"
 msgstr ""
 
-#: part/models.py:827 part/templates/part/detail.html:106
+#: part/models.py:828 part/models.py:2031 part/templates/part/detail.html:106
 #: part/templates/part/params.html:29
 msgid "Units"
 msgstr ""
 
-#: part/models.py:828
+#: part/models.py:829
 msgid "Stock keeping units for this part"
 msgstr ""
 
-#: part/models.py:834
+#: part/models.py:835
 msgid "Can this part be built from other parts?"
 msgstr ""
 
-#: part/models.py:840
+#: part/models.py:841
 msgid "Can this part be used to build other parts?"
 msgstr ""
 
-#: part/models.py:846
+#: part/models.py:847
 msgid "Does this part have tracking for unique items?"
 msgstr ""
 
-#: part/models.py:851
+#: part/models.py:852
 msgid "Can this part be purchased from external suppliers?"
 msgstr ""
 
-#: part/models.py:856
+#: part/models.py:857
 msgid "Can this part be sold to customers?"
 msgstr ""
 
-#: part/models.py:860 part/templates/part/detail.html:227
+#: part/models.py:861 part/templates/part/detail.html:227
 #: templates/js/table_filters.js:20 templates/js/table_filters.js:60
 #: templates/js/table_filters.js:214 templates/js/table_filters.js:283
 msgid "Active"
 msgstr ""
 
-#: part/models.py:861
+#: part/models.py:862
 msgid "Is this part active?"
 msgstr ""
 
-#: part/models.py:866
+#: part/models.py:867
 msgid "Is this a virtual part, such as a software product or license?"
 msgstr ""
 
-#: part/models.py:871
+#: part/models.py:872
 msgid "Part notes - supports Markdown formatting"
 msgstr ""
 
-#: part/models.py:874
+#: part/models.py:875
 msgid "BOM checksum"
 msgstr ""
 
-#: part/models.py:874
+#: part/models.py:875
 msgid "Stored BOM checksum"
 msgstr ""
 
-#: part/models.py:877
+#: part/models.py:878
 msgid "BOM checked by"
 msgstr ""
 
-#: part/models.py:879
+#: part/models.py:880
 msgid "BOM checked date"
 msgstr ""
 
-#: part/models.py:881 part/templates/part/detail.html:126
-#: templates/js/order.js:293
-msgid "Creation Date"
-msgstr ""
-
-#: part/models.py:883
+#: part/models.py:884
 msgid "Creation User"
 msgstr ""
 
-#: part/models.py:1927
+#: part/models.py:1929
 msgid "Test templates can only be created for trackable parts"
 msgstr ""
 
-#: part/models.py:1944
+#: part/models.py:1946
 msgid "Test with this name already exists for this part"
 msgstr ""
 
-#: part/models.py:1963 templates/js/part.js:561 templates/js/stock.js:104
+#: part/models.py:1966 templates/js/part.js:561 templates/js/stock.js:104
 msgid "Test Name"
 msgstr ""
 
-#: part/models.py:1964
+#: part/models.py:1967
 msgid "Enter a name for the test"
 msgstr ""
 
-#: part/models.py:1969
+#: part/models.py:1972
 msgid "Test Description"
 msgstr ""
 
-#: part/models.py:1970
+#: part/models.py:1973
 msgid "Enter description for this test"
 msgstr ""
 
-#: part/models.py:1975 templates/js/part.js:570
+#: part/models.py:1978 templates/js/part.js:570
 #: templates/js/table_filters.js:200
 msgid "Required"
 msgstr ""
 
-#: part/models.py:1976
+#: part/models.py:1979
 msgid "Is this test required to pass?"
 msgstr ""
 
-#: part/models.py:1981 templates/js/part.js:578
+#: part/models.py:1984 templates/js/part.js:578
 msgid "Requires Value"
 msgstr ""
 
-#: part/models.py:1982
+#: part/models.py:1985
 msgid "Does this test require a value when adding a test result?"
 msgstr ""
 
-#: part/models.py:1987 templates/js/part.js:585
+#: part/models.py:1990 templates/js/part.js:585
 msgid "Requires Attachment"
 msgstr ""
 
-#: part/models.py:1988
+#: part/models.py:1991
 msgid "Does this test require a file attachment when adding a test result?"
 msgstr ""
 
-#: part/models.py:2021
+#: part/models.py:2024
 msgid "Parameter template name must be unique"
 msgstr ""
 
-#: part/models.py:2026
+#: part/models.py:2029
 msgid "Parameter Name"
 msgstr ""
 
-#: part/models.py:2028
+#: part/models.py:2031
 msgid "Parameter Units"
 msgstr ""
 
-#: part/models.py:2056 part/models.py:2104
+#: part/models.py:2059 part/models.py:2108 part/models.py:2109
 #: templates/InvenTree/settings/category.html:62
 msgid "Parameter Template"
 msgstr ""
 
-#: part/models.py:2058
+#: part/models.py:2061
 msgid "Data"
 msgstr ""
 
-#: part/models.py:2058
+#: part/models.py:2061
 msgid "Parameter Value"
 msgstr ""
 
-#: part/models.py:2108
+#: part/models.py:2113 templates/InvenTree/settings/category.html:67
+msgid "Default Value"
+msgstr ""
+
+#: part/models.py:2114
 msgid "Default Parameter Value"
 msgstr ""
 
-#: part/models.py:2136
+#: part/models.py:2143
 msgid "Select parent part"
 msgstr ""
 
-#: part/models.py:2144
+#: part/models.py:2152
 msgid "Select part to be used in BOM"
 msgstr ""
 
-#: part/models.py:2150
+#: part/models.py:2158
 msgid "BOM quantity for this BOM item"
 msgstr ""
 
-#: part/models.py:2152
+#: part/models.py:2160 templates/js/bom.js:216 templates/js/bom.js:269
+msgid "Optional"
+msgstr ""
+
+#: part/models.py:2160
 msgid "This BOM item is optional"
 msgstr ""
 
-#: part/models.py:2155
+#: part/models.py:2163
+msgid "Overage"
+msgstr ""
+
+#: part/models.py:2164
 msgid "Estimated build wastage quantity (absolute or percentage)"
 msgstr ""
 
-#: part/models.py:2158
+#: part/models.py:2167
 msgid "BOM item reference"
 msgstr ""
 
-#: part/models.py:2161
+#: part/models.py:2170
 msgid "BOM item notes"
 msgstr ""
 
-#: part/models.py:2163
+#: part/models.py:2172
+msgid "Checksum"
+msgstr ""
+
+#: part/models.py:2172
 msgid "BOM line checksum"
 msgstr ""
 
-#: part/models.py:2167 templates/js/bom.js:275 templates/js/bom.js:282
+#: part/models.py:2176 templates/js/bom.js:275 templates/js/bom.js:282
 #: templates/js/table_filters.js:50
 msgid "Inherited"
 msgstr ""
 
-#: part/models.py:2168
+#: part/models.py:2177
 msgid "This BOM item is inherited by BOMs for variant parts"
 msgstr ""
 
-#: part/models.py:2244 part/views.py:1592 part/views.py:1644
-#: stock/models.py:259
+#: part/models.py:2253 part/views.py:1592 part/views.py:1644
+#: stock/models.py:260
 msgid "Quantity must be integer value for trackable parts"
 msgstr ""
 
-#: part/models.py:2253 part/models.py:2255
+#: part/models.py:2262 part/models.py:2264
 msgid "Sub part must be specified"
 msgstr ""
 
-#: part/models.py:2258
+#: part/models.py:2267
 msgid "BOM Item"
 msgstr ""
 
-#: part/models.py:2379
+#: part/models.py:2384
+msgid "Part 1"
+msgstr ""
+
+#: part/models.py:2388
+msgid "Part 2"
+msgstr ""
+
+#: part/models.py:2388
 msgid "Select Related Part"
 msgstr ""
 
-#: part/models.py:2411
+#: part/models.py:2420
 msgid ""
 "Error creating relationship: check that the part is not related to itself "
 "and that the relationship is unique"
@@ -3405,23 +3597,6 @@ msgstr ""
 msgid "Part Stock Allocations"
 msgstr ""
 
-#: part/templates/part/allocation.html:17
-#: part/templates/part/allocation.html:45
-msgid "Order"
-msgstr ""
-
-#: part/templates/part/allocation.html:18
-#: part/templates/part/allocation.html:24
-#: part/templates/part/allocation.html:31
-#: part/templates/part/allocation.html:49
-#: stock/templates/stock/item_base.html:8
-#: stock/templates/stock/item_base.html:89
-#: stock/templates/stock/item_base.html:324
-#: stock/templates/stock/stock_adjust.html:16 templates/js/build.js:771
-#: templates/js/stock.js:923 templates/js/stock.js:1181
-msgid "Stock Item"
-msgstr ""
-
 #: part/templates/part/attachments.html:10
 msgid "Part Attachments"
 msgstr ""
@@ -3439,6 +3614,22 @@ msgstr ""
 msgid "Bill of Materials"
 msgstr ""
 
+#: part/templates/part/bom.html:19
+#, python-format
+msgid "The BOM for <i>%(part)s</i> has changed, and must be validated.<br>"
+msgstr ""
+
+#: part/templates/part/bom.html:21
+#, python-format
+msgid ""
+"The BOM for <i>%(part)s</i> was last checked by %(checker)s on %(check_date)s"
+msgstr ""
+
+#: part/templates/part/bom.html:25
+#, python-format
+msgid "The BOM for <i>%(part)s</i> has not been validated."
+msgstr ""
+
 #: part/templates/part/bom.html:32
 msgid "Remove selected BOM items"
 msgstr ""
@@ -3578,6 +3769,20 @@ msgstr ""
 msgid "Each part must already exist in the database"
 msgstr ""
 
+#: part/templates/part/bom_upload/upload_file.html:27
+msgid "Upload File"
+msgstr ""
+
+#: part/templates/part/bom_validate.html:6
+#, python-format
+msgid ""
+"Confirm that the Bill of Materials (BOM) is valid for:<br><i>%(part)s</i>"
+msgstr ""
+
+#: part/templates/part/bom_validate.html:9
+msgid "This will validate each line in the BOM."
+msgstr ""
+
 #: part/templates/part/build.html:10
 msgid "Part Builds"
 msgstr ""
@@ -3655,7 +3860,7 @@ msgstr ""
 msgid "Create new Part Category"
 msgstr ""
 
-#: part/templates/part/category.html:240 stock/views.py:1358
+#: part/templates/part/category.html:240 stock/views.py:1359
 msgid "Create new Stock Location"
 msgstr ""
 
@@ -3749,10 +3954,6 @@ msgstr ""
 msgid "Stock Expiry Time"
 msgstr ""
 
-#: part/templates/part/detail.html:132
-msgid "Created By"
-msgstr ""
-
 #: part/templates/part/detail.html:139
 msgid "Responsible User"
 msgstr ""
@@ -3874,7 +4075,7 @@ msgstr ""
 
 #: part/templates/part/params.html:28
 #: report/templates/report/inventree_test_report_base.html:90
-#: stock/models.py:1650 templates/InvenTree/settings/header.html:8
+#: stock/models.py:1652 templates/InvenTree/settings/header.html:8
 #: templates/js/stock.js:124
 msgid "Value"
 msgstr ""
@@ -3884,7 +4085,7 @@ msgid "Edit"
 msgstr ""
 
 #: part/templates/part/params.html:44 part/templates/part/related.html:44
-#: part/templates/part/supplier.html:22 users/models.py:175
+#: part/templates/part/supplier.html:22 stock/views.py:1002 users/models.py:175
 msgid "Delete"
 msgstr ""
 
@@ -4376,18 +4577,26 @@ msgid "Sales order query filters"
 msgstr ""
 
 #: report/models.py:500
+msgid "Snippet"
+msgstr ""
+
+#: report/models.py:501
 msgid "Report snippet file"
 msgstr ""
 
-#: report/models.py:504
+#: report/models.py:505
 msgid "Snippet file description"
 msgstr ""
 
-#: report/models.py:539
+#: report/models.py:540
+msgid "Asset"
+msgstr ""
+
+#: report/models.py:541
 msgid "Report asset file"
 msgstr ""
 
-#: report/models.py:542
+#: report/models.py:544
 msgid "Asset file description"
 msgstr ""
 
@@ -4409,12 +4618,12 @@ msgid "Test Results"
 msgstr ""
 
 #: report/templates/report/inventree_test_report_base.html:88
-#: stock/models.py:1638
+#: stock/models.py:1640
 msgid "Test"
 msgstr ""
 
 #: report/templates/report/inventree_test_report_base.html:89
-#: stock/models.py:1644
+#: stock/models.py:1646
 msgid "Result"
 msgstr ""
 
@@ -4431,301 +4640,345 @@ msgstr ""
 msgid "Fail"
 msgstr ""
 
-#: stock/forms.py:117
+#: stock/api.py:199
+#, python-brace-format
+msgid "Updated stock for {n} items"
+msgstr ""
+
+#: stock/api.py:268
+#, python-brace-format
+msgid "Moved {n} parts to {loc}"
+msgstr ""
+
+#: stock/forms.py:114 stock/forms.py:406 stock/models.py:473
+#: stock/templates/stock/item_base.html:349 templates/js/stock.js:652
+msgid "Expiry Date"
+msgstr ""
+
+#: stock/forms.py:115 stock/forms.py:407
+msgid "Expiration date for this stock item"
+msgstr ""
+
+#: stock/forms.py:118
 msgid "Enter unique serial numbers (or leave blank)"
 msgstr ""
 
-#: stock/forms.py:202 stock/forms.py:258
-msgid "Select test report template"
+#: stock/forms.py:169
+msgid ""
+"Destination for serialized stock (by default, will remain in current "
+"location)"
 msgstr ""
 
-#: stock/forms.py:266
-msgid "Include stock items in sub locations"
+#: stock/forms.py:171
+msgid "Serial numbers"
 msgstr ""
 
-#: stock/forms.py:301
-msgid "Stock item to install"
+#: stock/forms.py:171
+msgid "Unique serial numbers (must match quantity)"
 msgstr ""
 
-#: stock/forms.py:308
-msgid "Stock quantity to assign"
-msgstr ""
-
-#: stock/forms.py:336
-msgid "Must not exceed available quantity"
-msgstr ""
-
-#: stock/forms.py:346
-msgid "Destination location for uninstalled items"
-msgstr ""
-
-#: stock/forms.py:348
+#: stock/forms.py:173 stock/forms.py:349
 msgid "Add transaction note (optional)"
 msgstr ""
 
-#: stock/forms.py:350
+#: stock/forms.py:203 stock/forms.py:259
+msgid "Select test report template"
+msgstr ""
+
+#: stock/forms.py:267 templates/js/table_filters.js:111
+msgid "Include sublocations"
+msgstr ""
+
+#: stock/forms.py:267
+msgid "Include stock items in sub locations"
+msgstr ""
+
+#: stock/forms.py:302
+msgid "Stock item to install"
+msgstr ""
+
+#: stock/forms.py:309
+msgid "Stock quantity to assign"
+msgstr ""
+
+#: stock/forms.py:337
+msgid "Must not exceed available quantity"
+msgstr ""
+
+#: stock/forms.py:347
+msgid "Destination location for uninstalled items"
+msgstr ""
+
+#: stock/forms.py:351
 msgid "Confirm uninstall"
 msgstr ""
 
-#: stock/forms.py:350
+#: stock/forms.py:351
 msgid "Confirm removal of installed stock items"
 msgstr ""
 
-#: stock/forms.py:374
+#: stock/forms.py:375
 msgid "Destination stock location"
 msgstr ""
 
-#: stock/forms.py:376
+#: stock/forms.py:377
 msgid "Add note (required)"
 msgstr ""
 
-#: stock/forms.py:380 stock/views.py:852 stock/views.py:1050
+#: stock/forms.py:381 stock/views.py:852 stock/views.py:1051
 msgid "Confirm stock adjustment"
 msgstr ""
 
-#: stock/forms.py:380
+#: stock/forms.py:381
 msgid "Confirm movement of stock items"
 msgstr ""
 
-#: stock/forms.py:382
+#: stock/forms.py:383
 msgid "Set Default Location"
 msgstr ""
 
-#: stock/forms.py:382
+#: stock/forms.py:383
 msgid "Set the destination as the default location for selected parts"
 msgstr ""
 
-#: stock/models.py:204
+#: stock/models.py:54 stock/models.py:511
+msgid "Owner"
+msgstr ""
+
+#: stock/models.py:55 stock/models.py:512
+msgid "Select Owner"
+msgstr ""
+
+#: stock/models.py:205
 msgid "Created stock item"
 msgstr ""
 
-#: stock/models.py:240
+#: stock/models.py:241
 msgid "StockItem with this serial number already exists"
 msgstr ""
 
-#: stock/models.py:276
+#: stock/models.py:277
 #, python-brace-format
 msgid "Part type ('{pf}') must be {pe}"
 msgstr ""
 
-#: stock/models.py:286 stock/models.py:295
+#: stock/models.py:287 stock/models.py:296
 msgid "Quantity must be 1 for item with a serial number"
 msgstr ""
 
-#: stock/models.py:287
+#: stock/models.py:288
 msgid "Serial number cannot be set if quantity greater than 1"
 msgstr ""
 
-#: stock/models.py:309
+#: stock/models.py:310
 msgid "Item cannot belong to itself"
 msgstr ""
 
-#: stock/models.py:315
+#: stock/models.py:316
 msgid "Item must have a build reference if is_building=True"
 msgstr ""
 
-#: stock/models.py:322
+#: stock/models.py:323
 msgid "Build reference does not point to the same part object"
 msgstr ""
 
-#: stock/models.py:362
+#: stock/models.py:363
 msgid "Parent Stock Item"
 msgstr ""
 
-#: stock/models.py:371
+#: stock/models.py:372
 msgid "Base part"
 msgstr ""
 
-#: stock/models.py:380
+#: stock/models.py:381
 msgid "Select a matching supplier part for this stock item"
 msgstr ""
 
-#: stock/models.py:385 stock/templates/stock/stock_app_base.html:7
+#: stock/models.py:386 stock/templates/stock/stock_app_base.html:7
 msgid "Stock Location"
 msgstr ""
 
-#: stock/models.py:388
+#: stock/models.py:389
 msgid "Where is this stock item located?"
 msgstr ""
 
-#: stock/models.py:395
+#: stock/models.py:396
 msgid "Packaging this stock item is stored in"
 msgstr ""
 
-#: stock/models.py:400 stock/templates/stock/item_base.html:255
+#: stock/models.py:401 stock/templates/stock/item_base.html:255
 msgid "Installed In"
 msgstr ""
 
-#: stock/models.py:403
+#: stock/models.py:404
 msgid "Is this item installed in another item?"
 msgstr ""
 
-#: stock/models.py:419
+#: stock/models.py:420
 msgid "Serial number for this item"
 msgstr ""
 
-#: stock/models.py:431
+#: stock/models.py:432
 msgid "Batch code for this stock item"
 msgstr ""
 
-#: stock/models.py:435
+#: stock/models.py:436
 msgid "Stock Quantity"
 msgstr ""
 
-#: stock/models.py:444
+#: stock/models.py:445
 msgid "Source Build"
 msgstr ""
 
-#: stock/models.py:446
+#: stock/models.py:447
 msgid "Build for this stock item"
 msgstr ""
 
-#: stock/models.py:457
+#: stock/models.py:458
 msgid "Source Purchase Order"
 msgstr ""
 
-#: stock/models.py:460
+#: stock/models.py:461
 msgid "Purchase order for this stock item"
 msgstr ""
 
-#: stock/models.py:466
+#: stock/models.py:467
 msgid "Destination Sales Order"
 msgstr ""
 
-#: stock/models.py:472 stock/templates/stock/item_base.html:349
-#: templates/js/stock.js:652
-msgid "Expiry Date"
-msgstr ""
-
-#: stock/models.py:473
+#: stock/models.py:474
 msgid ""
 "Expiry date for stock item. Stock will be considered expired after this date"
 msgstr ""
 
-#: stock/models.py:486
+#: stock/models.py:487
+msgid "Delete on deplete"
+msgstr ""
+
+#: stock/models.py:487
 msgid "Delete this Stock Item when stock is depleted"
 msgstr ""
 
-#: stock/models.py:496 stock/templates/stock/item_notes.html:13
+#: stock/models.py:497 stock/templates/stock/item_notes.html:13
 #: stock/templates/stock/navbar.html:54
 msgid "Stock Item Notes"
 msgstr ""
 
-#: stock/models.py:506
+#: stock/models.py:507
 msgid "Single unit purchase price at time of purchase"
 msgstr ""
 
-#: stock/models.py:610
+#: stock/models.py:612
 msgid "Assigned to Customer"
 msgstr ""
 
-#: stock/models.py:612
+#: stock/models.py:614
 msgid "Manually assigned to customer"
 msgstr ""
 
-#: stock/models.py:625
+#: stock/models.py:627
 msgid "Returned from customer"
 msgstr ""
 
-#: stock/models.py:627
+#: stock/models.py:629
 msgid "Returned to location"
 msgstr ""
 
-#: stock/models.py:787
+#: stock/models.py:789
 msgid "Installed into stock item"
 msgstr ""
 
-#: stock/models.py:795
+#: stock/models.py:797
 msgid "Installed stock item"
 msgstr ""
 
-#: stock/models.py:819
+#: stock/models.py:821
 msgid "Uninstalled stock item"
 msgstr ""
 
-#: stock/models.py:838
+#: stock/models.py:840
 msgid "Uninstalled into location"
 msgstr ""
 
-#: stock/models.py:939
+#: stock/models.py:941
 msgid "Part is not set as trackable"
 msgstr ""
 
-#: stock/models.py:945
+#: stock/models.py:947
 msgid "Quantity must be integer"
 msgstr ""
 
-#: stock/models.py:951
+#: stock/models.py:953
 #, python-brace-format
 msgid "Quantity must not exceed available stock quantity ({n})"
 msgstr ""
 
-#: stock/models.py:954
+#: stock/models.py:956
 msgid "Serial numbers must be a list of integers"
 msgstr ""
 
-#: stock/models.py:957
+#: stock/models.py:959
 msgid "Quantity does not match serial numbers"
 msgstr ""
 
-#: stock/models.py:989
+#: stock/models.py:991
 msgid "Add serial number"
 msgstr ""
 
-#: stock/models.py:992
+#: stock/models.py:994
 #, python-brace-format
 msgid "Serialized {n} items"
 msgstr ""
 
-#: stock/models.py:1070
+#: stock/models.py:1072
 msgid "Split from existing stock"
 msgstr ""
 
-#: stock/models.py:1108
+#: stock/models.py:1110
 msgid "StockItem cannot be moved as it is not in stock"
 msgstr ""
 
-#: stock/models.py:1551
+#: stock/models.py:1553
 msgid "Title"
 msgstr ""
 
-#: stock/models.py:1551
+#: stock/models.py:1553
 msgid "Tracking entry title"
 msgstr ""
 
-#: stock/models.py:1553
+#: stock/models.py:1555
 msgid "Entry notes"
 msgstr ""
 
-#: stock/models.py:1555
+#: stock/models.py:1557
 msgid "Link to external page for further information"
 msgstr ""
 
-#: stock/models.py:1615
+#: stock/models.py:1617
 msgid "Value must be provided for this test"
 msgstr ""
 
-#: stock/models.py:1621
+#: stock/models.py:1623
 msgid "Attachment must be uploaded for this test"
 msgstr ""
 
-#: stock/models.py:1639
+#: stock/models.py:1641
 msgid "Test name"
 msgstr ""
 
-#: stock/models.py:1645 templates/js/table_filters.js:190
+#: stock/models.py:1647 templates/js/table_filters.js:190
 msgid "Test result"
 msgstr ""
 
-#: stock/models.py:1651
+#: stock/models.py:1653
 msgid "Test output value"
 msgstr ""
 
-#: stock/models.py:1658
+#: stock/models.py:1660
 msgid "Test result attachment"
 msgstr ""
 
-#: stock/models.py:1664
+#: stock/models.py:1666
 msgid "Test notes"
 msgstr ""
 
@@ -4888,11 +5141,6 @@ msgstr ""
 msgid "Barcode Identifier"
 msgstr ""
 
-#: stock/templates/stock/item_base.html:302 templates/InvenTree/search.html:167
-#: templates/js/build.js:655 templates/navbar.html:29
-msgid "Build"
-msgstr ""
-
 #: stock/templates/stock/item_base.html:323
 msgid "Parent Item"
 msgstr ""
@@ -5070,7 +5318,7 @@ msgstr ""
 msgid "The following stock items will be uninstalled"
 msgstr ""
 
-#: stock/templates/stock/stockitem_convert.html:7 stock/views.py:1331
+#: stock/templates/stock/stockitem_convert.html:7 stock/views.py:1332
 msgid "Convert Stock Item"
 msgstr ""
 
@@ -5090,8 +5338,8 @@ msgstr ""
 msgid "Edit Stock Location"
 msgstr ""
 
-#: stock/views.py:230 stock/views.py:1321 stock/views.py:1432
-#: stock/views.py:1797
+#: stock/views.py:230 stock/views.py:1322 stock/views.py:1433
+#: stock/views.py:1798
 msgid "Owner is required (ownership control is enabled)"
 msgstr ""
 
@@ -5179,95 +5427,121 @@ msgstr ""
 msgid "Move Stock Items"
 msgstr ""
 
+#: stock/views.py:998
+msgid "Move"
+msgstr ""
+
 #: stock/views.py:999
 msgid "Count Stock Items"
 msgstr ""
 
+#: stock/views.py:999
+msgid "Count"
+msgstr ""
+
 #: stock/views.py:1000
 msgid "Remove From Stock"
 msgstr ""
 
+#: stock/views.py:1000
+msgid "Take"
+msgstr ""
+
 #: stock/views.py:1001
 msgid "Add Stock Items"
 msgstr ""
 
+#: stock/views.py:1001 users/models.py:171
+msgid "Add"
+msgstr ""
+
 #: stock/views.py:1002
 msgid "Delete Stock Items"
 msgstr ""
 
-#: stock/views.py:1030
+#: stock/views.py:1031
 msgid "Must enter integer value"
 msgstr ""
 
-#: stock/views.py:1035
+#: stock/views.py:1036
 msgid "Quantity must be positive"
 msgstr ""
 
-#: stock/views.py:1042
+#: stock/views.py:1043
 #, python-brace-format
 msgid "Quantity must not exceed {x}"
 msgstr ""
 
-#: stock/views.py:1106
+#: stock/views.py:1107
 msgid "No action performed"
 msgstr ""
 
-#: stock/views.py:1149
+#: stock/views.py:1122
+#, python-brace-format
+msgid "Added stock to {n} items"
+msgstr ""
+
+#: stock/views.py:1137
+#, python-brace-format
+msgid "Removed stock from {n} items"
+msgstr ""
+
+#: stock/views.py:1150
 #, python-brace-format
 msgid "Counted stock for {n} items"
 msgstr ""
 
-#: stock/views.py:1189
+#: stock/views.py:1190
 msgid "No items were moved"
 msgstr ""
 
-#: stock/views.py:1192
+#: stock/views.py:1193
 #, python-brace-format
 msgid "Moved {n} items to {dest}"
 msgstr ""
 
-#: stock/views.py:1211
+#: stock/views.py:1212
 #, python-brace-format
 msgid "Deleted {n} stock items"
 msgstr ""
 
-#: stock/views.py:1223
+#: stock/views.py:1224
 msgid "Edit Stock Item"
 msgstr ""
 
-#: stock/views.py:1449
+#: stock/views.py:1450
 msgid "Serialize Stock"
 msgstr ""
 
-#: stock/views.py:1542 templates/js/build.js:210
+#: stock/views.py:1543 templates/js/build.js:210
 msgid "Create new Stock Item"
 msgstr ""
 
-#: stock/views.py:1684
+#: stock/views.py:1685
 msgid "Duplicate Stock Item"
 msgstr ""
 
-#: stock/views.py:1766
+#: stock/views.py:1767
 msgid "Quantity cannot be negative"
 msgstr ""
 
-#: stock/views.py:1866
+#: stock/views.py:1867
 msgid "Delete Stock Location"
 msgstr ""
 
-#: stock/views.py:1879
+#: stock/views.py:1880
 msgid "Delete Stock Item"
 msgstr ""
 
-#: stock/views.py:1890
+#: stock/views.py:1891
 msgid "Delete Stock Tracking Entry"
 msgstr ""
 
-#: stock/views.py:1897
+#: stock/views.py:1898
 msgid "Edit Stock Tracking Entry"
 msgstr ""
 
-#: stock/views.py:1906
+#: stock/views.py:1907
 msgid "Add Stock Tracking Entry"
 msgstr ""
 
@@ -5371,10 +5645,6 @@ msgstr ""
 msgid "No category parameter templates found"
 msgstr ""
 
-#: templates/InvenTree/settings/category.html:67
-msgid "Default Value"
-msgstr ""
-
 #: templates/InvenTree/settings/category.html:70
 #: templates/InvenTree/settings/part.html:81
 msgid "Edit Template"
@@ -5683,10 +5953,6 @@ msgstr ""
 msgid "Open subassembly"
 msgstr ""
 
-#: templates/js/bom.js:216 templates/js/bom.js:269
-msgid "Optional"
-msgstr ""
-
 #: templates/js/bom.js:261
 msgid "No pricing available"
 msgstr ""
@@ -5695,10 +5961,6 @@ msgstr ""
 msgid "View BOM"
 msgstr ""
 
-#: templates/js/bom.js:338 templates/js/build.js:571 templates/js/build.js:984
-msgid "Actions"
-msgstr ""
-
 #: templates/js/bom.js:346
 msgid "Validate BOM Item"
 msgstr ""
@@ -5959,10 +6221,6 @@ msgstr ""
 msgid "No sales orders found"
 msgstr ""
 
-#: templates/js/order.js:303
-msgid "Shipment Date"
-msgstr ""
-
 #: templates/js/part.js:51 templates/js/part.js:136
 msgid "Trackable part"
 msgstr ""
@@ -6282,10 +6540,6 @@ msgstr ""
 msgid "Item has been allocated"
 msgstr ""
 
-#: templates/js/table_filters.js:111
-msgid "Include sublocations"
-msgstr ""
-
 #: templates/js/table_filters.js:112
 msgid "Include stock in sublocations"
 msgstr ""
@@ -6483,10 +6737,6 @@ msgstr ""
 msgid "Password"
 msgstr ""
 
-#: templates/registration/login.html:76
-msgid "Enter password"
-msgstr ""
-
 #: templates/registration/login.html:83
 msgid "Username / password combination is incorrect"
 msgstr ""
@@ -6623,10 +6873,6 @@ msgstr ""
 msgid "Permission to view items"
 msgstr ""
 
-#: users/models.py:171
-msgid "Add"
-msgstr ""
-
 #: users/models.py:171
 msgid "Permission to add items"
 msgstr ""
diff --git a/InvenTree/locale/es/LC_MESSAGES/django.po b/InvenTree/locale/es/LC_MESSAGES/django.po
index 7fe67bf929..bb954c049d 100644
--- a/InvenTree/locale/es/LC_MESSAGES/django.po
+++ b/InvenTree/locale/es/LC_MESSAGES/django.po
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-04-03 02:10+0000\n"
+"POT-Creation-Date: 2021-04-04 20:22+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"
@@ -34,32 +34,47 @@ msgstr ""
 msgid "Enter date"
 msgstr ""
 
-#: InvenTree/forms.py:110 build/forms.py:99 build/forms.py:187
+#: InvenTree/forms.py:110 build/forms.py:99 build/forms.py:120
+#: build/forms.py:142 build/forms.py:166 build/forms.py:188 build/forms.py:223
+#: order/forms.py:27 order/forms.py:38 order/forms.py:49 order/forms.py:60
+#: order/forms.py:71 part/forms.py:132
 msgid "Confirm"
 msgstr ""
 
 #: InvenTree/forms.py:126
+msgid "Confirm delete"
+msgstr ""
+
+#: InvenTree/forms.py:127
 msgid "Confirm item deletion"
 msgstr ""
 
-#: InvenTree/forms.py:158
+#: InvenTree/forms.py:159 templates/registration/login.html:76
+msgid "Enter password"
+msgstr ""
+
+#: InvenTree/forms.py:160
 msgid "Enter new password"
 msgstr ""
 
-#: InvenTree/forms.py:165
+#: InvenTree/forms.py:167
+msgid "Confirm password"
+msgstr ""
+
+#: InvenTree/forms.py:168
 msgid "Confirm new password"
 msgstr ""
 
-#: InvenTree/forms.py:200
+#: InvenTree/forms.py:203
 msgid "Apply Theme"
 msgstr ""
 
-#: InvenTree/forms.py:230
+#: InvenTree/forms.py:233
 msgid "Select Category"
 msgstr ""
 
-#: InvenTree/helpers.py:361 order/models.py:242 order/models.py:341
-#: stock/views.py:1762
+#: InvenTree/helpers.py:361 order/models.py:245 order/models.py:344
+#: stock/views.py:1763
 msgid "Invalid quantity provided"
 msgstr ""
 
@@ -91,7 +106,7 @@ msgstr ""
 msgid "Number of unique serial number ({s}) must match quantity ({q})"
 msgstr ""
 
-#: InvenTree/models.py:59 stock/models.py:1657
+#: InvenTree/models.py:59 stock/models.py:1659
 msgid "Attachment"
 msgstr ""
 
@@ -107,7 +122,7 @@ msgstr ""
 msgid "File comment"
 msgstr ""
 
-#: InvenTree/models.py:68 InvenTree/models.py:69
+#: InvenTree/models.py:68 InvenTree/models.py:69 part/models.py:1888
 #: report/templates/report/inventree_test_report_base.html:91
 #: templates/js/stock.js:960
 msgid "User"
@@ -118,20 +133,21 @@ msgid "upload date"
 msgstr ""
 
 #: InvenTree/models.py:107 InvenTree/models.py:108 label/models.py:101
-#: part/models.py:686 part/templates/part/params.html:27 report/models.py:179
-#: templates/InvenTree/search.html:136 templates/InvenTree/search.html:273
-#: templates/js/part.js:109
+#: part/models.py:686 part/models.py:2029 part/templates/part/params.html:27
+#: report/models.py:179 templates/InvenTree/search.html:136
+#: templates/InvenTree/search.html:273 templates/js/part.js:109
 msgid "Name"
 msgstr ""
 
 #: InvenTree/models.py:114 build/models.py:134
-#: build/templates/build/detail.html:21 company/models.py:359
+#: build/templates/build/detail.html:21 company/models.py:361
 #: company/templates/company/detail.html:26
 #: company/templates/company/supplier_part_base.html:70
 #: company/templates/company/supplier_part_detail.html:31 label/models.py:108
-#: order/templates/order/purchase_order_detail.html:168 part/models.py:710
-#: part/templates/part/detail.html:54 part/templates/part/set_category.html:14
-#: report/models.py:192
+#: order/models.py:101 order/templates/order/purchase_order_detail.html:168
+#: part/models.py:710 part/templates/part/detail.html:54
+#: part/templates/part/set_category.html:14 report/models.py:192
+#: report/models.py:505 report/models.py:544
 #: report/templates/report/inventree_build_order_base.html:118
 #: templates/InvenTree/search.html:143 templates/InvenTree/search.html:208
 #: templates/InvenTree/search.html:280
@@ -246,7 +262,8 @@ msgid "Invalid character in part name"
 msgstr ""
 
 #: InvenTree/validators.py:63
-msgid "IPN must match regex pattern"
+#, python-brace-format
+msgid "IPN must match regex pattern {pat}"
 msgstr ""
 
 #: InvenTree/validators.py:77 InvenTree/validators.py:91
@@ -344,7 +361,7 @@ msgid "Order target date"
 msgstr ""
 
 #: build/forms.py:39 build/templates/build/build_base.html:104
-#: build/templates/build/detail.html:121
+#: build/templates/build/detail.html:121 order/forms.py:109 order/forms.py:144
 #: order/templates/order/order_base.html:124
 #: order/templates/order/sales_order_base.html:117
 #: report/templates/report/inventree_build_order_base.html:126
@@ -358,15 +375,20 @@ msgid ""
 "Target date for build completion. Build will be overdue after this date."
 msgstr ""
 
-#: build/forms.py:45 build/forms.py:87
+#: build/forms.py:45 build/forms.py:87 build/forms.py:257 build/models.py:1103
 #: build/templates/build/auto_allocate.html:17
 #: build/templates/build/build_base.html:91
 #: build/templates/build/detail.html:31 common/models.py:696
 #: company/forms.py:131 company/templates/company/supplier_part_pricing.html:77
-#: order/forms.py:237 order/templates/order/order_wizard/select_parts.html:32
+#: order/forms.py:188 order/forms.py:205 order/forms.py:239 order/forms.py:261
+#: order/forms.py:278 order/models.py:593 order/models.py:784
+#: order/templates/order/order_wizard/select_parts.html:32
 #: order/templates/order/purchase_order_detail.html:193
+#: order/templates/order/sales_order_detail.html:70
 #: order/templates/order/sales_order_detail.html:77
 #: order/templates/order/sales_order_detail.html:159
+#: order/templates/order/sales_order_detail.html:224 part/forms.py:340
+#: part/forms.py:369 part/forms.py:385 part/models.py:2158
 #: part/templates/part/allocation.html:19
 #: part/templates/part/allocation.html:53
 #: part/templates/part/part_pricing.html:12
@@ -376,7 +398,8 @@ msgstr ""
 #: report/templates/report/inventree_po_report.html:91
 #: report/templates/report/inventree_so_report.html:91
 #: report/templates/report/inventree_test_report_base.html:77
-#: stock/forms.py:307 stock/templates/stock/item_base.html:51
+#: stock/forms.py:175 stock/forms.py:308 stock/models.py:1563
+#: stock/templates/stock/item_base.html:51
 #: stock/templates/stock/item_base.html:57
 #: stock/templates/stock/item_base.html:240
 #: stock/templates/stock/stock_adjust.html:18 templates/js/barcode.js:364
@@ -393,7 +416,7 @@ msgstr ""
 msgid "Enter quantity for build output"
 msgstr ""
 
-#: build/forms.py:92 order/forms.py:231 stock/forms.py:117
+#: build/forms.py:92 order/forms.py:233 stock/forms.py:118
 msgid "Serial Numbers"
 msgstr ""
 
@@ -405,39 +428,57 @@ msgstr ""
 msgid "Confirm creation of build output"
 msgstr ""
 
-#: build/forms.py:120
+#: build/forms.py:121
 msgid "Confirm deletion of build output"
 msgstr ""
 
-#: build/forms.py:141
+#: build/forms.py:142
 msgid "Confirm unallocation of stock"
 msgstr ""
 
-#: build/forms.py:165
+#: build/forms.py:166
 msgid "Confirm stock allocation"
 msgstr ""
 
-#: build/forms.py:188
+#: build/forms.py:189
 msgid "Mark build as complete"
 msgstr ""
 
-#: build/forms.py:212
+#: build/forms.py:213 build/templates/build/auto_allocate.html:18
+#: order/forms.py:82 stock/forms.py:347
+#: stock/templates/stock/item_base.html:270
+#: stock/templates/stock/stock_adjust.html:17
+#: templates/InvenTree/search.html:244 templates/js/barcode.js:363
+#: templates/js/barcode.js:531 templates/js/build.js:434
+#: templates/js/stock.js:637
+msgid "Location"
+msgstr ""
+
+#: build/forms.py:214
 msgid "Location of completed parts"
 msgstr ""
 
-#: build/forms.py:217
-msgid "Confirm completion with incomplete stock allocation"
+#: build/forms.py:219
+msgid "Confirm incomplete"
 msgstr ""
 
 #: build/forms.py:220
+msgid "Confirm completion with incomplete stock allocation"
+msgstr ""
+
+#: build/forms.py:223
 msgid "Confirm build completion"
 msgstr ""
 
-#: build/forms.py:240 build/views.py:66
+#: build/forms.py:243
+msgid "Confirm cancel"
+msgstr ""
+
+#: build/forms.py:243 build/views.py:66
 msgid "Confirm build cancellation"
 msgstr ""
 
-#: build/forms.py:254
+#: build/forms.py:257
 msgid "Select quantity of stock to allocate"
 msgstr ""
 
@@ -462,7 +503,9 @@ msgstr ""
 msgid "Build Order Reference"
 msgstr ""
 
-#: build/models.py:127 order/templates/order/purchase_order_detail.html:188
+#: build/models.py:127 order/models.py:99 order/models.py:595
+#: order/templates/order/purchase_order_detail.html:188
+#: order/templates/order/sales_order_detail.html:219 part/models.py:2167
 #: report/templates/report/inventree_po_report.html:92
 #: report/templates/report/inventree_so_report.html:92 templates/js/bom.js:197
 #: templates/js/build.js:509 templates/js/build.js:948
@@ -484,11 +527,15 @@ msgstr ""
 
 #: build/models.py:152 build/templates/build/auto_allocate.html:16
 #: build/templates/build/build_base.html:86
-#: build/templates/build/detail.html:26 order/models.py:662
+#: build/templates/build/detail.html:26 company/models.py:535
+#: order/models.py:637 order/models.py:669
 #: order/templates/order/order_wizard/select_parts.html:30
 #: order/templates/order/purchase_order_detail.html:156
-#: order/templates/order/receive_parts.html:19 part/models.py:321
-#: part/models.py:2054 part/templates/part/part_app_base.html:7
+#: order/templates/order/receive_parts.html:19
+#: order/templates/order/sales_order_detail.html:207 part/models.py:321
+#: part/models.py:1856 part/models.py:1868 part/models.py:1886
+#: part/models.py:1961 part/models.py:2057 part/models.py:2142
+#: part/templates/part/part_app_base.html:7
 #: part/templates/part/part_pricing.html:15 part/templates/part/related.html:29
 #: part/templates/part/set_category.html:13
 #: part/templates/part/subcategories.html:17
@@ -558,7 +605,7 @@ msgstr ""
 msgid "Build status code"
 msgstr ""
 
-#: build/models.py:212 stock/models.py:429
+#: build/models.py:212 stock/models.py:430
 msgid "Batch Code"
 msgstr ""
 
@@ -566,11 +613,16 @@ msgstr ""
 msgid "Batch code for this build output"
 msgstr ""
 
-#: build/models.py:223 order/models.py:447
+#: build/models.py:219 order/models.py:105 part/models.py:882
+#: part/templates/part/detail.html:126 templates/js/order.js:293
+msgid "Creation Date"
+msgstr ""
+
+#: build/models.py:223 order/models.py:451
 msgid "Target completion date"
 msgstr ""
 
-#: build/models.py:227 order/models.py:215
+#: build/models.py:227 order/models.py:218
 msgid "Completion Date"
 msgstr ""
 
@@ -587,9 +639,9 @@ msgid "User who issued this build order"
 msgstr ""
 
 #: build/models.py:250 build/templates/build/build_base.html:142
-#: build/templates/build/detail.html:105 order/models.py:118
+#: build/templates/build/detail.html:105 order/models.py:119
 #: order/templates/order/order_base.html:138
-#: order/templates/order/sales_order_base.html:138 part/models.py:885
+#: order/templates/order/sales_order_base.html:138 part/models.py:886
 #: report/templates/report/inventree_build_order_base.html:159
 msgid "Responsible"
 msgstr ""
@@ -602,26 +654,28 @@ msgstr ""
 #: company/templates/company/supplier_part_base.html:77
 #: company/templates/company/supplier_part_detail.html:28
 #: part/templates/part/detail.html:83 part/templates/part/part_base.html:100
-#: stock/models.py:423 stock/templates/stock/item_base.html:330
+#: stock/models.py:424 stock/templates/stock/item_base.html:330
 msgid "External Link"
 msgstr ""
 
-#: build/models.py:257 part/models.py:744 stock/models.py:425
+#: build/models.py:257 part/models.py:744 stock/models.py:426
 msgid "Link to external URL"
 msgstr ""
 
 #: build/models.py:261 build/templates/build/navbar.html:59
-#: company/models.py:366 company/templates/company/navbar.html:59
-#: company/templates/company/navbar.html:62
-#: order/templates/order/po_navbar.html:29
+#: company/models.py:129 company/models.py:368
+#: company/templates/company/navbar.html:59
+#: company/templates/company/navbar.html:62 order/models.py:123
+#: order/models.py:597 order/templates/order/po_navbar.html:29
 #: order/templates/order/po_navbar.html:32
 #: order/templates/order/purchase_order_detail.html:227
+#: order/templates/order/sales_order_detail.html:264
 #: order/templates/order/so_navbar.html:33
-#: order/templates/order/so_navbar.html:36 part/models.py:870
+#: order/templates/order/so_navbar.html:36 part/models.py:871
 #: part/templates/part/navbar.html:122
 #: report/templates/report/inventree_build_order_base.html:173
-#: stock/forms.py:316 stock/forms.py:348 stock/forms.py:376 stock/models.py:495
-#: stock/models.py:1553 stock/models.py:1663
+#: stock/forms.py:173 stock/forms.py:317 stock/forms.py:349 stock/forms.py:377
+#: stock/models.py:496 stock/models.py:1555 stock/models.py:1665
 #: stock/templates/stock/navbar.html:57 templates/js/barcode.js:37
 #: templates/js/bom.js:329 templates/js/stock.js:128 templates/js/stock.js:667
 msgid "Notes"
@@ -665,11 +719,11 @@ msgstr ""
 msgid "Allocated quantity ({n}) must not exceed available quantity ({q})"
 msgstr ""
 
-#: build/models.py:1034 order/models.py:751
+#: build/models.py:1034 order/models.py:758
 msgid "StockItem is over-allocated"
 msgstr ""
 
-#: build/models.py:1038 order/models.py:754
+#: build/models.py:1038 order/models.py:761
 msgid "Allocation quantity must be greater than zero"
 msgstr ""
 
@@ -677,19 +731,41 @@ msgstr ""
 msgid "Quantity must be 1 for serialized stock"
 msgstr ""
 
-#: build/models.py:1082
+#: build/models.py:1082 stock/templates/stock/item_base.html:302
+#: templates/InvenTree/search.html:167 templates/js/build.js:655
+#: templates/navbar.html:29
+msgid "Build"
+msgstr ""
+
+#: build/models.py:1083
 msgid "Build to allocate parts"
 msgstr ""
 
-#: build/models.py:1089
+#: build/models.py:1090 part/templates/part/allocation.html:18
+#: part/templates/part/allocation.html:24
+#: part/templates/part/allocation.html:31
+#: part/templates/part/allocation.html:49
+#: stock/templates/stock/item_base.html:8
+#: stock/templates/stock/item_base.html:89
+#: stock/templates/stock/item_base.html:324
+#: stock/templates/stock/stock_adjust.html:16 templates/js/build.js:771
+#: templates/js/stock.js:923 templates/js/stock.js:1181
+msgid "Stock Item"
+msgstr ""
+
+#: build/models.py:1091
 msgid "Source stock item"
 msgstr ""
 
-#: build/models.py:1101
+#: build/models.py:1104
 msgid "Stock quantity to allocate to build"
 msgstr ""
 
-#: build/models.py:1109
+#: build/models.py:1112
+msgid "Install into"
+msgstr ""
+
+#: build/models.py:1113
 msgid "Destination stock item"
 msgstr ""
 
@@ -757,15 +833,6 @@ msgid ""
 "The following stock items will be allocated to the specified build output"
 msgstr ""
 
-#: build/templates/build/auto_allocate.html:18 stock/forms.py:346
-#: stock/templates/stock/item_base.html:270
-#: stock/templates/stock/stock_adjust.html:17
-#: templates/InvenTree/search.html:244 templates/js/barcode.js:363
-#: templates/js/barcode.js:531 templates/js/build.js:434
-#: templates/js/stock.js:637
-msgid "Location"
-msgstr ""
-
 #: build/templates/build/auto_allocate.html:37
 msgid "No stock items found that can be automatically allocated to this build"
 msgstr ""
@@ -836,7 +903,7 @@ msgid "Build Details"
 msgstr ""
 
 #: build/templates/build/build_base.html:96
-#: build/templates/build/detail.html:59
+#: build/templates/build/detail.html:59 order/models.py:445
 #: order/templates/order/receive_parts.html:24
 #: stock/templates/stock/item_base.html:376 templates/InvenTree/search.html:236
 #: templates/js/barcode.js:119 templates/js/build.js:710
@@ -855,7 +922,7 @@ msgid "Progress"
 msgstr ""
 
 #: build/templates/build/build_base.html:128
-#: build/templates/build/detail.html:84 order/models.py:660
+#: build/templates/build/detail.html:84 order/models.py:667
 #: order/templates/order/sales_order_base.html:9
 #: order/templates/order/sales_order_base.html:33
 #: order/templates/order/sales_order_ship.html:25
@@ -966,7 +1033,7 @@ msgstr ""
 msgid "Stock can be taken from any available location."
 msgstr ""
 
-#: build/templates/build/detail.html:46 stock/forms.py:374
+#: build/templates/build/detail.html:46 stock/forms.py:169 stock/forms.py:375
 msgid "Destination"
 msgstr ""
 
@@ -1099,7 +1166,7 @@ msgstr ""
 msgid "Create Build Output"
 msgstr ""
 
-#: build/views.py:203 stock/models.py:964 stock/views.py:1788
+#: build/views.py:203 stock/models.py:966 stock/views.py:1789
 msgid "Serial numbers already exist"
 msgstr ""
 
@@ -1237,7 +1304,7 @@ msgstr ""
 msgid "String descriptor for the server instance"
 msgstr ""
 
-#: common/models.py:62 company/models.py:95 company/models.py:96
+#: common/models.py:62 company/models.py:96 company/models.py:97
 msgid "Company name"
 msgstr ""
 
@@ -1341,8 +1408,8 @@ msgstr ""
 msgid "Number of recent parts to display on index page"
 msgstr ""
 
-#: common/models.py:150 part/models.py:2056 part/templates/part/detail.html:160
-#: report/models.py:185 stock/forms.py:258 templates/js/table_filters.js:24
+#: common/models.py:150 part/models.py:2059 part/templates/part/detail.html:160
+#: report/models.py:185 stock/forms.py:259 templates/js/table_filters.js:24
 #: templates/js/table_filters.js:288
 msgid "Template"
 msgstr ""
@@ -1351,7 +1418,7 @@ msgstr ""
 msgid "Parts are templates by default"
 msgstr ""
 
-#: common/models.py:157 part/models.py:833 part/templates/part/detail.html:170
+#: common/models.py:157 part/models.py:834 part/templates/part/detail.html:170
 #: templates/js/table_filters.js:101 templates/js/table_filters.js:300
 msgid "Assembly"
 msgstr ""
@@ -1360,7 +1427,7 @@ msgstr ""
 msgid "Parts can be assembled from other components by default"
 msgstr ""
 
-#: common/models.py:164 part/models.py:839 part/templates/part/detail.html:180
+#: common/models.py:164 part/models.py:840 part/templates/part/detail.html:180
 #: templates/js/table_filters.js:304
 msgid "Component"
 msgstr ""
@@ -1369,7 +1436,7 @@ msgstr ""
 msgid "Parts can be used as sub-components by default"
 msgstr ""
 
-#: common/models.py:171 part/models.py:850 part/templates/part/detail.html:200
+#: common/models.py:171 part/models.py:851 part/templates/part/detail.html:200
 msgid "Purchaseable"
 msgstr ""
 
@@ -1377,7 +1444,7 @@ msgstr ""
 msgid "Parts are purchaseable by default"
 msgstr ""
 
-#: common/models.py:178 part/models.py:855 part/templates/part/detail.html:210
+#: common/models.py:178 part/models.py:856 part/templates/part/detail.html:210
 #: templates/js/table_filters.js:312
 msgid "Salable"
 msgstr ""
@@ -1386,7 +1453,7 @@ msgstr ""
 msgid "Parts are salable by default"
 msgstr ""
 
-#: common/models.py:185 part/models.py:845 part/templates/part/detail.html:190
+#: common/models.py:185 part/models.py:846 part/templates/part/detail.html:190
 #: templates/js/table_filters.js:32 templates/js/table_filters.js:316
 msgid "Trackable"
 msgstr ""
@@ -1395,7 +1462,7 @@ msgstr ""
 msgid "Parts are trackable by default"
 msgstr ""
 
-#: common/models.py:192 part/models.py:865 part/templates/part/detail.html:150
+#: common/models.py:192 part/models.py:866 part/templates/part/detail.html:150
 #: templates/js/table_filters.js:28
 msgid "Virtual"
 msgstr ""
@@ -1585,12 +1652,12 @@ msgstr ""
 msgid "Supplied value must be a boolean"
 msgstr ""
 
-#: company/forms.py:37 company/models.py:137
+#: company/forms.py:37 company/models.py:139
 #: company/templates/company/detail.html:40
 msgid "Currency"
 msgstr ""
 
-#: company/forms.py:38 company/models.py:139
+#: company/forms.py:38 company/models.py:141
 msgid "Default currency used for this company"
 msgstr ""
 
@@ -1610,95 +1677,106 @@ msgstr ""
 msgid "Single quantity price"
 msgstr ""
 
-#: company/models.py:98
+#: company/models.py:99
 msgid "Company description"
 msgstr ""
 
-#: company/models.py:98
+#: company/models.py:99
 msgid "Description of the company"
 msgstr ""
 
-#: company/models.py:100 company/templates/company/company_base.html:70
+#: company/models.py:101 company/templates/company/company_base.html:70
 #: company/templates/company/detail.html:31 templates/js/company.js:60
 msgid "Website"
 msgstr ""
 
-#: company/models.py:100
+#: company/models.py:101
 msgid "Company website URL"
 msgstr ""
 
-#: company/models.py:103 company/templates/company/company_base.html:77
+#: company/models.py:104 company/templates/company/company_base.html:77
 msgid "Address"
 msgstr ""
 
-#: company/models.py:104
+#: company/models.py:105
 msgid "Company address"
 msgstr ""
 
-#: company/models.py:107
+#: company/models.py:108
 msgid "Phone number"
 msgstr ""
 
-#: company/models.py:108
+#: company/models.py:109
 msgid "Contact phone number"
 msgstr ""
 
-#: company/models.py:111 company/templates/company/company_base.html:91
+#: company/models.py:112 company/templates/company/company_base.html:91
 msgid "Email"
 msgstr ""
 
-#: company/models.py:111
+#: company/models.py:112
 msgid "Contact email address"
 msgstr ""
 
-#: company/models.py:114 company/templates/company/company_base.html:98
+#: company/models.py:115 company/templates/company/company_base.html:98
 msgid "Contact"
 msgstr ""
 
-#: company/models.py:115
+#: company/models.py:116
 msgid "Point of contact"
 msgstr ""
 
-#: company/models.py:117
+#: company/models.py:118 company/models.py:355 order/models.py:103
+#: part/models.py:743
+#: report/templates/report/inventree_build_order_base.html:165
+#: stock/models.py:1557 templates/js/company.js:208 templates/js/part.js:430
+msgid "Link"
+msgstr ""
+
+#: company/models.py:118
 msgid "Link to external company information"
 msgstr ""
 
-#: company/models.py:129
+#: company/models.py:126 part/models.py:753
+msgid "Image"
+msgstr ""
+
+#: company/models.py:131
 msgid "is customer"
 msgstr ""
 
-#: company/models.py:129
+#: company/models.py:131
 msgid "Do you sell items to this company?"
 msgstr ""
 
-#: company/models.py:131
+#: company/models.py:133
 msgid "is supplier"
 msgstr ""
 
-#: company/models.py:131
+#: company/models.py:133
 msgid "Do you purchase items from this company?"
 msgstr ""
 
-#: company/models.py:133
+#: company/models.py:135
 msgid "is manufacturer"
 msgstr ""
 
-#: company/models.py:133
+#: company/models.py:135
 msgid "Does this company manufacture parts?"
 msgstr ""
 
-#: company/models.py:313 stock/models.py:370
+#: company/models.py:315 stock/models.py:371
 #: stock/templates/stock/item_base.html:220
 msgid "Base Part"
 msgstr ""
 
-#: company/models.py:317 order/views.py:1372
+#: company/models.py:319 order/views.py:1372
 msgid "Select part"
 msgstr ""
 
-#: company/models.py:323 company/templates/company/detail.html:60
+#: company/models.py:325 company/templates/company/detail.html:60
 #: company/templates/company/supplier_part_base.html:83
-#: company/templates/company/supplier_part_detail.html:25
+#: company/templates/company/supplier_part_detail.html:25 order/models.py:190
 #: order/templates/order/order_base.html:92
 #: order/templates/order/order_wizard/select_pos.html:30 part/bom.py:170
 #: stock/templates/stock/item_base.html:337 templates/js/company.js:48
@@ -1706,81 +1784,83 @@ msgstr ""
 msgid "Supplier"
 msgstr ""
 
-#: company/models.py:324
+#: company/models.py:326
 msgid "Select supplier"
 msgstr ""
 
-#: company/models.py:329 company/templates/company/supplier_part_base.html:87
+#: company/models.py:331 company/templates/company/supplier_part_base.html:87
 #: company/templates/company/supplier_part_detail.html:26
 #: order/templates/order/purchase_order_detail.html:174 part/bom.py:171
 msgid "SKU"
 msgstr ""
 
-#: company/models.py:330
+#: company/models.py:332
 msgid "Supplier stock keeping unit"
 msgstr ""
 
-#: company/models.py:340 company/templates/company/detail.html:55
+#: company/models.py:342 company/templates/company/detail.html:55
 #: company/templates/company/supplier_part_base.html:93
 #: company/templates/company/supplier_part_detail.html:34 part/bom.py:172
 #: templates/js/company.js:44 templates/js/company.js:188
 msgid "Manufacturer"
 msgstr ""
 
-#: company/models.py:341
+#: company/models.py:343
 msgid "Select manufacturer"
 msgstr ""
 
-#: company/models.py:347 company/templates/company/supplier_part_base.html:99
+#: company/models.py:349 company/templates/company/supplier_part_base.html:99
 #: company/templates/company/supplier_part_detail.html:35
 #: order/templates/order/purchase_order_detail.html:183 part/bom.py:173
 #: templates/js/company.js:204
 msgid "MPN"
 msgstr ""
 
-#: company/models.py:348
+#: company/models.py:350
 msgid "Manufacturer part number"
 msgstr ""
 
-#: company/models.py:353 part/models.py:743
-#: report/templates/report/inventree_build_order_base.html:165
-#: stock/models.py:1555 templates/js/company.js:208 templates/js/part.js:430
-msgid "Link"
-msgstr ""
-
-#: company/models.py:354
+#: company/models.py:356
 msgid "URL for external supplier part link"
 msgstr ""
 
-#: company/models.py:360
+#: company/models.py:362
 msgid "Supplier part description"
 msgstr ""
 
-#: company/models.py:365 company/templates/company/supplier_part_base.html:113
-#: company/templates/company/supplier_part_detail.html:38
+#: company/models.py:367 company/templates/company/supplier_part_base.html:113
+#: company/templates/company/supplier_part_detail.html:38 part/models.py:2170
 #: report/templates/report/inventree_po_report.html:93
 #: report/templates/report/inventree_so_report.html:93
 msgid "Note"
 msgstr ""
 
-#: company/models.py:369
+#: company/models.py:371
+msgid "base cost"
+msgstr ""
+
+#: company/models.py:371
 msgid "Minimum charge (e.g. stocking fee)"
 msgstr ""
 
-#: company/models.py:371 company/templates/company/supplier_part_base.html:106
-#: stock/models.py:394 stock/templates/stock/item_base.html:295
+#: company/models.py:373 company/templates/company/supplier_part_base.html:106
+#: stock/models.py:395 stock/templates/stock/item_base.html:295
 #: templates/js/stock.js:663
 msgid "Packaging"
 msgstr ""
 
-#: company/models.py:371
+#: company/models.py:373
 msgid "Part packaging"
 msgstr ""
 
-#: company/models.py:373
+#: company/models.py:375
 msgid "multiple"
 msgstr ""
 
+#: company/models.py:375
+msgid "Order multiple"
+msgstr ""
+
 #: company/templates/company/assigned_stock.html:10
 #: company/templates/company/navbar.html:51
 #: company/templates/company/navbar.html:54 templates/js/build.js:411
@@ -1825,6 +1905,19 @@ msgstr ""
 msgid "Phone"
 msgstr ""
 
+#: company/templates/company/delete.html:7
+#, python-format
+msgid "Are you sure you want to delete company '%(name)s'?"
+msgstr ""
+
+#: company/templates/company/delete.html:12
+#, python-format
+msgid ""
+"There are %(count)s parts sourced from this company.<br>\n"
+"If this supplier is deleted, these supplier part entries will also be "
+"deleted."
+msgstr ""
+
 #: company/templates/company/detail.html:21
 msgid "Company Name"
 msgstr ""
@@ -1837,9 +1930,9 @@ msgstr ""
 msgid "Uses default currency"
 msgstr ""
 
-#: company/templates/company/detail.html:65
-#: order/templates/order/sales_order_base.html:92 stock/models.py:412
-#: stock/models.py:413 stock/templates/stock/item_base.html:247
+#: company/templates/company/detail.html:65 order/models.py:440
+#: order/templates/order/sales_order_base.html:92 stock/models.py:413
+#: stock/models.py:414 stock/templates/stock/item_base.html:247
 #: templates/js/company.js:40 templates/js/order.js:267
 msgid "Customer"
 msgstr ""
@@ -1850,6 +1943,7 @@ msgid "Supplier Parts"
 msgstr ""
 
 #: company/templates/company/detail_part.html:20
+#: order/templates/order/order_wizard/select_parts.html:42
 #: order/templates/order/purchase_order_detail.html:75
 msgid "Create new supplier part"
 msgstr ""
@@ -1889,13 +1983,13 @@ msgid "Create new Part"
 msgstr ""
 
 #: company/templates/company/detail_part.html:72 company/views.py:62
-#: order/templates/order/purchase_orders.html:182
+#: order/templates/order/purchase_orders.html:183
 #: part/templates/part/supplier.html:50
 msgid "New Supplier"
 msgstr ""
 
 #: company/templates/company/detail_part.html:73 company/views.py:279
-#: order/templates/order/purchase_orders.html:183
+#: order/templates/order/purchase_orders.html:184
 msgid "Create new Supplier"
 msgstr ""
 
@@ -2035,7 +2129,7 @@ msgid "New Sales Order"
 msgstr ""
 
 #: company/templates/company/supplier_part_base.html:6
-#: company/templates/company/supplier_part_base.html:19 stock/models.py:379
+#: company/templates/company/supplier_part_base.html:19 stock/models.py:380
 #: stock/templates/stock/item_base.html:342 templates/js/company.js:180
 msgid "Supplier Part"
 msgstr ""
@@ -2109,7 +2203,7 @@ msgstr ""
 msgid "Customers"
 msgstr ""
 
-#: company/views.py:76 order/templates/order/sales_orders.html:184
+#: company/views.py:76 order/templates/order/sales_orders.html:185
 msgid "New Customer"
 msgstr ""
 
@@ -2149,7 +2243,7 @@ msgstr ""
 msgid "Edited company information"
 msgstr ""
 
-#: company/views.py:285 order/templates/order/sales_orders.html:185
+#: company/views.py:285 order/templates/order/sales_orders.html:186
 msgid "Create new Customer"
 msgstr ""
 
@@ -2201,7 +2295,7 @@ msgstr ""
 msgid "Label description"
 msgstr ""
 
-#: label/models.py:116 stock/forms.py:201
+#: label/models.py:116 stock/forms.py:202
 msgid "Label"
 msgstr ""
 
@@ -2217,6 +2311,10 @@ msgstr ""
 msgid "Label template is enabled"
 msgstr ""
 
+#: label/models.py:129
+msgid "Width [mm]"
+msgstr ""
+
 #: label/models.py:130
 msgid "Label width, specified in mm"
 msgstr ""
@@ -2263,24 +2361,24 @@ msgstr ""
 msgid "Purchase Order reference"
 msgstr ""
 
-#: order/forms.py:109
+#: order/forms.py:110
 msgid "Target date for order delivery. Order will be overdue after this date."
 msgstr ""
 
-#: order/forms.py:137
+#: order/forms.py:138
 msgid "Enter sales order number"
 msgstr ""
 
-#: order/forms.py:143 order/models.py:448
+#: order/forms.py:145 order/models.py:452
 msgid ""
 "Target date for order completion. Order will be overdue after this date."
 msgstr ""
 
-#: order/forms.py:233
+#: order/forms.py:235
 msgid "Enter stock item serial numbers"
 msgstr ""
 
-#: order/forms.py:239
+#: order/forms.py:241
 msgid "Enter quantity of stock items"
 msgstr ""
 
@@ -2296,137 +2394,183 @@ msgstr ""
 msgid "Link to external page"
 msgstr ""
 
-#: order/models.py:117
+#: order/models.py:111 part/templates/part/detail.html:132
+msgid "Created By"
+msgstr ""
+
+#: order/models.py:118
 msgid "User or group responsible for this order"
 msgstr ""
 
-#: order/models.py:122
+#: order/models.py:123
 msgid "Order notes"
 msgstr ""
 
-#: order/models.py:181 order/models.py:441
+#: order/models.py:182 order/models.py:445
 msgid "Purchase order status"
 msgstr ""
 
-#: order/models.py:189
+#: order/models.py:191
 msgid "Company from which the items are being ordered"
 msgstr ""
 
-#: order/models.py:192
+#: order/models.py:194 order/templates/order/order_base.html:98
+#: templates/js/order.js:179
+msgid "Supplier Reference"
+msgstr ""
+
+#: order/models.py:194
 msgid "Supplier order reference code"
 msgstr ""
 
-#: order/models.py:203
+#: order/models.py:201
+msgid "received by"
+msgstr ""
+
+#: order/models.py:206
 msgid "Issue Date"
 msgstr ""
 
-#: order/models.py:204
+#: order/models.py:207
 msgid "Date order was issued"
 msgstr ""
 
-#: order/models.py:209
+#: order/models.py:212
 msgid "Target Delivery Date"
 msgstr ""
 
-#: order/models.py:210
+#: order/models.py:213
 msgid ""
 "Expected date for order delivery. Order will be overdue after this date."
 msgstr ""
 
-#: order/models.py:216
+#: order/models.py:219
 msgid "Date order was completed"
 msgstr ""
 
-#: order/models.py:240 order/models.py:339 part/views.py:1586
-#: stock/models.py:269 stock/models.py:948
+#: order/models.py:243 order/models.py:342 part/views.py:1586
+#: stock/models.py:270 stock/models.py:950
 msgid "Quantity must be greater than zero"
 msgstr ""
 
-#: order/models.py:245
+#: order/models.py:248
 msgid "Part supplier must match PO supplier"
 msgstr ""
 
-#: order/models.py:334
+#: order/models.py:337
 msgid "Lines can only be received against an order marked as 'Placed'"
 msgstr ""
 
-#: order/models.py:356
+#: order/models.py:359
 msgid "Received items"
 msgstr ""
 
-#: order/models.py:437
+#: order/models.py:441
 msgid "Company to which the items are being sold"
 msgstr ""
 
-#: order/models.py:443
+#: order/models.py:447
+msgid "Customer Reference "
+msgstr ""
+
+#: order/models.py:447
 msgid "Customer order reference code"
 msgstr ""
 
-#: order/models.py:501
+#: order/models.py:455 templates/js/order.js:303
+msgid "Shipment Date"
+msgstr ""
+
+#: order/models.py:462
+msgid "shipped by"
+msgstr ""
+
+#: order/models.py:506
 msgid "SalesOrder cannot be shipped as it is not currently pending"
 msgstr ""
 
-#: order/models.py:588
+#: order/models.py:593
 msgid "Item quantity"
 msgstr ""
 
-#: order/models.py:590
+#: order/models.py:595
 msgid "Line item reference"
 msgstr ""
 
-#: order/models.py:592
+#: order/models.py:597
 msgid "Line item notes"
 msgstr ""
 
-#: order/models.py:618 order/templates/order/order_base.html:9
+#: order/models.py:623 order/models.py:667
+#: part/templates/part/allocation.html:17
+#: part/templates/part/allocation.html:45
+msgid "Order"
+msgstr ""
+
+#: order/models.py:624 order/templates/order/order_base.html:9
 #: order/templates/order/order_base.html:24
 #: report/templates/report/inventree_po_report.html:77
 #: stock/templates/stock/item_base.html:309 templates/js/order.js:148
 msgid "Purchase Order"
 msgstr ""
 
-#: order/models.py:631
+#: order/models.py:638
 msgid "Supplier part"
 msgstr ""
 
-#: order/models.py:634
+#: order/models.py:641 order/templates/order/order_base.html:131
+#: order/templates/order/purchase_order_detail.html:207
+#: order/templates/order/receive_parts.html:22
+#: order/templates/order/sales_order_base.html:131
+msgid "Received"
+msgstr ""
+
+#: order/models.py:641
 msgid "Number of items received"
 msgstr ""
 
-#: order/models.py:641 stock/models.py:505
+#: order/models.py:648 stock/models.py:506
 #: stock/templates/stock/item_base.html:316
 msgid "Purchase Price"
 msgstr ""
 
-#: order/models.py:642
+#: order/models.py:649
 msgid "Unit purchase price"
 msgstr ""
 
-#: order/models.py:736 order/models.py:738
+#: order/models.py:743 order/models.py:745
 msgid "Stock item has not been assigned"
 msgstr ""
 
-#: order/models.py:742
+#: order/models.py:749
 msgid "Cannot allocate stock item to a line with a different part"
 msgstr ""
 
-#: order/models.py:744
+#: order/models.py:751
 msgid "Cannot allocate stock to a line without a part"
 msgstr ""
 
-#: order/models.py:747
+#: order/models.py:754
 msgid "Allocation quantity cannot exceed stock quantity"
 msgstr ""
 
-#: order/models.py:757
+#: order/models.py:764
 msgid "Quantity must be 1 for serialized stock item"
 msgstr ""
 
-#: order/models.py:773
+#: order/models.py:769
+msgid "Line"
+msgstr ""
+
+#: order/models.py:780
+msgid "Item"
+msgstr ""
+
+#: order/models.py:781
 msgid "Select stock item to allocate"
 msgstr ""
 
-#: order/models.py:776
+#: order/models.py:784
 msgid "Enter stock allocation quantity"
 msgstr ""
 
@@ -2469,27 +2613,25 @@ msgstr ""
 msgid "Order Status"
 msgstr ""
 
-#: order/templates/order/order_base.html:98 templates/js/order.js:179
-msgid "Supplier Reference"
-msgstr ""
-
 #: order/templates/order/order_base.html:117
 #: report/templates/report/inventree_build_order_base.html:122
 msgid "Issued"
 msgstr ""
 
-#: order/templates/order/order_base.html:131
-#: order/templates/order/purchase_order_detail.html:207
-#: order/templates/order/receive_parts.html:22
-#: order/templates/order/sales_order_base.html:131
-msgid "Received"
-msgstr ""
-
 #: order/templates/order/order_cancel.html:7
 #: order/templates/order/sales_order_cancel.html:9
 msgid "Cancelling this order means that the order will no longer be editable."
 msgstr ""
 
+#: order/templates/order/order_complete.html:7
+msgid "Mark this order as complete?"
+msgstr ""
+
+#: order/templates/order/order_issue.html:7
+msgid ""
+"After placing this purchase order, line items will no longer be editable."
+msgstr ""
+
 #: order/templates/order/order_notes.html:13
 msgid "Order Notes"
 msgstr ""
@@ -2668,11 +2810,16 @@ msgstr ""
 #: order/templates/order/sales_order_detail.html:75
 #: order/templates/order/sales_order_detail.html:157
 #: report/templates/report/inventree_test_report_base.html:75
-#: stock/models.py:417 stock/templates/stock/item_base.html:234
+#: stock/models.py:418 stock/templates/stock/item_base.html:234
 #: templates/js/build.js:418
 msgid "Serial Number"
 msgstr ""
 
+#: order/templates/order/sales_order_detail.html:92 templates/js/bom.js:338
+#: templates/js/build.js:571 templates/js/build.js:984
+msgid "Actions"
+msgstr ""
+
 #: order/templates/order/sales_order_detail.html:99 templates/js/build.js:459
 #: templates/js/build.js:789
 msgid "Edit stock allocation"
@@ -2683,8 +2830,16 @@ msgstr ""
 msgid "Delete stock allocation"
 msgstr ""
 
-#: order/templates/order/sales_order_detail.html:229 order/views.py:1351
-#: templates/js/build.js:523 templates/js/build.js:785
+#: order/templates/order/sales_order_detail.html:170
+msgid "No matching line items"
+msgstr ""
+
+#: order/templates/order/sales_order_detail.html:199
+msgid "ID"
+msgstr ""
+
+#: order/templates/order/sales_order_detail.html:229 templates/js/build.js:523
+#: templates/js/build.js:785
 msgid "Allocated"
 msgstr ""
 
@@ -2852,6 +3007,11 @@ msgstr ""
 msgid "No lines specified"
 msgstr ""
 
+#: order/views.py:1060
+#, python-brace-format
+msgid "Ordered {n} parts"
+msgstr ""
+
 #: order/views.py:1117
 msgid "Supplier part must be specified"
 msgstr ""
@@ -2877,7 +3037,8 @@ msgid "Allocate Serial Numbers"
 msgstr ""
 
 #: order/views.py:1351
-msgid "items"
+#, python-brace-format
+msgid "Allocated {n} items"
 msgstr ""
 
 #: order/views.py:1367
@@ -2908,7 +3069,7 @@ msgstr ""
 msgid "Remove allocation"
 msgstr ""
 
-#: part/bom.py:138 part/models.py:72 part/models.py:761
+#: part/bom.py:138 part/models.py:72 part/models.py:762
 #: part/templates/part/category.html:62 part/templates/part/detail.html:90
 msgid "Default Location"
 msgstr ""
@@ -2930,11 +3091,11 @@ msgstr ""
 msgid "Error reading BOM file (incorrect row size)"
 msgstr ""
 
-#: part/forms.py:89 stock/forms.py:264
+#: part/forms.py:89 stock/forms.py:265
 msgid "File Format"
 msgstr ""
 
-#: part/forms.py:89 stock/forms.py:264
+#: part/forms.py:89 stock/forms.py:265
 msgid "Select output file format"
 msgstr ""
 
@@ -2978,7 +3139,7 @@ msgstr ""
 msgid "Include part supplier data in exported BOM"
 msgstr ""
 
-#: part/forms.py:120 part/models.py:2054
+#: part/forms.py:120 part/models.py:2057
 msgid "Parent Part"
 msgstr ""
 
@@ -2990,63 +3151,75 @@ msgstr ""
 msgid "Clear existing BOM items"
 msgstr ""
 
-#: part/forms.py:132
+#: part/forms.py:133
 msgid "Confirm BOM duplication"
 msgstr ""
 
-#: part/forms.py:150
+#: part/forms.py:151
+msgid "validate"
+msgstr ""
+
+#: part/forms.py:151
 msgid "Confirm that the BOM is correct"
 msgstr ""
 
-#: part/forms.py:162
+#: part/forms.py:163
+msgid "BOM file"
+msgstr ""
+
+#: part/forms.py:163
 msgid "Select BOM file to upload"
 msgstr ""
 
-#: part/forms.py:181
+#: part/forms.py:182
 msgid "Related Part"
 msgstr ""
 
-#: part/forms.py:200
+#: part/forms.py:201
 msgid "Select part category"
 msgstr ""
 
-#: part/forms.py:217
+#: part/forms.py:218
 msgid "Duplicate all BOM data for this part"
 msgstr ""
 
-#: part/forms.py:218
+#: part/forms.py:219
 msgid "Copy BOM"
 msgstr ""
 
-#: part/forms.py:223
+#: part/forms.py:224
 msgid "Duplicate all parameter data for this part"
 msgstr ""
 
-#: part/forms.py:224
+#: part/forms.py:225
 msgid "Copy Parameters"
 msgstr ""
 
-#: part/forms.py:229
+#: part/forms.py:230
 msgid "Confirm part creation"
 msgstr ""
 
-#: part/forms.py:234
+#: part/forms.py:235
 msgid "Include category parameter templates"
 msgstr ""
 
-#: part/forms.py:239
+#: part/forms.py:240
 msgid "Include parent categories parameter templates"
 msgstr ""
 
-#: part/forms.py:319
+#: part/forms.py:320
 msgid "Add parameter template to same level categories"
 msgstr ""
 
-#: part/forms.py:323
+#: part/forms.py:324
 msgid "Add parameter template to all categories"
 msgstr ""
 
-#: part/forms.py:368
+#: part/forms.py:342 part/models.py:2151
+msgid "Sub part"
+msgstr ""
+
+#: part/forms.py:370
 msgid "Input quantity for price calculation"
 msgstr ""
 
@@ -3062,7 +3235,7 @@ msgstr ""
 msgid "Default keywords for parts in this category"
 msgstr ""
 
-#: part/models.py:82 part/models.py:2099
+#: part/models.py:82 part/models.py:2103
 #: part/templates/part/part_app_base.html:9
 msgid "Part Category"
 msgstr ""
@@ -3132,7 +3305,7 @@ msgstr ""
 msgid "Part keywords to improve visibility in search results"
 msgstr ""
 
-#: part/models.py:724 part/templates/part/detail.html:73
+#: part/models.py:724 part/models.py:2102 part/templates/part/detail.html:73
 #: part/templates/part/set_category.html:15 templates/js/part.js:384
 msgid "Category"
 msgstr ""
@@ -3159,243 +3332,262 @@ msgstr ""
 msgid "Revision"
 msgstr ""
 
-#: part/models.py:759
+#: part/models.py:760
 msgid "Where is this item normally stored?"
 msgstr ""
 
-#: part/models.py:806 part/templates/part/detail.html:97
+#: part/models.py:807 part/templates/part/detail.html:97
 msgid "Default Supplier"
 msgstr ""
 
-#: part/models.py:807
+#: part/models.py:808
 msgid "Default supplier part"
 msgstr ""
 
-#: part/models.py:814
+#: part/models.py:815
 msgid "Default Expiry"
 msgstr ""
 
-#: part/models.py:815
+#: part/models.py:816
 msgid "Expiry time (in days) for stock items of this part"
 msgstr ""
 
-#: part/models.py:820 part/templates/part/detail.html:113
+#: part/models.py:821 part/templates/part/detail.html:113
 msgid "Minimum Stock"
 msgstr ""
 
-#: part/models.py:821
+#: part/models.py:822
 msgid "Minimum allowed stock level"
 msgstr ""
 
-#: part/models.py:827 part/templates/part/detail.html:106
+#: part/models.py:828 part/models.py:2031 part/templates/part/detail.html:106
 #: part/templates/part/params.html:29
 msgid "Units"
 msgstr ""
 
-#: part/models.py:828
+#: part/models.py:829
 msgid "Stock keeping units for this part"
 msgstr ""
 
-#: part/models.py:834
+#: part/models.py:835
 msgid "Can this part be built from other parts?"
 msgstr ""
 
-#: part/models.py:840
+#: part/models.py:841
 msgid "Can this part be used to build other parts?"
 msgstr ""
 
-#: part/models.py:846
+#: part/models.py:847
 msgid "Does this part have tracking for unique items?"
 msgstr ""
 
-#: part/models.py:851
+#: part/models.py:852
 msgid "Can this part be purchased from external suppliers?"
 msgstr ""
 
-#: part/models.py:856
+#: part/models.py:857
 msgid "Can this part be sold to customers?"
 msgstr ""
 
-#: part/models.py:860 part/templates/part/detail.html:227
+#: part/models.py:861 part/templates/part/detail.html:227
 #: templates/js/table_filters.js:20 templates/js/table_filters.js:60
 #: templates/js/table_filters.js:214 templates/js/table_filters.js:283
 msgid "Active"
 msgstr ""
 
-#: part/models.py:861
+#: part/models.py:862
 msgid "Is this part active?"
 msgstr ""
 
-#: part/models.py:866
+#: part/models.py:867
 msgid "Is this a virtual part, such as a software product or license?"
 msgstr ""
 
-#: part/models.py:871
+#: part/models.py:872
 msgid "Part notes - supports Markdown formatting"
 msgstr ""
 
-#: part/models.py:874
+#: part/models.py:875
 msgid "BOM checksum"
 msgstr ""
 
-#: part/models.py:874
+#: part/models.py:875
 msgid "Stored BOM checksum"
 msgstr ""
 
-#: part/models.py:877
+#: part/models.py:878
 msgid "BOM checked by"
 msgstr ""
 
-#: part/models.py:879
+#: part/models.py:880
 msgid "BOM checked date"
 msgstr ""
 
-#: part/models.py:881 part/templates/part/detail.html:126
-#: templates/js/order.js:293
-msgid "Creation Date"
-msgstr ""
-
-#: part/models.py:883
+#: part/models.py:884
 msgid "Creation User"
 msgstr ""
 
-#: part/models.py:1927
+#: part/models.py:1929
 msgid "Test templates can only be created for trackable parts"
 msgstr ""
 
-#: part/models.py:1944
+#: part/models.py:1946
 msgid "Test with this name already exists for this part"
 msgstr ""
 
-#: part/models.py:1963 templates/js/part.js:561 templates/js/stock.js:104
+#: part/models.py:1966 templates/js/part.js:561 templates/js/stock.js:104
 msgid "Test Name"
 msgstr ""
 
-#: part/models.py:1964
+#: part/models.py:1967
 msgid "Enter a name for the test"
 msgstr ""
 
-#: part/models.py:1969
+#: part/models.py:1972
 msgid "Test Description"
 msgstr ""
 
-#: part/models.py:1970
+#: part/models.py:1973
 msgid "Enter description for this test"
 msgstr ""
 
-#: part/models.py:1975 templates/js/part.js:570
+#: part/models.py:1978 templates/js/part.js:570
 #: templates/js/table_filters.js:200
 msgid "Required"
 msgstr ""
 
-#: part/models.py:1976
+#: part/models.py:1979
 msgid "Is this test required to pass?"
 msgstr ""
 
-#: part/models.py:1981 templates/js/part.js:578
+#: part/models.py:1984 templates/js/part.js:578
 msgid "Requires Value"
 msgstr ""
 
-#: part/models.py:1982
+#: part/models.py:1985
 msgid "Does this test require a value when adding a test result?"
 msgstr ""
 
-#: part/models.py:1987 templates/js/part.js:585
+#: part/models.py:1990 templates/js/part.js:585
 msgid "Requires Attachment"
 msgstr ""
 
-#: part/models.py:1988
+#: part/models.py:1991
 msgid "Does this test require a file attachment when adding a test result?"
 msgstr ""
 
-#: part/models.py:2021
+#: part/models.py:2024
 msgid "Parameter template name must be unique"
 msgstr ""
 
-#: part/models.py:2026
+#: part/models.py:2029
 msgid "Parameter Name"
 msgstr ""
 
-#: part/models.py:2028
+#: part/models.py:2031
 msgid "Parameter Units"
 msgstr ""
 
-#: part/models.py:2056 part/models.py:2104
+#: part/models.py:2059 part/models.py:2108 part/models.py:2109
 #: templates/InvenTree/settings/category.html:62
 msgid "Parameter Template"
 msgstr ""
 
-#: part/models.py:2058
+#: part/models.py:2061
 msgid "Data"
 msgstr ""
 
-#: part/models.py:2058
+#: part/models.py:2061
 msgid "Parameter Value"
 msgstr ""
 
-#: part/models.py:2108
+#: part/models.py:2113 templates/InvenTree/settings/category.html:67
+msgid "Default Value"
+msgstr ""
+
+#: part/models.py:2114
 msgid "Default Parameter Value"
 msgstr ""
 
-#: part/models.py:2136
+#: part/models.py:2143
 msgid "Select parent part"
 msgstr ""
 
-#: part/models.py:2144
+#: part/models.py:2152
 msgid "Select part to be used in BOM"
 msgstr ""
 
-#: part/models.py:2150
+#: part/models.py:2158
 msgid "BOM quantity for this BOM item"
 msgstr ""
 
-#: part/models.py:2152
+#: part/models.py:2160 templates/js/bom.js:216 templates/js/bom.js:269
+msgid "Optional"
+msgstr ""
+
+#: part/models.py:2160
 msgid "This BOM item is optional"
 msgstr ""
 
-#: part/models.py:2155
+#: part/models.py:2163
+msgid "Overage"
+msgstr ""
+
+#: part/models.py:2164
 msgid "Estimated build wastage quantity (absolute or percentage)"
 msgstr ""
 
-#: part/models.py:2158
+#: part/models.py:2167
 msgid "BOM item reference"
 msgstr ""
 
-#: part/models.py:2161
+#: part/models.py:2170
 msgid "BOM item notes"
 msgstr ""
 
-#: part/models.py:2163
+#: part/models.py:2172
+msgid "Checksum"
+msgstr ""
+
+#: part/models.py:2172
 msgid "BOM line checksum"
 msgstr ""
 
-#: part/models.py:2167 templates/js/bom.js:275 templates/js/bom.js:282
+#: part/models.py:2176 templates/js/bom.js:275 templates/js/bom.js:282
 #: templates/js/table_filters.js:50
 msgid "Inherited"
 msgstr ""
 
-#: part/models.py:2168
+#: part/models.py:2177
 msgid "This BOM item is inherited by BOMs for variant parts"
 msgstr ""
 
-#: part/models.py:2244 part/views.py:1592 part/views.py:1644
-#: stock/models.py:259
+#: part/models.py:2253 part/views.py:1592 part/views.py:1644
+#: stock/models.py:260
 msgid "Quantity must be integer value for trackable parts"
 msgstr ""
 
-#: part/models.py:2253 part/models.py:2255
+#: part/models.py:2262 part/models.py:2264
 msgid "Sub part must be specified"
 msgstr ""
 
-#: part/models.py:2258
+#: part/models.py:2267
 msgid "BOM Item"
 msgstr ""
 
-#: part/models.py:2379
+#: part/models.py:2384
+msgid "Part 1"
+msgstr ""
+
+#: part/models.py:2388
+msgid "Part 2"
+msgstr ""
+
+#: part/models.py:2388
 msgid "Select Related Part"
 msgstr ""
 
-#: part/models.py:2411
+#: part/models.py:2420
 msgid ""
 "Error creating relationship: check that the part is not related to itself "
 "and that the relationship is unique"
@@ -3405,23 +3597,6 @@ msgstr ""
 msgid "Part Stock Allocations"
 msgstr ""
 
-#: part/templates/part/allocation.html:17
-#: part/templates/part/allocation.html:45
-msgid "Order"
-msgstr ""
-
-#: part/templates/part/allocation.html:18
-#: part/templates/part/allocation.html:24
-#: part/templates/part/allocation.html:31
-#: part/templates/part/allocation.html:49
-#: stock/templates/stock/item_base.html:8
-#: stock/templates/stock/item_base.html:89
-#: stock/templates/stock/item_base.html:324
-#: stock/templates/stock/stock_adjust.html:16 templates/js/build.js:771
-#: templates/js/stock.js:923 templates/js/stock.js:1181
-msgid "Stock Item"
-msgstr ""
-
 #: part/templates/part/attachments.html:10
 msgid "Part Attachments"
 msgstr ""
@@ -3439,6 +3614,22 @@ msgstr ""
 msgid "Bill of Materials"
 msgstr ""
 
+#: part/templates/part/bom.html:19
+#, python-format
+msgid "The BOM for <i>%(part)s</i> has changed, and must be validated.<br>"
+msgstr ""
+
+#: part/templates/part/bom.html:21
+#, python-format
+msgid ""
+"The BOM for <i>%(part)s</i> was last checked by %(checker)s on %(check_date)s"
+msgstr ""
+
+#: part/templates/part/bom.html:25
+#, python-format
+msgid "The BOM for <i>%(part)s</i> has not been validated."
+msgstr ""
+
 #: part/templates/part/bom.html:32
 msgid "Remove selected BOM items"
 msgstr ""
@@ -3578,6 +3769,20 @@ msgstr ""
 msgid "Each part must already exist in the database"
 msgstr ""
 
+#: part/templates/part/bom_upload/upload_file.html:27
+msgid "Upload File"
+msgstr ""
+
+#: part/templates/part/bom_validate.html:6
+#, python-format
+msgid ""
+"Confirm that the Bill of Materials (BOM) is valid for:<br><i>%(part)s</i>"
+msgstr ""
+
+#: part/templates/part/bom_validate.html:9
+msgid "This will validate each line in the BOM."
+msgstr ""
+
 #: part/templates/part/build.html:10
 msgid "Part Builds"
 msgstr ""
@@ -3655,7 +3860,7 @@ msgstr ""
 msgid "Create new Part Category"
 msgstr ""
 
-#: part/templates/part/category.html:240 stock/views.py:1358
+#: part/templates/part/category.html:240 stock/views.py:1359
 msgid "Create new Stock Location"
 msgstr ""
 
@@ -3749,10 +3954,6 @@ msgstr ""
 msgid "Stock Expiry Time"
 msgstr ""
 
-#: part/templates/part/detail.html:132
-msgid "Created By"
-msgstr ""
-
 #: part/templates/part/detail.html:139
 msgid "Responsible User"
 msgstr ""
@@ -3874,7 +4075,7 @@ msgstr ""
 
 #: part/templates/part/params.html:28
 #: report/templates/report/inventree_test_report_base.html:90
-#: stock/models.py:1650 templates/InvenTree/settings/header.html:8
+#: stock/models.py:1652 templates/InvenTree/settings/header.html:8
 #: templates/js/stock.js:124
 msgid "Value"
 msgstr ""
@@ -3884,7 +4085,7 @@ msgid "Edit"
 msgstr ""
 
 #: part/templates/part/params.html:44 part/templates/part/related.html:44
-#: part/templates/part/supplier.html:22 users/models.py:175
+#: part/templates/part/supplier.html:22 stock/views.py:1002 users/models.py:175
 msgid "Delete"
 msgstr ""
 
@@ -4376,18 +4577,26 @@ msgid "Sales order query filters"
 msgstr ""
 
 #: report/models.py:500
+msgid "Snippet"
+msgstr ""
+
+#: report/models.py:501
 msgid "Report snippet file"
 msgstr ""
 
-#: report/models.py:504
+#: report/models.py:505
 msgid "Snippet file description"
 msgstr ""
 
-#: report/models.py:539
+#: report/models.py:540
+msgid "Asset"
+msgstr ""
+
+#: report/models.py:541
 msgid "Report asset file"
 msgstr ""
 
-#: report/models.py:542
+#: report/models.py:544
 msgid "Asset file description"
 msgstr ""
 
@@ -4409,12 +4618,12 @@ msgid "Test Results"
 msgstr ""
 
 #: report/templates/report/inventree_test_report_base.html:88
-#: stock/models.py:1638
+#: stock/models.py:1640
 msgid "Test"
 msgstr ""
 
 #: report/templates/report/inventree_test_report_base.html:89
-#: stock/models.py:1644
+#: stock/models.py:1646
 msgid "Result"
 msgstr ""
 
@@ -4431,301 +4640,345 @@ msgstr ""
 msgid "Fail"
 msgstr ""
 
-#: stock/forms.py:117
+#: stock/api.py:199
+#, python-brace-format
+msgid "Updated stock for {n} items"
+msgstr ""
+
+#: stock/api.py:268
+#, python-brace-format
+msgid "Moved {n} parts to {loc}"
+msgstr ""
+
+#: stock/forms.py:114 stock/forms.py:406 stock/models.py:473
+#: stock/templates/stock/item_base.html:349 templates/js/stock.js:652
+msgid "Expiry Date"
+msgstr ""
+
+#: stock/forms.py:115 stock/forms.py:407
+msgid "Expiration date for this stock item"
+msgstr ""
+
+#: stock/forms.py:118
 msgid "Enter unique serial numbers (or leave blank)"
 msgstr ""
 
-#: stock/forms.py:202 stock/forms.py:258
-msgid "Select test report template"
+#: stock/forms.py:169
+msgid ""
+"Destination for serialized stock (by default, will remain in current "
+"location)"
 msgstr ""
 
-#: stock/forms.py:266
-msgid "Include stock items in sub locations"
+#: stock/forms.py:171
+msgid "Serial numbers"
 msgstr ""
 
-#: stock/forms.py:301
-msgid "Stock item to install"
+#: stock/forms.py:171
+msgid "Unique serial numbers (must match quantity)"
 msgstr ""
 
-#: stock/forms.py:308
-msgid "Stock quantity to assign"
-msgstr ""
-
-#: stock/forms.py:336
-msgid "Must not exceed available quantity"
-msgstr ""
-
-#: stock/forms.py:346
-msgid "Destination location for uninstalled items"
-msgstr ""
-
-#: stock/forms.py:348
+#: stock/forms.py:173 stock/forms.py:349
 msgid "Add transaction note (optional)"
 msgstr ""
 
-#: stock/forms.py:350
+#: stock/forms.py:203 stock/forms.py:259
+msgid "Select test report template"
+msgstr ""
+
+#: stock/forms.py:267 templates/js/table_filters.js:111
+msgid "Include sublocations"
+msgstr ""
+
+#: stock/forms.py:267
+msgid "Include stock items in sub locations"
+msgstr ""
+
+#: stock/forms.py:302
+msgid "Stock item to install"
+msgstr ""
+
+#: stock/forms.py:309
+msgid "Stock quantity to assign"
+msgstr ""
+
+#: stock/forms.py:337
+msgid "Must not exceed available quantity"
+msgstr ""
+
+#: stock/forms.py:347
+msgid "Destination location for uninstalled items"
+msgstr ""
+
+#: stock/forms.py:351
 msgid "Confirm uninstall"
 msgstr ""
 
-#: stock/forms.py:350
+#: stock/forms.py:351
 msgid "Confirm removal of installed stock items"
 msgstr ""
 
-#: stock/forms.py:374
+#: stock/forms.py:375
 msgid "Destination stock location"
 msgstr ""
 
-#: stock/forms.py:376
+#: stock/forms.py:377
 msgid "Add note (required)"
 msgstr ""
 
-#: stock/forms.py:380 stock/views.py:852 stock/views.py:1050
+#: stock/forms.py:381 stock/views.py:852 stock/views.py:1051
 msgid "Confirm stock adjustment"
 msgstr ""
 
-#: stock/forms.py:380
+#: stock/forms.py:381
 msgid "Confirm movement of stock items"
 msgstr ""
 
-#: stock/forms.py:382
+#: stock/forms.py:383
 msgid "Set Default Location"
 msgstr ""
 
-#: stock/forms.py:382
+#: stock/forms.py:383
 msgid "Set the destination as the default location for selected parts"
 msgstr ""
 
-#: stock/models.py:204
+#: stock/models.py:54 stock/models.py:511
+msgid "Owner"
+msgstr ""
+
+#: stock/models.py:55 stock/models.py:512
+msgid "Select Owner"
+msgstr ""
+
+#: stock/models.py:205
 msgid "Created stock item"
 msgstr ""
 
-#: stock/models.py:240
+#: stock/models.py:241
 msgid "StockItem with this serial number already exists"
 msgstr ""
 
-#: stock/models.py:276
+#: stock/models.py:277
 #, python-brace-format
 msgid "Part type ('{pf}') must be {pe}"
 msgstr ""
 
-#: stock/models.py:286 stock/models.py:295
+#: stock/models.py:287 stock/models.py:296
 msgid "Quantity must be 1 for item with a serial number"
 msgstr ""
 
-#: stock/models.py:287
+#: stock/models.py:288
 msgid "Serial number cannot be set if quantity greater than 1"
 msgstr ""
 
-#: stock/models.py:309
+#: stock/models.py:310
 msgid "Item cannot belong to itself"
 msgstr ""
 
-#: stock/models.py:315
+#: stock/models.py:316
 msgid "Item must have a build reference if is_building=True"
 msgstr ""
 
-#: stock/models.py:322
+#: stock/models.py:323
 msgid "Build reference does not point to the same part object"
 msgstr ""
 
-#: stock/models.py:362
+#: stock/models.py:363
 msgid "Parent Stock Item"
 msgstr ""
 
-#: stock/models.py:371
+#: stock/models.py:372
 msgid "Base part"
 msgstr ""
 
-#: stock/models.py:380
+#: stock/models.py:381
 msgid "Select a matching supplier part for this stock item"
 msgstr ""
 
-#: stock/models.py:385 stock/templates/stock/stock_app_base.html:7
+#: stock/models.py:386 stock/templates/stock/stock_app_base.html:7
 msgid "Stock Location"
 msgstr ""
 
-#: stock/models.py:388
+#: stock/models.py:389
 msgid "Where is this stock item located?"
 msgstr ""
 
-#: stock/models.py:395
+#: stock/models.py:396
 msgid "Packaging this stock item is stored in"
 msgstr ""
 
-#: stock/models.py:400 stock/templates/stock/item_base.html:255
+#: stock/models.py:401 stock/templates/stock/item_base.html:255
 msgid "Installed In"
 msgstr ""
 
-#: stock/models.py:403
+#: stock/models.py:404
 msgid "Is this item installed in another item?"
 msgstr ""
 
-#: stock/models.py:419
+#: stock/models.py:420
 msgid "Serial number for this item"
 msgstr ""
 
-#: stock/models.py:431
+#: stock/models.py:432
 msgid "Batch code for this stock item"
 msgstr ""
 
-#: stock/models.py:435
+#: stock/models.py:436
 msgid "Stock Quantity"
 msgstr ""
 
-#: stock/models.py:444
+#: stock/models.py:445
 msgid "Source Build"
 msgstr ""
 
-#: stock/models.py:446
+#: stock/models.py:447
 msgid "Build for this stock item"
 msgstr ""
 
-#: stock/models.py:457
+#: stock/models.py:458
 msgid "Source Purchase Order"
 msgstr ""
 
-#: stock/models.py:460
+#: stock/models.py:461
 msgid "Purchase order for this stock item"
 msgstr ""
 
-#: stock/models.py:466
+#: stock/models.py:467
 msgid "Destination Sales Order"
 msgstr ""
 
-#: stock/models.py:472 stock/templates/stock/item_base.html:349
-#: templates/js/stock.js:652
-msgid "Expiry Date"
-msgstr ""
-
-#: stock/models.py:473
+#: stock/models.py:474
 msgid ""
 "Expiry date for stock item. Stock will be considered expired after this date"
 msgstr ""
 
-#: stock/models.py:486
+#: stock/models.py:487
+msgid "Delete on deplete"
+msgstr ""
+
+#: stock/models.py:487
 msgid "Delete this Stock Item when stock is depleted"
 msgstr ""
 
-#: stock/models.py:496 stock/templates/stock/item_notes.html:13
+#: stock/models.py:497 stock/templates/stock/item_notes.html:13
 #: stock/templates/stock/navbar.html:54
 msgid "Stock Item Notes"
 msgstr ""
 
-#: stock/models.py:506
+#: stock/models.py:507
 msgid "Single unit purchase price at time of purchase"
 msgstr ""
 
-#: stock/models.py:610
+#: stock/models.py:612
 msgid "Assigned to Customer"
 msgstr ""
 
-#: stock/models.py:612
+#: stock/models.py:614
 msgid "Manually assigned to customer"
 msgstr ""
 
-#: stock/models.py:625
+#: stock/models.py:627
 msgid "Returned from customer"
 msgstr ""
 
-#: stock/models.py:627
+#: stock/models.py:629
 msgid "Returned to location"
 msgstr ""
 
-#: stock/models.py:787
+#: stock/models.py:789
 msgid "Installed into stock item"
 msgstr ""
 
-#: stock/models.py:795
+#: stock/models.py:797
 msgid "Installed stock item"
 msgstr ""
 
-#: stock/models.py:819
+#: stock/models.py:821
 msgid "Uninstalled stock item"
 msgstr ""
 
-#: stock/models.py:838
+#: stock/models.py:840
 msgid "Uninstalled into location"
 msgstr ""
 
-#: stock/models.py:939
+#: stock/models.py:941
 msgid "Part is not set as trackable"
 msgstr ""
 
-#: stock/models.py:945
+#: stock/models.py:947
 msgid "Quantity must be integer"
 msgstr ""
 
-#: stock/models.py:951
+#: stock/models.py:953
 #, python-brace-format
 msgid "Quantity must not exceed available stock quantity ({n})"
 msgstr ""
 
-#: stock/models.py:954
+#: stock/models.py:956
 msgid "Serial numbers must be a list of integers"
 msgstr ""
 
-#: stock/models.py:957
+#: stock/models.py:959
 msgid "Quantity does not match serial numbers"
 msgstr ""
 
-#: stock/models.py:989
+#: stock/models.py:991
 msgid "Add serial number"
 msgstr ""
 
-#: stock/models.py:992
+#: stock/models.py:994
 #, python-brace-format
 msgid "Serialized {n} items"
 msgstr ""
 
-#: stock/models.py:1070
+#: stock/models.py:1072
 msgid "Split from existing stock"
 msgstr ""
 
-#: stock/models.py:1108
+#: stock/models.py:1110
 msgid "StockItem cannot be moved as it is not in stock"
 msgstr ""
 
-#: stock/models.py:1551
+#: stock/models.py:1553
 msgid "Title"
 msgstr ""
 
-#: stock/models.py:1551
+#: stock/models.py:1553
 msgid "Tracking entry title"
 msgstr ""
 
-#: stock/models.py:1553
+#: stock/models.py:1555
 msgid "Entry notes"
 msgstr ""
 
-#: stock/models.py:1555
+#: stock/models.py:1557
 msgid "Link to external page for further information"
 msgstr ""
 
-#: stock/models.py:1615
+#: stock/models.py:1617
 msgid "Value must be provided for this test"
 msgstr ""
 
-#: stock/models.py:1621
+#: stock/models.py:1623
 msgid "Attachment must be uploaded for this test"
 msgstr ""
 
-#: stock/models.py:1639
+#: stock/models.py:1641
 msgid "Test name"
 msgstr ""
 
-#: stock/models.py:1645 templates/js/table_filters.js:190
+#: stock/models.py:1647 templates/js/table_filters.js:190
 msgid "Test result"
 msgstr ""
 
-#: stock/models.py:1651
+#: stock/models.py:1653
 msgid "Test output value"
 msgstr ""
 
-#: stock/models.py:1658
+#: stock/models.py:1660
 msgid "Test result attachment"
 msgstr ""
 
-#: stock/models.py:1664
+#: stock/models.py:1666
 msgid "Test notes"
 msgstr ""
 
@@ -4888,11 +5141,6 @@ msgstr ""
 msgid "Barcode Identifier"
 msgstr ""
 
-#: stock/templates/stock/item_base.html:302 templates/InvenTree/search.html:167
-#: templates/js/build.js:655 templates/navbar.html:29
-msgid "Build"
-msgstr ""
-
 #: stock/templates/stock/item_base.html:323
 msgid "Parent Item"
 msgstr ""
@@ -5070,7 +5318,7 @@ msgstr ""
 msgid "The following stock items will be uninstalled"
 msgstr ""
 
-#: stock/templates/stock/stockitem_convert.html:7 stock/views.py:1331
+#: stock/templates/stock/stockitem_convert.html:7 stock/views.py:1332
 msgid "Convert Stock Item"
 msgstr ""
 
@@ -5090,8 +5338,8 @@ msgstr ""
 msgid "Edit Stock Location"
 msgstr ""
 
-#: stock/views.py:230 stock/views.py:1321 stock/views.py:1432
-#: stock/views.py:1797
+#: stock/views.py:230 stock/views.py:1322 stock/views.py:1433
+#: stock/views.py:1798
 msgid "Owner is required (ownership control is enabled)"
 msgstr ""
 
@@ -5179,95 +5427,121 @@ msgstr ""
 msgid "Move Stock Items"
 msgstr ""
 
+#: stock/views.py:998
+msgid "Move"
+msgstr ""
+
 #: stock/views.py:999
 msgid "Count Stock Items"
 msgstr ""
 
+#: stock/views.py:999
+msgid "Count"
+msgstr ""
+
 #: stock/views.py:1000
 msgid "Remove From Stock"
 msgstr ""
 
+#: stock/views.py:1000
+msgid "Take"
+msgstr ""
+
 #: stock/views.py:1001
 msgid "Add Stock Items"
 msgstr ""
 
+#: stock/views.py:1001 users/models.py:171
+msgid "Add"
+msgstr ""
+
 #: stock/views.py:1002
 msgid "Delete Stock Items"
 msgstr ""
 
-#: stock/views.py:1030
+#: stock/views.py:1031
 msgid "Must enter integer value"
 msgstr ""
 
-#: stock/views.py:1035
+#: stock/views.py:1036
 msgid "Quantity must be positive"
 msgstr ""
 
-#: stock/views.py:1042
+#: stock/views.py:1043
 #, python-brace-format
 msgid "Quantity must not exceed {x}"
 msgstr ""
 
-#: stock/views.py:1106
+#: stock/views.py:1107
 msgid "No action performed"
 msgstr ""
 
-#: stock/views.py:1149
+#: stock/views.py:1122
+#, python-brace-format
+msgid "Added stock to {n} items"
+msgstr ""
+
+#: stock/views.py:1137
+#, python-brace-format
+msgid "Removed stock from {n} items"
+msgstr ""
+
+#: stock/views.py:1150
 #, python-brace-format
 msgid "Counted stock for {n} items"
 msgstr ""
 
-#: stock/views.py:1189
+#: stock/views.py:1190
 msgid "No items were moved"
 msgstr ""
 
-#: stock/views.py:1192
+#: stock/views.py:1193
 #, python-brace-format
 msgid "Moved {n} items to {dest}"
 msgstr ""
 
-#: stock/views.py:1211
+#: stock/views.py:1212
 #, python-brace-format
 msgid "Deleted {n} stock items"
 msgstr ""
 
-#: stock/views.py:1223
+#: stock/views.py:1224
 msgid "Edit Stock Item"
 msgstr ""
 
-#: stock/views.py:1449
+#: stock/views.py:1450
 msgid "Serialize Stock"
 msgstr ""
 
-#: stock/views.py:1542 templates/js/build.js:210
+#: stock/views.py:1543 templates/js/build.js:210
 msgid "Create new Stock Item"
 msgstr ""
 
-#: stock/views.py:1684
+#: stock/views.py:1685
 msgid "Duplicate Stock Item"
 msgstr ""
 
-#: stock/views.py:1766
+#: stock/views.py:1767
 msgid "Quantity cannot be negative"
 msgstr ""
 
-#: stock/views.py:1866
+#: stock/views.py:1867
 msgid "Delete Stock Location"
 msgstr ""
 
-#: stock/views.py:1879
+#: stock/views.py:1880
 msgid "Delete Stock Item"
 msgstr ""
 
-#: stock/views.py:1890
+#: stock/views.py:1891
 msgid "Delete Stock Tracking Entry"
 msgstr ""
 
-#: stock/views.py:1897
+#: stock/views.py:1898
 msgid "Edit Stock Tracking Entry"
 msgstr ""
 
-#: stock/views.py:1906
+#: stock/views.py:1907
 msgid "Add Stock Tracking Entry"
 msgstr ""
 
@@ -5371,10 +5645,6 @@ msgstr ""
 msgid "No category parameter templates found"
 msgstr ""
 
-#: templates/InvenTree/settings/category.html:67
-msgid "Default Value"
-msgstr ""
-
 #: templates/InvenTree/settings/category.html:70
 #: templates/InvenTree/settings/part.html:81
 msgid "Edit Template"
@@ -5683,10 +5953,6 @@ msgstr ""
 msgid "Open subassembly"
 msgstr ""
 
-#: templates/js/bom.js:216 templates/js/bom.js:269
-msgid "Optional"
-msgstr ""
-
 #: templates/js/bom.js:261
 msgid "No pricing available"
 msgstr ""
@@ -5695,10 +5961,6 @@ msgstr ""
 msgid "View BOM"
 msgstr ""
 
-#: templates/js/bom.js:338 templates/js/build.js:571 templates/js/build.js:984
-msgid "Actions"
-msgstr ""
-
 #: templates/js/bom.js:346
 msgid "Validate BOM Item"
 msgstr ""
@@ -5959,10 +6221,6 @@ msgstr ""
 msgid "No sales orders found"
 msgstr ""
 
-#: templates/js/order.js:303
-msgid "Shipment Date"
-msgstr ""
-
 #: templates/js/part.js:51 templates/js/part.js:136
 msgid "Trackable part"
 msgstr ""
@@ -6282,10 +6540,6 @@ msgstr ""
 msgid "Item has been allocated"
 msgstr ""
 
-#: templates/js/table_filters.js:111
-msgid "Include sublocations"
-msgstr ""
-
 #: templates/js/table_filters.js:112
 msgid "Include stock in sublocations"
 msgstr ""
@@ -6483,10 +6737,6 @@ msgstr ""
 msgid "Password"
 msgstr ""
 
-#: templates/registration/login.html:76
-msgid "Enter password"
-msgstr ""
-
 #: templates/registration/login.html:83
 msgid "Username / password combination is incorrect"
 msgstr ""
@@ -6623,10 +6873,6 @@ msgstr ""
 msgid "Permission to view items"
 msgstr ""
 
-#: users/models.py:171
-msgid "Add"
-msgstr ""
-
 #: users/models.py:171
 msgid "Permission to add items"
 msgstr ""
diff --git a/InvenTree/order/forms.py b/InvenTree/order/forms.py
index c8501d68b2..4c9caf3b53 100644
--- a/InvenTree/order/forms.py
+++ b/InvenTree/order/forms.py
@@ -24,7 +24,7 @@ from .models import SalesOrderAllocation
 
 class IssuePurchaseOrderForm(HelperForm):
 
-    confirm = forms.BooleanField(required=True, initial=False, help_text=_('Place order'))
+    confirm = forms.BooleanField(required=True, initial=False, label=_('Confirm'), help_text=_('Place order'))
 
     class Meta:
         model = PurchaseOrder
@@ -35,7 +35,7 @@ class IssuePurchaseOrderForm(HelperForm):
 
 class CompletePurchaseOrderForm(HelperForm):
 
-    confirm = forms.BooleanField(required=True, help_text=_("Mark order as complete"))
+    confirm = forms.BooleanField(required=True, label=_('Confirm'), help_text=_("Mark order as complete"))
 
     class Meta:
         model = PurchaseOrder
@@ -46,7 +46,7 @@ class CompletePurchaseOrderForm(HelperForm):
 
 class CancelPurchaseOrderForm(HelperForm):
 
-    confirm = forms.BooleanField(required=True, help_text=_('Cancel order'))
+    confirm = forms.BooleanField(required=True, label=_('Confirm'), help_text=_('Cancel order'))
 
     class Meta:
         model = PurchaseOrder
@@ -57,7 +57,7 @@ class CancelPurchaseOrderForm(HelperForm):
 
 class CancelSalesOrderForm(HelperForm):
 
-    confirm = forms.BooleanField(required=True, help_text=_('Cancel order'))
+    confirm = forms.BooleanField(required=True, label=_('Confirm'), help_text=_('Cancel order'))
 
     class Meta:
         model = SalesOrder
@@ -68,7 +68,7 @@ class CancelSalesOrderForm(HelperForm):
 
 class ShipSalesOrderForm(HelperForm):
 
-    confirm = forms.BooleanField(required=True, help_text=_('Ship order'))
+    confirm = forms.BooleanField(required=True, label=_('Confirm'), help_text=_('Ship order'))
 
     class Meta:
         model = SalesOrder
@@ -79,7 +79,7 @@ class ShipSalesOrderForm(HelperForm):
 
 class ReceivePurchaseOrderForm(HelperForm):
 
-    location = TreeNodeChoiceField(queryset=StockLocation.objects.all(), required=True, help_text=_('Receive parts to this location'))
+    location = TreeNodeChoiceField(queryset=StockLocation.objects.all(), required=True, label=_('Location'), help_text=_('Receive parts to this location'))
 
     class Meta:
         model = PurchaseOrder
@@ -106,6 +106,7 @@ class EditPurchaseOrderForm(HelperForm):
         super().__init__(*args, **kwargs)
 
     target_date = DatePickerFormField(
+        label=_('Target Date'),
         help_text=_('Target date for order delivery. Order will be overdue after this date.'),
     )
 
@@ -140,6 +141,7 @@ class EditSalesOrderForm(HelperForm):
         super().__init__(*args, **kwargs)
 
     target_date = DatePickerFormField(
+        label=_('Target Date'),
         help_text=_('Target date for order completion. Order will be overdue after this date.'),
     )
 
@@ -183,7 +185,7 @@ class EditSalesOrderAttachmentForm(HelperForm):
 class EditPurchaseOrderLineItemForm(HelperForm):
     """ Form for editing a PurchaseOrderLineItem object """
 
-    quantity = RoundingDecimalFormField(max_digits=10, decimal_places=5)
+    quantity = RoundingDecimalFormField(max_digits=10, decimal_places=5, label=_('Quantity'))
 
     class Meta:
         model = PurchaseOrderLineItem
@@ -200,7 +202,7 @@ class EditPurchaseOrderLineItemForm(HelperForm):
 class EditSalesOrderLineItemForm(HelperForm):
     """ Form for editing a SalesOrderLineItem object """
 
-    quantity = RoundingDecimalFormField(max_digits=10, decimal_places=5)
+    quantity = RoundingDecimalFormField(max_digits=10, decimal_places=5, label=_('Quantity'))
 
     class Meta:
         model = SalesOrderLineItem
@@ -256,7 +258,7 @@ class CreateSalesOrderAllocationForm(HelperForm):
     Form for creating a SalesOrderAllocation item.
     """
 
-    quantity = RoundingDecimalFormField(max_digits=10, decimal_places=5)
+    quantity = RoundingDecimalFormField(max_digits=10, decimal_places=5, label=_('Quantity'))
 
     class Meta:
         model = SalesOrderAllocation
@@ -273,7 +275,7 @@ class EditSalesOrderAllocationForm(HelperForm):
     Form for editing a SalesOrderAllocation item
     """
 
-    quantity = RoundingDecimalFormField(max_digits=10, decimal_places=5)
+    quantity = RoundingDecimalFormField(max_digits=10, decimal_places=5, label=_('Quantity'))
 
     class Meta:
         model = SalesOrderAllocation
diff --git a/InvenTree/order/migrations/0044_auto_20210403_1210.py b/InvenTree/order/migrations/0044_auto_20210403_1210.py
deleted file mode 100644
index e0fa3692fe..0000000000
--- a/InvenTree/order/migrations/0044_auto_20210403_1210.py
+++ /dev/null
@@ -1,57 +0,0 @@
-# Generated by Django 3.0.7 on 2021-04-03 12:10
-
-import InvenTree.models
-from django.conf import settings
-from django.db import migrations, models
-import django.db.models.deletion
-
-
-class Migration(migrations.Migration):
-
-    dependencies = [
-        migrations.swappable_dependency(settings.AUTH_USER_MODEL),
-        ('order', '0043_auto_20210330_0013'),
-    ]
-
-    operations = [
-        migrations.AlterField(
-            model_name='purchaseorderattachment',
-            name='attachment',
-            field=models.FileField(help_text='Select file to attach', upload_to=InvenTree.models.rename_attachment, verbose_name='Attachment'),
-        ),
-        migrations.AlterField(
-            model_name='purchaseorderattachment',
-            name='comment',
-            field=models.CharField(blank=True, help_text='File comment', max_length=100, verbose_name='Comment'),
-        ),
-        migrations.AlterField(
-            model_name='purchaseorderattachment',
-            name='upload_date',
-            field=models.DateField(auto_now_add=True, null=True, verbose_name='upload date'),
-        ),
-        migrations.AlterField(
-            model_name='purchaseorderattachment',
-            name='user',
-            field=models.ForeignKey(blank=True, help_text='User', null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL, verbose_name='User'),
-        ),
-        migrations.AlterField(
-            model_name='salesorderattachment',
-            name='attachment',
-            field=models.FileField(help_text='Select file to attach', upload_to=InvenTree.models.rename_attachment, verbose_name='Attachment'),
-        ),
-        migrations.AlterField(
-            model_name='salesorderattachment',
-            name='comment',
-            field=models.CharField(blank=True, help_text='File comment', max_length=100, verbose_name='Comment'),
-        ),
-        migrations.AlterField(
-            model_name='salesorderattachment',
-            name='upload_date',
-            field=models.DateField(auto_now_add=True, null=True, verbose_name='upload date'),
-        ),
-        migrations.AlterField(
-            model_name='salesorderattachment',
-            name='user',
-            field=models.ForeignKey(blank=True, help_text='User', null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL, verbose_name='User'),
-        ),
-    ]
diff --git a/InvenTree/order/migrations/0044_auto_20210404_2016.py b/InvenTree/order/migrations/0044_auto_20210404_2016.py
new file mode 100644
index 0000000000..f683ce0aae
--- /dev/null
+++ b/InvenTree/order/migrations/0044_auto_20210404_2016.py
@@ -0,0 +1,233 @@
+# Generated by Django 3.0.7 on 2021-04-04 20:16
+
+import InvenTree.fields
+import InvenTree.models
+from django.conf import settings
+import django.core.validators
+from django.db import migrations, models
+import django.db.models.deletion
+import markdownx.models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('company', '0032_auto_20210403_1837'),
+        ('part', '0063_bomitem_inherited'),
+        migrations.swappable_dependency(settings.AUTH_USER_MODEL),
+        ('stock', '0058_stockitem_packaging'),
+        ('order', '0043_auto_20210330_0013'),
+    ]
+
+    operations = [
+        migrations.AlterField(
+            model_name='purchaseorder',
+            name='created_by',
+            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL, verbose_name='Created By'),
+        ),
+        migrations.AlterField(
+            model_name='purchaseorder',
+            name='creation_date',
+            field=models.DateField(blank=True, null=True, verbose_name='Creation Date'),
+        ),
+        migrations.AlterField(
+            model_name='purchaseorder',
+            name='description',
+            field=models.CharField(help_text='Order description', max_length=250, verbose_name='Description'),
+        ),
+        migrations.AlterField(
+            model_name='purchaseorder',
+            name='link',
+            field=models.URLField(blank=True, help_text='Link to external page', verbose_name='Link'),
+        ),
+        migrations.AlterField(
+            model_name='purchaseorder',
+            name='notes',
+            field=markdownx.models.MarkdownxField(blank=True, help_text='Order notes', verbose_name='Notes'),
+        ),
+        migrations.AlterField(
+            model_name='purchaseorder',
+            name='received_by',
+            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL, verbose_name='received by'),
+        ),
+        migrations.AlterField(
+            model_name='purchaseorder',
+            name='reference',
+            field=models.CharField(help_text='Order reference', max_length=64, unique=True, verbose_name='Reference'),
+        ),
+        migrations.AlterField(
+            model_name='purchaseorder',
+            name='supplier',
+            field=models.ForeignKey(help_text='Company from which the items are being ordered', limit_choices_to={'is_supplier': True}, on_delete=django.db.models.deletion.CASCADE, related_name='purchase_orders', to='company.Company', verbose_name='Supplier'),
+        ),
+        migrations.AlterField(
+            model_name='purchaseorder',
+            name='supplier_reference',
+            field=models.CharField(blank=True, help_text='Supplier order reference code', max_length=64, verbose_name='Supplier Reference'),
+        ),
+        migrations.AlterField(
+            model_name='purchaseorderattachment',
+            name='attachment',
+            field=models.FileField(help_text='Select file to attach', upload_to=InvenTree.models.rename_attachment, verbose_name='Attachment'),
+        ),
+        migrations.AlterField(
+            model_name='purchaseorderattachment',
+            name='comment',
+            field=models.CharField(blank=True, help_text='File comment', max_length=100, verbose_name='Comment'),
+        ),
+        migrations.AlterField(
+            model_name='purchaseorderattachment',
+            name='upload_date',
+            field=models.DateField(auto_now_add=True, null=True, verbose_name='upload date'),
+        ),
+        migrations.AlterField(
+            model_name='purchaseorderattachment',
+            name='user',
+            field=models.ForeignKey(blank=True, help_text='User', null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL, verbose_name='User'),
+        ),
+        migrations.AlterField(
+            model_name='purchaseorderlineitem',
+            name='notes',
+            field=models.CharField(blank=True, help_text='Line item notes', max_length=500, verbose_name='Notes'),
+        ),
+        migrations.AlterField(
+            model_name='purchaseorderlineitem',
+            name='order',
+            field=models.ForeignKey(help_text='Purchase Order', on_delete=django.db.models.deletion.CASCADE, related_name='lines', to='order.PurchaseOrder', verbose_name='Order'),
+        ),
+        migrations.AlterField(
+            model_name='purchaseorderlineitem',
+            name='part',
+            field=models.ForeignKey(blank=True, help_text='Supplier part', null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='purchase_order_line_items', to='company.SupplierPart', verbose_name='Part'),
+        ),
+        migrations.AlterField(
+            model_name='purchaseorderlineitem',
+            name='quantity',
+            field=InvenTree.fields.RoundingDecimalField(decimal_places=5, default=1, help_text='Item quantity', max_digits=15, validators=[django.core.validators.MinValueValidator(0)], verbose_name='Quantity'),
+        ),
+        migrations.AlterField(
+            model_name='purchaseorderlineitem',
+            name='received',
+            field=models.DecimalField(decimal_places=5, default=0, help_text='Number of items received', max_digits=15, verbose_name='Received'),
+        ),
+        migrations.AlterField(
+            model_name='purchaseorderlineitem',
+            name='reference',
+            field=models.CharField(blank=True, help_text='Line item reference', max_length=100, verbose_name='Reference'),
+        ),
+        migrations.AlterField(
+            model_name='salesorder',
+            name='created_by',
+            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL, verbose_name='Created By'),
+        ),
+        migrations.AlterField(
+            model_name='salesorder',
+            name='creation_date',
+            field=models.DateField(blank=True, null=True, verbose_name='Creation Date'),
+        ),
+        migrations.AlterField(
+            model_name='salesorder',
+            name='customer',
+            field=models.ForeignKey(help_text='Company to which the items are being sold', limit_choices_to={'is_customer': True}, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='sales_orders', to='company.Company', verbose_name='Customer'),
+        ),
+        migrations.AlterField(
+            model_name='salesorder',
+            name='customer_reference',
+            field=models.CharField(blank=True, help_text='Customer order reference code', max_length=64, verbose_name='Customer Reference '),
+        ),
+        migrations.AlterField(
+            model_name='salesorder',
+            name='description',
+            field=models.CharField(help_text='Order description', max_length=250, verbose_name='Description'),
+        ),
+        migrations.AlterField(
+            model_name='salesorder',
+            name='link',
+            field=models.URLField(blank=True, help_text='Link to external page', verbose_name='Link'),
+        ),
+        migrations.AlterField(
+            model_name='salesorder',
+            name='notes',
+            field=markdownx.models.MarkdownxField(blank=True, help_text='Order notes', verbose_name='Notes'),
+        ),
+        migrations.AlterField(
+            model_name='salesorder',
+            name='reference',
+            field=models.CharField(help_text='Order reference', max_length=64, unique=True, verbose_name='Reference'),
+        ),
+        migrations.AlterField(
+            model_name='salesorder',
+            name='shipment_date',
+            field=models.DateField(blank=True, null=True, verbose_name='Shipment Date'),
+        ),
+        migrations.AlterField(
+            model_name='salesorder',
+            name='shipped_by',
+            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL, verbose_name='shipped by'),
+        ),
+        migrations.AlterField(
+            model_name='salesorder',
+            name='status',
+            field=models.PositiveIntegerField(choices=[(10, 'Pending'), (20, 'Shipped'), (40, 'Cancelled'), (50, 'Lost'), (60, 'Returned')], default=10, help_text='Purchase order status', verbose_name='Status'),
+        ),
+        migrations.AlterField(
+            model_name='salesorderallocation',
+            name='item',
+            field=models.ForeignKey(help_text='Select stock item to allocate', limit_choices_to={'belongs_to': None, 'part__salable': True, 'sales_order': None}, on_delete=django.db.models.deletion.CASCADE, related_name='sales_order_allocations', to='stock.StockItem', verbose_name='Item'),
+        ),
+        migrations.AlterField(
+            model_name='salesorderallocation',
+            name='line',
+            field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='allocations', to='order.SalesOrderLineItem', verbose_name='Line'),
+        ),
+        migrations.AlterField(
+            model_name='salesorderallocation',
+            name='quantity',
+            field=InvenTree.fields.RoundingDecimalField(decimal_places=5, default=1, help_text='Enter stock allocation quantity', max_digits=15, validators=[django.core.validators.MinValueValidator(0)], verbose_name='Quantity'),
+        ),
+        migrations.AlterField(
+            model_name='salesorderattachment',
+            name='attachment',
+            field=models.FileField(help_text='Select file to attach', upload_to=InvenTree.models.rename_attachment, verbose_name='Attachment'),
+        ),
+        migrations.AlterField(
+            model_name='salesorderattachment',
+            name='comment',
+            field=models.CharField(blank=True, help_text='File comment', max_length=100, verbose_name='Comment'),
+        ),
+        migrations.AlterField(
+            model_name='salesorderattachment',
+            name='upload_date',
+            field=models.DateField(auto_now_add=True, null=True, verbose_name='upload date'),
+        ),
+        migrations.AlterField(
+            model_name='salesorderattachment',
+            name='user',
+            field=models.ForeignKey(blank=True, help_text='User', null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL, verbose_name='User'),
+        ),
+        migrations.AlterField(
+            model_name='salesorderlineitem',
+            name='notes',
+            field=models.CharField(blank=True, help_text='Line item notes', max_length=500, verbose_name='Notes'),
+        ),
+        migrations.AlterField(
+            model_name='salesorderlineitem',
+            name='order',
+            field=models.ForeignKey(help_text='Sales Order', on_delete=django.db.models.deletion.CASCADE, related_name='lines', to='order.SalesOrder', verbose_name='Order'),
+        ),
+        migrations.AlterField(
+            model_name='salesorderlineitem',
+            name='part',
+            field=models.ForeignKey(help_text='Part', limit_choices_to={'salable': True}, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='sales_order_line_items', to='part.Part', verbose_name='Part'),
+        ),
+        migrations.AlterField(
+            model_name='salesorderlineitem',
+            name='quantity',
+            field=InvenTree.fields.RoundingDecimalField(decimal_places=5, default=1, help_text='Item quantity', max_digits=15, validators=[django.core.validators.MinValueValidator(0)], verbose_name='Quantity'),
+        ),
+        migrations.AlterField(
+            model_name='salesorderlineitem',
+            name='reference',
+            field=models.CharField(blank=True, help_text='Line item reference', max_length=100, verbose_name='Reference'),
+        ),
+    ]
diff --git a/InvenTree/order/models.py b/InvenTree/order/models.py
index b1ee7f7c74..818bc81707 100644
--- a/InvenTree/order/models.py
+++ b/InvenTree/order/models.py
@@ -96,18 +96,19 @@ class Order(models.Model):
     class Meta:
         abstract = True
 
-    reference = models.CharField(unique=True, max_length=64, blank=False, help_text=_('Order reference'))
+    reference = models.CharField(unique=True, max_length=64, blank=False, verbose_name=_('Reference'), help_text=_('Order reference'))
 
-    description = models.CharField(max_length=250, help_text=_('Order description'))
+    description = models.CharField(max_length=250, verbose_name=_('Description'), help_text=_('Order description'))
 
-    link = models.URLField(blank=True, help_text=_('Link to external page'))
+    link = models.URLField(blank=True, verbose_name=_('Link'), help_text=_('Link to external page'))
 
-    creation_date = models.DateField(blank=True, null=True)
+    creation_date = models.DateField(blank=True, null=True, verbose_name=_('Creation Date'))
 
     created_by = models.ForeignKey(User,
                                    on_delete=models.SET_NULL,
                                    blank=True, null=True,
-                                   related_name='+'
+                                   related_name='+',
+                                   verbose_name=_('Created By')
                                    )
 
     responsible = models.ForeignKey(
@@ -119,7 +120,7 @@ class Order(models.Model):
         related_name='+',
     )
 
-    notes = MarkdownxField(blank=True, help_text=_('Order notes'))
+    notes = MarkdownxField(blank=True, verbose_name=_('Notes'), help_text=_('Order notes'))
 
 
 class PurchaseOrder(Order):
@@ -186,16 +187,18 @@ class PurchaseOrder(Order):
             'is_supplier': True,
         },
         related_name='purchase_orders',
+        verbose_name=_('Supplier'),
         help_text=_('Company from which the items are being ordered')
     )
 
-    supplier_reference = models.CharField(max_length=64, blank=True, help_text=_("Supplier order reference code"))
+    supplier_reference = models.CharField(max_length=64, blank=True, verbose_name=_('Supplier Reference'), help_text=_("Supplier order reference code"))
 
     received_by = models.ForeignKey(
         User,
         on_delete=models.SET_NULL,
         blank=True, null=True,
-        related_name='+'
+        related_name='+',
+        verbose_name=_('received by')
     )
 
     issue_date = models.DateField(
@@ -434,13 +437,14 @@ class SalesOrder(Order):
         null=True,
         limit_choices_to={'is_customer': True},
         related_name='sales_orders',
+        verbose_name=_('Customer'),
         help_text=_("Company to which the items are being sold"),
     )
 
     status = models.PositiveIntegerField(default=SalesOrderStatus.PENDING, choices=SalesOrderStatus.items(),
-                                         help_text=_('Purchase order status'))
+                                         verbose_name=_('Status'), help_text=_('Purchase order status'))
 
-    customer_reference = models.CharField(max_length=64, blank=True, help_text=_("Customer order reference code"))
+    customer_reference = models.CharField(max_length=64, blank=True, verbose_name=_('Customer Reference '), help_text=_("Customer order reference code"))
 
     target_date = models.DateField(
         null=True, blank=True,
@@ -448,13 +452,14 @@ class SalesOrder(Order):
         help_text=_('Target date for order completion. Order will be overdue after this date.')
     )
 
-    shipment_date = models.DateField(blank=True, null=True)
+    shipment_date = models.DateField(blank=True, null=True, verbose_name=_('Shipment Date'))
 
     shipped_by = models.ForeignKey(
         User,
         on_delete=models.SET_NULL,
         blank=True, null=True,
-        related_name='+'
+        related_name='+',
+        verbose_name=_('shipped by')
     )
 
     @property
@@ -585,11 +590,11 @@ class OrderLineItem(models.Model):
     class Meta:
         abstract = True
 
-    quantity = RoundingDecimalField(max_digits=15, decimal_places=5, validators=[MinValueValidator(0)], default=1, help_text=_('Item quantity'))
+    quantity = RoundingDecimalField(max_digits=15, decimal_places=5, validators=[MinValueValidator(0)], default=1, verbose_name=_('Quantity'), help_text=_('Item quantity'))
 
-    reference = models.CharField(max_length=100, blank=True, help_text=_('Line item reference'))
+    reference = models.CharField(max_length=100, blank=True, verbose_name=_('Reference'), help_text=_('Line item reference'))
     
-    notes = models.CharField(max_length=500, blank=True, help_text=_('Line item notes'))
+    notes = models.CharField(max_length=500, blank=True, verbose_name=_('Notes'), help_text=_('Line item notes'))
 
 
 class PurchaseOrderLineItem(OrderLineItem):
@@ -615,6 +620,7 @@ class PurchaseOrderLineItem(OrderLineItem):
     order = models.ForeignKey(
         PurchaseOrder, on_delete=models.CASCADE,
         related_name='lines',
+        verbose_name=_('Order'),
         help_text=_('Purchase Order')
     )
 
@@ -628,10 +634,11 @@ class PurchaseOrderLineItem(OrderLineItem):
         SupplierPart, on_delete=models.SET_NULL,
         blank=True, null=True,
         related_name='purchase_order_line_items',
+        verbose_name=_('Part'),
         help_text=_("Supplier part"),
     )
 
-    received = models.DecimalField(decimal_places=5, max_digits=15, default=0, help_text=_('Number of items received'))
+    received = models.DecimalField(decimal_places=5, max_digits=15, default=0, verbose_name=_('Received') , help_text=_('Number of items received'))
 
     purchase_price = MoneyField(
         max_digits=19,
@@ -657,9 +664,9 @@ class SalesOrderLineItem(OrderLineItem):
         part: Link to a Part object (may be null)
     """
 
-    order = models.ForeignKey(SalesOrder, on_delete=models.CASCADE, related_name='lines', help_text=_('Sales Order'))
+    order = models.ForeignKey(SalesOrder, on_delete=models.CASCADE, related_name='lines', verbose_name=_('Order'), help_text=_('Sales Order'))
 
-    part = models.ForeignKey('part.Part', on_delete=models.SET_NULL, related_name='sales_order_line_items', null=True, help_text=_('Part'), limit_choices_to={'salable': True})
+    part = models.ForeignKey('part.Part', on_delete=models.SET_NULL, related_name='sales_order_line_items', null=True, verbose_name=_('Part'), help_text=_('Part'), limit_choices_to={'salable': True})
 
     class Meta:
         unique_together = [
@@ -759,7 +766,7 @@ class SalesOrderAllocation(models.Model):
         if len(errors) > 0:
             raise ValidationError(errors)
 
-    line = models.ForeignKey(SalesOrderLineItem, on_delete=models.CASCADE, related_name='allocations')
+    line = models.ForeignKey(SalesOrderLineItem, on_delete=models.CASCADE, verbose_name=_('Line'), related_name='allocations')
 
     item = models.ForeignKey(
         'stock.StockItem',
@@ -770,10 +777,11 @@ class SalesOrderAllocation(models.Model):
             'belongs_to': None,
             'sales_order': None,
         },
+        verbose_name=_('Item'),
         help_text=_('Select stock item to allocate')
     )
 
-    quantity = RoundingDecimalField(max_digits=15, decimal_places=5, validators=[MinValueValidator(0)], default=1, help_text=_('Enter stock allocation quantity'))
+    quantity = RoundingDecimalField(max_digits=15, decimal_places=5, validators=[MinValueValidator(0)], default=1, verbose_name=_('Quantity'), help_text=_('Enter stock allocation quantity'))
 
     def get_serial(self):
         return self.item.serial
diff --git a/InvenTree/order/templates/order/order_complete.html b/InvenTree/order/templates/order/order_complete.html
index f6b9f14338..0f6aa55133 100644
--- a/InvenTree/order/templates/order/order_complete.html
+++ b/InvenTree/order/templates/order/order_complete.html
@@ -1,12 +1,14 @@
 {% extends "modal_form.html" %}
 
+{% load i18n %}
+
 {% block pre_form_content %}
 
-Mark this order as complete?
+{% trans 'Mark this order as complete?' %}
 {% if not order.is_complete %}
 <div class='alert alert-warning alert-block'>
-    This order has line items which have not been marked as received.
-    Marking this order as complete will remove these line items.
+    {%trans 'This order has line items which have not been marked as received.
+    Marking this order as complete will remove these line items.' %}
 </div>
 {% endif %}
 
diff --git a/InvenTree/order/templates/order/order_issue.html b/InvenTree/order/templates/order/order_issue.html
index ad80fc5a0d..bb3c3eea8a 100644
--- a/InvenTree/order/templates/order/order_issue.html
+++ b/InvenTree/order/templates/order/order_issue.html
@@ -1,7 +1,9 @@
 {% extends "modal_form.html" %}
 
+{% load i18n %}
+
 {% block pre_form_content %}
 
-After placing this purchase order, line items will no longer be editable.
+{% trans 'After placing this purchase order, line items will no longer be editable.' %}
 
 {% endblock %}
\ No newline at end of file
diff --git a/InvenTree/order/templates/order/order_wizard/select_parts.html b/InvenTree/order/templates/order/order_wizard/select_parts.html
index 21e23266bb..d3f1796dce 100644
--- a/InvenTree/order/templates/order/order_wizard/select_parts.html
+++ b/InvenTree/order/templates/order/order_wizard/select_parts.html
@@ -39,7 +39,7 @@
                 {{ part.full_name }} <small><i>{{ part.description }}</i></small>
             </td>
             <td>
-                <button class='btn btn-default btn-create' onClick='newSupplierPartFromOrderWizard()' id='new_supplier_part_{{ part.id }}' part='{{ part.pk }}' title='{% trans "Create new supplier part" $}' type='button'>
+                <button class='btn btn-default btn-create' onClick='newSupplierPartFromOrderWizard()' id='new_supplier_part_{{ part.id }}' part='{{ part.pk }}' title='{% trans "Create new supplier part" %}' type='button'>
                     <span part='{{ part.pk }}' class='fas fa-plus-circle'></span>
                 </button>
             </td>
diff --git a/InvenTree/order/templates/order/sales_order_detail.html b/InvenTree/order/templates/order/sales_order_detail.html
index 7b4a4ed4f7..392a236931 100644
--- a/InvenTree/order/templates/order/sales_order_detail.html
+++ b/InvenTree/order/templates/order/sales_order_detail.html
@@ -67,7 +67,7 @@ function showAllocationSubTable(index, row, element) {
         {
             width: '50%',
             field: 'allocated',
-            title: 'Quantity',
+            title: '{% trans "Quantity" %}',
             formatter: function(value, row, index, field) {
                 var text = '';
                 
@@ -89,7 +89,7 @@ function showAllocationSubTable(index, row, element) {
         },
         {
             field: 'buttons',
-            title: 'Actions',
+            title: '{% trans "Actions" %}',
             formatter: function(value, row, index, field) {
                 
                 var html = "<div class='btn-group float-right' role='group'>";
@@ -167,7 +167,7 @@ function showFulfilledSubTable(index, row, element) {
 }
 
 $("#so-lines-table").inventreeTable({
-    formatNoMatches: function() { return "No matching line items"; },
+    formatNoMatches: function() { return "{% trans 'No matching line items' %}"; },
     queryParams: {
         order: {{ order.id }},
         part_detail: true,
@@ -196,7 +196,7 @@ $("#so-lines-table").inventreeTable({
     columns: [
         {
             field: 'pk',
-            title: 'ID',
+            title: '{% trans "ID" %}',
             visible: false,
             switchable: false,
         },
@@ -204,7 +204,7 @@ $("#so-lines-table").inventreeTable({
             sortable: true,
             sortName: 'part__name',
             field: 'part',
-            title: 'Part',
+            title: '{% trans "Part" %}',
             formatter: function(value, row, index, field) {
                 if (row.part) {
                     return imageHoverIcon(row.part_detail.thumbnail) + renderLink(row.part_detail.full_name, `/part/${value}/`);
@@ -216,12 +216,12 @@ $("#so-lines-table").inventreeTable({
         {
             sortable: true,
             field: 'reference',
-            title: 'Reference'
+            title: '{% trans "Reference" %}'
         },
         {
             sortable: true,
             field: 'quantity',
-            title: 'Quantity',
+            title: '{% trans "Quantity" %}',
         },
         {
             field: 'allocated',
@@ -261,7 +261,7 @@ $("#so-lines-table").inventreeTable({
         },
         {
             field: 'notes',
-            title: 'Notes',
+            title: '{% trans "Notes" %}',
         },
         {% if order.status == SalesOrderStatus.PENDING %}
         {
diff --git a/InvenTree/part/bom.py b/InvenTree/part/bom.py
index ccde26e2f7..f3cf598225 100644
--- a/InvenTree/part/bom.py
+++ b/InvenTree/part/bom.py
@@ -275,7 +275,7 @@ class BomUploadManager:
         elif ext in ['.xls', '.xlsx']:
             raw_data = bom_file.read()
         else:
-            raise ValidationError({'bom_file': _('Unsupported file format: {f}'.format(f=ext))})
+            raise ValidationError({'bom_file': _('Unsupported file format: {f}').format(f=ext)})
 
         try:
             self.data = tablib.Dataset().load(raw_data)
diff --git a/InvenTree/part/forms.py b/InvenTree/part/forms.py
index 42970ccfb1..63cd7b4399 100644
--- a/InvenTree/part/forms.py
+++ b/InvenTree/part/forms.py
@@ -129,6 +129,7 @@ class BomDuplicateForm(HelperForm):
 
     confirm = forms.BooleanField(
         required=False, initial=False,
+        label=_('Confirm'),
         help_text=_('Confirm BOM duplication')
     )
 
@@ -147,7 +148,7 @@ class BomValidateForm(HelperForm):
     to confirm that the BOM for this part is valid
     """
 
-    validate = forms.BooleanField(required=False, initial=False, help_text=_('Confirm that the BOM is correct'))
+    validate = forms.BooleanField(required=False, initial=False, label=_('validate'), help_text=_('Confirm that the BOM is correct'))
 
     class Meta:
         model = Part
@@ -159,7 +160,7 @@ class BomValidateForm(HelperForm):
 class BomUploadSelectFile(HelperForm):
     """ Form for importing a BOM. Provides a file input box for upload """
 
-    bom_file = forms.FileField(label='BOM file', required=True, help_text=_("Select BOM file to upload"))
+    bom_file = forms.FileField(label=_('BOM file'), required=True, help_text=_("Select BOM file to upload"))
 
     class Meta:
         model = Part
@@ -336,9 +337,9 @@ class EditCategoryParameterTemplateForm(HelperForm):
 class EditBomItemForm(HelperForm):
     """ Form for editing a BomItem object """
 
-    quantity = RoundingDecimalFormField(max_digits=10, decimal_places=5)
+    quantity = RoundingDecimalFormField(max_digits=10, decimal_places=5, label=_('Quantity'))
 
-    sub_part = PartModelChoiceField(queryset=Part.objects.all())
+    sub_part = PartModelChoiceField(queryset=Part.objects.all(), label=_('Sub part'))
 
     class Meta:
         model = BomItem
@@ -365,6 +366,7 @@ class PartPriceForm(forms.Form):
     quantity = forms.IntegerField(
         required=True,
         initial=1,
+        label=_('Quantity'),
         help_text=_('Input quantity for price calculation')
     )
 
@@ -380,7 +382,7 @@ class EditPartSalePriceBreakForm(HelperForm):
     Form for creating / editing a sale price for a part
     """
 
-    quantity = RoundingDecimalFormField(max_digits=10, decimal_places=5)
+    quantity = RoundingDecimalFormField(max_digits=10, decimal_places=5, label=_('Quantity'))
 
     class Meta:
         model = PartSellPriceBreak
diff --git a/InvenTree/part/migrations/0064_auto_20210403_1210.py b/InvenTree/part/migrations/0064_auto_20210403_1210.py
deleted file mode 100644
index d3f4b2b75f..0000000000
--- a/InvenTree/part/migrations/0064_auto_20210403_1210.py
+++ /dev/null
@@ -1,110 +0,0 @@
-# Generated by Django 3.0.7 on 2021-04-03 12:10
-
-import InvenTree.models
-import InvenTree.validators
-from django.conf import settings
-from django.db import migrations, models
-import django.db.models.deletion
-import mptt.fields
-
-
-class Migration(migrations.Migration):
-
-    dependencies = [
-        ('stock', '0059_auto_20210403_1210'),
-        migrations.swappable_dependency(settings.AUTH_USER_MODEL),
-        ('part', '0063_bomitem_inherited'),
-    ]
-
-    operations = [
-        migrations.AlterField(
-            model_name='part',
-            name='bom_checked_by',
-            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='boms_checked', to=settings.AUTH_USER_MODEL, verbose_name='BOM checked by'),
-        ),
-        migrations.AlterField(
-            model_name='part',
-            name='bom_checked_date',
-            field=models.DateField(blank=True, null=True, verbose_name='BOM checked date'),
-        ),
-        migrations.AlterField(
-            model_name='part',
-            name='bom_checksum',
-            field=models.CharField(blank=True, help_text='Stored BOM checksum', max_length=128, verbose_name='BOM checksum'),
-        ),
-        migrations.AlterField(
-            model_name='part',
-            name='creation_date',
-            field=models.DateField(auto_now_add=True, null=True, verbose_name='Creation Date'),
-        ),
-        migrations.AlterField(
-            model_name='part',
-            name='creation_user',
-            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='parts_created', to=settings.AUTH_USER_MODEL, verbose_name='Creation User'),
-        ),
-        migrations.AlterField(
-            model_name='part',
-            name='responsible',
-            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='parts_responible', to=settings.AUTH_USER_MODEL, verbose_name='Responsible'),
-        ),
-        migrations.AlterField(
-            model_name='partattachment',
-            name='attachment',
-            field=models.FileField(help_text='Select file to attach', upload_to=InvenTree.models.rename_attachment, verbose_name='Attachment'),
-        ),
-        migrations.AlterField(
-            model_name='partattachment',
-            name='comment',
-            field=models.CharField(blank=True, help_text='File comment', max_length=100, verbose_name='Comment'),
-        ),
-        migrations.AlterField(
-            model_name='partattachment',
-            name='upload_date',
-            field=models.DateField(auto_now_add=True, null=True, verbose_name='upload date'),
-        ),
-        migrations.AlterField(
-            model_name='partattachment',
-            name='user',
-            field=models.ForeignKey(blank=True, help_text='User', null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL, verbose_name='User'),
-        ),
-        migrations.AlterField(
-            model_name='partcategory',
-            name='default_keywords',
-            field=models.CharField(blank=True, help_text='Default keywords for parts in this category', max_length=250, null=True, verbose_name='Default keywords'),
-        ),
-        migrations.AlterField(
-            model_name='partcategory',
-            name='default_location',
-            field=mptt.fields.TreeForeignKey(blank=True, help_text='Default location for parts in this category', null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='default_categories', to='stock.StockLocation', verbose_name='Default Location'),
-        ),
-        migrations.AlterField(
-            model_name='partcategory',
-            name='description',
-            field=models.CharField(blank=True, help_text='Description (optional)', max_length=250, verbose_name='Description'),
-        ),
-        migrations.AlterField(
-            model_name='partcategory',
-            name='name',
-            field=models.CharField(help_text='Name', max_length=100, validators=[InvenTree.validators.validate_tree_name], verbose_name='Name'),
-        ),
-        migrations.AlterField(
-            model_name='partcategory',
-            name='parent',
-            field=mptt.fields.TreeForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='children', to='part.PartCategory', verbose_name='parent'),
-        ),
-        migrations.AlterField(
-            model_name='partparameter',
-            name='data',
-            field=models.CharField(help_text='Parameter Value', max_length=500, verbose_name='Data'),
-        ),
-        migrations.AlterField(
-            model_name='partparameter',
-            name='part',
-            field=models.ForeignKey(help_text='Parent Part', on_delete=django.db.models.deletion.CASCADE, related_name='parameters', to='part.Part', verbose_name='Part'),
-        ),
-        migrations.AlterField(
-            model_name='partparameter',
-            name='template',
-            field=models.ForeignKey(help_text='Parameter Template', on_delete=django.db.models.deletion.CASCADE, related_name='instances', to='part.PartParameterTemplate', verbose_name='Template'),
-        ),
-    ]
diff --git a/InvenTree/part/migrations/0064_auto_20210404_2016.py b/InvenTree/part/migrations/0064_auto_20210404_2016.py
new file mode 100644
index 0000000000..57943347a1
--- /dev/null
+++ b/InvenTree/part/migrations/0064_auto_20210404_2016.py
@@ -0,0 +1,218 @@
+# Generated by Django 3.0.7 on 2021-04-04 20:16
+
+import InvenTree.models
+import InvenTree.validators
+from django.conf import settings
+import django.core.validators
+from django.db import migrations, models
+import django.db.models.deletion
+import mptt.fields
+import part.models
+import stdimage.models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        migrations.swappable_dependency(settings.AUTH_USER_MODEL),
+        ('stock', '0058_stockitem_packaging'),
+        ('part', '0063_bomitem_inherited'),
+    ]
+
+    operations = [
+        migrations.AlterField(
+            model_name='bomitem',
+            name='checksum',
+            field=models.CharField(blank=True, help_text='BOM line checksum', max_length=128, verbose_name='Checksum'),
+        ),
+        migrations.AlterField(
+            model_name='bomitem',
+            name='note',
+            field=models.CharField(blank=True, help_text='BOM item notes', max_length=500, verbose_name='Note'),
+        ),
+        migrations.AlterField(
+            model_name='bomitem',
+            name='optional',
+            field=models.BooleanField(default=False, help_text='This BOM item is optional', verbose_name='Optional'),
+        ),
+        migrations.AlterField(
+            model_name='bomitem',
+            name='overage',
+            field=models.CharField(blank=True, help_text='Estimated build wastage quantity (absolute or percentage)', max_length=24, validators=[InvenTree.validators.validate_overage], verbose_name='Overage'),
+        ),
+        migrations.AlterField(
+            model_name='bomitem',
+            name='part',
+            field=models.ForeignKey(help_text='Select parent part', limit_choices_to={'assembly': True}, on_delete=django.db.models.deletion.CASCADE, related_name='bom_items', to='part.Part', verbose_name='Part'),
+        ),
+        migrations.AlterField(
+            model_name='bomitem',
+            name='quantity',
+            field=models.DecimalField(decimal_places=5, default=1.0, help_text='BOM quantity for this BOM item', max_digits=15, validators=[django.core.validators.MinValueValidator(0)], verbose_name='Quantity'),
+        ),
+        migrations.AlterField(
+            model_name='bomitem',
+            name='reference',
+            field=models.CharField(blank=True, help_text='BOM item reference', max_length=500, verbose_name='Reference'),
+        ),
+        migrations.AlterField(
+            model_name='bomitem',
+            name='sub_part',
+            field=models.ForeignKey(help_text='Select part to be used in BOM', limit_choices_to={'component': True}, on_delete=django.db.models.deletion.CASCADE, related_name='used_in', to='part.Part', verbose_name='Sub part'),
+        ),
+        migrations.AlterField(
+            model_name='part',
+            name='bom_checked_by',
+            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='boms_checked', to=settings.AUTH_USER_MODEL, verbose_name='BOM checked by'),
+        ),
+        migrations.AlterField(
+            model_name='part',
+            name='bom_checked_date',
+            field=models.DateField(blank=True, null=True, verbose_name='BOM checked date'),
+        ),
+        migrations.AlterField(
+            model_name='part',
+            name='bom_checksum',
+            field=models.CharField(blank=True, help_text='Stored BOM checksum', max_length=128, verbose_name='BOM checksum'),
+        ),
+        migrations.AlterField(
+            model_name='part',
+            name='creation_date',
+            field=models.DateField(auto_now_add=True, null=True, verbose_name='Creation Date'),
+        ),
+        migrations.AlterField(
+            model_name='part',
+            name='creation_user',
+            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='parts_created', to=settings.AUTH_USER_MODEL, verbose_name='Creation User'),
+        ),
+        migrations.AlterField(
+            model_name='part',
+            name='image',
+            field=stdimage.models.StdImageField(blank=True, null=True, upload_to=part.models.rename_part_image, verbose_name='Image'),
+        ),
+        migrations.AlterField(
+            model_name='part',
+            name='responsible',
+            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='parts_responible', to=settings.AUTH_USER_MODEL, verbose_name='Responsible'),
+        ),
+        migrations.AlterField(
+            model_name='partattachment',
+            name='attachment',
+            field=models.FileField(help_text='Select file to attach', upload_to=InvenTree.models.rename_attachment, verbose_name='Attachment'),
+        ),
+        migrations.AlterField(
+            model_name='partattachment',
+            name='comment',
+            field=models.CharField(blank=True, help_text='File comment', max_length=100, verbose_name='Comment'),
+        ),
+        migrations.AlterField(
+            model_name='partattachment',
+            name='part',
+            field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='attachments', to='part.Part', verbose_name='Part'),
+        ),
+        migrations.AlterField(
+            model_name='partattachment',
+            name='upload_date',
+            field=models.DateField(auto_now_add=True, null=True, verbose_name='upload date'),
+        ),
+        migrations.AlterField(
+            model_name='partattachment',
+            name='user',
+            field=models.ForeignKey(blank=True, help_text='User', null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL, verbose_name='User'),
+        ),
+        migrations.AlterField(
+            model_name='partcategory',
+            name='default_keywords',
+            field=models.CharField(blank=True, help_text='Default keywords for parts in this category', max_length=250, null=True, verbose_name='Default keywords'),
+        ),
+        migrations.AlterField(
+            model_name='partcategory',
+            name='default_location',
+            field=mptt.fields.TreeForeignKey(blank=True, help_text='Default location for parts in this category', null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='default_categories', to='stock.StockLocation', verbose_name='Default Location'),
+        ),
+        migrations.AlterField(
+            model_name='partcategory',
+            name='description',
+            field=models.CharField(blank=True, help_text='Description (optional)', max_length=250, verbose_name='Description'),
+        ),
+        migrations.AlterField(
+            model_name='partcategory',
+            name='name',
+            field=models.CharField(help_text='Name', max_length=100, validators=[InvenTree.validators.validate_tree_name], verbose_name='Name'),
+        ),
+        migrations.AlterField(
+            model_name='partcategory',
+            name='parent',
+            field=mptt.fields.TreeForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='children', to='part.PartCategory', verbose_name='parent'),
+        ),
+        migrations.AlterField(
+            model_name='partcategoryparametertemplate',
+            name='category',
+            field=models.ForeignKey(help_text='Part Category', on_delete=django.db.models.deletion.CASCADE, related_name='parameter_templates', to='part.PartCategory', verbose_name='Category'),
+        ),
+        migrations.AlterField(
+            model_name='partcategoryparametertemplate',
+            name='default_value',
+            field=models.CharField(blank=True, help_text='Default Parameter Value', max_length=500, verbose_name='Default Value'),
+        ),
+        migrations.AlterField(
+            model_name='partcategoryparametertemplate',
+            name='parameter_template',
+            field=models.ForeignKey(help_text='Parameter Template', on_delete=django.db.models.deletion.CASCADE, related_name='part_categories', to='part.PartParameterTemplate', verbose_name='Parameter Template'),
+        ),
+        migrations.AlterField(
+            model_name='partparameter',
+            name='data',
+            field=models.CharField(help_text='Parameter Value', max_length=500, verbose_name='Data'),
+        ),
+        migrations.AlterField(
+            model_name='partparameter',
+            name='part',
+            field=models.ForeignKey(help_text='Parent Part', on_delete=django.db.models.deletion.CASCADE, related_name='parameters', to='part.Part', verbose_name='Part'),
+        ),
+        migrations.AlterField(
+            model_name='partparameter',
+            name='template',
+            field=models.ForeignKey(help_text='Parameter Template', on_delete=django.db.models.deletion.CASCADE, related_name='instances', to='part.PartParameterTemplate', verbose_name='Template'),
+        ),
+        migrations.AlterField(
+            model_name='partparametertemplate',
+            name='name',
+            field=models.CharField(help_text='Parameter Name', max_length=100, unique=True, verbose_name='Name'),
+        ),
+        migrations.AlterField(
+            model_name='partparametertemplate',
+            name='units',
+            field=models.CharField(blank=True, help_text='Parameter Units', max_length=25, verbose_name='Units'),
+        ),
+        migrations.AlterField(
+            model_name='partrelated',
+            name='part_1',
+            field=models.ForeignKey(on_delete=django.db.models.deletion.DO_NOTHING, related_name='related_parts_1', to='part.Part', verbose_name='Part 1'),
+        ),
+        migrations.AlterField(
+            model_name='partrelated',
+            name='part_2',
+            field=models.ForeignKey(help_text='Select Related Part', on_delete=django.db.models.deletion.DO_NOTHING, related_name='related_parts_2', to='part.Part', verbose_name='Part 2'),
+        ),
+        migrations.AlterField(
+            model_name='partsellpricebreak',
+            name='part',
+            field=models.ForeignKey(limit_choices_to={'salable': True}, on_delete=django.db.models.deletion.CASCADE, related_name='salepricebreaks', to='part.Part', verbose_name='Part'),
+        ),
+        migrations.AlterField(
+            model_name='partstar',
+            name='part',
+            field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='starred_users', to='part.Part', verbose_name='Part'),
+        ),
+        migrations.AlterField(
+            model_name='partstar',
+            name='user',
+            field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='starred_parts', to=settings.AUTH_USER_MODEL, verbose_name='User'),
+        ),
+        migrations.AlterField(
+            model_name='parttesttemplate',
+            name='part',
+            field=models.ForeignKey(limit_choices_to={'trackable': True}, on_delete=django.db.models.deletion.CASCADE, related_name='test_templates', to='part.Part', verbose_name='Part'),
+        ),
+    ]
diff --git a/InvenTree/part/models.py b/InvenTree/part/models.py
index 9003e800d8..d2f8b805d3 100644
--- a/InvenTree/part/models.py
+++ b/InvenTree/part/models.py
@@ -443,10 +443,10 @@ class Part(MPTTModel):
             return
 
         if self.pk == parent.pk:
-            raise ValidationError({'sub_part': _("Part '{p1}' is  used in BOM for '{p2}' (recursive)".format(
+            raise ValidationError({'sub_part': _("Part '{p1}' is  used in BOM for '{p2}' (recursive)").format(
                 p1=str(self),
                 p2=str(parent)
-            ))})
+            )})
 
         bom_items = self.get_bom_items()
 
@@ -455,10 +455,10 @@ class Part(MPTTModel):
 
             # Check for simple match
             if item.sub_part == parent:
-                raise ValidationError({'sub_part': _("Part '{p1}' is  used in BOM for '{p2}' (recursive)".format(
+                raise ValidationError({'sub_part': _("Part '{p1}' is  used in BOM for '{p2}' (recursive)").format(
                     p1=str(parent),
                     p2=str(self)
-                ))})
+                )})
 
             # And recursively check too
             item.sub_part.checkAddToBOM(parent)
@@ -750,6 +750,7 @@ class Part(MPTTModel):
         blank=True,
         variations={'thumbnail': (128, 128)},
         delete_orphans=False,
+        verbose_name=_('Image'),
     )
 
     default_location = TreeForeignKey(
@@ -1852,7 +1853,7 @@ class PartAttachment(InvenTreeAttachment):
         return os.path.join("part_files", str(self.part.id))
 
     part = models.ForeignKey(Part, on_delete=models.CASCADE,
-                             related_name='attachments')
+                             verbose_name=_('Part'), related_name='attachments')
 
 
 class PartSellPriceBreak(common.models.PriceBreak):
@@ -1863,7 +1864,8 @@ class PartSellPriceBreak(common.models.PriceBreak):
     part = models.ForeignKey(
         Part, on_delete=models.CASCADE,
         related_name='salepricebreaks',
-        limit_choices_to={'salable': True}
+        limit_choices_to={'salable': True},
+        verbose_name=_('Part')
     )
 
     class Meta:
@@ -1881,9 +1883,9 @@ class PartStar(models.Model):
         user: Link to a User object
     """
 
-    part = models.ForeignKey(Part, on_delete=models.CASCADE, related_name='starred_users')
+    part = models.ForeignKey(Part, on_delete=models.CASCADE, verbose_name=_('Part'), related_name='starred_users')
 
-    user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='starred_parts')
+    user = models.ForeignKey(User, on_delete=models.CASCADE, verbose_name=_('User'), related_name='starred_parts')
 
     class Meta:
         unique_together = ['part', 'user']
@@ -1956,6 +1958,7 @@ class PartTestTemplate(models.Model):
         on_delete=models.CASCADE,
         related_name='test_templates',
         limit_choices_to={'trackable': True},
+        verbose_name=_('Part'),
     )
 
     test_name = models.CharField(
@@ -2023,9 +2026,9 @@ class PartParameterTemplate(models.Model):
         except PartParameterTemplate.DoesNotExist:
             pass
 
-    name = models.CharField(max_length=100, help_text=_('Parameter Name'), unique=True)
+    name = models.CharField(max_length=100, verbose_name=_('Name'), help_text=_('Parameter Name'), unique=True)
 
-    units = models.CharField(max_length=25, help_text=_('Parameter Units'), blank=True)
+    units = models.CharField(max_length=25, verbose_name=_('Units'), help_text=_('Parameter Units'), blank=True)
 
 
 class PartParameter(models.Model):
@@ -2096,15 +2099,18 @@ class PartCategoryParameterTemplate(models.Model):
     category = models.ForeignKey(PartCategory,
                                  on_delete=models.CASCADE,
                                  related_name='parameter_templates',
+                                 verbose_name=_('Category'),
                                  help_text=_('Part Category'))
 
     parameter_template = models.ForeignKey(PartParameterTemplate,
                                            on_delete=models.CASCADE,
                                            related_name='part_categories',
+                                           verbose_name=_('Parameter Template'),
                                            help_text=_('Parameter Template'))
 
     default_value = models.CharField(max_length=500,
                                      blank=True,
+                                     verbose_name=_('Default Value'),
                                      help_text=_('Default Parameter Value'))
 
 
@@ -2133,6 +2139,7 @@ class BomItem(models.Model):
     # A link to the parent part
     # Each part will get a reverse lookup field 'bom_items'
     part = models.ForeignKey(Part, on_delete=models.CASCADE, related_name='bom_items',
+                             verbose_name=_('Part'),
                              help_text=_('Select parent part'),
                              limit_choices_to={
                                  'assembly': True,
@@ -2141,26 +2148,28 @@ class BomItem(models.Model):
     # A link to the child item (sub-part)
     # Each part will get a reverse lookup field 'used_in'
     sub_part = models.ForeignKey(Part, on_delete=models.CASCADE, related_name='used_in',
+                                 verbose_name=_('Sub part'),
                                  help_text=_('Select part to be used in BOM'),
                                  limit_choices_to={
                                      'component': True,
                                  })
 
     # Quantity required
-    quantity = models.DecimalField(default=1.0, max_digits=15, decimal_places=5, validators=[MinValueValidator(0)], help_text=_('BOM quantity for this BOM item'))
+    quantity = models.DecimalField(default=1.0, max_digits=15, decimal_places=5, validators=[MinValueValidator(0)], verbose_name=_('Quantity'), help_text=_('BOM quantity for this BOM item'))
 
-    optional = models.BooleanField(default=False, help_text=_("This BOM item is optional"))
+    optional = models.BooleanField(default=False, verbose_name=_('Optional'), help_text=_("This BOM item is optional"))
 
     overage = models.CharField(max_length=24, blank=True, validators=[validators.validate_overage],
+                                verbose_name=_('Overage'),
                                help_text=_('Estimated build wastage quantity (absolute or percentage)')
                                )
 
-    reference = models.CharField(max_length=500, blank=True, help_text=_('BOM item reference'))
+    reference = models.CharField(max_length=500, blank=True, verbose_name=_('Reference'), help_text=_('BOM item reference'))
 
     # Note attached to this BOM line item
-    note = models.CharField(max_length=500, blank=True, help_text=_('BOM item notes'))
+    note = models.CharField(max_length=500, blank=True, verbose_name=_('Note'), help_text=_('BOM item notes'))
 
-    checksum = models.CharField(max_length=128, blank=True, help_text=_('BOM line checksum'))
+    checksum = models.CharField(max_length=128, blank=True, verbose_name=_('Checksum'), help_text=_('BOM line checksum'))
 
     inherited = models.BooleanField(
         default=False,
@@ -2372,11 +2381,11 @@ class PartRelated(models.Model):
     """ Store and handle related parts (eg. mating connector, crimps, etc.) """
 
     part_1 = models.ForeignKey(Part, related_name='related_parts_1',
-                               on_delete=models.DO_NOTHING)
+                               verbose_name=_('Part 1'), on_delete=models.DO_NOTHING)
 
     part_2 = models.ForeignKey(Part, related_name='related_parts_2',
                                on_delete=models.DO_NOTHING,
-                               help_text=_('Select Related Part'))
+                               verbose_name=_('Part 2'), help_text=_('Select Related Part'))
 
     def __str__(self):
         return f'{self.part_1} <--> {self.part_2}'
diff --git a/InvenTree/part/templates/part/bom.html b/InvenTree/part/templates/part/bom.html
index f7b366bccb..dc345f9737 100644
--- a/InvenTree/part/templates/part/bom.html
+++ b/InvenTree/part/templates/part/bom.html
@@ -16,13 +16,13 @@
 <div class='alert alert-block alert-info'>
 {% else %}
 <div class='alert alert-block alert-danger'>
-    The BOM for <i>{{ part.full_name }}</i> has changed, and must be validated.<br>
+    {% blocktrans with part=part.full_name %}The BOM for <i>{{ part }}</i> has changed, and must be validated.<br>{% endblocktrans %}
 {% endif %}
-    The BOM for <i>{{ part.full_name }}</i> was last checked by {{ part.bom_checked_by }} on {{ part.bom_checked_date }}
+    {% blocktrans with part=part.full_name checker=part.bom_checked_by check_date=part.bom_checked_date %}The BOM for <i>{{ part }}</i> was last checked by {{ checker }} on {{ check_date }}{% endblocktrans %}
 </div>
 {% else %}
 <div class='alert alert-danger alert-block'>
-    <b>The BOM for <i>{{ part.full_name }}</i> has not been validated.</b>
+    <b>{% blocktrans with part=part.full_name %}The BOM for <i>{{ part }}</i> has not been validated.{% endblocktrans %}</b>
 </div>
 {% endif %}
 
diff --git a/InvenTree/part/templates/part/bom_upload/upload_file.html b/InvenTree/part/templates/part/bom_upload/upload_file.html
index 05486ab0ac..148d32f5da 100644
--- a/InvenTree/part/templates/part/bom_upload/upload_file.html
+++ b/InvenTree/part/templates/part/bom_upload/upload_file.html
@@ -24,7 +24,7 @@
 </div>
 
 <form method="post" action='' class='js-modal-form' enctype="multipart/form-data">
-    <button type="submit" class="save btn btn-default">Upload File</button>
+    <button type="submit" class="save btn btn-default">{% trans 'Upload File' %}</button>
     {% csrf_token %}
     {% load crispy_forms_tags %}
 
diff --git a/InvenTree/part/templates/part/bom_validate.html b/InvenTree/part/templates/part/bom_validate.html
index 763d946bf2..6b3aff6eac 100644
--- a/InvenTree/part/templates/part/bom_validate.html
+++ b/InvenTree/part/templates/part/bom_validate.html
@@ -1,10 +1,12 @@
 {% extends "modal_form.html" %}
 
+{% load i18n %}
+
 {% block pre_form_content %}
-Confirm that the Bill of Materials (BOM) is valid for:<br><i>{{ part.full_name }}</i>
+{% blocktrans with part.full_name as part %}Confirm that the Bill of Materials (BOM) is valid for:<br><i>{{ part }}</i>{% endblocktrans %}
 
 <div class='alert alert-warning alert-block'>
-    This will validate each line in the BOM.
+    {% trans 'This will validate each line in the BOM.' %}
 </div>
 
 {% endblock %}
\ No newline at end of file
diff --git a/InvenTree/part/views.py b/InvenTree/part/views.py
index 0208636a48..4efff3e9e3 100644
--- a/InvenTree/part/views.py
+++ b/InvenTree/part/views.py
@@ -342,7 +342,7 @@ class PartSetCategory(AjaxUpdateView):
 
         data = {
             'form_valid': valid,
-            'success': _('Set category for {n} parts'.format(n=len(self.parts)))
+            'success': _('Set category for {n} parts').format(n=len(self.parts))
         }
 
         if valid:
diff --git a/InvenTree/report/migrations/0015_auto_20210403_1837.py b/InvenTree/report/migrations/0015_auto_20210403_1837.py
new file mode 100644
index 0000000000..0348db5b35
--- /dev/null
+++ b/InvenTree/report/migrations/0015_auto_20210403_1837.py
@@ -0,0 +1,35 @@
+# Generated by Django 3.0.7 on 2021-04-03 18:37
+
+import django.core.validators
+from django.db import migrations, models
+import report.models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('report', '0014_purchaseorderreport_salesorderreport'),
+    ]
+
+    operations = [
+        migrations.AlterField(
+            model_name='reportasset',
+            name='asset',
+            field=models.FileField(help_text='Report asset file', upload_to=report.models.rename_asset, verbose_name='Asset'),
+        ),
+        migrations.AlterField(
+            model_name='reportasset',
+            name='description',
+            field=models.CharField(help_text='Asset file description', max_length=250, verbose_name='Description'),
+        ),
+        migrations.AlterField(
+            model_name='reportsnippet',
+            name='description',
+            field=models.CharField(help_text='Snippet file description', max_length=250, verbose_name='Description'),
+        ),
+        migrations.AlterField(
+            model_name='reportsnippet',
+            name='snippet',
+            field=models.FileField(help_text='Report snippet file', upload_to=report.models.rename_snippet, validators=[django.core.validators.FileExtensionValidator(allowed_extensions=['html', 'htm'])], verbose_name='Snippet'),
+        ),
+    ]
diff --git a/InvenTree/report/models.py b/InvenTree/report/models.py
index a838396bf0..6f3891d6be 100644
--- a/InvenTree/report/models.py
+++ b/InvenTree/report/models.py
@@ -497,11 +497,12 @@ class ReportSnippet(models.Model):
 
     snippet = models.FileField(
         upload_to=rename_snippet,
+        verbose_name=_('Snippet'),
         help_text=_('Report snippet file'),
         validators=[FileExtensionValidator(allowed_extensions=['html', 'htm'])],
     )
 
-    description = models.CharField(max_length=250, help_text=_("Snippet file description"))
+    description = models.CharField(max_length=250, verbose_name=_('Description'), help_text=_("Snippet file description"))
 
 
 def rename_asset(instance, filename):
@@ -536,7 +537,8 @@ class ReportAsset(models.Model):
 
     asset = models.FileField(
         upload_to=rename_asset,
+        verbose_name=_('Asset'),
         help_text=_("Report asset file"),
     )
 
-    description = models.CharField(max_length=250, help_text=_("Asset file description"))
+    description = models.CharField(max_length=250, verbose_name=_('Description'), help_text=_("Asset file description"))
diff --git a/InvenTree/stock/api.py b/InvenTree/stock/api.py
index a7a7955c22..1c04ae7d65 100644
--- a/InvenTree/stock/api.py
+++ b/InvenTree/stock/api.py
@@ -195,7 +195,7 @@ class StockCount(StockAdjust):
             if item['item'].stocktake(item['quantity'], request.user, notes=self.notes):
                 n += 1
 
-        return Response({'success': 'Updated stock for {n} items'.format(n=n)})
+        return Response({'success': _('Updated stock for {n} items').format(n=n)})
 
 
 class StockAdd(StockAdjust):
@@ -264,7 +264,7 @@ class StockTransfer(StockAdjust):
             if item['item'].move(location, self.notes, request.user, quantity=item['quantity']):
                 n += 1
 
-        return Response({'success': 'Moved {n} parts to {loc}'.format(
+        return Response({'success': _('Moved {n} parts to {loc}').format(
             n=n,
             loc=str(location),
         )})
diff --git a/InvenTree/stock/forms.py b/InvenTree/stock/forms.py
index 3560f205cc..c784b08a69 100644
--- a/InvenTree/stock/forms.py
+++ b/InvenTree/stock/forms.py
@@ -111,7 +111,8 @@ class CreateStockItemForm(HelperForm):
     """ Form for creating a new StockItem """
 
     expiry_date = DatePickerFormField(
-        help_text=('Expiration date for this stock item'),
+        label=_('Expiry Date'),
+        help_text=_('Expiration date for this stock item'),
     )
 
     serial_numbers = forms.CharField(label=_('Serial Numbers'), required=False, help_text=_('Enter unique serial numbers (or leave blank)'))
@@ -165,13 +166,13 @@ class CreateStockItemForm(HelperForm):
 class SerializeStockForm(HelperForm):
     """ Form for serializing a StockItem. """
 
-    destination = TreeNodeChoiceField(queryset=StockLocation.objects.all(), label='Destination', required=True, help_text='Destination for serialized stock (by default, will remain in current location)')
+    destination = TreeNodeChoiceField(queryset=StockLocation.objects.all(), label=_('Destination'), required=True, help_text=_('Destination for serialized stock (by default, will remain in current location)'))
     
-    serial_numbers = forms.CharField(label='Serial numbers', required=True, help_text='Unique serial numbers (must match quantity)')
+    serial_numbers = forms.CharField(label=_('Serial numbers'), required=True, help_text=_('Unique serial numbers (must match quantity)'))
     
-    note = forms.CharField(label='Notes', required=False, help_text='Add transaction note (optional)')
+    note = forms.CharField(label=_('Notes'), required=False, help_text=_('Add transaction note (optional)'))
 
-    quantity = RoundingDecimalFormField(max_digits=10, decimal_places=5)
+    quantity = RoundingDecimalFormField(max_digits=10, decimal_places=5, label=_('Quantity'))
 
     def __init__(self, *args, **kwargs):
 
@@ -263,7 +264,7 @@ class ExportOptionsForm(HelperForm):
 
     file_format = forms.ChoiceField(label=_('File Format'), help_text=_('Select output file format'))
 
-    include_sublocations = forms.BooleanField(required=False, initial=True, help_text=_("Include stock items in sub locations"))
+    include_sublocations = forms.BooleanField(required=False, initial=True, label=_('Include sublocations'), help_text=_("Include stock items in sub locations"))
 
     class Meta:
         model = StockLocation
@@ -402,7 +403,8 @@ class EditStockItemForm(HelperForm):
     """
 
     expiry_date = DatePickerFormField(
-        help_text=('Expiration date for this stock item'),
+        label=_('Expiry Date'),
+        help_text=_('Expiration date for this stock item'),
     )
 
     class Meta:
diff --git a/InvenTree/stock/migrations/0059_auto_20210403_1210.py b/InvenTree/stock/migrations/0059_auto_20210404_2016.py
similarity index 69%
rename from InvenTree/stock/migrations/0059_auto_20210403_1210.py
rename to InvenTree/stock/migrations/0059_auto_20210404_2016.py
index ae11eb7536..b027a53854 100644
--- a/InvenTree/stock/migrations/0059_auto_20210403_1210.py
+++ b/InvenTree/stock/migrations/0059_auto_20210404_2016.py
@@ -1,9 +1,10 @@
-# Generated by Django 3.0.7 on 2021-04-03 12:10
+# Generated by Django 3.0.7 on 2021-04-04 20:16
 
 import InvenTree.fields
 import InvenTree.models
 import InvenTree.validators
 from django.conf import settings
+import django.core.validators
 from django.db import migrations, models
 import django.db.models.deletion
 import mptt.fields
@@ -12,11 +13,22 @@ import mptt.fields
 class Migration(migrations.Migration):
 
     dependencies = [
+        ('users', '0005_owner_model'),
         migrations.swappable_dependency(settings.AUTH_USER_MODEL),
         ('stock', '0058_stockitem_packaging'),
     ]
 
     operations = [
+        migrations.AlterField(
+            model_name='stockitem',
+            name='delete_on_deplete',
+            field=models.BooleanField(default=True, help_text='Delete this Stock Item when stock is depleted', verbose_name='Delete on deplete'),
+        ),
+        migrations.AlterField(
+            model_name='stockitem',
+            name='owner',
+            field=models.ForeignKey(blank=True, help_text='Select Owner', null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='stock_items', to='users.Owner', verbose_name='Owner'),
+        ),
         migrations.AlterField(
             model_name='stockitemattachment',
             name='attachment',
@@ -47,6 +59,11 @@ class Migration(migrations.Migration):
             name='notes',
             field=models.CharField(blank=True, help_text='Entry notes', max_length=512, verbose_name='Notes'),
         ),
+        migrations.AlterField(
+            model_name='stockitemtracking',
+            name='quantity',
+            field=models.DecimalField(decimal_places=5, default=1, max_digits=15, validators=[django.core.validators.MinValueValidator(0)], verbose_name='Quantity'),
+        ),
         migrations.AlterField(
             model_name='stockitemtracking',
             name='title',
@@ -62,6 +79,11 @@ class Migration(migrations.Migration):
             name='name',
             field=models.CharField(help_text='Name', max_length=100, validators=[InvenTree.validators.validate_tree_name], verbose_name='Name'),
         ),
+        migrations.AlterField(
+            model_name='stocklocation',
+            name='owner',
+            field=models.ForeignKey(blank=True, help_text='Select Owner', null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='stock_locations', to='users.Owner', verbose_name='Owner'),
+        ),
         migrations.AlterField(
             model_name='stocklocation',
             name='parent',
diff --git a/InvenTree/stock/models.py b/InvenTree/stock/models.py
index df767a3a70..b57f96d0f7 100644
--- a/InvenTree/stock/models.py
+++ b/InvenTree/stock/models.py
@@ -51,7 +51,8 @@ class StockLocation(InvenTreeTree):
     """
 
     owner = models.ForeignKey(Owner, on_delete=models.SET_NULL, blank=True, null=True,
-                              help_text='Select Owner',
+                              verbose_name=_('Owner'),
+                              help_text=_('Select Owner'),
                               related_name='stock_locations')
 
     def get_absolute_url(self):
@@ -483,7 +484,7 @@ class StockItem(MPTTModel):
 
     review_needed = models.BooleanField(default=False)
 
-    delete_on_deplete = models.BooleanField(default=True, help_text=_('Delete this Stock Item when stock is depleted'))
+    delete_on_deplete = models.BooleanField(default=True, verbose_name=_('Delete on deplete'), help_text=_('Delete this Stock Item when stock is depleted'))
 
     status = models.PositiveIntegerField(
         default=StockStatus.OK,
@@ -507,7 +508,8 @@ class StockItem(MPTTModel):
     )
 
     owner = models.ForeignKey(Owner, on_delete=models.SET_NULL, blank=True, null=True,
-                              help_text='Select Owner',
+                              verbose_name=_('Owner'),
+                              help_text=_('Select Owner'),
                               related_name='stock_items')
 
     def is_stale(self):
@@ -948,7 +950,7 @@ class StockItem(MPTTModel):
             raise ValidationError({"quantity": _("Quantity must be greater than zero")})
 
         if quantity > self.quantity:
-            raise ValidationError({"quantity": _("Quantity must not exceed available stock quantity ({n})".format(n=self.quantity))})
+            raise ValidationError({"quantity": _("Quantity must not exceed available stock quantity ({n})").format(n=self.quantity)})
 
         if not type(serials) in [list, tuple]:
             raise ValidationError({"serial_numbers": _("Serial numbers must be a list of integers")})
@@ -989,7 +991,7 @@ class StockItem(MPTTModel):
             new_item.addTransactionNote(_('Add serial number'), user, notes=notes)
 
         # Remove the equivalent number of items
-        self.take_stock(quantity, user, notes=_('Serialized {n} items'.format(n=quantity)))
+        self.take_stock(quantity, user, notes=_('Serialized {n} items').format(n=quantity))
 
     @transaction.atomic
     def copyHistoryFrom(self, other):
@@ -1558,7 +1560,7 @@ class StockItemTracking(models.Model):
 
     system = models.BooleanField(default=False)
 
-    quantity = models.DecimalField(max_digits=15, decimal_places=5, validators=[MinValueValidator(0)], default=1)
+    quantity = models.DecimalField(max_digits=15, decimal_places=5, validators=[MinValueValidator(0)], default=1, verbose_name=_('Quantity'))
 
     # TODO
     # image = models.ImageField(upload_to=func, max_length=255, null=True, blank=True)
diff --git a/InvenTree/stock/views.py b/InvenTree/stock/views.py
index eeee13ad3a..72395a54d0 100644
--- a/InvenTree/stock/views.py
+++ b/InvenTree/stock/views.py
@@ -965,7 +965,7 @@ class StockAdjust(AjaxView, FormMixin):
 
         context['stock_action'] = self.stock_action.strip().lower()
 
-        context['stock_action_title'] = self.stock_action.capitalize()
+        context['stock_action_title'] = self.stock_action_title
 
         # Quantity column will be read-only in some circumstances
         context['edit_quantity'] = not self.stock_action == 'delete'
@@ -993,17 +993,18 @@ class StockAdjust(AjaxView, FormMixin):
         if self.stock_action not in ['move', 'count', 'take', 'add', 'delete']:
             self.stock_action = 'count'
 
-        # Choose the form title based on the action
+        # Choose form title and action column based on the action
         titles = {
-            'move': _('Move Stock Items'),
-            'count': _('Count Stock Items'),
-            'take': _('Remove From Stock'),
-            'add': _('Add Stock Items'),
-            'delete': _('Delete Stock Items')
+            'move': [_('Move Stock Items'), _('Move')],
+            'count': [_('Count Stock Items'), _('Count')],
+            'take': [_('Remove From Stock'), _('Take')],
+            'add': [_('Add Stock Items'), _('Add')],
+            'delete': [_('Delete Stock Items'), _('Delete')],
         }
 
-        self.ajax_form_title = titles[self.stock_action]
-        
+        self.ajax_form_title = titles[self.stock_action][0]
+        self.stock_action_title = titles[self.stock_action][1]
+
         # Save list of items!
         self.stock_items = self.get_GET_items()
 
@@ -1039,7 +1040,7 @@ class StockAdjust(AjaxView, FormMixin):
             if self.stock_action in ['move', 'take']:
 
                 if item.new_quantity > item.quantity:
-                    item.error = _('Quantity must not exceed {x}'.format(x=item.quantity))
+                    item.error = _('Quantity must not exceed {x}').format(x=item.quantity)
                     valid = False
                     continue
 
@@ -1118,7 +1119,7 @@ class StockAdjust(AjaxView, FormMixin):
 
             count += 1
 
-        return f"{_('Added stock to ')} {count} {_('items')}"
+        return _('Added stock to {n} items').format(n=count)
 
     def do_take(self):
 
@@ -1133,7 +1134,7 @@ class StockAdjust(AjaxView, FormMixin):
 
             count += 1
 
-        return f"{_('Removed stock from ')} {count} {_('items')}"
+        return _('Removed stock from {n} items').format(n=count)
 
     def do_count(self):
         
@@ -1189,9 +1190,9 @@ class StockAdjust(AjaxView, FormMixin):
             return _('No items were moved')
         
         else:
-            return _('Moved {n} items to {dest}'.format(
+            return _('Moved {n} items to {dest}').format(
                 n=count,
-                dest=destination.pathstring))
+                dest=destination.pathstring)
 
     def do_delete(self):
         """ Delete multiple stock items """
@@ -1208,7 +1209,7 @@ class StockAdjust(AjaxView, FormMixin):
 
             count += 1
 
-        return _("Deleted {n} stock items".format(n=count))
+        return _("Deleted {n} stock items").format(n=count)
 
 
 class StockItemEdit(AjaxUpdateView):

From efd14fca6498ef9c27a9c767c944dd4a0877d216 Mon Sep 17 00:00:00 2001
From: Matthias <matmair@live.de>
Date: Sun, 4 Apr 2021 22:47:01 +0200
Subject: [PATCH 10/16] made translation lazy

---
 InvenTree/InvenTree/fields.py       | 2 +-
 InvenTree/InvenTree/helpers.py      | 2 +-
 InvenTree/InvenTree/status.py       | 2 +-
 InvenTree/InvenTree/status_codes.py | 2 +-
 InvenTree/barcodes/api.py           | 2 +-
 InvenTree/common/views.py           | 2 +-
 InvenTree/company/views.py          | 2 +-
 InvenTree/label/api.py              | 2 +-
 InvenTree/order/views.py            | 2 +-
 InvenTree/report/api.py             | 2 +-
 InvenTree/stock/api.py              | 1 +
 11 files changed, 11 insertions(+), 10 deletions(-)

diff --git a/InvenTree/InvenTree/fields.py b/InvenTree/InvenTree/fields.py
index c0e1633ac7..d3f60b87df 100644
--- a/InvenTree/InvenTree/fields.py
+++ b/InvenTree/InvenTree/fields.py
@@ -5,7 +5,7 @@ from __future__ import unicode_literals
 
 from .validators import allowable_url_schemes
 
-from django.utils.translation import ugettext as _
+from django.utils.translation import ugettext_lazy as _
 
 from django.forms.fields import URLField as FormURLField
 from django.db import models as models
diff --git a/InvenTree/InvenTree/helpers.py b/InvenTree/InvenTree/helpers.py
index 930204c58c..c2441590f5 100644
--- a/InvenTree/InvenTree/helpers.py
+++ b/InvenTree/InvenTree/helpers.py
@@ -13,7 +13,7 @@ from decimal import Decimal
 from wsgiref.util import FileWrapper
 from django.http import StreamingHttpResponse
 from django.core.exceptions import ValidationError, FieldError
-from django.utils.translation import ugettext as _
+from django.utils.translation import ugettext_lazy as _
 
 from django.contrib.auth.models import Permission
 
diff --git a/InvenTree/InvenTree/status.py b/InvenTree/InvenTree/status.py
index ec2422a254..646ebb8131 100644
--- a/InvenTree/InvenTree/status.py
+++ b/InvenTree/InvenTree/status.py
@@ -2,7 +2,7 @@
 Provides system status functionality checks.
 """
 
-from django.utils.translation import ugettext as _
+from django.utils.translation import ugettext_lazy as _
 
 import logging
 
diff --git a/InvenTree/InvenTree/status_codes.py b/InvenTree/InvenTree/status_codes.py
index 916b3341cb..5eb97504c6 100644
--- a/InvenTree/InvenTree/status_codes.py
+++ b/InvenTree/InvenTree/status_codes.py
@@ -1,4 +1,4 @@
-from django.utils.translation import ugettext as _
+from django.utils.translation import ugettext_lazy as _
 
 
 class StatusCode:
diff --git a/InvenTree/barcodes/api.py b/InvenTree/barcodes/api.py
index d727f5a778..e6b3ea84e3 100644
--- a/InvenTree/barcodes/api.py
+++ b/InvenTree/barcodes/api.py
@@ -2,7 +2,7 @@
 
 from django.urls import reverse
 from django.conf.urls import url
-from django.utils.translation import ugettext as _
+from django.utils.translation import ugettext_lazy as _
 
 from rest_framework.exceptions import ValidationError
 from rest_framework import permissions
diff --git a/InvenTree/common/views.py b/InvenTree/common/views.py
index 1f3c827532..31d11e30cc 100644
--- a/InvenTree/common/views.py
+++ b/InvenTree/common/views.py
@@ -5,7 +5,7 @@ Django views for interacting with common models
 # -*- coding: utf-8 -*-
 from __future__ import unicode_literals
 
-from django.utils.translation import ugettext as _
+from django.utils.translation import ugettext_lazy as _
 from django.forms import CheckboxInput, Select
 
 from InvenTree.views import AjaxUpdateView
diff --git a/InvenTree/company/views.py b/InvenTree/company/views.py
index 42457d6101..bb16ea4bb6 100644
--- a/InvenTree/company/views.py
+++ b/InvenTree/company/views.py
@@ -6,7 +6,7 @@ Django views for interacting with Company app
 # -*- coding: utf-8 -*-
 from __future__ import unicode_literals
 
-from django.utils.translation import ugettext as _
+from django.utils.translation import ugettext_lazy as _
 from django.views.generic import DetailView, ListView, UpdateView
 
 from django.urls import reverse
diff --git a/InvenTree/label/api.py b/InvenTree/label/api.py
index e303f493c6..0d0d71b50d 100644
--- a/InvenTree/label/api.py
+++ b/InvenTree/label/api.py
@@ -1,7 +1,7 @@
 # -*- coding: utf-8 -*-
 from __future__ import unicode_literals
 
-from django.utils.translation import ugettext as _
+from django.utils.translation import ugettext_lazy as _
 from django.conf.urls import url, include
 from django.core.exceptions import ValidationError, FieldError
 from django.http import HttpResponse
diff --git a/InvenTree/order/views.py b/InvenTree/order/views.py
index bdf0407603..f8ac3a9e19 100644
--- a/InvenTree/order/views.py
+++ b/InvenTree/order/views.py
@@ -9,7 +9,7 @@ from django.db import transaction
 from django.shortcuts import get_object_or_404
 from django.core.exceptions import ValidationError
 from django.urls import reverse
-from django.utils.translation import ugettext as _
+from django.utils.translation import ugettext_lazy as _
 from django.views.generic import DetailView, ListView, UpdateView
 from django.views.generic.edit import FormMixin
 from django.forms import HiddenInput
diff --git a/InvenTree/report/api.py b/InvenTree/report/api.py
index 212c57bd7f..0925cc5249 100644
--- a/InvenTree/report/api.py
+++ b/InvenTree/report/api.py
@@ -1,7 +1,7 @@
 # -*- coding: utf-8 -*-
 from __future__ import unicode_literals
 
-from django.utils.translation import ugettext as _
+from django.utils.translation import ugettext_lazy as _
 from django.conf.urls import url, include
 from django.core.exceptions import ValidationError, FieldError
 from django.http import HttpResponse
diff --git a/InvenTree/stock/api.py b/InvenTree/stock/api.py
index 1c04ae7d65..7bad9df83e 100644
--- a/InvenTree/stock/api.py
+++ b/InvenTree/stock/api.py
@@ -11,6 +11,7 @@ from django.conf.urls import url, include
 from django.urls import reverse
 from django.http import JsonResponse
 from django.db.models import Q
+from django.utils.translation import ugettext_lazy as _
 
 from .models import StockLocation, StockItem
 from .models import StockItemTracking

From adcb211572355727974a8292157109ca0d96cac2 Mon Sep 17 00:00:00 2001
From: Matthias <matmair@live.de>
Date: Sun, 4 Apr 2021 22:48:36 +0200
Subject: [PATCH 11/16] set language in the used js scripts

---
 InvenTree/build/templates/build/index.html           | 1 +
 InvenTree/order/templates/order/purchase_orders.html | 1 +
 InvenTree/order/templates/order/sales_orders.html    | 1 +
 InvenTree/templates/base.html                        | 2 ++
 4 files changed, 5 insertions(+)

diff --git a/InvenTree/build/templates/build/index.html b/InvenTree/build/templates/build/index.html
index 75dc497b4b..f710928ee7 100644
--- a/InvenTree/build/templates/build/index.html
+++ b/InvenTree/build/templates/build/index.html
@@ -130,6 +130,7 @@ InvenTree | {% trans "Build Orders" %}
             initialView: 'dayGridMonth',
             nowIndicator: true,
             aspectRatio: 2.5,
+            locale: '{{request.LANGUAGE_CODE}}',
             datesSet: function() {
                 loadOrderEvents(calendar);
             }
diff --git a/InvenTree/order/templates/order/purchase_orders.html b/InvenTree/order/templates/order/purchase_orders.html
index 6667cbd437..7256a1c499 100644
--- a/InvenTree/order/templates/order/purchase_orders.html
+++ b/InvenTree/order/templates/order/purchase_orders.html
@@ -116,6 +116,7 @@ InvenTree | {% trans "Purchase Orders" %}
             initialView: 'dayGridMonth',
             nowIndicator: true,
             aspectRatio: 2.5,
+            locale: '{{request.LANGUAGE_CODE}}',
             datesSet: function() {
                 loadOrderEvents(calendar);
             }
diff --git a/InvenTree/order/templates/order/sales_orders.html b/InvenTree/order/templates/order/sales_orders.html
index 6d4be9fff6..bcaf6a019c 100644
--- a/InvenTree/order/templates/order/sales_orders.html
+++ b/InvenTree/order/templates/order/sales_orders.html
@@ -115,6 +115,7 @@ InvenTree | {% trans "Sales Orders" %}
             initialView: 'dayGridMonth',
             nowIndicator: true,
             aspectRatio: 2.5,
+            locale: '{{request.LANGUAGE_CODE}}',
             datesSet: function() {
                 loadOrderEvents(calendar);
             },
diff --git a/InvenTree/templates/base.html b/InvenTree/templates/base.html
index aa571ef19a..140971a8ce 100644
--- a/InvenTree/templates/base.html
+++ b/InvenTree/templates/base.html
@@ -134,6 +134,7 @@ InvenTree
 <script type='text/javascript' src='{% static "bootstrap-table/extensions/treegrid/bootstrap-table-treegrid.js" %}'></script>
 
 <script type="text/javascript" src="{% static 'fullcalendar/main.js' %}"></script>
+<script type="text/javascript" src="{% static 'fullcalendar/locales-all.js' %}"></script>
 <script type="text/javascript" src="{% static 'script/select2/select2.js' %}"></script>
 <script type='text/javascript' src="{% static 'script/moment.js' %}"></script>
 
@@ -180,6 +181,7 @@ $(document).ready(function () {
     });
     {% endif %}
 
+    moment.locale('{{request.LANGUAGE_CODE}}');
 });
 
 </script>

From ef64d1e61d605dfa4e28222db1032d6bbfe3aca1 Mon Sep 17 00:00:00 2001
From: Matthias <matmair@live.de>
Date: Sun, 4 Apr 2021 22:49:17 +0200
Subject: [PATCH 12/16] added label to DatePickerFormField

---
 InvenTree/InvenTree/fields.py | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/InvenTree/InvenTree/fields.py b/InvenTree/InvenTree/fields.py
index d3f60b87df..155f77c639 100644
--- a/InvenTree/InvenTree/fields.py
+++ b/InvenTree/InvenTree/fields.py
@@ -42,6 +42,7 @@ class DatePickerFormField(forms.DateField):
     def __init__(self, **kwargs):
 
         help_text = kwargs.get('help_text', _('Enter date'))
+        label = kwargs.get('label', None)
         required = kwargs.get('required', False)
         initial = kwargs.get('initial', None)
 
@@ -56,7 +57,8 @@ class DatePickerFormField(forms.DateField):
             required=required,
             initial=initial,
             help_text=help_text,
-            widget=widget
+            widget=widget,
+            label=label
         )
 
 

From 2c053eae4c69695eb598ac12a94921daf8bb8c3f Mon Sep 17 00:00:00 2001
From: Matthias <matmair@live.de>
Date: Sun, 4 Apr 2021 22:49:47 +0200
Subject: [PATCH 13/16] added translations

---
 InvenTree/order/views.py | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/InvenTree/order/views.py b/InvenTree/order/views.py
index f8ac3a9e19..7dc8b4efff 100644
--- a/InvenTree/order/views.py
+++ b/InvenTree/order/views.py
@@ -1057,7 +1057,7 @@ class OrderParts(AjaxView):
 
         data = {
             'form_valid': valid,
-            'success': 'Ordered {n} parts'.format(n=len(self.parts))
+            'success': _('Ordered {n} parts').format(n=len(self.parts))
         }
 
         return self.renderJsonResponse(self.request, data=data)
@@ -1348,7 +1348,7 @@ class SalesOrderAssignSerials(AjaxView, FormMixin):
             'form_valid': valid,
             'form_errors': self.form.errors.as_json(),
             'non_field_errors': self.form.non_field_errors().as_json(),
-            'success': _("Allocated") + f" {len(self.stock_items)} " + _("items")
+            'success': _("Allocated {n} items").format(n=len(self.stock_items))
         }
 
         return self.renderJsonResponse(request, self.form, data)

From 530b90042a72c4fa9007e5efe995ac0e5d1e23d8 Mon Sep 17 00:00:00 2001
From: Matthias <matmair@live.de>
Date: Sun, 4 Apr 2021 22:51:16 +0200
Subject: [PATCH 14/16] added german(de) translations

---
 InvenTree/locale/de/LC_MESSAGES/django.po | 376 ++++++++++------------
 1 file changed, 169 insertions(+), 207 deletions(-)

diff --git a/InvenTree/locale/de/LC_MESSAGES/django.po b/InvenTree/locale/de/LC_MESSAGES/django.po
index fef729ffa5..41a8cc7ab5 100644
--- a/InvenTree/locale/de/LC_MESSAGES/django.po
+++ b/InvenTree/locale/de/LC_MESSAGES/django.po
@@ -6,7 +6,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-04-04 20:22+0000\n"
+"POT-Creation-Date: 2021-04-04 20:24+0000\n"
 "PO-Revision-Date: 2021-03-28 17:47+0200\n"
 "Last-Translator: Andreas Kaiser <kaiser.vocote@gmail.com>, Matthias "
 "MAIR<matmair@live.de>\n"
@@ -42,10 +42,8 @@ msgid "Confirm"
 msgstr "Bestätigen"
 
 #: InvenTree/forms.py:126
-#, fuzzy
-#| msgid "Confirm item deletion"
 msgid "Confirm delete"
-msgstr "Löschung von Position bestätigen"
+msgstr "Löschung bestätigen"
 
 #: InvenTree/forms.py:127
 msgid "Confirm item deletion"
@@ -60,10 +58,8 @@ msgid "Enter new password"
 msgstr "Neues Passwort eingeben"
 
 #: InvenTree/forms.py:167
-#, fuzzy
-#| msgid "Confirm new password"
 msgid "Confirm password"
-msgstr "Neues Passwort bestätigen"
+msgstr "Passwort wiederholen"
 
 #: InvenTree/forms.py:168
 msgid "Confirm new password"
@@ -268,10 +264,9 @@ msgid "Invalid character in part name"
 msgstr "Ungültiger Buchstabe im Teilenamen"
 
 #: InvenTree/validators.py:63
-#, fuzzy, python-brace-format
-#| msgid "IPN must match regex pattern"
+#, python-brace-format
 msgid "IPN must match regex pattern {pat}"
-msgstr "IPN muss zu Regex-Muster passen"
+msgstr "IPN muss zu Regex-Muster  {pat} passen"
 
 #: InvenTree/validators.py:77 InvenTree/validators.py:91
 #: InvenTree/validators.py:105
@@ -421,7 +416,7 @@ msgstr "Anzahl der zu bauenden Teile"
 
 #: build/forms.py:88
 msgid "Enter quantity for build output"
-msgstr "Menge für den Bau-Ausgabe angeben"
+msgstr "Menge der Endprodukte angeben"
 
 #: build/forms.py:92 order/forms.py:233 stock/forms.py:118
 msgid "Serial Numbers"
@@ -429,11 +424,11 @@ msgstr "Seriennummer"
 
 #: build/forms.py:94
 msgid "Enter serial numbers for build outputs"
-msgstr "Seriennummer für dieses hergestelltes Teil eingeben"
+msgstr "Seriennummer für dieses Endprodukt eingeben"
 
 #: build/forms.py:100
 msgid "Confirm creation of build output"
-msgstr "Anlage Baufertigstellung bestätigen"
+msgstr "Anlage von Endprodukt(en) bestätigen"
 
 #: build/forms.py:121
 msgid "Confirm deletion of build output"
@@ -449,7 +444,7 @@ msgstr "Bestandszuordnung bestätigen"
 
 #: build/forms.py:189
 msgid "Mark build as complete"
-msgstr "Bau als vollständig markieren"
+msgstr "Bauauftrag als vollständig markieren"
 
 #: build/forms.py:213 build/templates/build/auto_allocate.html:18
 #: order/forms.py:82 stock/forms.py:347
@@ -463,13 +458,11 @@ msgstr "Lagerort"
 
 #: build/forms.py:214
 msgid "Location of completed parts"
-msgstr "Lagerort der fertigen Teile"
+msgstr "Lagerort der Endprodukte"
 
 #: build/forms.py:219
-#, fuzzy
-#| msgid "Confirm build completion"
 msgid "Confirm incomplete"
-msgstr "Bau-Fertigstellung bestätigen"
+msgstr "Bauauftrag nicht fertiggestellt"
 
 #: build/forms.py:220
 msgid "Confirm completion with incomplete stock allocation"
@@ -477,13 +470,11 @@ msgstr "Fertigstellung mit nicht kompletter Bestandszuordnung bestätigen"
 
 #: build/forms.py:223
 msgid "Confirm build completion"
-msgstr "Bau-Fertigstellung bestätigen"
+msgstr "Bauauftrag-Fertigstellung bestätigen"
 
 #: build/forms.py:243
-#, fuzzy
-#| msgid "Confirm build cancellation"
 msgid "Confirm cancel"
-msgstr "Bauabbruch bestätigen"
+msgstr "Abbruch bestätigen"
 
 #: build/forms.py:243 build/views.py:66
 msgid "Confirm build cancellation"
@@ -491,7 +482,7 @@ msgstr "Bauabbruch bestätigen"
 
 #: build/forms.py:257
 msgid "Select quantity of stock to allocate"
-msgstr "Menge der BestandsObjekt für Zuordnung auswählen"
+msgstr "Menge der BestandsObjekte für Zuordnung auswählen"
 
 #: build/models.py:65 build/templates/build/build_base.html:8
 #: build/templates/build/build_base.html:35
@@ -534,7 +525,7 @@ msgstr "Eltern-Bauauftrag"
 
 #: build/models.py:147
 msgid "BuildOrder to which this build is allocated"
-msgstr "Bauauftrag, zu dem dieser Bau zugwiesen ist"
+msgstr "Bauauftrag, zu dem dieser Bauauftrag zugwiesen ist"
 
 #: build/models.py:152 build/templates/build/auto_allocate.html:16
 #: build/templates/build/build_base.html:86
@@ -564,7 +555,7 @@ msgstr "Teil"
 
 #: build/models.py:160
 msgid "Select part to build"
-msgstr "Teil für den Bau wählen"
+msgstr "Teil für den Bauauftrag wählen"
 
 #: build/models.py:165
 msgid "Sales Order Reference"
@@ -572,7 +563,7 @@ msgstr "Auftrag Referenz"
 
 #: build/models.py:169
 msgid "SalesOrder to which this build is allocated"
-msgstr "Bestellung, die diesem Bau zugewiesen ist"
+msgstr "Bestellung, die diesem Bauauftrag zugewiesen ist"
 
 #: build/models.py:174
 msgid "Source Location"
@@ -583,7 +574,7 @@ msgid ""
 "Select location to take stock from for this build (leave blank to take from "
 "any stock location)"
 msgstr ""
-"Entnahme-Lagerort für diesen Bau wählen (oder leer lassen für einen "
+"Entnahme-Lagerort für diesen Bauauftrag wählen (oder leer lassen für einen "
 "beliebigen Lagerort)"
 
 #: build/models.py:183
@@ -592,7 +583,7 @@ msgstr "Ziel-Lagerort"
 
 #: build/models.py:187
 msgid "Select location where the completed items will be stored"
-msgstr "Lagerort wo fertige Objekte gelagert werden auswählen"
+msgstr "Lagerort an dem fertige Objekte gelagert werden auswählen"
 
 #: build/models.py:191
 msgid "Build Quantity"
@@ -756,7 +747,7 @@ msgstr "Bauauftrag"
 
 #: build/models.py:1083
 msgid "Build to allocate parts"
-msgstr "Bau starten um Teile zuzuweisen"
+msgstr "Bauauftrag starten um Teile zuzuweisen"
 
 #: build/models.py:1090 part/templates/part/allocation.html:18
 #: part/templates/part/allocation.html:24
@@ -776,13 +767,11 @@ msgstr "Quell-BestandsObjekt"
 
 #: build/models.py:1104
 msgid "Stock quantity to allocate to build"
-msgstr "BestandsObjekt-Anzahl dem Bau zuweisen"
+msgstr "BestandsObjekt-Anzahl dem Bauauftrag zuweisen"
 
 #: build/models.py:1112
-#, fuzzy
-#| msgid "Install item"
 msgid "Install into"
-msgstr "Installiere Objekt"
+msgstr "Installiere in"
 
 #: build/models.py:1113
 msgid "Destination stock item"
@@ -790,7 +779,7 @@ msgstr "Ziel-BestandsObjekt"
 
 #: build/templates/build/allocate.html:15
 msgid "Incomplete Build Ouputs"
-msgstr "unfertige Endpordukte"
+msgstr "unfertige Endprodukte"
 
 #: build/templates/build/allocate.html:21
 msgid "Build order has been completed"
@@ -806,7 +795,7 @@ msgstr "Neues Endprodukt anlegen"
 
 #: build/templates/build/allocate.html:30
 msgid "Order required parts"
-msgstr "benötigte Teile bestellen"
+msgstr "Benötigte Teile bestellen"
 
 #: build/templates/build/allocate.html:31
 #: company/templates/company/detail_part.html:31 order/views.py:794
@@ -856,12 +845,12 @@ msgstr ""
 #: build/templates/build/auto_allocate.html:37
 msgid "No stock items found that can be automatically allocated to this build"
 msgstr ""
-"Keine BestandsObjekt gefunden, die diesem Endprodukt automatisch zugewiesen "
+"Keine BestandsObjekte gefunden, die diesem Endprodukt automatisch zugewiesen "
 "werden können"
 
 #: build/templates/build/auto_allocate.html:39
 msgid "Stock items will have to be manually allocated"
-msgstr "BestandsObjekte werden manuell zugewiesen werden müssen"
+msgstr "BestandsObjekte müssen manuell zugewiesen werden"
 
 #: build/templates/build/build_base.html:14
 msgid "This Build Order is allocated to Sales Order"
@@ -907,17 +896,17 @@ msgstr "Bau-Auftrag Aktionen"
 
 #: build/templates/build/build_base.html:66
 msgid "Edit Build"
-msgstr "Bau bearbeiten"
+msgstr "Bauauftrag bearbeiten"
 
 #: build/templates/build/build_base.html:68
 #: build/templates/build/build_base.html:176
 msgid "Complete Build"
-msgstr "Bau fertigstellen"
+msgstr "Bauauftrag fertigstellen"
 
 #: build/templates/build/build_base.html:69
 #: build/templates/build/build_base.html:167 build/views.py:57
 msgid "Cancel Build"
-msgstr "Bau abbrechen"
+msgstr "Bauauftrag abbrechen"
 
 #: build/templates/build/build_base.html:82
 #: build/templates/build/detail.html:11
@@ -990,7 +979,7 @@ msgstr "Nachverfolgbare Teile können Seriennummern haben"
 
 #: build/templates/build/build_output_create.html:16
 msgid "Enter serial numbers to generate multiple single build outputs"
-msgstr "Seriennummeren für mehrere einlene Endprodukte angeben"
+msgstr "Seriennummeren für mehrere einzelne Endprodukte angeben"
 
 #: build/templates/build/cancel.html:5
 msgid "Are you sure you wish to cancel this build?"
@@ -1108,13 +1097,13 @@ msgstr "Bauaufträge ausdrucken"
 #: order/templates/order/purchase_orders.html:27
 #: order/templates/order/sales_orders.html:27
 msgid "Display calendar view"
-msgstr "Kalendar Ansicht"
+msgstr "Kalender-Ansicht"
 
 #: build/templates/build/index.html:46
 #: order/templates/order/purchase_orders.html:30
 #: order/templates/order/sales_orders.html:30
 msgid "Display list view"
-msgstr "Listen Ansicht"
+msgstr "Listen-Ansicht"
 
 #: build/templates/build/navbar.html:12
 msgid "Build Order Details"
@@ -1130,7 +1119,7 @@ msgstr "Details"
 #: build/templates/build/navbar.html:20 build/templates/build/navbar.html:23
 #: build/templates/build/parts.html:11
 msgid "Required Parts"
-msgstr "benötigte Teile"
+msgstr "Benötigte Teile"
 
 #: build/templates/build/navbar.html:27 build/templates/build/navbar.html:30
 msgid "In Progress"
@@ -1166,8 +1155,8 @@ msgstr "Speichern"
 #: build/templates/build/unallocate.html:10
 msgid "Are you sure you wish to unallocate all stock for this build?"
 msgstr ""
-"Sind Sie sicher, dass sie alle BestandsObjekt von diesem Bau entfernen "
-"möchten?"
+"Sind Sie sicher, dass sie alle BestandsObjekt von diesem Bauauftrag "
+"entfernen möchten?"
 
 #: build/templates/build/unallocate.html:12
 msgid "All incomplete stock allocations will be removed from the build"
@@ -1176,7 +1165,7 @@ msgstr ""
 
 #: build/views.py:77
 msgid "Build was cancelled"
-msgstr "Bau wurde abgebrochen"
+msgstr "Bauauftrag wurde abgebrochen"
 
 #: build/views.py:91
 msgid "Allocate Stock"
@@ -1254,7 +1243,7 @@ msgstr "Endprodukt fertiggestellt"
 
 #: build/views.py:711
 msgid "Created new build"
-msgstr "Neuen Bau angelegt"
+msgstr "Neuen Bauauftrag angelegt"
 
 #: build/views.py:732
 msgid "Edit Build Order Details"
@@ -1262,7 +1251,7 @@ msgstr "Bauauftragdetails bearbeiten"
 
 #: build/views.py:765
 msgid "Edited build"
-msgstr "Bau bearbeitet"
+msgstr "Bauauftrag bearbeitet"
 
 #: build/views.py:774
 msgid "Delete Build Order"
@@ -1404,7 +1393,7 @@ msgstr "Teil-Stückliste kopieren"
 
 #: common/models.py:116
 msgid "Copy BOM data by default when duplicating a part"
-msgstr "Stückliste beim Duplizieren von Teil kopieren"
+msgstr "Stückliste von Teil kopieren wenn das Teil dupliziert wird "
 
 #: common/models.py:122
 msgid "Copy Part Parameter Data"
@@ -1523,7 +1512,7 @@ msgstr "Seitengröße"
 
 #: common/models.py:214
 msgid "Default page size for PDF reports"
-msgstr "Standardseitenformat für PDF Report"
+msgstr "Standardseitenformat für PDF-Bericht"
 
 #: common/models.py:224
 msgid "Test Reports"
@@ -1709,7 +1698,7 @@ msgstr "Einzelpreis"
 
 #: company/forms.py:101
 msgid "Single quantity price"
-msgstr "Einzelpreis"
+msgstr "Preis für eine Einheit"
 
 #: company/models.py:99
 msgid "Company description"
@@ -1772,10 +1761,8 @@ msgid "Link to external company information"
 msgstr "Link auf externe Firmeninformation"
 
 #: company/models.py:126 part/models.py:753
-#, fuzzy
-#| msgid "Image URL"
 msgid "Image"
-msgstr "Bild-URL"
+msgstr "Bild"
 
 #: company/models.py:131
 msgid "is customer"
@@ -1873,7 +1860,7 @@ msgstr "Notiz"
 
 #: company/models.py:371
 msgid "base cost"
-msgstr ""
+msgstr "Basiskosten"
 
 #: company/models.py:371
 msgid "Minimum charge (e.g. stocking fee)"
@@ -1894,10 +1881,8 @@ msgid "multiple"
 msgstr "Vielfache"
 
 #: company/models.py:375
-#, fuzzy
-#| msgid "multiple"
 msgid "Order multiple"
-msgstr "Vielfache"
+msgstr "Mehrere bestellen"
 
 #: company/templates/company/assigned_stock.html:10
 #: company/templates/company/navbar.html:51
@@ -1944,10 +1929,9 @@ msgid "Phone"
 msgstr "Telefon"
 
 #: company/templates/company/delete.html:7
-#, fuzzy, python-format
-#| msgid "Are you sure you want to delete category"
+#, python-format
 msgid "Are you sure you want to delete company '%(name)s'?"
-msgstr "Sind Sie sicher, dass Sie diese Kategorie löschen wollen"
+msgstr "Sind Sie sicher, dass Sie die Firma '%(name)s' löschen wollen?"
 
 #: company/templates/company/delete.html:12
 #, python-format
@@ -2352,10 +2336,8 @@ msgid "Label template is enabled"
 msgstr "Label-Vorlage ist aktiviert"
 
 #: label/models.py:129
-#, fuzzy
-#| msgid "Height [mm]"
 msgid "Width [mm]"
-msgstr "Höhe [mm]"
+msgstr "Breite [mm]"
 
 #: label/models.py:130
 msgid "Label width, specified in mm"
@@ -2466,10 +2448,8 @@ msgid "Supplier order reference code"
 msgstr "Zulieferer Bestellreferenz"
 
 #: order/models.py:201
-#, fuzzy
-#| msgid "Received"
 msgid "received by"
-msgstr "Empfangen"
+msgstr "Empfangen von"
 
 #: order/models.py:206
 msgid "Issue Date"
@@ -2514,8 +2494,6 @@ msgid "Company to which the items are being sold"
 msgstr "Firma an die die Teile verkauft werden"
 
 #: order/models.py:447
-#, fuzzy
-#| msgid "Customer Reference"
 msgid "Customer Reference "
 msgstr "Kundenreferenz"
 
@@ -2528,10 +2506,8 @@ msgid "Shipment Date"
 msgstr "Versanddatum"
 
 #: order/models.py:462
-#, fuzzy
-#| msgid "Shipped"
 msgid "shipped by"
-msgstr "Versendet"
+msgstr "Versand von"
 
 #: order/models.py:506
 msgid "SalesOrder cannot be shipped as it is not currently pending"
@@ -2580,11 +2556,11 @@ msgstr "Empfangene Objekt-Anzahl"
 #: order/models.py:648 stock/models.py:506
 #: stock/templates/stock/item_base.html:316
 msgid "Purchase Price"
-msgstr "EK-Preis"
+msgstr "Preis"
 
 #: order/models.py:649
 msgid "Unit purchase price"
-msgstr "EK-Preis pro Einheit"
+msgstr "Preis pro Einheit"
 
 #: order/models.py:743 order/models.py:745
 msgid "Stock item has not been assigned"
@@ -2611,10 +2587,8 @@ msgid "Line"
 msgstr "Position"
 
 #: order/models.py:780
-#, fuzzy
-#| msgid "Items"
 msgid "Item"
-msgstr "Positionen"
+msgstr "Position"
 
 #: order/models.py:781
 msgid "Select stock item to allocate"
@@ -2638,7 +2612,7 @@ msgstr "Drucken"
 #: order/templates/order/order_base.html:43
 #: order/templates/order/sales_order_base.html:52
 msgid "Edit order information"
-msgstr "Bestellinfos bearbeiten"
+msgstr "Bestellung bearbeiten"
 
 #: order/templates/order/order_base.html:51
 msgid "Receive items"
@@ -2675,19 +2649,15 @@ msgstr ""
 "Abbruch dieser Bestellung bedeutet, dass sie nicht länger bearbeitbar ist."
 
 #: order/templates/order/order_complete.html:7
-#, fuzzy
-#| msgid "Mark order as complete"
 msgid "Mark this order as complete?"
-msgstr "Bestellung als vollständig markieren"
+msgstr "Diese Bestellung als vollständig markieren?"
 
 #: order/templates/order/order_issue.html:7
-#, fuzzy
-#| msgid ""
-#| "Cancelling this order means that the order will no longer be editable."
 msgid ""
 "After placing this purchase order, line items will no longer be editable."
 msgstr ""
-"Abbruch dieser Bestellung bedeutet, dass sie nicht länger bearbeitbar ist."
+"Nachdem diese Bestellung plaziert ist können die Positionen nicht länger "
+"bearbeitbar ist."
 
 #: order/templates/order/order_notes.html:13
 msgid "Order Notes"
@@ -2888,14 +2858,12 @@ msgid "Delete stock allocation"
 msgstr "Bestands-Zuordnung löschen"
 
 #: order/templates/order/sales_order_detail.html:170
-#, fuzzy
-#| msgid "No matching results"
 msgid "No matching line items"
-msgstr "Keine passenden Ergebnisse gefunden"
+msgstr "Keine passenden Positionen gefunden"
 
 #: order/templates/order/sales_order_detail.html:199
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 #: order/templates/order/sales_order_detail.html:229 templates/js/build.js:523
 #: templates/js/build.js:785
@@ -3071,10 +3039,9 @@ msgid "No lines specified"
 msgstr "Keine Zeilen angegeben"
 
 #: order/views.py:1060
-#, fuzzy, python-brace-format
-#| msgid "Order parts"
+#, python-brace-format
 msgid "Ordered {n} parts"
-msgstr "Teile bestellen"
+msgstr "{n} Teile bestellt"
 
 #: order/views.py:1117
 msgid "Supplier part must be specified"
@@ -3101,10 +3068,9 @@ msgid "Allocate Serial Numbers"
 msgstr "Seriennummern zuweisen"
 
 #: order/views.py:1351
-#, fuzzy, python-brace-format
-#| msgid "Allocated to Orders"
+#, python-brace-format
 msgid "Allocated {n} items"
-msgstr "zu Bauaufträgen zugeordnet"
+msgstr "{n} Positionen zugeordnet"
 
 #: order/views.py:1367
 msgid "Select line item"
@@ -3222,20 +3188,16 @@ msgid "Confirm BOM duplication"
 msgstr "Kopie von Stückliste bestätigen"
 
 #: part/forms.py:151
-#, fuzzy
-#| msgid "Validate BOM"
 msgid "validate"
-msgstr "BOM validieren"
+msgstr "kontrollieren"
 
 #: part/forms.py:151
 msgid "Confirm that the BOM is correct"
 msgstr "Bestätigen, dass die Stückliste korrekt ist"
 
 #: part/forms.py:163
-#, fuzzy
-#| msgid "BOM Item"
 msgid "BOM file"
-msgstr "Stücklisten-Position"
+msgstr "Stücklisten-Datei"
 
 #: part/forms.py:163
 msgid "Select BOM file to upload"
@@ -3247,7 +3209,7 @@ msgstr "verknüpftes Teil"
 
 #: part/forms.py:201
 msgid "Select part category"
-msgstr "Teilekategorie wählen"
+msgstr "Teil-Kategorie wählen"
 
 #: part/forms.py:218
 msgid "Duplicate all BOM data for this part"
@@ -3286,14 +3248,12 @@ msgid "Add parameter template to all categories"
 msgstr "Parameter-Vorlage zu allen Kategorien hinzufügen"
 
 #: part/forms.py:342 part/models.py:2151
-#, fuzzy
-#| msgid "Buy parts"
 msgid "Sub part"
-msgstr "Teile kaufen"
+msgstr "Untergeordnetes Teil"
 
 #: part/forms.py:370
 msgid "Input quantity for price calculation"
-msgstr "Eintragsmenge zur Preisberechnung"
+msgstr "Menge für die Preisberechnung"
 
 #: part/models.py:73
 msgid "Default location for parts in this category"
@@ -3310,14 +3270,14 @@ msgstr "Standard-Stichworte für Teile dieser Kategorie"
 #: part/models.py:82 part/models.py:2103
 #: part/templates/part/part_app_base.html:9
 msgid "Part Category"
-msgstr "Teilkategorie"
+msgstr "Teil-Kategorie"
 
 #: part/models.py:83 part/templates/part/category.html:19
 #: part/templates/part/category.html:90 part/templates/part/category.html:141
 #: templates/InvenTree/search.html:126 templates/stats.html:39
 #: users/models.py:37
 msgid "Part Categories"
-msgstr "Teile-Kategorien"
+msgstr "Teil-Kategorien"
 
 #: part/models.py:446 part/models.py:458
 #, python-brace-format
@@ -3447,7 +3407,7 @@ msgstr "Kann dieses Teil aus anderen Teilen angefertigt werden?"
 
 #: part/models.py:841
 msgid "Can this part be used to build other parts?"
-msgstr "Kann dieses Teil zum Bau von anderen genutzt werden?"
+msgstr "Kann dieses Teil zum Bauauftrag von anderen genutzt werden?"
 
 #: part/models.py:847
 msgid "Does this part have tracking for unique items?"
@@ -3604,10 +3564,8 @@ msgid "This BOM item is optional"
 msgstr "Diese Stücklisten-Position ist optional"
 
 #: part/models.py:2163
-#, fuzzy
-#| msgid "Overdue"
 msgid "Overage"
-msgstr "Überfällig"
+msgstr "Überschuss"
 
 #: part/models.py:2164
 msgid "Estimated build wastage quantity (absolute or percentage)"
@@ -3622,10 +3580,8 @@ msgid "BOM item notes"
 msgstr "Notizen zur Stücklisten-Position"
 
 #: part/models.py:2172
-#, fuzzy
-#| msgid "BOM checksum"
 msgid "Checksum"
-msgstr "Prüfsumme der Stückliste"
+msgstr "Prüfsumme"
 
 #: part/models.py:2172
 msgid "BOM line checksum"
@@ -3639,7 +3595,7 @@ msgstr "Geerbt"
 #: part/models.py:2177
 msgid "This BOM item is inherited by BOMs for variant parts"
 msgstr ""
-"Diese Stücklisten-Position wird in dei Stücklisten von Teil-Varianten vererbt"
+"Diese Stücklisten-Position wird in die Stücklisten von Teil-Varianten vererbt"
 
 #: part/models.py:2253 part/views.py:1592 part/views.py:1644
 #: stock/models.py:260
@@ -3655,16 +3611,12 @@ msgid "BOM Item"
 msgstr "Stücklisten-Position"
 
 #: part/models.py:2384
-#, fuzzy
-#| msgid "Part"
 msgid "Part 1"
-msgstr "Teil"
+msgstr "Teil 1"
 
 #: part/models.py:2388
-#, fuzzy
-#| msgid "Part"
 msgid "Part 2"
-msgstr "Teil"
+msgstr "Teil 2"
 
 #: part/models.py:2388
 msgid "Select Related Part"
@@ -3705,18 +3657,21 @@ msgstr "Stückliste"
 #, python-format
 msgid "The BOM for <i>%(part)s</i> has changed, and must be validated.<br>"
 msgstr ""
+"Die Stückliste für <i>%(part)s</i> hat sich geändert und muss kontrolliert "
+"werden.<br>"
 
 #: part/templates/part/bom.html:21
 #, python-format
 msgid ""
 "The BOM for <i>%(part)s</i> was last checked by %(checker)s on %(check_date)s"
 msgstr ""
+"Die Stückliste für <i>%(part)s</i> wurde zuletzt von %(checker)s am "
+"%(check_date)s kontrolliert"
 
 #: part/templates/part/bom.html:25
-#, fuzzy, python-format
-#| msgid "This line has been validated"
+#, python-format
 msgid "The BOM for <i>%(part)s</i> has not been validated."
-msgstr "Diese Position wurde validiert"
+msgstr "Die Stückliste für <i>%(part)s</i> wurde noch nicht kontrolliert"
 
 #: part/templates/part/bom.html:32
 msgid "Remove selected BOM items"
@@ -3744,7 +3699,7 @@ msgstr "Stückliste bearbeiten"
 
 #: part/templates/part/bom.html:55
 msgid "Validate Bill of Materials"
-msgstr "Stückliste validieren"
+msgstr "Stückliste kontrollieren"
 
 #: part/templates/part/bom.html:61 part/views.py:1883
 msgid "Export Bill of Materials"
@@ -3858,20 +3813,18 @@ msgid "Each part must already exist in the database"
 msgstr "Jedes Teil muss bereits in der Datenbank bestehen"
 
 #: part/templates/part/bom_upload/upload_file.html:27
-#, fuzzy
-#| msgid "Uploaded"
 msgid "Upload File"
-msgstr "Hochgeladen"
+msgstr "Datei hochgeladen"
 
 #: part/templates/part/bom_validate.html:6
 #, python-format
 msgid ""
 "Confirm that the Bill of Materials (BOM) is valid for:<br><i>%(part)s</i>"
-msgstr ""
+msgstr "Bestätigen Sie das die Stückliste für <br><i>%(part)s</i> korrekt ist"
 
 #: part/templates/part/bom_validate.html:9
 msgid "This will validate each line in the BOM."
-msgstr ""
+msgstr "Damit wird jede Zeile der Stückliste kontrolliert"
 
 #: part/templates/part/build.html:10
 msgid "Part Builds"
@@ -3879,7 +3832,7 @@ msgstr "gefertigte Teile"
 
 #: part/templates/part/build.html:18
 msgid "Start New Build"
-msgstr "Neuen Bau beginnen"
+msgstr "Neuen Bauauftrag beginnen"
 
 #: part/templates/part/category.html:20
 msgid "All parts"
@@ -3887,15 +3840,15 @@ msgstr "Alle Teile"
 
 #: part/templates/part/category.html:25 part/views.py:2264
 msgid "Create new part category"
-msgstr "Teilkategorie anlegen"
+msgstr "Teil-Kategorie anlegen"
 
 #: part/templates/part/category.html:31
 msgid "Edit part category"
-msgstr "Teilkategorie bearbeiten"
+msgstr "Teil-Kategorie bearbeiten"
 
 #: part/templates/part/category.html:36
 msgid "Delete part category"
-msgstr "Teilekategorie löschen"
+msgstr "Teil-Kategorie löschen"
 
 #: part/templates/part/category.html:46 part/templates/part/category.html:85
 msgid "Category Details"
@@ -3923,11 +3876,11 @@ msgstr "Teile-Daten exportieren"
 
 #: part/templates/part/category.html:125
 msgid "Set category"
-msgstr "Teilkategorie auswählen"
+msgstr "Teil-Kategorie auswählen"
 
 #: part/templates/part/category.html:125
 msgid "Set Category"
-msgstr "Teilkategorie auswählen"
+msgstr "Teil-Kategorie auswählen"
 
 #: part/templates/part/category.html:128
 msgid "Export Data"
@@ -3979,7 +3932,7 @@ msgstr "Kategorie"
 
 #: part/templates/part/category_delete.html:13
 msgid "top level Parts category"
-msgstr "oberste Teilekategorie"
+msgstr "oberste Teil-Kategorie"
 
 #: part/templates/part/category_delete.html:25
 msgid "parts"
@@ -4408,11 +4361,11 @@ msgstr "neue Variante anlegen"
 
 #: part/views.py:89
 msgid "Add Related Part"
-msgstr "zugeordnetes Teil hinzufügen"
+msgstr "verknüpftes Teil hinzufügen"
 
 #: part/views.py:144
 msgid "Delete Related Part"
-msgstr "zugeordnetes Teil entfernen"
+msgstr "verknüpftes Teil entfernen"
 
 #: part/views.py:158
 msgid "Add part attachment"
@@ -4448,7 +4401,7 @@ msgstr "Testvorlage löschen"
 
 #: part/views.py:295
 msgid "Set Part Category"
-msgstr "Teilkategorie auswählen"
+msgstr "Teil-Kategorie auswählen"
 
 #: part/views.py:345
 #, python-brace-format
@@ -4581,15 +4534,15 @@ msgstr "Teilparameter löschen"
 
 #: part/views.py:2212
 msgid "Edit Part Category"
-msgstr "Teilkategorie bearbeiten"
+msgstr "Teil-Kategorie bearbeiten"
 
 #: part/views.py:2250
 msgid "Delete Part Category"
-msgstr "Teilkategorie löschen"
+msgstr "Teil-Kategorie löschen"
 
 #: part/views.py:2256
 msgid "Part category was deleted"
-msgstr "Teilekategorie wurde gelöscht"
+msgstr "Teil-Kategorie wurde gelöscht"
 
 #: part/views.py:2308
 msgid "Create Category Parameter Template"
@@ -4621,19 +4574,19 @@ msgstr "Vorlagen Name"
 
 #: report/models.py:186
 msgid "Report template file"
-msgstr "Report Vorlage Datei"
+msgstr "Bericht-Vorlage Datei"
 
 #: report/models.py:193
 msgid "Report template description"
-msgstr "Report Vorlage Beschreibung"
+msgstr "Bericht-Vorlage Beschreibung"
 
 #: report/models.py:199
 msgid "Report revision number (auto-increments)"
-msgstr "Report Revisionsnummer (autom. erhöht)"
+msgstr "Bericht Revisionsnummer (autom. erhöht)"
 
 #: report/models.py:275
 msgid "Report template is enabled"
-msgstr "Report Vorlage ist ein"
+msgstr "Bericht-Vorlage ist ein"
 
 #: report/models.py:295
 msgid "StockItem query filters (comma-separated list of key=value pairs)"
@@ -4651,7 +4604,7 @@ msgstr "Test-Ergebnisse für BestandsObjekte in Baugruppen einschließen"
 
 #: report/models.py:347
 msgid "Build Filters"
-msgstr "Bau Filter"
+msgstr "Bauauftrag Filter"
 
 #: report/models.py:348
 msgid "Build query filters (comma-separated list of key=value pairs"
@@ -4674,10 +4627,8 @@ msgid "Sales order query filters"
 msgstr "Auftrags-Abfragefilter"
 
 #: report/models.py:500
-#, fuzzy
-#| msgid "Shipped"
 msgid "Snippet"
-msgstr "Versendet"
+msgstr "Snippet"
 
 #: report/models.py:501
 msgid "Report snippet file"
@@ -4688,10 +4639,8 @@ msgid "Snippet file description"
 msgstr "Snippet-Beschreibung"
 
 #: report/models.py:540
-#, fuzzy
-#| msgid "Assembly"
 msgid "Asset"
-msgstr "Baugruppe"
+msgstr "Ressource"
 
 #: report/models.py:541
 msgid "Report asset file"
@@ -4742,16 +4691,14 @@ msgid "Fail"
 msgstr "fehlgeschlagen"
 
 #: stock/api.py:199
-#, fuzzy, python-brace-format
-#| msgid "Counted stock for {n} items"
+#, python-brace-format
 msgid "Updated stock for {n} items"
-msgstr "Bestand für {n} Objekte erfasst"
+msgstr "Bestand für {n} Objekte geändert"
 
 #: stock/api.py:268
-#, fuzzy, python-brace-format
-#| msgid "Moved {n} items to {dest}"
+#, python-brace-format
 msgid "Moved {n} parts to {loc}"
-msgstr "{n} Teile nach {dest} bewegt"
+msgstr "{n} Teile nach {loc} bewegt"
 
 #: stock/forms.py:114 stock/forms.py:406 stock/models.py:473
 #: stock/templates/stock/item_base.html:349 templates/js/stock.js:652
@@ -4759,10 +4706,8 @@ msgid "Expiry Date"
 msgstr "Ablaufdatum"
 
 #: stock/forms.py:115 stock/forms.py:407
-#, fuzzy
-#| msgid "Batch code for this stock item"
 msgid "Expiration date for this stock item"
-msgstr "Losnummer für dieses BestandsObjekt"
+msgstr "Ablaufdatum für dieses BestandsObjekt"
 
 #: stock/forms.py:118
 msgid "Enter unique serial numbers (or leave blank)"
@@ -4772,23 +4717,20 @@ msgstr "Eindeutige Seriennummern eingeben (oder leer lassen)"
 msgid ""
 "Destination for serialized stock (by default, will remain in current "
 "location)"
-msgstr ""
+msgstr "Lagerort für serial"
 
 #: stock/forms.py:171
 msgid "Serial numbers"
 msgstr "Seriennummern"
 
 #: stock/forms.py:171
-#, fuzzy
-#| msgid "Number of unique serial number ({s}) must match quantity ({q})"
 msgid "Unique serial numbers (must match quantity)"
 msgstr ""
-"Anzahl der eindeutigen Seriennummern ({s}) muss mit der Anzahl ({q}) "
-"übereinstimmen"
+"Anzahl der eindeutigen Seriennummern (muss mit der Anzahl übereinstimmen)"
 
 #: stock/forms.py:173 stock/forms.py:349
 msgid "Add transaction note (optional)"
-msgstr "hinzufügen Transaktionsnotizen (optional)"
+msgstr " Transaktionsnotizen hinzufügen (optional)"
 
 #: stock/forms.py:203 stock/forms.py:259
 msgid "Select test report template"
@@ -4852,13 +4794,11 @@ msgstr "Setze das Ziel als Standard-Lagerort für ausgewählte Teile"
 
 #: stock/models.py:54 stock/models.py:511
 msgid "Owner"
-msgstr ""
+msgstr "Besitzer"
 
 #: stock/models.py:55 stock/models.py:512
-#, fuzzy
-#| msgid "Select filter"
 msgid "Select Owner"
-msgstr "Filter auswählen"
+msgstr "Besitzer auswählen"
 
 #: stock/models.py:205
 msgid "Created stock item"
@@ -4944,7 +4884,7 @@ msgstr "Quellbau"
 
 #: stock/models.py:447
 msgid "Build for this stock item"
-msgstr "Bau für dieses BestandsObjekt"
+msgstr "Bauauftrag für dieses BestandsObjekt"
 
 #: stock/models.py:458
 msgid "Source Purchase Order"
@@ -4966,10 +4906,8 @@ msgstr ""
 "gekennzeichnet"
 
 #: stock/models.py:487
-#, fuzzy
-#| msgid "Delete Template"
 msgid "Delete on deplete"
-msgstr "Vorlage löschen"
+msgstr "Löschen wenn leer"
 
 #: stock/models.py:487
 msgid "Delete this Stock Item when stock is depleted"
@@ -4982,7 +4920,7 @@ msgstr "BestandsObjekt-Notizen"
 
 #: stock/models.py:507
 msgid "Single unit purchase price at time of purchase"
-msgstr "EK-Preis für eine Einheit bei EK-Datum"
+msgstr "Preis für eine Einheit bei Einkauf"
 
 #: stock/models.py:612
 msgid "Assigned to Customer"
@@ -5125,7 +5063,7 @@ msgstr ""
 
 #: stock/templates/stock/item_base.html:32
 msgid "Edit the stock item from the build view."
-msgstr "Ändern des BestandsObjekts in der Bau Ansicht."
+msgstr "Ändern des BestandsObjekts in der Bauauftrag-Ansicht."
 
 #: stock/templates/stock/item_base.html:45
 msgid "This stock item has not passed all required tests"
@@ -5137,7 +5075,7 @@ msgstr "Dieses BestandsObjekt ist einem Auftrag zugewiesen"
 
 #: stock/templates/stock/item_base.html:57
 msgid "This stock item is allocated to Build"
-msgstr "Dieses BestandsObjekt ist dem Bau zugewiesen"
+msgstr "Dieses BestandsObjekt ist dem Bauauftrag zugewiesen"
 
 #: stock/templates/stock/item_base.html:63
 msgid ""
@@ -5188,7 +5126,7 @@ msgstr "Druck Aktionen"
 #: stock/templates/stock/item_base.html:147
 #: stock/templates/stock/item_tests.html:27
 msgid "Test Report"
-msgstr "Test Report"
+msgstr "Test-Bericht"
 
 #: stock/templates/stock/item_base.html:156
 msgid "Stock adjustment actions"
@@ -5558,17 +5496,15 @@ msgstr "BestandsObjekte bewegen"
 
 #: stock/views.py:998
 msgid "Move"
-msgstr ""
+msgstr "Verschieben"
 
 #: stock/views.py:999
 msgid "Count Stock Items"
 msgstr "BestandsObjekte zählen"
 
 #: stock/views.py:999
-#, fuzzy
-#| msgid "Account"
 msgid "Count"
-msgstr "Konto"
+msgstr "Anzahl"
 
 #: stock/views.py:1000
 msgid "Remove From Stock"
@@ -5576,7 +5512,7 @@ msgstr "Aus Lagerbestand entfernen"
 
 #: stock/views.py:1000
 msgid "Take"
-msgstr ""
+msgstr "Entfernen"
 
 #: stock/views.py:1001
 msgid "Add Stock Items"
@@ -5706,7 +5642,7 @@ msgstr "neueste Teile"
 
 #: templates/InvenTree/index.html:99
 msgid "BOM Waiting Validation"
-msgstr "Stücklisten erwarten Validierung"
+msgstr "Stücklisten erwarten Kontrolle"
 
 #: templates/InvenTree/index.html:128
 msgid "Recently Updated"
@@ -5918,7 +5854,7 @@ msgstr "Vorname"
 
 #: templates/InvenTree/settings/user.html:36
 msgid "Last Name"
-msgstr "Nacname"
+msgstr "Nachname"
 
 #: templates/InvenTree/settings/user.html:40
 msgid "Email Address"
@@ -6101,11 +6037,11 @@ msgstr "Stückliste anzeigen"
 
 #: templates/js/bom.js:346
 msgid "Validate BOM Item"
-msgstr "Stücklisten-Position validieren"
+msgstr "Stücklisten-Position kontrollieren"
 
 #: templates/js/bom.js:348
 msgid "This line has been validated"
-msgstr "Diese Position wurde validiert"
+msgstr "Diese Position wurde kontrolliert"
 
 #: templates/js/bom.js:350
 msgid "Edit BOM Item"
@@ -6121,7 +6057,7 @@ msgstr "Keine Stücklisten-Position(en) gefunden"
 
 #: templates/js/build.js:56
 msgid "Auto-allocate stock items to this output"
-msgstr "BestandsObjekte automatisch Bau-Ausgabe zuordnen"
+msgstr "BestandsObjekte automatisch Endprodukt zuordnen"
 
 #: templates/js/build.js:62
 msgid "Complete build output"
@@ -6133,7 +6069,7 @@ msgstr "Bestand von Endpordukt zurücknehmen"
 
 #: templates/js/build.js:77
 msgid "Delete build output"
-msgstr "Endprodukt entfernt"
+msgstr "Endprodukt entfernen"
 
 #: templates/js/build.js:209 templates/stock_table.html:20
 msgid "New Stock Item"
@@ -6141,7 +6077,7 @@ msgstr "Neues BestandsObjekt"
 
 #: templates/js/build.js:493
 msgid "Required Part"
-msgstr "benötigter Teil"
+msgstr "benötigtes Teil"
 
 #: templates/js/build.js:514
 msgid "Quantity Per"
@@ -6422,15 +6358,15 @@ msgstr "BestandsObjekt ausgewählt"
 
 #: templates/js/report.js:55
 msgid "Select Report Template"
-msgstr "Report Vorlage auswählen"
+msgstr "Bericht-Vorlage auswählen"
 
 #: templates/js/report.js:70
 msgid "Select Test Report Template"
-msgstr "Test Report Vorlage auswählen"
+msgstr "Test-Bericht-Vorlage auswählen"
 
 #: templates/js/report.js:99
 msgid "Stock item(s) must be selected before printing reports"
-msgstr "BestandsObjekt(e) müssen vor dem Reportdruck ausgewählt werden"
+msgstr "BestandsObjekt(e) müssen vor dem Berichtsdruck ausgewählt werden"
 
 #: templates/js/report.js:116 templates/js/report.js:169
 #: templates/js/report.js:223 templates/js/report.js:277
@@ -6444,15 +6380,15 @@ msgstr "Keine Berichtsvorlagen für ausgewählte BestandsObjekt(e) gefunden"
 
 #: templates/js/report.js:152
 msgid "Select Builds"
-msgstr "Bau auswählen"
+msgstr "Bauauftrag auswählen"
 
 #: templates/js/report.js:153
 msgid "Build(s) must be selected before printing reports"
-msgstr "Bau muss vor dem Reportdruck ausgewählt werden"
+msgstr "Bauauftrag muss vor dem Berichtsdruck ausgewählt werden"
 
 #: templates/js/report.js:170
 msgid "No report templates found which match selected build(s)"
-msgstr "Keine Berichtvorlagen für ausgewählten Bau gefunden"
+msgstr "Keine Berichtvorlagen für ausgewählten Bauauftrag gefunden"
 
 #: templates/js/report.js:205
 msgid "Select Parts"
@@ -6460,7 +6396,7 @@ msgstr "Teile auswählen"
 
 #: templates/js/report.js:206
 msgid "Part(s) must be selected before printing reports"
-msgstr "Teil muss vor dem Reportdruck ausgewählt werden"
+msgstr "Teil muss vor dem Berichtsdruck ausgewählt werden"
 
 #: templates/js/report.js:224
 msgid "No report templates found which match selected part(s)"
@@ -6472,7 +6408,7 @@ msgstr "Bestellungen auswählen"
 
 #: templates/js/report.js:260
 msgid "Purchase Order(s) must be selected before printing report"
-msgstr "Bestellung muss vor dem Reportdruck ausgewählt werden"
+msgstr "Bestellung muss vor dem Berichtsdruck ausgewählt werden"
 
 #: templates/js/report.js:278 templates/js/report.js:332
 msgid "No report templates found which match selected orders"
@@ -6484,7 +6420,7 @@ msgstr "Aufträge auswählen"
 
 #: templates/js/report.js:314
 msgid "Sales Order(s) must be selected before printing report"
-msgstr "Auftrag muss vor dem Reportdruck ausgewählt werden"
+msgstr "Auftrag muss vor dem Berichtsdruck ausgewählt werden"
 
 #: templates/js/stock.js:38
 msgid "PASS"
@@ -7028,6 +6964,32 @@ msgstr "Berechtigungen Einträge zu ändern"
 msgid "Permission to delete items"
 msgstr "Berechtigung Einträge zu löschen"
 
+#, fuzzy
+#~| msgid "Stocktake"
+#~ msgid "take"
+#~ msgstr "Inventur"
+
+#, fuzzy
+#~| msgid "Add"
+#~ msgid "add"
+#~ msgstr "Hinzufügen"
+
+#, fuzzy
+#~| msgid "Delete"
+#~ msgid "delete"
+#~ msgstr "Löschen"
+
+#, fuzzy
+#~| msgid "Group by Part"
+#~ msgid "Sub Part"
+#~ msgstr "Gruppieren nach Teil"
+
+#~ msgid "Target date"
+#~ msgstr "Zieldatum"
+
+#~ msgid "customer"
+#~ msgstr "Kunde"
+
 #~ msgid "items"
 #~ msgstr "Teile"
 
@@ -7048,9 +7010,6 @@ msgstr "Berechtigung Einträge zu löschen"
 #~ msgid "description"
 #~ msgstr "Beschreibung"
 
-#~ msgid "target date"
-#~ msgstr "Zieldatum"
-
 #~ msgid "data"
 #~ msgstr "Wert"
 
@@ -7116,6 +7075,9 @@ msgstr "Berechtigung Einträge zu löschen"
 #~ msgid "Default_location"
 #~ msgstr "Standard-Lagerort"
 
+#~ msgid "Buy parts"
+#~ msgstr "Teile kaufen"
+
 #~ msgid "Build parts"
 #~ msgstr "Bauteile"
 

From 32eaf48c12db6c436671f42ddd8d56d8846e84b9 Mon Sep 17 00:00:00 2001
From: Matthias <matmair@live.de>
Date: Tue, 6 Apr 2021 18:33:57 +0200
Subject: [PATCH 15/16] fixed styling

---
 InvenTree/build/forms.py  | 2 +-
 InvenTree/order/models.py | 2 +-
 InvenTree/part/models.py  | 2 +-
 3 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/InvenTree/build/forms.py b/InvenTree/build/forms.py
index b947e02887..0726779b87 100644
--- a/InvenTree/build/forms.py
+++ b/InvenTree/build/forms.py
@@ -210,7 +210,7 @@ class CompleteBuildOutputForm(HelperForm):
 
     location = forms.ModelChoiceField(
         queryset=StockLocation.objects.all(),
-        label = _('Location'),
+        label=_('Location'),
         help_text=_('Location of completed parts'),
     )
 
diff --git a/InvenTree/order/models.py b/InvenTree/order/models.py
index 818bc81707..0c22b7978b 100644
--- a/InvenTree/order/models.py
+++ b/InvenTree/order/models.py
@@ -638,7 +638,7 @@ class PurchaseOrderLineItem(OrderLineItem):
         help_text=_("Supplier part"),
     )
 
-    received = models.DecimalField(decimal_places=5, max_digits=15, default=0, verbose_name=_('Received') , help_text=_('Number of items received'))
+    received = models.DecimalField(decimal_places=5, max_digits=15, default=0, verbose_name=_('Received'), help_text=_('Number of items received'))
 
     purchase_price = MoneyField(
         max_digits=19,
diff --git a/InvenTree/part/models.py b/InvenTree/part/models.py
index d2f8b805d3..e10dfba4ba 100644
--- a/InvenTree/part/models.py
+++ b/InvenTree/part/models.py
@@ -2160,7 +2160,7 @@ class BomItem(models.Model):
     optional = models.BooleanField(default=False, verbose_name=_('Optional'), help_text=_("This BOM item is optional"))
 
     overage = models.CharField(max_length=24, blank=True, validators=[validators.validate_overage],
-                                verbose_name=_('Overage'),
+                               verbose_name=_('Overage'),
                                help_text=_('Estimated build wastage quantity (absolute or percentage)')
                                )
 

From 6412cf1c8735db0e012d6adea93fea1acbaf4f5a Mon Sep 17 00:00:00 2001
From: Oliver Walters <oliver.henry.walters@gmail.com>
Date: Wed, 7 Apr 2021 20:55:44 +1000
Subject: [PATCH 16/16] Hide git information if there is an error

---
 InvenTree/InvenTree/version.py |  4 ++--
 InvenTree/templates/about.html | 10 ++++++++--
 2 files changed, 10 insertions(+), 4 deletions(-)

diff --git a/InvenTree/InvenTree/version.py b/InvenTree/InvenTree/version.py
index 4d3d546789..d7bcd4f7ed 100644
--- a/InvenTree/InvenTree/version.py
+++ b/InvenTree/InvenTree/version.py
@@ -37,7 +37,7 @@ def inventreeCommitHash():
 
     try:
         return str(subprocess.check_output('git rev-parse --short HEAD'.split()), 'utf-8').strip()
-    except FileNotFoundError:
+    except:
         return None
 
 
@@ -47,5 +47,5 @@ def inventreeCommitDate():
     try:
         d = str(subprocess.check_output('git show -s --format=%ci'.split()), 'utf-8').strip()
         return d.split(' ')[0]
-    except FileNotFoundError:
+    except:
         return None
diff --git a/InvenTree/templates/about.html b/InvenTree/templates/about.html
index cedfb40ca1..3305df430f 100644
--- a/InvenTree/templates/about.html
+++ b/InvenTree/templates/about.html
@@ -25,14 +25,20 @@
                                 <td><span class='fas fa-hashtag'></span></td>
                                 <td>{% trans "Django Version" %}</td><td><a href="https://www.djangoproject.com/">{% django_version %}</a></td>
                             </tr>
+                            {% inventree_commit_hash as hash %}
+                            {% if hash %}
                             <tr>
                                 <td><span class='fas fa-code-branch'></span></td>
-                                <td>{% trans "Commit Hash" %}</td><td><a href="https://github.com/inventree/InvenTree/commit/{% inventree_commit_hash %}">{% inventree_commit_hash %}</a></td>
+                                <td>{% trans "Commit Hash" %}</td><td>{{ hash }}</td>
                             </tr>
+                            {% endif %}
+                            {% inventree_commit_date as commit_date %}
+                            {% if commit_date %}
                             <tr>
                                 <td><span class='fas fa-calendar-alt'></span></td>
-                                <td>{% trans "Commit Date" %}</td><td>{% inventree_commit_date %}</td>
+                                <td>{% trans "Commit Date" %}</td><td>{{ commit_date }}</td>
                             </tr>
+                            {% endif %}
                             <tr>
                                 <td><span class='fas fa-book'></span></td>
                                 <td>{% trans "InvenTree Documentation" %}</td>