diff --git modules/overlay/overlay-parent.js modules/overlay/overlay-parent.js
index bba9535..159b42f 100644
--- modules/overlay/overlay-parent.js
+++ modules/overlay/overlay-parent.js
@@ -7,6 +7,10 @@
  */
 Drupal.behaviors.overlayParent = {
   attach: function (context, settings) {
+    if (Drupal.overlay.isOpen) {
+      Drupal.overlay.updateTabindex(context);
+    }
+
     if (this.processed) {
       return;
     }
@@ -79,6 +83,7 @@ Drupal.overlay.open = function (url) {
   this.isOpening = false;
   this.isOpen = true;
   $(document.documentElement).addClass('overlay-open');
+  this.updateTabindex();
 
   // Allow other scripts to respond to this event.
   $(document).trigger('drupalOverlayOpen');
@@ -121,8 +126,7 @@ Drupal.overlay.create = function () {
     .bind('drupalOverlayClose' + eventClass, $.proxy(this, 'eventhandlerRefreshPage'))
     .bind('drupalOverlayBeforeClose' + eventClass +
           ' drupalOverlayBeforeLoad' + eventClass +
-          ' drupalOverlayResize' + eventClass, $.proxy(this, 'eventhandlerDispatchEvent'))
-    .bind('keydown' + eventClass, $.proxy(this, 'eventhandlerRestrictKeyboardNavigation'));
+          ' drupalOverlayResize' + eventClass, $.proxy(this, 'eventhandlerDispatchEvent'));
 
   if ($('.overlay-displace-top, .overlay-displace-bottom').length) {
     $(document)
@@ -158,8 +162,6 @@ Drupal.overlay.load = function (url) {
   // entry using URL fragments.
   iframeDocument.location.replace(url);
 
-  // Immediately move the focus to the iframe.
-  this.inactiveFrame.focus();
   return true;
 };
 
@@ -188,6 +190,7 @@ Drupal.overlay.close = function () {
   $(document.documentElement).removeClass('overlay-open');
   // Restore the original document title.
   document.title = this.originalTitle;
+  this.restoreTabindex();
 
   // Allow other scripts to respond to this event.
   $(document).trigger('drupalOverlayClose');
@@ -206,8 +209,6 @@ Drupal.overlay.close = function () {
  */
 Drupal.overlay.destroy = function () {
   $([document, window]).unbind('.drupal-overlay-open');
-  this.$iframeA.unbind('.drupal-overlay');
-  this.$iframeB.unbind('.drupal-overlay');
   this.$container.remove();
 
   this.$container = null;
@@ -271,7 +272,8 @@ Drupal.overlay.loadChild = function (event) {
 
   this.isLoading = false;
   $(document.documentElement).removeClass('overlay-loading');
-  event.data.sibling.removeClass('overlay-active');
+  event.data.sibling.removeClass('overlay-active').attr({ 'tabindex': -1 });
+  this.$container.attr('aria-busy', 'false');
 
   // Only continue when overlay is still open and not closing.
   if (this.isOpen && !this.isClosing) {
@@ -289,6 +291,9 @@ Drupal.overlay.loadChild = function (event) {
       // Load an empty document into the inactive iframe.
       (this.inactiveFrame[0].contentDocument || this.inactiveFrame[0].contentWindow.document).location.replace('about:blank');
 
+      this.activeFrame.focus();
+      iframeWindow.jQuery('a:first').focus();
+
       // Allow other scripts to respond to this event.
       $(document).trigger('drupalOverlayLoad');
     }
@@ -625,37 +630,6 @@ Drupal.overlay.eventhandlerRefreshPage = function (event) {
 };
 
 /**
- * Event handler: makes sure that when the overlay is open no elements (except
- * for elements inside any displaced elements) of the parent document are
- * reachable through keyboard (TAB) navigation.
- *
- * @param event
- *   Event being triggered, with the following restrictions:
- *   - event.type: keydown
- *   - event.currentTarget: document
- */
-Drupal.overlay.eventhandlerRestrictKeyboardNavigation = function (event) {
-  if (!this.$tabbables) {
-    this.$tabbables = $(':tabbable');
-  }
-
-  if (event.keyCode && event.keyCode == $.ui.keyCode.TAB) {
-    // Whenever the focus is not inside the overlay (or a displaced element)
-    // move the focus along until it is.
-    var direction = event.shiftKey ? -1 : 1;
-    var current = this.$tabbables.index(event.target);
-    var $allowedParent = '#overlay-container, .overlay-displace-top, .overlay-displace-bottom';
-    if (current != -1 && this.$tabbables[current + direction] && !this.$tabbables.eq(current + direction).closest($allowedParent).length) {
-      while (this.$tabbables[current + direction] && !this.$tabbables.eq(current + direction).closest($allowedParent).length) {
-        current = current + direction;
-      }
-      // Move focus.
-      this.$tabbables.eq(current).focus();
-    }
-  }
-};
-
-/**
  * Event handler: dispatches events to the overlay document.
  *
  * @param event
@@ -813,6 +787,50 @@ Drupal.overlay.getDisplacement = function (region) {
 };
 
 /**
+ * Makes a group of elements unreachable via the tab key.
+ *
+ * @param context
+ *   A DOM Element or jQuery to use as context.
+ */
+Drupal.overlay.updateTabindex = function (context) {
+  var tabbables = {'A': true, 'AREA': true, 'BUTTON': true, 'INPUT': true, 'OBJECT': true, 'SELECT': true, 'TEXTAREA': true};
+  var el, tabindex;
+  $('*', context || document.body).each(function () {
+    if (tabbables[this.nodeName]) {
+      el = $(this);
+      if (el.closest('#overlay-container, .overlay-displace-top, .overlay-displace-bottom').length !== 0) {
+        return;
+      }
+      tabindex = el.attr('tabIndex');
+      $.data(this, 'drupalOverlayOriginalTabIndex', tabindex == undefined ? 0 : tabindex);
+      el.attr('tabIndex', -1);
+    }
+  });
+};
+
+/**
+ * Restores the original tabindex value to a group of elements.
+ *
+ * @param context
+ *   A DOM Element or jQuery to use as context.
+ */
+Drupal.overlay.restoreTabindex = function (context) {
+  $('*[tabindex]', context || document.body).each(function () {
+    var el = $(this);
+    if (el.closest('#overlay-container, .overlay-displace-top, .overlay-displace-bottom').length !== 0) {
+      return;
+    }
+    var tabindex = $.data(this, 'drupalOverlayOriginalTabIndex');
+    if (tabindex) {
+      el.attr('tabIndex', tabindex);
+    }
+    else {
+      el.removeAttr('tabIndex');
+    }
+  });
+};
+
+/**
  * Theme function to create the overlay iframe element.
  */
 Drupal.theme.prototype.overlayContainer = function () {
