 			else
 				_clonedFilters.push(value[i]);
 		}
-		
+
 		dispatchPropertyChangeEvent("filters", oldFilters, _filters);
-		
+
 		filtersChanged = true;
 		notifyElementLayerChanged();
 	}
-	
+
 	public function get filters():Array
 	{
 		return _filters;
 	}
-	
+
+	//----------------------------------
+	//  explicitHeight
+	//----------------------------------
+	private var _explicitHeight:Number;
+
+	[Bindable("propertyChange")]
+	[Inspectable(category="General")]
+
+	public function get explicitHeight():Number
+	{
+        return _explicitHeight;
+	}
+
+	public function set explicitHeight(value:Number):void
+	{
+	    if (_explicitHeight == value)
+	        return;
+
+        // height can be pixel or percent, not both
+        if (!isNaN(value))
+            percentHeight = NaN;
+
+        var oldValue:Number = _explicitHeight;
+        _explicitHeight = value;
+        dispatchPropertyChangeEvent("explicitHeight", oldValue, value);
+
+        invalidateSize();
+        invalidateParentSizeAndDisplayList();
+	}
+
+	//----------------------------------
+	//  explicitWidth
+	//----------------------------------
+	private var _explicitWidth:Number;
+
+	[Bindable("propertyChange")]
+	[Inspectable(category="General")]
+
+	public function get explicitWidth():Number
+	{
+        return _explicitWidth;
+	}
+
+	public function set explicitWidth(value:Number):void
+	{
+	    if (_explicitWidth == value)
+	        return;
+
+        // height can be pixel or percent, not both
+        if (!isNaN(value))
+            percentWidth = NaN;
+
+        var oldValue:Number = _explicitWidth;
+        _explicitWidth = value;
+        dispatchPropertyChangeEvent("explicitWidth", oldValue, value);
+
+        invalidateSize();
+        invalidateParentSizeAndDisplayList();
+	}
+
 	//----------------------------------
 	//  height
 	//----------------------------------
-
-	private var _height:Number = 0;
-	protected var _explicitHeight:Number;
-	
-	[Bindable("propertyChange")]
-	[Inspectable(category="General")]
-	
+	mx_internal var _height:Number = 0;
+
+	[Bindable("propertyChange")]
+	[Inspectable(category="General")]
+
 	/**
 	 *  The height of the rect.
-	 * 
+	 *
 	 *  @default 0
 	 */
-	public function get height():Number 
+	public function get height():Number
 	{
 		return _height;
 	}
-	
+
 	public function set height(value:Number):void
 	{
-		_explicitHeight = value;
+		explicitHeight = value;
+
+		if (_height == value)
+		    return;
+
 		var oldValue:Number = _height;
-		
-		if (value != oldValue)
-		{
-			_height = value;
-			drawHeight = value;
-			dispatchPropertyChangeEvent("height", oldValue, value);	
-			notifyElementChanged();		
-		}
-	}
-	
+		_height = value;
+		dispatchPropertyChangeEvent("height", oldValue, value);
+
+        // Invalidate the display list, since we're changing the actual width
+        // and we're not going to correctly detect whether the layout sets
+        // new actual width different from our previous value.
+        // TODO EGeorgie: is this worth optimizing?
+		invalidateDisplayList();
+	}
+
 	//----------------------------------
 	//  horizontalCenter
 	//----------------------------------
 	private var _horizontalCenter:Number;
-	
+
 	[Bindable("propertyChange")]
 	[Inspectable(category="General")]
 	public function get horizontalCenter():Number
 	{
 		return _horizontalCenter;
 	}
-	
+
 	public function set horizontalCenter(value:Number):void
 	{
-		if (_horizontalCenter != value)
-		{
-			var oldValue:Number = _horizontalCenter;
-			_horizontalCenter = value;
-			dispatchPropertyChangeEvent("horizontalCenter", oldValue, value);
-			
-			sizeChanged = true;
-			notifyElementChanged();
-		}
-	}
-	
+		if (_horizontalCenter == value)
+		    return;
+
+		var oldValue:Number = _horizontalCenter;
+		_horizontalCenter = value;
+		dispatchPropertyChangeEvent("horizontalCenter", oldValue, value);
+
+		invalidateParentSizeAndDisplayList();
+	}
+
 	//----------------------------------
 	//  left
 	//----------------------------------
 	private var _left:Number;
-	
+
 	[Bindable("propertyChange")]
 	[Inspectable(category="General")]
 	public function get left():Number
 	{
 		return _left;
 	}
-	
+
 	public function set left(value:Number):void
 	{
-		if (_left != value)
-		{
-			var oldValue:Number = _left;
-			_left = value;
-			dispatchPropertyChangeEvent("left", oldValue, value);
-			
-			sizeChanged = true;
-			notifyElementChanged();
-		}
-	}
-	
+		if (_left == value)
+		    return;
+
+		var oldValue:Number = _left;
+		_left = value;
+		dispatchPropertyChangeEvent("left", oldValue, value);
+
+		invalidateParentSizeAndDisplayList();
+	}
+
 	//----------------------------------
 	//  mask
 	//----------------------------------
-	
+
 	private var _mask:DisplayObject;
 	private var previousMask:DisplayObject;
 	private var isMaskInElementSpace:Boolean;
 	private var maskChanged:Boolean;
-	
-	[Bindable("propertyChange")]
-	[Inspectable(category="General")]
-	
+
+	[Bindable("propertyChange")]
+	[Inspectable(category="General")]
+
 	public function set mask(value:DisplayObject):void
 	{
-		if (_mask !== value)
-		{
-			var oldValue:DisplayObject = _mask;
-			previousMask = _mask;
-			_mask = value;
-			dispatchPropertyChangeEvent("mask", oldValue, value);
-			maskChanged = true;
-			maskTypeChanged = true;
-			isMaskInElementSpace = false;
-			notifyElementLayerChanged();
-		}
-	}
-	
+		if (_mask == value)
+		    return;
+
+		var oldValue:DisplayObject = _mask;
+		previousMask = _mask;
+		_mask = value;
+		dispatchPropertyChangeEvent("mask", oldValue, value);
+		maskChanged = true;
+		maskTypeChanged = true;
+		isMaskInElementSpace = false;
+		notifyElementLayerChanged();
+
+        // TODO EGeorgie: currently need to invalidate the display list,
+        // because the mask gets applied on updateDisplayList. Should it get
+        // applied on commit properties?
+		invalidateDisplayList();
+	}
+
 	public function get mask():DisplayObject
 	{
 		return _mask;
 	}
-	
+
 	//----------------------------------
 	//  maskType
 	//----------------------------------
 	private var _maskType:String = MaskType.CLIP;
 	private var maskTypeChanged:Boolean;
-	
+
 	[Bindable("propertyChange")]
 	[Inspectable(category="General",enumeration="clip,alpha", defaultValue="clip")]
 	public function get maskType():String
 	{
 		return _maskType;
 	}
-	
+
 	public function set maskType(value:String):void
 	{
-		if (_maskType != value)
-		{
-			var oldValue:String = _maskType;
-			_maskType = value;
-			dispatchPropertyChangeEvent("maskType", oldValue, value);
-			
-			maskTypeChanged = true;
-			notifyElementChanged();
-		}
-	}
-	
+		if (_maskType == value)
+		    return;
+
+		var oldValue:String = _maskType;
+		_maskType = value;
+		dispatchPropertyChangeEvent("maskType", oldValue, value);
+
+		maskTypeChanged = true;
+		invalidateDisplayList();
+	}
+
 	//----------------------------------
 	//  maxHeight
 	//----------------------------------
 	private var _maxHeight:Number;
-	
+
 	[Bindable("propertyChange")]
 	[Inspectable(category="General")]
 	public function get maxHeight():Number
 	{
 		// TODO!!! Examine this logic, Make this arbitrarily large (use UIComponent max)
-		return !isNaN(_maxHeight) ? _maxHeight : DEFAULT_MAX_HEIGHT; 
-	}
-	
+		return !isNaN(_maxHeight) ? _maxHeight : DEFAULT_MAX_HEIGHT;
+	}
+
 	public function set maxHeight(value:Number):void
 	{
-		if (_maxHeight != value)
-		{
-			var oldValue:Number = _maxHeight;
-			_maxHeight = value;
-			dispatchPropertyChangeEvent("maxHeight", oldValue, value);
-			
-			sizeChanged = true;
-			notifyElementChanged();
-		}
+		if (_maxHeight == value)
+		    return;
+
+		var oldValue:Number = _maxHeight;
+		_maxHeight = value;
+		dispatchPropertyChangeEvent("maxHeight", oldValue, value);
+
+		invalidateSize();
+        invalidateParentSizeAndDisplayList();
 	}
 
 	//----------------------------------
 	//  maxWidth
 	//----------------------------------
 	private var _maxWidth:Number;
-	
+
 	[Bindable("propertyChange")]
 	[Inspectable(category="General")]
 	public function get maxWidth():Number
 	{
 		// TODO!!! Examine this logic, Make this arbitrarily large (use UIComponent max)
-		return !isNaN(_maxWidth) ? _maxWidth : DEFAULT_MAX_WIDTH; 
-	}
-	
+		return !isNaN(_maxWidth) ? _maxWidth : DEFAULT_MAX_WIDTH;
+	}
+
 	public function set maxWidth(value:Number):void
 	{
-		if (_maxWidth != value)
-		{
-			var oldValue:Number = _maxWidth;
-			_maxWidth = value;
-			dispatchPropertyChangeEvent("maxWidth", oldValue, value);
-			
-			sizeChanged = true;
-			notifyElementChanged();
-		}
-	}
-	
+		if (_maxWidth == value)
+		    return;
+
+        var oldValue:Number = _maxWidth;
+		_maxWidth = value;
+		dispatchPropertyChangeEvent("maxWidth", oldValue, value);
+
+		invalidateSize();
+        invalidateParentSizeAndDisplayList();
+	}
+
 	//----------------------------------
 	//  minHeight
 	//----------------------------------
 	private var _minHeight:Number;
-	
+
 	[Bindable("propertyChange")]
 	[Inspectable(category="General")]
 	public function get minHeight():Number
 	{
 		// TODO!!! Examine this logic
-		return !isNaN(_minHeight) ? _minHeight : DEFAULT_MIN_HEIGHT; 
-	}
-	
+		return !isNaN(_minHeight) ? _minHeight : DEFAULT_MIN_HEIGHT;
+	}
+
 	public function set minHeight(value:Number):void
 	{
-		if (_minHeight != value)
-		{
-			var oldValue:Number = _minHeight;
-			_minHeight = value;
-			dispatchPropertyChangeEvent("minHeight", oldValue, value);
-			
-			sizeChanged = true;
-			notifyElementChanged();
-		}
-	}	
-	
+		if (_minHeight == value)
+		    return;
+
+        var oldValue:Number = _minHeight;
+		_minHeight = value;
+		dispatchPropertyChangeEvent("minHeight", oldValue, value);
+
+		invalidateSize();
+		invalidateParentSizeAndDisplayList();
+	}
+
 	//----------------------------------
 	//  minWidth
 	//----------------------------------
 	private var _minWidth:Number;
-	
+
 	[Bindable("propertyChange")]
 	[Inspectable(category="General")]
 	public function get minWidth():Number
 	{
 		// TODO!!! Examine this logic
-		return !isNaN(_minWidth) ? _minWidth : DEFAULT_MIN_WIDTH; 
-	}
-	
+		return !isNaN(_minWidth) ? _minWidth : DEFAULT_MIN_WIDTH;
+	}
+
 	public function set minWidth(value:Number):void
 	{
-		if (_minWidth != value)
-		{
-			var oldValue:Number = _minWidth;
-			_minWidth = value;
-			dispatchPropertyChangeEvent("minWidth", oldValue, value);
-			
-			sizeChanged = true;
-			notifyElementChanged();
-		}
-	}
-	
+		if (_minWidth == value)
+		    return;
+
+		var oldValue:Number = _minWidth;
+		_minWidth = value;
+		dispatchPropertyChangeEvent("minWidth", oldValue, value);
+
+		invalidateSize();
+		invalidateParentSizeAndDisplayList();
+	}
+
 	//----------------------------------
 	//  percentHeight
 	//----------------------------------
 	private var _percentHeight:Number;
-	
+
 	[Bindable("propertyChange")]
 	[Inspectable(category="General")]
 	public function get percentHeight():Number
 	{
 		// TODO!!! Examine this logic
-		return _percentHeight; 
-	}
-	
+		return _percentHeight;
+	}
+
 	public function set percentHeight(value:Number):void
 	{
-		if (_percentHeight != value)
-		{
-			var oldValue:Number = _percentHeight;
-			_percentHeight = value;
-			dispatchPropertyChangeEvent("percentHeight", oldValue, value);
-			
-			sizeChanged = true;
-			notifyElementChanged();
-		}
-	}
-	
+		if (_percentHeight == value)
+		    return;
+
+	    if (!isNaN(value))
+	        explicitHeight = NaN;
+
+	    var oldValue:Number = _percentHeight;
+		_percentHeight = value;
+		dispatchPropertyChangeEvent("percentHeight", oldValue, value);
+
+		invalidateParentSizeAndDisplayList();
+	}
+
 	//----------------------------------
 	//  percentWidth
 	//----------------------------------
 	private var _percentWidth:Number;
-	
+
 	[Bindable("propertyChange")]
 	[Inspectable(category="General")]
 	public function get percentWidth():Number
 	{
 		// TODO!!! Examine this logic
-		return _percentWidth; 
-	}
-	
+		return _percentWidth;
+	}
+
 	public function set percentWidth(value:Number):void
 	{
-		if (_percentWidth != value)
-		{
-			var oldValue:Number = _percentWidth;
-			_percentWidth = value;
-			dispatchPropertyChangeEvent("percentWidth", oldValue, value);
-			
-			sizeChanged = true;
-			notifyElementChanged();	
-		}
+		if (_percentWidth == value)
+		    return;
+
+	    if (!isNaN(value))
+	        explicitWidth = NaN;
+
+	    var oldValue:Number = _percentWidth;
+		_percentWidth = value;
+		dispatchPropertyChangeEvent("percentWidth", oldValue, value);
+
+		invalidateParentSizeAndDisplayList();
 	}
 
 	//----------------------------------
 	//  right
 	//----------------------------------
 	private var _right:Number;
-	
+
 	[Bindable("propertyChange")]
 	[Inspectable(category="General")]
 	public function get right():Number
 	{
 		return _right;
 	}
-	
+
 	public function set right(value:Number):void
 	{
-		if (_right != value)
-		{
-			var oldValue:Number = _right;
-			_right = value;
-			dispatchPropertyChangeEvent("right", oldValue, value);
-			
-			sizeChanged = true;
-			notifyElementChanged();
-		}
-	}
-	
+		if (_right == value)
+		    return;
+
+		var oldValue:Number = _right;
+		_right = value;
+		dispatchPropertyChangeEvent("right", oldValue, value);
+
+		invalidateParentSizeAndDisplayList();
+	}
+
 	//----------------------------------
 	//  rotation
 	//----------------------------------
-	
+
 	private var _rotation:Number = 0;
 	private var rotationChanged:Boolean;
-	
+
 	[Bindable("propertyChange")]
 	[Inspectable(category="General")]
 	/**

					edFilter.removeEventListener(BaseFilter.FILTER_CHANGED_TYPE, filterChangedHandler);
			}
		}
				
		_clonedFilters = new Array();
		_filters = value;
		len = value.length;
		
		for (i = 0; i < len; i++)
		{
			if (value[i] is IBitmapFilter)

			}
		}
	}

	protected function clearTransformProperties():void
	{
		scaleXChanged = false;
		scaleYChanged = false;
		xChanged = false;
		yChanged = false;
		rotationChanged = false;
	}

	/**
	 *  Dispatch a propertyChange event.
	 */
	protected function dispatchPropertyChangeEvent(prop:String, oldValue:*, value:*):void
