add validations and callbacks