cleaned up callback interface