less buggy; returns with callbacks