Move caching responsibilities out of models