diff --git source/Breakpoint/BreakpointLocation.cpp source/Breakpoint/BreakpointLocation.cpp
index af868dc..a375928 100644
--- source/Breakpoint/BreakpointLocation.cpp
+++ source/Breakpoint/BreakpointLocation.cpp
@@ -537,6 +537,7 @@ bool
 BreakpointLocation::SetBreakpointSite (BreakpointSiteSP& bp_site_sp)
 {
     m_bp_site_sp = bp_site_sp;
+    SendBreakpointLocationChangedEvent (eBreakpointEventTypeLocationsResolved);
     return true;
 }
 
diff --git tools/lldb-mi/MICmdCmdData.cpp tools/lldb-mi/MICmdCmdData.cpp
index 9e25e54..de95fd8 100644
--- tools/lldb-mi/MICmdCmdData.cpp
+++ tools/lldb-mi/MICmdCmdData.cpp
@@ -360,18 +360,10 @@ CMICmdCmdDataDisassemble::ParseArgs(void)
 bool
 CMICmdCmdDataDisassemble::Execute(void)
 {
-    CMICMDBASE_GETOPTION(pArgThread, OptionLong, m_constStrArgThread);
     CMICMDBASE_GETOPTION(pArgAddrStart, OptionShort, m_constStrArgAddrStart);
     CMICMDBASE_GETOPTION(pArgAddrEnd, OptionShort, m_constStrArgAddrEnd);
     CMICMDBASE_GETOPTION(pArgMode, Number, m_constStrArgMode);
 
-    // Retrieve the --thread option's thread ID (only 1)
-    MIuint64 nThreadId = UINT64_MAX;
-    if (pArgThread->GetFound() && !pArgThread->GetExpectedOption<CMICmdArgValNumber, MIuint64>(nThreadId))
-    {
-        SetError(CMIUtilString::Format(MIRSRC(IDS_CMD_ERR_THREAD_INVALID), m_cmdData.strMiCmd.c_str(), m_constStrArgThread.c_str()));
-        return MIstatus::failure;
-    }
     CMIUtilString strAddrStart;
     if (!pArgAddrStart->GetExpectedOption<CMICmdArgValString, CMIUtilString>(strAddrStart))
     {
@@ -568,7 +560,7 @@ CMICmdCmdDataReadMemoryBytes::ParseArgs(void)
     bOk =
         bOk &&
         m_setCmdArgs.Add(*(new CMICmdArgValOptionShort(m_constStrArgByteOffset, false, true, CMICmdArgValListBase::eArgValType_Number, 1)));
-    bOk = bOk && m_setCmdArgs.Add(*(new CMICmdArgValNumber(m_constStrArgAddrStart, true, true, CMICmdArgValNumber::eArgValNumberFormat_Auto)));
+    bOk = bOk && m_setCmdArgs.Add(*(new CMICmdArgValString(m_constStrArgAddrStart, true, true, false, true)));
     bOk = bOk && m_setCmdArgs.Add(*(new CMICmdArgValNumber(m_constStrArgNumBytes, true, true)));
     return (bOk && ParseValidateCmdOptions());
 }
@@ -585,11 +577,12 @@ CMICmdCmdDataReadMemoryBytes::ParseArgs(void)
 bool
 CMICmdCmdDataReadMemoryBytes::Execute(void)
 {
-    CMICMDBASE_GETOPTION(pArgAddrStart, Number, m_constStrArgAddrStart);
+    CMICMDBASE_GETOPTION(pArgAddrStart, String, m_constStrArgAddrStart);
     CMICMDBASE_GETOPTION(pArgAddrOffset, Number, m_constStrArgByteOffset);
     CMICMDBASE_GETOPTION(pArgNumBytes, Number, m_constStrArgNumBytes);
 
-    const MIuint64 nAddrStart = pArgAddrStart->GetValue();
+    MIint64 nAddrStart = 0;
+    pArgAddrStart->GetValue().ExtractNumber(nAddrStart);
     const MIuint64 nAddrNumBytes = pArgNumBytes->GetValue();
     if (pArgAddrOffset->GetFound())
         m_nAddrOffset = pArgAddrOffset->GetValue();
diff --git tools/lldb-mi/MICmdCmdExec.cpp tools/lldb-mi/MICmdCmdExec.cpp
index 20d0fcd..1bc45f0 100644
--- tools/lldb-mi/MICmdCmdExec.cpp
+++ tools/lldb-mi/MICmdCmdExec.cpp
@@ -92,9 +92,29 @@ CMICmdCmdExecRun::Execute(void)
     CMICmnLLDBDebugSessionInfo &rSessionInfo(CMICmnLLDBDebugSessionInfo::Instance());
     lldb::SBError error;
     lldb::SBStream errMsg;
-    lldb::SBLaunchInfo launchInfo = rSessionInfo.GetTarget().GetLaunchInfo();
-    launchInfo.SetListener(rSessionInfo.GetListener());
-    lldb::SBProcess process = rSessionInfo.GetTarget().Launch(launchInfo, error);
+    
+    lldb::SBProcess process;
+    if (rSessionInfo.GetProcess().IsValid() && rSessionInfo.GetProcess().GetState() == lldb::StateType::eStateConnected)
+    {
+        // remote process that has not yet been launched
+        uint32_t launch_flags = lldb::LaunchFlags::eLaunchFlagDebug | lldb::LaunchFlags::eLaunchFlagDisableSTDIO;
+        process = rSessionInfo.GetProcess();
+        process.RemoteLaunch(nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, launch_flags, false, error);
+        if (!error.Fail() && process.GetState() == lldb::StateType::eStateStopped)
+        {
+            // gdbremote package seems to return with process stopped on entry even when stop_on_entry is false
+            const MIchar *pCmd = "continue";
+            const lldb::ReturnStatus rtn = rSessionInfo.GetDebugger().GetCommandInterpreter().HandleCommand(pCmd, m_lldbResult);
+            MIunused(rtn);
+        }
+    }
+    else
+    {
+        lldb::SBLaunchInfo launchInfo = rSessionInfo.GetTarget().GetLaunchInfo();
+        launchInfo.SetListener(rSessionInfo.GetListener());
+        process = rSessionInfo.GetTarget().Launch(launchInfo, error);
+    }
+
     if ((!process.IsValid()) || (error.Fail()))
     {
         SetError(CMIUtilString::Format(MIRSRC(IDS_CMD_ERR_INVALID_PROCESS), m_cmdData.strMiCmd.c_str(), errMsg.GetData()));
@@ -1182,6 +1202,7 @@ bool
 CMICmdCmdExecAbort::Execute(void)
 {
     CMICmnLLDBDebugSessionInfo &rSessionInfo(CMICmnLLDBDebugSessionInfo::Instance());
+
     lldb::SBProcess sbProcess = rSessionInfo.GetProcess();
     if (!sbProcess.IsValid())
     {
diff --git tools/lldb-mi/MICmdCmdExec.h tools/lldb-mi/MICmdCmdExec.h
index 1a1281f..4df0a15 100644
--- tools/lldb-mi/MICmdCmdExec.h
+++ tools/lldb-mi/MICmdCmdExec.h
@@ -345,6 +345,7 @@ class CMICmdCmdExecArguments : public CMICmdBase
 //++ ============================================================================
 // Details: MI command class. MI commands derived from the command base class.
 //          *this class implements MI command "exec-abort".
+// Changes: None.
 //--
 class CMICmdCmdExecAbort : public CMICmdBase
 {
@@ -364,4 +365,8 @@ class CMICmdCmdExecAbort : public CMICmdBase
     virtual bool Acknowledge(void);
     // From CMICmnBase
     /* dtor */ virtual ~CMICmdCmdExecAbort(void);
+    
+    // Attributes:
+private:
+    lldb::SBCommandReturnObject m_lldbResult;
 };
diff --git tools/lldb-mi/MICmdCmdFile.cpp tools/lldb-mi/MICmdCmdFile.cpp
index 83862f2..61192d2 100644
--- tools/lldb-mi/MICmdCmdFile.cpp
+++ tools/lldb-mi/MICmdCmdFile.cpp
@@ -29,7 +29,10 @@
 #include "MICmnLLDBDebugSessionInfo.h"
 #include "MIUtilFileStd.h"
 #include "MICmdArgValFile.h"
+#include "MICmdArgValString.h"
 #include "MICmdArgValOptionLong.h"
+#include "MICmdArgValOptionShort.h"
+
 
 //++ ------------------------------------------------------------------------------------
 // Details: CMICmdCmdFileExecAndSymbols constructor.
@@ -41,6 +44,8 @@
 CMICmdCmdFileExecAndSymbols::CMICmdCmdFileExecAndSymbols(void)
     : m_constStrArgNameFile("file")
     , m_constStrArgThreadGrp("thread-group")
+    , m_constStrArgNamedPlatformName("p")
+    , m_constStrArgNamedRemotePath("r")
 {
     // Command factory matches this name with that received from the stdin stream
     m_strMiCmd = "file-exec-and-symbols";
@@ -75,6 +80,12 @@ CMICmdCmdFileExecAndSymbols::ParseArgs(void)
     bool bOk = m_setCmdArgs.Add(
         *(new CMICmdArgValOptionLong(m_constStrArgThreadGrp, false, false, CMICmdArgValListBase::eArgValType_ThreadGrp, 1)));
     bOk = bOk && m_setCmdArgs.Add(*(new CMICmdArgValFile(m_constStrArgNameFile, true, true)));
+    bOk = bOk &&
+    m_setCmdArgs.Add(*(new CMICmdArgValOptionShort(m_constStrArgNamedPlatformName, false, true,
+                                                   CMICmdArgValListBase::eArgValType_String, 1)));
+    bOk = bOk &&
+    m_setCmdArgs.Add(*(new CMICmdArgValOptionShort(m_constStrArgNamedRemotePath, false, true,
+                                                   CMICmdArgValListBase::eArgValType_StringQuoted, 1)));
     return (bOk && ParseValidateCmdOptions());
 }
 
@@ -93,13 +104,23 @@ bool
 CMICmdCmdFileExecAndSymbols::Execute(void)
 {
     CMICMDBASE_GETOPTION(pArgNamedFile, File, m_constStrArgNameFile);
+    CMICMDBASE_GETOPTION(pArgPlatformName, OptionShort, m_constStrArgNamedPlatformName);
+    CMICMDBASE_GETOPTION(pArgRemotePath, OptionShort, m_constStrArgNamedRemotePath);
+
     CMICmdArgValFile *pArgFile = static_cast<CMICmdArgValFile *>(pArgNamedFile);
     const CMIUtilString &strExeFilePath(pArgFile->GetValue());
+    bool bPlatformName = pArgPlatformName->GetFound();
+    CMIUtilString platformName("");
+    if (bPlatformName)
+    {
+        pArgPlatformName->GetExpectedOption<CMICmdArgValString, CMIUtilString>(platformName);
+    }
+
     CMICmnLLDBDebugSessionInfo &rSessionInfo(CMICmnLLDBDebugSessionInfo::Instance());
     lldb::SBDebugger &rDbgr = rSessionInfo.GetDebugger();
     lldb::SBError error;
     const MIchar *pTargetTriple = nullptr; // Let LLDB discover the triple required
-    const MIchar *pTargetPlatformName = "";
+    const MIchar *pTargetPlatformName = platformName.c_str();
     const bool bAddDepModules = false;
     lldb::SBTarget target = rDbgr.CreateTarget(strExeFilePath.c_str(), pTargetTriple, pTargetPlatformName, bAddDepModules, error);
     CMIUtilString strWkDir;
@@ -118,7 +139,19 @@ CMICmdCmdFileExecAndSymbols::Execute(void)
 
         SetError(CMIUtilString::Format(MIRSRC(IDS_CMD_ERR_FNFAILED), m_cmdData.strMiCmd.c_str(), "SetCurrentPlatformSDKRoot()"));
         return MIstatus::failure;
+    
+    }
+    if (pArgRemotePath->GetFound())
+    {
+        CMIUtilString remotePath;
+        pArgRemotePath->GetExpectedOption<CMICmdArgValString, CMIUtilString>(remotePath);
+        lldb::SBModule module = target.GetModuleAtIndex(0);
+        if (module.IsValid())
+        {
+            module.SetPlatformFileSpec(lldb::SBFileSpec(remotePath.c_str()));
+        }
     }
+    
     lldb::SBStream err;
     if (error.Fail())
     {
diff --git tools/lldb-mi/MICmdCmdFile.h tools/lldb-mi/MICmdCmdFile.h
index 5e23c85..cee2996 100644
--- tools/lldb-mi/MICmdCmdFile.h
+++ tools/lldb-mi/MICmdCmdFile.h
@@ -69,4 +69,6 @@ class CMICmdCmdFileExecAndSymbols : public CMICmdBase
     const CMIUtilString m_constStrArgNameFile;
     const CMIUtilString
         m_constStrArgThreadGrp; // Not handled by *this command. Not specified in MI spec but Eclipse gives this option sometimes
+    const CMIUtilString m_constStrArgNamedPlatformName; //added to support iOS platform selection
+    const CMIUtilString m_constStrArgNamedRemotePath; //added to support iOS device remote file location
 };
diff --git tools/lldb-mi/MICmdCmdGdbSet.cpp tools/lldb-mi/MICmdCmdGdbSet.cpp
index c1c1bb5..8235a33 100644
--- tools/lldb-mi/MICmdCmdGdbSet.cpp
+++ tools/lldb-mi/MICmdCmdGdbSet.cpp
@@ -32,6 +32,7 @@
 const CMICmdCmdGdbSet::MapGdbOptionNameToFnGdbOptionPtr_t CMICmdCmdGdbSet::ms_mapGdbOptionNameToFnGdbOptionPtr = {
     // { "target-async", &CMICmdCmdGdbSet::OptionFnTargetAsync },       // Example code if need to implement GDB set other options
     // { "auto-solib-add", &CMICmdCmdGdbSet::OptionFnAutoSolibAdd },    // Example code if need to implement GDB set other options
+    {"output-radix", &CMICmdCmdGdbSet::OptionFnOutputRadix},
     {"solib-search-path", &CMICmdCmdGdbSet::OptionFnSolibSearchPath},
     {"fallback", &CMICmdCmdGdbSet::OptionFnFallback}};
 
@@ -248,6 +249,58 @@ CMICmdCmdGdbSet::OptionFnSolibSearchPath(const CMIUtilString::VecString_t &vrWor
 }
 
 //++ ------------------------------------------------------------------------------------
+// Details: Carry out work to complete the GDB set option 'output-radix' to prepare
+//          and send back information asked for.
+// Type:    Method.
+// Args:    vrWords - (R) List of additional parameters used by this option.
+// Return:  MIstatus::success - Functional succeeded.
+//          MIstatus::failure - Functional failed.
+// Throws:  None.
+//--
+bool
+CMICmdCmdGdbSet::OptionFnOutputRadix(const CMIUtilString::VecString_t &vrWords)
+{
+    // Check we have at least one argument
+    if (vrWords.size() < 1)
+    {
+        m_bGbbOptionFnHasError = true;
+        m_strGdbOptionFnError = MIRSRC(IDS_CMD_ERR_GDBSET_OPT_SOLIBSEARCHPATH);
+        return MIstatus::failure;
+    }
+    const CMIUtilString &rStrValOutputRadix(vrWords[0]);
+    
+    CMICmnLLDBDebugSessionInfoVarObj::varFormat_e  format = CMICmnLLDBDebugSessionInfoVarObj::eVarFormat_Invalid;
+    MIint64 radix;
+    if (rStrValOutputRadix.ExtractNumber(radix))
+    {
+        switch (radix)
+        {
+        case 8:
+            format = CMICmnLLDBDebugSessionInfoVarObj::eVarFormat_Octal;
+            break;
+        case 10:
+            format = CMICmnLLDBDebugSessionInfoVarObj::eVarFormat_Natural;
+            break;
+        case 16:
+            format = CMICmnLLDBDebugSessionInfoVarObj::eVarFormat_Hex;
+            break;
+        default:
+            format = CMICmnLLDBDebugSessionInfoVarObj::eVarFormat_Invalid;
+            break;
+        }
+    }
+    if (format == CMICmnLLDBDebugSessionInfoVarObj::eVarFormat_Invalid)
+    {
+        m_bGbbOptionFnHasError = false;
+        SetError(CMIUtilString::Format(MIRSRC(IDS_DBGSESSION_ERR_SHARED_DATA_ADD), m_cmdData.strMiCmd.c_str(), "Output Radix"));
+        return MIstatus::failure;
+    }
+    CMICmnLLDBDebugSessionInfoVarObj::VarObjSetFormat(format);
+    
+    return MIstatus::success;
+}
+
+//++ ------------------------------------------------------------------------------------
 // Details: Carry out work to complete the GDB set option to prepare and send back information
 //          asked for.
 // Type:    Method.
diff --git tools/lldb-mi/MICmdCmdGdbSet.h tools/lldb-mi/MICmdCmdGdbSet.h
index 59ddc57..602272f 100644
--- tools/lldb-mi/MICmdCmdGdbSet.h
+++ tools/lldb-mi/MICmdCmdGdbSet.h
@@ -80,6 +80,7 @@ class CMICmdCmdGdbSet : public CMICmdBase
   private:
     bool GetOptionFn(const CMIUtilString &vrGdbOptionName, FnGdbOptionPtr &vrwpFn) const;
     bool OptionFnSolibSearchPath(const CMIUtilString::VecString_t &vrWords);
+    bool OptionFnOutputRadix(const CMIUtilString::VecString_t &vrWords);
     bool OptionFnFallback(const CMIUtilString::VecString_t &vrWords);
 
     // Attributes:
diff --git tools/lldb-mi/MICmdCmdStack.cpp tools/lldb-mi/MICmdCmdStack.cpp
index 6e1b607..1c5fe8b 100644
--- tools/lldb-mi/MICmdCmdStack.cpp
+++ tools/lldb-mi/MICmdCmdStack.cpp
@@ -462,6 +462,8 @@ CMICmdCmdStackListArguments::CMICmdCmdStackListArguments(void)
     , m_constStrArgNoValues("no-values")
     , m_constStrArgAllValues("all-values")
     , m_constStrArgSimpleValues("simple-values")
+    , m_constStrArgFrameLow("low-frame")
+    , m_constStrArgFrameHigh("high-frame")
 {
     // Command factory matches this name with that received from the stdin stream
     m_strMiCmd = "stack-list-arguments";
@@ -495,10 +497,12 @@ CMICmdCmdStackListArguments::ParseArgs(void)
 {
     bool bOk =
         m_setCmdArgs.Add(*(new CMICmdArgValOptionLong(m_constStrArgThread, false, true, CMICmdArgValListBase::eArgValType_Number, 1)));
-    bOk = bOk && m_setCmdArgs.Add(*(new CMICmdArgValNumber(m_constStrArgPrintValues, false, true)));
+    bOk = bOk && m_setCmdArgs.Add(*(new CMICmdArgValNumber(m_constStrArgPrintValues, true, true)));
     bOk = bOk && m_setCmdArgs.Add(*(new CMICmdArgValOptionLong(m_constStrArgNoValues, false, true)));
     bOk = bOk && m_setCmdArgs.Add(*(new CMICmdArgValOptionLong(m_constStrArgAllValues, false, true)));
     bOk = bOk && m_setCmdArgs.Add(*(new CMICmdArgValOptionLong(m_constStrArgSimpleValues, false, true)));
+    bOk = bOk && m_setCmdArgs.Add(*(new CMICmdArgValNumber(m_constStrArgFrameLow, false, true)));
+    bOk = bOk && m_setCmdArgs.Add(*(new CMICmdArgValNumber(m_constStrArgFrameHigh, false, true)));
     return (bOk && ParseValidateCmdOptions());
 }
 
@@ -519,6 +523,8 @@ CMICmdCmdStackListArguments::Execute(void)
     CMICMDBASE_GETOPTION(pArgNoValues, OptionLong, m_constStrArgNoValues);
     CMICMDBASE_GETOPTION(pArgAllValues, OptionLong, m_constStrArgAllValues);
     CMICMDBASE_GETOPTION(pArgSimpleValues, OptionLong, m_constStrArgSimpleValues);
+    CMICMDBASE_GETOPTION(pArgFrameLow, Number, m_constStrArgFrameLow);
+    CMICMDBASE_GETOPTION(pArgFrameHigh, Number, m_constStrArgFrameHigh);
 
     // Retrieve the --thread option's thread ID (only 1)
     MIuint64 nThreadId = UINT64_MAX;
@@ -569,7 +575,22 @@ CMICmdCmdStackListArguments::Execute(void)
     }
 
     const MIuint nFrames = thread.GetNumFrames();
-    for (MIuint i = 0; i < nFrames; i++)
+    MIuint lo = pArgFrameLow->GetFound() ? pArgFrameLow->GetValue() : 0;
+    MIuint high = pArgFrameHigh->GetFound() ? pArgFrameHigh->GetValue() : nFrames-1;
+    if (high > nFrames-1)
+    {
+        high = nFrames-1;
+    }
+    
+    MIuint howValues;
+    if (!pArgPrintValues->GetFound() || pArgPrintValues->GetValue() > 2)
+    {
+        SetError(CMIUtilString::Format(MIRSRC(IDS_CMD_ARGS_ERR_PREFIX_MSG)));
+        return MIstatus::failure;
+    }
+    howValues = pArgPrintValues->GetValue();
+    
+    for (MIuint i = lo; i <= high; i++)
     {
         lldb::SBFrame frame = thread.GetFrameAtIndex(i);
         CMICmnMIValueList miValueList(true);
@@ -687,7 +708,7 @@ CMICmdCmdStackListLocals::ParseArgs(void)
         m_setCmdArgs.Add(*(new CMICmdArgValOptionLong(m_constStrArgThread, false, true, CMICmdArgValListBase::eArgValType_Number, 1)));
     bOk = bOk &&
           m_setCmdArgs.Add(*(new CMICmdArgValOptionLong(m_constStrArgFrame, false, true, CMICmdArgValListBase::eArgValType_Number, 1)));
-    bOk = bOk && m_setCmdArgs.Add(*(new CMICmdArgValNumber(m_constStrArgPrintValues, false, true)));
+    bOk = bOk && m_setCmdArgs.Add(*(new CMICmdArgValNumber(m_constStrArgPrintValues, true, true)));
     bOk = bOk && m_setCmdArgs.Add(*(new CMICmdArgValOptionLong(m_constStrArgNoValues, false, true)));
     bOk = bOk && m_setCmdArgs.Add(*(new CMICmdArgValOptionLong(m_constStrArgAllValues, false, true)));
     bOk = bOk && m_setCmdArgs.Add(*(new CMICmdArgValOptionLong(m_constStrArgSimpleValues, false, true)));
@@ -771,13 +792,22 @@ CMICmdCmdStackListLocals::Execute(void)
         return MIstatus::success;
     }
 
+    MIuint howValues;
+    if (!pArgPrintValues->GetFound() || pArgPrintValues->GetValue() > 2)
+    {
+        SetError(CMIUtilString::Format(MIRSRC(IDS_CMD_ARGS_ERR_PREFIX_MSG)));
+        return MIstatus::failure;
+    }
+    howValues = pArgPrintValues->GetValue();
+    
+    const MIuint nFrames = thread.GetNumFrames();
+    MIunused(nFrames);
     lldb::SBFrame frame = (nFrame != UINT64_MAX) ? thread.GetFrameAtIndex(nFrame) : thread.GetSelectedFrame();
 
     CMICmnMIValueList miValueList(true);
     const MIuint maskVarTypes = CMICmnLLDBDebugSessionInfo::eVariableType_Locals;
     if (!rSessionInfo.MIResponseFormVariableInfo(frame, maskVarTypes, eVarInfoFormat, miValueList))
         return MIstatus::failure;
-
     m_miValueList = miValueList;
 
     return MIstatus::success;
@@ -832,6 +862,186 @@ CMICmdCmdStackListLocals::CreateSelf(void)
 //---------------------------------------------------------------------------------------
 
 //++ ------------------------------------------------------------------------------------
+// Details: CMICmdCmdStackListVariables constructor.
+// Type:    Method.
+// Args:    None.
+// Return:  None.
+// Throws:  None.
+//--
+CMICmdCmdStackListVariables::CMICmdCmdStackListVariables(void)
+    : m_bThreadInvalid(false)
+    , m_miValueList(true)
+    , m_constStrArgThread("thread")
+    , m_constStrArgFrame("frame")
+    , m_constStrArgPrintValues("print-values")
+{
+    // Command factory matches this name with that received from the stdin stream
+    m_strMiCmd = "stack-list-variables";
+
+    // Required by the CMICmdFactory when registering *this command
+    m_pSelfCreatorFn = &CMICmdCmdStackListVariables::CreateSelf;
+}
+
+//++ ------------------------------------------------------------------------------------
+// Details: CMICmdCmdStackListVariables destructor.
+// Type:    Overrideable.
+// Args:    None.
+// Return:  None.
+// Throws:  None.
+//--
+CMICmdCmdStackListVariables::~CMICmdCmdStackListVariables(void)
+{
+}
+
+//++ ------------------------------------------------------------------------------------
+// Details: The invoker requires this function. The parses the command line options
+//          arguments to extract values for each of those arguments.
+// Type:    Overridden.
+// Args:    None.
+// Return:  MIstatus::success - Functional succeeded.
+//          MIstatus::failure - Functional failed.
+// Throws:  None.
+//--
+bool
+CMICmdCmdStackListVariables::ParseArgs(void)
+{
+    bool bOk =
+        m_setCmdArgs.Add(*(new CMICmdArgValOptionLong(m_constStrArgThread, false, true, CMICmdArgValListBase::eArgValType_Number, 1)));
+    bOk = bOk &&
+        m_setCmdArgs.Add(*(new CMICmdArgValOptionLong(m_constStrArgFrame, false, true, CMICmdArgValListBase::eArgValType_Number, 1)));
+    bOk = bOk && m_setCmdArgs.Add(*(new CMICmdArgValNumber(m_constStrArgPrintValues, true, true)));
+    return (bOk && ParseValidateCmdOptions());
+}
+
+//++ ------------------------------------------------------------------------------------
+// Details: The invoker requires this function. The command does work in this function.
+//          The command is likely to communicate with the LLDB SBDebugger in here.
+// Type:    Overridden.
+// Args:    None.
+// Return:  MIstatus::success - Functional succeeded.
+//          MIstatus::failure - Functional failed.
+// Throws:  None.
+//--
+bool
+CMICmdCmdStackListVariables::Execute(void)
+{
+    CMICMDBASE_GETOPTION(pArgThread, OptionLong, m_constStrArgThread);
+    CMICMDBASE_GETOPTION(pArgFrame, OptionLong, m_constStrArgFrame);
+    CMICMDBASE_GETOPTION(pArgPrintValues, Number, m_constStrArgPrintValues);
+
+    MIuint64 nThreadId = UINT64_MAX;
+    if (pArgThread->GetFound())
+    {
+        if (!pArgThread->GetExpectedOption<CMICmdArgValNumber, MIuint64>(nThreadId))
+        {
+            SetError(CMIUtilString::Format(MIRSRC(IDS_CMD_ERR_OPTION_NOT_FOUND), m_cmdData.strMiCmd.c_str(), m_constStrArgThread.c_str()));
+            return MIstatus::failure;
+        }
+    }
+    MIuint64 nFrame = UINT64_MAX;
+    if (pArgFrame->GetFound())
+    {
+        if (!pArgFrame->GetExpectedOption<CMICmdArgValNumber, MIuint64>(nFrame))
+        {
+            SetError(CMIUtilString::Format(MIRSRC(IDS_CMD_ERR_OPTION_NOT_FOUND), m_cmdData.strMiCmd.c_str(), m_constStrArgFrame.c_str()));
+            return MIstatus::failure;
+        }
+    }
+
+    CMICmnLLDBDebugSessionInfo &rSessionInfo(CMICmnLLDBDebugSessionInfo::Instance());
+    lldb::SBProcess sbProcess = rSessionInfo.GetProcess();
+    lldb::SBThread thread = (nThreadId != UINT64_MAX) ? sbProcess.GetThreadByIndexID(nThreadId) : sbProcess.GetSelectedThread();
+    m_bThreadInvalid = !thread.IsValid();
+    if (m_bThreadInvalid)
+        return MIstatus::success;
+
+    const lldb::StopReason eStopReason = thread.GetStopReason();
+    if ((eStopReason == lldb::eStopReasonNone) || (eStopReason == lldb::eStopReasonInvalid))
+    {
+        m_bThreadInvalid = true;
+        return MIstatus::success;
+    }
+
+    MIuint howValues;
+    if (!pArgPrintValues->GetFound() || pArgPrintValues->GetValue() > 2)
+    {
+        SetError(CMIUtilString::Format(MIRSRC(IDS_CMD_ARGS_ERR_PREFIX_MSG)));
+        return MIstatus::failure;
+    }
+    howValues = pArgPrintValues->GetValue();
+
+    const MIuint nFrames = thread.GetNumFrames();
+    MIunused(nFrames);
+    lldb::SBFrame frame = (nFrame != UINT64_MAX) ? thread.GetFrameAtIndex(nFrame) : thread.GetSelectedFrame();
+    CMICmnMIValueList miValueList(true);
+    const MIuint maskVarTypes = 0x1110;
+    switch (howValues) {
+    case 0:
+        if (!rSessionInfo.MIResponseFormVariableInfo4(frame, maskVarTypes, miValueList))
+            return MIstatus::failure;
+        break;
+    case 1:
+        //TODO
+        break;
+    case 2:
+        if (!rSessionInfo.MIResponseFormVariableInfo4(frame, maskVarTypes, miValueList, true))
+            return MIstatus::failure;
+        break;
+    default:
+        break;
+    }
+    m_miValueList = miValueList;
+
+    return MIstatus::success;
+}
+
+//++ ------------------------------------------------------------------------------------
+// Details: The invoker requires this function. The command prepares a MI Record Result
+//          for the work carried out in the Execute().
+// Type:    Overridden.
+// Args:    None.
+// Return:  MIstatus::success - Functional succeeded.
+//          MIstatus::failure - Functional failed.
+// Throws:  None.
+//--
+bool
+CMICmdCmdStackListVariables::Acknowledge(void)
+{
+    if (m_bThreadInvalid)
+    {
+        const CMICmnMIValueList miValueList(true);
+        const CMICmnMIValueResult miValueResult("variables", miValueList);
+        const CMICmnMIResultRecord miRecordResult(m_cmdData.strMiCmdToken, CMICmnMIResultRecord::eResultClass_Done, miValueResult);
+        m_miResultRecord = miRecordResult;
+        return MIstatus::success;
+    }
+
+    const CMICmnMIValueResult miValueResult("variables", m_miValueList);
+    const CMICmnMIResultRecord miRecordResult(m_cmdData.strMiCmdToken, CMICmnMIResultRecord::eResultClass_Done, miValueResult);
+    m_miResultRecord = miRecordResult;
+
+    return MIstatus::success;
+}
+
+//++ ------------------------------------------------------------------------------------
+// Details: Required by the CMICmdFactory when registering *this command. The factory
+//          calls this function to create an instance of *this command.
+// Type:    Static method.
+// Args:    None.
+// Return:  CMICmdBase * - Pointer to a new command.
+// Throws:  None.
+//--
+CMICmdBase *
+CMICmdCmdStackListVariables::CreateSelf(void)
+{
+    return new CMICmdCmdStackListVariables();
+}
+
+//---------------------------------------------------------------------------------------
+//---------------------------------------------------------------------------------------
+//---------------------------------------------------------------------------------------
+
+//++ ------------------------------------------------------------------------------------
 // Details: CMICmdCmdStackSelectFrame constructor.
 // Type:    Method.
 // Args:    None.
@@ -839,12 +1049,12 @@ CMICmdCmdStackListLocals::CreateSelf(void)
 // Throws:  None.
 //--
 CMICmdCmdStackSelectFrame::CMICmdCmdStackSelectFrame(void)
-    : m_bFrameInvalid(false)
-    , m_constStrArgFrame("frame")
+: m_bFrameInvalid(false)
+, m_constStrArgFrame("frame")
 {
     // Command factory matches this name with that received from the stdin stream
     m_strMiCmd = "stack-select-frame";
-
+    
     // Required by the CMICmdFactory when registering *this command
     m_pSelfCreatorFn = &CMICmdCmdStackSelectFrame::CreateSelf;
 }
@@ -889,18 +1099,18 @@ bool
 CMICmdCmdStackSelectFrame::Execute(void)
 {
     CMICMDBASE_GETOPTION(pArgFrame, Number, m_constStrArgFrame);
-
+    
     CMICmnLLDBDebugSessionInfo &rSessionInfo(CMICmnLLDBDebugSessionInfo::Instance());
     lldb::SBThread sbThread = rSessionInfo.GetProcess().GetSelectedThread();
-
+    
     const MIuint nFrameId = pArgFrame->GetValue();
     m_bFrameInvalid = (nFrameId >= sbThread.GetNumFrames());
     if (m_bFrameInvalid)
         return MIstatus::success;
-
+    
     lldb::SBFrame sbFrame = sbThread.SetSelectedFrame(nFrameId);
     m_bFrameInvalid = !sbFrame.IsValid();
-
+    
     return MIstatus::success;
 }
 
@@ -920,17 +1130,17 @@ CMICmdCmdStackSelectFrame::Acknowledge(void)
     {
         // MI print "%s^error,msg=\"Command '-stack-select-frame'. Frame ID invalid\""
         const CMICmnMIValueConst miValueConst(
-                CMIUtilString::Format(MIRSRC(IDS_CMD_ERR_FRAME_INVALID), m_cmdData.strMiCmd.c_str()));
+                                              CMIUtilString::Format(MIRSRC(IDS_CMD_ERR_FRAME_INVALID), m_cmdData.strMiCmd.c_str()));
         const CMICmnMIValueResult miValueResult("msg", miValueConst);
         const CMICmnMIResultRecord miRecordResult(m_cmdData.strMiCmdToken, CMICmnMIResultRecord::eResultClass_Error, miValueResult);
         m_miResultRecord = miRecordResult;
-
+        
         return MIstatus::success;
     }
-
+    
     const CMICmnMIResultRecord miRecordResult(m_cmdData.strMiCmdToken, CMICmnMIResultRecord::eResultClass_Done);
     m_miResultRecord = miRecordResult;
-
+    
     return MIstatus::success;
 }
 
diff --git tools/lldb-mi/MICmdCmdStack.h tools/lldb-mi/MICmdCmdStack.h
index c325424..f0d4f91 100644
--- tools/lldb-mi/MICmdCmdStack.h
+++ tools/lldb-mi/MICmdCmdStack.h
@@ -179,6 +179,8 @@ class CMICmdCmdStackListArguments : public CMICmdBase
     const CMIUtilString m_constStrArgNoValues;
     const CMIUtilString m_constStrArgAllValues;
     const CMIUtilString m_constStrArgSimpleValues;
+    const CMIUtilString m_constStrArgFrameLow;
+    const CMIUtilString m_constStrArgFrameHigh;
 };
 
 //++ ============================================================================
@@ -222,30 +224,66 @@ class CMICmdCmdStackListLocals : public CMICmdBase
 
 //++ ============================================================================
 // Details: MI command class. MI commands derived from the command base class.
+//          *this class implements MI command "stack-list-variables".
+// Gotchas: None.
+// Authors: Chuck Ries 7/01/2014
+// Changes: None.
+//--
+class CMICmdCmdStackListVariables : public CMICmdBase
+{
+    // Statics:
+public:
+    // Required by the CMICmdFactory when registering *this command
+    static CMICmdBase *CreateSelf(void);
+
+    // Methods:
+public:
+    /* ctor */ CMICmdCmdStackListVariables(void);
+
+    // Overridden:
+public:
+    // From CMICmdInvoker::ICmd
+    virtual bool Execute(void);
+    virtual bool Acknowledge(void);
+    virtual bool ParseArgs(void);
+    // From CMICmnBase
+    /* dtor */ virtual ~CMICmdCmdStackListVariables(void);
+
+    // Attributes
+private:
+    bool m_bThreadInvalid;
+    CMICmnMIValueList m_miValueList;
+    const CMIUtilString m_constStrArgThread;
+    const CMIUtilString m_constStrArgFrame;
+    const CMIUtilString m_constStrArgPrintValues;
+};
+
+//++ ============================================================================
+// Details: MI command class. MI commands derived from the command base class.
 //          *this class implements MI command "stack-select-frame".
 //--
 class CMICmdCmdStackSelectFrame : public CMICmdBase
 {
     // Statics:
-  public:
+    public:
     // Required by the CMICmdFactory when registering *this command
     static CMICmdBase *CreateSelf(void);
-
+    
     // Methods:
-  public:
+public:
     /* ctor */ CMICmdCmdStackSelectFrame(void);
-
+    
     // Overridden:
-  public:
+    public:
     // From CMICmdInvoker::ICmd
     virtual bool Execute(void);
     virtual bool Acknowledge(void);
     virtual bool ParseArgs(void);
     // From CMICmnBase
     /* dtor */ virtual ~CMICmdCmdStackSelectFrame(void);
-
+    
     // Attributes:
-  private:
+private:
     bool m_bFrameInvalid; // True = yes invalid frame, false = ok
     const CMIUtilString m_constStrArgFrame;
-};
+};
\ No newline at end of file
diff --git tools/lldb-mi/MICmdCmdTarget.cpp tools/lldb-mi/MICmdCmdTarget.cpp
index c3ef0b4..9161ec2 100644
--- tools/lldb-mi/MICmdCmdTarget.cpp
+++ tools/lldb-mi/MICmdCmdTarget.cpp
@@ -214,3 +214,136 @@ CMICmdCmdTargetSelect::CreateSelf(void)
 {
     return new CMICmdCmdTargetSelect();
 }
+
+//++ ------------------------------------------------------------------------------------
+// Details: CMICmdCmdTargetAttach constructor.
+// Type:    Method.
+// Args:    None.
+// Return:  None.
+// Throws:  None.
+//--
+CMICmdCmdTargetAttach::CMICmdCmdTargetAttach(void)
+: m_constStrArgNamedFile("file")
+{
+    // Command factory matches this name with that received from the stdin stream
+    m_strMiCmd = "target-attach";
+    
+    // Required by the CMICmdFactory when registering *this command
+    m_pSelfCreatorFn = &CMICmdCmdTargetAttach::CreateSelf;
+}
+
+//++ ------------------------------------------------------------------------------------
+// Details: CMICmdCmdTargetAttach destructor.
+// Type:    Overrideable.
+// Args:    None.
+// Return:  None.
+// Throws:  None.
+//--
+CMICmdCmdTargetAttach::~CMICmdCmdTargetAttach(void)
+{
+}
+
+//++ ------------------------------------------------------------------------------------
+// Details: The invoker requires this function. The parses the command line options
+//          arguments to extract values for each of those arguments.
+// Type:    Overridden.
+// Args:    None.
+// Return:  MIstatus::success - Functional succeeded.
+//          MIstatus::failure - Functional failed.
+// Throws:  None.
+//--
+bool
+CMICmdCmdTargetAttach::ParseArgs(void)
+{
+    bool bOk = m_setCmdArgs.Add(*(new CMICmdArgValString(m_constStrArgNamedFile, true, true, true)));
+    return (bOk && ParseValidateCmdOptions());
+}
+
+//++ ------------------------------------------------------------------------------------
+// Details: The invoker requires this function. The command does work in this function.
+//          The command is likely to communicate with the LLDB SBDebugger in here.
+//          Synopsis: -target-attach file
+//          Ref: http://sourceware.org/gdb/onlinedocs/gdb/GDB_002fMI-Target-Manipulation.html#GDB_002fMI-Target-Manipulation
+// Type:    Overridden.
+// Args:    None.
+// Return:  MIstatus::success - Functional succeeded.
+//          MIstatus::failure - Functional failed.
+// Throws:  None.
+//--
+bool
+CMICmdCmdTargetAttach::Execute(void)
+{
+    CMICMDBASE_GETOPTION(pArgFile, String, m_constStrArgNamedFile);
+    
+    CMICmnLLDBDebugSessionInfo &rSessionInfo(CMICmnLLDBDebugSessionInfo::Instance());
+    
+    // Check we have a valid process
+    // Note: target created via 'file-exec-and-symbols' command
+    if (!rSessionInfo.GetTarget().IsValid())
+    {
+        SetError(CMIUtilString::Format(MIRSRC(IDS_CMD_ERR_INVALID_TARGET_CURRENT), m_cmdData.strMiCmd.c_str()));
+        return MIstatus::failure;
+    }
+    
+    lldb::SBError error;
+    lldb::SBListener listener;
+    lldb::SBProcess process = rSessionInfo.GetTarget().AttachToProcessWithName(listener, pArgFile->GetValue().c_str(), true, error);
+    
+    lldb::SBStream errMsg;
+    if (error.Fail())
+    {
+        SetError(CMIUtilString::Format(MIRSRC(IDS_CMD_ERR_ATTACH_FAILED), m_cmdData.strMiCmd.c_str(), errMsg.GetData()));
+        return MIstatus::failure;
+    }
+    
+    // Save the process in the session info
+    rSessionInfo.GetProcess() = process;
+    return MIstatus::success;
+}
+
+//++ ------------------------------------------------------------------------------------
+// Details: The invoker requires this function. The command prepares a MI Record Result
+//          for the work carried out in the Execute().
+// Type:    Overridden.
+// Args:    None.
+// Return:  MIstatus::success - Functional succeeded.
+//          MIstatus::failure - Functional failed.
+// Throws:  None.
+//--
+bool
+CMICmdCmdTargetAttach::Acknowledge(void)
+{
+    const CMICmnMIResultRecord miRecordResult(m_cmdData.strMiCmdToken, CMICmnMIResultRecord::eResultClass_Done);
+    m_miResultRecord = miRecordResult;
+    
+    CMICmnLLDBDebugSessionInfo &rSessionInfo(CMICmnLLDBDebugSessionInfo::Instance());
+    lldb::pid_t pid = rSessionInfo.GetProcess().GetProcessID();
+    // Prod the client i.e. Eclipse with out-of-band results to help it 'continue' because it is using LLDB debugger
+    // Give the client '=thread-group-started,id="i1"'
+    m_bHasResultRecordExtra = true;
+    const CMICmnMIValueConst miValueConst2("i1");
+    const CMICmnMIValueResult miValueResult2("id", miValueConst2);
+    const CMIUtilString strPid(CMIUtilString::Format("%lld", pid));
+    const CMICmnMIValueConst miValueConst(strPid);
+    const CMICmnMIValueResult miValueResult("pid", miValueConst);
+    CMICmnMIOutOfBandRecord miOutOfBand(CMICmnMIOutOfBandRecord::eOutOfBand_ThreadGroupStarted, miValueResult2);
+    miOutOfBand.Add(miValueResult);
+    m_miResultRecordExtra = miOutOfBand.GetString();
+    
+    return MIstatus::success;
+}
+
+//++ ------------------------------------------------------------------------------------
+// Details: Required by the CMICmdFactory when registering *this command. The factory
+//          calls this function to create an instance of *this command.
+// Type:    Static method.
+// Args:    None.
+// Return:  CMICmdBase * - Pointer to a new command.
+// Throws:  None.
+//--
+CMICmdBase *
+CMICmdCmdTargetAttach::CreateSelf(void)
+{
+    return new CMICmdCmdTargetAttach();
+}
+
diff --git tools/lldb-mi/MICmdCmdTarget.h tools/lldb-mi/MICmdCmdTarget.h
index 0ed790f..98a9b21 100644
--- tools/lldb-mi/MICmdCmdTarget.h
+++ tools/lldb-mi/MICmdCmdTarget.h
@@ -68,3 +68,37 @@ class CMICmdCmdTargetSelect : public CMICmdBase
     const CMIUtilString m_constStrArgNamedType;
     const CMIUtilString m_constStrArgNamedParameters;
 };
+
+//++ ============================================================================
+// Details: MI command class. MI commands derived from the command base class.
+//          *this class implements MI command "target-attach".
+//          http://sourceware.org/gdb/onlinedocs/gdb/GDB_002fMI-Target-Manipulation.html#GDB_002fMI-Target-Manipulation
+// Gotchas: None.
+// Authors:
+// Changes: None.
+//--
+class CMICmdCmdTargetAttach : public CMICmdBase
+{
+    // Statics:
+public:
+    // Required by the CMICmdFactory when registering *this command
+    static CMICmdBase *CreateSelf(void);
+    
+    // Methods:
+public:
+    /* ctor */ CMICmdCmdTargetAttach(void);
+    
+    // Overridden:
+public:
+    // From CMICmdInvoker::ICmd
+    virtual bool Execute(void);
+    virtual bool Acknowledge(void);
+    virtual bool ParseArgs(void);
+    // From CMICmnBase
+    /* dtor */ virtual ~CMICmdCmdTargetAttach(void);
+    
+    // Attributes:
+private:
+    const CMIUtilString m_constStrArgNamedFile;
+};
+
diff --git tools/lldb-mi/MICmdCmdVar.cpp tools/lldb-mi/MICmdCmdVar.cpp
index 3dc78cc..126db62 100644
--- tools/lldb-mi/MICmdCmdVar.cpp
+++ tools/lldb-mi/MICmdCmdVar.cpp
@@ -167,7 +167,7 @@ CMICmdCmdVarCreate::Execute(void)
     }
 
     bool bCurrentFrame = false;
-    if (pArgFrameAddr->GetFound())
+    if (pArgFrameAddr->GetFound() && nFrame == UINT64_MAX)  // ignore the frame addr when --frame is specified too
     {
         const CMIUtilString &rStrFrameAddr(pArgFrameAddr->GetValue());
         bCurrentFrame = CMIUtilString::Compare(rStrFrameAddr, "*");
@@ -196,17 +196,26 @@ CMICmdCmdVarCreate::Execute(void)
     lldb::SBValue value = valueList.GetFirstValueByName(rStrExpression.c_str());
     if (!value.IsValid())
         value = frame.EvaluateExpression(rStrExpression.c_str());
-
+    m_strValue.clear();
     if (value.IsValid())
     {
-        CompleteSBValue(value);
-        m_bValid = true;
-        m_nChildren = value.GetNumChildren();
-        m_strType = CMICmnLLDBUtilSBValue(value).GetTypeNameDisplay();
-
-        // This gets added to CMICmnLLDBDebugSessionInfoVarObj static container of varObjs
-        CMICmnLLDBDebugSessionInfoVarObj varObj(rStrExpression, m_strVarName, value);
-        m_strValue = varObj.GetValueFormatted();
+        if (value.GetError().Fail())
+        {
+            m_bValid = false;
+            lldb::SBStream err;
+            const bool bOk = value.GetError().GetDescription(err);
+            MIunused(bOk);
+            m_strValue = err.GetData();
+        }
+        else
+        {
+            m_bValid = true;
+            m_nChildren = value.GetNumChildren();
+            m_strType = CMICmnLLDBUtilSBValue(value).GetTypeNameDisplay();
+            // This gets added to CMICmnLLDBDebugSessionInfoVarObj static container of varObjs
+            CMICmnLLDBDebugSessionInfoVarObj varObj(rStrExpression, m_strVarName, value);
+            m_strValue = varObj.GetValueFormatted();
+        }
     }
 
     return MIstatus::success;
@@ -248,7 +257,16 @@ CMICmdCmdVarCreate::Acknowledge(void)
         return MIstatus::success;
     }
 
-    const CMICmnMIValueConst miValueConst(CMIUtilString::Format(MIRSRC(IDS_CMD_ERR_VARIABLE_CREATION_FAILED), m_strExpression.c_str()));
+    CMIUtilString errmsg;
+    if (!m_strValue.empty())
+    {
+        errmsg = m_strValue;
+    }
+    else
+    {
+        errmsg = CMIUtilString::Format(MIRSRC(IDS_CMD_ERR_VARIABLE_CREATION_FAILED), m_strExpression.c_str());
+    }
+    const CMICmnMIValueConst miValueConst(errmsg);
     CMICmnMIValueResult miValueResult("msg", miValueConst);
     const CMICmnMIResultRecord miRecordResult(m_cmdData.strMiCmdToken, CMICmnMIResultRecord::eResultClass_Error, miValueResult);
     m_miResultRecord = miRecordResult;
@@ -978,7 +996,7 @@ CMICmdCmdVarListChildren::ParseArgs(void)
     bOk = bOk && m_setCmdArgs.Add(*(new CMICmdArgValOptionLong(m_constStrArgNoValues, false, true)));
     bOk = bOk && m_setCmdArgs.Add(*(new CMICmdArgValOptionLong(m_constStrArgAllValues, false, true)));
     bOk = bOk && m_setCmdArgs.Add(*(new CMICmdArgValOptionLong(m_constStrArgSimpleValues, false, true)));
-    bOk = bOk && m_setCmdArgs.Add(*(new CMICmdArgValString(m_constStrArgName, true, true)));
+    bOk = bOk && m_setCmdArgs.Add(*(new CMICmdArgValString(m_constStrArgName, true, true, true)));
     return (bOk && ParseValidateCmdOptions());
 }
 
@@ -1036,6 +1054,7 @@ CMICmdCmdVarListChildren::Execute(void)
             continue;
         const CMICmnLLDBUtilSBValue utilValue(member);
         const CMIUtilString strExp = utilValue.GetName();
+        const CMIUtilString strValue = utilValue.GetValue();
         const CMIUtilString name(CMIUtilString::Format("%s.%s", rVarObjName.c_str(), strExp.c_str()));
         const MIuint nChildren = member.GetNumChildren();
         const CMIUtilString strThreadId(CMIUtilString::Format("%u", member.GetThread().GetIndexID()));
@@ -1057,16 +1076,20 @@ CMICmdCmdVarListChildren::Execute(void)
         const CMICmnMIValueConst miValueConst6(strThreadId);
         const CMICmnMIValueResult miValueResult6("thread-id", miValueConst6);
         miValueTuple.Add(miValueResult6);
+        // Varobj gets added to CMICmnLLDBDebugSessionInfoVarObj static container of varObjs
+        CMICmnLLDBDebugSessionInfoVarObj var(strExp, name, member, rVarObjName);
         // nChildren == 0 is used to check for simple values
         if ( (print_value == 2 && nChildren == 0) || (print_value == 1) )
         {
-            // Varobj gets added to CMICmnLLDBDebugSessionInfoVarObj static container of varObjs
-            CMICmnLLDBDebugSessionInfoVarObj var(strExp, name, member, rVarObjName);
             const CMIUtilString strValue(
             CMICmnLLDBDebugSessionInfoVarObj::GetValueStringFormatted(member, CMICmnLLDBDebugSessionInfoVarObj::eVarFormat_Natural));
             const CMICmnMIValueConst miValueConst7(strValue);
             const CMICmnMIValueResult miValueResult7("value", miValueConst7);
             miValueTuple.Add(miValueResult7);
+        } else{
+            const CMICmnMIValueConst miValueConst4(strValue);
+            const CMICmnMIValueResult miValueResult4("value", miValueConst4);
+            miValueTuple.Add(miValueResult4);
         }
         const CMICmnMIValueConst miValueConst8("0");
         const CMICmnMIValueResult miValueResult8("has_more", miValueConst8);
diff --git tools/lldb-mi/MICmdCommands.cpp tools/lldb-mi/MICmdCommands.cpp
index 772311d..b938a03 100644
--- tools/lldb-mi/MICmdCommands.cpp
+++ tools/lldb-mi/MICmdCommands.cpp
@@ -123,10 +123,12 @@ MICmnCommands::RegisterAll(void)
     bOk &= Register<CMICmdCmdStackListFrames>();
     bOk &= Register<CMICmdCmdStackListArguments>();
     bOk &= Register<CMICmdCmdStackListLocals>();
+    bOk &= Register<CMICmdCmdStackListVariables>();
     bOk &= Register<CMICmdCmdStackSelectFrame>();
     bOk &= Register<CMICmdCmdSupportListFeatures>();
     bOk &= Register<CMICmdCmdSymbolListLines>();
     bOk &= Register<CMICmdCmdTargetSelect>();
+    bOk &= Register<CMICmdCmdTargetAttach>();
     bOk &= Register<CMICmdCmdThreadInfo>();
     bOk &= Register<CMICmdCmdVarAssign>();
     bOk &= Register<CMICmdCmdVarCreate>();
diff --git tools/lldb-mi/MICmnLLDBDebugSessionInfo.cpp tools/lldb-mi/MICmnLLDBDebugSessionInfo.cpp
old mode 100644
new mode 100755
index ccb25ee..f17799c
--- tools/lldb-mi/MICmnLLDBDebugSessionInfo.cpp
+++ tools/lldb-mi/MICmnLLDBDebugSessionInfo.cpp
@@ -49,6 +49,7 @@
 CMICmnLLDBDebugSessionInfo::CMICmnLLDBDebugSessionInfo(void)
     : m_nBrkPointCntMax(INT32_MAX)
     , m_currentSelectedThread(LLDB_INVALID_THREAD_ID)
+    , m_numLibsLoaded(0)
     , m_constStrSharedDataKeyWkDir("Working Directory")
     , m_constStrSharedDataSolibPath("Solib Path")
 {
@@ -559,12 +560,12 @@ CMICmnLLDBDebugSessionInfo::MIResponseFormThreadInfo3(const SMICmdData &vCmdData
     const MIuint len = (pThreadName != nullptr) ? CMIUtilString(pThreadName).length() : 0;
     const bool bHaveName = ((pThreadName != nullptr) && (len > 0) && (len < 32) &&
                             CMIUtilString::IsAllValidAlphaAndNumeric(*pThreadName)); // 32 is arbitary number
-    const MIchar *pThrdFmt = bHaveName ? "%s" : "Thread %d";
+    const MIchar *pThrdFmt = bHaveName ? "%s" : "Thread %ld";
     CMIUtilString strThread;
     if (bHaveName)
         strThread = CMIUtilString::Format(pThrdFmt, pThreadName);
     else
-        strThread = CMIUtilString::Format(pThrdFmt, rThread.GetIndexID());
+        strThread = CMIUtilString::Format(pThrdFmt, rThread.GetThreadID() != LLDB_INVALID_THREAD_ID ? rThread.GetThreadID() : rThread.GetIndexID());
     const CMICmnMIValueConst miValueConst2(strThread);
     const CMICmnMIValueResult miValueResult2("target-id", miValueConst2);
     if (!vwrMIValueTuple.Add(miValueResult2))
@@ -675,6 +676,9 @@ CMICmnLLDBDebugSessionInfo::MIResponseFormVariableInfo2(const lldb::SBFrame &vrF
         const CMICmnMIValueConst miValueConst2(utilValue.GetValue());
         const CMICmnMIValueResult miValueResult2("value", miValueConst2);
         miValueTuple.Add(miValueResult2);
+        const CMICmnMIValueConst miValueConst3(utilValue.GetTypeNameDisplay());
+        const CMICmnMIValueResult miValueResult3("type", miValueConst3);
+        miValueTuple.Add(miValueResult3);
         bOk = vwrMiValueList.Add(miValueTuple);
     }
 
@@ -714,6 +718,7 @@ CMICmnLLDBDebugSessionInfo::MIResponseFormVariableInfo(const lldb::SBFrame &vrFr
         lldb::SBValue value = listArg.GetValueAtIndex(i);
         const CMICmnMIValueConst miValueConst(value.GetName());
         const CMICmnMIValueResult miValueResultName("name", miValueConst);
+        miValueTuple.Add(miValueResultName); // name
         if (veVarInfoFormat != eVariableInfoFormat_NoValues)
         {
             const MIuint nChildren = value.GetNumChildren();
@@ -731,19 +736,94 @@ CMICmnLLDBDebugSessionInfo::MIResponseFormVariableInfo(const lldb::SBFrame &vrFr
                         valueStr = CMIUtilString::Format("{%s}", valueStr.c_str());
                     const CMICmnMIValueConst miValueConst2(valueStr);
                     const CMICmnMIValueResult miValueResult2("value", miValueConst2);
-                    miValueTuple.Add(miValueResultName); // name
                     miValueTuple.Add(miValueResult2);
-                    vwrMiValueList.Add(miValueTuple);
-                    continue;
                 }
             }
         }
-        // If we are printing name only then no need to put it in the tuple.
-        vwrMiValueList.Add(miValueResultName);
+        vwrMiValueList.Add(miValueTuple);
     }
     return bOk;
 }
 
+
+// *** This version of the MIResponseFormVariable includes the 'arg' parameter in the output for use with
+// *** -stack-list-variables. It can do names only or simple values
+//++ ------------------------------------------------------------------------------------
+// Details: Form MI partial response by appending more MI value type objects to the
+//          tuple type object past in.
+// Type:    Method.
+// Args:    vrFrame         - (R)   LLDB thread object.
+//          vMaskVarTypes   - (R)   Construed according to VariableType_e.
+//          vwrMIValueList  - (W)   MI value list object.
+// Return:  MIstatus::success - Functional succeeded.
+//          MIstatus::failure - Functional failed.
+// Throws:  None.
+//--
+
+bool
+CMICmnLLDBDebugSessionInfo::MIResponseFormVariableInfo4(const lldb::SBFrame &vrFrame, const MIuint vMaskVarTypes,
+CMICmnMIValueList &vwrMiValueList, bool bIncludeTypeAndValue)
+{
+    bool bOk = MIstatus::success;
+    lldb::SBFrame &rFrame = const_cast<lldb::SBFrame &>(vrFrame);
+
+    const bool bArg = (vMaskVarTypes & 0x1000);
+    const bool bLocals = (vMaskVarTypes & 0x0100);
+    const bool bStatics = (vMaskVarTypes & 0x0010);
+    const bool bInScopeOnly = (vMaskVarTypes & 0x0001);
+
+    lldb::SBValueList listArgs = rFrame.GetVariables(bArg, false, false, false);
+    const MIuint nArgs = listArgs.GetSize();
+    for (MIuint i = 0; bOk && (i < nArgs); i++)
+    {
+        lldb::SBValue value = listArgs.GetValueAtIndex(i);
+        const CMICmnLLDBUtilSBValue utilValue(value);
+        const CMICmnMIValueConst miValueConst(utilValue.GetName());
+        const CMICmnMIValueResult miValueResult("name", miValueConst);
+        CMICmnMIValueTuple miValueTuple(miValueResult);
+
+        const CMICmnMIValueConst miValueConstArg("1");
+        const CMICmnMIValueResult miValueResultArg("arg", miValueConstArg);
+        miValueTuple.Add(miValueResultArg);
+        if (bIncludeTypeAndValue)
+        {
+            const CMICmnMIValueConst miValueConst2(utilValue.GetValue());
+            const CMICmnMIValueResult miValueResult2("value", miValueConst2);
+            miValueTuple.Add(miValueResult2);
+            const CMICmnMIValueConst miValueConst3(utilValue.GetTypeNameDisplay());
+            const CMICmnMIValueResult miValueResult3("type", miValueConst3);
+            miValueTuple.Add(miValueResult3);
+        }
+        bOk = vwrMiValueList.Add(miValueTuple);
+    }
+
+    lldb::SBValueList listVariables = rFrame.GetVariables(false, bLocals, bStatics, bInScopeOnly);
+    const MIuint nVars = listVariables.GetSize();
+
+    for (MIuint i = 0; bOk && (i < nVars); i++)
+    {
+        lldb::SBValue value = listVariables.GetValueAtIndex(i);
+        const CMICmnLLDBUtilSBValue utilValue(value);
+        const CMICmnMIValueConst miValueConst(utilValue.GetName());
+        const CMICmnMIValueResult miValueResult("name", miValueConst);
+        CMICmnMIValueTuple miValueTuple(miValueResult);
+        if (bIncludeTypeAndValue)
+        {
+            const CMICmnMIValueConst miValueConst2(utilValue.GetValue());
+            const CMICmnMIValueResult miValueResult2("value", miValueConst2);
+            miValueTuple.Add(miValueResult2);
+            const CMICmnMIValueConst miValueConst3(utilValue.GetTypeNameDisplay());
+            const CMICmnMIValueResult miValueResult3("type", miValueConst3);
+            miValueTuple.Add(miValueResult3);
+        }
+        bOk = vwrMiValueList.Add(miValueTuple);
+    }
+
+    return bOk;
+}
+
+// *** Do not refactor this function to be one function with same name as it can break more than
+// *** than one stack type command
 //++ ------------------------------------------------------------------------------------
 // Details: Extract the value's name and value or recurse into child value object.
 // Type:    Method.
@@ -838,6 +918,8 @@ CMICmnLLDBDebugSessionInfo::GetVariableInfo(const MIuint vnMaxDepth, const lldb:
         {
             lldb::SBValue member = rValue.GetChildAtIndex(i);
             bOk = GetVariableInfo(vnMaxDepth, member, true, vnDepth + 1, miValueList2);
+
+
         }
         if (bOk)
         {
@@ -967,19 +1049,22 @@ CMICmnLLDBDebugSessionInfo::MIResponseFormFrameInfo(const lldb::addr_t vPc, cons
     const CMICmnMIValueResult miValueResult3("func", miValueConst3);
     if (!vwrMiValueTuple.Add(miValueResult3))
         return MIstatus::failure;
-    const CMICmnMIValueConst miValueConst5(vFileName);
-    const CMICmnMIValueResult miValueResult5("file", miValueConst5);
-    if (!vwrMiValueTuple.Add(miValueResult5))
-        return MIstatus::failure;
-    const CMICmnMIValueConst miValueConst6(vPath);
-    const CMICmnMIValueResult miValueResult6("fullname", miValueConst6);
-    if (!vwrMiValueTuple.Add(miValueResult6))
-        return MIstatus::failure;
-    const CMIUtilString strLine(CMIUtilString::Format("%d", vnLine));
-    const CMICmnMIValueConst miValueConst7(strLine);
-    const CMICmnMIValueResult miValueResult7("line", miValueConst7);
-    if (!vwrMiValueTuple.Add(miValueResult7))
-        return MIstatus::failure;
+    if (vFileName != "??") // no file name so don't emit
+    {
+        const CMICmnMIValueConst miValueConst5(vFileName);
+        const CMICmnMIValueResult miValueResult5("file", miValueConst5);
+        if (!vwrMiValueTuple.Add(miValueResult5))
+            return MIstatus::failure;
+        const CMICmnMIValueConst miValueConst6(vPath);
+        const CMICmnMIValueResult miValueResult6("fullname", miValueConst6);
+        if (!vwrMiValueTuple.Add(miValueResult6))
+            return MIstatus::failure;
+        const CMIUtilString strLine(CMIUtilString::Format("%d", vnLine));
+        const CMICmnMIValueConst miValueConst7(strLine);
+        const CMICmnMIValueResult miValueResult7("line", miValueConst7);
+        if (!vwrMiValueTuple.Add(miValueResult7))
+            return MIstatus::failure;
+    }
 
     return MIstatus::success;
 }
@@ -1018,19 +1103,22 @@ CMICmnLLDBDebugSessionInfo::MIResponseFormFrameInfo2(const lldb::addr_t vPc, con
     const CMICmnMIValueResult miValueResult4("args", miValueConst4);
     if (!vwrMiValueTuple.Add(miValueResult4))
         return MIstatus::failure;
-    const CMICmnMIValueConst miValueConst5(vFileName);
-    const CMICmnMIValueResult miValueResult5("file", miValueConst5);
-    if (!vwrMiValueTuple.Add(miValueResult5))
-        return MIstatus::failure;
-    const CMICmnMIValueConst miValueConst6(vPath);
-    const CMICmnMIValueResult miValueResult6("fullname", miValueConst6);
-    if (!vwrMiValueTuple.Add(miValueResult6))
-        return MIstatus::failure;
-    const CMIUtilString strLine(CMIUtilString::Format("%d", vnLine));
-    const CMICmnMIValueConst miValueConst7(strLine);
-    const CMICmnMIValueResult miValueResult7("line", miValueConst7);
-    if (!vwrMiValueTuple.Add(miValueResult7))
-        return MIstatus::failure;
+    if (vFileName != "??") // no file name so don't emit
+    {
+        const CMICmnMIValueConst miValueConst5(vFileName);
+        const CMICmnMIValueResult miValueResult5("file", miValueConst5);
+        if (!vwrMiValueTuple.Add(miValueResult5))
+            return MIstatus::failure;
+        const CMICmnMIValueConst miValueConst6(vPath);
+        const CMICmnMIValueResult miValueResult6("fullname", miValueConst6);
+        if (!vwrMiValueTuple.Add(miValueResult6))
+            return MIstatus::failure;
+        const CMIUtilString strLine(CMIUtilString::Format("%d", vnLine));
+        const CMICmnMIValueConst miValueConst7(strLine);
+        const CMICmnMIValueResult miValueResult7("line", miValueConst7);
+        if (!vwrMiValueTuple.Add(miValueResult7))
+            return MIstatus::failure;
+    }
 
     return MIstatus::success;
 }
@@ -1048,7 +1136,7 @@ CMICmnLLDBDebugSessionInfo::MIResponseFormFrameInfo2(const lldb::addr_t vPc, con
 bool
 CMICmnLLDBDebugSessionInfo::MIResponseFormBrkPtFrameInfo(const SBrkPtInfo &vrBrkPtInfo, CMICmnMIValueTuple &vwrMiValueTuple)
 {
-    const CMIUtilString strAddr(CMIUtilString::Format("0x%08llx", vrBrkPtInfo.m_pc));
+    const CMIUtilString strAddr(CMIUtilString::Format("0x%016llx", vrBrkPtInfo.m_pc));
     const CMICmnMIValueConst miValueConst2(strAddr);
     const CMICmnMIValueResult miValueResult2("addr", miValueConst2);
     if (!vwrMiValueTuple.Add(miValueResult2))
diff --git tools/lldb-mi/MICmnLLDBDebugSessionInfo.h tools/lldb-mi/MICmnLLDBDebugSessionInfo.h
old mode 100644
new mode 100755
index 7a3b12e..5a250d0
--- tools/lldb-mi/MICmnLLDBDebugSessionInfo.h
+++ tools/lldb-mi/MICmnLLDBDebugSessionInfo.h
@@ -87,7 +87,7 @@ class CMICmnLLDBDebugSessionInfo : public CMICmnBase, public MI::ISingleton<CMIC
         CMIUtilString m_strType;        // Break point type.
         bool m_bDisp;                   // True = "del", false = "keep".
         bool m_bEnabled;                // True = enabled, false = disabled break point.
-        MIuint m_pc;                    // Address number.
+        MIuint64 m_pc;                    // Address number.
         CMIUtilString m_fnName;         // Function name.
         CMIUtilString m_fileName;       // File name text.
         CMIUtilString m_path;           // Full file name and path text.
@@ -163,6 +163,7 @@ class CMICmnLLDBDebugSessionInfo : public CMICmnBase, public MI::ISingleton<CMIC
                                     const VariableInfoFormat_e veVarInfoFormat, CMICmnMIValueList &vwrMiValueList);
     bool MIResponseFormVariableInfo2(const lldb::SBFrame &vrFrame, const MIuint vMaskVarTypes,
                                      const VariableInfoFormat_e veVarInfoFormat, CMICmnMIValueList &vwrMiValueList);
+    bool MIResponseFormVariableInfo4(const lldb::SBFrame &vrFrame, const MIuint vMaskVarTypes, CMICmnMIValueList &vwrMiValueList, bool bIncludeTypeAndValue = false);
     bool MIResponseFormBrkPtFrameInfo(const SBrkPtInfo &vrBrkPtInfo, CMICmnMIValueTuple &vwrMiValueTuple);
     bool MIResponseFormBrkPtInfo(const SBrkPtInfo &vrBrkPtInfo, CMICmnMIValueTuple &vwrMiValueTuple);
     bool GetBrkPtInfo(const lldb::SBBreakpoint &vBrkPt, SBrkPtInfo &vrwBrkPtInfo) const;
@@ -181,6 +182,8 @@ class CMICmnLLDBDebugSessionInfo : public CMICmnBase, public MI::ISingleton<CMIC
     const MIuint m_nBrkPointCntMax;
     VecActiveThreadId_t m_vecActiveThreadId;
     lldb::tid_t m_currentSelectedThread;
+    size_t m_numLibsLoaded;    // number of load-library messages sent
+    std::vector<lldb::SBModule> m_unmappedModules;    // loaded, but no valid process address
 
     // These are keys that can be used to access the shared data map
     // Note: This list is expected to grow and will be moved and abstracted in the future.
diff --git tools/lldb-mi/MICmnLLDBDebugSessionInfoVarObj.cpp tools/lldb-mi/MICmnLLDBDebugSessionInfoVarObj.cpp
index 8784e28..3671a89 100644
--- tools/lldb-mi/MICmnLLDBDebugSessionInfoVarObj.cpp
+++ tools/lldb-mi/MICmnLLDBDebugSessionInfoVarObj.cpp
@@ -35,6 +35,7 @@ const MIchar *CMICmnLLDBDebugSessionInfoVarObj::ms_aVarFormatChars[] = {
     "<Invalid var format>", "t", "o", "d", "x", "N"};
 CMICmnLLDBDebugSessionInfoVarObj::MapKeyToVarObj_t CMICmnLLDBDebugSessionInfoVarObj::ms_mapVarIdToVarObj;
 MIuint CMICmnLLDBDebugSessionInfoVarObj::ms_nVarUniqueId = 0; // Index from 0
+CMICmnLLDBDebugSessionInfoVarObj::varFormat_e CMICmnLLDBDebugSessionInfoVarObj::ms_eDefaultFormat = eVarFormat_Natural;
 
 //++ ------------------------------------------------------------------------------------
 // Details: CMICmnLLDBDebugSessionInfoVarObj constructor.
@@ -314,8 +315,13 @@ CMICmnLLDBDebugSessionInfoVarObj::GetStringFormatted(const MIuint64 vnValue, con
                                                      const CMICmnLLDBDebugSessionInfoVarObj::varFormat_e veVarFormat)
 {
     CMIUtilString strFormattedValue;
+    CMICmnLLDBDebugSessionInfoVarObj::varFormat_e veFormat = veVarFormat;
+    if (ms_eDefaultFormat != eVarFormat_Invalid && veVarFormat == eVarFormat_Natural)
+    {
+        veFormat = ms_eDefaultFormat;
+    }
 
-    switch (veVarFormat)
+    switch (veFormat)
     {
         case eVarFormat_Binary:
             strFormattedValue = CMIUtilString::FormatBinary(vnValue);
@@ -434,6 +440,20 @@ CMICmnLLDBDebugSessionInfoVarObj::VarObjIdResetToZero(void)
 }
 
 //++ ------------------------------------------------------------------------------------
+// Details: Default format is globally used as the data format when "natural" is in effect, that is, this overrides the default
+// Type:    Static method.
+// Args:    None.
+// Returns: None.
+// Throws:  None.
+//--
+void
+CMICmnLLDBDebugSessionInfoVarObj::VarObjSetFormat(varFormat_e eDefaultFormat)
+{
+    ms_eDefaultFormat = eDefaultFormat;
+}
+
+
+//++ ------------------------------------------------------------------------------------
 // Details: A count is kept of the number of var value objects created. This is count is
 //          used to ID the var value object. Increment the count by 1.
 // Type:    Static method.
diff --git tools/lldb-mi/MICmnLLDBDebugSessionInfoVarObj.h tools/lldb-mi/MICmnLLDBDebugSessionInfoVarObj.h
index f1cfc3e..ff68052 100644
--- tools/lldb-mi/MICmnLLDBDebugSessionInfoVarObj.h
+++ tools/lldb-mi/MICmnLLDBDebugSessionInfoVarObj.h
@@ -79,6 +79,7 @@ class CMICmnLLDBDebugSessionInfoVarObj
     static MIuint VarObjIdGet(void);
     static void VarObjIdResetToZero(void);
     static void VarObjClear(void);
+    static void VarObjSetFormat(varFormat_e eDefaultFormat);
 
     // Methods:
   public:
@@ -129,6 +130,7 @@ class CMICmnLLDBDebugSessionInfoVarObj
     static const MIchar *ms_aVarFormatChars[];
     static MapKeyToVarObj_t ms_mapVarIdToVarObj;
     static MIuint ms_nVarUniqueId;
+    static varFormat_e ms_eDefaultFormat;    // overrides "natural" format
     //
     // *** Upate the copy move constructors and assignment operator ***
     varFormat_e m_eVarFormat;
diff --git tools/lldb-mi/MICmnLLDBDebugger.cpp tools/lldb-mi/MICmnLLDBDebugger.cpp
index d1452e9..d33c95f 100644
--- tools/lldb-mi/MICmnLLDBDebugger.cpp
+++ tools/lldb-mi/MICmnLLDBDebugger.cpp
@@ -293,7 +293,7 @@ CMICmnLLDBDebugger::InitSBListener(void)
     }
 
     const CMIUtilString strDbgId("CMICmnLLDBDebugger1");
-    MIuint eventMask = lldb::SBTarget::eBroadcastBitBreakpointChanged;
+    MIuint eventMask = lldb::SBTarget::eBroadcastBitBreakpointChanged | lldb::SBTarget::eBroadcastBitModulesLoaded | lldb::SBTarget::eBroadcastBitModulesUnloaded;
     bool bOk = RegisterForEvent(strDbgId, CMIUtilString(lldb::SBTarget::GetBroadcasterClassName()), eventMask);
 
     eventMask = lldb::SBThread::eBroadcastBitStackChanged;
diff --git tools/lldb-mi/MICmnLLDBDebuggerHandleEvents.cpp tools/lldb-mi/MICmnLLDBDebuggerHandleEvents.cpp
index 829d60a..ac2d634 100644
--- tools/lldb-mi/MICmnLLDBDebuggerHandleEvents.cpp
+++ tools/lldb-mi/MICmnLLDBDebuggerHandleEvents.cpp
@@ -48,6 +48,7 @@
 #include "MICmnStreamStderr.h"
 #include "MIUtilDebug.h"
 #include "MIDriver.h"
+#include <string.h>
 
 //++ ------------------------------------------------------------------------------------
 // Details: CMICmnLLDBDebuggerHandleEvents constructor.
@@ -151,6 +152,11 @@ CMICmnLLDBDebuggerHandleEvents::HandleEvent(const lldb::SBEvent &vEvent, bool &v
         vrbHandledEvent = true;
         bOk = HandleEventSBThread(vEvent);
     }
+    else if (strcmp(vEvent.GetBroadcasterClass(),lldb::SBTarget::GetBroadcasterClassName()) == 0)
+    {
+        vrbHandledEvent = true;
+        bOk = HandleEventSBTarget(vEvent);
+    }
 
     return bOk;
 }
@@ -203,6 +209,144 @@ CMICmnLLDBDebuggerHandleEvents::HandleEventSBProcess(const lldb::SBEvent &vEvent
 }
 
 //++ ------------------------------------------------------------------------------------
+// Details: Handle a LLDB SBTarget event.
+// Type:    Method.
+// Args:    vEvent          - (R) An LLDB broadcast event.
+//          vrbExitAppEvent - (W) True - Received LLDB exit app event, false = did not.
+// Return:  MIstatus::success - Functionality succeeded.
+//          MIstatus::failure - Functionality failed.
+// Throws:  None.
+//--
+bool
+CMICmnLLDBDebuggerHandleEvents::HandleEventSBTarget(const lldb::SBEvent &vEvent)
+{
+    bool bOk = MIstatus::success;
+    
+    const MIchar *pEventType = "";
+    const MIuint nEventType = vEvent.GetType();
+    CMICmnLLDBDebugSessionInfo &rSessionInfo(CMICmnLLDBDebugSessionInfo::Instance());
+    switch (nEventType)
+    {
+        case lldb::SBTarget::eBroadcastBitBreakpointChanged:
+            pEventType = "eBroadcastBitBreakpointChanged";
+            break;
+        case lldb::SBTarget::eBroadcastBitModulesLoaded:
+            pEventType = "eBroadcastBitModulesLoaded";
+            bOk = HandleTargetEventBroadcastBitModulesLoaded(vEvent);
+            break;
+        case lldb::SBTarget::eBroadcastBitModulesUnloaded:
+            pEventType = "eBroadcastBitModulesUnloaded";
+            if (rSessionInfo.m_numLibsLoaded > 0)
+            {
+                rSessionInfo.m_numLibsLoaded--; // assume only one unloaded per event
+            }
+            break;
+        default:
+        {
+            const CMIUtilString msg(CMIUtilString::Format(MIRSRC(IDS_LLDBOUTOFBAND_ERR_UNKNOWN_EVENT), "SBTarget", (MIuint)nEventType));
+            SetErrorDescription(msg);
+            return MIstatus::failure;
+        }
+    }
+    m_pLog->WriteLog(CMIUtilString::Format("##### An SB Target event occurred: %s", pEventType));
+    
+    return bOk;
+}
+
+bool
+CMICmnLLDBDebuggerHandleEvents::SendLoadLibrary(lldb::SBModule module, lldb::SBTarget target)
+{
+    // MI print
+    // "=library-loaded,id=\"%s\",target-name=\"%s\",host-name=\"%s\",symbols-loaded=\"%d\"
+    CMICmnMIOutOfBandRecord miOutOfBandRecord(CMICmnMIOutOfBandRecord::eOutOfBand_LibraryLoaded);
+    const CMICmnMIValueConst miValueConst0(module.GetUUIDString());
+    const CMICmnMIValueResult miValueResult0("id", miValueConst0);
+    miOutOfBandRecord.Add(miValueResult0);
+    const CMICmnMIValueConst miValueConst2(module.GetFileSpec().GetFilename());
+    const CMICmnMIValueResult miValueResult2("host-name", miValueConst2);
+    miOutOfBandRecord.Add(miValueResult2);
+    const CMICmnMIValueConst miValueConst3(module.GetPlatformFileSpec().GetFilename());
+    const CMICmnMIValueResult miValueResult3("target-name", miValueConst3);
+    miOutOfBandRecord.Add(miValueResult3);
+    const CMICmnMIValueConst miValueConst4("0");
+    const CMICmnMIValueResult miValueResult4("symbols-loaded", miValueConst4);
+    miOutOfBandRecord.Add(miValueResult4);
+    const CMIUtilString strAddr(CMIUtilString::Format("%lld", module.GetNumSections()));
+    const CMICmnMIValueConst miValueConst5(strAddr);
+    
+    MIuint n = module.GetNumSections();
+    CMICmnMIValueList miValueListSections(true);
+    for (MIuint i = 0; i < n; ++i) {
+        lldb::SBSection section = module.GetSectionAtIndex(i);
+        CMICmnMIValueTuple miTupleSection;
+        const CMICmnMIValueConst miValueConstName(section.GetName());
+        const CMICmnMIValueResult miValueResultName("name", miValueConstName);
+        miTupleSection.Add(miValueResultName);
+        const CMICmnMIValueResultAddr miResultAddr("addr", section.GetLoadAddress(target));
+        miTupleSection.Add(miResultAddr);
+        const CMICmnMIValueResultUint miResultSize("size", section.GetByteSize());
+        miTupleSection.Add(miResultSize);
+        miValueListSections.Add(miTupleSection);
+    }
+    const CMICmnMIValueConst miValueSections(miValueListSections.GetString(), true);
+    const CMICmnMIValueResult miValueResultSections("sections", miValueSections);
+    miOutOfBandRecord.Add(miValueResultSections);
+    
+    return MiOutOfBandRecordToStdout(miOutOfBandRecord);
+}
+
+bool
+CMICmnLLDBDebuggerHandleEvents::HandleTargetEventBroadcastBitModulesLoaded(const lldb::SBEvent &vEvent)
+{
+    bool bOk = MIstatus::success;
+    
+    CMICmnLLDBDebugSessionInfo &rSessionInfo(CMICmnLLDBDebugSessionInfo::Instance());
+    if (!rSessionInfo.GetProcess().IsValid() || rSessionInfo.GetProcess().GetProcessID() == LLDB_INVALID_PROCESS_ID)
+    {
+        // send out the library load after the process is started
+        return bOk;
+    }
+    
+    lldb::SBTarget sbTarget = rSessionInfo.GetTarget();
+    
+    // The event contains no data so just catch up to the last module sent
+    if (sbTarget.IsValid() && sbTarget.GetNumModules() > 0)
+    {
+        size_t n = rSessionInfo.m_unmappedModules.size();
+        for (int i = n; i > 0; --i)
+        {
+            lldb::SBSection section = rSessionInfo.m_unmappedModules[i-1].FindSection("__TEXT");
+            if (section.IsValid() && section.GetLoadAddress(sbTarget) != LLDB_INVALID_ADDRESS)
+            {
+                bOk = bOk && SendLoadLibrary(rSessionInfo.m_unmappedModules[i-1], sbTarget);
+                rSessionInfo.m_unmappedModules.pop_back();
+            }
+        }
+        n = sbTarget.GetNumModules();
+        for (size_t next = rSessionInfo.m_numLibsLoaded; next < n; next++)
+        {
+            lldb::SBModule module = sbTarget.GetModuleAtIndex(next);
+            lldb::SBSection section = module.FindSection("__TEXT");
+            if (section.IsValid() && section.GetLoadAddress(sbTarget) == LLDB_INVALID_ADDRESS)
+            {
+                rSessionInfo.m_unmappedModules.push_back(module);
+            }
+            else
+            {
+                bOk = bOk && SendLoadLibrary(sbTarget.GetModuleAtIndex(next),sbTarget);
+            }
+        }
+        if (bOk == MIstatus::success)
+        {
+            rSessionInfo.m_numLibsLoaded = n;
+        }
+            
+    }
+    return bOk;
+};
+
+
+//++ ------------------------------------------------------------------------------------
 // Details: Handle a LLDB SBBreakpoint event.
 // Type:    Method.
 // Args:    vEvent  - (R) An LLDB broadcast event.
@@ -242,6 +386,7 @@ CMICmnLLDBDebuggerHandleEvents::HandleEventSBBreakPoint(const lldb::SBEvent &vEv
             break;
         case lldb::eBreakpointEventTypeLocationsResolved:
             pEventType = "eBreakpointEventTypeLocationsResolved";
+            bOk = HandleEventSBBreakpointCmn(vEvent);
             break;
         case lldb::eBreakpointEventTypeEnabled:
             pEventType = "eBreakpointEventTypeEnabled";
@@ -837,7 +982,7 @@ CMICmnLLDBDebuggerHandleEvents::HandleProcessEventStopSignal(bool &vwrbShouldBrk
     InitializeSignals ();
     lldb::SBProcess sbProcess = CMICmnLLDBDebugSessionInfo::Instance().GetProcess();
     const MIuint64 nStopReason = sbProcess.GetSelectedThread().GetStopReasonDataAtIndex(0);
-    if (nStopReason == m_SIGINT || nStopReason == m_SIGSTOP)
+    if (nStopReason == m_SIGINT)
     {
         // MI print "*stopped,reason=\"signal-received\",signal-name=\"SIGNINT\",signal-meaning=\"Interrupt\",frame={%s}"
         const CMICmnMIValueConst miValueConst("signal-received");
@@ -863,6 +1008,30 @@ CMICmnLLDBDebuggerHandleEvents::HandleProcessEventStopSignal(bool &vwrbShouldBrk
         bOk = bOk && MiOutOfBandRecordToStdout(miOutOfBandRecord);
         bOk = bOk && TextToStdout("(gdb)");
     }
+    else if (nStopReason == m_SIGSTOP)
+    {
+        // MI print "*stopped,reason=\"signal-received\",signal-name=\"SIGSTOP\",signal-meaning=\"Interrupt\"
+        // ,thread-id=\"%d\",frame={%s}"
+        const CMICmnMIValueConst miValueConst("signal-received");
+        const CMICmnMIValueResult miValueResult("reason", miValueConst);
+        CMICmnMIOutOfBandRecord miOutOfBandRecord(CMICmnMIOutOfBandRecord::eOutOfBand_Stopped, miValueResult);
+        const CMICmnMIValueConst miValueConst2("SIGSTOP");
+        const CMICmnMIValueResult miValueResult2("signal-name", miValueConst2);
+        bOk = miOutOfBandRecord.Add(miValueResult2);
+        const CMICmnMIValueConst miValueConst3("Interrupt");
+        const CMICmnMIValueResult miValueResult3("signal-meaning", miValueConst3);
+        bOk = bOk && miOutOfBandRecord.Add(miValueResult3);
+        const CMIUtilString strThreadId(CMIUtilString::Format("%d", sbProcess.GetSelectedThread().GetIndexID()));
+        const CMICmnMIValueConst miValueConst4(strThreadId);
+        const CMICmnMIValueResult miValueResult4("thread-id", miValueConst4);
+        bOk = bOk && miOutOfBandRecord.Add(miValueResult4);
+        CMICmnMIValueTuple miValueTuple;
+        bOk = bOk && MiHelpGetCurrentThreadFrame(miValueTuple);
+        const CMICmnMIValueResult miValueResult5("frame", miValueTuple);
+        bOk = bOk && miOutOfBandRecord.Add(miValueResult5);
+        bOk = bOk && MiOutOfBandRecordToStdout(miOutOfBandRecord);
+        // Note no "(gdb)" output here
+    }
     else if (nStopReason == m_SIGSEGV)
     {
         // MI print "*stopped,reason=\"signal-received\",signal-name=\"SIGSEGV\",signal-meaning=\"Segmentation
@@ -1519,7 +1688,7 @@ CMICmnLLDBDebuggerHandleEvents::ChkForStateChanges(void)
     {
         const MIuint nThreadId = *it;
         lldb::SBThread thread = sbProcess.GetThreadAtIndex(nThreadId);
-        if (!thread.IsValid())
+        if (!thread.IsValid() && thread.GetIndexID() != ((uint32_t)-1))
         {
             // Form MI "=thread-exited,id=\"%ld\",group-id=\"i1\""
             const CMIUtilString strValue(CMIUtilString::Format("%ld", thread.GetIndexID()));
diff --git tools/lldb-mi/MICmnLLDBDebuggerHandleEvents.h tools/lldb-mi/MICmnLLDBDebuggerHandleEvents.h
index 01b394f..2cddbc2 100644
--- tools/lldb-mi/MICmnLLDBDebuggerHandleEvents.h
+++ tools/lldb-mi/MICmnLLDBDebuggerHandleEvents.h
@@ -86,6 +86,10 @@ class CMICmnLLDBDebuggerHandleEvents : public CMICmnBase, public MI::ISingleton<
     bool TextToStdout(const CMIUtilString &vrTxt);
     bool TextToStderr(const CMIUtilString &vrTxt);
     bool UpdateSelectedThread(void);
+    bool ConvertPrintfCtrlCodeToString(const MIchar vCtrl, CMIUtilString &vwrStrEquivalent);
+    bool HandleEventSBTarget(const lldb::SBEvent &vEvent);
+    bool HandleTargetEventBroadcastBitModulesLoaded(const lldb::SBEvent &vEvent);
+    bool SendLoadLibrary(lldb::SBModule module, lldb::SBTarget target);
 
     // Overridden:
   private:
diff --git tools/lldb-mi/MICmnMIOutOfBandRecord.cpp tools/lldb-mi/MICmnMIOutOfBandRecord.cpp
index 2977753..b73c905 100644
--- tools/lldb-mi/MICmnMIOutOfBandRecord.cpp
+++ tools/lldb-mi/MICmnMIOutOfBandRecord.cpp
@@ -36,7 +36,9 @@ CMICmnMIOutOfBandRecord::MapOutOfBandToOutOfBandText_t ms_MapOutOfBandToOutOfBan
     {CMICmnMIOutOfBandRecord::eOutOfBand_ThreadGroupStarted, "thread-group-started"},
     {CMICmnMIOutOfBandRecord::eOutOfBand_ThreadCreated, "thread-created"},
     {CMICmnMIOutOfBandRecord::eOutOfBand_ThreadExited, "thread-exited"},
-    {CMICmnMIOutOfBandRecord::eOutOfBand_ThreadSelected, "thread-selected"}};
+    {CMICmnMIOutOfBandRecord::eOutOfBand_ThreadSelected, "thread-selected"},
+    {CMICmnMIOutOfBandRecord::eOutOfBand_LibraryLoaded, "library-loaded"}
+};
 CMICmnMIOutOfBandRecord::MapOutOfBandToOutOfBandText_t ms_constMapAsyncRecordTextToToken = {
     {CMICmnMIOutOfBandRecord::eOutOfBand_Running, "*"},
     {CMICmnMIOutOfBandRecord::eOutOfBand_Stopped, "*"},
@@ -49,7 +51,9 @@ CMICmnMIOutOfBandRecord::MapOutOfBandToOutOfBandText_t ms_constMapAsyncRecordTex
     {CMICmnMIOutOfBandRecord::eOutOfBand_ThreadGroupStarted, "="},
     {CMICmnMIOutOfBandRecord::eOutOfBand_ThreadCreated, "="},
     {CMICmnMIOutOfBandRecord::eOutOfBand_ThreadExited, "="},
-    {CMICmnMIOutOfBandRecord::eOutOfBand_ThreadSelected, "="}};
+    {CMICmnMIOutOfBandRecord::eOutOfBand_ThreadSelected, "="},
+    {CMICmnMIOutOfBandRecord::eOutOfBand_LibraryLoaded, "="}
+};
 
 //++ ------------------------------------------------------------------------------------
 // Details: CMICmnMIOutOfBandRecord constructor.
diff --git tools/lldb-mi/MICmnMIOutOfBandRecord.h tools/lldb-mi/MICmnMIOutOfBandRecord.h
index 179e375..883fc8f 100644
--- tools/lldb-mi/MICmnMIOutOfBandRecord.h
+++ tools/lldb-mi/MICmnMIOutOfBandRecord.h
@@ -73,6 +73,7 @@ class CMICmnMIOutOfBandRecord : public CMICmnBase
         eOutOfBand_ThreadCreated,
         eOutOfBand_ThreadExited,
         eOutOfBand_ThreadSelected,
+        eOutOfBand_LibraryLoaded,
         eOutOfBand_count // Always the last one
     };
 
diff --git tools/lldb-mi/MICmnMIValueList.cpp tools/lldb-mi/MICmnMIValueList.cpp
index 187a1cb..92c115b 100644
--- tools/lldb-mi/MICmnMIValueList.cpp
+++ tools/lldb-mi/MICmnMIValueList.cpp
@@ -181,7 +181,18 @@ CMICmnMIValueList::BuildList(const CMICmnMIValue &vValue)
     if ( (len > 1) && (m_strValue[0] == '[') && (m_strValue[len - 1] == ']') )
         m_strValue = m_strValue.substr(1, len - 2);
     const MIchar *pFormat = "[%s,%s]";
-    m_strValue = CMIUtilString::Format(pFormat, m_strValue.c_str(), vValue.GetString().c_str());
+
+    CMIUtilString data(m_strValue);
+    
+    if (data[0] == '[')
+    {
+        data = data.substr(1, data.length() - 1);
+    }
+    if (data[data.size() - 1] == ']')
+    {
+        data = data.substr(0, data.length() - 1);
+    }
+    m_strValue = CMIUtilString::Format(pFormat, data.c_str(), vValue.GetString().c_str());
 
     return MIstatus::success;
 }
diff --git tools/lldb-mi/MICmnMIValueResult.cpp tools/lldb-mi/MICmnMIValueResult.cpp
index 7735844..e95ccd9 100644
--- tools/lldb-mi/MICmnMIValueResult.cpp
+++ tools/lldb-mi/MICmnMIValueResult.cpp
@@ -22,6 +22,7 @@
 // In-house headers:
 #include "MICmnMIValueResult.h"
 #include "MICmnResources.h"
+#include "MICmnMIValueConst.h"
 
 // Instantiations:
 const CMIUtilString CMICmnMIValueResult::ms_constStrEqual("=");
@@ -142,3 +143,22 @@ CMICmnMIValueResult::Add(const CMIUtilString &vrVariable, const CMICmnMIValue &v
         return BuildResult();
     }
 }
+
+
+const CMICmnMIValue
+CMICmnMIValueResultAddr::MakeValue(MIuint64 vValue)
+{
+    const CMIUtilString strAddr(CMIUtilString::Format("0x%08llx", vValue));
+    const CMICmnMIValueConst miValueConst(strAddr);
+    return miValueConst;
+}
+
+const CMICmnMIValue
+CMICmnMIValueResultUint::MakeValue(MIuint64 vValue)
+{
+    const CMIUtilString strAddr(CMIUtilString::Format("%lld", vValue));
+    const CMICmnMIValueConst miValueConst(strAddr);
+    return miValueConst;
+}
+
+
diff --git tools/lldb-mi/MICmnMIValueResult.h tools/lldb-mi/MICmnMIValueResult.h
index ec73e71..55cb8aa 100644
--- tools/lldb-mi/MICmnMIValueResult.h
+++ tools/lldb-mi/MICmnMIValueResult.h
@@ -73,3 +73,37 @@ class CMICmnMIValueResult : public CMICmnMIValue
     bool m_bEmptyConstruction; // True = *this object used constructor with no parameters, false = constructor with parameters
     bool m_bUseSpacing;        // True = put space seperators into the string, false = no spaces used
 };
+
+class CMICmnMIValueResultAddr: public CMICmnMIValueResult
+{
+    private:
+    static const CMICmnMIValue MakeValue(MIuint64 vValue);
+    
+    public:
+        /* ctor */ CMICmnMIValueResultAddr(const CMIUtilString &vVariable, MIuint64 vValue)
+    : CMICmnMIValueResult(vVariable, MakeValue(vValue))
+    {}
+    
+    // Overridden:
+    public:
+    // From CMICmnBase
+    /* dtor */ virtual ~CMICmnMIValueResultAddr(void) {}
+    
+};
+
+class CMICmnMIValueResultUint: public CMICmnMIValueResult
+{
+private:
+    static const CMICmnMIValue MakeValue(MIuint64 vValue);
+    
+public:
+    /* ctor */ CMICmnMIValueResultUint(const CMIUtilString &vVariable, MIuint64 vValue)
+    : CMICmnMIValueResult(vVariable, MakeValue(vValue))
+    {}
+    
+    // Overridden:
+public:
+    // From CMICmnBase
+    /* dtor */ virtual ~CMICmnMIValueResultUint(void) {}
+    
+};
diff --git tools/lldb-mi/MICmnResources.cpp tools/lldb-mi/MICmnResources.cpp
index 08fe364..6a8a3a6 100644
--- tools/lldb-mi/MICmnResources.cpp
+++ tools/lldb-mi/MICmnResources.cpp
@@ -263,7 +263,9 @@ const CMICmnResources::SRsrcTextData CMICmnResources::ms_pResourceId2TextData[]
     {IDS_CMD_ERR_SET_NEW_DRIVER_STATE, "Command '%s'. Command tried to set new MI Driver running state and failed. %s"},
     {IDS_CMD_ERR_INFO_PRINTFN_NOT_FOUND, "The request '%s' was not recogised, not implemented"},
     {IDS_CMD_ERR_INFO_PRINTFN_FAILED, "The request '%s' failed."},
-    {IDS_CMD_ERR_GDBSET_OPT_SOLIBSEARCHPATH, "'solib-search-path' requires at least one argument"}};
+    {IDS_CMD_ERR_GDBSET_OPT_SOLIBSEARCHPATH, "'solib-search-path' requires at least one argument"},
+    {IDS_CMD_ERR_ATTACH_FAILED, "Command '%s'. Attach to processs failed: %s"}
+};
 
 //++ ------------------------------------------------------------------------------------
 // Details: CMICmnResources constructor.
diff --git tools/lldb-mi/MICmnResources.h tools/lldb-mi/MICmnResources.h
index b02c9c6..9ab09d3 100644
--- tools/lldb-mi/MICmnResources.h
+++ tools/lldb-mi/MICmnResources.h
@@ -279,7 +279,8 @@ enum
     IDS_CMD_ERR_SET_NEW_DRIVER_STATE,
     IDS_CMD_ERR_INFO_PRINTFN_NOT_FOUND,
     IDS_CMD_ERR_INFO_PRINTFN_FAILED,
-    IDS_CMD_ERR_GDBSET_OPT_SOLIBSEARCHPATH
+    IDS_CMD_ERR_GDBSET_OPT_SOLIBSEARCHPATH,
+    IDS_CMD_ERR_ATTACH_FAILED
 };
 
 //++ ============================================================================
