private synchronized void populateChildren(String path) {
        ChildrenCallback cb = new ChildrenCallback() {

            @Override
            public void processResult(int rc, String path, Object ctx,
                    List<String> childrenNames) {
                ZVNodeImpl parent = nodes.get(path);
                Stat stat = new Stat();
                try {
                    parent.setStat(zk.exists(path, false));
                } catch (Exception ignore) {
                    ignore.printStackTrace();
                }
                for (String childName : childrenNames) {
                    try {
                        String childPath = getFullPath(path, childName);
                        ZVNodeImpl child = nodes.get(childPath);
                        if (child != null) {
                            if (!child.exists()) {
                                child.setData(zk.getData(childPath, watcher,
                                        stat));
                                child.setStat(stat);
                                child.setExists(true);
                                children.put(child, new ArrayList<ZVNodeImpl>());
                                children.get(parent).add(child);
                                fireNodeCreated(child);
                                populateChildren(childPath);
                            }
                        } else {
                            child = new ZVNodeImpl(childPath, zk.getData(
                                    childPath, watcher, stat));
                            child.setStat(stat);
                            nodes.put(childPath, child);
                            children.put(child, new ArrayList<ZVNodeImpl>());
                            children.get(parent).add(child);
                            fireNodeCreated(child);
                            populateChildren(childPath);
                        }
                    } catch (Exception ignore) {
                        ignore.printStackTrace();
                    }
                }
            }
        };
        zk.getChildren(path, watcher, cb, null);
    }