diff --git a/modules/field/field.module b/modules/field/field.module
index 4331cdf..fb8650d 100644
--- a/modules/field/field.module
+++ b/modules/field/field.module
@@ -391,6 +391,34 @@ function field_system_info_alter(&$info, $file, $type) {
 }
 
 /**
+ * Implements hook_field_widget_info().
+ */
+function field_field_widget_info() {
+  $widget['field_hidden'] = array(
+    'label' => t('Hidden'),
+    'description' => t('A widget that is completely hidden.'),
+    'field types' => array_keys(field_info_field_types()),
+    'settings' => array(),
+    'behaviors' => array(
+      'multiple values' => FIELD_BEHAVIOR_CUSTOM,
+      'default value' => FIELD_BEHAVIOR_DEFAULT,
+    ),
+    'weight' => 10,
+  );
+
+  return $widget;
+}
+
+/**
+ * Implements hook_field_widget_form().
+ */
+function field_field_widget_form(&$form, &$form_state, $field, $instance, $langcode, $items, $delta, $element) {
+  if ($instance['widget']['type'] == 'field_hidden') {
+     return array();
+  }
+}
+
+/**
  * Implements hook_flush_caches().
  */
 function field_flush_caches() {
diff --git a/modules/field_ui/field_ui.admin.inc b/modules/field_ui/field_ui.admin.inc
index 5c6f529..1698613 100644
--- a/modules/field_ui/field_ui.admin.inc
+++ b/modules/field_ui/field_ui.admin.inc
@@ -1713,6 +1713,10 @@ function field_ui_widget_type_form_submit($form, &$form_state) {
   try {
     field_update_instance($instance);
     drupal_set_message(t('Changed the widget for field %label.', array('%label' => $instance['label'])));
+
+    if ($instance['required'] && empty($instance['default_value']) && empty($instance['default_value_function']) && $instance['widget']['type'] == 'field_hidden') {
+      drupal_set_message(t('Field %label is required and uses the "hidden" widget. You might want to configure a default value.', array('%label' => $instance['label'])), 'warning');
+    }
   }
   catch (Exception $e) {
     drupal_set_message(t('There was a problem changing the widget for field %label.', array('%label' => $instance['label'])), 'error');
@@ -1999,6 +2003,20 @@ function field_ui_default_value_widget($field, $instance, &$form, &$form_state)
   $instance['required'] = FALSE;
   $instance['description'] = '';
 
+  // Adjust the instance definition to use the default widget of this field type
+  // instead of the hidden widget.
+  if ($instance['widget']['type'] == 'field_hidden') {
+    $field_type = field_info_field_types($field['type']);
+    $default_widget = field_info_widget_types($field_type['default_widget']);
+
+    $instance['widget'] = array(
+      'type' => $field_type['default_widget'],
+      'settings' => $default_widget['settings'],
+      'module' => $default_widget['module'],
+      'weight' => 0,
+    );
+  }
+
   // @todo Allow multiple values (requires more work on 'add more' JS handler).
   $element += field_default_form($instance['entity_type'], NULL, $field, $instance, LANGUAGE_NONE, $items, $element, $form_state, 0);
 
@@ -2081,6 +2099,10 @@ function field_ui_field_edit_form_submit($form, &$form_state) {
 
   drupal_set_message(t('Saved %label configuration.', array('%label' => $instance['label'])));
 
+  if ($instance['required'] && empty($instance['default_value']) && empty($instance['default_value_function']) && $instance['widget']['type'] == 'field_hidden') {
+    drupal_set_message(t('Field %label is required and uses the "hidden" widget. You might want to configure a default value.', array('%label' => $instance['label'])), 'warning');
+  }
+
   $form_state['redirect'] = field_ui_next_destination($instance['entity_type'], $instance['bundle']);
 }
 
