diff --git a/includes/commerce_product.inline_entity_form.inc b/includes/commerce_product.inline_entity_form.inc
index 07b5724..d9766ae 100644
--- a/includes/commerce_product.inline_entity_form.inc
+++ b/includes/commerce_product.inline_entity_form.inc
@@ -152,6 +152,12 @@ class CommerceProductInlineEntityFormController extends EntityInlineEntityFormCo
     if (empty($product->product_id)) {
       $product->uid = $user->uid;
     }
+    // Clone product
+    if (isset($entity_form['#cloned_entity'])) {
+      $product->revision_id = NULL;
+      $product->sku = NULL;
+      $entity_form['#entity'] = $product;
+    }
 
     $entity_form['product_attributes'] = array(
       '#type' => 'fieldset',
diff --git a/includes/entity.inline_entity_form.inc b/includes/entity.inline_entity_form.inc
index 7b3891d..d1046d4 100644
--- a/includes/entity.inline_entity_form.inc
+++ b/includes/entity.inline_entity_form.inc
@@ -144,6 +144,7 @@ class EntityInlineEntityFormController {
     $defaults['allow_existing'] = FALSE;
     $defaults['match_operator'] = 'CONTAINS';
     $defaults['delete_references'] = FALSE;
+    $defaults['clone_button'] = FALSE;
     $labels = $this->defaultLabels();
     $defaults['override_labels'] = FALSE;
     $defaults['label_singular'] = $labels['singular'];
@@ -199,7 +200,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,
+    );
     $form['override_labels'] = array(
       '#type' => 'checkbox',
       '#title' => t('Override labels'),
diff --git a/includes/node.inline_entity_form.inc b/includes/node.inline_entity_form.inc
index ceccb3a..112dfcb 100644
--- a/includes/node.inline_entity_form.inc
+++ b/includes/node.inline_entity_form.inc
@@ -44,6 +44,15 @@ class NodeInlineEntityFormController extends EntityInlineEntityFormController {
     if (!isset($node->title)) {
       $node->title = NULL;
     }
+    // Clone node
+    if (isset($entity_form['#cloned_entity'])) {
+      $node->vid = NULL;
+      $node->tnid = NULL;
+      global $user;
+      $node->name = isset($user->name) ? $user->name : NULL;
+      $node->path = NULL;
+      $entity_form['#entity'] = $node;
+    }
     node_object_prepare($node);
 
     $entity_form['title'] = array(
diff --git a/inline_entity_form.module b/inline_entity_form.module
index 70935fb..f511f78 100644
--- a/inline_entity_form.module
+++ b/inline_entity_form.module
@@ -477,7 +477,11 @@ function inline_entity_form_field_widget_form(&$form, &$form_state, $field, $ins
       $delta++;
     }
   }
-
+  // Node clone integration.
+  $node_clone = FALSE;
+  if (isset($form['#node_edit_form']) && isset($form['#node']->clone_from_original_nid)) {
+    $node_clone = TRUE;
+  }
   // Build the appropriate widget.
   // The "Single value" widget assumes it is operating on a required single
   // value reference field with 1 allowed bundle.
@@ -513,6 +517,14 @@ function inline_entity_form_field_widget_form(&$form, &$form_state, $field, $ins
       $element['form']['#op'] = 'edit';
       $element['form']['#entity'] = $form_state['inline_entity_form'][$ief_id]['entities'][0]['entity'];
       $element['form']['#ief_row_delta'] = 0;
+      // Node clone integration - clone reference.
+      if ($node_clone) {
+        $element['form']['#op'] = 'clone';
+        // Unset original node reference field data to be cloned.
+        unset($entity_form['#ief_row_delta']);
+        $form_state['inline_entity_form'][$ief_id]['entities'] = array();
+        $form['#node']->{$element['#field_name']} = NULL;
+      }
     }
 
     $element['form'] = inline_entity_form_entity_form($controller, $element['form'], $form_state);
@@ -587,6 +599,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];
@@ -639,6 +654,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',
+          );
+        }
       }
     }
 
@@ -767,6 +799,21 @@ 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';
+        // pull the clone source form the triggering element only if trigger
+        // is the clone button
+        if (isset($form_state['triggering_element']['#ief_form']) && $form_state['triggering_element']['#ief_form'] == 'clone') {
+          $element['form']['#ief_row_delta'] = $form_state['triggering_element']['#ief_row_delta'];
+          // stash the clone source in the form state
+          $form_state['ief_last_ief_row_delta'] = $element['form']['#ief_row_delta'];
+        } elseif (isset($form_state['ief_last_ief_row_delta'])) {
+          // pull clone source from form state during AJAX updates from other elements
+          $element['form']['#ief_row_delta'] = $form_state['ief_last_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.
@@ -854,7 +901,20 @@ function inline_entity_form_entity_form($controller, $entity_form, &$form_state)
     $entity_form['#title'] = t('Add new @type_singular', array('@type_singular' => $labels['singular']));
     $save_label = t('Create @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'];
+    // Clone the entity.
+    $entity = !empty($entity_form['#entity']) ? $entity_form['#entity'] : $form_state['inline_entity_form'][$delta]['entities'][$ief_row_delta]['entity'];
+    $cloned_entity = inline_entity_form_clone_entity($entity_form['#entity_type'], $entity);
 
+    // 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['#cloned_entity'] = TRUE;
+    $entity_form['#title'] = t('Clone @type_singular', array('@type_singular' => $labels['singular']));
+    $save_label = t('Clone @type_singular', array('@type_singular' => $labels['singular']));
+  }
   // Retrieve the form provided by the controller.
   $entity_form = $controller->entityForm($entity_form, $form_state);
 
@@ -898,6 +958,21 @@ function inline_entity_form_entity_form($controller, $entity_form, &$form_state)
       'inline_entity_form_cleanup_form_state',
     );
   }
+  elseif ($entity_form['#op'] == 'clone') {
+    $entity_form['actions']['ief_' . $entity_form['#op'] . '_save']['#submit'] = array(
+      'inline_entity_form_trigger_submit',
+      'inline_entity_form_close_child_forms',
+      'inline_entity_form_close_form'
+    );
+    $entity_form['actions']['ief_' . $entity_form['#op'] . '_cancel']['#submit'] = array(
+      'inline_entity_form_close_child_forms',
+      'inline_entity_form_close_form',
+      'inline_entity_form_cleanup_form_state',
+    );
+    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']['#ief_row_delta'] = $entity_form['#ief_row_delta'];
     $entity_form['actions']['ief_edit_cancel']['#ief_row_delta'] = $entity_form['#ief_row_delta'];
@@ -974,7 +1049,7 @@ function inline_entity_form_entity_form_submit($entity_form, &$form_state) {
   $controller->entityFormSubmit($entity_form, $form_state);
   inline_entity_form_cleanup_entity_form_state($entity_form, $form_state);
 
-  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'])) {
@@ -1586,6 +1661,37 @@ function inline_entity_form_create_entity($entity_type, $bundle, $language = NUL
 }
 
 /**
+ * Prepare clone of an entity object.
+ *
+ * @param $entity_type
+ *   Entity type.
+ * @param $entity
+ *   Entity object.
+ *
+ * @return
+ *   New entity object with data from original.
+ */
+function inline_entity_form_clone_entity($entity_type, $entity) {
+  // Clone the entity.
+  module_load_include('inc', 'entity', 'includes/entity.ui');
+  // Save the original entity if is new before cloning.
+  // See this comment: https://drupal.org/node/1590146#comment-7769657.
+  if (!empty($entity->is_new)) {
+    entity_save($entity_type, $entity);
+  }
+  $cloned_entity = entity_ui_clone_entity($entity_type, $entity);
+
+  // Unset some common entities values.
+  foreach ($cloned_entity as $entity_key => $value) {
+    if (in_array($entity_key, array('created', 'changed', 'uid', 'revision_timestamp', 'revision_uid'))) {
+      $cloned_entity->{$entity_key} = NULL;
+    }
+  }
+
+  return $cloned_entity;
+}
+
+/**
  * Themes the table showing existing entity references in the widget.
  *
  * @param $variables
