lots of implementations. most work