callbacks now pass in request object