diff --git a/include/errors/class_SimplePluginHookError.inc b/include/errors/class_SimplePluginHookError.inc
new file mode 100644
index 0000000000000000000000000000000000000000..5941024c0736f9cdd8e2acccc9ed360ddb4b1056
--- /dev/null
+++ b/include/errors/class_SimplePluginHookError.inc
@@ -0,0 +1,88 @@
+<?php
+/*
+  This code is part of FusionDirectory (http://www.fusiondirectory.org/)
+  Copyright (C) 2019-2020  FusionDirectory
+
+  This program 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 2 of the License, or
+  (at your option) any later version.
+
+  This program 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 this program; if not, write to the Free Software
+  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
+*/
+
+/*! \class SimplePluginHookError
+    \brief Error returned by a hook called from SimplePlugin
+*/
+class SimplePluginHookError extends SimplePluginError
+{
+  protected $hookType;
+
+  public function __construct ($origin, string $type, string $output = '', int $code = 0, Throwable $previous = NULL)
+  {
+    $this->hookType = $type;
+
+    parent::__construct($origin, htmlescape($output), $code, $previous);
+  }
+
+  public function toArray (): array
+  {
+    $array = parent::toArray();
+
+    $array['hookType']  = $this->hookType;
+    $array['hookCode']  = $this->getCode();
+
+    return $array;
+  }
+
+  public function computeMsgDialogParameters (): array
+  {
+    $html = '';
+
+    if (isset($this->object)) {
+      $html .= htmlescape($this->object->getBaseObject()->dn.' > ');
+    }
+
+    if (isset($this->tab)) {
+      $html .= htmlescape($this->tab->parent->by_name[get_class($this->tab)].' > ');
+    }
+
+    if (isset($this->attribute)) {
+      $label = $this->attribute->getLabel();
+      if (empty($label)) {
+        $html .= '<i>'.htmlescape($this->attribute->getLdapName()).'</i>';
+      } else {
+        $html .= htmlescape($label);
+      }
+    }
+
+    $html .= '<br/><br/>';
+
+    $html .= htmlescape(sprintf(_('Trigger "%s" returned an error!'), $this->hookType));
+
+    $html .= '<br/><br/>'."\n";
+    $html .= htmlescape(sprintf(_('Exit code: %d'), $this->getCode())).'<br/>'."\n";
+    if (!empty($this->htmlMessage)) {
+      $html .= 'Result: '.$this->htmlMessage."\n";
+    }
+
+    $trace = $this->getTrace();
+
+    array_unshift(
+      $trace,
+      [
+        'file' => $this->getFile(),
+        'line' => $this->getLine(),
+      ]
+    );
+
+    return [_('Error'), $html, ERROR_DIALOG, $trace];
+  }
+}
diff --git a/include/errors/class_SimplePluginLdapError.inc b/include/errors/class_SimplePluginLdapError.inc
index 001bd49ef2f63f04a0f21d4313c6843fb91f2a56..f66b040d43d13b0900c1f137284a0381448046bf 100644
--- a/include/errors/class_SimplePluginLdapError.inc
+++ b/include/errors/class_SimplePluginLdapError.inc
@@ -83,10 +83,10 @@ class SimplePluginLdapError extends SimplePluginError
     }
 
     if (!empty($this->dn)) {
-      $html .= '<br/><br/><i>'.htmlescape(_('Object')).':</i> '.htmlescape($this->dn);
+      $html .= '<br/><br/><i>'.htmlescape(_('Object:')).'</i> '.htmlescape($this->dn);
     }
 
-    $html .= '<br/><br/><i>'.htmlescape(_('Error')).':</i> '.$this->htmlMessage;
+    $html .= '<br/><br/><i>'.htmlescape(_('Error:')).'</i> '.$this->htmlMessage;
 
     $trace = $this->getTrace();
 
diff --git a/include/simpleplugin/class_simplePlugin.inc b/include/simpleplugin/class_simplePlugin.inc
index d89ac97d5df35e86512c3a7efffbb13de32cff7c..b05acf8e0e42c2a54e7e46cebe8208cab22074f8 100644
--- a/include/simpleplugin/class_simplePlugin.inc
+++ b/include/simpleplugin/class_simplePlugin.inc
@@ -1366,7 +1366,7 @@ class simplePlugin implements SimpleTab
     return [];
   }
 
-  protected function pre_save ()
+  protected function pre_save (): array
   {
     if ($this->initially_was_account) {
       return $this->handle_pre_events('modify', ['modifiedLdapAttrs' => array_keys($this->attrs)]);
@@ -1453,7 +1453,7 @@ class simplePlugin implements SimpleTab
    *
    * \param  array  $addAttrs
    */
-  protected function handle_hooks (string $when, string $mode, array $addAttrs = [])
+  protected function handle_hooks (string $when, string $mode, array $addAttrs = []): array
   {
     switch ($mode) {
       case 'add':
@@ -1467,6 +1467,7 @@ class simplePlugin implements SimpleTab
 
       default:
         trigger_error(sprintf('Invalid %s event type given: "%s"! Valid types are: add, modify, remove.', strtolower($when), $mode));
+        return [];
         break;
     }
   }
@@ -1489,7 +1490,7 @@ class simplePlugin implements SimpleTab
    *  \brief Forward command execution requests
    *         to the pre hook execution method.
    */
-  function handle_pre_events (string $mode, array $addAttrs = [])
+  function handle_pre_events (string $mode, array $addAttrs = []): array
   {
     global $config;
 
@@ -1565,13 +1566,12 @@ class simplePlugin implements SimpleTab
         $str = implode("\n", $arr);
         logging::debug(DEBUG_SHELL, __LINE__, __FUNCTION__, __FILE__, $command, 'Execution failed code: '.$returnCode);
         logging::debug(DEBUG_SHELL, __LINE__, __FUNCTION__, __FILE__, $command, 'Output: '.$str);
-        $message = msgPool::cmdexecfailed($cmd, '', get_class($this));
-        $message .= '<br/><br/>'."\n";
-        $message .= 'Exit code: '.$returnCode.'<br/>'."\n";
-        if (!empty($str)) {
-          $message .= 'Result: '.$str."\n";
-        }
-        $messages[] = $message;
+        $messages[] = new SimplePluginHookError(
+          $this,
+          $cmd,
+          $str,
+          $returnCode
+        );
       } elseif (is_array($arr)) {
         $str = implode("\n", $arr);
         logging::debug(DEBUG_SHELL, __LINE__, __FUNCTION__, __FILE__, $command, 'Output: '.$str);