diff --git a/src/Item/Item.php b/src/Item/Item.php
index 8ece07f..1df1985 100644
--- a/src/Item/Item.php
+++ b/src/Item/Item.php
@@ -176,7 +176,7 @@ class Item implements \IteratorAggregate, ItemInterface {
     if ($extract && !$this->fieldsExtracted) {
       $data_type_fallback_mapping = Utility::getDataTypeFallbackMapping($this->index);
       foreach (array(NULL, $this->getDatasourceId()) as $datasource_id) {
-        $fields_by_property_path = array();
+        $fields_with_property_path = array();
         foreach ($this->index->getFieldsByDatasource($datasource_id) as $field_id => $field) {
           // Don't overwrite fields that were previously set.
           if (empty($this->fields[$field_id])) {
@@ -189,12 +189,15 @@ class Item implements \IteratorAggregate, ItemInterface {
               $this->fields[$field_id]->setType($data_type_fallback_mapping[$field_data_type]);
             }
 
-            $fields_by_property_path[$field->getPropertyPath()] = $this->fields[$field_id];
+            $fields_with_property_path[$field_id] = array(
+              'field' => $this->fields[$field_id],
+              'property_path' => $field->getPropertyPath(),
+            );
           }
         }
-        if ($datasource_id && $fields_by_property_path) {
+        if ($datasource_id && $fields_with_property_path) {
           try {
-            Utility::extractFields($this->getOriginalObject(), $fields_by_property_path);
+            Utility::extractFields($this->getOriginalObject(), $fields_with_property_path);
           }
           catch (SearchApiException $e) {
             // If we couldn't load the object, just log an error and fail
diff --git a/src/Utility.php b/src/Utility.php
index 2cf7521..d931935 100644
--- a/src/Utility.php
+++ b/src/Utility.php
@@ -185,19 +185,27 @@ class Utility {
     // extracted from nested items.
     $direct_fields = array();
     $nested_fields = array();
-    foreach (array_keys($fields) as $key) {
-      if (strpos($key, ':') !== FALSE) {
-        list($direct, $nested) = explode(':', $key, 2);
-        $nested_fields[$direct][$nested] = $fields[$key];
+    foreach ($fields as $field_id => $field) {
+      if (strpos($field['property_path'], ':') !== FALSE) {
+        list($direct, $nested) = explode(':', $field['property_path'], 2);
+        $nested_fields[] = array(
+          'direct' => $direct,
+          'nested' => array(
+            $field_id => array(
+              'field' => $field['field'],
+              'property_path' => $nested,
+            ),
+          ),
+        );
       }
       else {
-        $direct_fields[] = $key;
+        $direct_fields[] = $field_id;
       }
     }
     // Extract the direct fields.
-    foreach ($direct_fields as $key) {
+    foreach ($direct_fields as $field_id) {
       try {
-        self::extractField($item->get($key), $fields[$key]);
+        self::extractField($item->get($fields[$field_id]['property_path']), $fields[$field_id]['field']);
       }
       catch (\InvalidArgumentException $e) {
         // This can happen with properties added by processors.
@@ -205,9 +213,9 @@ class Utility {
       }
     }
     // Recurse for all nested fields.
-    foreach ($nested_fields as $direct => $fields_nested) {
+    foreach ($nested_fields as $nested_field) {
       try {
-        $item_nested = $item->get($direct);
+        $item_nested = $item->get($nested_field['direct']);
         if ($item_nested instanceof DataReferenceInterface) {
           $item_nested = $item_nested->getTarget();
         }
@@ -215,11 +223,11 @@ class Utility {
           $item_nested = $item_nested->getTypedData();
         }
         if ($item_nested instanceof ComplexDataInterface && !$item_nested->isEmpty()) {
-          self::extractFields($item_nested, $fields_nested);
+          self::extractFields($item_nested, $nested_field['nested']);
         }
         elseif ($item_nested instanceof ListInterface && !$item_nested->isEmpty()) {
           foreach ($item_nested as $list_item) {
-            self::extractFields($list_item, $fields_nested);
+            self::extractFields($list_item, $nested_field['nested']);
           }
         }
       }
