 
         override protected function generateHierarchyNode(metadata:Object):IWeaveTreeNode
         {
-            var graphNode:GraphMLGraphNode;
-            var groupNode:GraphMLGroupNode;
-            var columnNode:GraphMLColumnNode;
-
-            graphNode = new GraphMLGraphNode(this);
-            
-            if (metadata[GRAPH_GROUP_META] === undefined)
-                return graphNode;
-
-            groupNode = new GraphMLGroupNode(graphNode, metadata[GRAPH_GROUP_META]);
-
-            if (metadata[GRAPH_ID_META] === undefined)
-                return groupNode;
-
-            columnNode = new GraphMLColumnNode(groupNode, metadata[GRAPH_ID_META]);
-            
-            return columnNode;
+            return new ColumnTreeNode({
+                source: this,
+                idFields: [GRAPH_GROUP_META, GRAPH_ID_META],
+                columnMetadata: metadata
+            });
         }
 
         private function handleURLChange():void

    import weave.data.AttributeColumns.ProxyColumn;
    import weave.data.AttributeColumns.StringColumn;
    import weave.data.QKeyManager;
    import weave.utils.VectorUtils;

    public class GraphMLDataSource extends AbstractDataSource


        override public function getHierarchyRoot():IWeaveTreeNode
        {
            if (!_rootNode)
            {
                var source:GraphMLDataSource = this;

                _rootNode = new ColumnTreeNode({
                    source: source,
                    data: source,
                    label: WeaveAPI.globalHashMap.getName(this),
                    isBranch: true,
                    hasChildBranches: true,
                    children: function():Array {
                        return [GraphMLConverter.NODE, GraphMLConverter.EDGE].map(
                            function(group:String, ..._):Object {
                                return {
                                    source: source,
                                    data: group,
                                    label: group == GraphMLConverter.NODE ? "Nodes" : "Edges",
                                    isBranch: true,
                                    hasChildBranches: false,
                                    children: function ():Array {
                                        var groupProperties:Array = group == GraphMLConverter.NODE ? nodeProperties : edgeProperties;
                                        weaveTrace(groupProperties);
                                        return groupProperties.map(
                                            function(field:String, ..._):* {
                                                var metadata:Object = {};
                                                metadata[ColumnMetadata.TITLE] = field;
                                                metadata[GRAPH_ID_META] = field;
                                                metadata[GRAPH_GROUP_META] = group;
                                                return generateHierarchyNode(metadata);
                                            }
                                        );
                                    }
                                }
                            }
                        );
                    }
                });
            }

            return _rootNode;
