diff -wupN privatemsg_filter/privatemsg_filter.css privatemsg/privatemsg_filter/privatemsg_filter.css
--- privatemsg_filter/privatemsg_filter.css	1970-01-01 01:00:00.000000000 +0100
+++ privatemsg/privatemsg_filter/privatemsg_filter.css	2008-11-20 21:20:32.000000000 +0100
@@ -0,0 +1,9 @@
+
+form#privatemsg-filter-dropdown #edit-author-wrapper, form#privatemsg-filter-dropdown #edit-tags-wrapper {
+  float: left;
+  margin-right: 3em;
+}
+
+form#privatemsg-filter-dropdown #privatemsg-filter-buttons {
+  clear: left;
+}
diff -wupN privatemsg_filter/privatemsg_filter.install privatemsg/privatemsg_filter/privatemsg_filter.install
--- privatemsg_filter/privatemsg_filter.install	2008-11-10 17:16:02.000000000 +0100
+++ privatemsg/privatemsg_filter/privatemsg_filter.install	2008-11-20 13:32:50.000000000 +0100
@@ -21,7 +21,7 @@ function privatemsg_filter_schema() {
       ),
     ),
     'indexes'         => array(
-      '`tag_id`'               => array('`tag_id`','`tag`'),
+      '`tag_id`'               => array('tag_id','tag'),
     ),
   );
 
diff -wupN privatemsg_filter/privatemsg_filter.module privatemsg/privatemsg_filter/privatemsg_filter.module
--- privatemsg_filter/privatemsg_filter.module	2008-11-10 17:21:08.000000000 +0100
+++ privatemsg/privatemsg_filter/privatemsg_filter.module	2008-11-20 23:28:42.000000000 +0100
@@ -92,9 +92,9 @@ function privatemsg_filter_add_tags_subm
     foreach ($tags as $tag) {
       $tag = trim($tag);
       $tag = str_replace(' ', '-', $tag);
-      $count = db_result(db_query('SELECT COUNT(*) FROM {pm_tags} WHERE tag = "%s"', $tag));
+      $count = db_result(db_query("SELECT COUNT(*) FROM {pm_tags} WHERE tag = '%s'", $tag));
       if ($count == 0) {
-        db_query('INSERT INTO {pm_tags} (tag) VALUES ("%s")', $tag);
+        db_query("INSERT INTO {pm_tags} (tag) VALUES ('%s')", $tag);
         $inserted[] = $tag;
       }
     }
@@ -153,45 +153,140 @@ function privatemsg_filter_delete_tags_s
   }
 }
 
+function privatemsg_filter_check_get($tag_data, $author_data) {
+  if (isset($_GET['tags'])) {
+    $_SESSION['privatemsg_filter']['tags'] = array();
+    foreach (explode(' ', $_GET['tags']) as $tag) {
+      if (isset($tag_data[$tag])) {
+        $_SESSION['privatemsg_filter']['tags'][$tag] = $tag;
+      }
+      elseif (in_array($tag, $tag_data)) {
+        $_SESSION['privatemsg_filter']['tags'][array_search($tag, $tag_data)] = array_search($tag, $tag_data);
+      }
+    }
+  }  
+  
+  if (isset($_GET['author'])) {
+    $_SESSION['privatemsg_filter']['author'] = array();
+    foreach (explode(' ', $_GET['author']) as $author) {
+      if (isset($author_data[$author])) {
+        $_SESSION['privatemsg_filter']['author'][$author] = $author;
+      }
+      elseif (in_array($author, $author_data)) {
+        $_SESSION['privatemsg_filter']['author'][array_search($author, $author_data)] = array_search($author, $author_data);
+      }
+    }
+  }
+  
+  if (isset($_GET['search'])) {
+    $_SESSION['privatemsg_filter']['search'] = db_escape_string($_GET['search']);
+  }
+
+}
+
 function privatemsg_filter_dropdown(&$form_state = NULL, $account) {
  
   // Only show the tags that a user has used.
-  $sql = 'SELECT * FROM {pm_tags_index} pmti LEFT JOIN {pm_tags} pmt ON pmti.tag_id = pmt.tag_id WHERE pmti.uid = %d GROUP BY pmt.tag_id';
+  $sql = 'SELECT pmt.tag, pmt.tag_id FROM {pm_tags_index} pmti LEFT JOIN {pm_tags} pmt ON pmti.tag_id = pmt.tag_id WHERE pmti.uid = %d GROUP BY pmt.tag_id, pmt.tag';
   $query = db_query($sql, $account->uid);
   $tag_data = array();
   
   while($result = db_fetch_object($query)) {
-    $tag_data[$result->tag] = $result->tag;  
+    $tag_data[$result->tag_id] = $result->tag;
   }
-  // Only show form if the user has some messages tagged.
-  if(count($tag_data)) {
-    $form['tags'] = array(
+
+  $sql = 'SELECT DISTINCT pm.author, u.name FROM {pm_message} pm INNER JOIN pm_index pmi ON pm.mid = pmi.mid INNER JOIN {users} u ON pm.author = u.uid WHERE pmi.uid = %d AND u.uid > 0 ORDER BY u.name';
+  $query = db_query($sql, $account->uid);
+
+  $author_data = array();
+  while ($result = db_fetch_object($query)) {
+    $author_data[$result->author] = $result->name;
+  }
+
+  privatemsg_filter_check_get($tag_data, $author_data);
+
+  drupal_add_css(drupal_get_path('module', 'privatemsg_filter') . '/privatemsg_filter.css');
+
+  $form['filter'] = array(
       '#type' => 'fieldset',
       '#title' => t('Filter Messages'),
       '#collapsible' => TRUE,
       '#collapsed' => TRUE,
     );  
-      $form['tags']['select'] = array(
+  $form['filter']['search'] = array(
+      '#type' => 'textfield',
+      '#title' => t('Search'),
+      '#weight' => -20
+  );
+
+  $form['filter']['author'] = array(
+      '#type' => 'select',
+      '#title' => t('Authors'),
+      '#options' => $author_data,
+      '#multiple' => true,
+      '#size' => 5,
+      '#weight' => -10
+  );
+
+  // Only show form if the user has some messages tagged.
+  if(count($tag_data)) {
+      $form['filter']['tags'] = array(
       '#type' => 'select',
       '#title' => t('Tags'),
-      '#default_value' => '',
       '#options' => $tag_data,
+      '#multiple' => true,
+      '#size' => 5,
+      '#weight' => 0
     );
 
-  	$form['tags']['submit'] = array(
+  	$form['filter']['submit'] = array(
   		'#type'     => 'submit',
   		'#value'    => t('Filter'),
+        '#prefix'   => '<div id="privatemsg-filter-buttons">',
+        '#weight'   => 10,
+  	);
+
+  	$form['filter']['reset'] = array(
+  		'#type'     => 'submit',
+  		'#value'    => t('Reset'),
+        '#suffix'   => '</div>',
+        '#weight'   => 20
   	);
     
+    if (isset($_SESSION['privatemsg_filter']) && !empty($_SESSION['privatemsg_filter'])) {
+      $form['filter']['#title'] = t('Filter Messages (Active)');
+      $form['filter']['#collapsed'] = false;
+
+      $form['filter']['author']['#default_value'] = $_SESSION['privatemsg_filter']['author'];
+      $form['filter']['tags']['#default_value'] = $_SESSION['privatemsg_filter']['tags'];
+      $form['filter']['search']['#default_value'] = $_SESSION['privatemsg_filter']['search'];
+    }
+    
     return $form;
   }
 }
 
 function privatemsg_filter_dropdown_submit($form, &$form_state) {
-  if (isset($form_state['values']['submit'])) {  
-//    $form_state['redirect'] = $_GET['q']. '&tags=' .$form_state['values']['select'];
-    drupal_goto('messages', array('tags' => $form_state['values']['select']));
+  switch ($form_state['values']['op']) {
+    case t('Filter'):
+        $filter = array();
+        if (isset($form_state['values']['tags'])) {
+          $filter['tags'] = $form_state['values']['tags'];
+        }
+        if (isset($form_state['values']['author'])) {
+          $filter['author'] = $form_state['values']['author'];
+        }
+        if (isset($form_state['values']['search'])) {
+          $filter['search'] = db_escape_string($form_state['values']['search']);
+        }
+        $_SESSION['privatemsg_filter'] = $filter;
+      break;
+    case t('Reset'):
+      $_SESSION['privatemsg_filter'] = array();
+      break;
   }
+
+  return 'messages';
 }
 
 /**
@@ -225,29 +320,26 @@ function privatemsg_filter_privatemsg_li
  * Hook into the query builder to add the tagging info to the correct query
  */
 function privatemsg_filter_privatemsg_list_alter(&$fragments) {
-  $count = 0;
-
   // Filter the message listing by any set tags.
-  if (isset($_GET['tags'])) {
-    $tags = explode(' ', check_plain($_GET['tags']));
-    foreach ($tags as $tag) {
-      $tag_id = db_result(db_query('SELECT tag_id FROM {pm_tags} WHERE tag = "%s"', $tag));
-      
-      $fragments['inner_join'][]  = "INNER JOIN {pm_tags_index} pmti$count";
-      $fragments['where'][]       = "pmi.thread_id = pmti$count.thread_id";
-      $fragments['where'][]       = "pmti$count.uid = pmi.uid";
-      $fragments['where'][]       = "pmti$count.tag_id = %d";
-      $fragments['query_args'][]  = $tag_id;
+  if (isset($_SESSION['privatemsg_filter']) && !empty($_SESSION['privatemsg_filter'])) {
+    $filter = $_SESSION['privatemsg_filter'];
       
-      $count++;
+    if (isset($filter['tags']) && !empty($filter['tags'])) {      
+      $fragments['inner_join'][]  = "INNER JOIN {pm_tags_index} pmti ON pmti.thread_id = pmi.thread_id";
+      $fragments['where'][]       = "pmti.uid = pmi.uid";
+      $fragments['where'][]       = "pmti.tag_id IN (". implode(', ', $filter['tags']) .")";
     }
+
+    if (isset($filter['author']) && !empty($filter['author'])) {
+      $fragments['where'][]       = "pm.author IN (". implode(', ', $filter['author']) .")";
   }
 
-  //Filter message listing to only show threads where a particular user has authored a message.
-  if (isset($_GET['author']) && $author = user_load(array('name' => $_GET['author']))) {  
-    $fragments['where'][]       = "pm.author = %d";
-    $fragments['query_args'][]  = $author->uid;
+    if (isset($filter['search']) && !empty($filter['search'])) {
+      $fragments['where'][]       = "pm.subject LIKE '%%%s%%'";
+      $fragments['query_args'][]    = '%'. $filter['search'] .'%';
+    }
   }
+
 }
 
 function privatemsg_filter_privatemsg_view_messages_alter(&$content, $count) {
