Cells were incorrectly setting padding every time they were composed which was causing cell lines to become incorrectly invalid and put cells into an unstable state.
I think ContainerController should be adding the array including tables to _shapeChildren and not the old _linesInView which only contains pure lines.
diff --git a/textLayout/src/flashx/textLayout/container/ContainerController.as b/textLayout/src/flashx/textLayout/container/ContainerController.as
index 2e375f4..eef34fb 100644
--- a/textLayout/src/flashx/textLayout/container/ContainerController.as
+++ b/textLayout/src/flashx/textLayout/container/ContainerController.as
@@ -3248,7 +3248,8 @@
 			{
 				// We only updated some of the lines. Remove the old versions off the end, and add in the new ones from _linesInView
 				_shapeChildren.length = shapeChildrenStartIdx;		// truncate
-				_shapeChildren = _shapeChildren.concat(_linesInView);	// append _linesInView to end of _shapeChildren
+				//_shapeChildren = _shapeChildren.concat(_linesInView);	// append _linesInView to end of _shapeChildren
+				_shapeChildren = _shapeChildren.concat(newShapeChildren);	// append _linesInView to end of _shapeChildren
 				_linesInView.length = 0;	// truncate
 			}
 			else
diff --git a/textLayout/src/flashx/textLayout/elements/TableCellElement.as b/textLayout/src/flashx/textLayout/elements/TableCellElement.as
index 7f04939..197d4c9 100644
--- a/textLayout/src/flashx/textLayout/elements/TableCellElement.as
+++ b/textLayout/src/flashx/textLayout/elements/TableCellElement.as
@@ -27,6 +27,7 @@
 	import flash.utils.getDefinitionByName;
 	import flash.utils.getQualifiedClassName;
 	
+	import flashx.textLayout.compose.FlowDamageType;
 	import flashx.textLayout.compose.TextFlowLine;
 	import flashx.textLayout.container.ContainerController;
 	import flashx.textLayout.edit.EditManager;
@@ -90,26 +91,52 @@
 		}
 
 		public function isDamaged():Boolean {
-			return _damaged;
+			return _damaged || (_textFlow && _textFlow.flowComposer.isDamaged(_textFlow.textLength));
 		}
 		
+		private var _savedPaddingTop:Number = 0;
+		private var _savedPaddingBottom:Number = 0;
+		private var _savedPaddingLeft:Number = 0;
+		private var _savedPaddingRight:Number = 0;
+		
 		public function compose():Boolean {
+			
+			var pt:Number = getEffectivePaddingTop();
+			var pb:Number = getEffectivePaddingBottom();
+			var pl:Number = getEffectivePaddingLeft();
+			var pr:Number = getEffectivePaddingRight();
+
+			if(pt != _savedPaddingTop)
+			{
+				_controller.paddingTop = _savedPaddingTop = pt;
+			}
+			if(pb != _savedPaddingBottom)
+			{
+				_controller.paddingBottom = _savedPaddingBottom = pb;
+			}
+			if(pl != _savedPaddingLeft)
+			{
+				_controller.paddingLeft = _savedPaddingLeft = pl;
+			}
+			if(pr != _savedPaddingRight)
+			{
+				_controller.paddingRight = _savedPaddingRight = pr;
+			}
+
 			var table:TableElement = getTable();
-			width = 0;
+			
+			_damaged = false;
+			
+			var compWidth:Number = 0;
 			for(var i:int=0;i<columnSpan;i++)
 			{
 				if (table && table.getColumnAt(colIndex+i)) {
-					width += table.getColumnAt(colIndex+i).columnWidth;
+					compWidth += table.getColumnAt(colIndex+i).columnWidth;
 				}
 				
 			}
-			
-			_damaged = false;
-			_controller.paddingTop = getEffectivePaddingTop();
-			_controller.paddingBottom = getEffectivePaddingBottom();
-			_controller.paddingLeft = getEffectivePaddingLeft();
-			_controller.paddingRight = getEffectivePaddingRight();
-			
+			width = compWidth;
+
 			if (_textFlow && _textFlow.flowComposer) {
 				return _textFlow.flowComposer.compose();
 			}