diff --git a/public_html/modules/node/node.admin.inc b/public_html/modules/node/node.admin.inc
index 1508bc0..4ba90b7 100644
--- a/public_html/modules/node/node.admin.inc
+++ b/public_html/modules/node/node.admin.inc
@@ -106,6 +106,15 @@ function node_filters() {
       ) + $languages,
     );
   }
+
+  // The taxonomy filter
+  if ($taxonomy = module_invoke('taxonomy', 'form_all')) {
+    $filters['term'] = array(
+      'title' => t('category'),
+      'options' => array('[any]' => t('any')) + $taxonomy
+    );
+  }
+
   return $filters;
 }
 
@@ -121,6 +130,10 @@ function node_build_filter_query(SelectQueryInterface $query) {
   foreach ($filter_data as $index => $filter) {
     list($key, $value) = $filter;
     switch ($key) {
+      case 'term':
+        $alias = $query->join('taxonomy_index', 'ti', "n.nid = %alias.nid");
+        $query->condition($alias . '.tid', $value);
+        break;
       case 'status':
         // Note: no exploitable hole as $key/$value have already been checked when submitted
         list($key, $value) = explode('-', $value, 2);
diff --git a/public_html/modules/taxonomy/taxonomy.module b/public_html/modules/taxonomy/taxonomy.module
index d501282..289b60f 100644
--- a/public_html/modules/taxonomy/taxonomy.module
+++ b/public_html/modules/taxonomy/taxonomy.module
@@ -1905,6 +1905,24 @@ function taxonomy_taxonomy_term_delete($term) {
 }
 
 /**
+ * Generate a set of options for selecting a term from all vocabularies.
+ */
+function taxonomy_form_all() {
+  $vocabularies = taxonomy_get_vocabularies();
+  $options = array();
+  foreach ($vocabularies as $vid => $vocabulary) {
+    $tree = taxonomy_get_tree($vid);
+    if ($tree && (count($tree) > 0)) {
+      $options[$vocabulary->name] = array();
+      foreach ($tree as $term) {
+        $options[$vocabulary->name][$term->tid] = str_repeat('-', $term->depth) . $term->name;
+      }
+    }
+  }
+  return $options;
+}
+
+/**
  * @} End of "defgroup taxonomy_index".
  */

