diff --git a/source/API/SBAddress.cpp b/source/API/SBAddress.cpp
index f005965..6e6a806 100644
--- a/source/API/SBAddress.cpp
+++ b/source/API/SBAddress.cpp
@@ -32,7 +32,7 @@
         }
 
         AddressImpl (const Address &addr) :
-            m_module_sp (addr.GetModule()),
+            m_module_sp (addr.GetModuleSP()),
             m_address (addr)
         {
         }
@@ -301,7 +301,7 @@
     {
         Module *module = m_opaque_ap->GetModule();
         if (module)
-            *sb_module = module;
+            *sb_module = module->shared_from_this();
     }
     return sb_module;
 }
diff --git a/source/API/SBBreakpoint.cpp b/source/API/SBBreakpoint.cpp
index 62e4a4c..33bdbe0 100644
--- a/source/API/SBBreakpoint.cpp
+++ b/source/API/SBBreakpoint.cpp
@@ -497,14 +497,14 @@
             Process *process = ctx->exe_ctx.GetProcessPtr();
             if (process)
             {
-                SBProcess sb_process (process->GetSP());
+                SBProcess sb_process (process->shared_from_this());
                 SBThread sb_thread;
                 SBBreakpointLocation sb_location;
                 assert (bp_sp);
                 sb_location.SetLocation (bp_sp->FindLocationByID (break_loc_id));
                 Thread *thread = ctx->exe_ctx.GetThreadPtr();
                 if (thread)
-                    sb_thread.SetThread(thread->GetSP());
+                    sb_thread.SetThread(thread->shared_from_this());
 
                 return data->callback (data->callback_baton, 
                                           sb_process, 
diff --git a/source/API/SBBreakpointLocation.cpp b/source/API/SBBreakpointLocation.cpp
index 619428e..57cf5a1 100644
--- a/source/API/SBBreakpointLocation.cpp
+++ b/source/API/SBBreakpointLocation.cpp
@@ -301,7 +301,7 @@
     if (m_opaque_sp)
     {
         Mutex::Locker api_locker (m_opaque_sp->GetBreakpoint().GetTarget().GetAPIMutex());
-        *sb_bp = m_opaque_sp->GetBreakpoint ().GetSP();
+        *sb_bp = m_opaque_sp->GetBreakpoint ().shared_from_this();
     }
 
     if (log)
diff --git a/source/API/SBFrame.cpp b/source/API/SBFrame.cpp
index 3a3c582..c0a6978 100644
--- a/source/API/SBFrame.cpp
+++ b/source/API/SBFrame.cpp
@@ -553,7 +553,7 @@
     if (m_opaque_sp)
     {
         Mutex::Locker api_locker (m_opaque_sp->GetThread().GetProcess().GetTarget().GetAPIMutex());
-        sb_thread.SetThread (m_opaque_sp->GetThread().GetSP());
+        sb_thread.SetThread (m_opaque_sp->GetThread().shared_from_this());
     }
 
     if (log)
diff --git a/source/API/SBFunction.cpp b/source/API/SBFunction.cpp
index 4e23b9d..f55b214 100644
--- a/source/API/SBFunction.cpp
+++ b/source/API/SBFunction.cpp
@@ -133,10 +133,10 @@
             target->CalculateExecutionContext (exe_ctx);
             exe_ctx.SetProcessSP(target->GetProcessSP());
         }
-        Module *module = m_opaque_ptr->GetAddressRange().GetBaseAddress().GetModule();
-        if (module)
+        ModuleSP module_sp = m_opaque_ptr->GetAddressRange().GetBaseAddress().GetModuleSP();
+        if (module_sp)
         {
-            sb_instructions.SetDisassembler (Disassembler::DisassembleRange (module->GetArchitecture(),
+            sb_instructions.SetDisassembler (Disassembler::DisassembleRange (module_sp->GetArchitecture(),
                                                                              NULL,
                                                                              exe_ctx,
                                                                              m_opaque_ptr->GetAddressRange()));
diff --git a/source/API/SBProcess.cpp b/source/API/SBProcess.cpp
index aacec52..76c1bad 100644
--- a/source/API/SBProcess.cpp
+++ b/source/API/SBProcess.cpp
@@ -238,7 +238,7 @@
 
     SBTarget sb_target;
     if (m_opaque_sp)
-        sb_target = m_opaque_sp->GetTarget().GetSP();
+        sb_target = m_opaque_sp->GetTarget().shared_from_this();
     
     if (log)
         log->Printf ("SBProcess(%p)::GetTarget () => SBTarget(%p)", m_opaque_sp.get(), sb_target.get());
diff --git a/source/API/SBSection.cpp b/source/API/SBSection.cpp
index ed6dba7..dedcc7a 100644
--- a/source/API/SBSection.cpp
+++ b/source/API/SBSection.cpp
@@ -29,7 +29,7 @@
             m_section (section)
         {
             if (section)
-                m_module_sp = section->GetModule();
+                m_module_sp = section->GetModule()->shared_from_this();
         }
         
         SectionImpl (const SectionImpl &rhs) :
diff --git a/source/API/SBSymbol.cpp b/source/API/SBSymbol.cpp
index 1765dbd..51bb98c 100644
--- a/source/API/SBSymbol.cpp
+++ b/source/API/SBSymbol.cpp
@@ -131,10 +131,10 @@
         const AddressRange *symbol_range = m_opaque_ptr->GetAddressRangePtr();
         if (symbol_range)
         {
-            Module *module = symbol_range->GetBaseAddress().GetModule();
-            if (module)
+            ModuleSP module_sp = symbol_range->GetBaseAddress().GetModuleSP();
+            if (module_sp)
             {
-                sb_instructions.SetDisassembler (Disassembler::DisassembleRange (module->GetArchitecture (),
+                sb_instructions.SetDisassembler (Disassembler::DisassembleRange (module_sp->GetArchitecture (),
                                                                                  NULL,
                                                                                  exe_ctx,
                                                                                  *symbol_range));
diff --git a/source/API/SBTarget.cpp b/source/API/SBTarget.cpp
index 82224a9..f594827 100644
--- a/source/API/SBTarget.cpp
+++ b/source/API/SBTarget.cpp
@@ -119,7 +119,7 @@
 {
     SBDebugger debugger;
     if (m_opaque_sp)
-        debugger.reset (m_opaque_sp->GetDebugger().GetSP());
+        debugger.reset (m_opaque_sp->GetDebugger().shared_from_this());
     return debugger;
 }
 
diff --git a/source/API/SBValue.cpp b/source/API/SBValue.cpp
index 1ed3fea..87413e0 100644
--- a/source/API/SBValue.cpp
+++ b/source/API/SBValue.cpp
@@ -883,7 +883,7 @@
     {
         if (m_opaque_sp->GetExecutionContextScope())
         {
-            result = SBThread(m_opaque_sp->GetExecutionContextScope()->CalculateThread()->GetSP());
+            result = SBThread(m_opaque_sp->GetExecutionContextScope()->CalculateThread()->shared_from_this());
         }
     }
     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
@@ -905,7 +905,7 @@
     {
         if (m_opaque_sp->GetExecutionContextScope())
         {
-            result.SetFrame (m_opaque_sp->GetExecutionContextScope()->CalculateStackFrame()->GetSP());
+            result.SetFrame (m_opaque_sp->GetExecutionContextScope()->CalculateStackFrame()->shared_from_this());
         }
     }
     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
diff --git a/source/Breakpoint/Breakpoint.cpp b/source/Breakpoint/Breakpoint.cpp
index 9095db0..aa9fab2 100644
--- a/source/Breakpoint/Breakpoint.cpp
+++ b/source/Breakpoint/Breakpoint.cpp
@@ -556,11 +556,3 @@
 {
     m_filter_sp->GetDescription (s);
 }
-
-const BreakpointSP
-Breakpoint::GetSP ()
-{
-    // This object contains an instrusive ref count base class so we can
-    // easily make a shared pointer to this object
-    return BreakpointSP (this);
-}
diff --git a/source/Breakpoint/BreakpointLocation.cpp b/source/Breakpoint/BreakpointLocation.cpp
index 9adf189..fb123de 100644
--- a/source/Breakpoint/BreakpointLocation.cpp
+++ b/source/Breakpoint/BreakpointLocation.cpp
@@ -149,11 +149,10 @@
 ThreadPlan *
 BreakpointLocation::GetThreadPlanToTestCondition (ExecutionContext &exe_ctx, Stream &error)
 {
-    lldb::BreakpointLocationSP this_sp(this);
     if (m_options_ap.get())
-        return m_options_ap->GetThreadPlanToTestCondition (exe_ctx, this_sp, error);
+        return m_options_ap->GetThreadPlanToTestCondition (exe_ctx, shared_from_this(), error);
     else
-        return m_owner.GetThreadPlanToTestCondition (exe_ctx, this_sp, error);
+        return m_owner.GetThreadPlanToTestCondition (exe_ctx, shared_from_this(), error);
 }
 
 const char *
@@ -259,9 +258,7 @@
     if (m_owner.GetTarget().GetSectionLoadList().IsEmpty())
         return false;
 
-    BreakpointLocationSP this_sp(this);
-
-    lldb::break_id_t new_id = process->CreateBreakpointSite (this_sp, false);
+    lldb::break_id_t new_id = process->CreateBreakpointSite (shared_from_this(), false);
 
     if (new_id == LLDB_INVALID_BREAK_ID)
     {
diff --git a/source/Breakpoint/BreakpointSite.cpp b/source/Breakpoint/BreakpointSite.cpp
index 962117c..1ad7f8f 100644
--- a/source/Breakpoint/BreakpointSite.cpp
+++ b/source/Breakpoint/BreakpointSite.cpp
@@ -23,7 +23,7 @@
 BreakpointSite::BreakpointSite
 (
     BreakpointSiteList *list,
-    BreakpointLocationSP& owner,
+    const BreakpointLocationSP& owner,
     lldb::addr_t addr,
     lldb::tid_t tid,
     bool use_hardware
@@ -155,7 +155,7 @@
 }
 
 void
-BreakpointSite::AddOwner (BreakpointLocationSP &owner)
+BreakpointSite::AddOwner (const BreakpointLocationSP &owner)
 {
     m_owners.Add(owner);
 }
diff --git a/source/Commands/CommandObjectArgs.cpp b/source/Commands/CommandObjectArgs.cpp
index dfbbe79..01f798f 100644
--- a/source/Commands/CommandObjectArgs.cpp
+++ b/source/Commands/CommandObjectArgs.cpp
@@ -148,7 +148,7 @@
         return false;
     }
     
-    Module *thread_module = thread_cur_frame->GetFrameCodeAddress ().GetModule ();
+    Module *thread_module = thread_cur_frame->GetFrameCodeAddress ().GetModulePtr ();
     if (!thread_module)
     {
         result.AppendError ("The PC has no associated module.");
diff --git a/source/Commands/CommandObjectSource.cpp b/source/Commands/CommandObjectSource.cpp
index 07e133c..21f6339 100644
--- a/source/Commands/CommandObjectSource.cpp
+++ b/source/Commands/CommandObjectSource.cpp
@@ -468,7 +468,7 @@
                     {
                         const bool show_inlines = true;
                         m_breakpoint_locations.Reset (last_file_sp->GetFileSpec(), 0, show_inlines);
-                        SearchFilter target_search_filter (target->GetSP());
+                        SearchFilter target_search_filter (target->shared_from_this());
                         target_search_filter.Search (m_breakpoint_locations);
                     }
                 }
@@ -570,7 +570,7 @@
                     {
                         const bool show_inlines = true;
                         m_breakpoint_locations.Reset (*sc.comp_unit, 0, show_inlines);
-                        SearchFilter target_search_filter (target->GetSP());
+                        SearchFilter target_search_filter (target->shared_from_this());
                         target_search_filter.Search (m_breakpoint_locations);
                     }
                     else
diff --git a/source/Commands/CommandObjectTarget.cpp b/source/Commands/CommandObjectTarget.cpp
index 8b0fd17..3e05d21 100644
--- a/source/Commands/CommandObjectTarget.cpp
+++ b/source/Commands/CommandObjectTarget.cpp
@@ -1329,7 +1329,7 @@
         {
             if (!target->GetSectionLoadList().ResolveLoadAddress (addr, so_addr))
                 return false;
-            else if (so_addr.GetModule() != module)
+            else if (so_addr.GetModulePtr() != module)
                 return false;
         }
         else
@@ -1643,7 +1643,7 @@
             {
                 if (FileSpec::Equal(module->GetFileSpec(), module_file_spec, true))
                 {
-                    module_sp = module;
+                    module_sp = module->shared_from_this();
                     module_list.AppendIfNeeded(module_sp);
                 }
             }
@@ -2757,7 +2757,7 @@
                     Address module_address;
                     if (module_address.SetLoadAddress(m_options.m_module_addr, target))
                     {
-                        Module *module = module_address.GetModule();
+                        Module *module = module_address.GetModulePtr();
                         if (module)
                         {
                             PrintModule (strm, module);
@@ -2800,7 +2800,7 @@
                     if (use_global_module_list)
                     {
                         module = Module::GetAllocatedModuleAtIndex(image_idx);
-                        module_sp = module;
+                        module_sp = module->shared_from_this();
                     }
                     else
                     {
@@ -2874,7 +2874,7 @@
                     case 'r':
                         {
                             uint32_t ref_count = 0;
-                            ModuleSP module_sp (module);
+                            ModuleSP module_sp (module->shared_from_this());
                             if (module_sp)
                             {
                                 // Take one away to make sure we don't count our local "module_sp"
diff --git a/source/Commands/CommandObjectType.cpp b/source/Commands/CommandObjectType.cpp
index 26a110e..61756d7 100644
--- a/source/Commands/CommandObjectType.cpp
+++ b/source/Commands/CommandObjectType.cpp
@@ -75,7 +75,7 @@
     {
     }
     
-    typedef lldb::SharedPtr<ScriptAddOptions>::Type SharedPointer;
+    typedef SHARED_PTR(ScriptAddOptions) SharedPointer;
     
 };
 
@@ -108,7 +108,7 @@
     {
     }
     
-    typedef lldb::SharedPtr<SynthAddOptions>::Type SharedPointer;
+    typedef SHARED_PTR(SynthAddOptions) SharedPointer;
     
 };
 
diff --git a/source/Core/Address.cpp b/source/Core/Address.cpp
index 2ea3bb1..120ae5e 100644
--- a/source/Core/Address.cpp
+++ b/source/Core/Address.cpp
@@ -55,7 +55,7 @@
 
     if (byte_order == eByteOrderInvalid || addr_size == 0)
     {
-        Module *module = address.GetModule();
+        Module *module = address.GetModulePtr();
         if (module)
         {
             byte_order = module->GetArchitecture().GetByteOrder();
@@ -118,7 +118,7 @@
         {
             // If we were not running, yet able to read an integer, we must
             // have a module
-            Module *module = address.GetModule();
+            Module *module = address.GetModulePtr();
             assert (module);
             if (module->ResolveFileAddress(deref_addr, deref_so_addr))
                 return true;
@@ -248,13 +248,26 @@
 }
 
 Module *
-Address::GetModule () const
+Address::GetModulePtr () const
 {
     if (m_section)
         return m_section->GetModule();
     return NULL;
 }
 
+ModuleSP
+Address::GetModuleSP () const
+{
+    lldb::ModuleSP module_sp;
+    if (m_section)
+    {
+        Module *module = m_section->GetModule();
+        if (module)
+            module_sp = module->shared_from_this();
+    }
+    return module_sp;
+}
+
 addr_t
 Address::GetFileAddress () const
 {
@@ -434,7 +447,7 @@
             }
 
             uint32_t pointer_size = 4;
-            Module *module = GetModule();
+            Module *module = GetModulePtr();
             if (target)
                 pointer_size = target->GetArchitecture().GetAddressByteSize();
             else if (module)
@@ -670,7 +683,7 @@
     case DumpStyleDetailedSymbolContext:
         if (IsSectionOffset())
         {
-            Module *module = GetModule();
+            Module *module = GetModulePtr();
             if (module)
             {
                 SymbolContext sc;
@@ -738,7 +751,7 @@
         Module *address_module = m_section->GetModule();
         if (address_module)
         {
-            sc->module_sp = address_module;
+            sc->module_sp = address_module->shared_from_this();
             if (sc->module_sp)
                 return sc->module_sp->ResolveSymbolContextForAddress (*this, resolve_scope, *sc);
         }
@@ -760,7 +773,7 @@
     if (m_section)
     {
         SymbolContext sc;
-        sc.module_sp = m_section->GetModule();
+        sc.module_sp = m_section->GetModule()->shared_from_this();
         if (sc.module_sp)
         {
             sc.module_sp->ResolveSymbolContextForAddress (*this, eSymbolContextCompUnit, sc);
@@ -776,7 +789,7 @@
     if (m_section)
     {
         SymbolContext sc;
-        sc.module_sp = m_section->GetModule();
+        sc.module_sp = m_section->GetModule()->shared_from_this();
         if (sc.module_sp)
         {
             sc.module_sp->ResolveSymbolContextForAddress (*this, eSymbolContextFunction, sc);
@@ -792,7 +805,7 @@
     if (m_section)
     {
         SymbolContext sc;
-        sc.module_sp = m_section->GetModule();
+        sc.module_sp = m_section->GetModule()->shared_from_this();
         if (sc.module_sp)
         {
             sc.module_sp->ResolveSymbolContextForAddress (*this, eSymbolContextBlock, sc);
@@ -808,7 +821,7 @@
     if (m_section)
     {
         SymbolContext sc;
-        sc.module_sp = m_section->GetModule();
+        sc.module_sp = m_section->GetModule()->shared_from_this();
         if (sc.module_sp)
         {
             sc.module_sp->ResolveSymbolContextForAddress (*this, eSymbolContextSymbol, sc);
@@ -824,7 +837,7 @@
     if (m_section)
     {
         SymbolContext sc;
-        sc.module_sp = m_section->GetModule();
+        sc.module_sp = m_section->GetModule()->shared_from_this();
         if (sc.module_sp)
         {
             sc.module_sp->ResolveSymbolContextForAddress (*this, eSymbolContextLineEntry, sc);
@@ -868,8 +881,8 @@
 int
 Address::CompareModulePointerAndOffset (const Address& a, const Address& b)
 {
-    Module *a_module = a.GetModule ();
-    Module *b_module = b.GetModule ();
+    Module *a_module = a.GetModulePtr ();
+    Module *b_module = b.GetModulePtr ();
     if (a_module < b_module)
         return -1;
     if (a_module > b_module)
@@ -913,8 +926,8 @@
 bool
 lldb_private::operator< (const Address& lhs, const Address& rhs)
 {
-    Module *lhs_module = lhs.GetModule();
-    Module *rhs_module = rhs.GetModule();    
+    Module *lhs_module = lhs.GetModulePtr();
+    Module *rhs_module = rhs.GetModulePtr();    
     if (lhs_module == rhs_module)
     {
         // Addresses are in the same module, just compare the file addresses
@@ -931,8 +944,8 @@
 bool
 lldb_private::operator> (const Address& lhs, const Address& rhs)
 {
-    Module *lhs_module = lhs.GetModule();
-    Module *rhs_module = rhs.GetModule();    
+    Module *lhs_module = lhs.GetModulePtr();
+    Module *rhs_module = rhs.GetModulePtr();    
     if (lhs_module == rhs_module)
     {
         // Addresses are in the same module, just compare the file addresses
@@ -987,7 +1000,7 @@
 AddressClass
 Address::GetAddressClass () const
 {
-    Module *module = GetModule();
+    Module *module = GetModulePtr();
     if (module)
     {
         ObjectFile *obj_file = module->GetObjectFile();
diff --git a/source/Core/AddressRange.cpp b/source/Core/AddressRange.cpp
index 391f611..700de90 100644
--- a/source/Core/AddressRange.cpp
+++ b/source/Core/AddressRange.cpp
@@ -177,7 +177,7 @@
     {
         if (show_module)
         {
-            Module *module = GetBaseAddress().GetModule();
+            Module *module = GetBaseAddress().GetModulePtr();
             if (module)
                 s->Printf("%s", module->GetFileSpec().GetFilename().AsCString());
         }
diff --git a/source/Core/Debugger.cpp b/source/Core/Debugger.cpp
index 8b5e8d4..f979c8d 100644
--- a/source/Core/Debugger.cpp
+++ b/source/Core/Debugger.cpp
@@ -263,14 +263,6 @@
 }
 
 DebuggerSP
-Debugger::GetSP ()
-{
-    // This object contains an instrusive ref count base class so we can
-    // easily make a shared pointer to this object
-    return DebuggerSP (this);
-}
-
-DebuggerSP
 Debugger::FindDebuggerWithInstanceName (const ConstString &instance_name)
 {
     DebuggerSP debugger_sp;
diff --git a/source/Core/Disassembler.cpp b/source/Core/Disassembler.cpp
index fe044a6..d6b19ac 100644
--- a/source/Core/Disassembler.cpp
+++ b/source/Core/Disassembler.cpp
@@ -383,7 +383,7 @@
 
             prev_sc = sc;
 
-            Module *module = addr.GetModule();
+            Module *module = addr.GetModulePtr();
             if (module)
             {
                 uint32_t resolved_mask = module->ResolveSymbolContextForAddress(addr, eSymbolContextEverything, sc);
diff --git a/source/Core/Module.cpp b/source/Core/Module.cpp
index 556b4a5..28e8be2 100644
--- a/source/Core/Module.cpp
+++ b/source/Core/Module.cpp
@@ -224,7 +224,7 @@
         return;
 
     SymbolContext sc;
-    sc.module_sp = this;
+    sc.module_sp = shared_from_this();
     uint32_t cu_idx;
     SymbolVendor *symbols = GetSymbolVendor ();
 
@@ -258,7 +258,7 @@
 void
 Module::CalculateSymbolContext(SymbolContext* sc)
 {
-    sc->module_sp = this;
+    sc->module_sp = shared_from_this();
 }
 
 Module *
@@ -328,7 +328,7 @@
     {
         // If the section offset based address resolved itself, then this
         // is the right module.
-        sc.module_sp = this;
+        sc.module_sp = shared_from_this();
         resolved_flags |= eSymbolContextModule;
 
         // Resolve the compile unit, function, block, line table or line
@@ -430,7 +430,7 @@
     const uint32_t start_size = sc_list.GetSize();
     const uint32_t num_compile_units = GetNumCompileUnits();
     SymbolContext sc;
-    sc.module_sp = this;
+    sc.module_sp = shared_from_this();
     const bool compare_directory = path.GetDirectory();
     for (uint32_t i=0; i<num_compile_units; ++i)
     {
diff --git a/source/Core/ModuleList.cpp b/source/Core/ModuleList.cpp
index ff25f19..5046f4a 100644
--- a/source/Core/ModuleList.cpp
+++ b/source/Core/ModuleList.cpp
@@ -585,7 +585,7 @@
 {
     // The address is already section offset so it has a module
     uint32_t resolved_flags = 0;
-    Module *module = so_addr.GetModule();
+    Module *module = so_addr.GetModulePtr();
     if (module)
     {
         resolved_flags = module->ResolveSymbolContextForAddress (so_addr,
diff --git a/source/Core/SearchFilter.cpp b/source/Core/SearchFilter.cpp
index d31ed8b..342e988 100644
--- a/source/Core/SearchFilter.cpp
+++ b/source/Core/SearchFilter.cpp
@@ -318,7 +318,7 @@
 // SearchFilterByModule constructors
 //----------------------------------------------------------------------
 
-SearchFilterByModule::SearchFilterByModule (lldb::TargetSP &target_sp, const FileSpec &module) :
+SearchFilterByModule::SearchFilterByModule (const lldb::TargetSP &target_sp, const FileSpec &module) :
     SearchFilter (target_sp),
     m_module_spec (module)
 {
@@ -430,7 +430,7 @@
         Module* module = m_target_sp->GetImages().GetModulePointerAtIndex(i);
         if (FileSpec::Compare (m_module_spec, module->GetFileSpec(), false) == 0)
         {
-            SymbolContext matchingContext(m_target_sp, ModuleSP(module));
+            SymbolContext matchingContext(m_target_sp, module->shared_from_this());
             Searcher::CallbackReturn shouldContinue;
 
             shouldContinue = DoModuleIteration(matchingContext, searcher);
@@ -476,7 +476,7 @@
 // SearchFilterByModuleList constructors
 //----------------------------------------------------------------------
 
-SearchFilterByModuleList::SearchFilterByModuleList (lldb::TargetSP &target_sp, const FileSpecList &module_list) :
+SearchFilterByModuleList::SearchFilterByModuleList (const lldb::TargetSP &target_sp, const FileSpecList &module_list) :
     SearchFilter (target_sp),
     m_module_spec_list (module_list)
 {
@@ -594,7 +594,7 @@
         Module* module = m_target_sp->GetImages().GetModulePointerAtIndex(i);
         if (m_module_spec_list.FindFileIndex(0, module->GetFileSpec(), false) != UINT32_MAX)
         {
-            SymbolContext matchingContext(m_target_sp, ModuleSP(module));
+            SymbolContext matchingContext(m_target_sp, module->shared_from_this());
             Searcher::CallbackReturn shouldContinue;
 
             shouldContinue = DoModuleIteration(matchingContext, searcher);
@@ -664,7 +664,7 @@
 // SearchFilterByModuleListAndCU constructors
 //----------------------------------------------------------------------
 
-SearchFilterByModuleListAndCU::SearchFilterByModuleListAndCU (lldb::TargetSP &target_sp, 
+SearchFilterByModuleListAndCU::SearchFilterByModuleListAndCU (const lldb::TargetSP &target_sp, 
                                                               const FileSpecList &module_list,
                                                               const FileSpecList &cu_list) :
     SearchFilterByModuleList (target_sp, module_list),
diff --git a/source/Core/ValueObject.cpp b/source/Core/ValueObject.cpp
index cfc5dcd..dbf5bc6 100644
--- a/source/Core/ValueObject.cpp
+++ b/source/Core/ValueObject.cpp
@@ -3490,7 +3490,7 @@
     Target *target = exe_ctx.GetTargetPtr();
     if (target != NULL)
     {
-        m_target_sp = target;
+        m_target_sp = target->shared_from_this();
         m_process_sp = exe_ctx.GetProcessSP();
         if (!m_process_sp)
             m_process_sp = target->GetProcessSP();
diff --git a/source/Core/ValueObjectMemory.cpp b/source/Core/ValueObjectMemory.cpp
index bd7a791..5d9406e 100644
--- a/source/Core/ValueObjectMemory.cpp
+++ b/source/Core/ValueObjectMemory.cpp
@@ -272,7 +272,7 @@
 Module *
 ValueObjectMemory::GetModule()
 {
-    return m_address.GetModule();
+    return m_address.GetModulePtr();
 }
 
 
diff --git a/source/Expression/ClangASTSource.cpp b/source/Expression/ClangASTSource.cpp
index d7a1926..162dfab 100644
--- a/source/Expression/ClangASTSource.cpp
+++ b/source/Expression/ClangASTSource.cpp
@@ -946,7 +946,7 @@
 NamespaceDecl *
 ClangASTSource::AddNamespace (NameSearchContext &context, ClangASTImporter::NamespaceMapSP &namespace_decls)
 {
-    if (namespace_decls.empty())
+    if (!namespace_decls)
         return NULL;
     
     lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
diff --git a/source/Expression/ClangFunction.cpp b/source/Expression/ClangFunction.cpp
index c583da9..2244769 100644
--- a/source/Expression/ClangFunction.cpp
+++ b/source/Expression/ClangFunction.cpp
@@ -70,7 +70,7 @@
     // Can't make a ClangFunction without a process.
     assert (process != NULL);
         
-    m_jit_process_sp = process->GetSP();
+    m_jit_process_sp = process->shared_from_this();
 }
 
 ClangFunction::ClangFunction
@@ -95,7 +95,7 @@
     // Can't make a ClangFunction without a process.
     assert (process != NULL);
         
-    m_jit_process_sp = process->GetSP();
+    m_jit_process_sp = process->shared_from_this();
 
     m_function_addr = m_function_ptr->GetAddressRange().GetBaseAddress();
     m_function_return_qual_type = m_function_ptr->GetReturnClangType();
@@ -266,7 +266,7 @@
     if (!jit_error.Success())
         return false;
     if (process && m_jit_alloc != LLDB_INVALID_ADDRESS)
-        m_jit_process_sp = process->GetSP();
+        m_jit_process_sp = process->shared_from_this();
 
     return true;
 }
diff --git a/source/Expression/ClangUserExpression.cpp b/source/Expression/ClangUserExpression.cpp
index 7719f08..0bcae47 100644
--- a/source/Expression/ClangUserExpression.cpp
+++ b/source/Expression/ClangUserExpression.cpp
@@ -357,7 +357,7 @@
     if (jit_error.Success())
     {
         if (process && m_jit_alloc != LLDB_INVALID_ADDRESS)
-            m_jit_process_sp = process->GetSP();        
+            m_jit_process_sp = process->shared_from_this();        
         return true;
     }
     else
diff --git a/source/Expression/ClangUtilityFunction.cpp b/source/Expression/ClangUtilityFunction.cpp
index 7220be8..78c3c16 100644
--- a/source/Expression/ClangUtilityFunction.cpp
+++ b/source/Expression/ClangUtilityFunction.cpp
@@ -148,7 +148,7 @@
     }
     
     if (m_jit_start_addr != LLDB_INVALID_ADDRESS)
-        m_jit_process_sp = process->GetSP();
+        m_jit_process_sp = process->shared_from_this();
     
 #if 0
 	// jingham: look here
diff --git a/source/Expression/IRInterpreter.cpp b/source/Expression/IRInterpreter.cpp
index 3cbe9f3..a7ca4c8 100644
--- a/source/Expression/IRInterpreter.cpp
+++ b/source/Expression/IRInterpreter.cpp
@@ -69,8 +69,8 @@
     return s;
 }
 
-typedef lldb::SharedPtr <lldb_private::DataEncoder>::Type DataEncoderSP;
-typedef lldb::SharedPtr <lldb_private::DataExtractor>::Type DataExtractorSP;
+typedef SHARED_PTR(lldb_private::DataEncoder) DataEncoderSP;
+typedef SHARED_PTR(lldb_private::DataExtractor) DataExtractorSP;
 
 class Memory
 {
@@ -127,7 +127,7 @@
         }
     };
     
-    typedef lldb::SharedPtr <Allocation>::Type  AllocationSP;
+    typedef SHARED_PTR(Allocation)  AllocationSP;
     
     struct Region
     {
diff --git a/source/Interpreter/CommandInterpreter.cpp b/source/Interpreter/CommandInterpreter.cpp
index 77cab23..9d6ac25 100644
--- a/source/Interpreter/CommandInterpreter.cpp
+++ b/source/Interpreter/CommandInterpreter.cpp
@@ -2559,7 +2559,7 @@
             m_exe_ctx.SetProcessSP (process_sp);
             if (process_sp && process_sp->IsAlive() && !process_sp->IsRunning())
             {
-                ThreadSP thread_sp (process_sp->GetThreadList().GetSelectedThread().get());
+                ThreadSP thread_sp (process_sp->GetThreadList().GetSelectedThread());
                 if (thread_sp)
                 {
                     m_exe_ctx.SetThreadSP (thread_sp);
diff --git a/source/Interpreter/ScriptInterpreterPython.cpp b/source/Interpreter/ScriptInterpreterPython.cpp
index 691e0d5..58cb329 100644
--- a/source/Interpreter/ScriptInterpreterPython.cpp
+++ b/source/Interpreter/ScriptInterpreterPython.cpp
@@ -1727,7 +1727,7 @@
         return false;
     }
     
-    lldb::DebuggerSP debugger_sp = m_interpreter.GetDebugger().GetSP();
+    lldb::DebuggerSP debugger_sp = m_interpreter.GetDebugger().shared_from_this();
 
     {
         Locker py_lock(this);
@@ -1837,7 +1837,7 @@
         return false;
     }
     
-    lldb::DebuggerSP debugger_sp = m_interpreter.GetDebugger().GetSP();
+    lldb::DebuggerSP debugger_sp = m_interpreter.GetDebugger().shared_from_this();
 
     if (!debugger_sp.get())
     {
diff --git a/source/Plugins/Disassembler/llvm/DisassemblerLLVM.cpp b/source/Plugins/Disassembler/llvm/DisassemblerLLVM.cpp
index e395ccc..0d1e74b 100644
--- a/source/Plugins/Disassembler/llvm/DisassemblerLLVM.cpp
+++ b/source/Plugins/Disassembler/llvm/DisassemblerLLVM.cpp
@@ -122,7 +122,7 @@
     }
     else
     {
-        Module *module = inst_addr.GetModule();
+        Module *module = inst_addr.GetModulePtr();
         if (module)
         {
             if (module->ResolveFileAddress(operand_value, so_addr))
diff --git a/source/Plugins/DynamicLoader/MacOSX-DYLD/DynamicLoaderMacOSXDYLD.cpp b/source/Plugins/DynamicLoader/MacOSX-DYLD/DynamicLoaderMacOSXDYLD.cpp
index d74bdf1..4f915a9 100644
--- a/source/Plugins/DynamicLoader/MacOSX-DYLD/DynamicLoaderMacOSXDYLD.cpp
+++ b/source/Plugins/DynamicLoader/MacOSX-DYLD/DynamicLoaderMacOSXDYLD.cpp
@@ -1255,12 +1255,12 @@
         AddressRange *ar = sym_ctx.symbol->GetAddressRangePtr();
         if (ar)
         {
-            module_sp = ar->GetBaseAddress().GetModule();
+            module_sp = ar->GetBaseAddress().GetModuleSP();
         }
     }
     if (module_sp.get() == NULL && sym_ctx.function)
     {
-        module_sp = sym_ctx.function->GetAddressRange().GetBaseAddress().GetModule();
+        module_sp = sym_ctx.function->GetAddressRange().GetBaseAddress().GetModuleSP();
     }
     if (module_sp.get() == NULL)
         return false;
@@ -1522,7 +1522,7 @@
                         
                         Module* module_to_add = sc.symbol->CalculateSymbolContextModule();
                         if (module_to_add)
-                             modules_to_search.AppendIfNeeded(static_cast<ModuleSP>(module_to_add));
+                             modules_to_search.AppendIfNeeded(module_to_add->shared_from_this());
                     }
                     
                     // If the original stub symbol is a resolver, then we don't want to break on the symbol with the
diff --git a/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCRuntime.cpp b/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCRuntime.cpp
index 7df812c..c6e0819 100644
--- a/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCRuntime.cpp
+++ b/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCRuntime.cpp
@@ -220,7 +220,7 @@
 {
     // Maybe check here and if we have a handler already, and the UUID of this module is the same as the one in the
     // current module, then we don't have to reread it?
-    m_objc_trampoline_handler_ap.reset(new AppleObjCTrampolineHandler (m_process->GetSP(), module_sp));
+    m_objc_trampoline_handler_ap.reset(new AppleObjCTrampolineHandler (m_process->shared_from_this(), module_sp));
     if (m_objc_trampoline_handler_ap.get() != NULL)
     {
         m_read_objc_library = true;
diff --git a/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCSymbolVendor.cpp b/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCSymbolVendor.cpp
index b7c7a1d..13dc7d7 100644
--- a/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCSymbolVendor.cpp
+++ b/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCSymbolVendor.cpp
@@ -19,7 +19,7 @@
 
 AppleObjCSymbolVendor::AppleObjCSymbolVendor(Process *process) :
     SymbolVendor(NULL),
-    m_process(process->GetSP()),
+    m_process(process->shared_from_this()),
     m_ast_ctx(process->GetTarget().GetArchitecture().GetTriple().getTriple().c_str())
 {
 }
diff --git a/source/Plugins/ObjectContainer/BSD-Archive/ObjectContainerBSDArchive.h b/source/Plugins/ObjectContainer/BSD-Archive/ObjectContainerBSDArchive.h
index def3f73..6501c5a 100644
--- a/source/Plugins/ObjectContainer/BSD-Archive/ObjectContainerBSDArchive.h
+++ b/source/Plugins/ObjectContainer/BSD-Archive/ObjectContainerBSDArchive.h
@@ -118,7 +118,7 @@
     class Archive
     {
     public:
-        typedef lldb::SharedPtr<Archive>::Type shared_ptr;
+        typedef SHARED_PTR(Archive) shared_ptr;
         typedef std::multimap<lldb_private::FileSpec, shared_ptr> Map;
 
         static Map &
diff --git a/source/Plugins/Process/MacOSX-Kernel/ProcessKDPLog.cpp b/source/Plugins/Process/MacOSX-Kernel/ProcessKDPLog.cpp
index 199b55c..6e230fb 100644
--- a/source/Plugins/Process/MacOSX-Kernel/ProcessKDPLog.cpp
+++ b/source/Plugins/Process/MacOSX-Kernel/ProcessKDPLog.cpp
@@ -104,7 +104,7 @@
     // Now make a new log with this stream if one was provided
     if (log_stream_sp)
     {
-        log = make_shared<Log>(log_stream_sp);
+        log.reset (new Log(log_stream_sp));
         GetLog () = log;
     }
 
diff --git a/source/Plugins/Process/Utility/RegisterContextLLDB.cpp b/source/Plugins/Process/Utility/RegisterContextLLDB.cpp
index 3dc2102..3ae19f9 100644
--- a/source/Plugins/Process/Utility/RegisterContextLLDB.cpp
+++ b/source/Plugins/Process/Utility/RegisterContextLLDB.cpp
@@ -126,7 +126,7 @@
         {
             m_current_offset = frame_sp->GetFrameCodeAddress().GetOffset() - m_start_pc.GetOffset();
         }
-        else if (frame_sp->GetFrameCodeAddress().GetModule() == m_start_pc.GetModule())
+        else if (frame_sp->GetFrameCodeAddress().GetModulePtr() == m_start_pc.GetModulePtr())
         {
             // This means that whatever symbol we kicked up isn't really correct
             // as no should cross section boundaries... We really should NULL out
@@ -284,7 +284,7 @@
 
     // If we don't have a Module for some reason, we're not going to find symbol/function information - just
     // stick in some reasonable defaults and hope we can unwind past this frame.
-    if (!m_current_pc.IsValid() || m_current_pc.GetModule() == NULL)
+    if (!m_current_pc.IsValid() || m_current_pc.GetModulePtr() == NULL)
     {
         if (log)
         {
@@ -397,7 +397,7 @@
     }
 
     // We require that eSymbolContextSymbol be successfully filled in or this context is of no use to us.
-    if ((m_current_pc.GetModule()->ResolveSymbolContextForAddress (m_current_pc, eSymbolContextFunction| eSymbolContextSymbol, m_sym_ctx) & eSymbolContextSymbol) == eSymbolContextSymbol)
+    if ((m_current_pc.GetModulePtr()->ResolveSymbolContextForAddress (m_current_pc, eSymbolContextFunction| eSymbolContextSymbol, m_sym_ctx) & eSymbolContextSymbol) == eSymbolContextSymbol)
     {
         m_sym_ctx_valid = true;
     }
@@ -436,7 +436,7 @@
         temporary_pc.SetOffset(m_current_pc.GetOffset() - 1);
         m_sym_ctx.Clear();
         m_sym_ctx_valid = false;
-        if ((m_current_pc.GetModule()->ResolveSymbolContextForAddress (temporary_pc, eSymbolContextFunction| eSymbolContextSymbol, m_sym_ctx) & eSymbolContextSymbol) == eSymbolContextSymbol)
+        if ((m_current_pc.GetModulePtr()->ResolveSymbolContextForAddress (temporary_pc, eSymbolContextFunction| eSymbolContextSymbol, m_sym_ctx) & eSymbolContextSymbol) == eSymbolContextSymbol)
         {
             m_sym_ctx_valid = true;
         }
@@ -619,13 +619,13 @@
 RegisterContextLLDB::GetFastUnwindPlanForFrame ()
 {
     UnwindPlanSP unwind_plan_sp;
-    if (!m_current_pc.IsValid() || m_current_pc.GetModule() == NULL || m_current_pc.GetModule()->GetObjectFile() == NULL)
+    if (!m_current_pc.IsValid() || m_current_pc.GetModulePtr() == NULL || m_current_pc.GetModulePtr()->GetObjectFile() == NULL)
         return unwind_plan_sp;
 
     if (IsFrameZero ())
         return unwind_plan_sp;
 
-    FuncUnwindersSP func_unwinders_sp (m_current_pc.GetModule()->GetObjectFile()->GetUnwindTable().GetFuncUnwindersContainingAddress (m_current_pc, m_sym_ctx));
+    FuncUnwindersSP func_unwinders_sp (m_current_pc.GetModulePtr()->GetObjectFile()->GetUnwindTable().GetFuncUnwindersContainingAddress (m_current_pc, m_sym_ctx));
     if (!func_unwinders_sp)
         return unwind_plan_sp;
 
@@ -712,7 +712,7 @@
     }
 
     // No Module for the current pc, try using the architecture default unwind.
-    if (!m_current_pc.IsValid() || m_current_pc.GetModule() == NULL || m_current_pc.GetModule()->GetObjectFile() == NULL)
+    if (!m_current_pc.IsValid() || m_current_pc.GetModulePtr() == NULL || m_current_pc.GetModulePtr()->GetObjectFile() == NULL)
     {
         m_frame_type = eNormalFrame;
         return arch_default_unwind_plan_sp;
@@ -721,7 +721,7 @@
     FuncUnwindersSP func_unwinders_sp;
     if (m_sym_ctx_valid)
     {
-        func_unwinders_sp = m_current_pc.GetModule()->GetObjectFile()->GetUnwindTable().GetFuncUnwindersContainingAddress (m_current_pc, m_sym_ctx);
+        func_unwinders_sp = m_current_pc.GetModulePtr()->GetObjectFile()->GetUnwindTable().GetFuncUnwindersContainingAddress (m_current_pc, m_sym_ctx);
     }
 
     // No FuncUnwinders available for this pc, try using architectural default unwind.
diff --git a/source/Plugins/Process/Utility/RegisterContextLLDB.h b/source/Plugins/Process/Utility/RegisterContextLLDB.h
index a578fd7..cdb0ccb 100644
--- a/source/Plugins/Process/Utility/RegisterContextLLDB.h
+++ b/source/Plugins/Process/Utility/RegisterContextLLDB.h
@@ -25,7 +25,7 @@
 class RegisterContextLLDB : public lldb_private::RegisterContext
 {
 public:
-    typedef lldb::SharedPtr<RegisterContextLLDB>::Type SharedPtr;
+    typedef SHARED_PTR(RegisterContextLLDB) SharedPtr;
 
     RegisterContextLLDB (lldb_private::Thread &thread,
                          const SharedPtr& next_frame,
diff --git a/source/Plugins/Process/Utility/UnwindLLDB.cpp b/source/Plugins/Process/Utility/UnwindLLDB.cpp
index 954ad8b..bf71b00 100644
--- a/source/Plugins/Process/Utility/UnwindLLDB.cpp
+++ b/source/Plugins/Process/Utility/UnwindLLDB.cpp
@@ -69,10 +69,10 @@
 {
     // First, set up the 0th (initial) frame
     CursorSP first_cursor_sp(new Cursor ());
-    RegisterContextLLDBSharedPtr reg_ctx_sp (new RegisterContextLLDB (m_thread, 
-                                                                        RegisterContextLLDBSharedPtr(), 
-                                                                        first_cursor_sp->sctx, 
-                                                                        0, *this));
+    RegisterContextLLDBSP reg_ctx_sp (new RegisterContextLLDB (m_thread, 
+                                                               RegisterContextLLDBSP(), 
+                                                               first_cursor_sp->sctx, 
+                                                               0, *this));
     if (reg_ctx_sp.get() == NULL)
         return false;
     
@@ -87,7 +87,7 @@
 
     // Everything checks out, so release the auto pointer value and let the
     // cursor own it in its shared pointer
-    first_cursor_sp->reg_ctx = reg_ctx_sp;
+    first_cursor_sp->reg_ctx_lldb_sp = reg_ctx_sp;
     m_frames.push_back (first_cursor_sp);
     return true;
 }
@@ -104,10 +104,11 @@
         return false;
 
     uint32_t cur_idx = m_frames.size ();
-    RegisterContextLLDBSharedPtr reg_ctx_sp(new RegisterContextLLDB (m_thread, 
-                                                                       m_frames[cur_idx - 1]->reg_ctx, 
-                                                                       cursor_sp->sctx, 
-                                                                       cur_idx, *this));
+    RegisterContextLLDBSP reg_ctx_sp(new RegisterContextLLDB (m_thread, 
+                                                              m_frames[cur_idx - 1]->reg_ctx_lldb_sp, 
+                                                              cursor_sp->sctx, 
+                                                              cur_idx, 
+                                                              *this));
     if (reg_ctx_sp.get() == NULL)
         return false;
 
@@ -171,7 +172,7 @@
             }
         }
     }
-    cursor_sp->reg_ctx = reg_ctx_sp;
+    cursor_sp->reg_ctx_lldb_sp = reg_ctx_sp;
     m_frames.push_back (cursor_sp);
     return true;
 }
@@ -218,21 +219,27 @@
 
     ABI *abi = m_thread.GetProcess().GetABI().get();
 
-    while (idx >= m_frames.size() && AddOneMoreFrame (abi))
-        ;
+    while (idx >= m_frames.size())
+    {
+        if (!AddOneMoreFrame (abi))
+            break;
+    }
 
-    if (idx < m_frames.size ())
-        reg_ctx_sp = m_frames[idx]->reg_ctx;
+    const uint32_t num_frames = m_frames.size();
+    if (idx < num_frames)
+    {
+        Cursor *frame_cursor = m_frames[idx].get();
+        reg_ctx_sp = frame_cursor->reg_ctx_lldb_sp->shared_from_this();
+    }
     return reg_ctx_sp;
 }
 
-UnwindLLDB::RegisterContextLLDBSharedPtr
+UnwindLLDB::RegisterContextLLDBSP
 UnwindLLDB::GetRegisterContextForFrameNum (uint32_t frame_num)
 {
-    RegisterContextLLDBSharedPtr reg_ctx_sp;
-    if (frame_num >= m_frames.size())
-        return reg_ctx_sp;
-    reg_ctx_sp = m_frames[frame_num]->reg_ctx;
+    RegisterContextLLDBSP reg_ctx_sp;
+    if (frame_num < m_frames.size())
+        reg_ctx_sp = m_frames[frame_num]->reg_ctx_lldb_sp;
     return reg_ctx_sp;
 }
 
@@ -244,7 +251,7 @@
         return false;
     while (frame_num >= 0)
     {
-        if (m_frames[frame_num]->reg_ctx->SavedLocationForRegister (lldb_regnum, regloc, false))
+        if (m_frames[frame_num]->reg_ctx_lldb_sp->SavedLocationForRegister (lldb_regnum, regloc, false))
             return true;
         frame_num--;
     }
diff --git a/source/Plugins/Process/Utility/UnwindLLDB.h b/source/Plugins/Process/Utility/UnwindLLDB.h
index ec9271b..b9352b6 100644
--- a/source/Plugins/Process/Utility/UnwindLLDB.h
+++ b/source/Plugins/Process/Utility/UnwindLLDB.h
@@ -69,11 +69,11 @@
     lldb::RegisterContextSP
     DoCreateRegisterContextForFrame (lldb_private::StackFrame *frame);
 
-    typedef lldb::SharedPtr<lldb_private::RegisterContextLLDB>::Type RegisterContextLLDBSharedPtr;
+    typedef SHARED_PTR(RegisterContextLLDB) RegisterContextLLDBSP;
 
     // Needed to retrieve the "next" frame (e.g. frame 2 needs to retrieve frame 1's RegisterContextLLDB)
     // The RegisterContext for frame_num must already exist or this returns an empty shared pointer.
-    RegisterContextLLDBSharedPtr
+    RegisterContextLLDBSP
     GetRegisterContextForFrameNum (uint32_t frame_num);
 
     // Iterate over the RegisterContextLLDB's in our m_frames vector, look for the first one that
@@ -89,14 +89,14 @@
         lldb::addr_t start_pc;  // The start address of the function/symbol for this frame - current pc if unknown
         lldb::addr_t cfa;       // The canonical frame address for this stack frame
         lldb_private::SymbolContext sctx;  // A symbol context we'll contribute to & provide to the StackFrame creation
-        RegisterContextLLDBSharedPtr reg_ctx; // These are all RegisterContextLLDB's
+        RegisterContextLLDBSP reg_ctx_lldb_sp; // These are all RegisterContextLLDB's
 
-        Cursor () : start_pc (LLDB_INVALID_ADDRESS), cfa (LLDB_INVALID_ADDRESS), sctx(), reg_ctx() { }
+        Cursor () : start_pc (LLDB_INVALID_ADDRESS), cfa (LLDB_INVALID_ADDRESS), sctx(), reg_ctx_lldb_sp() { }
     private:
         DISALLOW_COPY_AND_ASSIGN (Cursor);
     };
 
-    typedef lldb::SharedPtr<Cursor>::Type CursorSP;
+    typedef SHARED_PTR(Cursor) CursorSP;
     std::vector<CursorSP> m_frames;
 
     bool AddOneMoreFrame (ABI *abi);
diff --git a/source/Plugins/Process/gdb-remote/ProcessGDBRemoteLog.cpp b/source/Plugins/Process/gdb-remote/ProcessGDBRemoteLog.cpp
index a605221..7fd5802 100644
--- a/source/Plugins/Process/gdb-remote/ProcessGDBRemoteLog.cpp
+++ b/source/Plugins/Process/gdb-remote/ProcessGDBRemoteLog.cpp
@@ -104,7 +104,7 @@
     // Now make a new log with this stream if one was provided
     if (log_stream_sp)
     {
-        log = make_shared<Log>(log_stream_sp);
+        log.reset (new Log(log_stream_sp));
         GetLog () = log;
     }
 
diff --git a/source/Plugins/SymbolFile/DWARF/DWARFDebugInfo.h b/source/Plugins/SymbolFile/DWARF/DWARFDebugInfo.h
index e71d319..f4ee96b 100644
--- a/source/Plugins/SymbolFile/DWARF/DWARFDebugInfo.h
+++ b/source/Plugins/SymbolFile/DWARF/DWARFDebugInfo.h
@@ -21,7 +21,7 @@
 typedef CStringToDIEMap::iterator CStringToDIEMapIter;
 typedef CStringToDIEMap::const_iterator CStringToDIEMapConstIter;
 
-typedef lldb::SharedPtr<DWARFCompileUnit>::Type DWARFCompileUnitSP;
+typedef SHARED_PTR(DWARFCompileUnit) DWARFCompileUnitSP;
 
 class DWARFDebugInfo
 {
diff --git a/source/Plugins/SymbolFile/DWARF/DWARFDebugLine.h b/source/Plugins/SymbolFile/DWARF/DWARFDebugLine.h
index 51e0062..843d081 100644
--- a/source/Plugins/SymbolFile/DWARF/DWARFDebugLine.h
+++ b/source/Plugins/SymbolFile/DWARF/DWARFDebugLine.h
@@ -68,7 +68,7 @@
         {
         }
 
-        typedef lldb::SharedPtr<Prologue>::Type shared_ptr;
+        typedef SHARED_PTR(Prologue) shared_ptr;
 
         uint32_t    total_length;   // The size in bytes of the statement information for this compilation unit (not including the total_length field itself).
         uint16_t    version;        // Version identifier for the statement information format.
@@ -135,7 +135,7 @@
     //------------------------------------------------------------------
     struct LineTable
     {
-        typedef lldb::SharedPtr<LineTable>::Type shared_ptr;
+        typedef SHARED_PTR(LineTable) shared_ptr;
 
         LineTable() :
             prologue(),
diff --git a/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp b/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp
index 816cd64..5e96350 100644
--- a/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp
+++ b/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp
@@ -2031,7 +2031,7 @@
         
     if (sc.function)
     {        
-        sc.module_sp = sc.function->CalculateSymbolContextModule();
+        sc.module_sp = sc.function->CalculateSymbolContextModule()->shared_from_this();
         return true;
     }
     
@@ -2449,7 +2449,7 @@
     if (num_matches)
     {
         SymbolContext sc;
-        sc.module_sp = m_obj_file->GetModule();
+        sc.module_sp = m_obj_file->GetModule()->shared_from_this();
         assert (sc.module_sp);
         
         DWARFDebugInfo* debug_info = DebugInfo();
@@ -2535,7 +2535,7 @@
     }
 
     SymbolContext sc;
-    sc.module_sp = m_obj_file->GetModule();
+    sc.module_sp = m_obj_file->GetModule()->shared_from_this();
     assert (sc.module_sp);
     
     DWARFCompileUnit* dwarf_cu = NULL;
@@ -3149,7 +3149,7 @@
                 if (matching_type)
                 {
                     // We found a type pointer, now find the shared pointer form our type list
-                    types.InsertUnique (TypeSP (matching_type));
+                    types.InsertUnique (matching_type->shared_from_this());
                     if (types.GetSize() >= max_matches)
                         break;
                 }
@@ -3267,7 +3267,7 @@
         if (matching_type)
         {
             // We found a type pointer, now find the shared pointer form our type list
-            types.InsertUnique (TypeSP (matching_type));
+            types.InsertUnique (matching_type->shared_from_this());
             ++num_matches;
             if (num_matches >= max_matches)
                 break;
@@ -3282,7 +3282,6 @@
 size_t
 SymbolFileDWARF::ParseChildParameters (const SymbolContext& sc,
                                        clang::DeclContext *containing_decl_ctx,
-                                       TypeSP& type_sp,
                                        DWARFCompileUnit* dwarf_cu,
                                        const DWARFDebugInfoEntry *parent_die,
                                        bool skip_artificial,
@@ -3676,7 +3675,7 @@
         else if (type_ptr != DIE_IS_BEING_PARSED)
         {
             // Grab the existing type from the master types lists
-            type_sp = type_ptr;
+            type_sp = type_ptr->shared_from_this();
         }
 
     }
@@ -4026,7 +4025,7 @@
                             
                             if (die)
                                 m_die_to_type[die] = resolved_type;
-                            type_sp = resolved_type;
+                            type_sp = resolved_type->shared_from_this();
                             break;
                         }
                     }
@@ -4148,7 +4147,7 @@
                                       MakeUserID(type_cu->GetOffset()));
                         
                         m_die_to_type[die] = resolved_type;
-                        type_sp = resolved_type;
+                        type_sp = resolved_type->shared_from_this();
                         break;
                     }
                 }
@@ -4934,7 +4933,6 @@
                         bool skip_artificial = true;
                         ParseChildParameters (sc, 
                                               containing_decl_ctx,
-                                              type_sp, 
                                               dwarf_cu, 
                                               die, 
                                               skip_artificial,
@@ -5120,7 +5118,7 @@
                                                 type_ptr = m_die_to_type[die];
                                                 if (type_ptr)
                                                 {
-                                                    type_sp = type_ptr;
+                                                    type_sp = type_ptr->shared_from_this();
                                                     break;
                                                 }
                                             }
@@ -5343,7 +5341,7 @@
         }
         else if (type_ptr != DIE_IS_BEING_PARSED)
         {
-            type_sp = type_ptr;
+            type_sp = type_ptr->shared_from_this();
         }
     }
     return type_sp;
diff --git a/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h b/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h
index 7f4b16e..72ac346 100644
--- a/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h
+++ b/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h
@@ -347,7 +347,6 @@
     size_t                  ParseChildParameters(
                                 const lldb_private::SymbolContext& sc,
                                 clang::DeclContext *containing_decl_ctx,
-                                lldb::TypeSP& type_sp,
                                 DWARFCompileUnit* dwarf_cu,
                                 const DWARFDebugInfoEntry *parent_die,
                                 bool skip_artificial,
diff --git a/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp b/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp
index 5c4fba2..2fa5a93 100644
--- a/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp
+++ b/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp
@@ -172,10 +172,10 @@
             // use the debug map, to add new sections to each .o file and
             // even though a .o file might not have changed, the sections
             // that get added to the .o file can change.
-            comp_unit_info->oso_module_sp = new Module (oso_file_spec, 
-                                                        m_obj_file->GetModule()->GetArchitecture(),
-                                                        NULL, 
-                                                        0);
+            comp_unit_info->oso_module_sp.reset (new Module (oso_file_spec, 
+                                                             m_obj_file->GetModule()->GetArchitecture(),
+                                                             NULL, 
+                                                             0));
         }
     }
     return comp_unit_info->oso_module_sp.get();
diff --git a/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.h b/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.h
index 6d80d77..8dca2c5 100644
--- a/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.h
+++ b/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.h
@@ -141,7 +141,7 @@
         lldb_private::SymbolVendor *oso_symbol_vendor;
         std::vector<uint32_t> function_indexes;
         std::vector<uint32_t> static_indexes;
-        lldb::SharedPtr<lldb_private::SectionList>::Type debug_map_sections_sp;
+        SHARED_PTR(lldb_private::SectionList) debug_map_sections_sp;
 
         CompileUnitInfo() :
             so_file (),
diff --git a/source/Plugins/SymbolFile/Symtab/SymbolFileSymtab.cpp b/source/Plugins/SymbolFile/Symtab/SymbolFileSymtab.cpp
index d560bc3..6fc5968 100644
--- a/source/Plugins/SymbolFile/Symtab/SymbolFileSymtab.cpp
+++ b/source/Plugins/SymbolFile/Symtab/SymbolFileSymtab.cpp
@@ -411,7 +411,7 @@
         
         Declaration decl;
         
-        lldb::TypeSP type(new Type (iter->second,
+        lldb::TypeSP type(new Type (match->value,
                                     this,
                                     name,
                                     0,      // byte_size - don't change this from 0, we currently use that to identify these "synthetic" ObjC class types.
diff --git a/source/Plugins/SymbolVendor/MacOSX/SymbolVendorMacOSX.cpp b/source/Plugins/SymbolVendor/MacOSX/SymbolVendorMacOSX.cpp
index 1224367..fce609b 100644
--- a/source/Plugins/SymbolVendor/MacOSX/SymbolVendorMacOSX.cpp
+++ b/source/Plugins/SymbolVendor/MacOSX/SymbolVendorMacOSX.cpp
@@ -162,7 +162,7 @@
             // Just create our symbol vendor using the current objfile as this is either
             // an executable with no dSYM (that we could locate), an executable with
             // a dSYM that has a UUID that doesn't match.
-            symbol_vendor->AddSymbolFileRepresentation(obj_file->GetSP());
+            symbol_vendor->AddSymbolFileRepresentation(obj_file->shared_from_this());
         }
     }
     return symbol_vendor;
diff --git a/source/Symbol/ObjectFile.cpp b/source/Symbol/ObjectFile.cpp
index 075e48f..02f176a 100644
--- a/source/Symbol/ObjectFile.cpp
+++ b/source/Symbol/ObjectFile.cpp
@@ -276,14 +276,6 @@
     return eAddressClassUnknown;
 }
 
-ObjectFileSP
-ObjectFile::GetSP ()
-{
-    // This object contains an instrusive ref count base class so we can
-    // easily make a shared pointer to this object
-    return ObjectFileSP (this);
-}
-
 size_t
 ObjectFile::GetData (off_t offset, size_t length, DataExtractor &data) const
 {
diff --git a/source/Symbol/Symbol.cpp b/source/Symbol/Symbol.cpp
index 016ac97..0f1b7ce 100644
--- a/source/Symbol/Symbol.cpp
+++ b/source/Symbol/Symbol.cpp
@@ -267,7 +267,7 @@
         if (!m_type_data_resolved)
         {
             m_type_data_resolved = true;
-            Module *module = m_addr_range.GetBaseAddress().GetModule();
+            Module *module = m_addr_range.GetBaseAddress().GetModulePtr();
             SymbolContext sc;
             if (module && module->ResolveSymbolContextForAddress (m_addr_range.GetBaseAddress(),
                                                                   eSymbolContextLineEntry,
@@ -350,15 +350,9 @@
     sc->symbol = this;
     const AddressRange *range = GetAddressRangePtr();
     if (range)
-    {   
-        Module *module = range->GetBaseAddress().GetModule ();
-        if (module)
-        {
-            sc->module_sp = module;
-            return;
-        }
-    }
-    sc->module_sp.reset();
+        sc->module_sp = range->GetBaseAddress().GetModuleSP ();
+    else
+        sc->module_sp.reset();
 }
 
 Module *
@@ -366,7 +360,7 @@
 {
     const AddressRange *range = GetAddressRangePtr();
     if (range)
-        return range->GetBaseAddress().GetModule ();
+        return range->GetBaseAddress().GetModulePtr ();
     return NULL;
 }
 
@@ -384,7 +378,7 @@
     const AddressRange *range = GetAddressRangePtr();
     if (range)
     {   
-        Module *module = range->GetBaseAddress().GetModule ();
+        Module *module = range->GetBaseAddress().GetModulePtr ();
         if (module)
         {
             dumped_module = true;
diff --git a/source/Symbol/SymbolVendor.cpp b/source/Symbol/SymbolVendor.cpp
index 3a48756..631135d 100644
--- a/source/Symbol/SymbolVendor.cpp
+++ b/source/Symbol/SymbolVendor.cpp
@@ -58,7 +58,7 @@
     {
         ObjectFile *objfile = module->GetObjectFile();
         if (objfile)
-            instance_ap->AddSymbolFileRepresentation(objfile->GetSP());
+            instance_ap->AddSymbolFileRepresentation(objfile->shared_from_this());
     }
     return instance_ap.release();
 }
diff --git a/source/Symbol/Type.cpp b/source/Symbol/Type.cpp
index 985174b..66a13e2 100644
--- a/source/Symbol/Type.cpp
+++ b/source/Symbol/Type.cpp
@@ -34,7 +34,7 @@
 SymbolFileType::GetType ()
 {
     if (!m_type_sp)
-        m_type_sp = m_symbol_file.ResolveTypeUID (GetID());
+        m_type_sp = m_symbol_file.ResolveTypeUID (GetID())->shared_from_this();
     return m_type_sp.get();
 }
 
diff --git a/source/Symbol/Variable.cpp b/source/Symbol/Variable.cpp
index cb3f86e..a868e5f 100644
--- a/source/Symbol/Variable.cpp
+++ b/source/Symbol/Variable.cpp
@@ -243,7 +243,7 @@
     {
         SymbolContext sc;
         CalculateSymbolContext(&sc);
-        if (sc.module_sp.get() == address.GetModule())
+        if (sc.module_sp.get() == address.GetModulePtr())
         {
             // Is the variable is described by a single location?
             if (!m_location.IsLocationList())
@@ -480,7 +480,7 @@
     {
         SymbolContext sc;
         CalculateSymbolContext(&sc);
-        if (sc.module_sp.get() == address.GetModule())
+        if (sc.module_sp.get() == address.GetModulePtr())
         {
             ABI *abi = NULL;
             if (m_owner_scope)
diff --git a/source/Target/ExecutionContext.cpp b/source/Target/ExecutionContext.cpp
index 41cf04d..8360d1a 100644
--- a/source/Target/ExecutionContext.cpp
+++ b/source/Target/ExecutionContext.cpp
@@ -46,7 +46,7 @@
 }
 
 ExecutionContext::ExecutionContext (Target* t, bool fill_current_process_thread_frame) :
-    m_target_sp (t),
+    m_target_sp (t->shared_from_this()),
     m_process_sp (),
     m_thread_sp (),
     m_frame_sp ()
@@ -58,17 +58,19 @@
         {
             m_thread_sp = m_process_sp->GetThreadList().GetSelectedThread();
             if (m_thread_sp)
-                m_frame_sp = m_thread_sp->GetSelectedFrame().get();
+                m_frame_sp = m_thread_sp->GetSelectedFrame();
         }
     }
 }
 
 ExecutionContext::ExecutionContext(Process* process, Thread *thread, StackFrame *frame) :
-    m_target_sp (process ? &process->GetTarget() : NULL),
-    m_process_sp (process),
-    m_thread_sp (thread),
-    m_frame_sp (frame)
+    m_target_sp (),
+    m_process_sp (process->shared_from_this()),
+    m_thread_sp (thread->shared_from_this()),
+    m_frame_sp (frame->shared_from_this())
 {
+    if (process)
+        m_target_sp = process->GetTarget().shared_from_this();
 }
 
 ExecutionContext::ExecutionContext (ExecutionContextScope *exe_scope_ptr)
@@ -200,24 +202,36 @@
 void
 ExecutionContext::SetTargetPtr (Target* target)
 {
-    m_target_sp = target;
+    if (target)
+        m_target_sp = target->shared_from_this();
+    else
+        m_target_sp.reset();
 }
 
 void
 ExecutionContext::SetProcessPtr (Process *process)
 {
-    m_process_sp = process;
+    if (process)
+        m_process_sp = process->shared_from_this();
+    else
+        m_process_sp.reset();
 }
 
 void
 ExecutionContext::SetThreadPtr (Thread *thread)
 {
-    m_thread_sp = thread;
+    if (thread)
+        m_thread_sp = thread->shared_from_this();
+    else
+        m_thread_sp.reset();
 }
 
 void
 ExecutionContext::SetFramePtr (StackFrame *frame)
 {
-    m_frame_sp = frame;
+    if (frame)
+        m_frame_sp = frame->shared_from_this();
+    else
+        m_frame_sp.reset();
 }
 
diff --git a/source/Target/Process.cpp b/source/Target/Process.cpp
index 2eb519f..e991437 100644
--- a/source/Target/Process.cpp
+++ b/source/Target/Process.cpp
@@ -848,7 +848,7 @@
     m_abi_sp.reset();
     m_os_ap.reset();
     m_dyld_ap.reset();
-    m_thread_list.Clear();
+    m_thread_list.Destroy();
     std::vector<Notifications> empty_notifications;
     m_notifications.swap(empty_notifications);
     m_image_tokens.clear();
@@ -1543,7 +1543,7 @@
 }
 
 lldb::break_id_t
-Process::CreateBreakpointSite (BreakpointLocationSP &owner, bool use_hardware)
+Process::CreateBreakpointSite (const BreakpointLocationSP &owner, bool use_hardware)
 {
     const addr_t load_addr = owner->GetAddress().GetOpcodeLoadAddress (&m_target);
     if (load_addr != LLDB_INVALID_ADDRESS)
@@ -3410,12 +3410,6 @@
     exe_ctx.SetFramePtr (NULL);
 }
 
-lldb::ProcessSP
-Process::GetSP ()
-{
-    return GetTarget().GetProcessSP();
-}
-
 //uint32_t
 //Process::ListProcessesMatchingName (const char *name, StringList &matches, std::vector<lldb::pid_t> &pids)
 //{
@@ -3680,13 +3674,10 @@
 Process::UpdateInstanceName ()
 {
     Module *module = GetTarget().GetExecutableModulePointer();
-    if (module)
+    if (module && module->GetFileSpec().GetFilename())
     {
-        StreamString sstr;
-        sstr.Printf ("%s", module->GetFileSpec().GetFilename().AsCString());
-                    
         GetSettingsController()->RenameInstanceSettings (GetInstanceName().AsCString(),
-                                                         sstr.GetData());
+                                                         module->GetFileSpec().GetFilename().AsCString());
     }
 }
 
diff --git a/source/Target/StackFrame.cpp b/source/Target/StackFrame.cpp
index 666bc1d..2ce69f8 100644
--- a/source/Target/StackFrame.cpp
+++ b/source/Target/StackFrame.cpp
@@ -95,7 +95,7 @@
     
     if (reg_context_sp && !m_sc.target_sp)
     {
-        m_sc.target_sp = reg_context_sp->GetThread().GetProcess().GetTarget().GetSP();
+        m_sc.target_sp = reg_context_sp->GetThread().GetProcess().GetTarget().shared_from_this();
         m_flags.Set (eSymbolContextTarget);
     }
 }
@@ -129,16 +129,16 @@
     
     if (m_sc.target_sp.get() == NULL && reg_context_sp)
     {
-        m_sc.target_sp = reg_context_sp->GetThread().GetProcess().GetTarget().GetSP();
+        m_sc.target_sp = reg_context_sp->GetThread().GetProcess().GetTarget().shared_from_this();
         m_flags.Set (eSymbolContextTarget);
     }
     
-    Module *pc_module = pc_addr.GetModule();
+    Module *pc_module = pc_addr.GetModulePtr();
     if (m_sc.module_sp.get() == NULL || m_sc.module_sp.get() != pc_module)
     {
         if (pc_module)
         {
-            m_sc.module_sp = pc_module;
+            m_sc.module_sp = pc_module->shared_from_this();
             m_flags.Set (eSymbolContextModule);
         }
         else
@@ -218,7 +218,7 @@
                 Module *module = section->GetModule();
                 if (module)
                 {
-                    m_sc.module_sp = module;
+                    m_sc.module_sp = module->shared_from_this();
                     if (m_sc.module_sp)
                         m_flags.Set(eSymbolContextModule);
                 }
@@ -417,7 +417,7 @@
         // If the target was requested add that:
         if (m_sc.target_sp.get() == NULL)
         {
-            m_sc.target_sp = CalculateProcess()->GetTarget().GetSP();
+            m_sc.target_sp = CalculateProcess()->GetTarget().shared_from_this();
             if (m_sc.target_sp)
                 resolved |= eSymbolContextTarget;
         }
@@ -1245,16 +1245,6 @@
     return false;
 }
 
-StackFrameSP
-StackFrame::GetSP ()
-{
-    // This object contains an instrusive ref count base class so we can
-    // easily make a shared pointer to this object
-    return StackFrameSP (this);
-}
-
-
-
 bool
 StackFrame::GetStatus (Stream& strm,
                        bool show_frame_info,
diff --git a/source/Target/Target.cpp b/source/Target/Target.cpp
index 46ce1d3..f4159de 100644
--- a/source/Target/Target.cpp
+++ b/source/Target/Target.cpp
@@ -149,14 +149,6 @@
     return m_process_sp;
 }
 
-lldb::TargetSP
-Target::GetSP()
-{
-    // This object contains an instrusive ref count base class so we can
-    // easily make a shared pointer to this object
-    return TargetSP(this);
-}
-
 void
 Target::Destroy()
 {
@@ -256,8 +248,7 @@
 BreakpointSP
 Target::CreateBreakpoint (Address &addr, bool internal)
 {
-    TargetSP target_sp = this->GetSP();
-    SearchFilterSP filter_sp(new SearchFilterForNonModuleSpecificSearches (target_sp));
+    SearchFilterSP filter_sp(new SearchFilterForNonModuleSpecificSearches (shared_from_this()));
     BreakpointResolverSP resolver_sp (new BreakpointResolverAddress (NULL, addr));
     return CreateBreakpoint (filter_sp, resolver_sp, internal);
 }
@@ -290,17 +281,16 @@
 Target::GetSearchFilterForModule (const FileSpec *containingModule)
 {
     SearchFilterSP filter_sp;
-    lldb::TargetSP target_sp = this->GetSP();
     if (containingModule != NULL)
     {
         // TODO: We should look into sharing module based search filters
         // across many breakpoints like we do for the simple target based one
-        filter_sp.reset (new SearchFilterByModule (target_sp, *containingModule));
+        filter_sp.reset (new SearchFilterByModule (shared_from_this(), *containingModule));
     }
     else
     {
         if (m_search_filter_sp.get() == NULL)
-            m_search_filter_sp.reset (new SearchFilterForNonModuleSpecificSearches (target_sp));
+            m_search_filter_sp.reset (new SearchFilterForNonModuleSpecificSearches (shared_from_this()));
         filter_sp = m_search_filter_sp;
     }
     return filter_sp;
@@ -310,17 +300,16 @@
 Target::GetSearchFilterForModuleList (const FileSpecList *containingModules)
 {
     SearchFilterSP filter_sp;
-    lldb::TargetSP target_sp = this->GetSP();
     if (containingModules && containingModules->GetSize() != 0)
     {
         // TODO: We should look into sharing module based search filters
         // across many breakpoints like we do for the simple target based one
-        filter_sp.reset (new SearchFilterByModuleList (target_sp, *containingModules));
+        filter_sp.reset (new SearchFilterByModuleList (shared_from_this(), *containingModules));
     }
     else
     {
         if (m_search_filter_sp.get() == NULL)
-            m_search_filter_sp.reset (new SearchFilterForNonModuleSpecificSearches (target_sp));
+            m_search_filter_sp.reset (new SearchFilterForNonModuleSpecificSearches (shared_from_this()));
         filter_sp = m_search_filter_sp;
     }
     return filter_sp;
@@ -333,17 +322,16 @@
         return GetSearchFilterForModuleList(containingModules);
         
     SearchFilterSP filter_sp;
-    lldb::TargetSP target_sp = this->GetSP();
     if (containingModules == NULL)
     {
         // We could make a special "CU List only SearchFilter".  Better yet was if these could be composable, 
         // but that will take a little reworking.
         
-        filter_sp.reset (new SearchFilterByModuleListAndCU (target_sp, FileSpecList(), *containingSourceFiles));
+        filter_sp.reset (new SearchFilterByModuleListAndCU (shared_from_this(), FileSpecList(), *containingSourceFiles));
     }
     else
     {
-        filter_sp.reset (new SearchFilterByModuleListAndCU (target_sp, *containingModules, *containingSourceFiles));
+        filter_sp.reset (new SearchFilterByModuleListAndCU (shared_from_this(), *containingModules, *containingSourceFiles));
     }
     return filter_sp;
 }
@@ -1073,11 +1061,12 @@
 
         if (load_addr == LLDB_INVALID_ADDRESS)
         {
-            if (resolved_addr.GetModule() && resolved_addr.GetModule()->GetFileSpec())
+            Module *addr_module = resolved_addr.GetModulePtr();
+            if (addr_module && addr_module->GetFileSpec())
                 error.SetErrorStringWithFormat("%s[0x%llx] can't be resolved, %s in not currently loaded", 
-                                               resolved_addr.GetModule()->GetFileSpec().GetFilename().AsCString(), 
+                                               addr_module->GetFileSpec().GetFilename().AsCString(), 
                                                resolved_addr.GetFileAddress(),
-                                               resolved_addr.GetModule()->GetFileSpec().GetFilename().AsCString());
+                                               addr_module->GetFileSpec().GetFilename().AsCString());
             else
                 error.SetErrorStringWithFormat("0x%llx can't be resolved", resolved_addr.GetFileAddress());
         }
@@ -1339,7 +1328,7 @@
     if (m_scratch_ast_context_ap.get() == NULL && m_arch.IsValid() && create_on_demand)
     {
         m_scratch_ast_context_ap.reset (new ClangASTContext(m_arch.GetTriple().str().c_str()));
-        m_scratch_ast_source_ap.reset (new ClangASTSource(GetSP()));
+        m_scratch_ast_source_ap.reset (new ClangASTSource(shared_from_this()));
         m_scratch_ast_source_ap->InstallASTContext(m_scratch_ast_context_ap->getASTContext());
         llvm::OwningPtr<clang::ExternalASTSource> proxy_ast_source(m_scratch_ast_source_ap->CreateProxy());
         m_scratch_ast_context_ap->SetExternalSource(proxy_ast_source);
@@ -1678,7 +1667,7 @@
 Target::AddStopHook (Target::StopHookSP &new_hook_sp)
 {
     lldb::user_id_t new_uid = ++m_stop_hook_next_id;
-    new_hook_sp.reset (new StopHook(GetSP(), new_uid));
+    new_hook_sp.reset (new StopHook(shared_from_this(), new_uid));
     m_stop_hooks[new_uid] = new_hook_sp;
     return new_uid;
 }
diff --git a/source/Target/Thread.cpp b/source/Target/Thread.cpp
index ae083c7..5d7c905 100644
--- a/source/Target/Thread.cpp
+++ b/source/Target/Thread.cpp
@@ -1030,15 +1030,6 @@
                             &end);
 }
 
-lldb::ThreadSP
-Thread::GetSP ()
-{
-    // This object contains an instrusive ref count base class so we can
-    // easily make a shared pointer to this object
-    return ThreadSP(this);
-}
-
-
 void
 Thread::SettingsInitialize ()
 {
diff --git a/source/Target/ThreadList.cpp b/source/Target/ThreadList.cpp
index f4d75f5..62eb1de 100644
--- a/source/Target/ThreadList.cpp
+++ b/source/Target/ThreadList.cpp
@@ -355,6 +355,17 @@
 }
 
 void
+ThreadList::Destroy()
+{
+    Mutex::Locker locker(m_threads_mutex);
+    const uint32_t num_threads = m_threads.size();
+    for (uint32_t idx = 0; idx < num_threads; ++idx)
+    {
+        m_threads[idx]->DestroyThread();
+    }
+}
+
+void
 ThreadList::RefreshStateAfterStop ()
 {
     Mutex::Locker locker(m_threads_mutex);
@@ -603,6 +614,32 @@
         m_stop_id = rhs.m_stop_id;
         m_threads.swap(rhs.m_threads);
         m_selected_tid = rhs.m_selected_tid;
+        
+        
+        // Now we look for threads that we are done with and
+        // make sure to clear them up as much as possible so 
+        // anyone with a shared pointer will still have a reference,
+        // but the thread won't be of much use. Using std::weak_ptr
+        // for all backward references (such as a thread to a process)
+        // will eventually solve this issue for us, but for now, we
+        // need to work around the issue
+        collection::iterator rhs_pos, rhs_end = rhs.m_threads.end();
+        for (rhs_pos = rhs.m_threads.begin(); rhs_pos != rhs_end; ++rhs_pos)
+        {
+            const lldb::tid_t tid = (*rhs_pos)->GetID();
+            bool thread_is_alive = false;
+            const uint32_t num_threads = m_threads.size();
+            for (uint32_t idx = 0; idx < num_threads; ++idx)
+            {
+                if (m_threads[idx]->GetID() == tid)
+                {
+                    thread_is_alive = true;
+                    break;
+                }
+            }
+            if (!thread_is_alive)
+                (*rhs_pos)->DestroyThread();
+        }        
     }
 }
 
diff --git a/source/Target/ThreadPlanTestCondition.cpp b/source/Target/ThreadPlanTestCondition.cpp
index 42aa01c..b9f8a27 100644
--- a/source/Target/ThreadPlanTestCondition.cpp
+++ b/source/Target/ThreadPlanTestCondition.cpp
@@ -119,7 +119,7 @@
     else
     {
         // Now we have to change the event to a breakpoint event and mark it up appropriately:
-        Process::ProcessEventData *new_data = new Process::ProcessEventData (m_thread.GetProcess().GetSP(), eStateStopped);
+        Process::ProcessEventData *new_data = new Process::ProcessEventData (m_thread.GetProcess().shared_from_this(), eStateStopped);
         event_ptr->SetData(new_data);
         event_ptr->SetType(Process::eBroadcastBitStateChanged);
         SetStopInfo(StopInfo::CreateStopReasonWithBreakpointSiteID (m_thread, 
diff --git a/source/lldb-log.cpp b/source/lldb-log.cpp
index 6dc32f0..b02dd25 100644
--- a/source/lldb-log.cpp
+++ b/source/lldb-log.cpp
@@ -169,7 +169,7 @@
     // Now make a new log with this stream if one was provided
     if (log_stream_sp)
     {
-        log = make_shared<Log>(log_stream_sp);
+        log.reset (new Log(log_stream_sp));
         GetLog () = log;
     }
 
