separate hub functions