onSave/onDelete now use different signature and take callback