add callback interface