diff --git a/automation_tests/src/AllTestsSuite.as b/automation_tests/src/AllTestsSuite.as
index 62f2f45..b0dbf9a 100644
--- a/automation_tests/src/AllTestsSuite.as
+++ b/automation_tests/src/AllTestsSuite.as
@@ -57,6 +57,7 @@
     import UnitTest.Tests.StyleTest;
     import UnitTest.Tests.TCYTest;
     import UnitTest.Tests.TabTest;
+    import UnitTest.Tests.TextBlock_FLEX_35100_Test;
     import UnitTest.Tests.TextContainerManagerTest;
     import UnitTest.Tests.TextFlowEditTest;
     import UnitTest.Tests.TextFlowTextLineFactoryTest;
@@ -114,6 +115,7 @@
         public var scrollToRangeTest:ScrollToRangeTest;
         public var pasteWithMultiParagraph:PasteWithMutliParagraph_FLEX_34876_Test;
 		public var flex_34807:FLEX_34807_Test;
+        public var flex_35100:TextBlock_FLEX_35100_Test;
     }
 
 }
diff --git a/automation_tests/src/UnitTest/Tests/TextBlock_FLEX_35100_Test.as b/automation_tests/src/UnitTest/Tests/TextBlock_FLEX_35100_Test.as
new file mode 100644
index 0000000..17f9789
--- /dev/null
+++ b/automation_tests/src/UnitTest/Tests/TextBlock_FLEX_35100_Test.as
@@ -0,0 +1,378 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  Licensed to the Apache Software Foundation (ASF) under one or more
+//  contributor license agreements.  See the NOTICE file distributed with
+//  this work for additional information regarding copyright ownership.
+//  The ASF licenses this file to You under the Apache License, Version 2.0
+//  (the "License"); you may not use this file except in compliance with
+//  the License.  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//  See the License for the specific language governing permissions and
+//  limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+package UnitTest.Tests {
+    import UnitTest.ExtendedClasses.VellumTestCase;
+    import UnitTest.Fixtures.TestConfig;
+
+    import flash.text.engine.ElementFormat;
+
+    import flash.text.engine.TextBlock;
+    import flash.text.engine.TextElement;
+    import flash.text.engine.TextLine;
+    import flash.text.engine.TextLineCreationResult;
+
+    import org.flexunit.assertThat;
+    import org.flexunit.asserts.assertEquals;
+    import org.flexunit.asserts.assertNotNull;
+    import org.flexunit.asserts.assertNull;
+
+    public class TextBlock_FLEX_35100_Test extends VellumTestCase {
+
+        private static const WIDTH_FOR_TWO_LINES:int = 50;
+        private static var _sut:TextBlock;
+
+        public function TextBlock_FLEX_35100_Test()
+        {
+            super("", "TextBlock_FLEX_35100_Tests", TestConfig.getInstance());
+
+            metaData = {};
+        }
+
+        [Before]
+        override public function setUpTest():void
+        {
+            super.setUpTest();
+            _sut = new TextBlock(new TextElement("Hello world!", new ElementFormat()));
+        }
+
+        [After]
+        override public function tearDownTest():void
+        {
+            super.tearDownTest();
+            _sut = null;
+        }
+
+        ////////////////////////////////////////////////////////////////////////////////
+        //
+        // createTextLine()
+        //
+        ////////////////////////////////////////////////////////////////////////////////
+
+
+        [Test]
+        public function test_createTextLine_returns_a_valid_TextLine_when_previousLine_is_null_and_TextBlock_not_empty():void
+        {
+            //when
+            var textLine:TextLine = _sut.createTextLine(null);
+
+            //then
+            assertNotNull(textLine);
+        }
+
+        [Test]
+        public function test_createTextLine_returns_null_when_width_too_little():void
+        {
+            //when
+            var textLine:TextLine = _sut.createTextLine(null, 1);
+
+            //then
+            assertNull(textLine);
+        }
+
+        [Test]
+        public function test_createTextLine_returns_null_when_width_0():void
+        {
+            //when
+            var textLine:TextLine = _sut.createTextLine(null, 0);
+
+            //then
+            assertNull(textLine);
+        }
+
+        [Test(expects="ArgumentError")]
+        public function test_createTextLine_throws_ArgumentError_when_width_negative():void
+        {
+            //when
+            var textLine:TextLine = _sut.createTextLine(null, -10);
+
+            //then - ArgumentError thrown
+        }
+
+        [Test]
+        public function test_createTextLine_works_when_fitSomething_true_despite_width_negative():void
+        {
+            //when
+            var textLine:TextLine = _sut.createTextLine(null, -10, 0, true);
+
+            //then
+            assertNotNull(textLine);
+            assertThat(textLine.rawTextLength > 0);
+        }
+
+        [Test]
+        public function test_createTextLine_works_when_fitSomething_true_despite_width_insufficient():void
+        {
+            //when
+            var textLine:TextLine = _sut.createTextLine(null, 1, 0, true);
+
+            //then
+            assertNotNull(textLine);
+            assertThat(textLine.rawTextLength > 0);
+        }
+
+        [Test]
+        public function test_createTextLine_creates_only_one_TextLine_for_short_text_and_default_width():void
+        {
+            //when
+            var firstTextLine:TextLine = _sut.createTextLine(null);
+            var secondTextLine:TextLine = _sut.createTextLine(firstTextLine);
+
+            //then
+            assertNull(secondTextLine);
+            assertEquals(TextLineCreationResult.COMPLETE, _sut.textLineCreationResult);
+        }
+
+        [Test]
+        public function test_createTextLine_creates_only_one_TextLine_for_short_text_and_default_width_despite_fitSomething_true():void
+        {
+            //when
+            var firstTextLine:TextLine = _sut.createTextLine(null);
+            var secondTextLine:TextLine = _sut.createTextLine(firstTextLine, 10000, 0, true);
+
+            //then
+            assertNull(secondTextLine);
+            assertEquals(TextLineCreationResult.COMPLETE, _sut.textLineCreationResult);
+        }
+
+        [Test]
+        public function test_createTextLine_returns_null_when_previousLine_is_null_and_TextBlock_empty():void
+        {
+            //given
+            _sut.content = new TextElement("", new ElementFormat());
+
+            //when
+            var textLine:TextLine = _sut.createTextLine(null);
+
+            //then
+            assertNull(textLine);
+        }
+
+        [Test]
+        public function test_createTextLine_returns_null_when_previousLine_is_null_and_TextBlock_empty_despite_fitSomething_true():void
+        {
+            //given
+            _sut.content = new TextElement("", new ElementFormat());
+
+            //when
+            var textLine:TextLine = _sut.createTextLine(null, 1000, 0, true);
+
+            //then
+            assertNull(textLine);
+        }
+
+        [Test]
+        public function test_createTextLine_returns_null_when_previousLine_is_null_and_TextBlock_has_null_text():void
+        {
+            //given
+            _sut.content = new TextElement(null, new ElementFormat());
+
+            //when
+            var textLine:TextLine = _sut.createTextLine(null);
+
+            //then
+            assertNull(textLine);
+        }
+
+        [Test(expects="ArgumentError")]
+        public function test_createTextLine_throws_ArgumentError_when_previousLine_from_different_TextBlock():void
+        {
+            //given
+            var firstTextLine:TextLine = _sut.createTextLine(null, WIDTH_FOR_TWO_LINES);
+            new TextBlock(new TextElement("Hello World!", new ElementFormat())).createTextLine(firstTextLine);
+
+            //then - ArgumentError thrown
+        }
+
+
+        ////////////////////////////////////////////////////////////////////////////////
+        //
+        // recreateTextLine()
+        //
+        ////////////////////////////////////////////////////////////////////////////////
+
+        [Test]
+        public function test_recreateTextLine_returns_the_same_TextLine_instance_passed_to_it():void
+        {
+            //when
+            var textLine:TextLine = _sut.createTextLine(null);
+            var recreatedTextLine:TextLine = _sut.recreateTextLine(textLine, null);
+
+            //then
+            assertEquals(textLine, recreatedTextLine);
+        }
+
+        [Test]
+        public function test_recreateTextLine_returns_null_when_TextBlock_empty():void
+        {
+            //given
+            var textLine:TextLine = _sut.createTextLine(null);
+
+            //when
+            _sut.content = new TextElement("", new ElementFormat());
+            var recreatedTextLine:TextLine = _sut.recreateTextLine(textLine, null);
+
+            //then
+            assertNull(recreatedTextLine);
+        }
+
+        [Test]
+        public function test_recreateTextLine_returns_null_when_TextBlock_empty_despite_fitSomething_true():void
+        {
+            //given
+            var textLine:TextLine = _sut.createTextLine(null);
+
+            //when
+            _sut.content = new TextElement("", new ElementFormat());
+            var recreatedTextLine:TextLine = _sut.recreateTextLine(textLine, null, 1000, 0, true);
+
+            //then
+            assertNull(recreatedTextLine);
+        }
+
+        [Test(expects="ArgumentError")]
+        public function test_recreateTextLine_throws_Argument_Error_when_previousLine_from_different_TextBlock_content():void
+        {
+            //given
+            var firstLine:TextLine = _sut.createTextLine(null, WIDTH_FOR_TWO_LINES);
+            var secondLine:TextLine = _sut.createTextLine(firstLine, WIDTH_FOR_TWO_LINES);
+
+            //when
+            _sut.content = new TextElement("Creative Design and development", new ElementFormat());
+            var recreatedSecondLine:TextLine = _sut.recreateTextLine(secondLine, firstLine, WIDTH_FOR_TWO_LINES);
+
+            //then - ArgumentError is thrown
+        }
+
+        [Test(expects="ArgumentError")]
+        public function test_recreateTextLine_throws_Argument_Error_when_line_parameter_is_null():void
+        {
+            //given
+            var firstLine:TextLine = _sut.createTextLine(null, WIDTH_FOR_TWO_LINES);
+            var secondLine:TextLine = _sut.createTextLine(firstLine, WIDTH_FOR_TWO_LINES);
+
+            //when
+            var recreatedSecondLine:TextLine = _sut.recreateTextLine(null, firstLine, WIDTH_FOR_TWO_LINES);
+
+            //then
+            assertNull(recreatedSecondLine);
+        }
+
+        [Test]
+        public function test_recreateTextLine_returns_null_when_width_too_little():void
+        {
+            //when
+            var textLine:TextLine = _sut.createTextLine(null, WIDTH_FOR_TWO_LINES);
+            var recreatedTextLine:TextLine = _sut.recreateTextLine(textLine, null, 1);
+
+            //then
+            assertNull(recreatedTextLine);
+        }
+
+        [Test]
+        public function test_recreateTextLine_returns_null_when_width_0():void
+        {
+            //when
+            var textLine:TextLine = _sut.createTextLine(null, WIDTH_FOR_TWO_LINES);
+            var recreatedTextLine:TextLine = _sut.recreateTextLine(textLine, null, 0);
+
+            //then
+            assertNull(recreatedTextLine);
+        }
+
+        [Test(expects="ArgumentError")]
+        public function test_recreateTextLine_throws_ArgumentError_when_width_negative():void
+        {
+            //when
+            var textLine:TextLine = _sut.createTextLine(null, WIDTH_FOR_TWO_LINES);
+            var recreatedTextLine:TextLine = _sut.recreateTextLine(textLine, null, -10);
+
+            //then - ArgumentError thrown
+        }
+
+        [Test]
+        public function test_recreateTextLine_works_when_fitSomething_true_despite_width_negative():void
+        {
+            //when
+            var textLine:TextLine = _sut.createTextLine(null, WIDTH_FOR_TWO_LINES);
+            var recreatedTextLine:TextLine = _sut.recreateTextLine(textLine, null, -10, 0, true);
+
+            //then
+            assertNotNull(recreatedTextLine);
+            assertThat(recreatedTextLine.rawTextLength > 0);
+        }
+
+        [Test]
+        public function test_recreateTextLine_returns_null_when_previousLine_was_last_line():void
+        {
+            //when
+            var firstLine:TextLine = _sut.createTextLine(null, WIDTH_FOR_TWO_LINES);
+            var secondLine:TextLine = _sut.createTextLine(firstLine, WIDTH_FOR_TWO_LINES);
+
+            var copyOfFirstThenThird:TextLine = _sut.createTextLine(null, WIDTH_FOR_TWO_LINES);
+            copyOfFirstThenThird = _sut.recreateTextLine(copyOfFirstThenThird, secondLine, WIDTH_FOR_TWO_LINES);
+
+            //then
+            assertNull(copyOfFirstThenThird);
+            assertEquals(TextLineCreationResult.COMPLETE, _sut.textLineCreationResult);
+        }
+
+        [Test]
+        public function test_recreateTextLine_returns_null_when_previousLine_was_last_line_despite_fitSomething_true():void
+        {
+            //when
+            var firstLine:TextLine = _sut.createTextLine(null, WIDTH_FOR_TWO_LINES);
+            var secondLine:TextLine = _sut.createTextLine(firstLine, WIDTH_FOR_TWO_LINES);
+
+            var copyOfFirstThenThird:TextLine = _sut.createTextLine(null, WIDTH_FOR_TWO_LINES);
+            copyOfFirstThenThird = _sut.recreateTextLine(copyOfFirstThenThird, secondLine, WIDTH_FOR_TWO_LINES, 0, true);
+
+            //then
+            assertNull(copyOfFirstThenThird);
+            assertEquals(TextLineCreationResult.COMPLETE, _sut.textLineCreationResult);
+        }
+
+        [Test(expects="ArgumentError")]
+        public function test_recreateTextLine_throws_ArgumentError_when_previousLine_is_the_same_as_the_line_to_recreate():void
+        {
+            //when
+            var firstTextLine:TextLine = _sut.createTextLine(null, WIDTH_FOR_TWO_LINES);
+            var secondTextLine:TextLine = _sut.createTextLine(firstTextLine, WIDTH_FOR_TWO_LINES);
+
+            assertNotNull(secondTextLine);
+
+            var firstLineRecreatedAsSecond:TextLine = _sut.recreateTextLine(firstTextLine, firstTextLine, WIDTH_FOR_TWO_LINES);
+
+            //then - error should be thrown
+        }
+
+        [Test(expects="ArgumentError")]
+        public function test_recreateTextLine_throws_ArgumentError_when_textLine_comes_from_different_block():void
+        {
+            //when
+            var firstTextLine:TextLine = _sut.createTextLine(null, WIDTH_FOR_TWO_LINES);
+            var secondTextLine:TextLine = _sut.createTextLine(firstTextLine, WIDTH_FOR_TWO_LINES);
+
+            assertNotNull(secondTextLine);
+
+            var firstLineRecreatedAsSecond:TextLine = new TextBlock(new TextElement("Hello World!", new ElementFormat())).recreateTextLine(secondTextLine, firstTextLine, WIDTH_FOR_TWO_LINES);
+
+            //then - error should be thrown
+        }
+    }
+}
