diff --git a/pagenotfound_reports.module b/pagenotfound_reports.module
index ee2441f..a8a611c 100644
--- a/pagenotfound_reports.module
+++ b/pagenotfound_reports.module
@@ -49,7 +49,50 @@ function pagenotfound_reports_menu() {
   return $items;
 }
 
+/**
+ * Implement hook_form_FORM_ID_alter().
+ *
+ * Modify the path_redirect add/edit form to prepopualate the source field with
+ * the path of a 404 record referenced in the querystring.
+ */
+function pagenotfound_reports_form_path_redirect_edit_form_alter(&$form, &$form_state) {
+  $wid = $_REQUEST['pagenotfound-wid'];
+  if (!empty($wid) && is_numeric($wid) && empty($form['source']['#default_value'])) {
+    $path = db_result(db_query("SELECT message FROM {watchdog} WHERE type = 'page not found' AND wid = %d", $wid));
+    if (!empty($path)) {
+      $form['source']['#default_value'] = truncate_utf8($path, 56, TRUE, TRUE);
+    }
+  }
+}
 
+/**
+ * Add a set of operation links to a single dblog (404) entry.
+ */
+function _pagenotfound_reports_add_operations($dblog) {
+  $operations = array();
+  if (module_exists('path_redirect') && $path = truncate_utf8($dblog->message, 56, TRUE, TRUE)) {
+    if ($existing = path_redirect_load_by_source($path)) {
+      $operations[] = array(
+        'title' => t('Edit redirect'),
+        'href' => 'admin/build/path-redirect/edit/' . $existing['rid'],
+        'query' => drupal_get_destination(),
+      );
+      $operations[] = array(
+        'title' => t('Delete redirect'),
+        'href' => 'admin/build/path-redirect/delete/' . $existing['rid'],
+        'query' => drupal_get_destination(),
+      );
+    }
+    elseif (!empty($dblog->wid)) {
+      $operations[] = array(
+        'title' => t('Add redirect'),
+        'href' => 'admin/build/path-redirect/add',
+        'query' => drupal_get_destination() . '&pagenotfound-wid=' . $dblog->wid,
+      );
+    }
+  }
+  return !empty($operations) ? theme('links', $operations) : NULL;
+}
 
 /**
  * List of all 404s sorted by most common
@@ -64,20 +107,22 @@ function pagenotfound_reports_top_404s() {
   $header = array(
     array('data' => t('Count'), 'field' => 'count', 'sort' => 'desc'),
     array('data' => t('Path'), 'field' => 'message'),
+    array('data' => t('Operations')),
   );
 
-  $result = pager_query("SELECT COUNT(wid) AS count, message FROM {watchdog} WHERE type = 'page not found' GROUP BY message ". tablesort_sql($header), 30, 0, "SELECT COUNT(DISTINCT(message)) FROM {watchdog} WHERE type = 'page not found'");
+  $result = pager_query("SELECT COUNT(wid) AS count, message, wid FROM {watchdog} WHERE type = 'page not found' GROUP BY message ". tablesort_sql($header), 30, 0, "SELECT COUNT(DISTINCT(message)) FROM {watchdog} WHERE type = 'page not found'");
 
   $rows = array();
   while ($dblog = db_fetch_object($result)) {
     $rows[] = array(
       $dblog->count, 
-      truncate_utf8($dblog->message, 56, TRUE, TRUE)
+      truncate_utf8($dblog->message, 56, TRUE, TRUE),
+      _pagenotfound_reports_add_operations($dblog),
     );
   }
 
   if (empty($rows)) {
-    $rows[] = array(array('data' => t('No log messages available.'), 'colspan' => 2));
+    $rows[] = array(array('data' => t('No log messages available.'), 'colspan' => 3));
   }
 
   $output .= theme('table', $header, $rows);
@@ -102,6 +147,7 @@ function pagenotfound_reports_referers() {
     array('data' => t('Count'), 'field' => 'count', 'sort' => 'desc'),
     array('data' => t('Path'), 'field' => 'message'),
     array('data' => t('Referer'), 'field' => 'referer'),
+    array('data' => t('Operations')),
   );
 
   $result = pager_query("SELECT COUNT(wid) AS count, message, referer, wid FROM {watchdog} WHERE type = 'page not found' AND referer IS NOT NULL AND referer != '' GROUP BY message, referer ". tablesort_sql($header), 30, 0, "SELECT COUNT(DISTINCT(CONCAT(message, ':', referer))) FROM {watchdog} WHERE type = 'page not found' AND referer IS NOT NULL AND referer != ''");
@@ -111,12 +157,13 @@ function pagenotfound_reports_referers() {
     $rows[] = array(
       $dblog->count, 
       truncate_utf8($dblog->message, 56, TRUE, TRUE), 
-      l($dblog->referer, $dblog->referer)
+      l($dblog->referer, $dblog->referer),
+      _pagenotfound_reports_add_operations($dblog),
     );
   }
 
   if (empty($rows)) {
-    $rows[] = array(array('data' => t('No log messages available.'), 'colspan' => 3));
+    $rows[] = array(array('data' => t('No log messages available.'), 'colspan' => 4));
   }
 
   $output .= theme('table', $header, $rows);
@@ -140,6 +187,7 @@ function pagenotfound_reports_all() {
     array('data' => t('Date'), 'field' => 'timestamp', 'sort' => 'desc'),
     array('data' => t('Path'), 'field' => 'message'),
     array('data' => t('Referer'), 'field' => 'referer'),
+    array('data' => t('Operations')),
   );
 
   $result = pager_query("SELECT wid, timestamp, message, referer FROM {watchdog} WHERE type = 'page not found' ". tablesort_sql($header), 30, 0, "SELECT COUNT(wid) FROM {watchdog} WHERE type = 'page not found'");
@@ -149,11 +197,13 @@ function pagenotfound_reports_all() {
     $rows[] = array(
       l(format_date($dblog->timestamp), 'admin/reports/event/'. $dblog->wid, array('html' => TRUE)),
       truncate_utf8($dblog->message, 56, TRUE, TRUE),
-      l($dblog->referer, $dblog->referer));
+      l($dblog->referer, $dblog->referer),
+      _pagenotfound_reports_add_operations($dblog),
+    );
   }
 
   if (empty($rows)) {
-    $rows[] = array(array('data' => t('No log messages available.'), 'colspan' => 3));
+    $rows[] = array(array('data' => t('No log messages available.'), 'colspan' => 4));
   }
 
   $output .= theme('table', $header, $rows);
