diff --git a/Documentation/Release.rst b/Documentation/Release.rst
index 0d0e6e103dd952696286bb1468e53746793e94ba..1e49680f8dc0c76df4be2b43922bdd168ac4442d 100644
--- a/Documentation/Release.rst
+++ b/Documentation/Release.rst
@@ -1,5 +1,5 @@
 .. ==================================================
-.. Header hierachy
+.. Header hierarchy
 .. ==
 ..  --
 ..   ^^
@@ -49,14 +49,17 @@ Features
 
 * #8886 / Check pattern: after focus lost.
 * #9655 / Checkboxes and radios now defined with a min-width in horizontal plain mode.
-* #9617:
+* #9617 / formModeGlobal:
 
- * Two modes now implemented 'requiredOff' and 'requiredOffButMark'.
- * formModeGlobal: renamed skipRequiredCheck to requiredOffButMark .
- * Keep required marks after save.
- * Stop hiding helpblocks per default, set with class qfq-only-active-error.
+ * Two modes of 'formModeGlobal' available: 'requiredOff' and 'requiredOffButMark'.
+ * 'requiredOffButMark':
 
-* Radio: new class 'qfq-disabled' if readonly is set. softer blue. mark disabled - changed hover. text in darker orange. simple-error renamed to qfq-notify - removed box around error.
+   * Renamed temporary 'skipRequiredCheck' to 'requiredOffButMark'.
+   * Keep required marks after save.
+   * Stop hiding helpblocks per default, set with class qfq-only-active-error.
+
+* Radio: new class 'qfq-disabled' if readonly is set. Softer blue. Mark disabled - changed hover. Text in darker orange.
+  Simple-error renamed to qfq-notify - removed box around error.
 * New default class for 'form' tag: 'qfq-notify'.
 * Manual.rst: Add info for 'letter-no-break'.
 * Add validator.js to list of used packages.
@@ -86,21 +89,17 @@ Date: 25.11.2019
 Notes
 ^^^^^
 
-* Fantastic new formModeGlobal=skipRequiredCheck: fill's '{{allRequiredGiven:V}}' before save to 1 (all given) else 0.
+* Enhance formModeGlobal=requiredOff/-ButMark (temporarily skipRequiredCheck): fill's '{{allRequiredGiven:V}}' before
+  save to 1 (all given) else 0.
   Offers user to save form, even if not all required data are given and offers application logic to check easily if all
-  required fields has been fillled.
-
-* formModeGlobal=requiredOff is now deprecated but will still work.
+  required fields has been filled.
 
 Features
 ^^^^^^^^
 
-* #9526 / Mark required fields more visible
+* #9526 / Mark required fields more visible.
 * #9617 / Improve 'formModeGlobal=requiredOff'.
 
-  * New mode name 'skipRequiredCheck'.
-  * 'requiredOff' is replaced by 'skipRequiredCheck' and now deprecated.
-  * Add documentation for 'skipRequiredCheck:S' & 'allRequiredGiven:V'
   * Feature `Form.formModeGlobal` implemented - STORE_SIP overwrites form definition.
   * New STORE_VAR variable 'allRequiredGiven'. Becomes '1' if all required fields are given, else 0.
 
@@ -114,11 +113,11 @@ Bug Fixes
 * #7639 / subrecord drag n drop:
 
  * `orderInterval` has not been respected.
- * Update Manual.rst
+ * Update Manual.rst.
  * Fake STORE_SIP so it can be used during processing sql1.
  * The record, currently loaded into form, is available via STORE_RECORD.
- * Check for id/_id and ord/_ord
- * Throw meaningful exception if missing 'id' or 'ord'
+ * Check for id/_id and ord/_ord.
+ * Throw meaningful exception if missing 'id' or 'ord'.
 
 * Fixes bug that no mime_type_content is called if there is on file.
 * Fix broken regex101 url.
diff --git a/extension/Classes/Core/Report/Link.php b/extension/Classes/Core/Report/Link.php
index 8bc91b4143f527d6137988aedc4c1573ea3dd553..1e6a55203787936d44f0e104222f9b15abc65032 100644
--- a/extension/Classes/Core/Report/Link.php
+++ b/extension/Classes/Core/Report/Link.php
@@ -28,6 +28,7 @@ use IMATHUZH\Qfq\Core\Helper\KeyValueStringParser;
 use IMATHUZH\Qfq\Core\Helper\OnArray;
 use IMATHUZH\Qfq\Core\Helper\Support;
 use IMATHUZH\Qfq\Core\Helper\Token;
+use IMATHUZH\Qfq\Core\Helper\Sanitize;
 use IMATHUZH\Qfq\Core\Store\Sip;
 use IMATHUZH\Qfq\Core\Store\Store;
 
@@ -1525,6 +1526,12 @@ EOF;
      */
     private function buildDownload($vars, $value) {
 
+        // By default, qfq saves everything HTML encoded. E.g. in form ''' - decode them back to regual UTF-8 text.
+        $filename = html_entity_decode($vars[DOWNLOAD_EXPORT_FILENAME], ENT_QUOTES | ENT_XML1, 'UTF-8');
+
+        // Remove unsafe characters.
+        $vars[DOWNLOAD_EXPORT_FILENAME] = Sanitize::safeFilename($filename);
+
         return $vars;
     }
 
diff --git a/javascript/src/QfqForm.js b/javascript/src/QfqForm.js
index cda7095897de0293bdf5a0e40767afb57f0ed4e5..a2edb72315174e804d8e1df59318ee288fe54feb 100644
--- a/javascript/src/QfqForm.js
+++ b/javascript/src/QfqForm.js
@@ -504,8 +504,9 @@ var QfqNS = QfqNS || {};
         }
     };
 
+    /* Dynamic Update Trigger */
     n.QfqForm.prototype.setupFormUpdateHandler = function () {
-        $('input[data-load],select[data-load]').on('change', this.formUpdateHandler.bind(this));
+        $('textarea[data-load],input[data-load],select[data-load]').on('change', this.formUpdateHandler.bind(this));
     };
 
     n.QfqForm.prototype.formUpdateHandler = function () {