async handled right way, but still need refactoring