re-design the API