diff --git a/dfp.admin.inc b/dfp.admin.inc
index a01fe6b..11853ef 100644
--- a/dfp.admin.inc
+++ b/dfp.admin.inc
@@ -71,6 +71,27 @@ function dfp_admin_settings($form, $form_state) {
     '#default_value' => variable_get('dfp_async_rendering', 1),
     '#description' => t('This can speed up page rendering time by loading page content without waiting for ads to load.'),
   );
+
+  $options = array(
+    'snippet' => t('Inline snippet'),
+    'defer' => t('Script tag with defer attribute'),
+  );
+  if (module_exists('advagg')) {
+    $options['async'] = t('Script tag with async and defer attributes');
+  }
+  $form['global_tag_settings']['dfp_async_load_mode'] = array(
+    '#type' => 'radios',
+    '#title' => t('Asynchonous loading mode'),
+    '#options' => $options,
+    '#default_value' => variable_get('dfp_async_load_mode', 'snippet'),
+    '#description' => t('Select the asynchronous loading method of the . Inline snippet is the default and recommended by Google. "Async and defer" method is only available if <a href="!url">advagg module</a> is enabled.'),
+    '#states' => array(
+      'visible' => array(
+        'input[name="dfp_async_rendering"]' => array('checked' => TRUE),
+      ),
+    ),
+  );
+
   $form['global_tag_settings']['dfp_disable_init_load'] = array(
     '#type' => 'checkbox',
     '#title' => t('Disable initial ad load'),
diff --git a/dfp.admin.js b/dfp.admin.js
index b49d929..f66f275 100644
--- a/dfp.admin.js
+++ b/dfp.admin.js
@@ -25,9 +25,11 @@ Drupal.behaviors.dfpVerticalTabs = {
       var adUnit = Drupal.checkPlain($('#edit-dfp-default-adunit', context).val());
       var async = Drupal.checkPlain($('#edit-dfp-async-rendering', context).is(':checked'));
       var single = Drupal.checkPlain($('#edit-dfp-single-request', context).is(':checked'));
+      var asyncMode = Drupal.checkPlain($('input[name="dfp_async_load_mode"]:checked', context).val());
 
       summary = 'Network Id: ' + networkId + '<br/>';
       summary += (async == "true" ? checkmark : exmark) + ' Load ads asyncronously' + '<br/>';
+      summary += (async == "true") ? 'Loaded via ' + asyncMode + '<br/>' : '';
       summary += (single == "true" ? checkmark : exmark) + ' Use a single request';
 
       return summary;
diff --git a/dfp.module b/dfp.module
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);
 }
diff --git a/theme/dfp_tag.tpl.php b/theme/dfp_tag.tpl.php
index 0dd89d7..9cb6055 100644
--- a/theme/dfp_tag.tpl.php
+++ b/theme/dfp_tag.tpl.php
@@ -10,8 +10,12 @@
     print drupal_render($slug);
   endif; ?>
   <script type="text/javascript">
+    <?php if ($async_rendering): ?>
     googletag.cmd.push(function() {
+    <?php endif; ?>
       googletag.display("<?php print $tag->placeholder_id ?>");
+    <?php if ($async_rendering): ?>
     });
+    <?php endif; ?>
   </script>
 </div>
