=== modified file 'modules/field/field.info.inc'
--- modules/field/field.info.inc	2010-08-03 23:01:14 +0000
+++ modules/field/field.info.inc	2010-08-20 19:25:21 +0000
@@ -301,16 +301,21 @@ function _field_info_prepare_instance($i
     $instance['display'][$view_mode] = _field_info_prepare_instance_display($field, $display);
   }
 
-  // Fallback to 'hidden' for unspecified view modes.
+  // Fallback to 'hidden' or the default view mode for unspecified view modes.
   $entity_info = entity_get_info($instance['entity_type']);
   foreach ($entity_info['view modes'] as $view_mode => $info) {
     if (!isset($instance['display'][$view_mode])) {
-      $instance['display'][$view_mode] = array(
-        'type' => 'hidden',
-        'label' => 'above',
-        'settings' => array(),
-        'weight' => 0,
-      );
+      if (isset($info['defaults to hidden']) && !$info['defaults to hidden'] && isset($instance['display']['default'])) {
+        $instance['display'][$view_mode] = $instance['display']['default'];
+      }
+      else {
+        $instance['display'][$view_mode] = array(
+          'type' => 'hidden',
+          'label' => 'above',
+          'settings' => array(),
+          'weight' => 0,
+        );
+      }
     }
   }
 

=== modified file 'modules/node/node.module'
--- modules/node/node.module	2010-08-11 14:21:38 +0000
+++ modules/node/node.module	2010-08-20 15:06:18 +0000
@@ -190,6 +190,7 @@ function node_entity_info() {
         'full' => array(
           'label' => t('Full content'),
           'custom settings' => FALSE,
+          'defaults to hidden' => FALSE,
         ),
         'teaser' => array(
           'label' => t('Teaser'),
@@ -210,6 +211,7 @@ function node_entity_info() {
       'search_index' => array(
         'label' => t('Search index'),
         'custom settings' => FALSE,
+        'defaults to hidden' => FALSE,
       ),
       'search_result' => array(
         'label' => t('Search result'),

=== modified file 'modules/node/node.test'
--- modules/node/node.test	2010-08-08 13:02:37 +0000
+++ modules/node/node.test	2010-08-20 19:17:09 +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']);
+  }
+}

=== modified file 'modules/system/system.api.php'
--- modules/system/system.api.php	2010-08-08 19:45:37 +0000
+++ modules/system/system.api.php	2010-08-20 19:22:26 +0000
@@ -152,6 +152,10 @@ function hook_hook_info_alter(&$hooks) {
  *       by default (e.g. right after the module exposing the view mode is
  *       enabled), but administrators can later use the Field UI to apply custom
  *       display settings specific to the view mode.
+ *     - defaults to hidden: When TRUE, instances not defining settings for
+ *       this view mode will be hidden. When FALSE, these instances use the
+ *       settings set up for the 'default' view mode if such is defined,
+ *       otherwise it still falls back to hidden. Defaults to TRUE.
  *
  * @see entity_load()
  * @see hook_entity_info_alter()

