use abstract controller