diff --git a/supported/geocode_google.inc b/supported/geocode_google.inc
new file mode 100644
index 0000000..156d2d9
--- /dev/null
+++ b/supported/geocode_google.inc
@@ -0,0 +1,61 @@
+<?php
+// $Id$
+
+function location_geocode_google($location = array(), $cc = NULL, $accuracies = array(7,8)) {
+
+  $apikey = location_geocode_google_apikey($cc);
+  if (!$apikey) return NULL;
+
+  $service_url = 'http://maps.google.com/maps/geo?output=xml&key='. $apikey .'&q=';
+
+  $address = location_address2singleline($location);
+
+  $http_reply = drupal_http_request($service_url . urlencode($address));
+
+  $status_code_match = array();
+  preg_match('/<code>(.*)<\/code>/', $http_reply->data, $status_code_match);
+  $status_code = $status_code_match[1];
+  if ($status_code != 200) {
+    return NULL;
+  }
+
+  $accuracy_code_match = array();
+  preg_match('/Accuracy="([0-9])"/', $http_reply->data, $accuracy_code_match);
+  $accuracy_code = $accuracy_code_match[1];
+  if (!in_array($accuracy_code, $accuracies)) {
+    return NULL;
+  }
+
+  $latlon_match = array();
+  preg_match('/<coordinates>(.*)<\/coordinates>/', $http_reply->data, $latlon_match);
+
+  $latlon_exploded = explode(',', $latlon_match[1]);
+
+  return array('lat' => $latlon_exploded[1], 'lon' => $latlon_exploded[0]);
+}
+
+function location_geocode_google_settings($cc = NULL) {
+  $form = array();
+  $api_key_name = $cc ? 'location_geocode_'.$cc.'_google_apikey' : 'location_geocode_google_apikey';
+  $form[$api_key_name] = array(
+    '#type' => 'textfield',
+    '#title' => t('Google Maps API Key'),
+    '#size' => 64,
+    '#maxlength' => 128,
+    '#default_value' => location_geocode_google_apikey($cc),
+    '#description' => t('In order to use the Google Maps API geocoding web-service, you will need a Google Maps API Key.  You can obtain one at the !sign_up_link for the !google_maps_api.', array('!sign_up_link' => '<a href="http://www.google.com/apis/maps/signup.html">sign-up page</a>', '!google_maps_api' => '<a href="http://www.google.com/apis/maps/">Google Maps API</a>'))
+  );
+
+  return $form;
+}
+
+function location_geocode_google_apikey($cc = NULL) {
+  if ($cc) $keynames[] = 'location_geocode_'.$cc.'_google_apikey';
+  $keynames[] = 'location_geocode_google_apikey';
+  if (module_exists('gmap')) $keynames[] = 'googlemap_api_key';
+  foreach ($keynames as $kname) {
+    $apikey = variable_get($kname, NULL);
+    if ($apikey) return $apikey;
+  }
+  return NULL;
+}
\ No newline at end of file
diff --git a/supported/location.at.inc b/supported/location.at.inc
index 718ccf8..3123d49 100644
--- a/supported/location.at.inc
+++ b/supported/location.at.inc
@@ -3,11 +3,105 @@
 
 // Austria
 
+function location_map_link_at_providers() {
+  return array(
+    'google' => array('name' => 'Google Maps', 'url' => 'http://maps.google.com', 'tos' => 'http://www.google.com/help/terms_local.html'),
+  );
+}
+
+function location_map_link_at_default_providers() {
+  return array('google');
+}
+
+function location_map_link_at_google($location = array()) {
+  $query_params = array();
+
+  foreach (array('street', 'city', 'province', 'postal_code', 'country') as $field) {
+    if (isset($location[$field])) {
+      $query_params[] = $location[$field];
+    }
+  }
+
+  if (count($query_params)) {
+    return ('http://maps.google.com?q='. urlencode(implode(", ", $query_params)));
+  }
+  else {
+    return NULL;
+  }
+}
+
+function location_geocode_at_providers() {
+  return array(
+    'google' => array('name' => 'Google Maps API', 'url' => 'http://www.google.com/apis/maps/', 'tos' => 'http://www.google.com/apis/maps/terms.html'),
+  );
+}
+
+/**
+ * google address lookup has it's own file now
+ */
+require_once('geocode_google.inc');
+
+function location_geocode_at_google($location = array()) {
+  return location_geocode_google($location, 'at');
+}
+
+function location_geocode_at_google_settings() {
+  return location_geocode_google_settings('at');
+}
+
+function theme_location_at($location = array(), $hide = array()) {
+  $output = '';
+  if (count($location)) {
+    $output .= "\n";
+    $output .= '<div class="location vcard"><div class="adr">'."\n";
+    if (!empty($location['name']) && !in_array('name', $hide)) {
+       $output .= '<div class="fn">'. $location['name'] .'</div>';
+    }
+
+    if (!empty($location['street']) && !in_array('street', $hide)) {
+      $output .= '<div class="street-address">'. $location['street'];
+      if (!empty($location['additional']) && !in_array('street', $hide)) {
+        $output .= ' ' . $location['additional'];
+      }
+      $output .='</div>';
+    }
+
+    if ((!empty($location['city']) && !in_array('city', $hide)) ||
+        (!empty($location['postal_codet']) && !in_array('postal_code', $hide))) {
+
+      $city_postal = array();
+
+      if (!empty($location['postal_code']) && !in_array('postal_code', $hide)) {
+        $city_postal[] = '<span class="postal-code">'. $location['postal_code'] .'</span>';
+      }
+
+      if (!empty($location['city']) && !in_array('city', $hide)) {
+        $city_postal[] = '<span class="locality">'. $location['city'] .'</span>';
+      }
+
+      $output .= '<div>'. implode(' ', $city_postal) .'</div>';
+    }
+
+    if (!in_array('country', $hide)) {
+      $output .= '<div class="country-name">'. t('Germany') .'</div>';
+    }
+
+    if (isset($location['latitude']) && isset($location['longitude'])) {
+      $output .=  '<div class="geo"><abbr class="latitude" title="'. $location['latitude'] .'" /><abbr class="longitude" title="'. $location['latitude']. '" /></div>';
+    }
+
+    $output .= '</div></div>';
+
+  }
+  return $output;
+}
+
 function location_province_list_at() {
-  return array('BUR' => "Burgenland",
-    'KAR' => "Karnten",
-    'NOS' => "Niederosterreich",
-    'OOS' => "Oberosterreich",
+  return array(
+    'BUR' => "Burgenland",
+    'KAR' => "Kärnten",
+    'NOS' => "Niederösterreich",
+    'OOS' => "Oberösterreich",
     'SAL' => "Salzburg",
     'STE' => "Steiermark",
     'TIR' => "Tirol",
diff --git a/supported/location.ca.inc b/supported/location.ca.inc
index f9e8509..4d38d1a 100644
--- a/supported/location.ca.inc
+++ b/supported/location.ca.inc
@@ -206,48 +206,17 @@ function location_geocode_ca_providers() {
   );
 }
 
-function location_geocode_ca_google_settings(){
-  $form = array();
-
-  $form['location_geocode_ca_google_apikey'] = array(
-    '#type' => 'textfield',
-    '#title' => t('Google Maps API Key'),
-    '#size' => 64,
-    '#maxlength' => 128,
-    '#default_value' => variable_get('location_geocode_ca_google_apikey', ''),
-    '#description' => t('In order to use the Google Maps API geocoding web-service, you will need a Google Maps API Key.  You can obtain one at the !sign_up_link for the !google_maps_api.', array('!sign_up_link' => '<a href="http://www.google.com/apis/maps/signup.html">sign-up page</a>', '!google_maps_api' => '<a href="http://www.google.com/apis/maps/">Google Maps API</a>'))
-  );
-
-  return $form;
-}
+/**
+ * google address lookup has it's own file now
+ */
+require_once('geocode_google.inc');
 
 function location_geocode_ca_google($location = array()) {
-  $service_url = 'http://maps.google.com/maps/geo?output=xml&key='. variable_get('location_geocode_ca_google_apikey', '') .'&q=';
-
-  $address = location_address2singleline($location);
-  
-  $http_reply = drupal_http_request($service_url . urlencode($address));
-  
-  $status_code_match = array();
-  preg_match('/<code>(.*)<\/code>/', $http_reply->data, $status_code_match);
-  $status_code = $status_code_match[1];
-  if ($status_code != 200) {
-    return NULL;
-  }
-  
-  $accuracy_code_match = array();
-  preg_match('/Accuracy="([0-9])"/', $http_reply->data, $accuracy_code_match);
-  $accuracy_code = $accuracy_code_match[1];
-  if ($accuracy_code != 8 && $accuracy_code != 7) {
-    return NULL;
-  }
-  
-  $latlon_match = array();
-  preg_match('/<coordinates>(.*)<\/coordinates>/', $http_reply->data, $latlon_match);
-  
-  $latlon_exploded = explode(',', $latlon_match[1]);
+  return location_geocode_google($location, 'ca');
+}
   
-  return array('lat' => $latlon_exploded[1], 'lon' => $latlon_exploded[0]);
+function location_geocode_ca_google_settings(){
+  return location_geocode_google_settings('ca');
 }
 
 /**
diff --git a/supported/location.de.inc b/supported/location.de.inc
index 95e5c53..bb6290c 100644
--- a/supported/location.de.inc
+++ b/supported/location.de.inc
@@ -45,11 +45,49 @@ function _location_map_link_de_tinfo($location = array()) {
 
 
 function location_map_link_de_providers() {
-  return array('tinfo' => array('name' => 'T-Info', 'url' => 'http://www.t-info.de/map/index.jsp', 'tos' => 'http://www.t-info.de/map/application?origin=note.jsp&event=bea.portal.framework.internal.refresh&pageid=TermsOfUse&portal.content_id=30600'));
+  return array('tinfo' => array('name' => 'T-Info', 'url' => 'http://www.t-info.de/map/index.jsp', 'tos' => 'http://www.t-info.de/map/application?origin=note.jsp&event=bea.portal.framework.internal.refresh&pageid=TermsOfUse&portal.content_id=30600'),
+               'google' => array('name' => 'Google Maps', 'url' => 'http://maps.google.com', 'tos' => 'http://www.google.com/help/terms_local.html'),
+              );
 }
 
 function location_map_link_de_default_providers() {
-  return array();
+  return array('google');
+}
+
+function location_map_link_de_google($location = array()) {
+  $query_params = array();
+
+  foreach (array('street', 'city', 'province', 'postal_code', 'country') as $field) {
+    if (isset($location[$field])) {
+      $query_params[] = $location[$field];
+    }
+  }
+
+  if (count($query_params)) {
+    return ('http://maps.google.de?q='. urlencode(implode(", ", $query_params)));
+  }
+  else {
+    return NULL;
+  }
+}
+
+function location_geocode_de_providers() {
+  return array(
+    'google' => array('name' => 'Google Maps API', 'url' => 'http://www.google.com/apis/maps/', 'tos' => 'http://www.google.com/apis/maps/terms.html'),
+  );
+}
+
+/**
+ * google address lookup has it's own file now
+ */
+require_once('geocode_google.inc');
+
+function location_geocode_de_google($location = array()) {
+  return location_geocode_google($location, 'de');
+}
+
+function location_geocode_de_google_settings() {
+  return location_geocode_google_settings('de');
 }
 
 /**
@@ -187,7 +225,7 @@ function theme_location_de($location = array(), $hide = array()) {
  *
  */
 function location_get_postalcode_data_de($location = array()) {
-  $dash_index == strpos($location['postal_code'], '-');
+  $dash_index = strpos($location['postal_code'], '-');
   // First we strip slash off if we're dealing with a 9-digit US zipcode
   if ($dash_index === FALSE) {
     $location['postal_code'] = substr($location['postal_code'], 0, $dash_index);
diff --git a/supported/location.us.inc b/supported/location.us.inc
index 1004584..43e1a55 100644
--- a/supported/location.us.inc
+++ b/supported/location.us.inc
@@ -290,48 +290,17 @@ function location_geocode_us_yahoo($location = array()) {
   }
 }
 
-function location_geocode_us_google($location = array()) {
-  $service_url = 'http://maps.google.com/maps/geo?output=xml&key='. variable_get('location_geocode_us_google_apikey', '') .'&q=';
-
-  $address = location_address2singleline($location);
-  
-  $http_reply = drupal_http_request($service_url . urlencode($address));
-  
-  $status_code_match = array();
-  preg_match('/<code>(.*)<\/code>/', $http_reply->data, $status_code_match);
-  $status_code = $status_code_match[1];
-  if ($status_code != 200) {
-    return NULL;
-  }
-  
-  $accuracy_code_match = array();
-  preg_match('/Accuracy="([0-9])"/', $http_reply->data, $accuracy_code_match);
-  $accuracy_code = $accuracy_code_match[1];
-  if ($accuracy_code != 8 && $accuracy_code != 7) {
-    return NULL;
-  }
-  
-  $latlon_match = array();
-  preg_match('/<coordinates>(.*)<\/coordinates>/', $http_reply->data, $latlon_match);
-  
-  $latlon_exploded = explode(',', $latlon_match[1]);
+/**
+ * google address lookup has it's own file now
+ */
+require_once('geocode_google.inc');
   
-  return array('lat' => $latlon_exploded[1], 'lon' => $latlon_exploded[0]);
+function location_geocode_us_google($location = array()) {
+  return location_geocode_google($location, 'us');
 }
 
 function location_geocode_us_google_settings(){
-  $form = array();
-
-  $form['location_geocode_us_google_apikey'] = array(
-    '#type' => 'textfield',
-    '#title' => t('Google Maps API Key'),
-    '#size' => 64,
-    '#maxlength' => 128,
-    '#default_value' => variable_get('location_geocode_us_google_apikey', ''),
-    '#description' => t('In order to use the Google Maps API geocoding web-service, you will need a Google Maps API Key.  You can obtain one at the !sign_up_link for the !google_maps_api.', array('!sign_up_link' => '<a href="http://www.google.com/apis/maps/signup.html">sign-up page</a>', '!google_maps_api' => '<a href="http://www.google.com/apis/maps/">Google Maps API</a>'))
-  );
-
-  return $form;
+  return location_geocode_google_settings('us');
 }
 
 /**
