diff --git includes/common.inc includes/common.inc
index 56098bf..0cca378 100644
--- includes/common.inc
+++ includes/common.inc
@@ -3873,6 +3873,12 @@ function drupal_render_page($page) {
     drupal_set_page_content($page);
     $page = element_info('page');
   }
+
+  // Modules can add elements to $page as needed in hook_page_add().
+  foreach (module_implements('page_add') as $module) {
+    $function = $module . '_page_add';
+    $function($page);
+  }
   // Modules alter the $page as needed. Blocks are populated into regions like
   // 'sidebar_first', 'footer', etc.
   drupal_alter('page', $page);
diff --git modules/block/block.module modules/block/block.module
index b1654ad..0a0ecdd 100644
--- modules/block/block.module
+++ modules/block/block.module
@@ -235,7 +235,7 @@ function block_block_view($delta = 0, $edit = array()) {
  *
  * Render blocks into their regions.
  */
-function block_page_alter($page) {
+function block_page_add(&$page) {
   global $theme;
 
   // The theme system might not yet be initialized. We need $theme.
diff --git modules/system/system.api.php modules/system/system.api.php
index 9271b28..fc490d8 100644
--- modules/system/system.api.php
+++ modules/system/system.api.php
@@ -294,20 +294,57 @@ function hook_css_alter(&$css) {
 }
 
 /**
+ * Add elements to a page before it is rendered.
+ *
+ * Use this hook when you want to add elements at the page level. For your
+ * additions to be printed, they have to be placed below a top level array key
+ * of the $page array that has the name of a region of the active theme.
+ *
+ * By default, valid region keys are 'page_top', 'header', 'sidebar_first',
+ * 'content', 'sidebar_second' and 'page_bottom'. To get a list of all regions
+ * of the active theme, use system_region_list($theme). Note that $theme is a
+ * global variable.
+ *
+ * If you want to alter the elements added by other modules or if your module
+ * depends on the elements of other modules, use hook_page_alter() instead which
+ * runs after this hook.
+ *
+ * @param $page
+ *   Nested array of renderable elements that make up the page.
+ *
+ * @see hook_page_alter()
+ * @see drupal_render_page()
+ */
+function hook_page_add(&$page) {
+  if (menu_get_object('node', 1)) {
+    // We are on a node detail page. Append a standard disclaimer to the
+    // content region.
+    $page['content']['disclaimer'] = array(
+      '#markup' => t('Acme, Inc. is not responsible for the contents of this sample code.'),
+      '#weight' => 25,
+    );
+  }
+}
+
+/**
  * Perform alterations before a page is rendered.
  *
- * Use this hook when you want to add, remove, or alter elements at the page
- * level. If you are making changes to entities such as forms, menus, or user
+ * Use this hook when you want to remove or alter elements at the page
+ * level, or add elements at the page level that depend on an other module's
+ * elements (this hook runs after hook_page_add().
+ *
+ * If you are making changes to entities such as forms, menus, or user
  * profiles, use those objects' native alter hooks instead (hook_form_alter(),
  * for example).
  *
  * The $page array contains top level elements for each block region:
  * @code
+ *   $page['page_top']
  *   $page['header']
  *   $page['sidebar_first']
  *   $page['content']
  *   $page['sidebar_second']
- *   $page['footer']
+ *   $page['page_bottom']
  * @endcode
  *
  * The 'content' element contains the main content of the current page, and its
@@ -331,23 +368,21 @@ function hook_css_alter(&$css) {
  * Blocks may be referenced by their module/delta pair within a region:
  * @code
  *   // The login block in the first sidebar region.
- *   $page['sidebar_first']['user-login']['#block'];
+ *   $page['sidebar_first']['user_login']['#block'];
  * @endcode
  *
  * @param $page
  *   Nested array of renderable elements that make up the page.
  *
+ * @see hook_page_add()
  * @see drupal_render_page()
  */
-function hook_page_alter($page) {
-  if (menu_get_object('node', 1)) {
-    // We are on a node detail page. Append a standard disclaimer to the
-    // content region.
-    $page['content']['disclaimer'] = array(
-      '#markup' => t('Acme, Inc. is not responsible for the contents of this sample code.'),
-      '#weight' => 25,
-    );
-  }
+function hook_page_alter(&$page) {
+  // Add help text to the user login block.
+  $page['sidebar_first']['user_login']['help'] = array(
+    '#weight' => -10,
+    '#markup' => t('To post comments or add new content, you first have to log in.'),
+  );
 }
 
 /**
diff --git modules/system/system.module modules/system/system.module
index bc569b6..fe03c01 100644
--- modules/system/system.module
+++ modules/system/system.module
@@ -3076,9 +3076,9 @@ function system_retrieve_file($url, $destination = NULL, $overwrite = TRUE) {
 }
 
 /**
- * Implement hook_page_alter().
+ * Implement hook_page_add().
  */
-function system_page_alter(&$page) {
+function system_page_add(&$page) {
   // Automatic cron runs.
   // @see system_run_cron_image()
   if (system_run_cron_image_access()) {
diff --git modules/toolbar/toolbar.module modules/toolbar/toolbar.module
index 0ab6f87..60e7944 100644
--- modules/toolbar/toolbar.module
+++ modules/toolbar/toolbar.module
@@ -31,11 +31,11 @@ function toolbar_theme($existing, $type, $theme, $path) {
 }
 
 /**
- * Implement hook_page_alter().
+ * Implement hook_page_add().
  * 
  * Add admin toolbar to the page_top region automatically.
  */
-function toolbar_page_alter(&$page) {
+function toolbar_page_add(&$page) {
   if (user_access('access toolbar')) {
     $page['page_top']['toolbar'] = toolbar_build();
   }
