split hosted-level functionality into it's own plugin