Improve api, add implementations