safer core, does not rely on init being called
added reset() to API, used in init()