diff --git a/core/includes/theme.inc b/core/includes/theme.inc
index 40c4f35..92c8f71 100644
--- a/core/includes/theme.inc
+++ b/core/includes/theme.inc
@@ -1798,6 +1798,7 @@ function theme_table($variables) {
   // Add sticky headers, if applicable.
   if (count($header) && $sticky) {
     drupal_add_js('core/misc/tableheader.js');
+    drupal_add_js(array('tableHeaderOffset' => array()), 'setting');
     // Add 'sticky-enabled' class to the table to identify it for JS.
     // This is needed to target tables constructed by this function.
     $attributes['class'][] = 'sticky-enabled';
diff --git a/core/misc/tableheader.js b/core/misc/tableheader.js
index 63de30c..aec47f1 100644
--- a/core/misc/tableheader.js
+++ b/core/misc/tableheader.js
@@ -50,7 +50,7 @@ Drupal.tableHeader = function (table) {
     // Make sure the element being focused is not hidden beneath the sticky
     // table header. Adjust the scrollTop if it does.
     .bind('drupalDisplaceFocus.drupal-tableheader', function (event) {
-      if (self.stickyVisible && event.clientY < (self.stickyOffsetTop + self.stickyTable.outerHeight()) && event.$target.closest('sticky-header').length === 0) {
+      if (self.stickyVisible && event.clientY < (self.stickyOffsetTop() + self.stickyTable.outerHeight()) && event.$target.closest('sticky-header').length === 0) {
         window.scrollBy(0, -self.stickyTable.outerHeight());
       }
     })
@@ -72,14 +72,14 @@ Drupal.tableHeader.prototype.eventhandlerRecalculateStickyHeader = function (eve
   var calculateWidth = event.data && event.data.calculateWidth;
 
   // Reset top position of sticky table headers to the current top offset.
-  this.stickyOffsetTop = Drupal.settings.tableHeaderOffset ? eval(Drupal.settings.tableHeaderOffset + '()') : 0;
-  this.stickyTable.css('top', this.stickyOffsetTop + 'px');
+  var stickyOffsetTop = this.stickyOffsetTop();
+  this.stickyTable.css('top', stickyOffsetTop + 'px');
 
   // Save positioning data.
   var viewHeight = document.documentElement.scrollHeight || document.body.scrollHeight;
   if (calculateWidth || this.viewHeight !== viewHeight) {
     this.viewHeight = viewHeight;
-    this.vPosition = this.originalTable.offset().top - 4 - this.stickyOffsetTop;
+    this.vPosition = this.originalTable.offset().top - 4 - stickyOffsetTop;
     this.hPosition = this.originalTable.offset().left;
     this.vLength = this.originalTable[0].clientHeight - 100;
     calculateWidth = true;
@@ -104,4 +104,20 @@ Drupal.tableHeader.prototype.eventhandlerRecalculateStickyHeader = function (eve
   }
 };
 
+/**
+ * Allow plugins to define
+ */
+Drupal.tableHeader.prototype.stickyOffsetTop = function () {
+  var offset = 0;
+  var headerOffset = Drupal.settings.tableHeaderOffset;
+  var localOffset, i, imax = headerOffset && headerOffset.length;
+  if (imax) {
+    for (i = 0; i < imax; i += 1) {
+      localOffset = headerOffset[i]();
+      offset += !isNaN(localOffset) ? localOffset : 0;
+    }
+  }
+  return offset;
+}
+
 })(jQuery);
diff --git a/core/modules/overlay/overlay-child.js b/core/modules/overlay/overlay-child.js
index e78e383..67041ec 100644
--- a/core/modules/overlay/overlay-child.js
+++ b/core/modules/overlay/overlay-child.js
@@ -173,20 +173,17 @@ Drupal.overlayChild.behaviors.shortcutAddLink = function (context, settings) {
 /**
  * Use displacement from parent window.
  */
-Drupal.overlayChild.behaviors.alterTableHeaderOffset = function (context, settings) {
+Drupal.overlayChild.behaviors.tableHeaderOffset = function (context, settings) {
   if (Drupal.settings.tableHeaderOffset) {
-    Drupal.overlayChild.prevTableHeaderOffset = Drupal.settings.tableHeaderOffset;
+    Drupal.settings.tableHeaderOffset.push(Drupal.overlayChild.tableHeaderOffset);
   }
-  Drupal.settings.tableHeaderOffset = 'Drupal.overlayChild.tableHeaderOffset';
 };
 
 /**
  * Callback for Drupal.settings.tableHeaderOffset.
  */
 Drupal.overlayChild.tableHeaderOffset = function () {
-  var topOffset = Drupal.overlayChild.prevTableHeaderOffset ? eval(Drupal.overlayChild.prevTableHeaderOffset + '()') : 0;
-
-  return topOffset + parseInt($(document.body).css('marginTop'));
+  return parseInt($(document.body).css('marginTop'), 10);
 };
 
 })(jQuery);
diff --git a/core/modules/toolbar/toolbar.js b/core/modules/toolbar/toolbar.js
index 5b61634..49cfe01 100644
--- a/core/modules/toolbar/toolbar.js
+++ b/core/modules/toolbar/toolbar.js
@@ -6,7 +6,11 @@ Drupal.toolbar = Drupal.toolbar || {};
  * Attach toggling behavior and notify the overlay of the toolbar.
  */
 Drupal.behaviors.toolbar = {
-  attach: function(context) {
+  attach: function(context, settings) {
+    // Add toolbar offset to sticky table headers.
+    if (settings.tableHeaderOffset) {
+      settings.tableHeaderOffset.push(Drupal.toolbar.height);
+    }
 
     // Set the initial state of the toolbar.
     $('#toolbar', context).once('toolbar', Drupal.toolbar.init);
diff --git a/core/modules/toolbar/toolbar.module b/core/modules/toolbar/toolbar.module
index 254a419..4a7fb1d 100644
--- a/core/modules/toolbar/toolbar.module
+++ b/core/modules/toolbar/toolbar.module
@@ -196,10 +196,6 @@ function toolbar_view() {
     '#attached'=> array(
       'js' => array(
         $module_path . '/toolbar.js',
-        array(
-          'data' => array('tableHeaderOffset' => 'Drupal.toolbar.height'),
-          'type' => 'setting'
-        ),
       ),
       'css' => array(
         $module_path . '/toolbar.css',
