diff --git a/plugins/geocoder_handler/gisgraphy.inc b/plugins/geocoder_handler/gisgraphy.inc
new file mode 100755
index 0000000..015b4be
--- /dev/null
+++ b/plugins/geocoder_handler/gisgraphy.inc
@@ -0,0 +1,144 @@
+<?php
+
+// $Id$
+
+/**
+ * @file
+ * Plugin to provide a gisgraphy geocoder.
+ * 
+ * For test use:
+ * Only field type addressfield tested.
+ * Only free webservice.
+ * Limit to 1 request / 20s
+ */
+/**
+ * Plugins are described by creating a $plugin array which will be used
+ * by the system that includes this file.
+ */
+$plugin = array(
+  'title' => t("Gisgraphy"),
+  'description' => t('Geocodes via Gisgraphy'),
+  'callback' => 'geocoder_gisgraphy',
+  'field_types' => array('addressfield'),
+  'field_callback' => 'geocoder_gisgraphy_field',
+  'terms_of_service' => 'http://www.gisgraphy.com/free-access.htm',
+);
+
+/**
+ * Process Markup
+ */
+function geocoder_gisgraphy($address, $options = array()) {
+
+  //Limit to 1 request / 20s
+  $gisgraphy_use = variable_get("gisgraphy_use", 0);
+  if ((time() - $gisgraphy_use) < 20) {
+    watchdog('geocoder', "Gisgraphy geocoder : plugin limit is 1 req/20s. Please use Premium Webservices (http://www.gisgraphy.com/premium/index.htm)", array(), WATCHDOG_ERROR);
+    drupal_set_message("Gisgraphy geocoder : plugin limit is 1 req/20s. Please use Premium Webservices (http://www.gisgraphy.com/premium/index.htm)");
+    return;
+  }
+  variable_set("gisgraphy_use", time());
+
+  // Webservice request
+  if (($address == '') or ($options['country'] == '')) {
+    watchdog('geocoder', "Gisgraphy geocoder : address or country empty", array(), WATCHDOG_ERROR);
+    drupal_set_message("Gisgraphy geocoder : address or country empty");
+    return;
+  }
+  else {
+    $query = array(
+      'address' => $address,
+      'country' => $options['country'],
+    );
+    $url = url("http://services.gisgraphy.com/geocoding/geocode", array('query' => $query));
+    $request = drupal_http_request($url); //dpm($request);
+    //Request test
+    if (isset($request->error)) {
+      $args = array(
+        '@code' => $request->code,
+        '@error' => $request->error,
+      );
+      //$msg = t('HTTP request to Gisgraphy API failed.\nCode: @code\nError: @error', $args);
+      watchdog('geocoder', "Gisgraphy geocoder : HTTP request to Gisgraphy API failed.\nCode: @code\nError: @error", $args, WATCHDOG_ERROR);
+      drupal_set_message("Gisgraphy geocoder : HTTP request to Gisgraphy API failed.");
+      //throw new Exception($msg);
+      return;
+    }
+    else {
+      // Status test
+      if ($request->status_message != 'OK') {
+        $args = array('@status' => $request->status_message);
+        //$msg = t('Gisgraphy API returned bad status.\nStatus: @status', $args);
+        watchdog('geocoder', "Gisgraphy geocoder : Gisgraphy API returned bad status.\nStatus: @status", $args, WATCHDOG_ERROR);
+        drupal_set_message("Gisgraphy geocoder : Gisgraphy API returned bad status.");
+        //throw new Exception($msg);
+        return;
+      }
+      else {
+        libxml_use_internal_errors(true);
+        $data = simplexml_load_string($request->data);
+        if ($data === false) {
+          watchdog('geocoder', "Gisgraphy geocoder : Failed loading XML", array(), WATCHDOG_ERROR);
+          drupal_set_message("Gisgraphy geocoder : Failed loading XML");/**
+            foreach (libxml_get_errors() as $error) {
+            echo "<br>", $error->message;
+            } */
+          libxml_clear_errors();
+          return;
+        }
+        geophp_load();
+        return _geocoder_gisgraphy_geometry($data);
+      }
+    }
+  }
+}
+
+function geocoder_gisgraphy_field($field, $field_item) {
+  if ($field['type'] == 'addressfield') {
+    $result = geocoder_widget_gisgraphy_parse_addressfield($field_item);
+    return geocoder_gisgraphy($result['address'], array('country' => $result['country']));
+  }
+}
+
+function _geocoder_gisgraphy_geometry(&$data) {
+  // print_r($data);exit;
+  if (!isset($data->result->lng, $data->result)) {
+    drupal_set_message('result not found');
+    watchdog('geocoder', "Gisgraphy geocoder : result not found", array(), WATCHDOG_ERROR);
+    return NULL;
+  }
+  else {
+    drupal_set_message('Gisgraphy ok');
+    $lng = (string) $data->result->lng;
+    $lat = (string) $data->result->lat;
+    return new Point($lng, $lat);
+  }
+}
+
+/**
+ * Geocoder Widget - Parse an address field for gisgraphy
+ */
+function geocoder_widget_gisgraphy_parse_addressfield($field_item) {
+  $address = '';
+  if (!empty($field_item['premise']))
+    $address .= $field_item['premise'] . ' ';
+  if (!empty($field_item['thoroughfare']))
+    $address .= $field_item['thoroughfare'] . ' ';
+  if (!empty($field_item['locality']))
+    $address .= $field_item['locality'] . ' ';
+  if (!empty($field_item['administrative_area']))
+    $address .= $field_item['administrative_area'] . ' ';
+  if (!empty($field_item['sub_administrative_area']))
+    $address .= $field_item['sub_administrative_area'] . ' ';
+  if (!empty($field_item['postal_code']))
+    $address .= $field_item['postal_code'] . ' ';
+
+  $address = rtrim($address);
+  $country = '';
+  if (!empty($field_item['country']))
+    $country .= $field_item['country'];
+
+  return array(
+    'address' => $address,
+    'country' => $country,
+  );
+}
\ No newline at end of file
