improve async state interface