refactor to simpler singleton interface