diff --git a/feedback.module b/feedback.module
index 5cc04d8..b8024c6 100644
--- a/feedback.module
+++ b/feedback.module
@@ -276,6 +276,10 @@ function feedback_form_submit($form, &$form_state) {
   $entry->location = $form_state['values']['location'];
   feedback_save($entry);
 
+  // Trigger rule if Rules is enabled
+  if (module_exists('rules')) {
+    rules_invoke_event('feedback_insert', $entry);
+  }
   drupal_set_message(t('Thanks for your feedback!'));
 }
 
diff --git a/feedback.tokens.inc b/feedback.tokens.inc
index 72731f2..1c062dc 100644
--- a/feedback.tokens.inc
+++ b/feedback.tokens.inc
@@ -19,10 +19,6 @@ function feedback_token_info() {
 
   $tokens = array(
     'feedback' => array(
-      'location_masked' => array(
-        'name' => t("Location"),
-        'description' => t("The location where feedback was submitted."),
-      ),
       'url' => array(
         'name' => t("URL"),
         'description' => t("The URL where feedback was submitted."),
@@ -51,10 +47,6 @@ function feedback_tokens($type, $tokens, array $data = array(), array $options =
   $url_options = array('absolute' => TRUE);
   if (isset($options['language'])) {
     $url_options['language'] = $options['language'];
-    $language_code = $options['language']->language;
-  }
-  else {
-    $language_code = NULL;
   }
   $sanitize = !empty($options['sanitize']);
 
@@ -70,7 +62,7 @@ function feedback_tokens($type, $tokens, array $data = array(), array $options =
           break;
 
         case 'url':
-          $replacements[$original] = $feedback->url;
+          $replacements[$original] = url($feedback->url, $url_options);
           break;
 
         case 'useragent':
@@ -78,10 +70,27 @@ function feedback_tokens($type, $tokens, array $data = array(), array $options =
           break;
 
         case 'message':
-          $replacements[$original] = $feedback->message;
+          $replacements[$original] = $sanitize ? check_plain($feedback->message) : $feedback->message;
+          break;
+
+        // Default values for the chained tokens handled below.
+        case 'author':
+          if ($feedback->uid == 0) {
+            $name = variable_get('anonymous', t('Anonymous'));
+          }
+          else {
+            $account = user_load($feedback->uid == 0);
+            $name = $account->name;
+          }
+          $replacements[$original] = $sanitize ? filter_xss($name) : $name;
           break;
       }
     }
+
+    if ($author_tokens = token_find_with_prefix($tokens, 'author')) {
+      $author = user_load($feedback->uid);
+      $replacements += token_generate('user', $author_tokens, array('user' => $author), $options);
+    }
   }
 
   return $replacements;
