Further refactoring, moving impl specific code into providers