Controller abstraction