diff --git a/automation_tests/src/AllTestsSuite.as b/automation_tests/src/AllTestsSuite.as
index 0b186d5..9690325 100644
--- a/automation_tests/src/AllTestsSuite.as
+++ b/automation_tests/src/AllTestsSuite.as
@@ -38,6 +38,7 @@
     import UnitTest.Tests.FlowModelTest;
     import UnitTest.Tests.GeneralFunctionsTest;
     import UnitTest.Tests.HorizontalScrollingTest;
+    import UnitTest.Tests.ImpliedParagraphTest;
     import UnitTest.Tests.OperationTest;
     import UnitTest.Tests.ScrollingTest;
     import UnitTest.Tests.TabTest;
@@ -74,6 +75,7 @@
         public var textFlowEditTest:TextFlowEditTest;
         public var tabTest:TabTest;
         public var horizontalScrollingTest:HorizontalScrollingTest;
+        public var impliedParagraphTest:ImpliedParagraphTest;
     }
 
 }
diff --git a/automation_tests/src/UnitTest/Tests/HorizontalScrollingTest.as b/automation_tests/src/UnitTest/Tests/HorizontalScrollingTest.as
index 9d94d66..c07096a 100644
--- a/automation_tests/src/UnitTest/Tests/HorizontalScrollingTest.as
+++ b/automation_tests/src/UnitTest/Tests/HorizontalScrollingTest.as
@@ -106,7 +106,7 @@
 
         public function HorizontalScrollingTest()
         {
-            super("", "TabTest", TestConfig.getInstance());
+            super("", "HorizontalScrollingTest", TestConfig.getInstance());
 
             metaData = {};
             // Note: These must correspond to a Watson product area (case-sensitive)
diff --git a/automation_tests/src/UnitTest/Tests/ImpliedParagraphTest.as b/automation_tests/src/UnitTest/Tests/ImpliedParagraphTest.as
index 4d0c3fe..645c1c1 100644
--- a/automation_tests/src/UnitTest/Tests/ImpliedParagraphTest.as
+++ b/automation_tests/src/UnitTest/Tests/ImpliedParagraphTest.as
@@ -18,83 +18,121 @@
 ////////////////////////////////////////////////////////////////////////////////
 package UnitTest.Tests
 {
-	import UnitTest.ExtendedClasses.TestSuiteExtended;
-	import UnitTest.ExtendedClasses.VellumTestCase;
-	import UnitTest.Fixtures.TestConfig;
-	
-	import flashx.textLayout.conversion.ConversionType;
-	import flashx.textLayout.conversion.ITextExporter;
-	import flashx.textLayout.conversion.ITextImporter;
-	import flashx.textLayout.conversion.TextConverter;
-	import flashx.textLayout.elements.TextFlow;
+    import UnitTest.ExtendedClasses.TestConfigurationLoader;
+    import UnitTest.ExtendedClasses.VellumTestCase;
+    import UnitTest.Fixtures.TestCaseVo;
+    import UnitTest.Fixtures.TestConfig;
+
+    import flashx.textLayout.conversion.ConversionType;
+    import flashx.textLayout.conversion.ITextExporter;
+    import flashx.textLayout.conversion.ITextImporter;
+    import flashx.textLayout.conversion.TextConverter;
+    import flashx.textLayout.elements.TextFlow;
 
     import org.flexunit.asserts.assertTrue;
 
+    [TestCase(order=26)]
+    [RunWith("org.flexunit.runners.Parameterized")]
     public class ImpliedParagraphTest extends VellumTestCase
-	{
-		public function ImpliedParagraphTest(methodName:String, testID:String, testConfig:TestConfig, testCaseXML:XML=null)
-		{
-			super(methodName, testID, testConfig, testCaseXML);
-		}
-		public static function suiteFromXML(testListXML:XML, testConfig:TestConfig, ts:TestSuiteExtended):void
- 		{
- 			var testCaseClass:Class = ImpliedParagraphTest;
- 			VellumTestCase.suiteFromXML(testCaseClass, testListXML, testConfig, ts);
- 		}
+    {
+        private const inputString1:String = '<i>Italic</i> Plain <i>Italic</i> Plain <b>Bold</b>';
+        private const inputString2:String = '<b>Bold</b> <i>Italic</i> Plain <i>Italic</i> Plain <b>Bold</b>';
+        private const inputString3:String = '<i><b>BoldItalic</b></i> Plain <i>Italic</i> Plain <b>Bold</b>';
+        private const inputString4:String = '<textformat leading="200%"><i><b>BoldItalic</b></i> </textformat>Plain <i>Italic</i> Plain <b>Bold</b>';
+        private const inputString5:String = '<p>asdf</p><b>bold</b><i>italic</i><p>qwerty</p>';
+        private const inputString6:String = 'Plain <b>Bold</b> <i>Italic</i> Plain <i>Italic</i> Plain <b>Bold</b>';
+        private const outputString1:String = '<p><span fontStyle="italic">Italic</span><span> Plain </span><span fontStyle="italic">Italic</span><span> Plain </span><span fontWeight="bold">Bold</span></p>';
+        private const outputString2:String = '<p><span fontWeight="bold">Bold</span><span> </span><span fontStyle="italic">Italic</span><span> Plain </span><span fontStyle="italic">Italic</span><span> Plain </span><span fontWeight="bold">Bold</span></p>';
+        private const outputString3:String = '<p><span fontStyle="italic" fontWeight="bold">BoldItalic</span><span> Plain </span><span fontStyle="italic">Italic</span><span> Plain </span><span fontWeight="bold">Bold</span></p>';
+        private const outputString4:String = '<p leadingModel="approximateTextField" lineHeight="200%"><span fontStyle="italic" fontWeight="bold">BoldItalic</span><span> Plain </span><span fontStyle="italic">Italic</span><span> Plain </span><span fontWeight="bold">Bold</span></p>';
+        private const outputString5:String = '<p><span>asdf</span></p><p><span fontWeight="bold">bold</span><span fontStyle="italic">italic</span></p><p><span>qwerty</span></p>';
+        private const outputString6:String = '<p><span>Plain </span><span fontWeight="bold">Bold</span><span> </span><span fontStyle="italic">Italic</span><span> Plain </span><span fontStyle="italic">Italic</span><span> Plain </span><span fontWeight="bold">Bold</span></p>';
 
-		private const inputString1:String = '<i>Italic</i> Plain <i>Italic</i> Plain <b>Bold</b>';
-		private const inputString2:String = '<b>Bold</b> <i>Italic</i> Plain <i>Italic</i> Plain <b>Bold</b>';
-		private const inputString3:String = '<i><b>BoldItalic</b></i> Plain <i>Italic</i> Plain <b>Bold</b>';
-		private const inputString4:String = '<textformat leading="200%"><i><b>BoldItalic</b></i> </textformat>Plain <i>Italic</i> Plain <b>Bold</b>';
-		private const inputString5:String = '<p>asdf</p><b>bold</b><i>italic</i><p>qwerty</p>';
-		private const inputString6:String = 'Plain <b>Bold</b> <i>Italic</i> Plain <i>Italic</i> Plain <b>Bold</b>';
-		private const outputString1:String = '<p><span fontStyle="italic">Italic</span><span> Plain </span><span fontStyle="italic">Italic</span><span> Plain </span><span fontWeight="bold">Bold</span></p>';
-		private const outputString2:String = '<p><span fontWeight="bold">Bold</span><span> </span><span fontStyle="italic">Italic</span><span> Plain </span><span fontStyle="italic">Italic</span><span> Plain </span><span fontWeight="bold">Bold</span></p>';
-		private const outputString3:String = '<p><span fontStyle="italic" fontWeight="bold">BoldItalic</span><span> Plain </span><span fontStyle="italic">Italic</span><span> Plain </span><span fontWeight="bold">Bold</span></p>';
-		private const outputString4:String = '<p leadingModel="approximateTextField" lineHeight="200%"><span fontStyle="italic" fontWeight="bold">BoldItalic</span><span> Plain </span><span fontStyle="italic">Italic</span><span> Plain </span><span fontWeight="bold">Bold</span></p>';
-		private const outputString5:String = '<p><span>asdf</span></p><p><span fontWeight="bold">bold</span><span fontStyle="italic">italic</span></p><p><span>qwerty</span></p>';
-		private const outputString6:String = '<p><span>Plain </span><span fontWeight="bold">Bold</span><span> </span><span fontStyle="italic">Italic</span><span> Plain </span><span fontStyle="italic">Italic</span><span> Plain </span><span fontWeight="bold">Bold</span></p>';
-		private var textImporter:ITextImporter = TextConverter.getImporter(TextConverter.TEXT_FIELD_HTML_FORMAT);
-		private var textExporter:ITextExporter = TextConverter.getExporter(TextConverter.TEXT_LAYOUT_FORMAT);
-		
-		public function runTheTest(inString:String, outString:String):void
-		{
-			var textFlow:TextFlow = textImporter.importToFlow(inString);
-			var markupResult:String = textExporter.export(textFlow, ConversionType.STRING_TYPE) as String;
-			var startIndex:int = markupResult.search("<p");
-			var endIndex:int = markupResult.search("</TextFlow>");
-			var expectedString:String = markupResult.substring(startIndex, endIndex);
-			assertTrue("TLF model did not match expected result",  expectedString == outString);
-		}
-		
-		public function impliedParagraphHTMLImportTest1():void
+        [DataPoints(loader=impliedParagraphHTMLImportTest1Loader)]
+        [ArrayElementType("UnitTest.Fixtures.TestCaseVo")]
+        public static var impliedParagraphHTMLImportTest1Dp:Array;
+
+        public static var impliedParagraphHTMLImportTest1Loader:TestConfigurationLoader = new TestConfigurationLoader("../../test/testCases/ImpliedParagraphTest.xml", "impliedParagraphHTMLImportTest1");
+
+        private var textImporter:ITextImporter = TextConverter.getImporter(TextConverter.TEXT_FIELD_HTML_FORMAT);
+        private var textExporter:ITextExporter = TextConverter.getExporter(TextConverter.TEXT_LAYOUT_FORMAT);
+
+        public function ImpliedParagraphTest()
         {
-			runTheTest(inputString1, outputString1);
-		}
-		
-		public function impliedParagraphHTMLImportTest2():void
-		{
-			runTheTest(inputString2, outputString2);
-		}
-		
-		public function impliedParagraphHTMLImportTest3():void
-		{
-			runTheTest(inputString3, outputString3);
-		}
-		
-		public function impliedParagraphHTMLImportTest4():void
-		{
-			runTheTest(inputString4, outputString4);
-		}
-		
-		public function impliedParagraphHTMLImportTest5():void
-		{
-			runTheTest(inputString5, outputString5);
-		}
-		
-		public function impliedParagraphHTMLImportTest6():void
-		{
-			runTheTest(inputString6, outputString6);
-		}
-	}
+            super("", "ImpliedParagraphTest", TestConfig.getInstance());
+
+            metaData = {};
+        }
+
+        [After]
+        public override function tearDownTest():void
+        {
+            // Restore default configurations
+            super.tearDownTest();
+        }
+
+        [Test(dataProvider=impliedParagraphHTMLImportTest1Dp)]
+        public function impliedParagraphHTMLImportTest1(testCaseVo:TestCaseVo):void
+        {
+            TestData.fileName = testCaseVo.fileName;
+            super.setUpTest();
+
+            runTheTest(inputString1, outputString1);
+        }
+
+        [Test(dataProvider=impliedParagraphHTMLImportTest1Dp)]
+        public function impliedParagraphHTMLImportTest2(testCaseVo:TestCaseVo):void
+        {
+            TestData.fileName = testCaseVo.fileName;
+            super.setUpTest();
+
+            runTheTest(inputString2, outputString2);
+        }
+
+        [Test(dataProvider=impliedParagraphHTMLImportTest1Dp)]
+        public function impliedParagraphHTMLImportTest3(testCaseVo:TestCaseVo):void
+        {
+            TestData.fileName = testCaseVo.fileName;
+            super.setUpTest();
+
+            runTheTest(inputString3, outputString3);
+        }
+
+        [Test(dataProvider=impliedParagraphHTMLImportTest1Dp)]
+        public function impliedParagraphHTMLImportTest4(testCaseVo:TestCaseVo):void
+        {
+            TestData.fileName = testCaseVo.fileName;
+            super.setUpTest();
+
+            runTheTest(inputString4, outputString4);
+        }
+
+        [Test(dataProvider=impliedParagraphHTMLImportTest1Dp)]
+        public function impliedParagraphHTMLImportTest5(testCaseVo:TestCaseVo):void
+        {
+            TestData.fileName = testCaseVo.fileName;
+            super.setUpTest();
+
+            runTheTest(inputString5, outputString5);
+        }
+
+        [Test(dataProvider=impliedParagraphHTMLImportTest1Dp)]
+        public function impliedParagraphHTMLImportTest6(testCaseVo:TestCaseVo):void
+        {
+            TestData.fileName = testCaseVo.fileName;
+            super.setUpTest();
+
+            runTheTest(inputString6, outputString6);
+        }
+
+        private function runTheTest(inString:String, outString:String):void
+        {
+            var textFlow:TextFlow = textImporter.importToFlow(inString);
+            var markupResult:String = textExporter.export(textFlow, ConversionType.STRING_TYPE) as String;
+            var startIndex:int = markupResult.search("<p");
+            var endIndex:int = markupResult.search("</TextFlow>");
+            var expectedString:String = markupResult.substring(startIndex, endIndex);
+            assertTrue("TLF model did not match expected result", expectedString == outString);
+        }
+    }
 }
