diff --git a/core/misc/tableheader.js b/core/misc/tableheader.js
index 543862c..15578df 100644
--- a/core/misc/tableheader.js
+++ b/core/misc/tableheader.js
@@ -1,6 +1,12 @@
 (function ($) {
 
 /**
+ * Object of functions indexed by module name that will be used to
+ * compute the header offset.
+ */
+$.extend(true, Drupal.settings, {tableHeaderOffset: {}});
+
+/**
  * Attaches sticky table headers.
  */
 Drupal.behaviors.tableHeader = {
@@ -25,7 +31,7 @@ Drupal.tableHeader = function (table) {
   var self = this;
 
   this.originalTable = $(table);
-  this.originalHeader = $(table).children('thead');
+  this.originalHeader = this.originalTable.children('thead');
   this.originalHeaderCells = this.originalHeader.find('> tr > th');
   this.displayWeight = null;
 
@@ -45,6 +51,7 @@ Drupal.tableHeader = function (table) {
     .hide()
     .appendTo(this.stickyTable);
   this.stickyHeaderCells = this.stickyHeader.find('> tr > th');
+  this.stickyOffsetTop = 0;
 
   this.originalTable.addClass('sticky-table');
   $(window)
@@ -80,15 +87,16 @@ 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.computeStickyOffsetTop();
   this.stickyTable.css('top', this.stickyOffsetTop + 'px');
 
   // Save positioning data.
   var viewHeight = document.documentElement.scrollHeight || document.body.scrollHeight;
   if (calculateWidth || this.viewHeight !== viewHeight) {
+    var originalTableOffset = this.originalTable.offset();
     this.viewHeight = viewHeight;
-    this.vPosition = this.originalTable.offset().top - 4 - this.stickyOffsetTop;
-    this.hPosition = this.originalTable.offset().left;
+    this.vPosition = originalTableOffset.top - 4 - this.stickyOffsetTop;
+    this.hPosition = originalTableOffset.left;
     this.vLength = this.originalTable[0].clientHeight - 100;
     calculateWidth = true;
   }
@@ -124,4 +132,22 @@ Drupal.tableHeader.prototype.eventhandlerRecalculateStickyHeader = function (eve
   }
 };
 
+/**
+ * Sum functions defining an offset for tableheader position.
+ */
+Drupal.tableHeader.prototype.computeStickyOffsetTop = function () {
+  var offset = 0;
+  var headerOffset = Drupal.settings.tableHeaderOffset;
+  var localOffset, i;
+  if (headerOffset) {
+    for (i in headerOffset) {
+      if (headerOffset.hasOwnProperty(i)) {
+        localOffset = headerOffset[i]();
+        offset += !isNaN(localOffset) ? localOffset : 0;
+      }
+    }
+  }
+  this.stickyOffsetTop = offset;
+};
+
 })(jQuery);
diff --git a/core/modules/overlay/overlay-child.js b/core/modules/overlay/overlay-child.js
index e78e383..e9f3ad9 100644
--- a/core/modules/overlay/overlay-child.js
+++ b/core/modules/overlay/overlay-child.js
@@ -1,4 +1,3 @@
-
 (function ($) {
 
 /**
@@ -173,20 +172,15 @@ Drupal.overlayChild.behaviors.shortcutAddLink = function (context, settings) {
 /**
  * Use displacement from parent window.
  */
-Drupal.overlayChild.behaviors.alterTableHeaderOffset = function (context, settings) {
-  if (Drupal.settings.tableHeaderOffset) {
-    Drupal.overlayChild.prevTableHeaderOffset = Drupal.settings.tableHeaderOffset;
-  }
-  Drupal.settings.tableHeaderOffset = 'Drupal.overlayChild.tableHeaderOffset';
+Drupal.overlayChild.behaviors.tableHeaderOffset = function (context, settings) {
+  $.extend(true, Drupal.settings, {tableHeaderOffset: {overlay: 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..6dce5f0 100644
--- a/core/modules/toolbar/toolbar.js
+++ b/core/modules/toolbar/toolbar.js
@@ -6,7 +6,8 @@ Drupal.toolbar = Drupal.toolbar || {};
  * Attach toggling behavior and notify the overlay of the toolbar.
  */
 Drupal.behaviors.toolbar = {
-  attach: function(context) {
+  attach: function(context, settings) {
+    $.extend(true, settings, {tableHeaderOffset: {toolbar: 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 4b1b893..7b4be2b 100644
--- a/core/modules/toolbar/toolbar.module
+++ b/core/modules/toolbar/toolbar.module
@@ -194,10 +194,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',
