diff --git a/alpha/includes/alpha.inc b/alpha/includes/alpha.inc
index b4be3e2..886f5ef 100644
--- a/alpha/includes/alpha.inc
+++ b/alpha/includes/alpha.inc
@@ -74,43 +74,6 @@ function alpha_region_get_setting($name, $region, $default = NULL, $theme = NULL
 /**
  * @todo One line description needed.
  *
- * Invokes a preprocess or process hook in all base themes as well as the
- * subtheme (in that order) by including the corresponding .inc file and calling
- * the associated function.
- *
- * @param $type
- *   The type of the hook. Can be preprocess or process.
- * @param $hook
- *   The name of the hook.
- * @param &$vars
- *   An array of variables belonging to the (pre)process hook.
- *   Handed by reference.
- */
-function alpha_invoke($type, $hook, &$vars) {
-  $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 (!function_exists($function)) {
-      $file = drupal_get_path('theme', $key) . '/' . $type . '/' . $type . '-' . str_replace('_', '-', $hook) . '.inc';
-
-      if (is_file($file)) {
-        include $file;
-      }
-    }
-
-    if (function_exists($function)) {
-      $function($vars);
-    }
-  }
-}
-
-/**
- * @todo One line description needed.
- *
  * This function "fixes" drupal_alter so it also works in the theme-settings and
  * anywhere else where you want to be 100% certain that drupal_alter uses the
  * proper global $theme.
diff --git a/alpha/template.php b/alpha/template.php
index 6dda153..3623e64 100644
--- a/alpha/template.php
+++ b/alpha/template.php
@@ -53,12 +53,68 @@ function alpha_theme($existing, $type, $theme, $path) {
 }
 
 /**
+ * Implements hook_theme_registry_alter().
+ */
+function alpha_theme_registry_alter(&$registry) {
+  // Register theme hook and function implementations from
+  foreach (alpha_theme_trail($GLOBALS['theme']) as $key => $theme) {
+    foreach (array('preprocess', 'process', 'theme') as $type) {
+      $path = drupal_get_path('theme', $key);
+      // Only look for files that match the 'something.preprocess.inc' pattern.
+      $mask = '/' . $type . '-(.+)\.inc$/';
+      // This is the length of the suffix (e.g. '.preprocess') of the basename
+      // of a file.
+      $start = strlen($type) + 1;
+      $length = strlen($mask) - 4;
+
+      // Recursively scan the folder for the current step for (pre-)process
+      // files and write them to the registry.
+      foreach (file_scan_directory($path . '/' . $type, $mask) as $item) {
+        $hook = strtr(substr($item->name, $start, $length), '-', '_');
+
+        if (array_key_exists($hook, $registry)) {
+          // Template files override theme functions.
+          if (($type == 'theme' && isset($registry[$hook]['template']))) {
+            continue;
+          }
+
+          // Name of the function (theme hook or theme function).
+          $function = $type == 'theme' ? $key . '_' . $hook : $key . '_alpha_' . $type . '_' . $hook;
+
+          // Load the file once so we can check if the function exists.
+          require_once $item->uri;
+
+          // Proceed if the callback doesn't exist.
+          if (!function_exists($function)) {
+            continue;
+          }
+
+          // By adding this file to the 'includes' array we make sure that it is
+          // available when the hook is executed.
+          $registry[$hook]['includes'][] = $item->uri;
+
+          if ($type == 'theme') {
+            $registry[$hook]['type'] = $key == $GLOBALS['theme'] ? 'theme_engine' : 'base_theme_engine';
+            $registry[$hook]['theme path'] = $path;
+
+            // Replace the theme function.
+            $registry[$hook]['function'] = $function;
+          }
+          else {
+            // Append the included preprocess hook to the array of functions.
+            $registry[$hook][$type . ' functions'][] = $function;
+          }
+        }
+      }
+    }
+  }
+}
+
+/**
  * Implements hook_preprocess().
  */
 function alpha_preprocess(&$vars, $hook) {
   $vars['attributes_array']['class'] = $vars['classes_array'];
-
-  alpha_invoke('preprocess', $hook, $vars);
 }
 
 /**
@@ -98,8 +154,6 @@ function alpha_process(&$vars, $hook) {
 
     $vars['content_attributes'] = $vars['content_attributes_array'] ? drupal_attributes($vars['content_attributes_array']) : '';
   }
-
-  alpha_invoke('process', $hook, $vars);
 }
 
 /**
@@ -225,7 +279,7 @@ function alpha_alpha_page_structure_alter(&$vars) {
         'columns' => $item['columns'],
       );
 
-      $theme->regions[$region]['grid'] = &$temporary[$item['section']][$item['zone']][$region]['#grid'];
+      $theme->regions[$region]['grid'] =& $temporary[$item['section']][$item['zone']][$region]['#grid'];
 
       if (empty($vars[$region])) {
         $temporary[$item['section']][$item['zone']][$region]['#region'] = $region;
@@ -311,7 +365,7 @@ function template_preprocess_zone(&$vars) {
 /**
  * Implements hook_preprocess_block().
  */
-function alpha_alpha_preprocess_block(&$vars) {
+function alpha_preprocess_block(&$vars) {
   $vars['content_attributes_array']['class'][] = 'content';
   $vars['content_attributes_array']['class'][] = 'clearfix';
   $vars['attributes_array']['id'] = $vars['block_html_id'];
@@ -322,7 +376,7 @@ function alpha_alpha_preprocess_block(&$vars) {
 /**
  * Implements hook_preprocess_html().
  */
-function alpha_alpha_preprocess_html(&$vars) {
+function alpha_preprocess_html(&$vars) {
   $theme = alpha_get_theme();
 
   foreach (array('two-sidebars', 'one-sidebar sidebar-first', 'one-sidebar sidebar-second', 'no-sidebars') as $exclude) {
@@ -370,7 +424,7 @@ function alpha_alpha_preprocess_html(&$vars) {
 /**
  * Implements hook_preprocess_page().
  */
-function alpha_alpha_preprocess_page(&$vars) {
+function alpha_preprocess_page(&$vars) {
   $theme = alpha_get_theme();
   $theme->page = &$vars;
 
@@ -388,7 +442,7 @@ function alpha_alpha_preprocess_page(&$vars) {
 /**
  * Implements hook_preprocess_region().
  */
-function alpha_alpha_preprocess_region(&$vars) {
+function alpha_preprocess_region(&$vars) {
   $vars['attributes_array']['id'] = drupal_html_id('region-' . $vars['region']);
   $vars['content_attributes_array']['class'][] = 'region-inner';
   $vars['content_attributes_array']['class'][] = $vars['attributes_array']['id'] . '-inner';
@@ -397,7 +451,7 @@ function alpha_alpha_preprocess_region(&$vars) {
 /**
  * Implements hook_process_page().
  */
-function alpha_alpha_process_page(&$vars) {
+function alpha_process_page(&$vars) {
   $theme = alpha_get_theme();
 
   $vars['title'] = $theme->settings['toggle']['page_title'] ? $vars['title'] : NULL;
diff --git a/omega/template.php b/omega/template.php
index a4ce176..25c437c 100644
--- a/omega/template.php
+++ b/omega/template.php
@@ -25,7 +25,7 @@ function omega_alpha_zones_alter(&$zones, $theme) {
 /**
  * Implements hook_preprocess_html().
  */
-function omega_alpha_preprocess_html(&$vars) {
+function omega_preprocess_html(&$vars) {
   $theme = alpha_get_theme();
   $vars['rdf'] = new stdClass;
 
@@ -66,7 +66,7 @@ function omega_alpha_preprocess_html(&$vars) {
 /**
  * Implements hook_preprocess_comment().
  */
-function omega_alpha_preprocess_comment(&$vars) {
+function omega_preprocess_comment(&$vars) {
   // Prepare the arrays to handle the classes and ids for the node container.
   $vars['attributes_array']['class'][] = 'clearfix';
 
@@ -81,7 +81,7 @@ function omega_alpha_preprocess_comment(&$vars) {
 /**
  * Implements hook_preprocess_zone().
  */
-function omega_alpha_preprocess_zone(&$vars) {
+function omega_preprocess_zone(&$vars) {
   if (alpha_library_active('omega_equalheights')) {
     if (!empty($vars['elements']['#data']['equal_height_container'])) {
       $vars['content_attributes_array']['class'][] = 'equal-height-container';
@@ -92,7 +92,7 @@ function omega_alpha_preprocess_zone(&$vars) {
 /**
  * Implements hook_preprocess_region().
  */
-function omega_alpha_preprocess_region(&$vars) {
+function omega_preprocess_region(&$vars) {
   if (alpha_library_active('omega_equalheights')) {
     if (!empty($vars['elements']['#data']['equal_height_container'])) {
       $vars['content_attributes_array']['class'][] = 'equal-height-container';
@@ -107,7 +107,7 @@ function omega_alpha_preprocess_region(&$vars) {
 /**
  * Implements hook_preprocess_node().
  */
-function omega_alpha_preprocess_node(&$vars) {
+function omega_preprocess_node(&$vars) {
   // Prepare the arrays to handle the classes and ids for the node container.
   $vars['attributes_array']['id'] = drupal_html_id('node-' . $vars['type'] . '-' . $vars['nid']);
 
@@ -150,7 +150,7 @@ function omega_alpha_preprocess_node(&$vars) {
 /**
  * Implements hook_process_region().
  */
-function omega_alpha_process_region(&$vars) {
+function omega_process_region(&$vars) {
   if (in_array($vars['elements']['#region'], array('content', 'menu', 'branding'))) {
     $theme = alpha_get_theme();
 
@@ -187,7 +187,7 @@ function omega_alpha_process_region(&$vars) {
 /**
  * Implements hook_process_zone().
  */
-function omega_alpha_process_zone(&$vars) {
+function omega_process_zone(&$vars) {
   $theme = alpha_get_theme();
 
   if ($vars['elements']['#zone'] == 'content') {
@@ -199,7 +199,7 @@ function omega_alpha_process_zone(&$vars) {
 /**
  * Implements hook_preprocess_block().
  */
-function omega_alpha_preprocess_block(&$vars) {
+function omega_preprocess_block(&$vars) {
   $theme = alpha_get_theme();
 
   // Adding a class to the title attributes
