diff --git a/source/Plugins/Process/POSIX/ProcessPOSIX.cpp b/source/Plugins/Process/POSIX/ProcessPOSIX.cpp
index 137fa46..ee4c081 100644
--- a/source/Plugins/Process/POSIX/ProcessPOSIX.cpp
+++ b/source/Plugins/Process/POSIX/ProcessPOSIX.cpp
@@ -328,11 +328,21 @@ ProcessPOSIX::DoDestroy()
     return error;
 }
 
+void ProcessPOSIX::SetThreadState(lldb::tid_t tid, lldb::StateType state)
+{
+    POSIXThread *thread = static_cast<POSIXThread*>(
+                              m_thread_list.FindThreadByID(tid, false).get());
+    if (thread)
+        thread->SetState(state);
+}
+
 void
 ProcessPOSIX::SendMessage(const ProcessMessage &message)
 {
     Mutex::Locker lock(m_message_mutex);
 
+    lldb::tid_t tid = message.GetTID();
+
     switch (message.GetKind())
     {
     case ProcessMessage::eInvalidMessage:
@@ -347,24 +357,29 @@ ProcessPOSIX::SendMessage(const ProcessMessage &message)
             m_monitor->Detach();
         }
         else
+        {
+            SetThreadState(tid, eStateStopped);
             SetPrivateState(eStateStopped);
+        }
         break;
 
     case ProcessMessage::eExitMessage:
         m_exit_status = message.GetExitStatus();
+        SetThreadState(tid, eStateExited);
         SetExitStatus(m_exit_status, NULL);
         break;
 
     case ProcessMessage::eTraceMessage:
     case ProcessMessage::eBreakpointMessage:
+        SetThreadState(tid, eStateStopped);
         SetPrivateState(eStateStopped);
         break;
 
     case ProcessMessage::eSignalMessage:
     case ProcessMessage::eSignalDeliveredMessage:
     {
-        lldb::tid_t tid = message.GetTID();
         lldb::tid_t pid = GetID();
+        SetThreadState(tid, eStateStopped);
         if (tid == pid) {
             SetPrivateState(eStateStopped);
             break;
@@ -376,10 +391,12 @@ ProcessPOSIX::SendMessage(const ProcessMessage &message)
 
     case ProcessMessage::eCrashMessage:
         // FIXME: Update stop reason as per bugzilla 14598
+        SetThreadState(tid, eStateStopped);
         SetPrivateState(eStateStopped);
         break;
 
     case ProcessMessage::eNewThreadMessage:
+        SetThreadState(tid, eStateStopped);
         SetPrivateState(eStateStopped);
         break;
     }
diff --git a/source/Plugins/Process/POSIX/ProcessPOSIX.h b/source/Plugins/Process/POSIX/ProcessPOSIX.h
index b16da3a..3c55a84 100644
--- a/source/Plugins/Process/POSIX/ProcessPOSIX.h
+++ b/source/Plugins/Process/POSIX/ProcessPOSIX.h
@@ -173,6 +173,9 @@ protected:
     /// Returns true if the process is stopped.
     bool IsStopped();
 
+    /// Sets the state of a process thread.
+    void SetThreadState(lldb::tid_t tid, lldb::StateType state);
+
     typedef std::map<lldb::addr_t, lldb::addr_t> MMapMap;
     MMapMap m_addr_to_mmap_size;
 };
