refactored to allow for a la carte features