diff --git uc_product/uc_product.admin.inc uc_product/uc_product.admin.inc
index 04c3d2c..cab6443 100644
--- uc_product/uc_product.admin.inc
+++ uc_product/uc_product.admin.inc
@@ -404,18 +404,11 @@ function uc_product_features($node) {
   if (arg(4)) {
     // First check to see if we're trying to remove a feature.
     if (intval(arg(5)) > 0 && arg(6) == 'delete') {
-      $result = db_query("SELECT * FROM {uc_product_features} WHERE pfid = :pfid AND fid = :fid", array(
-        ':pfid' => arg(5),
-        ':fid' => arg(4),
-      ));
-      if ($feature = $result->fetchAssoc()) {
+      $feature = uc_product_feature_load(arg(5), arg(4));
+      if (isset($feature)) {
         // If the user confirmed the delete, process it!
         if ($_POST['pf_delete']) {
-          // Call the delete function for this product feature if it exists.
-          $func = uc_product_feature_data($feature['fid'], 'delete');
-          if (function_exists($func)) {
-            $func($feature);
-          }
+          uc_product_feature_delete(arg(5));
 
           // Remove the product feature data from the database.
           db_delete('uc_product_features')
@@ -446,11 +439,8 @@ function uc_product_features($node) {
         $build = drupal_get_form($func, $node, array());
       }
       elseif (intval(arg(5)) > 0) {
-        $result = db_query("SELECT * FROM {uc_product_features} WHERE pfid = :pfid AND fid = :fid", array(
-          ':pfid' => arg(5),
-          ':fid' => arg(4),
-        ));
-        if ($feature = $result->fetchAssoc()) {
+        $feature = uc_product_feature_load(arg(5), arg(4));
+        if (isset($feature)) {
           $build = drupal_get_form($func, $node, $feature);
         }
       }
@@ -470,27 +460,28 @@ function uc_product_features($node) {
 
   $header = array(t('Type'), t('Description'), t('Operations'));
 
-  $result = db_query("SELECT * FROM {uc_product_features} WHERE nid = :nid ORDER BY pfid ASC", array(':nid' => $node->nid));
-  foreach ($result as $feature) {
-    $operations = array(
-      l(t('edit'), 'node/' . $node->nid . '/edit/features/' . $feature->fid . '/' . $feature->pfid),
-      l(t('delete'), 'node/' . $node->nid . '/edit/features/' . $feature->fid . '/' . $feature->pfid . '/delete'),
-    );
-    $rows[] = array(
-      'data' => array(
-        array('data' => uc_product_feature_data($feature->fid, 'title'), 'nowrap' => 'nowrap'),
-        array('data' => $feature->description, 'width' => '100%'),
-        array('data' => implode(' ', $operations), 'nowrap' => 'nowrap'),
-      ),
-      'valign' => 'top',
-    );
-  }
-
-  if (empty($rows)) {
+  $features = uc_product_feature_load_multiple($node->nid);
+  if (empty($features)) {
     $rows[] = array(
       array('data' => t('No features found for this product.'), 'colspan' => 3),
     );
   }
+  else {
+    foreach ($features as $feature) {
+      $operations = array(
+        l(t('edit'), 'node/'. $node->nid .'/edit/features/'. $feature->fid .'/'. $feature->pfid),
+        l(t('delete'), 'node/'. $node->nid .'/edit/features/'. $feature->fid .'/'. $feature->pfid .'/delete'),
+      );
+      $rows[] = array(
+        'data' => array(
+          array('data' => uc_product_feature_data($feature->fid, 'title'), 'nowrap' => 'nowrap'),
+          array('data' => $feature->description, 'width' => '100%'),
+          array('data' => implode(' ', $operations), 'nowrap' => 'nowrap'),
+        ),
+        'valign' => 'top',
+      );
+    }
+  }
 
   $build['features'] = array(
     '#theme' => 'table',
diff --git uc_product/uc_product.module uc_product/uc_product.module
index bdf81a7..cc50c09 100644
--- uc_product/uc_product.module
+++ uc_product/uc_product.module
@@ -1999,6 +1999,66 @@ function uc_product_feature_save($data) {
 }
 
 /**
+ * Load all product feature for a node.
+ *
+ * @param $nid
+ *   The product node ID.
+ * @returns
+ *   The array of all product features object.
+ */
+function uc_product_feature_load_multiple($nid) {
+  $result = db_query("SELECT * FROM {uc_product_features} WHERE nid = :nid ORDER BY pfid ASC", array(':nid' => $nid));
+  foreach ($result as $feature) {
+    $features[$feature->pfid] = $feature;
+  }
+  return $features;
+}
+
+/**
+ * Load a product feature object.
+ *
+ * @todo: should this return an object instead of array?
+ *
+ * @param $pfid
+ *   The product feature ID.
+ * @param $fid
+ *   Optional. Specify a specific feature id.
+ * @returns
+ *   The product feature array.
+ */
+function uc_product_feature_load($pfid, $fid = NULL) {
+  $sql = "SELECT * FROM {uc_product_features} WHERE pfid = :pfid";
+  $arg = array(':pfid' => $nid);
+  if (isset($fid)) {
+    $sql .= ' AND fid = :fid';
+    $arg[':fid'] = $fid;
+  }
+  $feture = db_query($sql, $arg)->fetchAssoc();
+  return $feature;
+}
+
+/**
+ * Delete a product feature object.
+ *
+ * @param $pfid
+ *   The product feature ID.
+ */
+function uc_product_feature_delete($pfid) {
+  $feature = uc_product_feature_load($pfid);
+
+  // Call the delete function for this product feature if it exists.
+  $func = uc_product_feature_data($feature['fid'], 'delete');
+  if (function_exists($func)) {
+    $func($feature);
+  }
+  db_delete('uc_product_features')
+    ->condition('pfid', $pfid)
+    ->execute();
+
+  return SAVED_DELETED;
+}
+
+/**
  * Create a file field with an image field widget, and attach it to products.
  *
  * This field is used by default on the product page, as well as on the cart
