Refactored for clean client API