diff --git a/action_example/CHANGELOG.txt b/action_example/CHANGELOG.txt
deleted file mode 100644
index 8b13789..0000000
--- a/action_example/CHANGELOG.txt
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/action_example/action_example.module b/action_example/action_example.module
index 20638cd..06ccec6 100644
--- a/action_example/action_example.module
+++ b/action_example/action_example.module
@@ -3,10 +3,18 @@
 /**
  * @file
  * Action definition example module.
+ */
+ 
+/**
+ * @defgroup action_example Example: Action
+ * @ingroup examples
+ * @{
+ * Creating actions in Drupal 7
  *
  * Triggers and actions are a matched pair of Drupal features allowing some
  * Drupal programming without using PHP. Using the appropriate action in a
  * specific event, a site administrator can add new functionality.
+ *
  * Examples are:
  *  - Send an email after a node is published or edited.
  *  - Display a message after a user has logged in.
@@ -53,17 +61,10 @@
  * - An action which extends the capabilities of node triggers, but limited
  *   to certain events only, and using a customizable option.
  *
- * See:
- *
- * @todo this is a drupal 6 link
- * @link http://drupal.org/node/172152 Writing Actions @endlink
- *
- * @todo this is a drupal 6 link
- * @link http://drupal.org/node/199254 Triggers and Actions in Drupal 7 @endlink
- *
+ * @see trigger_example
  * @see hook_action_info()
- * In addition, the @link trigger_example.module Trigger Example @endlink
- * provides detailed information on how to create a trigger.
+ * @see @link http://drupal.org/node/172152 Writing Actions in Drupal 6 @endlink
+ * @see @link http://drupal.org/node/199254 Triggers and Actions in Drupal 6 @endlink
  */
 
 /**
@@ -137,7 +138,7 @@
  *       special care in the "presave" hook, in which case a dependent "save"
  *       action should NOT be invoked.
  *
- * See hook_action_info().
+ * @see hook_action_info()
  */
 function action_example_action_info() {
   return array(
@@ -168,7 +169,7 @@ function action_example_action_info() {
 /**
  * Implements hook_menu().
  *
- * Simply provide a menu entry which explains what the module does.
+ * Provides a menu entry which explains what the module does.
  */
 function action_example_menu() {
   $items['examples/action_example'] = array(
@@ -188,45 +189,37 @@ function _action_example_page() {
   return t("The Action Example provides three example actions which can be configured on the <a href='@actions_url'>Actions configuration page</a> and assigned to triggers on the <a href='@triggers_url'>Triggers configuration page</a>.", array('@actions_url' => url('admin/config/system/actions'), '@triggers_url' => url('admin/structure/trigger/node')));
 }
 
-/*
- * Most basic action.
+/**
+ * Action function for action_example_basic_action.
  *
  * This action is not expecting any type of entity object, and can be used with
  * any trigger type or any event.
- */
-
-/**
- * Basic example action.
  *
  * @param $entity
  *   An optional entity object.
- * @param array $context
+ * @param $context
  *   Array with parameters for this action: depends on the trigger.
  *
- * @ingroup actions
+ * @see action_example_action_info()
  */
 function action_example_basic_action(&$entity, $context = array()) {
   //
   // In this case we are ignoring the entity and the context. This case of
   // action is useful when your action does not depend on the context, and
   // the function must do something regardless the scope of the trigger.
-  // Simply announces that the action was executed using a messages.
+  // Simply announces that the action was executed using a message.
 
   drupal_set_message(t('action_example_basic_action fired'));
   watchdog('action_example', 'action_example_basic_action fired.');
 }
 
-// ---------------------------------------------------------------------------
-/*
- * A complex action for different trigger types.
+/**
+ * Action function for action_example_unblock_user_action.
  *
  * This action is expecting an entity object user, node or comment. If none of
  * the above is provided (because it was not called from an user/node/comment
  * trigger event, then the action will be taken on the current logged in user.
  *
- */
-
-/**
  * Unblock an user. This action can be fired from different trigger types:
  * - User trigger: this user will be unblocked.
  * - Node/Comment trigger: the author of the node or comment will be unblocked.
@@ -236,11 +229,9 @@ function action_example_basic_action(&$entity, $context = array()) {
  * @param $entity
  *   An optional user object (could be a user, or an author if context is
  *   node or comment)
- * @param array $context
+ * @param $context
  *   Array with parameters for this action: depends on the trigger. The context
  *   is not used in this example.
- *
- * @ingroup actions
  */
 function action_example_unblock_user_action(&$entity, $context = array()) {
 
@@ -262,29 +253,29 @@ function action_example_unblock_user_action(&$entity, $context = array()) {
   drupal_set_message(t('Unblocked user %name', array('%name' => $account->name)));
 }
 
-// ---------------------------------------------------------------------------
-/*
- * A complex action using customization.
+/**
+ * Form function for action_example_node_sticky_action.
  *
- * The next action requires a configuration form to create/configure the action.
- * In Drupal these are called 'advanced actions', because they must be
- * customized to define their functionality.
+ * Since we defined action_example_node_sticky_action as 'configurable' => TRUE,
+ * this action requires a configuration form to create/configure the action.
+ * In this circumstance, Drupal will attempt to call a function named by
+ * combining the action name (action_example_node_sticky_action) and _form, in
+ * this case yielding action_example_node_sticky_action_form.
+ *
+ * In Drupal, actions requiring creation and configuration are called 'advanced
+ * actions', because they must be customized to define their functionality.
  *
  * The 'action_example_node_sticky_action' allows creating rules to promote and
  * set sticky content created by selected users on certain events. A form is
  * used to configure which user is affected by this action, and this form
  * includes the stanard _validate and _submit hooks.
- */
-
-
-/**
- * Generates settings form for action_example_node_sticky_action().
  *
- * @param array $context
+ * @param $context
  *   An array of options of this action (in case it is being edited)
  *
  * @return array $form
  *
+ * @see action_example_action_info()
  */
 function action_example_node_sticky_action_form($context) {
   /*
@@ -332,8 +323,11 @@ function action_example_node_sticky_action_submit($form, $form_state) {
 }
 
 /**
- * Promote and set sticky flag action. This is the special action that has been
- * customized using the configuration form.
+ * Action function for action_example_node_sticky_action.
+ *
+ * Promote and set sticky flag. This is the special action that has been
+ * customized using the configuration form, validated with the validation
+ * function, and submitted with the submit function.
  *
  * @param $node
  *   A node object provided by the associated trigger.
@@ -341,8 +335,6 @@ function action_example_node_sticky_action_submit($form, $form_state) {
  *   Array with the following elements:
  *   - 'author': username of the author's content this function will promote and
  *     set as sticky.
- *
- * @ingroup actions
  */
 function action_example_node_sticky_action($node, $context) {
   if (function_exists('dsm')) {
@@ -359,3 +351,6 @@ function action_example_node_sticky_action($node, $context) {
     drupal_set_message(t('Set @type %title to sticky and promoted by special action for user %username.', array('@type' => node_type_get_name($node), '%title' => $node->title, '%username' => $account->name)));
   }
 }
+/**
+ * @} End of "defgroup action_example".
+ */
diff --git a/ajax_example/ajax_example.css b/ajax_example/ajax_example.css
index 68bf370..e1cdc69 100644
--- a/ajax_example/ajax_example.css
+++ b/ajax_example/ajax_example.css
@@ -1,19 +1,17 @@
 /*
- * @file ajax_example.css
- *   CSS for ajax_example.
+ * @file
+ * CSS for ajax_example.
  *
  * See @link ajax_example_dependent_dropdown_degrades @endlink for
  * details on what this file does. It is not used in any other example.
  */
  
-/* hide the next button when not degrading to non-javascript browser */
+/* Hides the next button when not degrading to non-javascript browser */
 html.js .next-button { 
   display: none; 
 }
 
-/* Make the next/choose button align to the right of the select control */
+/* Makes the next/choose button align to the right of the select control */
 .form-item-dropdown-first, .form-item-question-type-select {
   display: inline-block;
 }
-
-
diff --git a/ajax_example/ajax_example.js b/ajax_example/ajax_example.js
index 2f64d12..2d06038 100644
--- a/ajax_example/ajax_example.js
+++ b/ajax_example/ajax_example.js
@@ -1,10 +1,9 @@
 /*
- * @file ajax_example.js
- *   JavaScript for ajax_example.
+ * @file
+ * JavaScript for ajax_example.
  *
  * See @link ajax_example_dependent_dropdown_degrades @endlink for
  * details on what this file does. It is not used in any other example.
- * 
  */
 
 (function($) {
diff --git a/ajax_example/ajax_example.module b/ajax_example/ajax_example.module
index ca842d3..3c4c197 100644
--- a/ajax_example/ajax_example.module
+++ b/ajax_example/ajax_example.module
@@ -6,7 +6,8 @@
  */
 
 /**
- * @defgroup ajax_examples AJAX Examples
+ * @defgroup ajax_example Example: AJAX
+ * @ingroup examples
  * @{
  * These examples show basic AJAX concepts.
  *
@@ -15,16 +16,14 @@
  * @link http://drupal.org/node/752056 AJAX Forms handbook page @endlink.
  *
  * The several examples here demonstrate basic AJAX usage.
- * @}
-*/
+ */
 
 /**
  * Implements hook_menu().
  *
  * Sets up calls to drupal_get_form() for all our example cases.
  *
- * See @link menu_example.module Menu Example @endlink for more details on
- * hook_menu().
+ * @see menu_example.module for more details on hook_menu().
  */
 function ajax_example_menu() {
   $items = array();
@@ -204,11 +203,6 @@ function ajax_example_intro() {
 }
 
 /**
- * @ingroup ajax_examples
- * @{
- */
-
-/**
  * Simple form whose ajax-enabled 'changethis' member causes a text change
  * in the description of the 'replace_textfield' member.
  * See @link http://drupal.org/node/262422 Form API Tutorial @endlink
@@ -528,7 +522,8 @@ function _ajax_example_get_first_dropdown_options() {
  * Helper function to populate the second dropdown. This would normally be
  * pulling data from the database.
  *
- * @param key. This will determine which set of options is returned.
+ * @param $key
+ *   This will determine which set of options is returned.
  *
  * @return array of options
  */
@@ -546,4 +541,6 @@ function _ajax_example_get_second_dropdown_options($key = '') {
     return array();
   }
 }
-
+/**
+ * @} End of "defgroup ajax_example".
+ */
diff --git a/ajax_example/ajax_example_advanced.inc b/ajax_example/ajax_example_advanced.inc
index 182465d..57e6079 100644
--- a/ajax_example/ajax_example_advanced.inc
+++ b/ajax_example/ajax_example_advanced.inc
@@ -8,8 +8,7 @@
  * new AJAX commands. This is consolidated into a dense page because
  * it's advanced material and because it would spread itself all over creation
  * otherwise.
- *
-*/
+ */
 
 /**
  * Form to display the AJAX Commands.
@@ -228,6 +227,7 @@ function ajax_example_advanced_commands($form, &$form_state) {
 
 /**
  * 'after' callback.
+ *
  * @see ajax_command_after()
  */
 function ajax_example_advanced_commands_after_callback($form, $form_state) {
@@ -241,6 +241,7 @@ function ajax_example_advanced_commands_after_callback($form, $form_state) {
 
 /**
  * 'alert' callback.
+ *
  * @see ajax_command_alert()
  */
 function ajax_example_advanced_commands_alert_callback($form, $form_state) {
@@ -251,6 +252,7 @@ function ajax_example_advanced_commands_alert_callback($form, $form_state) {
 
 /**
  * 'append' callback.
+ *
  * @see ajax_command_append()
  */
 function ajax_example_advanced_commands_append_callback($form, $form_state) {
@@ -264,6 +266,7 @@ function ajax_example_advanced_commands_append_callback($form, $form_state) {
 
 /**
  * 'before' callback.
+ *
  * @see ajax_command_before()
  */
 function ajax_example_advanced_commands_before_callback($form, $form_state) {
@@ -277,6 +280,7 @@ function ajax_example_advanced_commands_before_callback($form, $form_state) {
 
 /**
  * 'changed' callback.
+ *
  * @see ajax_command_changed()
  */
 function ajax_example_advanced_commands_changed_callback($form, $form_state) {
@@ -295,6 +299,7 @@ function ajax_example_advanced_commands_changed_callback($form, $form_state) {
 
 /**
  * 'css' callback.
+ *
  * @see ajax_command_css()
  */
 function ajax_example_advanced_commands_css_callback($form, $form_state) {
@@ -309,6 +314,7 @@ function ajax_example_advanced_commands_css_callback($form, $form_state) {
 
 /**
  * 'data' callback.
+ *
  * @see ajax_command_data()
  */
 function ajax_example_advanced_commands_data_callback($form, $form_state) {
@@ -324,6 +330,7 @@ function ajax_example_advanced_commands_data_callback($form, $form_state) {
 
 /**
  * 'html' callback.
+ *
  * @see ajax_command_html()
  */
 function ajax_example_advanced_commands_html_callback($form, $form_state) {
@@ -337,6 +344,7 @@ function ajax_example_advanced_commands_html_callback($form, $form_state) {
 
 /**
  * 'prepend' callback.
+ *
  * @see ajax_command_prepend()
  */
 function ajax_example_advanced_commands_prepend_callback($form, $form_state) {
@@ -348,6 +356,7 @@ function ajax_example_advanced_commands_prepend_callback($form, $form_state) {
 
 /**
  * 'remove' callback.
+ *
  * @see ajax_command_remove()
  */
 function ajax_example_advanced_commands_remove_callback($form, $form_state) {
@@ -366,6 +375,7 @@ function ajax_example_advanced_commands_remove_callback($form, $form_state) {
 
 /**
  * 'restripe' rows callback.
+ *
  * Rebuilds the table with the selected number of rows.
  */
 function ajax_example_advanced_commands_restripe_num_rows($form, $form_state) {
@@ -380,6 +390,7 @@ function ajax_example_advanced_commands_restripe_num_rows($form, $form_state) {
 
 /**
  * 'restripe' callback.
+ *
  * @see ajax_command_restripe()
  */
 function ajax_example_advanced_commands_restripe_callback($form, $form_state) {
diff --git a/ajax_example/ajax_example_graceful_degradation.inc b/ajax_example/ajax_example_graceful_degradation.inc
index aa2a9ee..ce83e98 100644
--- a/ajax_example/ajax_example_graceful_degradation.inc
+++ b/ajax_example/ajax_example_graceful_degradation.inc
@@ -6,7 +6,8 @@
  */
 
 /**
- * @defgroup ajax_degradation_examples AJAX Degradation Examples
+ * @defgroup ajax_degradation_example Example: AJAX Graceful Degradation
+ * @ingroup examples
  * @{
  * These examples show AJAX with graceful degradation when Javascript is not
  * available.
@@ -14,14 +15,8 @@
  * In each of these the key idea is that the form is rebuilt different ways
  * depending on form input. In order to accomplish that, the formbuilder function
  * is in charge of almost all logic.
- *
- * @see ajax
- *
- * @}
  */
 
-
-
 /**
  * A form with a dropdown whose options are dependent on a
  * choice made in a previous dropdown.
@@ -39,9 +34,6 @@
  * form as if Javascript were not enabled. ajax_example_menu() provides two
  * ways to call this form, one normal ($no_js_use = FALSE) and one simulating
  * Javascript disabled ($no_js_use = TRUE).
- *
- * @ingroup ajax_examples
- * @ingroup ajax_degradation_examples
  */
 function ajax_example_dependent_dropdown_degrades($form, &$form_state, $no_js_use = FALSE) {
   // Get the list of options to populate the first dropdown.
@@ -147,9 +139,10 @@ function ajax_example_dependent_dropdown_degrades_submit($form, &$form_state) {
 }
 
 /**
- * Selects just the second dropdown to be returned for re-rendering
+ * Selects just the second dropdown to be returned for re-rendering.
  *
- * @return renderable array (the second dropdown)
+ * @return
+ *   Renderable array (the second dropdown).
  */
 function ajax_example_dependent_dropdown_degrades_first_callback($form, $form_state) {
   return $form['dropdown_second_fieldset']['dropdown_second'];
@@ -166,11 +159,7 @@ function ajax_example_dependent_dropdown_degrades_first_callback($form, $form_st
  *
  * The third $no_js_use argument is strictly for demonstrating operation
  * without javascript, without making the user/developer turn off javascript.
- *
- * @ingroup ajax_examples
- * @ingroup ajax_degradation_examples
  */
-
 function ajax_example_dynamic_sections($form, &$form_state, $no_js_use = FALSE) {
 
   // Attach the CSS and JS we need to show this with and without javascript.
@@ -337,10 +326,6 @@ function ajax_example_dynamic_sections_select_callback($form, $form_state) {
  *   Used for this demonstration only. If true means that the form should be
  *   built using a simulated no-javascript approach (ajax.js will not be
  *   loaded.)
- *
- * @ingroup ajax_examples
- * @ingroup ajax_degradation_examples
- *
  */
 function ajax_example_wizard($form, &$form_state, $no_js_use = FALSE) {
 
@@ -458,7 +443,6 @@ function ajax_example_wizard_callback($form, $form_state) {
  * In AJAX this is only submitted when the final submit button is clicked,
  * but in the non-javascript situation, it is submitted with every
  * button click.
- *
  */
 function ajax_example_wizard_submit($form, &$form_state) {
 
@@ -491,7 +475,7 @@ function ajax_example_wizard_submit($form, &$form_state) {
     foreach ($form_state['storage']['values'] as $step => $values) {
       $value_message .= "$step: ";
       foreach ($values as $key => $value) {
-       $value_message .= "$key=$value, ";
+        $value_message .= "$key=$value, ";
       }
     }
     drupal_set_message($value_message);
@@ -519,11 +503,7 @@ function ajax_example_wizard_submit($form, &$form_state) {
  * The $no_js_use argument is simply for demonstration: When set, it prevents
  * '#ajax' from being set, thus making the example behave as if javascript
  * were disabled in the browser.
- *
- * @ingroup ajax_examples
- * @ingroup ajax_degradation_examples
  */
-
 function ajax_example_add_more($form, &$form_state, $no_js_use = FALSE) {
   $form['description'] = array(
     '#markup' => '<div>' . t('This example shows an add-more and a remove-last button. The <a href="!ajax">AJAX version</a> does it without page reloads; the <a href="!multistep">non-js version</a> is the same code but simulates a non-javascript environment, showing it with page reloads.',
@@ -599,7 +579,7 @@ function ajax_example_add_more($form, &$form_state, $no_js_use = FALSE) {
 /**
  * Callback for both ajax-enabled buttons.
  *
- * This simply selects and returns the fieldset with the names in it.
+ * Selects and returns the fieldset with the names in it.
  */
 function ajax_example_add_more_callback($form, $form_state) {
   return $form['names_fieldset'];
@@ -608,7 +588,7 @@ function ajax_example_add_more_callback($form, $form_state) {
 /**
  * Submit handler for the "add-one-more" button.
  *
- * It just increments the max counter and causes a rebuild.
+ * Increments the max counter and causes a rebuild.
  */
 function ajax_example_add_more_add_one($form, &$form_state) {
   $form_state['num_names']++;
@@ -637,3 +617,6 @@ function ajax_example_add_more_submit($form, &$form_state) {
     array('@names' => implode(', ', $form_state['values']['names_fieldset']['name'])) );
   drupal_set_message($output);
 }
+/**
+ * @} End of "defgroup ajax_degradation_example".
+ */
diff --git a/ajax_example/ajax_example_misc.inc b/ajax_example/ajax_example_misc.inc
index d7d1b16..4cb099e 100644
--- a/ajax_example/ajax_example_misc.inc
+++ b/ajax_example/ajax_example_misc.inc
@@ -13,7 +13,10 @@
  *
  * When using the AJAX framework outside the context of a form or a renderable
  * array of type 'link', you have to include ajax.js explicitly.
- * @return unknown_type
+ *
+ * @return
+ *
+ * @ingroup ajax_example
  */
 function ajax_example_render_link() {
   // drupal_add_library is invoked automatically when a form element has the
@@ -40,14 +43,16 @@ URL whether JS was enabled or not, letting it do different things based on that.
  * #ajax property.
  *
  * A link that is constructed as a renderable array can have the #ajax property,
- * which ensures that the link submission is done without a page refresh. The href
- * of the link is used as the ajax callback, but it degrades gracefully without
- * JavaScript because if the 'nojs' portion of the href is not stripped out by js,
- * the callback will return content as required for a full page reload.
+ * which ensures that the link submission is done without a page refresh. The
+ * href of the link is used as the ajax callback, but it degrades gracefully
+ * without JavaScript because if the 'nojs' portion of the href is not stripped
+ * out by js, the callback will return content as required for a full page
+ * reload.
  *
  * The necessary JavaScript file, ajax.js, will be included on the page
  * automatically.
- * @return unknown_type
+ *
+ * @return
  */
 function ajax_example_render_link_ra() {
   $explanation = "
@@ -71,7 +76,6 @@ URL whether JS was enabled or not, letting it do different things based on that.
       'method' => 'html',
     ),
   );
-  
   return $build;
 }
 
@@ -81,13 +85,15 @@ URL whether JS was enabled or not, letting it do different things based on that.
  * Takes different logic paths based on whether Javascript was enabled.
  * If $type == 'ajax', it tells this function that ajax.js has rewritten
  * the URL and thus we are doing an AJAX and can return an array of commands.
+ *
  * @param $type
- *   Either 'ajax' or 'nojs. Type is simply the normal URL argument to this
- *   URL.
+ *   Either 'ajax' or 'nojs. Type is simply the normal URL argument to this URL.
+ *
  * @return
  *   If $type == 'ajax', returns an array of AJAX Commands.
  *   Otherwise, just returns the content, which will end up being a page.
- * @see ajax
+ *
+ * @ingroup ajax_example
  */
 function ajax_link_response($type = 'ajax') {
   if ($type == 'ajax') {
diff --git a/batch_example/batch_example.install b/batch_example/batch_example.install
index af015be..20ca484 100644
--- a/batch_example/batch_example.install
+++ b/batch_example/batch_example.install
@@ -21,6 +21,8 @@
  * To make this update function run again and again, execute the query
  * "update system set schema_version = 0 where name = 'batch_example';"
  * and then run /update.php.
+ *
+ * @ingroup batch_example
  */
 function batch_example_update_7100(&$sandbox) {
   $ret = array();
diff --git a/batch_example/batch_example.module b/batch_example/batch_example.module
index e44169d..8a20a19 100644
--- a/batch_example/batch_example.module
+++ b/batch_example/batch_example.module
@@ -3,6 +3,13 @@
 /**
  * @file
  * Outlines how a module can use the Batch API.
+ */
+
+/**
+ * @defgroup batch_example Example: Batch API
+ * @ingroup examples
+ * @{
+ * Outlines how a module can use the Batch API.
  *
  * Batches allow heavy processing to be spread out over several page
  * requests, ensuring that the processing does not get interrupted
@@ -13,14 +20,11 @@
  * The @link batch_example.install .install file @endlink also shows how the
  * Batch API can be used to handle long-running hook_update_N() functions.
  *
- * @see batch
- */
-
-/**
  * Two harmless batches are defined:
  * - batch 1: Load the node with the lowest nid 100 times.
  * - batch 2: Load all nodes, 20 times and uses a progressive op, loading nodes
  *   by groups of 5.
+ * @see batch
  */
 
 /**
@@ -82,12 +86,6 @@ function batch_example_simple_form_submit($form, &$form_state) {
 
 
 /**
- * @defgroup batch_definitions Example batch definitions
- * @{
- * Definitions of the batches used in this module.
- */
-
-/**
  * Batch 1 definition: Load the node with the lowest nid 1000 times.
  * This creates an operations array defining what batch 1 should do, including
  * what it should do when it's finished. In this case, each operation is the
@@ -262,3 +260,6 @@ function _batch_example_update_http_requests() {
 function _batch_example_get_http_requests() {
   return !empty($_SESSION['http_request_count']) ? $_SESSION['http_request_count'] : 0;
 }
+/**
+ * @} End of "defgroup batch_example".
+ */
diff --git a/batch_example/batch_example.test b/batch_example/batch_example.test
index 70198fd..3431998 100644
--- a/batch_example/batch_example.test
+++ b/batch_example/batch_example.test
@@ -6,7 +6,6 @@
  *
  * This file contains the test cases to check if module is performing as
  * expected.
- *
  */
 class BatchExampleTestCase extends DrupalWebTestCase {
   protected $web_user;
diff --git a/block_example/block_example.install b/block_example/block_example.install
index 13a9df8..6a23a64 100644
--- a/block_example/block_example.install
+++ b/block_example/block_example.install
@@ -7,6 +7,8 @@
 
 /**
  * Implements hook_uninstall().
+ *
+ * @ingroup block_example
  */
 function block_example_uninstall() {
   variable_del('block_example_string');
diff --git a/block_example/block_example.module b/block_example/block_example.module
index e5d5464..18c67ff 100755
--- a/block_example/block_example.module
+++ b/block_example/block_example.module
@@ -2,6 +2,15 @@
 
 /**
  * @file
+ * Module file for block_example.
+ */
+
+/**
+ * @defgroup block_example Example: Block
+ * @ingroup examples
+ * @{
+ * Demonstrates code creation of blocks.
+ *
  * This is an example outlining how a module can define blocks that can be
  * displayed on various pages of a site, or how to alter blocks provided by
  * other modules.
@@ -215,3 +224,6 @@ function block_example_block_view_alter(&$data, $block) {
     $data['subject'] = isset($data['subject']) ? drupal_strtoupper($data['subject']) : '';
   }
 }
+/**
+ * @} End of "defgroup block_example".
+ */
diff --git a/dbtng_example/dbtng_example.install b/dbtng_example/dbtng_example.install
index 588b0bd..43f634e 100644
--- a/dbtng_example/dbtng_example.install
+++ b/dbtng_example/dbtng_example.install
@@ -14,6 +14,7 @@
  * We will create a default entry in the database.
  *
  * @see hook_install()
+ * @ingroup dbtng_example
  */
 function dbtng_example_install() {
   // Outside of the .install file we would use drupal_write_record() to
@@ -50,20 +51,22 @@ function dbtng_example_install() {
  * for us.
  *
  * @see hook_uninstall()
+ * @ingroup dbtng_example
  */
 function dbtng_example_uninstall() {
+  // nothing.
 }
 
 
 /**
  * Implements hook_schema().
  *
- * Define the database tables used by this module.
+ * Defines the database tables used by this module.
  * Remember that the easiest way to create the code for hook_schema is with
- * the schema module:
- * @link http://drupal.org/project/schema @endlink
+ * the @link http://drupal.org/project/schema schema module @endlink
  *
  * @see hook_schema()
+ * @ingroup dbtng_example
  */
 function dbtng_example_schema() {
 
diff --git a/dbtng_example/dbtng_example.module b/dbtng_example/dbtng_example.module
index 352d2d6..5dad999 100644
--- a/dbtng_example/dbtng_example.module
+++ b/dbtng_example/dbtng_example.module
@@ -13,13 +13,16 @@
  */
 
 /**
- * @defgroup database_examples Database Examples
+ * @defgroup dbtng_example Example: Database (DBTNG)
+ * @ingroup examples
  * @{
- * These examples show basic database examples, including DBTNG.
+ * Database examples, including DBTNG.
+ *
+ * 'DBTNG' means 'Database: The Next Generation.' Yes, Drupallers are nerds.
  *
  * General documentation is available at
- * @link database Database abstraction layer documentation @endlink and
- * at @link http://drupal.org/node/310069 @endlink.
+ * @link database.inc database abstraction layer documentation @endlink and
+ * at @link http://drupal.org/node/310069 Database API @endlink.
  *
  * The several examples here demonstrate basic database usage.
  *
@@ -62,7 +65,6 @@
  * @see db_update()
  * @see db_delete()
  * @see drupal_write_record()
- * @}
 */
 
 /**
@@ -89,7 +91,6 @@
  * @param $entry
  *   An array containing all the fields of the database record.
  *
- * @ingroup database_examples
  * @see db_insert()
  */
 function dbtng_example_entry_insert($entry) {
@@ -126,7 +127,6 @@ function dbtng_example_entry_insert($entry) {
  * @param $entry
  *   An array containing all the fields of the item to be updated.
  *
- * @ingroup database_examples
  * @see db_update()
  */
 function dbtng_example_entry_update($entry) {
@@ -157,7 +157,6 @@ function dbtng_example_entry_update($entry) {
  *   An array containing at least the person identifier 'pid' element of the
  *   entry to delete.
  *
- * @ingroup database_examples
  * @see db_delete()
  */
 function dbtng_example_entry_delete($entry) {
@@ -239,7 +238,6 @@ function dbtng_example_entry_delete($entry) {
  * @return
  *   An object containing the loaded entries if found.
  *
- * @ingroup database_examples
  * @see db_select()
  * @see db_query()
  * @see http://drupal.org/node/310072
@@ -568,3 +566,6 @@ function dbtng_example_form_update_submit($form, $form_state) {
   $count = dbtng_example_entry_update($entry);
   drupal_set_message(t("Updated entry @entry (@count row updated)", array('@count' => $count, '@entry' => print_r($entry, TRUE))));
 }
+/**
+ * @} End of "defgroup dbtng_example".
+ */
diff --git a/dbtng_example/dbtng_example.test b/dbtng_example/dbtng_example.test
index ab732d3..6d16e7e 100644
--- a/dbtng_example/dbtng_example.test
+++ b/dbtng_example/dbtng_example.test
@@ -2,7 +2,7 @@
 
 /**
  * @file
- * test file for dbtng_example module.
+ * SimpleTests for dbtng_example module.
  */
 
 /**
@@ -178,4 +178,3 @@ class DBTNGExampleUnitTestCase extends DrupalWebTestCase {
     );
   }
 }
-
diff --git a/email_example/email_example.module b/email_example/email_example.module
index e5ab92a..c88abb7 100644
--- a/email_example/email_example.module
+++ b/email_example/email_example.module
@@ -3,11 +3,18 @@
 /**
  * @file
  * Example of how to use Drupal's mail API.
+ */
+
+/**
+ * @defgroup email_example Example: Email
+ * @ingroup examples
+ * @{
+ * Example of how to use Drupal's mail API.
  *
- * This example module provides two different examples of the Drupal email API.
- *  - defines a simple contact form and shows how to use drupal_mail()
+ * This example module provides two different examples of the Drupal email API:
+ *  - Defines a simple contact form and shows how to use drupal_mail()
  *    to send an e-mail (defined in hook_mail()) when the form is submitted.
- *  - shows how modules can alter emails defined by other Drupal modules or
+ *  - Shows how modules can alter emails defined by other Drupal modules or
  *    Core using hook_mail_alter by attaching a custom signature before
  *    they are sent.
  */
@@ -60,7 +67,7 @@ function email_example_mail($key, &$message, $params) {
 }
 
 /**
- * Send an e-mail.
+ * Sends an e-mail.
  *
  * @param $form_values
  *   An array of values from the contact form fields that were submitted.
@@ -199,3 +206,6 @@ function email_example_form_validate($form, &$form_state) {
 function email_example_form_submit($form, &$form_state) {
   email_example_mail_send($form_state['values']);
 }
+/**
+ * @} End of "defgroup email_example".
+ */
diff --git a/email_example/email_example.test b/email_example/email_example.test
index b673670..aa70ea1 100644
--- a/email_example/email_example.test
+++ b/email_example/email_example.test
@@ -95,4 +95,3 @@ class EmailExampleTestCase extends DrupalWebTestCase {
     );
   }
 }
-
diff --git a/examples.index.php b/examples.index.php
deleted file mode 100644
index beab81a..0000000
--- a/examples.index.php
+++ /dev/null
@@ -1,31 +0,0 @@
-<?php
-
-/**
- * @file
- * Example modules
- *
- * - @link action_example.module Creating actions @endlink
- * - @link ajax_example.module Using AJAX forms @endlink
- * - @link batch_example.module Using the batch API @endlink
- * - @link block_example.module Defining blocks @endlink
- * - @link dbtng_example.module Database examples (DBTNG) @endlink
- * - @link email_example.module Sending e-mail @endlink
- * - @link field_example.module Defining fields in the field API @endlink
- * - @link file_example.module Demonstrates file handling @endlink
- * - @link filter_example.module Defining an input filter @endlink
- * - @link form_example.module Form API examples, including multistep forms @endlink
- * - @link image_exmaple.module Demonstrates image handling with styles and effects @endlink
- * - @link js_example.module Javascript examples @endlink
- * - @link menu_example.module Menu API examples @endlink
- * - @link nodeapi_example.module Node API demonstrations showing how a separate module can change the behavior of a node @endlink
- * - @link node_access_example.module Define custom node access fules using node access hooks @endlink
- * - @link node_example.module Creating custom node types, with fields @endlink
- * - @link page_example.module Creating a custom page @endlink
- * - @link queue_example.module Using the Queue API @endlink
- * - @link render_example.module Demonstrates the render API @endlink
- * - @link simpletest_example.module Writing tests for Drupal @endlink
- * - @link token_example.module Using tokens @endlink
- * - @link trigger_example.module Implementing triggers and actions @endlink
- * - @link vertical_tabs_example.module Using vertical tabs @endlink
- * - @link xmlrpc_example.module XML-RPC example @endlink
- */
\ No newline at end of file
diff --git a/examples.info b/examples.info
new file mode 100644
index 0000000..c0f2315
--- /dev/null
+++ b/examples.info
@@ -0,0 +1,4 @@
+name = Examples For Developers
+description = A variety of example code for you to learn from and hack upon.
+package = Example modules
+core = 7.x
diff --git a/examples.module b/examples.module
new file mode 100644
index 0000000..9fde239
--- /dev/null
+++ b/examples.module
@@ -0,0 +1,41 @@
+<?php
+
+/**
+ * @file
+ * This file serves as a stub file for the many Examples modules in the
+ * @link http://drupal.org/project/examples Examples for Developers Project @endlink
+ * which you can download and experiment with.
+ *
+ * One might say that examples.module is an example of documentation. However,
+ * note that the example submodules define many doxygen groups, which may or
+ * may not be a good strategy for other modules.
+ */
+
+/**
+ * @defgroup examples Examples
+ * @{
+ * Well-documented API examples for a broad range of Drupal 7 core functionality.
+ *
+ * Developers can learn how to use a particular API quickly by experimenting
+ * with the examples, and adapt them for their own use.
+ *
+ * Download the Examples for Developers Project (and participate with
+ * submissions, bug reports, patches, and documentation) at
+ * http://drupal.org/project/examples
+ */
+
+/**
+ * Implements hook_help().
+ */
+function examples_help($path, $arg) {
+  // re: http://drupal.org/node/767204
+  // 5. We need a master group (Examples) that will be in a main
+  // examples.module.
+  // The examples.module should be mostly doxy comments that point to the other
+  // examples.  It will also have a hook_help() explaining its purpose and how
+  // to access the other examples.
+}
+
+/**
+ * @} End of 'defgroup examples'.
+ */
diff --git a/field_example/field_example.info b/field_example/field_example.info
index d013df2..5692240 100644
--- a/field_example/field_example.info
+++ b/field_example/field_example.info
@@ -1,5 +1,5 @@
 name = Field Example
-description = A trivial implementation of a field to show the Field API
+description = An implementation of a field to show the Field API
 package = Example modules
 core = 7.x
 files[] = field_example.test
diff --git a/field_example/field_example.install b/field_example/field_example.install
index 7a1e18c..428a98e 100644
--- a/field_example/field_example.install
+++ b/field_example/field_example.install
@@ -8,14 +8,19 @@
 /**
  * Implements hook_field_schema().
  *
- * This defines the actual database schema of the field, using the format
- * used by the Schema API.
+ * Defines the database schema of the field, using the format used by the
+ * Schema API.
  *
- * The actual data we store here is just one 7-character element, even
+ * The data we will store here is just one 7-character element, even
  * though the widget presents the three portions separately.
  *
+ * All implementations of hook_field_schema() must be in the module's
+ * .install file.
+ *
+ * @see http://drupal.org/node/146939
+ * @see schemaapi
  * @see hook_field_schema()
- * @link schemaapi Schema API @endlink
+ * @ingroup field_example
  */
 function field_example_field_schema($field) {
   $columns = array(
diff --git a/field_example/field_example.js b/field_example/field_example.js
index 3a4ce62..3ea7a26 100644
--- a/field_example/field_example.js
+++ b/field_example/field_example.js
@@ -4,7 +4,7 @@
  */
 
 /**
- * Provide a farbtastic colorpicker for the fancier widget.
+ * Provides a farbtastic colorpicker for the fancier widget.
  */
 (function ($) {
   Drupal.behaviors.field_example_colorpicker = {
diff --git a/field_example/field_example.module b/field_example/field_example.module
index 6451d0e..46f0355 100644
--- a/field_example/field_example.module
+++ b/field_example/field_example.module
@@ -2,29 +2,49 @@
 
 /**
  * @file
- * An example field using the Field API.
+ * An example field using the Field Types API.
+ */
+
+/**
+ * @defgroup field_example Example: Field Types API
+ * @ingroup examples
+ * @{
+ * Examples using Field Types API.
  *
  * This is updated from Barry Jaspan's presentation at Drupalcon Paris,
  * @link http://acquia.com/community/resources/acquia-tv/intro-field-api-module-developers Video Presentation @endlink
  *
  * Providing a field requires:
- * - Defining a field
+ * - Defining a field:
  *   - hook_field_info()
  *   - hook_field_schema()
  *   - hook_field_validate()
  *   - hook_field_is_empty()
  *
  * - Defining a formatter for the field (the portion that outputs the field for
- *   display)
+ *   display):
  *   - hook_field_formatter_info()
  *   - hook_field_formatter_view()
  *
- * - Defining a widget for the edit form
+ * - Defining a widget for the edit form:
  *   - hook_field_widget_info()
  *   - hook_field_widget_form()
  *
- * *
- * See @link field_types Field Types API @endlink
+ * Our module defines the field in field_example_field_info(),
+ * field_example_field_validate() and field_example_field_is_empty().
+ * field_example_field_schema() is implemented in field_example.install.
+ *
+ * Our module sets up a formatter in field_example_field_formatter_info() and
+ * field_example_field_formatter_view(). These are the API hooks that present
+ * formatted and themed output to the user.
+
+ * And finally, our module defines the widet in
+ * field_example_field_widget_info() and field_example_field_widget_form().
+ * The widget is the form element used to receive input from the user
+ * when the field is being populated.
+ *
+ * @see field_types
+ * @see field
  */
 
 /***************************************************************
@@ -38,6 +58,7 @@
  */
 function field_example_field_info() {
   return array(
+    // We name our field as the associative name of the array.
     'field_example_rgb' => array(
       'label' => t('Example Color RGB'),
       'description' => t('Demonstrates a field composed of an RGB color.'),
@@ -50,8 +71,14 @@ function field_example_field_info() {
 /**
  * Implements hook_field_validate().
  *
- * Verifies that the RGB field as combined is valid
- * (6 hex digits with a # at the beginning).
+ * This hook gives us a chance to validate content that's in our 
+ * field. We're really only interested in the $items parameter, since
+ * it holds arrays representing content in the field we've defined.
+ * We want to verify that the items only contain RGB hex values like
+ * this: #RRGGBB. If the item validates, we do nothing. If it doesn't
+ * validate, we add our own error notification to the $errors parameter.
+ *
+ * @see field_example_field_widget_error()
  */
 function field_example_field_validate($entity_type, $entity, $field, $instance, $langcode, $items, &$errors) {
   foreach ($items as $delta => $item) {
@@ -69,20 +96,23 @@ function field_example_field_validate($entity_type, $entity, $field, $instance,
 
 /**
  * Implements hook_field_is_empty().
+ *
+ * hook_field_is_emtpy() is where Drupal asks us if this field is empty.
+ * Return TRUE if it does not contain data, FALSE if it does. This lets
+ * the form API flag an error when required fields are empty.
  */
 function field_example_field_is_empty($item, $field) {
   return empty($item['rgb']);
 }
 
-/***********************************************************************
- *  Field Type API: Formatter
- *
- *  These are the api hooks that present formatted (themed) output to the
- *  user.
- **********************************************************************/
-
 /**
  * Implements hook_field_formatter_info().
+ *
+ * We need to tell Drupal that we have two different types of formatters
+ * for this field. One will change the text color, and the other will
+ * change the background color.
+ *
+ * @see field_example_field_formatter_view()
  */
 function field_example_field_formatter_info() {
   return array(
@@ -107,6 +137,8 @@ function field_example_field_formatter_info() {
  *   was entered and uses an inline style to set the text color to that value.
  * - field_example_color_background does the same but also changes the
  *   background color of div.region-content.
+ *
+ * @see field_example_field_formatter_info()
  */
 function field_example_field_formatter_view($entity_type, $entity, $field, $instance, $langcode, $items, $display) {
   $element = array();
@@ -132,14 +164,6 @@ function field_example_field_formatter_view($entity_type, $entity, $field, $inst
   return $element;
 }
 
-
-/**************************************************************************
- * Field Type API: Widget
- *
- * The widget is the form element used to receive input from the user
- * when the field is being populated.
- **************************************************************************/
-
 /**
  * Implements hook_field_widget_info().
  *
@@ -148,6 +172,11 @@ function field_example_field_formatter_view($entity_type, $entity, $field, $inst
  * - A 3-textfield widget that gathers the red, green, and blue values
  *   separately.
  * - A farbtastic colorpicker widget that chooses the value graphically.
+ *
+ * These widget types will eventually show up in hook_field_widget_form,
+ * where we will have to flesh them out.
+ *
+ * @see field_example_field_widget_form()
  */
 function field_example_field_widget_info() {
   return array(
@@ -169,7 +198,11 @@ function field_example_field_widget_info() {
 /**
  * Implements hook_field_widget_form().
  *
- * Three different forms are provided, for the three widget types.
+ * hook_widget_form() is where Drupal tells us to create form elements for
+ * our field's widget.
+ *
+ * We provide one of three different forms, depending on the widget type of
+ * the Form API item provided.
  *
  * The 'field_example_colorpicker' and 'field_example_text' are essentially
  * the same, but field_example_colorpicker adds a javascript colorpicker
@@ -288,6 +321,13 @@ function field_example_3text_validate($element, &$form_state) {
 
 /**
  * Implements hook_field_widget_error().
+ *
+ * hook_field_widget_error() lets us figure out what to do with errors
+ * we might have generated in hook_field_validate(). Generally, we'll just
+ * call form_error().
+ *
+ * @see field_example_field_validate()
+ * @see form_error()
  */
 function field_example_field_widget_error($element, $error, $form, &$form_state) {
   switch ($error['error']) {
@@ -318,3 +358,6 @@ function field_example_menu() {
 function _field_example_page() {
   return t("The Field Example provides a field composed of an HTML RGB value, like #ff00ff. To use it, add the field to a content type.");
 }
+/**
+ * @} End of "defgroup field_example".
+ */
diff --git a/field_example/field_example.test b/field_example/field_example.test
index 76ad9d4..2f87c61 100644
--- a/field_example/field_example.test
+++ b/field_example/field_example.test
@@ -32,7 +32,7 @@ class FieldExampleTest extends DrupalWebTestCase {
    */
   function testExampleFieldBasic() {
     $content_type_friendly = $this->randomName(20);
-    $content_type_machine = strtolower($this->randomName(10));
+    $content_type_machine = drupal_strtolower($this->randomName(10));
     $title = $this->randomName(20);
 
     // Create and login user.
@@ -45,7 +45,7 @@ class FieldExampleTest extends DrupalWebTestCase {
     $this->clickLink(t('Add content type'));
 
     $single_field_name_friendly = $this->randomName(20);
-    $single_field_name_machine = strtolower($this->randomName(10));
+    $single_field_name_machine = drupal_strtolower($this->randomName(10));
 
     $edit = array(
       'name' => $content_type_friendly,
@@ -74,7 +74,7 @@ class FieldExampleTest extends DrupalWebTestCase {
     // Now we're back on the field-add page.
     // Now add a multivalued field.
     $multivalue_field_name_friendly = $this->randomName(20);
-    $multivalue_field_name_machine = strtolower($this->randomName(10));
+    $multivalue_field_name_machine = drupal_strtolower($this->randomName(10));
     $edit = array(
       'fields[_add_new_field][label]' => $multivalue_field_name_friendly,
       'fields[_add_new_field][field_name]' => $multivalue_field_name_machine,
diff --git a/file_example/file_example.module b/file_example/file_example.module
index d704722..c5cb3ec 100644
--- a/file_example/file_example.module
+++ b/file_example/file_example.module
@@ -6,6 +6,11 @@
  */
 
 /**
+ * @defgroup file_example Example: Files
+ * @ingroup examples
+ * @{
+ * Examples demonstrating the Drupal File API (and Stream Wrappers).
+ *
  * The File Example module is a part of the Examples for Developers Project
  * and provides various Drupal File API Examples. You can download and
  * experiment with this code at the
@@ -14,8 +19,6 @@
  * See @link http://drupal.org/node/555118 Drupal File API @endlink for handbook
  * documentation on the File API and
  * @link file File summary on api.drupal.org @endlink for the function summary.
- *
- * @defgroup file_example Examples: File Examples
  */
 
 /**
@@ -63,7 +66,6 @@ function file_example_permission() {
  *
  * A simple form that allows creation of a file, managed or unmanaged. It
  * also allows reading/deleting a file and creation of a directory.
- * @ingroup file_example
  */
 function file_example_readwrite($form, &$form_state) {
   if (empty($_SESSION['file_example_default_file'])) {
@@ -191,7 +193,6 @@ function file_example_readwrite($form, &$form_state) {
  * - file_create_url(), which converts a URI in the form public://junk.txt or
  *   private://something/test.txt into a URL like
  *   http://example.com/sites/default/files/junk.txt.
- * @ingroup file_example
  */
 function file_example_managed_write_submit($form, &$form_state) {
   $data = $form_state['values']['write_contents'];
@@ -220,7 +221,6 @@ function file_example_managed_write_submit($form, &$form_state) {
  * - file_create_url(), which converts a URI in the form public://junk.txt or
  *   private://something/test.txt into a URL like
  *   http://example.com/sites/default/files/junk.txt.
- * @ingroup file_example
  */
 
 function file_example_unmanaged_write_submit($form, &$form_state) {
@@ -251,7 +251,6 @@ function file_example_unmanaged_write_submit($form, &$form_state) {
  *   private://something/test.txt into a URL like
  *   http://example.com/sites/default/files/junk.txt.
  * - drupal_tempnam() generates a temporary filename for use.
- * @ingroup file_example
  */
 
 function file_example_unmanaged_php_submit($form, &$form_state) {
@@ -305,7 +304,6 @@ function file_example_unmanaged_php_submit($form, &$form_state) {
  * file_get_contents("public://somefile.txt") just works. Although it's
  * not necessary, we use file_unmanaged_save_data() to save this file locally
  * and then find a local URL for it by using file_create_url().
- * @ingroup file_example
  */
 function file_example_read_submit($form, &$form_state) {
   $uri = $form_state['values']['fileops_file'];
@@ -390,7 +388,6 @@ function file_example_file_check_exists_submit($form, &$form_state) {
  * Submit handler for directory creation.
  * Here we create a directory and set proper permissions on it using
  * file_prepare_directory().
- * @ingroup file_example
  */
 function file_example_create_directory_submit($form, &$form_state) {
   $directory = $form_state['values']['directory_name'];
@@ -416,7 +413,6 @@ function file_example_create_directory_submit($form, &$form_state) {
  *
  * @see file_unmanaged_delete_recursive()
  *
- * @ingroup file_example
  */
 function file_example_delete_directory_submit($form, &$form_state) {
   $directory = $form_state['values']['directory_name'];
@@ -434,8 +430,9 @@ function file_example_delete_directory_submit($form, &$form_state) {
 /**
  * Submit handler to test directory existence.
  * This actually just checks to see if the directory is writable
- * @param unknown_type $form
- * @param unknown_type $form_state
+ *
+ * @param $form
+ * @param $form_state
  */
 function file_example_check_directory_submit($form, &$form_state) {
   $directory = $form_state['values']['directory_name'];
@@ -487,8 +484,6 @@ function file_example_get_managed_file($uri) {
  * is readable and writable as a location in the $_SESSION variable.
  *
  * @see FileExampleSessionStreamWrapper
- *
- * defgroup streamwrapper_example Stream Wrapper Example
  */
 function file_example_stream_wrappers() {
   $wrappers = array(
@@ -518,4 +513,6 @@ function file_example_session_contents() {
   $content = file_get_contents('session://' . $session_path);
   return t('Contents of @path:', array('@path' => check_plain($session_path))) . ' ' . print_r($content, TRUE);
 }
-
+/**
+ * @} End of "defgroup file_example".
+ */
diff --git a/file_example/file_example_session_streams.inc b/file_example/file_example_session_streams.inc
index 1d29034..309fc59 100644
--- a/file_example/file_example_session_streams.inc
+++ b/file_example/file_example_session_streams.inc
@@ -2,13 +2,15 @@
 
 /**
  * @file
- * Implements DrupalStreamWrapperInterface to provide a demonstration session://
- * streamwrapper. This example is nearly fully functional, but has no known
+ * Provides a demonstration session:// streamwrapper.
+ *
+ * This example is nearly fully functional, but has no known
  * practical use. It's an example and demonstration only.
  */
 
 /**
  * Example stream wrapper class to handle session:// streams.
+ *
  * This is just an example, as it could have horrible results if much
  * information were placed in the $_SESSION variable. However, it does
  * demonstrate both the read and write implementation of a stream wrapper.
@@ -33,6 +35,8 @@
  * Note that because this implementation uses simple PHP arrays ($_SESSION)
  * it is limited to string values, so binary files will not work correctly.
  * Only text files can be used.
+ *
+ * @ingroup file_example
  */
 class FileExampleSessionStreamWrapper implements DrupalStreamWrapperInterface {
   /**
@@ -54,6 +58,7 @@ class FileExampleSessionStreamWrapper implements DrupalStreamWrapperInterface {
 
   /**
    * The content of the stream.
+   *
    * Since this trivial example just uses the $_SESSION variable, this is
    * simply a reference to the contents of the related part of
    * $_SESSION['file_example'].
@@ -94,9 +99,10 @@ class FileExampleSessionStreamWrapper implements DrupalStreamWrapperInterface {
   }
 
   /**
-   *  Implements getTarget().
-   *  The "target" is the portion of the URI to the right of the scheme.
-   *  So in session://example/test.txt, the target is 'example/test.txt'.
+   * Implements getTarget().
+   *
+   * The "target" is the portion of the URI to the right of the scheme.
+   * So in session://example/test.txt, the target is 'example/test.txt'.
    */
   function getTarget($uri = NULL) {
     if (!isset($uri)) {
@@ -133,7 +139,7 @@ class FileExampleSessionStreamWrapper implements DrupalStreamWrapperInterface {
     //   - image.jpeg, and
     //   - awesome.image.jpeg
     while ($additional_part = array_pop($file_parts)) {
-      $extension = strtolower($additional_part . ($extension ? '.' . $extension : ''));
+      $extension = drupal_strtolower($additional_part . ($extension ? '.' . $extension : ''));
       if (isset($mapping['extensions'][$extension])) {
         return $mapping['mimetypes'][$mapping['extensions'][$extension]];
       }
@@ -144,6 +150,7 @@ class FileExampleSessionStreamWrapper implements DrupalStreamWrapperInterface {
 
   /**
    * Implements getDirectoryPath().
+   *
    * In this case there is no directory string, so return an empty string.
    */
   public function getDirectoryPath() {
@@ -152,6 +159,7 @@ class FileExampleSessionStreamWrapper implements DrupalStreamWrapperInterface {
 
   /**
    * Overrides getExternalUrl().
+   *
    * We have set up a helper function and menu entry to provide access to this
    * key via HTTP; normally it would be accessible some other way.
    */
@@ -230,6 +238,7 @@ class FileExampleSessionStreamWrapper implements DrupalStreamWrapperInterface {
 
   /**
    * Return a reference to the correct $_SESSION key.
+   *
    * @param $uri
    *   The uri: session://something
    * @param $create
@@ -244,7 +253,7 @@ class FileExampleSessionStreamWrapper implements DrupalStreamWrapperInterface {
     $fail = FALSE;
     $var = &$_SESSION['file_example'];
     // Handle case of just session://.
-    if (strlen($path) == 0) {
+    if (drupal_strlen($path) == 0) {
       return $var;
     }
     foreach ($path_components as $component) {
@@ -257,8 +266,10 @@ class FileExampleSessionStreamWrapper implements DrupalStreamWrapperInterface {
     }
     return $var;
   }
+
   /**
    * Support for flock().
+   *
    * The $_SESSION variable has no locking capability, so return TRUE.
    *
    * @param $operation
@@ -291,10 +302,10 @@ class FileExampleSessionStreamWrapper implements DrupalStreamWrapperInterface {
    */
   public function stream_read($count) {
     if (is_string($this->session_content)) {
-      $remaining_chars = strlen($this->session_content) - $this->stream_pointer;
+      $remaining_chars = drupal_strlen($this->session_content) - $this->stream_pointer;
       $number_to_read = min($count, $remaining_chars);
       if ($remaining_chars > 0) {
-        $buffer = substr($this->session_content, $this->stream_pointer, $number_to_read);
+        $buffer = drupal_substr($this->session_content, $this->stream_pointer, $number_to_read);
         $this->stream_pointer += $number_to_read;
         return $buffer;
       }
@@ -318,8 +329,8 @@ class FileExampleSessionStreamWrapper implements DrupalStreamWrapperInterface {
     // session variable.
     $data = check_plain($data);
     $this->session_content = substr_replace($this->session_content, $data, $this->stream_pointer);
-    $this->stream_pointer += strlen($data);
-    return strlen($data);
+    $this->stream_pointer += drupal_strlen($data);
+    return drupal_strlen($data);
   }
 
   /**
@@ -348,7 +359,7 @@ class FileExampleSessionStreamWrapper implements DrupalStreamWrapperInterface {
    * @see http://php.net/manual/en/streamwrapper.stream-seek.php
    */
   public function stream_seek($offset, $whence) {
-    if (strlen($this->session_content) >= $offset) {
+    if (drupal_strlen($this->session_content) >= $offset) {
       $this->stream_pointer = $offset;
       return TRUE;
     }
@@ -543,6 +554,7 @@ class FileExampleSessionStreamWrapper implements DrupalStreamWrapperInterface {
 
   /**
    * Support for stat().
+   *
    * This important function goes back to the Unix way of doing things.
    * In this example almost the entire stat array is irrelevant, but the
    * mode is very important. It tells PHP whether we have a file or a
diff --git a/filter_example/filter_example.module b/filter_example/filter_example.module
index bbf0296..97c5a12 100755
--- a/filter_example/filter_example.module
+++ b/filter_example/filter_example.module
@@ -2,13 +2,40 @@
 
 /**
  * @file
+ * Module file for filter_example.
+ */
+
+/**
+ * @defgroup filter_example Example: Filter
+ * @ingroup examples
+ * @{
+ * Demonstrates the creation of filters.
+ 
  * This is an example outlining how a module can be used to define a filter
  * to be run on user-submitted content before it is output to the browser.
  *
  * To show all the capabilities of the filter system, we will define two filters
- * in this module. One will substitute the string "foo" with an administratively-
- * defined replacement string. The other will find a custom XML tag, <time />, and
- * replace it by the current time.
+ * in this module. One will substitute the string "foo" with an
+ * administratively-defined replacement string. The other will find a custom
+ * XML tag, <time />, and replace it by the current time.
+ *
+ * Foo filter
+ *
+ * Drupal has several content formats (they are not filters), and in our example
+ * the foo replacement can be configured for each one of them, allowing an html
+ * or php replacement, so the module includes a settings callback, with options
+ * to configure that replacements. Also, a Tips callback will help showing the
+ * current replacement for the content type being edited.
+ *
+ * Time filter.
+ *
+ * This filter is a little trickier to implement than the previous one.
+ * Since the input involves special HTML characters (< and >) we have to
+ * run the filter before HTML is escaped/stripped by other filters. But
+ * we want to use HTML in our result as well, and so if we run this filter
+ * first our replacement string could be escaped or stripped. The solution
+ * is to use the "prepare" operation to escape the special characters, and
+ * to later replace our escaped version in the "process" step.
  */
 
 /**
@@ -52,16 +79,6 @@ function filter_example_filter_info() {
   return $filters;
 }
 
-/*
- * Foo filter
- *
- * Drupal has several content formats (they are not filters), and in our example
- * the foo replacement can be configured for each one of them, allowing an html
- * or php replacement, so the module includes a settings callback, with options
- * to configure that replacements. Also, a Tips callback will help showing the
- * current replacement for the content type being edited.
- */
-
 /**
  * Simply returns a little bit of information about the example.
  */
@@ -83,8 +100,8 @@ function _filter_example_information() {
  * when "foo" is encountered, we need to provide an interface for this kind of
  * customization. The object format is also an argument of the callback.
  *
- * The settings defined in this form are stored in database by the filter module,
- * and they will be available in the $filter argument
+ * The settings defined in this form are stored in database by the filter
+ * module, and they will be available in the $filter argument.
  */
 function _filter_example_filter_foo_settings($form, $form_state, $filter, $format, $defaults) {
   $settings['filter_example_foo'] = array(
@@ -97,7 +114,7 @@ function _filter_example_filter_foo_settings($form, $form_state, $filter, $forma
 }
 
 /**
- * Foo filter process callback
+ * Foo filter process callback.
  *
  * The actual filtering is performed here. The supplied text should be returned,
  * once any necessary substitutions have taken place. The example just replaces
@@ -112,10 +129,10 @@ function _filter_example_filter_foo_process($text, $filter, $format) {
 /**
  * Filter tips callback for foo filter.
  *
- * The tips callback allows filters to provide help text to users during the content
- * editing process. Short tips are provided on the content editing screen, while
- * long tips are provided on a separate linked page. Short tips are optional,
- * but long tips are highly recommended.
+ * The tips callback allows filters to provide help text to users during the
+ * content editing process. Short tips are provided on the content editing
+ * screen, while long tips are provided on a separate linked page. Short tips
+ * are optional, but long tips are highly recommended.
  */
 function _filter_example_filter_foo_tips($filter, $format, $long = FALSE) {
   $replacement = isset($filter->settings['filter_example_foo']) ? $filter->settings['filter_example_foo'] : 'bar';
@@ -128,20 +145,8 @@ function _filter_example_filter_foo_tips($filter, $format, $long = FALSE) {
   }
 }
 
-/*
- * Time filter.
- *
- * This filter is a little trickier to implement than the previous one.
- * Since the input involves special HTML characters (< and >) we have to
- * run the filter before HTML is escaped/stripped by other filters. But
- * we want to use HTML in our result as well, and so if we run this filter
- * first our replacement string could be escaped or stripped. The solution
- * is to use the "prepare" operation to escape the special characters, and
- * to later replace our escaped version in the "process" step.
- */
-
-/*
- * Time filter prepare callback
+/**
+ * Time filter prepare callback.
  *
  * We'll use [filter-example-time] as a replacement for the time tag.
  * Note that in a more complicated filter a closing tag may also be
@@ -152,8 +157,8 @@ function _filter_example_filter_time_prepare($text, $filter) {
   return preg_replace('!<time ?/>!', '[filter-example-time]', $text);
 }
 
-/*
- * Time filter process callback
+/**
+ * Time filter process callback.
  *
  * Now, in the "process" step, we'll search for our escaped time tags and
  * to the real filtering: replace the xml tag with the date.
@@ -166,11 +171,14 @@ function _filter_example_filter_time_process($text, $filter) {
 /**
  * Filter tips callback for time filter.
  *
- * The tips callback allows filters to provide help text to users during the content
- * editing process. Short tips are provided on the content editing screen, while
- * long tips are provided on a separate linked page. Short tips are optional,
- * but long tips are highly recommended.
+ * The tips callback allows filters to provide help text to users during the
+ * content editing process. Short tips are provided on the content editing
+ * screen, while long tips are provided on a separate linked page. Short tips
+ * are optional, but long tips are highly recommended.
  */
 function _filter_example_filter_time_tips($filter, $format, $long = FALSE) {
   return t('<em>&lt;time /&gt;</em> is replaced with the current time.');
 }
+/**
+ * @} End of "defgroup filter_example".
+ */
diff --git a/filter_example/filter_example.test b/filter_example/filter_example.test
index 0768601..9c5991d 100644
--- a/filter_example/filter_example.test
+++ b/filter_example/filter_example.test
@@ -6,7 +6,6 @@
  *
  * This file contains the test cases to check if module is performing as
  * expected.
- *
  */
 class FilterExampleTestCase extends DrupalWebTestCase {
   protected $web_user;
diff --git a/form_example/form_example.module b/form_example/form_example.module
index 1824f29..daa5782 100644
--- a/form_example/form_example.module
+++ b/form_example/form_example.module
@@ -6,12 +6,15 @@
  */
 
 /**
+ * @defgroup form_example Example: Form API
+ * @ingroup examples
+ * @{
+ * Examples demonstrating the Drupal Form API.
+ *
  * The Form Example module is a part of the Examples for Developers Project
  * and provides various Drupal Form API Examples. You can download and
  * experiment with this code at the
  * @link http://drupal.org/project/examples Examples for Developers project page. @endlink
- *
- * @defgroup form_example Examples: Form Examples
  */
 
 /**
@@ -200,3 +203,6 @@ function form_example_theme($existing, $type, $theme, $path) {
   require_once('form_example_elements.inc');
   return _form_example_element_theme($existing, $type, $theme, $path);
 }
+/**
+ * @} End of "defgroup form_example".
+ */
diff --git a/form_example/form_example_elements.inc b/form_example/form_example_elements.inc
index 0a153a4..8c68731 100644
--- a/form_example/form_example_elements.inc
+++ b/form_example/form_example_elements.inc
@@ -99,7 +99,6 @@ function _form_example_element_info() {
     '#theme_wrappers' => array('form_element'),
   );
 
-
   // form_example_checkbox is mostly a copy of the system-defined checkbox
   // element.
   $types['form_example_checkbox'] = array(
@@ -167,12 +166,13 @@ function _form_example_element_info() {
 
 
 /**
- * Build the current combined value of the phone number only when the form
+ * Builds the current combined value of the phone number only when the form
  * builder is not processing the input.
  *
- * @param array $element
- * @param boolena $input
- * @param array $form_state
+ * @param $element
+ * @param $input
+ * @param $form_state
+ *
  * @return array
  */
 function  form_example_phonenumber_combined_value(&$element, $input = FALSE, $form_state = NULL) {
@@ -206,7 +206,6 @@ function form_type_form_example_checkbox_value($element, $input = FALSE) {
   }
 }
 
-
 /**
  * Process callback for the discrete version of phonenumber.
  */
@@ -250,10 +249,10 @@ function form_example_phonenumber_discrete_process($element, &$form_state, $comp
 /**
  * Validation handler for the discrete version of the phone number.
  *
- * Using regular expressions, we check that:
- *  - the area code is a three digit number
- *  - the prefix is numeric 3-digit number
- *  - the extension is a numeric 4-digit number
+ * Uses regular expressions to check that:
+ *  - the area code is a three digit number.
+ *  - the prefix is numeric 3-digit number.
+ *  - the extension is a numeric 4-digit number.
  *
  * Any problems are shown on the form element using form_error().
  */
@@ -276,8 +275,6 @@ function form_example_phonenumber_discrete_validate($element, &$form_state) {
   return $element;
 }
 
-
-
 /**
  * Process callback for the combined version of the phonenumber element.
  */
@@ -325,9 +322,9 @@ function form_example_phonenumber_combined_process($element, &$form_state, $comp
 }
 
 /**
- * Phonenumber validation function for the combined phonenumber.
+ * Phone number validation function for the combined phonenumber.
  *
- * Using regular expressions, we check that:
+ * Uses regular expressions to check that:
  *  - the area code is a three digit number
  *  - the prefix is numeric 3-digit number
  *  - the extension is a numeric 4-digit number
@@ -375,7 +372,7 @@ function _form_example_element_theme() {
 }
 
 /**
- * Theme a custom checkbox.
+ * Themes a custom checkbox.
  *
  * This doesn't actually do anything, but is here to show that theming can
  * be done here.
@@ -384,8 +381,9 @@ function theme_form_example_checkbox($variables) {
   $element = $variables['element'];
   return theme('checkbox', $element);
 }
+
 /**
- * Format child form elements as inline elements.
+ * Formats child form elements as inline elements.
  */
 function theme_form_example_inline_form_element($variables) {
   $element = $variables['element'];
@@ -444,7 +442,7 @@ function theme_form_example_inline_form_element($variables) {
 }
 
 /**
- * This is a simple form to demonstrate how to use the various new FAPI elements
+ * Simple form to demonstrate how to use the various new FAPI elements
  * we've defined.
  */
 function form_example_element_demo_form($form, &$form_state) {
@@ -474,7 +472,7 @@ function form_example_element_demo_form($form, &$form_state) {
     '#title' => t('Combined phone number'),
     '#default_value' => variable_get('form_example_element_combined', '0000000000'),
     '#description' => t('form_example_element_combined one uses a "combined" element type, one with a single 10-digit value which is broken apart when needed.'),
-   );
+  );
 
   $form['submit'] = array(
     '#type' => 'submit',
diff --git a/form_example/form_example_states.inc b/form_example/form_example_states.inc
index 12ee571..943b446 100644
--- a/form_example/form_example_states.inc
+++ b/form_example/form_example_states.inc
@@ -44,8 +44,8 @@
  * true, then you add both of those conditions to the action. See the
  * 'country_writein' element below for an example.
  *
- * Note that the easiest way to select a textfield, checkbox, or select is
- * with the @link http://api.jquery.com/input-selector/ ':input' jquery shortcut @endlink,
+ * Note that the easiest way to select a textfield, checkbox, or select is with
+ * the @link http://api.jquery.com/input-selector/ ':input' jquery shortcut @endlink,
  * which selects any any of those.
  *
  * There are examples below of changing or hiding an element when a checkbox
@@ -260,7 +260,9 @@ function form_example_states_form($form, &$form_state) {
   return $form;
 }
 
-
+/**
+ * Submit handler for form_example_states_form().
+ */
 function form_example_states_form_submit($form, &$form_state) {
   drupal_set_message(t('Submitting values: @values', array('@values' => var_export($form_state['values'], TRUE))));
 }
diff --git a/form_example/form_example_tutorial.inc b/form_example/form_example_tutorial.inc
index 1d31361..07e8362 100644
--- a/form_example/form_example_tutorial.inc
+++ b/form_example/form_example_tutorial.inc
@@ -26,12 +26,14 @@
  * @see form_example_tutorial_9()
  * @see form_example_tutorial_10()
  *
+ * @ingroup form_example
  */
 function form_example_tutorial() {
   return t('This is a set of nine form tutorials tied to the <a href="http://drupal.org/node/262422">Drupal handbook</a>.');
 }
 
 //////////////// Tutorial Example 1 //////////////////////
+
 /**
  * This first form function is from the @link http://drupal.org/node/717722 Form Tutorial handbook page @endlink
  *
@@ -77,7 +79,8 @@ function form_example_tutorial_2($form, &$form_state) {
     '#title' => t('Name'),
   );
 
-  // Adds a simple submit button that refreshes the form and clears its contents -- this is the default behavior for forms.
+  // Adds a simple submit button that refreshes the form and clears its
+  // contents. This is the default behavior for forms.
   $form['submit'] = array(
     '#type' => 'submit',
     '#value' => 'Submit',
@@ -225,7 +228,6 @@ function form_example_tutorial_5($form, &$form_state) {
  *
  * From http://drupal.org/node/717736
  * @see form_example_tutorial_6_validate()
- *
  */
 function form_example_tutorial_6($form, &$form_state) {
   $form['description'] = array(
@@ -284,7 +286,6 @@ function form_example_tutorial_6($form, &$form_state) {
  * in $form['#validate'].
  *
  * @see form_example_tutorial_6()
- *
  */
 function form_example_tutorial_6_validate($form, &$form_state) {
   $year_of_birth = $form_state['values']['year_of_birth'];
@@ -294,7 +295,6 @@ function form_example_tutorial_6_validate($form, &$form_state) {
 }
 
 
-
 //////////////// Tutorial Example 7 //////////////////////
 
 /**
@@ -306,7 +306,6 @@ function form_example_tutorial_6_validate($form, &$form_state) {
  * @see form_example_tutorial_7_validate()
  * @see form_example_tutorial_7_submit()
  * @ingroup form_example
- *
  */
 function form_example_tutorial_7($form, &$form_state) {
   $form['description'] = array(
@@ -348,7 +347,6 @@ function form_example_tutorial_7($form, &$form_state) {
 
 /**
  * Validation function for form_example_tutorial_7().
- *
  */
 function form_example_tutorial_7_validate($form, &$form_state) {
   $year_of_birth = $form_state['values']['year_of_birth'];
@@ -470,7 +468,6 @@ function form_example_tutorial_8_page_two($form, &$form_state) {
 
 /**
  * Validate handler for the next button on first page.
- *
  */
 function form_example_tutorial_8_next_validate($form, &$form_state) {
   $year_of_birth = $form_state['values']['year_of_birth'];
@@ -484,7 +481,6 @@ function form_example_tutorial_8_next_validate($form, &$form_state) {
  *
  * Capture the values from page one and store them away so they can be used
  * at final submit time.
- *
  */
 function form_example_tutorial_8_next_submit($form, &$form_state) {
 
@@ -553,7 +549,6 @@ function form_example_tutorial_8_page_two_submit($form, &$form_state) {
  * @see form_example_tutorial_9_submit()
  * @see form_example_tutorial_9_validate()
  * @ingroup form_example
- *
  */
 function form_example_tutorial_9($form, &$form_state) {
 
@@ -694,7 +689,6 @@ function form_example_tutorial_9_submit($form, &$form_state) {
  * @see form_example_tutorial_10_submit()
  * @see form_example_tutorial_10_validate()
  * @ingroup form_example
- *
  */
 function form_example_tutorial_10($form_state) {
   // enctype="multipart/form-data" required by browsers to handle files.
diff --git a/form_example/form_example_wizard.inc b/form_example/form_example_wizard.inc
index 38fa77b..b73029f 100644
--- a/form_example/form_example_wizard.inc
+++ b/form_example/form_example_wizard.inc
@@ -2,7 +2,11 @@
 
 /**
  * @file
- * Estensible wizard form example.
+ * Extensible wizard form example.
+ */
+
+/**
+ * Extensible wizard form example.
  *
  * This is an example of a multistep form using a wizard style. It will include
  * the 'Previous' and 'Next' buttons when required, and a 'Finish' button at the
@@ -25,14 +29,17 @@
  * - The most important customization sttep is to change the submit handler and
  *   do whatever you want with the collected information. In this case, the
  *   example just shows the collected values in the various steps.
+ * @ingroup form_example
  */
 
 /**
- * Return the list of steps and their associated forms. This has been separated
+ * Returns the list of steps and their associated forms. This has been separated
  * to clarify and easy the understanding of this example. You should edit this
  * function to include the steps your wizard/multistep form requires.
  *
  * @return $array
+ *
+ * @ingroup form_example
  */
 function _form_example_steps() {
   return array(
@@ -64,6 +71,8 @@ function _form_example_steps() {
  * You are not required to change the next or previous handlers, but you must
  * change the form_example_wizard_sbumit handler to perform the operations you
  * need on the collected information.
+ *
+ * @ingroup form_example
  */
 function form_example_wizard($form, &$form_state) {
 
@@ -109,10 +118,10 @@ function form_example_wizard($form, &$form_state) {
     );
   }
   else {
-    // Just in case there are no more steps, we use the default submit handler of
-    // the form wizard. Call this button Finish, Submit, or whatever you want to
-    // show. When this button is clicked, the form_example_wizard_submit handler
-    // will be called.
+    // Just in case there are no more steps, we use the default submit handler
+    // of the form wizard. Call this button Finish, Submit, or whatever you
+    // want to show. When this button is clicked, the
+    // form_example_wizard_submit handler will be called.
     $form['finish'] = array(
       '#type' => 'submit',
       '#value' => t('Finish'),
@@ -135,6 +144,8 @@ function form_example_wizard($form, &$form_state) {
  * - Forces form rebuild.
  *
  * You are not required to change this function.
+ *
+ * @ingroup form_example
  */
 function form_example_wizard_previous_submit($form, &$form_state) {
   $current_step = &$form_state['step'];
@@ -156,8 +167,10 @@ function form_example_wizard_previous_submit($form, &$form_state) {
  *
  * You are not required to change this function.
  *
- * @param unknown_type $form
- * @param unknown_type $form_state
+ * @param $form
+ * @param $form_state
+ *
+ * @ingroup form_example
  */
 function form_example_wizard_next_submit($form, &$form_state) {
   $current_step = &$form_state['step'];
@@ -176,19 +189,24 @@ function form_example_wizard_next_submit($form, &$form_state) {
   }
 }
 
-// The previous code was a 'skeleton' of a multistep wizard form. You are not
-// required to change a line on the previous code (apart from defining your own
-// steps in the _form_example_steps() function.
-//
-// All the code included from here is the content of the wizard, the steps of
-// the form.
-
-// First, let's show the defined steps for the wizard example.
+/**
+ * The previous code was a 'skeleton' of a multistep wizard form. You are not
+ * required to change a line on the previous code (apart from defining your own
+ * steps in the _form_example_steps() function.
+ *
+ * All the code included from here is the content of the wizard, the steps of
+ * the form.
+ *
+ * First, let's show the defined steps for the wizard example.
+ * @ingroup form_example
+ */
 
 /**
  * Returns form elements for the 'personal info' page of the wizard. This is the
  * first step of the wizard, asking for two textfields: first name and last
  * name.
+ *
+ * @ingroup form_example
  */
 function form_example_wizard_personal_info($form, &$form_state) {
   $form = array();
@@ -209,6 +227,8 @@ function form_example_wizard_personal_info($form, &$form_state) {
  * Returns form elements for the 'location info' page of the wizard. This is the
  * second step of the wizard. This step asks for a textfield value: a City. This
  * step also includes a validation declared later.
+ *
+ * @ingroup form_example
  */
 function form_example_wizard_location_info($form, &$form_state) {
   $form = array();
@@ -224,9 +244,12 @@ function form_example_wizard_location_info($form, &$form_state) {
 }
 
 /**
- * Custom validation form for the 'location info' page of the wizard. This is the
- * validation function for the second step of the wizard. The city cannot be empty
- * or be "San Francisco".
+ * Custom validation form for the 'location info' page of the wizard.
+ *
+ * This is the validation function for the second step of the wizard.
+ * The city cannot be empty or be "San Francisco".
+ *
+ * @ingroup form_example
  */
 function form_example_wizard_location_info_validate($form, &$form_state) {
   if ($form_state['values']['city'] == 'San Francisco') {
@@ -237,6 +260,8 @@ function form_example_wizard_location_info_validate($form, &$form_state) {
 /**
  * Returns form elements for the 'other info' page of the wizard. This is the
  * thid and last step of the example wizard.
+ *
+ * @ingroup form_example
  */
 function form_example_wizard_other_info($form, &$form_state) {
   $form = array();
@@ -258,8 +283,10 @@ function form_example_wizard_other_info($form, &$form_state) {
  * This demonstration handler just do a drupal_set_message() with the information
  * collected on each different step of the wizard.
  *
- * @param unknown_type $form
- * @param unknown_type $form_state
+ * @param $form
+ * @param $form_state
+ *
+ * @ingroup form_example
  */
 function form_example_wizard_submit($form, &$form_state) {
   $current_step = &$form_state['step'];
diff --git a/image_example/image_example.install b/image_example/image_example.install
index 395720a..89e5f6f 100644
--- a/image_example/image_example.install
+++ b/image_example/image_example.install
@@ -6,7 +6,9 @@
  */
 
 /**
- * Implements hook_install(),
+ * Implements hook_install().
+ *
+ * @ingroup image_example
  */
 function image_example_install() {
   // Set a variable containing the name of the style to use when the module
@@ -16,6 +18,8 @@ function image_example_install() {
 
 /**
  * Implements hook_uninstall().
+ *
+ * @ingroup image_example
  */
 function image_example_uninstall() {
   variable_del('image_example_style_name');
@@ -24,6 +28,8 @@ function image_example_uninstall() {
 
 /**
  * Implements hook_enable().
+ *
+ * @ingroup image_example
  */
 function image_example_enable() {
   // There is currently no way to manually flush an image style which causes
@@ -38,7 +44,9 @@ function image_example_enable() {
 }
 
 /**
- * Implemements hook_disable().
+ * Implements hook_disable().
+ *
+ * @ingroup image_example
  */
 function image_example_disable() {
   // Solves the same problem as image_example_enable().
diff --git a/image_example/image_example.module b/image_example/image_example.module
index 89118b3..c31b7cd 100644
--- a/image_example/image_example.module
+++ b/image_example/image_example.module
@@ -2,7 +2,14 @@
 
 /**
  * @file
- * Image example module demonstrates basic use of image API.
+ * Module file for image_example
+ */
+
+/**
+ * @defgroup image_example Example: Image
+ * @ingroup examples
+ * @{
+ * Demonstrates the basic use of image API.
  *
  * This module demonstrates the use of Drupal 7's new image styles and effects
  * including the following topics.
@@ -363,10 +370,11 @@ function image_example_theme() {
  * @param $variables
  *   An associative array containing:
  *   - data: The current configuration for this colorize effect.
- *
- * @ingroup themeable
  */
 function theme_image_example_colorize_summary($variables) {
   $data = $variables['data'];
   return t('as color #@color.', array('@color' => $data['color']));
 }
+/**
+ * @} End of "defgroup image_example".
+ */
diff --git a/image_example/image_example.pages.inc b/image_example/image_example.pages.inc
index 6f78750..e137f27 100644
--- a/image_example/image_example.pages.inc
+++ b/image_example/image_example.pages.inc
@@ -15,6 +15,8 @@
  * this module are available via Drupal's image handling system.
  *
  * @see theme_image_style()
+ *
+ * @ingroup image_example
  */
 function image_example_style_form($form, &$form_state) {
   // If there is already an uploaded image display the image here.
@@ -59,7 +61,9 @@ function image_example_style_form($form, &$form_state) {
 }
 
 /**
- * Verify that the user supplied an image with the form..
+ * Verifies that the user supplied an image with the form..
+ *
+ * @ingroup image_example
  */
 function image_example_style_form_validate($form, &$form_state) {
   if (!isset($form_state['values']['image_example_image_fid']) || !is_numeric($form_state['values']['image_example_image_fid'])) {
@@ -69,6 +73,8 @@ function image_example_style_form_validate($form, &$form_state) {
 
 /**
  * Form Builder; Display a form for uploading an image.
+ *
+ * @ingroup image_example
  */
 function image_example_style_form_submit($form, &$form_state) {
   // When using the #managed_file form element the file is automatically
@@ -123,6 +129,8 @@ function image_example_style_form_submit($form, &$form_state) {
 
 /**
  * Theme function displays an image rendered using the specified style.
+ *
+ * @ingroup image_example
  */
 function theme_image_example_image($variables) {
   $image = $variables['image'];
diff --git a/image_example/image_example.test b/image_example/image_example.test
index 788f635..0f7ef4b 100644
--- a/image_example/image_example.test
+++ b/image_example/image_example.test
@@ -45,7 +45,7 @@ class ImageExampleTestCase extends DrupalWebTestCase {
 
     // Create a new image style and add the effect provided by
     // image_example_effect_info().
-    $new_style = array('name' => strtolower($this->randomName()));
+    $new_style = array('name' => drupal_strtolower($this->randomName()));
     $new_style = image_style_save($new_style);
     $this->assertTrue(isset($new_style['isid']), t('Image style @style_name created.', array('@style_name' => $new_style['name'])));
 
@@ -65,12 +65,12 @@ class ImageExampleTestCase extends DrupalWebTestCase {
 
     // Set the variable 'image_example_style_name' to the name of our new style
     // then rename the style and ensure the variable name is changed.
-    
+
     // @todo Enable this block once http://drupal.org/node/713872 is fixed.
     if (defined('bug_713872_fixed')) {
       $style = image_style_load($new_style['name']);
       variable_set('image_example_style_name', $style['name']);
-      $style['name'] = strtolower($this->randomName());
+      $style['name'] = drupal_strtolower($this->randomName());
       $style = image_style_save($style);
       $variable = variable_get('image_example_style_name', '');
       $this->assertTrue(($variable == $style['name']), t('Variable image_example_style_name successfully updated when renaming image style.'));
diff --git a/js_example/accordion.tpl.php b/js_example/accordion.tpl.php
index 6258826..2f96a0e 100644
--- a/js_example/accordion.tpl.php
+++ b/js_example/accordion.tpl.php
@@ -1,54 +1,58 @@
 <?php
+/**
+ * @file
+ * Template file for js_example module.
+ */
 ?>
 <div class="demo">
 <h2><?php print $title; ?></h2>
 <div id="accordion">
-	<h3><a href="#">Section 1</a></h3>
-	<div>
-		<p>
-		Mauris mauris ante, blandit et, ultrices a, suscipit eget, quam. Integer
-		ut neque. Vivamus nisi metus, molestie vel, gravida in, condimentum sit
-		amet, nunc. Nam a nibh. Donec suscipit eros. Nam mi. Proin viverra leo ut
-		odio. Curabitur malesuada. Vestibulum a velit eu ante scelerisque vulputate.
-		</p>
-	</div>
-	<h3><a href="#">Section 2</a></h3>
-	<div>
-		<p>
-		Sed non urna. Donec et ante. Phasellus eu ligula. Vestibulum sit amet
-		purus. Vivamus hendrerit, dolor at aliquet laoreet, mauris turpis porttitor
-		velit, faucibus interdum tellus libero ac justo. Vivamus non quam. In
-		suscipit faucibus urna.
-		</p>
-	</div>
-	<h3><a href="#">Section 3</a></h3>
-	<div>
-		<p>
-		Nam enim risus, molestie et, porta ac, aliquam ac, risus. Quisque lobortis.
-		Phasellus pellentesque purus in massa. Aenean in pede. Phasellus ac libero
-		ac tellus pellentesque semper. Sed ac felis. Sed commodo, magna quis
-		lacinia ornare, quam ante aliquam nisi, eu iaculis leo purus venenatis dui.
-		</p>
-		<ul>
-			<li>List item one</li>
-			<li>List item two</li>
-			<li>List item three</li>
-		</ul>
-	</div>
-	<h3><a href="#">Section 4</a></h3>
-	<div>
-		<p>
-		Cras dictum. Pellentesque habitant morbi tristique senectus et netus
-		et malesuada fames ac turpis egestas. Vestibulum ante ipsum primis in
-		faucibus orci luctus et ultrices posuere cubilia Curae; Aenean lacinia
-		mauris vel est.
-		</p>
-		<p>
-		Suspendisse eu nisl. Nullam ut libero. Integer dignissim consequat lectus.
-		Class aptent taciti sociosqu ad litora torquent per conubia nostra, per
-		inceptos himenaeos.
-		</p>
-	</div>
+  <h3><a href="#">Section 1</a></h3>
+  <div>
+    <p>
+    Mauris mauris ante, blandit et, ultrices a, suscipit eget, quam. Integer
+    ut neque. Vivamus nisi metus, molestie vel, gravida in, condimentum sit
+    amet, nunc. Nam a nibh. Donec suscipit eros. Nam mi. Proin viverra leo ut
+    odio. Curabitur malesuada. Vestibulum a velit eu ante scelerisque vulputate.
+    </p>
+  </div>
+  <h3><a href="#">Section 2</a></h3>
+  <div>
+    <p>
+    Sed non urna. Donec et ante. Phasellus eu ligula. Vestibulum sit amet
+    purus. Vivamus hendrerit, dolor at aliquet laoreet, mauris turpis porttitor
+    velit, faucibus interdum tellus libero ac justo. Vivamus non quam. In
+    suscipit faucibus urna.
+    </p>
+  </div>
+  <h3><a href="#">Section 3</a></h3>
+  <div>
+    <p>
+    Nam enim risus, molestie et, porta ac, aliquam ac, risus. Quisque lobortis.
+    Phasellus pellentesque purus in massa. Aenean in pede. Phasellus ac libero
+    ac tellus pellentesque semper. Sed ac felis. Sed commodo, magna quis
+    lacinia ornare, quam ante aliquam nisi, eu iaculis leo purus venenatis dui.
+    </p>
+    <ul>
+      <li>List item one</li>
+      <li>List item two</li>
+      <li>List item three</li>
+    </ul>
+  </div>
+  <h3><a href="#">Section 4</a></h3>
+  <div>
+    <p>
+    Cras dictum. Pellentesque habitant morbi tristique senectus et netus
+    et malesuada fames ac turpis egestas. Vestibulum ante ipsum primis in
+    faucibus orci luctus et ultrices posuere cubilia Curae; Aenean lacinia
+    mauris vel est.
+    </p>
+    <p>
+    Suspendisse eu nisl. Nullam ut libero. Integer dignissim consequat lectus.
+    Class aptent taciti sociosqu ad litora torquent per conubia nostra, per
+    inceptos himenaeos.
+    </p>
+  </div>
 </div>
 
 </div><!-- End demo -->
diff --git a/js_example/js_example.module b/js_example/js_example.module
index 5ccef02..17744e5 100755
--- a/js_example/js_example.module
+++ b/js_example/js_example.module
@@ -2,7 +2,14 @@
 
 /**
  * @file
- * An example module showing how to use some of the new JavaScript features in Drupal 7.
+ * Examples showing how to use some of the new JavaScript features in Drupal 7.
+ */
+
+/**
+ * @defgroup js_example Example: JavaScript
+ * @ingroup examples
+ * @{
+ * Examples using Drupal 7's built-in JavaScript.
  */
 
 /**
@@ -35,9 +42,11 @@ function js_example_menu() {
   return $items;
 }
 
-
+/**
+ * js_example_weights implementation.
+ */
 function js_example_js_weights() {
-  // add some css to show which line is output by which script
+  // Add some css to show which line is output by which script
   drupal_add_css(drupal_get_path('module', 'js_example') . '/css/jsweights.css');
   // 
   $weights = array(
@@ -59,6 +68,9 @@ function js_example_js_weights() {
   return $output;
 }
 
+/**
+ * js_example_accordion implementation.
+ */
 function js_example_accordion() {
   $title = t('Click sections to expand or collapse:');
   $build['myelement'] = array(
diff --git a/menu_example/menu_example.module b/menu_example/menu_example.module
index 74aa81a..f580d5d 100644
--- a/menu_example/menu_example.module
+++ b/menu_example/menu_example.module
@@ -2,12 +2,22 @@
 
 /**
  * @file
- * Demonstrates uses of the Menu APIs in Drupal, including hook_menu(),
- * hook_menu_alter(), and hook_menu_link_alter().
+ * Module file for menu_example.
  */
 
 /**
- * Implementatation of hook_menu().
+ * @defgroup menu_example Example: Menu
+ * @ingroup examples
+ * @{
+ * Demonstrates uses of the Menu APIs in Drupal.
+ *
+ * @see hook_menu()
+ * @see hook_menu_alter()
+ * @see hook_menu_link_alter()
+ */
+
+/**
+ * Implements hook_menu().
  */
 function menu_example_menu() {
 
@@ -430,7 +440,7 @@ function menu_example_menu_link_alter(&$item, $menu) {
 }
 
 /**
- * Load an item based on its $id.
+ * Loads an item based on its $id.
  *
  * In this case we're just creating a more extensive string. In a real example
  * we would load or create some type of object.
@@ -465,3 +475,6 @@ function menu_example_arg_optional_to_arg($arg) {
   // If our argument is not provided, give a default of 99.
   return (empty($arg) || $arg == '%') ? 99 : $arg;
 }
+/**
+ * @} End of "defgroup menu_example".
+ */
diff --git a/menu_example/menu_example.test b/menu_example/menu_example.test
index 536a97d..dba2877 100644
--- a/menu_example/menu_example.test
+++ b/menu_example/menu_example.test
@@ -84,7 +84,7 @@ class MenuExampleTestCase extends DrupalWebTestCase {
     $this->assertResponse(200);
     $this->assertText('This menu entry will not show');
 
-    // Verify that the 'logout' link has been changed to 'salir', using an 
+    // Verify that the 'logout' link has been changed to 'salir', using an
     // overridden drupalLogout function.
     $this->drupalLogout();
   }
diff --git a/node_access_example/node_access_example.module b/node_access_example/node_access_example.module
index ae82648..4093eab 100755
--- a/node_access_example/node_access_example.module
+++ b/node_access_example/node_access_example.module
@@ -2,10 +2,11 @@
 
 /**
  * @file
- * This is an example illustrating how to restrict access to nodes based on
- * the node access system. It implements an additional "private" marker for
- * each node. The idea is that only the user (or specially permissioned users)
- * can access a "private" node.
+ * Illustrates how to restrict access to nodes based on the node access system.
+ *
+ * These examples implement an additional "private" marker for each node. The
+ * idea is that only the user (or specially permissioned users) can access a
+ * "private" node.
  *
  * The node access system has three layers.
  * - Overall override permissions. User 1 and any user with 'bypass node access'
@@ -62,7 +63,6 @@
  * @link http://drupal.org/node/270000 Handbook page on Node Access module @endlink
  */
 
-
 /**
  * Implements hook_menu() to provide a description.
  */
@@ -162,8 +162,8 @@ function node_access_example_permission() {
 /**
  * Implements hook_node_access().
  *
- *  Allows view and edit access to private nodes where the account requesting
- *  access has the username 'foobar'.
+ * Allows view and edit access to private nodes where the account requesting
+ * access has the username 'foobar'.
  */
 function node_access_example_node_access($node, $op, $account) {
   // If $node is a string, the node has not yet been created. We don't care
@@ -181,7 +181,7 @@ function node_access_example_node_access($node, $op, $account) {
 /**
  * Implements hook_node_grants().
  *
- * Tell the node access system what grant IDs the account belongs to for each
+ * Tells the node access system what grant IDs the account belongs to for each
  * realm.
  *
  * Here we are providing two realms:
@@ -283,7 +283,6 @@ function node_access_example_form_alter(&$form, $form_state) {
 /**
  * Implements hook_node_load().
  */
-
 function node_access_example_node_load($nodes, $types) {
   $result = db_query('SELECT nid, private FROM {node_access_example} WHERE nid IN(:nids)', array(':nids' => array_keys($nodes)));
   foreach ($result as $record) {
@@ -294,9 +293,8 @@ function node_access_example_node_load($nodes, $types) {
 /**
  * Implements hook_node_delete().
  *
- * Delete the node_access_example record when the node is deleted.
+ * Deletes the node_access_example record when the node is deleted.
  */
-
 function node_access_example_node_delete($node) {
   db_delete('node_access_example')->condition('nid', $node->nid)->execute();
 }
@@ -304,7 +302,7 @@ function node_access_example_node_delete($node) {
 /**
  * Implements hook_node_insert().
  *
- * Insert a new access record when a node is created.
+ * Inserts a new access record when a node is created.
  */
 function node_access_example_node_insert($node) {
   if (isset($node->private)) {
diff --git a/node_example/node_example.install b/node_example/node_example.install
index e6caf9b..6fd2d33 100755
--- a/node_example/node_example.install
+++ b/node_example/node_example.install
@@ -6,14 +6,19 @@
  *
  * The definition of the fields for the module is here,
  *
- * @see @link http://drupal.org/node/707832 Field API Tutorial @endlink
- * @see @link http://drupal.org/node/443536 Field API Handbook Page @endlink
- * @see @link field Field API documentation @endlink
+ * @see http://drupal.org/node/707832
+ * @see http://drupal.org/node/443536
+ * @see field
  */
 
 /**
  * Implements hook_install().
  *
+ * This hook is called when the user enables the module for the first time
+ * (or on subsequent enables after the module has been uninstalled). So it's
+ * a good place to define our new node type.
+ *
+ * We will:
  * - Add the body field.
  * - Configure the body field.
  * - Create color, quantity, and image fields.
@@ -24,16 +29,22 @@
  * @see field_update_instance()
  * @see field_create_field()
  * @see field_create_instance()
+ * @ingroup node_example
  */
 function node_example_install() {
-  // use get_t() to get the name of our localization function for translation
-  // during install, when t() is not available.
+  // During installation, the t() function is unavailable, so we use get_t()
+  // to store the name of the translation function.
   $t = get_t();
 
-  // Define the node type.
+  // We define the node type as an associative array.
   $node_example = array(
     'type' => 'node_example',
     'name' => $t('Example Node'),
+    // 'base' tells Drupal the base string for hook functions.
+    // This is often the module name; if base is set to 'mymodule', Drupal
+    // would call mymodule_insert() or similar for node hooks.
+    // In this case, we set base equal to 'node_content' so Drupal will handle
+    // our node as if we had designed it in the UI.
     'base' => 'node_content',
     'description' => $t('This is an example node type with a few fields.'),
     'body_label' => $t('Example Description')
@@ -80,10 +91,66 @@ function node_example_install() {
 }
 
 /**
+ * Implements hook_uninstall().
+ *
+ * This hook is called when the user not only has disabled the module,
+ * but also uninstalls it from the 'uninstall' tab in the module page.
+ *
+ * So it's a perfect time to remove our fields and instances and new
+ * node type from the database.
+ *
+ * @ingroup node_example
+ */
+function node_example_uninstall() {
+  // Gather all the example content that might have been created while this
+  // module was enabled.  Simple selects still use db_query().
+  // http://api.drupal.org/api/function/db_query/7
+  $sql = 'SELECT nid FROM {node} n WHERE n.type = :type';
+  $result = db_query($sql, array(':type' => 'node_example'));
+  $nids = array();
+  foreach ($result as $row) {
+    $nids[] = $row->nid;
+  }
+
+  // Delete all the nodes at once
+  // http://api.drupal.org/api/function/node_delete_multiple/7
+  node_delete_multiple($nids);
+
+  // Loop over each of the fields defined by this module and delete
+  // all instances of the field, their data, and the field itself.
+  // http://api.drupal.org/api/function/field_delete_field/7
+  foreach (array_keys(_node_example_installed_fields()) as $field) {
+    field_delete_field($field);
+  }
+
+  // Loop over any remaining field instances attached to the node_example
+  // content type (such as the body field) and delete them individually.
+  // http://api.drupal.org/api/function/field_delete_field/7
+  $instances = field_info_instances('node', 'node_example');
+  foreach ($instances as $instance_name => $instance) {
+    field_delete_instance($instance);
+  }
+
+  // Delete our content type
+  // http://api.drupal.org/api/function/node_type_delete/7
+  node_type_delete('node_example');
+
+  // Purge all field infromation
+  // http://api.drupal.org/api/function/field_purge_batch/7
+  field_purge_batch(1000);
+}
+
+/**
  * Returns a structured array defining the fields created by this content type.
  *
- * This is packaged in a function so it can be used in both
+ * This is factored into this function so it can be used in both
  * node_example_install() and node_example_uninstall().
+ *
+ * @return
+ *  An associative array specifying the fields we wish to add to our
+ *  new node type.
+ *
+ * @ingroup node_example
  */
 function _node_example_installed_fields() {
   $t = get_t();
@@ -118,8 +185,14 @@ function _node_example_installed_fields() {
  * cardinality of three allowing our content type to give the user three color
  * fields.
  *
- * This is provided as a function so that it can be used in both hook_install()
- * and hook_uninstall().
+ * This is factored into this function so it can be used in both
+ * node_example_install() and node_example_uninstall().
+ *
+ * @return
+ *  An associative array specifying the instances we wish to add to our new
+ *  node type.
+ *
+ * @ingroup node_example
  */
 function _node_example_installed_instances() {
   $t = get_t();
@@ -168,46 +241,3 @@ function _node_example_installed_instances() {
     ),
   );
 }
-
-
-/**
- * Implements hook_uninstall().
- */
-function node_example_uninstall() {
-  // Gather all the example content that might have been created while this
-  // module was enabled.  Simple selects still use db_query().
-  // http://api.drupal.org/api/function/db_query/7
-  $sql = 'SELECT nid FROM {node} n WHERE n.type = :type';
-  $result = db_query($sql, array(':type' => 'node_example'));
-  $nids = array();
-  foreach ($result as $row) {
-    $nids[] = $row->nid;
-  }
-
-  // Delete all the nodes at once
-  // http://api.drupal.org/api/function/node_delete_multiple/7
-  node_delete_multiple($nids);
-
-  // Loop over each of the fields defined by this module and delete
-  // all instances of the field, their data, and the field itself.
-  // http://api.drupal.org/api/function/field_delete_field/7
-  foreach (array_keys(_node_example_installed_fields()) as $field) {
-    field_delete_field($field);
-  }
-
-  // Loop over any remaining field instances attached to the node_example
-  // content type (such as the body field) and delete them individually.
-  // http://api.drupal.org/api/function/field_delete_field/7
-  $instances = field_info_instances('node', 'node_example');
-  foreach ($instances as $instance_name => $instance) {
-    field_delete_instance($instance);
-  }
-
-  // Delete our content type
-  // http://api.drupal.org/api/function/node_type_delete/7
-  node_type_delete('node_example');
-
-  // Purge all field infromation
-  // http://api.drupal.org/api/function/field_purge_batch/7
-  field_purge_batch(1000);
-}
diff --git a/node_example/node_example.module b/node_example/node_example.module
index b9056d4..0dc03db 100755
--- a/node_example/node_example.module
+++ b/node_example/node_example.module
@@ -2,38 +2,50 @@
 
 /**
  * @file
- * This is an example outlining how a module can be used to define a new
- * node type.  In Drupal 7 we move most of what was once needed in this file
- * to the node_example.install file so that it can be managed efficiently.
- *
- * Our example node type will allow users to specify multiple "colors",
- * a "quantity" and an "image" for their nodes; some kind of rudimentary
- * inventory-tracking system, perhaps?
- *
- * In previous versions of Drupal, "teaser" and "page" were node view modes.  In
- * Drupal 7 we can define custom view modes to let the node know how it should
- * return it's data.  This module declares a custom view mode called
- * "example_node_list".
+ * Module file for Node Example module.
  *
- * We no longer need an extra database table to store this content type's
- * information.
- *
- * Most node types that provide fields do not require any custom code for
- * the fields, as the fields system provides storage and access.
- *
- * See @link http://drupal.org/node/707832 Field API Tutorial @endlink
- *
- * See @link http://drupal.org/node/443536 Field API Handbook Page @endlink
+ * Part of the Examples for Developers project.
+ */
+ 
+/**
+ * @defgroup node_example Example: Node
+ * @ingroup examples
+ * @{
+ * Example defining a node type in code.
  *
- * See @link field Field API documentation @endlink
+ * This is an example outlining how a module can be used to define a new
+ * node type. Our example node type will allow users to specify multiple
+ * "colors", a "quantity" and an "image" for their nodes; some kind of
+ * rudimentary inventory-tracking system, perhaps?
  *
- * See @link field_example.install field_example.install @endlink
+ * The basic pattern for defining a node type is to tell Drupal about the
+ * node's field types, and view modes. Drupal will then take over and manage
+ * the storage for this node type. This differs from Drupal 6, where we
+ * would have to handle all the database storage ourselves in the module.
  *
  * Remember that most node types do not require any custom code, as one
- * simply creates them using the fields UI.
+ * simply creates them using the Drupal user interface. Creating a node like
+ * this in code is a special case.
+ *
+ * Drupal 7 has us defining most of our node structure in arrays,
+ * and passing those to node_type_save(). We use hook_install() as
+ * a convenient place to define these types, and hook_uninstall()
+ * as a convenient place to not only uninstall the data contained
+ * in these nodes, but also remove the node types from Drupal's
+ * knowledge. This means that most of the code to define a new node type
+ * would be in the module's .install file.
+ * 
+ * In previous versions of Drupal, "teaser" and "page" were node view modes.
+ * In Drupal 7 we can define custom view modes to let the node know how it
+ * should return it's data.  This module declares a custom view mode called
+ * "example_node_list".
+ *
+ * @see @link http://drupal.org/node/707832 Field API Tutorial @endlink
+ * @see @link http://drupal.org/node/443536 Field API Handbook Page @endlink
+ * @see @link field Field API documentation @endlink
+ * @see field_example.module
  */
 
-
 /**
  * Implements hook_menu().
  *
@@ -53,8 +65,10 @@ function node_example_menu() {
  * Custom callback that builds our content and returns it to the browser.
  *
  * @return
- *   a build array
+ *   A build array.
  *
+ * @see node_load
+ * @see node_view
  */
 function node_example_page() {
   $build = array();
@@ -68,8 +82,6 @@ function node_example_page() {
 
   // Loop through each of our node_example nodes and instruct node_view
   // to use our custom "example_node_list" view.
-  // http://api.drupal.org/api/function/node_load/7
-  // http://api.drupal.org/api/function/node_view/7
   foreach ($result as $row) {
     $node = node_load($row->nid);
     $build['node_list'][]= node_view($node, 'example_node_list');
@@ -108,8 +120,8 @@ function node_example_field_formatter_info() {
 /**
  * Implements hook_field_formatter_view().
  *
- * @todo: We need to provide a formatter for the colors that a user is allowed to enter
- * during node creation.
+ * @todo: We need to provide a formatter for the colors that a user is allowed
+ * to enter during node creation.
  */
 function node_example_field_formatter_view($object_type, $object, $field, $instance, $langcode, $items, $display) {
   $element = array();
@@ -165,3 +177,6 @@ function theme_example_node_color($variables) {
   $output = '<span style="background-color: #ccc; padding: 1em; margin-bottom: 1em; float: left; color: ' . $variables['color'] . '">' . $variables['color'] . '</span>';
   return $output;
 }
+/**
+ * @} End of "defgroup node_example".
+ */
diff --git a/node_example/node_example.test b/node_example/node_example.test
index 940ff3e..797cb58 100644
--- a/node_example/node_example.test
+++ b/node_example/node_example.test
@@ -52,4 +52,3 @@ class NodeExampleTestCase extends DrupalWebTestCase {
 
   }
 }
-
diff --git a/nodeapi_example/nodeapi_example.module b/nodeapi_example/nodeapi_example.module
index 49b24ee..ffb69c9 100755
--- a/nodeapi_example/nodeapi_example.module
+++ b/nodeapi_example/nodeapi_example.module
@@ -76,36 +76,35 @@ function nodeapi_example_form_alter(&$form, $form_state, $form_id) {
  * http://api.drupal.org/api/group/hooks/7
  * or in the node API declaration file: modules/node/node.api.php
  *
- * hook_node_access()	- Control access to a node.
- * hook_node_access_records()	-	Set permissions for a node to be written to the database.
- * hook_node_access_records_alter()	-	Alter permissions for a node before it is written to the database.
- * hook_node_build_alter()	-	The node content was built, the module may modify the structured content.
- * hook_node_delete()	-	Act on node deletion.
- * hook_node_grants()	-	Inform the node access system what permissions the user has.
- * hook_node_grants_alter()	-	Alter user access rules when trying to view, edit or delete a node.
- * hook_node_info()	-	Defines module-provided node types.
- * hook_node_insert()	-	Respond to node insertion.
- * hook_node_load()	-	Act on node objects when loaded.
- * hook_node_operations()	-	Add mass node operations.
- * hook_node_prepare()	-	The node is about to be shown on the add/edit form.
- * hook_node_prepare_translation()	-	The node is being cloned for translation.
- * hook_node_presave()	-	The node passed validation and is about to be saved.
- * hook_node_revision_delete()	-	A revision of the node is deleted.
- * hook_node_search_result()	-	The node is being displayed as a search result.
- * hook_node_type_delete()	-	Act on node type deletion.
- * hook_node_type_insert()	-	Act on node type creation.
- * hook_node_type_update()	-	Act on node type changes.
- * hook_node_update()	-	The node being updated.
- * hook_node_update_index()	-	The node is being indexed.
- * hook_node_validate()	-	The user has finished editing the node and is previewing or submitting it.
- * hook_node_view()	-	The node content is being assembled before rendering.
- *
+ * hook_node_access()  - Controls access to a node.
+ * hook_node_access_records()  -  Sets permissions for a node to be written to the database.
+ * hook_node_access_records_alter()  -  Alters permissions for a node before it is written to the database.
+ * hook_node_build_alter()  -  Modifies the structured node content after node content is built.
+ * hook_node_delete()  -  Acts on node deletion.
+ * hook_node_grants()  -  Informs the node access system what permissions the user has.
+ * hook_node_grants_alter()  -  Alters user access rules when trying to view, edit or delete a node.
+ * hook_node_info()  -  Defines module-provided node types.
+ * hook_node_insert()  -  Responds to node insertion.
+ * hook_node_load()  -  Acts on node objects when loaded.
+ * hook_node_operations()  -  Adds mass node operations.
+ * hook_node_prepare()  -  The node is about to be shown on the add/edit form.
+ * hook_node_prepare_translation()  -  The node is being cloned for translation.
+ * hook_node_presave()  -  The node passed validation and is about to be saved.
+ * hook_node_revision_delete()  -  A revision of the node is deleted.
+ * hook_node_search_result()  -  The node is being displayed as a search result.
+ * hook_node_type_delete()  -  Acts on node type deletion.
+ * hook_node_type_insert()  -  Acts on node type creation.
+ * hook_node_type_update()  -  Acts on node type changes.
+ * hook_node_update()  -  The node being updated.
+ * hook_node_update_index()  -  The node is being indexed.
+ * hook_node_validate()  -  The user has finished editing the node and is previewing or submitting it.
+ * hook_node_view()  -  The node content is being assembled before rendering.
  */
 
 /**
  * Implements hook_node_validate().
  *
- * Check that rating attribute is set in the form submission, the field is
+ * Checks that rating attribute is set in the form submission, the field is
  * required
  */
 function nodeapi_example_node_validate($node, $form) {
@@ -119,8 +118,8 @@ function nodeapi_example_node_validate($node, $form) {
 /**
  * Implements hook_node_load().
  *
- * Load the rating information if available for any of the nodes in the argument
- * list.
+ * Loads the rating information if available for any of the nodes in the
+ * argument list.
  */
 function nodeapi_example_node_load($nodes, $form) {
   foreach ($nodes as $node) {
@@ -230,9 +229,9 @@ function nodeapi_example_node_update($node) {
  * HTML teaser and body. We will inject our additional information at the front
  * of the node copy.
  *
- * Using node API 'hook_node_view' is more appropriate than using a filter here, because
- * filters transform user-supplied content, whereas we are extending it with
- * additional information.
+ * Using node API 'hook_node_view' is more appropriate than using a filter here,
+ * because filters transform user-supplied content, whereas we are extending it
+ * with additional information.
  */
 function nodeapi_example_node_view($node, $build_mode = 'full') {
   if (variable_get('nodeapi_example_' . $node->type, FALSE)) {
@@ -261,10 +260,11 @@ function nodeapi_example_theme() {
 /**
  * A custom theme function.
  *
- * By using this function to format our rating, themes can override this presentation
- * if they wish; for example, they could provide a star graphic for the rating. We
- * also wrap the default presentation in a CSS class that is prefixed by the module
- * name. This way, style sheets can modify the output without requiring theme code.
+ * By using this function to format our rating, themes can override this
+ * presentation if they wish; for example, they could provide a star graphic
+ * for the rating. We also wrap the default presentation in a CSS class that
+ * is prefixed by the module name. This way, style sheets can modify the output
+ * without requiring theme code.
  */
 function theme_nodeapi_example_rating($variables) {
   $options = array(
@@ -280,4 +280,3 @@ function theme_nodeapi_example_rating($variables) {
   $output .= '</div>';
   return $output;
 }
-
diff --git a/nodeapi_example/nodeapi_example.test b/nodeapi_example/nodeapi_example.test
index e16ef8e..6518fae 100644
--- a/nodeapi_example/nodeapi_example.test
+++ b/nodeapi_example/nodeapi_example.test
@@ -6,7 +6,6 @@
  *
  * This file contains the test cases to check if module is performing as
  * expected.
- *
  */
 class NodeApiExampleTestCase extends DrupalWebTestCase {
   /**
@@ -30,7 +29,7 @@ class NodeApiExampleTestCase extends DrupalWebTestCase {
   }
 
   /**
-   * Enable modules and create user with specific permissions.
+   * Enables modules and create user with specific permissions.
    */
   function setUp() {
     parent::setUp('nodeapi_example');
@@ -49,7 +48,7 @@ class NodeApiExampleTestCase extends DrupalWebTestCase {
   }
 
   /**
-   * Login user, create an example node, and use the rating system
+   * Log user in, creates an example node, and uses the rating system.
    */
   function testNodeExampleBasic() {
 
@@ -116,7 +115,7 @@ class NodeApiExampleTestCase extends DrupalWebTestCase {
   }
 
   /**
-   * Login user, create an example node, and test rating functionality with
+   * Logs user in, creates an example node, and tests rating functionality with
    * a node using revisions.
    */
   function testNodeExampleRevision() {
diff --git a/page_example/page_example.module b/page_example/page_example.module
index 500f6d9..8ebf2d1 100755
--- a/page_example/page_example.module
+++ b/page_example/page_example.module
@@ -2,6 +2,13 @@
 
 /**
  * @file
+ * Module file for page_example_module.
+ */
+
+/**
+ * @defgroup page_example Example: Page
+ * @ingroup examples
+ * @{
  * This is an example outlining how a module can be used to display a
  * custom page at a given URL.
  */
@@ -116,9 +123,13 @@ function page_example_menu() {
   return $items;
 }
 
+/**
+ * page_example_description function.
+ */
 function page_example_description() {
   return array('#markup' => t('The page_example provides two pages, "simple" and "arguments". The <a href="@simple_link">simple page</a> just returns a renderable array for display. The <a href="@arguments_link">arguments page</a> takes two arguments and displays them, as in @arguments_link', array('@simple_link' => url('examples/page_example/simple', array('absolute' => TRUE)), '@arguments_link' => url('examples/page_example/arguments/23/56', array('absolute' => TRUE)))));
 }
+
 /**
  * A simple page callback.
  *
@@ -165,3 +176,6 @@ function page_example_arguments($first, $second) {
   );
   return $render_array;
 }
+/**
+ * @} End of "defgroup page_example".
+ */
diff --git a/queue_example/queue_example.module b/queue_example/queue_example.module
index 4eecab1..b66b3ec 100644
--- a/queue_example/queue_example.module
+++ b/queue_example/queue_example.module
@@ -3,6 +3,13 @@
 /**
  * @file
  * Examples demonstrating the Drupal Queue API.
+ */
+
+/**
+ * @defgroup queue_example Example: Queue
+ * @ingroup examples
+ * @{
+ * Demonstrating the Queue API
  *
  * The Queue API provides a traditional FIFO (first-in-first-out) queue,
  * but also provides the concepts of:
@@ -210,7 +217,7 @@ function queue_example_add_remove_form_clear_queue($form, &$form_state) {
 }
 
 /**
- * Retrieve the queue from the database for display purposes only.
+ * Retrieves the queue from the database for display purposes only.
  *
  * It is not recommended to access the database directly, and this is only here
  * so that the user interface can give a good idea of what's going on in the
@@ -231,7 +238,7 @@ function queue_example_retrieve_queue($queue_name) {
 }
 
 /**
- * Theme the queue display.
+ * Themes the queue display.
  *
  * Again, this is not part of the demonstration of the queue API, but is here
  * just to make the user interface more understandable.
@@ -273,3 +280,6 @@ function queue_example_theme() {
     ),
   );
 }
+/**
+ * @} End of "defgroup queue_example".
+ */
diff --git a/render_example/render_example.module b/render_example/render_example.module
index 8e7730f..d1c307f 100644
--- a/render_example/render_example.module
+++ b/render_example/render_example.module
@@ -2,7 +2,14 @@
 
 /**
  * @file
- * Demonstrates how render arrays are arranged and how they can be altered.
+ * Demonstrates render arrays.
+ */
+
+/**
+ * @defgroup render_example Example: Render
+ * @ingroup examples
+ * @{
+ * Demonstrate how render arrays are arranged and how they can be altered.
  * This alters blocks and the page to show the actual render array
  * that is being used to create each item.
  *
@@ -47,6 +54,7 @@ function render_example_info() {
 
 /**
  * Provides a number of render arrays and show what they do.
+ *
  * Each array is keyed by a description; it's returned for rendering at page
  * render time. It's easy to add new examples to this.
  *
@@ -190,6 +198,7 @@ function render_example_add_suffix($element) {
  *   The rendered element.
  * @param $element
  *   The element which was rendered (for reference)
+ *
  * @return
  *   Markup altered as necessary. In this case we add a little postscript to it.
  */
@@ -199,7 +208,9 @@ function render_example_add_prefix($markup, $element) {
 }
 
 /**
- * A #theme function has the responsibility of consolidating/rendering the
+ * A #theme function.
+ *
+ * This #theme function has the responsibility of consolidating/rendering the
  * children's markup and returning it, where it will be placed in the
  * element's #children property.
  */
@@ -215,6 +226,7 @@ function theme_render_example_aggregate($variables) {
  * The following section of the example builds and arranges the altering
  * example.
  */
+
 /**
  * Builds the form that offers options of what items to show.
  */
@@ -397,6 +409,7 @@ function render_example_page_alter(&$page) {
 
 /**
  * Utility function to build a named form given a set of form elements.
+ *
  * This is a standard form builder function that takes an additional array,
  * which is itself a form.
  *
@@ -433,7 +446,7 @@ function render_example_theme() {
 }
 
 /**
- * Wrap a div around the already-rendered #children.
+ * Wraps a div around the already-rendered #children.
  */
 function theme_render_example_add_div($variables) {
   $element = $variables['element'];
@@ -444,7 +457,7 @@ function theme_render_example_add_div($variables) {
 }
 
 /**
- * Wrap a div and add a little text after the rendered #children.
+ * Wraps a div and add a little text after the rendered #children.
  */
 function theme_render_example_add_notes($variables) {
   $element = $variables['element'];
@@ -457,7 +470,7 @@ function theme_render_example_add_notes($variables) {
 }
 
 /**
- * Theme render array (from the demonstration page).
+ * Themes the render array (from the demonstration page).
  */
 function theme_render_array($variables) {
   $heading = '<div class="render-header">' . $variables['element']['#description'] . '</div>';
@@ -467,8 +480,9 @@ function theme_render_array($variables) {
 }
 
 /**
- * Add a #type to the element before it gets rendered.
+ * Adds a #type to the element before it gets rendered.
  * In this case, changes from the default 'ul' to 'ol'.
+ *
  * @param $element
  *   The element to be altered, in this case a list, ready for theme_item_list.
  *
@@ -485,6 +499,7 @@ function render_example_change_to_ol($element) {
  * theme functions have acted on it, and it receives the original data, so
  * can make decisions based on that. In this example, no use is made of the
  * passed-in $element.
+ *
  * @param $markup
  *   The already-rendered data
  * @param unknown_type $element
@@ -497,3 +512,6 @@ function render_example_add_hr($markup, $element) {
   $output = $markup . '<hr />';
   return $output;
 }
+/**
+ * @} End of "defgroup render_example".
+ */
diff --git a/simpletest_example/simpletest_example.module b/simpletest_example/simpletest_example.module
index ea77b2a..16048f2 100644
--- a/simpletest_example/simpletest_example.module
+++ b/simpletest_example/simpletest_example.module
@@ -2,13 +2,19 @@
 
 /**
  * @file
+ * Module file for simpletest_example
+ */
+
+/**
+ * @defgroup simpletest_example Example: Simpletest
+ * @ingroup examples
+ * @{
  * An example of simpletest tests to accompany the tutorial at
  * http://drupal.org/node/890654.
  *
  * This is built on a traditional node-type implementation.
  */
 
-
 /**
  * Implements hook_node_info().
  */
@@ -87,7 +93,7 @@ function simpletest_example_form($node, $form_state) {
 /**
  * Implements hook_menu().
  *
- * Provide an explanation.
+ * Provides an explanation.
  */
 function simpletest_example_menu() {
   $items['examples/simpletest_example'] = array(
@@ -100,7 +106,7 @@ function simpletest_example_menu() {
 }
 
 /**
- * Return an explanation of this module.
+ * Returns an explanation of this module.
  */
 function _simpletest_example_explanation() {
 
@@ -108,4 +114,6 @@ function _simpletest_example_explanation() {
     a simpletest test. Please see the <a href='http://drupal.org/node/890654'>associated tutorial</a>.");
   return $explanation;
 }
-
+/**
+ * @} End of "defgroup simpletest_example".
+ */
diff --git a/token_example/token_example.module b/token_example/token_example.module
index dac5762..99919da 100644
--- a/token_example/token_example.module
+++ b/token_example/token_example.module
@@ -3,6 +3,24 @@
 /**
  * @file
  * An example module showing how to define and use tokens.
+ *
+ * The Token module provides an API for providing tokens to other modules.
+ * Tokens are small bits of text that can be placed into larger documents
+ * via simple placeholders, like %site-name or [user].
+ */
+
+/**
+ * @defgroup token_example Example: Token API
+ * @ingroup examples
+ * @{
+ * Examples using the Token API.
+ *
+ * The Token module provides an API for providing tokens to other modules.
+ * Tokens are small bits of text that can be placed into larger documents
+ * via simple placeholders, like %site-name or [user].
+ *
+ * This example is part of the Examples for Developers Project which you can
+ * download and experiment with here: http://drupal.org/project/examples
  */
 
 /**
@@ -117,7 +135,7 @@ function token_example_example_form_submit($form, &$form_state) {
 }
 
 /**
- * Build a list of available content.
+ * Builds a list of available content.
  */
 function _token_example_get_node() {
   if (!user_access('access content') && !user_access('bypass node access')) {
@@ -136,7 +154,7 @@ function _token_example_get_node() {
 }
 
 /**
- * Build a list of available comments.
+ * Builds a list of available comments.
  */
 function _token_example_get_comment() {
   if (!module_exists('comment') || (!user_access('access comments') && !user_access('administer comments'))) {
@@ -157,10 +175,11 @@ function _token_example_get_comment() {
 }
 
 /**
- * Build a list of available user accounts.
+ * Builds a list of available user accounts.
  */
 function _token_example_get_user() {
-  if (!user_access('access user profiles') && !user_access('administer users')) {
+  if (!user_access('access user profiles') &&
+      !user_access('administer users')) {
     return array();
   }
 
@@ -175,7 +194,7 @@ function _token_example_get_user() {
 }
 
 /**
- * Build a list of available taxonomy terms.
+ * Builds a list of available taxonomy terms.
  */
 function _token_example_get_taxonomy_term() {
   $term_query = db_select('taxonomy_term_data', 'ttd');
@@ -188,7 +207,7 @@ function _token_example_get_taxonomy_term() {
 }
 
 /**
- * Build a list of available files.
+ * Builds a list of available files.
  */
 function _token_example_get_file() {
   $file_query = db_select('file_managed', 'f');
@@ -198,3 +217,6 @@ function _token_example_get_file() {
   $files = array_map('check_plain', $files);
   return $files;
 }
+/**
+ * @} End of "defgroup token_example".
+ */
diff --git a/token_example/token_example.tokens.inc b/token_example/token_example.tokens.inc
index 462e0c9..d62a329 100644
--- a/token_example/token_example.tokens.inc
+++ b/token_example/token_example.tokens.inc
@@ -7,6 +7,8 @@
 
 /**
  * Implements hook_token_info().
+ *
+ * @ingroup token_example
  */
 function token_example_token_info() {
   // Add two different token types. The first is the generic text format. The
@@ -54,6 +56,8 @@ function token_example_token_info() {
 
 /**
  * Implements hook_tokens().
+ *
+ * @ingroup token_example
  */
 function token_example_tokens($type, $tokens, array $data = array(), array $options = array()) {
   $replacements = array();
diff --git a/trigger_example/trigger_example.module b/trigger_example/trigger_example.module
index cac508c..5a9b13e 100644
--- a/trigger_example/trigger_example.module
+++ b/trigger_example/trigger_example.module
@@ -3,6 +3,14 @@
 /**
  * @file
  * Trigger definition example module.
+ */
+
+/**
+ * @defgroup trigger_example Example: Trigger
+ * @ingroup examples
+ * @{
+ *
+ * Trigger definition example module.
  *
  * Triggers and actions are a pair of special-purpose functions allowing some
  * Drupal programming without using PHP. Using the
@@ -115,7 +123,8 @@ function trigger_example_trigger_info() {
  * This function is executed during the submission of the example form defined
  * in this module.
  *
- * @param array $options arguments used to call the triggersomething function, if any.
+ * @param $options
+ *   Array of arguments used to call the triggersomething function, if any.
  */
 function trigger_example_triggersomething($options = array()) {
   // Ask the trigger module for all actions enqueued for the 'triggersomething' trigger.
@@ -145,7 +154,6 @@ function trigger_example_triggersomething($options = array()) {
  * it can be used. We use hook_user_login to be informed when a user logs in and
  * try to find if the user has previously logged in before. If the user has not
  * accessed previously, we make a call to our trigger function.
- *
  */
 function trigger_example_user_login(&$edit, $account, $category = NULL) {
   // Verify user has never accessed the site: last access was creation date.
@@ -173,14 +181,13 @@ function trigger_example_user_login(&$edit, $account, $category = NULL) {
  * @endcode
  *
  * @param string $hook
- *   the trigger identification.
+ *   The trigger identification.
  * @param array  $edit
- *   modifications for the account object (should be empty).
+ *   Modifications for the account object (should be empty).
  * @param object $account
- *   user object that has logged in.
+ *   User object that has logged in.
  * @param string $category
- *   category of the profile.
- *
+ *   Category of the profile.
  */
 function _trigger_example_first_time_login($hook, &$edit, $account, $category = NULL) {
   // Keep objects for reuse so that changes actions make to objects can persist.
@@ -245,7 +252,7 @@ function trigger_example_help($path, $arg) {
 /**
  * Implements hook_menu().
  *
- * Provide a form that can be used to fire the module's triggers.
+ * Provides a form that can be used to fire the module's triggers.
  */
 function trigger_example_menu() {
   $items['examples/trigger_example'] = array(
@@ -259,9 +266,9 @@ function trigger_example_menu() {
 }
 
 /**
- * Trigger example test form
+ * Trigger example test form.
  *
- * Provide a button to run the triggersomething event.
+ * Provides a button to run the triggersomething event.
  */
 function trigger_example_form($form_state) {
   $form['triggersomething'] = array(
@@ -272,7 +279,7 @@ function trigger_example_form($form_state) {
 }
 
 /**
- * Submit handler for the trigger_example_form.
+ * Submit handler for the trigger_example_form().
  */
 function trigger_example_form_submit($form, $form_state) {
   // If the user clicked the button, then run the triggersomething trigger.
@@ -283,11 +290,10 @@ function trigger_example_form_submit($form, $form_state) {
 
 
 /**
- * Optional usage of hook_trigger_info_aler()
+ * Optional usage of hook_trigger_info_alter().
  *
  * This function is not required to write your own triggers, but it may be
  * useful when you want to alter existing triggers.
- *
  */
 
 /**
@@ -299,9 +305,9 @@ function trigger_example_form_submit($form, $form_state) {
  * this example implementation a little change is done to the existing trigger
  * provided by core: 'cron'
  *
- * @param array $triggers
- *  Array of trigger information returned by hook_trigger_info()
- *  implementations.
+ * @param $triggers
+ *   Array of trigger information returned by hook_trigger_info()
+ *   implementations.
  *
  * @see hook_trigger_info()
  */
diff --git a/vertical_tabs_example/vertical_tabs_example.module b/vertical_tabs_example/vertical_tabs_example.module
index fec4345..faab1a6 100644
--- a/vertical_tabs_example/vertical_tabs_example.module
+++ b/vertical_tabs_example/vertical_tabs_example.module
@@ -2,9 +2,19 @@
 
 /**
  * @file
- * Shows how to use the vertical tabs functionality provided by Drupal 7. This
- * example does not cover how to save / load custom setting, and only deals with
- * elements visibility.
+ * Module file for vertical_tabs_example module.
+ */
+
+/**
+ * @defgroup vertical_tabs_example Example: Vertical Tabs
+ * @ingroup examples
+ * @{
+ * Demonstrates the vertical tabs functionality provided by Drupal 7.
+ *
+ * This example does not cover how to save / load custom setting, and only
+ * deals with elements visibility.
+ *
+ * @see vertical_tabs_example.js
  */
 
 /**
@@ -86,3 +96,6 @@ function vertical_tabs_example_form_alter(&$form, $form_state, $form_id) {
 function _vertical_tabs_example_explanation() {
   return t("The Vertical Tabs Example shows how a custom module can best support vertical tabs. To see the effects of this module, look at the <a href='!node_add'>node/add</a> form", array('!node_add' => url('node/add')));
 }
+/**
+ * @} End of "defgroup vertical_tabs_example".
+ */
diff --git a/xmlrpc_example/xmlrpc_example.module b/xmlrpc_example/xmlrpc_example.module
index 225624c..d1d301e 100644
--- a/xmlrpc_example/xmlrpc_example.module
+++ b/xmlrpc_example/xmlrpc_example.module
@@ -2,6 +2,15 @@
 
 /**
  * @file
+ * Module file for xmlrpc_example module.
+ */
+
+/**
+ * @defgroup xmlrpc_example Example: XML-RPC
+ * @ingroup examples
+ * @{
+ * Demonstration of XML-RPC in Drupal 7.
+ *
  * This is an example of how to implement and XML-RPC server by registering
  * callbacks to specific methods and how to make xmlrpc calls using the built-in
  * xmlrpc() factory provided by Drupal.
@@ -24,7 +33,8 @@
 
 /**
  * Implements hook_menu().
- * Register all the demonstration forms.
+ *
+ * Registers all the demonstration forms.
  */
 function xmlrpc_example_menu() {
   $items['examples/xmlrpc'] = array(
@@ -55,7 +65,7 @@ function xmlrpc_example_menu() {
     'access callback' => TRUE,
     'weight'          => 1,
   );
-  // This part is completely optional. It will allow the modification of services
+  // This part is completely optional. It allows the modification of services
   // defined by this or other modules. This configuration form is used to
   // enable the hook_xmlrpc_alter API and alter current existing services
   $items['examples/xmlrpc/alter'] = array(
@@ -643,5 +653,6 @@ function xmlrpc_example_alter_form() {
   );
   return system_settings_form($form);
 }
-
-// The alteration part of the module ends here.
+/**
+ * @} End of "defgroup xmlrpc_example".
+ */
