Index: /trunk/autoquest-core-usability-test/src/test/java/de/ugoe/cs/autoquest/usability/AbstractUsabilityEvaluationTC.java
===================================================================
--- /trunk/autoquest-core-usability-test/src/test/java/de/ugoe/cs/autoquest/usability/AbstractUsabilityEvaluationTC.java	(revision 1334)
+++ /trunk/autoquest-core-usability-test/src/test/java/de/ugoe/cs/autoquest/usability/AbstractUsabilityEvaluationTC.java	(revision 1335)
@@ -50,6 +50,6 @@
 
     /**
-   *
-   */
+     *
+     */
     @Before
     public void setUp() {
@@ -58,6 +58,6 @@
 
     /**
-   *
-   */
+     *
+     */
     protected ITaskModel createTaskModel(String spec) {
         TaskTreeDecoder decoder = new TaskTreeDecoder(taskFactory, taskBuilder);
@@ -82,5 +82,6 @@
                                                    UsabilityEvaluationResult evaluationResult)
     {
-        assertEquals(expectedDefects.length, evaluationResult.getAllDefects().size());
+        assertEquals(evaluationResult.getAllDefects().toString(),
+                     expectedDefects.length, evaluationResult.getAllDefects().size());
 
         EXPECTED_DEFECT_ITERATION:
Index: /trunk/autoquest-core-usability-test/src/test/java/de/ugoe/cs/autoquest/usability/RequiredScrollRuleTest.java
===================================================================
--- /trunk/autoquest-core-usability-test/src/test/java/de/ugoe/cs/autoquest/usability/RequiredScrollRuleTest.java	(revision 1335)
+++ /trunk/autoquest-core-usability-test/src/test/java/de/ugoe/cs/autoquest/usability/RequiredScrollRuleTest.java	(revision 1335)
@@ -0,0 +1,313 @@
+//   Copyright 2012 Georg-August-Universität Göttingen, Germany
+//
+//   Licensed 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 de.ugoe.cs.autoquest.usability;
+
+import static de.ugoe.cs.autoquest.usability.UsabilityDefectDescription.SCROLL_REQUIRED;
+import static de.ugoe.cs.autoquest.usability.UsabilityDefectSeverity.HIGH;
+import static de.ugoe.cs.autoquest.usability.UsabilityDefectSeverity.INFO;
+import static de.ugoe.cs.autoquest.usability.UsabilityDefectSeverity.LOW;
+import static de.ugoe.cs.autoquest.usability.UsabilityDefectSeverity.MEDIUM;
+
+import org.junit.Test;
+
+import de.ugoe.cs.autoquest.usability.UsabilityDefect;
+
+/**
+ *
+ */
+public class RequiredScrollRuleTest extends AbstractUsabilityEvaluationTC {
+
+    /**
+     *
+     */
+    @Test
+    public void testWithNormalScroll_01() {
+        RequiredScrollRule rule = new RequiredScrollRule();
+
+        // ===== check =====
+        String spec =
+            "UserSession {" +
+            "  Scroll body {}" +
+            "  Interaction elem1 {}" +
+            "}";
+        
+        // no defect expected, as interactions do not form tasks
+        UsabilityDefect[] expectedDefects = new UsabilityDefect[] {  };
+
+        assertUsabilityEvaluationResult(expectedDefects, rule.evaluate(createTaskModel(spec)));
+
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void testWithNormalScroll_02() {
+        RequiredScrollRule rule = new RequiredScrollRule();
+
+        // ===== check =====
+        String spec =
+            "UserSession {" +
+            "  Scroll body {}" +
+            "  Interaction elem1 {}" +
+            "  Scroll body {}" +
+            "  Interaction elem1 {}" +
+            "}";
+        
+        // no defect expected, as interactions do not form tasks
+        UsabilityDefect[] expectedDefects = new UsabilityDefect[] { };
+
+        assertUsabilityEvaluationResult(expectedDefects, rule.evaluate(createTaskModel(spec)));
+
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void testWithNormalScroll_03() {
+        RequiredScrollRule rule = new RequiredScrollRule();
+
+        // ===== check =====
+        String spec =
+            "UserSession {" +
+            "  Sequence {" +
+            "    Scroll body {}" +
+            "    Interaction elem1 {}" +
+            "  }" +
+            "}";
+        
+        UsabilityDefect[] expectedDefects = new UsabilityDefect[]
+            { new UsabilityDefect(HIGH, SCROLL_REQUIRED) };
+
+        assertUsabilityEvaluationResult(expectedDefects, rule.evaluate(createTaskModel(spec)));
+
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void testWithNormalScroll_04() {
+        RequiredScrollRule rule = new RequiredScrollRule();
+
+        // ===== check =====
+        String spec =
+            "UserSession {" +
+            "  Sequence seq1 {" +
+            "    Scroll body {}" +
+            "    Interaction elem1 {}" +
+            "  }" +
+            "  Sequence seq1 {" +
+            "    Scroll body {}" +
+            "    Interaction elem1 {}" +
+            "  }" +
+            "}";
+        
+        UsabilityDefect[] expectedDefects = new UsabilityDefect[]
+            { new UsabilityDefect(HIGH, SCROLL_REQUIRED) };
+
+        assertUsabilityEvaluationResult(expectedDefects, rule.evaluate(createTaskModel(spec)));
+
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void testOnlySeldomPreceededByScroll_01() {
+        RequiredScrollRule rule = new RequiredScrollRule();
+
+        // ===== check =====
+        String spec =
+            "UserSession {" +
+            "  Sequence seq1 {" +
+            "    Interaction elem1 {}" +
+            "    Interaction elem1 {}" +
+            "    Interaction elem1 {}" +
+            "    Scroll body {}" +
+            "    Interaction elem1 {}" +
+            "  }" +
+            "}";
+        
+        UsabilityDefect[] expectedDefects = new UsabilityDefect[] { };
+
+        assertUsabilityEvaluationResult(expectedDefects, rule.evaluate(createTaskModel(spec)));
+
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void testOnlySeldomPreceededByScroll_02() {
+        RequiredScrollRule rule = new RequiredScrollRule();
+
+        // ===== check =====
+        String spec =
+            "UserSession {" +
+            "  Sequence seq1 {" +
+            "    Optional opt1 { }" +
+            "    Interaction elem1 {}" +
+            "  }" +
+            "  Sequence seq1 {" +
+            "    Optional opt1 {" +
+            "      Scroll body {}" +
+            "    }" +
+            "    Interaction elem1 {}" +
+            "  }" +
+            "  Sequence seq1 {" +
+            "    Optional opt1 {" +
+            "      Scroll body {}" +
+            "    }" +
+            "    Interaction elem1 {}" +
+            "  }" +
+            "}";
+        
+        UsabilityDefect[] expectedDefects = new UsabilityDefect[]
+            { new UsabilityDefect(MEDIUM, SCROLL_REQUIRED) };
+
+        assertUsabilityEvaluationResult(expectedDefects, rule.evaluate(createTaskModel(spec)));
+
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void testOnlySeldomPreceededByScroll_03() {
+        RequiredScrollRule rule = new RequiredScrollRule();
+
+        // ===== check =====
+        String spec =
+            "UserSession {" +
+            "  Sequence seq1 {" +
+            "    Optional opt1 { }" +
+            "    Interaction elem1 {}" +
+            "  }" +
+            "  Sequence seq1 {" +
+            "    Optional opt1 {}" +
+            "    Interaction elem1 {}" +
+            "  }" +
+            "  Sequence seq1 {" +
+            "    Optional opt1 {" +
+            "      Scroll body {}" +
+            "    }" +
+            "    Interaction elem1 {}" +
+            "  }" +
+            "  Sequence seq1 {" +
+            "    Optional opt1 {" +
+            "      Scroll body {}" +
+            "    }" +
+            "    Interaction elem1 {}" +
+            "  }" +
+            "}";
+        
+        UsabilityDefect[] expectedDefects = new UsabilityDefect[]
+           { new UsabilityDefect(LOW, SCROLL_REQUIRED) };
+
+        assertUsabilityEvaluationResult(expectedDefects, rule.evaluate(createTaskModel(spec)));
+
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void testOnlySeldomPreceededByScroll_04() {
+        RequiredScrollRule rule = new RequiredScrollRule();
+
+        // ===== check =====
+        String spec =
+            "UserSession {" +
+            "  Sequence seq1 {" +
+            "    Optional opt1 { }" +
+            "    Interaction elem1 {}" +
+            "  }" +
+            "  Sequence seq1 {" +
+            "    Optional opt1 { }" +
+            "    Interaction elem1 {}" +
+            "  }" +
+            "  Sequence seq1 {" +
+            "    Optional opt1 { }" +
+            "    Interaction elem1 {}" +
+            "  }" +
+            "  Sequence seq1 {" +
+            "    Optional opt1 {" +
+            "      Scroll body {}" +
+            "    }" +
+            "    Interaction elem1 {}" +
+            "  }" +
+            "}";
+        
+        UsabilityDefect[] expectedDefects = new UsabilityDefect[]
+            { new UsabilityDefect(INFO, SCROLL_REQUIRED) };
+
+        assertUsabilityEvaluationResult(expectedDefects, rule.evaluate(createTaskModel(spec)));
+
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void testOnlySeldomPreceededByScroll_05() {
+        RequiredScrollRule rule = new RequiredScrollRule();
+
+        // ===== check =====
+        String spec =
+            "UserSession {" +
+            "  Sequence seq1 {" +
+            "    Optional opt1 { }" +
+            "    Interaction elem1 {}" +
+            "  }" +
+            "  Sequence seq1 {" +
+            "    Optional opt1 { }" +
+            "    Interaction elem1 {}" +
+            "  }" +
+            "  Sequence seq1 {" +
+            "    Optional opt1 { }" +
+            "    Interaction elem1 {}" +
+            "  }" +
+            "  Sequence seq1 {" +
+            "    Optional opt1 {" +
+            "      Scroll body {}" +
+            "    }" +
+            "    Interaction elem1 {}" +
+            "  }" +
+            "  Sequence seq1 {" +
+            "    Optional opt1 { }" +
+            "    Interaction elem1 {}" +
+            "  }" +
+            "  Sequence seq1 {" +
+            "    Optional opt1 { }" +
+            "    Interaction elem1 {}" +
+            "  }" +
+            "  Sequence seq1 {" +
+            "    Optional opt1 { }" +
+            "    Interaction elem1 {}" +
+            "  }" +
+            "  Sequence seq1 {" +
+            "    Optional opt1 { }" +
+            "    Interaction elem1 {}" +
+            "  }" +
+            "}";
+        
+        UsabilityDefect[] expectedDefects = new UsabilityDefect[] { };
+
+        assertUsabilityEvaluationResult(expectedDefects, rule.evaluate(createTaskModel(spec)));
+
+    }
+}
Index: /trunk/autoquest-core-usability-test/src/test/java/de/ugoe/cs/autoquest/usability/TextInputStatisticsRuleTest.java
===================================================================
--- /trunk/autoquest-core-usability-test/src/test/java/de/ugoe/cs/autoquest/usability/TextInputStatisticsRuleTest.java	(revision 1334)
+++ /trunk/autoquest-core-usability-test/src/test/java/de/ugoe/cs/autoquest/usability/TextInputStatisticsRuleTest.java	(revision 1335)
@@ -26,657 +26,699 @@
 
 import de.ugoe.cs.autoquest.usability.UsabilityDefect;
-import de.ugoe.cs.autoquest.usability.UsabilityEvaluationManager;
 
 /**
- * TODO comment
- * 
- * @version $Revision: $ $Date: 18.07.2012$
- * @author 2012, last modified by $Author: pharms$
+ *
  */
 public class TextInputStatisticsRuleTest extends AbstractUsabilityEvaluationTC {
 
     /**
-     * TODO: comment
-     * 
-     */
-    @Test
-    public void testWithDifferentTextInputInteractionsOnly() {
-        UsabilityEvaluationManager manager = new UsabilityEvaluationManager();
-
-        // ===== check =====
-        String spec =
-            "UserSession {" +
-            "  TextInput (bla) {}" +
-            "}";
+     *
+     */
+    @Test
+    public void testWithDifferentTextInputInteractionsOnly_01() {
+        TextInputStatisticsRule rule = new TextInputStatisticsRule();
+
+        // ===== check =====
+        String spec =
+            "UserSession {" +
+            "  TextInput elem1 (bla) {}" +
+            "}";
+        
         UsabilityDefect[] expectedDefects = new UsabilityDefect[]
             { new UsabilityDefect(HIGH, TEXT_FIELD_INPUT_RATIO) };
 
-        assertUsabilityEvaluationResult
-            (expectedDefects, manager.evaluateUsability(createTaskModel(spec)));
-
-        // ===== check =====
-        spec =
-            "UserSession {" +
-            "  TextInput (a) {}" +
-            "  TextInput (b) {}" +
-            "  TextInput (c) {}" +
-            "  TextInput (d) {}" +
-            "}";
-
-        expectedDefects = new UsabilityDefect[]
+        assertUsabilityEvaluationResult(expectedDefects, rule.evaluate(createTaskModel(spec)));
+
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void testWithDifferentTextInputInteractionsOnly_02() {
+        TextInputStatisticsRule rule = new TextInputStatisticsRule();
+
+        // ===== check =====
+        String spec =
+            "UserSession {" +
+            "  TextInput elem1 (a) {}" +
+            "  TextInput elem1 (b) {}" +
+            "  TextInput elem1 (c) {}" +
+            "  TextInput elem1 (d) {}" +
+            "}";
+
+        UsabilityDefect[] expectedDefects = new UsabilityDefect[]
             { new UsabilityDefect(HIGH, TEXT_FIELD_INPUT_RATIO) };
 
-        assertUsabilityEvaluationResult
-            (expectedDefects, manager.evaluateUsability(createTaskModel(spec)));
-
-        // ===== check =====
-        spec =
-            "UserSession {" +
-            "  TextInput (a) {}" +
-            "  TextInput (b) {}" +
-            "  TextInput (c) {}" +
-            "  TextInput (d) {}" +
-            "}";
-
-        expectedDefects = new UsabilityDefect[]
+        assertUsabilityEvaluationResult(expectedDefects, rule.evaluate(createTaskModel(spec)));
+
+    }
+
+
+    /**
+     *
+     */
+    @Test
+    public void testWithDifferentTextInputInteractionsOnly_03() {
+        TextInputStatisticsRule rule = new TextInputStatisticsRule();
+
+        // ===== check =====
+        String spec =
+            "UserSession {" +
+            "  TextInput elem1 (a) {}" +
+            "  TextInput elem1 (b) {}" +
+            "  TextInput elem1 (c) {}" +
+            "  TextInput elem1 (d) {}" +
+            "}";
+
+        UsabilityDefect[] expectedDefects = new UsabilityDefect[]
             { new UsabilityDefect(HIGH, TEXT_FIELD_INPUT_RATIO) };
 
-        assertUsabilityEvaluationResult
-            (expectedDefects, manager.evaluateUsability(createTaskModel(spec)));
-
-        // ===== check =====
-        spec =
-            "Iteration {" +
-            "  TextInput (bla) {}" +
-            "}";
-
-        expectedDefects = new UsabilityDefect[]
+        assertUsabilityEvaluationResult(expectedDefects, rule.evaluate(createTaskModel(spec)));
+
+    }
+
+
+    /**
+     *
+     */
+    @Test
+    public void testWithDifferentTextInputInteractionsOnly_04() {
+        TextInputStatisticsRule rule = new TextInputStatisticsRule();
+
+        // ===== check =====
+        String spec =
+            "UserSession {" +
+            "  Iteration {" +
+            "    TextInput elem1 (bla) {}" +
+            "  }" +
+            "}";
+
+        UsabilityDefect[] expectedDefects = new UsabilityDefect[]
             { new UsabilityDefect(HIGH, TEXT_FIELD_INPUT_RATIO) };
 
-        assertUsabilityEvaluationResult
-            (expectedDefects, manager.evaluateUsability(createTaskModel(spec)));
-
-        // ===== check =====
-        spec =
-            "Sequence {" +
-            "  TextInput (a) {}" +
+        assertUsabilityEvaluationResult(expectedDefects, rule.evaluate(createTaskModel(spec)));
+
+    }
+
+
+    /**
+     *
+     */
+    @Test
+    public void testWithDifferentTextInputInteractionsOnly_05() {
+        TextInputStatisticsRule rule = new TextInputStatisticsRule();
+
+        // ===== check =====
+        String spec =
+            "UserSession {" +
             "  Sequence {" +
-            "    TextInput (b) {}" +
-            "    TextInput (c) {}" +
-            "    TextInput (d) {}" +
-            "    TextInput (e) {}" +
-            "  }" +
-            "  Iteration {" +
-            "    TextInput (f) {}" +
-            "  }" +
-            "  TextInput (g) {}" +
+            "    TextInput elem1 (a) {}" +
+            "    Sequence seq1 {" +
+            "      TextInput elem1 (b) {}" +
+            "      TextInput elem1 (c) {}" +
+            "      TextInput elem1 (d) {}" +
+            "      TextInput elem1 (e) {}" +
+            "    }" +
+            "    Iteration it1 {" +
+            "      TextInput elem1 (f) {}" +
+            "     TextInput elem1 (g) {}" +
+            "      TextInput elem1 (h) {}" +
+            "      TextInput elem1 (i) {}" +
+            "    }" +
+            "    TextInput elem1 (j) {}" +
+            "    Selection sel1 {" +
+            "      TextInput elem1 (k) {}" +
+            "    }" +
+            "    Sequence seq2 {" +
+            "      TextInput elem1 (l) {}" +
+            "      Sequence seq1 {" +
+            "        TextInput elem1 (m) {}" +
+            "        TextInput elem1 (n) {}" +
+            "        TextInput elem1 (o) {}" +
+            "        TextInput elem1 (p) {}" +
+            "      }" +
+            "      Iteration it1 {" +
+            "        TextInput elem1 (q) {}" +
+            "        TextInput elem1 (r) {}" +
+            "        TextInput elem1 (s) {}" +
+            "        TextInput elem1 (t) {}" +
+            "      }" +
+            "      TextInput elem1 (u) {}" +
+            "      Selection sel1 {" +
+            "        TextInput elem1 (v) {}" +
+            "      }" +
+            "    }" +
+            "    Selection sel2 {" +
+            "      TextInput elem1 (w) {}" +
+            "    }" +
+            "    TextInput elem1 (x) {}" +
+            "  }" +
+            "}";
+
+        UsabilityDefect[] expectedDefects = new UsabilityDefect[]
+            { new UsabilityDefect(HIGH, TEXT_FIELD_INPUT_RATIO) };
+
+        assertUsabilityEvaluationResult(expectedDefects, rule.evaluate(createTaskModel(spec)));
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void testCombinationsOfTextInputInteractionsAndOtherInteractions_01() {
+        TextInputStatisticsRule rule = new TextInputStatisticsRule();
+
+        // ===== check =====
+        String spec =
+            "UserSession {" +
+            "  Sequence {" +
+            "    Interaction elem1 {}" +
+            "    TextInput elem1 (a) {}" +
+            "    TextInput elem1 (b) {}" +
+            "    Interaction elem1 {}" +
+            "    TextInput elem1 (c) {}" +
+            "  }" +
+            "}";
+
+        UsabilityDefect[] expectedDefects = new UsabilityDefect[]
+            { new UsabilityDefect(LOW, TEXT_FIELD_INPUT_RATIO) };
+
+        assertUsabilityEvaluationResult(expectedDefects, rule.evaluate(createTaskModel(spec)));
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void testCombinationsOfTextInputInteractionsAndOtherInteractions_02() {
+        TextInputStatisticsRule rule = new TextInputStatisticsRule();
+
+        // ===== check =====
+        String spec =
+            "UserSession {" +
+            "  Sequence {" +
+            "    Interaction elem1 {}" +
+            "    TextInput elem1 (a) {}" +
+            "    Interaction elem1 {}" +
+            "    Interaction elem1 {}" +
+            "    TextInput elem1 (c) {}" +
+            "  }" +
+            "}";
+
+        UsabilityDefect[] expectedDefects = new UsabilityDefect[]
+            { new UsabilityDefect(INFO, TEXT_FIELD_INPUT_RATIO) };
+
+        assertUsabilityEvaluationResult(expectedDefects, rule.evaluate(createTaskModel(spec)));
+
+    }
+
+
+    /**
+     *
+     */
+    @Test
+    public void testCombinationsOfTextInputInteractionsAndOtherInteractions_03() {
+        TextInputStatisticsRule rule = new TextInputStatisticsRule();
+
+        // ===== check =====
+        String spec =
+            "UserSession {" +
+            "  Sequence {" +
+            "    Interaction elem1 {}" +
+            "    TextInput elem1 (a) {}" +
+            "    Interaction elem1 {}" +
+            "    Interaction elem1 {}" +
+            "    Interaction elem1 {}" +
+            "  }" +
+            "}";
+
+        UsabilityDefect[] expectedDefects = new UsabilityDefect[0];
+
+        assertUsabilityEvaluationResult(expectedDefects, rule.evaluate(createTaskModel(spec)));
+
+    }
+
+
+    /**
+     *
+     */
+    @Test
+    public void testCombinationsOfTextInputInteractionsAndOtherInteractions_04() {
+        TextInputStatisticsRule rule = new TextInputStatisticsRule();
+
+        // ===== check =====
+        String spec =
+            "UserSession {" +
             "  Selection {" +
-            "    TextInput (h) {}" +
-            "    TextInput (i) {}" +
-            "    TextInput (j) {}" +
-            "    TextInput (k) {}" +
-            "  }" +
+            "    TextInput elem1 (a) {}" +
+            "  }" +
+            "}";
+
+        UsabilityDefect[] expectedDefects = new UsabilityDefect[]
+            { new UsabilityDefect(HIGH, TEXT_FIELD_INPUT_RATIO) };
+
+        assertUsabilityEvaluationResult(expectedDefects, rule.evaluate(createTaskModel(spec)));
+
+    }
+
+
+    /**
+     *
+     */
+    @Test
+    public void testCombinationsOfTextInputInteractionsAndOtherInteractions_05() {
+        TextInputStatisticsRule rule = new TextInputStatisticsRule();
+
+        // ===== check =====
+        String spec =
+            "UserSession {" +
+            "  Sequence seq1 {" +
+            "    TextInput elem1 (a) {}" +
+            "    Sequence seq2 {" +
+            "      Interaction elem1 {}" +
+            "      TextInput elem1 (b) {}" +
+            "      TextInput elem1 (c) {}" +
+            "      Interaction elem1 {}" +
+            "      TextInput elem1 (d) {}" +
+            "    }" +
+            "    Iteration it1 {" +
+            "      TextInput elem1 (e) {}" +
+            "    }" +
+            "    Interaction elem1 {}" +
+            "    Selection sel1 {" +
+            "      TextInput elem1 (f) {}" +
+            "    }" +
+            "    Sequence seq3 {" +
+            "      TextInput elem1 (j) {}" +
+            "      Sequence seq4 {" +
+            "        TextInput elem1 (k) {}" +
+            "        Interaction elem1 {}" +
+            "        TextInput elem1 (l) {}" +
+            "        TextInput elem1 (m) {}" +
+            "        Interaction elem1 {}" +
+            "        TextInput elem1 (n) {}" +
+            "        TextInput elem1 (o) {}" +
+            "      }" +
+            "      Iteration it2{" +
+            "        Interaction elem1 {}" +
+            "      }" +
+            "      Interaction elem1 {}" +
+            "      Selection sel1 {" +
+            "        TextInput elem1 (p) {}" +
+            "      }" +
+            "    }" +
+            "    Selection sel1 {" +
+            "      Sequence seq 5{" +
+            "        TextInput elem1 (w) {}" +
+            "        Interaction elem1 {}" +
+            "        TextInput elem1 (x) {}" +
+            "        TextInput elem1 (y) {}" +
+            "        Interaction elem1 {}" +
+            "      }" +
+            "    }" +
+            "    Interaction elem1 {}" +
+            "  }" +
+            "}";
+
+        UsabilityDefect[] expectedDefects = new UsabilityDefect[]
+            { new UsabilityDefect(LOW, TEXT_FIELD_INPUT_RATIO) };
+
+        assertUsabilityEvaluationResult(expectedDefects, rule.evaluate(createTaskModel(spec)));
+
+    }
+
+
+    /**
+     *
+     */
+    @Test
+    public void testCombinationsOfTextInputInteractionsAndOtherInteractions_06() {
+        TextInputStatisticsRule rule = new TextInputStatisticsRule();
+
+        // ===== check =====
+        String spec =
+            "UserSession {" +
+            "  Sequence seq1 {" +
+            "    TextInput elem1 (a) {}" +
+            "    Sequence seq2 {" +
+            "      Interaction elem1 {}" +
+            "      TextInput elem1 (b) {}" +
+            "      Interaction elem1 {}" +
+            "      Interaction elem1 {}" +
+            "      TextInput elem1 (c) {}" +
+            "    }" +
+            "    Iteration it1 {" +
+            "      TextInput elem1 (d) {}" +
+            "    }" +
+            "    Interaction elem1 {}" +
+            "    Selection sel1 {" +
+            "      TextInput elem1 (e) {}" +
+            "    }" +
+            "    Sequence seq3 {" +
+            "      TextInput elem1 (i) {}" +
+            "      Sequence seq4 {" +
+            "        TextInput elem1 (j) {}" +
+            "        Interaction elem1 {}" +
+            "        TextInput elem1 (k) {}" +
+            "        Interaction elem1 {}" +
+            "        Interaction elem1 {}" +
+            "        TextInput elem1 (m) {}" +
+            "        Interaction elem1 {}" +
+            "      }" +
+            "      Iteration it2 {" +
+            "        Interaction elem1 {}" +
+            "      }" +
+            "      Interaction elem1 {}" +
+            "      Selection sel1 {" +
+            "        Interaction elem1 {}" +
+            "      }" +
+            "    }" +
+            "    Selection sel1 {" +
+            "      Sequence seq5 {" +
+            "        TextInput elem1 (v) {}" +
+            "        Interaction elem1 {}" +
+            "        Interaction elem1 {}" +
+            "        TextInput elem1 (x) {}" +
+            "        Interaction elem1 {}" +
+            "      }" +
+            "    }" +
+            "    Interaction elem1 {}" +
+            "  }" +
+            "}";
+
+        UsabilityDefect[] expectedDefects = new UsabilityDefect[]
+            { new UsabilityDefect(INFO, TEXT_FIELD_INPUT_RATIO) };
+
+        assertUsabilityEvaluationResult(expectedDefects, rule.evaluate(createTaskModel(spec)));
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void testTextEntryRepetitions_01() {
+        TextInputStatisticsRule rule = new TextInputStatisticsRule();
+
+        // ===== check =====
+        String spec =
+            "UserSession {" +
+            "  Sequence seq1 {" +
+            "    TextInput elem1 (a) {}" +
+            "    TextInput elem2 (a) {}" +
+            "  }" +
+            "}";
+
+        UsabilityDefect[] expectedDefects = new UsabilityDefect[]
+            { new UsabilityDefect(HIGH, TEXT_FIELD_INPUT_RATIO),
+              new UsabilityDefect(HIGH, TEXT_FIELD_INPUT_REPETITIONS),
+              new UsabilityDefect(HIGH, TEXT_FIELD_INPUT_REPETITIONS) };
+
+        assertUsabilityEvaluationResult(expectedDefects, rule.evaluate(createTaskModel(spec)));
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void testTextEntryRepetitions_02() {
+        TextInputStatisticsRule rule = new TextInputStatisticsRule();
+
+        // ===== check =====
+        String spec =
+            "UserSession {" +
+            "  Sequence seq1 {" +
+            "    TextInput elem1 (a) {}" +
+            "    Sequence seq2 {" +
+            "      TextInput elem2 (a) {}" +
+            "    }" +
+            "    Iteration it1 {" +
+            "      TextInput elem3 (a) {}" +
+            "    }" +
+            "    Selection sel1 {" +
+            "      TextInput elem4 (a) {}" +
+            "    }" +
+            "  }" +
+            "}";
+
+        UsabilityDefect[] expectedDefects = new UsabilityDefect[]
+            { new UsabilityDefect(HIGH, TEXT_FIELD_INPUT_RATIO),
+              new UsabilityDefect(HIGH, TEXT_FIELD_INPUT_REPETITIONS),
+              new UsabilityDefect(HIGH, TEXT_FIELD_INPUT_REPETITIONS),
+              new UsabilityDefect(HIGH, TEXT_FIELD_INPUT_REPETITIONS),
+              new UsabilityDefect(HIGH, TEXT_FIELD_INPUT_REPETITIONS),
+              new UsabilityDefect(HIGH, TEXT_FIELD_INPUT_REPETITIONS),
+              new UsabilityDefect(HIGH, TEXT_FIELD_INPUT_REPETITIONS),
+              new UsabilityDefect(HIGH, TEXT_FIELD_INPUT_REPETITIONS),
+              new UsabilityDefect(HIGH, TEXT_FIELD_INPUT_REPETITIONS),
+              new UsabilityDefect(HIGH, TEXT_FIELD_INPUT_REPETITIONS),
+              new UsabilityDefect(HIGH, TEXT_FIELD_INPUT_REPETITIONS),
+              new UsabilityDefect(HIGH, TEXT_FIELD_INPUT_REPETITIONS),
+              new UsabilityDefect(HIGH, TEXT_FIELD_INPUT_REPETITIONS) };
+
+        assertUsabilityEvaluationResult(expectedDefects, rule.evaluate(createTaskModel(spec)));
+
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void testTextEntryRepetitions_03() {
+        TextInputStatisticsRule rule = new TextInputStatisticsRule();
+
+        // ===== check =====
+        String spec =
+            "UserSession {" +
+            "  Sequence seq1 {" +
+            "    TextInput elem1 (a) {}" +
+            "    TextInput elem2 (z) {}" +
+            "    TextInput elem1 (b) {}" +
+            "    TextInput elem2 (b) {}" +
+            "    TextInput elem1 (c) {}" +
+            "    TextInput elem2 (c) {}" +
+            "  }" +
+            "}";
+
+        UsabilityDefect[] expectedDefects = new UsabilityDefect[]
+            { new UsabilityDefect(HIGH, TEXT_FIELD_INPUT_RATIO),
+              new UsabilityDefect(MEDIUM, TEXT_FIELD_INPUT_REPETITIONS),
+              new UsabilityDefect(MEDIUM, TEXT_FIELD_INPUT_REPETITIONS) };
+
+        assertUsabilityEvaluationResult(expectedDefects, rule.evaluate(createTaskModel(spec)));
+
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void testTextEntryRepetitions_04() {
+        TextInputStatisticsRule rule = new TextInputStatisticsRule();
+
+        // ===== check =====
+        String spec =
+            "UserSession {" +
+            "  Sequence seq1 {" +
+            "    TextInput elem1 (a) {}" +
+            "    TextInput elem2 (z) {}" +
+            "    TextInput elem1 (b) {}" +
+            "    TextInput elem2 (y) {}" +
+            "    TextInput elem1 (c) {}" +
+            "    TextInput elem2 (c) {}" +
+            "  }" +
+            "}";
+
+        UsabilityDefect[] expectedDefects = new UsabilityDefect[]
+            { new UsabilityDefect(HIGH, TEXT_FIELD_INPUT_RATIO),
+              new UsabilityDefect(LOW, TEXT_FIELD_INPUT_REPETITIONS),
+              new UsabilityDefect(LOW, TEXT_FIELD_INPUT_REPETITIONS) };
+
+        assertUsabilityEvaluationResult(expectedDefects, rule.evaluate(createTaskModel(spec)));
+
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void testTextEntryRepetitions_05() {
+        TextInputStatisticsRule rule = new TextInputStatisticsRule();
+
+        // ===== check =====
+        String spec =
+            "UserSession {" +
+            "  Sequence seq1 {" +
+            "    TextInput elem1 (a) {}" +
+            "    TextInput elem2 (z) {}" +
+            "    TextInput elem1 (b) {}" +
+            "    TextInput elem2 (y) {}" +
+            "    TextInput elem1 (c) {}" +
+            "    TextInput elem2 (x) {}" +
+            "    TextInput elem1 (d) {}" +
+            "    TextInput elem2 (w) {}" +
+            "    TextInput elem1 (e) {}" +
+            "    TextInput elem2 (v) {}" +
+            "    TextInput elem1 (f) {}" +
+            "    TextInput elem2 (f) {}" +
+            "  }" +
+            "}";
+
+        UsabilityDefect[] expectedDefects = new UsabilityDefect[]
+            { new UsabilityDefect(HIGH, TEXT_FIELD_INPUT_RATIO),
+              new UsabilityDefect(INFO, TEXT_FIELD_INPUT_REPETITIONS),
+              new UsabilityDefect(INFO, TEXT_FIELD_INPUT_REPETITIONS) };
+
+        assertUsabilityEvaluationResult(expectedDefects, rule.evaluate(createTaskModel(spec)));
+
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void testTextEntryRepetitions_06() {
+        TextInputStatisticsRule rule = new TextInputStatisticsRule();
+
+        // ===== check =====
+        String spec =
+            "UserSession {" +
+            "  Sequence seq1 {" +
+            "    TextInput elem1 (a) {}" +
+            "    TextInput elem1 (b) {}" +
+            "    Sequence seq2 {" +
+            "      TextInput elem2 (a) {}" +
+            "      TextInput elem2 (b) {}" +
+            "      TextInput elem2 (c) {}" +
+            "    }" +
+            "  }" +
+            "}";
+
+        UsabilityDefect[] expectedDefects = new UsabilityDefect[]
+            { new UsabilityDefect(HIGH, TEXT_FIELD_INPUT_RATIO),
+              new UsabilityDefect(HIGH, TEXT_FIELD_INPUT_REPETITIONS),
+              new UsabilityDefect(MEDIUM, TEXT_FIELD_INPUT_REPETITIONS) };
+
+        assertUsabilityEvaluationResult(expectedDefects, rule.evaluate(createTaskModel(spec)));
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void testTextEntryRepetitions_07() {
+        TextInputStatisticsRule rule = new TextInputStatisticsRule();
+
+        // ===== check =====
+        String spec =
+            "UserSession {" +
+            "  Sequence seq1 {" +
+            "    TextInput elem1 (a) {}" +
+            "    Sequence seq2 {" +
+            "      TextInput elem2 (a) {}" +
+            "      TextInput elem2 (b) {}" +
+            "      TextInput elem2 (c) {}" +
+            "    }" +
+            "  }" +
+            "}";
+
+        UsabilityDefect[] expectedDefects = new UsabilityDefect[]
+            { new UsabilityDefect(HIGH, TEXT_FIELD_INPUT_RATIO),
+              new UsabilityDefect(HIGH, TEXT_FIELD_INPUT_REPETITIONS),
+              new UsabilityDefect(LOW, TEXT_FIELD_INPUT_REPETITIONS) };
+
+        assertUsabilityEvaluationResult(expectedDefects, rule.evaluate(createTaskModel(spec)));
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void testNoLetterOrDigitInput_01() {
+        TextInputStatisticsRule rule = new TextInputStatisticsRule();
+
+        // ===== check =====
+        String spec =
+            "UserSession {" +
             "  Sequence {" +
-            "    TextInput (l) {}" +
-            "    Sequence {" +
-            "      TextInput (m) {}" +
-            "      TextInput (n) {}" +
-            "      TextInput (o) {}" +
-            "      TextInput (p) {}" +
-            "    }" +
-            "    Iteration {" +
-            "      TextInput (q) {}" +
-            "    }" +
-            "    TextInput (r) {}" +
-            "    Selection {" +
-            "      TextInput (s) {}" +
-            "      TextInput (t) {}" +
-            "      TextInput (u) {}" +
-            "      TextInput (v) {}" +
-            "    }" +
-            "  }" +
-            "  Selection {" +
-            "    TextInput (w) {}" +
-            "    Sequence {" +
-            "      TextInput (x) {}" +
-            "      TextInput (y) {}" +
-            "      TextInput (z) {}" +
-            "      TextInput (aa) {}" +
-            "    }" +
-            "    Iteration {" +
-            "      TextInput (ab) {}" +
-            "    }" +
-            "    TextInput (ac) {}" +
-            "    Selection {" +
-            "      TextInput (ad) {}" +
-            "      TextInput (ae) {}" +
-            "      TextInput (af) {}" +
-            "      TextInput (ag) {}" +
-            "    }" +
-            "  }" +
-            "  TextInput (ah) {}" +
-            "}";
-
-        expectedDefects = new UsabilityDefect[]
-            { new UsabilityDefect(HIGH, TEXT_FIELD_INPUT_RATIO) };
-
-        assertUsabilityEvaluationResult
-            (expectedDefects, manager.evaluateUsability(createTaskModel(spec)));
-    }
-
-    /**
-     * TODO: comment
-     * 
-     */
-    @Test
-    public void testCombinationsOfTextInputInteractionsAndOtherInteractions() {
-        UsabilityEvaluationManager manager = new UsabilityEvaluationManager();
-
-        // ===== check =====
-        String spec =
-            "Sequence {" +
-            "  Interaction {}" +
-            "  TextInput (a) {}" +
-            "  TextInput (b) {}" +
-            "  Interaction {}" +
-            "  TextInput (c) {}" +
-            "}";
-
-        UsabilityDefect[] expectedDefects = new UsabilityDefect[]
-            { new UsabilityDefect(LOW, TEXT_FIELD_INPUT_RATIO) };
-
-        assertUsabilityEvaluationResult
-            (expectedDefects, manager.evaluateUsability(createTaskModel(spec)));
-
-        // ===== check =====
-        spec =
-            "Sequence {" +
-            "  Interaction {}" +
-            "  TextInput (a) {}" +
-            "  Interaction {}" +
-            "  Interaction {}" +
-            "  TextInput (c) {}" +
-            "}";
-
-        expectedDefects = new UsabilityDefect[]
-            { new UsabilityDefect(INFO, TEXT_FIELD_INPUT_RATIO) };
-
-        assertUsabilityEvaluationResult
-            (expectedDefects, manager.evaluateUsability(createTaskModel(spec)));
-
-        // ===== check =====
-        spec =
-            "Sequence {" +
-            "  Interaction {}" +
-            "  TextInput (a) {}" +
-            "  Interaction {}" +
-            "  Interaction {}" +
-            "  Interaction {}" +
-            "}";
-
-        expectedDefects = new UsabilityDefect[0];
-
-        assertUsabilityEvaluationResult
-            (expectedDefects, manager.evaluateUsability(createTaskModel(spec)));
-
-        // ===== check =====
-        spec =
-            "Selection {" +
-            "  Interaction {}" +
-            "  TextInput (a) {}" +
-            "  TextInput (b) {}" +
-            "  Interaction {}" +
-            "  TextInput (c) {}" +
-            "}";
-
-        expectedDefects = new UsabilityDefect[]
-            { new UsabilityDefect(LOW, TEXT_FIELD_INPUT_RATIO) };
-
-        assertUsabilityEvaluationResult
-            (expectedDefects, manager.evaluateUsability(createTaskModel(spec)));
-
-        // ===== check =====
-        spec =
-            "Sequence {" +
-            "  TextInput (a) {}" +
+            "    TextInput elem1 (_a_b_c_) {}" +
+            "  }" +
+            "}";
+
+        UsabilityDefect[] expectedDefects = new UsabilityDefect[]
+            { new UsabilityDefect(HIGH, TEXT_FIELD_INPUT_RATIO),
+              new UsabilityDefect(HIGH, TEXT_FIELD_NO_LETTER_OR_DIGIT_RATIO) };
+
+        assertUsabilityEvaluationResult(expectedDefects, rule.evaluate(createTaskModel(spec)));
+
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void testNoLetterOrDigitInput_02() {
+        TextInputStatisticsRule rule = new TextInputStatisticsRule();
+
+        // ===== check =====
+        String spec =
+            "UserSession {" +
             "  Sequence {" +
-            "    Interaction {}" +
-            "    TextInput (b) {}" +
-            "    TextInput (c) {}" +
-            "    Interaction {}" +
-            "    TextInput (d) {}" +
-            "  }" +
-            "  Iteration {" +
-            "    TextInput (e) {}" +
-            "  }" +
-            "  Interaction {}" +
-            "  Selection {" +
-            "    Interaction {}" +
-            "    TextInput (f) {}" +
-            "    TextInput (g) {}" +
-            "    Interaction {}" +
-            "    TextInput (h) {}" +
-            "    TextInput (i) {}" +
-            "  }" +
+            "    TextInput elem1 (12345_6789012345) {}" +
+            "  }" +
+            "}";
+
+        UsabilityDefect[] expectedDefects = new UsabilityDefect[]
+            { new UsabilityDefect(HIGH, TEXT_FIELD_INPUT_RATIO),
+              new UsabilityDefect(MEDIUM, TEXT_FIELD_NO_LETTER_OR_DIGIT_RATIO) };
+
+        assertUsabilityEvaluationResult(expectedDefects, rule.evaluate(createTaskModel(spec)));
+
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void testNoLetterOrDigitInput_03() {
+        TextInputStatisticsRule rule = new TextInputStatisticsRule();
+
+        // ===== check =====
+        String spec =
+            "UserSession {" +
             "  Sequence {" +
-            "    TextInput (j) {}" +
-            "    Sequence {" +
-            "      TextInput (k) {}" +
-            "      Interaction {}" +
-            "      TextInput (l) {}" +
-            "      TextInput (m) {}" +
-            "      Interaction {}" +
-            "      TextInput (n) {}" +
-            "      TextInput (o) {}" +
-            "    }" +
-            "    Iteration {" +
-            "      Interaction {}" +
-            "    }" +
-            "    Interaction {}" +
-            "    Selection {" +
-            "      TextInput (p) {}" +
-            "      TextInput (q) {}" +
-            "      TextInput (r) {}" +
-            "      Interaction {}" +
-            "      TextInput (s) {}" +
-            "      TextInput (t) {}" +
-            "      Interaction {}" +
-            "      TextInput (u) {}" +
-            "      TextInput (v) {}" +
-            "    }" +
-            "  }" +
-            "  Selection {" +
-            "    Interaction {}" +
-            "    Sequence {" +
-            "      TextInput (w) {}" +
-            "      Interaction {}" +
-            "      TextInput (x) {}" +
-            "      TextInput (y) {}" +
-            "      Interaction {}" +
-            "    }" +
-            "    Iteration {" +
-            "      TextInput (z) {}" +
-            "    }" +
-            "    TextInput (aa) {}" +
-            "    Selection {" +
-            "      TextInput (ab) {}" +
-            "      Interaction {}" +
-            "      TextInput (ac) {}" +
-            "      TextInput (ad) {}" +
-            "      Interaction {}" +
-            "      TextInput (ae) {}" +
-            "    }" +
-            "  }" +
-            "  Interaction {}" +
-            "}";
-
-        expectedDefects = new UsabilityDefect[]
-            { new UsabilityDefect(LOW, TEXT_FIELD_INPUT_RATIO) };
-
-        assertUsabilityEvaluationResult
-            (expectedDefects, manager.evaluateUsability(createTaskModel(spec)));
-
-        // ===== check =====
-        spec =
-            "Sequence {" +
-            "  TextInput (a) {}" +
+            "    TextInput elem1 (123456789012345678901234567890_123456789012345) {}" +
+            "  }" +
+            "}";
+
+        UsabilityDefect[] expectedDefects = new UsabilityDefect[]
+            { new UsabilityDefect(HIGH, TEXT_FIELD_INPUT_RATIO),
+              new UsabilityDefect(LOW, TEXT_FIELD_NO_LETTER_OR_DIGIT_RATIO) };
+
+        assertUsabilityEvaluationResult(expectedDefects, rule.evaluate(createTaskModel(spec)));
+
+    }
+
+    /**
+     *
+     */
+    @Test
+    public void testNoLetterOrDigitInput_04() {
+        TextInputStatisticsRule rule = new TextInputStatisticsRule();
+
+        // ===== check =====
+        String spec =
+            "UserSession {" +
             "  Sequence {" +
-            "    Interaction {}" +
-            "    TextInput (b) {}" +
-            "    Interaction {}" +
-            "    Interaction {}" +
-            "    TextInput (c) {}" +
-            "  }" +
-            "  Iteration {" +
-            "    TextInput (d) {}" +
-            "  }" +
-            "  Interaction {}" +
-            "  Selection {" +
-            "    Interaction {}" +
-            "    TextInput (e) {}" +
-            "    Interaction {}" +
-            "    Interaction {}" +
-            "    TextInput (g) {}" +
-            "    Interaction {}" +
-            "  }" +
-            "  Sequence {" +
-            "    TextInput (i) {}" +
-            "    Sequence {" +
-            "      TextInput (j) {}" +
-            "      Interaction {}" +
-            "      TextInput (k) {}" +
-            "      Interaction {}" +
-            "      Interaction {}" +
-            "      TextInput (m) {}" +
-            "      Interaction {}" +
-            "    }" +
-            "    Iteration {" +
-            "      Interaction {}" +
-            "    }" +
-            "    Interaction {}" +
-            "    Selection {" +
-            "      TextInput (o) {}" +
-            "      Interaction {}" +
-            "      Interaction {}" +
-            "      Interaction {}" +
-            "      Interaction {}" +
-            "      TextInput (s) {}" +
-            "      Interaction {}" +
-            "      TextInput (t) {}" +
-            "      TextInput (u) {}" +
-            "    }" +
-            "  }" +
-            "  Selection {" +
-            "    Interaction {}" +
-            "    Sequence {" +
-            "      TextInput (v) {}" +
-            "      Interaction {}" +
-            "      Interaction {}" +
-            "      TextInput (x) {}" +
-            "      Interaction {}" +
-            "    }" +
-            "    Iteration {" +
-            "      TextInput (y) {}" +
-            "    }" +
-            "    TextInput (z) {}" +
-            "    Selection {" +
-            "      TextInput (aa) {}" +
-            "      Interaction {}" +
-            "      TextInput (ab) {}" +
-            "      Interaction {}" +
-            "      Interaction {}" +
-            "      TextInput (ad) {}" +
-            "    }" +
-            "  }" +
-            "  Interaction {}" +
-            "}";
-
-        expectedDefects = new UsabilityDefect[]
-            { new UsabilityDefect(INFO, TEXT_FIELD_INPUT_RATIO) };
-
-        assertUsabilityEvaluationResult
-            (expectedDefects, manager.evaluateUsability(createTaskModel(spec)));
-    }
-
-    /**
-     * TODO: comment
-     * 
-     */
-    @Test
-    public void testTextEntryRepetitions() {
-        UsabilityEvaluationManager manager = new UsabilityEvaluationManager();
-
-        // ===== check =====
-        String spec =
-            "Sequence {" +
-            "  TextInput (a b c) {}" +
-            "  Sequence {" +
-            "    TextInput (a) {}" +
-            "    TextInput (b) {}" +
-            "    TextInput (c) {}" +
-            "    TextInput (a) {}" +
-            "  }" +
-            "  Iteration {" +
-            "    TextInput (a) {}" +
-            "  }" +
-            "  TextInput (a) {}" +
-            "  Selection {" +
-            "    TextInput (b c) {}" +
-            "    TextInput (a) {}" +
-            "    TextInput (a c) {}" +
-            "    TextInput (b a) {}" +
-            "  }" +
-            "  Sequence {" +
-            "    TextInput (b c) {}" +
-            "    Sequence {" +
-            "      TextInput (d a c) {}" +
-            "      TextInput (b b b a) {}" +
-            "      TextInput (a a c c) {}" +
-            "      TextInput (b b a) {}" +
-            "    }" +
-            "  }" +
-            "  TextInput (d) {}" +
-            "}";
-
-        UsabilityDefect[] expectedDefects = new UsabilityDefect[]
-            { new UsabilityDefect(HIGH, TEXT_FIELD_INPUT_RATIO),
-              new UsabilityDefect(HIGH, TEXT_FIELD_INPUT_REPETITIONS) };
-
-        assertUsabilityEvaluationResult
-            (expectedDefects, manager.evaluateUsability(createTaskModel(spec)));
-
-        // ===== check =====
-        spec =
-            "Sequence {" +
-            "  TextInput (a b c d e f g h i j k l m) {}" +
-            "  Sequence {" +
-            "    TextInput (a) {}" +
-            "    TextInput (b) {}" +
-            "    TextInput (c) {}" +
-            "    TextInput (d) {}" +
-            "  }" +
-            "  Iteration {" +
-            "    TextInput (e) {}" +
-            "  }" +
-            "  TextInput (f) {}" +
-            "  Selection {" +
-            "    TextInput (g) {}" +
-            "    TextInput (h) {}" +
-            "    TextInput (i) {}" +
-            "    TextInput (j) {}" +
-            "  }" +
-            "  Sequence {" +
-            "    TextInput (k) {}" +
-            "    Sequence {" +
-            "      TextInput (l) {}" +
-            "      TextInput (m) {}" +
-            "      TextInput (n) {}" +
-            "      TextInput (o) {}" +
-            "    }" +
-            "  }" +
-            "  TextInput (p) {}" +
-            "}";
-
-        expectedDefects = new UsabilityDefect[]
-            { new UsabilityDefect(HIGH, TEXT_FIELD_INPUT_RATIO),
-              new UsabilityDefect(HIGH, TEXT_FIELD_INPUT_REPETITIONS) };
-
-        assertUsabilityEvaluationResult
-            (expectedDefects, manager.evaluateUsability(createTaskModel(spec)));
-
-        // ===== check =====
-        spec =
-            "Sequence {" +
-            "  TextInput (a b c d e f g h i j k l m) {}" +
-            "  Sequence {" +
-            "    TextInput (a) {}" +
-            "    TextInput (b) {}" +
-            "    TextInput (c) {}" +
-            "    TextInput (d) {}" +
-            "  }" +
-            "  Iteration {" +
-            "    TextInput (e) {}" +
-            "  }" +
-            "  TextInput (a) {}" +
-            "  Selection {" +
-            "    TextInput (b) {}" +
-            "    TextInput (c) {}" +
-            "    TextInput (d) {}" +
-            "    TextInput (e) {}" +
-            "  }" +
-            "  Sequence {" +
-            "    TextInput (a) {}" +
-            "    Sequence {" +
-            "      TextInput (b) {}" +
-            "      TextInput (c) {}" +
-            "      TextInput (d) {}" +
-            "      TextInput (e) {}" +
-            "    }" +
-            "  }" +
-            "  TextInput (f) {}" +
-            "}";
-
-        expectedDefects = new UsabilityDefect[]
-            { new UsabilityDefect(HIGH, TEXT_FIELD_INPUT_RATIO),
-              new UsabilityDefect(MEDIUM, TEXT_FIELD_INPUT_REPETITIONS) };
-
-        assertUsabilityEvaluationResult
-            (expectedDefects, manager.evaluateUsability(createTaskModel(spec)));
-
-        // ===== check =====
-        spec =
-            "Sequence {" +
-            "  TextInput (a b c d e f g h i j k l m) {}" +
-            "  Sequence {" +
-            "    TextInput (a) {}" +
-            "    TextInput (b) {}" +
-            "    TextInput (c) {}" +
-            "    TextInput (a) {}" +
-            "  }" +
-            "  Iteration {" +
-            "    TextInput (b) {}" +
-            "  }" +
-            "  TextInput (c) {}" +
-            "  Selection {" +
-            "    TextInput (a) {}" +
-            "    TextInput (b) {}" +
-            "    TextInput (c) {}" +
-            "    TextInput (a) {}" +
-            "  }" +
-            "  Sequence {" +
-            "    TextInput (b) {}" +
-            "    Sequence {" +
-            "      TextInput (c) {}" +
-            "      TextInput (a) {}" +
-            "      TextInput (b) {}" +
-            "      TextInput (c) {}" +
-            "    }" +
-            "  }" +
-            "  TextInput (a) {}" +
-            "}";
-
-        expectedDefects = new UsabilityDefect[]
-            { new UsabilityDefect(HIGH, TEXT_FIELD_INPUT_RATIO),
-              new UsabilityDefect(MEDIUM, TEXT_FIELD_INPUT_REPETITIONS) };
-
-        assertUsabilityEvaluationResult
-            (expectedDefects, manager.evaluateUsability(createTaskModel(spec)));
-
-        // ===== check =====
-        spec =
-            "Sequence {" +
-            "  TextInput (a b c) {}" +
-            "  Sequence {" +
-            "    TextInput (a) {}" +
-            "    TextInput (b) {}" +
-            "    TextInput (c) {}" +
-            "  }" +
-            "}";
-
-        expectedDefects = new UsabilityDefect[]
-            { new UsabilityDefect(HIGH, TEXT_FIELD_INPUT_RATIO),
-              new UsabilityDefect(LOW, TEXT_FIELD_INPUT_REPETITIONS) };
-
-        assertUsabilityEvaluationResult
-            (expectedDefects, manager.evaluateUsability(createTaskModel(spec)));
-
-        // ===== check =====
-        spec =
-            "Sequence {" +
-            "  TextInput (a b c) {}" +
-            "  Sequence {" +
-            "    TextInput (a) {}" +
-            "    TextInput (a) {}" +
-            "    TextInput (b) {}" +
-            "  }" +
-            "}";
-
-        expectedDefects = new UsabilityDefect[]
-            { new UsabilityDefect(HIGH, TEXT_FIELD_INPUT_RATIO),
-              new UsabilityDefect(LOW, TEXT_FIELD_INPUT_REPETITIONS) };
-
-        assertUsabilityEvaluationResult
-            (expectedDefects, manager.evaluateUsability(createTaskModel(spec)));
-
-        // ===== check =====
-        spec =
-            "Sequence {" +
-            "  TextInput (a b c) {}" +
-            "  Sequence {" +
-            "    TextInput (a) {}" +
-            "    TextInput (d) {}" +
-            "    TextInput (e) {}" +
-            "  }" +
-            "}";
-
-        expectedDefects = new UsabilityDefect[]
-            { new UsabilityDefect(HIGH, TEXT_FIELD_INPUT_RATIO),
-              new UsabilityDefect(INFO, TEXT_FIELD_INPUT_REPETITIONS) };
-
-        assertUsabilityEvaluationResult
-            (expectedDefects, manager.evaluateUsability(createTaskModel(spec)));
-
-    }
-
-    /**
-     * TODO: comment
-     * 
-     */
-    @Test
-    public void testNoLetterOrDigitInput() {
-        UsabilityEvaluationManager manager = new UsabilityEvaluationManager();
-
-        // ===== check =====
-        String spec =
-            "Sequence {" +
-            "  TextInput (_a_b_c_) {}" +
-            "}";
-
-        UsabilityDefect[] expectedDefects = new UsabilityDefect[]
-            { new UsabilityDefect(HIGH, TEXT_FIELD_INPUT_RATIO),
-              new UsabilityDefect(HIGH, TEXT_FIELD_NO_LETTER_OR_DIGIT_RATIO) };
-
-        assertUsabilityEvaluationResult
-            (expectedDefects, manager.evaluateUsability(createTaskModel(spec)));
-
-        // ===== check =====
-        spec =
-            "Sequence {" +
-            "  TextInput (12345_6789012345) {}" +
-            "}";
-
-        expectedDefects = new UsabilityDefect[]
-            { new UsabilityDefect(HIGH, TEXT_FIELD_INPUT_RATIO),
-              new UsabilityDefect(MEDIUM, TEXT_FIELD_NO_LETTER_OR_DIGIT_RATIO) };
-
-        assertUsabilityEvaluationResult
-            (expectedDefects, manager.evaluateUsability(createTaskModel(spec)));
-
-        // ===== check =====
-        spec =
-            "Sequence {" +
-            "  TextInput (123456789012345678901234567890_123456789012345) {}" +
-            "}";
-
-        expectedDefects = new UsabilityDefect[]
-            { new UsabilityDefect(HIGH, TEXT_FIELD_INPUT_RATIO),
-              new UsabilityDefect(LOW, TEXT_FIELD_NO_LETTER_OR_DIGIT_RATIO) };
-
-        assertUsabilityEvaluationResult
-            (expectedDefects, manager.evaluateUsability(createTaskModel(spec)));
-
-        // ===== check =====
-        spec =
-            "Sequence {" +
-            "  TextInput (1234567890123456789012345678901234567890123456789_01234567890" +
+            "    TextInput elem1 (1234567890123456789012345678901234567890123456789_01234567890" +
             "12345678901234567890123456789012345) {}" +
-            "}";
-
-        expectedDefects = new UsabilityDefect[]
+            "  }" +
+            "}";
+
+        UsabilityDefect[] expectedDefects = new UsabilityDefect[]
             { new UsabilityDefect(HIGH, TEXT_FIELD_INPUT_RATIO),
               new UsabilityDefect(INFO, TEXT_FIELD_NO_LETTER_OR_DIGIT_RATIO) };
 
-        assertUsabilityEvaluationResult
-            (expectedDefects, manager.evaluateUsability(createTaskModel(spec)));
+        assertUsabilityEvaluationResult(expectedDefects, rule.evaluate(createTaskModel(spec)));
 
     }
Index: /trunk/autoquest-core-usability/src/main/java/de/ugoe/cs/autoquest/usability/RequiredScrollRule.java
===================================================================
--- /trunk/autoquest-core-usability/src/main/java/de/ugoe/cs/autoquest/usability/RequiredScrollRule.java	(revision 1335)
+++ /trunk/autoquest-core-usability/src/main/java/de/ugoe/cs/autoquest/usability/RequiredScrollRule.java	(revision 1335)
@@ -0,0 +1,206 @@
+//   Copyright 2012 Georg-August-Universität Göttingen, Germany
+//
+//   Licensed 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 de.ugoe.cs.autoquest.usability;
+
+import java.text.DecimalFormat;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Map;
+
+import de.ugoe.cs.autoquest.eventcore.IEventType;
+import de.ugoe.cs.autoquest.eventcore.gui.Scroll;
+import de.ugoe.cs.autoquest.tasktrees.treeifc.IEventTaskInstance;
+import de.ugoe.cs.autoquest.tasktrees.treeifc.IIterationInstance;
+import de.ugoe.cs.autoquest.tasktrees.treeifc.IOptionalInstance;
+import de.ugoe.cs.autoquest.tasktrees.treeifc.ISelectionInstance;
+import de.ugoe.cs.autoquest.tasktrees.treeifc.ISequence;
+import de.ugoe.cs.autoquest.tasktrees.treeifc.ISequenceInstance;
+import de.ugoe.cs.autoquest.tasktrees.treeifc.ITask;
+import de.ugoe.cs.autoquest.tasktrees.treeifc.ITaskInstance;
+import de.ugoe.cs.autoquest.tasktrees.treeifc.ITaskModel;
+
+/**
+ * TODO comment
+ * 
+ * @version $Revision: $ $Date: 16.07.2012$
+ * @author 2012, last modified by $Author: pharms$
+ */
+public class RequiredScrollRule implements UsabilityEvaluationRule {
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see de.ugoe.cs.usability.UsabilityEvaluationRule#evaluate(TaskTree)
+     */
+    @Override
+    public UsabilityEvaluationResult evaluate(ITaskModel taskModel) {
+        Map<ITask, Integer> smellingTasks = getTasksStartingWithScroll(taskModel.getTasks());
+
+        UsabilityEvaluationResult results = new UsabilityEvaluationResult();
+        analyzeTasksStartingWithScroll(smellingTasks, results);
+
+        return results;
+    }
+
+    /**
+     *
+     */
+    private void analyzeTasksStartingWithScroll(Map<ITask, Integer>       smellingTasks,
+                                                UsabilityEvaluationResult results)
+    {
+
+        for (Map.Entry<ITask, Integer> entry : smellingTasks.entrySet()) {
+            float ratio = entry.getValue() / (float) entry.getKey().getInstances().size();
+
+            UsabilityDefectSeverity severity = null;
+            if (ratio > 0.9) {
+                severity = UsabilityDefectSeverity.HIGH;
+            }
+            else if (ratio > 0.6) {
+                severity = UsabilityDefectSeverity.MEDIUM;
+            }
+            else if (ratio > 0.4) {
+                severity = UsabilityDefectSeverity.LOW;
+            }
+            else if (ratio > 0.2) {
+                severity = UsabilityDefectSeverity.INFO;
+            }
+
+            if (severity != null) {
+                Map<String, String> parameters = new HashMap<String, String>();
+                parameters.put("task", entry.getKey().toString());
+                parameters.put("scrollRatio", DecimalFormat.getInstance().format(ratio * 100));
+
+                results.addDefect(severity, UsabilityDefectDescription.SCROLL_REQUIRED, parameters);
+            }
+        }
+    }
+
+    /**
+     * 
+     */
+    private Map<ITask, Integer> getTasksStartingWithScroll(Collection<ITask> tasks) {
+        Map<ITask, Integer> scrollCounts = new HashMap<ITask, Integer>();
+        
+        for (ITask task : tasks) {
+            // only sequences are important for required scrolls
+            if (task instanceof ISequence) {
+                int count = countInstancesStartingWithScroll(task);
+                if (count > 0) {
+                    scrollCounts.put(task, count);
+                }
+            }
+        }
+        
+        return scrollCounts;
+    }
+
+    /**
+     *
+     */
+    private int countInstancesStartingWithScroll(ITask task) {
+        Collection<ITaskInstance> instances = task.getInstances();
+        
+        int counter = 0;
+        for (ITaskInstance instance : instances) {
+            if (startsWithScroll(instance)) {
+                counter++;
+            }
+        }
+        
+        return counter;
+    }
+
+    /**
+     *
+     */
+    private boolean startsWithScroll(ITaskInstance instance) {
+        if (instance instanceof ISequenceInstance) {
+            ITaskInstance firstChild = ((ISequenceInstance) instance).size() > 1 ?
+                ((ISequenceInstance) instance).get(0) : null;
+
+            if (firstChild == null) {
+                throw new IllegalArgumentException
+                    ("instance of a sequence must have at least two children");
+            }
+
+            if (startsWithScroll(firstChild)) {
+                return true;
+            }
+        }
+        else if (instance instanceof ISelectionInstance) {
+            ITaskInstance child = ((ISelectionInstance) instance).getChild();
+            
+            if (child != null) {
+                return startsWithScroll(child);
+            }
+            else {
+                throw new IllegalArgumentException("instance of a selection must have a child");
+            }
+        }
+        else if (instance instanceof IIterationInstance) {
+            ITaskInstance firstChild = ((IIterationInstance) instance).size() > 0 ?
+                ((IIterationInstance) instance).get(0) : null;
+
+            if (firstChild == null) {
+                throw new IllegalArgumentException
+                    ("instance of an iteration must have at least one child");
+            }
+
+            if (startsWithScroll(firstChild)) {
+                return true;
+            }
+        }
+        else if (instance instanceof IOptionalInstance) {
+            ITaskInstance child = ((IOptionalInstance) instance).getChild();
+            
+            if (child != null) {
+                return startsWithScroll(child);
+            }
+        }
+        else if (isScroll(instance)) {
+            return true;
+        }
+        
+        return false;
+    }
+
+    /**
+     * @param firstChild
+     * @return
+     */
+    private boolean isScroll(ITaskInstance instance) {
+        ITaskInstance instanceToCheck = instance;
+        
+        if (instanceToCheck instanceof IIterationInstance) {
+            instanceToCheck = ((IIterationInstance) instanceToCheck).size() > 0 ?
+                ((IIterationInstance) instanceToCheck).get(0) : null;
+
+            if (instanceToCheck == null) {
+                throw new IllegalArgumentException
+                    ("instance of an iteration must have at least one child");
+            }
+        }
+        
+        if (instanceToCheck instanceof IEventTaskInstance) {
+            IEventType type = ((IEventTaskInstance) instanceToCheck).getEvent().getType();
+            
+            return (type instanceof Scroll);
+        }
+        
+        return false;
+    }
+
+}
Index: /trunk/autoquest-core-usability/src/main/java/de/ugoe/cs/autoquest/usability/TextInputStatisticsRule.java
===================================================================
--- /trunk/autoquest-core-usability/src/main/java/de/ugoe/cs/autoquest/usability/TextInputStatisticsRule.java	(revision 1334)
+++ /trunk/autoquest-core-usability/src/main/java/de/ugoe/cs/autoquest/usability/TextInputStatisticsRule.java	(revision 1335)
@@ -19,6 +19,9 @@
 import java.util.Collection;
 import java.util.HashMap;
+import java.util.HashSet;
+import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 
 import de.ugoe.cs.autoquest.eventcore.IEventTarget;
@@ -27,11 +30,12 @@
 import de.ugoe.cs.autoquest.eventcore.guimodel.ITextArea;
 import de.ugoe.cs.autoquest.eventcore.guimodel.ITextField;
-import de.ugoe.cs.autoquest.tasktrees.treeifc.IEventTask;
 import de.ugoe.cs.autoquest.tasktrees.treeifc.IEventTaskInstance;
-import de.ugoe.cs.autoquest.tasktrees.treeifc.IMarkingTemporalRelationship;
-import de.ugoe.cs.autoquest.tasktrees.treeifc.IStructuringTemporalRelationship;
-import de.ugoe.cs.autoquest.tasktrees.treeifc.ITask;
+import de.ugoe.cs.autoquest.tasktrees.treeifc.IIterationInstance;
+import de.ugoe.cs.autoquest.tasktrees.treeifc.IOptionalInstance;
+import de.ugoe.cs.autoquest.tasktrees.treeifc.ISelectionInstance;
+import de.ugoe.cs.autoquest.tasktrees.treeifc.ISequenceInstance;
 import de.ugoe.cs.autoquest.tasktrees.treeifc.ITaskInstance;
 import de.ugoe.cs.autoquest.tasktrees.treeifc.ITaskModel;
+import de.ugoe.cs.autoquest.tasktrees.treeifc.IUserSession;
 
 /**
@@ -41,5 +45,5 @@
  * @author 2012, last modified by $Author: pharms$
  */
-public class TextInputStatisticsRule implements de.ugoe.cs.autoquest.usability.UsabilityEvaluationRule {
+public class TextInputStatisticsRule implements UsabilityEvaluationRule {
 
     /*
@@ -51,5 +55,5 @@
     public UsabilityEvaluationResult evaluate(ITaskModel taskModel) {
         TextInputStatistics statistics = new TextInputStatistics();
-        calculateStatistics(taskModel.getTasks(), statistics);
+        calculateStatistics(taskModel.getUserSessions(), statistics);
 
         UsabilityEvaluationResult results = new UsabilityEvaluationResult();
@@ -97,9 +101,8 @@
         if (severity != null) {
             Map<String, String> parameters = new HashMap<String, String>();
-            parameters.put("textInputRatio", DecimalFormat.getInstance().format(ratio * 100) + "%");
+            parameters.put("textInputRatio", DecimalFormat.getInstance().format(ratio * 100));
 
             results.addDefect
-                (new UsabilityDefect(severity, UsabilityDefectDescription.TEXT_FIELD_INPUT_RATIO,
-                                     parameters));
+                (severity, UsabilityDefectDescription.TEXT_FIELD_INPUT_RATIO, parameters);
         }
     }
@@ -111,53 +114,58 @@
                                                 UsabilityEvaluationResult results)
     {
-        Map<String, Integer> words = new HashMap<String, Integer>();
-        int numberOfRepeatedWords = 0;
-        int maxRepetitions = 0;
-
-        for (int i = 0; i < statistics.getNoOfTextFieldInputs(); i++) {
-            String[] fragments = statistics.getTextFieldInputFragments(i);
-            for (String fragment : fragments) {
-                if (!"".equals(fragment.trim())) {
-                    Integer count = words.get(fragment);
-                    if (count == null) {
-                        words.put(fragment, 1);
-                    }
-                    else {
-                        count++;
-                        words.put(fragment, count);
-                        maxRepetitions = Math.max(count, maxRepetitions);
-
-                        if (count == 2) {
-                            // do not calculate repeated words several times
-                            numberOfRepeatedWords++;
-                        }
-                    }
-                }
-            }
-        }
-
+        List<TextFieldCorrelation> textFieldCorrelations =
+            statistics.determineTextFieldCorrelations();
+        
+        for (TextFieldCorrelation entry : textFieldCorrelations) {
+            int noOfUsagesOfTextField1 = statistics.getUsageCount(entry.textField1);
+            int noOfUsagesOfTextField2 = statistics.getUsageCount(entry.textField2);
+            int noOfUsagesOfTextField1WithSameTextInTextField2 = entry.enteredTexts.size();
+            
+            float ratioTextField1 =
+                noOfUsagesOfTextField1WithSameTextInTextField2 / (float) noOfUsagesOfTextField1;
+            
+            float ratioTextField2 =
+                noOfUsagesOfTextField1WithSameTextInTextField2 / (float) noOfUsagesOfTextField2;
+            
+            createTextFieldEntryRepetitionDefect
+                (ratioTextField1, entry.textField1, entry.textField2, results);
+            
+            createTextFieldEntryRepetitionDefect
+                (ratioTextField2, entry.textField2, entry.textField1, results);
+            
+        }
+    }
+
+    /**
+     *
+     */
+    private void createTextFieldEntryRepetitionDefect(float                     ratioOfEqualEntries,
+                                                      ITextField                textField1,
+                                                      ITextField                textField2,
+                                                      UsabilityEvaluationResult results)
+    {
         UsabilityDefectSeverity severity = null;
-        if ((numberOfRepeatedWords > 10) || (maxRepetitions > 10)) {
+        if (ratioOfEqualEntries > 0.9) {
             severity = UsabilityDefectSeverity.HIGH;
         }
-        else if ((numberOfRepeatedWords > 4) || (maxRepetitions > 4)) {
+        else if (ratioOfEqualEntries > 0.5) {
             severity = UsabilityDefectSeverity.MEDIUM;
         }
-        else if ((numberOfRepeatedWords > 2) || (maxRepetitions > 2)) {
+        else if (ratioOfEqualEntries > 0.2) {
             severity = UsabilityDefectSeverity.LOW;
         }
-        else if ((numberOfRepeatedWords > 1) || (maxRepetitions > 1)) {
+        else if (ratioOfEqualEntries > 0.1) {
             severity = UsabilityDefectSeverity.INFO;
         }
-
+        
         if (severity != null) {
             Map<String, String> parameters = new HashMap<String, String>();
-            parameters.put("textRepetitionRatio", numberOfRepeatedWords +
-                           " repeated tokens, up to " + maxRepetitions + " repetitions per token");
+            parameters.put("textRepetitionRatio",
+                           DecimalFormat.getInstance().format(ratioOfEqualEntries * 100));
+            parameters.put("textField1", textField1.toString());
+            parameters.put("textField2", textField2.toString());
 
             results.addDefect
-                (new UsabilityDefect(severity,
-                                     UsabilityDefectDescription.TEXT_FIELD_INPUT_REPETITIONS,
-                                     parameters));
+                (severity, UsabilityDefectDescription.TEXT_FIELD_INPUT_REPETITIONS, parameters);
         }
     }
@@ -169,14 +177,12 @@
                                                      UsabilityEvaluationResult results)
     {
-        int allCharactersCount = 0;
-        int noLetterOrDigitCount = 0;
-
-        for (int i = 0; i < statistics.getNoOfTextFieldInputs(); i++) {
-            String[] fragments = statistics.getTextFieldInputFragments(i);
-            for (String fragment : fragments) {
-                String effectiveFragment = fragment.trim();
-                for (int j = 0; j < effectiveFragment.length(); j++) {
-                    if (!Character.isWhitespace(effectiveFragment.charAt(j))) {
-                        if (!Character.isLetterOrDigit(effectiveFragment.charAt(j))) {
+        for (ITextField textField : statistics.getAllTextFields()) {
+            int allCharactersCount = 0;
+            int noLetterOrDigitCount = 0;
+
+            for (String textInput : statistics.getAllInputsInto(textField)) {
+                for (int j = 0; j < textInput.length(); j++) {
+                    if (!Character.isWhitespace(textInput.charAt(j))) {
+                        if (!Character.isLetterOrDigit(textInput.charAt(j))) {
                             noLetterOrDigitCount++;
                         }
@@ -185,35 +191,30 @@
                 }
             }
-        }
-
-        float ratio = (float) noLetterOrDigitCount / (float) allCharactersCount;
-
-        UsabilityDefectSeverity severity = null;
-        if (ratio > 0.1) // every 10th sign
-        {
-            severity = UsabilityDefectSeverity.HIGH;
-        }
-        else if (ratio > 0.05) // every 20th sign
-        {
-            severity = UsabilityDefectSeverity.MEDIUM;
-        }
-        else if (ratio > 0.02) // every 50th sign
-        {
-            severity = UsabilityDefectSeverity.LOW;
-        }
-        else if (ratio > 0.01) // every 100th sign
-        {
-            severity = UsabilityDefectSeverity.INFO;
-        }
-
-        if (severity != null) {
-            Map<String, String> parameters = new HashMap<String, String>();
-            parameters.put("noLetterOrDigitRatio", allCharactersCount + " entered characters of " +
-                           "which " + noLetterOrDigitCount + " were no letter or digit");
-
-            results.addDefect
-                (new UsabilityDefect(severity,
-                                     UsabilityDefectDescription.TEXT_FIELD_NO_LETTER_OR_DIGIT_RATIO,
-                                     parameters));
+
+            float ratio = (float) noLetterOrDigitCount / (float) allCharactersCount;
+
+            UsabilityDefectSeverity severity = null;
+            if (ratio > 0.1) { // every 10th sign
+                severity = UsabilityDefectSeverity.HIGH;
+            }
+            else if (ratio > 0.05) { // every 20th sign
+                severity = UsabilityDefectSeverity.MEDIUM;
+            }
+            else if (ratio > 0.02) { // every 50th sign
+                severity = UsabilityDefectSeverity.LOW;
+            }
+            else if (ratio > 0.01) { // every 100th sign
+                severity = UsabilityDefectSeverity.INFO;
+            }
+
+            if (severity != null) {
+                Map<String, String> parameters = new HashMap<String, String>();
+                parameters.put("textField", textField.toString());
+                parameters.put("noLetterOrDigitRatio",
+                               DecimalFormat.getInstance().format(ratio * 100));
+
+                results.addDefect
+                    (severity, UsabilityDefectDescription.TEXT_FIELD_NO_LETTER_OR_DIGIT_RATIO, parameters);
+            }
         }
     }
@@ -222,29 +223,46 @@
      * 
      */
-    private void calculateStatistics(Collection<ITask> tasks, TextInputStatistics statistics) {
-        for (ITask task : tasks) {
-            calculateStatistics(task, statistics);
-        }
-    }
-
-    /**
-     *
-     */
-    private void calculateStatistics(ITask task, TextInputStatistics statistics) {
-        
-        if (isTextInput(task)) {
-            calculateStatistics((IEventTask) task, statistics);
+    private void calculateStatistics(Collection<IUserSession> sessions,
+                                     TextInputStatistics      statistics)
+    {
+        System.out.print("calculating statistics ... ");
+        for (IUserSession session : sessions) {
+            for (ITaskInstance taskInstance : session) {
+                calculateStatistics(taskInstance, session, statistics);
+            }
+        }
+        System.out.println("done");
+    }
+
+    /**
+     *
+     */
+    private void calculateStatistics(ITaskInstance       taskInstance,
+                                     IUserSession        session,
+                                     TextInputStatistics statistics)
+    {
+        if (isTextInput(taskInstance)) {
+            calculateStatistics((IEventTaskInstance) taskInstance, session, statistics);
         }
         else {
-            if (task instanceof IStructuringTemporalRelationship) {
-                for (ITask child : ((IStructuringTemporalRelationship) task).getChildren()) {
-                    calculateStatistics(child, statistics);
-                }
-            }
-            else if (task instanceof IMarkingTemporalRelationship) {
+            if (taskInstance instanceof ISequenceInstance) {
+                for (ITaskInstance child : (ISequenceInstance) taskInstance) {
+                    calculateStatistics(child, session, statistics);
+                }
+            }
+            else if (taskInstance instanceof IIterationInstance) {
+                for (ITaskInstance child : (IIterationInstance) taskInstance) {
+                    calculateStatistics(child, session, statistics);
+                }
+            }
+            else if (taskInstance instanceof ISelectionInstance) {
                 calculateStatistics
-                    (((IMarkingTemporalRelationship) task).getMarkedTask(), statistics);
-            }
-            else {
+                    (((ISelectionInstance) taskInstance).getChild(), session, statistics);
+            }
+            else if (taskInstance instanceof IOptionalInstance) {
+                calculateStatistics
+                    (((IOptionalInstance) taskInstance).getChild(), session, statistics);
+            }
+            else{
                 statistics.incrementNoOfOtherEventTasks();
             }
@@ -255,10 +273,7 @@
      *
      */
-    private boolean isTextInput(ITask task) {
-        if (task.getInstances().size() > 0) {
-            ITaskInstance instance = task.getInstances().iterator().next();
-            if (instance instanceof IEventTaskInstance) {
-                return ((IEventTaskInstance) instance).getEvent().getType() instanceof TextInput;
-            }
+    private boolean isTextInput(ITaskInstance taskInstance) {
+        if (taskInstance instanceof IEventTaskInstance) {
+            return ((IEventTaskInstance) taskInstance).getEvent().getType() instanceof TextInput;
         }
 
@@ -269,28 +284,25 @@
      *
      */
-    private void calculateStatistics(IEventTask node, TextInputStatistics statistics) {
-        
-        for (ITaskInstance instance : node.getInstances()) {
-            IEventType type = ((IEventTaskInstance) instance).getEvent().getType();
-            IEventTarget target = ((IEventTaskInstance) instance).getEvent().getTarget();
-
-            if (type instanceof TextInput) {
-                String[] fragments =
-                    determineTextFragments(((TextInput) type).getEnteredText());
-                
-                if (target instanceof ITextField) {
-                    statistics.addTextFieldInput(node, fragments);
-                }
-                else if (target instanceof ITextArea) {
-                    statistics.addTextAreaInput(node, fragments);
-                }
-            }
-        }
-    }
-
-    /**
-     *
-     */
-    private String[] determineTextFragments(String enteredText) {
+    private void calculateStatistics(IEventTaskInstance  taskInstance,
+                                     IUserSession        session,
+                                     TextInputStatistics statistics)
+    {
+        IEventType type = taskInstance.getEvent().getType();
+        IEventTarget target = taskInstance.getEvent().getTarget();
+
+        if (type instanceof TextInput) {
+            if (target instanceof ITextField) {
+                statistics.addTextFieldInput(taskInstance, session);
+            }
+            else if (target instanceof ITextArea) {
+                statistics.addTextAreaInput(taskInstance, session);
+            }
+        }
+    }
+
+    /**
+     *
+     */
+/*    private static String[] determineTextFragments(String enteredText) {
         List<String> fragments = new ArrayList<String>();
 
@@ -304,5 +316,10 @@
                 // the previous fragment ended. so finalize it and start a new one
                 if ((fragment != null) && (fragment.length() > 0)) {
-                    fragments.add(fragment.toString());
+                    String fragmentStr = fragment.toString().trim();
+                    
+                    if (!"".equals(fragmentStr)) {
+                        fragments.add(fragmentStr);
+                    }
+                    
                     fragment = new StringBuffer();
                 }
@@ -314,5 +331,9 @@
 
         if ((fragment != null) && (fragment.length() > 0)) {
-            fragments.add(fragment.toString());
+            String fragmentStr = fragment.toString().trim();
+            
+            if (!"".equals(fragmentStr)) {
+                fragments.add(fragmentStr);
+            }
         }
 
@@ -323,5 +344,5 @@
      *
      */
-    private boolean isEqualCharacterType(char char1, char char2) {
+/*    private static boolean isEqualCharacterType(char char1, char char2) {
         return
             ((char1 == char2) ||
@@ -330,77 +351,245 @@
             (Character.isLetter(char1) && Character.isLetter(char2)) ||
             (Character.isJavaIdentifierPart(char1) && Character.isJavaIdentifierPart(char2)));
-    }
-
-    /**
-     * TODO comment
+    }*/
+
+    /**
+     *
+     */
+    private static class TextInputStatistics {
+        
+        /** */
+        private List<IEventTaskInstance> textFieldInputs = new ArrayList<IEventTaskInstance>();
+        
+        /** */
+        private Map<ITextField, List<String>> textFields = new HashMap<ITextField, List<String>>();
+
+        /** */
+        private List<IEventTaskInstance> textAreaInputs = new ArrayList<IEventTaskInstance>();
+
+        /** */
+        private Map<IUserSession, Map<String, TextEntryData>> textEntries =
+            new HashMap<IUserSession, Map<String, TextEntryData>>();
+
+        /** */
+        private int otherEventsCount;
+
+        /**
+         *
+         */
+        private void addTextFieldInput(IEventTaskInstance instance, IUserSession session) {
+            String enteredText = ((TextInput) instance.getEvent().getType()).getEnteredText();
+            
+            if ((enteredText != null) && (!"".equals(enteredText.trim()))) {
+                enteredText = enteredText.trim();
+                
+                textFieldInputs.add(instance);
+
+                // store text entries into text fields
+                List<String> entries = textFields.get(instance.getEvent().getTarget());
+
+                if (entries == null) {
+                    entries = new LinkedList<String>();
+                    textFields.put((ITextField) instance.getEvent().getTarget(), entries);
+                }
+                
+                entries.add(enteredText);
+
+                // writing down all text entries in text fields to check later for cooccurrences in
+                // same session
+                Map<String, TextEntryData> sessionTextEntries = textEntries.get(session);
+
+                if (sessionTextEntries == null) {
+                    sessionTextEntries = new HashMap<String, TextEntryData>();
+                    textEntries.put(session, sessionTextEntries);
+                }
+
+                TextEntryData data = sessionTextEntries.get(enteredText);
+
+                if (data == null) {
+                    data = new TextEntryData(enteredText);
+                    sessionTextEntries.put(enteredText, data);
+                }
+
+                data.addTaskInstance(instance);
+            }
+        }
+        
+        /**
+         *
+         */
+        public List<String> getAllInputsInto(ITextField textField) {
+            return textFields.get(textField);
+        }
+
+        /**
+         *
+         */
+        private int getUsageCount(ITextField textField) {
+            List<String> entries = textFields.get(textField);
+            
+            if (entries == null) {
+                return 0;
+            }
+            else {
+                return entries.size();
+            }
+        }
+
+        /**
+         *
+         */
+        private List<TextFieldCorrelation> determineTextFieldCorrelations() {
+            System.out.print("determining text field correlations of " + textFields.size() +
+                             " text fields ... ");
+            List<TextFieldCorrelation> correlations = new ArrayList<TextFieldCorrelation>();
+            
+            // we need an ordered list of text fields to be able compare all with each other
+            // through a nested loop
+            List<ITextField> textFieldList = getAllTextFields();
+            
+            List<TextEntryData> relevantTextEntryData = new LinkedList<TextEntryData>();
+            
+            for (Map<String, TextEntryData> sessionSpecEntries : textEntries.values()) {
+                for (TextEntryData data : sessionSpecEntries.values()) {
+                    if (data.textFields.size() > 1) {
+                        relevantTextEntryData.add(data);
+                    }
+                }
+            }
+            
+            for (int i = 0; i < (textFieldList.size() - 1); i++) {
+                for (int j = i + 1; j < textFieldList.size(); j++) {
+                    // count the number of times, in which the same text was entered in both
+                    // text fields within the same session
+                    List<String> sameEnteredTexts = new LinkedList<String>();
+
+                    for (TextEntryData data : relevantTextEntryData) {
+                        if (data.textFields.contains(textFieldList.get(i)) &&
+                            data.textFields.contains(textFieldList.get(j)))
+                        {
+                            sameEnteredTexts.add(data.enteredText);
+                        }
+                    }
+
+                    if (sameEnteredTexts.size() > 0) {
+                        // for the checked combination of text fields, there is at least once
+                        // the same text entered into both text fields during the same session
+                        correlations.add(new TextFieldCorrelation(textFieldList.get(i),
+                                                                  textFieldList.get(j),
+                                                                  sameEnteredTexts));
+                    }
+                }
+            }
+            
+            System.out.println("done");
+            
+            return correlations;
+        }
+
+        /**
+         *
+         */
+        private void addTextAreaInput(IEventTaskInstance instance, IUserSession session) {
+            textAreaInputs.add(instance);
+        }
+
+        /**
+         *
+         */
+        private int getNoOfAllEvents() {
+            return textFieldInputs.size() + textAreaInputs.size() + otherEventsCount;
+        }
+
+        /**
+         *
+         */
+        private int getNoOfTextFieldInputs() {
+            return textFieldInputs.size();
+        }
+
+        /**
+         *
+         */
+        private int getNoOfTextAreaInputs() {
+            return textAreaInputs.size();
+        }
+
+        /**
+         *
+         */
+        private void incrementNoOfOtherEventTasks() {
+            otherEventsCount++;
+        }
+
+        /**
+         * 
+         */
+        private List<ITextField> getAllTextFields() {
+            List<ITextField> textFieldList = new ArrayList<ITextField>(textFields.size());
+            
+            for (ITextField textField : textFields.keySet()) {
+                textFieldList.add(textField);
+            }
+            
+            return textFieldList;
+        }
+    }
+    
+    /**
      * 
-     * @version $Revision: $ $Date: 16.07.2012$
-     * @author 2012, last modified by $Author: pharms$
-     */
-    public static class TextInputStatistics {
-        
-        /** */
-        private List<Object[]> textFieldInputs = new ArrayList<Object[]>();
-
-        /** */
-        private List<Object[]> textAreaInputs = new ArrayList<Object[]>();
-
-        /** */
-        private int otherEventsCount;
-
-        /**
-         *
-         */
-        public void addTextFieldInput(IEventTask node, String[] fragments) {
-            textFieldInputs.add(new Object[] { node, fragments });
-        }
-
-        /**
-         *
-         */
-        public void addTextAreaInput(IEventTask node, String[] fragments) {
-            textAreaInputs.add(new Object[] { node, fragments });
-        }
-
-        /**
-         *
-         */
-        public int getNoOfAllEvents() {
-            return textFieldInputs.size() + textAreaInputs.size() + otherEventsCount;
-        }
-
-        /**
-         *
-         */
-        public int getNoOfTextFieldInputs() {
-            return textFieldInputs.size();
-        }
-
-        /**
-         *
-         */
-        public String[] getTextFieldInputFragments(int index) {
-            return (String[]) textFieldInputs.get(index)[1];
-        }
-
-        /**
-         *
-         */
-        public int getNoOfTextAreaInputs() {
-            return textAreaInputs.size();
-        }
-
-        /**
-         *
-         */
-        public String[] getTextAreaInputFragments(int index) {
-            return (String[]) textAreaInputs.get(index)[1];
-        }
-
-        /**
-         *
-         */
-        public void incrementNoOfOtherEventTasks() {
-            otherEventsCount++;
+     */
+    private static class TextEntryData {
+        
+        /** */
+        private String enteredText;
+        
+        /** */
+        private List<IEventTaskInstance> respectiveTaskInstances =
+            new LinkedList<IEventTaskInstance>();
+
+        /** */
+        private Set<ITextField> textFields = new HashSet<ITextField>();
+        
+        /**
+         *
+         */
+        private TextEntryData(String text) {
+            this.enteredText = text;
+        }
+
+        /**
+         *
+         */
+        private void addTaskInstance(IEventTaskInstance instance) {
+            respectiveTaskInstances.add(instance);
+            textFields.add((ITextField) instance.getEvent().getTarget());
+        }
+        
+    }
+
+    /**
+     * 
+     */
+    private static class TextFieldCorrelation {
+        
+        /** */
+        private List<String> enteredTexts = new LinkedList<String>();
+
+        /** */
+        private ITextField textField1;
+        
+        /** */
+        private ITextField textField2;
+        
+        /**
+         *
+         */
+        private TextFieldCorrelation(ITextField   textField1,
+                                     ITextField   textField2,
+                                     List<String> enteredTexts)
+        {
+            this.textField1 = textField1;
+            this.textField2 = textField2;
+            this.enteredTexts = enteredTexts;
         }
 
Index: /trunk/autoquest-core-usability/src/main/java/de/ugoe/cs/autoquest/usability/UsabilityDefect.java
===================================================================
--- /trunk/autoquest-core-usability/src/main/java/de/ugoe/cs/autoquest/usability/UsabilityDefect.java	(revision 1334)
+++ /trunk/autoquest-core-usability/src/main/java/de/ugoe/cs/autoquest/usability/UsabilityDefect.java	(revision 1335)
@@ -37,5 +37,5 @@
      *
      */
-    public UsabilityDefect(UsabilityDefectSeverity severity, UsabilityDefectDescription description)
+    UsabilityDefect(UsabilityDefectSeverity severity, UsabilityDefectDescription description)
     {
         this(severity, description, null);
@@ -45,7 +45,7 @@
      *
      */
-    public UsabilityDefect(UsabilityDefectSeverity    severity,
-                           UsabilityDefectDescription description,
-                           Map<String, String>        parameters)
+    UsabilityDefect(UsabilityDefectSeverity    severity,
+                    UsabilityDefectDescription description,
+                    Map<String, String>        parameters)
     {
         this.severity = severity;
Index: /trunk/autoquest-core-usability/src/main/java/de/ugoe/cs/autoquest/usability/UsabilityDefectDescription.java
===================================================================
--- /trunk/autoquest-core-usability/src/main/java/de/ugoe/cs/autoquest/usability/UsabilityDefectDescription.java	(revision 1334)
+++ /trunk/autoquest-core-usability/src/main/java/de/ugoe/cs/autoquest/usability/UsabilityDefectDescription.java	(revision 1335)
@@ -33,4 +33,5 @@
 public enum UsabilityDefectDescription {
     
+    SCROLL_REQUIRED,
     TEXT_FIELD_INPUT_RATIO,
     TEXT_FIELD_INPUT_REPETITIONS,
Index: /trunk/autoquest-core-usability/src/main/java/de/ugoe/cs/autoquest/usability/UsabilityEvaluationManager.java
===================================================================
--- /trunk/autoquest-core-usability/src/main/java/de/ugoe/cs/autoquest/usability/UsabilityEvaluationManager.java	(revision 1334)
+++ /trunk/autoquest-core-usability/src/main/java/de/ugoe/cs/autoquest/usability/UsabilityEvaluationManager.java	(revision 1335)
@@ -46,4 +46,5 @@
     private void init() {
         rules.add(new TextInputStatisticsRule());
+        rules.add(new RequiredScrollRule());
     }
 
@@ -54,10 +55,10 @@
         Console.traceln(Level.INFO, "evaluating usability of task model " + taskModel);
 
-        List<UsabilityEvaluationResult> results = new ArrayList<UsabilityEvaluationResult>();
+        List<UsabilityEvaluationResult> interimResults = new ArrayList<UsabilityEvaluationResult>();
 
         for (UsabilityEvaluationRule rule : rules) {
             Console.traceln(Level.INFO, "applying rule " + rule.getClass().getSimpleName());
             UsabilityEvaluationResult result = rule.evaluate(taskModel);
-            results.add(result);
+            interimResults.add(result);
             Console.traceln(Level.INFO, "the rule found " + result.getAllDefects().size() +
                             " usability defects, of which " + result.getSevereDefects().size() +
@@ -65,20 +66,11 @@
         }
 
-        UsabilityEvaluationResult result = mergeResults(results);
+        UsabilityEvaluationResult result = new UsabilityEvaluationResult(interimResults);
         Console.println("the evaluation result contains " + result.getAllDefects().size() +
                         " defects, of which " + result.getSevereDefects().size() + " are severe.");
-        return result;
-    }
 
-    /**
-     *
-     */
-    private UsabilityEvaluationResult mergeResults(List<UsabilityEvaluationResult> results) {
-        UsabilityEvaluationResult result = new UsabilityEvaluationResult();
-
-        for (UsabilityEvaluationResult ruleResult : results) {
-            for (UsabilityDefect defect : ruleResult.getAllDefects()) {
-                result.addDefect(defect);
-            }
+        List<UsabilityDefect> defects = result.getAllDefects();
+        for (int i = 0; i < defects.size(); i++) {
+            Console.println((i + 1) + ": " + defects.get(i).getParameterizedDescription());
         }
 
Index: /trunk/autoquest-core-usability/src/main/java/de/ugoe/cs/autoquest/usability/UsabilityEvaluationResult.java
===================================================================
--- /trunk/autoquest-core-usability/src/main/java/de/ugoe/cs/autoquest/usability/UsabilityEvaluationResult.java	(revision 1334)
+++ /trunk/autoquest-core-usability/src/main/java/de/ugoe/cs/autoquest/usability/UsabilityEvaluationResult.java	(revision 1335)
@@ -17,4 +17,5 @@
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Map;
 
 /**
@@ -32,6 +33,27 @@
      *
      */
-    public void addDefect(UsabilityDefect defect) {
-        defects.add(defect);
+    public UsabilityEvaluationResult() {
+        // default constructor
+    }
+
+    /**
+     *
+     */
+    public UsabilityEvaluationResult(List<UsabilityEvaluationResult> results) {
+        for (UsabilityEvaluationResult result : results) {
+            for (UsabilityDefect defect : result.getAllDefects()) {
+                defects.add(defect);
+            }
+        }
+    }
+
+    /**
+     *
+     */
+    public void addDefect(UsabilityDefectSeverity    severity,
+                          UsabilityDefectDescription description,
+                          Map<String, String>        parameters)
+    {
+        defects.add(new UsabilityDefect(severity, description, parameters));
     }
 
Index: /trunk/autoquest-core-usability/src/main/resources/defectDescriptions_en.xml
===================================================================
--- /trunk/autoquest-core-usability/src/main/resources/defectDescriptions_en.xml	(revision 1334)
+++ /trunk/autoquest-core-usability/src/main/resources/defectDescriptions_en.xml	(revision 1335)
@@ -12,5 +12,5 @@
     <parameterFragment parameterName="textInputRatio" />
     <textFragment>
-      ). This should be reduced. As an example, entering data can also be done using check boxes
+      %). This should be reduced. As an example, entering data can also be done using check boxes
       or combo boxes in the case predefined values must be entered.
     </textFragment>
@@ -19,25 +19,48 @@
   <defectDescription defectId="TEXT_FIELD_INPUT_REPETITIONS">
     <textFragment>
-      Several interactions that enter text into text fields repeat tokens such as words or
-      specific signs (
+      In
     </textFragment>
     <parameterFragment parameterName="textRepetitionRatio" />
     <textFragment>
-      ). This is an indicator that the same data must be entered several times. This could be
-      better supported by using e.g. automatic filling of input fields, provision of combo
-      boxes or lists prefilled with data that was already entered previously. 
+      % of entering text into text field 
+    </textFragment>
+    <parameterFragment parameterName="textField1" />
+    <textFragment>
+      , the same text was also entered into text field
+    </textFragment>
+    <parameterFragment parameterName="textField2" />
+    <textFragment>
+      during the same session. Perhaps this can be automated, so that the user does not have to
+      reenter the same text several times into different text fields.
     </textFragment>
   </defectDescription>
   
   <defectDescription defectId="TEXT_FIELD_NO_LETTER_OR_DIGIT_RATIO">
-    <textFragment>
-      Much of the text entered into text fields contains signs other than letters or digits (
-    </textFragment>
     <parameterFragment parameterName="noLetterOrDigitRatio" />
     <textFragment>
-      ). This is an indicator that the entered data has to follow a specific syntax. This should
-      be supported by syntax checking, auto completion or even providing the text fields in a way
-      that does not require the entering of special signs as they are already included at the right
-      positions.
+      % of the text entered into text field
+    </textFragment>
+    <parameterFragment parameterName="textField" />
+    <textFragment>
+      was no letter or digit. This is an indicator that the entered data has to follow a specific
+      syntax. This should be supported by syntax checking, auto completion or even providing the
+      text fields in a way that does not require the entering of special signs as they are already
+      included at the right positions.
+    </textFragment>
+  </defectDescription>
+  
+  <defectDescription defectId="SCROLL_REQUIRED">
+    <textFragment>
+      In
+    </textFragment>
+    <parameterFragment parameterName="scrollRatio" />
+    <textFragment>
+      % of all occurrences, the task
+    </textFragment>
+    <parameterFragment parameterName="task" />
+    <textFragment>
+      is started with a scroll. This should be prevented as scrolling decreases the efficiency of
+      the user and indicates, that not all required information is visible at once in the
+      respective view. However, scrolling for reading of texts is no problem.
     </textFragment>
   </defectDescription>
