diff --git a/geocoder.admin.inc b/geocoder.admin.inc
index 36cda8d..6a4e46d 100644
--- a/geocoder.admin.inc
+++ b/geocoder.admin.inc
@@ -34,6 +34,14 @@ function geocoder_admin_settings($form, &$form_state) {
     '#required' => FALSE,
   );
 
+  $form['geocoder_apikey_mapzen'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Mapzen Search API Key'),
+    '#description' => t('You can obtain a Mapzen Search API Key at ') . 'https://mapzen.com/developers',
+    '#default_value' => empty($geocoder_settings['geocoder_apikey_mapzen']) ? '' : $geocoder_settings['geocoder_apikey_mapzen'],
+    '#required' => FALSE,
+  );
+
   $form['geocoder_google_auth_method'] = array(
     '#type'          => 'select',
     '#title'         => t('Google API Authorization Method'),
@@ -125,6 +133,7 @@ function geocoder_admin_settings_submit($form, &$form_state) {
   $geocoder_settings['geocoder_apikey_yahoo'] = trim($form_state['values']['geocoder_apikey_yahoo']);
   $geocoder_settings['geocoder_apikey_yandex'] = trim($form_state['values']['geocoder_apikey_yandex']);
   $geocoder_settings['geocoder_apikey_bing'] = trim($form_state['values']['geocoder_apikey_bing']);
+  $geocoder_settings['geocoder_apikey_mapzen'] = trim($form_state['values']['geocoder_apikey_mapzen']);
   $geocoder_settings['geocoder_apikey_google'] = trim($form_state['values']['geocoder_apikey_google']);
   variable_set("geocoder_settings", $geocoder_settings);
 }
diff --git a/plugins/geocoder_handler/mapzen.inc b/plugins/geocoder_handler/mapzen.inc
new file mode 100644
index 0000000..e93b93e
--- /dev/null
+++ b/plugins/geocoder_handler/mapzen.inc
@@ -0,0 +1,63 @@
+<?php
+
+/**
+ * @file
+ * Plugin to provide a Mapzen geocoder.
+ */
+
+/**
+ * Plugins are described by creating a $plugin array which will be used
+ * by the system that includes this file.
+ */
+$plugin = array(
+  'title' => t("Mapzen"),
+  'description' => t('Geocodes via Mapzen search'),
+  'callback' => 'geocoder_mapzen',
+  'field_types' => array('text', 'text_long', 'file', 'computed'),
+  'field_callback' => 'geocoder_mapzen_field',
+);
+
+
+/**
+ * Process Markup
+ */
+function geocoder_mapzen($address, $options = array()) {
+  geophp_load();
+  $api_url = "https://search.mapzen.com/v1/search";
+  $geocoder_settings = variable_get('geocoder_settings', array());
+
+  if (!empty($geocoder_settings['geocoder_apikey_mapzen'])) {
+    $api_key = $geocoder_settings['geocoder_apikey_mapzen'];
+  }
+  else {
+    throw new Exception('You must specify an API key for Mapzen.');
+  }
+
+  $params = array(
+    'api_key' => $api_key,
+    'text' => str_replace(' ', '+', $address),
+    'size' => 1,
+  );
+  $request = drupal_http_request($api_url . '?' . drupal_http_build_query($params));
+  $data = $request->data;
+  return geoPHP::load($data);
+}
+
+function geocoder_mapzen_field($field, $field_item) {
+  if ($field['type'] == 'text' || $field['type'] == 'text_long' || $field['type'] == 'text_with_summary' || $field['type'] == 'computed') {
+    return geocoder_mapzen($field_item['value'], $options);
+  }
+  if ($field['type'] == 'addressfield') {
+    $address = geocoder_widget_parse_addressfield($field_item);
+    return geocoder_mapzen($address, $options);
+  }
+  if ($field['type'] == 'location') {
+    $address = geocoder_widget_parse_locationfield($field_item);
+    return geocoder_mapzen($address, $options);
+  }
+  if ($field['type'] == 'taxonomy_term_reference') {
+    $term = taxonomy_term_load($field_item['tid']);
+    return geocoder_mapzen($term->name);
+  }
+}
+
