 		 */
 		private function getColumnMetadata(id:Object):Object
 		{
-			var meta:Object = metadata.getSessionState();
-			if (id is String && meta is Array)
-				return meta[columnIds.indexOf(id)];
-			else if (meta)
-				return meta[id];
+			try
+			{
+				if (id is Number)
+					id = columnIds[id];
+				var meta:Object = metadata.getSessionState();
+				if (meta is Array)
+				{
+					var array:Array = meta as Array;
+					for (var i:int = 0; i < array.length; i++)
+					{
+						var item:Object = array[i];
+						var itemId:* = item[METADATA_COLUMN_NAME] || item[METADATA_COLUMN_INDEX];
+						if (itemId === undefined)
+							itemId = columnIds[i];
+						if (itemId === id)
+							return item;
+					}
+					return null;
+				}
+				else if (meta)
+					return meta[id];
+			}
+			catch (e:Error)
+			{
+				reportError(e);
+			}
 			return null;
 		}
 		

	import weave.api.newLinkableChild;
	import weave.api.registerLinkableChild;
	import weave.api.reportError;
	import weave.core.CallbackCollection;
	import weave.core.LinkableFile;
	import weave.core.LinkableString;

		 */
		override public function getHierarchyRoot():IWeaveTreeNode
		{
			if (!_rootNode)
				_rootNode = new ColumnTreeNode({
					dataSource: this,
					label: WeaveAPI.globalHashMap.getName(this),
					children: function(root:ColumnTreeNode):Array {
						var items:Array = metadata.getSessionState() as Array;
						if (!items)
							items = getColumnIds();
						var children:Array = [];
						for (var i:int = 0; i < items.length; i++)
						{
							var item:Object = items[i];
							children[i] = generateHierarchyNode(item) || generateHierarchyNode(i);
						}
						return children;
					}
				});
			return _rootNode;
		}
		
		override protected function generateHierarchyNode(metadata:Object):IWeaveTreeNode
		{
			if (typeof metadata != 'object')
				metadata = generateMetadataForColumnId(metadata);
			
			if (!metadata)
				return null;
			
			if (metadata.hasOwnProperty(METADATA_COLUMN_INDEX) || metadata.hasOwnProperty(METADATA_COLUMN_NAME))
			{
				return new ColumnTreeNode({
					dataSource: this,
					label: getColumnNodeLabel,
					idFields: [METADATA_COLUMN_INDEX, METADATA_COLUMN_NAME],
					data: metadata
				});
			}
			
			return null;
		}
		private function getColumnNodeLabel(node:ColumnTreeNode):String
		{
			var title:String = node.data[ColumnMetadata.TITLE] || node.data[METADATA_COLUMN_NAME];
			if (!title && node.data['name'])
			{
				title = node.data['name'];
				if (node.data['year'])
					title = StandardLib.substitute("{0} ({1})", title, node.data['year']);
			}
			return title;
		}
		
		[Deprecated] public function set attributeHierarchy(state:Object):void
