Client refactoring. Divided client interface and abstract base client impl.