diff --git a/alpha/includes/alpha.inc b/alpha/includes/alpha.inc
index 5a510fb..05d001c 100644
--- a/alpha/includes/alpha.inc
+++ b/alpha/includes/alpha.inc
@@ -87,24 +87,35 @@ function alpha_region_get_setting($name, $region, $default = NULL, $theme = NULL
  *   Handed by reference.
  */
 function alpha_invoke($type, $hook, &$vars) {
+  $paths = &drupal_static('alpha_invoke_paths', array());
+  $functions = &drupal_static('alpha_invoke_functions', array());
   $theme = alpha_get_theme();
 
   // If one of the themes in the theme trail implements this hook
   // include the corresponding .inc file and call the associated function.
-  foreach (alpha_theme_trail($theme->theme) as $key => $name) {
-    $function = $key . '_alpha_' . $type . '_' . $hook;
+  if (!isset($functions[$theme->theme][$hook][$type])) {
+    $functions[$theme->theme][$hook][$type] = array();
 
-    if (!function_exists($function)) {
-      $file = drupal_get_path('theme', $key) . '/' . $type . '/' . $type . '-' . str_replace('_', '-', $hook) . '.inc';
+    foreach (alpha_theme_trail($theme->theme) as $key => $name) {
+      $function = $key . '_alpha_' . $type . '_' . $hook;
 
-      if (is_file($file)) {
-        include $file;
+      if (!function_exists($function)) {
+        if (!isset($paths[$key])) {
+          $paths[$key] = drupal_get_path('theme', $key);
+        }
+        $file = $paths[$key] . '/' . $type . '/' . $type . '-' . str_replace('_', '-', $hook) . '.inc';
+        if (is_file($file)) {
+          include $file;
+        }
+      }
+      if (function_exists($function)) {
+        $functions[$theme->theme][$hook][$type][] = $function;
       }
     }
+  }
 
-    if (function_exists($function)) {
-      $function($vars);
-    }
+  foreach ($functions[$theme->theme][$hook][$type] as $function) {
+    $function($vars);
   }
 }
 
