How to replicate items client grab and move around

I’m trying to find a way to replicate an item a player has grabbed and is moving around. I’ve tried using SetNetworkOwner when they grab it. Basically when client grabs, I weld it to a client side hand and then can move the item around. This is all client side. I fire a remote to server to SetNetworkOwner (which I assumed meant client handles all physics and thus replication) but it’s not changing at all on other clients or the server. I’ve also tried just sending the CFrame to the server on RenderStepped, but it’s causing lots of glitches with items being flung around/flying out of the map

-- Client
-- Add a grip attachment at the end of the arm
	local Attachment = Instance.new("Attachment")
	Attachment.Name = "Grip"
	Attachment.Position = Vector3.new(0, -(Distance / 2), 0)
	Attachment.Parent = self.Arm["Right Arm"]

	if GrabbableItem then -- Grabbable item
		PlayerService.GrabItem:Fire(instance)

		self.GrabbedItem = instance
		instance:SetAttribute("PickupLookVector", instance:GetPivot().LookVector)

		-- Weld item to arm
		local Weld = Instance.new("Weld")
		Weld.Part0 = self.Arm["Right Arm"]
		Weld.Part1 = instance
		Weld.C0 = CFrame.new(
			self.Arm["Right Arm"].CFrame:PointToObjectSpace(Attachment.WorldCFrame.Position),
			instance:GetPivot().LookVector
		)

		Weld.Parent = self.Arm["Right Arm"]
	end
-- Server
self.Client.GrabItem:Connect(function(player, item)
	item:SetNetworkOwner(player) -- does nothing
end)