diff --git a/llvm/tools/hpvm/test/parboil/benchmarks/pipeline/src/visc/main.cc b/llvm/tools/hpvm/test/parboil/benchmarks/pipeline/src/visc/main.cc
index cf89d2c8234bb9e790995278be58310ceb807440..f8a94d584b7bf5ada481fe95b37fe1fb9ccafaf3 100755
--- a/llvm/tools/hpvm/test/parboil/benchmarks/pipeline/src/visc/main.cc
+++ b/llvm/tools/hpvm/test/parboil/benchmarks/pipeline/src/visc/main.cc
@@ -11,7 +11,7 @@
  */
 
 #include "opencv2/opencv.hpp"
-#include "opencv2/core/ocl.hpp"
+#include "opencv2/ocl/ocl.hpp"
 #include <stdio.h>
 #include <math.h>
 #include <stdlib.h>
@@ -104,7 +104,7 @@ void laplacianEstimate(float *I, size_t bytesI,
                             float *L, size_t bytesL,
                             int m, int n) {
 
-  __visc__hint(visc::DEVICE);
+  __visc__hint(visc::CPU_TARGET);
   //__visc__hint(visc::GPU_TARGET);
   __visc__attributes(2, I, B, 1, L);
   // 3x3 image area
@@ -179,7 +179,7 @@ void laplacianEstimate(float *I, size_t bytesI,
   //OutStruct output = {bytesB, bytesL};
   //if(gx == m-1 && gy == n-1)
     //std::cout << "Exit laplacian\n";
-  __visc__return(m);
+  __visc__return(1, m);
 }
 
 void WrapperlaplacianEstimate(float *I, size_t bytesI,
@@ -188,7 +188,7 @@ void WrapperlaplacianEstimate(float *I, size_t bytesI,
                           int m, int n) {
   __visc__hint(visc::CPU_TARGET);
   __visc__attributes(2, I, B, 1, L);
-  void* LNode = __visc__createNode2D(laplacianEstimate, m, n);
+  void* LNode = __visc__createNodeND(2, laplacianEstimate, (size_t)m, (size_t)n);
   __visc__bindIn(LNode, 0, 0, 0); // Bind I
   __visc__bindIn(LNode, 1, 1, 0); // Bind bytesI
   __visc__bindIn(LNode, 2, 2, 0); // Bind B
@@ -214,7 +214,7 @@ void computeZeroCrossings(float *L, size_t bytesL,
                           float *B, size_t bytesB,
                           float *S, size_t bytesS,
                           int m, int n) {
-  __visc__hint(visc::DEVICE);
+  __visc__hint(visc::CPU_TARGET);
   //__visc__hint(visc::SPIR_TARGET);
   __visc__attributes(2, L, B, 1, S);
 
@@ -291,7 +291,7 @@ void computeZeroCrossings(float *L, size_t bytesL,
     //std::cout << "Exit ZC\n";
   // FIXME: Return bytesG instead of L. RZC nodes expects bytesG
   // This is just temporary
-  __visc__return(m); 
+  __visc__return(1, m); 
 }
 
 void WrapperComputeZeroCrossings(float *L, size_t bytesL,
@@ -300,7 +300,7 @@ void WrapperComputeZeroCrossings(float *L, size_t bytesL,
                           int m, int n) {
   __visc__hint(visc::CPU_TARGET);
   __visc__attributes(2, L, B, 1, S);
-  void* ZCNode = __visc__createNode2D(computeZeroCrossings, m, n);
+  void* ZCNode = __visc__createNodeND(2, computeZeroCrossings, (size_t)m, (size_t)n);
   __visc__bindIn(ZCNode, 0, 0, 0); // Bind L
   __visc__bindIn(ZCNode, 1, 1, 0); // Bind bytesL
   __visc__bindIn(ZCNode, 2, 2, 0); // Bind B
@@ -326,7 +326,7 @@ void rejectZeroCrossings(float *S, size_t bytesS,
                          float *E, size_t bytesE,
                          //float theta, float maxG,
                          int m, int n) {
-  __visc__hint(visc::DEVICE);
+  __visc__hint(visc::CPU_TARGET);
   __visc__attributes(2, S, G, 1, E);
 
   void* thisNode = __visc__getNode();
@@ -338,7 +338,7 @@ void rejectZeroCrossings(float *S, size_t bytesS,
     E[gy*n+gx] = ((S[gy*n+gx] > 0.0) && (G[gy*n+gx] > theta*maxG)) ? 1.0 : 0.0 ;
   }
   
-  __visc__return(m);
+  __visc__return(1, m);
        
 }
 
@@ -349,7 +349,7 @@ void WrapperRejectZeroCrossings(float *S, size_t bytesS,
                           int m, int n) {
   __visc__hint(visc::CPU_TARGET);
   __visc__attributes(2, S, G, 1, E);
-  void* RZCNode = __visc__createNode2D(rejectZeroCrossings, m, n);
+  void* RZCNode = __visc__createNodeND(2, rejectZeroCrossings, (size_t)m, (size_t)n);
   __visc__bindIn(RZCNode, 0, 0, 0); // Bind S
   __visc__bindIn(RZCNode, 1, 1, 0); // Bind bytesS
   __visc__bindIn(RZCNode, 2, 2, 0); // Bind G
@@ -375,9 +375,9 @@ void edgeDetection(float *I, size_t bytesI,
                           float *E, size_t bytesE,
                           int m, int n) {
   __visc__attributes(2, I, B, 4, L, S, G, E);
-  void* LNode = __visc__createNode(WrapperlaplacianEstimate);
-  void* CZCNode = __visc__createNode(WrapperComputeZeroCrossings);
-  void* RZCNode = __visc__createNode(WrapperRejectZeroCrossings);
+  void* LNode = __visc__createNodeND(0, WrapperlaplacianEstimate);
+  void* CZCNode = __visc__createNodeND(0, WrapperComputeZeroCrossings);
+  void* RZCNode = __visc__createNodeND(0, WrapperRejectZeroCrossings);
 
   // Laplacian Inputs
   __visc__bindIn(LNode, 0, 0, 1); // Bind I