Index: modules/field/field.attach.inc
===================================================================
RCS file: /cvs/drupal/drupal/modules/field/field.attach.inc,v
retrieving revision 1.96
diff -u -p -r1.96 field.attach.inc
--- modules/field/field.attach.inc	3 Oct 2010 01:15:33 -0000	1.96
+++ modules/field/field.attach.inc	18 Oct 2010 12:21:04 -0000
@@ -179,6 +179,11 @@ function _field_invoke($op, $entity_type
   );
   $options += $default_options;
 
+  // Determine namespace for the parents of this field instance
+  if (isset($options['parents'])) {
+    $namespace = count($options['parents']) ? implode('_', $options['parents']) : 'default';
+  }
+
   // Determine the list of instances to iterate on.
   list(, , $bundle) = entity_extract_ids($entity_type, $entity);
   $instances = _field_invoke_get_instances($entity_type, $bundle, $options);
@@ -188,6 +193,9 @@ function _field_invoke($op, $entity_type
   foreach ($instances as $instance) {
     $field_name = $instance['field_name'];
     $field = field_info_field($field_name);
+    if (isset($options['parents'])) {
+      $instance['parents'][$namespace] = $options['parents'];
+    }
     $function = $options['default'] ? 'field_default_' . $op : $field['module'] . '_field_' . $op;
     if (function_exists($function)) {
       // Determine the list of languages to iterate on.
@@ -531,14 +539,21 @@ function _field_invoke_get_instances($en
  * @param $langcode
  *   The language the field values are going to be entered, if no language
  *   is provided the default site language will be used.
+ * @param $parents
+ *   The array of parents representing position of $entity and its fields in
+ *   form array. This will be used as unique namespace for entity fields, their
+ *   values and settings.
  * @return
  *   The form elements are added by reference at the top level of the $form
  *   parameter. Processing information is added by reference in
  *   $form_state['field'].
  */
-function field_attach_form($entity_type, $entity, &$form, &$form_state, $langcode = NULL) {
+function field_attach_form($entity_type, $entity, &$form, &$form_state, $langcode = NULL, $parents = array()) {
   // If no language is provided use the default site language.
-  $options = array('language' => field_valid_language($langcode));
+  $options = array(
+    'language' => field_valid_language($langcode),
+    'parents' => $parents,
+  );
   $form += (array) _field_invoke_default('form', $entity_type, $entity, $form, $form_state, $options);
 
   // Add custom weight handling.
@@ -786,9 +801,9 @@ function field_attach_validate($entity_t
  * @param $form_state
  *   An associative array containing the current state of the form.
  */
-function field_attach_form_validate($entity_type, $entity, $form, &$form_state) {
+function field_attach_form_validate($entity_type, $entity, $form, &$form_state, $parents = array()) {
   // Extract field values from submitted values.
-  _field_invoke_default('extract_form_values', $entity_type, $entity, $form, $form_state);
+  _field_invoke_default('extract_form_values', $entity_type, $entity, $form, $form_state, array('parents' => $parents));
 
   // Perform field_level validation.
   try {
@@ -799,10 +814,10 @@ function field_attach_form_validate($ent
     // flagging.
     foreach ($e->errors as $field_name => $field_errors) {
       foreach ($field_errors as $langcode => $language_errors) {
-        $form_state['field'][$field_name][$langcode]['errors'] = $language_errors;
+        drupal_array_set_nested_value($form_state['field'][$field_name][$langcode], array_merge($parents, array('errors')), $language_errors);
       }
     }
-    _field_invoke_default('form_errors', $entity_type, $entity, $form, $form_state);
+    _field_invoke_default('form_errors', $entity_type, $entity, $form, $form_state, array('parents' => $parents));
   }
 }
 
@@ -823,11 +838,11 @@ function field_attach_form_validate($ent
  * @param $form_state
  *   An associative array containing the current state of the form.
  */
-function field_attach_submit($entity_type, $entity, $form, &$form_state) {
+function field_attach_submit($entity_type, $entity, $form, &$form_state, $parents = array()) {
   // Extract field values from submitted values.
-  _field_invoke_default('extract_form_values', $entity_type, $entity, $form, $form_state);
+  _field_invoke_default('extract_form_values', $entity_type, $entity, $form, $form_state, array('parents' => $parents));
 
-  _field_invoke_default('submit', $entity_type, $entity, $form, $form_state);
+  _field_invoke_default('submit', $entity_type, $entity, $form, $form_state, array('parents' => $parents));
 
   // Let other modules act on submitting the entity.
   // Avoid module_invoke_all() to let $form_state be taken by reference.
Index: modules/field/field.default.inc
===================================================================
RCS file: /cvs/drupal/drupal/modules/field/field.default.inc,v
retrieving revision 1.39
diff -u -p -r1.39 field.default.inc
--- modules/field/field.default.inc	4 Aug 2010 06:55:35 -0000	1.39
+++ modules/field/field.default.inc	18 Oct 2010 12:21:04 -0000
@@ -13,9 +13,13 @@
 
 function field_default_extract_form_values($entity_type, $entity, $field, $instance, $langcode, &$items, $form, &$form_state) {
   $field_name = $field['field_name'];
+  $namespace = key($instance['parents']);
+  $parents = $instance['parents'][$namespace];
 
-  if (isset($form_state['values'][$field_name][$langcode])) {
-    $items = $form_state['values'][$field_name][$langcode];
+  $values_exists = FALSE;
+  $values = drupal_array_get_nested_value($form_state['values'], array_merge($parents, array($field_name, $langcode)), $values_exists);
+  if ($values_exists) {
+    $items = $values;
     // Remove the 'value' of the 'add more' button.
     unset($items['add_more']);
   }
Index: modules/field/field.form.inc
===================================================================
RCS file: /cvs/drupal/drupal/modules/field/field.form.inc,v
retrieving revision 1.50
diff -u -p -r1.50 field.form.inc
--- modules/field/field.form.inc	17 Jun 2010 13:44:45 -0000	1.50
+++ modules/field/field.form.inc	18 Oct 2010 12:21:04 -0000
@@ -16,6 +16,9 @@ function field_default_form($entity_type
     list($id, , ) = entity_extract_ids($entity_type, $entity);
   }
 
+  $namespace = key($instance['parents']);
+  $parents = $instance['parents'][$namespace];
+
   $addition = array();
   $field_name = $field['field_name'];
   $addition[$field_name] = array();
@@ -71,14 +74,21 @@ function field_default_form($entity_type
 
   if ($elements) {
     // Store field information in $form_state.
-    $form_state['field'][$field_name][$langcode] = array(
-      'field' => $field,
-      'instance' => $instance,
-      // This entry will be populated at form build time.
-      'array_parents' => array(),
-      // This entry will be populated at form validation time.
-      'errors' => array(),
-    );
+    if (!isset($form_state['field'][$field_name][$langcode])) {
+      $form_state['field'][$field_name][$langcode] = array(
+        'field' => $field,
+        'instance' => $instance,
+        // This entry will be populated at form build time.
+        'array_parents' => array(),
+        // This entry will be populated at form validation time.
+        'errors' => array(),
+      );
+    }
+    // Just update instance information.
+    else {
+      $form_state['field'][$field_name][$langcode]['instance'] = array_merge($form_state['field'][$field_name][$langcode]['instance'], $instance);
+    }
+
 
     // Also aid in theming of field widgets by rendering a classified
     // container.
@@ -101,6 +111,8 @@ function field_default_form($entity_type
   $elements['#after_build'][] = 'field_form_element_after_build';
   $elements['#field_name'] = $field_name;
   $elements['#language'] = $langcode;
+  $elements['#namespace'] = $namespace;
+  $elements['#field_parents'] = $parents;
 
   $addition[$field_name] += array(
     '#tree' => TRUE,
@@ -123,14 +135,19 @@ function field_default_form($entity_type
  */
 function field_multiple_value_form($field, $instance, $langcode, $items, &$form, &$form_state) {
   $field_name = $field['field_name'];
+  $namespace = key($instance['parents']);
+  $parents = $instance['parents'][$namespace];
 
   // Determine the number of widgets to display.
   switch ($field['cardinality']) {
     case FIELD_CARDINALITY_UNLIMITED:
       $filled_items = _field_filter_items($field, $items);
-      $current_item_count = isset($form_state['field_item_count'][$field_name])
-                            ? $form_state['field_item_count'][$field_name]
-                            : count($items);
+      $key_exists = FALSE;
+      if (isset($form_state['field'][$field_name][$langcode])) {
+        $field_item_count = drupal_array_get_nested_value($form_state['field'][$field_name][$langcode], array_merge($parents, array('field_item_count')), $key_exists);
+      }
+      $current_item_count = $key_exists ? $field_item_count : count($items);
+
       // We always want at least one empty icon for the user to fill in.
       $max = ($current_item_count > count($filled_items))
               ? $current_item_count - 1
@@ -144,7 +161,8 @@ function field_multiple_value_form($fiel
 
   $title = check_plain(t($instance['label']));
   $description = field_filter_xss(t($instance['description']));
-  $wrapper_id = drupal_html_id($field_name . '-add-more-wrapper');
+  $wrapper_id_prefix = count($parents) ? implode('-', $parents) . '-' : '';
+  $wrapper_id = drupal_html_id($wrapper_id_prefix . $field_name . '-add-more-wrapper');
   $field_elements = array();
 
   $function = $instance['widget']['module'] . '_field_widget_form';
@@ -198,10 +216,10 @@ function field_multiple_value_form($fiel
       if ($field['cardinality'] == FIELD_CARDINALITY_UNLIMITED && empty($form_state['programmed'])) {
         $field_elements['add_more'] = array(
           '#type' => 'submit',
-          '#name' => $field_name . '_add_more',
+          '#name' => strtr($wrapper_id_prefix, '-', '_') . $field_name . '_add_more',
           '#value' => t('Add another item'),
           '#attributes' => array('class' => array('field-add-more-submit')),
-          '#limit_validation_errors' => array(array($field_name, $langcode)),
+          '#limit_validation_errors' => array(array_merge($parents, array($field_name, $langcode))),
           '#submit' => array('field_add_more_submit'),
           '#ajax' => array(
             'callback' => 'field_add_more_js',
@@ -212,6 +230,8 @@ function field_multiple_value_form($fiel
           // find the relevant field using those entries.
           '#field_name' => $field_name,
           '#language' => $langcode,
+          '#field_parents' => $parents,
+          '#namespace' => $namespace,
         );
       }
     }
@@ -308,7 +328,10 @@ function theme_field_multiple_value_form
 function field_form_element_after_build($element, &$form_state) {
   $field_name = $element['#field_name'];
   $langcode = $element['#language'];
-  $form_state['field'][$field_name][$langcode]['array_parents'] = $element['#array_parents'];
+  $parents = array_merge($element['#field_parents'], array('array_parents'));
+  if (isset($form_state['field'][$field_name][$langcode])) {
+    drupal_array_set_nested_value($form_state['field'][$field_name][$langcode], $parents, $element['#array_parents']);
+  }
 
   return $element;
 }
@@ -318,7 +341,10 @@ function field_form_element_after_build(
  */
 function field_default_form_errors($entity_type, $entity, $field, $instance, $langcode, $items, $form, &$form_state) {
   $field_name = $field['field_name'];
-  $field_info = $form_state['field'][$field_name][$langcode];
+  $namespace = key($instance['parents']);
+  $parents = $instance['parents'][$namespace];
+
+  $field_info = drupal_array_get_nested_value($form_state['field'][$field_name][$langcode], $parents);
 
   if (!empty($field_info['errors'])) {
     $function = $instance['widget']['module'] . '_field_widget_error';
@@ -361,8 +387,13 @@ function field_default_form_errors($enti
 function field_add_more_submit($form, &$form_state) {
   $field_name = $form_state['clicked_button']['#field_name'];
   $langcode = $form_state['clicked_button']['#language'];
-  if ($form_state['values'][$field_name . '_add_more']) {
-    $form_state['field_item_count'][$field_name] = count($form_state['values'][$field_name][$langcode]);
+  $parents = $form_state['clicked_button']['#field_parents'];
+
+  $button_name = count($parents) ? implode('_', $parents) . '_' : '';
+  $button_name .= $field_name . '_add_more';
+  if ($form_state['values'][$button_name]) {
+    $values = drupal_array_get_nested_value($form_state['values'], array_merge($parents, array($field_name, $langcode)));
+    drupal_array_set_nested_value($form_state['field'][$field_name][$langcode], array_merge($parents, array('field_item_count')), count($values));
   }
   $form_state['rebuild'] = TRUE;
 }
@@ -379,6 +410,7 @@ function field_add_more_js($form, $form_
   // Retrieve field information.
   $field_name = $form_state['clicked_button']['#field_name'];
   $langcode = $form_state['clicked_button']['#language'];
+  $parents = $form_state['clicked_button']['#field_parents'];
   $field_info = $form_state['field'][$field_name][$langcode];
   $field = $field_info['field'];
 
@@ -388,8 +420,8 @@ function field_add_more_js($form, $form_
 
   // Navigate to the right element in the the form.
   $element = $form;
-
-  foreach ($field_info['array_parents'] as $key) {
+  $array_parents = drupal_array_get_nested_value($field_info, array_merge($parents, array('array_parents')));
+  foreach ($array_parents as $key) {
     $element = $element[$key];
   }
 
Index: modules/field_ui/field_ui.admin.inc
===================================================================
RCS file: /cvs/drupal/drupal/modules/field_ui/field_ui.admin.inc,v
retrieving revision 1.73
diff -u -p -r1.73 field_ui.admin.inc
--- modules/field_ui/field_ui.admin.inc	14 Oct 2010 18:50:27 -0000	1.73
+++ modules/field_ui/field_ui.admin.inc	18 Oct 2010 12:21:05 -0000
@@ -1827,6 +1827,7 @@ function field_ui_default_value_widget($
   $items = $instance['default_value'];
   $instance['required'] = FALSE;
   $instance['description'] = '';
+  $instance['parents'] = array('default' => array());
   // @todo Allow multiple values (requires more work on 'add more' JS handler).
   $element += field_default_form(NULL, NULL, $field, $instance, LANGUAGE_NONE, $items, $form, $form_state, 0);
 
@@ -1838,6 +1839,7 @@ function field_ui_default_value_widget($
  */
 function field_ui_field_edit_form_validate($form, &$form_state) {
   $instance = $form_state['values']['instance'];
+  $instance['parents'] = array('default' => array());
   $field_name = $instance['field_name'];
   $field = field_info_field($field_name);
 
@@ -1861,6 +1863,7 @@ function field_ui_field_edit_form_valida
  */
 function field_ui_field_edit_form_submit($form, &$form_state) {
   $instance = $form_state['values']['instance'];
+  $instance['parents'] = array('default' => array());
   $field = $form_state['values']['field'];
 
   // Update any field settings that have changed.
