Index: lldb/trunk/include/lldb/Core/Debugger.h
===================================================================
--- lldb/trunk/include/lldb/Core/Debugger.h
+++ lldb/trunk/include/lldb/Core/Debugger.h
@@ -69,6 +69,9 @@
     FindTargetWithProcess (Process *process);
 
     static void
+    InitializeForLLGS (LoadPluginCallbackType load_plugin_callback);
+
+    static void
     Initialize (LoadPluginCallbackType load_plugin_callback);
     
     static void 
Index: lldb/trunk/source/Core/Debugger.cpp
===================================================================
--- lldb/trunk/source/Core/Debugger.cpp
+++ lldb/trunk/source/Core/Debugger.cpp
@@ -412,12 +412,24 @@
     return g_shared_debugger_refcount;
 }
 
+static bool lldb_initialized_for_llgs = false;
+void
+Debugger::InitializeForLLGS (LoadPluginCallbackType load_plugin_callback)
+{
+    lldb_initialized_for_llgs = true;
+    g_shared_debugger_refcount++;
+    g_load_plugin_callback = load_plugin_callback;
+    lldb_private::InitializeForLLGS();
+}
+
+static bool lldb_initialized = true;
 void
 Debugger::Initialize (LoadPluginCallbackType load_plugin_callback)
 {
+    lldb_initialized = true;
+    g_shared_debugger_refcount++;
     g_load_plugin_callback = load_plugin_callback;
-    if (g_shared_debugger_refcount++ == 0)
-        lldb_private::Initialize();
+    lldb_private::Initialize();
 }
 
 void
@@ -429,7 +441,14 @@
         if (g_shared_debugger_refcount == 0)
         {
             lldb_private::WillTerminate();
-            lldb_private::Terminate();
+            if (lldb_initialized_for_llgs) {
+                lldb_initialized_for_llgs = false;
+                lldb_private::TerminateLLGS();
+            }
+            if (lldb_initialized) {
+                lldb_initialized = false;
+                lldb_private::Terminate();
+            }
 
             // Clear our master list of debugger objects
             Mutex::Locker locker (GetDebuggerListMutex ());
Index: lldb/trunk/source/lldb.cpp
===================================================================
--- lldb/trunk/source/lldb.cpp
+++ lldb/trunk/source/lldb.cpp
@@ -109,17 +109,17 @@
     ::abort();
 }
 
+static bool g_inited_for_llgs = false;
 void
 lldb_private::InitializeForLLGS ()
 {
     // Make sure we initialize only once
     static Mutex g_inited_mutex(Mutex::eMutexTypeRecursive);
-    static bool g_inited = false;
 
     Mutex::Locker locker(g_inited_mutex);
-    if (!g_inited)
+    if (!g_inited_for_llgs)
     {
-        g_inited = true;
+        g_inited_for_llgs = true;
 
 #if defined(_MSC_VER)
         const char *disable_crash_dialog_var = getenv("LLDB_DISABLE_CRASH_DIALOG");
@@ -186,15 +186,19 @@
         PlatformDarwinKernel::Initialize();
         ObjectFileMachO::Initialize();
 #endif
+#ifndef LLDB_DISABLE_PYTHON
+        ScriptInterpreterPython::InitializePrivate();
+        OperatingSystemPython::Initialize();
+#endif
     }
 }
 
+static bool g_inited = false;
 void
 lldb_private::Initialize ()
 {
     // Make sure we initialize only once
     static Mutex g_inited_mutex(Mutex::eMutexTypeRecursive);
-    static bool g_inited = false;
 
     InitializeForLLGS();
     Mutex::Locker locker(g_inited_mutex);
@@ -202,11 +206,6 @@
     {
         g_inited = true;
 
-#ifndef LLDB_DISABLE_PYTHON
-        ScriptInterpreterPython::InitializePrivate();
-        OperatingSystemPython::Initialize();
-#endif
-
         // Initialize LLVM and Clang
         llvm::InitializeAllTargets();
         llvm::InitializeAllAsmPrinters();
@@ -271,89 +270,99 @@
 void
 lldb_private::TerminateLLGS ()
 {
-    Timer scoped_timer (__PRETTY_FUNCTION__, __PRETTY_FUNCTION__);
-    ObjectContainerBSDArchive::Terminate();
-    ObjectFileELF::Terminate();
-    SymbolVendorELF::Terminate();
-    SymbolFileDWARF::Terminate();
-    SymbolFileSymtab::Terminate();
-    UnwindAssembly_x86::Terminate();
-    UnwindAssemblyInstEmulation::Terminate();
-    EmulateInstructionARM::Terminate ();
-    EmulateInstructionARM64::Terminate ();
-    ObjectFilePECOFF::Terminate ();
-    DynamicLoaderPOSIXDYLD::Terminate ();
-    PlatformFreeBSD::Terminate();
-    PlatformLinux::Terminate();
-    PlatformWindows::Terminate();
-    PlatformKalimba::Terminate();
-    PlatformAndroid::Terminate();
-    SymbolFileDWARFDebugMap::Terminate();
-    ItaniumABILanguageRuntime::Terminate();
-    DynamicLoaderMacOSXDYLD::Terminate();
-    AppleObjCRuntimeV2::Terminate();
-    AppleObjCRuntimeV1::Terminate();
-    ObjectContainerUniversalMachO::Terminate();
-    PlatformMacOSX::Terminate();
-    PlatformRemoteiOS::Terminate();
-    PlatformiOSSimulator::Terminate();
-    SystemRuntimeMacOSX::Terminate();
+    if (g_inited_for_llgs)
+    {
+        g_inited_for_llgs = false;
+
+        Timer scoped_timer (__PRETTY_FUNCTION__, __PRETTY_FUNCTION__);
+        ObjectContainerBSDArchive::Terminate();
+        ObjectFileELF::Terminate();
+        SymbolVendorELF::Terminate();
+        SymbolFileDWARF::Terminate();
+        SymbolFileSymtab::Terminate();
+        UnwindAssembly_x86::Terminate();
+        UnwindAssemblyInstEmulation::Terminate();
+        EmulateInstructionARM::Terminate ();
+        EmulateInstructionARM64::Terminate ();
+        ObjectFilePECOFF::Terminate ();
+        DynamicLoaderPOSIXDYLD::Terminate ();
+        PlatformFreeBSD::Terminate();
+        PlatformLinux::Terminate();
+        PlatformWindows::Terminate();
+        PlatformKalimba::Terminate();
+        PlatformAndroid::Terminate();
+        SymbolFileDWARFDebugMap::Terminate();
+        ItaniumABILanguageRuntime::Terminate();
+        DynamicLoaderMacOSXDYLD::Terminate();
+        AppleObjCRuntimeV2::Terminate();
+        AppleObjCRuntimeV1::Terminate();
+        ObjectContainerUniversalMachO::Terminate();
+        PlatformMacOSX::Terminate();
+        PlatformRemoteiOS::Terminate();
+        PlatformiOSSimulator::Terminate();
+        SystemRuntimeMacOSX::Terminate();
 
 #if defined (__APPLE__)
-    DynamicLoaderDarwinKernel::Terminate();
-    ObjectFileMachO::Terminate();
-    PlatformDarwinKernel::Terminate();
-    SymbolVendorMacOSX::Terminate();
+        DynamicLoaderDarwinKernel::Terminate();
+        ObjectFileMachO::Terminate();
+        PlatformDarwinKernel::Terminate();
+        SymbolVendorMacOSX::Terminate();
+#endif
+
+#ifndef LLDB_DISABLE_PYTHON
+        OperatingSystemPython::Terminate();
 #endif
 
-    Log::Terminate();
+        Log::Terminate();
+    }
 }
 
 void
 lldb_private::Terminate ()
 {
-    Timer scoped_timer (__PRETTY_FUNCTION__, __PRETTY_FUNCTION__);
-    // Terminate and unload and loaded system or user LLDB plug-ins
-    PluginManager::Terminate();
-    ABIMacOSX_i386::Terminate();
-    ABIMacOSX_arm::Terminate();
-    ABIMacOSX_arm64::Terminate();
-    ABISysV_x86_64::Terminate();
-    ABISysV_ppc::Terminate();
-    ABISysV_ppc64::Terminate();
-    DisassemblerLLVMC::Terminate();
-
-    JITLoaderGDB::Terminate();
-    ProcessElfCore::Terminate();
-    MemoryHistoryASan::Terminate();
-    AddressSanitizerRuntime::Terminate();
+    if (g_inited)
+    {
+        g_inited = false;
+
+        Timer scoped_timer (__PRETTY_FUNCTION__, __PRETTY_FUNCTION__);
+        // Terminate and unload and loaded system or user LLDB plug-ins
+        PluginManager::Terminate();
+        ABIMacOSX_i386::Terminate();
+        ABIMacOSX_arm::Terminate();
+        ABIMacOSX_arm64::Terminate();
+        ABISysV_x86_64::Terminate();
+        ABISysV_ppc::Terminate();
+        ABISysV_ppc64::Terminate();
+        DisassemblerLLVMC::Terminate();
+
+        JITLoaderGDB::Terminate();
+        ProcessElfCore::Terminate();
+        MemoryHistoryASan::Terminate();
+        AddressSanitizerRuntime::Terminate();
 
 #if defined (__APPLE__)
-    ProcessMachCore::Terminate();
-    ProcessKDP::Terminate();
+        ProcessMachCore::Terminate();
+        ProcessKDP::Terminate();
 #endif
 #if defined(_MSC_VER)
-    DynamicLoaderWindows::Terminate();
+        DynamicLoaderWindows::Terminate();
 #endif
 
 #if defined (__linux__)
-    ProcessLinux::Terminate();
+        ProcessLinux::Terminate();
 #endif
 
 #if defined (__FreeBSD__)
-    ProcessFreeBSD::Terminate();
+        ProcessFreeBSD::Terminate();
 #endif
-    Debugger::SettingsTerminate ();
+        Debugger::SettingsTerminate ();
 
-    PlatformRemoteGDBServer::Terminate();
-    ProcessGDBRemote::Terminate();
-    DynamicLoaderStatic::Terminate();
+        PlatformRemoteGDBServer::Terminate();
+        ProcessGDBRemote::Terminate();
+        DynamicLoaderStatic::Terminate();
 
-#ifndef LLDB_DISABLE_PYTHON
-    OperatingSystemPython::Terminate();
-#endif
-
-    TerminateLLGS();
+        TerminateLLGS();
+    }
 }
 
 #if defined (__APPLE__)
Index: lldb/trunk/tools/lldb-server/lldb-server.cpp
===================================================================
--- lldb/trunk/tools/lldb-server/lldb-server.cpp
+++ lldb/trunk/tools/lldb-server/lldb-server.cpp
@@ -7,7 +7,7 @@
 //
 //===----------------------------------------------------------------------===//
 
-#include "lldb/lldb-private.h"
+#include "lldb/Core/Debugger.h"
 
 #include <stdio.h>
 #include <stdlib.h>
@@ -29,14 +29,13 @@
 static void
 initialize ()
 {
-    lldb_private::InitializeForLLGS();
+    lldb_private::Debugger::InitializeForLLGS(NULL);
 }
 
 static void
 terminate ()
 {
-    lldb_private::WillTerminate();
-    lldb_private::TerminateLLGS();
+    lldb_private::Debugger::Terminate();
 }
 
 //----------------------------------------------------------------------