diff --git a/core/modules/field/field.api.php b/core/modules/field/field.api.php
index cb55bba..86a2243 100644
--- a/core/modules/field/field.api.php
+++ b/core/modules/field/field.api.php
@@ -10,8 +10,7 @@
  *
  * Field UI's "Manage fields" and "Manage display" pages let users re-order
  * fields, but also non-field components. For nodes, these include the title,
- * poll choices, and other elements exposed by modules through hook_form() or
- * hook_form_alter().
+ * poll choices, and other elements exposed by modules using hook_form_alter().
  *
  * Fieldable entities or modules that want to have their components supported
  * should expose them using this hook. The user-defined settings (weight,
diff --git a/core/modules/forum/forum.module b/core/modules/forum/forum.module
index 4c12c41..784ac7a 100644
--- a/core/modules/forum/forum.module
+++ b/core/modules/forum/forum.module
@@ -600,6 +600,32 @@ function forum_form_alter(&$form, $form_state, $form_id) {
  * Implements hook_form_BASE_FORM_ID_alter().
  */
 function forum_form_node_form_alter(&$form, &$form_state, $form_id) {
+  $node = $form_state['node'];
+  $type = node_type_get_type($node);
+  $form['title'] = array(
+    '#type' => 'textfield',
+    '#title' => check_plain($type->title_label),
+    '#default_value' => !empty($node->title) ? $node->title : '',
+    '#required' => TRUE,
+    '#weight' => -5
+  );
+
+  if (!empty($node->nid)) {
+    $forum_terms = $node->taxonomy_forums;
+    // If editing, give option to leave shadows
+    $shadow = (count($forum_terms) > 1);
+    $form['shadow'] = array(
+      '#type' => 'checkbox',
+      '#title' => t('Leave shadow copy'),
+      '#default_value' => $shadow,
+      '#description' => t('If you move this topic, you can leave a link in the old forum to the new forum.'),
+    );
+    $form['forum_tid'] = array(
+      '#type' => 'value',
+      '#value' => $node->forum_tid,
+    );
+  }
+
   if (isset($form['taxonomy_forums'])) {
     $langcode = $form['taxonomy_forums']['#language'];
     // Make the vocabulary required for 'real' forum-nodes.
@@ -698,29 +724,6 @@ function forum_block_view_pre_render($elements) {
 }
 
 /**
- * Implements hook_form().
- */
-function forum_form($node, $form_state) {
-  $type = node_type_get_type($node);
-  $form['title'] = array(
-    '#type' => 'textfield',
-    '#title' => check_plain($type->title_label),
-    '#default_value' => !empty($node->title) ? $node->title : '',
-    '#required' => TRUE, '#weight' => -5
-  );
-
-  if (!empty($node->nid)) {
-    $forum_terms = $node->taxonomy_forums;
-    // If editing, give option to leave shadows
-    $shadow = (count($forum_terms) > 1);
-    $form['shadow'] = array('#type' => 'checkbox', '#title' => t('Leave shadow copy'), '#default_value' => $shadow, '#description' => t('If you move this topic, you can leave a link in the old forum to the new forum.'));
-    $form['forum_tid'] = array('#type' => 'value', '#value' => $node->forum_tid);
-  }
-
-  return $form;
-}
-
-/**
  * Returns a tree of all forums for a given taxonomy term ID.
  *
  * @param $tid
diff --git a/core/modules/node/node.api.php b/core/modules/node/node.api.php
index 2324b47..a6971a4 100644
--- a/core/modules/node/node.api.php
+++ b/core/modules/node/node.api.php
@@ -104,7 +104,6 @@
  *   above):
  *   - hook_prepare() (node-type-specific)
  *   - hook_node_prepare() (all)
- *   - hook_form() (node-type-specific)
  *   - field_attach_form()
  * - Validating a node during editing form submit (calling
  *   node_form_validate()):
@@ -1071,61 +1070,6 @@ function hook_prepare($node) {
 }
 
 /**
- * Display a node editing form.
- *
- * This hook, implemented by node modules, is called to retrieve the form
- * that is displayed to create or edit a node. This form is displayed at path
- * node/add/[node type] or node/[node ID]/edit.
- *
- * The submit and preview buttons, administrative and display controls, and
- * sections added by other modules (such as path settings, menu settings,
- * comment settings, and fields managed by the Field UI module) are
- * displayed automatically by the node module. This hook just needs to
- * return the node title and form editing fields specific to the node type.
- *
- * @param $node
- *   The node being added or edited.
- * @param $form_state
- *   The form state array.
- *
- * @return
- *   An array containing the title and any custom form elements to be displayed
- *   in the node editing form.
- *
- * @ingroup node_api_hooks
- */
-function hook_form($node, &$form_state) {
-  $type = node_type_get_type($node);
-
-  $form['title'] = array(
-    '#type' => 'textfield',
-    '#title' => check_plain($type->title_label),
-    '#default_value' => !empty($node->title) ? $node->title : '',
-    '#required' => TRUE, '#weight' => -5
-  );
-
-  $form['field1'] = array(
-    '#type' => 'textfield',
-    '#title' => t('Custom field'),
-    '#default_value' => $node->field1,
-    '#maxlength' => 127,
-  );
-  $form['selectbox'] = array(
-    '#type' => 'select',
-    '#title' => t('Select box'),
-    '#default_value' => $node->selectbox,
-    '#options' => array(
-      1 => 'Option A',
-      2 => 'Option B',
-      3 => 'Option C',
-    ),
-    '#description' => t('Choose an option.'),
-  );
-
-  return $form;
-}
-
-/**
  * Respond to creation of a new node.
  *
  * This hook is invoked only on the module that defines the node's content type
diff --git a/core/modules/node/node.module b/core/modules/node/node.module
index be60e48..6e27f84 100644
--- a/core/modules/node/node.module
+++ b/core/modules/node/node.module
@@ -3712,20 +3712,11 @@ function _node_access_rebuild_batch_finished($success, $results, $operations) {
  * @} End of "defgroup node_access".
  */
 
-
-/**
- * @defgroup node_content Hook implementations for user-created content types
- * @{
- * Functions that implement hooks for user-created content types.
- */
-
 /**
- * Implements hook_form().
+ * Implements hook_form_BASE_FORM_ID_alter().
  */
-function node_content_form($node, $form_state) {
-  // It is impossible to define a content type without implementing hook_form()
-  // @todo: remove this requirement.
-  $form = array();
+function node_form_node_form_alter(&$form, &$form_state, $form_id) {
+  $node = $form_state['node'];
   $type = node_type_get_type($node);
 
   if ($type->has_title) {
@@ -3738,13 +3729,8 @@ function node_content_form($node, $form_state) {
       '#weight' => -5,
     );
   }
-
-  return $form;
 }
 
-/**
- * @} End of "defgroup node_content".
- */
 
 /**
  * Implements hook_forms().
diff --git a/core/modules/node/node.pages.inc b/core/modules/node/node.pages.inc
index 4e94b26..658f901 100644
--- a/core/modules/node/node.pages.inc
+++ b/core/modules/node/node.pages.inc
@@ -159,14 +159,6 @@ function node_form($form, &$form_state, $node) {
     '#type' => 'hidden',
     '#default_value' => isset($node->changed) ? $node->changed : NULL,
   );
-  // Invoke hook_form() to get the node-specific bits. Can't use node_invoke(),
-  // because hook_form() needs to be able to receive $form_state by reference.
-  // @todo hook_form() implementations are unable to add #validate or #submit
-  //   handlers to the form buttons below. Remove hook_form() entirely.
-  $function = node_type_get_base($node) . '_form';
-  if (function_exists($function) && ($extra = $function($node, $form_state))) {
-    $form = array_merge_recursive($form, $extra);
-  }
   // If the node type has a title, and the node type form defined no special
   // weight for it, we default to a weight of -5 for consistency.
   if (isset($form['title']) && !isset($form['title']['#weight'])) {
diff --git a/core/modules/poll/poll.module b/core/modules/poll/poll.module
index 154db55..4f79253 100644
--- a/core/modules/poll/poll.module
+++ b/core/modules/poll/poll.module
@@ -214,10 +214,11 @@ function poll_field_extra_fields() {
 }
 
 /**
- * Implements hook_form().
+ * Implements hook_form_BASE_FORM_ID_alter().
  */
-function poll_form($node, &$form_state) {
+function poll_form_node_form_alter(&$form, &$form_state, $form_id) {
   global $user;
+  $node = $form_state['node'];
 
   $admin = user_access('bypass node access') || user_access('edit any poll content') || (user_access('edit own poll content') && $user->uid == $node->uid);
 
@@ -333,8 +334,6 @@ function poll_form($node, &$form_state) {
   $form['#attached']['css'] = array(
     drupal_get_path('module', 'poll') . '/poll.admin.css',
   );
-
-  return $form;
 }
 
 /**
diff --git a/core/modules/shortcut/shortcut.test b/core/modules/shortcut/shortcut.test
index 550c10c..6029ca0 100644
--- a/core/modules/shortcut/shortcut.test
+++ b/core/modules/shortcut/shortcut.test
@@ -40,7 +40,7 @@ class ShortcutTestCase extends DrupalWebTestCase {
     }
 
     // Create users.
-    $this->admin_user = $this->drupalCreateUser(array('access toolbar', 'administer shortcuts', 'view the administration theme', 'create article content', 'create page content', 'access content overview'));
+    $this->admin_user = $this->drupalCreateUser(array('access toolbar', 'administer shortcuts', 'view the administration theme', 'create article content', 'create page content', 'access content overview', 'administer content types'));
     $this->shortcut_user = $this->drupalCreateUser(array('customize shortcut links', 'switch shortcut sets'));
 
     // Create a node.
@@ -82,7 +82,7 @@ class ShortcutTestCase extends DrupalWebTestCase {
 
   /**
    * Extracts information from shortcut set links.
-   * 
+   *
    * @param object $set
    *   The shortcut set object to extract information from.
    * @param string $key
@@ -326,7 +326,7 @@ class ShortcutSetsTestCase extends ShortcutTestCase {
    */
   function testShortcutSetRename() {
     $set = $this->set;
-    
+
     $new_title = $this->randomName(10);
     $this->drupalPost('admin/config/user-interface/shortcut/' . $set->set_name . '/edit', array('title' => $new_title), t('Save'));
     $set = shortcut_set_load($set->set_name);
diff --git a/core/modules/system/system.api.php b/core/modules/system/system.api.php
index 00c75c7..1ca7809 100644
--- a/core/modules/system/system.api.php
+++ b/core/modules/system/system.api.php
@@ -197,10 +197,9 @@ function hook_cron_queue_info_alter(&$queues) {
  * default values.
  *
  * This hook allows modules to declare their own form element types and to
- * specify their default values. The values returned by this hook will be
- * merged with the elements returned by hook_form() implementations and so
- * can return defaults for any Form APIs keys in addition to those explicitly
- * mentioned below.
+ * specify their default values. The values returned by this hook can return
+ * defaults for any Form APIs keys in addition to those explicitly mentioned
+ * below.
  *
  * Each of the form element types defined by this hook is assumed to have
  * a matching theme function, e.g. theme_elementtype(), which should be
