diff --git a/inline_entity_form.module b/inline_entity_form.module
index 813183e..d90f071 100644
--- a/inline_entity_form.module
+++ b/inline_entity_form.module
@@ -833,42 +833,83 @@ function inline_entity_form_entity_form($controller, $entity_form, &$form_state)
  * @param $form_state
  *   The form state of the parent form.
  */
-function inline_entity_form_process_entity_form(&$entity_form, &$form_state) {
+function inline_entity_form_process_entity_form(&$entity_form, &$form_state, &$complete_form) {
   // Only react on submissions triggered by the main submit buttons.
   $triggering_element_name = end($form_state['triggering_element']['#array_parents']);
   if (empty($form_state['triggering_element']['#ief_submit_all']) && !in_array($triggering_element_name, array('ief_add_save', 'ief_edit_save'))) {
     return;
   }
 
+  // Run validation on the inner form.
   $ief_id = $entity_form['#ief_id'];
   $instance = $form_state['inline_entity_form'][$ief_id]['instance'];
   // Instantiate the controller and validate the form.
   $controller = inline_entity_form_get_controller($instance);
   $controller->entityFormValidate($entity_form, $form_state);
 
-  // If validation passed, execute the submission handler.
-  if (!form_get_errors() && !$form_state['rebuild']) {
-    $controller->entityFormSubmit($entity_form, $form_state);
-    $entity = $entity_form['#entity'];
+  // Make sure our submit handler is called at submit time.
+  // Doing this at submit-time ensures that all validation *has* passed.
+  $form_state['inline_entity_form_process_submit'][implode('-', $entity_form['#array_parents'])] = $entity_form['#array_parents'];
+  if (!in_array('inline_entity_form_process_entity_form_submit', $complete_form['#submit'])) {
+    array_unshift($complete_form['#submit'], 'inline_entity_form_process_entity_form_submit');
+  }
+  if (!empty($form_state['triggering_element']['#submit']) && !in_array('inline_entity_form_process_entity_form_submit', $form_state['triggering_element']['#submit'])) {
+    array_unshift($form_state['triggering_element']['#submit'], 'inline_entity_form_process_entity_form_submit');
+  }
+  if (!empty($form_state['submit_handlers']) && !in_array('inline_entity_form_process_entity_form_submit', $form_state['submit_handlers'])) {
+    array_unshift($form_state['submit_handlers'], 'inline_entity_form_process_entity_form_submit');
+  }
+}
 
-    if ($entity_form['#op'] == 'add') {
-      // Determine the correct weight of the new element.
-      $weight = 0;
-      if (!empty($form_state['inline_entity_form'][$ief_id]['entities'])) {
-        $weight = max(array_keys($form_state['inline_entity_form'][$ief_id]['entities'])) + 1;
+/**
+ * Submits the inline entity form at submit-time on the parent form.
+ *
+ * @param $form
+ * @param $form_state
+ */
+function inline_entity_form_process_entity_form_submit(&$form, &$form_state) {
+  // Only react on submissions triggered by the main submit buttons.
+  $triggering_element_name = end($form_state['triggering_element']['#array_parents']);
+  if (empty($form_state['triggering_element']['#ief_submit_all']) && !in_array($triggering_element_name, array('ief_add_save', 'ief_edit_save'))) {
+    return;
+  }
+
+  if (!empty($form_state['inline_entity_form_process_submit'])) {
+    foreach ($form_state['inline_entity_form_process_submit'] as $entity_form_parents) {
+      if (($entity_form = &drupal_array_get_nested_value($form, $entity_form_parents))) {
+        drupal_array_get_nested_value($form_state['values'], $entity_form['#parents'], $values_exist);
+        if ($values_exist) {
+          $ief_id = $entity_form['#ief_id'];
+          $instance = $form_state['inline_entity_form'][$ief_id]['instance'];
+          // Instantiate the controller and validate the form.
+          $controller = inline_entity_form_get_controller($instance);
+
+          $controller->entityFormSubmit($entity_form, $form_state);
+          $entity = $entity_form['#entity'];
+
+          if ($entity_form['#op'] == 'add') {
+            // Determine the correct weight of the new element.
+            $weight = 0;
+            if (!empty($form_state['inline_entity_form'][$ief_id]['entities'])) {
+              $weight = max(array_keys($form_state['inline_entity_form'][$ief_id]['entities'])) + 1;
+            }
+            // Add the entity to form state, mark it for saving, and close the form.
+            $form_state['inline_entity_form'][$ief_id]['entities'][] = array(
+              'entity' => $entity_form['#entity'],
+              'weight' => $weight,
+              'form' => NULL,
+              'needs_save' => TRUE,
+            );
+          }
+          else {
+            $delta = $entity_form['#ief_row_delta'];
+            $form_state['inline_entity_form'][$ief_id]['entities'][$delta]['entity'] = $entity_form['#entity'];
+            $form_state['inline_entity_form'][$ief_id]['entities'][$delta]['needs_save'] = TRUE;
+          }
+        }
+
+        unset($entity_form);
       }
-      // Add the entity to form state, mark it for saving, and close the form.
-      $form_state['inline_entity_form'][$ief_id]['entities'][] = array(
-        'entity' => $entity_form['#entity'],
-        'weight' => $weight,
-        'form' => NULL,
-        'needs_save' => TRUE,
-      );
-    }
-    else {
-      $delta = $entity_form['#ief_row_delta'];
-      $form_state['inline_entity_form'][$ief_id]['entities'][$delta]['entity'] = $entity_form['#entity'];
-      $form_state['inline_entity_form'][$ief_id]['entities'][$delta]['needs_save'] = TRUE;
     }
   }
 }
