diff --git a/InvenTree/part/templates/part/category.html b/InvenTree/part/templates/part/category.html
index 6a076ef8ca..26098be946 100644
--- a/InvenTree/part/templates/part/category.html
+++ b/InvenTree/part/templates/part/category.html
@@ -44,6 +44,7 @@
 
 <div id='button-toolbar'>
     <div class='button-toolbar container-fluid' style="float: right;">
+        <button class='btn btn-default' id='part-export' title='Export Part Data'>Export</button>
         <button class='btn btn-success' id='part-create'>New Part</button>
         <div class='dropdown' style='float: right;'>
             <button id='part-options' class='btn btn-primary dropdown-toggle' type='button' data-toggle="dropdown">Options<span class='caret'></span></button>
@@ -104,6 +105,13 @@
                         });
     })
 
+    $("#part-export").click(function() {
+        
+        var url = "{% url 'part-export' %}?category={{ category.id }}";
+
+        location.href = url;
+    });
+
     $("#part-create").click(function() {
         launchModalForm(
             "{% url 'part-create' %}",
diff --git a/InvenTree/part/views.py b/InvenTree/part/views.py
index dc2697ee39..59f04de830 100644
--- a/InvenTree/part/views.py
+++ b/InvenTree/part/views.py
@@ -1162,15 +1162,59 @@ class BomUpload(FormView):
 class PartExport(AjaxView):
     """ Export a CSV file containing information on multiple parts """
 
-    def get(self, request, *args, **kwargs):
-        part = request.GET.get('parts', '')
-        parts = []
+    def get_parts(self, request):
+        """ Extract part list from the POST parameters.
+        Parts can be supplied as:
         
-        for pk in part.split(','):
+        - Part category
+        - List of part PK values
+        """
+
+        # Filter by part category
+        cat_id = request.GET.get('category', None)
+
+        print('cat_id:', cat_id)
+
+        part_list = None
+
+        if cat_id is not None:
             try:
-                parts.append(Part.objects.get(pk=int(pk)))
-            except (Part.DoesNotExist, ValueError):
-                continue
+                category = PartCategory.objects.get(pk=cat_id)
+                part_list = category.get_parts()
+            except (ValueError, PartCategory.DoesNotExist):
+                pass
+
+        # Backup - All parts
+        if part_list is None:
+            part_list = Part.objects.all()
+
+        # Also optionally filter by explicit list of part IDs
+        part_ids = request.GET.get('parts', '')
+        parts = []
+
+        for pk in part_ids.split(','):
+            try:
+                parts.append(int(pk))
+            except ValueError:
+                pass
+
+        if len(parts) > 0:
+            part_list = part_list.filter(pk__in=parts)
+
+        # Prefetch related fields to reduce DB hits
+        part_list = part_list.prefetch_related(
+            'category',
+            'used_in',
+            'builds',
+            'supplier_parts__purchase_order_line_items',
+            'stock_items__allocations',
+        )
+
+        return part_list
+
+    def get(self, request, *args, **kwargs):
+
+        parts = self.get_parts(request)
 
         headers = [
             'ID',
@@ -1187,10 +1231,16 @@ class PartExport(AjaxView):
             'Component',
             'Template',
             'Trackable',
+            'Purchaseable',
             'Salable',
             'Active',
             'Virtual',
-            'Stock Info',  # Spacer between part data and stock data
+
+            # Part meta-data
+            'Used In',
+
+            # Stock Information
+            'Stock Info',
             'In Stock',
             'Allocated',
             'Building',
@@ -1222,8 +1272,14 @@ class PartExport(AjaxView):
             line.append(part.pk)
             line.append(part.name)
             line.append(part.description)
-            line.append(str(part.category))
-            line.append(part.category.pk)
+
+            if part.category:
+                line.append(str(part.category))
+                line.append(part.category.pk)
+            else:
+                line.append('')
+                line.append('')
+
             line.append(part.IPN)
             line.append(part.revision)
             line.append(part.URL)
@@ -1233,10 +1289,14 @@ class PartExport(AjaxView):
             line.append(part.component)
             line.append(part.is_template)
             line.append(part.trackable)
+            line.append(part.purchaseable)
             line.append(part.salable)
             line.append(part.active)
             line.append(part.virtual)
 
+            # Part meta-data
+            line.append(part.used_in_count)
+
             # Stock information
             line.append('')
             line.append(part.total_stock)
@@ -1244,6 +1304,7 @@ class PartExport(AjaxView):
             line.append(part.quantity_being_built)
             line.append(part.on_order)
 
+            # Supplier Information
             if len(supplier_names) > 0:
                 line.append('')
 
diff --git a/InvenTree/templates/stock_table.html b/InvenTree/templates/stock_table.html
index 5b707eab24..c5d16b8ed6 100644
--- a/InvenTree/templates/stock_table.html
+++ b/InvenTree/templates/stock_table.html
@@ -1,6 +1,6 @@
 <div id='button-toolbar'>
     <div class='button-toolbar container-fluid' style='float: right;'>
-        <button class='btn btn-success' id='stock-export' title='Export Stock Information'>Export</button>
+        <button class='btn btn-default' id='stock-export' title='Export Stock Information'>Export</button>
         {% if not part or part.is_template == False %}
         <button class="btn btn-success" id='item-create'>New Stock Item</button>
         {% endif %}