diff --git a/include/lldb/Target/Thread.h b/include/lldb/Target/Thread.h
index c1cd2a7..ceea1dd 100644
--- a/include/lldb/Target/Thread.h
+++ b/include/lldb/Target/Thread.h
@@ -277,6 +277,10 @@ public:
     virtual void
     DidResume ();
 
+    // This notifies the thread when a private stop occurs.
+    virtual void
+    DidStop ();
+
     virtual void
     RefreshStateAfterStop() = 0;
 
diff --git a/include/lldb/Target/ThreadList.h b/include/lldb/Target/ThreadList.h
index f1d699d..3ea96fb 100644
--- a/include/lldb/Target/ThreadList.h
+++ b/include/lldb/Target/ThreadList.h
@@ -120,6 +120,9 @@ public:
     DidResume ();
 
     void
+    DidStop ();
+
+    void
     DiscardThreadPlans();
 
     uint32_t
diff --git a/source/Target/Process.cpp b/source/Target/Process.cpp
index fda7106..8a09f16 100644
--- a/source/Target/Process.cpp
+++ b/source/Target/Process.cpp
@@ -1735,6 +1735,7 @@ Process::SetPrivateState (StateType new_state)
         m_private_state.SetValueNoLock (new_state);
         if (StateIsStoppedState(new_state, false))
         {
+            m_thread_list.DidStop();
             m_mod_id.BumpStopID();
             m_memory_cache.Clear();
             if (log)
diff --git a/source/Target/Thread.cpp b/source/Target/Thread.cpp
index 5096a91..6459c3f 100644
--- a/source/Target/Thread.cpp
+++ b/source/Target/Thread.cpp
@@ -589,6 +589,12 @@ Thread::DidResume ()
     SetResumeSignal (LLDB_INVALID_SIGNAL_NUMBER);
 }
 
+void
+Thread::DidStop ()
+{
+    SetState (eStateStopped);
+}
+
 bool
 Thread::ShouldStop (Event* event_ptr)
 {
diff --git a/source/Target/ThreadList.cpp b/source/Target/ThreadList.cpp
index 80df595..6f7a7cc 100644
--- a/source/Target/ThreadList.cpp
+++ b/source/Target/ThreadList.cpp
@@ -11,6 +11,7 @@
 #include <algorithm>
 
 #include "lldb/Core/Log.h"
+#include "lldb/Core/State.h"
 #include "lldb/Target/RegisterContext.h"
 #include "lldb/Target/ThreadList.h"
 #include "lldb/Target/Thread.h"
@@ -635,6 +636,20 @@ ThreadList::DidResume ()
     }
 }
 
+void
+ThreadList::DidStop ()
+{
+    Mutex::Locker locker(GetMutex());
+    collection::iterator pos, end = m_threads.end();
+    for (pos = m_threads.begin(); pos != end; ++pos)
+    {
+        // Notify threads that the process just stopped.
+        ThreadSP thread_sp(*pos);
+        if (StateIsRunningState(thread_sp->GetState()))
+            thread_sp->DidStop ();
+    }
+}
+
 ThreadSP
 ThreadList::GetSelectedThread ()
 {
diff --git a/test/functionalities/thread/state/TestThreadStates.py b/test/functionalities/thread/state/TestThreadStates.py
index 7e59b22..185eb50 100644
--- a/test/functionalities/thread/state/TestThreadStates.py
+++ b/test/functionalities/thread/state/TestThreadStates.py
@@ -14,14 +14,12 @@ class StopThreadsTestCase(TestBase):
 
     @unittest2.skipUnless(sys.platform.startswith("darwin"), "requires Darwin")
     @dsym_test
-    @unittest2.expectedFailure("PR-15824") # thread states not properly maintained
     def test_state_after_breakpoint_with_dsym(self):
         """Test thread state after breakpoint."""
         self.buildDsym()
         self.thread_state_after_breakpoint_test()
 
     @dwarf_test
-    @unittest2.expectedFailure("PR-15824") # thread states not properly maintained
     def test_state_after_breakpoint_with_dwarf(self):
         """Test thread state after breakpoint."""
         self.buildDwarf()
