refactored to use Controller base