diff --git a/docs/custom-texts.md b/docs/custom-texts.md
index 2d289d1b6675944aea1eaf5738ef2dbe8c9f72f6..6b0b0af71ca7fe5d661cf379b1c2f856b1fde0b8 100644
--- a/docs/custom-texts.md
+++ b/docs/custom-texts.md
@@ -58,37 +58,36 @@ replacements:
 </Config>
 ```
 
+
+
 ### List of possible replacements
 | Key       | Used for     | Default     |
 | :------------- | :---------- | :----------- |
-|`app_title`|Titel der Hauptanwendung|IQB-Testcenter|
 |`app_intro1`|Begrüßungstext auf der Startseite (Text nach IQB-Link)|betreibt auf diesen Seiten eine Anwendung für das computerbasierte Leistungstesten von Schülerinnen und Schülern. Der Zugang zu einem Test ist nur möglich, wenn Sie von Testverantwortlichen Zugangsdaten erhalten haben. Es sind keine weiteren Seiten öffentlich verfügbar.|
-|`login_testRunningText`|Kurznachricht, dass ein Test (Booklet) gestartet ist|Ein Testheft ist gestartet|
-|`login_testRunningTextAndClick`|Nachricht, dass ein Test (Booklet) gestartet ist, mit Aufforderung zum Klicken|Es wird gerade ein Test ausgeführt. Bitte durch Klicken auf eine der beiden Schaltflächen links wählen, ob der Test fortgesetzt oder beendet werden soll!|
-|`login_testEndButtonLabel`|Schalterbeschriftung für 'Test beenden'|Test beenden|
-|`booklet_warningLeaveTimerBlockTextPrompt`|Schalterbeschriftung für 'Zurück zum Test'|Du verlässt einen zeitbeschränkten Bereich und kannst nicht zurückkehren. Trotzdem weiterblättern?|
-|`login_testReturnButtonLabel`|Schalterbeschriftung für 'Zurück zum Test'|Zum Test zurückkehren|
-|`login_bookletSelectPromptNull`|Nachricht für den Fall, dass Booklet(s) beendet wurden und keine weiteren zur Verfügung stehen|Beendet. Es können keine weiteren Testhefte gestartet werden.|
-|`login_bookletSelectPromptOne`|Aufforderung, den einen gefundenen Test anzuklicken (auf Schalter klicken)|Bitte klicke auf die Schaltfläche auf der linken Seite, um den Test zu starten!|
-|`login_bookletSelectPromptMany`|Aufforderung, aus der Liste der gefundenen Tests einen auszusuchen (auf Schalter klicken)|Bitte klicke auf eine der Schaltflächen auf der linken Seite, um einen Test zu starten!|
-|`login_codeInputPrompt`|Aufforderung, Code einzugeben (bei einem zweistufigen Login-Prozess)|Bitte Log-in eingeben, der auf dem Zettel steht!|
-|`login_codeInputTitle`|Titel des Eingabeformulares für den Code|Log-in eingeben|
-|`booklet_msgPresentationNotCompleteTitleNext`|Titel der Nachricht (Dialogbox), dass nicht weitergeblättert werden kann, solange die Präsentation des Aufgabeninhaltes nicht abgeschlossen ist|Weiterblättern nicht möglich!|
+|`app_title`|Titel der Hauptanwendung|IQB-Testcenter|
+|`booklet_codeToEnterPrompt`|Aufforderung für die Eingabe eines Freigabewortes (Dialog-Box)|Bitte gib das Freigabewort ein, das angesagt wurde!|
+|`booklet_codeToEnterTitle`|Titel der Dialogbox für die Eingabe eines Freigabewortes|Freigabewort|
+|`booklet_errormessage`|Nachricht an die Testperson, wenn ein schwerer Fehler aufgetreten ist|Es ist ein schwerer Fehler aufgetreten. Bitte rufe die Aufsichtsperson und beschreibe das Problem!|
 |`booklet_msgPresentationNotCompleteTextNext`|Nachrichttext, dass nicht weitergeblättert werden kann, solange die Präsentation des Aufgabeninhaltes nicht abgeschlossen ist|Du kannst erst weiterblättern, wenn Audio-Dateien vollständig abgespielt wurden und wenn du in allen Fenstern bis ganz nach unten gescrollt hast.|
-|`booklet_msgPresentationNotCompleteTitlePrev`|Titel der Nachricht (Dialogbox), dass nicht zurückgeblättert werden kann, solange die Präsentation des Aufgabeninhaltes nicht abgeschlossen ist|Zurückblättern - Warnung|
 |`booklet_msgPresentationNotCompleteTextPrev`|Nachrichttext, dass nicht zurückgeblättert werden kann, solange die Präsentation des Aufgabeninhaltes nicht abgeschlossen ist|Eine Audio-Datei ist noch nicht bis zu Ende abgespielt oder Seiten wurden noch nicht vollständig gezeigt. Wenn du jetzt zurückblätterst, kannst Du später Audio-Dateien nicht nocheinmal starten.|
-|`booklet_codeToEnterTitle`|Titel der Dialogbox für die Eingabe eines Freigabewortes|Freigabewort|
-|`booklet_codeToEnterPrompt`|Aufforderung für die Eingabe eines Freigabewortes (Dialog-Box)|Bitte gib das Freigabewort ein, das angesagt wurde!|
-|`booklet_msgSoonTimeOver5Minutes`|Nachricht, dass für die Bearbeitung eines Abschnittes noch 5 min Zeit sind|Du hast noch 5 Minuten Zeit für die Bearbeitung der Aufgaben in diesem Abschnitt.|
+|`booklet_msgPresentationNotCompleteTitleNext`|Titel der Nachricht (Dialogbox), dass nicht weitergeblättert werden kann, solange die Präsentation des Aufgabeninhaltes nicht abgeschlossen ist|Weiterblättern nicht möglich!|
+|`booklet_msgPresentationNotCompleteTitlePrev`|Titel der Nachricht (Dialogbox), dass nicht zurückgeblättert werden kann, solange die Präsentation des Aufgabeninhaltes nicht abgeschlossen ist|Zurückblättern - Warnung|
 |`booklet_msgSoonTimeOver1Minute`|Nachricht, dass für die Bearbeitung eines Abschnittes noch 1 min Zeit ist|Du hast noch 1 Minute Zeit für die Bearbeitung der Aufgaben in diesem Abschnitt.|
-|`booklet_msgTimerStarted`|Nachricht, dass der Timer für die Bearbeitung eines Abschnittes gestartet wurde|Die Bearbeitungszeit für diesen Abschnitt hat begonnen: |
-|`booklet_msgTimerCancelled`|Nachricht, dass die Bearbeitung eines Abschnittes mit Timer abgebrochen wurde|Die Bearbeitung des Abschnittes wurde abgebrochen.|
+|`booklet_msgSoonTimeOver5Minutes`|Nachricht, dass für die Bearbeitung eines Abschnittes noch 5 min Zeit sind|Du hast noch 5 Minuten Zeit für die Bearbeitung der Aufgaben in diesem Abschnitt.|
 |`booklet_msgTimeOver`|Nachricht, dass die Bearbeitungszeit für einen Abschnitt abgelaufen ist.|Die Bearbeitung des Abschnittes ist beendet.|
-|`booklet_warningLeaveTimerBlockTitle`|Titel für Warnung (Dialogbox) vor dem vorzeitigen Verlassen eines Abschnittes mit Timer|Aufgabenabschnitt verlassen?|
-|`booklet_warningLeaveTimerBlockPrompt`|Warnung vor dem vorzeitigen Verlassen eines Abschnittes mit Timer|Wenn du jetzt weiterblätterst, beendest du vorzeitig die Bearbeitung dieses Aufgabenabschnitts und du kannst nicht mehr zurück.|
+|`booklet_msgTimerCancelled`|Nachricht, dass die Bearbeitung eines Abschnittes mit Timer abgebrochen wurde|Die Bearbeitung des Abschnittes wurde abgebrochen.|
+|`booklet_msgTimerStarted`|Nachricht, dass der Timer für die Bearbeitung eines Abschnittes gestartet wurde|Die Bearbeitungszeit für diesen Abschnitt hat begonnen: |
+|`booklet_pausedmessage`|Nachricht an die Testperson, wenn der Test vom System unterbrochen wurde|Der Test wurde kurz angehalten.|
 |`booklet_tasklisttitle`|Titel für die Auflistung der Aufgaben (Schalter)|Aufgaben|
-|`booklet_warningLeaveTestTitle`|Titel für Warnung (Dialogbox) vor dem vorzeitigen Verlassen des Tests|Test verlassen?|
-|`booklet_warningLeaveTestPrompt`|Warnung vor dem vorzeitigen Verlassen des Tests|Der Test ist noch nicht beendet. Möchtest Du den Test trotzdem verlassen?|
+|`booklet_warningLeaveTimerBlockTextPrompt`|Schalterbeschriftung für 'Zurück zum Test'|Du verlässt einen zeitbeschränkten Bereich und kannst nicht zurückkehren. Trotzdem weiterblättern?|
+|`booklet_warningLeaveTimerBlockTitle`|Titel für Warnung (Dialogbox) vor dem vorzeitigen Verlassen eines Abschnittes mit Timer|Aufgabenabschnitt verlassen?|
+|`login_bookletSelectPromptMany`|Aufforderung, aus der Liste der gefundenen Tests einen auszusuchen (auf Schalter klicken)|Bitte klicke auf eine der Schaltflächen auf der linken Seite, um einen Test zu starten!|
+|`login_bookletSelectPromptNull`|Nachricht für den Fall, dass Booklet(s) beendet wurden und keine weiteren zur Verfügung stehen|Beendet. Es können keine weiteren Testhefte gestartet werden.|
+|`login_bookletSelectPromptOne`|Aufforderung, den einen gefundenen Test anzuklicken (auf Schalter klicken)|Bitte klicke auf die Schaltfläche auf der linken Seite, um den Test zu starten!|
+|`login_codeInputPrompt`|Aufforderung, Code einzugeben (bei einem zweistufigen Login-Prozess)|Bitte Log-in eingeben, der auf dem Zettel steht!|
+|`login_codeInputTitle`|Titel des Eingabeformulares für den Code|Log-in eingeben|
+|`login_testEndButtonLabel`|Schalterbeschriftung für 'Test beenden'|Test beenden|
+|`syscheck_intro`|Text auf der ersten Seite des System-Checks|Dieser Systemcheck soll gewährleisten, dass der von Ihnen verwendete Computer für eine bestimmte Befragung oder Testung geeignet ist.|
+|`syscheck_questionsRequiredMessage`|Nachricht an die Testperson, wenn einige Fragen, die als 'required' markiert sind, nicht beantwortet wurden|Bitte prüfen Sie die Eingaben (unvollständig):|
 |`syscheck_questionsintro`|Aufforderung, die Fragen (Questionnaire) zu beantworten|Bitte bearbeiten Sie die nachfolgenden Fragen.|
-|`booklet_errormessage`|Nachricht an die Testperson, wenn ein schwerer Fehler aufgetreten ist|Es ist ein schwerer Fehler aufgetreten. Bitte rufe die Aufsichtsperson und beschreibe das Problem!|
-|`booklet_pausedmessage`|Nachricht an die Testperson, wenn der Test vom System unterbrochen wurde|Der Test wurde kurz angehalten.|
+|`syscheck_unitPrompt`|Titelzeile über der Aufgabe|Bitte prüfen Sie die folgenden Aufgaben-Elemente|
diff --git a/src/app/config/custom-texts.json b/src/app/config/custom-texts.json
index bb523bab2b802e92dc1302bf076e3622ae1a6734..430e7823ee11a6a8cc5cfa44c374e990542dfd99 100644
--- a/src/app/config/custom-texts.json
+++ b/src/app/config/custom-texts.json
@@ -7,14 +7,6 @@
     "label": "Begrüßungstext auf der Startseite (Text nach IQB-Link)",
     "defaultvalue": "betreibt auf diesen Seiten eine Anwendung für das computerbasierte Leistungstesten von Schülerinnen und Schülern. Der Zugang zu einem Test ist nur möglich, wenn Sie von Testverantwortlichen Zugangsdaten erhalten haben. Es sind keine weiteren Seiten öffentlich verfügbar."
   },
-  "login_testRunningText": {
-    "label": "Kurznachricht, dass ein Test (Booklet) gestartet ist",
-    "defaultvalue": "Ein Testheft ist gestartet"
-  },
-  "login_testRunningTextAndClick": {
-    "label": "Nachricht, dass ein Test (Booklet) gestartet ist, mit Aufforderung zum Klicken",
-    "defaultvalue": "Es wird gerade ein Test ausgeführt. Bitte durch Klicken auf eine der beiden Schaltflächen links wählen, ob der Test fortgesetzt oder beendet werden soll!"
-  },
   "login_testEndButtonLabel": {
     "label": "Schalterbeschriftung für 'Test beenden'",
     "defaultvalue": "Test beenden"
@@ -23,10 +15,6 @@
     "label": "Schalterbeschriftung für 'Zurück zum Test'",
     "defaultvalue": "Du verlässt einen zeitbeschränkten Bereich und kannst nicht zurückkehren. Trotzdem weiterblättern?"
   },
-  "login_testReturnButtonLabel": {
-    "label": "Schalterbeschriftung für 'Zurück zum Test'",
-    "defaultvalue": "Zum Test zurückkehren"
-  },
   "login_bookletSelectPromptNull": {
     "label": "Nachricht für den Fall, dass Booklet(s) beendet wurden und keine weiteren zur Verfügung stehen",
     "defaultvalue": "Beendet. Es können keine weiteren Testhefte gestartet werden."
@@ -95,22 +83,10 @@
     "label": "Titel für Warnung (Dialogbox) vor dem vorzeitigen Verlassen eines Abschnittes mit Timer",
     "defaultvalue": "Aufgabenabschnitt verlassen?"
   },
-  "booklet_warningLeaveTimerBlockPrompt": {
-    "label": "Warnung vor dem vorzeitigen Verlassen eines Abschnittes mit Timer",
-    "defaultvalue": "Wenn du jetzt weiterblätterst, beendest du vorzeitig die Bearbeitung dieses Aufgabenabschnitts und du kannst nicht mehr zurück."
-  },
   "booklet_tasklisttitle": {
     "label": "Titel für die Auflistung der Aufgaben (Schalter)",
     "defaultvalue": "Aufgaben"
   },
-  "booklet_warningLeaveTestTitle": {
-    "label": "Titel für Warnung (Dialogbox) vor dem vorzeitigen Verlassen des Tests",
-    "defaultvalue": "Test verlassen?"
-  },
-  "booklet_warningLeaveTestPrompt": {
-    "label": "Warnung vor dem vorzeitigen Verlassen des Tests",
-    "defaultvalue": "Der Test ist noch nicht beendet. Möchtest Du den Test trotzdem verlassen?"
-  },
   "syscheck_questionsintro": {
     "label": "Aufforderung, die Fragen (Questionnaire) zu beantworten",
     "defaultvalue": "Bitte bearbeiten Sie die nachfolgenden Fragen."
@@ -122,5 +98,17 @@
   "booklet_pausedmessage": {
     "label": "Nachricht an die Testperson, wenn der Test vom System unterbrochen wurde",
     "defaultvalue": "Der Test wurde kurz angehalten."
+  },
+  "syscheck_questionsRequiredMessage": {
+    "label": "Nachricht an die Testperson, wenn einige Fragen, die als 'required' markiert sind, nicht beantwortet wurden",
+    "defaultvalue": "Bitte prüfen Sie die Eingaben (unvollständig):"
+  },
+  "syscheck_unitPrompt": {
+    "label": "Titelzeile über der Aufgabe",
+    "defaultvalue": "Bitte prüfen Sie die folgenden Aufgaben-Elemente"
+  },
+  "syscheck_intro": {
+    "label": "Text auf der ersten Seite des System-Checks",
+    "defaultvalue": "Dieser Systemcheck soll gewährleisten, dass der von Ihnen verwendete Computer für eine bestimmte Befragung oder Testung geeignet ist."
   }
 }
diff --git a/src/app/sys-check/report/report.component.html b/src/app/sys-check/report/report.component.html
index b08a381718a0d7bd9e12c13398695a152c9fd28e..33dd28926e3d35ba2b8817f15de532fd2ad52ad0 100644
--- a/src/app/sys-check/report/report.component.html
+++ b/src/app/sys-check/report/report.component.html
@@ -6,7 +6,7 @@
       </mat-card-header>
 
       <mat-card-content>
-        <p *ngIf="questionnaireDataWarnings.length > 0" style="color: goldenrod; font-weight: bold">Bitte prüfen Sie die Eingaben (unvollständig):</p>
+        <p *ngIf="questionnaireDataWarnings.length > 0" style="color: goldenrod; font-weight: bold">{{'Bitte prüfen Sie die Eingaben (unvollständig):'| customtext:'syscheck_questionsRequiredMessage':cts.updateCount}}</p>
         <ul>
             <li *ngFor="let qd of questionnaireDataWarnings">
               {{qd.label}}
@@ -32,14 +32,9 @@
         </ul>
       </mat-card-content>
 
-      <label *ngIf="csvReport">Export als CSV für Copy&Paste
-        <textarea style="width:100%; height: 8em">{{csvReport}}</textarea>
-      </label>
-
       <mat-card-actions>
         <button mat-raised-button color="primary" [disabled]="saved" (click)="saveReport()" class="save_button">Bericht senden</button>
-        <button mat-raised-button [routerLink]="['/r/check-starter']" class="save_button">{{saved ? 'Zurück' : 'Abbrechen'}}</button>
-      <!--    <button *ngIf="isReady()" mat-raised-button (click)="exportReport()" class="save_button">Als CSV zum kopieren</button>-->
+        <button mat-raised-button [routerLink]="['/r/check-starter']" class="save_button">{{saved ? 'Zurück' : 'System-Check Abbrechen'}}</button>
       </mat-card-actions>
     </mat-card>
   </div>
diff --git a/src/app/sys-check/report/report.component.ts b/src/app/sys-check/report/report.component.ts
index 946d2774602112792d154049643d2d37eea12d5f..259d73da601a76f57b0fc94ec05b665f8d3dd3d7 100644
--- a/src/app/sys-check/report/report.component.ts
+++ b/src/app/sys-check/report/report.component.ts
@@ -5,6 +5,7 @@ import { SaveReportComponent } from './save-report/save-report.component';
 import { ReportEntry } from '../sys-check.interfaces';
 import {MatDialog} from '@angular/material/dialog';
 import {MatSnackBar} from '@angular/material/snack-bar';
+import {CustomtextService} from "iqb-components";
 
 @Component({
   templateUrl: './report.component.html',
@@ -18,6 +19,7 @@ export class ReportComponent implements OnInit {
   constructor(
     private bs: BackendService,
     public ds: SysCheckDataService,
+    public cts: CustomtextService,
     private saveDialog: MatDialog,
     private snackBar: MatSnackBar
   ) {
diff --git a/src/app/sys-check/unit-check/unit-check.component.html b/src/app/sys-check/unit-check/unit-check.component.html
index a80b903ef143ef2b300fb82049748510d194e462..d8e987f66d21b3bdb3742d60c14a6c5eaabd6145 100644
--- a/src/app/sys-check/unit-check/unit-check.component.html
+++ b/src/app/sys-check/unit-check/unit-check.component.html
@@ -1,6 +1,6 @@
 <div class="unit-check-body" fxLayout="row" fxLayoutAlign="start stretch">
   <div id="unit-title" fxLayout="column" fxLayoutAlign="center center">
-    <p>Bitte prüfen Sie die folgenden Aufgaben-Elemente</p>
+    <p>{{'Bitte prüfen Sie die folgenden Aufgaben-Elemente'| customtext:'syscheck_unitPrompt':cts.updateCount}}</p>
   </div>
 
   <div id="iFrameHost">
diff --git a/src/app/sys-check/unit-check/unit-check.component.ts b/src/app/sys-check/unit-check/unit-check.component.ts
index 2775e2bacfe16eac563c423c5e1cc955625cd841..9a6c6d69de1f2c3ac3aa8ae1c2fd3e00a52498ee 100644
--- a/src/app/sys-check/unit-check/unit-check.component.ts
+++ b/src/app/sys-check/unit-check/unit-check.component.ts
@@ -4,6 +4,7 @@ import { SysCheckDataService } from '../sys-check-data.service';
 import {Component, OnInit, HostListener} from '@angular/core';
 import { OnDestroy } from '@angular/core';
 import { Subscription} from 'rxjs';
+import {CustomtextService} from "iqb-components";
 
 declare var srcDoc: any;
 
@@ -25,6 +26,7 @@ export class UnitCheckComponent implements OnInit, OnDestroy {
   constructor(
     private ds: SysCheckDataService,
     private bs: BackendService,
+    public cts: CustomtextService,
     private mds: MainDataService
   ) {
   }
diff --git a/src/app/sys-check/welcome/welcome.component.html b/src/app/sys-check/welcome/welcome.component.html
index 1288387837439e50ee71aaf9c1c2a3d4ff644521..754b2f5dfec966d6d7fc0d4f90ba87cb6bdf679d 100644
--- a/src/app/sys-check/welcome/welcome.component.html
+++ b/src/app/sys-check/welcome/welcome.component.html
@@ -4,9 +4,7 @@
     <mat-card fxFlex="0 0 400px">
       <mat-card-title>{{ ds.loadConfigComplete ? ds.checkConfig?.label : 'Bitte warten' }}</mat-card-title>
       <mat-card-content *ngIf="ds.loadConfigComplete">
-        <p>
-          Dieser Systemcheck soll gewährleisten, dass der von Ihnen verwendete Computer für eine bestimmte
-          Befragung oder Testung geeignet ist.
+        <p>{{'Dieser Systemcheck soll gewährleisten, dass der von Ihnen verwendete Computer für eine bestimmte Befragung oder Testung geeignet ist.'| customtext:'syscheck_intro':cts.updateCount}}
         </p>
         <h3>Schritte</h3>
         <ol>
diff --git a/src/app/sys-check/welcome/welcome.component.ts b/src/app/sys-check/welcome/welcome.component.ts
index 2bbb6b536bd53940586d02a4300851c5722e233e..d5fa81606c14ceed0a7e3838863ea181134fc686 100644
--- a/src/app/sys-check/welcome/welcome.component.ts
+++ b/src/app/sys-check/welcome/welcome.component.ts
@@ -1,6 +1,7 @@
 import { Component, OnInit } from '@angular/core';
 import { SysCheckDataService } from '../sys-check-data.service';
 import { ReportEntry } from '../sys-check.interfaces';
+import {CustomtextService} from "iqb-components";
 
 @Component({
   styleUrls: ['../sys-check.component.css'],
@@ -26,6 +27,7 @@ export class WelcomeComponent implements OnInit {
   };
 
   constructor(
+    public cts: CustomtextService,
     public ds: SysCheckDataService
   ) { }
 
diff --git a/src/scripts/findCustomTexts.js b/src/scripts/findCustomTexts.js
index b6010f862b93c4e50f964ca65e8a2ceb2d8cc52b..8181497473c4dde5b034aa783b2a1705bdeff011 100644
--- a/src/scripts/findCustomTexts.js
+++ b/src/scripts/findCustomTexts.js
@@ -75,7 +75,7 @@ for (const f of foundSourceFiles) {
 
 console.log();
 console.log('\x1b[33m%s\x1b[0m', 'not used:');
-for (const k of Object.keys(defaults)) {
+for (const k of Object.keys(defaults).sort()) {
   if (!foundKeys[k]) {
     console.log(`  ${k}`);
   }
@@ -85,7 +85,7 @@ if (!foundError) {
   console.log('');
   console.log('writing markdown');
   let mdContent = fs.readFileSync(mdSourceFilename, 'utf8').toString();
-  for (const k of Object.keys(defaults)) {
+  for (const k of Object.keys(defaults).sort()) {
     mdContent += '|`' + k + '`|' + defaults[k].label + '|' + defaults[k].defaultvalue + '|' + '\n';
   }
   fs.writeFileSync(mdTargetFilename, mdContent, "utf8");