This is an automated email from the ASF dual-hosted git repository.

tison pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/curator.git


The following commit(s) were added to refs/heads/master by this push:
     new f0646f93c CURATOR-718: Refactor CuratorFramework inheritance hierarchy 
by composing functionalities (#517)
f0646f93c is described below

commit f0646f93c54a14546afcd2ff7ebca78546154fe9
Author: Kezhu Wang <[email protected]>
AuthorDate: Mon Feb 17 09:03:32 2025 +0800

    CURATOR-718: Refactor CuratorFramework inheritance hierarchy by composing 
functionalities (#517)
    
    * CURATOR-718: Refactor CuratorFramework inheritance hierarchy by composing 
functionalities
    
    Currently, the `CuratorFrameworkImpl` hierarchy is neither simple nor
    composable.
    
    Ideally, there should be only one instance of `CuratorFrameworkImpl`. 
Additional functionalities should be added by intercepting methods on purpose, 
but not by cloning through `CuratorFrameworkImpl(CuratorFrameworkImpl parent)`.
    
    We could take CURATOR-626 and CURATOR-710 as lessons to know how brittle 
the current hierarchy.
    
    * fixup! CURATOR-718: Refactor CuratorFramework inheritance hierarchy by 
composing functionalities
    
    Notable changes to the last review:
    
    1. Rename `InternalCuratorFramework` to `CuratorFrameworkBase`.
    2. Make `DelegatingCuratorFramework` `abstract` and package `private`.
    3. Move `start`/`close` from `DelegatingCuratorFramework` to subclasses.
---
 .../framework/imps/AddWatchBuilderImpl.java        |   6 +-
 .../curator/framework/imps/BackgroundSyncImpl.java |   4 +-
 .../curator/framework/imps/Backgrounding.java      |   8 +-
 .../curator/framework/imps/CreateBuilderImpl.java  |  14 +-
 .../curator/framework/imps/CuratorEventImpl.java   |   2 +-
 .../framework/imps/CuratorFrameworkBase.java       | 263 +++++++++++++++++++++
 .../framework/imps/CuratorFrameworkImpl.java       | 249 +------------------
 .../imps/CuratorMultiTransactionImpl.java          |   6 +-
 .../framework/imps/CuratorTempFrameworkImpl.java   |   6 +-
 .../framework/imps/CuratorTransactionImpl.java     |  10 +-
 .../framework/imps/DelegatingCuratorFramework.java | 206 ++++++++++++++++
 .../curator/framework/imps/DeleteBuilderImpl.java  |   6 +-
 .../curator/framework/imps/ExistsBuilderImpl.java  |   6 +-
 .../FindAndDeleteProtectedNodeInBackground.java    |   4 +-
 ...espaceWatchedEvent.java => FrameworkUtils.java} |  29 ++-
 .../curator/framework/imps/GetACLBuilderImpl.java  |   6 +-
 .../framework/imps/GetChildrenBuilderImpl.java     |   6 +-
 .../framework/imps/GetConfigBuilderImpl.java       |   8 +-
 .../curator/framework/imps/GetDataBuilderImpl.java |   6 +-
 .../curator/framework/imps/NamespaceFacade.java    |  86 +------
 .../framework/imps/NamespaceWatchedEvent.java      |   2 +-
 .../curator/framework/imps/NamespaceWatcher.java   |   6 +-
 .../curator/framework/imps/ProtectedMode.java      |   4 +-
 .../framework/imps/ReconfigBuilderImpl.java        |   6 +-
 .../framework/imps/RemoveWatchesBuilderImpl.java   |   8 +-
 .../curator/framework/imps/SetACLBuilderImpl.java  |   6 +-
 .../curator/framework/imps/SetDataBuilderImpl.java |   8 +-
 .../curator/framework/imps/SyncBuilderImpl.java    |   6 +-
 .../framework/imps/TempGetDataBuilderImpl.java     |   4 +-
 .../curator/framework/imps/TransactionOpImpl.java  |   4 +-
 .../framework/imps/WatcherRemovalFacade.java       | 127 +---------
 .../framework/imps/WatcherRemovalManager.java      |   4 +-
 .../curator/framework/imps/WatchesBuilderImpl.java |   4 +-
 .../apache/curator/framework/imps/Watching.java    |  10 +-
 .../curator/framework/imps/TestCleanState.java     |   2 +-
 .../framework/imps/TestFailedDeleteManager.java    |   4 +-
 .../curator/framework/imps/TestFramework.java      |   2 +-
 .../framework/imps/TestNamespaceFacade.java        |   3 +-
 .../framework/imps/TestReconfiguration.java        |   2 +-
 .../curator/framework/imps/TestWatchesBuilder.java |  16 +-
 .../recipes/leader/TestLeaderSelectorEdges.java    |   7 +-
 .../x/async/details/AsyncCreateBuilderImpl.java    |   6 +-
 .../x/async/details/AsyncCuratorFrameworkImpl.java |  12 +-
 .../x/async/details/AsyncDeleteBuilderImpl.java    |   6 +-
 .../x/async/details/AsyncExistsBuilderImpl.java    |   6 +-
 .../async/details/AsyncGetChildrenBuilderImpl.java |   6 +-
 .../x/async/details/AsyncGetConfigBuilderImpl.java |   6 +-
 .../x/async/details/AsyncGetDataBuilderImpl.java   |   6 +-
 .../x/async/details/AsyncReconfigBuilderImpl.java  |   6 +-
 .../details/AsyncRemoveWatchesBuilderImpl.java     |   6 +-
 .../x/async/details/AsyncSetACLBuilderImpl.java    |   6 +-
 .../x/async/details/AsyncSetDataBuilderImpl.java   |   6 +-
 .../x/async/details/AsyncTransactionOpImpl.java    |   6 +-
 .../x/async/details/AsyncWatchBuilderImpl.java     |   6 +-
 54 files changed, 663 insertions(+), 587 deletions(-)

diff --git 
a/curator-framework/src/main/java/org/apache/curator/framework/imps/AddWatchBuilderImpl.java
 
b/curator-framework/src/main/java/org/apache/curator/framework/imps/AddWatchBuilderImpl.java
index 923edbc76..740572a82 100644
--- 
a/curator-framework/src/main/java/org/apache/curator/framework/imps/AddWatchBuilderImpl.java
+++ 
b/curator-framework/src/main/java/org/apache/curator/framework/imps/AddWatchBuilderImpl.java
@@ -34,18 +34,18 @@ import org.apache.zookeeper.AddWatchMode;
 import org.apache.zookeeper.Watcher;
 
 public class AddWatchBuilderImpl implements AddWatchBuilder, Pathable<Void>, 
BackgroundOperation<String> {
-    private final CuratorFrameworkImpl client;
+    private final CuratorFrameworkBase client;
     private Watching watching;
     private Backgrounding backgrounding = new Backgrounding();
     private AddWatchMode mode = AddWatchMode.PERSISTENT_RECURSIVE;
 
-    AddWatchBuilderImpl(CuratorFrameworkImpl client) {
+    AddWatchBuilderImpl(CuratorFrameworkBase client) {
         this.client = client;
         watching = new Watching(client, true);
     }
 
     public AddWatchBuilderImpl(
-            CuratorFrameworkImpl client, Watching watching, Backgrounding 
backgrounding, AddWatchMode mode) {
+            CuratorFrameworkBase client, Watching watching, Backgrounding 
backgrounding, AddWatchMode mode) {
         this.client = client;
         this.watching = watching;
         this.backgrounding = backgrounding;
diff --git 
a/curator-framework/src/main/java/org/apache/curator/framework/imps/BackgroundSyncImpl.java
 
b/curator-framework/src/main/java/org/apache/curator/framework/imps/BackgroundSyncImpl.java
index 797855116..e3f83c3df 100644
--- 
a/curator-framework/src/main/java/org/apache/curator/framework/imps/BackgroundSyncImpl.java
+++ 
b/curator-framework/src/main/java/org/apache/curator/framework/imps/BackgroundSyncImpl.java
@@ -24,10 +24,10 @@ import org.apache.curator.framework.api.CuratorEventType;
 import org.apache.zookeeper.AsyncCallback;
 
 class BackgroundSyncImpl implements BackgroundOperation<String> {
-    private final CuratorFrameworkImpl client;
+    private final CuratorFrameworkBase client;
     private final Object context;
 
-    BackgroundSyncImpl(CuratorFrameworkImpl client, Object context) {
+    BackgroundSyncImpl(CuratorFrameworkBase client, Object context) {
         this.client = client;
         this.context = context;
     }
diff --git 
a/curator-framework/src/main/java/org/apache/curator/framework/imps/Backgrounding.java
 
b/curator-framework/src/main/java/org/apache/curator/framework/imps/Backgrounding.java
index 60d253c25..6f74a9f14 100644
--- 
a/curator-framework/src/main/java/org/apache/curator/framework/imps/Backgrounding.java
+++ 
b/curator-framework/src/main/java/org/apache/curator/framework/imps/Backgrounding.java
@@ -62,11 +62,11 @@ public class Backgrounding {
         errorListener = null;
     }
 
-    Backgrounding(CuratorFrameworkImpl client, BackgroundCallback callback, 
Object context, Executor executor) {
+    Backgrounding(CuratorFrameworkBase client, BackgroundCallback callback, 
Object context, Executor executor) {
         this(wrapCallback(client, callback, executor), context);
     }
 
-    Backgrounding(CuratorFrameworkImpl client, BackgroundCallback callback, 
Executor executor) {
+    Backgrounding(CuratorFrameworkBase client, BackgroundCallback callback, 
Executor executor) {
         this(wrapCallback(client, callback, executor));
     }
 
@@ -119,7 +119,7 @@ public class Backgrounding {
     }
 
     private static BackgroundCallback wrapCallback(
-            final CuratorFrameworkImpl client, final BackgroundCallback 
callback, final Executor executor) {
+            final CuratorFrameworkBase client, final BackgroundCallback 
callback, final Executor executor) {
         return new BackgroundCallback() {
             @Override
             public void processResult(CuratorFramework dummy, final 
CuratorEvent event) throws Exception {
@@ -131,7 +131,7 @@ public class Backgrounding {
                         } catch (Exception e) {
                             ThreadUtils.checkInterrupted(e);
                             if (e instanceof KeeperException) {
-                                
client.validateConnection(client.codeToState(((KeeperException) e).code()));
+                                
client.validateConnection(FrameworkUtils.codeToState(((KeeperException) 
e).code()));
                             }
                             client.logError("Background operation result 
handling threw exception", e);
                         }
diff --git 
a/curator-framework/src/main/java/org/apache/curator/framework/imps/CreateBuilderImpl.java
 
b/curator-framework/src/main/java/org/apache/curator/framework/imps/CreateBuilderImpl.java
index b76ce98f4..cc6a09a60 100644
--- 
a/curator-framework/src/main/java/org/apache/curator/framework/imps/CreateBuilderImpl.java
+++ 
b/curator-framework/src/main/java/org/apache/curator/framework/imps/CreateBuilderImpl.java
@@ -70,7 +70,7 @@ public class CreateBuilderImpl
                 BackgroundOperation<PathAndBytes>,
                 ErrorListenerPathAndBytesable<String> {
     private final Logger log = LoggerFactory.getLogger(getClass());
-    private final CuratorFrameworkImpl client;
+    private final CuratorFrameworkBase client;
     private final ProtectedMode protectedMode = new ProtectedMode();
     private CreateMode createMode;
     private Backgrounding backgrounding;
@@ -93,7 +93,7 @@ public class CreateBuilderImpl
     @VisibleForTesting
     boolean failNextIdempotentCheckForTesting = false;
 
-    CreateBuilderImpl(CuratorFrameworkImpl client) {
+    CreateBuilderImpl(CuratorFrameworkBase client) {
         this.client = client;
         createMode = CreateMode.PERSISTENT;
         backgrounding = new Backgrounding();
@@ -107,7 +107,7 @@ public class CreateBuilderImpl
     }
 
     public CreateBuilderImpl(
-            CuratorFrameworkImpl client,
+            CuratorFrameworkBase client,
             CreateMode createMode,
             Backgrounding backgrounding,
             boolean createParentsIfNeeded,
@@ -737,7 +737,7 @@ public class CreateBuilderImpl
     }
 
     static <T> void backgroundCreateParentsThenNode(
-            final CuratorFrameworkImpl client,
+            final CuratorFrameworkBase client,
             final OperationAndData<T> mainOperationAndData,
             final String path,
             final InternalACLProvider aclProvider,
@@ -766,7 +766,7 @@ public class CreateBuilderImpl
     }
 
     private void backgroundSetData(
-            final CuratorFrameworkImpl client,
+            final CuratorFrameworkBase client,
             final OperationAndData<PathAndBytes> mainOperationAndData,
             final String path,
             final Backgrounding backgrounding) {
@@ -801,7 +801,7 @@ public class CreateBuilderImpl
     }
 
     private void backgroundCheckIdempotent(
-            final CuratorFrameworkImpl client,
+            final CuratorFrameworkBase client,
             final OperationAndData<PathAndBytes> mainOperationAndData,
             final String path,
             final Backgrounding backgrounding) {
@@ -844,7 +844,7 @@ public class CreateBuilderImpl
     }
 
     private static <T> void sendBackgroundResponse(
-            CuratorFrameworkImpl client,
+            CuratorFrameworkBase client,
             int rc,
             String path,
             Object ctx,
diff --git 
a/curator-framework/src/main/java/org/apache/curator/framework/imps/CuratorEventImpl.java
 
b/curator-framework/src/main/java/org/apache/curator/framework/imps/CuratorEventImpl.java
index e492e46a0..8cee4bdb7 100644
--- 
a/curator-framework/src/main/java/org/apache/curator/framework/imps/CuratorEventImpl.java
+++ 
b/curator-framework/src/main/java/org/apache/curator/framework/imps/CuratorEventImpl.java
@@ -114,7 +114,7 @@ class CuratorEventImpl implements CuratorEvent {
     }
 
     CuratorEventImpl(
-            CuratorFrameworkImpl client,
+            CuratorFrameworkBase client,
             CuratorEventType type,
             int resultCode,
             String path,
diff --git 
a/curator-framework/src/main/java/org/apache/curator/framework/imps/CuratorFrameworkBase.java
 
b/curator-framework/src/main/java/org/apache/curator/framework/imps/CuratorFrameworkBase.java
new file mode 100644
index 000000000..1b6c461b2
--- /dev/null
+++ 
b/curator-framework/src/main/java/org/apache/curator/framework/imps/CuratorFrameworkBase.java
@@ -0,0 +1,263 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.curator.framework.imps;
+
+import com.google.common.base.Preconditions;
+import org.apache.curator.framework.CuratorFramework;
+import org.apache.curator.framework.WatcherRemoveCuratorFramework;
+import org.apache.curator.framework.api.ACLProvider;
+import org.apache.curator.framework.api.CompressionProvider;
+import org.apache.curator.framework.api.CreateBuilder;
+import org.apache.curator.framework.api.CuratorClosedException;
+import org.apache.curator.framework.api.CuratorEvent;
+import org.apache.curator.framework.api.DeleteBuilder;
+import org.apache.curator.framework.api.ExistsBuilder;
+import org.apache.curator.framework.api.GetACLBuilder;
+import org.apache.curator.framework.api.GetChildrenBuilder;
+import org.apache.curator.framework.api.GetConfigBuilder;
+import org.apache.curator.framework.api.GetDataBuilder;
+import org.apache.curator.framework.api.ReconfigBuilder;
+import org.apache.curator.framework.api.RemoveWatchesBuilder;
+import org.apache.curator.framework.api.SetACLBuilder;
+import org.apache.curator.framework.api.SetDataBuilder;
+import org.apache.curator.framework.api.SyncBuilder;
+import org.apache.curator.framework.api.WatchesBuilder;
+import org.apache.curator.framework.api.transaction.CuratorMultiTransaction;
+import org.apache.curator.framework.api.transaction.CuratorTransaction;
+import org.apache.curator.framework.api.transaction.TransactionOp;
+import org.apache.curator.utils.EnsurePath;
+import org.apache.curator.utils.ZKPaths;
+import org.apache.zookeeper.Watcher;
+import org.apache.zookeeper.ZooKeeper;
+
+/**
+ * This is the base class of all {@link CuratorFramework}s, it is public for 
private usages (a.k.a. impls/details package).
+ *
+ * <p>Most internal codes should use {@link CuratorFrameworkBase} instead of 
{@link CuratorFrameworkImpl}, so
+ * functionalities could be added additively by overriding methods in {@link 
DelegatingCuratorFramework}.
+ *
+ * <p>An instance of {@link CuratorFramework} MUST BE an instance of {@link 
CuratorFrameworkBase}.
+ */
+public abstract class CuratorFrameworkBase implements CuratorFramework {
+    abstract NamespaceImpl getNamespaceImpl();
+
+    @Override
+    public final CuratorFramework nonNamespaceView() {
+        return usingNamespace(null);
+    }
+
+    @Override
+    public final String getNamespace() {
+        NamespaceImpl namespace = getNamespaceImpl();
+        String str = namespace.getNamespace();
+        return (str != null) ? str : "";
+    }
+
+    @Deprecated
+    @Override
+    public EnsurePath newNamespaceAwareEnsurePath(String path) {
+        NamespaceImpl namespace = getNamespaceImpl();
+        return namespace.newNamespaceAwareEnsurePath(path);
+    }
+
+    final String unfixForNamespace(String path) {
+        NamespaceImpl namespace = getNamespaceImpl();
+        return namespace.unfixForNamespace(path);
+    }
+
+    final String fixForNamespace(String path) {
+        NamespaceImpl namespace = getNamespaceImpl();
+        return namespace.fixForNamespace(path, false);
+    }
+
+    abstract void validateConnection(Watcher.Event.KeeperState state);
+
+    final String fixForNamespace(String path, boolean isSequential) {
+        NamespaceImpl namespace = getNamespaceImpl();
+        return namespace.fixForNamespace(path, isSequential);
+    }
+
+    protected final void checkState() {
+        CuratorFrameworkState state = getState();
+        switch (state) {
+            case STARTED:
+                return;
+            case STOPPED:
+                throw new CuratorClosedException();
+            default:
+                String msg = String.format("Expected state [%s] was [%s]", 
CuratorFrameworkState.STARTED, state);
+                throw new IllegalStateException(msg);
+        }
+    }
+
+    final ZooKeeper getZooKeeper() throws Exception {
+        return getZookeeperClient().getZooKeeper();
+    }
+
+    protected final void internalSync(CuratorFrameworkBase impl, String path, 
Object context) {
+        BackgroundOperation<String> operation = new BackgroundSyncImpl(impl, 
context);
+        processBackgroundOperation(new OperationAndData(operation, path, null, 
null, context, null), null);
+    }
+
+    abstract byte[] getDefaultData();
+
+    abstract CompressionProvider getCompressionProvider();
+
+    abstract ACLProvider getAclProvider();
+
+    abstract boolean useContainerParentsIfAvailable();
+
+    abstract EnsembleTracker getEnsembleTracker();
+
+    abstract NamespaceFacadeCache getNamespaceFacadeCache();
+
+    @Override
+    public CreateBuilder create() {
+        checkState();
+        return new CreateBuilderImpl(this);
+    }
+
+    @Override
+    public DeleteBuilder delete() {
+        checkState();
+        return new DeleteBuilderImpl(this);
+    }
+
+    @Override
+    public ExistsBuilder checkExists() {
+        checkState();
+        return new ExistsBuilderImpl(this);
+    }
+
+    @Override
+    public GetDataBuilder getData() {
+        checkState();
+        return new GetDataBuilderImpl(this);
+    }
+
+    @Override
+    public SetDataBuilder setData() {
+        checkState();
+        return new SetDataBuilderImpl(this);
+    }
+
+    @Override
+    public GetChildrenBuilder getChildren() {
+        checkState();
+        return new GetChildrenBuilderImpl(this);
+    }
+
+    @Override
+    public GetACLBuilder getACL() {
+        checkState();
+        return new GetACLBuilderImpl(this);
+    }
+
+    @Override
+    public SetACLBuilder setACL() {
+        checkState();
+        return new SetACLBuilderImpl(this);
+    }
+
+    @Override
+    public ReconfigBuilder reconfig() {
+        checkState();
+        return new ReconfigBuilderImpl(this);
+    }
+
+    @Override
+    public GetConfigBuilder getConfig() {
+        checkState();
+        return new GetConfigBuilderImpl(this);
+    }
+
+    @Override
+    public CuratorTransaction inTransaction() {
+        checkState();
+        return new CuratorTransactionImpl(this);
+    }
+
+    @Override
+    public CuratorMultiTransaction transaction() {
+        checkState();
+        return new CuratorMultiTransactionImpl(this);
+    }
+
+    @Override
+    public TransactionOp transactionOp() {
+        checkState();
+        return new TransactionOpImpl(this);
+    }
+
+    @Override
+    public void sync(String path, Object context) {
+        checkState();
+
+        path = fixForNamespace(path);
+
+        internalSync(this, path, context);
+    }
+
+    @Override
+    public SyncBuilder sync() {
+        checkState();
+        return new SyncBuilderImpl(this);
+    }
+
+    @Override
+    public final RemoveWatchesBuilder watches() {
+        checkState();
+        return new RemoveWatchesBuilderImpl(this);
+    }
+
+    @Override
+    public final WatchesBuilder watchers() {
+        Preconditions.checkState(
+                getZookeeperCompatibility().hasPersistentWatchers(),
+                "watchers() is not supported in the ZooKeeper library and/or 
server being used. Use watches() instead.");
+        checkState();
+        return new WatchesBuilderImpl(this);
+    }
+
+    @Override
+    public final void createContainers(String path) throws Exception {
+        
checkExists().creatingParentContainersIfNeeded().forPath(ZKPaths.makePath(path, 
"foo"));
+    }
+
+    @Override
+    public final WatcherRemoveCuratorFramework 
newWatcherRemoveCuratorFramework() {
+        return new WatcherRemovalFacade(this);
+    }
+
+    WatcherRemovalManager getWatcherRemovalManager() {
+        return null;
+    }
+
+    abstract FailedDeleteManager getFailedDeleteManager();
+
+    abstract FailedRemoveWatchManager getFailedRemoveWatcherManager();
+
+    abstract void logError(String reason, Throwable e);
+
+    abstract <DATA_TYPE> void processBackgroundOperation(
+            OperationAndData<DATA_TYPE> operationAndData, CuratorEvent event);
+
+    abstract <DATA_TYPE> boolean queueOperation(OperationAndData<DATA_TYPE> 
operationAndData);
+}
diff --git 
a/curator-framework/src/main/java/org/apache/curator/framework/imps/CuratorFrameworkImpl.java
 
b/curator-framework/src/main/java/org/apache/curator/framework/imps/CuratorFrameworkImpl.java
index 89f846f4a..0f1680f3e 100644
--- 
a/curator-framework/src/main/java/org/apache/curator/framework/imps/CuratorFrameworkImpl.java
+++ 
b/curator-framework/src/main/java/org/apache/curator/framework/imps/CuratorFrameworkImpl.java
@@ -47,30 +47,12 @@ import org.apache.curator.drivers.OperationTrace;
 import org.apache.curator.framework.AuthInfo;
 import org.apache.curator.framework.CuratorFramework;
 import org.apache.curator.framework.CuratorFrameworkFactory;
-import org.apache.curator.framework.WatcherRemoveCuratorFramework;
 import org.apache.curator.framework.api.ACLProvider;
 import org.apache.curator.framework.api.CompressionProvider;
-import org.apache.curator.framework.api.CreateBuilder;
-import org.apache.curator.framework.api.CuratorClosedException;
 import org.apache.curator.framework.api.CuratorEvent;
 import org.apache.curator.framework.api.CuratorEventType;
 import org.apache.curator.framework.api.CuratorListener;
-import org.apache.curator.framework.api.DeleteBuilder;
-import org.apache.curator.framework.api.ExistsBuilder;
-import org.apache.curator.framework.api.GetACLBuilder;
-import org.apache.curator.framework.api.GetChildrenBuilder;
-import org.apache.curator.framework.api.GetConfigBuilder;
-import org.apache.curator.framework.api.GetDataBuilder;
-import org.apache.curator.framework.api.ReconfigBuilder;
-import org.apache.curator.framework.api.RemoveWatchesBuilder;
-import org.apache.curator.framework.api.SetACLBuilder;
-import org.apache.curator.framework.api.SetDataBuilder;
-import org.apache.curator.framework.api.SyncBuilder;
 import org.apache.curator.framework.api.UnhandledErrorListener;
-import org.apache.curator.framework.api.WatchesBuilder;
-import org.apache.curator.framework.api.transaction.CuratorMultiTransaction;
-import org.apache.curator.framework.api.transaction.CuratorTransaction;
-import org.apache.curator.framework.api.transaction.TransactionOp;
 import org.apache.curator.framework.listen.Listenable;
 import org.apache.curator.framework.listen.StandardListenerManager;
 import org.apache.curator.framework.schema.SchemaSet;
@@ -81,7 +63,6 @@ import 
org.apache.curator.framework.state.ConnectionStateManager;
 import org.apache.curator.utils.DebugUtils;
 import org.apache.curator.utils.EnsurePath;
 import org.apache.curator.utils.ThreadUtils;
-import org.apache.curator.utils.ZKPaths;
 import org.apache.curator.utils.ZookeeperCompatibility;
 import org.apache.curator.utils.ZookeeperFactory;
 import org.apache.zookeeper.KeeperException;
@@ -93,7 +74,7 @@ import 
org.apache.zookeeper.server.quorum.flexible.QuorumVerifier;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public class CuratorFrameworkImpl implements CuratorFramework {
+public final class CuratorFrameworkImpl extends CuratorFrameworkBase {
     private final Logger log = LoggerFactory.getLogger(getClass());
     private final CuratorZookeeperClient client;
     private final StandardListenerManager<CuratorListener> listeners;
@@ -235,11 +216,6 @@ public class CuratorFrameworkImpl implements 
CuratorFramework {
         return CompletableFuture.runAsync(runnable, runSafeService);
     }
 
-    @Override
-    public WatcherRemoveCuratorFramework newWatcherRemoveCuratorFramework() {
-        return new WatcherRemovalFacade(this);
-    }
-
     @Override
     public QuorumVerifier getCurrentConfig() {
         return (ensembleTracker != null) ? ensembleTracker.getCurrentConfig() 
: null;
@@ -273,39 +249,6 @@ public class CuratorFrameworkImpl implements 
CuratorFramework {
         return threadFactory;
     }
 
-    protected CuratorFrameworkImpl(CuratorFrameworkImpl parent) {
-        client = parent.client;
-        listeners = parent.listeners;
-        unhandledErrorListeners = parent.unhandledErrorListeners;
-        threadFactory = parent.threadFactory;
-        maxCloseWaitMs = parent.maxCloseWaitMs;
-        backgroundOperations = parent.backgroundOperations;
-        forcedSleepOperations = parent.forcedSleepOperations;
-        connectionStateManager = parent.connectionStateManager;
-        defaultData = parent.defaultData;
-        failedDeleteManager = parent.failedDeleteManager;
-        failedRemoveWatcherManager = parent.failedRemoveWatcherManager;
-        compressionProvider = parent.compressionProvider;
-        compressionEnabled = parent.compressionEnabled;
-        aclProvider = parent.aclProvider;
-        namespaceFacadeCache = parent.namespaceFacadeCache;
-        namespace = parent.namespace;
-        state = parent.state;
-        authInfos = parent.authInfos;
-        useContainerParentsIfAvailable = parent.useContainerParentsIfAvailable;
-        connectionStateErrorPolicy = parent.connectionStateErrorPolicy;
-        internalConnectionHandler = parent.internalConnectionHandler;
-        schemaSet = parent.schemaSet;
-        ensembleTracker = parent.ensembleTracker;
-        runSafeService = parent.runSafeService;
-        zookeeperCompatibility = parent.zookeeperCompatibility;
-    }
-
-    @Override
-    public void createContainers(String path) throws Exception {
-        
checkExists().creatingParentContainersIfNeeded().forPath(ZKPaths.makePath(path, 
"foo"));
-    }
-
     @Override
     public void clearWatcherReferences(Watcher watcher) {
         // NOP
@@ -452,29 +395,8 @@ public class CuratorFrameworkImpl implements 
CuratorFramework {
         }
     }
 
-    @Override
-    @Deprecated
-    public CuratorFramework nonNamespaceView() {
-        return usingNamespace(null);
-    }
-
-    @Override
-    public String getNamespace() {
-        String str = namespace.getNamespace();
-        return (str != null) ? str : "";
-    }
-
-    private void checkState() {
-        CuratorFrameworkState state = getState();
-        switch (state) {
-            case STARTED:
-                return;
-            case STOPPED:
-                throw new CuratorClosedException();
-            default:
-                String msg = String.format("Expected state [%s] was [%s]", 
CuratorFrameworkState.STARTED, state);
-                throw new IllegalStateException(msg);
-        }
+    NamespaceImpl getNamespaceImpl() {
+        return namespace;
     }
 
     @Override
@@ -483,84 +405,6 @@ public class CuratorFrameworkImpl implements 
CuratorFramework {
         return namespaceFacadeCache.get(newNamespace);
     }
 
-    @Override
-    public CreateBuilder create() {
-        checkState();
-        return new CreateBuilderImpl(this);
-    }
-
-    @Override
-    public DeleteBuilder delete() {
-        checkState();
-        return new DeleteBuilderImpl(this);
-    }
-
-    @Override
-    public ExistsBuilder checkExists() {
-        checkState();
-        return new ExistsBuilderImpl(this);
-    }
-
-    @Override
-    public GetDataBuilder getData() {
-        checkState();
-        return new GetDataBuilderImpl(this);
-    }
-
-    @Override
-    public SetDataBuilder setData() {
-        checkState();
-        return new SetDataBuilderImpl(this);
-    }
-
-    @Override
-    public GetChildrenBuilder getChildren() {
-        checkState();
-        return new GetChildrenBuilderImpl(this);
-    }
-
-    @Override
-    public GetACLBuilder getACL() {
-        checkState();
-        return new GetACLBuilderImpl(this);
-    }
-
-    @Override
-    public SetACLBuilder setACL() {
-        checkState();
-        return new SetACLBuilderImpl(this);
-    }
-
-    @Override
-    public ReconfigBuilder reconfig() {
-        checkState();
-        return new ReconfigBuilderImpl(this);
-    }
-
-    @Override
-    public GetConfigBuilder getConfig() {
-        checkState();
-        return new GetConfigBuilderImpl(this);
-    }
-
-    @Override
-    public CuratorTransaction inTransaction() {
-        checkState();
-        return new CuratorTransactionImpl(this);
-    }
-
-    @Override
-    public CuratorMultiTransaction transaction() {
-        checkState();
-        return new CuratorMultiTransactionImpl(this);
-    }
-
-    @Override
-    public TransactionOp transactionOp() {
-        checkState();
-        return new TransactionOpImpl(this);
-    }
-
     @Override
     public Listenable<ConnectionStateListener> getConnectionStateListenable() {
         return connectionStateManager.getListenable();
@@ -576,41 +420,6 @@ public class CuratorFrameworkImpl implements 
CuratorFramework {
         return unhandledErrorListeners;
     }
 
-    @Override
-    public void sync(String path, Object context) {
-        checkState();
-
-        path = fixForNamespace(path);
-
-        internalSync(this, path, context);
-    }
-
-    @Override
-    public SyncBuilder sync() {
-        checkState();
-        return new SyncBuilderImpl(this);
-    }
-
-    @Override
-    public RemoveWatchesBuilder watches() {
-        checkState();
-        return new RemoveWatchesBuilderImpl(this);
-    }
-
-    @Override
-    public WatchesBuilder watchers() {
-        Preconditions.checkState(
-                zookeeperCompatibility.hasPersistentWatchers(),
-                "watchers() is not supported in the ZooKeeper library and/or 
server being used. Use watches() instead.");
-        checkState();
-        return new WatchesBuilderImpl(this);
-    }
-
-    protected void internalSync(CuratorFrameworkImpl impl, String path, Object 
context) {
-        BackgroundOperation<String> operation = new BackgroundSyncImpl(impl, 
context);
-        performBackgroundOperation(new OperationAndData<String>(operation, 
path, null, null, context, null));
-    }
-
     @Override
     public CuratorZookeeperClient getZookeeperClient() {
         return client;
@@ -640,10 +449,12 @@ public class CuratorFrameworkImpl implements 
CuratorFramework {
         return aclProvider;
     }
 
+    @Override
     FailedDeleteManager getFailedDeleteManager() {
         return failedDeleteManager;
     }
 
+    @Override
     FailedRemoveWatchManager getFailedRemoveWatcherManager() {
         return failedRemoveWatcherManager;
     }
@@ -652,14 +463,12 @@ public class CuratorFrameworkImpl implements 
CuratorFramework {
         return client.newRetryLoop();
     }
 
-    ZooKeeper getZooKeeper() throws Exception {
-        return client.getZooKeeper();
-    }
-
+    @Override
     CompressionProvider getCompressionProvider() {
         return compressionProvider;
     }
 
+    @Override
     boolean useContainerParentsIfAvailable() {
         return useContainerParentsIfAvailable;
     }
@@ -796,6 +605,7 @@ public class CuratorFrameworkImpl implements 
CuratorFramework {
         return false;
     }
 
+    @Override
     void logError(String reason, final Throwable e) {
         if ((reason == null) || (reason.length() == 0)) {
             reason = "n/a";
@@ -821,18 +631,6 @@ public class CuratorFrameworkImpl implements 
CuratorFramework {
         }
     }
 
-    String unfixForNamespace(String path) {
-        return namespace.unfixForNamespace(path);
-    }
-
-    String fixForNamespace(String path) {
-        return namespace.fixForNamespace(path, false);
-    }
-
-    String fixForNamespace(String path, boolean isSequential) {
-        return namespace.fixForNamespace(path, isSequential);
-    }
-
     byte[] getDefaultData() {
         return defaultData;
     }
@@ -866,34 +664,6 @@ public class CuratorFrameworkImpl implements 
CuratorFramework {
         }
     }
 
-    Watcher.Event.KeeperState codeToState(KeeperException.Code code) {
-        switch (code) {
-            case AUTHFAILED:
-            case NOAUTH: {
-                return Watcher.Event.KeeperState.AuthFailed;
-            }
-
-            case CONNECTIONLOSS:
-            case OPERATIONTIMEOUT: {
-                return Watcher.Event.KeeperState.Disconnected;
-            }
-
-            case SESSIONEXPIRED: {
-                return Watcher.Event.KeeperState.Expired;
-            }
-
-            case OK:
-            case SESSIONMOVED: {
-                return Watcher.Event.KeeperState.SyncConnected;
-            }
-        }
-        return Watcher.Event.KeeperState.fromInt(-1);
-    }
-
-    WatcherRemovalManager getWatcherRemovalManager() {
-        return null;
-    }
-
     boolean setToSuspended() {
         return connectionStateManager.setToSuspended();
     }
@@ -902,6 +672,7 @@ public class CuratorFrameworkImpl implements 
CuratorFramework {
         connectionStateManager.addStateChange(newConnectionState);
     }
 
+    @Override
     EnsembleTracker getEnsembleTracker() {
         return ensembleTracker;
     }
@@ -959,7 +730,7 @@ public class CuratorFrameworkImpl implements 
CuratorFramework {
                 }
             }
 
-            validateConnection(codeToState(code));
+            validateConnection(FrameworkUtils.codeToState(code));
             logError("Background operation retry gave up", e);
         }
         return doRetry;
diff --git 
a/curator-framework/src/main/java/org/apache/curator/framework/imps/CuratorMultiTransactionImpl.java
 
b/curator-framework/src/main/java/org/apache/curator/framework/imps/CuratorMultiTransactionImpl.java
index 9e0bd2265..30e1d7b51 100644
--- 
a/curator-framework/src/main/java/org/apache/curator/framework/imps/CuratorMultiTransactionImpl.java
+++ 
b/curator-framework/src/main/java/org/apache/curator/framework/imps/CuratorMultiTransactionImpl.java
@@ -50,14 +50,14 @@ public class CuratorMultiTransactionImpl
                 CuratorMultiTransactionMain,
                 BackgroundOperation<CuratorMultiTransactionRecord>,
                 ErrorListenerMultiTransactionMain {
-    private final CuratorFrameworkImpl client;
+    private final CuratorFrameworkBase client;
     private Backgrounding backgrounding = new Backgrounding();
 
-    public CuratorMultiTransactionImpl(CuratorFrameworkImpl client) {
+    public CuratorMultiTransactionImpl(CuratorFrameworkBase client) {
         this.client = client;
     }
 
-    public CuratorMultiTransactionImpl(CuratorFrameworkImpl client, 
Backgrounding backgrounding) {
+    public CuratorMultiTransactionImpl(CuratorFrameworkBase client, 
Backgrounding backgrounding) {
         this.client = client;
         this.backgrounding = backgrounding;
     }
diff --git 
a/curator-framework/src/main/java/org/apache/curator/framework/imps/CuratorTempFrameworkImpl.java
 
b/curator-framework/src/main/java/org/apache/curator/framework/imps/CuratorTempFrameworkImpl.java
index fff6a4024..6c1a36041 100644
--- 
a/curator-framework/src/main/java/org/apache/curator/framework/imps/CuratorTempFrameworkImpl.java
+++ 
b/curator-framework/src/main/java/org/apache/curator/framework/imps/CuratorTempFrameworkImpl.java
@@ -36,7 +36,7 @@ public class CuratorTempFrameworkImpl implements 
CuratorTempFramework {
     private final long inactiveThresholdMs;
 
     // guarded by sync
-    private CuratorFrameworkImpl client;
+    private CuratorFrameworkBase client;
 
     // guarded by sync
     private ScheduledExecutorService cleanup;
@@ -67,7 +67,7 @@ public class CuratorTempFrameworkImpl implements 
CuratorTempFramework {
     }
 
     @VisibleForTesting
-    synchronized CuratorFrameworkImpl getClient() {
+    synchronized CuratorFrameworkBase getClient() {
         return client;
     }
 
@@ -83,7 +83,7 @@ public class CuratorTempFrameworkImpl implements 
CuratorTempFramework {
 
     private synchronized void openConnectionIfNeeded() throws Exception {
         if (client == null) {
-            client = (CuratorFrameworkImpl) factory.build(); // cast is safe - 
we control both sides of this
+            client = (CuratorFrameworkBase) factory.build(); // cast is safe - 
we control both sides of this
             client.start();
         }
 
diff --git 
a/curator-framework/src/main/java/org/apache/curator/framework/imps/CuratorTransactionImpl.java
 
b/curator-framework/src/main/java/org/apache/curator/framework/imps/CuratorTransactionImpl.java
index 19a4f2175..cdc4e1a1e 100644
--- 
a/curator-framework/src/main/java/org/apache/curator/framework/imps/CuratorTransactionImpl.java
+++ 
b/curator-framework/src/main/java/org/apache/curator/framework/imps/CuratorTransactionImpl.java
@@ -35,12 +35,12 @@ import org.apache.zookeeper.data.Stat;
 
 @SuppressWarnings("deprecation")
 class CuratorTransactionImpl implements CuratorTransaction, 
CuratorTransactionBridge, CuratorTransactionFinal {
-    private final CuratorFrameworkImpl client;
+    private final CuratorFrameworkBase client;
     private final CuratorMultiTransactionRecord transaction;
 
     private boolean isCommitted = false;
 
-    CuratorTransactionImpl(CuratorFrameworkImpl client) {
+    CuratorTransactionImpl(CuratorFrameworkBase client) {
         this.client = client;
         transaction = new CuratorMultiTransactionRecord();
     }
@@ -83,7 +83,7 @@ class CuratorTransactionImpl implements CuratorTransaction, 
CuratorTransactionBr
     }
 
     static <T> TransactionCheckBuilder<T> makeTransactionCheckBuilder(
-            final CuratorFrameworkImpl client, final T context, final 
CuratorMultiTransactionRecord transaction) {
+            final CuratorFrameworkBase client, final T context, final 
CuratorMultiTransactionRecord transaction) {
         return new TransactionCheckBuilder<T>() {
             private int version = -1;
 
@@ -125,7 +125,7 @@ class CuratorTransactionImpl implements CuratorTransaction, 
CuratorTransactionBr
     }
 
     static List<CuratorTransactionResult> wrapResults(
-            CuratorFrameworkImpl client, List<OpResult> resultList, 
CuratorMultiTransactionRecord transaction) {
+            CuratorFrameworkBase client, List<OpResult> resultList, 
CuratorMultiTransactionRecord transaction) {
         ImmutableList.Builder<CuratorTransactionResult> builder = 
ImmutableList.builder();
         for (int i = 0; i < resultList.size(); ++i) {
             OpResult opResult = resultList.get(i);
@@ -138,7 +138,7 @@ class CuratorTransactionImpl implements CuratorTransaction, 
CuratorTransactionBr
     }
 
     static CuratorTransactionResult makeCuratorResult(
-            CuratorFrameworkImpl client, OpResult opResult, TypeAndPath 
metadata) {
+            CuratorFrameworkBase client, OpResult opResult, TypeAndPath 
metadata) {
         String resultPath = null;
         Stat resultStat = null;
         int error = 0;
diff --git 
a/curator-framework/src/main/java/org/apache/curator/framework/imps/DelegatingCuratorFramework.java
 
b/curator-framework/src/main/java/org/apache/curator/framework/imps/DelegatingCuratorFramework.java
new file mode 100644
index 000000000..5850242bf
--- /dev/null
+++ 
b/curator-framework/src/main/java/org/apache/curator/framework/imps/DelegatingCuratorFramework.java
@@ -0,0 +1,206 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.curator.framework.imps;
+
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.TimeUnit;
+import org.apache.curator.CuratorZookeeperClient;
+import org.apache.curator.framework.CuratorFramework;
+import org.apache.curator.framework.api.ACLProvider;
+import org.apache.curator.framework.api.CompressionProvider;
+import org.apache.curator.framework.api.CuratorEvent;
+import org.apache.curator.framework.api.CuratorListener;
+import org.apache.curator.framework.api.UnhandledErrorListener;
+import org.apache.curator.framework.listen.Listenable;
+import org.apache.curator.framework.schema.SchemaSet;
+import org.apache.curator.framework.state.ConnectionStateErrorPolicy;
+import org.apache.curator.framework.state.ConnectionStateListener;
+import org.apache.curator.utils.ZookeeperCompatibility;
+import org.apache.zookeeper.Watcher;
+import org.apache.zookeeper.server.quorum.flexible.QuorumVerifier;
+
+/**
+ * Delegates methods to shadowed {@link CuratorFrameworkBase} so subclasses 
can override only methods that need
+ * additional cares.
+ */
+abstract class DelegatingCuratorFramework extends CuratorFrameworkBase {
+    protected final CuratorFrameworkBase client;
+
+    public DelegatingCuratorFramework(CuratorFrameworkBase client) {
+        this.client = client;
+    }
+
+    @Override
+    public CuratorFrameworkState getState() {
+        return client.getState();
+    }
+
+    @Override
+    @Deprecated
+    public boolean isStarted() {
+        return client.isStarted();
+    }
+
+    @Override
+    public Listenable<ConnectionStateListener> getConnectionStateListenable() {
+        return client.getConnectionStateListenable();
+    }
+
+    @Override
+    public Listenable<CuratorListener> getCuratorListenable() {
+        return client.getCuratorListenable();
+    }
+
+    @Override
+    public Listenable<UnhandledErrorListener> getUnhandledErrorListenable() {
+        return client.getUnhandledErrorListenable();
+    }
+
+    @Override
+    public CuratorFramework usingNamespace(String newNamespace) {
+        return client.usingNamespace(newNamespace);
+    }
+
+    @Override
+    public CuratorZookeeperClient getZookeeperClient() {
+        return client.getZookeeperClient();
+    }
+
+    @Override
+    public ZookeeperCompatibility getZookeeperCompatibility() {
+        return client.getZookeeperCompatibility();
+    }
+
+    @Override
+    @Deprecated
+    public void clearWatcherReferences(Watcher watcher) {
+        client.clearWatcherReferences(watcher);
+    }
+
+    @Override
+    public boolean blockUntilConnected(int maxWaitTime, TimeUnit units) throws 
InterruptedException {
+        return client.blockUntilConnected(maxWaitTime, units);
+    }
+
+    @Override
+    public void blockUntilConnected() throws InterruptedException {
+        client.blockUntilConnected();
+    }
+
+    @Override
+    public ConnectionStateErrorPolicy getConnectionStateErrorPolicy() {
+        return client.getConnectionStateErrorPolicy();
+    }
+
+    @Override
+    public QuorumVerifier getCurrentConfig() {
+        return client.getCurrentConfig();
+    }
+
+    @Override
+    public SchemaSet getSchemaSet() {
+        return client.getSchemaSet();
+    }
+
+    @Override
+    public CompletableFuture<Void> postSafeNotify(Object monitorHolder) {
+        return client.postSafeNotify(monitorHolder);
+    }
+
+    @Override
+    public CompletableFuture<Void> runSafe(Runnable runnable) {
+        return client.runSafe(runnable);
+    }
+
+    @Override
+    NamespaceImpl getNamespaceImpl() {
+        return client.getNamespaceImpl();
+    }
+
+    @Override
+    void validateConnection(Watcher.Event.KeeperState state) {
+        client.validateConnection(state);
+    }
+
+    @Override
+    WatcherRemovalManager getWatcherRemovalManager() {
+        return client.getWatcherRemovalManager();
+    }
+
+    @Override
+    FailedDeleteManager getFailedDeleteManager() {
+        return client.getFailedDeleteManager();
+    }
+
+    @Override
+    FailedRemoveWatchManager getFailedRemoveWatcherManager() {
+        return client.getFailedRemoveWatcherManager();
+    }
+
+    @Override
+    public void logError(String reason, Throwable e) {
+        client.logError(reason, e);
+    }
+
+    @Override
+    byte[] getDefaultData() {
+        return client.getDefaultData();
+    }
+
+    @Override
+    CompressionProvider getCompressionProvider() {
+        return client.getCompressionProvider();
+    }
+
+    @Override
+    public boolean compressionEnabled() {
+        return client.compressionEnabled();
+    }
+
+    @Override
+    ACLProvider getAclProvider() {
+        return client.getAclProvider();
+    }
+
+    @Override
+    boolean useContainerParentsIfAvailable() {
+        return client.useContainerParentsIfAvailable();
+    }
+
+    @Override
+    EnsembleTracker getEnsembleTracker() {
+        return client.getEnsembleTracker();
+    }
+
+    @Override
+    NamespaceFacadeCache getNamespaceFacadeCache() {
+        return client.getNamespaceFacadeCache();
+    }
+
+    @Override
+    <DATA_TYPE> void processBackgroundOperation(OperationAndData<DATA_TYPE> 
operationAndData, CuratorEvent event) {
+        client.processBackgroundOperation(operationAndData, event);
+    }
+
+    @Override
+    <DATA_TYPE> boolean queueOperation(OperationAndData<DATA_TYPE> 
operationAndData) {
+        return client.queueOperation(operationAndData);
+    }
+}
diff --git 
a/curator-framework/src/main/java/org/apache/curator/framework/imps/DeleteBuilderImpl.java
 
b/curator-framework/src/main/java/org/apache/curator/framework/imps/DeleteBuilderImpl.java
index 958879f55..8f17fab13 100644
--- 
a/curator-framework/src/main/java/org/apache/curator/framework/imps/DeleteBuilderImpl.java
+++ 
b/curator-framework/src/main/java/org/apache/curator/framework/imps/DeleteBuilderImpl.java
@@ -34,7 +34,7 @@ import org.apache.zookeeper.KeeperException;
 import org.apache.zookeeper.Op;
 
 public class DeleteBuilderImpl implements DeleteBuilder, 
BackgroundOperation<String>, ErrorListenerPathable<Void> {
-    private final CuratorFrameworkImpl client;
+    private final CuratorFrameworkBase client;
     private int version;
     private Backgrounding backgrounding;
     private boolean deletingChildrenIfNeeded;
@@ -47,7 +47,7 @@ public class DeleteBuilderImpl implements DeleteBuilder, 
BackgroundOperation<Str
     @VisibleForTesting
     boolean failBeforeNextDeleteForTesting = false;
 
-    DeleteBuilderImpl(CuratorFrameworkImpl client) {
+    DeleteBuilderImpl(CuratorFrameworkBase client) {
         this.client = client;
         version = -1;
         backgrounding = new Backgrounding();
@@ -57,7 +57,7 @@ public class DeleteBuilderImpl implements DeleteBuilder, 
BackgroundOperation<Str
     }
 
     public DeleteBuilderImpl(
-            CuratorFrameworkImpl client,
+            CuratorFrameworkBase client,
             int version,
             Backgrounding backgrounding,
             boolean deletingChildrenIfNeeded,
diff --git 
a/curator-framework/src/main/java/org/apache/curator/framework/imps/ExistsBuilderImpl.java
 
b/curator-framework/src/main/java/org/apache/curator/framework/imps/ExistsBuilderImpl.java
index 68494c488..3df1c4ddf 100644
--- 
a/curator-framework/src/main/java/org/apache/curator/framework/imps/ExistsBuilderImpl.java
+++ 
b/curator-framework/src/main/java/org/apache/curator/framework/imps/ExistsBuilderImpl.java
@@ -34,19 +34,19 @@ import org.apache.zookeeper.data.Stat;
 
 public class ExistsBuilderImpl
         implements ExistsBuilder, BackgroundOperation<String>, 
ErrorListenerPathable<Stat>, ACLableExistBuilderMain {
-    private final CuratorFrameworkImpl client;
+    private final CuratorFrameworkBase client;
     private Backgrounding backgrounding;
     private Watching watching;
     private boolean createParentsIfNeeded;
     private boolean createParentContainersIfNeeded;
     private ACLing acling;
 
-    ExistsBuilderImpl(CuratorFrameworkImpl client) {
+    ExistsBuilderImpl(CuratorFrameworkBase client) {
         this(client, new Backgrounding(), null, false, false);
     }
 
     public ExistsBuilderImpl(
-            CuratorFrameworkImpl client,
+            CuratorFrameworkBase client,
             Backgrounding backgrounding,
             Watcher watcher,
             boolean createParentsIfNeeded,
diff --git 
a/curator-framework/src/main/java/org/apache/curator/framework/imps/FindAndDeleteProtectedNodeInBackground.java
 
b/curator-framework/src/main/java/org/apache/curator/framework/imps/FindAndDeleteProtectedNodeInBackground.java
index 36814db36..e3dd3dbbc 100644
--- 
a/curator-framework/src/main/java/org/apache/curator/framework/imps/FindAndDeleteProtectedNodeInBackground.java
+++ 
b/curator-framework/src/main/java/org/apache/curator/framework/imps/FindAndDeleteProtectedNodeInBackground.java
@@ -34,12 +34,12 @@ import org.slf4j.LoggerFactory;
 
 class FindAndDeleteProtectedNodeInBackground implements 
BackgroundOperation<Void> {
     private final Logger log = LoggerFactory.getLogger(getClass());
-    private final CuratorFrameworkImpl client;
+    private final CuratorFrameworkBase client;
     private final String namespaceAdjustedParentPath;
     private final String protectedId;
 
     FindAndDeleteProtectedNodeInBackground(
-            CuratorFrameworkImpl client, String namespaceAdjustedParentPath, 
String protectedId) {
+            CuratorFrameworkBase client, String namespaceAdjustedParentPath, 
String protectedId) {
         this.client = client;
         this.namespaceAdjustedParentPath = namespaceAdjustedParentPath;
         this.protectedId = protectedId;
diff --git 
a/curator-framework/src/main/java/org/apache/curator/framework/imps/NamespaceWatchedEvent.java
 
b/curator-framework/src/main/java/org/apache/curator/framework/imps/FrameworkUtils.java
similarity index 52%
copy from 
curator-framework/src/main/java/org/apache/curator/framework/imps/NamespaceWatchedEvent.java
copy to 
curator-framework/src/main/java/org/apache/curator/framework/imps/FrameworkUtils.java
index 4bff03f35..7b079a49a 100644
--- 
a/curator-framework/src/main/java/org/apache/curator/framework/imps/NamespaceWatchedEvent.java
+++ 
b/curator-framework/src/main/java/org/apache/curator/framework/imps/FrameworkUtils.java
@@ -19,10 +19,31 @@
 
 package org.apache.curator.framework.imps;
 
-import org.apache.zookeeper.WatchedEvent;
+import org.apache.zookeeper.KeeperException;
+import org.apache.zookeeper.Watcher;
 
-class NamespaceWatchedEvent extends WatchedEvent {
-    NamespaceWatchedEvent(CuratorFrameworkImpl client, WatchedEvent event) {
-        super(event.getType(), event.getState(), 
client.unfixForNamespace(event.getPath()));
+class FrameworkUtils {
+    static Watcher.Event.KeeperState codeToState(KeeperException.Code code) {
+        switch (code) {
+            case AUTHFAILED:
+            case NOAUTH: {
+                return Watcher.Event.KeeperState.AuthFailed;
+            }
+
+            case CONNECTIONLOSS:
+            case OPERATIONTIMEOUT: {
+                return Watcher.Event.KeeperState.Disconnected;
+            }
+
+            case SESSIONEXPIRED: {
+                return Watcher.Event.KeeperState.Expired;
+            }
+
+            case OK:
+            case SESSIONMOVED: {
+                return Watcher.Event.KeeperState.SyncConnected;
+            }
+        }
+        return Watcher.Event.KeeperState.fromInt(-1);
     }
 }
diff --git 
a/curator-framework/src/main/java/org/apache/curator/framework/imps/GetACLBuilderImpl.java
 
b/curator-framework/src/main/java/org/apache/curator/framework/imps/GetACLBuilderImpl.java
index 2b83ace80..9978e1368 100644
--- 
a/curator-framework/src/main/java/org/apache/curator/framework/imps/GetACLBuilderImpl.java
+++ 
b/curator-framework/src/main/java/org/apache/curator/framework/imps/GetACLBuilderImpl.java
@@ -35,18 +35,18 @@ import org.apache.zookeeper.data.ACL;
 import org.apache.zookeeper.data.Stat;
 
 public class GetACLBuilderImpl implements GetACLBuilder, 
BackgroundOperation<String>, ErrorListenerPathable<List<ACL>> {
-    private final CuratorFrameworkImpl client;
+    private final CuratorFrameworkBase client;
 
     private Backgrounding backgrounding;
     private Stat responseStat;
 
-    GetACLBuilderImpl(CuratorFrameworkImpl client) {
+    GetACLBuilderImpl(CuratorFrameworkBase client) {
         this.client = client;
         backgrounding = new Backgrounding();
         responseStat = new Stat();
     }
 
-    public GetACLBuilderImpl(CuratorFrameworkImpl client, Backgrounding 
backgrounding, Stat responseStat) {
+    public GetACLBuilderImpl(CuratorFrameworkBase client, Backgrounding 
backgrounding, Stat responseStat) {
         this.client = client;
         this.backgrounding = backgrounding;
         this.responseStat = responseStat;
diff --git 
a/curator-framework/src/main/java/org/apache/curator/framework/imps/GetChildrenBuilderImpl.java
 
b/curator-framework/src/main/java/org/apache/curator/framework/imps/GetChildrenBuilderImpl.java
index ddf975cab..c8ed80bc6 100644
--- 
a/curator-framework/src/main/java/org/apache/curator/framework/imps/GetChildrenBuilderImpl.java
+++ 
b/curator-framework/src/main/java/org/apache/curator/framework/imps/GetChildrenBuilderImpl.java
@@ -41,12 +41,12 @@ import org.apache.zookeeper.data.Stat;
 
 public class GetChildrenBuilderImpl
         implements GetChildrenBuilder, BackgroundOperation<String>, 
ErrorListenerPathable<List<String>> {
-    private final CuratorFrameworkImpl client;
+    private final CuratorFrameworkBase client;
     private Watching watching;
     private Backgrounding backgrounding;
     private Stat responseStat;
 
-    GetChildrenBuilderImpl(CuratorFrameworkImpl client) {
+    GetChildrenBuilderImpl(CuratorFrameworkBase client) {
         this.client = client;
         watching = new Watching(client);
         backgrounding = new Backgrounding();
@@ -54,7 +54,7 @@ public class GetChildrenBuilderImpl
     }
 
     public GetChildrenBuilderImpl(
-            CuratorFrameworkImpl client, Watcher watcher, Backgrounding 
backgrounding, Stat responseStat) {
+            CuratorFrameworkBase client, Watcher watcher, Backgrounding 
backgrounding, Stat responseStat) {
         this.client = client;
         this.watching = new Watching(client, watcher);
         this.backgrounding = backgrounding;
diff --git 
a/curator-framework/src/main/java/org/apache/curator/framework/imps/GetConfigBuilderImpl.java
 
b/curator-framework/src/main/java/org/apache/curator/framework/imps/GetConfigBuilderImpl.java
index af215cbad..a299eb189 100644
--- 
a/curator-framework/src/main/java/org/apache/curator/framework/imps/GetConfigBuilderImpl.java
+++ 
b/curator-framework/src/main/java/org/apache/curator/framework/imps/GetConfigBuilderImpl.java
@@ -32,18 +32,18 @@ import org.apache.zookeeper.data.Stat;
 
 public class GetConfigBuilderImpl
         implements GetConfigBuilder, BackgroundOperation<Void>, 
ErrorListenerEnsembleable<byte[]> {
-    private final CuratorFrameworkImpl client;
+    private final CuratorFrameworkBase client;
 
     private Backgrounding backgrounding;
     private Watching watching;
     private Stat stat;
 
-    public GetConfigBuilderImpl(CuratorFrameworkImpl client) {
+    public GetConfigBuilderImpl(CuratorFrameworkBase client) {
         this(client, new Backgrounding(), null, null);
     }
 
-    public GetConfigBuilderImpl(CuratorFrameworkImpl client, Backgrounding 
backgrounding, Watcher watcher, Stat stat) {
-        this.client = (CuratorFrameworkImpl) client.usingNamespace(null);
+    public GetConfigBuilderImpl(CuratorFrameworkBase client, Backgrounding 
backgrounding, Watcher watcher, Stat stat) {
+        this.client = (CuratorFrameworkBase) client.usingNamespace(null);
         this.backgrounding = backgrounding;
         this.watching = new Watching(this.client, watcher);
         this.stat = stat;
diff --git 
a/curator-framework/src/main/java/org/apache/curator/framework/imps/GetDataBuilderImpl.java
 
b/curator-framework/src/main/java/org/apache/curator/framework/imps/GetDataBuilderImpl.java
index df6d15cbd..0ad9718b0 100644
--- 
a/curator-framework/src/main/java/org/apache/curator/framework/imps/GetDataBuilderImpl.java
+++ 
b/curator-framework/src/main/java/org/apache/curator/framework/imps/GetDataBuilderImpl.java
@@ -35,13 +35,13 @@ import org.slf4j.LoggerFactory;
 
 public class GetDataBuilderImpl implements GetDataBuilder, 
BackgroundOperation<String>, ErrorListenerPathable<byte[]> {
     private final Logger log = LoggerFactory.getLogger(getClass());
-    private final CuratorFrameworkImpl client;
+    private final CuratorFrameworkBase client;
     private Stat responseStat;
     private Watching watching;
     private Backgrounding backgrounding;
     private boolean decompress;
 
-    GetDataBuilderImpl(CuratorFrameworkImpl client) {
+    GetDataBuilderImpl(CuratorFrameworkBase client) {
         this.client = client;
         responseStat = null;
         watching = new Watching(client);
@@ -50,7 +50,7 @@ public class GetDataBuilderImpl implements GetDataBuilder, 
BackgroundOperation<S
     }
 
     public GetDataBuilderImpl(
-            CuratorFrameworkImpl client,
+            CuratorFrameworkBase client,
             Stat responseStat,
             Watcher watcher,
             Backgrounding backgrounding,
diff --git 
a/curator-framework/src/main/java/org/apache/curator/framework/imps/NamespaceFacade.java
 
b/curator-framework/src/main/java/org/apache/curator/framework/imps/NamespaceFacade.java
index 1887a86b7..62af8d2fb 100644
--- 
a/curator-framework/src/main/java/org/apache/curator/framework/imps/NamespaceFacade.java
+++ 
b/curator-framework/src/main/java/org/apache/curator/framework/imps/NamespaceFacade.java
@@ -19,43 +19,18 @@
 
 package org.apache.curator.framework.imps;
 
-import org.apache.curator.CuratorZookeeperClient;
-import org.apache.curator.RetryLoop;
-import org.apache.curator.framework.CuratorFramework;
-import org.apache.curator.framework.api.CuratorEvent;
 import org.apache.curator.framework.api.CuratorListener;
-import org.apache.curator.framework.api.UnhandledErrorListener;
 import org.apache.curator.framework.listen.Listenable;
-import org.apache.curator.framework.state.ConnectionStateListener;
-import org.apache.curator.utils.EnsurePath;
-import org.apache.zookeeper.ZooKeeper;
 
-class NamespaceFacade extends CuratorFrameworkImpl {
-    private final CuratorFrameworkImpl client;
+class NamespaceFacade extends DelegatingCuratorFramework {
     private final NamespaceImpl namespace;
     private final FailedDeleteManager failedDeleteManager = new 
FailedDeleteManager(this);
 
     NamespaceFacade(CuratorFrameworkImpl client, String namespace) {
         super(client);
-        this.client = client;
         this.namespace = new NamespaceImpl(client, namespace);
     }
 
-    @Override
-    public CuratorFramework nonNamespaceView() {
-        return usingNamespace(null);
-    }
-
-    @Override
-    public CuratorFramework usingNamespace(String newNamespace) {
-        return client.getNamespaceFacadeCache().get(newNamespace);
-    }
-
-    @Override
-    public String getNamespace() {
-        return namespace.getNamespace();
-    }
-
     @Override
     public void start() {
         throw new UnsupportedOperationException();
@@ -67,8 +42,8 @@ class NamespaceFacade extends CuratorFrameworkImpl {
     }
 
     @Override
-    public Listenable<ConnectionStateListener> getConnectionStateListenable() {
-        return client.getConnectionStateListenable();
+    NamespaceImpl getNamespaceImpl() {
+        return namespace;
     }
 
     @Override
@@ -77,61 +52,6 @@ class NamespaceFacade extends CuratorFrameworkImpl {
                 "getCuratorListenable() is only available from a 
non-namespaced CuratorFramework instance");
     }
 
-    @Override
-    public Listenable<UnhandledErrorListener> getUnhandledErrorListenable() {
-        return client.getUnhandledErrorListenable();
-    }
-
-    @Override
-    public void sync(String path, Object context) {
-        internalSync(this, path, context);
-    }
-
-    @Override
-    public CuratorZookeeperClient getZookeeperClient() {
-        return client.getZookeeperClient();
-    }
-
-    @Override
-    RetryLoop newRetryLoop() {
-        return client.newRetryLoop();
-    }
-
-    @Override
-    ZooKeeper getZooKeeper() throws Exception {
-        return client.getZooKeeper();
-    }
-
-    @Override
-    <DATA_TYPE> void processBackgroundOperation(OperationAndData<DATA_TYPE> 
operationAndData, CuratorEvent event) {
-        client.processBackgroundOperation(operationAndData, event);
-    }
-
-    @Override
-    void logError(String reason, Throwable e) {
-        client.logError(reason, e);
-    }
-
-    @Override
-    String unfixForNamespace(String path) {
-        return namespace.unfixForNamespace(path);
-    }
-
-    @Override
-    String fixForNamespace(String path) {
-        return namespace.fixForNamespace(path, false);
-    }
-
-    @Override
-    String fixForNamespace(String path, boolean isSequential) {
-        return namespace.fixForNamespace(path, isSequential);
-    }
-
-    @Override
-    public EnsurePath newNamespaceAwareEnsurePath(String path) {
-        return namespace.newNamespaceAwareEnsurePath(path);
-    }
-
     @Override
     FailedDeleteManager getFailedDeleteManager() {
         return failedDeleteManager;
diff --git 
a/curator-framework/src/main/java/org/apache/curator/framework/imps/NamespaceWatchedEvent.java
 
b/curator-framework/src/main/java/org/apache/curator/framework/imps/NamespaceWatchedEvent.java
index 4bff03f35..724e49d07 100644
--- 
a/curator-framework/src/main/java/org/apache/curator/framework/imps/NamespaceWatchedEvent.java
+++ 
b/curator-framework/src/main/java/org/apache/curator/framework/imps/NamespaceWatchedEvent.java
@@ -22,7 +22,7 @@ package org.apache.curator.framework.imps;
 import org.apache.zookeeper.WatchedEvent;
 
 class NamespaceWatchedEvent extends WatchedEvent {
-    NamespaceWatchedEvent(CuratorFrameworkImpl client, WatchedEvent event) {
+    NamespaceWatchedEvent(CuratorFrameworkBase client, WatchedEvent event) {
         super(event.getType(), event.getState(), 
client.unfixForNamespace(event.getPath()));
     }
 }
diff --git 
a/curator-framework/src/main/java/org/apache/curator/framework/imps/NamespaceWatcher.java
 
b/curator-framework/src/main/java/org/apache/curator/framework/imps/NamespaceWatcher.java
index c3f0d8e29..76520a4ef 100644
--- 
a/curator-framework/src/main/java/org/apache/curator/framework/imps/NamespaceWatcher.java
+++ 
b/curator-framework/src/main/java/org/apache/curator/framework/imps/NamespaceWatcher.java
@@ -28,19 +28,19 @@ import org.apache.zookeeper.WatchedEvent;
 import org.apache.zookeeper.Watcher;
 
 class NamespaceWatcher implements Watcher, Closeable {
-    private volatile CuratorFrameworkImpl client;
+    private volatile CuratorFrameworkBase client;
     private volatile Watcher actualWatcher;
     private final String unfixedPath;
     private volatile CuratorWatcher curatorWatcher;
 
-    NamespaceWatcher(CuratorFrameworkImpl client, Watcher actualWatcher, 
String unfixedPath) {
+    NamespaceWatcher(CuratorFrameworkBase client, Watcher actualWatcher, 
String unfixedPath) {
         this.client = client;
         this.actualWatcher = actualWatcher;
         this.unfixedPath = Preconditions.checkNotNull(unfixedPath, 
"unfixedPath cannot be null");
         this.curatorWatcher = null;
     }
 
-    NamespaceWatcher(CuratorFrameworkImpl client, CuratorWatcher 
curatorWatcher, String unfixedPath) {
+    NamespaceWatcher(CuratorFrameworkBase client, CuratorWatcher 
curatorWatcher, String unfixedPath) {
         this.client = client;
         this.actualWatcher = null;
         this.curatorWatcher = curatorWatcher;
diff --git 
a/curator-framework/src/main/java/org/apache/curator/framework/imps/ProtectedMode.java
 
b/curator-framework/src/main/java/org/apache/curator/framework/imps/ProtectedMode.java
index 08a006bfa..8a7c27e7e 100644
--- 
a/curator-framework/src/main/java/org/apache/curator/framework/imps/ProtectedMode.java
+++ 
b/curator-framework/src/main/java/org/apache/curator/framework/imps/ProtectedMode.java
@@ -67,7 +67,7 @@ class ProtectedMode {
      * @param createMode create mode in use
      * @throws Exception errors
      */
-    void checkSetSessionId(CuratorFrameworkImpl client, CreateMode createMode) 
throws Exception {
+    void checkSetSessionId(CuratorFrameworkBase client, CreateMode createMode) 
throws Exception {
         if (doProtected() && (sessionId == 0) && createMode.isEphemeral()) {
             sessionId = client.getZooKeeper().getSessionId();
         }
@@ -82,7 +82,7 @@ class ProtectedMode {
      * @return either the found node or null - client should always use the 
returned value
      * @throws Exception errors
      */
-    String validateFoundNode(CuratorFrameworkImpl client, CreateMode 
createMode, String foundNode) throws Exception {
+    String validateFoundNode(CuratorFrameworkBase client, CreateMode 
createMode, String foundNode) throws Exception {
         if (doProtected() && createMode.isEphemeral()) {
             long clientSessionId = client.getZooKeeper().getSessionId();
             if (this.sessionId != clientSessionId) {
diff --git 
a/curator-framework/src/main/java/org/apache/curator/framework/imps/ReconfigBuilderImpl.java
 
b/curator-framework/src/main/java/org/apache/curator/framework/imps/ReconfigBuilderImpl.java
index aed240c4d..577cde5e7 100644
--- 
a/curator-framework/src/main/java/org/apache/curator/framework/imps/ReconfigBuilderImpl.java
+++ 
b/curator-framework/src/main/java/org/apache/curator/framework/imps/ReconfigBuilderImpl.java
@@ -34,7 +34,7 @@ import org.apache.zookeeper.server.DataTree;
 
 public class ReconfigBuilderImpl
         implements ReconfigBuilder, BackgroundOperation<Void>, 
ErrorListenerReconfigBuilderMain {
-    private final CuratorFrameworkImpl client;
+    private final CuratorFrameworkBase client;
 
     private Backgrounding backgrounding = new Backgrounding();
     private Stat responseStat;
@@ -43,12 +43,12 @@ public class ReconfigBuilderImpl
     private List<String> joining;
     private List<String> leaving;
 
-    public ReconfigBuilderImpl(CuratorFrameworkImpl client) {
+    public ReconfigBuilderImpl(CuratorFrameworkBase client) {
         this.client = client;
     }
 
     public ReconfigBuilderImpl(
-            CuratorFrameworkImpl client,
+            CuratorFrameworkBase client,
             Backgrounding backgrounding,
             Stat responseStat,
             long fromConfig,
diff --git 
a/curator-framework/src/main/java/org/apache/curator/framework/imps/RemoveWatchesBuilderImpl.java
 
b/curator-framework/src/main/java/org/apache/curator/framework/imps/RemoveWatchesBuilderImpl.java
index e0c7de85e..f346a2c3a 100644
--- 
a/curator-framework/src/main/java/org/apache/curator/framework/imps/RemoveWatchesBuilderImpl.java
+++ 
b/curator-framework/src/main/java/org/apache/curator/framework/imps/RemoveWatchesBuilderImpl.java
@@ -37,7 +37,7 @@ public class RemoveWatchesBuilderImpl
                 RemoveWatchesLocal,
                 BackgroundOperation<String>,
                 ErrorListenerPathable<Void> {
-    private CuratorFrameworkImpl client;
+    private CuratorFrameworkBase client;
     private Watcher watcher;
     private CuratorWatcher curatorWatcher;
     private WatcherType watcherType;
@@ -46,7 +46,7 @@ public class RemoveWatchesBuilderImpl
     private boolean quietly;
     private Backgrounding backgrounding;
 
-    public RemoveWatchesBuilderImpl(CuratorFrameworkImpl client) {
+    public RemoveWatchesBuilderImpl(CuratorFrameworkBase client) {
         this.client = client;
         this.watcher = null;
         this.curatorWatcher = null;
@@ -58,7 +58,7 @@ public class RemoveWatchesBuilderImpl
     }
 
     public RemoveWatchesBuilderImpl(
-            CuratorFrameworkImpl client,
+            CuratorFrameworkBase client,
             Watcher watcher,
             CuratorWatcher curatorWatcher,
             WatcherType watcherType,
@@ -191,7 +191,7 @@ public class RemoveWatchesBuilderImpl
         return null;
     }
 
-    protected CuratorFrameworkImpl getClient() {
+    protected CuratorFrameworkBase getClient() {
         return client;
     }
 
diff --git 
a/curator-framework/src/main/java/org/apache/curator/framework/imps/SetACLBuilderImpl.java
 
b/curator-framework/src/main/java/org/apache/curator/framework/imps/SetACLBuilderImpl.java
index a3e9e3677..0142de2c0 100644
--- 
a/curator-framework/src/main/java/org/apache/curator/framework/imps/SetACLBuilderImpl.java
+++ 
b/curator-framework/src/main/java/org/apache/curator/framework/imps/SetACLBuilderImpl.java
@@ -35,20 +35,20 @@ import org.apache.zookeeper.data.Stat;
 
 public class SetACLBuilderImpl
         implements SetACLBuilder, BackgroundPathable<Stat>, 
BackgroundOperation<String>, ErrorListenerPathable<Stat> {
-    private final CuratorFrameworkImpl client;
+    private final CuratorFrameworkBase client;
 
     private ACLing acling;
     private Backgrounding backgrounding;
     private int version;
 
-    SetACLBuilderImpl(CuratorFrameworkImpl client) {
+    SetACLBuilderImpl(CuratorFrameworkBase client) {
         this.client = client;
         backgrounding = new Backgrounding();
         acling = new ACLing(client.getAclProvider());
         version = -1;
     }
 
-    public SetACLBuilderImpl(CuratorFrameworkImpl client, Backgrounding 
backgrounding, List<ACL> aclList, int version) {
+    public SetACLBuilderImpl(CuratorFrameworkBase client, Backgrounding 
backgrounding, List<ACL> aclList, int version) {
         this.client = client;
         this.acling = new ACLing(client.getAclProvider(), aclList);
         this.version = version;
diff --git 
a/curator-framework/src/main/java/org/apache/curator/framework/imps/SetDataBuilderImpl.java
 
b/curator-framework/src/main/java/org/apache/curator/framework/imps/SetDataBuilderImpl.java
index 98b21e33a..38b011ceb 100644
--- 
a/curator-framework/src/main/java/org/apache/curator/framework/imps/SetDataBuilderImpl.java
+++ 
b/curator-framework/src/main/java/org/apache/curator/framework/imps/SetDataBuilderImpl.java
@@ -35,7 +35,7 @@ import org.apache.zookeeper.data.Stat;
 
 public class SetDataBuilderImpl
         implements SetDataBuilder, BackgroundOperation<PathAndBytes>, 
ErrorListenerPathAndBytesable<Stat> {
-    private final CuratorFrameworkImpl client;
+    private final CuratorFrameworkBase client;
     private Backgrounding backgrounding;
     private int version;
     private boolean compress;
@@ -50,14 +50,14 @@ public class SetDataBuilderImpl
     @VisibleForTesting
     boolean failNextIdempotentCheckForTesting = false;
 
-    SetDataBuilderImpl(CuratorFrameworkImpl client) {
+    SetDataBuilderImpl(CuratorFrameworkBase client) {
         this.client = client;
         backgrounding = new Backgrounding();
         version = -1;
         compress = client.compressionEnabled();
     }
 
-    public SetDataBuilderImpl(CuratorFrameworkImpl client, Backgrounding 
backgrounding, int version, boolean compress) {
+    public SetDataBuilderImpl(CuratorFrameworkBase client, Backgrounding 
backgrounding, int version, boolean compress) {
         this.client = client;
         this.backgrounding = backgrounding;
         this.version = version;
@@ -220,7 +220,7 @@ public class SetDataBuilderImpl
     }
 
     private void backgroundCheckIdempotent(
-            final CuratorFrameworkImpl client,
+            final CuratorFrameworkBase client,
             final OperationAndData<PathAndBytes> mainOperationAndData,
             final String path,
             final Backgrounding backgrounding) {
diff --git 
a/curator-framework/src/main/java/org/apache/curator/framework/imps/SyncBuilderImpl.java
 
b/curator-framework/src/main/java/org/apache/curator/framework/imps/SyncBuilderImpl.java
index d3c3a3a5e..92059229b 100755
--- 
a/curator-framework/src/main/java/org/apache/curator/framework/imps/SyncBuilderImpl.java
+++ 
b/curator-framework/src/main/java/org/apache/curator/framework/imps/SyncBuilderImpl.java
@@ -31,15 +31,15 @@ import 
org.apache.curator.framework.api.UnhandledErrorListener;
 import org.apache.zookeeper.AsyncCallback;
 
 public class SyncBuilderImpl implements SyncBuilder, 
BackgroundOperation<String>, ErrorListenerPathable<Void> {
-    private final CuratorFrameworkImpl client;
+    private final CuratorFrameworkBase client;
     private Backgrounding backgrounding = new Backgrounding();
 
-    public SyncBuilderImpl(CuratorFrameworkImpl client) {
+    public SyncBuilderImpl(CuratorFrameworkBase client) {
         // To change body of created methods use File | Settings | File 
Templates.
         this.client = client;
     }
 
-    public SyncBuilderImpl(CuratorFrameworkImpl client, Backgrounding 
backgrounding) {
+    public SyncBuilderImpl(CuratorFrameworkBase client, Backgrounding 
backgrounding) {
         this.client = client;
         this.backgrounding = backgrounding;
     }
diff --git 
a/curator-framework/src/main/java/org/apache/curator/framework/imps/TempGetDataBuilderImpl.java
 
b/curator-framework/src/main/java/org/apache/curator/framework/imps/TempGetDataBuilderImpl.java
index fabf255dd..92cc79985 100644
--- 
a/curator-framework/src/main/java/org/apache/curator/framework/imps/TempGetDataBuilderImpl.java
+++ 
b/curator-framework/src/main/java/org/apache/curator/framework/imps/TempGetDataBuilderImpl.java
@@ -28,11 +28,11 @@ import org.apache.curator.framework.api.TempGetDataBuilder;
 import org.apache.zookeeper.data.Stat;
 
 class TempGetDataBuilderImpl implements TempGetDataBuilder {
-    private final CuratorFrameworkImpl client;
+    private final CuratorFrameworkBase client;
     private Stat responseStat;
     private boolean decompress;
 
-    TempGetDataBuilderImpl(CuratorFrameworkImpl client) {
+    TempGetDataBuilderImpl(CuratorFrameworkBase client) {
         this.client = client;
         responseStat = null;
         decompress = client.compressionEnabled();
diff --git 
a/curator-framework/src/main/java/org/apache/curator/framework/imps/TransactionOpImpl.java
 
b/curator-framework/src/main/java/org/apache/curator/framework/imps/TransactionOpImpl.java
index 41f7949c8..42ca0834b 100644
--- 
a/curator-framework/src/main/java/org/apache/curator/framework/imps/TransactionOpImpl.java
+++ 
b/curator-framework/src/main/java/org/apache/curator/framework/imps/TransactionOpImpl.java
@@ -27,9 +27,9 @@ import 
org.apache.curator.framework.api.transaction.TransactionOp;
 import org.apache.curator.framework.api.transaction.TransactionSetDataBuilder;
 
 public class TransactionOpImpl implements TransactionOp {
-    private final CuratorFrameworkImpl client;
+    private final CuratorFrameworkBase client;
 
-    public TransactionOpImpl(CuratorFrameworkImpl client) {
+    public TransactionOpImpl(CuratorFrameworkBase client) {
         this.client = client;
     }
 
diff --git 
a/curator-framework/src/main/java/org/apache/curator/framework/imps/WatcherRemovalFacade.java
 
b/curator-framework/src/main/java/org/apache/curator/framework/imps/WatcherRemovalFacade.java
index 01e96f5e3..b10099a36 100644
--- 
a/curator-framework/src/main/java/org/apache/curator/framework/imps/WatcherRemovalFacade.java
+++ 
b/curator-framework/src/main/java/org/apache/curator/framework/imps/WatcherRemovalFacade.java
@@ -19,45 +19,34 @@
 
 package org.apache.curator.framework.imps;
 
-import org.apache.curator.CuratorZookeeperClient;
-import org.apache.curator.RetryLoop;
 import org.apache.curator.framework.CuratorFramework;
 import org.apache.curator.framework.WatcherRemoveCuratorFramework;
-import org.apache.curator.framework.api.CuratorEvent;
-import org.apache.curator.framework.api.CuratorListener;
-import org.apache.curator.framework.api.UnhandledErrorListener;
-import org.apache.curator.framework.listen.Listenable;
-import org.apache.curator.framework.state.ConnectionStateListener;
-import org.apache.curator.utils.EnsurePath;
-import org.apache.zookeeper.ZooKeeper;
-import org.apache.zookeeper.server.quorum.flexible.QuorumVerifier;
 
-class WatcherRemovalFacade extends CuratorFrameworkImpl implements 
WatcherRemoveCuratorFramework {
-    private final CuratorFrameworkImpl client;
+class WatcherRemovalFacade extends DelegatingCuratorFramework implements 
WatcherRemoveCuratorFramework {
     private final WatcherRemovalManager removalManager;
 
-    WatcherRemovalFacade(CuratorFrameworkImpl client) {
-        this(client, new WatcherRemovalManager(client));
+    WatcherRemovalFacade(CuratorFrameworkBase client) {
+        super(client);
+        removalManager = new WatcherRemovalManager(client);
     }
 
-    private WatcherRemovalFacade(CuratorFrameworkImpl client, 
WatcherRemovalManager removalManager) {
+    private WatcherRemovalFacade(CuratorFrameworkBase client, 
WatcherRemovalManager removalManager) {
         super(client);
-        this.client = client;
         this.removalManager = removalManager;
     }
 
     @Override
-    public WatcherRemoveCuratorFramework newWatcherRemoveCuratorFramework() {
-        return client.newWatcherRemoveCuratorFramework();
+    public void start() {
+        throw new UnsupportedOperationException();
     }
 
-    WatcherRemovalManager getRemovalManager() {
-        return removalManager;
+    @Override
+    public void close() {
+        throw new UnsupportedOperationException();
     }
 
-    @Override
-    public QuorumVerifier getCurrentConfig() {
-        return client.getCurrentConfig();
+    WatcherRemovalManager getRemovalManager() {
+        return removalManager;
     }
 
     @Override
@@ -70,99 +59,9 @@ class WatcherRemovalFacade extends CuratorFrameworkImpl 
implements WatcherRemove
         return removalManager;
     }
 
-    @Override
-    public CuratorFramework nonNamespaceView() {
-        return client.nonNamespaceView();
-    }
-
     @Override
     public CuratorFramework usingNamespace(String newNamespace) {
-        final CuratorFrameworkImpl newClient = (CuratorFrameworkImpl) 
client.usingNamespace(newNamespace);
+        final CuratorFrameworkBase newClient = (CuratorFrameworkBase) 
client.usingNamespace(newNamespace);
         return new WatcherRemovalFacade(newClient, removalManager);
     }
-
-    @Override
-    public String getNamespace() {
-        return client.getNamespace();
-    }
-
-    @Override
-    public void start() {
-        throw new UnsupportedOperationException();
-    }
-
-    @Override
-    public void close() {
-        throw new UnsupportedOperationException();
-    }
-
-    @Override
-    public Listenable<ConnectionStateListener> getConnectionStateListenable() {
-        return client.getConnectionStateListenable();
-    }
-
-    @Override
-    public Listenable<CuratorListener> getCuratorListenable() {
-        return client.getCuratorListenable();
-    }
-
-    @Override
-    public Listenable<UnhandledErrorListener> getUnhandledErrorListenable() {
-        return client.getUnhandledErrorListenable();
-    }
-
-    @Override
-    public void sync(String path, Object context) {
-        client.sync(path, context);
-    }
-
-    @Override
-    public CuratorZookeeperClient getZookeeperClient() {
-        return client.getZookeeperClient();
-    }
-
-    @Override
-    RetryLoop newRetryLoop() {
-        return client.newRetryLoop();
-    }
-
-    @Override
-    ZooKeeper getZooKeeper() throws Exception {
-        return client.getZooKeeper();
-    }
-
-    @Override
-    <DATA_TYPE> void processBackgroundOperation(OperationAndData<DATA_TYPE> 
operationAndData, CuratorEvent event) {
-        client.processBackgroundOperation(operationAndData, event);
-    }
-
-    @Override
-    void logError(String reason, Throwable e) {
-        client.logError(reason, e);
-    }
-
-    @Override
-    String unfixForNamespace(String path) {
-        return client.unfixForNamespace(path);
-    }
-
-    @Override
-    String fixForNamespace(String path) {
-        return client.fixForNamespace(path);
-    }
-
-    @Override
-    String fixForNamespace(String path, boolean isSequential) {
-        return client.fixForNamespace(path, isSequential);
-    }
-
-    @Override
-    public EnsurePath newNamespaceAwareEnsurePath(String path) {
-        return client.newNamespaceAwareEnsurePath(path);
-    }
-
-    @Override
-    FailedDeleteManager getFailedDeleteManager() {
-        return client.getFailedDeleteManager();
-    }
 }
diff --git 
a/curator-framework/src/main/java/org/apache/curator/framework/imps/WatcherRemovalManager.java
 
b/curator-framework/src/main/java/org/apache/curator/framework/imps/WatcherRemovalManager.java
index f8b4a3984..847e4e7de 100644
--- 
a/curator-framework/src/main/java/org/apache/curator/framework/imps/WatcherRemovalManager.java
+++ 
b/curator-framework/src/main/java/org/apache/curator/framework/imps/WatcherRemovalManager.java
@@ -31,10 +31,10 @@ import org.slf4j.LoggerFactory;
 
 public class WatcherRemovalManager {
     private final Logger log = LoggerFactory.getLogger(getClass());
-    private final CuratorFrameworkImpl client;
+    private final CuratorFrameworkBase client;
     private final Set<NamespaceWatcher> entries = Sets.newConcurrentHashSet();
 
-    WatcherRemovalManager(CuratorFrameworkImpl client) {
+    WatcherRemovalManager(CuratorFrameworkBase client) {
         this.client = client;
     }
 
diff --git 
a/curator-framework/src/main/java/org/apache/curator/framework/imps/WatchesBuilderImpl.java
 
b/curator-framework/src/main/java/org/apache/curator/framework/imps/WatchesBuilderImpl.java
index cb63dc8b3..5cf1a0e99 100644
--- 
a/curator-framework/src/main/java/org/apache/curator/framework/imps/WatchesBuilderImpl.java
+++ 
b/curator-framework/src/main/java/org/apache/curator/framework/imps/WatchesBuilderImpl.java
@@ -26,12 +26,12 @@ import org.apache.zookeeper.Watcher;
 import org.apache.zookeeper.Watcher.WatcherType;
 
 public class WatchesBuilderImpl extends RemoveWatchesBuilderImpl implements 
WatchesBuilder {
-    public WatchesBuilderImpl(CuratorFrameworkImpl client) {
+    public WatchesBuilderImpl(CuratorFrameworkBase client) {
         super(client);
     }
 
     public WatchesBuilderImpl(
-            CuratorFrameworkImpl client,
+            CuratorFrameworkBase client,
             Watcher watcher,
             CuratorWatcher curatorWatcher,
             WatcherType watcherType,
diff --git 
a/curator-framework/src/main/java/org/apache/curator/framework/imps/Watching.java
 
b/curator-framework/src/main/java/org/apache/curator/framework/imps/Watching.java
index b381f4136..f0d3ec19c 100644
--- 
a/curator-framework/src/main/java/org/apache/curator/framework/imps/Watching.java
+++ 
b/curator-framework/src/main/java/org/apache/curator/framework/imps/Watching.java
@@ -27,31 +27,31 @@ public class Watching {
     private final Watcher watcher;
     private final CuratorWatcher curatorWatcher;
     private final boolean watched;
-    private final CuratorFrameworkImpl client;
+    private final CuratorFrameworkBase client;
     private NamespaceWatcher namespaceWatcher;
 
-    public Watching(CuratorFrameworkImpl client, boolean watched) {
+    public Watching(CuratorFrameworkBase client, boolean watched) {
         this.client = client;
         this.watcher = null;
         this.curatorWatcher = null;
         this.watched = watched;
     }
 
-    public Watching(CuratorFrameworkImpl client, Watcher watcher) {
+    public Watching(CuratorFrameworkBase client, Watcher watcher) {
         this.client = client;
         this.watcher = watcher;
         this.curatorWatcher = null;
         this.watched = false;
     }
 
-    public Watching(CuratorFrameworkImpl client, CuratorWatcher watcher) {
+    public Watching(CuratorFrameworkBase client, CuratorWatcher watcher) {
         this.client = client;
         this.watcher = null;
         this.curatorWatcher = watcher;
         this.watched = false;
     }
 
-    public Watching(CuratorFrameworkImpl client) {
+    public Watching(CuratorFrameworkBase client) {
         this.client = client;
         watcher = null;
         watched = false;
diff --git 
a/curator-framework/src/test/java/org/apache/curator/framework/imps/TestCleanState.java
 
b/curator-framework/src/test/java/org/apache/curator/framework/imps/TestCleanState.java
index 2678b0bbf..acb1519f5 100644
--- 
a/curator-framework/src/test/java/org/apache/curator/framework/imps/TestCleanState.java
+++ 
b/curator-framework/src/test/java/org/apache/curator/framework/imps/TestCleanState.java
@@ -37,7 +37,7 @@ public class TestCleanState {
 
         try {
             Timing2 timing = new Timing2();
-            CuratorFrameworkImpl internalClient = (CuratorFrameworkImpl) 
client;
+            CuratorFrameworkBase internalClient = (CuratorFrameworkBase) 
client;
             EnsembleTracker ensembleTracker = 
internalClient.getEnsembleTracker();
             if (ensembleTracker != null) {
                 Awaitility.await().until(() -> 
!ensembleTracker.hasOutstanding());
diff --git 
a/curator-framework/src/test/java/org/apache/curator/framework/imps/TestFailedDeleteManager.java
 
b/curator-framework/src/test/java/org/apache/curator/framework/imps/TestFailedDeleteManager.java
index fdafbabcd..e8ae04fa0 100644
--- 
a/curator-framework/src/test/java/org/apache/curator/framework/imps/TestFailedDeleteManager.java
+++ 
b/curator-framework/src/test/java/org/apache/curator/framework/imps/TestFailedDeleteManager.java
@@ -250,7 +250,7 @@ public class TestFailedDeleteManager extends 
BaseClassForTests {
 
         final AtomicBoolean pathAdded = new AtomicBoolean(false);
 
-        ((CuratorFrameworkImpl) client).getFailedDeleteManager().debugListener 
=
+        ((CuratorFrameworkBase) client).getFailedDeleteManager().debugListener 
=
                 new 
FailedOperationManager.FailedOperationManagerListener<String>() {
 
                     @Override
@@ -277,7 +277,7 @@ public class TestFailedDeleteManager extends 
BaseClassForTests {
 
         final AtomicBoolean pathAdded = new AtomicBoolean(false);
 
-        ((CuratorFrameworkImpl) client).getFailedDeleteManager().debugListener 
=
+        ((CuratorFrameworkBase) client).getFailedDeleteManager().debugListener 
=
                 new 
FailedOperationManager.FailedOperationManagerListener<String>() {
 
                     @Override
diff --git 
a/curator-framework/src/test/java/org/apache/curator/framework/imps/TestFramework.java
 
b/curator-framework/src/test/java/org/apache/curator/framework/imps/TestFramework.java
index 3973e5aae..6ffd03406 100644
--- 
a/curator-framework/src/test/java/org/apache/curator/framework/imps/TestFramework.java
+++ 
b/curator-framework/src/test/java/org/apache/curator/framework/imps/TestFramework.java
@@ -745,7 +745,7 @@ public class TestFramework extends BaseClassForTests {
 
         client.start();
 
-        CuratorFrameworkImpl nullNamespace = (CuratorFrameworkImpl) 
client.usingNamespace(null);
+        CuratorFrameworkBase nullNamespace = (CuratorFrameworkBase) 
client.usingNamespace(null);
 
         assertNotNull(nullNamespace.getEnsembleTracker());
         assertNotNull(nullNamespace.getNamespaceFacadeCache());
diff --git 
a/curator-framework/src/test/java/org/apache/curator/framework/imps/TestNamespaceFacade.java
 
b/curator-framework/src/test/java/org/apache/curator/framework/imps/TestNamespaceFacade.java
index 131c62cce..4ddc3f710 100644
--- 
a/curator-framework/src/test/java/org/apache/curator/framework/imps/TestNamespaceFacade.java
+++ 
b/curator-framework/src/test/java/org/apache/curator/framework/imps/TestNamespaceFacade.java
@@ -217,9 +217,8 @@ public class TestNamespaceFacade extends BaseClassForTests {
                 .retryPolicy(new RetryOneTime(1))
                 .connectString("foo")
                 .build();
-        CuratorFrameworkImpl clientImpl = (CuratorFrameworkImpl) client;
 
-        assertEquals(clientImpl.unfixForNamespace("/foo/bar"), "/foo/bar");
+        assertEquals(((CuratorFrameworkBase) 
client).unfixForNamespace("/foo/bar"), "/foo/bar");
 
         CloseableUtils.closeQuietly(client);
     }
diff --git 
a/curator-framework/src/test/java/org/apache/curator/framework/imps/TestReconfiguration.java
 
b/curator-framework/src/test/java/org/apache/curator/framework/imps/TestReconfiguration.java
index c279749b1..11a17421d 100644
--- 
a/curator-framework/src/test/java/org/apache/curator/framework/imps/TestReconfiguration.java
+++ 
b/curator-framework/src/test/java/org/apache/curator/framework/imps/TestReconfiguration.java
@@ -213,7 +213,7 @@ public class TestReconfiguration extends CuratorTestBase {
     public void testAddWithoutEnsembleTracker() throws Exception {
         final String initialClusterCS = cluster.getConnectString();
         try (CuratorFramework client = newClient(cluster.getConnectString(), 
false)) {
-            assertEquals(((CuratorFrameworkImpl) client).getEnsembleTracker(), 
null);
+            assertEquals(((CuratorFrameworkBase) client).getEnsembleTracker(), 
null);
             client.start();
 
             QuorumVerifier oldConfig = 
toQuorumVerifier(client.getConfig().forEnsemble());
diff --git 
a/curator-framework/src/test/java/org/apache/curator/framework/imps/TestWatchesBuilder.java
 
b/curator-framework/src/test/java/org/apache/curator/framework/imps/TestWatchesBuilder.java
index 3dd57ae47..d639ef23e 100644
--- 
a/curator-framework/src/test/java/org/apache/curator/framework/imps/TestWatchesBuilder.java
+++ 
b/curator-framework/src/test/java/org/apache/curator/framework/imps/TestWatchesBuilder.java
@@ -126,7 +126,7 @@ public class TestWatchesBuilder extends CuratorTestBase {
     @Test
     public void testRemoveCuratorWatch() throws Exception {
         Timing timing = new Timing();
-        CuratorFrameworkImpl client = (CuratorFrameworkImpl) 
CuratorFrameworkFactory.builder()
+        CuratorFramework client = CuratorFrameworkFactory.builder()
                 .connectString(server.getConnectString())
                 .retryPolicy(new RetryOneTime(1))
                 .build();
@@ -159,7 +159,7 @@ public class TestWatchesBuilder extends CuratorTestBase {
     @Test
     public void testRemoveWatch() throws Exception {
         Timing timing = new Timing();
-        CuratorFrameworkImpl client = (CuratorFrameworkImpl) 
CuratorFrameworkFactory.builder()
+        CuratorFramework client = CuratorFrameworkFactory.builder()
                 .connectString(server.getConnectString())
                 .retryPolicy(new RetryOneTime(1))
                 .build();
@@ -184,7 +184,7 @@ public class TestWatchesBuilder extends CuratorTestBase {
     @Test
     public void testRemoveWatchInBackgroundWithCallback() throws Exception {
         Timing timing = new Timing();
-        CuratorFrameworkImpl client = (CuratorFrameworkImpl) 
CuratorFrameworkFactory.builder()
+        CuratorFramework client = CuratorFrameworkFactory.builder()
                 .connectString(server.getConnectString())
                 .retryPolicy(new RetryOneTime(1))
                 .build();
@@ -225,7 +225,7 @@ public class TestWatchesBuilder extends CuratorTestBase {
     @Test
     public void testRemoveWatchInBackgroundWithNoCallback() throws Exception {
         Timing timing = new Timing();
-        CuratorFrameworkImpl client = (CuratorFrameworkImpl) 
CuratorFrameworkFactory.builder()
+        CuratorFramework client = CuratorFrameworkFactory.builder()
                 .connectString(server.getConnectString())
                 .retryPolicy(new RetryOneTime(1))
                 .build();
@@ -250,7 +250,7 @@ public class TestWatchesBuilder extends CuratorTestBase {
     @Test
     public void testRemoveAllWatches() throws Exception {
         Timing timing = new Timing();
-        CuratorFrameworkImpl client = (CuratorFrameworkImpl) 
CuratorFrameworkFactory.builder()
+        CuratorFramework client = CuratorFrameworkFactory.builder()
                 .connectString(server.getConnectString())
                 .retryPolicy(new RetryOneTime(1))
                 .build();
@@ -335,7 +335,7 @@ public class TestWatchesBuilder extends CuratorTestBase {
     @Test
     public void testRemoveLocalWatch() throws Exception {
         Timing timing = new Timing();
-        CuratorFrameworkImpl client = (CuratorFrameworkImpl) 
CuratorFrameworkFactory.builder()
+        CuratorFramework client = CuratorFrameworkFactory.builder()
                 .connectString(server.getConnectString())
                 .retryPolicy(new RetryOneTime(1))
                 .build();
@@ -368,7 +368,7 @@ public class TestWatchesBuilder extends CuratorTestBase {
     @Test
     public void testRemoveLocalWatchInBackground() throws Exception {
         Timing timing = new Timing();
-        CuratorFrameworkImpl client = (CuratorFrameworkImpl) 
CuratorFrameworkFactory.builder()
+        CuratorFramework client = CuratorFrameworkFactory.builder()
                 .connectString(server.getConnectString())
                 .retryPolicy(new RetryOneTime(1))
                 .build();
@@ -510,7 +510,7 @@ public class TestWatchesBuilder extends CuratorTestBase {
 
             final CountDownLatch guaranteeAddedLatch = new CountDownLatch(1);
 
-            ((CuratorFrameworkImpl) 
client).getFailedRemoveWatcherManager().debugListener =
+            ((CuratorFrameworkBase) 
client).getFailedRemoveWatcherManager().debugListener =
                     new FailedOperationManager.FailedOperationManagerListener<
                             
FailedRemoveWatchManager.FailedRemoveWatchDetails>() {
 
diff --git 
a/curator-recipes/src/test/java/org/apache/curator/framework/recipes/leader/TestLeaderSelectorEdges.java
 
b/curator-recipes/src/test/java/org/apache/curator/framework/recipes/leader/TestLeaderSelectorEdges.java
index 6e8fcbbba..955827909 100644
--- 
a/curator-recipes/src/test/java/org/apache/curator/framework/recipes/leader/TestLeaderSelectorEdges.java
+++ 
b/curator-recipes/src/test/java/org/apache/curator/framework/recipes/leader/TestLeaderSelectorEdges.java
@@ -21,7 +21,6 @@ package org.apache.curator.framework.recipes.leader;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertTrue;
-import static org.junit.jupiter.api.Assertions.fail;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.TimeUnit;
 import org.apache.curator.framework.CuratorFramework;
@@ -98,15 +97,13 @@ public class TestLeaderSelectorEdges extends 
BaseClassForTests {
         } finally {
             try {
                 leaderSelector1.close();
-            } catch (IllegalStateException e) {
-                fail(e.getMessage());
+            } catch (IllegalStateException ignored) {
             }
             try {
                 if (leaderSelector2 != null) {
                     leaderSelector2.close();
                 }
-            } catch (IllegalStateException e) {
-                fail(e.getMessage());
+            } catch (IllegalStateException ignored) {
             }
             client.close();
         }
diff --git 
a/curator-x-async/src/main/java/org/apache/curator/x/async/details/AsyncCreateBuilderImpl.java
 
b/curator-x-async/src/main/java/org/apache/curator/x/async/details/AsyncCreateBuilderImpl.java
index 6f9a6c045..705de5975 100644
--- 
a/curator-x-async/src/main/java/org/apache/curator/x/async/details/AsyncCreateBuilderImpl.java
+++ 
b/curator-x-async/src/main/java/org/apache/curator/x/async/details/AsyncCreateBuilderImpl.java
@@ -26,7 +26,7 @@ import java.util.List;
 import java.util.Objects;
 import java.util.Set;
 import org.apache.curator.framework.imps.CreateBuilderImpl;
-import org.apache.curator.framework.imps.CuratorFrameworkImpl;
+import org.apache.curator.framework.imps.CuratorFrameworkBase;
 import org.apache.curator.x.async.AsyncStage;
 import org.apache.curator.x.async.api.AsyncCreateBuilder;
 import org.apache.curator.x.async.api.AsyncPathAndBytesable;
@@ -36,7 +36,7 @@ import org.apache.zookeeper.data.ACL;
 import org.apache.zookeeper.data.Stat;
 
 class AsyncCreateBuilderImpl implements AsyncCreateBuilder {
-    private final CuratorFrameworkImpl client;
+    private final CuratorFrameworkBase client;
     private final Filters filters;
     private CreateMode createMode = CreateMode.PERSISTENT;
     private List<ACL> aclList = null;
@@ -45,7 +45,7 @@ class AsyncCreateBuilderImpl implements AsyncCreateBuilder {
     private long ttl = -1;
     private int setDataVersion = -1;
 
-    AsyncCreateBuilderImpl(CuratorFrameworkImpl client, Filters filters) {
+    AsyncCreateBuilderImpl(CuratorFrameworkBase client, Filters filters) {
         this.client = client;
         this.filters = filters;
     }
diff --git 
a/curator-x-async/src/main/java/org/apache/curator/x/async/details/AsyncCuratorFrameworkImpl.java
 
b/curator-x-async/src/main/java/org/apache/curator/x/async/details/AsyncCuratorFrameworkImpl.java
index ee2941e4d..1016b789a 100644
--- 
a/curator-x-async/src/main/java/org/apache/curator/x/async/details/AsyncCuratorFrameworkImpl.java
+++ 
b/curator-x-async/src/main/java/org/apache/curator/x/async/details/AsyncCuratorFrameworkImpl.java
@@ -28,7 +28,7 @@ import org.apache.curator.framework.CuratorFramework;
 import org.apache.curator.framework.api.CuratorEvent;
 import org.apache.curator.framework.api.UnhandledErrorListener;
 import org.apache.curator.framework.api.transaction.CuratorTransactionResult;
-import org.apache.curator.framework.imps.CuratorFrameworkImpl;
+import org.apache.curator.framework.imps.CuratorFrameworkBase;
 import org.apache.curator.framework.imps.CuratorMultiTransactionImpl;
 import org.apache.curator.framework.imps.GetACLBuilderImpl;
 import org.apache.curator.framework.imps.SyncBuilderImpl;
@@ -41,7 +41,7 @@ import org.apache.zookeeper.data.ACL;
 import org.apache.zookeeper.data.Stat;
 
 public class AsyncCuratorFrameworkImpl implements AsyncCuratorFramework {
-    private final CuratorFrameworkImpl client;
+    private final CuratorFrameworkBase client;
     private final Filters filters;
     private final WatchMode watchMode;
     private final boolean watched;
@@ -50,9 +50,9 @@ public class AsyncCuratorFrameworkImpl implements 
AsyncCuratorFramework {
         this(reveal(client), new Filters(null, null, null), 
WatchMode.stateChangeAndSuccess, false);
     }
 
-    private static CuratorFrameworkImpl reveal(CuratorFramework client) {
+    private static CuratorFrameworkBase reveal(CuratorFramework client) {
         try {
-            return (CuratorFrameworkImpl) Objects.requireNonNull(client, 
"client cannot be null");
+            return (CuratorFrameworkBase) Objects.requireNonNull(client, 
"client cannot be null");
         } catch (Exception e) {
             throw new IllegalArgumentException(
                     "Only Curator clients created through 
CuratorFrameworkFactory are supported: "
@@ -61,7 +61,7 @@ public class AsyncCuratorFrameworkImpl implements 
AsyncCuratorFramework {
     }
 
     public AsyncCuratorFrameworkImpl(
-            CuratorFrameworkImpl client, Filters filters, WatchMode watchMode, 
boolean watched) {
+            CuratorFrameworkBase client, Filters filters, WatchMode watchMode, 
boolean watched) {
         this.client = Objects.requireNonNull(client, "client cannot be null");
         this.filters = Objects.requireNonNull(filters, "filters cannot be 
null");
         this.watchMode = Objects.requireNonNull(watchMode, "watchMode cannot 
be null");
@@ -223,7 +223,7 @@ public class AsyncCuratorFrameworkImpl implements 
AsyncCuratorFramework {
         return filters;
     }
 
-    CuratorFrameworkImpl getClient() {
+    CuratorFrameworkBase getClient() {
         return client;
     }
 
diff --git 
a/curator-x-async/src/main/java/org/apache/curator/x/async/details/AsyncDeleteBuilderImpl.java
 
b/curator-x-async/src/main/java/org/apache/curator/x/async/details/AsyncDeleteBuilderImpl.java
index b1175f7b7..7333dd9fe 100644
--- 
a/curator-x-async/src/main/java/org/apache/curator/x/async/details/AsyncDeleteBuilderImpl.java
+++ 
b/curator-x-async/src/main/java/org/apache/curator/x/async/details/AsyncDeleteBuilderImpl.java
@@ -24,7 +24,7 @@ import static 
org.apache.curator.x.async.details.BackgroundProcs.safeCall;
 import java.util.Collections;
 import java.util.Objects;
 import java.util.Set;
-import org.apache.curator.framework.imps.CuratorFrameworkImpl;
+import org.apache.curator.framework.imps.CuratorFrameworkBase;
 import org.apache.curator.framework.imps.DeleteBuilderImpl;
 import org.apache.curator.x.async.AsyncStage;
 import org.apache.curator.x.async.api.AsyncDeleteBuilder;
@@ -32,12 +32,12 @@ import org.apache.curator.x.async.api.AsyncPathable;
 import org.apache.curator.x.async.api.DeleteOption;
 
 class AsyncDeleteBuilderImpl implements AsyncDeleteBuilder {
-    private final CuratorFrameworkImpl client;
+    private final CuratorFrameworkBase client;
     private final Filters filters;
     private Set<DeleteOption> options = Collections.emptySet();
     private int version = -1;
 
-    AsyncDeleteBuilderImpl(CuratorFrameworkImpl client, Filters filters) {
+    AsyncDeleteBuilderImpl(CuratorFrameworkBase client, Filters filters) {
         this.client = client;
         this.filters = filters;
     }
diff --git 
a/curator-x-async/src/main/java/org/apache/curator/x/async/details/AsyncExistsBuilderImpl.java
 
b/curator-x-async/src/main/java/org/apache/curator/x/async/details/AsyncExistsBuilderImpl.java
index 002713081..00c19f049 100644
--- 
a/curator-x-async/src/main/java/org/apache/curator/x/async/details/AsyncExistsBuilderImpl.java
+++ 
b/curator-x-async/src/main/java/org/apache/curator/x/async/details/AsyncExistsBuilderImpl.java
@@ -24,7 +24,7 @@ import static 
org.apache.curator.x.async.details.BackgroundProcs.safeStatProc;
 import java.util.Collections;
 import java.util.Objects;
 import java.util.Set;
-import org.apache.curator.framework.imps.CuratorFrameworkImpl;
+import org.apache.curator.framework.imps.CuratorFrameworkBase;
 import org.apache.curator.framework.imps.ExistsBuilderImpl;
 import org.apache.curator.x.async.AsyncStage;
 import org.apache.curator.x.async.WatchMode;
@@ -34,12 +34,12 @@ import org.apache.curator.x.async.api.ExistsOption;
 import org.apache.zookeeper.data.Stat;
 
 class AsyncExistsBuilderImpl implements AsyncExistsBuilder {
-    private final CuratorFrameworkImpl client;
+    private final CuratorFrameworkBase client;
     private final Filters filters;
     private final WatchMode watchMode;
     private Set<ExistsOption> options = Collections.emptySet();
 
-    AsyncExistsBuilderImpl(CuratorFrameworkImpl client, Filters filters, 
WatchMode watchMode) {
+    AsyncExistsBuilderImpl(CuratorFrameworkBase client, Filters filters, 
WatchMode watchMode) {
         this.client = client;
         this.filters = filters;
         this.watchMode = watchMode;
diff --git 
a/curator-x-async/src/main/java/org/apache/curator/x/async/details/AsyncGetChildrenBuilderImpl.java
 
b/curator-x-async/src/main/java/org/apache/curator/x/async/details/AsyncGetChildrenBuilderImpl.java
index f30a52986..8a75fa7af 100644
--- 
a/curator-x-async/src/main/java/org/apache/curator/x/async/details/AsyncGetChildrenBuilderImpl.java
+++ 
b/curator-x-async/src/main/java/org/apache/curator/x/async/details/AsyncGetChildrenBuilderImpl.java
@@ -22,7 +22,7 @@ package org.apache.curator.x.async.details;
 import static org.apache.curator.x.async.details.BackgroundProcs.childrenProc;
 import static org.apache.curator.x.async.details.BackgroundProcs.safeCall;
 import java.util.List;
-import org.apache.curator.framework.imps.CuratorFrameworkImpl;
+import org.apache.curator.framework.imps.CuratorFrameworkBase;
 import org.apache.curator.framework.imps.GetChildrenBuilderImpl;
 import org.apache.curator.x.async.AsyncStage;
 import org.apache.curator.x.async.WatchMode;
@@ -31,12 +31,12 @@ import org.apache.curator.x.async.api.AsyncPathable;
 import org.apache.zookeeper.data.Stat;
 
 class AsyncGetChildrenBuilderImpl implements AsyncGetChildrenBuilder {
-    private final CuratorFrameworkImpl client;
+    private final CuratorFrameworkBase client;
     private final Filters filters;
     private final WatchMode watchMode;
     private Stat stat = null;
 
-    AsyncGetChildrenBuilderImpl(CuratorFrameworkImpl client, Filters filters, 
WatchMode watchMode) {
+    AsyncGetChildrenBuilderImpl(CuratorFrameworkBase client, Filters filters, 
WatchMode watchMode) {
         this.client = client;
         this.filters = filters;
         this.watchMode = watchMode;
diff --git 
a/curator-x-async/src/main/java/org/apache/curator/x/async/details/AsyncGetConfigBuilderImpl.java
 
b/curator-x-async/src/main/java/org/apache/curator/x/async/details/AsyncGetConfigBuilderImpl.java
index a3390bea9..88c96f1db 100644
--- 
a/curator-x-async/src/main/java/org/apache/curator/x/async/details/AsyncGetConfigBuilderImpl.java
+++ 
b/curator-x-async/src/main/java/org/apache/curator/x/async/details/AsyncGetConfigBuilderImpl.java
@@ -21,7 +21,7 @@ package org.apache.curator.x.async.details;
 
 import static org.apache.curator.x.async.details.BackgroundProcs.dataProc;
 import static org.apache.curator.x.async.details.BackgroundProcs.safeCall;
-import org.apache.curator.framework.imps.CuratorFrameworkImpl;
+import org.apache.curator.framework.imps.CuratorFrameworkBase;
 import org.apache.curator.framework.imps.GetConfigBuilderImpl;
 import org.apache.curator.x.async.AsyncStage;
 import org.apache.curator.x.async.WatchMode;
@@ -30,12 +30,12 @@ import org.apache.curator.x.async.api.AsyncGetConfigBuilder;
 import org.apache.zookeeper.data.Stat;
 
 class AsyncGetConfigBuilderImpl implements AsyncGetConfigBuilder {
-    private final CuratorFrameworkImpl client;
+    private final CuratorFrameworkBase client;
     private final Filters filters;
     private final WatchMode watchMode;
     private Stat stat = null;
 
-    AsyncGetConfigBuilderImpl(CuratorFrameworkImpl client, Filters filters, 
WatchMode watchMode) {
+    AsyncGetConfigBuilderImpl(CuratorFrameworkBase client, Filters filters, 
WatchMode watchMode) {
         this.client = client;
         this.filters = filters;
         this.watchMode = watchMode;
diff --git 
a/curator-x-async/src/main/java/org/apache/curator/x/async/details/AsyncGetDataBuilderImpl.java
 
b/curator-x-async/src/main/java/org/apache/curator/x/async/details/AsyncGetDataBuilderImpl.java
index 1498968a1..8b93674d2 100644
--- 
a/curator-x-async/src/main/java/org/apache/curator/x/async/details/AsyncGetDataBuilderImpl.java
+++ 
b/curator-x-async/src/main/java/org/apache/curator/x/async/details/AsyncGetDataBuilderImpl.java
@@ -21,7 +21,7 @@ package org.apache.curator.x.async.details;
 
 import static org.apache.curator.x.async.details.BackgroundProcs.dataProc;
 import static org.apache.curator.x.async.details.BackgroundProcs.safeCall;
-import org.apache.curator.framework.imps.CuratorFrameworkImpl;
+import org.apache.curator.framework.imps.CuratorFrameworkBase;
 import org.apache.curator.framework.imps.GetDataBuilderImpl;
 import org.apache.curator.x.async.AsyncStage;
 import org.apache.curator.x.async.WatchMode;
@@ -30,13 +30,13 @@ import org.apache.curator.x.async.api.AsyncPathable;
 import org.apache.zookeeper.data.Stat;
 
 class AsyncGetDataBuilderImpl implements AsyncGetDataBuilder {
-    private final CuratorFrameworkImpl client;
+    private final CuratorFrameworkBase client;
     private final Filters filters;
     private final WatchMode watchMode;
     private boolean decompressed;
     private Stat stat = null;
 
-    AsyncGetDataBuilderImpl(CuratorFrameworkImpl client, Filters filters, 
WatchMode watchMode) {
+    AsyncGetDataBuilderImpl(CuratorFrameworkBase client, Filters filters, 
WatchMode watchMode) {
         this.client = client;
         this.filters = filters;
         this.watchMode = watchMode;
diff --git 
a/curator-x-async/src/main/java/org/apache/curator/x/async/details/AsyncReconfigBuilderImpl.java
 
b/curator-x-async/src/main/java/org/apache/curator/x/async/details/AsyncReconfigBuilderImpl.java
index b490113bf..d4822b0d2 100644
--- 
a/curator-x-async/src/main/java/org/apache/curator/x/async/details/AsyncReconfigBuilderImpl.java
+++ 
b/curator-x-async/src/main/java/org/apache/curator/x/async/details/AsyncReconfigBuilderImpl.java
@@ -22,7 +22,7 @@ package org.apache.curator.x.async.details;
 import static org.apache.curator.x.async.details.BackgroundProcs.ignoredProc;
 import static org.apache.curator.x.async.details.BackgroundProcs.safeCall;
 import java.util.List;
-import org.apache.curator.framework.imps.CuratorFrameworkImpl;
+import org.apache.curator.framework.imps.CuratorFrameworkBase;
 import org.apache.curator.framework.imps.ReconfigBuilderImpl;
 import org.apache.curator.x.async.AsyncStage;
 import org.apache.curator.x.async.api.AsyncEnsemblable;
@@ -30,7 +30,7 @@ import org.apache.curator.x.async.api.AsyncReconfigBuilder;
 import org.apache.zookeeper.data.Stat;
 
 class AsyncReconfigBuilderImpl implements AsyncReconfigBuilder, 
AsyncEnsemblable<AsyncStage<Void>> {
-    private final CuratorFrameworkImpl client;
+    private final CuratorFrameworkBase client;
     private final Filters filters;
     private Stat stat = null;
     private long fromConfig = -1;
@@ -38,7 +38,7 @@ class AsyncReconfigBuilderImpl implements 
AsyncReconfigBuilder, AsyncEnsemblable
     private List<String> joining = null;
     private List<String> leaving = null;
 
-    AsyncReconfigBuilderImpl(CuratorFrameworkImpl client, Filters filters) {
+    AsyncReconfigBuilderImpl(CuratorFrameworkBase client, Filters filters) {
         this.client = client;
         this.filters = filters;
     }
diff --git 
a/curator-x-async/src/main/java/org/apache/curator/x/async/details/AsyncRemoveWatchesBuilderImpl.java
 
b/curator-x-async/src/main/java/org/apache/curator/x/async/details/AsyncRemoveWatchesBuilderImpl.java
index 5f111b737..0f70a44ef 100644
--- 
a/curator-x-async/src/main/java/org/apache/curator/x/async/details/AsyncRemoveWatchesBuilderImpl.java
+++ 
b/curator-x-async/src/main/java/org/apache/curator/x/async/details/AsyncRemoveWatchesBuilderImpl.java
@@ -25,7 +25,7 @@ import java.util.Collections;
 import java.util.Objects;
 import java.util.Set;
 import org.apache.curator.framework.api.CuratorWatcher;
-import org.apache.curator.framework.imps.CuratorFrameworkImpl;
+import org.apache.curator.framework.imps.CuratorFrameworkBase;
 import org.apache.curator.framework.imps.RemoveWatchesBuilderImpl;
 import org.apache.curator.x.async.AsyncStage;
 import org.apache.curator.x.async.api.AsyncPathable;
@@ -34,14 +34,14 @@ import org.apache.curator.x.async.api.RemoveWatcherOption;
 import org.apache.zookeeper.Watcher;
 
 class AsyncRemoveWatchesBuilderImpl implements AsyncRemoveWatchesBuilder, 
AsyncPathable<AsyncStage<Void>> {
-    private final CuratorFrameworkImpl client;
+    private final CuratorFrameworkBase client;
     private final Filters filters;
     private Watcher.WatcherType watcherType = Watcher.WatcherType.Any;
     private Set<RemoveWatcherOption> options = Collections.emptySet();
     private Watcher watcher = null;
     private CuratorWatcher curatorWatcher = null;
 
-    AsyncRemoveWatchesBuilderImpl(CuratorFrameworkImpl client, Filters 
filters) {
+    AsyncRemoveWatchesBuilderImpl(CuratorFrameworkBase client, Filters 
filters) {
         this.client = client;
         this.filters = filters;
     }
diff --git 
a/curator-x-async/src/main/java/org/apache/curator/x/async/details/AsyncSetACLBuilderImpl.java
 
b/curator-x-async/src/main/java/org/apache/curator/x/async/details/AsyncSetACLBuilderImpl.java
index 5160be6ef..6ed9e2681 100644
--- 
a/curator-x-async/src/main/java/org/apache/curator/x/async/details/AsyncSetACLBuilderImpl.java
+++ 
b/curator-x-async/src/main/java/org/apache/curator/x/async/details/AsyncSetACLBuilderImpl.java
@@ -22,7 +22,7 @@ package org.apache.curator.x.async.details;
 import static org.apache.curator.x.async.details.BackgroundProcs.safeCall;
 import static org.apache.curator.x.async.details.BackgroundProcs.statProc;
 import java.util.List;
-import org.apache.curator.framework.imps.CuratorFrameworkImpl;
+import org.apache.curator.framework.imps.CuratorFrameworkBase;
 import org.apache.curator.framework.imps.SetACLBuilderImpl;
 import org.apache.curator.x.async.AsyncStage;
 import org.apache.curator.x.async.api.AsyncPathable;
@@ -31,12 +31,12 @@ import org.apache.zookeeper.data.ACL;
 import org.apache.zookeeper.data.Stat;
 
 class AsyncSetACLBuilderImpl implements AsyncSetACLBuilder, 
AsyncPathable<AsyncStage<Stat>> {
-    private final CuratorFrameworkImpl client;
+    private final CuratorFrameworkBase client;
     private final Filters filters;
     private int version = -1;
     private List<ACL> aclList = null;
 
-    AsyncSetACLBuilderImpl(CuratorFrameworkImpl client, Filters filters) {
+    AsyncSetACLBuilderImpl(CuratorFrameworkBase client, Filters filters) {
         this.client = client;
         this.filters = filters;
     }
diff --git 
a/curator-x-async/src/main/java/org/apache/curator/x/async/details/AsyncSetDataBuilderImpl.java
 
b/curator-x-async/src/main/java/org/apache/curator/x/async/details/AsyncSetDataBuilderImpl.java
index 0de17249d..c13c46fd4 100644
--- 
a/curator-x-async/src/main/java/org/apache/curator/x/async/details/AsyncSetDataBuilderImpl.java
+++ 
b/curator-x-async/src/main/java/org/apache/curator/x/async/details/AsyncSetDataBuilderImpl.java
@@ -21,7 +21,7 @@ package org.apache.curator.x.async.details;
 
 import static org.apache.curator.x.async.details.BackgroundProcs.safeCall;
 import static org.apache.curator.x.async.details.BackgroundProcs.statProc;
-import org.apache.curator.framework.imps.CuratorFrameworkImpl;
+import org.apache.curator.framework.imps.CuratorFrameworkBase;
 import org.apache.curator.framework.imps.SetDataBuilderImpl;
 import org.apache.curator.x.async.AsyncStage;
 import org.apache.curator.x.async.api.AsyncPathAndBytesable;
@@ -29,12 +29,12 @@ import org.apache.curator.x.async.api.AsyncSetDataBuilder;
 import org.apache.zookeeper.data.Stat;
 
 class AsyncSetDataBuilderImpl implements AsyncSetDataBuilder {
-    private final CuratorFrameworkImpl client;
+    private final CuratorFrameworkBase client;
     private final Filters filters;
     private boolean compressed;
     private int version = -1;
 
-    AsyncSetDataBuilderImpl(CuratorFrameworkImpl client, Filters filters) {
+    AsyncSetDataBuilderImpl(CuratorFrameworkBase client, Filters filters) {
         this.client = client;
         this.filters = filters;
         this.compressed = client.compressionEnabled();
diff --git 
a/curator-x-async/src/main/java/org/apache/curator/x/async/details/AsyncTransactionOpImpl.java
 
b/curator-x-async/src/main/java/org/apache/curator/x/async/details/AsyncTransactionOpImpl.java
index 1ef3d23d4..f4660c882 100644
--- 
a/curator-x-async/src/main/java/org/apache/curator/x/async/details/AsyncTransactionOpImpl.java
+++ 
b/curator-x-async/src/main/java/org/apache/curator/x/async/details/AsyncTransactionOpImpl.java
@@ -27,7 +27,7 @@ import 
org.apache.curator.framework.api.VersionPathAndBytesable;
 import org.apache.curator.framework.api.transaction.CuratorOp;
 import org.apache.curator.framework.api.transaction.TransactionCreateBuilder2;
 import org.apache.curator.framework.api.transaction.TransactionSetDataBuilder;
-import org.apache.curator.framework.imps.CuratorFrameworkImpl;
+import org.apache.curator.framework.imps.CuratorFrameworkBase;
 import org.apache.curator.x.async.api.AsyncPathAndBytesable;
 import org.apache.curator.x.async.api.AsyncPathable;
 import org.apache.curator.x.async.api.AsyncTransactionCheckBuilder;
@@ -39,9 +39,9 @@ import org.apache.zookeeper.CreateMode;
 import org.apache.zookeeper.data.ACL;
 
 class AsyncTransactionOpImpl implements AsyncTransactionOp {
-    private final CuratorFrameworkImpl client;
+    private final CuratorFrameworkBase client;
 
-    AsyncTransactionOpImpl(CuratorFrameworkImpl client) {
+    AsyncTransactionOpImpl(CuratorFrameworkBase client) {
         this.client = client;
     }
 
diff --git 
a/curator-x-async/src/main/java/org/apache/curator/x/async/details/AsyncWatchBuilderImpl.java
 
b/curator-x-async/src/main/java/org/apache/curator/x/async/details/AsyncWatchBuilderImpl.java
index cc7cc015d..a31aa08a8 100644
--- 
a/curator-x-async/src/main/java/org/apache/curator/x/async/details/AsyncWatchBuilderImpl.java
+++ 
b/curator-x-async/src/main/java/org/apache/curator/x/async/details/AsyncWatchBuilderImpl.java
@@ -24,7 +24,7 @@ import static 
org.apache.curator.x.async.details.BackgroundProcs.safeCall;
 import org.apache.curator.framework.api.CuratorWatcher;
 import org.apache.curator.framework.api.WatchableBase;
 import org.apache.curator.framework.imps.AddWatchBuilderImpl;
-import org.apache.curator.framework.imps.CuratorFrameworkImpl;
+import org.apache.curator.framework.imps.CuratorFrameworkBase;
 import org.apache.curator.framework.imps.Watching;
 import org.apache.curator.x.async.AsyncStage;
 import org.apache.curator.x.async.api.AsyncPathable;
@@ -38,12 +38,12 @@ class AsyncWatchBuilderImpl
                 AsyncWatchBuilder2,
                 WatchableBase<AsyncPathable<AsyncStage<Void>>>,
                 AsyncPathable<AsyncStage<Void>> {
-    private final CuratorFrameworkImpl client;
+    private final CuratorFrameworkBase client;
     private final Filters filters;
     private Watching watching;
     private AddWatchMode mode = AddWatchMode.PERSISTENT_RECURSIVE;
 
-    AsyncWatchBuilderImpl(CuratorFrameworkImpl client, Filters filters) {
+    AsyncWatchBuilderImpl(CuratorFrameworkBase client, Filters filters) {
         this.client = client;
         this.filters = filters;
         watching = new Watching(client, true);

Reply via email to