diff --git includes/content.node_form.inc includes/content.node_form.inc
index 8a4e2eb..90cf75e 100644
--- includes/content.node_form.inc
+++ includes/content.node_form.inc
@@ -258,15 +258,8 @@ function content_add_more_js($type_name_url, $field_name) {
     exit;
   }
 
-  // Reorder values to account for drag-n-drop reordering.
-  $_POST[$field_name] = _content_sort_items($field, $_POST[$field_name]);
-  $delta = max(array_keys($_POST[$field_name])) + 1;
   // Retrieve the cached form.
-  $form_state = array(
-    'submitted' => FALSE,
-    'values' => $_POST,
-    'item_count' => array($field_name => count($_POST[$field_name]) + 1),
-  );
+  $form_state = array('submitted' => FALSE);
   $form_build_id = $_POST['form_build_id'];
   $form = form_get_cache($form_build_id, $form_state);
   if (!$form) {
@@ -275,12 +268,32 @@ function content_add_more_js($type_name_url, $field_name) {
     exit;
   }
 
+  // Build the form, in order to retrieve the current form state.
+  $built_form = $form;
+  $built_form_state = $form_state;
+  $form = form_builder($_POST['form_id'], $built_form, $built_form_state);
+
+  // Clean ids, so that the same form elements don't get assigned different ids
+  // when rendered once more further down.
+  form_clean_id(NULL, TRUE);
+
+  // Some precautions and preparations for the newly retrieved form state.
+  unset($built_form_state['values'][$field_name][$field['field_name'] .'_add_more']);
+  $built_form_state['item_count'] = array($field_name => count($_POST[$field_name]) + 1);
+
+  // Reorder values to account for drag-n-drop reordering.
+  foreach ($built_form_state['values'][$field_name] as $delta => $item) {
+    $built_form_state['values'][$field_name][$delta]['_weight'] = $_POST[$field_name][$delta]['_weight'];
+  }
+  $built_form_state['values'][$field_name] =
+    _content_sort_items($field, $built_form_state['values'][$field_name]);
+
   // Build our new form element for the whole field,
   // and let other modules alter it.
-  $form_element = content_field_form($form, $form_state, $field);
+  $form_element = content_field_form($form, $built_form_state, $field);
   drupal_alter('form', $form_element, array(), 'content_add_more_js');
 
-  // Add the new element at the right place in the form.
+  // Add the new element at the right place in the (original, unbuilt) form.
   if (module_exists('fieldgroup') && ($group_name = _fieldgroup_field_get_group($type['type'], $field_name))) {
     $form[$group_name][$field_name] = $form_element[$field_name];
   }
@@ -289,10 +302,11 @@ function content_add_more_js($type_name_url, $field_name) {
   }
 
   // Save the new definition of the form.
-  $form_state['values'] = array();
   form_set_cache($form_build_id, $form, $form_state);
 
   // Build the new form so that we can render the new element.
+  $delta = max(array_keys($_POST[$field_name])) + 1;
+  $_POST[$field_name] = _content_sort_items($field, $_POST[$field_name]);
   $_POST[$field_name][$delta]['_weight'] = $delta;   // TODO : Hack !!
   $form_state = array('submitted' => FALSE);
   $form += array(
