Index: modules/blog/blog.install
===================================================================
RCS file: modules/blog/blog.install
diff -N modules/blog/blog.install
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ modules/blog/blog.install	2 May 2010 11:39:17 -0000
@@ -0,0 +1,17 @@
+<?php
+// $Id$
+
+/**
+ * @file
+ * Install, update and uninstall functions for the blog module.
+ */
+
+/**
+ * Implements hook_install().
+ */
+function blog_install() {
+  // Ensure the blog node type is available.
+  node_types_rebuild();
+  $types = node_type_get_types();
+  node_add_body_field($types['blog']);
+}
Index: modules/book/book.install
===================================================================
RCS file: /cvs/drupal/drupal/modules/book/book.install,v
retrieving revision 1.34
diff -u -p -r1.34 book.install
--- modules/book/book.install	4 Dec 2009 16:49:45 -0000	1.34
+++ modules/book/book.install	2 May 2010 11:39:17 -0000
@@ -37,6 +37,7 @@ function _book_install_type_create() {
 
   $book_node_type = node_type_set_defaults($book_node_type);
   node_type_save($book_node_type);
+  node_add_body_field($book_node_type);
   // Default to not promoted.
   variable_set('node_options_book', array('status'));
   // Use this default type for adding content to books.
Index: modules/forum/forum.install
===================================================================
RCS file: /cvs/drupal/drupal/modules/forum/forum.install,v
retrieving revision 1.45
diff -u -p -r1.45 forum.install
--- modules/forum/forum.install	26 Apr 2010 14:32:27 -0000	1.45
+++ modules/forum/forum.install	2 May 2010 11:39:17 -0000
@@ -80,6 +80,10 @@ function forum_enable() {
     $term = (object) $edit;
     taxonomy_term_save($term);
   }
+  // Ensure the forum node type is available.
+  node_types_rebuild();
+  $types = node_type_get_types();
+  node_add_body_field($types['forum']);
 }
 
 /**
Index: modules/node/content_types.inc
===================================================================
RCS file: /cvs/drupal/drupal/modules/node/content_types.inc,v
retrieving revision 1.113
diff -u -p -r1.113 content_types.inc
--- modules/node/content_types.inc	28 Apr 2010 19:36:01 -0000	1.113
+++ modules/node/content_types.inc	2 May 2010 11:39:17 -0000
@@ -160,12 +160,6 @@ function node_type_form($form, &$form_st
     $form['submission']['title_label']['#description'] = t('This content type does not have a title field.');
     $form['submission']['title_label']['#required'] = FALSE;
   }
-  $form['submission']['body_label'] = array(
-    '#title' => t('Body field label'),
-    '#type' => 'textfield',
-    '#default_value' => isset($type->body_label) ? $type->body_label : '',
-    '#description' => t('To remove the body field, remove text and leave blank.'),
-  );
   $form['submission']['node_preview'] = array(
     '#type' => 'radios',
     '#title' => t('Preview before submitting'),
@@ -322,12 +316,9 @@ function node_type_form_submit($form, &$
   $type->description = $form_state['values']['description'];
   $type->help = $form_state['values']['help'];
   $type->title_label = $form_state['values']['title_label'];
-  $type->body_label = $form_state['values']['body_label'];
-
   // title_label is required in core; has_title will always be true, unless a
   // module alters the title field.
   $type->has_title = ($type->title_label != '');
-  $type->has_body = ($type->body_label != '');
 
   $type->base = !empty($form_state['values']['base']) ? $form_state['values']['base'] : 'node_content';
   $type->custom = $form_state['values']['custom'];
@@ -372,6 +363,7 @@ function node_type_form_submit($form, &$
 
   node_types_rebuild();
   menu_rebuild();
+  node_add_body_field($type);
   $t_args = array('%name' => $type->name);
 
   if ($status == SAVED_UPDATED) {
Index: modules/node/content_types.js
===================================================================
RCS file: /cvs/drupal/drupal/modules/node/content_types.js,v
retrieving revision 1.9
diff -u -p -r1.9 content_types.js
--- modules/node/content_types.js	9 Apr 2010 12:24:53 -0000	1.9
+++ modules/node/content_types.js	2 May 2010 11:39:17 -0000
@@ -7,7 +7,6 @@ Drupal.behaviors.contentTypes = {
     $('fieldset#edit-submission', context).drupalSetSummary(function(context) {
       var vals = [];
       vals.push(Drupal.checkPlain($('#edit-title-label', context).val()) || Drupal.t('Requires a title'));
-      vals.push(Drupal.checkPlain($('#edit-body-label', context).val()) || Drupal.t('No body'));
       return vals.join(', ');
     });
     $('fieldset#edit-workflow', context).drupalSetSummary(function(context) {
Index: modules/node/node.api.php
===================================================================
RCS file: /cvs/drupal/drupal/modules/node/node.api.php,v
retrieving revision 1.66
diff -u -p -r1.66 node.api.php
--- modules/node/node.api.php	26 Mar 2010 17:14:45 -0000	1.66
+++ modules/node/node.api.php	2 May 2010 11:39:17 -0000
@@ -771,10 +771,6 @@ function hook_node_view_alter(&$build) {
  *      field. Optional (defaults to TRUE).
  *   - "title_label": the label for the title field of this content type.
  *      Optional (defaults to 'Title').
- *   - "has_body": boolean indicating whether or not this node type has a body
- *      field. Optional (defaults to TRUE).
- *   - "body_label": the label for the body field of this content type. Optional
- *      (defaults to 'Body').
  *   - "locked": boolean indicating whether the administrator can change the
  *      machine name of this type. FALSE = changeable (not locked),
  *      TRUE = unchangeable (locked). Optional (defaults to TRUE).
@@ -986,17 +982,6 @@ function hook_prepare($node) {
 function hook_form($node, $form_state) {
   $type = node_type_get_type($node);
 
-  $form['title'] = array(
-    '#type' => 'textfield',
-    '#title' => check_plain($type->title_label),
-    '#required' => TRUE,
-  );
-  $form['body'] = array(
-    '#type' => 'textarea',
-    '#title' => check_plain($type->body_label),
-    '#rows' => 20,
-    '#required' => TRUE,
-  );
   $form['field1'] = array(
     '#type' => 'textfield',
     '#title' => t('Custom field'),
Index: modules/node/node.install
===================================================================
RCS file: /cvs/drupal/drupal/modules/node/node.install,v
retrieving revision 1.47
diff -u -p -r1.47 node.install
--- modules/node/node.install	28 Apr 2010 05:14:33 -0000	1.47
+++ modules/node/node.install	2 May 2010 11:39:17 -0000
@@ -306,21 +306,6 @@ function node_schema() {
         'default' => '',
         'translatable' => TRUE,
       ),
-      'has_body' => array(
-        'description' => 'Boolean indicating whether this type has the body field attached.',
-        'type' => 'int',
-        'unsigned' => TRUE,
-        'not null' => TRUE,
-        'size' => 'tiny',
-      ),
-      'body_label' => array(
-        'description' => 'The label displayed for the body field on the edit form.',
-        'type' => 'varchar',
-        'length' => 255,
-        'not null' => TRUE,
-        'default' => '',
-        'translatable' => TRUE,
-      ),
       'custom' => array(
         'description' => 'A boolean indicating whether this type is defined by a module (FALSE) or by a user via Add content type (TRUE).',
         'type' => 'int',
@@ -496,30 +481,39 @@ function node_update_7005() {
 /**
  * Convert body and teaser from node properties to fields, and migrate status/comment/promote and sticky columns to the {node_revision} table.
  */
-function node_update_7006(&$context) {
-  $context['#finished'] = 0;
+function node_update_7006(&$sandbox) {
+  $sandbox['#finished'] = 0;
 
   // Get node type info for every invocation.
   drupal_static_reset('_node_types_build');
   $node_types = node_type_get_types();
 
-  if (!isset($context['total'])) {
+  if (!isset($sandbox['total'])) {
     // Initial invocation.
 
-    // Re-save node types to create body field instances.
-    foreach ($node_types as $type => $info) {
-      if ($info->has_body) {
-        node_type_save($info);
+    // Get node type info, specifically the body field settings.
+    $result = db_select('node_type', 'node_type')
+      ->fields('node_type')
+      ->execute();
+
+    // Add body field instances for existing node types.
+    foreach ($result as $node_type) {
+      if ($node_type->has_body) {
+        node_add_body_field($node_type->type, $node_type->body_label);
       }
+
+      $sandbox['node_types_info'][$node_type->type] = array(
+        'has_body' => $node_type->has_body,
+      );
     }
 
     // Initialize state for future calls.
-    $context['last'] = 0;
-    $context['count'] = 0;
+    $sandbox['last'] = 0;
+    $sandbox['count'] = 0;
 
     $query = db_select('node', 'n');
     $query->join('node_revision', 'nr', 'n.vid = nr.vid');
-    $context['total'] = $query->countQuery()->execute()->fetchField();
+    $sandbox['total'] = $query->countQuery()->execute()->fetchField();
   }
   else {
     // Subsequent invocations.
@@ -529,7 +523,7 @@ function node_update_7006(&$context) {
     $body_field_id = $body_field['id'];
 
     $found = FALSE;
-    if ($context['total']) {
+    if ($sandbox['total']) {
       // Operate on every revision of every node (whee!), in batches.
       $batch_size = 200;
       $query = db_select('node_revision', 'nr');
@@ -552,7 +546,7 @@ function node_update_7006(&$context) {
       foreach ($revisions as $revision) {
         $found = TRUE;
 
-        if ($node_types[$revision->type]->has_body) {
+        if ($sandbox['node_types_info'][$revision->type]['has_body']) {
           $node = (object) array(
             'nid' => $revision->nid,
             'vid' => $revision->vid,
@@ -592,11 +586,11 @@ function node_update_7006(&$context) {
           ->condition('vid', $revision->vid)
           ->execute();
 
-        $context['last'] = $revision->vid;
-        $context['count'] += 1;
+        $sandbox['last'] = $revision->vid;
+        $sandbox['count'] += 1;
       }
 
-      $context['#finished'] = min(0.99, $context['count'] / $context['total']);
+      $context['#finished'] = min(0.99, $sandbox['count'] / $sandbox['total']);
     }
 
     if (!$found) {
@@ -607,9 +601,12 @@ function node_update_7006(&$context) {
       db_drop_field('node_revision', 'teaser');
       db_drop_field('node_revision', 'format');
 
+      // Remove node_type properties related to the former 'body'.
+      db_drop_field('node_type', 'has_body');
+      db_drop_field('node_type', 'body_label');
+
       // We're done.
-      $context['#finished'] = 1;
-      return t("!number node body and teaser properties migrated to the 'body' field.", array('!number' => $context['total']));
+      $sandbox['#finished'] = 1;
     }
   }
 }
Index: modules/node/node.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/node/node.module,v
retrieving revision 1.1264
diff -u -p -r1.1264 node.module
--- modules/node/node.module	22 Apr 2010 09:12:35 -0000	1.1264
+++ modules/node/node.module	2 May 2010 11:39:18 -0000
@@ -496,8 +496,6 @@ function node_type_save($info) {
     'base' => (string) $type->base,
     'has_title' => (int) $type->has_title,
     'title_label' => (string) $type->title_label,
-    'has_body' => (int) $type->has_body,
-    'body_label' => (string) $type->body_label,
     'description' => (string) $type->description,
     'help' => (string) $type->help,
     'custom' => (int) $type->custom,
@@ -514,7 +512,6 @@ function node_type_save($info) {
     if (!empty($type->old_type) && $type->old_type != $type->type) {
       field_attach_rename_bundle('node', $type->old_type, $type->type);
     }
-    node_configure_fields($type);
     module_invoke_all('node_type_update', $type);
     $status = SAVED_UPDATED;
   }
@@ -525,7 +522,7 @@ function node_type_save($info) {
       ->execute();
 
     field_attach_create_bundle('node', $type->type);
-    node_configure_fields($type);
+
     module_invoke_all('node_type_insert', $type);
     $status = SAVED_NEW;
   }
@@ -537,60 +534,48 @@ function node_type_save($info) {
 }
 
 /**
- * Manage the field(s) for a node type.
+ * Add default body field to a node type.
  *
- * Currently, the node module manages a single Field API field,
- * 'body'.  If $type->has_body is true, this function ensures the
- * 'body' field exists and creates an instance of it for the bundle
- * $type->type (e.g. 'page', 'story', ...).  If $type->has_body is
- * false, this function removes the instance (if it exists) for the
- * 'body' field on $type->type.
+ * @param $type
+ *   The node type name.
+ * @param $label
+ *   The label for the body instance.
  */
-function node_configure_fields($type) {
+function node_add_body_field($type, $label = 'Body') {
    // Add or remove the body field, as needed.
   $field = field_info_field('body');
   $instance = field_info_instance('node', 'body', $type->type);
-  if ($type->has_body) {
-    if (empty($field)) {
-      $field = array(
-        'field_name' => 'body',
-        'type' => 'text_with_summary',
-        'entity_types' => array('node'),
-        'translatable' => TRUE,
-      );
-      $field = field_create_field($field);
-    }
-    if (empty($instance)) {
-      $instance = array(
-        'field_name' => 'body',
-        'entity_type' => 'node',
-        'bundle' => $type->type,
-        'label' => $type->body_label,
-        'widget_type' => 'text_textarea_with_summary',
-        'settings' => array('display_summary' => TRUE),
-
-        // Define default formatters for the teaser and full view.
-        'display' => array(
-          'full' => array(
-            'label' => 'hidden',
-            'type' => 'text_default',
-          ),
-          'teaser' => array(
-            'label' => 'hidden',
-            'type' => 'text_summary_or_trimmed',
-          ),
+  if (empty($field)) {
+    $field = array(
+      'field_name' => 'body',
+      'type' => 'text_with_summary',
+      'entity_types' => array('node'),
+      'translatable' => TRUE,
+    );
+    $field = field_create_field($field);
+  }
+  if (empty($instance)) {
+    $instance = array(
+      'field_name' => 'body',
+      'entity_type' => 'node',
+      'bundle' => $type->type,
+      'label' => $label,
+      'widget_type' => 'text_textarea_with_summary',
+      'settings' => array('display_summary' => TRUE),
+
+      // Define default formatters for the teaser and full view.
+      'display' => array(
+        'full' => array(
+          'label' => 'hidden',
+          'type' => 'text_default',
         ),
-      );
-      field_create_instance($instance);
-    }
-    else {
-      $instance['label'] = $type->body_label;
-      $instance['settings']['display_summary'] = TRUE;
-      field_update_instance($instance);
-    }
-  }
-  elseif (!empty($instance)) {
-    field_delete_instance($instance);
+        'teaser' => array(
+          'label' => 'hidden',
+          'type' => 'text_summary_or_trimmed',
+        ),
+      ),
+    );
+    field_create_instance($instance);
   }
 }
 
@@ -737,14 +722,13 @@ function node_type_set_defaults($info = 
     $type->base = '';
     $type->description = '';
     $type->help = '';
-    $type->has_title = 1;
-    $type->has_body = 1;
-    $type->title_label = t('Title');
-    $type->body_label = t('Body');
     $type->custom = 0;
     $type->modified = 0;
     $type->locked = 1;
     $type->is_new = 1;
+
+    $type->has_title = 1;
+    $type->title_label = 'Title';
   }
 
   $new_type = clone $type;
@@ -752,13 +736,10 @@ function node_type_set_defaults($info = 
   foreach ($info as $key => $data) {
     $new_type->$key = $data;
   }
-  // If the type has no title or body, set an empty label.
+  // If the type has no title, set an empty label.
   if (!$new_type->has_title) {
     $new_type->title_label = '';
   }
-  if (!$new_type->has_body) {
-    $new_type->body_label = '';
-  }
   $new_type->orig_type = isset($info['type']) ? $info['type'] : '';
 
   return $new_type;
Index: modules/node/node.test
===================================================================
RCS file: /cvs/drupal/drupal/modules/node/node.test,v
retrieving revision 1.81
diff -u -p -r1.81 node.test
--- modules/node/node.test	20 Apr 2010 09:48:06 -0000	1.81
+++ modules/node/node.test	2 May 2010 11:39:19 -0000
@@ -1087,39 +1087,33 @@ class NodeTypeTestCase extends DrupalWeb
     $this->assertRaw('Title', t('Title field was found.'));
     $this->assertRaw('Body', t('Body field was found.'));
 
-    // Rename the title field and remove the body field.
+    // Rename the title field.
     $edit = array(
       'title_label' => 'Foo',
-      'body_label' => '',
     );
     $this->drupalPost('admin/structure/types/manage/page', $edit, t('Save content type'));
+    // Refresh the field information for the rest of the test.
     field_info_cache_clear();
 
-    $this->assertFalse(field_info_instance('node', 'body', 'page'), t('Body field was removed.'));
     $this->drupalGet('node/add/page');
     $this->assertRaw('Foo', t('New title label was displayed.'));
     $this->assertNoRaw('Title', t('Old title label was not displayed.'));
-    $this->assertNoRaw('Full text', t('Body field was not found.'));
 
-    // Add the body field again and change the name, machine name and description.
+    // Change the name, machine name and description.
     $edit = array(
       'name' => 'Bar',
       'type' => 'bar',
       'description' => 'Lorem ipsum.',
-      'body_label' => 'Baz',
     );
     $this->drupalPost('admin/structure/types/manage/page', $edit, t('Save content type'));
-    field_info_cache_clear();
 
-    $instance = field_info_instance('node', 'body', 'bar');
-    $this->assertEqual($instance['label'], 'Baz', t('Body field was added.'));
     $this->drupalGet('node/add');
     $this->assertRaw('Bar', t('New name was displayed.'));
     $this->assertRaw('Lorem ipsum', t('New description was displayed.'));
     $this->clickLink('Bar');
     $this->assertEqual(url('node/add/bar', array('absolute' => TRUE)), $this->getUrl(), t('New machine name was used in URL.'));
     $this->assertRaw('Foo', t('Title field was found.'));
-    $this->assertRaw('Baz', t('Body field was found.'));
+    $this->assertRaw('Body', t('Body field was found.'));
   }
 }
 
Index: modules/simpletest/drupal_web_test_case.php
===================================================================
RCS file: /cvs/drupal/drupal/modules/simpletest/drupal_web_test_case.php,v
retrieving revision 1.213
diff -u -p -r1.213 drupal_web_test_case.php
--- modules/simpletest/drupal_web_test_case.php	1 May 2010 08:12:23 -0000	1.213
+++ modules/simpletest/drupal_web_test_case.php	2 May 2010 11:39:20 -0000
@@ -842,6 +842,7 @@ class DrupalWebTestCase extends DrupalTe
     $saved_type = node_type_save($type);
     node_types_rebuild();
     menu_rebuild();
+    node_add_body_field($type);
 
     $this->assertEqual($saved_type, SAVED_NEW, t('Created content type %type.', array('%type' => $type->type)));
 
Index: profiles/standard/standard.install
===================================================================
RCS file: /cvs/drupal/drupal/profiles/standard/standard.install,v
retrieving revision 1.13
diff -u -p -r1.13 standard.install
--- profiles/standard/standard.install	22 Apr 2010 09:55:32 -0000	1.13
+++ profiles/standard/standard.install	2 May 2010 11:39:20 -0000
@@ -227,6 +227,7 @@ function standard_install() {
   foreach ($types as $type) {
     $type = node_type_set_defaults($type);
     node_type_save($type);
+    node_add_body_field($type);
   }
 
   // Insert default pre-defined RDF mapping into the database.
