updated from LOTS of work