final API (I think)