diff --git a/coder_review/coder_review.api.php b/coder_review/coder_review.api.php
index b6fe391..43f666c 100644
--- a/coder_review/coder_review.api.php
+++ b/coder_review/coder_review.api.php
@@ -5,6 +5,10 @@
  * Coder hook function api documentation.
  */
 
-// @TODO : document hook_reviews()
-function hook_reviews() {
+// @TODO : document hook_coder_review_info() and hook_coder_review_info_alter()
+function hook_coder_review_info() {
+}
+
+function hook_coder_review_info_alter() {
+
 }
diff --git a/coder_review/coder_review.drush.inc b/coder_review/coder_review.drush.inc
index 7944b1d..3a7c183 100644
--- a/coder_review/coder_review.drush.inc
+++ b/coder_review/coder_review.drush.inc
@@ -74,7 +74,7 @@ function coder_review_drush_review() {
   $output = array();
   $settings = _coder_review_get_default_settings();
   if (count($args)) {
-    $avail_reviews = _coder_review_reviews();
+    $avail_reviews = coder_review_get_coder_review_info();
     foreach ($args as $arg) {
       switch ($arg) {
         case 'summary':
diff --git a/coder_review/coder_review.module b/coder_review/coder_review.module
index 1eb106f..6d6d998 100644
--- a/coder_review/coder_review.module
+++ b/coder_review/coder_review.module
@@ -54,33 +54,44 @@ function coder_review_help($page, $arg) {
       return t('Coder provides helpful hints without false positives, but offers no guarantee for creating good code. You are the final arbitrar. If in doubt, read the Drupal documentation (see review links below and <a href="@api">api.drupal.org</a>).', array('@api' => 'http://api.drupal.org'));
 
     case 'drush:coder_review':
-      return t('coder_review [summary] [@reviews] [minor|major|critical] [active|core|all|default|<modules>] [no-<module>]', array('@reviews' => implode('|', array_keys(_coder_review_reviews()))));
+      return t('coder_review [summary] [@reviews] [minor|major|critical] [active|core|all|default|<modules>] [no-<module>]', array('@reviews' => implode('|', array_keys(coder_review_get_coder_review_info()))));
   }
 }
 
 /**
  * Get all of the code review modules, including contributions.
  */
-function _coder_review_reviews() {
-  return module_invoke_all('reviews');
+function coder_review_get_coder_review_info() {
+  $reviews = &drupal_static(__FUNCTION__);
+
+  if (!isset($reviews)) {
+    $cid = 'review:info:' . $GLOBALS['language']->language;
+    if ($cache = cache_get($cid, 'cache_coder')) {
+      $reviews = $cache->data;
+    }
+    else {
+      $reviews = module_invoke_all('coder_review_info');
+      drupal_alter('coder_review_info', $reviews);
+      cache_set($cid, $reviews, 'cache_coder');
+    }
+  }
+
+  return $reviews;
 }
 
 /**
- * Implements hook_reviews().
+ * Implements hook_coder_review_info().
  */
-function coder_review_reviews() {
-  global $_coder_reviews;
-  if (!isset($_coder_reviews)) {
-    $_coder_reviews = array();
-    $path = drupal_get_path('module', 'coder_review') . '/includes';
-    $files = drupal_system_listing('/coder_review_.*\.inc$/', $path, 'filepath', 0);
-    foreach ($files as $file) {
-      require_once DRUPAL_ROOT . '/' . $file->uri;
-      $function = $file->name . '_reviews';
-      if (function_exists($function)) {
-        if ($review = call_user_func($function)) {
-          $_coder_reviews = array_merge($_coder_reviews, $review);
-        }
+function coder_review_coder_review_info() {
+  $_coder_reviews = array();
+  $path = drupal_get_path('module', 'coder_review') . '/includes';
+  $files = drupal_system_listing('/coder_review_.*\.inc$/', $path, 'filepath', 0);
+  foreach ($files as $file) {
+    require_once DRUPAL_ROOT . '/' . $file->uri;
+    $function = $file->name . '_coder_review_info';
+    if (function_exists($function)) {
+      if ($review = call_user_func($function)) {
+        $_coder_reviews = array_merge($_coder_reviews, $review);
       }
     }
   }
@@ -248,7 +259,7 @@ function _coder_review_settings_form($settings, &$system, &$files) {
 
   // Create the list of review options from the coder review plug-ins.
   // Maintain a secondary list based on #title only, to make sorting possible.
-  $reviews = _coder_review_reviews();
+  $reviews = coder_review_get_coder_review_info();
   foreach ($reviews as $name => $review) {
     $review_options[$name] = isset($review['#link']) ? l($review['#title'], $review['#link']) : $review['#title'];
     if (isset($review['#description'])) {
@@ -794,7 +805,7 @@ function coder_review_page_form($form, &$form_state, $arg = '') {
 
   // Get this once: list of the reviews to perform.
   $reviews = array();
-  $avail_reviews = _coder_review_reviews();
+  $avail_reviews = coder_review_get_coder_review_info();
   $selected_reviews = $settings['coder_reviews'];
   foreach ($selected_reviews as $name => $checked) {
     if ($checked) {
@@ -1094,7 +1105,7 @@ function _coder_review_modified() {
  *
  * @param $coder_args
  *   Array of coder arguments, valid arguments are:
- *     - '#reviews' => array list of reviews to perform, see _coder_review_reviews();
+ *     - '#reviews' => array list of reviews to perform, see coder_review_get_coder_review_info();
  *     - '#severity' => integer magic number, see constants SEVERITY_*;
  *     - '#filename' => string filename to check,
  *     - '#patch' => string patch lines to check,
@@ -1108,7 +1119,7 @@ function _coder_review_modified() {
 function do_coder_reviews($coder_args) {
   // Load the cached results if they exist, but not for patches.
   if (empty($coder_args['#patch']) && empty($coder_args['#test']) && $coder_args['#cache']) {
-    $cache_key = 'coder:' . md5(implode(':', array_keys($coder_args['#reviews']))) . $coder_args['#severity'] . ':' . $coder_args['#filename'];
+    $cache_key = 'review:' . md5(implode(':', array_keys($coder_args['#reviews']))) . $coder_args['#severity'] . ':' . $coder_args['#filename'];
     if (function_exists('_coder_review_drush_is_option') && _coder_review_drush_is_option('drush')) {
       if (_coder_review_drush_is_option('checkstyle')) {
         $cache_key .= ':drushcheckstyle';
diff --git a/coder_review/includes/coder_review_47.inc b/coder_review/includes/coder_review_47.inc
index 8fa2349..868c373 100644
--- a/coder_review/includes/coder_review_47.inc
+++ b/coder_review/includes/coder_review_47.inc
@@ -6,9 +6,9 @@
  */
 
 /**
- * Implements hook_reviews().
+ * Implements hook_coder_review_info().
  */
-function coder_review_47_reviews() {
+function coder_review_47_coder_review_info() {
   $rules = array(
     array(
       '#type' => 'regex',
diff --git a/coder_review/includes/coder_review_5x.inc b/coder_review/includes/coder_review_5x.inc
index 9000d6e..4d56dcc 100644
--- a/coder_review/includes/coder_review_5x.inc
+++ b/coder_review/includes/coder_review_5x.inc
@@ -6,9 +6,9 @@
  */
 
 /**
- * Implements hook_reviews().
+ * Implements hook_coder_review_info().
  */
-function coder_review_5x_reviews() {
+function coder_review_5x_coder_review_info() {
   $rules = array(
     array(
       '#type' => 'regex',
diff --git a/coder_review/includes/coder_review_6x.inc b/coder_review/includes/coder_review_6x.inc
index f6f7e2b..2c0e288 100644
--- a/coder_review/includes/coder_review_6x.inc
+++ b/coder_review/includes/coder_review_6x.inc
@@ -6,9 +6,9 @@
  */
 
 /**
- * Implements hook_reviews().
+ * Implements hook_coder_review_info().
  */
-function coder_review_6x_reviews() {
+function coder_review_6x_coder_review_info() {
   $argex = '(((\$?)[a-zA-Z_]+((\([^)]*\))|\[[^\]]*\])?)|[0-9]+(\.[0-9]*)?|\'\'|"")';
   $rules = array(
     array(
@@ -1320,4 +1320,3 @@ function _coder_review_6x_menu_access_callback_warning() {
     '#link' => 'http://drupal.org/node/109157',
   );
 }
-
diff --git a/coder_review/includes/coder_review_7x.inc b/coder_review/includes/coder_review_7x.inc
index 83e7a0f..d940b39 100644
--- a/coder_review/includes/coder_review_7x.inc
+++ b/coder_review/includes/coder_review_7x.inc
@@ -6,9 +6,9 @@
  */
 
 /**
- * Implements hook_reviews().
+ * Implements hook_coder_review_info().
  */
-function coder_review_7x_reviews() {
+function coder_review_7x_coder_review_info() {
   $argex = '(((&?\$?)[a-zA-Z_]+((\([^)]*\))|\[[^\]]*\])?)|[0-9]+(\.[0-9]*)?|\'\'|"")';
   $taxonomy_tables = '\{(term_data|term_hierarchy|term_node|term_relation|term_synonym|vocabulary|vocabulary_node_types)\}';
 
@@ -2298,4 +2298,3 @@ function _coder_review_7x_install_schema_warning() {
     '#link' => 'http://drupal.org/node/224333#install-schema',
   );
 }
-
diff --git a/coder_review/includes/coder_review_comment.inc b/coder_review/includes/coder_review_comment.inc
index 7d17d2e..5cc9d30 100644
--- a/coder_review/includes/coder_review_comment.inc
+++ b/coder_review/includes/coder_review_comment.inc
@@ -6,9 +6,9 @@
  */
 
 /**
- * Implements hook_reviews().
+ * Implements hook_coder_review_info().
  */
-function coder_review_comment_reviews() {
+function coder_review_comment_coder_review_info() {
   $rules = array(
     array(
       '#type' => 'grep',
@@ -199,4 +199,3 @@ function _coder_review_comment_Id_warning() {
     '#link' => 'http://drupal.org/coding-standards',
   );
 }
-
diff --git a/coder_review/includes/coder_review_i18n.inc b/coder_review/includes/coder_review_i18n.inc
index 261d350..ad75833 100644
--- a/coder_review/includes/coder_review_i18n.inc
+++ b/coder_review/includes/coder_review_i18n.inc
@@ -6,9 +6,9 @@
  */
 
 /**
- * Implements hook_reviews().
+ * Implements hook_coder_review_info().
  */
-function coder_review_i18n_reviews() {
+function coder_review_i18n_coder_review_info() {
   $argex = '(((\$?)[a-zA-Z_]+((\([^)]*\))|\[[^\]]*\])?)|[0-9]+(\.[0-9]*)?|\'\'|"")';
   $rules = array(
     array(
diff --git a/coder_review/includes/coder_review_i18n_po.inc b/coder_review/includes/coder_review_i18n_po.inc
index bda6530..afad362 100644
--- a/coder_review/includes/coder_review_i18n_po.inc
+++ b/coder_review/includes/coder_review_i18n_po.inc
@@ -7,9 +7,9 @@
  */
 
 /**
- * Implements hook_reviews().
+ * Implements hook_coder_review_info().
  */
-function coder_review_i18n_po_reviews() {
+function coder_review_i18n_po_coder_review_info() {
   $argex = '(((\$?)[a-zA-Z_]+((\([^)]*\))|\[[^\]]*\])?)|[0-9]+(\.[0-9]*)?|\'\'|"")';
   $rules = array(
     array(
@@ -120,4 +120,3 @@ function _coder_review_translation_callback(&$coder_args, $review, $rule, $lines
     }
   }
 }
-
diff --git a/coder_review/includes/coder_review_security.inc b/coder_review/includes/coder_review_security.inc
index 3aa0514..ad2fe9c 100644
--- a/coder_review/includes/coder_review_security.inc
+++ b/coder_review/includes/coder_review_security.inc
@@ -8,9 +8,9 @@
  */
 
 /**
- * Implements hook_reviews().
+ * Implements hook_coder_review_info().
  */
-function coder_review_security_reviews() {
+function coder_review_security_coder_review_info() {
   $argex = '(((\$?)[a-zA-Z_]+((\([^)]*\))|\[[^\]]*\])?)|[0-9]+(\.[0-9]*)?|\'\'|"")';
   $allphp_argex = '(((\$?)[a-zA-Z_]+((\([^)]*\))|\[[^\]]*\])?)|[0-9]+(\.[0-9]*)?|\'[^\']+\'|"[^"]+")';
   $sanitize_argex = '((t|st|\$t|check_plain|format_plural|check_markup|filter_xss|filter_xss_admin)\s*\([^\)]+?\))';
diff --git a/coder_review/includes/coder_review_sql.inc b/coder_review/includes/coder_review_sql.inc
index 7bf7848..36417ef 100644
--- a/coder_review/includes/coder_review_sql.inc
+++ b/coder_review/includes/coder_review_sql.inc
@@ -6,9 +6,9 @@
  */
 
 /**
- * Implements hook_reviews().
+ * Implements hook_coder_review_info().
  */
-function coder_review_sql_reviews() {
+function coder_review_sql_coder_review_info() {
   $table = '\{[A-Za-z_]+\}'; // table-regex
   $bad = '[A-Za-z_]+';
   $rules = array(
@@ -83,4 +83,3 @@ function _coder_review_sql_select_count_warning() {
     '#link' => 'http://drupal.org/node/224333#select_count',
   );
 }
-
diff --git a/coder_review/includes/coder_review_style.inc b/coder_review/includes/coder_review_style.inc
index a69c9ed..720716e 100644
--- a/coder_review/includes/coder_review_style.inc
+++ b/coder_review/includes/coder_review_style.inc
@@ -6,9 +6,9 @@
  */
 
 /**
- * Implements hook_reviews().
+ * Implements hook_coder_review_info().
  */
-function coder_review_style_reviews() {
+function coder_review_style_coder_review_info() {
   $br = 'br';
   $rules = array(
     array(
