lots of changes, too lazy to outline