Changed way too much to care about splitting it up. See the diff!