diff --git a/core/misc/tableheader.js b/core/misc/tableheader.js
index 63de30c..dec3467 100644
--- a/core/misc/tableheader.js
+++ b/core/misc/tableheader.js
@@ -1,6 +1,11 @@
 (function ($) {
 
 /**
+ * Array of functions allowing to get the header offset.
+ */
+Drupal.settings.tableHeaderOffset = [];
+
+/**
  * Attaches sticky table headers.
  */
 Drupal.behaviors.tableHeader = {
@@ -50,7 +55,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 +77,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 +109,20 @@ Drupal.tableHeader.prototype.eventhandlerRecalculateStickyHeader = function (eve
   }
 };
 
+/**
+ * Sum functions defining an offset for tableheader position.
+ */
+Drupal.tableHeader.prototype.stickyOffsetTop = function () {
+  var offset = 0;
+  var headerOffset = Drupal.settings.tableHeaderOffset;
+  var localOffset, i, imax;
+  if (headerOffset && headerOffset.length) {
+    for (i = 0, imax = headerOffset.length; 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..9856cb6 100644
--- a/core/modules/overlay/overlay-child.js
+++ b/core/modules/overlay/overlay-child.js
@@ -1,4 +1,3 @@
-
 (function ($) {
 
 /**
@@ -173,20 +172,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',
