basic client implementation