Use completion callback instead of timeout