diff --git a/docs/lldb-gdb-remote.txt b/docs/lldb-gdb-remote.txt
index 6a9fef3..82907c9 100644
--- a/docs/lldb-gdb-remote.txt
+++ b/docs/lldb-gdb-remote.txt
@@ -484,6 +484,7 @@ ostype: is a string the represents the OS being debugged (darwin, linux, freebsd
 vendor: is a string that represents the vendor (apple)
 endian: is one of "little", "big", or "pdp"
 ptrsize: is a number that represents how big pointers are in bytes on the debug target
+adjusts_breakpoint_pc: is a number that represents how much PC should be adjusted after hitting a breakpoint
 
 //----------------------------------------------------------------------
 // "qGDBServerVersion"
diff --git a/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationClient.cpp b/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationClient.cpp
index 6a53a11..ac124e7 100644
--- a/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationClient.cpp
+++ b/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationClient.cpp
@@ -65,6 +65,7 @@ GDBRemoteCommunicationClient::GDBRemoteCommunicationClient(bool is_platform) :
     m_attach_or_wait_reply(eLazyBoolCalculate),
     m_prepare_for_reg_writing_reply (eLazyBoolCalculate),
     m_supports_p (eLazyBoolCalculate),
+    m_adjust_breakpoint_pc_available (eLazyBoolCalculate),
     m_supports_qProcessInfoPID (true),
     m_supports_qfProcessInfo (true),
     m_supports_qUserName (true),
@@ -88,7 +89,8 @@ GDBRemoteCommunicationClient::GDBRemoteCommunicationClient(bool is_platform) :
     m_process_arch(),
     m_os_version_major (UINT32_MAX),
     m_os_version_minor (UINT32_MAX),
-    m_os_version_update (UINT32_MAX)
+    m_os_version_update (UINT32_MAX),
+    m_adjust_breakpoint_pc_value (0)
 {
 }
 
@@ -208,6 +210,7 @@ GDBRemoteCommunicationClient::ResetDiscoverableSettings()
     m_supports_memory_region_info = eLazyBoolCalculate;
     m_prepare_for_reg_writing_reply = eLazyBoolCalculate;
     m_attach_or_wait_reply = eLazyBoolCalculate;
+    m_adjust_breakpoint_pc_available = eLazyBoolCalculate;
 
     m_supports_qProcessInfoPID = true;
     m_supports_qfProcessInfo = true;
@@ -1128,6 +1131,20 @@ GDBRemoteCommunicationClient::GetProcessArchitecture ()
     return m_process_arch;
 }
 
+bool
+GDBRemoteCommunicationClient::GetAdjustBreakpointPC (uint64_t* value)
+{
+    if (m_adjust_breakpoint_pc_available == eLazyBoolCalculate)
+        GetHostInfo ();
+
+    if (m_adjust_breakpoint_pc_available == eLazyBoolNo)
+        return false;
+
+    if(value != 0)
+        *value = m_adjust_breakpoint_pc_value;
+    return true;
+
+}
 
 bool
 GDBRemoteCommunicationClient::GetHostInfo (bool force)
@@ -1135,6 +1152,7 @@ GDBRemoteCommunicationClient::GetHostInfo (bool force)
     if (force || m_qHostInfo_is_valid == eLazyBoolCalculate)
     {
         m_qHostInfo_is_valid = eLazyBoolNo;
+        m_adjust_breakpoint_pc_available = eLazyBoolNo;
         StringExtractorGDBRemote response;
         if (SendPacketAndWaitForResponse ("qHostInfo", response, false))
         {
@@ -1249,7 +1267,13 @@ GDBRemoteCommunicationClient::GetHostInfo (bool force)
                         else
                             --num_keys_decoded;
                     }
-
+                    else if (name.compare ("adjusts_breakpoint_pc") == 0)
+                    {
+                        // This tells us if we need to adjust PC after hitting a breakpoint.
+                        num_keys_decoded++;
+                        m_adjust_breakpoint_pc_available = eLazyBoolYes;
+                        m_adjust_breakpoint_pc_value = Args::StringToUInt64 (value.c_str(), 0, 0);
+                    }
                 }
                 
                 if (num_keys_decoded > 0)
diff --git a/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationClient.h b/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationClient.h
index 535a69c..c28dc99 100644
--- a/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationClient.h
+++ b/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationClient.h
@@ -408,6 +408,14 @@ public:
     HarmonizeThreadIdsForProfileData (ProcessGDBRemote *process,
                                       StringExtractorGDBRemote &inputStringExtractor);
 
+    // Targets can tell if LLDB needs to adjust the PC after hitting a breakpoints.
+    // This information is provided using 'adjusts_breakpoint_pc' key in 'qHostInfo'.
+    // This function returns true if target provides this information. The actual
+    // value is returned in the pointer parameter. If target does not provide this
+    // information then this function returns false and value parameter is not touched.
+    bool
+    GetAdjustBreakpointPC (uint64_t* value);
+
 protected:
 
     bool
@@ -435,6 +443,7 @@ protected:
     lldb_private::LazyBool m_attach_or_wait_reply;
     lldb_private::LazyBool m_prepare_for_reg_writing_reply;
     lldb_private::LazyBool m_supports_p;
+    lldb_private::LazyBool m_adjust_breakpoint_pc_available;
     
     bool
         m_supports_qProcessInfoPID:1,
@@ -474,6 +483,7 @@ protected:
     std::string m_os_build;
     std::string m_os_kernel;
     std::string m_hostname;
+    uint64_t m_adjust_breakpoint_pc_value;
     
     bool
     DecodeProcessInfoResponse (StringExtractorGDBRemote &response, 
diff --git a/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp b/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp
index 4a3bd04..c35443c 100644
--- a/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp
+++ b/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp
@@ -97,12 +97,14 @@ namespace {
     g_properties[] =
     {
         { "packet-timeout" , OptionValue::eTypeUInt64 , true , 1, NULL, NULL, "Specify the default packet timeout in seconds." },
+        { "adjust-breakpoint-pc" , OptionValue::eTypeUInt64 , true , 0, NULL, NULL, "How much to adjust PC after hitting a breakpoint." },
         {  NULL            , OptionValue::eTypeInvalid, false, 0, NULL, NULL, NULL  }
     };
     
     enum
     {
-        ePropertyPacketTimeout
+        ePropertyPacketTimeout,
+        ePropertyAdjustPCAfterBreak
     };
     
     class PluginProperties : public Properties
@@ -133,6 +135,13 @@ namespace {
             const uint32_t idx = ePropertyPacketTimeout;
             return m_collection_sp->GetPropertyAtIndexAsUInt64(NULL, idx, g_properties[idx].default_uint_value);
         }
+
+        uint64_t
+        GetAdjustBreakpointPCValue () const
+        {
+            const uint32_t idx = ePropertyAdjustPCAfterBreak;
+            return m_collection_sp->GetPropertyAtIndexAsUInt64 (NULL, idx, g_properties[idx].default_uint_value);
+        }
     };
     
     typedef std::shared_ptr<PluginProperties> ProcessKDPPropertiesSP;
@@ -1657,7 +1666,12 @@ ProcessGDBRemote::SetThreadStopInfo (StringExtractor& stop_packet)
                             // Currently we are going to assume SIGTRAP means we are either
                             // hitting a breakpoint or hardware single stepping. 
                             handled = true;
+                            uint64_t adjust_breakpoint_pc_value = 0;
+                            if (!m_gdb_comm.GetAdjustBreakpointPC (&adjust_breakpoint_pc_value))
+                                adjust_breakpoint_pc_value = GetGlobalPluginProperties()->GetAdjustBreakpointPCValue ();
+
                             addr_t pc = thread_sp->GetRegisterContext()->GetPC();
+                            pc -= adjust_pc_breakpoint_value;
                             lldb::BreakpointSiteSP bp_site_sp = thread_sp->GetProcess()->GetBreakpointSiteList().FindByAddress(pc);
                             
                             if (bp_site_sp)
@@ -1667,6 +1681,8 @@ ProcessGDBRemote::SetThreadStopInfo (StringExtractor& stop_packet)
                                 // will be taken care of when the thread resumes and notices that there's a breakpoint under the pc.
                                 if (bp_site_sp->ValidForThisThread (thread_sp.get()))
                                 {
+                                    if(adjust_breakpoint_pc_value != 0)
+                                        thread_sp->GetRegisterContext()->SetPC (pc);
                                     thread_sp->SetStopInfo (StopInfo::CreateStopReasonWithBreakpointSiteID (*thread_sp, bp_site_sp->GetID()));
                                 }
                                 else
