diff --git a/src/Arr.php b/src/Arr.php
index <HASH>..<HASH> 100644
--- a/src/Arr.php
+++ b/src/Arr.php
@@ -65,8 +65,24 @@ class Arr
      */
     public static function remove(&$array, $object)
     {
-        if (in_array($object, $array, true)) {
-            unset($array[spl_object_hash($object)]);
-        }
+        unset($array[spl_object_hash($object)]);
+    }
+
+    /**
+     * Move an object to another array.
+     *
+     * @param array  $old
+     * @param array  $new
+     * @param object $object
+     *
+     * @return void
+     */
+    public static function move(&$old, &$new, $object)
+    {
+        $hash = spl_object_hash($object);
+
+        unset($old[$hash]);
+
+        $new[$hash] = $object;
     }
 }
diff --git a/src/Factory.php b/src/Factory.php
index <HASH>..<HASH> 100644
--- a/src/Factory.php
+++ b/src/Factory.php
@@ -284,8 +284,9 @@ class Factory
             throw new SaveFailedException(get_class($object));
         }
 
-        Arr::add($this->saved, $object);
-        Arr::remove($this->pending, $object);
+        if (!$this->isSaved($object)) {
+            Arr::move($this->pending, $this->saved, $object);
+        }
     }
 
     /**
Fixed the logic to move to the saved array