diff --git a/addressfield.info b/addressfield.info
index af5d068..001e9af 100644
--- a/addressfield.info
+++ b/addressfield.info
@@ -6,6 +6,7 @@ package = Fields
 dependencies[] = ctools
 
 files[] = addressfield.migrate.inc
+files[] = includes/processor_addressfield.inc
 files[] = views/addressfield_views_handler_field_administrative_area.inc
 files[] = views/addressfield_views_handler_field_country.inc
 files[] = views/addressfield_views_handler_filter_country.inc
diff --git a/addressfield.module b/addressfield.module
index 68b45d9..e825166 100644
--- a/addressfield.module
+++ b/addressfield.module
@@ -906,3 +906,17 @@ function _addressfield_country_options_list($field = NULL, $instance = NULL) {
 
   return $countries;
 }
+
+/**
+ * Implements hook_search_api_processor_info().
+ */
+function addressfield_search_api_processor_info() {
+  $callbacks['search_api_addressfield'] = array(
+    'name' => t('Address field'),
+    'description' => t('This processor appends full text value of administrative_area (state) to its abbreviation ' .
+      '(i.e., "CA" => "CA California"). '),
+    'class' => 'SearchApiAddressfield',
+  );
+
+  return $callbacks;
+}
diff --git a/includes/processor_addressfield.inc b/includes/processor_addressfield.inc
new file mode 100644
index 0000000..dd82bbf
--- /dev/null
+++ b/includes/processor_addressfield.inc
@@ -0,0 +1,93 @@
+<?php
+
+/**
+ * @file
+ * Contains SearchApiAddressfield.
+ */
+
+/**
+ * Processor for replacing the abbreviation of administrative_area (state)
+ * for its full text value (i.e., "CA" => "California").
+ */
+class SearchApiAddressfield extends SearchApiAbstractProcessor {
+
+  public function configurationForm() {
+    $form = parent::configurationForm();
+    $form += array(
+      'address_field' => array(
+        '#markup' => '<p>There are no configurations for Address field processor in its current version,
+                    as it only replaces the abbreviation of administrative_area (state) for its full text
+                    value (i.e., "CA" => "California").</p>
+                    <p>Make sure that both fields are added to index (administrative_area and country).</p>',
+      ),
+    );
+    unset($form['fields']);
+
+    return $form;
+  }
+
+  public function preprocessIndexItems(array &$items) {
+
+    $reference_types = array('taxonomy_term_reference',
+                             'entityreference',
+                             'commerce_product_reference');
+
+    foreach ($items as &$item) {
+      foreach ($item as $name => &$field) {
+        // Don't preprocess the field with an empty value.
+        if (!empty($field['value'])) {
+
+          $field_name = explode(":", $name);
+          $field_info = field_read_fields(array('field_name' => $field_name[0]));
+          // Only process fields of addressfield type.
+          if (!empty($field_info) && $field_info[$field_name[0]]['type'] == "addressfield") {
+
+            // Process administrative_area (State) sub-field.
+            if (isset($field_name[1]) && $field_name[1] == "administrative_area") {
+
+              // Get country code.
+              $country_code = reset(explode(" ", $item[$field_name[0] . ':country']['value']));
+              module_load_include('inc', 'addressfield', 'addressfield.administrative_areas');
+              $administrative_areas = addressfield_get_administrative_areas($country_code);
+
+              if (!empty($administrative_areas)) {
+                // Append administrative_area full value to abbreviation.
+                $field['value'] = $administrative_areas[$field['value']];
+                $this->processField($field['value'], $field['type']);
+              }
+            }
+          }
+          else if (!empty($field_info) && in_array($field_info[$field_name[0]]['type'], $reference_types)) {
+
+            /*
+             * Reference to an entity type that could have an addressfield.
+             */
+            $last_two = array();
+            $last_two[] = array_pop($field_name);
+            $last_two[] = array_pop($field_name);
+            $field_name = array_reverse($last_two);
+            $field_info = field_read_fields(array('field_name' => $field_name[0]));
+
+            if (isset($field_name[1]) && $field_name[1] == "administrative_area") {
+              // Get country code
+              $field_name_country = explode(":", $name);
+              array_pop($field_name_country);
+              array_push($field_name_country, 'country');
+              $field_name_country = implode(':', $field_name_country);
+
+              $country_code = reset(explode(" ", $item[$field_name_country]['value']));
+              module_load_include('inc', 'addressfield', 'addressfield.administrative_areas');
+              $administrative_areas = addressfield_get_administrative_areas($country_code);
+
+              if (!empty($administrative_areas)) {
+                // Append administrative_area full value to abbreviation
+                $field['value'] = $administrative_areas[$field['value']];
+                $this->processField($field['value'], $field['type']);
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+}
\ No newline at end of file
