diff --git a/advanced_help.install b/advanced_help.install
index b29911d..1e20cda 100644
--- a/advanced_help.install
+++ b/advanced_help.install
@@ -56,3 +56,13 @@ function advanced_help_schema() {
 
   return $schema;
 }
+
+/**
+ * Update 'view advanced help topic' > 'view all advanced help topics'.
+ */
+function advanced_help_update_7000() {
+  db_update('role_permission')
+    ->fields(array('permission' => 'view all advanced help topics'))
+    ->condition('permission', 'view advanced help topic')
+    ->execute();
+}
diff --git a/advanced_help.module b/advanced_help.module
index 1f32306..016885c 100644
--- a/advanced_help.module
+++ b/advanced_help.module
@@ -43,7 +43,8 @@ function advanced_help_menu() {
     $items['admin/advanced_help'] = array(
       'title' => 'Advanced help',
       'page callback' => 'advanced_help_index_page',
-      'access arguments' => array('view advanced help index'),
+      'access callback' => 'advanced_help_access_module',
+      'access arguments' => array(2),
       'weight' => 9,
     );
   }
@@ -51,7 +52,8 @@ function advanced_help_menu() {
     $items['admin/advanced_help'] = array(
       'title' => 'Help',
       'page callback' => 'advanced_help_index_page',
-      'access arguments' => array('view advanced help index'),
+      'access callback' => 'advanced_help_access_module',
+      'access arguments' => array(2),
       'weight' => 9,
     );
   }
@@ -66,7 +68,8 @@ function advanced_help_menu() {
   $items['help/%/%'] = array(
     'page callback' => 'advanced_help_topic_page',
     'page arguments' => array(1, 2),
-    'access arguments' => array('view advanced help topic'),
+    'access callback' => 'advanced_help_access_module_topic',
+    'access arguments' => array(1),
     'type' => MENU_CALLBACK,
   );
 
@@ -74,6 +77,38 @@ function advanced_help_menu() {
 }
 
 /**
+ * Provides a route access check callback for 'admin/advanced_help'.
+ *
+ * @param string|null $module
+ *   (optional) The module. Defaults to NULL.
+ *
+ * @return bool
+ *   The flag indicating the access.
+ */
+function advanced_help_access_module($module = NULL) {
+  $condition = user_access('view advanced help index');
+
+  if (empty($module)) {
+    return $condition;
+  }
+
+  return $condition || user_access("view module $module advanced help");
+}
+
+/**
+ * Provides a route access check callback for 'help/%/%'.
+ *
+ * @param string|null $module
+ *   (optional) The module. Defaults to NULL.
+ *
+ * @return bool
+ *   The flag indicating the access.
+ */
+function advanced_help_access_module_topic($module = NULL) {
+  return user_access('view all advanced help topics') || user_access("view module $module advanced help");
+}
+
+/**
  * Implements hook_menu_alter().
  */
 function advanced_help_menu_alter(&$callbacks) {
@@ -247,7 +282,9 @@ function advanced_help_index_page($module = '') {
         else {
           $name = t($module_name);
         }
-        $items[] = advanced_help_l($name, "admin/advanced_help/$module");
+        if (user_access('view all advanced help topics') || user_access("view module $module advanced help")) {
+          $items[] = advanced_help_l($name, "admin/advanced_help/$module");
+        }
       }
     }
 
@@ -505,11 +542,22 @@ function advanced_help_topic_page($module, $topic) {
  * Implements hook_permission().
  */
 function advanced_help_permission() {
-  return array(
-    'view advanced help topic' => array('title' => t('View help topics')),
+  $perms = array(
+    'view all advanced help topics' => array('title' => t('View all help topics')),
     'view advanced help popup' => array('title' => t('View help popups')),
     'view advanced help index' => array('title' => t('View help index')),
   );
+
+  foreach (module_list() as $module) {
+    $module_path = drupal_get_path('module', $module);
+    if (file_exists("$module_path/help/$module.help.ini")) {
+      $perms["view module $module advanced help"] = array(
+        'title' => t("View '@module' module help", array('@module' => $module)),
+      );
+    }
+  }
+
+  return $perms;
 }
 
 /**
