Refactored to abstract viewmodels from models