re-designed API