diff --git a/InvenTree/part/templates/part/index.html b/InvenTree/part/templates/part/index.html
index df51ce51f2..a6f5ca4e29 100644
--- a/InvenTree/part/templates/part/index.html
+++ b/InvenTree/part/templates/part/index.html
@@ -32,56 +32,12 @@
 
 {% block javascript %}
 
+
+
 
 
diff --git a/InvenTree/static/script/modal_form.js b/InvenTree/static/script/modal_form.js
new file mode 100644
index 0000000000..cc1f609b3a
--- /dev/null
+++ b/InvenTree/static/script/modal_form.js
@@ -0,0 +1,59 @@
+/* Bind a button to launch a modal form and handle AJAX requests */
+function bindModalForm(modal, button, url, data) {
+    $(button).click(function () {
+        $.ajax({
+            url: url,       // Where to request the data from
+            type: 'get',    // GET request
+            data: data,     // Any additional context data (e.g. initial values)
+            dataType: 'json',
+            beforeSend: function() {
+                $(modal).modal('show');
+            },
+            success: function(response) {
+                if (response.html_form) {
+                    var target = modal + ' .modal-content';
+                    $(target).html(response.html_form);
+                } else {
+                    alert('JSON response missing form data');
+                    $(modal).modal('hide');
+                }
+            },
+            error: function (xhr, ajaxOptions, thrownError) {
+                alert('Error requesting form data:\n' + thrownError);
+                $(modal).modal('hide');
+            }
+        });
+    });
+
+    $(modal).on('submit', '.js-modal-form', function() {
+        var form = $(this);
+
+        $.ajax({
+            url: form.attr('action'),
+            data: form.serialize(),
+            type: form.attr('method'),
+            dataType: 'json',
+            success: function (response) {
+                if (response.form_valid) {
+                    alert("Success!");
+                    $(modal).modal('hide');
+                }
+                else if (response.html_form) {
+                    var target = modal + ' .modal-content';
+                    $(target).html(response.html_form);
+                }
+                else {
+                    alert('JSON response missing form data');
+                    $(modal).modal('hide');
+                }
+            },
+            error: function (xhr, ajaxOptions, thrownError) {
+                alert("Error posting form data:\n" + thrownError);
+                $(modal).modal('hide');
+            }
+        });
+
+        // Override the default form submit functionality
+        return false;
+    });
+}
\ No newline at end of file