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/tests/MultifieldUnitTestCase.test b/tests/MultifieldUnitTestCase.test
index a132ac2..1dafc99 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'][LANGUAGE_NONE][0]['value'], $clone->field_multifield[LANGUAGE_NONE][0]['field_test'][LANGUAGE_NONE][0]['value']);
+    $this->assertNotEqual($node->field_multifield[LANGUAGE_NONE][0]['id'], $clone->field_multifield[LANGUAGE_NONE][0]['id']);
+  }
 }
