diff --git a/bin/tools b/bin/tools
new file mode 120000
index 0000000000000000000000000000000000000000..a4b735778c94f71b83ae24e7e4e3a8363b599e2c
--- /dev/null
+++ b/bin/tools
@@ -0,0 +1 @@
+../tools/bin/tools
\ No newline at end of file
diff --git a/content-migration/hooks/fetch-wiki-caches b/content-migration/hooks/fetch-wiki-caches
deleted file mode 100755
index 17d8d0e816f6d29ce766e9d1058d6f7ecb5409dc..0000000000000000000000000000000000000000
--- a/content-migration/hooks/fetch-wiki-caches
+++ /dev/null
@@ -1,27 +0,0 @@
-#!/usr/bin/env php
-<?php
-
-include __DIR__ . '/hooks-by-category.php';
-
-$wiki_url = 'https://wiki.civicrm.org/confluence/display/CRMDOC';
-$cache_dir = __DIR__ . '/wiki_cache';
-
-chdir($cache_dir);
-
-foreach ($hooks_by_category as $category => $hooks) {
-  foreach ($hooks as $hook) {
-    $hook_name = $hook['name'];
-    if ( file_exists($hook_name) ) {
-      echo "SKIPPING: $hook_name (already cached)";
-    }
-    else {
-      echo "DOWNLOADING: $hook_name" . PHP_EOL;
-      system("curl '$wiki_url/$hook_name' > '$hook_name'");
-    }
-    echo PHP_EOL;
-  }
-}
-
-echo "DONE" . PHP_EOL;
-
-
diff --git a/content-migration/hooks/hooks-by-category.php b/content-migration/hooks/hooks-by-category.php
deleted file mode 100644
index 30931c8fc61a3f962f17d28a08487aaaf14767e0..0000000000000000000000000000000000000000
--- a/content-migration/hooks/hooks-by-category.php
+++ /dev/null
@@ -1,133 +0,0 @@
-<?php
-
-$hooks_by_category = [
-  "Database" => [
-    ['name' => "hook_civicrm_copy", 'is_deprecated' => false],
-    ['name' => "hook_civicrm_custom", 'is_deprecated' => false],
-    ['name' => "hook_civicrm_managed", 'is_deprecated' => false],
-    ['name' => "hook_civicrm_merge", 'is_deprecated' => false],
-    ['name' => "hook_civicrm_post", 'is_deprecated' => false],
-    ['name' => "hook_civicrm_pre", 'is_deprecated' => false],
-    ['name' => "hook_civicrm_trigger_info", 'is_deprecated' => false],
-    ['name' => "hook_civicrm_referenceCounts", 'is_deprecated' => false],
-    ['name' => "hook_civicrm_postSave_table_name", 'is_deprecated' => false],
-  ],
-  "Extension lifecycle" => [
-    ['name' => "hook_civicrm_disable", 'is_deprecated' => false],
-    ['name' => "hook_civicrm_enable", 'is_deprecated' => false],
-    ['name' => "hook_civicrm_install", 'is_deprecated' => false],
-    ['name' => "hook_civicrm_uninstall", 'is_deprecated' => false],
-    ['name' => "hook_civicrm_upgrade", 'is_deprecated' => false],
-    ['name' => "hook_civicrm_postInstall", 'is_deprecated' => false],
-  ],
-  "Form" => [
-    ['name' => "hook_civicrm_alterContent", 'is_deprecated' => false],
-    ['name' => "hook_civicrm_buildForm", 'is_deprecated' => false],
-    ['name' => "hook_civicrm_postProcess", 'is_deprecated' => false],
-    ['name' => "hook_civicrm_validateForm", 'is_deprecated' => false],
-    ['name' => "hook_civicrm_alterTemplateFile", 'is_deprecated' => false],
-    ['name' => "hook_civicrm_preProcess", 'is_deprecated' => false],
-    ['name' => "hook_civicrm_idsException", 'is_deprecated' => false],
-  ],
-  "GUI" => [
-    ['name' => "hook_civicrm_buildAmount", 'is_deprecated' => false],
-    ['name' => "hook_civicrm_caseSummary", 'is_deprecated' => false],
-    ['name' => "hook_civicrm_customFieldOptions", 'is_deprecated' => true],
-    ['name' => "hook_civicrm_dashboard", 'is_deprecated' => false],
-    ['name' => "hook_civicrm_links", 'is_deprecated' => false],
-    ['name' => "hook_civicrm_navigationMenu", 'is_deprecated' => false],
-    ['name' => "hook_civicrm_pageRun", 'is_deprecated' => false],
-    ['name' => "hook_civicrm_searchColumns", 'is_deprecated' => false],
-    ['name' => "hook_civicrm_searchTasks", 'is_deprecated' => false],
-    ['name' => "hook_civicrm_summary", 'is_deprecated' => false],
-    ['name' => "hook_civicrm_summaryActions", 'is_deprecated' => false],
-    ['name' => "hook_civicrm_tabs", 'is_deprecated' => true],
-    ['name' => "hook_civicrm_xmlMenu", 'is_deprecated' => false],
-    ['name' => "hook_civicrm_tabset", 'is_deprecated' => false],
-    ['name' => "hook_civicrm_dashboard_defaults", 'is_deprecated' => false],
-    ['name' => "hook_civicrm_contact_get_displayname", 'is_deprecated' => false],
-    ['name' => "hook_civicrm_fieldOptions", 'is_deprecated' => false],
-    ['name' => "hook_civicrm_alterMenu", 'is_deprecated' => false],
-  ],
-  "Mail" => [
-    ['name' => "hook_civicrm_alterMailParams", 'is_deprecated' => false],
-    ['name' => "hook_civicrm_emailProcessor", 'is_deprecated' => false],
-    ['name' => "hook_civicrm_emailProcessorContact", 'is_deprecated' => false],
-    ['name' => "hook_civicrm_mailingGroups", 'is_deprecated' => false],
-    ['name' => "hook_civicrm_postEmailSend", 'is_deprecated' => false],
-    ['name' => "hook_civicrm_alterMailer", 'is_deprecated' => false],
-    ['name' => "hook_civicrm_unsubscribeGroups", 'is_deprecated' => false],
-    ['name' => "hook_civicrm_alterMailContent", 'is_deprecated' => false],
-    ['name' => "hook_civicrm_postMailing", 'is_deprecated' => false],
-  ],
-  "Permission" => [
-    ['name' => "hook_civicrm_aclGroup", 'is_deprecated' => false],
-    ['name' => "hook_civicrm_aclWhereClause", 'is_deprecated' => false],
-    ['name' => "hook_civicrm_alterAPIPermissions", 'is_deprecated' => false],
-    ['name' => "hook_civicrm_permission_check", 'is_deprecated' => false],
-    ['name' => "hook_civicrm_permission", 'is_deprecated' => false],
-    ['name' => "hook_civicrm_selectWhereClause", 'is_deprecated' => false],
-  ],
-  "Uncategorized" => [
-    ['name' => "hook_civicrm_alterCalculatedMembershipStatus", 'is_deprecated' => false],
-    ['name' => "hook_civicrm_alterBarcode", 'is_deprecated' => false],
-    ['name' => "hook_civicrm_alterBadge", 'is_deprecated' => false],
-    ['name' => "hook_civicrm_alterPaymentProcessorParams", 'is_deprecated' => false],
-    ['name' => "hook_civicrm_alterSettingsFolders", 'is_deprecated' => false],
-    ['name' => "hook_civicrm_alterSettingsMetaData", 'is_deprecated' => false],
-    ['name' => "hook_civicrm_apiWrappers", 'is_deprecated' => false],
-    ['name' => "hook_civicrm_buildStateProvinceForCountry", 'is_deprecated' => false],
-    ['name' => "hook_civicrm_config", 'is_deprecated' => false],
-    ['name' => "hook_civicrm_contactListQuery", 'is_deprecated' => true],
-    ['name' => "hook_civicrm_cron", 'is_deprecated' => false],
-    ['name' => "hook_civicrm_dupeQuery", 'is_deprecated' => false],
-    ['name' => "hook_civicrm_export", 'is_deprecated' => false],
-    ['name' => "hook_civicrm_import", 'is_deprecated' => false],
-    ['name' => "hook_civicrm_membershipTypeValues", 'is_deprecated' => false],
-    ['name' => "hook_civicrm_tokens", 'is_deprecated' => false],
-    ['name' => "hook_civicrm_tokenValues", 'is_deprecated' => false],
-    ['name' => "hook_civicrm_queryObjects", 'is_deprecated' => false],
-    ['name' => "hook_civicrm_check", 'is_deprecated' => false],
-    ['name' => "hook_civicrm_optionValues", 'is_deprecated' => true],
-    ['name' => "hook_civicrm_coreResourceList", 'is_deprecated' => false],
-    ['name' => "hook_civicrm_angularModules", 'is_deprecated' => false],
-    ['name' => "hook_civicrm_container", 'is_deprecated' => false],
-    ['name' => "hook_civicrm_crudLink", 'is_deprecated' => false],
-    ['name' => "hook_civicrm_fileSearches", 'is_deprecated' => false],
-    ['name' => "hook_civicrm_notePrivacy", 'is_deprecated' => false],
-    ['name' => "hook_civicrm_eventDiscount", 'is_deprecated' => false],
-    ['name' => "hook_civicrm_recent", 'is_deprecated' => false],
-    ['name' => "hook_civicrm_unhandledException", 'is_deprecated' => false],
-    ['name' => "hook_civicrm_alterMailingLabelParams", 'is_deprecated' => false],
-    ['name' => "hook_civicrm_geocoderFormat", 'is_deprecated' => false],
-    ['name' => "hook_civicrm_alterLogTables", 'is_deprecated' => false],
-  ],
-  "Case" => [
-    ['name' => "hook_civicrm_caseChange", 'is_deprecated' => false],
-    ['name' => "hook_civicrm_caseTypes", 'is_deprecated' => false],
-    ['name' => "hook_civicrm_post_case_merge", 'is_deprecated' => false],
-    ['name' => "hook_civicrm_pre_case_merge", 'is_deprecated' => false],
-  ],
-  "Batch" => [
-    ['name' => "hook_civicrm_batchItems", 'is_deprecated' => false],
-    ['name' => "hook_civicrm_batchQuery", 'is_deprecated' => false],
-  ],
-  "Entity" => [
-    ['name' => "hook_civicrm_entityTypes", 'is_deprecated' => false],
-  ],
-  "CiviRules" => [
-    ['name' => "hook_civirules_alter_trigger_data", 'is_deprecated' => false],
-    ['name' => "hook_civirules_logger", 'is_deprecated' => false],
-  ],
-  "Profile" => [
-    ['name' => "hook_civicrm_buildProfile", 'is_deprecated' => false],
-    ['name' => "hook_civicrm_buildUFGroupsForModule", 'is_deprecated' => false],
-    ['name' => "hook_civicrm_processProfile", 'is_deprecated' => false],
-    ['name' => "hook_civicrm_searchProfile", 'is_deprecated' => false],
-    ['name' => "hook_civicrm_validateProfile", 'is_deprecated' => false],
-    ['name' => "hook_civicrm_viewProfile", 'is_deprecated' => false],
-  ],
-  "Report" => [
-    ['name' => "hook_civicrm_alterReportVar", 'is_deprecated' => false],
-  ],
-];
\ No newline at end of file
diff --git a/content-migration/hooks/migrate-hooks b/content-migration/hooks/migrate-hooks
deleted file mode 100755
index 6d6584ab734f4355110ac0738b1f4527eece8a34..0000000000000000000000000000000000000000
--- a/content-migration/hooks/migrate-hooks
+++ /dev/null
@@ -1,64 +0,0 @@
-#!/usr/bin/env php
-<?php
-
-include __DIR__ . '/hooks-by-category.php';
-
-$cache_dir = __DIR__ . '/wiki_cache';
-$root_dir = dirname(dirname(__DIR__));
-$hooks_dir = "$root_dir/docs/hooks";
-
-
-function clean_markdown($markdown) {
-  // add domain name to all hyperlinks that point to the wiki
-  $pattern = '@\]\((/confluence[^)]*)\)@';
-  $replace = '](https://wiki.civicrm.org$1)';
-  $markdown = preg_replace($pattern,$replace,$markdown);
-
-  // set all headings of level 3 and above to level 2
-  $pattern = '@^(##)(#+) (.*)$@m';
-  $replace = '## $3';
-  $markdown = preg_replace($pattern,$replace,$markdown);
-
-  return $markdown;
-}
-
-
-
-# create hooks directory if needed
-if ( !is_dir($hooks_dir) ) {
-  mkdir($hooks_dir);
-}
-chdir($hooks_dir);
-foreach ($hooks_by_category as $category => $hooks) {
-  foreach ($hooks as $hook) {
-    $hook_name = $hook['name'];
-    $markdown_file = "$hook_name.md";
-    $html = "$cache_dir/$hook_name";
-    if ( file_exists($html) && !file_exists($markdown_file) ) {
-      echo "converting $hook_name ... ";
-      $conv_output_array = array();
-      $conv_status = 1;
-      exec("webpage2md $html", $conv_output_array, $conv_status);
-      if( $conv_status == 0 ) {
-        $conv_output = implode("\n",$conv_output_array);
-        $conv_output = clean_markdown($conv_output);
-        file_put_contents($markdown_file, $conv_output);
-        echo "done" . PHP_EOL;
-      }
-      else {
-        echo "ERROR CONVERTING $hook_name" . PHP_EOL;
-        echo "$conv_output";
-      }
-    }
-    else if ( !file_exists($html) ) {
-      echo "WARNING: $hook_name not yet fetched" . PHP_EOL;
-    }
-    else if ( file_exists($markdown_file) ) {
-      echo "ignoring $hook_name (markdown file already exists)" . PHP_EOL;
-    }
-  }
-}
-
-
-
-
diff --git a/content-migration/hooks/print-nav-yaml b/content-migration/hooks/print-nav-yaml
deleted file mode 100755
index 5b3e69c208e17880cecc2617a8f392d4a9d36a73..0000000000000000000000000000000000000000
--- a/content-migration/hooks/print-nav-yaml
+++ /dev/null
@@ -1,19 +0,0 @@
-#!/usr/bin/env php
-<?php
-
-include __DIR__ . '/hooks-by-category.php';
-
-echo "- Hooks:" . PHP_EOL;
-foreach ($hooks_by_category as $category => $hooks) {
-  echo "  - $category hooks:" . PHP_EOL;
-  foreach ($hooks as $hook) {
-    $hook_name = $hook['name'];
-    if ( $hook['is_deprecated'] ) {
-      $menu_name = "<del>$hook_name</del>";
-    }
-    else {
-      $menu_name = $hook_name;
-    }
-    echo "    - $menu_name: hooks/$hook_name.md" . PHP_EOL;
-  }
-}
diff --git a/content-migration/hooks/print-redirects b/content-migration/hooks/print-redirects
deleted file mode 100755
index c70687d76b2c3460dc3bb9edacf6859d02768f8c..0000000000000000000000000000000000000000
--- a/content-migration/hooks/print-redirects
+++ /dev/null
@@ -1,11 +0,0 @@
-#!/usr/bin/env php
-<?php
-
-include __DIR__ . '/hooks-by-category.php';
-
-foreach ($hooks_by_category as $category => $hooks) {
-  foreach ($hooks as $hook) {
-    $hook_name = $hook['name'];
-    echo "$hook_name hooks/$hook_name" . PHP_EOL;
-  }
-}
diff --git a/content-migration/hooks/wiki_cache/.gitignore b/content-migration/hooks/wiki_cache/.gitignore
deleted file mode 100644
index 86d0cb2726c6c7c179b99520c452dd1b68e7a813..0000000000000000000000000000000000000000
--- a/content-migration/hooks/wiki_cache/.gitignore
+++ /dev/null
@@ -1,4 +0,0 @@
-# Ignore everything in this directory
-*
-# Except this file
-!.gitignore
\ No newline at end of file
diff --git a/docs/documentation/index.md b/docs/documentation/index.md
index 8e36bc840a1ecfa773abab69468cbaf475d37cd8..d783bfef1e1928fe09963a2bdaabdeed410ea789 100644
--- a/docs/documentation/index.md
+++ b/docs/documentation/index.md
@@ -149,6 +149,21 @@ If you'd like to move a page, take the following steps:
 !!! note
     Page redirection *won't work locally* (when previewing with `mkdocs serve`), but it *will* work once the guide is published on docs.civicrm.org. The redirection is implemented as part of our [docs-publisher](https://lab.civicrm.org/documentation/docs-publisher) app.
 
+
+## Auto-generated documentation {:#auto-gen}
+
+Some guides may have auto-generated content, which is summarized here.
+
+### In the Developer Guide {:#auto-gen-dev}
+
+This Developer Guide has an automatically-generated [list of all hooks](/hooks/list.md). To re-create this list, run the following command from the root level of the repository:
+
+```
+./bin/tools generate:hooks-list
+```
+
+Our editing workflow currently requires someone to manually run this command after and commit its changes whenever hooks files are edited.
+
 ## Content attribution guidelines {:#attribution}
 
 All CiviCRM documentation content is licensed [CC BY-SA 3.0](https://creativecommons.org/licenses/by-sa/3.0/). This means that if you want to copy content out of our docs and use it elsewhere, you're welcome to do so as long as your give attribution to the author. 
diff --git a/docs/hooks/hook_civicrm_aclGroup.md b/docs/hooks/hook_civicrm_aclGroup.md
index 8225b9519bbf7e419f8147e5d089e4f71af0380f..385c467c5526b61b54044d324d686c1f9861c05e 100644
--- a/docs/hooks/hook_civicrm_aclGroup.md
+++ b/docs/hooks/hook_civicrm_aclGroup.md
@@ -1,10 +1,13 @@
 # hook_civicrm_aclGroup
 
-## Description
+## Summary
 
 This hook is called when composing the ACL to restrict access to civicrm
-entities (civicrm groups, profiles and events). NOTE: In order to use
-this hook you must uncheck "View All Contacts" AND "Edit All Contacts"
+entities (civicrm groups, profiles and events).
+
+## Notes
+
+In order to use this hook you must uncheck "View All Contacts" AND "Edit All Contacts"
 in Drupal Permissions for the user role you want to limit. You can then
 go into CiviCRM and grant permission to Edit or View "All Contacts" or
 "Certain Groups". See the Forum Topic at:
diff --git a/docs/hooks/hook_civicrm_aclWhereClause.md b/docs/hooks/hook_civicrm_aclWhereClause.md
index f0f85df8f9368d2cc734c81fee0935d0bea67952..356dc2d807652b206780067f7568ff58d2c9a538 100644
--- a/docs/hooks/hook_civicrm_aclWhereClause.md
+++ b/docs/hooks/hook_civicrm_aclWhereClause.md
@@ -1,17 +1,19 @@
 # hook_civicrm_aclWhereClause
 
-## Description
+## Summary
 
 This hook is called when composing the ACL where clause to restrict
 visibility of contacts to the logged in user.
 
-Note that this hook is called only when filling up the
-civicrm_acl_contact_cache table, and not every time a contact SELECT
+## Notes
+
+This hook is called only when filling up the
+`civicrm_acl_contact_cache` table, and not every time a contact `SELECT`
 query is performed. Those will join onto the
-civicrm_acl_contact_cache table.
+`civicrm_acl_contact_cache` table.
 
-*NB: This hook will not be called at all if the logged in user has
-access to the "edit all contacts" permission.*
+!!! caution "Caveat"
+    It will not be called at all if the logged in user has access to the "edit all contacts" permission.
 
 ## Definition
 
diff --git a/docs/hooks/hook_civicrm_alterAPIPermissions.md b/docs/hooks/hook_civicrm_alterAPIPermissions.md
index c8b2ea9d5fd4e4fafe1f8a44bc314ad11cc52285..da4292ddc4089fde2c1dd53682c09adb87976bd7 100644
--- a/docs/hooks/hook_civicrm_alterAPIPermissions.md
+++ b/docs/hooks/hook_civicrm_alterAPIPermissions.md
@@ -1,11 +1,12 @@
 # hook_civicrm_alterAPIPermissions
 
-## Description
+## Summary
 
-This hook is called when API 3 permissions are checked and can alter the
-`$permissions` structure from `CRM/Core/DAO/permissions.php` (as well as
-the API `$params` array) based on the `$entity` and `$action` (or
-unconditionally).
+This hook is called when API 3 permissions are checked.
+
+## Notes
+
+This hook can alter the `$permissions` structure from `CRM/Core/DAO/permissions.php` (as well as the API `$params` array) based on the `$entity` and `$action` (or unconditionally).
 
 !!! Note
     If a given entity/action permissions are unset, the default
diff --git a/docs/hooks/hook_civicrm_alterBadge.md b/docs/hooks/hook_civicrm_alterBadge.md
index e45e8cf466328ff7eb39a4728a9544b3e004cb8d..dd6cc66209912a4309059079d95fd9987ca4fdd2 100644
--- a/docs/hooks/hook_civicrm_alterBadge.md
+++ b/docs/hooks/hook_civicrm_alterBadge.md
@@ -1,9 +1,12 @@
 # hook_civicrm_alterBadge
 
-## Description
+## Summary
 
-This hook allows one to modify the content and format of the name
-badges. Available in 4.5+.
+This hook allows you to modify the content and format of name badges.
+
+## Availability
+
+Available in 4.5+.
 
 ## Definition
 
diff --git a/docs/hooks/hook_civicrm_alterBarcode.md b/docs/hooks/hook_civicrm_alterBarcode.md
index b9005c4f0ef5692d507bd60526c8187e3314ad0f..f02e0e396a8be0f87cf48cba7ccb1d8cc82ffb39 100644
--- a/docs/hooks/hook_civicrm_alterBarcode.md
+++ b/docs/hooks/hook_civicrm_alterBarcode.md
@@ -1,8 +1,11 @@
 # hook_civicrm_alterBarcode
 
-## Description
+## Summary
+
+This hook allows you to modify the content that is encoded in barcode.
+
+## Availability
 
-This hook allows one to modify the content that is encoded in barcode.
 Available in 4.4+.
 
 ## Definition
diff --git a/docs/hooks/hook_civicrm_alterCalculatedMembershipStatus.md b/docs/hooks/hook_civicrm_alterCalculatedMembershipStatus.md
index d6afc82a4fc0fa1651015c08473766939651c31e..2ed7ac95d25ad86877b27a57009acfebf5146ffe 100644
--- a/docs/hooks/hook_civicrm_alterCalculatedMembershipStatus.md
+++ b/docs/hooks/hook_civicrm_alterCalculatedMembershipStatus.md
@@ -1,22 +1,25 @@
 # hook_civicrm_alterCalculatedMembershipStatus
 
-## Description
+## Summary
 
-This hook is called when calculating the membership status - e.g on a
-form or in the cron job that rolls over statuses
+This hook is called when calculating the membership status.
+
+## Notes
+
+Examples of when this hook is called include:
+
+  * on a form
+  * in the cron job that rolls over statuses
 
 ## Definition
 
-`hook_civicrm_alterCalculatedMembershipStatus(&$membershipStatus, $arguments, $membership) {`{.java
-.plain}
+    hook_civicrm_alterCalculatedMembershipStatus(&$membershipStatus, $arguments, $membership)
 
 ## Parameters
 
    * $membershipStatus the calculated membership status array
-
    * $arguments arguments used in the calculation
-
-   *  $membership the membership array from the calling function
+   * $membership the membership array from the calling function
 
 ## Added
 
diff --git a/docs/hooks/hook_civicrm_alterContent.md b/docs/hooks/hook_civicrm_alterContent.md
index c6d23f1f8e2af4fc99244089ff040582d7526191..eeeea161b4fa7bbbb8ac4c6469138ec2b02256e1 100644
--- a/docs/hooks/hook_civicrm_alterContent.md
+++ b/docs/hooks/hook_civicrm_alterContent.md
@@ -1,9 +1,9 @@
 # hook_civicrm_alterContent
 
-## Description
+## Summary
 
 This hook is invoked after all the content of a CiviCRM form or page is
-generated. It allows for direct manipulation of the generated content.
+generated and allows for direct manipulation of the generated content.
 
 ## Definition
 
diff --git a/docs/hooks/hook_civicrm_alterLogTables.md b/docs/hooks/hook_civicrm_alterLogTables.md
index f6daa47795cc8694bb94802991ebf8e06b699268..bb02f58a91b41ee21d688a328ab759dc222811c5 100644
--- a/docs/hooks/hook_civicrm_alterLogTables.md
+++ b/docs/hooks/hook_civicrm_alterLogTables.md
@@ -1,26 +1,17 @@
 # hook_civicrm_alterLogTables
 
-## Description
+## Summary
 
 This hook allows you to amend the specification of the log tables to be
-created when logging is turned on. You can adjust the specified tables
-and the engine and define indexes and exceptions.\
- \
- Note that CiviCRM creates log tables according to the specification at
-the point of creation. It does not update them if you change the
-specification, except with regards to adding additional tables. Tables
-are never automatically dropped.
+created when logging is turned on.
 
-Turning logging on and off will cause any adjustments to the exceptions
-to be enacted as that information is in the triggers not the log tables,
-which are recreated.
+## Notes
 
+You can adjust the specified tables and the engine and define indexes and exceptions. Note that CiviCRM creates log tables according to the specification at the point of creation. It does not update them if you change the specification, except with regards to adding additional tables. Tables are never automatically dropped.
 
+Turning logging on and off will cause any adjustments to the exceptions to be enacted as that information is in the triggers not the log tables, which are recreated.
 
-There is, however, a function that will convert Archive tables to log
-tables (one way) if the hook is in play. This has to be done
-deliberately by calling the system.updatelogtables api and it can be a
-slow process.
+There is, however, a function that will convert Archive tables to log tables (one way) if the hook is in play. This has to be done deliberately by calling the `system.updatelogtables` api and it can be a slow process.
 
 ## Availability
 
@@ -28,19 +19,11 @@ This hook was first available in CiviCRM 4.7.7.
 
 ## Definition
 
-
-
-  ---------------------------------------------------------------
-  `hook_`{.java .plain}civicrm_alterLogTables(&$logTableSpec)
-  ---------------------------------------------------------------
-
-
+    hook_civicrm_alterLogTables(&$logTableSpec)
 
 ## Parameters
 
--   @param array $logTableSpec\
-     \
-     \
+-   @param array $logTableSpec
 
 ## Example
 
diff --git a/docs/hooks/hook_civicrm_alterMailContent.md b/docs/hooks/hook_civicrm_alterMailContent.md
index 1febfbbf936e046d3bf7caf1140d191fcb6c2ad7..86d2cd378c245e249ebfe7e3968a9a780f5d001d 100644
--- a/docs/hooks/hook_civicrm_alterMailContent.md
+++ b/docs/hooks/hook_civicrm_alterMailContent.md
@@ -1,6 +1,6 @@
 # hook_civicrm_alterMailContent
 
-## Description
+## Summary
 
 This hook is called after getting the content of the mail and before
 tokenizing it.
diff --git a/docs/hooks/hook_civicrm_alterMailParams.md b/docs/hooks/hook_civicrm_alterMailParams.md
index b24d7bf6796aa0d15268e65d54ec609f793d0509..94e40550e8bd334a903d3097ae53fd7180203d35 100644
--- a/docs/hooks/hook_civicrm_alterMailParams.md
+++ b/docs/hooks/hook_civicrm_alterMailParams.md
@@ -1,6 +1,6 @@
 # hook_civicrm_alterMailParams
 
-## Description
+## Summary
 
 This hook is called when an email is about to be sent by CiviCRM.
 
diff --git a/docs/hooks/hook_civicrm_alterMailer.md b/docs/hooks/hook_civicrm_alterMailer.md
index 22d27922544e1262a0b958d5fa771ef0464abd94..759c4199043f68abe320dc9a22367c33755ec2fd 100644
--- a/docs/hooks/hook_civicrm_alterMailer.md
+++ b/docs/hooks/hook_civicrm_alterMailer.md
@@ -1,10 +1,12 @@
 # hook_civicrm_alterMailer
 
-## Description
+## Summary
 
 This hook is called when CiviCRM prepares an email driver class to
 handle outbound message delivery.
 
+## Availability
+
 Introduced in CiviCRM v4.4.
 
 ## Definition
diff --git a/docs/hooks/hook_civicrm_alterMailingLabelParams.md b/docs/hooks/hook_civicrm_alterMailingLabelParams.md
index cad6a2c0603dbdffd87fc736067e09eb2a60a54b..4206636598d65e87af0a21ae841325e1f2cd7621 100644
--- a/docs/hooks/hook_civicrm_alterMailingLabelParams.md
+++ b/docs/hooks/hook_civicrm_alterMailingLabelParams.md
@@ -1,9 +1,13 @@
 # hook_civicrm_alterMailingLabelParams
 
-## Description
+## Summary
 
 This hook is called to alter the parameters used to generate mailing
-labels. To be added in CiviCRM 4.1 or later.
+labels.
+
+## Availability
+
+CiviCRM 4.1 or later
 
 ## Definition
 
diff --git a/docs/hooks/hook_civicrm_alterMenu.md b/docs/hooks/hook_civicrm_alterMenu.md
index 4215047c809a3e28e66600d1abd16b20cd47dde0..4383df0378dc067a6f8c5b46e2deb19419d94fe5 100644
--- a/docs/hooks/hook_civicrm_alterMenu.md
+++ b/docs/hooks/hook_civicrm_alterMenu.md
@@ -1,25 +1,24 @@
 # hook_civicrm_alterMenu
 
-## Description
+## Summary
 
-This hook is called when building CiviCRM's list of HTTP routes. This
-hook should be used when you want to register custom paths or URLS. You
-will need to visit <your_site>/civicrm/menu/rebuild?reset=1 to pick
-up your additions.
-
-Added in CiviCRM 4.7.11.
+This hook is called when building CiviCRM's list of HTTP routes and should be used when you want to register custom paths or URLS.
 
+## Notes
 
+You will need to visit `/civicrm/menu/rebuild?reset=1` to pick up your additions.
 
 !!! note "Comparison of Related Hooks"
     This is one of three related hooks. The hooks:
 
     -   [hook_civicrm_navigationMenu](/hooks/hook_civicrm_navigationMenu.md) manipulates the navigation bar at the top of every screen
-    -    [hook_civicrm_alterMenu](/hooks/hook_civicrm_alterMenu.md) manipulates the list of HTTP routes (using PHP arrays)
+    -   [hook_civicrm_alterMenu](/hooks/hook_civicrm_alterMenu.md) manipulates the list of HTTP routes (using PHP arrays)
     -   [hook_civicrm_xmlMenu](/hooks/hook_civicrm_xmlMenu.md) manipulates the list of HTTP routes (using XML files)
 
 
+## Availability
 
+Added in CiviCRM 4.7.11.
 
 
 ## Definition
diff --git a/docs/hooks/hook_civicrm_alterPaymentProcessorParams.md b/docs/hooks/hook_civicrm_alterPaymentProcessorParams.md
index f7c251d1b172fc8b0e60f26af51ad968f8627ed2..8ca3c1ba0cf57890e04b68ef3605ae14e9ab634b 100644
--- a/docs/hooks/hook_civicrm_alterPaymentProcessorParams.md
+++ b/docs/hooks/hook_civicrm_alterPaymentProcessorParams.md
@@ -1,18 +1,17 @@
 # hook_civicrm_alterPaymentProcessorParams
 
-## Description
+## Summary
+
+This hook allows you to modify parameters passed to the payment processor.
+
+## Notes
 
 This hook is called during the processing of a contribution after the
-payment processor has control, but just before the CiviCRM processor
-specific code starts a transaction with the back-end payments server
-(e.g., PayPal, Authorized.net, or Moneris). It allows you to modify the
-parameters passed to the back end so that you can pass custom
-parameters, or use features of your back-end that CiviCRM does not
-"know" about.
+payment processor has control, but before the CiviCRM processor-specific code starts a transaction with the back-end payment server (e.g. Authorize.net).
 
-## Definition
+With this hook, you can pass custom parameters, or use features of your back-end that CiviCRM does not "know" about.
 
-     Code Block
+## Definition
 
      hook_civicrm_alterPaymentProcessorParams($paymentObj,&$rawParams, &$cookedParams);
 
diff --git a/docs/hooks/hook_civicrm_alterReportVar.md b/docs/hooks/hook_civicrm_alterReportVar.md
index c32ff446f031e1e376d5f7162b05147e9f89c235..4c63fda74b2408f843a4c25c11ef31eb0b1b032a 100644
--- a/docs/hooks/hook_civicrm_alterReportVar.md
+++ b/docs/hooks/hook_civicrm_alterReportVar.md
@@ -1,8 +1,8 @@
 # hook_civicrm_alterReportVar
 
-## Description
+## Summary
 
-This hook is used to add / modify display columns, filters ..etc
+This hook is used to add or modify display columns and filters.
 
 ## Definition
 
diff --git a/docs/hooks/hook_civicrm_alterSettingsFolders.md b/docs/hooks/hook_civicrm_alterSettingsFolders.md
index 53585fcf7bb60f46d25f98745242fe13b76fd054..822c5098c37ab5a9708e4257b52c7f04bcbf906f 100644
--- a/docs/hooks/hook_civicrm_alterSettingsFolders.md
+++ b/docs/hooks/hook_civicrm_alterSettingsFolders.md
@@ -1,13 +1,16 @@
 # hook_civicrm_alterSettingsFolders
 
-## Description
+## Summary
+
+This hook allows modules and extensions to scan for settings in
+additional folders.
+
+## Notes
 
 The [Settings](https://wiki.civicrm.org/confluence/display/CRMDOC/Settings+Reference) subsystem
 provides metadata about many of CiviCRM's internal settings by scanning
 for files matching "settings/*.setting.php" (e.g.
 [settings/Core.setting.php](https://github.com/civicrm/civicrm-core/blob/4.3/settings/Core.setting.php)).
-This hook allows modules and extensions to scan for settings in
-additional folders.
 
 ## Availability
 
diff --git a/docs/hooks/hook_civicrm_alterTemplateFile.md b/docs/hooks/hook_civicrm_alterTemplateFile.md
index ac5206813fde1386ece30a329d5cbd568daad307..72382db4a78755dcadd0d94db3b67c7594750b0a 100644
--- a/docs/hooks/hook_civicrm_alterTemplateFile.md
+++ b/docs/hooks/hook_civicrm_alterTemplateFile.md
@@ -1,9 +1,9 @@
 # hook_civicrm_alterTemplateFile
 
-## Description
+## Summary
 
 This hook is invoked while selecting the tpl file to use to render the
-page
+page.
 
 ## Definition
 
diff --git a/docs/hooks/hook_civicrm_angularModules.md b/docs/hooks/hook_civicrm_angularModules.md
index 0ce3c933ba614c9a61f398d08411ebaf51bf8483..ec7753878b4d2469cc779ff167ffad5df84ff575 100644
--- a/docs/hooks/hook_civicrm_angularModules.md
+++ b/docs/hooks/hook_civicrm_angularModules.md
@@ -1,9 +1,8 @@
 # hook_civicrm_angularModules
 
-## Description
+## Summary
 
-EXPERIMENTAL: This hook generates a list of Angular modules. It allows
-one to register additional Angular modules.
+This hook generates a list of AngularJS modules and allows you to register additional AngularJS modules. It is currently **experimental**.
 
 ## Availability
 
diff --git a/docs/hooks/hook_civicrm_apiWrappers.md b/docs/hooks/hook_civicrm_apiWrappers.md
index 9c1dbabc9872077e8267b09eacfe675cd8627793..fe40def258703d54e02ae51798499c9b6867293a 100644
--- a/docs/hooks/hook_civicrm_apiWrappers.md
+++ b/docs/hooks/hook_civicrm_apiWrappers.md
@@ -1,26 +1,31 @@
 # hook_civicrm_apiWrappers
 
-## Description
+## Summary
 
-This hook allows you to add (or override/remove: use caution!) methods to be called before and after api calls to modify either the parameters or the result of the call.
+This hook allows you to add, override, or remove methods to be called before and after api calls &mdash; and to modify either the parameters or the result of the call.
+
+## Notes
 
 The methods must be implemented on an `API_Wrapper` object which is added to the array passed by-reference. See below for more information on the `API_Wrapper` class.
 
 Introduced in CiviCRM 4.4.0.
 
+!!! caution ""
+    Use caution when overriding or removing methods.
+
 ## Definition
 
 ```php
-    /**
-     * Implements hook_civicrm_apiWrappers
-     */
-    function myextension_civicrm_apiWrappers(&$wrappers, $apiRequest) {
-      //&apiWrappers is an array of wrappers, you can add your(s) with the hook.
-      // You can use the apiRequest to decide if you want to add the wrapper (eg. only wrap api.Contact.create)
-      if ($apiRequest['entity'] == 'Contact' && $apiRequest['action'] == 'create') {
-        $wrappers[] = new CRM_Myextension_APIWrapper();
-      }
-    }
+/**
+  * Implements hook_civicrm_apiWrappers
+  */
+function myextension_civicrm_apiWrappers(&$wrappers, $apiRequest) {
+  //&apiWrappers is an array of wrappers, you can add your(s) with the hook.
+  // You can use the apiRequest to decide if you want to add the wrapper (eg. only wrap api.Contact.create)
+  if ($apiRequest['entity'] == 'Contact' && $apiRequest['action'] == 'create') {
+    $wrappers[] = new CRM_Myextension_APIWrapper();
+  }
+}
 ```
 
 ## Wrapper class
diff --git a/docs/hooks/hook_civicrm_batchItems.md b/docs/hooks/hook_civicrm_batchItems.md
index c490be657c0ffc7b7466ab9e85b7580a72d2bacd..0bdc347e0e823d2b6c23f83a943ce0c366643958 100644
--- a/docs/hooks/hook_civicrm_batchItems.md
+++ b/docs/hooks/hook_civicrm_batchItems.md
@@ -1,9 +1,13 @@
 # hook_civicrm_batchItems
 
-## Description
+## Summary
 
 This hook is called when a CSV batch export file is about to be
-generated. Notice that this hook will be called in per batch bases, e.g.
+generated.
+
+## Notes
+
+Notice that this hook will be called in per batch bases, e.g.
 if 3 batches are going to be exported in the same CSV then this hook
 will be called three times regarding each batch.
 
diff --git a/docs/hooks/hook_civicrm_batchQuery.md b/docs/hooks/hook_civicrm_batchQuery.md
index 23c511518d06642979413dd4cbb5791dfd8fe72f..31c5ac9e19cf15706d9dfbc9f508f15d56737d88 100644
--- a/docs/hooks/hook_civicrm_batchQuery.md
+++ b/docs/hooks/hook_civicrm_batchQuery.md
@@ -1,10 +1,12 @@
 # hook_civicrm_batchQuery
 
-## Description
+## Summary
 
-This hook is called when the query of CSV batch export is generated,\
- so hook implementers can provide their own query objects which
-alters/extends original query.
+This hook is called when the query of CSV batch export is generated
+
+## Notes
+
+With this hook you can provide your own query objects which alter or extend the original query.
 
 ## Definition
 
@@ -12,8 +14,7 @@ alters/extends original query.
 
 ## Parameters
 
--   $query - A string of SQL Query\
-     \
+-   $query - A string of SQL Query
 
 ## Example
 
diff --git a/docs/hooks/hook_civicrm_buildAmount.md b/docs/hooks/hook_civicrm_buildAmount.md
index 1f11c6f09fe1709b588319cde8ca97e1b6b2c1eb..665822f9114962c2116e1dbb5a4c67ea7625a1af 100644
--- a/docs/hooks/hook_civicrm_buildAmount.md
+++ b/docs/hooks/hook_civicrm_buildAmount.md
@@ -1,9 +1,9 @@
 # hook_civicrm_buildAmount
 
-## Description
+## Summary
 
 This hook is called when building the amount structure for a
-Contribution or Event Page. It allows you to modify the set of radio
+Contribution or Event Page, allowing you to modify the set of radio
 buttons representing amounts for contribution levels and event
 registration fees.
 
diff --git a/docs/hooks/hook_civicrm_buildAsset.md b/docs/hooks/hook_civicrm_buildAsset.md
index 18c5ffa026d889a3098d71ddc2a95f2694aaab67..262b6a7aafe935f2b94e7f66e55fc6eecf73af6b 100644
--- a/docs/hooks/hook_civicrm_buildAsset.md
+++ b/docs/hooks/hook_civicrm_buildAsset.md
@@ -1,9 +1,12 @@
 # hook_civicrm_buildAsset
 
-## Description
+## Summary
 
-This hook fires whenever the system builds a semi-dynamic asset.  For more
-discussion, see [AssetBuilder](/framework/asset-builder.md).
+This hook fires whenever the system builds a semi-dynamic asset.
+
+## Notes
+
+For more discussion, see [AssetBuilder](/framework/asset-builder.md).
 
 ## Definition
 
diff --git a/docs/hooks/hook_civicrm_buildForm.md b/docs/hooks/hook_civicrm_buildForm.md
index 5420a0e8c19313c88c4aab26e65f7e960d9f34ea..c610b61b8a39522e85fe2d7fc5a177b68fa9d32f 100644
--- a/docs/hooks/hook_civicrm_buildForm.md
+++ b/docs/hooks/hook_civicrm_buildForm.md
@@ -1,10 +1,10 @@
 # hook_civicrm_buildForm
 
-## Description
+## Summary
 
-This hook is invoked when building a CiviCRM form. This hook should also
-be used to set the default values of a form element, to change form
-elements attributes, or even to add new fields to a form.
+This hook is invoked when building a form. It can be used to set
+the default values of a form element, to change form
+elements attributes, and to add new fields to a form.
 
 ## Definition
 
diff --git a/docs/hooks/hook_civicrm_buildProfile.md b/docs/hooks/hook_civicrm_buildProfile.md
index 90a5dab5c4b50d5c1f6532ca8458b30b8e0cd0b0..a563d5f0d04f456a120b1a62270ec0924dad9caf 100644
--- a/docs/hooks/hook_civicrm_buildProfile.md
+++ b/docs/hooks/hook_civicrm_buildProfile.md
@@ -1,6 +1,6 @@
 # hook_civicrm_buildProfile
 
-## Description
+## Summary
 
 This hook is called while preparing a profile form.
 
diff --git a/docs/hooks/hook_civicrm_buildStateProvinceForCountry.md b/docs/hooks/hook_civicrm_buildStateProvinceForCountry.md
index bac4c579b083d4d7cd2468940e709be59d516e2c..3e0f12a2443a4a85bae4bfc23fcee8ec15f10310 100644
--- a/docs/hooks/hook_civicrm_buildStateProvinceForCountry.md
+++ b/docs/hooks/hook_civicrm_buildStateProvinceForCountry.md
@@ -1,6 +1,6 @@
 # hook_civicrm_buildStateProvinceForCountry
 
-## Description
+## Summary
 
 This hook is called during the ajax callback that is used to build the
 options that display in the State/Province select widget for a specific
diff --git a/docs/hooks/hook_civicrm_buildUFGroupsForModule.md b/docs/hooks/hook_civicrm_buildUFGroupsForModule.md
index 88386e94852e868c022dacd518811421110681b8..f063395b8a6a49fac430b61d73fa78a3f60cbb77 100644
--- a/docs/hooks/hook_civicrm_buildUFGroupsForModule.md
+++ b/docs/hooks/hook_civicrm_buildUFGroupsForModule.md
@@ -1,10 +1,12 @@
 # hook_civicrm_buildUFGroupsForModule
 
-## Description
+## Summary
 
 This hook is called when ufgroups (profiles) are being built for a
 module.
 
+## Notes
+
 The most common use case for this hook is to edit which profiles are
 visible on the Contact Dashboard or (Drupal) user registration page
 based on arbitrary criteria (e.g. whether the contact has a particular
diff --git a/docs/hooks/hook_civicrm_caseChange.md b/docs/hooks/hook_civicrm_caseChange.md
index 707d849822aca416ba1ac64a1587c9aa4a12264c..213da2f1efd18085fe4b919be0d436f4c1064be6 100644
--- a/docs/hooks/hook_civicrm_caseChange.md
+++ b/docs/hooks/hook_civicrm_caseChange.md
@@ -1,11 +1,12 @@
 # hook_civicrm_caseChange
 
-## Description
+## Summary
 
 This hook fires whenever a record in a case changes.
 
-See also the documentation for [CiviCase
-Util](https://wiki.civicrm.org/confluence/display/HR/CiviCase+Util).
+## Notes
+
+See also the documentation for [CiviCase Util](https://wiki.civicrm.org/confluence/display/HR/CiviCase+Util).
 
 ## Availability
 
diff --git a/docs/hooks/hook_civicrm_caseSummary.md b/docs/hooks/hook_civicrm_caseSummary.md
index 8dc88b8505f419ec7b507fc7a115f95def354547..7d99bb534a632afb247ef63c7e649ad5728925ce 100644
--- a/docs/hooks/hook_civicrm_caseSummary.md
+++ b/docs/hooks/hook_civicrm_caseSummary.md
@@ -1,8 +1,8 @@
 # hook_civicrm_caseSummary
 
-## Description
+## Summary
 
-This hook is called when the manage case screen is displayed. It allows
+This hook is called when the manage case screen is displayed, and it allows
 the injection of label/value pairs which are rendered inside divs
 underneath the existing summary table.
 
diff --git a/docs/hooks/hook_civicrm_caseTypes.md b/docs/hooks/hook_civicrm_caseTypes.md
index b4656edfc7fee865a716fb37cf2d3339fbe9af41..7b7521e2c74087b4bda115de55ac887d1920150a 100644
--- a/docs/hooks/hook_civicrm_caseTypes.md
+++ b/docs/hooks/hook_civicrm_caseTypes.md
@@ -1,12 +1,14 @@
 # hook_civicrm_caseTypes
 
-## Description
+## Summary
 
-This hook defines available CiviCRM case types.
+This hook defines available case types.
+
+## Notes
 
 Note that this hook is actually an adapter
-for [hook_civicrm_managed](/hooks/hook_civicrm_managed.md)
-, so any case Type defined inside this hook will be automatically
+for [hook_civicrm_managed](/hooks/hook_civicrm_managed.md), so any case
+type defined inside this hook will be automatically
 inserted, updated, deactivated, and deleted in tandem with enabling,
 disabling, and uninstalling the module. For more background, see [API
 and the Art of
diff --git a/docs/hooks/hook_civicrm_check.md b/docs/hooks/hook_civicrm_check.md
index 1428877a0148d1dea49b27b7fb31449e494c2851..7abde2701fc012166f6ac84a25b8ec0ad86f6705 100644
--- a/docs/hooks/hook_civicrm_check.md
+++ b/docs/hooks/hook_civicrm_check.md
@@ -1,25 +1,31 @@
 # hook_civicrm_check
 
-## Description
+## Summary
 
-This hook is called by CiviCRM's "System Check" api
-(CRM_Utils_Check::checkAll).  This runs on a regular basis (currently
+This hook is called by the "System Check" api.
+
+## Notes
+
+This runs on a regular basis (currently
 once a day, as well as whenever the status page is visited or
-System.check API is called).
+`System.check` API is called).
 
 Typically your extension would add results by appending one or more
-CRM_Utils_Check_Message objects to the $messages array. Constructing
-a CRM_Utils_Check_Message requires the following parameters:
-
--   **Unique identifier:**A unique string for this type of message (no
-    two messages in the array may have the same identifier).
--   **Description: **Long description html string
--   **Title: **Short title plain text string
--   **Severity: **A [PSR-3 string](http://www.php-fig.org/psr/psr-3/).
+`CRM_Utils_Check_Message` objects to the $messages array. Constructing
+a `CRM_Utils_Check_Message` requires the following parameters:
+
+-   **Unique identifier:** A unique string for this type of message (no two messages in the array may have the same identifier).
+-   **Description:** Long description html string
+-   **Title:** Short title plain text string
+-   **Severity:** A [PSR-3 string](http://www.php-fig.org/psr/psr-3/).
 -   **Icon:** A [font-awesome
     icon](https://fortawesome.github.io/Font-Awesome/icons/) string
     (optional).
 
+See `CRM_Utils_Check::checkAll` for more details about the system check api.
+
+## Availability
+
 Introduced in CiviCRM v4.6.3.
 
 ## Definition
diff --git a/docs/hooks/hook_civicrm_config.md b/docs/hooks/hook_civicrm_config.md
index fa9fbb67f891a9a7edfc6283b6070c8ce92ebf59..ccfa28c1f235fc2a490f2fa95e0c1a42ef46c4e0 100644
--- a/docs/hooks/hook_civicrm_config.md
+++ b/docs/hooks/hook_civicrm_config.md
@@ -1,9 +1,13 @@
 # hook_civicrm_config
 
-## Description
+## Summary
 
-This hook is called soon after the CRM_Core_Config object has ben
-initialized. You can use this hook to modify the config object and hence
+This hook is called soon after the `CRM_Core_Config` object has been
+initialized.
+
+## Notes
+
+You can use this hook to modify the config object and hence
 behavior of CiviCRM dynamically.
 
 ## Definition
diff --git a/docs/hooks/hook_civicrm_contactListQuery.md b/docs/hooks/hook_civicrm_contactListQuery.md
index 36fc2ecd6149e9281feaabc0781e1070652fc807..c967c87f21033f48e1a561dfafa12395a8c1598d 100644
--- a/docs/hooks/hook_civicrm_contactListQuery.md
+++ b/docs/hooks/hook_civicrm_contactListQuery.md
@@ -1,12 +1,13 @@
 # hook_civicrm_contactListQuery
 
-## Description
+## Summary
 
-!!! warning "Deprecation Notice"
-    This hook is called in very few places in version 4.5+ because most contact reference fields have been migrated to go through the api instead of constructing an ad-hoc query. It will be removed in a future version.
+Deprecated in favor of [hook_civicrm_apiWrappers](/hooks/hook_civicrm_apiWrappers.md).
 
-    For a substitute, see [hook_civicrm_apiWrappers](/hooks/hook_civicrm_apiWrappers.md).
+## Notes
 
+!!! warning "Deprecation Notice"
+    This hook is called in very few places in version 4.5+ because most contact reference fields have been migrated to go through the api instead of constructing an ad-hoc query. It will be removed in a future version.
 
 Use this hook to populate the list of contacts returned by Contact
 Reference custom fields. By default, Contact Reference fields will
diff --git a/docs/hooks/hook_civicrm_contact_get_displayname.md b/docs/hooks/hook_civicrm_contact_get_displayname.md
index 13eb17a781bcdc52f266b83d471872865ca992c9..89b655693810a0a3cd7fc6e9896939f873884a9d 100644
--- a/docs/hooks/hook_civicrm_contact_get_displayname.md
+++ b/docs/hooks/hook_civicrm_contact_get_displayname.md
@@ -1,9 +1,10 @@
 # hook_civicrm_contact_get_displayname
 
-## Description
+## Summary
 
-This hook is called to retrieve the display name of a contact. You can
-use this hook to return a custom display name.
+This hook is called to retrieve the display name of a contact, allowing you to return a custom display name.
+
+## Notes
 
 Probably you won't need this hook but in some case it might be useful.
 For example you want to show who is a manager of an organisation but you
diff --git a/docs/hooks/hook_civicrm_container.md b/docs/hooks/hook_civicrm_container.md
index 3f251eae81264086394527dd0afb9b17c50df1f2..8128f6ea44f5fb4f3c6a5882e1713c9660f987a1 100644
--- a/docs/hooks/hook_civicrm_container.md
+++ b/docs/hooks/hook_civicrm_container.md
@@ -1,15 +1,14 @@
 # hook_civicrm_container
 
-## Description
+## Summary
 
-This hook modifies the CiviCRM container - add new services, parameters,
+This hook modifies the CiviCRM container allowing you to add new services, parameters,
 extensions, etc.
 
-Tip: The container configuration will be compiled/cached. The default
-cache behavior is aggressive. When you first implement the hook, be sure
-to flush the cache. Additionally, you should relax caching during
-development. In civicrm.settings.php, set
-define('CIVICRM_CONTAINER_CACHE', 'auto').
+## Notes
+
+!!! tip
+    The container configuration will be compiled/cached. The default cache behavior is aggressive. When you first implement the hook, be sure to flush the cache. Additionally, you should relax caching during development. In `civicrm.settings.php`, set `define('CIVICRM_CONTAINER_CACHE', 'auto')`.
 
 ## Availability
 
diff --git a/docs/hooks/hook_civicrm_copy.md b/docs/hooks/hook_civicrm_copy.md
index b212f29bfa22a25a1f5e9a575f2a2a440b3178b2..a0a6ccf2026eee5047f7cfd5e1aadf90da1131e5 100644
--- a/docs/hooks/hook_civicrm_copy.md
+++ b/docs/hooks/hook_civicrm_copy.md
@@ -1,9 +1,9 @@
 # hook_civicrm_copy
 
-## Description
+## Summary
 
 This hook is called after a CiviCRM object (Event, ContributionPage,
-Profile) has been copied
+Profile) has been copied.
 
 ## Definition
 
diff --git a/docs/hooks/hook_civicrm_coreResourceList.md b/docs/hooks/hook_civicrm_coreResourceList.md
index b095572482b639c9d5dfaa634c20f3c2124fded7..31c071c36277f799cb79ffde163dfc57a0f4e48d 100644
--- a/docs/hooks/hook_civicrm_coreResourceList.md
+++ b/docs/hooks/hook_civicrm_coreResourceList.md
@@ -1,11 +1,13 @@
 # hook_civicrm_coreResourceList
 
-## Description
+## Summary
 
 This hook is called when the list of core js/css resources is about to
-be processed. Implementing this hook gives you the opportunity to modify
+be processed, giving you the opportunity to modify
 the list prior to the resources being added, or add your own.
 
+## Notes
+
 Added in v4.6.6.
 
 See [Resource Reference](https://wiki.civicrm.org/confluence/display/CRMDOC/Resource+Reference)
diff --git a/docs/hooks/hook_civicrm_cron.md b/docs/hooks/hook_civicrm_cron.md
index a7d4754e39915efc11d9a5536c1a7912c7a3339f..0dcb7c42317db39fbee78ee22b3ae6b97eca6f62 100644
--- a/docs/hooks/hook_civicrm_cron.md
+++ b/docs/hooks/hook_civicrm_cron.md
@@ -1,9 +1,12 @@
 # hook_civicrm_cron
 
-## Description
+## Summary
 
-This hook is called everytime the CiviCRM scheduler is polled. The
-timing and frequency with which this is called will vary depending on
+This hook is called every time the CiviCRM scheduler is polled.
+
+## Notes
+
+The timing and frequency with which this is called will vary depending on
 the system configuration.
 
 Introduced in CiviCRM v4.3.
@@ -12,8 +15,6 @@ Introduced in CiviCRM v4.3.
     There are two ways to build on top of the CiviCRM scheduler. **hook_civicrm_cron** is a low-level approach which calls your code with an unpredictable schedule – in some systems, it could be once a day; in others, once every minute, every 5 minutes, every hour, every 2 hours, ad nauseum. You must ensure that your code will behave well in all these situations. Alternatively, the **Job API** is a higher-level approach by which you may register scheduled jobs ("Daily", "Hourly", etc), and the scheduler will make a best effort to match the declared scheduler. See, e.g., ["Create a Module Extension: How does one add a cron job"](https://wiki.civicrm.org/confluence/display/CRMDOC/Create+a+Module+Extension#CreateaModuleExtension-Howdoesoneaddacronjob)
 
 
-
-
 ## Definition
 
     hook_civicrm_cron($jobManager)
diff --git a/docs/hooks/hook_civicrm_crudLink.md b/docs/hooks/hook_civicrm_crudLink.md
index 9e4c6c7b94d7680c0ae02b5ee17d2b35c152bda7..92b8ec66d56dbc893e32b674bd722c5909890239 100644
--- a/docs/hooks/hook_civicrm_crudLink.md
+++ b/docs/hooks/hook_civicrm_crudLink.md
@@ -1,6 +1,6 @@
 # hook_civicrm_crudLink
 
-## Description
+## Summary
 
 Generate a default CRUD URL for an entity.
 
diff --git a/docs/hooks/hook_civicrm_custom.md b/docs/hooks/hook_civicrm_custom.md
index 6b9ff9cb7a10daf24175f27be9b4aa856e902b4e..cbd82ab44ed6985bc204d24cff0c45b55fab8af2 100644
--- a/docs/hooks/hook_civicrm_custom.md
+++ b/docs/hooks/hook_civicrm_custom.md
@@ -1,8 +1,8 @@
 # hook_civicrm_custom
 
-## Description
+## Summary
 
-This hook is called AFTER the db write on a custom table
+This hook is called *after* the database write on a custom table.
 
 ## Definition
 
diff --git a/docs/hooks/hook_civicrm_customFieldOptions.md b/docs/hooks/hook_civicrm_customFieldOptions.md
index 3edd757880394d18a76c6fab27433336a8611dde..9d03d0f13e0bc0df398dd23b5fe060f13fc0fb85 100644
--- a/docs/hooks/hook_civicrm_customFieldOptions.md
+++ b/docs/hooks/hook_civicrm_customFieldOptions.md
@@ -1,9 +1,8 @@
 # hook_civicrm_customFieldOptions
 
-## Description
+## Summary
 
-!!! warning "Deprecated"
-    This hook is deprecated in 4.7 in favor of [hook_civicrm_fieldOptions](/hooks/hook_civicrm_fieldOptions.md). Use that instead for modifying all option lists, not limited to custom fields.
+Deprecated in 4.7 in favor of [hook_civicrm_fieldOptions](/hooks/hook_civicrm_fieldOptions.md). Use that instead for modifying all option lists, not limited to custom fields.
 
 
 ## Definition
diff --git a/docs/hooks/hook_civicrm_dashboard.md b/docs/hooks/hook_civicrm_dashboard.md
index bf7b57a6e765c3d603b8d950bc475e4f48c10116..dff90e686cfaf98a298a512439b3793e7bd1121b 100644
--- a/docs/hooks/hook_civicrm_dashboard.md
+++ b/docs/hooks/hook_civicrm_dashboard.md
@@ -1,8 +1,8 @@
 # hook_civicrm_dashboard
 
-## Description
+## Summary
 
-This hook is called when rendering the dashboard page. This hook can be
+This hook is called when rendering the dashboard page and can be
 used to add content to the dashboard page.
 
 ## Definition
diff --git a/docs/hooks/hook_civicrm_dashboard_defaults.md b/docs/hooks/hook_civicrm_dashboard_defaults.md
index ef12cad4485f7b2c8accf7615ffd0d6ff671c568..d544a3cbe060aeabcc9af9d25a3777a69b247ca8 100644
--- a/docs/hooks/hook_civicrm_dashboard_defaults.md
+++ b/docs/hooks/hook_civicrm_dashboard_defaults.md
@@ -1,10 +1,9 @@
 # hook_civicrm_dashboard_defaults
 
-## Description
+## Summary
+
+This hook is called while a contact views their dashboard for the first time and can be used to enable or disable the set of default dashlets.
 
-~~~~ {.diff-line-pre}
-This hook is called while a contact views their dashboard for the first time. It can be used to enable or disable the set of default dashlets that appear on Contact dashboard the first time they login..
-~~~~
 
 ## Definition
 
diff --git a/docs/hooks/hook_civicrm_disable.md b/docs/hooks/hook_civicrm_disable.md
index 08657842a1069e7a661b66e3650091d542c3aba4..16ed4a19d33c9f543184081f4f982611fa2e0beb 100644
--- a/docs/hooks/hook_civicrm_disable.md
+++ b/docs/hooks/hook_civicrm_disable.md
@@ -1,10 +1,14 @@
 # hook_civicrm_disable
 
-## Description
+## Summary
 
-This hook is called when an extension is disabled. To be specific, when
-its status changes from ***enabled*** to ***disabled**.* Each module
-will receive hook_civicrm_disable during its own disablement (but not
+This hook is called when an extension is disabled.
+
+## Notes
+
+To be specific, this hook is called when
+an extension's status changes from ***enabled*** to ***disabled**.* Each module
+will receive `hook_civicrm_disable` during its own disablement (but not
 during the disablement of unrelated modules).
 
 ## Parameters
diff --git a/docs/hooks/hook_civicrm_dupeQuery.md b/docs/hooks/hook_civicrm_dupeQuery.md
index ec128224fec1ba3ed9c8e8eea407d084ee4e56e5..392b5dc98eea9bd9cee08b1c217506701845f0ce 100644
--- a/docs/hooks/hook_civicrm_dupeQuery.md
+++ b/docs/hooks/hook_civicrm_dupeQuery.md
@@ -1,11 +1,13 @@
 # hook_civicrm_dupeQuery
 
-## Description
+## Summary
 
 This hook is called during the dedupe lookup process, and can be used to
 alter the parameters and queries used to determine if two contacts are
 duplicates.
 
+## Notes
+
 The dedupe mechanism is triggered in four places:
 
 1.  when a CMS user account is created and connected to an existing or
diff --git a/docs/hooks/hook_civicrm_emailProcessor.md b/docs/hooks/hook_civicrm_emailProcessor.md
index de1e2eb1284d45b6ab81f573c8101feab0439552..75299476334917df4097154a5fe9e19ef05f90a9 100644
--- a/docs/hooks/hook_civicrm_emailProcessor.md
+++ b/docs/hooks/hook_civicrm_emailProcessor.md
@@ -1,9 +1,9 @@
 # hook_civicrm_emailProcessor
 
-## Description
+## Summary
 
-This hook is called AFTER EACH email has been processed by the script
-bin/EmailProcessor.php
+This hook is called after *each* email has been processed by the script
+`bin/EmailProcessor.php`.
 
 ## Definition
 
diff --git a/docs/hooks/hook_civicrm_emailProcessorContact.md b/docs/hooks/hook_civicrm_emailProcessorContact.md
index bcde8e5eb4aa3ac3c670d3b97c6349d82e303526..c24ac96c6ac907b0fa7db99644ac18a655b05182 100644
--- a/docs/hooks/hook_civicrm_emailProcessorContact.md
+++ b/docs/hooks/hook_civicrm_emailProcessorContact.md
@@ -1,10 +1,14 @@
 # hook_civicrm_emailProcessorContact
 
-## Description
+## Summary
 
 This hook is called by the Email Processor when deciding to which
-contact an activity will be attached. You can tell it to use a different
-contact and/or whether it should create contacts.
+contact and activity will be attached.
+
+## Notes
+
+You can use this hook to choose a different
+contact or decide whether it should create contacts.
 
 ## Definition
 
diff --git a/docs/hooks/hook_civicrm_enable.md b/docs/hooks/hook_civicrm_enable.md
index c1328a0999f2b934e63871cf0854b21c4ba8e19f..170099f9eace8c33e7179a22d4713c4b97efb7b2 100644
--- a/docs/hooks/hook_civicrm_enable.md
+++ b/docs/hooks/hook_civicrm_enable.md
@@ -1,11 +1,16 @@
 # hook_civicrm_enable
 
-## Description
+## Summary
 
-This hook is called when an extension is re-enabled. To be specific,
-when its status changes from ***disabled*** to ***enabled.*****It is**
-**NOT called **when the status changes from ***uninstalled*** to
-***enabled*. **Each module will receive hook_civicrm_enable during its
+This hook is called when an extension is re-enabled.
+
+## Notes
+
+To be specific, this hook is called when an extension's
+status changes from ***disabled*** to ***enabled.***
+
+It is *NOT* called when the status changes from ***uninstalled*** to
+***enabled***. Each module will receive `hook_civicrm_enable` during its
 own re-enablement (but not during the re-enablement of unrelated
 modules).
 
diff --git a/docs/hooks/hook_civicrm_entityTypes.md b/docs/hooks/hook_civicrm_entityTypes.md
index 27d4e087198528b4d4261d81cc83cac630916f87..79604f3e6020839f50741469727a8254471ba1c2 100644
--- a/docs/hooks/hook_civicrm_entityTypes.md
+++ b/docs/hooks/hook_civicrm_entityTypes.md
@@ -1,8 +1,12 @@
 # hook_civicrm_entityTypes
 
-## Description
+## Summary
 
-This hook is called for declaring managed entities via API. [See this tutorial](/extensions/civix.md#generate-entity) for a more complete description of creating a managed entity.
+This hook is called for declaring managed entities via API.
+
+## Notes
+
+[See this tutorial](/extensions/civix.md#generate-entity) for a more complete description of creating a managed entity.
 
 ## Definition
 
diff --git a/docs/hooks/hook_civicrm_eventDiscount.md b/docs/hooks/hook_civicrm_eventDiscount.md
index af6afd57a6ba82c28843f6e4e6dc06b9bc201bc4..52b838cbcb270fe0c5d462b7841a1044fd889f2b 100644
--- a/docs/hooks/hook_civicrm_eventDiscount.md
+++ b/docs/hooks/hook_civicrm_eventDiscount.md
@@ -1,11 +1,14 @@
 # hook_civicrm_eventDiscount
 
-## Description
+## Summary
 
 This hook allows you to apply a customized discount to an event
 registration.
 
-This hook is outdated - notable, CiviDiscount does not make use of it.
+## Notes
+
+!!! caution
+    This hook is outdated - notable, CiviDiscount does not make use of it.
 
 ## Definition
 
diff --git a/docs/hooks/hook_civicrm_export.md b/docs/hooks/hook_civicrm_export.md
index c07f0d606f4fd926fcf6123e993e1b355f3846d1..c32f97c27c004d44e8becba4a894bd2498389a0c 100644
--- a/docs/hooks/hook_civicrm_export.md
+++ b/docs/hooks/hook_civicrm_export.md
@@ -1,6 +1,6 @@
 # hook_civicrm_export
 
-## Description
+## Summary
 
 This hook allows to manipulate or change the output of CSV during
 export.
diff --git a/docs/hooks/hook_civicrm_fieldOptions.md b/docs/hooks/hook_civicrm_fieldOptions.md
index 964ab853468be081156440607fc2f39dfe2cda69..afcabac8bbd5c05122c6e8121158487a61d25416 100644
--- a/docs/hooks/hook_civicrm_fieldOptions.md
+++ b/docs/hooks/hook_civicrm_fieldOptions.md
@@ -1,9 +1,8 @@
 # hook_civicrm_fieldOptions
 
-## Description
+## Summary
 
-Dynamically modify the option list for any core or custom field in
-CiviCRM.
+This hook allows you to dynamically modify the option list for any field (including custom fields).
 
 ## Definition
 
diff --git a/docs/hooks/hook_civicrm_fileSearches.md b/docs/hooks/hook_civicrm_fileSearches.md
index 1f5e4106823c60cc223e55fb59a8fc8c475ad26a..d43e8897a7d9fd59bb6ac61b8e1bc2ba2ca7ba3d 100644
--- a/docs/hooks/hook_civicrm_fileSearches.md
+++ b/docs/hooks/hook_civicrm_fileSearches.md
@@ -1,8 +1,8 @@
 # hook_civicrm_fileSearches
 
-## Description
+## Summary
 
-Add a reference to a file search service (e.g. Solr).
+This hook allows you to add a reference to a file search service (e.g. Solr).
 
 ## Availability
 
diff --git a/docs/hooks/hook_civicrm_geocoderFormat.md b/docs/hooks/hook_civicrm_geocoderFormat.md
index a27847b32d0981b9c367bc5b2b5c237b1e0d4286..5aa23a0438e7d12a612c3d99fdd5d5ffdc7f218b 100644
--- a/docs/hooks/hook_civicrm_geocoderFormat.md
+++ b/docs/hooks/hook_civicrm_geocoderFormat.md
@@ -1,6 +1,6 @@
 # hook_civicrm_geocoderFormat
 
-## Description
+## Summary
 
 This hook allows you to manipulate the Address object during geocoding,
 for instance to extract additional fields from the geocoder's returned
diff --git a/docs/hooks/hook_civicrm_idsException.md b/docs/hooks/hook_civicrm_idsException.md
index 1d3fd1d390cafa29d0661ebe1ca11d6fa14890a4..03e3284eb8d4f89abd3b2a86ce9d06ba846e809e 100644
--- a/docs/hooks/hook_civicrm_idsException.md
+++ b/docs/hooks/hook_civicrm_idsException.md
@@ -1,11 +1,14 @@
 # hook_civicrm_idsException
 
-## Description
+## Summary
 
 This hook allows you to modify the list of form or page paths where
 submitted data should not be sent through PHPIDS, the intrusion
-detection system (IDS).  *Note: this is one of two ways to bypass the
-IDS.  The other is a CMS-level permission "skip IDS check".*
+detection system (IDS).
+
+## Notes
+
+This is one of two ways to bypass the IDS. The other is a CMS-level permission "skip IDS check".
 
 ## Definition
 
diff --git a/docs/hooks/hook_civicrm_import.md b/docs/hooks/hook_civicrm_import.md
index 9656e2b30cdc668227c2a6e20e28d66940fe7d38..a1c8d70b74005a255cb2c0f5e12a3cbdf5ae3d5a 100644
--- a/docs/hooks/hook_civicrm_import.md
+++ b/docs/hooks/hook_civicrm_import.md
@@ -1,9 +1,13 @@
 # hook_civicrm_import
 
-## Description
+## Summary
 
 This hook is called after contacts have been imported into the system,
-and before the temp import table has been destroyed. It can be used to
+and before the temp import table has been destroyed.
+
+## Notes
+
+This hook can be used to
 take custom action on the imported records or handle special columns in
 the import file. It currently is only applicable to contact import, but
 in future versions may extend to other objects.
diff --git a/docs/hooks/hook_civicrm_install.md b/docs/hooks/hook_civicrm_install.md
index a495b14e5ac49212b4c77fdd3a6ef407544b59a1..26529e15936ffeda2cc09b2a2ca3099556276898 100644
--- a/docs/hooks/hook_civicrm_install.md
+++ b/docs/hooks/hook_civicrm_install.md
@@ -1,12 +1,17 @@
 # hook_civicrm_install
 
-## Description
+## Summary
 
-This hook is called when an extension is installed. To be specific, when
-its status changes from ***uninstalled*** to ***enabled**.* **It is NOT
-called** when an extension moves from ***disabled*** to ***enabled***
-(but hook_civicrm_enable is called at this event). Each module will
-receive hook_civicrm_install during its own installation (but not
+This hook is called when an extension is installed.
+
+## Notes
+
+To be specific, this hook is called when an extension's
+status changes from ***uninstalled*** to ***enabled***
+
+It is *NOT* called when an extension moves from ***disabled*** to ***enabled***
+(but `hook_civicrm_enable` is called at this event). Each module will
+receive `hook_civicrm_install` during its own installation (but not
 during the installation of unrelated modules).
 
 For more background, see [API and the Art of
diff --git a/docs/hooks/hook_civicrm_links.md b/docs/hooks/hook_civicrm_links.md
index c4cb3c38bfc87089789b09d9d244ad3de9e6a570..b23c7bdd57fd862dae4d337d1c7eb6aa76ff8083 100644
--- a/docs/hooks/hook_civicrm_links.md
+++ b/docs/hooks/hook_civicrm_links.md
@@ -1,13 +1,16 @@
 # hook_civicrm_links
 
-## Description
+## Summary
 
-This hook is an opportunity to modify action links in CiviCRM.  These
-include the actions at the end of a search result row, the Create New
+This hook allows you to modify action links including:
+the actions at the end of a search result row, the Create New
 dropdown, and the Actions dropdown at the top of a contact record.
 
-Note: remember to use the string processing functions of your host
-framework ( `ts()` for CiviCRM extensions, `t()` for Drupal modules, etc).
+
+## Notes
+
+!!! tip
+    Remember to use the string processing functions of your host framework ( `ts()` for CiviCRM extensions, `t()` for Drupal modules, etc).
 
 ## Definition
 
diff --git a/docs/hooks/hook_civicrm_mailingGroups.md b/docs/hooks/hook_civicrm_mailingGroups.md
index f7d11b0a8e4dd39d8022ca6d55064bf42a3262de..0f9360480db61119c512956de15341d298050465 100644
--- a/docs/hooks/hook_civicrm_mailingGroups.md
+++ b/docs/hooks/hook_civicrm_mailingGroups.md
@@ -1,8 +1,8 @@
 # hook_civicrm_mailingGroups
 
-## Description
+## Summary
 
-This hook is called when composing a mailing. You can include / exclude
+This hook is called when composing a mailing allowing you to include or exclude
 other groups as needed.
 
 ## Definition
diff --git a/docs/hooks/hook_civicrm_managed.md b/docs/hooks/hook_civicrm_managed.md
index d1e053a3dcb3381315ebf047f38bf8c40701b8df..08e45cc0415b747116a722219ed555b4992b6ab7 100644
--- a/docs/hooks/hook_civicrm_managed.md
+++ b/docs/hooks/hook_civicrm_managed.md
@@ -1,10 +1,13 @@
 # hook_civicrm_managed
 
-## Description
+## Summary
 
-This hook allows a module to declare a list of 'managed' entities using
-the [CiviCRM API](https://wiki.civicrm.org/confluence/display/CRMDOC/API+Reference) - a managed
-entity will be automatically inserted, updated, deactivated, and deleted
+This hook allows a module to declare a list of managed entities using
+the API.
+
+## Notes
+
+A managed entity will be automatically inserted, updated, deactivated, and deleted
 in tandem with enabling, disabling, and uninstalling the module. The
 hook is called periodically during cache-clear operations.
 
diff --git a/docs/hooks/hook_civicrm_membershipTypeValues.md b/docs/hooks/hook_civicrm_membershipTypeValues.md
index e65c1e5ff7f8ecfb6e7df419bde3de6f2d6436bb..cf86bcfd654c3e7e21425fa9cb354df99deb97af 100644
--- a/docs/hooks/hook_civicrm_membershipTypeValues.md
+++ b/docs/hooks/hook_civicrm_membershipTypeValues.md
@@ -1,10 +1,13 @@
 # hook_civicrm_membershipTypeValues
 
-## Description
+## Summary
 
 This hook is called when composing the array of membership types and
-their costs during a membership registration (new or renewal). Note the
-hook is called on initial page load and also reloaded after submit ([PRG
+their costs during a membership registration (new or renewal).
+
+## Notes
+
+The hook is called on initial page load and also reloaded after submit ([PRG
 pattern](https://en.wikipedia.org/wiki/Post/Redirect/Get)). You can use it to alter the membership types when first
 loaded, or after submission (for example if you want to gather data in
 the form and use it to alter the fees).
diff --git a/docs/hooks/hook_civicrm_merge.md b/docs/hooks/hook_civicrm_merge.md
index 4523b236338442fbe6068065c863246429a4db41..775434d765e7926935af7bfc0e976a1d300a7aff 100644
--- a/docs/hooks/hook_civicrm_merge.md
+++ b/docs/hooks/hook_civicrm_merge.md
@@ -1,9 +1,9 @@
 # hook_civicrm_merge
 
-## Description
+## Summary
 
 This hook allows modification of the data used to perform merging of
-duplicates. This can be useful if your custom module has added its own
+duplicates. It can be useful if your custom module has added its own
 tables related to CiviCRM contacts.
 
 ## Availability
diff --git a/docs/hooks/hook_civicrm_navigationMenu.md b/docs/hooks/hook_civicrm_navigationMenu.md
index 46e5aea3ef3b402d3922de5884f8ba03bef9f0a8..624a362adbb99a343ac6ce3cf77e70d06ee4f5fd 100644
--- a/docs/hooks/hook_civicrm_navigationMenu.md
+++ b/docs/hooks/hook_civicrm_navigationMenu.md
@@ -1,10 +1,12 @@
 # hook_civicrm_navigationMenu
 
-## Description
+## Summary
 
-This hook is called after the menus are rebuild. You can use this hook
-to add new menu, add children to new menu and get the list of menu items
-for any parent.
+This hook is called after the menus are rebuilt.
+
+## Notes
+
+You can use this hook to add new menu, add children to new menu and get the list of menu items for any parent.
 
 ## Definition
 
diff --git a/docs/hooks/hook_civicrm_notePrivacy.md b/docs/hooks/hook_civicrm_notePrivacy.md
index 8c56cfc31772126a61a585953159b890fe6d9473..120732236be19c4d1c8b38adb4176868b95f48fe 100644
--- a/docs/hooks/hook_civicrm_notePrivacy.md
+++ b/docs/hooks/hook_civicrm_notePrivacy.md
@@ -1,10 +1,12 @@
 # hook_civicrm_notePrivacy
 
-## Description
+## Summary
 
 This hook provides a way to override the default privacy behavior for
 notes.
 
+## Notes
+
 If a user has the "View All Notes" permission, this hook is bypassed.
 
 See also [this blog
diff --git a/docs/hooks/hook_civicrm_optionValues.md b/docs/hooks/hook_civicrm_optionValues.md
index 12b22d7ec1f52488bf9d1dbf928017c071da57e7..797876ecde105d1cff38b4e55625b0150e2d4824 100644
--- a/docs/hooks/hook_civicrm_optionValues.md
+++ b/docs/hooks/hook_civicrm_optionValues.md
@@ -1,14 +1,16 @@
 # hook_civicrm_optionValues
 
-!!! warning "Deprecated"
-    This hook is deprecated in 4.7 in favor of [hook_civicrm_fieldOptions](/hooks/hook_civicrm_fieldOptions.md). Use that instead for modifying all option lists, not limited to items in the `civicrm_option_values` table.
+## Summary
 
+This hook was deprecated in 4.7 in favor of [hook_civicrm_fieldOptions](/hooks/hook_civicrm_fieldOptions.md).
 
-## Description
+## Notes
 
 This hook is called after a option group is loaded. You can use this
 hook to add/remove options from the option group.
 
+Use [hook_civicrm_fieldOptions](/hooks/hook_civicrm_fieldOptions.md) instead for modifying all option lists, not limited to items in the `civicrm_option_values` table.
+
 ## Definition
 
 ```php
diff --git a/docs/hooks/hook_civicrm_pageRun.md b/docs/hooks/hook_civicrm_pageRun.md
index 8cef1fa20feb62fb71d5f80be091ed2472a6e0cf..f3649438cdab48f1e9f6a08d42f04dde59fd58ea 100644
--- a/docs/hooks/hook_civicrm_pageRun.md
+++ b/docs/hooks/hook_civicrm_pageRun.md
@@ -1,14 +1,17 @@
 # hook_civicrm_pageRun
 
-## Description
+## Summary
 
 This hook is called before a CiviCRM page is rendered.
 
-Note that this does **not** execute on every CiviCRM *page* in the
+
+## Notes
+
+This does **not** execute on every CiviCRM *page* in the
 general sense. CiviCRM's pages are classified as either 'Forms' or
 'Pages', and this only runs on pages classified as 'Pages'. If you are
 not sure if a particular page is a Page, test it by adding some
-temporary debug code to /CRM/Utils/Hook.php
+temporary debug code to `/CRM/Utils/Hook.php`
 
 ## Definition
 
diff --git a/docs/hooks/hook_civicrm_permission.md b/docs/hooks/hook_civicrm_permission.md
index 52942227915aaabf0537ccaf1afe731c184028c6..0f7edb31528d11eae0ca9b118becf66bb0e6ba97 100644
--- a/docs/hooks/hook_civicrm_permission.md
+++ b/docs/hooks/hook_civicrm_permission.md
@@ -1,9 +1,11 @@
 # hook_civicrm_permission
 
-## Description
+## Summary
 
 This hook is called to allow custom permissions to be defined.
 
+## Notes
+
 Available starting in 4.3, with permission descriptions supported
 starting in 4.6.  Version 4.6.0 [may cause
 trouble](https://issues.civicrm.org/jira/browse/CRM-16230), even without
diff --git a/docs/hooks/hook_civicrm_permission_check.md b/docs/hooks/hook_civicrm_permission_check.md
index 231c0d9244e3b12704497c58032a8867f5c10a3d..f8f92a712e9c567fd52cc89db5353d3e350a1761 100644
--- a/docs/hooks/hook_civicrm_permission_check.md
+++ b/docs/hooks/hook_civicrm_permission_check.md
@@ -1,9 +1,13 @@
 # hook_civicrm_permission_check
 
-## Description
+## Summary
 
-This hook is called to allow to dynamically alter permissions based on
-conditions or external criteria. See
+This hook is called to dynamically alter permissions based on
+conditions or external criteria.
+
+## Notes
+
+See
 [https://issues.civicrm.org/jira/browse/CRM-19256](https://issues.civicrm.org/jira/browse/CRM-19256)
 for some use cases.
 
diff --git a/docs/hooks/hook_civicrm_post.md b/docs/hooks/hook_civicrm_post.md
index 64dc9888ffeca77d432167f0125eedddf7b25d0b..21fc3a6bb2ae10f2b7fdc790852b56c5a23480a5 100644
--- a/docs/hooks/hook_civicrm_post.md
+++ b/docs/hooks/hook_civicrm_post.md
@@ -1,9 +1,11 @@
 # hook_civicrm_post
 
-## Description
+## Summary
 
 This hook is called after a db write on some core objects.
 
+## Notes
+
 pre and post hooks are useful for developers building more complex
 applications and need to perform operations before CiviCRM takes action.
 This is very applicable when you need to maintain foreign key
diff --git a/docs/hooks/hook_civicrm_postEmailSend.md b/docs/hooks/hook_civicrm_postEmailSend.md
index 365a55dbef50d8381e707f40cf25fac5542a2ffd..a06fc8b30968a6898e1512035f345d8f7103f1e7 100644
--- a/docs/hooks/hook_civicrm_postEmailSend.md
+++ b/docs/hooks/hook_civicrm_postEmailSend.md
@@ -1,11 +1,14 @@
 # hook_civicrm_postEmailSend
 
-## Description
+## Summary
 
 This hook is called when an email has been successfully sent by CiviCRM,
 but not on an error.
 
-NB: This is only triggered by activity emails, not bulk mailings.
+
+## Notes
+
+This is only triggered by activity emails, not bulk mailings.
 
 ## Definition
 
diff --git a/docs/hooks/hook_civicrm_postInstall.md b/docs/hooks/hook_civicrm_postInstall.md
index 281975e6d02f84091a0e61b40cf245466e2dd8cd..410bfedc9e09b43760a8f810c2c9e9b367dbf653 100644
--- a/docs/hooks/hook_civicrm_postInstall.md
+++ b/docs/hooks/hook_civicrm_postInstall.md
@@ -1,10 +1,10 @@
 # hook_civicrm_postInstall
 
-## Description
+## Summary
 
 This hook is called immediately after an extension is installed.
 
-Notes:
+## Notes
 
 -   Unlike most CiviCRM hooks, hook_civicrm_postInstall is defined not
     in CRM_Utils_Hook but in CRM_Extension_Manager_Module.
diff --git a/docs/hooks/hook_civicrm_postMailing.md b/docs/hooks/hook_civicrm_postMailing.md
index 7fc7c1d4a05f76e92587d7b188ba515832e97b1b..8c96a8e5610b9be077a15fc5c9c6328447d7efb0 100644
--- a/docs/hooks/hook_civicrm_postMailing.md
+++ b/docs/hooks/hook_civicrm_postMailing.md
@@ -1,9 +1,8 @@
 # hook_civicrm_postMailing
 
-## Description
+## Summary
 
-This hook is called at the successful completion of a bulk mailing
-(CiviMail).
+This hook is called at the successful completion of a bulk mailing done through CiviMail.
 
 ## Definition
 
diff --git a/docs/hooks/hook_civicrm_postProcess.md b/docs/hooks/hook_civicrm_postProcess.md
index f9f192695306f141710bb542476ccd3508fe4293..0e1434590f1e50474c6d4d0009acf5a560fff718 100644
--- a/docs/hooks/hook_civicrm_postProcess.md
+++ b/docs/hooks/hook_civicrm_postProcess.md
@@ -1,10 +1,13 @@
 # hook_civicrm_postProcess
 
-## Description
+## Summary
 
-This hook is invoked when a CiviCRM form is submitted. If the module has
-injected\
- any form elements, this hook should save the values in the database.
+This hook is invoked when a CiviCRM form is submitted.
+
+## Notes
+
+If the module has injected any form elements, this hook should save the
+values in the database.
 
 This hook is not called when using the API, only when using the regular
 forms. If you want to have an action that is triggered no matter if it's
diff --git a/docs/hooks/hook_civicrm_postSave_table_name.md b/docs/hooks/hook_civicrm_postSave_table_name.md
index 09e4ea378c414df579a114faaab41eeb5a4b7b9d..01b278fe02c0b69a53e109efa37b91a3becc8ab3 100644
--- a/docs/hooks/hook_civicrm_postSave_table_name.md
+++ b/docs/hooks/hook_civicrm_postSave_table_name.md
@@ -1,9 +1,9 @@
 # hook_civicrm_postSave_table_name
 
-## Description
+## Summary
 
 This hook is called after writing to a database table that has an
-associated DAO. This includes core tables but not custom tables or log
+associated DAO, including core tables but not custom tables or log
 tables.
 
 ## Parameters
diff --git a/docs/hooks/hook_civicrm_post_case_merge.md b/docs/hooks/hook_civicrm_post_case_merge.md
index cc5f500038db0f475d1b277416669763e6c0aa15..7c8146675a068700f82726677dfc62556f9e37c8 100644
--- a/docs/hooks/hook_civicrm_post_case_merge.md
+++ b/docs/hooks/hook_civicrm_post_case_merge.md
@@ -1,10 +1,12 @@
 # hook_civicrm_post_case_merge
 
-## Description
+## Summary
 
-This hook is called just after a case merge happens. A case merge is
-when two cases are merged or when a case is reassigned to another
-client.
+This hook is called after a case merge happens.
+
+## Notes
+
+A case merge is when two cases are merged or when a case is reassigned to another client.
 
 Added in CIviCRM 4.5
 
diff --git a/docs/hooks/hook_civicrm_pre.md b/docs/hooks/hook_civicrm_pre.md
index 2dc2736af21ea4c6a311011d4e717f9b440cc515..9ad3b08fecf58ffc05ede14498ff34c542b96015 100644
--- a/docs/hooks/hook_civicrm_pre.md
+++ b/docs/hooks/hook_civicrm_pre.md
@@ -1,9 +1,12 @@
 # hook_civicrm_pre
 
-## Description
+## Summary
 
-This hook is called before a db write on some core objects. This hook
-does not allow the abort of the operation, use a form hook instead.
+This hook is called before a db write on some core objects.
+
+## Notes
+
+This hook does not allow the abort of the operation, use a form hook instead.
 
 We suspect the pre hook will be useful for developers building more
 complex applications and need to perform operations before CiviCRM takes
diff --git a/docs/hooks/hook_civicrm_preProcess.md b/docs/hooks/hook_civicrm_preProcess.md
index af7a7bc780ac3d71aa7c5ce0ca0cd9148dc9a860..239ea2a3697f6b746d694340fd0a0358b979e13e 100644
--- a/docs/hooks/hook_civicrm_preProcess.md
+++ b/docs/hooks/hook_civicrm_preProcess.md
@@ -1,21 +1,19 @@
 # hook_civicrm_preProcess
 
-## Description
+## Summary
 
-Use if you need to modify the behavior of a form before the
-buildQuickForm call.
+This hook can be used to modify the behavior of a form before the
+`buildQuickForm` call.
+
+
+## Notes
 
 There are some known issues with exception
 handling: [https://issues.civicrm.org/jira/browse/CRM-15683](https://issues.civicrm.org/jira/browse/CRM-15683).
 
 ## Definition
 
-
-
-  ------------------------------------------------------------
-  `hook_civicrm_preProcess($formName, &$form)`{.java .plain}
-  ------------------------------------------------------------
-
+    hook_civicrm_preProcess($formName, &$form)
 
 
 ## Parameters
diff --git a/docs/hooks/hook_civicrm_pre_case_merge.md b/docs/hooks/hook_civicrm_pre_case_merge.md
index 92b6c78381bd55597998f5dba510190796c8f1e1..c53f7e603ee70052b61eb155c98ff39375f03e83 100644
--- a/docs/hooks/hook_civicrm_pre_case_merge.md
+++ b/docs/hooks/hook_civicrm_pre_case_merge.md
@@ -1,12 +1,16 @@
 # hook_civicrm_pre_case_merge
 
-## Description
+## Summary
 
-This hook is called just before a case merge happens. A case merge is
+This hook is called before a case merge happens.
+
+## Notes
+
+A case merge is
 when two cases are merged or when a case is reassigned to another
 client.
 
-Added in CIviCRM 4.5
+Added in CiviCRM 4.5
 
 ## Definition
 
diff --git a/docs/hooks/hook_civicrm_processProfile.md b/docs/hooks/hook_civicrm_processProfile.md
index 3b6401549423edf295b0644e48e743d33b18b845..00644b9dedb768ba439b67129e85196f15f01626 100644
--- a/docs/hooks/hook_civicrm_processProfile.md
+++ b/docs/hooks/hook_civicrm_processProfile.md
@@ -1,8 +1,8 @@
 # hook_civicrm_processProfile
 
-## Description
+## Summary
 
-This hook is called processing a valid profile form submission (e.g. for "civicrm/profile/create" or "civicrm/profile/edit").
+This hook is called when processing a valid profile form submission (e.g. for "civicrm/profile/create" or "civicrm/profile/edit").
 
 ## Definition
 
diff --git a/docs/hooks/hook_civicrm_queryObjects.md b/docs/hooks/hook_civicrm_queryObjects.md
index 46eddcf960f5ac88070dbd9af029f311d3135d69..220144aae045938ade3e7aa50a92ebf650200af8 100644
--- a/docs/hooks/hook_civicrm_queryObjects.md
+++ b/docs/hooks/hook_civicrm_queryObjects.md
@@ -1,10 +1,8 @@
 # hook_civicrm_queryObjects
 
-## Description
+## Summary
 
-This hook is called while building the core search query,\
- so hook implementers can provide their own query objects which
-alters/extends core search.
+This hook is called while building the core search query, allowing you to provide your own query objects which alter or extend the core search.
 
 ## Definition
 
diff --git a/docs/hooks/hook_civicrm_recent.md b/docs/hooks/hook_civicrm_recent.md
index 98ba9407ba706be3ec87fa5c68e6d6a40aac9dab..669b2a3790d9bfc631c5e8664090414ac016db1f 100644
--- a/docs/hooks/hook_civicrm_recent.md
+++ b/docs/hooks/hook_civicrm_recent.md
@@ -1,6 +1,6 @@
 # hook_civicrm_recent
 
-## Description
+## Summary
 
 This hook is called before storing recently viewed items.
 
diff --git a/docs/hooks/hook_civicrm_referenceCounts.md b/docs/hooks/hook_civicrm_referenceCounts.md
index 9e6c5f3958da7f10fdc2013b608a52b13e17bd02..0bd50ba8b97d8a338017ba5e15b6275dbadd9358 100644
--- a/docs/hooks/hook_civicrm_referenceCounts.md
+++ b/docs/hooks/hook_civicrm_referenceCounts.md
@@ -1,9 +1,12 @@
 # hook_civicrm_referenceCounts
 
-## Description
+## Summary
 
-This hook is called to determine the reference-count for a record. For
-example, when counting references to the activity type "Phone Call", one
+This hook is called to determine the reference-count for a record.
+
+## Notes
+
+For example, when counting references to the activity type "Phone Call", one
 would want a tally that includes:
 
 -   The number of activity records which use "Phone Call"
diff --git a/docs/hooks/hook_civicrm_searchColumns.md b/docs/hooks/hook_civicrm_searchColumns.md
index 39fab919157c4811268e5b3fabfce8ab2ea9b7e2..032877bd205f274ab89af81f96eb4570e964d8f2 100644
--- a/docs/hooks/hook_civicrm_searchColumns.md
+++ b/docs/hooks/hook_civicrm_searchColumns.md
@@ -1,12 +1,16 @@
 # hook_civicrm_searchColumns
 
-## Description
+## Summary
 
-This hook is called after a search is done. This allows the developer to
-modify the headers and/or the values that are displayed as part of this
-search. The BIGGEST drawback with this hook is that you may need to
+This hook is called after a search is done, allowing you to
+modify the headers and/or the values that are displayed as part of the
+search.
+
+## Notes
+
+The *biggest* drawback with this hook is that you may need to
 modify the result template to include your fields. The result files are
-CRM/{Contact,Contribute,Member,Event…}/Form/Selector.tpl. However, if
+`CRM/{Contact,Contribute,Member,Event…}/Form/Selector.tpl`. However, if
 you use the same number of columns, you can overwrite the existing
 columns with the values that you want displayed. This is a HACK, but
 avoids template modification.
diff --git a/docs/hooks/hook_civicrm_searchProfile.md b/docs/hooks/hook_civicrm_searchProfile.md
index f79739384439cdd4c6ada631f4ef8a4a8da8b342..47c7f2f49163be41c339ac69ee428ed2a771a8cc 100644
--- a/docs/hooks/hook_civicrm_searchProfile.md
+++ b/docs/hooks/hook_civicrm_searchProfile.md
@@ -1,6 +1,6 @@
 # hook_civicrm_searchProfile
 
-## Description
+## Summary
 
 This hook is called while preparing a list of contacts (based on a
 profile).
diff --git a/docs/hooks/hook_civicrm_searchTasks.md b/docs/hooks/hook_civicrm_searchTasks.md
index a889b4471e84d62bef6768fa9d8961cb0b6969ef..443558caeff982effba8c548bd0647f1535be9b2 100644
--- a/docs/hooks/hook_civicrm_searchTasks.md
+++ b/docs/hooks/hook_civicrm_searchTasks.md
@@ -1,10 +1,9 @@
 # hook_civicrm_searchTasks
 
-## Description
+## Summary
 
 This hook is called to display the list of actions allowed after doing a
-search. This allows the module developer to inject additional actions or
-to remove existing actions.
+search, allowing you to inject additional actions or to remove existing actions.
 
 ## Definition
 
diff --git a/docs/hooks/hook_civicrm_selectWhereClause.md b/docs/hooks/hook_civicrm_selectWhereClause.md
index 45210812674bfc0fd87f0c360593c61b6e294078..f4f47d94b44d5fa9f89e92ac05b13ca50b076790 100644
--- a/docs/hooks/hook_civicrm_selectWhereClause.md
+++ b/docs/hooks/hook_civicrm_selectWhereClause.md
@@ -1,8 +1,12 @@
 # hook_civicrm_selectWhereClause
 
-## Description
+## Summary
 
-This hook is called when executing a SELECT query. The hook is called
+This hook is called when executing a SELECT query.
+
+## Notes
+
+The hook is called
 once for each entity in the query, allowing you to add (or remove)
 restrictions specific to that entity.
 
diff --git a/docs/hooks/hook_civicrm_summary.md b/docs/hooks/hook_civicrm_summary.md
index e9ea9158ab98598b2d705f1b1d299499583af8b1..c203e97bf7d025de01a434bed71a2e1daea2e294 100644
--- a/docs/hooks/hook_civicrm_summary.md
+++ b/docs/hooks/hook_civicrm_summary.md
@@ -1,9 +1,8 @@
 # hook_civicrm_summary
 
-## Description
+## Summary
 
-This hook is called when contact summary is rendered and you can add on
-top, below or replace summary with your own html content.
+This hook is called when the contact summary is rendered, allowing you to modify the summary with your own content.
 
 ## Definition
 
diff --git a/docs/hooks/hook_civicrm_summaryActions.md b/docs/hooks/hook_civicrm_summaryActions.md
index 56ef61637ab994792f1b697c5f72580b95b2dc18..3ad6b568482d9b1a4344ff6def38c509883c0976 100644
--- a/docs/hooks/hook_civicrm_summaryActions.md
+++ b/docs/hooks/hook_civicrm_summaryActions.md
@@ -1,8 +1,8 @@
 # hook_civicrm_summaryActions
 
-## Description
+## Summary
 
-This hook allows User to customize context menu Actions on Contact
+This hook allows you to customize the context menu actions on the Contact
 Summary Page.
 
 ## Definition
diff --git a/docs/hooks/hook_civicrm_tabs.md b/docs/hooks/hook_civicrm_tabs.md
index 3ac27be11d34a2f389c39c7e10dbd0d398b63b74..5a5a056faad68fc32bdac471d7d794ea317ebf6d 100644
--- a/docs/hooks/hook_civicrm_tabs.md
+++ b/docs/hooks/hook_civicrm_tabs.md
@@ -1,12 +1,10 @@
 # hook_civicrm_tabs
 
-## Description
+## Summary
 
-!!! warning "Deprecation Notice"
-    This hook has been deprecated in 4.7.
-
-    For a substitute, see [hook_civicrm_tabset](/hooks/hook_civicrm_tabset.md)
+This hook was deprecated in 4.7 in favor of [hook_civicrm_tabset](/hooks/hook_civicrm_tabset.md).
 
+## Notes
 
 This hook is called when composing the tabs to display when viewing a
 contact
diff --git a/docs/hooks/hook_civicrm_tabset.md b/docs/hooks/hook_civicrm_tabset.md
index 280c59325af2710372d16c19dd1f5949a2369839..7376028ea0631bd21013a626c198d804603a80c5 100644
--- a/docs/hooks/hook_civicrm_tabset.md
+++ b/docs/hooks/hook_civicrm_tabset.md
@@ -1,6 +1,6 @@
 # hook_civicrm_tabset
 
-## Description
+## Summary
 
 This hook is called when composing the tabs interface used for contacts,
 contributions and events.
diff --git a/docs/hooks/hook_civicrm_tokenValues.md b/docs/hooks/hook_civicrm_tokenValues.md
index 732d069465836d7801ad69874fc3c37d981ab17d..900b2170c80ef0a3f99165b2fd0decb9e32c973a 100644
--- a/docs/hooks/hook_civicrm_tokenValues.md
+++ b/docs/hooks/hook_civicrm_tokenValues.md
@@ -1,12 +1,14 @@
 # hook_civicrm_tokenValues
 
-## Description
+## Summary
 
-This hook is called to get all the values for the tokens registered. Use
-it to overwrite or reformat existing token values, or supply the values
+This hook is called to get all the values for the tokens registered.
+
+## Notes
+
+Use it to overwrite or reformat existing token values, or supply the values
 for custom tokens you have defined in
-[hook_civicrm_tokens](/hooks/hook_civicrm_tokens.md).\
- See [this
+[hook_civicrm_tokens](/hooks/hook_civicrm_tokens.md). See [this
 article](https://civicrm.org/blog/colemanw/create-your-own-tokens-for-fun-and-profit) for
 usage examples.
 
diff --git a/docs/hooks/hook_civicrm_tokens.md b/docs/hooks/hook_civicrm_tokens.md
index 121d0b7b42fdef5aa54ed1c4f900476e29abf59e..59e74657ed8456ac3038a35b7d7084cd257bbae8 100644
--- a/docs/hooks/hook_civicrm_tokens.md
+++ b/docs/hooks/hook_civicrm_tokens.md
@@ -1,12 +1,16 @@
 # hook_civicrm_tokens
 
-## Description
+## Summary
 
-This hook is called to allow custom tokens to be defined. Their values
+This hook is called to allow custom tokens to be defined.
+
+## Notes
+
+The token values
 will need to be supplied by
-[hook_civicrm_tokenValues](/hooks/hook_civicrm_tokenValues.md).\
-  See [this
-article](https://civicrm.org/blog/colemanw/create-your-own-tokens-for-fun-and-profit)
+[hook_civicrm_tokenValues](/hooks/hook_civicrm_tokenValues.md).
+
+See [this article](https://civicrm.org/blog/colemanw/create-your-own-tokens-for-fun-and-profit)
 for usage examples.
 
 ## Definition
diff --git a/docs/hooks/hook_civicrm_trigger_info.md b/docs/hooks/hook_civicrm_trigger_info.md
index 5a182cd7f86f7223cc7e953913b12842f5c530a1..2be1bdce0033bd0689b568cc1f7dd72466bd6d96 100644
--- a/docs/hooks/hook_civicrm_trigger_info.md
+++ b/docs/hooks/hook_civicrm_trigger_info.md
@@ -1,8 +1,12 @@
 # hook_civicrm_trigger_info
 
-## Description
+## Summary
 
-Define MYSQL Triggers. Using the hooks causes them not to clash with
+This hook allows you to define MySQL triggers.
+
+## Notes
+
+Using the hooks causes them not to clash with
 core or other extension triggers. They are compiled into one trigger
 with core triggers.
 
diff --git a/docs/hooks/hook_civicrm_unhandledException.md b/docs/hooks/hook_civicrm_unhandledException.md
index f6a44a7ed9b61616402a5dcda0ec6d3a0b3ff223..89144455a728873dd352f48e1c42abfa47444aee 100644
--- a/docs/hooks/hook_civicrm_unhandledException.md
+++ b/docs/hooks/hook_civicrm_unhandledException.md
@@ -1,9 +1,11 @@
 # hook_civicrm_unhandledException
 
-## Description
+## Summary
 
 This hook fires when an unhandled exception (fatal error) occurs.
 
+## Notes
+
 A use case is to show an alternative page to donors rather than a fatal
 error screen if a fatal error occurs during a donation.
 
diff --git a/docs/hooks/hook_civicrm_uninstall.md b/docs/hooks/hook_civicrm_uninstall.md
index f6dedfbbd09920b1d3230701ffa11dc58edb6d26..00192d5a98962e07777650c67ea3416186b7836a 100644
--- a/docs/hooks/hook_civicrm_uninstall.md
+++ b/docs/hooks/hook_civicrm_uninstall.md
@@ -1,12 +1,14 @@
 # hook_civicrm_uninstall
 
-## Description
+## Summary
 
-This hook is called when an extension is uninstalled. To be specific,
-when its status changes from ***disabled*** to ***uninstalled***.
+This hook is called when an extension is uninstalled.
 
+## Notes
 
-Each module will receive hook_civicrm_uninstall during its own
+To be specific, when its status changes from ***disabled*** to ***uninstalled***.
+
+Each module will receive `hook_civicrm_uninstall` during its own
 uninstallation (but not during the uninstallation of unrelated modules).
 
 ## Parameters
diff --git a/docs/hooks/hook_civicrm_unsubscribeGroups.md b/docs/hooks/hook_civicrm_unsubscribeGroups.md
index 3dd1bd6415791140a21b06668b1320c8a72001b6..ad8b1d912282e6cd40a273f8b549cec4ea8d16af 100644
--- a/docs/hooks/hook_civicrm_unsubscribeGroups.md
+++ b/docs/hooks/hook_civicrm_unsubscribeGroups.md
@@ -1,9 +1,11 @@
 # hook_civicrm_unsubscribeGroups
 
-## Description
+## Summary
 
-This hook is called when CiviCRM recieves a request to unsubscribe a
-user from a mailing
+This hook is called when CiviCRM receives a request to unsubscribe a
+user from a mailing.
+
+## Availability
 
 Introduced in CiviCRM v4.2
 
diff --git a/docs/hooks/hook_civicrm_upgrade.md b/docs/hooks/hook_civicrm_upgrade.md
index bfe05e68095bac41c2d67322fd92ea9cdabc298a..a99a75038ff7fae9470d2f371cf0e361003d3e79 100644
--- a/docs/hooks/hook_civicrm_upgrade.md
+++ b/docs/hooks/hook_civicrm_upgrade.md
@@ -1,10 +1,13 @@
 # hook_civicrm_upgrade
 
-## Description
+## Summary
 
 This hook is called when an administrator visits the "Manage Extensions"
-screen to determine if there are any pending upgrades. As of version
-4.7, it is also called periodically by [CiviCRM's system status
+screen to determine if there are any pending upgrades.
+
+## Notes
+
+As of version 4.7, it is also called periodically by [CiviCRM's system status
 utility](https://docs.civicrm.org/user/en/stable/initial-set-up/civicrm-system-status/).
 
 If there are upgrades, and if the administrator chooses to execute them,
diff --git a/docs/hooks/hook_civicrm_validateForm.md b/docs/hooks/hook_civicrm_validateForm.md
index e42a2f2a2b8cdb43f66ee3e6559c4815f47d06f8..a99f6b7c5ba260a8e901a4b226f7855a8a718d2f 100644
--- a/docs/hooks/hook_civicrm_validateForm.md
+++ b/docs/hooks/hook_civicrm_validateForm.md
@@ -1,8 +1,12 @@
 # hook_civicrm_validateForm
 
-## Description
+## Summary
 
-Validation of forms. This hook was introduced in v4.2
+This hook allows you to customize the logic used to validate forms.
+
+## Availability
+
+This hook was introduced in v4.2
 
 ## Definition
 
diff --git a/docs/hooks/hook_civicrm_validateProfile.md b/docs/hooks/hook_civicrm_validateProfile.md
index fbba815fa5899051467fd73f91096d2142a7b60f..9b3041f03ed43c2c43c1209456a2ebfdaadc6d33 100644
--- a/docs/hooks/hook_civicrm_validateProfile.md
+++ b/docs/hooks/hook_civicrm_validateProfile.md
@@ -1,6 +1,6 @@
 # hook_civicrm_validateProfile
 
-## Description
+## Summary
 
 This hook is called while validating a profile form submission.
 
diff --git a/docs/hooks/hook_civicrm_viewProfile.md b/docs/hooks/hook_civicrm_viewProfile.md
index 40bfda32d846376436d4191bcc7afaa0a28cbbb8..90e01e0023c8c2b40bb152ccd9f63c8e8d01aadd 100644
--- a/docs/hooks/hook_civicrm_viewProfile.md
+++ b/docs/hooks/hook_civicrm_viewProfile.md
@@ -1,6 +1,6 @@
 # hook_civicrm_viewProfile
 
-## Description
+## Summary
 
 This hook is called while preparing a read-only profile screen.
 
diff --git a/docs/hooks/hook_civicrm_xmlMenu.md b/docs/hooks/hook_civicrm_xmlMenu.md
index a83da1e6b560ac166d3aac4915324effbb4af5bf..e89183da03258a8d3e744a988650c2485333a8ad 100644
--- a/docs/hooks/hook_civicrm_xmlMenu.md
+++ b/docs/hooks/hook_civicrm_xmlMenu.md
@@ -1,17 +1,21 @@
 # hook_civicrm_xmlMenu
 
-## Description
+## Summary
 
 This hook is called when building CiviCRM's menu structure, which is
-used to render urls in CiviCRM. This hook should be used when you want
+used to render urls in CiviCRM.
+
+## Notes
+
+This hook should be used when you want
 to register your custom module url's in CiviCRM. You will need to visit
-<your_site>/civicrm/menu/rebuild?reset=1 to pick up your additions.
+`/civicrm/menu/rebuild?reset=1` to pick up your additions.
 
 !!! note "Comparison of Related Hooks"
     This is one of three related hooks. The hooks:
 
     -   [hook_civicrm_navigationMenu](/hooks/hook_civicrm_navigationMenu.md) manipulates the navigation bar at the top of every screen
-    -    [hook_civicrm_alterMenu](/hooks/hook_civicrm_alterMenu.md) manipulates the list of HTTP routes (using PHP arrays)
+    -   [hook_civicrm_alterMenu](/hooks/hook_civicrm_alterMenu.md) manipulates the list of HTTP routes (using PHP arrays)
     -   [hook_civicrm_xmlMenu](/hooks/hook_civicrm_xmlMenu.md) manipulates the list of HTTP routes (using XML files)
 
 
diff --git a/docs/hooks/list.md b/docs/hooks/list.md
new file mode 100644
index 0000000000000000000000000000000000000000..b620adec2085a35e39952f8441c0810eddaf62cf
--- /dev/null
+++ b/docs/hooks/list.md
@@ -0,0 +1,152 @@
+# All hooks
+
+<!--
+  -- DO NOT EDIT
+  --
+  -- This entire page is auto-generated by the following command:
+  -- ./bin/tools generate:hooks-list
+  --
+  -->
+
+
+This is an overview list of all available hooks, listed by category.
+
+## Batch hooks
+
+* **[hook_civicrm_batchItems](/hooks/hook_civicrm_batchItems.md)** - called when a CSV batch export file is about to be generated.
+* **[hook_civicrm_batchQuery](/hooks/hook_civicrm_batchQuery.md)** - called when the query of CSV batch export is generated
+
+## Case hooks
+
+* **[hook_civicrm_caseChange](/hooks/hook_civicrm_caseChange.md)** - fires whenever a record in a case changes.
+* **[hook_civicrm_caseTypes](/hooks/hook_civicrm_caseTypes.md)** - defines available case types.
+* **[hook_civicrm_post_case_merge](/hooks/hook_civicrm_post_case_merge.md)** - called after a case merge happens.
+* **[hook_civicrm_pre_case_merge](/hooks/hook_civicrm_pre_case_merge.md)** - called before a case merge happens.
+
+## Database hooks
+
+* **[hook_civicrm_copy](/hooks/hook_civicrm_copy.md)** - called after a CiviCRM object (Event, ContributionPage, Profile) has been copied.
+* **[hook_civicrm_custom](/hooks/hook_civicrm_custom.md)** - called *after* the database write on a custom table.
+* **[hook_civicrm_managed](/hooks/hook_civicrm_managed.md)** - allows a module to declare a list of managed entities using the API.
+* **[hook_civicrm_merge](/hooks/hook_civicrm_merge.md)** - allows modification of the data used to perform merging of duplicates. It can be useful if your custom module has added its own tables related to CiviCRM contacts.
+* **[hook_civicrm_post](/hooks/hook_civicrm_post.md)** - called after a db write on some core objects.
+* **[hook_civicrm_postSave_table_name](/hooks/hook_civicrm_postSave_table_name.md)** - called after writing to a database table that has an associated DAO, including core tables but not custom tables or log tables.
+* **[hook_civicrm_pre](/hooks/hook_civicrm_pre.md)** - called before a db write on some core objects.
+* **[hook_civicrm_trigger_info](/hooks/hook_civicrm_trigger_info.md)** - allows you to define MySQL triggers.
+* **[hook_civicrm_referenceCounts](/hooks/hook_civicrm_referenceCounts.md)** - called to determine the reference-count for a record.
+
+## Entity hooks
+
+* **[hook_civicrm_entityTypes](/hooks/hook_civicrm_entityTypes.md)** - called for declaring managed entities via API.
+
+## Extension lifecycle hooks
+
+* **[hook_civicrm_disable](/hooks/hook_civicrm_disable.md)** - called when an extension is disabled.
+* **[hook_civicrm_enable](/hooks/hook_civicrm_enable.md)** - called when an extension is re-enabled.
+* **[hook_civicrm_install](/hooks/hook_civicrm_install.md)** - called when an extension is installed.
+* **[hook_civicrm_postInstall](/hooks/hook_civicrm_postInstall.md)** - called immediately after an extension is installed.
+* **[hook_civicrm_uninstall](/hooks/hook_civicrm_uninstall.md)** - called when an extension is uninstalled.
+* **[hook_civicrm_upgrade](/hooks/hook_civicrm_upgrade.md)** - called when an administrator visits the "Manage Extensions" screen to determine if there are any pending upgrades.
+
+## Form hooks
+
+* **[hook_civicrm_alterContent](/hooks/hook_civicrm_alterContent.md)** - invoked after all the content of a CiviCRM form or page is generated and allows for direct manipulation of the generated content.
+* **[hook_civicrm_alterTemplateFile](/hooks/hook_civicrm_alterTemplateFile.md)** - invoked while selecting the tpl file to use to render the page.
+* **[hook_civicrm_buildForm](/hooks/hook_civicrm_buildForm.md)** - invoked when building a form. It can be used to set the default values of a form element, to change form elements attributes, and to add new fields to a form.
+* **[hook_civicrm_idsException](/hooks/hook_civicrm_idsException.md)** - allows you to modify the list of form or page paths where submitted data should not be sent through PHPIDS, the intrusion detection system (IDS).
+* **[hook_civicrm_postProcess](/hooks/hook_civicrm_postProcess.md)** - invoked when a CiviCRM form is submitted.
+* **[hook_civicrm_preProcess](/hooks/hook_civicrm_preProcess.md)** - can be used to modify the behavior of a form before the `buildQuickForm` call.
+* **[hook_civicrm_validateForm](/hooks/hook_civicrm_validateForm.md)** - allows you to customize the logic used to validate forms.
+
+## GUI hooks
+
+* **[hook_civicrm_alterMenu](/hooks/hook_civicrm_alterMenu.md)** - called when building CiviCRM&#039;s list of HTTP routes and should be used when you want to register custom paths or URLS.
+* **[hook_civicrm_buildAmount](/hooks/hook_civicrm_buildAmount.md)** - called when building the amount structure for a Contribution or Event Page, allowing you to modify the set of radio buttons representing amounts for contribution levels and event registration fees.
+* **[hook_civicrm_caseSummary](/hooks/hook_civicrm_caseSummary.md)** - called when the manage case screen is displayed, and it allows the injection of label/value pairs which are rendered inside divs underneath the existing summary table.
+* **[hook_civicrm_contact_get_displayname](/hooks/hook_civicrm_contact_get_displayname.md)** - called to retrieve the display name of a contact, allowing you to return a custom display name.
+* **[<del>hook_civicrm_customFieldOptions</del>](/hooks/hook_civicrm_customFieldOptions.md)** - Deprecated in 4.7 in favor of [hook_civicrm_fieldOptions](/hooks/hook_civicrm_fieldOptions.md). Use that instead for modifying all option lists, not limited to custom fields.
+* **[hook_civicrm_dashboard](/hooks/hook_civicrm_dashboard.md)** - called when rendering the dashboard page and can be used to add content to the dashboard page.
+* **[hook_civicrm_dashboard_defaults](/hooks/hook_civicrm_dashboard_defaults.md)** - called while a contact views their dashboard for the first time and can be used to enable or disable the set of default dashlets.
+* **[hook_civicrm_fieldOptions](/hooks/hook_civicrm_fieldOptions.md)** - allows you to dynamically modify the option list for any field (including custom fields).
+* **[hook_civicrm_links](/hooks/hook_civicrm_links.md)** - allows you to modify action links including: the actions at the end of a search result row, the Create New dropdown, and the Actions dropdown at the top of a contact record.
+* **[hook_civicrm_navigationMenu](/hooks/hook_civicrm_navigationMenu.md)** - called after the menus are rebuilt.
+* **[hook_civicrm_pageRun](/hooks/hook_civicrm_pageRun.md)** - called before a CiviCRM page is rendered.
+* **[hook_civicrm_searchColumns](/hooks/hook_civicrm_searchColumns.md)** - called after a search is done, allowing you to modify the headers and/or the values that are displayed as part of the search.
+* **[hook_civicrm_searchTasks](/hooks/hook_civicrm_searchTasks.md)** - called to display the list of actions allowed after doing a search, allowing you to inject additional actions or to remove existing actions.
+* **[hook_civicrm_summary](/hooks/hook_civicrm_summary.md)** - called when the contact summary is rendered, allowing you to modify the summary with your own content.
+* **[hook_civicrm_summaryActions](/hooks/hook_civicrm_summaryActions.md)** - allows you to customize the context menu actions on the Contact Summary Page.
+* **[<del>hook_civicrm_tabs</del>](/hooks/hook_civicrm_tabs.md)** - deprecated in 4.7 in favor of [hook_civicrm_tabset](/hooks/hook_civicrm_tabset.md).
+* **[hook_civicrm_tabset](/hooks/hook_civicrm_tabset.md)** - called when composing the tabs interface used for contacts, contributions and events.
+* **[hook_civicrm_xmlMenu](/hooks/hook_civicrm_xmlMenu.md)** - called when building CiviCRM&#039;s menu structure, which is used to render urls in CiviCRM.
+
+## Mail hooks
+
+* **[hook_civicrm_alterMailContent](/hooks/hook_civicrm_alterMailContent.md)** - called after getting the content of the mail and before tokenizing it.
+* **[hook_civicrm_alterMailer](/hooks/hook_civicrm_alterMailer.md)** - called when CiviCRM prepares an email driver class to handle outbound message delivery.
+* **[hook_civicrm_alterMailParams](/hooks/hook_civicrm_alterMailParams.md)** - called when an email is about to be sent by CiviCRM.
+* **[hook_civicrm_emailProcessor](/hooks/hook_civicrm_emailProcessor.md)** - called after *each* email has been processed by the script `bin/EmailProcessor.php`.
+* **[hook_civicrm_emailProcessorContact](/hooks/hook_civicrm_emailProcessorContact.md)** - called by the Email Processor when deciding to which contact and activity will be attached.
+* **[hook_civicrm_mailingGroups](/hooks/hook_civicrm_mailingGroups.md)** - called when composing a mailing allowing you to include or exclude other groups as needed.
+* **[hook_civicrm_postEmailSend](/hooks/hook_civicrm_postEmailSend.md)** - called when an email has been successfully sent by CiviCRM, but not on an error.
+* **[hook_civicrm_postMailing](/hooks/hook_civicrm_postMailing.md)** - called at the successful completion of a bulk mailing done through CiviMail.
+* **[hook_civicrm_unsubscribeGroups](/hooks/hook_civicrm_unsubscribeGroups.md)** - called when CiviCRM receives a request to unsubscribe a user from a mailing.
+
+## Permission hooks
+
+* **[hook_civicrm_aclGroup](/hooks/hook_civicrm_aclGroup.md)** - called when composing the ACL to restrict access to civicrm entities (civicrm groups, profiles and events).
+* **[hook_civicrm_aclWhereClause](/hooks/hook_civicrm_aclWhereClause.md)** - called when composing the ACL where clause to restrict visibility of contacts to the logged in user.
+* **[hook_civicrm_alterAPIPermissions](/hooks/hook_civicrm_alterAPIPermissions.md)** - called when API 3 permissions are checked.
+* **[hook_civicrm_permission](/hooks/hook_civicrm_permission.md)** - called to allow custom permissions to be defined.
+* **[hook_civicrm_permission_check](/hooks/hook_civicrm_permission_check.md)** - called to dynamically alter permissions based on conditions or external criteria.
+* **[hook_civicrm_selectWhereClause](/hooks/hook_civicrm_selectWhereClause.md)** - called when executing a SELECT query.
+
+## Profile hooks
+
+* **[hook_civicrm_buildProfile](/hooks/hook_civicrm_buildProfile.md)** - called while preparing a profile form.
+* **[hook_civicrm_buildUFGroupsForModule](/hooks/hook_civicrm_buildUFGroupsForModule.md)** - called when ufgroups (profiles) are being built for a module.
+* **[hook_civicrm_processProfile](/hooks/hook_civicrm_processProfile.md)** - called when processing a valid profile form submission (e.g. for "civicrm/profile/create" or "civicrm/profile/edit").
+* **[hook_civicrm_searchProfile](/hooks/hook_civicrm_searchProfile.md)** - called while preparing a list of contacts (based on a profile).
+* **[hook_civicrm_validateProfile](/hooks/hook_civicrm_validateProfile.md)** - called while validating a profile form submission.
+* **[hook_civicrm_viewProfile](/hooks/hook_civicrm_viewProfile.md)** - called while preparing a read-only profile screen.
+
+## Report hooks
+
+* **[hook_civicrm_alterReportVar](/hooks/hook_civicrm_alterReportVar.md)** - used to add or modify display columns and filters.
+
+## Uncategorized hooks
+
+* **[hook_civicrm_alterBadge](/hooks/hook_civicrm_alterBadge.md)** - allows you to modify the content and format of name badges.
+* **[hook_civicrm_alterBarcode](/hooks/hook_civicrm_alterBarcode.md)** - allows you to modify the content that is encoded in barcode.
+* **[hook_civicrm_alterCalculatedMembershipStatus](/hooks/hook_civicrm_alterCalculatedMembershipStatus.md)** - called when calculating the membership status.
+* **[hook_civicrm_alterLogTables](/hooks/hook_civicrm_alterLogTables.md)** - allows you to amend the specification of the log tables to be created when logging is turned on.
+* **[hook_civicrm_alterMailingLabelParams](/hooks/hook_civicrm_alterMailingLabelParams.md)** - called to alter the parameters used to generate mailing labels.
+* **[hook_civicrm_alterPaymentProcessorParams](/hooks/hook_civicrm_alterPaymentProcessorParams.md)** - allows you to modify parameters passed to the payment processor.
+* **[hook_civicrm_alterSettingsFolders](/hooks/hook_civicrm_alterSettingsFolders.md)** - allows modules and extensions to scan for settings in additional folders.
+* **[hook_civicrm_alterSettingsMetaData](/hooks/hook_civicrm_alterSettingsMetaData.md)**
+* **[hook_civicrm_angularModules](/hooks/hook_civicrm_angularModules.md)** - generates a list of AngularJS modules and allows you to register additional AngularJS modules. It is currently **experimental**.
+* **[hook_civicrm_apiWrappers](/hooks/hook_civicrm_apiWrappers.md)** - allows you to add, override, or remove methods to be called before and after api calls &mdash; and to modify either the parameters or the result of the call.
+* **[hook_civicrm_buildAsset](/hooks/hook_civicrm_buildAsset.md)** - fires whenever the system builds a semi-dynamic asset.
+* **[hook_civicrm_buildStateProvinceForCountry](/hooks/hook_civicrm_buildStateProvinceForCountry.md)** - called during the ajax callback that is used to build the options that display in the State/Province select widget for a specific country, and can be used to alter the list of State/Province options for particular countries.
+* **[hook_civicrm_check](/hooks/hook_civicrm_check.md)** - called by the "System Check" api.
+* **[hook_civicrm_config](/hooks/hook_civicrm_config.md)** - called soon after the `CRM_Core_Config` object has been initialized.
+* **[<del>hook_civicrm_contactListQuery</del>](/hooks/hook_civicrm_contactListQuery.md)** - Deprecated in favor of [hook_civicrm_apiWrappers](/hooks/hook_civicrm_apiWrappers.md).
+* **[hook_civicrm_container](/hooks/hook_civicrm_container.md)** - modifies the CiviCRM container allowing you to add new services, parameters, extensions, etc.
+* **[hook_civicrm_coreResourceList](/hooks/hook_civicrm_coreResourceList.md)** - called when the list of core js/css resources is about to be processed, giving you the opportunity to modify the list prior to the resources being added, or add your own.
+* **[hook_civicrm_cron](/hooks/hook_civicrm_cron.md)** - called every time the CiviCRM scheduler is polled.
+* **[hook_civicrm_crudLink](/hooks/hook_civicrm_crudLink.md)** - Generate a default CRUD URL for an entity.
+* **[hook_civicrm_dupeQuery](/hooks/hook_civicrm_dupeQuery.md)** - called during the dedupe lookup process, and can be used to alter the parameters and queries used to determine if two contacts are duplicates.
+* **[hook_civicrm_eventDiscount](/hooks/hook_civicrm_eventDiscount.md)** - allows you to apply a customized discount to an event registration.
+* **[hook_civicrm_export](/hooks/hook_civicrm_export.md)** - allows to manipulate or change the output of CSV during export.
+* **[hook_civicrm_fileSearches](/hooks/hook_civicrm_fileSearches.md)** - allows you to add a reference to a file search service (e.g. Solr).
+* **[hook_civicrm_geocoderFormat](/hooks/hook_civicrm_geocoderFormat.md)** - allows you to manipulate the Address object during geocoding, for instance to extract additional fields from the geocoder&#039;s returned XML.
+* **[hook_civicrm_import](/hooks/hook_civicrm_import.md)** - called after contacts have been imported into the system, and before the temp import table has been destroyed.
+* **[hook_civicrm_membershipTypeValues](/hooks/hook_civicrm_membershipTypeValues.md)** - called when composing the array of membership types and their costs during a membership registration (new or renewal).
+* **[hook_civicrm_notePrivacy](/hooks/hook_civicrm_notePrivacy.md)** - provides a way to override the default privacy behavior for notes.
+* **[<del>hook_civicrm_optionValues</del>](/hooks/hook_civicrm_optionValues.md)** - deprecated in 4.7 in favor of [hook_civicrm_fieldOptions](/hooks/hook_civicrm_fieldOptions.md).
+* **[hook_civicrm_queryObjects](/hooks/hook_civicrm_queryObjects.md)** - called while building the core search query, allowing you to provide your own query objects which alter or extend the core search.
+* **[hook_civicrm_recent](/hooks/hook_civicrm_recent.md)** - called before storing recently viewed items.
+* **[hook_civicrm_tokens](/hooks/hook_civicrm_tokens.md)** - called to allow custom tokens to be defined.
+* **[hook_civicrm_tokenValues](/hooks/hook_civicrm_tokenValues.md)** - called to get all the values for the tokens registered.
+* **[hook_civicrm_unhandledException](/hooks/hook_civicrm_unhandledException.md)** - fires when an unhandled exception (fatal error) occurs.
+
+
diff --git a/mkdocs.yml b/mkdocs.yml
index 1553482c7cabaf8823b5183be150bc454adc988c..8a6f2d368c286460cac84166c25d6075940dd679 100644
--- a/mkdocs.yml
+++ b/mkdocs.yml
@@ -79,6 +79,7 @@ pages:
   # APIv3 Changes: api/changes.md
 - Hooks:
   - Using hooks: hooks/index.md
+  - All hooks: hooks/list.md
   - Setup:
     - Hooks with Symfony: hooks/setup/symfony.md
     - Hooks with Joomla: hooks/setup/joomla.md
diff --git a/tools/.gitignore b/tools/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..48b8bf9072d8716346ec810e5a1808305c97d50f
--- /dev/null
+++ b/tools/.gitignore
@@ -0,0 +1 @@
+vendor/
diff --git a/tools/README.md b/tools/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..164884629ebefd3c8b7c0c31d3767c2fcc43948b
--- /dev/null
+++ b/tools/README.md
@@ -0,0 +1,3 @@
+# tools
+
+This directory contains a small Symfony app which provides a command line utility for doing things like generating content and testing content. 
diff --git a/tools/bin/tools b/tools/bin/tools
new file mode 100755
index 0000000000000000000000000000000000000000..d3d66e5f74577771106ab5d7f1c8fe57d4e0dafd
--- /dev/null
+++ b/tools/bin/tools
@@ -0,0 +1,11 @@
+#!/usr/bin/env php
+<?php
+
+require __DIR__ . '/../vendor/autoload.php';
+
+use Symfony\Component\Console\Application;
+use AppBundle\Command\HooksListCommand;
+
+$application = new Application('Developer Guide tools');
+$application->add(new HooksListCommand());
+$application->run();
diff --git a/tools/composer.json b/tools/composer.json
new file mode 100644
index 0000000000000000000000000000000000000000..5ab5ace0ae69059340d8ea30d670b11421075f5b
--- /dev/null
+++ b/tools/composer.json
@@ -0,0 +1,12 @@
+{
+    "require": {
+        "symfony/console": "^3.3",
+        "symfony/yaml": "^3.3",
+        "twig/twig": "~1.0"
+    },
+    "autoload": {
+        "psr-4": {
+            "": "src/"
+        }
+    }
+}
diff --git a/tools/composer.lock b/tools/composer.lock
new file mode 100644
index 0000000000000000000000000000000000000000..838a4b09954ba62b9164e618664c531e5db3dfdf
--- /dev/null
+++ b/tools/composer.lock
@@ -0,0 +1,369 @@
+{
+    "_readme": [
+        "This file locks the dependencies of your project to a known state",
+        "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file",
+        "This file is @generated automatically"
+    ],
+    "content-hash": "b8d46fa7002eaadc5ca17bdbe3a8e5cf",
+    "packages": [
+        {
+            "name": "psr/log",
+            "version": "1.0.2",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/php-fig/log.git",
+                "reference": "4ebe3a8bf773a19edfe0a84b6585ba3d401b724d"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/php-fig/log/zipball/4ebe3a8bf773a19edfe0a84b6585ba3d401b724d",
+                "reference": "4ebe3a8bf773a19edfe0a84b6585ba3d401b724d",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.0.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Psr\\Log\\": "Psr/Log/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "PHP-FIG",
+                    "homepage": "http://www.php-fig.org/"
+                }
+            ],
+            "description": "Common interface for logging libraries",
+            "homepage": "https://github.com/php-fig/log",
+            "keywords": [
+                "log",
+                "psr",
+                "psr-3"
+            ],
+            "time": "2016-10-10T12:19:37+00:00"
+        },
+        {
+            "name": "symfony/console",
+            "version": "v3.3.2",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/console.git",
+                "reference": "70d2a29b2911cbdc91a7e268046c395278238b2e"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/console/zipball/70d2a29b2911cbdc91a7e268046c395278238b2e",
+                "reference": "70d2a29b2911cbdc91a7e268046c395278238b2e",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.5.9",
+                "symfony/debug": "~2.8|~3.0",
+                "symfony/polyfill-mbstring": "~1.0"
+            },
+            "conflict": {
+                "symfony/dependency-injection": "<3.3"
+            },
+            "require-dev": {
+                "psr/log": "~1.0",
+                "symfony/config": "~3.3",
+                "symfony/dependency-injection": "~3.3",
+                "symfony/event-dispatcher": "~2.8|~3.0",
+                "symfony/filesystem": "~2.8|~3.0",
+                "symfony/http-kernel": "~2.8|~3.0",
+                "symfony/process": "~2.8|~3.0"
+            },
+            "suggest": {
+                "psr/log": "For using the console logger",
+                "symfony/event-dispatcher": "",
+                "symfony/filesystem": "",
+                "symfony/process": ""
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "3.3-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Component\\Console\\": ""
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Symfony Console Component",
+            "homepage": "https://symfony.com",
+            "time": "2017-06-02T19:24:58+00:00"
+        },
+        {
+            "name": "symfony/debug",
+            "version": "v3.3.2",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/debug.git",
+                "reference": "e9c50482841ef696e8fa1470d950a79c8921f45d"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/debug/zipball/e9c50482841ef696e8fa1470d950a79c8921f45d",
+                "reference": "e9c50482841ef696e8fa1470d950a79c8921f45d",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.5.9",
+                "psr/log": "~1.0"
+            },
+            "conflict": {
+                "symfony/http-kernel": ">=2.3,<2.3.24|~2.4.0|>=2.5,<2.5.9|>=2.6,<2.6.2"
+            },
+            "require-dev": {
+                "symfony/http-kernel": "~2.8|~3.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "3.3-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Component\\Debug\\": ""
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Symfony Debug Component",
+            "homepage": "https://symfony.com",
+            "time": "2017-06-01T21:01:25+00:00"
+        },
+        {
+            "name": "symfony/polyfill-mbstring",
+            "version": "v1.4.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/polyfill-mbstring.git",
+                "reference": "f29dca382a6485c3cbe6379f0c61230167681937"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/f29dca382a6485c3cbe6379f0c61230167681937",
+                "reference": "f29dca382a6485c3cbe6379f0c61230167681937",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.3"
+            },
+            "suggest": {
+                "ext-mbstring": "For best performance"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.4-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Polyfill\\Mbstring\\": ""
+                },
+                "files": [
+                    "bootstrap.php"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Nicolas Grekas",
+                    "email": "p@tchwork.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Symfony polyfill for the Mbstring extension",
+            "homepage": "https://symfony.com",
+            "keywords": [
+                "compatibility",
+                "mbstring",
+                "polyfill",
+                "portable",
+                "shim"
+            ],
+            "time": "2017-06-09T14:24:12+00:00"
+        },
+        {
+            "name": "symfony/yaml",
+            "version": "v3.3.2",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/yaml.git",
+                "reference": "9752a30000a8ca9f4b34b5227d15d0101b96b063"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/yaml/zipball/9752a30000a8ca9f4b34b5227d15d0101b96b063",
+                "reference": "9752a30000a8ca9f4b34b5227d15d0101b96b063",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.5.9"
+            },
+            "require-dev": {
+                "symfony/console": "~2.8|~3.0"
+            },
+            "suggest": {
+                "symfony/console": "For validating YAML files using the lint command"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "3.3-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Component\\Yaml\\": ""
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Symfony Yaml Component",
+            "homepage": "https://symfony.com",
+            "time": "2017-06-02T22:05:06+00:00"
+        },
+        {
+            "name": "twig/twig",
+            "version": "v1.34.3",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/twigphp/Twig.git",
+                "reference": "451c6f4197e113e24c1c85bc3fc8c2d77adeff2e"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/twigphp/Twig/zipball/451c6f4197e113e24c1c85bc3fc8c2d77adeff2e",
+                "reference": "451c6f4197e113e24c1c85bc3fc8c2d77adeff2e",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.3"
+            },
+            "require-dev": {
+                "psr/container": "^1.0",
+                "symfony/debug": "~2.7",
+                "symfony/phpunit-bridge": "~3.3@dev"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.34-dev"
+                }
+            },
+            "autoload": {
+                "psr-0": {
+                    "Twig_": "lib/"
+                },
+                "psr-4": {
+                    "Twig\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com",
+                    "homepage": "http://fabien.potencier.org",
+                    "role": "Lead Developer"
+                },
+                {
+                    "name": "Armin Ronacher",
+                    "email": "armin.ronacher@active-4.com",
+                    "role": "Project Founder"
+                },
+                {
+                    "name": "Twig Team",
+                    "homepage": "http://twig.sensiolabs.org/contributors",
+                    "role": "Contributors"
+                }
+            ],
+            "description": "Twig, the flexible, fast, and secure template language for PHP",
+            "homepage": "http://twig.sensiolabs.org",
+            "keywords": [
+                "templating"
+            ],
+            "time": "2017-06-07T18:45:17+00:00"
+        }
+    ],
+    "packages-dev": [],
+    "aliases": [],
+    "minimum-stability": "stable",
+    "stability-flags": [],
+    "prefer-stable": false,
+    "prefer-lowest": false,
+    "platform": [],
+    "platform-dev": []
+}
diff --git a/tools/src/AppBundle/Command/HooksListCommand.php b/tools/src/AppBundle/Command/HooksListCommand.php
new file mode 100644
index 0000000000000000000000000000000000000000..3cdcc36fdb33a85bdbe92c26c8a81bdfad06f590
--- /dev/null
+++ b/tools/src/AppBundle/Command/HooksListCommand.php
@@ -0,0 +1,119 @@
+<?php
+
+namespace AppBundle\Command;
+
+use Symfony\Component\Console\Command\Command;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Output\OutputInterface;
+use Twig_Environment;
+use Twig_Loader_Filesystem;
+use AppBundle\Utils\Book;
+
+class HooksListCommand extends Command {
+
+  /*
+   * Data about all hooks, sorted by category
+   */
+  protected $categories = array();
+
+  protected function configure() {
+    $this
+      ->setName('generate:hooks-list')
+      ->setDescription('Generates a summary listing page of all hooks');
+  }
+
+  protected function execute(InputInterface $input, OutputInterface $output) {
+    $this->loadList();
+    $this->loadHookSummaries();
+    $this->writeOut();
+  }
+
+  /**
+   * Populate $this->categories with data
+   */
+  protected function loadList() {
+    // Get data from mkdocs.yml file under the 'Hooks' element
+    $categories = Book::pages()['Hooks'];
+
+    // Remove pages which are not about specific hooks
+    foreach ($categories as $category_name => &$pages) {
+      if (is_array($pages)) {
+        $pages = array_filter($pages, function ($page_url) {
+          return preg_match('/hook_civicrm_/', $page_url);
+        });
+      }
+      else {
+        $pages = FALSE;
+      }
+    }
+
+    // Remove empty categories
+    $categories = array_filter($categories);
+
+    $this->categories = $categories;
+  }
+
+  /**
+   * Write the file with markdown content
+   */
+  protected function writeOut() {
+    $loader = new Twig_Loader_Filesystem(__DIR__ . '/../Resources/views');
+    $twig = new Twig_Environment($loader);
+    $content = htmlspecialchars_decode($twig->render(
+      "hooks_list.md.twig",
+      array(
+        'categories' => $this->categories,
+        'command' => './bin/tools ' . $this->getName()
+      )
+    ));
+    file_put_contents(__DIR__ . '/../../../../docs/hooks/list.md', $content);
+  }
+
+  /**
+   * Load hook summary data into $this->categories for all hooks
+   */
+  protected function loadHookSummaries() {
+    foreach ($this->categories as $category => &$hooks) {
+      foreach ($hooks as $hook_name => &$value) {
+        $value = array(
+          'name' => $hook_name,
+          'url' => $value,
+          'summary' => self::lookupHookSummary($value),
+        );
+      }
+    }
+  }
+
+  /**
+   * Look up a hook summary in the markdown file for the hook and return it as
+   * a string.
+   *
+   * It will grab all the content beneath the "Summary" H2 element and will
+   * stop when it gets to the next heading
+   *
+   * @param string $hookUrl
+   *   The URL for the hook as given in mkdocs.yml
+   *   e.g. "hooks/hook_civicrm_links.md"
+   *
+   * @return string
+   *   Short prose written to describe the hook. Won't contain any newlines.
+   */
+  protected static function lookupHookSummary($hookUrl) {
+    // Load markdown file for the hook
+    $hook = __DIR__ . '/../../../../docs/' . $hookUrl;
+    $page = file_get_contents($hook);
+
+    // Grab summary from within the page
+    $matches = array();
+    $pattern = '/(?<=^## Summary).*(?=^#)/Usim';
+    preg_match($pattern, $page, $matches);
+    $summary = !empty($matches[0]) ? $matches[0] : '';
+
+    // Clean summary
+    $summary = preg_replace('/\s+/', ' ', trim($summary));
+    $summary = preg_replace('/This hook( is)?( was)? /', '', $summary);
+
+    return $summary;
+  }
+
+}
diff --git a/tools/src/AppBundle/Resources/views/category.md.twig b/tools/src/AppBundle/Resources/views/category.md.twig
new file mode 100644
index 0000000000000000000000000000000000000000..5b2ed588c277bc3db2b2346c7c5948e773076b5d
--- /dev/null
+++ b/tools/src/AppBundle/Resources/views/category.md.twig
@@ -0,0 +1,6 @@
+## {{ category }}
+
+{% for hook in hooks %}
+* **[{{ hook.name }}](/{{ hook.url }})**{% if hook.summary %} - {{ hook.summary }}{% endif %}
+
+{% endfor %}
diff --git a/tools/src/AppBundle/Resources/views/hooks_list.md.twig b/tools/src/AppBundle/Resources/views/hooks_list.md.twig
new file mode 100644
index 0000000000000000000000000000000000000000..22758fdd62372ad88c2f3331d01bb00ead64fa79
--- /dev/null
+++ b/tools/src/AppBundle/Resources/views/hooks_list.md.twig
@@ -0,0 +1,12 @@
+# All hooks
+
+{% include 'no_edit_notice.md.twig' %}
+
+This is an overview list of all available hooks, listed by category.
+
+{% for category, hooks in categories %}
+
+  {%- include 'category.md.twig' %}
+
+{% endfor %}
+
diff --git a/tools/src/AppBundle/Resources/views/no_edit_notice.md.twig b/tools/src/AppBundle/Resources/views/no_edit_notice.md.twig
new file mode 100644
index 0000000000000000000000000000000000000000..3ad56ded40eead939f3f4ebbb66b49073b8fc9b5
--- /dev/null
+++ b/tools/src/AppBundle/Resources/views/no_edit_notice.md.twig
@@ -0,0 +1,10 @@
+<!--
+  -- DO NOT EDIT
+  --
+  -- This entire page is auto-generated
+{%- if command %} by the following command:
+  -- {{ command }}
+{% endif %}
+  --
+  -->
+
diff --git a/tools/src/AppBundle/Utils/ArrayUtils.php b/tools/src/AppBundle/Utils/ArrayUtils.php
new file mode 100644
index 0000000000000000000000000000000000000000..7467a25b3c8b3ed0481155e074255a7cfe50921a
--- /dev/null
+++ b/tools/src/AppBundle/Utils/ArrayUtils.php
@@ -0,0 +1,61 @@
+<?php
+
+namespace AppBundle\Utils;
+
+class ArrayUtils {
+
+  /**
+   * If we have an array of arrays, we can use this function to merge all the
+   * child arrays
+   *
+   * @param mixed $array
+   *   Typically an array of arrays, but will accept anything.
+   *
+   *   Example:
+   *   [
+   *     0 => [
+   *       'foo' => 'FOO',
+   *       'bar' => 'BAR',
+   *     ],
+   *     1 => [
+   *       'baz' => 'BAZ'
+   *     ],
+   *   ]
+   *
+   * @return mixed
+   *   The array with elements merged. If a non-array is passed in, then it will
+   *   be returned without error.
+   *
+   *   Output for above example:
+   *   [
+   *     'foo' => 'FOO',
+   *     'bar' => 'BAR',
+   *     'baz' => 'BAZ',
+   *   ]
+   */
+  public static function merge_inner($array) {
+    return is_array($array)
+      ? call_user_func_array('array_merge', $array)
+      : $array;
+  }
+
+  /**
+   * Works like ArrayUtils::merge_inner but recursively.
+   *
+   * @param mixed $array
+   *
+   * @return mixed
+   *
+   */
+  public static function merge_inner_recursive($array) {
+    if (is_array($array)) {
+      $result = self::merge_inner($array);
+      $result = array_map('self::merge_inner_recursive', $result);
+      return $result;
+    }
+    else {
+      return $array;
+    }
+  }
+
+}
diff --git a/tools/src/AppBundle/Utils/Book.php b/tools/src/AppBundle/Utils/Book.php
new file mode 100644
index 0000000000000000000000000000000000000000..f2b744964b4641db9a6351db752cb47bab2ef491
--- /dev/null
+++ b/tools/src/AppBundle/Utils/Book.php
@@ -0,0 +1,23 @@
+<?php
+
+namespace AppBundle\Utils;
+
+use Symfony\Component\Yaml;
+
+class Book {
+
+  /**
+   * @return array
+   */
+  public static function pages() {
+    $mkdocs = __DIR__ . '/../../../../mkdocs.yml';
+    $navigation = (new Yaml\Parser())->parse(file_get_contents($mkdocs));
+
+    // Need to do some funky array stuff to flatten out the structure here
+    // because mkdocs.yml stores things in arrays without keys
+    $pages = ArrayUtils::merge_inner_recursive($navigation['pages']);
+
+    return $pages;
+  }
+
+}