now depends on controller (not core)