diff --git modules/comment.page_title.inc modules/comment.page_title.inc
index b5d6779..5a8f617 100644
--- modules/comment.page_title.inc
+++ modules/comment.page_title.inc
@@ -11,14 +11,19 @@
  * Implementation of hook_page_title_alter().
  */
 function comment_page_title_alter(&$title) {
-  // Get the current menu item and compare the path to the comment reply path
+  // Get the current menu item and compare the path to the comment reply path.
   $menu_item = menu_get_item();
-  if (!strncmp($menu_item['path'], 'comment/reply/%', 15) && ($node = menu_get_object('node', 2))) {
-    // If the node has a custom page title and the node type is configured to have a custom page title (ie, it's not a leftover from a previous setting), then use it.
-    if (!empty($node->page_title) && variable_get('page_title_type_'. $node->type .'_showfield', 0)) {
+  if ( !strncmp($menu_item['path'], 'comment/reply/%', 15) &&
+       ($node = menu_get_object('node', 2)) ) {
+    // If the node has a custom page title and the node type is configured
+    // to have a custom page title (ie, it's not a leftover from a previous
+    // setting), then use it.
+    if ( !empty($node->page_title) &&
+         variable_get('page_title_type_'. $node->type .'_showfield', 0) ) {
       $title = $node->page_title;
     }
-    // otherwise set the page-title token to the parent node title. Makes more sense than "Reply to comment"...
+    // Otherwise set the page-title token to the parent node title. Makes more
+    // sense than "Reply to comment".
     else {
       $title = $node->title;
     }
@@ -32,18 +37,20 @@ function comment_page_title_alter(&$title) {
 function comment_page_title_pattern_alter(&$pattern, &$types) {
   $menu_item = menu_get_item();
 
-  // Comment reply page
-  if (!strncmp($menu_item['path'], 'comment/reply/%', 15) && ($node = menu_get_object('node', 2))) {
-    // The node ID position is in arg 2...
+  // Comment reply page.
+  if ( !strncmp($menu_item['path'], 'comment/reply/%', 15) &&
+       ($node = menu_get_object('node', 2)) ) {
+    // The node ID position is in arg 2.
     $types['node'] = $node;
 
-    // If the node has any taxonomy, grab the first time and pass it over to be passed as a token.
+    // If the node has any taxonomy, grab the first time and pass it over to be
+    // passed as a token.
     // TODO: Handle multiple terms? Only pass specific terms per content type?
     if (!empty($types['node']->taxonomy)) {
       $types['taxonomy'] = current($types['node']->taxonomy);
     }
 
-    if (is_numeric(arg(3)) && $comment = comment_load(arg(3))) {
+    if (is_numeric(arg(3)) && ($comment = menu_get_object('comment',3))) {
       // Comment Reply...
       $types['comment'] = $comment;
       $pattern = variable_get('page_title_comment_child_reply', '');
diff --git modules/forum.page_title.inc modules/forum.page_title.inc
index 616f1ec..d673f17 100644
--- modules/forum.page_title.inc
+++ modules/forum.page_title.inc
@@ -13,11 +13,14 @@
 function forum_page_title_alter(&$title) {
   $menu_item = menu_get_item();
 
-  // Check we're on a forum page and if there is a number to confirm it's a container or forum (rather than root)
-  if (!strncmp($menu_item['path'], 'forum/%', 7) && ($forum = menu_get_object('forum_forum', 1))) {
-    if (variable_get('page_title_vocab_'. $forum->vid .'_showfield', 0) && ($forum_title = page_title_load_title($forum->tid, 'term'))) {
-      $title = $forum_title;
-    }
+  // Check we're on a forum page and if there is a number to confirm it's a
+  // container or forum (rather than root).
+  if ( $menu_item = menu_get_item() &&
+       !strncmp($menu_item['path'], 'forum/%', 7) &&
+       ($term = menu_get_object('taxonomy_term')) &&
+       variable_get('page_title_vocab_'. $term->vid .'_showfield', 0) &&
+       ($forum_title = page_title_load_title($term->tid, 'term')) ) {
+    $title = $forum_title;
   }
 }
 
@@ -29,13 +32,16 @@ function forum_page_title_pattern_alter(&$pattern, &$types) {
   $menu_item = menu_get_item();
 
   // Forums Page title Patterns
-  if (!strncmp($menu_item['path'], 'forum/%', 7) && ($forum = menu_get_object('forum_forum', 1))) {
+  if ( !strncmp($menu_item['path'], 'forum/%', 7) &&
+       ($forum = menu_get_object('forum_forum', 1)) ) {
     $types['term'] = $forum;
     $forum_vid = variable_get('forum_nav_vocabulary', '');
     $pattern = variable_get('page_title_vocab_'. $forum_vid, '');
   }
-  // Otherwise its the root - lets grab the root pattern.
+  // Otherwise it's the root - let's grab the root pattern.
   elseif ($menu_item['path'] == 'forum') {
     $pattern = variable_get('page_title_forum_root_title', '');
+    $vid = variable_get('forum_nav_vocabulary', 0);
+    $types['vocabulary'] = taxonomy_vocabulary_load($vid);
   }
 }
diff --git modules/node.page_title.inc modules/node.page_title.inc
index f2bd606..335344f 100644
--- modules/node.page_title.inc
+++ modules/node.page_title.inc
@@ -12,13 +12,15 @@
  */
 function node_page_title_alter(&$title) {
   $menu_item = menu_get_item();
-
-  // Test if this is a node page
-  if (!strncmp($menu_item['path'], 'node/%', 6) && ($node = menu_get_object())) {
-    // If the node has a custom page title and the node type is configured to have a custom page title (ie, it's not a leftover from a previous setting), then use it.
-    if (!empty($node->page_title) && variable_get('page_title_type_'. $node->type .'_showfield', 0)) {
-      $title = $node->page_title;
-    }
+  // Test if this is a node page.
+  if ( !strncmp($menu_item['path'],'node/%',6) && 
+       ($node = menu_get_object()) &&
+       !empty($node->page_title) &&
+       variable_get('page_title_type_'. $node->type .'_showfield', 0)) {
+    // If the node has a custom page title and the node type is configured
+    // to have a custom page title (ie, it's not a leftover from a previous 
+    // setting), then use it.
+    $title = $node->page_title;
   }
 }
 
@@ -28,25 +30,31 @@ function node_page_title_alter(&$title) {
  */
 function node_page_title_pattern_alter(&$pattern, &$types) {
   $menu_item = menu_get_item();
-
-  // Test if this is a node page
-  if (!strncmp($menu_item['path'], 'node/%', 6) && ($node = menu_get_object())) {
+  // Test if this is a node page.
+  if ( !strncmp($menu_item['path'],'node/%',6) && 
+       $node = menu_get_object() ) {
     $types['node'] = $node;
 
-    // If the node has any taxonomy, grab the first time and pass it over to be passed as a token.
+    // If the node has any taxonomy, grab the first term for use in tokens.
     // TODO: Handle multiple terms? Only pass specific terms per content type?
-    // In Drupal 7, terms are no longer in $node->taxomomy.. We need to grab all taxonomy_term_reference fields for this bundle and attach them
+    // In Drupal 7, terms are no longer in $node->taxomomy. We need to grab all 
+    // taxonomy_term_reference fields for this bundle and attach them.
     // TODO: Should this be in page_title.taxonomy.inc?!
     $fields = field_info_fields();
     foreach ($fields as $field_name => $field) {
-      if ($field['type'] == 'taxonomy_term_reference' && !empty($field['bundles']['node']) && in_array($node->type, $field['bundles']['node'])) {
-        if (isset($node->{$field_name}[$node->language][0]['taxonomy_term'])) {
-          $types['term'] = $node->{$field_name}[$node->language][0]['taxonomy_term'];
-        }
-        else {
-          $types['term'] = taxonomy_term_load($node->{$field_name}[$node->language][0]['tid']);
-        }
-        break;
+      if ( $field['type'] == 'taxonomy_term_reference' &&
+	   !empty($field['bundles']['node']) &&
+	   in_array($node->type, $field['bundles']['node']) &&
+	   isset($node->{$field_name}[$node->language][0]) ) {
+	$instance = $node->{$field_name}[$language][0];
+	if (isset($instance['taxonomy_term'])) {
+	  $types['term'] = $instance['taxonomy_term'];
+	  break;
+	}
+	elseif (isset($instance['tid'])) {
+	  $types['term'] = taxonomy_term_load($instance['tid']);
+	  break;
+	}
       }
     }
 
diff --git modules/taxonomy.page_title.inc modules/taxonomy.page_title.inc
index 9043780..8934bf9 100644
--- modules/taxonomy.page_title.inc
+++ modules/taxonomy.page_title.inc
@@ -12,12 +12,12 @@
  */
 function taxonomy_page_title_alter(&$title) {
   $menu_item = menu_get_item();
-
-  // If we're looking at a taxonomy term page, get the term title
-  if (!strncmp($menu_item['path'], 'taxonomy/term/%', 15) && ($term = menu_get_object('taxonomy_term', 2))) {
-    if (variable_get('page_title_vocab_'. $term->vid .'_showfield', 0) && ($term_title = page_title_load_title($term->tid, 'term'))) {
-      $title = $term_title;
-    }
+  // If we're looking at a taxonomy term page, get the term title.
+  if ( !strncmp($menu_item['path'], 'taxonomy/term/%', 15) &&
+       ($term = menu_get_object('taxonomy_term',2)) &&
+       variable_get('page_title_vocab_'. $term->vid .'_showfield', 0) &&
+       ($term_title = page_title_load_title($term->tid, 'term')) ) {
+    $title = $term_title;
   }
 }
 
@@ -29,7 +29,8 @@ function taxonomy_page_title_pattern_alter(&$pattern, &$types) {
   $menu_item = menu_get_item();
 
   // Taxonomy Term Page
-  if (!strncmp($menu_item['path'], 'taxonomy/term/%', 15) && ($term = menu_get_object('taxonomy_term', 2))) {
+  if ( !strncmp($menu_item['path'], 'taxonomy/term/%', 15) &&
+       ($term = menu_get_object('taxonomy_term',2)) ) {
     $types['term'] = $term;
     $pattern = variable_get('page_title_vocab_'. $term->vid, '');
   }
diff --git modules/user.page_title.inc modules/user.page_title.inc
index 74dd1da..5528466 100644
--- modules/user.page_title.inc
+++ modules/user.page_title.inc
@@ -11,11 +11,12 @@
  * Implementation of hook_page_title_alter().
  */
 function user_page_title_alter(&$title) {
-  // If we're looking at either a user profile page or a users blog page, get the user title
-  if ($user = menu_get_object('user')) {
-    if (variable_get('page_title_user_showfield', 0) && ($user_title = page_title_load_title(arg(1), 'user'))) {
-      $title = $user_title;
-    }
+  // If we're looking at either a user profile page or a users blog page,
+  // get the user title.
+  if ( ($user = menu_get_object('user')) &&
+       variable_get('page_title_user_showfield', 0) &&
+       ($user_title = page_title_load_title($user->uid, 'user')) ) {
+    $title = $user_title;
   }
 }
 
diff --git page_title.admin.inc page_title.admin.inc
index 19f77a5..bb44521 100644
--- page_title.admin.inc
+++ page_title.admin.inc
@@ -78,7 +78,7 @@ function page_title_admin_settings() {
       '#title' => t('Comment Child Reply'),
       '#default_value' => variable_get('page_title_comment_child_reply', ''),
       '#description' => t('This pattern with be used for comment reply pages where the reply is to an existing "comment" (eg a comment thread)'),
-      '#token_types' => array('comment'),
+      '#token_types' => array('comment', 'node'),
     ) + $pattern_form_element,
 
     // Define the user profile page pattern. This is used on any 'user/[0-9]' pages
@@ -141,7 +141,7 @@ function page_title_admin_settings() {
         '#default_value' => variable_get($key .'_showfield', 0),
       ) + $showfield_form_element;
 
-      $form['patterns']['scope'][$key] = array('#markup' => t('Taxonomy'),);
+      $form['patterns']['scope'][$key] = array('#markup' => t('Taxonomy'));
     }
   }
 
@@ -152,9 +152,10 @@ function page_title_admin_settings() {
     $form['patterns']['pattern'][$key] = array(
       '#title' => t('Blog Homepage'),
       '#default_value' => variable_get($key, ''),
+      '#token_types' => array('user'),
     ) + $pattern_form_element;
 
-    $form['patterns']['scope'][$key] = array('#markup' => t('User'),);
+    $form['patterns']['scope'][$key] = array('#markup' => t('User'));
   }
 
 
@@ -164,9 +165,9 @@ function page_title_admin_settings() {
       '#title' => t('Forum Root'),
       '#default_value' => variable_get('page_title_forum_root_title', ''),
       '#description' => t('This pattern will be used on the forum root page (ie, <code>/forum</code>)'),
-      '#token_types' => array('user'),
+      '#token_types' => array('vocabulary'),
     ) + $pattern_form_element;
-    $form['patterns']['scope']['page_title_forum_root_title'] = array('#type' => 'markup', '#value' => t('Global'));
+    $form['patterns']['scope']['page_title_forum_root_title'] = array('#markup' => t('Vocabulary'));
   }
 
 
@@ -179,7 +180,7 @@ function page_title_admin_settings() {
   );
   $form['token_help']['content'] = array(
     '#theme' => 'token_tree',
-    '#token_types' => array('node', 'comment', 'term', 'user'),
+    '#token_types' => array('node', 'comment', 'term', 'vocabulary', 'user'),
   );
 
 
diff --git page_title.module page_title.module
index a8d1dea..4a49195 100644
--- page_title.module
+++ page_title.module
@@ -444,7 +444,7 @@ function page_title_load_title($id, $type) {
 
 /**
  * Wrapper for old function...
- * NOTE: This has been depricated in favor of page_title_load_title().
+ * NOTE: This has been deprecated in favor of page_title_load_title().
  */
 function page_title_node_get_title($nid) {
   return page_title_load_title($nid, 'node');
@@ -453,7 +453,7 @@ function page_title_node_get_title($nid) {
 
 /**
  * Legacy page title setting function...
- * NOTE: This has been depreicated in favour of hook_page_title_alter().
+ * NOTE: This has been deprecated in favour of hook_page_title_alter().
  */
 function page_title_set_title($title = NULL) {
   $stored_title = &drupal_static(__FUNCTION__);
@@ -495,7 +495,7 @@ function page_title_page_get_title($raw = FALSE) {
     $page_title_pattern .= isset($_REQUEST['page']) ? variable_get('page_title_pager_pattern', '') : '';
 
     // Apply token patterns using token_replace
-    $title = token_replace($page_title_pattern, $types);
+    $title = token_replace($page_title_pattern, $types, array('sanitize' => FALSE));
   }
 
   // Trim trailing whitespace from the title
diff --git page_title.views_default.inc page_title.views_default.inc
index 23ab76c..c44e690 100644
--- page_title.views_default.inc
+++ page_title.views_default.inc
@@ -12,6 +12,13 @@
  * Implementation hook_views_default_views().
  */
 function page_title_views_default_views() {
+  // This lets us locally cache the result - in case the function is called twice
+  static $views;
+  if (isset($views)) {
+    return $views;
+  }
+
+  // No views cached, generate the default views array and return
   $views = array();
   $views += _page_title_views_default_views_list_node_page_titles();
   return $views;
diff --git views/plugins/page_title_plugin_display_page_with_page_title.inc views/plugins/page_title_plugin_display_page_with_page_title.inc
index 5a7ad29..c3f03b4 100644
--- views/plugins/page_title_plugin_display_page_with_page_title.inc
+++ views/plugins/page_title_plugin_display_page_with_page_title.inc
@@ -38,7 +38,6 @@ class page_title_plugin_display_page_with_page_title extends views_plugin_displa
 
     if ($form_state['section'] == 'page_title_pattern') {
       $form['#title'] = t('The <em>Page Title Pattern</em> of this view');
-      $view = &$form_state['view'];
 
       $form['page_title_pattern'] = array(
         '#title' => t('Page Title Pattern'),
