diff --git a/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp b/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp
index 496deba..f0c33f6 100644
--- a/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp
+++ b/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp
@@ -1133,14 +1133,58 @@
 ProcessGDBRemote::WillDetach ()
 {
     Error error;
-    const StateType state = m_private_state.GetValue();
 
-    if (IsRunning(state))
-        error.SetErrorString("Process must be stopped in order to detach.");
-
+    if (m_gdb_comm.IsRunning())
+    {
+        bool timed_out = false;
+        Mutex::Locker locker;
+        if (!m_gdb_comm.SendInterrupt (locker, 2, &timed_out))
+        {
+            if (timed_out)
+                error.SetErrorString("timed out sending interrupt packet");
+            else
+                error.SetErrorString("unknown error sending interrupt packet");
+        }
+    }
     return error;
 }
 
+Error
+ProcessGDBRemote::DoDetach()
+{
+    Error error;
+    Log *log = ProcessGDBRemoteLog::GetLogIfAllCategoriesSet(GDBR_LOG_PROCESS);
+    if (log)
+        log->Printf ("ProcessGDBRemote::DoDetach()");
+
+    DisableAllBreakpointSites ();
+
+    StringExtractorGDBRemote response;
+    size_t response_size = m_gdb_comm.SendPacketAndWaitForResponse("D", response, 2, false);
+    if (response_size)
+    {
+        if (response.IsOKPacket())
+        {
+            if (log)
+                log->Printf ("ProcessGDBRemote::DoDetach() detach was successful");
+
+        }
+        else if (log)
+        {
+            log->Printf ("ProcessGDBRemote::DoDestroy() detach failed: %s", response.GetStringRef().c_str());
+        }
+    }
+    else if (log)
+    {
+        log->PutCString ("ProcessGDBRemote::DoDestroy() detach failed for unknown reasons");
+    }
+    StopAsyncThread ();
+    m_gdb_comm.StopReadThread();
+    KillDebugserverProcess ();
+    m_gdb_comm.Disconnect();    // Disconnect from the debug server.
+    SetPublicState (eStateDetached);
+    return error;
+}
 
 Error
 ProcessGDBRemote::DoDestroy ()
@@ -1575,57 +1619,6 @@
     return error;
 }
 
-
-Error
-ProcessGDBRemote::DoDetach()
-{
-    Error error;
-    Log *log = ProcessGDBRemoteLog::GetLogIfAllCategoriesSet(GDBR_LOG_PROCESS);
-    if (log)
-        log->Printf ("ProcessGDBRemote::DoDetach()");
-
-    //    if (DoSIGSTOP (true))
-    //    {
-    //        CloseChildFileDescriptors ();
-    //
-    //        // Scope for "locker" so we can reply to all of our exceptions (the SIGSTOP
-    //        // exception).
-    //        {
-    //            Mutex::Locker locker(m_exception_messages_mutex);
-    //            ReplyToAllExceptions();
-    //        }
-    //
-    //        // Shut down the exception thread and cleanup our exception remappings
-    //        Task().ShutDownExceptionThread();
-    //
-    //        pid_t pid = GetID();
-    //
-    //        // Detach from our process while we are stopped.
-    //        errno = 0;
-    //
-    //        // Detach from our process
-    //        ::ptrace (PT_DETACH, pid, (caddr_t)1, 0);
-    //
-    //        error.SetErrorToErrno();
-    //
-    //        if (log || error.Fail())
-    //            error.PutToLog(log, "::ptrace (PT_DETACH, %u, (caddr_t)1, 0)", pid);
-    //
-    //        // Resume our task
-    //        Task().Resume();
-    //
-    //        // NULL our task out as we have already retored all exception ports
-    //        Task().Clear();
-    //
-    //        // Clear out any notion of the process we once were
-    //        Clear();
-    //
-    //        SetPrivateState (eStateDetached);
-    //        return true;
-    //    }
-    return error;
-}
-
 void
 ProcessGDBRemote::STDIOReadThreadBytesReceived (void *baton, const void *src, size_t src_len)
 {
diff --git a/source/Plugins/SymbolFile/DWARF/DWARFDebugInfoEntry.h b/source/Plugins/SymbolFile/DWARF/DWARFDebugInfoEntry.h
index 6e6fdf0..d9603a7 100644
--- a/source/Plugins/SymbolFile/DWARF/DWARFDebugInfoEntry.h
+++ b/source/Plugins/SymbolFile/DWARF/DWARFDebugInfoEntry.h
@@ -105,8 +105,7 @@
                     m_offset        (DW_INVALID_OFFSET),
                     m_parent_idx    (0),
                     m_sibling_idx   (0),
-                    m_abbrevDecl    (NULL),
-                    m_user_data     (NULL)
+                    m_abbrevDecl    (NULL)
                 {
                 }
 
@@ -319,14 +318,11 @@
     }
     const DWARFAbbreviationDeclaration* GetAbbreviationDeclarationPtr() const { return m_abbrevDecl; }
 
-    void *      GetUserData() const { return m_user_data; }
-    void        SetUserData(void *d) const { m_user_data = d; }
 protected:
     dw_offset_t                         m_offset;       // Offset within the .debug_info of the start of this entry
     uint32_t                            m_parent_idx;   // How many to subtract from "this" to get the parent. If zero this die has no parent
     uint32_t                            m_sibling_idx;  // How many to add to "this" to get the sibling.
     const DWARFAbbreviationDeclaration* m_abbrevDecl;
-    mutable void *                      m_user_data;    // Flags for use by the parsers
 };
 
 #endif  // liblldb_DWARFDebugInfoEntry_h_
diff --git a/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp b/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp
index 44b10af..13885a1 100644
--- a/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp
+++ b/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp
@@ -52,7 +52,7 @@
 
 #include <map>
 
-#define DIE_IS_BEING_PARSED ((void*)1)
+#define DIE_IS_BEING_PARSED ((lldb_private::Type*)1)
 
 using namespace lldb;
 using namespace lldb_private;
@@ -609,10 +609,7 @@
             if (decl_file != 0 || decl_line != 0 || decl_column != 0)
                 decl_ap.reset(new Declaration(sc.comp_unit->GetSupportFiles().GetFileSpecAtIndex(decl_file), decl_line, decl_column));
 
-            Type *func_type = NULL;
-
-            if (die->GetUserData() != DIE_IS_BEING_PARSED)
-                func_type = (Type*)die->GetUserData();
+            Type *func_type = m_die_to_type.lookup (die);
 
             assert(func_type == NULL || func_type != DIE_IS_BEING_PARSED);
 
@@ -1215,17 +1212,7 @@
         DWARFCompileUnitSP cu_sp;
         const DWARFDebugInfoEntry* type_die = debug_info->GetDIEPtr(type_uid, &cu_sp);
         if (type_die != NULL)
-        {
-            void *type = type_die->GetUserData();
-            if (type == NULL)
-            {
-                TypeSP owning_type_sp;
-                GetTypeForDIE(cu_sp.get(), type_die, owning_type_sp, 0, 0);
-                type = type_die->GetUserData();
-            }
-            if (type != DIE_IS_BEING_PARSED)
-                return (Type *)type;
-        }
+            return ResolveType (cu_sp.get(), type_die);
     }
     return NULL;
 }
@@ -1235,15 +1222,14 @@
 {
     if (type_die != NULL)
     {
-        void *type = type_die->GetUserData();
+        Type *type = m_die_to_type.lookup (type_die);
         if (type == NULL)
         {
             TypeSP owning_type_sp;
-            TypeSP type_sp(GetTypeForDIE(cu, type_die, owning_type_sp, 0, 0));
-            type = type_die->GetUserData();
+            type = GetTypeForDIE(cu, type_die, owning_type_sp, 0, 0).get();
         }
-        if (type != DIE_IS_BEING_PARSED)
-            return (Type *)type;
+        assert (type != DIE_IS_BEING_PARSED);
+        return type;
     }
     return NULL;
 }
@@ -2238,38 +2224,26 @@
     }
 }
 
-Type*
-SymbolFileDWARF::GetUniquedTypeForDIEOffset(dw_offset_t type_die_offset, TypeSP& owning_type_sp, int32_t child_type, uint32_t idx, bool safe)
-{
-    if (type_die_offset != DW_INVALID_OFFSET)
-    {
-        DWARFCompileUnitSP cu_sp;
-        const DWARFDebugInfoEntry* type_die = DebugInfo()->GetDIEPtr(type_die_offset, &cu_sp);
-        assert(type_die != NULL);
-        GetTypeForDIE(cu_sp.get(), type_die, owning_type_sp, child_type, idx);
-        // Return the uniqued type if there is one
-        Type* type = (Type*)type_die->GetUserData();
-        if (type == DIE_IS_BEING_PARSED && safe)
-            return NULL;
-        return type;
-    }
-    return NULL;
-}
-
 TypeSP
-SymbolFileDWARF::GetTypeForDIE(DWARFCompileUnit *cu, const DWARFDebugInfoEntry* die, TypeSP& owning_type_sp, int32_t child_type, uint32_t idx)
+SymbolFileDWARF::GetTypeForDIE 
+(
+    DWARFCompileUnit *cu, 
+    const DWARFDebugInfoEntry* die, 
+    TypeSP& owning_type_sp, 
+    int32_t child_type, 
+    uint32_t idx
+)
 {
     TypeSP type_sp;
     if (die != NULL)
     {
         assert(cu != NULL);
-        Type *type_ptr = (Type *)die->GetUserData();
+        Type *type_ptr = m_die_to_type.lookup (die);
         if (type_ptr == NULL)
         {
             SymbolContext sc(GetCompUnitForDWARFCompUnit(cu));
             bool type_is_new = false;
             type_sp = ParseType(sc, cu, die, type_is_new);
-            type_ptr = (Type *)die->GetUserData();
             if (owning_type_sp.get() == NULL)
                 owning_type_sp = type_sp;
         }
@@ -2349,11 +2323,13 @@
     AccessType accessibility = eAccessNone;
     if (die != NULL)
     {
-        const dw_tag_t tag = die->Tag();
-        if (die->GetUserData() == NULL)
+        Type *type_ptr = m_die_to_type.lookup (die);
+        if (type_ptr == NULL)
         {
             type_is_new = true;
 
+            const dw_tag_t tag = die->Tag();
+
             bool is_forward_declaration = false;
             DWARFDebugInfoEntry::Attributes attributes;
             const char *type_name_cstr = NULL;
@@ -2376,7 +2352,7 @@
                 {
                     //printf("0x%8.8x: %s (ParesTypes)\n", die->GetOffset(), DW_TAG_value_to_name(tag));
                     // Set a bit that lets us know that we are currently parsing this
-                    const_cast<DWARFDebugInfoEntry*>(die)->SetUserData(DIE_IS_BEING_PARSED);
+                    m_die_to_type[die] = DIE_IS_BEING_PARSED;
 
                     const size_t num_attributes = die->GetAttributes(this, dwarf_cu, NULL, attributes);
                     Declaration decl;
@@ -2480,8 +2456,7 @@
                         
                     type_sp.reset( new Type(die->GetOffset(), this, type_name_dbstr, byte_size, NULL, encoding_uid, encoding_uid_type, &decl, clang_type));
 
-                    const_cast<DWARFDebugInfoEntry*>(die)->SetUserData(type_sp.get());
-
+                    m_die_to_type[die] = type_sp.get();
 
 //                  Type* encoding_type = GetUniquedTypeForDIEOffset(encoding_uid, type_sp, NULL, 0, 0, false);
 //                  if (encoding_type != NULL)
@@ -2500,7 +2475,7 @@
                 {
                     //printf("0x%8.8x: %s (ParesTypes)\n", die->GetOffset(), DW_TAG_value_to_name(tag));
                     // Set a bit that lets us know that we are currently parsing this
-                    const_cast<DWARFDebugInfoEntry*>(die)->SetUserData(DIE_IS_BEING_PARSED);
+                    m_die_to_type[die] = DIE_IS_BEING_PARSED;
 
                     size_t byte_size = 0;
                     LanguageType class_language = eLanguageTypeUnknown;
@@ -2589,7 +2564,7 @@
                     m_die_to_decl_ctx[die] = ClangASTContext::GetDeclContextForType (clang_type);
                     type_sp.reset( new Type(die->GetOffset(), this, type_name_dbstr, byte_size, NULL, LLDB_INVALID_UID, Type::eIsTypeWithUID, &decl, clang_type));
 
-                    const_cast<DWARFDebugInfoEntry*>(die)->SetUserData(type_sp.get());
+                    m_die_to_type[die] = type_sp.get();
 
 //                  assert(type_sp.get());
 //                  if (accessibility)
@@ -2655,7 +2630,7 @@
                 {
                     //printf("0x%8.8x: %s (ParesTypes)\n", die->GetOffset(), DW_TAG_value_to_name(tag));
                     // Set a bit that lets us know that we are currently parsing this
-                    const_cast<DWARFDebugInfoEntry*>(die)->SetUserData(DIE_IS_BEING_PARSED);
+                    m_die_to_type[die] = DIE_IS_BEING_PARSED;
 
                     size_t byte_size = 0;
                     lldb::user_id_t encoding_uid = DW_INVALID_OFFSET;
@@ -2707,7 +2682,7 @@
                         m_die_to_decl_ctx[die] = ClangASTContext::GetDeclContextForType (clang_type);
                         type_sp.reset( new Type(die->GetOffset(), this, type_name_dbstr, byte_size, NULL, encoding_uid, Type::eIsTypeWithUID, &decl, clang_type));
 
-                        const_cast<DWARFDebugInfoEntry*>(die)->SetUserData(type_sp.get());
+                        m_die_to_type[die] = type_sp.get();
 
                         if (die->HasChildren())
                         {
@@ -2725,7 +2700,7 @@
                 {
                     //printf("0x%8.8x: %s (ParesTypes)\n", die->GetOffset(), DW_TAG_value_to_name(tag));
                     // Set a bit that lets us know that we are currently parsing this
-                    const_cast<DWARFDebugInfoEntry*>(die)->SetUserData(DIE_IS_BEING_PARSED);
+                    m_die_to_type[die] = DIE_IS_BEING_PARSED;
 
                     const char *mangled = NULL;
                     dw_offset_t type_die_offset = DW_INVALID_OFFSET;
@@ -2820,6 +2795,10 @@
 
                         // Parse the function children for the parameters
                         bool skip_artificial = true;
+                        if (die->GetOffset() == 1340212) // REMOVE THIS BEFORE CHECKIN
+                        { // REMOVE THIS BEFORE CHECKIN
+                            printf("this one!\n"); // REMOVE THIS BEFORE CHECKIN
+                        } // REMOVE THIS BEFORE CHECKIN
                         ParseChildParameters (sc, type_sp, dwarf_cu, die, skip_artificial, type_list, function_param_types, function_param_decls);
 
                         // clang_type will get the function prototype clang type after this call
@@ -2908,7 +2887,7 @@
                         }
                         type_sp.reset( new Type(die->GetOffset(), this, type_name_dbstr, 0, NULL, LLDB_INVALID_UID, Type::eIsTypeWithUID, &decl, clang_type));
 
-                        const_cast<DWARFDebugInfoEntry*>(die)->SetUserData(type_sp.get());
+                        m_die_to_type[die] = type_sp.get();
                         assert(type_sp.get());
                     }
                 }
@@ -2918,7 +2897,7 @@
                 {
                     //printf("0x%8.8x: %s (ParesTypes)\n", die->GetOffset(), DW_TAG_value_to_name(tag));
                     // Set a bit that lets us know that we are currently parsing this
-                    const_cast<DWARFDebugInfoEntry*>(die)->SetUserData(DIE_IS_BEING_PARSED);
+                    m_die_to_type[die] = DIE_IS_BEING_PARSED;
 
                     size_t byte_size = 0;
                     lldb::user_id_t type_die_offset = DW_INVALID_OFFSET;
@@ -2993,7 +2972,7 @@
                             }
                             ConstString empty_name;
                             type_sp.reset( new Type(die->GetOffset(), this, empty_name, array_element_bit_stride / 8, NULL, LLDB_INVALID_UID, Type::eIsTypeWithUID, &decl, clang_type));
-                            const_cast<DWARFDebugInfoEntry*>(die)->SetUserData(type_sp.get());
+                            m_die_to_type[die] = type_sp.get();
                         }
                     }
                 }
@@ -3035,7 +3014,7 @@
                         size_t byte_size = ClangASTType::GetClangTypeBitWidth (type_list->GetClangASTContext().getASTContext(), clang_type) / 8;
 
                         type_sp.reset( new Type(die->GetOffset(), this, type_name_dbstr, byte_size, NULL, LLDB_INVALID_UID, Type::eIsTypeWithUID, NULL, clang_type));
-                        const_cast<DWARFDebugInfoEntry*>(die)->SetUserData(type_sp.get());
+                        m_die_to_type[die] = type_sp.get();
                     }
                                             
                     break;
@@ -3078,43 +3057,14 @@
                 {
                     // We are ready to put this type into the uniqued list up at the module level
                     TypeSP uniqued_type_sp(m_obj_file->GetModule()->GetTypeList()->InsertUnique(type_sp));
-
-                    const_cast<DWARFDebugInfoEntry*>(die)->SetUserData(uniqued_type_sp.get());
-
                     type_sp = uniqued_type_sp;
+                    m_die_to_type[die] = type_sp.get();
                 }
             }
         }
-        else
+        else if (type_ptr != DIE_IS_BEING_PARSED)
         {
-            switch (tag)
-            {
-            case DW_TAG_base_type:
-            case DW_TAG_pointer_type:
-            case DW_TAG_reference_type:
-            case DW_TAG_typedef:
-            case DW_TAG_const_type:
-            case DW_TAG_restrict_type:
-            case DW_TAG_volatile_type:
-            case DW_TAG_structure_type:
-            case DW_TAG_union_type:
-            case DW_TAG_class_type:
-            case DW_TAG_enumeration_type:
-            case DW_TAG_subprogram:
-            case DW_TAG_subroutine_type:
-            case DW_TAG_array_type:
-                {
-                    Type *existing_type = (Type*)die->GetUserData();
-                    if (existing_type != DIE_IS_BEING_PARSED)
-                    {
-                        type_sp = m_obj_file->GetModule()->GetTypeList()->FindType(existing_type->GetID());
-                    }
-                }
-                break;
-            default:
-                //assert(!"invalid type tag...");
-                break;
-            }
+            type_sp = m_obj_file->GetModule()->GetTypeList()->FindType(type_ptr->GetID());
         }
     }
     return type_sp;
@@ -3280,7 +3230,6 @@
         const char *mangled = NULL;
         Declaration decl;
         uint32_t i;
-        TypeSP type_sp;
         Type *var_type = NULL;
         DWARFExpression location;
         bool is_external = false;
@@ -3300,7 +3249,7 @@
                 case DW_AT_decl_column: decl.SetColumn(form_value.Unsigned()); break;
                 case DW_AT_name:        name = form_value.AsCString(&get_debug_str_data()); break;
                 case DW_AT_MIPS_linkage_name: mangled = form_value.AsCString(&get_debug_str_data()); break;
-                case DW_AT_type:        var_type = GetUniquedTypeForDIEOffset(form_value.Reference(dwarf_cu), type_sp, 0, 0, false); break;
+                case DW_AT_type:        var_type = ResolveTypeUID(form_value.Reference(dwarf_cu)); break;
                 case DW_AT_external:    is_external = form_value.Unsigned() != 0; break;
                 case DW_AT_location:
                     {
@@ -3396,7 +3345,8 @@
                                        location, 
                                        is_external, 
                                        is_artificial));
-            const_cast<DWARFDebugInfoEntry*>(die)->SetUserData(var_sp.get());
+            
+            m_die_to_variable_sp[die] = var_sp;
         }
     }
     return var_sp;
@@ -3477,7 +3427,7 @@
         dw_tag_t tag = die->Tag();
 
         // Check to see if we have already parsed this variable or constant?
-        if (die->GetUserData() == NULL)
+        if (m_die_to_variable_sp[die].get() == NULL)
         {
             // We haven't already parsed it, lets do that now.
             if ((tag == DW_TAG_variable) ||
diff --git a/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h b/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h
index 0ec55da..c603810 100644
--- a/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h
+++ b/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h
@@ -280,8 +280,12 @@
                                 const NameToDIE &name_to_die,
                                 lldb_private::SymbolContextList& sc_list);
 
-    lldb_private::Type*     GetUniquedTypeForDIEOffset(dw_offset_t type_die_offset, lldb::TypeSP& owning_type_sp, int32_t child_type, uint32_t idx, bool safe);
-    lldb::TypeSP            GetTypeForDIE(DWARFCompileUnit *cu, const DWARFDebugInfoEntry* die, lldb::TypeSP& owning_type_sp, int32_t child_type, uint32_t idx);
+    lldb::TypeSP            GetTypeForDIE (DWARFCompileUnit *cu, 
+                                           const DWARFDebugInfoEntry* die, 
+                                           lldb::TypeSP& owning_type_sp, 
+                                           int32_t child_type, 
+                                           uint32_t idx);
+
     uint32_t                FindTypes(std::vector<dw_offset_t> die_offsets, uint32_t max_matches, lldb_private::TypeList& types);
 
     void                    Index();
@@ -313,7 +317,11 @@
     std::auto_ptr<DWARFDebugRanges>     m_ranges;
 
     typedef llvm::DenseMap<const DWARFDebugInfoEntry *, clang::DeclContext *> DIEToDeclContextMap;
+    typedef llvm::DenseMap<const DWARFDebugInfoEntry *, lldb_private::Type *> DIEToTypePtr;
+    typedef llvm::DenseMap<const DWARFDebugInfoEntry *, lldb::VariableSP> DIEToVariableSP;
     DIEToDeclContextMap m_die_to_decl_ctx;
+    DIEToTypePtr m_die_to_type;
+    DIEToVariableSP m_die_to_variable_sp;
     
 };
 
