Client abstraction