diff --git a/includes/commerce_product.type.inc b/includes/commerce_product.type.inc
old mode 100644
new mode 100755
index a111851..067dcf6
--- a/includes/commerce_product.type.inc
+++ b/includes/commerce_product.type.inc
@@ -307,6 +307,54 @@ function inline_entity_form_commerce_product_delete_form($form, $form_state) {
 }
 
 /**
+ * IEF existing form callback
+ */
+function inline_entity_form_commerce_product_existing_form($form, $form_state) {
+  $parents_key = $form_state['parents_key'];
+  $bundle = $form_state['inline_entity_form'][$parents_key]['add_existing_form']['bundle'];
+  $form['#element_validate'] = array(
+    'inline_entity_form_commerce_product_existing_form_validate',
+  );
+  $form['#element_submit'] = array(
+    'inline_entity_form_commerce_product_existing_form_submit',
+  );
+  $form['sku'] = array(
+    '#type' => 'textfield',
+    '#title' => t('SKU'),
+    '#description' => t('Enter the existing product SKU or Title.'),
+    '#maxlength' => 128,
+    '#required' => TRUE,
+    '#autocomplete_path' => 'commerce_product/autocomplete/commerce_product/commerce_product/' . $bundle,
+  );
+  return $form;
+}
+
+function inline_entity_form_commerce_product_existing_form_validate($form, $form_state){
+  $parents_key = $form_state['parents_key'];
+  $parents_path = implode('][', $form['#parents']);
+  $product_values = drupal_array_get_nested_value($form_state['values'], $form['#parents']);
+  $sku = trim($product_values['sku']);
+  $product = commerce_product_load_by_sku($sku);
+  // Check to see if SKU actually represents a product
+  if(empty($product)){
+    form_set_error($parents_path . '][sku', t('This SKU is not valid.'));
+  }
+  // Check if the current product alrady exists in entities array
+  foreach($form_state['inline_entity_form'][$parents_key]['entities'] as $entity){
+      if($entity['data']->product_id == $product->product_id){
+          form_set_error($parents_path . '][sku', t('This SKU has already been referenced'));
+      }
+  }
+}
+
+function inline_entity_form_commerce_product_existing_form_submit(&$form, &$form_state) {
+  $product_values = drupal_array_get_nested_value($form_state['values'], $form['#parents']);
+  $sku = trim($product_values['sku']);
+  $product = commerce_product_load_by_sku($sku);
+  $form['#entity'] = $product;
+}
+
+/**
  * Returns a list of field names that are used as attributes for the given
  * product type.
  */
diff --git a/inline_entity_form.module b/inline_entity_form.module
old mode 100644
new mode 100755
index 861ea17..49c258a
--- a/inline_entity_form.module
+++ b/inline_entity_form.module
@@ -20,10 +20,13 @@ function inline_entity_form_inline_entity_type_info() {
       'default fields' => 'inline_entity_form_commerce_product_default_fields',
       'form' => 'inline_entity_form_commerce_product_form',
       'delete form' => 'inline_entity_form_commerce_product_delete_form',
+      'existing form' => 'inline_entity_form_commerce_product_existing_form',
     ),
     'labels' => array(
       'add fieldset' => t('Add new product variation'),
-      'add button' => t('Add variation'),
+      'add button' => t('Add a new variation'),
+      'add existing fieldset' => t('Add an existing variation'),
+      'add existing button' => t('Add an existing variation'),
       'save button' => t('Save variation'),
     ),
     'empty text' => t('No product variations have been created. At least one variation is required.'),
@@ -301,6 +304,9 @@ function inline_entity_form_field_widget_form(&$form, &$form_state, $field, $ins
       // Initialize the add form to NULL.
       $form_state['inline_entity_form'][$parents_key]['add_form'] = NULL;
 
+      // Initialize the add existing form to NULL.
+      $form_state['inline_entity_form'][$parents_key]['add_existing_form'] = NULL;
+
       // Add the element's settings to the array.
       $form_state['inline_entity_form'][$parents_key]['settings'] = $settings;
 
@@ -319,21 +325,8 @@ function inline_entity_form_field_widget_form(&$form, &$form_state, $field, $ins
           'form' => NULL,
           'needs_save' => FALSE,
         );
-
         $delta++;
       }
-
-      // If no entities were found, open the add form.
-      if (empty($form_state['inline_entity_form'][$parents_key]['entities'])) {
-        $element['#description'] = $type_info['empty text'];
-
-        if (count($settings['bundles']) == 1) {
-          $form_state['inline_entity_form'][$parents_key]['add_form'] = array(
-            'bundle' => reset($settings['bundles']),
-          );
-          $form_state['inline_entity_form'][$parents_key]['action'] = 'ief_add';
-        }
-      }
     }
 
     $element['entities'] = array(
@@ -350,7 +343,6 @@ function inline_entity_form_field_widget_form(&$form, &$form_state, $field, $ins
     else {
       $element['entities']['#fields'] = $type_info['callbacks']['default fields']($settings['bundles']);
     }
-
     foreach ($form_state['inline_entity_form'][$parents_key]['entities'] as $key => $value) {
       $element['entities'][$key]['#entity'] = $entity = $value['data'];
       $element['entities'][$key]['#needs_save'] = $value['needs_save'];
@@ -466,45 +458,67 @@ function inline_entity_form_field_widget_form(&$form, &$form_state, $field, $ins
           'wrapper' => $wrapper,
         ),
       );
-    }
 
+      if(!empty($type_info['callbacks']['existing form'])){
+        $element['actions']['ief_add_existing'] = array(
+          '#type' => 'submit',
+          '#value' => $type_info['labels']['add existing button'],
+          '#name' => 'ief-' . $parents_delta[$parents_key] . '-add-existing',
+          '#limit_validation_errors' => array(),
+          '#submit' => array(),
+          '#ajax' => array(
+            'callback' => 'inline_entity_form_widget_refresh',
+            'wrapper' => $wrapper,
+          ),
+        );
+      }
+    }
     // Provide the add form.
     if (!empty($form_state['inline_entity_form'][$parents_key]['add_form'])) {
       $form_settings = &$form_state['inline_entity_form'][$parents_key]['add_form'];
-
-      // Create a new entity that will be passed to the form.
-      $info = entity_get_info($settings['entity_type']);
-      $bundle_key = $info['entity keys']['bundle'];
-      $default_values = array();
-      // If the bundle key exists, it must always be set on an entity.
-      if (!empty($bundle_key)) {
-        $default_values[$bundle_key] = $form_settings['bundle'];
-      }
-      $entity = entity_create($settings['entity_type'], $default_values);
-
-      $element['add_form'] = array(
-        '#type' => 'fieldset',
-        '#title' => $type_info['labels']['add fieldset'],
-        // Used by Field API, #element_validate and #element_submit to find
-        // the relevant values in $form_state.
-        '#parents' => array_merge($parents, array('add_form')),
-        // Store the entity on the form, to be modified in #element_submit.
-        '#entity' => $entity,
-        '#entity_type' => $settings['entity_type'],
-        // Add IEF-specific keys to be used when generating form actions.
-        '#ief_wrapper' => $wrapper,
-        '#op' => 'add',
-        '#delta' => $parents_delta[$parents_key],
-      );
-      $element['add_form'] += inline_entity_form_type_form($settings['entity_type'], $element['add_form'], $form_state, $type_settings);
-
-      // Make sure the Cancel button is not shown when there are no entities.
-      if (empty($form_state['inline_entity_form'][$parents_key]['entities'])) {
-        $element['add_form']['actions']['ief_add_cancel']['#access'] = FALSE;
-      }
+        // Create a new entity that will be passed to the form.
+        $info = entity_get_info($settings['entity_type']);
+        $bundle_key = $info['entity keys']['bundle'];
+        $default_values = array();
+        // If the bundle key exists, it must always be set on an entity.
+        if (!empty($bundle_key)) {
+         $default_values[$bundle_key] = $form_settings['bundle'];
+        }
+        $entity = entity_create($settings['entity_type'], $default_values);
+        $element['add_form'] = array(
+          '#type' => 'fieldset',
+          '#title' => $type_info['labels']['add fieldset'],
+          // Used by Field API, #element_validate and #element_submit to find
+          // the relevant values in $form_state.
+          '#parents' => array_merge($parents, array('add_form')),
+          // Store the entity on the form, to be modified in #element_submit.
+          '#entity' => $entity,
+          '#entity_type' => $settings['entity_type'],
+          // Add IEF-specific keys to be used when generating form actions.
+          '#ief_wrapper' => $wrapper,
+          '#op' => 'add',
+          '#delta' => $parents_delta[$parents_key],
+        );
+        $element['add_form'] += inline_entity_form_type_form($settings['entity_type'], $element['add_form'], $form_state, $type_settings);
     }
+    // Provide the add existing form
+    if(!empty($form_state['inline_entity_form'][$parents_key]['add_existing_form'])) {
+        $element['add_existing_form'] = array(
+          '#type' => 'fieldset',
+          '#title' => $type_info['labels']['add existing fieldset'],
+          // Used by Field API, #element_validate and #element_submit to find
+          // the relevant values in $form_state.
+          '#parents' => array_merge($parents, array('add_existing_form')),
+          '#entity_type' => $settings['entity_type'],
+          // Add IEF-specific keys to be used when generating form actions.
+          '#ief_wrapper' => $wrapper,
+          '#op' => 'add_existing',
+          '#delta' => $parents_delta[$parents_key],
+        );
+        $element['add_existing_form'] += inline_entity_form_type_existing_form($settings['entity_type'], $element['add_existing_form'], $form_state, $type_settings);
+      }
 
-    return $element;
+      return $element;
   }
 }
 
@@ -629,6 +643,66 @@ function inline_entity_form_type_delete_form($entity_type, $form, &$form_state,
 }
 
 /**
+ * Returns the existing form for the passed entity type.
+ *
+ * @param $entity_type
+ *   The entity type being managed inline.
+ * @param $form
+ *   The form array that will receive the delete form.
+ * @param $form_state
+ *   The form state of the complete IEF widget.
+ * @param $type_settings
+ *   Type-specific settings specified through the IEF widget settings.
+ *
+ * @return
+ *   The form array containing the embedded delete form.
+ */
+function inline_entity_form_type_existing_form($entity_type, $form, &$form_state, $type_settings) {
+  $type_info = inline_entity_form_type($entity_type);
+
+  // Ensure that the include file is loaded when the form is rebuilt from cache.
+  $form_state['build_info']['files']['inline_form'] = $type_info['file'];
+
+  // Store the type settings so that the callbacks can access them.
+  $form['#settings'] = $type_settings;
+  // Retrieve the form provided by the type callback.
+  $form = $type_info['callbacks']['existing form']($form, $form_state);
+
+  // Add the actions
+  $form['actions'] = array(
+    '#type' => 'container',
+    '#weight' => 100,
+  );
+  $form['actions']['ief_' . $form['#op'] . '_save'] = array(
+    '#type' => 'submit',
+    '#value' => $type_info['labels']['save button'],
+    '#name' => 'ief-' . $form['#op'] . '-submit-' . $form['#delta'],
+    '#limit_validation_errors' => array($form['#parents']),
+    '#submit' => array(),
+    '#ajax' => array(
+      'callback' => 'inline_entity_form_widget_refresh',
+      'wrapper' => $form['#ief_wrapper'],
+    ),
+  );
+  $form['actions']['ief_' . $form['#op'] . '_cancel'] = array(
+    '#type' => 'submit',
+    '#value' => t('Cancel'),
+    '#name' => 'ief-' . $form['#op'] . '-cancel-' . $form['#delta'],
+    '#limit_validation_errors' => array(),
+    '#submit' => array(),
+    '#ajax' => array(
+      'callback' => 'inline_entity_form_widget_refresh',
+      'wrapper' => $form['#ief_wrapper'],
+    ),
+  );
+
+  $form['#element_validate'][] = 'inline_entity_form_process_submit';
+
+  return $form;
+
+}
+
+/**
  * Calls #element_submit callbacks.
  *
  * Checks if the previous #element_validate callbacks had set any errors,
@@ -645,7 +719,7 @@ function inline_entity_form_process_submit(&$entity_form, &$form_state) {
   // Abort submission if the form has been rebuilt by an unknown element, such
   // as a field widget.
   $triggering_element_name = end($form_state['triggering_element']['#array_parents']);
-  if (!in_array($triggering_element_name, array('ief_add_save', 'ief_edit_save'))) {
+  if (!in_array($triggering_element_name, array('ief_add_save', 'ief_edit_save', 'ief_add_existing_save'))) {
     return;
   }
 
@@ -732,8 +806,8 @@ function inline_entity_form_element_validate($element, &$form_state, $form) {
       $form_state['inline_entity_form'][$parents_key]['add_form'] = array(
         'bundle' => $form_values['actions']['bundle'],
       );
+      $form_state['inline_entity_form'][$parents_key]['add_existing_form'] = NULL;
       break;
-
     case 'ief_add_save':
       // Determine the correct weight of the new element.
       $weight = 0;
@@ -750,14 +824,39 @@ function inline_entity_form_element_validate($element, &$form_state, $form) {
         'form' => NULL,
         'needs_save' => TRUE,
       );
-
       $form_state['inline_entity_form'][$parents_key]['add_form'] = NULL;
+      $form_state['inline_entity_form'][$parents_key]['add_existing_form'] = NULL;
       break;
-
     case 'ief_add_cancel':
       $form_state['inline_entity_form'][$parents_key]['add_form'] = NULL;
+      $form_state['inline_entity_form'][$parents_key]['add_existing_form'] = NULL;
+      break;
+    case 'ief_add_existing':
+      $form_state['inline_entity_form'][$parents_key]['add_existing_form'] = array(
+        'bundle' => $form_values['actions']['bundle'],
+      );
+      $form_state['parents_key'] = $parents_key;
+      break;
+    case 'ief_add_existing_save':
+      // Determine the correct weight of the new element.
+      $weight = 0;
+      if (!empty($form_state['inline_entity_form'][$parents_key]['entities'])) {
+        $weight = max(array_keys($form_state['inline_entity_form'][$parents_key]['entities'])) + 1;
+      }
+      $entity_form = $element['add_existing_form'];
+      $form_state['inline_entity_form'][$parents_key]['entities'][] = array(
+        'data' => $entity_form['#entity'],
+        'weight' => $weight,
+        'form' => NULL,
+        'needs_save' => FALSE,
+      );
+      $form_state['inline_entity_form'][$parents_key]['add_form'] = NULL;
+      $form_state['inline_entity_form'][$parents_key]['add_existing_form'] = NULL;
+      break;
+    case 'ief_add_existing_cancel':
+      $form_state['inline_entity_form'][$parents_key]['add_form'] = NULL;
+      $form_state['inline_entity_form'][$parents_key]['add_existing_form'] = NULL;
       break;
-
     case 'ief_entity_edit':
       $form_state['inline_entity_form'][$parents_key]['entities'][$triggering_element_delta]['form'] = 'edit';
       break;
@@ -1008,6 +1107,18 @@ function inline_entity_form_widget_form_actions() {
       'array_depth' => 4,
       'allowed_actions' => array('ief_add'),
     ),
+    'ief_add_existing' => array(
+      'array_depth' => 3,
+      'allowed_actions' => array('ief_add'),
+    ),
+    'ief_add_existing_save' => array(
+      'array_depth' => 4,
+      'allowed_actions' => array('ief_add_existing','ief_add'),
+    ),
+    'ief_add_existing_cancel' => array(
+      'array_depth' => 4,
+      'allowed_actions' => array('ief_add','ief_add_existing'),
+    ),
     'ief_entity_edit' => array(
       'array_depth' => 5,
       'delta_depth' => 2,
