diff --git a/modules/product_reference/commerce_product_reference.module b/modules/product_reference/commerce_product_reference.module
index 9bbce86..8da906e 100644
--- a/modules/product_reference/commerce_product_reference.module
+++ b/modules/product_reference/commerce_product_reference.module
@@ -36,6 +36,12 @@ function commerce_product_reference_commerce_product_uri($product) {
  * fields will then also be present in the node view.
  */
 function commerce_product_reference_field_extra_fields() {
+  $extra = &drupal_static(__FUNCTION__);
+
+  if (isset($extra)) {
+    return $extra;
+  }
+
   $extra = array();
 
   // Loop through the product reference fields.
diff --git a/modules/product_reference/tests/commerce_product_reference.test b/modules/product_reference/tests/commerce_product_reference.test
index 85dcf89..27c4317 100644
--- a/modules/product_reference/tests/commerce_product_reference.test
+++ b/modules/product_reference/tests/commerce_product_reference.test
@@ -262,8 +262,9 @@ class CommerceProductReferenceAdminTest extends CommerceBaseTestCase {
     $this->drupalGet('admin/structure/types/manage/' . strtr($this->display_type->type, '_', '-') . '/display');
     // Load all the fields that are pulled with the product and check if they
     // are in the display screen.
-    $extra_fields = commerce_product_reference_field_extra_fields();
-    foreach ($extra_fields['node'][$this->display_type->type]['display'] as $display) {
+    $extra_fields = field_info_extra_fields('node', $this->display_type->type, 'display');
+
+    foreach ($extra_fields as $display) {
       $this->assertText($display['label'], t('Field %field_label is present in the manage display screen', array('%field_label' => $display['label'])));
     }
   }
