diff --git a/inline_entity_form.module b/inline_entity_form.module
index 4af9615..629012c 100644
--- a/inline_entity_form.module
+++ b/inline_entity_form.module
@@ -377,8 +377,39 @@ function inline_entity_form_field_widget_form(&$form, &$form_state, $field, $ins
   // Get the langcode of the parent entity.
   $parent_langcode = entity_language($element['#entity_type'], $element['#entity']);
 
+  if (isset($form_state['complete form'])) {
+    $ief_id = $form_state['complete form'][$field['field_name']][$parent_langcode]['#ief_id'];
+  }
+
+  $ief_nesting = &drupal_static(__FUNCTION__);
+  if (!isset($ief_nesting)) {
+    // Initialize static variable
+    $ief_nesting = array();
+    $ief_nesting['depth'] = 0;
+  }
+  else {
+    $ief_nesting['depth']++;
+  }
+
+  // Edit operation; delta of ief provided.
+  if ($ief_nesting['depth'] > 0 && isset($form['#ief_row_delta'])) {
+    $child_delta = $form['#ief_row_delta'];
+  }
+  // Add operation; determine delta for new form by counting parent's entities.
+  else if ($ief_nesting['depth'] > 0 && !isset($form['#ief_row_delta'])) {
+    $parent_delta = $ief_nesting['depth'] - 1;
+    $parent_ief_id = $ief_nesting['parents'][$parent_delta];
+    $child_delta = count($form_state['inline_entity_form'][$parent_ief_id]['entities']);
+  }
+  // Initial value.
+  else {
+    $child_delta = 0;
+  }
+
   // Assign a unique identifier to each IEF widget.
-  $ief_id = $instance['id'];
+  $ief_id = $field['field_name'] . '_' . $instance['id'] . '_' . $child_delta;
+  $ief_nesting['parents'][] = $ief_id;
+
   // Determine the wrapper ID for the entire element.
   $wrapper = 'inline-entity-form-' . $ief_id;
   $element = array(
@@ -845,6 +876,13 @@ function inline_entity_form_process_entity_form(&$entity_form, &$form_state) {
   }
 
   $ief_id = $entity_form['#ief_id'];
+  static $return_next;
+  if (strpos($form_state['clicked_button']['#name'], $ief_id)) {
+    $return_next = TRUE;
+  }
+  else if (!empty($return_next)) {
+    return;
+  }
   $instance = $form_state['inline_entity_form'][$ief_id]['instance'];
   // Instantiate the controller and validate the form.
   $controller = inline_entity_form_get_controller($instance);
@@ -1088,6 +1126,12 @@ function inline_entity_form_remove_confirm($form, &$form_state) {
   $ief_id = $element['#ief_id'];
   $instance = $form_state['inline_entity_form'][$ief_id]['instance'];
   $delta = $form_state['triggering_element']['#ief_row_delta'];
+  foreach ($form_state['inline_entity_form'] as $key => $value) {
+    if (!strpos($key, $ief_id) && preg_match("/_$delta$/", $key)) {
+      unset($form_state['inline_entity_form'][$key]);
+      break;
+    }
+  }
   $remove_form = $element['entities'][$delta]['form'];
 
   // Instantiate the controller and submit the form.
@@ -1144,6 +1188,15 @@ function inline_entity_form_open_form($form, &$form_state) {
 function inline_entity_form_close_form($form, &$form_state) {
   $element = inline_entity_form_get_element($form, $form_state);
   $ief_id = $element['#ief_id'];
+  $entity_count = count($form_state['inline_entity_form'][$ief_id]['entities']);
+  if (strpos($form_state['clicked_button']['#name'], $ief_id)) {
+    foreach ($form_state['inline_entity_form'] as $key => $value) {
+      if (!strpos($key, $ief_id) && preg_match("/_$entity_count$/", $key)) {
+        unset($form_state['inline_entity_form'][$key]);
+        break;
+      }
+    }
+  }
 
   $form_state['rebuild'] = TRUE;
   $form_state['inline_entity_form'][$ief_id]['form'] = NULL;
@@ -1215,7 +1268,7 @@ function inline_entity_form_field_attach_submit($parent_entity_type, $parent_ent
     if (isset($instance['widget']) && strpos($instance['widget']['type'], 'inline_entity_form') === 0) {
       $field_name = $instance['field_name'];
       $langcode = $form[$field_name]['#language'];
-      $ief_id = $instance['id'];
+      $ief_id = $form[$field_name][$langcode]['#ief_id'];
       // There's no IEF data for this field, skip it.
       if (empty($form_state['inline_entity_form'][$ief_id])) {
         continue;
