diff --git a/hpvm/lib/Transforms/ReplaceIntrinsics/CMakeLists.txt b/hpvm/lib/Transforms/ReplaceIntrinsics/CMakeLists.txt
index 0bfb2bf2219ba1278d14b78e7ee5dc0a0abd2702..460aabcc27b51a2d94dabee3e9c4c60d14803ea9 100644
--- a/hpvm/lib/Transforms/ReplaceIntrinsics/CMakeLists.txt
+++ b/hpvm/lib/Transforms/ReplaceIntrinsics/CMakeLists.txt
@@ -2,7 +2,8 @@ if(WIN32 OR CYGWIN)
   set(LLVM_LINK_COMPONENTS Core Support)
 endif()
 
-add_llvm_loadable_module( ReplaceIntrinsics
+add_llvm_library( ReplaceIntrinsics
+  MODULE
   ReplaceIntrinsics.cpp
 
   DEPENDS
diff --git a/hpvm/lib/Transforms/ReplaceIntrinsics/LLVMBuild.txt b/hpvm/lib/Transforms/ReplaceIntrinsics/LLVMBuild.txt
index 6450fa1714de0200ce18848919d69cff895848d0..95739b3d4d1c3a68cc5014dc85fb26d3b1fc6ac5 100644
--- a/hpvm/lib/Transforms/ReplaceIntrinsics/LLVMBuild.txt
+++ b/hpvm/lib/Transforms/ReplaceIntrinsics/LLVMBuild.txt
@@ -1,4 +1,4 @@
-;===- ./lib/Transforms/DFG2LLVM_NVPTX/LLVMBuild.txt ------------*- Conf -*--===;
+;===- ./lib/Transforms/DFG2LLVM_WrapperAPI/LLVMBuild.txt -------*- Conf -*--===;
 ;
 ;                     The LLVM Compiler Infrastructure
 ;
@@ -19,4 +19,3 @@
 type = Library
 name = ReplaceIntrinsics
 parent = Transforms
-
diff --git a/hpvm/lib/Transforms/ReplaceIntrinsics/ReplaceIntrinsics.cpp b/hpvm/lib/Transforms/ReplaceIntrinsics/ReplaceIntrinsics.cpp
index ef649d8e170451d5bf2f133d6113cbfeb30f046e..6944d0d0e2f8a18b453669ae6c9c3dfd59d874f9 100644
--- a/hpvm/lib/Transforms/ReplaceIntrinsics/ReplaceIntrinsics.cpp
+++ b/hpvm/lib/Transforms/ReplaceIntrinsics/ReplaceIntrinsics.cpp
@@ -9,6 +9,7 @@
 #define ENABLE_ASSERTS
 
 #define DEBUG_TYPE "REPLACE_APPROXHPVM_INTRINSICS_WITH_FCALLS"
+
 #include "llvm/IR/DataLayout.h"
 #include "llvm/IR/IRBuilder.h"
 #include "llvm/IR/Module.h"
@@ -23,9 +24,10 @@
 #include "llvm/Support/FileSystem.h"
 #include "llvm/IR/Attributes.h"
 #include "llvm-c/Core.h"
-#include "llvm/SupportVISC/VISCTimer.h"
-#include "llvm/SupportVISC/DFG2LLVM.h"
-#include "llvm/InPlaceDFG/InPlaceDFGAnalysis.h"
+
+#include "SupportHPVM/DFG2LLVM.h"
+#include "InPlaceDFG/InPlaceDFGAnalysis.h"
+
 #include <sstream>
 
 using namespace llvm;
@@ -70,8 +72,8 @@ private:
   /* TODO: I believe that TensorRt is not needed, since we will have llvm
    implementations linked in, so init and cleanup calls can be removed and
    relevant code also, but I leave in in for now until verified. */
-  Constant* llvm_hpvm_initTensorRt;
-  Constant* llvm_hpvm_cleanupTensorRt;
+  FunctionCallee llvm_hpvm_initTensorRt;
+  FunctionCallee llvm_hpvm_cleanupTensorRt;
 //  Constant* hpvm_request_tensor; DONE: request tensor will not be used
 
   // Functions
@@ -169,18 +171,18 @@ void CGT_ReplaceApproxHPVMIntrinsicsWithFCalls::initRuntimeAPI() {
   DECLARE(llvm_hpvm_cleanupTensorRt);
 //  DECLARE(hpvm_request_tensor);
 
-  // Find visc.init and visc.cleanup calls, and add placeholder methods
+  // Find hpvm.init and visc.cleanup calls, and add placeholder methods
   // for initialization and cleanup of the hpvm tensor runtime
 
-  Function* VI = M.getFunction("llvm.visc.init");
-  assert(VI->getNumUses() == 1 && "__visc__init should only be used once\n");
+  Function* VI = M.getFunction("llvm.hpvm.init");
+  assert(VI->getNumUses() == 1 && "__hpvm__init should only be used once\n");
   InitCall = cast<Instruction>(*VI->user_begin());
   CallInst::Create(llvm_hpvm_initTensorRt,
                    ArrayRef<Value*>(ConstantInt::get(Type::getInt32Ty(M.getContext()), 0)),
                    "", InitCall);
 
-  Function* VC = M.getFunction("llvm.visc.cleanup");
-  assert(VC->getNumUses() == 1 && "__visc__clear should only be used once\n");
+  Function* VC = M.getFunction("llvm.hpvm.cleanup");
+  assert(VC->getNumUses() == 1 && "__hpvm__clear should only be used once\n");
   CleanupCall = cast<Instruction>(*VC->user_begin());
   CallInst::Create(llvm_hpvm_cleanupTensorRt, ArrayRef<Value*>(), "", CleanupCall);
 
@@ -207,7 +209,7 @@ void CGT_ReplaceApproxHPVMIntrinsicsWithFCalls::codeGen(DFLeafNode* N) {
   }
 
   // Search for intrinsic only if it has the right hint
-  if (!checkPreferredTarget(N, visc::CPU_TARGET)) {
+  if (!checkPreferredTarget(N, hpvm::CPU_TARGET)) {
     errs() << "Skipping node: "<< N->getFuncPointer()->getName() << "\n";
     return;
   }
@@ -220,15 +222,15 @@ void CGT_ReplaceApproxHPVMIntrinsicsWithFCalls::codeGen(DFLeafNode* N) {
 
   for (inst_iterator i = inst_begin(F), e = inst_end(F); i != e; ++i) {
     Instruction *I = &(*i);
-    if (BuildDFG::isViscIntrinsic(I)) {
+    if (BuildDFG::isHPVMIntrinsic(I)) {
       IntrinsicInst* II = dyn_cast<IntrinsicInst>(I);
-      assert((II->getCalledFunction()->getName()).startswith("llvm.visc.tensor")
+      assert((II->getCalledFunction()->getName()).startswith("llvm.hpvm.tensor")
         && "Only HPVM tensor intrinsics allowed in ApproxHPVM leaf nodes\n");
       /********************* Handle VISC Tensor intrinsics ********************/
       // We replace them with calls to functions with implementations at the LLVM level
       switch (II->getIntrinsicID()) {
 
-      case Intrinsic::visc_tensor_convolution:
+      case Intrinsic::hpvm_tensor_convolution:
       { /* llvm.hpvm.tensor.convolution */
         DEBUG(errs() << F->getName() << "\t: Handling tensor convolution \n");
 
@@ -248,7 +250,7 @@ void CGT_ReplaceApproxHPVMIntrinsicsWithFCalls::codeGen(DFLeafNode* N) {
         Args.push_back(conv_precision);
 	
         // Create function call
-        Constant* tensorConvolutionCPU;
+        FunctionCallee tensorConvolutionCPU;
         DECLARE(tensorConvolutionCPU);
 	
         CallInst* CI = CallInst::Create(tensorConvolutionCPU,
@@ -261,7 +263,7 @@ void CGT_ReplaceApproxHPVMIntrinsicsWithFCalls::codeGen(DFLeafNode* N) {
       }
       break;
 
-      case Intrinsic::visc_tensor_mul:
+      case Intrinsic::hpvm_tensor_mul:
       { /* llvm.hpvm.tensor.mul */
         DEBUG(errs() << F->getName() << "\t: Handling tensor mul\n");
 
@@ -271,7 +273,7 @@ void CGT_ReplaceApproxHPVMIntrinsicsWithFCalls::codeGen(DFLeafNode* N) {
         Args.push_back(II->getOperand(1));
 
         // Create function call
-        Constant* tensorGemmCPU;
+        FunctionCallee tensorGemmCPU;
         DECLARE(tensorGemmCPU);
 	
         CallInst* CI = CallInst::Create(tensorGemmCPU,
@@ -284,7 +286,7 @@ void CGT_ReplaceApproxHPVMIntrinsicsWithFCalls::codeGen(DFLeafNode* N) {
       }
       break;
 
-      case Intrinsic::visc_tensor_add:
+      case Intrinsic::hpvm_tensor_add:
       { /* llvm.hpvm.tensor.add */
         DEBUG(errs() << F->getName() << "\t: Handling tensor add\n");
         // Tensor add(a,b) is in place for argument a.
@@ -305,7 +307,7 @@ void CGT_ReplaceApproxHPVMIntrinsicsWithFCalls::codeGen(DFLeafNode* N) {
         Args.push_back(II->getOperand(1));
 
         // Create function call
-        Constant* tensorAddCPU;
+        FunctionCallee tensorAddCPU;
         DECLARE(tensorAddCPU);
         CallInst::Create(tensorAddCPU, Args, "", II);
         // We can replace the call to hpvm.tensor.add with the 1st argument
@@ -317,9 +319,9 @@ void CGT_ReplaceApproxHPVMIntrinsicsWithFCalls::codeGen(DFLeafNode* N) {
       }
       break;
 
-      case Intrinsic::visc_tensor_pool_max:
-      case Intrinsic::visc_tensor_pool_mean:
-      { /* llvm.visc.tensor.relu */
+      case Intrinsic::hpvm_tensor_pool_max:
+      case Intrinsic::hpvm_tensor_pool_mean:
+      { /* llvm.hpvm.tensor.relu */
         DEBUG(errs() << F->getName() << "\t: Handling tensor_pool_max\n");
         // Tensor relu(a) is in place for argument a.
         Value *Op = II->getOperand(0);
@@ -337,10 +339,10 @@ void CGT_ReplaceApproxHPVMIntrinsicsWithFCalls::codeGen(DFLeafNode* N) {
         Args.push_back(II->getOperand(0));
 
 	int pool_type = 0;
-	if (II->getIntrinsicID() == Intrinsic::visc_tensor_pool_max){
+	if (II->getIntrinsicID() == Intrinsic::hpvm_tensor_pool_max){
           pool_type = 0;
 	}
-        if (II->getIntrinsicID() == Intrinsic::visc_tensor_pool_mean){
+        if (II->getIntrinsicID() == Intrinsic::hpvm_tensor_pool_mean){
           pool_type = 1;
 	}	
 	
@@ -354,7 +356,7 @@ void CGT_ReplaceApproxHPVMIntrinsicsWithFCalls::codeGen(DFLeafNode* N) {
 	Args.push_back(II->getOperand(6));
 
         // Create function call
-        Constant* tensorPoolingCPU;
+        FunctionCallee tensorPoolingCPU;
         DECLARE(tensorPoolingCPU);
         CallInst* CI = CallInst::Create(tensorPoolingCPU, Args, "", II);
 
@@ -365,10 +367,10 @@ void CGT_ReplaceApproxHPVMIntrinsicsWithFCalls::codeGen(DFLeafNode* N) {
         IItoRemove.push_back(II);
       }break;
 
-      case Intrinsic::visc_tensor_relu:
-      case Intrinsic::visc_tensor_clipped_relu:
-      case Intrinsic::visc_tensor_tanh:
-      { /* llvm.visc.tensor.relu */
+      case Intrinsic::hpvm_tensor_relu:
+      case Intrinsic::hpvm_tensor_clipped_relu:
+      case Intrinsic::hpvm_tensor_tanh:
+      { /* llvm.hpvm.tensor.relu */
         DEBUG(errs() << F->getName() << "\t: Handling tensor activation functions \n");
         // Tensor relu(a) is in place for argument a.
         Value *Op = II->getOperand(0);
@@ -384,22 +386,22 @@ void CGT_ReplaceApproxHPVMIntrinsicsWithFCalls::codeGen(DFLeafNode* N) {
         std::vector<Value*> Args;
         Args.push_back(II->getOperand(0));
 
-	if (II->getIntrinsicID() == Intrinsic::visc_tensor_relu){
+	if (II->getIntrinsicID() == Intrinsic::hpvm_tensor_relu){
           // Create function call
-          Constant* tensorReluCPU;
+          FunctionCallee tensorReluCPU;
           DECLARE(tensorReluCPU);
           CallInst::Create(tensorReluCPU, Args, "", II);
 	}
-	else if (II->getIntrinsicID() == Intrinsic::visc_tensor_clipped_relu){
+	else if (II->getIntrinsicID() == Intrinsic::hpvm_tensor_clipped_relu){
           // Create function call
-          //-- Constant* tensorClippedRelu;
-	  Constant* tensorRelu2CPU;
+          //-- FunctionCallee tensorClippedRelu;
+	  FunctionCallee tensorRelu2CPU;
           DECLARE(tensorRelu2CPU);
           CallInst::Create(tensorRelu2CPU, Args, "", II);
 	}
-	else if (II->getIntrinsicID() == Intrinsic::visc_tensor_tanh){
+	else if (II->getIntrinsicID() == Intrinsic::hpvm_tensor_tanh){
           // Create function call
-          Constant* tensorTanhCPU;
+          FunctionCallee tensorTanhCPU;
 	  errs()<<"tensorTanh Call = \n\n";
           DECLARE(tensorTanhCPU);
 	  //errs()<<"tensorTanh Call = "<<*tensorTanh<<"\l";
@@ -415,8 +417,8 @@ void CGT_ReplaceApproxHPVMIntrinsicsWithFCalls::codeGen(DFLeafNode* N) {
       }
       break;
 
-      case Intrinsic::visc_tensor_softmax:
-      { /* llvm.visc.tensor.softmax */
+      case Intrinsic::hpvm_tensor_softmax:
+      { /* llvm.hpvm.tensor.softmax */
         DEBUG(errs() << F->getName() << "\t: Handling tensor softmax\n");
         // Tensor relu(a) is in place for argument a.
         Value *Op = II->getOperand(0);
@@ -433,7 +435,7 @@ void CGT_ReplaceApproxHPVMIntrinsicsWithFCalls::codeGen(DFLeafNode* N) {
         Args.push_back(II->getOperand(0));
 
         // Create function call
-        Constant* tensorSoftmaxCPU;
+        FunctionCallee tensorSoftmaxCPU;
         DECLARE(tensorSoftmaxCPU);
         CallInst::Create(tensorSoftmaxCPU, Args, "", II);
         // We can replace the call to hpvm.tensor.softmax with the 1st argument
@@ -514,3 +516,4 @@ static RegisterPass<DFG2LLVM_ReplaceApproxHPVMIntrinsicsWithFCalls> X("replace-i
                                       true /* transformation,   *
                                             * not just analysis */);
 
+
diff --git a/hpvm/lib/Transforms/ReplaceIntrinsics/ReplaceIntrinsics.exports b/hpvm/lib/Transforms/ReplaceIntrinsics/ReplaceIntrinsics.exports
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..139597f9cb07c5d48bed18984ec4747f4b4f3438 100644
--- a/hpvm/lib/Transforms/ReplaceIntrinsics/ReplaceIntrinsics.exports
+++ b/hpvm/lib/Transforms/ReplaceIntrinsics/ReplaceIntrinsics.exports
@@ -0,0 +1,2 @@
+
+