diff --git a/devel.admin.inc b/devel.admin.inc
index 1b1c451..0aef8c8 100644
--- a/devel.admin.inc
+++ b/devel.admin.inc
@@ -105,15 +105,29 @@ function devel_admin_settings() {
     '#default_value' => variable_get('devel_page_alter', FALSE),
     '#description' => t('Display $page array from <a href="http://api.drupal.org/api/function/hook_page_alter/7">hook_page_alter()</a> in the messages area of each page.'),
   );
-  $form['devel_error_handler'] = array('#type' => 'radios',
-    '#title' => t('Error handler'),
-    '#default_value' => variable_get('devel_error_handler', DEVEL_ERROR_HANDLER_STANDARD),
-    '#options' => array(DEVEL_ERROR_HANDLER_NONE => t('None'), DEVEL_ERROR_HANDLER_STANDARD => t('Standard Drupal')),
-    '#description' => t('Choose an error handler for your site. <em>Backtrace</em> prints nice debug information when an error is noticed, and you <a href="@choose">choose to show errors on screen</a>. <strong>Backtrace requires the <a href="@krumo">krumo library</a></strong>. <em>None</em> is a good option when stepping through the site in your debugger.', array('@krumo' => url('http://krumo.sourceforge.net'), '@choose' => url('admin/config/development/logging'))),
-  );
-  if (has_krumo()) {
-    $form['devel_error_handler']['#options'][DEVEL_ERROR_HANDLER_BACKTRACE] = t('Backtrace');
-    $form['devel_error_handler']['#options'][DEVEL_ERROR_HANDLER_BACKTRACE_AND_MESSAGE] = t('Backtrace plus standard Drupal');
+
+  $error_handlers = devel_get_handlers();
+  $form['devel_error_handlers'] = array(
+    '#type' => 'select',
+    '#title' => t('Error handlers'),
+    '#options' => array(
+      DEVEL_ERROR_HANDLER_NONE => t('None'),
+      DEVEL_ERROR_HANDLER_STANDARD => t('Standard Drupal'),
+      DEVEL_ERROR_HANDLER_BACKTRACE_DPM => t('Krumo backtrace in the message area'),
+      DEVEL_ERROR_HANDLER_BACKTRACE_KRUMO => t('Krumo backtrace above the rendered page'),
+    ),
+    '#multiple' => TRUE,
+    '#default_value' => empty($error_handlers) ? DEVEL_ERROR_HANDLER_NONE : $error_handlers,
+    '#description' => t('Select the error handler(s) to use, in case you <a href="@choose">choose to show errors on screen</a>.', array('@choose' => url('admin/config/development/logging'))) . '<ul>' .
+                      '<li>' . t('<em>None</em> is a good option when stepping through the site in your debugger.') . '</li>' .
+                      '<li>' . t('<em>Standard Drupal</em> does not display all the information that is often needed to resolve an issue.') . '</li>' .
+                      '<li>' . t('<em>Krumo backtrace</em> displays nice debug information when any type of error is noticed, but only to users with the %perm permission.', array('%perm' => t('Access developer information'))) . '</li></ul>' .
+                      t('Depending on the situation, the theme, the size of the call stack and the arguments, etc., some handlers may not display their messages, or display them on the subsequent page. Select <em>Standard Drupal</em> <strong>and</strong> <em>Krumo backtrace above the rendered page</em> to maximize your chances of not missing any messages.') . '<br />' .
+                      t('Demonstrate the current error handler(s):') . ' ' . l('notice+warning', $_GET['q'], array('query' => array('demo' => 'warning'))) . ', ' . l('notice+warning+error', $_GET['q'], array('query' => array('demo' => 'error'))),
+  );
+  $form['devel_error_handlers']['#size'] = count($form['devel_error_handlers']['#options']);
+  if (empty($_POST) && !empty($_GET['demo'])) {
+    devel_demonstrate_error_handlers($_GET['demo']);
   }
 
   $options = drupal_map_assoc(array('default', 'blue', 'green', 'orange', 'white', 'disabled'));
@@ -141,3 +155,17 @@ function devel_admin_settings() {
 
   return system_settings_form($form);
 }
+
+function devel_demonstrate_error_handlers($severity) {
+  switch ($severity) {
+    case 'warning':
+      $undefined = $undefined;
+      1/0;
+      break;
+    case 'error':
+      $undefined = $undefined;
+      1/0;
+      devel_undefined_function();
+      break;
+  }
+}
diff --git a/devel.install b/devel.install
index d454fc3..23aca24 100644
--- a/devel.install
+++ b/devel.install
@@ -38,7 +38,7 @@ function devel_uninstall() {
   variable_del('devel_redirect_page');
   variable_del('devel_api_url');
   variable_del('dev_mem');
-  variable_del('devel_error_handler');
+  variable_del('devel_error_handlers');
   variable_del('devel_switch_user_list_size');
   variable_del('devel_switch_user_include_anon');
   variable_del('devel_switch_user_show_form');
@@ -86,3 +86,22 @@ function devel_update_7003() {
     variable_set('devel_krumo_skin', 'white');
   }
 }
+
+/**
+ * Convert devel_error_handler variable to devel_error_handlers array.
+ */
+function devel_update_7004() {
+  define('DEVEL_ERROR_HANDLER_BACKTRACE_AND_MESSAGE', 3);
+
+  $error_handler = variable_get('devel_error_handler', NULL);
+  if (isset($error_handler)) {
+    if ($error_handler == DEVEL_ERROR_HANDLER_BACKTRACE_AND_MESSAGE) {
+      $error_handlers = array(DEVEL_ERROR_HANDLER_STANDARD, DEVEL_ERROR_HANDLER_BACKTRACE_KRUMO);
+    }
+    else {
+      $error_handlers = array($error_handler);
+    }
+    variable_del('devel_error_handler');
+    variable_set('devel_error_handlers', drupal_map_assoc($error_handlers));
+  }
+}
diff --git a/devel.module b/devel.module
index 47b8ea8..4974eb2 100644
--- a/devel.module
+++ b/devel.module
@@ -10,8 +10,8 @@ define('DEVEL_QUERY_SORT_BY_DURATION', 1);
 
 define('DEVEL_ERROR_HANDLER_NONE', 0);
 define('DEVEL_ERROR_HANDLER_STANDARD', 1);
-define('DEVEL_ERROR_HANDLER_BACKTRACE', 2);
-define('DEVEL_ERROR_HANDLER_BACKTRACE_AND_MESSAGE', 3);
+define('DEVEL_ERROR_HANDLER_BACKTRACE_KRUMO', 2);
+define('DEVEL_ERROR_HANDLER_BACKTRACE_DPM', 4);
 
 define('DEVEL_MIN_TEXTAREA', 50);
 
@@ -392,7 +392,7 @@ function devel_theme() {
 function devel_init() {
   if (!devel_silent()) {
     if (user_access('access devel information')) {
-      devel_set_handler(variable_get('devel_error_handler', DEVEL_ERROR_HANDLER_STANDARD));
+      devel_set_handler(devel_get_handlers());
       // We want to include the class early so that anyone may call krumo() as needed. See http://krumo.sourceforge.net/
       has_krumo();
 
@@ -536,20 +536,25 @@ function devel_watchdog(array $log_entry) {
   dfb($watchdog, $type);
 }
 
-function devel_set_handler($handler) {
-  switch ($handler) {
-    case DEVEL_ERROR_HANDLER_STANDARD:
-      // do nothing
-      break;
-    case DEVEL_ERROR_HANDLER_BACKTRACE:
-    case DEVEL_ERROR_HANDLER_BACKTRACE_AND_MESSAGE:
-      if (has_krumo()) {
-        set_error_handler('backtrace_error_handler');
-      }
-      break;
-    case DEVEL_ERROR_HANDLER_NONE:
-      restore_error_handler();
-      break;
+function devel_get_handlers() {
+  $error_handlers = variable_get('devel_error_handlers', array(DEVEL_ERROR_HANDLER_STANDARD => DEVEL_ERROR_HANDLER_STANDARD));
+  if (!empty($error_handlers)) {
+    unset($error_handlers[DEVEL_ERROR_HANDLER_NONE]);
+  }
+  return $error_handlers;
+}
+
+function devel_set_handler($handlers) {
+  if (empty($handlers)) {
+    restore_error_handler();
+  }
+  elseif (count($handlers) == 1 && isset($handlers[DEVEL_ERROR_HANDLER_STANDARD])) {
+    // do nothing
+  }
+  else {
+    if (has_krumo()) {
+      set_error_handler('backtrace_error_handler');
+    }
   }
 }
 
@@ -679,23 +684,28 @@ function backtrace_error_handler($error_level, $message, $filename, $line, $cont
     $type = $types[$error_level];
     $backtrace = debug_backtrace();
     $variables = array('%error' => $type[0], '%message' => $message, '%function' => $backtrace[1]['function'] .'()', '%file' => $filename, '%line' => $line);
+    $msg = t('%error: %message in %function (line %line of %file).', $variables);
 
     // Show message if error_level is ERROR_REPORTING_DISPLAY_SOME or higher.
     // (This is Drupal's error_level, which is different from $error_level,
     // and we purposely ignore the difference between _SOME and _ALL,
     // see #970688!)
     if (variable_get('error_level', 1) >= 1) {
-      print t('%error: %message in %function (line %line of %file).', $variables) ." =&gt;\n";
-      ddebug_backtrace();
-
-      // Also show the standard Drupal message if this was requested via the admin option
-      // for both backtrace and message.
-      if (variable_get('devel_error_handler', DEVEL_ERROR_HANDLER_STANDARD) == DEVEL_ERROR_HANDLER_BACKTRACE_AND_MESSAGE) {
-        drupal_set_message(t('%error: %message in %function (line %line of %file).', $variables), ($type[1] <= WATCHDOG_ERROR ? 'error' : 'warning'));
+      $error_handlers = devel_get_handlers();
+      if (!empty($error_handlers[DEVEL_ERROR_HANDLER_STANDARD])) {
+        drupal_set_message($msg, ($type[1] <= WATCHDOG_ERROR ? 'error' : 'warning'));
+      }
+      if (!empty($error_handlers[DEVEL_ERROR_HANDLER_BACKTRACE_KRUMO])) {
+        print $msg ." =&gt;\n";
+        ddebug_backtrace();
+      }
+      if (!empty($error_handlers[DEVEL_ERROR_HANDLER_BACKTRACE_DPM])) {
+        dpm(ddebug_backtrace(TRUE), $msg, 'warning');
       }
     }
 
-    watchdog('php', '%error: %message in %function (line %line of %file).', $variables, $type[1]);
+    $watchdog = 'watchdog';
+    $watchdog('php', $msg, array(), $type[1]);
   }
 }
 
@@ -1665,13 +1675,15 @@ function dpq($query, $return = FALSE, $name = NULL) {
  *   An arbitrary value to output.
  * @param $name
  *   Optional name for identifying the output.
+ * @param $type
+ *   Optional message type for drupal_set_message(), defaults to 'status'.
  * @return
  *   The unaltered input value.
  */
-function dpm($input, $name = NULL) {
+function dpm($input, $name = NULL, $type = 'status') {
   if (user_access('access devel information')) {
     $export = kprint_r($input, TRUE, $name);
-    drupal_set_message($export);
+    drupal_set_message($export, $type);
   }
   return $input;
 }
@@ -1793,7 +1805,7 @@ function devel_render() {
 /**
  * Print the function call stack.
  */
-function ddebug_backtrace() {
+function ddebug_backtrace($return = FALSE) {
   if (user_access('access devel information')) {
     $backtrace = debug_backtrace();
     array_shift($backtrace);
@@ -1827,7 +1839,10 @@ function ddebug_backtrace() {
         $nicetrace[($counter <= 10 ? $nbsp : '') . --$counter . ': ' . $function] = $call;
         array_shift($backtrace);
       }
-      krumo($nicetrace);
+      if ($return) {
+        return $nicetrace;
+      }
+      kprint_r($nicetrace);
     }
   }
 }
