diff --git a/plugins/geocoder_handler/google.inc b/plugins/geocoder_handler/google.inc
index 5b1ddb9..5bad37c 100755
--- a/plugins/geocoder_handler/google.inc
+++ b/plugins/geocoder_handler/google.inc
@@ -32,6 +31,18 @@ function geocoder_google($address, $options = array()) {
       'sensor' => 'false',
     );
 
+    if (!empty($options['bounds'])) {
+      $query['bounds'] = $options['bounds'];
+    }
+
+    if (!empty($options['components'])) {
+      // Construct the right query string
+      $query['components'] = implode(
+        '|',
+        array_map('_geocoder_google_key_value_to_string', array_keys($options['components']), $options['components'])
+      );
+    }
+
     $url = url("http://maps.googleapis.com/maps/api/geocode/json", array('query' => $query));
     $result = drupal_http_request($url);
 
@@ -121,6 +132,10 @@ function geocoder_google($address, $options = array()) {
   }
 }
 
+function _geocoder_google_key_value_to_string($key, $value) {
+  return $key . ':' . $value;
+}
+
 function geocoder_google_field($field, $field_item, $options = array()) {
   if ($field['type'] == 'text' || $field['type'] == 'text_long' || $field['type'] == 'text_with_summary' || $field['type'] == 'computed') {
     return geocoder_google($field_item['value'], $options);
@@ -173,5 +188,12 @@ function geocoder_google_form($default_values = array()) {
     '#description' => 'Reject results that do not meet a certain level of quality or precision. Check all types of results to reject.',
   );
   
+  $form['bounds'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Bounding box'),
+    '#description' => t('If desired, enter the coordinates of an area inside which results should preferably lie. See <a href="@url">the Google Geocoding API documentation</a> for details and the correct format.', array('@url' => 'https://developers.google.com/maps/documentation/geocoding/#Viewports')),
+    '#default_value' => isset($default_values['bounds']) ? $default_values['bounds'] : '',
+  );
+
   return $form;
 }
