diff --git a/commerce_webform.rules.inc b/commerce_webform.rules.inc
index dd0f9c1..6c38e04 100644
--- a/commerce_webform.rules.inc
+++ b/commerce_webform.rules.inc
@@ -156,7 +156,6 @@ function commerce_webform_order_create($node, $webform_submission, $user) {
 
   // Add all the products chosen as line items to the order.
   _commerce_webform_create_order_line_items($product_details, $order_id, $uid, $node->nid, $webform_submission['sid']);
-
 }
 
 /**
@@ -263,19 +262,24 @@ function commerce_webform_order_update($node, $webform_submission, $user) {
     $wrapper = entity_metadata_wrapper('commerce_line_item', $line_item);
     $product = $wrapper->commerce_product->value();
     $order_id = $line_item->order_id;
-    if (isset($product_details[$product->product_id])) {
-      // Update this line item.
-      $product_detail = $product_details[$product->product_id];
-      $line_item->quantity = $product_detail->quantity;
-      $line_item->data['commerce_webform'] = array(
-        'choose_quantity' => $product_detail->choose_quantity,
-        'required' => $product_detail->required,
-      );
-      commerce_line_item_save($line_item);
 
-      // Update the webform submission for this product field.
-      $webform_submission_object = webform_get_submission($node->nid, $webform_submission['sid']);
-      commerce_webform_update_webform_submission_productfield($webform_submission_object, $order_id, $line_item->line_item_id, $product_detail->product->product_id, $product_detail->quantity, FALSE);
+    if (isset($product_details[$product->product_id])) {
+      // If the order has been paid for we do not want to modify it now.
+      $order = commerce_order_load($order_id);
+      if (empty($order->data['commerce_payment_order_paid_in_full_invoked'])) {
+        // Update this line item.
+        $product_detail = $product_details[$product->product_id];
+        $line_item->quantity = $product_detail->quantity;
+        $line_item->data['commerce_webform'] = array(
+          'choose_quantity' => $product_detail->choose_quantity,
+          'required' => $product_detail->required,
+        );
+        commerce_line_item_save($line_item);
+
+        // Update the webform submission for this product field.
+        $webform_submission_object = webform_get_submission($node->nid, $webform_submission['sid']);
+        commerce_webform_update_webform_submission_productfield($webform_submission_object, $order_id, $line_item->line_item_id, $product_detail->product->product_id, $product_detail->quantity, FALSE);
+      }
 
       // Remove this from the list of products to update.
       unset($product_details[$product->product_id]);
@@ -290,7 +294,6 @@ function commerce_webform_order_update($node, $webform_submission, $user) {
     // Create new line items for each new product on the submission.
     _commerce_webform_create_order_line_items($product_details, $order_id, $uid, $node->nid, $webform_submission['sid']);
   }
-
 }
 
 /**
diff --git a/productfield.inc b/productfield.inc
index db6198b..1b4b408 100644
--- a/productfield.inc
+++ b/productfield.inc
@@ -268,7 +268,7 @@ function _commerce_webform_productfield_expand($element) {
     foreach ($value as $id => $encoded_details) {
       $details = json_decode($encoded_details);
 
-      if ($details->paid && !user_access('alter product field on paid webform')) {
+      if (!empty($details->order_id)) {
         $disabled = TRUE;
       }
       if ($multiple) {
@@ -310,12 +310,7 @@ function _commerce_webform_productfield_expand($element) {
       $rows = array();
       $element[] = array(
         '#type' => 'value',
-        '#value' => $default_product_ids,
-      );
-
-      $element[] = array(
-        '#type' => 'value',
-        '#value' => $default_quantities,
+        '#value' => $value,
       );
 
       if (is_array($default_product_ids)) {
@@ -328,9 +323,12 @@ function _commerce_webform_productfield_expand($element) {
       }
 
       // @TODO - put this in a theme function.
-      $element['#markup'] = '<strong>' . $name . '</strong>';
-      $element['#markup'] .= theme('table', array('header' => array(t('Product ID'), t('Product name'), t('Quantity')), 'rows' => $rows));
-      $element['#markup'] .= '<p>' . t('This order has been completed and products choices cannot be edited online.') . '</p>';
+      $markup = array('#markup' => '<strong>' . $name . '</strong>');
+      //$markup['#markup'] .= theme('table', array('header' => array(t('Product ID'), t('Product name'), t('Quantity')), 'rows' => $rows));
+      $markup['#markup'] .= '<p>' . t('It is no longer possible to edit the products in this submission.') . '</p>';
+      $markup['#markup'] .= theme_webform_display_productfield(array('element' => $element, '#format' => 'html'));
+
+      $element[] = $markup;
     }
     else {
       $new_element = array(
@@ -518,7 +516,8 @@ function _webform_submit_productfield($component, $value) {
         }
       }
     }
-    else {
+    elseif (!empty($value[0]) && is_numeric($value[0])) {
+      // $value[0] is a product id.
       $details = array(
         'product_id' => $value[0],
         'quantity' => empty($value[0]) ? '0' : $value[1],
@@ -529,6 +528,10 @@ function _webform_submit_productfield($component, $value) {
 
       $return[] = json_encode($details);
     }
+    else {
+      // $value is an array of previously saved products.
+      $return = $value;
+    }
   }
 
   return $return;
@@ -562,6 +565,8 @@ function theme_webform_display_productfield($variables) {
     }
   }
 
+  $element['#format'] = empty($element['#format']) ? 'html' : $element['#format'];
+
   if ($element['#format'] == 'html') {
     $output = count($items) > 1 ? theme('item_list', array('items' => $items)) : (isset($items[0]) ? $items[0] : t('Not selected'));
   }
