split functionality into singletons