diff --git a/example-projects/ExampleProject/descriptor/uima/ruta/example/AuthorEngine.xml b/example-projects/ExampleProject/descriptor/uima/ruta/example/AuthorEngine.xml
index a5d84f5..cc48daf 100644
--- a/example-projects/ExampleProject/descriptor/uima/ruta/example/AuthorEngine.xml
+++ b/example-projects/ExampleProject/descriptor/uima/ruta/example/AuthorEngine.xml
@@ -1,11 +1,28 @@
 <?xml version="1.0" encoding="UTF-8"?>
-
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one
+  or more contributor license agreements.  See the NOTICE file
+  distributed with this work for additional information
+  regarding copyright ownership.  The ASF licenses this file
+  to you under the Apache License, Version 2.0 (the
+  "License"); you may not use this file except in compliance
+  with the License.  You may obtain a copy of the License at
+  
+  http://www.apache.org/licenses/LICENSE-2.0
+  
+  Unless required by applicable law or agreed to in writing,
+  software distributed under the License is distributed on an
+  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  KIND, either express or implied.  See the License for the
+  specific language governing permissions and limitations
+  under the License.
+-->
 <analysisEngineDescription xmlns="http://uima.apache.org/resourceSpecifier">
     <frameworkImplementation>org.apache.uima.java</frameworkImplementation>
     <primitive>true</primitive>
     <annotatorImplementationName>org.apache.uima.ruta.engine.RutaEngine</annotatorImplementationName>
     <analysisEngineMetaData>
-        <name>BasicEngine</name>
+        <name>uima.ruta.example.AuthorEngine</name>
         <description/>
         <version>1.0</version>
         <vendor/>
@@ -234,14 +251,14 @@
             <nameValuePair>
                 <name>mainScript</name>
                 <value>
-                    <string>Author</string>
+                    <string>uima.ruta.example.Author</string>
                 </value>
             </nameValuePair>
             <nameValuePair>
                 <name>scriptPaths</name>
                 <value>
                     <array>
-                        <string>D:/work/ws-tutorial/ExampleProject/script</string>
+                        <string>C:/work/ws/ws-uima-ruta-plain/ruta-trunk/example-projects/ExampleProject/script</string>
                     </array>
                 </value>
             </nameValuePair>
@@ -249,7 +266,7 @@
                 <name>descriptorPaths</name>
                 <value>
                     <array>
-                        <string>D:/work/ws-tutorial/ExampleProject/descriptor</string>
+                        <string>C:/work/ws/ws-uima-ruta-plain/ruta-trunk/example-projects/ExampleProject/descriptor</string>
                     </array>
                 </value>
             </nameValuePair>
@@ -257,7 +274,7 @@
                 <name>resourcePaths</name>
                 <value>
                     <array>
-                        <string>D:\work\ws-tutorial\ExampleProject\resources</string>
+                        <string>C:/work/ws/ws-uima-ruta-plain/ruta-trunk/example-projects/ExampleProject/resources</string>
                     </array>
                 </value>
             </nameValuePair>
@@ -283,27 +300,16 @@
                 <name>additionalExtensions</name>
                 <value>
                     <array>
-                        <string>org.apache.uima.ruta.example.extensions.ExampleConditionExtension</string>
-                        <string>org.apache.uima.ruta.example.extensions.ExampleActionExtension</string>
+                        <string>org.apache.uima.ruta.action.MarkReloadExtension</string>
                         <string>org.apache.uima.ruta.string.bool.BooleanOperationsExtension</string>
-                        <string>org.apache.uima.ruta.example.extensions.ExampleBooleanFunctionExtension</string>
-                        <string>org.apache.uima.ruta.example.extensions.ExampleNumberFunctionExtension</string>
                         <string>org.apache.uima.ruta.string.StringOperationsExtension</string>
-                        <string>org.apache.uima.ruta.example.extensions.ExampleStringFunctionExtension</string>
-                        <string>org.apache.uima.ruta.example.extensions.ExampleTypeFunctionExtension</string>
+                        <string>org.apache.uima.ruta.type.TypeFromStringFunctionExtension</string>
                         <string>org.apache.uima.ruta.block.OnlyFirstBlockExtension</string>
                         <string>org.apache.uima.ruta.block.OnlyOnceBlockExtension</string>
                         <string>org.apache.uima.ruta.block.fst.FSTBlockExtension</string>
-                        <string>org.apache.uima.ruta.example.extensions.ExampleBlockExtension</string>
                     </array>
                 </value>
             </nameValuePair>
-            <nameValuePair>
-                <name>additionalEngineLoaders</name>
-                <value>
-                    <array/>
-                </value>
-            </nameValuePair>
         </configurationParameterSettings>
         <typeSystemDescription>
             <imports>
diff --git a/example-projects/ExampleProject/descriptor/uima/ruta/example/AuthorTypeSystem.xml b/example-projects/ExampleProject/descriptor/uima/ruta/example/AuthorTypeSystem.xml
index 35c110b..eb5ad65 100644
--- a/example-projects/ExampleProject/descriptor/uima/ruta/example/AuthorTypeSystem.xml
+++ b/example-projects/ExampleProject/descriptor/uima/ruta/example/AuthorTypeSystem.xml
@@ -1,29 +1,46 @@
 <?xml version="1.0" encoding="UTF-8"?>
-
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one
+  or more contributor license agreements.  See the NOTICE file
+  distributed with this work for additional information
+  regarding copyright ownership.  The ASF licenses this file
+  to you under the Apache License, Version 2.0 (the
+  "License"); you may not use this file except in compliance
+  with the License.  You may obtain a copy of the License at
+  
+  http://www.apache.org/licenses/LICENSE-2.0
+  
+  Unless required by applicable law or agreed to in writing,
+  software distributed under the License is distributed on an
+  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  KIND, either express or implied.  See the License for the
+  specific language governing permissions and limitations
+  under the License.
+-->
 <typeSystemDescription xmlns="http://uima.apache.org/resourceSpecifier">
-    <name>AuthorTypeSystem</name>
+    <name>uima.ruta.example.AuthorTypeSystem</name>
     <imports>
-        <import location="..\..\..\BasicTypeSystem.xml"/>
-        <import location="..\..\..\types\BibtexTypeSystem.xml"/>
+        <import location="../../../BasicTypeSystem.xml"/>
+        <import location="../../../types/BibtexTypeSystem.xml"/>
     </imports>
     <types>
         <typeDescription>
-            <name>uima.ruta.example.Author.FirstName</name>
-            <description>Type defined in uima.ruta.example.Author</description>
-            <supertypeName>uima.tcas.Annotation</supertypeName>
-        </typeDescription>
-        <typeDescription>
             <name>uima.ruta.example.Author.FirstNameInitial</name>
             <description>Type defined in uima.ruta.example.Author</description>
             <supertypeName>uima.tcas.Annotation</supertypeName>
         </typeDescription>
         <typeDescription>
-            <name>uima.ruta.example.Author.NameListPart</name>
+            <name>uima.ruta.example.Author.Name</name>
             <description>Type defined in uima.ruta.example.Author</description>
             <supertypeName>uima.tcas.Annotation</supertypeName>
         </typeDescription>
         <typeDescription>
-            <name>uima.ruta.example.Author.Name</name>
+            <name>uima.ruta.example.Author.FirstName</name>
+            <description>Type defined in uima.ruta.example.Author</description>
+            <supertypeName>uima.tcas.Annotation</supertypeName>
+        </typeDescription>
+        <typeDescription>
+            <name>uima.ruta.example.Author.NameListPart</name>
             <description>Type defined in uima.ruta.example.Author</description>
             <supertypeName>uima.tcas.Annotation</supertypeName>
         </typeDescription>
diff --git a/example-projects/ExampleProject/descriptor/uima/ruta/example/MainEngine.xml b/example-projects/ExampleProject/descriptor/uima/ruta/example/MainEngine.xml
index b9196b4..b732547 100644
--- a/example-projects/ExampleProject/descriptor/uima/ruta/example/MainEngine.xml
+++ b/example-projects/ExampleProject/descriptor/uima/ruta/example/MainEngine.xml
@@ -1,11 +1,28 @@
 <?xml version="1.0" encoding="UTF-8"?>
-
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one
+  or more contributor license agreements.  See the NOTICE file
+  distributed with this work for additional information
+  regarding copyright ownership.  The ASF licenses this file
+  to you under the Apache License, Version 2.0 (the
+  "License"); you may not use this file except in compliance
+  with the License.  You may obtain a copy of the License at
+  
+  http://www.apache.org/licenses/LICENSE-2.0
+  
+  Unless required by applicable law or agreed to in writing,
+  software distributed under the License is distributed on an
+  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  KIND, either express or implied.  See the License for the
+  specific language governing permissions and limitations
+  under the License.
+-->
 <analysisEngineDescription xmlns="http://uima.apache.org/resourceSpecifier">
     <frameworkImplementation>org.apache.uima.java</frameworkImplementation>
     <primitive>true</primitive>
     <annotatorImplementationName>org.apache.uima.ruta.engine.RutaEngine</annotatorImplementationName>
     <analysisEngineMetaData>
-        <name>BasicEngine</name>
+        <name>uima.ruta.example.MainEngine</name>
         <description/>
         <version>1.0</version>
         <vendor/>
@@ -234,14 +251,14 @@
             <nameValuePair>
                 <name>mainScript</name>
                 <value>
-                    <string>Main</string>
+                    <string>uima.ruta.example.Main</string>
                 </value>
             </nameValuePair>
             <nameValuePair>
                 <name>scriptPaths</name>
                 <value>
                     <array>
-                        <string>D:/work/ws-tutorial/ExampleProject/script</string>
+                        <string>C:/work/ws/ws-uima-ruta-plain/ruta-trunk/example-projects/ExampleProject/script</string>
                     </array>
                 </value>
             </nameValuePair>
@@ -249,7 +266,7 @@
                 <name>descriptorPaths</name>
                 <value>
                     <array>
-                        <string>D:/work/ws-tutorial/ExampleProject/descriptor</string>
+                        <string>C:/work/ws/ws-uima-ruta-plain/ruta-trunk/example-projects/ExampleProject/descriptor</string>
                     </array>
                 </value>
             </nameValuePair>
@@ -257,7 +274,7 @@
                 <name>resourcePaths</name>
                 <value>
                     <array>
-                        <string>D:\work\ws-tutorial\ExampleProject\resources</string>
+                        <string>C:/work/ws/ws-uima-ruta-plain/ruta-trunk/example-projects/ExampleProject/resources</string>
                     </array>
                 </value>
             </nameValuePair>
@@ -265,9 +282,9 @@
                 <name>additionalScripts</name>
                 <value>
                     <array>
-                        <string>uima.ruta.example.Author</string>
-                        <string>uima.ruta.example.Year</string>
                         <string>uima.ruta.example.Title</string>
+                        <string>uima.ruta.example.Year</string>
+                        <string>uima.ruta.example.Author</string>
                     </array>
                 </value>
             </nameValuePair>
@@ -287,27 +304,16 @@
                 <name>additionalExtensions</name>
                 <value>
                     <array>
-                        <string>org.apache.uima.ruta.example.extensions.ExampleConditionExtension</string>
-                        <string>org.apache.uima.ruta.example.extensions.ExampleActionExtension</string>
+                        <string>org.apache.uima.ruta.action.MarkReloadExtension</string>
                         <string>org.apache.uima.ruta.string.bool.BooleanOperationsExtension</string>
-                        <string>org.apache.uima.ruta.example.extensions.ExampleBooleanFunctionExtension</string>
-                        <string>org.apache.uima.ruta.example.extensions.ExampleNumberFunctionExtension</string>
                         <string>org.apache.uima.ruta.string.StringOperationsExtension</string>
-                        <string>org.apache.uima.ruta.example.extensions.ExampleStringFunctionExtension</string>
-                        <string>org.apache.uima.ruta.example.extensions.ExampleTypeFunctionExtension</string>
+                        <string>org.apache.uima.ruta.type.TypeFromStringFunctionExtension</string>
                         <string>org.apache.uima.ruta.block.OnlyFirstBlockExtension</string>
                         <string>org.apache.uima.ruta.block.OnlyOnceBlockExtension</string>
                         <string>org.apache.uima.ruta.block.fst.FSTBlockExtension</string>
-                        <string>org.apache.uima.ruta.example.extensions.ExampleBlockExtension</string>
                     </array>
                 </value>
             </nameValuePair>
-            <nameValuePair>
-                <name>additionalEngineLoaders</name>
-                <value>
-                    <array/>
-                </value>
-            </nameValuePair>
         </configurationParameterSettings>
         <typeSystemDescription>
             <imports>
diff --git a/example-projects/ExampleProject/descriptor/uima/ruta/example/MainTypeSystem.xml b/example-projects/ExampleProject/descriptor/uima/ruta/example/MainTypeSystem.xml
index 59e6461..a45456c 100644
--- a/example-projects/ExampleProject/descriptor/uima/ruta/example/MainTypeSystem.xml
+++ b/example-projects/ExampleProject/descriptor/uima/ruta/example/MainTypeSystem.xml
@@ -1,12 +1,29 @@
 <?xml version="1.0" encoding="UTF-8"?>
-
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one
+  or more contributor license agreements.  See the NOTICE file
+  distributed with this work for additional information
+  regarding copyright ownership.  The ASF licenses this file
+  to you under the Apache License, Version 2.0 (the
+  "License"); you may not use this file except in compliance
+  with the License.  You may obtain a copy of the License at
+  
+  http://www.apache.org/licenses/LICENSE-2.0
+  
+  Unless required by applicable law or agreed to in writing,
+  software distributed under the License is distributed on an
+  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  KIND, either express or implied.  See the License for the
+  specific language governing permissions and limitations
+  under the License.
+-->
 <typeSystemDescription xmlns="http://uima.apache.org/resourceSpecifier">
-    <name>MainTypeSystem</name>
+    <name>uima.ruta.example.MainTypeSystem</name>
     <imports>
-        <import location="..\..\..\BasicTypeSystem.xml"/>
-        <import location="..\..\..\types\BibtexTypeSystem.xml"/>
-        <import location="AuthorTypeSystem.xml"/>
-        <import location="YearTypeSystem.xml"/>
+        <import location="../../../BasicTypeSystem.xml"/>
+        <import location="../../../types/BibtexTypeSystem.xml"/>
         <import location="TitleTypeSystem.xml"/>
+        <import location="YearTypeSystem.xml"/>
+        <import location="AuthorTypeSystem.xml"/>
     </imports>
 </typeSystemDescription>
diff --git a/example-projects/ExampleProject/descriptor/uima/ruta/example/TitleEngine.xml b/example-projects/ExampleProject/descriptor/uima/ruta/example/TitleEngine.xml
index 50e5d61..fa6305d 100644
--- a/example-projects/ExampleProject/descriptor/uima/ruta/example/TitleEngine.xml
+++ b/example-projects/ExampleProject/descriptor/uima/ruta/example/TitleEngine.xml
@@ -1,11 +1,28 @@
 <?xml version="1.0" encoding="UTF-8"?>
-
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one
+  or more contributor license agreements.  See the NOTICE file
+  distributed with this work for additional information
+  regarding copyright ownership.  The ASF licenses this file
+  to you under the Apache License, Version 2.0 (the
+  "License"); you may not use this file except in compliance
+  with the License.  You may obtain a copy of the License at
+  
+  http://www.apache.org/licenses/LICENSE-2.0
+  
+  Unless required by applicable law or agreed to in writing,
+  software distributed under the License is distributed on an
+  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  KIND, either express or implied.  See the License for the
+  specific language governing permissions and limitations
+  under the License.
+-->
 <analysisEngineDescription xmlns="http://uima.apache.org/resourceSpecifier">
     <frameworkImplementation>org.apache.uima.java</frameworkImplementation>
     <primitive>true</primitive>
     <annotatorImplementationName>org.apache.uima.ruta.engine.RutaEngine</annotatorImplementationName>
     <analysisEngineMetaData>
-        <name>BasicEngine</name>
+        <name>uima.ruta.example.TitleEngine</name>
         <description/>
         <version>1.0</version>
         <vendor/>
@@ -234,14 +251,14 @@
             <nameValuePair>
                 <name>mainScript</name>
                 <value>
-                    <string>Title</string>
+                    <string>uima.ruta.example.Title</string>
                 </value>
             </nameValuePair>
             <nameValuePair>
                 <name>scriptPaths</name>
                 <value>
                     <array>
-                        <string>D:/work/ws-tutorial/ExampleProject/script</string>
+                        <string>C:/work/ws/ws-uima-ruta-plain/ruta-trunk/example-projects/ExampleProject/script</string>
                     </array>
                 </value>
             </nameValuePair>
@@ -249,7 +266,7 @@
                 <name>descriptorPaths</name>
                 <value>
                     <array>
-                        <string>D:/work/ws-tutorial/ExampleProject/descriptor</string>
+                        <string>C:/work/ws/ws-uima-ruta-plain/ruta-trunk/example-projects/ExampleProject/descriptor</string>
                     </array>
                 </value>
             </nameValuePair>
@@ -257,7 +274,7 @@
                 <name>resourcePaths</name>
                 <value>
                     <array>
-                        <string>D:\work\ws-tutorial\ExampleProject\resources</string>
+                        <string>C:/work/ws/ws-uima-ruta-plain/ruta-trunk/example-projects/ExampleProject/resources</string>
                     </array>
                 </value>
             </nameValuePair>
@@ -283,27 +300,16 @@
                 <name>additionalExtensions</name>
                 <value>
                     <array>
-                        <string>org.apache.uima.ruta.example.extensions.ExampleConditionExtension</string>
-                        <string>org.apache.uima.ruta.example.extensions.ExampleActionExtension</string>
+                        <string>org.apache.uima.ruta.action.MarkReloadExtension</string>
                         <string>org.apache.uima.ruta.string.bool.BooleanOperationsExtension</string>
-                        <string>org.apache.uima.ruta.example.extensions.ExampleBooleanFunctionExtension</string>
-                        <string>org.apache.uima.ruta.example.extensions.ExampleNumberFunctionExtension</string>
                         <string>org.apache.uima.ruta.string.StringOperationsExtension</string>
-                        <string>org.apache.uima.ruta.example.extensions.ExampleStringFunctionExtension</string>
-                        <string>org.apache.uima.ruta.example.extensions.ExampleTypeFunctionExtension</string>
+                        <string>org.apache.uima.ruta.type.TypeFromStringFunctionExtension</string>
                         <string>org.apache.uima.ruta.block.OnlyFirstBlockExtension</string>
                         <string>org.apache.uima.ruta.block.OnlyOnceBlockExtension</string>
                         <string>org.apache.uima.ruta.block.fst.FSTBlockExtension</string>
-                        <string>org.apache.uima.ruta.example.extensions.ExampleBlockExtension</string>
                     </array>
                 </value>
             </nameValuePair>
-            <nameValuePair>
-                <name>additionalEngineLoaders</name>
-                <value>
-                    <array/>
-                </value>
-            </nameValuePair>
         </configurationParameterSettings>
         <typeSystemDescription>
             <imports>
diff --git a/example-projects/ExampleProject/descriptor/uima/ruta/example/TitleTypeSystem.xml b/example-projects/ExampleProject/descriptor/uima/ruta/example/TitleTypeSystem.xml
index 491efb3..7e562bc 100644
--- a/example-projects/ExampleProject/descriptor/uima/ruta/example/TitleTypeSystem.xml
+++ b/example-projects/ExampleProject/descriptor/uima/ruta/example/TitleTypeSystem.xml
@@ -1,10 +1,27 @@
 <?xml version="1.0" encoding="UTF-8"?>
-
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one
+  or more contributor license agreements.  See the NOTICE file
+  distributed with this work for additional information
+  regarding copyright ownership.  The ASF licenses this file
+  to you under the Apache License, Version 2.0 (the
+  "License"); you may not use this file except in compliance
+  with the License.  You may obtain a copy of the License at
+  
+  http://www.apache.org/licenses/LICENSE-2.0
+  
+  Unless required by applicable law or agreed to in writing,
+  software distributed under the License is distributed on an
+  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  KIND, either express or implied.  See the License for the
+  specific language governing permissions and limitations
+  under the License.
+-->
 <typeSystemDescription xmlns="http://uima.apache.org/resourceSpecifier">
-    <name>TitleTypeSystem</name>
+    <name>uima.ruta.example.TitleTypeSystem</name>
     <imports>
-        <import location="..\..\..\BasicTypeSystem.xml"/>
-        <import location="..\..\..\types\BibtexTypeSystem.xml"/>
+        <import location="../../../BasicTypeSystem.xml"/>
+        <import location="../../../types/BibtexTypeSystem.xml"/>
     </imports>
     <types>
         <typeDescription>
diff --git a/example-projects/ExampleProject/descriptor/uima/ruta/example/YearEngine.xml b/example-projects/ExampleProject/descriptor/uima/ruta/example/YearEngine.xml
index 57b2d10..07ee9b1 100644
--- a/example-projects/ExampleProject/descriptor/uima/ruta/example/YearEngine.xml
+++ b/example-projects/ExampleProject/descriptor/uima/ruta/example/YearEngine.xml
@@ -1,11 +1,28 @@
 <?xml version="1.0" encoding="UTF-8"?>
-
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one
+  or more contributor license agreements.  See the NOTICE file
+  distributed with this work for additional information
+  regarding copyright ownership.  The ASF licenses this file
+  to you under the Apache License, Version 2.0 (the
+  "License"); you may not use this file except in compliance
+  with the License.  You may obtain a copy of the License at
+  
+  http://www.apache.org/licenses/LICENSE-2.0
+  
+  Unless required by applicable law or agreed to in writing,
+  software distributed under the License is distributed on an
+  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  KIND, either express or implied.  See the License for the
+  specific language governing permissions and limitations
+  under the License.
+-->
 <analysisEngineDescription xmlns="http://uima.apache.org/resourceSpecifier">
     <frameworkImplementation>org.apache.uima.java</frameworkImplementation>
     <primitive>true</primitive>
     <annotatorImplementationName>org.apache.uima.ruta.engine.RutaEngine</annotatorImplementationName>
     <analysisEngineMetaData>
-        <name>BasicEngine</name>
+        <name>uima.ruta.example.YearEngine</name>
         <description/>
         <version>1.0</version>
         <vendor/>
@@ -234,14 +251,14 @@
             <nameValuePair>
                 <name>mainScript</name>
                 <value>
-                    <string>Year</string>
+                    <string>uima.ruta.example.Year</string>
                 </value>
             </nameValuePair>
             <nameValuePair>
                 <name>scriptPaths</name>
                 <value>
                     <array>
-                        <string>D:/work/ws-tutorial/ExampleProject/script</string>
+                        <string>C:/work/ws/ws-uima-ruta-plain/ruta-trunk/example-projects/ExampleProject/script</string>
                     </array>
                 </value>
             </nameValuePair>
@@ -249,7 +266,7 @@
                 <name>descriptorPaths</name>
                 <value>
                     <array>
-                        <string>D:/work/ws-tutorial/ExampleProject/descriptor</string>
+                        <string>C:/work/ws/ws-uima-ruta-plain/ruta-trunk/example-projects/ExampleProject/descriptor</string>
                     </array>
                 </value>
             </nameValuePair>
@@ -257,7 +274,7 @@
                 <name>resourcePaths</name>
                 <value>
                     <array>
-                        <string>D:\work\ws-tutorial\ExampleProject\resources</string>
+                        <string>C:/work/ws/ws-uima-ruta-plain/ruta-trunk/example-projects/ExampleProject/resources</string>
                     </array>
                 </value>
             </nameValuePair>
@@ -283,27 +300,16 @@
                 <name>additionalExtensions</name>
                 <value>
                     <array>
-                        <string>org.apache.uima.ruta.example.extensions.ExampleConditionExtension</string>
-                        <string>org.apache.uima.ruta.example.extensions.ExampleActionExtension</string>
+                        <string>org.apache.uima.ruta.action.MarkReloadExtension</string>
                         <string>org.apache.uima.ruta.string.bool.BooleanOperationsExtension</string>
-                        <string>org.apache.uima.ruta.example.extensions.ExampleBooleanFunctionExtension</string>
-                        <string>org.apache.uima.ruta.example.extensions.ExampleNumberFunctionExtension</string>
                         <string>org.apache.uima.ruta.string.StringOperationsExtension</string>
-                        <string>org.apache.uima.ruta.example.extensions.ExampleStringFunctionExtension</string>
-                        <string>org.apache.uima.ruta.example.extensions.ExampleTypeFunctionExtension</string>
+                        <string>org.apache.uima.ruta.type.TypeFromStringFunctionExtension</string>
                         <string>org.apache.uima.ruta.block.OnlyFirstBlockExtension</string>
                         <string>org.apache.uima.ruta.block.OnlyOnceBlockExtension</string>
                         <string>org.apache.uima.ruta.block.fst.FSTBlockExtension</string>
-                        <string>org.apache.uima.ruta.example.extensions.ExampleBlockExtension</string>
                     </array>
                 </value>
             </nameValuePair>
-            <nameValuePair>
-                <name>additionalEngineLoaders</name>
-                <value>
-                    <array/>
-                </value>
-            </nameValuePair>
         </configurationParameterSettings>
         <typeSystemDescription>
             <imports>
diff --git a/example-projects/ExampleProject/descriptor/uima/ruta/example/YearTypeSystem.xml b/example-projects/ExampleProject/descriptor/uima/ruta/example/YearTypeSystem.xml
index 921a031..81e830a 100644
--- a/example-projects/ExampleProject/descriptor/uima/ruta/example/YearTypeSystem.xml
+++ b/example-projects/ExampleProject/descriptor/uima/ruta/example/YearTypeSystem.xml
@@ -1,9 +1,26 @@
 <?xml version="1.0" encoding="UTF-8"?>
-
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one
+  or more contributor license agreements.  See the NOTICE file
+  distributed with this work for additional information
+  regarding copyright ownership.  The ASF licenses this file
+  to you under the Apache License, Version 2.0 (the
+  "License"); you may not use this file except in compliance
+  with the License.  You may obtain a copy of the License at
+  
+  http://www.apache.org/licenses/LICENSE-2.0
+  
+  Unless required by applicable law or agreed to in writing,
+  software distributed under the License is distributed on an
+  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  KIND, either express or implied.  See the License for the
+  specific language governing permissions and limitations
+  under the License.
+-->
 <typeSystemDescription xmlns="http://uima.apache.org/resourceSpecifier">
-    <name>YearTypeSystem</name>
+    <name>uima.ruta.example.YearTypeSystem</name>
     <imports>
-        <import location="..\..\..\BasicTypeSystem.xml"/>
-        <import location="..\..\..\types\BibtexTypeSystem.xml"/>
+        <import location="../../../BasicTypeSystem.xml"/>
+        <import location="../../../types/BibtexTypeSystem.xml"/>
     </imports>
 </typeSystemDescription>
diff --git a/example-projects/ExampleProject/script/uima/ruta/example/Year.ruta b/example-projects/ExampleProject/script/uima/ruta/example/Year.ruta
index 2fa94f1..8d0710c 100644
--- a/example-projects/ExampleProject/script/uima/ruta/example/Year.ruta
+++ b/example-projects/ExampleProject/script/uima/ruta/example/Year.ruta
@@ -24,6 +24,6 @@
 NUM{REGEXP("19..|20..") -> MARK(Year,1,2)} PM?;
 
 // add parentheses if there are some (by removing the old Year annotation and creating a new one)
-SPECIAL{REGEXP("[(]")} Year{ -> SHIFT(Year,1,2,3,4)} SPECIAL{REGEXP("[)]")} PM?;
+SPECIAL{REGEXP("[(]")} Year{ -> SHIFT(Year,1,4)} SPECIAL{REGEXP("[)]")} PM?;
 
 
diff --git a/ruta-core/src/main/antlr3/org/apache/uima/ruta/parser/RutaParser.g b/ruta-core/src/main/antlr3/org/apache/uima/ruta/parser/RutaParser.g
index be9805b..9f6f4a9 100644
--- a/ruta-core/src/main/antlr3/org/apache/uima/ruta/parser/RutaParser.g
+++ b/ruta-core/src/main/antlr3/org/apache/uima/ruta/parser/RutaParser.g
@@ -68,6 +68,7 @@
 import org.apache.uima.ruta.RutaModule;
 import org.apache.uima.ruta.RutaScriptFactory;
 import org.apache.uima.ruta.RutaStatement;
+import org.apache.uima.ruta.block.ForEachBlock;
 import org.apache.uima.ruta.block.RutaBlock;
 import org.apache.uima.ruta.block.RutaScriptBlock;
 import org.apache.uima.ruta.expression.AnnotationTypeExpression;
@@ -519,7 +520,7 @@
 	| stmtAM = macroActionDeclaration {stmt = stmtAM;}
 	| stmtRule = simpleStatement {stmt = stmtRule;}
 	| stmtBlock = blockDeclaration {stmt = stmtBlock;}
-	| stmtBlock = forEachDeclaration {stmt = stmtBlock;}
+	//| stmtBlock = forEachDeclaration {stmt = stmtBlock;}
 	| stmtExternal = externalBlock {stmt = stmtExternal;}
 	)
 	;
@@ -727,6 +728,7 @@
 	RutaBlock env;
 }
 @init{
+Map<String,String> def = new LinkedHashMap<>();
 RutaRuleElement re = null;
 RuleElementIsolator container = null;
 level++;
@@ -736,11 +738,23 @@
 }
 
 	:
-	type = BlockString 
+	((
+	type = (BlockString) 
 	LPAREN
 	id = Identifier 
 	RPAREN
 	{block = factory.createScriptBlock(id, re, body, $blockDeclaration[level - 1]::env);}
+	)
+	|
+	(
+	type = ForEachString 
+	LPAREN
+	id = Identifier (COMMA direction = booleanExpression)?
+	RPAREN
+	{block = factory.createForEachBlock(id, direction, re, body, $blockDeclaration[level - 1]::env);}
+	))
+	
+	
 	{$blockDeclaration::env = block;
 	container = new RuleElementIsolator();}
 	re1 = ruleElementWithCA[container]
@@ -748,13 +762,17 @@
 	{RutaRule rule = factory.createRule(re, block);
 	block.setRule(rule);
 	container.setContainer(rule);
-	}
+	}	
+	{if(block instanceof ForEachBlock) def.put(id.getText(),RutaConstants.RUTA_VARIABLE_ANNOTATION);}
+	{if(block instanceof ForEachBlock) addTemporaryVariables(def);}
 	LCURLY body = statements RCURLY
+	{if(block instanceof ForEachBlock) removeTemporaryVariables(def);}
+	
 	{block.setElements(body);
 	$blockDeclaration::env.getScript().addBlock(id.getText(),block);
 	}	
 	;
-
+/*
 forEachDeclaration returns [RutaBlock block = null]
 options {
 	backtrack = true;
@@ -780,6 +798,8 @@
 	RPAREN
 	{block = factory.createForEachBlock(id, direction, re, body, $blockDeclaration[level - 1]::env);}
 	{$blockDeclaration::env = block;
+	//$blockDeclaration::env = block;
+	
 	container = new RuleElementIsolator();}
 	re1 = ruleElementWithCA[container]
 	 {re = re1;	 }
@@ -795,6 +815,7 @@
 	{$blockDeclaration::env = block.getParent();}
 	}	
 	;
+	*/
 
 externalBlock returns [RutaBlock block = null]
 options {
@@ -2440,7 +2461,7 @@
 	}
 	;
 
-nullExpression returns [IRutaExpression expr = null]
+nullExpression returns [IStringExpression expr = null]
 	:
 	NULL {expr = expressionFactory.createNullExpression();}
 	;
@@ -2790,7 +2811,10 @@
 	:
 	e1 = stringExpression
 	op = (EQUAL | NOTEQUAL)
+	(
 	e2 = stringExpression
+	| e2 = nullExpression
+	)
 	{expr = expressionFactory.createBooleanStringExpression(e1,op,e2);}
 	;
 
diff --git a/ruta-core/src/main/java/org/apache/uima/ruta/RutaStream.java b/ruta-core/src/main/java/org/apache/uima/ruta/RutaStream.java
index 73bdd43..6be4bfc 100644
--- a/ruta-core/src/main/java/org/apache/uima/ruta/RutaStream.java
+++ b/ruta-core/src/main/java/org/apache/uima/ruta/RutaStream.java
@@ -288,18 +288,19 @@
     }
   }
 
-  private Collection<Type> removeSubsumedTypes(Collection<String> typeNames, TypeSystem typeSystem) {
+  private Collection<Type> removeSubsumedTypes(Collection<String> typeNames,
+          TypeSystem typeSystem) {
     Collection<Type> allTypes = new HashSet<>();
     for (String each : typeNames) {
       Type type = typeSystem.getType(each);
-      if(type != null) {
+      if (type != null) {
         allTypes.add(type);
       }
     }
     List<Type> rootTypes = new ArrayList<>(allTypes);
     for (Type type1 : allTypes) {
       for (Type type2 : allTypes) {
-        if(type1!= type2 && typeSystem.subsumes(type1, type2)) {
+        if (type1 != type2 && typeSystem.subsumes(type1, type2)) {
           rootTypes.remove(type2);
         }
       }
@@ -409,8 +410,8 @@
       toSplit.setEnd(anchor);
       RutaBasic newRB = new RutaBasic(getJCas(), anchor, newEnd);
       newRB.setLowMemoryProfile(lowMemoryProfile);
-      newRB.setEndMap(toSplit.getEndMap());
-      newRB.setPartOf(toSplit.getPartOf());
+      newRB.setEndMap(toSplit.getEndMap().clone());
+      newRB.setPartOf(toSplit.getPartOf().clone());
       toSplit.clearEndMap();
       cas.addFsToIndexes(toSplit);
       cas.addFsToIndexes(newRB);
@@ -1231,6 +1232,9 @@
     if (clazz.equals(Double.class) && expression instanceof INumberExpression) {
       double v = ((INumberExpression) expression).getDoubleValue(context, this);
       environment.setVariableValue(var, v);
+    } else if (clazz.equals(Float.class) && expression instanceof INumberExpression) {
+      float v = (float) ((INumberExpression) expression).getDoubleValue(context, this);
+      environment.setVariableValue(var, v);
     } else if (clazz.equals(Integer.class) && expression instanceof INumberExpression) {
       int v = ((INumberExpression) expression).getIntegerValue(context, this);
       environment.setVariableValue(var, v);
diff --git a/ruta-core/src/main/java/org/apache/uima/ruta/engine/Ruta.java b/ruta-core/src/main/java/org/apache/uima/ruta/engine/Ruta.java
index d0bd8ee..5e83a32 100644
--- a/ruta-core/src/main/java/org/apache/uima/ruta/engine/Ruta.java
+++ b/ruta-core/src/main/java/org/apache/uima/ruta/engine/Ruta.java
@@ -96,7 +96,7 @@
 
     File scriptFile = File.createTempFile("Ruta", RutaEngine.SCRIPT_FILE_EXTENSION);
     scriptFile.deleteOnExit();
-    FileUtils.saveString2File(script, scriptFile);
+    FileUtils.saveString2File(script, scriptFile, "UTF-8");
     ae.setConfigParameterValue(RutaEngine.PARAM_SCRIPT_PATHS, new String[] { scriptFile
             .getParentFile().getAbsolutePath() });
     String name = scriptFile.getName().substring(0, scriptFile.getName().length() - 5);
diff --git a/ruta-core/src/main/java/org/apache/uima/ruta/engine/RutaEngine.java b/ruta-core/src/main/java/org/apache/uima/ruta/engine/RutaEngine.java
index 848a22c..a6c01ab 100644
--- a/ruta-core/src/main/java/org/apache/uima/ruta/engine/RutaEngine.java
+++ b/ruta-core/src/main/java/org/apache/uima/ruta/engine/RutaEngine.java
@@ -28,6 +28,7 @@
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
@@ -625,20 +626,29 @@
   }
 
   private void resetEnvironments(CAS cas) {
-    resetEnvironment(script, cas);
-    Collection<RutaModule> scripts = script.getScripts().values();
-    for (RutaModule module : scripts) {
-      resetEnvironment(module, cas);
-    }
+    resetEnvironment(script, cas, new HashSet<RutaModule>());
   }
 
-  private void resetEnvironment(RutaModule module, CAS cas) {
+  private void resetEnvironment(RutaModule module, CAS cas, Collection<RutaModule> alreadyResetted) {
+    if(alreadyResetted.contains(module)) {
+      // avoid loop in recursion
+      return;
+    }
+    alreadyResetted.add(module);
+    
+    // reset all blocks
     RutaBlock block = module.getBlock(null);
     block.getEnvironment().reset(cas);
     Collection<RutaBlock> blocks = module.getBlocks().values();
     for (RutaBlock each : blocks) {
       each.getEnvironment().reset(cas);
     }
+    
+    // reset imported scripts
+    Collection<RutaModule> scripts = module.getScripts().values();
+    for (RutaModule eachModule : scripts) {
+      resetEnvironment(eachModule, cas, alreadyResetted);
+    }
   }
 
   private void initializeTypes(RutaModule script, CAS cas, List<String> initialized) {
diff --git a/ruta-core/src/main/java/org/apache/uima/ruta/engine/RutaTestUtils.java b/ruta-core/src/main/java/org/apache/uima/ruta/engine/RutaTestUtils.java
index 3284bdf..33908d3 100644
--- a/ruta-core/src/main/java/org/apache/uima/ruta/engine/RutaTestUtils.java
+++ b/ruta-core/src/main/java/org/apache/uima/ruta/engine/RutaTestUtils.java
@@ -20,7 +20,9 @@
 package org.apache.uima.ruta.engine;
 
 import java.io.File;
+import java.io.FileOutputStream;
 import java.io.IOException;
+import java.io.OutputStream;
 import java.net.URISyntaxException;
 import java.net.URL;
 import java.util.ArrayList;
@@ -32,11 +34,13 @@
 import java.util.Map.Entry;
 import java.util.Set;
 
+import org.apache.commons.io.IOUtils;
 import org.apache.uima.UIMAFramework;
 import org.apache.uima.analysis_engine.AnalysisEngine;
 import org.apache.uima.analysis_engine.AnalysisEngineDescription;
 import org.apache.uima.analysis_engine.AnalysisEngineProcessException;
 import org.apache.uima.cas.CAS;
+import org.apache.uima.cas.SerialFormat;
 import org.apache.uima.cas.Type;
 import org.apache.uima.cas.text.AnnotationFS;
 import org.apache.uima.cas.text.AnnotationIndex;
@@ -47,6 +51,7 @@
 import org.apache.uima.resource.metadata.TypeDescription;
 import org.apache.uima.resource.metadata.TypeSystemDescription;
 import org.apache.uima.util.CasCreationUtils;
+import org.apache.uima.util.CasIOUtils;
 import org.apache.uima.util.FileUtils;
 import org.apache.uima.util.InvalidXMLException;
 import org.apache.uima.util.XMLInputSource;
@@ -315,4 +320,19 @@
     }
     return cas;
   }
+  
+  
+  public static void storeCas(CAS cas, String name) {
+    File file = new File("input/" + name + ".xmi");
+    file.getParentFile().mkdirs();
+    OutputStream fos = null;
+    try {
+      fos = new FileOutputStream(file);
+      CasIOUtils.save(cas, fos , SerialFormat.XMI);
+    } catch (IOException e) {
+      throw new IllegalArgumentException(e);
+    } finally {
+      IOUtils.closeQuietly(fos);
+    }
+  }
 }
diff --git a/ruta-core/src/main/java/org/apache/uima/ruta/expression/AnnotationTypeExpression.java b/ruta-core/src/main/java/org/apache/uima/ruta/expression/AnnotationTypeExpression.java
index ba460c2..bd42905 100644
--- a/ruta-core/src/main/java/org/apache/uima/ruta/expression/AnnotationTypeExpression.java
+++ b/ruta-core/src/main/java/org/apache/uima/ruta/expression/AnnotationTypeExpression.java
@@ -109,7 +109,7 @@
         if (featureExpression instanceof FeatureMatchExpression) {
           // allow more matches for feature matches
           bestGuessedAnnotations = stream.getAnnotationsByTypeInContext(type, context);
-        } else if(featureExpression != null) {
+        } else if (featureExpression != null) {
           bestGuessedAnnotations = stream.getBestGuessedAnnotationsAt(context.getAnnotation(),
                   type);
         } else {
@@ -207,14 +207,14 @@
         if (featureExpression instanceof FeatureMatchExpression) {
           // allow more matches for feature matches
           bestGuessedAnnotations = stream.getAnnotationsByTypeInContext(type, context);
-        } else if(featureExpression != null) {
+        } else if (featureExpression != null) {
           bestGuessedAnnotations = stream.getBestGuessedAnnotationsAt(context.getAnnotation(),
                   type);
           if (bestGuessedAnnotations.isEmpty()) {
-            bestGuessedAnnotations =stream.getAnnotationsByTypeInContext(type, context);
+            bestGuessedAnnotations = stream.getAnnotationsByTypeInContext(type, context);
           }
         } else {
-            bestGuessedAnnotations =stream.getAnnotationsByTypeInContext(type, context);
+          bestGuessedAnnotations = stream.getAnnotationsByTypeInContext(type, context);
         }
 
         if (featureExpression != null) {
diff --git a/ruta-core/src/main/java/org/apache/uima/ruta/expression/ConditionedAnnotationTypeExpression.java b/ruta-core/src/main/java/org/apache/uima/ruta/expression/ConditionedAnnotationTypeExpression.java
index 4f89cb6..e2617fc 100644
--- a/ruta-core/src/main/java/org/apache/uima/ruta/expression/ConditionedAnnotationTypeExpression.java
+++ b/ruta-core/src/main/java/org/apache/uima/ruta/expression/ConditionedAnnotationTypeExpression.java
@@ -41,11 +41,11 @@
 
   @Override
   public AnnotationFS getAnnotation(MatchContext context, RutaStream stream) {
-   List<AnnotationFS> annotationList = getAnnotationList(context, stream);
-   if(!annotationList.isEmpty()) {
-     return annotationList.get(0);
-   }
-   return null;
+    List<AnnotationFS> annotationList = getAnnotationList(context, stream);
+    if (!annotationList.isEmpty()) {
+      return annotationList.get(0);
+    }
+    return null;
   }
 
   @Override
@@ -53,7 +53,7 @@
     List<AnnotationFS> annotationList = super.getAnnotationList(context, stream);
     List<AnnotationFS> result = new ArrayList<>();
     for (AnnotationFS annotation : annotationList) {
-      if(evalulate(context, stream, annotation)) {
+      if (evalulate(context, stream, annotation)) {
         result.add(annotation);
       }
     }
@@ -61,9 +61,10 @@
   }
 
   private boolean evalulate(MatchContext context, RutaStream stream, AnnotationFS annotation) {
-    MatchContext localContext = new MatchContext(annotation, context.getElement(), context.getRuleMatch(), context.getDirection());
+    MatchContext localContext = new MatchContext(annotation, context.getElement(),
+            context.getRuleMatch(), context.getDirection());
     EvaluatedCondition eval = condition.eval(localContext, stream, InferenceCrowd.emptyCrowd);
     return eval.isValue();
   }
-  
+
 }
diff --git a/ruta-core/src/main/java/org/apache/uima/ruta/expression/ExpressionFactory.java b/ruta-core/src/main/java/org/apache/uima/ruta/expression/ExpressionFactory.java
index 87f328c..c5dbec2 100644
--- a/ruta-core/src/main/java/org/apache/uima/ruta/expression/ExpressionFactory.java
+++ b/ruta-core/src/main/java/org/apache/uima/ruta/expression/ExpressionFactory.java
@@ -304,7 +304,12 @@
   public MatchReference createMatchReference(Token refToken) {
     return createMatchReference(refToken, null, null);
   }
-
+  
+  public MatchReference createMatchReference(String reference) {
+    return createMatchReference(reference, null, null);
+  }
+  
+  
   public MatchReference createMatchReference(Token matchToken, Token comparatorToken,
           IRutaExpression argument) {
     String match = matchToken.getText();
@@ -312,10 +317,15 @@
     if (comparatorToken != null) {
       comparator = comparatorToken.getText();
     }
+    return createMatchReference(match, comparator, argument);
+  }
+  
+  public MatchReference createMatchReference(String matchString, String comparatorString,
+          IRutaExpression argument) {
     if (typeUsage != null) {
-      addPossibleTypeMentions(match);
+      addPossibleTypeMentions(matchString);
     }
-    return new MatchReference(match, comparator, argument);
+    return new MatchReference(matchString, comparatorString, argument);
   }
 
   public MatchReference createMatchReference(ITypeExpression expression) {
@@ -356,7 +366,7 @@
     return new ExternalWordTableExpression(name.getText(), args);
   }
 
-  public IRutaExpression createNullExpression() {
+  public IStringExpression createNullExpression() {
     return new NullExpression();
   }
 
diff --git a/ruta-core/src/main/java/org/apache/uima/ruta/expression/MatchReference.java b/ruta-core/src/main/java/org/apache/uima/ruta/expression/MatchReference.java
index 72cc660..676ce65 100644
--- a/ruta-core/src/main/java/org/apache/uima/ruta/expression/MatchReference.java
+++ b/ruta-core/src/main/java/org/apache/uima/ruta/expression/MatchReference.java
@@ -213,4 +213,12 @@
     return features;
   }
 
+  public IRutaExpression getArgument() {
+    return argument;
+  }
+
+  public String getComparator() {
+    return comparator;
+  }
+
 }
diff --git a/ruta-core/src/main/java/org/apache/uima/ruta/expression/NullExpression.java b/ruta-core/src/main/java/org/apache/uima/ruta/expression/NullExpression.java
index 6a6ffef..9d7699a 100644
--- a/ruta-core/src/main/java/org/apache/uima/ruta/expression/NullExpression.java
+++ b/ruta-core/src/main/java/org/apache/uima/ruta/expression/NullExpression.java
@@ -33,7 +33,8 @@
 import org.apache.uima.ruta.expression.type.ITypeExpression;
 import org.apache.uima.ruta.rule.MatchContext;
 
-public class NullExpression extends FeatureExpression implements IStringExpression, ITypeExpression, IAnnotationExpression {
+public class NullExpression extends FeatureExpression
+        implements IStringExpression, ITypeExpression, IAnnotationExpression {
 
   @Override
   public String getStringValue(MatchContext context, RutaStream stream) {
@@ -41,17 +42,19 @@
   }
 
   @Override
-  public Collection<AnnotationFS> getAnnotations(Collection<? extends FeatureStructure> featureStructures, boolean checkOnFeatureValue,
+  public Collection<AnnotationFS> getAnnotations(
+          Collection<? extends FeatureStructure> featureStructures, boolean checkOnFeatureValue,
           MatchContext context, RutaStream stream) {
     return null;
   }
-  
+
   @Override
-  public Collection<? extends FeatureStructure> getFeatureStructures(Collection<? extends FeatureStructure> featureStructures, boolean checkOnFeatureValue,
+  public Collection<? extends FeatureStructure> getFeatureStructures(
+          Collection<? extends FeatureStructure> featureStructures, boolean checkOnFeatureValue,
           MatchContext context, RutaStream stream) {
     return null;
   }
-  
+
   @Override
   public Type getType(MatchContext context, RutaStream stream) {
     return null;
@@ -87,5 +90,4 @@
     return null;
   }
 
- 
 }
diff --git a/ruta-core/src/main/java/org/apache/uima/ruta/expression/RutaExpression.java b/ruta-core/src/main/java/org/apache/uima/ruta/expression/RutaExpression.java
index f2f4aab..0dba911 100644
--- a/ruta-core/src/main/java/org/apache/uima/ruta/expression/RutaExpression.java
+++ b/ruta-core/src/main/java/org/apache/uima/ruta/expression/RutaExpression.java
@@ -75,9 +75,9 @@
         return result;
       }
     }
-    
+
     return stream.getBestGuessedAnnotationsAt(matchedAnnotation, type);
-    
+
   }
 
 }
diff --git a/ruta-core/src/main/java/org/apache/uima/ruta/expression/bool/BooleanFeatureExpression.java b/ruta-core/src/main/java/org/apache/uima/ruta/expression/bool/BooleanFeatureExpression.java
index bbf02e6..b238451 100644
--- a/ruta-core/src/main/java/org/apache/uima/ruta/expression/bool/BooleanFeatureExpression.java
+++ b/ruta-core/src/main/java/org/apache/uima/ruta/expression/bool/BooleanFeatureExpression.java
@@ -6,9 +6,9 @@
  * to you under the Apache License, Version 2.0 (the
  * "License"); you may not use this file except in compliance
  * with the License.  You may obtain a copy of the License at
- * 
+ *
  * http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing,
  * software distributed under the License is distributed on an
  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
@@ -40,13 +40,18 @@
 
   @Override
   public boolean getBooleanValue(MatchContext context, RutaStream stream) {
+
     AnnotationFS annotation = context.getAnnotation();
-    Feature feature = fe.getFeature(context, stream);
-    List<AnnotationFS> list = getTargetAnnotation(annotation, fe, context, stream);
-    Collection<? extends FeatureStructure> featureStructures = fe.getFeatureStructures(list, false, context,
-            stream);
+    Feature feature = this.fe.getFeature(context, stream);
+    List<AnnotationFS> list = this.getTargetAnnotation(annotation, this.fe, context, stream);
+    Collection<? extends FeatureStructure> featureStructures = this.fe.getFeatureStructures(list,
+            false, context, stream);
     if (!featureStructures.isEmpty()) {
       FeatureStructure next = featureStructures.iterator().next();
+      if (next instanceof AnnotationFS && next != annotation) {
+        feature = this.fe.getFeature(new MatchContext((AnnotationFS) next, context.getElement(),
+                context.getRuleMatch(), context.getDirection()), stream);
+      }
       return next.getBooleanValue(feature);
     }
     return false;
@@ -54,14 +59,17 @@
 
   @Override
   public String getStringValue(MatchContext context, RutaStream stream) {
-    return String.valueOf(getBooleanValue(context, stream));
+
+    return String.valueOf(this.getBooleanValue(context, stream));
   }
 
   public FeatureExpression getFe() {
-    return fe;
+
+    return this.fe;
   }
 
   public void setFe(FeatureExpression fe) {
+
     this.fe = fe;
   }
 
diff --git a/ruta-core/src/main/java/org/apache/uima/ruta/expression/bool/BooleanListFeatureExpression.java b/ruta-core/src/main/java/org/apache/uima/ruta/expression/bool/BooleanListFeatureExpression.java
index e059b2f..bc60d10 100644
--- a/ruta-core/src/main/java/org/apache/uima/ruta/expression/bool/BooleanListFeatureExpression.java
+++ b/ruta-core/src/main/java/org/apache/uima/ruta/expression/bool/BooleanListFeatureExpression.java
@@ -6,9 +6,9 @@
  * to you under the Apache License, Version 2.0 (the
  * "License"); you may not use this file except in compliance
  * with the License.  You may obtain a copy of the License at
- * 
+ *
  * http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing,
  * software distributed under the License is distributed on an
  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
@@ -46,23 +46,29 @@
     super();
     this.fe = fe;
   }
-  
+
   @Override
   public List<Boolean> getList(MatchContext context, RutaStream stream) {
+
     AnnotationFS annotation = context.getAnnotation();
-    Feature feature = fe.getFeature(context, stream);
-    if(feature == null || !feature.getRange().isArray() || !StringUtils.equals(feature.getRange().getName(), CAS.TYPE_NAME_BOOLEAN_ARRAY)) {
+    Feature feature = this.fe.getFeature(context, stream);
+    if (feature == null || !feature.getRange().isArray()
+            || !StringUtils.equals(feature.getRange().getName(), CAS.TYPE_NAME_BOOLEAN_ARRAY)) {
       // throw runtime exception?
       return Collections.emptyList();
     }
-    List<AnnotationFS> list = getTargetAnnotation(annotation, fe, context, stream);
-    Collection<? extends FeatureStructure> featureStructures = fe.getFeatureStructures(list, false, context,
-            stream);
+    List<AnnotationFS> list = this.getTargetAnnotation(annotation, this.fe, context, stream);
+    Collection<? extends FeatureStructure> featureStructures = this.fe.getFeatureStructures(list,
+            false, context, stream);
     List<Boolean> result = new ArrayList<>();
 
     for (FeatureStructure each : featureStructures) {
+      if (each instanceof AnnotationFS && !each.getType().equals(annotation.getType())) {
+        feature = this.fe.getFeature(new MatchContext((AnnotationFS) each, context.getElement(),
+                context.getRuleMatch(), context.getDirection()), stream);
+      }
       FeatureStructure featureValue = each.getFeatureValue(feature);
-      if(featureValue instanceof BooleanArrayFS) {
+      if (featureValue instanceof BooleanArrayFS) {
         BooleanArrayFS array = (BooleanArrayFS) featureValue;
         for (int i = 0; i < array.size(); i++) {
           Boolean b = array.get(i);
@@ -70,21 +76,18 @@
         }
       }
     }
-    
+
     return result;
   }
 
   public FeatureExpression getFeatureExpression() {
-    return fe;
+
+    return this.fe;
   }
 
   public void setFeatureExpression(FeatureExpression fe) {
+
     this.fe = fe;
   }
 
-
-
-  
-  
-
 }
diff --git a/ruta-core/src/main/java/org/apache/uima/ruta/expression/number/NumberFeatureExpression.java b/ruta-core/src/main/java/org/apache/uima/ruta/expression/number/NumberFeatureExpression.java
index 3e370bf..ff28da1 100644
--- a/ruta-core/src/main/java/org/apache/uima/ruta/expression/number/NumberFeatureExpression.java
+++ b/ruta-core/src/main/java/org/apache/uima/ruta/expression/number/NumberFeatureExpression.java
@@ -6,9 +6,9 @@
  * to you under the Apache License, Version 2.0 (the
  * "License"); you may not use this file except in compliance
  * with the License.  You may obtain a copy of the License at
- * 
+ *
  * http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing,
  * software distributed under the License is distributed on an
  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
@@ -42,32 +42,40 @@
 
   @Override
   public int getIntegerValue(MatchContext context, RutaStream stream) {
-    Number v = getNumberValue(context, stream);
+
+    Number v = this.getNumberValue(context, stream);
     return v == null ? 0 : v.intValue();
   }
 
   @Override
   public double getDoubleValue(MatchContext context, RutaStream stream) {
-    Number v = getNumberValue(context, stream);
+
+    Number v = this.getNumberValue(context, stream);
     return v == null ? 0 : v.doubleValue();
   }
 
   @Override
   public float getFloatValue(MatchContext context, RutaStream stream) {
-    Number v = getNumberValue(context, stream);
+
+    Number v = this.getNumberValue(context, stream);
     return v == null ? 0 : v.floatValue();
   }
 
   private Number getNumberValue(MatchContext context, RutaStream stream) {
+
     AnnotationFS annotation = context.getAnnotation();
     Number result = null;
-    List<AnnotationFS> list = getTargetAnnotation(annotation, fe, context, stream);
-    Collection<? extends FeatureStructure> featureStructures = fe.getFeatureStructures(list, false, context,
-            stream);
+    List<AnnotationFS> list = this.getTargetAnnotation(annotation, this.fe, context, stream);
+    Collection<? extends FeatureStructure> featureStructures = this.fe.getFeatureStructures(list,
+            false, context, stream);
     if (!featureStructures.isEmpty()) {
-      Feature feature = fe.getFeature(context, stream);
+      Feature feature = this.fe.getFeature(context, stream);
       Type range = feature.getRange();
       FeatureStructure next = featureStructures.iterator().next();
+      if (next instanceof AnnotationFS && !next.getType().equals(annotation.getType())) {
+        feature = this.fe.getFeature(new MatchContext((AnnotationFS) next, context.getElement(),
+                context.getRuleMatch(), context.getDirection()), stream);
+      }
       if (CAS.TYPE_NAME_BYTE.equals(range.getName())) {
         result = next.getByteValue(feature);
       } else if (CAS.TYPE_NAME_DOUBLE.equals(range.getName())) {
@@ -87,14 +95,17 @@
 
   @Override
   public String getStringValue(MatchContext context, RutaStream stream) {
-    return "" + getNumberValue(context, stream);
+
+    return "" + this.getNumberValue(context, stream);
   }
 
   public FeatureExpression getFe() {
-    return fe;
+
+    return this.fe;
   }
 
   public void setFe(FeatureExpression fe) {
+
     this.fe = fe;
   }
 
diff --git a/ruta-core/src/main/java/org/apache/uima/ruta/expression/number/NumberListFeatureExpression.java b/ruta-core/src/main/java/org/apache/uima/ruta/expression/number/NumberListFeatureExpression.java
index 804859b..aaa44a7 100644
--- a/ruta-core/src/main/java/org/apache/uima/ruta/expression/number/NumberListFeatureExpression.java
+++ b/ruta-core/src/main/java/org/apache/uima/ruta/expression/number/NumberListFeatureExpression.java
@@ -6,9 +6,9 @@
  * to you under the Apache License, Version 2.0 (the
  * "License"); you may not use this file except in compliance
  * with the License.  You may obtain a copy of the License at
- * 
+ *
  * http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing,
  * software distributed under the License is distributed on an
  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
@@ -51,18 +51,23 @@
 
   @Override
   public List<Number> getList(MatchContext context, RutaStream stream) {
+
     AnnotationFS annotation = context.getAnnotation();
-    Feature feature = fe.getFeature(context, stream);
-    if (feature == null || !feature.getRange().isArray() || !validType(feature)) {
+    Feature feature = this.fe.getFeature(context, stream);
+    if (feature == null || !feature.getRange().isArray() || !this.validType(feature)) {
       // throw runtime exception?
       return Collections.emptyList();
     }
-    List<AnnotationFS> list = getTargetAnnotation(annotation, fe, context, stream);
-    Collection<? extends FeatureStructure> featureStructures = fe.getFeatureStructures(list, false, context,
-            stream);
+    List<AnnotationFS> list = this.getTargetAnnotation(annotation, this.fe, context, stream);
+    Collection<? extends FeatureStructure> featureStructures = this.fe.getFeatureStructures(list,
+            false, context, stream);
     List<Number> result = new ArrayList<>();
 
     for (FeatureStructure each : featureStructures) {
+      if (each instanceof AnnotationFS && !each.getType().equals(annotation.getType())) {
+        feature = this.fe.getFeature(new MatchContext((AnnotationFS) each, context.getElement(),
+                context.getRuleMatch(), context.getDirection()), stream);
+      }
       FeatureStructure featureValue = each.getFeatureValue(feature);
       if (featureValue instanceof IntArrayFS) {
         IntArrayFS array = (IntArrayFS) featureValue;
@@ -89,6 +94,7 @@
   }
 
   private boolean validType(Feature feature) {
+
     String name = feature.getRange().getName();
     return StringUtils.equals(name, CAS.TYPE_NAME_INTEGER_ARRAY)
             || StringUtils.equals(name, CAS.TYPE_NAME_DOUBLE_ARRAY)
@@ -96,10 +102,12 @@
   }
 
   public FeatureExpression getFeatureExpression() {
-    return fe;
+
+    return this.fe;
   }
 
   public void setFeatureExpression(FeatureExpression fe) {
+
     this.fe = fe;
   }
 
diff --git a/ruta-core/src/main/java/org/apache/uima/ruta/expression/string/StringFeatureExpression.java b/ruta-core/src/main/java/org/apache/uima/ruta/expression/string/StringFeatureExpression.java
index 682072b..0eb6c31 100644
--- a/ruta-core/src/main/java/org/apache/uima/ruta/expression/string/StringFeatureExpression.java
+++ b/ruta-core/src/main/java/org/apache/uima/ruta/expression/string/StringFeatureExpression.java
@@ -6,9 +6,9 @@
  * to you under the Apache License, Version 2.0 (the
  * "License"); you may not use this file except in compliance
  * with the License.  You may obtain a copy of the License at
- * 
+ *
  * http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing,
  * software distributed under the License is distributed on an
  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
@@ -41,12 +41,18 @@
 
   @Override
   public String getStringValue(MatchContext context, RutaStream stream) {
+
     AnnotationFS annotation = context.getAnnotation();
-    Feature feature = fe.getFeature(context, stream);
-    List<AnnotationFS> list = getTargetAnnotation(annotation, fe, context, stream);
-    Collection<? extends FeatureStructure> featureStructures = fe.getFeatureStructures(list, false, context, stream);
+    Feature feature = this.fe.getFeature(context, stream);
+    List<AnnotationFS> list = this.getTargetAnnotation(annotation, this.fe, context, stream);
+    Collection<? extends FeatureStructure> featureStructures = this.fe.getFeatureStructures(list,
+            false, context, stream);
     if (!featureStructures.isEmpty()) {
       FeatureStructure next = featureStructures.iterator().next();
+      if (next instanceof AnnotationFS && !next.getType().equals(annotation.getType())) {
+        feature = this.fe.getFeature(new MatchContext((AnnotationFS) next, context.getElement(),
+                context.getRuleMatch(), context.getDirection()), stream);
+      }
       if (next instanceof AnnotationFS && feature instanceof CoveredTextFeature) {
         return ((AnnotationFS) next).getCoveredText();
       } else {
@@ -57,10 +63,12 @@
   }
 
   public FeatureExpression getFe() {
-    return fe;
+
+    return this.fe;
   }
 
   public void setFe(FeatureExpression fe) {
+
     this.fe = fe;
   }
 
diff --git a/ruta-core/src/main/java/org/apache/uima/ruta/expression/string/StringListFeatureExpression.java b/ruta-core/src/main/java/org/apache/uima/ruta/expression/string/StringListFeatureExpression.java
index 3d860ea..714e2c3 100644
--- a/ruta-core/src/main/java/org/apache/uima/ruta/expression/string/StringListFeatureExpression.java
+++ b/ruta-core/src/main/java/org/apache/uima/ruta/expression/string/StringListFeatureExpression.java
@@ -6,9 +6,9 @@
  * to you under the Apache License, Version 2.0 (the
  * "License"); you may not use this file except in compliance
  * with the License.  You may obtain a copy of the License at
- * 
+ *
  * http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing,
  * software distributed under the License is distributed on an
  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
@@ -46,45 +46,48 @@
     super();
     this.fe = fe;
   }
-  
+
   @Override
   public List<String> getList(MatchContext context, RutaStream stream) {
+
     AnnotationFS annotation = context.getAnnotation();
-    Feature feature = fe.getFeature(context, stream);
-    if(feature == null || !feature.getRange().isArray() || !StringUtils.equals(feature.getRange().getName(), CAS.TYPE_NAME_STRING_ARRAY)) {
+    Feature feature = this.fe.getFeature(context, stream);
+    if (feature == null || !feature.getRange().isArray()
+            || !StringUtils.equals(feature.getRange().getName(), CAS.TYPE_NAME_STRING_ARRAY)) {
       // throw runtime exception?
       return Collections.emptyList();
     }
-    List<AnnotationFS> list = getTargetAnnotation(annotation, fe, context, stream);
-    Collection<? extends FeatureStructure> featureStructures = fe.getFeatureStructures(list, false, context,
-            stream);
+    List<AnnotationFS> list = this.getTargetAnnotation(annotation, this.fe, context, stream);
+    Collection<? extends FeatureStructure> featureStructures = this.fe.getFeatureStructures(list,
+            false, context, stream);
     List<String> result = new ArrayList<>();
 
     for (FeatureStructure each : featureStructures) {
+      if (each instanceof AnnotationFS && !each.getType().equals(annotation.getType())) {
+        feature = this.fe.getFeature(new MatchContext((AnnotationFS) each, context.getElement(),
+                context.getRuleMatch(), context.getDirection()), stream);
+      }
       FeatureStructure featureValue = each.getFeatureValue(feature);
-      if(featureValue instanceof StringArrayFS) {
+      if (featureValue instanceof StringArrayFS) {
         StringArrayFS array = (StringArrayFS) featureValue;
         for (int i = 0; i < array.size(); i++) {
           String b = array.get(i);
           result.add(b);
         }
-      } 
+      }
     }
-    
+
     return result;
   }
 
   public FeatureExpression getFeatureExpression() {
-    return fe;
+
+    return this.fe;
   }
 
   public void setFeatureExpression(FeatureExpression fe) {
+
     this.fe = fe;
   }
 
-
-
-  
-  
-
 }
diff --git a/ruta-core/src/main/java/org/apache/uima/ruta/expression/type/TypeListVariableExpression.java b/ruta-core/src/main/java/org/apache/uima/ruta/expression/type/TypeListVariableExpression.java
index c75874d..3e6e201 100644
--- a/ruta-core/src/main/java/org/apache/uima/ruta/expression/type/TypeListVariableExpression.java
+++ b/ruta-core/src/main/java/org/apache/uima/ruta/expression/type/TypeListVariableExpression.java
@@ -48,7 +48,12 @@
       } else if (each instanceof Type) {
         result.add((Type) each);
       } else if(each instanceof String) {
-        result.add(parent.getEnvironment().getType((String) each));
+        Type type = parent.getEnvironment().getType((String) each);
+        if(type != null) {
+          result.add(type);
+        } else {
+          throw new IllegalArgumentException("Not able to resolve type: " + each);
+        }
       }
     }
     return result;
diff --git a/ruta-core/src/main/java/org/apache/uima/ruta/resource/TrieXMLEventHandler.java b/ruta-core/src/main/java/org/apache/uima/ruta/resource/TrieXMLEventHandler.java
index 5634bcb..9a31ea4 100644
--- a/ruta-core/src/main/java/org/apache/uima/ruta/resource/TrieXMLEventHandler.java
+++ b/ruta-core/src/main/java/org/apache/uima/ruta/resource/TrieXMLEventHandler.java
@@ -28,17 +28,16 @@
 
   private Stack<MultiTextNode> stack;
 
-  // boolean listeningState;
+  private boolean inContent;
 
-  boolean inContent;
+  private boolean inType;
 
-  boolean inType;
+  private StringBuilder type = new StringBuilder();
 
   public TrieXMLEventHandler(MultiTextNode root) {
     super();
     this.stack = new Stack<MultiTextNode>();
     stack.add(root);
-    // this.listeningState = false;
   }
 
   @Override
@@ -53,11 +52,7 @@
   public void startElement(String namespaceURI, String localName, String qualifiedName,
           Attributes atts) {
     if ("n".equals(localName) || "n".equals(qualifiedName)) {
-      // char c = atts.getValue("c").charAt(0);
-      // boolean e = Boolean.valueOf(atts.getValue("e"));
       MultiTextNode newNode = new MultiTextNode();
-      // newNode.setWordEnd(e);
-      // stack.peek().addChild(newNode);
       stack.add(newNode);
       inContent = false;
       inType = false;
@@ -67,7 +62,6 @@
       inContent = false;
     }
     if ("c".equals(localName) || "c".equals(qualifiedName)) {
-      // listeningState = true;
       inType = false;
       inContent = true;
     }
@@ -80,6 +74,8 @@
       stack.peek().addChild(pop);
     }
     if ("t".equals(localName) || "t".equals(qualifiedName)) {
+      stack.peek().addType(type.toString());
+      type.setLength(0);
       inType = false;
     }
     if ("c".equals(localName) || "c".equals(qualifiedName)) {
@@ -94,11 +90,7 @@
     }
     MultiTextNode peek = stack.peek();
     if (inType) {
-      StringBuilder type = new StringBuilder();
-      for (int i = start; i < start + length; i++) {
-        type.append(String.valueOf(ch[i]));
-      }
-      peek.addType(type.toString());
+      type.append(ch, start, length);
       peek.setWordEnd(true);
     } else if (inContent) {
       if (ch.length > 0) {
diff --git a/ruta-core/src/main/java/org/apache/uima/ruta/rule/ComposedRuleElement.java b/ruta-core/src/main/java/org/apache/uima/ruta/rule/ComposedRuleElement.java
index 2adc318..a663760 100644
--- a/ruta-core/src/main/java/org/apache/uima/ruta/rule/ComposedRuleElement.java
+++ b/ruta-core/src/main/java/org/apache/uima/ruta/rule/ComposedRuleElement.java
@@ -83,8 +83,8 @@
         RuleMatch extendedMatch = ruleMatch.copy(extendedContainerMatch, true);
         ComposedRuleElementMatch composedMatch = createComposedMatch(extendedMatch,
                 extendedContainerMatch, stream);
-        List<RuleMatch> startRuleMatches = each.startMatch(extendedMatch, null, composedMatch,
-                this, stream, crowd);
+        List<RuleMatch> startRuleMatches = each.startMatch(extendedMatch, null, composedMatch, this,
+                stream, crowd);
         for (RuleMatch startRuleMatch : startRuleMatches) {
           ComposedRuleElementMatch startElementMatch = (ComposedRuleElementMatch) startRuleMatch
                   .getLastMatch(this, true);
@@ -223,8 +223,8 @@
         AnnotationFS lastAnnotation = eachRuleMatch.getLastMatchedAnnotation(context, stream);
         boolean failed = !eachComposedMatch.matched();
         List<AnnotationFS> textsMatched = eachRuleMatch.getMatchedAnnotationsOfRoot();
-        if ((!stream.isGreedyAnchoring() && !stream.isOnlyOnce())
-                || (!textsMatched.isEmpty() && !earlyExit(textsMatched.get(0), ruleApply, stream))) {
+        if ((!stream.isGreedyAnchoring() && !stream.isOnlyOnce()) || (!textsMatched.isEmpty()
+                && !earlyExit(textsMatched.get(0), ruleApply, stream))) {
           List<RuleMatch> fallbackContinue = fallbackContinue(after, failed, lastAnnotation,
                   eachRuleMatch, ruleApply, eachComposedMatch, sideStepOrigin, entryPoint, stream,
                   crowd);
@@ -269,8 +269,8 @@
         boolean failed = !eachComposedMatch.matched();
 
         List<AnnotationFS> textsMatched = eachRuleMatch.getMatchedAnnotationsOfRoot();
-        if ((!stream.isGreedyAnchoring() && !stream.isOnlyOnce())
-                || (!textsMatched.isEmpty() && !earlyExit(textsMatched.get(0), ruleApply, stream))) {
+        if ((!stream.isGreedyAnchoring() && !stream.isOnlyOnce()) || (!textsMatched.isEmpty()
+                && !earlyExit(textsMatched.get(0), ruleApply, stream))) {
           List<RuleMatch> fallbackContinue = fallbackContinue(after, failed, lastAnnotation,
                   eachRuleMatch, ruleApply, eachComposedMatch, sideStepOrigin, entryPoint, stream,
                   crowd);
@@ -317,7 +317,8 @@
   }
 
   private Map<RuleMatch, ComposedRuleElementMatch> mergeDisjunctiveRuleMatches(
-          Map<RuleMatch, ComposedRuleElementMatch> ruleMatches, boolean direction, RutaStream stream) {
+          Map<RuleMatch, ComposedRuleElementMatch> ruleMatches, boolean direction,
+          RutaStream stream) {
     // TODO hotfix: this needs a correct implementation
     Map<RuleMatch, ComposedRuleElementMatch> result = new TreeMap<RuleMatch, ComposedRuleElementMatch>(
             ruleMatchComparator);
@@ -336,10 +337,8 @@
           largestEntry = entry;
           largestAnnotation = lastMatchedAnnotation;
         } else {
-          if (lastMatchedAnnotation != null
-                  && largestAnnotation != null
-                  && lastMatchedAnnotation.getCoveredText().length() > largestAnnotation
-                          .getCoveredText().length()) {
+          if (lastMatchedAnnotation != null && largestAnnotation != null && lastMatchedAnnotation
+                  .getCoveredText().length() > largestAnnotation.getCoveredText().length()) {
             largestEntry = entry;
             largestAnnotation = lastMatchedAnnotation;
           }
@@ -448,8 +447,8 @@
             result = nextElement.continueMatch(after, backtrackedAnnotation, ruleMatch, ruleApply,
                     parentContainerMatch, sideStepOrigin, entryPoint, stream, crowd);
           } else {
-            result = fallback(after, failed, annotation, ruleMatch, ruleApply,
-                    parentContainerMatch, sideStepOrigin, entryPoint, stream, crowd);
+            result = fallback(after, failed, annotation, ruleMatch, ruleApply, parentContainerMatch,
+                    sideStepOrigin, entryPoint, stream, crowd);
           }
         } else {
           if (this.equals(entryPoint)) {
@@ -517,10 +516,12 @@
       ComposedRuleElement parentElement = (ComposedRuleElement) parentContainer;
       result = parentElement.fallbackContinue(after, failed, annotation, ruleMatch, ruleApply,
               containerMatch, sideStepOrigin, entryPoint, stream, crowd);
-    } else if (sideStepOrigin != null) {
+    } else if (sideStepOrigin != null && !failed) {
       result = sideStepOrigin.continueSideStep(after, ruleMatch, ruleApply, containerMatch,
               entryPoint, stream, crowd);
     } else {
+      // take care that failed matches wont be applied
+      ruleMatch.setMatched(ruleMatch.matched && !failed);
       result.add(ruleMatch);
       doneMatching(ruleMatch, ruleApply, stream, crowd);
     }
@@ -540,7 +541,8 @@
           RutaStream stream, InferenceCrowd crowd) {
     List<AnnotationFS> textsMatched = match.getTextsMatched();
     if (textsMatched == null || textsMatched.isEmpty()) {
-      getParent().getEnvironment().addMatchToVariable(ruleMatch, this, new MatchContext(getParent()), stream);
+      getParent().getEnvironment().addMatchToVariable(ruleMatch, this,
+              new MatchContext(getParent()), stream);
       match.evaluateInnerMatches(true, stream);
       return;
     }
@@ -551,7 +553,7 @@
 
     MatchContext context = new MatchContext(annotation, this, ruleMatch, after);
     context.getParent().getEnvironment().addMatchToVariable(ruleMatch, this, context, stream);
-    
+
     List<EvaluatedCondition> evaluatedConditions = new ArrayList<EvaluatedCondition>(
             conditions.size());
     for (AbstractRutaCondition condition : conditions) {
@@ -559,7 +561,7 @@
       EvaluatedCondition eval = condition.eval(context, stream, crowd);
       crowd.endVisit(condition, null);
       evaluatedConditions.add(eval);
-      if(!eval.isValue()) {
+      if (!eval.isValue()) {
         break;
       }
     }
diff --git a/ruta-core/src/main/java/org/apache/uima/ruta/rule/RutaRuleElement.java b/ruta-core/src/main/java/org/apache/uima/ruta/rule/RutaRuleElement.java
index 729d679..194c19d 100644
--- a/ruta-core/src/main/java/org/apache/uima/ruta/rule/RutaRuleElement.java
+++ b/ruta-core/src/main/java/org/apache/uima/ruta/rule/RutaRuleElement.java
@@ -276,7 +276,7 @@
     if (matchInfo == null) {
       context.getParent().getEnvironment().addMatchToVariable(ruleMatch, this, context, stream);
       if (quantifier.isOptional(context, stream)) {
-        result = continueMatchSomewhereElse(after, true, annotation, ruleMatch, ruleApply,
+        result = continueMatchSomewhereElse(after, false, annotation, ruleMatch, ruleApply,
                 containerMatch, sideStepOrigin, entryPoint, stream, crowd);
       } else if (getContainer() instanceof ComposedRuleElement) {
         ComposedRuleElement cre = (ComposedRuleElement) getContainer();
diff --git a/ruta-core/src/main/java/org/apache/uima/ruta/verbalize/ExpressionVerbalizer.java b/ruta-core/src/main/java/org/apache/uima/ruta/verbalize/ExpressionVerbalizer.java
index 9c92729..0c48ff0 100644
--- a/ruta-core/src/main/java/org/apache/uima/ruta/verbalize/ExpressionVerbalizer.java
+++ b/ruta-core/src/main/java/org/apache/uima/ruta/verbalize/ExpressionVerbalizer.java
@@ -21,6 +21,8 @@
 
 import java.util.Iterator;
 
+import org.apache.commons.lang3.StringUtils;
+import org.apache.uima.cas.CAS;
 import org.apache.uima.ruta.expression.AnnotationTypeExpression;
 import org.apache.uima.ruta.expression.IRutaExpression;
 import org.apache.uima.ruta.expression.MatchReference;
@@ -299,7 +301,19 @@
   }
   
   public String verbalize(MatchReference expression) {
-    return expression.getMatch();
+    String match = expression.getMatch();
+    if(match == null) {
+      String string = expression.toString();
+      if(StringUtils.equals(string, CAS.TYPE_NAME_DOCUMENT_ANNOTATION)) {
+        return "Document";
+      } else {
+        return string;
+      }
+    }
+    if(expression.getArgument() != null) {
+     return  match + expression.getComparator() + verbalizer.verbalize(expression.getArgument());
+    }
+    return match;
   }
   
   public String verbalize(AnnotationTypeExpression expression) {
diff --git a/ruta-core/src/main/java/org/apache/uima/ruta/verbalize/RutaVerbalizer.java b/ruta-core/src/main/java/org/apache/uima/ruta/verbalize/RutaVerbalizer.java
index 6ce0ad5..1d1c082 100644
--- a/ruta-core/src/main/java/org/apache/uima/ruta/verbalize/RutaVerbalizer.java
+++ b/ruta-core/src/main/java/org/apache/uima/ruta/verbalize/RutaVerbalizer.java
@@ -75,10 +75,10 @@
       return conditionVerbalizer.verbalize((AbstractRutaCondition) element);
     } else if (element instanceof IRutaExpression) {
       return expressionVerbalizer.verbalize((RutaExpression) element);
-    } else if (element instanceof RutaElement) {
-      return scriptVerbalizer.verbalize((RutaElement) element);
     } else if (element instanceof RutaBlock) {
       return verbalize((RutaBlock) element, false);
+    } else if (element instanceof RutaElement) {
+      return scriptVerbalizer.verbalize((RutaElement) element);
     } else {
       return element.getClass().getSimpleName();
     }
diff --git a/ruta-core/src/main/java/org/apache/uima/ruta/verbalize/ScriptVerbalizer.java b/ruta-core/src/main/java/org/apache/uima/ruta/verbalize/ScriptVerbalizer.java
index 4fdc622..f60661b 100644
--- a/ruta-core/src/main/java/org/apache/uima/ruta/verbalize/ScriptVerbalizer.java
+++ b/ruta-core/src/main/java/org/apache/uima/ruta/verbalize/ScriptVerbalizer.java
@@ -154,9 +154,16 @@
       RutaMatcher matcher = tmre.getMatcher();
       // action-only rule
         IRutaExpression expression = matcher.getExpression();
-        if (expression != null) {
-          result.append(verbalizer.verbalize(expression));
-        } else {
+        boolean actionOnlyRule = expression == null;
+        if(expression != null) {
+          String verbalize = verbalizer.verbalize(expression);
+          if(StringUtils.isBlank(verbalize)) {
+            actionOnlyRule = true;
+          } else {
+            result.append(verbalize);
+          }
+        }
+        if (actionOnlyRule) {
           Iterator<AbstractRutaAction> ait = actions.iterator();
           while (ait.hasNext()) {
             AbstractRutaAction each = ait.next();
@@ -165,6 +172,7 @@
               result.append(",");
             }
           }
+          return result.toString();
         }
     } else if (re instanceof WildCardRuleElement) {
       result.append("#");
diff --git a/ruta-core/src/test/java/org/apache/uima/ruta/action/ConfigureTest.java b/ruta-core/src/test/java/org/apache/uima/ruta/action/ConfigureTest.java
new file mode 100644
index 0000000..1065d4e
--- /dev/null
+++ b/ruta-core/src/test/java/org/apache/uima/ruta/action/ConfigureTest.java
@@ -0,0 +1,52 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.uima.ruta.action;
+
+import java.util.Collection;
+
+import org.apache.uima.cas.CAS;
+import org.apache.uima.fit.util.JCasUtil;
+import org.apache.uima.jcas.JCas;
+import org.apache.uima.ruta.engine.Ruta;
+import org.apache.uima.ruta.engine.RutaTestUtils;
+import org.apache.uima.ruta.type.Statistics;
+import org.junit.Assert;
+import org.junit.Test;
+
+
+public class ConfigureTest {
+
+  @Test
+  public void test() throws Exception {
+    
+    String script = "ENGINE org.apache.uima.ruta.engine.CWEngine;";
+    script += "CONFIGURE(CWEngine, \"profile\"= true, \"statistics\"=true);";
+    script +="EXEC(CWEngine);";
+    CAS cas = RutaTestUtils.getCAS("Some test.");
+    Ruta.apply(cas, script);
+    
+    JCas jcas = cas.getJCas();
+    Collection<Statistics> statistics = JCasUtil.select(jcas, Statistics.class);
+    
+    Assert.assertFalse(statistics.isEmpty());
+  }
+  
+  
+}
diff --git a/ruta-core/src/test/java/org/apache/uima/ruta/action/GatherTest.java b/ruta-core/src/test/java/org/apache/uima/ruta/action/GatherTest.java
index 8a6605a..53584e3 100644
--- a/ruta-core/src/test/java/org/apache/uima/ruta/action/GatherTest.java
+++ b/ruta-core/src/test/java/org/apache/uima/ruta/action/GatherTest.java
@@ -88,7 +88,7 @@
   }
 
   @Test
-  public void testOptionalMatch() {
+  public void testOptionalMatch() throws Exception {
     String document = "A X C";
     String script = "";
     script += "W{REGEXP(\"A\")->MARK(T1)};";
@@ -105,13 +105,8 @@
     list.add(new TestFeature(fn1, "", "uima.tcas.Annotation"));
     String fn2 = "b";
     list.add(new TestFeature(fn2, "", "uima.tcas.Annotation"));
-    CAS cas = null;
-    try {
-      cas = RutaTestUtils.getCAS(document, complexTypes, features);
+    CAS cas  = RutaTestUtils.getCAS(document, complexTypes, features);
       Ruta.apply(cas, script);
-    } catch (Exception e) {
-      e.printStackTrace();
-    }
 
     Type t = null;
     AnnotationIndex<AnnotationFS> ai = null;
diff --git a/ruta-core/src/test/java/org/apache/uima/ruta/block/ForEachBlockTest.java b/ruta-core/src/test/java/org/apache/uima/ruta/block/ForEachBlockTest.java
index e36eaf5..887b739 100644
--- a/ruta-core/src/test/java/org/apache/uima/ruta/block/ForEachBlockTest.java
+++ b/ruta-core/src/test/java/org/apache/uima/ruta/block/ForEachBlockTest.java
@@ -208,6 +208,24 @@
     cas.release();
   }
   
+  @Test
+  public void testWithContainingBlock() throws Exception {
+    String script = "";
+    script += "FOREACH(num) NUM{} {\n";
+    script += "BLOCK(onlyNum) num{}{\n";
+    script += "(num NUM){-> T1};\n";
+    script += "num{-> T2};\n";
+    script += "}\n";
+    script += "}\n";
+
+    CAS cas = RutaTestUtils.getCAS("1 22 333");
+    Ruta.apply(cas, script);
+
+    RutaTestUtils.assertAnnotationsEquals(cas, 1, 0);
+    RutaTestUtils.assertAnnotationsEquals(cas, 2, 3, "1", "22", "333");
+    cas.release();
+  }
+  
   
   
 }
diff --git a/ruta-core/src/test/java/org/apache/uima/ruta/block/RutaScriptBlockTest.java b/ruta-core/src/test/java/org/apache/uima/ruta/block/RutaScriptBlockTest.java
index 784cf52..f8af263 100644
--- a/ruta-core/src/test/java/org/apache/uima/ruta/block/RutaScriptBlockTest.java
+++ b/ruta-core/src/test/java/org/apache/uima/ruta/block/RutaScriptBlockTest.java
@@ -87,5 +87,19 @@
     RutaTestUtils.assertAnnotationsEquals(cas, 1, 1, "1");
     cas.release();
   }
-  
+
+  @Test
+  public void testWindow() throws Exception {
+    String script = "NUM{->T1};";
+    script += "BLOCK(num) NUM{} {\n";
+    script += "NUM{-> T2};";
+    script += "}";
+
+    CAS cas = RutaTestUtils.getCAS("1 22 333");
+    Ruta.apply(cas, script);
+
+    RutaTestUtils.assertAnnotationsEquals(cas, 2, 3, "1", "22", "333");
+    cas.release();
+  }
+
 }
diff --git a/ruta-core/src/test/java/org/apache/uima/ruta/condition/ImplicitCondition2Test.java b/ruta-core/src/test/java/org/apache/uima/ruta/condition/ImplicitCondition2Test.java
index 1c7b140..24e7d95 100644
--- a/ruta-core/src/test/java/org/apache/uima/ruta/condition/ImplicitCondition2Test.java
+++ b/ruta-core/src/test/java/org/apache/uima/ruta/condition/ImplicitCondition2Test.java
@@ -63,12 +63,28 @@
   
   @Test
   public void testStringCompare() throws ResourceInitializationException, InvalidXMLException, IOException, AnalysisEngineProcessException, CASException {
-    CAS cas = RutaTestUtils.getCAS("a b. a b.");
+    String document = "a b. a b.";
+    CAS cas = RutaTestUtils.getCAS(document);
     Assert.assertTrue(Ruta.matches(cas.getJCas(), "(w:W # W{W.ct==w.ct}){->T1};"));
     Assert.assertTrue(Ruta.matches(cas.getJCas(), "STRING s1 = \"a\"; (w:W W{s1==w.ct}){->T2};"));
     RutaTestUtils.assertAnnotationsEquals(cas, 1, 2, "a b. a", "b. a b");
     RutaTestUtils.assertAnnotationsEquals(cas, 2, 2, "a b", "a b");
   }
   
+  @Test
+  public void testStringCompareNull() throws ResourceInitializationException, InvalidXMLException, IOException, AnalysisEngineProcessException, CASException {
+    String document = "a b. a b.";
+    CAS cas = RutaTestUtils.getCAS(document);
+    
+    String rules = "STRING s2;\n";
+    rules += "Document{s2 == \"\" -> T10};\n";
+    rules += "Document{s2 == null -> T11};\n";
+    Assert.assertTrue(Ruta.matches(cas.getJCas(), rules));
+    
+    RutaTestUtils.assertAnnotationsEquals(cas, 10, 1, document);
+    RutaTestUtils.assertAnnotationsEquals(cas, 11, 0);
+    
+  }
+  
   
 }
diff --git a/ruta-core/src/test/java/org/apache/uima/ruta/engine/ParamVarTest.java b/ruta-core/src/test/java/org/apache/uima/ruta/engine/ParamVarTest.java
index 7ccdf8e..401c18e 100644
--- a/ruta-core/src/test/java/org/apache/uima/ruta/engine/ParamVarTest.java
+++ b/ruta-core/src/test/java/org/apache/uima/ruta/engine/ParamVarTest.java
@@ -22,6 +22,7 @@
 import java.util.HashMap;
 import java.util.Map;
 
+import org.apache.uima.analysis_engine.AnalysisEngineProcessException;
 import org.apache.uima.cas.CAS;
 import org.apache.uima.ruta.type.CW;
 import org.apache.uima.ruta.type.SW;
@@ -88,10 +89,35 @@
         SW.class.getName() + RutaEngine.SEPARATOR_VAR_VALUES + CW.class.getName() });
 
     CAS cas = RutaTestUtils.getCAS(document);
-      Ruta.apply(cas, script, params);
+    Ruta.apply(cas, script, params);
 
     RutaTestUtils.assertAnnotationsEquals(cas, 1, 2, "Some", "text");
     
     cas.release();
   }
+  
+  @Test(expected = AnalysisEngineProcessException.class)
+  public void testWithStrictImport() throws Exception {
+    String document = "Some text.";
+    String script = "";
+    script += "TYPE t1;";
+    script += "TYPE t2;";
+    script += "TYPELIST tl;";
+    script += "CW{ -> t1};";
+    script += "SW{ -> t2};";
+    script += "ANY{PARTOF(tl) -> T3};";
+    Map<String, Object> params = new HashMap<String, Object>();
+    params.put(RutaEngine.PARAM_STRICT_IMPORTS, true);
+    params.put(RutaEngine.PARAM_VAR_NAMES, new String[] { "t1", "t2", "tl" });
+    params.put(RutaEngine.PARAM_VAR_VALUES, new String[] {"org.apache.uima.T1", "org.apache.uima.T2", 
+        "org.apache.uima.T1,org.apache.uima.T2"  });
+
+    CAS cas = RutaTestUtils.getCAS(document);
+    Ruta.apply(cas, script, params);
+
+    RutaTestUtils.assertAnnotationsEquals(cas, 3, 2, "Some", "text");
+    
+    cas.release();
+  }
+  
 }
diff --git a/ruta-core/src/test/java/org/apache/uima/ruta/engine/RecursiveConfigureTest.java b/ruta-core/src/test/java/org/apache/uima/ruta/engine/RecursiveConfigureTest.java
new file mode 100644
index 0000000..719b5f7
--- /dev/null
+++ b/ruta-core/src/test/java/org/apache/uima/ruta/engine/RecursiveConfigureTest.java
@@ -0,0 +1,37 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.uima.ruta.engine;
+
+import org.apache.uima.analysis_engine.AnalysisEngineDescription;
+import org.apache.uima.fit.factory.AnalysisEngineFactory;
+import org.junit.Ignore;
+import org.junit.Test;
+
+public class RecursiveConfigureTest {
+
+  @Test
+  @Ignore
+  public void test() throws Exception {
+
+    AnalysisEngineDescription aed = AnalysisEngineFactory.createEngineDescriptionFromPath(
+            "src/test/resources/org/apache/uima/ruta/engine/RecursiveConfigureEngine.xml");
+    AnalysisEngineFactory.createEngine(aed);
+  }
+}
diff --git a/ruta-core/src/test/java/org/apache/uima/ruta/engine/RutaEngineTest.java b/ruta-core/src/test/java/org/apache/uima/ruta/engine/RutaEngineTest.java
index da9c827..895f03f 100644
--- a/ruta-core/src/test/java/org/apache/uima/ruta/engine/RutaEngineTest.java
+++ b/ruta-core/src/test/java/org/apache/uima/ruta/engine/RutaEngineTest.java
@@ -73,7 +73,6 @@
     Collection<String> usedTypes = typeUsageInformation.getUsedTypes();
     List<String> usedTypesList = new ArrayList<>(usedTypes);
     Collections.sort(usedTypesList);
-    ;
     Assert.assertEquals(Arrays.asList("org.apache.uima.ruta.type.BREAK",
             "org.apache.uima.ruta.type.COMMA", "org.apache.uima.ruta.type.CW",
             "org.apache.uima.ruta.type.FalseNegative", "org.apache.uima.ruta.type.MARKUP",
diff --git a/ruta-core/src/test/java/org/apache/uima/ruta/engine/ThreeStackedScriptsVariableResetTest.java b/ruta-core/src/test/java/org/apache/uima/ruta/engine/ThreeStackedScriptsVariableResetTest.java
new file mode 100644
index 0000000..00b3a3a
--- /dev/null
+++ b/ruta-core/src/test/java/org/apache/uima/ruta/engine/ThreeStackedScriptsVariableResetTest.java
@@ -0,0 +1,85 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.uima.ruta.engine;
+
+import java.io.File;
+import java.nio.file.Paths;
+
+import org.apache.commons.lang3.tuple.Pair;
+import org.apache.uima.UIMAFramework;
+import org.apache.uima.analysis_engine.AnalysisEngine;
+import org.apache.uima.analysis_engine.AnalysisEngineDescription;
+import org.apache.uima.cas.CAS;
+import org.apache.uima.cas.Feature;
+import org.apache.uima.cas.FeatureStructure;
+import org.apache.uima.cas.Type;
+import org.apache.uima.fit.factory.JCasFactory;
+import org.apache.uima.fit.util.CasUtil;
+import org.apache.uima.jcas.JCas;
+import org.apache.uima.resource.metadata.TypeSystemDescription;
+import org.apache.uima.ruta.descriptor.RutaBuildOptions;
+import org.apache.uima.ruta.descriptor.RutaDescriptorFactory;
+import org.apache.uima.ruta.descriptor.RutaDescriptorInformation;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class ThreeStackedScriptsVariableResetTest {
+
+  @Test
+  public void test() throws Exception {
+    String input1 = "snark";
+    String input2 = "cat";
+    String input3 = "bug";
+
+    String path = "src/test/resources/org/apache/uima/ruta/engine/";
+    RutaDescriptorFactory factory = new RutaDescriptorFactory();
+    RutaBuildOptions options = new RutaBuildOptions();
+    RutaDescriptorInformation rdi = factory
+            .parseDescriptorInformation(new File(path + "script1.ruta"), options);
+    Pair<AnalysisEngineDescription, TypeSystemDescription> descriptions = factory.createDescriptions(null, Paths.get(path).toFile().getAbsolutePath(), rdi, options, new String[] { path }, new String[] { path }, null);
+
+    AnalysisEngine ae = UIMAFramework.produceAnalysisEngine(descriptions.getKey());
+    JCas jcas = JCasFactory.createJCas(descriptions.getValue());
+    
+    jcas.setDocumentText(input1);
+    ae.process(jcas);
+    checkFeatureValue(jcas);
+    
+    jcas.reset();
+    jcas.setDocumentText(input2);
+    ae.process(jcas);
+    checkFeatureValue(jcas);
+    
+    jcas.reset();
+    jcas.setDocumentText(input3);
+    ae.process(jcas);
+    checkFeatureValue(jcas);
+    
+  }
+
+  private void checkFeatureValue(JCas jcas) {
+    CAS cas = jcas.getCas();
+    Type type = cas.getTypeSystem().getType("script3.Value");
+    Feature feature = type.getFeatureByBaseName("value");
+    FeatureStructure fs = CasUtil.selectSingle(cas, type);
+    String stringValue = fs.getStringValue(feature);
+    Assert.assertEquals("", stringValue);
+  }
+
+}
diff --git a/ruta-core/src/test/java/org/apache/uima/ruta/expression/annotation/AnnotationLabelExpressionTest.java b/ruta-core/src/test/java/org/apache/uima/ruta/expression/annotation/AnnotationLabelExpressionTest.java
index 261a3ad..ebcd12b 100644
--- a/ruta-core/src/test/java/org/apache/uima/ruta/expression/annotation/AnnotationLabelExpressionTest.java
+++ b/ruta-core/src/test/java/org/apache/uima/ruta/expression/annotation/AnnotationLabelExpressionTest.java
@@ -6,9 +6,9 @@
  * to you under the Apache License, Version 2.0 (the
  * "License"); you may not use this file except in compliance
  * with the License.  You may obtain a copy of the License at
- * 
+ *
  * http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing,
  * software distributed under the License is distributed on an
  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
@@ -19,9 +19,6 @@
 
 package org.apache.uima.ruta.expression.annotation;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Collection;
@@ -56,6 +53,7 @@
 
   @Test
   public void testSimple() throws Exception {
+
     String document = "Some text.";
     String script = "a:W W{-> CREATE(Struct, \"a\"=a)};";
 
@@ -80,17 +78,18 @@
     Feature f1 = t.getFeatureByBaseName(fn);
     ai = cas.getAnnotationIndex(t);
 
-    assertEquals(1, ai.size());
+    Assert.assertEquals(1, ai.size());
     iterator = ai.iterator();
     AnnotationFS next = iterator.next();
-    assertEquals("text", next.getCoveredText());
+    Assert.assertEquals("text", next.getCoveredText());
     AnnotationFS a = (AnnotationFS) next.getFeatureValue(f1);
-    assertNotNull("Feature value is null!", a);
-    assertEquals("Some", a.getCoveredText());
+    Assert.assertNotNull("Feature value is null!", a);
+    Assert.assertEquals("Some", a.getCoveredText());
   }
 
   @Test
   public void testMultiple() throws Exception {
+
     String document = "Some text.";
     String script = "b:(a:W)+{-PARTOF(Struct) -> CREATE(Struct, \"a\"=a, \"b\"=b, \"c\"=a, \"d\"=b)};";
     script += "Struct.a{-> T1};";
@@ -121,6 +120,7 @@
 
   @Test
   public void testLayers() throws Exception {
+
     String document = "Some text.";
     String script = "d:(a:W b:W{-> CREATE(Struct, \"a\"=a, \"b\"=b, \"c\"=c, \"d\"=d)} c:PERIOD);";
 
@@ -145,7 +145,7 @@
 
     t = cas.getTypeSystem().getType(typeName);
     ai = cas.getAnnotationIndex(t);
-    assertEquals(1, ai.size());
+    Assert.assertEquals(1, ai.size());
     iterator = ai.iterator();
 
     AnnotationFS a = null;
@@ -153,38 +153,39 @@
     Feature f = null;
 
     next = iterator.next();
-    assertEquals("text", next.getCoveredText());
+    Assert.assertEquals("text", next.getCoveredText());
 
     f = t.getFeatureByBaseName("a");
     a = (AnnotationFS) next.getFeatureValue(f);
-    assertNotNull("Feature value is null!", a);
-    assertEquals("Some", a.getCoveredText());
+    Assert.assertNotNull("Feature value is null!", a);
+    Assert.assertEquals("Some", a.getCoveredText());
 
     f = t.getFeatureByBaseName("b");
     a = (AnnotationFS) next.getFeatureValue(f);
-    assertNotNull("Feature value is null!", a);
-    assertEquals("text", a.getCoveredText());
+    Assert.assertNotNull("Feature value is null!", a);
+    Assert.assertEquals("text", a.getCoveredText());
 
     f = t.getFeatureByBaseName("c");
     a = (AnnotationFS) next.getFeatureValue(f);
-    assertNotNull("Feature value is null!", a);
-    assertEquals(".", a.getCoveredText());
+    Assert.assertNotNull("Feature value is null!", a);
+    Assert.assertEquals(".", a.getCoveredText());
 
     f = t.getFeatureByBaseName("d");
     a = (AnnotationFS) next.getFeatureValue(f);
-    assertNotNull("Feature value is null!", a);
-    assertEquals("Some text.", a.getCoveredText());
+    Assert.assertNotNull("Feature value is null!", a);
+    Assert.assertEquals("Some text.", a.getCoveredText());
 
   }
 
   @Test
   public void testActions() throws Exception {
+
     String script = "a:W W{-> CREATE(Struct1, \"a\"=a)};";
     script += "W W{-> Struct2, Struct3};";
     script += "a:W Struct2{-> SETFEATURE(\"a\", a)};";
     script += "a:W Struct3{-> Struct3.a=a};";
 
-    CAS cas = applyOnStruct4Cas(script);
+    CAS cas = this.applyOnStruct4Cas(script);
 
     Type t = null;
     AnnotationIndex<AnnotationFS> ai = null;
@@ -195,42 +196,43 @@
 
     t = cas.getTypeSystem().getType("Struct1");
     ai = cas.getAnnotationIndex(t);
-    assertEquals(1, ai.size());
+    Assert.assertEquals(1, ai.size());
     iterator = ai.iterator();
     next = iterator.next();
-    assertEquals("text", next.getCoveredText());
+    Assert.assertEquals("text", next.getCoveredText());
     f = t.getFeatureByBaseName("a");
     a = (AnnotationFS) next.getFeatureValue(f);
-    assertNotNull("Feature value is null!", a);
-    assertEquals("Some", a.getCoveredText());
+    Assert.assertNotNull("Feature value is null!", a);
+    Assert.assertEquals("Some", a.getCoveredText());
 
     t = cas.getTypeSystem().getType("Struct2");
     ai = cas.getAnnotationIndex(t);
-    assertEquals(1, ai.size());
+    Assert.assertEquals(1, ai.size());
     iterator = ai.iterator();
     next = iterator.next();
-    assertEquals("text", next.getCoveredText());
+    Assert.assertEquals("text", next.getCoveredText());
     f = t.getFeatureByBaseName("a");
     a = (AnnotationFS) next.getFeatureValue(f);
-    assertNotNull("Feature value is null!", a);
-    assertEquals("Some", a.getCoveredText());
+    Assert.assertNotNull("Feature value is null!", a);
+    Assert.assertEquals("Some", a.getCoveredText());
 
     t = cas.getTypeSystem().getType("Struct3");
     ai = cas.getAnnotationIndex(t);
-    assertEquals(1, ai.size());
+    Assert.assertEquals(1, ai.size());
     iterator = ai.iterator();
     next = iterator.next();
-    assertEquals("text", next.getCoveredText());
+    Assert.assertEquals("text", next.getCoveredText());
     f = t.getFeatureByBaseName("a");
     a = (AnnotationFS) next.getFeatureValue(f);
-    assertNotNull("Feature value is null!", a);
-    assertEquals("Some", a.getCoveredText());
+    Assert.assertNotNull("Feature value is null!", a);
+    Assert.assertEquals("Some", a.getCoveredText());
 
   }
 
   @Test
   @Ignore
   public void testInsideOut() throws Exception {
+
     String document = "Some text.";
     String script = "(a:W{-PARTOF(Struct) -> CREATE(Struct, \"a\"=a, \"c\"=a)})+;";
     script += "Struct.a{-> T1};";
@@ -255,12 +257,13 @@
 
   @Test
   public void testWithinInlined() throws Exception {
+
     String script = "ANNOTATION c;";
     script += "Document{-> Struct1, Struct1.a = c}<-{i:SW{-> c=i} PERIOD;};";
     script += "i:Document{-> c=i}->{PERIOD{-> Struct2, Struct2.a = c};};";
     // script += "i:Document<-{PERIOD{-> Struct2, Struct2.a = i};};";
 
-    CAS cas = applyOnStruct4Cas(script);
+    CAS cas = this.applyOnStruct4Cas(script);
 
     Type t = null;
     AnnotationIndex<AnnotationFS> ai = null;
@@ -271,30 +274,31 @@
 
     t = cas.getTypeSystem().getType("Struct1");
     ai = cas.getAnnotationIndex(t);
-    assertEquals(1, ai.size());
+    Assert.assertEquals(1, ai.size());
     iterator = ai.iterator();
     next = iterator.next();
-    assertEquals("Some text.", next.getCoveredText());
+    Assert.assertEquals("Some text.", next.getCoveredText());
     f = t.getFeatureByBaseName("a");
     a = (AnnotationFS) next.getFeatureValue(f);
-    assertNotNull("Feature value is null!", a);
-    assertEquals("text", a.getCoveredText());
+    Assert.assertNotNull("Feature value is null!", a);
+    Assert.assertEquals("text", a.getCoveredText());
 
     t = cas.getTypeSystem().getType("Struct2");
     ai = cas.getAnnotationIndex(t);
-    assertEquals(1, ai.size());
+    Assert.assertEquals(1, ai.size());
     iterator = ai.iterator();
     next = iterator.next();
-    assertEquals(".", next.getCoveredText());
+    Assert.assertEquals(".", next.getCoveredText());
     f = t.getFeatureByBaseName("a");
     a = (AnnotationFS) next.getFeatureValue(f);
-    assertNotNull("Feature value is null!", a);
-    assertEquals("Some text.", a.getCoveredText());
+    Assert.assertNotNull("Feature value is null!", a);
+    Assert.assertEquals("Some text.", a.getCoveredText());
 
   }
 
   @Test
   public void testFeature() throws Exception {
+
     CAS cas = RutaTestUtils.getCAS("Some text.");
     Assert.assertTrue(Ruta.matches(cas.getJCas(), "a:W b:W{a.end == (b.begin-1)-> T1};"));
     RutaTestUtils.assertAnnotationsEquals(cas, 1, 1, "text");
@@ -302,8 +306,9 @@
 
   @Test
   public void testComplexFeature() throws Exception {
+
     String script = "a:W W{-> CREATE(Struct1, \"a\"=a)};";
-    CAS cas = applyOnStruct4Cas(script);
+    CAS cas = this.applyOnStruct4Cas(script);
     Assert.assertTrue(Ruta.matches(cas.getJCas(), "a:Struct1{a.a.begin == 0 -> T1};"));
     RutaTestUtils.assertAnnotationsEquals(cas, 1, 1, "text");
   }
@@ -311,6 +316,7 @@
   @Test(expected = AnalysisEngineProcessException.class)
   public void testWrongFeature() throws ResourceInitializationException, InvalidXMLException,
           IOException, AnalysisEngineProcessException, CASException {
+
     CAS cas = RutaTestUtils.getCAS("Some text.");
     Ruta.matches(cas.getJCas(), "a:W b:W{a.x == (b.y-1)-> T1};");
   }
@@ -318,12 +324,14 @@
   @Test
   public void testSequentialLabelSelfMatch() throws ResourceInitializationException,
           InvalidXMLException, IOException, AnalysisEngineProcessException, CASException {
+
     CAS cas = RutaTestUtils.getCAS("Some text.");
     Assert.assertFalse(Ruta.matches(cas.getJCas(), "e:CW e;"));
   }
 
   @Test
   public void testSpecialFeatureWithoutContextMatch() throws Exception {
+
     Map<String, String> types = new HashMap<>();
     String type = "Valued";
     types.put(type, "uima.tcas.Annotation");
@@ -342,6 +350,7 @@
 
   @Test
   public void testAcrossInlinedRules() throws Exception {
+
     String script = "(# PERIOD){->T1};\n";
     script += "T1{-> Struct1, Struct1.a = i}<-{i:SW;};\n";
     script += "o:T1<-{SW{->Struct2, Struct2.a = o};};\n";
@@ -349,7 +358,7 @@
     script += "Struct1{Struct1.a.ct==\"text\"->T3};\n";
     script += "Struct2.a{->T4};\n";
     script += "Struct2{Struct2.a.ct==\"Some text.\"->T5};\n";
-    CAS cas = applyOnStruct4Cas(script);
+    CAS cas = this.applyOnStruct4Cas(script);
     RutaTestUtils.assertAnnotationsEquals(cas, 2, 1, "text");
     RutaTestUtils.assertAnnotationsEquals(cas, 3, 1, "Some text.");
     RutaTestUtils.assertAnnotationsEquals(cas, 4, 1, "Some text.");
@@ -358,6 +367,7 @@
 
   @Test
   public void testSameOffset() throws Exception {
+
     String document = "Some text.";
     Map<String, String> typeMap = new TreeMap<String, String>();
     typeMap.put("Struct1", "uima.tcas.Annotation");
@@ -393,6 +403,7 @@
 
   @Test
   public void testFeatureAssignment() throws Exception {
+
     String document = "Some text.";
 
     String script = "CW{-> T1};\n";
@@ -406,7 +417,8 @@
 
   @Test
   public void testLabelWithQuantifier() throws Exception {
-    String script ="";
+
+    String script = "";
     script += "w:(W+) @PERIOD{->Struct1,Struct1.a=w,Struct1.as=w};\n";
     script += "(w:W)+ @PERIOD{->Struct2,Struct2.a=w,Struct2.as=w};\n";
     script += "w:W+ @PERIOD{->Struct3,Struct3.a=w,Struct3.as=w};\n";
@@ -457,7 +469,7 @@
     Assert.assertEquals(1, as.size());
     Assert.assertEquals("Some text", ((AnnotationFS) as.get(0)).getCoveredText());
     Assert.assertEquals("Annotation", as.get(0).getType().getShortName());
-    
+
     type = cas.getTypeSystem().getType("Struct2");
     featureA = type.getFeatureByBaseName("a");
     featureAS = type.getFeatureByBaseName("as");
@@ -480,7 +492,7 @@
     Assert.assertEquals("Some", ((AnnotationFS) as.get(1)).getCoveredText());
     Assert.assertEquals("SW", as.get(0).getType().getShortName());
     Assert.assertEquals("CW", as.get(1).getType().getShortName());
-    
+
     type = cas.getTypeSystem().getType("Struct3");
     featureA = type.getFeatureByBaseName("a");
     featureAS = type.getFeatureByBaseName("as");
@@ -507,79 +519,83 @@
 
   @Test
   public void testLabelReset() throws Exception {
-    String script= "";
+
+    String script = "";
     script += "W{->Struct1, Struct1.a = w} w:W?;";
     script += "W{->Struct2, Struct2.a = c} c:(W ANY)?;";
-    
-    CAS cas = applyOnStruct4Cas(script);
-    
+
+    CAS cas = this.applyOnStruct4Cas(script);
+
     Type type1 = cas.getTypeSystem().getType("Struct1");
     Feature feature1 = type1.getFeatureByBaseName("a");
-    
+
     List<AnnotationFS> select1 = new ArrayList<>(CasUtil.select(cas, type1));
     Assert.assertEquals(2, select1.size());
-    
+
     AnnotationFS a11 = select1.get(0);
     Assert.assertEquals("Some", a11.getCoveredText());
     AnnotationFS featureValue11 = (AnnotationFS) a11.getFeatureValue(feature1);
     Assert.assertEquals("text", featureValue11.getCoveredText());
-    
+
     AnnotationFS a21 = select1.get(1);
     Assert.assertEquals("text", a21.getCoveredText());
     AnnotationFS featureValue21 = (AnnotationFS) a21.getFeatureValue(feature1);
     Assert.assertNull(featureValue21);
-    
+
     Type type2 = cas.getTypeSystem().getType("Struct2");
     Feature feature2 = type2.getFeatureByBaseName("a");
-    
+
     List<AnnotationFS> select2 = new ArrayList<>(CasUtil.select(cas, type2));
     Assert.assertEquals(2, select2.size());
-    
-    AnnotationFS  a12 = select2.get(0);
+
+    AnnotationFS a12 = select2.get(0);
     Assert.assertEquals("Some", a12.getCoveredText());
     AnnotationFS featureValue12 = (AnnotationFS) a12.getFeatureValue(feature2);
     Assert.assertEquals("text.", featureValue12.getCoveredText());
-    
-    AnnotationFS  a22 = select2.get(1);
+
+    AnnotationFS a22 = select2.get(1);
     Assert.assertEquals("text", a22.getCoveredText());
     AnnotationFS featureValue22 = (AnnotationFS) a22.getFeatureValue(feature2);
     Assert.assertNull(featureValue22);
-    
-    
+
   }
-  
+
   @Test(expected = AnalysisEngineProcessException.class)
   public void testInvalidLabelWithQuantifier1() throws Exception {
-    String script= "";
+
+    String script = "";
     script += "w:ANY{->Struct1, Struct1.a = w};";
     script += "s1:Struct1{PARTOF(CW)->T1} s2:Struct1*{s2.a.ct == \"text\"};";
-    applyOnStruct4Cas(script);
+    this.applyOnStruct4Cas(script);
   }
-  
+
   @Test
   public void testInvalidLabelWithQuantifier2() throws Exception {
-    String script= "";
+
+    String script = "";
     script += "w:ANY{->Struct1, Struct1.a = w};";
     script += "PERIOD{s.a.ct==\"text\" ->T2} s:Struct1*{s.a.ct == \"text\"};";
-    CAS cas = applyOnStruct4Cas(script);
+    CAS cas = this.applyOnStruct4Cas(script);
     RutaTestUtils.assertAnnotationsEquals(cas, 2, 0);
   }
-  
+
   @Test
   public void testInvalidLabelWithOptional() throws Exception {
-    String script= "";
+
+    String script = "";
     script += "p:ANY{-> p.begin = a.begin, p.end = a.end} a:ANY;";
     script += "PERIOD{-> T1};";
-    CAS cas = applyOnStruct4Cas(script);
+    CAS cas = this.applyOnStruct4Cas(script);
     RutaTestUtils.assertAnnotationsEquals(cas, 1, 1, ".");
   }
-  
+
   @Test
   public void testInComposedStringExpression() throws Exception {
-    String script= "";
+
+    String script = "";
     script += "c:CW{-> Struct1, Struct1.s = \"<\"+c.ct+\">\" };";
     script += "Struct1.s ==\"<Some>\"{-> T1};";
-    
+
     String document = "Some text.";
     Map<String, String> typeMap = new TreeMap<String, String>();
     typeMap.put("Struct1", "uima.tcas.Annotation");
@@ -593,39 +609,86 @@
     Ruta.apply(cas, script);
     RutaTestUtils.assertAnnotationsEquals(cas, 1, 1, "Some");
   }
-  
+
   @Test
   public void testStackedInCondition() throws Exception {
-    String script= "";
+
+    String script = "";
     script += "w1:W{-> Struct1, Struct1.a = w2} w2:W;";
     script += "s:Struct1{REGEXP(s.a.ct, \"text\") -> T1};";
-    CAS cas = applyOnStruct4Cas(script);
+    CAS cas = this.applyOnStruct4Cas(script);
     RutaTestUtils.assertAnnotationsEquals(cas, 1, 1, "Some");
   }
-  
+
+  @Test
+  public void testStackedReinitLazyFeature() throws Exception {
+
+    String document = "Some text.";
+    Map<String, String> typeMap = new TreeMap<String, String>();
+    typeMap.put("Struct", "uima.tcas.Annotation");
+
+    Map<String, List<TestFeature>> featureMap = new TreeMap<String, List<TestFeature>>();
+    List<TestFeature> list = new ArrayList<RutaTestUtils.TestFeature>();
+    featureMap.put("Struct", list);
+    list.add(new TestFeature("a", "", "uima.tcas.Annotation"));
+    list.add(new TestFeature("s", "", "uima.cas.String"));
+    list.add(new TestFeature("b", "", "uima.cas.Boolean"));
+    list.add(new TestFeature("d", "", "uima.cas.Double"));
+
+    String script = "";
+    script += "SW{-> Struct};";
+    script += "CW{-> Struct, Struct.a=s2} s2:Struct;";
+    script += "s1:Struct{s1.begin==0 -> s1.a.a=CW};";
+    script += "s1:Struct{s1.begin==0 -> s1.a.s=\"s\"};";
+    script += "s1:Struct{s1.begin==0 -> s1.a.d=1.0};";
+    script += "s1:Struct{s1.begin==0 -> s1.a.b=true};";
+    script += "s1:Struct{s1.begin==0, s1.a.a.begin == 0 -> T1};";
+    script += "s1:Struct{s1.begin==0, s1.a.s == \"s\" -> T2};";
+    script += "s1:Struct{s1.begin==0, s1.a.d == 1.0 -> T3};";
+    script += "s1:Struct{s1.begin==0, s1.a.b -> T4};";
+
+    script += "s1:Struct s2:Struct PERIOD{-> CREATE(Struct, \"a\" = s1.a)};";
+    script += "s1:Struct{IS(PERIOD), s1.a.a.begin == 0 -> T5};";
+    script += "s1:Struct{IS(PERIOD), s1.a.s == \"s\" -> T6};";
+    script += "s1:Struct{IS(PERIOD), s1.a.d == 1.0 -> T7};";
+    script += "s1:Struct{IS(PERIOD), s1.a.b -> T8};";
+    CAS cas = RutaTestUtils.getCAS(document, typeMap, featureMap);
+    Ruta.apply(cas, script);
+    RutaTestUtils.assertAnnotationsEquals(cas, 1, 1, "Some");
+    RutaTestUtils.assertAnnotationsEquals(cas, 2, 1, "Some");
+    RutaTestUtils.assertAnnotationsEquals(cas, 3, 1, "Some");
+    RutaTestUtils.assertAnnotationsEquals(cas, 4, 1, "Some");
+    RutaTestUtils.assertAnnotationsEquals(cas, 5, 1, ".");
+    RutaTestUtils.assertAnnotationsEquals(cas, 6, 1, ".");
+    RutaTestUtils.assertAnnotationsEquals(cas, 7, 1, ".");
+    RutaTestUtils.assertAnnotationsEquals(cas, 8, 1, ".");
+  }
+
   @Test
   public void testInUnmark() throws Exception {
-    String script= "";
+
+    String script = "";
     script += "SW{-> T1};";
     script += "w1:W{-> Struct1, Struct1.a = w2} w2:T1;";
     script += "s:Struct1{-> UNMARK(s.a)};";
-    CAS cas = applyOnStruct4Cas(script);
+    CAS cas = this.applyOnStruct4Cas(script);
     RutaTestUtils.assertAnnotationsEquals(cas, 1, 0);
   }
-  
+
   @Test
   public void testInMatchCondition() throws Exception {
-    String script= "";
+
+    String script = "";
     script += "CW{-> Struct1, Struct1.a=sw} sw:SW;\n";
     script += "s:Struct1 s.a{-> T1};\n";
-//    script += "(s:Struct1 SW){->T2}<-{s W{REGEXP(\"text\")};};\n";
-    CAS cas = applyOnStruct4Cas(script);
+    // script += "(s:Struct1 SW){->T2}<-{s W{REGEXP(\"text\")};};\n";
+    CAS cas = this.applyOnStruct4Cas(script);
     RutaTestUtils.assertAnnotationsEquals(cas, 1, 1, "text");
-//    RutaTestUtils.assertAnnotationsEquals(cas, 2, 1, "Some text");
+    // RutaTestUtils.assertAnnotationsEquals(cas, 2, 1, "Some text");
   }
-  
-  
+
   private CAS applyOnStruct4Cas(String script) throws Exception {
+
     String document = "Some text.";
     Map<String, String> typeMap = new TreeMap<String, String>();
     typeMap.put("Struct1", "uima.tcas.Annotation");
diff --git a/ruta-core/src/test/java/org/apache/uima/ruta/expression/number/FloatVariableExpressionTest.java b/ruta-core/src/test/java/org/apache/uima/ruta/expression/number/FloatVariableExpressionTest.java
new file mode 100644
index 0000000..27df260
--- /dev/null
+++ b/ruta-core/src/test/java/org/apache/uima/ruta/expression/number/FloatVariableExpressionTest.java
@@ -0,0 +1,56 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.uima.ruta.expression.number;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.uima.cas.CAS;
+import org.apache.uima.ruta.engine.Ruta;
+import org.apache.uima.ruta.engine.RutaTestUtils;
+import org.apache.uima.ruta.engine.RutaTestUtils.TestFeature;
+import org.junit.Test;
+
+public class FloatVariableExpressionTest {
+
+  @Test
+  public void testAssignOnFloat() throws Exception {
+    String script = "FLOAT a2,a1;";
+    script += "(NUM{PARSE(a1)} \"%\") {-> CREATE (Percent, \"value\" = a1, \"class\" = \"Percent\", \"unit\" = \"%\")};";
+    script += "(NUM{PARSE(a2)} \"‰\") {-> ASSIGN(a2, a2/10), CREATE (Percent, \"value\" = a2, \"class\" = \"Percent\", \"unit\" = \"‰\")};";
+    script += "p:Percent{p.unit == \"%\", p.value==10 -> T1};";
+    script += "p:Percent{p.unit == \"‰\", p.value==1 -> T2};";
+    Map<String, String> complexTypes = new HashMap<>();
+    complexTypes.put("Percent", CAS.TYPE_NAME_ANNOTATION);
+    Map<String, List<TestFeature>> featureMap = new HashMap<>();
+    List<TestFeature> list = new ArrayList<>();
+    list.add(new TestFeature("class", "", CAS.TYPE_NAME_STRING));
+    list.add(new TestFeature("value", "", CAS.TYPE_NAME_FLOAT));
+    list.add(new TestFeature("unit", "", CAS.TYPE_NAME_STRING));
+    featureMap.put("Percent", list);
+    CAS cas = RutaTestUtils.getCAS("10 % , 10 ‰", complexTypes, featureMap);
+    Ruta.apply(cas, script);
+    
+    RutaTestUtils.assertAnnotationsEquals(cas, 1, 1, "10 %");
+    RutaTestUtils.assertAnnotationsEquals(cas, 2, 1, "10 ‰");
+  }
+
+}
diff --git a/ruta-core/src/test/java/org/apache/uima/ruta/rule/RegExpRuleTest.java b/ruta-core/src/test/java/org/apache/uima/ruta/rule/RegExpRuleTest.java
index 8555bf3..b2d78ad 100644
--- a/ruta-core/src/test/java/org/apache/uima/ruta/rule/RegExpRuleTest.java
+++ b/ruta-core/src/test/java/org/apache/uima/ruta/rule/RegExpRuleTest.java
@@ -32,6 +32,7 @@
 import org.apache.uima.cas.Type;
 import org.apache.uima.cas.text.AnnotationFS;
 import org.apache.uima.cas.text.AnnotationIndex;
+import org.apache.uima.ruta.engine.Ruta;
 import org.apache.uima.ruta.engine.RutaEngine;
 import org.apache.uima.ruta.engine.RutaTestUtils;
 import org.apache.uima.ruta.engine.RutaTestUtils.TestFeature;
@@ -40,10 +41,10 @@
 public class RegExpRuleTest {
 
   @Test
-  public void test() {
+  public void test() throws Exception {
     String name = this.getClass().getSimpleName();
     String namespace = this.getClass().getPackage().getName().replaceAll("\\.", "/");
-    CAS cas = null;
+
     Map<String, String> complexTypes = new HashMap<String, String>();
     Map<String, List<TestFeature>> features = new TreeMap<String, List<TestFeature>>();
     String typeName = "org.apache.uima.Complex";
@@ -56,14 +57,9 @@
     list.add(new TestFeature(fn2, "", "uima.cas.Boolean"));
     String fn3 = "s";
     list.add(new TestFeature(fn3, "", "uima.cas.String"));
-    
-    try {
-      cas = RutaTestUtils.process(namespace + "/" + name + RutaEngine.SCRIPT_FILE_EXTENSION, namespace + "/" + name
-              + ".txt", 50, false,false,complexTypes,features, null);
-    } catch (Exception e) {
-      e.printStackTrace();
-      assert (false);
-    }
+
+    CAS cas = RutaTestUtils.process(namespace + "/" + name + RutaEngine.SCRIPT_FILE_EXTENSION,
+            namespace + "/" + name + ".txt", 50, false, false, complexTypes, features, null);
     Type t = null;
     AnnotationIndex<AnnotationFS> ai = null;
     FSIterator<AnnotationFS> iterator = null;
@@ -73,7 +69,7 @@
     assertEquals(1, ai.size());
     iterator = ai.iterator();
     assertEquals(28, iterator.next().getCoveredText().length());
-   
+
     t = RutaTestUtils.getTestType(cas, 2);
     ai = cas.getAnnotationIndex(t);
     iterator = ai.iterator();
@@ -94,7 +90,7 @@
     String stringValue = null;
     Boolean booleanValue = null;
     AnnotationFS afs = null;
-    
+
     next = iterator.next();
     assertEquals("y", next.getCoveredText());
     stringValue = next.getStringValue(t.getFeatureByBaseName(fn3));
@@ -103,7 +99,7 @@
     assertEquals(true, booleanValue);
     afs = (AnnotationFS) next.getFeatureValue(t.getFeatureByBaseName(fn1));
     assertEquals("B", afs.getCoveredText());
-    
+
     next = iterator.next();
     assertEquals("B", next.getCoveredText());
     stringValue = next.getStringValue(t.getFeatureByBaseName(fn3));
@@ -112,7 +108,7 @@
     assertEquals(false, booleanValue);
     afs = (AnnotationFS) next.getFeatureValue(t.getFeatureByBaseName(fn1));
     assertEquals("y", afs.getCoveredText());
-    
+
     next = iterator.next();
     assertEquals("z", next.getCoveredText());
     stringValue = next.getStringValue(t.getFeatureByBaseName(fn3));
@@ -121,7 +117,7 @@
     assertEquals(true, booleanValue);
     afs = (AnnotationFS) next.getFeatureValue(t.getFeatureByBaseName(fn1));
     assertEquals("B", afs.getCoveredText());
-    
+
     next = iterator.next();
     assertEquals("B", next.getCoveredText());
     stringValue = next.getStringValue(t.getFeatureByBaseName(fn3));
@@ -130,7 +126,7 @@
     assertEquals(false, booleanValue);
     afs = (AnnotationFS) next.getFeatureValue(t.getFeatureByBaseName(fn1));
     assertEquals("z", afs.getCoveredText());
-    
+
     next = iterator.next();
     assertEquals("B", next.getCoveredText());
     stringValue = next.getStringValue(t.getFeatureByBaseName(fn3));
@@ -140,4 +136,15 @@
 
     cas.release();
   }
+
+  @Test
+  public void testSegments() throws Exception {
+    String document = "bla concepta bla";
+    String script = "\"(concept)([a-z])\"-> 1 = T1, 2 = T2;\n";
+    script += "T1{-PARTOF(T2)-> T2};";
+    CAS cas = RutaTestUtils.getCAS(document);
+    Ruta.apply(cas, script);
+    RutaTestUtils.assertAnnotationsEquals(cas, 2, 2, "concept", "a");
+  }
+
 }
diff --git a/ruta-core/src/test/java/org/apache/uima/ruta/rule/WildCard2Test.java b/ruta-core/src/test/java/org/apache/uima/ruta/rule/WildCard2Test.java
index fc2b88e..5fe7e8b 100644
--- a/ruta-core/src/test/java/org/apache/uima/ruta/rule/WildCard2Test.java
+++ b/ruta-core/src/test/java/org/apache/uima/ruta/rule/WildCard2Test.java
@@ -19,15 +19,22 @@
 
 package org.apache.uima.ruta.rule;
 
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
 import org.apache.uima.cas.CAS;
 import org.apache.uima.ruta.engine.Ruta;
 import org.apache.uima.ruta.engine.RutaTestUtils;
+import org.apache.uima.ruta.engine.RutaTestUtils.TestFeature;
+import org.junit.Assert;
 import org.junit.Test;
 
 public class WildCard2Test {
 
   @Test
-  public void test() {
+  public void test() throws Exception {
     String document = "Ogren, P.V., Wetzler, P.G., Bethard, S.: ClearTK: A UIMA Toolkit for Statistical Natural Language Processing. In: UIMA for NLP workshop at LREC 08. (2008)";
     document += "\n";
     document += "Stephen Soderland, Claire Cardie, and Raymond Mooney. Learning Information Extraction Rules for Semi-Structured and Free Text. In Machine Learning, volume 34, pages 233–272, 1999.";
@@ -42,13 +49,8 @@
     script += "(#{-CONTAINS(COLON)} PERIOD{-PARTOF(T7)}){-> T1} (# PERIOD){-> T2} # NUM{REGEXP(\"....\")-> T3};\n";
     script += "}\n";
 
-    CAS cas = null;
-    try {
-      cas = RutaTestUtils.getCAS(document);
-      Ruta.apply(cas, script);
-    } catch (Exception e) {
-      e.printStackTrace();
-    }
+    CAS cas = RutaTestUtils.getCAS(document);
+    Ruta.apply(cas, script);
 
     RutaTestUtils.assertAnnotationsEquals(cas, 1, 2, "Ogren, P.V., Wetzler, P.G., Bethard, S.:",
             "Stephen Soderland, Claire Cardie, and Raymond Mooney.");
@@ -61,17 +63,12 @@
   }
 
   @Test
-  public void testOptional() {
+  public void testOptional() throws Exception {
     String document = "Cw 1 2 3";
     String script = "(CW #){-> T1} SW?;";
 
-    CAS cas = null;
-    try {
-      cas = RutaTestUtils.getCAS(document);
-      Ruta.apply(cas, script);
-    } catch (Exception e) {
-      e.printStackTrace();
-    }
+    CAS cas = RutaTestUtils.getCAS(document);
+    Ruta.apply(cas, script);
 
     RutaTestUtils.assertAnnotationsEquals(cas, 1, 1, "Cw 1 2 3");
 
@@ -79,17 +76,12 @@
   }
 
   @Test
-  public void testLookaheadInGreedy() {
+  public void testLookaheadInGreedy() throws Exception {
     String document = "Some test. Some test. Some test.";
     String script = "((CW #){-> T1})+;";
     script += "((# PERIOD){-> T2})+;";
-    CAS cas = null;
-    try {
-      cas = RutaTestUtils.getCAS(document);
-      Ruta.apply(cas, script);
-    } catch (Exception e) {
-      e.printStackTrace();
-    }
+    CAS cas = RutaTestUtils.getCAS(document);
+    Ruta.apply(cas, script);
 
     // UIMA-4715: should be
     // RutaTestUtils.assertAnnotationsEquals(cas, 1, 3, "Some test.", "Some test.", "Some test.");
@@ -99,15 +91,15 @@
 
     cas.release();
   }
-  
+
   @Test
-  public void testMatchAtDocumentBegin() throws Exception{
+  public void testMatchAtDocumentBegin() throws Exception {
     String document = "First test. Some test. Last test.";
     String script = "# CW{-> T1};";
     script += "CW{-> T2};";
     script += "T1 # (T2 #){->T3};";
     script += "T3->{# CW{->T4};};";
-    CAS cas =  RutaTestUtils.getCAS(document);
+    CAS cas = RutaTestUtils.getCAS(document);
     Ruta.apply(cas, script);
     RutaTestUtils.assertAnnotationsEquals(cas, 1, 1, "First");
     RutaTestUtils.assertAnnotationsEquals(cas, 2, 3, "First", "Some", "Last");
@@ -116,4 +108,67 @@
     cas.release();
   }
 
+  @Test
+  public void testInReverseForEachWithAnalysisEngineAndFiltering() throws Exception {
+    String document = "a b (A) a . c (1 C) a . d (a C) .";
+    String script = "UIMAFIT org.apache.uima.ruta.engine.UimaFitAnalysisEngineWithManditoryParameter (type, "
+            + RutaTestUtils.TYPE + "10);";
+    script += "EXEC(UimaFitAnalysisEngineWithManditoryParameter);";
+    script += "ADDFILTERTYPE(PERIOD);";
+    script += "FOREACH(cw,false) CW {}{\n";
+    script += "(SPECIAL==\"(\" # cw SPECIAL.ct==\"]\"){->T1};";
+    script += "(SPECIAL==\"(\" # cw SPECIAL.ct==\")\"){->T2};";
+    script += "}";
+
+    CAS cas = RutaTestUtils.getCAS(document);
+    Ruta.apply(cas, script);
+
+    RutaTestUtils.assertAnnotationsEquals(cas, 1, 0);
+    RutaTestUtils.assertAnnotationsEquals(cas, 2, 3, "(A)", "(1 C)", "(a C)");
+    cas.release();
+  }
+
+  @Test
+  public void testMultipleAndQuantifier() throws Exception {
+    String document = "1 A ...... 1 X 2 B ...... 2";
+    String script = "";
+    script += "PM{->T1};\n";
+    // optional elements are not optional after wildcard UIMA-5484
+    script += "NUM #{-> T2} T1* NUM;\n";
+    script += "PM{->T1};\n";
+    script += "NUM #{-> T3} T1* NUM;\n";
+
+    CAS cas = RutaTestUtils.getCAS(document);
+    Ruta.apply(cas, script);
+
+    RutaTestUtils.assertAnnotationsEquals(cas, 2, 3, "A", "X 2 B", "B");
+    Assert.assertEquals(1008,
+            cas.getAnnotationIndex(cas.getTypeSystem().getType(RutaTestUtils.TYPE + "3")).size());
+    cas.release();
+  }
+
+  @Test
+  public void testCheckInIterator() throws Exception {
+    String document = "1 a b c 2 d e f 3";
+    String script = "";
+    script += "NUM #{-> T1} NUM;\n";
+    script += "SW{-> Struct};\n";
+    script += "T1->{# s2:Struct.a==null{-> s2.a=SW};};\n";
+    script += "T1->{s1:Struct.a!=null # s2:@Struct.a==null{-> s2.a=s1.a};};\n";
+    script += "s:Struct{REGEXP(s.a.ct, \"[ad]\") -> T2};\n";
+
+    Map<String, String> complexType = new HashMap<>();
+    complexType.put("Struct", CAS.TYPE_NAME_ANNOTATION);
+    Map<String, List<TestFeature>> featureMap = new HashMap<>();
+    List<TestFeature> list = new ArrayList<>();
+    list.add(new TestFeature("a", "", CAS.TYPE_NAME_ANNOTATION));
+    featureMap.put("Struct", list);
+    CAS cas = RutaTestUtils.getCAS(document, complexType, featureMap);
+    Ruta.apply(cas, script);
+
+    RutaTestUtils.assertAnnotationsEquals(cas, 1, 2, "a b c", "d e f");
+    RutaTestUtils.assertAnnotationsEquals(cas, 2, 6, "a", "b", "c", "d", "e", "f");
+    cas.release();
+  }
+
 }
diff --git a/ruta-core/src/test/java/org/apache/uima/ruta/rule/quantifier/MinMaxQuantifierTest.java b/ruta-core/src/test/java/org/apache/uima/ruta/rule/quantifier/MinMaxQuantifierTest.java
new file mode 100644
index 0000000..425ee0e
--- /dev/null
+++ b/ruta-core/src/test/java/org/apache/uima/ruta/rule/quantifier/MinMaxQuantifierTest.java
@@ -0,0 +1,42 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.uima.ruta.rule.quantifier;
+
+import org.apache.uima.cas.CAS;
+import org.apache.uima.ruta.engine.Ruta;
+import org.apache.uima.ruta.engine.RutaTestUtils;
+import org.junit.Test;
+
+public class MinMaxQuantifierTest {
+
+  @Test
+  public void test() throws Exception {
+    String document = "A, A. B, B, B";
+    String script = "";
+    script += "(CW{-PARTOF(TruePositive)} (COMMA CW)[2,5]){-> TruePositive};\n";
+    script += "TruePositive{-> T1};\n";
+
+    CAS cas = RutaTestUtils.getCAS(document);
+    Ruta.apply(cas, script);
+
+    RutaTestUtils.assertAnnotationsEquals(cas, 1, 1, "B, B, B");
+    cas.release();
+  }
+}
diff --git a/ruta-core/src/test/java/org/apache/uima/ruta/verbalizer/RutaVerbalizerTest.java b/ruta-core/src/test/java/org/apache/uima/ruta/verbalizer/RutaVerbalizerTest.java
new file mode 100644
index 0000000..69b3b07
--- /dev/null
+++ b/ruta-core/src/test/java/org/apache/uima/ruta/verbalizer/RutaVerbalizerTest.java
@@ -0,0 +1,56 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.uima.ruta.verbalizer;
+
+import java.util.List;
+
+import org.apache.commons.lang3.reflect.FieldUtils;
+import org.apache.uima.analysis_engine.AnalysisEngine;
+import org.apache.uima.fit.factory.AnalysisEngineFactory;
+import org.apache.uima.ruta.RutaModule;
+import org.apache.uima.ruta.RutaStatement;
+import org.apache.uima.ruta.block.ForEachBlock;
+import org.apache.uima.ruta.block.RutaScriptBlock;
+import org.apache.uima.ruta.engine.RutaEngine;
+import org.apache.uima.ruta.verbalize.RutaVerbalizer;
+import org.junit.Assert;
+import org.junit.Test;
+
+
+public class RutaVerbalizerTest {
+  
+  @Test
+  public void testSimpleScriptVerbalization() throws Exception{
+    
+    AnalysisEngine analysisEngine = AnalysisEngineFactory.createEngine(RutaEngine.class, RutaEngine.PARAM_MAIN_SCRIPT, "org.apache.uima.ruta.Verbalize");
+    RutaEngine rutaEngine = (RutaEngine) FieldUtils.readField(analysisEngine, "mAnalysisComponent", true);
+    RutaModule module = (RutaModule) FieldUtils.readField(rutaEngine, "script", true);
+    RutaVerbalizer verbalizer = new RutaVerbalizer();
+    Assert.assertNull(verbalizer.verbalize(module));
+    Assert.assertEquals("BLOCK(Verbalize) Document;", verbalizer.verbalize(module.getRootBlock()));
+    List<RutaStatement> elements = module.getRootBlock().getElements();
+    Assert.assertEquals("Document{->CALL(Additional)};", verbalizer.verbalize(elements.get(1)));
+    Assert.assertEquals("CW.ct==\"A\"{->TruePositive};", verbalizer.verbalize(elements.get(2)));
+    RutaScriptBlock block = (RutaScriptBlock) elements.get(3);
+    Assert.assertEquals("BLOCK(block) CW;", verbalizer.verbalize(block));
+    ForEachBlock foreach = (ForEachBlock) elements.get(4);
+    Assert.assertEquals("FOREACH(sw) SW;", verbalizer.verbalize(foreach));
+  }
+}
diff --git a/ruta-core/src/test/java/org/apache/uima/ruta/verbalizer/ScriptVerbalizerTest.java b/ruta-core/src/test/java/org/apache/uima/ruta/verbalizer/ScriptVerbalizerTest.java
index 9c1c79a..50f12c7 100644
--- a/ruta-core/src/test/java/org/apache/uima/ruta/verbalizer/ScriptVerbalizerTest.java
+++ b/ruta-core/src/test/java/org/apache/uima/ruta/verbalizer/ScriptVerbalizerTest.java
@@ -40,13 +40,14 @@
   public void testRuleVerbalization() throws Exception{
     JCas jcas = RutaTestUtils.getCAS("Some text.").getJCas();
     
-//    assertRuleVerbalization(jcas, "W{->T1} W{->T2};");
-//    assertRuleVerbalization(jcas, "MARK(T1);", "Document{->MARK(T1)};");
-//    assertRuleVerbalization(jcas, "T1<-{W PERIOD;};");
-//    assertRuleVerbalization(jcas, "T1->{W{->T1} PERIOD;};");
-//    assertRuleVerbalization(jcas, "T1<-{W PERIOD;}->{W{->T1} PERIOD;};");
-//    assertRuleVerbalization(jcas, "W W? W?? W+ W+? W* W*? W[1,2] W[1,2]? #;");
+    assertRuleVerbalization(jcas, "Document{->MARK(T1)};");
+    assertRuleVerbalization(jcas, "W{->T1} W{->T2};");
+    assertRuleVerbalization(jcas, "T1<-{W PERIOD;};");
+    assertRuleVerbalization(jcas, "T1->{W{->T1} PERIOD;};");
+    assertRuleVerbalization(jcas, "T1<-{W PERIOD;}->{W{->T1} PERIOD;};");
+    assertRuleVerbalization(jcas, "W W? W?? W+ W+? W* W*? W[1,2] W[1,2]? #;");
     assertRuleVerbalization(jcas, "Document{CONTAINS(T1)->T2};");
+    assertRuleVerbalization(jcas, "Document{->ADDFILTERTYPE(CW)};");
     
     jcas.release();
   }
@@ -65,4 +66,6 @@
     Assert.assertEquals(expected, ruleApply.getElement());
     Ruta.removeDebugInformation(jcas);
   }
+  
+  
 }
diff --git a/ruta-core/src/test/resources/org/apache/uima/ruta/Verbalize.ruta b/ruta-core/src/test/resources/org/apache/uima/ruta/Verbalize.ruta
new file mode 100644
index 0000000..3c010ee
--- /dev/null
+++ b/ruta-core/src/test/resources/org/apache/uima/ruta/Verbalize.ruta
@@ -0,0 +1,12 @@
+PACKAGE org.apache.uima.ruta;
+SCRIPT org.apache.uima.ruta.Additional;
+CALL(Additional);
+CW.ct=="A"{-> TruePositive};
+
+BLOCK(block) CW{}{
+    SW;
+}
+
+FOREACH(sw) SW{}{
+    sw.ct=="a";
+}
diff --git a/ruta-core/src/test/resources/org/apache/uima/ruta/engine/RecursiveConfigure.ruta b/ruta-core/src/test/resources/org/apache/uima/ruta/engine/RecursiveConfigure.ruta
new file mode 100644
index 0000000..44df1bc
--- /dev/null
+++ b/ruta-core/src/test/resources/org/apache/uima/ruta/engine/RecursiveConfigure.ruta
@@ -0,0 +1,3 @@
+ENGINE org.apache.uima.ruta.engine.RecursiveConfigureEngine;
+CONFIGURE(RecursiveConfigureEngine, "statistics" = true);
+EXEC(RecursiveConfigureEngine);
\ No newline at end of file
diff --git a/ruta-core/src/test/resources/org/apache/uima/ruta/engine/RecursiveConfigureEngine.xml b/ruta-core/src/test/resources/org/apache/uima/ruta/engine/RecursiveConfigureEngine.xml
new file mode 100644
index 0000000..d77f483
--- /dev/null
+++ b/ruta-core/src/test/resources/org/apache/uima/ruta/engine/RecursiveConfigureEngine.xml
@@ -0,0 +1,318 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one
+  or more contributor license agreements.  See the NOTICE file
+  distributed with this work for additional information
+  regarding copyright ownership.  The ASF licenses this file
+  to you under the Apache License, Version 2.0 (the
+  "License"); you may not use this file except in compliance
+  with the License.  You may obtain a copy of the License at
+  
+  http://www.apache.org/licenses/LICENSE-2.0
+  
+  Unless required by applicable law or agreed to in writing,
+  software distributed under the License is distributed on an
+  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  KIND, either express or implied.  See the License for the
+  specific language governing permissions and limitations
+  under the License.
+-->
+
+<analysisEngineDescription xmlns="http://uima.apache.org/resourceSpecifier">
+    <frameworkImplementation>org.apache.uima.java</frameworkImplementation>
+    <primitive>true</primitive>
+    <annotatorImplementationName>org.apache.uima.ruta.engine.RutaEngine</annotatorImplementationName>
+    <analysisEngineMetaData>
+        <name>BasicEngine</name>
+        <description/>
+        <version>1.0</version>
+        <vendor/>
+        <configurationParameters searchStrategy="language_fallback">
+            <configurationParameter>
+                <name>seeders</name>
+                <type>String</type>
+                <multiValued>true</multiValued>
+                <mandatory>false</mandatory>
+            </configurationParameter>
+            <configurationParameter>
+                <name>debug</name>
+                <type>Boolean</type>
+                <multiValued>false</multiValued>
+                <mandatory>false</mandatory>
+            </configurationParameter>
+            <configurationParameter>
+                <name>additionalScripts</name>
+                <type>String</type>
+                <multiValued>true</multiValued>
+                <mandatory>false</mandatory>
+            </configurationParameter>
+            <configurationParameter>
+                <name>profile</name>
+                <type>Boolean</type>
+                <multiValued>false</multiValued>
+                <mandatory>false</mandatory>
+            </configurationParameter>
+            <configurationParameter>
+                <name>debugWithMatches</name>
+                <type>Boolean</type>
+                <multiValued>false</multiValued>
+                <mandatory>false</mandatory>
+            </configurationParameter>
+            <configurationParameter>
+                <name>statistics</name>
+                <type>Boolean</type>
+                <multiValued>false</multiValued>
+                <mandatory>false</mandatory>
+            </configurationParameter>
+            <configurationParameter>
+                <name>additionalEngines</name>
+                <type>String</type>
+                <multiValued>true</multiValued>
+                <mandatory>false</mandatory>
+            </configurationParameter>
+            <configurationParameter>
+                <name>additionalExtensions</name>
+                <type>String</type>
+                <multiValued>true</multiValued>
+                <mandatory>false</mandatory>
+            </configurationParameter>
+            <configurationParameter>
+                <name>debugOnlyFor</name>
+                <type>String</type>
+                <multiValued>true</multiValued>
+                <mandatory>false</mandatory>
+            </configurationParameter>
+            <configurationParameter>
+                <name>scriptEncoding</name>
+                <type>String</type>
+                <multiValued>false</multiValued>
+                <mandatory>false</mandatory>
+            </configurationParameter>
+            <configurationParameter>
+                <name>additionalEngineLoaders</name>
+                <type>String</type>
+                <multiValued>true</multiValued>
+                <mandatory>false</mandatory>
+            </configurationParameter>
+            <configurationParameter>
+                <name>resourcePaths</name>
+                <type>String</type>
+                <multiValued>true</multiValued>
+                <mandatory>false</mandatory>
+            </configurationParameter>
+            <configurationParameter>
+                <name>defaultFilteredTypes</name>
+                <type>String</type>
+                <multiValued>true</multiValued>
+                <mandatory>false</mandatory>
+            </configurationParameter>
+            <configurationParameter>
+                <name>mainScript</name>
+                <type>String</type>
+                <multiValued>false</multiValued>
+                <mandatory>false</mandatory>
+            </configurationParameter>
+            <configurationParameter>
+                <name>scriptPaths</name>
+                <type>String</type>
+                <multiValued>true</multiValued>
+                <mandatory>false</mandatory>
+            </configurationParameter>
+            <configurationParameter>
+                <name>descriptorPaths</name>
+                <type>String</type>
+                <multiValued>true</multiValued>
+                <mandatory>false</mandatory>
+            </configurationParameter>
+            <configurationParameter>
+                <name>removeBasics</name>
+                <type>Boolean</type>
+                <multiValued>false</multiValued>
+                <mandatory>false</mandatory>
+            </configurationParameter>
+            <configurationParameter>
+                <name>dynamicAnchoring</name>
+                <description>Activates dynamic anchoring (possible speed up).</description>
+                <type>Boolean</type>
+                <multiValued>false</multiValued>
+                <mandatory>false</mandatory>
+            </configurationParameter>
+            <configurationParameter>
+                <name>greedyRuleElement</name>
+                <description>Activates greedy anchoring for rule elements.</description>
+                <type>Boolean</type>
+                <multiValued>false</multiValued>
+                <mandatory>false</mandatory>
+            </configurationParameter>
+            <configurationParameter>
+                <name>greedyRule</name>
+                <description>Activates greedy anchoring for complete rules.</description>
+                <type>Boolean</type>
+                <multiValued>false</multiValued>
+                <mandatory>false</mandatory>
+            </configurationParameter>
+            <configurationParameter>
+                <name>lowMemoryProfile</name>
+                <type>Boolean</type>
+                <multiValued>false</multiValued>
+                <mandatory>false</mandatory>
+            </configurationParameter>
+            <configurationParameter>
+                <name>createdBy</name>
+                <type>Boolean</type>
+                <multiValued>false</multiValued>
+                <mandatory>false</mandatory>
+            </configurationParameter>
+            <configurationParameter>
+                <name>simpleGreedyForComposed</name>
+                <type>Boolean</type>
+                <multiValued>false</multiValued>
+                <mandatory>false</mandatory>
+            </configurationParameter>
+            <configurationParameter>
+                <name>additionalUimafitEngines</name>
+                <type>String</type>
+                <multiValued>true</multiValued>
+                <mandatory>false</mandatory>
+            </configurationParameter>
+            <configurationParameter>
+                <name>strictImports</name>
+                <type>Boolean</type>
+                <multiValued>false</multiValued>
+                <mandatory>false</mandatory>
+            </configurationParameter>
+        </configurationParameters>
+        <configurationParameterSettings>
+            <nameValuePair>
+                <name>debug</name>
+                <value>
+                    <boolean>false</boolean>
+                </value>
+            </nameValuePair>
+            <nameValuePair>
+                <name>profile</name>
+                <value>
+                    <boolean>false</boolean>
+                </value>
+            </nameValuePair>
+            <nameValuePair>
+                <name>debugWithMatches</name>
+                <value>
+                    <boolean>true</boolean>
+                </value>
+            </nameValuePair>
+            <nameValuePair>
+                <name>defaultFilteredTypes</name>
+                <value>
+                    <array>
+                        <string>org.apache.uima.ruta.type.SPACE</string>
+                        <string>org.apache.uima.ruta.type.BREAK</string>
+                        <string>org.apache.uima.ruta.type.MARKUP</string>
+                    </array>
+                </value>
+            </nameValuePair>
+            <nameValuePair>
+                <name>removeBasics</name>
+                <value>
+                    <boolean>false</boolean>
+                </value>
+            </nameValuePair>
+            <nameValuePair>
+                <name>seeders</name>
+                <value>
+                    <array>
+                        <string>org.apache.uima.ruta.seed.DefaultSeeder</string>
+                    </array>
+                </value>
+            </nameValuePair>
+            <nameValuePair>
+                <name>createdBy</name>
+                <value>
+                    <boolean>false</boolean>
+                </value>
+            </nameValuePair>
+            <nameValuePair>
+                <name>mainScript</name>
+                <value>
+                    <string>org.apache.uima.ruta.engine.RecursiveConfigure</string>
+                </value>
+            </nameValuePair>
+            <nameValuePair>
+                <name>scriptPaths</name>
+                <value>
+                    <array>
+                        <string></string>
+                    </array>
+                </value>
+            </nameValuePair>
+            <nameValuePair>
+                <name>descriptorPaths</name>
+                <value>
+                    <array>
+                        <string></string>
+                    </array>
+                </value>
+            </nameValuePair>
+            <nameValuePair>
+                <name>resourcePaths</name>
+                <value>
+                    <array>
+                        <string></string>
+                    </array>
+                </value>
+            </nameValuePair>
+            <nameValuePair>
+                <name>additionalScripts</name>
+                <value>
+                    <array/>
+                </value>
+            </nameValuePair>
+            <nameValuePair>
+                <name>additionalEngines</name>
+                <value>
+                    <array/>
+                </value>
+            </nameValuePair>
+            <nameValuePair>
+                <name>additionalUimafitEngines</name>
+                <value>
+                    <array/>
+                </value>
+            </nameValuePair>
+            <nameValuePair>
+                <name>additionalEngineLoaders</name>
+                <value>
+                    <array/>
+                </value>
+            </nameValuePair>
+        </configurationParameterSettings>
+        <typeSystemDescription>
+            <name>CWTypeSystem</name>
+            <imports>
+                <import name="org.apache.uima.ruta.engine.BasicTypeSystem"/>
+            </imports>
+        </typeSystemDescription>
+        <typePriorities>
+            <priorityList>
+                <type>org.apache.uima.ruta.type.RutaFrame</type>
+                <type>uima.tcas.Annotation</type>
+                <type>org.apache.uima.ruta.type.RutaBasic</type>
+            </priorityList>
+        </typePriorities>
+        <fsIndexCollection/>
+        <capabilities>
+            <capability>
+                <inputs/>
+                <outputs/>
+                <languagesSupported/>
+            </capability>
+        </capabilities>
+        <operationalProperties>
+            <modifiesCas>true</modifiesCas>
+            <multipleDeploymentAllowed>true</multipleDeploymentAllowed>
+            <outputsNewCASes>true</outputsNewCASes>
+        </operationalProperties>
+    </analysisEngineMetaData>
+    <resourceManagerConfiguration/>
+</analysisEngineDescription>
diff --git a/ruta-core/src/test/resources/org/apache/uima/ruta/engine/script1.ruta b/ruta-core/src/test/resources/org/apache/uima/ruta/engine/script1.ruta
new file mode 100644
index 0000000..6f3e28a
--- /dev/null
+++ b/ruta-core/src/test/resources/org/apache/uima/ruta/engine/script1.ruta
@@ -0,0 +1,3 @@
+SCRIPT script2;
+
+Document{->CALL(script2)};
diff --git a/ruta-core/src/test/resources/org/apache/uima/ruta/engine/script1TypeSystem.xml b/ruta-core/src/test/resources/org/apache/uima/ruta/engine/script1TypeSystem.xml
new file mode 100644
index 0000000..b8ee2d2
--- /dev/null
+++ b/ruta-core/src/test/resources/org/apache/uima/ruta/engine/script1TypeSystem.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one
+  or more contributor license agreements.  See the NOTICE file
+  distributed with this work for additional information
+  regarding copyright ownership.  The ASF licenses this file
+  to you under the Apache License, Version 2.0 (the
+  "License"); you may not use this file except in compliance
+  with the License.  You may obtain a copy of the License at
+  
+  http://www.apache.org/licenses/LICENSE-2.0
+  
+  Unless required by applicable law or agreed to in writing,
+  software distributed under the License is distributed on an
+  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  KIND, either express or implied.  See the License for the
+  specific language governing permissions and limitations
+  under the License.
+-->
+
+<typeSystemDescription xmlns="http://uima.apache.org/resourceSpecifier">
+    <name>script1TypeSystem</name>
+    <imports>
+        <import name="org.apache.uima.ruta.engine.BasicTypeSystem"/>
+        <import location="script2TypeSystem.xml"/>
+    </imports>
+    <types>
+    </types>
+</typeSystemDescription>
diff --git a/ruta-core/src/test/resources/org/apache/uima/ruta/engine/script2.ruta b/ruta-core/src/test/resources/org/apache/uima/ruta/engine/script2.ruta
new file mode 100644
index 0000000..c46c705
--- /dev/null
+++ b/ruta-core/src/test/resources/org/apache/uima/ruta/engine/script2.ruta
@@ -0,0 +1,3 @@
+SCRIPT script3;
+
+Document{->CALL(script3)};
diff --git a/ruta-core/src/test/resources/org/apache/uima/ruta/engine/script2TypeSystem.xml b/ruta-core/src/test/resources/org/apache/uima/ruta/engine/script2TypeSystem.xml
new file mode 100644
index 0000000..7a171c8
--- /dev/null
+++ b/ruta-core/src/test/resources/org/apache/uima/ruta/engine/script2TypeSystem.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one
+  or more contributor license agreements.  See the NOTICE file
+  distributed with this work for additional information
+  regarding copyright ownership.  The ASF licenses this file
+  to you under the Apache License, Version 2.0 (the
+  "License"); you may not use this file except in compliance
+  with the License.  You may obtain a copy of the License at
+  
+  http://www.apache.org/licenses/LICENSE-2.0
+  
+  Unless required by applicable law or agreed to in writing,
+  software distributed under the License is distributed on an
+  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  KIND, either express or implied.  See the License for the
+  specific language governing permissions and limitations
+  under the License.
+-->
+
+<typeSystemDescription xmlns="http://uima.apache.org/resourceSpecifier">
+    <name>script2TypeSystem</name>
+    <imports>
+        <import name="org.apache.uima.ruta.engine.BasicTypeSystem"/>
+        <import location="script3TypeSystem.xml"/>
+    </imports>
+    <types>
+    </types>
+</typeSystemDescription>
diff --git a/ruta-core/src/test/resources/org/apache/uima/ruta/engine/script3.ruta b/ruta-core/src/test/resources/org/apache/uima/ruta/engine/script3.ruta
new file mode 100644
index 0000000..e6372e1
--- /dev/null
+++ b/ruta-core/src/test/resources/org/apache/uima/ruta/engine/script3.ruta
@@ -0,0 +1,5 @@
+DECLARE Value(STRING value);
+
+STRING value; // or = "dog";
+
+W{-> CREATE(Value, "value" = value), ASSIGN(value, W.ct)};
diff --git a/ruta-core/src/test/resources/org/apache/uima/ruta/engine/script3TypeSystem.xml b/ruta-core/src/test/resources/org/apache/uima/ruta/engine/script3TypeSystem.xml
new file mode 100644
index 0000000..44efd8d
--- /dev/null
+++ b/ruta-core/src/test/resources/org/apache/uima/ruta/engine/script3TypeSystem.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one
+  or more contributor license agreements.  See the NOTICE file
+  distributed with this work for additional information
+  regarding copyright ownership.  The ASF licenses this file
+  to you under the Apache License, Version 2.0 (the
+  "License"); you may not use this file except in compliance
+  with the License.  You may obtain a copy of the License at
+  
+  http://www.apache.org/licenses/LICENSE-2.0
+  
+  Unless required by applicable law or agreed to in writing,
+  software distributed under the License is distributed on an
+  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  KIND, either express or implied.  See the License for the
+  specific language governing permissions and limitations
+  under the License.
+-->
+
+<typeSystemDescription xmlns="http://uima.apache.org/resourceSpecifier">
+    <name>script2TypeSystem</name>
+    <imports>
+        <import name="org.apache.uima.ruta.engine.BasicTypeSystem"/>
+    </imports>
+    <types>
+       <typeDescription>
+            <name>script3.Value</name>
+            <description/>
+            <supertypeName>uima.tcas.Annotation</supertypeName>
+            <features>
+              <featureDescription>
+                <name>value</name>
+                <description/>
+                <rangeTypeName>uima.cas.String</rangeTypeName>
+              </featureDescription>
+            </features>
+        </typeDescription>
+    </types>
+</typeSystemDescription>
diff --git a/ruta-docbook/src/docbook/tools.ruta.language.xml b/ruta-docbook/src/docbook/tools.ruta.language.xml
index 63df653..60aff38 100644
--- a/ruta-docbook/src/docbook/tools.ruta.language.xml
+++ b/ruta-docbook/src/docbook/tools.ruta.language.xml
@@ -135,8 +135,64 @@
     </para>
 
   </section>
+
+  <section id="ugr.tools.ruta.language.wildcard">
+    <title>Wildcard #</title>
+    <para>
+      The wildcard <code>#</code> is a special matching condition of a rule element, 
+      which does not match itself but uses the next rule element to determine its match.
+      It's behavior is similar to a generic rule element with a reluctant, not restricted quantifier like
+      <code>ANY+?</code> but it much more efficient since no additional annotations have to be matched.
+      The functionality of the wildcard is illustrated with following examples:
+      
+      <programlisting><![CDATA[PERIOD #{-> Sentence} PERIOD;]]></programlisting>
+      
+      In this example, everything in beteen two periods is annotated with an annotation of the type
+      <code>Sentence</code>. This rule is much more efficient than a rule like 
+      <code>PERIOD ANY+{-PARTOF(PERIOD)} PERIOD;</code> since it only navigated in the index of PERIOD annotations 
+      and does not match on all tokens.
+      
+      The wildcard is a normal matching condition and can be used as any other matching condition. If the sentence 
+      should include the period, the rule would look like:
+      
+      <programlisting><![CDATA[PERIOD (# PERIOD){-> Sentence};]]></programlisting>
+      
+      This rule creates only annotations after a period. If the wildcard is used as an anchor of the rule, 
+      e.g., is the first rule element and no manual anchor is specified, then it starts to match at the beginning 
+      of the doucment or current window.
+      
+      <programlisting><![CDATA[(# PERIOD){-> Sentence};]]></programlisting>
+      
+      This rule creates a Sentence annotation starting at the begin of the document ending with the first period.
+      If the rule lements are swicthed, the result is quite different because of the starting anchor of the rule:
+      
+      <programlisting><![CDATA[(PERIOD #){-> Sentence};]]></programlisting>
+      
+      Here, one annotation of the type Sentence is create for each PERIOD annotation starting with the period and 
+      ending at the end of the document.
+      
+      Currently, optional rule elements after wildcards are not optional.
+    </para>
+  </section>
   
-  
+  <section id="ugr.tools.ruta.language.labels">
+    <title>Label expressions</title>
+    <para>
+      Rule elements can be extended with labels, which introduce a new local variable storing one or 
+      multiple annotations - the annotations matched by the matching condition of the rule element. 
+      The name of the variable is the short identifier before the colon in front of the matching condition, e.g., 
+      in <code>sw:SW</code>, <code>SW</code> is the matching condition and <code>sw</code> is the name of the local variable.
+      The variable will be assigned when the rule element tries to match (also when it fails afterall) 
+      and can be utilzed in all other language elements afterwards.
+      The functionality of the label expressions is illustrated with following examples:
+      
+      <programlisting><![CDATA[sw1:SW sw2:SW{sw1.end=sw2.begin};]]></programlisting>
+      
+      This rule matches on two consecutive small-written words, but matches only if there is no space inbetween them.
+      
+      Label expression can also be used across <xref linkend='ugr.tools.ruta.language.inlined' />.
+    </para>
+  </section>
   
   <section id="ugr.tools.ruta.language.blocks">
     <title>Blocks</title>
@@ -1104,12 +1160,7 @@
       <section>
         <title>contains(IStringExpression expr,IStringExpression contains)
         </title>
-        <programlisting><![CDATA[STRING s;
-BOOLEAN a ;
-BLOCK(forEACH) W{}{
-    W{->MATCHEDTEXT(s), ASSIGN(a,contains(s,"er"))};
-    W{a ->Test};
-}]]></programlisting>
+        <programlisting><![CDATA[w:W{contains(w.ct, "er")-> Test};]]></programlisting>
         <para>
           If you want to find all words that contain a given charactersequence.
           Assume again you
@@ -1126,14 +1177,9 @@
       <section>
         <title>endsWith(IStringExpression expr,IStringExpression expr)
         </title>
-        <programlisting><![CDATA[STRING s;
-BOOLEAN a;
-BLOCK(forEACH) W{}{
-    W{->MATCHEDTEXT(s), ASSIGN(a,endsWith(s,"str."))};
-    W{a ->Test};
-}]]></programlisting>
+        <programlisting><![CDATA[w:W{endsWith(w.ct, "str")-> Test};]]></programlisting>
         <para>
-          Assume you found the suffix "str." as a strong indicator whether a given
+          Assume you found the suffix "str" as a strong indicator whether a given
           token
           represents
           location (a street) by using this function you can now easily identify all
@@ -1146,18 +1192,12 @@
       <section>
         <title>startsWith(IStringExpression expr,IStringExpression expr)
         </title>
-        <programlisting><![CDATA[STRING s;
-BOOLEAN a ;
-BLOCK(forEACH) W{}{
-    W{->MATCHEDTEXT(s), ASSIGN(a,startsWith(s,"sprech"))};
-    W{a ->Test};
-}]]></programlisting>
+        <programlisting><![CDATA[w:W{startsWith(w.ct, "sprech")-> Test};]]></programlisting>
         <para>
           Given a stem of a word you want to mark every instance that was possibly derived from that stem.
           If you decide to use that function you can detect all those words in 1 line and in a next step
           mark all
           of them as an Annotationtype of choice.
-
         </para>
       </section>
 
diff --git a/ruta-maven-archetype/src/main/resources/archetype-resources/pom.xml b/ruta-maven-archetype/src/main/resources/archetype-resources/pom.xml
index 59e0f35..0f76fb6 100644
--- a/ruta-maven-archetype/src/main/resources/archetype-resources/pom.xml
+++ b/ruta-maven-archetype/src/main/resources/archetype-resources/pom.xml
@@ -36,7 +36,7 @@
 
   <properties>
     <junit-version>4.11</junit-version>
-    <uima-version>2.8.1</uima-version>
+    <uima-version>2.10.0</uima-version>
     <ruta-version>${archetypeVersion}</ruta-version>
   </properties>
 
