diff --git a/include/lldb/Breakpoint/Breakpoint.h b/include/lldb/Breakpoint/Breakpoint.h
index 30e9fc3..2c2174f 100644
--- a/include/lldb/Breakpoint/Breakpoint.h
+++ b/include/lldb/Breakpoint/Breakpoint.h
@@ -74,7 +74,7 @@
 /// not by the breakpoint.
 //----------------------------------------------------------------------
 class Breakpoint:
-    public ReferenceCountedBase<Breakpoint>,
+    public std::tr1::enable_shared_from_this<Breakpoint>,
     public Stoppoint
 {
 public:
@@ -286,10 +286,6 @@
     lldb::BreakpointLocationSP
     GetLocationAtIndex (uint32_t index);
 
-
-    const lldb::BreakpointSP
-    GetSP ();
-
     //------------------------------------------------------------------
     // The next section deals with various breakpoint options.
     //------------------------------------------------------------------
diff --git a/include/lldb/Breakpoint/BreakpointLocation.h b/include/lldb/Breakpoint/BreakpointLocation.h
index 6569e18..71126ef 100644
--- a/include/lldb/Breakpoint/BreakpointLocation.h
+++ b/include/lldb/Breakpoint/BreakpointLocation.h
@@ -47,7 +47,7 @@
 //----------------------------------------------------------------------
 
 class BreakpointLocation : 
-    public ReferenceCountedBase<BreakpointLocation>,
+    public std::tr1::enable_shared_from_this<BreakpointLocation>,
     public StoppointLocation
 {
 public:
diff --git a/include/lldb/Breakpoint/BreakpointSite.h b/include/lldb/Breakpoint/BreakpointSite.h
index 7183115..774aff8 100644
--- a/include/lldb/Breakpoint/BreakpointSite.h
+++ b/include/lldb/Breakpoint/BreakpointSite.h
@@ -39,7 +39,7 @@
 //----------------------------------------------------------------------
 
 class BreakpointSite : 
-    public ReferenceCountedBase<BreakpointSite>,
+    public std::tr1::enable_shared_from_this<BreakpointSite>,
     public StoppointLocation
 {
 public:
@@ -159,7 +159,7 @@
     ///    \a owner is the Breakpoint Location to add.
     //------------------------------------------------------------------
     void
-    AddOwner (lldb::BreakpointLocationSP &owner);
+    AddOwner (const lldb::BreakpointLocationSP &owner);
 
     //------------------------------------------------------------------
     /// This method returns the number of breakpoint locations currently
@@ -263,7 +263,7 @@
     // Only the Process can create breakpoint sites in
     // Process::CreateBreakpointSite (lldb::BreakpointLocationSP &, bool).
     BreakpointSite (BreakpointSiteList *list,
-                    lldb::BreakpointLocationSP& owner,
+                    const lldb::BreakpointLocationSP& owner,
                     lldb::addr_t m_addr,
                     lldb::tid_t tid,
                     bool use_hardware);
diff --git a/include/lldb/Core/Address.h b/include/lldb/Core/Address.h
index 1b82346..5b1980a 100644
--- a/include/lldb/Core/Address.h
+++ b/include/lldb/Core/Address.h
@@ -435,7 +435,10 @@
     ///     isn't resolved yet.
     //------------------------------------------------------------------
     Module *
-    GetModule () const;
+    GetModulePtr () const;
+
+    lldb::ModuleSP
+    GetModuleSP () const;
 
     //------------------------------------------------------------------
     /// Get const accessor for the section.
diff --git a/include/lldb/Core/Debugger.h b/include/lldb/Core/Debugger.h
index d5e308c..f17e5f0 100644
--- a/include/lldb/Core/Debugger.h
+++ b/include/lldb/Core/Debugger.h
@@ -251,7 +251,7 @@
 
 
 class Debugger :
-    public ReferenceCountedBaseVirtual<Debugger>,
+    public std::tr1::enable_shared_from_this<Debugger>,
     public UserID,
     public DebuggerInstanceSettings
 {
@@ -315,9 +315,6 @@
     
     void Clear();
 
-    lldb::DebuggerSP
-    GetSP ();
-
     bool
     GetAsyncExecution ();
 
diff --git a/include/lldb/Core/FormatClasses.h b/include/lldb/Core/FormatClasses.h
index 2ed2106..985f108 100644
--- a/include/lldb/Core/FormatClasses.h
+++ b/include/lldb/Core/FormatClasses.h
@@ -57,7 +57,7 @@
                  bool skipptr = false,
                  bool skipref = false);
     
-    typedef lldb::SharedPtr<ValueFormat>::Type SharedPointer;
+    typedef SHARED_PTR(ValueFormat) SharedPointer;
     typedef bool(*ValueCallback)(void*, ConstString, const lldb::ValueFormatSP&);
     
     ~ValueFormat()
@@ -115,7 +115,7 @@
     virtual void
     Update() = 0;
     
-    typedef lldb::SharedPtr<SyntheticChildrenFrontEnd>::Type SharedPointer;
+    typedef SHARED_PTR(SyntheticChildrenFrontEnd) SharedPointer;
 
 };
     
@@ -166,7 +166,7 @@
     virtual SyntheticChildrenFrontEnd::SharedPointer
     GetFrontEnd(lldb::ValueObjectSP backend) = 0;
     
-    typedef lldb::SharedPtr<SyntheticChildren>::Type SharedPointer;
+    typedef SHARED_PTR(SyntheticChildren) SharedPointer;
     typedef bool(*SyntheticChildrenCallback)(void*, ConstString, const SyntheticChildren::SharedPointer&);
     
 };
@@ -266,7 +266,7 @@
             return UINT32_MAX;
         }
         
-        typedef lldb::SharedPtr<SyntheticChildrenFrontEnd>::Type SharedPointer;
+        typedef SHARED_PTR(SyntheticChildrenFrontEnd) SharedPointer;
         
     };
     
@@ -351,7 +351,7 @@
             return m_interpreter->GetIndexOfChildWithName(m_wrapper, name.GetCString());
         }
         
-        typedef lldb::SharedPtr<SyntheticChildrenFrontEnd>::Type SharedPointer;
+        typedef SHARED_PTR(SyntheticChildrenFrontEnd) SharedPointer;
         
     };
     
@@ -550,7 +550,7 @@
         virtual uint32_t
         GetIndexOfChildWithName (const ConstString &name_cs);
         
-        typedef lldb::SharedPtr<SyntheticChildrenFrontEnd>::Type SharedPointer;
+        typedef SHARED_PTR(SyntheticChildrenFrontEnd) SharedPointer;
         
     };
     
@@ -628,7 +628,7 @@
     virtual std::string
     GetDescription() = 0;
     
-    typedef lldb::SharedPtr<SummaryFormat>::Type SharedPointer;
+    typedef SHARED_PTR(SummaryFormat) SharedPointer;
     typedef bool(*SummaryCallback)(void*, ConstString, const lldb::SummaryFormatSP&);
     typedef bool(*RegexSummaryCallback)(void*, lldb::RegularExpressionSP, const lldb::SummaryFormatSP&);
     
@@ -706,7 +706,7 @@
     virtual std::string
     GetDescription();
     
-    typedef lldb::SharedPtr<ScriptSummaryFormat>::Type SharedPointer;
+    typedef SHARED_PTR(ScriptSummaryFormat) SharedPointer;
 
 };
 
diff --git a/include/lldb/Core/FormatManager.h b/include/lldb/Core/FormatManager.h
index 8f56287..4b1098b 100644
--- a/include/lldb/Core/FormatManager.h
+++ b/include/lldb/Core/FormatManager.h
@@ -154,7 +154,7 @@
                 const char** matching_category = NULL,
                 FormatCategoryItems* matching_type = NULL);
     
-    typedef lldb::SharedPtr<FormatCategory>::Type SharedPointer;
+    typedef SHARED_PTR(FormatCategory) SharedPointer;
     
 private:
     SummaryNavigator::SharedPointer m_summary_nav;
diff --git a/include/lldb/Core/FormatNavigator.h b/include/lldb/Core/FormatNavigator.h
index 437ceca..8b0dfa4 100644
--- a/include/lldb/Core/FormatNavigator.h
+++ b/include/lldb/Core/FormatNavigator.h
@@ -232,7 +232,7 @@
     typedef typename MapType::mapped_type MapValueType;
     typedef typename BackEndType::CallbackType CallbackType;
         
-    typedef typename lldb::SharedPtr<FormatNavigator<KeyType, ValueType> >::Type SharedPointer;
+    typedef typename std::tr1::shared_ptr<FormatNavigator<KeyType, ValueType> > SharedPointer;
     
     friend class FormatCategory;
 
diff --git a/include/lldb/Core/Module.h b/include/lldb/Core/Module.h
index bf8ed40..2e187ee 100644
--- a/include/lldb/Core/Module.h
+++ b/include/lldb/Core/Module.h
@@ -44,7 +44,7 @@
 namespace lldb_private {
 
 class Module :
-    public ReferenceCountedBaseVirtual<Module>,
+    public std::tr1::enable_shared_from_this<Module>,
     public SymbolContextScope
 {
 public:
diff --git a/include/lldb/Core/SearchFilter.h b/include/lldb/Core/SearchFilter.h
index 0101ec2..e875c4f 100644
--- a/include/lldb/Core/SearchFilter.h
+++ b/include/lldb/Core/SearchFilter.h
@@ -281,7 +281,7 @@
     public SearchFilter
 {
 public:
-    SearchFilterForNonModuleSpecificSearches (lldb::TargetSP &targetSP) : SearchFilter(targetSP) {};
+    SearchFilterForNonModuleSpecificSearches (const lldb::TargetSP &targetSP) : SearchFilter(targetSP) {};
     ~SearchFilterForNonModuleSpecificSearches () {}
     
     virtual bool 
@@ -311,7 +311,7 @@
     /// @param[in] module
     ///    The Module that limits the search.
     //------------------------------------------------------------------
-    SearchFilterByModule (lldb::TargetSP &targetSP,
+    SearchFilterByModule (const lldb::TargetSP &targetSP,
                           const FileSpec &module);
 
     SearchFilterByModule (const SearchFilterByModule& rhs);
@@ -372,8 +372,8 @@
     /// @param[in] module
     ///    The Module that limits the search.
     //------------------------------------------------------------------
-    SearchFilterByModuleList (lldb::TargetSP &targetSP,
-                          const FileSpecList &module_list);
+    SearchFilterByModuleList (const lldb::TargetSP &targetSP,
+                              const FileSpecList &module_list);
 
     SearchFilterByModuleList (const SearchFilterByModuleList& rhs);
 
@@ -433,9 +433,9 @@
     /// @param[in] module
     ///    The Module that limits the search.
     //------------------------------------------------------------------
-    SearchFilterByModuleListAndCU (lldb::TargetSP &targetSP,
-                          const FileSpecList &module_list,
-                          const FileSpecList &cu_list);
+    SearchFilterByModuleListAndCU (const lldb::TargetSP &targetSP,
+                                   const FileSpecList &module_list,
+                                   const FileSpecList &cu_list);
 
     SearchFilterByModuleListAndCU (const SearchFilterByModuleListAndCU& rhs);
 
diff --git a/include/lldb/Core/SourceManager.h b/include/lldb/Core/SourceManager.h
index 9fc9a3f..fbbb7f1 100644
--- a/include/lldb/Core/SourceManager.h
+++ b/include/lldb/Core/SourceManager.h
@@ -79,7 +79,7 @@
 
 #endif // SWIG
 
-    typedef lldb::SharedPtr<File>::Type FileSP;
+    typedef std::tr1::shared_ptr<File> FileSP;
 
 #ifndef SWIG
 
diff --git a/include/lldb/Expression/ClangExpressionVariable.h b/include/lldb/Expression/ClangExpressionVariable.h
index 0089726..cdc2b7a 100644
--- a/include/lldb/Expression/ClangExpressionVariable.h
+++ b/include/lldb/Expression/ClangExpressionVariable.h
@@ -216,7 +216,7 @@
     void
     TransferAddress (bool force = false);
 
-    typedef lldb::SharedPtr<ValueObjectConstResult>::Type ValueObjectConstResultSP;
+    typedef SHARED_PTR(ValueObjectConstResult) ValueObjectConstResultSP;
 
     //----------------------------------------------------------------------
     /// Members
diff --git a/include/lldb/Expression/ClangUserExpression.h b/include/lldb/Expression/ClangUserExpression.h
index 9e00803..613434c 100644
--- a/include/lldb/Expression/ClangUserExpression.h
+++ b/include/lldb/Expression/ClangUserExpression.h
@@ -47,7 +47,7 @@
 class ClangUserExpression : public ClangExpression
 {
 public:
-    typedef lldb::SharedPtr<ClangUserExpression>::Type ClangUserExpressionSP;
+    typedef SHARED_PTR(ClangUserExpression) ClangUserExpressionSP;
     
     //------------------------------------------------------------------
     /// Constructor
diff --git a/include/lldb/Interpreter/Args.h b/include/lldb/Interpreter/Args.h
index a5b66ac..0781140 100644
--- a/include/lldb/Interpreter/Args.h
+++ b/include/lldb/Interpreter/Args.h
@@ -30,7 +30,7 @@
 typedef std::pair<int, std::string> OptionArgValue;
 typedef std::pair<std::string, OptionArgValue> OptionArgPair;
 typedef std::vector<OptionArgPair> OptionArgVector;
-typedef lldb::SharedPtr<OptionArgVector>::Type OptionArgVectorSP;
+typedef SHARED_PTR(OptionArgVector) OptionArgVectorSP;
 
 struct OptionArgElement
 {
diff --git a/include/lldb/Symbol/ClangASTImporter.h b/include/lldb/Symbol/ClangASTImporter.h
index 901081f..1e1dd53 100644
--- a/include/lldb/Symbol/ClangASTImporter.h
+++ b/include/lldb/Symbol/ClangASTImporter.h
@@ -86,7 +86,7 @@
     //
     
     typedef std::vector < std::pair<lldb::ModuleSP, ClangNamespaceDecl> > NamespaceMap;
-    typedef lldb::SharedPtr<NamespaceMap>::Type NamespaceMapSP;
+    typedef SHARED_PTR(NamespaceMap) NamespaceMapSP;
     
     void RegisterNamespaceMap (const clang::NamespaceDecl *decl, 
                                NamespaceMapSP &namespace_map);
@@ -193,9 +193,9 @@
         clang::ASTContext  *m_source_ctx;
     };
     
-    typedef lldb::SharedPtr<Minion>::Type                                   MinionSP;
-    typedef std::map<clang::ASTContext *, MinionSP>                         MinionMap;
-    typedef std::map<const clang::NamespaceDecl *, NamespaceMapSP>          NamespaceMetaMap;
+    typedef SHARED_PTR(Minion) MinionSP;
+    typedef std::map<clang::ASTContext *, MinionSP> MinionMap;
+    typedef std::map<const clang::NamespaceDecl *, NamespaceMapSP> NamespaceMetaMap;
     
     struct ASTContextMetadata
     {
@@ -216,11 +216,10 @@
         MapCompleter           *m_map_completer;
     };
     
-    typedef lldb::SharedPtr<ASTContextMetadata>::Type               ASTContextMetadataSP;
-    
+    typedef SHARED_PTR(ASTContextMetadata) ASTContextMetadataSP;    
     typedef std::map<const clang::ASTContext *, ASTContextMetadataSP> ContextMetadataMap;
     
-    ContextMetadataMap      m_metadata_map;
+    ContextMetadataMap m_metadata_map;
     
     ASTContextMetadataSP
     GetContextMetadata (clang::ASTContext *dst_ctx)
diff --git a/include/lldb/Symbol/DWARFCallFrameInfo.h b/include/lldb/Symbol/DWARFCallFrameInfo.h
index 0d667ae..bd646d1 100644
--- a/include/lldb/Symbol/DWARFCallFrameInfo.h
+++ b/include/lldb/Symbol/DWARFCallFrameInfo.h
@@ -78,7 +78,7 @@
                                   inst_length (0), ptr_encoding (0), initial_row() {}
     };
 
-    typedef lldb::SharedPtr<CIE>::Type CIESP;
+    typedef SHARED_PTR(CIE) CIESP;
 
     struct FDEEntry
     {
diff --git a/include/lldb/Symbol/ObjectFile.h b/include/lldb/Symbol/ObjectFile.h
index 1bbd814..6b356e5 100644
--- a/include/lldb/Symbol/ObjectFile.h
+++ b/include/lldb/Symbol/ObjectFile.h
@@ -50,7 +50,7 @@
 /// this abstract class.
 //----------------------------------------------------------------------
 class ObjectFile:
-    public ReferenceCountedBaseVirtual<ObjectFile>,
+    public std::tr1::enable_shared_from_this<ObjectFile>,
     public PluginInterface,
     public ModuleChild
 {
@@ -100,9 +100,6 @@
     virtual
     ~ObjectFile();
     
-    lldb::ObjectFileSP
-    GetSP ();
-
     //------------------------------------------------------------------
     /// Dump a description of this object to a Stream.
     ///
diff --git a/include/lldb/Symbol/Type.h b/include/lldb/Symbol/Type.h
index 21e11dc..35fcd23 100644
--- a/include/lldb/Symbol/Type.h
+++ b/include/lldb/Symbol/Type.h
@@ -21,7 +21,7 @@
 namespace lldb_private {
 
 class SymbolFileType :
-    public ReferenceCountedBaseVirtual<SymbolFileType>,
+    public std::tr1::enable_shared_from_this<SymbolFileType>,
     public UserID
     {
     public:
@@ -50,7 +50,7 @@
     };
     
 class Type :
-    public ReferenceCountedBaseVirtual<Type>,
+    public std::tr1::enable_shared_from_this<Type>,
     public UserID
 {
 public:
diff --git a/include/lldb/Target/Memory.h b/include/lldb/Target/Memory.h
index 941e4c0..3a45c91 100644
--- a/include/lldb/Target/Memory.h
+++ b/include/lldb/Target/Memory.h
@@ -163,7 +163,7 @@
         DeallocateMemory (lldb::addr_t ptr);
         
     protected:
-        typedef lldb::SharedPtr<AllocatedBlock>::Type AllocatedBlockSP;
+        typedef std::tr1::shared_ptr<AllocatedBlock> AllocatedBlockSP;
 
         AllocatedBlockSP
         AllocatePage (uint32_t byte_size, 
diff --git a/include/lldb/Target/Process.h b/include/lldb/Target/Process.h
index 730422a..20f5848 100644
--- a/include/lldb/Target/Process.h
+++ b/include/lldb/Target/Process.h
@@ -1263,7 +1263,7 @@
 /// @brief A plug-in interface definition class for debugging a process.
 //----------------------------------------------------------------------
 class Process :
-    public ReferenceCountedBaseVirtual<Process>,
+    public std::tr1::enable_shared_from_this<Process>,
     public UserID,
     public Broadcaster,
     public ExecutionContextScope,
@@ -2769,7 +2769,7 @@
     ClearBreakpointSiteByID (lldb::user_id_t break_id);
 
     lldb::break_id_t
-    CreateBreakpointSite (lldb::BreakpointLocationSP &owner,
+    CreateBreakpointSite (const lldb::BreakpointLocationSP &owner,
                           bool use_hardware);
 
     Error
@@ -2997,9 +2997,6 @@
     virtual void
     CalculateExecutionContext (ExecutionContext &exe_ctx);
     
-    lldb::ProcessSP
-    GetSP ();
-    
     void
     SetSTDIOFileDescriptor (int file_descriptor);
 
diff --git a/include/lldb/Target/RegisterContext.h b/include/lldb/Target/RegisterContext.h
index 06742d2..af6a20e 100644
--- a/include/lldb/Target/RegisterContext.h
+++ b/include/lldb/Target/RegisterContext.h
@@ -20,6 +20,7 @@
 namespace lldb_private {
 
 class RegisterContext :
+    public std::tr1::enable_shared_from_this<RegisterContext>,
     public ExecutionContextScope
 {
 public:
diff --git a/include/lldb/Target/StackFrame.h b/include/lldb/Target/StackFrame.h
index e90959b..0995a04 100644
--- a/include/lldb/Target/StackFrame.h
+++ b/include/lldb/Target/StackFrame.h
@@ -27,7 +27,7 @@
 namespace lldb_private {
 
 class StackFrame :
-    public ReferenceCountedBaseVirtual<StackFrame>,
+    public std::tr1::enable_shared_from_this<StackFrame>,
     public ExecutionContextScope
 {
 public:
@@ -166,9 +166,6 @@
     virtual void
     CalculateExecutionContext (ExecutionContext &exe_ctx);
     
-    lldb::StackFrameSP
-    GetSP ();
-
     bool
     GetStatus (Stream &strm,
                bool show_frame_info,
diff --git a/include/lldb/Target/Target.h b/include/lldb/Target/Target.h
index a202fb8..a6132d8 100644
--- a/include/lldb/Target/Target.h
+++ b/include/lldb/Target/Target.h
@@ -246,7 +246,7 @@
 // Target
 //----------------------------------------------------------------------
 class Target :
-    public ReferenceCountedBaseVirtual<Target>,
+    public std::tr1::enable_shared_from_this<Target>,
     public Broadcaster,
     public ExecutionContextScope,
     public TargetInstanceSettings
@@ -340,9 +340,6 @@
     const lldb::ProcessSP &
     GetProcessSP () const;
 
-    lldb::TargetSP
-    GetSP();
-    
     void
     Destroy();
 
@@ -912,7 +909,7 @@
         StopHook (lldb::TargetSP target_sp, lldb::user_id_t uid);
         friend class Target;
     };
-    typedef lldb::SharedPtr<StopHook>::Type StopHookSP;
+    typedef SHARED_PTR(StopHook) StopHookSP;
     
     // Add an empty stop hook to the Target's stop hook list, and returns a shared pointer to it in new_hook.  
     // Returns the id of the new hook.        
diff --git a/include/lldb/Target/Thread.h b/include/lldb/Target/Thread.h
index ab416ca..4374567 100644
--- a/include/lldb/Target/Thread.h
+++ b/include/lldb/Target/Thread.h
@@ -85,7 +85,7 @@
 };
 
 class Thread :
-    public ReferenceCountedBaseVirtual<Thread>,
+    public std::tr1::enable_shared_from_this<Thread>,
     public UserID,
     public ExecutionContextScope,
     public ThreadInstanceSettings
@@ -233,9 +233,6 @@
     lldb::StateType
     GetState() const;
 
-    lldb::ThreadSP
-    GetSP ();
-
     void
     SetState (lldb::StateType state);
 
@@ -769,6 +766,7 @@
 protected:
 
     friend class ThreadPlan;
+    friend class ThreadList;
     friend class StackFrameList;
     
     // This is necessary to make sure thread assets get destroyed while the thread is still in good shape
diff --git a/include/lldb/Target/ThreadList.h b/include/lldb/Target/ThreadList.h
index 66fbd26..3a998c4 100644
--- a/include/lldb/Target/ThreadList.h
+++ b/include/lldb/Target/ThreadList.h
@@ -59,6 +59,9 @@
     void
     Clear();
 
+    void
+    Destroy();
+
     // Note that "idx" is not the same as the "thread_index". It is a zero
     // based index to accessing the current threads, whereas "thread_index"
     // is a unique index assigned
diff --git a/include/lldb/Utility/PriorityPointerPair.h b/include/lldb/Utility/PriorityPointerPair.h
index 949173d..21e60bb 100644
--- a/include/lldb/Utility/PriorityPointerPair.h
+++ b/include/lldb/Utility/PriorityPointerPair.h
@@ -30,7 +30,7 @@
     typedef T& reference_type;
     typedef T* pointer_type;
     
-    typedef typename lldb::SharedPtr<T>::Type T_SP;
+    typedef typename SHARED_PTR(T) T_SP;
     
     PriorityPointerPair() : 
     m_high(),
diff --git a/include/lldb/lldb-forward-rtti.h b/include/lldb/lldb-forward-rtti.h
index c9f7b53..5709f47 100644
--- a/include/lldb/lldb-forward-rtti.h
+++ b/include/lldb/lldb-forward-rtti.h
@@ -13,84 +13,84 @@
 #if defined(__cplusplus)
 
 #include "lldb/lldb-types.h"
+#include <tr1/memory> // for std::tr1::shared_ptr
 
 //----------------------------------------------------------------------
 // lldb forward declarations
 //----------------------------------------------------------------------
 namespace lldb {
 
-    typedef SharedPtr<lldb_private::ABI>::Type ABISP;
-    typedef SharedPtr<lldb_private::AddressResolver>::Type AddressResolverSP;
-    typedef SharedPtr<lldb_private::Baton>::Type BatonSP;
-    typedef SharedPtr<lldb_private::Block>::Type BlockSP;
-    typedef IntrusiveSharedPtr<lldb_private::Breakpoint>::Type BreakpointSP;
-    typedef IntrusiveSharedPtr<lldb_private::BreakpointSite>::Type BreakpointSiteSP;
-    typedef IntrusiveSharedPtr<lldb_private::BreakpointLocation>::Type BreakpointLocationSP;
-    typedef SharedPtr<lldb_private::BreakpointResolver>::Type BreakpointResolverSP;
-    typedef SharedPtr<lldb_private::Broadcaster>::Type BroadcasterSP;
-    typedef SharedPtr<lldb_private::ClangExpressionVariable>::Type ClangExpressionVariableSP;
-    typedef SharedPtr<lldb_private::CommandObject>::Type CommandObjectSP;
-    typedef SharedPtr<lldb_private::Communication>::Type CommunicationSP;
-    typedef SharedPtr<lldb_private::Connection>::Type ConnectionSP;
-    typedef SharedPtr<lldb_private::CompileUnit>::Type CompUnitSP;
-    typedef SharedPtr<lldb_private::DataBuffer>::Type DataBufferSP;
-    typedef SharedPtr<lldb_private::DataExtractor>::Type DataExtractorSP;
-    typedef IntrusiveSharedPtr<lldb_private::Debugger>::Type DebuggerSP;
-    typedef SharedPtr<lldb_private::Disassembler>::Type DisassemblerSP;
-    typedef SharedPtr<lldb_private::DynamicLoader>::Type DynamicLoaderSP;
-    typedef SharedPtr<lldb_private::Event>::Type EventSP;
-    typedef SharedPtr<lldb_private::FormatCategory>::Type FormatCategorySP;
-    typedef SharedPtr<lldb_private::Function>::Type FunctionSP;
-    typedef SharedPtr<lldb_private::InlineFunctionInfo>::Type InlineFunctionInfoSP;
-    typedef SharedPtr<lldb_private::InputReader>::Type InputReaderSP;
-    typedef SharedPtr<lldb_private::InstanceSettings>::Type InstanceSettingsSP;
-    typedef SharedPtr<lldb_private::Instruction>::Type InstructionSP;
-    typedef SharedPtr<lldb_private::LanguageRuntime>::Type LanguageRuntimeSP;
-    typedef SharedPtr<lldb_private::LineTable>::Type LineTableSP;
-    typedef SharedPtr<lldb_private::Listener>::Type ListenerSP;
-    typedef SharedPtr<lldb_private::Log>::Type LogSP;
-    typedef SharedPtr<lldb_private::LogChannel>::Type LogChannelSP;
-    typedef IntrusiveSharedPtr<lldb_private::Module>::Type ModuleSP;
-    typedef IntrusiveSharedPtr<lldb_private::ObjectFile>::Type ObjectFileSP;
-    typedef SharedPtr<lldb_private::OptionValue>::Type OptionValueSP;
-    typedef SharedPtr<lldb_private::Platform>::Type PlatformSP;
-    typedef IntrusiveSharedPtr<lldb_private::Process>::Type ProcessSP;
-    typedef SharedPtr<lldb_private::RegisterContext>::Type RegisterContextSP;
-    typedef SharedPtr<lldb_private::RegularExpression>::Type RegularExpressionSP;
-    typedef SharedPtr<lldb_private::Section>::Type SectionSP;
-    typedef SharedPtr<lldb_private::SearchFilter>::Type SearchFilterSP;
+    typedef std::tr1::shared_ptr<lldb_private::ABI> ABISP;
+    typedef std::tr1::shared_ptr<lldb_private::Baton> BatonSP;
+    typedef std::tr1::shared_ptr<lldb_private::Block> BlockSP;
+    typedef std::tr1::shared_ptr<lldb_private::Breakpoint> BreakpointSP; // make_shared_from_this
+    typedef std::tr1::shared_ptr<lldb_private::BreakpointSite> BreakpointSiteSP; // make_shared_from_this
+    typedef std::tr1::shared_ptr<lldb_private::BreakpointLocation> BreakpointLocationSP; // make_shared_from_this
+    typedef std::tr1::shared_ptr<lldb_private::BreakpointResolver> BreakpointResolverSP;
+    typedef std::tr1::shared_ptr<lldb_private::Broadcaster> BroadcasterSP;
+    typedef std::tr1::shared_ptr<lldb_private::ClangExpressionVariable> ClangExpressionVariableSP;
+    typedef std::tr1::shared_ptr<lldb_private::CommandObject> CommandObjectSP;
+    typedef std::tr1::shared_ptr<lldb_private::Communication> CommunicationSP;
+    typedef std::tr1::shared_ptr<lldb_private::Connection> ConnectionSP;
+    typedef std::tr1::shared_ptr<lldb_private::CompileUnit> CompUnitSP;
+    typedef std::tr1::shared_ptr<lldb_private::DataBuffer> DataBufferSP;
+    typedef std::tr1::shared_ptr<lldb_private::DataExtractor> DataExtractorSP;
+    typedef std::tr1::shared_ptr<lldb_private::Debugger> DebuggerSP; // make_shared_from_this
+    typedef std::tr1::shared_ptr<lldb_private::Disassembler> DisassemblerSP;
+    typedef std::tr1::shared_ptr<lldb_private::DynamicLoader> DynamicLoaderSP;
+    typedef std::tr1::shared_ptr<lldb_private::Event> EventSP;
+    typedef std::tr1::shared_ptr<lldb_private::FormatCategory> FormatCategorySP;
+    typedef std::tr1::shared_ptr<lldb_private::Function> FunctionSP;
+    typedef std::tr1::shared_ptr<lldb_private::InlineFunctionInfo> InlineFunctionInfoSP;
+    typedef std::tr1::shared_ptr<lldb_private::InputReader> InputReaderSP;
+    typedef std::tr1::shared_ptr<lldb_private::InstanceSettings> InstanceSettingsSP;
+    typedef std::tr1::shared_ptr<lldb_private::Instruction> InstructionSP;
+    typedef std::tr1::shared_ptr<lldb_private::LanguageRuntime> LanguageRuntimeSP;
+    typedef std::tr1::shared_ptr<lldb_private::LineTable> LineTableSP;
+    typedef std::tr1::shared_ptr<lldb_private::Listener> ListenerSP;
+    typedef std::tr1::shared_ptr<lldb_private::Log> LogSP;
+    typedef std::tr1::shared_ptr<lldb_private::LogChannel> LogChannelSP;
+    typedef std::tr1::shared_ptr<lldb_private::Module> ModuleSP; // make_shared_from_this
+    typedef std::tr1::shared_ptr<lldb_private::ObjectFile> ObjectFileSP; // make_shared_from_this
+    typedef std::tr1::shared_ptr<lldb_private::OptionValue> OptionValueSP;
+    typedef std::tr1::shared_ptr<lldb_private::Platform> PlatformSP;
+    typedef std::tr1::shared_ptr<lldb_private::Process> ProcessSP; // make_shared_from_this
+    typedef std::tr1::shared_ptr<lldb_private::RegisterContext> RegisterContextSP;
+    typedef std::tr1::shared_ptr<lldb_private::RegularExpression> RegularExpressionSP;
+    typedef std::tr1::shared_ptr<lldb_private::Section> SectionSP;
+    typedef std::tr1::shared_ptr<lldb_private::SearchFilter> SearchFilterSP;
 #ifndef LLDB_DISABLE_PYTHON
-    typedef SharedPtr<lldb_private::ScriptSummaryFormat>::Type ScriptFormatSP;
+    typedef std::tr1::shared_ptr<lldb_private::ScriptSummaryFormat> ScriptFormatSP;
 #endif // #ifndef LLDB_DISABLE_PYTHON
-    typedef IntrusiveSharedPtr<lldb_private::StackFrame>::Type StackFrameSP;
-    typedef SharedPtr<lldb_private::StackFrameList>::Type StackFrameListSP;
-    typedef SharedPtr<lldb_private::StopInfo>::Type StopInfoSP;
-    typedef SharedPtr<lldb_private::StoppointLocation>::Type StoppointLocationSP;
-    typedef SharedPtr<lldb_private::Stream>::Type StreamSP;
-    typedef SharedPtr<lldb_private::StringSummaryFormat>::Type StringSummaryFormatSP;
-    typedef SharedPtr<lldb_private::SummaryFormat>::Type SummaryFormatSP;
-    typedef SharedPtr<lldb_private::SymbolFile>::Type SymbolFileSP;
-    typedef IntrusiveSharedPtr<lldb_private::SymbolFileType>::Type SymbolFileTypeSP;
-    typedef SharedPtr<lldb_private::SymbolContextSpecifier>::Type SymbolContextSpecifierSP;
-    typedef SharedPtr<lldb_private::SyntheticChildren>::Type SyntheticChildrenSP;
-    typedef SharedPtr<lldb_private::SyntheticChildrenFrontEnd>::Type SyntheticChildrenFrontEndSP;
-    typedef IntrusiveSharedPtr<lldb_private::Target>::Type TargetSP;
-    typedef IntrusiveSharedPtr<lldb_private::Thread>::Type ThreadSP;
-    typedef SharedPtr<lldb_private::ThreadPlan>::Type ThreadPlanSP;
-    typedef SharedPtr<lldb_private::ThreadPlanTracer>::Type ThreadPlanTracerSP;
-    typedef IntrusiveSharedPtr<lldb_private::Type>::Type TypeSP;
-    typedef SharedPtr<lldb_private::TypeImpl>::Type TypeImplSP;
-    typedef SharedPtr<lldb_private::FuncUnwinders>::Type FuncUnwindersSP;
-    typedef SharedPtr<lldb_private::UserSettingsController>::Type UserSettingsControllerSP;
-    typedef SharedPtr<lldb_private::UnwindPlan>::Type UnwindPlanSP;
+    typedef std::tr1::shared_ptr<lldb_private::StackFrame> StackFrameSP; // make_shared_from_this
+    typedef std::tr1::shared_ptr<lldb_private::StackFrameList> StackFrameListSP;
+    typedef std::tr1::shared_ptr<lldb_private::StopInfo> StopInfoSP;
+    typedef std::tr1::shared_ptr<lldb_private::StoppointLocation> StoppointLocationSP;
+    typedef std::tr1::shared_ptr<lldb_private::Stream> StreamSP;
+    typedef std::tr1::shared_ptr<lldb_private::StringSummaryFormat> StringSummaryFormatSP;
+    typedef std::tr1::shared_ptr<lldb_private::SummaryFormat> SummaryFormatSP;
+    typedef std::tr1::shared_ptr<lldb_private::SymbolFile> SymbolFileSP;
+    typedef std::tr1::shared_ptr<lldb_private::SymbolFileType> SymbolFileTypeSP; // make_shared_from_this
+    typedef std::tr1::shared_ptr<lldb_private::SymbolContextSpecifier> SymbolContextSpecifierSP;
+    typedef std::tr1::shared_ptr<lldb_private::SyntheticChildren> SyntheticChildrenSP;
+    typedef std::tr1::shared_ptr<lldb_private::SyntheticChildrenFrontEnd> SyntheticChildrenFrontEndSP;
+    typedef std::tr1::shared_ptr<lldb_private::Target> TargetSP; // make_shared_from_this
+    typedef std::tr1::shared_ptr<lldb_private::Thread> ThreadSP; // make_shared_from_this
+    typedef std::tr1::shared_ptr<lldb_private::ThreadPlan> ThreadPlanSP;
+    typedef std::tr1::shared_ptr<lldb_private::ThreadPlanTracer> ThreadPlanTracerSP;
+    typedef std::tr1::shared_ptr<lldb_private::Type> TypeSP; // make_shared_from_this
+    typedef std::tr1::shared_ptr<lldb_private::TypeImpl> TypeImplSP;
+    typedef std::tr1::shared_ptr<lldb_private::FuncUnwinders> FuncUnwindersSP;
+    typedef std::tr1::shared_ptr<lldb_private::UserSettingsController> UserSettingsControllerSP;
+    typedef std::tr1::shared_ptr<lldb_private::UnwindPlan> UnwindPlanSP;
     typedef SharedPtr<lldb_private::ValueObject>::Type ValueObjectSP;
-    typedef SharedPtr<lldb_private::Value>::Type ValueSP;
-    typedef SharedPtr<lldb_private::ValueFormat>::Type ValueFormatSP;
-    typedef SharedPtr<lldb_private::ValueList>::Type ValueListSP;
-    typedef SharedPtr<lldb_private::Variable>::Type VariableSP;
-    typedef SharedPtr<lldb_private::VariableList>::Type VariableListSP;
-    typedef SharedPtr<lldb_private::ValueObjectList>::Type ValueObjectListSP;
-    typedef SharedPtr<lldb_private::Watchpoint>::Type WatchpointSP;
+    typedef std::tr1::shared_ptr<lldb_private::Value> ValueSP;
+    typedef std::tr1::shared_ptr<lldb_private::ValueFormat> ValueFormatSP;
+    typedef std::tr1::shared_ptr<lldb_private::ValueList> ValueListSP;
+    typedef std::tr1::shared_ptr<lldb_private::Variable> VariableSP;
+    typedef std::tr1::shared_ptr<lldb_private::VariableList> VariableListSP;
+    typedef std::tr1::shared_ptr<lldb_private::ValueObjectList> ValueObjectListSP;
+    typedef std::tr1::shared_ptr<lldb_private::Watchpoint> WatchpointSP;
 
 } // namespace lldb
 
diff --git a/include/lldb/lldb-types.h b/include/lldb/lldb-types.h
index 1067965..d1908db 100644
--- a/include/lldb/lldb-types.h
+++ b/include/lldb/lldb-types.h
@@ -23,13 +23,13 @@
 
 //----------------------------------------------------------------------
 // All host systems must define:
-//  liblldb::condition_t       The native condition type (or a substitute class) for conditions on the host system.
-//  liblldb::mutex_t           The native mutex type for mutex objects on the host system.
-//  liblldb::thread_t          The native thread type for spawned threads on the system
-//  liblldb::thread_arg_t      The type of the one any only thread creation argument for the host system
-//  liblldb::thread_result_t   The return type that gets returned when a thread finishes.
-//  liblldb::thread_func_t     The function prototype used to spawn a thread on the host system.
-//  liblldb::SharedPtr         The template that wraps up the host version of a reference counted pointer (like boost::shared_ptr)
+//  lldb::condition_t       The native condition type (or a substitute class) for conditions on the host system.
+//  lldb::mutex_t           The native mutex type for mutex objects on the host system.
+//  lldb::thread_t          The native thread type for spawned threads on the system
+//  lldb::thread_arg_t      The type of the one any only thread creation argument for the host system
+//  lldb::thread_result_t   The return type that gets returned when a thread finishes.
+//  lldb::thread_func_t     The function prototype used to spawn a thread on the host system.
+//  lldb::SharedPtr         The template that wraps up the host version of a reference counted pointer (like boost::shared_ptr)
 //  #define LLDB_INVALID_PROCESS_ID ...
 //  #define LLDB_INVALID_THREAD_ID ...
 //  #define LLDB_INVALID_HOST_THREAD ...
@@ -64,17 +64,17 @@
         {
             typedef lldb_private::SharingPtr<_Tp> Type;
         };
-        template<typename _Tp>
-        struct LoggingSharedPtr
-        {
-            typedef lldb_private::LoggingSharingPtr<_Tp> Type;
-        };
-    
-        template <typename _Tp>
-        struct IntrusiveSharedPtr 
-        {
-            typedef lldb_private::IntrusiveSharingPtr<_Tp> Type;
-        };
+//        template<typename _Tp>
+//        struct LoggingSharedPtr
+//        {
+//            typedef lldb_private::LoggingSharingPtr<_Tp> Type;
+//        };
+//    
+//        template <typename _Tp>
+//        struct IntrusiveSharedPtr 
+//        {
+//            typedef lldb_private::IntrusiveSharingPtr<_Tp> Type;
+//        };
 
 } // namespace lldb
 
@@ -91,6 +91,7 @@
 
 #endif
 
+#define SHARED_PTR(T)   std::tr1::shared_ptr<T>
 #define LLDB_INVALID_HOST_TIME           { 0, 0 }
 
 namespace lldb 
diff --git a/lldb.xcodeproj/xcshareddata/xcschemes/lldb-tool.xcscheme b/lldb.xcodeproj/xcshareddata/xcschemes/lldb-tool.xcscheme
index 6e12c06..43205cd 100644
--- a/lldb.xcodeproj/xcshareddata/xcschemes/lldb-tool.xcscheme
+++ b/lldb.xcodeproj/xcshareddata/xcschemes/lldb-tool.xcscheme
@@ -99,6 +99,12 @@
             ReferencedContainer = "container:lldb.xcodeproj">
          </BuildableReference>
       </BuildableProductRunnable>
+      <CommandLineArguments>
+         <CommandLineArgument
+            argument = "/Volumes/work/gclayton/Documents/src/args/a.out"
+            isEnabled = "YES">
+         </CommandLineArgument>
+      </CommandLineArguments>
       <EnvironmentVariables>
          <EnvironmentVariable
             key = "LLDB_LAUNCH_FLAG_DISABLE_ASLR"
@@ -132,6 +138,11 @@
          </EnvironmentVariable>
       </EnvironmentVariables>
       <AdditionalOptions>
+         <AdditionalOption
+            key = "MallocScribble"
+            value = ""
+            isEnabled = "YES">
+         </AdditionalOption>
       </AdditionalOptions>
    </LaunchAction>
    <ProfileAction
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;
     }
 
