 			{
 				bitmapData = new BitmapData(tmpSprite.width, tmpSprite.height, true, 0);
 				bitmapData.draw(tmpSprite, new Matrix());
+                bitmapCreated = true;
 			}
             
             // If the bitmapData isn't transparent (ex. JPEG), then copy it into a transparent bitmapData
             if (!bitmapData.transparent)
             {
-                // TODO (jszeto) : Dispose of this bitmap when we no longer need it
+                // FIXME (jszeto) : Only clone this if alpha is not 1. Dispose of this bitmap when we no longer need it
                 var transparentBitmap:BitmapData = new BitmapData(bitmapData.width, bitmapData.height, true);
                 transparentBitmap.draw(bitmapData);
-                _source = transparentBitmap;
+                bitmapCreated = true;
+                bitmapData = transparentBitmap;
             }
-            else
-            {
-	
-			    _source = bitmapData;
-            }
-			
-            applyAlphaMultiplier = true;
-			dispatchFillChangedEvent("source", oldValue, bitmapData);
+            
+            _source = value;
+            setBitmapData(bitmapData, bitmapCreated);
+            
+			dispatchFillChangedEvent("source", oldValue, value);
         }
 	}
 

            nonRepeatAlphaSource.dispose();
            nonRepeatAlphaSource = null;
        }
        
        var sourceAsBitmapData:BitmapData = source as BitmapData;
        var repeatFill:Boolean = (resizeMode == BitmapResizeMode.REPEAT);  
        
        if (compoundTransform)
        {

	 */
	public function begin(target:Graphics, bounds:Rectangle):void
	{		
        var sourceAsBitmapData:BitmapData = _bitmapData;
        
		if (!sourceAsBitmapData)
			return;        
        
        var repeatFill:Boolean = (resizeMode == BitmapResizeMode.REPEAT); 
        
        // If we need to apply the alpha, we need to make another clone. So dispose of the old one.
        if (nonRepeatAlphaSource && applyAlphaMultiplier)
