diff --git a/lldb/source/Expression/ExpressionSourceCode.cpp b/lldb/source/Expression/ExpressionSourceCode.cpp
index b3f335f..9a42510 100644
--- a/lldb/source/Expression/ExpressionSourceCode.cpp
+++ b/lldb/source/Expression/ExpressionSourceCode.cpp
@@ -10,24 +10,33 @@
 #include "lldb/Expression/ExpressionSourceCode.h"
 
 #include "lldb/Core/StreamString.h"
+#include "lldb/Expression/ClangModulesDeclVendor.h"
+#include "lldb/Expression/ClangPersistentVariables.h"
+#include "lldb/Symbol/Block.h"
 #include "lldb/Target/ExecutionContext.h"
 #include "lldb/Target/Platform.h"
+#include "lldb/Target/StackFrame.h"
 #include "lldb/Target/Target.h"
 
 using namespace lldb_private;
 
 const char *
 ExpressionSourceCode::g_expression_prefix = R"(
-#undef NULL
-#undef Nil
-#undef nil
-#undef YES
-#undef NO
+#ifndef NULL
 #define NULL (__null)
+#endif
+#ifndef Nil
 #define Nil (__null)
+#endif
+#ifndef nil
 #define nil (__null)
+#endif
+#ifndef YES
 #define YES ((BOOL)1)
+#endif
+#ifndef NO
 #define NO ((BOOL)0)
+#endif
 typedef __INT8_TYPE__ int8_t;
 typedef __UINT8_TYPE__ uint8_t;
 typedef __INT16_TYPE__ int16_t;
@@ -51,7 +60,7 @@
 bool ExpressionSourceCode::GetText (std::string &text, lldb::LanguageType wrapping_language, bool const_object, bool static_method, ExecutionContext &exe_ctx) const
 {
     const char *target_specific_defines = "typedef signed char BOOL;\n";
-    static ConstString g_platform_ios_simulator ("ios-simulator");
+    std::string module_macros;
     
     if (Target *target = exe_ctx.GetTargetPtr())
     {
@@ -63,12 +72,51 @@
         {
             if (lldb::PlatformSP platform_sp = target->GetPlatform())
             {
+                static ConstString g_platform_ios_simulator ("ios-simulator");
                 if (platform_sp->GetPluginName() == g_platform_ios_simulator)
                 {
                     target_specific_defines = "typedef bool BOOL;\n";
                 }
             }
         }
+        
+        if (ClangModulesDeclVendor *decl_vendor = target->GetClangModulesDeclVendor())
+        {
+            const ClangModulesDeclVendor::ModuleVector &hand_imported_modules = target->GetPersistentVariables().GetHandLoadedClangModules();
+            ClangModulesDeclVendor::ModuleVector modules_for_macros;
+            
+            for (ClangModulesDeclVendor::ModuleID module : hand_imported_modules)
+            {
+                modules_for_macros.push_back(module);
+            }
+            
+            if (target->GetEnableAutoImportClangModules())
+            {
+                if (StackFrame *frame = exe_ctx.GetFramePtr())
+                {
+                    if (Block *block = frame->GetFrameBlock())
+                    {
+                        SymbolContext sc;
+                        
+                        block->CalculateSymbolContext(&sc);
+                        
+                        if (sc.comp_unit)
+                        {
+                            StreamString error_stream;
+                            
+                            decl_vendor->AddModulesForCompileUnit(*sc.comp_unit, modules_for_macros, error_stream);
+                        }
+                    }
+                }
+            }
+            
+            decl_vendor->ForEachMacro(modules_for_macros, [&module_macros] (const std::string &expansion) -> bool {
+                module_macros.append(expansion);
+                module_macros.append("\n");
+                return false;
+            });
+        }
+
     }
     
     if (m_wrap)
@@ -85,37 +133,31 @@
         
         StreamString wrap_stream;
         
+        wrap_stream.Printf("%s\n%s\n%s\n%s\n",
+                           module_macros.c_str(),
+                           g_expression_prefix,
+                           target_specific_defines,
+                           m_prefix.c_str());
+        
         switch (wrapping_language) 
         {
         default:
             break;
         case lldb::eLanguageTypeC:
-            wrap_stream.Printf("%s                             \n"
-                               "%s                             \n"
-                               "%s                             \n"
-                               "void                           \n"
+            wrap_stream.Printf("void                           \n"
                                "%s(void *$__lldb_arg)          \n"
                                "{                              \n"
                                "    %s;                        \n" 
                                "}                              \n",
-                               g_expression_prefix,
-                               target_specific_defines,
-                               m_prefix.c_str(),
                                m_name.c_str(),
                                m_body.c_str());
             break;
         case lldb::eLanguageTypeC_plus_plus:
-            wrap_stream.Printf("%s                                     \n"
-                               "%s                                     \n"
-                               "%s                                     \n"
-                               "void                                   \n"
+            wrap_stream.Printf("void                                   \n"
                                "$__lldb_class::%s(void *$__lldb_arg) %s\n"
                                "{                                      \n"
                                "    %s;                                \n" 
                                "}                                      \n",
-                               g_expression_prefix,
-                               target_specific_defines,
-                               m_prefix.c_str(),
                                m_name.c_str(),
                                (const_object ? "const" : ""),
                                m_body.c_str());
@@ -123,10 +165,7 @@
         case lldb::eLanguageTypeObjC:
             if (static_method)
             {
-                wrap_stream.Printf("%s                                                      \n"
-                                   "%s                                                      \n"
-                                   "%s                                                      \n"
-                                   "@interface $__lldb_objc_class ($__lldb_category)        \n"
+                wrap_stream.Printf("@interface $__lldb_objc_class ($__lldb_category)        \n"
                                    "+(void)%s:(void *)$__lldb_arg;                          \n"
                                    "@end                                                    \n"
                                    "@implementation $__lldb_objc_class ($__lldb_category)   \n"
@@ -135,19 +174,13 @@
                                    "    %s;                                                 \n"
                                    "}                                                       \n"
                                    "@end                                                    \n",
-                                   g_expression_prefix,
-                                   target_specific_defines,
-                                   m_prefix.c_str(),
                                    m_name.c_str(),
                                    m_name.c_str(),
                                    m_body.c_str());
             }
             else
             {
-                wrap_stream.Printf("%s                                                     \n"
-                                   "%s                                                     \n"
-                                   "%s                                                     \n"
-                                   "@interface $__lldb_objc_class ($__lldb_category)       \n"
+                wrap_stream.Printf("@interface $__lldb_objc_class ($__lldb_category)       \n"
                                    "-(void)%s:(void *)$__lldb_arg;                         \n"
                                    "@end                                                   \n"
                                    "@implementation $__lldb_objc_class ($__lldb_category)  \n"
@@ -156,9 +189,6 @@
                                    "    %s;                                                \n"
                                    "}                                                      \n"
                                    "@end                                                   \n",
-                                   g_expression_prefix,
-                                   target_specific_defines,
-                                   m_prefix.c_str(),
                                    m_name.c_str(),
                                    m_name.c_str(),
                                    m_body.c_str());
