added async callback support