diff --git a/boost.admin.modules.inc b/boost.admin.modules.inc
new file mode 100755
index 0000000..3f26484
--- /dev/null
+++ b/boost.admin.modules.inc
@@ -0,0 +1,99 @@
+<?php
+/**
+   * @file
+   * Displays compatible modules for boost, descriptions of functionality and
+   * links if not installed.
+   */
+
+/**
+ *
+ */
+  function boost_compatible_output() {
+
+    $modules_enabled = array();
+    $modules_disabled = array();
+
+    // query from the database in case modules are already installed but not enabled
+    $result = db_query("SELECT name, status FROM {system} WHERE type = 'module' ORDER BY weight ASC, name ASC");
+    foreach ($result as $record) {
+      ($record->status == 1) ? $modules_enabled[] = $record->name : $modules_disabled[] = $record->name ;
+    }
+
+    $project_page = t('Project page');
+
+    // list of compatible modules
+    $recommended = array(
+      'boost_crawler' => array(
+        'title' => 'Boost Crawler',
+        'link' => 'http://drupal.org/project/boost' ,
+        'description' => t('Minimal crawler - expires and regenerates pages only when content is edited and on next cron run.'),
+      ),
+      'fast_404' => array(
+        'title' => 'Fast 404',
+        'link' => 'http://drupal.org/project/fast_404' ,
+        'description' => t('Caches a static page for 404 errors, reducing server load'),
+      ),
+      'globalredirect' => array(
+        'title' => 'Global Redirect',
+        'link' => 'http://drupal.org/project/globalredirect',
+        'description' => t('Redirects missing/ expired URI aliases back to home page, saves boost generation of deprecated aliases'),
+      ),
+      'httprl' => array(
+        'title' => 'HTTP Parallel Request & Threading Library',
+        'link' =>  'http://drupal.org/project/httprl',
+        'description' => t('required by boost crawler, performs http requests to regenerate expired pages.'),
+      ),
+      'expire' => array(
+        'title' => 'Cache Expiration',
+        'link' => 'http://drupal.org/project/expire',
+        'description' => t('required by boost crawler, recommended for boost, provides cron queued expiry of related items when node is edited.'),
+      ),
+      'boost_expire' => array(
+        'title' => 'Boost Expire',
+        'link' =>  'http://drupal.org/project/boost_expire',
+        'description' => t('Expires pages immediately rather than waiting for a cron run.'),
+      ),
+    );
+
+    ksort($recommended);
+
+    // uses array_intersect as array_intersect_key only came in PHP > 5.1
+    $installed = array_intersect($modules_enabled, array_keys($recommended));
+
+    $disabled = array_intersect($modules_disabled, array_keys($recommended));
+
+    $not_installed = array_diff( array_diff( array_keys($recommended), $installed), $disabled );
+
+    // prepare the table
+    $header = array('Module', 'Status', 'Description');
+
+    $rows = array();
+
+    foreach ($recommended as $module => $data) {
+
+      $status = in_array($module, $not_installed) ? 'Not Installed' : (in_array($module, $disabled) ? 'Disabled' : 'Enabled' ) ;
+      $trclass = in_array($module, $not_installed) ? 'info' : (in_array($module, $disabled) ? 'warning' : 'ok' ) ;
+      $module_link = (in_array($module, $not_installed) ? '<div style="float:right">' . l($project_page, $data['link']) . '<br />' . l($data['link'], $data['link']) . '</div>' : '' ) ;
+
+      $rows[] = array(
+        'data' => array(
+          $data['title'],
+          $status,
+          $data['description'] . $module_link ,
+          ),
+        'class' => array($trclass),
+        'no_striping' => TRUE,
+      );
+
+    }
+
+    $output = theme('table', array( 'attributes' => array( 'class' => array( 'system-status-report')), 'header' => $header, 'rows' => $rows) );
+
+    return array(
+     'my_page' => array(
+        '#markup' => $output,
+      ),
+    );
+
+  }
+
diff --git a/boost.blocks.inc b/boost.blocks.inc
index 8690c2d..46ac4c0 100644
--- a/boost.blocks.inc
+++ b/boost.blocks.inc
@@ -1,6 +1,7 @@
 <?php
 
 /**
+ * @file
  * Prints the cache status of the currently displayed page.
  *
  * see @boost_block_view()
diff --git a/boost.module b/boost.module
index e6a88a1..0df74f3 100644
--- a/boost.module
+++ b/boost.module
@@ -168,6 +168,16 @@ function boost_menu() {
     'file' => 'boost.admin.expiration.inc',
     'file path' => $path,
   );
+  $items['admin/config/system/boost/listmodules'] = array(
+    'title' => 'Boost Modules',
+    'description' => ' Compatible Modules that add features to Boost.',
+    'page callback' => 'boost_admin_modules_theme',
+    'page callback' => 'boost_compatible_output',
+    'access arguments' => array('administer site configuration'),
+    'type' => MENU_LOCAL_TASK,
+    'file' => 'boost.admin.modules.inc',
+    'weight' => 100,
+  );
 
   return $items;
 }
@@ -493,7 +503,7 @@ function boost_parse_url($url = NULL, $b_path = NULL) {
   if (!isset($parts['query'])) {
     $parts['query'] = '';
   }
-  $parts['path'] = $parts['full_path'] = urldecode(preg_replace('/^' . preg_quote($b_path, '/') .'/i', '', $parts['path']));
+  $parts['path'] = $parts['full_path'] = urldecode(preg_replace('/^' . preg_quote($b_path, '/') . '/i', '', $parts['path']));
   $parts['base_path'] = $b_path;
   $parts['query_array'] = array();
   parse_str($parts['query'], $parts['query_array']);
@@ -1289,7 +1299,7 @@ function boost_write_file($filename, $data) {
 
   // Move temp file to real filename; windows can not do a rename replace.
   if (@rename($tempname, $filename) === FALSE) {
-    $oldname = $tempname. 'old';
+    $oldname = $tempname . 'old';
     if (@rename($filename, $oldname) !== FALSE) {
       if (@rename($tempname, $filename) === FALSE) {
         watchdog('boost', 'Could not rename the file %file on your system', array('%file' => $filename), WATCHDOG_ERROR);
