this should be broken apart into MVP