diff --git a/automation_tests/src/AllTestsSuite.as b/automation_tests/src/AllTestsSuite.as
index b9c0c38..f403e9f 100644
--- a/automation_tests/src/AllTestsSuite.as
+++ b/automation_tests/src/AllTestsSuite.as
@@ -45,6 +45,7 @@
     import UnitTest.Tests.ListTest;
     import UnitTest.Tests.LocaleTests;
     import UnitTest.Tests.OperationTest;
+    import UnitTest.Tests.ParagraphTest;
     import UnitTest.Tests.ScrollingTest;
     import UnitTest.Tests.SelectionTest;
     import UnitTest.Tests.SpacingTest;
@@ -102,6 +103,7 @@
         public var tcyTest:TCYTest;
         public var styleTest:StyleTest;
         public var selectionTest:SelectionTest;
+        public var paragraphTest:ParagraphTest;
     }
 
 }
diff --git a/automation_tests/src/UnitTest/Tests/ParagraphTest.as b/automation_tests/src/UnitTest/Tests/ParagraphTest.as
index 85463a9..908b2da 100644
--- a/automation_tests/src/UnitTest/Tests/ParagraphTest.as
+++ b/automation_tests/src/UnitTest/Tests/ParagraphTest.as
@@ -18,96 +18,62 @@
 ////////////////////////////////////////////////////////////////////////////////
 package UnitTest.Tests
 {
+	import UnitTest.ExtendedClasses.TestConfigurationLoader;
+	import UnitTest.ExtendedClasses.VellumTestCase;
+	import UnitTest.Fixtures.TestCaseVo;
+	import UnitTest.Fixtures.TestConfig;
 
-    import UnitTest.ExtendedClasses.TestSuiteExtended;
-    import UnitTest.ExtendedClasses.VellumTestCase;
-    import UnitTest.Fixtures.TestConfig;
-    
-    import flash.display.Bitmap;
-    import flash.display.BitmapData;
-    import flash.display.IBitmapDrawable;
-    import flash.events.*;
-    import flash.geom.Matrix;
-    import flash.geom.Rectangle;
-    import flash.text.engine.TabAlignment;
-    import flash.text.engine.TextLine;
-    import flash.utils.ByteArray;
-    
-    import flashx.textLayout.compose.TextFlowLine;
-    import flashx.textLayout.elements.*;
-    import flashx.textLayout.formats.*;
-    import flashx.textLayout.property.NumberPropertyHandler;
-    import flashx.textLayout.property.Property;
-    import flashx.textLayout.tlf_internal;
+	import flash.display.Bitmap;
+	import flash.display.BitmapData;
+	import flash.display.IBitmapDrawable;
+	import flash.events.*;
+	import flash.geom.Matrix;
+	import flash.geom.Rectangle;
+	import flash.text.engine.TabAlignment;
+	import flash.text.engine.TextLine;
+	import flash.utils.ByteArray;
 
-    import org.flexunit.asserts.assertTrue;
+	import flashx.textLayout.compose.TextFlowLine;
+	import flashx.textLayout.elements.*;
+	import flashx.textLayout.formats.*;
+	import flashx.textLayout.property.NumberPropertyHandler;
+	import flashx.textLayout.property.Property;
+	import flashx.textLayout.tlf_internal;
 
-    use namespace tlf_internal;
+	import org.flexunit.asserts.assertTrue;
 
+	use namespace tlf_internal;
+
+	[TestCase(order=40)]
+	[RunWith("org.flexunit.runners.Parameterized")]
  	public class ParagraphTest extends VellumTestCase
 	{
+		[DataPoints(loader=backgroundcolorchangeTestLoader)]
+		[ArrayElementType("UnitTest.Fixtures.TestCaseVo")]
+		public static var backgroundcolorchangeTestDp:Array;
 
-		public function ParagraphTest(methodName:String, testID:String, testConfig:TestConfig, testCaseXML:XML=null)
+		public static var backgroundcolorchangeTestLoader:TestConfigurationLoader = new TestConfigurationLoader("../../test/testCases/ParagraphTest.xml", "backgroundcolorchangeTest");
+
+		public function ParagraphTest()
 		{
-			super(methodName, testID, testConfig, testCaseXML);
+			super("", "ParagraphTest", TestConfig.getInstance());
 
+			metaData = {};
 			// Note: These must correspond to a Watson product area (case-sensitive)
 			metaData.productArea = "Text Container";
 		}
 
-		public static function suiteFromXML(testListXML:XML, testConfig:TestConfig, ts:TestSuiteExtended):void
- 		{
- 			var testCaseClass:Class = ParagraphTest;
- 			VellumTestCase.suiteFromXML(testCaseClass, testListXML, testConfig, ts);
- 		}
-
-		/* Unused private functions
-		private function getParaCount():uint  // return the number of paragraphs KJT
+		[Before]
+		override public function setUpTest():void
 		{
-
-			SelManager.selectAll();
-			var startOfPara:int = SelManager.anchorPosition;
-
-			var endOfPara:int = SelManager.activePosition;
-			var curCount:uint = 0;
-			var i:int;
-
-			for (i = startOfPara; i <= endOfPara; i++)
-			{
-				var para:Object = SelManager.textFlow.findAbsoluteParagraph(i);
-
-				if(i == ParagraphElement(para).parentRelativeStart){
-					curCount++;
-				}
-			}
-
-			return curCount;
+			super.setUpTest();
 		}
 
-		private function getAparaGraph(index:uint):ParagraphElement  // return a p by index KJT
+		[After]
+		override public function tearDownTest():void
 		{
-
-			SelManager.selectAll();
-			var arrayOfP:Array = new Array();
-			var startOfPara:int = SelManager.anchorPosition;
-
-			var endOfPara:int = SelManager.activePosition;
-			var curCount:uint = 0;
-			var i:int;
-
-			for (i = startOfPara; i <= endOfPara; i++)
-			{
-				var para:ParagraphElement = SelManager.textFlow.findAbsoluteParagraph(i);
-
-				if(i == para.parentRelativeStart){
-					arrayOfP.push(para);
-					curCount++;
-				}
-			}
-
-			return ParagraphElement(arrayOfP[index]);
+			super.tearDownTest();
 		}
-		*/
 
 		/* ************************************************************** */
 		/* Alignment Tests */
@@ -117,6 +83,7 @@
 		 * Get a short selection and set the alignment to left align and
 		 * check that it is set correctly.
 		 */
+		[Test]
 		public function alignLeftTest():void
 		{
 			// Set the selection.
@@ -133,6 +100,7 @@
 		 * Get a short selection and set the alignment to right align and
 		 * check that it is set correctly.
 		 */
+		[Test]
 		public function alignRightTest():void
 		{
 			// Set the selection.
@@ -149,6 +117,7 @@
 		 * Set the alignment to right align for all of the text and
 		 * check that it is set correctly.
 		 */
+		[Test]
 		public function alignAllRightTest():void
 		{
 			// Set the selection /
@@ -165,6 +134,7 @@
 		 * Set the alignment to START align for all of the text and
 		 * check that it is set correctly.
 		 */
+		[Test]
 		public function alignStartTest():void
 		{
 			// Set the selection.
@@ -181,6 +151,7 @@
 		 * Set the alignment to END align for all of the text and
 		 * check that it is set correctly.
 		 */
+		[Test]
 		public function alignEndTest():void
 		{
 			// Set the selection.
@@ -198,6 +169,7 @@
 		 * Get a short selection and set the alignment to center align and
 		 * check that it is set correctly.
 		 */
+		[Test]
 		public function alignCenterTest():void
 		{
 			// Set the selection.
@@ -215,6 +187,7 @@
 		 * Get a short selection and set the alignment to justify "all including last" and
 		 * check that it is set correctly.
 		 */
+		[Test]
 		public function alignJustifyAllTest():void
 		{
 			// Set the selection.
@@ -233,6 +206,7 @@
 		 * Get a short selection and set the alignment to justify "all but last" and
 		 * check that it is set correctly.
 		 */
+		[Test]
 		public function alignJustifyAllButLastTest():void
 		{
 			// Set the selection.
@@ -249,6 +223,7 @@
 		 * Get a short selection and set the alignment to justify with last line start, end, left, center, right and
 		 * check that it is set correctly.
 		 */
+		[Test]
 		public function justifyWithLastLineStart():void
 		{
 			// Set the selection.
@@ -265,6 +240,7 @@
 				getAlignmentLast() == TextAlign.START);
 		}
 
+		[Test]
 		public function justifyWithLastlineEnd():void
 		{
 			var startIndx:int = 10;
@@ -280,6 +256,7 @@
 				getAlignmentLast() == TextAlign.END);
 		}
 
+		[Test]
 		public function justifyWithLastlineLeft():void
 		{
 
@@ -296,6 +273,7 @@
 				getAlignmentLast() == TextAlign.LEFT);
 		}
 
+		[Test]
 		public function justifyWithLastlineCenter():void
 		{
 			var startIndx:int = 10;
@@ -311,6 +289,7 @@
 				getAlignmentLast() == TextAlign.CENTER);
 		}
 
+		[Test]
 		public function justifyWithLastlineRight():void
 		{
 			var startIndx:int = 10;
@@ -326,7 +305,8 @@
 				getAlignmentLast() == TextAlign.RIGHT);
 		}
 
-		public function OnlyLastlineSet():void
+		[Test]
+		public function onlyLastlineSet():void
 		{
 			var startIndx:int = 10;
 			var endIndx:int = 20;
@@ -344,6 +324,7 @@
 		 * Get a short selection and set the textJustify to INTER_WORD and
 		 * check that it is set correctly.
 		 */
+		[Test]
 		public function justifyInterWordTest():void
 		{
 			// Set the selection.
@@ -363,25 +344,30 @@
 		 *
 		 * Test with both last line set to JUSTIFY and to LEFT.
 		 */
+		[Test]
 		public function justifyLetterSpacingFirstLine():void
 		{
 			justifyInterWordVsDistributeCore(false, false);
 			justifyInterWordVsDistributeCore(false, true);
 		}
+
 		/**
 		 * Set textJustify to INTER_WORD and DISTRIBUTE and verify
 		 * that the spacing between glyphs is different on last line
 		 * with last line set to JUSTIFY
 		 */
+		[Test]
 		public function justifyLetterSpacingLastLineJustify():void
 		{
 			justifyInterWordVsDistributeCore(true, true);
 		}
+
 		/**
 		 * Set textJustify to INTER_WORD and DISTRIBUTE and verify
 		 * that the spacing between glyphs is not different on last line
 		 * with last line justification set to LEFT
 		 */
+		[Test]
 		public function justifyLetterSpacingLastLineNoJustify():void
 		{
 			justifyInterWordVsDistributeCore(true, false);
@@ -422,7 +408,7 @@
 			}
 
 
-			var xPosInterWord:Array = new Array();
+			var xPosInterWord:Array = [];
 
 			// Collect the x coordinates for each glyph
 			for ( var i:int = 0; i < line.atomCount; i++)
@@ -442,7 +428,7 @@
 				line = SelManager.textFlow.flowComposer.getLineAt(0).getTextLine(true);
 			}
 
-			var xPosDistribute:Array = new Array();
+			var xPosDistribute:Array = [];
 
 			// Collect the x coordinates for each glyph
 			for ( i = 0; i < line.atomCount; i++)
@@ -481,6 +467,7 @@
 		 * Get a short selection and set the textJustify to DISTRIBUTE and
 		 * check that it is set correctly.
 		 */
+		[Test]
 		public function justifyDistributeTest():void
 		{
 			// Set the selection.
@@ -589,6 +576,7 @@
 		/**
 		 * Set an indent of ten and check that it is set correctly.
 		 */
+		[Test]
 		public function setIndentPositiveTest():void
 		{
 			setIndent(10);
@@ -598,6 +586,7 @@
 		/**
 		 * Set an indent of negative ten and check that it is set correctly.
 		 */
+		[Test]
 		public function setIndentNegativeTest():void
 		{
 			setIndent(-10);
@@ -643,6 +632,7 @@
 		/**
 		 * Set a left margin of ten and check that it is set correctly.
 		 */
+		[Test]
 		public function setLeftMarginPositiveTest():void
 		{
 			setLeftMargin(10);
@@ -653,6 +643,7 @@
 		 * Set a left margin of negative ten and check that it is set to zero
 		 * (i.e. no negative left margins).
 		 */
+		[Test]
 		public function setLeftMarginNegativeTest():void
 		{
 			setLeftMargin(-10,true);
@@ -717,6 +708,7 @@
 		/**
 		 * Set a right margin of ten and check that it is set correctly.
 		 */
+		[Test]
 		public function setRightMarginPositiveTest():void
 		{
 			setRightMargin(10);
@@ -727,6 +719,7 @@
 		 * Set a right margin of negative ten and check that it is set to zero
 		 * (i.e. no negative right margins).
 		 */
+		[Test]
 		public function setRightMarginNegativeTest():void
 		{
 			setRightMargin(-10,true);
@@ -786,6 +779,7 @@
 		/**
 		 * Set space before value to twenty-five and check that it is set correctly.
 		 */
+		[Test]
 		public function setSpaceBeforePositiveTest():void
 		{
 			setSpaceBefore(25);
@@ -796,6 +790,7 @@
 		 * Set space before value to negative fifty and check that it is zero
 		 * (i.e. no negative space before values).
 		 */
+		[Test]
 		public function setSpaceBeforeNegativeTest():void
 		{
 			setSpaceBefore(-50,true);
@@ -853,6 +848,7 @@
 		/**
 		 * Set space after value to twenty-five and check that it is set correctly.
 		 */
+		[Test]
 		public function setSpaceAfterPositiveTest():void
 		{
 			setSpaceAfter(25);
@@ -863,6 +859,8 @@
 		 * Set space after value to negative fifty and check that it is zero
 		 * (i.e. no negative space after values).
 		 */
+		[Test]
+		[Ignore]
 		public function setSpaceAfterNegativeTest():void
 		{
 			setSpaceAfter(-50);
@@ -902,6 +900,7 @@
 			return success;
 		}
 
+		[Test]
 		public function joinParagraphsTest():void
 		{
 			var flow1:FlowElement;
@@ -995,6 +994,7 @@
 		 * Set the size of the text and autoleading, then change them and make sure that the
 		 * leading is the correct value.
 		 */
+		[Test]
 		public function autoLeadingTest():void
 		{
 			const acceptableErrorAmt:Number = .02;
@@ -1082,6 +1082,7 @@
 		 * Create an empty paragraph and set its attributes. Then insert text and see if
 		 * the paragraph still has its attributes.
 		 */
+		[Test]
 		public function paragraphAttributeRetentionTest():void
 		{
 			SelManager.selectRange(0,0);
@@ -1117,6 +1118,7 @@
 		 * property left is the one you set to a different value, and ensure no other
 		 * values remain.
 		 */
+		[Test]
 		public function paragraphAttributeRemovalTest():void
 		{
 			var desc:Object = TextLayoutFormat.description;
@@ -1124,9 +1126,9 @@
 			var pa:TextLayoutFormat = new TextLayoutFormat();
 			var handler:NumberPropertyHandler;
 
-			var good:Array = new Array();
+			var good:Array = [];
 			for each (var prop:Property in desc){
-				handler = prop.findHandler(NumberPropertyHandler) as NumberPropertyHandler
+				handler = prop.findHandler(NumberPropertyHandler) as NumberPropertyHandler;
 				if (handler)
 				{
 					var name:String = prop.name;
@@ -1172,6 +1174,7 @@
 		 * Create an empty paragraph at the end of a text flow and see if the
 		 * character attributes from the previous paragraph have been applied to it.
 		 */
+		[Test]
 		public function characterAttributeRetentionTest():void
 		{
 			var length:int = SelManager.textFlow.textLength - 1;
@@ -1206,6 +1209,7 @@
 		/**
 		 * Validate parsing of string-based tabStops syntax
 		 */
+		[Test]
 		public function tabStopsStringFormTest():void
 		{
 			var pa:TextLayoutFormat = new TextLayoutFormat();
@@ -1235,9 +1239,12 @@
 		   deselect the text and note how light it is. Click in the first paragraph and start typing.  Note that with each keystroke
 		   the background color appears darker.
 		*/
-
-		public function backgroundcolorchangeTest():void
+		[Test(dataProvider=backgroundcolorchangeTestDp)]
+		public function backgroundcolorchangeTest(testCaseVo:TestCaseVo):void
 		{
+			TestData.fileName = testCaseVo.fileName;
+			setUpTest();
+
 			var insertPoint:int = 14;
     		var tlf:TextLayoutFormat = new TextLayoutFormat();
    			tlf.backgroundColor = 0xFF00FF;
@@ -1309,15 +1316,16 @@
 
 		/* this is for testing the bug 2371905.  Final Empty Paragraph Shows No Selection When Block Selected
 		*/
-
-		public function FinalEmptyParaTest():void
+		[Test(dataProvider=backgroundcolorchangeTestDp)]
+		public function FinalEmptyParaTest(testCaseVo:TestCaseVo):void
 		{
+			TestData.fileName = testCaseVo.fileName;
+			setUpTest();
+
 			var insertPoint:int = 14;
-    		var tlf:TextLayoutFormat = new TextLayoutFormat();
 
     		SelManager.selectRange(0,0);
-   			SelManager.insertText("This is a test" +
-               "            ");
+   			SelManager.insertText("This is a test" + "            ");
    		    SelManager.selectRange(insertPoint, insertPoint);
     		SelManager.splitParagraph();
   		    var tf:TextFlow = SelManager.textFlow;
