diff --git a/core/modules/action/action.module b/core/modules/action/action.module
index d1a7601..314bfe1 100644
--- a/core/modules/action/action.module
+++ b/core/modules/action/action.module
@@ -15,7 +15,7 @@ function action_help($route_name, RouteMatchInterface $route_match) {
     case 'help.page.action':
       $output = '';
       $output .= '<h3>' . t('About') . '</h3>';
-      $output .= '<p>' . t('The Actions module provides tasks that can be executed by the site such as unpublishing content, sending email messages, or blocking a user. Other modules can trigger these actions when specific system events happen; for example, when new content is posted or when a user logs in. Modules can also provide additional actions. For more information, see the <a href="!documentation">online documentation for the Action module</a>.', array('!documentation' => 'https://drupal.org/documentation/modules/action')) . '</p>';
+      $output .= '<p>' . t('The Actions module provides tasks that can be executed by the site such as unpublishing content, sending email messages, or blocking a user. Other modules can trigger these actions when specific system events happen; for example, when new content is posted or when a user logs in. Modules can also provide additional actions. For more information, see the <a href="!documentation">online documentation for the Actions module</a>.', array('!documentation' => 'https://drupal.org/documentation/modules/action')) . '</p>';
       $output .= '<h3>' . t('Uses') . '</h3>';
       $output .= '<dl>';
       $output .= '<dt>' . t('Using simple actions') . '</dt>';
diff --git a/core/modules/ban/ban.module b/core/modules/ban/ban.module
index b6270af..2063c1b 100644
--- a/core/modules/ban/ban.module
+++ b/core/modules/ban/ban.module
@@ -15,7 +15,7 @@ function ban_help($route_name, RouteMatchInterface $route_match) {
     case 'help.page.ban':
       $output = '';
       $output .= '<h3>' . t('About') . '</h3>';
-      $output .= '<p>' . t('The Ban module allows administrators to ban visits to their site from individual IP addresses. For more information, see <a href="!url">the online documentation for the Ban module</a>.', array('!url' => 'https://drupal.org/documentation/modules/ban')) . '</p>';
+      $output .= '<p>' . t('The Ban module allows administrators to ban visits to their site from individual IP addresses. For more information, see the <a href="!url">online documentation for the Ban module</a>.', array('!url' => 'https://drupal.org/documentation/modules/ban')) . '</p>';
       $output .= '<h3>' . t('Uses') . '</h3>';
       $output .= '<dl>';
       $output .= '<dt>' . t('Banning IP addresses') . '</dt>';
diff --git a/core/modules/basic_auth/basic_auth.module b/core/modules/basic_auth/basic_auth.module
index d49069a..07322f8 100644
--- a/core/modules/basic_auth/basic_auth.module
+++ b/core/modules/basic_auth/basic_auth.module
@@ -15,7 +15,7 @@ function basic_auth_help($route_name, RouteMatchInterface $route_match) {
     case 'help.page.basic_auth':
       $output = '';
       $output .= '<h3>' . t('About') . '</h3>';
-      $output .= '<p>' . t('The HTTP Basic Authentication module supplies an <a href="http://en.wikipedia.org/wiki/Basic_access_authentication">HTTP Basic authentication</a> provider for web service requests. This authentication provider authenticates requests using the HTTP Basic Authentication username and password, as an alternative to using Drupal\'s standard cookie-based authentication system. It is only useful if your site provides web services configured to use this type of authentication (for instance, the <a href="!rest_help">RESTful Web Services module</a>). For more information, see <a href="!hba_do">the online documentation for the HTTP Basic Authentication module</a>.', array('!hba_do' => 'https://drupal.org/documentation/modules/basic_auth', '!rest_help' => (\Drupal::moduleHandler()->moduleExists('rest')) ? \Drupal::url('help.page', array('name' => 'rest')) : '#')) . '</p>';
+      $output .= '<p>' . t('The HTTP Basic Authentication module supplies an <a href="http://en.wikipedia.org/wiki/Basic_access_authentication">HTTP Basic authentication</a> provider for web service requests. This authentication provider authenticates requests using the HTTP Basic Authentication username and password, as an alternative to using Drupal\'s standard cookie-based authentication system. It is only useful if your site provides web services configured to use this type of authentication (for instance, the <a href="!rest_help">RESTful Web Services module</a>). For more information, see the <a href="!hba_do">online documentation for the HTTP Basic Authentication module</a>.', array('!hba_do' => 'https://drupal.org/documentation/modules/basic_auth', '!rest_help' => (\Drupal::moduleHandler()->moduleExists('rest')) ? \Drupal::url('help.page', array('name' => 'rest')) : '#')) . '</p>';
       return $output;
   }
 }
diff --git a/core/modules/block_content/block_content.module b/core/modules/block_content/block_content.module
index a050795..d981fca 100644
--- a/core/modules/block_content/block_content.module
+++ b/core/modules/block_content/block_content.module
@@ -18,7 +18,7 @@ function block_content_help($route_name, RouteMatchInterface $route_match) {
       $field_ui = \Drupal::moduleHandler()->moduleExists('field_ui') ? \Drupal::url('help.page', array('name' => 'field_ui')) : '#';
       $output = '';
       $output .= '<h3>' . t('About') . '</h3>';
-      $output .= '<p>' . t('The Custom Block module allows you to create custom <em>block types</em> and <em>content-containing blocks</em>, and provides a <a href="!block-library">Custom block library</a> listing all of them. Custom block types have fields; see the <a href="!field-help">Field module help</a> for more information. Once created, custom blocks can be placed in regions just like blocks provided by other modules; see the <a href="!blocks">Block module help page</a> for details. For more information, see <a href="!online-help">the online documentation for the Custom Block module</a>.', array('!block-library' => \Drupal::url('entity.block_content.collection'), '!block-content' => \Drupal::url('entity.block_content.collection'), '!field-help' => \Drupal::url('help.page', array('name' => 'field')), '!blocks' => \Drupal::url('help.page', array('name' => 'block')), '!online-help' => 'https://drupal.org/documentation/modules/block_content')) . '</p>';
+      $output .= '<p>' . t('The Custom Block module allows you to create custom <em>block types</em> and <em>content-containing blocks</em>, and provides a <a href="!block-library">Custom block library</a> listing all of them. Custom block types have fields; see the <a href="!field-help">Field module help</a> for more information. Once created, custom blocks can be placed in regions just like blocks provided by other modules; see the <a href="!blocks">Block module help page</a> for details. For more information, see the <a href="!online-help">online documentation for the Custom Block module</a>.', array('!block-library' => \Drupal::url('entity.block_content.collection'), '!block-content' => \Drupal::url('entity.block_content.collection'), '!field-help' => \Drupal::url('help.page', array('name' => 'field')), '!blocks' => \Drupal::url('help.page', array('name' => 'block')), '!online-help' => 'https://drupal.org/documentation/modules/block_content')) . '</p>';
       $output .= '<h3>' . t('Uses') . '</h3>';
       $output .= '<dl>';
       $output .= '<dt>' . t('Creating and managing custom block types') . '</dt>';
diff --git a/core/modules/ckeditor/ckeditor.module b/core/modules/ckeditor/ckeditor.module
index 1520c5e..6b3d360 100644
--- a/core/modules/ckeditor/ckeditor.module
+++ b/core/modules/ckeditor/ckeditor.module
@@ -16,7 +16,7 @@ function ckeditor_help($route_name, RouteMatchInterface $route_match) {
     case 'help.page.ckeditor':
       $output = '';
       $output .= '<h3>' . t('About') . '</h3>';
-      $output .= '<p>' . t('The CKEditor module provides a visual text editor and adds a toolbar to text fields. Users can use buttons to format content and to create semantically correct and valid HTML. The CKEditor module uses the framework provided by the <a href="!text_editor">Text Editor module</a>. It requires JavaScript to be enabled in the browser. For more information, see <a href="!doc_url">the online documentation for the CKEditor module</a> and the <a href="!cke_url">CKEditor website</a>.', array( '!doc_url' => 'https://drupal.org/documentation/modules/ckeditor', '!cke_url' => 'http://ckeditor.com', '!text_editor' => \Drupal::url('help.page', array('name' => 'editor')))) . '</p>';
+      $output .= '<p>' . t('The CKEditor module provides a visual text editor and adds a toolbar to text fields. Users can use buttons to format content and to create semantically correct and valid HTML. The CKEditor module uses the framework provided by the <a href="!text_editor">Text Editor module</a>. It requires JavaScript to be enabled in the browser. For more information, see the <a href="!doc_url">online documentation for the CKEditor module</a> and the <a href="!cke_url">CKEditor website</a>.', array( '!doc_url' => 'https://drupal.org/documentation/modules/ckeditor', '!cke_url' => 'http://ckeditor.com', '!text_editor' => \Drupal::url('help.page', array('name' => 'editor')))) . '</p>';
       $output .= '<h3>' . t('Uses') . '</h3>';
       $output .= '<dl>';
       $output .= '<dt>' . t('Enabling CKEditor for individual text formats') . '</dt>';
diff --git a/core/modules/color/color.module b/core/modules/color/color.module
index 65c60d7..3ab99da 100644
--- a/core/modules/color/color.module
+++ b/core/modules/color/color.module
@@ -22,7 +22,7 @@ function color_help($route_name, RouteMatchInterface $route_match) {
   switch ($route_name) {
     case 'help.page.color':
       $output = '<h3>' . t('About') . '</h3>';
-      $output .= '<p>' . t('The Color module allows users with the <em>Administer site configuration</em> permission to change the color scheme (color of links, backgrounds, text, and other theme elements) of compatible themes. For more information, see <a href="!color_do">the online documentation for the Color module</a>.', array('!color_do' => 'https://drupal.org/documentation/modules/color')) . '</p>';
+      $output .= '<p>' . t('The Color module allows users with the <em>Administer site configuration</em> permission to change the color scheme (color of links, backgrounds, text, and other theme elements) of compatible themes. For more information, see the <a href="!color_do">online documentation for the Color module</a>.', array('!color_do' => 'https://drupal.org/documentation/modules/color')) . '</p>';
       $output .= '<h3>' . t('Uses') . '</h3>';
       $output .= '<dl>';
       $output .= '<dt>' . t('Changing colors') . '</dt>';
diff --git a/core/modules/config/config.module b/core/modules/config/config.module
index 05f4b6d..b5d3ead 100644
--- a/core/modules/config/config.module
+++ b/core/modules/config/config.module
@@ -15,9 +15,7 @@ function config_help($route_name, RouteMatchInterface $route_match) {
     case 'help.page.config':
       $output = '';
       $output .= '<h3>' . t('About') . '</h3>';
-      $output .= '<p>' . t('The Configuration manager module provides a user interface for importing and exporting configuration changes; i.e., for staging configuration data between multiple instances of this web site. For more information, see the online handbook entry for <a href="!url">Configuration manager module</a>', array(
-        '!url' => 'https://www.drupal.org/documentation/administer/config',
-      )) . '</p>';
+      $output .= '<p>' . t('The Configuration Manager module provides a user interface for importing and exporting configuration changes; i.e., for staging configuration data between multiple instances of this web site. For more information, see the <a href="!url">online documentation for the Configuration Manager module</a>.', array('!url' => 'https://www.drupal.org/documentation/administer/config')) . '</p>';
       return $output;
 
     case 'config.sync':
diff --git a/core/modules/content_translation/content_translation.module b/core/modules/content_translation/content_translation.module
index 280d4d6..99e0312 100644
--- a/core/modules/content_translation/content_translation.module
+++ b/core/modules/content_translation/content_translation.module
@@ -22,7 +22,7 @@ function content_translation_help($route_name, RouteMatchInterface $route_match)
     case 'help.page.content_translation':
       $output = '';
       $output .= '<h3>' . t('About') . '</h3>';
-      $output .= '<p>' . t('The Content Translation module allows you to translate content, comments, custom blocks, taxonomy terms, users and other <a href="!field_help" title="Field module help, with background on content entities">content entities</a>. Together with the modules <a href="!language">Language</a>, <a href="!config-trans">Configuration Translation</a>, and <a href="!locale">Interface Translation</a>, it allows you to build multilingual websites. For more information, see <a href="!translation-entity">the online documentation for the Content Translation module</a>.', array('!locale' => (\Drupal::moduleHandler()->moduleExists('locale')) ? \Drupal::url('help.page', array('name' => 'locale')) : '#', '!config-trans' => (\Drupal::moduleHandler()->moduleExists('config_translation')) ? \Drupal::url('help.page', array('name' => 'config_translation')) : '#', '!language' => \Drupal::url('help.page', array('name' => 'language')), '!translation-entity' => 'https://drupal.org/documentation/modules/translation', '!field_help' => \Drupal::url('help.page', array('name' => 'field')))) . '</p>';
+      $output .= '<p>' . t('The Content Translation module allows you to translate content, comments, custom blocks, taxonomy terms, users and other <a href="!field_help" title="Field module help, with background on content entities">content entities</a>. Together with the modules <a href="!language">Language</a>, <a href="!config-trans">Configuration Translation</a>, and <a href="!locale">Interface Translation</a>, it allows you to build multilingual websites. For more information, see the <a href="!translation-entity">online documentation for the Content Translation module</a>.', array('!locale' => (\Drupal::moduleHandler()->moduleExists('locale')) ? \Drupal::url('help.page', array('name' => 'locale')) : '#', '!config-trans' => (\Drupal::moduleHandler()->moduleExists('config_translation')) ? \Drupal::url('help.page', array('name' => 'config_translation')) : '#', '!language' => \Drupal::url('help.page', array('name' => 'language')), '!translation-entity' => 'https://drupal.org/documentation/modules/translation', '!field_help' => \Drupal::url('help.page', array('name' => 'field')))) . '</p>';
       $output .= '<h3>' . t('Uses') . '</h3>';
       $output .= '<dl>';
       $output .= '<dt>' . t('Enabling translation') . '</dt>';
diff --git a/core/modules/contextual/contextual.module b/core/modules/contextual/contextual.module
index 83a5bee..ce619a6 100644
--- a/core/modules/contextual/contextual.module
+++ b/core/modules/contextual/contextual.module
@@ -68,7 +68,7 @@ function contextual_help($route_name, RouteMatchInterface $route_match) {
     case 'help.page.contextual':
       $output = '';
       $output .= '<h3>' . t('About') . '</h3>';
-      $output .= '<p>' . t('The Contextual links module gives users with the <em>Use contextual links</em> permission quick access to tasks associated with certain areas of pages on your site. For example, a menu displayed as a block has links to edit the menu and configure the block. For more information, see <a href="!contextual">the online documentation for the Contextual Links module</a>.', array('!contextual' => 'https://drupal.org/documentation/modules/contextual')) . '</p>';
+      $output .= '<p>' . t('The Contextual links module gives users with the <em>Use contextual links</em> permission quick access to tasks associated with certain areas of pages on your site. For example, a menu displayed as a block has links to edit the menu and configure the block. For more information, see the <a href="!contextual">online documentation for the Contextual Links module</a>.', array('!contextual' => 'https://drupal.org/documentation/modules/contextual')) . '</p>';
       $output .= '<h3>' . t('Uses') . '</h3>';
       $output .= '<dl>';
       $output .= '<dt>' . t('Displaying contextual links') . '</dt>';
diff --git a/core/modules/dblog/dblog.module b/core/modules/dblog/dblog.module
index 01c4d23..841bc04 100644
--- a/core/modules/dblog/dblog.module
+++ b/core/modules/dblog/dblog.module
@@ -20,7 +20,7 @@ function dblog_help($route_name, RouteMatchInterface $route_match) {
     case 'help.page.dblog':
       $output = '';
       $output .= '<h3>' . t('About') . '</h3>';
-      $output .= '<p>' . t('The Database Logging module logs system events in the Drupal database. For more information, see the online handbook entry for the <a href="!dblog">Database Logging module</a>.', array('!dblog' => 'https://www.drupal.org/documentation/modules/dblog')) . '</p>';
+      $output .= '<p>' . t('The Database Logging module logs system events in the Drupal database. For more information, see the <a href="!dblog">online documentation for the Database Logging module</a>.', array('!dblog' => 'https://www.drupal.org/documentation/modules/dblog')) . '</p>';
       $output .= '<h3>' . t('Uses') . '</h3>';
       $output .= '<dl>';
       $output .= '<dt>' . t('Monitoring your site') . '</dt>';
diff --git a/core/modules/entity_reference/entity_reference.module b/core/modules/entity_reference/entity_reference.module
index d3d2d1b..acf0af0 100644
--- a/core/modules/entity_reference/entity_reference.module
+++ b/core/modules/entity_reference/entity_reference.module
@@ -23,7 +23,7 @@ function entity_reference_help($route_name, RouteMatchInterface $route_match) {
     case 'help.page.entity_reference':
       $output = '';
       $output .= '<h3>' . t('About') . '</h3>';
-      $output .= '<p>' . t('The Entity Reference module allows you to create fields that contain links to other entities (such as content items, taxonomy terms, etc.) within the site. This allows you, for example, to include a link to a user within a content item. For more information, see <a href="!er_do">the online documentation for the Entity Reference module</a> and the <a href="!field_help">Field module help page</a>.', array('!field_help' => \Drupal::url('help.page', array('name' => 'field')), '!er_do' => 'https://drupal.org/documentation/modules/entityreference')) . '</p>';
+      $output .= '<p>' . t('The Entity Reference module allows you to create fields that contain links to other entities (such as content items, taxonomy terms, etc.) within the site. This allows you, for example, to include a link to a user within a content item. For more information, see the <a href="!er_do">online documentation for the Entity Reference module</a> and the <a href="!field_help">Field module help page</a>.', array('!field_help' => \Drupal::url('help.page', array('name' => 'field')), '!er_do' => 'https://drupal.org/documentation/modules/entityreference')) . '</p>';
       $output .= '<h3>' . t('Uses') . '</h3>';
       $output .= '<dl>';
       $output .= '<dt>' . t('Managing and displaying entity reference fields') . '</dt>';
diff --git a/core/modules/field_ui/field_ui.module b/core/modules/field_ui/field_ui.module
index b153c4d..fdeca34 100644
--- a/core/modules/field_ui/field_ui.module
+++ b/core/modules/field_ui/field_ui.module
@@ -24,7 +24,7 @@ function field_ui_help($route_name, RouteMatchInterface $route_match) {
     case 'help.page.field_ui':
       $output = '';
       $output .= '<h3>' . t('About') . '</h3>';
-      $output .= '<p>' . t('The Field UI module provides an administrative user interface (UI) for managing and displaying fields. Fields can be attached to most content entity sub-types. Different field types, widgets, and formatters are provided by the modules enabled on your site, and managed by the Field module. For background information and terminology related to fields and entities, see the <a href="!field">Field module help page</a>. For more information about the Field UI, see <a href="!field_ui_docs">the online documentation for the Field UI module</a>.', array('!field' => \Drupal::url('help.page', array('name' => 'field')), '!field_ui_docs' => 'https://drupal.org/documentation/modules/field-ui')) . '</p>';
+      $output .= '<p>' . t('The Field UI module provides an administrative user interface (UI) for managing and displaying fields. Fields can be attached to most content entity sub-types. Different field types, widgets, and formatters are provided by the modules enabled on your site, and managed by the Field module. For background information and terminology related to fields and entities, see the <a href="!field">Field module help page</a>. For more information about the Field UI, see the <a href="!field_ui_docs">online documentation for the Field UI module</a>.', array('!field' => \Drupal::url('help.page', array('name' => 'field')), '!field_ui_docs' => 'https://drupal.org/documentation/modules/field-ui')) . '</p>';
       $output .= '<h3>' . t('Uses') . '</h3>';
       $output .= '<dl>';
       $output .= '<dt>' . t('Creating a field') . '</dt>';
diff --git a/core/modules/filter/filter.module b/core/modules/filter/filter.module
index 30400c0..001b71c 100644
--- a/core/modules/filter/filter.module
+++ b/core/modules/filter/filter.module
@@ -26,7 +26,7 @@ function filter_help($route_name, RouteMatchInterface $route_match) {
     case 'help.page.filter':
       $output = '';
       $output .= '<h3>' . t('About') . '</h3>';
-      $output .= '<p>' . t('The Filter module allows administrators to configure text formats. Text formats define the HTML tags, codes, and other input allowed in text entered in the site and they defend your web site against potentially damaging input from malicious users. A visual text editor can be associated with the text formats by using the <a href="!editor_help">Text Editor module</a>. For more information, see <a href="!filter_do">the online documentation for the Filter module</a>.', array('!filter_do' => 'https://drupal.org/documentation/modules/filter/','!editor_help' => (\Drupal::moduleHandler()->moduleExists('editor')) ? \Drupal::url('help.page', array('name' => 'editor')) : '#')) . '</p>';
+      $output .= '<p>' . t('The Filter module allows administrators to configure text formats. Text formats define the HTML tags, codes, and other input allowed in text entered in the site and they defend your web site against potentially damaging input from malicious users. A visual text editor can be associated with the text formats by using the <a href="!editor_help">Text Editor module</a>. For more information, see the <a href="!filter_do">online documentation for the Filter module</a>.', array('!filter_do' => 'https://drupal.org/documentation/modules/filter/','!editor_help' => (\Drupal::moduleHandler()->moduleExists('editor')) ? \Drupal::url('help.page', array('name' => 'editor')) : '#')) . '</p>';
       $output .= '<h3>' . t('Uses') . '</h3>';
       $output .= '<dl>';
       $output .= '<dt>' . t('Managing text formats') . '</dt>';
diff --git a/core/modules/forum/forum.module b/core/modules/forum/forum.module
index e9ccb3e..09eb389 100644
--- a/core/modules/forum/forum.module
+++ b/core/modules/forum/forum.module
@@ -36,7 +36,7 @@ function forum_help($route_name, RouteMatchInterface $route_match) {
       $output .= '<li>' . t('Optional <em>containers</em>, used to group similar forums. Forums can be placed inside containers, and vice versa.').'</li>';
       $output .= '</ul>';
       $output .= '</p>';
-      $output .= '<p>' . t('For more information, see <a href="!forum">the online documentation for the Forum module</a>.', array('!forum' => 'https://drupal.org/documentation/modules/forum')) . '</p>';
+      $output .= '<p>' . t('For more information, see the <a href="!forum">online documentation for the Forum module</a>.', array('!forum' => 'https://drupal.org/documentation/modules/forum')) . '</p>';
       $output .= '<h3>' . t('Uses') . '</h3>';
       $output .= '<dl>';
       $output .= '<dt>' . t('Setting up the forum structure') . '</dt>';
diff --git a/core/modules/hal/hal.module b/core/modules/hal/hal.module
index a6c915e..dff4033 100644
--- a/core/modules/hal/hal.module
+++ b/core/modules/hal/hal.module
@@ -17,7 +17,7 @@ function hal_help($route_name, RouteMatchInterface $route_match) {
       $output .= '<h3>' . t('About') . '</h3>';
       $output .= '<p>' . t('<a href="!hal_spec">Hypertext Application Language (HAL)</a> is a format that supports the linking required for hypermedia APIs.', array('!hal_spec' => 'http://stateless.co/hal_specification.html')) . '</p>';
       $output .= '<p>' . t('Hypermedia APIs are a style of Web API that uses URIs to identify resources and the <a href="!link_rel">link relations</a> between them, enabling API consumers to follow links to discover API functionality.', array('!link_rel' => 'http://en.wikipedia.org/wiki/Link_relation')) . '</p>';
-      $output .= '<p>' . t('This module adds support for serializing entities (such as content items, taxonomy terms, etc.) to the JSON version of HAL. For more information, see <a href="!hal_do">the online documentation for the HAL module</a>.', array('!hal_do' => 'https://drupal.org/documentation/modules/hal')) . '</p>';
+      $output .= '<p>' . t('This module adds support for serializing entities (such as content items, taxonomy terms, etc.) to the JSON version of HAL. For more information, see the <a href="!hal_do">online documentation for the HAL module</a>.', array('!hal_do' => 'https://drupal.org/documentation/modules/hal')) . '</p>';
       return $output;
   }
 }
diff --git a/core/modules/language/language.module b/core/modules/language/language.module
index 4e7f017..dc932c6 100644
--- a/core/modules/language/language.module
+++ b/core/modules/language/language.module
@@ -29,7 +29,7 @@ function language_help($route_name, RouteMatchInterface $route_match) {
     case 'help.page.language':
       $output = '';
       $output .= '<h3>' . t('About') . '</h3>';
-      $output .= '<p>' . t('The Language module allows you to configure the languages used on your site, and provides information for the for <a href="!content">Content Translation</a>, <a href="!interface">Interface Translation</a>, and <a href="!configuration">Configuration Translation</a> modules, if they are enabled. For more information, see <a href="!doc_url">the online documentation for the Language module</a>.', array('!doc_url' => 'https://drupal.org/documentation/modules/language', '!content' => (\Drupal::moduleHandler()->moduleExists('content_translation')) ? \Drupal::url('help.page', array('name' => 'content_translation')) : '#', '!interface' => (\Drupal::moduleHandler()->moduleExists('locale')) ? \Drupal::url('help.page', array('name' => 'locale')) : '#', '!configuration' => (\Drupal::moduleHandler()->moduleExists('config_translation')) ? \Drupal::url('help.page', array('name' => 'config_translation')) : '#')) . '</p>';
+      $output .= '<p>' . t('The Language module allows you to configure the languages used on your site, and provides information for the for <a href="!content">Content Translation</a>, <a href="!interface">Interface Translation</a>, and <a href="!configuration">Configuration Translation</a> modules, if they are enabled. For more information, see the <a href="!doc_url">online documentation for the Language module</a>.', array('!doc_url' => 'https://drupal.org/documentation/modules/language', '!content' => (\Drupal::moduleHandler()->moduleExists('content_translation')) ? \Drupal::url('help.page', array('name' => 'content_translation')) : '#', '!interface' => (\Drupal::moduleHandler()->moduleExists('locale')) ? \Drupal::url('help.page', array('name' => 'locale')) : '#', '!configuration' => (\Drupal::moduleHandler()->moduleExists('config_translation')) ? \Drupal::url('help.page', array('name' => 'config_translation')) : '#')) . '</p>';
       $output .= '<h3>' . t('Uses') . '</h3>';
       $output .= '<dl>';
       $output .= '<dt>' . t('Adding languages') . '</dt>';
diff --git a/core/modules/node/node.module b/core/modules/node/node.module
index 4f8f610..8da95d7 100644
--- a/core/modules/node/node.module
+++ b/core/modules/node/node.module
@@ -82,7 +82,7 @@ function node_help($route_name, RouteMatchInterface $route_match) {
     case 'help.page.node':
       $output = '';
       $output .= '<h3>' . t('About') . '</h3>';
-      $output .= '<p>' . t('The Node module manages the creation, editing, deletion, settings, and display of the main site content. Content items managed by the Node module are typically displayed as pages on your site, and include a title, some meta-data (author, creation time, content type, etc.), and optional fields containing text or other data (fields are managed by the <a href="!field">Field module</a>). For more information, see <a href="!node">the online documentation for the Node module</a>.', array('!node' => 'https://drupal.org/documentation/modules/node', '!field' => \Drupal::url('help.page', array('name' => 'field')))) . '</p>';
+      $output .= '<p>' . t('The Node module manages the creation, editing, deletion, settings, and display of the main site content. Content items managed by the Node module are typically displayed as pages on your site, and include a title, some meta-data (author, creation time, content type, etc.), and optional fields containing text or other data (fields are managed by the <a href="!field">Field module</a>). For more information, see the <a href="!node">online documentation for the Node module</a>.', array('!node' => 'https://drupal.org/documentation/modules/node', '!field' => \Drupal::url('help.page', array('name' => 'field')))) . '</p>';
       $output .= '<h3>' . t('Uses') . '</h3>';
       $output .= '<dl>';
       $output .= '<dt>' . t('Creating content') . '</dt>';
diff --git a/core/modules/page_cache/page_cache.module b/core/modules/page_cache/page_cache.module
index 6322363..f95ade2 100644
--- a/core/modules/page_cache/page_cache.module
+++ b/core/modules/page_cache/page_cache.module
@@ -16,7 +16,7 @@ function page_cache_help($route_name, RouteMatchInterface $route_match) {
   switch ($route_name) {
     case 'help.page.page_cache':
       $output = '<h3>' . t('About') . '</h3>';
-      $output .= '<p>' . t('The Internal page cache module caches pages for anonymous users in the database.') . '</p>';
+      $output .= '<p>' . t('The Internal page cache module caches pages for anonymous users in the database. For more information, see the <a href="!documentation">online documentation for the Internal page cache module</a>.', array('!documentation' => 'https://drupal.org/documentation/modules/internal_page_cache')) . '</p>';
       $output .= '<h3>' . t('Uses') . '</h3>';
       $output .= '<dl>';
       $output .= '<dt>' . t('Speeding up your site') . '</dt>';
diff --git a/core/modules/search/search.module b/core/modules/search/search.module
index 62db411..ca07ca9 100644
--- a/core/modules/search/search.module
+++ b/core/modules/search/search.module
@@ -75,7 +75,7 @@ function search_help($route_name, RouteMatchInterface $route_match) {
     case 'help.page.search':
       $output = '';
       $output .= '<h3>' . t('About') . '</h3>';
-      $output .= '<p>' . t('The Search module provides the ability to set up search pages based on plugins provided by other modules. In Drupal core, there are two page-type plugins: the Content page type provides keyword searching for content managed by the Node module, and the Users page type provides keyword searching for registered users. Contributed modules may provide other page-type plugins. For more information, see <a href="!search-module">the online documentation for the Search module</a>.', array('!search-module' => 'https://drupal.org/documentation/modules/search')) . '</p>';
+      $output .= '<p>' . t('The Search module provides the ability to set up search pages based on plugins provided by other modules. In Drupal core, there are two page-type plugins: the Content page type provides keyword searching for content managed by the Node module, and the Users page type provides keyword searching for registered users. Contributed modules may provide other page-type plugins. For more information, see the <a href="!search-module">online documentation for the Search module</a>.', array('!search-module' => 'https://drupal.org/documentation/modules/search')) . '</p>';
       $output .= '<h3>' . t('Uses') . '</h3>';
       $output .= '<dl>';
       $output .= '<dt>' . t('Configuring search pages') . '</dt>';
diff --git a/core/modules/simpletest/simpletest.module b/core/modules/simpletest/simpletest.module
index 3b46028..145c987 100644
--- a/core/modules/simpletest/simpletest.module
+++ b/core/modules/simpletest/simpletest.module
@@ -22,7 +22,7 @@ function simpletest_help($route_name, RouteMatchInterface $route_match) {
     case 'help.page.simpletest':
       $output = '';
       $output .= '<h3>' . t('About') . '</h3>';
-      $output .= '<p>' . t('The Testing module provides a framework for running automated tests. It can be used to verify a working state of Drupal before and after any code changes, or as a means for developers to write and execute tests for their modules. For more information, see <a href="!simpletest">the online documentation for the Testing module</a>.', array('!simpletest' => 'https://drupal.org/documentation/modules/simpletest')) . '</p>';
+      $output .= '<p>' . t('The Testing module provides a framework for running automated tests. It can be used to verify a working state of Drupal before and after any code changes, or as a means for developers to write and execute tests for their modules. For more information, see the <a href="!simpletest">online documentation for the Testing module</a>.', array('!simpletest' => 'https://drupal.org/documentation/modules/simpletest')) . '</p>';
       $output .= '<h3>' . t('Uses') . '</h3>';
       $output .= '<dl>';
       $output .= '<dt>' . t('Running tests') . '</dt>';
diff --git a/core/modules/statistics/statistics.module b/core/modules/statistics/statistics.module
index ab8fae8..ffbe16b 100644
--- a/core/modules/statistics/statistics.module
+++ b/core/modules/statistics/statistics.module
@@ -19,7 +19,7 @@ function statistics_help($route_name, RouteMatchInterface $route_match) {
     case 'help.page.statistics':
       $output = '';
       $output .= '<h3>' . t('About') . '</h3>';
-      $output .= '<p>' . t('The Statistics module shows you how often content is viewed. This is useful in determining which pages of your site are most popular. For more information, see <a href="!statistics_do">the online documentation for the Statistics module</a>.', array('!statistics_do' => 'https://drupal.org/documentation/modules/statistics/')) . '</p>';
+      $output .= '<p>' . t('The Statistics module shows you how often content is viewed. This is useful in determining which pages of your site are most popular. For more information, see the <a href="!statistics_do">online documentation for the Statistics module</a>.', array('!statistics_do' => 'https://drupal.org/documentation/modules/statistics/')) . '</p>';
       $output .= '<h3>' . t('Uses') . '</h3>';
       $output .= '<dl>';
       $output .= '<dt>' . t('Displaying popular content') . '</dt>';
diff --git a/core/modules/system/src/Tests/Module/InstallUninstallTest.php b/core/modules/system/src/Tests/Module/InstallUninstallTest.php
index 125b754..f2f6be5 100644
--- a/core/modules/system/src/Tests/Module/InstallUninstallTest.php
+++ b/core/modules/system/src/Tests/Module/InstallUninstallTest.php
@@ -37,32 +37,62 @@ public function testInstallUninstall() {
     // Try to install and uninstall book, toolbar modules and its dependencies.
     $all_modules = system_rebuild_module_data();
 
+    // Test help on required modules, but do not test uninstalling.
+    $required_modules = array_filter($all_modules, function ($module) {
+      if (!empty($module->info['required']) || $module->status == TRUE) {
+        if ($module->info['package'] != 'Testing' && empty($module->info['hidden'])) {
+          return TRUE;
+        }
+      }
+      return FALSE;
+    });
+
+    $required_modules['help'] = $all_modules['help'];
+
+    // Test uninstalling without hidden, required, and already enabled modules.
     $all_modules = array_filter($all_modules, function ($module) {
-      // Filter hidden, required and already enabled modules.
       if (!empty($module->info['hidden']) || !empty($module->info['required']) || $module->status == TRUE || $module->info['package'] == 'Testing') {
         return FALSE;
       }
       return TRUE;
     });
 
-    // Go through each module in the list and try to install it (unless it was
-    // already installed automatically due to a dependency).
-    $automatically_installed = array();
+    // There are a couple of modules with special needs before they can be
+    // uninstalled. Make special methods for them.
+    $pre_uninstall = array(
+      'forum' => 'preUninstallForum',
+    );
+
+    // Install the Help module, and verify it installed successfully.
+    unset($all_modules['help']);
+    $this->assertModules(array('help'), FALSE);
+    $this->assertModuleTablesDoNotExist('help');
+    $edit = array();
+    $package = $required_modules['help']->info['package'];
+    $edit["modules[$package][help][enable]"] = TRUE;
+    $this->drupalPostForm('admin/modules', $edit, t('Save configuration'));
+    $this->assertText(t('The configuration options have been saved.'), 'Modules status has been updated.');
+    $this->assertText(t('hook_modules_installed fired for help'));
+    $this->assertModules(array('help'), TRUE);
+    $this->assertModuleTablesExist('help');
+    $this->assertModuleConfig('help');
+
+    // Test help for the required modules.
+    foreach ($required_modules as $name => $module) {
+      $this->assertHelp($name, $module->info['name']);
+    }
+
+    // Go through each module in the list and try to install and uninstall
+    // it with its dependencies.
     while (list($name, $module) = each($all_modules)) {
-      // Skip modules that have been automatically installed.
-      if (in_array($name, $automatically_installed)) {
-        continue;
-      }
+      $this->rebuildContainer();
+      $was_installed_list = \Drupal::moduleHandler()->getModuleList();
 
       // Start a list of modules that we expect to be installed this time.
       $modules_to_install = array($name);
       foreach (array_keys($module->requires) as $dependency) {
-        if (isset($all_modules[$dependency]) && !in_array($dependency, $automatically_installed)) {
+        if (isset($all_modules[$dependency])) {
           $modules_to_install[] = $dependency;
-
-          // Add any potential dependency of this module to the list of modules we
-          // expect to be automatically installed.
-          $automatically_installed[] = $dependency;
         }
       }
 
@@ -98,36 +128,49 @@ public function testInstallUninstall() {
         $this->assertLogMessage('system', "%module module installed.", array('%module' => $module_to_install), RfcLogLevel::INFO);
       }
 
-      // Uninstall the original module, and check appropriate
-      // hooks, tables, and log messages. (Later, we'll go back and do the
-      // same thing for modules that were enabled automatically.)
-      $this->assertSuccessfullUninstall($name, $package);
-    }
+      // Verify the help page.
+      $this->assertHelp($name, $module->info['name']);
 
-    // Go through all modules that were automatically installed, and try to
-    // uninstall them one by one.
-    while ($automatically_installed) {
-      $initial_count = count($automatically_installed);
-      foreach ($automatically_installed as $name) {
-        $package = $all_modules[$name]->info['package'];
-        // If the module can't be uninstalled due to dependencies, skip it and
-        // try again the next time. Otherwise, try to uninstall it.
-        $this->drupalGet('admin/modules/uninstall');
-        $disabled_checkbox = $this->xpath('//input[@type="checkbox" and @disabled="disabled" and @name="uninstall[' . $name . ']"]');
-        if (empty($disabled_checkbox)) {
-          $automatically_installed = array_diff($automatically_installed, array($name));
-          $this->assertSuccessfullUninstall($name, $package);
-        }
+      // Uninstall the original module, plus everything else that was installed
+      // with it.
+      $this->rebuildContainer();
+      if (isset($pre_uninstall[$name])) {
+        call_user_func(array($this, $pre_uninstall[$name]));
       }
-      $final_count = count($automatically_installed);
-      // If all checkboxes were disabled, something is really wrong with the
-      // test. Throw a failure and avoid an infinite loop.
-      if ($initial_count == $final_count) {
-        $this->fail('Remaining modules could not be disabled.');
-        break;
+      $now_installed_list = \Drupal::moduleHandler()->getModuleList();
+      $added_modules = array_diff(array_keys($now_installed_list), array_keys($was_installed_list));
+      while ($added_modules) {
+        $initial_count = count($added_modules);
+        foreach ($added_modules as $to_uninstall) {
+          // See if we can currently uninstall this module (if its dependencies
+          // have been uninstalled), and do so if we can.
+          $this->drupalGet('admin/modules/uninstall');
+          $field_name = "uninstall[$to_uninstall]";
+          $has_checkbox = $this->xpath('//input[@type="checkbox" and @name="' . $field_name . '"]');
+          $disabled = $this->xpath('//input[@type="checkbox" and @name="' . $field_name . '" and @disabled="disabled"]');
+
+          if (!empty($has_checkbox) && empty($disabled)) {
+            // This one is eligible for being uninstalled.
+            $package = $all_modules[$to_uninstall]->info['package'];
+            $this->assertSuccessfullUninstall($to_uninstall, $package);
+            $added_modules = array_diff($added_modules, array($to_uninstall));
+          }
+        }
+
+        // If we were not able to find a module to uninstall, fail and exit the
+        // loop.
+        $final_count = count($added_modules);
+        if ($initial_count == $final_count) {
+          $this->fail('Remaining modules could not be uninstalled for ' . $name);
+          break;
+        }
       }
     }
 
+    // Uninstall the help module and put it back into the list of modules.
+    $all_modules['help'] = $required_modules['help'];
+    $this->assertSuccessfullUninstall('help', $required_modules['help']->info['package']);
+
     // Now that all modules have been tested, go back and try to enable them
     // all again at once. This tests two things:
     // - That each module can be successfully enabled again after being
@@ -153,15 +196,6 @@ public function testInstallUninstall() {
    */
   protected function assertSuccessfullUninstall($module, $package = 'Core') {
     $edit = array();
-    if ($module == 'forum') {
-      // Forum cannot be uninstalled until all of the content entities related
-      // to it have been deleted.
-      $vid = $this->config('forum.settings')->get('vocabulary');
-      $terms = entity_load_multiple_by_properties('taxonomy_term', ['vid' => $vid]);
-      foreach ($terms as $term) {
-        $term->delete();
-      }
-    }
     $edit['uninstall[' . $module . ']'] = TRUE;
     $this->drupalPostForm('admin/modules/uninstall', $edit, t('Uninstall'));
     $this->drupalPostForm(NULL, NULL, t('Uninstall'));
@@ -181,4 +215,37 @@ protected function assertSuccessfullUninstall($module, $package = 'Core') {
     $this->assertNoModuleConfig($module);
   }
 
+  /**
+   * Verifies a module's help.
+   *
+   * Verifies that the module help page from hook_help() exists and can be
+   * displayed, and that it contains the phrase "Foo Bar module", where "Foo
+   * Bar" is the name of the module from the .info.yml file.
+   *
+   * @param string $module
+   *   Machine name of the module to verify.
+   * @param array $info
+   *   Human-readable name of the module.
+   */
+  protected function assertHelp($module, $name) {
+    $this->drupalGet('admin/help/' . $module);
+    $this->assertResponse(200, "Help for $module displayed successfully");
+    $this->assertText($name . ' module', "'$name module' is on the help page for $module");
+    $this->assertLink('online documentation for the ' . $name . ' module', 0, "Correct online documentation link is in the help page for $module");
+  }
+
+  /**
+   * Deletes forum taxonomy terms, so Forum can be uninstalled.
+   */
+  protected function preUninstallForum() {
+    // There only should be a 'General discussion' term in the 'forums'
+    // vocabulary, but just delete any terms there in case the name changes.
+    $query = \Drupal::entityQuery('taxonomy_term');
+    $query->condition('vid', 'forums');
+    $ids = $query->execute();
+    $storage = \Drupal::entityManager()->getStorage('taxonomy_term');
+    $terms = $storage->loadMultiple($ids);
+    $storage->delete($terms);
+  }
+
 }
diff --git a/core/modules/tour/tour.module b/core/modules/tour/tour.module
index 16acf19..03f07f8 100644
--- a/core/modules/tour/tour.module
+++ b/core/modules/tour/tour.module
@@ -16,7 +16,7 @@ function tour_help($route_name, RouteMatchInterface $route_match) {
     case 'help.page.tour':
       $output = '';
       $output .= '<h3>' . t('About') . '</h3>';
-      $output .= '<p>' . t("The Tour module provides users with guided tours of the site interface. Each tour consists of several tips that highlight elements of the user interface, guide the user through a workflow, or explain key concepts of the website. For more information, see <a href='!tour'>the online documentation for the Tour module</a>.", array('!tour' => 'https://drupal.org/documentation/modules/tour')) . '</p>';
+      $output .= '<p>' . t("The Tour module provides users with guided tours of the site interface. Each tour consists of several tips that highlight elements of the user interface, guide the user through a workflow, or explain key concepts of the website. For more information, see the <a href='!tour'>online documentation for the Tour module</a>.", array('!tour' => 'https://drupal.org/documentation/modules/tour')) . '</p>';
       $output .= '<h3>' . t('Uses') . '</h3>';
       $output .= '<dl>';
       $output .= '<dt>' . t('Viewing tours') . '</dt>';
diff --git a/core/modules/tracker/tracker.module b/core/modules/tracker/tracker.module
index 8c4ec2a..fc0bfb7 100644
--- a/core/modules/tracker/tracker.module
+++ b/core/modules/tracker/tracker.module
@@ -19,7 +19,7 @@ function tracker_help($route_name, RouteMatchInterface $route_match) {
   switch ($route_name) {
     case 'help.page.tracker':
       $output = '<h3>' . t('About') . '</h3>';
-      $output .= '<p>' . t('The Activity Tracker module displays the most recently added and updated content on your site, and allows you to follow new content created by each user. This module has no configuration options. For more information, see the <a href="!tracker">online documentation for the Tracker module</a>.', array('!tracker' => 'https://drupal.org/documentation/modules/tracker')) . '</p>';
+      $output .= '<p>' . t('The Activity Tracker module displays the most recently added and updated content on your site, and allows you to follow new content created by each user. This module has no configuration options. For more information, see the <a href="!tracker">online documentation for the Activity Tracker module</a>.', array('!tracker' => 'https://drupal.org/documentation/modules/tracker')) . '</p>';
       $output .= '<h3>' . t('Uses') . '</h3>';
       $output .= '<dl>';
       $output .= '<dt>' . t('Tracking new and updated site content') . '</dt>';
diff --git a/core/modules/update/update.module b/core/modules/update/update.module
index 63ed8d0..20126b5 100644
--- a/core/modules/update/update.module
+++ b/core/modules/update/update.module
@@ -73,7 +73,7 @@ function update_help($route_name, RouteMatchInterface $route_match) {
     case 'help.page.update':
       $output = '';
       $output .= '<h3>' . t('About') . '</h3>';
-      $output .= '<p>' . t('The Update Manager module periodically checks for new versions of your site\'s software (including contributed modules and themes), and alerts administrators to available updates. The Update Manager system is also used by some other modules to manage updates and downloads; for example, the Interface Translation module uses the Update Manager to download translations from the localization server. Note that whenever the Update Manager system is used, anonymous usage statistics are sent to Drupal.org. If desired, you may disable the Update Manager module from the <a href="!modules">Extend page</a>; if you do so, functionality that depends on the Update Manager system will not work. For more information, see <a href="!update">the online documentation for the Update Manager module</a>.', array('!update' => 'https://www.drupal.org/documentation/modules/update', '!modules' => \Drupal::url('system.modules_list'))) . '</p>';
+      $output .= '<p>' . t('The Update Manager module periodically checks for new versions of your site\'s software (including contributed modules and themes), and alerts administrators to available updates. The Update Manager system is also used by some other modules to manage updates and downloads; for example, the Interface Translation module uses the Update Manager to download translations from the localization server. Note that whenever the Update Manager system is used, anonymous usage statistics are sent to Drupal.org. If desired, you may disable the Update Manager module from the <a href="!modules">Extend page</a>; if you do so, functionality that depends on the Update Manager system will not work. For more information, see the <a href="!update">online documentation for the Update Manager module</a>.', array('!update' => 'https://www.drupal.org/documentation/modules/update', '!modules' => \Drupal::url('system.modules_list'))) . '</p>';
       // Only explain the Update manager if it has not been disabled.
       if (update_manager_access()) {
         $output .= '<p>' . t('The Update Manager also allows administrators to update and install modules and themes through the administration interface.') . '</p>';
