             if (tableNode)
             {
                 tableNode.token = token;
-                tableNodesToLoad.push(tableNode);
-            }
-        }
-
-        if (layerNodesToLoad.length > 0)
-        {
-            allLayersProcessed = false;
-            fetchLayerNodeInfo();
-        }
-        if (tableNodesToLoad.length > 0)
-        {
-            allTablesProcessed = false;
-            fetchTableNodeInfo();
-        }
-
-        if (layerNodesToLoad.length == 0 && tableNodesToLoad.length == 0)
+                nodesToLoad.push(tableNode);
+            }
+        }
+
+        if (nodesToLoad.length > 0)
+        {
+            allNodesProcessed = false;
+            fetchQueryableNodeInfo();
+        }
+
+        if (nodesToLoad.length == 0)
         {
             dispatchNodeFetchComplete();
         }
     }
 
-    private function fetchLayerNodeInfo():void
-    {
-        totalLayerNodesToLoad = layerNodesToLoad.length;
+    private function fetchQueryableNodeInfo():void
+    {
+        totalNodesToLoad = nodesToLoad.length;
         var urlVars:URLVariables;
         var layerInfoRequest:JSONTask;
-        for each (var layerNode:LayerNode in layerNodesToLoad)
+        for each (var queryableNode:QueryableNode in nodesToLoad)
         {
             urlVars = new URLVariables();
             urlVars.f = "json";
-            layerInfoRequest = new JSONTask(layerNode.internalURL);
+            layerInfoRequest = new JSONTask(queryableNode.internalURL);
             layerInfoRequest.requestTimeout = getValidRequestTimeout();
             layerInfoRequest.token = token;
             layerInfoRequest.execute(urlVars,
-                                     new AsyncResponder(layerInfoRequest_resultHandler,
-                                                        layerNodeInfoRequest_faultHandler,
-                                                        layerNode));
-        }
-    }
-
-    private function fetchTableNodeInfo():void
-    {
-        totalTableNodesToLoad = tableNodesToLoad.length;
-        var urlVars:URLVariables;
-        var tableInfoRequest:JSONTask;
-        for each (var tableNode:TableNode in tableNodesToLoad)
-        {
-            urlVars = new URLVariables();
-            urlVars.f = "json";
-            tableInfoRequest = new JSONTask(tableNode.internalURL);
-            tableInfoRequest.requestTimeout = getValidRequestTimeout();
-            tableInfoRequest.token = token;
-            tableInfoRequest.execute(urlVars,
-                                     new AsyncResponder(tableInfoRequest_resultHandler,
-                                                        tableNodeInfoRequest_faultHandler,
-                                                        tableNode));
-        }
-    }
-
-    private function layerNodeInfoRequest_faultHandler(fault:Fault, token:Object = null):void
-    {
-        layerProcessed();
-    }
-
-    private function tableNodeInfoRequest_faultHandler(fault:Fault, token:Object = null):void
-    {
-        tableProcessed();
-    }
-
-    private function layerProcessed():void
-    {
-        totalLayerNodesToLoad--;
-        if (totalLayerNodesToLoad == 0)
-        {
-            addProcessedLayerNodesAndDispatchFetchComplete();
-        }
-    }
-
-    private function tableProcessed():void
-    {
-        totalTableNodesToLoad--;
-        if (totalTableNodesToLoad == 0)
-        {
-            addProcessedTableNodesAndDispatchFetchComplete();
-        }
-    }
-
-    private function addProcessedLayerNodesAndDispatchFetchComplete():void
-    {
-        for each (var layerNode:LayerNode in layerNodesToLoad)
-        {
-            if (nodeFilter.isApplicable(layerNode))
-            {
-                nodes.push(layerNode);
-            }
-        }
-        allLayersProcessed = true;
-        if (allLayersProcessed && allTablesProcessed)
-        {
-            dispatchNodeFetchComplete();
-        }
-    }
-
-    private function addProcessedTableNodesAndDispatchFetchComplete():void
-    {
-        for each (var tableNode:TableNode in tableNodesToLoad)
-        {
-            if (nodeFilter.isApplicable(tableNode))
-            {
-                nodes.push(tableNode);
-            }
-        }
-        allTablesProcessed = true;
-        if (allLayersProcessed && allTablesProcessed)
+                                     new AsyncResponder(queryableNodeInfoRequest_resultHandler,
+                                                        queryableNodeInfoRequest_faultHandler,
+                                                        queryableNode));
+        }
+    }
+
+    private function queryableNodeInfoRequest_faultHandler(fault:Fault, token:Object = null):void
+    {
+        nodeProcessed();
+    }
+
+    private function nodeProcessed():void
+    {
+        totalNodesToLoad--;
+        if (totalNodesToLoad == 0)
+        {
+            addProcessedNodesAndDispatchFetchComplete();
+        }
+    }
+
+    private function addProcessedNodesAndDispatchFetchComplete():void
+    {
+        for each (var queryableNode:QueryableNode in nodesToLoad)
+        {
+            if (nodeFilter.isApplicable(queryableNode))
+            {
+                nodes.push(queryableNode);
+            }
+        }
+        allNodesProcessed = true;
+        if (allNodesProcessed)
         {
             dispatchNodeFetchComplete();
         }

                                               nodes));
    }

    private function layerInfoRequest_resultHandler(metadata:Object, layerNode:LayerNode):void
    {
        layerNode.metadata = metadata;
        layerProcessed();
    }

    private function tableInfoRequest_resultHandler(metadata:Object, tableNode:TableNode):void
    {
        tableNode.metadata = metadata;
        tableProcessed();
    }

    private function nodeInfoRequest_faultHandler(fault:Fault, token:Object = null):void


    private var nodes:Array;
    private var nodeFilter:INodeFilter;
    private var totalNodesToLoad:int;
    private var nodesToLoad:Array;

    private var allNodesProcessed:Boolean = true;

    public function fetch(url:String, nodeFilter:INodeFilter, parent:ServiceDirectoryNode):void
    {
