diff --git a/lib/bcc/Script.h b/lib/bcc/Script.h
index 874507c..a22bd74 100644
--- a/lib/bcc/Script.h
+++ b/lib/bcc/Script.h
@@ -21,25 +21,19 @@
 
 #include <bcc/bcc.h>
 
+namespace llvm {
+  class Module;
+}
+
 namespace bcc {
 
   class Script {
   private:
     BCCenum mErrorCode;
 
+    Compiler mCompiler;
+
   public:
-    //////////////////////////////////////////////////////////////////////////
-    // Part I. Compiler
-    //////////////////////////////////////////////////////////////////////////
-    Compiler compiler;
-
-    void registerSymbolCallback(BCCSymbolLookupFn pFn, BCCvoid *pContext) {
-      compiler.registerSymbolCallback(pFn, pContext);
-    }
-
-    //////////////////////////////////////////////////////////////////////////
-    // Part II. Logistics & Error handling
-    //////////////////////////////////////////////////////////////////////////
     Script() {
       mErrorCode = BCC_NO_ERROR;
     }
@@ -47,6 +41,84 @@
     ~Script() {
     }
 
+    //////////////////////////////////////////////////////////////////////////
+    // Part I. Compiler
+    //////////////////////////////////////////////////////////////////////////
+
+    int readBC(const char *bitcode,
+               size_t bitcodeSize,
+               long bitcodeFileModTime,
+               long bitcodeFileCRC32,
+               const BCCchar *resName,
+               const BCCchar *cacheDir) {
+      return mCompiler.readBC(bitcode, bitcodeSize,
+                              bitcodeFileModTime, bitcodeFileCRC32,
+                              resName, cacheDir);
+    }
+
+    int linkBC(const char *bitcode, size_t bitcodeSize) {
+      return mCompiler.linkBC(bitcode, bitcodeSize);
+    }
+
+    int loadCacheFile() {
+      return mCompiler.loadCacheFile();
+    }
+
+    int compile() {
+      return mCompiler.compile();
+    }
+
+    char const *getCompilerErrorMessage() {
+      return mCompiler.getErrorMessage();
+    }
+
+    void *lookup(const char *name) {
+      return mCompiler.lookup(name);
+    }
+
+    void getExportVars(BCCsizei *actualVarCount,
+                       BCCsizei maxVarCount,
+                       BCCvoid **vars) {
+      mCompiler.getExportVars(actualVarCount, maxVarCount, vars);
+    }
+
+    void getExportFuncs(BCCsizei *actualFuncCount,
+                        BCCsizei maxFuncCount,
+                        BCCvoid **funcs) {
+      mCompiler.getExportFuncs(actualFuncCount, maxFuncCount, funcs);
+    }
+
+    void getPragmas(BCCsizei *actualStringCount,
+                    BCCsizei maxStringCount,
+                    BCCchar **strings) {
+      mCompiler.getPragmas(actualStringCount, maxStringCount, strings);
+    }
+
+    void getFunctions(BCCsizei *actualFunctionCount,
+                      BCCsizei maxFunctionCount,
+                      BCCchar **functions) {
+      mCompiler.getFunctions(actualFunctionCount, maxFunctionCount, functions);
+    }
+
+    void getFunctionBinary(BCCchar *function,
+                           BCCvoid **base,
+                           BCCsizei *length) {
+      mCompiler.getFunctionBinary(function, base, length);
+    }
+
+    void registerSymbolCallback(BCCSymbolLookupFn pFn, BCCvoid *pContext) {
+      mCompiler.registerSymbolCallback(pFn, pContext);
+    }
+
+    int readModule(llvm::Module *module) {
+      return mCompiler.readModule(module);
+    }
+
+
+    //////////////////////////////////////////////////////////////////////////
+    // Error handling
+    //////////////////////////////////////////////////////////////////////////
+
     void setError(BCCenum error) {
       if (mErrorCode == BCC_NO_ERROR && error != BCC_NO_ERROR) {
         mErrorCode = error;
diff --git a/lib/bcc/bcc.cpp b/lib/bcc/bcc.cpp
index 97d53f3..7bd4633 100644
--- a/lib/bcc/bcc.cpp
+++ b/lib/bcc/bcc.cpp
@@ -75,7 +75,7 @@
 
 extern "C" int bccReadModule(BCCscript *script, BCCvoid *module) {
   BCC_FUNC_LOGGER();
-  return script->compiler.readModule(reinterpret_cast<llvm::Module*>(module));
+  return script->readModule(reinterpret_cast<llvm::Module*>(module));
 }
 
 extern "C" int bccReadBC(BCCscript *script,
@@ -86,21 +86,21 @@
                          const BCCchar *resName,
                          const BCCchar *cacheDir) {
   BCC_FUNC_LOGGER();
-  return script->compiler.readBC(bitcode, bitcodeSize,
-                                 bitcodeFileModTime, bitcodeFileCRC32,
-                                 resName, cacheDir);
+  return script->readBC(bitcode, bitcodeSize,
+                        bitcodeFileModTime, bitcodeFileCRC32,
+                        resName, cacheDir);
 }
 
 extern "C" void bccLinkBC(BCCscript *script,
                           const BCCchar *bitcode,
                           BCCint size) {
   BCC_FUNC_LOGGER();
-  script->compiler.linkBC(bitcode, size);
+  script->linkBC(bitcode, size);
 }
 
 extern "C" int bccLoadBinary(BCCscript *script) {
   BCC_FUNC_LOGGER();
-  int result = script->compiler.loadCacheFile();
+  int result = script->loadCacheFile();
 
 #if defined(USE_DISASSEMBLER_FILE)
   LOGI("[LoadBinary] result=%d", result);
@@ -118,7 +118,7 @@
   android::StopWatch compileTimer("RenderScript compile time");
 #endif
 
-  int result = script->compiler.compile();
+  int result = script->compile();
   if (result)
     script->setError(BCC_INVALID_OPERATION);
 
@@ -130,7 +130,7 @@
                                     BCCsizei *length,
                                     BCCchar *infoLog) {
   BCC_FUNC_LOGGER();
-  char const *message = script->compiler.getErrorMessage();
+  char const *message = script->getCompilerErrorMessage();
   int messageLength = strlen(message) + 1;
   if (length)
     *length = messageLength;
@@ -149,7 +149,7 @@
                                   const BCCchar *name,
                                   BCCvoid **address) {
   BCC_FUNC_LOGGER();
-  void *value = script->compiler.lookup(name);
+  void *value = script->lookup(name);
   if (value) {
     *address = value;
 #if defined(USE_DISASSEMBLER_FILE)
@@ -165,7 +165,7 @@
                                  BCCsizei maxVarCount,
                                  BCCvoid **vars) {
   BCC_FUNC_LOGGER();
-  script->compiler.getExportVars(actualVarCount, maxVarCount, vars);
+  script->getExportVars(actualVarCount, maxVarCount, vars);
 
 #if defined(USE_DISASSEMBLER_FILE)
   int i;
@@ -184,7 +184,7 @@
                                   BCCsizei maxFuncCount,
                                   BCCvoid **funcs) {
   BCC_FUNC_LOGGER();
-  script->compiler.getExportFuncs(actualFuncCount, maxFuncCount, funcs);
+  script->getExportFuncs(actualFuncCount, maxFuncCount, funcs);
 
 #if defined(USE_DISASSEMBLER_FILE)
   int i;
@@ -203,7 +203,7 @@
                               BCCsizei maxStringCount,
                               BCCchar **strings) {
   BCC_FUNC_LOGGER();
-  script->compiler.getPragmas(actualStringCount, maxStringCount, strings);
+  script->getPragmas(actualStringCount, maxStringCount, strings);
 
 #if defined(USE_DISASSEMBLER_FILE)
   int i;
@@ -219,7 +219,7 @@
                                 BCCsizei maxFunctionCount,
                                 BCCchar **functions) {
   BCC_FUNC_LOGGER();
-  script->compiler.getFunctions(actualFunctionCount,
+  script->getFunctions(actualFunctionCount,
                                 maxFunctionCount,
                                 functions);
 }
@@ -229,5 +229,5 @@
                                      BCCvoid **base,
                                      BCCsizei *length) {
   BCC_FUNC_LOGGER();
-  script->compiler.getFunctionBinary(function, base, length);
+  script->getFunctionBinary(function, base, length);
 }
