always use destination's thread to avoid race conditions