diff --git a/multifield.field.inc b/multifield.field.inc
index 61f2ebf..3b312b4 100644
--- a/multifield.field.inc
+++ b/multifield.field.inc
@@ -220,9 +220,18 @@ function multifield_field_presave($entity_type, $entity, $field, $instance, $lan
   foreach ($items as $delta => $item) {
     // If an ID is not yes assigned, add one, unless this hook is invoked
     // from the default value widget on the field instance (empty $entity).
+    // If this is a new or cloned entity, ensure that the internal ID values
+    // are reset.
     if (empty($item['id']) && !empty($entity)) {
       $item['id'] = multifield_get_next_id();
     }
+    // If an ID is assigned, but this is a new entity, then ensure that the ID
+    // is reassigned a new value.
+    // Cannot rely on $entity->is_new being set here because it usually gets
+    // added after calling field_attach_presave().
+    elseif (!empty($item['id']) && empty($entity->original)) {
+      $item['id'] = multifield_get_next_id();
+    }
 
     $pseudo_entity = _multifield_field_item_to_entity($machine_name, $item);
 
@@ -847,7 +856,7 @@ function multifield_field_formatter_view($entity_type, $entity, $field, $instanc
 function _multifield_create_stub_entity_with_subfield_data($machine_name, array &$items, array $original_items, $parent_entity_type, $parent_entity, $langcode) {
   // Create a stub clone of the parent entity.
   $stub = entity_create_stub_entity($parent_entity_type, entity_extract_ids($parent_entity_type, $parent_entity));
-  if (isset($parent_entity->original)) {
+  if (!empty($parent_entity->original)) {
     $stub->original = entity_create_stub_entity($parent_entity_type, entity_extract_ids($parent_entity_type, $parent_entity->original));
   }
   foreach (multifield_type_get_subfields($machine_name) as $subfield_name) {
diff --git a/multifield.info b/multifield.info
index 60363ba..37f19d5 100644
--- a/multifield.info
+++ b/multifield.info
@@ -11,6 +11,8 @@ files[] = tests/MultifieldCommerceIntegrationTest.test
 files[] = tests/MultifieldDevelGenerateTestCase.test
 files[] = tests/MultifieldEntityTranslationTestCase.test
 files[] = tests/MultifieldFileUsageTestCase.test
+files[] = tests/MultifieldNodeCloneIntegrationTest.test
+files[] = tests/MultifieldReplicateIntegrationTest.test
 files[] = tests/MultifieldTestBase.test
 files[] = tests/MultifieldUnitTestCase.test
 test_dependencies[] = addressfield
diff --git a/tests/MultifieldCommerceIntegrationTest.test b/tests/MultifieldCommerceIntegrationTest.test
index b5f44b5..cbc7917 100644
--- a/tests/MultifieldCommerceIntegrationTest.test
+++ b/tests/MultifieldCommerceIntegrationTest.test
@@ -6,8 +6,6 @@
 
 class MultifieldCommerceIntegrationTest extends MultifieldTestBase {
 
-  protected $profile = 'testing';
-
   public static function getInfo() {
     return array(
       'name' => 'Drupal Commerce integration',
diff --git a/tests/MultifieldNodeCloneIntegrationTest.test b/tests/MultifieldNodeCloneIntegrationTest.test
new file mode 100644
index 0000000..146a7f8
--- /dev/null
+++ b/tests/MultifieldNodeCloneIntegrationTest.test
@@ -0,0 +1,54 @@
+<?php
+
+class MultifieldNodeCloneIntegrationTest extends MultifieldTestBase {
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Node Clone integration',
+      'description' => 'Tests multifield integration with the Node Clone module.',
+      'group' => 'Multifield',
+      'dependencies' => array('clone'),
+    );
+  }
+
+  public function setUp() {
+    parent::setUp(array('clone'));
+  }
+
+  public function testNodeClone() {
+    // Add the test node type.
+    $node_type = $this->drupalCreateContentType()->type;
+
+    field_create_field(array(
+      'field_name' => 'field_multifield',
+      'type' => 'multifield',
+      'cardinality' => FIELD_CARDINALITY_UNLIMITED,
+    ));
+    field_create_field(array(
+      'field_name' => 'field_test',
+      'type' => 'test_field',
+    ));
+    field_create_instance(array(
+      'field_name' => 'field_test',
+      'entity_type' => 'multifield',
+      'bundle' => 'field_multifield',
+    ));
+    field_create_instance(array(
+      'field_name' => 'field_multifield',
+      'entity_type' => 'node',
+      'bundle' => $node_type,
+    ));
+
+    $node = entity_create_stub_entity('node', array(NULL, NULL, $node_type));
+    $node->field_multifield[LANGUAGE_NONE][0]['field_test'][LANGUAGE_NONE][0]['value'] = 1;
+    node_save($node);
+
+    module_load_include('inc', 'clone', 'clone.pages');
+    $clone_nid = clone_node_save($node->nid);
+    $clone = node_load($clone_nid);
+
+    $this->assertEqual($node->field_multifield[LANGUAGE_NONE][0]['field_test'], $clone->field_multifield[LANGUAGE_NONE][0]['field_test']);
+    $this->assertNotEqual($node->field_multifield[LANGUAGE_NONE][0]['id'], $clone->field_multifield[LANGUAGE_NONE][0]['id']);
+
+  }
+}
diff --git a/tests/MultifieldReplicateIntegrationTest.test b/tests/MultifieldReplicateIntegrationTest.test
new file mode 100644
index 0000000..376fbb7
--- /dev/null
+++ b/tests/MultifieldReplicateIntegrationTest.test
@@ -0,0 +1,53 @@
+<?php
+
+class MultifieldReplicateIntegrationTest extends MultifieldTestBase {
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Replicate integration',
+      'description' => 'Tests multifield integration with the Replicate module.',
+      'group' => 'Multifield',
+      'dependencies' => array('replicate'),
+    );
+  }
+
+  public function setUp() {
+    parent::setUp(array('replicate'));
+  }
+
+  public function testReplicate() {
+    // Add the test node type.
+    $node_type = $this->drupalCreateContentType()->type;
+
+    field_create_field(array(
+      'field_name' => 'field_multifield',
+      'type' => 'multifield',
+      'cardinality' => FIELD_CARDINALITY_UNLIMITED,
+    ));
+    field_create_field(array(
+      'field_name' => 'field_test',
+      'type' => 'test_field',
+    ));
+    field_create_instance(array(
+      'field_name' => 'field_test',
+      'entity_type' => 'multifield',
+      'bundle' => 'field_multifield',
+    ));
+    field_create_instance(array(
+      'field_name' => 'field_multifield',
+      'entity_type' => 'node',
+      'bundle' => $node_type,
+    ));
+
+    $node = entity_create_stub_entity('node', array(NULL, NULL, $node_type));
+    $node->field_multifield[LANGUAGE_NONE][0]['field_test'][LANGUAGE_NONE][0]['value'] = 1;
+    node_save($node);
+
+    $clone_nid = replicate_entity('node', $node);
+    $clone = node_load($clone_nid);
+
+    $this->assertEqual($node->field_multifield[LANGUAGE_NONE][0]['field_test'], $clone->field_multifield[LANGUAGE_NONE][0]['field_test']);
+    $this->assertNotEqual($node->field_multifield[LANGUAGE_NONE][0]['id'], $clone->field_multifield[LANGUAGE_NONE][0]['id']);
+
+  }
+}
diff --git a/tests/MultifieldUnitTestCase.test b/tests/MultifieldUnitTestCase.test
index a132ac2..3185614 100644
--- a/tests/MultifieldUnitTestCase.test
+++ b/tests/MultifieldUnitTestCase.test
@@ -1,7 +1,6 @@
 <?php
 
-class MultifieldUnitTestCase extends DrupalWebTestCase {
-  protected $profile = 'testing';
+class MultifieldUnitTestCase extends MultifieldTestBase {
 
   public static function getInfo() {
     return array(
@@ -11,10 +10,6 @@ class MultifieldUnitTestCase extends DrupalWebTestCase {
     );
   }
 
-  public function setUp() {
-    parent::setUp(array('field_test', 'multifield'));
-  }
-
   public function testMultifieldField() {
     $multifield_field = array(
       'field_name' => 'test',
@@ -535,4 +530,43 @@ class MultifieldUnitTestCase extends DrupalWebTestCase {
       ),
     ));
   }
+
+  public function testCloning() {
+    // Add the test node type.
+    $node_type = $this->drupalCreateContentType()->type;
+
+    field_create_field(array(
+      'field_name' => 'field_multifield',
+      'type' => 'multifield',
+      'cardinality' => FIELD_CARDINALITY_UNLIMITED,
+    ));
+    field_create_field(array(
+      'field_name' => 'field_test',
+      'type' => 'test_field',
+    ));
+    field_create_instance(array(
+      'field_name' => 'field_test',
+      'entity_type' => 'multifield',
+      'bundle' => 'field_multifield',
+    ));
+    field_create_instance(array(
+      'field_name' => 'field_multifield',
+      'entity_type' => 'node',
+      'bundle' => $node_type,
+    ));
+
+    // Test creating a new entity with a manual ID.
+    $node = entity_create_stub_entity('node', array(1, 1, $node_type));
+    $node->is_new = TRUE;
+    $node->field_multifield[LANGUAGE_NONE][0]['field_test'][LANGUAGE_NONE][0]['value'] = 1;
+    node_save($node);
+
+    $clone = clone $node;
+    $clone->nid = NULL;
+    $clone->vid = NULL;
+    node_save($clone);
+
+    $this->assertEqual($node->field_multifield[LANGUAGE_NONE][0]['field_test'], $clone->field_multifield[LANGUAGE_NONE][0]['field_test']);
+    $this->assertNotEqual($node->field_multifield[LANGUAGE_NONE][0]['id'], $clone->field_multifield[LANGUAGE_NONE][0]['id']);
+  }
 }
