diff --git a/modules/geofield_map/geofield_map.module b/modules/geofield_map/geofield_map.module
index 50a0131..bd4c7a9 100644
--- a/modules/geofield_map/geofield_map.module
+++ b/modules/geofield_map/geofield_map.module
@@ -92,7 +92,6 @@ function geofield_map_field_formatter_view($entity_type, $entity, $field, $insta
     $element[0] = array(
       '#attached' => array(
         'js' => array(
-          '//maps.googleapis.com/maps/api/js?sensor=false' => array('type' => 'external'),
           drupal_get_path('module', 'geofield_map') . '/js/GeoJSON.js',
           drupal_get_path('module', 'geofield_map') . '/js/geofield_map.js',
           array('data' => array('geofieldMap' => $js_settings), 'type' => 'setting'),
diff --git a/modules/geofield_map/includes/geofield_map_plugin_style_map.inc b/modules/geofield_map/includes/geofield_map_plugin_style_map.inc
index 656de1e..bdc3f08 100644
--- a/modules/geofield_map/includes/geofield_map_plugin_style_map.inc
+++ b/modules/geofield_map/includes/geofield_map_plugin_style_map.inc
@@ -151,7 +151,6 @@ class geofield_map_plugin_style_map extends views_plugin_style {
       drupal_add_js(array('geofieldMap' => $js_settings), 'setting');
     }
 
-    drupal_add_js('//maps.googleapis.com/maps/api/js?sensor=false', 'external');
     drupal_add_js(drupal_get_path('module', 'geofield_map') . '/js/GeoJSON.js');
     drupal_add_js(drupal_get_path('module', 'geofield_map') . '/js/geofield_map.js');
 
diff --git a/modules/geofield_map/js/geofield_map.js b/modules/geofield_map/js/geofield_map.js
index cfc7dc5..81f1020 100644
--- a/modules/geofield_map/js/geofield_map.js
+++ b/modules/geofield_map/js/geofield_map.js
@@ -1,7 +1,29 @@
 (function ($) {
+
+  Drupal.GeoFieldMap = Drupal.GeoFieldMap || {
+    apiLoading: false,
+    apiLoaded: false,
+
+    // Queues behaviors calls until the Maps API finishes loading
+    loadBehaviors: []
+  };
+
   Drupal.behaviors.geofieldMap = {
     attach: function(context, settings) {
       
+      // Maps is still loading, so return
+      if(Drupal.GeoFieldMap.apiLoading) {
+        Drupal.GeoFieldMap.loadBehaviors.push({context: context, settings: settings});
+        return;
+      }
+
+      // Maps API isn't loaded yet, so load and wait for callback
+      if(!Drupal.GeoFieldMap.apiLoaded) {
+        Drupal.GeoFieldMap.loadBehaviors.push({context: context, settings: settings});
+        Drupal.GeoFieldMap.loadMapsApi();
+        return;
+      }
+
       $('.geofieldMap', context).once('geofield-processed', function(index, element) {
         var data = undefined;
         var map_settings = [];
@@ -14,9 +36,6 @@
             map_settings = settings.geofieldMap[elemID].map_settings;
         }
 
-        // Checking to see if google variable exists. We need this b/c views breaks this sometimes. Probably
-        // an AJAX/external javascript bug in core or something.
-        if (typeof google != 'undefined' && typeof google.maps.ZoomControlStyle != 'undefined' && data != undefined) {
           var features = GeoJSON(data);
           // controltype
           var controltype = map_settings.controltype;
@@ -59,6 +78,10 @@
           };
 
           var map = new google.maps.Map($(element).get(0), myOptions);
+
+          // Let other scripts interact with this map
+          $(window).trigger('geofieldMapAvailable', map);
+
           var range = new google.maps.LatLngBounds();
 
           var infowindow = new google.maps.InfoWindow({
@@ -90,7 +113,6 @@
           } else {
             map.setCenter(range.getCenter());
           }
-        }
         
         function placeFeature(feature, map, range) {
           var properties = feature.get('geojsonProperties');
@@ -118,5 +140,34 @@
         }
       });
     }
+  };
+
+  /**
+   * Load the Maps API
+   */
+  Drupal.GeoFieldMap.loadMapsApi = function() {
+    Drupal.GeoFieldMap.apiLoading = true;
+
+    var script = document.createElement("script");
+    script.type = "text/javascript";
+    script.src = "http://maps.googleapis.com/maps/api/js?sensor=false&callback=Drupal.GeoFieldMap.onApiLoaded";
+    document.body.appendChild(script);
+  };
+
+  /**
+   * Maps loaded callback
+   */
+  Drupal.GeoFieldMap.onApiLoaded = function() {
+    Drupal.GeoFieldMap.apiLoading = false;
+    Drupal.GeoFieldMap.apiLoaded = true;
+
+    // Run the queued behaviors
+    $.each(Drupal.GeoFieldMap.loadBehaviors, function() {
+      Drupal.attachBehaviors(this.context, this.settings);
+    });
+
+    // Trigger event other scripts can attach to
+    $(window).trigger('geofieldMapApiLoaded');
   }
+
 })(jQuery);
