first pass at client interface