diff --git a/CHANGELOG.md b/CHANGELOG.md
index baafe16f05c4c5830de708457ef6bdcd6fefd871..69bee416733fb2a5d668b1a0b749d91c5ebfe3ea 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -36,6 +36,75 @@ Features
 Bug Fixes
 ^^^^^^^^^
 
+Version 18.4.4
+--------------
+
+Date: 28.04.18
+
+Bug Fixes
+^^^^^^^^^
+
+* Fix broken ext_emconf.php
+
+Version 18.4.3
+--------------
+
+Date: 28.04.18
+
+Bug Fixes
+^^^^^^^^^
+
+* Version Number ...04... not supported by TE. Changing naming scheme to omit leading zero.
+
+Version 18.04.1
+---------------
+
+Date: 28.04.2018
+
+Bug Fixes
+^^^^^^^^^
+
+* config: broken dbIndexQfq, dbIndexData
+
+Version 18.04.0
+---------------
+
+Date: 26.04.2018
+
+Notes
+^^^^^
+
+* QFQ marked as 'stable'
+* New version numbering: Year.Month.Index
+* Manual.rst:
+
+  * AutoCron documentation enhanced.
+  * Replace '{{form:S}}' against '{{form:SE}}'.
+  * Check list for 'new installations'.
+  * Description for config variables enhanced.
+  * Details 'how record locking' is done.
+  * Details: extraButtonInfo
+  * Replace config.qfq.ini on most places with 'configuration'
+
+* Path of 'sql.log' / 'mail.log' are now relative to <site path> (not <ext path> as before).
+
+Features
+^^^^^^^^
+
+* formEditor.sql: update table cron.
+* AutoCron.php: allow https connections with invalid certificate (e.g. 'localhost' is not listed as a valid hostname).
+* ext_conf_template.txt: Extension manager configuration setup.
+
+Bug Fixes
+^^^^^^^^^
+
+* AutoCron:
+
+  * Update form 'cron' to load/save records in DB_INDEX_QFQ
+  * Fix problem with array in checkForOldJobs().
+  * Implement check that re-trigger asynchronous cron jobs are handled correctly.
+
+
 
 Version 0.25.15
 ---------------
@@ -334,8 +403,8 @@ Bug Fixes
 
 * #4865 / Pill Dynamic Updates Show / Hide
 * #5031 / Missing details in DbException: New definition of SYSTEM_SHOW_DEBUG_INFO: even after config.qfq.ini is parsed
-   and SIP Infos has been read - if there is no BE User logged in, the value stays on 'auto' (earlier it has been replaced
-   to 'no'). Staying on 'auto' keeps the information that replacing is still open and not replaced means 'no'-BE User logged in.
+  and SIP Infos has been read - if there is no BE User logged in, the value stays on 'auto' (earlier it has been replaced
+  to 'no'). Staying on 'auto' keeps the information that replacing is still open and not replaced means 'no'-BE User logged in.
 * #5016 / Loose checkbox value on save - Dirty workaround - better solution necessary.
 * #5017 / STORE_RECORD used in FormElement and via '#!report' - save & restore STORE_RECORD.
 * #5004 / FormElement with state 'ReadOnly' will be saved with empty value - existing values will be overwritten - fixed.
@@ -951,7 +1020,7 @@ Features
 * New security option `escapeTypeDefault`: will be defined 1) sytem wide in config.qfq.ini, or 2) more specific per
   Form or 3) individually per variable. The later has priority.
 * #3544 / Form: view current form - It's now possible to direct view a form, which is currently loaded/edited in the
-   FormEditor: Button 'eye' near left of button 'save'.
+  FormEditor: Button 'eye' near left of button 'save'.
 * #3552 / typeAheadLdapSearchPerToken - webpass kann nicht gleichzeitig nach Vornamen und Nachnamen suchen. Added option
   typeAheadLdapSearchPerToken to split search value in token and OR-combine every search with the individual tokens.
 * Download latest QFQ builds and releases: https://w3.math.uzh.ch/qfq/.
@@ -1043,7 +1112,7 @@ Bug Fixes
 
 * TypeAhead.js: Handle <ENTER> key properly.
 * #3462 / FormElement.parameter: requiredList not ok for non numeric content. STORE_FORM had been called without 'sanatize class'.
-   Therefore, all non numeric values has been sanatized by default. New: SANATIZE_ALLOW_ALL.
+  Therefore, all non numeric values has been sanatized by default. New: SANATIZE_ALLOW_ALL.
 * Corrected error message to use 'itemList' instead of 'itemValues'. Renamed constant too.
 * #2542 / FormElement-Typ 'note' funktioniert nicht mit dynamic update. 'Label' and 'note' are fixed - 'value' is still not updated, open.
 
@@ -1084,8 +1153,8 @@ Bug Fixes
  * #3419 / typeAheadSql: Array with only one column or non standard columnnames are not handeld properbly.
    Detection of missing LIMIT implemented.
  * #3425 / Form.parameter, FormElement.parameter: comment handling, trailing & leading spaces
-    Manual.rst: commented handling of 'comment character' and 'escaping of leading/trailing spaces'
-    Support.php: new funtion handleEscapeSpaceComment().
+   Manual.rst: commented handling of 'comment character' and 'escaping of leading/trailing spaces'
+   Support.php: new funtion handleEscapeSpaceComment().
  * Evaluate.php: parse all F|FE.parameter via handleEscapeSpaceComment(). A leading '#' or ' ' might be escaped by '\'.
  * Saving 'extra' FE in STORE_SIP has been done with inappropiate FE_NAME. Correct is the pure FE_NAME, without any
    extension like recordId. Unessary and broken decoding removed.
diff --git a/Makefile b/Makefile
index 55c7d82f8a9b3280f935c06580a9cb1c4b73a882..9e5c4b876e28c6de75c97d6a4b9fe8d43fb3b871 100644
--- a/Makefile
+++ b/Makefile
@@ -11,7 +11,7 @@ RELEASE_DATE = $(shell date '+%Y%m%d%H%M')
 GIT_REVISION_SHORT = $(shell git rev-parse --short HEAD || true)
 GIT_REVISION_LONG = $(shell git rev-parse HEAD || true)
 
-EXTENSION_CONTENT = Classes Configuration Documentation qfq Resources ext_emconf.php ext_localconf.php ext_tables.php ext_icon.png config.qfq.example.ini RELEASE.txt
+EXTENSION_CONTENT = Classes Configuration Documentation qfq Resources ext_emconf.php ext_localconf.php ext_tables.php ext_icon.png ext_conf_template.txt config.qfq.example.ini RELEASE.txt
 
 DISTDIR=dist
 
diff --git a/doc/NewVersion.md b/doc/NewVersion.md
index 381ea7cd916d763e0336866c76f9ef3fdb13cf9a..f467e14aef1b04f2d7d16fd1320f4a38f4d53414 100644
--- a/doc/NewVersion.md
+++ b/doc/NewVersion.md
@@ -47,8 +47,8 @@ Neue Versionsnummer
 
 6) **New Tag**: 
 
-   git tag v0.25.15a
-   git push -u origin v0.25.15a
+   git tag v18.4.4
+   git push -u origin v18.4.4
 
 7) PhpStorm: **Sync** all files to VM qfq.
 
@@ -58,10 +58,8 @@ Update Doku auf docs.typo3.org
 
 https://docs.typo3.org/typo3cms/drafts/github/T3DocumentationStarter/Public-Info-053/
 
-1) Copy - Im `qfq` Projektverzeichnis: make update-qfq-doc
-2) Commit - In `qfq-doc` Projektverzeichnis wechseln und auf github einchecken:
+1) Copy 'qfq' doc to github project 'qfq-doc'. Commit changes. Push changes to github::
+
+    make update-qfq-doc
 
-   git commit -a
-   git push        # User: math-uzh, PW: <kpit>
 
-**one line**:  make update-qfq-doc; pushd ../qfq-doc; git commit -a; git push; popd
\ No newline at end of file
diff --git a/extension/Documentation/Index.rst b/extension/Documentation/Index.rst
index bc68233068be5138f8a26f9eb7c485d53e7a6efe..5d65d281a8f6e5fccfa5400d363295d626d17be8 100644
--- a/extension/Documentation/Index.rst
+++ b/extension/Documentation/Index.rst
@@ -36,10 +36,10 @@ QFQ Extension
 	      	    		2017
 
 	          	:Author:
-	      				Carsten Rose, Rafael Ostertag
+		      				Carsten Rose, Benjamin Baer
 
 	          	:Email:
-	      		    	carsten.rose@math.uzh.ch, rafael.ostertag@math.uzh.ch
+		      		    	carsten.rose@math.uzh.ch, benjamin.baer@math.uzh.ch
 
 	          	:License:
 	          		This document is published under the Open Publication License
diff --git a/extension/Documentation/Manual.rst b/extension/Documentation/Manual.rst
index c72e79279dcb443ccabd6c9288ee8f469ff8ae2d..5b9f7dfed374c232e11439b21c775388e4853f62 100644
--- a/extension/Documentation/Manual.rst
+++ b/extension/Documentation/Manual.rst
@@ -86,16 +86,13 @@ The program is not included in QFQ and has to be manually installed.
 
   * Best is to install the QT version from the named website above.
   * In case of trouble with wkhtmltopdf, also install 'libxrender1'.
+  * The current version 0.12.4 might have trouble with https connections. Version 0.12.5-dev (github master branch)
+    seems more reliable. Please contact the QFQ authors if you need a compiled Ubuntu version of wkhtmltopdf.
 
-In `config-qfq-ini`_ specify the:
+In `configuration`_ specify the:
 
-* installed `wkhtmltopdf` binary:
-
-  * `WKHTMLTOPDF = /.../wkhtmltopdf`
-
-* the site base URL:
-
-  * `BASE_URL_PRINT = http://example.com/`
+* `cmdWkhtmltopdf=/opt/wkhtmltox/bin/wkhtmltopdf`.
+* `baseUrl=http://www.example.com/`.
 
 
 **Important**: To access FE_GROUP protected pages or content, it's necessary to disable the `[FE][lockIP]` check! `wkhtml`
@@ -108,7 +105,7 @@ Configure via Typo3 Installtool `All configuration > $TYPO3_CONF_VARS['FE']`: ::
 **Warning**: this disables an important anti-'session hijacking' protection. The security level of the whole installation
 will be *lowered*! Again, this is only needed if `wkhtml` needs access to FE_GROUP protected pages & content. As an
 alternative to lower the security level, create a separated page subtree which is only accessible (configured via
-Typosript) from specific IPs **or** if a FE-User is logged in.
+Typoscript) from specific IPs **or** if a FE-User is logged in.
 
 If there are problems with converting/downloading FE_GROUP protected pages, check `SHOW_DEBUG_INFO = download` to debug.
 
@@ -175,12 +172,11 @@ Setup
 
   * If the Extensionmanager stops after importing: check your memory limit in php.ini.
 
-* Enable the online local-documentation_.
-* Copy/rename the file *<Documentroot>/typo3conf/ext/<ext_dir>/config.example.qfq.ini* to
-  *<Documentroot>/typo3conf/config.qfq.ini* and configure the necessary values: `config.qfq.ini`_
-  The configuration file is outside the extension directory to not loose it during updates.
+* Copy/rename the file *<site path>/typo3conf/ext/qfq/config.example.qfq.ini* to *config.qfq.in*.
+  Configure the necessary settings `configuration`_
+  The configuration file is outside the of extension directory, to not loose it during updates.
 * When the QFQ Extension is called the first time on the Typo3 Frontend, the file *<ext_dir>/qfq/sql/formEditor.sql* will
-  played and fills the database with the *Form editor* records. This also happens automatically after each software update of QFQ.
+  played and fills the database with the *Form editor* records. This also happens automatically after each update of QFQ.
 * Configure Typoscript to include Bootstrap, jQuery, QFQ javascript and CSS files.
 
 .. _setup-css-js:
@@ -211,12 +207,12 @@ Setup CSS & JS
 		file05 = typo3conf/ext/qfq/Resources/Public/JavaScript/globalize.js
 		file06 = typo3conf/ext/qfq/Resources/Public/JavaScript/tinymce.min.js
 		file07 = typo3conf/ext/qfq/Resources/Public/JavaScript/EventEmitter.min.js
-      file08 = typo3conf/ext/qfq/Resources/Public/JavaScript/typeahead.bundle.min.js
+        file08 = typo3conf/ext/qfq/Resources/Public/JavaScript/typeahead.bundle.min.js
 		file09 = typo3conf/ext/qfq/Resources/Public/JavaScript/qfq.min.js
 
 		# Only needed in case FormElement 'annotate' is used.
 		file10 = typo3conf/ext/qfq/Resources/Public/JavaScript/fabric.min.js
-      file11 = typo3conf/ext/qfq/Resources/Public/JavaScript/qfq.fabric.min.js
+        file11 = typo3conf/ext/qfq/Resources/Public/JavaScript/qfq.fabric.min.js
 	}
 
 
@@ -228,7 +224,7 @@ FormEditor
 Setup a *report* to manage all *forms*:
 
 * Create a Typo3 page.
-* Set the 'URL Alias' to `form` (default) or the individual defined value in parameter EDIT_FORM_PAGE (config.qfq.ini).
+* Set the 'URL Alias' to `form` (default) or the individual defined value in parameter `editFormPage` (configuration_).
 * Insert a content record of type *qfq*.
 * In the bodytext insert the following code:
 
@@ -237,8 +233,8 @@ Setup a *report* to manage all *forms*:
 	# If there is a form given by SIP: show
 	form={{form:SE}}
 
-	# In case DB_INDEX_QFQ is different from DB_INDEX_DATA, set DB_INDEX_QFQ.
-	dbIndex = {{DB_INDEX_QFQ:Y}}
+	# In case indexQfq is different from indexData, set indexQfq.
+	dbIndex = {{indexQfq:Y}}
 
 	10 {
 		# List of Forms: Do not show this list of forms if there is a form given by SIP.
@@ -261,133 +257,203 @@ Setup a *report* to manage all *forms*:
 		}
 	}
 
+.. _install-checklist:
+
+Install Check List
+------------------
+
+* Protect the directory `<T3 installation>/fileadmin/protected` in Apache against direct file access. Those directory
+  should be used for confidential (uploaded / generated) data.
+* Protect the directory `<T3 installation>/fileadmin` in Apache to not execute PHP Scripts - malicious uploads won't be executed.
+* Setup a log rotation rule for `sqlLog`.
+* Check that `sqlLogMode` is set to `modify`  on productive sites.
+
+.. _configuration:
+
+Configuration
+-------------
+
+.. _extension-manager-qfq-configuration:
+
+Extension Manager: QFQ Configuration
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
++-------------------------------+-------------------------------------------------------+----------------------------------------------------------------------------+
+| Keyword                       | Default / Example                                     | Description                                                                |
++===============================+=======================================================+============================================================================+
+| Config                                                                                                                                                             |
++-------------------------------+-------------------------------------------------------+----------------------------------------------------------------------------+
+| documentation                 | http://docs.typo3.org...                              | Link to the online documentation of QFQ. Every QFQ installation also       |
+|                               |                                                       | contains a local copy: typo3conf/ext/qfq/Documentation/html/Manual.html    |
++-------------------------------+-------------------------------------------------------+----------------------------------------------------------------------------+
+| thumbnailDirSecure            | fileadmin/protected/qfqThumbnail                      | Important: secure directory 'protected' (recursive) against direct access. |
++-------------------------------+-------------------------------------------------------+----------------------------------------------------------------------------+
+| thumbnailDirPublic            | typo3temp/qfqThumbnail                                | Both thumbnail directories will be created if not existing.                |
++-------------------------------+-------------------------------------------------------+----------------------------------------------------------------------------+
+| cmdInkscape                   | inkscape                                              | If inkscape is not available, specify an empty string.                     |
++-------------------------------+-------------------------------------------------------+----------------------------------------------------------------------------+
+| cmdConvert                    | convert                                               | GraphicsMagics 'convert' is recommended.                                   |
++-------------------------------+-------------------------------------------------------+----------------------------------------------------------------------------+
+| cmdWkhtmltopdf                | /usr/bin/wkhtmltopdf                                  | PathFilename of wkhtmltopdf.                                               |
++-------------------------------+-------------------------------------------------------+----------------------------------------------------------------------------+
+| baseUrl                       | http://example.com                                    | URL where wkhtmltopdf will fetch the HTML (no parameter, those comes later)|
++-------------------------------+-------------------------------------------------------+----------------------------------------------------------------------------+
+| sendEMailOptions              | -o tls=yes                                            | General options. Check: http://caspian.dotconf.net/menu/Software/SendEmail |
++-------------------------------+-------------------------------------------------------+----------------------------------------------------------------------------+
+| dateFormat                    | yyyy-mm-dd                                            | Possible options: yyyy-mm-dd, dd.mm.yyyy                                   |
++-------------------------------+-------------------------------------------------------+----------------------------------------------------------------------------+
+| Dynamic                                                                                                                                                            |
++-------------------------------+-------------------------------------------------------+----------------------------------------------------------------------------+
+| fillStoreSystemBySql1|2|3     | SELECT s.id AS ...                                    | Specific values read from the database to fill the system store during QFQ |
+|                               |                                                       | load. See `fillStoreSystemBySql`_ for a usecase.                           |
++-------------------------------+-------------------------------------------------------+----------------------------------------------------------------------------+
+| fillStoreSystemBySqlErrorMsg2 | No current period found                               | Only define an error message, if QFQ should stop running                   |
+|                               |                                                       | in case of an SQL error or not exact one record.                           |
++-------------------------------+-------------------------------------------------------+----------------------------------------------------------------------------+
+| Debug                                                                                                                                                              |
++-------------------------------+-------------------------------------------------------+----------------------------------------------------------------------------+
+| sqlLogMode                    | modify                                                | *all*: every statement will be logged - this might a lot.                  |
+|                               |                                                       | *modify*: log only statements who change data. *error*: log only DB errors.|
+|                               |                                                       | *none*: no SQL log at all.                                                 |
++-------------------------------+-------------------------------------------------------+----------------------------------------------------------------------------+
+| sqlLog                        | typo3conf/sql.log                                     | Filename to log SQL commands: relative to <site path> or absolute.         |
++-------------------------------+-------------------------------------------------------+----------------------------------------------------------------------------+
+| mailLog                       | typo3conf/mail.log                                    | Filename to log `sendEmail` commands: relative to <site path> or absolute. |
++-------------------------------+-------------------------------------------------------+----------------------------------------------------------------------------+
+| showDebugInfo                 | auto                                                  | FE - Possible values: yes|no|auto|download. For 'auto': If a BE User is    |
+|                               |                                                       | logged in, a debug information will be shown on the FE.                    |
++-------------------------------+-------------------------------------------------------+----------------------------------------------------------------------------+
+| redirectAllMailTo             | john@doe.com                                          | If set, redirect all QFQ generated mails (Form, Report) to the specified.  |
++-------------------------------+-------------------------------------------------------+----------------------------------------------------------------------------+
+| Database                                                                                                                                                           |
++-------------------------------+-------------------------------------------------------+----------------------------------------------------------------------------+
+| dbInit                        | dbInit=set names utf8                                 | Global init for using the database.                                        |
++-------------------------------+-------------------------------------------------------+----------------------------------------------------------------------------+
+| update                        | auto                                                  | 'auto': apply DB Updates only if there is a newer version.                 |
+|                               |                                                       | 'always': apply DB Updates always, especially play formEditor.sql every    |
+|                               |                                                       | time QFQ is called - *not* recommended!                                    |
+|                               |                                                       | 'never': never apply DB Updates.                                           |
++-------------------------------+-------------------------------------------------------+----------------------------------------------------------------------------+
+| indexData                     | 1                                                     | Optional. Default: 1. Retrieve the current setting via {{_dbNameData:Y}}   |
++-------------------------------+-------------------------------------------------------+----------------------------------------------------------------------------+
+| indexQfq                      | 1                                                     | Optional. Default: 1. Retrieve the current setting via {{_dbNameQfq:Y}}    |
++-------------------------------+-------------------------------------------------------+----------------------------------------------------------------------------+
+| Security                                                                                                                                                           |
++-------------------------------+-------------------------------------------------------+----------------------------------------------------------------------------+
+| escapeTypeDefault             | m                                                     | All variables `{{...}}` get this escape class by default.                  |
+|                               |                                                       | See `variable-escape`_.                                                    |
++-------------------------------+-------------------------------------------------------+----------------------------------------------------------------------------+
+| securityVarsHoneypot          | email,username,password                               | If empty: no check. All named variables will rendered as INPUT elements    |
++-------------------------------+-------------------------------------------------------+----------------------------------------------------------------------------+
+| securityAttackDelay           | 5                                                     | If an attack is detected, sleep 'x' seconds and exit PHP process           |
++-------------------------------+-------------------------------------------------------+----------------------------------------------------------------------------+
+| securityShowMessage           | true                                                  | If an attack is detected, show a message                                   |
++-------------------------------+-------------------------------------------------------+----------------------------------------------------------------------------+
+| securityGetMaxLength          | 50                                                    | GET vars longer than 'x' chars triggers an `attack-recognized`.            |
+|                               |                                                       | `ExceptionMaxLength`_                                                      |
++-------------------------------+-------------------------------------------------------+----------------------------------------------------------------------------+
+| Form-Config                                                                                                                                                        |
++-------------------------------+-------------------------------------------------------+----------------------------------------------------------------------------+
+| recordLockTimeoutSeconds      | 900                                                   | Timeout for record locking. After this time, a record will be replaced     |
++-------------------------------+-------------------------------------------------------+----------------------------------------------------------------------------+
+| enterAsSubmit                 | enterAsSubmit = 1                                     | 0: off, 1: Pressing *enter* in a form means *save* and *close*             |
++-------------------------------+-------------------------------------------------------+----------------------------------------------------------------------------+
+| editFormPage                  | form                                                  | T3 Pagealias to edit a form.                                               |
++-------------------------------+-------------------------------------------------------+----------------------------------------------------------------------------+
+| formDataPatternError          | please check pattern error                            | Customizable error message used in validator.js. 'pattern' violation       |
++-------------------------------+-------------------------------------------------------+----------------------------------------------------------------------------+
+| formDataRequiredError         | missing value                                         | Customizable error message used in validator.js. 'required' fields         |
++-------------------------------+-------------------------------------------------------+----------------------------------------------------------------------------+
+| formDataMatchError            | type error                                            | Customizable error message used in validator.js. 'match' retype mismatch   |
++-------------------------------+-------------------------------------------------------+----------------------------------------------------------------------------+
+| formDataError                 | generic error                                         | Customizable error message used in validator.js. 'no specific' given       |
++-------------------------------+-------------------------------------------------------+----------------------------------------------------------------------------+
+| Form-Layout                                                                                                                                                        |
++-------------------------------+-------------------------------------------------------+----------------------------------------------------------------------------+
+| cssClassQfqContainer          | container                                             | QFQ with own Bootstrap: 'container'.                                       |
+|                               |                                                       | QFQ already nested in Bootstrap of mainpage: <empty>                       |
++-------------------------------+-------------------------------------------------------+----------------------------------------------------------------------------+
+| cssClassQfqForm               | qfq-color-base                                        | Wrap around QFQ 'Form'.                                                    |
++-------------------------------+-------------------------------------------------------+----------------------------------------------------------------------------+
+| cssClassQfqFormPill           | qfq-color-grey-1                                      | Wrap around title bar for pills: CSS Class, typically a background color.  |
++-------------------------------+-------------------------------------------------------+----------------------------------------------------------------------------+
+| cssClassQfqFormBody           | qfq-color-grey-2                                      | Wrap around FormElements: CSS Class, typically a background color.         |
++-------------------------------+-------------------------------------------------------+----------------------------------------------------------------------------+
+| formBsColumns                 | 12                                                    | The whole form will be wrapped in 'col-md-??'. Default is 12 for 100%      |
++-------------------------------+-------------------------------------------------------+----------------------------------------------------------------------------+
+| formBsLabelColumns            | 3                                                     | Default number of BS columns for the 'label'-column                        |
++-------------------------------+-------------------------------------------------------+----------------------------------------------------------------------------+
+| formBsInputColumns            | 6                                                     | Default number of BS columns for the 'input'-column                        |
++-------------------------------+-------------------------------------------------------+----------------------------------------------------------------------------+
+| formBsNoteColumns             | 3                                                     | Default number of BS columns for the 'note'-column                         |
++-------------------------------+-------------------------------------------------------+----------------------------------------------------------------------------+
+| extraButtonInfoInline         | <img src="info.png">                                  | Image for `extraButtonInfo`_ (inline)                                      |
++-------------------------------+-------------------------------------------------------+----------------------------------------------------------------------------+
+| extraButtonInfoBelow          | <img src="info.png">                                  | Image for `extraButtonInfo`_ (below)                                       |
++-------------------------------+-------------------------------------------------------+----------------------------------------------------------------------------+
+| extraButtonInfoPosition       | below                                                 | 'auto' (default) or 'below'. See `extraButtonInfo`_                        |
++-------------------------------+-------------------------------------------------------+----------------------------------------------------------------------------+
+| extraButtonInfoClass          | pull-right                                            | '' (default) or 'pull-right'. See `extraButtonInfo`_                       |
++-------------------------------+-------------------------------------------------------+----------------------------------------------------------------------------+
+| Form-Language                                                                                                                                                      |
++-------------------------------+-------------------------------------------------------+----------------------------------------------------------------------------+
+| formLanguage[ABCD]Id          | -  E.g.: 1                                            | In Typo3 configured pageLanguage id. The number after the 'L' parameter.   |
++-------------------------------+-------------------------------------------------------+----------------------------------------------------------------------------+
+| formLanguage[ABCD]Label       | -  E.G.: english                                      | Label shown in *Form editor*, on the 'basic' tab.                          |
++-------------------------------+-------------------------------------------------------+----------------------------------------------------------------------------+
+| saveButtonText                | -                                                     | Text on the form save button. Typically none.                              |
++-------------------------------+-------------------------------------------------------+----------------------------------------------------------------------------+
+| saveButtonTooltip             | Save                                                  | Tooltip on the form save button.                                           |
++-------------------------------+-------------------------------------------------------+----------------------------------------------------------------------------+
+| saveButtonClass               | btn btn-default navbar-btn                            | Bootstrap CSS class for save button on top of the form                     |
++-------------------------------+-------------------------------------------------------+----------------------------------------------------------------------------+
+| saveButtonClassOnChange       | alert-info btn-info                                   | Bootstrap CSS class for save button showing 'data changed'                 |
++-------------------------------+-------------------------------------------------------+----------------------------------------------------------------------------+
+| saveButtonGlyphIcon           | glyphicon-ok                                          | Icon for the form save button                                              |
++-------------------------------+-------------------------------------------------------+----------------------------------------------------------------------------+
+| closeButtonText               | -                                                     | Text on the form close button. Typically none.                             |
++-------------------------------+-------------------------------------------------------+----------------------------------------------------------------------------+
+| closeButtonTooltip            | close                                                 | Tooltip on the form close button.                                          |
++-------------------------------+-------------------------------------------------------+----------------------------------------------------------------------------+
+| closeButtonClass              | btn btn-default navbar-btn                            | Bootstrap CSS class for close button on top of the form                    |
++-------------------------------+-------------------------------------------------------+----------------------------------------------------------------------------+
+| closeButtonGlyphIcon          | glyphicon-remove                                      | Icon for the form close button                                             |
++-------------------------------+-------------------------------------------------------+----------------------------------------------------------------------------+
+| deleteButtonText              | -                                                     | Text on the form delete button. Typically none.                            |
++-------------------------------+-------------------------------------------------------+----------------------------------------------------------------------------+
+| deleteButtonTooltip           | delete                                                | Tooltip on the form delete button.                                         |
++-------------------------------+-------------------------------------------------------+----------------------------------------------------------------------------+
+| deleteButtonClass             | btn btn-default navbar-btn                            | Bootstrap CSS class for delete button on top of the form                   |
++-------------------------------+-------------------------------------------------------+----------------------------------------------------------------------------+
+| deleteButtonGlyphIcon         | glyphicon-trash                                       | Icon for the form delete button                                            |
++-------------------------------+-------------------------------------------------------+----------------------------------------------------------------------------+
+| newButtonText                 | -                                                     | Text on the form new button. Typically none.                               |
++-------------------------------+-------------------------------------------------------+----------------------------------------------------------------------------+
+| newButtonTooltip              | new                                                   | Tooltip on the form new button.                                            |
++-------------------------------+-------------------------------------------------------+----------------------------------------------------------------------------+
+| newButtonClass                | btn btn-default navbar-btn                            | Bootstrap CSS class for new button on top of the form                      |
++-------------------------------+-------------------------------------------------------+----------------------------------------------------------------------------+
+| newButtonGlyphIcon            | glyphicon-plus                                        | Icon for the form new button                                               |
++-------------------------------+-------------------------------------------------------+----------------------------------------------------------------------------+
+
+
 .. _config-qfq-ini:
 
 config.qfq.ini
 --------------
 
-+-----------------------------+-------------------------------------------------------+----------------------------------------------------------------------------+
-| Keyword                     | Example                                               | Description                                                                |
-+=============================+=======================================================+============================================================================+
-| DB_INIT                     | DB_INIT=set names utf8                                | Global init for using the database.                                        |
-+-----------------------------+-------------------------------------------------------+----------------------------------------------------------------------------+
-| DB_UPDATE                   | DB_UPDATE = auto                                      | 'auto': apply DB Updates only if there is a newer version.                 |
-|                             |                                                       | 'always': apply DB Updates always, especially play formEditor.sql every    |
-|                             |                                                       | time QFQ is called - *not* recommended!                                    |
-|                             |                                                       | 'never': never apply DB Updates.                                           |
-+-----------------------------+-------------------------------------------------------+----------------------------------------------------------------------------+
-| DB_<n>_USER                 | DB_1_USER=qfqUser                                     | Credentials configured in MySQL                                            |
-| DB_<n>_PASSWORD             | DB_1_PASSWORD=1234567890                              | Credentials configured in MySQL                                            |
-| DB_<n>_SERVER               | DB_1_SERVER=localhost                                 | Hostname of MySQL Server                                                   |
-| DB_<n>_NAME                 | DB_1_NAME=qfq_db                                      | Database name                                                              |
-+-----------------------------+-------------------------------------------------------+----------------------------------------------------------------------------+
-| DB_INDEX_DATA               | DB_INDEX_DATA = 1                                     | Optional. Default: 1. Retrieve the current setting via {{_dbNameData:Y}}   |
-| DB_INDEX_QFQ                | DB_INDEX_QFQ = 1                                      | Optional. Default: 1. Retrieve the current setting via {{_dbNameQfq:Y}}    |
-+-----------------------------+-------------------------------------------------------+----------------------------------------------------------------------------+
-| SQL_LOG                     | SQL_LOG=../../sql.log                                 | Filename to log SQL commands: relative to <ext_dir> or absolute.           |
-| SQL_LOG_MODE                | SQL_LOG_MODE=modify                                   | *all*: every statement will be logged - this might a lot.                  |
-|                             |                                                       | *modify*: log only statements who change data.                             |
-+-----------------------------+-------------------------------------------------------+----------------------------------------------------------------------------+
-| MAIL_LOG                    | SQL_LOG=../../mail.log                                | Filename to log `sendEmail` commands: relative to <ext_dir> or absolute.   |
-+-----------------------------+-------------------------------------------------------+----------------------------------------------------------------------------+
-| SEND_E_MAIL_OPTIONS         | SEND_E_MAIL_OPTIONS="-o tls=yes"                      | General options. Check: http://caspian.dotconf.net/menu/Software/SendEmail |
-+-----------------------------+-------------------------------------------------------+----------------------------------------------------------------------------+
-| SHOW_DEBUG_INFO             | SHOW_DEBUG_INFO=auto                                  | FE - Possible values: yes|no|auto|download. For 'auto': If a BE User is    |
-|                             |                                                       | logged in, a debug information will be shown on the FE.                    |
-+-----------------------------+-------------------------------------------------------+----------------------------------------------------------------------------+
-| REDIRECT_ALL_MAIL_TO        | REDIRECT_ALL_MAIL_TO=john@doe.com                     | If set, redirect all QFQ generated mails (Form, Report) to the specified.  |
-+-----------------------------+-------------------------------------------------------+----------------------------------------------------------------------------+
-| CSS_CLASS_QFQ_CONTAINER     | CSS_CLASS_QFQ_CONTAINER=container                     | QFQ with own Bootstrap: 'container'.                                       |
-|                             |                                                       | QFQ already nested in Bootstrap of mainpage: <empty>                       |
-+-----------------------------+-------------------------------------------------------+----------------------------------------------------------------------------+
-| CSS_CLASS_QFQ_FORM          | CSS_CLASS_QFQ_FORM=qfq-color-base                     | Wrap around QFQ 'Form'.                                                    |
-| CSS_CLASS_QFQ_FORM_PILL     | CSS_CLASS_QFQ_FORM_PILL=qfq-color-grey-1              | Wrap around title bar for pills: CSS Class, typically a background color.  |
-| CSS_CLASS_QFQ_FORM_BODY     | CSS_CLASS_QFQ_FORM_BODY=qfq-color-grey-2              | Wrap around FormElements: CSS Class, typically a background color.         |
-+-----------------------------+-------------------------------------------------------+----------------------------------------------------------------------------+
-| DATE_FORMAT                 | DATE_FORMAT= yyyy-mm-dd                               | Possible options: yyyy-mm-dd, dd.mm.yyyy                                   |
-+-----------------------------+-------------------------------------------------------+----------------------------------------------------------------------------+
-| FORM_DATA_PATTERN_ERROR     | FORM_DATA_PATTERN_ERROR=please check pa.              | Customizable error message used in validator.js. 'pattern' violation       |
-| FORM_DATA_REQUIRED_ERROR    | FORM_DATA_REQUIRED_ERROR=missing value                | Customizable error message used in validator.js. 'required' fields         |
-| FORM_DATA_MATCH_ERROR       | FORM_DATA_MATCH_ERROR=type error                      | Customizable error message used in validator.js. 'match' retype mismatch   |
-| FORM_DATA_ERROR             | FORM_DATA_ERROR=generic error                         | Customizable error message used in validator.js. 'no specific' given       |
-+-----------------------------+-------------------------------------------------------+----------------------------------------------------------------------------+
-| FORM_BS_COLUMNS             | FORM_BS_COLUMNS=12                                    | The whole form will be wrapped in 'col-md-??'. Default is 12 for 100%      |
-| FORM_BS_LABEL_COLUMNS       | FORM_BS_LABEL_COLUMNS = 3                             | Default number of BS columns for the 'label'-column                        |
-| FORM_BS_INPUT_COLUMNS       | FORM_BS_INPUT_COLUMNS = 6                             | Default number of BS columns for the 'input'-column                        |
-| FORM_BS_NOTE_COLUMNS        | FORM_BS_NOTE_COLUMNS = 3                              | Default number of BS columns for the 'note'-column                         |
-+-----------------------------+-------------------------------------------------------+----------------------------------------------------------------------------+
-| FORM_BUTTON_ON_CHANGE_CLASS | FORM_BUTTON_ON_CHANGE_CLASS=alert-info btn-info       | Color for save button after modification                                   |
-+-----------------------------+-------------------------------------------------------+----------------------------------------------------------------------------+
-| BASE_URL_PRINT              | BASE_URL_PRINT=http://example.com                     | URL where wkhtmltopdf will fetch the HTML (no parameter, those comes later)|
-+-----------------------------+-------------------------------------------------------+----------------------------------------------------------------------------+
-| WKHTMLTOPDF                 | WKHTMLTOPDF=/usr/bin/wkhtmltopdf                      | Binary where to find wkhtmltopdf.                                          |
-+-----------------------------+-------------------------------------------------------+----------------------------------------------------------------------------+
-| EDIT_FORM_PAGE              | EDIT_FORM_PAGE = form                                 | T3 Pagealias to edit a form.                                               |
-+-----------------------------+-------------------------------------------------------+----------------------------------------------------------------------------+
-| LDAP_1_RDN                  | LDAP_1_RDN='ou=Admin,ou=example,dc=com'               | Credentials for non-anonymous LDAP access. At the moment only one set of   |
-| LDAP_1_PASSWORD             | LDAP_1_PASSWORD=mySecurePassword                      |                                                                            |
-+-----------------------------+-------------------------------------------------------+----------------------------------------------------------------------------+
-| ESCAPE_TYPE_DEFAULT         | ESCAPE_TYPE_DEFAULT=m                                 | All variables `{{...}}` get this escape class by default.                  |
-|                             |                                                       | See `variable-escape`_.                                                    |
-+-----------------------------+-------------------------------------------------------+----------------------------------------------------------------------------+
-| SECURITY_VARS_HONEYPOT      | SECURITY_VARS_HONEYPOT = email,username,password      | If empty: no check. All named variables will rendered as INPUT elements    |
-| SECURITY_ATTACK_DELAY       | SECURITY_ATTACK_DELAY = 5                             | If an attack is detected, sleep 'x' seconds and exit PHP process           |
-| SECURITY_VARS_HONEYPOT      | SECURITY_VARS_HONEYPOT = email,username,password      | If empty: no check. All named variables will rendered as INPUT elements    |
-| SECURITY_SHOW_MESSAGE       | SECURITY_SHOW_MESSAGE = true                          | If an attack is detected, show a message                                   |
-| SECURITY_VARS_HONEYPOT      | SECURITY_VARS_HONEYPOT = email,username,password      | If empty: no check. All named variables will rendered as INPUT elements    |
-| SECURITY_GET_MAX_LENGTH     | SECURITY_GET_MAX_LENGTH = 50                          | GET vars longer than 'x' chars triggers an `attack-recognized`.            |
-|                             |                                                       | `ExceptionMaxLength`_                                                      |
-+-----------------------------+-------------------------------------------------------+----------------------------------------------------------------------------+
-| GFX_EXTRA_BUTTON_INFO_INLINE| <img src="info.png">                                  | Image for `extraButtonInfo`_ (inline)                                      |
-| GFX_EXTRA_BUTTON_INFO_BELOW | <img src="info.png">                                  | Image for `extraButtonInfo`_ (below)                                       |
-| EXTRA_BUTTON_INFO_POSITION  | SYSTEM_EXTRA_BUTTON_INFO_POSITION=below               | 'auto' (default) or 'below'. See `extraButtonInfo`_                        |
-| EXTRA_BUTTON_INFO_CLASS     | SYSTEM_EXTRA_BUTTON_INFO_CLASS=pull-right             | '' (default) or 'pull-right'. See `extraButtonInfo`_                       |
-+-----------------------------+-------------------------------------------------------+----------------------------------------------------------------------------+
-| SAVE_BUTTON_TEXT            | SAVE_BUTTON_TEXT =                                    | Default text on the form save button. Typically none.                      |
-| SAVE_BUTTON_TOOLTIP         | SAVE_BUTTON_TOOLTIP = save                            | Default tooltip on the form save button.                                   |
-| SAVE_BUTTON_CLASS           | SAVE_BUTTON_CLASS = btn btn-default navbar-btn        | Default Bootstrap CSS class for buttons on top of the form                 |
-| SAVE_BUTTON_GLYPH_ICON      | SAVE_BUTTON_GLYPH_ICON = glyphicon-ok                 | Default Icon for the form save button                                      |
-+-----------------------------+-------------------------------------------------------+----------------------------------------------------------------------------+
-| CLOSE_BUTTON_TEXT           | CLOSE_BUTTON_TEXT =                                   | Default text on the form close button. Typically none.                     |
-| CLOSE_BUTTON_TOOLTIP        | CLOSE_BUTTON_TOOLTIP = close                          | Default tooltip on the form close button.                                  |
-| CLOSE_BUTTON_CLASS          | CLOSE_BUTTON_CLASS = btn btn-default navbar-btn       | Default Bootstrap CSS class for buttons on top of the form                 |
-| CLOSE_BUTTON_GLYPH_ICON     | CLOSE_BUTTON_GLYPH_ICON = glyphicon-remove            | Default Icon for the form close button                                     |
-+-----------------------------+-------------------------------------------------------+----------------------------------------------------------------------------+
-| DELETE_BUTTON_TEXT          | DELETE_BUTTON_TEXT =                                  | Default text on the form delete button. Typically none.                    |
-| DELETE_BUTTON_TOOLTIP       | DELETE_BUTTON_TOOLTIP = delete                        | Default tooltip on the form delete button.                                 |
-| DELETE_BUTTON_CLASS         | DELETE_BUTTON_CLASS = btn btn-default navbar-btn      | Default Bootstrap CSS class for buttons on top of the form                 |
-| DELETE_BUTTON_GLYPH_ICON    | DELETE_BUTTON_GLYPH_ICON = glyphicon-trash            | Default Icon for the form delete button                                    |
-+-----------------------------+-------------------------------------------------------+----------------------------------------------------------------------------+
-| NEW_BUTTON_TEXT             | NEW_BUTTON_TEXT =                                     | Default text on the form new button. Typically none.                       |
-| NEW_BUTTON_TOOLTIP          | NEW_BUTTON_TOOLTIP = new                              | Default tooltip on the form new button.                                    |
-| NEW_BUTTON_CLASS            | NEW_BUTTON_CLASS = btn btn-default navbar-btn         | Default Bootstrap CSS class for buttons on top of the form                 |
-| NEW_BUTTON_GLYPH_ICON       | NEW_BUTTON_GLYPH_ICON = glyphicon-plus                | Default Icon for the form new button                                       |
-+-----------------------------+-------------------------------------------------------+----------------------------------------------------------------------------+
-| DIRTY_RECORD_TIMEOUT_SECONDS| DIRTY_RECORD_TIMEOUT_SECONDS = 900                    | Timeout for record locking. After this time, a record will be replaced     |
-+-----------------------------+-------------------------------------------------------+----------------------------------------------------------------------------+
-| DOCUMENTATION_QFQ           | DOCUMENTATION_QFQ=http://docs.typo3.org...            | Link to the online documentation of QFQ. Every QFQ installation also       |
-|                             |                                                       | contains a local copy: typo3conf/ext/qfq/Documentation/html/Manual.html    |
-+-----------------------------+-------------------------------------------------------+----------------------------------------------------------------------------+
-| FILL_STORE_SYSTEM_BY_SQL    | FILL_STORE_SYSTEM_BY_SQL = {{!SELECT s.id AS ...      | Specific values read from the database to fill the system store during QFQ |
-|                             |                                                       | load. See `fillStoreSystemBySql`_ for a usecase.                           |
-+-----------------------------+-------------------------------------------------------+----------------------------------------------------------------------------+
-| FORM_LANGUAGE_A_ID          | FORM_LANGUAGE_A__ID = 1                               | In Typo3 configured pageLanguage id. The number after the 'L' parameter.   |
-| FORM_LANGUAGE_B_ID          |                                                       |                                                                            |
-| FORM_LANGUAGE_C_ID          |                                                       |                                                                            |
-| FORM_LANGUAGE_D_ID          |                                                       |                                                                            |
-+-----------------------------+-------------------------------------------------------+----------------------------------------------------------------------------+
-| FORM_LANGUAGE_A_LABEL       | FORM_LANGUAGE_A_LABEL = english                       | Label shown in *Form editor*, on the 'basic' tab.                          |
-| FORM_LANGUAGE_B_LABEL       |                                                       |                                                                            |
-| FORM_LANGUAGE_C_LABEL       |                                                       |                                                                            |
-| FORM_LANGUAGE_D_LABEL       |                                                       |                                                                            |
-+-----------------------------+-------------------------------------------------------+----------------------------------------------------------------------------+
-| enterAsSubmit               | enterAsSubmit = 1                                     | 0: off, 1: Pressing *enter* in a form means *save* and *close*             |
-+-----------------------------+-------------------------------------------------------+----------------------------------------------------------------------------+
-| thumbnailDirSecure          | thumbnailDirSecure = fileadmin/protected/qfqThumbnail | Important: secure this directory against direct access.                    |
-| thumbnailDirPublic          | thumbnailDirPublic = typo3temp/qfqThumbnail           | Both thumbnail directories will be created if not existing.                |
-| cmdInkscape                 | cmdInkscape = inkscape                                | If inkscape is not available, specify an empty string.                     |
-| cmdConvert                  | cmdConvert = convert                                  | GraphicsMagics 'convert' is recommended.                                   |
-+-----------------------------+-------------------------------------------------------+----------------------------------------------------------------------------+
++-------------------------------+-------------------------------------------------------+----------------------------------------------------------------------------+
+| Keyword                       | Example                                               | Description                                                                |
++===============================+=======================================================+============================================================================+
+| DB_<n>_USER                   | DB_1_USER=qfqUser                                     | Credentials configured in MySQL                                            |
+| DB_<n>_PASSWORD               | DB_1_PASSWORD=1234567890                              | Credentials configured in MySQL                                            |
+| DB_<n>_SERVER                 | DB_1_SERVER=localhost                                 | Hostname of MySQL Server                                                   |
+| DB_<n>_NAME                   | DB_1_NAME=qfq_db                                      | Database name                                                              |
++-------------------------------+-------------------------------------------------------+----------------------------------------------------------------------------+
+| LDAP_1_RDN                    | LDAP_1_RDN='ou=Admin,ou=example,dc=com'               | Credentials for non-anonymous LDAP access. At the moment only one set of   |
+| LDAP_1_PASSWORD               | LDAP_1_PASSWORD=mySecurePassword                      |                                                                            |
++-------------------------------+-------------------------------------------------------+----------------------------------------------------------------------------+
+
 
 
 Example: *typo3conf/config.qfq.ini*
@@ -396,19 +462,7 @@ Example: *typo3conf/config.qfq.ini*
 
 	; QFQ configuration
 	;
-	; Save this file as: <Documentroot>/typo3conf/config.qfq.ini
-
-	; Configure own URL, where `wkhtmltopdf` fetches pages and produces PDFs
-	BASE_URL_PRINT = http://url.my/
-	; WKHTMLTOPDF = /opt/wkhtmltox/bin/wkhtmltopdf
-
-	; DB_INIT = set names utf8
-
-	; auto | always | never
-	; DB_UPDATE = auto
-
-	; DB_INDEX_DATA = 1
-	; DB_INDEX_QFQ = 1
+	; Save this file as: <site path>/typo3conf/config.qfq.ini
 
 	DB_1_USER = <DBUSER>
 	DB_1_SERVER = <DBSERVER>
@@ -420,116 +474,12 @@ Example: *typo3conf/config.qfq.ini*
 	; DB_2_PASSWORD = <DBPW>
 	; DB_2_NAME = <DB>
 
-	; '../../sql.log' = <T3 Install directory>/typo3conf/sql.log
-	; SQL_LOG = ../../sql.log
-
-	; all|modify|error|none
-	; SQL_LOG_MODE = modify
-
-	; MAIL_LOG = ../../mail.log
-	; SEND_E_MAIL_OPTIONS = "-o ... "  - check http://caspian.dotconf.net/menu/Software/SendEmail
-
-	; [auto|yes|no][,download]. 'auto': if BE User is logged in the value will be replaced by 'yes', else 'no'. Additional choose 'download'.
-	; SHOW_DEBUG_INFO = auto
-
-	; REDIRECT_ALL_MAIL_TO = john.doe@example.com
-
-	; QFQ with own Bootstrap: 'container'. QFQ already nested in Bootstrap of mainpage: <empty>
-	; CSS_CLASS_QFQ_CONTAINER =
-
-	; Default background color, specified via CSS class
-	; CSS_CLASS_QFQ_FORM =
-	; CSS_CLASS_QFQ_FORM_PILL = qfq-color-grey-1
-	; CSS_CLASS_QFQ_FORM_BODY = qfq-color-grey-2
-
-	; yyyy-mm-dd, dd.mm.yyyy
-	; DATE_FORMAT = yyyy-mm-dd
-
 	; Access via {{TECHNICAL_CONTACT:Y}}
 	; TECHNICAL_CONTACT = john@doe.com
 
-	;  validator.js: data-pattern-error="", data-required-error="", data-match-error="", data-error=""
-	; FORM_DATA_PATTERN_ERROR =
-	; FORM_DATA_REQUIRED_ERROR =
-	; FORM_DATA_MATCH_ERROR =
-	; FORM_DATA_ERROR =
-
-	;  Default width of whole form
-	; FORM_BS_COLUMNS = 12
-
-	;  Default size for Bootstrap Form Elements
-	; FORM_BS_LABEL_COLUMNS = 3
-	; FORM_BS_INPUT_COLUMNS = 6
-	; FORM_BS_NOTE_COLUMNS = 3
-
-	; EDIT_FORM_PAGE = form
-
 	; LDAP_1_RDN =
 	; LDAP_1_PASSWORD =
 
-	; ESCAPE_TYPE_DEFAULT=m
-
-	; SECURITY_VARS_HONEYPOT=email,username,password
-	; SECURITY_ATTACK_DELAY=5
-	; SECURITY_SHOW_MESSAGE=true
-	; SECURITY_GET_MAX_LENGTH=50
-
-	; GFX_EXTRA_BUTTON_INFO_INLINE = <img src="file.png">
-	; GFX_EXTRA_BUTTON_INFO_BELOW = <img src="file.png">
-	; EXTRA_BUTTON_INFO_POSITION = auto | below
-	; EXTRA_BUTTON_INFO_POSITION_CLASS = pull-right
-
-	; SAVE_BUTTON_TEXT =
-	; SAVE_BUTTON_TOOLTIP = save
-	; SAVE_BUTTON_CLASS = btn btn-default navbar-btn
-	; SAVE_BUTTON_GLYPH_ICON = glyphicon-ok
-
-	; CLOSE_BUTTON_TEXT =
-	; CLOSE_BUTTON_TOOLTIP = close
-	; CLOSE_BUTTON_CLASS = btn btn-default navbar-btn
-	; CLOSE_BUTTON_GLYPH_ICON = glyphicon-remove
-
-	; DELETE_BUTTON_TEXT =
-	; DELETE_BUTTON_TOOLTIP = delete
-	; DELETE_BUTTON_CLASS = btn btn-default navbar-btn
-	; DELETE_BUTTON_GLYPH_ICON = glyphicon-trash
-
-	; NEW_BUTTON_TEXT =
-	; NEW_BUTTON_TOOLTIP = new
-	; NEW_BUTTON_CLASS = btn btn-default navbar-btn
-	; NEW_BUTTON_GLYPH_ICON = glyphicon-plus
-
-	; RECORD_LOCK_TIMEOUT_SECONDS = 900
-
-	; Local Documentation (doc fits to installed version):  typo3conf/ext/qfq/Documentation/html/Manual.html
-	; DOCUMENTATION_QFQ = https://docs.typo3.org/typo3cms/drafts/github/T3DocumentationStarter/Public-Info-053/Manual.html
-
-	; FILL_STORE_SYSTEM_BY_SQL_1 = "SELECT id AS _periodId FROM Period WHERE start<=NOW() ORDER BY start DESC LIMIT 1"
-	; Important: only define an error message, if QFQ should stop running in case of an SQL error or not exact 1 record.
-	; FILL_STORE_SYSTEM_BY_SQL_ERROR_MSG_1 = No current period found
-
-	; FORM_LANGUAGE_A_ID =       E.g. FORM_LANGUAGE_A_ID = 1
-	; FORM_LANGUAGE_A_LABEL =    E.g. FORM_LANGUAGE_A_ID = English
-
-	; FORM_LANGUAGE_B_ID =       E.g. FORM_LANGUAGE_B_ID = 2
-	; FORM_LANGUAGE_B_LABEL =    E.g. FORM_LANGUAGE_B_ID = French
-
-	; FORM_LANGUAGE_C_ID =       E.g. FORM_LANGUAGE_C_ID = 3
-	; FORM_LANGUAGE_C_LABEL =    E.g. FORM_LANGUAGE_C_ID = Spain
-
-	; FORM_LANGUAGE_D_ID =       E.g. FORM_LANGUAGE_D_ID = 4
-	; FORM_LANGUAGE_D_LABEL =    E.g. FORM_LANGUAGE_D_ID = Chinese
-
-	; Pressing the 'enter' key is equal to save and close
-	; enterAsSubmit = 1
-
-	; Attention: be sure that 'fileadmin/protected' is really locked down by a webserver directive.
-	;   See https://docs.typo3.org/typo3cms/drafts/github/T3DocumentationStarter/Public-Info-053/Manual.html#secure-direct-fileaccess
-	;
-	; thumbnailDirSecure = fileadmin/protected/qfqThumbnail
-	; thumbnailDirPublic = typo3temp/qfqThumbnail
-	; cmdInkscape = inkscape
-	; cmdConvert = convert
 
 After parsing the configuration, the following variables will be set automatically in STORE_SYSTEM:
 
@@ -563,8 +513,8 @@ E.g. to setup a contact address and reuse the information inside your installati
 Fill STORE_SYSTEM by SQL
 ^^^^^^^^^^^^^^^^^^^^^^^^
 
-A specified SELECT statement in `config.qfq.ini`_ in variable `FILL_STORE_SYSTEM_BY_SQL_1` (or `FILL_STORE_SYSTEM_BY_SQL_2`,
-or `FILL_STORE_SYSTEM_BY_SQL_3`) will be fired. The query should have 0 (nothing happens) or 1 row. All columns will be
+A specified SELECT statement in `configuration`_ in variable `fillStoreSystemBySql1` (or `2`,
+or `3`) will be fired. The query should have 0 (nothing happens) or 1 row. All columns will be
 **added** to the existing STORE_SYSTEM. Existing variables will be overwritten. Be careful not to overwrite system values.
  
 This option is useful to make generic custom values, saved in the database, accessible to all QFQ Report and Forms.
@@ -573,8 +523,8 @@ Access such variables via `{{<varname>:Y}}`.
 In case QFQ should stop working if a given query does not select exact one record (e.g. a missing period), define an
 error message: ::
 
-  FILL_STORE_SYSTEM_BY_SQL_1 = "SELECT name FROM Person WHERE name='Doe'"
-  FILL_STORE_SYSTEM_BY_SQL_ERROR_MSG_1 = Too many or to few "Doe's" in our database
+  fillStoreSystemBySql1: SELECT name FROM Person WHERE name='Doe'
+  fillStoreSystemBySqlErrorMsg1: Too many or to few "Doe's" in our database
 
 .. _`periodId`:
 
@@ -586,18 +536,17 @@ This is
 * a usecase, implemented via `fillStoreSystemBySql`_,
 * a way to access `Period.id` with respect to the current period (the period itself is custom defined).
 
-After a full QFQ installation, three things are prepared:
+After a full QFQ installation:
 
 * a table `Period` (extend / change it to your needs, fill them with your periods),
 * one sample record in table `Period`,
-* in `config.qfq.ini`_ the default definition of `FILL_STORE_SYSTEM_BY_SQL_1` will set the variable `periodId` during QFQ load.
 
 Websites, delivering semester data, schoolyears schedules, or any other type or periods, often need an index to the
 *current* period.
 
-In `config.qfq.ini`: ::
+In configuration_: ::
 
-	FILL_STORE_SYSTEM_BY_SQL_1 = 'SELECT id AS periodId FROM Period WHERE start<=NOW() ORDER BY start DESC LIMIT 1'
+	fillStoreSystemBySql1: SELECT id AS periodId FROM Period WHERE start<=NOW() ORDER BY start DESC LIMIT 1
 
 a variable 'periodId' will automatically computed and filled in STORE SYSTEM. Access it via `{{periodId:Y0}}`.
 To get the name and current period: ::
@@ -628,7 +577,7 @@ To get access to the Typo3 installation, 'dbuser' should also have acces to the
 Exception for SECURITY_GET_MAX_LENGTH
 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
-If it is necessary to use a GET variable which exceeds SECURITY_GET_MAX_LENGTH limit, name the variable with '_<num>' at
+If it is necessary to use a GET variable which exceeds `securityGetMaxLength` limit, name the variable with '_<num>' at
 the end. E.g. `my_long_variable_130`. Such a variable has an allowed length of 130 chars. Access the variable as
 usual with the variable name: `{{my_long_variable_130:C:...}}`.
 
@@ -747,11 +696,11 @@ QFQ Keywords (Bodytext)
  | <level>.altsql    | If <level>.sql is empty, these query will be fired. No sub queries.             |
  |                   | Shown after `althead`                                                           |
  +-------------------+---------------------------------------------------------------------------------+
- | debugShowBodyText | If='1' and config.qfq.ini:*SHOW_DEBUG_INFO = yes*, shows a tooltip with bodytext|
+ | debugShowBodyText | If='1' and configuration_:*showDebugInfo: yes*, shows a tooltip with bodytext   |
  +-------------------+---------------------------------------------------------------------------------+
- | sqlLog            | Overwrites config.qfq.ini: `SQL_LOG`_ . Only affects `Report`, not `Form`.      |
+ | sqlLog            | Overwrites configuration_: `SQL_LOG`_ . Only affects `Report`, not `Form`.      |
  +-------------------+---------------------------------------------------------------------------------+
- | sqlLogMode        | Overwrites config.qfq.ini: `SQL_LOG_MODE`_ . Only affects `Report`, not `Form`. |
+ | sqlLogMode        | Overwrites configuration_: `SQL_LOG_MODE`_ . Only affects `Report`, not `Form`. |
  +-------------------+---------------------------------------------------------------------------------+
 
 .. _`qfq-database`:
@@ -815,26 +764,26 @@ A `Multi Database` setup is given, if 'QFQ system' is different from 'QFQ data'.
 Data: Data1, Data2, ..., Data n
 '''''''''''''''''''''''''''''''
 
-Every database needs to be configured via `config.qfq.ini`_ with it's own `index`.
+Every database needs to be configured via `configuration`_ with it's own `index`.
 
-`QFQ data` might switch between different 'data'-databases. In `config.qfq.ini` one main `QFQ data` index will be specified
-in `DB_INDEX_QFQ`. If specific forms or reports should use a different database than that, `dbIndex` might change
-`DB_INDEX_DATA` temporarily.
+`QFQ data` might switch between different 'data'-databases. In configuration_ one main `QFQ data` index will be specified
+in `indexQfq`. If specific forms or reports should use a different database than that, `dbIndex` might change
+`indexData` temporarily.
 
 `dbIndex`: A `Report` (field `dbIndex`) as well as a `Form` (field `parameter`.`dbIndex`) can operate on a specific database.
 
 
 A `Form` will:
 
-* load the own definition from `DB_INDEX_QFQ` (table `Form` and `FormElement`),
-* loads and save data from/in `DB_INDEX_DATA` (config.qfq.in) / `dbIndex` (form.parameter.dbIndex),
+* load the own definition from `indexQfq` (table `Form` and `FormElement`),
+* loads and save data from/in `indexData` (config.qfq.in) / `dbIndex` (form.parameter.dbIndex),
 * retrieve extra information via `dbIndexExtra` - this is useful to offer information from a database and save them in a
   different one.
 
-The simplest setup, QFQ system & data in the same database, needs no DB_INDEX_QFQ / DB_INDEX_DATA definition in
-`config.qfq.ini` or one or both of them set to '1'
+The simplest setup, QFQ system & data in the same database, needs no `indexQfq / indexData` definition in
+configuration_ or one or both of them set to '1'
 
-To separate QFQ system and data, DB_INDEX_QFQ and DB_INDEX_DATA will have different indexes.
+To separate QFQ system and data, indexQfq and indexData will have different indexes.
 
 
 A Multi Database setup might be useful for:
@@ -866,7 +815,7 @@ Note:
 | C | appC3.edu      | 'wAppC3'     | <dbHostAppC3>, <dbnameC3>_t3  | <dbHostC3>, <dbnameSysC3>_db | <dbHostData>_db, <dbNameData>_db |
 +---+----------------+--------------+-------------------------------+------------------------------+----------------------------------+
 
-In `config.qfq.ini`_ mutliple database credentials can be prepared. Mandatory is at least one credential setup like
+In config-qfq-ini_ mutliple database credentials can be prepared. Mandatory is at least one credential setup like
 `DB_1_USER`, `DB_1_SERVER`, `DB_1_PASSWORD`, `DB_1_NAME`. The number '1' indicates the `dbIndex`. Increment the number
 to specify further database credential setups.
 
@@ -887,14 +836,14 @@ Debug
 SQL Logging
 -----------
 
-File: `config.qfq.ini`_
+configuration_
 
 .. _SQL_LOG:
 
-* *SQL_LOG*
+* *sqlLog*
 
   * Filename where to log SQL queries and statistical data.
-  * File is relative to the extension directory or absolute (starting with '/').
+  * File is relative to the `<site path>` or absolute (starting with '/').
   * Content: SQL queries and timestamp, formName/formId, fe_user, success, affected rows, newly created record
     id's and accessed from IP.
   * The global setting can be overwritten by defining `sqlLog` inside of a QFQ tt-content record.
@@ -902,7 +851,7 @@ File: `config.qfq.ini`_
 
 .. _SQL_LOG_MODE:
 
-* *SQL_LOG_MODE = all|modify|error|none*
+* *sqlLogMode: all|modify|error|none*
 
   * *all*: logs every SQL statement.
   * *modify*: logs only statements who might potentially change data.
@@ -910,7 +859,7 @@ File: `config.qfq.ini`_
   * *none*: no query logging at all.
   * The global setting can be overwritten by defining `sqlLogMode` inside of a QFQ tt-content record.
 
-* *SHOW_DEBUG_INFO = [yes|no|auto],[download]*
+* *showDebugInfo = [yes|no|auto],[download]*
 
   If active, displays additional information in the Frontend (FE). This is typically helpful during development.
 
@@ -929,8 +878,8 @@ File: `config.qfq.ini`_
 
   * *auto*: Depending if there is a Typo3 BE session, set internally:
 
-    * *SHOW_DEBUG_INFO = yes*  (BE session exist)
-    * *SHOW_DEBUG_INFO = no*   (no BE session)
+    * *showDebugInfo = yes*  (BE session exist)
+    * *showDebugInfo = no*   (no BE session)
 
   * *download*:
 
@@ -942,9 +891,9 @@ File: `config.qfq.ini`_
 Redirect all mail to (catch all)
 --------------------------------
 
-File: `config.qfq.ini`_
+configuration_
 
-* *REDIRECT_ALL_MAIL_TO=john@doe.com*
+* *redirectAllMailTo=john@doe.com*
 
   * During the development, it might be helpful to configure a 'catch all' email address, which QFQ uses as the final receiver
     instead of the original intended one.
@@ -1073,12 +1022,12 @@ braces. ::
 
 	{{[1]SELECT ... }}
 
-For using the DB_INDEX_DATA and DB_INDEX_QFQ (`config.qfq.ini`_), it's a good practice to specify the variable name
+For using the indexData and indexQfq (configuration_), it's a good practice to specify the variable name
 instead of the numeric index. ::
 
-   {{[{{DB_INDEX_DATA:Y}}]SELECT ...}}
+   {{[{{indexData:Y}}]SELECT ...}}
 
-If no dbIndex is given, `{{DB_INDEX_DATA:Y}}` is used.
+If no dbIndex is given, `{{indexData:Y}}` is used.
 
 
 Example
@@ -1091,7 +1040,7 @@ Example
   {{SELECT id, city FROM Address AS adr WHERE adr.accId={{SELECT id FROM Account AS acc WHERE acc.name={{feUser:T0}} }} }}
   {{!SELECT id, name FROM Person}}
   {{[2]SELECT id, name FROM Form}}
-  {{[{{DB_INDEX_QFQ:Y}}]SELECT id, name FROM Form}}
+  {{[{{indexQfq:Y}}]SELECT id, name FROM Form}}
 
 .. _`row-column-variables`:
 
@@ -1125,7 +1074,7 @@ The following code will render a 'new person' button::
 
 	{{p:form&form=Person|s|N|t:new person AS link}}
 
-For better reading, the format string might be wrapped in single or double quotes (this ist optional): ::
+For better reading, the format string might be wrapped in single or double quotes (this is optional): ::
 
 	{{"p:form&form=Person|s|N|t:new person" AS link}}
 
@@ -1143,10 +1092,10 @@ Sanitize class
 Values in STORE_CLIENT *C* (Client=Browser) and STORE_FORM *F* (Form, HTTP 'post') are checked against a
 sanitize class. Values from other stores are not checked against any sanitize class.
 
-* If a value violates the specific sanitize class, the value becomes `!!<name of sanitize class>!!`. E.g. `!!gigit!!`.
+* If a value violates the specific sanitize class, the value becomes `!!<name of sanitize class>!!`. E.g. `!!digit!!`.
 * Variables get by default the sanitize class defined in the corresponding `FormElement`. If not defined,
   the default class is 'digit'.
-* A default sanitize class can be overwritten by individual definition: *{{a:C:all}}*
+* A default sanitize class can be overwritten by individual definition: *{{a:C:alnumx}}*
 
 For QFQ variables and FormElements:
 
@@ -1167,14 +1116,14 @@ For QFQ variables and FormElements:
 
 Only in FormElement:
 
-+------------------+------+-------+-----------------------------------------------------------------------------------------+
-| **auto**         | Form |       | Only supported for FormElements. Most suitable checktype is dynamically evaluated based |
-|                  |      |       | native column definition, the FormElement type, and other info. See below for details.  |
-+------------------+------+-------+-----------------------------------------------------------------------------------------+
-| **email**        | Form | Query | [a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}                                         |
-+------------------+------+-------+-----------------------------------------------------------------------------------------+
-| **pattern**      | Form |       | Compares the value against a regexp.                                                    |
-+------------------+------+-------+-----------------------------------------------------------------------------------------+
++------------------+------+-------+-------------------------------------------------------------------------------------------+
+| **auto**         | Form |       | Only supported for FormElements. Most suitable checktype is dynamically evaluated based   |
+|                  |      |       | on native column definition, the FormElement type, and other info. See below for details. |
++------------------+------+-------+-------------------------------------------------------------------------------------------+
+| **email**        | Form | Query | [a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}                                           |
++------------------+------+-------+-------------------------------------------------------------------------------------------+
+| **pattern**      | Form |       | Compares the value against a regexp.                                                      |
++------------------+------+-------+-------------------------------------------------------------------------------------------+
 
 
 Rules for CheckType Auto (by priority):
@@ -1203,19 +1152,19 @@ To protect the web application the following `escape` types are available:
 	* 'L' - LDAP DN values will be escaped. `ldap-escape() <http://php.net/manual/en/function.ldap-escape.php>`_ (LDAP_ESCAPE_DN).
 	* 's' - single ticks will be escaped. str_replace() of ' against \\'.
 	* 'd' - double ticks will be escaped: str_replace() of " against \\".
-	* 'c' - config - the escape type configured in `config.qfq.ini`_.
-	* ''  - the escape type configured in `config.qfq.ini`_.
+	* 'c' - config - the escape type configured in `configuration`_.
+	* ''  - the escape type configured in `configuration`_.
 	* '-' - no escaping.
 
 * The `escape` type is defined by the fourth parameter of the variable. E.g.: `{{name:FE:alnumx:m}}` (m = mysql).
 * It's possible to combine different `escape` types, they will be processed in the order given. E.g. `{{name:FE:alnumx:Ls}}` (L, s).
 * Escaping is typically necessary for SQL or LDAP queries.
 * Be careful when escaping nested variables. Best is to escape **only** the most outer variable.
-* In `config.qfq.ini`_ a global `ESCAPE_TYPE_DEFAULT` can be defined. The configured escape type applies to all substituted
+* In configuration_ a global `escapeTypeDefault` can be defined. The configured escape type applies to all substituted
   variables, who *do not* contain a *specific* escape type.
 * Additionally a `defaultEscapeType` can be defined per `Form` (separate field in the *Form editor*). This overwrites the
-  global definition of `config.qfq.ini`. By default, every `Form.defaultEscapeType` = 'c' (=config), which means the setting
-  in `config.qfq.ini`_.
+  global definition of `configuration`. By default, every `Form.defaultEscapeType` = 'c' (=config), which means the setting
+  in `configuration`_.
 * To suppress a default escape type, define the `escape type` = '-' on the specific variable. E.g.: `{{name:FE:alnumx:-}}`.
 
 Security
@@ -1224,18 +1173,18 @@ Security
 All values passed to QFQ will be:
 
 * Checked against max. length and allowed content, on the client and on the server side. On the server side, the check
-  happens before any further processing. The 'length' and 'allowed' content is specified per `FormElement`. 'alnumx' is the
-  default allowed content for those. Violating the rules will stop the 'save record' process (Form) or result in an empty value (Report).
+  happens before any further processing. The 'length' and 'allowed' content is specified per `FormElement`. 'digit' or
+  'alnumx' is the default. Violating the rules will stop the 'save record' process (Form) or result in an empty
+  value (Report). If a variable is not replaced, check the default sanitize class.
 
 * Only elements defined in the `Form` definition or requested by `Report` will be processed.
 
-* UTF8 normalized (normalizer::normalize) to unify different ways of composing characters. It's more a database interest
+* UTF8 normalized (normalizer::normalize) to unify different ways of composing characters. It's more a database interest,
   to work with unified data.
 
 SQL statements are typically fired as `prepared statements` with separated variables.
 Further *custom* SQL statements will be defined by the webmaster - those do not use `prepared statements` and might be
-affected by SQL injection. To prevent SQL injection, every variable can be escaped with `mysqli::real_escape_string` by
-defining the `escape` modifier `m`.
+affected by SQL injection. To prevent SQL injection, every variable is by default escaped with `mysqli::real_escape_string`.
 
 **QFQ notice**:
 
@@ -1250,7 +1199,12 @@ Get Parameter
 
 * GET parameter might contain urlencoded content (%xx). Therefore all GET parameter will be processed by 'urldecode()'.
   As a result a text like '%nn' in GET variables will always be decoded. It's not possible to transfer '%nn' itself.
-* GET variables are limited to SECURITY_GET_MAX_LENGTH chars - any violation will stop QFQ.
+
+* GET values are limited to securityGetMaxLength (extension-manager-qfq-configuration_) chars - any violation will
+  stop QFQ. Individual exceptions are defined via ExceptionMaxLength_.
+
+* GET parameter 'type' and 'L' might affected by (T3, configuration dependent) cache poisoning. If they contain non digit
+  values, only the first character is used (if this is a digit) or completely cleaned (else).
 
 Post Parameter
 --------------
@@ -1270,12 +1224,12 @@ Honeypot
 --------
 
 Every QFQ Form contains 'honeypot'-HTML input elements (HTML: hidden & readonly). Which of them to use is configured in
-`config.qfq.ini`_ (default:   'username', 'password' and 'email'). On every start of QFQ (form, report, save, ...),
+`configuration`_ (default:   'username', 'password' and 'email'). On every start of QFQ (form, report, save, ...),
 these variables are tested if they are non-empty. In such a case a probably malicous bot has send the request and the
 request will not be processed.
 
 If any of the default configured variable names are needed (which will never be the case for QFQ), an explicit variable name
-list have to be configured in `config.qfq.ini`_.
+list have to be configured in `configuration`_.
 
 **QFQ security restriction**:
 
@@ -1284,10 +1238,10 @@ list have to be configured in `config.qfq.ini`_.
 Violation
 ---------
 
-On any violation, QFQ will sleep SECURITY_ATTACK_DELAY seconds (`config.qfq.ini`_) and than exit the running PHP process.
+On any violation, QFQ will sleep `securityAttackDelaySeconds` (`configuration`_) and than exit the running PHP process.
 A detected attack leads to a complete white (=empty) page.
 
-If SECURITY_SHOW_MESSAGE = true (`config.qfq.ini`_), at least a message is displayed after the delay.
+If `securityShowMessage`: true (`configuration`_), at least a message is displayed after the delay.
 
 Client Parameter via SIP
 ------------------------
@@ -1301,11 +1255,11 @@ Variables needed by Typo3 remains on the link and are not 'sip-encoded'.
 
 .. _`SecureDirectFileAccess`:
 
-Secure direct fileaccess
-------------------------
+Secure direct file access
+-------------------------
 
 If the application uploads files, mostly it's not necessary and often a security issue, to offer a direct download of
-the uploaded files. Best is to create a directory, e.g. `fileadmin/protected` and deny direct access via webbrowser to it.
+the uploaded files. Best is to create a directory, e.g. `<site path>/fileadmin/protected` and deny direct access via webbrowser to it.
 E.g. for Apache set a htaccess rule: ::
 
 		<Directory "/var/www/html/fileadmin/protected">
@@ -1328,7 +1282,7 @@ This is in general a good security improvement for directories with user supplie
 File upload
 -----------
 
-By default the mime type of every uploaded file is checked against a whitelist of allowed mime types. The mime type of
+By default the mime type of every uploaded file is checked against a white list of allowed mime types. The mime type of
 a file can be (easily) faked by an attacker. This check is good to handle regular user file upload for specific file types. To
 prevent attacks against uploading and executing malicous code this won't help.
 
@@ -1606,63 +1560,8 @@ Store: *SYSTEM* - Y
 
 * Sanitized: *no*
 
- +-------------------------+--------------------------------------------------------------------------+
- | Name                    | Explanation                                                              |
- +=========================+==========================================================================+
- | DB_USER                 | defined in config.qfq.ini                                                |
- +-------------------------+--------------------------------------------------------------------------+
- | DB_SERVER               | defined in config.qfq.ini                                                |
- +-------------------------+--------------------------------------------------------------------------+
- | DB_NAME                 | defined in config.qfq.ini                                                |
- +-------------------------+--------------------------------------------------------------------------+
- | DB_INIT                 | defined in config.qfq.ini                                                |
- +-------------------------+--------------------------------------------------------------------------+
- | SQL_LOG                 | defined in config.qfq.ini, see `SQL_LOG`_                                |
- +-------------------------+--------------------------------------------------------------------------+
- | SQL_LOG_MODE            | defined in config.qfq.ini, `SQL_LOG_MODE`_                               |
- +-------------------------+--------------------------------------------------------------------------+
- | SHOW_DEBUG_INFO         | defined in config.qfq.ini                                                |
- +-------------------------+--------------------------------------------------------------------------+
- | CSS_LINK_CLASS_INTERNAL | defined in config.qfq.ini                                                |
- +-------------------------+--------------------------------------------------------------------------+
- | CSS_LINK_CLASS_EXTERNAL | defined in config.qfq.ini                                                |
- +-------------------------+--------------------------------------------------------------------------+
- | CSS_CLASS_QFQ_CONTAINER | defined in config.qfq.ini                                                |
- +-------------------------+--------------------------------------------------------------------------+
- | EXT_PATH                | computed during runtime                                                  |
- +-------------------------+--------------------------------------------------------------------------+
- | SITE_PATH               | computed during runtime                                                  |
- +-------------------------+--------------------------------------------------------------------------+
- | DATE_FORMAT             | defined in config.qfq.ini                                                |
- +-------------------------+--------------------------------------------------------------------------+
- | class                   | defined in config.qfq.ini (CSS_CLASS_QFQ_FORM) or form definition        |
- +-------------------------+--------------------------------------------------------------------------+
- | classPill               | defined in config.qfq.ini (CSS_CLASS_QFQ_FORM_PILL) or form definition   |
- +-------------------------+--------------------------------------------------------------------------+
- | classBody               | defined in config.qfq.ini (CSS_CLASS_QFQ_FORM_BODY) or form definition   |
- +-------------------------+--------------------------------------------------------------------------+
- | data-pattern-error      | defined in config.qfq.ini or form definition                             |
- +-------------------------+--------------------------------------------------------------------------+
- | data-require-error      | defined in config.qfq.ini or form definition                             |
- +-------------------------+--------------------------------------------------------------------------+
- | data-match-error        | defined in config.qfq.ini or form definition                             |
- +-------------------------+--------------------------------------------------------------------------+
- | data-error              | defined in config.qfq.ini or form definition                             |
- +-------------------------+--------------------------------------------------------------------------+
- | bsColumns               | defined in config.qfq.ini (FORM_BS_COLUMNS) or form definition           |
- +-------------------------+--------------------------------------------------------------------------+
- | bsLabelColumns          | defined in config.qfq.ini (FORM_BS_LABEL_COLUMNS) or form definition     |
- +-------------------------+--------------------------------------------------------------------------+
- | bsInputColumns          | defined in config.qfq.ini (FORM_BS_INPUT_COLUMNS) or form definition     |
- +-------------------------+--------------------------------------------------------------------------+
- | bsNoteColumns           | defined in config.qfq.ini (FORM_BS_NOTE_COLUMNS) or form definition      |
- +-------------------------+--------------------------------------------------------------------------+
- | sqlFinal                | computed during runtime, used for error reporting                        |
- +-------------------------+--------------------------------------------------------------------------+
- | sqlParamArray           | computed during runtime, used for error reporting                        |
- +-------------------------+--------------------------------------------------------------------------+
- | sqlCount                | computed during runtime, used for error reporting                        |
- +-------------------------+--------------------------------------------------------------------------+
+See configuration_ for a list of all settings.
+
 
 .. _LDAP:
 
@@ -1694,7 +1593,7 @@ To decide which Parameter should be placed on *Form.parameter* and which on *For
 +-----------------------------+----------------------------------+---------------------------------------------------------------+------+-------------+----------+
 | ldapTimeLimit               | 3 (default)                      | Maximum time to wait for an answer of the LDAP Server         | x    | x           | TA, FSL  |
 +-----------------------------+----------------------------------+---------------------------------------------------------------+------+-------------+----------+
-| ldapUseBindCredentials      | ldapUseBindCredentials=1         | Use LDAP_1_* crendentials from config.qfq.ini for ldap_bind() | x    | x           | TA, FSL  |
+| ldapUseBindCredentials      | ldapUseBindCredentials=1         | Use LDAP_1_* crendentials from config-qfq-ini_ for ldap_bind()| x    | x           | TA, FSL  |
 +-----------------------------+----------------------------------+---------------------------------------------------------------+------+-------------+----------+
 | typeAheadLdap               | -                                | Enable LDAP as 'Typeahead' data source                        |      | x           | TA       |
 +-----------------------------+----------------------------------+---------------------------------------------------------------+------+-------------+----------+
@@ -1720,7 +1619,7 @@ To decide which Parameter should be placed on *Form.parameter* and which on *For
 
 * *typeAheadLimit*: there might be a hard limit on the server side (e.g. 100) - which can't be extended.
 * *ldapUseBindCredentials* is only necessary if `anonymous` access is not possible. RDN and password has to be configured in
-  `config.qfq.ini`.
+  config-qfq-ini_.
 
 .. _LDAP_Typeahead:
 
@@ -1915,15 +1814,17 @@ General
 Record locking
 --------------
 
-Forms and 'record delete'-function support basic record locking. If a user opens a form and start to change content, a
+Forms and 'record delete'-function support basic record locking. A user opens a form: starting with the first change of content, a
 record lock will be acquired in the background. If the lock is denied (another user already owns a lock on the record) an
 alert is shown.
-By default the record lock mode is 'exclusive' and the default timeout is 15 minutes. Both can be configured per form. The
-initial default timeout can also be configured in `config.qfq.ini`_ (will be copied to the form during creating the form).
+By default the record lock mode is 'exclusive' and the default timeout is 15 minutes. Both can be configured per form.
+The general timeout can also be configured in configuration_ (will be copied to the form during creating the form).
+
+The lock timeout counts from the first change, not from the last modification on the form.
 
-If a timeout expires, the lock is deleted. During the next change in a form, the lock is acquired again.
+If a timeout expires, the lock becomes invalid. During the next change in a form, the lock is acquired again.
 
-A lock is assgined to a record of a table. Multiple forms, with the same primary table, uses the same lock for a given record.
+A lock is assigned to a record of a table. Multiple forms, with the same primary table, uses the same lock for a given record.
 
 If a `Form` acts on further records (e.g. via FE action), those records are not protected by this basic record locking.
 
@@ -2041,7 +1942,8 @@ Depending on `r`, the following access permission will be taken:
     'access granted'. The grant will be revoked when the QFQ session is destroyed - this happens when a user loggs out or
     the webbrowser is closed.
 
-* `logged_in` / `logged_out`: for forms which might be displayed without a SIP, but maybe on a protected or even unprotected page. *The option is probably not often used.*
+* `logged_in` / `logged_out`: for forms which might be displayed without a SIP, but maybe on a protected or even
+  unprotected page. *The option is probably not often used.*
 
 * `always`: such a form is always allowed to be loaded.
 
@@ -2167,7 +2069,7 @@ Parameter
 +-----------------------------+--------+----------------------------------------------------------------------------------------------------------+
 | Name                        | Type   | Description                                                                                              |
 +=============================+========+==========================================================================================================+
-| dbIndex                     | int    | Database credential index, given via `config.qfq.ini`_ to let the current `Form` operate on the database.|
+| dbIndex                     | int    | Database credential index, given via `config-qfq-ini`_ to let the current `Form` operate on the database.|
 +-----------------------------+--------+----------------------------------------------------------------------------------------------------------+
 | bsColumns                   | int    | Wrap the whole form in '<div class="col-md-??">                                                          |
 +-----------------------------+--------+----------------------------------------------------------------------------------------------------------+
@@ -2218,45 +2120,45 @@ Parameter
 | mode                        | string | The value `readonly` will activate a global readonly mode of the form - the user can't change any data.  |
 |                             |        | See :ref:`form-mode-global`                                                                              |
 +-----------------------------+--------+----------------------------------------------------------------------------------------------------------+
-| enterAsSubmit               | digit  | 0: off, 1: Pressing *enter* in a form means *save* and *close*. Takes default from `config.qfq.ini`_.    |
+| enterAsSubmit               | digit  | 0: off, 1: Pressing *enter* in a form means *save* and *close*. Takes default from configuration_.       |
 +-----------------------------+--------+----------------------------------------------------------------------------------------------------------+
 | submitButtonText            | string | Show a save button at the bottom of the form, with <submitButtonText> . See `submitButtonText`_.         |
 +-----------------------------+--------+----------------------------------------------------------------------------------------------------------+
 | saveButtonActive            | -      | Make the 'save'-button active on *Form* load (instead of waiting for the first user change).             |
 +-----------------------------+--------+----------------------------------------------------------------------------------------------------------+
-| saveButtonText              | string | Overwrite default from config.qfq.ini: SAVE_BUTTON_TEXT                                                  |
+| saveButtonText              | string | Overwrite default from configuration_                                                                    |
 +-----------------------------+--------+----------------------------------------------------------------------------------------------------------+
-| saveButtonTooltip           | string | Overwrite default from config.qfq.ini: SAVE_BUTTON_TOOLTIP                                               |
+| saveButtonTooltip           | string | Overwrite default from configuration_                                                                    |
 +-----------------------------+--------+----------------------------------------------------------------------------------------------------------+
-| saveButtonClass             | string | Overwrite default from config.qfq.ini: SAVE_BUTTON_CLASS                                                 |
+| saveButtonClass             | string | Overwrite default from configuration_                                                                    |
 +-----------------------------+--------+----------------------------------------------------------------------------------------------------------+
-| saveButtonGlyphIcon         | string | Overwrite default from config.qfq.ini: SAVE_BUTTON_GLYPH_ICON                                            |
+| saveButtonGlyphIcon         | string | Overwrite default from configuration_                                                                    |
 +-----------------------------+--------+----------------------------------------------------------------------------------------------------------+
-| closeButtonText             | string | Overwrite default from config.qfq.ini: CLOSE_BUTTON_TEXT                                                 |
+| closeButtonText             | string | Overwrite default from configuration_                                                                    |
 +-----------------------------+--------+----------------------------------------------------------------------------------------------------------+
-| closeButtonTooltip          | string | Overwrite default from config.qfq.ini: CLOSE_BUTTON_TOOLTIP                                              |
+| closeButtonTooltip          | string | Overwrite default from configuration_                                                                    |
 +-----------------------------+--------+----------------------------------------------------------------------------------------------------------+
-| closeButtonClass            | string | Overwrite default from config.qfq.ini: CLOSE_BUTTON_CLASS                                                |
+| closeButtonClass            | string | Overwrite default from configuration_                                                                    |
 +-----------------------------+--------+----------------------------------------------------------------------------------------------------------+
-| closeButtonGlyphIcon        | string | Overwrite default from config.qfq.ini: CLOSE_BUTTON_GLYPH_ICON                                           |
+| closeButtonGlyphIcon        | string | Overwrite default from configuration_                                                                    |
 +-----------------------------+--------+----------------------------------------------------------------------------------------------------------+
-| deleteButtonText            | string | Overwrite default from config.qfq.ini: DELETE_BUTTON_TEXT                                                |
+| deleteButtonText            | string | Overwrite default from configuration_                                                                    |
 +-----------------------------+--------+----------------------------------------------------------------------------------------------------------+
-| deleteButtonTooltip         | string | Overwrite default from config.qfq.ini: DELETE_BUTTON_TOOLTIP                                             |
+| deleteButtonTooltip         | string | Overwrite default from configuration_                                                                    |
 +-----------------------------+--------+----------------------------------------------------------------------------------------------------------+
-| deleteButtonClass           | string | Overwrite default from config.qfq.ini: DELETE_BUTTON_CLASS                                               |
+| deleteButtonClass           | string | Overwrite default from configuration_                                                                    |
 +-----------------------------+--------+----------------------------------------------------------------------------------------------------------+
-| deleteButtonGlyphIcon       | string | Overwrite default from config.qfq.ini: DELETE_BUTTON_GLYPH_ICON                                          |
+| deleteButtonGlyphIcon       | string | Overwrite default from configuration_                                                                    |
 +-----------------------------+--------+----------------------------------------------------------------------------------------------------------+
-| newButtonText               | string | Overwrite default from config.qfq.ini: NEW_BUTTON_TEXT                                                   |
+| newButtonText               | string | Overwrite default from configuration_                                                                    |
 +-----------------------------+--------+----------------------------------------------------------------------------------------------------------+
-| newButtonTooltip            | string | Overwrite default from config.qfq.ini: NEW_BUTTON_TOOLTIP                                                |
+| newButtonTooltip            | string | Overwrite default from configuration_                                                                    |
 +-----------------------------+--------+----------------------------------------------------------------------------------------------------------+
-| newButtonClass              | string | Overwrite default from config.qfq.ini: NEW_BUTTON_CLASS                                                  |
+| newButtonClass              | string | Overwrite default from configuration_                                                                    |
 +-----------------------------+--------+----------------------------------------------------------------------------------------------------------+
-| newButtonGlyphIcon          | string | Overwrite default from config.qfq.ini: NEW_BUTTON_GLYPH_ICON                                             |
+| newButtonGlyphIcon          | string | Overwrite default from configuration_                                                                    |
 +-----------------------------+--------+----------------------------------------------------------------------------------------------------------+
-| extraButtonInfoClass        | string | Overwrite default from config.qfq.ini: EXTRA_BUTTON_INFO_CLASS                                           |
+| extraButtonInfoClass        | string | Overwrite default from configuration_                                                                    |
 +-----------------------------+--------+----------------------------------------------------------------------------------------------------------+
 | fillStoreVar                | string | Fill the STORE_VAR with custom values. See `STORE_VARS`_.                                                |
 +-----------------------------+--------+----------------------------------------------------------------------------------------------------------+
@@ -2887,10 +2789,10 @@ extraButtonPassword
 extraButtonInfo
 ;;;;;;;;;;;;;;;
 
+* After Form load,  the `info` button/icon is shown but the information message is hidden.
 * The user has to click on the `info` button/icon to see an additional message.
-* After Form load, the information message is hidden.
-* The value of this parameter is the text shown.
-* Shows an `info` button/icon, depending of EXTRA_BUTTON_INFO_POSITION in `config.qfq.ini`_
+* The value of this parameter is the text shown to the user.
+* Shows an `info` button/icon, depending of `extraButtonInfoPosition` in configuration_
 
   * `auto`, depending on `FormElement` type:
 
@@ -2899,8 +2801,8 @@ extraButtonInfo
 
   * `below`: below the FormElement for all types.
 
-* With display `below`, a defined class in `extraButtonInfoClass` (FE, F, config.qfq.ini) will be applied. E.g. this
-  might be `pull-right` to align the grafic on the right side of the input element.
+* For `FormElement` with mode `below`, a `span` element with the given class in `extraButtonInfoClass` (FE, F, configuration_)
+  will be applied. E.g. this might be `pull-right` to align the `info` button/icon on the right side below the input element.
 
 .. _`input-checkbox`:
 
@@ -3460,13 +3362,15 @@ See also `downloadButton`_ to offer a download of an uploaded file.
 
 .. _`downloadButton`:
 
-  * *downloadButton* = `<string>` - If given, shows a button to download the previous uploaded file - instead of the string given in
-    `fe.value`. It's important that `fe.value` points to a readable file on the server.
+  * *downloadButton* = `t:<string>` - If given, shows a button to download the previous uploaded file - instead of the string given in
+    `fe.value`. The button is only shown if `fe.value` points to a readable file on the server.
 
-    * If `downloadButton` ist empty, just shows the regular download glyph.
+    * If `downloadButton` is empty, just shows the regular download glyph.
     * To just show the filename: `downloadButton = t:{{filenameOnly:V}}`
     * Additional attributes might be given like `downloadButton = t:Download|o:check file`. Please check `download`_.
 
+      * The following attributes are hard coded (can't be changed): `s|M:file|d|F`
+
   * fileSplit, fileDestinationSplit, tableNameSplit: see split-pdf-upload_
 
 Immediately after the upload finished (before the user press save), the file will be checked on the server for it's
@@ -3565,7 +3469,7 @@ page. The split is done via http://www.cityinthesky.co.uk/opensource/pdf2svg/.
    * *fileSplit* = `<type>` - Activate the splitting process. Only possible value: `fileSplit=svg`.
    * *fileDestinationSplit* = `<pathFileName (pattern)>` - Target directory and filename pattern for the created & split'ed files. E.g. ::
 
-     fileDestinationSplit = fileadmin/protected/{{id:R}}.{{filenameBase}}.%02d.svg
+       fileDestinationSplit = fileadmin/protected/{{id:R}}.{{filenameBase}}.%02d.svg
 
    * *tableNameSplit* = `<tablename>` - Reference in table 'Split' to the table, which holds the original PDF file.
 
@@ -3874,11 +3778,11 @@ Multi Language Form
 -------------------
 
 QFQ Forms might be configured for up to 5 different languages. Per language there is one extra field in the *Form editor*.
-Which field represents which language is configured in `config.qfq.ini`_.
+Which field represents which language is configured in configuration_.
 
 * The Typo3 installation needs to be configured to handle different languages - this is independet of QFQ and not covered
   here. QFQ will use the Typo3 internal variable 'pageLanguage', which typically correlates to the URL parameter 'L' in the URL.
-* In `config.qfq.ini`_ the Typo3 language index (value of 'L') and a language label have to be configured for each language.
+* In configuration_ the Typo3 language index (value of 'L') and a language label have to be configured for each language.
   Only than, the additional language fields in the *Form editor* will be shown.
 
 Example
@@ -3890,15 +3794,15 @@ Assuming the Typo3 page has the
 * english, L=1
 * spain, L=2
 
-Configuration in `config.qfq.ini`: ::
+Configuration in configuration_: ::
 
-		FORM_LANGUAGE_A_ID = 1
-		FORM_LANGUAGE_A_LABEL = english
+		formLanguageAId = 1
+		formLanguageALabel = english
 
-		FORM_LANGUAGE_B_ID = 2
-		FORM_LANGUAGE_B_LABEL = spain
+		formLanguageBId = 2
+		formLanguageBLabel = spain
 
-The default language is not covered in config.qfq.ini.
+The default language is not covered in configuration_.
 
 The *Form editor* now shows on the pill 'Basic' (Form und FormEditor) for both languages each an additional parameter
 input field. Any input field in the *Form editor* can be redeclared in the correspondig language parameter field. Any
@@ -4016,7 +3920,7 @@ column on the right side will be rendered.
 
 The used default column (=bootstrap grid) width is *3,6,3* for *label, input, note*.
 
-* The system wide default can be changed via `config-qfq-ini`_ - the new settings are the default
+* The system wide default can be changed via `configuration`_ - the new settings are the default
   settings for all forms.
 * Per *Form* settings can be done in the *Form* parameter field. They overwrite the system wide default.
 * Per *FormElement* settings can be done in the *FormElement* parameter field. They overwrite the *Form* setting.
@@ -4193,7 +4097,7 @@ Support for record locking is given with mode:
 
 * *exclusive*: user can't force a write.
 
-  * Including a timeout (default 15 mins: DIRTY_RECORD_TIMEOUT_SECONDS in `config.qfq.ini`_) for maximum lock time.
+  * Including a timeout (default 15 mins dirtyRecordTimeoutSeconds in configuration_) for maximum lock time.
 
 * *advisory*: user is only warned, but allowed to overwrite.
 * *none*: no bookeeping about locks.
@@ -4221,7 +4125,7 @@ corresponding value from STORE_SIP will be returned. Existing records will use t
 Central configured values
 ^^^^^^^^^^^^^^^^^^^^^^^^^
 
-Any variable in *config.qfq.ini* can be used by *{{<varname>:Y}}* in form or report statements.
+Any variable in configuration_ can be used by *{{<varname>:Y}}* in form or report statements.
 
 E.g.
 
@@ -4237,15 +4141,15 @@ Best for debugging is to specify in the tt-content record::
 
   debugShowBodyText = 1
 
-Note: Debug information is only display if it's enabled in  *config.qfq.ini* by
+Note: Debug information is only display if it's enabled in  configuration_ by
 
- * *SHOW_DEBUG_INFO=yes* or
- * *SHOW_DEBUG_INFO=auto* and logged in in the same Browser as a Typo3 backend user.
+ * *showDebugInfo: yes* or
+ * *showDebugInfo: auto* and logged in in the same Browser as a Typo3 backend user.
 
 More detailed error messages
 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
-If *SHOW_DEBUG_INFO* is enabled, a full stacktrace and variable contents are displayed in case of an error.
+If *showDebugInfo* is enabled, a full stacktrace and variable contents are displayed in case of an error.
 
 Form search
 ^^^^^^^^^^^
@@ -4258,7 +4162,7 @@ QFQ content record::
     head = <form action='#' method='get'><input type='hidden' name='id' value='{{pageId:T}}'>Search: <input type='text' name='search' value='{{search:CE:all}}'><input type='submit' value='Submit'></form>
   }
 
-  # SQL statement will find and list all the relevant forms - be careful not to open a cross site scripting door: the parameter 'search' needs to be sanatized.
+  # SQL statement will find and list all the relevant forms - be careful not to open a cross site scripting door: the parameter 'search' needs to be sanitized.
   20 {
     sql = SELECT CONCAT('?detail&form=form&r=', f.id) AS _Pagee, f.id, f.name, f.title
               FROM Form AS f
@@ -4850,14 +4754,14 @@ There are extensive ways to wrap columns and rows. See :ref:`wrapping-rows-and-c
 
 Debug the bodytext
 ------------------
-The parsed bodytext could be displayed by activating 'SHOW_DEBUG_INFO ' (:ref:`debug`) and specifying
+The parsed bodytext could be displayed by activating 'showDebugInfo' (:ref:`debug`) and specifying
 
 ::
 
     debugShowBodyText = 1
 
 A small symbol with a tooltip will be shown, where the content record will be displayed on the webpage.
-Note: :ref:`debug` information will only be shown with *SHOW_DEBUG_INFO = yes* in config.qfq.ini .
+Note: :ref:`debug` information will only be shown with *showDebugInfo: yes* in configuration_.
 
 Structure
 ---------
@@ -5254,6 +5158,21 @@ Column: _link
 Render mode
 ^^^^^^^^^^^
 
+The following table might be hard to read - but it's really useful to understand. It solves a lot of different situations.
+If there are no special condition (like missing value, or suppressed links), render mode 0 is sufficient.
+But if the URL text is missing, or the URL is missing, OR the link should be rendered in sql row 1-10, but not 5, than
+render mode might dynamically control the rendered link.
+
+* Horizontal:
+
+  * If 'url & text' is given, column 2 shows the result.
+  * If only 'url' is given, column 3 shows the result.
+  * If only 'text' is given, column 4 shows the result.
+
+* Vertical:
+
+  * Column 0 is the render mode and controls how the link is rendered.
+
 +-----------+--------------------+-------------------+----------+-----------------------------------------------------------------------+
 |Mode       |Both: url & text    |Only: url          |Only: text|Description                                                            |
 +===========+====================+===================+==========+=======================================================================+
@@ -5274,6 +5193,10 @@ Render mode
 |7          | pure url           |pure url           |          |no link, pure url                                                      |
 +-----------+--------------------+-------------------+----------+-----------------------------------------------------------------------+
 
+::
+
+    10.sql = SELECT CONCAT('u:', p.homepage, IF(p.showHomepage='yes','|r:0', '|r:5') ) AS _link FROM Person AS p
+
 
 Link Examples
 ^^^^^^^^^^^^^
@@ -6186,7 +6109,7 @@ used. Office file formats are not supported. Due to speed and quality reasons, S
 If a file format is not known, QFQ tries to show a corresponding file type image provided by Typo3 - such an image is not
 scaled.
 
-In `config.qfq.ini`_ the exact location of `convert` and `inkscape` can be configured (optional) as well as the directory
+In configuration_ the exact location of `convert` and `inkscape` can be configured (optional) as well as the directory
 names for the cached thumbnails.
 
 +-------+--------------------------------+----------------------------------------------------------------------------+
@@ -6250,7 +6173,7 @@ Thumbnail: secure
 '''''''''''''''''
 
 Mode 'secure' is activated via enabling SIP (`s:1`, default). The thumbnail is saved under the path `thumbnailDirSecure`
-as configured in `config.qfq.ini`_.
+as configured in configuration_.
 
 The secure path needs to be protected against direct file access by the webmaster / webserver configuration too.
 
@@ -6262,7 +6185,7 @@ Thumbnail: public
 '''''''''''''''''
 
 Mode 'public' has to be explicit activated by specifying `s:0`. The thumbnail is saved under the path `thumbnailDirPublic`
-as configured in `config.qfq.ini`_.
+as configured in configuration_.
 
 QFQ returns a HTML 'img'-tag: ::
 
@@ -6599,7 +6522,7 @@ FormElement) forms: ::
 
 .. _`system`:
 
-SYSTEM
+System
 ======
 
 .. _`autocron`:
@@ -6607,10 +6530,13 @@ SYSTEM
 AutoCron
 --------
 
-The `AutoCron` service fires periodically jobs like `open a webpage` or `send mail`.
+The `AutoCron` service fires periodically jobs like `open a webpage` (typically a QFQ page which does some database
+actions) or `send mail`.
+
+* AutoCron will be triggered via system cron. Minimal time distance therefore is 1 minute. If this is not sufficient,
+  any process who starts `.../typo3conf/ext/qfq/qfq/external/autocron.php` via `/usr/bin/php` frequently might be used.
 
-* Will be triggered via system cron. Minimal time distance is 1 minute.
-* Starttime and frequency configureable.
+* Custom start time and frequency.
 * Per job:
 
   * If a job still runs and receives the next trigger, the running job will be completed first.
@@ -6623,17 +6549,28 @@ The `AutoCron` service fires periodically jobs like `open a webpage` or `send ma
 Setup
 ^^^^^
 
-Setup a system cron entry, typically as the webserver user ('www-data' on debian): ::
+* Setup a system cron entry, typically as the webserver user ('www-data' on debian).
+* Necessary privileges:
+
+  * Read for `.../typo3conf/ext/qfq/*`
+  * Write, if a logfile should be written (specified per cron job) in the custom specified directory.
+
+Cron task:  ::
 
   * * * * * /usr/bin/php /var/www/html/typo3conf/ext/qfq/qfq/external/autocron.php
 
+AutoCron Jobs of type 'website' needs the php.ini setting: ::
+
+  allow_url_fopen = On
+
+
 Create / edit `AutoCron` jobs
 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
 Create a T3 page with a QFQ record (similar to the formeditor). Such page should be access restricted and is only needed
 to edit `AutoCron` jobs: ::
 
-	dbIndex={{DB_INDEX_QFQ:Y}}
+	dbIndex={{indexQfq:Y}}
 	form={{form:S}}
 
 	10 {
@@ -6704,9 +6641,9 @@ If `nextRun` is > 0 and in the past, the job will be fired. After the job has be
 
 This is useful for jobs which have to be fired from time to time.
 
-To fire such an asynchronous job, just set `nextRun`=NOW() and wait for the next system cron run.
+To fire such an asynchronous job, just set `nextRun=NOW()` and wait for the next system cron run.
 
-If such a job is running and a new `nextRun`=NOW() is applied, the 'AutoCron' job will be fired again during the next
+If such a job is running and a new `nextRun=NOW()` is applied, the 'AutoCron' job will be fired again during the next
 system cron run.
 
 
@@ -6738,15 +6675,40 @@ Also `overwrite` or `append` can be selected for the output file. In case of `ap
  OS level.
 
 To check for a successful DB connection, it's a good practice to report a custom token on the T3 page / QFQ record like
-'DB Connect: ok'. Such a string can be checked via `Pattern to look for on output`=`/DB Connect: ok/`. The pattern
+'DB Connect: ok'. Such a string can be checked via `Pattern to look for on output=/DB Connect: ok/`. The pattern
 needs to be written in PHP PCRE syntax. For a simple search string, just surround them with '/'.
 If the pattern is found on the page, the job get's 'Ok' - else 'Error - ...'.
 
+Access restriction
+;;;;;;;;;;;;;;;;;;
+
+To protect AutoCron pages not to be triggered accidental or by unprivileged access, access to those page tree might be
+limited to localhost. Some example Typoscript: ::
+
+	# Access allowed for any logged in user or via 'localhost'
+	[usergroup = *] || [IP = 127.0.0.1]
+	  page.10 < styles.content.get
+	[else]
+	  # Error Message
+	  page.10 = TEXT
+	  page.10.value = <h2>Access denied</h2>Please log in or access this page from an authorized host. Your current IP address:&nbsp;
+	  page.20 = TEXT
+	  page.20.data = getenv : REMOTE_ADDR
+	[global]
+
+
+
+AutoCron / website: HTTPS protocol
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+* For `https` the PHP extension `php_openssl` has to be installed.
+* All certificates are accepted, even self signed without a correct chain or hostnames, not listed in the certificate.
+  This is useful if there is a general 'HTTP >> HTTPS' redirection configured and the website is accessed via `https://localhost/...`
 
 .. _help:
 
-Help
-====
+General Tips
+============
 
 * Does the error happens on every *page* or only on specific one?
 * Does the error happens on every *form* or only on specific one?
diff --git a/extension/Documentation/Release.rst b/extension/Documentation/Release.rst
index baafe16f05c4c5830de708457ef6bdcd6fefd871..69bee416733fb2a5d668b1a0b749d91c5ebfe3ea 100644
--- a/extension/Documentation/Release.rst
+++ b/extension/Documentation/Release.rst
@@ -36,6 +36,75 @@ Features
 Bug Fixes
 ^^^^^^^^^
 
+Version 18.4.4
+--------------
+
+Date: 28.04.18
+
+Bug Fixes
+^^^^^^^^^
+
+* Fix broken ext_emconf.php
+
+Version 18.4.3
+--------------
+
+Date: 28.04.18
+
+Bug Fixes
+^^^^^^^^^
+
+* Version Number ...04... not supported by TE. Changing naming scheme to omit leading zero.
+
+Version 18.04.1
+---------------
+
+Date: 28.04.2018
+
+Bug Fixes
+^^^^^^^^^
+
+* config: broken dbIndexQfq, dbIndexData
+
+Version 18.04.0
+---------------
+
+Date: 26.04.2018
+
+Notes
+^^^^^
+
+* QFQ marked as 'stable'
+* New version numbering: Year.Month.Index
+* Manual.rst:
+
+  * AutoCron documentation enhanced.
+  * Replace '{{form:S}}' against '{{form:SE}}'.
+  * Check list for 'new installations'.
+  * Description for config variables enhanced.
+  * Details 'how record locking' is done.
+  * Details: extraButtonInfo
+  * Replace config.qfq.ini on most places with 'configuration'
+
+* Path of 'sql.log' / 'mail.log' are now relative to <site path> (not <ext path> as before).
+
+Features
+^^^^^^^^
+
+* formEditor.sql: update table cron.
+* AutoCron.php: allow https connections with invalid certificate (e.g. 'localhost' is not listed as a valid hostname).
+* ext_conf_template.txt: Extension manager configuration setup.
+
+Bug Fixes
+^^^^^^^^^
+
+* AutoCron:
+
+  * Update form 'cron' to load/save records in DB_INDEX_QFQ
+  * Fix problem with array in checkForOldJobs().
+  * Implement check that re-trigger asynchronous cron jobs are handled correctly.
+
+
 
 Version 0.25.15
 ---------------
@@ -334,8 +403,8 @@ Bug Fixes
 
 * #4865 / Pill Dynamic Updates Show / Hide
 * #5031 / Missing details in DbException: New definition of SYSTEM_SHOW_DEBUG_INFO: even after config.qfq.ini is parsed
-   and SIP Infos has been read - if there is no BE User logged in, the value stays on 'auto' (earlier it has been replaced
-   to 'no'). Staying on 'auto' keeps the information that replacing is still open and not replaced means 'no'-BE User logged in.
+  and SIP Infos has been read - if there is no BE User logged in, the value stays on 'auto' (earlier it has been replaced
+  to 'no'). Staying on 'auto' keeps the information that replacing is still open and not replaced means 'no'-BE User logged in.
 * #5016 / Loose checkbox value on save - Dirty workaround - better solution necessary.
 * #5017 / STORE_RECORD used in FormElement and via '#!report' - save & restore STORE_RECORD.
 * #5004 / FormElement with state 'ReadOnly' will be saved with empty value - existing values will be overwritten - fixed.
@@ -951,7 +1020,7 @@ Features
 * New security option `escapeTypeDefault`: will be defined 1) sytem wide in config.qfq.ini, or 2) more specific per
   Form or 3) individually per variable. The later has priority.
 * #3544 / Form: view current form - It's now possible to direct view a form, which is currently loaded/edited in the
-   FormEditor: Button 'eye' near left of button 'save'.
+  FormEditor: Button 'eye' near left of button 'save'.
 * #3552 / typeAheadLdapSearchPerToken - webpass kann nicht gleichzeitig nach Vornamen und Nachnamen suchen. Added option
   typeAheadLdapSearchPerToken to split search value in token and OR-combine every search with the individual tokens.
 * Download latest QFQ builds and releases: https://w3.math.uzh.ch/qfq/.
@@ -1043,7 +1112,7 @@ Bug Fixes
 
 * TypeAhead.js: Handle <ENTER> key properly.
 * #3462 / FormElement.parameter: requiredList not ok for non numeric content. STORE_FORM had been called without 'sanatize class'.
-   Therefore, all non numeric values has been sanatized by default. New: SANATIZE_ALLOW_ALL.
+  Therefore, all non numeric values has been sanatized by default. New: SANATIZE_ALLOW_ALL.
 * Corrected error message to use 'itemList' instead of 'itemValues'. Renamed constant too.
 * #2542 / FormElement-Typ 'note' funktioniert nicht mit dynamic update. 'Label' and 'note' are fixed - 'value' is still not updated, open.
 
@@ -1084,8 +1153,8 @@ Bug Fixes
  * #3419 / typeAheadSql: Array with only one column or non standard columnnames are not handeld properbly.
    Detection of missing LIMIT implemented.
  * #3425 / Form.parameter, FormElement.parameter: comment handling, trailing & leading spaces
-    Manual.rst: commented handling of 'comment character' and 'escaping of leading/trailing spaces'
-    Support.php: new funtion handleEscapeSpaceComment().
+   Manual.rst: commented handling of 'comment character' and 'escaping of leading/trailing spaces'
+   Support.php: new funtion handleEscapeSpaceComment().
  * Evaluate.php: parse all F|FE.parameter via handleEscapeSpaceComment(). A leading '#' or ' ' might be escaped by '\'.
  * Saving 'extra' FE in STORE_SIP has been done with inappropiate FE_NAME. Correct is the pure FE_NAME, without any
    extension like recordId. Unessary and broken decoding removed.
diff --git a/extension/Documentation/Settings.cfg b/extension/Documentation/Settings.cfg
index 365516c7b7d135cdbafb9eb54ec80e5dc348e798..e3a1de6fcc8716c7d18111f15e5cb23491a6b6b9 100644
--- a/extension/Documentation/Settings.cfg
+++ b/extension/Documentation/Settings.cfg
@@ -2,8 +2,8 @@
 [general]
 
 project     = QFQ - Quick Form Query
-version     = 0.25
-release     = 0.25.15a
+version     = 18.4
+release     = 18.4.4
 t3author    = Carsten Rose
 copyright   = since 2017 by the author
 
diff --git a/extension/Documentation/_make/conf.py b/extension/Documentation/_make/conf.py
index 5a973050b46dfb063258d5d47d407f438c9ed06a..095ec825396e8365b80c9215d31bd33afc8c3d21 100644
--- a/extension/Documentation/_make/conf.py
+++ b/extension/Documentation/_make/conf.py
@@ -57,9 +57,9 @@ copyright = u'2017, Carsten Rose'
 # built documents.lease
 #
 # The short X.Y version.
-version = '0.25'
+version = '18.4'
 # The full version, including alpha/beta/rc tags.
-release = '0.25.15a'
+release = '18.4.4'
 
 # The language for content autogenerated by Sphinx. Refer to documentation
 # for a list of supported languages.
diff --git a/extension/RELEASE.txt b/extension/RELEASE.txt
index baafe16f05c4c5830de708457ef6bdcd6fefd871..69bee416733fb2a5d668b1a0b749d91c5ebfe3ea 100644
--- a/extension/RELEASE.txt
+++ b/extension/RELEASE.txt
@@ -36,6 +36,75 @@ Features
 Bug Fixes
 ^^^^^^^^^
 
+Version 18.4.4
+--------------
+
+Date: 28.04.18
+
+Bug Fixes
+^^^^^^^^^
+
+* Fix broken ext_emconf.php
+
+Version 18.4.3
+--------------
+
+Date: 28.04.18
+
+Bug Fixes
+^^^^^^^^^
+
+* Version Number ...04... not supported by TE. Changing naming scheme to omit leading zero.
+
+Version 18.04.1
+---------------
+
+Date: 28.04.2018
+
+Bug Fixes
+^^^^^^^^^
+
+* config: broken dbIndexQfq, dbIndexData
+
+Version 18.04.0
+---------------
+
+Date: 26.04.2018
+
+Notes
+^^^^^
+
+* QFQ marked as 'stable'
+* New version numbering: Year.Month.Index
+* Manual.rst:
+
+  * AutoCron documentation enhanced.
+  * Replace '{{form:S}}' against '{{form:SE}}'.
+  * Check list for 'new installations'.
+  * Description for config variables enhanced.
+  * Details 'how record locking' is done.
+  * Details: extraButtonInfo
+  * Replace config.qfq.ini on most places with 'configuration'
+
+* Path of 'sql.log' / 'mail.log' are now relative to <site path> (not <ext path> as before).
+
+Features
+^^^^^^^^
+
+* formEditor.sql: update table cron.
+* AutoCron.php: allow https connections with invalid certificate (e.g. 'localhost' is not listed as a valid hostname).
+* ext_conf_template.txt: Extension manager configuration setup.
+
+Bug Fixes
+^^^^^^^^^
+
+* AutoCron:
+
+  * Update form 'cron' to load/save records in DB_INDEX_QFQ
+  * Fix problem with array in checkForOldJobs().
+  * Implement check that re-trigger asynchronous cron jobs are handled correctly.
+
+
 
 Version 0.25.15
 ---------------
@@ -334,8 +403,8 @@ Bug Fixes
 
 * #4865 / Pill Dynamic Updates Show / Hide
 * #5031 / Missing details in DbException: New definition of SYSTEM_SHOW_DEBUG_INFO: even after config.qfq.ini is parsed
-   and SIP Infos has been read - if there is no BE User logged in, the value stays on 'auto' (earlier it has been replaced
-   to 'no'). Staying on 'auto' keeps the information that replacing is still open and not replaced means 'no'-BE User logged in.
+  and SIP Infos has been read - if there is no BE User logged in, the value stays on 'auto' (earlier it has been replaced
+  to 'no'). Staying on 'auto' keeps the information that replacing is still open and not replaced means 'no'-BE User logged in.
 * #5016 / Loose checkbox value on save - Dirty workaround - better solution necessary.
 * #5017 / STORE_RECORD used in FormElement and via '#!report' - save & restore STORE_RECORD.
 * #5004 / FormElement with state 'ReadOnly' will be saved with empty value - existing values will be overwritten - fixed.
@@ -951,7 +1020,7 @@ Features
 * New security option `escapeTypeDefault`: will be defined 1) sytem wide in config.qfq.ini, or 2) more specific per
   Form or 3) individually per variable. The later has priority.
 * #3544 / Form: view current form - It's now possible to direct view a form, which is currently loaded/edited in the
-   FormEditor: Button 'eye' near left of button 'save'.
+  FormEditor: Button 'eye' near left of button 'save'.
 * #3552 / typeAheadLdapSearchPerToken - webpass kann nicht gleichzeitig nach Vornamen und Nachnamen suchen. Added option
   typeAheadLdapSearchPerToken to split search value in token and OR-combine every search with the individual tokens.
 * Download latest QFQ builds and releases: https://w3.math.uzh.ch/qfq/.
@@ -1043,7 +1112,7 @@ Bug Fixes
 
 * TypeAhead.js: Handle <ENTER> key properly.
 * #3462 / FormElement.parameter: requiredList not ok for non numeric content. STORE_FORM had been called without 'sanatize class'.
-   Therefore, all non numeric values has been sanatized by default. New: SANATIZE_ALLOW_ALL.
+  Therefore, all non numeric values has been sanatized by default. New: SANATIZE_ALLOW_ALL.
 * Corrected error message to use 'itemList' instead of 'itemValues'. Renamed constant too.
 * #2542 / FormElement-Typ 'note' funktioniert nicht mit dynamic update. 'Label' and 'note' are fixed - 'value' is still not updated, open.
 
@@ -1084,8 +1153,8 @@ Bug Fixes
  * #3419 / typeAheadSql: Array with only one column or non standard columnnames are not handeld properbly.
    Detection of missing LIMIT implemented.
  * #3425 / Form.parameter, FormElement.parameter: comment handling, trailing & leading spaces
-    Manual.rst: commented handling of 'comment character' and 'escaping of leading/trailing spaces'
-    Support.php: new funtion handleEscapeSpaceComment().
+   Manual.rst: commented handling of 'comment character' and 'escaping of leading/trailing spaces'
+   Support.php: new funtion handleEscapeSpaceComment().
  * Evaluate.php: parse all F|FE.parameter via handleEscapeSpaceComment(). A leading '#' or ' ' might be escaped by '\'.
  * Saving 'extra' FE in STORE_SIP has been done with inappropiate FE_NAME. Correct is the pure FE_NAME, without any
    extension like recordId. Unessary and broken decoding removed.
diff --git a/extension/config.qfq.example.ini b/extension/config.qfq.example.ini
index ecf49f764eb57936c2bbc4471b8e205a951443dc..db74dec2bf5d278e432d2e82a572d11867e2b21a 100644
--- a/extension/config.qfq.example.ini
+++ b/extension/config.qfq.example.ini
@@ -1,18 +1,6 @@
 ; QFQ configuration
 ;
-; Save this file as: <Documentroot>/typo3conf/config.qfq.ini
-
-; Configure own URL, where `wkhtmltopdf` fetches pages and produces PDFs
-BASE_URL_PRINT = http://url.my/
-; WKHTMLTOPDF = /opt/wkhtmltox/bin/wkhtmltopdf
-
-; DB_INIT = set names utf8
-
-; auto | always | never
-; DB_UPDATE = auto
-
-; DB_INDEX_DATA = 1
-; DB_INDEX_QFQ = 1
+; Save this file as: <site path>/typo3conf/config.qfq.ini
 
 DB_1_USER = <DBUSER>
 DB_1_SERVER = <DBSERVER>
@@ -24,113 +12,6 @@ DB_1_NAME = <DB>
 ; DB_2_PASSWORD = <DBPW>
 ; DB_2_NAME = <DB>
 
-; '../../sql.log' = <T3 Install directory>/typo3conf/sql.log
-; SQL_LOG = ../../sql.log
-
-; all|modify|error|none
-; SQL_LOG_MODE = modify
-
-; MAIL_LOG = ../../mail.log
-; SEND_E_MAIL_OPTIONS = "-o ... "  - check http://caspian.dotconf.net/menu/Software/SendEmail
-
-; [auto|yes|no][,download]. 'auto': if BE User is logged in the value will be replaced by 'yes', else 'no'. Additional choose 'download'.
-; SHOW_DEBUG_INFO = auto
-
-; REDIRECT_ALL_MAIL_TO = john.doe@example.com
-
-; QFQ with own Bootstrap: 'container'. QFQ already nested in Bootstrap of mainpage: <empty>
-; CSS_CLASS_QFQ_CONTAINER =
-
-; Default background color, specified via CSS class
-; CSS_CLASS_QFQ_FORM =
-; CSS_CLASS_QFQ_FORM_PILL = qfq-color-grey-1
-; CSS_CLASS_QFQ_FORM_BODY = qfq-color-grey-2
-
-; yyyy-mm-dd, dd.mm.yyyy
-; DATE_FORMAT = yyyy-mm-dd
-
-; Access via {{TECHNICAL_CONTACT:Y}}
-; TECHNICAL_CONTACT = john@doe.com
-
-;  validator.js: data-pattern-error="", data-required-error="", data-match-error="", data-error=""
-; FORM_DATA_PATTERN_ERROR =
-; FORM_DATA_REQUIRED_ERROR =
-; FORM_DATA_MATCH_ERROR =
-; FORM_DATA_ERROR =
-
-;  Default width of whole form
-; FORM_BS_COLUMNS = 12
-
-;  Default size for Bootstrap Form Elements
-; FORM_BS_LABEL_COLUMNS = 3
-; FORM_BS_INPUT_COLUMNS = 6
-; FORM_BS_NOTE_COLUMNS = 3
-
-; EDIT_FORM_PAGE = form
-
 ; LDAP_1_RDN =
 ; LDAP_1_PASSWORD =
 
-; ESCAPE_TYPE_DEFAULT=m
-
-; SECURITY_VARS_HONEYPOT=email,username,password
-; SECURITY_ATTACK_DELAY=5
-; SECURITY_SHOW_MESSAGE=true
-; SECURITY_GET_MAX_LENGTH=50
-
-; GFX_EXTRA_BUTTON_INFO_INLINE = <img src="file.png">
-; GFX_EXTRA_BUTTON_INFO_BELOW = <img src="file.png">
-; EXTRA_BUTTON_INFO_POSITION = auto | below
-; EXTRA_BUTTON_INFO_POSITION_CLASS = pull-right
-
-; SAVE_BUTTON_TEXT =
-; SAVE_BUTTON_TOOLTIP = save
-; SAVE_BUTTON_CLASS = btn btn-default navbar-btn
-; SAVE_BUTTON_GLYPH_ICON = glyphicon-ok
-
-; CLOSE_BUTTON_TEXT =
-; CLOSE_BUTTON_TOOLTIP = close
-; CLOSE_BUTTON_CLASS = btn btn-default navbar-btn
-; CLOSE_BUTTON_GLYPH_ICON = glyphicon-remove
-
-; DELETE_BUTTON_TEXT =
-; DELETE_BUTTON_TOOLTIP = delete
-; DELETE_BUTTON_CLASS = btn btn-default navbar-btn
-; DELETE_BUTTON_GLYPH_ICON = glyphicon-trash
-
-; NEW_BUTTON_TEXT =
-; NEW_BUTTON_TOOLTIP = new
-; NEW_BUTTON_CLASS = btn btn-default navbar-btn
-; NEW_BUTTON_GLYPH_ICON = glyphicon-plus
-
-; RECORD_LOCK_TIMEOUT_SECONDS = 900
-
-; Local Documentation (doc fits to installed version):  typo3conf/ext/qfq/Documentation/html/Manual.html
-; DOCUMENTATION_QFQ = https://docs.typo3.org/typo3cms/drafts/github/T3DocumentationStarter/Public-Info-053/Manual.html
-
-; FILL_STORE_SYSTEM_BY_SQL_1 = "SELECT id AS _periodId FROM Period WHERE start<=NOW() ORDER BY start DESC LIMIT 1"
-; Important: only define an error message, if QFQ should stop running in case of an SQL error or not exact 1 record.
-; FILL_STORE_SYSTEM_BY_SQL_ERROR_MSG_1 = No current period found
-
-; FORM_LANGUAGE_A_ID =       E.g. FORM_LANGUAGE_A_ID = 1
-; FORM_LANGUAGE_A_LABEL =    E.g. FORM_LANGUAGE_A_ID = English
-
-; FORM_LANGUAGE_B_ID =       E.g. FORM_LANGUAGE_B_ID = 2
-; FORM_LANGUAGE_B_LABEL =    E.g. FORM_LANGUAGE_B_ID = French
-
-; FORM_LANGUAGE_C_ID =       E.g. FORM_LANGUAGE_C_ID = 3
-; FORM_LANGUAGE_C_LABEL =    E.g. FORM_LANGUAGE_C_ID = Spain
-
-; FORM_LANGUAGE_D_ID =       E.g. FORM_LANGUAGE_D_ID = 4
-; FORM_LANGUAGE_D_LABEL =    E.g. FORM_LANGUAGE_D_ID = Chinese
-
-; Pressing the 'enter' key is equal to save and close
-; enterAsSubmit = 1
-
-; Attention: be sure that 'fileadmin/protected' is really locked down by a webserver directive.
-;   See https://docs.typo3.org/typo3cms/drafts/github/T3DocumentationStarter/Public-Info-053/Manual.html#secure-direct-fileaccess
-;
-; thumbnailDirSecure = fileadmin/protected/qfqThumbnail
-; thumbnailDirPublic = typo3temp/qfqThumbnail
-; cmdInkscape = inkscape
-; cmdConvert = convert
diff --git a/extension/ext_conf_template.txt b/extension/ext_conf_template.txt
new file mode 100644
index 0000000000000000000000000000000000000000..eb6234e81348452b5988a96fba6b003756c99336
--- /dev/null
+++ b/extension/ext_conf_template.txt
@@ -0,0 +1,249 @@
+# cat=config/config; type=string; label=URL QFQ Documentation:Default is 'https://docs.typo3.org/typo3cms/drafts/github/T3DocumentationStarter/Public-Info-053/Manual.html'. Might be changed to a local repo. Every QFQ installation contains a local copy: <site path>/typo3conf/ext/qfq/Documentation/html/Manual.html (corresponds always to the QFQ version).
+documentation = https://docs.typo3.org/typo3cms/drafts/github/T3DocumentationStarter/Public-Info-053/Manual.html
+
+# cat=config/config; type=string; label=Thumbnail directory 'secure':Default is 'fileadmin/protected/qfqThumbnail'. Important: secure the directory (recursive) against direct access. Will be used by a special columnname '_thumbnail'.
+thumbnailDirSecure = fileadmin/protected/qfqThumbnail
+
+# cat=config/config; type=string; label=Thumbnail directory 'public':Default is 'typo3temp/qfqThumbnail'. Will be used by a special columnname '_thumbnail'.
+thumbnailDirPublic = typo3temp/qfqThumbnail
+
+# cat=config/config; type=string; label=Command 'inkscape':Default is 'inkscape'. Will be used to convert SVG to images (png). An empty string disables `inkscape`. If it is not available, `convert` will be used instead.
+cmdInkscape = inkscape
+
+# cat=config/config; type=string; label=Command 'convert':Default is 'convert'. Will be used to convert images to thumbnails. GraphicsMagics 'convert' is recommended.
+cmdConvert = convert
+
+# cat=config/config; type=string; label=Command 'wkhtmltopdf':Default is '/opt/wkhtmltox/bin/wkhtmltopdf'. Command to convert a HTML page to a PDF.
+cmdWkhtmltopdf = /opt/wkhtmltox/bin/wkhtmltopdf
+
+# cat=config/config; type=string; label=Base URL of the current Typo3 installation:Default is empty. Example: https://your.base.url/including/sub/dir. Will be used to convert local pages to PDF. For accessing protected pages, the current FE User session will be faked - therefore the exact URL is needed that cookies become valid.
+baseUrl =
+
+# cat=config/email; type=string; label=Options for SendEMail:Default is empty. General options. Check: http://caspian.dotconf.net/menu/Software/SendEmail. E.g.: 'sendEMail=-o tls=yes'
+sendEMailOptions =
+
+# cat=config/date; type=string; label=Date format:Default is 'dd.mm.yyyy'. Possible options: 'yyyy-mm-dd', 'dd.mm.yyyy'
+dateFormat = dd.mm.yyyy
+
+
+
+# cat=dynamic/config; type=string; label=Fill store 'SYSTEM' by SQL 1:Default is empty. SQL query fired during QFQ load. The result have to be exactly one row. That row will be merged to store 'SYSTEM'. Retrieve values via '{{column:Y}}'. Example 'SELECT id AS _periodId FROM Period WHERE start<=NOW() ORDER BY start DESC LIMIT 1'
+fillStoreSystemBySql1 =
+
+# cat=dynamic/config; type=string; label=Error message for SQL 1:Default is empty. Error message in case the SQL does not return exact one row. Important: if a message is given, QFQ will stop and return the message. Without a message: QFQ run's as there would be no 'fillStoreSystemStoreBySql1'.
+fillStoreSystemBySqlErrorMsg1 =
+
+# cat=dynamic/config; type=string; label=Fill store 'SYSTEM' by SQL 2:Default is empty. SQL query fired during QFQ load. The result have to be exactly one row. That row will be merged to store 'SYSTEM'. Retrieve values via '{{column:Y}}'. Example 'SELECT id AS _periodId FROM Period WHERE start<=NOW() ORDER BY start DESC LIMIT 1'
+fillStoreSystemBySql2 =
+
+# cat=dynamic/config; type=string; label=Error message for SQL 2:Default is empty. Error message in case the SQL does not return exact one row. Important: if a message is given, QFQ will stop and return the message. Without a message: QFQ run's as there would be no 'fillStoreSystemStoreBySql2'.
+fillStoreSystemBySqlErrorMsg2 =
+
+# cat=dynamic/config; type=string; label=Fill store 'SYSTEM' by SQL 3:Default is empty. SQL query fired during QFQ load. The result have to be exactly one row. That row will be merged to store 'SYSTEM'. Retrieve values via '{{column:Y}}'. Example 'SELECT id AS _periodId FROM Period WHERE start<=NOW() ORDER BY start DESC LIMIT 1'
+fillStoreSystemBySql3 =
+
+# cat=dynamic/config; type=string; label=Error message for SQL 3:Default is empty. Error message in case the SQL does not return exact one row. Important: if a message is given, QFQ will stop and return the message. Without a message: QFQ run's as there would be no 'fillStoreSystemStoreBySql3'.
+fillStoreSystemBySqlErrorMsg3 =
+
+
+
+
+# cat=debug/sql; type=string; label=SQL log mode:Default is 'modify'. A logfile of QFQ fired SQL statements will be written. Possible modes are 'all' - every statement will be logged (this might a lot). 'modify' - log only statements who change data. 'error' - log only DB errors. 'none' - log never.
+sqlLogMode = modify
+
+# cat=debug/sql; type=string; label=SQL log file:Default is 'typo3conf/sql.log'. A logfile of fired SQL statements. PathFile is absolute or relative to '<site path>'.
+sqlLog = typo3conf/sql.log
+
+# cat=debug/mail; type=string; label=Mail log file:Default is 'typo3conf/mail.log'. A logfile of sent mail. PathFile is absolute or relative to '<site path>'.
+mailLog = typo3conf/mail.log
+
+# cat=debug/info; type=string; label=Show debug info:Default is 'auto'. Possible values: [yes|no|auto][,download]. For 'auto': If a BE User is logged in, a debug information will be shown on the FE.
+showDebugInfo = auto
+
+# cat=debug/mail; type=string; label=Redirect all mail to ...:Default is empty. If set, redirect all QFQ generated mails (Form, Report) to the specified email address.
+redirectAllMailTo =
+
+
+# cat=database/db1; type=string; label=Init database:Default is 'set names utf8'. Optional. Might set specific settings.
+init = set names utf8
+
+# cat=database/db; type=string; label=Update QFQ database structures & data:Default is 'auto'. After installing a new QFQ version it might be necessary to apply updates to QFQ database structures and data. 'auto' - apply DB updates only if there is a newer version. 'always' - apply DB updates always, including play formEditor.sql every time QFQ is called - *not* recommended - slow! 'never' - never apply DB Updates.
+update = auto
+
+# cat=database/db; type=string; label=Database index for QFQ data:Default is '1'. Retrieve the current setting via {{_dbNameData:Y}}
+indexData = 1
+
+# cat=database/db; type=string; label=Database index for QFQ system:Default is '1'. Retrieve the current setting via {{_dbNameQfq:Y}}
+indexQfq = 1
+
+
+
+# cat=security/security; type=string; label=Escape type default:Default is 'm'. QFQ Variables `{{...}}` without an 'escape type' get this as default.
+escapeTypeDefault = m
+
+# cat=security/security; type=string; label=List of honeypot input elements:Default is 'email,username,password'. If empty: no check. All named strings will rendered as hidden INPUT elements. If a form submit contains values for those inputs, the POST is treated as an attack.
+securityVarsHoneypot = email,username,password
+
+# cat=security/security; type=string; label=Attack delay in seconds:Default is '5'. After a detected attack, the number of seconds to wait before the PHP process dies (and therefore the browser request deliver nothing).
+securityAttackDelay = 5
+
+# cat=security/security; type=string; label=Show an attack detected message:Default is 'true'. Show (return to browser) a message, that an attack has been detected. Should be 'false' for production sites.
+securityShowMessage = true
+
+# cat=security/security; type=string; label='GET'-Parameter max length:Default is '50'. GET vars longer than 'x' character triggers an `attack-detected`.
+securityGetMaxLength = 50
+
+
+
+
+
+# cat=form-config/config; type=string; label=Dirty record lock timeout (seconds):Default is '900'. Time in seconds to lock a record, starting from the first modification. If lock expires, it is acquired again on the next modification.
+recordLockTimeoutSeconds = 900
+
+# cat=form-config/config; type=string; label=Enter as submit:Default is '1'. '0'=off, '1'=Pressing 'enter' on an input, means 'save form and close'  (exception: 'textarea' and 'editor' elements).
+enterAsSubmit = 1
+
+
+# cat=form-config/config; type=string; label=Edit form page alias:Default is 'form'. T3 Pagealias to edit a form.
+editFormPage = form
+
+
+# cat=form-config/config; type=string; label=Form data pattern error message:Default is 'pattern error'. Customizable error message used in validator.js. 'pattern' violation.
+formDataPatternError = pattern error
+
+# cat=form-config/config; type=string; label=Form data required error message:Default is 'required error'. Customizable error message used in validator.js. 'required' violation.
+formDataRequiredError = required error
+
+# cat=form-config/config; type=string; label=Form data match error message:Default is 'match error'. Customizable error message used in validator.js. 'match' violation. Typically used to ensure that two given emails or passwords are identically.
+formDataMatchError = match error
+
+# cat=form-config/config; type=string; label=Form data error message:Default is 'error'. Customizable error message used in validator.js. generic violation.
+formDataError = error
+
+
+
+
+
+# cat=form-layout/layout; type=string; label=CSS class QFQ container:Default is empty. Empty, if the page content is already wrapped in a Bootstrap container. Else 'container'.
+cssClassQfqContainer =
+
+# cat=form-layout/layout; type=string; label=CSS class QFQ form:Default is empty. If given wrap around QFQ-Form. E.g. 'qfq-color-base'.
+cssClassQfqForm =
+
+# cat=form-layout/layout; type=string; label=CSS class of pills on the HTML form:Default is 'qfq-color-grey-1'. Wrap around title bar for pills: CSS Class, typically a background color.
+cssClassQfqFormPill =qfq-color-grey-1
+
+# cat=form-layout/layout; type=string; label=CSS class of the body of the HTML form:Default is 'qfq-color-grey-2'. Wrap around FormElements: CSS Class, typically a background color.
+cssClassQfqFormBody = qfq-color-grey-2
+
+
+# cat=form-layout/layout; type=string; label=Number of Bootstrap 'col-md-??' to wrap the 'whole form':Default is '12'. Bootstrap 12 column represents 100%.
+formBsColumns = 12
+
+# cat=form-layout/layout; type=string; label=Number of Bootstrap 'col-md-??' to wrap the 'label' column:Default is '3'.
+formBsLabelColumns = 3
+
+# cat=form-layout/layout; type=string; label=Number of Bootstrap 'col-md-??' to wrap the 'input' column:Default is '6'.
+formBsInputColumns = 6
+
+# cat=form-layout/layout; type=string; label=Number of Bootstrap 'col-md-??' to wrap the 'note' column:Default is '3'.
+formBsNoteColumns = 3
+
+
+# cat=form-layout/layout; type=string; label=ExtraButtonInfo symbol 'inline':Default is '<span class="glyphicon glyphicon-info-sign" aria-hidden="true"></span>'. The image appears inside of the formElement. If an `<img src="...">` tag is given, the PathFilename is relative to the Typo3 installation.
+extraButtonInfoInline = <span class="glyphicon glyphicon-info-sign" aria-hidden="true"></span>
+
+# cat=form-layout/layout; type=string; label=ExtraButtonInfo symbol 'below':Default is '<span class="glyphicon glyphicon-info-sign text-info" aria-hidden="true"></span>'. The Image appears below the formElement. If an `<img src="...">` tag is given, the PathFilename is relative to the Typo3 installation.
+extraButtonInfoBelow = <span class="glyphicon glyphicon-info-sign text-info" aria-hidden="true"></span>
+
+# cat=form-layout/layout; type=string; label=ExtraButtonInfo position:Default is 'auto'. 'auto' - the image appears inline in formElement types  `text`, `date`, `time` or `datetime` and below for all other. 'below' - the image appears always below the formelement.
+extraButtonInfoPosition = auto
+
+# cat=form-layout/layout; type=string; label=ExtraButtonInfoClass:Default is empty. Applies only to FormElements with final 'extraButtonInfoPosition=below'. Typically used to right align the icon. E.g. 'pull-right'
+extraButtonInfoClass =
+
+
+
+
+# cat=form-language/config; type=string; label=Language A id:Default is empty. ID (Typo3 parameter 'L') for language 'A'
+formLanguageAId =
+
+# cat=form-language/config; type=string; label=Language A label:Default is empty.  Label shown in *Form editor*, on the 'basic' tab.
+formLanguageALabel =
+
+# cat=form-language/config; type=string; label=Language B id:Default is empty. ID (Typo3 parameter 'L') for language 'A'
+formLanguageBId =
+
+# cat=form-language/config; type=string; label=Language B label:Default is empty.  Label shown in *Form editor*, on the 'basic' tab.
+formLanguageBLabel =
+
+# cat=form-language/config; type=string; label=Language C id:Default is empty. ID (Typo3 parameter 'L') for language 'A'
+formLanguageCId =
+
+# cat=form-language/config; type=string; label=Language C label:Default is empty.  Label shown in *Form editor*, on the 'basic' tab.
+formLanguageCLabel =
+
+# cat=form-language/config; type=string; label=Language D id:Default is empty. ID (Typo3 parameter 'L') for language 'A'
+formLanguageDId =
+
+# cat=form-language/config; type=string; label=Language D label:Default is empty.  Label shown in *Form editor*, on the 'basic' tab.
+formLanguageDLabel =
+
+
+# cat=form-button/layout; type=string; label=Save button 'text':Default empty - Text for the save button (top of the form).
+saveButtonText =
+
+# cat=form-button/layout; type=string; label=Save button 'tooltip':Default 'Save'
+saveButtonTooltip = Save
+
+# cat=form-button/layout; type=string; label=Save button 'CSS Class':Default 'btn btn-default navbar-btn'
+saveButtonClass = btn btn-default navbar-btn
+
+# cat=form-button/layout; type=string; label=Save button 'CSS class on change':Default 'alert-info btn-info'. If the data in a form has been changed, the save button gets the given class.
+saveButtonClassOnChange = alert-info btn-info
+
+# cat=form-button/layout; type=string; label=Save button 'glyph icon':Default 'glyphicon-ok'. Glyph icon shown on the save button.
+saveButtonGlyphIcon = glyphicon-ok
+
+
+# cat=form-button/layout; type=string; label=Close button 'text':Default empty - Text for the close button (top of the form).
+closeButtonText =
+
+# cat=form-button/layout; type=string; label=Close button 'tooltip':Default 'Close'
+closeButtonTooltip = Close
+
+# cat=form-button/layout; type=string; label=Close button 'CSS Class':Default 'btn btn-default navbar-btn'
+closeButtonClass = btn btn-default navbar-btn
+
+# cat=form-button/layout; type=string; label=close button 'glyph icon':Default 'glyphicon-remove'. Glyph icon shown on the close button.
+closeButtonGlyphIcon = glyphicon-remove
+
+
+# cat=form-button/layout; type=string; label=Delete button 'text':Default empty - Text for the delete button (top of the form).
+deleteButtonText =
+
+# cat=form-button/layout; type=string; label=Delete button 'tooltip':Default 'Delete'
+deleteButtonTooltip = Delete
+
+# cat=form-button/layout; type=string; label=Delete button 'CSS Class':Default 'btn btn-default navbar-btn'
+deleteButtonClass = btn btn-default navbar-btn
+
+# cat=form-button/layout; type=string; label=Delete button 'glyph icon':Default 'glyphicon-trash'. Glyph icon shown on the delete button.
+deleteButtonGlyphIcon = glyphicon-trash
+
+
+# cat=form-button/layout; type=string; label=New button 'text':Default empty - Text for the new button (top of the form).
+newButtonText =
+
+# cat=form-button/layout; type=string; label=New button 'tooltip':Default 'New'
+newButtonTooltip = New
+
+# cat=form-button/layout; type=string; label=New button 'CSS Class':Default 'btn btn-default navbar-btn'
+newButtonClass = btn btn-default navbar-btn
+
+# cat=form-button/layout; type=string; label=New button 'glyph icon':Default 'glyphicon-plus'. Glyph icon shown on the new button.
+newButtonGlyphIcon = glyphicon-plus
+
+
+
+
diff --git a/extension/ext_emconf.php b/extension/ext_emconf.php
index 3a2c34ffc1bc3c3b9c0b441dc8e8b6ba5c55524f..71147016b502ee8a0f7d73a6a565088dd562ee13 100644
--- a/extension/ext_emconf.php
+++ b/extension/ext_emconf.php
@@ -1,15 +1,24 @@
 <?php
 /**
- * @author Rafael Ostertag <rafael.ostertag@math.uzh.ch>
+ * @author Carsten Rose <carsten.rose@math.uzh.ch>
  */
 $EM_CONF[$_EXTKEY] = array(
-    'title' => 'QFQ Extension',
-    'description' => 'Quick Form Query Extension',
-    'category' => 'Frontend',
-    'author' => 'Carsten Rose, Rafael Ostertag',
+    'title' => 'Quick Form Query',
+    'description' => 'Create HTML output by using (native/extended) SQL (as page content records in T3 backend) and design HTML forms (in T3 frontend) with the QFQ FormEditor. Supports multiple databases and record locking.',
+    'category' => 'fe',
+    'author' => 'Carsten Rose, Benjamin Baer',
+    'author_email' => 'carsten.rose@math.uzh.ch',
     'dependencies' => 'fluid,extbase',
     'clearcacheonload' => true,
-    'state' => 'alpha',
-    'version' => '0.25.15'
+    'state' => 'stable',
+    'version' => '18.4.4',
+    'constraints' => [
+        'depends' => [
+            'typo3' => '6.0.0-9.2.99',
+        ],
+        'conflicts' => [],
+        'suggests' => [],
+    ],
+
 );
 
diff --git a/extension/ext_tables.php b/extension/ext_tables.php
index 57428c5a827245b453ecfa317ff5ab5d32f9dbe8..0c1b837eb130e31e93a9f5c7dda9529eab12fb6f 100644
--- a/extension/ext_tables.php
+++ b/extension/ext_tables.php
@@ -1,6 +1,6 @@
 <?php
 /**
- * @author Rafael Ostertag <rafael.ostertag@math.uzh.ch>
+ * @author Carsten Rose <carsten.rose@math.uzh.ch>
  */
 
 if (!defined('TYPO3_MODE')) {
@@ -11,7 +11,7 @@ if (!defined('TYPO3_MODE')) {
     'IMATHUZH.' . $_EXTKEY,
     'Qfq',
     'QFQ Element',
-    '../typo3conf/ext/qfq/ext_icon.png'
+    'typo3conf/ext/qfq/ext_icon.png'
 );
 
 /*
diff --git a/extension/qfq/api/file.php b/extension/qfq/api/file.php
index 2efcfb7e5b2c74d97839a6afefb202d342c76b07..4a36dd146b118b29c96810c9a95256251942c46a 100644
--- a/extension/qfq/api/file.php
+++ b/extension/qfq/api/file.php
@@ -34,8 +34,8 @@ require_once(__DIR__ . '/../qfq/File.php');
 
 $answer = array();
 
-$answer[API_MESSAGE] = '';
 $answer[API_STATUS] = API_ANSWER_STATUS_ERROR;
+$answer[API_MESSAGE] = '';
 
 try {
 
@@ -51,8 +51,6 @@ try {
     $answer[API_MESSAGE] = $e->formatMessage();
 } catch (qfq\CodeException $e) {
     $answer[API_MESSAGE] = $e->formatMessage();
-} catch (qfq\DbException $e) {
-    $answer[API_MESSAGE] = $e->formatMessage();
 } catch (\Exception $e) {
     $answer[API_MESSAGE] = "Generic Exception: " . $e->getMessage();
 }
diff --git a/extension/qfq/external/AutoCron.php b/extension/qfq/external/AutoCron.php
index 3111e6ef2989d63aaf3c3f350653c3584b59fd34..df5ccbde11eeac4506c38b580982b1479d860fdc 100644
--- a/extension/qfq/external/AutoCron.php
+++ b/extension/qfq/external/AutoCron.php
@@ -18,6 +18,10 @@ require_once(__DIR__ . '/../qfq/Evaluate.php');
 require_once(__DIR__ . '/../qfq/report/SendMail.php');
 require_once(__DIR__ . '/../qfq/helper/Support.php');
 
+/**
+ * Class AutoCron
+ * @package qfq
+ */
 class AutoCron {
 
     /**
@@ -45,6 +49,13 @@ class AutoCron {
     private $verbose = '';
 
 
+    /**
+     * AutoCron constructor.
+     * @param bool $verbose
+     * @param bool $phpUnit
+     * @throws CodeException
+     * @throws UserFormException
+     */
     public function __construct($verbose = false, $phpUnit = false) {
 
         $this->verbose = $verbose;
@@ -129,6 +140,8 @@ class AutoCron {
      * @param array $job
      *
      * @return array $job, updated with AUTOCRON_LAST_STATUS
+     * @throws CodeException
+     * @throws UserFormException
      */
     private function doJobWebsite(array $job) {
 
@@ -140,12 +153,18 @@ class AutoCron {
             // If the URL does not start with 'http...': prefix with the site config.
             if (substr($job[AUTOCRON_CONTENT], 0, 4) != 'http') {
                 // We need to prefix
-                $baseUrl = $this->store->getVar(SYSTEM_BASE_URL_PRINT, STORE_SYSTEM);
+                $baseUrl = $this->store->getVar(SYSTEM_BASE_URL, STORE_SYSTEM);
                 $job[AUTOCRON_CONTENT] = $baseUrl . $job[AUTOCRON_CONTENT];
             }
 
             // Download page
-            $page = file_get_contents($job[AUTOCRON_CONTENT]);
+            $ctx = array(
+                "ssl" => array(
+                    "verify_peer" => false,
+                    "verify_peer_name" => false,
+                ),
+            );
+            $page = file_get_contents($job[AUTOCRON_CONTENT], false, stream_context_create($ctx));
             if ($page === false) {
                 $job[AUTOCRON_LAST_STATUS] = htmlspecialchars(AUTOCRON_STATUS_ERROR . 'failed to fetch "' . $job[AUTOCRON_CONTENT] . '"');
 
@@ -206,6 +225,10 @@ class AutoCron {
      * @param array $job
      *
      * @return array $job, updated with AUTOCRON_LAST_STATUS
+     * @throws CodeException
+     * @throws DbException
+     * @throws UserFormException
+     * @throws UserReportException
      */
     private function doJobMail(array $job) {
 
@@ -254,6 +277,8 @@ class AutoCron {
      *
      * @throws CodeException
      * @throws DbException
+     * @throws ShellException
+     * @throws UserFormException
      */
     public function process() {
 
diff --git a/extension/qfq/qfq/AbstractBuildForm.php b/extension/qfq/qfq/AbstractBuildForm.php
index 7d527d2e4d962c08c0996b03ac63e99e8c42612b..567e30abf00d14f82bab928962d35643723a2249 100644
--- a/extension/qfq/qfq/AbstractBuildForm.php
+++ b/extension/qfq/qfq/AbstractBuildForm.php
@@ -86,6 +86,8 @@ abstract class AbstractBuildForm {
      * @param array $feSpecAction
      * @param array $feSpecNative
      * @param array $db
+     * @throws CodeException
+     * @throws UserFormException
      */
     public function __construct(array $formSpec, array $feSpecAction, array $feSpecNative, array $db = null) {
         $this->formSpec = $formSpec;
@@ -247,7 +249,11 @@ abstract class AbstractBuildForm {
     /**
      * Builds the head area of the form.
      *
+     * @param string $mode
      * @return string
+     * @throws CodeException
+     * @throws DbException
+     * @throws UserFormException
      */
     public function head($mode = FORM_LOAD) {
         $html = '';
@@ -278,6 +284,7 @@ abstract class AbstractBuildForm {
      * @return string String: <a href="?pageId&sip=....">Edit</a> <small>[sip:..., r:..., urlparam:...,
      *                ...]</small>
      * @throws CodeException
+     * @throws UserFormException
      */
     public function createFormEditorUrl($form, $recordId, array $param = array()) {
 
@@ -323,6 +330,8 @@ abstract class AbstractBuildForm {
      * Returns '<form ...>'-tag with various attributes.
      *
      * @return string
+     * @throws CodeException
+     * @throws DbException
      */
     public function getFormTag() {
         $md5 = '';
@@ -378,6 +387,7 @@ abstract class AbstractBuildForm {
      * Create HTML Input vars to detect bot automatic filling of forms.
      *
      * @return string
+     * @throws CodeException
      */
     public function getHoneypotVars() {
         $html = '';
@@ -402,6 +412,8 @@ abstract class AbstractBuildForm {
      * Build an assoc array with standard form attributes.
      *
      * @return array
+     * @throws CodeException
+     * @throws DbException
      */
     public function getFormTagAttributes() {
 
@@ -436,7 +448,6 @@ abstract class AbstractBuildForm {
      * Notice: the SIP will be transferred as POST Parameter.
      *
      * @return string
-     * @throws DbException
      */
     public function getActionUrl() {
 
@@ -449,6 +460,7 @@ abstract class AbstractBuildForm {
      * See: https://www.w3.org/wiki/HTML/Elements/form#HTML_Attributes
      *
      * @return string
+     * @throws CodeException
      * @throws DbException
      */
     public function getEncType() {
@@ -465,6 +477,7 @@ abstract class AbstractBuildForm {
      * @param array|string $value
      *
      * @return array|string
+     * @throws CodeException
      * @throws UserFormException
      */
     private function processReportSyntax($value) {
@@ -769,7 +782,10 @@ abstract class AbstractBuildForm {
     }
 
     /**
-     *
+     * @param $label
+     * @param $input
+     * @param $note
+     * @return
      */
     abstract public function fillWrapLabelInputNote($label, $input, $note);
 
@@ -862,6 +878,8 @@ abstract class AbstractBuildForm {
      * @param array $formElement
      *
      * @return array
+     * @throws CodeException
+     * @throws UserFormException
      */
     private function getFormElementForJson($htmlFormElementName, $value, array $formElement) {
 
@@ -987,6 +1005,7 @@ abstract class AbstractBuildForm {
      * @param string $addClass
      *
      * @return string
+     * @throws CodeException
      */
     public function buildLabel($htmlFormElementName, $label, $addClass = '') {
         $attributes = Support::doAttribute('for', $htmlFormElementName);
@@ -1000,8 +1019,10 @@ abstract class AbstractBuildForm {
     /**
      * Takes the current SIP ('form' and additional parameter), set SIP_RECORD_ID=0 and create a new 'NewRecordUrl'.
      *
+     * @param $toolTipNew
+     * @return string
      * @throws CodeException
-     * @throws \qfq\UserFormException
+     * @throws UserFormException
      */
     public function deriveNewRecordUrlFromExistingSip(&$toolTipNew) {
 
@@ -1023,12 +1044,32 @@ abstract class AbstractBuildForm {
         return $url;
     }
 
+    /**
+     * @param array $formElement
+     * @param $elementHtml
+     * @return mixed
+     */
     abstract public function buildRowPill(array $formElement, $elementHtml);
 
+    /**
+     * @param array $formElement
+     * @param $elementHtml
+     * @return mixed
+     */
     abstract public function buildRowFieldset(array $formElement, $elementHtml);
 
+    /**
+     * @param array $formElement
+     * @param $elementHtml
+     * @return mixed
+     */
     abstract public function buildRowTemplateGroup(array $formElement, $elementHtml);
 
+    /**
+     * @param array $formElement
+     * @param $elementHtml
+     * @return mixed
+     */
     abstract public function buildRowSubrecord(array $formElement, $elementHtml);
 
     /**
@@ -1045,7 +1086,8 @@ abstract class AbstractBuildForm {
      * @param string $mode FORM_LOAD | FORM_UPDATE | FORM_SAVE
      *
      * @return string complete rendered HTML input element.
-     * @throws \qfq\UserFormException
+     * @throws CodeException
+     * @throws UserFormException
      */
     public function buildInput(array $formElement, $htmlFormElementName, $value, array &$json, $mode = FORM_LOAD) {
         $textarea = '';
@@ -1190,6 +1232,7 @@ abstract class AbstractBuildForm {
      * @param array $formElement
      *
      * @return string
+     * @throws CodeException
      * @throws UserFormException
      */
     private function typeAheadBuildParam(array &$formElement) {
@@ -1295,6 +1338,7 @@ abstract class AbstractBuildForm {
      * @param bool $flagOmitEmpty
      *
      * @return string
+     * @throws CodeException
      */
     private function getAttributeList(array $formElement, array $attributeList, $flagOmitEmpty = true) {
         $attribute = '';
@@ -1311,7 +1355,9 @@ abstract class AbstractBuildForm {
      *
      * @param string $feMode
      *
+     * @param bool $cssDisable
      * @return string
+     * @throws CodeException
      * @throws UserFormException
      */
     private function getAttributeFeMode($feMode, $cssDisable = true) {
@@ -1497,6 +1543,7 @@ abstract class AbstractBuildForm {
      * @param string $fieldType
      *
      * @return array
+     * @throws CodeException
      * @throws UserFormException
      */
     private function getItemsForEnumOrSet($column, &$fieldType) {
@@ -1542,6 +1589,7 @@ abstract class AbstractBuildForm {
      * @param array $itemKey
      * @param array $formElement
      *
+     * @throws CodeException
      * @throws UserFormException
      */
     private function prepareCheckboxCheckedUncheckedValue(array $itemKey, array &$formElement) {
@@ -1576,13 +1624,14 @@ abstract class AbstractBuildForm {
      *
      * @param array $formElement
      * @param string $htmlFormElementName
+     * @param $attribute
      * @param string $value
      * @param array $json
      * @param string $mode FORM_LOAD | FORM_UPDATE | FORM_SAVE
      *
      * @return string
      * @throws CodeException
-     * @throws \qfq\UserFormException
+     * @throws UserFormException
      */
     public function buildCheckboxSingle(array $formElement, $htmlFormElementName, $attribute, $value, array &$json, $mode = FORM_LOAD) {
 
@@ -1616,6 +1665,8 @@ abstract class AbstractBuildForm {
      * @param array $json
      *
      * @return string
+     * @throws CodeException
+     * @throws UserFormException
      */
     public function constructCheckboxSingleButton(array $formElement, $htmlFormElementName, $attribute, $value, array &$json) {
         $html = '';
@@ -1674,6 +1725,8 @@ abstract class AbstractBuildForm {
      * @param array $json
      *
      * @return string
+     * @throws CodeException
+     * @throws UserFormException
      */
     public function constructCheckboxSinglePlain(array $formElement, $htmlFormElementName, $attribute, $value, array &$json) {
         $html = '';
@@ -1716,13 +1769,14 @@ abstract class AbstractBuildForm {
      *
      * @param array $formElement
      * @param string $htmlFormElementName
+     * @param $attributeBase
      * @param string $value
+     * @param array $itemKey
+     * @param array $itemValue
      * @param array $json
-     * @param string $mode FORM_LOAD | FORM_UPDATE | FORM_SAVE
-     *
      * @return string
      * @throws CodeException
-     * @throws \qfq\UserFormException
+     * @throws UserFormException
      */
     public function buildCheckboxMulti(array $formElement, $htmlFormElementName, $attributeBase, $value, array $itemKey, array $itemValue, array &$json) {
 
@@ -1774,6 +1828,8 @@ abstract class AbstractBuildForm {
      * @param array $json
      *
      * @return string
+     * @throws CodeException
+     * @throws UserFormException
      */
     public function constructCheckboxMultiButton(array $formElement, $htmlFormElementName, $attributeBase, $value, array $itemKey, array $itemValue, array &$json) {
         $json = array();
@@ -1845,6 +1901,8 @@ abstract class AbstractBuildForm {
      * @param array $json
      *
      * @return string
+     * @throws CodeException
+     * @throws UserFormException
      */
     public function constructCheckboxMultiPlain(array $formElement, $htmlFormElementName, $attributeBase, $value, array $itemKey, array $itemValue, array &$json) {
         $json = array();
@@ -2253,6 +2311,7 @@ abstract class AbstractBuildForm {
      * @param array $control Array with <th> column names / format.
      *
      * @return string
+     * @throws UserFormException
      */
     private function subrecordHead($linkNew, $flagDelete, array $firstRow, array &$control) {
 
@@ -2440,7 +2499,11 @@ abstract class AbstractBuildForm {
      * @param string $targetRecordId
      * @param array $record
      *
+     * @param $symbol
+     * @param $toolTip
+     * @param array $currentRow
      * @return string
+     * @throws CodeException
      * @throws UserFormException
      */
     private function createFormLink(array $formElement, $targetRecordId, array $record, $symbol, $toolTip, $currentRow = array()) {
@@ -2619,6 +2682,9 @@ abstract class AbstractBuildForm {
      * @param string $columnValue
      *
      * @return string
+     * @throws CodeException
+     * @throws UserFormException
+     * @throws UserReportException
      */
     private function renderCell(array $control, $columnName, $columnValue) {
         $link = null;
@@ -2682,6 +2748,7 @@ abstract class AbstractBuildForm {
      *
      * @return string String: "API_DIR/delete.php?sip=...."
      * @throws CodeException
+     * @throws UserFormException
      */
     public function createDeleteUrl($formName, $recordId, $mode = RETURN_URL) {
 
@@ -2710,7 +2777,9 @@ abstract class AbstractBuildForm {
      *
      * @return string
      * @throws CodeException
-     * @throws \qfq\UserFormException
+     * @throws DbException
+     * @throws UserFormException
+     * @throws UserReportException
      */
     public function buildFile(array $formElement, $htmlFormElementName, $value, array &$json, $mode = FORM_LOAD) {
         $attribute = '';
@@ -2949,6 +3018,7 @@ abstract class AbstractBuildForm {
      * @param string $pathFileName
      * @return string SIP encoded URL
      * @throws CodeException
+     * @throws UserFormException
      */
     private function fileToSipUrl($pathFileName) {
         $param[DOWNLOAD_MODE] = DOWNLOAD_MODE_FILE;
@@ -2972,6 +3042,7 @@ abstract class AbstractBuildForm {
      * @param string $mode FORM_LOAD | FORM_UPDATE | FORM_SAVE
      *
      * @return string
+     * @throws CodeException
      * @throws UserFormException
      */
     public function buildDateTime(array $formElement, $htmlFormElementName, $value, array &$json, $mode = FORM_LOAD) {
@@ -3084,6 +3155,7 @@ abstract class AbstractBuildForm {
      * @param string $mode FORM_LOAD | FORM_UPDATE | FORM_SAVE
      *
      * @return string
+     * @throws CodeException
      * @throws UserFormException
      */
     public function buildDateJQW(array $formElement, $htmlFormElementName, $value, array &$json, $mode = FORM_LOAD) {
@@ -3167,7 +3239,8 @@ abstract class AbstractBuildForm {
      * @param string $mode
      *
      * @return string
-     * @throws \qfq\UserFormException
+     * @throws CodeException
+     * @throws UserFormException
      */
     public function buildEditor(array $formElement, $htmlFormElementName, $value, array &$json, $mode = FORM_LOAD) {
         $attribute = '';
@@ -3314,10 +3387,12 @@ abstract class AbstractBuildForm {
      * @param array $formElement
      * @param string $htmlFormElementName
      * @param string $value
-     * @param string $mode FORM_LOAD | FORM_UPDATE | FORM_SAVE
      * @param array $json
      *
+     * @param string $mode FORM_LOAD | FORM_UPDATE | FORM_SAVE
      * @return mixed
+     * @throws CodeException
+     * @throws UserFormException
      */
     public function buildNote(array $formElement, $htmlFormElementName, $value, array &$json, $mode = FORM_LOAD) {
 
@@ -3354,6 +3429,7 @@ abstract class AbstractBuildForm {
      * @return mixed
      * @throws CodeException
      * @throws DbException
+     * @throws UserFormException
      */
     public function buildFieldset(array $formElement, $htmlFormElementName, $value, array &$json, $mode = FORM_LOAD) {
         $attribute = '';
@@ -3422,6 +3498,7 @@ abstract class AbstractBuildForm {
      * @return mixed
      * @throws CodeException
      * @throws DbException
+     * @throws UserFormException
      */
     public function buildTemplateGroup(array $formElement, $htmlFormElementName, $value, array &$json, $mode = FORM_LOAD) {
         $attribute = '';
@@ -3535,7 +3612,8 @@ EOT;
      *
      * @return string
      * @throws CodeException
-     * @throws \qfq\UserFormException
+     * @throws DbException
+     * @throws UserFormException
      */
     private function templateGroupCollectFilledElements($max, $htmlDelete, array &$json) {
 
@@ -3637,6 +3715,12 @@ EOT;
         return $tgMax;
     }
 
+    /**
+     * @param array $formElement
+     * @param $htmlElement
+     * @param $htmlFormElementName
+     * @return mixed
+     */
     abstract public function buildRowNative(array $formElement, $htmlElement, $htmlFormElementName);
 
 }
\ No newline at end of file
diff --git a/extension/qfq/qfq/BodytextParser.php b/extension/qfq/qfq/BodytextParser.php
index 0cc5dbd293a1d64f3ca1ed9637d8a7e5a767cb42..3b66f6c8692f42c50d6205633415cec3084fe5b2 100644
--- a/extension/qfq/qfq/BodytextParser.php
+++ b/extension/qfq/qfq/BodytextParser.php
@@ -13,6 +13,10 @@ const NESTING_TOKEN_CLOSE = '#&nesting-close&#';
 const NESTING_TOKEN_LENGTH = 17;
 
 
+/**
+ * Class BodytextParser
+ * @package qfq
+ */
 class BodytextParser {
 
     /**
@@ -50,6 +54,8 @@ class BodytextParser {
      *
      * @param $bodytext
      *
+     * @param $nestingOpen
+     * @param $nestingClose
      * @return string
      */
 
@@ -213,6 +219,8 @@ class BodytextParser {
      *
      * @param $bodytext
      *
+     * @param $nestingOpen
+     * @param $nestingClose
      * @return mixed
      */
     private function encryptNestingDelimeter($bodytext, $nestingOpen, $nestingClose) {
@@ -247,6 +255,8 @@ class BodytextParser {
      *
      * @param $bodytext
      *
+     * @param $nestingOpen
+     * @param $nestingClose
      * @return mixed|string
      * @throws UserFormException
      */
@@ -314,6 +324,8 @@ class BodytextParser {
      *
      * @param $bodytext
      *
+     * @param $nestingOpen
+     * @param $nestingClose
      * @return mixed
      */
     private function decryptNestingDelimeter($bodytext, $nestingOpen, $nestingClose) {
diff --git a/extension/qfq/qfq/BuildFormBootstrap.php b/extension/qfq/qfq/BuildFormBootstrap.php
index f1d4b09cfc64bd5bc195c9b3b439fbba9c445956..6d0ffa3aa3480e630c2c0609c6113b69753ce494 100644
--- a/extension/qfq/qfq/BuildFormBootstrap.php
+++ b/extension/qfq/qfq/BuildFormBootstrap.php
@@ -28,6 +28,8 @@ class BuildFormBootstrap extends AbstractBuildForm {
      * @param array $feSpecAction
      * @param array $feSpecNative
      * @param array $db Array of 'Database' instances
+     * @throws CodeException
+     * @throws UserFormException
      */
     public function __construct(array $formSpec, array $feSpecAction, array $feSpecNative, array $db) {
         parent::__construct($formSpec, $feSpecAction, $feSpecNative, $db);
@@ -67,6 +69,7 @@ class BuildFormBootstrap extends AbstractBuildForm {
      * @param string $addClass
      *
      * @return string
+     * @throws CodeException
      */
     public function getRowOpenTag($addClass = '') {
         $class = Support::doAttribute('class', [$this->wrap[WRAP_SETUP_ELEMENT][WRAP_SETUP_CLASS], $addClass]);
@@ -105,7 +108,11 @@ class BuildFormBootstrap extends AbstractBuildForm {
     }
 
     /**
+     * @param string $mode
      * @return string
+     * @throws CodeException
+     * @throws DbException
+     * @throws UserFormException
      */
     public function head($mode = FORM_LOAD) {
         $html = '';
@@ -151,6 +158,8 @@ class BuildFormBootstrap extends AbstractBuildForm {
      * Creates a button to open 'CopyForm' with the current form as source.
      *
      * @return string - the rendered button
+     * @throws CodeException
+     * @throws UserFormException
      */
     private function buildButtonCopyForm() {
 
@@ -181,6 +190,9 @@ class BuildFormBootstrap extends AbstractBuildForm {
      * Creates a link to open current form loaded in FormEditor
      *
      * @return string - the rendered Checkbox
+     * @throws CodeException
+     * @throws DbException
+     * @throws UserFormException
      */
     private function buildViewForm() {
 
@@ -227,6 +239,8 @@ class BuildFormBootstrap extends AbstractBuildForm {
      * Simulate Submit Button: http://www.javascript-coder.com/javascript-form/javascript-form-submit.phtml
      *
      * @return string
+     * @throws CodeException
+     * @throws UserFormException
      */
     private function buildButtons() {
         $buttonNew = '';
@@ -312,6 +326,7 @@ class BuildFormBootstrap extends AbstractBuildForm {
      * @param string $class
      *
      * @return string
+     * @throws CodeException
      */
     private function buildButtonAnchor($url, $buttonHtmlId, $text, $toolTip, $icon, $disabled = '', $class = '') {
 
@@ -338,7 +353,10 @@ class BuildFormBootstrap extends AbstractBuildForm {
      * @param string $icon
      * @param string $disabled
      *
+     * @param string $buttonOnChangeClass
+     * @param string $class
      * @return string
+     * @throws CodeException
      */
     private function buildButtonCode($buttonHtmlId, $text, $tooltip, $icon, $disabled = '', $buttonOnChangeClass = '', $class = '') {
 
@@ -492,6 +510,8 @@ class BuildFormBootstrap extends AbstractBuildForm {
      * Builds the complete HTML '<form ...>'-tag
      *
      * @return string
+     * @throws CodeException
+     * @throws DbException
      */
     public function getFormTag() {
 
@@ -511,6 +531,8 @@ class BuildFormBootstrap extends AbstractBuildForm {
 
     /**
      * @return string
+     * @throws CodeException
+     * @throws UserFormException
      */
     public function tail() {
 
@@ -586,7 +608,11 @@ EOF;
      * @param       $htmlFormElementName
      * @param       $value
      *
+     * @param array $json
      * @return mixed
+     * @throws CodeException
+     * @throws DbException
+     * @throws UserFormException
      */
     public function buildPill(array $formElement, $htmlFormElementName, $value, array &$json) {
         $html = '';
@@ -611,7 +637,8 @@ EOF;
      * @param        $htmlFormElementName
      *
      * @return string               Wrapped $htmlElement
-     * @throws \qfq\UserFormException
+     * @throws CodeException
+     * @throws UserFormException
      */
     public function buildRowNative(array $formElement, $htmlElement, $htmlFormElementName) {
         $html = '';
@@ -726,6 +753,7 @@ EOF;
      *
      * @param $formElement
      * @param $elementHtml
+     * @return
      */
     public function buildRowFieldset(array $formElement, $elementHtml) {
         $html = $elementHtml;
@@ -738,6 +766,7 @@ EOF;
      *
      * @param $formElement
      * @param $elementHtml
+     * @return mixed
      */
     public function buildRowTemplateGroup(array $formElement, $elementHtml) {
         $html = $elementHtml;
@@ -746,10 +775,11 @@ EOF;
     }
 
     /**
-     * @param $formElement
+     * @param array $formElement
      * @param $elementHtml
      *
      * @return string
+     * @throws CodeException
      */
     public function buildRowSubrecord(array $formElement, $elementHtml) {
 
@@ -771,11 +801,13 @@ EOF;
      *
      * @param string $mode FORM_LOAD | FORM_UPDATE | FORM_SAVE
      *
+     * @param bool $htmlElementNameIdZero
+     * @param array $latestFeSpecNative
      * @return string|array   $mode=LOAD_FORM: The whole form as HTML, $mode=FORM_UPDATE /FORM_SAVE: array of all
      *                        formElement.dynamicUpdate-yes  values/states
      * @throws CodeException
      * @throws DbException
-     * @throws \qfq\UserFormException
+     * @throws UserFormException
      */
     public function process($mode, $htmlElementNameIdZero = false, $latestFeSpecNative = array()) {
 
diff --git a/extension/qfq/qfq/BuildFormPlain.php b/extension/qfq/qfq/BuildFormPlain.php
index 2043768f359cac814aa57198fac4ad8b8fc287ea..6ee347af65b5b93b59a741c629a23f7bf36962e3 100644
--- a/extension/qfq/qfq/BuildFormPlain.php
+++ b/extension/qfq/qfq/BuildFormPlain.php
@@ -45,6 +45,11 @@ class BuildFormPlain extends AbstractBuildForm {
 
     }
 
+    /**
+     * @param $label
+     * @param $input
+     * @param $note
+     */
     public function fillWrapLabelInputNote($label, $input, $note) {
 
     }
@@ -58,6 +63,9 @@ class BuildFormPlain extends AbstractBuildForm {
 
     /**
      * @return string
+     * @throws CodeException
+     * @throws DbException
+     * @throws UserFormException
      */
     public function doSubrecords() {
         $json = array();
@@ -67,10 +75,9 @@ class BuildFormPlain extends AbstractBuildForm {
     }
 
     /**
+     * @param array $formElement
+     * @param $htmlElement
      * @param $htmlFormElementName
-     * @param $formElement
-     * @param $value
-     *
      * @return string
      */
     public function buildRowNative(array $formElement, $htmlElement, $htmlFormElementName) {
@@ -110,18 +117,38 @@ class BuildFormPlain extends AbstractBuildForm {
     }
 
 
+    /**
+     * @param array $formElement
+     * @param $elementHtml
+     * @return mixed|void
+     */
     public function buildRowPill(array $formElement, $elementHtml) {
         // TODO: Implement buildRowPill() method.
     }
 
+    /**
+     * @param array $formElement
+     * @param $elementHtml
+     * @return mixed|void
+     */
     public function buildRowFieldset(array $formElement, $elementHtml) {
         // TODO: Implement buildRowFieldset() method.
     }
 
+    /**
+     * @param array $formElement
+     * @param $elementHtml
+     * @return mixed|void
+     */
     public function buildRowTemplateGroup(array $formElement, $elementHtml) {
         // TODO: Implement buildRowTemplate() method.
     }
 
+    /**
+     * @param array $formElement
+     * @param $elementHtml
+     * @return mixed|void
+     */
     public function buildRowSubrecord(array $formElement, $elementHtml) {
         // TODO: Implement buildRowSubrecord() method.
     }
diff --git a/extension/qfq/qfq/BuildFormTable.php b/extension/qfq/qfq/BuildFormTable.php
index d78c0dd5d65dea09fe7f5f75cbdef43a0d49ef8b..e8f54a2546814fa8870d68e19ea118cfe2658ae5 100644
--- a/extension/qfq/qfq/BuildFormTable.php
+++ b/extension/qfq/qfq/BuildFormTable.php
@@ -48,6 +48,11 @@ class BuildFormTable extends AbstractBuildForm {
 
     }
 
+    /**
+     * @param $label
+     * @param $input
+     * @param $note
+     */
     public function fillWrapLabelInputNote($label, $input, $note) {
 
     }
@@ -61,6 +66,9 @@ class BuildFormTable extends AbstractBuildForm {
 
     /**
      * @return string
+     * @throws CodeException
+     * @throws DbException
+     * @throws UserFormException
      */
     public function doSubrecords() {
         //TODO: $json is not returned - which is wrong. In this case, dynamic update won't work for subrecords
@@ -70,7 +78,11 @@ class BuildFormTable extends AbstractBuildForm {
     }
 
     /**
+     * @param string $mode
      * @return string
+     * @throws CodeException
+     * @throws DbException
+     * @throws UserFormException
      */
     public function head($mode = FORM_LOAD) {
         $html = '';
@@ -93,9 +105,10 @@ class BuildFormTable extends AbstractBuildForm {
     }
 
     /**
-     * @param $htmlFormElementName
-     * @param $formElement
+     * @param array $formElement
      *
+     * @param $htmlElement
+     * @param $htmlFormElementName
      * @return string
      */
     public function buildRowNative(array $formElement, $htmlElement, $htmlFormElementName) {
@@ -146,18 +159,38 @@ class BuildFormTable extends AbstractBuildForm {
         return $html;
     }
 
+    /**
+     * @param array $formElement
+     * @param $elementHtml
+     * @return mixed|void
+     */
     public function buildRowPill(array $formElement, $elementHtml) {
         // TODO: Implement buildRowPill() method.
     }
 
+    /**
+     * @param array $formElement
+     * @param $elementHtml
+     * @return mixed|void
+     */
     public function buildRowFieldset(array $formElement, $elementHtml) {
         // TODO: Implement buildRowFieldset() method.
     }
 
+    /**
+     * @param array $formElement
+     * @param $elementHtml
+     * @return mixed|void
+     */
     public function buildRowTemplateGroup(array $formElement, $elementHtml) {
         // TODO: Implement buildRowTemplate() method.
     }
 
+    /**
+     * @param array $formElement
+     * @param $elementHtml
+     * @return mixed|void
+     */
     public function buildRowSubrecord(array $formElement, $elementHtml) {
         // TODO: Implement buildRowSubrecord() method.
     }
diff --git a/extension/qfq/qfq/Constants.php b/extension/qfq/qfq/Constants.php
index 5906b22baebad5543c27a80ad2f982a7cf222bdb..b7d84ed492a81619d031b1755a838812125c4a3a 100644
--- a/extension/qfq/qfq/Constants.php
+++ b/extension/qfq/qfq/Constants.php
@@ -7,7 +7,8 @@
  */
 
 const EXT_KEY = 'qfq';
-const CONFIG_INI = "config.qfq.ini";  // QFQ configuration file: db access
+const CONFIG_QFQ = "config.qfq.ini";  // QFQ configuration file: db access
+const CONFIG_T3 = 'LocalConfiguration.php'; // T3 config file
 
 const GFX_INFO = 'typo3conf/ext/qfq/Resources/Public/icons/note.gif';
 const API_DIR = 'typo3conf/ext/qfq/qfq/api';
@@ -384,24 +385,27 @@ const SYSTEM_DB_1_SERVER = 'DB_1_SERVER';
 const SYSTEM_DB_1_PASSWORD = 'DB_1_PASSWORD';
 const SYSTEM_DB_1_NAME = 'DB_1_NAME';
 
-const SYSTEM_DB_INIT = 'DB_INIT';
+const SYSTEM_DB_INIT = 'init';
 
-const SYSTEM_DB_INDEX_DATA = "DB_INDEX_DATA";
-const SYSTEM_DB_INDEX_QFQ = "DB_INDEX_QFQ";
+const SYSTEM_DB_INDEX_DATA = "indexData";
+const SYSTEM_DB_INDEX_QFQ = "indexQfq";
+
+const SYSTEM_DB_INDEX_DATA_DEPRECATED = "DB_INDEX_DATA";
+const SYSTEM_DB_INDEX_QFQ_DEPRECATED = "DB_INDEX_QFQ";
 
 // Computed dynamically
 const SYSTEM_DB_NAME_DATA = '_dbNameData';
 const SYSTEM_DB_NAME_QFQ = '_dbNameQfq';
 
-const SYSTEM_SQL_LOG = 'SQL_LOG'; //  Logging to file
+const SYSTEM_SQL_LOG = 'sqlLog'; //  Logging to file
 const SYSTEM_SQL_LOG_FILE = '../../sql.log';
-const SYSTEM_SQL_LOG_MODE = 'SQL_LOG_MODE'; // Mode, which statements to log.
-const SYSTEM_DATE_FORMAT = 'DATE_FORMAT';
-const SYSTEM_REDIRECT_ALL_MAIL_TO = 'REDIRECT_ALL_MAIL_TO';
-const SYSTEM_MAIL_LOG = 'MAIL_LOG';
+const SYSTEM_SQL_LOG_MODE = 'sqlLogMode'; // Mode, which statements to log.
+const SYSTEM_DATE_FORMAT = 'dateFormat';
+const SYSTEM_REDIRECT_ALL_MAIL_TO = 'redirectAllMailTo';
+const SYSTEM_MAIL_LOG = 'mailLog';
 const SYSTEM_MAIL_LOG_FILE = '../../mail.log';
 
-const SYSTEM_SHOW_DEBUG_INFO = 'SHOW_DEBUG_INFO';
+const SYSTEM_SHOW_DEBUG_INFO = 'showDebugInfo';
 const SYSTEM_SHOW_DEBUG_INFO_YES = 'yes';
 const SYSTEM_SHOW_DEBUG_INFO_NO = 'no';
 const SYSTEM_SHOW_DEBUG_INFO_AUTO = 'auto'; // Remains on value 'auto' as long as there is no BE User logged in. In other words: 'auto'='no'. #5031
@@ -409,32 +413,29 @@ const SYSTEM_SHOW_DEBUG_INFO_DOWNLOAD = 'download';
 
 const SYSTEM_CSS_LINK_CLASS_INTERNAL = 'CSS_LINK_CLASS_INTERNAL';
 const SYSTEM_CSS_LINK_CLASS_EXTERNAL = 'CSS_LINK_CLASS_EXTERNAL';
-const SYSTEM_CSS_CLASS_QFQ_CONTAINER = 'CSS_CLASS_QFQ_CONTAINER';
-const SYSTEM_CSS_CLASS_QFQ_FORM = 'CSS_CLASS_QFQ_FORM';
-const SYSTEM_CSS_CLASS_QFQ_FORM_PILL = 'CSS_CLASS_QFQ_FORM_PILL';
-const SYSTEM_CSS_CLASS_QFQ_FORM_BODY = 'CSS_CLASS_QFQ_FORM_BODY';
+const SYSTEM_CSS_CLASS_QFQ_CONTAINER = 'cssClassQfqContainer';
+const SYSTEM_CSS_CLASS_QFQ_FORM = 'cssClassQfqForm';
+const SYSTEM_CSS_CLASS_QFQ_FORM_PILL = 'cssClassQfqFormPill';
+const SYSTEM_CSS_CLASS_QFQ_FORM_BODY = 'cssClassQfqFormBody';
 
 // Textmessages used for Form validation.
-const SYSTEM_FORM_DATA_PATTERN_ERROR = 'FORM_DATA_PATTERN_ERROR';
-const SYSTEM_FORM_DATA_REQUIRED_ERROR = 'FORM_DATA_REQUIRED_ERROR';
-const SYSTEM_FORM_DATA_MATCH_ERROR = 'FORM_DATA_MATCH_ERROR';
-const SYSTEM_FORM_DATA_ERROR = 'FORM_DATA_ERROR';
-
-const SYSTEM_FORM_BS_COLUMNS = 'FORM_BS_COLUMNS';
+const SYSTEM_FORM_DATA_PATTERN_ERROR = 'formDataPatternError';
+const SYSTEM_FORM_DATA_REQUIRED_ERROR = 'formDataRequiredError';
+const SYSTEM_FORM_DATA_MATCH_ERROR = 'formDataMatchError';
+const SYSTEM_FORM_DATA_ERROR = 'formDataError';
 
-const SYSTEM_FORM_BS_LABEL_COLUMNS = 'FORM_BS_LABEL_COLUMNS';
-const SYSTEM_FORM_BS_INPUT_COLUMNS = 'FORM_BS_INPUT_COLUMNS';
-const SYSTEM_FORM_BS_NOTE_COLUMNS = 'FORM_BS_NOTE_COLUMNS';
+const SYSTEM_FORM_BS_COLUMNS = 'formBsColumns';
 
-const SYSTEM_FORM_BUTTON_ON_CHANGE_CLASS = 'FORM_BUTTON_ON_CHANGE_CLASS';
+const SYSTEM_FORM_BS_LABEL_COLUMNS = 'formBsLabelColumns';
+const SYSTEM_FORM_BS_INPUT_COLUMNS = 'formBsInputColumns';
+const SYSTEM_FORM_BS_NOTE_COLUMNS = 'formBsNoteColumns';
 
-const SYSTEM_BASE_URL_PRINT = 'BASE_URL_PRINT';
-const SYSTEM_WKHTMLTOPDF = 'WKHTMLTOPDF';
+const SYSTEM_BASE_URL = 'baseUrl';
 
 const SYSTEM_SEND_E_MAIL = 'sendEmail';
-const SYSTEM_SEND_E_MAIL_OPTIONS = 'SEND_E_MAIL_OPTIONS';
+const SYSTEM_SEND_E_MAIL_OPTIONS = 'sendEMailOptions';
 
-const SYSTEM_EDIT_FORM_PAGE = 'EDIT_FORM_PAGE';
+const SYSTEM_EDIT_FORM_PAGE = 'editFormPage';
 
 // computed automatically during runtime
 const SYSTEM_PATH_EXT = 'EXT_PATH';
@@ -443,74 +444,76 @@ const SYSTEM_SITE_PATH = 'SITE_PATH';
 const SYSTEM_LDAP_1_RDN = 'LDAP_1_RDN'; // Credentials to access LDAP
 const SYSTEM_LDAP_1_PASSWORD = 'LDAP_1_PASSWORD'; // Credentials to access LDAP
 
-const SYSTEM_ESCAPE_TYPE_DEFAULT = 'ESCAPE_TYPE_DEFAULT';
-const SYSTEM_SECURITY_VARS_HONEYPOT = 'SECURITY_VARS_HONEYPOT'; // Fake variables
-const SYSTEM_SECURITY_ATTACK_DELAY = 'SECURITY_ATTACK_DELAY'; // Detected attack causes x seconds delay
+const SYSTEM_ESCAPE_TYPE_DEFAULT = 'escapeTypeDefault';
+const SYSTEM_SECURITY_VARS_HONEYPOT = 'securityVarsHoneypot'; // Fake variables
+const SYSTEM_SECURITY_ATTACK_DELAY = 'securityAttackDelay'; // Detected attack causes x seconds delay
 const SYSTEM_SECURITY_ATTACK_DELAY_DEFAULT = 5; // Detected attack causes x seconds delay
-const SYSTEM_SECURITY_SHOW_MESSAGE = 'SECURITY_SHOW_MESSAGE'; // Detected attack shows an error message
-const SYSTEM_SECURITY_GET_MAX_LENGTH = 'SECURITY_GET_MAX_LENGTH'; // Trim every character (before conversion) to SECURITY_GET_MAX_LENGTH chars;
+const SYSTEM_SECURITY_SHOW_MESSAGE = 'securityShowMessage'; // Detected attack shows an error message
+const SYSTEM_SECURITY_GET_MAX_LENGTH = 'securityGetMaxLength'; // Trim every character (before conversion) to SECURITY_GET_MAX_LENGTH chars;
 const SYSTEM_SECURITY_GET_MAX_LENGTH_DEFAULT = 50; // Default max length for get variables
 
 const GET_EXTRA_LENGTH_TOKEN = '_';
 
-const SYSTEM_GFX_EXTRA_BUTTON_INFO_INLINE = 'GFX_EXTRA_BUTTON_INFO_INLINE';
-const SYSTEM_GFX_EXTRA_BUTTON_INFO_BELOW = 'GFX_EXTRA_BUTTON_INFO_BELOW';
-const SYSTEM_EXTRA_BUTTON_INFO_POSITION = 'EXTRA_BUTTON_INFO_POSITION';
+const SYSTEM_EXTRA_BUTTON_INFO_INLINE = 'extraButtonInfoInline';
+const SYSTEM_EXTRA_BUTTON_INFO_BELOW = 'extraButtonInfoBelow';
+const SYSTEM_EXTRA_BUTTON_INFO_POSITION = 'extraButtonInfoPosition';
 const SYSTEM_EXTRA_BUTTON_INFO_POSITION_AUTO = 'auto';
 const SYSTEM_EXTRA_BUTTON_INFO_POSITION_BELOW = 'below';
-const SYSTEM_EXTRA_BUTTON_INFO_CLASS = 'EXTRA_BUTTON_INFO_CLASS';
-
-const SYSTEM_SAVE_BUTTON_TEXT = 'SAVE_BUTTON_TEXT';
-const SYSTEM_SAVE_BUTTON_TOOLTIP = 'SAVE_BUTTON_TOOLTIP';
-const SYSTEM_SAVE_BUTTON_CLASS = 'SAVE_BUTTON_CLASS';
-const SYSTEM_SAVE_BUTTON_GLYPH_ICON = 'SAVE_BUTTON_GLYPH_ICON';
-
-const SYSTEM_CLOSE_BUTTON_TEXT = 'CLOSE_BUTTON_TEXT';
-const SYSTEM_CLOSE_BUTTON_TOOLTIP = 'CLOSE_BUTTON_TOOLTIP';
-const SYSTEM_CLOSE_BUTTON_CLASS = 'CLOSE_BUTTON_CLASS';
-const SYSTEM_CLOSE_BUTTON_GLYPH_ICON = 'CLOSE_BUTTON_GLYPH_ICON';
-
-const SYSTEM_DELETE_BUTTON_TEXT = 'DELETE_BUTTON_TEXT';
-const SYSTEM_DELETE_BUTTON_TOOLTIP = 'DELETE_BUTTON_TOOLTIP';
-const SYSTEM_DELETE_BUTTON_CLASS = 'DELETE_BUTTON_CLASS';
-const SYSTEM_DELETE_BUTTON_GLYPH_ICON = 'DELETE_BUTTON_GLYPH_ICON';
-
-const SYSTEM_NEW_BUTTON_TEXT = 'NEW_BUTTON_TEXT';
-const SYSTEM_NEW_BUTTON_TOOLTIP = 'NEW_BUTTON_TOOLTIP';
-const SYSTEM_NEW_BUTTON_CLASS = 'NEW_BUTTON_CLASS';
-const SYSTEM_NEW_BUTTON_GLYPH_ICON = 'NEW_BUTTON_GLYPH_ICON';
-
-const SYSTEM_DB_UPDATE = 'DB_UPDATE';
+const SYSTEM_EXTRA_BUTTON_INFO_CLASS = 'extraButtonInfoClass';
+
+const SYSTEM_SAVE_BUTTON_TEXT = 'saveButtonText';
+const SYSTEM_SAVE_BUTTON_TOOLTIP = 'saveButtonTooltip';
+const SYSTEM_SAVE_BUTTON_CLASS = 'saveButtonClass';
+const SYSTEM_SAVE_BUTTON_GLYPH_ICON = 'saveButtonGlyphIcon';
+const SYSTEM_SAVE_BUTTON_CLASS_ON_CHANGE = 'saveButtonClassOnChange';
+
+const SYSTEM_CLOSE_BUTTON_TEXT = 'closeButtonText';
+const SYSTEM_CLOSE_BUTTON_TOOLTIP = 'closeButtonTooltip';
+const SYSTEM_CLOSE_BUTTON_CLASS = 'closeButtonClass';
+const SYSTEM_CLOSE_BUTTON_GLYPH_ICON = 'closeButtonGlyphIcon';
+
+const SYSTEM_DELETE_BUTTON_TEXT = 'deleteButtonText';
+const SYSTEM_DELETE_BUTTON_TOOLTIP = 'deleteButtonTooltip';
+const SYSTEM_DELETE_BUTTON_CLASS = 'deleteButtonClass';
+const SYSTEM_DELETE_BUTTON_GLYPH_ICON = 'deleteButtonGlyphIcon';
+
+const SYSTEM_NEW_BUTTON_TEXT = 'newButtonText';
+const SYSTEM_NEW_BUTTON_TOOLTIP = 'newButtonTooltip';
+const SYSTEM_NEW_BUTTON_CLASS = 'newButtonClass';
+const SYSTEM_NEW_BUTTON_GLYPH_ICON = 'newButtonGlyphIcon';
+
+const SYSTEM_DB_UPDATE = 'update';
 const SYSTEM_DB_UPDATE_ALWAYS = 'always';
 const SYSTEM_DB_UPDATE_NEVER = 'never';
 const SYSTEM_DB_UPDATE_AUTO = 'auto';
 
-const SYSTEM_RECORD_LOCK_TIMEOUT_SECONDS = 'RECORD_LOCK_TIMEOUT_SECONDS';
+const SYSTEM_RECORD_LOCK_TIMEOUT_SECONDS = 'recordLockTimeoutSeconds';
 const SYSTEM_RECORD_LOCK_TIMEOUT_SECONDS_DEFAULT = 900; // 15 mins
 
 // Deprecated, replaced by SYSTEM_FILL_STORE_SYSTEM_BY_SQ
 const SYSTEM_VAR_ADD_BY_SQL = 'VAR_ADD_BY_SQL'; // since 1.12.17
-//const SYSTEM_VAR_ADD_BY_SQL_DEFAULT = 'SELECT id AS periodId FROM Period WHERE start<=NOW() ORDER BY start DESC LIMIT 1';
 
-const SYSTEM_FILL_STORE_SYSTEM_BY_SQL = 'FILL_STORE_SYSTEM_BY_SQL';
-const SYSTEM_FILL_STORE_SYSTEM_ERROR_MSG = 'FILL_STORE_SYSTEM_ERROR_MSG';
+const SYSTEM_FILL_STORE_SYSTEM_BY_SQL = 'fillStoreSystemBySql';
+const SYSTEM_FILL_STORE_SYSTEM_ERROR_MSG = 'fillStoreSystemBySqlErrorMsg';
 
-const SYSTEM_FORM_LANGUAGE = 'FORM_LANGUAGE';
+const SYSTEM_FORM_LANGUAGE = 'formLanguage';
 
-const SYSTEM_FORM_LANGUAGE_A_ID = 'FORM_LANGUAGE_A_ID';
-const SYSTEM_FORM_LANGUAGE_A_LABEL = 'FORM_LANGUAGE_A_LABEL';
+const SYSTEM_FORM_LANGUAGE_A_ID = 'formLanguageAId';
+const SYSTEM_FORM_LANGUAGE_A_LABEL = 'formLanguageALabel';
 
-const SYSTEM_FORM_LANGUAGE_B_ID = 'FORM_LANGUAGE_B_ID';
-const SYSTEM_FORM_LANGUAGE_B_LABEL = 'FORM_LANGUAGE_B_LABEL';
+const SYSTEM_FORM_LANGUAGE_B_ID = 'formLanguageBId';
+const SYSTEM_FORM_LANGUAGE_B_LABEL = 'formLanguageBLabel';
 
-const SYSTEM_FORM_LANGUAGE_C_ID = 'FORM_LANGUAGE_C_ID';
-const SYSTEM_FORM_LANGUAGE_C_LABEL = 'FORM_LANGUAGE_C_LABEL';
+const SYSTEM_FORM_LANGUAGE_C_ID = 'formLanguageCId';
+const SYSTEM_FORM_LANGUAGE_C_LABEL = 'formLanguageCLabel';
 
-const SYSTEM_FORM_LANGUAGE_D_ID = 'FORM_LANGUAGE_D_ID';
-const SYSTEM_FORM_LANGUAGE_D_LABEL = 'FORM_LANGUAGE_D_LABEL';
+const SYSTEM_FORM_LANGUAGE_D_ID = 'formLanguageDId';
+const SYSTEM_FORM_LANGUAGE_D_LABEL = 'formLanguageDLabel';
 
 const SYSTEM_ENTER_AS_SUBMIT = 'enterAsSubmit';
 
+const SYSTEM_CMD_WKHTMLTOPDF = 'cmdWkhtmltopdf';
+
 // Thumbnail
 const SYSTEM_CMD_INKSCAPE = 'cmdInkscape';
 const SYSTEM_CMD_CONVERT = 'cmdConvert';
@@ -519,7 +522,7 @@ const SYSTEM_THUMBNAIL_DIR_SECURE_DEFAULT = 'fileadmin/protected/qfqThumbnail';
 const SYSTEM_THUMBNAIL_DIR_PUBLIC = 'thumbnailDirPublic';
 const SYSTEM_THUMBNAIL_DIR_PUBLIC_DEFAULT = 'typo3temp/qfqThumbnail';
 
-const DOCUMENTATION_QFQ = 'DOCUMENTATION_QFQ';
+const DOCUMENTATION_QFQ = 'documentation';
 const DOCUMENTATION_QFQ_URL = 'https://docs.typo3.org/typo3cms/drafts/github/T3DocumentationStarter/Public-Info-053/Manual.html';
 
 
@@ -772,7 +775,7 @@ const F_DIRTY_MODE = 'dirtyMode';
 const F_SUBMIT_BUTTON_TEXT = 'submitButtonText';
 const F_BUTTON_ON_CHANGE_CLASS = 'buttonOnChangeClass';
 
-const F_ESCAPE_TYPE_DEFAULT = 'escapeTypeDefault';
+const F_ESCAPE_TYPE_DEFAULT = SYSTEM_ESCAPE_TYPE_DEFAULT;
 
 const F_CLASS = 'class';
 const F_CLASS_PILL = 'classPill';
@@ -826,25 +829,25 @@ const F_MODE_GLOBAL = 'formModeGlobal';
 
 const F_SAVE_BUTTON_ACTIVE = 'saveButtonActive';
 
-const F_SAVE_BUTTON_TEXT = 'saveButtonText';
-const F_SAVE_BUTTON_TOOLTIP = 'saveButtonTooltip';
-const F_SAVE_BUTTON_CLASS = 'saveButtonClass';
-const F_SAVE_BUTTON_GLYPH_ICON = 'saveButtonGlyphIcon';
+const F_SAVE_BUTTON_TEXT = SYSTEM_SAVE_BUTTON_TEXT;
+const F_SAVE_BUTTON_TOOLTIP = SYSTEM_SAVE_BUTTON_TOOLTIP;
+const F_SAVE_BUTTON_CLASS = SYSTEM_SAVE_BUTTON_CLASS;
+const F_SAVE_BUTTON_GLYPH_ICON = SYSTEM_SAVE_BUTTON_GLYPH_ICON;
 
-const F_CLOSE_BUTTON_TEXT = 'closeButtonText';
-const F_CLOSE_BUTTON_TOOLTIP = 'closeButtonTooltip';
-const F_CLOSE_BUTTON_CLASS = 'closeButtonClass';
-const F_CLOSE_BUTTON_GLYPH_ICON = 'closeButtonGlyphIcon';
+const F_CLOSE_BUTTON_TEXT = SYSTEM_CLOSE_BUTTON_TEXT;
+const F_CLOSE_BUTTON_TOOLTIP = SYSTEM_CLOSE_BUTTON_TOOLTIP;
+const F_CLOSE_BUTTON_CLASS = SYSTEM_CLOSE_BUTTON_CLASS;
+const F_CLOSE_BUTTON_GLYPH_ICON = SYSTEM_CLOSE_BUTTON_GLYPH_ICON;
 
-const F_DELETE_BUTTON_TEXT = 'deleteButtonText';
-const F_DELETE_BUTTON_TOOLTIP = 'deleteButtonTooltip';
-const F_DELETE_BUTTON_CLASS = 'deleteButtonClass';
-const F_DELETE_BUTTON_GLYPH_ICON = 'deleteButtonGlyphIcon';
+const F_DELETE_BUTTON_TEXT = SYSTEM_DELETE_BUTTON_TEXT;
+const F_DELETE_BUTTON_TOOLTIP = SYSTEM_DELETE_BUTTON_TOOLTIP;
+const F_DELETE_BUTTON_CLASS = SYSTEM_DELETE_BUTTON_CLASS;
+const F_DELETE_BUTTON_GLYPH_ICON = SYSTEM_DELETE_BUTTON_GLYPH_ICON;
 
-const F_NEW_BUTTON_TEXT = 'newButtonText';
-const F_NEW_BUTTON_TOOLTIP = 'newButtonTooltip';
-const F_NEW_BUTTON_CLASS = 'newButtonClass';
-const F_NEW_BUTTON_GLYPH_ICON = 'newButtonGlyphIcon';
+const F_NEW_BUTTON_TEXT = SYSTEM_NEW_BUTTON_TEXT;
+const F_NEW_BUTTON_TOOLTIP = SYSTEM_NEW_BUTTON_TOOLTIP;
+const F_NEW_BUTTON_CLASS = SYSTEM_NEW_BUTTON_CLASS;
+const F_NEW_BUTTON_GLYPH_ICON = SYSTEM_NEW_BUTTON_GLYPH_ICON;
 
 const F_ENTER_AS_SUBMIT = SYSTEM_ENTER_AS_SUBMIT;
 
@@ -976,7 +979,7 @@ const FE_CHARACTER_COUNT_WRAP = 'characterCountWrap';
 const FE_INPUT_EXTRA_BUTTON_LOCK = 'extraButtonLock';
 const FE_INPUT_EXTRA_BUTTON_PASSWORD = 'extraButtonPassword';
 const FE_INPUT_EXTRA_BUTTON_INFO = 'extraButtonInfo';
-const FE_INPUT_EXTRA_BUTTON_INFO_CLASS = 'extraButtonInfoClass';
+const FE_INPUT_EXTRA_BUTTON_INFO_CLASS = SYSTEM_EXTRA_BUTTON_INFO_CLASS;
 const FE_INPUT_AUTOCOMPLETE = 'autocomplete';
 const FE_TMP_EXTRA_BUTTON_HTML = '_extraButtonHtml'; // will be filled on the fly during building extrabutton
 const FE_CHECKBOX_CHECKED = 'checked';
diff --git a/extension/qfq/qfq/Delete.php b/extension/qfq/qfq/Delete.php
index 5d4e9e0e861b715f45a1828c7fbf2b71e94c6034..afd4ec52101ba9a08f6d96123fbc53dc66a1020a 100644
--- a/extension/qfq/qfq/Delete.php
+++ b/extension/qfq/qfq/Delete.php
@@ -13,6 +13,10 @@ require_once(__DIR__ . '/database/Database.php');
 require_once(__DIR__ . '/store/Store.php');
 
 
+/**
+ * Class Delete
+ * @package qfq
+ */
 class Delete {
     /**
      * @var Database
@@ -27,6 +31,8 @@ class Delete {
     /**
      * @param bool $dbIndexData
      * @param bool $phpUnit
+     * @throws CodeException
+     * @throws UserFormException
      */
     public function __construct($dbIndexData = false, $phpUnit = false) {
 
diff --git a/extension/qfq/qfq/Evaluate.php b/extension/qfq/qfq/Evaluate.php
index 5aaf8ae477e24e56e7d29e87a18049cfe9ee46dc..6c1946c576cf0be551e2668e9f1016b0200e9f08 100644
--- a/extension/qfq/qfq/Evaluate.php
+++ b/extension/qfq/qfq/Evaluate.php
@@ -54,6 +54,7 @@ class Evaluate {
      * @param Database $db
      * @param string $startDelimiter
      * @param string $endDelimiter
+     * @throws CodeException
      */
     public function __construct(Store $store, Database $db, $startDelimiter = '{{', $endDelimiter = '}}') {
         $this->store = $store;
@@ -110,8 +111,13 @@ class Evaluate {
      * @param     $line
      * @param int $recursion
      *
+     * @param array $debugStack
+     * @param string $foundInStore
      * @return array|mixed|null|string
+     * @throws CodeException
+     * @throws DbException
      * @throws UserFormException
+     * @throws UserReportException
      */
     public function parse($line, $recursion = 0, &$debugStack = array(), &$foundInStore = '') {
         $flagTokenReplaced = false;
@@ -204,6 +210,7 @@ class Evaluate {
      * @throws CodeException
      * @throws DbException
      * @throws UserFormException
+     * @throws UserReportException
      */
     public function substitute($token, &$foundInStore = '') {
         $sqlMode = ROW_IMPLODE_ALL;
diff --git a/extension/qfq/qfq/File.php b/extension/qfq/qfq/File.php
index 9aded19bbda8d4faffab51055eb81c24237c7975..b3d25c95bf02a7f4928214e06b46417536290694 100644
--- a/extension/qfq/qfq/File.php
+++ b/extension/qfq/qfq/File.php
@@ -12,6 +12,10 @@ require_once(__DIR__ . '/store/Store.php');
 require_once(__DIR__ . '/Constants.php');
 require_once(__DIR__ . '/helper/HelperFile.php');
 
+/**
+ * Class File
+ * @package qfq
+ */
 class File {
 
     private $uploadErrMsg = array();
@@ -28,6 +32,8 @@ class File {
 
     /**
      * @param bool|false $phpUnit
+     * @throws CodeException
+     * @throws UserFormException
      */
     public function __construct($phpUnit = false) {
         $this->session = Session::getInstance($phpUnit);
@@ -46,6 +52,7 @@ class File {
     }
 
     /**
+     * @throws CodeException
      * @throws UserFormException
      */
     public function process() {
diff --git a/extension/qfq/qfq/QuickFormQuery.php b/extension/qfq/qfq/QuickFormQuery.php
index 34e63e52a78b41c9556e8dfbe362e49014810be9..f8be5100d9ddc654ec19c8c71341163ba6b43c09 100644
--- a/extension/qfq/qfq/QuickFormQuery.php
+++ b/extension/qfq/qfq/QuickFormQuery.php
@@ -190,6 +190,8 @@ class QuickFormQuery {
      * Returns the defined forwardMode and set forwardPage
      *
      * @return array
+     * @throws CodeException
+     * @throws UserFormException
      */
     public function getForwardMode() {
 
@@ -213,6 +215,9 @@ class QuickFormQuery {
      * Main entrypoint for display content: a) form and/or b) report
      *
      * @return string
+     * @throws CodeException
+     * @throws DbException
+     * @throws UserFormException
      */
     public function process() {
         $html = '';
@@ -249,7 +254,7 @@ class QuickFormQuery {
         }
 
         foreach (['A', 'B', 'C', 'D'] as $key) {
-            $languageIdx = SYSTEM_FORM_LANGUAGE . "_$key" . "_ID";
+            $languageIdx = SYSTEM_FORM_LANGUAGE . "$key" . "Id";
             if ($this->store->getVar($languageIdx, STORE_SYSTEM) == $typo3PageLanguage) {
                 $this->store->setVar(SYSTEM_PARAMETER_LANGUAGE_FIELD_NAME, 'parameterLanguage' . $key, STORE_SYSTEM);
                 break;
@@ -269,6 +274,7 @@ class QuickFormQuery {
      *
      * @return array|string
      * @throws CodeException
+     * @throws DbException
      * @throws UserFormException
      */
     private function doForm($formMode) {
@@ -776,8 +782,10 @@ class QuickFormQuery {
      * @param array $formSpec Main FormSpec to copy generic parameter to FormElements
      *
      * @return array|int
-     * @throws \qfq\CodeException
-     * @throws \qfq\DbException
+     * @throws CodeException
+     * @throws DbException
+     * @throws UserFormException
+     * @throws UserReportException
      */
     public function getNativeFormElements($sql, array $param, $formSpec) {
 
@@ -814,6 +822,10 @@ class QuickFormQuery {
      * @param array $elements
      *
      * @return array
+     * @throws CodeException
+     * @throws DbException
+     * @throws UserFormException
+     * @throws UserReportException
      */
     private function explodeTemplateGroupElements(array $elements) {
         $new = array();
@@ -904,6 +916,8 @@ class QuickFormQuery {
      * @param array $form
      *
      * @return array
+     * @throws CodeException
+     * @throws UserFormException
      */
     private function modeCleanFormConfig($mode, array $form) {
 
@@ -933,6 +947,8 @@ class QuickFormQuery {
      * @param array $formSpec
      *
      * @return array
+     * @throws CodeException
+     * @throws UserFormException
      */
     private function syncSystemFormConfig(array $formSpec) {
 
@@ -1001,6 +1017,8 @@ class QuickFormQuery {
      * @param array $formSpec
      *
      * @return array
+     * @throws CodeException
+     * @throws UserFormException
      */
     private function initForm(array $formSpec) {
 
@@ -1193,6 +1211,7 @@ class QuickFormQuery {
      *
      * @return string
      * @throws CodeException
+     * @throws DbException
      * @throws UserFormException
      */
     public function saveForm() {
@@ -1207,6 +1226,8 @@ class QuickFormQuery {
      *
      * @return array
      * @throws CodeException
+     * @throws DbException
+     * @throws UserFormException
      */
     public function updateForm() {
 
@@ -1220,6 +1241,8 @@ class QuickFormQuery {
      *
      * @return array
      * @throws CodeException
+     * @throws DbException
+     * @throws UserFormException
      */
     public function delete() {
 
@@ -1232,6 +1255,8 @@ class QuickFormQuery {
      *
      * @param array $sipArray
      * @param int $recordId
+     * @throws CodeException
+     * @throws UserFormException
      */
     private function newRecordCreateSip(array $sipArray, $recordId) {
 
diff --git a/extension/qfq/qfq/Save.php b/extension/qfq/qfq/Save.php
index 60b49335369926f11f88d85821b7410d5b3c0d62..0f63fed3a052522ea3a4c0117c972cfe50d7cbc4 100644
--- a/extension/qfq/qfq/Save.php
+++ b/extension/qfq/qfq/Save.php
@@ -19,6 +19,10 @@ require_once(__DIR__ . '/helper/HelperFile.php');
 //require_once(__DIR__ . '/../qfq/Evaluate.php');
 
 
+/**
+ * Class Save
+ * @package qfq
+ */
 class Save {
 
     private $formSpec = array();  // copy of the loaded form
@@ -38,6 +42,8 @@ class Save {
      * @param array $feSpecAction
      * @param array $feSpecNative
      * @param array $feSpecNativeRaw
+     * @throws CodeException
+     * @throws UserFormException
      */
     public function __construct(array $formSpec, array $feSpecAction, array $feSpecNative, array $feSpecNativeRaw) {
         $this->formSpec = $formSpec;
@@ -81,6 +87,7 @@ class Save {
      * @param array $formValues
      *
      * @return array
+     * @throws UserFormException
      */
     private function createEmptyTemplateGroupElements(array $formValues) {
 
@@ -233,6 +240,10 @@ class Save {
      * @param $feName
      * @return bool
      */
+    /**
+     * @param $feName
+     * @return bool
+     */
     private function isColumnUploadField($feName) {
 
         foreach ($this->feSpecNative AS $formElement) {
@@ -246,10 +257,13 @@ class Save {
     /**
      * Insert new record in table $this->formSpec['tableName'].
      *
+     * @param $tableName
      * @param array $values
      *
      * @return int  last insert id
+     * @throws CodeException
      * @throws DbException
+     * @throws UserFormException
      */
     public function insertRecord($tableName, array $values) {
 
@@ -303,7 +317,11 @@ class Save {
     /**
      * Process all Upload Formelements for the given $recordId. After processing &$formValues will be updated with the
      * final filenames.
-     *
+     * @param $recordId
+     * @throws CodeException
+     * @throws DbException
+     * @throws UserFormException
+     * @throws UserReportException
      */
     public function processAllUploads($recordId) {
 
@@ -592,6 +610,8 @@ class Save {
      *
      * @param array $formElement
      * @param $pathFileName
+     * @throws CodeException
+     * @throws DbException
      * @throws UserFormException
      */
     private function splitUpload(array $formElement, $pathFileName) {
@@ -624,6 +644,7 @@ class Save {
      *
      * @param $pathFileNameSrc
      * @param $fileDestinationSplit
+     * @param $fileSplitTableName
      * @throws CodeException
      * @throws DbException
      * @throws UserFormException
diff --git a/extension/qfq/qfq/database/Database.php b/extension/qfq/qfq/database/Database.php
index b0dcd00fc52a42f19f6975e7b10c359b74700f93..437455e37bc63a31885472d4c4b628fcaa85b0a8 100644
--- a/extension/qfq/qfq/database/Database.php
+++ b/extension/qfq/qfq/database/Database.php
@@ -62,7 +62,7 @@ class Database {
      * Returns current data base handle from Store[System][SYSTEM_DBH].
      * If not exists: open database and store the new dbh in Store[System][SYSTEM_DBH]
      *
-     * @param int $dbIndex Typically '1' for Data, optional 2 for external Form/FormElement
+     * @param string $dbIndex Typically '1' for Data, optional 2 for external Form/FormElement
      *
      * @throws CodeException
      * @throws DbException
@@ -92,6 +92,9 @@ class Database {
         }
     }
 
+    /**
+     * @return mixed|string
+     */
     public function getDbName() {
         return $this->dbName;
     }
@@ -102,8 +105,8 @@ class Database {
      *
      * @param $dbIndex 1,2,...
      *
+     * @param array $config
      * @return array
-     * @throws CodeException
      * @throws UserFormException
      */
     private function getConnectionDetails($dbIndex, array $config) {
@@ -124,6 +127,7 @@ class Database {
     /**
      * Open mysqli database connection if not already done.
      *
+     * @param $config
      * @return \mysqli
      * @throws UserFormException
      */
@@ -168,8 +172,9 @@ class Database {
      *      SELECT | SHOW | DESCRIBE | EXPLAIN: see $mode
      *      INSERT: last_insert_id
      *      UPDATE | DELETE | REPLACE: affected rows
-     * @throws \qfq\CodeException
-     * @throws \qfq\DbException
+     * @throws CodeException
+     * @throws DbException
+     * @throws UserFormException
      */
     public function sql($sql, $mode = ROW_REGULAR, array $parameterArray = array(), $specificMessage = '', array &$keys = array(), array &$stat = array()) {
         $queryType = '';
@@ -186,7 +191,7 @@ class Database {
             $specificMessage .= " ";
         }
 
-        $count = $this->prepareExecute($sql, $parameterArray, $queryType, $stat);
+        $count = $this->prepareExecute($sql, $parameterArray, $queryType, $stat, $specificMessage);
 
         if ($count === false) {
             throw new DbException($specificMessage . "No idea why this error happens - please take some time and check the problem.", ERROR_DB_GENERIC_CHECK);
@@ -282,12 +287,13 @@ class Database {
      *                               the query.
      * @param array $stat DB_NUM_ROWS | DB_INSERT_ID | DB_AFFECTED_ROWS
      *
+     * @param string $specificMessage
      * @return int|mixed
-     * @throws \qfq\CodeException
-     * @throws \qfq\DbException
-     * @throws \qfq\UserFormException
+     * @throws CodeException
+     * @throws DbException
+     * @throws UserFormException
      */
-    private function prepareExecute($sql, array $parameterArray = array(), &$queryType, array &$stat) {
+    private function prepareExecute($sql, array $parameterArray = array(), &$queryType, array &$stat, $specificMessage = '') {
 
         $sqlLogMode = $this->isSqlModify($sql) ? SQL_LOG_MODE_MODIFY : SQL_LOG_MODE_ALL;
         $result = 0;
@@ -297,25 +303,27 @@ class Database {
             $this->store->setVar(SYSTEM_SQL_FINAL, $sql, STORE_SYSTEM);
             $this->store->setVar(SYSTEM_SQL_PARAM_ARRAY, $parameterArray, STORE_SYSTEM);
         }
-
+        if ($specificMessage !== '') {
+            $specificMessage = ' - ' . $specificMessage;
+        }
         // Logfile
         $this->dbLog($sqlLogMode, $sql, $parameterArray);
 
         if (false === ($this->mysqli_stmt = $this->mysqli->prepare($sql))) {
             $this->dbLog(SQL_LOG_MODE_ERROR, $sql, $parameterArray);
-            throw new DbException('[ mysqli: ' . $this->mysqli->errno . ' ] ' . $this->mysqli->error, ERROR_DB_PREPARE);
+            throw new DbException('[ mysqli: ' . $this->mysqli->errno . ' ] ' . $this->mysqli->error . $specificMessage, ERROR_DB_PREPARE);
         }
 
         if (count($parameterArray) > 0) {
             if (false === $this->prepareBindParam($parameterArray)) {
                 $this->dbLog(SQL_LOG_MODE_ERROR, $sql, $parameterArray);
-                throw new DbException('[ mysqli: ' . $this->mysqli_stmt->errno . ' ] ' . $this->mysqli_stmt->error, ERROR_DB_BIND);
+                throw new DbException('[ mysqli: ' . $this->mysqli_stmt->errno . ' ] ' . $this->mysqli_stmt->error . $specificMessage, ERROR_DB_BIND);
             }
         }
 
         if (false === $this->mysqli_stmt->execute()) {
             $this->dbLog(SQL_LOG_MODE_ERROR, $sql, $parameterArray);
-            throw new DbException('[ mysqli: ' . $this->mysqli_stmt->errno . ' ] ' . $this->mysqli_stmt->error, ERROR_DB_EXECUTE);
+            throw new DbException('[ mysqli: ' . $this->mysqli_stmt->errno . ' ] ' . $this->mysqli_stmt->error . $specificMessage, ERROR_DB_EXECUTE);
         }
 
         $msg = '';
@@ -327,7 +335,7 @@ class Database {
             case 'DESCRIBE':
             case 'EXPLAIN':
                 if (false === ($result = $this->mysqli_stmt->get_result())) {
-                    throw new DbException('[ mysqli: ' . $this->mysqli_stmt->errno . ' ] ' . $this->mysqli_stmt->error, ERROR_DB_EXECUTE);
+                    throw new DbException('[ mysqli: ' . $this->mysqli_stmt->errno . ' ] ' . $this->mysqli_stmt->error . $specificMessage, ERROR_DB_EXECUTE);
                 }
                 $queryType = QUERY_TYPE_SELECT;
                 $this->mysqli_result = $result;
@@ -363,7 +371,7 @@ class Database {
                 break;
 
             default:
-                throw new DbException('Unknown comand: "' . $command . '"', ERROR_DB_UNKNOWN_COMMAND);
+                throw new DbException('Unknown command: "' . $command . '"' . $specificMessage, ERROR_DB_UNKNOWN_COMMAND);
                 break;
         }
 
@@ -403,11 +411,13 @@ class Database {
     /**
      * Decide if the SQL statement has to be logged. If yes, create a timestamp and do the log.
      *
-     * @param       $sql
+     * @param string $currentQueryMode
+     * @param string $sql
      * @param array $parameterArray
      *
      * @return string
-     * @throws \qfq\UserFormException
+     * @throws CodeException
+     * @throws UserFormException
      */
     private function dbLog($currentQueryMode = SQL_LOG_MODE_ALL, $sql = '', $parameterArray = array()) {
 
@@ -585,7 +595,6 @@ class Database {
      * @param string $table name of the table
      * @param string $columnName name of the column
      *
-     * @throws UserFormException if the table or column does not exist, or is not of type ENUM or SET
      * @return array
      */
     public function getEnumSetValueList($table, $columnName) {
@@ -649,6 +658,8 @@ class Database {
      * @param string $table table to retrieve column definition from
      *
      * @return array column definition of table as returned by SHOW FIELDS FROM as associative array.
+     * @throws CodeException
+     * @throws DbException
      */
     public function getTableDefinition($table) {
         return $this->sql("SHOW FIELDS FROM `$table`");
@@ -686,6 +697,8 @@ class Database {
      * @param $name
      *
      * @return bool  true if found, else false
+     * @throws CodeException
+     * @throws DbException
      */
     public function existTable($name) {
         $found = false;
@@ -712,8 +725,9 @@ class Database {
      * @param array $formSpec Main FormSpec to copy generic parameter to FormElements
      *
      * @return array|int
-     * @throws \qfq\CodeException
-     * @throws \qfq\DbException
+     * @throws CodeException
+     * @throws DbException
+     * @throws UserFormException
      */
     public function getNativeFormElements($sql, array $param, $formSpec) {
 
diff --git a/extension/qfq/qfq/database/DatabaseUpdate.php b/extension/qfq/qfq/database/DatabaseUpdate.php
index 4278bb8f8cda514cd0918503cacef2dd216f55d5..8e2b50aa75c96832a9dbe35c11e996100517bfc2 100644
--- a/extension/qfq/qfq/database/DatabaseUpdate.php
+++ b/extension/qfq/qfq/database/DatabaseUpdate.php
@@ -24,6 +24,10 @@ require_once(__DIR__ . '/Database.php');
  *
  */
 
+/**
+ * Class DatabaseUpdate
+ * @package qfq
+ */
 class DatabaseUpdate {
 
     /**
@@ -103,6 +107,7 @@ class DatabaseUpdate {
      * @param string $dbUpdate SYSTEM_DB_UPDATE_ON | SYSTEM_DB_UPDATE_OFF | SYSTEM_DB_UPDATE_AUTO
      *
      * @throws CodeException
+     * @throws DbException
      */
     public function checkNupdate($dbUpdate) {
 
@@ -147,6 +152,8 @@ class DatabaseUpdate {
      *
      * @param $old
      * @param $new
+     * @throws CodeException
+     * @throws DbException
      */
     private function dbUpdateStatements($old, $new) {
         if ($new == '' || $old === false) {
@@ -167,7 +174,7 @@ class DatabaseUpdate {
             if ($apply) {
                 // Play Statements
                 foreach ($sqlStatements as $sql) {
-                    $this->db->sql($sql);
+                    $this->db->sql($sql, ROW_REGULAR, array(), "Apply updates to QFQ database. Installed version: $old. New QFQ version: $new");
                 }
                 // Remember already applied updates - in case something breaks and the update has to be repeated.
                 $this->setDatabaseVersion($new);
diff --git a/extension/qfq/qfq/database/DatabaseUpdateData.php b/extension/qfq/qfq/database/DatabaseUpdateData.php
index 3fa3009fea7b46a2acbd27eb2e515ddd5824c24e..7c0b010ef84ebea1e15dbf17808e54192ef990dc 100644
--- a/extension/qfq/qfq/database/DatabaseUpdateData.php
+++ b/extension/qfq/qfq/database/DatabaseUpdateData.php
@@ -108,7 +108,7 @@ $UPDATE_ARRAY = array(
         "ALTER TABLE `FormElement` CHANGE `label` `label` VARCHAR(511) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT ''",
     ],
 
-    '0.25.16' => [
+    '18.04.0' => [
         "ALTER TABLE `Cron` ADD `outputFile` VARCHAR(255) NOT NULL AFTER `comment`",
         "ALTER TABLE `Cron` ADD `outputMode` ENUM('overwrite','append') NOT NULL DEFAULT 'append' AFTER `outputFile`",
         "ALTER TABLE `Cron` ADD `outputPattern` VARCHAR(255) NOT NULL AFTER `outputMode`",
diff --git a/extension/qfq/qfq/exceptions/AbstractException.php b/extension/qfq/qfq/exceptions/AbstractException.php
index c28982ac097c25db2b6a1904853a82def4176535..ec8886239c10b5072378f30d07be1e8cfb796ca9 100644
--- a/extension/qfq/qfq/exceptions/AbstractException.php
+++ b/extension/qfq/qfq/exceptions/AbstractException.php
@@ -18,6 +18,10 @@ require_once(__DIR__ . '/UserFormException.php');
 require_once(__DIR__ . '/../helper/OnArray.php');
 
 
+/**
+ * Class AbstractException
+ * @package qfq
+ */
 class AbstractException extends \Exception {
 
     public $messageArray = array();
@@ -30,6 +34,8 @@ class AbstractException extends \Exception {
 
     /**
      * @return string
+     * @throws CodeException
+     * @throws UserFormException
      */
     public function formatException() {
         $t3Vars = array();
@@ -111,6 +117,7 @@ class AbstractException extends \Exception {
 //        foreach ($show as $key => $value) {
 //            $html .= "$key: " . Support::wrapTag("<strong>", $value) . "<br>";
 //        }
+//        $html ='Houston, we have a problem';
 
         return $html . $htmlDebug;
     }
@@ -118,6 +125,8 @@ class AbstractException extends \Exception {
 
     /**
      * Build a FormEditor link to the broken form.
+     * @param $storeSystem
+     * @return string
      */
     private function buildFormLink($storeSystem) {
 
diff --git a/extension/qfq/qfq/exceptions/CodeException.php b/extension/qfq/qfq/exceptions/CodeException.php
index 588b4647da05150d3cfdfaa49b859a8e4a00ff9c..c837aa3a5be58b046f6111607b286ec9af7e609f 100644
--- a/extension/qfq/qfq/exceptions/CodeException.php
+++ b/extension/qfq/qfq/exceptions/CodeException.php
@@ -22,6 +22,11 @@ class CodeException extends AbstractException {
     /*
       * @return string HTML formatted error string
       */
+    /**
+     * @return string
+     * @throws CodeException
+     * @throws UserFormException
+     */
     public function formatMessage() {
 
         $this->messageArrayDebug[EXCEPTION_TYPE] = 'Code Exception';
diff --git a/extension/qfq/qfq/exceptions/DbException.php b/extension/qfq/qfq/exceptions/DbException.php
index a667c99e30424a7f1c81af8d3a4acc7c843b352e..55fe15b7c223eda6aa70c5b3648ff4c7b69bf7e1 100644
--- a/extension/qfq/qfq/exceptions/DbException.php
+++ b/extension/qfq/qfq/exceptions/DbException.php
@@ -23,6 +23,11 @@ class DbException extends AbstractException {
     /*
     * @return string HTML formatted error string
     */
+    /**
+     * @return string
+     * @throws CodeException
+     * @throws UserFormException
+     */
     public function formatMessage() {
 
         $this->messageArrayDebug[EXCEPTION_TYPE] = 'Db Exception';
diff --git a/extension/qfq/qfq/exceptions/DownloadException.php b/extension/qfq/qfq/exceptions/DownloadException.php
index 83cab74390a13db5d09d02c802d280818fa930c5..978c55795fe45c03171232eb79945426992259cf 100644
--- a/extension/qfq/qfq/exceptions/DownloadException.php
+++ b/extension/qfq/qfq/exceptions/DownloadException.php
@@ -22,6 +22,11 @@ class DownloadException extends AbstractException {
     /*
       * @return string HTML formatted error string
       */
+    /**
+     * @return string
+     * @throws CodeException
+     * @throws UserFormException
+     */
     public function formatMessage() {
 
         $this->messageArrayDebug[EXCEPTION_TYPE] = 'Download Exception';
diff --git a/extension/qfq/qfq/exceptions/ErrorHandler.php b/extension/qfq/qfq/exceptions/ErrorHandler.php
index 702ba275ba33e6a550fcc9efb695c0210f9e5490..50c886c009cbad5015cd797cf2ef3ad6e1698810 100644
--- a/extension/qfq/qfq/exceptions/ErrorHandler.php
+++ b/extension/qfq/qfq/exceptions/ErrorHandler.php
@@ -9,9 +9,20 @@
 namespace qfq;
 
 
+/**
+ * Class ErrorHandler
+ * @package qfq
+ */
 class ErrorHandler {
 
 
+    /**
+     * @param $severity
+     * @param $message
+     * @param $file
+     * @param $line
+     * @return bool|string
+     */
     public static function exception_error_handler($severity, $message, $file, $line) {
 
         if (!(error_reporting() & $severity)) {
diff --git a/extension/qfq/qfq/exceptions/ShellException.php b/extension/qfq/qfq/exceptions/ShellException.php
index 68898cb75e11bb77b9c91b0cbdadaf7d6a45d3df..f957d6b9a64643799e80f9c98c90aeab56e000b5 100644
--- a/extension/qfq/qfq/exceptions/ShellException.php
+++ b/extension/qfq/qfq/exceptions/ShellException.php
@@ -22,6 +22,11 @@ class ShellException extends AbstractException {
     /*
       * @return string HTML formatted error string
       */
+    /**
+     * @return string
+     * @throws CodeException
+     * @throws UserFormException
+     */
     public function formatMessage() {
 
         $this->messageArrayDebug[EXCEPTION_TYPE] = 'Shell Exception';
diff --git a/extension/qfq/qfq/exceptions/UserFormException.php b/extension/qfq/qfq/exceptions/UserFormException.php
index 54f3ca63374ecd90297d3fa798af561cea03367c..ae08a04e2b71f7a642b8ed8947952f6afde7983d 100644
--- a/extension/qfq/qfq/exceptions/UserFormException.php
+++ b/extension/qfq/qfq/exceptions/UserFormException.php
@@ -23,6 +23,11 @@ class UserFormException extends AbstractException {
     /*
     * @return string HTML formatted error string
     */
+    /**
+     * @return string
+     * @throws CodeException
+     * @throws UserFormException
+     */
     public function formatMessage() {
 
         $this->messageArrayDebug[EXCEPTION_TYPE] = 'User Form Exception';
diff --git a/extension/qfq/qfq/exceptions/UserReportException.php b/extension/qfq/qfq/exceptions/UserReportException.php
index 73b3838ba23ac994b40b47a5560b9546a826e264..bc6fe64bdfb884871223a110f62a10605e72f92c 100644
--- a/extension/qfq/qfq/exceptions/UserReportException.php
+++ b/extension/qfq/qfq/exceptions/UserReportException.php
@@ -22,6 +22,11 @@ class UserReportException extends AbstractException {
     /*
     * @return string HTML formatted error string
     */
+    /**
+     * @return string
+     * @throws CodeException
+     * @throws UserFormException
+     */
     public function formatMessage() {
 
         $this->messageArrayDebug[EXCEPTION_TYPE] = 'User Report Exception';
diff --git a/extension/qfq/qfq/form/Dirty.php b/extension/qfq/qfq/form/Dirty.php
index 13edd0b7adb8ce3b4d0ecce2d3b2c225fec7f345..f974739a547062d9c32dd28970d0b3cbce235836 100644
--- a/extension/qfq/qfq/form/Dirty.php
+++ b/extension/qfq/qfq/form/Dirty.php
@@ -92,7 +92,6 @@ class Dirty {
      *
      * @return array|int
      * @throws CodeException
-     * @throws DbException
      * @throws UserFormException
      */
     public function process() {
@@ -142,7 +141,8 @@ class Dirty {
      * @param string $recordHashMd5
      *
      * @return array
-     * @throws \qfq\CodeException
+     * @throws CodeException
+     * @throws DbException
      */
     private function acquireDirty($recordId, array $tableVars, $recordHashMd5) {
 
@@ -205,6 +205,8 @@ class Dirty {
      * @param string $currentFormDirtyMode
      *
      * @return array
+     * @throws CodeException
+     * @throws DbException
      */
     private function conflict(array $recordDirty, $currentFormDirtyMode) {
         $status = API_ANSWER_STATUS_CONFLICT;
@@ -250,8 +252,6 @@ class Dirty {
      * @param string $recordHashMd5
      *
      * @return array
-     * @throws \qfq\CodeException
-     * @throws \qfq\DbException
      */
     private function writeDirty($s, $recordId, array $tableVars, $feUser, $recordHashMd5) {
 
@@ -279,9 +279,8 @@ class Dirty {
      * @param int $recordId
      * @param string $recordHashMd5 - timestamp e.g. '2017-07-27 14:06:56'
      *
+     * @param $rcMd5
      * @return bool true if $recordHashMd5 is different from current record md5 hash.
-     * @throws CodeException
-     * @throws DbException
      */
     private function isRecordModified($tableName, $recordId, $recordHashMd5, &$rcMd5) {
 
@@ -305,6 +304,8 @@ class Dirty {
      * @param string $msg - return preformatted message in case of conflict
      *
      * @return int LOCK_NOT_FOUND | LOCK_FOUND_OWNER | LOCK_FOUND_CONFLICT,
+     * @throws CodeException
+     * @throws DbException
      */
     public function getCheckDirty($tableName, $recordId, array &$recordDirty, &$msg) {
 
@@ -346,9 +347,11 @@ class Dirty {
      * @param string $tableName
      * @param int $recordId
      *
+     * @param bool $flagCheckModifiedFirst
      * @return array
-     * @throws \qfq\CodeException
-     * @throws \qfq\UserFormException
+     * @throws CodeException
+     * @throws DbException
+     * @throws UserFormException
      */
     public function checkDirtyAndRelease($formMode, $lockTimeout, $dirtyMode, $tableName, $recordId, $flagCheckModifiedFirst = false) {
 
@@ -435,7 +438,6 @@ class Dirty {
      * @param int $recordDirtyId
      *
      * @throws CodeException
-     * @throws DbException
      */
     private function deleteDirtyRecord($recordDirtyId) {
 
diff --git a/extension/qfq/qfq/form/FormAction.php b/extension/qfq/qfq/form/FormAction.php
index 7cb9f3b9a5d79bad4046352e8e1c319a61d5840e..ee804a31c5cbb1def46ce49820f227ec9fccf516 100644
--- a/extension/qfq/qfq/form/FormAction.php
+++ b/extension/qfq/qfq/form/FormAction.php
@@ -43,6 +43,8 @@ class FormAction {
      * @param array $formSpec
      * @param Database $db
      * @param bool|false $phpUnit
+     * @throws CodeException
+     * @throws UserFormException
      */
     public function __construct(array $formSpec, Database $db, $phpUnit = false) {
         $this->formSpec = $formSpec;
@@ -215,6 +217,7 @@ class FormAction {
      * @param array $fe
      *
      * @return bool  true if none FE is specified or all specified are non empty.
+     * @throws CodeException
      */
     private function checkRequiredList(array $fe) {
 
@@ -238,6 +241,10 @@ class FormAction {
 
     /**
      * @param array $feSpecAction
+     * @throws CodeException
+     * @throws DbException
+     * @throws UserFormException
+     * @throws UserReportException
      */
     private function doSendMail(array $feSpecAction) {
 
@@ -397,6 +404,7 @@ class FormAction {
      *
      * @return bool true if at lease one of the named elements is non empty on STORE_FORM (use SANATIZE_ALLOW_ALL to
      *              perform the check)
+     * @throws CodeException
      */
     private function checkFormElements($listOfFormElementNames) {
         $arr = explode(',', $listOfFormElementNames);
@@ -446,7 +454,9 @@ class FormAction {
      * @param array $clipboard
      *
      * @throws CodeException
+     * @throws DbException
      * @throws UserFormException
+     * @throws UserReportException
      */
     public function doAllFormElementPaste(array $feSpecAction, $recordSourceTable, $recordDestinationTable, $sub, array $clipboard) {
 
@@ -489,6 +499,7 @@ class FormAction {
      *
      *
      * @param array $feSpecActionAll - all FE.class='action' - just process 'paste'
+     * @param array $feSpecAction
      * @param array $updateRecords - array of records: 'id' is the source.id, all other fields will replace
      *                                       source columns.
      * @param        $recordSourceTable - table name from where to copy the source records
@@ -496,12 +507,11 @@ class FormAction {
      * @param string $sub - on the highest level an empty string. It's a filter, value comes from
      *                                       FE.name, to specify sub-sub copy rules.
      * @param array $clipboard -
-     * @param string $field - name of a column where to save the lastInsertId.
-     *
      * @return int - lastInsertId
      * @throws CodeException
      * @throws DbException
      * @throws UserFormException
+     * @throws UserReportException
      */
     private function prepareDuplicate(array $feSpecActionAll, array $feSpecAction, array $updateRecords, $recordSourceTable, $recordDestinationTable, $sub, array $clipboard) {
         $translateMap = array();
@@ -562,6 +572,8 @@ class FormAction {
      * @param array $translateMap array with old id's as keys, and new id's as their value
      * @param string $translateIdColumn column name to update. E.g. FormElement.feIdContainer, Ggroup.grId, ...
      * @param string $tableName
+     * @throws CodeException
+     * @throws DbException
      */
     private function translateId(array $translateMap, $translateIdColumn, $tableName) {
 
diff --git a/extension/qfq/qfq/form/TypeAhead.php b/extension/qfq/qfq/form/TypeAhead.php
index bf8c8fd0fd309ae8d2bbaa765b1099c68b7ec2a0..554aafe0b1b8a2e41cf9c8a0aa6fa96d1337a572 100644
--- a/extension/qfq/qfq/form/TypeAhead.php
+++ b/extension/qfq/qfq/form/TypeAhead.php
@@ -17,6 +17,10 @@ require_once(__DIR__ . '/../helper/Ldap.php');
 require_once(__DIR__ . '/../database/Database.php');
 
 
+/**
+ * Class TypeAhead
+ * @package qfq
+ */
 class TypeAhead {
 
     /**
@@ -30,7 +34,8 @@ class TypeAhead {
     private $vars = array();
 
     /**
-     *
+     * @param bool $phpUnit
+     * @throws CodeException
      */
     public function __construct($phpUnit = false) {
 
@@ -137,6 +142,7 @@ class TypeAhead {
 
         return $this->db->makeArrayDict($arr, TYPEAHEAD_SQL_KEY_NAME, API_TYPEAHEAD_VALUE, API_TYPEAHEAD_KEY, API_TYPEAHEAD_VALUE);
     }
+
     /**
      * Returns a dict array [ API_TYPEAHEAD_KEY => key, API_TYPEAHEAD_VALUE => value ] with the prefetch result
      *
@@ -144,6 +150,8 @@ class TypeAhead {
      * @param string $key
      *
      * @return array
+     * @throws CodeException
+     * @throws DbException
      * @throws UserFormException
      */
 
diff --git a/extension/qfq/qfq/helper/BindParam.php b/extension/qfq/qfq/helper/BindParam.php
index cb55a8755d72df330bd90971f6d3f2de13b8be0e..f4dfa58d6fe494ed99ab94eaaef100c54df200e4 100644
--- a/extension/qfq/qfq/helper/BindParam.php
+++ b/extension/qfq/qfq/helper/BindParam.php
@@ -9,11 +9,18 @@
 namespace qfq;
 
 
+/**
+ * Class BindParam
+ * @package qfq
+ */
 class BindParam {
 
     /* */
     private $values = array(), $types = '';
 
+    /**
+     * @param $value
+     */
     public function add(&$value) {
         $this->values[] = &$value;
         $this->types .= $this->getParameterBindType($value);
@@ -39,6 +46,9 @@ class BindParam {
         return $type;
     }
 
+    /**
+     * @return array
+     */
     public function get() {
 
         return array_merge(array($this->types), $this->values);
diff --git a/extension/qfq/qfq/helper/HelperFile.php b/extension/qfq/qfq/helper/HelperFile.php
index a8d52b481bcfa232fcd3632d33a836c045006bc6..6d9c9886b43a40ed52e7a1637c59341adbd08815 100644
--- a/extension/qfq/qfq/helper/HelperFile.php
+++ b/extension/qfq/qfq/helper/HelperFile.php
@@ -10,6 +10,10 @@ namespace qfq;
 
 require_once(__DIR__ . '/../Constants.php');
 
+/**
+ * Class HelperFile
+ * @package qfq
+ */
 class HelperFile {
 
     /**
@@ -61,6 +65,7 @@ class HelperFile {
      * Return the mimetype of $pathFilename
      *
      * @param string $pathFilename
+     * @param bool $flagIgnoreError
      * @return string
      * @throws UserFormException
      */
diff --git a/extension/qfq/qfq/helper/HelperFormElement.php b/extension/qfq/qfq/helper/HelperFormElement.php
index 6fa692cf93a303f4bf6075ec65359d3d02cf2ec0..d10b71ba01a435bde14e0fa771439548879f0ade 100644
--- a/extension/qfq/qfq/helper/HelperFormElement.php
+++ b/extension/qfq/qfq/helper/HelperFormElement.php
@@ -15,6 +15,10 @@ require_once(__DIR__ . '/../../qfq/Constants.php');
 require_once(__DIR__ . '/../../qfq/helper/KeyValueStringParser.php');
 require_once(__DIR__ . '/../../qfq/exceptions/UserFormException.php');
 
+/**
+ * Class HelperFormElement
+ * @package qfq
+ */
 class HelperFormElement {
 
     /**
@@ -26,7 +30,8 @@ class HelperFormElement {
      * @param array $elements
      * @param string $keyName Typically F_PARAMETER or FE_PARAMETER (both: 'parameter')
      *
-     * @throws \qfq\UserFormException
+     * @throws CodeException
+     * @throws UserFormException
      */
     public static function explodeParameterInArrayElements(array &$elements, $keyName) {
         foreach ($elements AS $key => $element) {
@@ -55,8 +60,9 @@ class HelperFormElement {
      * @param array $element
      * @param string $keyName Typically F_PARAMETER or FE_PARAMETER (both: 'parameter')
      *
+     * @param bool $flagAllowOverwrite
      * @throws CodeException
-     * @throws \qfq\UserFormException
+     * @throws UserFormException
      */
     public static function explodeParameter(array &$element, $keyName, $flagAllowOverwrite = false) {
         // Something to explode?
@@ -85,7 +91,9 @@ class HelperFormElement {
      *
      * @param array $formSpecFeSpecNative
      *
+     * @param $parameterLanguageFieldName
      * @return array
+     * @throws CodeException
      * @throws UserFormException
      */
     public static function setLanguage(array $formSpecFeSpecNative, $parameterLanguageFieldName) {
@@ -301,13 +309,15 @@ class HelperFormElement {
      * @param bool $showInline
      *
      * @return array
+     * @throws CodeException
+     * @throws UserFormException
      */
     public static function prepareExtraButton(array $formElement, $showInline) {
 
         $store = Store::getInstance();
 
-        $infoSymbolInside = $store->getVar(SYSTEM_GFX_EXTRA_BUTTON_INFO_INLINE, STORE_SYSTEM);
-        $infoSymbolOutside = $store->getVar(SYSTEM_GFX_EXTRA_BUTTON_INFO_BELOW, STORE_SYSTEM);
+        $infoSymbolInside = $store->getVar(SYSTEM_EXTRA_BUTTON_INFO_INLINE, STORE_SYSTEM);
+        $infoSymbolOutside = $store->getVar(SYSTEM_EXTRA_BUTTON_INFO_BELOW, STORE_SYSTEM);
 
         if (SYSTEM_EXTRA_BUTTON_INFO_POSITION_BELOW == $store->getVar(SYSTEM_EXTRA_BUTTON_INFO_POSITION, STORE_SYSTEM)) {
             $showInline = false;
diff --git a/extension/qfq/qfq/helper/Ldap.php b/extension/qfq/qfq/helper/Ldap.php
index ca8fc994bc57fe2b26b6e7c09b24cb588606d9f8..f5a5ca7114d0e1dd1c627231ee3ce33841d4bf29 100644
--- a/extension/qfq/qfq/helper/Ldap.php
+++ b/extension/qfq/qfq/helper/Ldap.php
@@ -16,6 +16,10 @@ require_once(__DIR__ . '/../exceptions/ErrorHandler.php');
 require_once(__DIR__ . '/../exceptions/UserFormException.php');
 
 
+/**
+ * Class Ldap
+ * @package qfq
+ */
 class Ldap {
 
     /**
@@ -203,6 +207,7 @@ class Ldap {
      * @param string $mode MODE_LDAP_SINGLE | MODE_LDAP_MULTI | MODE_LDAP_PREFETCH
      *
      * @return array Array: [ [ 'key' => '...', 'value' => '...' ], ]
+     * @throws CodeException
      * @throws UserFormException
      */
     public function process(array $config, $searchValue, $mode = MODE_LDAP_MULTI) {
@@ -335,11 +340,11 @@ class Ldap {
      *  $keyArr to pass them via 'call_user_func_array' to sprintf.
      *
      * @param $format
+     * @param array $keyArr
      * @param $infoElement
      *
+     * @param bool $doHtmlEntity
      * @return string       output of sprintf
-     * @throws CodeException
-     * @throws UserFormException
      */
     private function printfResult($format, array $keyArr, $infoElement, $doHtmlEntity = true) {
 
diff --git a/extension/qfq/qfq/helper/Logger.php b/extension/qfq/qfq/helper/Logger.php
index 02b2e5a575f9f6b517d9be0a017c3de4adde860a..9ec42f3b1fa28565d260c08751ef2ca3199e4616 100644
--- a/extension/qfq/qfq/helper/Logger.php
+++ b/extension/qfq/qfq/helper/Logger.php
@@ -11,6 +11,10 @@ namespace qfq;
 require_once(__DIR__ . '/../Constants.php');
 require_once(__DIR__ . '/../exceptions/UserFormException.php');
 
+/**
+ * Class Logger
+ * @package qfq
+ */
 class Logger {
 
     /**
@@ -19,6 +23,7 @@ class Logger {
      * @param $msg
      * @param $filename
      *
+     * @param string $mode
      * @throws UserFormException
      */
     public static function logMessage($msg, $filename, $mode = FILE_MODE_APPEND) {
diff --git a/extension/qfq/qfq/helper/OnArray.php b/extension/qfq/qfq/helper/OnArray.php
index e58cf337308ebc7b75eead2c454e8ba95533211e..1604e491ba8870652edc863d215200c2cd0a7de9 100644
--- a/extension/qfq/qfq/helper/OnArray.php
+++ b/extension/qfq/qfq/helper/OnArray.php
@@ -286,6 +286,8 @@ class OnArray {
      * @param array $keyNames
      * @param bool $createMissing
      *
+     * @param bool $skipZero
+     * @param bool $skipEmpty
      * @return array
      */
     public static function getArrayItems(array $src, array $keyNames, $createMissing = false, $skipZero = false, $skipEmpty = false) {
diff --git a/extension/qfq/qfq/helper/OnString.php b/extension/qfq/qfq/helper/OnString.php
index 946ae8aec0c1dcd3a1633ca9a6fc06f4f18465ac..8c46e34de4643463e04bf78b10c2fbe906041724 100644
--- a/extension/qfq/qfq/helper/OnString.php
+++ b/extension/qfq/qfq/helper/OnString.php
@@ -10,6 +10,10 @@ namespace qfq;
 
 require_once(__DIR__ . '/../Constants.php');
 
+/**
+ * Class OnString
+ * @package qfq
+ */
 class OnString {
 
     /**
diff --git a/extension/qfq/qfq/helper/Sanitize.php b/extension/qfq/qfq/helper/Sanitize.php
index bb1b97adff9e5491ab1cb43c58d39464b3eba475..2c5221b028b797726032c39daad823e322ae7099 100644
--- a/extension/qfq/qfq/helper/Sanitize.php
+++ b/extension/qfq/qfq/helper/Sanitize.php
@@ -54,12 +54,11 @@ class Sanitize {
      * @param string $value value to check
      * @param string $sanitizeClass
      * @param string $pattern Pattern as regexp
-     * @param array $decimalFormat with [ size, precision ]
+     * @param string $decimalFormat with 'size,precision'
      * @param string $mode SANITIZE_EXCEPTION | SANITIZE_EMPTY_STRING
-     *
      * @return string
+     * @throws CodeException
      * @throws UserFormException
-     * @throws \qfq\CodeException
      */
     public static function sanitize($value, $sanitizeClass = SANITIZE_DEFAULT, $pattern = '', $decimalFormat = '', $mode = SANITIZE_EMPTY_STRING) {
 
@@ -130,12 +129,11 @@ class Sanitize {
      *   If check fails, depending on $mode, throws an UserException or return an empty string.
      *
      * @param string $value value to check
-     * @param $formElement
+     * @param $min
+     * @param $max
      * @param string $mode SANITIZE_EXCEPTION | SANITIZE_EMPTY_STRING
-     *
      * @return string
      * @throws UserFormException
-     * @throws \qfq\CodeException
      */
     public static function checkMinMax($value, $min, $max, $mode = SANITIZE_EMPTY_STRING) {
         $errorCode = 0;
@@ -166,6 +164,8 @@ class Sanitize {
      *
      * @param $filename
      *
+     * @param bool $flagBaseName
+     * @param bool $allowSlash
      * @return mixed
      */
     public static function safeFilename($filename, $flagBaseName = false, $allowSlash = false) {
@@ -223,7 +223,7 @@ class Sanitize {
 
     /**
      * Take the given $item (or iterates over all elements of the given array) and normalize the content.
-     * Only strings will be normalized. Sub arrays will be recursived normalized. Numeric content is skipped.
+     * Only strings will be normalized. Sub arrays will be normalized recursive. Numeric content is skipped.
      * Throws an exception for unknown content.
      *
      * It's important to normalize the user input: e.g. someone is searching for a record and input the search string
@@ -279,4 +279,24 @@ class Sanitize {
         return $item;
 
     }
+
+    /**
+     * Check a given $_GET[$key] is digit.
+     * If yes: do nothing
+     * If no: set to the first character (if it is a digit) else to an empty string.
+     *
+     * @param $key
+     */
+    public static function digitCheckAndCleanGet($key) {
+
+        if (isset($_GET[$key]) && !ctype_digit($_GET[$key])) {
+            if (ctype_digit($_GET[$key][0])) {
+                $_GET[$key] = $_GET[$key][0];
+            } else {
+                $_GET[$key] = '';
+            }
+        }
+
+    }
+
 }
\ No newline at end of file
diff --git a/extension/qfq/qfq/helper/SessionCookie.php b/extension/qfq/qfq/helper/SessionCookie.php
index 87c0caf1c66d3bfaf91c81a5b9573d71b3cc9205..13fd4176597f019c746aa081a3829ca8002dd98d 100644
--- a/extension/qfq/qfq/helper/SessionCookie.php
+++ b/extension/qfq/qfq/helper/SessionCookie.php
@@ -10,6 +10,10 @@ namespace qfq;
 
 require_once(__DIR__ . '/../Constants.php');
 
+/**
+ * Class SessionCookie
+ * @package qfq
+ */
 class SessionCookie {
 
     /**
@@ -34,7 +38,7 @@ class SessionCookie {
 
         $this->cleanTempFiles = !Support::findInSet(SYSTEM_SHOW_DEBUG_INFO_DOWNLOAD, $config[SYSTEM_SHOW_DEBUG_INFO]);
 
-        $urlParts = parse_url($config[SYSTEM_BASE_URL_PRINT]);
+        $urlParts = parse_url($config[SYSTEM_BASE_URL]);
         $domain = $urlParts['host'];
         $path = $urlParts['path'];
 
diff --git a/extension/qfq/qfq/helper/Support.php b/extension/qfq/qfq/helper/Support.php
index 72d047498b38c3177ebec87b6e65424a015f2ddb..ca924704faf44e07e5f6b7e03ef16e3f11b66367 100644
--- a/extension/qfq/qfq/helper/Support.php
+++ b/extension/qfq/qfq/helper/Support.php
@@ -14,11 +14,17 @@ require_once(__DIR__ . '/Sanitize.php');
 const LONG_CURLY_OPEN = '#/+open+/#';
 const LONG_CURLY_CLOSE = '#/+close+/#';
 
+/**
+ * Class Support
+ * @package qfq
+ */
 class Support {
 
     /**
      * @param array $queryArray Empty or prefilled assoc array with url parameter
      * @param string $mode PARAM_T3_NO_ID, PARAM_T3_ALL
+     * @throws CodeException
+     * @throws UserFormException
      */
     public static function appendTypo3ParameterToArray(array &$queryArray, $mode = PARAM_T3_ALL) {
 //        if (isset($_GET['id']))
@@ -138,6 +144,7 @@ class Support {
      * @param string $tooltipText
      *
      * @return string
+     * @throws CodeException
      */
     public static function doTooltip($htmlId, $tooltipText) {
 
@@ -724,6 +731,7 @@ class Support {
      * @return array
      *
      * @throws CodeException
+     * @throws UserFormException
      */
     public static function setFeDefaults(array $formElement, array $formSpec = array()) {
 
@@ -1372,6 +1380,8 @@ class Support {
 
     /**
      * Calculates a value with 'm', 'k', 'g' in Bytes.
+     * @param $size_str
+     * @return float|int|string
      */
     public static function returnBytes($size_str) {
 
diff --git a/extension/qfq/qfq/helper/Token.php b/extension/qfq/qfq/helper/Token.php
index feb6b9ccc150cd5b988236dcdf0cf9ca107adf92..3cac260ca87433830b1c0172f5b93027823f016f 100644
--- a/extension/qfq/qfq/helper/Token.php
+++ b/extension/qfq/qfq/helper/Token.php
@@ -8,6 +8,10 @@
 
 namespace qfq;
 
+/**
+ * Class Token
+ * @package qfq
+ */
 class Token {
 
     /**
@@ -29,6 +33,7 @@ class Token {
         switch ($key) {
             case TOKEN_URL:
             case TOKEN_MAIL:
+            break; // No check - can't be generally decided
             case TOKEN_GLYPH:
                 throw new UserReportException ("Missing value for token '$key'", ERROR_MISSING_VALUE);
                 break;
diff --git a/extension/qfq/qfq/report/Download.php b/extension/qfq/qfq/report/Download.php
index 289cb8209fb6f81ad3df99199283e45761e308f7..bdd6735e3afffbb77a23d8129a492dc87e7efa97 100644
--- a/extension/qfq/qfq/report/Download.php
+++ b/extension/qfq/qfq/report/Download.php
@@ -68,6 +68,8 @@ class Download {
 
     /**
      * @param bool|false $phpUnit
+     * @throws CodeException
+     * @throws UserFormException
      */
     public function __construct($phpUnit = false) {
 
@@ -87,7 +89,8 @@ class Download {
      * @param array $files
      *
      * @return string  - fileName of concatenated file
-     * @throws DownloadException
+     * @throws UserFormException
+     * @throws downloadException
      */
     private function concatPdfFiles(array $files) {
 
@@ -270,6 +273,8 @@ class Download {
      * @return string            Filename of the generated file. The filename only points to a real existing filename with  $outputMode=OUTPUT_MODE_FILE
      * @throws CodeException
      * @throws DownloadException
+     * @throws UserFormException
+     * @throws UserReportException
      */
     private function doElements(array $vars, $outputMode) {
 
@@ -357,6 +362,7 @@ class Download {
     /**
      * @param string $urlParam
      * @return string
+     * @throws UserFormException
      * @throws UserReportException
      */
     private function doThumbnail($urlParam) {
diff --git a/extension/qfq/qfq/report/Error.php b/extension/qfq/qfq/report/Error.php
index b553148e0d513f36198cb0634b936dc898bc82a6..2bd3ee511e2290f7648db9fecc4a7d88e974f9eb 100644
--- a/extension/qfq/qfq/report/Error.php
+++ b/extension/qfq/qfq/report/Error.php
@@ -59,6 +59,8 @@ class SyntaxReportException extends \Exception {
 
     /**
      * @return string
+     * @throws CodeException
+     * @throws UserFormException
      */
     public function errorMessage() {
         $store = Store::getInstance();
diff --git a/extension/qfq/qfq/report/Html2Pdf.php b/extension/qfq/qfq/report/Html2Pdf.php
index df5fafc40bddb6e79fd1f79864713d945e12f5c7..90718c31793f5a5277d9e24a201bed498887964b 100644
--- a/extension/qfq/qfq/report/Html2Pdf.php
+++ b/extension/qfq/qfq/report/Html2Pdf.php
@@ -20,6 +20,10 @@ require_once(__DIR__ . '/../helper/SessionCookie.php');
 require_once(__DIR__ . '/../helper/Logger.php');
 
 
+/**
+ * Class Html2Pdf
+ * @package qfq
+ */
 class Html2Pdf {
 
     /**
@@ -66,16 +70,12 @@ class Html2Pdf {
 
         $this->config = $config;
 
-        if (!isset($config[SYSTEM_BASE_URL_PRINT]) || $config[SYSTEM_BASE_URL_PRINT] == '') {
-            throw new \exception(CONFIG_INI . ' - Missing ' . SYSTEM_BASE_URL_PRINT, ERROR_HTML2PDF_MISSING_CONFIG);
-        }
-
-        if (!isset($config[SYSTEM_WKHTMLTOPDF]) || $config[SYSTEM_WKHTMLTOPDF] == '') {
-            throw new \exception(CONFIG_INI . ' - Missing ' . SYSTEM_WKHTMLTOPDF, ERROR_HTML2PDF_MISSING_CONFIG);
+        if (!isset($config[SYSTEM_BASE_URL]) || $config[SYSTEM_BASE_URL] == '') {
+            throw new \exception('Please configure ' . SYSTEM_BASE_URL, ERROR_HTML2PDF_MISSING_CONFIG);
         }
 
-        if (!is_executable($config[SYSTEM_WKHTMLTOPDF])) {
-            throw new \exception(CONFIG_INI . ' - ' . SYSTEM_WKHTMLTOPDF . '=' . $config[SYSTEM_WKHTMLTOPDF] . ' - not found or not executable.', ERROR_HTML2PDF_WKHTML_NOT_EXECUTABLE);
+        if (!isset($config[SYSTEM_CMD_WKHTMLTOPDF]) || $config[SYSTEM_CMD_WKHTMLTOPDF] == '') {
+            throw new \exception('Please configure ' . SYSTEM_CMD_WKHTMLTOPDF, ERROR_HTML2PDF_MISSING_CONFIG);
         }
 
         $this->session = Session::getInstance($phpUnit);
@@ -88,6 +88,7 @@ class Html2Pdf {
     /**
      * Return an array with GET params who are clean - they do not violate $pattern.
      *
+     * @param array $get
      * @return array
      */
     private function readCleanGetParam(array $get) {
@@ -178,7 +179,7 @@ class Html2Pdf {
                 break;
             case TOKEN_URL_PARAM:
             case TOKEN_PAGE:
-                $host = $this->config[SYSTEM_BASE_URL_PRINT];
+            $host = $this->config[SYSTEM_BASE_URL];
                 $urlParamString = $url;
                 break;
             default:
@@ -205,7 +206,7 @@ class Html2Pdf {
         }
 
         $urlPrint = escapeshellarg($url);
-        $wkhtmlToPdf = $this->config[SYSTEM_WKHTMLTOPDF];
+        $wkhtmlToPdf = $this->config[SYSTEM_CMD_WKHTMLTOPDF];
 
         $filename = tempnam(sys_get_temp_dir(), TMP_FILE_PREFIX);
         $filenameEscape = escapeshellarg($filename);
@@ -214,7 +215,7 @@ class Html2Pdf {
         $customHeader = '--custom-header User-Agent ' . escapeshellarg($_SERVER['HTTP_USER_AGENT']) . ' --custom-header-propagation'; // By default 'Typo3' expects the same User-Agent for the FE-Session
 
         // Very important: The current lock on session SESSION_NAME has to be freed, cause wkhtmltopdf will use the same
-        // session in a few moments and this script remains active during that the time and that would cause a deadlock else.
+        // session in a few moments and this script remains active during that time and that would cause a deadlock else.
         $this->session->close();
         $cmd = "$wkhtmlToPdf $customHeader $cookieOptions $options $urlPrint $filenameEscape";
 
diff --git a/extension/qfq/qfq/report/Link.php b/extension/qfq/qfq/report/Link.php
index 074dcd85d4227eadbf9bfd68fc41327e29c7e7d9..71930fb3c76120dea69367097cf8675f91140dda 100644
--- a/extension/qfq/qfq/report/Link.php
+++ b/extension/qfq/qfq/report/Link.php
@@ -47,7 +47,7 @@ require_once(__DIR__ . '/Thumbnail.php');
  * c:class  [n|i|e|<class>]
  * q:question  <text>
  * e:encryption 0|1
- * b:bootstrap button
+ * b:bootstrap [0|1|<button>]
  * 
  * E:edit
  * N:new
@@ -235,7 +235,10 @@ class Link {
      * __construct
      *
      * @param Sip $sip
+     * @param string $dbIndexData
      * @param bool $phpUnit
+     * @throws CodeException
+     * @throws UserFormException
      */
     public function __construct(Sip $sip, $dbIndexData = DB_INDEX_DEFAULT, $phpUnit = false) {
         $this->phpUnit = $phpUnit;
@@ -315,6 +318,7 @@ class Link {
      * @param       $keyName
      *
      * @return string
+     * @throws CodeException
      */
     private function wrapLinkTextOnly(array $vars, $keyName) {
 
@@ -340,6 +344,8 @@ class Link {
      *
      * @return string The complete HTML encoded Link like <a href='http://example.com' class='external'><img
      *                src='iconf.gif' title='help text'>Description</a>
+     * @throws CodeException
+     * @throws UserFormException
      * @throws UserReportException
      */
     public function renderLink($str) {
@@ -477,6 +483,8 @@ class Link {
      * @param array $tokenGiven
      *
      * @return array
+     * @throws CodeException
+     * @throws UserFormException
      * @throws UserReportException
      */
     private function fillParameter($str, array &$tokenGiven) {
@@ -510,7 +518,7 @@ class Link {
             $tokenGiven[$key] = true;
 
             if (!isset($this->tableVarName[$key])) {
-                throw new UserReportException ("Unknown link qualifier: '$key' - do you forget the one character qualifier?", ERROR_UNKNOWN_LINK_QUALIFIER);
+                throw new UserReportException ("Unknown link qualifier: '$key' - did you forget the one character qualifier?", ERROR_UNKNOWN_LINK_QUALIFIER);
             }
 
             $keyName = $this->tableVarName[$key]; // convert token to name
@@ -557,6 +565,11 @@ class Link {
             }
         }
 
+        // Download Link needs some extra work
+        if ($tokenGiven[TOKEN_DOWNLOAD]) {
+            $vars = $this->buildDownloadLate($vars);
+        }
+
         // Final Checks
         $this->checkParam($tokenGiven, $vars);
 
@@ -656,6 +669,7 @@ class Link {
      *
      * @param array $tokenGiven
      *
+     * @param array $vars
      * @throws UserReportException
      */
     private function checkParam(array $tokenGiven, array $vars) {
@@ -700,7 +714,9 @@ class Link {
      * @param array $vars
      * @param array $tokenGiven
      *
-     * @return string
+     * @return array
+     * @throws CodeException
+     * @throws UserFormException
      * @throws UserReportException
      */
     private function processParameter(array $vars, array $tokenGiven) {
@@ -745,7 +761,7 @@ class Link {
             case DOWNLOAD_MODE_FILE:
             case DOWNLOAD_MODE_EXCEL:
                 if ($cnt > 1) {
-                    throw new UserFormException("With 'downloadMode' = 'file' or 'excle', only one element source is allowed.", ERROR_DOWNLOAD_UNEXPECTED_NUMBER_OF_SOURCES);
+                    throw new UserFormException("With 'downloadMode' = 'file' only one element source is allowed.", ERROR_DOWNLOAD_UNEXPECTED_NUMBER_OF_SOURCES);
                 }
                 break;
             default:
@@ -765,6 +781,7 @@ class Link {
      *
      * @return string
      * @throws CodeException
+     * @throws UserFormException
      * @throws UserReportException
      */
     private function doHref(array &$vars, array $tokenGiven) {
@@ -926,6 +943,7 @@ class Link {
      * @param array $vars
      *
      * @return string
+     * @throws CodeException
      */
     private function doSymbol(array $vars) {
         $tags = '';
@@ -980,6 +998,8 @@ class Link {
      * @param array $vars
      *
      * @return string
+     * @throws CodeException
+     * @throws UserReportException
      */
     private function doQuestion(array $vars) {
 
@@ -1028,7 +1048,7 @@ EOF;
      * @param array $vars
      *
      * @return string
-     * @throws UserReportException
+     * @throws CodeException
      */
     private function doAnchor(array $vars) {
 
@@ -1052,6 +1072,7 @@ EOF;
      * @param array $vars
      *
      * @return string
+     * @throws UserFormException
      * @throws UserReportException
      */
     private function doThumbnail(array $vars) {
@@ -1235,7 +1256,6 @@ EOF;
      * @param $value
      *
      * @return array
-     * @throws UserReportException
      */
     private function buildPage($vars, $value) {
 
@@ -1256,26 +1276,57 @@ EOF;
      * @param $value
      *
      * @return array
-     * @throws UserReportException
      */
     private function buildDownload($vars, $value) {
 
+        return $vars;
+    }
+
+    /**
+     * @param $vars
+     * @return array
+     * @throws CodeException
+     */
+    private function buildDownloadLate($vars) {
+
+        if ($vars[NAME_BOOTSTRAP_BUTTON] == '') {
+            $vars = $this->buildBootstrapButton($vars, '');
+        }
+
+        $bootstrapButton = $vars[NAME_BOOTSTRAP_BUTTON];
+        if ($vars[NAME_BOOTSTRAP_BUTTON] == '0') {
+            $bootstrapButton = '';
+            $vars[NAME_GLYPH] = '';
+            $vars[NAME_EXTRA_CONTENT_WRAP] = '';
+        } else {
+            $vars[NAME_GLYPH] = GLYPH_ICON_FILE;
+            $vars[NAME_GLYPH_TITLE] = "Download";
+        }
+
         $text = DOWNLOAD_POPUP_REPLACE_TEXT;
         $title = DOWNLOAD_POPUP_REPLACE_TITLE;
 
-        $attributes = 'class="btn btn-default" data-toggle="modal" data-target="#qfqModal101" data-title="' . $title .
+        $attributes = Support::doAttribute('class', $bootstrapButton, true);
+        $attributes .= ' data-toggle="modal" data-target="#qfqModal101" data-title="' . $title .
             '" data-text="' . $text . '" data-backdrop="static" data-keyboard="false" ';
+
         $onClick = <<<EOF
            onclick="$('#qfqModalTitle101').text($(this).data('title')); $('#qfqModalText101').text($(this).data('text'));"
 EOF;
 
-        $vars[NAME_GLYPH] = GLYPH_ICON_FILE;
-        $vars[NAME_GLYPH_TITLE] = "Download";
         $vars[NAME_URL] = API_DIR . '/' . API_DOWNLOAD_PHP;
         $vars[NAME_LINK_CLASS_DEFAULT] = NO_CLASS;
-        $vars[NAME_EXTRA_CONTENT_WRAP] = '<button type="button" ' . $attributes . $onClick . '>';
+
+//        if ($vars[NAME_BOOTSTRAP_BUTTON] == '0') {
+//            $vars[NAME_EXTRA_CONTENT_WRAP] = '<button type="button" ' . $attributes . $onClick . '>';
+//        } else {
+            $vars[NAME_EXTRA_CONTENT_WRAP] = '<span ' . $attributes . $onClick . '>';
+        $vars[NAME_BOOTSTRAP_BUTTON] = '0';
+
+//        }
 
         return $vars;
+
     }
 
     /**
@@ -1397,6 +1448,7 @@ EOF;
      *
      * @param $urlParam
      *
+     * @throws UserFormException
      * @throws UserReportException in case parameter is missing.
      */
     private function checkDeleteParam($urlParam) {
@@ -1531,10 +1583,14 @@ EOF;
 
         $value = trim($value);
 
-        if ($value == '') {
+        if ($value === '0') {
             return $vars;
         }
 
+        if ($value === '') {
+            $value = 'default';
+        }
+
         // Just in case the user forgot 'btn-' in front of btn-default, btn-primary, btn-su...
         if (substr($value, 0, 4) != 'btn-') {
             $value = 'btn-' . $value;
diff --git a/extension/qfq/qfq/report/Report.php b/extension/qfq/qfq/report/Report.php
index a4e0f919a1392b6304ded741753c2e0887d57afa..c441c6f4614ccd37ed82b2afdf16d54281cc8047 100644
--- a/extension/qfq/qfq/report/Report.php
+++ b/extension/qfq/qfq/report/Report.php
@@ -41,6 +41,10 @@ const DEFAULT_QUESTION = 'question';
 const DEFAULT_ICON = 'icon';
 const DEFAULT_BOOTSTRAP_BUTTON = 'bootstrapButton';
 
+/**
+ * Class Report
+ * @package qfq
+ */
 class Report {
 
     /**
@@ -113,6 +117,8 @@ class Report {
      * @param array $t3data
      * @param Evaluate $eval
      * @param bool $phpUnit
+     * @throws CodeException
+     * @throws UserFormException
      */
     public function __construct(array $t3data, Evaluate $eval, $phpUnit = false) {
 
@@ -195,7 +201,13 @@ class Report {
     /**
      * Main function. Parses bodytext and iterates over all queries.
      *
+     * @param $bodyText
+     * @param bool $flagFillStoreRecord
      * @return string
+     * @throws CodeException
+     * @throws DbException
+     * @throws UserFormException
+     * @throws UserReportException
      */
     public function process($bodyText, $flagFillStoreRecord = true) {
 
@@ -401,11 +413,13 @@ class Report {
      * The sublevel calls the method again for a following sublevel
      *
      * @param int $cur_level Which level it will call [10] = level 1, [10.10] = level 2 ...
-     * @param string $super_level_array The Value-Array of the indexarray [0=>10, 1=>50]
+     * @param array $super_level_array The Value-Array of the indexarray [0=>10, 1=>50]
      * @param int $counter The outer numeric Arraykey of indexarray
      *
      * @return string                       The content that is displayed on the website
-     * @throws codeException
+     * @throws CodeException
+     * @throws DbException
+     * @throws UserFormException
      * @throws UserReportException
      */
 
@@ -598,6 +612,10 @@ class Report {
      * @param string $rowIndex Index of recent row in resultset.
      *
      * @return string               Collected content of all printable columns
+     * @throws CodeException
+     * @throws DbException
+     * @throws UserFormException
+     * @throws UserReportException
      */
     private function collectRow(array $row, array $keys, $full_level, $rowIndex) {
         $content = "";
diff --git a/extension/qfq/qfq/report/SendMail.php b/extension/qfq/qfq/report/SendMail.php
index 854c96e1a10abeca91929400f564217f15683e69..af306b205007825076ab71bb73ff5c60623a6030 100644
--- a/extension/qfq/qfq/report/SendMail.php
+++ b/extension/qfq/qfq/report/SendMail.php
@@ -13,6 +13,10 @@ require_once(__DIR__ . '/../helper/HelperFile.php');
 require_once(__DIR__ . '/../helper/Support.php');
 
 
+/**
+ * Class SendMail
+ * @package qfq
+ */
 class SendMail {
 
     /**
@@ -27,6 +31,7 @@ class SendMail {
      * to assign the log entry to a specific action.
      * The log record also contains some information who/where generates the mail (form/formelement or QFQ query).
      *
+     * @throws CodeException
      * @throws UserFormException
      */
     public function __construct() {
@@ -37,7 +42,10 @@ class SendMail {
 
     /**
      * @param array $mailConfig
+     * @throws CodeException
+     * @throws DbException
      * @throws UserFormException
+     * @throws UserReportException
      */
     public function process(array $mailConfig) {
 
@@ -52,7 +60,7 @@ class SendMail {
 
         $redirectAllMail = $this->store->getVar(SYSTEM_REDIRECT_ALL_MAIL_TO, STORE_SYSTEM);
 
-        if ($redirectAllMail !== false) {
+        if (!empty($redirectAllMail)) {
             $addBody = "All QFQ outgoing mails are catched and redirected to you." . PHP_EOL . "Original receiver:" . PHP_EOL;
             $addBody .= 'TO: ' . $mailConfig[SENDMAIL_TOKEN_RECEIVER] . PHP_EOL;
             $addBody .= 'CC: ' . $mailConfig[SENDMAIL_TOKEN_RECEIVER_CC] . PHP_EOL;
@@ -211,8 +219,10 @@ class SendMail {
      *
      * @param array $mailConfig
      *
+     * @param string $attachmentsLine
      * @throws CodeException
      * @throws DbException
+     * @throws UserFormException
      */
     private function mailLog(array $mailConfig, $attachmentsLine = '') {
 
@@ -252,6 +262,9 @@ class SendMail {
      *                [ 0 -> 'p:id=detailPerson&form=Person&r=1&_sip=1', 1 -> 'F:/etc/hostname'  ]
      *                [ 0 -> 'd:all.pdf', 1 -> 'U:?id=detailPerson&form=Person&r=1&_sip=1', 2 -> 'F:/etc/hostname'  ] ]
      * @return array Array of filenames. Those files has to be deleted later, if they are temporary files.
+     * @throws CodeException
+     * @throws DownloadException
+     * @throws UserFormException
      * @throws UserReportException
      */
     private function attachmentsBuild(array $attachments) {
@@ -344,7 +357,6 @@ class SendMail {
      * @param string $data E.g.: 't:john@doe.com|f:jane@miller.com|s:Latest|b:Dear John ...'
      * @return array
      * @throws UserFormException
-     * @throws UserReportException
      */
     public function parseStringToArray($data) {
 
diff --git a/extension/qfq/qfq/report/Thumbnail.php b/extension/qfq/qfq/report/Thumbnail.php
index 973f9ab4e9ac55a473b87213f8155322a7b3b9f6..506e818a66936a55995d083195545d2bb51f6704 100644
--- a/extension/qfq/qfq/report/Thumbnail.php
+++ b/extension/qfq/qfq/report/Thumbnail.php
@@ -16,6 +16,10 @@ require_once(__DIR__ . '/../helper/OnString.php');
 
 //use qfq;
 
+/**
+ * Class Thumbnail
+ * @package qfq
+ */
 class Thumbnail {
 
     /**
@@ -30,6 +34,8 @@ class Thumbnail {
 
     /**
      * @param bool|false $phpUnit
+     * @throws CodeException
+     * @throws UserFormException
      */
     public function __construct($phpUnit = false) {
         $this->store = Store::getInstance();
@@ -90,6 +96,7 @@ class Thumbnail {
      * @param array $control
      * @param string $modeRender DOWNLOAD_RENDER_AUTO | DOWNLOAD_RENDER_NOW
      * @return string
+     * @throws CodeException
      * @throws UserFormException
      * @throws UserReportException
      */
@@ -237,6 +244,8 @@ class Thumbnail {
      * @param array $control
      * @param string $pathFilenameThumbnail
      * @return string
+     * @throws CodeException
+     * @throws UserFormException
      * @internal param bool $flagSecure
      */
     private function buildImageTag($str, $modeRender, array $control, $pathFilenameThumbnail) {
@@ -262,8 +271,10 @@ class Thumbnail {
      * Creates a SIP Url to be used as download.
      *
      * @param string $pathFilenameThumbnail
+     * @param $str
      * @return string
      * @throws CodeException
+     * @throws UserFormException
      */
     private function buildSecureDownloadLink($pathFilenameThumbnail, $str) {
 
diff --git a/extension/qfq/qfq/report/Variables.php b/extension/qfq/qfq/report/Variables.php
index 805a1b13b583fbca638334e8691ebb4c174d027a..4a9aeb19dfd8747c817a395f113bf870cbdd9850 100644
--- a/extension/qfq/qfq/report/Variables.php
+++ b/extension/qfq/qfq/report/Variables.php
@@ -27,6 +27,10 @@ require_once(__DIR__ . '/../Evaluate.php');
 
 //use qfq;
 
+/**
+ * Class Variables
+ * @package qfq
+ */
 class Variables {
 
     public $resultArray = array();
@@ -39,7 +43,8 @@ class Variables {
     private $eval;
 
     /**
-     * @param int $tmp_ttcontent_uid
+     * @param Evaluate $eval
+     * @param int $tt_content_uid
      */
     public function __construct(Evaluate $eval, $tt_content_uid = 0) {
 
@@ -56,6 +61,10 @@ class Variables {
      * @param string $text
      *
      * @return mixed
+     * @throws CodeException
+     * @throws DbException
+     * @throws UserFormException
+     * @throws UserReportException
      */
     public function doVariables($text) {
 
diff --git a/extension/qfq/qfq/store/Client.php b/extension/qfq/qfq/store/Client.php
index 5390b27eabd6609cb23a9a0eea61e5a4fce3c9ab..de91606dcb0582c923171a9cca703afbff082729 100644
--- a/extension/qfq/qfq/store/Client.php
+++ b/extension/qfq/qfq/store/Client.php
@@ -12,8 +12,16 @@ use qfq;
 
 require_once(__DIR__ . '/../../qfq/helper/Sanitize.php');
 
+/**
+ * Class Client
+ * @package qfq
+ */
 class Client {
 
+    /**
+     * @return array|string
+     * @throws CodeException
+     */
     public static function getParam() {
 
         // copy GET and POST and SERVER Parameter. Priority: SERVER, POST, GET
@@ -22,8 +30,12 @@ class Client {
         $cookie = array();
         $server = array();
 
+        // Dirty workaround to clean poisoned T3 cache
+        Sanitize::digitCheckAndCleanGet(CLIENT_PAGE_TYPE);
+        Sanitize::digitCheckAndCleanGet(CLIENT_PAGE_LANGUAGE);
+
         if (isset($_GET)) {
-            $get = \qfq\Sanitize::urlDecodeArr($_GET);
+            $get = Sanitize::urlDecodeArr($_GET);
         }
 
         if (isset($_POST)) {
diff --git a/extension/qfq/qfq/store/Config.php b/extension/qfq/qfq/store/Config.php
index 9e418c88162389aeaf52e72c8fd5e61c6c5e129f..39e1004b36f8ff9e641975670bc1fe1ed88abc6e 100644
--- a/extension/qfq/qfq/store/Config.php
+++ b/extension/qfq/qfq/store/Config.php
@@ -13,33 +13,53 @@ use qfq;
 require_once(__DIR__ . '/../Constants.php');
 require_once(__DIR__ . '/../helper/Support.php');
 
+/**
+ * Class Config
+ * @package qfq
+ */
 class Config {
 
     /**
      * Read config.qfq.ini.
      *
-     * @param string $fileConfigIni
-     *
+     * @param string $configIni
      * @return array
      * @throws UserFormException
      */
-    public function readConfig($fileConfigIni = '') {
-
-        if ($fileConfigIni == '') {
-            // Production Path to CONFIG_INI
-            $fileConfigIni = __DIR__ . '/../../../../../' . CONFIG_INI;
-            if (!file_exists($fileConfigIni)) {
-                // PHPUnit Path to CONFIG_INI
-                $fileConfigIni = __DIR__ . '/../../../' . CONFIG_INI;
+    public function readConfig($configIni = '') {
+        $configT3qfq = array();
+
+        // Production Path to CONFIG_INI
+        $pathTypo3Conf = __DIR__ . '/../../../../..';
+        if (!file_exists($pathTypo3Conf . '/' . CONFIG_T3)) {
+            // PHPUnit Path to CONFIG_INI
+            $pathTypo3Conf = __DIR__ . '/../../..';
+        }
+
+        // In case there is a $configIni given: do not try to include T3 LocalConfiguration.php
+        if (empty($configIni)) {
+            # Read 'LocalConfiguration.php'
+            if (isset($GLOBALS['TYPO3_CONF_VARS']['EXT']['extConf'][EXT_KEY])) {
+                $configT3qfq = unserialize($GLOBALS['TYPO3_CONF_VARS']['EXT']['extConf'][EXT_KEY]);
+            } else {
+                $all = include_once($pathTypo3Conf . '/' . CONFIG_T3);
+                $configT3qfq = unserialize($all['EXT']['extConf'][EXT_KEY]);
+                unset($all);
             }
+            $configIni = $pathTypo3Conf . '/' . CONFIG_QFQ;
         }
 
         try {
-            $config = parse_ini_file($fileConfigIni, false);
-
+            $config = parse_ini_file($configIni, false);
+            // in case $configIni doesn't exist: just skip
+            if ($config === false) {
+                $config = array();
+            }
         } catch (\Exception $e) {
-            throw new qfq\UserFormException ("Error read file " . $fileConfigIni . ": " . $e->getMessage(), ERROR_IO_READ_FILE);
+            throw new qfq\UserFormException ("Error read file " . $pathTypo3Conf . ": " . $e->getMessage(), ERROR_IO_READ_FILE);
         }
+        // Settings in  config.qfq.ini overwrite T3 settings
+        $config = array_merge($configT3qfq, $config);
 
         $config = self::renameConfigElements($config);
         $config = self::setDefaults($config);
@@ -51,6 +71,8 @@ class Config {
 
     /**
      * Checks for deprecated options.
+     * @param array $config
+     * @throws UserFormException
      */
     private static function checkDeprecated(array $config) {
 
@@ -60,9 +82,9 @@ class Config {
                 $msg = '';
                 switch ($key) {
                     case SYSTEM_VAR_ADD_BY_SQL:
-                        $msg = 'Replaced by: ' . SYSTEM_FILL_STORE_SYSTEM_BY_SQL . '_1|2|3';
+                        $msg = 'Replaced by: ' . SYSTEM_FILL_STORE_SYSTEM_BY_SQL . '1|2|3';
                 }
-                throw new qfq\UserFormException ("Deprecated option in " . CONFIG_INI . ": " . SYSTEM_VAR_ADD_BY_SQL . " - " . $msg);
+                throw new qfq\UserFormException ("Deprecated option in " . CONFIG_QFQ . ": " . SYSTEM_VAR_ADD_BY_SQL . " - " . $msg);
             }
         }
     }
@@ -70,6 +92,7 @@ class Config {
 
     /**
      * @param array $config
+     * @throws UserFormException
      */
     private static function checkForAttack(array $config) {
         $attack = false;
@@ -117,6 +140,8 @@ class Config {
     }
 
     /**
+     * @param array $config
+     * @param string $getParamName
      * @throws UserFormException
      */
     public static function attackDetectedExitNow(array $config = array(), $getParamName = '') {
@@ -173,7 +198,7 @@ class Config {
             F_BS_INPUT_COLUMNS => '6',
             F_BS_NOTE_COLUMNS => '3',
 
-            SYSTEM_WKHTMLTOPDF => '/opt/wkhtmltox/bin/wkhtmltopdf',
+            SYSTEM_CMD_WKHTMLTOPDF => '/opt/wkhtmltox/bin/wkhtmltopdf',
 
             F_CLASS_PILL => 'qfq-color-grey-1',
             F_CLASS_BODY => 'qfq-color-grey-2',
@@ -205,8 +230,8 @@ class Config {
             SYSTEM_SECURITY_SHOW_MESSAGE => '0',
             SYSTEM_SECURITY_GET_MAX_LENGTH => SYSTEM_SECURITY_GET_MAX_LENGTH_DEFAULT,
             SYSTEM_ESCAPE_TYPE_DEFAULT => TOKEN_ESCAPE_MYSQL,
-            SYSTEM_GFX_EXTRA_BUTTON_INFO_INLINE => '<span class="glyphicon glyphicon-info-sign" aria-hidden="true"></span>',
-            SYSTEM_GFX_EXTRA_BUTTON_INFO_BELOW => '<span class="glyphicon glyphicon-info-sign text-info" aria-hidden="true"></span>',
+            SYSTEM_EXTRA_BUTTON_INFO_INLINE => '<span class="glyphicon glyphicon-info-sign" aria-hidden="true"></span>',
+            SYSTEM_EXTRA_BUTTON_INFO_BELOW => '<span class="glyphicon glyphicon-info-sign text-info" aria-hidden="true"></span>',
             SYSTEM_EXTRA_BUTTON_INFO_CLASS => '',
 
             SYSTEM_DB_UPDATE => SYSTEM_DB_UPDATE_AUTO,
@@ -222,6 +247,10 @@ class Config {
 
         ];
 
+        // To let run legacy code
+        $config[SYSTEM_DB_INDEX_DATA_DEPRECATED] = $config[SYSTEM_DB_INDEX_DATA];
+        $config[SYSTEM_DB_INDEX_QFQ_DEPRECATED] = $config[SYSTEM_DB_INDEX_QFQ];
+
         return array_merge($default, $config);
     }
 
@@ -242,37 +271,16 @@ class Config {
             [SYSTEM_FORM_BS_LABEL_COLUMNS, F_BS_LABEL_COLUMNS],
             [SYSTEM_FORM_BS_INPUT_COLUMNS, F_BS_INPUT_COLUMNS],
             [SYSTEM_FORM_BS_NOTE_COLUMNS, F_BS_NOTE_COLUMNS],
+
             [SYSTEM_FORM_DATA_PATTERN_ERROR, F_FE_DATA_PATTERN_ERROR],
             [SYSTEM_FORM_DATA_REQUIRED_ERROR, F_FE_DATA_REQUIRED_ERROR],
             [SYSTEM_FORM_DATA_MATCH_ERROR, F_FE_DATA_MATCH_ERROR],
             [SYSTEM_FORM_DATA_ERROR, F_FE_DATA_ERROR],
+
             [SYSTEM_CSS_CLASS_QFQ_FORM, F_CLASS],
             [SYSTEM_CSS_CLASS_QFQ_FORM_PILL, F_CLASS_PILL],
             [SYSTEM_CSS_CLASS_QFQ_FORM_BODY, F_CLASS_BODY],
-            [SYSTEM_FORM_BUTTON_ON_CHANGE_CLASS, F_BUTTON_ON_CHANGE_CLASS],
-            [SYSTEM_ESCAPE_TYPE_DEFAULT, F_ESCAPE_TYPE_DEFAULT],
-
-            [SYSTEM_SAVE_BUTTON_TEXT, F_SAVE_BUTTON_TEXT],
-            [SYSTEM_SAVE_BUTTON_TOOLTIP, F_SAVE_BUTTON_TOOLTIP],
-            [SYSTEM_SAVE_BUTTON_CLASS, F_SAVE_BUTTON_CLASS],
-            [SYSTEM_SAVE_BUTTON_GLYPH_ICON, F_SAVE_BUTTON_GLYPH_ICON],
-
-            [SYSTEM_CLOSE_BUTTON_TEXT, F_CLOSE_BUTTON_TEXT],
-            [SYSTEM_CLOSE_BUTTON_TOOLTIP, F_CLOSE_BUTTON_TOOLTIP],
-            [SYSTEM_CLOSE_BUTTON_CLASS, F_CLOSE_BUTTON_CLASS],
-            [SYSTEM_CLOSE_BUTTON_GLYPH_ICON, F_CLOSE_BUTTON_GLYPH_ICON],
-
-            [SYSTEM_DELETE_BUTTON_TEXT, F_DELETE_BUTTON_TEXT],
-            [SYSTEM_DELETE_BUTTON_TOOLTIP, F_DELETE_BUTTON_TOOLTIP],
-            [SYSTEM_DELETE_BUTTON_CLASS, F_DELETE_BUTTON_CLASS],
-            [SYSTEM_DELETE_BUTTON_GLYPH_ICON, F_DELETE_BUTTON_GLYPH_ICON],
-
-            [SYSTEM_NEW_BUTTON_TEXT, F_NEW_BUTTON_TEXT],
-            [SYSTEM_NEW_BUTTON_TOOLTIP, F_NEW_BUTTON_TOOLTIP],
-            [SYSTEM_NEW_BUTTON_CLASS, F_NEW_BUTTON_CLASS],
-            [SYSTEM_NEW_BUTTON_GLYPH_ICON, F_NEW_BUTTON_GLYPH_ICON],
-
-            [SYSTEM_EXTRA_BUTTON_INFO_CLASS, FE_INPUT_EXTRA_BUTTON_INFO_CLASS],
+            [SYSTEM_SAVE_BUTTON_CLASS_ON_CHANGE, F_BUTTON_ON_CHANGE_CLASS],
 
         ];
 
diff --git a/extension/qfq/qfq/store/FillStoreForm.php b/extension/qfq/qfq/store/FillStoreForm.php
index d283d5ffe6ecdb60cdff539c15e2cfb63cd24683..2ef50b3d85cff9ff42388d0e4aa0d950bb5ca116 100644
--- a/extension/qfq/qfq/store/FillStoreForm.php
+++ b/extension/qfq/qfq/store/FillStoreForm.php
@@ -15,6 +15,10 @@ require_once(__DIR__ . '/../helper/HelperFormElement.php');
 require_once(__DIR__ . '/../helper/Logger.php');
 require_once(__DIR__ . '/../exceptions/UserFormException.php');
 
+/**
+ * Class FillStoreForm
+ * @package qfq
+ */
 class FillStoreForm {
 
     /**
diff --git a/extension/qfq/qfq/store/Session.php b/extension/qfq/qfq/store/Session.php
index 45a0f3c75957cf8c6bbe235a8849c95537816277..bda0af1be49a95e5c7df5b3130c0f0054b55c409 100644
--- a/extension/qfq/qfq/store/Session.php
+++ b/extension/qfq/qfq/store/Session.php
@@ -9,6 +9,10 @@
 namespace qfq;
 
 
+/**
+ * Class Session
+ * @package qfq
+ */
 class Session {
 
     private static $instance = null;
@@ -257,6 +261,7 @@ class Session {
      * @param bool|false $phpUnit
      *
      * @return Session class
+     * @throws CodeException
      */
     public static function getInstance($phpUnit = false) {
 
diff --git a/extension/qfq/qfq/store/Sip.php b/extension/qfq/qfq/store/Sip.php
index dd6e3bb6246c0b6f9003cb6b47ba7a240a21b15b..3a6e05698498c32a26d2f04b2d8b0016c5ab3fcd 100644
--- a/extension/qfq/qfq/store/Sip.php
+++ b/extension/qfq/qfq/store/Sip.php
@@ -45,6 +45,7 @@ class Sip {
      *
      * @param string $mode Possible values: RETURN_URL|RETURN_SIP
      *
+     * @param string $phpScriptName
      * @return string/array
      *  * mode=RETURN_URL: return complete URL
      *  * mode=RETURN_SIP: returns only the sip
diff --git a/extension/qfq/qfq/store/Store.php b/extension/qfq/qfq/store/Store.php
index d807352555af1666fcc0928f549ab818cf017f16..8a222bf9096cf342552860e18cf3178997b1c8ca 100644
--- a/extension/qfq/qfq/store/Store.php
+++ b/extension/qfq/qfq/store/Store.php
@@ -178,8 +178,9 @@ class Store {
     /**
      * Fill the system store by reading config.qfq.ini. Also setup config defaults.
      *
+     * @param string $fileConfigIni
      * @throws CodeException
-     * @throws qfq\UserFormException
+     * @throws UserFormException
      */
     private static function fillStoreSystem($fileConfigIni = '') {
 
@@ -243,12 +244,12 @@ class Store {
 
         // make SQL PATH absolute. This is necessary to work in different directories correctly.
         if (!empty($config[SYSTEM_SQL_LOG]) && $config[SYSTEM_SQL_LOG][0] !== '/') {
-            $config[SYSTEM_SQL_LOG] = $config[SYSTEM_PATH_EXT] . '/' . $config[SYSTEM_SQL_LOG];
+            $config[SYSTEM_SQL_LOG] = $config[SYSTEM_SITE_PATH] . '/' . $config[SYSTEM_SQL_LOG];
         }
 
         // make SQL PATH absolute. This is necessary to work in different directories correctly.
         if (!empty($config[SYSTEM_MAIL_LOG]) && $config[SYSTEM_MAIL_LOG][0] !== '/') {
-            $config[SYSTEM_MAIL_LOG] = $config[SYSTEM_PATH_EXT] . '/' . $config[SYSTEM_MAIL_LOG];
+            $config[SYSTEM_MAIL_LOG] = $config[SYSTEM_SITE_PATH] . '/' . $config[SYSTEM_MAIL_LOG];
         }
 
         $config[SYSTEM_SEND_E_MAIL] = $config[SYSTEM_PATH_EXT] . '/qfq/external/sendEmail';
@@ -267,6 +268,7 @@ class Store {
     /**
      * @param string $value
      *
+     * @param $flag
      * @return string
      */
     private static function adjustConfigShowDebugInfo($value, $flag) {
@@ -299,19 +301,20 @@ class Store {
     private static function checkMandatoryParameter(array $config) {
 
         // Check mandatory config vars.
-        $names = array_merge(['SQL_LOG', 'SQL_LOG_MODE'],
+        $names = array_merge([SYSTEM_SQL_LOG, SYSTEM_SQL_LOG_MODE],
             self::dbCredentialName($config[SYSTEM_DB_INDEX_DATA]),
             self::dbCredentialName($config[SYSTEM_DB_INDEX_QFQ]));
 
         foreach ($names as $name) {
             if (!isset($config[$name])) {
-                throw new qfq\UserFormException ("Missing configuration in `" . CONFIG_INI . "`: $name", ERROR_MISSING_CONFIG_INI_VALUE);
+                throw new qfq\UserFormException ("Missing configuration in `" . CONFIG_QFQ . "`: $name", ERROR_MISSING_CONFIG_INI_VALUE);
             }
         }
     }
 
     /**
-     *
+     * @param $index
+     * @return array
      */
     private static function dbCredentialName($index) {
         $names = array();
@@ -357,6 +360,7 @@ class Store {
      * @param $bodytext
      *
      * @throws CodeException
+     * @throws UserFormException
      */
     private static function fillStoreTypo3($bodytext) {
 
@@ -382,6 +386,7 @@ class Store {
      * Fills the STORE_CLIENT
      *
      * @throws CodeException
+     * @throws UserFormException
      */
     private static function fillStoreClient() {
 
@@ -425,7 +430,8 @@ class Store {
      *                             return ''.
      *
      * @return string a) if found: value, b) false
-     * @throws \qfq\CodeException
+     * @throws CodeException
+     * @throws UserFormException
      */
     public static function getVar($key, $useStores = STORE_USE_DEFAULT, $sanitizeClass = '', &$foundInStore = '') {
 
@@ -636,6 +642,7 @@ class Store {
      * @param $formName
      *
      * @throws CodeException
+     * @throws UserFormException
      */
     public static function createSipAfterFormLoad($formName) {
 
@@ -805,6 +812,8 @@ class Store {
      * More docs: CODING.md > 'Faking the STORE_TYPO3 for API calls'
      *
      * @param string $sipTypo3Vars
+     * @throws CodeException
+     * @throws UserFormException
      */
     public static function fillTypo3StoreFromSip($sipTypo3Vars) {
         $t3vars = self::getStore(STORE_TYPO3);
@@ -836,7 +845,7 @@ class Store {
         $storeSystem = self::getStore(STORE_SYSTEM);
 
         for ($ii = 1; $ii <= 3; $ii++) {
-            if (empty($storeSystem[SYSTEM_FILL_STORE_SYSTEM_BY_SQL . "_$ii"])) {
+            if (empty($storeSystem[SYSTEM_FILL_STORE_SYSTEM_BY_SQL . "$ii"])) {
                 continue;
             }
 
@@ -844,16 +853,16 @@ class Store {
                 $db = new qfq\Database();
             }
 
-            $errMsg = "More than 1 record found. " . CONFIG_INI . ": " . SYSTEM_FILL_STORE_SYSTEM_BY_SQL . "_$ii";
+            $errMsg = "More than 1 record found. " . CONFIG_QFQ . ": " . SYSTEM_FILL_STORE_SYSTEM_BY_SQL . "$ii";
             $mode = ROW_EXPECT_0_1;
 
             // If there is an error message defined, this means there should be exactly one record.
-            if (!empty($storeSystem[SYSTEM_FILL_STORE_SYSTEM_ERROR_MSG . "_$ii"])) {
+            if (!empty($storeSystem[SYSTEM_FILL_STORE_SYSTEM_ERROR_MSG . "$ii"])) {
                 $mode = ROW_EXPECT_1;
-                $errMsg = $storeSystem[SYSTEM_FILL_STORE_SYSTEM_ERROR_MSG . "_$ii"];
+                $errMsg = $storeSystem[SYSTEM_FILL_STORE_SYSTEM_ERROR_MSG . "$ii"];
             }
 
-            $storeSystemAdd = $db->sql($storeSystem[SYSTEM_FILL_STORE_SYSTEM_BY_SQL . "_$ii"], $mode, array(), $errMsg);
+            $storeSystemAdd = $db->sql($storeSystem[SYSTEM_FILL_STORE_SYSTEM_BY_SQL . "$ii"], $mode, array(), $errMsg);
             $storeSystemAdd = OnArray::keyNameRemoveLeadingUnderscore($storeSystemAdd);
             $storeSystem = array_merge($storeSystem, $storeSystemAdd);
             $flagDirty = true;
diff --git a/extension/qfq/qfq/store/T3Info.php b/extension/qfq/qfq/store/T3Info.php
index a0702d29e2e82f46ed075fcd1a307bfd1ec16f93..321523edf53418385848ff48e398e3310210c617 100644
--- a/extension/qfq/qfq/store/T3Info.php
+++ b/extension/qfq/qfq/store/T3Info.php
@@ -9,6 +9,10 @@
 namespace qfq;
 
 
+/**
+ * Class T3Info
+ * @package qfq
+ */
 class T3Info {
 
     /**
diff --git a/extension/qfq/sql/formEditor.sql b/extension/qfq/sql/formEditor.sql
index 4613d45574a8b79020013ee762da37225bce8ccd..10cf2d60672278c55bd5160762bed6ffe1f825c2 100644
--- a/extension/qfq/sql/formEditor.sql
+++ b/extension/qfq/sql/formEditor.sql
@@ -162,7 +162,7 @@ WHERE FIND_IN_SET(Form.name, 'form,formElement,copyForm,cron') > 0;
 INSERT INTO Form (id, name, title, noteInternal, tableName, permitNew, permitEdit, render, multiSql, parameter) VALUES
   (1, 'form', 'Form Editor: {{SELECT id, " / ", name FROM Form WHERE id = {{r:S0}}}} (DB: {{_dbNameQfq:Y}})',
    'FormElement Editor',
-   'Form', 'sip', 'sip', 'bootstrap', '', 'maxVisiblePill=5\nclass=container-fluid\ndbIndex={{DB_INDEX_QFQ:Y}}');
+   'Form', 'sip', 'sip', 'bootstrap', '', 'maxVisiblePill=5\nclass=container-fluid\ndbIndex={{dbIndexQfq:Y}}');
 
 # FormEditor: FormElements for 'form'
 INSERT INTO FormElement (id, formId, name, label, mode, type, checkType, class, ord, size, note, clientJs, value,
@@ -181,36 +181,36 @@ VALUES
   # Make the form a 'delete form' for records Form/FormElement.
   (1, 'Delete FE', '', 'show', 'beforeDelete', 'all', 'action', 100, 0, 0, '', '', '', '',
    'sqlAfter={{DELETE FROM FormElement WHERE formId={{id:R}} }}', 0, '', '', '', 'none', 'no', ''),
-  (1, 'name', 'Name', 'required', 'text', 'pattern', 'native', 120, 0, 0, '<a href="{{DOCUMENTATION_QFQ:Y}}#form-name">Info</a>', '', '', '', 'autofocus',
+  (1, 'name', 'Name', 'required', 'text', 'pattern', 'native', 120, 0, 0, '<a href="{{documentation:Y}}#form-name">Info</a>', '', '', '', 'autofocus',
    1, '', '', '', 'specialchar', 'no', '[a-zA-Z0-9._+-]+'),
-  (1, 'title', 'Title', 'show', 'text', 'all', 'native', 130, 0, 0, '<a href="{{DOCUMENTATION_QFQ:Y}}#form-title">Info</a>', '', '', '', '', 1, '', '', '', 'none', 'no', ''),
-  (1, 'noteInternal', 'Note', 'show', 'text', 'all', 'native', 140, '40,3', 0, '<a href="{{DOCUMENTATION_QFQ:Y}}#form-note">Info</a>', '', '', '', '', 1, '', '', '', 'specialchar', 'no', ''),
-  (1, 'tableName', 'Table', 'required', 'select', 'all', 'native', 150, 0, 0, '<a href="{{DOCUMENTATION_QFQ:Y}}#form-tablename">Info</a>', '', '', '{{[{{DB_INDEX_DATA:Y}}]!SHOW tables}}',
+  (1, 'title', 'Title', 'show', 'text', 'all', 'native', 130, 0, 0, '<a href="{{documentation:Y}}#form-title">Info</a>', '', '', '', '', 1, '', '', '', 'none', 'no', ''),
+  (1, 'noteInternal', 'Note', 'show', 'text', 'all', 'native', 140, '40,3', 0, '<a href="{{documentation:Y}}#form-note">Info</a>', '', '', '', '', 1, '', '', '', 'specialchar', 'no', ''),
+  (1, 'tableName', 'Table', 'required', 'select', 'all', 'native', 150, 0, 0, '<a href="{{documentation:Y}}#form-tablename">Info</a>', '', '', '{{[{{dbIndexData:Y}}]!SHOW tables}}',
    'emptyItemAtStart', 1, '', '', '', 'specialchar', 'no', ''),
   (1, 'parameterLanguageA', 'Language: {{FORM_LANGUAGE_A_LABEL:YE}}', 'show', 'text', 'all', 'native', 160, '60,2', 0,
-   '<a href="{{DOCUMENTATION_QFQ:Y}}#multi-language-form">Info</a>', '', '', '', '', 1, '', '{{SELECT IF("{{FORM_LANGUAGE_A_ID:YE}}"="","hidden","show" ) }}', '', 'none', 'no', ''),
+   '<a href="{{documentation:Y}}#multi-language-form">Info</a>', '', '', '', '', 1, '', '{{SELECT IF("{{FORM_LANGUAGE_A_ID:YE}}"="","hidden","show" ) }}', '', 'none', 'no', ''),
   (1, 'parameterLanguageB', 'Language: {{FORM_LANGUAGE_B_LABEL:YE}}', 'show', 'text', 'all', 'native', 160, '60,2', 0,
-   '<a href="{{DOCUMENTATION_QFQ:Y}}#multi-language-form">Info</a>', '', '', '', '', 1, '', '{{SELECT IF("{{FORM_LANGUAGE_B_ID:YE}}"="","hidden","show" ) }}', '', 'none', 'no', ''),
+   '<a href="{{documentation:Y}}#multi-language-form">Info</a>', '', '', '', '', 1, '', '{{SELECT IF("{{FORM_LANGUAGE_B_ID:YE}}"="","hidden","show" ) }}', '', 'none', 'no', ''),
   (1, 'parameterLanguageC', 'Language: {{FORM_LANGUAGE_C_LABEL:YE}}', 'show', 'text', 'all', 'native', 160, '60,2', 0,
-   '<a href="{{DOCUMENTATION_QFQ:Y}}#multi-language-form">Info</a>', '', '', '', '', 1, '', '{{SELECT IF("{{FORM_LANGUAGE_C_ID:YE}}"="","hidden","show" ) }}', '', 'none', 'no', ''),
+   '<a href="{{documentation:Y}}#multi-language-form">Info</a>', '', '', '', '', 1, '', '{{SELECT IF("{{FORM_LANGUAGE_C_ID:YE}}"="","hidden","show" ) }}', '', 'none', 'no', ''),
   (1, 'parameterLanguageD', 'Language: {{FORM_LANGUAGE_D_LABEL:YE}}', 'show', 'text', 'all', 'native', 160, '60,2', 0,
-   '<a href="{{DOCUMENTATION_QFQ:Y}}#multi-language-form">Info</a>', '', '', '', '', 1, '', '{{SELECT IF("{{FORM_LANGUAGE_D_ID:YE}}"="","hidden","show" ) }}', '', 'none', 'no', ''),
-  (1, 'requiredParameterNew', 'Required Parameter NEW', 'show', 'text', 'all', 'native', 200, 0, 0, '<a href="{{DOCUMENTATION_QFQ:Y}}#required-parameter-new-edit">Info</a>', '', '', '', '', 2, '', '', '', 'specialchar', 'no', ''),
-  (1, 'requiredParameterEdit', 'Required Parameter EDIT', 'show', 'text', 'all', 'native', 200, 0, 0, '<a href="{{DOCUMENTATION_QFQ:Y}}#required-parameter-new-edit">Info</a>', '', '', '', '', 2, '', '', '', 'specialchar', 'no', ''),
-  (1, 'permitNew', 'Permit New', 'show', 'radio', 'all', 'native', 210, 0, 10, '<a href="{{DOCUMENTATION_QFQ:Y}}#form-permitnewedit">Info</a>', '', '', '', 'buttonClass=btn-default', 2, '', '', '', 'specialchar', 'no', ''),
-  (1, 'permitEdit', 'Permit Edit', 'show', 'radio', 'all', 'native', 220, 0, 10, '<a href="{{DOCUMENTATION_QFQ:Y}}#form-permitnewedit">Info</a>', '', '', '', 'buttonClass=btn-default', 2, '', '', '', 'specialchar', 'no', ''),
-  (1, 'escapeTypeDefault', 'Escape type default', 'show', 'radio', 'all', 'native', 230, 0, 10, '<a href="{{DOCUMENTATION_QFQ:Y}}#variable-escape">Info</a>', '', '', '',
+   '<a href="{{documentation:Y}}#multi-language-form">Info</a>', '', '', '', '', 1, '', '{{SELECT IF("{{FORM_LANGUAGE_D_ID:YE}}"="","hidden","show" ) }}', '', 'none', 'no', ''),
+  (1, 'requiredParameterNew', 'Required Parameter NEW', 'show', 'text', 'all', 'native', 200, 0, 0, '<a href="{{documentation:Y}}#required-parameter-new-edit">Info</a>', '', '', '', '', 2, '', '', '', 'specialchar', 'no', ''),
+  (1, 'requiredParameterEdit', 'Required Parameter EDIT', 'show', 'text', 'all', 'native', 200, 0, 0, '<a href="{{documentation:Y}}#required-parameter-new-edit">Info</a>', '', '', '', '', 2, '', '', '', 'specialchar', 'no', ''),
+  (1, 'permitNew', 'Permit New', 'show', 'radio', 'all', 'native', 210, 0, 10, '<a href="{{documentation:Y}}#form-permitnewedit">Info</a>', '', '', '', 'buttonClass=btn-default', 2, '', '', '', 'specialchar', 'no', ''),
+  (1, 'permitEdit', 'Permit Edit', 'show', 'radio', 'all', 'native', 220, 0, 10, '<a href="{{documentation:Y}}#form-permitnewedit">Info</a>', '', '', '', 'buttonClass=btn-default', 2, '', '', '', 'specialchar', 'no', ''),
+  (1, 'escapeTypeDefault', 'Escape type default', 'show', 'radio', 'all', 'native', 230, 0, 10, '<a href="{{documentation:Y}}#variable-escape">Info</a>', '', '', '',
    'itemList=c:config,s:single,d:double,l:ldap search,L:ldap value,m:mysql realEscapeString,-:none\nbuttonClass=btn-default', 2, '', '', '', 'specialchar', 'no', ''),
-  (1, 'dirtyMode', 'Record Locking', 'show', 'radio', 'all', 'native', 240, 0, 10, '<a href="{{DOCUMENTATION_QFQ:Y}}#locking-record">Info</a>', '', '', '',
+  (1, 'dirtyMode', 'Record Locking', 'show', 'radio', 'all', 'native', 240, 0, 10, '<a href="{{documentation:Y}}#locking-record">Info</a>', '', '', '',
    'buttonClass=btn-default', 2, '', '', '', 'specialchar', 'no', ''),
-  (1, 'recordLockTimeoutSeconds', 'Lock timeout (seconds)', 'show', 'text', 'all', 'native', 245, 0, 0, '<a href="{{DOCUMENTATION_QFQ:Y}}#locking-record">Info</a>', '',
+  (1, 'recordLockTimeoutSeconds', 'Lock timeout (seconds)', 'show', 'text', 'all', 'native', 245, 0, 0, '<a href="{{documentation:Y}}#locking-record">Info</a>', '',
    '{{SELECT IF("{{recordLockTimeoutSeconds:R0}}"=0,"{{RECORD_LOCK_TIMEOUT_SECONDS:Y0}}","{{recordLockTimeoutSeconds:R0}}")}}', '', '', 2, '', '', '', 'specialchar', 'no', ''),
-  (1, 'showButton', 'Show button', 'show', 'checkbox', 'all', 'native', 250, 0, 5, '<a href="{{DOCUMENTATION_QFQ:Y}}#showbutton">Info</a>', '', '', '', 'checkBoxMode = multi\norientation=vertical', 2, '', '', '', 'specialchar', 'no', ''),
-  (1, 'forwardMode', 'Forward', 'show', 'radio', 'all', 'native', 300, 0, 0, '<a href="{{DOCUMENTATION_QFQ:Y}}#form-forward">Info</a>', '', '', '', 'buttonClass=btn-default', 3, '', '', '', 'specialchar', 'no', ''),
-  (1, 'forwardPage', 'Forward URL / Page', 'show', 'text', 'all', 'native', 310, 0, 0, '<a href="{{DOCUMENTATION_QFQ:Y}}#form-forward">Info</a>', '', '', '', '', 3, '',
+  (1, 'showButton', 'Show button', 'show', 'checkbox', 'all', 'native', 250, 0, 5, '<a href="{{documentation:Y}}#showbutton">Info</a>', '', '', '', 'checkBoxMode = multi\norientation=vertical', 2, '', '', '', 'specialchar', 'no', ''),
+  (1, 'forwardMode', 'Forward', 'show', 'radio', 'all', 'native', 300, 0, 0, '<a href="{{documentation:Y}}#form-forward">Info</a>', '', '', '', 'buttonClass=btn-default', 3, '', '', '', 'specialchar', 'no', ''),
+  (1, 'forwardPage', 'Forward URL / Page', 'show', 'text', 'all', 'native', 310, 0, 0, '<a href="{{documentation:Y}}#form-forward">Info</a>', '', '', '', '', 3, '',
    '', '', 'none', 'no', ''),
-  (1, 'parameter', 'Parameter', 'show', 'text', 'all', 'native', 320, '40,8', 0, '<a href="{{DOCUMENTATION_QFQ:Y}}#form-parameter">Info</a>', '', '', '', '', 3, '', '', '', 'none', 'no', ''),
-  (1, 'bsLabelColumns', 'BS Label Columns', 'show', 'text', 'all', 'native', 330, 0, 0, '<a href="{{DOCUMENTATION_QFQ:Y}}#form-layout">Info</a>', '', '', '', '', 3, '', '', '{{bsLabelColumns:Y}}', 'specialchar', 'no', ''),
+  (1, 'parameter', 'Parameter', 'show', 'text', 'all', 'native', 320, '40,8', 0, '<a href="{{documentation:Y}}#form-parameter">Info</a>', '', '', '', '', 3, '', '', '', 'none', 'no', ''),
+  (1, 'bsLabelColumns', 'BS Label Columns', 'show', 'text', 'all', 'native', 330, 0, 0, '<a href="{{documentation:Y}}#form-layout">Info</a>', '', '', '', '', 3, '', '', '{{bsLabelColumns:Y}}', 'specialchar', 'no', ''),
   (1, 'bsInputColumns', 'BS Input Columns', 'show', 'text', 'all', 'native', 340, 0, 0, '', '', '', '', '', 3, '', '', '{{bsInputColumns:Y}}', 'specialchar', 'no', ''),
   (1, 'bsNoteColumns', 'BS Note Columns', 'show', 'text', 'all', 'native', 350, 0, 0, '', '', '', '', '', 3, '', '', '{{bsNoteColumns:Y}}', 'specialchar', 'no', ''),
   (1, 'deleted', 'Deleted', 'show', 'checkbox', 'all', 'native', 360, 0, 0, '', '', '', '', '', 3, '', '', '', 'specialchar', 'no', ''),
@@ -241,7 +241,7 @@ VALUES
    'Form Element Editor. Form : {{SELECT f.id, " / ",  f.name  FROM Form AS f WHERE f.id = {{formId:S0}}  }} (DB: {{_dbNameQfq:Y}})',
    'Please secure the form',
    'FormElement', 'sip', 'sip', 'bootstrap', '',
-   'maxVisiblePill=5\nclassBody=qfq-color-blue-1\ndbIndex={{DB_INDEX_QFQ:Y}}', 'formId');
+   'maxVisiblePill=5\nclassBody=qfq-color-blue-1\ndbIndex={{dbIndexQfq:Y}}', 'formId');
 
 # FormEditor: FormElements for 'formElement'
 INSERT INTO FormElement (id, formId, name, label, mode, type, checkType, class, ord, size, note, clientJs, value,
@@ -261,60 +261,60 @@ INSERT INTO FormElement (formId, name, label, mode, type, checkType, class, ord,
 VALUES
 
   (2, 'feIdContainer', 'Container', 'show', 'select', 'all', 'native', 120, 0, 0,
-   '<a href="{{DOCUMENTATION_QFQ:Y}}#class-container">Info</a>', '', '',
+   '<a href="{{documentation:Y}}#class-container">Info</a>', '', '',
    '{{!SELECT fe.id, CONCAT(fe.type, " / ", fe.name, " (", COUNT(feSub.id), ")" ) FROM FormElement As fe LEFT JOIN FormElement As feSub ON feSub.feIdContainer=fe.id WHERE fe.formId={{formId:SR0}} AND fe.class="container" GROUP BY fe.id ORDER BY fe.type, fe.ord, fe.name }}',
    'emptyItemAtStart', 100, '', 'no', '', '', '',
    '{{SELECT IF(COUNT(fe.id)>0, "show", "hidden") FROM Form AS f LEFT JOIN FormElement AS fe ON f.id=fe.formId AND fe.class="container" WHERE f.id={{formId:S0}} GROUP BY f.id}}',
    '', 'specialchar'),
-  (2, 'enabled', 'Enabled', 'show', 'checkbox', 'all', 'native', 130, 0, 0, '<a href="{{DOCUMENTATION_QFQ:Y}}#class-native">Info</a>', '', '', '', '', 100, '', 'no', '', '', '', '', '', 'specialchar'),
-  (2, 'dynamicUpdate', 'Dynamic Update', 'show', 'checkbox', 'all', 'native', 135, 0, 0, '<a href="{{DOCUMENTATION_QFQ:Y}}#dynamic-update">Info</a>',
+  (2, 'enabled', 'Enabled', 'show', 'checkbox', 'all', 'native', 130, 0, 0, '<a href="{{documentation:Y}}#class-native">Info</a>', '', '', '', '', 100, '', 'no', '', '', '', '', '', 'specialchar'),
+  (2, 'dynamicUpdate', 'Dynamic Update', 'show', 'checkbox', 'all', 'native', 135, 0, 0, '<a href="{{documentation:Y}}#dynamic-update">Info</a>',
    '', '', '', '', 100, '', 'no', '', '', '', '', '', 'specialchar'),
-  (2, 'name', 'Name', 'show', 'text', 'all', 'native', 140, 0, 0, '<a href="{{DOCUMENTATION_QFQ:Y}}#class-native">Info</a>', '', '', '',
-   'typeAheadSql = [{{DB_INDEX_DATA:Y}}]SELECT COLUMN_NAME FROM information_schema.columns WHERE table_schema = "{{DB_1_NAME:Y}}" AND table_name = "{{SELECT f.tableName FROM Form AS f WHERE f.id={{formId:S0}}}}" AND COLUMN_NAME LIKE ? ORDER BY COLUMN_NAME\ntypeAheadMinLength = 1\ntypeAheadLimit = 100\ntypeAheadPedantic = 0\n',
-   100, '<a href="{{DOCUMENTATION_QFQ:Y}}#class-native">Info</a>', 'no', '', '', '', '', '', 'specialchar'),
-  (2, 'label', 'Label', 'show', 'text', 'all', 'native', 150, 0, 0, '<a href="{{DOCUMENTATION_QFQ:Y}}#class-native">Info</a>', '', '', '', '', 100, '', 'no', '', '', '', '', '', 'none'),
-  (2, 'mode', 'Mode', 'show', 'radio', 'all', 'native', 160, 0, 0, '<a href="{{DOCUMENTATION_QFQ:Y}}#class-native">Info</a>', '', '', '', 'buttonClass=btn-default', 100, '', 'no', '', '', '', '', '', 'specialchar'),
-  (2, 'modeSql', 'Mode sql', 'show', 'text', 'all', 'native', 170, '70,2', 0, '<a href="{{DOCUMENTATION_QFQ:Y}}#dynamic-update">Info</a>', '', '', '', '', 100, '', 'no', '', '', '', '', '', 'none'),
-  (2, 'class', 'Class', 'show', 'select', 'all', 'native', 180, 0, 0, '<a href="{{DOCUMENTATION_QFQ:Y}}#class-container">Info</a>', '', '{{class:FSRD0:alnumx}}', '', '', 100, '', 'yes', '', '', '', '', '', 'none'),
+  (2, 'name', 'Name', 'show', 'text', 'all', 'native', 140, 0, 0, '<a href="{{documentation:Y}}#class-native">Info</a>', '', '', '',
+   'typeAheadSql = [{{dbIndexData:Y}}]SELECT COLUMN_NAME FROM information_schema.columns WHERE table_schema = "{{DB_1_NAME:Y}}" AND table_name = "{{SELECT f.tableName FROM Form AS f WHERE f.id={{formId:S0}}}}" AND COLUMN_NAME LIKE ? ORDER BY COLUMN_NAME\ntypeAheadMinLength = 1\ntypeAheadLimit = 100\ntypeAheadPedantic = 0\n',
+   100, '<a href="{{documentation:Y}}#class-native">Info</a>', 'no', '', '', '', '', '', 'specialchar'),
+  (2, 'label', 'Label', 'show', 'text', 'all', 'native', 150, 0, 0, '<a href="{{documentation:Y}}#class-native">Info</a>', '', '', '', '', 100, '', 'no', '', '', '', '', '', 'none'),
+  (2, 'mode', 'Mode', 'show', 'radio', 'all', 'native', 160, 0, 0, '<a href="{{documentation:Y}}#class-native">Info</a>', '', '', '', 'buttonClass=btn-default', 100, '', 'no', '', '', '', '', '', 'specialchar'),
+  (2, 'modeSql', 'Mode sql', 'show', 'text', 'all', 'native', 170, '70,2', 0, '<a href="{{documentation:Y}}#dynamic-update">Info</a>', '', '', '', '', 100, '', 'no', '', '', '', '', '', 'none'),
+  (2, 'class', 'Class', 'show', 'select', 'all', 'native', 180, 0, 0, '<a href="{{documentation:Y}}#class-container">Info</a>', '', '{{class:FSRD0:alnumx}}', '', '', 100, '', 'yes', '', '', '', '', '', 'none'),
 
   (2, 'type', 'Type', 'show', 'select', 'all', 'native', 190, 0, 0,
-   '<a href="{{DOCUMENTATION_QFQ:Y}}#class-native">Native</a>, <a href="{{DOCUMENTATION_QFQ:Y}}#class-action">Action</a>, <a href="{{DOCUMENTATION_QFQ:Y}}#class-container">Container</a>',
+   '<a href="{{documentation:Y}}#class-native">Native</a>, <a href="{{documentation:Y}}#class-action">Action</a>, <a href="{{documentation:Y}}#class-container">Container</a>',
    '', '', '',
    'itemList={{SELECT IF( "{{class:FRD0:alnumx}}"="native","checkbox,date,time,datetime,dateJQW,datetimeJQW,extra,gridJQW,text,editor,annotate,imageCut,note,password,radio,select,subrecord,upload", IF("{{class:FRD0:alnumx}}"="action","beforeLoad,beforeSave,beforeInsert,beforeUpdate,beforeDelete,afterLoad,afterSave,afterInsert,afterUpdate,afterDelete,sendMail,paste", "fieldset,pill,templateGroup")  ) }}',
    100, '', 'yes', '', '', '', '', '', 'specialchar'),
-  (2, 'subrecordOption', 'Subrecord Option', 'show', 'checkbox', 'all', 'native', 200, 0, 0, '<a href="{{DOCUMENTATION_QFQ:Y}}#subrecord-option">Info</a>', '', '', '',
+  (2, 'subrecordOption', 'Subrecord Option', 'show', 'checkbox', 'all', 'native', 200, 0, 0, '<a href="{{documentation:Y}}#subrecord-option">Info</a>', '', '', '',
    '', 100, '', 'yes', '', '', '', '{{ SELECT IF("{{type:FRE:alnumx}}"="subrecord" AND "{{class:FRE:alnumx}}"="native", "show", "hidden") }}', '', 'specialchar'),
   (2, 'parameterLanguageA', 'Language: {{FORM_LANGUAGE_A_LABEL:YE}}', 'show', 'text', 'all', 'native', 210, '60,2', 0,
-   '<a href="{{DOCUMENTATION_QFQ:Y}}#multi-language-form">Info</a>', '', '', '', '', 100, '', 'no', '', '', '', '{{SELECT IF("{{FORM_LANGUAGE_A_ID:YE}}"="","hidden","show" ) }}', '', 'none'),
+   '<a href="{{documentation:Y}}#multi-language-form">Info</a>', '', '', '', '', 100, '', 'no', '', '', '', '{{SELECT IF("{{FORM_LANGUAGE_A_ID:YE}}"="","hidden","show" ) }}', '', 'none'),
   (2, 'parameterLanguageB', 'Language: {{FORM_LANGUAGE_B_LABEL:YE}}', 'show', 'text', 'all', 'native', 210, '60,2', 0,
-   '<a href="{{DOCUMENTATION_QFQ:Y}}#multi-language-form">Info</a>', '', '', '', '', 100, '', 'no', '', '', '', '{{SELECT IF("{{FORM_LANGUAGE_B_ID:YE}}"="","hidden","show" ) }}', '', 'none'),
+   '<a href="{{documentation:Y}}#multi-language-form">Info</a>', '', '', '', '', 100, '', 'no', '', '', '', '{{SELECT IF("{{FORM_LANGUAGE_B_ID:YE}}"="","hidden","show" ) }}', '', 'none'),
   (2, 'parameterLanguageC', 'Language: {{FORM_LANGUAGE_C_LABEL:YE}}', 'show', 'text', 'all', 'native', 210, '60,2', 0,
-   '<a href="{{DOCUMENTATION_QFQ:Y}}#multi-language-form">Info</a>', '', '', '', '', 100, '', 'no', '', '', '', '{{SELECT IF("{{FORM_LANGUAGE_C_ID:YE}}"="","hidden","show" ) }}', '', 'none'),
+   '<a href="{{documentation:Y}}#multi-language-form">Info</a>', '', '', '', '', 100, '', 'no', '', '', '', '{{SELECT IF("{{FORM_LANGUAGE_C_ID:YE}}"="","hidden","show" ) }}', '', 'none'),
   (2, 'parameterLanguageD', 'Language: {{FORM_LANGUAGE_D_LABEL:YE}}', 'show', 'text', 'all', 'native', 210, '60,2', 0,
-   '<a href="{{DOCUMENTATION_QFQ:Y}}#multi-language-form">Info</a>', '', '', '', '', 100, '', 'no', '', '', '', '{{SELECT IF("{{FORM_LANGUAGE_D_ID:YE}}"="","hidden","show" ) }}', '', 'none'),
-  (2, 'encode', 'Encode', 'show', 'radio', 'all', 'native', 300, 0, 0, '<a href="{{DOCUMENTATION_QFQ:Y}}#field-encode">Info</a>', '', '', '', 'buttonClass=btn-default', 101, '', 'no', '', '', '', '', '', 'specialchar'),
-  (2, 'checkType', 'Check Type', 'show', 'radio', 'all', 'native', 310, 0, 0, '<a href="{{DOCUMENTATION_QFQ:Y}}#field-checktype">Info</a>', '', '', '', 'buttonClass=btn-default', 101, '', 'yes', '', '', '', '', '', 'specialchar'),
-  (2, 'checkPattern', 'Check Pattern', 'show', 'text', 'all', 'native', 320, 0, 0, '<a href="{{DOCUMENTATION_QFQ:Y}}#field-checkpattern">Info</a>, <a href="https://regex101.com/">Regex101</a>', '', '', '', '', 101, '', 'yes', '', '', '',
+   '<a href="{{documentation:Y}}#multi-language-form">Info</a>', '', '', '', '', 100, '', 'no', '', '', '', '{{SELECT IF("{{FORM_LANGUAGE_D_ID:YE}}"="","hidden","show" ) }}', '', 'none'),
+  (2, 'encode', 'Encode', 'show', 'radio', 'all', 'native', 300, 0, 0, '<a href="{{documentation:Y}}#field-encode">Info</a>', '', '', '', 'buttonClass=btn-default', 101, '', 'no', '', '', '', '', '', 'specialchar'),
+  (2, 'checkType', 'Check Type', 'show', 'radio', 'all', 'native', 310, 0, 0, '<a href="{{documentation:Y}}#field-checktype">Info</a>', '', '', '', 'buttonClass=btn-default', 101, '', 'yes', '', '', '', '', '', 'specialchar'),
+  (2, 'checkPattern', 'Check Pattern', 'show', 'text', 'all', 'native', 320, 0, 0, '<a href="{{documentation:Y}}#field-checkpattern">Info</a>, <a href="https://regex101.com/">Regex101</a>', '', '', '', '', 101, '', 'yes', '', '', '',
    '{{ SELECT IF("{{checkType:FRE:alnumx}}"="pattern" OR "{{checkType:FRE:allbut}}" LIKE "min%", "show", "hidden") }}', '', 'none'),
   #(2, 'onChange', 'JS onChange', 'show', 'text', 'all', 'native', 330, 0, 0, '', '', '', '', '', 101, '', 'no', '', '', '', '', '', 'none'),
-  (2, 'ord', 'Order', 'show', 'text', 'all', 'native', 340, 0, 0, '<a href="{{DOCUMENTATION_QFQ:Y}}#field-ord">Info</a>', '',
+  (2, 'ord', 'Order', 'show', 'text', 'all', 'native', 340, 0, 0, '<a href="{{documentation:Y}}#field-ord">Info</a>', '',
    '{{SELECT IF({{ord:R0}}=0,  MAX(IFNULL(fe.ord,0))+10,{{ord:R0}})  FROM (SELECT 1) AS a LEFT JOIN FormElement AS fe ON fe.formId={{formId:S0}} GROUP BY fe.formId}}',
    '', '', 101, '', 'no', '', '', '', '', '', 'specialchar'),
-  (2, 'tabindex', 'tabindex', 'show', 'text', 'all', 'native', 350, 0, 0, '<a href="{{DOCUMENTATION_QFQ:Y}}#field-tabindex">Info</a>', '', '', '', '', 101, '', 'no', '', '', '', '', '', 'specialchar'),
-  (2, 'size', 'Size', 'show', 'text', 'all', 'native', 400, 0, 0, '<a href="{{DOCUMENTATION_QFQ:Y}}#field-size">Info</a>', '', '', '', '', 102, '', 'no', '', '', '', '', '', 'specialchar'),
-  (2, 'bsLabelColumns', 'BS Label Columns', 'show', 'text', 'all', 'native', 410, 0, 0, '<a href="{{DOCUMENTATION_QFQ:Y}}#field-bslabelcolumns">Info</a>', '', '', '', '', 102, '', 'no', '', '', '', '', '{{bsLabelColumns:Y}}', 'specialchar'),
+  (2, 'tabindex', 'tabindex', 'show', 'text', 'all', 'native', 350, 0, 0, '<a href="{{documentation:Y}}#field-tabindex">Info</a>', '', '', '', '', 101, '', 'no', '', '', '', '', '', 'specialchar'),
+  (2, 'size', 'Size', 'show', 'text', 'all', 'native', 400, 0, 0, '<a href="{{documentation:Y}}#field-size">Info</a>', '', '', '', '', 102, '', 'no', '', '', '', '', '', 'specialchar'),
+  (2, 'bsLabelColumns', 'BS Label Columns', 'show', 'text', 'all', 'native', 410, 0, 0, '<a href="{{documentation:Y}}#field-bslabelcolumns">Info</a>', '', '', '', '', 102, '', 'no', '', '', '', '', '{{bsLabelColumns:Y}}', 'specialchar'),
   (2, 'bsInputColumns', 'BS Input Columns', 'show', 'text', 'all', 'native', 420, 0, 0, '', '', '', '', '', 102, '', 'no', '', '', '', '', '{{bsInputColumns:Y}}', 'specialchar'),
   (2, 'bsNoteColumns', 'BS Note Columns', 'show', 'text', 'all', 'native', 430, 0, 0, '', '', '', '', '', 102, '', 'no', '', '', '', '', '{{bsNoteColumns:Y}}', 'specialchar'),
-  (2, 'rowLabelInputNote', 'Label / Input / Note', 'show', 'checkbox', 'alnumx', 'native', 440, 0, 10, '<a href="{{DOCUMENTATION_QFQ:Y}}#field-rowlabelinputnote">Info</a>', '', '', '', '', 102, '', 'no', '', '', '', '', '', 'specialchar'),
-  (2, 'maxLength', 'Maxlength', 'show', 'text', 'all', 'native', 450, 0, 0, '<a href="{{DOCUMENTATION_QFQ:Y}}#field-maxlength">Info</a>', '', '', '', '', 102, '', 'no', '', '', '', '', '', 'specialchar'),
-  (2, 'note', 'Note', 'show', 'text', 'all', 'native', 460, '40,5', 0, '<a href="{{DOCUMENTATION_QFQ:Y}}#field-note">Info</a>', '', '', '', '', 102, '', 'no', '', '', '', '', '', 'none'),
-  (2, 'tooltip', 'Tooltip', 'show', 'text', 'all', 'native', 470, 0, 0, '<a href="{{DOCUMENTATION_QFQ:Y}}#field-tooltip">Info</a>', '', '', '', '', 102, '', 'no', '', '', '', '', '', 'none'),
-  (2, 'placeholder', 'Placeholder', 'show', 'text', 'all', 'native', 480, 0, 0, '<a href="{{DOCUMENTATION_QFQ:Y}}#field-placeholder">Info</a>', '', '', '', '', 102, '', 'no', '', '', '', '', '', 'none'),
-  (2, 'value', 'value', 'show', 'text', 'all', 'native', 500, '40,2', 0, '<a href="{{DOCUMENTATION_QFQ:Y}}#field-value">Info</a>', '', '', '', '', 103, '', 'no', '', '', '', '', '', 'none'),
+  (2, 'rowLabelInputNote', 'Label / Input / Note', 'show', 'checkbox', 'alnumx', 'native', 440, 0, 10, '<a href="{{documentation:Y}}#field-rowlabelinputnote">Info</a>', '', '', '', '', 102, '', 'no', '', '', '', '', '', 'specialchar'),
+  (2, 'maxLength', 'Maxlength', 'show', 'text', 'all', 'native', 450, 0, 0, '<a href="{{documentation:Y}}#field-maxlength">Info</a>', '', '', '', '', 102, '', 'no', '', '', '', '', '', 'specialchar'),
+  (2, 'note', 'Note', 'show', 'text', 'all', 'native', 460, '40,5', 0, '<a href="{{documentation:Y}}#field-note">Info</a>', '', '', '', '', 102, '', 'no', '', '', '', '', '', 'none'),
+  (2, 'tooltip', 'Tooltip', 'show', 'text', 'all', 'native', 470, 0, 0, '<a href="{{documentation:Y}}#field-tooltip">Info</a>', '', '', '', '', 102, '', 'no', '', '', '', '', '', 'none'),
+  (2, 'placeholder', 'Placeholder', 'show', 'text', 'all', 'native', 480, 0, 0, '<a href="{{documentation:Y}}#field-placeholder">Info</a>', '', '', '', '', 102, '', 'no', '', '', '', '', '', 'none'),
+  (2, 'value', 'value', 'show', 'text', 'all', 'native', 500, '40,2', 0, '<a href="{{documentation:Y}}#field-value">Info</a>', '', '', '', '', 103, '', 'no', '', '', '', '', '', 'none'),
   (2, 'sql1', 'sql1', 'show', 'text', 'all', 'native', 510, '40,5', 0,
-   '<a href="{{DOCUMENTATION_QFQ:Y}}#sql1">Info</a><br><br>MariaDB: <a href="https://mariadb.com/kb/en/mariadb/select/">Select</a>, <a href="https://mariadb.com/kb/en/mariadb/functions-and-operators/">Functions</a>',
+   '<a href="{{documentation:Y}}#sql1">Info</a><br><br>MariaDB: <a href="https://mariadb.com/kb/en/mariadb/select/">Select</a>, <a href="https://mariadb.com/kb/en/mariadb/functions-and-operators/">Functions</a>',
    '', '', '', '', 103, '', 'no', '', '', '', '', '', 'none'),
-  (2, 'parameter', 'Parameter', 'show', 'text', 'all', 'native', 520, '40,8', 0, '<a href="{{DOCUMENTATION_QFQ:Y}}#fe-parameter-attributes">Info</a>',
+  (2, 'parameter', 'Parameter', 'show', 'text', 'all', 'native', 520, '40,8', 0, '<a href="{{documentation:Y}}#fe-parameter-attributes">Info</a>',
    '', '', '', '', 103, '', 'no', '', '', '', '', '', 'none'),
   (2, 'adminNote', 'Admin Note', 'show', 'text', 'all', 'native', 600, 0, 0, '', '', '', '', '', 104, '', 'no', '', '',
    '', '', '', 'specialchar'),
@@ -424,7 +424,7 @@ CREATE TABLE IF NOT EXISTS `Cron` (
 # Form: AutoCron
 INSERT INTO Form (id, name, title, tableName, parameter, dirtyMode)
 VALUES
-  (4, 'cron', 'cron {{SELECT IF("{{r}}" = "0", "(new)", "(Id: {{r}})") }}', 'Cron', 'dbIndex={{DB_INDEX_QFQ:Y}}',
+  (4, 'cron', 'cron {{SELECT IF("{{r}}" = "0", "(new)", "(Id: {{r}})") }}', 'Cron', 'dbIndex={{dbIndexQfq:Y}}',
    'none');
 
 # FormElements: AutoCron
@@ -445,7 +445,7 @@ VALUES
   (4, 'content', '{{SELECT IF("{{type:FR:alnumx}}"="mail","Mail body","URL") }}', 'show', '', 'text', 'none', 'all', 70,
    'extraButtonInfo = Website: URL absolute like "http://..." or relative like "?id=pagealias..."<br>Mail: Static Body or &#123;{SELECT ...&#125;}', '40,4', '', 'yes', '', '', ''),
 
-  (4, 'outputFile', 'Log output to file', 'show', '{{SELECT IF("{{type:FR:alnumx}}"="mail","hidden","show") }}', 'text', 'none', 'all', 80, '', '', '', 'yes', '', '', ''),
+  (4, 'outputFile', 'Log output to file', 'show', '{{SELECT IF("{{type:FR:alnumx}}"="mail","hidden","show") }}', 'text', 'none', 'all', 80, '', '', 'CWD: Site installation directory', 'yes', '', '', ''),
   (4, 'outputMode', 'Mode output', 'show', '{{SELECT IF("{{type:FR:alnumx}}"="mail","hidden","show") }}', 'radio', 'specialchar', 'alnumx', 90, 'buttonClass=btn-default', '', '', 'yes', '', '', ''),
   (4, 'outputPattern', 'Pattern to look for on output', 'show', '{{SELECT IF("{{type:FR:alnumx}}"="mail","hidden","show") }}', 'text', 'none', 'all', 100, '', '', 'If pattern isn\'t found, return an error.<br>Check <a href="https://secure.php.net/manual/en/pcre.pattern.php">pcre</a> / <a href="https://regexp101.com">regexp101.com</a> ', 'yes', '', '', ''),
 
diff --git a/extension/qfq/tests/phpunit/AbstractDatabaseTest.php b/extension/qfq/tests/phpunit/AbstractDatabaseTest.php
index 87333409bd621af8e069cad58514743b9ee382ca..ff4979ca9685fc8f7f8a926e87ea311366daf0b9 100644
--- a/extension/qfq/tests/phpunit/AbstractDatabaseTest.php
+++ b/extension/qfq/tests/phpunit/AbstractDatabaseTest.php
@@ -1,6 +1,6 @@
 <?php
 /**
- * @author Rafael Ostertag <rafael.ostertag@math.uzh.ch>
+ * @author Carsten Rose <carsten.rose@math.uzh.ch>
  */
 
 //namespace qfq;
@@ -13,10 +13,13 @@ require_once(__DIR__ . '/../../qfq/database/Database.php');
 require_once(__DIR__ . '/../../qfq/store/Store.php');
 require_once(__DIR__ . '/../../qfq/store/Sip.php');
 
+use PHPUnit\Framework\TestCase;
+
 /**
  * Class AbstractDatabaseTest
  */
-abstract class AbstractDatabaseTest extends PHPUnit_Framework_TestCase {
+//abstract class AbstractDatabaseTest extends PHPUnit_Framework_TestCase {
+abstract class AbstractDatabaseTest extends TestCase {
 
     /**
      * @var null
@@ -79,7 +82,7 @@ abstract class AbstractDatabaseTest extends PHPUnit_Framework_TestCase {
 //        $this->store->setVar('DB_1_NAME', $dbNamePhpUnit, STORE_SYSTEM);
         $dbName = $this->store->getVar('DB_NAME_TEST', STORE_SYSTEM);
         if ($dbName == '') {
-            throw new \qfq\CodeException('Missing DB_NAME_TEST in ' . CONFIG_INI, ERROR_MISSING_REQUIRED_PARAMETER);
+            throw new \qfq\CodeException('Missing DB_NAME_TEST in ' . CONFIG_QFQ, ERROR_MISSING_REQUIRED_PARAMETER);
         } else {
             $this->store->setVar('DB_1_NAME', $dbName, STORE_SYSTEM);
         }
diff --git a/extension/qfq/tests/phpunit/BodytextParserTest.php b/extension/qfq/tests/phpunit/BodytextParserTest.php
index 665f08029ad4eeb4b354400656055207211f822b..2c0c4c4f569cc225f0180ac3f34eb73038b3c30e 100644
--- a/extension/qfq/tests/phpunit/BodytextParserTest.php
+++ b/extension/qfq/tests/phpunit/BodytextParserTest.php
@@ -12,8 +12,15 @@ namespace qfq;
 require_once(__DIR__ . '/../../qfq/BodytextParser.php');
 require_once(__DIR__ . '/../../qfq/exceptions/UserFormException.php');
 
+use PHPUnit\Framework\TestCase;
 
-class BodytextParserTest extends \PHPUnit_Framework_TestCase {
+//class BodytextParserTest extends \PHPUnit_Framework_TestCase {
+
+/**
+ * Class BodytextParserTest
+ * @package qfq
+ */
+class BodytextParserTest extends TestCase {
 
     public function testProcessPlain() {
         $btp = new BodytextParser();
diff --git a/extension/qfq/tests/phpunit/BuildFormPlainTest.php b/extension/qfq/tests/phpunit/BuildFormPlainTest.php
index 02f069bf5a61d214ae577eeab7baf69e23891e6e..525860f1f0ad3c2ff25c2dff94e42c1b6147faec 100644
--- a/extension/qfq/tests/phpunit/BuildFormPlainTest.php
+++ b/extension/qfq/tests/phpunit/BuildFormPlainTest.php
@@ -1,6 +1,6 @@
 <?php
 /**
- * @author Rafael Ostertag <rafael.ostertag@math.uzh.ch>
+ * @author Carsten Rose <carsten.rose@math.uzh.ch>
  */
 
 require_once(__DIR__ . '/AbstractDatabaseTest.php');
@@ -9,6 +9,9 @@ require_once(__DIR__ . '/../../qfq/exceptions/DbException.php');
 require_once(__DIR__ . '/../../qfq/QuickFormQuery.php');
 require_once(__DIR__ . '/../../qfq/helper/Support.php');
 
+/**
+ * Class BuildFormPlainTest
+ */
 class BuildFormPlainTest extends AbstractDatabaseTest {
 
     /**
@@ -447,7 +450,8 @@ class BuildFormPlainTest extends AbstractDatabaseTest {
     }
 
     /**
-     *
+     * @param array $form
+     * @param array $formElement
      */
     private function templateFormNFormElement(array &$form, array &$formElement) {
         $form = [
@@ -534,6 +538,9 @@ class BuildFormPlainTest extends AbstractDatabaseTest {
         // Defaults
         $this->store->setVar('name', 'varchar(255)', STORE_TABLE_COLUMN_TYPES, true);
         $this->store->setVar('deleted', "enum('yes','no')", STORE_TABLE_COLUMN_TYPES, true);
+//        $this->store->setVar(SYSTEM_DB_INDEX_DATA, DB_INDEX_DEFAULT, true);
+//        $this->store->setVar(SYSTEM_DB_INDEX_QFQ, DB_INDEX_DEFAULT, true);
+
 
         $GLOBALS["TSFE"] = new FakeTSFEBuildPlain();
 
@@ -545,6 +552,9 @@ class BuildFormPlainTest extends AbstractDatabaseTest {
     }
 }
 
+/**
+ * Class FakeTSFEBuildPlain
+ */
 class FakeTSFEBuildPlain {
     public $id = 1;
     public $type = 1;
diff --git a/extension/qfq/tests/phpunit/DatabaseTest.php b/extension/qfq/tests/phpunit/DatabaseTest.php
index 8dd0b1e787351cfb40abd16c0dcef976d425be36..6d3501df81949e46cd6b50d26443594f989749f8 100644
--- a/extension/qfq/tests/phpunit/DatabaseTest.php
+++ b/extension/qfq/tests/phpunit/DatabaseTest.php
@@ -1,16 +1,18 @@
 <?php
 /**
- * @author Rafael Ostertag <rafael.ostertag@math.uzh.ch>
+ * @author Carsten Rose <carsten.rose@math.uzh.ch>
  */
 
 require_once(__DIR__ . '/AbstractDatabaseTest.php');
 require_once(__DIR__ . '/../../qfq/database/Database.php');
 require_once(__DIR__ . '/../../qfq/exceptions/DbException.php');
 
+/**
+ * Class DatabaseTest
+ */
 class DatabaseTest extends AbstractDatabaseTest {
 
     /**
-     * @throws \qfq\DbException
      */
     public function testFetchAll() {
         $allRows = $this->dbArray[DB_INDEX_DEFAULT]->sql('SELECT * FROM Person ORDER BY id LIMIT 2');
@@ -21,7 +23,6 @@ class DatabaseTest extends AbstractDatabaseTest {
     }
 
     /**
-     * @throws \qfq\DbException
      */
     public function testFetchAllEmpty() {
         $allRows = $this->dbArray[DB_INDEX_DEFAULT]->sql('SELECT * FROM Person WHERE id=0 ORDER BY id');
@@ -30,7 +31,8 @@ class DatabaseTest extends AbstractDatabaseTest {
     }
 
     /**
-     * @throws \qfq\DbException
+     * @throws \qfq\CodeException
+     * @throws \qfq\UserFormException
      */
     public function testQuerySimple() {
 
@@ -136,7 +138,8 @@ class DatabaseTest extends AbstractDatabaseTest {
     }
 
     /**
-     * @throws \qfq\DbException
+     * @throws \qfq\CodeException
+     * @throws \qfq\UserFormException
      */
     public function testQuerySimpleParameter() {
         $stat = array();
@@ -206,7 +209,6 @@ class DatabaseTest extends AbstractDatabaseTest {
     }
 
     /**
-     * @throws \qfq\DbException
      */
     public function testParameters() {
         //TODO: ParameterName
@@ -228,7 +230,6 @@ class DatabaseTest extends AbstractDatabaseTest {
     }
 
     /**
-     * @throws \qfq\DbException
      */
     public function testSelectReturn() {
         $dummy = array();
@@ -244,7 +245,6 @@ class DatabaseTest extends AbstractDatabaseTest {
     }
 
     /**
-     * @throws \qfq\DbException
      */
     public function testShowReturn() {
         $dummy = array();
@@ -264,7 +264,6 @@ class DatabaseTest extends AbstractDatabaseTest {
     }
 
     /**
-     * @throws \qfq\DbException
      */
     public function testExplainReturn() {
         $dummy = array();
@@ -279,7 +278,6 @@ class DatabaseTest extends AbstractDatabaseTest {
     }
 
     /**
-     * @throws \qfq\DbException
      */
     public function testInsertReturn() {
         $dummy = array();
@@ -296,7 +294,6 @@ class DatabaseTest extends AbstractDatabaseTest {
     }
 
     /**
-     * @throws \qfq\DbException
      */
     public function testUpdateReturn() {
         $dummy = array();
@@ -313,7 +310,6 @@ class DatabaseTest extends AbstractDatabaseTest {
     }
 
     /**
-     * @throws \qfq\DbException
      */
     public function testDeleteReturn() {
         $dummy = array();
@@ -334,7 +330,6 @@ class DatabaseTest extends AbstractDatabaseTest {
 
 
     /**
-     * @throws \qfq\DbException
      */
     public function testReplaceReturn() {
         $dummy = array();
diff --git a/extension/qfq/tests/phpunit/DeleteTest.php b/extension/qfq/tests/phpunit/DeleteTest.php
index 77acfcb53a57fd51ef8c011279bc2acc24e4cff0..b13b47dcb71645c971b68bf86a2e2c89124ce486 100644
--- a/extension/qfq/tests/phpunit/DeleteTest.php
+++ b/extension/qfq/tests/phpunit/DeleteTest.php
@@ -11,6 +11,10 @@ namespace qfq;
 require_once(__DIR__ . '/AbstractDatabaseTest.php');
 require_once(__DIR__ . '/../../qfq/Delete.php');
 
+/**
+ * Class DeleteTest
+ * @package qfq
+ */
 class DeleteTest extends \AbstractDatabaseTest {
 
     /**
diff --git a/extension/qfq/tests/phpunit/DirtyTest.php b/extension/qfq/tests/phpunit/DirtyTest.php
index 7723f7f08c8eea90d62f10d6e78e79aed202bbcb..ec4b070f41a64353d994d611442cceb317142ab2 100644
--- a/extension/qfq/tests/phpunit/DirtyTest.php
+++ b/extension/qfq/tests/phpunit/DirtyTest.php
@@ -72,6 +72,9 @@ require_once(__DIR__ . '/../../qfq/database/Database.php');
  * Lock non existing record
  */
 
+/**
+ * Class DirtyTest
+ */
 class DirtyTest extends \AbstractDatabaseTest {
 
     /*
diff --git a/extension/qfq/tests/phpunit/EvaluateTest.php b/extension/qfq/tests/phpunit/EvaluateTest.php
index 0255f5af3454cc68e249b60384068b25ab906b1d..65200e61a38e1875f3e91f965f1acf05396b932a 100644
--- a/extension/qfq/tests/phpunit/EvaluateTest.php
+++ b/extension/qfq/tests/phpunit/EvaluateTest.php
@@ -15,6 +15,10 @@ require_once(__DIR__ . '/../../qfq/Evaluate.php');
 require_once(__DIR__ . '/../../qfq/database/Database.php');
 require_once(__DIR__ . '/../../qfq/store/Store.php');
 
+/**
+ * Class EvaluateTest
+ * @package qfq
+ */
 class EvaluateTest extends \AbstractDatabaseTest {
 
     public function testVars() {
diff --git a/extension/qfq/tests/phpunit/FillStoreFormTest.php b/extension/qfq/tests/phpunit/FillStoreFormTest.php
index 1cbf87943c7287b765b8d522ca84880d792160a6..eb96c47930b14dec67d96e0f493da19a870e7115 100644
--- a/extension/qfq/tests/phpunit/FillStoreFormTest.php
+++ b/extension/qfq/tests/phpunit/FillStoreFormTest.php
@@ -12,11 +12,17 @@ require_once(__DIR__ . '/../../qfq/store/FillStoreForm.php');
 
 //require_once(__DIR__ . '/../../qfq/exceptions/CodeException.php');
 
+use PHPUnit\Framework\TestCase;
 
-class FillStoreFormTest extends \PHPUnit_Framework_TestCase {
+//class FillStoreFormTest extends \PHPUnit_Framework_TestCase {
+
+/**
+ * Class FillStoreFormTest
+ * @package qfq
+ */
+class FillStoreFormTest extends TestCase {
 
     /**
-     * @throws CodeException
      * @throws UserFormException
      */
     public function testDoDateTime() {
diff --git a/extension/qfq/tests/phpunit/FormActionTest.php b/extension/qfq/tests/phpunit/FormActionTest.php
index 04d1ce00d379f6f7dd9ff778fa621f4b0792d564..86f059d0888353894f431c1e4fdac011780b0aaf 100644
--- a/extension/qfq/tests/phpunit/FormActionTest.php
+++ b/extension/qfq/tests/phpunit/FormActionTest.php
@@ -11,6 +11,10 @@ namespace qfq;
 require_once(__DIR__ . '/AbstractDatabaseTest.php');
 require_once(__DIR__ . '/../../qfq/form/FormAction.php');
 
+/**
+ * Class FormActionTest
+ * @package qfq
+ */
 class FormActionTest extends \AbstractDatabaseTest {
 
     public function testBeforeLoad() {
diff --git a/extension/qfq/tests/phpunit/HelperFormElementTest.php b/extension/qfq/tests/phpunit/HelperFormElementTest.php
index 39fe1a28457a4f92cf87b8d9a64d63fd412950c5..8909723df90270c339933f5c05b1dc5239f0daf5 100644
--- a/extension/qfq/tests/phpunit/HelperFormElementTest.php
+++ b/extension/qfq/tests/phpunit/HelperFormElementTest.php
@@ -12,7 +12,15 @@ namespace qfq;
 require_once(__DIR__ . '/../../qfq/helper/HelperFormElement.php');
 require_once(__DIR__ . '/../../qfq/Constants.php');
 
-class HelperFormElementTest extends \PHPUnit_Framework_TestCase {
+use PHPUnit\Framework\TestCase;
+
+//class HelperFormElementTest extends \PHPUnit_Framework_TestCase {
+
+/**
+ * Class HelperFormElementTest
+ * @package qfq
+ */
+class HelperFormElementTest extends TestCase {
 
     public function testExplodeParameter() {
         $a = array();
diff --git a/extension/qfq/tests/phpunit/KeyValueStringParserTest.php b/extension/qfq/tests/phpunit/KeyValueStringParserTest.php
index d491b4071ca248d6d7ece28d4d1b47045de20d8b..1603adaca4be4459d0b00be2c4acf75762768709 100644
--- a/extension/qfq/tests/phpunit/KeyValueStringParserTest.php
+++ b/extension/qfq/tests/phpunit/KeyValueStringParserTest.php
@@ -1,6 +1,6 @@
 <?php
 /**
- * @author Rafael Ostertag <rafael.ostertag@math.uzh.ch>
+ * @author Carsten Rose <carsten.rose@math.uzh.ch>
  */
 
 namespace qfq;
@@ -12,7 +12,15 @@ require_once(__DIR__ . '/../../qfq/Constants.php');
 
 require_once(__DIR__ . '/../../qfq/helper/KeyValueStringParser.php');
 
-class KeyValueStringParserTest extends \PHPUnit_Framework_TestCase {
+use PHPUnit\Framework\TestCase;
+
+//class KeyValueStringParserTest extends \PHPUnit_Framework_TestCase {
+
+/**
+ * Class KeyValueStringParserTest
+ * @package qfq
+ */
+class KeyValueStringParserTest extends TestCase {
 
 
     public function testSingleKeyValuePair() {
diff --git a/extension/qfq/tests/phpunit/LinkTest.php b/extension/qfq/tests/phpunit/LinkTest.php
index 21516ce0b072b8313d41481467628a6db5115583..d01a896c68d6db58d032e18fe67ff1910ec56986 100644
--- a/extension/qfq/tests/phpunit/LinkTest.php
+++ b/extension/qfq/tests/phpunit/LinkTest.php
@@ -14,8 +14,15 @@ require_once(__DIR__ . '/../../qfq/store/Sip.php');
 require_once(__DIR__ . '/../../qfq/store/Session.php');
 require_once(__DIR__ . '/../../qfq/exceptions/UserReportException.php');
 
+use PHPUnit\Framework\TestCase;
 
-class LinkTest extends \PHPUnit_Framework_TestCase {
+//class LinkTest extends \PHPUnit_Framework_TestCase {
+
+/**
+ * Class LinkTest
+ * @package qfq
+ */
+class LinkTest extends TestCase {
 
     /**
      * @var Sip
@@ -178,6 +185,8 @@ class LinkTest extends \PHPUnit_Framework_TestCase {
     }
 
     /**
+     * @throws CodeException
+     * @throws UserFormException
      * @throws UserReportException
      */
     public function testRenderModeUrl() {
@@ -191,6 +200,9 @@ class LinkTest extends \PHPUnit_Framework_TestCase {
         $result = $link->renderLink('t:Example');
         $this->assertEquals('', $result);
 
+        $result = $link->renderLink('u|t:Example');
+        $this->assertEquals('', $result);
+
         $result = $link->renderLink('u:http://example.com|t:Example');
         $this->assertEquals('<a href="http://example.com" >Example</a>', $result);
 
@@ -200,6 +212,9 @@ class LinkTest extends \PHPUnit_Framework_TestCase {
         $result = $link->renderLink('t:Example|r:0');
         $this->assertEquals('', $result);
 
+        $result = $link->renderLink('u|t:Example|r:0');
+        $this->assertEquals('', $result);
+
         $result = $link->renderLink('u:http://example.com|t:Example|r:0');
         $this->assertEquals('<a href="http://example.com" >Example</a>', $result);
 
@@ -208,7 +223,9 @@ class LinkTest extends \PHPUnit_Framework_TestCase {
         $this->assertEquals('<a href="http://example.com" >http://example.com</a>', $result);
 
         $result = $link->renderLink('t:Example|r:1');
-//        $this->assertEquals('<span >Example</span>', $result);
+        $this->assertEquals('Example', $result);
+
+        $result = $link->renderLink('u|t:Example|r:1');
         $this->assertEquals('Example', $result);
 
         $result = $link->renderLink('u:http://example.com|t:Example|r:1');
@@ -221,6 +238,9 @@ class LinkTest extends \PHPUnit_Framework_TestCase {
         $result = $link->renderLink('t:Example|r:2');
         $this->assertEquals('', $result);
 
+        $result = $link->renderLink('u|t:Example|r:2');
+        $this->assertEquals('', $result);
+
         $result = $link->renderLink('u:http://example.com|t:Example|r:2');
         $this->assertEquals('<a href="http://example.com" >Example</a>', $result);
 
@@ -230,7 +250,9 @@ class LinkTest extends \PHPUnit_Framework_TestCase {
         $this->assertEquals('http://example.com', $result);
 
         $result = $link->renderLink('t:Example|r:3');
-//        $this->assertEquals('<span >Example</span>', $result);
+        $this->assertEquals('Example', $result);
+
+        $result = $link->renderLink('u|t:Example|r:3');
         $this->assertEquals('Example', $result);
 
         $result = $link->renderLink('u:http://example.com|t:Example|r:3');
@@ -239,11 +261,12 @@ class LinkTest extends \PHPUnit_Framework_TestCase {
 
         // r: 4
         $result = $link->renderLink('u:http://example.com|r:4');
-//        $this->assertEquals('<span >http://example.com</span>', $result);
         $this->assertEquals('http://example.com', $result);
 
         $result = $link->renderLink('t:Example|r:4');
-//        $this->assertEquals('<span >Example</span>', $result);
+        $this->assertEquals('Example', $result);
+
+        $result = $link->renderLink('u|t:Example|r:4');
         $this->assertEquals('Example', $result);
 
         $result = $link->renderLink('u:http://example.com|t:Example|r:4');
@@ -257,6 +280,9 @@ class LinkTest extends \PHPUnit_Framework_TestCase {
         $result = $link->renderLink('t:Example|r:5');
         $this->assertEquals('', $result);
 
+        $result = $link->renderLink('u|t:Example|r:5');
+        $this->assertEquals('', $result);
+
         $result = $link->renderLink('u:http://example.com|t:Example|r:5');
         $this->assertEquals('', $result);
     }
diff --git a/extension/qfq/tests/phpunit/OnArrayTest.php b/extension/qfq/tests/phpunit/OnArrayTest.php
index 06ba468fd525e496ca84e55d6cbfad73455c4bbe..b5f7782d7ddb8298ddb42fbb49eb8d352a72b0a4 100644
--- a/extension/qfq/tests/phpunit/OnArrayTest.php
+++ b/extension/qfq/tests/phpunit/OnArrayTest.php
@@ -10,8 +10,15 @@ namespace qfq;
 
 require_once(__DIR__ . '/../../qfq/helper/OnArray.php');
 
+use PHPUnit\Framework\TestCase;
 
-class OnArrayTest extends \PHPUnit_Framework_TestCase {
+//class OnArrayTest extends \PHPUnit_Framework_TestCase {
+
+/**
+ * Class OnArrayTest
+ * @package qfq
+ */
+class OnArrayTest extends TestCase {
 
     public function testSortByKey() {
         $unsorted = [
diff --git a/extension/qfq/tests/phpunit/OnStringTest.php b/extension/qfq/tests/phpunit/OnStringTest.php
index 112226f38ef8928a12f9d2da9a82c0432351a2bf..e6cf0ac870f3c8defa6b47d407f688fbffe5d588 100644
--- a/extension/qfq/tests/phpunit/OnStringTest.php
+++ b/extension/qfq/tests/phpunit/OnStringTest.php
@@ -19,7 +19,15 @@ use qfq;
 //require_once(__DIR__ . '/../../qfq/exceptions/CodeException.php');
 //
 
-class OnStringTest extends \PHPUnit_Framework_TestCase {
+use PHPUnit\Framework\TestCase;
+
+//class OnStringTest extends \PHPUnit_Framework_TestCase {
+
+/**
+ * Class OnStringTest
+ * @package qfq
+ */
+class OnStringTest extends TestCase {
 
     /**
      *
diff --git a/extension/qfq/tests/phpunit/QuickFormQueryTest.php b/extension/qfq/tests/phpunit/QuickFormQueryTest.php
index bac8ebae8d73a90470acd5e28d0b635a1fcb2b98..a590e0ce3d6c416e26652710f3a9db333f30fdd7 100644
--- a/extension/qfq/tests/phpunit/QuickFormQueryTest.php
+++ b/extension/qfq/tests/phpunit/QuickFormQueryTest.php
@@ -13,7 +13,14 @@ require_once(__DIR__ . '/../../qfq/QuickFormQuery.php');
 require_once(__DIR__ . '/../../qfq/store/Store.php');
 require_once(__DIR__ . '/../../qfq/store/Sip.php');
 
-class QuickFormQueryTest extends \PHPUnit_Framework_TestCase {
+use PHPUnit\Framework\TestCase;
+
+//class QuickFormQueryTest extends \PHPUnit_Framework_TestCase {
+
+/**
+ * Class QuickFormQueryTest
+ */
+class QuickFormQueryTest extends TestCase {
 
     private $store;
 
diff --git a/extension/qfq/tests/phpunit/ReportTest.php b/extension/qfq/tests/phpunit/ReportTest.php
index 788ef28ebb15a167665ca988a06cba7835355522..49ec0ec50bb41b15f0283dc02f1755fe7af9a6ea 100644
--- a/extension/qfq/tests/phpunit/ReportTest.php
+++ b/extension/qfq/tests/phpunit/ReportTest.php
@@ -1104,6 +1104,9 @@ EOF;
     }
 }
 
+/**
+ * Class FakeTSFEReport
+ */
 class FakeTSFEReport {
     public $id = 1;
     public $type = 1;
diff --git a/extension/qfq/tests/phpunit/SanitizeTest.php b/extension/qfq/tests/phpunit/SanitizeTest.php
index a70e34c05c6ce9359f94f112131f1ff3a7b204e0..7a0aef65d99db76c035b19d88b8653887be7b39a 100644
--- a/extension/qfq/tests/phpunit/SanitizeTest.php
+++ b/extension/qfq/tests/phpunit/SanitizeTest.php
@@ -11,8 +11,15 @@ namespace qfq;
 require_once(__DIR__ . '/../../qfq/helper/Sanitize.php');
 require_once(__DIR__ . '/../../qfq/exceptions/CodeException.php');
 
+use PHPUnit\Framework\TestCase;
 
-class SanitizeTest extends \PHPUnit_Framework_TestCase {
+//class SanitizeTest extends \PHPUnit_Framework_TestCase {
+
+/**
+ * Class SanitizeTest
+ * @package qfq
+ */
+class SanitizeTest extends TestCase {
 
     /**
      * @throws CodeException
@@ -106,7 +113,6 @@ class SanitizeTest extends \PHPUnit_Framework_TestCase {
     }
 
     /**
-     * @throws CodeException
      * @throws UserFormException
      */
     public function testSanitizeMinMax() {
@@ -119,7 +125,7 @@ class SanitizeTest extends \PHPUnit_Framework_TestCase {
         $this->assertEquals($val, Sanitize::checkMinMax($val, "", "56"), $msg);
 
         $this->assertEquals('', Sanitize::checkMinMax($val, "57", ""), $msg);
-        $this->assertEquals('', Sanitize::checkMinMax($val, "", "2" ), $msg);
+        $this->assertEquals('', Sanitize::checkMinMax($val, "", "2"), $msg);
         $this->assertEquals($val, Sanitize::checkMinMax($val, "0", "200"), $msg);
         $this->assertEquals($val, Sanitize::checkMinMax($val, "-100", "200"), $msg);
 
@@ -297,7 +303,6 @@ class SanitizeTest extends \PHPUnit_Framework_TestCase {
     /**
      * Test string, numeric, array, subarray
      *
-     * @throws CodeException
      */
     public function testSafeFilename() {
 
@@ -337,4 +342,37 @@ class SanitizeTest extends \PHPUnit_Framework_TestCase {
         $this->assertEquals('test_./_oe', Sanitize::safeFilename($value, false, true));
 
     }
+
+    /**
+     * Test string, numeric
+     *
+     */
+    public function testDigitCheckAndCleanGet() {
+
+        unset ($_GET[CLIENT_PAGE_LANGUAGE]);
+        Sanitize::digitCheckAndCleanGet(CLIENT_PAGE_LANGUAGE);
+        $this->assertEquals(false, isset($_GET[CLIENT_PAGE_LANGUAGE]));
+
+        $_GET[CLIENT_PAGE_LANGUAGE] = '';
+        Sanitize::digitCheckAndCleanGet(CLIENT_PAGE_LANGUAGE);
+        $this->assertEquals($_GET[CLIENT_PAGE_LANGUAGE], '');
+
+        $_GET[CLIENT_PAGE_LANGUAGE] = '0';
+        Sanitize::digitCheckAndCleanGet(CLIENT_PAGE_LANGUAGE);
+        $this->assertEquals($_GET[CLIENT_PAGE_LANGUAGE], '0');
+
+        $_GET[CLIENT_PAGE_LANGUAGE] = '1234';
+        Sanitize::digitCheckAndCleanGet(CLIENT_PAGE_LANGUAGE);
+        $this->assertEquals($_GET[CLIENT_PAGE_LANGUAGE], '1234');
+
+        $_GET[CLIENT_PAGE_LANGUAGE] = 'abc';
+        Sanitize::digitCheckAndCleanGet(CLIENT_PAGE_LANGUAGE);
+        $this->assertEquals($_GET[CLIENT_PAGE_LANGUAGE], '');
+
+        $_GET[CLIENT_PAGE_LANGUAGE] = '54abc';
+        Sanitize::digitCheckAndCleanGet(CLIENT_PAGE_LANGUAGE);
+        $this->assertEquals($_GET[CLIENT_PAGE_LANGUAGE], '5');
+    }
+
+
 }
diff --git a/extension/qfq/tests/phpunit/SaveTest.php b/extension/qfq/tests/phpunit/SaveTest.php
index 21bc3c2cb6333adffb20f74e2f63c273cf640a86..f4ca946f2be7f0396c3d9bc53f91fb569e5682a8 100644
--- a/extension/qfq/tests/phpunit/SaveTest.php
+++ b/extension/qfq/tests/phpunit/SaveTest.php
@@ -15,6 +15,9 @@ require_once(__DIR__ . '/../../qfq/Save.php');
 //require_once(__DIR__ . '/../../qfq/Database.php');
 require_once(__DIR__ . '/AbstractDatabaseTest.php');
 
+/**
+ * Class SaveTest
+ */
 class SaveTest extends AbstractDatabaseTest {
 
     public function testUpdateRecord() {
diff --git a/extension/qfq/tests/phpunit/SendMailTest.php b/extension/qfq/tests/phpunit/SendMailTest.php
index 1a8be64f30ced414d51098cb01f5bc8031d72d33..5854cdd1df71a75c2af100d7245db6b07e85de2e 100644
--- a/extension/qfq/tests/phpunit/SendMailTest.php
+++ b/extension/qfq/tests/phpunit/SendMailTest.php
@@ -14,7 +14,16 @@ require_once(__DIR__ . '/../../qfq/report/SendMail.php');
  * Date: 2/2/16
  * Time: 10:07 PM
  */
-class SendMailTest extends \PHPUnit_Framework_TestCase {
+
+use PHPUnit\Framework\TestCase;
+
+//class SendMailTest extends \PHPUnit_Framework_TestCase {
+
+/**
+ * Class SendMailTest
+ * @package qfq
+ */
+class SendMailTest extends TestCase {
 
     /**
      * @var qfq\SendMail
diff --git a/extension/qfq/tests/phpunit/SessionTest.php b/extension/qfq/tests/phpunit/SessionTest.php
index d2c74a3938cf1771defe03f2ecd414b15aaf29a7..e490402d74dc3314f12a5c7490dfba8b4f7354d7 100644
--- a/extension/qfq/tests/phpunit/SessionTest.php
+++ b/extension/qfq/tests/phpunit/SessionTest.php
@@ -11,7 +11,16 @@ require_once(__DIR__ . '/../../qfq/store/Session.php');
  * Date: 1/10/16
  * Time: 10:55 PM
  */
-class SessionTest extends \PHPUnit_Framework_TestCase {
+
+use PHPUnit\Framework\TestCase;
+
+//class SessionTest extends \PHPUnit_Framework_TestCase {
+
+/**
+ * Class SessionTest
+ * @package qfq
+ */
+class SessionTest extends TestCase {
 
     public function testGetSession() {
 
diff --git a/extension/qfq/tests/phpunit/SipTest.php b/extension/qfq/tests/phpunit/SipTest.php
index a12d8e1ca0d614245c91bcb7a3e7a9c8f1e08dc3..c401025050f61f4a7202519dfbc4ad711c0c9514 100644
--- a/extension/qfq/tests/phpunit/SipTest.php
+++ b/extension/qfq/tests/phpunit/SipTest.php
@@ -11,7 +11,16 @@ require_once(__DIR__ . '/../../qfq/store/Sip.php');
  * Date: 1/10/16
  * Time: 10:55 PM
  */
-class SipTest extends \PHPUnit_Framework_TestCase {
+
+use PHPUnit\Framework\TestCase;
+
+//class SipTest extends \PHPUnit_Framework_TestCase {
+
+/**
+ * Class SipTest
+ * @package qfq
+ */
+class SipTest extends TestCase {
 
     public function testUrlparamToSip() {
 
@@ -102,6 +111,7 @@ class SipTest extends \PHPUnit_Framework_TestCase {
 
     /**
      * @throws CodeException
+     * @throws UserFormException
      */
     public function testGetSipFromUrlParam() {
 
@@ -136,6 +146,7 @@ class SipTest extends \PHPUnit_Framework_TestCase {
 
     /**
      * @throws CodeException
+     * @throws UserFormException
      */
     public function testGetQueryStringFromSip() {
         $sip = new Sip('fakesessionname', true);
diff --git a/extension/qfq/tests/phpunit/StoreTest.php b/extension/qfq/tests/phpunit/StoreTest.php
index 7383ad0ea5d9f74a2a3c7615d9853fc05f0b6758..f283a962b4638eae25efe18e422f8a0cbc0f9926 100644
--- a/extension/qfq/tests/phpunit/StoreTest.php
+++ b/extension/qfq/tests/phpunit/StoreTest.php
@@ -16,8 +16,15 @@ require_once(__DIR__ . '/../../qfq/store/Store.php');
 require_once(__DIR__ . '/../../qfq/Constants.php');
 require_once(__DIR__ . '/../../qfq/exceptions/CodeException.php');
 
+use PHPUnit\Framework\TestCase;
 
-class StoreTest extends \PHPUnit_Framework_TestCase {
+//class StoreTest extends \PHPUnit_Framework_TestCase {
+
+/**
+ * Class StoreTest
+ * @package qfq
+ */
+class StoreTest extends TestCase {
 
     /**
      * @var Store
@@ -295,7 +302,7 @@ EOT;
             F_BS_INPUT_COLUMNS => '6',
             F_BS_NOTE_COLUMNS => '3',
 
-            SYSTEM_WKHTMLTOPDF => '/opt/wkhtmltox/bin/wkhtmltopdf',
+            SYSTEM_CMD_WKHTMLTOPDF => '/opt/wkhtmltox/bin/wkhtmltopdf',
 
             F_CLASS_PILL => 'qfq-color-grey-1',
             F_CLASS_BODY => 'qfq-color-grey-2',
@@ -327,8 +334,8 @@ EOT;
             SYSTEM_SECURITY_SHOW_MESSAGE => '0',
             SYSTEM_SECURITY_GET_MAX_LENGTH => 50,
             SYSTEM_ESCAPE_TYPE_DEFAULT => 'm',
-            SYSTEM_GFX_EXTRA_BUTTON_INFO_INLINE => '<span class="glyphicon glyphicon-info-sign" aria-hidden="true"></span>',
-            SYSTEM_GFX_EXTRA_BUTTON_INFO_BELOW => '<span class="glyphicon glyphicon-info-sign text-info" aria-hidden="true"></span>',
+            SYSTEM_EXTRA_BUTTON_INFO_INLINE => '<span class="glyphicon glyphicon-info-sign" aria-hidden="true"></span>',
+            SYSTEM_EXTRA_BUTTON_INFO_BELOW => '<span class="glyphicon glyphicon-info-sign text-info" aria-hidden="true"></span>',
             SYSTEM_EXTRA_BUTTON_INFO_CLASS => '',
 
             SYSTEM_DB_UPDATE => SYSTEM_DB_UPDATE_AUTO,
diff --git a/extension/qfq/tests/phpunit/SupportTest.php b/extension/qfq/tests/phpunit/SupportTest.php
index 47a58e820c35fe190a3fbf61e7484337a8443b51..1e6f276a3fe7982f915fece614ba20d303c20eb0 100644
--- a/extension/qfq/tests/phpunit/SupportTest.php
+++ b/extension/qfq/tests/phpunit/SupportTest.php
@@ -12,13 +12,23 @@ require_once(__DIR__ . '/../../qfq/helper/Support.php');
 require_once(__DIR__ . '/../../qfq/BuildFormPlain.php');
 require_once(__DIR__ . '/../../qfq/Evaluate.php');
 
+use PHPUnit\Framework\TestCase;
+
+/**
+ * Class FakeTSFE
+ * @package qfq
+ */
 class FakeTSFE {
     public $id = 1;
     public $type = 2;
     public $sys_language_uid = 3;
 }
 
-class SupportTest extends \PHPUnit_Framework_TestCase {
+/**
+ * Class SupportTest
+ * @package qfq
+ */
+class SupportTest extends TestCase {
 
     /**
      * @var Store
diff --git a/extension/qfq/tests/phpunit/TokenTest.php b/extension/qfq/tests/phpunit/TokenTest.php
index f0974086f49ac5ed0f8e783cd47f82969fb82d54..e5077d3d16120499e765c99ef91c51e915897947 100644
--- a/extension/qfq/tests/phpunit/TokenTest.php
+++ b/extension/qfq/tests/phpunit/TokenTest.php
@@ -6,13 +6,21 @@
  * Time: 9:16 PM
  */
 
+
 namespace qfq;
 
 require_once(__DIR__ . '/../../qfq/helper/Token.php');
 
-use qfq;
+#use qfq;
+
+use PHPUnit\Framework\TestCase;
+
 
-class TokenTest extends \PHPUnit_Framework_TestCase {
+/**
+ * Class TokenTest
+ * @package qfq
+ */
+class TokenTest extends TestCase {
 
     public function testExplodeDimension() {
 
diff --git a/setVersion.sh b/setVersion.sh
index 7133c7df97ae6baf0d6034ac5c9edba05776b847..14e4d353937727a2c36e1121e69a8133b6293353 100755
--- a/setVersion.sh
+++ b/setVersion.sh
@@ -25,7 +25,7 @@ function settingsCfg() {
 function extEmConf() {
     FILE="extension/ext_emconf.php"
 
-    sed  -i -r 's/^\s*'${ST}'version'${ST}'\s*=>.+$/    '${ST}'version'${ST}' => '${ST}${VERSION}${ST}'/g'  ${FILE}
+    sed  -i -r 's/^\s*'${ST}'version'${ST}'\s*=>.+$/    '${ST}'version'${ST}' => '${ST}${VERSION}${ST},'/g'  ${FILE}
 }
 
 function versionFile() {
diff --git a/version b/version
index 61738a239e0adac177f881f008ad68d5eaeea74f..d8215eea75da6975344bef1e411cc0fd681d443a 100644
--- a/version
+++ b/version
@@ -1 +1 @@
-0.25.15a
+18.4.4