diff --git a/commerce_webform.module b/commerce_webform.module
index a0870d7..bb25f97 100644
--- a/commerce_webform.module
+++ b/commerce_webform.module
@@ -338,7 +338,7 @@ function commerce_webform_update_webform_submission_productfield($webform_submis
     if ($component['type'] == 'productfield') {
       // Loop through the product options on the product field
       // looking for the purchased product.
-      foreach ($component['extra']['items'] as $product_id_option => $details) {
+      foreach (_productfield_products($component) as $product_id_option => $details) {
         if ($product_id_option == $product_id) {
           // Loop through the submission values looking for the product
           // which was just purchased.
diff --git a/commerce_webform.rules.inc b/commerce_webform.rules.inc
index 147b5d8..dd0f9c1 100644
--- a/commerce_webform.rules.inc
+++ b/commerce_webform.rules.inc
@@ -299,7 +299,7 @@ function commerce_webform_order_update($node, $webform_submission, $user) {
  */
 function commerce_webform_mark_paid($order) {
   module_load_include('inc', 'webform', 'includes/webform.submissions');
-  $loaded_order = commerce_order_load($order->order_number);
+  $loaded_order = commerce_order_load($order->order_id);
   $order_wrapper = entity_metadata_wrapper('commerce_order', $loaded_order);
   $line_items = $order_wrapper->commerce_line_items->value();
   foreach ($line_items as $line_item) {
diff --git a/productfield.inc b/productfield.inc
index 676f6b4..3a7bc45 100644
--- a/productfield.inc
+++ b/productfield.inc
@@ -623,7 +623,7 @@ function _webform_analysis_productfield($component, $sids = array(), $single = F
  */
 function _webform_table_productfield($component, $value) {
   // Convert submitted 'safe' values to un-edited, original form.
-  $options = $component['extra']['items'];
+  $products = _productfield_products($component);
 
   $value = (array) $value;
   $items = array();
@@ -631,8 +631,8 @@ function _webform_table_productfield($component, $value) {
   foreach ($value as $option_value) {
     $option_value = json_decode($option_value);
     if (!empty($option_value->product_id)) {
-      if (isset($options[$option_value->product_id])) {
-        $item = $option_value->quantity . ' x ' . _webform_filter_xss($options[$option_value->product_id]['title']);
+      if (isset($products[$option_value->product_id])) {
+        $item = $option_value->quantity . ' x ' . _webform_filter_xss($products[$option_value->product_id]->title);
       }
       else {
         $item = check_plain($option_value->product_id);
@@ -652,20 +652,18 @@ function _webform_table_productfield($component, $value) {
  * Implements _webform_csv_headers_component().
  */
 function _webform_csv_headers_productfield($component, $export_options) {
-  $options = $component['extra']['items'];
+  $options = _productfield_products($component);
 
   $headers = array(
     0 => array(),
-    1 => array(),
+    1 => array($component['name']),
     2 => array(),
   );
 
-  $headers[0][] = '';
-  $headers[1][] = '';
 
-  foreach ($options as $product_id => $details) {
-    $headers[2][] = $details['sku'] . ': PAID';
-    $headers[2][] = $details['sku'] . ': UNPAID';
+  foreach ($options as $product_id => $product) {
+    $headers[2][] = $product->sku . ': PAID';
+    $headers[2][] = $product->sku . ': UNPAID';
   }
 
   return $headers;
@@ -675,18 +673,20 @@ function _webform_csv_headers_productfield($component, $export_options) {
  * Implements _webform_csv_data_component().
  */
 function _webform_csv_data_productfield($component, $export_options, $values) {
-  $options = $component['extra']['items'];
+  $values = is_array($values) ? $values : array();
+
+  $return = array();
+
+  $products = _productfield_products($component);
 
   foreach ($values as $id => $value) {
     $values[$id] = json_decode($value);
   }
 
-  $return = array();
-
-  foreach ($options as $key => $item) {
+  foreach ($products as $product_id => $product) {
     $index = FALSE;
     foreach ($values as $value) {
-      if ($value->product_id == $key) {
+      if ($value->product_id == $product_id) {
         $index = $value;
       }
     }
@@ -1155,3 +1155,39 @@ function _commerce_webform_get_total_quantity_from_input_values($input_values) {
 
   return $total;
 }
+
+/**
+ * Get a list of commerce products avaiable for selection.
+ *
+ * @param array $component
+ *   Webform productfield component
+ *
+ * @return array
+ *   An array of commerce_product objects available for
+ *   selection with this component.
+ */
+function _productfield_products($component) {
+  $items = isset($component['extra']['items']) ? $component['extra']['items'] : array();
+  $product_type = $component['extra']['product_type'];
+
+  $product_ids = array();
+
+  if (empty($product_type)) {
+    // Build an array of product IDs from this field's values.
+    foreach ($items as $item) {
+      $product_ids[] = $item['product_id'];
+    }
+  }
+  else {
+    $query = new EntityFieldQuery();
+    $result = $query->entityCondition('entity_type', 'commerce_product')
+      ->entityCondition('bundle', $product_type)
+      ->execute();
+
+    if (!empty($result['commerce_product'])) {
+      $product_ids = array_keys($result['commerce_product']);
+    }
+  }
+
+  return commerce_product_load_multiple($product_ids);
+}
