architecture change, introduce tpl