really tightened up the api