diff --git a/privatemsg.install b/privatemsg.install
index ed83c20..9e822e7 100644
--- a/privatemsg.install
+++ b/privatemsg.install
@@ -52,6 +52,13 @@ function privatemsg_schema() {
         'not null' => TRUE,
         'default' => 'user'
       ),
+      'is_replied'     => array(
+        'description'   => 'Whether the user has replied to this message',
+        'type'          => 'int',
+        'default'       => PRIVATEMSG_NOT_REPLIED,
+        'not null'      => TRUE,
+        'unsigned'      => TRUE,
+      ),
     ),
     'primary key'     => array('mid', 'recipient', 'type'),
     'indexes'         => array(
@@ -336,3 +343,18 @@ function privatemsg_update_7006() {
   variable_set("date_format_privatemsg_current_year", 'M j');
   variable_set("date_format_privatemsg_years", 'n/j/y');
 }
+
+/**
+ * Add replied field to track whether anyone has replied to a message.
+ */
+function privatemsg_update_7007() {
+  db_add_field('pm_index', 'is_replied', 
+    array(
+      'description'   => 'Whether the user has replied to this message',
+      'type'          => 'int',
+      'default'       => PRIVATEMSG_NOT_REPLIED,
+      'not null'      => TRUE,
+      'unsigned'      => TRUE,
+    )
+  );
+}
diff --git a/privatemsg.module b/privatemsg.module
index d8286f6..71f8fbe 100644
--- a/privatemsg.module
+++ b/privatemsg.module
@@ -17,6 +17,14 @@ define('PRIVATEMSG_UNREAD', 1);
  * Show unlimited messages in a thread.
  */
 define('PRIVATEMSG_UNLIMITED', 'unlimited');
+/**
+ * Status constant for unreplied messages.
+ */
+define('PRIVATEMSG_NOT_REPLIED', 0);
+/**
+ * Status constant for replied messages.
+ */
+define('PRIVATEMSG_REPLIED', 1);
 
 /**
  * Implements hook_permission().
@@ -1667,6 +1675,16 @@ function privatemsg_reply($thread_id, $body, $options = array()) {
       _privatemsg_handle_recipients($validated['message']->mid, $validated['message']->recipients, FALSE);
     }
   }
+  
+  // Mark the last message as replied
+  $thread = privatemsg_thread_load($thread_id);
+  $reply_to_mid = end($thread['messages'])->mid;
+  db_update('pm_index')
+    ->fields(array('is_replied' => PRIVATEMSG_REPLIED))
+    ->condition('mid', $reply_to_mid)
+    ->condition('recipient', $author->uid)
+    ->execute();
+  
   return $validated;
 }
 
diff --git a/privatemsg.pages.inc b/privatemsg.pages.inc
index 243e5d9..3809a9b 100644
--- a/privatemsg.pages.inc
+++ b/privatemsg.pages.inc
@@ -394,6 +394,13 @@ function privatemsg_form_reply($form, &$form_state, $thread) {
     '#weight' => 20,
   );
 
+  // Include the mid of the message we're responding to so we can mark it as 
+  // replied when the form is submitted.
+  $reply_to_mid = end($thread['messages'])->mid;
+  $form['reply_to_mid'] = array(
+    '#type' => 'value',
+    '#value' => $reply_to_mid,    
+  );
   $form['thread_id'] = array(
     '#type' => 'value',
     '#value' => $thread['thread_id'],
@@ -674,22 +681,34 @@ function privatemsg_new_submit($form, &$form_state) {
     $message = _privatemsg_send($message);
     _privatemsg_handle_recipients($message->mid, $message->recipients);
     drupal_set_message(t('A message has been sent to !recipients.', array('!recipients' => implode(', ', $recipient_names))));
-    // Only redirect on new threads.
-    if ($message->mid == $message->thread_id || variable_get('privatemsg_default_redirect_reply', FALSE)) {
-      $redirect = variable_get('privatemsg_default_redirect', '<new-message>');
-      if ($redirect == '<new-message>' || (!empty($_REQUEST['destination']) && $_REQUEST['destination'] == '[new-message]')) {
-        if (!empty($_REQUEST['destination']) && $_REQUEST['destination'] == '[new-message]') {
-          // Remove GET param so that drupal_goto() uses the redirect from
-          // $form_state.
-          unset($_GET['destination']);
+    // Is this a new thread or a reply? If it is a reply we need to flag the message as replied to.
+    // Otherwise we need to check if we should redirect.    
+    if ($message->mid == $message->thread_id) {
+      if ((variable_get('privatemsg_default_redirect_reply', FALSE))) {
+        $redirect = variable_get('privatemsg_default_redirect', '<new-message>');
+        if ($redirect == '<new-message>' || (!empty($_REQUEST['destination']) && $_REQUEST['destination'] == '[new-message]')) {
+          if (!empty($_REQUEST['destination']) && $_REQUEST['destination'] == '[new-message]') {
+            // Remove GET param so that drupal_goto() uses the redirect from
+            // $form_state.
+            unset($_GET['destination']);
+          }
+          // Forward to the new message in the thread.
+          $form_state['redirect'] = array('messages/view/' . $message->thread_id, array('fragment' => 'privatemsg-mid-' . $message->mid));
+        }
+        elseif (!empty($redirect)) {
+          $form_state['redirect'] = $redirect;
         }
-        // Forward to the new message in the thread.
-        $form_state['redirect'] = array('messages/view/' . $message->thread_id, array('fragment' => 'privatemsg-mid-' . $message->mid));
-      }
-      elseif (!empty($redirect)) {
-        $form_state['redirect'] = $redirect;
       }
     }
+    else {
+      // This is not a new thread, so it must be a reply. Mark the last 
+      // received message as replied.
+      db_update('pm_index')
+        ->fields(array('is_replied' => PRIVATEMSG_REPLIED))
+        ->condition('mid', check_plain($form_state['values']['reply_to_mid']))
+        ->condition('recipient', $message->author->uid)
+        ->execute();
+    }
   }
   catch (Exception $e) {
     if (error_displayable()) {
