diff --git a/frameworks/projects/Basic/src/main/resources/basic-manifest.xml b/frameworks/projects/Basic/src/main/resources/basic-manifest.xml
index 0a57697..3ce4773 100644
--- a/frameworks/projects/Basic/src/main/resources/basic-manifest.xml
+++ b/frameworks/projects/Basic/src/main/resources/basic-manifest.xml
@@ -157,6 +157,7 @@
     <component id="DynamicRemoveItemRendererForArrayListData" class="org.apache.royale.html.beads.DynamicRemoveItemRendererForArrayListData" />
     <component id="DynamicUpdateItemRendererForArrayListData" class="org.apache.royale.html.beads.DynamicUpdateItemRendererForArrayListData"/>
     <component id="DataItemRendererFactoryForHierarchicalData" class="org.apache.royale.html.beads.DataItemRendererFactoryForHierarchicalData" />
+    <component id="DataItemRendererFactoryForCollectionView" class="org.apache.royale.html.beads.DataItemRendererFactoryForCollectionView" />
     <component id="DynamicRemoveAllItemRendererForArrayListData" class="org.apache.royale.html.beads.DynamicRemoveAllItemRendererForArrayListData" />
     <component id="DynamicRemoveAllByNullItemRendererForArrayListData" class="org.apache.royale.html.beads.DynamicRemoveAllByNullItemRendererForArrayListData" />
     <component id="TextItemRendererFactoryForArrayData" class="org.apache.royale.html.beads.TextItemRendererFactoryForArrayData" />
diff --git a/frameworks/projects/Basic/src/main/resources/defaults.css b/frameworks/projects/Basic/src/main/resources/defaults.css
index b83dc37..bf15027 100644
--- a/frameworks/projects/Basic/src/main/resources/defaults.css
+++ b/frameworks/projects/Basic/src/main/resources/defaults.css
@@ -194,7 +194,7 @@
 	IBeadView:  ClassReference("org.apache.royale.html.beads.ListView");			
 	IBeadController: ClassReference("org.apache.royale.html.beads.controllers.ListSingleSelectionMouseController");
 	IBeadLayout: ClassReference("org.apache.royale.html.beads.layouts.VerticalLayout");
-	IDataProviderItemRendererMapper: ClassReference("org.apache.royale.html.beads.DataItemRendererFactoryForArrayList");
+	IDataProviderItemRendererMapper: ClassReference("org.apache.royale.html.beads.DataItemRendererFactoryForCollectionView");
 	IItemRendererClassFactory: ClassReference("org.apache.royale.core.ItemRendererClassFactory");
 	IItemRenderer: ClassReference("org.apache.royale.html.supportClasses.StringItemRenderer");
 	IViewport: ClassReference("org.apache.royale.html.supportClasses.Viewport");
@@ -403,7 +403,7 @@
 
 Tree
 {
-	IBeadModel: ClassReference("org.apache.royale.html.beads.models.ArrayListSelectionModel");
+	IBeadModel: ClassReference("org.apache.royale.html.beads.models.TreeModel");
 	IBeadView:  ClassReference("org.apache.royale.html.beads.ListView");			
 	IBeadController: ClassReference("org.apache.royale.html.beads.controllers.TreeSingleSelectionMouseController");
 	IBeadLayout: ClassReference("org.apache.royale.html.beads.layouts.VerticalLayout");
@@ -419,9 +419,11 @@
 TreeGrid
 {
 	IBeadModel: ClassReference("org.apache.royale.html.beads.models.TreeGridModel");
+}
+/*
 	IBeadView: ClassReference("org.apache.royale.html.beads.TreeGridView");
 	IBeadLayout: ClassReference("org.apache.royale.html.beads.layouts.TreeGridLayout");
-}
+	*/
 
 .TreeGridContentArea .List {
 	display: inline-block;
diff --git a/frameworks/projects/Basic/src/main/royale/BasicClasses.as b/frameworks/projects/Basic/src/main/royale/BasicClasses.as
index 6ba89fc..5777a46 100644
--- a/frameworks/projects/Basic/src/main/royale/BasicClasses.as
+++ b/frameworks/projects/Basic/src/main/royale/BasicClasses.as
@@ -104,6 +104,8 @@
 	import org.apache.royale.html.beads.models.AlertModel; AlertModel;
 	import org.apache.royale.html.beads.models.ArraySelectionModel; ArraySelectionModel;
 	import org.apache.royale.html.beads.models.ArrayListSelectionModel; ArrayListSelectionModel;
+	import org.apache.royale.html.beads.models.SingleSelectionCollectionViewModel; SingleSelectionCollectionViewModel;
+	import org.apache.royale.html.beads.models.TreeModel; TreeModel;
     import org.apache.royale.html.beads.models.RangeModel; RangeModel;
     import org.apache.royale.html.beads.models.RangeModelExtended; RangeModelExtended;
 	import org.apache.royale.html.beads.models.ComboBoxModel; ComboBoxModel;
@@ -168,6 +170,7 @@
     import org.apache.royale.html.beads.DynamicItemsRendererFactoryForArrayListData; DynamicItemsRendererFactoryForArrayListData;
 	import org.apache.royale.html.beads.DataItemRendererFactoryForArrayList; DataItemRendererFactoryForArrayList;
 	import org.apache.royale.html.beads.DataItemRendererFactoryForHierarchicalData; DataItemRendererFactoryForHierarchicalData;
+	import org.apache.royale.html.beads.DataItemRendererFactoryForCollectionView; DataItemRendererFactoryForCollectionView;
 	import org.apache.royale.html.supportClasses.DataGroup; DataGroup;
 	import org.apache.royale.html.supportClasses.Viewport; Viewport;
 	import org.apache.royale.html.supportClasses.ScrollingViewport; ScrollingViewport;
diff --git a/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/Tree.as b/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/Tree.as
index 6fe6954..43b1c29 100644
--- a/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/Tree.as
+++ b/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/Tree.as
@@ -18,8 +18,10 @@
 ////////////////////////////////////////////////////////////////////////////////
 package org.apache.royale.html
 {
-	import org.apache.royale.collections.FlattenedList;
+//	import org.apache.royale.collections.FlattenedList;
 	import org.apache.royale.collections.HierarchicalData;
+	import org.apache.royale.collections.TreeData;
+	import org.apache.royale.html.beads.models.TreeModel;
 
 	/**
 	 *  The Tree component displays structured data. The Tree uses a HierarchicalData
@@ -44,30 +46,21 @@
 		{
 			super();
 		}
-
-		private var _hierarchicalData:HierarchicalData;
-		private var _flatList:FlattenedList;
-
+		
 		/**
-		 * The dataProvider should be of type HierarchicalData.
-		 * 
-		 *  @langversion 3.0
-		 *  @playerversion Flash 10.2
-		 *  @playerversion AIR 2.6
-		 *  @productversion Royale 0.0
-		 *  @see org.apache.royale.collections.HierarchicalData.
+		 * The dataProvider for a Tree is TreeData which is created
+		 * from HierarchicalData. You can set the dataProvider with
+		 * TreeData or HierarchicalData and it will create a TreeData
+		 * from that.
 		 */
-		override public function get dataProvider():Object
-		{
-			return _hierarchicalData;
-		}
 		override public function set dataProvider(value:Object):void
 		{
-			_hierarchicalData = value as HierarchicalData;
-
-			_flatList = new FlattenedList(_hierarchicalData);
-
-			super.dataProvider = _flatList;
+			if (value is HierarchicalData) {
+				var treeData:TreeData = new TreeData(value as HierarchicalData);
+				super.dataProvider = treeData;
+			} else {
+				super.dataProvider = value;
+			}
 		}
 	}
 }
diff --git a/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/TreeGrid.as b/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/TreeGrid.as
index eb02629..57cd35d 100644
--- a/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/TreeGrid.as
+++ b/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/TreeGrid.as
@@ -18,8 +18,11 @@
 ////////////////////////////////////////////////////////////////////////////////
 package org.apache.royale.html
 {
+	import org.apache.royale.collections.HierarchicalData;
+	import org.apache.royale.collections.TreeData;
 	import org.apache.royale.core.UIBase;
 	import org.apache.royale.html.beads.models.TreeGridModel;
+	import org.apache.royale.html.beads.models.TreeModel;
 	
 	/**
 	 * A TreeGrid is a combination of a Tree and a DataGrid. The first column of the
@@ -33,7 +36,7 @@
 	 *  @playerversion AIR 2.6
 	 *  @productversion Royale 0.9
 	 */
-	public class TreeGrid extends UIBase
+	public class TreeGrid extends DataGrid
 	{
 		/**
 		 * Constructor.
@@ -48,22 +51,21 @@
 			super();
 		}
 		
+		
 		/**
-		 * The dataProvider should be of type HierarchicalData.
-		 * 
-		 *  @langversion 3.0
-		 *  @playerversion Flash 10.2
-		 *  @playerversion AIR 2.6
-		 *  @productversion Royale 0.9
-		 *  @see org.apache.royale.collections.HierarchicalData.
+		 * The dataProvider for a TreeGrid is TreeData which is created
+		 * from HierarchicalData. You can set the dataProvider with
+		 * TreeData or HierarchicalData and it will create a TreeData
+		 * from that.
 		 */
-		public function get dataProvider():Object
+		override public function set dataProvider(value:Object):void
 		{
-			return (model as TreeGridModel).dataProvider;
-		}
-		public function set dataProvider(value:Object):void
-		{
-			(model as TreeGridModel).dataProvider = value;
+			if (value is HierarchicalData) {
+				var treeData:TreeData = new TreeData(value as HierarchicalData);
+				super.dataProvider = treeData;
+			} else {
+				super.dataProvider = value;
+			}
 		}
 		
 		/**
@@ -74,13 +76,13 @@
 		 *  @playerversion AIR 2.6
 		 *  @productversion Royale 0.9
 		 */
-		public function get columns():Array
-		{
-			return (model as TreeGridModel).columns;
-		}
-		public function set columns(value:Array):void
-		{
-			(model as TreeGridModel).columns = value;
-		}
+//		public function get columns():Array
+//		{
+//			return (model as TreeGridModel).columns;
+//		}
+//		public function set columns(value:Array):void
+//		{
+//			(model as TreeGridModel).columns = value;
+//		}
 	}
 }
\ No newline at end of file
diff --git a/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/DataGridView.as b/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/DataGridView.as
index 587d9a5..f3f2b82 100644
--- a/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/DataGridView.as
+++ b/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/DataGridView.as
@@ -18,19 +18,22 @@
 ////////////////////////////////////////////////////////////////////////////////
 package org.apache.royale.html.beads
 {
+	import org.apache.royale.core.ClassFactory;
 	import org.apache.royale.core.IBeadModel;
 	import org.apache.royale.core.IBeadView;
 	import org.apache.royale.core.IDataGridModel;
 	import org.apache.royale.core.IDataGridPresentationModel;
+	import org.apache.royale.core.IFactory;
 	import org.apache.royale.core.ISelectionModel;
 	import org.apache.royale.core.IStrand;
 	import org.apache.royale.core.IUIBase;
 	import org.apache.royale.core.ValuesManager;
 	import org.apache.royale.events.Event;
 	import org.apache.royale.events.IEventDispatcher;
+	import org.apache.royale.html.Container;
 	import org.apache.royale.html.DataGrid;
 	import org.apache.royale.html.DataGridButtonBar;
-	import org.apache.royale.html.Container;
+	import org.apache.royale.html.List;
 	import org.apache.royale.html.beads.IDataGridView;
 	import org.apache.royale.html.beads.layouts.ButtonBarLayout;
 	import org.apache.royale.html.beads.models.ButtonBarModel;
@@ -271,7 +274,8 @@
 				for (var i:int=0; i < sharedModel.columns.length; i++) {
 					var dataGridColumn:DataGridColumn = sharedModel.columns[i] as DataGridColumn;
 
-					var list:DataGridColumnList = new DataGridColumnList();
+					//var list:DataGridColumnList = new DataGridColumnList();
+					var list:List = dataGridColumn.createList() as List;
 					list.id = "dataGridColumn"+String(i);
 					list.dataProvider = sharedModel.dataProvider;
 					list.itemRenderer = dataGridColumn.itemRenderer;
@@ -280,11 +284,11 @@
 					list.addBead(presentationModel);
 
 					if (i == 0) {
-						list.className = "first";
+						list.typeNames = "first";
 					} else if (i == sharedModel.columns.length-1) {
-						list.className = "last";
+						list.typeNames = "last";
 					} else {
-						list.className = "middle";
+						list.typeNames = "middle";
 					}
 
 					_listArea.addElement(list);
diff --git a/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/DataItemRendererFactoryForCollectionView.as b/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/DataItemRendererFactoryForCollectionView.as
new file mode 100644
index 0000000..9410e02
--- /dev/null
+++ b/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/DataItemRendererFactoryForCollectionView.as
@@ -0,0 +1,300 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  Licensed to the Apache Software Foundation (ASF) under one or more
+//  contributor license agreements.  See the NOTICE file distributed with
+//  this work for additional information regarding copyright ownership.
+//  The ASF licenses this file to You under the Apache License, Version 2.0
+//  (the "License"); you may not use this file except in compliance with
+//  the License.  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//  See the License for the specific language governing permissions and
+//  limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+package org.apache.royale.html.beads
+{
+	import org.apache.royale.collections.ICollectionView;
+	import org.apache.royale.core.IBead;
+	import org.apache.royale.core.IBeadModel;
+	import org.apache.royale.core.IDataProviderItemRendererMapper;
+	import org.apache.royale.core.IDataProviderModel;
+	import org.apache.royale.core.IItemRendererClassFactory;
+	import org.apache.royale.core.IItemRendererParent;
+	import org.apache.royale.core.IListPresentationModel;
+	import org.apache.royale.core.ISelectableItemRenderer;
+	import org.apache.royale.core.ISelectionModel;
+	import org.apache.royale.core.IStrand;
+	import org.apache.royale.core.SimpleCSSStyles;
+	import org.apache.royale.core.UIBase;
+	import org.apache.royale.events.CollectionEvent;
+	import org.apache.royale.events.Event;
+	import org.apache.royale.events.EventDispatcher;
+	import org.apache.royale.events.IEventDispatcher;
+	import org.apache.royale.html.supportClasses.StringItemRenderer;
+	import org.apache.royale.html.supportClasses.UIItemRendererBase;
+	import org.apache.royale.utils.loadBeadFromValuesManager;
+
+	
+	/**
+	 * This class creates itemRenderer instances from the data contained within an ICollectionView
+	 */
+	public class DataItemRendererFactoryForCollectionView extends EventDispatcher implements IBead, IDataProviderItemRendererMapper
+	{
+		public function DataItemRendererFactoryForCollectionView(target:Object = null)
+		{
+			super(target);
+		}
+		
+		protected var _strand:IStrand;
+		
+		/**
+		 *  @copy org.apache.royale.core.IBead#strand
+		 *
+		 *  @langversion 3.0
+		 *  @playerversion Flash 10.2
+		 *  @playerversion AIR 2.6
+		 *  @productversion Royale 0.8
+		 */
+		public function set strand(value:IStrand):void
+		{
+			_strand = value;
+			IEventDispatcher(value).addEventListener("initComplete", initComplete);
+		}
+		
+		/**
+		 *  finish setup
+		 *
+		 *  @langversion 3.0
+		 *  @playerversion Flash 10.2
+		 *  @playerversion AIR 2.6
+		 *  @productversion Royale 0.8
+		 */
+		protected function initComplete(event:Event):void
+		{
+			IEventDispatcher(_strand).removeEventListener("initComplete", initComplete);
+			
+			var listView:IListView = _strand.getBeadByType(IListView) as IListView;
+			dataGroup = listView.dataGroup;
+			
+			var model:IEventDispatcher = _strand.getBeadByType(IBeadModel) as IEventDispatcher;
+			model.addEventListener("dataProviderChanged", dataProviderChangeHandler);
+			
+			dataProviderChangeHandler(null);
+		}
+		
+		protected var _dataProviderModel:IDataProviderModel;
+		
+		/**
+		 * The model holding the dataProvider.
+		 *
+		 *  @langversion 3.0
+		 *  @playerversion Flash 10.2
+		 *  @playerversion AIR 2.6
+		 *  @productversion Royale 0.9
+		 */
+		public function get dataProviderModel():IDataProviderModel
+		{
+			if (_dataProviderModel == null) {
+				_dataProviderModel = _strand.getBeadByType(IBeadModel) as IDataProviderModel;
+			}
+			return _dataProviderModel;
+		}
+		
+		protected var labelField:String;
+		
+		private var _itemRendererFactory:IItemRendererClassFactory;
+		
+		/**
+		 *  The org.apache.royale.core.IItemRendererClassFactory used
+		 *  to generate instances of item renderers.
+		 *
+		 *  @langversion 3.0
+		 *  @playerversion Flash 10.2
+		 *  @playerversion AIR 2.6
+		 *  @productversion Royale 0.8
+		 */
+		public function get itemRendererFactory():IItemRendererClassFactory
+		{
+			if(!_itemRendererFactory)
+				_itemRendererFactory = loadBeadFromValuesManager(IItemRendererClassFactory, "iItemRendererClassFactory", _strand) as IItemRendererClassFactory;
+			
+			return _itemRendererFactory;
+		}
+		
+		/**
+		 *  @private
+		 */
+		public function set itemRendererFactory(value:IItemRendererClassFactory):void
+		{
+			_itemRendererFactory = value;
+		}
+		
+		/**
+		 *  The org.apache.royale.core.IItemRendererParent that will
+		 *  parent the item renderers.
+		 *
+		 *  @langversion 3.0
+		 *  @playerversion Flash 10.2
+		 *  @playerversion AIR 2.6
+		 *  @productversion Royale 0.8
+		 */
+		protected var dataGroup:IItemRendererParent;
+		
+		/**
+		 * @private
+		 */
+		protected function dataProviderChangeHandler(event:Event):void
+		{
+			if (!dataProviderModel)
+				return;
+			var dp:ICollectionView = dataProviderModel.dataProvider as ICollectionView;
+			if (!dp)
+				return;
+			
+			// listen for individual items being added in the future.
+			var dped:IEventDispatcher = dp as IEventDispatcher;
+			if (!dped.hasEventListener(CollectionEvent.ITEM_ADDED)) {
+				dped.addEventListener(CollectionEvent.ITEM_ADDED, itemAddedHandler);
+				dped.addEventListener(CollectionEvent.ITEM_REMOVED, itemRemovedHandler);
+				dped.addEventListener(CollectionEvent.ITEM_UPDATED, itemUpdatedHandler);
+			}
+			
+			dataGroup.removeAllItemRenderers();
+			
+			var presentationModel:IListPresentationModel = _strand.getBeadByType(IListPresentationModel) as IListPresentationModel;
+			labelField = dataProviderModel.labelField;
+			
+			var n:int = dp.length;
+			for (var i:int = 0; i < n; i++)
+			{
+				var ir:ISelectableItemRenderer = itemRendererFactory.createItemRenderer(dataGroup) as ISelectableItemRenderer;
+				var item:Object = dp.getItemAt(i);
+				fillRenderer(i, item, ir, presentationModel);
+			}
+			
+			IEventDispatcher(_strand).dispatchEvent(new Event("itemsCreated"));
+		}
+		
+		/**
+		 * @private
+		 */
+		protected function itemAddedHandler(event:CollectionEvent):void
+		{
+			if (!dataProviderModel)
+				return;
+			var dp:ICollectionView = dataProviderModel.dataProvider as ICollectionView;
+			if (!dp)
+				return;
+			
+			var presentationModel:IListPresentationModel = _strand.getBeadByType(IListPresentationModel) as IListPresentationModel;
+			var ir:ISelectableItemRenderer = itemRendererFactory.createItemRenderer(dataGroup) as ISelectableItemRenderer;
+			labelField = dataProviderModel.labelField;
+			
+			fillRenderer(event.index, event.item, ir, presentationModel);
+			
+			// update the index values in the itemRenderers to correspond to their shifted positions.
+			var n:int = dataGroup.numElements;
+			for (var i:int = event.index; i < n; i++)
+			{
+				ir = dataGroup.getElementAt(i) as ISelectableItemRenderer;
+				ir.index = i;
+				
+				// could let the IR know its index has been changed (eg, it might change its
+				// UI based on the index). Instead (PAYG), allow another bead to detect
+				// this event and do this as not every IR will need to be updated.
+				//var ubase:UIItemRendererBase = ir as UIItemRendererBase;
+				//if (ubase) ubase.updateRenderer()
+			}
+			
+			(_strand as IEventDispatcher).dispatchEvent(new Event("itemsCreated"));
+			(_strand as IEventDispatcher).dispatchEvent(new Event("layoutNeeded"));
+		}
+		
+		/**
+		 * @private
+		 */
+		protected function itemRemovedHandler(event:CollectionEvent):void
+		{
+			if (!dataProviderModel)
+				return;
+			var dp:ICollectionView = dataProviderModel.dataProvider as ICollectionView;
+			if (!dp)
+				return;
+			
+			var ir:ISelectableItemRenderer = dataGroup.getElementAt(event.index) as ISelectableItemRenderer;
+			dataGroup.removeItemRenderer(ir);
+			
+			// adjust the itemRenderers' index to adjust for the shift
+			var n:int = dataGroup.numElements;
+			for (var i:int = event.index; i < n; i++)
+			{
+				ir = dataGroup.getElementAt(i) as ISelectableItemRenderer;
+				ir.index = i;
+				
+				// could let the IR know its index has been changed (eg, it might change its
+				// UI based on the index). Instead (PAYG), allow another bead to detect
+				// this event and do this as not every IR will need to be updated.
+				//var ubase:UIItemRendererBase = ir as UIItemRendererBase;
+				//if (ubase) ubase.updateRenderer()
+			}
+			
+			(_strand as IEventDispatcher).dispatchEvent(new Event("layoutNeeded"));
+		}
+		
+		/**
+		 * @private
+		 */
+		protected function itemUpdatedHandler(event:CollectionEvent):void
+		{
+			if (!dataProviderModel)
+				return;
+			var dp:ICollectionView = dataProviderModel.dataProvider as ICollectionView;
+			if (!dp)
+				return;
+			
+			var presentationModel:IListPresentationModel = _strand.getBeadByType(IListPresentationModel) as IListPresentationModel;
+			
+			// update the given renderer with (possibly) new information so it can change its
+			// appearence or whatever.
+			var ir:ISelectableItemRenderer = dataGroup.getElementAt(event.index) as ISelectableItemRenderer;
+			fillRenderer(event.index, event.item, ir, presentationModel);
+		}
+		
+		/**
+		 * @private
+		 */
+		protected function fillRenderer(index:int,
+										item:Object,
+										itemRenderer:ISelectableItemRenderer,
+										presentationModel:IListPresentationModel):void
+		{
+			dataGroup.addItemRendererAt(itemRenderer, index);
+			
+			itemRenderer.labelField = labelField;
+			
+			if (presentationModel) {
+				var style:SimpleCSSStyles = new SimpleCSSStyles();
+				style.marginBottom = presentationModel.separatorThickness;
+				UIBase(itemRenderer).style = style;
+				UIBase(itemRenderer).height = presentationModel.rowHeight;
+				UIBase(itemRenderer).percentWidth = 100;
+			}
+			
+			setData(itemRenderer, item, index);
+		}
+		
+		/**
+		 * @private
+		 */
+		protected function setData(itemRenderer:ISelectableItemRenderer, data:Object, index:int):void
+		{
+			itemRenderer.index = index;
+			itemRenderer.data = data;
+		}
+	}
+}
\ No newline at end of file
diff --git a/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/DataItemRendererFactoryForHierarchicalData.as b/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/DataItemRendererFactoryForHierarchicalData.as
index f55ab99..87ec5cd 100644
--- a/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/DataItemRendererFactoryForHierarchicalData.as
+++ b/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/DataItemRendererFactoryForHierarchicalData.as
@@ -19,7 +19,10 @@
 package org.apache.royale.html.beads
 {
 	import org.apache.royale.collections.FlattenedList;
+	import org.apache.royale.collections.HierarchicalData;
+	import org.apache.royale.collections.TreeData;
 	import org.apache.royale.core.IBead;
+	import org.apache.royale.core.IBeadModel;
 	import org.apache.royale.core.IDataProviderItemRendererMapper;
 	import org.apache.royale.core.IDataProviderModel;
 	import org.apache.royale.core.IItemRendererClassFactory;
@@ -52,7 +55,7 @@
      *  @playerversion AIR 2.6
      *  @productversion Royale 0.0
      */
-	public class DataItemRendererFactoryForHierarchicalData extends DynamicItemsRendererFactoryForArrayListData
+	public class DataItemRendererFactoryForHierarchicalData extends DataItemRendererFactoryForCollectionView
 	{
         /**
          *  Constructor.
@@ -94,18 +97,21 @@
 		 */
 		override protected function setData(ir:ISelectableItemRenderer, data:Object, index:int):void
 		{
+			if (!dataProviderModel)
+				return;
+			
+			var treeData:TreeData = dataProviderModel.dataProvider as TreeData;
+			var depth:int = treeData.getDepth(data);
+			var isOpen:Boolean = treeData.isOpen(data);
+			var hasChildren:Boolean = treeData.hasChildren(data);
+			
 			// Set the listData with the depth of this item
-			var flatList:FlattenedList = dataProviderModel.dataProvider as FlattenedList;
-			var depth:int = flatList.getDepth(data);
-			var isOpen:Boolean = flatList.isOpen(data);
-			var hasChildren:Boolean = flatList.hasChildren(data);
+			var treeListData:TreeListData = new TreeListData();
+			treeListData.depth = depth;
+			treeListData.isOpen = isOpen;
+			treeListData.hasChildren = hasChildren;
 			
-			var treeData:TreeListData = new TreeListData();
-			treeData.depth = depth;
-			treeData.isOpen = isOpen;
-			treeData.hasChildren = hasChildren;
-			
-			ir.listData = treeData;
+			ir.listData = treeListData;
 			
 			super.setData(ir, data, index);
 		}
diff --git a/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/controllers/TreeSingleSelectionMouseController.as b/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/controllers/TreeSingleSelectionMouseController.as
index 1d6fccb..e9bb9d0 100644
--- a/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/controllers/TreeSingleSelectionMouseController.as
+++ b/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/controllers/TreeSingleSelectionMouseController.as
@@ -18,12 +18,11 @@
 ////////////////////////////////////////////////////////////////////////////////
 package org.apache.royale.html.beads.controllers
 {
-	import org.apache.royale.collections.FlattenedList;
-	import org.apache.royale.html.Tree
-	import org.apache.royale.events.ItemClickedEvent;
+	import org.apache.royale.collections.TreeData;
 	import org.apache.royale.core.IStrand;
 	import org.apache.royale.events.Event;
-    import org.apache.royale.events.IEventDispatcher;
+	import org.apache.royale.events.IEventDispatcher;
+	import org.apache.royale.events.ItemClickedEvent;
 
 	/**
 	 *  The TreeSingleSelectionMouseController class is a controller for 
@@ -67,18 +66,18 @@
 		 */
 		override protected function selectedHandler(event:ItemClickedEvent):void
 		{
-			var tree:Tree = _strand as Tree;
-			var flatList:FlattenedList = listModel.dataProvider as FlattenedList;
-			var node:Object = event.data;
+			var treeData:TreeData = listModel.dataProvider as TreeData;
+			if (treeData == null) return;
 			
-			if (flatList.isOpen(node)) {
-				flatList.closeNode(node);
+			var node:Object = event.data;
+			listModel.selectedItem = node;
+			
+			if (treeData.isOpen(node)) {
+				treeData.closeNode(node);
 			} else {
-				flatList.openNode(node);
+				treeData.openNode(node);
 			}
 			
-            listModel.selectedItem = node;
-			listModel.dispatchEvent(new Event("dataProviderChanged"));
             IEventDispatcher(_strand).dispatchEvent(new Event("change"));
 		}
 	}
diff --git a/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/models/DataGridModel.as b/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/models/DataGridModel.as
index 419f124..65c8e16 100644
--- a/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/models/DataGridModel.as
+++ b/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/models/DataGridModel.as
@@ -31,7 +31,7 @@
 	 *  @playerversion AIR 2.6
 	 *  @productversion Royale 0.0
 	 */
-	public class DataGridModel extends ArrayListSelectionModel implements IDataGridModel
+	public class DataGridModel extends SingleSelectionCollectionViewModel implements IDataGridModel
 	{
 		/**
 		 *  constructor.
diff --git a/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/models/SingleSelectionCollectionViewModel.as b/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/models/SingleSelectionCollectionViewModel.as
new file mode 100644
index 0000000..8bddfdf
--- /dev/null
+++ b/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/models/SingleSelectionCollectionViewModel.as
@@ -0,0 +1,246 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  Licensed to the Apache Software Foundation (ASF) under one or more
+//  contributor license agreements.  See the NOTICE file distributed with
+//  this work for additional information regarding copyright ownership.
+//  The ASF licenses this file to You under the Apache License, Version 2.0
+//  (the "License"); you may not use this file except in compliance with
+//  the License.  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//  See the License for the specific language governing permissions and
+//  limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+package org.apache.royale.html.beads.models
+{
+	import org.apache.royale.collections.ICollectionView;
+	import org.apache.royale.core.IRollOverModel;
+	import org.apache.royale.core.ISelectionModel;
+	import org.apache.royale.core.IStrand;
+	import org.apache.royale.events.Event;
+	import org.apache.royale.events.EventDispatcher;
+
+    /**
+     *  The SingleSelectionCollectionViewModel class is a selection model for
+     *  a dataProvider that is an ICollectionView. It assumes that items
+     *  can be fetched from the dataProvider using dataProvider.getItemAt(index).
+     *
+     *  @langversion 3.0
+     *  @playerversion Flash 10.2
+     *  @playerversion AIR 2.6
+     *  @productversion Royale 0.0
+     */
+	public class SingleSelectionCollectionViewModel extends EventDispatcher implements ISelectionModel, IRollOverModel
+	{
+        /**
+         *  Constructor.
+         *
+         *  @langversion 3.0
+         *  @playerversion Flash 10.2
+         *  @playerversion AIR 2.6
+         *  @productversion Royale 0.0
+         */
+		public function SingleSelectionCollectionViewModel()
+		{
+		}
+
+		private var _strand:IStrand;
+
+        /**
+         *  @copy org.apache.royale.core.IBead#strand
+         *
+         *  @langversion 3.0
+         *  @playerversion Flash 10.2
+         *  @playerversion AIR 2.6
+         *  @productversion Royale 0.0
+         */
+		public function set strand(value:IStrand):void
+		{
+			_strand = value;
+		}
+
+		private var _dataProvider:ICollectionView;
+
+        /**
+         *  @copy org.apache.royale.core.ISelectionModel#dataProvider
+         *
+         *  @langversion 3.0
+         *  @playerversion Flash 10.2
+         *  @playerversion AIR 2.6
+         *  @productversion Royale 0.0
+         */
+		public function get dataProvider():Object
+		{
+			return _dataProvider;
+		}
+
+        /**
+         *  @private
+         */
+		public function set dataProvider(value:Object):void
+		{
+            if (value == _dataProvider) return;
+
+            _dataProvider = value as ICollectionView;
+			if(!_dataProvider || _selectedIndex >= _dataProvider.length)
+				_selectedIndex = -1;
+            
+			_selectedItem = _selectedIndex == -1 ? null : _dataProvider.getItemAt(_selectedIndex);
+			
+			dispatchEvent(new Event("dataProviderChanged"));
+		}
+
+		private var _selectedIndex:int = -1;
+		private var _rollOverIndex:int = -1;
+		private var _labelField:String = null;
+
+        /**
+         *  @copy org.apache.royale.core.ISelectionModel#labelField
+         *
+         *  @langversion 3.0
+         *  @playerversion Flash 10.2
+         *  @playerversion AIR 2.6
+         *  @productversion Royale 0.0
+         */
+		public function get labelField():String
+		{
+			return _labelField;
+		}
+
+        /**
+         *  @private
+         */
+		public function set labelField(value:String):void
+		{
+			if (value != _labelField) {
+				_labelField = value;
+				dispatchEvent(new Event("labelFieldChanged"));
+			}
+		}
+
+        /**
+         *  @copy org.apache.royale.core.ISelectionModel#selectedIndex
+         *
+         *  @langversion 3.0
+         *  @playerversion Flash 10.2
+         *  @playerversion AIR 2.6
+         *  @productversion Royale 0.0
+         */
+		public function get selectedIndex():int
+		{
+			return _selectedIndex;
+		}
+
+        /**
+         *  @private
+         */
+		public function set selectedIndex(value:int):void
+		{
+            if (value == _selectedIndex) return;
+
+			_selectedIndex = value;
+			_selectedItem = (value == -1 || _dataProvider == null) ? null : (value < _dataProvider.length) ? _dataProvider.getItemAt(value) : null;
+			dispatchEvent(new Event("selectedIndexChanged"));
+		}
+
+        /**
+         *  @copy org.apache.royale.core.IRollOverModel#rollOverIndex
+         *
+         *  @langversion 3.0
+         *  @playerversion Flash 10.2
+         *  @playerversion AIR 2.6
+         *  @productversion Royale 0.0
+         */
+		public function get rollOverIndex():int
+		{
+			return _rollOverIndex;
+		}
+
+        /**
+         *  @private
+         */
+		public function set rollOverIndex(value:int):void
+		{
+			if (value != _rollOverIndex) {
+				_rollOverIndex = value;
+				dispatchEvent(new Event("rollOverIndexChanged"));
+			}
+		}
+
+		private var _selectedItem:Object;
+
+        /**
+         *  @copy org.apache.royale.core.ISelectionModel#selectedItem
+         *
+         *  @langversion 3.0
+         *  @playerversion Flash 10.2
+         *  @playerversion AIR 2.6
+         *  @productversion Royale 0.0
+         */
+		public function get selectedItem():Object
+		{
+			return _selectedItem;
+		}
+
+        /**
+         *  @private
+         */
+		public function set selectedItem(value:Object):void
+		{
+            if (value == _selectedItem) return;
+
+			_selectedItem = value;
+			var n:int = _dataProvider.length;
+			for (var i:int = 0; i < n; i++)
+			{
+				if (_dataProvider.getItemAt(i) == value)
+				{
+					_selectedIndex = i;
+					break;
+				}
+			}
+			dispatchEvent(new Event("selectedItemChanged"));
+			dispatchEvent(new Event("selectedIndexChanged"));
+		}
+
+		private var _selectedString:String;
+
+        /**
+         *  An alternative to selectedItem for strongly typing the
+         *  the selectedItem if the Array is an Array of Strings.
+         *
+         *  @langversion 3.0
+         *  @playerversion Flash 10.2
+         *  @playerversion AIR 2.6
+         *  @productversion Royale 0.0
+         */
+		public function get selectedString():String
+		{
+			return String(_selectedItem);
+		}
+
+        /**
+         *  @private
+         */
+		public function set selectedString(value:String):void
+		{
+			_selectedString = value;
+			var n:int = _dataProvider.length;
+			for (var i:int = 0; i < n; i++)
+			{
+				if (String(_dataProvider.getItemAt(i)) == value)
+				{
+					_selectedIndex = i;
+					break;
+				}
+			}
+			dispatchEvent(new Event("selectedItemChanged"));
+			dispatchEvent(new Event("selectedIndexChanged"));
+		}
+	}
+}
diff --git a/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/models/TreeGridModel.as b/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/models/TreeGridModel.as
index 7171c07..7ffb63d 100644
--- a/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/models/TreeGridModel.as
+++ b/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/models/TreeGridModel.as
@@ -21,19 +21,21 @@
 	import org.apache.royale.collections.ArrayList;
 	import org.apache.royale.collections.FlattenedList;
 	import org.apache.royale.collections.HierarchicalData;
+	import org.apache.royale.core.IBeadModel;
+	import org.apache.royale.core.IDataGridModel;
+	import org.apache.royale.events.Event;
 	import org.apache.royale.utils.ObjectMap;
 
 	/**
 	 * The data model for the TreeGrid. This contains the list of TreeGridColumn
-	 * definitions, the HierarchicalData used to populate the TreeGrid, and
-	 * the FlattendList of the HD which is actually displayed.
+	 * definitions.
 	 * 
 	 *  @langversion 3.0
 	 *  @playerversion Flash 10.2
 	 *  @playerversion AIR 2.6
 	 *  @productversion Royale 0.9
 	 */
-	public class TreeGridModel extends ArrayListSelectionModel
+	public class TreeGridModel extends TreeModel implements IDataGridModel
 	{
 		/**
 		 * Constructor.
@@ -67,33 +69,35 @@
 			_columns = value;
 		}
 		
-		private var _hierarchicalData:HierarchicalData;
+		// IDataGridModel
+		
+		private var _headerModel:IBeadModel;
 		
 		/**
-		 * @private
+		 * The model to use for the DataGrid's header.
+		 *
+		 *  @langversion 3.0
+		 *  @playerversion Flash 10.2
+		 *  @playerversion AIR 2.6
+		 *  @productversion Royale 0.9
 		 */
-		override public function get dataProvider():Object
+		public function get headerModel():IBeadModel
 		{
-			return _hierarchicalData;
+			return _headerModel;
 		}
-		override public function set dataProvider(value:Object):void
+		public function set headerModel(value:IBeadModel):void
 		{
-			if (value == _hierarchicalData) return;
-			
-			_hierarchicalData = value as HierarchicalData;
-			
-			_flatList = new FlattenedList(_hierarchicalData);
-			super.dataProvider = _flatList;
+			if (_headerModel != value) {
+				_headerModel = value;
+				dispatchEvent(new Event("headerModelChanged"));
+				
+				_headerModel.addEventListener("dataProviderChanged", handleHeaderModelChange);
+			}
 		}
 		
-		private var _flatList:FlattenedList;
-		
-		/**
-		 * @private
-		 */
-		public function get flatList():FlattenedList
+		private function handleHeaderModelChange(event:Event):void
 		{
-			return _flatList;
+			dispatchEvent(new Event("headerModelChanged"));
 		}
 	}
 }
\ No newline at end of file
diff --git a/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/models/TreeModel.as b/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/models/TreeModel.as
new file mode 100644
index 0000000..841d298
--- /dev/null
+++ b/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/models/TreeModel.as
@@ -0,0 +1,54 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  Licensed to the Apache Software Foundation (ASF) under one or more
+//  contributor license agreements.  See the NOTICE file distributed with
+//  this work for additional information regarding copyright ownership.
+//  The ASF licenses this file to You under the Apache License, Version 2.0
+//  (the "License"); you may not use this file except in compliance with
+//  the License.  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//  See the License for the specific language governing permissions and
+//  limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+package org.apache.royale.html.beads.models
+{
+	import org.apache.royale.collections.HierarchicalData;
+	import org.apache.royale.collections.TreeData;
+	import org.apache.royale.events.CollectionEvent;
+	import org.apache.royale.events.Event;
+
+	/**
+	 * The TreeModel is used by Tree
+	 */
+	public class TreeModel extends SingleSelectionCollectionViewModel
+	{
+		public function TreeModel()
+		{
+			super();
+		}
+		
+		private var _hierarchicalData: HierarchicalData;
+		
+		/**
+		 * Setting the hierarchicalData in this model is a convenience. The actual
+		 * dataProvider is TreeData; this will create that and set it as the
+		 * dataProvider. THIS COULD BE REMOVED AS NOTHING SHOULD BE SETTING THIS PROPERTY.
+		 */
+		public function set hierarchicalData(value:HierarchicalData):void
+		{
+			_hierarchicalData = value;
+			var treeData:TreeData = new TreeData(_hierarchicalData);
+			dataProvider = treeData;
+		}
+		public function get hierarchicalData():HierarchicalData
+		{
+			return _hierarchicalData;
+		}
+	}
+}
\ No newline at end of file
diff --git a/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/supportClasses/DataGridColumn.as b/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/supportClasses/DataGridColumn.as
index c1eccdd..db15042 100644
--- a/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/supportClasses/DataGridColumn.as
+++ b/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/supportClasses/DataGridColumn.as
@@ -19,6 +19,7 @@
 package org.apache.royale.html.supportClasses
 {
 	import org.apache.royale.core.IFactory;
+	import org.apache.royale.core.UIBase;
 
 	/**
 	 *  The DataGridColumn class is the collection of properties that describe
@@ -66,6 +67,16 @@
 			_itemRenderer = value;
 		}
 		
+		private var _columnClass:IFactory;
+		public function get columnClass():IFactory
+		{
+			return _columnClass;
+		}
+		public function set columnClass(value:IFactory):void
+		{
+			_columnClass = value;
+		}
+		
 		private var _columnWidth:Number = Number.NaN;
 		
 		/**
@@ -123,5 +134,10 @@
 		{
 			_dataField = value;
 		}
+		
+		public function createList():UIBase
+		{
+			return new DataGridColumnList();
+		}
 	}
 }
diff --git a/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/supportClasses/TreeGridColumn.as b/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/supportClasses/TreeGridColumn.as
index 573ab0f..957a63e 100644
--- a/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/supportClasses/TreeGridColumn.as
+++ b/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/supportClasses/TreeGridColumn.as
@@ -18,6 +18,9 @@
 ////////////////////////////////////////////////////////////////////////////////
 package org.apache.royale.html.supportClasses
 {
+	import org.apache.royale.core.UIBase;
+	import org.apache.royale.html.Tree;
+
 	/**
 	 * A TreeGridColumn defines the property of a specific column in the TreeGrid.
 	 * 
@@ -40,5 +43,10 @@
 		{
 			super();
 		}
+		
+		override public function createList():UIBase
+		{
+			return new Tree();
+		}
 	}
 }
\ No newline at end of file
diff --git a/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/supportClasses/TreeItemRenderer.as b/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/supportClasses/TreeItemRenderer.as
index c1f9fb6..8065c54 100644
--- a/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/supportClasses/TreeItemRenderer.as
+++ b/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/supportClasses/TreeItemRenderer.as
@@ -46,18 +46,22 @@
 		{
 			super.data = value;
 			
-			var treeData:TreeListData = listData as TreeListData;
+			var treeListData:TreeListData = listData as TreeListData;
 			var indentSpace:String = "    ";
+			var extraSpace:String = " ";
 			
 			COMPILE::JS {
-				indentSpace = "&nbsp;&nbsp;&nbsp;&nbsp;"
+				indentSpace = "&nbsp;&nbsp;&nbsp;&nbsp;";
+				extraSpace = "&nbsp;";
 			}
-			
-			var indent:String = treeData.hasChildren ? (treeData.isOpen ? "▼" : "▶") : " ";
-			for (var i:int=0; i < treeData.depth; i++) {
+				
+			var indent:String = "";
+			for (var i:int=0; i < treeListData.depth - 1; i++) {
 				indent += indentSpace;
 			}
 			
+			indent += (treeListData.hasChildren ? (treeListData.isOpen ? "▼" : "▶") : "") + extraSpace;
+			
 			this.text = indent + this.text;
 		}
 	}
diff --git a/frameworks/projects/Collections/src/main/royale/CollectionsClasses.as b/frameworks/projects/Collections/src/main/royale/CollectionsClasses.as
index a47086f..941586c 100644
--- a/frameworks/projects/Collections/src/main/royale/CollectionsClasses.as
+++ b/frameworks/projects/Collections/src/main/royale/CollectionsClasses.as
@@ -32,6 +32,7 @@
 	import org.apache.royale.collections.HierarchicalData; HierarchicalData;
 	import org.apache.royale.collections.LazyCollection; LazyCollection;
 	import org.apache.royale.collections.Collection; Collection;
+	import org.apache.royale.collections.TreeData; TreeData;
 }
 
 }
diff --git a/frameworks/projects/Collections/src/main/royale/org/apache/royale/collections/ArrayList.as b/frameworks/projects/Collections/src/main/royale/org/apache/royale/collections/ArrayList.as
index 9bf19f2..8fc316a 100644
--- a/frameworks/projects/Collections/src/main/royale/org/apache/royale/collections/ArrayList.as
+++ b/frameworks/projects/Collections/src/main/royale/org/apache/royale/collections/ArrayList.as
@@ -90,7 +90,7 @@
      *  @playerversion AIR 2.6
      *  @productversion Royale 0.0
      */
-	public class ArrayList extends EventDispatcher implements IBead, ICollection, IArrayList
+	public class ArrayList extends EventDispatcher implements IBead, ICollectionView, IArrayList
 	{
         /**
          *  Constructor.
diff --git a/frameworks/projects/Collections/src/main/royale/org/apache/royale/collections/FlattenedList.as b/frameworks/projects/Collections/src/main/royale/org/apache/royale/collections/FlattenedList.as
index b0e1915..e0e4b52 100644
--- a/frameworks/projects/Collections/src/main/royale/org/apache/royale/collections/FlattenedList.as
+++ b/frameworks/projects/Collections/src/main/royale/org/apache/royale/collections/FlattenedList.as
@@ -133,6 +133,7 @@
 					addItemAt(arr.shift(), ++i);
 				}
 			}
+			updateNode(node);
 		}
 		
 		/**
@@ -165,6 +166,16 @@
 					arr.shift();
 				}
 			}
+			updateNode(node);
+		}
+		
+		/**
+		 * Singles to the node that its state has changed and it should
+		 * update itself
+		 */
+		public function updateNode(node:Object):void
+		{
+			this.itemUpdated(node);
 		}
 		
 		/**
diff --git a/frameworks/projects/Collections/src/main/royale/org/apache/royale/collections/HierarchicalData.as b/frameworks/projects/Collections/src/main/royale/org/apache/royale/collections/HierarchicalData.as
index 1cfae10..e847c3e 100644
--- a/frameworks/projects/Collections/src/main/royale/org/apache/royale/collections/HierarchicalData.as
+++ b/frameworks/projects/Collections/src/main/royale/org/apache/royale/collections/HierarchicalData.as
@@ -64,6 +64,8 @@
     //  Properties
     //
     //--------------------------------------------------------------------------
+	
+	private var _flatList:FlattenedList;
 
     //--------------------------------------------------------------------------
     // childrenField
@@ -263,6 +265,26 @@
     {
         return source;
     }
+	
+	public function isOpen(node:Object):Boolean
+	{
+		return _flatList.isOpen(node);
+	}
+	
+	public function openNode(node:Object):void
+	{
+		_flatList.openNode(node);
+	}
+	
+	public function closeNode(node:Object):void
+	{
+		_flatList.closeNode(node);
+	}
+	
+	public function getDepth(node:Object):int
+	{
+		return _flatList.getDepth(node);
+	}
 
 }
 
diff --git a/frameworks/projects/Collections/src/main/royale/org/apache/royale/collections/ICollectionView.as b/frameworks/projects/Collections/src/main/royale/org/apache/royale/collections/ICollectionView.as
new file mode 100644
index 0000000..5071d66
--- /dev/null
+++ b/frameworks/projects/Collections/src/main/royale/org/apache/royale/collections/ICollectionView.as
@@ -0,0 +1,38 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  Licensed to the Apache Software Foundation (ASF) under one or more
+//  contributor license agreements.  See the NOTICE file distributed with
+//  this work for additional information regarding copyright ownership.
+//  The ASF licenses this file to You under the Apache License, Version 2.0
+//  (the "License"); you may not use this file except in compliance with
+//  the License.  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//  See the License for the specific language governing permissions and
+//  limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+package org.apache.royale.collections
+{
+	/**
+	 * The ICollectionView interface is implemented by classes that provide
+	 * collection data.
+	 */
+	public interface ICollectionView extends ICollection
+	{
+		function get length():int;
+		function getItemIndex(item:Object):int;
+		function addItem(item:Object):void;
+		function addItemAt(item:Object, index:int):void;
+		function setItemAt(item:Object, index:int):Object;
+		function removeItem(item:Object):Boolean;
+		function removeItemAt(index:int):Object;
+		function removeAll():void;
+		function itemUpdated(item:Object):void;
+		function itemUpdatedAt(index:int):void;
+	}
+}
\ No newline at end of file
diff --git a/frameworks/projects/Collections/src/main/royale/org/apache/royale/collections/TreeData.as b/frameworks/projects/Collections/src/main/royale/org/apache/royale/collections/TreeData.as
new file mode 100644
index 0000000..b594c63
--- /dev/null
+++ b/frameworks/projects/Collections/src/main/royale/org/apache/royale/collections/TreeData.as
@@ -0,0 +1,132 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  Licensed to the Apache Software Foundation (ASF) under one or more
+//  contributor license agreements.  See the NOTICE file distributed with
+//  this work for additional information regarding copyright ownership.
+//  The ASF licenses this file to You under the Apache License, Version 2.0
+//  (the "License"); you may not use this file except in compliance with
+//  the License.  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//  See the License for the specific language governing permissions and
+//  limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+package org.apache.royale.collections
+{
+	import org.apache.royale.events.EventDispatcher;
+	import org.apache.royale.events.CollectionEvent;
+
+	/**
+	 * TreeData is used with tree or structured data classes. This class incorporates
+	 * a HierarchicalData structure as its primary source, but then internally flattens
+	 * it for presentation.
+	 */
+	public class TreeData extends EventDispatcher implements ICollectionView
+	{
+		public function TreeData(source:HierarchicalData)
+		{
+			_hierarchicalData = source;
+			_flatList = new FlattenedList(source);
+			
+			_flatList.addEventListener(CollectionEvent.ITEM_ADDED, handleCollectionEvent);
+			_flatList.addEventListener(CollectionEvent.ITEM_REMOVED, handleCollectionEvent);
+			_flatList.addEventListener(CollectionEvent.ITEM_UPDATED, handleCollectionEvent);
+		}
+		
+		/**
+		 * Forwards CollectionEvents from the internal FlattenedList as if they came
+		 * from this TreeData, further mimicking an ICollectionView.
+		 * 
+		 * @private
+		 */
+		private function handleCollectionEvent(event:CollectionEvent):void
+		{
+			var newEvent:CollectionEvent = new CollectionEvent(event.type);
+			newEvent.item = event.item;
+			newEvent.index = event.index;
+			dispatchEvent(newEvent);
+		}
+		
+		private var _hierarchicalData:HierarchicalData;
+		private var _flatList:FlattenedList;
+		
+		// Working with Trees
+		
+		public function hasChildren(node:Object):Boolean
+		{
+			return _flatList.hasChildren(node);
+		}
+		
+		public function isOpen(node:Object):Boolean
+		{
+			return _flatList.isOpen(node);
+		}
+		
+		public function openNode(node:Object):void
+		{
+			_flatList.openNode(node);
+		}
+		
+		public function closeNode(node:Object):void
+		{
+			_flatList.closeNode(node);
+		}
+		
+		public function getDepth(node:Object):int
+		{
+			return _flatList.getDepth(node);
+		}
+		
+		// ICollectionData
+		
+		public function get length():int
+		{
+			return _flatList.length;
+		}
+		public function getItemAt(index:int):Object
+		{
+			return _flatList.getItemAt(index);
+		}
+		public function getItemIndex(item:Object):int
+		{
+			return _flatList.getItemIndex(item);
+		}
+		public function addItem(item:Object):void
+		{
+			_flatList.addItem(item);
+		}
+		public function addItemAt(item:Object, index:int):void
+		{
+			_flatList.addItemAt(item, index);
+		}
+		public function setItemAt(item:Object, index:int):Object
+		{
+			return _flatList.setItemAt(item, index);
+		}
+		public function removeItem(item:Object):Boolean
+		{
+			return _flatList.removeItem(item);
+		}
+		public function removeItemAt(index:int):Object
+		{
+			return _flatList.removeItemAt(index);
+		}
+		public function removeAll():void
+		{
+			_flatList.removeAll();
+		}
+		public function itemUpdated(item:Object):void
+		{
+			_flatList.itemUpdated(item);
+		}
+		public function itemUpdatedAt(index:int):void
+		{
+			_flatList.itemUpdatedAt(index);
+		}
+	}
+}
\ No newline at end of file
