Extract core control to an abstract class for reuse