diff --git a/includes/commerce_line_item.inline_entity_form.inc b/includes/commerce_line_item.inline_entity_form.inc
index 81ae1a6..b89b2a3 100644
--- a/includes/commerce_line_item.inline_entity_form.inc
+++ b/includes/commerce_line_item.inline_entity_form.inc
@@ -77,6 +77,12 @@ class CommerceLineItemInlineEntityFormController extends EntityInlineEntityFormC
     $line_item = $entity_form['#entity'];
     $extra_fields = field_info_extra_fields('commerce_line_item', $line_item->type, 'form');
 
+    // Clone line item
+    if ($entity_form['#op'] == 'clone') {
+      $line_item->line_item_id = NULL;
+      $entity_form['#entity'] = $line_item;
+    }
+
     $entity_form['line_item_details'] = array(
       '#type' => 'fieldset',
       '#title' => t('Line item details'),
diff --git a/includes/commerce_product.inline_entity_form.inc b/includes/commerce_product.inline_entity_form.inc
index 14d8414..da8207d 100644
--- a/includes/commerce_product.inline_entity_form.inc
+++ b/includes/commerce_product.inline_entity_form.inc
@@ -165,6 +165,18 @@ class CommerceProductInlineEntityFormController extends EntityInlineEntityFormCo
       $product->uid = $user->uid;
     }
 
+    // Clone product
+    if ($entity_form['#op'] == 'clone') {
+      $product->product_id = NULL;
+      $product->revision_id = NULL;
+      $product->uid = $user->uid;
+      $product->created = $product->changed = NULL;
+      $product->sku = NULL;
+      unset($product->revision_timestamp);
+      unset($product->revision_uid);
+      $entity_form['#entity'] = $product;
+    }
+
     $entity_form['product_attributes'] = array(
       '#type' => 'fieldset',
       '#title' => t('Attributes'),
diff --git a/includes/entity.inline_entity_form.inc b/includes/entity.inline_entity_form.inc
index f3cc689..228afd1 100644
--- a/includes/entity.inline_entity_form.inc
+++ b/includes/entity.inline_entity_form.inc
@@ -132,6 +132,7 @@ class EntityInlineEntityFormController {
     $defaults['allow_existing'] = FALSE;
     $defaults['match_operator'] = 'CONTAINS';
     $defaults['delete_references'] = FALSE;
+    $defaults['clone_button'] = FALSE;
 
     return $defaults;
   }
@@ -176,6 +177,11 @@ class EntityInlineEntityFormController {
       '#title' => t('Delete referenced @label when the parent entity is deleted.', array('@label' => $labels['plural'])),
       '#default_value' => $this->settings['delete_references'],
     );
+    $form['clone_button'] = array(
+      '#type' => 'checkbox',
+      '#title' => t('Enable Clone button'),
+      '#default_value' => isset($this->settings['clone_button'])? $this->settings['clone_button'] : FALSE,
+    );
 
     return $form;
   }
diff --git a/includes/node.inline_entity_form.inc b/includes/node.inline_entity_form.inc
index 6af836a..33bcfc9 100644
--- a/includes/node.inline_entity_form.inc
+++ b/includes/node.inline_entity_form.inc
@@ -30,6 +30,20 @@ class NodeInlineEntityFormController extends EntityInlineEntityFormController {
     if (!isset($node->title)) {
       $node->title = NULL;
     }
+    // Clone node
+    if ($entity_form['#op'] == 'clone') {
+      $node->nid = NULL;
+      $node->vid = NULL;
+      $node->tnid = NULL;
+      global $user;
+      $node->name = isset($user->name) ? $user->name : NULL;
+      $node->uid = $user->uid;
+      $node->created  = $node->changed = NULL;
+      $node->path = NULL;
+      unset($node->revision_timestamp);
+      unset($node->revision_uid);
+      $entity_form['#entity'] = $node;
+    }
     node_object_prepare($node);
 
     $entity_form['title'] = array(
diff --git a/includes/taxonomy_term.inline_entity_form.inc b/includes/taxonomy_term.inline_entity_form.inc
index 0464391..9f0ef65 100644
--- a/includes/taxonomy_term.inline_entity_form.inc
+++ b/includes/taxonomy_term.inline_entity_form.inc
@@ -57,6 +57,12 @@ class TaxonomyTermInlineEntityFormController extends EntityInlineEntityFormContr
     $term = $entity_form['#entity'];
     $extra_fields = field_info_extra_fields('taxonomy_term', $term->vocabulary_machine_name, 'form');
 
+    // Clone term
+    if ($entity_form['#op'] == 'clone') {
+      $term->tid = NULL;
+      $entity_form['#entity'] = $term;
+    }
+
     $defaults = array(
       'name' => '',
       'description' => '',
diff --git a/inline_entity_form.module b/inline_entity_form.module
index d5fb20a..d89344d 100644
--- a/inline_entity_form.module
+++ b/inline_entity_form.module
@@ -554,6 +554,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_entity_form($controller, $form, $form_state);
+        }
       }
       else {
         $row = &$element['entities'][$key];
@@ -606,6 +609,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',
+          );
+        }
       }
     }
 
@@ -731,6 +751,12 @@ function inline_entity_form_field_widget_form(&$form, &$form_state, $field, $ins
       elseif ($form_state['inline_entity_form'][$ief_id]['form'] == 'ief_add_existing') {
         $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_entity_form($controller, $element['form'], $form_state);
+      }
 
       // No entities have been added. Remove the outer fieldset to reduce
       // visual noise caused by having two titles.
@@ -769,6 +795,19 @@ function inline_entity_form_entity_form($controller, $entity_form, &$form_state)
     $entity_form['#entity'] = inline_entity_form_create_entity($entity_form['#entity_type'], $form_settings['bundle'], $entity_form['#parent_language']);
     $entity_form['#title'] = t('Add new @type_singular', array('@type_singular' => $labels['singular']));
   }
+  elseif ($entity_form['#op'] == 'clone') {
+    // Build a delta suffix that's appended to button #name keys for uniqueness.
+    $ief_row_delta = $entity_form['#ief_row_delta'];
+    $form_settings = $form_state['inline_entity_form'][$entity_form['#ief_id']]['form settings'];
+    // Clone the entity
+    $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->is_new = TRUE;
+    // The other cloning changes are based on the entity type
+    // so they are mad on their form controllers.
+    $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);
@@ -803,9 +842,12 @@ function inline_entity_form_entity_form($controller, $entity_form, &$form_state)
   );
 
   // Add the appropriate submit handlers and their related data.
-  if ($entity_form['#op'] == 'add') {
-    $entity_form['actions']['ief_add_save']['#submit'] = array('inline_entity_form_close_form');
-    $entity_form['actions']['ief_add_cancel']['#submit'] = array('inline_entity_form_close_form');
+  if ($entity_form['#op'] == 'add' || $entity_form['#op'] == 'clone') {
+    $entity_form['actions']['ief_' . $entity_form['#op'] . '_save']['#submit'] = array('inline_entity_form_close_form');
+    $entity_form['actions']['ief_' . $entity_form['#op'] . '_cancel']['#submit'] = array('inline_entity_form_close_form');
+    if ($entity_form['#op'] == 'clone') {
+      $entity_form['actions']['ief_' . $entity_form['#op'] . '_save']['#value'] = t('Clone @type_singular', array('@type_singular' => $labels['singular']));
+    }
   }
   else {
     $entity_form['actions']['ief_edit_save']['#submit'] = array('inline_entity_form_close_row_form');
@@ -843,7 +885,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;
   }
 
@@ -858,7 +900,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'])) {
