this needs work and lots of it