callbacks now need to return errors