separated API and specific functionality