     {
         super.commitProperties();
         
+		if (selectedItemChanged)
+        {
+        	// Retry applying the value in case the dataProvider is set
+            selectedItem = selectedItem;
+            selectedItemChanged = false;
+            selectedIndexChanged = false;
+        }
+
         if (selectedIndexChanged)
         {
-            // TODO: Currently hard-coded to require a selection. This should be fixed.
-            if (selectedIndex == -1)
-            {
-                selectedIndex = 0;
-            }
-            
-            if (dataProvider)
-                applyDataToLabelElement(dataProvider.getItemAt(selectedIndex));
+        	// Retry applying the value in case the dataProvider is set
+            selectedIndex = selectedIndex;
             selectedIndexChanged = false;
-            
-            dispatchEvent(new Event("change"));
-        }
+        }   
         
-        if (labelFunctionChanged)
-        {
-        	// TODO!! Update the label element 
-        	labelFunctionChanged = false;
-        	applyDataToLabelElement(dataProvider.getItemAt(selectedIndex));
-        }
-
-    }
+        if (labelChanged)
+		{
+			labelChanged = false;
+			if (labelElement)
+	    	{
+	    		if (selectedItem)
+	    			labelElement.text = LabelUtil.itemToLabel(selectedItem, labelField, labelFunction);
+	    		else
+	    			labelElement.text = "";
+	    	}
+		}
+        
+        // TODO (jszeto) Add call to valueCommit after selection changed
+
+    }
+                                                
     
     /**
 	 *  @private

    public function get selectedItem():Object
    {
    	// TODO (jszeto) Return _selectedItem first if it hasn't been committed yet
        return dataProvider.getItemAt(selectedIndex);
    }

    /**
     *  @private
     */
    public function set selectedItem(data:Object):void
    {
    	// TODO (jszeto) Tie this in with selectedIndex
        _selectedItem = data;
        invalidateProperties();
    }
    
 	//--------------------------------------------------------------------------

    }
    
    //----------------------------------
    //  itemRendererFunction
    //----------------------------------
    
    private var _itemRendererFunction:Function;
    
    /**
     *  @copy mx.components.DataGroup#itemRendererFunction
     *  
     *  @langversion 3.0
     *  @playerversion Flash 10
     *  @playerversion AIR 1.5
     *  @productversion Flex 4
     */
    public function get itemRendererFunction():Function
    {
        return _itemRendererFunction;
    }
    
    /**
     *  @private
     */
    public function set itemRendererFunction(value:Function):void
    {
        if (value != _itemRendererFunction)
        {
        	_itemRendererFunction = value;
        }
    }
    
    //----------------------------------
    //  iterator
    //----------------------------------
    
    /**
     *  The main IViewCursor used to fetch items from the
     *  dataProvider and pass the items to the renderers.
     *  At the end of any sequence of code, it must always be positioned
     *  at the topmost visible item on screen.
     *  
     *  @langversion 3.0
     *  @playerversion Flash 9
     *  @playerversion AIR 1.1
     *  @productversion Flex 3
     */
    protected var iterator:IViewCursor;
    
    //----------------------------------
    //  labelField
    //----------------------------------
	private var _labelField:String = "label"; 
   
    /**
     *  The name of the field in the data provider items to display as the label.
     
     * @default "label"
     *  
     *  @langversion 3.0
     *  @playerversion Flash 10
     *  @playerversion AIR 1.5
     *  @productversion Flex 4
     */
    public function get labelField():String
    {
    	return _labelField;
