diff -urp privatemsg/privatemsg.install privatemsg_tags/privatemsg.install
--- privatemsg/privatemsg.install	2008-10-20 16:46:11.947800000 +0100
+++ privatemsg_tags/privatemsg.install	2008-10-20 22:22:24.784400000 +0100
@@ -107,6 +107,52 @@ function privatemsg_schema() {
     ),
   );
 
+  $schema['pm_tags'] = array(
+    'description'       => t('{pm_tags} holds the names of tags and their id'),
+    'fields'        => array(
+      'tag_id'    => array(
+        'description'   => t('Tag ID'),
+        'type'          => 'serial',
+        'not null'      => TRUE,
+        'unsigned'      => TRUE,
+      ),
+      'tag'     => array(
+        'description'   => t('The name of the tag'),
+        'type'          => 'varchar',
+        'length'        => 255,
+        'not null'      => TRUE,
+      ),
+    ),
+    'indexes'         => array(
+      '`tag_id`'               => array('`tag_id`','`tag`'),
+
+    ),
+  );
+
+  $schema['pm_tags_index'] = array(
+    'description'       => t('{pm_tags} holds the names of tags and their id'),
+    'fields'        => array(
+      'tag_id'    => array(
+        'description'   => t('Tag ID'),
+        'type'          => 'int',
+        'not null'      => TRUE,
+        'unsigned'      => TRUE,
+      ),
+      'uid'    => array(
+        'description'   => t('ID of the user'),
+        'type'          => 'int',
+        'not null'      => TRUE,
+        'unsigned'      => TRUE,
+      ),
+      'thread_id'    => array(
+        'description'   => t('id of the thread'),
+        'type'          => 'int',
+        'not null'      => TRUE,
+        'unsigned'      => TRUE,
+      ),
+    ),
+  );
+
   return $schema;
 }
 function privatemsg_install() {
diff -urp privatemsg/privatemsg.module privatemsg_tags/privatemsg.module
--- privatemsg/privatemsg.module	2008-10-20 19:01:45.472000000 +0100
+++ privatemsg_tags/privatemsg.module	2008-10-20 23:26:39.983800000 +0100
@@ -251,14 +251,24 @@ function privatemsg_list($uid = NULL) {
   }
   // By this point we have figured out for which user we are listing messages and now it is safe to use $account->uid in the listing query.
 
-//  drupal_set_message('<pre>'. print_r($uid, 1) .'</pre>');
-  switch (arg(1)) {
+  $tags = arg(1);
+  
+  switch ($tags) {
     case 'sent':
       $query = _privatemsg_assemble_query('privatemsg_list_sent', $account);
       break;
     case 'inbox':
-    default:
+    case '':
       $query = _privatemsg_assemble_query('privatemsg_list', $account);
+      break;
+    default:
+      if ($tag = db_result(db_query('SELECT tag_id FROM {pm_tags} WHERE tag = "%s"', $tags))) {
+        drupal_set_title('Messages tagged '. $tags);
+        $query = _privatemsg_assemble_query('privatemsg_list', $account, $tag);
+      }
+      else {
+        $query = _privatemsg_assemble_query('privatemsg_list', $account);
+      }
   }
   $result = db_query($query);
 
@@ -403,6 +413,10 @@ function privatemsg_set_new_status($acco
 function privatemsg_view($thread_id) {
   global $user;
   $output = '';
+  
+  // Add the tagging box
+  $output = drupal_get_form('privatemsg_tags');
+  
   // Load the message object.
   $query = _privatemsg_assemble_query('privatemsg_messages', $thread_id, $user->uid);
   $conversation = db_query($query);
@@ -422,7 +436,7 @@ function privatemsg_view($thread_id) {
       while ($result = db_fetch_object($participants)) {
         $message['participants'][] = user_load($result->uid);
       }
-      $output = theme('privatemsg_to', $message);
+      $output .= theme('privatemsg_to', $message);
     }
     $output .= theme('privatemsg_view', $message);
 
@@ -701,7 +715,7 @@ function privatemsg_privatemsg_list_sent
   $fragments['order_by'][]  = $order . ' ' . $sort;
 }
 
-function privatemsg_privatemsg_list_alter(&$fragments, $account) {
+function privatemsg_privatemsg_list_alter(&$fragments, $account, $tag = NULL) {
   $fragments['primary_table'] = '{pm_message} pm';
 
   $fragments['select'][]      = 'pmi.thread_id';
@@ -709,7 +723,14 @@ function privatemsg_privatemsg_list_alte
   $fragments['select'][]      = 'MAX(pm.timestamp) as timestamp';
   $fragments['select'][]      = 'MAX(pmi.new) as new';
   $fragments['inner_join'][]  = 'INNER JOIN {pm_index} pmi ON pm.mid = pmi.mid';
+  if (isset($tag) && $tag) {
+    $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 = 1';
+    $fragments['query_args'][]  = $tag;
+  }
   $fragments['where'][]       = 'pmi.uid = %d';
+  $fragments['query_args'][]  = $account->uid;
   $fragments['where'][]       = 'pmi.deleted = 0';
   $fragments['group_by'][]    = 'pmi.thread_id';
   $order = 'pmi.new';
@@ -725,7 +746,6 @@ function privatemsg_privatemsg_list_alte
     $sort = isset($_GET['sort']) && ($_GET['sort'] == 'asc' || $_GET['sort'] == 'desc') ? $_GET['sort'] : 'desc';
   }
   $fragments['order_by'][]  = $order . ' ' . $sort . ', timestamp DESC';
-  $fragments['query_args'][]  = $account->uid;
 
 }
 
@@ -1107,3 +1127,58 @@ function privatemsg_per_message_actions(
  return $output;
 }
 
+function privatemsg_tags($form_state) {
+  global $user;
+  $thread_id = arg(2);
+  
+  $form['tags'] = array(
+    '#type' => 'fieldset',
+    '#title' => t('Tags'),
+    '#collapsible' => TRUE,
+    '#collapsed' => TRUE,
+  );
+  $form['tags']['user_id'] = array(
+    '#type' => 'value',
+    '#value' => $user->uid,
+  );
+  $form['tags']['thread_id'] = array(
+    '#type' => 'value',
+    '#value' => $thread_id,
+  );
+  
+  $sql = 'SELECT * FROM {pm_tags}';
+  $query = db_query($sql);
+  $tag_array = array();
+  
+  while($result = db_fetch_object($query)) {
+    $checked = 0;
+    if (db_result(db_query('SELECT COUNT(*) FROM {pm_tags_index} WHERE tag_id = %d AND (uid = %d AND thread_id = %d)', $result->tag_id, $user->uid, $thread_id))) {
+      $checked = 1;
+    }
+    $form_data = array('#type' => 'checkbox', '#title' => $result->tag, '#default_value' => $checked, '#return_value' => 1);
+    $form['tags']['tag_' . $result->tag_id] = $form_data;  
+  }
+
+	$form['tags']['submit'] = array(
+		'#type'     => 'submit',
+		'#value'    => t('Submit'),
+	);
+
+  return $form;
+}
+
+function privatemsg_tags_submit($form, &$form_state) {
+  if (isset($form_state['values']['submit'])) {  
+    $sql = 'SELECT * FROM {pm_tags}';
+    $query = db_query($sql);
+    
+    while($result = db_fetch_object($query)) {
+      if ($form_state['values']['tag_' . $result->tag_id] == 0) {
+        db_query('DELETE FROM {pm_tags_index} WHERE tag_id = %d AND (uid = %d AND thread_id = %d)', $result->tag_id, $form_state['values']['user_id'], $form_state['values']['thread_id']);
+      }
+      elseif (db_result(db_query('SELECT COUNT(*) FROM {pm_tags_index} WHERE tag_id = %d AND (uid = %d AND thread_id = %d)', $result->tag_id, $form_state['values']['user_id'], $form_state['values']['thread_id'])) == 0) {
+        db_query('INSERT INTO {pm_tags_index} (tag_id, uid, thread_id) VALUES (%d, %d, %d)', $result->tag_id, $form_state['values']['user_id'], $form_state['values']['thread_id']);
+      }
+    }
+  }
+}
