Way too much stuff, maybe break this down later