diff --git modules/field/field.default.inc modules/field/field.default.inc
index 5dce9de..3fe6a33 100644
--- modules/field/field.default.inc
+++ modules/field/field.default.inc
@@ -61,7 +61,7 @@ function field_default_insert($obj_type, $object, $field, $instance, &$items) {
  * field in a single theme. The multiple value formatters could be used, for
  * instance, to plot field values on a single map or display them in a graph.
  * Single value formatters are the default, multiple value formatters can be
- * designated as such in formatter_info().
+ * designated as such in hook_formatter_info().
  *
  * The $object array will look like:
  *   $object->content['field_foo'] = array(
@@ -77,6 +77,7 @@ function field_default_insert($obj_type, $object, $field, $instance, &$items) {
  *         '#item' => $items[0],
  *         // Only for 'single-value' formatters
  *         '#theme' => $theme,
+ *         '#theme_wrappers => array('field-item'),
  *         '#field_name' => 'field_name',
  *         '#bundle' => $bundle,
  *         '#formatter' => $formatter_name,
@@ -89,6 +90,7 @@ function field_default_insert($obj_type, $object, $field, $instance, &$items) {
  *         '#item' => $items[1],
  *         // Only for 'single-value' formatters
  *         '#theme' => $theme,
+ *         '#theme_wrappers => array('field-item'),
  *         '#field_name' => 'field_name',
  *         '#bundle' => $bundle_name,
  *         '#formatter' => $formatter_name,
@@ -99,6 +101,7 @@ function field_default_insert($obj_type, $object, $field, $instance, &$items) {
  *       ),
  *       // Only for 'multiple-value' formatters
  *       '#theme' => $theme,
+ *       '#theme_wrappers => array('field-item'),
  *       '#field_name' => 'field_name',
  *       '#bundle' => $bundle_name,
  *       '#formatter' => $formatter_name,
@@ -146,6 +149,8 @@ function field_default_view($obj_type, $object, $field, $instance, $items, $buil
       $element['items'][$delta] = array(
         '#item' => $item,
         '#weight' => $delta,
+        '#label_display' => $label_display,
+        '#label' => check_plain(t($instance['label'])),
       );
     }
 
@@ -155,6 +160,7 @@ function field_default_view($obj_type, $object, $field, $instance, $items, $buil
       '#formatter' => $display['type'],
       '#settings' => $display['settings'],
       '#theme' => $theme,
+      '#theme_wrappers' => array('field_item'),
     );
 
     if ($single) {
diff --git modules/field/field.module modules/field/field.module
index 31db738..081e7cb 100644
--- modules/field/field.module
+++ modules/field/field.module
@@ -171,6 +171,11 @@ function field_theme() {
       'arguments' => array('element' => NULL),
       'path' => $path,
     ),
+    'field_item' => array(
+      'template' => 'field-item',
+      'arguments' => array('element' => NULL),
+      'path' => $path,
+    ),
     'field_multiple_value_form' => array(
       'arguments' => array('element' => NULL),
     ),
@@ -542,14 +547,26 @@ function field_access($op, $field, $account = NULL) {
 }
 
 /**
+ * Theme preprocess function for field-item.tpl.php.
+ *
+ * @see field-item.tpl.php
+ */
+function template_preprocess_field_item(&$variables) {
+  $element = $variables['element'];
+  $variables += array(
+    'delta' => $element['#item']['#delta'],
+    'label' => check_plain(t($element['#label'])),
+    'label_display' => $element['#label_display'],
+    'content' => $element['#children'], 
+  );
+}
+
+/**
  * Theme preprocess function for field.tpl.php.
  *
  * The $variables array contains the following arguments:
  * - $object
  * - $field
- * - $items
- * - $teaser
- * - $page
  *
  * @see field.tpl.php
  */
@@ -562,49 +579,17 @@ function template_preprocess_field(&$variables) {
   $variables['object'] = $element['#object'];
   $variables['field'] = $field;
   $variables['instance'] = $instance;
-  $variables['items'] = array();
-
-  if ($element['#single']) {
-    // Single value formatter.
-    foreach (element_children($element['items']) as $delta) {
-      $variables['items'][$delta] = $element['items'][$delta]['#item'];
-      $variables['items'][$delta]['view'] = drupal_render_children($element['items'], array($delta));
-    }
-  }
-  else {
-    // Multiple values formatter.
-    // We display the 'all items' output as $items[0], as if it was the
-    // output of a single valued field.
-    // Raw values are still exposed for all items.
-    foreach (element_children($element['items']) as $delta) {
-      $variables['items'][$delta] = $element['items'][$delta]['#item'];
-    }
-    $variables['items'][0]['view'] = drupal_render_children($element, array('items'));
-  }
 
   $variables['build_mode'] = $element['#build_mode'];
-  $variables['page'] = (bool)menu_get_object();
-
-  $field_empty = TRUE;
-
-  foreach ($variables['items'] as $delta => $item) {
-    if (!isset($item['view']) || (empty($item['view']) && (string)$item['view'] !== '0')) {
-      $variables['items'][$delta]['empty'] = TRUE;
-    }
-    else {
-      $field_empty = FALSE;
-      $variables['items'][$delta]['empty'] = FALSE;
-    }
-  }
 
   $additions = array(
+    'content' => $element['items'],
     'field_type' => $field['type'],
     'field_name' => $field['field_name'],
     'field_type_css' => strtr($field['type'], '_', '-'),
     'field_name_css' => strtr($field['field_name'], '_', '-'),
     'label' => check_plain(t($instance['label'])),
     'label_display' => $element['#label_display'],
-    'field_empty' => $field_empty,
     'template_files' => array(
       'field',
       'field-' . $element['#field_name'],
diff --git modules/field/theme/field.tpl.php modules/field/theme/field.tpl.php
index 992a063..2d23b9f 100644
--- modules/field/theme/field.tpl.php
+++ modules/field/theme/field.tpl.php
@@ -2,48 +2,31 @@
 // $Id: field.tpl.php,v 1.3 2009-06-22 09:10:04 dries Exp $
 
 /**
- * @file field-field.tpl.php
+ * @file field.tpl.php
  * Default theme implementation to display the value of a field.
  *
  * Available variables:
  * - $object: The object to which the field is attached.
  * - $field: The field array.
- * - $items: An array of values for each item in the field array.
  * - $build_mode: Build mode, e.g. 'full', 'teaser'...
- * - $page: Whether this is displayed as a page.
  * - $field_name: The field name.
  * - $field_type: The field type.
  * - $field_name_css: The css-compatible field name.
  * - $field_type_css: The css-compatible field type.
  * - $label: The item label.
  * - $label_display: Position of label display, inline, above, or hidden.
- * - $field_empty: Whether the field has any valid value.
- *
- * Each $item in $items contains:
- * - 'view' - the themed view for that item
+ * - $content - An array of field items. Use print render() output them.
  *
  * @see template_preprocess_field()
  */
 ?>
-<?php if (!$field_empty) : ?>
+<?php if (!empty($content)) : ?>
 <div class="field field-type-<?php print $field_type_css ?> field-<?php print $field_name_css ?>">
   <?php if ($label_display == 'above') : ?>
     <div class="field-label"><?php print t($label) ?>:&nbsp;</div>
   <?php endif;?>
   <div class="field-items">
-    <?php $count = 1;
-    foreach ($items as $delta => $item) :
-      if (!$item['empty']) : ?>
-        <div class="field-item <?php print ($count % 2 ? 'odd' : 'even') ?>">
-          <?php if ($label_display == 'inline') { ?>
-            <div class="field-label-inline<?php print($delta ? '' : '-first')?>">
-              <?php print t($label) ?>:&nbsp;</div>
-          <?php } ?>
-          <?php print $item['view'] ?>
-        </div>
-      <?php $count++;
-      endif;
-    endforeach;?>
+    <?php print render($content) ?>
   </div>
 </div>
 <?php endif; ?>
