more validations, more robust, more verbose