diff --git a/field_collection.module b/field_collection.module
index 9da8350..b4c1c01 100644
--- a/field_collection.module
+++ b/field_collection.module
@@ -880,6 +880,26 @@ function field_collection_field_widget_form(&$form, &$form_state, $field, $insta
       );
 
       $field_state = field_form_get_state($field_parents, $field_name, $language, $form_state);
+      // Figure out the $wrapper_id we might need later:
+      if (!isset($field_state['wrapper_id'])) {
+        // This should be the wrapper that field UI defined for the entire
+        // collection
+        $id_prefix = implode('-', array_merge($field_parents, array($field_name)));
+
+        $wrapper_id = drupal_html_id($id_prefix . '-add-more-wrapper');
+        // The $wrapper_id we really want has already been used. We actually want
+        // to backtrack it by one.
+        $i = substr($wrapper_id, -1) - 1;
+        $wrapper_id = substr($wrapper_id, 0, -3);
+        if ($i > 1) {
+          $wrapper_id .= '--' . $i;
+        }
+        $field_state['wrapper_id'] = $wrapper_id;
+      }
+      else {
+        $wrapper_id = $field_state['wrapper_id'];
+      }
+
       if (isset($field_state['entity'][$delta])) {
         $field_collection_item = $field_state['entity'][$delta];
       }
@@ -888,19 +908,113 @@ function field_collection_field_widget_form(&$form, &$form_state, $field, $insta
 
         // Put our entity in the form state, so FAPI callbacks can access it.
         $field_state['entity'][$delta] = $field_collection_item;
-        field_form_set_state($field_parents, $field_name, $language, $form_state, $field_state);
       }
+      field_form_set_state($field_parents, $field_name, $language, $form_state, $field_state);
 
       field_attach_form('field_collection_item', $field_collection_item, $element, $form_state, $language);
 
       if (empty($element['#required'])) {
         $element['#after_build'][] = 'field_collection_field_widget_embed_delay_required_validation';
       }
+
+      if ($field['cardinality'] == FIELD_CARDINALITY_UNLIMITED) {
+
+        $element['remove_button'] = array(
+          '#delta' => $delta,
+          '#name' => implode('_', $parents) . '_remove_button',
+          '#type' => 'submit',
+          '#value' => t('Remove'),
+          '#validate' => array(),
+          '#submit' => array('field_collection_remove_submit'),
+          '#limit_validation_errors' => array(),
+          '#ajax' => array(
+            'callback' => 'field_collection_remove_js',
+            'wrapper' => $wrapper_id,
+            'effect' => 'fade',
+          ),
+          '#weight' => 1000,
+        );
+      }
+
       $recursion--;
       return $element;
   }
 }
 
+function field_collection_remove_js($form, $form_state) {
+  // Get the information on what we're removing.
+  $button = $form_state['triggering_element'];
+  // Go two levels up in the form, to the whole widget.
+  $element = drupal_array_get_nested_value($form, array_slice($button['#array_parents'], 0, -2));
+
+  // Now send back the proper AJAX command to replace it.
+  return $element;
+}
+
+/**
+ * Submit callback to remove an item from the field UI multiple wrapper.
+ */
+function field_collection_remove_submit($form, &$form_state) {
+  $button = $form_state['triggering_element'];
+  $delta = $button['#delta'];
+
+  // Where in the form we'll find the parent element.
+  $address = array_slice($button['#array_parents'], 0, -2);
+
+  // Go one level up in the form, to the widgets container.
+  $parent_element = drupal_array_get_nested_value($form, $address);
+  $field_name = $parent_element['#field_name'];
+  $langcode = $parent_element['#language'];
+  $parents = $parent_element['#field_parents'];
+
+  $field_state = field_form_get_state($parents, $field_name, $langcode, $form_state);
+
+  // Go ahead and renumber everything from our delta to the last
+  // item down one. This will overwrite the item being removed.
+  for ($i = $delta; $i < $field_state['items_count'] - 1; $i++) {
+    $old_element_address = $address + array($i + 1);
+    $new_element_address = $address + array($i);
+    $moving_element = drupal_array_get_nested_value($form, $address, $old_element_address);
+    $moving_element_value = drupal_array_get_nested_value($form_state['values'], $address, $old_element_address);
+    $moving_element['#parents'] = $new_element_address;
+
+    // Remove the value.
+    form_set_value($moving_element, $moving_element_value, $form_state);
+    drupal_array_set_nested_value($form_state['input'], $moving_element['#parents'], $moving_element_value);
+  }
+
+  // Remove the final item.
+  $i = $field_state['items_count'] - 1;
+  $removed_element_address = $address + array($i);
+  $removed_element = drupal_array_get_nested_value($form, $address, $removed_element_address);
+  form_set_value($removed_element, NULL, $form_state);
+  drupal_array_set_nested_value($form_state['input'], $removed_element['#parents'], NULL);
+
+  // Then remove the last item. But we must not go negative.
+  if ($field_state['items_count'] > 0) {
+    $field_state['items_count']--;
+  }
+
+  // Then recalculate the entities that we have cached.
+  unset($field_state['entity'][$delta]);
+
+  // renumber
+  $field_state['entity'] = array_values($field_state['entity']);
+
+  // Since field api will always give us 1 empty row, we can't actually leave
+  // this empty or we'll try to reload entities and ressurect a deleted one.
+  if (empty($field_state['entity'])) {
+    $field_state['entity'][] = entity_create('field_collection_item', array('field_name' => $field_name));
+  }
+
+  // And unset the wrapper_id so it gets recalculated on rebuild
+
+  unset($field_state['wrapper_id']);
+  field_form_set_state($parents, $field_name, $langcode, $form_state, $field_state);
+
+  $form_state['rebuild'] = TRUE;
+}
+
 /**
  * Gets a field-collection item entity for a given field item.
  *
