=== added file 'modules/node/admin_help.node.help'
--- /dev/null	
+++ modules/node/admin_help.node.help	
@@ -0,0 +1,19 @@
+<p>All content in a website is stored and treated as <b>nodes</b>. Therefore nodes are any postings such as blogs, stories, polls and forums. The node module manages these content types and is one of the strengths of Drupal over other content management systems.</p>
+
+<p>Treating all content as nodes allows the flexibility of creating new types of content. It also allows you to painlessly apply new features or changes to all content. Comments are not stored as nodes but are always associated with a node.</p>
+
+<p>Node module features</p>
+<ul>
+<li>The list tab provides an interface to search and sort all content on your site.</li>
+<li>The configure settings tab has basic settings for content on your site.</li>
+<li>The configure content types tab lists all content types for your site and lets you configure their default workflow.</li>
+<li>The search tab lets you search all content on your site.</li>
+</ul>
+
+<p>You can</p>
+<ul>
+<li>search for content at <a href="%search">search</a>.</li>
+<li>administer nodes at <a href="%admin-settings-content-types">administer &gt;&gt; settings &gt;&gt; content types</a>.</li>
+</ul>
+
+<p>For more information please read the configuration and customization handbook <a href="%node">Node page</a>.</p>
=== added file 'modules/node/admin_node.help'
--- /dev/null	
+++ modules/node/admin_node.help	
@@ -0,0 +1,3 @@
+'<p>Below is a list of all of the posts on your site. Other forms of content are listed elsewhere (e.g. <a href="%comments">comments</a></p>
+
+<p>Clicking a title views the post, while clicking an author\'s name views their user information.</p>
\ No newline at end of file
=== added file 'modules/node/admin_node_search.help'
--- /dev/null	
+++ modules/node/admin_node_search.help	
@@ -0,0 +1 @@
+'<p>Enter a simple pattern to search for a post. This can include the wildcard character *.<br />For example, a search for "br*" might return "bread bakers", "our daily bread" and "brenda".</p>
\ No newline at end of file
=== modified file 'includes/common.inc'
--- includes/common.inc	
+++ includes/common.inc	
@@ -1407,6 +1407,33 @@ function page_set_cache() {
 }
 
 /**
+ * Get help for a given module at a certain path and optionally a fragment
+ * from either the relevant help file or hook_help.
+ *
+ * @param $module
+ *   the name of the module.
+ * @param $path
+ *   the path.
+ * @param $fragment
+ *   an optional fragment, defaults to empty.
+ * @return
+ *   the help, if exists.
+ */
+function drupal_get_help($module, $path, $fragment = '') {
+  $help = module_invoke($name, 'help', "$path#$fragment");
+  if ($help && !is_array($help)) {
+    return $help;
+  }
+  if ($fragment) {
+    $fragment = ".$fragment";
+  }
+  $help_filename = drupal_get_path('module', $module) .'/'. str_replace('/', '_', $path) . "$fragment.help";
+  if (is_file($help_filename)) {
+    return t(file_get_contents($help_filename), $help ? $help : array());
+  }
+}
+
+/**
  * Send an e-mail message, using Drupal variables and default settings.
  * More information in the <a href="http://php.net/manual/en/function.mail.php">
  * PHP function reference for mail()</a>
=== modified file 'includes/menu.inc'
--- includes/menu.inc	
+++ includes/menu.inc	
@@ -507,18 +507,12 @@ function menu_get_active_help() {
     return;
   }
 
-  foreach (module_list() as $name) {
-    if (module_hook($name, 'help')) {
-      if ($temp = module_invoke($name, 'help', $path)) {
-        $output .= $temp . "\n";
-      }
-      if (module_hook('help', 'page')) {
-        if (substr($path, 0, 6) == "admin/") {
-          if (module_invoke($name, 'help', 'admin/help#' . substr($path, 6))) {
-            $output .= theme("more_help_link", url('admin/help/' . substr($path, 6)));
-          }
-        }
-      }
+  foreach (module_list() as $module) {
+    if ($help = drupal_get_help($module, $path)) {
+      $output .= $help ."\n";
+    }
+    if (module_hook('help', 'page') && substr($path, 0, 6) == "admin/" && drupal_get_help($module, 'admin/help', substr($path, 6))) {
+      $output .= theme("more_help_link", url('admin/help/' . substr($path, 6)));
     }
   }
   return $output;
=== modified file 'modules/help/help.module'
--- modules/help/help.module	
+++ modules/help/help.module	
@@ -120,16 +120,9 @@ function help_help($section) {
  * Menu callback; prints a page listing general help for all modules.
  */
 function help_page() {
-  $name = arg(2);
-  $output = '';
-  if (module_hook($name, 'help')) {
-    $temp = module_invoke($name, 'help', "admin/help#$name");
-    if (empty($temp)) {
-      $output .= t("No help is available for module %module.", array('%module' => $name));
-    }
-    else {
-      $output .= $temp;
-    }
+  $module = arg(2);
+  if ($help = drupal_get_help($module, 'admin/help', $module)) {
+    return $help;
   }
-  return $output;
+  return t("No help is available for module %module.", array('%module' => $module));
 }
=== modified file 'modules/node/node.module'
--- modules/node/node.module	
+++ modules/node/node.module	
@@ -14,30 +14,11 @@ define('NODE_NEW_LIMIT', time() - 30 * 2
 function node_help($section) {
   switch ($section) {
     case 'admin/help#node':
-      $output = '<p>'. t('All content in a website is stored and treated as <b>nodes</b>. Therefore nodes are any postings such as blogs, stories, polls and forums. The node module manages these content types and is one of the strengths of Drupal over other content management systems.') .'</p>';
-      $output .= '<p>'. t('Treating all content as nodes allows the flexibility of creating new types of content. It also allows you to painlessly apply new features or changes to all content. Comments are not stored as nodes but are always associated with a node.') .'</p>';
-      $output .= t('<p>Node module features</p>
-<ul>
-<li>The list tab provides an interface to search and sort all content on your site.</li>
-<li>The configure settings tab has basic settings for content on your site.</li>
-<li>The configure content types tab lists all content types for your site and lets you configure their default workflow.</li>
-<li>The search tab lets you search all content on your site</li>
-</ul>
-');
-      $output .= t('<p>You can</p>
-<ul>
-<li>search for content at <a href="%search">search</a>.</li>
-<li>administer nodes at <a href="%admin-settings-content-types">administer &gt;&gt; settings &gt;&gt; content types</a>.</li>
-</ul>
-', array('%search' => url('search'), '%admin-settings-content-types' => url('admin/settings/content-types')));
-      $output .= '<p>'. t('For more information please read the configuration and customization handbook <a href="%node">Node page</a>.', array('%node' => 'http://drupal.org/handbook/modules/node/')) .'</p>';
-      return $output;
+      return array('%search' => url('search'), '%admin-settings-content-types' => url('admin/settings/content-types'), '%node' => 'http://drupal.org/handbook/modules/node/');
     case 'admin/modules#description':
       return t('Allows content to be submitted to the site and displayed on pages.');
     case 'admin/node':
-      return t('<p>Below is a list of all of the posts on your site. Other forms of content are listed elsewhere (e.g. <a href="%comments">comments</a>).</p><p>Clicking a title views the post, while clicking an author\'s name views their user information.</p>', array('%comments' => url('admin/comment')));
-    case 'admin/node/search':
-      return t('<p>Enter a simple pattern to search for a post. This can include the wildcard character *.<br />For example, a search for "br*" might return "bread bakers", "our daily bread" and "brenda".</p>');
+      return array('%comments' => url('admin/comment'));
   }
 
   if (arg(0) == 'node' && is_numeric(arg(1)) && arg(2) == 'revisions') {
