Don’t use :FindFirstChild() unless there’s a chance of the instance not existing. Use :WaitForChild() instead.
You need to preserve the original humanoid. Try setting the original character’s Humanoid’s parent to nil, replace the character, and parent the humanoid to the new character.
Humanoids will basically try to kill themselves when you move them around, so right after you move the humanoid, use humanoid:SetStateEnabled(Enum.HumanoidStateType.Dead, false).
Games that replace the standard Roblox avatar start by unchecking Player->CharacterAutoLoads in the Explorer pane of your place. This way, you won’t have CharacterAdded firing automatically, and you won’t have to deal with Roblox code fighting with your code over who is setting Player.Character and when. It does mean that you have to watch for characters removing, to make sure respawning works.
WaitForChild is only needed for things that are replicating from another context, being created or cloned into existence by another script or coroutine. By the time your server starts running scripts, everything in ServerStorage is immediately available to FindFirstChild, and everything you copy with :Clone() is done synchronously, so all the cloned model’s children exist before your next line of Lua gets executed. Using FindFirstChild lets you immediately check for it to return nil, and catch errors like trying to clone something and getting the name wrong, whereas WaitForChild would just hang for as long as you let it.
Also, it’s generally not a good idea to try to transplant Humanoid instances between character models. Just copy over any property values you need to preserve.