use async cb interface