diff --git a/Build/Sources/TypeScript/redirects/Resources/Public/TypeScript/EventHandler.ts b/Build/Sources/TypeScript/redirects/Resources/Public/TypeScript/EventHandler.ts
index 84ad97029ad29a54ff7d9198728cf4b2800327f1..8d38b0e190f66c40a9576b3fe8afef2902bc35cf 100644
--- a/Build/Sources/TypeScript/redirects/Resources/Public/TypeScript/EventHandler.ts
+++ b/Build/Sources/TypeScript/redirects/Resources/Public/TypeScript/EventHandler.ts
@@ -1,8 +1,25 @@
+/*
+ * This file is part of the TYPO3 CMS project.
+ *
+ * It is free software; you can redistribute it and/or modify it under
+ * the terms of the GNU General Public License, either version 2
+ * of the License, or any later version.
+ *
+ * For the full copyright and license information, please read the
+ * LICENSE.txt file that was distributed with this source code.
+ *
+ * The TYPO3 project - inspiring people to share!
+ */
+
 import {AjaxResponse} from 'TYPO3/CMS/Core/Ajax/AjaxResponse';
 import AjaxRequest = require('TYPO3/CMS/Core/Ajax/AjaxRequest');
 import NotificationService = require('TYPO3/CMS/Backend/Notification');
 import DeferredAction = require('TYPO3/CMS/Backend/ActionButton/DeferredAction');
 
+/**
+ * Module: TYPO3/CMS/Redirects/EventHandler
+ * @exports TYPO3/CMS/Redirects/EventHandler
+ */
 class EventHandler {
   public constructor() {
     document.addEventListener(
diff --git a/Build/Sources/TypeScript/redirects/Resources/Public/TypeScript/RedirectsModule.ts b/Build/Sources/TypeScript/redirects/Resources/Public/TypeScript/RedirectsModule.ts
new file mode 100644
index 0000000000000000000000000000000000000000..3f308674d6c680a985a6d0d86766d33b9d301211
--- /dev/null
+++ b/Build/Sources/TypeScript/redirects/Resources/Public/TypeScript/RedirectsModule.ts
@@ -0,0 +1,56 @@
+/*
+ * This file is part of the TYPO3 CMS project.
+ *
+ * It is free software; you can redistribute it and/or modify it under
+ * the terms of the GNU General Public License, either version 2
+ * of the License, or any later version.
+ *
+ * For the full copyright and license information, please read the
+ * LICENSE.txt file that was distributed with this source code.
+ *
+ * The TYPO3 project - inspiring people to share!
+ */
+
+import RegularEvent = require('TYPO3/CMS/Core/Event/RegularEvent');
+
+/**
+ * Module: TYPO3/CMS/Redirects/RedirectsModule
+ * @exports TYPO3/CMS/Redirects/RedirectsModule
+ */
+class RedirectsModule {
+  public constructor() {
+    const filterForm: HTMLFormElement = document.querySelector('form[data-on-submit="processNavigate"]');
+    if (filterForm !== null) {
+      new RegularEvent('change', this.executeSubmit.bind(this))
+        .delegateTo(document, '[data-on-change="submit"]');
+      new RegularEvent('submit', this.processNavigate.bind(this))
+        .bindTo(filterForm);
+    }
+  }
+
+  private executeSubmit(evt: Event, target: Element): void {
+    if (target instanceof HTMLSelectElement) {
+      target.form.submit();
+    }
+  }
+
+  private processNavigate(evt: Event, target: Element): void {
+    if (!(target instanceof HTMLFormElement)) {
+      return;
+    }
+    evt.preventDefault();
+    const formField = target.elements.namedItem('paginator-target-page') as HTMLInputElement;
+    const numberOfPages = parseInt(formField.dataset.numberOfPages, 10);
+    let url = formField.dataset.url;
+    let page = parseInt(formField.value, 10);
+    if (page > numberOfPages) {
+      page = numberOfPages;
+    } else if (page < 1) {
+      page = 1;
+    }
+    url = url.replace('987654322', page.toString());
+    self.location.href = url;
+  }
+}
+
+export = new RedirectsModule();
diff --git a/Build/Sources/TypeScript/scheduler/Resources/Public/TypeScript/Scheduler.ts b/Build/Sources/TypeScript/scheduler/Resources/Public/TypeScript/Scheduler.ts
index 46f3fd2897fd54c75228c05fa8d6bce5f270c9d1..8d86fd0fee67f8a23218d765b79437f7bd8f8607 100644
--- a/Build/Sources/TypeScript/scheduler/Resources/Public/TypeScript/Scheduler.ts
+++ b/Build/Sources/TypeScript/scheduler/Resources/Public/TypeScript/Scheduler.ts
@@ -163,6 +163,13 @@ class Scheduler {
       this.actOnChangeSchedulerTableGarbageCollectionTable($(evt.currentTarget));
     });
 
+    $('[data-update-task-frequency]').change((evt: JQueryEventObject): void => {
+      const $target = $(evt.currentTarget);
+      const $taskFrequency = $('#task_frequency');
+      $taskFrequency.val($target.val());
+      $target.val($target.attr('value')).blur();
+    });
+
     const taskGroupTable = document.querySelector('table.taskGroup-table');
     if (taskGroupTable !== null) {
       new Tablesort(taskGroupTable);
diff --git a/typo3/sysext/redirects/Classes/Controller/ManagementController.php b/typo3/sysext/redirects/Classes/Controller/ManagementController.php
index b8b506d3bb9963010018aae2468fcff5696c7211..0e18c89801f53fd8c2fda418670ca7a22df562fa 100644
--- a/typo3/sysext/redirects/Classes/Controller/ManagementController.php
+++ b/typo3/sysext/redirects/Classes/Controller/ManagementController.php
@@ -69,6 +69,7 @@ class ManagementController
     {
         $this->moduleTemplate = GeneralUtility::makeInstance(ModuleTemplate::class);
         $this->moduleTemplate->getPageRenderer()->loadRequireJsModule('TYPO3/CMS/Backend/Modal');
+        $this->moduleTemplate->getPageRenderer()->loadRequireJsModule('TYPO3/CMS/Redirects/RedirectsModule');
         $this->iconFactory = GeneralUtility::makeInstance(IconFactory::class);
         $this->getLanguageService()->includeLLFile('EXT:redirects/Resources/Private/Language/locallang_module_redirect.xlf');
     }
diff --git a/typo3/sysext/redirects/Classes/Evaluation/SourceHost.php b/typo3/sysext/redirects/Classes/Evaluation/SourceHost.php
index e1fb8f8341c42ecca7a814a730d61774b13fe1df..0ece0b44f54b5bd507a94f61085d2d7e829ebc76 100644
--- a/typo3/sysext/redirects/Classes/Evaluation/SourceHost.php
+++ b/typo3/sysext/redirects/Classes/Evaluation/SourceHost.php
@@ -26,6 +26,7 @@ class SourceHost
 {
     /**
      * JavaScript code for client side validation/evaluation
+     * (invoked by FormEngine when editing redirect entities)
      *
      * @return string JavaScript code for client side validation/evaluation
      */
diff --git a/typo3/sysext/redirects/Resources/Private/Partials/Pagination.html b/typo3/sysext/redirects/Resources/Private/Partials/Pagination.html
index 1e9136411f609490daf3c8ea833966a88762090a..f7c484a845fe996c703315db8893cc13b86133d2 100644
--- a/typo3/sysext/redirects/Resources/Private/Partials/Pagination.html
+++ b/typo3/sysext/redirects/Resources/Private/Partials/Pagination.html
@@ -1,23 +1,6 @@
 <html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers"
             data-namespace-typo3-fluid="true">
 
-<script>
-    function goToPage(formObject) {
-        var formField = formObject.elements['paginator-target-page'];
-        var url = formField.dataset.url;
-        var numberOfPages = parseInt(formField.dataset.numberOfPages);
-        var page = parseInt(formField.value);
-        if (page > numberOfPages) {
-            page = numberOfPages;
-        } else if (page < 1) {
-            page = 1;
-        }
-        url = url.replace('987654322', page);
-        self.location.href = url;
-        return false;
-    }
-</script>
-
 <nav class="pagination-wrap">
     <ul class="pagination pagination-block">
         <f:if condition="{pagination.hasLessPages}">
@@ -58,7 +41,7 @@
                         <f:variable name="gotToPageUrl">
                             <f:be.uri route="site_redirects" parameters="{action: 'overview', demand: demand.parameters, page: 987654322}" />
                         </f:variable>
-                        <form onsubmit="return goToPage(this);" style="display:inline;">
+                        <form data-on-submit="processNavigate" style="display:inline;">
                             <f:form.textfield
                                 additionalAttributes="{min: 1, max: pagination.numberOfPages}"
                                 data="{number-of-pages: pagination.numberOfPages, url: gotToPageUrl}"
diff --git a/typo3/sysext/redirects/Resources/Private/Templates/Management/Overview.html b/typo3/sysext/redirects/Resources/Private/Templates/Management/Overview.html
index 7f6b557069752fb5a41df6082995acc6d14a3387..afe3cdb427dfc9c17020a1c652257f54cf8eea8c 100644
--- a/typo3/sysext/redirects/Resources/Private/Templates/Management/Overview.html
+++ b/typo3/sysext/redirects/Resources/Private/Templates/Management/Overview.html
@@ -9,7 +9,6 @@
 </f:section>
 
 <f:section name="content">
-
     <f:if condition="{redirects -> f:count()}">
         <f:then>
             <f:render section="filter" arguments="{_all}" />
@@ -160,7 +159,7 @@
 
         <div class="form-group">
             <label for="demand-source-host"><f:translate key="LLL:EXT:redirects/Resources/Private/Language/locallang_module_redirect.xlf:source_host"/></label>
-            <select id="demand-source-host" class="form-control input-sm" name="demand[source_host]" onchange="submit()">
+            <select id="demand-source-host" class="form-control input-sm" name="demand[source_host]" data-on-change="submit">
                 <option value=""><f:translate key="LLL:EXT:redirects/Resources/Private/Language/locallang_module_redirect.xlf:filter.source_host.showAll"/></option>
                 <f:for each="{hosts}" as="host">
                     <f:form.select.option value="{host.name}" selected="{host.name} === {demand.sourceHost}">{host.name}</f:form.select.option>
@@ -177,7 +176,7 @@
         </div>
         <div class="form-group">
             <label for="demand-target-status-code"><f:translate key="LLL:EXT:redirects/Resources/Private/Language/locallang_module_redirect.xlf:filter.targetStatusCode"/></label>
-            <select id="demand-target-status-code" class="form-control input-sm" name="demand[target_statuscode]" onchange="submit()">
+            <select id="demand-target-status-code" class="form-control input-sm" name="demand[target_statuscode]" data-on-change="submit">
                 <option value=""><f:translate key="LLL:EXT:redirects/Resources/Private/Language/locallang_module_redirect.xlf:filter.source_host.showAll"/></option>
                 <f:for each="{statusCodes}" as="statusCode">
                     <f:form.select.option value="{statusCode.code}" selected="{statusCode.code} === {demand.statusCode}">{statusCode.code}</f:form.select.option>
diff --git a/typo3/sysext/redirects/Resources/Public/JavaScript/RedirectsModule.js b/typo3/sysext/redirects/Resources/Public/JavaScript/RedirectsModule.js
new file mode 100644
index 0000000000000000000000000000000000000000..3aada9b73044e40ace740c4335e6784891805077
--- /dev/null
+++ b/typo3/sysext/redirects/Resources/Public/JavaScript/RedirectsModule.js
@@ -0,0 +1,13 @@
+/*
+ * This file is part of the TYPO3 CMS project.
+ *
+ * It is free software; you can redistribute it and/or modify it under
+ * the terms of the GNU General Public License, either version 2
+ * of the License, or any later version.
+ *
+ * For the full copyright and license information, please read the
+ * LICENSE.txt file that was distributed with this source code.
+ *
+ * The TYPO3 project - inspiring people to share!
+ */
+define(["require","exports","TYPO3/CMS/Core/Event/RegularEvent"],(function(e,t,n){"use strict";return new class{constructor(){const e=document.querySelector('form[data-on-submit="processNavigate"]');null!==e&&(new n("change",this.executeSubmit.bind(this)).delegateTo(document,'[data-on-change="submit"]'),new n("submit",this.processNavigate.bind(this)).bindTo(e))}executeSubmit(e,t){t instanceof HTMLSelectElement&&t.form.submit()}processNavigate(e,t){if(!(t instanceof HTMLFormElement))return;e.preventDefault();const n=t.elements.namedItem("paginator-target-page"),a=parseInt(n.dataset.numberOfPages,10);let s=n.dataset.url,r=parseInt(n.value,10);r>a?r=a:r<1&&(r=1),s=s.replace("987654322",r.toString()),self.location.href=s}}}));
\ No newline at end of file
diff --git a/typo3/sysext/scheduler/Classes/Controller/SchedulerModuleController.php b/typo3/sysext/scheduler/Classes/Controller/SchedulerModuleController.php
index 927de8e2f49be2f121a43595b18d5e803c39917d..96496dcf07132cc334aa0ccecf91f50a3197a1ae 100644
--- a/typo3/sysext/scheduler/Classes/Controller/SchedulerModuleController.php
+++ b/typo3/sysext/scheduler/Classes/Controller/SchedulerModuleController.php
@@ -1325,8 +1325,7 @@ class SchedulerModuleController
             $closeButton = $buttonBar->makeLinkButton()
                 ->setTitle($this->getLanguageService()->sL('LLL:EXT:core/Resources/Private/Language/locallang_common.xlf:cancel'))
                 ->setIcon($this->moduleTemplate->getIconFactory()->getIcon('actions-close', Icon::SIZE_SMALL))
-                ->setOnClick('document.location=' . GeneralUtility::quoteJSvalue($this->moduleUri))
-                ->setHref('#');
+                ->setHref($this->moduleUri);
             $buttonBar->addButton($closeButton, ButtonBar::BUTTON_POSITION_LEFT, 2);
             // Save, SaveAndClose, SaveAndNew
             $saveButtonDropdown = $buttonBar->makeSplitButton();
diff --git a/typo3/sysext/scheduler/Resources/Private/Templates/Backend/SchedulerModule/EditTask.html b/typo3/sysext/scheduler/Resources/Private/Templates/Backend/SchedulerModule/EditTask.html
index a65bf638ba6d75313378c119230b909051501206..0616126a82f4c5a4ffc6fdd2d8098597e707b99a 100644
--- a/typo3/sysext/scheduler/Resources/Private/Templates/Backend/SchedulerModule/EditTask.html
+++ b/typo3/sysext/scheduler/Resources/Private/Templates/Backend/SchedulerModule/EditTask.html
@@ -105,8 +105,8 @@
                     <div class="form-wizards-items-aside">
                         <div class="btn-group">
                             <select
-                                class="form-control tceforms-select tceforms-wizardselect"
-                                onchange="document.getElementById('task_frequency').value=this.options[this.selectedIndex].value;this.blur();this.selectedIndex=0;">
+                                data-update-task-frequency
+                                class="form-control tceforms-select tceforms-wizardselect">
                                 <option></option>
                                 <f:for each="{frequencyOptions}" as="label" key="command">
                                 <option value="{command}">{f:translate(key:label,default:label)} ({command})</option>
diff --git a/typo3/sysext/scheduler/Resources/Public/JavaScript/Scheduler.js b/typo3/sysext/scheduler/Resources/Public/JavaScript/Scheduler.js
index d2f3296a524169b97bc27cb6cdee7734f5045a86..a6dca43a80a08f6177d97579e1938404a027338e 100644
--- a/typo3/sysext/scheduler/Resources/Public/JavaScript/Scheduler.js
+++ b/typo3/sysext/scheduler/Resources/Public/JavaScript/Scheduler.js
@@ -10,4 +10,4 @@
  *
  * The TYPO3 project - inspiring people to share!
  */
-define(["require","exports","jquery","TYPO3/CMS/Backend/DocumentSaveActions","TYPO3/CMS/Backend/Modal","TYPO3/CMS/Backend/Utility/MessageUtility","tablesort"],(function(e,t,a,l,s,r){"use strict";class i{constructor(){this.allCheckedStatus=!1,this.actOnChangedTaskClass=e=>{let t=e.val();t=t.toLowerCase().replace(/\\/g,"-"),a(".extraFields").hide(),a(".extra_fields_"+t).show()},this.actOnChangedTaskType=e=>{this.toggleFieldsByTaskType(a(e.currentTarget).val())},this.actOnChangeSchedulerTableGarbageCollectionAllTables=e=>{let t=a("#task_tableGarbageCollection_numberOfDays"),l=a("#task_tableGarbageCollection_table");if(e.prop("checked"))l.prop("disabled",!0),t.prop("disabled",!0);else{let e=parseInt(t.val(),10);if(e<1){let t=l.val();void 0!==defaultNumberOfDays[t]&&(e=defaultNumberOfDays[t])}l.prop("disabled",!1),e>0&&t.prop("disabled",!1)}},this.actOnChangeSchedulerTableGarbageCollectionTable=e=>{let t=a("#task_tableGarbageCollection_numberOfDays");defaultNumberOfDays[e.val()]>0?(t.prop("disabled",!1),t.val(defaultNumberOfDays[e.val()])):(t.prop("disabled",!0),t.val(0))},this.checkOrUncheckAllCheckboxes=e=>(e.parents(".tx_scheduler_mod1_table").find(":checkbox").prop("checked",!this.allCheckedStatus),this.allCheckedStatus=!this.allCheckedStatus,!1),this.toggleFieldsByTaskType=e=>{e=parseInt(e+"",10),a("#task_end_col").toggle(2===e),a("#task_frequency_row").toggle(2===e)},this.toggleTaskGroups=e=>{let t=e.data("task-group-id");a("#recordlist-task-group-"+t).collapse("toggle")},this.initializeEvents=()=>{a(".checkall").on("click",e=>{this.checkOrUncheckAllCheckboxes(a(e.currentTarget))}),a("#task_class").change(e=>{this.actOnChangedTaskClass(a(e.currentTarget))}),a("#task_type").change(this.actOnChangedTaskType),a("#task_tableGarbageCollection_allTables").change(e=>{this.actOnChangeSchedulerTableGarbageCollectionAllTables(a(e.currentTarget))}),a("#task_tableGarbageCollection_table").change(e=>{this.actOnChangeSchedulerTableGarbageCollectionTable(a(e.currentTarget))});const e=document.querySelector("table.taskGroup-table");null!==e&&new Tablesort(e),a(document).on("click",".t3js-element-browser",e=>{e.preventDefault();const t=e.currentTarget;s.advanced({type:s.types.iframe,content:t.href+"&mode="+t.dataset.mode+"&bparams="+t.dataset.params,size:s.sizes.large})}),window.addEventListener("message",this.listenOnElementBrowser)},this.initializeDefaultStates=()=>{let e=a("#task_type");e.length&&this.toggleFieldsByTaskType(e.val());let t=a("#task_class");t.length&&(this.actOnChangedTaskClass(t),i.updateElementBrowserTriggers())},this.listenOnElementBrowser=e=>{if(!r.MessageUtility.verifyOrigin(e.origin))throw"Denied message sent by "+e.origin;if("typo3:elementBrowser:elementAdded"===e.data.actionName){if(void 0===e.data.fieldName)throw"fieldName not defined in message";if(void 0===e.data.value)throw"value not defined in message";const t=e.data.value.split("_");document.querySelector('input[name="'+e.data.fieldName+'"]').value=t[1]}},this.initializeEvents(),this.initializeDefaultStates(),l.getInstance().addPreSubmitCallback(()=>{let e=a("#task_class").val();e=e.toLowerCase().replace(/\\/g,"-"),a(".extraFields").appendTo(a("#extraFieldsHidden")),a(".extra_fields_"+e).appendTo(a("#extraFieldsSection"))})}static updateElementBrowserTriggers(){document.querySelectorAll(".t3js-element-browser").forEach(e=>{const t=document.getElementById(e.dataset.triggerFor);e.dataset.params=t.name+"|||pages"})}}return new i}));
\ No newline at end of file
+define(["require","exports","jquery","TYPO3/CMS/Backend/DocumentSaveActions","TYPO3/CMS/Backend/Modal","TYPO3/CMS/Backend/Utility/MessageUtility","tablesort"],(function(e,a,t,l,s,r){"use strict";class n{constructor(){this.allCheckedStatus=!1,this.actOnChangedTaskClass=e=>{let a=e.val();a=a.toLowerCase().replace(/\\/g,"-"),t(".extraFields").hide(),t(".extra_fields_"+a).show()},this.actOnChangedTaskType=e=>{this.toggleFieldsByTaskType(t(e.currentTarget).val())},this.actOnChangeSchedulerTableGarbageCollectionAllTables=e=>{let a=t("#task_tableGarbageCollection_numberOfDays"),l=t("#task_tableGarbageCollection_table");if(e.prop("checked"))l.prop("disabled",!0),a.prop("disabled",!0);else{let e=parseInt(a.val(),10);if(e<1){let a=l.val();void 0!==defaultNumberOfDays[a]&&(e=defaultNumberOfDays[a])}l.prop("disabled",!1),e>0&&a.prop("disabled",!1)}},this.actOnChangeSchedulerTableGarbageCollectionTable=e=>{let a=t("#task_tableGarbageCollection_numberOfDays");defaultNumberOfDays[e.val()]>0?(a.prop("disabled",!1),a.val(defaultNumberOfDays[e.val()])):(a.prop("disabled",!0),a.val(0))},this.checkOrUncheckAllCheckboxes=e=>(e.parents(".tx_scheduler_mod1_table").find(":checkbox").prop("checked",!this.allCheckedStatus),this.allCheckedStatus=!this.allCheckedStatus,!1),this.toggleFieldsByTaskType=e=>{e=parseInt(e+"",10),t("#task_end_col").toggle(2===e),t("#task_frequency_row").toggle(2===e)},this.toggleTaskGroups=e=>{let a=e.data("task-group-id");t("#recordlist-task-group-"+a).collapse("toggle")},this.initializeEvents=()=>{t(".checkall").on("click",e=>{this.checkOrUncheckAllCheckboxes(t(e.currentTarget))}),t("#task_class").change(e=>{this.actOnChangedTaskClass(t(e.currentTarget))}),t("#task_type").change(this.actOnChangedTaskType),t("#task_tableGarbageCollection_allTables").change(e=>{this.actOnChangeSchedulerTableGarbageCollectionAllTables(t(e.currentTarget))}),t("#task_tableGarbageCollection_table").change(e=>{this.actOnChangeSchedulerTableGarbageCollectionTable(t(e.currentTarget))}),t("[data-update-task-frequency]").change(e=>{const a=t(e.currentTarget);t("#task_frequency").val(a.val()),a.val(a.attr("value")).blur()});const e=document.querySelector("table.taskGroup-table");null!==e&&new Tablesort(e),t(document).on("click",".t3js-element-browser",e=>{e.preventDefault();const a=e.currentTarget;s.advanced({type:s.types.iframe,content:a.href+"&mode="+a.dataset.mode+"&bparams="+a.dataset.params,size:s.sizes.large})}),window.addEventListener("message",this.listenOnElementBrowser)},this.initializeDefaultStates=()=>{let e=t("#task_type");e.length&&this.toggleFieldsByTaskType(e.val());let a=t("#task_class");a.length&&(this.actOnChangedTaskClass(a),n.updateElementBrowserTriggers())},this.listenOnElementBrowser=e=>{if(!r.MessageUtility.verifyOrigin(e.origin))throw"Denied message sent by "+e.origin;if("typo3:elementBrowser:elementAdded"===e.data.actionName){if(void 0===e.data.fieldName)throw"fieldName not defined in message";if(void 0===e.data.value)throw"value not defined in message";const a=e.data.value.split("_");document.querySelector('input[name="'+e.data.fieldName+'"]').value=a[1]}},this.initializeEvents(),this.initializeDefaultStates(),l.getInstance().addPreSubmitCallback(()=>{let e=t("#task_class").val();e=e.toLowerCase().replace(/\\/g,"-"),t(".extraFields").appendTo(t("#extraFieldsHidden")),t(".extra_fields_"+e).appendTo(t("#extraFieldsSection"))})}static updateElementBrowserTriggers(){document.querySelectorAll(".t3js-element-browser").forEach(e=>{const a=document.getElementById(e.dataset.triggerFor);e.dataset.params=a.name+"|||pages"})}}return new n}));
\ No newline at end of file