use core AbstractController to avoid conflict