move some logic to CoreFeatures