diff --git a/classes/local/table/process_errors_table.php b/classes/local/table/process_errors_table.php
index d7d0f9765c013363480d9f8ad26e20e9391bf004..545a883dc689e77a9c43fa2aabb98ca6351a83ef 100644
--- a/classes/local/table/process_errors_table.php
+++ b/classes/local/table/process_errors_table.php
@@ -95,9 +95,9 @@ class process_errors_table extends \table_sql {
     public function col_error($row) {
         return "<details><summary>" .
                 nl2br(htmlentities($row->errormessage)) .
-                "</summary>" .
+                "</summary><code>" .
                 nl2br(htmlentities($row->errortrace)) .
-                "</details>";
+                "</code></details>";
     }
 
     /**
@@ -165,6 +165,27 @@ class process_errors_table extends \table_sql {
         return '';
     }
 
+    /**
+     * Show custom nothing to display message.
+     * @return void
+     */
+    public function print_nothing_to_display() {
+        global $OUTPUT;
+
+        // Render the dynamic table header.
+        echo $this->get_dynamic_table_html_start();
+
+        // Render button to allow user to reset table preferences.
+        echo $this->render_reset_button();
+
+        $this->print_initials_bar();
+
+        echo $OUTPUT->heading(get_string('noprocesserrors', 'tool_lifecycle'));
+
+        // Render the dynamic table footer.
+        echo $this->get_dynamic_table_html_end();
+    }
+
     /**
      * Hook that can be overridden in child classes to wrap a table in a form
      * for example. Called only when there is data to display and not
diff --git a/classes/task/lifecycle_error_notify_task.php b/classes/task/lifecycle_error_notify_task.php
new file mode 100644
index 0000000000000000000000000000000000000000..7c15fa866f42e296f45d657f4813e29730f8b227
--- /dev/null
+++ b/classes/task/lifecycle_error_notify_task.php
@@ -0,0 +1,69 @@
+<?php
+// This file is part of Moodle - http://moodle.org/
+//
+// Moodle is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// Moodle is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
+
+/**
+ * Scheduled task for notify admin upon process errors
+ *
+ * @package tool_lifecycle
+ * @copyright  2022 Justus Dieckmann WWU
+ * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+namespace tool_lifecycle\task;
+
+defined('MOODLE_INTERNAL') || die;
+
+/**
+ * Scheduled task for notify admin upon process errors
+ *
+ * @package tool_lifecycle
+ * @copyright  2022 Justus Dieckmann WWU
+ * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+class lifecycle_error_notify_task extends \core\task\scheduled_task {
+
+    /**
+     * Get a descriptive name for this task (shown to admins).
+     *
+     * @return string
+     * @throws \coding_exception
+     */
+    public function get_name() {
+        return get_string('lifecycle_error_notify_task', 'tool_lifecycle');
+    }
+
+    /**
+     * Do the job.
+     */
+    public function execute() {
+        global $DB, $CFG;
+
+        $errorcount = $DB->count_records('tool_lifecycle_proc_error');
+
+        if (!$errorcount) {
+            return;
+        }
+
+        $obj = new \stdClass();
+        $obj->amount = $errorcount;
+        $obj->url = $CFG->wwwroot . '/admin/tool/lifecycle/errors.php';
+
+        email_to_user(get_admin(), \core_user::get_noreply_user(),
+            get_string('notifyerrorsemailsubject', 'tool_lifecycle', $obj),
+            get_string('notifyerrorsemailcontent', 'tool_lifecycle', $obj),
+            get_string('notifyerrorsemailcontenthtml', 'tool_lifecycle', $obj),
+        );
+    }
+}
diff --git a/db/tasks.php b/db/tasks.php
index f708e82cbe5ce7aa4347e05f7cec5acf579a3842..d061305a9538a25298d8ca90ba16e938ed48324f 100644
--- a/db/tasks.php
+++ b/db/tasks.php
@@ -44,5 +44,14 @@ $tasks = array(
         'day' => '*',
         'month' => '*',
         'dayofweek' => '0',
-    )
+    ),
+    array(
+        'classname' => 'tool_lifecycle\task\lifecycle_error_notify_task',
+        'blocking' => 0,
+        'minute' => 'R',
+        'hour' => '5',
+        'day' => '*',
+        'month' => '*',
+        'dayofweek' => '0',
+    ),
 );
diff --git a/errors.php b/errors.php
index 3f8032c1356721150a3bd622af6a8d692bbc522f..40c80bccf471728ec59bca390772f38eb9a26469 100644
--- a/errors.php
+++ b/errors.php
@@ -50,6 +50,8 @@ if ($action) {
         foreach ($ids as $id) {
             process_manager::rollback_process_after_error($id);
         }
+    } else {
+        throw new coding_exception("action must be either 'proceed' or 'rollback'");
     }
     redirect($PAGE->url);
 }
diff --git a/lang/de/tool_lifecycle.php b/lang/de/tool_lifecycle.php
index 6409cc02877d8c3e55d17a1b40a0985858768558..17706b0949a933cee59195a487d53f2f62ae3fe3 100644
--- a/lang/de/tool_lifecycle.php
+++ b/lang/de/tool_lifecycle.php
@@ -177,5 +177,12 @@ $string['process_proceeded_event'] = 'Ein Prozess wurde fortgeführt';
 $string['process_rollback_event'] = 'Ein Prozess wurde zurückgesetzt';
 
 $string['courseid'] = 'Kurs-ID';
-$string['process_errors_header'] = 'Prozessfehler';
+$string['process_errors_header'] = 'Fehlermanagement';
+$string['proceed'] = 'Fortfahren';
 $string['forselected'] = 'Für alle ausgewählten Prozesse';
+$string['noprocesserrors'] = 'Es gibt keine fehlerhaften Prozesse, die behandelt werden müssen!';
+
+$string['lifecycle_error_notify_task'] = 'Benachrichtigt die Administratoren bei Fehlern in tool_lifecycle-Prozessen.';
+$string['notifyerrorsemailsubject'] = '{$a->amount} fehlerhafte tool_lifecycle Prozesse warten darauf, behandelt zu werden!';
+$string['notifyerrorsemailcontent'] = '{$a->amount} fehlerhafte tool_lifecycle Prozesse warten darauf, behandelt zu werden!' . "\n" . 'Bitte besuchen Sie {$a->url}.';
+$string['notifyerrorsemailcontenthtml'] = '{$a->amount} fehlerhafte tool_lifecycle Prozesse warten darauf, behandelt zu werden!<br>Bitte besuchen Sie <a href="{$a->url}">die Übersichtsseite</a>.';
diff --git a/lang/en/tool_lifecycle.php b/lang/en/tool_lifecycle.php
index 25aba077bd8646f1eeb41ba77b8057484d137864..b1149de50b89545ab15289a2480f7eda6b809548 100644
--- a/lang/en/tool_lifecycle.php
+++ b/lang/en/tool_lifecycle.php
@@ -212,7 +212,13 @@ $string['delays_for_workflow'] = 'Delays for "{$a}"';
 $string['delete_all_delays'] = 'Delete all delays';
 
 $string['courseid'] = 'Course ID';
-$string['process_errors_header'] = 'Process errors';
+$string['process_errors_header'] = 'Error handling';
 $string['proceed'] = 'Proceed';
 $string['rollback'] = 'Rollback';
 $string['forselected'] = 'For all selected processes';
+$string['noprocesserrors'] = 'There are no process errors to handle!';
+
+$string['lifecycle_error_notify_task'] = 'Notify the admin upon errors in tool_lifecycle processes';
+$string['notifyerrorsemailsubject'] = 'There are {$a->amount} tool_lifecycle process errors waiting to be fixed!';
+$string['notifyerrorsemailcontent'] = 'There are {$a->amount} tool_lifecycle process errors waiting to be fixed!' . "\n" . 'Please review them at {$a->url}.';
+$string['notifyerrorsemailcontenthtml'] = 'There are {$a->amount} tool_lifecycle process errors waiting to be fixed!<br>Please review them at the <a href="{$a->url}">error handling overview</a>.';