added abstraction for CPS