diff --git a/core/modules/dblog/dblog.admin.inc b/core/modules/dblog/dblog.admin.inc
index ec0e5e9..f826ccf 100644
--- a/core/modules/dblog/dblog.admin.inc
+++ b/core/modules/dblog/dblog.admin.inc
@@ -6,45 +6,21 @@
  */
 
 /**
- * Page callback: Shows the most frequent log messages of a given event type.
+ * Page callback: Displays details about a specific database log message.
  *
- * Messages are not truncated on this page because events detailed herein do not
- * have links to a detailed view.
+ * @param int $id
+ *   Unique ID of the database log message.
  *
- * @param string $type
- *   Type of database log events to display (e.g., 'search').
- *
- * @return array
- *   A build array in the format expected by drupal_render().
+ * @return array|string
+ *   If the ID is located in the Database Logging table, a build array in the
+ *   format expected by drupal_render(); otherwise, an empty string.
  *
  * @see dblog_menu()
  */
-function dblog_top($type) {
-
-  $header = array(
-    array('data' => t('Count'), 'field' => 'count', 'sort' => 'desc'),
-    array('data' => t('Message'), 'field' => 'message')
-  );
-  $count_query = db_select('watchdog');
-  $count_query->addExpression('COUNT(DISTINCT(message))');
-  $count_query->condition('type', $type);
-
-  $query = db_select('watchdog', 'w')
-    ->extend('Drupal\Core\Database\Query\PagerSelectExtender')
-    ->extend('Drupal\Core\Database\Query\TableSortExtender');
-  $query->addExpression('COUNT(wid)', 'count');
-  $query = $query
-    ->fields('w', array('message', 'variables'))
-    ->condition('w.type', $type)
-    ->groupBy('message')
-    ->groupBy('variables')
-    ->limit(30)
-    ->orderByHeader($header);
-  $query->setCountQuery($count_query);
-  $result = $query->execute();
-
-  $rows = array();
-  foreach ($result as $dblog) {
+function dblog_event($id) {
+  $severity = watchdog_severity_levels();
+  $result = db_query('SELECT w.*, u.name, u.uid FROM {watchdog} w INNER JOIN {users} u ON w.uid = u.uid WHERE w.wid = :id', array(':id' => $id))->fetchObject();
+  if ($dblog = $result) {
     // Check for required properties.
     if (isset($dblog->message) && isset($dblog->variables)) {
       // Messages without variables or user specified text.
@@ -56,18 +32,87 @@ function dblog_top($type) {
         $message = t($dblog->message, unserialize($dblog->variables));
       }
     }
-    $rows[] = array($dblog->count, $message);
+    $rows = array(
+      array(
+        array('data' => t('Type'), 'header' => TRUE),
+        t($dblog->type),
+      ),
+      array(
+        array('data' => t('Date'), 'header' => TRUE),
+        format_date($dblog->timestamp, 'long'),
+      ),
+      array(
+        array('data' => t('User'), 'header' => TRUE),
+        theme('username', array('account' => $dblog)),
+      ),
+      array(
+        array('data' => t('Location'), 'header' => TRUE),
+        l($dblog->location, $dblog->location),
+      ),
+      array(
+        array('data' => t('Referrer'), 'header' => TRUE),
+        l($dblog->referer, $dblog->referer),
+      ),
+      array(
+        array('data' => t('Message'), 'header' => TRUE),
+        $message,
+      ),
+      array(
+        array('data' => t('Severity'), 'header' => TRUE),
+        $severity[$dblog->severity],
+      ),
+      array(
+        array('data' => t('Hostname'), 'header' => TRUE),
+        check_plain($dblog->hostname),
+      ),
+      array(
+        array('data' => t('Operations'), 'header' => TRUE),
+        $dblog->link,
+      ),
+    );
+    $build['dblog_table'] = array(
+      '#theme' => 'table',
+      '#rows' => $rows,
+      '#attributes' => array('class' => array('dblog-event')),
+    );
+    return $build;
   }
+  else {
+    return '';
+  }
+}
 
-  $build['dblog_top_table'] = array(
-    '#theme' => 'table',
-    '#header' => $header,
-    '#rows' => $rows,
-    '#empty' => t('No log messages available.'),
-  );
-  $build['dblog_top_pager'] = array('#theme' => 'pager');
+/**
+ * Builds a query for database log administration filters based on session.
+ *
+ * @return array
+ *   An associative array with keys 'where' and 'args'.
+ */
+function dblog_build_filter_query() {
+  if (empty($_SESSION['dblog_overview_filter'])) {
+    return;
+  }
+
+  $filters = dblog_filters();
 
-  return $build;
+  // Build query
+  $where = $args = array();
+  foreach ($_SESSION['dblog_overview_filter'] as $key => $filter) {
+    $filter_where = array();
+    foreach ($filter as $value) {
+      $filter_where[] = $filters[$key]['where'];
+      $args[] = $value;
+    }
+    if (!empty($filter_where)) {
+      $where[] = '(' . implode(' OR ', $filter_where) . ')';
+    }
+  }
+  $where = !empty($where) ? implode(' AND ', $where) : '';
+
+  return array(
+    'where' => $where,
+    'args' => $args,
+  );
 }
 
 /**
diff --git a/core/modules/dblog/dblog.module b/core/modules/dblog/dblog.module
index dcef317..6fcc391 100644
--- a/core/modules/dblog/dblog.module
+++ b/core/modules/dblog/dblog.module
@@ -48,34 +48,24 @@ function dblog_menu() {
   $items['admin/reports/page-not-found'] = array(
     'title' => "Top 'page not found' errors",
     'description' => "View 'page not found' errors (404s).",
-    'page callback' => 'dblog_top',
-    'page arguments' => array('page not found'),
-    'access arguments' => array('access site reports'),
-    'file' => 'dblog.admin.inc',
+    'route_name' => 'dblog_top',
   );
   $items['admin/reports/access-denied'] = array(
     'title' => "Top 'access denied' errors",
     'description' => "View 'access denied' errors (403s).",
-    'page callback' => 'dblog_top',
-    'page arguments' => array('access denied'),
-    'access arguments' => array('access site reports'),
-    'file' => 'dblog.admin.inc',
+    'route_name' => 'dblog_top',
   );
   $items['admin/reports/event/%'] = array(
     'title' => 'Details',
     'route_name' => 'dblog_event',
   );
 
-  if (module_exists('search')) {
-    $items['admin/reports/search'] = array(
-      'title' => 'Top search phrases',
-      'description' => 'View most popular search phrases.',
-      'page callback' => 'dblog_top',
-      'page arguments' => array('search'),
-      'access arguments' => array('access site reports'),
-      'file' => 'dblog.admin.inc',
-    );
-  }
+  $items['admin/reports/search'] = array(
+    'title' => 'Top search phrases',
+    'description' => 'View most popular search phrases.',
+    'route_name' => 'dblog_top',
+  );
+
 
   return $items;
 }
diff --git a/core/modules/dblog/dblog.routing.yml b/core/modules/dblog/dblog.routing.yml
index 388348d..75c9812 100644
--- a/core/modules/dblog/dblog.routing.yml
+++ b/core/modules/dblog/dblog.routing.yml
@@ -4,10 +4,17 @@ dblog_overview:
     _content: '\Drupal\dblog\Controller\DbLogController::overview'
   requirements:
     _permission: 'access site reports'
-
 dblog_event:
   pattern: 'admin/reports/event/{event_id}'
   defaults:
     _content: '\Drupal\dblog\Controller\DbLogController::eventDetails'
   requirements:
     _permission: 'access site reports'
+dblog_top:
+  pattern: '/admin/reports/{type}'
+  defaults:
+    _content: '\Drupal\dblog\Controller\DbLogController::top'
+  requirements:
+    _permission: 'access site reports'
+    # Do not match the dblog route above.
+    type: (access-denied|search|page-not-found).*
\ No newline at end of file
diff --git a/core/modules/dblog/lib/Drupal/dblog/Controller/DbLogController.php b/core/modules/dblog/lib/Drupal/dblog/Controller/DbLogController.php
index 5ae1ad3..2ac40f8 100644
--- a/core/modules/dblog/lib/Drupal/dblog/Controller/DbLogController.php
+++ b/core/modules/dblog/lib/Drupal/dblog/Controller/DbLogController.php
@@ -17,6 +17,7 @@
 use Drupal\Core\Extension\ModuleHandlerInterface;
 use Drupal\user\UserStorageControllerInterface;
 use Symfony\Component\DependencyInjection\ContainerInterface;
+use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
 
 /**
  * Returns responses for dblog routes.
@@ -319,4 +320,99 @@ protected function buildFilterQuery() {
     );
   }
 
+  /**
+   * Shows the most frequent log messages of a given event type.
+   *
+   * Messages are not truncated on this page because events
+   * detailed herein do not have links to a detailed view.
+   *
+   * Use one of the above *Report() methods.
+   *
+   * @param string $type
+   *   Type of database log events to display (e.g., 'search').
+   *
+   * @throws \Symfony\Component\HttpKernel\Exception\NotFoundHttpException
+   *
+   * @return array
+   *   A build array in the format expected by drupal_render().
+   *
+   * @see dblog_menu()
+   *
+   */
+  public function top($type) {
+    // Make sure the search module is enabled.
+    if (strtolower($type) == 'search') {
+      if (!$this->moduleHandler->moduleExists('search')) {
+        // Its not enabled - throw 404.
+        throw new NotFoundHttpException();
+      }
+    }
+
+    // See http://drupal.org/node/1871596.
+    switch ($type) {
+      case 'search':
+        $build['#search'] = 'Top search phrases';
+        break;
+
+      case 'access-denied':
+        $type = 'access denied';
+        $build['#access-denied'] = "Top 'access denied' errors";
+        break;
+
+      case 'page-not-found':
+        $type = 'page not found';
+        $build['#page-not-found'] = "Top 'page not found' errors";        
+        break;
+    }
+
+    $header = array(
+      array('data' => t('Count'), 'field' => 'count', 'sort' => 'desc'),
+      array('data' => t('Message'), 'field' => 'message'),
+    );
+
+    $count_query = $this->database->select('watchdog');
+    $count_query->addExpression('COUNT(DISTINCT(message))');
+    $count_query->condition('type', $type);
+
+    $query = $this->database->select('watchdog', 'w')
+      ->extend('Drupal\Core\Database\Query\PagerSelectExtender')
+      ->extend('Drupal\Core\Database\Query\TableSortExtender');
+    $query->addExpression('COUNT(wid)', 'count');
+    $query = $query
+      ->fields('w', array('message', 'variables'))
+      ->condition('w.type', $type)
+      ->groupBy('message')
+      ->groupBy('variables')
+      ->limit(30)
+      ->orderByHeader($header);
+    $query->setCountQuery($count_query);
+    $result = $query->execute();
+
+    $rows = array();
+    foreach ($result as $dblog) {
+      // Check for required properties.
+      if (isset($dblog->message) && isset($dblog->variables)) {
+        // Messages without variables or user specified text.
+        if ($dblog->variables === 'N;') {
+          $message = $dblog->message;
+        }
+        // Message to translate with injected variables.
+        else {
+          $message = t($dblog->message, unserialize($dblog->variables));
+        }
+      }
+      $rows[] = array($dblog->count, $message);
+    }
+
+    $build['dblog_top_table']  = array(
+      '#theme' => 'table',
+      '#header' => $header,
+      '#rows' => $rows,
+      '#empty' => t('No log messages available.'),
+    );
+    $build['dblog_top_pager'] = array('#theme' => 'pager');
+
+    return $build;
+  }
+
 }
