Merge branch 'develop' into CollectionData

* develop: (29 commits)
  more fixes to script
  try to fix spaces in path issue
  [maven-release-plugin] prepare for next development iteration
  [maven-release-plugin] prepare branch release/0.9.0
  This should fix it
  Revert "[maven-release-plugin] prepare branch release/0.9.0"
  Revert "[maven-release-plugin] prepare for next development iteration"
  [maven-release-plugin] prepare for next development iteration
  [maven-release-plugin] prepare branch release/0.9.0
  Revert "[maven-release-plugin] prepare branch release/0.9.0"
  Revert "[maven-release-plugin] prepare for next development iteration"
  more fixes for rc script
  [maven-release-plugin] prepare for next development iteration
  [maven-release-plugin] prepare branch release/0.9.0
  more debugging
  Revert "[maven-release-plugin] prepare branch release/0.9.0"
  Revert "[maven-release-plugin] prepare for next development iteration"
  Revert "[maven-release-plugin] prepare branch release/0.9.0"
  Revert "[maven-release-plugin] prepare for next development iteration"
  [maven-release-plugin] prepare for next development iteration
  ...
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