=== modified file 'modules/field/field.api.php'
--- modules/field/field.api.php	2010-08-03 01:54:24 +0000
+++ modules/field/field.api.php	2010-08-22 14:23:48 +0000
@@ -2439,3 +2439,36 @@ function hook_field_access($op, $field, 
   }
   return TRUE;
 }
+
+/**
+ * Act when custom settings is introduced to a view mode.
+ *
+ * This hook is fired from the field UI "Manage display" screen when a view
+ * mode is selected for custom display settings. An API call to
+ * field_bundle_settings() with a non-NULL $settings array achieving the same
+ * will also fire this hook.
+ *
+ * @param $settings
+ *   @see field_bundle_settings for the structure of this array.
+ * @param $entity_type
+ *   The entity type.
+ * @param $bundle
+ *   The bundle being configured.
+ */
+function hook_field_bundle_settings($settings, $entity_type, $bundle) {
+  $old_settings = isset($stored_settings[$entity_type][$bundle]) ? $stored_settings[$entity_type][$bundle] : array();
+  // initialize it with the current settings for the 'default' mode.
+  foreach (array_keys($settings['view_modes']) as $view_mode) {
+    if ($settings['view_modes'][$view_mode]['custom_settings'] && empty($old_settings['view_modes'][$view_mode]['custom_settings'])) {
+      // Update display settings for field instances.
+      foreach (field_info_instances($entity_type, $bundle) as $instance) {
+        $instance['display'][$view_mode] = $instance['display']['default'];
+        field_update_instance($instance);
+      }
+      // Update display settings for 'extra fields'.
+      foreach (array_keys($settings['extra_fields']['display']) as $name) {
+        $settings['extra_fields']['display'][$name][$view_mode] = $settings['extra_fields']['display'][$name]['default'];
+      }
+    }
+  }
+}

=== modified file 'modules/field/field.module'
--- modules/field/field.module	2010-08-14 03:10:04 +0000
+++ modules/field/field.module	2010-08-22 14:22:59 +0000
@@ -373,7 +373,7 @@ function _field_sort_items_value_helper(
  *       'extra_field_2' => ...
  *     ),
  *   ),
- * ),
+ * );
  * @endcode
  *
  * @param $entity_type
@@ -390,7 +390,25 @@ function field_bundle_settings($entity_t
   $stored_settings = variable_get('field_bundle_settings', array());
 
   if (isset($settings)) {
+    $old_settings = isset($stored_settings[$entity_type][$bundle]) ? $stored_settings[$entity_type][$bundle] : array();
+    // When a view mode gets specialized to use custom display settings,
+    // initialize it with the current settings for the 'default' mode.
+    foreach (array_keys($settings['view_modes']) as $view_mode) {
+      if ($settings['view_modes'][$view_mode]['custom_settings'] && empty($old_settings['view_modes'][$view_mode]['custom_settings'])) {
+        // Update display settings for field instances.
+        foreach (field_info_instances($entity_type, $bundle) as $instance) {
+          $instance['display'][$view_mode] = $instance['display']['default'];
+          field_update_instance($instance);
+        }
+        // Update display settings for 'extra fields'.
+        foreach (array_keys($settings['extra_fields']['display']) as $name) {
+          $settings['extra_fields']['display'][$name][$view_mode] = $settings['extra_fields']['display'][$name]['default'];
+        }
+      }
+    }
+    module_invoke_all('field_bundle_settings', $settings, $entity_type, $bundle);
     $stored_settings[$entity_type][$bundle] = $settings;
+
     variable_set('field_bundle_settings', $stored_settings);
     drupal_static_reset('field_view_mode_settings');
     field_info_cache_clear();
@@ -401,6 +419,10 @@ function field_bundle_settings($entity_t
       'view_modes' => array(),
       'extra_fields' => array(),
     );
+    $settings['extra_fields'] += array(
+      'form' => array(),
+      'display' => array(),
+    );
 
     return $settings;
   }

=== modified file 'modules/node/node.test'
--- modules/node/node.test	2010-08-08 13:02:37 +0000
+++ modules/node/node.test	2010-08-22 14:22:30 +0000
@@ -1767,3 +1767,31 @@ class NodeTokenReplaceTestCase extends D
     }
   }
 }
+
+class NodeCustomViewModeTest extends DrupalWebTestCase {
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Custom view mode',
+      'description' => 'Customize full view mode and make sure fields still displays.',
+      'group' => 'Node',
+    );
+  }
+
+  function setUp() {
+    parent::setUp();
+    $this->admin_user = $this->drupalCreateUser(array('administer content types'));
+    $this->drupalLogin($this->admin_user);
+  }
+
+  function testCustomViewMode() {
+    $node = $this->drupalCreateNode();
+    $edit['view_modes_custom[full]'] = TRUE;
+    $edit['view_modes_custom[rss]'] = TRUE;
+    $this->drupalGet("node/$node->nid");
+    $this->assertText($node->body[LANGUAGE_NONE][0]['value']);
+    $this->drupalPost('admin/structure/types/manage/page/display', $edit, t('Save'));
+    $this->drupalGet("node/$node->nid");
+    $this->assertText($node->body[LANGUAGE_NONE][0]['value']);
+  }
+}

