split out functional core