diff --git a/textLayout/src/flashx/textLayout/compose/FlowComposerBase.as b/textLayout/src/flashx/textLayout/compose/FlowComposerBase.as
index b050201..7ed9f23 100644
--- a/textLayout/src/flashx/textLayout/compose/FlowComposerBase.as
+++ b/textLayout/src/flashx/textLayout/compose/FlowComposerBase.as
@@ -29,7 +29,7 @@
 	import flashx.textLayout.elements.FlowLeafElement;
 	import flashx.textLayout.elements.TextFlow;
 	import flashx.textLayout.tlf_internal;
-	
+
 	use namespace tlf_internal;
 	
 	[Exclude(name="initializeLines",kind="method")]
@@ -310,7 +310,6 @@
 				startPosition = 0;
 			}
 			
-			// find the line at damageStart
 			if (_lines.length == 0 || textFlow.textLength == 0)
 				return;
 				
@@ -319,10 +318,12 @@
 				return;
 				
 			CONFIG::debug { assert(startPosition + damageLength <= textFlow.textLength, "Damaging past end of flow!"); }
-			
-			// Start damaging one line before the startPosition location in case some of the first "damaged" line will fit on the previous line.
-			var lineIndex:int = findLineIndexAtPosition(startPosition);
-			var leaf:FlowLeafElement = textFlow.findLeaf(startPosition);
+
+            // find the line at damageStart
+            var lineIndex:int = findLineIndexAtPosition(startPosition);
+
+            // Start damaging one line before the startPosition location in case some of the first "damaged" line will fit on the previous line.
+            var leaf:FlowLeafElement = textFlow.findLeaf(startPosition);
 			if (leaf && lineIndex > 0)
 				lineIndex--;
 
@@ -367,6 +368,20 @@
 			return _damageAbsoluteStart <= absolutePosition && _damageAbsoluteStart != textFlow.textLength;
 		}
 
+
+		/**
+		 * @copy IFlowComposer#isPotentiallyDamaged()
+		 *
+		 * @playerversion Flash 10
+		 * @playerversion AIR 1.5
+	 	 * @langversion 3.0
+		 */
+
+		public function isPotentiallyDamaged(absolutePosition:int):Boolean
+		{
+			return isDamaged(absolutePosition);
+		}
+
 		/** @private */
 		CONFIG::debug public function checkFirstDamaged():void
 		{
diff --git a/textLayout/src/flashx/textLayout/compose/IFlowComposer.as b/textLayout/src/flashx/textLayout/compose/IFlowComposer.as
index 2b5a700..fc461de 100644
--- a/textLayout/src/flashx/textLayout/compose/IFlowComposer.as
+++ b/textLayout/src/flashx/textLayout/compose/IFlowComposer.as
@@ -431,7 +431,23 @@
 	 	 */
 	 	 
 		function isDamaged(absolutePosition:int):Boolean;
-		
+
+		/**
+		 * Indicates whether any TextFlowLine objects between the beginning of the flow and the line containing the content at
+		 * the specified position are marked as damaged OR if there are other clues that the textFlow should be rebuilt.
+		 *
+		 * @param absolutePosition the last position in the area of interest
+		 * @return 	true if any of the TextFlowLine objects from the start of the flow up to the line containing the content at
+		 * <code>absolutePosition</code> are marked as damaged OR if there are other reasons to believe the textFlow is damaged.
+		 *
+         * @see flashx.textLayout.compose.IFlowComposer#isDamaged()
+		 * @playerversion Flash 10
+		 * @playerversion AIR 1.5
+	 	 * @langversion 3.0
+	 	 */
+
+		function isPotentiallyDamaged(absolutePosition:int):Boolean;
+
 		
 		/** 
 		 * True, if the flow composer is currently performing a composition operation.
diff --git a/textLayout/src/flashx/textLayout/compose/StandardFlowComposer.as b/textLayout/src/flashx/textLayout/compose/StandardFlowComposer.as
index ca4b66e..9c93e94 100644
--- a/textLayout/src/flashx/textLayout/compose/StandardFlowComposer.as
+++ b/textLayout/src/flashx/textLayout/compose/StandardFlowComposer.as
@@ -628,10 +628,10 @@
 		//--------------------------------------------------------------------------
 		
 		/** @private Override required because we may be damaged if the last container has scrolling */
-		public override function isDamaged(absolutePosition:int):Boolean
+		public override function isPotentiallyDamaged(absolutePosition:int):Boolean
 		{
 			// Returns true if any text from _damageAbsoluteStart through absolutePosition needs to be recomposed
-			if (!super.isDamaged(absolutePosition))
+			if (!super.isPotentiallyDamaged(absolutePosition))
 			{	
 				if (absolutePosition == _textFlow.textLength)
 				{
diff --git a/textLayout/src/flashx/textLayout/container/ContainerController.as b/textLayout/src/flashx/textLayout/container/ContainerController.as
index a000035..58a93ad 100644
--- a/textLayout/src/flashx/textLayout/container/ContainerController.as
+++ b/textLayout/src/flashx/textLayout/container/ContainerController.as
@@ -47,6 +47,7 @@
     import flashx.textLayout.compose.FlowDamageType;
     import flashx.textLayout.compose.IFlowComposer;
     import flashx.textLayout.compose.TextFlowLine;
+    import flashx.textLayout.compose.TextFlowTableBlock;
     import flashx.textLayout.compose.TextLineRecycler;
     import flashx.textLayout.debug.Debugging;
     import flashx.textLayout.debug.assert;
@@ -55,6 +56,7 @@
     import flashx.textLayout.edit.ISelectionManager;
     import flashx.textLayout.edit.SelectionFormat;
     import flashx.textLayout.elements.BackgroundManager;
+    import flashx.textLayout.elements.CellCoordinates;
     import flashx.textLayout.elements.Configuration;
     import flashx.textLayout.elements.ContainerFormattedElement;
     import flashx.textLayout.elements.FlowElement;
@@ -63,6 +65,9 @@
     import flashx.textLayout.elements.InlineGraphicElement;
     import flashx.textLayout.elements.ParagraphElement;
     import flashx.textLayout.elements.TCYElement;
+    import flashx.textLayout.elements.TableBlockContainer;
+    import flashx.textLayout.elements.TableCellElement;
+    import flashx.textLayout.elements.TableRowElement;
     import flashx.textLayout.elements.TextFlow;
     import flashx.textLayout.events.FlowElementMouseEventManager;
     import flashx.textLayout.events.ModelChange;
@@ -79,55 +84,8 @@
     import flashx.textLayout.utils.Twips;
 
     use namespace tlf_internal;
-	
-	import flashx.textLayout.compose.FloatCompositionData;
-	import flashx.textLayout.compose.FlowComposerBase;
-	import flashx.textLayout.compose.FlowDamageType;
-	import flashx.textLayout.compose.IFlowComposer;
-	import flashx.textLayout.compose.TextFlowLine;
-	import flashx.textLayout.compose.TextFlowTableBlock;
-	import flashx.textLayout.compose.TextLineRecycler;
-	import flashx.textLayout.debug.Debugging;
-	import flashx.textLayout.debug.assert;
-	import flashx.textLayout.edit.EditingMode;
-	import flashx.textLayout.edit.IInteractionEventHandler;
-	import flashx.textLayout.edit.ISelectionManager;
-	import flashx.textLayout.edit.SelectionFormat;
-	import flashx.textLayout.elements.BackgroundManager;
-	import flashx.textLayout.elements.CellCoordinates;
-	import flashx.textLayout.elements.CellRange;
-	import flashx.textLayout.elements.Configuration;
-	import flashx.textLayout.elements.ContainerFormattedElement;
-	import flashx.textLayout.elements.FlowElement;
-	import flashx.textLayout.elements.FlowLeafElement;
-	import flashx.textLayout.elements.FlowValueHolder;
-	import flashx.textLayout.elements.InlineGraphicElement;
-	import flashx.textLayout.elements.LinkElement;
-	import flashx.textLayout.elements.ParagraphElement;
-	import flashx.textLayout.elements.TableBlockContainer;
-	import flashx.textLayout.elements.TableCellElement;
-	import flashx.textLayout.elements.TableElement;
-	import flashx.textLayout.elements.TableRowElement;
-	import flashx.textLayout.elements.TextFlow;
-	import flashx.textLayout.events.FlowElementMouseEvent;
-	import flashx.textLayout.events.FlowElementMouseEventManager;
-	import flashx.textLayout.events.ModelChange;
-	import flashx.textLayout.events.ScrollEvent;
-	import flashx.textLayout.events.ScrollEventDirection;
-	import flashx.textLayout.events.TextLayoutEvent;
-	import flashx.textLayout.events.UpdateCompleteEvent;
-	import flashx.textLayout.formats.BlockProgression;
-	import flashx.textLayout.formats.Float;
-	import flashx.textLayout.formats.FormatValue;
-	import flashx.textLayout.formats.ITextLayoutFormat;
-	import flashx.textLayout.formats.TextLayoutFormat;
-	import flashx.textLayout.property.Property;
-	import flashx.textLayout.tlf_internal;
-	import flashx.textLayout.utils.Twips;
-	
-	use namespace tlf_internal;
-	
-	/** 
+
+	/**
 	 * The ContainerController class defines the relationship between a TextFlow object and a container.
 	 * A TextFlow may have one or more rectangular areas that can hold text; the text is said to be flowing
 	 * through the containers. Each container is a Sprite that is the parent DisplayObject for the TextLines.
@@ -722,7 +680,7 @@
 		
 		public function isDamaged():Boolean
 		{
-			return flowComposer.isDamaged(absoluteStart + _textLength);
+			return flowComposer.isPotentiallyDamaged(absoluteStart + _textLength);
 		}
 		
 		/** called whenever the container attributes are changed.  Mark computed attributes and columnstate as out of date. 
diff --git a/textLayout/src/flashx/textLayout/container/TextContainerManager.as b/textLayout/src/flashx/textLayout/container/TextContainerManager.as
index a89566a..99ccce3 100644
--- a/textLayout/src/flashx/textLayout/container/TextContainerManager.as
+++ b/textLayout/src/flashx/textLayout/container/TextContainerManager.as
@@ -475,7 +475,7 @@
 	 	 * @langversion 3.0
 	 	 */
 		public function isDamaged():Boolean
-		{ return _composeState == COMPOSE_FACTORY ? _damaged : _textFlow.flowComposer.isDamaged(_textFlow.textLength); }
+		{ return _composeState == COMPOSE_FACTORY ? _damaged : _textFlow.flowComposer.isPotentiallyDamaged(_textFlow.textLength); }
 		
 		/** Editing mode of this TextContainerManager. Modes are reading only, reading and selection permitted, 
 		 * and editing (reading, selection, and writing)  permitted. Use the constant values of the EditingMode
diff --git a/textLayout/src/flashx/textLayout/elements/TableCellElement.as b/textLayout/src/flashx/textLayout/elements/TableCellElement.as
index 197d4c9..c734010 100644
--- a/textLayout/src/flashx/textLayout/elements/TableCellElement.as
+++ b/textLayout/src/flashx/textLayout/elements/TableCellElement.as
@@ -91,7 +91,7 @@
 		}
 
 		public function isDamaged():Boolean {
-			return _damaged || (_textFlow && _textFlow.flowComposer.isDamaged(_textFlow.textLength));
+			return _damaged || (_textFlow && _textFlow.flowComposer.isPotentiallyDamaged(_textFlow.textLength));
 		}
 		
 		private var _savedPaddingTop:Number = 0;
@@ -229,12 +229,12 @@
 			damage();
 		}
 
-		public function get enableIME():Boolean
+		public function get enableIME():Boolean
 		{
 			return _enableIME;
 		}
 
-		public function set enableIME(value:Boolean):void
+		public function set enableIME(value:Boolean):void
 		{
 			_enableIME = value;
 		}
@@ -251,7 +251,7 @@
 		/**
 		 * Gets the width.
 		 **/
-		public function get width():Number
+		public function get width():Number
 		{
 			return _width;
 		}
@@ -259,7 +259,7 @@
 		/**
 		 * @private
 		 **/
-		public function set width(value:Number):void
+		public function set width(value:Number):void
 		{
 			if(_width != value) {
 				_damaged = true;
@@ -273,7 +273,7 @@
 		/**
 		 * Returns the height of the cell. 
 		 **/
-		public function get height():Number
+		public function get height():Number
 		{
 			//return getRowHeight(); not sure if we should always use row height
 			return _height;
@@ -282,7 +282,7 @@
 		/**
 		 * @private
 		 **/
-		public function set height(value:Number):void
+		public function set height(value:Number):void
 		{
 			if (_height != value) {
 				_damaged = true;
@@ -313,23 +313,23 @@
 			return getRow() ? getRow().composedHeight : NaN;
 		}
 
-		public function get rowSpan():uint
+		public function get rowSpan():uint
 		{
 			return _rowSpan;
 		}
 
-		public function set rowSpan(value:uint):void
+		public function set rowSpan(value:uint):void
 		{
 			if(value >= 1)
 				_rowSpan = value;
 		}
 
-		public function get columnSpan():uint
+		public function get columnSpan():uint
 		{
 			return _columnSpan;
 		}
 
-		public function set columnSpan(value:uint):void
+		public function set columnSpan(value:uint):void
 		{
 			if(value >= 1)
 				_columnSpan = value;
@@ -364,22 +364,22 @@
 			return table ? table.getPreviousCell(this) : null;
 		}
 
-		public function get x():Number
+		public function get x():Number
 		{
 			return container.x;
 		}
 
-		public function set x(value:Number):void
+		public function set x(value:Number):void
 		{
 			container.x = value;
 		}
 
-		public function get y():Number
+		public function get y():Number
 		{
 			return container.y;
 		}
 
-		public function set y(value:Number):void
+		public function set y(value:Number):void
 		{
 			container.y = value;
 		}
@@ -446,12 +446,12 @@
 			return paddingAmount;
 		}
 
-		public function get includeDescentInCellBounds():Boolean
+		public function get includeDescentInCellBounds():Boolean
 		{
 			return _includeDescentInCellBounds;
 		}
 
-		public function set includeDescentInCellBounds(value:Boolean):void
+		public function set includeDescentInCellBounds(value:Boolean):void
 		{
 			_includeDescentInCellBounds = value;
 		}
