diff --git a/docs/lldb-gdb-remote.txt b/docs/lldb-gdb-remote.txt
index 30d5323..252c56b 100644
--- a/docs/lldb-gdb-remote.txt
+++ b/docs/lldb-gdb-remote.txt
@@ -529,6 +529,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 7761b16..b110a53 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),
@@ -90,7 +91,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)
 {
 }
 
@@ -1178,6 +1180,23 @@ GDBRemoteCommunicationClient::GetProcessArchitecture ()
     return m_process_arch;
 }
 
+bool
+GDBRemoteCommunicationClient::AdjustBreakpointPCAvailable ()
+{
+    if (m_adjust_breakpoint_pc_available == eLazyBoolCalculate)
+        GetHostInfo ();
+
+    return m_adjust_breakpoint_pc_available;
+}
+
+int32_t
+GDBRemoteCommunicationClient::GetAdjustBreakpointPC ()
+{
+    if (m_adjust_breakpoint_pc_available == eLazyBoolCalculate)
+        GetHostInfo ();
+
+    return m_adjust_breakpoint_pc_value;
+}
 
 bool
 GDBRemoteCommunicationClient::GetHostInfo (bool force)
@@ -1185,6 +1204,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))
         {
@@ -1299,6 +1319,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::StringToSInt32 (value.c_str(), 0, 0);
+                    }
 
                 }
                 
diff --git a/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationClient.h b/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationClient.h
index 97c3f9f..83f2a11 100644
--- a/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationClient.h
+++ b/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationClient.h
@@ -408,6 +408,19 @@ public:
     HarmonizeThreadIdsForProfileData (ProcessGDBRemote *process,
                                       StringExtractorGDBRemote &inputStringExtractor);
 
+    // Targets can tell if LLDB needs to adjust the PC after hitting a breakpoint.
+    // This information is provided using 'adjusts_breakpoint_pc' key in 'qHostInfo'.
+    // This function tells how much PC should be adjusted. It should only be called
+    // if AdjustBreakpointPCAvailable() returns true.
+    int32_t
+    GetAdjustBreakpointPC ();
+
+    // Targets can tell if LLDB needs to adjust the PC after hitting a breakpoint.
+    // This information is provided using 'adjusts_breakpoint_pc' key in 'qHostInfo'.
+    // This function returns true if qHostInfo provided this information.
+    bool
+    AdjustBreakpointPCAvailable ();
+
 protected:
 
     bool
@@ -435,6 +448,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,
@@ -476,6 +490,7 @@ protected:
     std::string m_os_build;
     std::string m_os_kernel;
     std::string m_hostname;
+    int32_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 e44d7a3..5d04156 100644
--- a/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp
+++ b/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp
@@ -99,13 +99,17 @@ namespace {
     {
         { "packet-timeout" , OptionValue::eTypeUInt64 , true , 1, NULL, NULL, "Specify the default packet timeout in seconds." },
         { "target-definition-file" , OptionValue::eTypeFileSpec , true, 0 , NULL, NULL, "The file that provides the description for remote target registers." },
+        { "adjust-breakpoint-pc" , OptionValue::eTypeArray , true , OptionValue::eTypeString, NULL, NULL, "How much to adjust PC after hitting a breakpoint for a given target."
+                                                                                     "The value should be in the form of key/value pair. Key and value should be separated by colon and pairs should be separated by space."
+                                                                                     "Key should be target triple and value should be the PC adjustment required." },
         {  NULL            , OptionValue::eTypeInvalid, false, 0, NULL, NULL, NULL  }
     };
     
     enum
     {
         ePropertyPacketTimeout,
-        ePropertyTargetDefinitionFile
+        ePropertyTargetDefinitionFile,
+        ePropertyAdjustPCAfterBreak
     };
     
     class PluginProperties : public Properties
@@ -142,6 +146,12 @@ namespace {
             const uint32_t idx = ePropertyTargetDefinitionFile;
             return m_collection_sp->GetPropertyAtIndexAsFileSpec (NULL, idx);
         }
+        bool
+        GetAdjustBreakpointPCValue (Args &args) const
+        {
+            const uint32_t idx = ePropertyAdjustPCAfterBreak;
+            return m_collection_sp->GetPropertyAtIndexAsArgs (NULL, idx, args);
+        }
     };
     
     typedef std::shared_ptr<PluginProperties> ProcessKDPPropertiesSP;
@@ -272,7 +282,9 @@ ProcessGDBRemote::ProcessGDBRemote(Target& target, Listener &listener) :
     m_thread_create_bp_sp (),
     m_waiting_for_attach (false),
     m_destroy_tried_resuming (false),
-    m_command_sp ()
+    m_command_sp (),
+    m_breakpoint_pc_adjust_value (0),
+    m_pc_adjust_value_checked (eLazyBoolCalculate)
 {
     m_async_broadcaster.SetEventName (eBroadcastBitAsyncThreadShouldExit,   "async thread should exit");
     m_async_broadcaster.SetEventName (eBroadcastBitAsyncContinue,           "async thread continue");
@@ -343,6 +355,46 @@ ProcessGDBRemote::ParsePythonTargetDefinition(const FileSpec &target_definition_
     return false;
 }
 
+void
+ProcessGDBRemote::CheckAdjustBreakpointPCSettings ()
+{
+    if(m_pc_adjust_value_checked == eLazyBoolCalculate)
+    {
+        if (m_gdb_comm.AdjustBreakpointPCAvailable ())
+        {
+            m_pc_adjust_value_checked = eLazyBoolYes;
+            m_breakpoint_pc_adjust_value = m_gdb_comm.GetAdjustBreakpointPC();
+            return;
+        }
+
+        const ArchSpec &target_arch = GetTarget().GetArchitecture();
+
+        if (target_arch.IsValid())
+        {
+            m_pc_adjust_value_checked = eLazyBoolYes;
+            Args args;
+            if (GetGlobalPluginProperties()->GetAdjustBreakpointPCValue (args))
+            {
+                size_t size = args.GetArgumentCount ();
+                for(size_t i = 0; i < size; ++i)
+                {
+                    const char* key_value = args.GetArgumentAtIndex (i);
+                    const char* colon_position = ::strchr (key_value,':');
+                    if (colon_position)
+                    {
+                        std::string triple_string(key_value, colon_position - key_value);
+                        ArchSpec arch (triple_string.c_str());
+                        if (arch.IsValid () && arch.IsCompatibleMatch (target_arch))
+                        {
+                            m_breakpoint_pc_adjust_value = Args::StringToSInt32 (colon_position + 1, 0, 0, NULL);
+                            break;
+                        }
+                    }
+                }
+            }
+        }
+    }
+}
 
 void
 ProcessGDBRemote::BuildDynamicRegisterInfo (bool force)
@@ -1712,9 +1764,10 @@ ProcessGDBRemote::SetThreadStopInfo (StringExtractor& stop_packet)
                         if (signo == SIGTRAP)
                         {
                             // Currently we are going to assume SIGTRAP means we are either
-                            // hitting a breakpoint or hardware single stepping. 
+                            // hitting a breakpoint or hardware single stepping.
+                            CheckAdjustBreakpointPCSettings ();
                             handled = true;
-                            addr_t pc = thread_sp->GetRegisterContext()->GetPC();
+                            addr_t pc = thread_sp->GetRegisterContext()->GetPC() - m_breakpoint_pc_adjust_value;
                             lldb::BreakpointSiteSP bp_site_sp = thread_sp->GetProcess()->GetBreakpointSiteList().FindByAddress(pc);
                             
                             if (bp_site_sp)
@@ -1724,6 +1777,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 (m_breakpoint_pc_adjust_value != 0)
+                                        thread_sp->GetRegisterContext()->SetPC(pc);
                                     thread_sp->SetStopInfo (StopInfo::CreateStopReasonWithBreakpointSiteID (*thread_sp, bp_site_sp->GetID()));
                                 }
                                 else
diff --git a/source/Plugins/Process/gdb-remote/ProcessGDBRemote.h b/source/Plugins/Process/gdb-remote/ProcessGDBRemote.h
index ef79d77..8eaeb9a 100644
--- a/source/Plugins/Process/gdb-remote/ProcessGDBRemote.h
+++ b/source/Plugins/Process/gdb-remote/ProcessGDBRemote.h
@@ -297,6 +297,12 @@ protected:
     bool
     ParseRegisters(lldb_private::ScriptInterpreterObject *registers_array);
 
+    // This function tries to get the information about how much to adjust the PC after
+    // hitting a breakpoints. It first checks if qHostInfo packet provided this information.
+    // In its absence, it reverts to a global setting.
+    void
+    CheckAdjustBreakpointPCSettings ();
+
     //------------------------------------------------------------------
     /// Broadcaster event bits definitions.
     //------------------------------------------------------------------
@@ -339,6 +345,8 @@ protected:
     bool m_waiting_for_attach;
     bool m_destroy_tried_resuming;
     lldb::CommandObjectSP m_command_sp;
+    int32_t m_breakpoint_pc_adjust_value;
+    lldb_private::LazyBool m_pc_adjust_value_checked;
     
     bool
     StartAsyncThread ();
