index 51b249d..54f2c5b 100644
--- a/dfp.module
+++ b/dfp.module
@@ -662,6 +662,8 @@ function _dfp_get_ad_category($term, $clean_string = FALSE) {
  * slot definitions.
  */
 function _dfp_js_global_settings() {
+  $async_rendering = variable_get('dfp_async_rendering', 1);
+
   // Initialize the google varibales and inject user-defined javascript.
   $js = 'var googletag = googletag || {};' . "\n";
   $js .= 'googletag.cmd = googletag.cmd || [];';
@@ -679,17 +681,42 @@ function _dfp_js_global_settings() {
   );
   drupal_add_js($js, $options);
 
-  // Inlclude a script tag for the Google Tag Services.
-  // @todo: One day this should include an async=true attribute. See #1140356.
-  //        However, there is a good chance this might break <= IE8.
-  $options['type'] = 'external';
+  // Load Google Tag Services external library.
+  $protocol = $GLOBALS['is_https'] ? 'https://' : 'http://';
   $options['weight']++;
-  drupal_add_js(($GLOBALS['is_https'] ? "https://" : "http://") . DFP_GOOGLE_TAG_SERVICES_URL, $options);
+
+  if ($async_rendering) {
+    $mode = variable_get('dfp_async_load_mode', 'snippet');
+    switch ($mode) {
+      case 'snippet':
+        $js = '(function() {' . "\n";
+        $js .= '  var gads = document.createElement("script"); gads.async = true;' . "\n";
+        $js .= '  gads.src = "' . $protocol . DFP_GOOGLE_TAG_SERVICES_URL . '"' . "\n";
+        $js .= '  var node = document.getElementsByTagName("script")[0];' . "\n";
+        $js .= '  node.parentNode.insertBefore(gads, node);' . "\n";
+        $js .= '}());';
+        break;
+      case 'async':
+        $options['async'] = TRUE;
+      case 'defer':
+        $js = $protocol . DFP_GOOGLE_TAG_SERVICES_URL;
+        $options['type'] = 'external';
+        $options['defer'] = 'defer';
+        break;
+    }
+  }
+  else {
+    $options['type'] = 'external';
+    $js = $protocol . DFP_GOOGLE_TAG_SERVICES_URL;
+  }
+
+  drupal_add_js($js, $options);
+
 
   // Add global settings with a heavy weight so that they appear after all the
   // defineSlot() calls otherwise IE8 and Opera fail to display ads properly.
-  $js = 'googletag.cmd.push(function() {' . "\n";
-  if (variable_get('dfp_async_rendering', 1)) {
+  $js = '';
+  if ($async_rendering) {
     $js .= '  googletag.pubads().enableAsyncRendering();' . "\n";
   }
   else {
@@ -720,9 +747,13 @@ function _dfp_js_global_settings() {
     }
   }
 
-  $js .= '});' . "\n";
-  $js .= variable_get('dfp_injected_js2', '') . "\n";
-  $js .= 'googletag.enableServices();';
+  $js .= '  googletag.enableServices();' . "\n";
+  $js .= variable_get('dfp_injected_js2', '');
+
+  // Add wrapper for asynchronous mode.
+  if ($async_rendering) {
+    $js = 'googletag.cmd.push(function() {' . "\n" . $js . "\n" . '});' . "\n";
+  }
 
   $options = array(
     'type' => 'inline',
@@ -789,6 +820,11 @@ function _dfp_js_slot_definition($tag) {
   }
   $js = rtrim($js, "\n") . ';';
 
+  // Add wrapper for asynchronous mode.
+  if (variable_get('dfp_async_rendering', 1)) {
+    $js = 'googletag.cmd.push(function() {' . "\n" . $js . "\n" . '});' . "\n";
+  }
+
   $options = array(
     'type' => 'inline',
     'group' => JS_LIBRARY,
@@ -872,6 +908,9 @@ function template_preprocess_dfp_tag(&$variables) {
     );
   }
 
+  // Export variable to template.
+  $variables['async_rendering'] = $async_rendering = variable_get('dfp_async_rendering', 1);
+
   // Define a javascript ad slot for this tag.
   _dfp_js_slot_definition($tag);
 }