client can call directly