callback is now optional