re-implement 'update'