diff --git a/field_collection.module b/field_collection.module
index 30f175e..f45d028 100644
--- a/field_collection.module
+++ b/field_collection.module
@@ -1400,3 +1400,54 @@ function field_collection_devel_generate($object, $field, $instance, $bundle) {
 
   return array('value' => $field_collection->item_id);
 }
+
+/**
+ * Implements hook_node_clone_alter().
+ */
+function field_collection_clone_node_alter(&$node, $context) {
+  foreach (field_info_fields() as $field_name => $field) {
+    if ($field['type'] == 'field_collection' && isset($node->$field_name)) {
+      foreach($node->$field_name as $language => $values){
+        field_collection_clone_items('node', $node, $field_name, $language);
+      }
+    }
+  }
+}
+
+function field_collection_clone_items($entity_type, &$entity, $fc_field, $language = LANGUAGE_NONE){
+  $entity_wrapper = entity_metadata_wrapper($entity_type, $entity);
+  $old_fc_items = $entity_wrapper->{$fc_field}->value();
+  if (!is_array($old_fc_items)) {
+    $old_fc_items = array($old_fc_items);
+  }
+
+  $field_info_instances = field_info_instances();
+  $field_names = element_children($field_info_instances['field_collection_item'][$fc_field]);
+
+  unset($entity->{$fc_field}[$language]);
+
+  foreach ($old_fc_items as $old_fc_item) {
+    $old_fc_item_wrapper = entity_metadata_wrapper('field_collection_item', $old_fc_item);
+    $new_fc_item = entity_create('field_collection_item', array('field_name' => $fc_field));
+    $new_fc_item->setHostEntity($entity_type, $entity);
+    $new_fc_item_wrapper = entity_metadata_wrapper('field_collection_item', $new_fc_item);
+
+    foreach ($field_names as $field_name) {
+      if (!empty($old_fc_item->{$field_name})){
+        $new_fc_item->{$field_name} = $old_fc_item->{$field_name};
+      }
+    }
+    $new_fc_item_wrapper->save();
+
+    // Now check if any of the fields in the newly cloned fc item is a field
+    // collection and recursively call this function to properly clone it.
+    foreach ($field_names as $field_name) {
+      if (!empty($new_fc_item->{$field_name})){
+        $field_info = field_info_field($field_name);
+        if ($field_info['type'] == 'field_collection'){
+          field_collection_clone_items('field_collection_item',$new_fc_item, $field_name, $language);
+        }
+      }
+    }
+  }
+}
