diff --git a/README.html b/README.html
index 56edd02..db49a3a 100644
--- a/README.html
+++ b/README.html
@@ -355,20 +355,23 @@
 <li><strong>bccLinkBC</strong> - Set the library bitcode for linking</li>
 <li><strong>bccPrepareExecutable</strong> - Create the in-memory executable by either
 just-in-time compilation or cache loading</li>
-<li><strong>bccDeleteScript</strong> - Destroy bcc script and release the resources</li>
-<li><strong>bccGetError</strong> - Get the error code</li>
-<li><strong>bccGetScriptInfoLog</strong> - <em>deprecated</em> - Don't use this</li>
+<li><strong>bccGetFuncAddr</strong> - Get the entry address of the function</li>
+<li><strong>bccDisposeScript</strong> - Destroy bcc script and release the resources</li>
+<li><strong>bccGetError</strong> - <em>deprecated</em> - Don't use this</li>
 </ul>
 <p><strong>Reflection:</strong></p>
 <ul class="simple">
-<li><strong>bccGetExportVars</strong> - Get the addresses of exported variables</li>
-<li><strong>bccGetExportFuncs</strong> - Get the addresses of exported functions</li>
-<li><strong>bccGetPragmas</strong> - Get the pragmas</li>
+<li><strong>bccGetExportVarCount</strong> - Get the count of exported variables</li>
+<li><strong>bccGetExportVarList</strong> - Get the addresses of exported variables</li>
+<li><strong>bccGetExportFuncCount</strong> - Get the count of exported functions</li>
+<li><strong>bccGetExportFuncList</strong> - Get the addresses of exported functions</li>
+<li><strong>bccGetPragmaCount</strong> - Get the count of pragmas</li>
+<li><strong>bccGetPragmaList</strong> - Get the pragmas</li>
 </ul>
 <p><strong>Debug:</strong></p>
 <ul class="simple">
-<li><strong>bccGetFunctions</strong> - Get the function name list</li>
-<li><strong>bccGetFunctionBinary</strong> - Get the address and the size of a function binary</li>
+<li><strong>bccGetFuncCount</strong> - Get the count of functions (including non-exported)</li>
+<li><strong>bccGetFuncInfoList</strong> - Get the function information (name, base, size)</li>
 </ul>
 </div>
 <div class="section" id="cache-file-format">
diff --git a/README.rst b/README.rst
index 887f0ee..44f4663 100644
--- a/README.rst
+++ b/README.rst
@@ -64,27 +64,33 @@
 * **bccPrepareExecutable** - Create the in-memory executable by either
   just-in-time compilation or cache loading
 
-* **bccDeleteScript** - Destroy bcc script and release the resources
+* **bccGetFuncAddr** - Get the entry address of the function
 
-* **bccGetError** - Get the error code
+* **bccDisposeScript** - Destroy bcc script and release the resources
 
-* **bccGetScriptInfoLog** - *deprecated* - Don't use this
+* **bccGetError** - *deprecated* - Don't use this
 
 
 **Reflection:**
 
-* **bccGetExportVars** - Get the addresses of exported variables
+* **bccGetExportVarCount** - Get the count of exported variables
 
-* **bccGetExportFuncs** - Get the addresses of exported functions
+* **bccGetExportVarList** - Get the addresses of exported variables
 
-* **bccGetPragmas** - Get the pragmas
+* **bccGetExportFuncCount** - Get the count of exported functions
+
+* **bccGetExportFuncList** - Get the addresses of exported functions
+
+* **bccGetPragmaCount** - Get the count of pragmas
+
+* **bccGetPragmaList** - Get the pragmas
 
 
 **Debug:**
 
-* **bccGetFunctions** - Get the function name list
+* **bccGetFuncCount** - Get the count of functions (including non-exported)
 
-* **bccGetFunctionBinary** - Get the address and the size of a function binary
+* **bccGetFuncInfoList** - Get the function information (name, base, size)
 
 
 
diff --git a/include/bcc/bcc.h b/include/bcc/bcc.h
index bc05757..299e193 100644
--- a/include/bcc/bcc.h
+++ b/include/bcc/bcc.h
@@ -17,116 +17,127 @@
 #ifndef ANDROID_BCC_BCC_H
 #define ANDROID_BCC_BCC_H
 
-#include <stdint.h>
-#include <sys/types.h>
+#include <stddef.h>
 
-typedef char                        BCCchar;
-typedef int32_t                     BCCint;
-typedef uint32_t                    BCCuint;
-typedef ssize_t                     BCCsizei;
-typedef unsigned int                BCCenum;
-typedef void                        BCCvoid;
+/*-------------------------------------------------------------------------*/
+
+/* libbcc script opaque type */
+typedef struct BCCOpaqueScript *BCCScriptRef;
+
+
+/* Function information struct */
+struct BCCFuncInfo {
+  char const *name;
+  void *addr;
+  size_t size;
+};
 
 #if !defined(__cplusplus)
-
-typedef struct BCCscript            BCCscript;
-
-#else
-
-namespace bcc {
-  class Script;
-}
-
-typedef bcc::Script                 BCCscript;
-
+typedef struct BCCFuncInfo BCCFuncInfo;
 #endif
 
-#define BCC_NO_ERROR                0x0000
-#define BCC_INVALID_ENUM            0x0500
-#define BCC_INVALID_OPERATION       0x0502
-#define BCC_INVALID_VALUE           0x0501
-#define BCC_OUT_OF_MEMORY           0x0505
 
-#define BCC_COMPILE_STATUS          0x8B81
-#define BCC_INFO_LOG_LENGTH         0x8B84
+/* Symbol lookup function type */
+typedef void *(*BCCSymbolLookupFn)(void *context, char const *symbolName);
 
 
-// ----------------------------------------------------------------------------
+/* llvm::Module (see <llvm>/include/llvm-c/Core.h for details) */
+typedef struct LLVMOpaqueModule *LLVMModuleRef;
+
+
+/*-------------------------------------------------------------------------*/
+
+
+#define BCC_NO_ERROR          0x0000
+#define BCC_INVALID_ENUM      0x0500
+#define BCC_INVALID_OPERATION 0x0502
+#define BCC_INVALID_VALUE     0x0501
+#define BCC_OUT_OF_MEMORY     0x0505
+
+
+/*-------------------------------------------------------------------------*/
+
 
 #ifdef __cplusplus
 extern "C" {
 #endif
 
-BCCscript *bccCreateScript();
+BCCScriptRef bccCreateScript();
 
-void bccDeleteScript(BCCscript *script);
+void bccDisposeScript(BCCScriptRef script);
 
-typedef BCCvoid *(*BCCSymbolLookupFn)(BCCvoid *pContext, const BCCchar *name);
-
-void bccRegisterSymbolCallback(BCCscript *script,
+void bccRegisterSymbolCallback(BCCScriptRef script,
                                BCCSymbolLookupFn pFn,
-                               BCCvoid *pContext);
+                               void *pContext);
 
-BCCenum bccGetError( BCCscript *script );
+int bccGetError(BCCScriptRef script); /* deprecated */
 
-int bccReadBC(BCCscript *script,
-              const BCCchar *bitcode,
-              BCCint bitcodeSize,
-              long __DONT_USE_PARAM_1,
-              long __DONT_USE_PARAM_2,
-              const BCCchar *resName,
-              const BCCchar *cacheDir);
 
-// Interface for llvm::Module input. @module should be a valid llvm::Module
-// instance.
-int bccReadModule(BCCscript *script,
-                  BCCvoid *module);
 
-int bccLinkBC(BCCscript *script,
-              const BCCchar *bitcode,
-              BCCint size);
+int bccReadBC(BCCScriptRef script,
+              char const *resName,
+              char const *bitcode,
+              size_t bitcodeSize,
+              unsigned long flags);
 
-int bccPrepareExecutable(BCCscript *script);
+int bccReadModule(BCCScriptRef script,
+                  char const *resName,
+                  LLVMModuleRef module,
+                  unsigned long flags);
 
-void bccGetScriptInfoLog(BCCscript *script,
-                         BCCsizei maxLength,
-                         BCCsizei *length,
-                         BCCchar *infoLog);
+int bccLinkBC(BCCScriptRef script,
+              char const *resName,
+              char const *bitcode,
+              size_t bitcodeSize,
+              unsigned long flags);
 
-void bccGetScriptLabel(BCCscript *script,
-                       const BCCchar *name,
-                       BCCvoid **address);
+int bccPrepareExecutable(BCCScriptRef script,
+                         char const *cachePath,
+                         unsigned long flags);
 
-void bccGetExportVars(BCCscript *script,
-                      BCCsizei *actualVarCount,
-                      BCCsizei maxVarCount,
-                      BCCvoid **vars);
+void *bccGetFuncAddr(BCCScriptRef script, char const *funcname);
 
-void bccGetExportFuncs(BCCscript *script,
-                       BCCsizei *actualFuncCount,
-                       BCCsizei maxFuncCount,
-                       BCCvoid **funcs);
 
-void bccGetPragmas(BCCscript *script,
-                   BCCsizei *actualStringCount,
-                   BCCsizei maxStringCount,
-                   BCCchar **strings);
 
-// Below two functions are for debugging
-void bccGetFunctions(BCCscript *script,
-                     BCCsizei *actualFunctionCount,
-                     BCCsizei maxFunctionCount,
-                     BCCchar **functions);
+size_t bccGetExportVarCount(BCCScriptRef script);
 
-void bccGetFunctionBinary(BCCscript *script,
-                          BCCchar *function,
-                          BCCvoid **base,
-                          BCCsizei *length);
+void bccGetExportVarList(BCCScriptRef script,
+                         size_t varListSize,
+                         void **varList);
+
+size_t bccGetExportFuncCount(BCCScriptRef script);
+
+void bccGetExportFuncList(BCCScriptRef script,
+                          size_t funcListSize,
+                          void **funcList);
+
+size_t bccGetPragmaCount(BCCScriptRef script);
+
+void bccGetPragmaList(BCCScriptRef script,
+                      size_t pragmaListSize,
+                      char const **keyList,
+                      char const **valueList);
+
+size_t bccGetFuncCount(BCCScriptRef script);
+
+
+
+void bccGetFuncInfoList(BCCScriptRef script,
+                        size_t funcInfoListSize,
+                        BCCFuncInfo *funcInfoList);
 
 #ifdef __cplusplus
 };
 #endif
 
-// ----------------------------------------------------------------------------
+
+/*-------------------------------------------------------------------------*/
+
+
+/* libbcc library build time */
+extern char const libbcc_build_time[24];
+
+
+/*-------------------------------------------------------------------------*/
 
 #endif
diff --git a/include/bcc/bcc_cache.h b/include/bcc/bcc_cache.h
index 6b83cbf..137d4cc 100644
--- a/include/bcc/bcc_cache.h
+++ b/include/bcc/bcc_cache.h
@@ -20,8 +20,6 @@
 #include <stdint.h>
 #include <sys/types.h>
 
-extern char const libbcc_build_time[24];
-
 /* BCC Cache File Magic Word */
 #define OBCC_MAGIC "\0bcc"
 
diff --git a/lib/bcc/CacheWriter.cpp b/lib/bcc/CacheWriter.cpp
index a0b5da2..6d3a104 100644
--- a/lib/bcc/CacheWriter.cpp
+++ b/lib/bcc/CacheWriter.cpp
@@ -162,21 +162,16 @@
   tab->count = static_cast<size_t>(funcCount);
 
   // Get the function informations
-  vector<char const *> funcNameList(funcCount);
-  mpOwner->getFuncNameList(funcCount, &*funcNameList.begin());
+  vector<FuncInfo> funcInfoList(funcCount);
+  mpOwner->getFuncInfoList(funcCount, &*funcInfoList.begin());
 
   for (size_t i = 0; i < funcCount; ++i) {
-    char const *funcName = funcNameList[i];
-    size_t funcNameLen = strlen(funcName);
+    FuncInfo *info = &funcInfoList[i];
+    OBCC_FuncInfo *outputInfo = &tab->table[i];
 
-    void *funcAddr = NULL;
-    size_t funcBinarySize = 0;
-    mpOwner->getFuncBinary(funcName, &funcAddr, &funcBinarySize);
-
-    OBCC_FuncInfo *funcInfo = &tab->table[i];
-    funcInfo->name_strp_index = addString(funcName, funcNameLen);
-    funcInfo->cached_addr = funcAddr;
-    funcInfo->size = static_cast<size_t>(funcBinarySize);
+    outputInfo->name_strp_index = addString(info->name, strlen(info->name));
+    outputInfo->cached_addr = info->addr;
+    outputInfo->size = info->size;
   }
 
   return true;
diff --git a/lib/bcc/CodeEmitter.cpp b/lib/bcc/CodeEmitter.cpp
index f2eed18..29e0934 100644
--- a/lib/bcc/CodeEmitter.cpp
+++ b/lib/bcc/CodeEmitter.cpp
@@ -17,12 +17,12 @@
 #include "CodeEmitter.h"
 
 #include "CodeMemoryManager.h"
-#include "EmittedFuncInfo.h"
 #include "Runtime.h"
 #include "ScriptCompiled.h"
 
 #include <bcc/bcc.h>
 #include <bcc/bcc_cache.h>
+#include "bcc_internal.h"
 
 #include "llvm/ADT/APFloat.h"
 #include "llvm/ADT/APInt.h"
@@ -1269,9 +1269,12 @@
       mpMemMgr->startFunctionBody(F.getFunction(), ActualSize);
   BufferEnd = BufferBegin + ActualSize;
 
-  if (mpCurEmitFunction == NULL)
-    mpCurEmitFunction = new EmittedFuncInfo();
-  mpCurEmitFunction->FunctionBody = BufferBegin;
+  if (mpCurEmitFunction == NULL) {
+    mpCurEmitFunction = new FuncInfo(); // TODO(all): Allocation check!
+    mpCurEmitFunction->name = NULL;
+    mpCurEmitFunction->addr = NULL;
+    mpCurEmitFunction->size = 0;
+  }
 
   // Ensure the constant pool/jump table info is at least 4-byte aligned.
   emitAlignment(16);
@@ -1285,7 +1288,7 @@
 
   UpdateGlobalMapping(F.getFunction(), CurBufferPtr);
 
-  mpCurEmitFunction->Code = CurBufferPtr;
+  mpCurEmitFunction->addr = CurBufferPtr;
 
   mMBBLocations.clear();
 }
@@ -1379,7 +1382,7 @@
     return false;
 
   // Now that we've succeeded in emitting the function.
-  mpCurEmitFunction->Size = CurBufferPtr - BufferBegin;
+  mpCurEmitFunction->size = CurBufferPtr - BufferBegin;
   BufferBegin = CurBufferPtr = 0;
 
   if (F.getFunction()->hasName()) {
diff --git a/lib/bcc/CodeEmitter.h b/lib/bcc/CodeEmitter.h
index 8e1bb99..289c954 100644
--- a/lib/bcc/CodeEmitter.h
+++ b/lib/bcc/CodeEmitter.h
@@ -16,6 +16,7 @@
 
 #include <bcc/bcc.h>
 #include <bcc/bcc_cache.h>
+#include "bcc_internal.h"
 
 #include "llvm/ADT/DenseMap.h"
 #include "llvm/ADT/SmallVector.h"
@@ -57,7 +58,6 @@
 
 namespace bcc {
   class CodeMemoryManager;
-  class EmittedFuncInfo;
   class ScriptCompiled;
 
   class CodeEmitter : public llvm::JITCodeEmitter {
@@ -88,7 +88,7 @@
     const llvm::TargetData *mpTD;
 
 
-    EmittedFuncInfo *mpCurEmitFunction;
+    FuncInfo *mpCurEmitFunction;
 
     GlobalAddressMapTy mGlobalAddressMap;
 
@@ -171,7 +171,7 @@
     }
 #endif
 
-    void registerSymbolCallback(BCCSymbolLookupFn pFn, BCCvoid *pContext) {
+    void registerSymbolCallback(BCCSymbolLookupFn pFn, void *pContext) {
       mpSymbolLookupFn = pFn;
       mpSymbolLookupContext = pContext;
     }
diff --git a/lib/bcc/Compiler.cpp b/lib/bcc/Compiler.cpp
index 77813c8..188a0ff 100644
--- a/lib/bcc/Compiler.cpp
+++ b/lib/bcc/Compiler.cpp
@@ -283,14 +283,11 @@
 // Compiler::readBC
 // Parameters:
 //
-int Compiler::readBC(const char *bitcode,
-                     size_t bitcodeSize,
-                     const BCCchar *resName /* Deprecated */,
-                     const BCCchar *cacheDir /* Deprecated */) {
+int Compiler::readBC(const char *bitcode, size_t bitcodeSize) {
   llvm::OwningPtr<llvm::MemoryBuffer> MEM;
 
   if (bitcode == NULL || bitcodeSize <= 0)
-    return 0;
+    return 1;
 
   // Package input to object MemoryBuffer
   MEM.reset(llvm::MemoryBuffer::getMemBuffer(
@@ -312,7 +309,7 @@
   llvm::OwningPtr<llvm::MemoryBuffer> MEM;
 
   if (bitcode == NULL || bitcodeSize <= 0) {
-    LOGE("Invalid bitcode for linkBC: bitcode=%p, size=%lu.\n", bitcode, (unsigned long)bitcodeSize);
+    LOGE("Invalid bitcode for linkBC\n");
     return 1;
   }
 
diff --git a/lib/bcc/Compiler.h b/lib/bcc/Compiler.h
index 450ccea..5f3961c 100644
--- a/lib/bcc/Compiler.h
+++ b/lib/bcc/Compiler.h
@@ -100,8 +100,7 @@
 
     static void GlobalInitialization();
 
-    // interface for BCCscript::registerSymbolCallback()
-    void registerSymbolCallback(BCCSymbolLookupFn pFn, BCCvoid *pContext) {
+    void registerSymbolCallback(BCCSymbolLookupFn pFn, void *pContext) {
       mpSymbolLookupFn = pFn;
       mpSymbolLookupContext = pContext;
     }
@@ -115,10 +114,7 @@
       return hasError();
     }
 
-    int readBC(const char *bitcode,
-               size_t bitcodeSize,
-               const BCCchar *resName,
-               const BCCchar *cacheDir);
+    int readBC(const char *bitcode, size_t bitcodeSize);
 
     int linkBC(const char *bitcode, size_t bitcodeSize);
 
diff --git a/lib/bcc/EmittedFuncInfo.h b/lib/bcc/EmittedFuncInfo.h
deleted file mode 100644
index b0fdb06..0000000
--- a/lib/bcc/EmittedFuncInfo.h
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Copyright 2010, The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef BCC_EMITTEDFUNCINFO_H
-#define BCC_EMITTEDFUNCINFO_H
-
-#include <stddef.h>
-
-namespace bcc {
-
-  class EmittedFuncInfo {
-  public:
-    // Beginning of the function's allocation.
-    void *FunctionBody;
-
-    // The address the function's code actually starts at.
-    void *Code;
-
-    // The size of the function code
-    int Size;
-
-    EmittedFuncInfo() : FunctionBody(NULL), Code(NULL) {
-    }
-
-  };
-
-} // namespace bcc
-
-#endif // BCC_EMITTEDFUNCINFO_H
diff --git a/lib/bcc/Script.cpp b/lib/bcc/Script.cpp
index 735b2f7..760dfe6 100644
--- a/lib/bcc/Script.cpp
+++ b/lib/bcc/Script.cpp
@@ -35,69 +35,10 @@
 
 namespace {
 
-// Input: cacheDir
-// Input: resName
-// Input: extName
-//
-// Note: cacheFile = resName + extName
-//
-// Output: Returns cachePath == cacheDir + cacheFile
-char *genCacheFileName(const char *cacheDir,
-                       const char *resName,
-                       const char *extName) {
-  char cachePath[512];
-  char cacheFile[sizeof(cachePath)];
-  const size_t kBufLen = sizeof(cachePath) - 1;
-
-  cacheFile[0] = '\0';
-  // Note: resName today is usually something like
-  //       "/com.android.fountain:raw/fountain"
-  if (resName[0] != '/') {
-    // Get the absolute path of the raw/***.bc file.
-
-    // Generate the absolute path.  This doesn't do everything it
-    // should, e.g. if resName is "./out/whatever" it doesn't crunch
-    // the leading "./" out because this if-block is not triggered,
-    // but it'll make do.
-    //
-    if (getcwd(cacheFile, kBufLen) == NULL) {
-      LOGE("Can't get CWD while opening raw/***.bc file\n");
-      return NULL;
-    }
-    // Append "/" at the end of cacheFile so far.
-    strncat(cacheFile, "/", kBufLen);
-  }
-
-  // cacheFile = resName + extName
-  //
-  strncat(cacheFile, resName, kBufLen);
-  if (extName != NULL) {
-    // TODO(srhines): strncat() is a bit dangerous
-    strncat(cacheFile, extName, kBufLen);
-  }
-
-  // Turn the path into a flat filename by replacing
-  // any slashes after the first one with '@' characters.
-  char *cp = cacheFile + 1;
-  while (*cp != '\0') {
-    if (*cp == '/') {
-      *cp = '@';
-    }
-    cp++;
-  }
-
-  // Tack on the file name for the actual cache file path.
-  strncpy(cachePath, cacheDir, kBufLen);
-  strncat(cachePath, cacheFile, kBufLen);
-
-  LOGV("Cache file for '%s' '%s' is '%s'\n", resName, extName, cachePath);
-  return strdup(cachePath);
-}
-
 bool getBooleanProp(const char *str) {
-    char buf[PROPERTY_VALUE_MAX];
-    property_get(str, buf, "0");
-    return strcmp(buf, "0") != 0;
+  char buf[PROPERTY_VALUE_MAX];
+  property_get(str, buf, "0");
+  return strcmp(buf, "0") != 0;
 }
 
 } // namespace anonymous
@@ -113,10 +54,10 @@
 }
 
 
-int Script::readBC(const char *bitcode,
+int Script::readBC(char const *resName,
+                   const char *bitcode,
                    size_t bitcodeSize,
-                   const BCCchar *resName,
-                   const BCCchar *cacheDir) {
+                   unsigned long flags) {
   if (mStatus != ScriptStatus::Unknown) {
     mErrorCode = BCC_INVALID_OPERATION;
     LOGE("Invalid operation: %s\n", __func__);
@@ -126,16 +67,13 @@
   sourceBC = bitcode;
   sourceResName = resName;
   sourceSize = bitcodeSize;
-
-  if (cacheDir && resName) {
-    cacheFile = genCacheFileName(cacheDir, resName, ".oBCC");
-  }
-
   return 0;
 }
 
 
-int Script::readModule(llvm::Module *module) {
+int Script::readModule(char const *resName,
+                       llvm::Module *module,
+                       unsigned long flags) {
   if (mStatus != ScriptStatus::Unknown) {
     mErrorCode = BCC_INVALID_OPERATION;
     LOGE("Invalid operation: %s\n", __func__);
@@ -147,7 +85,10 @@
 }
 
 
-int Script::linkBC(const char *bitcode, size_t bitcodeSize) {
+int Script::linkBC(char const *resName,
+                   const char *bitcode,
+                   size_t bitcodeSize,
+                   unsigned long flags) {
   if (mStatus != ScriptStatus::Unknown) {
     mErrorCode = BCC_INVALID_OPERATION;
     LOGE("Invalid operation: %s\n", __func__);
@@ -161,7 +102,7 @@
 }
 
 
-int Script::prepareExecutable() {
+int Script::prepareExecutable(char const *cachePath, unsigned long flags) {
   if (mStatus != ScriptStatus::Unknown) {
     mErrorCode = BCC_INVALID_OPERATION;
     LOGE("Invalid operation: %s\n", __func__);
@@ -169,7 +110,8 @@
   }
 
   // Load Cache File
-  if (cacheFile && internalLoadCache() == 0) {
+  mCachePath = cachePath;
+  if (cachePath && internalLoadCache() == 0) {
     return 0;
   }
 
@@ -185,21 +127,25 @@
     return 1;
   }
 
-  if (!cacheFile) {
-    // The application developer has not specify resName or cacheDir, so
+  if (!mCachePath) {
+    // The application developer has not specify the cachePath, so
     // we don't know where to open the cache file.
     return 1;
   }
 
+  // If we are going to use the cache file.  We have to calculate sha1sum
+  // first (no matter we can open the file now or not.)
   if (sourceBC) {
-    // If we are going to create cache file.  We have to calculate sha1sum
-    // first (no matter we can open the file now or not.)
     calcSHA1(sourceSHA1, sourceBC, sourceSize);
   }
 
+  //if (libraryBC) {
+  //  calcSHA1(librarySHA1, libraryBC, librarySize);
+  //}
+
   FileHandle file;
 
-  if (file.open(cacheFile, OpenMode::Read) < 0) {
+  if (file.open(mCachePath, OpenMode::Read) < 0) {
     // Unable to open the cache file in read mode.
     return 1;
   }
@@ -217,6 +163,10 @@
     reader.addDependency(BCC_APK_RESOURCE, sourceResName, sourceSHA1);
   }
 
+  //if (libraryBC) {
+  //  reader.addDependency(BCC_APK_RESOURCE, libraryResName, librarySHA1);
+  //}
+
   // Read cache file
   ScriptCached *cached = reader.readCacheFile(&file, this);
   if (!cached) {
@@ -256,24 +206,22 @@
 
   // Setup the source bitcode / module
   if (sourceBC) {
-    if (mCompiled->readBC(sourceBC, sourceSize, sourceResName, 0) != 0) {
+    if (mCompiled->readBC(sourceResName, sourceBC, sourceSize, 0) != 0) {
       LOGE("Unable to readBC, bitcode=%p, size=%lu\n",
            sourceBC, (unsigned long)sourceSize);
       return 1;
     }
-
     LOGI("Load sourceBC\n");
   } else if (sourceModule) {
-    if (mCompiled->readModule(sourceModule) != 0) {
+    if (mCompiled->readModule(NULL, sourceModule, 0) != 0) {
       return 1;
     }
-
     LOGI("Load sourceModule\n");
   }
 
   // Link the source module with the library module
   if (libraryBC) {
-    if (mCompiled->linkBC(libraryBC, librarySize) != 0) {
+    if (mCompiled->linkBC(NULL, libraryBC, librarySize, 0) != 0) {
       return 1;
     }
 
@@ -287,10 +235,10 @@
   }
 
   // TODO(logan): Write the cache out
-  if (cacheFile && !getBooleanProp("debug.bcc.nocache")) {
+  if (mCachePath && !getBooleanProp("debug.bcc.nocache")) {
     FileHandle file;
 
-    if (file.open(cacheFile, OpenMode::Write) >= 0) {
+    if (file.open(mCachePath, OpenMode::Write) >= 0) {
       CacheWriter writer;
 
       // Dependencies
@@ -316,9 +264,9 @@
         file.truncate();
         file.close();
 
-        if (unlink(cacheFile) != 0) {
+        if (unlink(mCachePath) != 0) {
           LOGE("Unable to remove the invalid cache file: %s. (reason: %s)\n",
-               cacheFile, strerror(errno));
+               mCachePath, strerror(errno));
         }
       }
     }
@@ -439,12 +387,12 @@
 }
 
 
-void Script::getFuncNameList(size_t funcNameListSize,
-                             char const **funcNameList) {
+void Script::getFuncInfoList(size_t funcInfoListSize,
+                             FuncInfo *funcInfoList) {
   switch (mStatus) {
 #define DELEGATE(STATUS) \
   case ScriptStatus::STATUS: \
-    m##STATUS->getFuncNameList(funcNameListSize, funcNameList);
+    m##STATUS->getFuncInfoList(funcInfoListSize, funcInfoList);
     break;
 
   DELEGATE(Cached);
@@ -468,27 +416,7 @@
 }
 
 
-void Script::getFuncBinary(char const *funcname,
-                           void **base,
-                           size_t *length) {
-  switch (mStatus) {
-#define DELEGATE(STATUS) \
-  case ScriptStatus::STATUS: \
-    m##STATUS->getFuncBinary(funcname, base, length); \
-    break;
-
-  DELEGATE(Cached);
-  DELEGATE(Compiled);
-#undef DELEGATE
-
-  default:
-    *base = NULL;
-    *length = 0;
-  }
-}
-
-
-void Script::registerSymbolCallback(BCCSymbolLookupFn pFn, BCCvoid *pContext) {
+void Script::registerSymbolCallback(BCCSymbolLookupFn pFn, void *pContext) {
   mpExtSymbolLookupFn = pFn;
   mpExtSymbolLookupFnContext = pContext;
 
diff --git a/lib/bcc/Script.h b/lib/bcc/Script.h
index 7bbb36c..1965828 100644
--- a/lib/bcc/Script.h
+++ b/lib/bcc/Script.h
@@ -18,6 +18,7 @@
 #define BCC_SCRIPT_H
 
 #include <bcc/bcc.h>
+#include "bcc_internal.h"
 
 #include "Compiler.h"
 
@@ -41,7 +42,7 @@
 
   class Script {
   private:
-    BCCenum mErrorCode;
+    int mErrorCode;
 
     ScriptStatus::StatusType mStatus;
 
@@ -50,7 +51,7 @@
       ScriptCached *mCached;
     };
 
-    char *cacheFile;
+    char const *mCachePath;
 
     // ReadBC
     char const *sourceBC;
@@ -67,11 +68,11 @@
 
     // Register Symbol Lookup Function
     BCCSymbolLookupFn mpExtSymbolLookupFn;
-    BCCvoid *mpExtSymbolLookupFnContext;
+    void *mpExtSymbolLookupFnContext;
 
   public:
     Script() : mErrorCode(BCC_NO_ERROR), mStatus(ScriptStatus::Unknown),
-               cacheFile(NULL),
+               mCachePath(NULL),
                sourceBC(NULL), sourceResName(NULL), sourceSize(0),
                sourceModule(NULL), libraryBC(NULL), librarySize(0),
                mpExtSymbolLookupFn(NULL), mpExtSymbolLookupFnContext(NULL) {
@@ -80,16 +81,21 @@
 
     ~Script();
 
-    int readBC(const char *bitcode,
+    int readBC(char const *resName,
+               const char *bitcode,
                size_t bitcodeSize,
-               const BCCchar *resName,
-               const BCCchar *cacheDir);
+               unsigned long flags);
 
-    int readModule(llvm::Module *module);
+    int readModule(char const *resName,
+                   llvm::Module *module,
+                   unsigned long flags);
 
-    int linkBC(const char *bitcode, size_t bitcodeSize);
+    int linkBC(char const *resName,
+               const char *bitcode,
+               size_t bitcodeSize,
+               unsigned long flags);
 
-    int prepareExecutable();
+    int prepareExecutable(char const *cachePath, unsigned long flags);
 
     char const *getCompilerErrorMessage();
 
@@ -113,24 +119,22 @@
                        char const **keyList,
                        char const **valueList);
 
-    void getFuncNameList(size_t size, char const **list);
-
-    void getFuncBinary(char const *funcname, void **base, size_t *length);
+    void getFuncInfoList(size_t size, FuncInfo *list);
 
 
-    void registerSymbolCallback(BCCSymbolLookupFn pFn, BCCvoid *pContext);
+    void registerSymbolCallback(BCCSymbolLookupFn pFn, void *pContext);
 
     char *getContext();
 
 
-    void setError(BCCenum error) {
+    void setError(int error) {
       if (mErrorCode == BCC_NO_ERROR && error != BCC_NO_ERROR) {
         mErrorCode = error;
       }
     }
 
-    BCCenum getError() {
-      BCCenum result = mErrorCode;
+    int getError() {
+      int result = mErrorCode;
       mErrorCode = BCC_NO_ERROR;
       return result;
     }
diff --git a/lib/bcc/ScriptCached.cpp b/lib/bcc/ScriptCached.cpp
index 8011458..b4cf99d 100644
--- a/lib/bcc/ScriptCached.cpp
+++ b/lib/bcc/ScriptCached.cpp
@@ -22,7 +22,6 @@
 #include <bcc/bcc_cache.h>
 
 #include "ContextManager.h"
-#include "EmittedFuncInfo.h"
 
 #include <stdlib.h>
 
@@ -96,41 +95,25 @@
 }
 
 
-void ScriptCached::getFuncNameList(size_t funcNameListSize,
-                                   char const **funcNameList) {
-  if (funcNameList) {
+void ScriptCached::getFuncInfoList(size_t funcInfoListSize,
+                                   FuncInfo *funcInfoList) {
+  if (funcInfoList) {
     size_t funcCount = getFuncCount();
 
-    if (funcCount > funcNameListSize) {
-      funcCount = funcNameListSize;
+    if (funcCount > funcInfoListSize) {
+      funcCount = funcInfoListSize;
     }
 
+    FuncInfo *info = funcInfoList;
     for (FuncTable::const_iterator
          I = mFunctions.begin(), E = mFunctions.end();
-         I != E && funcCount > 0; I++, funcCount--) {
-      *funcNameList++ = I->first.c_str();
+         I != E && funcCount > 0; ++I, ++info, --funcCount) {
+      info->name = I->first.c_str();
+      info->addr = I->second.first;
+      info->size = I->second.second;
     }
   }
 }
 
 
-void ScriptCached::getFuncBinary(char const *funcname,
-                                 void **base,
-                                 size_t *length) {
-  FuncTable::const_iterator I = mFunctions.find(funcname);
-
-#define DEREF_ASSIGN(VAR, VALUE) if (VAR) { *(VAR) = (VALUE); }
-
-  if (I == mFunctions.end()) {
-    DEREF_ASSIGN(base, NULL);
-    DEREF_ASSIGN(length, 0);
-  } else {
-    DEREF_ASSIGN(base, I->second.first);
-    DEREF_ASSIGN(length, I->second.second);
-  }
-
-#undef DEREF_ASSIGN
-}
-
-
 } // namespace bcc
diff --git a/lib/bcc/ScriptCached.h b/lib/bcc/ScriptCached.h
index 49495dd..c484546 100644
--- a/lib/bcc/ScriptCached.h
+++ b/lib/bcc/ScriptCached.h
@@ -19,6 +19,7 @@
 
 #include <bcc/bcc.h>
 #include <bcc/bcc_cache.h>
+#include "bcc_internal.h"
 
 #include <llvm/ADT/SmallVector.h>
 
@@ -99,11 +100,7 @@
                        char const **keyList,
                        char const **valueList);
 
-    void getFuncNameList(size_t funcNameListSize, char const **funcNameList);
-
-    void getFuncBinary(char const *function,
-                       void **base,
-                       size_t *length);
+    void getFuncInfoList(size_t funcInfoListSize, FuncInfo *funcNameList);
 
 
     char *getContext() {
diff --git a/lib/bcc/ScriptCompiled.cpp b/lib/bcc/ScriptCompiled.cpp
index 9868580..052d2a7 100644
--- a/lib/bcc/ScriptCompiled.cpp
+++ b/lib/bcc/ScriptCompiled.cpp
@@ -19,8 +19,8 @@
 
 #include "ScriptCompiled.h"
 
+#include "bcc_internal.h"
 #include "ContextManager.h"
-#include "EmittedFuncInfo.h"
 
 namespace bcc {
 
@@ -31,7 +31,7 @@
   }
 
   // Delete the emitted function information
-  for (EmittedFunctionsMapTy::iterator I = mEmittedFunctions.begin(),
+  for (FuncInfoMap::iterator I = mEmittedFunctions.begin(),
        E = mEmittedFunctions.end(); I != E; I++) {
     if (I->second != NULL) {
       delete I->second;
@@ -92,46 +92,30 @@
 
 
 void *ScriptCompiled::lookup(const char *name) {
-  EmittedFunctionsMapTy::const_iterator I = mEmittedFunctions.find(name);
-  return (I == mEmittedFunctions.end()) ? NULL : I->second->Code;
+  FuncInfoMap::const_iterator I = mEmittedFunctions.find(name);
+  return (I == mEmittedFunctions.end()) ? NULL : I->second->addr;
 }
 
 
-void ScriptCompiled::getFuncNameList(size_t funcNameListSize,
-                                     char const **funcNameList) {
-  if (funcNameList) {
+void ScriptCompiled::getFuncInfoList(size_t funcInfoListSize,
+                                     FuncInfo *funcInfoList) {
+  if (funcInfoList) {
     size_t funcCount = getFuncCount();
 
-    if (funcCount > funcNameListSize) {
-      funcCount = funcNameListSize;
+    if (funcCount > funcInfoListSize) {
+      funcCount = funcInfoListSize;
     }
 
-    for (EmittedFunctionsMapTy::const_iterator
+    FuncInfo *info = funcInfoList;
+    for (FuncInfoMap::const_iterator
          I = mEmittedFunctions.begin(), E = mEmittedFunctions.end();
-         I != E && funcCount > 0; ++I, --funcCount) {
-      *funcNameList++ = I->first.c_str();
+         I != E && funcCount > 0; ++I, ++info, --funcCount) {
+      info->name = I->first.c_str();
+      info->addr = I->second->addr;
+      info->size = I->second->size;
     }
   }
 }
 
 
-void ScriptCompiled::getFuncBinary(char const *funcname,
-                                   void **base,
-                                   size_t *length) {
-  EmittedFunctionsMapTy::const_iterator I = mEmittedFunctions.find(funcname);
-
-#define DEREF_ASSIGN(VAR, VALUE) if (VAR) { *(VAR) = (VALUE); }
-
-  if (I == mEmittedFunctions.end()) {
-    DEREF_ASSIGN(base, NULL);
-    DEREF_ASSIGN(length, 0);
-  } else {
-    DEREF_ASSIGN(base, I->second->Code);
-    DEREF_ASSIGN(length, I->second->Size);
-  }
-
-#undef DEREF_ASSIGN
-}
-
-
 } // namespace bcc
diff --git a/lib/bcc/ScriptCompiled.h b/lib/bcc/ScriptCompiled.h
index a160b78..01af974 100644
--- a/lib/bcc/ScriptCompiled.h
+++ b/lib/bcc/ScriptCompiled.h
@@ -32,7 +32,6 @@
 }
 
 namespace bcc {
-  class EmittedFuncInfo;
   class Script;
 
   class ScriptCompiled {
@@ -43,7 +42,7 @@
     typedef std::list<std::pair<std::string, std::string> > PragmaList;
     typedef std::list<void*> ExportVarList;
     typedef std::list<void*> ExportFuncList;
-    typedef std::map<std::string, EmittedFuncInfo *> EmittedFunctionsMapTy;
+    typedef std::map<std::string, FuncInfo *> FuncInfoMap;
 
   private:
     Script *mpOwner;
@@ -54,7 +53,7 @@
     ExportFuncList mExportFuncs;
     PragmaList mPragmas;
 
-    EmittedFunctionsMapTy mEmittedFunctions;
+    FuncInfoMap mEmittedFunctions;
 
     char *mContext; // Context of BCC script (code and data)
 
@@ -65,14 +64,23 @@
 
     ~ScriptCompiled();
 
-    int readBC(const char *bitcode,
+    int readBC(char const *resName,
+               char const *bitcode,
                size_t bitcodeSize,
-               const BCCchar *resName,
-               const BCCchar *cacheDir) {
-      return mCompiler.readBC(bitcode, bitcodeSize, resName, cacheDir);
+               unsigned long flags) {
+      return mCompiler.readBC(bitcode, bitcodeSize);
     }
 
-    int linkBC(const char *bitcode, size_t bitcodeSize) {
+    int readModule(char const *resName,
+                   llvm::Module *module,
+                   unsigned long flags) {
+      return mCompiler.readModule(module);
+    }
+
+    int linkBC(char const *resName,
+               char const *bitcode,
+               size_t bitcodeSize,
+               unsigned long flags) {
       return mCompiler.linkBC(bitcode, bitcodeSize);
     }
 
@@ -112,23 +120,16 @@
                        char const **keyList,
                        char const **valueList);
 
-    void getFuncNameList(size_t funcNameListSize, char const **funcNameList);
-
-    void getFuncBinary(char const *function,
-                       void **base,
-                       size_t *length);
+    void getFuncInfoList(size_t funcInfoListSize,
+                         FuncInfo *funcInfoList);
 
     char *getContext() {
       return mContext;
     }
 
-    void registerSymbolCallback(BCCSymbolLookupFn pFn, BCCvoid *pContext) {
+    void registerSymbolCallback(BCCSymbolLookupFn pFn, void *pContext) {
       mCompiler.registerSymbolCallback(pFn, pContext);
     }
-
-    int readModule(llvm::Module *module) {
-      return mCompiler.readModule(module);
-    }
   };
 
 } // namespace bcc
diff --git a/lib/bcc/bcc.cpp b/lib/bcc/bcc.cpp
index a52c8f9..bc7f16d 100644
--- a/lib/bcc/bcc.cpp
+++ b/lib/bcc/bcc.cpp
@@ -20,13 +20,16 @@
 #define LOG_TAG "bcc"
 #include <cutils/log.h>
 
+#include <bcc/bcc.h>
+#include "bcc_internal.h"
+
 #include "Compiler.h"
 #include "Script.h"
 
-#include <bcc/bcc.h>
-
 #include <utils/StopWatch.h>
 
+using namespace bcc;
+
 char const libbcc_build_time[24] = __DATE__ " " __TIME__;
 
 namespace bcc {
@@ -53,102 +56,100 @@
 }
 
 
-extern "C" BCCscript *bccCreateScript() {
+extern "C" BCCScriptRef bccCreateScript() {
   BCC_FUNC_LOGGER();
-  return new BCCscript();
+  return wrap(new bcc::Script());
 }
 
-extern "C" BCCenum bccGetError(BCCscript *script) {
+extern "C" void bccDisposeScript(BCCScriptRef script) {
   BCC_FUNC_LOGGER();
-  return script->getError();
+  delete unwrap(script);
 }
 
-extern "C" void bccDeleteScript(BCCscript *script) {
-  BCC_FUNC_LOGGER();
-  delete script;
-}
-
-extern "C" void bccRegisterSymbolCallback(BCCscript *script,
+extern "C" void bccRegisterSymbolCallback(BCCScriptRef script,
                                           BCCSymbolLookupFn pFn,
-                                          BCCvoid *pContext) {
+                                          void *pContext) {
   BCC_FUNC_LOGGER();
-  script->registerSymbolCallback(pFn, pContext);
+  return unwrap(script)->registerSymbolCallback(pFn, pContext);
 }
 
-extern "C" int bccReadModule(BCCscript *script, BCCvoid *module) {
+extern "C" int bccGetError(BCCScriptRef script) {
   BCC_FUNC_LOGGER();
-  return script->readModule(reinterpret_cast<llvm::Module*>(module));
+  return unwrap(script)->getError();
 }
 
-extern "C" int bccReadBC(BCCscript *script,
-                         const BCCchar *bitcode,
-                         BCCint bitcodeSize,
-                         long __DONT_USE_PARAM_1,
-                         long __DONT_USE_PARAM_2,
-                         const BCCchar *resName,
-                         const BCCchar *cacheDir) {
+
+extern "C" int bccReadBC(BCCScriptRef script,
+                         char const *resName,
+                         char const *bitcode,
+                         size_t bitcodeSize,
+                         unsigned long flags) {
   BCC_FUNC_LOGGER();
-  return script->readBC(bitcode, bitcodeSize, resName, cacheDir);
+  return unwrap(script)->readBC(resName, bitcode, bitcodeSize, flags);
 }
 
-extern "C" int bccLinkBC(BCCscript *script,
-                         const BCCchar *bitcode,
-                         BCCint size) {
+
+extern "C" int bccReadModule(BCCScriptRef script,
+                             char const *resName,
+                             LLVMModuleRef module,
+                             unsigned long flags) {
   BCC_FUNC_LOGGER();
-  return script->linkBC(bitcode, size);
+  return unwrap(script)->readModule(resName, unwrap(module), flags);
 }
 
-extern "C" int bccPrepareExecutable(BCCscript *script) {
+
+extern "C" int bccLinkBC(BCCScriptRef script,
+                         char const *resName,
+                         char const *bitcode,
+                         size_t bitcodeSize,
+                         unsigned long flags) {
   BCC_FUNC_LOGGER();
+  return unwrap(script)->linkBC(resName, bitcode, bitcodeSize, flags);
+}
+
+
+extern "C" int bccPrepareExecutable(BCCScriptRef script,
+                                    char const *cachePath,
+                                    unsigned long flags) {
+  BCC_FUNC_LOGGER();
+
 #if defined(__arm__)
   android::StopWatch compileTimer("bcc: PrepareExecutable time");
 #endif
 
-  int result = script->prepareExecutable();
-  if (result)
-    script->setError(BCC_INVALID_OPERATION);
-
-  return result;
+  return unwrap(script)->prepareExecutable(cachePath, flags);
 }
 
-extern "C" void bccGetScriptInfoLog(BCCscript *script,
-                                    BCCsizei maxLength,
-                                    BCCsizei *length,
-                                    BCCchar *infoLog) {
-  BCC_FUNC_LOGGER();
-  LOGE("%s is deprecated. *********************************\n", __func__);
-}
 
-extern "C" void bccGetScriptLabel(BCCscript *script,
-                                  const BCCchar *name,
-                                  BCCvoid **address) {
+extern "C" void *bccGetFuncAddr(BCCScriptRef script, char const *funcname) {
   BCC_FUNC_LOGGER();
-  void *value = script->lookup(name);
-  if (value) {
-    *address = value;
+
+  void *addr = unwrap(script)->lookup(funcname);
+
 #if defined(USE_DISASSEMBLER_FILE)
-    LOGI("[GetScriptLabel] %s @ 0x%x", name, value);
+  LOGD("Function Address: %s --> 0x%p\n", funcname, addr);
 #endif
-  } else {
-    script->setError(BCC_INVALID_VALUE);
-  }
+
+  return addr;
 }
 
-extern "C" void bccGetExportVars(BCCscript *script,
-                                 BCCsizei *actualCount,
-                                 BCCsizei varListSize,
-                                 BCCvoid **varList) {
-  BCC_FUNC_LOGGER();
 
-  if (actualCount) {
-    *actualCount = static_cast<BCCsizei>(script->getExportVarCount());
-  }
+extern "C" size_t bccGetExportVarCount(BCCScriptRef script) {
+  BCC_FUNC_LOGGER();
+  return unwrap(script)->getExportVarCount();
+}
+
+
+extern "C" void bccGetExportVarList(BCCScriptRef script,
+                                    size_t varListSize,
+                                    void **varList) {
+  BCC_FUNC_LOGGER();
 
   if (varList) {
-    script->getExportVarList(static_cast<size_t>(varListSize), varList);
+    unwrap(script)->getExportVarList(varListSize, varList);
 
 #if defined(USE_DISASSEMBLER_FILE)
-    size_t count = script->getExportVarCount();
+    size_t count = unwrap(script)->getExportVarCount();
     LOGD("ExportVarCount = %lu\n", (unsigned long)count);
 
     if (count > varListSize) {
@@ -162,21 +163,23 @@
   }
 }
 
-extern "C" void bccGetExportFuncs(BCCscript *script,
-                                  BCCsizei *actualCount,
-                                  BCCsizei funcListSize,
-                                  BCCvoid **funcList) {
+
+extern "C" size_t bccGetExportFuncCount(BCCScriptRef script) {
+  BCC_FUNC_LOGGER();
+  return unwrap(script)->getExportFuncCount();
+}
+
+
+extern "C" void bccGetExportFuncList(BCCScriptRef script,
+                                     size_t funcListSize,
+                                     void **funcList) {
   BCC_FUNC_LOGGER();
 
-  if (actualCount) {
-    *actualCount = static_cast<BCCsizei>(script->getExportFuncCount());
-  }
-
   if (funcList) {
-    script->getExportFuncList(static_cast<size_t>(funcListSize), funcList);
+    unwrap(script)->getExportFuncList(funcListSize, funcList);
 
 #if defined(USE_DISASSEMBLER_FILE)
-    size_t count = script->getExportFuncCount();
+    size_t count = unwrap(script)->getExportFuncCount();
     LOGD("ExportFuncCount = %lu\n", (unsigned long)count);
 
     if (count > funcListSize) {
@@ -190,37 +193,22 @@
   }
 }
 
-extern "C" void bccGetPragmas(BCCscript *script,
-                              BCCsizei *actualCount,
-                              BCCsizei stringListSize,
-                              BCCchar **stringList) {
+
+extern "C" size_t bccGetPragmaCount(BCCScriptRef script) {
   BCC_FUNC_LOGGER();
+  return unwrap(script)->getPragmaCount();
+}
 
-  if (actualCount) {
-    *actualCount = static_cast<BCCsizei>(script->getPragmaCount() * 2);
-  }
 
-  if (stringList) {
-    size_t pragmaListSize = static_cast<size_t>(stringListSize) / 2;
-
-    char const **buf = new (nothrow) char const *[pragmaListSize * 2];
-    if (!buf) {
-      return;
-    }
-
-    char const **keyList = buf;
-    char const **valueList = buf + pragmaListSize;
-
-    script->getPragmaList(pragmaListSize, keyList, valueList);
-
-    for (size_t i = 0; i < pragmaListSize; ++i) {
-      *stringList++ = const_cast<BCCchar *>(keyList[i]);
-      *stringList++ = const_cast<BCCchar *>(valueList[i]);
-    }
-
-    delete [] buf;
+extern "C" void bccGetPragmaList(BCCScriptRef script,
+                                 size_t pragmaListSize,
+                                 const char **keyList,
+                                 const char **valueList) {
+  BCC_FUNC_LOGGER();
+  unwrap(script)->getPragmaList(pragmaListSize, keyList, valueList);
 
 #if defined(USE_DISASSEMBLER_FILE)
+  if (keyList && valueList) {
     size_t count = script->getPragmaCount();
     LOGD("PragmaCount = %lu\n", count);
 
@@ -230,38 +218,25 @@
 
     for (size_t i = 0; i < count; ++i) {
       LOGD("Pragma[%lu] = (%s , %s)\n",
-           (unsigned long)i, stringList[2 * i], stringList[2 * i + 1]);
+           (unsigned long)i, keyList[i], valueList[i]);
     }
+  }
 #endif
-  }
 }
 
-extern "C" void bccGetFunctions(BCCscript *script,
-                                BCCsizei *actualCount,
-                                BCCsizei funcNameListSize,
-                                BCCchar **funcNameList) {
+
+extern "C" size_t bccGetFuncCount(BCCScriptRef script) {
   BCC_FUNC_LOGGER();
-
-  if (actualCount) {
-    *actualCount = static_cast<BCCsizei>(script->getFuncCount());
-  }
-
-  if (funcNameList) {
-    script->getFuncNameList(static_cast<size_t>(funcNameListSize),
-                            const_cast<char const **>(funcNameList));
-  }
+  return unwrap(script)->getFuncCount();
 }
 
-extern "C" void bccGetFunctionBinary(BCCscript *script,
-                                     BCCchar *funcname,
-                                     BCCvoid **base,
-                                     BCCsizei *length) {
+
+extern "C" void bccGetFuncInfoList(BCCScriptRef script,
+                                   size_t funcInfoListSize,
+                                   BCCFuncInfo *funcInfoList) {
   BCC_FUNC_LOGGER();
 
-  size_t funcLength = 0;
-  script->getFuncBinary(funcname, base, &funcLength);
-
-  if (length) {
-    *length = static_cast<BCCsizei>(funcLength);
+  if (funcInfoList) {
+    unwrap(script)->getFuncInfoList(funcInfoListSize, funcInfoList);
   }
 }
diff --git a/lib/bcc/bcc_internal.h b/lib/bcc/bcc_internal.h
new file mode 100644
index 0000000..af1b647
--- /dev/null
+++ b/lib/bcc/bcc_internal.h
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2010, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef BCC_INTERNAL_H
+#define BCC_INTERNAL_H
+
+#include <bcc/bcc.h>
+
+#if defined(__cplusplus)
+
+#define BCC_OPAQUE_TYPE_CONVERSION(TRANSPARENT_TYPE, OPAQUE_TYPE)           \
+  inline OPAQUE_TYPE wrap(TRANSPARENT_TYPE ptr) {                           \
+    return reinterpret_cast<OPAQUE_TYPE>(ptr);                              \
+  }                                                                         \
+                                                                            \
+  inline TRANSPARENT_TYPE unwrap(OPAQUE_TYPE ptr) {                         \
+    return reinterpret_cast<TRANSPARENT_TYPE>(ptr);                         \
+  }
+
+namespace llvm {
+  class Module;
+}
+
+namespace bcc {
+  class Script;
+
+  // Alias BCCFuncInfo to bcc::FuncInfo
+  typedef struct BCCFuncInfo FuncInfo;
+
+  BCC_OPAQUE_TYPE_CONVERSION(bcc::Script *, BCCScriptRef);
+  BCC_OPAQUE_TYPE_CONVERSION(llvm::Module *, LLVMModuleRef);
+
+} // namespace bcc
+
+#undef BCC_OPAQUE_TYPE_CONVERSION
+
+#endif // defined(__cplusplus)
+
+#endif // BCC_INTERNAL_H
diff --git a/tests/Android.mk b/tests/Android.mk
index 343cd4a..01475d7 100644
--- a/tests/Android.mk
+++ b/tests/Android.mk
@@ -22,14 +22,14 @@
 
 LOCAL_MODULE := bcc
 
-LOCAL_SRC_FILES:= \
-	main.cpp
+LOCAL_SRC_FILES := \
+  main.cpp
 
 LOCAL_SHARED_LIBRARIES := \
-	libbcc
+  libbcc
 
-LOCAL_C_INCLUDES :=	\
-	$(LOCAL_PATH)/../include
+LOCAL_C_INCLUDES := \
+  $(LOCAL_PATH)/../include
 
 LOCAL_MODULE_TAGS := tests
 
@@ -41,18 +41,18 @@
 # ========================================================
 include $(CLEAR_VARS)
 
-LOCAL_MODULE:= bcc
+LOCAL_MODULE := bcc
 
-LOCAL_SRC_FILES:= \
-	main.cpp \
-	disassem.cpp
+LOCAL_SRC_FILES := \
+  main.cpp \
+  disassem.cpp
 
-LOCAL_SHARED_LIBRARIES := \
-	libbcc	\
-	libdl
+LOCAL_SHARED_LIBRARIES := libdl libstlport libbcc
 
-LOCAL_C_INCLUDES :=	\
-	$(LOCAL_PATH)/../include
+LOCAL_C_INCLUDES := \
+  bionic \
+  external/stlport/stlport \
+  $(LOCAL_PATH)/../include
 
 LOCAL_MODULE_TAGS := tests
 
diff --git a/tests/main.cpp b/tests/main.cpp
index df6248e..6efbb08 100644
--- a/tests/main.cpp
+++ b/tests/main.cpp
@@ -39,76 +39,73 @@
 
 #include <bcc/bcc.h>
 
+#include <vector>
+
+
 typedef int (*MainPtr)(int, char**);
+
 // This is a separate function so it can easily be set by breakpoint in gdb.
-static int run(MainPtr mainFunc, int argc, char** argv)
-{
+static int run(MainPtr mainFunc, int argc, char** argv) {
   return mainFunc(argc, argv);
 }
 
-static BCCvoid* symbolLookup(BCCvoid* pContext, const BCCchar* name)
-{
-  return (BCCvoid*) dlsym(RTLD_DEFAULT, name);
+static void* lookupSymbol(void* pContext, const char* name) {
+  return (void*) dlsym(RTLD_DEFAULT, name);
 }
 
 #ifdef PROVIDE_ARM_DISASSEMBLY
 
 static FILE* disasmOut;
 
-static u_int
-disassemble_readword(u_int address)
-{
+static u_int disassemble_readword(u_int address) {
   return(*((u_int *)address));
 }
 
-static void
-disassemble_printaddr(u_int address)
-{
+static void disassemble_printaddr(u_int address) {
   fprintf(disasmOut, "0x%08x", address);
 }
 
-static void
-disassemble_printf(const char *fmt, ...) {
+static void disassemble_printf(const char *fmt, ...) {
   va_list ap;
   va_start(ap, fmt);
   vfprintf(disasmOut, fmt, ap);
   va_end(ap);
 }
 
-static int disassemble(BCCscript* script, FILE* out) {
+static int disassemble(BCCScriptRef script, FILE* out) {
   disasmOut = out;
   disasm_interface_t  di;
   di.di_readword = disassemble_readword;
   di.di_printaddr = disassemble_printaddr;
   di.di_printf = disassemble_printf;
 
-  BCCvoid* base;
-  BCCsizei length;
-
-  BCCsizei numFunctions;
-  bccGetFunctions(script, &numFunctions, 0, NULL);
+  size_t numFunctions = bccGetFuncCount(script);
+  fprintf(stderr, "Function Count: %lu\n", (unsigned long)numFunctions);
   if (numFunctions) {
-    char** labels = new char*[numFunctions];
-    bccGetFunctions(script, NULL, numFunctions, labels);
+    BCCFuncInfo *infos = new BCCFuncInfo[numFunctions];
+    bccGetFuncInfoList(script, numFunctions, infos);
 
-    for(BCCsizei i = 0; i < numFunctions; i++) {
-      bccGetFunctionBinary(script, labels[i], &base, &length);
+    for(size_t i = 0; i < numFunctions; i++) {
+      fprintf(stderr, "-----------------------------------------------------\n");
+      fprintf(stderr, "%s\n", infos[i].name);
+      fprintf(stderr, "-----------------------------------------------------\n");
 
-      unsigned long* pBase = (unsigned long*) base;
-      unsigned long* pEnd = (unsigned long*) (((unsigned char*) base) + length);
+      unsigned long* pBase = (unsigned long*) infos[i].addr;
+      unsigned long* pEnd =
+        (unsigned long*) (((unsigned char*) infos[i].addr) + infos[i].size);
 
       for(unsigned long* pInstruction = pBase; pInstruction < pEnd; pInstruction++) {
         fprintf(out, "%08x: %08x  ", (int) pInstruction, (int) *pInstruction);
         ::disasm(&di, (uint) pInstruction, 0);
       }
     }
-    delete[] labels;
+    delete [] infos;
   }
 
   return 1;
 }
 #else
-static int disassemble(BCCscript* script, FILE* out) {
+static int disassemble(BCCScriptRef script, FILE* out) {
   fprintf(stderr, "Disassembler not supported on this build.\n");
   return 1;
 }
@@ -158,11 +155,10 @@
   }
 
   inFile = argv[optind];
-
   return 1;
 }
 
-static BCCscript* loadScript() {
+static BCCScriptRef loadScript() {
   if (!inFile) {
     fprintf(stderr, "input file required\n");
     return NULL;
@@ -185,134 +181,99 @@
     return NULL;
   }
 
-  size_t codeSize = (size_t)statInFile.st_size;
-  BCCchar* bitcode = new BCCchar[codeSize + 1];
-  size_t bytesRead = fread(bitcode, 1, codeSize, in);
-  if (bytesRead != codeSize)
+  size_t bitcodeSize = statInFile.st_size;
+
+  std::vector<char> bitcode(bitcodeSize + 1, '\0');
+  size_t nread = fread(&*bitcode.begin(), 1, bitcodeSize, in);
+
+  if (nread != bitcodeSize)
       fprintf(stderr, "Could not read all of file %s\n", inFile);
 
-  BCCscript* script = bccCreateScript();
+  BCCScriptRef script = bccCreateScript();
 
-  bitcode[codeSize] = '\0'; /* must be null-terminated */
-  if (bccReadBC(script, bitcode, codeSize,
-                statInFile.st_mtime, 0, "file", "/tmp") != 0) {
+  if (bccReadBC(script, "file", &*bitcode.begin(), bitcodeSize, 0) != 0) {
     fprintf(stderr, "bcc: FAILS to read bitcode");
+    bccDisposeScript(script);
     return NULL;
   }
 
-  if (bccPrepareExecutable(script) != 0) {
-    fprintf(stderr, "bcc: FAILS to prepare executable");
+  bccRegisterSymbolCallback(script, lookupSymbol, NULL);
+
+  if (bccPrepareExecutable(script, "cache.oBCC", 0) != 0) {
+    fprintf(stderr, "bcc: FAILS to prepare executable.\n");
+    bccDisposeScript(script);
     return NULL;
   }
 
-  //delete [] bitcode;
-
   return script;
 }
 
-static int compile(BCCscript* script) {
-  bccRegisterSymbolCallback(script, symbolLookup, NULL);
+static void printPragma(BCCScriptRef script) {
+  size_t numPragma = bccGetPragmaCount(script);
+  if (numPragma) {
+    char const ** keyList = new char const *[numPragma];
+    char const ** valueList = new char const *[numPragma];
 
-  if (bccPrepareExecutable(script) != 0) {
-    fprintf(stderr, "Something wrong\n");
-  }
-
-  int result = bccGetError(script);
-  if (result != 0) {
-    BCCsizei bufferLength;
-    bccGetScriptInfoLog(script, 0, &bufferLength, NULL);
-    char* buf = (char*) malloc(bufferLength + 1);
-    if (buf != NULL) {
-        bccGetScriptInfoLog(script, bufferLength + 1, NULL, buf);
-        fprintf(stderr, "%s", buf);
-        free(buf);
-    } else {
-        fprintf(stderr, "Out of memory.\n");
+    bccGetPragmaList(script, numPragma, keyList, valueList);
+    for(size_t i = 0; i < numPragma; ++i) {
+      fprintf(stderr, "#pragma %s(%s)\n", keyList[i], valueList[i]);
     }
-    bccDeleteScript(script);
+
+    delete [] keyList;
+    delete [] valueList;
+  }
+}
+
+static int runMain(BCCScriptRef script, int argc, char** argv) {
+  MainPtr mainPointer = (MainPtr)bccGetFuncAddr(script, "root");
+
+  if (!mainPointer) {
+    fprintf(stderr, "Could not find root.\n");
     return 0;
   }
 
-  {
-    BCCsizei numPragmaStrings;
-    bccGetPragmas(script, &numPragmaStrings, 0, NULL);
-    if (numPragmaStrings) {
-      char** strings = new char*[numPragmaStrings];
-      bccGetPragmas(script, NULL, numPragmaStrings, strings);
-      for(BCCsizei i = 0; i < numPragmaStrings; i += 2)
-        fprintf(stderr, "#pragma %s(%s)\n", strings[i], strings[i+1]);
-      delete[] strings;
-    }
-  }
+  fprintf(stderr, "Executing compiled code:\n");
+
+  int argc1 = argc - optind;
+  char** argv1 = argv + optind;
+
+  int result = run(mainPointer, argc1, argv1);
+  fprintf(stderr, "result: %d\n", result);
 
   return 1;
 }
 
-static int runMain(BCCscript* script, int argc, char** argv) {
-  MainPtr mainPointer = 0;
-
-  bccGetScriptLabel(script, "root", (BCCvoid**) &mainPointer);
-
-  int result = bccGetError(script);
-  if (result != BCC_NO_ERROR) {
-    fprintf(stderr, "Could not find root: %d\n", result);
-  } else {
-    fprintf(stderr, "Executing compiled code:\n");
-    int codeArgc = argc - optind;
-    char** codeArgv = argv + optind;
-    //codeArgv[0] = (char*) (inFile ? inFile : "stdin");
-    result = run(mainPointer, codeArgc, codeArgv);
-    fprintf(stderr, "result: %d\n", result);
-  }
-
-  return 1;
-
-}
-
-int main(int argc, char** argv)
-{
-  int result = 0;
-  BCCscript* script;
-
+int main(int argc, char** argv) {
   if(!parseOption(argc, argv)) {
-    result = 1;
     fprintf(stderr, "failed to parse option\n");
-    goto exit;
+    return 1;
   }
 
+  BCCScriptRef script;
+
   if((script = loadScript()) == NULL) {
-    result = 2;
     fprintf(stderr, "failed to load source\n");
-    goto exit;
+    return 2;
   }
 
 #if 0
   if(printTypeInformation && !reflection(script, stderr)) {
-    result = 3;
     fprintf(stderr, "failed to retrieve type information\n");
-    goto exit;
+    return 3;
   }
 #endif
 
-  if(!compile(script)) {
-    result = 4;
-    fprintf(stderr, "failed to compile\n");
-    goto exit;
-  }
+  printPragma(script);
 
   if(printListing && !disassemble(script, stderr)) {
-    result = 5;
     fprintf(stderr, "failed to disassemble\n");
-    goto exit;
+    return 5;
   }
 
   if(runResults && !runMain(script, argc, argv)) {
-    result = 6;
     fprintf(stderr, "failed to execute\n");
-    goto exit;
+    return 6;
   }
 
-exit:
-
-  return result;
+  return 0;
 }
