diff --git a/includes/commerce_product.inline_entity_form.inc b/includes/commerce_product.inline_entity_form.inc
index d711fda..0f84423 100644
--- a/includes/commerce_product.inline_entity_form.inc
+++ b/includes/commerce_product.inline_entity_form.inc
@@ -145,6 +145,11 @@ class CommerceProductInlineEntityFormController extends EntityInlineEntityFormCo
       '#title' => t('Refer to the referenced products as "variations"'),
       '#default_value' => $this->settings['use_variation_language'],
     );
+    $form['clone_button'] = array(
+      '#type' => 'checkbox',
+      '#title' => t('Enable Clone button'),
+      '#default_value' => $this->settings['clone_button'],
+    );
 
     return $form;
   }
diff --git a/inline_entity_form.module b/inline_entity_form.module
index d2e1f09..c12a1b8 100644
--- a/inline_entity_form.module
+++ b/inline_entity_form.module
@@ -539,6 +539,9 @@ function inline_entity_form_field_widget_form(&$form, &$form_state, $field, $ins
         elseif ($value['form'] == 'remove') {
           $form += inline_entity_form_remove_form($controller, $form, $form_state);
         }
+        elseif ($value['form'] == 'clone') {
+          $form += inline_entity_form_clone_form($controller, $form, $form_state);
+        }
       }
       else {
         $row = &$element['entities'][$key];
@@ -591,6 +594,23 @@ function inline_entity_form_field_widget_form(&$form, &$form_state, $field, $ins
             '#ief_row_form' => 'remove',
           );
         }
+        // Check if Clone button is enabled 
+        // and add it if it's checked
+        if ($controller->getSetting('clone_button')) {
+          $row['actions']['ief_entity_clone'] = array(
+            '#type' => 'submit',
+            '#value' => t('Clone'),
+            '#name' => 'ief-' . $ief_id . '-entity-clone-' . $key,
+            '#limit_validation_errors' => array(array_merge($parents, array('actions'))),
+            '#ajax' => array(
+              'callback' => 'inline_entity_form_get_element',
+              'wrapper' => $wrapper,
+            ),
+            '#submit' => array('inline_entity_form_open_form'),
+            '#ief_row_delta' => $key,
+            '#ief_form' => 'clone',
+          );
+        }
       }
     }
 
@@ -708,6 +728,14 @@ function inline_entity_form_field_widget_form(&$form, &$form_state, $field, $ins
         $element['form'] += inline_entity_form_reference_form($controller, $element['form'], $form_state);
       }
 
+      //Display clone form here
+      elseif ($form_state['inline_entity_form'][$ief_id]['form'] == 'clone') {
+        $element['form']['#op'] = 'clone';
+        $element['form']['#ief_row_delta'] = $form_state['triggering_element']['#ief_row_delta'];
+        $element['form'] += inline_entity_form_clone_form($controller, $element['form'], $form_state);
+      }
+
+
       // No entities have been added. Remove the outer fieldset to reduce
       // visual noise caused by having two titles.
       if (empty($form_state['inline_entity_form'][$ief_id]['entities'])) {
@@ -804,6 +832,87 @@ function inline_entity_form_entity_form($controller, $entity_form, &$form_state)
 }
 
 /**
+ * Wraps and returns the entity form provided by the passed-in controller.
+ *
+ * @param $controller
+ *   The inline entity form controller.
+ * @param $entity_form
+ *   The form array that will receive the entity form.
+ * @param $form_state
+ *   The form state of the parent form.
+ *
+ * @return
+ *   The form array containing the embedded entity form.
+ */
+function inline_entity_form_clone_form($controller, $entity_form, &$form_state) {
+  $labels = $controller->labels();
+  // Build a delta suffix that's appended to button #name keys for uniqueness.
+  $delta = $entity_form['#ief_id'];
+  $ief_row_delta = $entity_form['#ief_row_delta'];
+  $form_settings = $form_state['inline_entity_form'][$entity_form['#ief_id']]['form settings'];
+  
+  // This is where the cloning happens...
+  $cloned_entity = NULL; //initiate $cloned_entity, default to NULL
+  $cloned_entity = clone $form_state['inline_entity_form'][$delta]['entities'][$ief_row_delta]['entity'];
+
+  $cloned_entity->product_id = NULL;
+  $cloned_entity->revision_id = NULL;
+  $cloned_entity->created = NULL;
+  //End cloning...
+
+  $entity_form['#entity'] = $cloned_entity;
+  $entity_form['#title'] = t('Clone @type_singular', array('@type_singular' => $labels['singular']));
+
+  // Retrieve the form provided by the controller.
+  $entity_form = $controller->entityForm($entity_form, $form_state);
+  // Allow other modules to alter the form.
+  drupal_alter('inline_entity_form_clone_form', $entity_form, $form_state);
+
+  // Add the actions
+  $entity_form['actions'] = array(
+    '#type' => 'container',
+    '#weight' => 100,
+  );
+  $entity_form['actions']['ief_' . $entity_form['#op'] . '_save'] = array(
+    '#type' => 'submit',
+    '#value' => t('Clone @type_singular', array('@type_singular' => $labels['singular'])),
+    '#name' => 'ief-' . $entity_form['#op'] . '-submit-' . $delta,
+    '#limit_validation_errors' => array($entity_form['#parents']),
+    '#attributes' => array('class' => array('ief-entity-submit')),
+    '#ajax' => array(
+      'callback' => 'inline_entity_form_get_element',
+      'wrapper' => 'inline-entity-form-' . $entity_form['#ief_id'],
+    ),
+  );
+  $entity_form['actions']['ief_' . $entity_form['#op'] . '_cancel'] = array(
+    '#type' => 'submit',
+    '#value' => t('Cancel'),
+    '#name' => 'ief-' . $entity_form['#op'] . '-cancel-' . $delta,
+    '#limit_validation_errors' => array(),
+    '#ajax' => array(
+      'callback' => 'inline_entity_form_get_element',
+      'wrapper' => 'inline-entity-form-' . $entity_form['#ief_id'],
+    ),
+  );
+
+  // Add the appropriate submit handlers and their related data.
+  $entity_form['actions']['ief_clone_save']['#submit'] = array('inline_entity_form_close_form');
+  $entity_form['actions']['ief_clone_cancel']['#submit'] = array('inline_entity_form_close_form');
+
+  // Add the validation callback that calls the controller's
+  // entityFormValidate() and entityFormSubmit() methods.
+  // Implemented as #element_validate so that entity forms are submitted
+  // when the parent form is submitted.
+  $entity_form['#element_validate'][] = 'inline_entity_form_process_entity_form';
+  // Add the pre_render callback that powers the #fieldset form element key,
+  // which moves the element to the specified fieldset without modifying its
+  // position in $form_state['values'].
+  $entity_form['#pre_render'][] = 'inline_entity_form_pre_render_add_fieldset_markup';
+
+  return $entity_form;
+}
+
+/**
  * Processes an entity form submission.
  *
  * The entity form is first validated by its controller.
@@ -819,7 +928,7 @@ function inline_entity_form_entity_form($controller, $entity_form, &$form_state)
 function inline_entity_form_process_entity_form(&$entity_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'))) {
+  if (empty($form_state['triggering_element']['#ief_submit_all']) && !in_array($triggering_element_name, array('ief_add_save', 'ief_edit_save', 'ief_clone_save'))) {
     return;
   }
 
@@ -834,7 +943,7 @@ function inline_entity_form_process_entity_form(&$entity_form, &$form_state) {
     $controller->entityFormSubmit($entity_form, $form_state);
     $entity = $entity_form['#entity'];
 
-    if ($entity_form['#op'] == 'add') {
+    if ($entity_form['#op'] == 'add' | $entity_form['#op'] == 'clone') {
       // Determine the correct weight of the new element.
       $weight = 0;
       if (!empty($form_state['inline_entity_form'][$ief_id]['entities'])) {
@@ -1099,9 +1208,14 @@ function inline_entity_form_open_form($form, &$form_state) {
   $form_values = drupal_array_get_nested_value($form_state['values'], $parents);
 
   $form_state['inline_entity_form'][$ief_id]['form'] = $form_state['triggering_element']['#ief_form'];
-  $form_state['inline_entity_form'][$ief_id]['form settings'] = array(
-    'bundle' => $form_values['actions']['bundle'],
-  );
+  if ($form_state['triggering_element']['#ief_form'] == 'clone') {
+    $form_state['inline_entity_form'][$ief_id]['form settings'] = array(
+      'bundle' => $element['#bundle'],);
+  }
+  else {
+    $form_state['inline_entity_form'][$ief_id]['form settings'] = array(
+    'bundle' => $form_values['actions']['bundle'],); 
+  } 
 }
 
 /**
@@ -1137,7 +1251,6 @@ function inline_entity_form_open_row_form($form, &$form_state) {
   $element = inline_entity_form_get_element($form, $form_state);
   $ief_id = $element['#ief_id'];
   $delta = $form_state['triggering_element']['#ief_row_delta'];
-
   $form_state['rebuild'] = TRUE;
   $form_state['inline_entity_form'][$ief_id]['entities'][$delta]['form'] = $form_state['triggering_element']['#ief_row_form'];
 }
