@Override
    public void close() throws InterruptedException {
        System.out.println("Closing ZooKeeper client...");
        zk.close();
        synchronized (watcher.lock) {
            watcher.dead = true;
            watcher.lock.notifyAll();
        }
        System.out.println("Shutting down watcher...");
        watcherExecutor.shutdown();
        System.out.println("Removing listeners...");
        ZVModelListener[] listeners = listenerList
                .getListeners(ZVModelListener.class);
        for (int i = 0; i < listeners.length; i++) {
            listenerList.remove(ZVModelListener.class, listeners[i]);
        }

        System.out.println("Resetting models...");
        nodes.clear();
        children.clear();
        System.out.println("Close done.");
    }