This is looking really good, but I think it would be better broken out into a file per view model.