move AsyncUtil to a more appropriate place