diff --git a/automation_apps/src/VellumUnit.mxml b/automation_apps/src/VellumUnit.mxml
index 0406451..dc21fbd 100644
--- a/automation_apps/src/VellumUnit.mxml
+++ b/automation_apps/src/VellumUnit.mxml
@@ -40,7 +40,6 @@
         import flashx.textLayout.elements.TextFlow;
         import flashx.textLayout.tlf_internal;
 
-        import mx.collections.ArrayCollection;
         import mx.managers.SystemManager;
         import mx.managers.systemClasses.MarshallingSupport;
         import mx.utils.LoaderUtil;
@@ -52,11 +51,7 @@
         // import AND instantiate MarshallingSupport.  Enables being loaded as a sub-swf and loading a sub-swf with marshall plan features
         MarshallingSupport;
 
-        private var socket:XMLSocket;
         private var curDialog:Object;
-        //TODO: Remove
-        //  private var treeData:XMLList;
-        private var testCasesList:ArrayCollection;
         private var useTestSelectDialog:Boolean = false;
 
         public var testMachineName:String = "unspecified";
@@ -82,9 +77,6 @@
 
         private var curURL:String;
 
-        private var myXMLURL:URLRequest = new URLRequest();
-        private var urlReqSnapShotStore:URLRequest = new URLRequest();
-
         private var curSnapshotTypeToStore:String;
         private var tryToStoreCount:Number = 0;
         private var maxTryToStoreCount:Number = 5;
@@ -337,6 +329,7 @@
         public function handleCreationComplete():void
         {
             normalizedURL = LoaderUtil.normalizeURL(loaderInfo);
+            TestConfig.getInstance().normalizedUrl = normalizedURL;
             // if we're in the AIR runtime, we get app:/VellumUnit.swf instead of
             // a file:/// URL. This checks for that and changes it to file:///
             if (normalizedURL.charAt(0) == "a")
diff --git a/automation_core/src/UnitTest/ExtendedClasses/TestConfigurationLoader.as b/automation_core/src/UnitTest/ExtendedClasses/TestConfigurationLoader.as
new file mode 100644
index 0000000..9e47a35
--- /dev/null
+++ b/automation_core/src/UnitTest/ExtendedClasses/TestConfigurationLoader.as
@@ -0,0 +1,83 @@
+/**
+ * Created by Hellix on 2015-02-22.
+ */
+package UnitTest.ExtendedClasses
+{
+    import UnitTest.Fixtures.TestCaseVo;
+    import UnitTest.Fixtures.TestConfig;
+
+    import mx.rpc.AsyncToken;
+    import mx.rpc.IResponder;
+
+    import mx.rpc.http.HTTPService;
+    import mx.utils.LoaderUtil;
+
+    import org.flexunit.runner.external.ExternalDependencyToken;
+    import org.flexunit.runner.external.IExternalDependencyLoader;
+
+    public class TestConfigurationLoader implements IExternalDependencyLoader, IResponder
+    {
+        private var httpService:HTTPService;
+        private var token:ExternalDependencyToken;
+        private var testName:String;
+
+        public function TestConfigurationLoader(fileName:String, testName:String)
+        {
+            if (!TestConfig.getInstance().testConfigData)
+            {
+                httpService = new HTTPService();
+                httpService.url = LoaderUtil.createAbsoluteURL(TestConfig.getInstance().normalizedUrl, fileName);
+                httpService.resultFormat = "e4x";
+            }
+            this.token = new ExternalDependencyToken();
+            this.testName = testName;
+        }
+
+        public function retrieveDependency(testClass:Class):ExternalDependencyToken
+        {
+            var asyncToken:AsyncToken = httpService ? httpService.send() : new AsyncToken();
+            asyncToken.addResponder(this);
+
+            return token;
+        }
+
+        public function result(data:Object):void
+        {
+            var dp:Array = null;
+            if (httpService && data.result)
+            {
+                TestConfig.getInstance().testConfigData = data.result;
+                dp = parseTestConfigData(data.result);
+            }
+            else
+            {
+                dp = parseTestConfigData(TestConfig.getInstance().testConfigData);
+            }
+
+            token.notifyResult(dp);
+        }
+
+        public function fault(info:Object):void
+        {
+            token.notifyFault("Unable to load data tests");
+        }
+
+        private function parseTestConfigData(xmlData:XML):Array
+        {
+            var testConfigData:Array = [];
+            var testCases:XMLList = xmlData.TestCase.(@functionName == testName);
+            for each (var testCase:XML in testCases)
+            {
+                var testsData:XMLList = testCase.TestData;
+                var testCaseVo:TestCaseVo = new TestCaseVo(testCase.@functionName);
+                for each (var testData:XML in testsData)
+                {
+                    testCaseVo[testData.@name] = testData.toString();
+                }
+                testConfigData.push([testCaseVo]);
+            }
+
+            return testConfigData;
+        }
+    }
+}
diff --git a/automation_core/src/UnitTest/Fixtures/TestCaseVo.as b/automation_core/src/UnitTest/Fixtures/TestCaseVo.as
new file mode 100644
index 0000000..ac43822
--- /dev/null
+++ b/automation_core/src/UnitTest/Fixtures/TestCaseVo.as
@@ -0,0 +1,20 @@
+/**
+ * Created by Hellix on 2015-02-22.
+ */
+package UnitTest.Fixtures
+{
+    public dynamic class TestCaseVo
+    {
+        private var _testName:String;
+
+        public function TestCaseVo(testName:String)
+        {
+            this._testName = testName;
+        }
+
+        public function get testName():String
+        {
+            return _testName;
+        }
+    }
+}
diff --git a/automation_core/src/UnitTest/Fixtures/TestConfig.as b/automation_core/src/UnitTest/Fixtures/TestConfig.as
index 69e7574..eb0879b 100644
--- a/automation_core/src/UnitTest/Fixtures/TestConfig.as
+++ b/automation_core/src/UnitTest/Fixtures/TestConfig.as
@@ -34,6 +34,9 @@
 		public var flashVersion:String = Capabilities.version.substr(4,4);
         public var testXMLStore:XML;
 
+        public var testConfigData:XML;
+        public var normalizedUrl:String;
+
 		public function TestConfig(testConfigEnforcer:TestConfigEnforcer)
 		{
             if (testConfigEnforcer == null)
diff --git a/automation_tests/src/UnitTest/Tests/ContainerAttributeTest.as b/automation_tests/src/UnitTest/Tests/ContainerAttributeTest.as
index f44c2e0..cbe47af 100644
--- a/automation_tests/src/UnitTest/Tests/ContainerAttributeTest.as
+++ b/automation_tests/src/UnitTest/Tests/ContainerAttributeTest.as
@@ -18,7 +18,9 @@
 ////////////////////////////////////////////////////////////////////////////////
 package UnitTest.Tests
 {
+    import UnitTest.ExtendedClasses.TestConfigurationLoader;
     import UnitTest.ExtendedClasses.VellumTestCase;
+    import UnitTest.Fixtures.TestCaseVo;
     import UnitTest.Fixtures.TestConfig;
 
     import flash.display.BitmapData;
@@ -53,72 +55,61 @@
 
     use namespace tlf_internal;
 
+    /**
+     * Class is using mechanism IExternalDependencyLoader.
+     * Data providers with loaded data are shared between test methods
+     */
     [TestCase(order=15)]
     [RunWith("org.flexunit.runners.Parameterized")]
     public class ContainerAttributeTest extends VellumTestCase
     {
-        public static var dataProvider1:Array = [
-            [
-                {testContainer: true, minimal: true, blockProgression: BlockProgression.RL, direction: Direction.RTL, bitmapSnapshot: false}
-            ],
-            [
-                {testContainer: false, minimal: true, blockProgression: BlockProgression.RL, direction: Direction.RTL, bitmapSnapshot: false}
-            ],
-        ];
+        [DataPoints(loader="checkColumnWidthOnGapChangeTestLoader")]
+        [ArrayElementType("UnitTest.Fixtures.TestCaseVo")]
+        public static var checkColumnWidthOnGapChangeTestDp:Array;
 
-        public static var dataProvider2:Array = [
-            [
-                {testContainer: false, minimal: false, blockProgression: BlockProgression.RL, direction: Direction.RTL, bitmapSnapshot: false}
-            ],
-            [
-                {testContainer: false, minimal: true, blockProgression: BlockProgression.TB, direction: Direction.RTL, bitmapSnapshot: true}
-            ],
-        ];
+        public static var checkColumnWidthOnGapChangeTestLoader:TestConfigurationLoader =  new TestConfigurationLoader("../../test/testCases/ContainerAttributeTests.xml", "checkColumnWidthOnGapChangeTest");
 
-        public static var dataProvider3:Array = [
-            [
-                {testContainer: true, minimal: true, blockProgression: BlockProgression.TB, direction: Direction.RTL, bitmapSnapshot: true}
-            ],
-            [
-                {testContainer: true, minimal: false, blockProgression: BlockProgression.RL, direction: Direction.RTL, bitmapSnapshot: true}
-            ],
-        ];
+        [DataPoints(loader="checkVerticalAlignTopTestLoader")]
+        [ArrayElementType("UnitTest.Fixtures.TestCaseVo")]
+        public static var checkVerticalAlignTopTestDp:Array;
 
-        public static var dataProvider4:Array = [
-            [
-                {testContainer: true, minimal: true, blockProgression: BlockProgression.RL, direction: Direction.RTL, bitmapSnapshot: true}
-            ],
-            [
-                {testContainer: false, minimal: false, blockProgression: BlockProgression.RL, direction: Direction.RTL, bitmapSnapshot: true}
-            ],
-        ];
+        public static var checkVerticalAlignTopTestLoader:TestConfigurationLoader =  new TestConfigurationLoader("../../test/testCases/ContainerAttributeTests.xml", "checkVerticalAlignTopTest");
 
-        public static var dataProvider5:Array = [
-            [
-                {testContainer: false, minimal: true, blockProgression: BlockProgression.RL, direction: Direction.RTL, bitmapSnapshot: true}
-            ],
-            [
-                {testContainer: false, minimal: false, blockProgression: BlockProgression.TB, direction: Direction.LTR, bitmapSnapshot: true}
-            ],
-        ];
+        [DataPoints(loader="checkVerticalAlignBottomTestLoader")]
+        [ArrayElementType("UnitTest.Fixtures.TestCaseVo")]
+        public static var checkVerticalAlignBottomTestDp:Array;
 
-        public static var dataProvider6:Array = [
-            [
-                {testContainer: false, minimal: true, blockProgression: BlockProgression.RL, direction: Direction.RTL, bitmapSnapshot: true}
-            ],
-            [
-                {testContainer: false, minimal: false, blockProgression: BlockProgression.TB, direction: Direction.LTR, bitmapSnapshot: false}
-            ],
-        ];
+        public static var checkVerticalAlignBottomTestLoader:TestConfigurationLoader =  new TestConfigurationLoader("../../test/testCases/ContainerAttributeTests.xml", "checkVerticalAlignBottomTest");
 
-        public static var dataProvider7:Array = [
-            [
-                {testContainer: false, minimal: true, blockProgression: BlockProgression.RL, direction: Direction.RTL, bitmapSnapshot: true}
-            ],
-            [
-                {testContainer: false, minimal: false, blockProgression: BlockProgression.TB, direction: Direction.RTL, bitmapSnapshot: false}
-            ],
-        ];
+        [DataPoints(loader="leftPaddingSqueezeTestLoader")]
+        [ArrayElementType("UnitTest.Fixtures.TestCaseVo")]
+        public static var leftPaddingSqueezeTestDp:Array;
+
+        public static var leftPaddingSqueezeTestLoader:TestConfigurationLoader =  new TestConfigurationLoader("../../test/testCases/ContainerAttributeTests.xml", "leftPaddingSqueezeTest");
+
+        [DataPoints(loader="checkVerticalAlignMiddleTestLoader")]
+        [ArrayElementType("UnitTest.Fixtures.TestCaseVo")]
+        public static var checkVerticalAlignMiddleTestDp:Array;
+
+        public static var checkVerticalAlignMiddleTestLoader:TestConfigurationLoader =  new TestConfigurationLoader("../../test/testCases/ContainerAttributeTests.xml", "checkVerticalAlignMiddleTest");
+
+        [DataPoints(loader="contentBoundsWithWhitespacesLoader")]
+        [ArrayElementType("UnitTest.Fixtures.TestCaseVo")]
+        public static var contentBoundsWithWhitespacesDp:Array;
+
+        public static var contentBoundsWithWhitespacesLoader:TestConfigurationLoader =  new TestConfigurationLoader("../../test/testCases/ContainerAttributeTests.xml", "ContentBoundsWithWhitespaces");
+
+        [DataPoints(loader="hBeamCursorTestLoader")]
+        [ArrayElementType("UnitTest.Fixtures.TestCaseVo")]
+        public static var hBeamCursorTestDp:Array;
+
+        public static var hBeamCursorTestLoader:TestConfigurationLoader =  new TestConfigurationLoader("../../test/testCases/ContainerAttributeTests.xml", "HBeamCursorTest");
+
+        [DataPoints(loader="topPaddingSqueezeTestLoader")]
+        [ArrayElementType("UnitTest.Fixtures.TestCaseVo")]
+        public static var topPaddingSqueezeTestDp:Array;
+
+        public static var topPaddingSqueezeTestLoader:TestConfigurationLoader =  new TestConfigurationLoader("../../test/testCases/ContainerAttributeTests.xml", "topPaddingSqueezeTest");
 
         private var testContainer:Boolean;
         private var inputContainerAttrs:TextLayoutFormat;
@@ -130,6 +121,7 @@
         public function ContainerAttributeTest()
         {
             super("", "ContainerAttributeTest", TestConfig.getInstance());
+
             this.testContainer = (TestData.testContainer == "true");
             TestID = TestID + ":" + testContainer;
             inputContainerAttrs = new TextLayoutFormat();
@@ -152,9 +144,9 @@
 
             testContainer = currentDpData.testContainer;
             TestData.bitmapSnapshot = currentDpData.bitmapSnapshot ? "true" : "false";
-            TestData.minimal = currentDpData.bitmapSnapshot ? "true" : "false";
-            writingDirection[0] = currentDpData.blockProgression == BlockProgression.RL ? BlockProgression.TB : BlockProgression.RL;
-            writingDirection[1] = currentDpData.direction == Direction.RTL ? Direction.LTR : Direction.LTR;
+            TestData.minimal = currentDpData.minimal ? "true" : "false";
+            writingDirection[0] = currentDpData.rl_ltr == "true" ? BlockProgression.TB : BlockProgression.RL;
+            writingDirection[1] = currentDpData.tb_rtl == "true" ?  Direction.LTR : Direction.RTL;
         }
 
         [After]
@@ -168,6 +160,11 @@
             super.tearDownTest();
         }
 
+        [AfterClass]
+        public static function tearItDown():void {
+            TestConfig.getInstance().testConfigData = null;
+        }
+
         private function set columnCount(count:Object):void
         {
             if (testContainer)
@@ -373,8 +370,8 @@
         /**
          * Set and get the firstBaselineOffset string values and test bound of numeric values.
          */
-        [Test(dataProvider=dataProvider1)]
-        public function checkfirstBaselineOffset(dpData:Object):void // KJT
+        [Test(dataProvider=checkColumnWidthOnGapChangeTestDp)]
+        public function checkfirstBaselineOffset(dpData:TestCaseVo):void // KJT
         {
             currentDpData = dpData;
             setUpTest();
@@ -444,8 +441,8 @@
         /**
          * Set the column count, then change the column gap and see how the column width changes.
          */
-        [Test(dataProvider=dataProvider1)]
-        public function checkColumnWidthOnGapChangeTest(dpData:Object):void
+        [Test(dataProvider=checkColumnWidthOnGapChangeTestDp)]
+        public function checkColumnWidthOnGapChangeTest(dpData:TestCaseVo):void
         {
             currentDpData = dpData;
             setUpTest();
@@ -474,8 +471,8 @@
         /**
          * Set the column gap, then change the column count to see how the column width changes.
          */
-        [Test(dataProvider=dataProvider1)]
-        public function checkColumnWidthOnCountChangeTest(dpData:Object):void
+        [Test(dataProvider=checkColumnWidthOnGapChangeTestDp)]
+        public function checkColumnWidthOnCountChangeTest(dpData:TestCaseVo):void
         {
             currentDpData = dpData;
             setUpTest();
@@ -508,9 +505,9 @@
         /**
          * Set the column count, then change the column width to see how the column gap changes.
          */
-        [Test(dataProvider=dataProvider1)]
+        [Test(dataProvider=checkColumnWidthOnGapChangeTestDp)]
         [Ignore]
-        public function checkColumnGapOnWidthChangeTest(dpData:Object):void
+        public function checkColumnGapOnWidthChangeTest(dpData:TestCaseVo):void
         {
             currentDpData = dpData;
             setUpTest();
@@ -543,8 +540,8 @@
          * Set the column width, then change the column count to see how the column gap changes.
          * NOTE: Currently commented out due to bug 1657149.
          */
-        [Test(dataProvider=dataProvider1)]
-        public function checkColumnGapOnCountChangeTest(dpData:Object):void
+        [Test(dataProvider=checkColumnWidthOnGapChangeTestDp)]
+        public function checkColumnGapOnCountChangeTest(dpData:TestCaseVo):void
         {
             currentDpData = dpData;
             setUpTest();
@@ -573,8 +570,8 @@
          * Slowly increase the padding at the top until it pushes a line off the screen
          * then verify that the last line was the line pushed off the screen.
          */
-        [Test(dataProvider=dataProvider4)]
-        public function topPaddingSqueezeTest(dpData:Object):void
+        [Test(dataProvider=topPaddingSqueezeTestDp)]
+        public function topPaddingSqueezeTest(dpData:TestCaseVo):void
         {
             currentDpData = dpData;
             setUpTest();
@@ -603,8 +600,8 @@
          * Slowly increase the padding at the bottom until it eats the last line
          * then verify that the last line was the line eaten.
          */
-        [Test(dataProvider=dataProvider4)]
-        public function bottomPaddingSqueezeTest(dpData:Object):void
+        [Test(dataProvider=topPaddingSqueezeTestDp)]
+        public function bottomPaddingSqueezeTest(dpData:TestCaseVo):void
         {
             currentDpData = dpData;
             setUpTest();
@@ -633,8 +630,8 @@
         /**
          * Increase the left padding until you force the flow to create a new line.
          */
-        [Test(dataProvider=dataProvider4)]
-        public function leftPaddingSqueezeTest(dpData:Object):void
+        [Test(dataProvider=leftPaddingSqueezeTestDp)]
+        public function leftPaddingSqueezeTest(dpData:TestCaseVo):void
         {
             currentDpData = dpData;
             setUpTest();
@@ -658,8 +655,8 @@
         /**
          * Increase the right padding until you force the flow to create a new line.
          */
-        [Test(dataProvider=dataProvider4)]
-        public function rightPaddingSqueezeTest(dpData:Object):void
+        [Test(dataProvider=leftPaddingSqueezeTestDp)]
+        public function rightPaddingSqueezeTest(dpData:TestCaseVo):void
         {
             currentDpData = dpData;
             setUpTest();
@@ -680,8 +677,8 @@
                     SelManager.textFlow.flowComposer.numLines <= length);
         }
 
-        [Test(dataProvider=dataProvider1)]
-        public function writingModeBreakTest(dpData:Object):void
+        [Test(dataProvider=checkColumnWidthOnGapChangeTestDp)]
+        public function writingModeBreakTest(dpData:TestCaseVo):void
         {
             currentDpData = dpData;
             setUpTest();
@@ -749,8 +746,8 @@
         /**
          * This test exists solely for snapshotting.
          */
-        [Test(dataProvider=dataProvider2)]
-        public function checkVerticalAlignTopTest(dpData:Object):void
+        [Test(dataProvider=checkVerticalAlignTopTestDp)]
+        public function checkVerticalAlignTopTest(dpData:TestCaseVo):void
         {
             currentDpData = dpData;
             setUpTest();
@@ -814,7 +811,7 @@
         /**
          * This test exists solely for snapshotting.
          */
-        [Test(dataProvider=dataProvider3)]
+        [Test(dataProvider=checkVerticalAlignBottomTestDp)]
         public function checkVerticalAlignBottomTest(dpData:Object):void
         {
             currentDpData = dpData;
@@ -879,8 +876,8 @@
         /**
          * This test exists solely for snapshotting.
          */
-        [Test(dataProvider=dataProvider5)]
-        public function checkVerticalAlignMiddleTest(dpData:Object):void
+        [Test(dataProvider=checkVerticalAlignMiddleTestDp)]
+        public function checkVerticalAlignMiddleTest(dpData:TestCaseVo):void
         {
             currentDpData = dpData;
             setUpTest();
@@ -948,8 +945,8 @@
         /**
          * This test exists solely for snapshotting.
          */
-        [Test(dataProvider=dataProvider2)]
-        public function checkVerticalAlignJustifyTest(dpData:Object):void
+        [Test(dataProvider=checkVerticalAlignTopTestDp)]
+        public function checkVerticalAlignJustifyTest(dpData:TestCaseVo):void
         {
             currentDpData = dpData;
             setUpTest();
@@ -1010,8 +1007,8 @@
         }
 
         // non-empty flow, check if attribute changed after insertion point at position 0
-        [Test(dataProvider=dataProvider4)]
-        public function insertPos0CheckColumnWidthTest(dpData:Object):void
+        [Test(dataProvider=leftPaddingSqueezeTestDp)]
+        public function insertPos0CheckColumnWidthTest(dpData:TestCaseVo):void
         {
             currentDpData = dpData;
             setUpTest();
@@ -1038,8 +1035,8 @@
         }
 
         //check if container attribute change after insertion in an empty flow
-        [Test(dataProvider=dataProvider4)]
-        public function checkColumnCountEmptyFlowInsertTest(dpData:Object):void
+        [Test(dataProvider=leftPaddingSqueezeTestDp)]
+        public function checkColumnCountEmptyFlowInsertTest(dpData:TestCaseVo):void
         {
             currentDpData = dpData;
             setUpTest();
@@ -1065,8 +1062,8 @@
         }
 
         // non-empty flow, check if attribute changed after insertion point at end position
-        [Test(dataProvider=dataProvider4)]
-        public function insertAtEndOfFlowCheckColumnGapTest(dpData:Object):void
+        [Test(dataProvider=leftPaddingSqueezeTestDp)]
+        public function insertAtEndOfFlowCheckColumnGapTest(dpData:TestCaseVo):void
         {
             currentDpData = dpData;
             setUpTest();
@@ -1092,8 +1089,8 @@
                     initGap == endGap);
         }
 
-        [Test(dataProvider=dataProvider1)]
-        public function columnBreakTest(dpData:Object):void
+        [Test(dataProvider=checkColumnWidthOnGapChangeTestDp)]
+        public function columnBreakTest(dpData:TestCaseVo):void
         {
             currentDpData = dpData;
             setUpTest();
@@ -1178,8 +1175,8 @@
             }
         }
 
-        [Test(dataProvider=dataProvider1)]
-        public function containerBreakTest(dpData:Object):void
+        [Test(dataProvider=checkColumnWidthOnGapChangeTestDp)]
+        public function containerBreakTest(dpData:TestCaseVo):void
         {
             currentDpData = dpData;
             setUpTest();
@@ -1263,8 +1260,8 @@
             }
         }
 
-        [Test(dataProvider=dataProvider1)]
-        public function columnContainerBreakTest0(dpData:Object):void
+        [Test(dataProvider=checkColumnWidthOnGapChangeTestDp)]
+        public function columnContainerBreakTest0(dpData:TestCaseVo):void
         {
             currentDpData = dpData;
             setUpTest();
@@ -1272,7 +1269,7 @@
             columnContainerBreakTestX(0);
         }
 
-        [Test(dataProvider=dataProvider1)]
+        [Test(dataProvider=checkColumnWidthOnGapChangeTestDp)]
         public function columnContainerBreakTest1000(dpData:Object):void
         {
             currentDpData = dpData;
@@ -1281,7 +1278,7 @@
             columnContainerBreakTestX(1000);
         }
 
-        [Test(dataProvider=dataProvider1)]
+        [Test(dataProvider=checkColumnWidthOnGapChangeTestDp)]
         public function columnContainerBreakTest2000(dpData:Object):void
         {
             currentDpData = dpData;
@@ -1290,7 +1287,7 @@
             columnContainerBreakTestX(2000);
         }
 
-        [Test(dataProvider=dataProvider1)]
+        [Test(dataProvider=checkColumnWidthOnGapChangeTestDp)]
         public function columnContainerBreakTest3000(dpData:Object):void
         {
             currentDpData = dpData;
@@ -1299,8 +1296,8 @@
             columnContainerBreakTestX(3000);
         }
 
-        [Test(dataProvider=dataProvider1)]
-        public function columnContainerBreakTest4000(dpData:Object):void
+        [Test(dataProvider=checkColumnWidthOnGapChangeTestDp)]
+        public function columnContainerBreakTest4000(dpData:TestCaseVo):void
         {
             currentDpData = dpData;
             setUpTest();
@@ -1498,8 +1495,8 @@
 
         // mjzhang : Watson Bug#2841799 When lineBreak="toFit" the contentBounds width does
         // not include the trailing whitespace
-        [Test(dataProvider=dataProvider6)]
-        public function ContentBoundsWithWhitespaces(dpData:Object):void
+        [Test(dataProvider=contentBoundsWithWhitespacesDp)]
+        public function ContentBoundsWithWhitespaces(dpData:TestCaseVo):void
         {
             currentDpData = dpData;
             setUpTest();
@@ -1540,8 +1537,8 @@
         }
 
         // mjzhang : Bug#2835316 The TextLine is INVALID and cannot be used to access the current state of the TextBlock
-        [Test(dataProvider=dataProvider6)]
-        public function TextSelectAllTest(dpData:Object):void
+        [Test(dataProvider=contentBoundsWithWhitespacesDp)]
+        public function TextSelectAllTest(dpData:TestCaseVo):void
         {
             currentDpData = dpData;
             setUpTest();
@@ -1575,8 +1572,8 @@
         }
 
         // mjzhang : Bug#2898924 TLF reports incorrect content height after composition when floats are used with padding
-        [Test(dataProvider=dataProvider7)]
-        public function ContentBoundsWithPaddingTest(dpData:Object):void
+        [Test(dataProvider=hBeamCursorTestDp)]
+        public function ContentBoundsWithPaddingTest(dpData:TestCaseVo):void
         {
             currentDpData = dpData;
             setUpTest();
@@ -1620,8 +1617,8 @@
 
         // mjzhang : Bug#2758977 <s:p color="red"/> throws out of range error - can you do color lookup like Flex SDK?
         // Tests all the color options, also test Upper case and bad case(XXX)
-        [Test(dataProvider=dataProvider6)]
-        public function colorPropetyTest(dpData:Object):void
+        [Test(dataProvider=contentBoundsWithWhitespacesDp)]
+        public function colorPropetyTest(dpData:TestCaseVo):void
         {
             currentDpData = dpData;
             setUpTest();
@@ -1757,8 +1754,8 @@
 
         }
 
-        [Test(dataProvider=dataProvider7)]
-        public function HBeamCursorTest(dpData:Object):void
+        [Test(dataProvider=hBeamCursorTestDp)]
+        public function HBeamCursorTest(dpData:TestCaseVo):void
         {
             currentDpData = dpData;
             setUpTest();
@@ -1783,8 +1780,8 @@
         }
 
         // mjzhang : Bug#2907691 When composition starts in middle of the container, paddingBottom for the previous paragraph is ignored
-        [Ignore][Test(dataProvider=dataProvider7)]
-        public function paddingBottomTest(dpData:Object):void
+        [Ignore][Test(dataProvider=hBeamCursorTestDp)]
+        public function paddingBottomTest(dpData:TestCaseVo):void
         {
             currentDpData = dpData;
             setUpTest();
@@ -1806,8 +1803,8 @@
         }
 
         //Fix bug 2869747  using TextFlow.flowComposer and ContainerController, displayed text is incorrectly masked
-        [Test(dataProvider=dataProvider5)]
-        public function scrollRectTest(dpData:Object):void
+        [Test(dataProvider=checkVerticalAlignMiddleTestDp)]
+        public function scrollRectTest(dpData:TestCaseVo):void
         {
             currentDpData = dpData;
             setUpTest();
