a lot of work done, too lazy to name all